@fifthrevision/axle 0.15.0 → 0.16.0
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 +25 -0
- package/dist/ProceduralMemory-CbRTVa9Q.js +45 -0
- package/dist/cli.js +5 -5
- package/dist/index.d.ts +80 -18
- package/dist/index.js +1 -1
- package/dist/{models-C7teS0rN.d.ts → models-CI5k-LHn.d.ts} +15 -3
- package/dist/models-CKz-RHh1.js +1 -0
- package/dist/providers/models.d.ts +2 -2
- package/dist/providers/models.js +1 -1
- package/package.json +1 -1
- package/dist/ProceduralMemory-CNa1VXqY.js +0 -45
package/README.md
CHANGED
|
@@ -129,6 +129,28 @@ const result = await generate({
|
|
|
129
129
|
});
|
|
130
130
|
```
|
|
131
131
|
|
|
132
|
+
Both `stream()` and `generate()` also accept an `Instruct` as the latest user
|
|
133
|
+
turn. When `messages` is provided with `instruct`, `messages` is treated as
|
|
134
|
+
prior context and the rendered `Instruct` is appended as the new user message.
|
|
135
|
+
|
|
136
|
+
```typescript
|
|
137
|
+
import * as z from "zod";
|
|
138
|
+
import { generate, Instruct } from "@fifthrevision/axle";
|
|
139
|
+
|
|
140
|
+
const result = await generate({
|
|
141
|
+
provider,
|
|
142
|
+
model,
|
|
143
|
+
messages: previousMessages,
|
|
144
|
+
instruct: new Instruct("Answer {{question}}.", {
|
|
145
|
+
answer: z.string(),
|
|
146
|
+
}).withInput("question", "Should we proceed?"),
|
|
147
|
+
});
|
|
148
|
+
|
|
149
|
+
if (result.result === "success") {
|
|
150
|
+
result.response?.answer; // string
|
|
151
|
+
}
|
|
152
|
+
```
|
|
153
|
+
|
|
132
154
|
Both handle the full tool-call loop automatically. Agent uses `stream()`
|
|
133
155
|
internally and adds history management, system prompt, and callback wiring on
|
|
134
156
|
top.
|
|
@@ -164,6 +186,9 @@ result.response.distanceFromSun; // number
|
|
|
164
186
|
result.response.moons; // string[]
|
|
165
187
|
```
|
|
166
188
|
|
|
189
|
+
For one-shot structured calls without agent-managed history, pass the same
|
|
190
|
+
`Instruct` directly to `generate()` or `stream()`.
|
|
191
|
+
|
|
167
192
|
### Tools
|
|
168
193
|
|
|
169
194
|
A tool is an object with a name, description, Zod schema, and an `execute`
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import{c as e}from"./models-DlE4tfcj.js";import*as t from"zod";import n,{z as r}from"zod";import i,{access as a,mkdir as o,readFile as s,stat as c,writeFile as l}from"node:fs/promises";import u,{dirname as d,extname as f,resolve as p}from"node:path";import m from"@anthropic-ai/sdk";import"glob";import h from"mime";import{FinishReason as g,GoogleGenAI as _}from"@google/genai";import v from"openai";import{spawn as y}from"node:child_process";import{Client as b}from"@modelcontextprotocol/sdk/client/index.js";import{StdioClientTransport as x}from"@modelcontextprotocol/sdk/client/stdio.js";import{StreamableHTTPClientTransport as S}from"@modelcontextprotocol/sdk/client/streamableHttp.js";import C from"chalk";import{marked as w}from"marked";import T from"node:crypto";var E=class e extends Error{code;id;details;constructor(t,n){super(t,{cause:n?.cause}),this.name=this.constructor.name,this.code=n?.code||`AXLE_ERROR`,this.id=n?.id,this.details=n?.details,Object.setPrototypeOf(this,e.prototype)}toJSON(){return{name:this.name,message:this.message,code:this.code,...this.id?{id:this.id}:{},...this.details?{details:this.details}:{},...this.cause?{cause:D(this.cause)}:{}}}};function D(e){return e instanceof Error?{name:e.name,message:e.message,...e.stack?{stack:e.stack}:{},...`cause`in e&&e.cause?{cause:D(e.cause)}:{}}:e}var O=class e extends E{reason;messages;partial;usage;constructor(t=`Operation aborted`,n){super(t,{code:`ABORTED`,details:{reason:n?.reason,usage:n?.usage}}),this.name=`AbortError`,this.reason=n?.reason,this.messages=n?.messages,this.partial=n?.partial,this.usage=n?.usage,Object.setPrototypeOf(this,e.prototype)}toJSON(){return{...super.toJSON(),reason:this.reason,...this.messages?{messages:this.messages}:{},...this.partial?{partial:this.partial}:{},...this.usage?{usage:this.usage}:{}}}},k=class e extends O{turn;constructor(t=`Agent send aborted`,n){super(t,n),this.turn=n?.turn,Object.setPrototypeOf(this,e.prototype)}toJSON(){return{...super.toJSON(),...this.turn?{turn:this.turn}:{}}}},A=class e extends E{toolName;messages;partial;usage;constructor(t=`Fatal tool error`,n){super(t,{code:`TOOL_FATAL_ERROR`,details:{toolName:n?.toolName,usage:n?.usage},cause:n?.cause}),this.toolName=n?.toolName,this.messages=n?.messages,this.partial=n?.partial,this.usage=n?.usage,Object.setPrototypeOf(this,e.prototype)}toJSON(){return{...super.toJSON(),...this.toolName?{toolName:this.toolName}:{},...this.messages?{messages:this.messages}:{},...this.partial?{partial:this.partial}:{},...this.usage?{usage:this.usage}:{}}}};function j(e){let{text:t,files:n}=e,r=[];if(t&&r.push({type:`text`,text:t}),n)for(let e of n)r.push({type:`file`,file:e});return r}function M(e){return e.filter(e=>e.type===`text`).map(e=>e.text).join(`
|
|
2
|
+
|
|
3
|
+
`)}function N(e){return e.filter(e=>e.type===`tool-call`)}function P(e){if(e instanceof t.ZodString)return[`string`,`Your answer`];if(e instanceof t.ZodNumber)return[`number`,42];if(e instanceof t.ZodBoolean)return[`boolean`,!0];if(e instanceof t.ZodArray){let n=e.element;if(n instanceof t.ZodString)return[`string array`,[`answer 1`,`answer 2`,`third answer`]];if(n instanceof t.ZodNumber)return[`number array`,[42,59,3.14]];if(n instanceof t.ZodBoolean)return[`boolean array`,[!0,!1,!1]];if(n instanceof t.ZodObject){let[,e]=P(n);return[`object array`,[e,e]]}return[`array`,[]]}if(e instanceof t.ZodObject){let t=e.shape,n={};for(let[e,r]of Object.entries(t)){let[,t]=P(r);n[e]=t}return[`JSON object`,n]}if(e instanceof t.ZodOptional){let[t,n]=P(e.unwrap());return[`${t} | undefined`,n]}throw Error(`Unsupported Zod schema: ${e.constructor.name}`)}function F(e,n){if(!n)return e;if(Object.keys(n).length===0){if(e.trim()===`{}`||e.trim()===``)return{};throw Error(`Schema is empty, but rawValue is not an empty object representation or empty string.`)}let r=I(e);try{return t.object(n).parse(r)}catch(e){if(e&&typeof e==`object`&&`issues`in e){let t=e.issues.map(e=>`${e.path.join(`.`)}: ${e.message}`).join(`, `);throw Error(`Validation failed: ${t}`)}throw e}}function I(e){let t=e.trim(),n=t.match(/^```(?:json)?\s*([\s\S]*?)\s*```$/i),r=n?n[1].trim():t;try{return JSON.parse(r)}catch(e){throw Error(`Cannot parse response as JSON: ${e.message}`)}}function L(e){if(typeof e==`string`)return{message:{role:`user`,id:crypto.randomUUID(),content:[{type:`text`,text:e}]},parse:e=>R(e,void 0)};let t=e.render(),n=e.files,r=e.schema;return{message:{role:`user`,id:crypto.randomUUID(),content:j({text:t,files:n})},parse:e=>R(e,r)}}function R(e,t){return e?F(M(e.content),t):null}var z=class{executableTools=new Map;providerTools=new Map;constructor(e){e?.tools&&this.add(e.tools),e?.providerTools&&this.addProvider(e.providerTools)}add(e){let t=Array.isArray(e)?e:[e];for(let e of t){if(this.has(e.name))throw new E(`Tool already registered: ${e.name}`,{code:`TOOL_REGISTRY_DUPLICATE`,details:{name:e.name}});this.executableTools.set(e.name,e)}}addProvider(e){let t=Array.isArray(e)?e:[e];for(let e of t){if(this.has(e.name))throw new E(`Tool already registered: ${e.name}`,{code:`TOOL_REGISTRY_DUPLICATE`,details:{name:e.name}});this.providerTools.set(e.name,e)}}remove(e){return this.executableTools.delete(e)||this.providerTools.delete(e)}has(e){return this.executableTools.has(e)||this.providerTools.has(e)}get(e){return this.executableTools.get(e)}getProvider(e){return this.providerTools.get(e)}executable(){return[...this.executableTools.values()]}provider(){return[...this.providerTools.values()]}get size(){return this.executableTools.size+this.providerTools.size}};function B(e,t){let n=t.usage??{in:0,out:0};e.in+=n.in??0,e.out+=n.out??0}function V(e){return JSON.stringify({error:e})}function H(e){let t=e.tools!==void 0||e.providerTools!==void 0;if(e.registry&&t)throw new E("Cannot specify both `registry` and `tools` / `providerTools`. Use one or the other.",{code:`TOOL_OPTIONS_CONFLICT`});return e.registry?e.registry:new z({tools:e.tools,providerTools:e.providerTools})}async function ee(e,t=async()=>null,n,r,i){let a=[],o=()=>{throw new O(`Operation aborted`,{reason:n.reason})};for(let s of e){n.aborted&&o();let e=i?.startSpan(s.name,{type:`tool`}),c={signal:n,tracer:e,registry:r,emit:()=>{}},l;try{l=await t(s.name,s.parameters,c),n.aborted&&(e?.end(`ok`),o())}catch(t){if(t instanceof A)throw e?.setResult({kind:`tool`,name:s.name,input:s.parameters,output:{type:`fatal`,message:t.message}}),e?.end(`error`),t;(n.aborted||t instanceof O||t instanceof Error&&t.name===`AbortError`)&&(e?.end(`ok`),o()),l={type:`error`,error:{type:`exception`,message:t instanceof Error?t.message:String(t)}}}if(l==null){let t=`Tool not found: ${s.name}`;e?.setResult({kind:`tool`,name:s.name,input:s.parameters,output:{type:`not-found`,message:t}}),e?.end(`error`),a.push({id:s.id,name:s.name,content:V({type:`not-found`,message:t}),isError:!0});continue}l.type===`success`?(e?.setResult({kind:`tool`,name:s.name,input:s.parameters,output:l.content}),e?.end(`ok`),a.push({id:s.id,name:s.name,content:l.content})):(e?.setResult({kind:`tool`,name:s.name,input:s.parameters,output:l.error}),e?.end(`error`),a.push({id:s.id,name:s.name,content:V(l.error),isError:!0}))}return{results:a}}let te=function(e){return e.Stop=`stop`,e.Length=`length`,e.FunctionCall=`function_call`,e.Error=`error`,e.Custom=`custom`,e.Cancelled=`cancelled`,e}({});function U(e,t){for(let n of e)n(t)}function ne(e){return{type:`error`,error:{type:`not-found`,message:`Tool not found: ${e}`}}}function re(e){return{name:e.name,description:e.description,schema:e.schema}}function ie(e){let t=[],n,r;if(`instruct`in e){let{instruct:t,messages:i,...a}=e,o=L(t);r=o.parse,n={...a,messages:[...i??[],o.message]}}else n=e;let i=new AbortController,a=n.signal?AbortSignal.any([i.signal,n.signal]):i.signal,{promise:o,resolve:s,reject:c}=Promise.withResolvers();return Promise.resolve().then(()=>W(n,a,t).then(e=>{if(r&&e.result===`success`){try{s({...e,response:r(e.final)})}catch(t){s({...e,response:null,parseError:t})}return}s(e)},c)),{on(e){t.push(e)},cancel(e){i.abort(e)},get final(){return o}}}async function W(e,t,n){let{provider:r,model:i,messages:a,system:o,onToolCall:s,maxIterations:c,tracer:l,fileResolver:u,options:d,reasoning:f}=e,p=H(e),m=[...a],h=[],g={in:0,out:0},_=0,v=0,y=e=>{m.push(e),h.push(e)},b=e=>{e.result===`error`&&U(n,{type:`error`,error:e.error});let t=e.result===`success`?e.final?.content:null,r=e.result===`success`?e.final?.finishReason:void 0;return l?.setResult({kind:`llm`,model:i,request:{messages:a},response:{content:t??null},usage:e.usage?{inputTokens:e.usage.in,outputTokens:e.usage.out}:void 0,finishReason:r}),l?.end(e.result===`error`?`error`:`ok`),e},x=(e,n,r,i)=>{i();let a=e.length?{role:`assistant`,id:n,model:r,content:e,finishReason:`cancelled`}:void 0;throw a&&y(a),l?.end(`ok`),new O(`Stream aborted`,{reason:t.reason,messages:h,partial:a,usage:g})};for(;;){if(t.aborted&&x([],``,``,()=>{}),c!==void 0&&v>=c)return b({result:`error`,messages:h,error:{type:`model`,error:{type:`error`,error:{type:`MaxIterations`,message:`Exceeded max iterations (${c})`}}},usage:g});v+=1;let e=l?.startSpan(`turn-${v}`,{type:`llm`}),a=p?.executable()??[],S=a.length>0?a.map(re):void 0,C=p?.provider()??[],w=C.length>0?{...d,providerTools:C}:d,T=r.createStreamingRequest(i,{messages:m,system:o,tools:S,context:{tracer:e,fileResolver:u},signal:t,options:w,reasoning:f}),E=[],D=``,k=``,j=null,M={in:0,out:0},N=-1,P=null,F=``,I=new Map,L=-1,R=()=>{P!==null&&N>=0&&(U(n,{type:P===`text`?`text:end`:`thinking:end`,index:N,final:F}),P=null,F=``,N=-1)};for await(let r of T){switch(r.type){case`start`:D=r.id,k=r.data.model,U(n,{type:`turn:start`,id:D,model:k});break;case`text-start`:R(),E.push({type:`text`,text:``}),L=E.length-1,N=_++,P=`text`,F=``,U(n,{type:`text:start`,index:N});break;case`text-delta`:{let e=E[L];e.text+=r.data.text,F=e.text,U(n,{type:`text:delta`,index:N,delta:r.data.text,accumulated:F});break}case`text-complete`:R();break;case`thinking-start`:R(),E.push({type:`thinking`,text:``}),L=E.length-1,N=_++,P=`thinking`,F=``,U(n,{type:`thinking:start`,index:N});break;case`thinking-delta`:{let e=E[L];e.text+=r.data.text,F=e.text,U(n,{type:`thinking:delta`,index:N,delta:r.data.text,accumulated:F});break}case`thinking-summary-delta`:{let e=E[L];e.text+=r.data.text,F=e.text,U(n,{type:`thinking:delta`,index:N,delta:r.data.text,accumulated:F});break}case`thinking-complete`:R();break;case`tool-call-start`:{R();let e=_++;E.push({type:`tool-call`,id:r.data.id,name:r.data.name,parameters:{}}),L=E.length-1,I.set(r.data.id,e),U(n,{type:`tool:request`,index:e,id:r.data.id,name:r.data.name});break}case`tool-call-args-delta`:U(n,{type:`tool:args-delta`,index:I.get(r.data.id)??-1,id:r.data.id,name:r.data.name,delta:r.data.delta,accumulated:r.data.accumulated});break;case`tool-call-complete`:{let e=E[L];r.data.id&&(e.id=r.data.id),r.data.name&&(e.name=r.data.name),e.parameters=r.data.arguments,r.data.providerMetadata&&(e.providerMetadata=r.data.providerMetadata);break}case`provider-tool-start`:{R();let e=_++;E.push({type:`provider-tool`,id:r.data.id,name:r.data.name}),L=E.length-1,U(n,{type:`provider-tool:start`,index:e,id:r.data.id,name:r.data.name});break}case`provider-tool-complete`:{let e=E[L];r.data.output!=null&&(e.output=r.data.output),U(n,{type:`provider-tool:complete`,index:r.data.index,id:r.data.id,name:r.data.name,output:r.data.output});break}case`complete`:R(),j=r.data.finishReason,M=r.data.usage;break;case`error`:{R();let t=r.data.usage??{in:0,out:0};return g.in+=t.in??0,g.out+=t.out??0,e?.end(`error`),b({result:`error`,messages:h,error:{type:`model`,error:{type:`error`,error:{type:r.data.type,message:r.data.message}}},usage:g})}default:console.warn(`[WARN] Unhandled chunk type. Should never happen`)}if(t.aborted)break}if(t.aborted&&(e?.end(`ok`),x(E,D,k,R)),j===null)return R(),e?.end(`error`),b({result:`error`,messages:h,error:{type:`model`,error:{type:`error`,error:{type:`IncompleteStream`,message:`Stream ended without a completion signal`}}},usage:g});g.in+=M.in??0,g.out+=M.out??0;let z={kind:`llm`,model:k,request:{messages:m},response:{content:E},usage:{inputTokens:M.in,outputTokens:M.out},finishReason:j};e?.setResult(z),e?.end();let B={role:`assistant`,id:D,model:k,content:E,finishReason:j};if(y(B),U(n,{type:`turn:complete`,message:B,usage:M}),j!==`function_call`)return b({result:`success`,messages:h,final:B,usage:g});let V=E.filter(e=>e.type===`tool-call`);if(V.length===0)return b({result:`success`,messages:h,final:B,usage:g});if(t.aborted)throw l?.end(`ok`),new O(`Stream aborted`,{reason:t.reason,messages:h,usage:g});let H=crypto.randomUUID();U(n,{type:`tool-results:start`,id:H});let te=0,ie=async(e,t,r)=>{let i=V[te++],a=I.get(i.id)??-1;U(n,{type:`tool:exec-start`,index:a,id:i.id,name:e,parameters:t});let o={...r,emit:t=>{U(n,{type:`tool:exec-delta`,index:a,id:i.id,name:e,chunk:t})}},c=(s?await s(e,t,o):null)??ne(e);return U(n,{type:`tool:exec-complete`,index:a,id:i.id,name:e,result:c}),c},W;try{({results:W}=await ee(V,ie,t,p,l))}catch(e){throw e instanceof A?(l?.end(`error`),new A(e.message,{toolName:e.toolName,messages:e.messages??h,partial:e.partial??B,usage:e.usage??g,cause:e.cause})):e instanceof O?(l?.end(`ok`),new O(`Stream aborted`,{reason:e.reason,messages:e.messages??h,partial:e.partial,usage:e.usage??g})):e}if(W.length>0){let e={role:`tool`,id:H,content:W};y(e),U(n,{type:`tool-results:complete`,message:e})}}}var ae=class{rootPath;constructor(e){this.rootPath=e}async read(e){let t=u.join(this.rootPath,e);try{return await i.readFile(t,`utf-8`)}catch{return null}}async write(e,t){let n=u.join(this.rootPath,e);await i.mkdir(u.dirname(n),{recursive:!0}),await i.writeFile(n,t,`utf-8`)}};function G(e=new Date){return{start:e.toISOString()}}function K(e,t=new Date){let n=t.toISOString();return e?{...e,end:n}:{start:n,end:n}}var oe=class{currentTurn=null;currentTextPart=null;currentThinkingPart=null;toolIdMap=new Map;accumulatedUsage={in:0,out:0};createUserTurn(e){let t=e.id??crypto.randomUUID(),n=[],r=new Date,i=K(G(r),r),a=()=>({...i});if(typeof e.content==`string`)n.push({id:crypto.randomUUID(),type:`text`,text:e.content,timing:a()});else for(let t of e.content)t.type===`text`?n.push({id:crypto.randomUUID(),type:`text`,text:t.text,timing:a()}):t.type===`file`&&n.push({id:crypto.randomUUID(),type:`file`,file:t.file,timing:a()});let o={id:t,owner:`user`,parts:n,status:`complete`,timing:i};return{turn:o,events:[{type:`turn:user`,turn:o}]}}startAgentTurn(){let e=crypto.randomUUID(),t={id:e,owner:`agent`,parts:[],status:`streaming`,timing:G()};return this.currentTurn=t,this.currentTextPart=null,this.currentThinkingPart=null,this.toolIdMap.clear(),this.accumulatedUsage={in:0,out:0},{turn:t,events:[{type:`turn:start`,turnId:e}]}}handleStreamEvent(e){let t=this.currentTurn;if(!t)return[];let n=[];switch(e.type){case`turn:start`:break;case`text:start`:{this.closeOpenParts(t,n);let e={id:crypto.randomUUID(),type:`text`,text:``,timing:G()};t.parts.push(e),this.currentTextPart=e,n.push({type:`part:start`,turnId:t.id,part:{...e}});break}case`text:delta`:this.currentTextPart&&(this.currentTextPart.text=e.accumulated,n.push({type:`text:delta`,turnId:t.id,partId:this.currentTextPart.id,delta:e.delta}));break;case`text:end`:this.currentTextPart&&=(this.currentTextPart.text=e.final,this.currentTextPart.timing=K(this.currentTextPart.timing),n.push({type:`part:end`,turnId:t.id,partId:this.currentTextPart.id,timing:this.currentTextPart.timing}),null);break;case`thinking:start`:{this.closeOpenParts(t,n);let e={id:crypto.randomUUID(),type:`thinking`,text:``,timing:G()};t.parts.push(e),this.currentThinkingPart=e,n.push({type:`part:start`,turnId:t.id,part:{...e}});break}case`thinking:delta`:this.currentThinkingPart&&(this.currentThinkingPart.text=e.accumulated,n.push({type:`thinking:delta`,turnId:t.id,partId:this.currentThinkingPart.id,delta:e.delta}));break;case`thinking:end`:this.currentThinkingPart&&=(this.currentThinkingPart.text=e.final,this.currentThinkingPart.timing=K(this.currentThinkingPart.timing),n.push({type:`part:end`,turnId:t.id,partId:this.currentThinkingPart.id,timing:this.currentThinkingPart.timing}),null);break;case`tool:request`:{this.closeOpenParts(t,n);let r=crypto.randomUUID(),i={id:r,type:`action`,kind:`tool`,status:`pending`,timing:G(),detail:{name:e.name,parameters:{}}};t.parts.push(i),this.toolIdMap.set(e.id,{partId:r,turnId:t.id}),n.push({type:`part:start`,turnId:t.id,part:{...i,detail:{...i.detail}}});break}case`tool:args-delta`:{let r=this.toolIdMap.get(e.id);if(r){let i=this.findActionPart(t,r.partId);i&&(i.detail.pendingArgs=e.accumulated),n.push({type:`action:args-delta`,turnId:t.id,partId:r.partId,delta:e.delta,accumulated:e.accumulated})}break}case`tool:exec-start`:{let r=this.toolIdMap.get(e.id);if(r){let i=this.findActionPart(t,r.partId);i&&(i.status=`running`,i.detail.parameters=e.parameters,delete i.detail.pendingArgs,n.push({type:`action:running`,turnId:t.id,partId:r.partId,parameters:e.parameters}))}break}case`tool:exec-delta`:{let r=this.toolIdMap.get(e.id);if(r){let i=this.findActionPart(t,r.partId);if(i){let t=i.detail.result?.type===`in-progress`?i.detail.result.content:``;i.detail.result={type:`in-progress`,content:t+e.chunk}}n.push({type:`action:progress`,turnId:t.id,partId:r.partId,chunk:e.chunk})}break}case`tool:exec-complete`:{let r=this.toolIdMap.get(e.id);if(r){let i=this.findActionPart(t,r.partId);i&&(e.result.type===`success`?(i.status=`complete`,i.timing=K(i.timing),i.detail.result={type:`success`,content:e.result.content},n.push({type:`action:complete`,turnId:t.id,partId:r.partId,result:i.detail.result})):(i.status=`error`,i.timing=K(i.timing),i.detail.result={type:`error`,error:e.result.error},n.push({type:`action:error`,turnId:t.id,partId:r.partId,error:e.result.error})))}break}case`provider-tool:start`:{this.closeOpenParts(t,n);let r=crypto.randomUUID(),i={id:r,type:`action`,kind:`provider-tool`,status:`running`,timing:G(),detail:{name:e.name}};t.parts.push(i),this.toolIdMap.set(e.id,{partId:r,turnId:t.id}),n.push({type:`part:start`,turnId:t.id,part:{...i,detail:{...i.detail}}}),n.push({type:`action:running`,turnId:t.id,partId:r});break}case`provider-tool:complete`:{let r=this.toolIdMap.get(e.id);if(r){let i=this.findActionPart(t,r.partId);i&&(i.status=`complete`,i.timing=K(i.timing),i.detail.result={type:`success`,content:e.output},n.push({type:`action:complete`,turnId:t.id,partId:r.partId,result:i.detail.result}))}break}case`turn:complete`:{this.closeOpenParts(t,n);let r=e.usage??{in:0,out:0};this.accumulatedUsage.in+=r.in,this.accumulatedUsage.out+=r.out;break}case`tool-results:start`:case`tool-results:complete`:break;case`error`:{let t=e.error,r=t.type===`model`?t.error.error.message:`Tool error (${t.error.name}): ${t.error.message}`;n.push({type:`error`,error:{type:t.type,message:r}});break}}return n}finalizeTurn(e=`complete`){let t=this.currentTurn;if(!t)return[];let n=[];return this.closeOpenParts(t,n),t.status=e,t.usage={...this.accumulatedUsage},t.timing=K(t.timing),n.push({type:`turn:end`,turnId:t.id,status:e,usage:t.usage,timing:t.timing}),this.currentTurn=null,n}closeOpenParts(e,t){this.currentTextPart&&=(this.currentTextPart.timing=K(this.currentTextPart.timing),t.push({type:`part:end`,turnId:e.id,partId:this.currentTextPart.id,timing:this.currentTextPart.timing}),null),this.currentThinkingPart&&=(this.currentThinkingPart.timing=K(this.currentThinkingPart.timing),t.push({type:`part:end`,turnId:e.id,partId:this.currentThinkingPart.id,timing:this.currentThinkingPart.timing}),null)}findActionPart(e,t){return e.parts.find(e=>e.id===t&&e.type===`action`)}};function se(e){return Array.isArray(e)?e:[e]}function ce(e){return new Promise(t=>setTimeout(t,e))}function le(e){return e.then(()=>{},()=>{})}function ue(e,t,n){let r=new AbortController,i=n?AbortSignal.any([n,r.signal]):r.signal,a=e.then(()=>t(i));return{handle:{cancel:e=>r.abort(e),get final(){return a}},settled:le(a)}}var de=class{_turns=[];_log=[];constructor(e){e?.turns&&(this._turns=e.turns),e?.log&&(this._log=e.log)}get turns(){return[...this._turns]}get log(){return[...this._log]}addTurn(e){this._turns.push(e)}appendToLog(e){Array.isArray(e)?this._log.push(...e):this._log.push(e)}latestTurn(){return this._turns[this._turns.length-1]}toString(){return JSON.stringify({turns:this._turns})}},fe=class{provider;model;history;tracer;name;scope;store;fileResolver;reasoning;registry;system;mcps=[];resolvedMcps=new WeakSet;memory;eventCallbacks=[];sendQueue=Promise.resolve();constructor(e){if(this.provider=e.provider,this.model=e.model,this.history=new de,this.tracer=e.tracer,this.system=e.system,this.name=e.name,this.scope=e.scope,this.store=new ae(`.axle`),this.fileResolver=e.fileResolver,this.reasoning=e.reasoning,this.registry=new z({tools:e.tools,providerTools:e.providerTools}),e.mcps&&(this.mcps=[...e.mcps]),e.memory){if(!e.name)throw new E(`Agent requires a 'name' when memory is provided. The name is used to partition memory storage.`);this.memory=e.memory;let t=e.memory.tools?.();t&&this.registry.add(t)}}addMcp(e){this.mcps.push(e)}addMcps(e){this.mcps.push(...e)}hasTools(){return this.registry.size>0||this.mcps.length>0}on(e){this.eventCallbacks.push(e)}send(e,t){let n=L(e),r=t?.reasoning??this.reasoning,{handle:i,settled:a}=ue(this.sendQueue,e=>this.run(n,e,t?.fileResolver,r),t?.signal);return this.sendQueue=a,i}async resolveMcpTools(e){for(let t of this.mcps){if(this.resolvedMcps.has(t))continue;let n=await t.listTools({prefix:t.name,tracer:this.tracer,signal:e});this.registry.add(n),this.resolvedMcps.add(t)}}emitEvent(e){for(let t of this.eventCallbacks)t(e)}async run(e,t,n,r){let i=new oe,a={in:0,out:0};if(t.aborted)throw new k(`Agent send aborted`,{reason:t.reason,usage:a});try{await this.resolveMcpTools(t)}catch(e){throw t.aborted||e instanceof O||e instanceof Error&&e.name===`AbortError`?new k(`Agent send aborted`,{reason:e instanceof O?e.reason:t.reason,usage:a}):e}let o=this.system,s=[...this.history.log,e.message];if(this.memory){let e=await this.memory.recall({name:this.name,scope:this.scope,system:this.system,messages:s,store:this.store,tracer:this.tracer});e.systemSuffix&&(o=(o??``)+`
|
|
4
|
+
|
|
5
|
+
`+e.systemSuffix)}if(t.aborted)throw new k(`Agent send aborted`,{reason:t.reason,usage:a});let{turn:c,events:l}=i.createUserTurn(e.message);this.history.addTurn(c),this.history.appendToLog(e.message);for(let e of l)this.emitEvent(e);let{turn:u,events:d}=i.startAgentTurn();this.history.addTurn(u);for(let e of d)this.emitEvent(e);let f=ie({provider:this.provider,model:this.model,messages:s,system:o,registry:this.registry,tracer:this.tracer,fileResolver:n??this.fileResolver,reasoning:r,onToolCall:async(e,t,n)=>{let r=this.registry.get(e);if(!r)return null;try{return{type:`success`,content:await r.execute(t,n)}}catch(e){if(e instanceof A)throw e;return{type:`error`,error:{type:`execution`,message:e instanceof Error?e.message:String(e)}}}},signal:t});f.on(e=>{let t=i.handleStreamEvent(e);for(let e of t)this.emitEvent(e)});let p;try{p=await f.final}catch(e){if(e instanceof A){e.messages&&e.messages.length>0&&this.history.appendToLog(e.messages);let t=i.finalizeTurn(`error`);for(let e of t)this.emitEvent(e);throw new A(e.message,{toolName:e.toolName,messages:e.messages,partial:e.partial,usage:e.usage??a,cause:e.cause})}if(e instanceof O){e.messages&&e.messages.length>0&&this.history.appendToLog(e.messages);let t=i.finalizeTurn(`cancelled`);for(let e of t)this.emitEvent(e);throw new k(`Agent send aborted`,{reason:e.reason,messages:e.messages,partial:e.partial,turn:u,usage:e.usage??a})}throw e}let m=p.result===`error`?`error`:`complete`;p.messages.length>0&&this.history.appendToLog(p.messages);let h=i.finalizeTurn(m);for(let e of h)this.emitEvent(e);let g=p.usage??a;if(p.result===`error`)throw new E(pe(p.error),{code:p.error.type===`model`?`MODEL_ERROR`:`TOOL_ERROR`,details:{error:p.error}});let _=null;if(p.result===`success`&&(p.final&&(_=e.parse(p.final)),this.memory))try{await this.memory.record({name:this.name,scope:this.scope,system:this.system,messages:this.history.log,newMessages:p.messages,store:this.store,tracer:this.tracer})}catch(e){this.tracer?.warn(`memory record failed`,{error:e instanceof Error?e.message:String(e)})}return{response:_,turn:u,usage:g}}};function pe(e){return e.type===`model`?`Model error: ${e.error.error.message}`:`Tool error (${e.error.name}): ${e.error.message}`}function me(e,t,n={}){let{placeholderStyle:r=`{{}}`}=n,i=r===`{{}}`?/\{\{(.*?)\}\}/g:/\{(.*?)\}/g,a=[];if(e=e.replace(i,(e,n)=>{if(n=n.trim(),Object.prototype.hasOwnProperty.call(t,n)){let e=t[n];return e==null?``:String(e)}return a.push(n),e}),a.length>0){let e=[...new Set(a)];throw Error(`Missing variable${e.length>1?`s`:``}: ${e.join(`, `)}. Pass them as --args key=value.`)}return e}var he=class e{prompt;inputs={};files=[];textReferences=[];schema;constructor(e,t){this.prompt=e,this.schema=t}clone(){let t=new e(this.prompt,this.schema);return t.inputs={...this.inputs},t.files=[...this.files],t.textReferences=this.textReferences.map(e=>({...e})),t}withInputs(e){let t=this.clone();return t.inputs={...t.inputs,...e},t}withInput(e,t){return this.withInputs({[e]:t})}setInputs(e){this.inputs={...e}}addInput(e,t){this.inputs[e]=t}addFile(e,t){if(typeof e==`string`){this.textReferences.push({content:e,name:t?.name});return}if(e.kind===`text`&&e.source.type===`text`){this.textReferences.push({content:e.source.content,name:t?.name??e.name});return}this.files.push(t?.name?{...e,name:t.name}:e)}hasFiles(){return this.files.length>0}render(){let e=me(this.prompt,this.inputs);if(this.textReferences.length>0)for(let[t,n]of this.textReferences.entries()){let r=n.name?`: ${n.name}`:``;e+=`\n\n## Reference ${t+1}${r}\n\n\`\`\`${n.content}'''`}if((this.schema?Object.keys(this.schema):[]).length===0)return e;let t=`# Output Format Instructions
|
|
6
|
+
|
|
7
|
+
Return only a valid JSON object matching this schema. Do not wrap it in markdown. Do not include prose before or after the JSON.
|
|
8
|
+
`,n={};for(let[e,r]of Object.entries(this.schema)){let[i,a]=P(r);n[e]=a,t+=`\n- ${e}: ${i}`}return t+=`\n\nExample:\n${JSON.stringify(n,null,2)}\n\n`,t+e}};function q(e,t=`Operation aborted`){if(e?.aborted)throw new O(t,{reason:e.reason})}function J(e,t,n=`Operation aborted`){return t?t.aborted?Promise.reject(new O(n,{reason:t.reason})):new Promise((r,i)=>{let a=()=>{t.removeEventListener(`abort`,a),i(new O(n,{reason:t.reason}))};t.addEventListener(`abort`,a,{once:!0}),e.then(e=>{t.removeEventListener(`abort`,a),r(e)},e=>{t.removeEventListener(`abort`,a),i(e)})}):e}function ge(e,t,n=`[redacted]`){return _e(e,null,t,n)}function _e(e,t,n,r){if(typeof e!=`object`||!e)return typeof e==`string`&&t&&n.has(t)?r:e;if(Array.isArray(e))return e.map(e=>_e(e,t,n,r));let i={};for(let[t,a]of Object.entries(e))i[t]=_e(a,t,n,r);return i}const ve=new Set([`data`,`file_data`,`file_url`,`image_url`,`url`,`uri`,`fileUri`]);function Y(e){return ge(e,ve,`[redacted-file-value]`)}function X(e){if(e==null)return{type:`error`,error:{type:`Undetermined`,message:`Unknown error occurred`},usage:{in:0,out:0},raw:e};if(e instanceof Error)return{type:`error`,error:{type:e.name||`Error`,message:e.message||`Unexpected error`},usage:{in:0,out:0},raw:e};if(typeof e==`object`){let t=e,n=t?.error?.error?.type||t?.error?.type||t?.type||t?.code||t?.status||`Undetermined`,r=t?.error?.error?.message||t?.error?.message||t?.message||t?.error||`Unexpected error`;return{type:`error`,error:{type:String(n),message:String(r)},usage:{in:0,out:0},raw:e}}return{type:`error`,error:{type:`Undetermined`,message:String(e)},usage:{in:0,out:0},raw:e}}async function ye(e,t){let{defaults:n,tag:r}=t,i=null,a=``;if(e)try{a=p(e),i=await s(a,{encoding:`utf-8`})}catch{throw Error(`${r} not found, see --help for details`)}else{for(let e of n.formats)try{a=p(n.name+`.`+e),i=await s(a,{encoding:`utf-8`});break}catch{continue}if(i===null)throw Error(`${r} not found, see --help for details`)}return{content:i,format:a.split(`.`).pop()??``,path:a}}const be=20*1024*1024;async function Z(e,t){if(t.signal?.aborted)throw new DOMException(`File resolution aborted`,`AbortError`);let{source:n}=e;if(n.type===`base64`)return Q({type:`base64`,data:n.data},e,t);if(n.type===`text`)return Q({type:`text`,content:n.content},e,t);if(n.type===`url`)return Q({type:`url`,url:n.url},e,t);if(!t.resolver)throw Error(`No fileResolver configured for deferred file: ${e.name}`);return Q(await t.resolver({file:e,ref:n.ref,provider:t.provider,model:t.model,accepted:t.accepted,signal:t.signal}),e,t)}function Q(e,t,n){if(n.accepted.includes(e.type))return{...e,mimeType:e.mimeType??t.mimeType,name:e.name??t.name};throw Error(`File source '${e.type}' is not supported for ${n.provider} ${t.kind} file '${t.name}'. Accepted: ${n.accepted.join(`, `)}`)}const xe=new Set([`application/json`,`application/xml`,`application/yaml`,`application/x-yaml`,`application/toml`]);function Se(e){return e.startsWith(`text/`)||xe.has(e)}function Ce(e){let t=h.getType(e);if(!t){let t=f(e).toLowerCase();throw Error(`Unsupported file type: ${t||`(no extension)`}`)}if(t.startsWith(`image/`))return{kind:`image`,mimeType:t};if(t===`application/pdf`)return{kind:`document`,mimeType:t};if(Se(t))return{kind:`text`,mimeType:t};{let n=f(e).toLowerCase();throw Error(`Unsupported file type: ${n} (${t})`)}}async function we(e,t){let n=p(e);try{await a(n)}catch{throw Error(`File not found: ${e}`)}let r=await c(n);if(r.size>be)throw Error(`File too large: ${r.size} bytes. Maximum allowed: ${be} bytes`);let i=n.split(`/`).pop()||``,o=Ce(n);if((t||(o.kind===`text`?`utf-8`:`base64`))===`utf-8`){if(o.kind!==`text`)throw Error(`Cannot read ${o.kind} file as text: ${e}`);let t=await s(n,`utf-8`);return{kind:`text`,mimeType:o.mimeType,size:r.size,name:i,source:{type:`text`,content:t}}}else{if(o.kind===`text`)throw Error(`Cannot read text file as binary: ${e}`);let t=(await s(n)).toString(`base64`);return{kind:o.kind,mimeType:o.mimeType,size:r.size,name:i,source:{type:`base64`,data:t}}}}async function Te(e,t={model:``}){return Promise.all(e.map(e=>Ee(e,t)))}async function Ee(e,t){if(e.role===`assistant`){let t=[];for(let n of e.content)n.type===`text`?t.push({type:`text`,text:n.text}):n.type===`thinking`?n.redacted?t.push({type:`redacted_thinking`,data:n.text}):n.signature&&t.push({type:`thinking`,thinking:n.text,signature:n.signature}):n.type===`tool-call`?t.push({type:`tool_use`,id:n.id,name:n.name,input:n.parameters}):n.type===`provider-tool`&&(t.push({type:`server_tool_use`,id:n.id,name:n.name,input:n.input??{}}),n.output!=null&&t.push({type:`web_search_tool_result`,tool_use_id:n.id,content:n.output}));return{role:`assistant`,content:t}}if(e.role===`tool`)return{role:`user`,content:await Promise.all(e.content.map(async e=>({type:`tool_result`,tool_use_id:e.id,content:typeof e.content==`string`?e.content:await Ie(e.content,t),...e.isError?{is_error:!0}:{}})))};if(typeof e.content==`string`)return{role:`user`,content:e.content};{let n=[];for(let r of e.content)r.type===`text`?n.push({type:`text`,text:r.text}):r.type===`file`&&n.push(await De(r.file,t,`user-message`));return{role:`user`,content:n}}}async function De(e,t,n){if(e.kind===`image`)return{type:`image`,source:ke(await Z(e,{provider:`anthropic`,model:t.model,accepted:[`url`,`base64`],purpose:n,resolver:t.fileResolver,signal:t.signal}),e)};if(e.kind===`document`){if(e.mimeType!==`application/pdf`)throw Error(`Anthropic only supports PDF document files. Received ${e.mimeType}`);let r=await Z(e,{provider:`anthropic`,model:t.model,accepted:[`url`,`base64`],purpose:n,resolver:t.fileResolver,signal:t.signal});return{type:`document`,source:Ae(r),title:r.name??e.name}}let r=await Z(e,{provider:`anthropic`,model:t.model,accepted:[`text`],purpose:n,resolver:t.fileResolver,signal:t.signal});if(r.type!==`text`)throw Error(`Unsupported Anthropic text source: ${r.type}`);return n===`tool-result`?{type:`text`,text:r.content}:{type:`document`,source:{type:`text`,media_type:`text/plain`,data:r.content},title:r.name??e.name}}function Oe(e){if(e===`image/jpeg`||e===`image/png`||e===`image/gif`||e===`image/webp`)return e;throw Error(`Anthropic does not support image MIME type: ${e}. Supported types: image/jpeg, image/png, image/gif, image/webp.`)}function ke(e,t){if(e.type===`url`)return{type:`url`,url:e.url};if(e.type===`base64`)return{type:`base64`,media_type:Oe(e.mimeType??t.mimeType),data:e.data};throw Error(`Unsupported Anthropic image source: ${e.type}`)}function Ae(e){if(e.type===`url`)return{type:`url`,url:e.url};if(e.type===`base64`)return{type:`base64`,media_type:`application/pdf`,data:e.data};throw Error(`Unsupported Anthropic PDF source: ${e.type}`)}function je(e){return e===!0?{thinking:{type:`enabled`,budget_tokens:8192}}:{}}function Me(e){return e.map(e=>{let t=n.toJSONSchema(e.schema);if(!Fe(t))throw Error(`Schema for tool ${e.name} must be an object type`);return{name:e.name,description:e.description,input_schema:t}})}function Ne(e){let t=[];for(let n of e)if(n.type===`text`)t.push({type:`text`,text:n.text});else if(n.type===`thinking`)t.push({type:`thinking`,text:n.text||``,redacted:!1});else if(n.type===`redacted_thinking`)t.push({type:`thinking`,text:n.text||``,redacted:!0});else if(n.type===`tool_use`){if(typeof n.input!=`object`||n.input===null||Array.isArray(n.input))throw Error(`Invalid tool call input for ${n.name}: expected object, got ${typeof n.input}`);t.push({type:`tool-call`,id:n.id,name:n.name,parameters:n.input})}return t}function Pe(e){switch(e){case`max_tokens`:return`length`;case`end_turn`:return`stop`;case`stop_sequence`:return`stop`;case`tool_use`:return`function_call`;default:return`error`}}function Fe(e){return e&&typeof e==`object`&&e.type===`object`}async function Ie(e,t){return Promise.all(e.map(async e=>e.type===`text`?{type:`text`,text:e.text}:De(e.file,t,`tool-result`)))}async function Le(e){let{client:t,model:n,messages:r,system:i,tools:a,context:o,options:s,reasoning:c,signal:l}=e,u=o?.tracer,{stop:d,max_tokens:f,...p}=s??{},m;try{q(l,`Generate aborted`);let e=await Te(r,{model:n,fileResolver:o?.fileResolver,signal:l}),s={model:n,max_tokens:f??16e3,messages:e,...i&&{system:i},...d&&{stop_sequences:se(d)},...a&&{tools:Me(a)},...je(c),...p};u?.debug(`Anthropic request`,{request:Y(s)});let h=await J(t.messages.create(s,...l?[{signal:l}]:[]),l,`Generate aborted`);q(l,`Generate aborted`),m=Re(h)}catch(e){q(l,`Generate aborted`),m=X(e)}return u?.debug(`Anthropic response`,{result:m}),m}function Re(e){let t=Pe(e.stop_reason);if(t===`error`)return{type:`error`,error:{type:`Uncaught error`,message:`Stop reason is not recognized or unhandled: ${e.stop_reason}`},usage:{in:e.usage.input_tokens,out:e.usage.output_tokens},raw:e};if(t===`function_call`){let t=Ne(e.content);return{type:`success`,id:e.id,model:e.model,role:e.role,finishReason:`function_call`,content:t,text:M(t),usage:{in:e.usage.input_tokens,out:e.usage.output_tokens},raw:e}}if(e.type==`message`){let n=Ne(e.content);return{type:`success`,id:e.id,model:e.model,role:`assistant`,finishReason:t,content:n,text:M(n),usage:{in:e.usage.input_tokens,out:e.usage.output_tokens},raw:e}}return{type:`error`,error:{type:`InvalidResponse`,message:`Unsupported completion type: ${e.type}`},usage:{in:e.usage.input_tokens,out:e.usage.output_tokens},raw:e}}function ze(){let e=new Map,t=new Map,n=new Map;function r(r){let i=[];switch(r.type){case`message_start`:i.push({type:`start`,id:r.message.id,data:{model:r.message.model,timestamp:Date.now()}});break;case`message_delta`:r.delta.stop_reason&&i.push({type:`complete`,data:{finishReason:Pe(r.delta.stop_reason),usage:{in:r.usage?.input_tokens||0,out:r.usage?.output_tokens||0}}});case`message_stop`:break;case`content_block_start`:if(r.content_block.type===`text`)e.set(r.index,`text`),i.push({type:`text-start`,data:{index:r.index}});else if(r.content_block.type===`tool_use`){e.set(r.index,`tool`);let t=r.content_block;n.set(r.index,{id:t.id,name:t.name,argumentsBuffer:``}),i.push({type:`tool-call-start`,data:{index:r.index,id:t.id,name:t.name}})}else if(r.content_block.type===`thinking`)e.set(r.index,`thinking`),i.push({type:`thinking-start`,data:{index:r.index,redacted:!1}});else if(r.content_block.type===`redacted_thinking`)e.set(r.index,`thinking`),i.push({type:`thinking-start`,data:{index:r.index,redacted:!0}});else if(r.content_block.type===`server_tool_use`){e.set(r.index,`provider-tool`);let n=r.content_block;t.set(n.id,{index:r.index,name:n.name}),i.push({type:`provider-tool-start`,data:{index:r.index,id:n.id,name:n.name}})}else if(r.content_block.type===`web_search_tool_result`){let e=r.content_block,n=t.get(e.tool_use_id);n&&(i.push({type:`provider-tool-complete`,data:{index:n.index,id:e.tool_use_id,name:n.name,output:e.content}}),t.delete(e.tool_use_id))}break;case`content_block_delta`:if(r.delta.type===`text_delta`)i.push({type:`text-delta`,data:{text:r.delta.text,index:r.index}});else if(r.delta.type===`input_json_delta`){let e=n.get(r.index);e&&(e.argumentsBuffer+=r.delta.partial_json,i.push({type:`tool-call-args-delta`,data:{index:r.index,id:e.id,name:e.name,delta:r.delta.partial_json,accumulated:e.argumentsBuffer}}))}else r.delta.type===`thinking_delta`?i.push({type:`thinking-delta`,data:{text:r.delta.thinking,index:r.index}}):r.delta.type===`signature_delta`||r.delta.type;break;case`content_block_stop`:{let t=e.get(r.index);if(t===`text`)i.push({type:`text-complete`,data:{index:r.index}});else if(t===`thinking`)i.push({type:`thinking-complete`,data:{index:r.index}});else if(t!==`provider-tool`&&t===`tool`){let e=n.get(r.index);if(e){try{let t=e.argumentsBuffer?JSON.parse(e.argumentsBuffer):{};i.push({type:`tool-call-complete`,data:{index:r.index,id:e.id,name:e.name,arguments:t}})}catch(t){throw Error(`Failed to parse tool call arguments for ${e.name}: ${t instanceof Error?t.message:String(t)}\nRaw buffer: ${e.argumentsBuffer}`)}n.delete(r.index)}}e.delete(r.index);break}}return i}return{handleEvent:r}}async function*Be(e){let{client:t,model:n,messages:r,system:i,tools:a,context:o,signal:s,options:c,reasoning:l}=e,u=o?.tracer,{stop:d,max_tokens:f,providerTools:p,...m}=c??{},h=a?Me(a):[];if(p){let e={web_search:`web_search_20250305`};for(let t of p){let n=e[t.name]??t.name;h.push({type:n,name:t.name,...t.config})}}let g=ze();try{let e=await Te(r,{model:n,fileResolver:o?.fileResolver,signal:s}),a={model:n,max_tokens:f??Ve(n),messages:e,...i&&{system:i},...d&&{stop_sequences:se(d)},...h.length>0&&{tools:h},...je(l),...m};u?.debug(`Anthropic streaming request`,{request:Y(a)});let c=await t.messages.create({...a,stream:!0},{signal:s});for await(let e of c){let t=g.handleEvent(e);for(let e of t)yield e}}catch(e){if(s?.aborted)return;yield{type:`error`,data:{type:`STREAMING_ERROR`,message:e instanceof Error?e.message:String(e),raw:e}}}}function Ve(t){return t in e?e[t]:t.includes(`opus`)?t.match(/opus-4-[6-9]|opus-[5-9]/)?128e3:64e3:t.includes(`sonnet`)||t.includes(`haiku`)?t.match(/claude-3-[0-5]-/)?8192:64e3:16384}function He(e){let t=new m({apiKey:e});return{name:`anthropic`,async createGenerationRequest(e,n){return await Le({client:t,model:e,...n})},createStreamingRequest(e,n){return Be({client:t,model:e,...n})}}}async function Ue(e,t,n={model:``}){let r=(await Promise.all(e.map(e=>qe(e,n)))).flat(1);return t?[{role:`system`,content:t},...r]:r}function We(e){return e===!0?{reasoning_effort:`high`}:e===!1?{reasoning_effort:`minimal`}:{}}function Ge(e){if(e&&e.length>0)return e.map(e=>({type:`function`,function:{name:e.name,description:e.description,parameters:n.toJSONSchema(e.schema)}}))}function Ke(e){switch(e){case`stop`:return`stop`;case`length`:return`length`;case`tool_calls`:case`function_call`:return`function_call`;case`content_filter`:return`error`;default:return`stop`}}async function qe(e,t){switch(e.role){case`tool`:return Je(e,t);case`assistant`:return Ye(e);default:return Xe(e,t)}}async function Je(e,t){return Promise.all(e.content.map(async e=>({role:`tool`,content:typeof e.content==`string`?e.content:await Qe(e.content,t),tool_call_id:e.id})))}function Ye(e){let t=e.content.filter(e=>e.type===`tool-call`),n=e.content.filter(e=>e.type===`text`),r=t.length>0?t.map(e=>({type:`function`,id:e.id,function:{name:e.name,arguments:JSON.stringify(e.parameters)}})):void 0;return{role:`assistant`,content:n.map(e=>e.text).join(``),...r&&{tool_calls:r}}}async function Xe(e,t){if(typeof e.content==`string`)return{role:`user`,content:e.content};let n=(await Promise.all(e.content.map(e=>Ze(e,t)))).filter(e=>e!==null);return n.every(e=>e.type===`text`)?{role:`user`,content:n.map(e=>e.text).join(``)}:{role:`user`,content:n}}async function Ze(e,t){return e.type===`text`?{type:`text`,text:e.text}:e.type===`file`?$e(e.file,t,`user-message`):null}async function Qe(e,t){let n=[];for(let r of e){if(r.type===`text`){n.push(r.text);continue}if(r.file.kind===`text`){let e=await Z(r.file,{provider:`chatcompletions`,model:t.model,accepted:[`text`],purpose:`tool-result`,resolver:t.fileResolver,signal:t.signal});if(e.type!==`text`)throw Error(`Unsupported ChatCompletions text source: ${e.type}`);n.push(nt(r.file,e.content,e.name,e.mimeType));continue}throw Error(`ChatCompletions tool results do not support file parts other than text`)}return n.join(`
|
|
9
|
+
`)}async function $e(e,t,n){if(e.kind===`text`){let r=await Z(e,{provider:`chatcompletions`,model:t.model,accepted:[`text`],purpose:n,resolver:t.fileResolver,signal:t.signal});if(r.type!==`text`)throw Error(`Unsupported ChatCompletions text source: ${r.type}`);return{type:`text`,text:nt(e,r.content,r.name,r.mimeType)}}if(e.kind===`document`){if(e.mimeType!==`application/pdf`)throw Error(`ChatCompletions document file inputs currently support PDF only. Received ${e.mimeType}`);let r=await Z(e,{provider:`chatcompletions`,model:t.model,accepted:[`url`,`base64`],purpose:n,resolver:t.fileResolver,signal:t.signal});return{type:`file`,file:{filename:r.name??e.name,file_data:tt(r,e)}}}return{type:`image_url`,image_url:{url:et(await Z(e,{provider:`chatcompletions`,model:t.model,accepted:[`url`,`base64`],purpose:n,resolver:t.fileResolver,signal:t.signal}),e)}}}function et(e,t){if(e.type===`url`)return e.url;if(e.type===`base64`)return`data:${e.mimeType??t.mimeType};base64,${e.data}`;throw Error(`Unsupported ChatCompletions image source: ${e.type}`)}function tt(e,t){if(e.type===`url`)return e.url;if(e.type===`base64`)return`data:${e.mimeType??t.mimeType};base64,${e.data}`;throw Error(`Unsupported ChatCompletions file source: ${e.type}`)}function nt(e,t,n,r){return`File: ${n??e.name}\nMIME type: ${r??e.mimeType}\n\n${t}`}async function rt(e){let{baseUrl:t,model:n,messages:r,system:i,tools:a,context:o,apiKey:s,options:c,reasoning:l,signal:u}=e,d=o?.tracer,f;try{q(u,`Generate aborted`);let e=await Ue(r,i,{model:n,fileResolver:o?.fileResolver,signal:u}),p=Ge(a),m={model:n,messages:e,...p&&{tools:p},...We(l)};c&&(c.temperature!==void 0&&(m.temperature=c.temperature),c.top_p!==void 0&&(m.top_p=c.top_p),c.max_tokens!==void 0&&(m.max_tokens=c.max_tokens),c.frequency_penalty!==void 0&&(m.frequency_penalty=c.frequency_penalty),c.presence_penalty!==void 0&&(m.presence_penalty=c.presence_penalty),c.stop!==void 0&&(m.stop=c.stop),c.reasoning_effort!==void 0&&(m.reasoning_effort=c.reasoning_effort)),d?.debug(`ChatCompletions request`,{request:Y(m)});let h={"Content-Type":`application/json`};s&&(h.Authorization=`Bearer ${s}`);let g=await J(fetch(`${t}/chat/completions`,{method:`POST`,headers:h,body:JSON.stringify(m),signal:u}),u,`Generate aborted`);if(!g.ok){let e=await g.text().catch(()=>``);throw Error(`HTTP error! status: ${g.status}${e?` - ${e}`:``}`)}let _=await J(g.json(),u,`Generate aborted`);q(u,`Generate aborted`),f=it(_)}catch(e){q(u,`Generate aborted`),d?.error(`Error fetching ChatCompletions response`,{error:e instanceof Error?e.message:String(e)}),f=X(e)}return d?.debug(`ChatCompletions response`,{result:f}),f}function it(e){let t=e.choices?.[0];if(!t)return{type:`error`,error:{type:`ChatCompletionsError`,message:`No choices in response`},usage:{in:0,out:0},raw:e};let n=[];if(t.message.reasoning_content&&n.push({type:`thinking`,text:t.message.reasoning_content}),t.message.content&&n.push({type:`text`,text:t.message.content}),t.message.tool_calls)for(let e of t.message.tool_calls){let t;try{t=JSON.parse(e.function.arguments)}catch(t){throw Error(`Invalid tool call arguments for ${e.function.name}: ${t instanceof Error?t.message:String(t)}`)}if(typeof t!=`object`||!t||Array.isArray(t))throw Error(`Invalid tool call arguments for ${e.function.name}: expected object, got ${typeof t}`);n.push({type:`tool-call`,id:e.id,name:e.function.name,parameters:t})}let r=n.some(e=>e.type===`tool-call`)?Ke(`tool_calls`):Ke(t.finish_reason);return{type:`success`,id:e.id,model:e.model,role:`assistant`,finishReason:r,content:n,text:M(n),usage:{in:e.usage?.prompt_tokens||0,out:e.usage?.completion_tokens||0},raw:e}}function at(){let e=new Map,t=0,n=-1,r=``,i=``,a=null,o,s;function c(e){n<0||(a===`text`?e.push({type:`text-complete`,data:{index:n}}):a===`thinking`&&e.push({type:`thinking-complete`,data:{index:n}}),a=null,n=-1)}function l(l){let u=[];l.usage&&(s={in:l.usage.prompt_tokens,out:l.usage.completion_tokens});let d=l.choices?.[0];if(!d)return u;r||(r=l.id,i=l.model,u.push({type:`start`,id:r,data:{model:i,timestamp:Date.now()}}));let f=d.delta;if(f.reasoning_content&&(a!==`thinking`&&(c(u),n=t++,a=`thinking`,u.push({type:`thinking-start`,data:{index:n}})),u.push({type:`thinking-delta`,data:{index:n,text:f.reasoning_content}})),f.content&&(a!==`text`&&(c(u),n=t++,a=`text`,u.push({type:`text-start`,data:{index:n}})),u.push({type:`text-delta`,data:{text:f.content,index:n}})),f.tool_calls){c(u);for(let n of f.tool_calls){let r=n.index;if(!e.has(r)){let i=t++,a=n.id||`tool-${i}`;e.set(r,{id:a,name:n.function?.name||``,argumentsBuffer:``,partIdx:i}),u.push({type:`tool-call-start`,data:{index:i,id:a,name:n.function?.name||``}})}let i=e.get(r);n.id&&(i.id=n.id),n.function?.name&&(i.name=n.function.name),n.function?.arguments&&(i.argumentsBuffer+=n.function.arguments,u.push({type:`tool-call-args-delta`,data:{index:i.partIdx,id:i.id,name:i.name,delta:n.function.arguments,accumulated:i.argumentsBuffer}}))}}if(d.finish_reason){c(u);for(let[,t]of e)try{let e=t.argumentsBuffer?JSON.parse(t.argumentsBuffer):{};u.push({type:`tool-call-complete`,data:{index:t.partIdx,id:t.id,name:t.name,arguments:e}})}catch(e){throw Error(`Failed to parse tool call arguments for ${t.name}: ${e instanceof Error?e.message:String(e)}\nRaw buffer: ${t.argumentsBuffer}`)}o=Ke(d.finish_reason)}return u}function u(){return o===void 0?[]:[{type:`complete`,data:{finishReason:o,usage:s??{in:0,out:0}}}]}return{handleChunk:l,finalize:u}}async function*ot(e){let{baseUrl:t,model:n,messages:r,system:i,tools:a,context:o,signal:s,apiKey:c,options:l,reasoning:u}=e,d=o?.tracer;l?.providerTools&&d?.warn(`providerTools not supported by ChatCompletions provider`);let f=at();try{let e=await Ue(r,i,{model:n,fileResolver:o?.fileResolver,signal:s}),p=Ge(a),m={model:n,messages:e,stream:!0,stream_options:{include_usage:!0},...p&&{tools:p},...We(u)};l&&(l.temperature!==void 0&&(m.temperature=l.temperature),l.top_p!==void 0&&(m.top_p=l.top_p),l.max_tokens!==void 0&&(m.max_tokens=l.max_tokens),l.frequency_penalty!==void 0&&(m.frequency_penalty=l.frequency_penalty),l.presence_penalty!==void 0&&(m.presence_penalty=l.presence_penalty),l.stop!==void 0&&(m.stop=l.stop),l.reasoning_effort!==void 0&&(m.reasoning_effort=l.reasoning_effort)),d?.debug(`ChatCompletions streaming request`,{request:Y(m)});let h={"Content-Type":`application/json`};c&&(h.Authorization=`Bearer ${c}`);let g=await fetch(`${t}/chat/completions`,{method:`POST`,headers:h,body:JSON.stringify(m),signal:s});if(!g.ok){let e=await g.text().catch(()=>``);throw Error(`HTTP error! status: ${g.status}${e?` - ${e}`:``}`)}if(!g.body)throw Error(`Response body is null`);let _=g.body.getReader(),v=new TextDecoder,y=``;for(;;){let{done:e,value:t}=await _.read();if(e)break;y+=v.decode(t,{stream:!0});let n=y.split(`
|
|
10
|
+
`);y=n.pop()||``;for(let e of n){let t=e.trim();if(!t||t.startsWith(`:`)||!t.startsWith(`data: `))continue;let n=t.slice(6);if(n!==`[DONE]`)try{let e=JSON.parse(n),t=f.handleChunk(e);for(let e of t)yield e}catch(e){d?.error(`Error parsing ChatCompletions stream chunk`,{error:e instanceof Error?e.message:String(e),line:t})}}}for(let e of f.finalize())yield e}catch(e){if(s?.aborted)return;d?.error(`Error in ChatCompletions streaming request`,{error:e instanceof Error?e.message:String(e)}),yield{type:`error`,data:{type:`STREAMING_ERROR`,message:e instanceof Error?e.message:String(e),raw:e}}}}function st(e,t){return{name:`ChatCompletions`,async createGenerationRequest(n,r){return await rt({baseUrl:e,model:n,apiKey:t,...r})},createStreamingRequest(n,r){return ot({baseUrl:e,model:n,apiKey:t,...r})}}}function ct(e,t,r){let i={};return t&&(i.systemInstruction=t),e&&e.length>0&&(i.tools=e.map(e=>({functionDeclarations:[{name:e.name,description:e.description,parametersJsonSchema:n.toJSONSchema(e.schema)}]}))),r&&Object.assign(i,r),i}function lt(e){return e===!0?{thinkingConfig:{thinkingBudget:8192,includeThoughts:!0}}:e===!1?{thinkingConfig:{thinkingBudget:0}}:{}}async function ut(e,t={model:``}){return(await Promise.all(e.map(e=>dt(e,t)))).filter(e=>e!==void 0)}async function dt(e,t){switch(e.role){case`tool`:return ft(e,t);case`assistant`:return pt(e);case`user`:return mt(e,t)}}async function ft(e,t){return{role:`user`,parts:(await Promise.all(e.content.map(async e=>{let n=typeof e.content==`string`?e.content:e.content.filter(e=>e.type===`text`).map(e=>e.text).join(`
|
|
11
|
+
`),r={functionResponse:{id:e.id??void 0,name:e.name,response:{output:n}}};return typeof e.content==`string`?[r]:[r,...await Promise.all(e.content.filter(e=>e.type===`file`).map(e=>gt(e.file,t,`tool-result`)))]}))).flat(1)}}function pt(e){let t=[],n=e.content.filter(e=>e.type===`text`);if(n.length>0){let e=n.map(e=>e.text).join(``);e&&t.push({text:e})}let r=e.content.filter(e=>e.type===`tool-call`);return r.length>0&&t.push(...r.map(e=>{let t={functionCall:{id:e.id??void 0,name:e.name,args:e.parameters}};return e.providerMetadata?.thoughtSignature&&(t.thoughtSignature=e.providerMetadata.thoughtSignature),t})),{role:`model`,parts:t}}async function mt(e,t){return typeof e.content==`string`?{role:`user`,parts:[{text:e.content}]}:{role:`user`,parts:(await Promise.all(e.content.map(e=>ht(e,t)))).filter(e=>e!==null)}}async function ht(e,t){return e.type===`text`?{text:e.text}:e.type===`file`?gt(e.file,t,`user-message`):null}async function gt(e,t,n){if(e.kind===`text`){let r=await Z(e,{provider:`gemini`,model:t.model,accepted:[`text`],purpose:n,resolver:t.fileResolver,signal:t.signal});if(r.type!==`text`)throw Error(`Unsupported Gemini text source: ${r.type}`);return{text:vt(e,r.content,r.name,r.mimeType)}}if(e.kind===`document`&&e.mimeType!==`application/pdf`)throw Error(`Gemini document file support is limited to PDFs. Received ${e.mimeType}`);return _t(await Z(e,{provider:`gemini`,model:t.model,accepted:[`gemini-file-uri`,`url`,`base64`],purpose:n,resolver:t.fileResolver,signal:t.signal}),e)}function _t(e,t){if(e.type===`base64`)return{inlineData:{mimeType:e.mimeType??t.mimeType,data:e.data}};if(e.type===`url`)return{fileData:{mimeType:e.mimeType??t.mimeType,fileUri:e.url}};if(e.type===`gemini-file-uri`)return{fileData:{mimeType:e.mimeType??t.mimeType,fileUri:e.uri}};throw Error(`Unsupported Gemini file source: ${e.type}`)}function vt(e,t,n,r){return`File: ${n??e.name}\nMIME type: ${r??e.mimeType}\n\n${t}`}function yt(e){switch(e){case g.STOP:return[!0,`stop`];case g.MAX_TOKENS:return[!0,`length`];case g.FINISH_REASON_UNSPECIFIED:case g.SAFETY:case g.RECITATION:case g.LANGUAGE:case g.OTHER:case g.BLOCKLIST:case g.PROHIBITED_CONTENT:case g.SPII:case g.MALFORMED_FUNCTION_CALL:case g.IMAGE_SAFETY:return[!1,`error`]}return[!1,`error`]}async function bt(e){let{client:t,model:n,messages:r,system:i,tools:a,context:o,options:s,reasoning:c,signal:l}=e,u=o?.tracer,d={...lt(c),...s??{}};d.max_tokens&&(d.maxOutputTokens=d.max_tokens,delete d.max_tokens),d.stop&&(d.stopSequences=Array.isArray(d.stop)?d.stop:[d.stop],delete d.stop),d.top_p!==void 0&&(d.topP=d.top_p,delete d.top_p);let f;try{q(l,`Generate aborted`);let e={contents:await ut(r,{model:n,fileResolver:o?.fileResolver,signal:l}),config:ct(a,i,d)};u?.debug(`Gemini request`,{request:Y(e)});let s=await J(t.models.generateContent({model:n,...e}),l,`Generate aborted`);q(l,`Generate aborted`),f=xt(s,{tracer:u})}catch(e){q(l,`Generate aborted`),u?.error(e instanceof Error?e.message:String(e)),f=X(e)}return u?.debug(`Gemini response`,{result:f}),f}function xt(e,t){let{tracer:n}=t,r=e.usageMetadata?.promptTokenCount??0,i={in:r,out:(e.usageMetadata?.totalTokenCount??r)-r};if(!e)return{type:`error`,error:{type:`InvalidResponse`,message:`Invalid or empty response from Google AI`},usage:{in:0,out:0},raw:e};if(e.promptFeedback&&e.promptFeedback.blockReason)return{type:`error`,error:{type:`Blocked`,message:`Response blocked by Google AI: ${e.promptFeedback.blockReason}, ${e.promptFeedback.blockReasonMessage}`},usage:i,raw:e};if(!e.candidates||e.candidates.length===0)return{type:`error`,error:{type:`InvalidResponse`,message:`Invalid or empty response from Google AI`},usage:{in:0,out:0},raw:e};e.candidates.length>1&&n?.warn(`We received ${e.candidates.length} response candidates`);let a=e.candidates[0],o=(a.content?.parts||[]).map(e=>e.text).filter(e=>e!==void 0).join(``),[s,c]=yt(a.finishReason);if(s){let t=[];if(o&&t.push({type:`text`,text:o}),e.functionCalls)for(let n of e.functionCalls)if(n.args==null)t.push({type:`tool-call`,id:n.id??``,name:n.name??``,parameters:{}});else if(typeof n.args!=`object`||Array.isArray(n.args))throw Error(`Invalid tool call arguments for ${n.name}: expected object, got ${typeof n.args}`);else t.push({type:`tool-call`,id:n.id??``,name:n.name??``,parameters:n.args});return{type:`success`,id:e.responseId??``,model:e.modelVersion??``,role:`assistant`,finishReason:e.functionCalls?`function_call`:c,content:t,text:M(t),usage:i,raw:e}}else return{type:`error`,error:{type:`Undetermined`,message:`Unexpected stop reason: ${c}`},usage:i,raw:e}}function St(){let e=0,t=-1,n=!1,r=``,i=``,a=0,o=0,s=null;function c(e){t<0||(s===`text`?e.push({type:`text-complete`,data:{index:t}}):s===`thinking`&&e.push({type:`thinking-complete`,data:{index:t}}),s=null,t=-1)}function l(l){let u=[];r||(r=l.responseId||`gemini-${Date.now()}`,i=l.modelVersion||`gemini`,u.push({type:`start`,id:r,data:{model:i,timestamp:Date.now()}})),l.usageMetadata&&(a=l.usageMetadata.promptTokenCount||0,o=(l.usageMetadata.totalTokenCount||0)-a);let d=l.candidates?.[0];if(!d)return u;let f=d.content?.parts||[];for(let r of f){let i=`thought`in r&&r.thought===!0,a=Object.keys(r);if(!(`thoughtSignature`in r&&!r.text&&!r.functionCall||a.length===2&&`text`in r&&`thoughtSignature`in r&&!r.text)&&(i&&r.text?(s!==`thinking`&&(c(u),t=e++,s=`thinking`,u.push({type:`thinking-start`,data:{index:t}})),u.push({type:`thinking-delta`,data:{index:t,text:r.text}})):r.text&&!i?(s!==`text`&&(c(u),t=e++,s=`text`,u.push({type:`text-start`,data:{index:t}})),u.push({type:`text-delta`,data:{text:r.text,index:t}})):r.functionCall||console.log(`[gemini] unhandled part type: ${JSON.stringify(Object.keys(r))}`),r.functionCall)){c(u),n=!0;let t=e++,i=r.functionCall.id||`tool-${t}`,a=r.functionCall.name??``;u.push({type:`tool-call-start`,data:{index:t,id:i,name:a}});let o=r.functionCall.args??{},s=JSON.stringify(o);u.push({type:`tool-call-args-delta`,data:{index:t,id:i,name:a,delta:s,accumulated:s}});let l={index:t,id:i,name:a,arguments:o},d=r;d.thoughtSignature&&(l.providerMetadata={thoughtSignature:d.thoughtSignature}),u.push({type:`tool-call-complete`,data:l})}}if(d.finishReason&&d.finishReason!==g.FINISH_REASON_UNSPECIFIED){c(u);let[e,t]=yt(d.finishReason),r=n?`function_call`:t;!e&&!n?u.push({type:`error`,data:{type:`FinishReasonError`,message:`Unexpected finish reason: ${d.finishReason}`,usage:{in:a,out:o},raw:l}}):u.push({type:`complete`,data:{finishReason:r,usage:{in:a,out:o}}})}return u}return{handleChunk:l}}async function*Ct(e){let{client:t,model:n,messages:r,system:i,tools:a,context:o,signal:s,options:c,reasoning:l}=e,u=o?.tracer,{providerTools:d,...f}=c??{},p={...lt(l),...f};p.max_tokens&&(p.maxOutputTokens=p.max_tokens,delete p.max_tokens),p.stop&&(p.stopSequences=Array.isArray(p.stop)?p.stop:[p.stop],delete p.stop),p.top_p!==void 0&&(p.topP=p.top_p,delete p.top_p);let m=ct(a,i,p);if(d){let e={web_search:`googleSearch`,code_execution:`codeExecution`};m.tools||=[];for(let t of d){let n=e[t.name]??t.name;m.tools.push({[n]:t.config??{}})}}let h=St();try{let e={contents:await ut(r,{model:n,fileResolver:o?.fileResolver,signal:s}),config:m};u?.debug(`Gemini streaming request`,{request:Y(e)});let i=await t.models.generateContentStream({model:n,...e});for await(let e of i){let t=h.handleChunk(e);for(let e of t)yield e}}catch(e){if(s?.aborted)return;u?.error(e instanceof Error?e.message:String(e)),yield{type:`error`,data:{type:`STREAMING_ERROR`,message:e instanceof Error?e.message:String(e),raw:e}}}}function wt(e){let t=new _({apiKey:e});return{name:`Gemini`,async createGenerationRequest(e,n){return await bt({client:t,model:e,...n})},createStreamingRequest(e,n){return Ct({client:t,model:e,...n})}}}async function Tt(e){let{provider:t,model:n,messages:r,system:i,tools:a,tracer:o,fileResolver:s,options:c,reasoning:l,signal:u}=e;return t.createGenerationRequest(n,{messages:r,system:i,tools:a,context:{tracer:o,fileResolver:s},options:c,reasoning:l,signal:u})}async function Et(e){if(`instruct`in e){let{instruct:t,messages:n,...r}=e,i=L(t),a=await Dt({...r,messages:[...n??[],i.message]});if(a.result===`error`)return a;try{return{...a,response:i.parse(a.final)}}catch(e){return{...a,response:null,parseError:e}}}return Dt(e)}async function Dt(e){let{provider:t,model:n,messages:r,system:i,onToolCall:a,maxIterations:o,tracer:s,fileResolver:c,options:l,reasoning:u,signal:d=new AbortController().signal}=e,f=H(e),p=[...r],m=[],h={in:0,out:0},g=0,_,v=e=>{p.push(e),m.push(e)},y=e=>(s?.setResult({kind:`llm`,model:n,request:{messages:r},response:{content:e.result===`success`?e.final?.content:null},usage:e.usage?{inputTokens:e.usage.in,outputTokens:e.usage.out}:void 0,finishReason:e.result===`success`?e.final?.finishReason:void 0}),s?.end(e.result===`error`?`error`:`ok`),e),b=(e,t)=>{if(!e||t.type===`error`){e?.end(`error`);return}e.setResult({kind:`llm`,model:t.model??n,request:{messages:p},response:{content:t.content},usage:t.usage?{inputTokens:t.usage.in,outputTokens:t.usage.out}:void 0,finishReason:t.finishReason}),e.end()};try{for(;;){if(q(d,`Generate aborted`),o!==void 0&&g>=o)return y({result:`error`,messages:m,error:{type:`model`,error:{type:`error`,error:{type:`MaxIterations`,message:`Exceeded max iterations (${o})`}}},usage:h});g+=1;let e=s?.startSpan(`turn-${g}`,{type:`llm`}),r=f.executable(),x=r.length>0?r.map(e=>({name:e.name,description:e.description,schema:e.schema})):void 0,S;try{S=await Tt({provider:t,model:n,messages:p,system:i,tools:x,tracer:e,fileResolver:c,options:l,reasoning:u,signal:d}),q(d,`Generate aborted`)}catch(t){throw t instanceof Error&&t.name===`AbortError`&&e?.end(`ok`),t}if(B(h,S),b(e,S),S.type===`error`)return y({result:`error`,messages:m,error:{type:`model`,error:S},usage:h});let C={role:`assistant`,id:S.id,model:S.model,content:S.content,finishReason:S.finishReason};if(v(C),_=C,S.finishReason!==`function_call`)return y({result:`success`,messages:m,final:_,usage:h});let w=N(S.content);if(w.length===0)return y({result:`success`,messages:m,final:_,usage:h});let{results:T}=await ee(w,a,d,f,s);q(d,`Generate aborted`),T.length>0&&v({role:`tool`,id:crypto.randomUUID(),content:T})}}catch(e){throw e instanceof A?(s?.end(`error`),new A(e.message,{toolName:e.toolName,messages:e.messages??m,partial:e.partial??_,usage:e.usage??h,cause:e.cause})):e instanceof O?(s?.end(`ok`),new O(`Generate aborted`,{reason:e.reason,messages:e.messages??m,partial:e.partial,usage:e.usage??h})):e instanceof Error&&e.name===`AbortError`?(s?.end(`ok`),new O(`Generate aborted`,{reason:d.reason,messages:m,usage:h})):e}}function Ot(e){if(e&&e.length>0)return e.map(e=>({type:`function`,strict:!0,name:e.name,description:e.description,parameters:n.toJSONSchema(e.schema)}))}function kt(e){return e===!0?{reasoning:{effort:`high`}}:e===!1?{reasoning:{effort:`minimal`}}:{}}async function At(e,t={model:``}){return(await Promise.all(e.map(e=>jt(e,t)))).flat(1)}async function jt(e,t){switch(e.role){case`tool`:return Mt(e,t);case`assistant`:return Nt(e);default:return Pt(e,t)}}async function Mt(e,t){return Promise.all(e.content.map(async e=>({type:`function_call_output`,call_id:e.id,output:typeof e.content==`string`?e.content:await Promise.all(e.content.map(e=>e.type===`text`?Promise.resolve({type:`input_text`,text:e.text}):It(e.file,t,`tool-result`)))})))}function Nt(e){let t=[],n=M(e.content);n&&t.push({role:e.role,content:n});let r=e.content.filter(e=>e.type===`tool-call`);for(let e of r)t.push({type:`function_call`,call_id:e.id,name:e.name,arguments:JSON.stringify(e.parameters)});let i=e.content.filter(e=>e.type===`provider-tool`);for(let e of i)e.output!=null&&t.push(e.output);return t}async function Pt(e,t){if(typeof e.content==`string`)return{role:e.role,content:e.content};{let n=(await Promise.all(e.content.map(e=>Ft(e,t)))).filter(e=>e!==null);return{role:e.role,content:n}}}async function Ft(e,t){return e.type===`text`?{type:`input_text`,text:e.text}:e.type===`file`?It(e.file,t,`user-message`):(e.type,null)}async function It(e,t,n){if(e.kind===`image`)return{type:`input_image`,image_url:Lt(await Z(e,{provider:`openai`,model:t.model,accepted:[`url`,`base64`],purpose:n,resolver:t.fileResolver,signal:t.signal}),e),detail:`auto`};if(e.kind===`document`){if(e.mimeType!==`application/pdf`)throw Error(`OpenAI file inputs currently support PDF documents. Received ${e.mimeType}`);return Rt(await Z(e,{provider:`openai`,model:t.model,accepted:[`url`,`base64`],purpose:n,resolver:t.fileResolver,signal:t.signal}),e)}let r=await Z(e,{provider:`openai`,model:t.model,accepted:[`text`,`url`,`base64`],purpose:n,resolver:t.fileResolver,signal:t.signal});return r.type===`text`?{type:`input_text`,text:r.content}:Rt(r,e)}function Lt(e,t){if(e.type===`url`)return e.url;if(e.type===`base64`)return`data:${e.mimeType??t.mimeType};base64,${e.data}`;throw Error(`Unsupported OpenAI image source: ${e.type}`)}function Rt(e,t){if(e.type===`url`)return{type:`input_file`,filename:e.name??t.name,file_url:e.url};if(e.type===`base64`)return{type:`input_file`,filename:e.name??t.name,file_data:`data:${e.mimeType??t.mimeType};base64,${e.data}`};throw Error(`Unsupported OpenAI file source: ${e.type}`)}async function zt(e){let{client:t,model:n,messages:r,system:i,tools:a,context:o,options:s,reasoning:c,signal:l}=e,u=o?.tracer,d;try{q(l,`Generate aborted`);let e=Ot(a),f={model:n,input:await At(r,{model:n,fileResolver:o?.fileResolver,signal:l}),...i&&{instructions:i},...e?{tools:e}:{},...kt(c),...s};u?.debug(`OpenAI ResponsesAPI request`,{request:Y(f)});let p=await J(t.responses.create(f,...l?[{signal:l}]:[]),l,`Generate aborted`);q(l,`Generate aborted`),d=Bt(p)}catch(e){q(l,`Generate aborted`),u?.error(e instanceof Error?e.message:String(e)),d=X(e)}return u?.debug(`OpenAI ResponsesAPI response`,{result:d}),d}function Bt(e){if(e.error)return{type:`error`,error:{type:e.error.code||`undetermined`,message:e.error.message||`Response generation failed`},usage:{in:e.usage?.input_tokens??0,out:e.usage?.output_tokens??0},raw:e};let t=e.output?.filter(e=>e.type===`reasoning`)?.map(e=>e),n=[];if(t&&t.length>0)for(let e of t){let t=e.summary?.[0]?.text||e.content?.[0]?.text||``;(t||e.encrypted_content)&&n.push({type:`thinking`,text:t,...e.encrypted_content&&{encrypted:e.encrypted_content}})}e.output_text&&n.push({type:`text`,text:e.output_text});let r=e.output?.filter(e=>e.type===`function_call`);if(r&&r.length>0)for(let e of r){let t=e;try{n.push({type:`tool-call`,id:t.id||``,name:t.name||``,parameters:t.arguments?JSON.parse(t.arguments):{}})}catch(e){throw Error(`Failed to parse tool call arguments for ${t.name}: ${e instanceof Error?e.message:String(e)}\nRaw value: ${t.arguments}`)}}return{type:`success`,id:e.id,model:e.model||``,role:`assistant`,finishReason:e.incomplete_details?`error`:`stop`,content:n,text:M(n),usage:{in:e.usage?.input_tokens??0,out:e.usage?.output_tokens??0},raw:e}}function Vt(){let e=``,t=``,n=0,r=-1,i=!1,a=new Map,o=new Map,s=new Set([`web_search_call`,`file_search_call`,`code_interpreter_call`]),c=new Map;function l(l){let u=[];switch(l.type){case`response.created`:e=l.response.id||`openai-${Date.now()}`,t=l.response.model,u.push({type:`start`,id:e,data:{model:t,timestamp:Date.now()}});break;case`response.output_text.delta`:r===-1&&(r=n++,u.push({type:`text-start`,data:{index:r}})),u.push({type:`text-delta`,data:{text:l.delta,index:r}});break;case`response.output_text.done`:r>=0&&(u.push({type:`text-complete`,data:{index:r}}),r=-1);break;case`response.function_call_arguments.delta`:{let e=l.item_id;if(!c.has(e)){let t=a.get(e),r=t?.name||``,i=t?.callId||e,o=n++;c.set(e,{id:e,callId:i,name:r,argumentsBuffer:``,partIdx:o}),u.push({type:`tool-call-start`,data:{index:o,id:i,name:r}})}let t=c.get(e);t.argumentsBuffer+=l.delta,u.push({type:`tool-call-args-delta`,data:{index:t.partIdx,id:t.callId,name:t.name,delta:l.delta,accumulated:t.argumentsBuffer}});break}case`response.function_call_arguments.done`:{i=!0;let e=l.item_id,t=c.get(e),n=l.name||t?.name||``;if(t){try{let e=l.arguments?JSON.parse(l.arguments):{};u.push({type:`tool-call-complete`,data:{index:t.partIdx,id:t.callId,name:n,arguments:e}})}catch(e){throw Error(`Failed to parse function call arguments for ${n}: ${e instanceof Error?e.message:String(e)}\nRaw value: ${l.arguments}`)}c.delete(e)}break}case`response.completed`:{let e=l.response.usage;u.push({type:`complete`,data:{finishReason:l.response.incomplete_details?`error`:i?`function_call`:`stop`,usage:{in:e?.input_tokens||0,out:e?.output_tokens||0}}});break}case`response.failed`:u.push({type:`error`,data:{type:`RESPONSES_API_ERROR`,message:`Response failed: ${l.response.status}`,raw:l}});break;case`response.output_item.added`:if(l.item?.type===`reasoning`)r=n++,u.push({type:`thinking-start`,data:{index:r}});else if(l.item?.type===`function_call`){let e=l.item,t=e.id||e.call_id;t&&a.set(t,{name:e.name||``,callId:e.call_id||t})}else if(l.item&&s.has(l.item.type)){let e=l.item,t=n++;o.set(e.id,t),u.push({type:`provider-tool-start`,data:{index:t,id:e.id,name:e.type}})}break;case`response.output_item.done`:if(l.item?.type===`reasoning`&&r>=0)u.push({type:`thinking-complete`,data:{index:r}}),r=-1;else if(l.item&&s.has(l.item.type)){let e=l.item,t=o.get(e.id);t!==void 0&&(u.push({type:`provider-tool-complete`,data:{index:t,id:e.id,name:e.type,output:l.item}}),o.delete(e.id))}break;case`response.reasoning_text.delta`:l.delta&&u.push({type:`thinking-delta`,data:{index:r,text:l.delta}});break;case`response.reasoning_summary_text.delta`:l.delta&&u.push({type:`thinking-summary-delta`,data:{index:r,text:l.delta}});break;case`response.in_progress`:case`response.content_part.added`:case`response.content_part.done`:case`response.reasoning_summary_part.added`:case`response.reasoning_summary_part.done`:case`response.reasoning_summary_text.done`:case`response.reasoning_text.done`:case`response.web_search_call.in_progress`:case`response.web_search_call.searching`:case`response.web_search_call.completed`:break;default:console.log(`[OpenAI] unhandled stream event: ${l.type}`)}return u}return{handleEvent:l}}async function*Ht(e){let{client:t,model:n,messages:r,system:i,tools:a,context:o,signal:s,options:c,reasoning:l}=e,u=o?.tracer,{providerTools:d,...f}=c??{},p=Ot(a)??[];if(d){let e={web_search:`web_search_preview`,code_execution:`code_interpreter`};for(let t of d){let n=e[t.name]??t.name;p.push({type:n,...t.config})}}let m=Vt();try{let e={model:n,input:await At(r,{model:n,fileResolver:o?.fileResolver,signal:s}),...i&&{instructions:i},stream:!0,...p.length>0?{tools:p}:{},...kt(l),...f};u?.debug(`OpenAI ResponsesAPI streaming request`,{request:Y(e)});let a=t.responses.stream(e,...s?[{signal:s}]:[]);for await(let e of a){let t=m.handleEvent(e);for(let e of t)yield e}}catch(e){if(s?.aborted)return;u?.error(e instanceof Error?e.message:String(e)),yield{type:`error`,data:{type:`STREAMING_ERROR`,message:e instanceof Error?e.message:String(e),raw:e}}}}function Ut(e){let t=new v({apiKey:e});return{name:`OpenAI`,async createGenerationRequest(e,n){return await zt({client:t,model:e,...n})},createStreamingRequest(e,n){return Ht({client:t,model:e,...n})}}}const Wt=t.object({searchTerm:t.string().describe(`The search term to query`)}),Gt=new class{name=`brave`;description=`Perform a search using the Brave search engine`;schema=Wt;apiKey;throttle;lastExecTime=0;constructor(e){e&&this.configure(e)}configure(e){let{rateLimit:t}=e;this.apiKey=e[`api-key`],this.throttle=t?1100/t:void 0}async execute(e,t){let{searchTerm:n}=e;if(this.throttle){for(;Date.now()-this.lastExecTime<this.throttle;)await J(ce(this.throttle-(Date.now()-this.lastExecTime)),t.signal);this.lastExecTime=Date.now()}try{q(t.signal);let e=this.apiKey,r=new URL(`https://api.search.brave.com/res/v1/web/search`);r.searchParams.append(`q`,n),r.searchParams.append(`format`,`json`);let i=await fetch(r.toString(),{method:`GET`,signal:t.signal,headers:{Accept:`application/json`,"X-Subscription-Token":e??``}});if(!i.ok)throw Error(`[Brave] HTTP error ${i.status}: ${i.statusText}`);let a=await i.json();return JSON.stringify(a)}catch(e){throw t.signal.aborted||e instanceof Error&&e.name===`AbortError`?e:e instanceof Error?Error(`[Brave] Error fetching search results: ${e.message}`):e}}},Kt={name:`calculator`,description:`Performs basic arithmetic operations`,schema:r.object({operation:r.enum([`add`,`subtract`,`multiply`,`divide`]).describe(`The operation to perform (add, subtract, multiply, divide)`),a:r.number().describe(`First operand`),b:r.number().describe(`Second operand`)}),execute:async({operation:e,a:t,b:n})=>{switch(e){case`add`:return`${t} + ${n} = ${t+n}`;case`subtract`:return`${t} - ${n} = ${t-n}`;case`multiply`:return`${t} * ${n} = ${t*n}`;case`divide`:if(n===0)throw Error(`Cannot divide by zero`);return`${t} / ${n} = ${t/n}`;default:throw Error(`Unknown operation: ${e}`)}}};async function qt(e,t={}){let n=t.timeout??3e4,r=t.maxBuffer??1048576;return new Promise((i,a)=>{let o=y(e,[],{shell:!0,cwd:t.cwd}),s=``,c=``,l=!1,u=!1,d=!1,f=setTimeout(()=>{l=!0,o.kill(`SIGTERM`)},n),p=()=>{u=!0,o.kill(`SIGTERM`)};t.signal?.addEventListener(`abort`,p);let m=()=>{clearTimeout(f),t.signal?.removeEventListener(`abort`,p)};o.stdout?.setEncoding(`utf-8`),o.stderr?.setEncoding(`utf-8`),o.stdout?.on(`data`,e=>{if(s+=e,s.length+c.length>r){d=!0,o.kill(`SIGTERM`);return}t.onChunk?.(e)}),o.stderr?.on(`data`,e=>{if(c+=e,s.length+c.length>r){d=!0,o.kill(`SIGTERM`);return}t.onChunk?.(e)}),o.on(`error`,e=>{m(),a(e)}),o.on(`close`,e=>{if(m(),l){let e=Error(`Command timed out after ${n}ms`);e.stdout=s,e.stderr=c,a(e);return}if(u){let e=Error(`Command aborted`);e.stdout=s,e.stderr=c,a(e);return}if(d){let e=Error(`Command output exceeded maxBuffer (${r} bytes)`);e.stdout=s,e.stderr=c,a(e);return}if(e!==0){let t=Error(`Command failed with exit code ${e}`);t.stdout=s,t.stderr=c,t.code=e??-1,a(t);return}i({stdout:s,stderr:c})})})}function Jt(e){if(e instanceof Error){let t=e,n=`Error executing command: ${e.message}`;return t.stdout&&(n+=`\n[stdout]: ${t.stdout}`),t.stderr&&(n+=`\n[stderr]: ${t.stderr}`),n}return`Error executing command: ${String(e)}`}function Yt(e,t){return t&&t.trim()?`${e}\n[stderr]: ${t}`:e}const Xt=t.object({command:t.string().describe(`The shell command to execute`)}),Zt=new class{name=`exec`;description=`Execute a shell command and return the output.`;schema=Xt;timeout=3e4;maxBuffer=1024*1024;cwd;constructor(e){e&&this.configure(e)}configure(e){this.timeout=e.timeout??3e4,this.maxBuffer=e.maxBuffer??1024*1024,this.cwd=e.cwd}summarize(e){return e.command}async execute(e,t){let{command:n}=e;try{let e=await qt(n,{timeout:this.timeout,maxBuffer:this.maxBuffer,cwd:this.cwd,signal:t.signal,onChunk:e=>t.emit(e)});return Yt(e.stdout,e.stderr)}catch(e){return Jt(e)}}},Qt={name:`patch-file`,description:`Patch a file by replacing an exact string match within a specified line range`,schema:r.object({path:r.string().describe(`The file path to patch`),old_string:r.string().describe(`The exact text to find and replace`),new_string:r.string().describe(`The replacement text`),start_line:r.number().int().positive().describe(`1-indexed start line of the region to match within`),end_line:r.number().int().positive().describe(`1-indexed end line (inclusive) of the region to match within`)}),summarize:({path:e,start_line:t,end_line:n})=>`${e}:${t}:${n}`,execute:async({path:e,old_string:t,new_string:n,start_line:r,end_line:i})=>{if(i<r)throw Error(`end_line (${i}) must be >= start_line (${r})`);let a;try{a=await s(e,`utf-8`)}catch(t){throw t instanceof Error?Error(`Failed to read file "${e}": ${t.message}`):t}let o=a.split(`
|
|
12
|
+
`);if(r>o.length)throw Error(`start_line (${r}) exceeds file length (${o.length} lines)`);if(i>o.length)throw Error(`end_line (${i}) exceeds file length (${o.length} lines)`);let c=o.slice(r-1,i).join(`
|
|
13
|
+
`),u=c.indexOf(t);if(u===-1)throw Error(`old_string not found within lines ${r}-${i} of "${e}"`);if(c.indexOf(t,u+1)!==-1)throw Error(`old_string matches multiple times within lines ${r}-${i} of "${e}"`);let d=c.replace(t,n),f=[...o.slice(0,r-1),...d.split(`
|
|
14
|
+
`),...o.slice(i)].join(`
|
|
15
|
+
`);try{await l(e,f,`utf-8`)}catch(t){throw t instanceof Error?Error(`Failed to write file "${e}": ${t.message}`):t}return`Successfully patched "${e}" (lines ${r}-${i})`}},$t={name:`read-file`,description:`Read the contents of a file from disk`,schema:r.object({path:r.string().describe(`The file path to read from`)}),summarize:({path:e})=>e,execute:async({path:e})=>{try{return await s(e,`utf-8`)}catch(t){throw t instanceof Error?Error(`Failed to read file "${e}": ${t.message}`):t}}},en={name:`write-file`,description:`Write content to a file on disk, creating directories if needed`,schema:r.object({path:r.string().describe(`The file path to write to`),content:r.string().describe(`The content to write to the file`)}),summarize:({path:e})=>e,execute:async({path:e,content:t})=>{try{return await o(d(e),{recursive:!0}),await l(e,t,`utf-8`),`Successfully wrote ${t.length} characters to "${e}"`}catch(t){throw t instanceof Error?Error(`Failed to write file "${e}": ${t.message}`):t}}};function tn(e){try{let t=n.fromJSONSchema(e);return t instanceof n.ZodObject?t.strict():n.object({}).passthrough()}catch{return n.object({}).passthrough()}}function nn(e,t,n){return e.map(e=>an(e,t,n))}function rn(e,t){return e.map(e=>{let n=t?`${t}_${e.name}`:e.name,r=tn(e.inputSchema);return{name:n,description:e.description??``,schema:r}})}function an(e,t,n){let r=n?`${n}_${e.name}`:e.name,i=tn(e.inputSchema);return{name:r,description:e.description??``,schema:i,async execute(n,i){let a;try{a=await t.callTool({name:e.name,arguments:n},void 0,{signal:i.signal})}catch(t){throw i.signal.aborted||t instanceof Error&&t.name===`AbortError`?t:new A(`MCP tool call failed: ${e.name}`,{toolName:r,cause:t})}if(`isError`in a&&a.isError)throw Error(sn(a.content));return on(a.content)}}}function on(e){return e.some(e=>e.type===`image`)?e.filter(e=>e.type===`text`||e.type===`image`).map(e=>{if(e.type===`text`)return{type:`text`,text:e.text};let t=e;return{type:`file`,file:{kind:`image`,mimeType:t.mimeType,name:`mcp-image`,source:{type:`base64`,data:t.data}}}}):e.filter(e=>e.type===`text`).map(e=>e.text).join(`
|
|
16
|
+
`)}function sn(e){return e.filter(e=>e.type===`text`).map(e=>e.text).join(`
|
|
17
|
+
`)||`MCP tool execution error`}var cn=class{config;client;transport;cachedMcpTools;_connected=!1;constructor(e){this.config=e}get name(){return this.config.name??this.client?.getServerVersion()?.name}get connected(){return this._connected}async connect(e){if(this._connected)return;let t=e?.tracer?.startSpan(`mcp:connect`,{type:`internal`});this.client=new b({name:`axle`,version:`1.0.0`}),this.config.transport===`stdio`?this.transport=new x({command:this.config.command,args:this.config.args,env:this.config.env}):this.transport=new S(new URL(this.config.url),{requestInit:this.config.headers?{headers:this.config.headers}:void 0});try{await this.client.connect(this.transport,{signal:e?.signal}),this._connected=!0,t?.end(`ok`)}catch(e){throw t?.end(`error`),e}}async listTools(e){let t=this.assertConnected();return nn(await this.fetchTools(t,e?.tracer,e?.signal),t,e?.prefix)}async listToolDefinitions(e){let t=this.assertConnected();return rn(await this.fetchTools(t,e?.tracer,e?.signal),e?.prefix)}async refreshTools(){return this.assertConnected(),this.cachedMcpTools=void 0,this.listTools()}async close(e){this._connected&&(e?.tracer?.debug(`mcp:close`),await this.client?.close(),this._connected=!1,this.client=void 0,this.transport=void 0,this.cachedMcpTools=void 0)}async fetchTools(e,t,n){if(this.cachedMcpTools)return this.cachedMcpTools;t?.debug(`mcp:listTools`);let r=await e.listTools(void 0,{signal:n});return this.cachedMcpTools=r.tools.map(e=>({name:e.name,description:e.description,inputSchema:e.inputSchema})),this.cachedMcpTools}assertConnected(){if(!this._connected||!this.client)throw Error(`MCP not connected. Call connect() first.`);return this.client}};const ln={debug:0,info:1,warn:2,error:3};var un=class{writers=[];_minLevel=`info`;get minLevel(){return this._minLevel}set minLevel(e){this._minLevel=e}addWriter(e){this.writers.includes(e)||this.writers.push(e)}removeWriter(e){let t=this.writers.indexOf(e);t!==-1&&this.writers.splice(t,1)}startSpan(e,t){let n={traceId:crypto.randomUUID(),spanId:crypto.randomUUID(),name:e,type:t?.type,startTime:performance.now(),status:`ok`,attributes:{},events:[]};return this.writers.forEach(e=>e.onSpanStart(n)),new dn(n,this)}async flush(){for(let e of this.writers)e.flush&&await e.flush()}_notifySpanEnd(e){this.writers.forEach(t=>t.onSpanEnd(e))}_notifySpanUpdate(e){this.writers.forEach(t=>t.onSpanUpdate?.(e))}_notifyEvent(e,t){this.writers.forEach(n=>n.onEvent?.(e,t))}_notifySpanStart(e){this.writers.forEach(t=>t.onSpanStart(e))}_shouldLog(e){return ln[e]>=ln[this._minLevel]}},dn=class e{data;tracer;ended=!1;constructor(e,t){this.data=e,this.tracer=t}startSpan(t,n){let r={traceId:this.data.traceId,spanId:crypto.randomUUID(),parentSpanId:this.data.spanId,name:t,type:n?.type,startTime:performance.now(),status:`ok`,attributes:{},events:[]};return this.tracer._notifySpanStart(r),new e(r,this.tracer)}end(e=`ok`){this.ended||(this.ended=!0,this.data.endTime=performance.now(),this.data.status=e,this.tracer._notifySpanEnd(this.data))}addEvent(e,t,n){if(this.ended||!this.tracer._shouldLog(t))return;let r={name:e,timestamp:performance.now(),level:t,attributes:n};this.data.events.push(r),this.tracer._notifyEvent(this.data,r)}debug(e,t){this.addEvent(e,`debug`,t)}info(e,t){this.addEvent(e,`info`,t)}warn(e,t){this.addEvent(e,`warn`,t)}error(e,t){this.addEvent(e,`error`,t)}setAttribute(e,t){this.ended||(this.data.attributes[e]=t,this.tracer._notifySpanUpdate(this.data))}setAttributes(e){this.ended||(Object.assign(this.data.attributes,e),this.tracer._notifySpanUpdate(this.data))}setResult(e){this.ended||(this.data.result=e,this.tracer._notifySpanUpdate(this.data))}};const fn={debug:0,info:1,warn:2,error:3};var pn=class{minLevel;showInternal;showTimestamp;showDuration;markdown;output;spans=new Map;visibleDepths=new Map;constructor(e={}){this.minLevel=e.minLevel??`info`,this.showInternal=e.showInternal??!1,this.showTimestamp=e.showTimestamp??!0,this.showDuration=e.showDuration??!0,this.markdown=e.markdown??!1,this.output=e.output??console.log}shouldShowEvent(e){return fn[e]>=fn[this.minLevel]}isSpanVisible(e){return!(e.type===`internal`&&!this.showInternal)}findVisibleAncestor(e){let t=e.parentSpanId;for(;t;){let e=this.spans.get(t);if(!e)break;if(this.isSpanVisible(e))return e;t=e.parentSpanId}return null}calculateVisibleDepth(e){if(!this.isSpanVisible(e))return-1;let t=this.findVisibleAncestor(e);return t?(this.visibleDepths.get(t.spanId)??0)+1:0}formatTimestamp(){if(!this.showTimestamp)return``;let e=new Date;return`[${e.toTimeString().slice(0,8)}.${e.getMilliseconds().toString().padStart(3,`0`)}] `}formatDuration(e){if(!this.showDuration||!e.endTime)return``;let t=e.endTime-e.startTime;return t<1e3?` (${Math.round(t)}ms)`:` (${(t/1e3).toFixed(2)}s)`}formatIndent(e){return` `.repeat(e)}formatSpanName(e){return e.type?`[${e.type}] ${e.name}`:e.name}renderMarkdown(e){return mn(e).trimEnd()}onSpanStart(e){if(this.spans.set(e.spanId,e),!this.isSpanVisible(e))return;let t=this.calculateVisibleDepth(e);this.visibleDepths.set(e.spanId,t);let n=this.formatIndent(t),r=this.formatTimestamp(),i=this.formatSpanName(e);this.output(`${r}${n}START ${i}`)}onSpanEnd(e){if(this.spans.set(e.spanId,e),!this.isSpanVisible(e))return;let t=this.visibleDepths.get(e.spanId)??0,n=this.formatIndent(t),r=this.formatTimestamp(),i=this.formatDuration(e),a=this.formatSpanName(e),o=e.status===`error`?` [ERROR]`:``;if(this.output(`${r}${n}END ${a}${i}${o}`),e.result?.kind===`llm`){let t=e.result,i=[`model=${t.model}`];if(t.finishReason&&i.push(`finishReason=${t.finishReason}`),t.usage&&(t.usage.inputTokens!==void 0&&i.push(`inputTokens=${t.usage.inputTokens}`),t.usage.outputTokens!==void 0&&i.push(`outputTokens=${t.usage.outputTokens}`)),this.output(`${r}${n} INFO LLM complete ${i.join(` `)}`),this.shouldShowEvent(`debug`)&&t.response.content){let e=(typeof t.response.content==`string`?t.response.content:JSON.stringify(t.response.content,null,2)).split(`
|
|
18
|
+
`);for(let t of e)this.output(`${r}${n} DEBUG ${t}`)}}}onSpanUpdate(e){this.spans.set(e.spanId,e)}onEvent(e,t){if(!this.shouldShowEvent(t.level))return;this.spans.set(e.spanId,e);let n;if(this.isSpanVisible(e))n=this.visibleDepths.get(e.spanId)??0;else{let t=this.findVisibleAncestor(e);n=t?this.visibleDepths.get(t.spanId)??0:0}let r=this.formatIndent(n+1),i=this.formatTimestamp(),a=t.level.toUpperCase().padEnd(5),o=this.markdown&&t.attributes?.markdown===!0,s=t.attributes?Object.entries(t.attributes).filter(([e])=>e!==`markdown`):[],c=t.name;o&&(c=this.renderMarkdown(c));let l=`${i}${r}${a} ${c}`;if(s.length>0){let e=s.map(([e,t])=>`${e}=${JSON.stringify(t)}`).join(` `);l+=` ${e}`}this.output(l)}};function mn(e){return hn(w.lexer(e))}function hn(e=[]){return e.map(e=>gn(e)).filter(e=>e.length>0).join(`
|
|
19
|
+
`)}function gn(e){switch(e.type){case`space`:return``;case`heading`:return C.bold($(e.tokens));case`paragraph`:return $(e.tokens);case`blockquote`:return Sn(hn(e.tokens),`> `);case`code`:return(e.lang?C.dim(`${e.lang}\n`):``)+C.yellow(e.text);case`list`:return vn(e)?bn(e):e.raw;case`hr`:return C.dim(`-`.repeat(40));case`table`:return yn(e)?xn(e):e.raw;case`html`:return e.text;case`text`:return e.tokens?$(e.tokens):wn(e.text);default:return`tokens`in e&&e.tokens?$(e.tokens):e.raw}}function $(e=[]){return e.map(e=>_n(e)).join(``)}function _n(e){switch(e.type){case`text`:case`escape`:return wn(e.text);case`strong`:return C.bold($(e.tokens));case`em`:return C.italic($(e.tokens));case`codespan`:return C.yellow(e.text);case`del`:return C.strikethrough($(e.tokens));case`link`:{let t=$(e.tokens);return e.href&&e.href!==e.text?`${C.blue.underline(t)} ${C.dim(`(${e.href})`)}`:C.blue.underline(t)}case`image`:return e.text?`${e.text} (${e.href})`:e.href;case`br`:return`
|
|
20
|
+
`;case`html`:return e.text;default:return`tokens`in e&&e.tokens?$(e.tokens):e.raw}}function vn(e){return e.type===`list`&&`items`in e&&Array.isArray(e.items)}function yn(e){return e.type===`table`&&`header`in e&&`rows`in e}function bn(e){return e.items.map((t,n)=>{let r=e.ordered?`${Number(e.start||1)+n}. `:`- `,i=t.task?`[${t.checked?`x`:` `}] `:``,a=hn(t.tokens).trimEnd();return r+i+Cn(a,r.length+i.length)}).join(`
|
|
21
|
+
`)}function xn(e){let t=e.header.map(e=>$(e.tokens)).join(` | `),n=e.rows.map(e=>e.map(e=>$(e.tokens)).join(` | `));return[C.bold(t),...n].join(`
|
|
22
|
+
`)}function Sn(e,t){return e.split(`
|
|
23
|
+
`).map(e=>t+e).join(`
|
|
24
|
+
`)}function Cn(e,t){let[n=``,...r]=e.split(`
|
|
25
|
+
`);if(r.length===0)return n;let i=` `.repeat(t);return[n,...r.map(e=>i+e)].join(`
|
|
26
|
+
`)}function wn(e){return e.replace(/"/g,`"`).replace(/'/g,`'`).replace(/</g,`<`).replace(/>/g,`>`).replace(/&/g,`&`)}var Tn=class{provider;model;enableTools;lastStore;lastName;lastScope;constructor(e){this.provider=e.provider,this.model=e.model,this.enableTools=e.enableTools??!1}async recall(e){let t=e.tracer?.startSpan(`memory.recall`,{type:`internal`});this.lastStore=e.store,this.lastName=e.name,this.lastScope=e.scope;let n=await this.loadStore(e.store,e.name,e.scope);if(n.instructions.length===0)return t?.info(`no stored instructions`),t?.end(),{};t?.info(`loaded instructions`,{count:n.instructions.length});let r=n.instructions.map((e,t)=>`${t+1}. ${e}`).join(`
|
|
27
|
+
`);return t?.end(),{systemSuffix:`## Learned Instructions\n\n${r}`}}async record(e){if(!e.newMessages||e.newMessages.length===0)return;let t=e.tracer?.startSpan(`memory.record`,{type:`internal`}),n=this.formatMessages(e.newMessages);if(!n.trim()){t?.info(`no text content to extract from`),t?.end();return}let r=t?.startSpan(`memory.extract`,{type:`llm`}),i=await Et({provider:this.provider,model:this.model,messages:[{role:`user`,content:n}],system:`You are a memory extraction system. Your job is to extract learnings from a conversation that should be remembered for future runs.
|
|
28
|
+
|
|
29
|
+
Only extract:
|
|
30
|
+
- Explicit user corrections (e.g., "No, always use bullet points")
|
|
31
|
+
- Stated preferences (e.g., "I prefer concise summaries")
|
|
32
|
+
- Patterns that clearly emerged from user feedback
|
|
33
|
+
|
|
34
|
+
Do NOT extract:
|
|
35
|
+
- General knowledge or facts from the conversation content
|
|
36
|
+
- Inferences or speculation about what the user might want
|
|
37
|
+
- Task-specific details that won't apply to future runs
|
|
38
|
+
|
|
39
|
+
Respond with a JSON array of instruction strings. Each instruction should be a clear, actionable directive.
|
|
40
|
+
If there are no learnings to extract, respond with an empty array: []
|
|
41
|
+
|
|
42
|
+
Example response:
|
|
43
|
+
["Always use bullet points for lists", "Keep summaries under 3 sentences"]`,tracer:r});if(i.result!==`success`||!i.final){t?.warn(`extraction failed`,{result:i.result}),t?.end();return}let a=M(i.final.content);if(!a){t?.end();return}let o=this.parseInstructions(a);if(o.length===0){t?.info(`no instructions extracted`),t?.end();return}let s=await this.loadStore(e.store,e.name,e.scope);s.instructions.push(...o),await this.saveStore(e.store,e.name,e.scope,s),t?.info(`saved instructions`,{count:o.length}),t?.end()}tools(){if(!this.enableTools)return[];let e=this;return[{name:`add_instruction`,description:`Save a learned instruction for future runs. Use this when the user explicitly asks you to remember something.`,schema:r.object({instruction:r.string().describe(`The instruction to remember`)}),async execute(t){if(!e.lastStore)return`Error: memory not initialized (no recall has been called yet)`;let n=await e.loadStore(e.lastStore,e.lastName,e.lastScope);return n.instructions.push(t.instruction),await e.saveStore(e.lastStore,e.lastName,e.lastScope,n),`Instruction saved: "${t.instruction}"`}}]}formatMessages(e){let t=[];for(let n of e)if(n.role===`user`){let e=typeof n.content==`string`?n.content:M(n.content);e&&t.push(`User: ${e}`)}else if(n.role===`assistant`){let e=M(n.content);e&&t.push(`Assistant: ${e}`)}return t.join(`
|
|
44
|
+
|
|
45
|
+
`)}parseInstructions(e){let t=e.trim(),n=t.match(/^```(?:json)?\s*\n?([\s\S]*?)\n?\s*```$/);n&&(t=n[1].trim());try{let e=JSON.parse(t);if(Array.isArray(e)&&e.every(e=>typeof e==`string`))return e}catch{}return[]}getStorePath(e,t){let n=e??`default`,r=n;if(t&&Object.keys(t).length>0){let e=Object.entries(t).sort(([e],[t])=>e.localeCompare(t)).map(([e,t])=>`${e}=${t}`).join(`&`);r=`${n}-${T.createHash(`sha256`).update(e).digest(`hex`).slice(0,8)}`}return`memory/procedural/${r}.json`}async loadStore(e,t,n){let r=this.getStorePath(t,n),i=await e.read(r);if(i)try{let e=JSON.parse(i);if(e&&Array.isArray(e.instructions))return{instructions:e.instructions}}catch{}return{instructions:[]}}async saveStore(e,t,n,r){if(!r)return;let i=this.getStorePath(t,n);await e.write(i,JSON.stringify(r,null,2))}};export{k as A,oe as C,z as D,te as E,E as M,F as O,ue as S,ie as T,we as _,en as a,fe as b,Zt as c,Ut as d,Et as f,He as g,st as h,cn as i,O as j,A as k,Kt as l,wt as m,pn as n,$t as o,Tt as p,un as r,Qt as s,Tn as t,Gt as u,ye as v,ae as w,de as x,he as y};
|
package/dist/cli.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import{_ as e,a as t,b as n,c as r,d as i,g as a,h as o,i as s,l as c,m as l,n as u,o as d,r as f,s as p,t as m,u as h,v as g,y as _}from"./ProceduralMemory-
|
|
3
|
-
`)}async function F(e,t){let n=[];for(let r of e){let e=new s(r);await e.connect({tracer:t}),n.push(e)}return n}async function I(e,t){for(let n of e)try{await n.close({tracer:t})}catch{}}const L=`.axle/batch.jsonl`;function R(e,t){let n=D(`sha256`);return n.update(e),n.update(`\0`),n.update(t),n.digest(`hex`)}async function ge(e=L){let t=new Map,n;try{n=await
|
|
4
|
-
`)){let n=e.trim();if(n)try{let e=JSON.parse(n);e.file&&e.hash&&t.set(e.file,e)}catch{}}return t}async function _e(e,t=L){await
|
|
5
|
-
`,`utf-8`)}async function ve(t,r,i,a,o,s,c,l,u,d,f){let p=new _(t.task);if(t.files)for(let n of t.files)p.addFile(await e(n));let m=d.startSpan(`job`,{type:`workflow`}),h=new n({provider:r,model:i,tools:a,providerTools:o,mcps:s,tracer:m,name:t.name,memory:f});try{let e=await h.send(p.withInputs(c)).final;if(u.in+=e.usage.in,u.out+=e.usage.out,e.response){let t=typeof e.response==`string`?e.response:JSON.stringify(e.response,null,2);d.info(t,{markdown:!0})}l.interactive&&await ye(h,u,d),m.end()}catch(e){let t=e instanceof Error?e.message:String(e);throw m.error(t),m.end(`error`),e}}async function ye(e,t,n){let r=
|
|
6
|
-
> `);if(r===null||r.trim()===``)break;try{let i=await e.send(r.trim()).final;if(t.in+=i.usage.in,t.out+=i.usage.out,i.response){let e=typeof i.response==`string`?i.response:JSON.stringify(i.response,null,2);n.info(e,{markdown:!0})}}catch(e){let t=e instanceof Error?e.message:String(e);n.error(t)}}}finally{r.close()}}async function be(t,r,i,a,o,s,c,l,u,d,f){let p=t.batch,m=await
|
|
2
|
+
import{_ as e,a as t,b as n,c as r,d as i,g as a,h as o,i as s,l as c,m as l,n as u,o as d,r as f,s as p,t as m,u as h,v as g,y as _}from"./ProceduralMemory-CbRTVa9Q.js";import{i as v,s as y,t as b}from"./models-DlE4tfcj.js";import{z as x}from"zod";import{appendFile as S,mkdir as C,readFile as w}from"node:fs/promises";import{basename as T,dirname as ee,extname as te}from"node:path";import{glob as E}from"glob";import{createHash as D}from"node:crypto";import{Command as ne}from"@commander-js/extra-typings";import O from"yaml";import{createInterface as re}from"node:readline";var ie=`0.16.0`;x.object({value:x.string()});const ae=x.object({"api-key":x.string(),rateLimit:x.number().optional()});x.object({timeout:x.number().optional(),maxBuffer:x.number().optional(),cwd:x.string().optional()});const oe=x.object({type:x.literal(`chatcompletions`)}).loose(),se=x.object({type:x.literal(`anthropic`)}).loose(),ce=x.object({type:x.literal(`openai`)}).loose(),le=x.object({type:x.literal(`gemini`)}).loose(),ue=x.discriminatedUnion(`type`,[oe,se,ce,le]),de=x.object({chatcompletions:x.custom().optional(),anthropic:x.custom().optional(),openai:x.custom().optional(),gemini:x.custom().optional(),brave:ae.optional()}).loose(),fe=x.object({transport:x.literal(`stdio`),name:x.string().optional(),command:x.string(),args:x.array(x.string()).optional(),env:x.record(x.string(),x.string()).optional()}),pe=x.object({transport:x.literal(`http`),name:x.string().optional(),url:x.string(),headers:x.record(x.string(),x.string()).optional()}),me=x.discriminatedUnion(`transport`,[fe,pe]),he=x.object({files:x.string(),resume:x.boolean().default(!1),concurrency:x.number().int().positive().default(3)}),k=x.object({name:x.string().optional(),provider:ue,task:x.string(),tools:x.array(x.string()).optional(),provider_tools:x.array(x.string()).optional(),files:x.array(x.string()).optional(),mcps:x.array(me).optional(),batch:he.optional()}),A=[`yaml`,`yml`,`json`];async function j(e,t){let{tracer:n}=t,{content:r,format:i,path:a}=await g(e,{defaults:{name:`axle.job`,formats:A},tag:`Job File`}),o=null;if(i===`json`)o=JSON.parse(r);else if(i===`yaml`||i===`yml`)o=O.parse(r);else throw Error(`Invalid job file format`);n?.debug(`Job config: `+JSON.stringify(o,null,2));let s=k.safeParse(o);if(!s.success)throw Error(`The job file is not valid:\n${P(s.error)}`);return s.data.name||(s.data.name=T(a,te(a))),s.data}const M=[`yaml`,`yml`,`json`];async function N(e,t){let{tracer:n}=t,{content:r,format:i}=await g(e,{defaults:{name:`axle.config`,formats:M},tag:`Config File`}),a=null;if(i===`json`)a=JSON.parse(r);else if(i===`yaml`||i===`yml`)a=O.parse(r);else throw Error(`Invalid config file format`);n?.debug(`Service config: `+JSON.stringify(a,null,2));let o=de.safeParse(a);if(!o.success)throw Error(`The config file is not valid:\n${P(o.error)}`);return o.data}function P(e){return e.issues.map(e=>` - ${e.path.join(`.`)||`root`}: ${e.message}`).join(`
|
|
3
|
+
`)}async function F(e,t){let n=[];for(let r of e){let e=new s(r);await e.connect({tracer:t}),n.push(e)}return n}async function I(e,t){for(let n of e)try{await n.close({tracer:t})}catch{}}const L=`.axle/batch.jsonl`;function R(e,t){let n=D(`sha256`);return n.update(e),n.update(`\0`),n.update(t),n.digest(`hex`)}async function ge(e=L){let t=new Map,n;try{n=await w(e,`utf-8`)}catch{return t}for(let e of n.split(`
|
|
4
|
+
`)){let n=e.trim();if(n)try{let e=JSON.parse(n);e.file&&e.hash&&t.set(e.file,e)}catch{}}return t}async function _e(e,t=L){await C(ee(t),{recursive:!0}),await S(t,JSON.stringify(e)+`
|
|
5
|
+
`,`utf-8`)}async function ve(t,r,i,a,o,s,c,l,u,d,f){let p=new _(t.task);if(t.files)for(let n of t.files)p.addFile(await e(n));let m=d.startSpan(`job`,{type:`workflow`}),h=new n({provider:r,model:i,tools:a,providerTools:o,mcps:s,tracer:m,name:t.name,memory:f});try{let e=await h.send(p.withInputs(c)).final;if(u.in+=e.usage.in,u.out+=e.usage.out,e.response){let t=typeof e.response==`string`?e.response:JSON.stringify(e.response,null,2);d.info(t,{markdown:!0})}l.interactive&&await ye(h,u,d),m.end()}catch(e){let t=e instanceof Error?e.message:String(e);throw m.error(t),m.end(`error`),e}}async function ye(e,t,n){let r=re({input:process.stdin,output:process.stdout});r.on(`SIGINT`,()=>{r.close()});let i=e=>new Promise(t=>{r.question(e,t),r.once(`close`,()=>t(null))});try{for(;;){let r=await i(`
|
|
6
|
+
> `);if(r===null||r.trim()===``)break;try{let i=await e.send(r.trim()).final;if(t.in+=i.usage.in,t.out+=i.usage.out,i.response){let e=typeof i.response==`string`?i.response:JSON.stringify(i.response,null,2);n.info(e,{markdown:!0})}}catch(e){let t=e instanceof Error?e.message:String(e);n.error(t)}}}finally{r.close()}}async function be(t,r,i,a,o,s,c,l,u,d,f){let p=t.batch,m=await E(p.files);if(m.length===0){d.warn(`No files matched pattern: ${p.files}`);return}d.info(`Batch: ${m.length} file(s) matched "${p.files}"`);let h=p.resume?await ge():new Map,g=t.files?await Promise.all(t.files.map(t=>e(t))):[],v=0,y=0,b=0;await xe(p.concurrency??3,m,async l=>{let m=d.startSpan(`batch:${l}`,{type:`workflow`});try{let d=await w(l),b=R(t.task,d),x=h.get(l);if(p.resume&&x&&x.hash===b){m.info(`Skipped (already completed)`),m.end(),y++;return}let S=new _(t.task);for(let e of g)S.addFile(e);S.addFile(await e(l));let C={...c,file:l},T=await new n({provider:r,model:i,tools:a,providerTools:o,mcps:s,tracer:m,name:t.name,memory:f}).send(S.withInputs(C)).final;u.in+=T.usage.in,u.out+=T.usage.out,await _e({file:l,hash:b,timestamp:Date.now()}),m.end(),v++}catch(e){let t=e instanceof Error?e.message:String(e);m.error(`Failed: ${t}`),m.end(`error`),b++}}),d.info(`Batch complete: ${v} completed, ${y} skipped, ${b} failed`)}async function xe(e,t,n){let r=0;async function i(){for(;r<t.length;)await n(t[r++])}let a=Array.from({length:Math.min(e,t.length)},()=>i());await Promise.all(a)}function Se(e,n){switch(e){case`brave`:{let e=n?.brave;return e&&h.configure(e),h}case`calculator`:return c;case`exec`:{let e=n?.exec;return e&&r.configure(e),r}case`patch-file`:return p;case`read-file`:return d;case`write-file`:return t;default:throw Error(`Unknown tool: ${e}`)}}function Ce(e,t){return e.map(e=>Se(e,t))}const z=new ne().name(`axle`).description(`Axle is a CLI tool for running AI workflows`).version(ie).option(`-c, --config <path>`,`Path to the config file`).option(`-j, --job <path>`,`Path to the job file`).option(`--no-log`,`Do not write the output to a log file`).option(`-d, --debug`,`Print additional debug information`).option(`-i, --interactive`,`Continue the conversation interactively after the initial task`).option(`--args <args...>`,`Additional arguments in the form key=value`);z.parse(process.argv);const B=z.opts(),V={date:new Date().toISOString().split(`T`)[0],datetime:new Date().toISOString(),cwd:process.cwd()};B.args&&B.args.forEach(e=>{let[t,n]=e.split(`=`);t&&n&&(V[t.trim()]=n.trim())});const H=new f;B.debug&&(H.minLevel=`debug`);const U=new u({minLevel:B.debug?`debug`:`info`,showInternal:B.debug,showTimestamp:!0,markdown:!0});if(H.addWriter(U),B.log){let e=new u({minLevel:`debug`,showInternal:!0,showTimestamp:!0,output:e=>{}});H.addWriter(e)}const W=H.startSpan(`cli`,{type:`root`});process.on(`uncaughtException`,async e=>{console.error(`Uncaught exception:`),console.error(e),W.error(`Uncaught exception:`),W.error(e.message),W.error(e.stack||``),W.end(`error`),await H.flush(),process.exit(1)}),B.debug&&(W.debug(`Options: `+JSON.stringify(B,null,2)),W.debug(`Additional Arguments: `+JSON.stringify(V,null,2)));let G,K;try{G=await N(B.config??null,{tracer:W}),K=await j(B.job??null,{tracer:W})}catch(e){let t=e instanceof Error?e:Error(String(e));W.error(t.message),W.debug(t.stack??``),W.end(`error`),await H.flush(),z.outputHelp(),process.exit(1)}let q,J;try{let{type:e,...t}=K.provider;switch(e){case`openai`:{let e={...G.openai,...t},n=e[`api-key`];if(!n)throw Error(`The provider openai is not configured. Please check your configuration.`);let r={"api-key":n,model:e.model};q=i(r[`api-key`]),J=r.model||b;break}case`anthropic`:{let e={...G.anthropic,...t},n=e[`api-key`];if(!n)throw Error(`The provider anthropic is not configured. Please check your configuration.`);let r={"api-key":n,model:e.model};q=a(r[`api-key`]),J=r.model||y;break}case`gemini`:{let e={...G.gemini,...t},n=e[`api-key`];if(!n)throw Error(`The provider gemini is not configured. Please check your configuration.`);let r={"api-key":n,model:e.model};q=l(r[`api-key`]),J=r.model||v;break}case`chatcompletions`:{let e={...G.chatcompletions,...t},n=e[`base-url`],r=e.model;if(!n||!r)throw Error(`The provider chatcompletions is not configured. Please check your configuration.`);let i={"base-url":n,model:r,"api-key":e[`api-key`]};q=o(i[`base-url`],i[`api-key`]),J=i.model;break}}}catch(e){let t=e instanceof Error?e:Error(String(e));W.error(t.message),W.error(t.stack??``),W.end(`error`),await H.flush(),z.outputHelp(),process.exit(1)}W.info(`All systems operational. Running job...`);const Y=new m({provider:q,model:J}),X=(K.provider_tools??[]).map(e=>({type:`provider`,name:e})),Z=K.tools?.length?Ce(K.tools):[];let Q=[];if(K.mcps?.length)try{Q=await F(K.mcps,W)}catch(e){let t=e instanceof Error?e:Error(String(e));W.error(`Failed to connect MCP servers: `+t.message),W.end(`error`),await H.flush(),process.exit(1)}const $={in:0,out:0},we=performance.now();try{K.batch?await be(K,q,J,Z,X,Q,V,B,$,W,Y):await ve(K,q,J,Z,X,Q,V,B,$,W,Y)}catch(e){let t=e instanceof Error?e:Error(String(e));W.error(t.message),W.debug(t.stack??``)}finally{Q.length>0&&await I(Q,W)}const Te=performance.now()-we;W.info(`Total run time: ${Math.round(Te)}ms`),W.info(`Input tokens: ${$.in}`),W.info(`Output tokens: ${$.out}`),W.info(`Complete. Goodbye`),W.end(),await H.flush();export{};
|
package/dist/index.d.ts
CHANGED
|
@@ -513,14 +513,17 @@ declare class MCP {
|
|
|
513
513
|
get connected(): boolean;
|
|
514
514
|
connect(options?: {
|
|
515
515
|
tracer?: TracingContext;
|
|
516
|
+
signal?: AbortSignal;
|
|
516
517
|
}): Promise<void>;
|
|
517
518
|
listTools(options?: {
|
|
518
519
|
prefix?: string;
|
|
519
520
|
tracer?: TracingContext;
|
|
521
|
+
signal?: AbortSignal;
|
|
520
522
|
}): Promise<ExecutableTool[]>;
|
|
521
523
|
listToolDefinitions(options?: {
|
|
522
524
|
prefix?: string;
|
|
523
525
|
tracer?: TracingContext;
|
|
526
|
+
signal?: AbortSignal;
|
|
524
527
|
}): Promise<ToolDefinition[]>;
|
|
525
528
|
refreshTools(): Promise<ExecutableTool[]>;
|
|
526
529
|
close(options?: {
|
|
@@ -833,6 +836,9 @@ declare class Agent {
|
|
|
833
836
|
private run;
|
|
834
837
|
}
|
|
835
838
|
//#endregion
|
|
839
|
+
//#region src/core/userTurn.d.ts
|
|
840
|
+
type InstructResponse<TSchema extends OutputSchema | undefined> = TSchema extends OutputSchema ? ParsedSchema<TSchema> : string;
|
|
841
|
+
//#endregion
|
|
836
842
|
//#region src/errors/AxleError.d.ts
|
|
837
843
|
declare class AxleError extends Error {
|
|
838
844
|
readonly code: string;
|
|
@@ -842,7 +848,7 @@ declare class AxleError extends Error {
|
|
|
842
848
|
code?: string;
|
|
843
849
|
id?: string;
|
|
844
850
|
details?: Record<string, any>;
|
|
845
|
-
cause?:
|
|
851
|
+
cause?: unknown;
|
|
846
852
|
});
|
|
847
853
|
toJSON(): {
|
|
848
854
|
cause?: unknown;
|
|
@@ -905,6 +911,33 @@ declare class AxleAgentAbortError extends AxleAbortError {
|
|
|
905
911
|
};
|
|
906
912
|
}
|
|
907
913
|
//#endregion
|
|
914
|
+
//#region src/errors/AxleToolFatalError.d.ts
|
|
915
|
+
declare class AxleToolFatalError extends AxleError {
|
|
916
|
+
readonly toolName?: string;
|
|
917
|
+
readonly messages?: AxleMessage[];
|
|
918
|
+
readonly partial?: AxleAssistantMessage;
|
|
919
|
+
readonly usage?: Stats;
|
|
920
|
+
constructor(message?: string, options?: {
|
|
921
|
+
toolName?: string;
|
|
922
|
+
messages?: AxleMessage[];
|
|
923
|
+
partial?: AxleAssistantMessage;
|
|
924
|
+
usage?: Stats;
|
|
925
|
+
cause?: unknown;
|
|
926
|
+
});
|
|
927
|
+
toJSON(): {
|
|
928
|
+
usage?: Stats | undefined;
|
|
929
|
+
partial?: AxleAssistantMessage | undefined;
|
|
930
|
+
messages?: AxleMessage[] | undefined;
|
|
931
|
+
toolName?: string | undefined;
|
|
932
|
+
cause?: unknown;
|
|
933
|
+
details?: Record<string, any> | undefined;
|
|
934
|
+
id?: string | undefined;
|
|
935
|
+
name: string;
|
|
936
|
+
message: string;
|
|
937
|
+
code: string;
|
|
938
|
+
};
|
|
939
|
+
}
|
|
940
|
+
//#endregion
|
|
908
941
|
//#region src/errors/TaskError.d.ts
|
|
909
942
|
declare class TaskError extends AxleError {
|
|
910
943
|
constructor(message: string, options?: {
|
|
@@ -973,6 +1006,21 @@ declare const Gemini: {
|
|
|
973
1006
|
readonly DefaultModel: "gemini-3.1-flash-lite-preview";
|
|
974
1007
|
};
|
|
975
1008
|
//#endregion
|
|
1009
|
+
//#region src/providers/generateTurn.d.ts
|
|
1010
|
+
interface GenerateTurnProps {
|
|
1011
|
+
provider: AIProvider;
|
|
1012
|
+
model: string;
|
|
1013
|
+
messages: Array<AxleMessage>;
|
|
1014
|
+
system?: string;
|
|
1015
|
+
tools?: Array<ToolDefinition>;
|
|
1016
|
+
tracer?: TracingContext;
|
|
1017
|
+
fileResolver?: FileResolver;
|
|
1018
|
+
options?: GenerateTurnOptions;
|
|
1019
|
+
reasoning?: boolean;
|
|
1020
|
+
signal?: AbortSignal;
|
|
1021
|
+
}
|
|
1022
|
+
declare function generateTurn(props: GenerateTurnProps): Promise<ModelResult>;
|
|
1023
|
+
//#endregion
|
|
976
1024
|
//#region src/providers/helpers.d.ts
|
|
977
1025
|
type ToolCallResult = {
|
|
978
1026
|
type: "success";
|
|
@@ -1010,21 +1058,6 @@ type GenerateResult = {
|
|
|
1010
1058
|
};
|
|
1011
1059
|
type StreamResult = GenerateResult;
|
|
1012
1060
|
//#endregion
|
|
1013
|
-
//#region src/providers/generateTurn.d.ts
|
|
1014
|
-
interface GenerateTurnProps {
|
|
1015
|
-
provider: AIProvider;
|
|
1016
|
-
model: string;
|
|
1017
|
-
messages: Array<AxleMessage>;
|
|
1018
|
-
system?: string;
|
|
1019
|
-
tools?: Array<ToolDefinition>;
|
|
1020
|
-
tracer?: TracingContext;
|
|
1021
|
-
fileResolver?: FileResolver;
|
|
1022
|
-
options?: GenerateTurnOptions;
|
|
1023
|
-
reasoning?: boolean;
|
|
1024
|
-
signal?: AbortSignal;
|
|
1025
|
-
}
|
|
1026
|
-
declare function generateTurn(props: GenerateTurnProps): Promise<ModelResult>;
|
|
1027
|
-
//#endregion
|
|
1028
1061
|
//#region src/providers/generate.d.ts
|
|
1029
1062
|
interface GenerateOptions {
|
|
1030
1063
|
provider: AIProvider;
|
|
@@ -1042,6 +1075,19 @@ interface GenerateOptions {
|
|
|
1042
1075
|
reasoning?: boolean;
|
|
1043
1076
|
signal?: AbortSignal;
|
|
1044
1077
|
}
|
|
1078
|
+
interface GenerateInstructOptions<TSchema extends OutputSchema | undefined> extends Omit<GenerateOptions, "messages"> {
|
|
1079
|
+
messages?: Array<AxleMessage>;
|
|
1080
|
+
instruct: Instruct<TSchema>;
|
|
1081
|
+
}
|
|
1082
|
+
type GenerateInstructResult<TSchema extends OutputSchema | undefined> = (Extract<GenerateResult, {
|
|
1083
|
+
result: "success";
|
|
1084
|
+
}> & {
|
|
1085
|
+
response: InstructResponse<TSchema> | null;
|
|
1086
|
+
parseError?: unknown;
|
|
1087
|
+
}) | Extract<GenerateResult, {
|
|
1088
|
+
result: "error";
|
|
1089
|
+
}>;
|
|
1090
|
+
declare function generate<TSchema extends OutputSchema | undefined>(options: GenerateInstructOptions<TSchema>): Promise<GenerateInstructResult<TSchema>>;
|
|
1045
1091
|
declare function generate(options: GenerateOptions): Promise<GenerateResult>;
|
|
1046
1092
|
//#endregion
|
|
1047
1093
|
//#region src/providers/stream.d.ts
|
|
@@ -1150,6 +1196,22 @@ interface StreamHandle {
|
|
|
1150
1196
|
cancel(reason?: unknown): void;
|
|
1151
1197
|
readonly final: Promise<StreamResult>;
|
|
1152
1198
|
}
|
|
1199
|
+
interface StreamInstructOptions<TSchema extends OutputSchema | undefined> extends Omit<StreamOptions, "messages"> {
|
|
1200
|
+
messages?: Array<AxleMessage>;
|
|
1201
|
+
instruct: Instruct<TSchema>;
|
|
1202
|
+
}
|
|
1203
|
+
type StreamInstructResult<TSchema extends OutputSchema | undefined> = (Extract<StreamResult, {
|
|
1204
|
+
result: "success";
|
|
1205
|
+
}> & {
|
|
1206
|
+
response: InstructResponse<TSchema> | null;
|
|
1207
|
+
parseError?: unknown;
|
|
1208
|
+
}) | Extract<StreamResult, {
|
|
1209
|
+
result: "error";
|
|
1210
|
+
}>;
|
|
1211
|
+
interface StreamInstructHandle<TSchema extends OutputSchema | undefined> extends Omit<StreamHandle, "final"> {
|
|
1212
|
+
readonly final: Promise<StreamInstructResult<TSchema>>;
|
|
1213
|
+
}
|
|
1214
|
+
declare function stream<TSchema extends OutputSchema | undefined>(options: StreamInstructOptions<TSchema>): StreamInstructHandle<TSchema>;
|
|
1153
1215
|
declare function stream(options: StreamOptions): StreamHandle;
|
|
1154
1216
|
//#endregion
|
|
1155
1217
|
//#region src/providers/openai/provider.d.ts
|
|
@@ -1238,7 +1300,7 @@ declare class BraveSearchTool implements ExecutableTool<typeof braveSearchSchema
|
|
|
1238
1300
|
lastExecTime: number;
|
|
1239
1301
|
constructor(config?: BraveProviderConfig);
|
|
1240
1302
|
configure(config: BraveProviderConfig): void;
|
|
1241
|
-
execute(params: z$2.infer<typeof braveSearchSchema>,
|
|
1303
|
+
execute(params: z$2.infer<typeof braveSearchSchema>, ctx: ToolContext): Promise<string>;
|
|
1242
1304
|
}
|
|
1243
1305
|
declare const braveSearchTool: BraveSearchTool;
|
|
1244
1306
|
//#endregion
|
|
@@ -1426,4 +1488,4 @@ declare class LocalFileStore implements FileStore {
|
|
|
1426
1488
|
write(path: string, content: string): Promise<void>;
|
|
1427
1489
|
}
|
|
1428
1490
|
//#endregion
|
|
1429
|
-
export { type AIProvider, type ActionPart, type ActionResult, Agent, type AgentConfig, type AgentEvent, type AgentEventCallback, type AgentHandle, type AgentMemory, type AgentResult, Anthropic, AxleAbortError, AxleAgentAbortError, type AxleAssistantMessage, AxleError, type AxleMessage, AxleStopReason, type AxleToolCallMessage, type AxleToolCallResult, type AxleUserMessage, type ContentPart, type ContentPartFile, type ContentPartProviderTool, type ContentPartText, type ContentPartThinking, type ContentPartToolCall, type DeferredFileInfo, type EventLevel, type ExecutableTool, type FileInfo, type FileKind, type FilePart, type FileProviderId, type FileResolveFormat, type FileResolveRequest, type FileResolver, type FileStore, Gemini, type Handle, History, Instruct, type InstructInputs, LocalFileStore, MCP, type MCPConfig, type MCPHttpConfig, type MCPStdioConfig, type MemoryContext, OpenAI, ProceduralMemory, type ProceduralMemoryConfig, type ProviderTool, type ProviderToolAction, type RecallResult, type ResolvedFileSource, type SendMessageOptions, SimpleWriter, type SimpleWriterOptions, type SpanData, type SpanOptions, type SpanType, type StreamEvent, type StreamEventCallback, type StreamHandle, type StreamResult, type SubagentAction, TaskError, type TextPart, type ThinkingPart, type ToolAction, type ToolContext, type ToolDefinition, ToolRegistry, type ToolResultPart, type TraceWriter, Tracer, type TracingContext, type Turn, TurnBuilder, type TurnPart, type TurnStatus, anthropic, braveSearchTool, calculatorTool, chatCompletions, createHandle, execTool, gemini, generate, generateTurn, loadFileContent, openai, parseResponse, patchFileTool, readFileTool, stream, writeFileTool };
|
|
1491
|
+
export { type AIProvider, type ActionPart, type ActionResult, Agent, type AgentConfig, type AgentEvent, type AgentEventCallback, type AgentHandle, type AgentMemory, type AgentResult, Anthropic, AxleAbortError, AxleAgentAbortError, type AxleAssistantMessage, AxleError, type AxleMessage, AxleStopReason, type AxleToolCallMessage, type AxleToolCallResult, AxleToolFatalError, type AxleUserMessage, type ContentPart, type ContentPartFile, type ContentPartProviderTool, type ContentPartText, type ContentPartThinking, type ContentPartToolCall, type DeferredFileInfo, type EventLevel, type ExecutableTool, type FileInfo, type FileKind, type FilePart, type FileProviderId, type FileResolveFormat, type FileResolveRequest, type FileResolver, type FileStore, Gemini, type GenerateInstructOptions, type GenerateInstructResult, type Handle, History, Instruct, type InstructInputs, type InstructResponse, LocalFileStore, MCP, type MCPConfig, type MCPHttpConfig, type MCPStdioConfig, type MemoryContext, OpenAI, ProceduralMemory, type ProceduralMemoryConfig, type ProviderTool, type ProviderToolAction, type RecallResult, type ResolvedFileSource, type SendMessageOptions, SimpleWriter, type SimpleWriterOptions, type SpanData, type SpanOptions, type SpanType, type StreamEvent, type StreamEventCallback, type StreamHandle, type StreamInstructHandle, type StreamInstructOptions, type StreamInstructResult, type StreamResult, type SubagentAction, TaskError, type TextPart, type ThinkingPart, type ToolAction, type ToolContext, type ToolDefinition, ToolRegistry, type ToolResultPart, type TraceWriter, Tracer, type TracingContext, type Turn, TurnBuilder, type TurnPart, type TurnStatus, anthropic, braveSearchTool, calculatorTool, chatCompletions, createHandle, execTool, gemini, generate, generateTurn, loadFileContent, openai, parseResponse, patchFileTool, readFileTool, stream, writeFileTool };
|
package/dist/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{A as e,C as t,D as n,E as r,
|
|
1
|
+
import{A as e,C as t,D as n,E as r,M as i,O as a,S as o,T as s,_ as c,a as l,b as u,c as d,d as f,f as p,g as m,h,i as g,j as _,k as v,l as y,m as b,n as x,o as S,p as C,r as w,s as T,t as E,u as D,w as O,x as k,y as A}from"./ProceduralMemory-CbRTVa9Q.js";import{i as j,o as M,r as N,s as P,t as F,u as I}from"./models-DlE4tfcj.js";import"./models-CKz-RHh1.js";var L=class e extends i{constructor(t,n){super(t,{code:`TASK_ERROR`,id:n?.id,details:{taskType:n?.taskType,taskIndex:n?.taskIndex,...n?.details},cause:n?.cause}),Object.setPrototypeOf(this,e.prototype)}};const R={Models:I,DefaultModel:P},z={Models:M,DefaultModel:j},B={Models:N,DefaultModel:F};export{u as Agent,R as Anthropic,_ as AxleAbortError,e as AxleAgentAbortError,i as AxleError,r as AxleStopReason,v as AxleToolFatalError,z as Gemini,k as History,A as Instruct,O as LocalFileStore,g as MCP,B as OpenAI,E as ProceduralMemory,x as SimpleWriter,L as TaskError,n as ToolRegistry,w as Tracer,t as TurnBuilder,m as anthropic,D as braveSearchTool,y as calculatorTool,h as chatCompletions,o as createHandle,d as execTool,b as gemini,p as generate,C as generateTurn,c as loadFileContent,f as openai,a as parseResponse,T as patchFileTool,S as readFileTool,s as stream,l as writeFileTool};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
//#region src/providers/anthropic/models.d.ts
|
|
2
|
-
declare const Models$
|
|
2
|
+
declare const Models$3: {
|
|
3
3
|
readonly CLAUDE_OPUS_4_7: "claude-opus-4-7";
|
|
4
4
|
readonly CLAUDE_SONNET_4_6: "claude-sonnet-4-6";
|
|
5
5
|
readonly CLAUDE_OPUS_4_6: "claude-opus-4-6";
|
|
@@ -17,7 +17,19 @@ declare const Models$2: {
|
|
|
17
17
|
readonly CLAUDE_SONNET_4: "claude-sonnet-4-20250514";
|
|
18
18
|
};
|
|
19
19
|
declare const MULTIMODAL_MODELS$2: readonly ["claude-opus-4-7", "claude-sonnet-4-6", "claude-opus-4-6", "claude-opus-4-5-20251101", "claude-sonnet-4-5-20250929", "claude-haiku-4-5-20251001", "claude-opus-4-1-20250805", "claude-opus-4-20250514", "claude-sonnet-4-20250514"];
|
|
20
|
-
declare const DEFAULT_MODEL$
|
|
20
|
+
declare const DEFAULT_MODEL$3: "claude-haiku-4-5-20251001";
|
|
21
|
+
//#endregion
|
|
22
|
+
//#region src/providers/chatcompletions/models.d.ts
|
|
23
|
+
declare const Models$2: {
|
|
24
|
+
readonly QWEN_3_6_35B_A3B: "qwen/qwen3.6-35b-a3b";
|
|
25
|
+
readonly GEMMA_4_26B_A4B_IT: "google/gemma-4-26b-a4b-it";
|
|
26
|
+
readonly MINISTRAL_3_8B: "mistralai/ministral-8b-2512";
|
|
27
|
+
readonly MISTRAL_SMALL_4: "mistralai/mistral-small-2603";
|
|
28
|
+
readonly DEEPSEEK_V4_FLASH: "deepseek/deepseek-v4-flash";
|
|
29
|
+
readonly MINIMAX_M2: "minimax/minimax-m2";
|
|
30
|
+
};
|
|
31
|
+
declare const SMALL_OPEN_WEIGHT_MODELS: readonly ["qwen/qwen3.6-35b-a3b", "google/gemma-4-26b-a4b-it", "mistralai/ministral-8b-2512", "mistralai/mistral-small-2603", "deepseek/deepseek-v4-flash", "minimax/minimax-m2"];
|
|
32
|
+
declare const DEFAULT_MODEL$2: "qwen/qwen3.6-35b-a3b";
|
|
21
33
|
//#endregion
|
|
22
34
|
//#region src/providers/gemini/models.d.ts
|
|
23
35
|
declare const Models$1: {
|
|
@@ -98,4 +110,4 @@ declare const Models: {
|
|
|
98
110
|
declare const MULTIMODAL_MODELS: readonly ["gpt-5.5", "gpt-5.5-pro", "gpt-5.4", "gpt-5.4-pro", "gpt-5.4-mini", "gpt-5.4-nano", "gpt-5.3-chat-latest", "gpt-5.2", "gpt-5.2-chat-latest", "gpt-5.2-pro", "gpt-5.1", "gpt-5.1-chat-latest", "gpt-5", "gpt-5-chat-latest", "gpt-5-pro", "gpt-5-mini", "gpt-5-nano", "gpt-4.1", "gpt-4.1-mini", "gpt-4.1-nano", "gpt-4o", "gpt-4o-mini", "o4-mini", "o3", "o3-pro", "o3-mini"];
|
|
99
111
|
declare const DEFAULT_MODEL: "gpt-5.4-mini";
|
|
100
112
|
//#endregion
|
|
101
|
-
export { MULTIMODAL_MODELS$1 as a,
|
|
113
|
+
export { MULTIMODAL_MODELS$1 as a, Models$2 as c, MULTIMODAL_MODELS$2 as d, Models$3 as f, DEFAULT_MODEL$1 as i, SMALL_OPEN_WEIGHT_MODELS as l, MULTIMODAL_MODELS as n, Models$1 as o, Models as r, DEFAULT_MODEL$2 as s, DEFAULT_MODEL as t, DEFAULT_MODEL$3 as u };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const e={QWEN_3_6_35B_A3B:`qwen/qwen3.6-35b-a3b`,GEMMA_4_26B_A4B_IT:`google/gemma-4-26b-a4b-it`,MINISTRAL_3_8B:`mistralai/ministral-8b-2512`,MISTRAL_SMALL_4:`mistralai/mistral-small-2603`,DEEPSEEK_V4_FLASH:`deepseek/deepseek-v4-flash`,MINIMAX_M2:`minimax/minimax-m2`},t=[e.QWEN_3_6_35B_A3B,e.GEMMA_4_26B_A4B_IT,e.MINISTRAL_3_8B,e.MISTRAL_SMALL_4,e.DEEPSEEK_V4_FLASH,e.MINIMAX_M2],n=e.QWEN_3_6_35B_A3B;export{e as n,t as r,n as t};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { a as MULTIMODAL_MODELS$1, c as MULTIMODAL_MODELS, i as DEFAULT_MODEL$
|
|
2
|
-
export { DEFAULT_MODEL as ANTHROPIC_DEFAULT_MODEL, MULTIMODAL_MODELS as ANTHROPIC_MULTIMODAL_MODELS, Models as AnthropicModels, DEFAULT_MODEL$1 as GEMINI_DEFAULT_MODEL, MULTIMODAL_MODELS$1 as GEMINI_MULTIMODAL_MODELS, Models$
|
|
1
|
+
import { a as MULTIMODAL_MODELS$1, c as Models$1, d as MULTIMODAL_MODELS, f as Models, i as DEFAULT_MODEL$2, l as SMALL_OPEN_WEIGHT_MODELS, n as MULTIMODAL_MODELS$2, o as Models$2, r as Models$3, s as DEFAULT_MODEL$1, t as DEFAULT_MODEL$3, u as DEFAULT_MODEL } from "../models-CI5k-LHn.js";
|
|
2
|
+
export { DEFAULT_MODEL as ANTHROPIC_DEFAULT_MODEL, MULTIMODAL_MODELS as ANTHROPIC_MULTIMODAL_MODELS, Models as AnthropicModels, DEFAULT_MODEL$1 as CHAT_COMPLETIONS_DEFAULT_MODEL, SMALL_OPEN_WEIGHT_MODELS as CHAT_COMPLETIONS_SMALL_OPEN_WEIGHT_MODELS, Models$1 as ChatCompletionsModels, DEFAULT_MODEL$2 as GEMINI_DEFAULT_MODEL, MULTIMODAL_MODELS$1 as GEMINI_MULTIMODAL_MODELS, Models$2 as GeminiModels, DEFAULT_MODEL$3 as OPENAI_DEFAULT_MODEL, MULTIMODAL_MODELS$2 as OPENAI_MULTIMODAL_MODELS, Models$3 as OpenAIModels };
|
package/dist/providers/models.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{a as e,i as t,l as n,n as r,o as i,r as a,s as o,t as s,u as c}from"../models-DlE4tfcj.js";export{o as ANTHROPIC_DEFAULT_MODEL,n as ANTHROPIC_MULTIMODAL_MODELS,c as AnthropicModels,t as GEMINI_DEFAULT_MODEL,e as GEMINI_MULTIMODAL_MODELS,i as GeminiModels,s as OPENAI_DEFAULT_MODEL,r as OPENAI_MULTIMODAL_MODELS,a as OpenAIModels};
|
|
1
|
+
import{a as e,i as t,l as n,n as r,o as i,r as a,s as o,t as s,u as c}from"../models-DlE4tfcj.js";import{n as l,r as u,t as d}from"../models-CKz-RHh1.js";export{o as ANTHROPIC_DEFAULT_MODEL,n as ANTHROPIC_MULTIMODAL_MODELS,c as AnthropicModels,d as CHAT_COMPLETIONS_DEFAULT_MODEL,u as CHAT_COMPLETIONS_SMALL_OPEN_WEIGHT_MODELS,l as ChatCompletionsModels,t as GEMINI_DEFAULT_MODEL,e as GEMINI_MULTIMODAL_MODELS,i as GeminiModels,s as OPENAI_DEFAULT_MODEL,r as OPENAI_MULTIMODAL_MODELS,a as OpenAIModels};
|
package/package.json
CHANGED
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
import{c as e}from"./models-DlE4tfcj.js";import t,{access as n,mkdir as r,readFile as i,stat as a,writeFile as o}from"node:fs/promises";import s,{dirname as c,extname as l,resolve as u}from"node:path";import*as d from"zod";import f,{z as p}from"zod";import m from"@anthropic-ai/sdk";import"glob";import h from"mime";import{FinishReason as g,GoogleGenAI as _}from"@google/genai";import v from"openai";import{spawn as y}from"node:child_process";import{Client as b}from"@modelcontextprotocol/sdk/client/index.js";import{StdioClientTransport as x}from"@modelcontextprotocol/sdk/client/stdio.js";import{StreamableHTTPClientTransport as S}from"@modelcontextprotocol/sdk/client/streamableHttp.js";import C from"chalk";import{marked as w}from"marked";import T from"node:crypto";var E=class e extends Error{code;id;details;constructor(t,n){super(t,{cause:n?.cause}),this.name=this.constructor.name,this.code=n?.code||`AXLE_ERROR`,this.id=n?.id,this.details=n?.details,Object.setPrototypeOf(this,e.prototype)}toJSON(){return{name:this.name,message:this.message,code:this.code,...this.id?{id:this.id}:{},...this.details?{details:this.details}:{},...this.cause?{cause:D(this.cause)}:{}}}};function D(e){return e instanceof Error?{name:e.name,message:e.message,...e.stack?{stack:e.stack}:{},...`cause`in e&&e.cause?{cause:D(e.cause)}:{}}:e}var O=class e extends E{reason;messages;partial;usage;constructor(t=`Operation aborted`,n){super(t,{code:`ABORTED`,details:{reason:n?.reason,usage:n?.usage}}),this.name=`AbortError`,this.reason=n?.reason,this.messages=n?.messages,this.partial=n?.partial,this.usage=n?.usage,Object.setPrototypeOf(this,e.prototype)}toJSON(){return{...super.toJSON(),reason:this.reason,...this.messages?{messages:this.messages}:{},...this.partial?{partial:this.partial}:{},...this.usage?{usage:this.usage}:{}}}},k=class e extends O{turn;constructor(t=`Agent send aborted`,n){super(t,n),this.turn=n?.turn,Object.setPrototypeOf(this,e.prototype)}toJSON(){return{...super.toJSON(),...this.turn?{turn:this.turn}:{}}}};function A(e){let{text:t,files:n}=e,r=[];if(t&&r.push({type:`text`,text:t}),n)for(let e of n)r.push({type:`file`,file:e});return r}function j(e){return e.filter(e=>e.type===`text`).map(e=>e.text).join(`
|
|
2
|
-
|
|
3
|
-
`)}function M(e){return e.filter(e=>e.type===`tool-call`)}var N=class{executableTools=new Map;providerTools=new Map;constructor(e){e?.tools&&this.add(e.tools),e?.providerTools&&this.addProvider(e.providerTools)}add(e){let t=Array.isArray(e)?e:[e];for(let e of t){if(this.has(e.name))throw new E(`Tool already registered: ${e.name}`,{code:`TOOL_REGISTRY_DUPLICATE`,details:{name:e.name}});this.executableTools.set(e.name,e)}}addProvider(e){let t=Array.isArray(e)?e:[e];for(let e of t){if(this.has(e.name))throw new E(`Tool already registered: ${e.name}`,{code:`TOOL_REGISTRY_DUPLICATE`,details:{name:e.name}});this.providerTools.set(e.name,e)}}remove(e){return this.executableTools.delete(e)||this.providerTools.delete(e)}has(e){return this.executableTools.has(e)||this.providerTools.has(e)}get(e){return this.executableTools.get(e)}getProvider(e){return this.providerTools.get(e)}executable(){return[...this.executableTools.values()]}provider(){return[...this.providerTools.values()]}get size(){return this.executableTools.size+this.providerTools.size}};function P(e,t){let n=t.usage??{in:0,out:0};e.in+=n.in??0,e.out+=n.out??0}function F(e){return JSON.stringify({error:e})}function I(e){let t=e.tools!==void 0||e.providerTools!==void 0;if(e.registry&&t)throw new E("Cannot specify both `registry` and `tools` / `providerTools`. Use one or the other.",{code:`TOOL_OPTIONS_CONFLICT`});return e.registry?e.registry:new N({tools:e.tools,providerTools:e.providerTools})}async function ee(e,t=async()=>null,n,r,i){let a=[],o=()=>{throw new O(`Operation aborted`,{reason:n.reason})};for(let s of e){n.aborted&&o();let e=i?.startSpan(s.name,{type:`tool`}),c={signal:n,tracer:e,registry:r,emit:()=>{}},l;try{l=await t(s.name,s.parameters,c),n.aborted&&(e?.end(`ok`),o())}catch(t){(n.aborted||t instanceof O||t instanceof Error&&t.name===`AbortError`)&&(e?.end(`ok`),o()),l={type:`error`,error:{type:`exception`,message:t instanceof Error?t.message:String(t)}}}if(l==null){let t=`Tool not found: ${s.name}`;e?.setResult({kind:`tool`,name:s.name,input:s.parameters,output:{type:`not-found`,message:t}}),e?.end(`error`),a.push({id:s.id,name:s.name,content:F({type:`not-found`,message:t}),isError:!0});continue}l.type===`success`?(e?.setResult({kind:`tool`,name:s.name,input:s.parameters,output:l.content}),e?.end(`ok`),a.push({id:s.id,name:s.name,content:l.content})):(e?.setResult({kind:`tool`,name:s.name,input:s.parameters,output:l.error}),e?.end(`error`),a.push({id:s.id,name:s.name,content:F(l.error),isError:!0}))}return{results:a}}let L=function(e){return e.Stop=`stop`,e.Length=`length`,e.FunctionCall=`function_call`,e.Error=`error`,e.Custom=`custom`,e.Cancelled=`cancelled`,e}({});function R(e,t){for(let n of e)n(t)}function te(e){return{type:`error`,error:{type:`not-found`,message:`Tool not found: ${e}`}}}function ne(e){return{name:e.name,description:e.description,schema:e.schema}}function re(e){let t=[],n=new AbortController,r=e.signal?AbortSignal.any([n.signal,e.signal]):n.signal,{promise:i,resolve:a,reject:o}=Promise.withResolvers();return Promise.resolve().then(()=>z(e,r,t).then(a,o)),{on(e){t.push(e)},cancel(e){n.abort(e)},get final(){return i}}}async function z(e,t,n){let{provider:r,model:i,messages:a,system:o,onToolCall:s,maxIterations:c,tracer:l,fileResolver:u,options:d,reasoning:f}=e,p=I(e),m=[...a],h=[],g={in:0,out:0},_=0,v=0,y=e=>{m.push(e),h.push(e)},b=e=>{e.result===`error`&&R(n,{type:`error`,error:e.error});let t=e.result===`success`?e.final?.content:null,r=e.result===`success`?e.final?.finishReason:void 0;return l?.setResult({kind:`llm`,model:i,request:{messages:a},response:{content:t??null},usage:e.usage?{inputTokens:e.usage.in,outputTokens:e.usage.out}:void 0,finishReason:r}),l?.end(e.result===`error`?`error`:`ok`),e},x=(e,n,r,i)=>{i();let a=e.length?{role:`assistant`,id:n,model:r,content:e,finishReason:`cancelled`}:void 0;throw a&&y(a),l?.end(`ok`),new O(`Stream aborted`,{reason:t.reason,messages:h,partial:a,usage:g})};for(;;){if(t.aborted&&x([],``,``,()=>{}),c!==void 0&&v>=c)return b({result:`error`,messages:h,error:{type:`model`,error:{type:`error`,error:{type:`MaxIterations`,message:`Exceeded max iterations (${c})`}}},usage:g});v+=1;let e=l?.startSpan(`turn-${v}`,{type:`llm`}),a=p?.executable()??[],S=a.length>0?a.map(ne):void 0,C=p?.provider()??[],w=C.length>0?{...d,providerTools:C}:d,T=r.createStreamingRequest(i,{messages:m,system:o,tools:S,context:{tracer:e,fileResolver:u},signal:t,options:w,reasoning:f}),E=[],D=``,k=``,A=null,j={in:0,out:0},M=-1,N=null,P=``,F=new Map,I=-1,L=()=>{N!==null&&M>=0&&(R(n,{type:N===`text`?`text:end`:`thinking:end`,index:M,final:P}),N=null,P=``,M=-1)};for await(let r of T){switch(r.type){case`start`:D=r.id,k=r.data.model,R(n,{type:`turn:start`,id:D,model:k});break;case`text-start`:L(),E.push({type:`text`,text:``}),I=E.length-1,M=_++,N=`text`,P=``,R(n,{type:`text:start`,index:M});break;case`text-delta`:{let e=E[I];e.text+=r.data.text,P=e.text,R(n,{type:`text:delta`,index:M,delta:r.data.text,accumulated:P});break}case`text-complete`:L();break;case`thinking-start`:L(),E.push({type:`thinking`,text:``}),I=E.length-1,M=_++,N=`thinking`,P=``,R(n,{type:`thinking:start`,index:M});break;case`thinking-delta`:{let e=E[I];e.text+=r.data.text,P=e.text,R(n,{type:`thinking:delta`,index:M,delta:r.data.text,accumulated:P});break}case`thinking-summary-delta`:{let e=E[I];e.text+=r.data.text,P=e.text,R(n,{type:`thinking:delta`,index:M,delta:r.data.text,accumulated:P});break}case`thinking-complete`:L();break;case`tool-call-start`:{L();let e=_++;E.push({type:`tool-call`,id:r.data.id,name:r.data.name,parameters:{}}),I=E.length-1,F.set(r.data.id,e),R(n,{type:`tool:request`,index:e,id:r.data.id,name:r.data.name});break}case`tool-call-args-delta`:R(n,{type:`tool:args-delta`,index:F.get(r.data.id)??-1,id:r.data.id,name:r.data.name,delta:r.data.delta,accumulated:r.data.accumulated});break;case`tool-call-complete`:{let e=E[I];r.data.id&&(e.id=r.data.id),r.data.name&&(e.name=r.data.name),e.parameters=r.data.arguments,r.data.providerMetadata&&(e.providerMetadata=r.data.providerMetadata);break}case`provider-tool-start`:{L();let e=_++;E.push({type:`provider-tool`,id:r.data.id,name:r.data.name}),I=E.length-1,R(n,{type:`provider-tool:start`,index:e,id:r.data.id,name:r.data.name});break}case`provider-tool-complete`:{let e=E[I];r.data.output!=null&&(e.output=r.data.output),R(n,{type:`provider-tool:complete`,index:r.data.index,id:r.data.id,name:r.data.name,output:r.data.output});break}case`complete`:L(),A=r.data.finishReason,j=r.data.usage;break;case`error`:{L();let t=r.data.usage??{in:0,out:0};return g.in+=t.in??0,g.out+=t.out??0,e?.end(`error`),b({result:`error`,messages:h,error:{type:`model`,error:{type:`error`,error:{type:r.data.type,message:r.data.message}}},usage:g})}default:console.warn(`[WARN] Unhandled chunk type. Should never happen`)}if(t.aborted)break}if(t.aborted&&(e?.end(`ok`),x(E,D,k,L)),A===null)return L(),e?.end(`error`),b({result:`error`,messages:h,error:{type:`model`,error:{type:`error`,error:{type:`IncompleteStream`,message:`Stream ended without a completion signal`}}},usage:g});g.in+=j.in??0,g.out+=j.out??0;let re={kind:`llm`,model:k,request:{messages:m},response:{content:E},usage:{inputTokens:j.in,outputTokens:j.out},finishReason:A};e?.setResult(re),e?.end();let z={role:`assistant`,id:D,model:k,content:E,finishReason:A};if(y(z),R(n,{type:`turn:complete`,message:z,usage:j}),A!==`function_call`)return b({result:`success`,messages:h,final:z,usage:g});let B=E.filter(e=>e.type===`tool-call`);if(B.length===0)return b({result:`success`,messages:h,final:z,usage:g});if(t.aborted)throw l?.end(`ok`),new O(`Stream aborted`,{reason:t.reason,messages:h,usage:g});let V=crypto.randomUUID();R(n,{type:`tool-results:start`,id:V});let H=0,U=async(e,t,r)=>{let i=B[H++],a=F.get(i.id)??-1;R(n,{type:`tool:exec-start`,index:a,id:i.id,name:e,parameters:t});let o={...r,emit:t=>{R(n,{type:`tool:exec-delta`,index:a,id:i.id,name:e,chunk:t})}},c=(s?await s(e,t,o):null)??te(e);return R(n,{type:`tool:exec-complete`,index:a,id:i.id,name:e,result:c}),c},W;try{({results:W}=await ee(B,U,t,p,l))}catch(e){throw e instanceof O?(l?.end(`ok`),new O(`Stream aborted`,{reason:e.reason,messages:e.messages??h,partial:e.partial,usage:e.usage??g})):e}if(W.length>0){let e={role:`tool`,id:V,content:W};y(e),R(n,{type:`tool-results:complete`,message:e})}}}var B=class{rootPath;constructor(e){this.rootPath=e}async read(e){let n=s.join(this.rootPath,e);try{return await t.readFile(n,`utf-8`)}catch{return null}}async write(e,n){let r=s.join(this.rootPath,e);await t.mkdir(s.dirname(r),{recursive:!0}),await t.writeFile(r,n,`utf-8`)}};function V(e=new Date){return{start:e.toISOString()}}function H(e,t=new Date){let n=t.toISOString();return e?{...e,end:n}:{start:n,end:n}}var U=class{currentTurn=null;currentTextPart=null;currentThinkingPart=null;toolIdMap=new Map;accumulatedUsage={in:0,out:0};createUserTurn(e){let t=e.id??crypto.randomUUID(),n=[],r=new Date,i=H(V(r),r),a=()=>({...i});if(typeof e.content==`string`)n.push({id:crypto.randomUUID(),type:`text`,text:e.content,timing:a()});else for(let t of e.content)t.type===`text`?n.push({id:crypto.randomUUID(),type:`text`,text:t.text,timing:a()}):t.type===`file`&&n.push({id:crypto.randomUUID(),type:`file`,file:t.file,timing:a()});let o={id:t,owner:`user`,parts:n,status:`complete`,timing:i};return{turn:o,events:[{type:`turn:user`,turn:o}]}}startAgentTurn(){let e=crypto.randomUUID(),t={id:e,owner:`agent`,parts:[],status:`streaming`,timing:V()};return this.currentTurn=t,this.currentTextPart=null,this.currentThinkingPart=null,this.toolIdMap.clear(),this.accumulatedUsage={in:0,out:0},{turn:t,events:[{type:`turn:start`,turnId:e}]}}handleStreamEvent(e){let t=this.currentTurn;if(!t)return[];let n=[];switch(e.type){case`turn:start`:break;case`text:start`:{this.closeOpenParts(t,n);let e={id:crypto.randomUUID(),type:`text`,text:``,timing:V()};t.parts.push(e),this.currentTextPart=e,n.push({type:`part:start`,turnId:t.id,part:{...e}});break}case`text:delta`:this.currentTextPart&&(this.currentTextPart.text=e.accumulated,n.push({type:`text:delta`,turnId:t.id,partId:this.currentTextPart.id,delta:e.delta}));break;case`text:end`:this.currentTextPart&&=(this.currentTextPart.text=e.final,this.currentTextPart.timing=H(this.currentTextPart.timing),n.push({type:`part:end`,turnId:t.id,partId:this.currentTextPart.id,timing:this.currentTextPart.timing}),null);break;case`thinking:start`:{this.closeOpenParts(t,n);let e={id:crypto.randomUUID(),type:`thinking`,text:``,timing:V()};t.parts.push(e),this.currentThinkingPart=e,n.push({type:`part:start`,turnId:t.id,part:{...e}});break}case`thinking:delta`:this.currentThinkingPart&&(this.currentThinkingPart.text=e.accumulated,n.push({type:`thinking:delta`,turnId:t.id,partId:this.currentThinkingPart.id,delta:e.delta}));break;case`thinking:end`:this.currentThinkingPart&&=(this.currentThinkingPart.text=e.final,this.currentThinkingPart.timing=H(this.currentThinkingPart.timing),n.push({type:`part:end`,turnId:t.id,partId:this.currentThinkingPart.id,timing:this.currentThinkingPart.timing}),null);break;case`tool:request`:{this.closeOpenParts(t,n);let r=crypto.randomUUID(),i={id:r,type:`action`,kind:`tool`,status:`pending`,timing:V(),detail:{name:e.name,parameters:{}}};t.parts.push(i),this.toolIdMap.set(e.id,{partId:r,turnId:t.id}),n.push({type:`part:start`,turnId:t.id,part:{...i,detail:{...i.detail}}});break}case`tool:args-delta`:{let r=this.toolIdMap.get(e.id);if(r){let i=this.findActionPart(t,r.partId);i&&(i.detail.pendingArgs=e.accumulated),n.push({type:`action:args-delta`,turnId:t.id,partId:r.partId,delta:e.delta,accumulated:e.accumulated})}break}case`tool:exec-start`:{let r=this.toolIdMap.get(e.id);if(r){let i=this.findActionPart(t,r.partId);i&&(i.status=`running`,i.detail.parameters=e.parameters,delete i.detail.pendingArgs,n.push({type:`action:running`,turnId:t.id,partId:r.partId,parameters:e.parameters}))}break}case`tool:exec-delta`:{let r=this.toolIdMap.get(e.id);if(r){let i=this.findActionPart(t,r.partId);if(i){let t=i.detail.result?.type===`in-progress`?i.detail.result.content:``;i.detail.result={type:`in-progress`,content:t+e.chunk}}n.push({type:`action:progress`,turnId:t.id,partId:r.partId,chunk:e.chunk})}break}case`tool:exec-complete`:{let r=this.toolIdMap.get(e.id);if(r){let i=this.findActionPart(t,r.partId);i&&(e.result.type===`success`?(i.status=`complete`,i.timing=H(i.timing),i.detail.result={type:`success`,content:e.result.content},n.push({type:`action:complete`,turnId:t.id,partId:r.partId,result:i.detail.result})):(i.status=`error`,i.timing=H(i.timing),i.detail.result={type:`error`,error:e.result.error},n.push({type:`action:error`,turnId:t.id,partId:r.partId,error:e.result.error})))}break}case`provider-tool:start`:{this.closeOpenParts(t,n);let r=crypto.randomUUID(),i={id:r,type:`action`,kind:`provider-tool`,status:`running`,timing:V(),detail:{name:e.name}};t.parts.push(i),this.toolIdMap.set(e.id,{partId:r,turnId:t.id}),n.push({type:`part:start`,turnId:t.id,part:{...i,detail:{...i.detail}}}),n.push({type:`action:running`,turnId:t.id,partId:r});break}case`provider-tool:complete`:{let r=this.toolIdMap.get(e.id);if(r){let i=this.findActionPart(t,r.partId);i&&(i.status=`complete`,i.timing=H(i.timing),i.detail.result={type:`success`,content:e.output},n.push({type:`action:complete`,turnId:t.id,partId:r.partId,result:i.detail.result}))}break}case`turn:complete`:{this.closeOpenParts(t,n);let r=e.usage??{in:0,out:0};this.accumulatedUsage.in+=r.in,this.accumulatedUsage.out+=r.out;break}case`tool-results:start`:case`tool-results:complete`:break;case`error`:{let t=e.error,r=t.type===`model`?t.error.error.message:`Tool error (${t.error.name}): ${t.error.message}`;n.push({type:`error`,error:{type:t.type,message:r}});break}}return n}finalizeTurn(e=`complete`){let t=this.currentTurn;if(!t)return[];let n=[];return this.closeOpenParts(t,n),t.status=e,t.usage={...this.accumulatedUsage},t.timing=H(t.timing),n.push({type:`turn:end`,turnId:t.id,status:e,usage:t.usage,timing:t.timing}),this.currentTurn=null,n}closeOpenParts(e,t){this.currentTextPart&&=(this.currentTextPart.timing=H(this.currentTextPart.timing),t.push({type:`part:end`,turnId:e.id,partId:this.currentTextPart.id,timing:this.currentTextPart.timing}),null),this.currentThinkingPart&&=(this.currentThinkingPart.timing=H(this.currentThinkingPart.timing),t.push({type:`part:end`,turnId:e.id,partId:this.currentThinkingPart.id,timing:this.currentThinkingPart.timing}),null)}findActionPart(e,t){return e.parts.find(e=>e.id===t&&e.type===`action`)}};function W(e){return Array.isArray(e)?e:[e]}function ie(e){return new Promise(t=>setTimeout(t,e))}function ae(e){return e.then(()=>{},()=>{})}function oe(e,t,n){let r=new AbortController,i=n?AbortSignal.any([n,r.signal]):r.signal,a=e.then(()=>t(i));return{handle:{cancel:e=>r.abort(e),get final(){return a}},settled:ae(a)}}var se=class{_turns=[];_log=[];constructor(e){e?.turns&&(this._turns=e.turns),e?.log&&(this._log=e.log)}get turns(){return[...this._turns]}get log(){return[...this._log]}addTurn(e){this._turns.push(e)}appendToLog(e){Array.isArray(e)?this._log.push(...e):this._log.push(e)}latestTurn(){return this._turns[this._turns.length-1]}toString(){return JSON.stringify({turns:this._turns})}};function G(e){if(e instanceof d.ZodString)return[`string`,`Your answer`];if(e instanceof d.ZodNumber)return[`number`,42];if(e instanceof d.ZodBoolean)return[`boolean`,!0];if(e instanceof d.ZodArray){let t=e.element;if(t instanceof d.ZodString)return[`string array`,[`answer 1`,`answer 2`,`third answer`]];if(t instanceof d.ZodNumber)return[`number array`,[42,59,3.14]];if(t instanceof d.ZodBoolean)return[`boolean array`,[!0,!1,!1]];if(t instanceof d.ZodObject){let[,e]=G(t);return[`object array`,[e,e]]}return[`array`,[]]}if(e instanceof d.ZodObject){let t=e.shape,n={};for(let[e,r]of Object.entries(t)){let[,t]=G(r);n[e]=t}return[`JSON object`,n]}if(e instanceof d.ZodOptional){let[t,n]=G(e.unwrap());return[`${t} | undefined`,n]}throw Error(`Unsupported Zod schema: ${e.constructor.name}`)}function ce(e,t){if(!t)return e;if(Object.keys(t).length===0){if(e.trim()===`{}`||e.trim()===``)return{};throw Error(`Schema is empty, but rawValue is not an empty object representation or empty string.`)}let n=ue(e),r={};for(let[e,i]of Object.entries(t)){let t=n.tags[e];if(t!==void 0)r[e]=le(i,t);else if(i.def.type!==`optional`)throw Error(`Expected results with tag ${e} but it does not exist`)}try{let e={};for(let[n,i]of Object.entries(t))n in r&&(e[n]=i.parse(r[n]));return e}catch(e){if(e&&typeof e==`object`&&`issues`in e){let t=e.issues.map(e=>`${e.path.join(`.`)}: ${e.message}`).join(`, `);throw Error(`Validation failed: ${t}`)}throw e}}function le(e,t){switch(t=t.trim(),e.def.type){case`string`:try{return JSON.parse(t)}catch{if(typeof t==`string`)return t;throw Error(`Cannot parse '${t}' as string. Ensure it is a valid JSON string or a plain string.`)}case`number`:{let e=parseFloat(t);if(isNaN(e))throw Error(`Cannot parse '${t}' as number`);return e}case`boolean`:{let e=t.toLowerCase();if(e===`true`)return!0;if(e===`false`)return!1;throw Error(`Cannot parse '${t}' as boolean. Expected 'true' or 'false'`)}case`array`:if(t===``)return[];try{let e=JSON.parse(t);if(Array.isArray(e))return e}catch{}if(t.includes(`,`))return t.split(`,`).map(e=>{let t=e.trim();try{return JSON.parse(t)}catch{return t}}).filter(e=>e!==``);case`object`:t.includes("```json")&&(t=t.replace(/```json/g,``).replace(/```/g,``));try{return JSON.parse(t)}catch(e){throw Error(`Cannot parse object as JSON: ${e.message}`)}case`optional`:{let n=e.def.innerType;return le(n,t)}default:return t}}function ue(e){e.trim().startsWith("```json")&&e.trim().endsWith("```")&&(e=e.trim().slice(7,-3).trim());let t=/<(\w+)>(.*?)<\/\1>/gs,n={},r=e;return r=r.replace(t,(e,t,r)=>(n[t]=r,``)),r=r.replace(/<(\w+)>(.*?)(?:<\/?\w+>|$)/gs,(e,t,r)=>(n[t]=r,``)),{tags:n,remaining:r.trim()}}var de=class{provider;model;history;tracer;name;scope;store;fileResolver;reasoning;registry;system;mcps=[];resolvedMcps=new WeakSet;memory;eventCallbacks=[];sendQueue=Promise.resolve();constructor(e){if(this.provider=e.provider,this.model=e.model,this.history=new se,this.tracer=e.tracer,this.system=e.system,this.name=e.name,this.scope=e.scope,this.store=new B(`.axle`),this.fileResolver=e.fileResolver,this.reasoning=e.reasoning,this.registry=new N({tools:e.tools,providerTools:e.providerTools}),e.mcps&&(this.mcps=[...e.mcps]),e.memory){if(!e.name)throw new E(`Agent requires a 'name' when memory is provided. The name is used to partition memory storage.`);this.memory=e.memory;let t=e.memory.tools?.();t&&this.registry.add(t)}}addMcp(e){this.mcps.push(e)}addMcps(e){this.mcps.push(...e)}hasTools(){return this.registry.size>0||this.mcps.length>0}on(e){this.eventCallbacks.push(e)}send(e,t){let n,r;if(typeof e==`string`)r={role:`user`,id:crypto.randomUUID(),content:[{type:`text`,text:e}]};else{let t=e.render(),i=e.files;r={role:`user`,id:crypto.randomUUID(),content:A({text:t,files:i})},n=e.schema}let i=t?.reasoning??this.reasoning,{handle:a,settled:o}=oe(this.sendQueue,e=>this.run(r,n,e,t?.fileResolver,i),t?.signal);return this.sendQueue=o,a}async resolveMcpTools(){for(let e of this.mcps){if(this.resolvedMcps.has(e))continue;let t=await e.listTools({prefix:e.name,tracer:this.tracer});this.registry.add(t),this.resolvedMcps.add(e)}}emitEvent(e){for(let t of this.eventCallbacks)t(e)}async run(e,t,n,r,i){let a=new U,o={in:0,out:0};if(n.aborted)throw new k(`Agent send aborted`,{reason:n.reason,usage:o});await this.resolveMcpTools();let s=this.system,c=[...this.history.log,e];if(this.memory){let e=await this.memory.recall({name:this.name,scope:this.scope,system:this.system,messages:c,store:this.store,tracer:this.tracer});e.systemSuffix&&(s=(s??``)+`
|
|
4
|
-
|
|
5
|
-
`+e.systemSuffix)}if(n.aborted)throw new k(`Agent send aborted`,{reason:n.reason,usage:o});let{turn:l,events:u}=a.createUserTurn(e);this.history.addTurn(l),this.history.appendToLog(e);for(let e of u)this.emitEvent(e);let{turn:d,events:f}=a.startAgentTurn();this.history.addTurn(d);for(let e of f)this.emitEvent(e);let p=re({provider:this.provider,model:this.model,messages:c,system:s,registry:this.registry,tracer:this.tracer,fileResolver:r??this.fileResolver,reasoning:i,onToolCall:async(e,t,n)=>{let r=this.registry.get(e);if(!r)return null;try{return{type:`success`,content:await r.execute(t,n)}}catch(e){return{type:`error`,error:{type:`execution`,message:e instanceof Error?e.message:String(e)}}}},signal:n});p.on(e=>{let t=a.handleStreamEvent(e);for(let e of t)this.emitEvent(e)});let m;try{m=await p.final}catch(e){if(e instanceof O){e.messages&&e.messages.length>0&&this.history.appendToLog(e.messages);let t=a.finalizeTurn(`cancelled`);for(let e of t)this.emitEvent(e);throw new k(`Agent send aborted`,{reason:e.reason,messages:e.messages,partial:e.partial,turn:d,usage:e.usage??o})}throw e}let h=m.result===`error`?`error`:`complete`;m.messages.length>0&&this.history.appendToLog(m.messages);let g=a.finalizeTurn(h);for(let e of g)this.emitEvent(e);let _=m.usage??o;if(m.result===`error`)throw new E(fe(m.error),{code:m.error.type===`model`?`MODEL_ERROR`:`TOOL_ERROR`,details:{error:m.error}});let v=null;if(m.result===`success`&&(m.final&&(v=ce(j(m.final.content),t)),this.memory))try{await this.memory.record({name:this.name,scope:this.scope,system:this.system,messages:this.history.log,newMessages:m.messages,store:this.store,tracer:this.tracer})}catch(e){this.tracer?.warn(`memory record failed`,{error:e instanceof Error?e.message:String(e)})}return{response:v,turn:d,usage:_}}};function fe(e){return e.type===`model`?`Model error: ${e.error.error.message}`:`Tool error (${e.error.name}): ${e.error.message}`}function pe(e,t,n={}){let{placeholderStyle:r=`{{}}`}=n,i=r===`{{}}`?/\{\{(.*?)\}\}/g:/\{(.*?)\}/g,a=[];if(e=e.replace(i,(e,n)=>{if(n=n.trim(),Object.prototype.hasOwnProperty.call(t,n)){let e=t[n];return e==null?``:String(e)}return a.push(n),e}),a.length>0){let e=[...new Set(a)];throw Error(`Missing variable${e.length>1?`s`:``}: ${e.join(`, `)}. Pass them as --args key=value.`)}return e}var me=class e{prompt;inputs={};files=[];textReferences=[];schema;constructor(e,t){this.prompt=e,this.schema=t}clone(){let t=new e(this.prompt,this.schema);return t.inputs={...this.inputs},t.files=[...this.files],t.textReferences=this.textReferences.map(e=>({...e})),t}withInputs(e){let t=this.clone();return t.inputs={...t.inputs,...e},t}withInput(e,t){return this.withInputs({[e]:t})}setInputs(e){this.inputs={...e}}addInput(e,t){this.inputs[e]=t}addFile(e,t){if(typeof e==`string`){this.textReferences.push({content:e,name:t?.name});return}if(e.kind===`text`&&e.source.type===`text`){this.textReferences.push({content:e.source.content,name:t?.name??e.name});return}this.files.push(t?.name?{...e,name:t.name}:e)}hasFiles(){return this.files.length>0}render(){let e=pe(this.prompt,this.inputs);if(this.textReferences.length>0)for(let[t,n]of this.textReferences.entries()){let r=n.name?`: ${n.name}`:``;e+=`\n\n## Reference ${t+1}${r}\n\n\`\`\`${n.content}'''`}if((this.schema?Object.keys(this.schema):[]).length===0)return e;let t=`# Output Format Instructions
|
|
6
|
-
|
|
7
|
-
Here is how you should format your output. Follow the instructions strictly.
|
|
8
|
-
`;for(let[e,n]of Object.entries(this.schema)){let[r,i]=G(n);t+=`\n- Use <${e}></${e}> tags to indicate the answer for ${e}. The answer must be a ${r}.\n Example: <${e}>${JSON.stringify(i)}</${e}>\n`}return t+e}};function K(e,t=`Operation aborted`){if(e?.aborted)throw new O(t,{reason:e.reason})}function q(e,t,n=`Operation aborted`){return t?t.aborted?Promise.reject(new O(n,{reason:t.reason})):new Promise((r,i)=>{let a=()=>{t.removeEventListener(`abort`,a),i(new O(n,{reason:t.reason}))};t.addEventListener(`abort`,a,{once:!0}),e.then(e=>{t.removeEventListener(`abort`,a),r(e)},e=>{t.removeEventListener(`abort`,a),i(e)})}):e}function he(e,t,n=`[redacted]`){return J(e,null,t,n)}function J(e,t,n,r){if(typeof e!=`object`||!e)return typeof e==`string`&&t&&n.has(t)?r:e;if(Array.isArray(e))return e.map(e=>J(e,t,n,r));let i={};for(let[t,a]of Object.entries(e))i[t]=J(a,t,n,r);return i}const ge=new Set([`data`,`file_data`,`file_url`,`image_url`,`url`,`uri`,`fileUri`]);function Y(e){return he(e,ge,`[redacted-file-value]`)}function X(e){if(e==null)return{type:`error`,error:{type:`Undetermined`,message:`Unknown error occurred`},usage:{in:0,out:0},raw:e};if(e instanceof Error)return{type:`error`,error:{type:e.name||`Error`,message:e.message||`Unexpected error`},usage:{in:0,out:0},raw:e};if(typeof e==`object`){let t=e,n=t?.error?.error?.type||t?.error?.type||t?.type||t?.code||t?.status||`Undetermined`,r=t?.error?.error?.message||t?.error?.message||t?.message||t?.error||`Unexpected error`;return{type:`error`,error:{type:String(n),message:String(r)},usage:{in:0,out:0},raw:e}}return{type:`error`,error:{type:`Undetermined`,message:String(e)},usage:{in:0,out:0},raw:e}}async function _e(e,t){let{defaults:n,tag:r}=t,a=null,o=``;if(e)try{o=u(e),a=await i(o,{encoding:`utf-8`})}catch{throw Error(`${r} not found, see --help for details`)}else{for(let e of n.formats)try{o=u(n.name+`.`+e),a=await i(o,{encoding:`utf-8`});break}catch{continue}if(a===null)throw Error(`${r} not found, see --help for details`)}return{content:a,format:o.split(`.`).pop()??``,path:o}}const ve=20*1024*1024;async function Z(e,t){if(t.signal?.aborted)throw new DOMException(`File resolution aborted`,`AbortError`);let{source:n}=e;if(n.type===`base64`)return Q({type:`base64`,data:n.data},e,t);if(n.type===`text`)return Q({type:`text`,content:n.content},e,t);if(n.type===`url`)return Q({type:`url`,url:n.url},e,t);if(!t.resolver)throw Error(`No fileResolver configured for deferred file: ${e.name}`);return Q(await t.resolver({file:e,ref:n.ref,provider:t.provider,model:t.model,accepted:t.accepted,signal:t.signal}),e,t)}function Q(e,t,n){if(n.accepted.includes(e.type))return{...e,mimeType:e.mimeType??t.mimeType,name:e.name??t.name};throw Error(`File source '${e.type}' is not supported for ${n.provider} ${t.kind} file '${t.name}'. Accepted: ${n.accepted.join(`, `)}`)}const ye=new Set([`application/json`,`application/xml`,`application/yaml`,`application/x-yaml`,`application/toml`]);function be(e){return e.startsWith(`text/`)||ye.has(e)}function xe(e){let t=h.getType(e);if(!t){let t=l(e).toLowerCase();throw Error(`Unsupported file type: ${t||`(no extension)`}`)}if(t.startsWith(`image/`))return{kind:`image`,mimeType:t};if(t===`application/pdf`)return{kind:`document`,mimeType:t};if(be(t))return{kind:`text`,mimeType:t};{let n=l(e).toLowerCase();throw Error(`Unsupported file type: ${n} (${t})`)}}async function Se(e,t){let r=u(e);try{await n(r)}catch{throw Error(`File not found: ${e}`)}let o=await a(r);if(o.size>ve)throw Error(`File too large: ${o.size} bytes. Maximum allowed: ${ve} bytes`);let s=r.split(`/`).pop()||``,c=xe(r);if((t||(c.kind===`text`?`utf-8`:`base64`))===`utf-8`){if(c.kind!==`text`)throw Error(`Cannot read ${c.kind} file as text: ${e}`);let t=await i(r,`utf-8`);return{kind:`text`,mimeType:c.mimeType,size:o.size,name:s,source:{type:`text`,content:t}}}else{if(c.kind===`text`)throw Error(`Cannot read text file as binary: ${e}`);let t=(await i(r)).toString(`base64`);return{kind:c.kind,mimeType:c.mimeType,size:o.size,name:s,source:{type:`base64`,data:t}}}}async function Ce(e,t={model:``}){return Promise.all(e.map(e=>we(e,t)))}async function we(e,t){if(e.role===`assistant`){let t=[];for(let n of e.content)n.type===`text`?t.push({type:`text`,text:n.text}):n.type===`thinking`?n.redacted?t.push({type:`redacted_thinking`,data:n.text}):n.signature&&t.push({type:`thinking`,thinking:n.text,signature:n.signature}):n.type===`tool-call`?t.push({type:`tool_use`,id:n.id,name:n.name,input:n.parameters}):n.type===`provider-tool`&&(t.push({type:`server_tool_use`,id:n.id,name:n.name,input:n.input??{}}),n.output!=null&&t.push({type:`web_search_tool_result`,tool_use_id:n.id,content:n.output}));return{role:`assistant`,content:t}}if(e.role===`tool`)return{role:`user`,content:await Promise.all(e.content.map(async e=>({type:`tool_result`,tool_use_id:e.id,content:typeof e.content==`string`?e.content:await Pe(e.content,t),...e.isError?{is_error:!0}:{}})))};if(typeof e.content==`string`)return{role:`user`,content:e.content};{let n=[];for(let r of e.content)r.type===`text`?n.push({type:`text`,text:r.text}):r.type===`file`&&n.push(await Te(r.file,t,`user-message`));return{role:`user`,content:n}}}async function Te(e,t,n){if(e.kind===`image`)return{type:`image`,source:De(await Z(e,{provider:`anthropic`,model:t.model,accepted:[`url`,`base64`],purpose:n,resolver:t.fileResolver,signal:t.signal}),e)};if(e.kind===`document`){if(e.mimeType!==`application/pdf`)throw Error(`Anthropic only supports PDF document files. Received ${e.mimeType}`);let r=await Z(e,{provider:`anthropic`,model:t.model,accepted:[`url`,`base64`],purpose:n,resolver:t.fileResolver,signal:t.signal});return{type:`document`,source:Oe(r),title:r.name??e.name}}let r=await Z(e,{provider:`anthropic`,model:t.model,accepted:[`text`],purpose:n,resolver:t.fileResolver,signal:t.signal});if(r.type!==`text`)throw Error(`Unsupported Anthropic text source: ${r.type}`);return n===`tool-result`?{type:`text`,text:r.content}:{type:`document`,source:{type:`text`,media_type:`text/plain`,data:r.content},title:r.name??e.name}}function Ee(e){if(e===`image/jpeg`||e===`image/png`||e===`image/gif`||e===`image/webp`)return e;throw Error(`Anthropic does not support image MIME type: ${e}. Supported types: image/jpeg, image/png, image/gif, image/webp.`)}function De(e,t){if(e.type===`url`)return{type:`url`,url:e.url};if(e.type===`base64`)return{type:`base64`,media_type:Ee(e.mimeType??t.mimeType),data:e.data};throw Error(`Unsupported Anthropic image source: ${e.type}`)}function Oe(e){if(e.type===`url`)return{type:`url`,url:e.url};if(e.type===`base64`)return{type:`base64`,media_type:`application/pdf`,data:e.data};throw Error(`Unsupported Anthropic PDF source: ${e.type}`)}function ke(e){return e===!0?{thinking:{type:`enabled`,budget_tokens:8192}}:{}}function Ae(e){return e.map(e=>{let t=f.toJSONSchema(e.schema);if(!Ne(t))throw Error(`Schema for tool ${e.name} must be an object type`);return{name:e.name,description:e.description,input_schema:t}})}function je(e){let t=[];for(let n of e)if(n.type===`text`)t.push({type:`text`,text:n.text});else if(n.type===`thinking`)t.push({type:`thinking`,text:n.text||``,redacted:!1});else if(n.type===`redacted_thinking`)t.push({type:`thinking`,text:n.text||``,redacted:!0});else if(n.type===`tool_use`){if(typeof n.input!=`object`||n.input===null||Array.isArray(n.input))throw Error(`Invalid tool call input for ${n.name}: expected object, got ${typeof n.input}`);t.push({type:`tool-call`,id:n.id,name:n.name,parameters:n.input})}return t}function Me(e){switch(e){case`max_tokens`:return`length`;case`end_turn`:return`stop`;case`stop_sequence`:return`stop`;case`tool_use`:return`function_call`;default:return`error`}}function Ne(e){return e&&typeof e==`object`&&e.type===`object`}async function Pe(e,t){return Promise.all(e.map(async e=>e.type===`text`?{type:`text`,text:e.text}:Te(e.file,t,`tool-result`)))}async function Fe(e){let{client:t,model:n,messages:r,system:i,tools:a,context:o,options:s,reasoning:c,signal:l}=e,u=o?.tracer,{stop:d,max_tokens:f,...p}=s??{},m;try{K(l,`Generate aborted`);let e=await Ce(r,{model:n,fileResolver:o?.fileResolver,signal:l}),s={model:n,max_tokens:f??16e3,messages:e,...i&&{system:i},...d&&{stop_sequences:W(d)},...a&&{tools:Ae(a)},...ke(c),...p};u?.debug(`Anthropic request`,{request:Y(s)});let h=await q(t.messages.create(s,...l?[{signal:l}]:[]),l,`Generate aborted`);K(l,`Generate aborted`),m=Ie(h)}catch(e){K(l,`Generate aborted`),m=X(e)}return u?.debug(`Anthropic response`,{result:m}),m}function Ie(e){let t=Me(e.stop_reason);if(t===`error`)return{type:`error`,error:{type:`Uncaught error`,message:`Stop reason is not recognized or unhandled: ${e.stop_reason}`},usage:{in:e.usage.input_tokens,out:e.usage.output_tokens},raw:e};if(t===`function_call`){let t=je(e.content);return{type:`success`,id:e.id,model:e.model,role:e.role,finishReason:`function_call`,content:t,text:j(t),usage:{in:e.usage.input_tokens,out:e.usage.output_tokens},raw:e}}if(e.type==`message`){let n=je(e.content);return{type:`success`,id:e.id,model:e.model,role:`assistant`,finishReason:t,content:n,text:j(n),usage:{in:e.usage.input_tokens,out:e.usage.output_tokens},raw:e}}return{type:`error`,error:{type:`InvalidResponse`,message:`Unsupported completion type: ${e.type}`},usage:{in:e.usage.input_tokens,out:e.usage.output_tokens},raw:e}}function Le(){let e=new Map,t=new Map,n=new Map;function r(r){let i=[];switch(r.type){case`message_start`:i.push({type:`start`,id:r.message.id,data:{model:r.message.model,timestamp:Date.now()}});break;case`message_delta`:r.delta.stop_reason&&i.push({type:`complete`,data:{finishReason:Me(r.delta.stop_reason),usage:{in:r.usage?.input_tokens||0,out:r.usage?.output_tokens||0}}});case`message_stop`:break;case`content_block_start`:if(r.content_block.type===`text`)e.set(r.index,`text`),i.push({type:`text-start`,data:{index:r.index}});else if(r.content_block.type===`tool_use`){e.set(r.index,`tool`);let t=r.content_block;n.set(r.index,{id:t.id,name:t.name,argumentsBuffer:``}),i.push({type:`tool-call-start`,data:{index:r.index,id:t.id,name:t.name}})}else if(r.content_block.type===`thinking`)e.set(r.index,`thinking`),i.push({type:`thinking-start`,data:{index:r.index,redacted:!1}});else if(r.content_block.type===`redacted_thinking`)e.set(r.index,`thinking`),i.push({type:`thinking-start`,data:{index:r.index,redacted:!0}});else if(r.content_block.type===`server_tool_use`){e.set(r.index,`provider-tool`);let n=r.content_block;t.set(n.id,{index:r.index,name:n.name}),i.push({type:`provider-tool-start`,data:{index:r.index,id:n.id,name:n.name}})}else if(r.content_block.type===`web_search_tool_result`){let e=r.content_block,n=t.get(e.tool_use_id);n&&(i.push({type:`provider-tool-complete`,data:{index:n.index,id:e.tool_use_id,name:n.name,output:e.content}}),t.delete(e.tool_use_id))}break;case`content_block_delta`:if(r.delta.type===`text_delta`)i.push({type:`text-delta`,data:{text:r.delta.text,index:r.index}});else if(r.delta.type===`input_json_delta`){let e=n.get(r.index);e&&(e.argumentsBuffer+=r.delta.partial_json,i.push({type:`tool-call-args-delta`,data:{index:r.index,id:e.id,name:e.name,delta:r.delta.partial_json,accumulated:e.argumentsBuffer}}))}else r.delta.type===`thinking_delta`?i.push({type:`thinking-delta`,data:{text:r.delta.thinking,index:r.index}}):r.delta.type===`signature_delta`||r.delta.type;break;case`content_block_stop`:{let t=e.get(r.index);if(t===`text`)i.push({type:`text-complete`,data:{index:r.index}});else if(t===`thinking`)i.push({type:`thinking-complete`,data:{index:r.index}});else if(t!==`provider-tool`&&t===`tool`){let e=n.get(r.index);if(e){try{let t=e.argumentsBuffer?JSON.parse(e.argumentsBuffer):{};i.push({type:`tool-call-complete`,data:{index:r.index,id:e.id,name:e.name,arguments:t}})}catch(t){throw Error(`Failed to parse tool call arguments for ${e.name}: ${t instanceof Error?t.message:String(t)}\nRaw buffer: ${e.argumentsBuffer}`)}n.delete(r.index)}}e.delete(r.index);break}}return i}return{handleEvent:r}}async function*Re(e){let{client:t,model:n,messages:r,system:i,tools:a,context:o,signal:s,options:c,reasoning:l}=e,u=o?.tracer,{stop:d,max_tokens:f,providerTools:p,...m}=c??{},h=a?Ae(a):[];if(p){let e={web_search:`web_search_20250305`};for(let t of p){let n=e[t.name]??t.name;h.push({type:n,name:t.name,...t.config})}}let g=Le();try{let e=await Ce(r,{model:n,fileResolver:o?.fileResolver,signal:s}),a={model:n,max_tokens:f??ze(n),messages:e,...i&&{system:i},...d&&{stop_sequences:W(d)},...h.length>0&&{tools:h},...ke(l),...m};u?.debug(`Anthropic streaming request`,{request:Y(a)});let c=await t.messages.create({...a,stream:!0},{signal:s});for await(let e of c){let t=g.handleEvent(e);for(let e of t)yield e}}catch(e){if(s?.aborted)return;yield{type:`error`,data:{type:`STREAMING_ERROR`,message:e instanceof Error?e.message:String(e),raw:e}}}}function ze(t){return t in e?e[t]:t.includes(`opus`)?t.match(/opus-4-[6-9]|opus-[5-9]/)?128e3:64e3:t.includes(`sonnet`)||t.includes(`haiku`)?t.match(/claude-3-[0-5]-/)?8192:64e3:16384}function Be(e){let t=new m({apiKey:e});return{name:`anthropic`,async createGenerationRequest(e,n){return await Fe({client:t,model:e,...n})},createStreamingRequest(e,n){return Re({client:t,model:e,...n})}}}async function Ve(e,t,n={model:``}){let r=(await Promise.all(e.map(e=>Ge(e,n)))).flat(1);return t?[{role:`system`,content:t},...r]:r}function He(e){return e===!0?{reasoning_effort:`high`}:e===!1?{reasoning_effort:`minimal`}:{}}function Ue(e){if(e&&e.length>0)return e.map(e=>({type:`function`,function:{name:e.name,description:e.description,parameters:f.toJSONSchema(e.schema)}}))}function We(e){switch(e){case`stop`:return`stop`;case`length`:return`length`;case`tool_calls`:case`function_call`:return`function_call`;case`content_filter`:return`error`;default:return`stop`}}async function Ge(e,t){switch(e.role){case`tool`:return Ke(e,t);case`assistant`:return qe(e);default:return Je(e,t)}}async function Ke(e,t){return Promise.all(e.content.map(async e=>({role:`tool`,content:typeof e.content==`string`?e.content:await Xe(e.content,t),tool_call_id:e.id})))}function qe(e){let t=e.content.filter(e=>e.type===`tool-call`),n=e.content.filter(e=>e.type===`text`),r=t.length>0?t.map(e=>({type:`function`,id:e.id,function:{name:e.name,arguments:JSON.stringify(e.parameters)}})):void 0;return{role:`assistant`,content:n.map(e=>e.text).join(``),...r&&{tool_calls:r}}}async function Je(e,t){if(typeof e.content==`string`)return{role:`user`,content:e.content};let n=(await Promise.all(e.content.map(e=>Ye(e,t)))).filter(e=>e!==null);return n.every(e=>e.type===`text`)?{role:`user`,content:n.map(e=>e.text).join(``)}:{role:`user`,content:n}}async function Ye(e,t){return e.type===`text`?{type:`text`,text:e.text}:e.type===`file`?Ze(e.file,t,`user-message`):null}async function Xe(e,t){let n=[];for(let r of e){if(r.type===`text`){n.push(r.text);continue}if(r.file.kind===`text`){let e=await Z(r.file,{provider:`chatcompletions`,model:t.model,accepted:[`text`],purpose:`tool-result`,resolver:t.fileResolver,signal:t.signal});if(e.type!==`text`)throw Error(`Unsupported ChatCompletions text source: ${e.type}`);n.push(et(r.file,e.content,e.name,e.mimeType));continue}throw Error(`ChatCompletions tool results do not support file parts other than text`)}return n.join(`
|
|
9
|
-
`)}async function Ze(e,t,n){if(e.kind===`text`){let r=await Z(e,{provider:`chatcompletions`,model:t.model,accepted:[`text`],purpose:n,resolver:t.fileResolver,signal:t.signal});if(r.type!==`text`)throw Error(`Unsupported ChatCompletions text source: ${r.type}`);return{type:`text`,text:et(e,r.content,r.name,r.mimeType)}}if(e.kind===`document`){if(e.mimeType!==`application/pdf`)throw Error(`ChatCompletions document file inputs currently support PDF only. Received ${e.mimeType}`);let r=await Z(e,{provider:`chatcompletions`,model:t.model,accepted:[`url`,`base64`],purpose:n,resolver:t.fileResolver,signal:t.signal});return{type:`file`,file:{filename:r.name??e.name,file_data:$e(r,e)}}}return{type:`image_url`,image_url:{url:Qe(await Z(e,{provider:`chatcompletions`,model:t.model,accepted:[`url`,`base64`],purpose:n,resolver:t.fileResolver,signal:t.signal}),e)}}}function Qe(e,t){if(e.type===`url`)return e.url;if(e.type===`base64`)return`data:${e.mimeType??t.mimeType};base64,${e.data}`;throw Error(`Unsupported ChatCompletions image source: ${e.type}`)}function $e(e,t){if(e.type===`url`)return e.url;if(e.type===`base64`)return`data:${e.mimeType??t.mimeType};base64,${e.data}`;throw Error(`Unsupported ChatCompletions file source: ${e.type}`)}function et(e,t,n,r){return`File: ${n??e.name}\nMIME type: ${r??e.mimeType}\n\n${t}`}async function tt(e){let{baseUrl:t,model:n,messages:r,system:i,tools:a,context:o,apiKey:s,options:c,reasoning:l,signal:u}=e,d=o?.tracer,f;try{K(u,`Generate aborted`);let e=await Ve(r,i,{model:n,fileResolver:o?.fileResolver,signal:u}),p=Ue(a),m={model:n,messages:e,...p&&{tools:p},...He(l)};c&&(c.temperature!==void 0&&(m.temperature=c.temperature),c.top_p!==void 0&&(m.top_p=c.top_p),c.max_tokens!==void 0&&(m.max_tokens=c.max_tokens),c.frequency_penalty!==void 0&&(m.frequency_penalty=c.frequency_penalty),c.presence_penalty!==void 0&&(m.presence_penalty=c.presence_penalty),c.stop!==void 0&&(m.stop=c.stop),c.reasoning_effort!==void 0&&(m.reasoning_effort=c.reasoning_effort)),d?.debug(`ChatCompletions request`,{request:Y(m)});let h={"Content-Type":`application/json`};s&&(h.Authorization=`Bearer ${s}`);let g=await q(fetch(`${t}/chat/completions`,{method:`POST`,headers:h,body:JSON.stringify(m),signal:u}),u,`Generate aborted`);if(!g.ok){let e=await g.text().catch(()=>``);throw Error(`HTTP error! status: ${g.status}${e?` - ${e}`:``}`)}let _=await q(g.json(),u,`Generate aborted`);K(u,`Generate aborted`),f=nt(_)}catch(e){K(u,`Generate aborted`),d?.error(`Error fetching ChatCompletions response`,{error:e instanceof Error?e.message:String(e)}),f=X(e)}return d?.debug(`ChatCompletions response`,{result:f}),f}function nt(e){let t=e.choices?.[0];if(!t)return{type:`error`,error:{type:`ChatCompletionsError`,message:`No choices in response`},usage:{in:0,out:0},raw:e};let n=[];if(t.message.reasoning_content&&n.push({type:`thinking`,text:t.message.reasoning_content}),t.message.content&&n.push({type:`text`,text:t.message.content}),t.message.tool_calls)for(let e of t.message.tool_calls){let t;try{t=JSON.parse(e.function.arguments)}catch(t){throw Error(`Invalid tool call arguments for ${e.function.name}: ${t instanceof Error?t.message:String(t)}`)}if(typeof t!=`object`||!t||Array.isArray(t))throw Error(`Invalid tool call arguments for ${e.function.name}: expected object, got ${typeof t}`);n.push({type:`tool-call`,id:e.id,name:e.function.name,parameters:t})}let r=n.some(e=>e.type===`tool-call`)?We(`tool_calls`):We(t.finish_reason);return{type:`success`,id:e.id,model:e.model,role:`assistant`,finishReason:r,content:n,text:j(n),usage:{in:e.usage?.prompt_tokens||0,out:e.usage?.completion_tokens||0},raw:e}}function rt(){let e=new Map,t=0,n=-1,r=``,i=``,a=null,o,s;function c(e){n<0||(a===`text`?e.push({type:`text-complete`,data:{index:n}}):a===`thinking`&&e.push({type:`thinking-complete`,data:{index:n}}),a=null,n=-1)}function l(l){let u=[];l.usage&&(s={in:l.usage.prompt_tokens,out:l.usage.completion_tokens});let d=l.choices?.[0];if(!d)return u;r||(r=l.id,i=l.model,u.push({type:`start`,id:r,data:{model:i,timestamp:Date.now()}}));let f=d.delta;if(f.reasoning_content&&(a!==`thinking`&&(c(u),n=t++,a=`thinking`,u.push({type:`thinking-start`,data:{index:n}})),u.push({type:`thinking-delta`,data:{index:n,text:f.reasoning_content}})),f.content&&(a!==`text`&&(c(u),n=t++,a=`text`,u.push({type:`text-start`,data:{index:n}})),u.push({type:`text-delta`,data:{text:f.content,index:n}})),f.tool_calls){c(u);for(let n of f.tool_calls){let r=n.index;if(!e.has(r)){let i=t++,a=n.id||`tool-${i}`;e.set(r,{id:a,name:n.function?.name||``,argumentsBuffer:``,partIdx:i}),u.push({type:`tool-call-start`,data:{index:i,id:a,name:n.function?.name||``}})}let i=e.get(r);n.id&&(i.id=n.id),n.function?.name&&(i.name=n.function.name),n.function?.arguments&&(i.argumentsBuffer+=n.function.arguments,u.push({type:`tool-call-args-delta`,data:{index:i.partIdx,id:i.id,name:i.name,delta:n.function.arguments,accumulated:i.argumentsBuffer}}))}}if(d.finish_reason){c(u);for(let[,t]of e)try{let e=t.argumentsBuffer?JSON.parse(t.argumentsBuffer):{};u.push({type:`tool-call-complete`,data:{index:t.partIdx,id:t.id,name:t.name,arguments:e}})}catch(e){throw Error(`Failed to parse tool call arguments for ${t.name}: ${e instanceof Error?e.message:String(e)}\nRaw buffer: ${t.argumentsBuffer}`)}o=We(d.finish_reason)}return u}function u(){return o===void 0?[]:[{type:`complete`,data:{finishReason:o,usage:s??{in:0,out:0}}}]}return{handleChunk:l,finalize:u}}async function*it(e){let{baseUrl:t,model:n,messages:r,system:i,tools:a,context:o,signal:s,apiKey:c,options:l,reasoning:u}=e,d=o?.tracer;l?.providerTools&&d?.warn(`providerTools not supported by ChatCompletions provider`);let f=rt();try{let e=await Ve(r,i,{model:n,fileResolver:o?.fileResolver,signal:s}),p=Ue(a),m={model:n,messages:e,stream:!0,stream_options:{include_usage:!0},...p&&{tools:p},...He(u)};l&&(l.temperature!==void 0&&(m.temperature=l.temperature),l.top_p!==void 0&&(m.top_p=l.top_p),l.max_tokens!==void 0&&(m.max_tokens=l.max_tokens),l.frequency_penalty!==void 0&&(m.frequency_penalty=l.frequency_penalty),l.presence_penalty!==void 0&&(m.presence_penalty=l.presence_penalty),l.stop!==void 0&&(m.stop=l.stop),l.reasoning_effort!==void 0&&(m.reasoning_effort=l.reasoning_effort)),d?.debug(`ChatCompletions streaming request`,{request:Y(m)});let h={"Content-Type":`application/json`};c&&(h.Authorization=`Bearer ${c}`);let g=await fetch(`${t}/chat/completions`,{method:`POST`,headers:h,body:JSON.stringify(m),signal:s});if(!g.ok){let e=await g.text().catch(()=>``);throw Error(`HTTP error! status: ${g.status}${e?` - ${e}`:``}`)}if(!g.body)throw Error(`Response body is null`);let _=g.body.getReader(),v=new TextDecoder,y=``;for(;;){let{done:e,value:t}=await _.read();if(e)break;y+=v.decode(t,{stream:!0});let n=y.split(`
|
|
10
|
-
`);y=n.pop()||``;for(let e of n){let t=e.trim();if(!t||t.startsWith(`:`)||!t.startsWith(`data: `))continue;let n=t.slice(6);if(n!==`[DONE]`)try{let e=JSON.parse(n),t=f.handleChunk(e);for(let e of t)yield e}catch(e){d?.error(`Error parsing ChatCompletions stream chunk`,{error:e instanceof Error?e.message:String(e),line:t})}}}for(let e of f.finalize())yield e}catch(e){if(s?.aborted)return;d?.error(`Error in ChatCompletions streaming request`,{error:e instanceof Error?e.message:String(e)}),yield{type:`error`,data:{type:`STREAMING_ERROR`,message:e instanceof Error?e.message:String(e),raw:e}}}}function at(e,t){return{name:`ChatCompletions`,async createGenerationRequest(n,r){return await tt({baseUrl:e,model:n,apiKey:t,...r})},createStreamingRequest(n,r){return it({baseUrl:e,model:n,apiKey:t,...r})}}}function ot(e,t,n){let r={};return t&&(r.systemInstruction=t),e&&e.length>0&&(r.tools=e.map(e=>({functionDeclarations:[{name:e.name,description:e.description,parametersJsonSchema:f.toJSONSchema(e.schema)}]}))),n&&Object.assign(r,n),r}function st(e){return e===!0?{thinkingConfig:{thinkingBudget:8192,includeThoughts:!0}}:e===!1?{thinkingConfig:{thinkingBudget:0}}:{}}async function ct(e,t={model:``}){return(await Promise.all(e.map(e=>lt(e,t)))).filter(e=>e!==void 0)}async function lt(e,t){switch(e.role){case`tool`:return ut(e,t);case`assistant`:return dt(e);case`user`:return ft(e,t)}}async function ut(e,t){return{role:`user`,parts:(await Promise.all(e.content.map(async e=>{let n=typeof e.content==`string`?e.content:e.content.filter(e=>e.type===`text`).map(e=>e.text).join(`
|
|
11
|
-
`),r={functionResponse:{id:e.id??void 0,name:e.name,response:{output:n}}};return typeof e.content==`string`?[r]:[r,...await Promise.all(e.content.filter(e=>e.type===`file`).map(e=>mt(e.file,t,`tool-result`)))]}))).flat(1)}}function dt(e){let t=[],n=e.content.filter(e=>e.type===`text`);if(n.length>0){let e=n.map(e=>e.text).join(``);e&&t.push({text:e})}let r=e.content.filter(e=>e.type===`tool-call`);return r.length>0&&t.push(...r.map(e=>{let t={functionCall:{id:e.id??void 0,name:e.name,args:e.parameters}};return e.providerMetadata?.thoughtSignature&&(t.thoughtSignature=e.providerMetadata.thoughtSignature),t})),{role:`model`,parts:t}}async function ft(e,t){return typeof e.content==`string`?{role:`user`,parts:[{text:e.content}]}:{role:`user`,parts:(await Promise.all(e.content.map(e=>pt(e,t)))).filter(e=>e!==null)}}async function pt(e,t){return e.type===`text`?{text:e.text}:e.type===`file`?mt(e.file,t,`user-message`):null}async function mt(e,t,n){if(e.kind===`text`){let r=await Z(e,{provider:`gemini`,model:t.model,accepted:[`text`],purpose:n,resolver:t.fileResolver,signal:t.signal});if(r.type!==`text`)throw Error(`Unsupported Gemini text source: ${r.type}`);return{text:gt(e,r.content,r.name,r.mimeType)}}if(e.kind===`document`&&e.mimeType!==`application/pdf`)throw Error(`Gemini document file support is limited to PDFs. Received ${e.mimeType}`);return ht(await Z(e,{provider:`gemini`,model:t.model,accepted:[`gemini-file-uri`,`url`,`base64`],purpose:n,resolver:t.fileResolver,signal:t.signal}),e)}function ht(e,t){if(e.type===`base64`)return{inlineData:{mimeType:e.mimeType??t.mimeType,data:e.data}};if(e.type===`url`)return{fileData:{mimeType:e.mimeType??t.mimeType,fileUri:e.url}};if(e.type===`gemini-file-uri`)return{fileData:{mimeType:e.mimeType??t.mimeType,fileUri:e.uri}};throw Error(`Unsupported Gemini file source: ${e.type}`)}function gt(e,t,n,r){return`File: ${n??e.name}\nMIME type: ${r??e.mimeType}\n\n${t}`}function _t(e){switch(e){case g.STOP:return[!0,`stop`];case g.MAX_TOKENS:return[!0,`length`];case g.FINISH_REASON_UNSPECIFIED:case g.SAFETY:case g.RECITATION:case g.LANGUAGE:case g.OTHER:case g.BLOCKLIST:case g.PROHIBITED_CONTENT:case g.SPII:case g.MALFORMED_FUNCTION_CALL:case g.IMAGE_SAFETY:return[!1,`error`]}return[!1,`error`]}async function vt(e){let{client:t,model:n,messages:r,system:i,tools:a,context:o,options:s,reasoning:c,signal:l}=e,u=o?.tracer,d={...st(c),...s??{}};d.max_tokens&&(d.maxOutputTokens=d.max_tokens,delete d.max_tokens),d.stop&&(d.stopSequences=Array.isArray(d.stop)?d.stop:[d.stop],delete d.stop),d.top_p!==void 0&&(d.topP=d.top_p,delete d.top_p);let f;try{K(l,`Generate aborted`);let e={contents:await ct(r,{model:n,fileResolver:o?.fileResolver,signal:l}),config:ot(a,i,d)};u?.debug(`Gemini request`,{request:Y(e)});let s=await q(t.models.generateContent({model:n,...e}),l,`Generate aborted`);K(l,`Generate aborted`),f=yt(s,{tracer:u})}catch(e){K(l,`Generate aborted`),u?.error(e instanceof Error?e.message:String(e)),f=X(e)}return u?.debug(`Gemini response`,{result:f}),f}function yt(e,t){let{tracer:n}=t,r=e.usageMetadata?.promptTokenCount??0,i={in:r,out:(e.usageMetadata?.totalTokenCount??r)-r};if(!e)return{type:`error`,error:{type:`InvalidResponse`,message:`Invalid or empty response from Google AI`},usage:{in:0,out:0},raw:e};if(e.promptFeedback&&e.promptFeedback.blockReason)return{type:`error`,error:{type:`Blocked`,message:`Response blocked by Google AI: ${e.promptFeedback.blockReason}, ${e.promptFeedback.blockReasonMessage}`},usage:i,raw:e};if(!e.candidates||e.candidates.length===0)return{type:`error`,error:{type:`InvalidResponse`,message:`Invalid or empty response from Google AI`},usage:{in:0,out:0},raw:e};e.candidates.length>1&&n?.warn(`We received ${e.candidates.length} response candidates`);let a=e.candidates[0],o=(a.content?.parts||[]).map(e=>e.text).filter(e=>e!==void 0).join(``),[s,c]=_t(a.finishReason);if(s){let t=[];if(o&&t.push({type:`text`,text:o}),e.functionCalls)for(let n of e.functionCalls)if(n.args==null)t.push({type:`tool-call`,id:n.id??``,name:n.name??``,parameters:{}});else if(typeof n.args!=`object`||Array.isArray(n.args))throw Error(`Invalid tool call arguments for ${n.name}: expected object, got ${typeof n.args}`);else t.push({type:`tool-call`,id:n.id??``,name:n.name??``,parameters:n.args});return{type:`success`,id:e.responseId??``,model:e.modelVersion??``,role:`assistant`,finishReason:e.functionCalls?`function_call`:c,content:t,text:j(t),usage:i,raw:e}}else return{type:`error`,error:{type:`Undetermined`,message:`Unexpected stop reason: ${c}`},usage:i,raw:e}}function bt(){let e=0,t=-1,n=!1,r=``,i=``,a=0,o=0,s=null;function c(e){t<0||(s===`text`?e.push({type:`text-complete`,data:{index:t}}):s===`thinking`&&e.push({type:`thinking-complete`,data:{index:t}}),s=null,t=-1)}function l(l){let u=[];r||(r=l.responseId||`gemini-${Date.now()}`,i=l.modelVersion||`gemini`,u.push({type:`start`,id:r,data:{model:i,timestamp:Date.now()}})),l.usageMetadata&&(a=l.usageMetadata.promptTokenCount||0,o=(l.usageMetadata.totalTokenCount||0)-a);let d=l.candidates?.[0];if(!d)return u;let f=d.content?.parts||[];for(let r of f){let i=`thought`in r&&r.thought===!0,a=Object.keys(r);if(!(`thoughtSignature`in r&&!r.text&&!r.functionCall||a.length===2&&`text`in r&&`thoughtSignature`in r&&!r.text)&&(i&&r.text?(s!==`thinking`&&(c(u),t=e++,s=`thinking`,u.push({type:`thinking-start`,data:{index:t}})),u.push({type:`thinking-delta`,data:{index:t,text:r.text}})):r.text&&!i?(s!==`text`&&(c(u),t=e++,s=`text`,u.push({type:`text-start`,data:{index:t}})),u.push({type:`text-delta`,data:{text:r.text,index:t}})):r.functionCall||console.log(`[gemini] unhandled part type: ${JSON.stringify(Object.keys(r))}`),r.functionCall)){c(u),n=!0;let t=e++,i=r.functionCall.id||`tool-${t}`,a=r.functionCall.name??``;u.push({type:`tool-call-start`,data:{index:t,id:i,name:a}});let o=r.functionCall.args??{},s=JSON.stringify(o);u.push({type:`tool-call-args-delta`,data:{index:t,id:i,name:a,delta:s,accumulated:s}});let l={index:t,id:i,name:a,arguments:o},d=r;d.thoughtSignature&&(l.providerMetadata={thoughtSignature:d.thoughtSignature}),u.push({type:`tool-call-complete`,data:l})}}if(d.finishReason&&d.finishReason!==g.FINISH_REASON_UNSPECIFIED){c(u);let[e,t]=_t(d.finishReason),r=n?`function_call`:t;!e&&!n?u.push({type:`error`,data:{type:`FinishReasonError`,message:`Unexpected finish reason: ${d.finishReason}`,usage:{in:a,out:o},raw:l}}):u.push({type:`complete`,data:{finishReason:r,usage:{in:a,out:o}}})}return u}return{handleChunk:l}}async function*xt(e){let{client:t,model:n,messages:r,system:i,tools:a,context:o,signal:s,options:c,reasoning:l}=e,u=o?.tracer,{providerTools:d,...f}=c??{},p={...st(l),...f};p.max_tokens&&(p.maxOutputTokens=p.max_tokens,delete p.max_tokens),p.stop&&(p.stopSequences=Array.isArray(p.stop)?p.stop:[p.stop],delete p.stop),p.top_p!==void 0&&(p.topP=p.top_p,delete p.top_p);let m=ot(a,i,p);if(d){let e={web_search:`googleSearch`,code_execution:`codeExecution`};m.tools||=[];for(let t of d){let n=e[t.name]??t.name;m.tools.push({[n]:t.config??{}})}}let h=bt();try{let e={contents:await ct(r,{model:n,fileResolver:o?.fileResolver,signal:s}),config:m};u?.debug(`Gemini streaming request`,{request:Y(e)});let i=await t.models.generateContentStream({model:n,...e});for await(let e of i){let t=h.handleChunk(e);for(let e of t)yield e}}catch(e){if(s?.aborted)return;u?.error(e instanceof Error?e.message:String(e)),yield{type:`error`,data:{type:`STREAMING_ERROR`,message:e instanceof Error?e.message:String(e),raw:e}}}}function St(e){let t=new _({apiKey:e});return{name:`Gemini`,async createGenerationRequest(e,n){return await vt({client:t,model:e,...n})},createStreamingRequest(e,n){return xt({client:t,model:e,...n})}}}async function Ct(e){let{provider:t,model:n,messages:r,system:i,tools:a,tracer:o,fileResolver:s,options:c,reasoning:l,signal:u}=e;return t.createGenerationRequest(n,{messages:r,system:i,tools:a,context:{tracer:o,fileResolver:s},options:c,reasoning:l,signal:u})}async function wt(e){let{provider:t,model:n,messages:r,system:i,onToolCall:a,maxIterations:o,tracer:s,fileResolver:c,options:l,reasoning:u,signal:d=new AbortController().signal}=e,f=I(e),p=[...r],m=[],h={in:0,out:0},g=0,_,v=e=>{p.push(e),m.push(e)},y=e=>(s?.setResult({kind:`llm`,model:n,request:{messages:r},response:{content:e.result===`success`?e.final?.content:null},usage:e.usage?{inputTokens:e.usage.in,outputTokens:e.usage.out}:void 0,finishReason:e.result===`success`?e.final?.finishReason:void 0}),s?.end(e.result===`error`?`error`:`ok`),e),b=(e,t)=>{if(!e||t.type===`error`){e?.end(`error`);return}e.setResult({kind:`llm`,model:t.model??n,request:{messages:p},response:{content:t.content},usage:t.usage?{inputTokens:t.usage.in,outputTokens:t.usage.out}:void 0,finishReason:t.finishReason}),e.end()};try{for(;;){if(K(d,`Generate aborted`),o!==void 0&&g>=o)return y({result:`error`,messages:m,error:{type:`model`,error:{type:`error`,error:{type:`MaxIterations`,message:`Exceeded max iterations (${o})`}}},usage:h});g+=1;let e=s?.startSpan(`turn-${g}`,{type:`llm`}),r=f.executable(),x=r.length>0?r.map(e=>({name:e.name,description:e.description,schema:e.schema})):void 0,S;try{S=await Ct({provider:t,model:n,messages:p,system:i,tools:x,tracer:e,fileResolver:c,options:l,reasoning:u,signal:d}),K(d,`Generate aborted`)}catch(t){throw t instanceof Error&&t.name===`AbortError`&&e?.end(`ok`),t}if(P(h,S),b(e,S),S.type===`error`)return y({result:`error`,messages:m,error:{type:`model`,error:S},usage:h});let C={role:`assistant`,id:S.id,model:S.model,content:S.content,finishReason:S.finishReason};if(v(C),_=C,S.finishReason!==`function_call`)return y({result:`success`,messages:m,final:_,usage:h});let w=M(S.content);if(w.length===0)return y({result:`success`,messages:m,final:_,usage:h});let{results:T}=await ee(w,a,d,f,s);K(d,`Generate aborted`),T.length>0&&v({role:`tool`,id:crypto.randomUUID(),content:T})}}catch(e){throw e instanceof O?(s?.end(`ok`),new O(`Generate aborted`,{reason:e.reason,messages:e.messages??m,partial:e.partial,usage:e.usage??h})):e instanceof Error&&e.name===`AbortError`?(s?.end(`ok`),new O(`Generate aborted`,{reason:d.reason,messages:m,usage:h})):e}}function Tt(e){if(e&&e.length>0)return e.map(e=>({type:`function`,strict:!0,name:e.name,description:e.description,parameters:f.toJSONSchema(e.schema)}))}function Et(e){return e===!0?{reasoning:{effort:`high`}}:e===!1?{reasoning:{effort:`minimal`}}:{}}async function Dt(e,t={model:``}){return(await Promise.all(e.map(e=>Ot(e,t)))).flat(1)}async function Ot(e,t){switch(e.role){case`tool`:return kt(e,t);case`assistant`:return At(e);default:return jt(e,t)}}async function kt(e,t){return Promise.all(e.content.map(async e=>({type:`function_call_output`,call_id:e.id,output:typeof e.content==`string`?e.content:await Promise.all(e.content.map(e=>e.type===`text`?Promise.resolve({type:`input_text`,text:e.text}):Nt(e.file,t,`tool-result`)))})))}function At(e){let t=[],n=j(e.content);n&&t.push({role:e.role,content:n});let r=e.content.filter(e=>e.type===`tool-call`);for(let e of r)t.push({type:`function_call`,call_id:e.id,name:e.name,arguments:JSON.stringify(e.parameters)});let i=e.content.filter(e=>e.type===`provider-tool`);for(let e of i)e.output!=null&&t.push(e.output);return t}async function jt(e,t){if(typeof e.content==`string`)return{role:e.role,content:e.content};{let n=(await Promise.all(e.content.map(e=>Mt(e,t)))).filter(e=>e!==null);return{role:e.role,content:n}}}async function Mt(e,t){return e.type===`text`?{type:`input_text`,text:e.text}:e.type===`file`?Nt(e.file,t,`user-message`):(e.type,null)}async function Nt(e,t,n){if(e.kind===`image`)return{type:`input_image`,image_url:Pt(await Z(e,{provider:`openai`,model:t.model,accepted:[`url`,`base64`],purpose:n,resolver:t.fileResolver,signal:t.signal}),e),detail:`auto`};if(e.kind===`document`){if(e.mimeType!==`application/pdf`)throw Error(`OpenAI file inputs currently support PDF documents. Received ${e.mimeType}`);return Ft(await Z(e,{provider:`openai`,model:t.model,accepted:[`url`,`base64`],purpose:n,resolver:t.fileResolver,signal:t.signal}),e)}let r=await Z(e,{provider:`openai`,model:t.model,accepted:[`text`,`url`,`base64`],purpose:n,resolver:t.fileResolver,signal:t.signal});return r.type===`text`?{type:`input_text`,text:r.content}:Ft(r,e)}function Pt(e,t){if(e.type===`url`)return e.url;if(e.type===`base64`)return`data:${e.mimeType??t.mimeType};base64,${e.data}`;throw Error(`Unsupported OpenAI image source: ${e.type}`)}function Ft(e,t){if(e.type===`url`)return{type:`input_file`,filename:e.name??t.name,file_url:e.url};if(e.type===`base64`)return{type:`input_file`,filename:e.name??t.name,file_data:`data:${e.mimeType??t.mimeType};base64,${e.data}`};throw Error(`Unsupported OpenAI file source: ${e.type}`)}async function It(e){let{client:t,model:n,messages:r,system:i,tools:a,context:o,options:s,reasoning:c,signal:l}=e,u=o?.tracer,d;try{K(l,`Generate aborted`);let e=Tt(a),f={model:n,input:await Dt(r,{model:n,fileResolver:o?.fileResolver,signal:l}),...i&&{instructions:i},...e?{tools:e}:{},...Et(c),...s};u?.debug(`OpenAI ResponsesAPI request`,{request:Y(f)});let p=await q(t.responses.create(f,...l?[{signal:l}]:[]),l,`Generate aborted`);K(l,`Generate aborted`),d=Lt(p)}catch(e){K(l,`Generate aborted`),u?.error(e instanceof Error?e.message:String(e)),d=X(e)}return u?.debug(`OpenAI ResponsesAPI response`,{result:d}),d}function Lt(e){if(e.error)return{type:`error`,error:{type:e.error.code||`undetermined`,message:e.error.message||`Response generation failed`},usage:{in:e.usage?.input_tokens??0,out:e.usage?.output_tokens??0},raw:e};let t=e.output?.filter(e=>e.type===`reasoning`)?.map(e=>e),n=[];if(t&&t.length>0)for(let e of t){let t=e.summary?.[0]?.text||e.content?.[0]?.text||``;(t||e.encrypted_content)&&n.push({type:`thinking`,text:t,...e.encrypted_content&&{encrypted:e.encrypted_content}})}e.output_text&&n.push({type:`text`,text:e.output_text});let r=e.output?.filter(e=>e.type===`function_call`);if(r&&r.length>0)for(let e of r){let t=e;try{n.push({type:`tool-call`,id:t.id||``,name:t.name||``,parameters:t.arguments?JSON.parse(t.arguments):{}})}catch(e){throw Error(`Failed to parse tool call arguments for ${t.name}: ${e instanceof Error?e.message:String(e)}\nRaw value: ${t.arguments}`)}}return{type:`success`,id:e.id,model:e.model||``,role:`assistant`,finishReason:e.incomplete_details?`error`:`stop`,content:n,text:j(n),usage:{in:e.usage?.input_tokens??0,out:e.usage?.output_tokens??0},raw:e}}function Rt(){let e=``,t=``,n=0,r=-1,i=!1,a=new Map,o=new Map,s=new Set([`web_search_call`,`file_search_call`,`code_interpreter_call`]),c=new Map;function l(l){let u=[];switch(l.type){case`response.created`:e=l.response.id||`openai-${Date.now()}`,t=l.response.model,u.push({type:`start`,id:e,data:{model:t,timestamp:Date.now()}});break;case`response.output_text.delta`:r===-1&&(r=n++,u.push({type:`text-start`,data:{index:r}})),u.push({type:`text-delta`,data:{text:l.delta,index:r}});break;case`response.output_text.done`:r>=0&&(u.push({type:`text-complete`,data:{index:r}}),r=-1);break;case`response.function_call_arguments.delta`:{let e=l.item_id;if(!c.has(e)){let t=a.get(e),r=t?.name||``,i=t?.callId||e,o=n++;c.set(e,{id:e,callId:i,name:r,argumentsBuffer:``,partIdx:o}),u.push({type:`tool-call-start`,data:{index:o,id:i,name:r}})}let t=c.get(e);t.argumentsBuffer+=l.delta,u.push({type:`tool-call-args-delta`,data:{index:t.partIdx,id:t.callId,name:t.name,delta:l.delta,accumulated:t.argumentsBuffer}});break}case`response.function_call_arguments.done`:{i=!0;let e=l.item_id,t=c.get(e),n=l.name||t?.name||``;if(t){try{let e=l.arguments?JSON.parse(l.arguments):{};u.push({type:`tool-call-complete`,data:{index:t.partIdx,id:t.callId,name:n,arguments:e}})}catch(e){throw Error(`Failed to parse function call arguments for ${n}: ${e instanceof Error?e.message:String(e)}\nRaw value: ${l.arguments}`)}c.delete(e)}break}case`response.completed`:{let e=l.response.usage;u.push({type:`complete`,data:{finishReason:l.response.incomplete_details?`error`:i?`function_call`:`stop`,usage:{in:e?.input_tokens||0,out:e?.output_tokens||0}}});break}case`response.failed`:u.push({type:`error`,data:{type:`RESPONSES_API_ERROR`,message:`Response failed: ${l.response.status}`,raw:l}});break;case`response.output_item.added`:if(l.item?.type===`reasoning`)r=n++,u.push({type:`thinking-start`,data:{index:r}});else if(l.item?.type===`function_call`){let e=l.item,t=e.id||e.call_id;t&&a.set(t,{name:e.name||``,callId:e.call_id||t})}else if(l.item&&s.has(l.item.type)){let e=l.item,t=n++;o.set(e.id,t),u.push({type:`provider-tool-start`,data:{index:t,id:e.id,name:e.type}})}break;case`response.output_item.done`:if(l.item?.type===`reasoning`&&r>=0)u.push({type:`thinking-complete`,data:{index:r}}),r=-1;else if(l.item&&s.has(l.item.type)){let e=l.item,t=o.get(e.id);t!==void 0&&(u.push({type:`provider-tool-complete`,data:{index:t,id:e.id,name:e.type,output:l.item}}),o.delete(e.id))}break;case`response.reasoning_text.delta`:l.delta&&u.push({type:`thinking-delta`,data:{index:r,text:l.delta}});break;case`response.reasoning_summary_text.delta`:l.delta&&u.push({type:`thinking-summary-delta`,data:{index:r,text:l.delta}});break;case`response.in_progress`:case`response.content_part.added`:case`response.content_part.done`:case`response.reasoning_summary_part.added`:case`response.reasoning_summary_part.done`:case`response.reasoning_summary_text.done`:case`response.reasoning_text.done`:case`response.web_search_call.in_progress`:case`response.web_search_call.searching`:case`response.web_search_call.completed`:break;default:console.log(`[OpenAI] unhandled stream event: ${l.type}`)}return u}return{handleEvent:l}}async function*zt(e){let{client:t,model:n,messages:r,system:i,tools:a,context:o,signal:s,options:c,reasoning:l}=e,u=o?.tracer,{providerTools:d,...f}=c??{},p=Tt(a)??[];if(d){let e={web_search:`web_search_preview`,code_execution:`code_interpreter`};for(let t of d){let n=e[t.name]??t.name;p.push({type:n,...t.config})}}let m=Rt();try{let e={model:n,input:await Dt(r,{model:n,fileResolver:o?.fileResolver,signal:s}),...i&&{instructions:i},stream:!0,...p.length>0?{tools:p}:{},...Et(l),...f};u?.debug(`OpenAI ResponsesAPI streaming request`,{request:Y(e)});let a=t.responses.stream(e,...s?[{signal:s}]:[]);for await(let e of a){let t=m.handleEvent(e);for(let e of t)yield e}}catch(e){if(s?.aborted)return;u?.error(e instanceof Error?e.message:String(e)),yield{type:`error`,data:{type:`STREAMING_ERROR`,message:e instanceof Error?e.message:String(e),raw:e}}}}function Bt(e){let t=new v({apiKey:e});return{name:`OpenAI`,async createGenerationRequest(e,n){return await It({client:t,model:e,...n})},createStreamingRequest(e,n){return zt({client:t,model:e,...n})}}}const Vt=d.object({searchTerm:d.string().describe(`The search term to query`)}),Ht=new class{name=`brave`;description=`Perform a search using the Brave search engine`;schema=Vt;apiKey;throttle;lastExecTime=0;constructor(e){e&&this.configure(e)}configure(e){let{rateLimit:t}=e;this.apiKey=e[`api-key`],this.throttle=t?1100/t:void 0}async execute(e,t){let{searchTerm:n}=e;if(this.throttle){for(;Date.now()-this.lastExecTime<this.throttle;)await ie(this.throttle-(Date.now()-this.lastExecTime));this.lastExecTime=Date.now()}try{let e=this.apiKey,t=new URL(`https://api.search.brave.com/res/v1/web/search`);t.searchParams.append(`q`,n),t.searchParams.append(`format`,`json`);let r=await fetch(t.toString(),{method:`GET`,headers:{Accept:`application/json`,"X-Subscription-Token":e??``}});if(!r.ok)throw Error(`[Brave] HTTP error ${r.status}: ${r.statusText}`);let i=await r.json();return JSON.stringify(i)}catch(e){throw e instanceof Error?Error(`[Brave] Error fetching search results: ${e.message}`):e}}},Ut={name:`calculator`,description:`Performs basic arithmetic operations`,schema:p.object({operation:p.enum([`add`,`subtract`,`multiply`,`divide`]).describe(`The operation to perform (add, subtract, multiply, divide)`),a:p.number().describe(`First operand`),b:p.number().describe(`Second operand`)}),execute:async({operation:e,a:t,b:n})=>{switch(e){case`add`:return`${t} + ${n} = ${t+n}`;case`subtract`:return`${t} - ${n} = ${t-n}`;case`multiply`:return`${t} * ${n} = ${t*n}`;case`divide`:if(n===0)throw Error(`Cannot divide by zero`);return`${t} / ${n} = ${t/n}`;default:throw Error(`Unknown operation: ${e}`)}}};async function Wt(e,t={}){let n=t.timeout??3e4,r=t.maxBuffer??1048576;return new Promise((i,a)=>{let o=y(e,[],{shell:!0,cwd:t.cwd}),s=``,c=``,l=!1,u=!1,d=!1,f=setTimeout(()=>{l=!0,o.kill(`SIGTERM`)},n),p=()=>{u=!0,o.kill(`SIGTERM`)};t.signal?.addEventListener(`abort`,p);let m=()=>{clearTimeout(f),t.signal?.removeEventListener(`abort`,p)};o.stdout?.setEncoding(`utf-8`),o.stderr?.setEncoding(`utf-8`),o.stdout?.on(`data`,e=>{if(s+=e,s.length+c.length>r){d=!0,o.kill(`SIGTERM`);return}t.onChunk?.(e)}),o.stderr?.on(`data`,e=>{if(c+=e,s.length+c.length>r){d=!0,o.kill(`SIGTERM`);return}t.onChunk?.(e)}),o.on(`error`,e=>{m(),a(e)}),o.on(`close`,e=>{if(m(),l){let e=Error(`Command timed out after ${n}ms`);e.stdout=s,e.stderr=c,a(e);return}if(u){let e=Error(`Command aborted`);e.stdout=s,e.stderr=c,a(e);return}if(d){let e=Error(`Command output exceeded maxBuffer (${r} bytes)`);e.stdout=s,e.stderr=c,a(e);return}if(e!==0){let t=Error(`Command failed with exit code ${e}`);t.stdout=s,t.stderr=c,t.code=e??-1,a(t);return}i({stdout:s,stderr:c})})})}function Gt(e){if(e instanceof Error){let t=e,n=`Error executing command: ${e.message}`;return t.stdout&&(n+=`\n[stdout]: ${t.stdout}`),t.stderr&&(n+=`\n[stderr]: ${t.stderr}`),n}return`Error executing command: ${String(e)}`}function Kt(e,t){return t&&t.trim()?`${e}\n[stderr]: ${t}`:e}const qt=d.object({command:d.string().describe(`The shell command to execute`)}),Jt=new class{name=`exec`;description=`Execute a shell command and return the output.`;schema=qt;timeout=3e4;maxBuffer=1024*1024;cwd;constructor(e){e&&this.configure(e)}configure(e){this.timeout=e.timeout??3e4,this.maxBuffer=e.maxBuffer??1024*1024,this.cwd=e.cwd}summarize(e){return e.command}async execute(e,t){let{command:n}=e;try{let e=await Wt(n,{timeout:this.timeout,maxBuffer:this.maxBuffer,cwd:this.cwd,signal:t.signal,onChunk:e=>t.emit(e)});return Kt(e.stdout,e.stderr)}catch(e){return Gt(e)}}},Yt={name:`patch-file`,description:`Patch a file by replacing an exact string match within a specified line range`,schema:p.object({path:p.string().describe(`The file path to patch`),old_string:p.string().describe(`The exact text to find and replace`),new_string:p.string().describe(`The replacement text`),start_line:p.number().int().positive().describe(`1-indexed start line of the region to match within`),end_line:p.number().int().positive().describe(`1-indexed end line (inclusive) of the region to match within`)}),summarize:({path:e,start_line:t,end_line:n})=>`${e}:${t}:${n}`,execute:async({path:e,old_string:t,new_string:n,start_line:r,end_line:a})=>{if(a<r)throw Error(`end_line (${a}) must be >= start_line (${r})`);let s;try{s=await i(e,`utf-8`)}catch(t){throw t instanceof Error?Error(`Failed to read file "${e}": ${t.message}`):t}let c=s.split(`
|
|
12
|
-
`);if(r>c.length)throw Error(`start_line (${r}) exceeds file length (${c.length} lines)`);if(a>c.length)throw Error(`end_line (${a}) exceeds file length (${c.length} lines)`);let l=c.slice(r-1,a).join(`
|
|
13
|
-
`),u=l.indexOf(t);if(u===-1)throw Error(`old_string not found within lines ${r}-${a} of "${e}"`);if(l.indexOf(t,u+1)!==-1)throw Error(`old_string matches multiple times within lines ${r}-${a} of "${e}"`);let d=l.replace(t,n),f=[...c.slice(0,r-1),...d.split(`
|
|
14
|
-
`),...c.slice(a)].join(`
|
|
15
|
-
`);try{await o(e,f,`utf-8`)}catch(t){throw t instanceof Error?Error(`Failed to write file "${e}": ${t.message}`):t}return`Successfully patched "${e}" (lines ${r}-${a})`}},Xt={name:`read-file`,description:`Read the contents of a file from disk`,schema:p.object({path:p.string().describe(`The file path to read from`)}),summarize:({path:e})=>e,execute:async({path:e})=>{try{return await i(e,`utf-8`)}catch(t){throw t instanceof Error?Error(`Failed to read file "${e}": ${t.message}`):t}}},Zt={name:`write-file`,description:`Write content to a file on disk, creating directories if needed`,schema:p.object({path:p.string().describe(`The file path to write to`),content:p.string().describe(`The content to write to the file`)}),summarize:({path:e})=>e,execute:async({path:e,content:t})=>{try{return await r(c(e),{recursive:!0}),await o(e,t,`utf-8`),`Successfully wrote ${t.length} characters to "${e}"`}catch(t){throw t instanceof Error?Error(`Failed to write file "${e}": ${t.message}`):t}}};function Qt(e){try{let t=f.fromJSONSchema(e);return t instanceof f.ZodObject?t.strict():f.object({}).passthrough()}catch{return f.object({}).passthrough()}}function $t(e,t,n){return e.map(e=>tn(e,t,n))}function en(e,t){return e.map(e=>{let n=t?`${t}_${e.name}`:e.name,r=Qt(e.inputSchema);return{name:n,description:e.description??``,schema:r}})}function tn(e,t,n){let r=n?`${n}_${e.name}`:e.name,i=Qt(e.inputSchema);return{name:r,description:e.description??``,schema:i,async execute(n){let r=await t.callTool({name:e.name,arguments:n});if(`isError`in r&&r.isError)throw Error(rn(r.content));return nn(r.content)}}}function nn(e){return e.some(e=>e.type===`image`)?e.filter(e=>e.type===`text`||e.type===`image`).map(e=>{if(e.type===`text`)return{type:`text`,text:e.text};let t=e;return{type:`file`,file:{kind:`image`,mimeType:t.mimeType,name:`mcp-image`,source:{type:`base64`,data:t.data}}}}):e.filter(e=>e.type===`text`).map(e=>e.text).join(`
|
|
16
|
-
`)}function rn(e){return e.filter(e=>e.type===`text`).map(e=>e.text).join(`
|
|
17
|
-
`)||`MCP tool execution error`}var an=class{config;client;transport;cachedMcpTools;_connected=!1;constructor(e){this.config=e}get name(){return this.config.name??this.client?.getServerVersion()?.name}get connected(){return this._connected}async connect(e){if(this._connected)return;let t=e?.tracer?.startSpan(`mcp:connect`,{type:`internal`});this.client=new b({name:`axle`,version:`1.0.0`}),this.config.transport===`stdio`?this.transport=new x({command:this.config.command,args:this.config.args,env:this.config.env}):this.transport=new S(new URL(this.config.url),{requestInit:this.config.headers?{headers:this.config.headers}:void 0});try{await this.client.connect(this.transport),this._connected=!0,t?.end(`ok`)}catch(e){throw t?.end(`error`),e}}async listTools(e){let t=this.assertConnected();return $t(await this.fetchTools(t,e?.tracer),t,e?.prefix)}async listToolDefinitions(e){let t=this.assertConnected();return en(await this.fetchTools(t,e?.tracer),e?.prefix)}async refreshTools(){return this.assertConnected(),this.cachedMcpTools=void 0,this.listTools()}async close(e){this._connected&&(e?.tracer?.debug(`mcp:close`),await this.client?.close(),this._connected=!1,this.client=void 0,this.transport=void 0,this.cachedMcpTools=void 0)}async fetchTools(e,t){if(this.cachedMcpTools)return this.cachedMcpTools;t?.debug(`mcp:listTools`);let n=await e.listTools();return this.cachedMcpTools=n.tools.map(e=>({name:e.name,description:e.description,inputSchema:e.inputSchema})),this.cachedMcpTools}assertConnected(){if(!this._connected||!this.client)throw Error(`MCP not connected. Call connect() first.`);return this.client}};const on={debug:0,info:1,warn:2,error:3};var sn=class{writers=[];_minLevel=`info`;get minLevel(){return this._minLevel}set minLevel(e){this._minLevel=e}addWriter(e){this.writers.includes(e)||this.writers.push(e)}removeWriter(e){let t=this.writers.indexOf(e);t!==-1&&this.writers.splice(t,1)}startSpan(e,t){let n={traceId:crypto.randomUUID(),spanId:crypto.randomUUID(),name:e,type:t?.type,startTime:performance.now(),status:`ok`,attributes:{},events:[]};return this.writers.forEach(e=>e.onSpanStart(n)),new cn(n,this)}async flush(){for(let e of this.writers)e.flush&&await e.flush()}_notifySpanEnd(e){this.writers.forEach(t=>t.onSpanEnd(e))}_notifySpanUpdate(e){this.writers.forEach(t=>t.onSpanUpdate?.(e))}_notifyEvent(e,t){this.writers.forEach(n=>n.onEvent?.(e,t))}_notifySpanStart(e){this.writers.forEach(t=>t.onSpanStart(e))}_shouldLog(e){return on[e]>=on[this._minLevel]}},cn=class e{data;tracer;ended=!1;constructor(e,t){this.data=e,this.tracer=t}startSpan(t,n){let r={traceId:this.data.traceId,spanId:crypto.randomUUID(),parentSpanId:this.data.spanId,name:t,type:n?.type,startTime:performance.now(),status:`ok`,attributes:{},events:[]};return this.tracer._notifySpanStart(r),new e(r,this.tracer)}end(e=`ok`){this.ended||(this.ended=!0,this.data.endTime=performance.now(),this.data.status=e,this.tracer._notifySpanEnd(this.data))}addEvent(e,t,n){if(this.ended||!this.tracer._shouldLog(t))return;let r={name:e,timestamp:performance.now(),level:t,attributes:n};this.data.events.push(r),this.tracer._notifyEvent(this.data,r)}debug(e,t){this.addEvent(e,`debug`,t)}info(e,t){this.addEvent(e,`info`,t)}warn(e,t){this.addEvent(e,`warn`,t)}error(e,t){this.addEvent(e,`error`,t)}setAttribute(e,t){this.ended||(this.data.attributes[e]=t,this.tracer._notifySpanUpdate(this.data))}setAttributes(e){this.ended||(Object.assign(this.data.attributes,e),this.tracer._notifySpanUpdate(this.data))}setResult(e){this.ended||(this.data.result=e,this.tracer._notifySpanUpdate(this.data))}};const ln={debug:0,info:1,warn:2,error:3};var un=class{minLevel;showInternal;showTimestamp;showDuration;markdown;output;spans=new Map;visibleDepths=new Map;constructor(e={}){this.minLevel=e.minLevel??`info`,this.showInternal=e.showInternal??!1,this.showTimestamp=e.showTimestamp??!0,this.showDuration=e.showDuration??!0,this.markdown=e.markdown??!1,this.output=e.output??console.log}shouldShowEvent(e){return ln[e]>=ln[this.minLevel]}isSpanVisible(e){return!(e.type===`internal`&&!this.showInternal)}findVisibleAncestor(e){let t=e.parentSpanId;for(;t;){let e=this.spans.get(t);if(!e)break;if(this.isSpanVisible(e))return e;t=e.parentSpanId}return null}calculateVisibleDepth(e){if(!this.isSpanVisible(e))return-1;let t=this.findVisibleAncestor(e);return t?(this.visibleDepths.get(t.spanId)??0)+1:0}formatTimestamp(){if(!this.showTimestamp)return``;let e=new Date;return`[${e.toTimeString().slice(0,8)}.${e.getMilliseconds().toString().padStart(3,`0`)}] `}formatDuration(e){if(!this.showDuration||!e.endTime)return``;let t=e.endTime-e.startTime;return t<1e3?` (${Math.round(t)}ms)`:` (${(t/1e3).toFixed(2)}s)`}formatIndent(e){return` `.repeat(e)}formatSpanName(e){return e.type?`[${e.type}] ${e.name}`:e.name}renderMarkdown(e){return dn(e).trimEnd()}onSpanStart(e){if(this.spans.set(e.spanId,e),!this.isSpanVisible(e))return;let t=this.calculateVisibleDepth(e);this.visibleDepths.set(e.spanId,t);let n=this.formatIndent(t),r=this.formatTimestamp(),i=this.formatSpanName(e);this.output(`${r}${n}START ${i}`)}onSpanEnd(e){if(this.spans.set(e.spanId,e),!this.isSpanVisible(e))return;let t=this.visibleDepths.get(e.spanId)??0,n=this.formatIndent(t),r=this.formatTimestamp(),i=this.formatDuration(e),a=this.formatSpanName(e),o=e.status===`error`?` [ERROR]`:``;if(this.output(`${r}${n}END ${a}${i}${o}`),e.result?.kind===`llm`){let t=e.result,i=[`model=${t.model}`];if(t.finishReason&&i.push(`finishReason=${t.finishReason}`),t.usage&&(t.usage.inputTokens!==void 0&&i.push(`inputTokens=${t.usage.inputTokens}`),t.usage.outputTokens!==void 0&&i.push(`outputTokens=${t.usage.outputTokens}`)),this.output(`${r}${n} INFO LLM complete ${i.join(` `)}`),this.shouldShowEvent(`debug`)&&t.response.content){let e=(typeof t.response.content==`string`?t.response.content:JSON.stringify(t.response.content,null,2)).split(`
|
|
18
|
-
`);for(let t of e)this.output(`${r}${n} DEBUG ${t}`)}}}onSpanUpdate(e){this.spans.set(e.spanId,e)}onEvent(e,t){if(!this.shouldShowEvent(t.level))return;this.spans.set(e.spanId,e);let n;if(this.isSpanVisible(e))n=this.visibleDepths.get(e.spanId)??0;else{let t=this.findVisibleAncestor(e);n=t?this.visibleDepths.get(t.spanId)??0:0}let r=this.formatIndent(n+1),i=this.formatTimestamp(),a=t.level.toUpperCase().padEnd(5),o=this.markdown&&t.attributes?.markdown===!0,s=t.attributes?Object.entries(t.attributes).filter(([e])=>e!==`markdown`):[],c=t.name;o&&(c=this.renderMarkdown(c));let l=`${i}${r}${a} ${c}`;if(s.length>0){let e=s.map(([e,t])=>`${e}=${JSON.stringify(t)}`).join(` `);l+=` ${e}`}this.output(l)}};function dn(e){return fn(w.lexer(e))}function fn(e=[]){return e.map(e=>pn(e)).filter(e=>e.length>0).join(`
|
|
19
|
-
`)}function pn(e){switch(e.type){case`space`:return``;case`heading`:return C.bold($(e.tokens));case`paragraph`:return $(e.tokens);case`blockquote`:return yn(fn(e.tokens),`> `);case`code`:return(e.lang?C.dim(`${e.lang}\n`):``)+C.yellow(e.text);case`list`:return hn(e)?_n(e):e.raw;case`hr`:return C.dim(`-`.repeat(40));case`table`:return gn(e)?vn(e):e.raw;case`html`:return e.text;case`text`:return e.tokens?$(e.tokens):xn(e.text);default:return`tokens`in e&&e.tokens?$(e.tokens):e.raw}}function $(e=[]){return e.map(e=>mn(e)).join(``)}function mn(e){switch(e.type){case`text`:case`escape`:return xn(e.text);case`strong`:return C.bold($(e.tokens));case`em`:return C.italic($(e.tokens));case`codespan`:return C.yellow(e.text);case`del`:return C.strikethrough($(e.tokens));case`link`:{let t=$(e.tokens);return e.href&&e.href!==e.text?`${C.blue.underline(t)} ${C.dim(`(${e.href})`)}`:C.blue.underline(t)}case`image`:return e.text?`${e.text} (${e.href})`:e.href;case`br`:return`
|
|
20
|
-
`;case`html`:return e.text;default:return`tokens`in e&&e.tokens?$(e.tokens):e.raw}}function hn(e){return e.type===`list`&&`items`in e&&Array.isArray(e.items)}function gn(e){return e.type===`table`&&`header`in e&&`rows`in e}function _n(e){return e.items.map((t,n)=>{let r=e.ordered?`${Number(e.start||1)+n}. `:`- `,i=t.task?`[${t.checked?`x`:` `}] `:``,a=fn(t.tokens).trimEnd();return r+i+bn(a,r.length+i.length)}).join(`
|
|
21
|
-
`)}function vn(e){let t=e.header.map(e=>$(e.tokens)).join(` | `),n=e.rows.map(e=>e.map(e=>$(e.tokens)).join(` | `));return[C.bold(t),...n].join(`
|
|
22
|
-
`)}function yn(e,t){return e.split(`
|
|
23
|
-
`).map(e=>t+e).join(`
|
|
24
|
-
`)}function bn(e,t){let[n=``,...r]=e.split(`
|
|
25
|
-
`);if(r.length===0)return n;let i=` `.repeat(t);return[n,...r.map(e=>i+e)].join(`
|
|
26
|
-
`)}function xn(e){return e.replace(/"/g,`"`).replace(/'/g,`'`).replace(/</g,`<`).replace(/>/g,`>`).replace(/&/g,`&`)}var Sn=class{provider;model;enableTools;lastStore;lastName;lastScope;constructor(e){this.provider=e.provider,this.model=e.model,this.enableTools=e.enableTools??!1}async recall(e){let t=e.tracer?.startSpan(`memory.recall`,{type:`internal`});this.lastStore=e.store,this.lastName=e.name,this.lastScope=e.scope;let n=await this.loadStore(e.store,e.name,e.scope);if(n.instructions.length===0)return t?.info(`no stored instructions`),t?.end(),{};t?.info(`loaded instructions`,{count:n.instructions.length});let r=n.instructions.map((e,t)=>`${t+1}. ${e}`).join(`
|
|
27
|
-
`);return t?.end(),{systemSuffix:`## Learned Instructions\n\n${r}`}}async record(e){if(!e.newMessages||e.newMessages.length===0)return;let t=e.tracer?.startSpan(`memory.record`,{type:`internal`}),n=this.formatMessages(e.newMessages);if(!n.trim()){t?.info(`no text content to extract from`),t?.end();return}let r=t?.startSpan(`memory.extract`,{type:`llm`}),i=await wt({provider:this.provider,model:this.model,messages:[{role:`user`,content:n}],system:`You are a memory extraction system. Your job is to extract learnings from a conversation that should be remembered for future runs.
|
|
28
|
-
|
|
29
|
-
Only extract:
|
|
30
|
-
- Explicit user corrections (e.g., "No, always use bullet points")
|
|
31
|
-
- Stated preferences (e.g., "I prefer concise summaries")
|
|
32
|
-
- Patterns that clearly emerged from user feedback
|
|
33
|
-
|
|
34
|
-
Do NOT extract:
|
|
35
|
-
- General knowledge or facts from the conversation content
|
|
36
|
-
- Inferences or speculation about what the user might want
|
|
37
|
-
- Task-specific details that won't apply to future runs
|
|
38
|
-
|
|
39
|
-
Respond with a JSON array of instruction strings. Each instruction should be a clear, actionable directive.
|
|
40
|
-
If there are no learnings to extract, respond with an empty array: []
|
|
41
|
-
|
|
42
|
-
Example response:
|
|
43
|
-
["Always use bullet points for lists", "Keep summaries under 3 sentences"]`,tracer:r});if(i.result!==`success`||!i.final){t?.warn(`extraction failed`,{result:i.result}),t?.end();return}let a=j(i.final.content);if(!a){t?.end();return}let o=this.parseInstructions(a);if(o.length===0){t?.info(`no instructions extracted`),t?.end();return}let s=await this.loadStore(e.store,e.name,e.scope);s.instructions.push(...o),await this.saveStore(e.store,e.name,e.scope,s),t?.info(`saved instructions`,{count:o.length}),t?.end()}tools(){if(!this.enableTools)return[];let e=this;return[{name:`add_instruction`,description:`Save a learned instruction for future runs. Use this when the user explicitly asks you to remember something.`,schema:p.object({instruction:p.string().describe(`The instruction to remember`)}),async execute(t){if(!e.lastStore)return`Error: memory not initialized (no recall has been called yet)`;let n=await e.loadStore(e.lastStore,e.lastName,e.lastScope);return n.instructions.push(t.instruction),await e.saveStore(e.lastStore,e.lastName,e.lastScope,n),`Instruction saved: "${t.instruction}"`}}]}formatMessages(e){let t=[];for(let n of e)if(n.role===`user`){let e=typeof n.content==`string`?n.content:j(n.content);e&&t.push(`User: ${e}`)}else if(n.role===`assistant`){let e=j(n.content);e&&t.push(`Assistant: ${e}`)}return t.join(`
|
|
44
|
-
|
|
45
|
-
`)}parseInstructions(e){let t=e.trim(),n=t.match(/^```(?:json)?\s*\n?([\s\S]*?)\n?\s*```$/);n&&(t=n[1].trim());try{let e=JSON.parse(t);if(Array.isArray(e)&&e.every(e=>typeof e==`string`))return e}catch{}return[]}getStorePath(e,t){let n=e??`default`,r=n;if(t&&Object.keys(t).length>0){let e=Object.entries(t).sort(([e],[t])=>e.localeCompare(t)).map(([e,t])=>`${e}=${t}`).join(`&`);r=`${n}-${T.createHash(`sha256`).update(e).digest(`hex`).slice(0,8)}`}return`memory/procedural/${r}.json`}async loadStore(e,t,n){let r=this.getStorePath(t,n),i=await e.read(r);if(i)try{let e=JSON.parse(i);if(e&&Array.isArray(e.instructions))return{instructions:e.instructions}}catch{}return{instructions:[]}}async saveStore(e,t,n,r){if(!r)return;let i=this.getStorePath(t,n);await e.write(i,JSON.stringify(r,null,2))}};export{O as A,oe as C,L as D,re as E,N as O,se as S,B as T,Se as _,Zt as a,de as b,Jt as c,Bt as d,wt as f,Be as g,at as h,an as i,E as j,k,Ut as l,St as m,un as n,Xt as o,Ct as p,sn as r,Yt as s,Sn as t,Ht as u,_e as v,U as w,ce as x,me as y};
|