howtofixcli 0.7.15 → 0.7.17
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/{chunk-Y7YM5R75.js → chunk-5Y3G5FLR.js} +1 -1
- package/dist/{chunk-7DTQKDO4.js → chunk-7FD3JD6B.js} +1 -1
- package/dist/{chunk-DV2BBBBJ.js → chunk-AIQOTZSL.js} +1 -1
- package/dist/{chunk-V2RPZMLK.js → chunk-JLDLDP2U.js} +1 -1
- package/dist/{chunk-CPJKKHGH.js → chunk-KPOBCSCA.js} +1 -1
- package/dist/{chunk-LOOFOBTS.js → chunk-OD3QGNZU.js} +1 -1
- package/dist/{chunk-EIBOS5KO.js → chunk-ORFX4QTT.js} +1 -1
- package/dist/{chunk-EYWOVCSS.js → chunk-RC7UG24C.js} +1 -1
- package/dist/{chunk-SX5VE6XA.js → chunk-RYRVZAU6.js} +57 -51
- package/dist/{chunk-UNK5HRQR.js → chunk-SYR3CZ3C.js} +1 -1
- package/dist/{chunk-JMKK26AT.js → chunk-W7KLNX6W.js} +1 -1
- package/dist/chunk-WGBDEDF6.js +34 -0
- package/dist/main.js +5 -5
- package/package.json +1 -1
- package/dist/chunk-HT3MFLAV.js +0 -34
|
@@ -1,64 +1,64 @@
|
|
|
1
|
-
import{b as kr,c as $r}from"./chunk-WX3V5P7U.js";import{a as vr,b as xr}from"./chunk-MOKUBKE7.js";import{a as He}from"./chunk-LSJC73DG.js";import{a as ft,b as dn,c as un,d as Ti,e as pt}from"./chunk-3FYCFLNK.js";import{u as Mi}from"./chunk-WUPU6LTD.js";import{a as Ri}from"./chunk-ORJ2QZBG.js";import{Aa as or,Ba as ir,C as gt,Ca as rr,D as Ki,Da as sr,F as Hi,Fa as ae,Ga as T,Ha as O,I as Bi,Ia as ar,J as Gi,Ja as lr,K as bt,Ka as cr,L as qi,La as dr,M as Vi,Ma as $n,N as zi,Na as ur,O as bn,Oa as fr,Ra as pr,Sa as mr,Ta as hr,U as We,Ua as gr,Va as br,Wa as wr,X as wn,Xa as yr,Z as yn,aa as Ue,c as _i,e as Oi,g as Li,ga as Yi,h as Ni,ha as Ke,ja as wt,n as Di,na as Xi,oa as Ji,qa as Zi,ra as Qi,sa as er,va as tr,w as Wi,y as gn,ya as kn,z as Ui,za as nr}from"./chunk-AUDMRGWF.js";import{a as Ei,c as mt,d as fn,j as Pi,l as pn,m as mn,n as Ii}from"./chunk-JFYVRWJI.js";import{b as ke,c as De,e as Fi,f as hn,g as ji,h as ht}from"./chunk-27TRKD65.js";import{a as ri,b as si}from"./chunk-6FUWMLWO.js";import{A as rn,B as sn,C as ni,D as P,I as oi,J as ii,b as nn,c as at,d as lt,e as Ho,f as Bo,g as Go,h as qo,i as ct,j as Vo,k as on,l as zo,o as ne,p as Yo,q as Xo,t as Jo,u as Zo,v as Qo,w as ei,x as dt,y as ut,z as ti}from"./chunk-V656XVXV.js";import{A as cn,B as wi,b as an,c as ye,d as ci,e as di,h as ui,n as ln,o as fi,q as ie,s as Ae,u as pi,w as mi,x as hi,y as gi,z as bi}from"./chunk-EYWOVCSS.js";import{a as yi,b as ki,c as $i,e as vi,f as xi,g as Si,h as Ci,k as Ai}from"./chunk-DV2BBBBJ.js";import{a as se}from"./chunk-UTYFLLSM.js";import{h as ai,i as li}from"./chunk-JMKK26AT.js";import{a as tn,b as st,e as Ko}from"./chunk-Y7YM5R75.js";import"./chunk-WOT6VMZA.js";import{execFile as El}from"node:child_process";import{promisify as Pl}from"node:util";import{appendFileSync as Il,existsSync as Et,mkdirSync as Us,readFileSync as Gn,rmSync as _l,writeFileSync as qn}from"node:fs";import{basename as Ol,join as le,resolve as Ll}from"node:path";function Sr(e){if(e==="")return!0;let t=/^\x1b\[(\d+);(\d+)u$/.exec(e);if(t&&Number(t[1])===99&&(Number(t[2])&5)!==0)return!0;let n=/^\x1b\[27;(\d+);(\d+)~$/.exec(e);return!!(n&&Number(n[2])===99&&(Number(n[1])&5)!==0)}function Cr(e){let t=!1;process.on("SIGINT",()=>{t||(t=!0,e())})}function ma(e){if(!e||typeof e!="object")return;let t=e;if(!(typeof t.input!="number"&&typeof t.cacheRead!="number"&&typeof t.cacheWrite!="number"))return t}function ha(e){let t=e?.input??0,n=e?.cacheRead??0,i=e?.cacheWrite??0;return{input:t,cacheRead:n,cacheWrite:i,prompt:t+n+i}}function ga(e){if(typeof e!="string")return null;let t=Date.parse(e);return Number.isNaN(t)?null:t}function ba(e){if(!e||typeof e!="object")return;let t=e,i=(t.message&&typeof t.message=="object"?t.message:void 0)??t,s=ma(i.usage);if(!s)return;let u=typeof i.provider=="string"?i.provider:"",f=typeof i.model=="string"?i.model:"";return{usage:s,model:[u,f].filter(Boolean).join("/")}}function Ar(e){let t=0,n=0,i=[],s=0,u=null;for(let h of e){let w=ba(h);if(!w)continue;let{input:S,cacheRead:M,cacheWrite:j,prompt:W}=ha(w.usage);if(W===0)continue;t+=M,n+=S+j;let K=ga(h.timestamp),I=u,H=I?I.at:null;if(I!==null&&M===0&&S>=1e3){let L=K!==null&&H!==null?Math.max(0,K-H):0;i.push({missedTokens:S,idleMs:L,modelChanged:w.model!==""&&I.model!==""&&w.model!==I.model}),s+=S}u={prompt:W,at:K??H??null,model:w.model}}let f=t+n;return{cachedTokens:t,billedTokens:n,hitRate:f>0?t/f*100:null,misses:i,missedTokens:s}}function Tr(e){return e.modelChanged?"model changed, so its cache had to be built":e.idleMs>=3e5?`cache expired after ${Math.round(e.idleMs/1e3)}s idle`:e.idleMs>0?"prompt changed too early in the prefix to hit":"reason not recorded"}import{copyToClipboard as Nl,SessionManager as Fl}from"@netrodev/hxf-coding-agent";import{CombinedAutocompleteProvider as Ks,Container as jl,Editor as Dl,matchesKey as Y,ProcessTerminal as Wl,ScrollView as Ul,KeybindingsManager as qs,setKeybindings as Vs,TUI_KEYBINDINGS as zs,SelectList as Kl,TuiAltScreen as Hl,truncateToWidth as Re,VStack as Bl,visibleWidth as It,wrapTextWithAnsi as Gl}from"@netrodev/hxf-tui";import{spawn as wa}from"node:child_process";function ya(e,t,n=2e3){return new Promise(i=>{let s=!1,u,f=S=>{s||(s=!0,u!==void 0&&clearTimeout(u),i(S))},h;try{h=wa(e,[...t],{stdio:["ignore","pipe","ignore"]})}catch{f({ok:!1,stdout:""});return}u=setTimeout(()=>{h.kill("SIGKILL"),f({ok:!1,stdout:""})},n);let w=[];h.stdout?.on("data",S=>w.push(S)),h.on("error",()=>f({ok:!1,stdout:""})),h.on("close",S=>{f({ok:S===0,stdout:Buffer.concat(w).toString("utf8")})})})}function vn(){return process.env.XDG_SESSION_TYPE==="wayland"||(process.env.WAYLAND_DISPLAY?.length??0)>0}async function ka(){let e=[];process.platform==="darwin"?e.push({command:"pbpaste",args:[]}):process.platform==="win32"?e.push({command:"powershell.exe",args:["-NoProfile","-Command","Get-Clipboard -Raw"]}):(vn()&&(e.push({command:"wl-paste",args:["--no-newline","--type","text/plain;charset=utf-8"]}),e.push({command:"wl-paste",args:["--no-newline","--type","text/plain"]}),e.push({command:"wl-paste",args:["--no-newline"]})),((process.env.DISPLAY?.length??0)>0||!vn())&&(e.push({command:"xclip",args:["-selection","clipboard","-o"]}),e.push({command:"xsel",args:["--clipboard","--output"]})),e.push({command:"termux-clipboard-get",args:[]}));for(let t of e){let n=await ya(t.command,t.args);if(n.ok&&n.stdout.length>0)return n.stdout}}async function Mr(){let e;try{let{getNativeClipboard:i}=await import("@netrodev/hxf-tui");e=i()}catch{e=void 0}if(e)try{let i=await e.getText();if(typeof i=="string"&&i.length>0)return{ok:!0,text:i}}catch{}let t=await ka();return t!==void 0?{ok:!0,text:t}:{ok:!1,reason:`no clipboard tool could read it \u2014 ${vn()?"install wl-clipboard (wl-paste)":process.platform==="darwin"?"pbpaste should be present on macOS":process.platform==="win32"?"Get-Clipboard should be present on Windows":"install xclip or xsel, or run under a display"}`}}import{TreeSelectorComponent as ql,initTheme as Vl}from"@netrodev/hxf-coding-agent";import{getKeybindings as Hs}from"@netrodev/hxf-tui";import{mixColors as $a,parseColor as va,styleText as de}from"@netrodev/hxf-tui";var ue=process.env.HOWTOFIX_NO_MOTION!=="1",xa=45,Rr=5,Er=8,xn=1e4,Pr=6e4,Ir=3,_r=4,Sn=e=>e<0?0:e>1?1:e;function fe(e,t,n){let i=Sn(n);return i>=1?t:i<=0?e:$a(e,t,i)}var yt=class{value;velocity=0;last=Date.now();target;constructor(t,n=t){this.value=t,this.target=n}set(t){this.target=t}get moving(){return Math.abs(this.target-this.value)>.15}snap(t){this.value=t,this.target=t,this.velocity=0,this.last=Date.now()}step(t=Date.now()){let n=Math.max(0,t-this.last),i=Math.min(250,n)/1e3;if(this.last=t,!ue)return this.value=this.target,this.velocity=0,this.value;n>250&&(this.velocity=0);let s=150,u=2*Math.sqrt(s),f=Math.max(1,Math.ceil(i/.008)),h=i/f;for(let w=0;w<f;w+=1)this.velocity+=(this.target-this.value)*s*h-this.velocity*u*h,this.value+=this.velocity*h;return this.moving||(this.value=this.target,this.velocity=0),this.value}};function Cn(e,t,n,i){return!ue||e<=xn?t:e>=Pr?i:fe(n,i,(e-xn)/(Pr-xn))}function Or(e,t){return!ue||t<=0||e<0?1:1-(1-Sn(e/t))**3}function Lr(e,t){return ue&&e>=0&&e<t}var An=260,Sa=45;function Tn(e,t,n=Sa,i=400){return!ue||n<=0||e<0||e>=i?t:Math.min(t,Math.floor(e/n)+1)}function Nr(e,t,n=Date.now(),i=1400){if(!ue||i<=0)return e;let s=n%i/i;return fe(e,t,s<.5?s*2:(1-s)*2)}function Fr(e,t,n){let i=de(e,{fg:t.rest},ae);if(!ue||e.length===0)return i;let s=Sn(n);if(s>=1)return i;let u=t.band??1,f=e.length+_r*2,w=Math.min(f-1,Math.floor(s*f))-_r,S=H=>{let L=Math.abs(H-w);return L>u?0:1-L/(u+1)},M="",j=0,W=null,K=0,I=0;for(let H of e){let L=S(I);W===null?W=L:L!==W&&(M+=de(e.slice(j,K),{fg:fe(t.rest,t.lit,W)},ae),j=K,W=L),K+=H.length,I+=1}return M+de(e.slice(j),{fg:fe(t.rest,t.lit,W??0)},ae)}function jr(e,t,n=Date.now(),i=90){let s=t[0]??va("#e6e6e6");if(t.length===0||e.length===0)return de(e,{fg:s},ae);if(!ue||i<=0)return de(e,{fg:t[t.length-1]??s},ae);let u=t.length*i,f=(n%u+u)%u,h="",w=0,S=null,M=0,j=0,W=K=>{let I=(f+K*i)/u%1*t.length,H=Math.floor(I)%t.length,L=(H+1)%t.length;return fe(t[H]??s,t[L]??s,I-Math.floor(I))};for(let K of e){let I=W(j);S===null?S=I:I!==S&&(h+=de(e.slice(w,M),{fg:S},ae),w=M,S=I),M+=K.length,j+=1}return h+de(e.slice(w),{fg:S??s},ae)}function Ca(e,t){let n=Math.abs(e-t);return n>=Rr?0:Math.ceil((1-n/Rr)*Ir)/Ir}function Dr(e,t,n=Date.now()){let i=t.charMs??xa;if(!ue||e.length===0||i<=0)return de(e,{fg:t.base},ae);let s=e.length+Er*2,u=n/i%s-Er,f=(W,K)=>de(W,{fg:fe(t.base,t.bright,K)},ae),h="",w=0,S=null,M=0,j=0;for(let W of e){let K=Ca(j,u);S===null?S=K:K!==S&&(h+=f(e.slice(w,M),S),w=M,S=K),M+=W.length,j+=1}return h+f(e.slice(w),S??0)}import{Markdown as Ha,wrapTextWithAnsi as Ba}from"@netrodev/hxf-tui";import{homedir as Aa}from"node:os";import{isAbsolute as Ta,relative as Ma,resolve as Ra,sep as Wr}from"node:path";var Ea="\u25CF",En="\u2514",$t="\u22EF",Mn=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"];function qe(e=90){let t=Math.floor(Date.now()/e)%Mn.length;return Mn[t]??Mn[0]}var Pa="\u25B2";var Ia="\u25CB",_a=["create_object","set_properties","delete_object","clone_instance","reparent_instance","set_script_source","edit_script_lines","insert_script_lines","execute_luau","generate_mesh","generate_material","generate_procedural_model"];function Pn(e){return e.includes("__")?e.slice(e.lastIndexOf("__")+2):e}function Br(e){return _a.includes(Pn(e))}function Be(e,t=process.cwd()){if(!e||!Ta(e))return e;let n=Ra(e),i=Ma(t,n);if(i==="")return".";if(i&&!i.startsWith(`..${Wr}`)&&i!=="..")return i;let s=Aa();return s&&(n===s||n.startsWith(s+Wr))?`~${n.slice(s.length)}`:n}function oe(e,t){let n=e.replace(/\s+/g," ").trim();return n.length>t?`${n.slice(0,Math.max(1,t-1))}\u2026`:n}function N(e,t){if(e&&typeof e=="object"){let n=e[t];if(typeof n=="string"&&n.length>0)return n;if(typeof n=="number")return String(n)}}function Oa(e,t=160){if(!e||typeof e!="object")return"";try{let n=JSON.stringify(e);return n&&n!=="{}"?oe(n,t):""}catch{return""}}function La(e,t){switch(e){case"read":{let n=Be(N(t,"path")??""),i=[N(t,"offset"),N(t,"limit")].filter(Boolean);return i.length>0?`${n} ${i.length===1?`offset=${i[0]}`:`offset=${i[0]}, limit=${i[1]}`}`:n}case"edit":case"write":return Be(N(t,"path")??"");case"bash":case"powershell":{let n=N(t,"command")??"";return t?.run_in_background===!0?`${n} [background]`:n}case"bash_output":{let n=N(t,"task_id"),i=N(t,"filter");return n?i?`${n} filter=${i}`:n:"all tasks"}case"kill_shell":return N(t,"task_id")??"";case"compress":{let n=N(t,"topic")??"",i=Array.isArray(t.content)?t.content.length:0;return i>1?`${n} (${i} ranges)`:n}case"grep":{let n=N(t,"pattern")??"",i=N(t,"path");return i?`${n} in ${Be(i)}`:n}case"find":case"glob":{let n=N(t,"pattern")??N(t,"glob")??"",i=N(t,"path");return i?`${n} in ${Be(i)}`:n}case"ls":return Be(N(t,"path")??".");case"task":return N(t,"agent")??"task";case"ask":return N(t,"question")??"";case"web_search":return N(t,"query")??"";case"web_fetch":return N(t,"url")??"";case"lsp":{let n=N(t,"action")??"lsp",i=N(t,"file")??"",s=N(t,"line");return s?`${n} ${i}:${s}`:`${n} ${i}`}case"quality":return N(t,"path")??"changed files";case"think":return"private";case"todo":{let n=N(t,"op")??"view",i=N(t,"task"),s=t?.items;return n==="init"&&Array.isArray(s)?`init ${s.length} task${s.length===1?"":"s"}`:i?`${n} ${i}`:n}case"context":{let n=N(t,"op")??"list",i=N(t,"key");return i?`${n} ${i}`:n}case"workflow":{let n=N(t,"path");if(n)return n;let i=N(t,"code")??"",s=/export\s+const\s+meta\s*=\s*\{[\s\S]*?name\s*:\s*["'`]([^"'`]+)/.exec(i)?.[1];if(s)return s;let u=i.trim().split(`
|
|
2
|
-
`)[0]??"";return u.length>40?`${u.slice(0,40)}\u2026`:u}default:return Oa(t)}}function $e(e,t,n=100){let
|
|
3
|
-
`))
|
|
4
|
-
`).find(t=>t.trim())??""}function ja(e,t){let n=typeof e.output=="string"?e.output:t.replace(/\n*Command exited with code \d+\s*$/,""),
|
|
5
|
-
`).length:0}function Hr(e){return e<1e3?`${e} tokens`:`${(e/1e3).toFixed(1)}k tokens`}function vt(e,t,n){let
|
|
6
|
-
`).find(w=>w.trim());return oe(h??"failed",120)}if(Br(e)){let f=Fa(t);if(f)return f;let h=Pn(e);return h==="execute_luau"?"ran":oe(h.replace(/_/g," "),120)}switch(e){case"task":{let f=
|
|
7
|
-
`).filter(h=>h.startsWith("## ")).map(h=>h.replace(/^##\s*/,"").trim());if(f.length===0){let h=
|
|
1
|
+
import{b as kr,c as $r}from"./chunk-WX3V5P7U.js";import{a as vr,b as xr}from"./chunk-MOKUBKE7.js";import{a as He}from"./chunk-LSJC73DG.js";import{a as ft,b as dn,c as un,d as Ts,e as pt}from"./chunk-3FYCFLNK.js";import{u as Ms}from"./chunk-WUPU6LTD.js";import{a as Rs}from"./chunk-ORJ2QZBG.js";import{Aa as or,Ba as sr,C as gt,Ca as rr,D as Ks,Da as ir,F as Hs,Fa as ae,Ga as T,Ha as O,I as Bs,Ia as ar,J as Gs,Ja as lr,K as bt,Ka as cr,L as qs,La as dr,M as Vs,Ma as $n,N as zs,Na as ur,O as bn,Oa as fr,Ra as pr,Sa as mr,Ta as hr,U as We,Ua as gr,Va as br,Wa as wr,X as wn,Xa as yr,Z as yn,aa as Ue,c as _s,e as Os,g as Ls,ga as Ys,h as Ns,ha as Ke,ja as wt,n as Ds,na as Xs,oa as Js,qa as Zs,ra as Qs,sa as er,va as tr,w as Ws,y as gn,ya as kn,z as Us,za as nr}from"./chunk-AUDMRGWF.js";import{a as Es,c as mt,d as fn,j as Ps,l as pn,m as mn,n as Is}from"./chunk-JFYVRWJI.js";import{b as ke,c as De,e as Fs,f as hn,g as js,h as ht}from"./chunk-27TRKD65.js";import{a as rs,b as is}from"./chunk-6FUWMLWO.js";import{A as sn,B as rn,C as ns,D as P,I as os,J as ss,b as nn,c as at,d as lt,e as Ho,f as Bo,g as Go,h as qo,i as ct,j as Vo,k as on,l as zo,o as ne,p as Yo,q as Xo,t as Jo,u as Zo,v as Qo,w as es,x as dt,y as ut,z as ts}from"./chunk-V656XVXV.js";import{A as cn,B as ws,b as an,c as ye,d as cs,e as ds,h as us,n as ln,o as fs,q as se,s as Ae,u as ps,w as ms,x as hs,y as gs,z as bs}from"./chunk-RC7UG24C.js";import{a as ys,b as ks,c as $s,e as vs,f as xs,g as Ss,h as Cs,k as As}from"./chunk-AIQOTZSL.js";import{a as ie}from"./chunk-UTYFLLSM.js";import{h as as,i as ls}from"./chunk-W7KLNX6W.js";import{a as tn,b as it,e as Ko}from"./chunk-5Y3G5FLR.js";import"./chunk-WOT6VMZA.js";import{execFile as El}from"node:child_process";import{promisify as Pl}from"node:util";import{appendFileSync as Il,existsSync as Et,mkdirSync as Ui,readFileSync as Gn,rmSync as _l,writeFileSync as qn}from"node:fs";import{basename as Ol,join as le,resolve as Ll}from"node:path";function Sr(e){if(e==="")return!0;let t=/^\x1b\[(\d+);(\d+)u$/.exec(e);if(t&&Number(t[1])===99&&(Number(t[2])&5)!==0)return!0;let n=/^\x1b\[27;(\d+);(\d+)~$/.exec(e);return!!(n&&Number(n[2])===99&&(Number(n[1])&5)!==0)}function Cr(e){let t=!1;process.on("SIGINT",()=>{t||(t=!0,e())})}function ma(e){if(!e||typeof e!="object")return;let t=e;if(!(typeof t.input!="number"&&typeof t.cacheRead!="number"&&typeof t.cacheWrite!="number"))return t}function ha(e){let t=e?.input??0,n=e?.cacheRead??0,s=e?.cacheWrite??0;return{input:t,cacheRead:n,cacheWrite:s,prompt:t+n+s}}function ga(e){if(typeof e!="string")return null;let t=Date.parse(e);return Number.isNaN(t)?null:t}function ba(e){if(!e||typeof e!="object")return;let t=e,s=(t.message&&typeof t.message=="object"?t.message:void 0)??t,i=ma(s.usage);if(!i)return;let u=typeof s.provider=="string"?s.provider:"",f=typeof s.model=="string"?s.model:"";return{usage:i,model:[u,f].filter(Boolean).join("/")}}function Ar(e){let t=0,n=0,s=[],i=0,u=null;for(let h of e){let w=ba(h);if(!w)continue;let{input:S,cacheRead:M,cacheWrite:j,prompt:W}=ha(w.usage);if(W===0)continue;t+=M,n+=S+j;let K=ga(h.timestamp),I=u,H=I?I.at:null;if(I!==null&&M===0&&S>=1e3){let L=K!==null&&H!==null?Math.max(0,K-H):0;s.push({missedTokens:S,idleMs:L,modelChanged:w.model!==""&&I.model!==""&&w.model!==I.model}),i+=S}u={prompt:W,at:K??H??null,model:w.model}}let f=t+n;return{cachedTokens:t,billedTokens:n,hitRate:f>0?t/f*100:null,misses:s,missedTokens:i}}function Tr(e){return e.modelChanged?"model changed, so its cache had to be built":e.idleMs>=3e5?`cache expired after ${Math.round(e.idleMs/1e3)}s idle`:e.idleMs>0?"prompt changed too early in the prefix to hit":"reason not recorded"}import{copyToClipboard as Nl,ProjectTrustStore as Fl,SessionManager as jl}from"@netrodev/hxf-coding-agent";import{CombinedAutocompleteProvider as Ki,Container as Dl,Editor as Wl,matchesKey as Y,ProcessTerminal as Ul,ScrollView as Kl,KeybindingsManager as qi,setKeybindings as Vi,TUI_KEYBINDINGS as zi,SelectList as Hl,TuiAltScreen as Bl,truncateToWidth as Re,VStack as Gl,visibleWidth as It,wrapTextWithAnsi as ql}from"@netrodev/hxf-tui";import{spawn as wa}from"node:child_process";function ya(e,t,n=2e3){return new Promise(s=>{let i=!1,u,f=S=>{i||(i=!0,u!==void 0&&clearTimeout(u),s(S))},h;try{h=wa(e,[...t],{stdio:["ignore","pipe","ignore"]})}catch{f({ok:!1,stdout:""});return}u=setTimeout(()=>{h.kill("SIGKILL"),f({ok:!1,stdout:""})},n);let w=[];h.stdout?.on("data",S=>w.push(S)),h.on("error",()=>f({ok:!1,stdout:""})),h.on("close",S=>{f({ok:S===0,stdout:Buffer.concat(w).toString("utf8")})})})}function vn(){return process.env.XDG_SESSION_TYPE==="wayland"||(process.env.WAYLAND_DISPLAY?.length??0)>0}async function ka(){let e=[];process.platform==="darwin"?e.push({command:"pbpaste",args:[]}):process.platform==="win32"?e.push({command:"powershell.exe",args:["-NoProfile","-Command","Get-Clipboard -Raw"]}):(vn()&&(e.push({command:"wl-paste",args:["--no-newline","--type","text/plain;charset=utf-8"]}),e.push({command:"wl-paste",args:["--no-newline","--type","text/plain"]}),e.push({command:"wl-paste",args:["--no-newline"]})),((process.env.DISPLAY?.length??0)>0||!vn())&&(e.push({command:"xclip",args:["-selection","clipboard","-o"]}),e.push({command:"xsel",args:["--clipboard","--output"]})),e.push({command:"termux-clipboard-get",args:[]}));for(let t of e){let n=await ya(t.command,t.args);if(n.ok&&n.stdout.length>0)return n.stdout}}async function Mr(){let e;try{let{getNativeClipboard:s}=await import("@netrodev/hxf-tui");e=s()}catch{e=void 0}if(e)try{let s=await e.getText();if(typeof s=="string"&&s.length>0)return{ok:!0,text:s}}catch{}let t=await ka();return t!==void 0?{ok:!0,text:t}:{ok:!1,reason:`no clipboard tool could read it \u2014 ${vn()?"install wl-clipboard (wl-paste)":process.platform==="darwin"?"pbpaste should be present on macOS":process.platform==="win32"?"Get-Clipboard should be present on Windows":"install xclip or xsel, or run under a display"}`}}import{TreeSelectorComponent as Vl,initTheme as zl}from"@netrodev/hxf-coding-agent";import{getKeybindings as Hi}from"@netrodev/hxf-tui";import{mixColors as $a,parseColor as va,styleText as de}from"@netrodev/hxf-tui";var ue=process.env.HOWTOFIX_NO_MOTION!=="1",xa=45,Rr=5,Er=8,xn=1e4,Pr=6e4,Ir=3,_r=4,Sn=e=>e<0?0:e>1?1:e;function fe(e,t,n){let s=Sn(n);return s>=1?t:s<=0?e:$a(e,t,s)}var yt=class{value;velocity=0;last=Date.now();target;constructor(t,n=t){this.value=t,this.target=n}set(t){this.target=t}get moving(){return Math.abs(this.target-this.value)>.15}snap(t){this.value=t,this.target=t,this.velocity=0,this.last=Date.now()}step(t=Date.now()){let n=Math.max(0,t-this.last),s=Math.min(250,n)/1e3;if(this.last=t,!ue)return this.value=this.target,this.velocity=0,this.value;n>250&&(this.velocity=0);let i=150,u=2*Math.sqrt(i),f=Math.max(1,Math.ceil(s/.008)),h=s/f;for(let w=0;w<f;w+=1)this.velocity+=(this.target-this.value)*i*h-this.velocity*u*h,this.value+=this.velocity*h;return this.moving||(this.value=this.target,this.velocity=0),this.value}};function Cn(e,t,n,s){return!ue||e<=xn?t:e>=Pr?s:fe(n,s,(e-xn)/(Pr-xn))}function Or(e,t){return!ue||t<=0||e<0?1:1-(1-Sn(e/t))**3}function Lr(e,t){return ue&&e>=0&&e<t}var An=260,Sa=45;function Tn(e,t,n=Sa,s=400){return!ue||n<=0||e<0||e>=s?t:Math.min(t,Math.floor(e/n)+1)}function Nr(e,t,n=Date.now(),s=1400){if(!ue||s<=0)return e;let i=n%s/s;return fe(e,t,i<.5?i*2:(1-i)*2)}function Fr(e,t,n){let s=de(e,{fg:t.rest},ae);if(!ue||e.length===0)return s;let i=Sn(n);if(i>=1)return s;let u=t.band??1,f=e.length+_r*2,w=Math.min(f-1,Math.floor(i*f))-_r,S=H=>{let L=Math.abs(H-w);return L>u?0:1-L/(u+1)},M="",j=0,W=null,K=0,I=0;for(let H of e){let L=S(I);W===null?W=L:L!==W&&(M+=de(e.slice(j,K),{fg:fe(t.rest,t.lit,W)},ae),j=K,W=L),K+=H.length,I+=1}return M+de(e.slice(j),{fg:fe(t.rest,t.lit,W??0)},ae)}function jr(e,t,n=Date.now(),s=90){let i=t[0]??va("#e6e6e6");if(t.length===0||e.length===0)return de(e,{fg:i},ae);if(!ue||s<=0)return de(e,{fg:t[t.length-1]??i},ae);let u=t.length*s,f=(n%u+u)%u,h="",w=0,S=null,M=0,j=0,W=K=>{let I=(f+K*s)/u%1*t.length,H=Math.floor(I)%t.length,L=(H+1)%t.length;return fe(t[H]??i,t[L]??i,I-Math.floor(I))};for(let K of e){let I=W(j);S===null?S=I:I!==S&&(h+=de(e.slice(w,M),{fg:S},ae),w=M,S=I),M+=K.length,j+=1}return h+de(e.slice(w),{fg:S??i},ae)}function Ca(e,t){let n=Math.abs(e-t);return n>=Rr?0:Math.ceil((1-n/Rr)*Ir)/Ir}function Dr(e,t,n=Date.now()){let s=t.charMs??xa;if(!ue||e.length===0||s<=0)return de(e,{fg:t.base},ae);let i=e.length+Er*2,u=n/s%i-Er,f=(W,K)=>de(W,{fg:fe(t.base,t.bright,K)},ae),h="",w=0,S=null,M=0,j=0;for(let W of e){let K=Ca(j,u);S===null?S=K:K!==S&&(h+=f(e.slice(w,M),S),w=M,S=K),M+=W.length,j+=1}return h+f(e.slice(w),S??0)}import{Markdown as Ha,wrapTextWithAnsi as Ba}from"@netrodev/hxf-tui";import{homedir as Aa}from"node:os";import{isAbsolute as Ta,relative as Ma,resolve as Ra,sep as Wr}from"node:path";var Ea="\u25CF",En="\u2514",$t="\u22EF",Mn=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"];function qe(e=90){let t=Math.floor(Date.now()/e)%Mn.length;return Mn[t]??Mn[0]}var Pa="\u25B2";var Ia="\u25CB",_a=["create_object","set_properties","delete_object","clone_instance","reparent_instance","set_script_source","edit_script_lines","insert_script_lines","execute_luau","generate_mesh","generate_material","generate_procedural_model"];function Pn(e){return e.includes("__")?e.slice(e.lastIndexOf("__")+2):e}function Br(e){return _a.includes(Pn(e))}function Be(e,t=process.cwd()){if(!e||!Ta(e))return e;let n=Ra(e),s=Ma(t,n);if(s==="")return".";if(s&&!s.startsWith(`..${Wr}`)&&s!=="..")return s;let i=Aa();return i&&(n===i||n.startsWith(i+Wr))?`~${n.slice(i.length)}`:n}function oe(e,t){let n=e.replace(/\s+/g," ").trim();return n.length>t?`${n.slice(0,Math.max(1,t-1))}\u2026`:n}function N(e,t){if(e&&typeof e=="object"){let n=e[t];if(typeof n=="string"&&n.length>0)return n;if(typeof n=="number")return String(n)}}function Oa(e,t=160){if(!e||typeof e!="object")return"";try{let n=JSON.stringify(e);return n&&n!=="{}"?oe(n,t):""}catch{return""}}function La(e,t){switch(e){case"read":{let n=Be(N(t,"path")??""),s=[N(t,"offset"),N(t,"limit")].filter(Boolean);return s.length>0?`${n} ${s.length===1?`offset=${s[0]}`:`offset=${s[0]}, limit=${s[1]}`}`:n}case"edit":case"write":return Be(N(t,"path")??"");case"bash":case"powershell":{let n=N(t,"command")??"";return t?.run_in_background===!0?`${n} [background]`:n}case"bash_output":{let n=N(t,"task_id"),s=N(t,"filter");return n?s?`${n} filter=${s}`:n:"all tasks"}case"kill_shell":return N(t,"task_id")??"";case"compress":{let n=N(t,"topic")??"",s=Array.isArray(t.content)?t.content.length:0;return s>1?`${n} (${s} ranges)`:n}case"grep":{let n=N(t,"pattern")??"",s=N(t,"path");return s?`${n} in ${Be(s)}`:n}case"find":case"glob":{let n=N(t,"pattern")??N(t,"glob")??"",s=N(t,"path");return s?`${n} in ${Be(s)}`:n}case"ls":return Be(N(t,"path")??".");case"task":return N(t,"agent")??"task";case"ask":return N(t,"question")??"";case"web_search":return N(t,"query")??"";case"web_fetch":return N(t,"url")??"";case"lsp":{let n=N(t,"action")??"lsp",s=N(t,"file")??"",i=N(t,"line");return i?`${n} ${s}:${i}`:`${n} ${s}`}case"quality":return N(t,"path")??"changed files";case"think":return"private";case"todo":{let n=N(t,"op")??"view",s=N(t,"task"),i=t?.items;return n==="init"&&Array.isArray(i)?`init ${i.length} task${i.length===1?"":"s"}`:s?`${n} ${s}`:n}case"context":{let n=N(t,"op")??"list",s=N(t,"key");return s?`${n} ${s}`:n}case"workflow":{let n=N(t,"path");if(n)return n;let s=N(t,"code")??"",i=/export\s+const\s+meta\s*=\s*\{[\s\S]*?name\s*:\s*["'`]([^"'`]+)/.exec(s)?.[1];if(i)return i;let u=s.trim().split(`
|
|
2
|
+
`)[0]??"";return u.length>40?`${u.slice(0,40)}\u2026`:u}default:return Oa(t)}}function $e(e,t,n=100){let s=Pn(e),u=s!==e?s:s.charAt(0).toUpperCase()+s.slice(1),f=Br(e)?Pa:Ea,h=oe(La(s,t),n);return h?`${f} ${u}(${h})`:`${f} ${u}`}function Na(e){let t=0,n=0;for(let s of e.split(`
|
|
3
|
+
`))s.startsWith("+")&&!s.startsWith("+++")?t+=1:s.startsWith("-")&&!s.startsWith("---")&&(n+=1);return{additions:t,removals:n}}function Te(e){let t=e?.content;return typeof t=="string"?t:Array.isArray(t)?t.map(n=>n&&typeof n=="object"&&n.type==="text"?String(n.text??""):"").join(""):""}function Ve(e){let t=e?.details;return t&&typeof t=="object"?t:{}}function In(e){let t=e?.structuredContent;return t&&typeof t=="object"?t:{}}function Ur(e){let t=e.exit_code;return typeof t=="number"&&Number.isFinite(t)?t:void 0}function Fa(e){let t=[];if(e&&typeof e=="object"){t.push(e);let s=e.content;if(Array.isArray(s))for(let i of s){let u=i?.text;if(typeof u=="string")try{let f=JSON.parse(u);f&&typeof f=="object"&&t.push(f)}catch{}}}let n=[];for(let s of t){let i=["instances","instanceCount","count","parts","partsCreated"].map(w=>s[w]).find(w=>typeof w=="number"&&Number.isFinite(w));typeof i=="number"&&n.push(`${i} instance${i===1?"":"s"}`);let u=Rn(s,["files","written","paths"]);u&&n.push(u.join(", "));let f=Rn(s,["images","renders","screenshots"]);f&&n.push(`renders ${Ia} ${f.join(", ")}`);let h=Rn(s,["findings","warnings","errors"]);if(h&&n.push(`${h.length} finding${h.length===1?"":"s"}`),n.length>0)break}return n.length>0?n.join(" \xB7 "):void 0}function Rn(e,t){for(let n of t){let s=e[n];if(!Array.isArray(s))continue;let i=s.filter(u=>typeof u=="string"&&u!=="");if(i.length>0)return i}}function Kr(e){return e.trim().split(`
|
|
4
|
+
`).find(t=>t.trim())??""}function ja(e,t){let n=typeof e.output=="string"?e.output:t.replace(/\n*Command exited with code \d+\s*$/,""),s=Ge(n);return s>0?` (${s} line${s===1?"":"s"})`:""}function Da(e,t,n){return e===1?t:n}function Ge(e){let t=e.trim();return t?t.split(`
|
|
5
|
+
`).length:0}function Hr(e){return e<1e3?`${e} tokens`:`${(e/1e3).toFixed(1)}k tokens`}function vt(e,t,n){let s=Te(t),i=Ve(t),u=In(t);if(n){let f=Ur(u);if(f!==void 0&&(e==="bash"||e==="powershell"))return`exit ${f}`;let h=s.trim().split(`
|
|
6
|
+
`).find(w=>w.trim());return oe(h??"failed",120)}if(Br(e)){let f=Fa(t);if(f)return f;let h=Pn(e);return h==="execute_luau"?"ran":oe(h.replace(/_/g," "),120)}switch(e){case"task":{let f=s.split(`
|
|
7
|
+
`).filter(h=>h.startsWith("## ")).map(h=>h.replace(/^##\s*/,"").trim());if(f.length===0){let h=s.trim().split(`
|
|
8
8
|
`).find(w=>w.trim());return oe(h??"done",120)}return f.map(h=>oe(h,120)).join(`
|
|
9
|
-
`)}case"read":{let f=
|
|
10
|
-
`)[0]??"",h=/running/.test(f)?"running":/finished/.test(f)?"finished":"task",w=
|
|
11
|
-
`).slice(2).filter(S=>S.trim()).length;return w===0?h:`${h} \xB7 ${w} line${w===1?"":"s"}`}case"kill_shell":{let f=
|
|
12
|
-
`)[0]??"";return f.startsWith("Stopped")?"stopped":oe(f,120)}default:{let f=
|
|
9
|
+
`)}case"read":{let f=i.truncation,h=Ge(s.replace(/\n*\[[^\]]*\]\s*$/,"")),w=h===0?"empty":`${h} line${h===1?"":"s"}`;return f?.truncated?`${w} (truncated from ${f.totalLines??"?"})`:w}case"compress":{let f=Array.isArray(i.blockIds)?i.blockIds:[],h=typeof i.compressedTokens=="number"?i.compressedTokens:0,w=typeof i.summaryTokens=="number"?i.summaryTokens:0,S=f.length===1?`b${String(f[0])}`:`${f.length} blocks`;if(h===0)return S;let M=h-w;return M<0?`${S} \xB7 ${Hr(-M)} LARGER than the range`:`${S} \xB7 ${Hr(M)} saved`}case"edit":{let f=typeof i.diff=="string"?i.diff:"";if(!f)return"applied";let{additions:h,removals:w}=Na(f);return`+${h} / -${w}`}case"write":{let f=Ge(s);return f===0?"written":`written (${f} ${Da(f,"line","lines")})`}case"bash":case"powershell":{let f=Ur(u);if(f===void 0)return s.trim()?oe(Kr(s),120):"done";let h=ja(u,s);return f===0?`exit 0${h}`:`exit ${f}`}case"grep":{let f=Ge(s);return f===0?"no matches":`${f} match${f===1?"":"es"}`}case"web_search":{let f=typeof i.count=="number"?i.count:Ge(s);return f===0?"no results":`${f} result${f===1?"":"s"}`}case"web_fetch":return`${typeof i.chars=="number"?i.chars:s.length} chars`;case"lsp":{let f=typeof i.count=="number"?i.count:void 0;return typeof i.error=="string"?oe(i.error,120):f===void 0?oe(Kr(s),120):`${f} location${f===1?"":"s"}`}case"quality":{if(typeof i.error=="string")return oe(i.error,120);if(i.off===!0)return"off";let f=typeof i.files=="number"?i.files:0,h=typeof i.functions=="number"?i.functions:0,w=typeof i.findings=="number"?i.findings:0,S=typeof i.score=="number"?` \xB7 ${Math.round(i.score)}`:"";return f===0?"no files":`${f} file${f===1?"":"s"} \xB7 ${h} fn \xB7 ${w} finding${w===1?"":"s"}${S}`}case"todo":{let f=i.todos??[];if(!Array.isArray(f)||f.length===0)return"list cleared";let h=f.filter(S=>S.status==="completed").length,w=f.filter(S=>S.status==="pending"||S.status==="in_progress").length;return`${h}/${f.length} done, ${w} open`}case"context":{let f=i.notes,h=f?Object.keys(f).length:0;return h===0?"no notes":`${h} note${h===1?"":"s"} held`}case"workflow":{let f=typeof i.agents=="number"?i.agents:0,h=typeof i.outputTokens=="number"?i.outputTokens:0,w=Array.isArray(i.steps)?i.steps.filter(M=>M.status==="failed").length:0;if(typeof i.error=="string")return`failed after ${f} agent(s)`;let S=typeof i.startedAt=="number"&&typeof i.endedAt=="number"?`, ${cr(i.endedAt-i.startedAt)}`:"";return`${f} agent(s), ${h} tokens${S}${w>0?`, ${w} failed`:""}`}case"bash_output":{let f=s.trim().split(`
|
|
10
|
+
`)[0]??"",h=/running/.test(f)?"running":/finished/.test(f)?"finished":"task",w=s.trim().split(`
|
|
11
|
+
`).slice(2).filter(S=>S.trim()).length;return w===0?h:`${h} \xB7 ${w} line${w===1?"":"s"}`}case"kill_shell":{let f=s.trim().split(`
|
|
12
|
+
`)[0]??"";return f.startsWith("Stopped")?"stopped":oe(f,120)}default:{let f=s.trim().split(`
|
|
13
13
|
`).find(h=>h.trim());return f?oe(f,120):"done"}}}function Gr(e,t){let n=Ve(t);if(e==="edit"&&typeof n.diff=="string")return n.diff.split(`
|
|
14
|
-
`).filter(
|
|
14
|
+
`).filter(s=>s.length>0).slice(0,12);if(e==="bash"||e==="powershell"){if(Te(t).startsWith("Started bash_"))return[];let i=In(t);return(typeof i.output=="string"?i.output:Te(t).replace(/\n*Command exited with code \d+\s*$/,"")).trimEnd().split(`
|
|
15
15
|
`).filter(h=>h.trim()).slice(-4)}if(e==="bash_output")return Te(t).split(`
|
|
16
|
-
`).slice(2).filter(
|
|
17
|
-
`).filter(
|
|
18
|
-
`).filter(h=>h.length>0).slice(0,kt);let
|
|
19
|
-
`),f=u.slice(0,kt);return u.length>kt&&f.push(`\u2026 ${u.length-kt} more line(s)`),f}var Wa={read:{active:"Reading",done:"Read",one:"file",many:"files"},search:{active:"Searching for",done:"Searched for",one:"pattern",many:"patterns"},list:{active:"Listing",done:"Listed",one:"directory",many:"directories"}};function Ua(e){if(e==="read")return"read";if(e==="grep"||e==="find"||e==="glob")return"search";if(e==="ls")return"list"}function Vr(e,t=!1){let n=[],i
|
|
16
|
+
`).slice(2).filter(i=>i.trim()).slice(-6);if(e==="todo"){let s=n.todos??[],i={pending:"[ ]",in_progress:"[>]",completed:"[x]",dropped:"[-]"};return s.slice(0,6).map(u=>`${i[u.status??"pending"]??"[ ]"} ${u.content??""}`)}return e==="task"?Te(t).split(`
|
|
17
|
+
`).filter(s=>s.trim()&&!s.startsWith("## ")).slice(0,6):e==="workflow"?(n.steps??[]).map(u=>{let f=u.status==="running"?"\u25B8":u.status==="failed"?"\xD7":"\u2713",h=u.phase?`${u.phase} \xB7 `:"";return`${f} ${h}${u.label??"agent"}`}).slice(-6):[]}var kt=400;function qr(e,t){let n=Ve(t);if(e==="edit"&&typeof n.diff=="string")return n.diff.split(`
|
|
18
|
+
`).filter(h=>h.length>0).slice(0,kt);let s=In(t),u=(typeof s.output=="string"?s.output:Te(t).replace(/\n*Command exited with code \d+\s*$/,"")).trimEnd().split(`
|
|
19
|
+
`),f=u.slice(0,kt);return u.length>kt&&f.push(`\u2026 ${u.length-kt} more line(s)`),f}var Wa={read:{active:"Reading",done:"Read",one:"file",many:"files"},search:{active:"Searching for",done:"Searched for",one:"pattern",many:"patterns"},list:{active:"Listing",done:"Listed",one:"directory",many:"directories"}};function Ua(e){if(e==="read")return"read";if(e==="grep"||e==="find"||e==="glob")return"search";if(e==="ls")return"list"}function Vr(e,t=!1){let n=[],s,i=()=>{if(!s||s.indices.length<2){s=void 0;return}n.push({start:s.indices[0],indices:s.indices,counts:s.counts,summary:Ka(s.counts,t)}),s=void 0};for(let[u,f]of e.entries()){let h=Ua(f.toolName);if(h===void 0){i();continue}s||(s={indices:[],counts:{}}),s.indices.push(u),s.counts[h]=(s.counts[h]??0)+1}return i(),n}function Ka(e,t){let n=[];for(let s of["search","read","list"]){let i=e[s];if(i===void 0)continue;let u=Wa[s],f=t?u.active:u.done,h=i===1?u.one:u.many;n.push(`${n.length===0?f:f.toLowerCase()} ${i} ${h}`)}return n.join(", ")}function Yr(e,t){let n=e[e.length-1];return n&&n.kind==="note"&&n.title===t.title?[...e.slice(0,-1),t]:[...e,t]}function _n(e){return typeof e=="string"?We(e):We(e.map(t=>t.type==="text"?t.text:t.type==="thinking"?"":t.type==="image"?"[image]":(t.type==="toolCall","")).filter(Boolean).join(""))}function Xr(e){return e.role==="user"?_n(e.content).trim():""}function Jr(e,t,n){let s=t.trim();if(!s)return e;let i=e.findIndex(f=>f.kind==="user"&&f.body.trim()===s);if(i===-1)return[...e,{id:n,kind:"user",title:"you",body:s}];let u=[...e];return u[i]={id:n,kind:"user",title:"you",body:s},u}function Ga(e){return e.content.filter(t=>t.type==="toolCall").map(t=>({name:t.name,arguments:t.arguments}))}function qa(e){return e.content.filter(t=>t.type==="toolCall").map(t=>t.id)}function Va(e){let t=e.map(f=>({toolName:f.kind==="result"||f.kind==="tool"?f.title:"",line:f.call??f.body})),n=Vr(t);if(n.length===0)return e;let s=new Map(n.map(f=>[f.start,f])),i=new Set(n.flatMap(f=>f.indices)),u=[];for(let[f,h]of e.entries()){let w=s.get(f);if(w){let S=e[w.start];u.push({id:S?.id??`g-${w.start}`,kind:"collapsed",title:"collapsed",body:w.summary,full:w.indices.map(M=>e[M]?.call??e[M]?.body??"").filter(Boolean)});continue}i.has(f)||u.push(h)}return u}function St(e){let t=[];for(let n of e)if(n.role==="user"){let s=_n(n.content).trim();if(!s)continue;t.push({id:`u-${n.timestamp}`,kind:"user",title:"you",body:s})}else if(n.role==="assistant"){let s=_n(n.content).trim(),i=Ga(n),u=qa(n);s?t.push({id:`a-${n.timestamp}`,kind:n.stopReason==="error"?"error":"assistant",title:n.errorMessage?"failed":"fix",body:n.errorMessage?`${n.errorMessage}
|
|
20
20
|
|
|
21
|
-
${i}`:i}):n.errorMessage&&t.push({id:`e-${n.timestamp}`,kind:"error",title:"failed",body:n.errorMessage}),s.forEach((f,h)=>{let w=u[h];t.push({id:w?`tool-${w}`:`c-${n.timestamp}-${h}`,kind:"tool",title:f.name,body:$e(f.name,f.arguments),...w?{call:$e(f.name,f.arguments)}:{}})})}else if(n.role==="toolResult"){let i=vt(n.toolName,{content:n.content},n.isError),s=t.find(u=>u.id===`tool-${n.toolCallId}`);s?(s.kind="result",s.body=i,s.title=n.toolName):t.push({id:`r-${n.toolCallId}`,kind:"result",title:n.toolName,body:i})}return Va(t)}function zr(e,t,n){return Ba(e,Math.max(8,t)).map(i=>O(i,n))}var ze=new Map;function za(e){let t=e.body||" ",n=ze.get(e.id);if(n)return n.text!==t&&(n.component.setText(t),n.text=t),n.component;let i=new Ha(t,0,0,ar);return ze.set(e.id,{text:t,component:i}),i}var On=class{constructor(t){this.item=t}item;invalidate(){}shade(t){let n=Date.now()-(this.item.born??0);return fe(T.dim,t,Or(n,An))}render(t){let n=this.item.body;if(this.item.kind==="user"){let s=this.item.pending?[O(" queued \u2014 the run reads this at its next step",T.dim)]:[];return["",...zr(`> ${n}`,t,this.shade(T.user)),...s]}if(this.item.kind==="tool")return[O(`${qe()} ${n}`,this.shade(T.tool))];if(this.item.kind==="collapsed"){let s=[O(`${$t} ${n}`,this.shade(T.mute))],u=this.item.full??[];if(u.length>0)if(this.item.expanded===!0)for(let f of u)s.push(O(` ${f}`,this.shade(T.dim)));else s.push(O(` ${u.length} call(s) \xB7 ctrl+e to expand`,T.dim));return s}if(this.item.kind==="result"){let s=n.startsWith("exit ")&&n!=="exit 0";if(this.item.panel)return["",...this.item.panel(t),...n?[O(` ${En} ${n}`,s?T.bad:T.mute)]:[]];let u=[];this.item.call&&u.push(O(this.item.call,this.shade(T.tool)));let f=` ${En} ${n}`;if(u.push(O(f,s?T.bad:this.shade(T.mute))),this.item.expanded===!0&&(this.item.full?.length??0)>0){let M=O(` ${this.item.full.length} line(s) \xB7 ctrl+e to collapse`,T.dim);u.push(O(` ${$t}`,T.dim));for(let j of this.item.full){let W=j.startsWith("+")?T.tool:j.startsWith("-")?T.bad:T.dim;u.push(O(` ${j}`,W))}return u.push(M),u}let w=this.item.detail??[],S=Tn(Date.now()-(this.item.born??0),w.length);for(let M of w.slice(0,S)){let j=M.startsWith("+")?T.tool:M.startsWith("-")?T.bad:T.dim;u.push(O(` ${M}`,this.shade(j)))}return(this.item.full?.length??0)>0&&u.push(O(` ${$t} ${this.item.full.length} line(s) \xB7 ctrl+e to expand`,T.dim)),u}if(this.item.kind==="error"||this.item.kind==="note"){let s=this.item.kind==="error"?T.bad:T.mute;return["",...zr(n,t,this.shade(s))]}return["",...za(this.item).render(Math.max(8,t-2))]}},xt=class{items=[];status="";scrollOffset=0;scrollAnchor;settledOffset=0;viewportHeight=0;invalidate(){}entering(){let t=Date.now();return this.items.some(n=>{if(n.born===void 0)return!1;let i=t-n.born;return Lr(i,An)?!0:(n.detail?.length??0)>Tn(i,n.detail?.length??0)})}render(t){if(ze.size>this.items.length){let s=new Set(this.items.map(u=>u.id));for(let u of ze.keys())s.has(u)||ze.delete(u)}let n=[];for(let s of this.items)s.born??=Date.now(),n.push(...new On(s).render(t));this.status&&n.push(O(this.status,T.mute));let i=this.viewportHeight;if(i>0&&n.length>i){let s=n.length-i;this.scrollOffset!==this.settledOffset&&(this.scrollAnchor=void 0);let u=this.scrollAnchor,f;if(u!==void 0){let h=n.length-u;h>=0&&h<=s?f=h:f=Math.max(0,Math.min(this.scrollOffset,s))}else f=Math.max(0,Math.min(this.scrollOffset,s));return u===void 0&&(this.scrollOffset=f),this.settledOffset=this.scrollOffset,f===0?this.scrollAnchor=void 0:this.scrollAnchor===void 0&&(this.scrollAnchor=n.length-f),n.slice(s-f,s-f+i)}return n}};import{parseColor as Q}from"@netrodev/hxf-tui";var pe={off:Q("okhsl(230 12% 46%)"),minimal:Q("okhsl(240 55% 49%)"),low:Q("okhsl(252 60% 55%)"),medium:Q("okhsl(270 64% 60%)"),high:Q("okhsl(298 70% 64%)"),xhigh:Q("okhsl(332 80% 66%)"),max:Q("okhsl(42 95% 64%)")},Zr={off:Q("okhsl(230 14% 64%)"),minimal:Q("okhsl(240 60% 64%)"),low:Q("okhsl(252 64% 68%)"),medium:Q("okhsl(270 68% 72%)"),high:Q("okhsl(298 74% 76%)"),xhigh:Q("okhsl(332 82% 78%)"),max:Q("okhsl(42 96% 76%)")};function Ct(e){return pe[e]??pe.medium}var es=[pe.minimal,pe.low,pe.medium,pe.high,pe.xhigh,pe.max];function ts(e){return Zr[e]??Zr.medium}var Qr=460;function At(e){return!Number.isFinite(e)||e<0||e>=Qr?0:1-e/Qr}var q=["off","minimal","low","medium","high","xhigh","max"];function ns(e){let t=e?.thinkingLevelMap;if(t===void 0)return q[q.length-1];for(let n=q.length-1;n>=0;n-=1)if(typeof t[q[n]]=="string")return q[n]}function os(e){let t=q.indexOf(e);return q[(t+1+q.length)%q.length]}function is(e){let t=q.indexOf(e);return q[(t-1+q.length)%q.length]}import{mkdirSync as Za,readFileSync as Qa}from"node:fs";import{dirname as el}from"node:path";var Nn="\x1B[0m",V="\x1B[2m",Ya="\x1B[1m",Xa="\x1B[31m",Fn="\x1B[32m",ss="\x1B[33m",rs="\x1B[35m",Ln="\x1B[36m";function F(e,t){return`${t}${e}${Nn}`}function as(e,t){return O(e,Ct(t))}function ls(e){return e>=85?Xa:e>=70?ss:Fn}var Ja="\u2726";function cs(e,t,n,i){let s=F(`[${e}]`,Ln),u=`${F(Ja,V)} ${t}`,f=F(n,ss),h=i?` ${F("git:(",rs)}${F(i.replace(/^git:\(/,"").replace(/\)$/,""),Ln)}${F(")",rs)}`:"";return`${s}${F(" \u2502 ",V)}${u}${F(" \u2502 ",V)}${f}${h}`}function ds(e,t,n){if(!t)return e;let i=n===void 0?t:`${t} ${F(dr(n),V)}`;return`${F(i,Ln)} ${F("\u2502",V)} ${e}`}function us(e,...t){let n=Number.isFinite(e)?Math.min(100,Math.max(0,e)):0,i=Math.round(n/10),s=ls(n),u=`${s}${"\u2588".repeat(i)}${V}${"\u2591".repeat(10-i)}${Nn}`,f=F(`${Math.round(n)}%`,s),h=t.filter(Boolean).join(F(" \u2502 ",V));return`${F("Context",V)} ${u} ${f}${h?`${F(" \u2502 ",V)}${h}`:""}`}function fs(e){return!Number.isFinite(e)||e<=0?"":`${F("Spent",V)} ${F(`$${e.toFixed(3)}`,Fn)}`}function ps(e,t,n,i){let s=Number.isFinite(t)&&t>0?t:0,u=Number.isFinite(n)?Math.max(0,n):0,f=Math.max(0,s-u),h=s>0?Math.min(100,u/s*100):0,w=Math.round(h/10),S=ls(h),M=`${S}${"\u2588".repeat(w)}${V}${"\u2591".repeat(10-w)}${Nn}`,j=W=>`${W.toFixed(2)} ${i}`;return[`${F(e,Ya)}${F(" account",V)}`,` ${F("used",V)} ${M} ${F(`${h.toFixed(1)}%`,S)}`,` ${F("granted",V)} ${j(s)}`,` ${F("spent",V)} ${j(u)}`,` ${F("remaining",V)} ${F(j(f),S)}`]}function jn(e,t,n){let i=n===null?"":F(` ${n}ms`,V),s=t&&t!=="USD"?`${t} `:"";return`${F("Balance",V)} ${F(`${s}${e}`,Fn)}${i}`}var Dn=oi,tl=18e4;async function nl(e){let t=new Set((await e.modelRuntime.getAvailable()).map(s=>s.provider).filter(s=>ie(s))),n=ye.find(s=>t.has(s));return n?(await e.modelRuntime.getAuth(n))?.auth?.apiKey:void 0}function ol(){try{let e=JSON.parse(Qa(Dn,"utf8"));return!e.data||typeof e.cachedAt!="number"?void 0:{data:e.data,cachedAt:e.cachedAt}}catch{return}}function Tt(e){if(e.unlimited)return jn("unlimited","",e.latencyMs);let n=e.unit==="USD"||e.unit==="CNY"?`$${e.remaining.toFixed(2)}`:`${e.remaining.toLocaleString()}`;return jn(n,e.unit,e.latencyMs)}async function ms(e){let t=ol();if(t&&Date.now()-t.cachedAt<tl)return Tt(t.data);let n=await nl(e);if(!n)return t?Tt(t.data):void 0;let i=Date.now(),s=await Ae(n,{timeoutMs:3e3});if(!s.ok)return t?Tt(t.data):void 0;let u={remaining:s.remaining??0,limit:s.limit??0,unit:s.unit,unlimited:s.unlimited,latencyMs:Date.now()-i};return Za(el(Dn),{recursive:!0}),se(Dn,JSON.stringify({data:u,cachedAt:Date.now()})),Tt(u)}import{chmodSync as il,existsSync as rl,readFileSync as sl}from"node:fs";import{join as al}from"node:path";function hs(e){return al(e,"account-credential.json")}function gs(e,t){return Buffer.from(`${e}:${t}`,"utf8").toString("base64")}function Wn(e){let t=e.trim();if(!t)return null;let n=s=>{let u=s.indexOf(":");return u<=0||u===s.length-1?null:{username:s.slice(0,u),password:s.slice(u+1)}},i=n(t);if(i)return i;try{let s=Buffer.from(t,"base64").toString("utf8");return s.includes(":")?n(s):null}catch{return null}}function bs(e,t,n){try{let i={credential:gs(t,n),username:t,savedAt:Math.floor(Date.now()/1e3)},s=hs(e);return se(s,JSON.stringify(i,null,2)),il(s,384),!0}catch{return!1}}function ws(e){try{let t=hs(e);if(!rl(t))return null;let n=JSON.parse(sl(t,"utf8"));return!n?.credential||!n?.username?null:n}catch{return null}}async function ll(e,t){let n=await fetch(e,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t),signal:AbortSignal.timeout(2e4)}),i=await n.text(),s;try{s=JSON.parse(i)}catch{throw new Error(`the panel answered ${n.status} with something that is not JSON`)}let u=s;if(!n.ok||u.success===!1)throw new Error(u.message||`the panel answered ${n.status}`);return u.data}async function ys(e,t,n,i){let s=await ll(`${e}/api/auth/cli/credential`,{credential:gs(t,n),client_info:i});if(!s?.token)throw new Error("the panel accepted the credential but returned no key");return{token:s.token}}import{execFileSync as cl}from"node:child_process";import{createHash as dl}from"node:crypto";import{readFileSync as ul}from"node:fs";import{arch as fl,hostname as pl,platform as ks}from"node:os";function ml(e){try{return ul(e,"utf8").trim()}catch{return""}}function $s(e,t){try{return cl(e,t,{encoding:"utf8",timeout:3e3})}catch{return""}}function hl(){return $s("reg",["query","HKLM\\SOFTWARE\\Microsoft\\Cryptography","/v","MachineGuid"]).match(/MachineGuid\s+REG_SZ\s+([0-9a-fA-F-]+)/)?.[1]??""}function gl(){return $s("ioreg",["-rd1","-c","IOPlatformExpertDevice"]).match(/"IOPlatformUUID"\s*=\s*"([^"]+)"/)?.[1]??""}function bl(){return["/sys/class/dmi/id/product_uuid","/sys/class/dmi/id/board_serial","/sys/class/dmi/id/product_serial","/etc/machine-id","/var/lib/dbus/machine-id"].map(ml).filter(Boolean)}function wl(){switch(ks()){case"win32":{let e=hl();return e?[e]:[]}case"darwin":{let e=gl();return e?[e]:[]}default:return bl()}}var Mt;function vs(){if(Mt)return{id:Mt,weak:!1};let e=wl(),t=e.length===0,n=[ks(),fl(),...e,t?pl():""].join("|");return Mt=dl("sha256").update(n).digest("hex").slice(0,32),{id:Mt,weak:t}}var yl="/cli/checkin",kl=["Bearer",""].join(" ").trim(),$l=5e5;function Un(e){return`$${(e/$l).toFixed(2)}`}async function xs(e,t,n,i,s){let u=new AbortController,f=setTimeout(()=>u.abort(),s);try{let h=await i(`${n}${yl}`,{method:t,headers:{[ai]:li(),"X-HowToFix-Device":vs().id,Authorization:`${kl} ${e}`},signal:u.signal}),w={};try{w=await h.json()}catch{}return{status:h.status,body:w}}finally{clearTimeout(f)}}async function Kn(e,t){let n=(t?.baseUrl??"https://api.howtofix.id/v1").replace(/\/+$/,""),i=t?.fetchImpl??fetch,s=t?.timeoutMs??1e4,u=e.trim();if(!u)return{ok:!1,enabled:!1,checkedInToday:!1,quotaToday:0,message:"no token given"};try{let{status:f,body:h}=await xs(u,"GET",n,i,s);if(f===401||f===403)return{ok:!1,enabled:!1,checkedInToday:!1,quotaToday:0,message:"the gateway rejected that token for the check-in status"};if(f>=400||h.success!==!0)return{ok:!1,enabled:!1,checkedInToday:!1,quotaToday:0,message:typeof h.message=="string"?h.message:`the gateway answered ${f}`};let w=h.data??{};return{ok:!0,enabled:w.enabled===!0,checkedInToday:w.checked_in_today===!0,quotaToday:Number(w.quota_today??0)||0,message:""}}catch(f){return{ok:!1,enabled:!1,checkedInToday:!1,quotaToday:0,message:f instanceof Error&&f.name==="AbortError"?"the gateway did not answer the check-in in time":"could not reach the gateway"}}}async function Ss(e,t){let n=(t?.baseUrl??"https://api.howtofix.id/v1").replace(/\/+$/,""),i=t?.fetchImpl??fetch,s=t?.timeoutMs??15e3,u=e.trim();if(!u)return{ok:!1,alreadyClaimed:!1,blocked:!1,quotaAwarded:0,message:"no token given"};try{let{status:f,body:h}=await xs(u,"POST",n,i,s);if(h.success===!0){let j=h.data??{};return{ok:!0,alreadyClaimed:!1,blocked:!1,quotaAwarded:Number(j.quota_awarded??0)||0,message:""}}let w=typeof h.message=="string"?h.message:`the gateway answered ${f}`,S=/device already claimed|account blocked|appeal/i.test(w);return{ok:!1,alreadyClaimed:!S&&/签到|check-?in|already|今日/.test(w)&&!/not enabled/i.test(w),blocked:S,quotaAwarded:0,message:w}}catch(f){return{ok:!1,alreadyClaimed:!1,blocked:!1,quotaAwarded:0,message:f instanceof Error&&f.name==="AbortError"?"the gateway did not answer the check-in in time":"could not reach the gateway"}}}function vl(e){return!e||!Number.isFinite(e)||e<=0?"":e>=1e6?`${Number((e/1e6).toFixed(1))}M`:e>=1e3?`${Math.round(e/1e3)}K`:String(e)}function xl(e){if(!e)return"";if(e.input<=0&&e.output<=0)return"free";let t=n=>n===0?"0":String(Number(n>=1?n.toFixed(2):n.toFixed(3)));return`$${t(e.input)}/$${t(e.output)} per M`}function Cs(e){let t=vl(e.contextWindow),n=xl(e.cost);return[t?`${t} ctx`:"",n].filter(Boolean).join(" \xB7 ")}function As(){return{}}function Ts(e,t,n,i=Date.now()){let s={...e};return t==="run"?(n===void 0||n===""?delete s.run:s.run={label:n,since:e.run?.since??i},s):(n===void 0||n===""?delete s[t]:s[t]=n,s)}function Ms(e,t){let n={...e};return t===void 0?delete n.retry:n.retry=t,n}function Sl(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 Hn(e,t=72){let n=e.split(`
|
|
22
|
-
`).map(
|
|
23
|
-
`).filter(Boolean),
|
|
24
|
-
`)||"nothing to do"),v()};h(!0),f("session start"),e.note&&
|
|
25
|
-
read it with /agents ${o.id}`)});let Bt=!1,ra=o=>{Bt||(Bt=!0,(async()=>{try{let r=(await k.modelRuntime.getAvailable()).filter(g=>
|
|
21
|
+
${s}`:s}):n.errorMessage&&t.push({id:`e-${n.timestamp}`,kind:"error",title:"failed",body:n.errorMessage}),i.forEach((f,h)=>{let w=u[h];t.push({id:w?`tool-${w}`:`c-${n.timestamp}-${h}`,kind:"tool",title:f.name,body:$e(f.name,f.arguments),...w?{call:$e(f.name,f.arguments)}:{}})})}else if(n.role==="toolResult"){let s=vt(n.toolName,{content:n.content},n.isError),i=t.find(u=>u.id===`tool-${n.toolCallId}`);i?(i.kind="result",i.body=s,i.title=n.toolName):t.push({id:`r-${n.toolCallId}`,kind:"result",title:n.toolName,body:s})}return Va(t)}function zr(e,t,n){return Ba(e,Math.max(8,t)).map(s=>O(s,n))}var ze=new Map;function za(e){let t=e.body||" ",n=ze.get(e.id);if(n)return n.text!==t&&(n.component.setText(t),n.text=t),n.component;let s=new Ha(t,0,0,ar);return ze.set(e.id,{text:t,component:s}),s}var On=class{constructor(t){this.item=t}item;invalidate(){}shade(t){let n=Date.now()-(this.item.born??0);return fe(T.dim,t,Or(n,An))}render(t){let n=this.item.body;if(this.item.kind==="user"){let i=this.item.pending?[O(" queued \u2014 the run reads this at its next step",T.dim)]:[];return["",...zr(`> ${n}`,t,this.shade(T.user)),...i]}if(this.item.kind==="tool")return[O(`${qe()} ${n}`,this.shade(T.tool))];if(this.item.kind==="collapsed"){let i=[O(`${$t} ${n}`,this.shade(T.mute))],u=this.item.full??[];if(u.length>0)if(this.item.expanded===!0)for(let f of u)i.push(O(` ${f}`,this.shade(T.dim)));else i.push(O(` ${u.length} call(s) \xB7 ctrl+e to expand`,T.dim));return i}if(this.item.kind==="result"){let i=n.startsWith("exit ")&&n!=="exit 0";if(this.item.panel)return["",...this.item.panel(t),...n?[O(` ${En} ${n}`,i?T.bad:T.mute)]:[]];let u=[];this.item.call&&u.push(O(this.item.call,this.shade(T.tool)));let f=` ${En} ${n}`;if(u.push(O(f,i?T.bad:this.shade(T.mute))),this.item.expanded===!0&&(this.item.full?.length??0)>0){let M=O(` ${this.item.full.length} line(s) \xB7 ctrl+e to collapse`,T.dim);u.push(O(` ${$t}`,T.dim));for(let j of this.item.full){let W=j.startsWith("+")?T.tool:j.startsWith("-")?T.bad:T.dim;u.push(O(` ${j}`,W))}return u.push(M),u}let w=this.item.detail??[],S=Tn(Date.now()-(this.item.born??0),w.length);for(let M of w.slice(0,S)){let j=M.startsWith("+")?T.tool:M.startsWith("-")?T.bad:T.dim;u.push(O(` ${M}`,this.shade(j)))}return(this.item.full?.length??0)>0&&u.push(O(` ${$t} ${this.item.full.length} line(s) \xB7 ctrl+e to expand`,T.dim)),u}if(this.item.kind==="error"||this.item.kind==="note"){let i=this.item.kind==="error"?T.bad:T.mute;return["",...zr(n,t,this.shade(i))]}return["",...za(this.item).render(Math.max(8,t-2))]}},xt=class{items=[];status="";scrollOffset=0;scrollAnchor;settledOffset=0;viewportHeight=0;invalidate(){}entering(){let t=Date.now();return this.items.some(n=>{if(n.born===void 0)return!1;let s=t-n.born;return Lr(s,An)?!0:(n.detail?.length??0)>Tn(s,n.detail?.length??0)})}render(t){if(ze.size>this.items.length){let i=new Set(this.items.map(u=>u.id));for(let u of ze.keys())i.has(u)||ze.delete(u)}let n=[];for(let i of this.items)i.born??=Date.now(),n.push(...new On(i).render(t));this.status&&n.push(O(this.status,T.mute));let s=this.viewportHeight;if(s>0&&n.length>s){let i=n.length-s;this.scrollOffset!==this.settledOffset&&(this.scrollAnchor=void 0);let u=this.scrollAnchor,f;if(u!==void 0){let h=n.length-u;h>=0&&h<=i?f=h:f=Math.max(0,Math.min(this.scrollOffset,i))}else f=Math.max(0,Math.min(this.scrollOffset,i));return u===void 0&&(this.scrollOffset=f),this.settledOffset=this.scrollOffset,f===0?this.scrollAnchor=void 0:this.scrollAnchor===void 0&&(this.scrollAnchor=n.length-f),n.slice(i-f,i-f+s)}return n}};import{parseColor as Q}from"@netrodev/hxf-tui";var pe={off:Q("okhsl(230 12% 46%)"),minimal:Q("okhsl(240 55% 49%)"),low:Q("okhsl(252 60% 55%)"),medium:Q("okhsl(270 64% 60%)"),high:Q("okhsl(298 70% 64%)"),xhigh:Q("okhsl(332 80% 66%)"),max:Q("okhsl(42 95% 64%)")},Zr={off:Q("okhsl(230 14% 64%)"),minimal:Q("okhsl(240 60% 64%)"),low:Q("okhsl(252 64% 68%)"),medium:Q("okhsl(270 68% 72%)"),high:Q("okhsl(298 74% 76%)"),xhigh:Q("okhsl(332 82% 78%)"),max:Q("okhsl(42 96% 76%)")};function Ct(e){return pe[e]??pe.medium}var ei=[pe.minimal,pe.low,pe.medium,pe.high,pe.xhigh,pe.max];function ti(e){return Zr[e]??Zr.medium}var Qr=460;function At(e){return!Number.isFinite(e)||e<0||e>=Qr?0:1-e/Qr}var q=["off","minimal","low","medium","high","xhigh","max"];function ni(e){let t=e?.thinkingLevelMap;if(t===void 0)return q[q.length-1];for(let n=q.length-1;n>=0;n-=1)if(typeof t[q[n]]=="string")return q[n]}function oi(e){let t=q.indexOf(e);return q[(t+1+q.length)%q.length]}function si(e){let t=q.indexOf(e);return q[(t-1+q.length)%q.length]}import{mkdirSync as Za,readFileSync as Qa}from"node:fs";import{dirname as el}from"node:path";var Nn="\x1B[0m",V="\x1B[2m",Ya="\x1B[1m",Xa="\x1B[31m",Fn="\x1B[32m",ii="\x1B[33m",ri="\x1B[35m",Ln="\x1B[36m";function F(e,t){return`${t}${e}${Nn}`}function ai(e,t){return O(e,Ct(t))}function li(e){return e>=85?Xa:e>=70?ii:Fn}var Ja="\u2726";function ci(e,t,n,s){let i=F(`[${e}]`,Ln),u=`${F(Ja,V)} ${t}`,f=F(n,ii),h=s?` ${F("git:(",ri)}${F(s.replace(/^git:\(/,"").replace(/\)$/,""),Ln)}${F(")",ri)}`:"";return`${i}${F(" \u2502 ",V)}${u}${F(" \u2502 ",V)}${f}${h}`}function di(e,t,n){if(!t)return e;let s=n===void 0?t:`${t} ${F(dr(n),V)}`;return`${F(s,Ln)} ${F("\u2502",V)} ${e}`}function ui(e,...t){let n=Number.isFinite(e)?Math.min(100,Math.max(0,e)):0,s=Math.round(n/10),i=li(n),u=`${i}${"\u2588".repeat(s)}${V}${"\u2591".repeat(10-s)}${Nn}`,f=F(`${Math.round(n)}%`,i),h=t.filter(Boolean).join(F(" \u2502 ",V));return`${F("Context",V)} ${u} ${f}${h?`${F(" \u2502 ",V)}${h}`:""}`}function fi(e){return!Number.isFinite(e)||e<=0?"":`${F("Spent",V)} ${F(`$${e.toFixed(3)}`,Fn)}`}function pi(e,t,n,s){let i=Number.isFinite(t)&&t>0?t:0,u=Number.isFinite(n)?Math.max(0,n):0,f=Math.max(0,i-u),h=i>0?Math.min(100,u/i*100):0,w=Math.round(h/10),S=li(h),M=`${S}${"\u2588".repeat(w)}${V}${"\u2591".repeat(10-w)}${Nn}`,j=W=>`${W.toFixed(2)} ${s}`;return[`${F(e,Ya)}${F(" account",V)}`,` ${F("used",V)} ${M} ${F(`${h.toFixed(1)}%`,S)}`,` ${F("granted",V)} ${j(i)}`,` ${F("spent",V)} ${j(u)}`,` ${F("remaining",V)} ${F(j(f),S)}`]}function jn(e,t,n){let s=n===null?"":F(` ${n}ms`,V),i=t&&t!=="USD"?`${t} `:"";return`${F("Balance",V)} ${F(`${i}${e}`,Fn)}${s}`}var Dn=os,tl=18e4;async function nl(e){let t=new Set((await e.modelRuntime.getAvailable()).map(i=>i.provider).filter(i=>se(i))),n=ye.find(i=>t.has(i));return n?(await e.modelRuntime.getAuth(n))?.auth?.apiKey:void 0}function ol(){try{let e=JSON.parse(Qa(Dn,"utf8"));return!e.data||typeof e.cachedAt!="number"?void 0:{data:e.data,cachedAt:e.cachedAt}}catch{return}}function Tt(e){if(e.unlimited)return jn("unlimited","",e.latencyMs);let n=e.unit==="USD"||e.unit==="CNY"?`$${e.remaining.toFixed(2)}`:`${e.remaining.toLocaleString()}`;return jn(n,e.unit,e.latencyMs)}async function mi(e){let t=ol();if(t&&Date.now()-t.cachedAt<tl)return Tt(t.data);let n=await nl(e);if(!n)return t?Tt(t.data):void 0;let s=Date.now(),i=await Ae(n,{timeoutMs:3e3});if(!i.ok)return t?Tt(t.data):void 0;let u={remaining:i.remaining??0,limit:i.limit??0,unit:i.unit,unlimited:i.unlimited,latencyMs:Date.now()-s};return Za(el(Dn),{recursive:!0}),ie(Dn,JSON.stringify({data:u,cachedAt:Date.now()})),Tt(u)}import{chmodSync as sl,existsSync as rl,readFileSync as il}from"node:fs";import{join as al}from"node:path";function hi(e){return al(e,"account-credential.json")}function gi(e,t){return Buffer.from(`${e}:${t}`,"utf8").toString("base64")}function Wn(e){let t=e.trim();if(!t)return null;let n=i=>{let u=i.indexOf(":");return u<=0||u===i.length-1?null:{username:i.slice(0,u),password:i.slice(u+1)}},s=n(t);if(s)return s;try{let i=Buffer.from(t,"base64").toString("utf8");return i.includes(":")?n(i):null}catch{return null}}function bi(e,t,n){try{let s={credential:gi(t,n),username:t,savedAt:Math.floor(Date.now()/1e3)},i=hi(e);return ie(i,JSON.stringify(s,null,2)),sl(i,384),!0}catch{return!1}}function wi(e){try{let t=hi(e);if(!rl(t))return null;let n=JSON.parse(il(t,"utf8"));return!n?.credential||!n?.username?null:n}catch{return null}}async function ll(e,t){let n=await fetch(e,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t),signal:AbortSignal.timeout(2e4)}),s=await n.text(),i;try{i=JSON.parse(s)}catch{throw new Error(`the panel answered ${n.status} with something that is not JSON`)}let u=i;if(!n.ok||u.success===!1)throw new Error(u.message||`the panel answered ${n.status}`);return u.data}async function yi(e,t,n,s){let i=await ll(`${e}/api/auth/cli/credential`,{credential:gi(t,n),client_info:s});if(!i?.token)throw new Error("the panel accepted the credential but returned no key");return{token:i.token}}import{execFileSync as cl}from"node:child_process";import{createHash as dl}from"node:crypto";import{readFileSync as ul}from"node:fs";import{arch as fl,hostname as pl,platform as ki}from"node:os";function ml(e){try{return ul(e,"utf8").trim()}catch{return""}}function $i(e,t){try{return cl(e,t,{encoding:"utf8",timeout:3e3})}catch{return""}}function hl(){return $i("reg",["query","HKLM\\SOFTWARE\\Microsoft\\Cryptography","/v","MachineGuid"]).match(/MachineGuid\s+REG_SZ\s+([0-9a-fA-F-]+)/)?.[1]??""}function gl(){return $i("ioreg",["-rd1","-c","IOPlatformExpertDevice"]).match(/"IOPlatformUUID"\s*=\s*"([^"]+)"/)?.[1]??""}function bl(){return["/sys/class/dmi/id/product_uuid","/sys/class/dmi/id/board_serial","/sys/class/dmi/id/product_serial","/etc/machine-id","/var/lib/dbus/machine-id"].map(ml).filter(Boolean)}function wl(){switch(ki()){case"win32":{let e=hl();return e?[e]:[]}case"darwin":{let e=gl();return e?[e]:[]}default:return bl()}}var Mt;function vi(){if(Mt)return{id:Mt,weak:!1};let e=wl(),t=e.length===0,n=[ki(),fl(),...e,t?pl():""].join("|");return Mt=dl("sha256").update(n).digest("hex").slice(0,32),{id:Mt,weak:t}}var yl="/cli/checkin",kl=["Bearer",""].join(" ").trim(),$l=5e5;function Un(e){return`$${(e/$l).toFixed(2)}`}async function xi(e,t,n,s,i){let u=new AbortController,f=setTimeout(()=>u.abort(),i);try{let h=await s(`${n}${yl}`,{method:t,headers:{[as]:ls(),"X-HowToFix-Device":vi().id,Authorization:`${kl} ${e}`},signal:u.signal}),w={};try{w=await h.json()}catch{}return{status:h.status,body:w}}finally{clearTimeout(f)}}async function Kn(e,t){let n=(t?.baseUrl??"https://api.howtofix.id/v1").replace(/\/+$/,""),s=t?.fetchImpl??fetch,i=t?.timeoutMs??1e4,u=e.trim();if(!u)return{ok:!1,enabled:!1,checkedInToday:!1,quotaToday:0,message:"no token given"};try{let{status:f,body:h}=await xi(u,"GET",n,s,i);if(f===401||f===403)return{ok:!1,enabled:!1,checkedInToday:!1,quotaToday:0,message:"the gateway rejected that token for the check-in status"};if(f>=400||h.success!==!0)return{ok:!1,enabled:!1,checkedInToday:!1,quotaToday:0,message:typeof h.message=="string"?h.message:`the gateway answered ${f}`};let w=h.data??{};return{ok:!0,enabled:w.enabled===!0,checkedInToday:w.checked_in_today===!0,quotaToday:Number(w.quota_today??0)||0,message:""}}catch(f){return{ok:!1,enabled:!1,checkedInToday:!1,quotaToday:0,message:f instanceof Error&&f.name==="AbortError"?"the gateway did not answer the check-in in time":"could not reach the gateway"}}}async function Si(e,t){let n=(t?.baseUrl??"https://api.howtofix.id/v1").replace(/\/+$/,""),s=t?.fetchImpl??fetch,i=t?.timeoutMs??15e3,u=e.trim();if(!u)return{ok:!1,alreadyClaimed:!1,blocked:!1,quotaAwarded:0,message:"no token given"};try{let{status:f,body:h}=await xi(u,"POST",n,s,i);if(h.success===!0){let j=h.data??{};return{ok:!0,alreadyClaimed:!1,blocked:!1,quotaAwarded:Number(j.quota_awarded??0)||0,message:""}}let w=typeof h.message=="string"?h.message:`the gateway answered ${f}`,S=/device already claimed|account blocked|appeal/i.test(w);return{ok:!1,alreadyClaimed:!S&&/签到|check-?in|already|今日/.test(w)&&!/not enabled/i.test(w),blocked:S,quotaAwarded:0,message:w}}catch(f){return{ok:!1,alreadyClaimed:!1,blocked:!1,quotaAwarded:0,message:f instanceof Error&&f.name==="AbortError"?"the gateway did not answer the check-in in time":"could not reach the gateway"}}}function vl(e){return!e||!Number.isFinite(e)||e<=0?"":e>=1e6?`${Number((e/1e6).toFixed(1))}M`:e>=1e3?`${Math.round(e/1e3)}K`:String(e)}function xl(e){if(!e)return"";if(e.input<=0&&e.output<=0)return"free";let t=n=>n===0?"0":String(Number(n>=1?n.toFixed(2):n.toFixed(3)));return`$${t(e.input)}/$${t(e.output)} per M`}function Ci(e){let t=vl(e.contextWindow),n=xl(e.cost);return[t?`${t} ctx`:"",n].filter(Boolean).join(" \xB7 ")}function Ai(){return{}}function Ti(e,t,n,s=Date.now()){let i={...e};return t==="run"?(n===void 0||n===""?delete i.run:i.run={label:n,since:e.run?.since??s},i):(n===void 0||n===""?delete i[t]:i[t]=n,i)}function Mi(e,t){let n={...e};return t===void 0?delete n.retry:n.retry=t,n}function Sl(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 Hn(e,t=72){let n=e.split(`
|
|
22
|
+
`).map(s=>s.trim()).find(s=>s!=="")??"";return n.length>t?`${n.slice(0,t-1)}\u2026`:n}function Cl(e,t){let n=Math.max(0,Math.ceil((e.until-t)/1e3)),s=n>0?`in ${n}s`:"now",i=`retry ${e.attempt}/${e.maxAttempts} ${s}`,u=Hn(e.error);return u===""?i:`${i} \xB7 ${u}`}function Ri(e,t,n=Date.now()){return e.prompt?`? ${e.prompt}`:e.retry?`* ${Cl(e.retry,n)}`:e.note?`* ${e.note}`:e.run?`${t} ${e.run.label} \xB7 ${Sl(n-e.run.since)}`:e.tally?e.tally:""}function Ei(e){return e instanceof Error?e.message:String(e)}var Ye=class{active;apply;report;pending;running;constructor(t){this.active=new Set(t.initial??[]),this.apply=t.apply,this.report=t.report??(n=>console.error(n))}activeServers(){return[...this.active]}reconcile(t){return this.pending=new Set(t),this.running?this.running:(this.running=this.drain().finally(()=>{this.running=void 0}),this.running)}async drain(){let t={added:[],removed:[],unchanged:[],problems:[]};for(;this.pending!==void 0;){let s=this.pending;this.pending=void 0;let i=await this.applyOnce(s);t.added.push(...i.added),t.removed.push(...i.removed),t.unchanged.push(...i.unchanged),t.problems.push(...i.problems)}let n=this.active;return t.added=t.added.filter(s=>n.has(s)),t.removed=[...new Set(t.removed.filter(s=>!n.has(s)))],t.added=[...new Set(t.added)],t.unchanged=[...new Set(t.unchanged.filter(s=>n.has(s)))],t}async applyOnce(t){let n=[...t].filter(u=>!this.active.has(u)),s=[...this.active].filter(u=>!t.has(u)),i=[...t].filter(u=>this.active.has(u));if(n.length===0&&s.length===0)return{added:[],removed:[],unchanged:i,problems:[]};try{await this.apply(n,s)}catch(u){let f=`mcp reconciliation failed: ${Ei(u)}`;return this.report(f),{added:[],removed:[],unchanged:[],problems:[f]}}for(let u of n)this.active.add(u);for(let u of s)this.active.delete(u);return{added:n,removed:s,unchanged:i,problems:[]}}async dispose(){this.running&&await this.running.catch(()=>{});let t=[...this.active];if(t.length===0)return{added:[],removed:[],unchanged:[],problems:[]};try{return await this.apply([],t),this.active.clear(),{added:[],removed:t,unchanged:[],problems:[]}}catch(n){let s=`mcp teardown failed: ${Ei(n)}`;return this.report(s),{added:[],removed:[],unchanged:[],problems:[s]}}}};import{mkdirSync as Al}from"node:fs";import{join as Tl}from"node:path";import{matchesKey as Rt}from"@netrodev/hxf-tui";var Bn=["all","running","failed","done"];function Ii(){return{selectedPhase:0,filter:"all",paused:!1,expanded:!1,follow:!0}}function _i(e){if(Rt(e,"up"))return"up";if(Rt(e,"down"))return"down";if(Rt(e,"enter"))return"enter";if(Rt(e,"escape"))return"escape";if(e==="f")return"filter";if(e==="p")return"pause";if(e==="x")return"stop";if(e==="s")return"save"}function Pi(e,t,n){if(t.length===0)return e;let s=Math.max(0,Math.min(t.length-1,e.selectedPhase+n));return{...e,selectedPhase:s,follow:!1}}function Ml(e){let t=Bn.indexOf(e);return Bn[(t+1)%Bn.length]}function Oi(e,t,n){switch(t){case"up":return Pi(e,n,-1);case"down":return Pi(e,n,1);case"enter":return{...e,expanded:!e.expanded};case"filter":return{...e,filter:Ml(e.filter)};case"pause":return{...e,paused:!e.paused};default:return e}}function Li(e,t){switch(t){case"running":return e.filter(n=>n.status==="running");case"failed":return e.filter(n=>n.status==="failed");case"done":return e.filter(n=>n.status!=="running");default:return[...e]}}function Ni(e){return e==="all"?"":` \xB7 ${e}`}var Fi="ctrl+f";function ji(e,t,n=!0){if(!n)return"Ctrl+F panel keys \xB7 Esc unpin";let s=["\u2191/\u2193 phase",e.expanded?"Enter collapse":"Enter drill in"];return s.push(e.expanded?"Esc back out":"Esc unpin"),s.push(`f filter${e.filter==="all"?"":` (${e.filter})`}`),t?(s.push(e.paused?"p resume":"p pause"),s.push("x stop")):e.paused&&s.push("p resume"),s.push("s save script"),e.paused&&s.unshift("paused"),s.join(" \xB7 ")}function Rl(e){let t=e.trim();if(!(!t||t.length>64)&&!(t==="."||t==="..")&&/^[A-Za-z0-9][A-Za-z0-9._-]*$/.test(t)&&!t.includes(".."))return t}function Di(e,t){if(!e)return{ok:!1,reason:"this run was started from a file, so it is already saved where you pointed the tool"};let n=Rl(e.name);if(!n)return{ok:!1,reason:`"${e.name}" is not a usable filename, so the script was not written`};let s=Tl(t,`${n}.js`);try{Al(t,{recursive:!0}),ie(s,e.code)}catch(i){return{ok:!1,reason:i instanceof Error?i.message:String(i)}}return{ok:!0,path:s}}function Wi(e){let t=()=>{};return{select:(n,s)=>e.select(n,s),confirm:(n,s)=>e.confirm(n,s),input:n=>e.input(n),notify:(n,s)=>e.notify(n,s),onTerminalInput:()=>t,setStatus:(n,s)=>e.setStatus(n,s),setWorkingMessage:t,setWorkingVisible:t,setWorkingIndicator:t,setHiddenThinkingLabel:t,setWidget:(n,s,i)=>{s!==void 0&&!Array.isArray(s)||e.setWidget?.(n,s,i?.placement)},setFooter:t,setHeader:t,setTitle:t,custom:async()=>{throw new Error("this screen has no custom component host; use the text commands instead")},pasteToEditor:t,setEditorText:t,getEditorText:()=>"",editor:async()=>{},addAutocompleteProvider:t,setEditorComponent:t,getEditorComponent:()=>{},theme:void 0,getAllThemes:()=>[],getTheme:()=>{},setTheme:()=>({success:!1,error:"themes are not available in the workbench"}),getToolsExpanded:()=>!1,setToolsExpanded:t}}var Bi={borderColor:()=>"",selectList:{selectedPrefix:e=>O(e,T.accent),selectedText:e=>O(e,T.text,{bold:!0}),description:e=>O(e,T.mute),scrollInfo:e=>O(e,T.dim),noMatch:e=>O(e,T.mute)}},Yi=Symbol.for("@netrodev/hxf-tui/layout-node");function Yl(e){if(typeof e!="object"||e===null)return;let t=e[Yi];return typeof t=="function"?t.call(e):void 0}var zn=Pl(El);async function Gi(e){try{let{stdout:t}=await zn("git",["-C",e,"rev-parse","--abbrev-ref","HEAD"],{encoding:"utf8"}),n=t.trim();if(!n||n==="HEAD")return"";let{stdout:s}=await zn("git",["-C",e,"status","--porcelain"],{encoding:"utf8"});return`git:(${n}${s.trim()?"*":""})`}catch{return null}}var Yn=class{folder;model;git;percent=0;meter=new yt(0);activity=Ai();live=!1;activitySince=Date.now();thinking="medium";ceiling=void 0;usage="";cost=0;skipPermissions=!1;constructor(t,n){this.folder=Ol(t),this.model=n.split("/").at(-1)||"no-model",this.git=""}invalidate(){}settling(){return this.meter.moving}atCeiling(){return this.ceiling!==void 0&&this.thinking===this.ceiling}levelChangedAt=0;setThinking(t){t!==this.thinking&&(this.thinking=t,this.levelChangedAt=Date.now())}levelFlashAmount(){return this.levelChangedAt===0?0:At(Date.now()-this.levelChangedAt)}flashing(){return this.levelFlashAmount()>0}levelText(t){if(this.atCeiling())return jr(this.thinking,ei,t);let n=this.levelChangedAt===0?Number.POSITIVE_INFINITY:t-this.levelChangedAt;return At(n)<=0?ai(this.thinking,this.thinking):Fr(this.thinking,{rest:Ct(this.thinking),lit:ti(this.thinking)},1-At(n))}meterValue(){return this.meter.value!==this.percent&&this.meter.set(this.percent),this.meter.step()}beginRun(){this.live=!0,this.activitySince=Date.now()}waitedMs(){return Date.now()-this.activitySince}abandonAnimations(){this.meter.snap(this.percent)}render(t){let n=Date.now(),s=this.percent===0&&this.meter.value===0?0:this.meterValue(),i=this.levelText(n),u=ci(this.model,i,this.folder,this.git),f=[Re(`${di(u,this.live?qe():"",this.live?this.waitedMs():void 0)} ${ui(s,this.usage,fi(this.cost))}`,t)];this.skipPermissions&&f.push(Re(O("Permissions OFF \u2014 critical commands and the repeat guard are not enforced",T.bad),t));let h=zs();h&&f.push(Re(O(h,T.warn),t));let w=Us(gt());w&&f.push(Re(O(w,T.accent),t));let S=Ri(this.activity,qe(),n),M=this.live?Dr(S,{base:Cn(this.waitedMs(),T.mute,T.warn,T.bad),bright:T.text,charMs:45},n):O(S,Cn(this.waitedMs(),T.mute,T.warn,T.bad));return f.push(Re(M,t)),f}},Xn=class{constructor(t){this.draw=t}draw;render(t){return this.draw(t)}invalidate(){}},Jn=class{constructor(t,n){this.editor=t;this.hud=n}editor;hud;focused=!1;invalidate(){this.editor.invalidate()}render(t){let n=Math.max(10,t-4),s=this.editor.render(n).filter(h=>It(h)>0),i=s.length>0?s:[""],u="\u2500".repeat(Math.max(0,t-2)),f=i.map(h=>{let w=Math.max(0,n-It(h));return`\u2502 ${h}${" ".repeat(w)} \u2502`});return[`\u250C${u}\u2510`,...f,`\u2514${u}\u2518`,...this.hud.render(t)]}handleInput(t){this.editor.handleInput(t)}};function Xl(e,t,n,s=!1,i=[]){let u=Math.max(24,n),f=u-4,h=(L,Z)=>{let me=It(L)>f?Re(L,f,"\u2026"):L,te=`${me}${" ".repeat(Math.max(0,f-It(me)))}`;return`\u2502 ${Z?Z(te):te} \u2502`},w="\u2500".repeat(u-2),S=[h(` ${t}`),...e.render(f).map(L=>h(L))];S.push(h(" type to filter \xB7 \u2191\u2193 move \xB7 enter select \xB7 esc cancel"));let M=i.flatMap(L=>L===""?[""]:ql(L,f)),j=M.length>0?[h(""),...M.map(L=>h(L,Z=>O(Z,T.mute)))]:[];if(!s)return["",`\u250C${w}\u2510`,...S,...j,`\u2514${w}\u2518`];let W=Nr(T.line,T.warn,Date.now(),1400),K=O("\u2502",W),I=(L,Z)=>O(`${L}${w}${Z}`,W),H=[...S,...j].map(L=>`${K}${L.slice(1,-1)}${K}`);return["",I("\u250C","\u2510"),...H,I("\u2514","\u2518")]}function Jl(e,t){let n=t.split(`
|
|
23
|
+
`).filter(Boolean),s=n.filter(f=>f.startsWith("Reason:")),i=n.filter(f=>!f.startsWith("Reason:")&&!f.startsWith("Allow tool:"));return[...e.endsWith(" wants to run")?[]:[e],...s,...i.length>0?["",...i]:[]]}function Me(e){let t=e.getContextUsage();if(t?.percent!==null&&t?.percent!==void 0)return Math.min(100,Math.round(t.percent));let n=e.model,i=[...e.state.messages].reverse().find(u=>u.role==="assistant")?.usage?.totalTokens;return!n||typeof i!="number"||!Number.isFinite(i)||n.contextWindow<=0?0:Math.min(100,Math.round(i/n.contextWindow*100))}function Vn(e){let n=[["init","write project notes to AGENTS.md"],["model","choose a model"],["providers","list providers"],["thinking","set thinking level"],["approval","set what needs approval"],["settings","turn permission checks on or off"],["trust","trust this folder's .hxf settings, prompts and skills (status | on | off)"],["connect","sign in with email:password (or a base64 credential), or paste a key"],["sync","re-sync models from howtofix.id"],["usage","show the account's quota and what it has spent"],["update","install the newest release"],["login","save a provider API key"],["logout","remove a provider"],["new","start a new session"],["resume","resume another session"],["compact","compact the session"],["name","name this session"],["stats","session tokens and cost, cache hit rate and misses"],["rtk","compress long tool output before the model reads it"],["diff","show the working tree diff"],["commit","stage everything and commit"],["undo","undo the last commit"],["rewind","go back to an earlier message (Esc Esc)"],["review","ask the agent to review the diff"],["tools","list active tools"],["skills","list loaded skills"],["preset","browse, install and remove preset skill bundles"],["roblox","login | logout | status | tunnel on/off \u2014 Roblox sign-in and workspace link (alone: RoToolbox status)"],["proxy","route requests through a proxy, or show the current one"],["export","write the transcript to a markdown file"],["copy","copy the last answer to the clipboard"],["agents","show spawned agents"],["goal","set or view this session's goal"],["plan","toggle plan mode (design before editing)"],["workflow","show or clear the pinned workflow panel"],["dcp","dynamic context pruning: on | off | status | blocks | stats | context | decompress <bN> | sweep"],["context","what the next request carries, and what pruning saved"],["decompress","reopen one compressed block, e.g. /decompress b2"],["sweep","close compressed blocks no ref resolves"],["session","show the current model"],["help","list commands"],["quit","quit"],["exit","quit (alias)"]].map(([s,i])=>({name:s,description:i}));for(let s of e.promptTemplates)n.push({name:s.name,description:s.description});for(let s of e.extensionRunner.getRegisteredCommands())n.push({name:s.invocationName,description:s.description});return n}function Zn(e,t){if(e!=="workflow")return;let n=Ve(t);if(!(typeof n.name!="string"||!Array.isArray(n.steps)))return n}function Zl(e,t){let n=Zn(e,t);return n?Pt(n):void 0}function Pt(e,t,n=!1){return s=>ur(e,[],s,t?.selectedPhase,t?Ql(e,t,n):void 0)}function Ql(e,t,n){return{filter:s=>Li(s,t.filter),footerText:ji(t,e.endedAt===void 0,n),filterLabel:Ni(t.filter),drill:t.expanded}}function ec(){let e=new qi(zi,{"tui.altScreen.pageUp":[],"tui.altScreen.pageDown":[],"tui.altScreen.halfPageUp":[],"tui.altScreen.halfPageDown":[],"tui.altScreen.top":[],"tui.altScreen.bottom":[]});Vi(e)}async function pu(e){let t=new Ul,n,s=new Bl(t,!0,void 0,{mouse:!0,onRightClickPaste:()=>n?.()}),i=new xt,u=new Yn(e.cwd,e.modelLabel);u.skipPermissions=mn();let f=o=>{let r=Date.now();(async()=>{try{let a=Xe(),l=k.getSessionStats().sessionId;if(!io){io=!0;try{await wr(a,{keep:l})}catch{}}let d=await hr(a,l,o);d&&r>=Dt&&(ro=d,Dt=r)}catch{}})()},h=(o=!1)=>{!o&&!u.live||Gi(e.cwd).then(r=>{r!==null&&(u.git=r,v())})},w=new Wl(s,Bi,{paddingX:1}),S=new Map,M=(o,r)=>{r===void 0?S.delete(o):typeof r=="function"?S.set(o,r):S.set(o,()=>r)},j=()=>Math.max(20,t.columns),W,K=0,I=Ii(),H,L=null,Z=!1,me,te=!1,Xi,_t=()=>{!H||!Z||M("workflow",o=>Pt(H,I,te)(o))},Qn=()=>{H&&(me=H.name),Z=!1,te=!1,M("workflow",void 0)};fr({onStop:o=>{L=o},isPaused:()=>I.paused});let eo=o=>{if(me===o.name)return;W=o;let r=o.endedAt??Date.now();K=Math.max(K,r+lr),H=o,Z=!0,M("workflow",a=>Pt(o,I,te)(a))},to=new Jn(w,u),k=e.session,no=e.setCompressToolOutput,oo=!1,Ot=()=>{let o=k.getSessionStats().cost;return u.cost=o,o},Lt=rs(e.maxBudgetUsd),so=!1,Ji=()=>{let o=Lt.check(Ot());o===void 0||so||(so=!0,k.isStreaming&&k.abort(),p("budget",is(o.spent,o.limit)))},he=()=>{u.ceiling=ni(k.model)},ge=Ss(P),Nt,Zi=async()=>!ge||!xs(ge)||vs(ge)?!1:(Nt??=(async()=>{try{let o=await As(P,ge);return o.renewed?(ge=o.credential,o.message&&p("connect",o.message),await k.modelRuntime.setRuntimeApiKey("howtofix",o.credential.accessToken),!0):(o.message&&p("connect",o.message),!1)}catch{return!1}finally{Nt=void 0}})(),await Nt),Ft,Xe=()=>Ft??=pr(e.cwd),ro,jt="",Dt=0,io=!1,be,Qi=()=>{let o=new Set(["session_info","usage","label","context_edit","custom","model_change","thinking_level_change"]),r=[],a=l=>{for(let d of l)o.has(d.entry.type)||r.push(d.entry.id),a(d.children)};return a(k.sessionManager.getTree()),r},ao=!1,ea=()=>{if(ao)return;ao=!0;let o=Hi().getResolvedBindings();Vi(new qi(zi,{...o,"app.tree.foldOrUp":["alt+left","ctrl+left"],"app.tree.unfoldOrDown":["alt+right","ctrl+right"],"app.tree.editLabel":["shift+l"],"app.tree.toggleLabelTimestamp":["shift+t"],"app.message.copy":["ctrl+x"],"app.tree.filter.default":["alt+0"],"app.tree.filter.noTools":["alt+1"],"app.tree.filter.userOnly":["alt+2"],"app.tree.filter.labeledOnly":["alt+3"],"app.tree.filter.all":["alt+4"],"app.tree.filter.cycleForward":["alt+f"],"app.tree.filter.cycleBackward":["alt+shift+f"]}))},lo=!1,ta=()=>{lo||(lo=!0,zl())},co=()=>{let o=k.sessionManager.getTree();if(o.length===0){p("rewind","nothing to rewind to yet");return}Xe().disabled&&p("rewind","conversation rewind only; this directory is not a git repository"),ta(),ea();let r=Math.max(8,Math.floor(t.rows*.6)),a=new Vl(o,k.sessionManager.getLeafId(),r*2,l=>{Wt(),na(l)},()=>Wt());if(!a.getTreeList().getSelectedNode()){p("rewind","nothing to rewind to yet");return}be=a,be.focused=!0,M("rewind",l=>be?.render(l)??[]),v()},Wt=()=>{be=void 0,M("rewind",void 0),v()},na=async o=>{let r=Xe(),l=k.getUserMessagesForForking().findIndex(c=>c.entryId===o),d=l>=0?mr(r,k.getSessionStats().sessionId)[l]:void 0,y=d?(await br(r,d)).length:0;if(y===0){await uo(o,void 0,"conversation");return}_(`Rewind to this point? ${y} file(s) differ`,[{value:"both",label:"conversation and code",description:`drop the messages after this point and restore ${y} file(s)`},{value:"conversation",label:"conversation only",description:"drop the messages after this point, leave the files alone"},{value:"code",label:"code only",description:`restore ${y} file(s), keep the conversation`}],c=>{uo(o,d,c)})},uo=async(o,r,a)=>{let l=[];if((a==="both"||a==="conversation")&&!k.isStreaming)try{let d=await k.navigateTree(o);if(d.cancelled){p("rewind","conversation rewind cancelled");return}l.push("conversation rewound"),i.items=St(k.state.messages),d.editorText&&(w.setText(d.editorText),l.push("prompt restored to the editor"))}catch(d){G(`conversation rewind failed: ${d instanceof Error?d.message:String(d)}`);return}if((a==="both"||a==="code")&&r){let d=await gr(Xe(),r);if(!d.ok){G(`code rewind failed: ${d.output}`);return}l.push(d.output),d.removed.length>0&&l.push(`removed ${d.removed.length} file(s)`),h()}p("rewind",l.join(`
|
|
24
|
+
`)||"nothing to do"),v()};h(!0),f("session start"),e.note&&i.items.push({id:"note",kind:"note",title:"note",body:e.note}),i.items.push(...St(k.state.messages)),u.percent=Me(k),Ot(),u.abandonAnimations(),u.setThinking(k.thinkingLevel),he(),w.setAutocompleteProvider(new Ki(Vn(k),e.cwd)),mi(k).then(o=>{o&&(u.usage=o,s.requestRender())});let fo=async o=>{let{checkForUpdate:r,checkFailedNote:a,installUpdate:l}=await import("./chunk-7CHDNTH6.js"),d=await r(o.current);if(!d.available){let c=a(d);c?p("update",c):o.install&&p("update",d.message);return}if(!o.install){p("update",`${d.message}. run /update to install it.`);return}C("note",`installing HowToFix ${d.latest}\u2026`);let y=await l({version:d.latest});C("note",void 0),p("update",y.message),v()};e.update&&fo(e.update);let re=null,po="",mo=!1,ho=[],Ee,Ut=()=>{},v=()=>{Ut(),s.requestRender()},C=(o,r)=>{u.activity=Ti(u.activity,o,r)},Kt=o=>{u.activity=Mi(u.activity,o)},Je=new Map,Ht=new Set,oa=()=>[...Je].map(([o,r])=>`${Ht.has(o)?"!":"\u2713"} ${o} \xD7${r}`).join(" | "),sa=()=>{let o=oa();C("tally",o||void 0)},_=(o,r,a,l,d=!1,y=[])=>{let c=new Hl(r,8,Bi.selectList);c.onSelect=m=>{re=null,Ee=void 0,a(m.value)},c.onCancel=()=>{re=null,Ee=void 0,l?.(),v()},Ee=()=>c.onCancel?.(),po=o,mo=d,ho=y,re=c,wo+=1,v()},p=(o,r)=>{i.items=Yr(i.items,{id:`cmd-${Date.now()}-${i.items.length}`,kind:"note",title:o,body:r}),C("tally",void 0),v()};tr(o=>{o.background&&p("agent",`${Xs(o)}
|
|
25
|
+
read it with /agents ${o.id}`)});let Bt=!1,ra=o=>{Bt||(Bt=!0,(async()=>{try{let r=(await k.modelRuntime.getAvailable()).filter(g=>se(g.provider)),a=new Set(r.map(g=>g.provider)),l=ye.find(g=>a.has(g)),d=l?(await k.modelRuntime.getAuth(l))?.auth?.apiKey:void 0;if(!d)return;let y=wt(r.map(g=>g.id)),{live:c,probed:m}=await bs(y,d,{exclude:o,limit:4});if(c.length===0)return;let b=re===null;p("gateway",`${c.length} of ${m.length} probed models answer right now (${c.join(", ")}); ${b?"the model picker is open below":"switch with /model"}.`),b&&Fe("/model")}catch{}finally{Bt=!1}})())},G=o=>{i.items.push({id:`err-${Date.now()}-${i.items.length}`,kind:"error",title:"failed",body:o});let r=xr(o);r!==void 0&&p("gateway",r);let a=vr(o);a!==void 0&&ra(a),C("tally",void 0),v()},Pe=o=>{k.setThinkingLevel(o,{persist:!0}),u.setThinking(o),he(),C("note",`thinking ${o}`),v()};Is((o,r)=>{let{promise:a,resolve:l}=Promise.withResolvers();return _(o,[{value:"allow",label:"allow"},{value:"deny",label:"deny"}],d=>l(d==="allow"),()=>l(!1),!0,Jl(o,r)),a});let Gt=new Map,go=o=>{let r=Wi({select:(a,l)=>{let{promise:d,resolve:y}=Promise.withResolvers();return _(a,l.map(c=>({value:c,label:c})),y,()=>y(void 0)),d},confirm:(a,l)=>{let{promise:d,resolve:y}=Promise.withResolvers();return _(`${a} \u2014 ${l}`,[{value:"yes",label:"yes"},{value:"no",label:"no"}],c=>y(c==="yes"),()=>y(!1)),d},input:a=>{let{promise:l,resolve:d}=Promise.withResolvers();return C("prompt",a),v(),ee=y=>{ee=void 0,C("prompt",void 0),d(y),v()},l},notify:(a,l)=>{l==="error"?G(a):p("mcp",a)},setStatus:(a,l)=>{l===void 0?Gt.delete(a):Gt.set(a,l),C("note",[...Gt.values()].join(" | ")||void 0),v()},setWidget:(a,l)=>{M(a,l),v()}});o.bindExtensions({uiContext:r,mode:"print",onError:a=>G(`${a.event}: ${a.error}`)}).catch(a=>G(a instanceof Error?a.message:String(a)))};go(k);let ve=new Dl,ia={invalidate:()=>i.invalidate(),render:o=>{let r=ve.render(Math.max(20,o)).length;return i.viewportHeight=Math.max(1,Math.max(8,t.rows)-r),i.render(o)},handleMouse:o=>{if(Ro(o))return nt(),{handled:!0};let r=o.type==="wheel"?o.wheelDelta??0:0;if(r!==0)return i.scrollOffset=Math.max(0,i.scrollOffset-r*3),v(),{handled:!0}}},aa=new Kl(ia,{follow:"none",overscroll:"contain"}),Ze=new Gl([{component:aa,grow:1,shrink:1},{component:ve,grow:0,shrink:0,basis:"auto"}]),bo="",wo=0,la=()=>`${re?`picker:${wo}`:"dock"}|${[...S.keys()].join(",")}`;Ut=()=>{let o=la();if(o===bo)return;bo=o,ve.clear();for(let a of S.values())ve.addChild(new Xn(a));let r=re;if(r){let a=po,l=mo,d=ho;ve.addChild({render:y=>Xl(r,a,y,l,d),invalidate:()=>{}})}else ve.addChild(to);Ze.invalidate()},Ut();let yo={focused:!1,invalidate(){i.invalidate(),to.invalidate(),re?.invalidate(),Ze.invalidate()},[Yi]:()=>Yl(Ze),render:o=>Ze.render(o),handleMouse(o){if(Ro(o))return nt(),{handled:!0}},handleInput(o){w.handleInput(o)}};s.setLayoutRoot(yo),s.setFocus(yo);let X=0,ce="",qt=!1,we=!1,Vt,xe="",ko=0,Ie=!1,Qe=Date.now(),et=!1,tt=new Map,$o=()=>{let o=new Set(k.getSteeringMessages().map(r=>r.trim()).filter(Boolean));for(let r of i.items)r.kind!=="user"||!r.pending||o.has(r.body.trim())||(r.pending=void 0)},vo=o=>{if(o.type==="agent_start"&&$o(),o.type==="agent_start"||o.type==="turn_start")o.type==="agent_start"&&Es(),u.live||u.beginRun(),ce="",we=!1,Ie=!1,Qe=Date.now(),xe="";else if(o.type==="message_update"&&o.assistantMessageEvent.type==="thinking_delta"){we=!0,xe===""&&(ko=Date.now()),xe+=o.assistantMessageEvent.delta;let r=`think-${X}`,a=i.items.find(d=>d.id===r),l=xe.split(`
|
|
26
26
|
`).slice(-6).join(`
|
|
27
|
-
`);a?a.body=l:
|
|
28
|
-
this freed almost nothing; the window may be too small for this work`:""}`:`${y}k tokens \xB7 older turns summarized`}else d="nothing to compact";r?(r.title=l,r.body=d,r.live=!1):
|
|
27
|
+
`);a?a.body=l:i.items.push({id:r,kind:"note",title:"thinking",body:l})}else if(o.type==="message_update"&&o.assistantMessageEvent.type==="thinking_end"){let r=`think-${X}`,a=i.items.find(l=>l.id===r);if(a){let l=Math.max(1,Math.round((Date.now()-ko)/1e3));a.title="thought",a.body=`${l}s \xB7 ${xe.length} chars of reasoning`}xe=""}else if(o.type==="message_update"&&o.assistantMessageEvent.type==="text_delta"){we=!0,ce+=o.assistantMessageEvent.delta;let r=We(ce),a=`live-${X}`,l=i.items.find(d=>d.id===a);l?l.body=r:i.items.push({id:a,kind:"assistant",title:"HowToFix",body:r})}else if(o.type==="tool_execution_start"){tt.set(o.toolCallId,o.args),we=!1,Ie=!1,Qe=Date.now();let r=`tool-${o.toolCallId}`,a=$e(o.toolName,o.args),l=i.items.find(d=>d.id===r);if(l?(l.kind="tool",l.title=o.toolName,l.body=a,l.live=!0):i.items.push({id:r,kind:"tool",title:o.toolName,body:a,live:!0}),Vt=o.toolName,o.toolName==="task"){let d=Js.filter(y=>y.status==="queued"||y.status==="running");C("note",d.map(y=>`${y.agent} ${y.status}`).join(" | ")||"agent running")}}else if(o.type==="tool_execution_update"){let r=Zl(o.toolName,o.partialResult);if(r){let a=`tool-${o.toolCallId}`,l=i.items.find(y=>y.id===a);l?l.panel=r:i.items.push({id:a,kind:"tool",title:o.toolName,body:$e(o.toolName,tt.get(o.toolCallId)),panel:r,live:!0});let d=Zn(o.toolName,o.partialResult);d&&me!==d.name&&eo(d),v()}}else if(o.type==="tool_execution_end"){u.percent=Me(k);let r=i.items.find(b=>b.id===`tool-${o.toolCallId}`);r&&(r.live=!1,r.body=$e(o.toolName,tt.get(o.toolCallId))),tt.delete(o.toolCallId),Vt=void 0,we=!0,Ie=!1,Je.set(o.toolName,(Je.get(o.toolName)??0)+1),o.isError&&Ht.add(o.toolName),sa();let a=Gr(o.toolName,o.result),l=qr(o.toolName,o.result),d=Zn(o.toolName,o.result),y=d?Pt(d):void 0;d&&me!==d.name&&eo(d);let c=i.items.find(b=>b.id===`tool-${o.toolCallId}`),m=vt(o.toolName,o.result,o.isError);c?(c.kind="result",c.call=c.body,c.body=m,c.live=!1,a.length>0&&(c.detail=a),l.length>0&&(c.full=l),y&&(c.panel=y)):i.items.push({id:`tool-${o.toolCallId}`,kind:"result",title:o.toolName,body:m,...a.length>0?{detail:a}:{},...l.length>0?{full:l}:{},...y?{panel:y}:{}}),(o.toolName==="bash"||o.toolName==="powershell"||o.toolName==="edit"||o.toolName==="write")&&h()}else if(o.type==="compaction_start"){we=!0;let r=o.reason==="manual"?"on request":"context is nearly full",a=i.items.find(y=>y.id===`compact-${X}`),l="compacting context",d=`${r} \xB7 summarizing the older turns`;a?(a.title=l,a.body=d):i.items.push({id:`compact-${X}`,kind:"note",title:l,body:d,live:!0}),C("note","compacting context")}else if(o.type==="compaction_end"){let r=i.items.find(y=>y.id===`compact-${X}`),a=o.result,l="compacted",d;if(o.aborted)d="cancelled";else if(o.errorMessage)d=`failed: ${o.errorMessage}`;else if(a){let y=Math.round(a.tokensBefore/1e3),c=a.estimatedTokensAfter!==void 0?Math.round(a.estimatedTokensAfter/1e3):void 0,m=a.estimatedTokensAfter!==void 0?a.tokensBefore-a.estimatedTokensAfter:void 0,b=m!==void 0&&m<2e3;d=c!==void 0?`${y}k \u2192 ${c}k tokens \xB7 older turns summarized${b?`
|
|
28
|
+
this freed almost nothing; the window may be too small for this work`:""}`:`${y}k tokens \xB7 older turns summarized`}else d="nothing to compact";r?(r.title=l,r.body=d,r.live=!1):i.items.push({id:`compact-${X}`,kind:"note",title:l,body:d}),u.percent=Me(k),C("note",void 0)}else if(o.type==="message_start"&&o.message.role==="user"){let r=Xr(o.message);r&&(i.items=Jr(i.items,r,`u-${o.message.timestamp}`)),$o()}else if(o.type==="message_end"&&o.message.role==="assistant"){let r=i.items.find(l=>l.id===`live-${X}`);r&&(r.id=`done-${X}`);let a=o.message.errorMessage;a&&r?(r.title="failed",r.kind="error",r.body=ce.trim()?`${a}
|
|
29
29
|
|
|
30
|
-
${ce.trim()}`:a):a&&
|
|
30
|
+
${ce.trim()}`:a):a&&i.items.push({id:`e-${o.message.timestamp}`,kind:"error",title:"failed",body:a}),X+=1,ce="",u.percent=Me(k)}else if(o.type==="agent_settled"){u.live=!1;let r=[...k.getSteeringMessages()].map(a=>a.trim()).filter(Boolean);if(r.length>0){let a=w.getText().trim();w.setText(a?`${r.join(`
|
|
31
31
|
`)}
|
|
32
32
|
${a}`:r.join(`
|
|
33
|
-
`));let l=new Set(r);for(let d of
|
|
34
|
-
`)}catch{}},l=async()=>{try{let d=new Set((await k.modelRuntime.getAvailable()).map(A=>A.provider).filter(A=>
|
|
33
|
+
`));let l=new Set(r);for(let d of i.items)d.kind==="user"&&d.pending&&l.has(d.body.trim())&&(d.pending=void 0);p("queued",`${r.length} unread message${r.length===1?"":"s"} were never read and are back in the editor`)}for(let a of i.items)a.kind==="user"&&a.pending&&(a.pending=void 0);if(f(jt),jt="",C("run",void 0),qt){let a=i.items.find(l=>l.id===`live-${X}`);a?(a.id=`stopped-${X}`,a.title="stopped",a.body=ce.trim()||"(no output)",a.live=!1):i.items.push({id:`stopped-${X}`,kind:"note",title:"stopped",body:"run cancelled"}),X+=1,ce="",p("stopped","run cancelled by Esc"),qt=!1}u.percent=Me(k),C("note",void 0),Kt(void 0),Gi(e.cwd).then(a=>{a!==null&&(u.git=a,v())}),w.disableSubmit=!1}else o.type==="thinking_level_changed"?u.setThinking(o.level):o.type==="auto_retry_start"?(C("note",void 0),Kt({attempt:o.attempt,maxAttempts:o.maxAttempts,error:o.errorMessage,until:Date.now()+o.delayMs})):o.type==="auto_retry_end"&&(Kt(void 0),o.success?p("retry",`answered on attempt ${o.attempt} after a retry`):C("note",`retry ${o.attempt} gave up${o.finalError?` \xB7 ${Hn(o.finalError)}`:""}`));Ji(),v()},zt=k.subscribe(vo),xo=setInterval(()=>{let o=W!==void 0&&Date.now()<K;if((et||k.isStreaming||u.settling()||i.entering()||re||o||u.atCeiling()||u.flashing()||u.activity.retry!==void 0)&&v(),(et||k.isStreaming)&&!we&&!Ie&&Date.now()-Qe>nc){Ie=!0;let r=Vt,a=Math.round((Date.now()-Qe)/1e3);C("note",r?`${r} has been running for ${a}s \u2014 it may be blocked; esc cancels`:`no answer yet after ${a}s \u2014 the provider may be stalled; ctrl+c cancels`),v()}},tc);xo.unref?.();let So=async o=>{Ee?.(),Ee=void 0,zt(),Ft&&yr(Ft,k.getSessionStats().sessionId),ro=void 0,Dt=0;let r=k.getSessionStats().sessionId;wn(r),yn(r),await st.dispose(),k.dispose(),k=o.session,no=o.setCompressToolOutput,st=new Ye({initial:Object.keys(Ne().mcpServers),apply:async(a,l)=>{if(await Se(),a.length>0||l.length>0){let d=[];a.length>0&&d.push(`connected ${a.join(", ")}`),l.length>0&&d.push(`stopped ${l.join(", ")}`),p(a.length>0?"mcp connected":"mcp stopped",d.join("; "))}},report:a=>G(a)}),X=0,ce="",i.items=[],i.scrollOffset=0,o.note&&i.items.push({id:"note",kind:"note",title:"note",body:o.note}),i.items.push(...St(k.state.messages)),u.model=o.modelLabel.split("/").at(-1)||"no-model",u.setThinking(k.thinkingLevel),he(),u.percent=Me(k),Ot(),u.abandonAnimations(),C("tally",void 0),C("run",void 0),w.setAutocompleteProvider(new Ki(Vn(k),e.cwd)),w.disableSubmit=!1,go(k),zt=k.subscribe(vo),v()},_e=async()=>{if(oo)return;oo=!0,clearInterval(xo),zt();try{let r=Os(_s);if(r.config.hooks.SessionEnd){let{outcome:a}=await Ls(r.config,"SessionEnd",{hook_event_name:"SessionEnd",cwd:process.cwd(),reason:"quit"},{cwd:process.cwd()});a.error&&p("hooks",`SessionEnd hook: ${a.error}`)}}catch{}await st.dispose();let o=k.getSessionStats().sessionId;Lt.close(k.getSessionStats().cost),wn(o),yn(o),k.dispose(),s.stop(),process.stdout.write("\x1B[0m"),process.exit(0)},Co=0,Ao=async(o=!1)=>{let r=Date.now();if(!o&&r-Co<600*1e3)return;Co=r;let a=d=>{if(process.env.HOWTOFIX_CHECKIN_DEBUG==="1")try{Il(`${P}/checkin-debug.log`,`${new Date().toISOString()} ${d}
|
|
34
|
+
`)}catch{}},l=async()=>{try{let d=new Set((await k.modelRuntime.getAvailable()).map(A=>A.provider).filter(A=>se(A))),y=ye.find(A=>d.has(A));if(a(`providers=${[...d].join(",")||"(none)"} target=${y??"(none)"}`),!y)return!1;let c=(await k.modelRuntime.getAuth(y))?.auth?.apiKey,m=c?.trim().match(/^\$\{?([A-Za-z_][A-Za-z0-9_]*)\}?$|^\{env:([A-Za-z_][A-Za-z0-9_]*)\}$/),b=A=>A?(process.env[A]??"").trim():"",g=m?b(m[1]??m[2])||void 0:c?.trim()||void 0;if(!g)for(let A of["HOWTOFIX_API_KEY","HOWTOFIX_VIP_API_KEY","HOWTOFIX_FREE_API_KEY"]){let R=b(A);if(R){g=R,a(`key dari fallback ${A}`);break}}if(a(`key=${g?`ada(${g.length})`:"(kosong)"}${m?" dari env":""}`),!g)return!1;let x=await Kn(g);if(a(`status ok=${x.ok} enabled=${x.enabled} claimed=${x.checkedInToday} msg=${x.message}`),!x.ok||!x.enabled||x.checkedInToday)return!0;let $=await Si(g);return a(`claim ok=${$.ok} awarded=${$.quotaAwarded} msg=${$.message}`),$.ok?(p("check-in",`daily check-in claimed: +${Un($.quotaAwarded)} credited to your howtofix.id account`),v()):$.blocked&&p("check-in",$.message),!0}catch(d){return a(`error ${d.message}`),!1}};await l()||(await new Promise(d=>setTimeout(d,4e3)),await l())},To=async o=>{let r=Lt.check(k.getSessionStats().cost);if(r!==void 0){G(`budget reached: $${r.spent.toFixed(4)} of $${r.limit.toFixed(2)} \u2014 raise it with --max-budget-usd, or start without the flag`);return}let a=k.isStreaming,l=`you-${Date.now()}`;i.items.push({id:l,kind:"user",title:"you",body:o,pending:a?!0:void 0}),a||(C("tally",void 0),Je.clear(),Ht.clear(),C("run","thinking"),u.beginRun()),v(),w.disableSubmit=!1;let d=Rs(o,e.cwd);jt=o,await Zi(),et=!0;let y=a?k.prompt(d,{streamingBehavior:"steer"}):k.prompt(d);et=!1,y.then(()=>Ao()).catch(c=>G(c instanceof Error?c.message:String(c)))},Yt=o=>{let r=o.trim();if(r){if(ee){let a=ee;ee=void 0,w.setText(""),a(r);return}if(w.setText(""),w.addToHistory(r),r.startsWith("!")){let a=r.slice(1).trim();if(!a)return;i.items.push({id:`sh-${Date.now()}`,kind:"tool",title:"$",body:a}),C("run","shell"),v(),k.executeBash(a,l=>{C("run",`shell \xB7 ${l.length} bytes`),v()}).then(l=>{let d=l.output.trim();i.items.push({id:`sh-out-${Date.now()}`,kind:l.exitCode===0?"result":"error",title:`exit ${l.exitCode??"?"}`,body:d||"(no output)"}),C("tally",void 0),v()}).catch(l=>G(l instanceof Error?l.message:String(l)));return}if(r.startsWith("/")){Fe(r);return}To(r)}};w.onSubmit=Yt;let Xt=0,Oe={cancel:null},Mo=0,nt=()=>{Mr().then(o=>{o.ok?w.insertTextAtCursor(o.text):p("paste",o.reason),v()}).catch(o=>{p("paste",`could not read the clipboard: ${o instanceof Error?o.message:String(o)}`),v()})};n=nt;let Ro=o=>hn(ke(P).rightClickPaste)&&o.type==="press"&&o.button==="right";s.addInputListener(o=>{if(be){if(Y(o,"escape"))return Wt(),{consume:!0};let a=Hi(),l=a.matches(o,"tui.select.up"),d=a.matches(o,"tui.select.down");if(l||d){let c=be.getTreeList().getSelectedNode()?.entry.id,m=Qi(),b=c===void 0?-1:m.indexOf(c);if(l?b===0:b===m.length-1)return v(),{consume:!0}}return be.handleInput(o),v(),{consume:!0}}if(Z&&H&&Y(o,"escape"))return te?(te=!1,p("workflow","panel keys off; the editor has the keyboard")):I.expanded?(I.expanded=!1,p("workflow","collapsed the drill-in")):(Qn(),p("workflow","panel unpinned; the run is still in the transcript")),_t(),v(),{consume:!0};if(re)return re.handleInput(o),v(),{consume:!0};if(Y(o,"escape")){if(Oe.cancel)return Oe.cancel(),p("connect","sign-in cancelled \u2014 run /connect again when you have a token"),v(),{consume:!0};if(k.isStreaming){qt=!0;let l=[...k.getSteeringMessages()].map(d=>d.trim()).filter(Boolean);if(l.length>0){let d=w.getText().trim();w.setText(d?`${l.join(`
|
|
35
35
|
`)}
|
|
36
36
|
${d}`:l.join(`
|
|
37
|
-
`));let y=new Set(l);for(let c of
|
|
38
|
-
`)}catch{return`could not write ${a}; the models were not added`}let $=!1;try{await k.modelRuntime.refresh(),$=!0}catch{$=!1}let A=x.changed>0?`, repaired ${x.changed}`:"",R=$?"":"; restart the CLI to see them all",U=d?` (created ${a})`:"";return m===0?`all ${r.length} models were already configured${A}${U}${R}`:`added ${m} model(s) to "${o}"${A}${U}${R}`},Le=(o,r)=>{(async()=>{if(!o){let g=await
|
|
37
|
+
`));let y=new Set(l);for(let c of i.items)c.kind==="user"&&c.pending&&y.has(c.body.trim())&&(c.pending=void 0);p("queued",`${l.length} unread message${l.length===1?"":"s"} returned to the editor`)}return k.abort(),C("note","stopping"),v(),{consume:!0}}let a=Date.now();if(w.getText().length===0&&a-Xt<600)return Xt=0,co(),{consume:!0};Xt=a;return}if(Y(o,"ctrl+c")||Sr(o)){if(k.isStreaming)k.abort(),C("note","stopping"),v();else if(w.getText().length>0)w.setText(""),C("note","draft cleared; ctrl+c again quits"),v();else{let a=Date.now();a-Mo<2e3?_e():(Mo=a,C("note","press ctrl+c again to quit"),v())}return{consume:!0}}if(Y(o,"ctrl+d")&&w.getText().length===0)return _e(),{consume:!0};let r=Math.max(1,i.viewportHeight-1);if(Y(o,"pageUp"))return i.scrollOffset+=r,v(),{consume:!0};if(Y(o,"pageDown"))return i.scrollOffset=Math.max(0,i.scrollOffset-r),v(),{consume:!0};if(Y(o,"home"))return i.scrollOffset=Number.MAX_SAFE_INTEGER,v(),{consume:!0};if(Y(o,"end"))return i.scrollOffset=0,v(),{consume:!0};if(Y(o,"ctrl+v"))return nt(),{consume:!0};if(Y(o,"ctrl+l"))return i.scrollOffset=0,s.scrollToBottom(),v(),{consume:!0};if(Y(o,"ctrl+e")){let a=[...i.items].reverse().find(l=>(l.full?.length??0)>0);return a?(a.expanded=a.expanded!==!0,v(),{consume:!0}):(p("expand","nothing to expand in this transcript yet"),{consume:!0})}if(Y(o,"ctrl+o")&&!k.isStreaming)return i.items=[{id:"cleared",kind:"note",title:"bench",body:"screen cleared. session history is still stored."}],v(),{consume:!0};if(Y(o,"ctrl+t"))return Pe(oi(u.thinking)),{consume:!0};if(Y(o,"ctrl+shift+t"))return Pe(si(u.thinking)),{consume:!0};if(Y(o,Fi)&&Z&&H)return te=!te,p("workflow",te?"panel keys active; Esc gives the keyboard back":"panel keys off; the editor has the keyboard"),_t(),v(),{consume:!0};if(te&&Z&&H){let a=_i(o);if(a){let l=$n(H,Date.now());if(a==="stop")return L?(L(),L=null,p("workflow","stopping the run; in-flight agents resolve as null")):p("workflow","the run has already finished"),{consume:!0};if(a==="save"){let d=Di(Xi,ss);return p("workflow",d.ok?`saved ${d.path}`:d.reason),v(),{consume:!0}}return Object.assign(I,Oi(I,a,l)),_t(),v(),{consume:!0}}}});let Jt=o=>{let r=a=>{C("prompt",`API key for ${a}. Paste it, then press enter.`),v();let l=ee;ee=d=>{ee=l;let y=d.trim();if(!y){C("prompt",void 0),v();return}k.modelRuntime.setRuntimeApiKey(a,y).then(()=>k.modelRuntime.login(a,"api_key",{prompt:async()=>y,notify:()=>{}}).then(()=>p("login",`saved API key for ${a}`),c=>p("login",`key set for this session, but it could not be saved (${c instanceof Error?c.message:String(c)}); run /login again after restarting`)),c=>p("login",c instanceof Error?c.message:String(c)))}};if(o){r(o);return}k.modelRuntime.getAvailable().then(a=>{let l=[...new Set(a.map(d=>d.provider))].sort();if(l.length===0){p("login","no providers are configured; pass one explicitly, e.g. /login nrimo");return}_("Login",l.map(d=>({value:d,label:d})),r)},a=>p("login",a instanceof Error?a.message:String(a)))},Eo=async(o,r)=>{let a=le(P,"models.json"),l,d=!1;try{l=JSON.parse(Gn(a,"utf8"))}catch(D){if(!(D instanceof Error&&"code"in D&&D.code==="ENOENT"))return`could not read ${a}; the models were not added`;l={providers:{}},d=!0}(!l.providers||typeof l.providers!="object")&&(l.providers={});let y=l.providers[o];y||(y=ds(),l.providers[o]=y,d=!0);let c=Array.isArray(y.models)?y.models:[],m=hs(c,r),b=await us(P).catch(()=>({index:new Map})),g=await ws((await k.modelRuntime.getAuth(o))?.auth?.apiKey??""),x=ms(ps(c,r,b.index,g));y.models=x.models;try{Ui(P,{recursive:!0}),ie(a,`${JSON.stringify(l,null,2)}
|
|
38
|
+
`)}catch{return`could not write ${a}; the models were not added`}let $=!1;try{await k.modelRuntime.refresh(),$=!0}catch{$=!1}let A=x.changed>0?`, repaired ${x.changed}`:"",R=$?"":"; restart the CLI to see them all",U=d?` (created ${a})`:"";return m===0?`all ${r.length} models were already configured${A}${U}${R}`:`added ${m} model(s) to "${o}"${A}${U}${R}`},Le=(o,r)=>{(async()=>{if(!o){let g=await ks({onProgress:$=>{let A="";try{let U=le(P,".howtofix");Ui(U,{recursive:!0,mode:448});let D=le(U,"connect-url.txt"),B=$.kind==="browser"?[$.url]:[$.url,`code: ${$.code}`];qn(D,B.join(`
|
|
39
39
|
`)+`
|
|
40
40
|
`,{mode:384}),A=D}catch{A=""}let R=A?[` saved to ${A}`]:[];$.kind==="browser"?(He($.url),p("connect",["finish signing in to howtofix.id:"," a browser window is opening \u2014 approve the sign-in there",` if it did not open, visit ${$.url}`,...R].join(`
|
|
41
41
|
`))):(He($.url),p("connect",["finish signing in to howtofix.id:",` 1. go to ${$.url}`,` 2. enter the code: ${$.code}`," waiting\u2026",...R].join(`
|
|
42
42
|
`))),v()}});if(g.ok){C("prompt",void 0),ee=void 0,Le(g.token,g.credential);return}let x=await He(an);p("connect",[`browser sign-in: ${g.message}`,"","connect with a token instead:",` 1. ${x?"the keys page is opening in your browser":`open ${an}`}`," 2. sign in if asked, then create a key (starts with sk-)"," 3. run /connect <token>"," or /connect again, and paste the key when asked"].join(`
|
|
43
|
-
`)),v();return}if(!
|
|
43
|
+
`)),v();return}if(!fs(o)){p("connect","that does not look like a howtofix token; the Console issues tokens that start with sk-");return}C("note",`connecting to howtofix.id (${ln(o)})`),v();let a=await cn(o);if(!a.ok){C("note",void 0),p("connect",a.message),v();return}let l=await Eo("howtofix",a.models);await k.modelRuntime.setRuntimeApiKey("howtofix",o);let d;try{await k.modelRuntime.login("howtofix","api_key",{prompt:async()=>o,notify:()=>{}})}catch(g){d=`this sign-in could not be saved (${g instanceof Error?g.message:String(g)}); run /connect again after restarting`}r&&(Cs(P,r)?ge=r:d=`this sign-in renews itself, but the pair could not be saved to ${$s(P)}; it will expire in hours and need /connect again`);let y=!!k.model&&k.model?.provider!==void 0&&u.model!=="unknown",c,m;if(!y)try{let g=(await k.modelRuntime.getAvailable()).filter(A=>se(A.provider)),$=wt(g.map(A=>A.id)).slice(0,4);for(let A of $){if(!(await gs(A,o)).ok)continue;let U=g.find(D=>D.id===A);if(U){await k.setModel(U),u.model=U.id,he(),c=`${U.provider}/${U.id}`;break}}c||(m=$.length>0?`none of the first ${$.length} models answered (${$[0]} did not)`:"the account lists no chat model")}catch(g){m=g instanceof Error?g.message:String(g)}C("note",void 0);let b=await Ae(o);p("connect",[`connected ${ln(o)} \u2014 ${a.message}`,l,ot("howtofix",b),c?`using ${c} (change it with /model)`:`pick a model with /model, then send a prompt${m?` (auto-select failed: ${m})`:""}`,d].filter(g=>!!g).join(`
|
|
44
44
|
`)),v()})().catch(a=>{C("note",void 0),p("connect",a instanceof Error?a.message:String(a)),v()})},Po=o=>{(async()=>{let r=Wn(o);if(!r){p("connect",["that is not an account credential."," /connect <email>:<password>"," /connect <base64 of email:password>"].join(`
|
|
45
|
-
`)),v();return}C("note",`signing in as ${r.username}`),v();let{token:a}=await ys
|
|
45
|
+
`)),v();return}C("note",`signing in as ${r.username}`),v();let{token:a}=await yi(ys,r.username,r.password,it),l=bi(P,r.username,r.password);C("note",void 0),p("connect",[`signed in as ${r.username}`,"using the CLI key this account owns \u2014 no new key was made",l?"credential stored \u2014 /connect will not ask again":"could not store the credential, so the next connect will ask again"].join(`
|
|
46
46
|
`)),v(),Le(a)})().catch(r=>{C("note",void 0),p("connect",r instanceof Error?r.message:String(r)),v()})},ot=(o,r)=>{if(!r.ok)return[`${o} account`,` ${r.message}`].join(`
|
|
47
47
|
`);if(r.unlimited)return[`${o} account`," quota no limit on this token"].join(`
|
|
48
48
|
`);if(r.limit===void 0||r.used===void 0){let a=[`${o} account`],l=d=>`${d.toFixed(2)} ${r.unit}`;return r.limit!==void 0&&a.push(` granted ${l(r.limit)}`),r.used!==void 0&&a.push(` spent ${l(r.used)}`),r.remaining!==void 0&&a.push(` remaining ${l(r.remaining)}`),a.join(`
|
|
49
|
-
`)}return
|
|
50
|
-
`)},Ne=()=>({mcpServers:
|
|
49
|
+
`)}return pi(o,r.limit,r.used,r.unit).join(`
|
|
50
|
+
`)},Ne=()=>({mcpServers:Ns()}),ca=o=>{let r=Object.keys(o??{});return r.length===0?[]:r.map(a=>` mcp ${a} ${lt(o[a])}`)},da=o=>{let r=Jo(o.dir,o.manifest),a=o.manifest.skills.join(", ");return[o.manifest.description,` category ${o.manifest.category}`,` version ${o.manifest.version}`,` skills ${a}`,o.manifest.prompt?` prompt ${o.manifest.prompt}`:" prompt (none)",` size ${r} bytes of skill text`,` source ${o.source}`,...ca(o.manifest.mcp)].join(`
|
|
51
51
|
`)},Io=o=>{let r=[da(o),""];if(o.manifest.prompt){let a=le(o.dir,o.manifest.prompt);Et(a)&&r.push(`--- ${o.manifest.prompt} ---`,Gn(a,"utf8").trim(),"")}for(let a of o.manifest.skills){let l=le(o.dir,"skills",a,"SKILL.md");Et(l)&&r.push(`--- skills/${a}/SKILL.md ---`,Gn(l,"utf8").trim(),"")}return r.join(`
|
|
52
52
|
`)},Se=async()=>{await k.reload()},Zt=!1,_o=async o=>{if(Zt){p("preset","an install is already running; wait for it to finish");return}Zt=!0;try{let r;try{r=await o()}catch(c){G(`preset not installed: ${c instanceof Error?c.message:String(c)}`);return}if(!r.ok||!r.name){G(`preset not installed:
|
|
53
53
|
${r.problems.join(`
|
|
54
54
|
`)}`);return}await Se();let a=ne(e.cwd).entries.find(c=>c.manifest.name===r.name),l=a?.manifest.integrates||a?.manifest.mcp,d=l?`
|
|
55
55
|
integration disabled by default; run /preset enable ${r.name} when you want to use it`:await Oo(r.name);l&&a&&qn(le(a.dir,".disabled"),`installed
|
|
56
56
|
`);let y=r.modelInvocable===!1?`its skill ${r.skill} is invoke-only (disable-model-invocation): the model cannot choose it, run /skill:${r.skill} yourself`:"its skill is in the model's catalogue from the next message";p("preset",`installed ${r.name} into ${r.target}
|
|
57
|
-
${y}${d}`)}finally{Zt=!1}},
|
|
57
|
+
${y}${d}`)}finally{Zt=!1}},st=new Ye({initial:Object.keys(Ne().mcpServers),apply:async(o,r)=>{if(await Se(),o.length>0||r.length>0){let a=[];o.length>0&&a.push(`connected ${o.join(", ")}`),r.length>0&&a.push(`stopped ${r.join(", ")}`),p(o.length>0?"mcp connected":"mcp stopped",a.join("; "))}},report:o=>G(o)}),rt=async()=>{let o=Object.keys(Ne().mcpServers);return await st.reconcile(o)},Oo=async o=>{let{entries:r}=ne(e.cwd),l=r.find(c=>c.manifest.name===o)?.manifest.mcp;if(!l||Object.keys(l).length===0)return"";let d=nn(l);if(d.problems.length>0)return`
|
|
58
58
|
MCP: ${d.problems.join("; ")}`;let y=[];if(d.added.length>0){let c=await rt(),m=d.added.filter(b=>c.added.includes(b));y.push(m.length>0?`MCP servers connected: ${m.join(", ")}`:`MCP servers added to mcp.json: ${d.added.join(", ")}`)}return d.skipped.length>0&&y.push(`MCP servers kept as they were (already configured): ${d.skipped.join(", ")}`),y.length>0?`
|
|
59
59
|
${y.join(`
|
|
60
60
|
`)}`:""},Lo=o=>_o(async()=>Qo(o,dt(e.cwd))),No=o=>{let r=o.sizeKb>=1024?`${(o.sizeKb/1024).toFixed(1)} MB`:`${o.sizeKb} KB`;return p("preset",[`downloading ${o.title}`,` from ${o.repo} @ ${o.sha.slice(0,7)}`,` skill ${o.skill}${o.modelInvocable===!1?" (invoke-only: the model cannot choose it)":""}`,` size ~${r} \xB7 ${o.license}`," checking the pinned commit and the contents the registry recorded\u2026"].join(`
|
|
61
|
-
`)),_o(()=>
|
|
61
|
+
`)),_o(()=>ns(o,dt(e.cwd)))},Qt=(o,r)=>{_(r,o.map(a=>({value:a.name,label:a.title,description:a.description})),a=>{let l=o.find(y=>y.name===a);if(!l)return;let d=l.sizeKb>=1024?`${(l.sizeKb/1024).toFixed(1)} MB`:`${l.sizeKb} KB`;_(l.title,[{value:"install",label:"Install",description:`download ~${d} and add its skill to this project`},{value:"view",label:"View contents",description:"read what it contains before downloading"},{value:"back",label:"Back",description:"return to the menu"}],y=>{if(y==="install"){No(l);return}if(y==="view"){p(`preset ${l.name}`,[`${l.description}`,"",`skill ${l.skill}`,`source ${l.repo} @ ${l.sha.slice(0,7)}`,`licence ${l.license}`,`size ~${d}`,`category ${l.category}`,`model ${l.modelInvocable===!1?"invoke-only \u2014 the model cannot choose it, only /skill:"+l.skill:"the model can choose it from its catalogue"}`,"","Install downloads the skill and adds it to this project."].join(`
|
|
62
62
|
`));return}jo()})},()=>v())},Ce=(o,r)=>{_(r,o.map(a=>({value:a.manifest.name,label:a.manifest.title,description:a.manifest.skills.length>0?`${a.manifest.skills.join(", ")} \u2014 ${a.manifest.description}`:a.manifest.description})),a=>{let l=o.find(d=>d.manifest.name===a);l&&_(l.manifest.title,[{value:"install",label:"Install",description:"add its skills and rules to this project"},{value:"view",label:"View contents",description:"read the skills and prompt first"},{value:"back",label:"Back",description:"return to the menu"}],d=>{if(d==="install"){Lo(l.dir);return}if(d==="view"){p(`preset ${l.manifest.name}`,Io(l));return}Uo("")})},()=>v())},Fo=o=>o.filter(r=>r.manifest.integrates!==void 0),ua=()=>{let{entries:o}=ne(e.cwd),r=Fo(o);if(r.length===0){p("integrations","nothing installed that drives another application. /preset lists the rest.");return}Ce(r,"Integrations")},jo=()=>{let{entries:o}=ne(e.cwd),r=[{value:"skills",label:"Skills",description:"bundles of skills and prompt text, installed into the project"},{value:"mcp",label:"MCP",description:"Model Context Protocol servers, added to mcp.json"}],a=Fo(o).length;a>0&&r.push({value:"integrations",label:"Integrations",description:`${a} that drive another application, and need setup there first`}),_("Presets",r,l=>l==="mcp"?en():l==="integrations"?ua():fa())},en=()=>{let{entries:o,problems:r}=Ho();if(r.length>0&&p("mcp problems",r.join(`
|
|
63
63
|
`)),o.length===0){p("mcp catalogue","no servers in the catalogue. run /mcp to inspect the ones already configured.");return}let a=new Set(Object.keys(Ne().mcpServers)),l=new Map,d=[];for(let y of Bo(o)){let c=Go(o,y);l.set(y,()=>Do(c,y));let m=c.filter(b=>a.has(b.name)).length;d.push({value:y,label:y,description:`${c.map(b=>b.title).join(", ")}${m>0?` \xB7 ${m} configured`:""}`})}l.set("all-mcp",()=>Do(o,"All MCP servers")),d.push({value:"all-mcp",label:"All servers",description:`${o.length} available${a.size>0?`, ${a.size} already configured`:""}`}),_("MCP servers",d,y=>l.get(y)?.())},Do=(o,r)=>{let a=Ne().mcpServers;_(r,o.map(l=>{let d=a[l.name]!==void 0?"configured \xB7 ":"";return{value:l.name,label:l.title,description:`${d}${l.description}`}}),l=>{let d=qo(o,l);if(!d)return;let y=a[d.name]!==void 0,c=Vo(d),m=[d.description,"",`server ${d.name}`,`runs ${lt(ct(d))}`,...d.needs&&d.needs.length>0?[`needs ${d.needs.join(", ")}`,c.length>0?` ${c.join(", ")} ${c.length===1?"is":"are"} not set in this shell \u2014 the value is read at connect time, so export it before the next session`:" all set in this shell"]:[],...d.docs?[`docs ${d.docs}`]:[],"",y?"already in mcp.json \u2014 removing it takes the entry out; nothing else changes":"install writes this server into mcp.json. nothing is downloaded, and it connects on the next session"].join(`
|
|
64
64
|
`),b=y?[{value:"remove",label:"Remove",description:"take the server out of mcp.json"},{value:"view",label:"Details",description:"what it runs and what it needs"},{value:"back",label:"Back",description:"return to the list"}]:[{value:"install",label:"Install",description:"add the server to mcp.json"},{value:"view",label:"Details",description:"what it runs and what it needs"},{value:"back",label:"Back",description:"return to the list"}];_(d.title,b,g=>{if(g==="view"){p(`mcp ${d.name}`,m);return}if(g==="install"){let x=[];if(d.preset){let R=le(zo(),"mcp",d.preset.replace(/^mcp-/,""));if(Et(le(R,"preset.json"))){let U=Zo(R,dt(e.cwd));U.ok||x.push(...U.problems)}}let $=nn({[d.name]:ct(d)});if(x.push(...$.problems),x.length>0){G(`mcp not installed:
|
|
@@ -69,42 +69,48 @@ ${y}${d}`)}finally{Zt=!1}},it=new Ye({initial:Object.keys(Ne().mcpServers),apply
|
|
|
69
69
|
${x.problems.join(`
|
|
70
70
|
`)}`);return}rt().then($=>{p("mcp remove",$.removed.length>0?`removed ${$.removed.join(", ")} from mcp.json and stopped ${$.removed.length===1?"it":"them"}`:x.removed.length>0?`removed ${d.name} from mcp.json`:`${d.name} was not in mcp.json`)}).catch($=>{G(`mcp removed from config but the session was not updated: ${$ instanceof Error?$.message:String($)}`)});return}en()})},()=>en())},fa=()=>{let{entries:o,problems:r}=ne(e.cwd),{entries:a,problems:l}=ut();r.length>0&&p("preset problems",r.join(`
|
|
71
71
|
`)),l.length>0&&p("preset problems",l.join(`
|
|
72
|
-
`));let d=o.filter(m=>m.source==="installed"),y=new Map,c=[];d.length>0&&(y.set("installed",()=>Ce(d,"Installed presets")),c.push({value:"installed",label:"Installed",description:`${d.length} active`}));for(let m of Yo(o)){let b=Xo(o,m),g=
|
|
72
|
+
`));let d=o.filter(m=>m.source==="installed"),y=new Map,c=[];d.length>0&&(y.set("installed",()=>Ce(d,"Installed presets")),c.push({value:"installed",label:"Installed",description:`${d.length} active`}));for(let m of Yo(o)){let b=Xo(o,m),g=sn(a,m);y.set(m,()=>g.length>0?Wo(b,m,g):Ce(b,m));let x=b.map($=>`${$.manifest.title} (${$.manifest.skills.join(", ")})`).join(", ");c.push({value:m,label:m,description:`${x}${g.length>0?` \xB7 ${g.length} more to download`:""}`})}for(let m of ts(a)){if(o.some(g=>g.manifest.category===m))continue;let b=sn(a,m);y.set(m,()=>Qt(b,m)),c.push({value:m,label:m,description:`${b.length} to download`})}if(y.set("all",()=>Ce(o,"All presets")),c.push({value:"all",label:"All presets",description:`${o.length} ready to install`}),a.length>0){y.set("hub",()=>Wo([],"Community presets",a));let m=new Set(a.map(b=>b.repo)).size;c.push({value:"hub",label:"Community",description:`${a.length} to download, from ${m} projects`})}_("Skill presets",c,m=>y.get(m)?.())},Wo=(o,r,a)=>{if(a.length===0){Ce(o,r);return}if(o.length===0){Qt(a,`${r} (download)`);return}_(r,[{value:"local",label:`Included (${o.length})`,description:"already on disk, no download"},{value:"hub",label:`Downloadable (${a.length})`,description:"fetched when installed"}],l=>l==="local"?Ce(o,r):Qt(a,r))},Uo=o=>{let[r,...a]=o.trim().split(/\s+/),l=a.join(" ").trim();if(!r){jo();return}if(r==="list"){let{entries:d}=ne(e.cwd),y=d.filter(c=>c.source==="installed");if(y.length===0){p("preset list","nothing installed. run /preset to browse the catalogue.");return}p("preset list",y.map(c=>`${c.manifest.name} ${c.manifest.version} [${on(c.dir)?"disabled":"active"}]
|
|
73
73
|
${c.manifest.description}
|
|
74
74
|
${c.dir}`).join(`
|
|
75
|
-
`));return}if(r==="show"){if(!l){p("preset show","usage: /preset show <name>");return}let{entries:d}=ne(e.cwd),y=d.find(g=>g.manifest.name===l);if(y){p(`preset ${l}`,Io(y));return}let{entries:c}=ut(),m=
|
|
76
|
-
`));return}if(r==="add"){if(!l){p("preset add","usage: /preset add <git-url | directory>");return}Lo(l);return}if(r==="add-hub"){if(!l){p("preset add-hub","usage: /preset add-hub <name> (see /preset for names)");return}let{entries:d}=ut(),y=
|
|
77
|
-
`);let c=d.manifest.mcp?at(Object.keys(d.manifest.mcp)):{removed:[],kept:[],problems:[]};rt().then(()=>Se()).then(()=>p("preset",`disabled ${l}${c.removed.length?`; stopped ${c.removed.join(", ")}`:""}`)).catch(m=>G(`preset disable failed: ${m instanceof Error?m.message:String(m)}`));return}_l(y,{force:!0}),Oo(l).then(c=>Se().then(()=>p("preset",`enabled ${l}${c}`))).catch(c=>G(`preset enable failed: ${c instanceof Error?c.message:String(c)}`));return}if(r==="remove"){if(!l){p("preset remove","usage: /preset remove <name>");return}let d=
|
|
75
|
+
`));return}if(r==="show"){if(!l){p("preset show","usage: /preset show <name>");return}let{entries:d}=ne(e.cwd),y=d.find(g=>g.manifest.name===l);if(y){p(`preset ${l}`,Io(y));return}let{entries:c}=ut(),m=rn(c,l);if(!m){p("preset show",`no preset named "${l}". run /preset to list them.`);return}let b=m.sizeKb>=1024?`${(m.sizeKb/1024).toFixed(1)} MB`:`${m.sizeKb} KB`;p(`preset ${l}`,[m.description,"",`skill ${m.skill}`,`source ${m.repo} @ ${m.sha.slice(0,7)}`,`licence ${m.license}`,`size ~${b}`,`category ${m.category}`,"","not installed. install it from /preset, or: /preset add-hub "+m.name].join(`
|
|
76
|
+
`));return}if(r==="add"){if(!l){p("preset add","usage: /preset add <git-url | directory>");return}Lo(l);return}if(r==="add-hub"){if(!l){p("preset add-hub","usage: /preset add-hub <name> (see /preset for names)");return}let{entries:d}=ut(),y=rn(d,l);if(!y){p("preset add-hub",`"${l}" is not in the community registry. run /preset to browse it.`);return}No(y);return}if(r==="enable"||r==="disable"){if(!l){p(`preset ${r}`,`usage: /preset ${r} <name>`);return}let d=ne(e.cwd).entries.find(c=>c.manifest.name===l&&c.source==="installed");if(!d){p(`preset ${r}`,`no installed preset named "${l}"`);return}let y=le(d.dir,".disabled");if(r==="disable"){qn(y,`disabled
|
|
77
|
+
`);let c=d.manifest.mcp?at(Object.keys(d.manifest.mcp)):{removed:[],kept:[],problems:[]};rt().then(()=>Se()).then(()=>p("preset",`disabled ${l}${c.removed.length?`; stopped ${c.removed.join(", ")}`:""}`)).catch(m=>G(`preset disable failed: ${m instanceof Error?m.message:String(m)}`));return}_l(y,{force:!0}),Oo(l).then(c=>Se().then(()=>p("preset",`enabled ${l}${c}`))).catch(c=>G(`preset enable failed: ${c instanceof Error?c.message:String(c)}`));return}if(r==="remove"){if(!l){p("preset remove","usage: /preset remove <name>");return}let d=es(l,e.cwd);if(d.problems.length>0){p("preset remove",d.problems.join(`
|
|
78
78
|
`));return}let c=ne(e.cwd).entries.find($=>$.manifest.name===l),m=new Set;for(let $ of ne(e.cwd).entries)if($.manifest.name!==l)for(let A of Object.keys($.manifest.mcp??{}))m.add(A);let b=c?.manifest.mcp?at(Object.keys(c.manifest.mcp),m):{removed:[],kept:[],problems:[]},g=b.removed.length>0?`
|
|
79
79
|
MCP servers removed from mcp.json: ${b.removed.join(", ")}`:b.kept.length>0?`
|
|
80
80
|
MCP servers kept (still used by another preset): ${b.kept.join(", ")}`:"",x=b.problems.length>0?`
|
|
81
81
|
MCP: ${b.problems.join("; ")}`:"";Se().then(()=>{p("preset",`removed ${l}
|
|
82
82
|
${d.removed.join(`
|
|
83
83
|
`)}${g}${x}`)});return}p("preset",`unknown subcommand "${r}". try: list, show, add, add-hub, remove.`)},Fe=async o=>{let[r,...a]=o.slice(1).split(/\s+/),l=a.join(" ");if(r==="quit"||r==="exit"){_e();return}if(r==="help"){p("help",Vn(k).map(c=>`/${c.name} ${c.description??""}`).join(`
|
|
84
|
-
`));return}if(r==="
|
|
85
|
-
|
|
86
|
-
|
|
84
|
+
`));return}if(r==="trust"){let c=new Fl(P),m=c.get(e.cwd);if(l==="on"||l==="off"){let g=l==="on";c.set(e.cwd,g),p("trust",g?`trusted ${e.cwd}
|
|
85
|
+
its .hxf settings, SYSTEM.md and skills apply to the next session`:`no longer trusting ${e.cwd}
|
|
86
|
+
its .hxf settings, SYSTEM.md and skills are ignored`);return}let b=m===!0?"trusted":m===!1?"not trusted":"not decided (treated as not trusted)";p("trust",`${e.cwd}
|
|
87
|
+
${b}
|
|
88
|
+
|
|
89
|
+
/trust on trust this folder
|
|
90
|
+
/trust off stop trusting it`);return}if(r==="init"){let c=le(e.cwd,"AGENTS.md");if(Et(c)&&l!=="force"){p("init",`AGENTS.md already exists at ${c}. run /init force to overwrite.`);return}ie(c,Ko),p("init",`wrote ${c}; asking the agent to fill it in`),await k.prompt("Read AGENTS.md, then fill it in with the real build, test, and layout facts of this repo. Keep it short.");return}if(r==="login"){Jt(l);return}if(r==="connect"){let c=l.trim();if(c&&!c.startsWith("sk-")&&Wn(c)){Po(c);return}if(c){Le(c);return}let m=wi(P);if(m){Po(m.credential);return}Le(""),C("prompt","paste your howtofix.id token, then press enter"),v();let b=ee;Oe.cancel=()=>{Oe.cancel=null,ee=b,C("prompt",void 0)},ee=g=>{Oe.cancel=null,ee=b,C("prompt",void 0),Le(g.trim())};return}if(r==="sync"){let c=new Set((await k.modelRuntime.getAvailable()).map(R=>R.provider).filter(R=>se(R))),m=ye.find(R=>c.has(R));if(!m){p("sync","no howtofix.id account is connected; run /connect first");return}C("note",`re-syncing ${m} from howtofix.id`),v();let g=(await k.modelRuntime.getAuth(m))?.auth?.apiKey;if(!g){C("note",void 0),p("sync",`${m} has no usable key; run /connect to sign in again`),v();return}let x=await cn(g);if(!x.ok){C("note",void 0),p("sync",x.message),v();return}let $=await Eo(m,x.models),A=await Ae(g);C("note",void 0),p("sync",`${$}
|
|
91
|
+
${ot(m,A)}`),await k.modelRuntime.refresh(),v();return}if(r==="usage"){let c=new Set((await k.modelRuntime.getAvailable()).map(R=>R.provider).filter(R=>se(R))),m=ye.find(R=>c.has(R));if(!m){p("usage","no howtofix.id account is connected; run /connect first");return}C("note","asking howtofix.id for the account usage"),v();let g=(await k.modelRuntime.getAuth(m))?.auth?.apiKey;if(!g){C("note",void 0),p("usage",`${m} has no usable key; run /connect to sign in again`),v();return}let x=await Ae(g),$=await Kn(g);C("note",void 0);let A=$.ok&&$.enabled?$.checkedInToday?`check-in: claimed today (+${Un($.quotaToday)})`:"check-in: not claimed yet today (it claims itself on the next start)":"";p("usage",A?`${ot(m,x)}
|
|
92
|
+
${A}`:ot(m,x)),v();return}if(r==="logout"){let c=await k.modelRuntime.getAvailable(),m=[...new Set(c.map(b=>b.provider))].sort();if(m.length===0){p("logout","no providers are configured");return}_("Logout",m.map(b=>({value:b,label:b})),b=>{k.modelRuntime.logout(b).then(()=>p("logout",`logged out ${b}`),g=>p("logout",g instanceof Error?g.message:String(g)))});return}if(r==="providers"){let c=await k.modelRuntime.getAvailable(),m=[...new Set(c.map(b=>b.provider))].sort();m.sort((b,g)=>Number(se(g))-Number(se(b))),_("Providers",m.map(b=>({value:b,label:b})),b=>{let g=k.modelRuntime.getModels(b);if(g.length===0){Jt(b);return}_(b,g.map(x=>({value:x.id,label:x.id})),x=>{let $=g.find(A=>A.id===x);$&&k.setModel($,{persist:!0}).then(()=>{u.model=$.id,he(),p("providers",`${b}/${$.id}`)},()=>Jt(b))})});return}if(r==="name"){if(!l){p("name","usage: /name <session name>");return}k.setSessionName(l),p("name",`session name: ${l}`);return}if(r==="update"){C("note","checking for a newer release");try{await fo({current:it,install:!0})}finally{C("note",void 0)}return}if(r==="stats"){let c=k.getSessionStats(),m=k.getContextUsage(),b=$=>Number.isFinite($)?String($):";",g=Ar(k.sessionManager.getEntries()),x=g.hitRate===null?"cache hit rate unknown (no prompt billed yet)":`cache hit ${g.hitRate.toFixed(1)}% of ${g.cachedTokens+g.billedTokens} prompt tokens`;p("stats",[`session ${c.sessionId}`,c.sessionFile?`file ${c.sessionFile}`:"not persisted",`messages ${b(c.totalMessages)} (user ${b(c.userMessages)}, assistant ${b(c.assistantMessages)}, tools ${b(c.toolCalls)})`,`tokens in ${b(c.tokens.input)} out ${b(c.tokens.output)} cache ${b(c.tokens.cacheRead)}/${b(c.tokens.cacheWrite)}`,x,g.misses.length>0?`cache misses ${g.misses.length} (${b(g.missedTokens)} tokens re-billed) \u2014 last: ${Tr(g.misses[g.misses.length-1])}`:"cache misses none counted",`cost $${Number.isFinite(c.cost)?c.cost.toFixed(4):";"}`,m?`context ${m.percent===null||!Number.isFinite(m.percent)?"?":`${Math.round(m.percent)}%`} of ${m.contextWindow}`:"context unknown"].join(`
|
|
87
93
|
`));return}if(r==="diff"){let c=async $=>{try{let{stdout:A}=await zn("git",$,{cwd:e.cwd,encoding:"utf8"});return A.trim()}catch{return""}},m=await c(["diff","--stat"])+`
|
|
88
94
|
|
|
89
95
|
`+await c(["diff","--","."]),[b="",g=""]=m.split(`
|
|
90
96
|
|
|
91
|
-
`,2),x=
|
|
97
|
+
`,2),x=ir(g);p("diff",[b.trim(),x].filter(Boolean).join(`
|
|
92
98
|
|
|
93
|
-
`)||"working tree clean");return}if(r==="copy"){let c=[...k.state.messages].reverse().find(g=>g.role==="assistant"),b=(Array.isArray(c?.content)?c.content:[]).filter(g=>g.type==="text").map(g=>g.text).join("");if(!b){p("copy","nothing to copy");return}try{await Nl(b),p("copy",`copied ${b.length} characters`)}catch(g){p("copy",g instanceof Error?g.message:String(g))}return}if(r==="export"){let c=
|
|
94
|
-
`))}catch(g){p("export",`could not write ${m}: ${g instanceof Error?g.message:String(g)}`);return}p("export",`wrote ${m}`);return}if(r==="agents"){let[c="",...m]=l.split(/\s+/).filter(Boolean),b=m.join(" ").trim();if(c&&b){p("agents",await er(c,b));return}p("agents",c?
|
|
99
|
+
`)||"working tree clean");return}if(r==="copy"){let c=[...k.state.messages].reverse().find(g=>g.role==="assistant"),b=(Array.isArray(c?.content)?c.content:[]).filter(g=>g.type==="text").map(g=>g.text).join("");if(!b){p("copy","nothing to copy");return}try{await Nl(b),p("copy",`copied ${b.length} characters`)}catch(g){p("copy",g instanceof Error?g.message:String(g))}return}if(r==="export"){let c=i.items.filter(g=>g.body.trim().length>0);if(c.length===0){p("export","nothing to export yet; the transcript is empty");return}let m=Ll(e.cwd,l||`howtofix-session-${Date.now()}.md`),b=[`# ${tn} session`,"",`model ${u.model}`,""];for(let g of c)b.push(`## ${g.title||g.kind}`,"",g.body,"");try{ie(m,b.join(`
|
|
100
|
+
`))}catch(g){p("export",`could not write ${m}: ${g instanceof Error?g.message:String(g)}`);return}p("export",`wrote ${m}`);return}if(r==="agents"){let[c="",...m]=l.split(/\s+/).filter(Boolean),b=m.join(" ").trim();if(c&&b){p("agents",await er(c,b));return}p("agents",c?Qs(c):Zs());return}if(r==="new"){let c=await e.reopen({noSession:!1});await So(c),p("new","started a new session");return}if(r==="resume"){let c=await jl.list(e.cwd);if(c.length===0){p("resume","no saved sessions for this folder");return}_("Resume session",c.slice(0,30).map(m=>({value:m.path,label:m.name||`${m.id.slice(0,8)} ${m.firstMessage.slice(0,40)}`,description:`${m.modified.toISOString().slice(0,16)} ${m.messageCount} messages`})),m=>{e.reopen({sessionPath:m}).then(So,b=>G(b instanceof Error?b.message:String(b)))});return}if(r==="model"){let c=await k.modelRuntime.getAvailable(),m=c.filter($=>se($.provider)),b=cs(P),g=m.length>0?m:b.size>0?c.filter($=>b.has($.provider)):[];if(g.length===0){p("model","no model configured yet \u2014 run /connect to sign in first");return}let x=l?g.find($=>`${$.provider}/${$.id}`===l||$.id===l):void 0;if(!l){_("Select model",g.map($=>({value:`${$.provider}/${$.id}`,label:$.id,description:[Ci($),$.provider].filter(Boolean).join(" \xB7 ")})),$=>{let A=g.find(R=>`${R.provider}/${R.id}`===$);A&&k.setModel(A,{persist:!0}).then(()=>{u.model=A.id,he(),p("model",`model ${$}`)})});return}if(!x){p("model",`unknown model ${l}`);return}await k.setModel(x,{persist:!0}),u.model=x.id,he(),p("model",`model ${x.provider}/${x.id}`);return}if(r==="thinking"){if(!l){_("Thinking level",q.map(c=>({value:c,label:c})),c=>Pe(c));return}if(!q.includes(l)){p("thinking",`thinking: ${q.join(", ")}`);return}Pe(l);return}if(r==="rtk"){let c=ke(P).compressToolOutput;if(!l){p("rtk",`compress tool output: ${c?"on":"off"}
|
|
95
101
|
/rtk on | /rtk off`);return}let m=l.toLowerCase();if(m!=="on"&&m!=="off"){p("rtk","rtk: on | off");return}let b=m==="on";if(b===c){p("rtk",`already ${m}`);return}if(!De(P,"compressToolOutput",b)){p("rtk","could not write the setting");return}no(b),p("rtk",`compress tool output ${m}
|
|
96
|
-
long results are ${b?"summarised before the model reads them":"sent in full"}`);return}if(r==="compact"){try{await k.compact(l||void 0),p("compact","session compacted")}catch(c){p("compact",c instanceof Error?c.message:String(c))}return}if(r==="approval"){let c=m=>{
|
|
97
|
-
`).slice(0,2))},$=()=>{Fe("/model")},A=()=>{Fe("/proxy")},R=()=>{let E=ke(P).rightClickPaste,J=process.platform==="win32"?"off":"on";_("Right click",[{value:"auto",label:"auto",description:`follow the terminal (${J} on ${process.platform})`},{value:"on",label:"on",description:"the CLI pastes the clipboard itself"},{value:"off",label:"off",description:"the terminal handles it, or the click does nothing"}],z=>{let je=
|
|
102
|
+
long results are ${b?"summarised before the model reads them":"sent in full"}`);return}if(r==="compact"){try{await k.compact(l||void 0),p("compact","session compacted")}catch(c){p("compact",c instanceof Error?c.message:String(c))}return}if(r==="approval"){let c=m=>{Ps(m),p("approval",fn[m])};if(!l){_("Approval mode",mt.map(m=>({value:m,label:m,description:fn[m]})),m=>c(m));return}if(!mt.includes(l)){p("approval",`modes: ${mt.join(", ")}`);return}c(l);return}if(r==="settings"){let c=()=>mn()?"off \u2014 everything runs":"on \u2014 critical commands are refused",m=()=>{_("Permission checks",[{value:"on",label:"on",description:"refuse critical commands and repeated calls (the default)"},{value:"off",label:"off",description:"run everything without asking \u2014 for unattended runs"}],E=>{let J=E==="off",z=De(P,"skipPermissions",J);if(pn(J),u.skipPermissions=J,v(),!z){p("settings","changed for this session, but settings.json could not be written (is it valid JSON?)");return}p("settings",J?"permission checks are OFF \u2014 critical commands and the repeat guard will not stop anything. Stored for future sessions.":"permission checks are ON \u2014 critical commands and repeated calls are refused again.")},void 0,!1,[`Currently ${c()}.`])},b=()=>{_("Thinking level",q.map(E=>({value:E,label:E,description:E===u.thinking?"current":void 0})),E=>Pe(E),void 0,!1,[`Currently ${u.thinking}.`])},g=()=>{_("Auto-update",[{value:"on",label:"on",description:"install a newer release on start (the default)"},{value:"off",label:"off",description:"stay on this version until you update by hand"}],E=>{let J=E!=="off",z=De(P,"autoUpdate",J);p("settings",z?`auto-update ${J?"on":"off"} \u2014 takes effect on the next start.`:"auto-update changed for this session, but settings.json could not be written (is it valid JSON?)")},void 0,!1,[`Currently ${Ms(`${P}/settings.json`)?"on":"off"}.`])},x=()=>{let E=Ue("status",e.cwd,k.getSessionStats().sessionId);_("Dynamic context pruning",[{value:"on",label:"on",description:"fold stale ranges so long sessions stay affordable"},{value:"off",label:"off",description:"send the full transcript, unpruned"},{value:"status",label:"status",description:"what it has pruned so far"}],J=>p("dcp",Ue(J,e.cwd,k.getSessionStats().sessionId)),void 0,!1,E.split(`
|
|
103
|
+
`).slice(0,2))},$=()=>{Fe("/model")},A=()=>{Fe("/proxy")},R=()=>{let E=ke(P).rightClickPaste,J=process.platform==="win32"?"off":"on";_("Right click",[{value:"auto",label:"auto",description:`follow the terminal (${J} on ${process.platform})`},{value:"on",label:"on",description:"the CLI pastes the clipboard itself"},{value:"off",label:"off",description:"the terminal handles it, or the click does nothing"}],z=>{let je=Fs(P,z);p("settings",je?z==="auto"?`right click follows the terminal \u2014 ${hn("auto")?"the CLI pastes":"the terminal pastes"} here.`:`right click ${z==="on"?"pastes from the CLI":"is left to the terminal"}.`:"right click changed for this session, but settings.json could not be written (is it valid JSON?)")},void 0,!1,[`Currently ${E}.`])},U=()=>{let E=ke(P).agents,J=[1,2,3,4].map(z=>({value:String(z),label:String(z),description:z===1?"one child at a time":z===Ke()?"current \u2014 sized to this machine":`${z} children at once`}));_("Agent concurrency",[{value:"auto",label:"auto",description:`size it to the machine (now ${Ke()}, max ${Ys})`},...J],z=>{let je=z==="auto"?void 0:Number(z),pa=js(P,je);p("settings",pa?je===void 0?`agent concurrency follows the machine \u2014 ${Ke()} at a time.`:`agent concurrency set to ${je} \u2014 shared by task and workflow.`:"agent concurrency changed for this session, but settings.json could not be written (is it valid JSON?)"),v()},void 0,!1)},D=[{value:"permissions",label:"permissions",description:c()},{value:"thinking",label:"thinking",description:`${u.thinking} \u2014 how hard the model reasons`},{value:"model",label:"model",description:u.model},{value:"dcp",label:"context pruning",description:"fold stale ranges to save tokens"},{value:"proxy",label:"proxy",description:dn(P)??un()??"none \u2014 direct to the API"},{value:"rightclick",label:"right click",description:`paste: ${ke(P).rightClickPaste}`},{value:"agents",label:"agents",description:`${ke(P).agents??`auto (${Ke()})`} at once, shared by task and workflow`},{value:"autoupdate",label:"auto-update",description:"install a newer release on start"}];if(!l){_("Settings",D,E=>{E==="permissions"?m():E==="thinking"?b():E==="dcp"?x():E==="autoupdate"?g():E==="model"?$():E==="proxy"?A():E==="rightclick"?R():E==="agents"&&U()});return}let B=D.find(E=>E.value===l||E.label===l);if(B){B.value==="permissions"?m():B.value==="thinking"?b():B.value==="dcp"?x():B.value==="autoupdate"?g():B.value==="model"?$():B.value==="proxy"?A():B.value==="rightclick"?R():B.value==="agents"&&U();return}if(l==="on"||l==="off"){let E=l==="off",J=De(P,"skipPermissions",E);pn(E),u.skipPermissions=E,v(),p("settings",J?E?"permission checks are OFF \u2014 critical commands and the repeat guard will not stop anything.":"permission checks are ON.":"changed for this session, but settings.json could not be written (is it valid JSON?)");return}p("settings",`settings: ${D.map(E=>E.value).join(", ")} | on, off (permission checks)
|
|
98
104
|
usage: /settings <name>, or /settings to choose`);return}if(r==="proxy"){let c=dn(P),m=un(),b=()=>c?`proxy: ${c} (set here, in settings.json)`:m?`proxy: ${m} (from the environment, not this file)`:"proxy: none \u2014 requests go straight to the API";if(!l){p("proxy",`${b()}
|
|
99
105
|
usage: /proxy <url> route requests through a proxy
|
|
100
106
|
/proxy off stop using one
|
|
101
107
|
/proxy env use HTTPS_PROXY / HTTP_PROXY / ALL_PROXY
|
|
102
|
-
Only traffic to the HowToFix API goes through it; a change applies on the next start.`);return}let g=l.trim();if(g==="off"||g==="none"){let R=ht(P,ft,""),U=pt(P),D=U.source==="env"?`the environment still sets one (${U.url})`:"requests go straight to the API";p("proxy",R?`proxy off \u2014 ${D} from the next message.`:"proxy changed for this session, but settings.json could not be written (is it valid JSON?)");return}if(g==="env"){let R=ht(P,ft,""),U=pt(P),D=U.source==="env"?U.url:void 0;p("proxy",R?D?`using the environment from the next message: ${D}`:"settings cleared, but no HTTPS_PROXY / HTTP_PROXY / ALL_PROXY is set \u2014 requests go straight to the API.":"settings.json could not be written (is it valid JSON?)");return}let x=
|
|
103
|
-
`):"no tools enabled");return}if(r==="dcp"){p("dcp",Ue(l,e.cwd,k.getSessionStats().sessionId));return}if(r==="context"||r==="decompress"||r==="sweep"){p(r,Ue(`${r} ${l}`.trim(),e.cwd,k.getSessionStats().sessionId));return}if(r==="rewind"){co();return}if(r==="undo"){if(!await kn(e.cwd)){p("undo","not a git repository");return}let c=await
|
|
104
|
-
`));return}if(r==="plan"){if(
|
|
105
|
-
plan file: ${
|
|
108
|
+
Only traffic to the HowToFix API goes through it; a change applies on the next start.`);return}let g=l.trim();if(g==="off"||g==="none"){let R=ht(P,ft,""),U=pt(P),D=U.source==="env"?`the environment still sets one (${U.url})`:"requests go straight to the API";p("proxy",R?`proxy off \u2014 ${D} from the next message.`:"proxy changed for this session, but settings.json could not be written (is it valid JSON?)");return}if(g==="env"){let R=ht(P,ft,""),U=pt(P),D=U.source==="env"?U.url:void 0;p("proxy",R?D?`using the environment from the next message: ${D}`:"settings cleared, but no HTTPS_PROXY / HTTP_PROXY / ALL_PROXY is set \u2014 requests go straight to the API.":"settings.json could not be written (is it valid JSON?)");return}let x=Ts(g);if(!x.ok){p("proxy",`not set: ${x.problem}`);return}if(!ht(P,ft,x.url)){p("proxy","settings.json could not be written (is it valid JSON?)");return}let A=pt(P);p("proxy",A.url?`proxy set to ${x.url} \u2014 requests go through it from the next message.`:`proxy saved as ${x.url}, but it could not be applied this session; it will be tried on the next start.`);return}if(r==="tools"){let c=k.getActiveToolNames().sort();p("tools",c.length?c.join(`
|
|
109
|
+
`):"no tools enabled");return}if(r==="dcp"){p("dcp",Ue(l,e.cwd,k.getSessionStats().sessionId));return}if(r==="context"||r==="decompress"||r==="sweep"){p(r,Ue(`${r} ${l}`.trim(),e.cwd,k.getSessionStats().sessionId));return}if(r==="rewind"){co();return}if(r==="undo"){if(!await kn(e.cwd)){p("undo","not a git repository");return}let c=await sr(e.cwd);p("undo",c.ok?`undone: ${c.output}`:`undo failed: ${c.output}`),h(!0);return}if(r==="commit"){if(!kn(e.cwd)){p("commit","not a git repository");return}if(!await nr(e.cwd)){p("commit","nothing to commit");return}let c=l||`howtofix: session update ${new Date().toISOString().slice(0,16)}`,m=await or(e.cwd,c);p("commit",m.ok?m.output:`commit failed: ${m.output}`),h(!0);return}if(r==="review"){if(!(await rr(e.cwd)).trim()){p("review","no changes to review");return}Yt("Review the uncommitted changes. Report concrete issues with file evidence. Do not edit files.");return}if(r==="workflow"){if(l.trim()==="clear"){Qn(),p("workflow","cleared the pinned workflow panel");return}if(!H){p("workflow","no workflow run in this session yet");return}let c=$n(H,Date.now()),m=c[I.selectedPhase];p("workflow",[`panel ${Z?"pinned above the editor":"unpinned"}`,`phase ${I.selectedPhase+1}/${c.length}: ${m?.title??"(none)"}`,`filter: ${I.filter}${I.paused?" \xB7 paused":""}`,"keys: \u2191/\u2193 phase \xB7 Enter drill in \xB7 Esc unpin \xB7 f filter \xB7 p pause \xB7 x stop \xB7 s save","clear it with /workflow clear"].join(`
|
|
110
|
+
`));return}if(r==="plan"){if(Vs()||bt().state==="pending"){bn(Gs(bt())),p("plan","plan mode off; edits are allowed again");return}bn(Bs(bt())),p("plan",`plan mode armed \u2014 send your next prompt to start planning
|
|
111
|
+
plan file: ${qs()??"(unknown)"}`);return}if(r==="goal"){let c=l.trim();if(!c){p("goal",gn(gt()));return}let{goal:m,error:b}=Hs(gt(),"set",c,void 0,void 0);if(b){G(b);return}Ks(m),await k.sendCustomMessage({customType:Ws,content:c,display:!1,details:m}),p("goal",`goal set
|
|
106
112
|
${gn(m)}`);return}if(r==="session"){let c=k.model;p("session",c?`${c.provider}/${c.id}`:"no model");return}if(r==="skills"){p("skills",$r(k.resourceLoader.getSkills().skills));return}if(r==="preset"){Uo(l);return}if(r==="roblox"){let{RobloxConnect:c,readBridgeEndpoint:m,describeStatus:b,parseRobloxSubcommand:g}=await import("./chunk-LAHVHRCS.js"),x=g(l);if(x){let D=new c(m(P));try{if(x.sub==="status"){let B=await D.tunnel("status").catch(()=>{});p("roblox",b(await D.status(),B))}else if(x.sub==="login"){p("roblox","opening Roblox in your browser to sign in\u2026");let B=await D.login({onUrl:E=>p("roblox",`if the browser did not open, go to:
|
|
107
113
|
${E}`)});p("roblox",B.message)}else if(x.sub==="logout")await D.logout(),p("roblox","signed out of Roblox");else{let B=x.rest==="off"?"stop":x.rest==="on"||x.rest===""?"start":void 0;if(!B)p("roblox","usage: /roblox tunnel on | off");else{let E=await D.tunnel(B);p("roblox",E.message??"done")}}}catch(B){p("roblox",B instanceof Error?B.message:String(B))}return}let $=ne(e.cwd).entries.find(D=>D.manifest.name==="rotoolbox");if(!$||$.source!=="installed"){p("roblox","RoToolbox is not installed. Run /preset and install RoToolbox first.");return}let A=on($.dir),R=k.getActiveToolNames().filter(D=>/roblox[-_]studio/i.test(D)),U=R.length>0;p("roblox",A?`RoToolbox: disabled
|
|
108
114
|
Enable with /preset enable rotoolbox
|
|
109
115
|
The MCP server and manager stay stopped while disabled.`:["RoToolbox: active",`MCP server: ${U?`connected \u2014 ${R.length} tool${R.length===1?"":"s"} registered`:"not connected yet"}`,"Open Roblox Studio with a place, then use a prompt to inspect it.","Disable with /preset disable rotoolbox"].join(`
|
|
110
|
-
`));return}let d=kr(o,k.resourceLoader.getSkills().skills.map(c=>c.name));if(d){To(d);return}let y=k.extensionRunner.getCommand(r??"");if(y){try{await y.handler(l,k.extensionRunner.createCommandContext())}catch(c){G(c instanceof Error?c.message:String(c))}return}p("command",`/${r??""} is not available in this screen yet`)};
|
|
116
|
+
`));return}let d=kr(o,k.resourceLoader.getSkills().skills.map(c=>c.name));if(d){To(d);return}let y=k.extensionRunner.getCommand(r??"");if(y){try{await y.handler(l,k.extensionRunner.createCommandContext())}catch(c){G(c instanceof Error?c.message:String(c))}return}p("command",`/${r??""} is not available in this screen yet`)};Ds((o,r)=>{let{promise:a,resolve:l}=Promise.withResolvers();return _(o,r.map(d=>({value:d,label:d})),l,()=>l("cancelled")),a}),process.on("SIGTERM",_e),Cr(()=>{_e()}),t.setTitle(`${tn} ${it}`),ec(),s.start(),s.requestRender(!0),Ao(!0);{let{maybeShowWelcome:o}=await import("./chunk-7FD3JD6B.js");await o({cwd:e.cwd,note:e.note,signedIn:ge!==void 0,runSlash:r=>{Fe(r)},openExternal:r=>{He(r)}},_,p)}e.initialPrompt&&Yt(e.initialPrompt),await new Promise(()=>{})}var ee,tc=1e3/30,nc=45e3;export{Jn as Dock,Yn as Hud,Xn as PinnedBlock,Jl as approvalDetail,wt as orderModelsForDefault,Xl as pickerPanel,pu as runWorkbench,Vn as slashCommands,Zl as workflowPanel,Pt as workflowPanelFromRun,Zn as workflowRunOf};
|