goatchain-cli 0.0.3-beta.18 → 0.0.3-beta.19

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.
Files changed (2) hide show
  1. package/dist/cli.mjs +1 -1
  2. package/package.json +16 -17
package/dist/cli.mjs CHANGED
@@ -3,7 +3,7 @@ import{createRequire as dV}from"node:module";var nV=Object.create;var{getPrototy
3
3
  `),metadata:{done:!0,error:!0,stopReason:"error",originalEventType:"done"}}}}function aV(f,y){if(!f||typeof f!=="object")return f;let u={};for(let[$,M]of Object.entries(y))if(typeof M==="number"&&Number.isFinite(M))u[$]=M;if(Object.keys(u).length===0)return f;let G=($)=>$!=null&&typeof $==="object"&&!Array.isArray($),R=($)=>{if(!G($))return;for(let[M,K]of Object.entries(u))if(!(M in $))$[M]=K},V=($)=>{if(typeof $!=="function")return $;return(...M)=>{for(let K of M){if(!G(K))continue;if("body"in K&&G(K.body)){R(K.body);break}if("messages"in K||"model"in K||"input"in K||"prompt"in K){R(K);break}}return $(...M)}};for(let $ of["request","createChatCompletion","chat","complete","responses","completions"])if(typeof f[$]==="function")f[$]=V(f[$].bind(f));return f}function s1(f,y){let u=f({defaultModelId:y.modelId,baseUrl:y.baseUrl,apiKey:y.apiKey});return aV(u,{temperature:y.temperature,top_p:y.topP}),u}function t1(f){return{async list(){let y=await f.ensureSharedStateStore();if(!y)return[];let u=await f.sessionStorageKey(),G=await(y.listSessions?.()??[]),R=[];for(let V of G)try{let $=await y.load(V,u);if($)R.push($)}catch{}return R},async get(y){let u=await f.ensureSharedStateStore();if(!u)return null;let G=String(y??"").trim();if(!G)return null;let R=await f.sessionStorageKey();try{return await u.load(G,R)??null}catch{return null}},async create(){let y=await f.ensureSharedStateStore();if(!y)return null;let u=await f.sessionStorageKey(),G=Date.now(),R=f.createId(),V=f.createEmptySessionSnapshot(R,G);return await y.save(R,u,V),V},async destroy(y){let u=await f.ensureSharedStateStore();if(!u)return;let G=String(y??"").trim();if(!G)return;await u.deleteSession(G)},async createWithMessages(y){let u=await f.ensureSharedStateStore();if(!u)return null;let G=await f.sessionStorageKey(),R=Date.now(),V=f.createId(),$=f.createEmptySessionSnapshot(V,R);return f.applyMessagesToSnapshot($,Array.isArray(y)?y:[],R),await u.save(V,G,$),$}}}function eV(){let f=globalThis.process;return!!f&&typeof f?.versions?.node==="string"}function uu(){return globalThis.process?.env??{}}var yu=null;async function pu(){let f=uu(),y=String(f.GOATCHAIN_IMPORT_PATH??"").trim(),u=y||"goatchain";if(yu&&yu.importPath===u)return yu.mod;let G=y?await import(pV(y).href):await import("goatchain"),R=G?.default,$=((M)=>M!=null&&typeof M==="object"&&!Array.isArray(M))(R)?{...G,...R}:G;return yu={importPath:u,mod:$},$}var f2="plan-mode";function Wy(f){return String(f??"").trim()||void 0}function y2(f){let y=String(f??"").trim();if(!y)return;let u=Number.parseFloat(y);return Number.isFinite(u)?u:void 0}function sV(f){if(typeof f==="string")return f;if(Array.isArray(f))return f.map((y)=>{if(typeof y==="object"&&y&&"text"in y)return String(y.text??"");return JSON.stringify(y)}).join(`
4
4
  `);try{return JSON.stringify(f,null,2)}catch{return String(f)}}function tV(f,y){if(!y||typeof f?.cancel!=="function")return()=>{};if(y.aborted){try{f.cancel()}catch{}return()=>{}}let u=()=>{try{f.cancel()}catch{}};return y.addEventListener("abort",u,{once:!0}),()=>{try{y.removeEventListener("abort",u)}catch{}}}function f$(f){return{id:String(f?.id??""),type:"function",function:{name:String(f?.function?.name??""),arguments:f?.function?.arguments}}}function y$(f){let y={};for(let u of f){if(u.role!=="tool"||!u.tool_call_id)continue;let G=typeof u.content==="string"?u.content:u.content?JSON.stringify(u.content):"";try{let R=JSON.parse(G);if(R&&typeof R==="object"&&R.answers&&typeof R.answers==="object")y[u.tool_call_id]=R.answers}catch{}}return y}function eu(f){if(!f)return"";if(typeof f==="string")return f;if(Array.isArray(f))return f.map((y)=>String(y?.text??"")).join("");return String(f)}function su(f){if(!f||typeof f!=="object")return null;let y=f.usage;if(y&&typeof y==="object")return y;let u=f.stats?.usage;if(u&&typeof u==="object")return u;try{let R=(typeof f.toSnapshot==="function"?f.toSnapshot():null)?.stats?.usage;if(R&&typeof R==="object")return R}catch{}return null}function u2(f){if(!eV())throw Error("GoatChain embedded agent is Node-only");let y=f.debug===!0,u=f.cliTools!==!1,G=f.planMode===!0,R=f.subagents===!0,V=Wy(f.stateDir||uu().GOATCHAIN_STATE_DIR||uu().GOATCHAIN_STATE_DIR),$=null,M=G?"plan":"agent",K=null,Z=null,_=null,j=null;function Q(P,U){let N=P.filter((v)=>v.role!=="system"),C=(()=>{for(let v=N.length-1;v>=0;v--)if(N[v]?.role==="user")return v;return-1})(),L=String(U??"").trim(),S=C===N.length-1&&L.length>0,g=[];for(let v=0;v<N.length;v++){if(S&&v===C)continue;let r=N[v];if(!r)continue;if(r.role==="user")g.push({role:"user",content:eu(r.content)});else if(r.role==="assistant"){let $f={role:"assistant",content:eu(r.content)};if(Array.isArray(r.tool_calls)&&r.tool_calls.length)$f.tool_calls=r.tool_calls;g.push($f)}else if(r.role==="tool")g.push({role:"tool",tool_call_id:String(r.tool_call_id??""),content:eu(r.content),...r.metadata?.error===!0?{isError:!0}:{}})}return g}function z(P,U,N){try{if(!P||!Array.isArray(P.messages))return;let C=Q(U,N);if(C.length===0)return;if(P.messages.length>=C.length)return;P.messages=C}catch{}}function J(P){let U=P?.env;if(!U||typeof U!=="object")return;let N=globalThis.process;if(!N?.env)return;for(let[C,L]of Object.entries(U)){let S=String(C??"").trim();if(!S)continue;let g=L==null?"":String(L);if(!g)delete N.env[S];else N.env[S]=g}}let O=new Map;async function H(){if($)return $;let P=await pu(),{FileStateStore:U,InMemoryStateStore:N}=P;if(V&&typeof U==="function")try{return $=new U({dir:V,deleteOnComplete:!1}),$}catch(C){if(y)console.warn("[goatchain-node] Failed to init FileStateStore:",C);$=null}if(!$&&typeof N==="function")try{$=new N({deleteOnComplete:!1})}catch(C){if(y)console.warn("[goatchain-node] Failed to init InMemoryStateStore:",C);$=null}return $}function b(P,U){return{id:P,createdAt:U,state:{status:"active",updatedAt:U,lastActiveAt:U},context:{messages:[],messageCount:0,toolCallCount:0},stats:{usage:{promptTokens:0,completionTokens:0,totalTokens:0},responseCount:0}}}function F(P){if(!Array.isArray(P)||P.length===0)return;for(let U=P.length-1;U>=0;U--){let N=P[U],C=String(N?.role??"");if(C!=="user"&&C!=="assistant"&&C!=="system"&&C!=="tool")continue;let L=N?.content;if(typeof L==="string"){let S=L.replace(/\s+/g," ").trim();if(S)return S.slice(0,200)}if(Array.isArray(L)){let S=L.filter((g)=>g&&typeof g==="object"&&g.type==="text"&&typeof g.text==="string").map((g)=>g.text).join(" ").replace(/\s+/g," ").trim();if(S)return S.slice(0,200)}}return}async function X(){let U=(await pu())?.StateKeys?.SESSION;return typeof U==="string"&&U.trim()?U:"session"}function A(){let P=uu();return{modelId:String(P.GOATCHAIN_MODEL||f.modelId),baseUrl:Wy(P.GOATCHAIN_OPENAI_BASE_URL||P.OPENAI_BASE_URL||f.baseUrl),apiKey:Wy(P.OPENAI_API_KEY||f.apiKey),temperature:y2(P.GOATCHAIN_TEMPERATURE),topP:y2(P.GOATCHAIN_TOP_P)}}function E(P){return JSON.stringify({modelId:P.modelId,baseUrl:P.baseUrl??null,apiKey:P.apiKey?"***":null,temperature:P.temperature??null,topP:P.topP??null})}async function w(P){let U=await pu(),{Agent:N,ToolRegistry:C,BashTool:L,GrepTool:S,ReadTool:g,GlobTool:v,WebSearchTool:r,TodoWriteTool:$f,AskUserTool:Af,createModel:zf,createOpenAIAdapter:uf,WriteTool:Kf,EditTool:Ef,AstGrepSearchTool:ef,AstGrepReplaceTool:o,TodoPlanTool:sf,createPlanModeMiddleware:mf,createParallelSubagentMiddleware:Ff,fileSearchSpecialist:df}=U;await H();let lf=new C,a=(tf)=>{if(!tf)return;try{lf.register(new tf)}catch(Rf){if(y)console.warn("[goatchain-node] Failed to register tool:",tf?.name??"(unknown)",Rf)}};if(a(L),a(S),a(g),a(v),a(Af),a($f),a(r),u)a(Kf),a(Ef),a(ef),a(o),a(sf);let af=s1(uf,P),nf=zf({adapter:af}),gf=[];if(typeof mf==="function"){if(K=mf({insertEveryIteration:!0}),M==="plan")gf.push(K)}if(R&&typeof Ff==="function"&&df)try{gf.push(Ff({subagents:[df],globalToolRegistry:lf,model:nf}))}catch(tf){if(y)console.warn("[goatchain-node] Failed to init subagent middleware:",tf)}return{agent:new N({name:"GoatChain",systemPrompt:f.systemPrompt,model:nf,tools:lf,...$?{stateStore:$}:{},...gf.length?{middleware:gf}:{}}),tools:lf}}async function q(){let P=A(),U=E(P);if(U!==j){let{agent:N,tools:C}=await w(P);Z=N,_=C,j=U,O.clear()}}async function Y(P,U){let N=Wy(P),C=N?O.get(N):void 0;if(C&&U?.resumeOnly)return{sessionId:N,session:C.session};if(await q(),C)return{sessionId:N,session:C.session};let L=A(),S={...typeof L.temperature==="number"?{temperature:L.temperature}:{},...typeof L.topP==="number"?{topP:L.topP}:{}},g;if(N&&$&&typeof Z?.resumeSession==="function")try{g=await Z.resumeSession(N,{requestParams:S})}catch{g=await Z.createSession({sessionId:N,requestParams:S})}else if(N)g=await Z.createSession({sessionId:N,requestParams:S});else g=await Z.createSession({requestParams:S});let v=Wy(g?.id)??Wy(g?.sessionId)??N;if(!v)throw Error("GoatChain session id is missing");return O.set(v,{session:g}),{sessionId:v,session:g}}async function*B(P){for await(let U of P){if(U?.type==="subagent_event"){let L=U?.nestedEvent,S=W(L),g=Wy(L?.sessionId);for(let v of S)yield{...v,metadata:{...v.metadata??{},...g?{session_id:g}:{},subagent:!0,subagentId:U?.subagentId,subagentType:U?.subagentType,taskDescription:U?.taskDescription,originalEventType:L?.type}};continue}let N=W(U),C=Wy(U?.sessionId);for(let L of N)yield C?{...L,metadata:{...L.metadata??{},session_id:C}}:L}}function W(P){if(!P||typeof P!=="object")return[];switch(P.type){case"session_created":return[{role:"assistant",content:"",metadata:{originalEventType:"session_created"}}];case"iteration_start":return[{role:"assistant",content:"",metadata:{originalEventType:"iteration_start"}}];case"text_delta":return[{role:"assistant",content:String(P.delta??""),metadata:{originalEventType:"text_delta"}}];case"thinking_start":return[{role:"assistant",content:"",metadata:{thinking:!0,originalEventType:"thinking_start"}}];case"tool_call_delta":return[{role:"assistant",content:"",metadata:{originalEventType:"tool_call_delta",callId:String(P.callId??""),toolName:P.toolName,argsTextDelta:P.argsTextDelta}}];case"tool_call_start":return[{role:"assistant",content:"",metadata:{originalEventType:"tool_call_start",callId:String(P.callId??""),toolName:P.toolName}}];case"tool_call_end":return[{role:"assistant",content:"",tool_calls:[f$(P.toolCall)],metadata:{originalEventType:"tool_call_end"}}];case"tool_output_start":return[{role:"assistant",content:"",metadata:{originalEventType:"tool_output_start",tool_call_id:String(P.tool_call_id??""),tool_name:String(P.toolName??P.tool_name??"")}}];case"tool_output_delta":return[{role:"assistant",content:String(P.delta??""),metadata:{originalEventType:"tool_output_delta",tool_call_id:String(P.tool_call_id??""),isStderr:P.isStderr}}];case"tool_result":let U=Boolean(P.isError||P.result?.isError===!0);return[{role:"tool",tool_call_id:String(P.tool_call_id??""),content:Array.isArray(P.result?.content)?P.result.content:sV(P.result),metadata:{...U?{error:!0}:null,originalEventType:"tool_result",structuredContent:P.result?.structuredContent,rawResult:y?P.result:void 0}}];case"tool_skipped":return[{role:"assistant",content:`Tool skipped: ${String(P.toolName??"")} - ${String(P.reason??"")}`,metadata:{originalEventType:"tool_skipped"}}];case"tool_approval_requested":return[{role:"assistant",content:`Tool approval requested: ${String(P.toolName??"")}`,metadata:{approval_requested:!0,tool_call_id:String(P.tool_call_id??""),tool_name:String(P.toolName??""),risk_level:P.riskLevel,approval_args:P.args,originalEventType:"tool_approval_requested"}}];case"requires_action":{let N={requires_action:!0,kind:P.kind,tool_call_id:P.toolCallId,originalEventType:"requires_action"};if(P.kind==="ask_user"&&P.questions)N.questions=P.questions;return[{role:"assistant",content:`Action required: ${String(P.kind??"")}`,metadata:N}]}case"thinking_delta":return[{role:"assistant",content:String(P.delta??""),metadata:{thinking:!0,originalEventType:"thinking_delta"}}];case"thinking_end":return[{role:"assistant",content:"",metadata:{originalEventType:"thinking_end"}}];case"iteration_end":return[{role:"assistant",content:"",metadata:{originalEventType:"iteration_end",usage:P.usage}}];case"done":return[{role:"assistant",content:"",metadata:{done:!0,stopReason:P.stopReason,modelStopReason:P.modelStopReason,usage:P.usage,error:P.error,originalEventType:"done"}}];case"error":return[{role:"assistant",content:"",metadata:{done:!0,error:P.error??P.message??P,stopReason:"error",originalEventType:"error"}}];default:if(y)console.warn("[goatchain-node] Unhandled event:",P.type);return[]}}return{async*receiveMessage(P,U){try{J(U);let N=U?.signal,C=Wy(U?.session_id),L=U?.resume===!0;if(!C&&L)throw Error("Cannot resume without a session id");let S=await Y(C,{resumeOnly:L}),g=S.sessionId,v=S.session,r=tV(v,N);try{let $f=String(U?.cwd??"").trim();if($f&&_){for(let o of _?.list?.()??[])if(typeof o?.setCwd==="function")try{o.setCwd($f)}catch(sf){if(y)console.warn("[goatchain-node] Failed to setCwd on tool:",o?.name,sf)}}let Af=U?.toolContext,zf=y$(P),uf={};if(Af&&typeof Af==="object")Object.assign(uf,Af);if(Object.keys(zf).length>0)uf.askUser=uf.askUser??{},uf.askUser.answers={...uf.askUser.answers??{},...zf};let Kf=[...P].reverse().find((o)=>o.role==="user"),Ef=typeof Kf?.content==="string"?Kf.content:"";if(!$)z(v,P,Ef);if(L&&Object.keys(uf).length){yield*e1({session:v,toolContext:uf,signal:N,convertEventStream:B});let o=su(v);if(o)yield{role:"assistant",content:"",metadata:{originalEventType:"usage_refresh",usage:o,...g?{session_id:g}:{}}};return}if(Ef.trim()){v.send(Ef,Object.keys(uf).length?{toolContext:uf,...N?{signal:N}:null}:N?{signal:N}:void 0),yield*B(v.receive(N?{signal:N}:void 0));let o=su(v);if(o)yield{role:"assistant",content:"",metadata:{originalEventType:"usage_refresh",usage:o,...g?{session_id:g}:{}}};return}yield*B(v.receive(Object.keys(uf).length?{toolContext:uf,...N?{signal:N}:null}:N?{signal:N}:void 0));let ef=su(v);if(ef)yield{role:"assistant",content:"",metadata:{originalEventType:"usage_refresh",usage:ef,...g?{session_id:g}:{}}}}finally{r()}}catch(N){yield{role:"assistant",content:["# GoatChain error","","```text",N instanceof Error?N.stack||N.message:String(N),"```"].join(`
5
5
  `),metadata:{done:!0,error:!0,stopReason:"error",originalEventType:"done"}}}},__sessions:t1({ensureSharedStateStore:H,sessionStorageKey:X,createEmptySessionSnapshot:b,createId:()=>oV(),applyMessagesToSnapshot:(P,U,N)=>{P.context.messages=U,P.context.messageCount=U.length;let C=F(U);if(C)P.context.lastMessagePreview=C;P.state.updatedAt=N,P.state.lastActiveAt=N}}),setMode(P){if(M===P)return;if(M=P,!K||!Z)return;let N=Z.middlewares.filter((C)=>C.name!==f2);if(Z.clearMiddlewares(),P==="plan")Z.use(K,f2);for(let C of N)Z.use(C.fn,C.name);O.clear()},getMode(){return M}}}function G2(f){let y=f.processEnv;try{return u2({systemPrompt:f.context.system,modelId:String(y.GOATCHAIN_MODEL||f.context.env.GOATCHAIN_MODEL||"gpt-4.1-mini"),baseUrl:y.GOATCHAIN_OPENAI_BASE_URL||y.OPENAI_BASE_URL||f.context.env.GOATCHAIN_OPENAI_BASE_URL||f.context.env.OPENAI_BASE_URL,apiKey:y.OPENAI_API_KEY||f.context.env.OPENAI_API_KEY,cliTools:!0,stateDir:f.stateDir})}catch(u){return console.warn("[goatchain] Failed to start GoatChain agent:",u),p1(u)}}function Xf(f){return String(f??"").trim()||void 0}function Iy(f){if(typeof f==="number"&&Number.isFinite(f))return f;let y=String(f??"").trim();if(!y)return;let u=Number(y);return Number.isFinite(u)?u:void 0}async function u$(f){let[{homedir:y},u]=await Promise.all([import("node:os"),import("node:path")]),G=Xf(f.GOATCHAIN_HOME);if(G)return u.resolve(G,"goatchain");let R=Xf(f.XDG_CONFIG_HOME);if(R)return u.resolve(R,"goatchain","goatchain");return u.resolve(y(),".goatchain","goatchain")}async function V2(f){let y=await u$(f),[{readFile:u},G]=await Promise.all([import("node:fs/promises"),import("node:path")]),R=G.join(y,"cache.json");try{let V=await u(R,"utf8"),$=JSON.parse(V);if($&&typeof $==="object"&&$.version===1)return{dir:y,filePath:R,cache:$}}catch{}return{dir:y,filePath:R,cache:{version:1,updatedAt:0}}}async function $2(f,y){let[{mkdir:u,writeFile:G,rename:R,chmod:V},$]=await Promise.all([import("node:fs/promises"),import("node:path")]),M=$.dirname(f);await u(M,{recursive:!0});let K=globalThis.process?.pid??"p",Z=`${Date.now()}-${Math.random().toString(16).slice(2)}`,_=`${f}.${K}.${Z}.tmp`,j=`${JSON.stringify(y,null,2)}
6
- `;await G(_,j,{encoding:"utf8",mode:384}),await R(_,f);try{await V(f,384)}catch{}}async function R2(f){let y=Xf("0.0.3-beta.18")??await G$(f.cwd),u=await V2(f.env),G=u.cache,R=G.settings??{},V=Xf(R.cwd),$=Array.isArray(R.focusFiles)?R.focusFiles.map((K)=>String(K??"")).filter(Boolean):void 0,M={GOATCHAIN_VERSION:y??"dev",...f.env.GOATCHAIN_MODEL?{GOATCHAIN_MODEL:f.env.GOATCHAIN_MODEL}:{},...f.env.GOATCHAIN_CONTEXT_WINDOW?{GOATCHAIN_CONTEXT_WINDOW:f.env.GOATCHAIN_CONTEXT_WINDOW}:{},...f.env.GOATCHAIN_TEMPERATURE?{GOATCHAIN_TEMPERATURE:f.env.GOATCHAIN_TEMPERATURE}:{},...f.env.GOATCHAIN_TOP_P?{GOATCHAIN_TOP_P:f.env.GOATCHAIN_TOP_P}:{},...f.env.GOATCHAIN_TOOL_APPROVALS?{GOATCHAIN_TOOL_APPROVALS:f.env.GOATCHAIN_TOOL_APPROVALS}:{},...f.env.GOATCHAIN_SKIP_APPROVAL?{GOATCHAIN_SKIP_APPROVAL:f.env.GOATCHAIN_SKIP_APPROVAL}:{},...f.env.GOATCHAIN_STARTUP_TOAST?{GOATCHAIN_STARTUP_TOAST:f.env.GOATCHAIN_STARTUP_TOAST}:{},...f.env.GOATCHAIN_OPENAI_BASE_URL?{GOATCHAIN_OPENAI_BASE_URL:f.env.GOATCHAIN_OPENAI_BASE_URL}:{},...f.env.OPENAI_BASE_URL?{OPENAI_BASE_URL:f.env.OPENAI_BASE_URL}:{},...f.env.OPENAI_API_KEY?{OPENAI_API_KEY:f.env.OPENAI_API_KEY}:{}};if(!M.GOATCHAIN_MODEL&&Xf(R.model))M.GOATCHAIN_MODEL=String(R.model);if(!M.GOATCHAIN_CONTEXT_WINDOW&&Iy(R.contextWindow)!=null)M.GOATCHAIN_CONTEXT_WINDOW=String(R.contextWindow);if(!M.GOATCHAIN_TEMPERATURE&&Iy(R.temperature)!=null)M.GOATCHAIN_TEMPERATURE=String(R.temperature);if(!M.GOATCHAIN_TOP_P&&Iy(R.topP)!=null)M.GOATCHAIN_TOP_P=String(R.topP);if(!M.GOATCHAIN_TOOL_APPROVALS&&R.toolApprovals==="auto")M.GOATCHAIN_TOOL_APPROVALS="auto";if(!M.GOATCHAIN_TOOL_APPROVALS&&R.toolApprovals==="all")M.GOATCHAIN_TOOL_APPROVALS="all";if(!M.GOATCHAIN_TOOL_APPROVALS&&R.toolApprovals==="manual")M.GOATCHAIN_TOOL_APPROVALS="auto";if(!M.GOATCHAIN_OPENAI_BASE_URL&&Xf(R.baseUrl))M.GOATCHAIN_OPENAI_BASE_URL=String(R.baseUrl);if(!M.OPENAI_API_KEY&&Xf(R.apiKey))M.OPENAI_API_KEY=String(R.apiKey);return{context:{system:["You are GoatChain.","Use GoatChain tools when needed and stream progress.","If a tool requires approval, wait for the user and then continue."].join(`
6
+ `;await G(_,j,{encoding:"utf8",mode:384}),await R(_,f);try{await V(f,384)}catch{}}async function R2(f){let y=Xf("0.0.3-beta.19")??await G$(f.cwd),u=await V2(f.env),G=u.cache,R=G.settings??{},V=Xf(R.cwd),$=Array.isArray(R.focusFiles)?R.focusFiles.map((K)=>String(K??"")).filter(Boolean):void 0,M={GOATCHAIN_VERSION:y??"dev",...f.env.GOATCHAIN_MODEL?{GOATCHAIN_MODEL:f.env.GOATCHAIN_MODEL}:{},...f.env.GOATCHAIN_CONTEXT_WINDOW?{GOATCHAIN_CONTEXT_WINDOW:f.env.GOATCHAIN_CONTEXT_WINDOW}:{},...f.env.GOATCHAIN_TEMPERATURE?{GOATCHAIN_TEMPERATURE:f.env.GOATCHAIN_TEMPERATURE}:{},...f.env.GOATCHAIN_TOP_P?{GOATCHAIN_TOP_P:f.env.GOATCHAIN_TOP_P}:{},...f.env.GOATCHAIN_TOOL_APPROVALS?{GOATCHAIN_TOOL_APPROVALS:f.env.GOATCHAIN_TOOL_APPROVALS}:{},...f.env.GOATCHAIN_SKIP_APPROVAL?{GOATCHAIN_SKIP_APPROVAL:f.env.GOATCHAIN_SKIP_APPROVAL}:{},...f.env.GOATCHAIN_STARTUP_TOAST?{GOATCHAIN_STARTUP_TOAST:f.env.GOATCHAIN_STARTUP_TOAST}:{},...f.env.GOATCHAIN_OPENAI_BASE_URL?{GOATCHAIN_OPENAI_BASE_URL:f.env.GOATCHAIN_OPENAI_BASE_URL}:{},...f.env.OPENAI_BASE_URL?{OPENAI_BASE_URL:f.env.OPENAI_BASE_URL}:{},...f.env.OPENAI_API_KEY?{OPENAI_API_KEY:f.env.OPENAI_API_KEY}:{}};if(!M.GOATCHAIN_MODEL&&Xf(R.model))M.GOATCHAIN_MODEL=String(R.model);if(!M.GOATCHAIN_CONTEXT_WINDOW&&Iy(R.contextWindow)!=null)M.GOATCHAIN_CONTEXT_WINDOW=String(R.contextWindow);if(!M.GOATCHAIN_TEMPERATURE&&Iy(R.temperature)!=null)M.GOATCHAIN_TEMPERATURE=String(R.temperature);if(!M.GOATCHAIN_TOP_P&&Iy(R.topP)!=null)M.GOATCHAIN_TOP_P=String(R.topP);if(!M.GOATCHAIN_TOOL_APPROVALS&&R.toolApprovals==="auto")M.GOATCHAIN_TOOL_APPROVALS="auto";if(!M.GOATCHAIN_TOOL_APPROVALS&&R.toolApprovals==="all")M.GOATCHAIN_TOOL_APPROVALS="all";if(!M.GOATCHAIN_TOOL_APPROVALS&&R.toolApprovals==="manual")M.GOATCHAIN_TOOL_APPROVALS="auto";if(!M.GOATCHAIN_OPENAI_BASE_URL&&Xf(R.baseUrl))M.GOATCHAIN_OPENAI_BASE_URL=String(R.baseUrl);if(!M.OPENAI_API_KEY&&Xf(R.apiKey))M.OPENAI_API_KEY=String(R.apiKey);return{context:{system:["You are GoatChain.","Use GoatChain tools when needed and stream progress.","If a tool requires approval, wait for the user and then continue."].join(`
7
7
  `),cwd:V||".",env:M,...$?.length?{focusFiles:$}:{}},cacheDir:u.dir,cacheFile:u.filePath,cache:G}}async function G$(f){try{let[{readFile:y},u]=await Promise.all([import("node:fs/promises"),import("node:path")]),G=await y(u.join(f,"package.json"),"utf8"),R=JSON.parse(G),V=typeof R?.version==="string"?R.version:null;return V&&V.trim()?V.trim():null}catch{return null}}import{watch as $u}from"vue";function J0(f,y){let u=String(f??"").replace(/\s+/g," ").trim();if(u.length<=y)return u;return`${u.slice(0,Math.max(0,y-1))}…`}function V$(f){if(typeof f==="string")return f;if(Array.isArray(f))return f.filter((u)=>u&&typeof u==="object"&&u.type==="text"&&typeof u.text==="string").map((u)=>u.text).join(" ");if(f&&typeof f==="object"){let y=f.text;if(typeof y==="string")return y}return""}function P0(f){if(!f||typeof f!=="object")return"";let y=String(f.role??"");if(y==="user")return V$(f.content);if(y==="tool")return String(f.result?.output??"");if(y==="assistant"){let u=Array.isArray(f.parts)?f.parts:[],G=u.filter((V)=>V?.type==="markdown").map((V)=>String(V.markdown??"")).join(`
8
8
  `);if(G.trim())return G;let R=u.find((V)=>V?.type==="status");return R?String(R.text??""):""}return""}function K2(f){let u=(Array.isArray(f)?f:[]).find((R)=>R&&typeof R==="object"&&R.role==="user"&&J0(P0(R),999).length>0),G=u?P0(u):"";return J0(G||"New session",60)||"New session"}function M2(f){let u=(Array.isArray(f)?f:[]).find((R)=>R&&typeof R==="object"&&R.role==="user"&&J0(P0(R),999).length>0),G=u?P0(u):"";return J0(G||"New session",120)||"New session"}function Z2(f){let u=[...Array.isArray(f)?f:[]].reverse().find((G)=>{if(!G||typeof G!=="object"||G.role!=="user")return!1;return J0(P0(G),999).length>0});return J0(u?P0(u):"",180)}function Gu(f){return`${f}_${Date.now()}_${Math.random().toString(36).slice(2,9)}`}function tu(f){return f!=null&&typeof f==="object"&&!Array.isArray(f)}function Vu(f){if(f==null)return"";if(typeof f==="string")return f;if(Array.isArray(f))return f.map(Vu).join("");if(tu(f)){if(typeof f.text==="string")return String(f.text);if(String(f.type??"")==="image")return"[image]";try{return JSON.stringify(f)}catch{return String(f)}}return String(f)}function $$(f){if(tu(f))return f;if(typeof f==="string"){let y=f.trim();if(!y)return{};try{let u=JSON.parse(y);return tu(u)?u:{_raw:f}}catch{return{_raw:f}}}return{}}function J2(f){let y=f?.context?.messages,u=Array.isArray(y)?y:[],G=[],R=new Map;for(let V of u){let $=String(V?.role??"");if($==="user"){G.push({id:Gu("m"),role:"user",content:Vu(V?.content)});continue}if($==="assistant"){let M=[],K=Vu(V?.content);if(K)M.push({type:"markdown",markdown:K});let Z=Array.isArray(V?.tool_calls)?V.tool_calls:[];for(let _ of Z){let j=String(_?.id??"").trim(),Q=String(_?.function?.name??"tool"),z=$$(_?.function?.arguments);if(!j)continue;let J={id:j,name:Q,arguments:z};M.push({type:"tool_call",call:J}),R.set(j,G.length)}G.push({id:Gu("m"),role:"assistant",parts:[{type:"status",text:""},...M]});continue}if($==="tool"){let M=String(V?.tool_call_id??"").trim(),K=Vu(V?.content),Z=V?.isError?"error":"success",_={id:M||Gu("tool"),output:K,status:Z};G.push({id:Gu("m"),role:"tool",result:_});let j=M?R.get(M):void 0;if(j==null)continue;let Q=G[j];if(!Q||Q.role!=="assistant")continue;G[j]={...Q,parts:[...Q.parts,{type:"tool_result",result:_}]};continue}}return G}function P2(f){let y=[];for(let u of f){if(u.role==="user"){y.push({role:"user",content:String(u.content??"")});continue}if(u.role==="assistant"){let G=u.parts.filter(($)=>$.type==="markdown").map(($)=>String($.markdown??"")).join(""),R=u.parts.flatMap(($)=>$.type==="tool_call"?[$.call]:[]),V=R.length?R.map(($)=>({id:$.id,type:"function",function:{name:$.name,arguments:$.arguments}})):void 0;y.push({role:"assistant",content:G,...V?{tool_calls:V}:{}});continue}if(u.role==="tool")y.push({role:"tool",tool_call_id:String(u.result.id??""),content:String(u.result.output??""),...u.result.status==="error"?{isError:!0}:{}})}return y}function _2(f){return String(f?.id??"").trim()}function R$(f){return Number(f?.state?.updatedAt??f?.state?.lastActiveAt??0)||0}function Q2(f){let y=f?.context?.messages;return Array.isArray(y)?y:[]}function K$(f){let y=Number(f?.context?.messageCount??0);if(Number.isFinite(y)&&y>=0)return y;return Q2(f).length}function M$(f){let y=f?.stats?.usage;return y&&typeof y==="object"?y:null}function U2(f){let y=_2(f);if(!y)return null;let u=R$(f),G=Q2(f),R=Xf(f?.state?.title)??K2(G),V=M2(G),$=Xf(f?.context?.lastMessagePreview)??Z2(G),M=K$(f);return{id:y,updatedAt:u,title:R,summary:V,messageCount:M,lastMessage:$}}function _0(f,y){let u=_2(y);if(u)f.state.sessionId=u;let G=J2(y);f.state.messages.splice(0,f.state.messages.length,...G),f.state.revertedMessages.splice(0,f.state.revertedMessages.length),f.state.selectedToolCallId=null,f.state.runningToolCallId=null,f.state.paused=null,f.state.approval.active=null,f.state.approval.pendingAutoRun=null,f.state.approval.queue=[],f.state.approval.decisions={};let R=M$(y);if(R){let V=Number(R.promptTokens),$=Number(R.completionTokens);if(Number.isFinite(V))f.state.usage.prompt_tokens=V;if(Number.isFinite($))f.state.usage.completion_tokens=$;if(Number.isFinite(V)&&Number.isFinite($))f.state.usage.total_tokens=V+$;else{let M=Number(R.totalTokens);if(Number.isFinite(M))f.state.usage.total_tokens=M}}}function j2(f){let y=Array.isArray(f)?f:[];return P2(y)}function O2(f){let y=f.store,u=y?.state?.context?.env??{},G=Xf(u.GOATCHAIN_OPENAI_BASE_URL||u.OPENAI_BASE_URL),R=Xf(u.OPENAI_API_KEY);return{version:1,updatedAt:Date.now(),settings:{cwd:Xf(y?.state?.context?.cwd),focusFiles:y?.state?.context?.focusFiles??void 0,model:Xf(y?.state?.config?.model),contextWindow:Iy(y?.state?.config?.context_window),temperature:Iy(y?.state?.config?.temperature),topP:Iy(y?.state?.config?.top_p),baseUrl:G,apiKey:R,toolApprovals:y?.state?.approval?.mode==="all"?"all":"auto"},lastSessionId:Xf(y?.state?.sessionId)||f.prev.lastSessionId}}function q2(f,y){let u=null,G=!1,R=!1,V=async()=>{if(G){R=!0;return}G=!0,R=!1;try{await f()}finally{if(G=!1,R)$()}},$=()=>{if(R=!0,u)clearTimeout(u);u=setTimeout(V,Math.max(0,y||0))};return{schedule:$}}function Z$(f){return String(f?.id??"").trim()}function z2(f){let y=null,u=f.sessionsBackend??null;return{sessions:u?{async list(){return(await u.list()).map(U2).filter(Boolean)},async use(V){let $=String(V??"").trim();if(!$||!y)return;if(String(y.state.sessionId??"")===$)return;let M=await u.get($);if(!M)return;_0(y,M)},async createNew(){if(!y)return;let V=await u.create();if(!V)return;_0(y,V)},async delete(V){let $=String(V??"").trim();if(!$)return;if(await u.destroy($),y&&String(y.state.sessionId??"")===$){let M=await u.create();if(M)_0(y,M)}},async fork(V){if(!y)return;let $=Array.isArray(V?.messages)?V.messages:[];if(typeof u.createWithMessages!=="function"){let K=await u.create();if(K)y.state.sessionId=Z$(K);y.state.messages.splice(0,y.state.messages.length,...$),y.state.revertedMessages.splice(0,y.state.revertedMessages.length),y.state.selectedToolCallId=null,y.state.usage.prompt_tokens=0,y.state.usage.completion_tokens=0,y.state.usage.total_tokens=0;return}let M=await u.createWithMessages(j2($));if(!M)return;_0(y,M)}}:void 0,onStoreCreated:(V)=>{if(y=V,u){let M=String(V.state.sessionId??"").trim();if(M)u.get(M).then((K)=>{if(K&&y)_0(y,K)}).catch(()=>{})}let $=q2(async()=>{try{let M=O2({prev:f.cache,store:V});await $2(f.cacheFile,M)}catch(M){console.warn("[goatchain] Failed to persist cache:",M)}},300);$u(()=>V.state.sessionId,$.schedule),$u(()=>V.state.config,$.schedule,{deep:!0}),$u(()=>V.state.context,$.schedule,{deep:!0}),$u(()=>V.state.approval.mode,$.schedule),$.schedule()}}}async function f1(f){let y=f.sessionsBackend,u=Xf(f.envSessionId);if(y&&u){if(await y.get(u))return u}if(y){let G=await y.create();return Xf(G?.id)}return u}function b2(){return async(f)=>{let y=String(f?.name??"tool");return{id:String(f?.id??"tool"),status:"error",output:["Tool execution is handled by the GoatChain agent.",`This UI cannot run tool "${y}" locally.`].join(`
9
9
  `)}}}import*as N2 from"node:path";function J$(f){return N2.join(f,"state")}function P$(f){f.env.GOATCHAIN_STATE_DIR=f.stateDir,f.context.env.GOATCHAIN_STATE_DIR=f.stateDir}async function y1(f){let{context:y,cacheDir:u,cacheFile:G,cache:R}=await R2({cwd:f.cwd,env:f.env}),V=J$(u);P$({env:f.env,context:y,stateDir:V});let $=G2({context:y,processEnv:f.env,stateDir:V}),M=$?.__sessions??null,K=await f1({sessionsBackend:M,envSessionId:f.env.GOATCHAIN_SESSION_ID});if(K)f.env.GOATCHAIN_SESSION_ID=K,y.env.GOATCHAIN_SESSION_ID=K;let{sessions:Z,onStoreCreated:_}=z2({cacheFile:G,cache:R,sessionsBackend:M});return{toolRunner:b2(),context:y,agent:$,onStoreCreated:_,sessions:Z}}import{createStdinDriver as _$,createStdoutRenderer as Q$,createTerminalApp as U$,readEventLog as j$,writeEventLog as O$,writeSnapshot as F2}from"@simon_he/vue-tui";import{nextTick as Mu}from"vue";var u1=null,Ru=null;function H2(f){u1=f}function B2(f){return Ru=f,()=>{if(Ru===f)Ru=null}}function Ku(){let f=Ru;if(f&&f.isBusy()){f.showConfirm();return}u1?.()}function Y2(){u1?.()}function G1(){return typeof performance<"u"?performance.now():Date.now()}async function V1(f){await new Promise((y)=>setTimeout(y,f))}function q$(f){let y=U$({cols:f.cols,rows:f.rows,component:f.component,props:f.props,defaultStyle:f.defaultStyle});return f.install?.(y.app),y.mount(),{app:y.app,terminal:y.terminal,events:y.events,scheduler:y.scheduler,getImeAnchor:y.getImeAnchor,dispose:y.dispose}}async function z$(f,y,u){let G=null;for(let R of u){let V=typeof R?.time==="number"?R.time:null;if(V!=null&&G!=null){let $=Math.max(0,V-G);await V1(Math.min($,5000))}if(V!=null)G=V;f.dispatch(R),await Mu(),y.flush()}}async function X2(f){let y=q$({cols:f.cols,rows:f.rows,component:f.component,props:f.props,install:f.install,defaultStyle:f.defaultStyle}),u=Q$(y.terminal,{output:f.proc.stdout,altScreen:f.altScreen,palette:f.palette,trackResize:!f.sizeLocked,hideCursor:!0,defaultBg:f.defaultBg,getImeAnchor:y.getImeAnchor}),G=[],R=G1(),V=(K)=>{let Z=K.time==null?{...K,time:G1()-R}:K;G.push(Z),y.events.dispatch(Z)};y.scheduler.flush();let $=null;if(H2(()=>{(async()=>{if($?.dispose(),u.dispose(),f.recordPath)await O$(f.recordPath,G);if(f.snapshotPath)await F2(f.snapshotPath,y.terminal.snapshot().lines);y.dispose(),f.proc.exit(0)})()}),f.replayPath){await Mu(),await Mu(),y.scheduler.flush();let K=await j$(f.replayPath);if(await z$(y.events,y.scheduler,K),await V1(800),await Mu(),y.scheduler.flush(),f.snapshotPath)await F2(f.snapshotPath,y.terminal.snapshot().lines);u.dispose(),y.dispose();return}$=_$({dispatch:V,enableMouse:f.enableMouse,onExit:()=>Ku()}),f.proc.on("SIGINT",()=>Ku()),f.proc.on("SIGTERM",()=>Ku())}import{computed as cf,defineComponent as GR,h as y0,inject as VR,nextTick as $R,provide as RR,ref as Sy,watch as r0}from"vue";import{TText as KR,TView as MR,normalizeNewlines as tG,useLayout as ZR,useRoute as JR,useRouter as PR,useTerminal as _R}from"@simon_he/vue-tui";var oy=Symbol("GoatChainBridge");var E2=["user","assistant","tool"];var D2=["status","thinking","markdown","tool_call","tool_output","tool_result","approve","todo","plan"];var Q0=[...E2,...D2];var Zu=["black","red","green","yellow","blue","magenta","cyan","white","blackBright","redBright","greenBright","yellowBright","blueBright","magentaBright","cyanBright","whiteBright"];function $1(f,y){let u={};for(let G of Q0)u[G]={fg:f,bg:y};return u}var C2=Object.freeze({goatchain:{...$1("white","black"),user:{fg:"whiteBright",bg:"blackBright"},assistant:{fg:"white",bg:"black"},tool:{fg:"white",bg:"black"},markdown:{fg:"white",bg:"black"},status:{fg:"white",bg:"black"},thinking:{fg:"cyanBright",bg:"black"},tool_call:{fg:"white",bg:"black"},tool_output:{fg:"white",bg:"black"},tool_result:{fg:"white",bg:"black"},approve:{fg:"white",bg:"black"},todo:{fg:"whiteBright",bg:"black"},plan:{fg:"whiteBright",bg:"black"}},mono:{...$1("white","black"),user:{fg:"white",bg:"black"},assistant:{fg:"white",bg:"black"},tool:{fg:"white",bg:"black"},thinking:{fg:"white",bg:"black"}},contrast:{...$1("whiteBright","black"),user:{fg:"whiteBright",bg:"blackBright"},assistant:{fg:"whiteBright",bg:"black"},tool:{fg:"whiteBright",bg:"black"},thinking:{fg:"blueBright",bg:"black"},tool_call:{fg:"yellowBright",bg:"black"},tool_output:{fg:"cyanBright",bg:"black"},tool_result:{fg:"cyanBright",bg:"black"},todo:{fg:"greenBright",bg:"black"},plan:{fg:"magentaBright",bg:"black"}}});function by(f,y){let u=C2[f.preset]??C2.goatchain,G=u[y]??u.assistant??{fg:"white",bg:"black"},R=f.overrides?.[y]??{};return{...G,...R}}import{parseAnsiSgr as N$,textCellWidth as Hy}from"@simon_he/vue-tui";function b$(f){let u="";for(let G=0;G<f.length;G++){if(f[G]!=="\x1B"||f[G+1]!=="["){u+=f[G];continue}let R=G+2;while(R<f.length){let V=f.charCodeAt(R);if(V>=48&&V<=57||V===59){R++;continue}break}if(R<f.length&&f[R]==="m"){G=R;continue}u+=f[G]}return u}function W2(f){f=b$(f);let y="";for(let u of f){let G=u.codePointAt(0);if(G<=31&&G!==10&&G!==9||G===127)continue;y+=u}return y}import{charCellWidth as L2}from"@simon_he/vue-tui";function U0(f){let y=0;for(let u of f)y+=L2(u);return y}function Ju(f,y){if(y=Math.max(0,Math.floor(y)),y<=0)return{chunk:"",rest:f};let u=0,G=0;for(;G<f.length;){let R=f.codePointAt(G)??0,V=String.fromCodePoint(R),$=L2(V);if(u+$>y)break;if(u+=$,G+=V.length,u>=y)break}return{chunk:f.slice(0,G),rest:f.slice(G)}}function Pu(f,y){return Ju(f,y).chunk}function k2(f,y){y=Math.max(0,Math.floor(y));let u=U0(f);if(u>=y)return Pu(f,y);return`${f}${" ".repeat(y-u)}`}function A2(f,y){if(y=Math.max(1,Math.floor(y)),!f)return[""];let u=[],G=f;while(!0){let{chunk:R,rest:V}=Ju(G,y);if(u.push(R),!V)break;G=V}return u}function _u(f){let y=[],u="",G=0;function R(){if(!u)return;y.push({kind:"text",text:u}),u=""}while(G<f.length){let V=f[G];if(V==="`"){let $=f.indexOf("`",G+1);if($>G+1){R(),y.push({kind:"code",text:f.slice(G+1,$)}),G=$+1;continue}}if(V==="*"&&f[G+1]==="*"){let $=f.indexOf("**",G+2);if($>G+2){R(),y.push({kind:"bold",text:f.slice(G+2,$)}),G=$+2;continue}}u+=V,G++}return R(),y}function Qu(f,y){if(y<=0)return[[{kind:"text",text:""}]];function u(Z){let _=[],j=/\s+/g,Q=0;for(let z=j.exec(Z.text);z;z=j.exec(Z.text)){if(z.index>Q)_.push({kind:Z.kind,text:Z.text.slice(Q,z.index)});_.push({kind:Z.kind,text:z[0]}),Q=z.index+z[0].length}if(Q<Z.text.length)_.push({kind:Z.kind,text:Z.text.slice(Q)});return _}let G=[],R=[],V=0;function $(Z){if(!Z.text)return 0;if(/^\s+$/.test(Z.text))return Z.text.length;return U0(Z.text)}function M(Z){let _=R[R.length-1];if(_&&_.kind===Z.kind){_.text+=Z.text;return}R.push({...Z})}function K(){G.push(R),R=[],V=0}for(let Z of f)for(let _ of u(Z)){if(!_.text)continue;if(/^\s+$/.test(_.text)&&V===0)continue;let j=$(_);if(j<=y-V){M(_),V+=j;continue}if(!/^\s+$/.test(_.text)&&V>0&&j<=y){K(),M(_),V+=j;continue}let Q=_.text;while(Q){let z=y-V;if(z<=0){K();continue}if(/^\s+$/.test(Q)){K(),Q="";continue}let J=Ju(Q,z),O=J.chunk;if(Q=J.rest,M({kind:_.kind,text:O}),V+=U0(O),V>=y)K()}}if(R.length===0)return G.length?G:[[{kind:"text",text:""}]];return G.push(R),G}function w2(f,y){let u=W2(f).split(`
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "goatchain-cli",
3
3
  "type": "module",
4
- "version": "0.0.3-beta.18",
4
+ "version": "0.0.3-beta.19",
5
5
  "description": "GoatChain CLI built on @simon_he/vue-tui",
6
6
  "bin": {
7
7
  "goatchain": "./cli.mjs"
@@ -22,6 +22,20 @@
22
22
  "dist",
23
23
  "cli.mjs"
24
24
  ],
25
+ "dependencies": {
26
+ "@simon_he/vue-tui": "^workspace:../*",
27
+ "goatchain": "^workspace:../*",
28
+ "semver": "^7.7.3",
29
+ "shiki": "^3.20.0",
30
+ "vue": "^3.4.0"
31
+ },
32
+ "devDependencies": {
33
+ "@types/node": "^18.19.111",
34
+ "happy-dom": "^17.5.0",
35
+ "tsdown": "^0.20.0-beta.3",
36
+ "typescript": "5.8.3",
37
+ "vitest": "^4.0.17"
38
+ },
25
39
  "scripts": {
26
40
  "build": "bun run build.mjs",
27
41
  "build:npm": "tsdown --minify",
@@ -36,22 +50,7 @@
36
50
  "smoke": "bun run build && bun dist/cli.mjs --help",
37
51
  "lint": "eslint src/**/*.ts",
38
52
  "lint:fix": "eslint src/**/*.ts --fix",
39
- "prepack": "bun run build",
40
53
  "release": "bumpp --commit --no-tag --no-push && bun run build && bun publish",
41
54
  "release:npm": "bumpp --commit --no-tag --no-push && pnpm run build:npm && pnpm publish --access public"
42
- },
43
- "dependencies": {
44
- "@simon_he/vue-tui": "^workspace:../*",
45
- "goatchain": "^workspace:../*",
46
- "semver": "^7.7.3",
47
- "shiki": "^3.20.0",
48
- "vue": "^3.4.0"
49
- },
50
- "devDependencies": {
51
- "@types/node": "^18.19.111",
52
- "happy-dom": "^17.5.0",
53
- "tsdown": "^0.20.0-beta.3",
54
- "typescript": "5.8.3",
55
- "vitest": "^4.0.17"
56
55
  }
57
- }
56
+ }