howtofixcli 0.4.19 → 0.4.20
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/main.js +3 -3
- package/package.json +1 -1
package/dist/main.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
var gP=Object.defineProperty;var m=(e,t,n)=>()=>{if(n)throw n[0];try{return e&&(t=e(e=0)),t}catch(r){throw n=[r],r}};var Ft=(e,t)=>{for(var n in t)gP(e,n,{get:t[n],enumerable:!0})};function xd(e){return e===void 0?void 0:e.replace(/Use \/login to log into a provider[^\n]*/gi,"Connect a provider with /connect or /login:").replace(/^[ \t]*\S*pi-coding-agent[\\/]docs[\\/][^\n]*$/gim,"").replace(/\bpi-coding-agent\b/gi,"the harness").replace(/\n{3,}/g,`
|
|
3
3
|
|
|
4
|
-
`).trim()}var bt,fn,hd,yd,_o=m(()=>{bt="HowToFix",fn="0.4.
|
|
4
|
+
`).trim()}var bt,fn,hd,yd,_o=m(()=>{bt="HowToFix",fn="0.4.20",hd=["You are HowToFix, a coding agent. The user wants the actual fix, not a tour of the problem.","Lead with the diagnosis in one or two sentences, then change the code. Prefer the smallest correct change over a rewrite.","When you edit files, say which file and why in a short line. Do not narrate tool calls. Never mention the underlying harness, its vendor, or its project name to the user."].join(`
|
|
5
5
|
`);yd=["# Project notes","","## What this is","","## Commands","- build:","- test:","","## Conventions","-",""].join(`
|
|
6
6
|
`)});var wd={};Ft(wd,{AGENTS_STORE_DIR:()=>Hr,AGENT_DIR:()=>He,CUBENCE_CACHE_PATH:()=>Ou,USER_SKILLS_DIR:()=>Au,WORKFLOWS_DIR:()=>Mu,pinAgentDir:()=>Cu,projectSkillsDir:()=>gr});import{homedir as hP}from"node:os";import{join as zr,resolve as xP}from"node:path";function yP(){let e=(process.env.HOWTOFIX_HOME??process.env.HOME??"").trim();return xP(e||hP())}function gr(e){return zr(e,".howtofix","skills")}function Cu(){process.env.PI_CODING_AGENT_DIR=He}var He,Au,Hr,Ou,Mu,Dn=m(()=>{He=process.env.HOWTOFIX_CODING_AGENT_DIR?.trim()||zr(yP(),".howtofix","agent"),Au=zr(He,"skills");Hr=zr(He,"agents"),Ou=zr(He,"cubence-cache.json"),Mu=zr(He,"workflows")});import{closeSync as bP,fsyncSync as IP,openSync as $P,renameSync as kd,rmSync as Lu,writeSync as wP}from"node:fs";import{dirname as kP,join as TP}from"node:path";function Ze(e,t){let n=TP(kP(e),`.${process.pid}-${Date.now()}-${Math.random().toString(36).slice(2,8)}.tmp`),r=$P(n,"w");try{wP(r,t),IP(r)}finally{bP(r)}try{kd(n,e)}catch(o){let s=o.code;if(s!=="EPERM"&&s!=="EBUSY"&&s!=="EACCES")throw Lu(n,{force:!0}),o;Lu(e,{force:!0});try{kd(n,e)}catch(a){throw Lu(n,{force:!0}),a}}}var zn=m(()=>{});var Rd={};Ft(Rd,{DEFAULT_CONTEXT_WINDOW:()=>Sd,HOWTOFIX_BASE_URL:()=>ai,HOWTOFIX_CONSOLE_URL:()=>mi,HOWTOFIX_MODEL_COMPAT:()=>Du,HOWTOFIX_PROVIDERS:()=>ju,HTTP_IDLE_TIMEOUT_MS:()=>vd,applyCompat:()=>ci,checkAccount:()=>Ku,countNewModels:()=>qu,ensureGatewaySettings:()=>PP,isHowtofixProvider:()=>qo,looksLikeToken:()=>Nu,maskToken:()=>ui,mergeModels:()=>_u,newProviderEntry:()=>Fu,parseModelIds:()=>Pd,probeModel:()=>Uu,repairGatewayModels:()=>SP});import{existsSync as EP,mkdirSync as vP,readFileSync as Td}from"node:fs";import{join as Ed}from"node:path";function Fu(){return{baseUrl:ai,api:"openai-completions"}}function SP(e){let t=Ed(e,"models.json"),n;try{n=JSON.parse(Td(t,"utf8"))}catch{return 0}let r=n.providers;if(!r||typeof r!="object")return 0;let o=0;for(let s of ju){let a=r[s];if(!a||!Array.isArray(a.models))continue;let c=ci(a.models);c.changed!==0&&(a.models=c.models,o+=c.changed)}if(o===0)return 0;try{Ze(t,`${JSON.stringify(n,null,2)}
|
|
7
7
|
`)}catch{return 0}return o}function PP(e){let t=Ed(e,"settings.json"),n={};try{let r=Td(t,"utf8"),o=JSON.parse(r);o&&typeof o=="object"&&!Array.isArray(o)&&(n=o)}catch{if(EP(t))return!1}if("httpIdleTimeoutMs"in n)return!1;n.httpIdleTimeoutMs=vd;try{vP(e,{recursive:!0}),Ze(t,`${JSON.stringify(n,null,2)}
|
|
@@ -111,7 +111,7 @@ ${p.result??""}`).join(`
|
|
|
111
111
|
`).filter(c=>c.length>0).slice(0,iu);let r=Bl(t),s=(typeof r.output=="string"?r.output:Wl(t).replace(/\n*Command exited with code \d+\s*$/,"")).trimEnd().split(`
|
|
112
112
|
`),a=s.slice(0,iu);return s.length>iu&&a.push(`\u2026 ${s.length-iu} more line(s)`),a}var rS,Ul,Kl,ql,iu,zl=m(()=>{zs();rS="\u25CF",Ul="\u2514",Kl="\u22EF",ql=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"];iu=400});import{Markdown as AF,wrapTextWithAnsi as OF}from"@earendil-works/pi-tui";function mS(e){return typeof e=="string"?e:e.map(t=>t.type==="text"?t.text:t.type==="thinking"?"":t.type==="image"?"[image]":(t.type==="toolCall","")).filter(Boolean).join("")}function MF(e){return e.content.filter(t=>t.type==="toolCall").map(t=>({name:t.name,arguments:t.arguments}))}function uu(e){let t=[];for(let n of e)if(n.role==="user"){let r=mS(n.content).trim();if(!r)continue;t.push({id:`u-${n.timestamp}`,kind:"user",title:"you",body:r})}else if(n.role==="assistant"){let r=mS(n.content).trim(),o=MF(n);r?t.push({id:`a-${n.timestamp}`,kind:n.stopReason==="error"?"error":"assistant",title:n.errorMessage?"failed":"fix",body:n.errorMessage?`${n.errorMessage}
|
|
113
113
|
|
|
114
|
-
${r}`:r}):n.errorMessage&&t.push({id:`e-${n.timestamp}`,kind:"error",title:"failed",body:n.errorMessage}),o.forEach((s,a)=>{t.push({id:`c-${n.timestamp}-${a}`,kind:"tool",title:"tool",body:Co(s.name,s.arguments)})})}else n.role==="toolResult"&&t.push({id:`r-${n.toolCallId}`,kind:"result",title:n.toolName,body:au(n.toolName,{content:n.content},n.isError)});return t}function uS(e,t,n){return OF(e,Math.max(8,t)).map(r=>Q(r,n))}function CF(e){let t=e.body||" ",n=Ys.get(e.id);if(n)return n.text!==t&&(n.component.setText(t),n.text=t),n.component;let r=new AF(t,0,0,dv);return Ys.set(e.id,{text:t,component:r}),r}var Ys,Hl,mu,cS=m(()=>{jl();Gs();zl();Ys=new Map;Hl=class{constructor(t){this.item=t}item;invalidate(){}shade(t){let n=Date.now()-(this.item.born??0);return Hs(D.dim,t,Kv(n,Cl))}render(t){let n=this.item.body;if(this.item.kind==="user")return["",...uS(`> ${n}`,t,this.shade(D.user))];if(this.item.kind==="tool")return[Q(n,this.shade(D.tool))];if(this.item.kind==="result"){let o=n.startsWith("exit ")&&n!=="exit 0";if(this.item.panel)return["",...this.item.panel(t),...n?[Q(` ${Ul} ${n}`,o?D.bad:D.mute)]:[]];let s=[];this.item.call&&s.push(Q(this.item.call,this.shade(D.tool)));let a=` ${Ul} ${n}`;if(s.push(Q(a,o?D.bad:this.shade(D.mute))),this.item.expanded===!0&&(this.item.full?.length??0)>0){let I=Q(` ${this.item.full.length} line(s) \xB7 ctrl+e to collapse`,D.dim);s.push(Q(` ${Kl}`,D.dim));for(let w of this.item.full){let M=w.startsWith("+")?D.tool:w.startsWith("-")?D.bad:D.dim;s.push(Q(` ${w}`,M))}return s.push(I),s}let p=this.item.detail??[],f=Ll(Date.now()-(this.item.born??0),p.length);for(let I of p.slice(0,f)){let w=I.startsWith("+")?D.tool:I.startsWith("-")?D.bad:D.dim;s.push(Q(` ${I}`,this.shade(w)))}return(this.item.full?.length??0)>0&&s.push(Q(` ${Kl} ${this.item.full.length} line(s) \xB7 ctrl+e to expand`,D.dim)),s}if(this.item.kind==="error"||this.item.kind==="note"){let o=this.item.kind==="error"?D.bad:D.mute;return["",...uS(n,t,this.shade(o))]}return["",...CF(this.item).render(Math.max(8,t-2))]}},mu=class{items=[];status="";scrollOffset=0;viewportHeight=0;invalidate(){}entering(){let t=Date.now();return this.items.some(n=>{if(n.born===void 0)return!1;let r=t-n.born;return Gv(r,Cl)?!0:(n.detail?.length??0)>Ll(r,n.detail?.length??0)})}render(t){if(Ys.size>this.items.length){let o=new Set(this.items.map(s=>s.id));for(let s of Ys.keys())o.has(s)||Ys.delete(s)}let n=[];for(let o of this.items)o.born??=Date.now(),n.push(...new Hl(o).render(t));this.status&&n.push(Q(this.status,D.mute));let r=this.viewportHeight;if(r>0&&n.length>r){let o=n.length-r,s=Math.max(0,Math.min(this.scrollOffset,o));return
|
|
114
|
+
${r}`:r}):n.errorMessage&&t.push({id:`e-${n.timestamp}`,kind:"error",title:"failed",body:n.errorMessage}),o.forEach((s,a)=>{t.push({id:`c-${n.timestamp}-${a}`,kind:"tool",title:"tool",body:Co(s.name,s.arguments)})})}else n.role==="toolResult"&&t.push({id:`r-${n.toolCallId}`,kind:"result",title:n.toolName,body:au(n.toolName,{content:n.content},n.isError)});return t}function uS(e,t,n){return OF(e,Math.max(8,t)).map(r=>Q(r,n))}function CF(e){let t=e.body||" ",n=Ys.get(e.id);if(n)return n.text!==t&&(n.component.setText(t),n.text=t),n.component;let r=new AF(t,0,0,dv);return Ys.set(e.id,{text:t,component:r}),r}var Ys,Hl,mu,cS=m(()=>{jl();Gs();zl();Ys=new Map;Hl=class{constructor(t){this.item=t}item;invalidate(){}shade(t){let n=Date.now()-(this.item.born??0);return Hs(D.dim,t,Kv(n,Cl))}render(t){let n=this.item.body;if(this.item.kind==="user")return["",...uS(`> ${n}`,t,this.shade(D.user))];if(this.item.kind==="tool")return[Q(n,this.shade(D.tool))];if(this.item.kind==="result"){let o=n.startsWith("exit ")&&n!=="exit 0";if(this.item.panel)return["",...this.item.panel(t),...n?[Q(` ${Ul} ${n}`,o?D.bad:D.mute)]:[]];let s=[];this.item.call&&s.push(Q(this.item.call,this.shade(D.tool)));let a=` ${Ul} ${n}`;if(s.push(Q(a,o?D.bad:this.shade(D.mute))),this.item.expanded===!0&&(this.item.full?.length??0)>0){let I=Q(` ${this.item.full.length} line(s) \xB7 ctrl+e to collapse`,D.dim);s.push(Q(` ${Kl}`,D.dim));for(let w of this.item.full){let M=w.startsWith("+")?D.tool:w.startsWith("-")?D.bad:D.dim;s.push(Q(` ${w}`,M))}return s.push(I),s}let p=this.item.detail??[],f=Ll(Date.now()-(this.item.born??0),p.length);for(let I of p.slice(0,f)){let w=I.startsWith("+")?D.tool:I.startsWith("-")?D.bad:D.dim;s.push(Q(` ${I}`,this.shade(w)))}return(this.item.full?.length??0)>0&&s.push(Q(` ${Kl} ${this.item.full.length} line(s) \xB7 ctrl+e to expand`,D.dim)),s}if(this.item.kind==="error"||this.item.kind==="note"){let o=this.item.kind==="error"?D.bad:D.mute;return["",...uS(n,t,this.shade(o))]}return["",...CF(this.item).render(Math.max(8,t-2))]}},mu=class{items=[];status="";scrollOffset=0;viewportHeight=0;invalidate(){}entering(){let t=Date.now();return this.items.some(n=>{if(n.born===void 0)return!1;let r=t-n.born;return Gv(r,Cl)?!0:(n.detail?.length??0)>Ll(r,n.detail?.length??0)})}render(t){if(Ys.size>this.items.length){let o=new Set(this.items.map(s=>s.id));for(let s of Ys.keys())o.has(s)||Ys.delete(s)}let n=[];for(let o of this.items)o.born??=Date.now(),n.push(...new Hl(o).render(t));this.status&&n.push(Q(this.status,D.mute));let r=this.viewportHeight;if(r>0&&n.length>r){let o=n.length-r,s=Math.max(0,Math.min(this.scrollOffset,o));return n.slice(o-s,o-s+r)}return n}}});function ct(e,t){return`${t}${e}${lS}`}function jF(e){return e>=85?LF:e>=70?fS:dS}function gS(e,t,n,r){let o=ct(`[${e}]`,Vl),s=ct(`${FF} ${t}`,jn),a=ct(n,fS),c=r?` ${ct("git:(",pS)}${ct(r.replace(/^git:\(/,"").replace(/\)$/,""),Vl)}${ct(")",pS)}`:"";return`${o}${ct(" \u2502 ",jn)}${s}${ct(" \u2502 ",jn)}${a}${c}`}function hS(e,t,n){if(!t)return e;let r=n===void 0?t:`${t} ${ct(hv(n),jn)}`;return`${ct(r,Vl)} ${ct("\u2502",jn)} ${e}`}function xS(e,t){let n=Number.isFinite(e)?Math.min(100,Math.max(0,e)):0,r=Math.round(n/10),o=jF(n),s=`${o}${"\u2588".repeat(r)}${jn}${"\u2591".repeat(10-r)}${lS}`,a=ct(`${Math.round(n)}%`,o),c=t?`${ct(" \u2502 ",jn)}${t}`:"";return`${ct("Context",jn)} ${s} ${a}${c}`}function yS(e,t,n){let r=n===null?"":ct(` ${n}ms`,jn);return`${ct("Cubence",jn)} ${ct(t?`${t} ${e}`:e,dS)}${r}`}var lS,jn,LF,dS,fS,pS,Vl,FF,Jl=m(()=>{zs();lS="\x1B[0m",jn="\x1B[2m",LF="\x1B[31m",dS="\x1B[32m",fS="\x1B[33m",pS="\x1B[35m",Vl="\x1B[36m";FF="\u2726"});import{mkdirSync as DF,readFileSync as IS}from"node:fs";import{homedir as NF}from"node:os";import{dirname as _F,join as qF}from"node:path";function bS(e){return e/1e6}function KF(){try{let e=JSON.parse(IS(qF(NF(),".claude","settings.json"),"utf8")),t=e.env?.ANTHROPIC_AUTH_TOKEN,n=e.env?.ANTHROPIC_BASE_URL;return!t||!n?void 0:{token:t,baseUrl:n.replace(/\/$/,"")}}catch{return}}function GF(){try{let e=JSON.parse(IS(Yl,"utf8"));return!e.data||typeof e.cachedAt!="number"?void 0:{data:e.data,cachedAt:e.cachedAt}}catch{return}}function Xs(e){let t=`$${e.balanceDollar.toFixed(2)}`,n=e.hasSubscription?`5h $${e.fiveHourUsedDollar.toFixed(2)}/$${e.fiveHourLimitDollar.toFixed(2)} bal`:"";return yS(t,n,e.latencyMs)}async function $S(){let e=GF();if(e&&Date.now()-e.cachedAt<UF)return Xs(e.data);let t=KF();if(!t)return e?Xs(e.data):void 0;let n=Date.now();try{let r=await fetch(`${t.baseUrl}/v1/user/subscription-info`,{headers:{authorization:`Bearer ${t.token}`,accept:"application/json"},signal:AbortSignal.timeout(3e3)});if(!r.ok)return e?Xs(e.data):void 0;let o=await r.json(),s=o.subscription_window?.five_hour?.limit??0,a={balanceDollar:o.normal_balance?.amount_dollar??0,hasSubscription:s>0,fiveHourUsedDollar:bS(o.subscription_window?.five_hour?.used??0),fiveHourLimitDollar:bS(s),latencyMs:Date.now()-n};return DF(_F(Yl),{recursive:!0}),Ze(Yl,JSON.stringify({data:a,cachedAt:Date.now()})),Xs(a)}catch{return e?Xs(e.data):void 0}}var Yl,UF,wS=m(()=>{Dn();Jl();zn();Yl=Ou,UF=18e4});function kS(){return{}}function TS(e,t,n,r=Date.now()){let o={...e};return t==="run"?(n===void 0||n===""?delete o.run:o.run={label:n,since:e.run?.since??r},o):(n===void 0||n===""?delete o[t]:o[t]=n,o)}function WF(e){let t=Math.max(0,Math.round(e/1e3)),n=Math.floor(t/60);return n>0?`${n}m ${String(t%60).padStart(2,"0")}s`:`${t}s`}function ES(e,t,n=Date.now()){return e.prompt?`? ${e.prompt}`:e.note?`* ${e.note}`:e.run?`${t} ${e.run.label} \xB7 ${WF(n-e.run.since)}`:e.tally?e.tally:""}var vS=m(()=>{});import{spawn as BF}from"node:child_process";function zF(e){switch(e){case"darwin":return{command:"open",args:[]};case"win32":return{command:"cmd",args:["/c","start",""]};case"linux":return{command:"xdg-open",args:[]};default:return}}async function SS(e,t=process.platform){let n=zF(t);return n?new Promise(r=>{try{let o=BF(n.command,[...n.args,e],{detached:!0,stdio:"ignore"});o.once("error",()=>r(!1)),o.once("spawn",()=>{o.unref(),r(!0)})}catch{r(!1)}}):!1}var PS=m(()=>{});function HF(e){return[Au,gr(e)]}function RS(e,t){let n=e.trim(),r=/^\/skill:([^\s]+)(?:\s+([\s\S]*))?$/.exec(n)??/^\/skill\s+([^\s]+)(?:\s+([\s\S]*))?$/.exec(n);if(!r)return;let o=r[1]??"";if(!t.includes(o))return;let s=(r[2]??"").trim();return s?`/skill:${o} ${s}`:`/skill:${o}`}function AS(e){if(e.length===0){let[t,n]=HF(process.cwd());return["no skills loaded.",`put a SKILL.md in ${t}`,`or in ${n}`,"invoke with /skill:<name>"].join(`
|
|
115
115
|
`)}return e.map(t=>{let n=t.disableModelInvocation?" (invoke only)":"";return`${t.name}${n}
|
|
116
116
|
${t.description}
|
|
117
117
|
${t.filePath}`}).join(`
|
|
@@ -120,7 +120,7 @@ ${r}`:r}):n.errorMessage&&t.push({id:`e-${n.timestamp}`,kind:"error",title:"fail
|
|
|
120
120
|
`)||"nothing to do"),U()};a(!0),s("session start"),e.note&&r.items.push({id:"note",kind:"note",title:"note",body:e.note}),r.items.push(...uu(T.state.messages)),o.percent=Lo(T),o.abandonAnimations(),o.thinking=T.thinkingLevel,c.setAutocompleteProvider(new BS(Ql(T),e.cwd)),$S().then(l=>{l&&(o.cubence=l,n.requestRender())});let Fn=null,od="",sd=!1,id=[],Do,xu=()=>{},U=()=>{xu(),n.requestRender()},ge=(l,h)=>{o.activity=TS(o.activity,l,h)},ei=new Map,yu=new Set,mP=()=>[...ei].map(([l,h])=>`${yu.has(l)?"!":"\u2713"} ${l} \xD7${h}`).join(" | "),uP=()=>{let l=mP();ge("tally",l||void 0)},Lt=(l,h,b,y,k=!1,_=[])=>{let x=new pD(h,8,HS.selectList);x.onSelect=O=>{Fn=null,Do=void 0,b(O.value)},x.onCancel=()=>{Fn=null,Do=void 0,y?.(),U()},Do=()=>x.onCancel?.(),od=l,sd=k,id=_,Fn=x,U()},P=(l,h)=>{r.items.push({id:`cmd-${Date.now()}-${r.items.length}`,kind:"note",title:l,body:h}),ge("tally",void 0),U()},dn=l=>{r.items.push({id:`err-${Date.now()}-${r.items.length}`,kind:"error",title:"failed",body:l}),ge("tally",void 0),U()};ec((l,h)=>{let{promise:b,resolve:y}=Promise.withResolvers();return Lt(l,[{value:"allow",label:"allow"},{value:"deny",label:"deny"}],k=>y(k==="allow"),()=>y(!1),!0,tP(l,h)),b});let bu=new Map,ad=l=>{let h=KS({select:(b,y)=>{let{promise:k,resolve:_}=Promise.withResolvers();return Lt(b,y.map(x=>({value:x,label:x})),_,()=>_(void 0)),k},confirm:(b,y)=>{let{promise:k,resolve:_}=Promise.withResolvers();return Lt(`${b} \u2014 ${y}`,[{value:"yes",label:"yes"},{value:"no",label:"no"}],x=>_(x==="yes"),()=>_(!1)),k},input:b=>{let{promise:y,resolve:k}=Promise.withResolvers();return ge("prompt",b),U(),pn=_=>{pn=void 0,ge("prompt",void 0),k(_),U()},y},notify:(b,y)=>{y==="error"?dn(b):P("mcp",b)},setStatus:(b,y)=>{y===void 0?bu.delete(b):bu.set(b,y),ge("note",[...bu.values()].join(" | ")||void 0),U()},setWidget:(b,y)=>{f(b,y),U()}});l.bindExtensions({uiContext:h,mode:"print",onError:b=>dn(`${b.event}: ${b.error}`)}).catch(b=>dn(b instanceof Error?b.message:String(b)))};ad(T);let Wr=new aD,cP={invalidate:()=>r.invalidate(),render:l=>{let h=Wr.render(Math.max(20,l)).length;return r.viewportHeight=Math.max(1,Math.max(8,t.rows)-h),r.render(l)},handleMouse:l=>{if(gd(l))return Eu(),{handled:!0};let h=l.type==="wheel"?l.wheelDelta??0:0;if(h!==0)return r.scrollOffset=Math.max(0,r.scrollOffset-h*3),U(),{handled:!0}}},pP=new cD(cP,{follow:"none",overscroll:"contain"}),ti=new dD([{component:pP,grow:1,shrink:1},{component:Wr,grow:0,shrink:0,basis:"auto"}]),md="",lP=()=>`${Fn?"picker":"dock"}|${[...p.keys()].join(",")}`;xu=()=>{let l=lP();if(l===md)return;md=l,Wr.clear();for(let b of p.values())Wr.addChild(new du(b));let h=Fn;if(h){let b=od,y=sd,k=id;Wr.addChild({render:_=>eP(h,b,_,y,k),invalidate:()=>{}})}else Wr.addChild(re);ti.invalidate()},xu();let ud={focused:!1,invalidate(){r.invalidate(),re.invalidate(),Fn?.invalidate(),ti.invalidate()},[ZS]:()=>xD(ti),render:l=>ti.render(l),handleMouse(l){if(gd(l))return Eu(),{handled:!0}},handleInput(l){c.handleInput(l)}};n.setLayoutRoot(ud),n.setFocus(ud);let xt=0,Wn="",Iu=!1,fr=!1,$u,Br="",cd=0,No=!1,ni=Date.now(),ri=!1,oi=new Map,pd=l=>{if(l.type==="agent_start"||l.type==="turn_start")l.type==="agent_start"&&Md(),o.live||o.beginRun(),Wn="",fr=!1,No=!1,ni=Date.now(),Br="";else if(l.type==="message_update"&&l.assistantMessageEvent.type==="thinking_delta"){fr=!0,Br===""&&(cd=Date.now()),Br+=l.assistantMessageEvent.delta;let h=`think-${xt}`,b=r.items.find(k=>k.id===h),y=Br.split(`
|
|
121
121
|
`).slice(-6).join(`
|
|
122
122
|
`);b?b.body=y:r.items.push({id:h,kind:"note",title:"thinking",body:y})}else if(l.type==="message_update"&&l.assistantMessageEvent.type==="thinking_end"){let h=`think-${xt}`,b=r.items.find(y=>y.id===h);if(b){let y=Math.max(1,Math.round((Date.now()-cd)/1e3));b.title="thought",b.body=`${y}s \xB7 ${Br.length} chars of reasoning`}Br=""}else if(l.type==="message_update"&&l.assistantMessageEvent.type==="text_delta"){fr=!0,Wn+=l.assistantMessageEvent.delta;let h=`live-${xt}`,b=r.items.find(y=>y.id===h);b?b.body=Wn:r.items.push({id:h,kind:"assistant",title:"HowToFix",body:Wn})}else if(l.type==="tool_execution_start"){oi.set(l.toolCallId,l.args),fr=!1,No=!1,ni=Date.now();let h=`tool-${l.toolCallId}`,b=Co(l.toolName,l.args),y=r.items.find(k=>k.id===h);if(y?(y.kind="tool",y.title=l.toolName,y.body=b,y.live=!0):r.items.push({id:h,kind:"tool",title:l.toolName,body:b,live:!0}),$u=l.toolName,l.toolName==="task"){let k=Zt.filter(_=>_.status==="queued"||_.status==="running");ge("note",k.map(_=>`${_.agent} ${_.status}`).join(" | ")||"agent running")}}else if(l.type==="tool_execution_update"){let h=nP(l.toolName,l.partialResult);if(h){let b=`tool-${l.toolCallId}`,y=r.items.find(_=>_.id===b);y?y.panel=h:r.items.push({id:b,kind:"tool",title:l.toolName,body:Co(l.toolName,oi.get(l.toolCallId)),panel:h,live:!0});let k=gu(l.toolName,l.partialResult);k&&me!==k.name&&ye(k),U()}}else if(l.type==="tool_execution_end"){o.percent=Lo(T);let h=r.items.find(v=>v.id===`tool-${l.toolCallId}`);h&&(h.live=!1,h.body=Co(l.toolName,oi.get(l.toolCallId))),oi.delete(l.toolCallId),$u=void 0,fr=!0,No=!1,ei.set(l.toolName,(ei.get(l.toolName)??0)+1),l.isError&&yu.add(l.toolName),uP();let b=iS(l.toolName,l.result),y=aS(l.toolName,l.result),k=gu(l.toolName,l.result),_=k?Qs(k):void 0;k&&me!==k.name&&ye(k);let x=r.items.find(v=>v.id===`tool-${l.toolCallId}`),O=au(l.toolName,l.result,l.isError);x?(x.kind="result",x.call=x.body,x.body=O,x.live=!1,b.length>0&&(x.detail=b),y.length>0&&(x.full=y),_&&(x.panel=_)):r.items.push({id:`tool-${l.toolCallId}`,kind:"result",title:l.toolName,body:O,...b.length>0?{detail:b}:{},...y.length>0?{full:y}:{},..._?{panel:_}:{}}),(l.toolName==="bash"||l.toolName==="powershell"||l.toolName==="edit"||l.toolName==="write")&&a()}else if(l.type==="compaction_start"){fr=!0;let h=l.reason==="manual"?"on request":"context is nearly full",b=r.items.find(_=>_.id===`compact-${xt}`),y="compacting context",k=`${h} \xB7 summarizing the older turns`;b?(b.title=y,b.body=k):r.items.push({id:`compact-${xt}`,kind:"note",title:y,body:k,live:!0}),ge("note","compacting context")}else if(l.type==="compaction_end"){let h=r.items.find(_=>_.id===`compact-${xt}`),b=l.result,y="compacted",k;if(l.aborted)k="cancelled";else if(l.errorMessage)k=`failed: ${l.errorMessage}`;else if(b){let _=Math.round(b.tokensBefore/1e3),x=b.estimatedTokensAfter!==void 0?Math.round(b.estimatedTokensAfter/1e3):void 0,O=b.estimatedTokensAfter!==void 0?b.tokensBefore-b.estimatedTokensAfter:void 0,v=O!==void 0&&O<2e3;k=x!==void 0?`${_}k \u2192 ${x}k tokens \xB7 older turns summarized${v?`
|
|
123
|
-
this freed almost nothing \u2014 the window may be too small for this work`:""}`:`${_}k tokens \xB7 older turns summarized`}else k="nothing to compact";h?(h.title=y,h.body=k,h.live=!1):r.items.push({id:`compact-${xt}`,kind:"note",title:y,body:k}),o.percent=Lo(T),ge("note",void 0)}else if(l.type==="message_end"&&l.message.role==="assistant"){let h=r.items.find(b=>b.id===`live-${xt}`);h&&(h.id=`done-${xt}`),xt+=1,Wn="",o.percent=Lo(T)}else if(l.type==="agent_settled"){if(o.live=!1,s(en),en="",ge("run",void 0),Iu){let h=r.items.find(b=>b.id===`live-${xt}`);h?(h.id=`stopped-${xt}`,h.title="stopped",h.body=Wn.trim()||"(no output)",h.live=!1):r.items.push({id:`stopped-${xt}`,kind:"note",title:"stopped",body:"run cancelled"}),xt+=1,Wn="",P("stopped","run cancelled by Esc"),Iu=!1}o.percent=Lo(T),VS(e.cwd).then(h=>{h!==null&&(o.git=h,U())}),c.disableSubmit=!1}else l.type==="thinking_level_changed"?o.thinking=l.level:l.type==="auto_retry_start"&&ge("note",`retry ${l.attempt}/${l.maxAttempts}`);U()},wu=T.subscribe(pd),ld=setInterval(()=>{let l=w!==void 0&&Date.now()<M;if((ri||T.isStreaming||o.settling()||r.entering()||Fn||l)&&U(),(ri||T.isStreaming)&&!fr&&!No&&Date.now()-ni>TD){No=!0;let h=$u,b=Math.round((Date.now()-ni)/1e3);ge("note",h?`${h} has been running for ${b}s \u2014 it may be blocked; esc cancels`:`no answer yet after ${b}s \u2014 the provider may be stalled; ctrl+c cancels`),U()}},kD);ld.unref?.();let dd=async l=>{Do?.(),Do=void 0,wu(),Ut&&tS(Ut,T.getSessionStats().sessionId),jo=void 0,Kt=0,T.dispose(),T=l.session,xt=0,Wn="",r.items=[],l.note&&r.items.push({id:"note",kind:"note",title:"note",body:l.note}),r.items.push(...uu(T.state.messages)),o.model=l.modelLabel.split("/").at(-1)||"no-model",o.thinking=T.thinkingLevel,o.percent=Lo(T),o.abandonAnimations(),ge("tally",void 0),ge("run",void 0),c.setAutocompleteProvider(new BS(Ql(T),e.cwd)),c.disableSubmit=!1,ad(T),wu=T.subscribe(pd),U()},si=()=>{ze||(ze=!0,clearInterval(ld),wu(),T.dispose(),n.stop(),process.stdout.write("\x1B[0m"),process.exit(0))},fd=l=>{r.items.push({id:`you-${Date.now()}`,kind:"user",title:"you",body:l}),ge("tally",void 0),ei.clear(),yu.clear(),ge("run","thinking"),o.beginRun(),U(),c.disableSubmit=!1;let h=Wu(l,e.cwd);en=l,ri=!0;let b=T.isStreaming?T.prompt(h,{streamingBehavior:"steer"}):T.prompt(h);ri=!1,b.catch(y=>dn(y instanceof Error?y.message:String(y)))},ku=l=>{let h=l.trim();if(h){if(pn){let b=pn;pn=void 0,c.setText(""),b(h);return}if(c.setText(""),c.addToHistory(h),h.startsWith("!")){let b=h.slice(1).trim();if(!b)return;r.items.push({id:`sh-${Date.now()}`,kind:"tool",title:"$",body:b}),ge("run","shell"),U(),T.executeBash(b,y=>{ge("run",`shell \xB7 ${y.length} bytes`),U()}).then(y=>{let k=y.output.trim();r.items.push({id:`sh-out-${Date.now()}`,kind:y.exitCode===0?"result":"error",title:`exit ${y.exitCode??"?"}`,body:k||"(no output)"}),ge("tally",void 0),U()}).catch(y=>dn(y instanceof Error?y.message:String(y)));return}if(h.startsWith("/")){fP(h);return}fd(h)}};c.onSubmit=ku;let Tu=0,Eu=()=>{Cv().then(l=>{l.ok?c.insertTextAtCursor(l.text):P("paste",l.reason),U()}).catch(l=>{P("paste",`could not read the clipboard: ${l instanceof Error?l.message:String(l)}`),U()})},gd=l=>Lv()&&l.type==="press"&&l.button==="right";n.addInputListener(l=>{if(qe){if(Mt(l,"escape"))return hu(),{consume:!0};let b=zS(),y=b.matches(l,"tui.select.up"),k=b.matches(l,"tui.select.down");if(y||k){let x=qe.getTreeList().getSelectedNode()?.entry.id,O=Ct(),v=x===void 0?-1:O.indexOf(x);if(y?v===0:v===O.length-1)return U(),{consume:!0}}return qe.handleInput(l),U(),{consume:!0}}if(ee&&A&&Mt(l,"escape"))return xe?(xe=!1,P("workflow","panel keys off \u2014 the editor has the keyboard")):j.expanded?(j.expanded=!1,P("workflow","collapsed the drill-in")):(qt(),P("workflow","panel unpinned; the run is still in the transcript")),Be(),U(),{consume:!0};if(Fn)return Fn.handleInput(l),U(),{consume:!0};if(Mt(l,"escape")){if(T.isStreaming)return Iu=!0,T.abort(),ge("note","stopping"),U(),{consume:!0};let b=Date.now();if(c.getText().length===0&&b-Tu<600)return Tu=0,nd(),{consume:!0};Tu=b;return}if(Mt(l,"ctrl+c"))return T.isStreaming?(T.abort(),ge("note","stopping"),U()):c.getText().length>0?(c.setText(""),ge("note","draft cleared \u2014 ctrl+c again quits"),U()):si(),{consume:!0};if(Mt(l,"ctrl+d")&&c.getText().length===0)return si(),{consume:!0};let h=Math.max(1,r.viewportHeight-1);if(Mt(l,"pageUp"))return r.scrollOffset+=h,U(),{consume:!0};if(Mt(l,"pageDown"))return r.scrollOffset=Math.max(0,r.scrollOffset-h),U(),{consume:!0};if(Mt(l,"home"))return r.scrollOffset=Number.MAX_SAFE_INTEGER,U(),{consume:!0};if(Mt(l,"end"))return r.scrollOffset=0,U(),{consume:!0};if(Mt(l,"ctrl+v"))return Eu(),{consume:!0};if(Mt(l,"ctrl+l"))return r.scrollOffset=0,n.scrollToBottom(),U(),{consume:!0};if(Mt(l,"ctrl+e")){let b=[...r.items].reverse().find(y=>(y.full?.length??0)>0);return b?(b.expanded=b.expanded!==!0,U(),{consume:!0}):(P("expand","nothing to expand in this transcript yet"),{consume:!0})}if(Mt(l,"ctrl+o")&&!T.isStreaming)return r.items=[{id:"cleared",kind:"note",title:"bench",body:"screen cleared. session history is still stored."}],U(),{consume:!0};if(Mt(l,NS)&&ee&&A)return xe=!xe,P("workflow",xe?"panel keys active \u2014 Esc gives the keyboard back":"panel keys off \u2014 the editor has the keyboard"),Be(),U(),{consume:!0};if(xe&&ee&&A){let b=LS(l);if(b){let y=Mo(A,Date.now());if(b==="stop")return q?(q(),q=null,P("workflow","stopping the run \u2014 in-flight agents resolve as null")):P("workflow","the run has already finished"),{consume:!0};if(b==="save"){let k=qS(Te,Mu);return P("workflow",k.ok?`saved ${k.path}`:k.reason),U(),{consume:!0}}return Object.assign(j,jS(j,b,y)),Be(),U(),{consume:!0}}}});let vu=l=>{let h=b=>{ge("prompt",`API key for ${b}. Paste it, then press enter.`),U();let y=pn;pn=k=>{pn=y;let _=k.trim();if(!_){ge("prompt",void 0),U();return}T.modelRuntime.setRuntimeApiKey(b,_).then(()=>P("login",`saved API key for ${b}`),x=>P("login",x instanceof Error?x.message:String(x)))}};if(l){h(l);return}T.modelRuntime.getAvailable().then(b=>{let y=[...new Set(b.map(k=>k.provider))].sort();if(y.length===0){P("login","no providers are configured; pass one explicitly, e.g. /login nrimo");return}Lt("Login",y.map(k=>({value:k,label:k})),h)},b=>P("login",b instanceof Error?b.message:String(b)))},dP=async(l,h)=>{let b=WS(He,"models.json"),y,k=!1;try{y=JSON.parse(nD(b,"utf8"))}catch(Pu){if(!(Pu instanceof Error&&"code"in Pu&&Pu.code==="ENOENT"))return`could not read ${b}; the models were not added`;y={providers:{}},k=!0}(!y.providers||typeof y.providers!="object")&&(y.providers={});let _=y.providers[l];_||(_=Fu(),y.providers[l]=_,k=!0);let x=Array.isArray(_.models)?_.models:[],O=qu(x,h),v=ci(_u(x,h));_.models=v.models;try{tD(He,{recursive:!0}),Ze(b,`${JSON.stringify(y,null,2)}
|
|
123
|
+
this freed almost nothing \u2014 the window may be too small for this work`:""}`:`${_}k tokens \xB7 older turns summarized`}else k="nothing to compact";h?(h.title=y,h.body=k,h.live=!1):r.items.push({id:`compact-${xt}`,kind:"note",title:y,body:k}),o.percent=Lo(T),ge("note",void 0)}else if(l.type==="message_end"&&l.message.role==="assistant"){let h=r.items.find(b=>b.id===`live-${xt}`);h&&(h.id=`done-${xt}`),xt+=1,Wn="",o.percent=Lo(T)}else if(l.type==="agent_settled"){if(o.live=!1,s(en),en="",ge("run",void 0),Iu){let h=r.items.find(b=>b.id===`live-${xt}`);h?(h.id=`stopped-${xt}`,h.title="stopped",h.body=Wn.trim()||"(no output)",h.live=!1):r.items.push({id:`stopped-${xt}`,kind:"note",title:"stopped",body:"run cancelled"}),xt+=1,Wn="",P("stopped","run cancelled by Esc"),Iu=!1}o.percent=Lo(T),VS(e.cwd).then(h=>{h!==null&&(o.git=h,U())}),c.disableSubmit=!1}else l.type==="thinking_level_changed"?o.thinking=l.level:l.type==="auto_retry_start"&&ge("note",`retry ${l.attempt}/${l.maxAttempts}`);U()},wu=T.subscribe(pd),ld=setInterval(()=>{let l=w!==void 0&&Date.now()<M;if((ri||T.isStreaming||o.settling()||r.entering()||Fn||l)&&U(),(ri||T.isStreaming)&&!fr&&!No&&Date.now()-ni>TD){No=!0;let h=$u,b=Math.round((Date.now()-ni)/1e3);ge("note",h?`${h} has been running for ${b}s \u2014 it may be blocked; esc cancels`:`no answer yet after ${b}s \u2014 the provider may be stalled; ctrl+c cancels`),U()}},kD);ld.unref?.();let dd=async l=>{Do?.(),Do=void 0,wu(),Ut&&tS(Ut,T.getSessionStats().sessionId),jo=void 0,Kt=0,T.dispose(),T=l.session,xt=0,Wn="",r.items=[],r.scrollOffset=0,l.note&&r.items.push({id:"note",kind:"note",title:"note",body:l.note}),r.items.push(...uu(T.state.messages)),o.model=l.modelLabel.split("/").at(-1)||"no-model",o.thinking=T.thinkingLevel,o.percent=Lo(T),o.abandonAnimations(),ge("tally",void 0),ge("run",void 0),c.setAutocompleteProvider(new BS(Ql(T),e.cwd)),c.disableSubmit=!1,ad(T),wu=T.subscribe(pd),U()},si=()=>{ze||(ze=!0,clearInterval(ld),wu(),T.dispose(),n.stop(),process.stdout.write("\x1B[0m"),process.exit(0))},fd=l=>{r.items.push({id:`you-${Date.now()}`,kind:"user",title:"you",body:l}),ge("tally",void 0),ei.clear(),yu.clear(),ge("run","thinking"),o.beginRun(),U(),c.disableSubmit=!1;let h=Wu(l,e.cwd);en=l,ri=!0;let b=T.isStreaming?T.prompt(h,{streamingBehavior:"steer"}):T.prompt(h);ri=!1,b.catch(y=>dn(y instanceof Error?y.message:String(y)))},ku=l=>{let h=l.trim();if(h){if(pn){let b=pn;pn=void 0,c.setText(""),b(h);return}if(c.setText(""),c.addToHistory(h),h.startsWith("!")){let b=h.slice(1).trim();if(!b)return;r.items.push({id:`sh-${Date.now()}`,kind:"tool",title:"$",body:b}),ge("run","shell"),U(),T.executeBash(b,y=>{ge("run",`shell \xB7 ${y.length} bytes`),U()}).then(y=>{let k=y.output.trim();r.items.push({id:`sh-out-${Date.now()}`,kind:y.exitCode===0?"result":"error",title:`exit ${y.exitCode??"?"}`,body:k||"(no output)"}),ge("tally",void 0),U()}).catch(y=>dn(y instanceof Error?y.message:String(y)));return}if(h.startsWith("/")){fP(h);return}fd(h)}};c.onSubmit=ku;let Tu=0,Eu=()=>{Cv().then(l=>{l.ok?c.insertTextAtCursor(l.text):P("paste",l.reason),U()}).catch(l=>{P("paste",`could not read the clipboard: ${l instanceof Error?l.message:String(l)}`),U()})},gd=l=>Lv()&&l.type==="press"&&l.button==="right";n.addInputListener(l=>{if(qe){if(Mt(l,"escape"))return hu(),{consume:!0};let b=zS(),y=b.matches(l,"tui.select.up"),k=b.matches(l,"tui.select.down");if(y||k){let x=qe.getTreeList().getSelectedNode()?.entry.id,O=Ct(),v=x===void 0?-1:O.indexOf(x);if(y?v===0:v===O.length-1)return U(),{consume:!0}}return qe.handleInput(l),U(),{consume:!0}}if(ee&&A&&Mt(l,"escape"))return xe?(xe=!1,P("workflow","panel keys off \u2014 the editor has the keyboard")):j.expanded?(j.expanded=!1,P("workflow","collapsed the drill-in")):(qt(),P("workflow","panel unpinned; the run is still in the transcript")),Be(),U(),{consume:!0};if(Fn)return Fn.handleInput(l),U(),{consume:!0};if(Mt(l,"escape")){if(T.isStreaming)return Iu=!0,T.abort(),ge("note","stopping"),U(),{consume:!0};let b=Date.now();if(c.getText().length===0&&b-Tu<600)return Tu=0,nd(),{consume:!0};Tu=b;return}if(Mt(l,"ctrl+c"))return T.isStreaming?(T.abort(),ge("note","stopping"),U()):c.getText().length>0?(c.setText(""),ge("note","draft cleared \u2014 ctrl+c again quits"),U()):si(),{consume:!0};if(Mt(l,"ctrl+d")&&c.getText().length===0)return si(),{consume:!0};let h=Math.max(1,r.viewportHeight-1);if(Mt(l,"pageUp"))return r.scrollOffset+=h,U(),{consume:!0};if(Mt(l,"pageDown"))return r.scrollOffset=Math.max(0,r.scrollOffset-h),U(),{consume:!0};if(Mt(l,"home"))return r.scrollOffset=Number.MAX_SAFE_INTEGER,U(),{consume:!0};if(Mt(l,"end"))return r.scrollOffset=0,U(),{consume:!0};if(Mt(l,"ctrl+v"))return Eu(),{consume:!0};if(Mt(l,"ctrl+l"))return r.scrollOffset=0,n.scrollToBottom(),U(),{consume:!0};if(Mt(l,"ctrl+e")){let b=[...r.items].reverse().find(y=>(y.full?.length??0)>0);return b?(b.expanded=b.expanded!==!0,U(),{consume:!0}):(P("expand","nothing to expand in this transcript yet"),{consume:!0})}if(Mt(l,"ctrl+o")&&!T.isStreaming)return r.items=[{id:"cleared",kind:"note",title:"bench",body:"screen cleared. session history is still stored."}],U(),{consume:!0};if(Mt(l,NS)&&ee&&A)return xe=!xe,P("workflow",xe?"panel keys active \u2014 Esc gives the keyboard back":"panel keys off \u2014 the editor has the keyboard"),Be(),U(),{consume:!0};if(xe&&ee&&A){let b=LS(l);if(b){let y=Mo(A,Date.now());if(b==="stop")return q?(q(),q=null,P("workflow","stopping the run \u2014 in-flight agents resolve as null")):P("workflow","the run has already finished"),{consume:!0};if(b==="save"){let k=qS(Te,Mu);return P("workflow",k.ok?`saved ${k.path}`:k.reason),U(),{consume:!0}}return Object.assign(j,jS(j,b,y)),Be(),U(),{consume:!0}}}});let vu=l=>{let h=b=>{ge("prompt",`API key for ${b}. Paste it, then press enter.`),U();let y=pn;pn=k=>{pn=y;let _=k.trim();if(!_){ge("prompt",void 0),U();return}T.modelRuntime.setRuntimeApiKey(b,_).then(()=>P("login",`saved API key for ${b}`),x=>P("login",x instanceof Error?x.message:String(x)))}};if(l){h(l);return}T.modelRuntime.getAvailable().then(b=>{let y=[...new Set(b.map(k=>k.provider))].sort();if(y.length===0){P("login","no providers are configured; pass one explicitly, e.g. /login nrimo");return}Lt("Login",y.map(k=>({value:k,label:k})),h)},b=>P("login",b instanceof Error?b.message:String(b)))},dP=async(l,h)=>{let b=WS(He,"models.json"),y,k=!1;try{y=JSON.parse(nD(b,"utf8"))}catch(Pu){if(!(Pu instanceof Error&&"code"in Pu&&Pu.code==="ENOENT"))return`could not read ${b}; the models were not added`;y={providers:{}},k=!0}(!y.providers||typeof y.providers!="object")&&(y.providers={});let _=y.providers[l];_||(_=Fu(),y.providers[l]=_,k=!0);let x=Array.isArray(_.models)?_.models:[],O=qu(x,h),v=ci(_u(x,h));_.models=v.models;try{tD(He,{recursive:!0}),Ze(b,`${JSON.stringify(y,null,2)}
|
|
124
124
|
`)}catch{return`could not write ${b}; the models were not added`}let K=!1;try{await T.modelRuntime.refresh(),K=!0}catch{K=!1}let jt=v.changed>0?`, repaired ${v.changed}`:"",yt=K?"":"; restart the CLI to see them all",Bn=k?` (created ${b})`:"";return O===0?`all ${h.length} models were already configured${jt}${Bn}${yt}`:`added ${O} model(s) to "${l}"${jt}${Bn}${yt}`},Su=l=>{(async()=>{if(!l){let x=await SS(mi);P("connect",["connect your howtofix.id account:",` 1. ${x?"the token page is opening in your browser":`open ${mi}`}`," 2. sign in if asked, then create a token (starts with sk-)"," 3. run /connect <token>"," or /connect, and paste the token when asked","","howtofix.id has no OAuth callback for a local client, so the token is","how this CLI signs in. The token is verified before it is stored."].join(`
|
|
125
125
|
`)),U();return}if(!Nu(l)){P("connect","that does not look like a howtofix token; the Console issues tokens that start with sk-");return}ge("note",`connecting to howtofix.id (${ui(l)})`),U();let h=await Ku(l);if(!h.ok){ge("note",void 0),P("connect",h.message),U();return}await T.modelRuntime.setRuntimeApiKey("howtofix",l);let b=await dP("howtofix",h.models),y=!!T.model&&T.model?.provider!==void 0&&o.model!=="unknown",k,_;if(!y)try{let x=(await T.modelRuntime.getAvailable()).filter(K=>qo(K.provider)),v=QS(x.map(K=>K.id)).slice(0,4);for(let K of v){if(!(await Uu(K,l)).ok)continue;let yt=x.find(Bn=>Bn.id===K);if(yt){await T.setModel(yt),o.model=yt.id,k=`${yt.provider}/${yt.id}`;break}}k||(_=v.length>0?`none of the first ${v.length} models answered (${v[0]} did not)`:"the account lists no chat model")}catch(x){_=x instanceof Error?x.message:String(x)}ge("note",void 0),P("connect",[`connected ${ui(l)} \u2014 ${h.message}`,b,k?`using ${k} (change it with /model)`:`pick a model with /model, then send a prompt${_?` (auto-select failed: ${_})`:""}`].join(`
|
|
126
126
|
`)),U()})().catch(h=>{ge("note",void 0),P("connect",h instanceof Error?h.message:String(h)),U()})},fP=async l=>{let[h,...b]=l.slice(1).split(/\s+/),y=b.join(" ");if(h==="quit"||h==="exit"){si();return}if(h==="help"){P("help",Ql(T).map(x=>`/${x.name} ${x.description??""}`).join(`
|