codexapp 0.1.56 → 0.1.57

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.
@@ -1423,7 +1423,7 @@ ${o.value}`:y,dn(),Xt(()=>{var te;return(te=we.value)==null?void 0:te.focus()}))
1423
1423
 
1424
1424
  `)&&$t(ge,`${pe}
1425
1425
 
1426
- `)}j(d);const Kn=ut(d);Kn&&($(ge,Kn),kt(ge,{label:"Running command",details:[((se=Kn.commandExecution)==null?void 0:se.command)??""]}));const Hs=Rt(d);if(Hs){const pe=(i.value[ge]??[]).find(Be=>Be.id===Hs.itemId);pe!=null&&pe.commandExecution&&$(ge,{...pe,commandExecution:{...pe.commandExecution,aggregatedOutput:`${pe.commandExecution.aggregatedOutput}${Hs.delta}`}})}const Uo=k(d);if(Uo&&$(ge,Uo),Q(d)&&(Te&&n.value&&jt(n.value,{scrollTop:0,isAtBottom:!0,scrollRatio:1}),Yt(ge)),d.method==="turn/completed"){Te=!1,Yt(ge),i.value[ge]&&(i.value=Jt(i.value,ge));const pe=Ut(d);pe&&(Mt(pe,!1),kt(pe,null),un(pe),he||(We(pe),Oo(pe)))}}function Ft(d){const p=Ut(d);p&&fe.add(p);const g=d.method;(g.startsWith("thread/")||g.startsWith("turn/")||g.startsWith("item/"))&&(de=!0),!(Ze!==null||typeof window>"u")&&(Ze=window.setTimeout(()=>{Ze=null,lr()},Aa))}async function Tn(d){if(!Ie){Ie=!0;try{const p=await Qa(),g=[];for(const x of p.order){const Z=Ma(x);g.includes(Z)||g.push(Z)}if(g.length>0){const x=qo(g,d);rs(R.value,x)||(R.value=x,ms(R.value))}if(Object.keys(p.labels).length>0){const x={...P.value};let Z=!1;for(const[re,he]of Object.entries(p.labels)){const Ee=Ma(re);x[Ee]!==he&&(x[Ee]=he,Z=!0)}Z&&(P.value=x,Ra(x))}}catch{}}}async function ds(){if(!(Object.keys(K.value).length>0))try{const d=await mk();Object.keys(d.titles).length>0&&(K.value=d.titles)}catch{}}async function fs(d,p,g){if(K.value[d])return;const x=p.trim();if(!x)return;const Z=x.length>300?x.slice(0,300):x;try{const re=await gk(Z,g);if(!re||K.value[d])return;K.value={...K.value,[d]:re},mt(),ba(d,re)}catch{}}async function hn(){var d;wt.value||(Ue.value=!0);try{const[p]=await Promise.all([H_(),ds()]);await Tn(p);const g=qo(R.value,p);rs(R.value,g)||(R.value=g,ms(R.value));const x=Pa(p,R.value),Z=i1(t.value,x,a.value);t.value=Jo(t.value,Z),a.value=rn(a.value,new Set(hr(t.value).map(Ee=>Ee.id))),mt(),wt.value=!0;const re=hr(e.value);nt(re),re.some(Ee=>Ee.id===n.value)||z(((d=re[0])==null?void 0:d.id)??"")}finally{Ue.value=!1}}async function Nn(d,p={}){if(!d)return;const g=F.value[d]===!0,x=p.silent!==!0&&!g;x&&(Ce.value=!0);try{ne.value[d]!==!0&&(await ya(d),ne.value={...ne.value,[d]:!0});const{messages:Z,inProgress:re}=await W_(d),he=r.value[d]??[],Ee=JA(he,Z,{preserveMissing:p.silent===!0});At(d,Ee);const ge=s.value[d]??[],ot=YA(ge,Z);Gt(d,ot),D(d,Z),F.value={...F.value,[d]:!0};const it=en(d);it&&(B.value={...B.value,[d]:it}),Mt(d,re),bn(d)}finally{x&&(Ce.value=!1)}}async function Vr(){try{const d=t.value.flatMap(p=>p.threads.map(g=>g.cwd)).filter(Boolean);ke.value=await vk(d.length>0?[...new Set(d)]:void 0)}catch{}}async function js(){Oe.value="";try{await hn(),await Promise.all([Ct(),Lt(),Vr()]),await Nn(n.value)}catch(d){Oe.value=d instanceof Error?d.message:"Unknown application error"}}async function Wi(d){z(d);try{await Nn(d)}catch(p){Oe.value=p instanceof Error?p.message:"Unknown application error"}}async function Vi(d){try{await q_(d),await hn(),n.value===d&&await Nn(n.value)}catch(p){Oe.value=p instanceof Error?p.message:"Unknown application error"}}async function zi(d,p){const g=p.trim();if(!(!d||!g))try{await K_(d,g),K.value={...K.value,[d]:g},mt(),ba(d,g)}catch(x){Oe.value=x instanceof Error?x.message:"Unknown application error"}}async function Gi(d){var he,Ee;const p=d.trim();if(!p)return"";const g=hr(t.value).find(ge=>ge.id===p),x=((he=g==null?void 0:g.cwd)==null?void 0:he.trim())??"",Z=((Ee=g==null?void 0:g.title)==null?void 0:Ee.trim())??"Forked chat",re=m.value.trim();Oe.value="";try{const ge=await J_(p,x||void 0,re||void 0);return ge?(Vt(ge,x,Z),ne.value={...ne.value,[ge]:!0},z(ge),await hn(),await Nn(ge),ge):""}catch(ge){return Oe.value=ge instanceof Error?ge.message:"Unknown application error",""}}async function $o(d,p=[],g=[],x="steer",Z=[],re){if(ze.value)return;const he=n.value,Ee=d.trim();if(!he||!Ee&&p.length===0&&Z.length===0)return;const ge=a.value[he]===!0;if(ge&&x==="queue"){const ot=l.value[he]??[],it=`q-${Date.now()}-${Math.random().toString(36).slice(2,8)}`,nn=[...ot],An=typeof re=="number"?Math.max(0,Math.min(re,nn.length)):nn.length;nn.splice(An,0,{id:it,text:Ee,imageUrls:p,skills:g,fileAttachments:Z}),l.value={...l.value,[he]:nn};return}if(ge){Te=!0,zr(he,Ee,p,g,Z).catch(ot=>{const it=ot instanceof Error?ot.message:"Unknown application error";It(he,it),Oe.value=it});return}Oe.value="",Te=!0,zt(he,null),kt(he,{label:"Thinking",details:ft(m.value,S.value)}),It(he,null),Mt(he,!0);try{await zr(he,Ee,p,g,Z)}catch(ot){Te=!1,Mt(he,!1),kt(he,null);const it=ot instanceof Error?ot.message:"Unknown application error";throw It(he,it),Oe.value=it,ot}}async function hs(d,p,g=[],x=[],Z=[]){if(ze.value)return"";const re=d.trim(),he=p.trim(),Ee=m.value.trim();if(!re&&g.length===0&&Z.length===0)return"";$e.value=!0,Oe.value="";let ge="";try{try{ge=await pu(he||void 0,Ee||void 0)}catch(An){if(Ee&&Ee!==Ln&&Ko(An))await ye(),ge=await pu(he||void 0,Ln);else throw An}if(!ge)return"";Vt(ge,he,re||"[Image]"),ne.value={...ne.value,[ge]:!0},z(ge),Te=!0,zt(ge,null),kt(ge,{label:"Thinking",details:ft(m.value,S.value)}),It(ge,null),Mt(ge,!0);const ot=ge,it=he||null,nn=re;return zr(ge,re,g,x,Z).catch(An=>{Te=!1,Mt(ge,!1),kt(ge,null);const Kn=An instanceof Error?An.message:"Unknown application error";It(ge,Kn),Oe.value=Kn}).finally(()=>{$e.value=!1}),fs(ot,nn,it),ge}catch(ot){Te=!1,ge&&(Mt(ge,!1),kt(ge,null));const it=ot instanceof Error?ot.message:"Unknown application error";throw ge&&It(ge,it),Oe.value=it,$e.value=!1,ot}}async function zr(d,p,g=[],x=[],Z=[]){const re=m.value.trim(),he=S.value,Ee=p.trim(),ge=x.map(it=>({name:it.name,path:it.path})),ot=Z.map(it=>({...it}));Re(d,{text:Ee,imageUrls:[...g],skills:ge,fileAttachments:ot,effort:he,fallbackRetried:!1});try{ne.value[d]!==!0&&await ya(d);try{await wa(d,p,g,re||void 0,he||void 0,x.length>0?x:void 0,Z)}catch(it){if(re&&re!==Ln&&Ko(it))await ye(),Re(d,{text:Ee,imageUrls:[...g],skills:ge,fileAttachments:ot,effort:he,fallbackRetried:!0}),await wa(d,p,g,Ln,he||void 0,x.length>0?x:void 0,Z);else throw it}ne.value={...ne.value,[d]:!0},fe.add(d),de=!0,await lr()}catch(it){throw it}}async function Oo(d){if(u.value[d]===!0)return;const p=l.value[d];if(!p||p.length===0)return;u.value={...u.value,[d]:!0};const[g,...x]=p;l.value=x.length>0?{...l.value,[d]:x}:Jt(l.value,d),$e.value=!0,Oe.value="",Te=!0,zt(d,null),kt(d,{label:"Thinking",details:ft(m.value,S.value)}),It(d,null),Mt(d,!0);try{await zr(d,g.text,g.imageUrls,g.skills,g.fileAttachments)}catch{Mt(d,!1),kt(d,null)}finally{u.value=Jt(u.value,d),$e.value=!1}}async function Us(){const d=n.value;if(!d||a.value[d]!==!0)return;const p=ue.value[d];De.value=!0,Oe.value="";try{await X_(d,p),Mt(d,!1),kt(d,null),It(d,null),ue.value[d]&&(ue.value=Jt(ue.value,d)),fe.add(d),de=!0,await lr()}catch(g){const x=g instanceof Error?g.message:"Failed to interrupt active turn";It(d,x),Oe.value=x}finally{De.value=!1}}async function Fs(d){const p=n.value;if(!p||tt.value)return;const x=(r.value[p]??[]).reduce((re,he)=>typeof he.turnIndex=="number"&&he.turnIndex>re?he.turnIndex:re,-1);if(x<0||d>x)return;const Z=x-d+1;if(!(Z<1)){tt.value=!0,Oe.value="";try{await Me(p,d);const re=await hu(p,Z);At(p,re),Gt(p,[]),Yt(p),i.value[p]&&(i.value=Jt(i.value,p)),zt(p,null),kt(p,null),It(p,null),de=!0,await lr()}catch(re){Oe.value=re instanceof Error?re.message:"Failed to rollback thread"}finally{tt.value=!1}}}function qi(d,p){d.length===0||(P.value[d]??"")===p||(P.value={...P.value,[d]:p},Ra(P.value))}function No(d){var Z;if(d.length===0)return;const p=R.value.filter(re=>re!==d);if(rs(R.value,p)||(R.value=p,ms(R.value)),t.value=t.value.filter(re=>re.projectName!==d),P.value[d]!==void 0){const re={...P.value};delete re[d],P.value=re,Ra(re)}mt();const g=hr(e.value);nt(g),g.some(re=>re.id===n.value)||z(((Z=g[0])==null?void 0:Z.id)??""),Bs()}function Do(d,p){if(d.length===0||t.value.length===0)return;const g=t.value.map(ge=>ge.projectName),x=g.indexOf(d);if(x===-1)return;const Z=Math.max(0,Math.min(p,g.length-1)),re=qA(g,x,Z);if(re===g)return;const he=qo(re,t.value);R.value=he,ms(R.value);const Ee=Pa(t.value,R.value);t.value=Jo(t.value,Ee),mt(),Bs()}function Lo(d){const p=d.trim();if(!p)return;const g=[p,...R.value.filter(Z=>Z!==p)];if(rs(R.value,g))return;R.value=g,ms(R.value);const x=Pa(t.value,R.value);t.value=Jo(t.value,x),mt(),Bs()}async function Bs(){var d,p;try{const g=await Qa(),x=new Map;for(const he of g.order){const Ee=Ma(he);x.has(Ee)||x.set(Ee,he)}for(const he of t.value){const Ee=((p=(d=he.threads[0])==null?void 0:d.cwd)==null?void 0:p.trim())??"";Ee&&x.set(he.projectName,Ee)}const Z=[];for(const he of R.value){const Ee=x.get(he);Ee&&!Z.includes(Ee)&&Z.push(Ee)}for(const he of g.order)Z.includes(he)||Z.push(he);const re=g.active.filter(he=>Z.includes(he));re.length===0&&Z.length>0&&re.push(Z[0]),await ak({order:Z,labels:g.labels,active:re})}catch{}}async function lr(){if(Qe.value){typeof window<"u"&&Ze===null&&(Ze=window.setTimeout(()=>{Ze=null,lr()},Aa));return}Qe.value=!0;const d=de,p=new Set(fe);de=!1,fe.clear();try{d&&await hn();const g=n.value;if(!g)return;const x=p.has(g),Z=a.value[g]===!0,re=en(g),he=B.value[g]??"",Ee=re.length>0&&re!==he;(x||Z||Ee||d)&&await Nn(g,{silent:!0})}catch{}finally{Qe.value=!1,(de||fe.size>0)&&typeof window<"u"&&Ze===null&&(Ze=window.setTimeout(()=>{Ze=null,lr()},Aa))}}function Ki(){typeof window>"u"||ct||(Ji(),ct=V_(d=>{je(d),Ft(d)}))}async function Ji(){try{const d=await G_();for(const p of d){const g=Un(p);g&&Mn(g)}}catch{}}async function Yi(d){try{await z_(d.id,{result:d.result,error:d.error}),$n(d.id)}catch(p){Oe.value=p instanceof Error?p.message:"Failed to reply to server request"}}function Xi(){ct&&(ct(),ct=null),de=!1,fe.clear(),b.clear(),Ze!==null&&typeof window<"u"&&(window.clearTimeout(Ze),Ze=null),Je!==null&&typeof window<"u"&&(window.clearTimeout(Je),Je=null),Te=!1,r.value={},s.value={},o.value={},i.value={},we.value={},oe.value={},Se.value={},ue.value={},l.value={},u.value={}}const Gr=ie(()=>{const d=n.value;return d?l.value[d]??[]:[]});function jo(d){const p=n.value;if(!p)return;const g=l.value[p];if(!g)return;const x=g.filter(Z=>Z.id!==d);l.value=x.length>0?{...l.value,[p]:x}:Jt(l.value,p)}function Qi(d){const p=n.value;if(!p)return;const g=l.value[p];if(!g)return;const x=g.find(Z=>Z.id===d);x&&(jo(d),$o(x.text,x.imageUrls,x.skills,"steer",x.fileAttachments))}return{projectGroups:e,projectDisplayNameById:P,selectedThread:ee,selectedThreadScrollState:H,selectedThreadServerRequests:G,selectedLiveOverlay:W,selectedThreadId:n,availableModelIds:f,selectedModelId:m,selectedReasoningEffort:S,selectedSpeedMode:L,installedSkills:ke,accountRateLimitSnapshots:Ne,messages:q,isLoadingThreads:Ue,isLoadingMessages:Ce,isSendingMessage:$e,isInterruptingTurn:De,isUpdatingSpeedMode:ze,error:Oe,refreshAll:js,refreshSkills:Vr,selectThread:Wi,setThreadScrollState:jt,archiveThreadById:Vi,renameThreadById:zi,forkThreadById:Gi,sendMessageToSelectedThread:$o,sendMessageToNewThread:hs,interruptSelectedThreadTurn:Us,rollbackSelectedThread:Fs,isRollingBack:tt,selectedThreadQueuedMessages:Gr,removeQueuedMessage:jo,steerQueuedMessage:Qi,setSelectedModelId:me,setWorktreeGitAutomationEnabled:ve,setSelectedReasoningEffort:et,updateSelectedSpeedMode:xt,respondToPendingServerRequest:Yi,renameProject:qi,removeProject:No,reorderProject:Do,pinProjectToTop:Lo,startPolling:Ki,stopPolling:Xi}}const c1={class:"sidebar-root"},u1={class:"sidebar-scrollable"},d1=["aria-pressed"],f1={key:1,class:"sidebar-search-bar"},h1={key:0,class:"sidebar-settings-area"},p1={key:0,class:"sidebar-settings-panel"},m1=["title"],g1=["title"],v1={class:"sidebar-settings-value"},y1=["title"],w1={class:"sidebar-settings-value"},b1=["title"],_1=["title"],k1=["title"],T1=["title"],S1=["title"],I1={class:"sidebar-settings-value"},E1={class:"sidebar-settings-rate-limits"},C1={class:"sidebar-settings-build-label","aria-label":"Worktree name and version"},A1={class:"content-root"},x1={class:"content-body"},R1={key:1,class:"content-grid"},P1={class:"new-thread-empty"},M1={class:"worktree-init-status-title"},$1={class:"worktree-init-status-message"},O1={key:1,class:"new-thread-trending"},N1={class:"new-thread-trending-header"},D1={key:0,class:"new-thread-trending-empty"},L1={key:1,class:"new-thread-trending-empty"},j1={key:2,class:"new-thread-trending-list"},U1=["onClick"],F1=["title"],B1={class:"new-thread-trending-tip-name-owner"},H1={class:"new-thread-trending-tip-name-repo"},W1={key:1,class:"new-thread-trending-tip-name-repo"},V1={class:"new-thread-trending-tip-meta"},z1={class:"new-thread-trending-tip-description"},G1={key:2,class:"content-grid"},q1={class:"content-thread"},K1={class:"composer-with-queue"},Zu="codex-web-local.sidebar-collapsed.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",sd="codex-web-local.dictation-auto-send.v1",od="codex-web-local.dictation-language.v1",id="codex-web-local.worktree-git-automation.v1",ad="codex-web-local.github-trending-projects.v1",J1=Wt({__name:"App",setup(e){const t="2a6c",n="0.1.56",r={sendWithEnter:"When enabled, press Enter to send. When disabled, use Command+Enter to send.",inProgressSendMode:"If a turn is still running, choose whether a new prompt should steer the current turn or be queued.",appearance:"Switch between system theme, light mode, and dark mode.",dictationClickToToggle:"Use click-to-start and click-to-stop dictation instead of hold-to-talk.",dictationAutoSend:"Automatically send transcribed dictation when recording stops.",rollbackCommits:"When enabled, each message creates a rollback Git commit. On rollback, it resets to the commit before that message.",githubTrendingProjects:"Show or hide GitHub trending project cards on the new thread screen.",dictationLanguage:"Choose transcription language or keep auto-detect."},s={en:"english",zh:"chinese",de:"german",es:"spanish",ru:"russian",ko:"korean",fr:"french",ja:"japanese",pt:"portuguese",tr:"turkish",pl:"polish",ca:"catalan",nl:"dutch",ar:"arabic",sv:"swedish",it:"italian",id:"indonesian",hi:"hindi",fi:"finnish",vi:"vietnamese",he:"hebrew",uk:"ukrainian",el:"greek",ms:"malay",cs:"czech",ro:"romanian",da:"danish",hu:"hungarian",ta:"tamil",no:"norwegian",th:"thai",ur:"urdu",hr:"croatian",bg:"bulgarian",lt:"lithuanian",la:"latin",mi:"maori",ml:"malayalam",cy:"welsh",sk:"slovak",te:"telugu",fa:"persian",lv:"latvian",bn:"bengali",sr:"serbian",az:"azerbaijani",sl:"slovenian",kn:"kannada",et:"estonian",mk:"macedonian",br:"breton",eu:"basque",is:"icelandic",hy:"armenian",ne:"nepali",mn:"mongolian",bs:"bosnian",kk:"kazakh",sq:"albanian",sw:"swahili",gl:"galician",mr:"marathi",pa:"punjabi",si:"sinhala",km:"khmer",sn:"shona",yo:"yoruba",so:"somali",af:"afrikaans",oc:"occitan",ka:"georgian",be:"belarusian",tg:"tajik",sd:"sindhi",gu:"gujarati",am:"amharic",yi:"yiddish",lo:"lao",uz:"uzbek",fo:"faroese",ht:"haitian creole",ps:"pashto",tk:"turkmen",nn:"nynorsk",mt:"maltese",sa:"sanskrit",lb:"luxembourgish",my:"myanmar",bo:"tibetan",tl:"tagalog",mg:"malagasy",as:"assamese",tt:"tatar",haw:"hawaiian",ln:"lingala",ha:"hausa",ba:"bashkir",jw:"javanese",su:"sundanese",yue:"cantonese"},{projectGroups:o,projectDisplayNameById:i,selectedThread:a,selectedThreadScrollState:l,selectedThreadServerRequests:u,selectedLiveOverlay:c,selectedThreadId:f,availableModelIds:m,selectedModelId:S,selectedReasoningEffort:L,selectedSpeedMode:O,installedSkills:V,accountRateLimitSnapshots:R,messages:P,isLoadingThreads:B,isLoadingMessages:F,isInterruptingTurn:ne,isUpdatingSpeedMode:oe,refreshAll:we,refreshSkills:Se,selectThread:ue,setThreadScrollState:ce,archiveThreadById:be,forkThreadById:K,renameThreadById:ke,sendMessageToSelectedThread:Ne,sendMessageToNewThread:Ue,interruptSelectedThreadTurn:Ce,rollbackSelectedThread:$e,isRollingBack:De,selectedThreadQueuedMessages:ze,removeQueuedMessage:tt,steerQueuedMessage:Oe,setSelectedModelId:Qe,setWorktreeGitAutomationEnabled:wt,setSelectedReasoningEffort:ct,updateSelectedSpeedMode:Ze,respondToPendingServerRequest:Je,renameProject:X,removeProject:de,reorderProject:fe,pinProjectToTop:Ie,startPolling:Te,stopPolling:b}=l1(),T=_v(),M=bv(),{isMobile:Y}=Lf(),ee=N(null),H=N(null),G=N([]),W=N(!1),q=N("trending-daily"),z=N(null),me=N(!1),ve=N(!1),ye=N(""),Re=N("local"),We=N({order:[],labels:{}}),Fe=N({phase:"idle",title:"",message:""}),Me=N(An()),Ye=N(""),et=N(!1),xt=N(null),ft=N(null);let Ct=null;const Lt=N("New Project (1)"),pt=N(""),Pt=N(!1),mt=N(Gr(ed,!0)),Vt=N(Qi()),nt=N(jo()),bn=N(Gr(rd,!1)),zt=N(null);let Mt=0;const un=N(Gr(sd,!0)),kt=N(ge()),It=ie(()=>ot()),en=N(Gr(id,!0)),jt=N(Gr(ad,!0)),At=N({configured:!1,active:!1,mappedChats:0,mappedThreads:0,lastError:""}),Gt=ie(()=>{const _=T.params.threadId;return typeof _=="string"?_:""}),In=ie(()=>{const _=new Set;for(const U of o.value)for(const se of U.threads)_.add(se.id);return _}),$t=ie(()=>T.name==="home"),En=ie(()=>T.name==="skills"),Yt=ie(()=>{var _;return En.value?"Skills":$t.value?"New thread":((_=a.value)==null?void 0:_.title)??"Choose a thread"}),He=typeof window<"u"&&(window.location.hostname||window.location.host)||"codexui",Le=ie(()=>{var U,se;return(((se=(U=a.value)==null?void 0:U.title)==null?void 0:se.trim())??"")||He}),qt=ie(()=>P.value.filter(_=>{const U=Hs(_.messageType,_.role);return U==="worked"?!0:!(U==="turnActivity.live"||U==="turnError.live"||U==="agentReasoning.live")})),dn=ie(()=>{let _=-1;for(const U of P.value)U.role==="user"&&typeof U.turnIndex=="number"&&U.turnIndex>_&&(_=U.turnIndex);return _}),Pn=ie(()=>c.value),_n=ie(()=>$t.value?"__new-thread__":f.value),Kt=ie(()=>{var _,U;return $t.value?ye.value.trim():((U=(_=a.value)==null?void 0:_.cwd)==null?void 0:U.trim())??""}),Ut=ie(()=>{var _;return!$t.value&&((_=a.value)==null?void 0:_.inProgress)===!0}),tn=ie(()=>{var pe,Be;const _=[],U=new Set;for(const xe of We.value.order){const Nt=xe.trim();!Nt||U.has(Nt)||(U.add(Nt),_.push({value:Nt,label:We.value.labels[Nt]||ws(Nt)}))}for(const xe of o.value){const Nt=((Be=(pe=xe.threads[0])==null?void 0:pe.cwd)==null?void 0:Be.trim())??"";!Nt||U.has(Nt)||(U.add(Nt),_.push({value:Nt,label:i.value[xe.projectName]??xe.projectName}))}const se=ye.value.trim();return se&&!U.has(se)&&_.unshift({value:se,label:ws(se)}),_}),fn=typeof window<"u"?window.matchMedia("(prefers-color-scheme: dark)"):null,Un=ie(()=>[{value:"search-daily",label:"Search daily"},{value:"search-weekly",label:"Search weekly"},{value:"search-monthly",label:"Search monthly"},{value:"trending-daily",label:"Trending daily"},{value:"trending-weekly",label:"Trending weekly"},{value:"trending-monthly",label:"Trending monthly"}]),Mn=ie(()=>{if(!At.value.configured)return"Not configured";const _=At.value.active?"Online":"Configured (offline)",U=`${At.value.mappedChats} chat(s), ${At.value.mappedThreads} thread(s)`,se=At.value.lastError?`, error: ${At.value.lastError}`:"";return`${_}, ${U}${se}`});ar(()=>{window.addEventListener("keydown",Ft),nn(),fn==null||fn.addEventListener("change",nn),Uo(),zi(),Oo(),Us(),hs(),kn(),jt.value&&Fs()}),So(()=>{window.removeEventListener("keydown",Ft),fn==null||fn.removeEventListener("change",nn),Ct&&(clearTimeout(Ct),Ct=null),b()}),at(Ye,_=>{const U=_.trim();if(Ct&&(clearTimeout(Ct),Ct=null),!U){ft.value=null;return}Ct=setTimeout(()=>{uk(U,1e3).then(se=>{Ye.value.trim()===U&&(ft.value=se.threadIds)}).catch(()=>{Ye.value.trim()===U&&(ft.value=null)})},220)});function $n(){Se()}async function kn(){try{At.value=await fk()}catch(_){const U=_ instanceof Error?_.message:"Failed to load Telegram status";At.value={configured:!1,active:!1,mappedChats:0,mappedThreads:0,lastError:U}}}function Cn(){et.value=!et.value,et.value?Xt(()=>{var _;return(_=xt.value)==null?void 0:_.focus()}):Ye.value=""}function On(){var _;Ye.value="",(_=xt.value)==null||_.focus()}function w(_){_.key==="Escape"&&(et.value=!1,Ye.value="")}function I(_){_&&(T.name==="thread"&&Gt.value===_||(M.push({name:"thread",params:{threadId:_}}),Y.value&&je(!0)))}async function A(_){_&&(f.value!==_&&(await ue(_),await M.push({name:"thread",params:{threadId:_}})),await Xt(),Ki())}function J(_){be(_)}async function y(_){const U=await K(_);U&&($t.value?await M.replace({name:"thread",params:{threadId:U}}):await M.push({name:"thread",params:{threadId:U}}),Y.value&&je(!0))}function C(_){const U=_.trim().replace(/\\/gu,"/");return U?U.includes("/.codex/worktrees/")||U.includes("/.git/worktrees/"):!1}function j(_,U=""){var xe,Nt,qr;const se=o.value.find(Kr=>Kr.projectName===_);if(!se)return U.trim();const pe=se.threads.find(Kr=>!C(Kr.cwd));return(((xe=pe==null?void 0:pe.cwd)==null?void 0:xe.trim())??((qr=(Nt=se.threads[0])==null?void 0:Nt.cwd)==null?void 0:qr.trim())??"")||U.trim()}function te(_){var pe,Be;const U=o.value.find(xe=>xe.projectName===_),se=j(_,((Be=(pe=U==null?void 0:U.threads[0])==null?void 0:pe.cwd)==null?void 0:Be.trim())??"");se&&(ye.value=se),Y.value&&je(!0),!$t.value&&M.push({name:"home"})}function Ae(_){var se;let U="";for(const pe of o.value){const Be=pe.threads.find(xe=>xe.id===_);if((se=Be==null?void 0:Be.cwd)!=null&&se.trim()){U=Be.cwd.trim();break}}!U||typeof window>"u"||window.open(`/codex-local-browse${encodeURI(U)}`,"_blank","noopener,noreferrer")}function Xe(){var se;const _=a.value,U=_?j(_.projectName,((se=_.cwd)==null?void 0:se.trim())??""):"";U&&(ye.value=U),Y.value&&je(!0),!$t.value&&M.push({name:"home"})}function ut(_){X(_.projectName,_.displayName)}function Rt(_){ke(_.threadId,_.title)}function k(_){de(_)}function $(_){fe(_.projectName,_.toIndex)}function D(_){ce(_.threadId,_.state)}function Q(_){Je(_)}function je(_){Me.value!==_&&(Me.value=_,Kn(_))}function Ft(_){_.defaultPrevented||!_.ctrlKey&&!_.metaKey||_.shiftKey||_.altKey||_.key.toLowerCase()==="b"&&(_.preventDefault(),je(!Me.value))}function Tn(_){const U=_.text,se=z.value,pe=_.mode==="queue"&&se&&se.threadId===f.value?se.queueIndex:void 0;if(z.value=null,$t.value){Fo(U,_.imageUrls,_.skills,_.fileAttachments);return}if(_.rollbackLatestUserTurn===!0){js(_);return}Ne(U,_.imageUrls,_.skills,_.mode,_.fileAttachments,pe)}function ds(_){const U=new Intl.NumberFormat().format(_.stars);return _.language?`${_.language} · ★ ${U}`:`★ ${U}`}function fs(_){const se=new Set(["search-daily","search-weekly","search-monthly","trending-daily","trending-weekly","trending-monthly"]).has(_)?_:"trending-daily";q.value!==se&&(q.value=se)}function hn(){if(typeof window>"u")return;const _=window.prompt("Telegram bot token");!_||!_.trim()||dk(_.trim()).then(()=>{window.alert("Telegram bot configured. Open the bot DM and send /start."),kn()}).catch(U=>{const se=U instanceof Error?U.message:"Failed to connect Telegram bot";window.alert(se),kn()})}function Nn(_){const U=ee.value;U&&U.hydrateDraft({text:`Clone this GitHub project and run it: ${_.url}
1426
+ `)}j(d);const Kn=ut(d);Kn&&($(ge,Kn),kt(ge,{label:"Running command",details:[((se=Kn.commandExecution)==null?void 0:se.command)??""]}));const Hs=Rt(d);if(Hs){const pe=(i.value[ge]??[]).find(Be=>Be.id===Hs.itemId);pe!=null&&pe.commandExecution&&$(ge,{...pe,commandExecution:{...pe.commandExecution,aggregatedOutput:`${pe.commandExecution.aggregatedOutput}${Hs.delta}`}})}const Uo=k(d);if(Uo&&$(ge,Uo),Q(d)&&(Te&&n.value&&jt(n.value,{scrollTop:0,isAtBottom:!0,scrollRatio:1}),Yt(ge)),d.method==="turn/completed"){Te=!1,Yt(ge),i.value[ge]&&(i.value=Jt(i.value,ge));const pe=Ut(d);pe&&(Mt(pe,!1),kt(pe,null),un(pe),he||(We(pe),Oo(pe)))}}function Ft(d){const p=Ut(d);p&&fe.add(p);const g=d.method;(g.startsWith("thread/")||g.startsWith("turn/")||g.startsWith("item/"))&&(de=!0),!(Ze!==null||typeof window>"u")&&(Ze=window.setTimeout(()=>{Ze=null,lr()},Aa))}async function Tn(d){if(!Ie){Ie=!0;try{const p=await Qa(),g=[];for(const x of p.order){const Z=Ma(x);g.includes(Z)||g.push(Z)}if(g.length>0){const x=qo(g,d);rs(R.value,x)||(R.value=x,ms(R.value))}if(Object.keys(p.labels).length>0){const x={...P.value};let Z=!1;for(const[re,he]of Object.entries(p.labels)){const Ee=Ma(re);x[Ee]!==he&&(x[Ee]=he,Z=!0)}Z&&(P.value=x,Ra(x))}}catch{}}}async function ds(){if(!(Object.keys(K.value).length>0))try{const d=await mk();Object.keys(d.titles).length>0&&(K.value=d.titles)}catch{}}async function fs(d,p,g){if(K.value[d])return;const x=p.trim();if(!x)return;const Z=x.length>300?x.slice(0,300):x;try{const re=await gk(Z,g);if(!re||K.value[d])return;K.value={...K.value,[d]:re},mt(),ba(d,re)}catch{}}async function hn(){var d;wt.value||(Ue.value=!0);try{const[p]=await Promise.all([H_(),ds()]);await Tn(p);const g=qo(R.value,p);rs(R.value,g)||(R.value=g,ms(R.value));const x=Pa(p,R.value),Z=i1(t.value,x,a.value);t.value=Jo(t.value,Z),a.value=rn(a.value,new Set(hr(t.value).map(Ee=>Ee.id))),mt(),wt.value=!0;const re=hr(e.value);nt(re),re.some(Ee=>Ee.id===n.value)||z(((d=re[0])==null?void 0:d.id)??"")}finally{Ue.value=!1}}async function Nn(d,p={}){if(!d)return;const g=F.value[d]===!0,x=p.silent!==!0&&!g;x&&(Ce.value=!0);try{ne.value[d]!==!0&&(await ya(d),ne.value={...ne.value,[d]:!0});const{messages:Z,inProgress:re}=await W_(d),he=r.value[d]??[],Ee=JA(he,Z,{preserveMissing:p.silent===!0});At(d,Ee);const ge=s.value[d]??[],ot=YA(ge,Z);Gt(d,ot),D(d,Z),F.value={...F.value,[d]:!0};const it=en(d);it&&(B.value={...B.value,[d]:it}),Mt(d,re),bn(d)}finally{x&&(Ce.value=!1)}}async function Vr(){try{const d=t.value.flatMap(p=>p.threads.map(g=>g.cwd)).filter(Boolean);ke.value=await vk(d.length>0?[...new Set(d)]:void 0)}catch{}}async function js(){Oe.value="";try{await hn(),await Promise.all([Ct(),Lt(),Vr()]),await Nn(n.value)}catch(d){Oe.value=d instanceof Error?d.message:"Unknown application error"}}async function Wi(d){z(d);try{await Nn(d)}catch(p){Oe.value=p instanceof Error?p.message:"Unknown application error"}}async function Vi(d){try{await q_(d),await hn(),n.value===d&&await Nn(n.value)}catch(p){Oe.value=p instanceof Error?p.message:"Unknown application error"}}async function zi(d,p){const g=p.trim();if(!(!d||!g))try{await K_(d,g),K.value={...K.value,[d]:g},mt(),ba(d,g)}catch(x){Oe.value=x instanceof Error?x.message:"Unknown application error"}}async function Gi(d){var he,Ee;const p=d.trim();if(!p)return"";const g=hr(t.value).find(ge=>ge.id===p),x=((he=g==null?void 0:g.cwd)==null?void 0:he.trim())??"",Z=((Ee=g==null?void 0:g.title)==null?void 0:Ee.trim())??"Forked chat",re=m.value.trim();Oe.value="";try{const ge=await J_(p,x||void 0,re||void 0);return ge?(Vt(ge,x,Z),ne.value={...ne.value,[ge]:!0},z(ge),await hn(),await Nn(ge),ge):""}catch(ge){return Oe.value=ge instanceof Error?ge.message:"Unknown application error",""}}async function $o(d,p=[],g=[],x="steer",Z=[],re){if(ze.value)return;const he=n.value,Ee=d.trim();if(!he||!Ee&&p.length===0&&Z.length===0)return;const ge=a.value[he]===!0;if(ge&&x==="queue"){const ot=l.value[he]??[],it=`q-${Date.now()}-${Math.random().toString(36).slice(2,8)}`,nn=[...ot],An=typeof re=="number"?Math.max(0,Math.min(re,nn.length)):nn.length;nn.splice(An,0,{id:it,text:Ee,imageUrls:p,skills:g,fileAttachments:Z}),l.value={...l.value,[he]:nn};return}if(ge){Te=!0,zr(he,Ee,p,g,Z).catch(ot=>{const it=ot instanceof Error?ot.message:"Unknown application error";It(he,it),Oe.value=it});return}Oe.value="",Te=!0,zt(he,null),kt(he,{label:"Thinking",details:ft(m.value,S.value)}),It(he,null),Mt(he,!0);try{await zr(he,Ee,p,g,Z)}catch(ot){Te=!1,Mt(he,!1),kt(he,null);const it=ot instanceof Error?ot.message:"Unknown application error";throw It(he,it),Oe.value=it,ot}}async function hs(d,p,g=[],x=[],Z=[]){if(ze.value)return"";const re=d.trim(),he=p.trim(),Ee=m.value.trim();if(!re&&g.length===0&&Z.length===0)return"";$e.value=!0,Oe.value="";let ge="";try{try{ge=await pu(he||void 0,Ee||void 0)}catch(An){if(Ee&&Ee!==Ln&&Ko(An))await ye(),ge=await pu(he||void 0,Ln);else throw An}if(!ge)return"";Vt(ge,he,re||"[Image]"),ne.value={...ne.value,[ge]:!0},z(ge),Te=!0,zt(ge,null),kt(ge,{label:"Thinking",details:ft(m.value,S.value)}),It(ge,null),Mt(ge,!0);const ot=ge,it=he||null,nn=re;return zr(ge,re,g,x,Z).catch(An=>{Te=!1,Mt(ge,!1),kt(ge,null);const Kn=An instanceof Error?An.message:"Unknown application error";It(ge,Kn),Oe.value=Kn}).finally(()=>{$e.value=!1}),fs(ot,nn,it),ge}catch(ot){Te=!1,ge&&(Mt(ge,!1),kt(ge,null));const it=ot instanceof Error?ot.message:"Unknown application error";throw ge&&It(ge,it),Oe.value=it,$e.value=!1,ot}}async function zr(d,p,g=[],x=[],Z=[]){const re=m.value.trim(),he=S.value,Ee=p.trim(),ge=x.map(it=>({name:it.name,path:it.path})),ot=Z.map(it=>({...it}));Re(d,{text:Ee,imageUrls:[...g],skills:ge,fileAttachments:ot,effort:he,fallbackRetried:!1});try{ne.value[d]!==!0&&await ya(d);try{await wa(d,p,g,re||void 0,he||void 0,x.length>0?x:void 0,Z)}catch(it){if(re&&re!==Ln&&Ko(it))await ye(),Re(d,{text:Ee,imageUrls:[...g],skills:ge,fileAttachments:ot,effort:he,fallbackRetried:!0}),await wa(d,p,g,Ln,he||void 0,x.length>0?x:void 0,Z);else throw it}ne.value={...ne.value,[d]:!0},fe.add(d),de=!0,await lr()}catch(it){throw it}}async function Oo(d){if(u.value[d]===!0)return;const p=l.value[d];if(!p||p.length===0)return;u.value={...u.value,[d]:!0};const[g,...x]=p;l.value=x.length>0?{...l.value,[d]:x}:Jt(l.value,d),$e.value=!0,Oe.value="",Te=!0,zt(d,null),kt(d,{label:"Thinking",details:ft(m.value,S.value)}),It(d,null),Mt(d,!0);try{await zr(d,g.text,g.imageUrls,g.skills,g.fileAttachments)}catch{Mt(d,!1),kt(d,null)}finally{u.value=Jt(u.value,d),$e.value=!1}}async function Us(){const d=n.value;if(!d||a.value[d]!==!0)return;const p=ue.value[d];De.value=!0,Oe.value="";try{await X_(d,p),Mt(d,!1),kt(d,null),It(d,null),ue.value[d]&&(ue.value=Jt(ue.value,d)),fe.add(d),de=!0,await lr()}catch(g){const x=g instanceof Error?g.message:"Failed to interrupt active turn";It(d,x),Oe.value=x}finally{De.value=!1}}async function Fs(d){const p=n.value;if(!p||tt.value)return;const x=(r.value[p]??[]).reduce((re,he)=>typeof he.turnIndex=="number"&&he.turnIndex>re?he.turnIndex:re,-1);if(x<0||d>x)return;const Z=x-d+1;if(!(Z<1)){tt.value=!0,Oe.value="";try{await Me(p,d);const re=await hu(p,Z);At(p,re),Gt(p,[]),Yt(p),i.value[p]&&(i.value=Jt(i.value,p)),zt(p,null),kt(p,null),It(p,null),de=!0,await lr()}catch(re){Oe.value=re instanceof Error?re.message:"Failed to rollback thread"}finally{tt.value=!1}}}function qi(d,p){d.length===0||(P.value[d]??"")===p||(P.value={...P.value,[d]:p},Ra(P.value))}function No(d){var Z;if(d.length===0)return;const p=R.value.filter(re=>re!==d);if(rs(R.value,p)||(R.value=p,ms(R.value)),t.value=t.value.filter(re=>re.projectName!==d),P.value[d]!==void 0){const re={...P.value};delete re[d],P.value=re,Ra(re)}mt();const g=hr(e.value);nt(g),g.some(re=>re.id===n.value)||z(((Z=g[0])==null?void 0:Z.id)??""),Bs()}function Do(d,p){if(d.length===0||t.value.length===0)return;const g=t.value.map(ge=>ge.projectName),x=g.indexOf(d);if(x===-1)return;const Z=Math.max(0,Math.min(p,g.length-1)),re=qA(g,x,Z);if(re===g)return;const he=qo(re,t.value);R.value=he,ms(R.value);const Ee=Pa(t.value,R.value);t.value=Jo(t.value,Ee),mt(),Bs()}function Lo(d){const p=d.trim();if(!p)return;const g=[p,...R.value.filter(Z=>Z!==p)];if(rs(R.value,g))return;R.value=g,ms(R.value);const x=Pa(t.value,R.value);t.value=Jo(t.value,x),mt(),Bs()}async function Bs(){var d,p;try{const g=await Qa(),x=new Map;for(const he of g.order){const Ee=Ma(he);x.has(Ee)||x.set(Ee,he)}for(const he of t.value){const Ee=((p=(d=he.threads[0])==null?void 0:d.cwd)==null?void 0:p.trim())??"";Ee&&x.set(he.projectName,Ee)}const Z=[];for(const he of R.value){const Ee=x.get(he);Ee&&!Z.includes(Ee)&&Z.push(Ee)}for(const he of g.order)Z.includes(he)||Z.push(he);const re=g.active.filter(he=>Z.includes(he));re.length===0&&Z.length>0&&re.push(Z[0]),await ak({order:Z,labels:g.labels,active:re})}catch{}}async function lr(){if(Qe.value){typeof window<"u"&&Ze===null&&(Ze=window.setTimeout(()=>{Ze=null,lr()},Aa));return}Qe.value=!0;const d=de,p=new Set(fe);de=!1,fe.clear();try{d&&await hn();const g=n.value;if(!g)return;const x=p.has(g),Z=a.value[g]===!0,re=en(g),he=B.value[g]??"",Ee=re.length>0&&re!==he;(x||Z||Ee||d)&&await Nn(g,{silent:!0})}catch{}finally{Qe.value=!1,(de||fe.size>0)&&typeof window<"u"&&Ze===null&&(Ze=window.setTimeout(()=>{Ze=null,lr()},Aa))}}function Ki(){typeof window>"u"||ct||(Ji(),ct=V_(d=>{je(d),Ft(d)}))}async function Ji(){try{const d=await G_();for(const p of d){const g=Un(p);g&&Mn(g)}}catch{}}async function Yi(d){try{await z_(d.id,{result:d.result,error:d.error}),$n(d.id)}catch(p){Oe.value=p instanceof Error?p.message:"Failed to reply to server request"}}function Xi(){ct&&(ct(),ct=null),de=!1,fe.clear(),b.clear(),Ze!==null&&typeof window<"u"&&(window.clearTimeout(Ze),Ze=null),Je!==null&&typeof window<"u"&&(window.clearTimeout(Je),Je=null),Te=!1,r.value={},s.value={},o.value={},i.value={},we.value={},oe.value={},Se.value={},ue.value={},l.value={},u.value={}}const Gr=ie(()=>{const d=n.value;return d?l.value[d]??[]:[]});function jo(d){const p=n.value;if(!p)return;const g=l.value[p];if(!g)return;const x=g.filter(Z=>Z.id!==d);l.value=x.length>0?{...l.value,[p]:x}:Jt(l.value,p)}function Qi(d){const p=n.value;if(!p)return;const g=l.value[p];if(!g)return;const x=g.find(Z=>Z.id===d);x&&(jo(d),$o(x.text,x.imageUrls,x.skills,"steer",x.fileAttachments))}return{projectGroups:e,projectDisplayNameById:P,selectedThread:ee,selectedThreadScrollState:H,selectedThreadServerRequests:G,selectedLiveOverlay:W,selectedThreadId:n,availableModelIds:f,selectedModelId:m,selectedReasoningEffort:S,selectedSpeedMode:L,installedSkills:ke,accountRateLimitSnapshots:Ne,messages:q,isLoadingThreads:Ue,isLoadingMessages:Ce,isSendingMessage:$e,isInterruptingTurn:De,isUpdatingSpeedMode:ze,error:Oe,refreshAll:js,refreshSkills:Vr,selectThread:Wi,setThreadScrollState:jt,archiveThreadById:Vi,renameThreadById:zi,forkThreadById:Gi,sendMessageToSelectedThread:$o,sendMessageToNewThread:hs,interruptSelectedThreadTurn:Us,rollbackSelectedThread:Fs,isRollingBack:tt,selectedThreadQueuedMessages:Gr,removeQueuedMessage:jo,steerQueuedMessage:Qi,setSelectedModelId:me,setWorktreeGitAutomationEnabled:ve,setSelectedReasoningEffort:et,updateSelectedSpeedMode:xt,respondToPendingServerRequest:Yi,renameProject:qi,removeProject:No,reorderProject:Do,pinProjectToTop:Lo,startPolling:Ki,stopPolling:Xi}}const c1={class:"sidebar-root"},u1={class:"sidebar-scrollable"},d1=["aria-pressed"],f1={key:1,class:"sidebar-search-bar"},h1={key:0,class:"sidebar-settings-area"},p1={key:0,class:"sidebar-settings-panel"},m1=["title"],g1=["title"],v1={class:"sidebar-settings-value"},y1=["title"],w1={class:"sidebar-settings-value"},b1=["title"],_1=["title"],k1=["title"],T1=["title"],S1=["title"],I1={class:"sidebar-settings-value"},E1={class:"sidebar-settings-rate-limits"},C1={class:"sidebar-settings-build-label","aria-label":"Worktree name and version"},A1={class:"content-root"},x1={class:"content-body"},R1={key:1,class:"content-grid"},P1={class:"new-thread-empty"},M1={class:"worktree-init-status-title"},$1={class:"worktree-init-status-message"},O1={key:1,class:"new-thread-trending"},N1={class:"new-thread-trending-header"},D1={key:0,class:"new-thread-trending-empty"},L1={key:1,class:"new-thread-trending-empty"},j1={key:2,class:"new-thread-trending-list"},U1=["onClick"],F1=["title"],B1={class:"new-thread-trending-tip-name-owner"},H1={class:"new-thread-trending-tip-name-repo"},W1={key:1,class:"new-thread-trending-tip-name-repo"},V1={class:"new-thread-trending-tip-meta"},z1={class:"new-thread-trending-tip-description"},G1={key:2,class:"content-grid"},q1={class:"content-thread"},K1={class:"composer-with-queue"},Zu="codex-web-local.sidebar-collapsed.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",sd="codex-web-local.dictation-auto-send.v1",od="codex-web-local.dictation-language.v1",id="codex-web-local.worktree-git-automation.v1",ad="codex-web-local.github-trending-projects.v1",J1=Wt({__name:"App",setup(e){const t="2a6c",n="0.1.57",r={sendWithEnter:"When enabled, press Enter to send. When disabled, use Command+Enter to send.",inProgressSendMode:"If a turn is still running, choose whether a new prompt should steer the current turn or be queued.",appearance:"Switch between system theme, light mode, and dark mode.",dictationClickToToggle:"Use click-to-start and click-to-stop dictation instead of hold-to-talk.",dictationAutoSend:"Automatically send transcribed dictation when recording stops.",rollbackCommits:"When enabled, each message creates a rollback Git commit. On rollback, it resets to the commit before that message.",githubTrendingProjects:"Show or hide GitHub trending project cards on the new thread screen.",dictationLanguage:"Choose transcription language or keep auto-detect."},s={en:"english",zh:"chinese",de:"german",es:"spanish",ru:"russian",ko:"korean",fr:"french",ja:"japanese",pt:"portuguese",tr:"turkish",pl:"polish",ca:"catalan",nl:"dutch",ar:"arabic",sv:"swedish",it:"italian",id:"indonesian",hi:"hindi",fi:"finnish",vi:"vietnamese",he:"hebrew",uk:"ukrainian",el:"greek",ms:"malay",cs:"czech",ro:"romanian",da:"danish",hu:"hungarian",ta:"tamil",no:"norwegian",th:"thai",ur:"urdu",hr:"croatian",bg:"bulgarian",lt:"lithuanian",la:"latin",mi:"maori",ml:"malayalam",cy:"welsh",sk:"slovak",te:"telugu",fa:"persian",lv:"latvian",bn:"bengali",sr:"serbian",az:"azerbaijani",sl:"slovenian",kn:"kannada",et:"estonian",mk:"macedonian",br:"breton",eu:"basque",is:"icelandic",hy:"armenian",ne:"nepali",mn:"mongolian",bs:"bosnian",kk:"kazakh",sq:"albanian",sw:"swahili",gl:"galician",mr:"marathi",pa:"punjabi",si:"sinhala",km:"khmer",sn:"shona",yo:"yoruba",so:"somali",af:"afrikaans",oc:"occitan",ka:"georgian",be:"belarusian",tg:"tajik",sd:"sindhi",gu:"gujarati",am:"amharic",yi:"yiddish",lo:"lao",uz:"uzbek",fo:"faroese",ht:"haitian creole",ps:"pashto",tk:"turkmen",nn:"nynorsk",mt:"maltese",sa:"sanskrit",lb:"luxembourgish",my:"myanmar",bo:"tibetan",tl:"tagalog",mg:"malagasy",as:"assamese",tt:"tatar",haw:"hawaiian",ln:"lingala",ha:"hausa",ba:"bashkir",jw:"javanese",su:"sundanese",yue:"cantonese"},{projectGroups:o,projectDisplayNameById:i,selectedThread:a,selectedThreadScrollState:l,selectedThreadServerRequests:u,selectedLiveOverlay:c,selectedThreadId:f,availableModelIds:m,selectedModelId:S,selectedReasoningEffort:L,selectedSpeedMode:O,installedSkills:V,accountRateLimitSnapshots:R,messages:P,isLoadingThreads:B,isLoadingMessages:F,isInterruptingTurn:ne,isUpdatingSpeedMode:oe,refreshAll:we,refreshSkills:Se,selectThread:ue,setThreadScrollState:ce,archiveThreadById:be,forkThreadById:K,renameThreadById:ke,sendMessageToSelectedThread:Ne,sendMessageToNewThread:Ue,interruptSelectedThreadTurn:Ce,rollbackSelectedThread:$e,isRollingBack:De,selectedThreadQueuedMessages:ze,removeQueuedMessage:tt,steerQueuedMessage:Oe,setSelectedModelId:Qe,setWorktreeGitAutomationEnabled:wt,setSelectedReasoningEffort:ct,updateSelectedSpeedMode:Ze,respondToPendingServerRequest:Je,renameProject:X,removeProject:de,reorderProject:fe,pinProjectToTop:Ie,startPolling:Te,stopPolling:b}=l1(),T=_v(),M=bv(),{isMobile:Y}=Lf(),ee=N(null),H=N(null),G=N([]),W=N(!1),q=N("trending-daily"),z=N(null),me=N(!1),ve=N(!1),ye=N(""),Re=N("local"),We=N({order:[],labels:{}}),Fe=N({phase:"idle",title:"",message:""}),Me=N(An()),Ye=N(""),et=N(!1),xt=N(null),ft=N(null);let Ct=null;const Lt=N("New Project (1)"),pt=N(""),Pt=N(!1),mt=N(Gr(ed,!0)),Vt=N(Qi()),nt=N(jo()),bn=N(Gr(rd,!1)),zt=N(null);let Mt=0;const un=N(Gr(sd,!0)),kt=N(ge()),It=ie(()=>ot()),en=N(Gr(id,!0)),jt=N(Gr(ad,!0)),At=N({configured:!1,active:!1,mappedChats:0,mappedThreads:0,lastError:""}),Gt=ie(()=>{const _=T.params.threadId;return typeof _=="string"?_:""}),In=ie(()=>{const _=new Set;for(const U of o.value)for(const se of U.threads)_.add(se.id);return _}),$t=ie(()=>T.name==="home"),En=ie(()=>T.name==="skills"),Yt=ie(()=>{var _;return En.value?"Skills":$t.value?"New thread":((_=a.value)==null?void 0:_.title)??"Choose a thread"}),He=typeof window<"u"&&(window.location.hostname||window.location.host)||"codexui",Le=ie(()=>{var U,se;return(((se=(U=a.value)==null?void 0:U.title)==null?void 0:se.trim())??"")||He}),qt=ie(()=>P.value.filter(_=>{const U=Hs(_.messageType,_.role);return U==="worked"?!0:!(U==="turnActivity.live"||U==="turnError.live"||U==="agentReasoning.live")})),dn=ie(()=>{let _=-1;for(const U of P.value)U.role==="user"&&typeof U.turnIndex=="number"&&U.turnIndex>_&&(_=U.turnIndex);return _}),Pn=ie(()=>c.value),_n=ie(()=>$t.value?"__new-thread__":f.value),Kt=ie(()=>{var _,U;return $t.value?ye.value.trim():((U=(_=a.value)==null?void 0:_.cwd)==null?void 0:U.trim())??""}),Ut=ie(()=>{var _;return!$t.value&&((_=a.value)==null?void 0:_.inProgress)===!0}),tn=ie(()=>{var pe,Be;const _=[],U=new Set;for(const xe of We.value.order){const Nt=xe.trim();!Nt||U.has(Nt)||(U.add(Nt),_.push({value:Nt,label:We.value.labels[Nt]||ws(Nt)}))}for(const xe of o.value){const Nt=((Be=(pe=xe.threads[0])==null?void 0:pe.cwd)==null?void 0:Be.trim())??"";!Nt||U.has(Nt)||(U.add(Nt),_.push({value:Nt,label:i.value[xe.projectName]??xe.projectName}))}const se=ye.value.trim();return se&&!U.has(se)&&_.unshift({value:se,label:ws(se)}),_}),fn=typeof window<"u"?window.matchMedia("(prefers-color-scheme: dark)"):null,Un=ie(()=>[{value:"search-daily",label:"Search daily"},{value:"search-weekly",label:"Search weekly"},{value:"search-monthly",label:"Search monthly"},{value:"trending-daily",label:"Trending daily"},{value:"trending-weekly",label:"Trending weekly"},{value:"trending-monthly",label:"Trending monthly"}]),Mn=ie(()=>{if(!At.value.configured)return"Not configured";const _=At.value.active?"Online":"Configured (offline)",U=`${At.value.mappedChats} chat(s), ${At.value.mappedThreads} thread(s)`,se=At.value.lastError?`, error: ${At.value.lastError}`:"";return`${_}, ${U}${se}`});ar(()=>{window.addEventListener("keydown",Ft),nn(),fn==null||fn.addEventListener("change",nn),Uo(),zi(),Oo(),Us(),hs(),kn(),jt.value&&Fs()}),So(()=>{window.removeEventListener("keydown",Ft),fn==null||fn.removeEventListener("change",nn),Ct&&(clearTimeout(Ct),Ct=null),b()}),at(Ye,_=>{const U=_.trim();if(Ct&&(clearTimeout(Ct),Ct=null),!U){ft.value=null;return}Ct=setTimeout(()=>{uk(U,1e3).then(se=>{Ye.value.trim()===U&&(ft.value=se.threadIds)}).catch(()=>{Ye.value.trim()===U&&(ft.value=null)})},220)});function $n(){Se()}async function kn(){try{At.value=await fk()}catch(_){const U=_ instanceof Error?_.message:"Failed to load Telegram status";At.value={configured:!1,active:!1,mappedChats:0,mappedThreads:0,lastError:U}}}function Cn(){et.value=!et.value,et.value?Xt(()=>{var _;return(_=xt.value)==null?void 0:_.focus()}):Ye.value=""}function On(){var _;Ye.value="",(_=xt.value)==null||_.focus()}function w(_){_.key==="Escape"&&(et.value=!1,Ye.value="")}function I(_){_&&(T.name==="thread"&&Gt.value===_||(M.push({name:"thread",params:{threadId:_}}),Y.value&&je(!0)))}async function A(_){_&&(f.value!==_&&(await ue(_),await M.push({name:"thread",params:{threadId:_}})),await Xt(),Ki())}function J(_){be(_)}async function y(_){const U=await K(_);U&&($t.value?await M.replace({name:"thread",params:{threadId:U}}):await M.push({name:"thread",params:{threadId:U}}),Y.value&&je(!0))}function C(_){const U=_.trim().replace(/\\/gu,"/");return U?U.includes("/.codex/worktrees/")||U.includes("/.git/worktrees/"):!1}function j(_,U=""){var xe,Nt,qr;const se=o.value.find(Kr=>Kr.projectName===_);if(!se)return U.trim();const pe=se.threads.find(Kr=>!C(Kr.cwd));return(((xe=pe==null?void 0:pe.cwd)==null?void 0:xe.trim())??((qr=(Nt=se.threads[0])==null?void 0:Nt.cwd)==null?void 0:qr.trim())??"")||U.trim()}function te(_){var pe,Be;const U=o.value.find(xe=>xe.projectName===_),se=j(_,((Be=(pe=U==null?void 0:U.threads[0])==null?void 0:pe.cwd)==null?void 0:Be.trim())??"");se&&(ye.value=se),Y.value&&je(!0),!$t.value&&M.push({name:"home"})}function Ae(_){var se;let U="";for(const pe of o.value){const Be=pe.threads.find(xe=>xe.id===_);if((se=Be==null?void 0:Be.cwd)!=null&&se.trim()){U=Be.cwd.trim();break}}!U||typeof window>"u"||window.open(`/codex-local-browse${encodeURI(U)}`,"_blank","noopener,noreferrer")}function Xe(){var se;const _=a.value,U=_?j(_.projectName,((se=_.cwd)==null?void 0:se.trim())??""):"";U&&(ye.value=U),Y.value&&je(!0),!$t.value&&M.push({name:"home"})}function ut(_){X(_.projectName,_.displayName)}function Rt(_){ke(_.threadId,_.title)}function k(_){de(_)}function $(_){fe(_.projectName,_.toIndex)}function D(_){ce(_.threadId,_.state)}function Q(_){Je(_)}function je(_){Me.value!==_&&(Me.value=_,Kn(_))}function Ft(_){_.defaultPrevented||!_.ctrlKey&&!_.metaKey||_.shiftKey||_.altKey||_.key.toLowerCase()==="b"&&(_.preventDefault(),je(!Me.value))}function Tn(_){const U=_.text,se=z.value,pe=_.mode==="queue"&&se&&se.threadId===f.value?se.queueIndex:void 0;if(z.value=null,$t.value){Fo(U,_.imageUrls,_.skills,_.fileAttachments);return}if(_.rollbackLatestUserTurn===!0){js(_);return}Ne(U,_.imageUrls,_.skills,_.mode,_.fileAttachments,pe)}function ds(_){const U=new Intl.NumberFormat().format(_.stars);return _.language?`${_.language} · ★ ${U}`:`★ ${U}`}function fs(_){const se=new Set(["search-daily","search-weekly","search-monthly","trending-daily","trending-weekly","trending-monthly"]).has(_)?_:"trending-daily";q.value!==se&&(q.value=se)}function hn(){if(typeof window>"u")return;const _=window.prompt("Telegram bot token");!_||!_.trim()||dk(_.trim()).then(()=>{window.alert("Telegram bot configured. Open the bot DM and send /start."),kn()}).catch(U=>{const se=U instanceof Error?U.message:"Failed to connect Telegram bot";window.alert(se),kn()})}function Nn(_){const U=ee.value;U&&U.hydrateDraft({text:`Clone this GitHub project and run it: ${_.url}
1427
1427
  Then explain what this project does in very simple words a 5th grader can understand.`,imageUrls:[],fileAttachments:[],skills:[]})}function Vr(_){const U=ze.value.findIndex(xe=>xe.id===_),se=U>=0?ze.value[U]:void 0,pe=H.value;if(!se||!pe||pe.hasUnsavedDraft()&&!window.confirm("Replace the current draft with this queued message for editing?"))return;z.value=f.value?{threadId:f.value,queueIndex:U}:null;const Be={text:se.text,imageUrls:[...se.imageUrls],fileAttachments:se.fileAttachments.map(xe=>({...xe})),skills:se.skills.map(xe=>({...xe}))};pe.hydrateDraft(Be),tt(_)}async function js(_){Ut.value&&await Ce();const U=dn.value;U>=0&&await $e(U),await Ne(_.text,_.imageUrls,_.skills,"steer",_.fileAttachments)}function Wi(_){ye.value=_.trim()}async function Vi(_){const U=_.trim();if(!U)return;const se=$o(U),pe=await Gi(),Be=se?U:qi(pe,U);if(Be)try{const xe=await gu(Be,{createIfMissing:!se,label:se?"":U});xe&&(ye.value=xe,Ie(ws(xe)),Us(),hs())}catch{}}async function zi(){var U;if(typeof window>"u")return;const _=((U=new URLSearchParams(window.location.search).get("openProjectPath"))==null?void 0:U.trim())??"";if(_)try{const se=await gu(_,{createIfMissing:!1,label:""});if(!se)return;ye.value=se,Ie(ws(se)),await M.replace({name:"home"}),await Us();const pe=new URL(window.location.href);pe.searchParams.delete("openProjectPath"),window.history.replaceState({},"",pe.toString())}catch{}}async function Gi(){const _=zr();if(_)return _;try{const U=await mu();if(U)return pt.value=U,U}catch{}return""}function $o(_){return _?_.startsWith("~/")||_.startsWith("/")?!0:/^[a-zA-Z]:[\\/]/.test(_):!1}async function hs(){const _=zr();if(!_){Lt.value="New Project (1)";return}try{const U=await lk(_);Lt.value=U.name||"New Project (1)"}catch{Lt.value="New Project (1)"}}function zr(){var se,pe;const _=ye.value.trim();if(_)return uu(_);const U=((pe=(se=tn.value[0])==null?void 0:se.value)==null?void 0:pe.trim())??"";return U?uu(U):pt.value.trim()}async function Oo(){try{pt.value=await mu()}catch{pt.value=""}}async function Us(){try{const _=await Qa();We.value={order:[..._.order],labels:{..._.labels}}}catch{We.value={order:[],labels:{}}}}async function Fs(){W.value=!0;try{G.value=await pk(q.value,6)}catch{G.value=[]}finally{W.value=!1}}function qi(_,U){const se=_.trim().replace(/\/+$/,""),pe=U.trim().replace(/^\/+/,"");return!se||!pe?"":`${se}/${pe}`}function No(_){Qe(_)}function Do(_){ct(_)}function Lo(_){Ze(_)}function Bs(){Ce()}function lr(_){var se;const U=((se=_.prependText)==null?void 0:se.trim())??"";U.length>0&&(Mt+=1,zt.value={id:Mt,text:U}),$e(_.turnIndex)}function Ki(){if($t.value||En.value||typeof document>"u"||!a.value||qt.value.length===0)return;const _=Ji(),U=Yi(),se=new Blob([_],{type:"text/markdown;charset=utf-8"}),pe=URL.createObjectURL(se),Be=document.createElement("a");Be.href=pe,Be.download=U,document.body.appendChild(Be),Be.click(),document.body.removeChild(Be),window.setTimeout(()=>URL.revokeObjectURL(pe),0)}function Ji(){var se,pe,Be;const _=[],U=((pe=(se=a.value)==null?void 0:se.title)==null?void 0:pe.trim())||"Untitled thread";_.push(`# ${Xi(U)}`),_.push(""),_.push(`- Exported: ${new Date().toISOString()}`),_.push(`- Thread ID: ${((Be=a.value)==null?void 0:Be.id)??""}`),_.push(""),_.push("---"),_.push("");for(const xe of qt.value){const Nt=xe.role?xe.role.toUpperCase():"MESSAGE";_.push(`## ${Nt}`),_.push("");const qr=xe.text.trim();if(qr&&(_.push(qr),_.push("")),xe.commandExecution&&(_.push("```text"),_.push(`command: ${xe.commandExecution.command}`),_.push(`status: ${xe.commandExecution.status}`),xe.commandExecution.cwd&&_.push(`cwd: ${xe.commandExecution.cwd}`),xe.commandExecution.exitCode!==null&&_.push(`exitCode: ${xe.commandExecution.exitCode}`),_.push(xe.commandExecution.aggregatedOutput||"(no output)"),_.push("```"),_.push("")),xe.fileAttachments&&xe.fileAttachments.length>0){_.push("Attachments:");for(const Kr of xe.fileAttachments)_.push(`- ${Kr.path}`);_.push("")}if(xe.images&&xe.images.length>0){_.push("Images:");for(const Kr of xe.images)_.push(`- ${Kr}`);_.push("")}}return`${_.join(`
1428
1428
  `).trimEnd()}
1429
1429
  `}function Yi(){var Be,xe;const se=(((xe=(Be=a.value)==null?void 0:Be.title)==null?void 0:xe.trim())||"chat").toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")||"chat",pe=new Date().toISOString().replace(/[:.]/g,"-");return`${se}-${pe}.md`}function Xi(_){return _.replace(/([\\`*_{}\[\]()#+\-.!])/g,"\\$1")}function Gr(_,U){if(typeof window>"u")return U;const se=window.localStorage.getItem(_);return se===null?U:se==="1"}function jo(){if(typeof window>"u")return"system";const _=window.localStorage.getItem(nd);return _==="light"||_==="dark"?_:"system"}function Qi(){return typeof window>"u"?"steer":window.localStorage.getItem(td)==="queue"?"queue":"steer"}function d(){mt.value=!mt.value,window.localStorage.setItem(ed,mt.value?"1":"0")}function p(){Vt.value=Vt.value==="steer"?"queue":"steer",window.localStorage.setItem(td,Vt.value)}function g(){const _=["system","light","dark"],U=_.indexOf(nt.value);nt.value=_[(U+1)%_.length],window.localStorage.setItem(nd,nt.value),nn()}function x(){bn.value=!bn.value,window.localStorage.setItem(rd,bn.value?"1":"0")}function Z(){un.value=!un.value,window.localStorage.setItem(sd,un.value?"1":"0")}function re(){en.value=!en.value,window.localStorage.setItem(id,en.value?"1":"0")}function he(){jt.value=!jt.value,window.localStorage.setItem(ad,jt.value?"1":"0")}function Ee(_){const se=it(_.trim())||"auto";kt.value=se,window.localStorage.setItem(od,se)}function ge(){var se;if(typeof window>"u")return"auto";const _=((se=window.localStorage.getItem(od))==null?void 0:se.trim())||"auto";return it(_)||"auto"}function ot(){const _=[{value:"auto",label:"Auto-detect"}],U=new Set(["auto"]);function se(Be){const xe=s[Be]||Be;return`${xe.charAt(0).toUpperCase()+xe.slice(1)} (${Be})`}for(const Be of typeof navigator<"u"?navigator.languages??[]:[]){const xe=it(Be);!xe||U.has(xe)||(U.add(xe),_.push({value:xe,label:`Preferred: ${se(xe)}`}))}for(const Be of Object.keys(s))U.has(Be)||(U.add(Be),_.push({value:Be,label:se(Be)}));const pe=kt.value.trim();return pe&&!U.has(pe)&&_.push({value:pe,label:se(pe)}),_}function it(_){const U=_.trim().toLowerCase();if(!U||U==="auto")return"";if(U in s)return U;const se=U.split("-")[0]??U;return se in s?se:""}function nn(){const _=document.documentElement;if(nt.value==="dark")_.classList.add("dark");else if(nt.value==="light")_.classList.remove("dark");else{const U=window.matchMedia("(prefers-color-scheme: dark)").matches;_.classList.toggle("dark",U)}}function An(){return typeof window>"u"?!1:window.localStorage.getItem(Zu)==="1"}function Kn(_){typeof window>"u"||window.localStorage.setItem(Zu,_?"1":"0")}function Hs(_,U){const se=(_??"").trim();return se.length>0?se:U.trim()||"message"}async function Uo(){await we(),ve.value=!0,await Ws(),Te()}async function Ws(){if(!me.value){me.value=!0;try{if(T.name==="home"||T.name==="skills"){f.value!==""&&await ue("");return}if(T.name==="thread"){const _=Gt.value;if(!_)return;if(!In.value.has(_)){await M.replace({name:"home"});return}f.value!==_&&await ue(_);return}}finally{me.value=!1}}}at(()=>[T.name,Gt.value,B.value,In.value.has(Gt.value),f.value],async()=>{ve.value&&await Ws()}),at(()=>f.value,async _=>{if(ve.value&&!me.value&&!($t.value||En.value)){if(!_){T.name!=="home"&&await M.replace({name:"home"});return}T.name==="thread"&&Gt.value===_||await M.replace({name:"thread",params:{threadId:_}})}}),at(()=>q.value,()=>{jt.value&&Fs()}),at(()=>jt.value,_=>{if(!_){G.value=[];return}Fs()}),at(()=>tn.value,_=>{if(_.length===0){ye.value="";return}_.some(se=>se.value===ye.value)||(ye.value=_[0].value),hs()},{immediate:!0}),at(()=>ye.value,()=>{Fe.value={phase:"idle",title:"",message:""},hs()}),at(()=>Re.value,_=>{var U;if(_==="local"){Fe.value={phase:"idle",title:"",message:""};const se=ye.value.trim();if(se&&C(se)){const pe=((U=a.value)==null?void 0:U.projectName)??ws(se),Be=j(pe,"");Be&&(ye.value=Be)}}}),at(()=>T.name,_=>{_!=="home"&&(Fe.value={phase:"idle",title:"",message:""})}),at(()=>f.value,()=>{Fe.value={phase:"idle",title:"",message:""}}),at(Le,_=>{typeof document>"u"||(document.title=_)},{immediate:!0}),at(()=>en.value,_=>{wt(_)},{immediate:!0}),at(Y,_=>{_&&!Me.value&&je(!0)});async function Fo(_,U=[],se=[],pe=[]){try{Fe.value={phase:"idle",title:"",message:""};let Be=ye.value;if(Re.value==="worktree"){Fe.value={phase:"running",title:"Creating worktree",message:"Creating a worktree and running setup."};try{const Nt=await sk(ye.value);Be=Nt.cwd,ye.value=Nt.cwd,Fe.value={phase:"idle",title:"",message:""}}catch{Fe.value={phase:"error",title:"Worktree setup failed",message:"Unable to create worktree. Try again or switch to Local project."};return}}const xe=await Ue(_,Be,U,se,pe);if(!xe)return;await M.replace({name:"thread",params:{threadId:xe}})}catch{}}return(_,U)=>(v(),dt(Cv,{"is-sidebar-collapsed":Me.value,onCloseSidebar:U[6]||(U[6]=se=>je(!0))},{sidebar:bt(()=>[h("section",c1,[h("div",u1,[Me.value?le("",!0):(v(),dt(Ku,{key:0,class:"sidebar-thread-controls-host","is-sidebar-collapsed":Me.value,"show-new-thread-button":!0,onToggleSidebar:U[0]||(U[0]=se=>je(!Me.value)),onStartNewThread:Xe},{default:bt(()=>[h("button",{class:"sidebar-search-toggle",type:"button","aria-pressed":et.value,"aria-label":"Search threads",title:"Search threads",onClick:Cn},[Pe(Za,{class:"sidebar-search-toggle-icon"})],8,d1)]),_:1},8,["is-sidebar-collapsed"])),!Me.value&&et.value?(v(),E("div",f1,[Pe(Za,{class:"sidebar-search-bar-icon"}),Tr(h("input",{ref_key:"sidebarSearchInputRef",ref:xt,"onUpdate:modelValue":U[1]||(U[1]=se=>Ye.value=se),class:"sidebar-search-input",type:"text",placeholder:"Filter threads...",onKeydown:w},null,544),[[Sr,Ye.value]]),Ye.value.length>0?(v(),E("button",{key:0,class:"sidebar-search-clear",type:"button","aria-label":"Clear search",onClick:On},[Pe(Ol,{class:"sidebar-search-clear-icon"})])):le("",!0)])):le("",!0),Me.value?le("",!0):(v(),E("button",{key:2,class:st(["sidebar-skills-link",{"is-active":En.value}]),type:"button",onClick:U[2]||(U[2]=se=>{_e(M).push({name:"skills"}),_e(Y)&&je(!0)})}," Skills Hub ",2)),Me.value?le("",!0):(v(),dt(_w,{key:3,groups:_e(o),"project-display-name-by-id":_e(i),"selected-thread-id":_e(f),"is-loading":_e(B),"search-query":Ye.value,"search-matched-thread-ids":ft.value,onSelect:I,onArchive:J,onStartNewThread:te,onRenameProject:ut,onBrowseThreadFiles:Ae,onRenameThread:Rt,onForkThread:y,onRemoveProject:k,onReorderProject:$,onExportThread:A},null,8,["groups","project-display-name-by-id","selected-thread-id","is-loading","search-query","search-matched-thread-ids"]))]),Me.value?le("",!0):(v(),E("div",h1,[Pe(Sf,{name:"settings-panel"},{default:bt(()=>[Pt.value?(v(),E("div",p1,[h("button",{class:"sidebar-settings-row",type:"button",title:r.sendWithEnter,onClick:d},[U[7]||(U[7]=h("span",{class:"sidebar-settings-label"},"Require ⌘ + enter to send",-1)),h("span",{class:st(["sidebar-settings-toggle",{"is-on":!mt.value}])},null,2)],8,m1),h("button",{class:"sidebar-settings-row",type:"button",title:r.inProgressSendMode,onClick:p},[U[8]||(U[8]=h("span",{class:"sidebar-settings-label"},"When busy, send as",-1)),h("span",v1,ae(Vt.value==="steer"?"Steer":"Queue"),1)],8,g1),h("button",{class:"sidebar-settings-row",type:"button",title:r.appearance,onClick:g},[U[9]||(U[9]=h("span",{class:"sidebar-settings-label"},"Appearance",-1)),h("span",w1,ae(nt.value==="system"?"System":nt.value==="dark"?"Dark":"Light"),1)],8,y1),h("button",{class:"sidebar-settings-row",type:"button",title:r.dictationClickToToggle,onClick:x},[U[10]||(U[10]=h("span",{class:"sidebar-settings-label"},"Click to toggle dictation",-1)),h("span",{class:st(["sidebar-settings-toggle",{"is-on":bn.value}])},null,2)],8,b1),h("button",{class:"sidebar-settings-row",type:"button",title:r.dictationAutoSend,onClick:Z},[U[11]||(U[11]=h("span",{class:"sidebar-settings-label"},"Auto send dictation",-1)),h("span",{class:st(["sidebar-settings-toggle",{"is-on":un.value}])},null,2)],8,_1),h("button",{class:"sidebar-settings-row",type:"button",title:r.rollbackCommits,onClick:re},[U[12]||(U[12]=h("span",{class:"sidebar-settings-label"},"Rollback commits",-1)),h("span",{class:st(["sidebar-settings-toggle",{"is-on":en.value}])},null,2)],8,k1),h("button",{class:"sidebar-settings-row",type:"button",title:r.githubTrendingProjects,onClick:he},[U[13]||(U[13]=h("span",{class:"sidebar-settings-label"},"GitHub trending projects",-1)),h("span",{class:st(["sidebar-settings-toggle",{"is-on":jt.value}])},null,2)],8,T1),h("div",{class:"sidebar-settings-row sidebar-settings-row--select",title:r.dictationLanguage},[U[14]||(U[14]=h("span",{class:"sidebar-settings-label"},"Dictation language",-1)),Pe(oo,{class:"sidebar-settings-language-dropdown","model-value":kt.value,options:It.value,placeholder:"Auto-detect","open-direction":"up","enable-search":!0,"search-placeholder":"Search language...","onUpdate:modelValue":Ee},null,8,["model-value","options"])],8,S1),h("button",{class:"sidebar-settings-row",type:"button","aria-live":"polite",onClick:hn},[U[15]||(U[15]=h("span",{class:"sidebar-settings-label"},"Telegram",-1)),h("span",I1,ae(Mn.value),1)]),h("div",E1,[Pe(wT,{snapshots:_e(R)},null,8,["snapshots"])]),h("div",C1," WT "+ae(_e(t))+" · v"+ae(_e(n)),1)])):le("",!0)]),_:1}),h("button",{class:"sidebar-settings-button",type:"button",onClick:U[3]||(U[3]=se=>Pt.value=!Pt.value)},[Pe(DA,{class:"sidebar-settings-icon"}),U[16]||(U[16]=h("span",null,"Settings",-1))])]))])]),content:bt(()=>[h("section",A1,[Pe(Cw,{title:Yt.value},{leading:bt(()=>[Me.value||_e(Y)?(v(),dt(Ku,{key:0,class:"sidebar-thread-controls-header-host","is-sidebar-collapsed":Me.value,"show-new-thread-button":!0,onToggleSidebar:U[4]||(U[4]=se=>je(!Me.value)),onStartNewThread:Xe},null,8,["is-sidebar-collapsed"])):le("",!0)]),_:1},8,["title"]),h("section",x1,[En.value?(v(),dt(_A,{key:0,onSkillsChanged:$n})):$t.value?(v(),E("div",R1,[h("div",P1,[U[19]||(U[19]=h("p",{class:"new-thread-hero"},"Let's build",-1)),Pe(oo,{class:"new-thread-folder-dropdown","model-value":ye.value,options:tn.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":Lt.value,"add-placeholder":"Project name or absolute path",disabled:!1,"onUpdate:modelValue":Wi,onAdd:Vi},null,8,["model-value","options","default-add-value"]),Pe(CT,{class:"new-thread-runtime-dropdown",modelValue:Re.value,"onUpdate:modelValue":U[5]||(U[5]=se=>Re.value=se)},null,8,["modelValue"]),Fe.value.phase!=="idle"?(v(),E("div",{key:0,class:st(["worktree-init-status",{"is-running":Fe.value.phase==="running","is-error":Fe.value.phase==="error"}])},[h("strong",M1,ae(Fe.value.title),1),h("span",$1,ae(Fe.value.message),1)],2)):le("",!0),jt.value?(v(),E("div",O1,[h("div",N1,[U[17]||(U[17]=h("p",{class:"new-thread-trending-title"},"Trending GitHub projects",-1)),Pe(oo,{class:"new-thread-trending-scope-dropdown","model-value":q.value,options:Un.value,"onUpdate:modelValue":fs},null,8,["model-value","options"])]),W.value?(v(),E("p",D1,"Loading trending projects...")):G.value.length===0?(v(),E("p",L1," Trending repos are unavailable right now. ")):(v(),E("div",j1,[(v(!0),E(Ve,null,_t(G.value,se=>(v(),E("button",{key:se.id,type:"button",class:"new-thread-trending-tip",onClick:pe=>Nn(se)},[h("span",{class:"new-thread-trending-tip-name",title:se.fullName},[se.owner&&se.repo?(v(),E(Ve,{key:0},[h("span",B1,ae(se.owner),1),U[18]||(U[18]=h("span",{class:"new-thread-trending-tip-name-slash"},"/",-1)),h("span",H1,ae(se.repo),1)],64)):(v(),E("span",W1,ae(se.fullName),1))],8,F1),h("span",V1,ae(ds(se)),1),h("span",z1,ae(se.description||"No description available."),1)],8,U1))),128))]))])):le("",!0)]),Pe(wu,{ref_key:"homeThreadComposerRef",ref:ee,"active-thread-id":_n.value,cwd:Kt.value,models:_e(m),"selected-model":_e(S),"selected-reasoning-effort":_e(L),"selected-speed-mode":_e(O),"is-updating-speed-mode":_e(oe),skills:_e(V),"is-turn-in-progress":!1,"is-interrupting-turn":!1,"send-with-enter":mt.value,"in-progress-submit-mode":Vt.value,"dictation-click-to-toggle":bn.value,"dictation-auto-send":un.value,"prepend-draft-request":zt.value,"dictation-language":kt.value,onSubmit:Tn,"onUpdate:selectedModel":No,"onUpdate:selectedReasoningEffort":Do,"onUpdate:selectedSpeedMode":Lo},null,8,["active-thread-id","cwd","models","selected-model","selected-reasoning-effort","selected-speed-mode","is-updating-speed-mode","skills","send-with-enter","in-progress-submit-mode","dictation-click-to-toggle","dictation-auto-send","prepend-draft-request","dictation-language"])])):(v(),E("div",G1,[h("div",q1,[Pe(h_,{messages:qt.value,"is-loading":_e(F),"active-thread-id":_n.value,cwd:Kt.value,"scroll-state":_e(l),"live-overlay":Pn.value,"pending-requests":_e(u),"is-turn-in-progress":Ut.value,"is-rolling-back":_e(De),onUpdateScrollState:D,onRespondServerRequest:Q,onRollback:lr},null,8,["messages","is-loading","active-thread-id","cwd","scroll-state","live-overlay","pending-requests","is-turn-in-progress","is-rolling-back"])]),h("div",K1,[Pe(uT,{messages:_e(ze),onEdit:Vr,onSteer:_e(Oe),onDelete:_e(tt)},null,8,["messages","onSteer","onDelete"]),Pe(wu,{ref_key:"threadComposerRef",ref:H,"active-thread-id":_n.value,cwd:Kt.value,models:_e(m),"selected-model":_e(S),"selected-reasoning-effort":_e(L),"selected-speed-mode":_e(O),"is-updating-speed-mode":_e(oe),skills:_e(V),"is-turn-in-progress":Ut.value,"is-interrupting-turn":_e(ne),"has-queue-above":_e(ze).length>0,"send-with-enter":mt.value,"in-progress-submit-mode":Vt.value,"dictation-click-to-toggle":bn.value,"dictation-auto-send":un.value,"prepend-draft-request":zt.value,"dictation-language":kt.value,onSubmit:Tn,"onUpdate:selectedModel":No,"onUpdate:selectedReasoningEffort":Do,"onUpdate:selectedSpeedMode":Lo,onInterrupt:Bs},null,8,["active-thread-id","cwd","models","selected-model","selected-reasoning-effort","selected-speed-mode","is-updating-speed-mode","skills","is-turn-in-progress","is-interrupting-turn","has-queue-above","send-with-enter","in-progress-submit-mode","dictation-click-to-toggle","dictation-auto-send","prepend-draft-request","dictation-language"])])]))])])]),_:1},8,["is-sidebar-collapsed"]))}}),Y1=lt(J1,[["__scopeId","data-v-88ff0cc2"]]),$a={render:()=>null},X1=wv({history:Xg(),routes:[{path:"/",name:"home",component:$a},{path:"/thread/:threadId",name:"thread",component:$a},{path:"/skills",name:"skills",component:$a},{path:"/new-thread",redirect:{name:"home"}},{path:"/:pathMatch(.*)*",redirect:{name:"home"}}]});console.log("Welcome to codexapp. GitHub: https://github.com/friuns2/codexui");ug(Y1).use(X1).mount("#app");
package/dist/index.html CHANGED
@@ -4,7 +4,7 @@
4
4
  <meta charset="UTF-8" />
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
6
  <title>Codex Web Local</title>
7
- <script type="module" crossorigin src="/assets/index-C0kJJe0e.js"></script>
7
+ <script type="module" crossorigin src="/assets/index-CeCihVgJ.js"></script>
8
8
  <link rel="stylesheet" crossorigin href="/assets/index-BwkNEgMe.css">
9
9
  </head>
10
10
  <body class="bg-slate-950">
package/dist-cli/index.js CHANGED
@@ -1233,31 +1233,12 @@ async function handleSkillsRoutes(req, res, url, context) {
1233
1233
  }
1234
1234
  const localDir = await detectUserSkillsDir(appServer);
1235
1235
  await pullInstalledSkillsFolderFromRepo(state.githubToken, state.repoOwner, state.repoName);
1236
- const installerScript = resolveSkillInstallerScriptPath(getCodexHomeDir());
1237
- if (!installerScript) {
1238
- throw new Error("Skill installer script not found");
1239
- }
1240
- const pythonCommand = resolvePythonCommand();
1241
- if (!pythonCommand) {
1242
- throw new Error("Python 3 is required to install skills");
1243
- }
1244
1236
  const localSkills = await scanInstalledSkillsFromDisk();
1245
1237
  for (const skill of remote) {
1246
1238
  const owner = skill.owner || uniqueOwnerByName.get(skill.name) || "";
1247
1239
  if (!owner) continue;
1248
1240
  if (!localSkills.has(skill.name)) {
1249
- await runCommand(pythonCommand.command, [
1250
- ...pythonCommand.args,
1251
- installerScript,
1252
- "--repo",
1253
- `${HUB_SKILLS_OWNER}/${HUB_SKILLS_REPO}`,
1254
- "--path",
1255
- `skills/${owner}/${skill.name}`,
1256
- "--dest",
1257
- localDir,
1258
- "--method",
1259
- "git"
1260
- ]);
1241
+ continue;
1261
1242
  }
1262
1243
  const skillPath = join2(localDir, skill.name);
1263
1244
  await appServer.rpc("skills/config/write", { path: skillPath, enabled: skill.enabled });
@@ -1374,7 +1355,8 @@ async function handleSkillsRoutes(req, res, url, context) {
1374
1355
  const payload = asRecord(await readJsonBody2(req));
1375
1356
  const name = typeof payload?.name === "string" ? payload.name : "";
1376
1357
  const path = typeof payload?.path === "string" ? payload.path : "";
1377
- const target = path || (name ? join2(getSkillsInstallDir(), name) : "");
1358
+ const normalizedPath = path.endsWith("/SKILL.md") ? path.slice(0, -"/SKILL.md".length) : path;
1359
+ const target = normalizedPath || (name ? join2(getSkillsInstallDir(), name) : "");
1378
1360
  if (!target) {
1379
1361
  setJson(res, 400, { error: "Missing name or path" });
1380
1362
  return true;