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-
|
|
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
|
-
|
|
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
|
|
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;
|