goatchain-cli 0.0.4-beta.6 → 0.0.4-beta.7
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/cli.mjs +1 -1
- package/dist/cli.mjs +1 -1
- package/package.json +1 -1
package/cli.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
#!/usr/bin/env node --no-warnings
|
|
2
|
-
import('./dist/cli.mjs')
|
|
2
|
+
await import('./dist/cli.mjs')
|
package/dist/cli.mjs
CHANGED
|
@@ -595,7 +595,7 @@ assistant: Clients are marked as failed in the \`connectToServer\` function in s
|
|
|
595
595
|
</example>`,model:J,tools:U,stateStore:_});K.use(X),K.use(B5({maxTokens:128000,protectedTurns:2,model:J,stateStore:_})),X0("Agent initialized with tools:",Array.from(U.list().map((P)=>P.name))),X0("Agent initialized with middlewares:",K.middlewareNames.join(", "));let N=new w7(K,{debug:VF,maxIterations:1e4}),B=new Ow(N),W=Vd.toWeb(f6.stdin),H=Kd.toWeb(f6.stdout),F=aL(H,W);X0("Creating AgentSideConnection...");let j=new JF((P)=>{return X0("Agent connection established"),B.setConnection(P),B},F);X0("ACP Server ready and listening on stdio"),await j.closed,X0("Connection closed"),N.destroy()}var qd=import.meta.url===`file://${f6.argv[1]}`||f6.argv[1]?.endsWith("acp-server.ts")||f6.argv[1]?.endsWith("acp-server.js");if(qd)fw().catch(($)=>{console.error("[ACP Server] Fatal error:",$),f6.exit(1)});function Md(){let $=globalThis.process;return!!$&&typeof $?.versions?.node==="string"}function KF(){return globalThis.process?.env??{}}var Dw="plan-mode";function E1($){return String($??"").trim()||void 0}function qw($){let U=String($??"").trim();if(!U)return;let J=Number.parseFloat(U);return Number.isFinite(J)?J:void 0}function Ed($){if(typeof $==="string")return $;if(Array.isArray($))return $.map((U)=>{if(typeof U==="object"&&U&&"text"in U)return String(U.text??"");return JSON.stringify(U)}).join(`
|
|
596
596
|
`);try{return JSON.stringify($,null,2)}catch{return String($)}}function Pd($,U){if(!U||typeof $?.cancel!=="function")return()=>{};if(U.aborted){try{$.cancel()}catch{}return()=>{}}let J=()=>{try{$.cancel()}catch{}};return U.addEventListener("abort",J,{once:!0}),()=>{try{U.removeEventListener("abort",J)}catch{}}}function Ld($){return{id:String($?.id??""),type:"function",function:{name:String($?.function?.name??""),arguments:$?.function?.arguments}}}function wd($){let U={};for(let J of $){if(J.role!=="tool"||!J.tool_call_id)continue;let _=typeof J.content==="string"?J.content:J.content?JSON.stringify(J.content):"";try{let G=JSON.parse(_);if(G&&typeof G==="object"&&G.answers&&typeof G.answers==="object")U[J.tool_call_id]=G.answers}catch{}}return U}function NF($){if(!$)return"";if(typeof $==="string")return $;if(Array.isArray($))return $.map((U)=>String(U?.text??"")).join("");return String($)}function ZF($){if(!$||typeof $!=="object")return null;let U=$.usage;if(U&&typeof U==="object")return U;let J=$.stats?.usage;if(J&&typeof J==="object")return J;try{let G=(typeof $.toSnapshot==="function"?$.toSnapshot():null)?.stats?.usage;if(G&&typeof G==="object")return G}catch{}return null}function jw($){if(!Md())throw Error("GoatChain embedded agent is Node-only");let U=$.debug===!0,J=$.cliTools!==!1,_=$.planMode===!0,G=$.subagents===!0,Q=E1($.stateDir||KF().GOATCHAIN_STATE_DIR||KF().GOATCHAIN_STATE_DIR),Y=null,X=_?"plan":"agent",V=null,K=null,N=null,B=null;function W(f,A){let T=f.filter((b)=>b.role!=="system"),z=(()=>{for(let b=T.length-1;b>=0;b--)if(T[b]?.role==="user")return b;return-1})(),R=String(A??"").trim(),I=z===T.length-1&&R.length>0,y=[];for(let b=0;b<T.length;b++){if(I&&b===z)continue;let c=T[b];if(!c)continue;if(c.role==="user")y.push({role:"user",content:NF(c.content)});else if(c.role==="assistant"){let e={role:"assistant",content:NF(c.content)};if(Array.isArray(c.tool_calls)&&c.tool_calls.length)e.tool_calls=c.tool_calls;y.push(e)}else if(c.role==="tool")y.push({role:"tool",tool_call_id:String(c.tool_call_id??""),content:NF(c.content),...c.metadata?.error===!0?{isError:!0}:{}})}return y}function H(f,A,T){try{if(!f||!Array.isArray(f.messages))return;let z=W(A,T);if(z.length===0)return;if(f.messages.length>=z.length)return;f.messages=z}catch{}}function F(f){let A=f?.env;if(!A||typeof A!=="object")return;let T=globalThis.process;if(!T?.env)return;for(let[z,R]of Object.entries(A)){let I=String(z??"").trim();if(!I)continue;let y=R==null?"":String(R);if(!y)delete T.env[I];else T.env[I]=y}}let j=new Map;async function P(){if(Y)return Y;if(Q&&typeof p1==="function")try{return Y=new p1({dir:Q,deleteOnComplete:!1}),Y}catch(f){if(U)console.warn("[goatchain-node] Failed to init FileStateStore:",f);Y=null}if(!Y&&typeof o1==="function")try{Y=new o1({deleteOnComplete:!1})}catch(f){if(U)console.warn("[goatchain-node] Failed to init InMemoryStateStore:",f);Y=null}return Y}function w(f,A){return{id:f,createdAt:A,state:{status:"active",updatedAt:A,lastActiveAt:A},context:{messages:[],messageCount:0,toolCallCount:0},stats:{usage:{promptTokens:0,completionTokens:0,totalTokens:0},responseCount:0}}}function q(f){if(!Array.isArray(f)||f.length===0)return;for(let A=f.length-1;A>=0;A--){let T=f[A],z=String(T?.role??"");if(z!=="user"&&z!=="assistant"&&z!=="system"&&z!=="tool")continue;let R=T?.content;if(typeof R==="string"){let I=R.replace(/\s+/g," ").trim();if(I)return I.slice(0,200)}if(Array.isArray(R)){let I=R.filter((y)=>y&&typeof y==="object"&&y.type==="text"&&typeof y.text==="string").map((y)=>y.text).join(" ").replace(/\s+/g," ").trim();if(I)return I.slice(0,200)}}return}async function S(){let f=F6?.SESSION;return typeof f==="string"&&f.trim()?f:"session"}function v(){let f=KF();return{modelId:String(f.GOATCHAIN_MODEL||$.modelId),baseUrl:E1(f.GOATCHAIN_OPENAI_BASE_URL||f.OPENAI_BASE_URL||$.baseUrl),apiKey:E1(f.OPENAI_API_KEY||$.apiKey),temperature:qw(f.GOATCHAIN_TEMPERATURE),topP:qw(f.GOATCHAIN_TOP_P)}}function O(f){return JSON.stringify({modelId:f.modelId,baseUrl:f.baseUrl??null,apiKey:f.apiKey?"***":null,temperature:f.temperature??null,topP:f.topP??null})}async function D(f){await P();let A=new j1,T=(b)=>{if(!b)return;try{A.register(new b)}catch(c){if(U)console.warn("[goatchain-node] Failed to register tool:",b?.name??"(unknown)",c)}};if(T($2),T(Y2),T(X2),T(J2),T(a1),T(K2),T(N2),J)T(W2),T(U2),T(s1),T(e1),T(V2);let z=CH(HJ,f),R=cU({adapter:z}),I=[];if(typeof EJ==="function"){if(V=EJ({insertEveryIteration:!0}),X==="plan")I.push(V)}if(G&&typeof PJ==="function"&&B2)try{I.push(PJ({subagents:[B2],globalToolRegistry:A,model:R}))}catch(b){if(U)console.warn("[goatchain-node] Failed to init subagent middleware:",b)}return{agent:new u4({name:"GoatChain",systemPrompt:$.systemPrompt,model:R,tools:A,...Y?{stateStore:Y}:{},...I.length?{middleware:I}:{}}),tools:A}}async function E(){let f=v(),A=O(f);if(A!==B){let{agent:T,tools:z}=await D(f);K=T,N=z,B=A,j.clear()}}async function L(f,A){let T=E1(f),z=T?j.get(T):void 0;if(z&&A?.resumeOnly)return{sessionId:T,session:z.session};if(await E(),z)return{sessionId:T,session:z.session};let R=v(),I={...typeof R.temperature==="number"?{temperature:R.temperature}:{},...typeof R.topP==="number"?{topP:R.topP}:{}},y;if(T&&Y&&typeof K?.resumeSession==="function")try{y=await K.resumeSession(T,{requestParams:I})}catch{y=await K.createSession({sessionId:T,requestParams:I})}else if(T)y=await K.createSession({sessionId:T,requestParams:I});else y=await K.createSession({requestParams:I});let b=E1(y?.id)??E1(y?.sessionId)??T;if(!b)throw Error("GoatChain session id is missing");return j.set(b,{session:y}),{sessionId:b,session:y}}async function*k(f){for await(let A of f){if(A?.type==="subagent_event"){let R=A?.nestedEvent,I=M(R),y=E1(R?.sessionId);for(let b of I)yield{...b,metadata:{...b.metadata??{},...y?{session_id:y}:{},subagent:!0,subagentId:A?.subagentId,subagentType:A?.subagentType,taskDescription:A?.taskDescription,originalEventType:R?.type}};continue}let T=M(A),z=E1(A?.sessionId);for(let R of T)yield z?{...R,metadata:{...R.metadata??{},session_id:z}}:R}}function M(f){if(!f||typeof f!=="object")return[];switch(f.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(f.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(f.callId??""),toolName:f.toolName,argsTextDelta:f.argsTextDelta}}];case"tool_call_start":return[{role:"assistant",content:"",metadata:{originalEventType:"tool_call_start",callId:String(f.callId??""),toolName:f.toolName}}];case"tool_call_end":return[{role:"assistant",content:"",tool_calls:[Ld(f.toolCall)],metadata:{originalEventType:"tool_call_end"}}];case"tool_output_start":return[{role:"assistant",content:"",metadata:{originalEventType:"tool_output_start",tool_call_id:String(f.tool_call_id??""),tool_name:String(f.toolName??f.tool_name??"")}}];case"tool_output_delta":return[{role:"assistant",content:String(f.delta??""),metadata:{originalEventType:"tool_output_delta",tool_call_id:String(f.tool_call_id??""),isStderr:f.isStderr}}];case"tool_result":let A=Boolean(f.isError||f.result?.isError===!0);return[{role:"tool",tool_call_id:String(f.tool_call_id??""),content:Array.isArray(f.result?.content)?f.result.content:Ed(f.result),metadata:{...A?{error:!0}:null,originalEventType:"tool_result",structuredContent:f.result?.structuredContent,rawResult:U?f.result:void 0}}];case"tool_skipped":return[{role:"assistant",content:`Tool skipped: ${String(f.toolName??"")} - ${String(f.reason??"")}`,metadata:{originalEventType:"tool_skipped"}}];case"tool_approval_requested":return[{role:"assistant",content:`Tool approval requested: ${String(f.toolName??"")}`,metadata:{approval_requested:!0,tool_call_id:String(f.tool_call_id??""),tool_name:String(f.toolName??""),risk_level:f.riskLevel,approval_args:f.args,originalEventType:"tool_approval_requested"}}];case"requires_action":{let T={requires_action:!0,kind:f.kind,tool_call_id:f.toolCallId,originalEventType:"requires_action"};if(f.kind==="ask_user"&&f.questions)T.questions=f.questions;return[{role:"assistant",content:`Action required: ${String(f.kind??"")}`,metadata:T}]}case"thinking_delta":return[{role:"assistant",content:String(f.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:f.usage}}];case"done":return[{role:"assistant",content:"",metadata:{done:!0,stopReason:f.stopReason,modelStopReason:f.modelStopReason,usage:f.usage,error:f.error,originalEventType:"done"}}];case"error":return[{role:"assistant",content:"",metadata:{done:!0,error:f.error??f.message??f,stopReason:"error",originalEventType:"error"}}];default:if(U)console.warn("[goatchain-node] Unhandled event:",f.type);return[]}}return{async*receiveMessage(f,A){try{F(A);let T=A?.signal,z=E1(A?.session_id),R=A?.resume===!0;if(!z&&R)throw Error("Cannot resume without a session id");let I=await L(z,{resumeOnly:R}),y=I.sessionId,b=I.session,c=Pd(b,T);try{let e=String(A?.cwd??"").trim();if(e&&N){for(let n of N?.list?.()??[])if(typeof n?.setCwd==="function")try{n.setCwd(e)}catch(i){if(U)console.warn("[goatchain-node] Failed to setCwd on tool:",n?.name,i)}}let G$=A?.toolContext,y$=wd(f),c$={};if(G$&&typeof G$==="object")Object.assign(c$,G$);if(Object.keys(y$).length>0)c$.askUser=c$.askUser??{},c$.askUser.answers={...c$.askUser.answers??{},...y$};let l$=[...f].reverse().find((n)=>n.role==="user"),O$=typeof l$?.content==="string"?l$.content:"";if(!Y)H(b,f,O$);if(R&&Object.keys(c$).length){yield*IH({session:b,toolContext:c$,signal:T,convertEventStream:k});let n=ZF(b);if(n)yield{role:"assistant",content:"",metadata:{originalEventType:"usage_refresh",usage:n,...y?{session_id:y}:{}}};return}if(O$.trim()){b.send(O$,Object.keys(c$).length?{toolContext:c$,...T?{signal:T}:null}:T?{signal:T}:void 0),yield*k(b.receive(T?{signal:T}:void 0));let n=ZF(b);if(n)yield{role:"assistant",content:"",metadata:{originalEventType:"usage_refresh",usage:n,...y?{session_id:y}:{}}};return}yield*k(b.receive(Object.keys(c$).length?{toolContext:c$,...T?{signal:T}:null}:T?{signal:T}:void 0));let h=ZF(b);if(h)yield{role:"assistant",content:"",metadata:{originalEventType:"usage_refresh",usage:h,...y?{session_id:y}:{}}}}finally{c()}}catch(T){yield{role:"assistant",content:["# GoatChain error","","```text",T instanceof Error?T.stack||T.message:String(T),"```"].join(`
|
|
597
597
|
`),metadata:{done:!0,error:!0,stopReason:"error",originalEventType:"done"}}}},__sessions:bH({ensureSharedStateStore:P,sessionStorageKey:S,createEmptySessionSnapshot:w,createId:()=>jd(),applyMessagesToSnapshot:(f,A,T)=>{f.context.messages=A,f.context.messageCount=A.length;let z=q(A);if(z)f.context.lastMessagePreview=z;f.state.updatedAt=T,f.state.lastActiveAt=T}}),setMode(f){if(X===f)return;if(X=f,!V||!K)return;let T=K.middlewares.filter((z)=>z.name!==Dw);if(K.clearMiddlewares(),f==="plan")K.use(V,Dw);for(let z of T)K.use(z.fn,z.name);j.clear()},getMode(){return X}}}function Mw($){let U=$.processEnv;try{return jw({systemPrompt:$.context.system,modelId:String(U.GOATCHAIN_MODEL||$.context.env.GOATCHAIN_MODEL||"gpt-4.1-mini"),baseUrl:U.GOATCHAIN_OPENAI_BASE_URL||U.OPENAI_BASE_URL||$.context.env.GOATCHAIN_OPENAI_BASE_URL||$.context.env.OPENAI_BASE_URL,apiKey:U.OPENAI_API_KEY||$.context.env.OPENAI_API_KEY,cliTools:!0,stateDir:$.stateDir})}catch(J){return console.warn("[goatchain] Failed to start GoatChain agent:",J),TH(J)}}function X6($){return String($??"").trim()||void 0}function P2($){if(typeof $==="number"&&Number.isFinite($))return $;let U=String($??"").trim();if(!U)return;let J=Number(U);return Number.isFinite(J)?J:void 0}async function Rd($){let[{homedir:U},J]=await Promise.all([import("node:os"),import("node:path")]),_=X6($.GOATCHAIN_HOME);if(_)return J.resolve(_,"goatchain");let G=X6($.XDG_CONFIG_HOME);if(G)return J.resolve(G,"goatchain","goatchain");return J.resolve(U(),".goatchain","goatchain")}async function Ew($){let U=await Rd($),[{readFile:J},_]=await Promise.all([import("node:fs/promises"),import("node:path")]),G=_.join(U,"cache.json");try{let Q=await J(G,"utf8"),Y=JSON.parse(Q);if(Y&&typeof Y==="object"&&Y.version===1)return{dir:U,filePath:G,cache:Y}}catch{}return{dir:U,filePath:G,cache:{version:1,updatedAt:0}}}async function Pw($,U){let[{mkdir:J,writeFile:_,rename:G,chmod:Q},Y]=await Promise.all([import("node:fs/promises"),import("node:path")]),X=Y.dirname($);await J(X,{recursive:!0});let V=globalThis.process?.pid??"p",K=`${Date.now()}-${Math.random().toString(16).slice(2)}`,N=`${$}.${V}.${K}.tmp`,B=`${JSON.stringify(U,null,2)}
|
|
598
|
-
`;await _(N,B,{encoding:"utf8",mode:384}),await G(N,$);try{await Q($,384)}catch{}}async function Lw($){let U=X6("0.0.4-beta.
|
|
598
|
+
`;await _(N,B,{encoding:"utf8",mode:384}),await G(N,$);try{await Q($,384)}catch{}}async function Lw($){let U=X6("0.0.4-beta.7")??await Ad($.cwd),J=await Ew($.env),_=J.cache,G=_.settings??{},Q=X6(G.cwd),Y=Array.isArray(G.focusFiles)?G.focusFiles.map((V)=>String(V??"")).filter(Boolean):void 0,X={GOATCHAIN_VERSION:U??"dev",...$.env.GOATCHAIN_MODEL?{GOATCHAIN_MODEL:$.env.GOATCHAIN_MODEL}:{},...$.env.GOATCHAIN_CONTEXT_WINDOW?{GOATCHAIN_CONTEXT_WINDOW:$.env.GOATCHAIN_CONTEXT_WINDOW}:{},...$.env.GOATCHAIN_TEMPERATURE?{GOATCHAIN_TEMPERATURE:$.env.GOATCHAIN_TEMPERATURE}:{},...$.env.GOATCHAIN_TOP_P?{GOATCHAIN_TOP_P:$.env.GOATCHAIN_TOP_P}:{},...$.env.GOATCHAIN_TOOL_APPROVALS?{GOATCHAIN_TOOL_APPROVALS:$.env.GOATCHAIN_TOOL_APPROVALS}:{},...$.env.GOATCHAIN_SKIP_APPROVAL?{GOATCHAIN_SKIP_APPROVAL:$.env.GOATCHAIN_SKIP_APPROVAL}:{},...$.env.GOATCHAIN_STARTUP_TOAST?{GOATCHAIN_STARTUP_TOAST:$.env.GOATCHAIN_STARTUP_TOAST}:{},...$.env.GOATCHAIN_OPENAI_BASE_URL?{GOATCHAIN_OPENAI_BASE_URL:$.env.GOATCHAIN_OPENAI_BASE_URL}:{},...$.env.OPENAI_BASE_URL?{OPENAI_BASE_URL:$.env.OPENAI_BASE_URL}:{},...$.env.OPENAI_API_KEY?{OPENAI_API_KEY:$.env.OPENAI_API_KEY}:{}};if(!X.GOATCHAIN_MODEL&&X6(G.model))X.GOATCHAIN_MODEL=String(G.model);if(!X.GOATCHAIN_CONTEXT_WINDOW&&P2(G.contextWindow)!=null)X.GOATCHAIN_CONTEXT_WINDOW=String(G.contextWindow);if(!X.GOATCHAIN_TEMPERATURE&&P2(G.temperature)!=null)X.GOATCHAIN_TEMPERATURE=String(G.temperature);if(!X.GOATCHAIN_TOP_P&&P2(G.topP)!=null)X.GOATCHAIN_TOP_P=String(G.topP);if(!X.GOATCHAIN_TOOL_APPROVALS&&G.toolApprovals==="auto")X.GOATCHAIN_TOOL_APPROVALS="auto";if(!X.GOATCHAIN_TOOL_APPROVALS&&G.toolApprovals==="all")X.GOATCHAIN_TOOL_APPROVALS="all";if(!X.GOATCHAIN_TOOL_APPROVALS&&G.toolApprovals==="manual")X.GOATCHAIN_TOOL_APPROVALS="auto";if(!X.GOATCHAIN_OPENAI_BASE_URL&&X6(G.baseUrl))X.GOATCHAIN_OPENAI_BASE_URL=String(G.baseUrl);if(!X.OPENAI_API_KEY&&X6(G.apiKey))X.OPENAI_API_KEY=String(G.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(`
|
|
599
599
|
`),cwd:Q||".",env:X,...Y?.length?{focusFiles:Y}:{}},cacheDir:J.dir,cacheFile:J.filePath,cache:_}}async function Ad($){try{let[{readFile:U},J]=await Promise.all([import("node:fs/promises"),import("node:path")]),_=await U(J.join($,"package.json"),"utf8"),G=JSON.parse(_),Q=typeof G?.version==="string"?G.version:null;return Q&&Q.trim()?Q.trim():null}catch{return null}}import{watch as FQ}from"vue";function G8($,U){let J=String($??"").replace(/\s+/g," ").trim();if(J.length<=U)return J;return`${J.slice(0,Math.max(0,U-1))}…`}function kd($){if(typeof $==="string")return $;if(Array.isArray($))return $.filter((J)=>J&&typeof J==="object"&&J.type==="text"&&typeof J.text==="string").map((J)=>J.text).join(" ");if($&&typeof $==="object"){let U=$.text;if(typeof U==="string")return U}return""}function _8($){if(!$||typeof $!=="object")return"";let U=String($.role??"");if(U==="user")return kd($.content);if(U==="tool")return String($.result?.output??"");if(U==="assistant"){let J=Array.isArray($.parts)?$.parts:[],_=J.filter((Q)=>Q?.type==="markdown").map((Q)=>String(Q.markdown??"")).join(`
|
|
600
600
|
`);if(_.trim())return _;let G=J.find((Q)=>Q?.type==="status");return G?String(G.text??""):""}return""}function ww($){let J=(Array.isArray($)?$:[]).find((G)=>G&&typeof G==="object"&&G.role==="user"&&G8(_8(G),999).length>0),_=J?_8(J):"";return G8(_||"New session",60)||"New session"}function Rw($){let J=(Array.isArray($)?$:[]).find((G)=>G&&typeof G==="object"&&G.role==="user"&&G8(_8(G),999).length>0),_=J?_8(J):"";return G8(_||"New session",120)||"New session"}function Aw($){let J=[...Array.isArray($)?$:[]].reverse().find((_)=>{if(!_||typeof _!=="object"||_.role!=="user")return!1;return G8(_8(_),999).length>0});return G8(J?_8(J):"",180)}function WQ($){return`${$}_${Date.now()}_${Math.random().toString(36).slice(2,9)}`}function WF($){return $!=null&&typeof $==="object"&&!Array.isArray($)}function BQ($){if($==null)return"";if(typeof $==="string")return $;if(Array.isArray($))return $.map(BQ).join("");if(WF($)){if(typeof $.text==="string")return String($.text);if(String($.type??"")==="image")return"[image]";try{return JSON.stringify($)}catch{return String($)}}return String($)}function zd($){if(WF($))return $;if(typeof $==="string"){let U=$.trim();if(!U)return{};try{let J=JSON.parse(U);return WF(J)?J:{_raw:$}}catch{return{_raw:$}}}return{}}function kw($){let U=$?.context?.messages,J=Array.isArray(U)?U:[],_=[],G=new Map;for(let Q of J){let Y=String(Q?.role??"");if(Y==="user"){_.push({id:WQ("m"),role:"user",content:BQ(Q?.content)});continue}if(Y==="assistant"){let X=[],V=BQ(Q?.content);if(V)X.push({type:"markdown",markdown:V});let K=Array.isArray(Q?.tool_calls)?Q.tool_calls:[];for(let N of K){let B=String(N?.id??"").trim(),W=String(N?.function?.name??"tool"),H=zd(N?.function?.arguments);if(!B)continue;let F={id:B,name:W,arguments:H};X.push({type:"tool_call",call:F}),G.set(B,_.length)}_.push({id:WQ("m"),role:"assistant",parts:[{type:"status",text:""},...X]});continue}if(Y==="tool"){let X=String(Q?.tool_call_id??"").trim(),V=BQ(Q?.content),K=Q?.isError?"error":"success",N={id:X||WQ("tool"),output:V,status:K};_.push({id:WQ("m"),role:"tool",result:N});let B=X?G.get(X):void 0;if(B==null)continue;let W=_[B];if(!W||W.role!=="assistant")continue;_[B]={...W,parts:[...W.parts,{type:"tool_result",result:N}]};continue}}return _}function zw($){let U=[];for(let J of $){if(J.role==="user"){U.push({role:"user",content:String(J.content??"")});continue}if(J.role==="assistant"){let _=J.parts.filter((Y)=>Y.type==="markdown").map((Y)=>String(Y.markdown??"")).join(""),G=J.parts.flatMap((Y)=>Y.type==="tool_call"?[Y.call]:[]),Q=G.length?G.map((Y)=>({id:Y.id,type:"function",function:{name:Y.name,arguments:Y.arguments}})):void 0;U.push({role:"assistant",content:_,...Q?{tool_calls:Q}:{}});continue}if(J.role==="tool")U.push({role:"tool",tool_call_id:String(J.result.id??""),content:String(J.result.output??""),...J.result.status==="error"?{isError:!0}:{}})}return U}function Sw($){return String($?.id??"").trim()}function Sd($){return Number($?.state?.updatedAt??$?.state?.lastActiveAt??0)||0}function vw($){let U=$?.context?.messages;return Array.isArray(U)?U:[]}function vd($){let U=Number($?.context?.messageCount??0);if(Number.isFinite(U)&&U>=0)return U;return vw($).length}function Td($){let U=$?.stats?.usage;return U&&typeof U==="object"?U:null}function Tw($){let U=Sw($);if(!U)return null;let J=Sd($),_=vw($),G=X6($?.state?.title)??ww(_),Q=Rw(_),Y=X6($?.context?.lastMessagePreview)??Aw(_),X=vd($);return{id:U,updatedAt:J,title:G,summary:Q,messageCount:X,lastMessage:Y}}function Q8($,U){let J=Sw(U);if(J)$.state.sessionId=J;let _=kw(U);$.state.messages.splice(0,$.state.messages.length,..._),$.state.revertedMessages.splice(0,$.state.revertedMessages.length),$.state.selectedToolCallId=null,$.state.runningToolCallId=null,$.state.paused=null,$.state.approval.active=null,$.state.approval.pendingAutoRun=null,$.state.approval.queue=[],$.state.approval.decisions={};let G=Td(U);if(G){let Q=Number(G.promptTokens),Y=Number(G.completionTokens);if(Number.isFinite(Q))$.state.usage.prompt_tokens=Q;if(Number.isFinite(Y))$.state.usage.completion_tokens=Y;if(Number.isFinite(Q)&&Number.isFinite(Y))$.state.usage.total_tokens=Q+Y;else{let X=Number(G.totalTokens);if(Number.isFinite(X))$.state.usage.total_tokens=X}}}function Iw($){let U=Array.isArray($)?$:[];return zw(U)}function Cw($){let U=$.store,J=U?.state?.context?.env??{},_=X6(J.GOATCHAIN_OPENAI_BASE_URL||J.OPENAI_BASE_URL),G=X6(J.OPENAI_API_KEY);return{version:1,updatedAt:Date.now(),settings:{cwd:X6(U?.state?.context?.cwd),focusFiles:U?.state?.context?.focusFiles??void 0,model:X6(U?.state?.config?.model),contextWindow:P2(U?.state?.config?.context_window),temperature:P2(U?.state?.config?.temperature),topP:P2(U?.state?.config?.top_p),baseUrl:_,apiKey:G,toolApprovals:U?.state?.approval?.mode==="all"?"all":"auto"},lastSessionId:X6(U?.state?.sessionId)||$.prev.lastSessionId}}function bw($,U){let J=null,_=!1,G=!1,Q=async()=>{if(_){G=!0;return}_=!0,G=!1;try{await $()}finally{if(_=!1,G)Y()}},Y=()=>{if(G=!0,J)clearTimeout(J);J=setTimeout(Q,Math.max(0,U||0))};return{schedule:Y}}function Id($){return String($?.id??"").trim()}function yw($){let U=null,J=$.sessionsBackend??null;return{sessions:J?{async list(){return(await J.list()).map(Tw).filter(Boolean)},async use(Q){let Y=String(Q??"").trim();if(!Y||!U)return;if(String(U.state.sessionId??"")===Y)return;let X=await J.get(Y);if(!X)return;Q8(U,X)},async createNew(){if(!U)return;let Q=await J.create();if(!Q)return;Q8(U,Q)},async delete(Q){let Y=String(Q??"").trim();if(!Y)return;if(await J.destroy(Y),U&&String(U.state.sessionId??"")===Y){let X=await J.create();if(X)Q8(U,X)}},async fork(Q){if(!U)return;let Y=Array.isArray(Q?.messages)?Q.messages:[];if(typeof J.createWithMessages!=="function"){let V=await J.create();if(V)U.state.sessionId=Id(V);U.state.messages.splice(0,U.state.messages.length,...Y),U.state.revertedMessages.splice(0,U.state.revertedMessages.length),U.state.selectedToolCallId=null,U.state.usage.prompt_tokens=0,U.state.usage.completion_tokens=0,U.state.usage.total_tokens=0;return}let X=await J.createWithMessages(Iw(Y));if(!X)return;Q8(U,X)}}:void 0,onStoreCreated:(Q)=>{if(U=Q,J){let X=String(Q.state.sessionId??"").trim();if(X)J.get(X).then((V)=>{if(V&&U)Q8(U,V)}).catch(()=>{})}let Y=bw(async()=>{try{let X=Cw({prev:$.cache,store:Q});await Pw($.cacheFile,X)}catch(X){console.warn("[goatchain] Failed to persist cache:",X)}},300);FQ(()=>Q.state.sessionId,Y.schedule),FQ(()=>Q.state.config,Y.schedule,{deep:!0}),FQ(()=>Q.state.context,Y.schedule,{deep:!0}),FQ(()=>Q.state.approval.mode,Y.schedule),Y.schedule()}}}async function BF($){let U=$.sessionsBackend,J=X6($.envSessionId);if(U&&J){if(await U.get(J))return J}return J}function gw(){return async($)=>{let U=String($?.name??"tool");return{id:String($?.id??"tool"),status:"error",output:["Tool execution is handled by the GoatChain agent.",`This UI cannot run tool "${U}" locally.`].join(`
|
|
601
601
|
`)}}}import*as uw from"node:path";function Cd($){return uw.join($,"state")}function bd($){$.env.GOATCHAIN_STATE_DIR=$.stateDir,$.context.env.GOATCHAIN_STATE_DIR=$.stateDir}async function FF($){let{context:U,cacheDir:J,cacheFile:_,cache:G}=await Lw({cwd:$.cwd,env:$.env}),Q=Cd(J);bd({env:$.env,context:U,stateDir:Q});let Y=Mw({context:U,processEnv:$.env,stateDir:Q}),X=Y?.__sessions??null,V=await BF({sessionsBackend:X,envSessionId:$.env.GOATCHAIN_SESSION_ID});if(V)$.env.GOATCHAIN_SESSION_ID=V,U.env.GOATCHAIN_SESSION_ID=V;let{sessions:K,onStoreCreated:N}=yw({cacheFile:_,cache:G,sessionsBackend:X});return{toolRunner:gw(),context:U,agent:Y,onStoreCreated:N,sessions:K}}import an from"node:fs";import{nextTick as lQ}from"vue";var xw=($=0)=>(U)=>`\x1B[${U+$}m`,hw=($=0)=>(U)=>`\x1B[${38+$};5;${U}m`,mw=($=0)=>(U,J,_)=>`\x1B[${38+$};2;${U};${J};${_}m`,v0={modifier:{reset:[0,0],bold:[1,22],dim:[2,22],italic:[3,23],underline:[4,24],overline:[53,55],inverse:[7,27],hidden:[8,28],strikethrough:[9,29]},color:{black:[30,39],red:[31,39],green:[32,39],yellow:[33,39],blue:[34,39],magenta:[35,39],cyan:[36,39],white:[37,39],blackBright:[90,39],gray:[90,39],grey:[90,39],redBright:[91,39],greenBright:[92,39],yellowBright:[93,39],blueBright:[94,39],magentaBright:[95,39],cyanBright:[96,39],whiteBright:[97,39]},bgColor:{bgBlack:[40,49],bgRed:[41,49],bgGreen:[42,49],bgYellow:[43,49],bgBlue:[44,49],bgMagenta:[45,49],bgCyan:[46,49],bgWhite:[47,49],bgBlackBright:[100,49],bgGray:[100,49],bgGrey:[100,49],bgRedBright:[101,49],bgGreenBright:[102,49],bgYellowBright:[103,49],bgBlueBright:[104,49],bgMagentaBright:[105,49],bgCyanBright:[106,49],bgWhiteBright:[107,49]}},L7$=Object.keys(v0.modifier),yd=Object.keys(v0.color),gd=Object.keys(v0.bgColor),w7$=[...yd,...gd];function ud(){let $=new Map;for(let[U,J]of Object.entries(v0)){for(let[_,G]of Object.entries(J))v0[_]={open:`\x1B[${G[0]}m`,close:`\x1B[${G[1]}m`},J[_]=v0[_],$.set(G[0],G[1]);Object.defineProperty(v0,U,{value:J,enumerable:!1})}return Object.defineProperty(v0,"codes",{value:$,enumerable:!1}),v0.color.close="\x1B[39m",v0.bgColor.close="\x1B[49m",v0.color.ansi=xw(),v0.color.ansi256=hw(),v0.color.ansi16m=mw(),v0.bgColor.ansi=xw(10),v0.bgColor.ansi256=hw(10),v0.bgColor.ansi16m=mw(10),Object.defineProperties(v0,{rgbToAnsi256:{value(U,J,_){if(U===J&&J===_){if(U<8)return 16;if(U>248)return 231;return Math.round((U-8)/247*24)+232}return 16+36*Math.round(U/255*5)+6*Math.round(J/255*5)+Math.round(_/255*5)},enumerable:!1},hexToRgb:{value(U){let J=/[a-f\d]{6}|[a-f\d]{3}/i.exec(U.toString(16));if(!J)return[0,0,0];let[_]=J;if(_.length===3)_=[..._].map((Q)=>Q+Q).join("");let G=Number.parseInt(_,16);return[G>>16&255,G>>8&255,G&255]},enumerable:!1},hexToAnsi256:{value:(U)=>v0.rgbToAnsi256(...v0.hexToRgb(U)),enumerable:!1},ansi256ToAnsi:{value(U){if(U<8)return 30+U;if(U<16)return 90+(U-8);let J,_,G;if(U>=232)J=((U-232)*10+8)/255,_=J,G=J;else{U-=16;let X=U%36;J=Math.floor(U/36)/5,_=Math.floor(X/6)/5,G=X%6/5}let Q=Math.max(J,_,G)*2;if(Q===0)return 30;let Y=30+(Math.round(G)<<2|Math.round(_)<<1|Math.round(J));if(Q===2)Y+=60;return Y},enumerable:!1},rgbToAnsi:{value:(U,J,_)=>v0.ansi256ToAnsi(v0.rgbToAnsi256(U,J,_)),enumerable:!1},hexToAnsi:{value:(U)=>v0.ansi256ToAnsi(v0.hexToAnsi256(U)),enumerable:!1}}),v0}var xd=ud(),V6=xd;function Y8($){return $.replace(/\r\n/g,`
|