@fifthrevision/axle 0.8.1 → 0.9.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.
@@ -0,0 +1,59 @@
1
+ var Je=Object.defineProperty;var c=(t,e)=>Je(t,"name",{value:e,configurable:!0});import Q,{readFile as J,access as We,stat as ze,writeFile as ce,mkdir as Ke}from"node:fs/promises";import ee,{resolve as te,extname as le,dirname as Ve}from"node:path";import*as M from"zod";import j,{z as A}from"zod";import"glob";import Xe from"mime";import Ze from"@anthropic-ai/sdk";import{FinishReason as C,GoogleGenAI as Ye}from"@google/genai";import Qe from"openai";import{exec as et}from"node:child_process";import{promisify as tt}from"node:util";import{Client as nt}from"@modelcontextprotocol/sdk/client/index.js";import{StdioClientTransport as st}from"@modelcontextprotocol/sdk/client/stdio.js";import{StreamableHTTPClientTransport as rt}from"@modelcontextprotocol/sdk/client/streamableHttp.js";import{marked as ue}from"marked";import{markedTerminal as ot}from"marked-terminal";import at from"node:crypto";class z extends Error{static{c(this,"AxleError")}code;id;details;constructor(e,n){super(e,{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,z.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:pe(this.cause)}}}}function pe(t){return t instanceof Error?{name:t.name,message:t.message,...t.stack&&{stack:t.stack},..."cause"in t&&t.cause&&{cause:pe(t.cause)}}:t}c(pe,"serializeError");var S=(t=>(t.Stop="stop",t.Length="length",t.FunctionCall="function_call",t.Error="error",t.Custom="custom",t.Cancelled="cancelled",t))(S||{});class de{static{c(this,"History")}system;_messages=[];constructor(e){e&&(this._messages=e)}get messages(){return[...this._messages]}addSystem(e){this.system=e}addUser(e){typeof e=="string"?this._messages.push({role:"user",content:[{type:"text",text:e}]}):this._messages.push({role:"user",content:e})}addAssistant(e){if(typeof e=="string"){const n=e;this._messages.push({role:"assistant",id:crypto.randomUUID(),content:[{type:"text",text:n}],model:"user",finishReason:S.Custom})}else this._messages.push({role:"assistant",...e})}addToolResults(e){this._messages.push({role:"tool",content:e})}add(e){Array.isArray(e)?this._messages.push(...e):this._messages.push(e)}latest(){return this._messages[this._messages.length-1]}toString(){return JSON.stringify({system:this.system,messages:this._messages})}}function it(t){const{text:e,files:n}=t,s=[];if(e&&s.push({type:"text",text:e}),n)for(const r of n)s.push({type:"file",file:r});return s}c(it,"toContentParts");function G(t){return typeof t=="string"?t:t.filter(e=>e.type==="text").map(e=>e.text).join(`
2
+
3
+ `)}c(G,"getTextContent");function ct(t){return t.filter(e=>e.type==="tool-call")}c(ct,"getToolCalls");function lt(t,e){const n=e.usage??{in:0,out:0};t.in+=n.in??0,t.out+=n.out??0}c(lt,"appendUsage");function me(t){return JSON.stringify({error:t})}c(me,"serializeToolError");async function fe(t,e=async()=>null,n){const s=[];for(const r of t){const o=n?.startSpan(r.name,{type:"tool"});let a;try{a=await e(r.name,r.parameters)}catch(l){a={type:"error",error:{type:"exception",message:l instanceof Error?l.message:String(l)}}}if(a==null){const l=`Tool not found: ${r.name}`;o?.setResult({kind:"tool",name:r.name,input:r.parameters,output:null}),o?.end("error"),s.push({id:r.id,name:r.name,content:me({type:"not-found",message:l}),isError:!0});continue}a.type==="success"?(o?.setResult({kind:"tool",name:r.name,input:r.parameters,output:a.content}),o?.end("ok"),s.push({id:r.id,name:r.name,content:a.content})):(o?.setResult({kind:"tool",name:r.name,input:r.parameters,output:a.error}),o?.end("error"),s.push({id:r.id,name:r.name,content:me(a.error),isError:!0}))}return{results:s}}c(fe,"executeToolCalls");function P(t,e){for(const n of t)n(e)}c(P,"emit");function he(t){const e=[],n=new AbortController;let s=!1,r,o;const a=new Promise((l,u)=>{r=c(p=>{s=!0,l(p)},"resolveResult"),o=c(p=>{s=!0,u(p)},"rejectResult")});return Promise.resolve().then(()=>ut(t,n.signal,e).then(r,o)),{on(l){e.push(l)},cancel(){s||n.abort()},get final(){return a}}}c(he,"stream");async function ut(t,e,n){const{provider:s,model:r,messages:o,system:a,tools:l,serverTools:u,onToolCall:p,maxIterations:m,tracer:d,options:i}=t,g=[...o],h=[],f={in:0,out:0};let _=0,w=0;const y=c(T=>{g.push(T),h.push(T)},"addMessage"),E=c(T=>{T.result==="error"&&P(n,{type:"error",error:T.error});const v=T.result==="success"?T.final?.content:T.result==="cancelled"?T.partial?.content:null,F=T.result==="success"?T.final?.finishReason:T.result==="cancelled"?S.Cancelled:void 0;return d?.setResult({kind:"llm",model:r,request:{messages:o},response:{content:v??null},usage:T.usage?{inputTokens:T.usage.in,outputTokens:T.usage.out}:void 0,finishReason:F}),d?.end(T.result==="error"?"error":"ok"),T},"endWithResult"),R=c((T,v,F,b)=>{b();const O=T.length>0?{role:"assistant",id:v,model:F,content:T,finishReason:S.Cancelled}:void 0;return O&&y(O),d?.end("ok"),{result:"cancelled",messages:h,partial:O,usage:f}},"buildCancelledResult");for(;;){if(e.aborted)return R([],"","",()=>{});if(m!==void 0&&w>=m)return E({result:"error",messages:h,error:{type:"model",error:{type:"error",error:{type:"MaxIterations",message:`Exceeded max iterations (${m})`}}},usage:f});w+=1;const T=d?.startSpan(`turn-${w}`,{type:"llm"}),v=u?{...i,serverTools:u}:i,F=s.createStreamingRequest?.(r,{messages:g,system:a,tools:l,context:{tracer:T},signal:e,options:v});if(!F)throw T?.end("error"),new Error("Provider does not support streaming. Use generate() instead.");const b=[];let q="",O="",B=null,H={in:0,out:0},N=-1,W=null,L="";const re=new Map;let D=-1;const U=c(()=>{W!==null&&N>=0&&(P(n,{type:W==="text"?"text:end":"thinking:end",index:N,final:L}),W=null,L="",N=-1)},"closePart");for await(const x of F){switch(x.type){case"start":q=x.id,O=x.data.model;break;case"text-start":{U(),b.push({type:"text",text:""}),D=b.length-1,N=_++,W="text",L="",P(n,{type:"text:start",index:N});break}case"text-delta":{const I=b[D];I.text+=x.data.text,L=I.text,P(n,{type:"text:delta",index:N,delta:x.data.text,accumulated:L});break}case"text-complete":{U();break}case"thinking-start":{U(),b.push({type:"thinking",text:""}),D=b.length-1,N=_++,W="thinking",L="",P(n,{type:"thinking:start",index:N});break}case"thinking-delta":{const I=b[D];I.text+=x.data.text,L=I.text,P(n,{type:"thinking:delta",index:N,delta:x.data.text,accumulated:L});break}case"thinking-summary-delta":{const I=b[D];I.text+=x.data.text,L=I.text,P(n,{type:"thinking:delta",index:N,delta:x.data.text,accumulated:L});break}case"thinking-complete":{U();break}case"tool-call-start":{U();const I=_++;b.push({type:"tool-call",id:x.data.id,name:x.data.name,parameters:{}}),D=b.length-1,re.set(x.data.id,I),P(n,{type:"tool:start",index:I,id:x.data.id,name:x.data.name});break}case"tool-call-complete":{const I=b[D];x.data.id&&(I.id=x.data.id),x.data.name&&(I.name=x.data.name),I.parameters=x.data.arguments,x.data.providerMetadata&&(I.providerMetadata=x.data.providerMetadata);break}case"internal-tool-start":{U();const I=_++;b.push({type:"internal-tool",id:x.data.id,name:x.data.name}),D=b.length-1,P(n,{type:"internal-tool:start",index:I,id:x.data.id,name:x.data.name});break}case"internal-tool-complete":{const I=b[D];x.data.output!=null&&(I.output=x.data.output),P(n,{type:"internal-tool:complete",index:x.data.index,id:x.data.id,name:x.data.name,output:x.data.output});break}case"complete":{U(),B=x.data.finishReason,H=x.data.usage;break}case"error":{U();const I=x.data.usage??{in:0,out:0};return f.in+=I.in??0,f.out+=I.out??0,T?.end("error"),E({result:"error",messages:h,error:{type:"model",error:{type:"error",error:{type:x.data.type,message:x.data.message}}},usage:f})}default:console.warn("[WARN] Unhandled chunk type. Should never happen")}if(e.aborted)break}if(e.aborted)return T?.end("ok"),R(b,q,O,U);if(B===null)return U(),T?.end("error"),E({result:"error",messages:h,error:{type:"model",error:{type:"error",error:{type:"IncompleteStream",message:"Stream ended without a completion signal"}}},usage:f});f.in+=H.in??0,f.out+=H.out??0;const je={kind:"llm",model:O,request:{messages:g},response:{content:b},usage:{inputTokens:H.in,outputTokens:H.out},finishReason:B};T?.setResult(je),T?.end();const X={role:"assistant",id:q,model:O,content:b,finishReason:B};if(y(X),B!==S.FunctionCall)return E({result:"success",messages:h,final:X,usage:f});const Z=b.filter(x=>x.type==="tool-call");if(Z.length===0)return E({result:"success",messages:h,final:X,usage:f});if(e.aborted)return d?.end("ok"),{result:"cancelled",messages:h,usage:f};const qe=p?async(x,I)=>p(x,I):async()=>null;let Be=0;const He=c(async(x,I)=>{const Y=Z[Be++],ae=re.get(Y.id)??-1;P(n,{type:"tool:execute",index:ae,id:Y.id,name:x,parameters:I});const ie=await qe(x,I);return P(n,{type:"tool:complete",index:ae,id:Y.id,name:x,result:ie??null}),ie},"emittingToolCall"),{results:oe}=await fe(Z,He,d);oe.length>0&&y({role:"tool",content:oe})}}c(ut,"run");class ge{static{c(this,"LocalFileStore")}rootPath;constructor(e){this.rootPath=e}async read(e){const n=ee.join(this.rootPath,e);try{return await Q.readFile(n,"utf-8")}catch{return null}}async write(e,n){const s=ee.join(this.rootPath,e);await Q.mkdir(ee.dirname(s),{recursive:!0}),await Q.writeFile(s,n,"utf-8")}}function pt(t,e,n={}){const{placeholderStyle:s="{{}}",strict:r=!1}=n,o=s==="{{}}"?/\{\{(.*?)\}\}/g:/\{(.*?)\}/g,a=[];if(t=t.replace(o,(l,u)=>{if(u=u.trim(),Object.prototype.hasOwnProperty.call(e,u)){const p=e[u];return p==null?"":String(p)}return r&&a.push(u),l}),a.length>0){const l=[...new Set(a)];throw new Error(`Missing variable${l.length>1?"s":""}: ${l.join(", ")}. Pass them as --args key=value or use --allow-missing-vars to suppress this error.`)}return t}c(pt,"replaceVariables");function K(t){if(t instanceof M.ZodString)return["string","Your answer"];if(t instanceof M.ZodNumber)return["number",42];if(t instanceof M.ZodBoolean)return["boolean",!0];if(t instanceof M.ZodArray){const e=t.element;if(e instanceof M.ZodString)return["string array",["answer 1","answer 2","third answer"]];if(e instanceof M.ZodNumber)return["number array",[42,59,3.14]];if(e instanceof M.ZodBoolean)return["boolean array",[!0,!1,!1]];if(e instanceof M.ZodObject){const[n,s]=K(e);return["object array",[s,s]]}return["array",[]]}if(t instanceof M.ZodObject){const e=t.shape,n={};for(const[s,r]of Object.entries(e)){const[o,a]=K(r);n[s]=a}return["JSON object",n]}if(t instanceof M.ZodOptional){const e=t.unwrap(),[n,s]=K(e);return[`${n} | undefined`,s]}}c(K,"zodToExample");function _e(t,e){if(!e)return t;if(Object.keys(e).length===0){if(t.trim()==="{}"||t.trim()==="")return{};throw new Error("Schema is empty, but rawValue is not an empty object representation or empty string.")}const s=dt(t),r={};for(const[o,a]of Object.entries(e)){const l=s.tags[o];if(l!==void 0)r[o]=ye(a,l);else if(a.def.type!=="optional")throw new Error(`Expected results with tag ${o} but it does not exist`)}try{const o={};for(const[a,l]of Object.entries(e))a in r&&(o[a]=l.parse(r[a]));return o}catch(o){if(o&&typeof o=="object"&&"issues"in o){const a=o.issues.map(l=>`${l.path.join(".")}: ${l.message}`).join(", ");throw new Error(`Validation failed: ${a}`)}throw o}}c(_e,"parseResponse");function ye(t,e){switch(e=e.trim(),t.def.type){case"string":try{return JSON.parse(e)}catch{if(typeof e=="string")return e;throw new Error(`Cannot parse '${e}' as string. Ensure it is a valid JSON string or a plain string.`)}case"number":{const n=parseFloat(e);if(isNaN(n))throw new Error(`Cannot parse '${e}' as number`);return n}case"boolean":{const n=e.toLowerCase();if(n==="true")return!0;if(n==="false")return!1;throw new Error(`Cannot parse '${e}' as boolean. Expected 'true' or 'false'`)}case"array":{if(e==="")return[];try{const n=JSON.parse(e);if(Array.isArray(n))return n}catch{}if(e.includes(","))return e.split(",").map(n=>{const s=n.trim();try{return JSON.parse(s)}catch{return s}}).filter(n=>n!=="")}case"object":{e.includes("```json")&&(e=e.replace(/```json/g,"").replace(/```/g,""));try{return JSON.parse(e)}catch(n){throw new Error(`Cannot parse object as JSON: ${n.message}`)}}case"optional":{const n=t.def.innerType;return ye(n,e)}default:return e}}c(ye,"preprocessValue");function dt(t){t.trim().startsWith("```json")&&t.trim().endsWith("```")&&(t=t.trim().slice(7,-3).trim());const e=/<(\w+)>(.*?)<\/\1>/gs,n={};let s=t;s=s.replace(e,(o,a,l)=>(n[a]=l,""));const r=/<(\w+)>(.*?)(?:<\/?\w+>|$)/gs;return s=s.replace(r,(o,a,l)=>(n[a]=l,"")),{tags:n,remaining:s.trim()}}c(dt,"parseTaggedSections");function xe(t,e={},n={}){const s={...e,...t.inputs};let r=pt(t.prompt,s,{strict:n.strictVariables});if(t.textReferences.length>0)for(const[l,u]of t.textReferences.entries()){const p=u.name?`: ${u.name}`:"";r+=`
4
+
5
+ ## Reference ${l+1}${p}
6
+
7
+ \`\`\`${u.content}'''`}let o=`# Instructions
8
+
9
+ `;if((t.schema?Object.keys(t.schema):[]).length>0){o+=`## Output Format Instructions
10
+ `,o+=`
11
+ Here is how you should format your output. Follow the instructions strictly.
12
+ `;for(const[l,u]of Object.entries(t.schema)){const[p,m]=K(u);o+=`
13
+ - Use <${l}></${l}> tags to indicate the answer for ${l}. The answer must be a ${p}.
14
+ Example: <${l}>${JSON.stringify(m)}</${l}>
15
+ `}}if(t.instructions.length>0){o+=`
16
+ ## Additional Instructions
17
+
18
+ `;for(const l of t.instructions)o+=`- ${l}
19
+ `}return o+r}c(xe,"compileInstruct");function mt(t){return t.type==="server"}c(mt,"isServerTool");class ft{static{c(this,"Agent")}provider;model;history;tracer;name;scope;store;system;tools={};serverTools=[];mcps=[];mcpToolsResolved=!1;memory;options;eventCallbacks=[];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 ge(".axle"),this.options=e.options??{},e.tools&&this.addTools(e.tools),e.mcps&&(this.mcps=[...e.mcps]),e.memory){if(!e.name)throw new z("Agent requires a 'name' when memory is provided. The name is used to partition memory storage.");this.memory=e.memory;const n=e.memory.tools?.();n&&this.addTools(n)}}addTool(e){mt(e)?this.serverTools.push(e):this.tools[e.name]=e}addTools(e){for(const n of e)this.addTool(n)}addMcp(e){this.mcps.push(e),this.mcpToolsResolved=!1}addMcps(e){this.mcps.push(...e),this.mcpToolsResolved=!1}hasTools(){return Object.keys(this.tools).length>0||this.serverTools.length>0||this.mcps.length>0}on(e){this.eventCallbacks.push(e)}send(e,n){let s;if(typeof e=="string")this.history.addUser(e);else{const r=xe(e,n,{strictVariables:this.options.strictVariables}),o=e.files;this.history.addUser(it({text:r,files:o})),s=e.schema}return this.execute(s)}async resolveMcpTools(){if(!this.mcpToolsResolved){this.tracer?.debug("resolving MCP tools",{count:this.mcps.length});for(const e of this.mcps){const n=await e.listTools({prefix:e.name,tracer:this.tracer});this.addTools(n)}this.mcpToolsResolved=!0}}execute(e){let n=!1,s;const r=(async()=>{if(await this.resolveMcpTools(),n)return{response:null,messages:[],final:void 0,usage:{in:0,out:0}};let o=this.system;if(this.memory){const i=await this.memory.recall({name:this.name,scope:this.scope,system:this.system,messages:this.history.messages,store:this.store,tracer:this.tracer});i.systemSuffix&&(o=(o??"")+`
20
+
21
+ `+i.systemSuffix)}const a=this.tools,l=Object.values(a).map(i=>({name:i.name,description:i.description,schema:i.schema}));s=he({provider:this.provider,model:this.model,messages:this.history.messages,system:o,tools:l.length>0?l:void 0,serverTools:this.serverTools.length>0?this.serverTools:void 0,tracer:this.tracer,onToolCall:c(async(i,g)=>{const h=a[i];if(!h)return null;try{return{type:"success",content:await h.execute(g)}}catch(f){return{type:"error",error:{type:"execution",message:f instanceof Error?f.message:String(f)}}}},"onToolCall")});for(const i of this.eventCallbacks)s.on(i);const u=await s.final;u.messages.length>0&&this.history.add(u.messages);let p=null,m;if(u.result==="error")throw new z(ht(u.error),{code:u.error.type==="model"?"MODEL_ERROR":"TOOL_ERROR",details:{error:u.error}});if(u.result==="success"){if(m=u.final,m){const i=G(m.content);p=_e(i,e)}}else u.result==="cancelled"&&(m=u.partial);if(this.memory&&u.result==="success")try{await this.memory.record({name:this.name,scope:this.scope,system:this.system,messages:this.history.messages,newMessages:u.messages,store:this.store,tracer:this.tracer})}catch(i){this.tracer?.warn("memory record failed",{error:i instanceof Error?i.message:String(i)})}const d=u.usage??{in:0,out:0};return{response:p,messages:u.messages,final:m,usage:d}})();return{cancel:c(()=>{n=!0,s?.cancel()},"cancel"),get final(){return r}}}}function ht(t){return t.type==="model"?`Model error: ${t.error.error.message}`:`Tool error (${t.error.name}): ${t.error.message}`}c(ht,"formatGenerateError");async function gt(t,e){const{defaults:n,tag:s}=e;let r=null,o="";if(t)try{o=te(t),r=await J(o,{encoding:"utf-8"})}catch{throw new Error(`${s} not found, see --help for details`)}else{for(const a of n.formats)try{o=te(n.name+"."+a),r=await J(o,{encoding:"utf-8"});break}catch{continue}if(r===null)throw new Error(`${s} not found, see --help for details`)}return{content:r,format:o.split(".").pop()??"",path:o}}c(gt,"searchAndLoadFile");const Ee=20*1024*1024;function _t(t){return t.type==="text"}c(_t,"isTextFileInfo");function yt(t){return t.type==="image"||t.type==="document"}c(yt,"isBase64FileInfo");const xt=new Set(["application/json","application/xml","application/yaml","application/x-yaml","application/toml"]);function Et(t){return t.startsWith("text/")||xt.has(t)}c(Et,"isTextLikeMimeType");function wt(t){const e=Xe.getType(t);if(!e){const n=le(t).toLowerCase();throw new Error(`Unsupported file type: ${n||"(no extension)"}`)}if(e.startsWith("image/"))return{type:"image",mimeType:e};if(e==="application/pdf")return{type:"document",mimeType:e};if(Et(e))return{type:"text",mimeType:e};{const n=le(t).toLowerCase();throw new Error(`Unsupported file type: ${n} (${e})`)}}c(wt,"getFileCategory");async function Tt(t,e){const n=te(t);try{await We(n)}catch{throw new Error(`File not found: ${t}`)}const s=await ze(n);if(s.size>Ee)throw new Error(`File too large: ${s.size} bytes. Maximum allowed: ${Ee} bytes`);const r=n.split("/").pop()||"",o=wt(n);if((e||(o.type==="text"?"utf-8":"base64"))==="utf-8"){if(o.type!=="text")throw new Error(`Cannot read ${o.type} file as text: ${t}`);const l=await J(n,"utf-8");return{path:n,content:l,mimeType:o.mimeType,size:s.size,name:r,type:"text"}}else{if(o.type==="text")throw new Error(`Cannot read text file as binary: ${t}`);const u=(await J(n)).toString("base64");return{path:n,base64:u,mimeType:o.mimeType,size:s.size,name:r,type:o.type}}}c(Tt,"loadFileContent");class St{static{c(this,"Instruct")}prompt;inputs={};files=[];textReferences=[];instructions=[];schema;constructor(e,n){this.prompt=e,this.schema=n}setInputs(e){this.inputs=e}addInput(e,n){this.inputs[e]=n}addFile(e,n){if(typeof e=="string"){this.textReferences.push({content:e,name:n?.name});return}yt(e)?this.files.push(e):_t(e)&&this.textReferences.push({content:e.content,name:n?.name??e.name})}addInstructions(e){if(typeof e!="string"||e.trim()==="")throw new Error("Instruction must be a non-empty string");this.instructions.push(e)}hasFiles(){return this.files.length>0}}const $={CLAUDE_SONNET_4_6:"claude-sonnet-4-6",CLAUDE_OPUS_4_6:"claude-opus-4-6",CLAUDE_OPUS_4_5_20251101:"claude-opus-4-5-20251101",CLAUDE_OPUS_4_5:"claude-opus-4-5-20251101",CLAUDE_HAIKU_4_5_20251001:"claude-haiku-4-5-20251001",CLAUDE_HAIKU_4_5:"claude-haiku-4-5-20251001",CLAUDE_SONNET_4_5_20250929:"claude-sonnet-4-5-20250929",CLAUDE_SONNET_4_5:"claude-sonnet-4-5-20250929",CLAUDE_OPUS_4_1_20250805:"claude-opus-4-1-20250805",CLAUDE_OPUS_4_1:"claude-opus-4-1-20250805",CLAUDE_OPUS_4_20250514:"claude-opus-4-20250514",CLAUDE_OPUS_4:"claude-opus-4-20250514",CLAUDE_SONNET_4_20250514:"claude-sonnet-4-20250514",CLAUDE_SONNET_4:"claude-sonnet-4-20250514",CLAUDE_3_HAIKU_20240307:"claude-3-haiku-20240307",CLAUDE_3_HAIKU:"claude-3-haiku-20240307"};$.CLAUDE_SONNET_4_6,$.CLAUDE_OPUS_4_6,$.CLAUDE_OPUS_4_5_20251101,$.CLAUDE_HAIKU_4_5_20251001,$.CLAUDE_SONNET_4_5_20250929,$.CLAUDE_OPUS_4_1_20250805,$.CLAUDE_OPUS_4_20250514,$.CLAUDE_SONNET_4_20250514,$.CLAUDE_3_HAIKU_20240307;const It=$.CLAUDE_HAIKU_4_5;function we(t){return Array.isArray(t)?t:[t]}c(we,"arrayify");function bt(t){return new Promise(e=>setTimeout(e,t))}c(bt,"delay");function V(t){if(t==null)return{type:"error",error:{type:"Undetermined",message:"Unknown error occurred"},usage:{in:0,out:0},raw:t};if(t instanceof Error)return{type:"error",error:{type:t.name||"Error",message:t.message||"Unexpected error"},usage:{in:0,out:0},raw:t};if(typeof t=="object"){const e=t,n=e?.error?.error?.type||e?.error?.type||e?.type||e?.code||e?.status||"Undetermined",s=e?.error?.error?.message||e?.error?.message||e?.message||e?.error||"Unexpected error";return{type:"error",error:{type:String(n),message:String(s)},usage:{in:0,out:0},raw:t}}return{type:"error",error:{type:"Undetermined",message:String(t)},usage:{in:0,out:0},raw:t}}c(V,"getUndefinedError");function Te(t){return t.map(e=>{if(e.role==="assistant"){const n=[];for(const s of e.content)s.type==="text"?n.push({type:"text",text:s.text}):s.type==="thinking"?s.redacted?n.push({type:"redacted_thinking",data:s.text}):n.push({type:"thinking",thinking:s.text,signature:s.signature}):s.type==="tool-call"?n.push({type:"tool_use",id:s.id,name:s.name,input:s.parameters}):s.type==="internal-tool"&&(n.push({type:"server_tool_use",id:s.id,name:s.name,input:s.input??{}}),s.output!=null&&n.push({type:"web_search_tool_result",tool_use_id:s.id,content:s.output}));return{role:"assistant",content:n}}if(e.role==="tool")return{role:"user",content:e.content.map(n=>({type:"tool_result",tool_use_id:n.id,content:typeof n.content=="string"?n.content:$t(n.content),...n.isError?{is_error:!0}:{}}))};if(typeof e.content=="string")return{role:"user",content:e.content};{const n=[];for(const s of e.content)s.type==="text"?n.push({type:"text",text:s.text}):s.type==="file"&&(s.file.type==="image"?n.push({type:"image",source:{type:"base64",media_type:s.file.mimeType,data:s.file.base64}}):s.file.type==="document"&&s.file.mimeType==="application/pdf"&&n.push({type:"document",source:{type:"base64",media_type:"application/pdf",data:s.file.base64}}));return{role:"user",content:n}}})}c(Te,"convertToProviderMessages");function Se(t){return t.map(e=>{const n=j.toJSONSchema(e.schema);if(!kt(n))throw new Error(`Schema for tool ${e.name} must be an object type`);return{name:e.name,description:e.description,input_schema:n}})}c(Se,"convertToProviderTools");function Ie(t){const e=[];for(const n of t)if(n.type==="text")e.push({type:"text",text:n.text});else if(n.type==="thinking")e.push({type:"thinking",text:n.text||"",redacted:!1});else if(n.type==="redacted_thinking")e.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 new Error(`Invalid tool call input for ${n.name}: expected object, got ${typeof n.input}`);e.push({type:"tool-call",id:n.id,name:n.name,parameters:n.input})}return e}c(Ie,"convertToAxleContentParts");function be(t){switch(t){case"max_tokens":return S.Length;case"end_turn":return S.Stop;case"stop_sequence":return S.Stop;case"tool_use":return S.FunctionCall;case"pause_turn":case"refusal":default:return S.Error}}c(be,"convertStopReason$1");function kt(t){return t&&typeof t=="object"&&t.type==="object"}c(kt,"isObjectSchema");function $t(t){return t.map(e=>e.type==="text"?{type:"text",text:e.text}:{type:"image",source:{type:"base64",media_type:e.mimeType,data:e.data}})}c($t,"convertToolResultParts");async function At(t){const{client:e,model:n,messages:s,system:r,tools:o,context:a,options:l}=t,u=a?.tracer,{stop:p,max_tokens:m,...d}=l??{},i={model:n,max_tokens:m??16e3,messages:Te(s),...r&&{system:r},...p&&{stop_sequences:we(p)},...o&&{tools:Se(o)},...d};u?.debug("Anthropic request",{request:i});let g;try{const h=await e.messages.create(i);g=Rt(h)}catch(h){g=V(h)}return u?.debug("Anthropic response",{result:g}),g}c(At,"createGenerationRequest$3");function Rt(t){const e=be(t.stop_reason);if(e===S.Error)return{type:"error",error:{type:"Uncaught error",message:`Stop reason is not recognized or unhandled: ${t.stop_reason}`},usage:{in:t.usage.input_tokens,out:t.usage.output_tokens},raw:t};if(e===S.FunctionCall){const n=Ie(t.content);return{type:"success",id:t.id,model:t.model,role:t.role,finishReason:S.FunctionCall,content:n,text:G(n)??"",usage:{in:t.usage.input_tokens,out:t.usage.output_tokens},raw:t}}if(t.type=="message"){const n=Ie(t.content);return{type:"success",id:t.id,model:t.model,role:"assistant",finishReason:e,content:n,text:G(n)??"",usage:{in:t.usage.input_tokens,out:t.usage.output_tokens},raw:t}}}c(Rt,"convertToAIResponse");function Ot(){const t=new Map,e=new Map,n=new Map;function s(r){const o=[];switch(r.type){case"message_start":o.push({type:"start",id:r.message.id,data:{model:r.message.model,timestamp:Date.now()}});break;case"message_delta":r.delta.stop_reason&&o.push({type:"complete",data:{finishReason:be(r.delta.stop_reason),usage:r.usage?{in:r.usage.input_tokens||0,out:r.usage.output_tokens||0}:void 0}});case"message_stop":break;case"content_block_start":if(r.content_block.type==="text")t.set(r.index,"text"),o.push({type:"text-start",data:{index:r.index}});else if(r.content_block.type==="tool_use"){t.set(r.index,"tool");const a=r.content_block;n.set(r.index,{id:a.id,name:a.name,argumentsBuffer:""}),o.push({type:"tool-call-start",data:{index:r.index,id:a.id,name:a.name}})}else if(r.content_block.type==="thinking")t.set(r.index,"thinking"),o.push({type:"thinking-start",data:{index:r.index,redacted:!1}});else if(r.content_block.type==="redacted_thinking")t.set(r.index,"thinking"),o.push({type:"thinking-start",data:{index:r.index,redacted:!0}});else if(r.content_block.type==="server_tool_use"){t.set(r.index,"internal-tool");const a=r.content_block;e.set(a.id,{index:r.index,name:a.name}),o.push({type:"internal-tool-start",data:{index:r.index,id:a.id,name:a.name}})}else if(r.content_block.type==="web_search_tool_result"){const a=r.content_block,l=e.get(a.tool_use_id);l&&(o.push({type:"internal-tool-complete",data:{index:l.index,id:a.tool_use_id,name:l.name,output:a.content}}),e.delete(a.tool_use_id))}break;case"content_block_delta":if(r.delta.type==="text_delta")o.push({type:"text-delta",data:{text:r.delta.text,index:r.index}});else if(r.delta.type==="input_json_delta"){const a=n.get(r.index);a&&(a.argumentsBuffer+=r.delta.partial_json)}else r.delta.type==="thinking_delta"?o.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":{const a=t.get(r.index);if(a==="text")o.push({type:"text-complete",data:{index:r.index}});else if(a==="thinking")o.push({type:"thinking-complete",data:{index:r.index}});else if(a!=="internal-tool"){if(a==="tool"){const l=n.get(r.index);if(l){try{const u=l.argumentsBuffer?JSON.parse(l.argumentsBuffer):{};o.push({type:"tool-call-complete",data:{index:r.index,id:l.id,name:l.name,arguments:u}})}catch(u){throw new Error(`Failed to parse tool call arguments for ${l.name}: ${u instanceof Error?u.message:String(u)}
22
+ Raw buffer: ${l.argumentsBuffer}`)}n.delete(r.index)}}}t.delete(r.index);break}}return o}return c(s,"handleEvent"),{handleEvent:s}}c(Ot,"createAnthropicStreamingAdapter");async function*Mt(t){const{client:e,model:n,messages:s,system:r,tools:o,runtime:a,signal:l,options:u}=t,p=a?.tracer,{stop:m,max_tokens:d,serverTools:i,...g}=u??{},h=o?Se(o):[];if(i){const w={web_search:"web_search_20250305"};for(const y of i){const E=w[y.name]??y.name;h.push({type:E,name:y.name,...y.config})}}const f={model:n,max_tokens:d??Ct(n),messages:Te(s),...r&&{system:r},...m&&{stop_sequences:we(m)},...h.length>0&&{tools:h},...g};p?.debug("Anthropic streaming request",{request:f});const _=Ot();try{const w=await e.messages.create({...f,stream:!0},{signal:l});for await(const y of w){const E=_.handleEvent(y);for(const R of E)yield R}}catch(w){if(l?.aborted)return;yield{type:"error",data:{type:"STREAMING_ERROR",message:w instanceof Error?w.message:String(w),raw:w}}}}c(Mt,"createStreamingRequest$3");const ke={[$.CLAUDE_OPUS_4_6]:128e3,[$.CLAUDE_OPUS_4_5_20251101]:64e3,[$.CLAUDE_HAIKU_4_5_20251001]:64e3,[$.CLAUDE_SONNET_4_5_20250929]:64e3,[$.CLAUDE_SONNET_4_20250514]:64e3,[$.CLAUDE_OPUS_4_1_20250805]:32e3,[$.CLAUDE_OPUS_4_20250514]:32e3,[$.CLAUDE_3_HAIKU_20240307]:4096};function Ct(t){return t in ke?ke[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}c(Ct,"getMaxTokens");const Pt="anthropic";function vt(t){const e=new Ze({apiKey:t});return{name:Pt,async createGenerationRequest(n,s){return await At({client:e,model:n,...s})},createStreamingRequest(n,s){const{messages:r,system:o,tools:a,context:l,signal:u,options:p}=s;return Mt({client:e,model:n,messages:r,system:o,tools:a,runtime:l,signal:u,options:p})}}}c(vt,"anthropic");function $e(t,e){const n=t.map(Nt).flat(1);return e?[{role:"system",content:e},...n]:n}c($e,"convertAxleMessages");function Ae(t){if(t&&t.length>0)return t.map(e=>({type:"function",function:{name:e.name,description:e.description,parameters:j.toJSONSchema(e.schema)}}))}c(Ae,"convertTools");function ne(t){switch(t){case"stop":return S.Stop;case"length":return S.Length;case"tool_calls":case"function_call":return S.FunctionCall;case"content_filter":return S.Error;default:return S.Stop}}c(ne,"convertFinishReason");function Nt(t){switch(t.role){case"tool":return Lt(t);case"assistant":return Ut(t);default:return Gt(t)}}c(Nt,"convertMessage$2");function Lt(t){return t.content.map(e=>({role:"tool",content:typeof e.content=="string"?e.content:e.content.filter(n=>n.type==="text").map(n=>n.text).join(`
23
+ `),tool_call_id:e.id}))}c(Lt,"convertToolMessage$2");function Ut(t){const e=t.content.filter(r=>r.type==="tool-call"),n=t.content.filter(r=>r.type==="text"),s=e.length>0?e.map(r=>({type:"function",id:r.id,function:{name:r.name,arguments:JSON.stringify(r.parameters)}})):void 0;return{role:"assistant",content:n.map(r=>r.text).join(""),...s&&{tool_calls:s}}}c(Ut,"convertAssistantMessage$2");function Gt(t){if(typeof t.content=="string")return{role:"user",content:t.content};const e=t.content.map(Dt).filter(n=>n!==null);return e.every(n=>n.type==="text")?{role:"user",content:e.map(n=>n.text).join("")}:{role:"user",content:e}}c(Gt,"convertUserMessage$2");function Dt(t){return t.type==="text"?{type:"text",text:t.text}:t.type==="file"&&t.file.type==="image"?{type:"image_url",image_url:{url:`data:${t.file.mimeType};base64,${t.file.base64}`}}:null}c(Dt,"convertContentPart$2");async function Ft(t){const{baseUrl:e,model:n,messages:s,system:r,tools:o,context:a,apiKey:l,options:u}=t,p=a?.tracer,m=$e(s,r),d=Ae(o),i={model:n,messages:m,...d&&{tools:d}};u&&(u.temperature!==void 0&&(i.temperature=u.temperature),u.top_p!==void 0&&(i.top_p=u.top_p),u.max_tokens!==void 0&&(i.max_tokens=u.max_tokens),u.frequency_penalty!==void 0&&(i.frequency_penalty=u.frequency_penalty),u.presence_penalty!==void 0&&(i.presence_penalty=u.presence_penalty),u.stop!==void 0&&(i.stop=u.stop)),p?.debug("ChatCompletions request",{request:i});let g;try{const h={"Content-Type":"application/json"};l&&(h.Authorization=`Bearer ${l}`);const f=await fetch(`${e}/chat/completions`,{method:"POST",headers:h,body:JSON.stringify(i)});if(!f.ok){const w=await f.text().catch(()=>"");throw new Error(`HTTP error! status: ${f.status}${w?` - ${w}`:""}`)}const _=await f.json();g=jt(_)}catch(h){p?.error("Error fetching ChatCompletions response",{error:h instanceof Error?h.message:String(h)}),g=V(h)}return p?.debug("ChatCompletions response",{result:g}),g}c(Ft,"createGenerationRequest$2");function jt(t){const e=t.choices?.[0];if(!e)return{type:"error",error:{type:"ChatCompletionsError",message:"No choices in response"},usage:{in:0,out:0},raw:t};const n=[];if(e.message.reasoning_content&&n.push({type:"thinking",text:e.message.reasoning_content}),e.message.content&&n.push({type:"text",text:e.message.content}),e.message.tool_calls)for(const o of e.message.tool_calls){let a;try{a=JSON.parse(o.function.arguments)}catch(l){throw new Error(`Invalid tool call arguments for ${o.function.name}: ${l instanceof Error?l.message:String(l)}`)}if(typeof a!="object"||a===null||Array.isArray(a))throw new Error(`Invalid tool call arguments for ${o.function.name}: expected object, got ${typeof a}`);n.push({type:"tool-call",id:o.id,name:o.function.name,parameters:a})}const s=n.some(o=>o.type==="tool-call"),r=ne(s?"tool_calls":e.finish_reason);return{type:"success",id:t.id,model:t.model,role:"assistant",finishReason:r,content:n,text:G(n)??"",usage:{in:t.usage?.prompt_tokens||0,out:t.usage?.completion_tokens||0},raw:t}}c(jt,"fromModelResponse$2");function qt(){const t=new Map;let e=0,n=-1,s="",r="",o=null,a,l;function u(d){n<0||(o==="text"?d.push({type:"text-complete",data:{index:n}}):o==="thinking"&&d.push({type:"thinking-complete",data:{index:n}}),o=null,n=-1)}c(u,"closeActivePart");function p(d){const i=[];d.usage&&(l={in:d.usage.prompt_tokens,out:d.usage.completion_tokens});const g=d.choices?.[0];if(!g)return i;s||(s=d.id,r=d.model,i.push({type:"start",id:s,data:{model:r,timestamp:Date.now()}}));const h=g.delta;if(h.reasoning_content&&(o!=="thinking"&&(u(i),n=e++,o="thinking",i.push({type:"thinking-start",data:{index:n}})),i.push({type:"thinking-delta",data:{index:n,text:h.reasoning_content}})),h.content&&(o!=="text"&&(u(i),n=e++,o="text",i.push({type:"text-start",data:{index:n}})),i.push({type:"text-delta",data:{text:h.content,index:n}})),h.tool_calls){u(i);for(const f of h.tool_calls){const _=f.index;if(!t.has(_)){const y=e++,E=f.id||`tool-${y}`;t.set(_,{id:E,name:f.function?.name||"",argumentsBuffer:"",partIdx:y}),i.push({type:"tool-call-start",data:{index:y,id:E,name:f.function?.name||""}})}const w=t.get(_);f.id&&(w.id=f.id),f.function?.name&&(w.name=f.function.name),f.function?.arguments&&(w.argumentsBuffer+=f.function.arguments)}}if(g.finish_reason){u(i);for(const[,f]of t)try{const _=f.argumentsBuffer?JSON.parse(f.argumentsBuffer):{};i.push({type:"tool-call-complete",data:{index:f.partIdx,id:f.id,name:f.name,arguments:_}})}catch(_){throw new Error(`Failed to parse tool call arguments for ${f.name}: ${_ instanceof Error?_.message:String(_)}
24
+ Raw buffer: ${f.argumentsBuffer}`)}a=ne(g.finish_reason)}return i}c(p,"handleChunk");function m(){return a===void 0?[]:[{type:"complete",data:{finishReason:a,usage:l??{in:0,out:0}}}]}return c(m,"finalize"),{handleChunk:p,finalize:m}}c(qt,"createStreamingAdapter$1");async function*Bt(t){const{baseUrl:e,model:n,messages:s,system:r,tools:o,context:a,signal:l,apiKey:u,options:p}=t,m=a?.tracer;p?.serverTools&&m?.warn("serverTools not supported by ChatCompletions provider");const d=$e(s,r),i=Ae(o),g={model:n,messages:d,stream:!0,stream_options:{include_usage:!0},...i&&{tools:i}};p&&(p.temperature!==void 0&&(g.temperature=p.temperature),p.top_p!==void 0&&(g.top_p=p.top_p),p.max_tokens!==void 0&&(g.max_tokens=p.max_tokens),p.frequency_penalty!==void 0&&(g.frequency_penalty=p.frequency_penalty),p.presence_penalty!==void 0&&(g.presence_penalty=p.presence_penalty),p.stop!==void 0&&(g.stop=p.stop)),m?.debug("ChatCompletions streaming request",{request:g});const h=qt();try{const f={"Content-Type":"application/json"};u&&(f.Authorization=`Bearer ${u}`);const _=await fetch(`${e}/chat/completions`,{method:"POST",headers:f,body:JSON.stringify(g),signal:l});if(!_.ok){const R=await _.text().catch(()=>"");throw new Error(`HTTP error! status: ${_.status}${R?` - ${R}`:""}`)}if(!_.body)throw new Error("Response body is null");const w=_.body.getReader(),y=new TextDecoder;let E="";for(;;){const{done:R,value:T}=await w.read();if(R)break;E+=y.decode(T,{stream:!0});const v=E.split(`
25
+ `);E=v.pop()||"";for(const F of v){const b=F.trim();if(!b||b.startsWith(":")||!b.startsWith("data: "))continue;const q=b.slice(6);if(q!=="[DONE]")try{const O=JSON.parse(q),B=h.handleChunk(O);for(const H of B)yield H}catch(O){m?.error("Error parsing ChatCompletions stream chunk",{error:O instanceof Error?O.message:String(O),line:b})}}}for(const R of h.finalize())yield R}catch(f){if(l?.aborted)return;m?.error("Error in ChatCompletions streaming request",{error:f instanceof Error?f.message:String(f)}),yield{type:"error",data:{type:"STREAMING_ERROR",message:f instanceof Error?f.message:String(f),raw:f}}}}c(Bt,"createStreamingRequest$2");function Ht(t,e){return{name:"ChatCompletions",async createGenerationRequest(n,s){return await Ft({baseUrl:t,model:n,apiKey:e,...s})},createStreamingRequest(n,s){return Bt({baseUrl:t,model:n,apiKey:e,...s})}}}c(Ht,"chatCompletions");const k={GEMINI_3_1_PRO_PREVIEW:"gemini-3.1-pro-preview",GEMINI_3_1_PRO_PREVIEW_CUSTOMTOOLS:"gemini-3.1-pro-preview-customtools",GEMINI_3_PRO_PREVIEW:"gemini-3-pro-preview",GEMINI_3_FLASH_PREVIEW:"gemini-3-flash-preview",GEMINI_2_5_PRO:"gemini-2.5-pro",GEMINI_2_5_FLASH:"gemini-2.5-flash",GEMINI_2_5_FLASH_LITE:"gemini-2.5-flash-lite",GEMINI_2_5_FLASH_LITE_PREVIEW_09_2025:"gemini-2.5-flash-lite-preview-09-2025",GEMINI_2_0_FLASH:"gemini-2.0-flash",GEMINI_2_0_FLASH_001:"gemini-2.0-flash-001",GEMINI_2_0_FLASH_LITE:"gemini-2.0-flash-lite",GEMINI_2_0_FLASH_LITE_001:"gemini-2.0-flash-lite-001",GEMINI_FLASH_LATEST:"gemini-flash-latest",GEMINI_FLASH_LITE_LATEST:"gemini-flash-lite-latest",GEMINI_PRO_LATEST:"gemini-pro-latest",GEMMA_3_27B_IT:"gemma-3-27b-it",GEMMA_3_12B_IT:"gemma-3-12b-it",GEMMA_3_4B_IT:"gemma-3-4b-it",GEMMA_3_1B_IT:"gemma-3-1b-it",GEMMA_3N_E4B_IT:"gemma-3n-e4b-it",GEMMA_3N_E2B_IT:"gemma-3n-e2b-it"};k.GEMINI_3_1_PRO_PREVIEW,k.GEMINI_3_1_PRO_PREVIEW_CUSTOMTOOLS,k.GEMINI_3_PRO_PREVIEW,k.GEMINI_3_FLASH_PREVIEW,k.GEMINI_2_5_PRO,k.GEMINI_2_5_FLASH,k.GEMINI_2_5_FLASH_LITE,k.GEMINI_2_5_FLASH_LITE_PREVIEW_09_2025,k.GEMINI_2_0_FLASH,k.GEMINI_2_0_FLASH_001,k.GEMINI_2_0_FLASH_LITE,k.GEMINI_2_0_FLASH_LITE_001,k.GEMINI_FLASH_LATEST,k.GEMINI_FLASH_LITE_LATEST,k.GEMINI_PRO_LATEST,k.GEMMA_3_27B_IT,k.GEMMA_3_12B_IT,k.GEMMA_3_4B_IT,k.GEMMA_3_1B_IT,k.GEMMA_3N_E4B_IT,k.GEMMA_3N_E2B_IT;const Jt=k.GEMINI_3_FLASH_PREVIEW;function Re(t,e,n){const s={};return e&&(s.systemInstruction=e),t&&t.length>0&&(s.tools=t.map(r=>({functionDeclarations:[{name:r.name,description:r.description,parametersJsonSchema:j.toJSONSchema(r.schema)}]}))),n&&Object.assign(s,n),s}c(Re,"prepareConfig");function Oe(t){return t.map(Wt).filter(e=>e!==void 0)}c(Oe,"convertAxleMessagesToGemini");function Wt(t){switch(t.role){case"tool":return zt(t);case"assistant":return Kt(t);case"user":return Vt(t)}}c(Wt,"convertMessage$1");function zt(t){return{role:"user",parts:t.content.flatMap(e=>{const n={functionResponse:{id:e.id??void 0,name:e.name,response:{output:typeof e.content=="string"?e.content:e.content.filter(r=>r.type==="text").map(r=>r.text).join(`
26
+ `)}}};if(typeof e.content=="string")return[n];const s=e.content.filter(r=>r.type==="image").map(r=>({inlineData:{mimeType:r.mimeType,data:r.data}}));return[n,...s]})}}c(zt,"convertToolMessage$1");function Kt(t){const e=[],n=t.content.filter(r=>r.type==="text");if(n.length>0){const r=n.map(o=>o.text).join("");r&&e.push({text:r})}const s=t.content.filter(r=>r.type==="tool-call");return s.length>0&&e.push(...s.map(r=>{const o={functionCall:{id:r.id??void 0,name:r.name,args:r.parameters}};return r.providerMetadata?.thoughtSignature&&(o.thoughtSignature=r.providerMetadata.thoughtSignature),o})),{role:"model",parts:e}}c(Kt,"convertAssistantMessage$1");function Vt(t){return typeof t.content=="string"?{role:"user",parts:[{text:t.content}]}:{role:"user",parts:t.content.map(Xt).filter(n=>n!==null)}}c(Vt,"convertUserMessage$1");function Xt(t){return t.type==="text"?{text:t.text}:t.type==="file"&&(t.file.type==="image"||t.file.type==="document")?{inlineData:{mimeType:t.file.mimeType,data:t.file.base64}}:null}c(Xt,"convertContentPart$1");function Me(t){switch(t){case C.STOP:return[!0,S.Stop];case C.MAX_TOKENS:return[!0,S.Length];case C.FINISH_REASON_UNSPECIFIED:case C.SAFETY:case C.RECITATION:case C.LANGUAGE:case C.OTHER:case C.BLOCKLIST:case C.PROHIBITED_CONTENT:case C.SPII:case C.MALFORMED_FUNCTION_CALL:case C.IMAGE_SAFETY:return[!1,S.Error]}}c(Me,"convertStopReason");async function Zt(t){const{client:e,model:n,messages:s,system:r,tools:o,context:a,options:l}=t,u=a?.tracer,p=l?{...l}:{};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);const m={contents:Oe(s),config:Re(o,r,p)};u?.debug("Gemini request",{request:m});let d;try{const i=await e.models.generateContent({model:n,...m});d=Yt(i,{tracer:u})}catch(i){u?.error(i instanceof Error?i.message:String(i)),d=V(i)}return u?.debug("Gemini response",{result:d}),d}c(Zt,"createGenerationRequest$1");function Yt(t,e){const{tracer:n}=e,s=t.usageMetadata.promptTokenCount,r=t.usageMetadata.totalTokenCount-s,o={in:s,out:r};if(!t)return{type:"error",error:{type:"InvalidResponse",message:"Invalid or empty response from Google AI"},usage:{in:0,out:0},raw:t};if(t.promptFeedback&&t.promptFeedback.blockReason)return{type:"error",error:{type:"Blocked",message:`Response blocked by Google AI: ${t.promptFeedback.blockReason}, ${t.promptFeedback.blockReasonMessage}`},usage:o,raw:t};if(!t.candidates||t.candidates.length===0)return{type:"error",error:{type:"InvalidResponse",message:"Invalid or empty response from Google AI"},usage:{in:0,out:0},raw:t};t.candidates.length>1&&n?.warn(`We received ${t.candidates.length} response candidates`);const a=t.candidates[0],u=(a.content?.parts||[]).map(d=>d.text).filter(d=>d!==void 0).join(""),[p,m]=Me(a.finishReason);if(p){const d=[];if(u&&d.push({type:"text",text:u}),t.functionCalls)for(const i of t.functionCalls)if(i.args==null)d.push({type:"tool-call",id:i.id,name:i.name,parameters:{}});else{if(typeof i.args!="object"||Array.isArray(i.args))throw new Error(`Invalid tool call arguments for ${i.name}: expected object, got ${typeof i.args}`);d.push({type:"tool-call",id:i.id,name:i.name,parameters:i.args})}return{type:"success",id:t.responseId,model:t.modelVersion,role:"assistant",finishReason:t.functionCalls?S.FunctionCall:m,content:d,text:G(d)??"",usage:o,raw:t}}else return{type:"error",error:{type:"Undetermined",message:`Unexpected stop reason: ${m}`},usage:o,raw:t}}c(Yt,"fromModelResponse$1");function Qt(){let t=0,e=-1,n=!1,s="",r="",o=0,a=0,l=null;function u(m){e<0||(l==="text"?m.push({type:"text-complete",data:{index:e}}):l==="thinking"&&m.push({type:"thinking-complete",data:{index:e}}),l=null,e=-1)}c(u,"closeActivePart");function p(m){const d=[];s||(s=m.responseId||`gemini-${Date.now()}`,r=m.modelVersion||"gemini",d.push({type:"start",id:s,data:{model:r,timestamp:Date.now()}})),m.usageMetadata&&(o=m.usageMetadata.promptTokenCount||0,a=(m.usageMetadata.totalTokenCount||0)-o);const i=m.candidates?.[0];if(!i)return d;const g=i.content?.parts||[];for(const h of g){const f="thought"in h&&h.thought===!0;if(f&&h.text?(l!=="thinking"&&(u(d),e=t++,l="thinking",d.push({type:"thinking-start",data:{index:e}})),d.push({type:"thinking-delta",data:{index:e,text:h.text}})):h.text&&!f?(l!=="text"&&(u(d),e=t++,l="text",d.push({type:"text-start",data:{index:e}})),d.push({type:"text-delta",data:{text:h.text,index:e}})):h.functionCall||console.log(`[gemini] unhandled part type: ${JSON.stringify(Object.keys(h))}`),h.functionCall){u(d),n=!0;const _=t++,w=h.functionCall.id||`tool-${_}`;d.push({type:"tool-call-start",data:{index:_,id:w,name:h.functionCall.name}});const y={index:_,id:w,name:h.functionCall.name,arguments:h.functionCall.args??{}},E=h;E.thoughtSignature&&(y.providerMetadata={thoughtSignature:E.thoughtSignature}),d.push({type:"tool-call-complete",data:y})}}if(i.finishReason&&i.finishReason!==C.FINISH_REASON_UNSPECIFIED){u(d);const[h,f]=Me(i.finishReason),_=n?S.FunctionCall:f;!h&&!n?d.push({type:"error",data:{type:"FinishReasonError",message:`Unexpected finish reason: ${i.finishReason}`,usage:{in:o,out:a},raw:m}}):d.push({type:"complete",data:{finishReason:_,usage:{in:o,out:a}}})}return d}return c(p,"handleChunk"),{handleChunk:p}}c(Qt,"createGeminiStreamingAdapter");async function*en(t){const{client:e,model:n,messages:s,system:r,tools:o,runtime:a,signal:l,options:u}=t,p=a?.tracer,{serverTools:m,...d}=u??{},i=d?{...d}:{};i.max_tokens&&(i.maxOutputTokens=i.max_tokens,delete i.max_tokens),i.stop&&(i.stopSequences=Array.isArray(i.stop)?i.stop:[i.stop],delete i.stop),i.top_p!==void 0&&(i.topP=i.top_p,delete i.top_p);const g=Re(o,r,i);if(m){const _={web_search:"googleSearch",code_execution:"codeExecution"};g.tools||(g.tools=[]);for(const w of m){const y=_[w.name]??w.name;g.tools.push({[y]:w.config??{}})}}const h={contents:Oe(s),config:g};p?.debug("Gemini streaming request",{request:h});const f=Qt();try{const _=await e.models.generateContentStream({model:n,...h});for await(const w of _){const y=f.handleChunk(w);for(const E of y)yield E}}catch(_){if(l?.aborted)return;p?.error(_ instanceof Error?_.message:String(_)),yield{type:"error",data:{type:"STREAMING_ERROR",message:_ instanceof Error?_.message:String(_),raw:_}}}}c(en,"createStreamingRequest$1");const tn="Gemini";function nn(t){const e=new Ye({apiKey:t});return{name:tn,async createGenerationRequest(n,s){return await Zt({client:e,model:n,...s})},createStreamingRequest(n,s){const{messages:r,system:o,tools:a,context:l,signal:u,options:p}=s;return en({client:e,model:n,messages:r,system:o,tools:a,runtime:l,signal:u,options:p})}}}c(nn,"gemini");const Ce={GPT_5_2:"gpt-5.2",GPT_5_2_2025_12_11:"gpt-5.2-2025-12-11",GPT_5_2_CHAT_LATEST:"gpt-5.2-chat-latest",GPT_5_2_PRO:"gpt-5.2-pro",GPT_5_2_PRO_2025_12_11:"gpt-5.2-pro-2025-12-11",GPT_5_2_CODEX:"gpt-5.2-codex",GPT_5_1:"gpt-5.1",GPT_5_1_2025_11_13:"gpt-5.1-2025-11-13",GPT_5_1_CHAT_LATEST:"gpt-5.1-chat-latest",GPT_5_1_CODEX:"gpt-5.1-codex",GPT_5_1_CODEX_MAX:"gpt-5.1-codex-max",GPT_5_1_CODEX_MINI:"gpt-5.1-codex-mini",GPT_5:"gpt-5",GPT_5_2025_08_07:"gpt-5-2025-08-07",GPT_5_CHAT_LATEST:"gpt-5-chat-latest",GPT_5_CODEX:"gpt-5-codex",GPT_5_MINI:"gpt-5-mini",GPT_5_MINI_2025_08_07:"gpt-5-mini-2025-08-07",GPT_5_NANO:"gpt-5-nano",GPT_5_NANO_2025_08_07:"gpt-5-nano-2025-08-07",GPT_5_PRO:"gpt-5-pro",GPT_5_PRO_2025_10_06:"gpt-5-pro-2025-10-06",GPT_5_SEARCH_API:"gpt-5-search-api",GPT_5_SEARCH_API_2025_10_14:"gpt-5-search-api-2025-10-14",GPT_4_1:"gpt-4.1",GPT_4_1_2025_04_14:"gpt-4.1-2025-04-14",GPT_4_1_MINI:"gpt-4.1-mini",GPT_4_1_MINI_2025_04_14:"gpt-4.1-mini-2025-04-14",GPT_4_1_NANO:"gpt-4.1-nano",GPT_4_1_NANO_2025_04_14:"gpt-4.1-nano-2025-04-14",GPT_4O:"gpt-4o",GPT_4O_2024_11_20:"gpt-4o-2024-11-20",GPT_4O_2024_08_06:"gpt-4o-2024-08-06",GPT_4O_2024_05_13:"gpt-4o-2024-05-13",GPT_4O_MINI:"gpt-4o-mini",GPT_4O_MINI_2024_07_18:"gpt-4o-mini-2024-07-18",GPT_4O_SEARCH_PREVIEW:"gpt-4o-search-preview",GPT_4O_SEARCH_PREVIEW_2025_03_11:"gpt-4o-search-preview-2025-03-11",GPT_4O_MINI_SEARCH_PREVIEW:"gpt-4o-mini-search-preview",GPT_4O_MINI_SEARCH_PREVIEW_2025_03_11:"gpt-4o-mini-search-preview-2025-03-11",GPT_4_TURBO:"gpt-4-turbo",GPT_4_TURBO_2024_04_09:"gpt-4-turbo-2024-04-09",O4_MINI:"o4-mini",O4_MINI_2025_04_16:"o4-mini-2025-04-16",O3:"o3",O3_2025_04_16:"o3-2025-04-16",O3_PRO:"o3-pro",O3_PRO_2025_06_10:"o3-pro-2025-06-10",O3_MINI:"o3-mini",O3_MINI_2025_01_31:"o3-mini-2025-01-31",O1:"o1",O1_2024_12_17:"o1-2024-12-17",O1_PRO:"o1-pro",O1_PRO_2025_03_19:"o1-pro-2025-03-19"},sn=Ce.GPT_5_MINI;function Pe(t){if(t&&t.length>0)return t.map(e=>({type:"function",strict:!0,name:e.name,description:e.description,parameters:j.toJSONSchema(e.schema)}))}c(Pe,"prepareTools");function ve(t){return t.map(rn).flat(1)}c(ve,"convertAxleMessageToResponseInput");function rn(t){switch(t.role){case"tool":return on(t);case"assistant":return an(t);default:return cn(t)}}c(rn,"convertMessage");function on(t){return t.content.map(e=>({type:"function_call_output",call_id:e.id,output:typeof e.content=="string"?e.content:e.content.map(n=>n.type==="text"?{type:"input_text",text:n.text}:{type:"input_image",image_url:`data:${n.mimeType};base64,${n.data}`})}))}c(on,"convertToolMessage");function an(t){const e=[],n=G(t.content);n&&e.push({role:t.role,content:n});const s=t.content.filter(o=>o.type==="tool-call");for(const o of s)e.push({type:"function_call",call_id:o.id,name:o.name,arguments:JSON.stringify(o.parameters)});const r=t.content.filter(o=>o.type==="internal-tool");for(const o of r)o.output!=null&&e.push(o.output);return e}c(an,"convertAssistantMessage");function cn(t){if(typeof t.content=="string")return{role:t.role,content:t.content};{const e=t.content.map(ln).filter(n=>n!==null);return{role:t.role,content:e}}}c(cn,"convertUserMessage");function ln(t){if(t.type==="text")return{type:"input_text",text:t.text};if(t.type==="file"){if(t.file.type==="image")return{type:"input_image",image_url:`data:${t.file.mimeType};base64,${t.file.base64}`,detail:"auto"};if(t.file.type==="document")return{type:"input_file",filename:t.file.path,file_data:`data:${t.file.mimeType};base64,${t.file.base64}`}}return t.type==="thinking",null}c(ln,"convertContentPart");async function un(t){const{client:e,model:n,messages:s,system:r,tools:o,context:a,options:l}=t,u=a?.tracer,p=Pe(o),m={model:n,input:ve(s),...r&&{instructions:r},...p?{tools:p}:{},...l};u?.debug("OpenAI ResponsesAPI request",{request:m});let d;try{const i=await e.responses.create(m);d=pn(i)}catch(i){u?.error(i instanceof Error?i.message:String(i)),d=V(i)}return u?.debug("OpenAI ResponsesAPI response",{result:d}),d}c(un,"createGenerationRequest");function pn(t){if(t.error)return{type:"error",error:{type:t.error.code||"undetermined",message:t.error.message||"Response generation failed"},usage:{in:t.usage?.input_tokens??0,out:t.usage?.output_tokens??0},raw:t};const e=t.output?.filter(r=>r.type==="reasoning")?.map(r=>r),n=[];if(e&&e.length>0)for(const r of e){const o=r.summary?.[0]?.text||r.content?.[0]?.text||"";(o||r.encrypted_content)&&n.push({type:"thinking",text:o,...r.encrypted_content&&{encrypted:r.encrypted_content}})}t.output_text&&n.push({type:"text",text:t.output_text});const s=t.output?.filter(r=>r.type==="function_call");if(s&&s.length>0)for(const r of s){const o=r;try{n.push({type:"tool-call",id:o.id||"",name:o.name||"",parameters:o.arguments?JSON.parse(o.arguments):{}})}catch(a){throw new Error(`Failed to parse tool call arguments for ${o.name}: ${a instanceof Error?a.message:String(a)}
27
+ Raw value: ${o.arguments}`)}}return{type:"success",id:t.id,model:t.model||"",role:"assistant",finishReason:t.incomplete_details?S.Error:S.Stop,content:n,text:G(n)??"",usage:{in:t.usage?.input_tokens??0,out:t.usage?.output_tokens??0},raw:t}}c(pn,"fromModelResponse");function dn(){let t="",e="",n=0,s=-1,r=!1;const o=new Map,a=new Map,l=new Set(["web_search_call","file_search_call","code_interpreter_call"]),u=new Map;function p(m){const d=[];switch(m.type){case"response.created":{t=m.response.id||`openai-${Date.now()}`,e=m.response.model,d.push({type:"start",id:t,data:{model:e,timestamp:Date.now()}});break}case"response.output_text.delta":{s===-1&&(s=n++,d.push({type:"text-start",data:{index:s}})),d.push({type:"text-delta",data:{text:m.delta,index:s}});break}case"response.output_text.done":{s>=0&&(d.push({type:"text-complete",data:{index:s}}),s=-1);break}case"response.function_call_arguments.delta":{const i=m.item_id;if(!u.has(i)){const h=o.get(i),f=h?.name||"",_=h?.callId||i,w=n++;u.set(i,{id:i,callId:_,name:f,argumentsBuffer:"",partIdx:w}),d.push({type:"tool-call-start",data:{index:w,id:_,name:f}})}const g=u.get(i);g.argumentsBuffer+=m.delta;break}case"response.function_call_arguments.done":{r=!0;const i=m.item_id,g=u.get(i),h=m.name||g?.name||"";if(g){try{const f=m.arguments?JSON.parse(m.arguments):{};d.push({type:"tool-call-complete",data:{index:g.partIdx,id:g.callId,name:h,arguments:f}})}catch(f){throw new Error(`Failed to parse function call arguments for ${h}: ${f instanceof Error?f.message:String(f)}
28
+ Raw value: ${m.arguments}`)}u.delete(i)}break}case"response.completed":{const i=m.response.usage;d.push({type:"complete",data:{finishReason:m.response.incomplete_details?S.Error:r?S.FunctionCall:S.Stop,usage:{in:i?.input_tokens||0,out:i?.output_tokens||0}}});break}case"response.failed":{d.push({type:"error",data:{type:"RESPONSES_API_ERROR",message:`Response failed: ${m.response.status}`,raw:m}});break}case"response.output_item.added":{if(m.item?.type==="reasoning")s=n++,d.push({type:"thinking-start",data:{index:s}});else if(m.item?.type==="function_call"){const i=m.item,g=i.id||i.call_id;g&&o.set(g,{name:i.name||"",callId:i.call_id||g})}else if(m.item&&l.has(m.item.type)){const i=m.item,g=n++;a.set(i.id,g),d.push({type:"internal-tool-start",data:{index:g,id:i.id,name:i.type}})}break}case"response.output_item.done":{if(m.item?.type==="reasoning"&&s>=0)d.push({type:"thinking-complete",data:{index:s}}),s=-1;else if(m.item&&l.has(m.item.type)){const i=m.item,g=a.get(i.id);g!==void 0&&(d.push({type:"internal-tool-complete",data:{index:g,id:i.id,name:i.type,output:m.item}}),a.delete(i.id))}break}case"response.reasoning_text.delta":{m.delta&&d.push({type:"thinking-delta",data:{index:s,text:m.delta}});break}case"response.reasoning_summary_text.delta":{m.delta&&d.push({type:"thinking-summary-delta",data:{index:s,text:m.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: ${m.type}`)}return d}return c(p,"handleEvent"),{handleEvent:p}}c(dn,"createStreamingAdapter");async function*mn(t){const{client:e,model:n,messages:s,system:r,tools:o,runtime:a,signal:l,options:u}=t,p=a?.tracer,{serverTools:m,...d}=u??{},i=Pe(o)??[];if(m){const f={web_search:"web_search_preview",code_execution:"code_interpreter"};for(const _ of m){const w=f[_.name]??_.name;i.push({type:w,..._.config})}}const g={model:n,input:ve(s),...r&&{instructions:r},stream:!0,...i.length>0?{tools:i}:{},...d};p?.debug("OpenAI ResponsesAPI streaming request",{request:g});const h=dn();try{const f=e.responses.stream(g,...l?[{signal:l}]:[]);for await(const _ of f){const w=h.handleEvent(_);for(const y of w)yield y}}catch(f){if(l?.aborted)return;p?.error(f instanceof Error?f.message:String(f)),yield{type:"error",data:{type:"STREAMING_ERROR",message:f instanceof Error?f.message:String(f),raw:f}}}}c(mn,"createStreamingRequest");const fn="OpenAI";function hn(t){const e=new Qe({apiKey:t});return{name:fn,async createGenerationRequest(n,s){return await un({client:e,model:n,...s})},createStreamingRequest(n,s){const{messages:r,system:o,tools:a,context:l,signal:u,options:p}=s;return mn({client:e,model:n,messages:r,system:o,tools:a,runtime:l,signal:u,options:p})}}}c(hn,"openai");async function Ne(t){const{provider:e,model:n,messages:s,system:r,tools:o,tracer:a,options:l}=t;return e.createGenerationRequest(n,{messages:s,system:r,tools:o,context:{tracer:a},options:l})}c(Ne,"generateTurn");async function Le(t){const{provider:e,model:n,messages:s,system:r,tools:o,onToolCall:a,maxIterations:l,tracer:u,options:p}=t,m=[...s],d=[],i={in:0,out:0};let g=0,h;const f=c(y=>{m.push(y),d.push(y)},"addMessage"),_=c(y=>(u?.setResult({kind:"llm",model:n,request:{messages:s},response:{content:y.result==="success"?y.final?.content:null},usage:y.usage?{inputTokens:y.usage.in,outputTokens:y.usage.out}:void 0,finishReason:y.result==="success"?y.final?.finishReason:void 0}),u?.end(y.result==="error"?"error":"ok"),y),"endWithResult"),w=c((y,E)=>{if(!y||E.type==="error"){y?.end("error");return}y.setResult({kind:"llm",model:E.model??n,request:{messages:m},response:{content:E.content},usage:E.usage?{inputTokens:E.usage.in,outputTokens:E.usage.out}:void 0,finishReason:E.finishReason}),y.end()},"setTurnResult");for(;;){if(l!==void 0&&g>=l)return _({result:"error",messages:d,error:{type:"model",error:{type:"error",error:{type:"MaxIterations",message:`Exceeded max iterations (${l})`}}},usage:i});g+=1;const y=u?.startSpan(`turn-${g}`,{type:"llm"}),E=await Ne({provider:e,model:n,messages:m,system:r,tools:o,tracer:y,options:p});if(lt(i,E),w(y,E),E.type==="error")return _({result:"error",messages:d,error:{type:"model",error:E},usage:i});const R={role:"assistant",id:E.id,model:E.model,content:E.content,finishReason:E.finishReason};if(f(R),h=R,E.finishReason!==S.FunctionCall)return _({result:"success",messages:d,final:h,usage:i});const T=ct(E.content);if(T.length===0)return _({result:"success",messages:d,final:h,usage:i});const{results:v}=await fe(T,a,u);v.length>0&&f({role:"tool",content:v})}}c(Le,"generate");const gn=M.object({searchTerm:M.string().describe("The search term to query")});class _n{static{c(this,"BraveSearchTool")}name="brave";description="Perform a search using the Brave search engine";schema=gn;apiKey;throttle;lastExecTime=0;constructor(e){e&&this.configure(e)}configure(e){const{rateLimit:n}=e;this.apiKey=e["api-key"],this.throttle=n?1100/n:void 0}async execute(e){const{searchTerm:n}=e;if(this.throttle){for(;Date.now()-this.lastExecTime<this.throttle;)await bt(this.throttle-(Date.now()-this.lastExecTime));this.lastExecTime=Date.now()}try{const s=this.apiKey,r="https://api.search.brave.com/res/v1/web/search",o=new URL(r);o.searchParams.append("q",n),o.searchParams.append("format","json");const a=await fetch(o.toString(),{method:"GET",headers:{Accept:"application/json","X-Subscription-Token":s}});if(!a.ok)throw new Error(`[Brave] HTTP error ${a.status}: ${a.statusText}`);const l=await a.json();return JSON.stringify(l)}catch(s){throw s instanceof Error?new Error(`[Brave] Error fetching search results: ${s.message}`):s}}}const yn=new _n,xn=A.object({operation:A.enum(["add","subtract","multiply","divide"]).describe("The operation to perform (add, subtract, multiply, divide)"),a:A.number().describe("First operand"),b:A.number().describe("Second operand")}),En={name:"calculator",description:"Performs basic arithmetic operations",schema:xn,execute:c(async({operation:t,a:e,b:n})=>{switch(t){case"add":return`${e} + ${n} = ${e+n}`;case"subtract":return`${e} - ${n} = ${e-n}`;case"multiply":return`${e} * ${n} = ${e*n}`;case"divide":if(n===0)throw new Error("Cannot divide by zero");return`${e} / ${n} = ${e/n}`;default:throw new Error(`Unknown operation: ${t}`)}},"execute")},wn=tt(et),Tn=3e4,Sn=1024*1024;async function In(t,e={}){const{stdout:n,stderr:s}=await wn(t,{cwd:e.cwd,timeout:e.timeout??Tn,maxBuffer:e.maxBuffer??Sn});return{stdout:n,stderr:s}}c(In,"runCommand");function bn(t){if(t instanceof Error){const e=t;let n=`Error executing command: ${t.message}`;return e.stdout&&(n+=`
29
+ [stdout]: ${e.stdout}`),e.stderr&&(n+=`
30
+ [stderr]: ${e.stderr}`),n}return`Error executing command: ${String(t)}`}c(bn,"formatExecError");function kn(t,e){return e&&e.trim()?`${t}
31
+ [stderr]: ${e}`:t}c(kn,"formatOutput");const $n=M.object({command:M.string().describe("The shell command to execute")});class An{static{c(this,"ExecTool")}name="exec";description="Execute a shell command and return the output.";schema=$n;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){const{command:n}=e;try{const s=await In(n,{timeout:this.timeout,maxBuffer:this.maxBuffer,cwd:this.cwd});return kn(s.stdout,s.stderr)}catch(s){return bn(s)}}}const Rn=new An,On=A.object({path:A.string().describe("The file path to patch"),old_string:A.string().describe("The exact text to find and replace"),new_string:A.string().describe("The replacement text"),start_line:A.number().int().positive().describe("1-indexed start line of the region to match within"),end_line:A.number().int().positive().describe("1-indexed end line (inclusive) of the region to match within")}),Mn={name:"patch-file",description:"Patch a file by replacing an exact string match within a specified line range",schema:On,summarize:c(({path:t,start_line:e,end_line:n})=>`${t}:${e}:${n}`,"summarize"),execute:c(async({path:t,old_string:e,new_string:n,start_line:s,end_line:r})=>{if(r<s)throw new Error(`end_line (${r}) must be >= start_line (${s})`);let o;try{o=await J(t,"utf-8")}catch(h){throw h instanceof Error?new Error(`Failed to read file "${t}": ${h.message}`):h}const a=o.split(`
32
+ `);if(s>a.length)throw new Error(`start_line (${s}) exceeds file length (${a.length} lines)`);if(r>a.length)throw new Error(`end_line (${r}) exceeds file length (${a.length} lines)`);const u=a.slice(s-1,r).join(`
33
+ `),p=u.indexOf(e);if(p===-1)throw new Error(`old_string not found within lines ${s}-${r} of "${t}"`);if(u.indexOf(e,p+1)!==-1)throw new Error(`old_string matches multiple times within lines ${s}-${r} of "${t}"`);const d=u.replace(e,n),g=[...a.slice(0,s-1),...d.split(`
34
+ `),...a.slice(r)].join(`
35
+ `);try{await ce(t,g,"utf-8")}catch(h){throw h instanceof Error?new Error(`Failed to write file "${t}": ${h.message}`):h}return`Successfully patched "${t}" (lines ${s}-${r})`},"execute")},Cn=A.object({path:A.string().describe("The file path to read from")}),Pn={name:"read-file",description:"Read the contents of a file from disk",schema:Cn,summarize:c(({path:t})=>t,"summarize"),execute:c(async({path:t})=>{try{return await J(t,"utf-8")}catch(e){throw e instanceof Error?new Error(`Failed to read file "${t}": ${e.message}`):e}},"execute")},vn=A.object({path:A.string().describe("The file path to write to"),content:A.string().describe("The content to write to the file")}),Nn={name:"write-file",description:"Write content to a file on disk, creating directories if needed",schema:vn,summarize:c(({path:t})=>t,"summarize"),execute:c(async({path:t,content:e})=>{try{return await Ke(Ve(t),{recursive:!0}),await ce(t,e,"utf-8"),`Successfully wrote ${e.length} characters to "${t}"`}catch(n){throw n instanceof Error?new Error(`Failed to write file "${t}": ${n.message}`):n}},"execute")};function Ue(t){try{const e=j.fromJSONSchema(t);return e instanceof j.ZodObject?e.strict():j.object({}).passthrough()}catch{return j.object({}).passthrough()}}c(Ue,"jsonSchemaToZod");function Ln(t,e,n){return t.map(s=>Gn(s,e,n))}c(Ln,"createMcpTools");function Un(t,e){return t.map(n=>{const s=e?`${e}_${n.name}`:n.name,r=Ue(n.inputSchema);return{name:s,description:n.description??"",schema:r}})}c(Un,"createMcpToolDefinitions");function Gn(t,e,n){const s=n?`${n}_${t.name}`:t.name,r=Ue(t.inputSchema);return{name:s,description:t.description??"",schema:r,async execute(o){const a=await e.callTool({name:t.name,arguments:o});if("isError"in a&&a.isError)throw new Error(Fn(a.content));return Dn(a.content)}}}c(Gn,"createMcpTool");function Dn(t){return t.some(n=>n.type==="image")?t.filter(n=>n.type==="text"||n.type==="image").map(n=>{if(n.type==="text")return{type:"text",text:n.text};const s=n;return{type:"image",data:s.data,mimeType:s.mimeType}}):t.filter(n=>n.type==="text").map(n=>n.text).join(`
36
+ `)}c(Dn,"formatToolResult");function Fn(t){return t.filter(e=>e.type==="text").map(e=>e.text).join(`
37
+ `)||"MCP tool execution error"}c(Fn,"formatErrorContent");class jn{static{c(this,"MCP")}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;const n=e?.tracer?.startSpan("mcp:connect",{type:"internal"});this.client=new nt({name:"axle",version:"1.0.0"}),this.config.transport==="stdio"?this.transport=new st({command:this.config.command,args:this.config.args,env:this.config.env}):this.transport=new rt(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,n?.end("ok")}catch(s){throw n?.end("error"),s}}async listTools(e){const n=this.assertConnected(),s=await this.fetchTools(n,e?.tracer);return Ln(s,n,e?.prefix)}async listToolDefinitions(e){const n=this.assertConnected(),s=await this.fetchTools(n,e?.tracer);return Un(s,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,n){if(this.cachedMcpTools)return this.cachedMcpTools;n?.debug("mcp:listTools");const s=await e.listTools();return this.cachedMcpTools=s.tools.map(r=>({name:r.name,description:r.description,inputSchema:r.inputSchema})),this.cachedMcpTools}assertConnected(){if(!this._connected||!this.client)throw new Error("MCP not connected. Call connect() first.");return this.client}}const Ge={debug:0,info:1,warn:2,error:3};class qn{static{c(this,"Tracer")}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){const n=this.writers.indexOf(e);n!==-1&&this.writers.splice(n,1)}startSpan(e,n){const s={traceId:crypto.randomUUID(),spanId:crypto.randomUUID(),name:e,type:n?.type,startTime:performance.now(),status:"ok",attributes:{},events:[]};return this.writers.forEach(r=>r.onSpanStart(s)),new se(s,this)}async flush(){for(const e of this.writers)e.flush&&await e.flush()}_notifySpanEnd(e){this.writers.forEach(n=>n.onSpanEnd(e))}_notifySpanUpdate(e){this.writers.forEach(n=>n.onSpanUpdate?.(e))}_notifyEvent(e,n){this.writers.forEach(s=>s.onEvent?.(e,n))}_notifySpanStart(e){this.writers.forEach(n=>n.onSpanStart(e))}_shouldLog(e){return Ge[e]>=Ge[this._minLevel]}}class se{static{c(this,"Span")}data;tracer;ended=!1;constructor(e,n){this.data=e,this.tracer=n}startSpan(e,n){const s={traceId:this.data.traceId,spanId:crypto.randomUUID(),parentSpanId:this.data.spanId,name:e,type:n?.type,startTime:performance.now(),status:"ok",attributes:{},events:[]};return this.tracer._notifySpanStart(s),new se(s,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,n,s){if(this.ended||!this.tracer._shouldLog(n))return;const r={name:e,timestamp:performance.now(),level:n,attributes:s};this.data.events.push(r),this.tracer._notifyEvent(this.data,r)}debug(e,n){this.addEvent(e,"debug",n)}info(e,n){this.addEvent(e,"info",n)}warn(e,n){this.addEvent(e,"warn",n)}error(e,n){this.addEvent(e,"error",n)}setAttribute(e,n){this.ended||(this.data.attributes[e]=n,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 De={debug:0,info:1,warn:2,error:3};let Fe=!1;function Bn(){Fe||(ue.use(ot()),Fe=!0)}c(Bn,"ensureMarkedInit");class Hn{static{c(this,"SimpleWriter")}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 De[e]>=De[this.minLevel]}isSpanVisible(e){return!(e.type==="internal"&&!this.showInternal)}findVisibleAncestor(e){let n=e.parentSpanId;for(;n;){const s=this.spans.get(n);if(!s)break;if(this.isSpanVisible(s))return s;n=s.parentSpanId}return null}calculateVisibleDepth(e){if(!this.isSpanVisible(e))return-1;const n=this.findVisibleAncestor(e);return n?(this.visibleDepths.get(n.spanId)??0)+1:0}formatTimestamp(){if(!this.showTimestamp)return"";const e=new Date,n=e.toTimeString().slice(0,8),s=e.getMilliseconds().toString().padStart(3,"0");return`[${n}.${s}] `}formatDuration(e){if(!this.showDuration||!e.endTime)return"";const n=e.endTime-e.startTime;return n<1e3?` (${Math.round(n)}ms)`:` (${(n/1e3).toFixed(2)}s)`}formatIndent(e){return" ".repeat(e)}formatSpanName(e){return e.type?`[${e.type}] ${e.name}`:e.name}renderMarkdown(e){return Bn(),ue.parse(e).trimEnd()}onSpanStart(e){if(this.spans.set(e.spanId,e),!this.isSpanVisible(e))return;const s=this.calculateVisibleDepth(e);this.visibleDepths.set(e.spanId,s);const r=this.formatIndent(s),o=this.formatTimestamp(),a=this.formatSpanName(e);this.output(`${o}${r}START ${a}`)}onSpanEnd(e){if(this.spans.set(e.spanId,e),!this.isSpanVisible(e))return;const s=this.visibleDepths.get(e.spanId)??0,r=this.formatIndent(s),o=this.formatTimestamp(),a=this.formatDuration(e),l=this.formatSpanName(e),u=e.status==="error"?" [ERROR]":"";if(this.output(`${o}${r}END ${l}${a}${u}`),e.result?.kind==="llm"){const p=e.result,m=[`model=${p.model}`];if(p.finishReason&&m.push(`finishReason=${p.finishReason}`),p.usage&&(p.usage.inputTokens!==void 0&&m.push(`inputTokens=${p.usage.inputTokens}`),p.usage.outputTokens!==void 0&&m.push(`outputTokens=${p.usage.outputTokens}`)),this.output(`${o}${r} INFO LLM complete ${m.join(" ")}`),this.shouldShowEvent("debug")&&p.response.content){const i=(typeof p.response.content=="string"?p.response.content:JSON.stringify(p.response.content,null,2)).split(`
38
+ `);for(const g of i)this.output(`${o}${r} DEBUG ${g}`)}}}onSpanUpdate(e){this.spans.set(e.spanId,e)}onEvent(e,n){if(!this.shouldShowEvent(n.level))return;this.spans.set(e.spanId,e);let s;if(this.isSpanVisible(e))s=this.visibleDepths.get(e.spanId)??0;else{const d=this.findVisibleAncestor(e);s=d?this.visibleDepths.get(d.spanId)??0:0}const r=this.formatIndent(s+1),o=this.formatTimestamp(),a=n.level.toUpperCase().padEnd(5),l=this.markdown&&n.attributes?.markdown===!0,u=n.attributes?Object.entries(n.attributes).filter(([d])=>d!=="markdown"):[];let p=n.name;l&&(p=this.renderMarkdown(p));let m=`${o}${r}${a} ${p}`;if(u.length>0){const d=u.map(([i,g])=>`${i}=${JSON.stringify(g)}`).join(" ");m+=` ${d}`}this.output(m)}}const Jn=`You are a memory extraction system. Your job is to extract learnings from a conversation that should be remembered for future runs.
39
+
40
+ Only extract:
41
+ - Explicit user corrections (e.g., "No, always use bullet points")
42
+ - Stated preferences (e.g., "I prefer concise summaries")
43
+ - Patterns that clearly emerged from user feedback
44
+
45
+ Do NOT extract:
46
+ - General knowledge or facts from the conversation content
47
+ - Inferences or speculation about what the user might want
48
+ - Task-specific details that won't apply to future runs
49
+
50
+ Respond with a JSON array of instruction strings. Each instruction should be a clear, actionable directive.
51
+ If there are no learnings to extract, respond with an empty array: []
52
+
53
+ Example response:
54
+ ["Always use bullet points for lists", "Keep summaries under 3 sentences"]`;class Wn{static{c(this,"ProceduralMemory")}provider;model;enableTools;lastStore;lastName;lastScope;constructor(e){this.provider=e.provider,this.model=e.model,this.enableTools=e.enableTools??!1}async recall(e){const n=e.tracer?.startSpan("memory.recall",{type:"internal"});this.lastStore=e.store,this.lastName=e.name,this.lastScope=e.scope;const s=await this.loadStore(e.store,e.name,e.scope);if(s.instructions.length===0)return n?.info("no stored instructions"),n?.end(),{};n?.info("loaded instructions",{count:s.instructions.length});const r=s.instructions.map((o,a)=>`${a+1}. ${o}`).join(`
55
+ `);return n?.end(),{systemSuffix:`## Learned Instructions
56
+
57
+ ${r}`}}async record(e){if(!e.newMessages||e.newMessages.length===0)return;const n=e.tracer?.startSpan("memory.record",{type:"internal"}),s=this.formatMessages(e.newMessages);if(!s.trim()){n?.info("no text content to extract from"),n?.end();return}const r=n?.startSpan("memory.extract",{type:"llm"}),o=await Le({provider:this.provider,model:this.model,messages:[{role:"user",content:s}],system:Jn,tracer:r});if(o.result!=="success"||!o.final){n?.warn("extraction failed",{result:o.result}),n?.end();return}const a=G(o.final.content);if(!a){n?.end();return}const l=this.parseInstructions(a);if(l.length===0){n?.info("no instructions extracted"),n?.end();return}const u=await this.loadStore(e.store,e.name,e.scope);u.instructions.push(...l),await this.saveStore(e.store,e.name,e.scope,u),n?.info("saved instructions",{count:l.length}),n?.end()}tools(){if(!this.enableTools)return[];const 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:A.object({instruction:A.string().describe("The instruction to remember")}),async execute(r){if(!e.lastStore)return"Error: memory not initialized (no recall has been called yet)";const o=await e.loadStore(e.lastStore,e.lastName,e.lastScope);return o.instructions.push(r.instruction),await e.saveStore(e.lastStore,e.lastName,e.lastScope,o),`Instruction saved: "${r.instruction}"`}}]}formatMessages(e){const n=[];for(const s of e)if(s.role==="user"){const r=typeof s.content=="string"?s.content:G(s.content);r&&n.push(`User: ${r}`)}else if(s.role==="assistant"){const r=G(s.content);r&&n.push(`Assistant: ${r}`)}return n.join(`
58
+
59
+ `)}parseInstructions(e){let n=e.trim();const s=n.match(/^```(?:json)?\s*\n?([\s\S]*?)\n?\s*```$/);s&&(n=s[1].trim());try{const r=JSON.parse(n);if(Array.isArray(r)&&r.every(o=>typeof o=="string"))return r}catch{}return[]}getStorePath(e,n){const s=e??"default";let r=s;if(n&&Object.keys(n).length>0){const a=Object.entries(n).sort(([u],[p])=>u.localeCompare(p)).map(([u,p])=>`${u}=${p}`).join("&"),l=at.createHash("sha256").update(a).digest("hex").slice(0,8);r=`${s}-${l}`}return`memory/procedural/${r}.json`}async loadStore(e,n,s){const r=this.getStorePath(n,s),o=await e.read(r);if(o)try{const a=JSON.parse(o);if(a&&Array.isArray(a.instructions))return{instructions:a.instructions}}catch{}return{instructions:[]}}async saveStore(e,n,s,r){if(!r)return;const o=this.getStorePath(n,s);await e.write(o,JSON.stringify(r,null,2))}}export{ft as A,It as D,de as H,St as I,ge as L,$ as M,Wn as P,Hn as S,qn as T,Jt as a,k as b,sn as c,Ce as d,S as e,jn as f,vt as g,yn as h,En as i,Ht as j,xe as k,nn as l,Le as m,Ne as n,Tt as o,hn as p,_e as q,z as r,he as s,gt as t,Pn as u,Mn as v,Nn as w,Rn as x};
package/dist/cli.js CHANGED
@@ -1,8 +1,8 @@
1
1
  #!/usr/bin/env node
2
- var Z=Object.defineProperty;var l=(e,t)=>Z(e,"name",{value:t,configurable:!0});import{Command as K}from"@commander-js/extra-typings";import U from"yaml";import{t as D,m as Q,a as X,o as ee,D as te,j as oe,d as re,q as ne,u as J,i as ie,p as x,I as N,h as _,w as ae,v as se,x as ce,y as le,l as pe,k as ue,T as fe,S as B}from"./simple-Cn_DeT3l.js";import{z as o}from"zod";import{glob as me}from"glob";import{readFile as G,mkdir as de,appendFile as ge}from"node:fs/promises";import{createInterface as he}from"node:readline";import{createHash as we}from"node:crypto";import{dirname as ye}from"node:path";import"mime";import"@anthropic-ai/sdk";import"@google/genai";import"openai";import"node:child_process";import"node:util";import"@modelcontextprotocol/sdk/client/index.js";import"@modelcontextprotocol/sdk/client/stdio.js";import"@modelcontextprotocol/sdk/client/streamableHttp.js";import"marked";import"marked-terminal";function ve(e,t){if(!t||Object.keys(t).length===0)throw new D(`The provider ${e} is not configured. Please check your configuration.`);switch(e){case"openai":return{provider:ne(t["api-key"]),model:t.model||re};case"anthropic":return{provider:oe(t["api-key"]),model:t.model||te};case"gemini":return{provider:ee(t["api-key"]),model:t.model||X};case"chatcompletions":{const r=t;return{provider:Q(r["base-url"],r["api-key"]),model:r.model}}default:throw new D("The provider is unsupported")}}l(ve,"getProvider");var be="0.8.1",Se={version:be};o.object({value:o.string()});const ke=o.object({"api-key":o.string(),rateLimit:o.number().optional()});o.object({timeout:o.number().optional(),maxBuffer:o.number().optional(),cwd:o.string().optional()});const Ee=o.object({type:o.literal("chatcompletions")}).loose(),Te=o.object({type:o.literal("anthropic")}).loose(),je=o.object({type:o.literal("openai")}).loose(),Ae=o.object({type:o.literal("gemini")}).loose(),Ce=o.discriminatedUnion("type",[Ee,Te,je,Ae]),Oe=o.object({chatcompletions:o.custom().optional(),anthropic:o.custom().optional(),openai:o.custom().optional(),gemini:o.custom().optional(),brave:ke.optional()}).loose(),xe=o.object({transport:o.literal("stdio"),name:o.string().optional(),command:o.string(),args:o.array(o.string()).optional(),env:o.record(o.string(),o.string()).optional()}),Fe=o.object({transport:o.literal("http"),name:o.string().optional(),url:o.string(),headers:o.record(o.string(),o.string()).optional()}),Le=o.discriminatedUnion("transport",[xe,Fe]),Ie=o.object({files:o.string(),resume:o.boolean().default(!1),concurrency:o.number().int().positive().default(3)}),Me=o.object({provider:Ce,task:o.string(),tools:o.array(o.string()).optional(),server_tools:o.array(o.string()).optional(),files:o.array(o.string()).optional(),mcps:o.array(Le).optional(),batch:Ie.optional()}),Pe="axle.job",$e=["yaml","yml","json"];async function Ue(e,t){const{tracer:r}=t,{content:s,format:c}=await J(e,{defaults:{name:Pe,formats:$e},tag:"Job File"});let i=null;if(c==="json")i=JSON.parse(s);else if(c==="yaml"||c==="yml")i=U.parse(s);else throw new Error("Invalid job file format");r?.debug("Job config: "+JSON.stringify(i,null,2));const a=Me.safeParse(i);if(!a.success)throw new Error(`The job file is not valid:
3
- ${H(a.error)}`);return a.data}l(Ue,"getJobConfig");const De="axle.config",Je=["yaml","yml","json"];async function Ne(e,t){const{tracer:r}=t,{content:s,format:c}=await J(e,{defaults:{name:De,formats:Je},tag:"Config File"});let i=null;if(c==="json")i=JSON.parse(s);else if(c==="yaml"||c==="yml")i=U.parse(s);else throw new Error("Invalid config file format");r?.debug("Service config: "+JSON.stringify(i,null,2));const a=Oe.safeParse(i);if(!a.success)throw new Error(`The config file is not valid:
4
- ${H(a.error)}`);return a.data}l(Ne,"getServiceConfig");function H(e){return e.issues.map(t=>` - ${t.path.join(".")||"root"}: ${t.message}`).join(`
5
- `)}l(H,"formatZodError");async function _e(e,t){const r=[];for(const s of e){const c=new ie(s);await c.connect({tracer:t}),r.push(c)}return r}l(_e,"connectMcps");async function Be(e,t){for(const r of e)try{await r.close({tracer:t})}catch{}}l(Be,"closeMcps");const W=".axle/batch.jsonl";function Ge(e,t){const r=we("sha256");return r.update(e),r.update("\0"),r.update(t),r.digest("hex")}l(Ge,"computeHash");async function He(e=W){const t=new Map;let r;try{r=await G(e,"utf-8")}catch{return t}for(const s of r.split(`
6
- `)){const c=s.trim();if(c)try{const i=JSON.parse(c);i.file&&i.hash&&t.set(i.file,i)}catch{}}return t}l(He,"loadLedger");async function We(e,t=W){await de(ye(t),{recursive:!0}),await ge(t,JSON.stringify(e)+`
7
- `,"utf-8")}l(We,"appendLedgerEntry");async function Re(e,t,r,s,c,i,a,f,h){const d=new N(e.task);if(e.files)for(const p of e.files)d.addFile(await x(p));const w=h.startSpan("job",{type:"workflow"}),E=new _({provider:t,model:r,tools:s,mcps:c,tracer:w});try{const p=await E.send(d,i).final;if(f.in+=p.usage.in,f.out+=p.usage.out,p.response){const v=typeof p.response=="string"?p.response:JSON.stringify(p.response,null,2);h.info(v,{markdown:!0})}a.interactive&&await qe(E,f,h),w.end()}catch(p){const v=p instanceof Error?p.message:String(p);throw w.error(v),w.end("error"),p}}l(Re,"runSingle");async function qe(e,t,r){const s=he({input:process.stdin,output:process.stdout});s.on("SIGINT",()=>{s.close()});const c=l(i=>new Promise(a=>{s.question(i,a),s.once("close",()=>a(null))}),"prompt");try{for(;;){const i=await c(`
8
- > `);if(i===null||i.trim()==="")break;try{const a=await e.send(i.trim()).final;if(t.in+=a.usage.in,t.out+=a.usage.out,a.response){const f=typeof a.response=="string"?a.response:JSON.stringify(a.response,null,2);r.info(f,{markdown:!0})}}catch(a){const f=a instanceof Error?a.message:String(a);r.error(f)}}}finally{s.close()}}l(qe,"runInteractiveLoop");async function ze(e,t,r,s,c,i,a,f,h){const d=e.batch,w=await me(d.files);if(w.length===0){h.warn(`No files matched pattern: ${d.files}`);return}h.info(`Batch: ${w.length} file(s) matched "${d.files}"`);const E=d.resume?await He():new Map,p=e.files?await Promise.all(e.files.map(y=>x(y))):[];let v=0,I=0,M=0;const z=d.concurrency??3;await Ve(z,w,async y=>{const b=h.startSpan(`batch:${y}`,{type:"workflow"});try{const S=await G(y),T=Ge(e.task,S),P=E.get(y);if(d.resume&&P&&P.hash===T){b.info("Skipped (already completed)"),b.end(),I++;return}const O=new N(e.task);for(const Y of p)O.addFile(Y);O.addFile(await x(y));const V={...i,file:y},$=await new _({provider:t,model:r,tools:s,mcps:c,tracer:b}).send(O,V).final;f.in+=$.usage.in,f.out+=$.usage.out,await We({file:y,hash:T,timestamp:Date.now()}),b.end(),v++}catch(S){const T=S instanceof Error?S.message:String(S);b.error(`Failed: ${T}`),b.end("error"),M++}}),h.info(`Batch complete: ${v} completed, ${I} skipped, ${M} failed`)}l(ze,"runBatch");async function Ve(e,t,r){let s=0;async function c(){for(;s<t.length;){const a=s++;await r(t[a])}}l(c,"worker");const i=Array.from({length:Math.min(e,t.length)},()=>c());await Promise.all(i)}l(Ve,"runWithConcurrency");function Ye(e,t){switch(e){case"brave":return ue;case"calculator":return pe;case"exec":return le;case"patch-file":return ce;case"read-file":return se;case"write-file":return ae;default:throw new Error(`Unknown tool: ${e}`)}}l(Ye,"createTool");function Ze(e,t){return e.map(r=>Ye(r))}l(Ze,"createTools");const j=new K().name("axle").description("Axle is a CLI tool for running AI workflows").version(Se.version).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");j.parse(process.argv);const u=j.opts(),A={date:new Date().toISOString().split("T")[0],datetime:new Date().toISOString(),cwd:process.cwd()};u.args&&u.args.forEach(e=>{const[t,r]=e.split("=");t&&r&&(A[t.trim()]=r.trim())});const g=new fe;u.debug&&(g.minLevel="debug");const Ke=new B({minLevel:u.debug?"debug":"info",showInternal:u.debug,showTimestamp:!0,markdown:!0});if(g.addWriter(Ke),u.log){const e=new B({minLevel:"debug",showInternal:!0,showTimestamp:!0,output:l(t=>{},"output")});g.addWriter(e)}const n=g.startSpan("cli",{type:"root"});process.on("uncaughtException",async e=>{console.error("Uncaught exception:"),console.error(e),n.error("Uncaught exception:"),n.error(e.message),n.error(e.stack||""),n.end("error"),await g.flush(),process.exit(1)}),u.debug&&(n.debug("Options: "+JSON.stringify(u,null,2)),n.debug("Additional Arguments: "+JSON.stringify(A,null,2)));let R,m;try{R=await Ne(u.config??null,{tracer:n}),m=await Ue(u.job??null,{tracer:n})}catch(e){const t=e instanceof Error?e:new Error(String(e));n.error(t.message),n.debug(t.stack??""),n.end("error"),await g.flush(),j.outputHelp(),process.exit(1)}let F,L;try{const{type:e,...t}=m.provider,r={...R[e],...t};({provider:F,model:L}=ve(e,r))}catch(e){const t=e instanceof Error?e:new Error(String(e));n.error(t.message),n.error(t.stack??""),n.end("error"),await g.flush(),j.outputHelp(),process.exit(1)}n.info("All systems operational. Running job...");const Qe=(m.server_tools??[]).map(e=>({type:"server",name:e})),q=[...m.tools?.length?Ze(m.tools):[],...Qe];let k=[];if(m.mcps?.length)try{k=await _e(m.mcps,n)}catch(e){const t=e instanceof Error?e:new Error(String(e));n.error("Failed to connect MCP servers: "+t.message),n.end("error"),await g.flush(),process.exit(1)}const C={in:0,out:0},Xe=performance.now();try{m.batch?await ze(m,F,L,q,k,A,u,C,n):await Re(m,F,L,q,k,A,u,C,n)}catch(e){const t=e instanceof Error?e:new Error(String(e));n.error(t.message),n.debug(t.stack??"")}finally{k.length>0&&await Be(k,n)}const et=performance.now()-Xe;n.info(`Total run time: ${Math.round(et)}ms`),n.info(`Input tokens: ${C.in}`),n.info(`Output tokens: ${C.out}`),n.info("Complete. Goodbye"),n.end(),await g.flush();
2
+ var Q=Object.defineProperty;var l=(e,t)=>Q(e,"name",{value:t,configurable:!0});import{Command as X}from"@commander-js/extra-typings";import{basename as ee,extname as te,dirname as oe}from"node:path";import U from"yaml";import{r as J,j as re,a as ne,l as ae,D as ie,g as se,c as ce,p as le,t as N,f as pe,o as F,I as _,A as B,w as ue,u as me,v as fe,x as de,i as ge,h as he,T as we,S as G,P as ye}from"./ProceduralMemory-BtEMO_Cx.js";import{z as o}from"zod";import{glob as ve}from"glob";import{readFile as H,mkdir as be,appendFile as Se}from"node:fs/promises";import{createInterface as ke}from"node:readline";import{createHash as Ee}from"node:crypto";import"mime";import"@anthropic-ai/sdk";import"@google/genai";import"openai";import"node:child_process";import"node:util";import"@modelcontextprotocol/sdk/client/index.js";import"@modelcontextprotocol/sdk/client/stdio.js";import"@modelcontextprotocol/sdk/client/streamableHttp.js";import"marked";import"marked-terminal";function Te(e,t){if(!t||Object.keys(t).length===0)throw new J(`The provider ${e} is not configured. Please check your configuration.`);switch(e){case"openai":return{provider:le(t["api-key"]),model:t.model||ce};case"anthropic":return{provider:se(t["api-key"]),model:t.model||ie};case"gemini":return{provider:ae(t["api-key"]),model:t.model||ne};case"chatcompletions":{const r=t;return{provider:re(r["base-url"],r["api-key"]),model:r.model}}default:throw new J("The provider is unsupported")}}l(Te,"getProvider");var Ae="0.9.0",Oe={version:Ae};o.object({value:o.string()});const je=o.object({"api-key":o.string(),rateLimit:o.number().optional()});o.object({timeout:o.number().optional(),maxBuffer:o.number().optional(),cwd:o.string().optional()});const Ce=o.object({type:o.literal("chatcompletions")}).loose(),xe=o.object({type:o.literal("anthropic")}).loose(),Me=o.object({type:o.literal("openai")}).loose(),Pe=o.object({type:o.literal("gemini")}).loose(),Fe=o.discriminatedUnion("type",[Ce,xe,Me,Pe]),Le=o.object({chatcompletions:o.custom().optional(),anthropic:o.custom().optional(),openai:o.custom().optional(),gemini:o.custom().optional(),brave:je.optional()}).loose(),Ie=o.object({transport:o.literal("stdio"),name:o.string().optional(),command:o.string(),args:o.array(o.string()).optional(),env:o.record(o.string(),o.string()).optional()}),$e=o.object({transport:o.literal("http"),name:o.string().optional(),url:o.string(),headers:o.record(o.string(),o.string()).optional()}),De=o.discriminatedUnion("transport",[Ie,$e]),Ue=o.object({files:o.string(),resume:o.boolean().default(!1),concurrency:o.number().int().positive().default(3)}),Je=o.object({name:o.string().optional(),provider:Fe,task:o.string(),tools:o.array(o.string()).optional(),server_tools:o.array(o.string()).optional(),files:o.array(o.string()).optional(),mcps:o.array(De).optional(),batch:Ue.optional()}),Ne="axle.job",_e=["yaml","yml","json"];async function Be(e,t){const{tracer:r}=t,{content:s,format:c,path:i}=await N(e,{defaults:{name:Ne,formats:_e},tag:"Job File"});let n=null;if(c==="json")n=JSON.parse(s);else if(c==="yaml"||c==="yml")n=U.parse(s);else throw new Error("Invalid job file format");r?.debug("Job config: "+JSON.stringify(n,null,2));const p=Je.safeParse(n);if(!p.success)throw new Error(`The job file is not valid:
3
+ ${W(p.error)}`);return p.data.name||(p.data.name=ee(i,te(i))),p.data}l(Be,"getJobConfig");const Ge="axle.config",He=["yaml","yml","json"];async function We(e,t){const{tracer:r}=t,{content:s,format:c}=await N(e,{defaults:{name:Ge,formats:He},tag:"Config File"});let i=null;if(c==="json")i=JSON.parse(s);else if(c==="yaml"||c==="yml")i=U.parse(s);else throw new Error("Invalid config file format");r?.debug("Service config: "+JSON.stringify(i,null,2));const n=Le.safeParse(i);if(!n.success)throw new Error(`The config file is not valid:
4
+ ${W(n.error)}`);return n.data}l(We,"getServiceConfig");function W(e){return e.issues.map(t=>` - ${t.path.join(".")||"root"}: ${t.message}`).join(`
5
+ `)}l(W,"formatZodError");async function Ve(e,t){const r=[];for(const s of e){const c=new pe(s);await c.connect({tracer:t}),r.push(c)}return r}l(Ve,"connectMcps");async function Re(e,t){for(const r of e)try{await r.close({tracer:t})}catch{}}l(Re,"closeMcps");const V=".axle/batch.jsonl";function qe(e,t){const r=Ee("sha256");return r.update(e),r.update("\0"),r.update(t),r.digest("hex")}l(qe,"computeHash");async function ze(e=V){const t=new Map;let r;try{r=await H(e,"utf-8")}catch{return t}for(const s of r.split(`
6
+ `)){const c=s.trim();if(c)try{const i=JSON.parse(c);i.file&&i.hash&&t.set(i.file,i)}catch{}}return t}l(ze,"loadLedger");async function Ye(e,t=V){await be(oe(t),{recursive:!0}),await Se(t,JSON.stringify(e)+`
7
+ `,"utf-8")}l(Ye,"appendLedgerEntry");async function Ze(e,t,r,s,c,i,n,p,h,M){const d=new _(e.task);if(e.files)for(const u of e.files)d.addFile(await F(u));const w=h.startSpan("job",{type:"workflow"}),E=new B({provider:t,model:r,tools:s,mcps:c,tracer:w,name:e.name,memory:M,options:{strictVariables:!n.allowMissingVars}});try{const u=await E.send(d,i).final;if(p.in+=u.usage.in,p.out+=u.usage.out,u.response){const v=typeof u.response=="string"?u.response:JSON.stringify(u.response,null,2);h.info(v,{markdown:!0})}n.interactive&&await Ke(E,p,h),w.end()}catch(u){const v=u instanceof Error?u.message:String(u);throw w.error(v),w.end("error"),u}}l(Ze,"runSingle");async function Ke(e,t,r){const s=ke({input:process.stdin,output:process.stdout});s.on("SIGINT",()=>{s.close()});const c=l(i=>new Promise(n=>{s.question(i,n),s.once("close",()=>n(null))}),"prompt");try{for(;;){const i=await c(`
8
+ > `);if(i===null||i.trim()==="")break;try{const n=await e.send(i.trim()).final;if(t.in+=n.usage.in,t.out+=n.usage.out,n.response){const p=typeof n.response=="string"?n.response:JSON.stringify(n.response,null,2);r.info(p,{markdown:!0})}}catch(n){const p=n instanceof Error?n.message:String(n);r.error(p)}}}finally{s.close()}}l(Ke,"runInteractiveLoop");async function Qe(e,t,r,s,c,i,n,p,h,M){const d=e.batch,w=await ve(d.files);if(w.length===0){h.warn(`No files matched pattern: ${d.files}`);return}h.info(`Batch: ${w.length} file(s) matched "${d.files}"`);const E=d.resume?await ze():new Map,u=e.files?await Promise.all(e.files.map(y=>F(y))):[];let v=0,L=0,I=0;const Y=d.concurrency??3;await Xe(Y,w,async y=>{const b=h.startSpan(`batch:${y}`,{type:"workflow"});try{const S=await H(y),T=qe(e.task,S),$=E.get(y);if(d.resume&&$&&$.hash===T){b.info("Skipped (already completed)"),b.end(),L++;return}const P=new _(e.task);for(const K of u)P.addFile(K);P.addFile(await F(y));const Z={...i,file:y},D=await new B({provider:t,model:r,tools:s,mcps:c,tracer:b,name:e.name,memory:M,options:{strictVariables:!n.allowMissingVars}}).send(P,Z).final;p.in+=D.usage.in,p.out+=D.usage.out,await Ye({file:y,hash:T,timestamp:Date.now()}),b.end(),v++}catch(S){const T=S instanceof Error?S.message:String(S);b.error(`Failed: ${T}`),b.end("error"),I++}}),h.info(`Batch complete: ${v} completed, ${L} skipped, ${I} failed`)}l(Qe,"runBatch");async function Xe(e,t,r){let s=0;async function c(){for(;s<t.length;){const n=s++;await r(t[n])}}l(c,"worker");const i=Array.from({length:Math.min(e,t.length)},()=>c());await Promise.all(i)}l(Xe,"runWithConcurrency");function et(e,t){switch(e){case"brave":return he;case"calculator":return ge;case"exec":return de;case"patch-file":return fe;case"read-file":return me;case"write-file":return ue;default:throw new Error(`Unknown tool: ${e}`)}}l(et,"createTool");function tt(e,t){return e.map(r=>et(r))}l(tt,"createTools");const A=new X().name("axle").description("Axle is a CLI tool for running AI workflows").version(Oe.version).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").option("--ignore-warn-unused","Don't error on unresolved {{variables}} in task templates");A.parse(process.argv);const m=A.opts(),O={date:new Date().toISOString().split("T")[0],datetime:new Date().toISOString(),cwd:process.cwd()};m.args&&m.args.forEach(e=>{const[t,r]=e.split("=");t&&r&&(O[t.trim()]=r.trim())});const g=new we;m.debug&&(g.minLevel="debug");const ot=new G({minLevel:m.debug?"debug":"info",showInternal:m.debug,showTimestamp:!0,markdown:!0});if(g.addWriter(ot),m.log){const e=new G({minLevel:"debug",showInternal:!0,showTimestamp:!0,output:l(t=>{},"output")});g.addWriter(e)}const a=g.startSpan("cli",{type:"root"});process.on("uncaughtException",async e=>{console.error("Uncaught exception:"),console.error(e),a.error("Uncaught exception:"),a.error(e.message),a.error(e.stack||""),a.end("error"),await g.flush(),process.exit(1)}),m.debug&&(a.debug("Options: "+JSON.stringify(m,null,2)),a.debug("Additional Arguments: "+JSON.stringify(O,null,2)));let R,f;try{R=await We(m.config??null,{tracer:a}),f=await Be(m.job??null,{tracer:a})}catch(e){const t=e instanceof Error?e:new Error(String(e));a.error(t.message),a.debug(t.stack??""),a.end("error"),await g.flush(),A.outputHelp(),process.exit(1)}let j,C;try{const{type:e,...t}=f.provider,r={...R[e],...t};({provider:j,model:C}=Te(e,r))}catch(e){const t=e instanceof Error?e:new Error(String(e));a.error(t.message),a.error(t.stack??""),a.end("error"),await g.flush(),A.outputHelp(),process.exit(1)}a.info("All systems operational. Running job...");const q=new ye({provider:j,model:C}),rt=(f.server_tools??[]).map(e=>({type:"server",name:e})),z=[...f.tools?.length?tt(f.tools):[],...rt];let k=[];if(f.mcps?.length)try{k=await Ve(f.mcps,a)}catch(e){const t=e instanceof Error?e:new Error(String(e));a.error("Failed to connect MCP servers: "+t.message),a.end("error"),await g.flush(),process.exit(1)}const x={in:0,out:0},nt=performance.now();try{f.batch?await Qe(f,j,C,z,k,O,m,x,a,q):await Ze(f,j,C,z,k,O,m,x,a,q)}catch(e){const t=e instanceof Error?e:new Error(String(e));a.error(t.message),a.debug(t.stack??"")}finally{k.length>0&&await Re(k,a)}const at=performance.now()-nt;a.info(`Total run time: ${Math.round(at)}ms`),a.info(`Input tokens: ${x.in}`),a.info(`Output tokens: ${x.out}`),a.info("Complete. Goodbye"),a.end(),await g.flush();
package/dist/index.d.ts CHANGED
@@ -178,9 +178,6 @@ interface TraceWriter {
178
178
  onSpanUpdate?(span: SpanData): void;
179
179
  onSpanEnd(span: SpanData): void;
180
180
  onEvent?(span: SpanData, event: SpanEvent): void;
181
- onLLMStreamStart?(span: SpanData): void;
182
- onLLMStreamChunk?(span: SpanData, chunk: string): void;
183
- onLLMStreamEnd?(span: SpanData, result: LLMResult): void;
184
181
  flush?(): Promise<void>;
185
182
  }
186
183
  /**
@@ -197,9 +194,6 @@ interface TracingContext {
197
194
  setAttribute(key: string, value: unknown): void;
198
195
  setAttributes(attributes: Record<string, unknown>): void;
199
196
  setResult(result: SpanResult): void;
200
- startLLMStream(): void;
201
- appendLLMStream(chunk: string): void;
202
- endLLMStream(result: LLMResult): void;
203
197
  }
204
198
 
205
199
  interface AIProvider {
@@ -424,6 +418,29 @@ declare class MCP {
424
418
  private assertConnected;
425
419
  }
426
420
 
421
+ interface FileStore {
422
+ read(path: string): Promise<string | null>;
423
+ write(path: string, content: string): Promise<void>;
424
+ }
425
+
426
+ interface MemoryContext {
427
+ name?: string;
428
+ scope?: Record<string, string>;
429
+ system?: string;
430
+ messages: AxleMessage[];
431
+ newMessages?: AxleMessage[];
432
+ store: FileStore;
433
+ tracer?: TracingContext;
434
+ }
435
+ interface RecallResult {
436
+ systemSuffix?: string;
437
+ }
438
+ interface AgentMemory {
439
+ recall(context: MemoryContext): Promise<RecallResult>;
440
+ record(context: MemoryContext): Promise<void>;
441
+ tools?(): ExecutableTool[];
442
+ }
443
+
427
444
  declare class History {
428
445
  system: string;
429
446
  private _messages;
@@ -603,13 +620,20 @@ declare class Instruct<TSchema extends OutputSchema | undefined = undefined> {
603
620
  hasFiles(): boolean;
604
621
  }
605
622
 
623
+ interface AgentOptions {
624
+ strictVariables?: boolean;
625
+ }
606
626
  interface AgentConfig {
607
627
  provider: AIProvider;
608
628
  model: string;
609
629
  system?: string;
630
+ name?: string;
631
+ scope?: Record<string, string>;
610
632
  tools?: AxleTool[];
611
633
  mcps?: MCP[];
634
+ memory?: AgentMemory;
612
635
  tracer?: TracingContext;
636
+ options?: AgentOptions;
613
637
  }
614
638
  interface AgentResult<T = string> {
615
639
  response: T | null;
@@ -626,11 +650,16 @@ declare class Agent {
626
650
  readonly model: string;
627
651
  readonly history: History;
628
652
  readonly tracer?: TracingContext;
653
+ readonly name?: string;
654
+ readonly scope?: Record<string, string>;
655
+ readonly store: FileStore;
629
656
  system: string | undefined;
630
657
  tools: Record<string, ExecutableTool>;
631
658
  serverTools: ServerTool[];
632
659
  private mcps;
633
660
  private mcpToolsResolved;
661
+ private memory?;
662
+ private options;
634
663
  private eventCallbacks;
635
664
  constructor(config: AgentConfig);
636
665
  addTool(tool: AxleTool): void;
@@ -646,7 +675,10 @@ declare class Agent {
646
675
  private execute;
647
676
  }
648
677
 
649
- declare function compileInstruct(instruct: Instruct<any>, variables?: Record<string, string>): string;
678
+ interface CompileOptions {
679
+ strictVariables?: boolean;
680
+ }
681
+ declare function compileInstruct(instruct: Instruct<any>, variables?: Record<string, string>, options?: CompileOptions): string;
650
682
 
651
683
  declare function anthropic(apiKey: string): AIProvider;
652
684
 
@@ -709,7 +741,7 @@ interface GenerateOptions {
709
741
  messages: Array<AxleMessage>;
710
742
  system?: string;
711
743
  tools?: Array<ToolDefinition>;
712
- onToolCall: ToolCallCallback;
744
+ onToolCall?: ToolCallCallback;
713
745
  maxIterations?: number;
714
746
  tracer?: TracingContext;
715
747
  options?: GenerateTurnOptions;
@@ -837,12 +869,6 @@ declare class Tracer {
837
869
  /** @internal */
838
870
  _notifySpanStart(spanData: SpanData): void;
839
871
  /** @internal */
840
- _notifyLLMStreamStart(spanData: SpanData): void;
841
- /** @internal */
842
- _notifyLLMStreamChunk(spanData: SpanData, chunk: string): void;
843
- /** @internal */
844
- _notifyLLMStreamEnd(spanData: SpanData, result: LLMResult): void;
845
- /** @internal */
846
872
  _shouldLog(level: EventLevel): boolean;
847
873
  }
848
874
 
@@ -891,10 +917,37 @@ declare class SimpleWriter implements TraceWriter {
891
917
  onSpanEnd(span: SpanData): void;
892
918
  onSpanUpdate(span: SpanData): void;
893
919
  onEvent(span: SpanData, event: SpanEvent): void;
894
- onLLMStreamStart(span: SpanData): void;
895
- onLLMStreamChunk(_span: SpanData, _chunk: string): void;
896
- onLLMStreamEnd(span: SpanData, result: LLMResult): void;
897
920
  }
898
921
 
899
- export { Agent, Anthropic, AxleStopReason, Gemini, History, Instruct, MCP, OpenAI, SimpleWriter, Tracer, anthropic, braveSearchTool, calculatorTool, chatCompletions, compileInstruct, gemini, generate, generateTurn, loadFileContent, openai, parseResponse, stream };
900
- export type { AIProvider, AgentConfig, AgentHandle, AgentResult, AxleAssistantMessage, AxleMessage, AxleTool, AxleToolCallMessage, AxleToolCallResult, AxleUserMessage, ContentPart, ContentPartFile, ContentPartText, ContentPartThinking, ContentPartToolCall, EventLevel, ExecutableTool, FileInfo, MCPConfig, MCPHttpConfig, MCPStdioConfig, ServerTool, SimpleWriterOptions, SpanData, SpanOptions, SpanType, StreamEvent, StreamEventCallback, ToolDefinition, ToolResultPart, TraceWriter, TracingContext };
922
+ interface ProceduralMemoryConfig {
923
+ provider: AIProvider;
924
+ model: string;
925
+ enableTools?: boolean;
926
+ }
927
+ declare class ProceduralMemory implements AgentMemory {
928
+ private provider;
929
+ private model;
930
+ private enableTools;
931
+ private lastStore?;
932
+ private lastName?;
933
+ private lastScope?;
934
+ constructor(config: ProceduralMemoryConfig);
935
+ recall(context: MemoryContext): Promise<RecallResult>;
936
+ record(context: MemoryContext): Promise<void>;
937
+ tools(): ExecutableTool[];
938
+ private formatMessages;
939
+ private parseInstructions;
940
+ private getStorePath;
941
+ private loadStore;
942
+ private saveStore;
943
+ }
944
+
945
+ declare class LocalFileStore implements FileStore {
946
+ readonly rootPath: string;
947
+ constructor(rootPath: string);
948
+ read(path: string): Promise<string | null>;
949
+ write(path: string, content: string): Promise<void>;
950
+ }
951
+
952
+ export { Agent, Anthropic, AxleStopReason, Gemini, History, Instruct, LocalFileStore, MCP, OpenAI, ProceduralMemory, SimpleWriter, Tracer, anthropic, braveSearchTool, calculatorTool, chatCompletions, compileInstruct, gemini, generate, generateTurn, loadFileContent, openai, parseResponse, stream };
953
+ export type { AIProvider, AgentConfig, AgentHandle, AgentMemory, AgentResult, AxleAssistantMessage, AxleMessage, AxleTool, AxleToolCallMessage, AxleToolCallResult, AxleUserMessage, ContentPart, ContentPartFile, ContentPartText, ContentPartThinking, ContentPartToolCall, EventLevel, ExecutableTool, FileInfo, FileStore, MCPConfig, MCPHttpConfig, MCPStdioConfig, MemoryContext, ProceduralMemoryConfig, RecallResult, ServerTool, SimpleWriterOptions, SpanData, SpanOptions, SpanType, StreamEvent, StreamEventCallback, ToolDefinition, ToolResultPart, TraceWriter, TracingContext };
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- var E=Object.defineProperty;var r=(n,a)=>E(n,"name",{value:a,configurable:!0});import{D as I,M as L,a as $,b as w,c as F,A as x,g as O,e as q,d as U,f as S}from"./simple-Cn_DeT3l.js";import{h as ae,H as ie,I as le,i as ce,S as ue,T as me,j as pe,k as de,l as ge,m as fe,n as Me,o as he,p as Te,q as Re,r as ye,s as De}from"./simple-Cn_DeT3l.js";import"@anthropic-ai/sdk";import"zod";import"@google/genai";import"openai";import"glob";import"mime";import"node:fs/promises";import"node:path";import"node:child_process";import"node:util";import"@modelcontextprotocol/sdk/client/index.js";import"@modelcontextprotocol/sdk/client/stdio.js";import"@modelcontextprotocol/sdk/client/streamableHttp.js";import"marked";import"marked-terminal";const _={Models:L,DefaultModel:I},b={Models:w,DefaultModel:$};async function A(n){const{provider:a,model:i,messages:u,system:p,tools:d,tracer:g,options:l}=n;return a.createGenerationRequest(i,{messages:u,system:p,tools:d,context:{tracer:g},options:l})}r(A,"generateTurn");async function G(n){const{provider:a,model:i,messages:u,system:p,tools:d,onToolCall:g,maxIterations:l,tracer:m,options:C}=n,f=[...u],o=[],t={in:0,out:0};let M=0,h;const T=r(e=>{f.push(e),o.push(e)},"addMessage"),c=r(e=>(m?.setResult({kind:"llm",model:i,request:{messages:u},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}),m?.end(e.result==="error"?"error":"ok"),e),"endWithResult"),v=r((e,s)=>{if(!e||s.type==="error"){e?.end("error");return}e.setResult({kind:"llm",model:s.model??i,request:{messages:f},response:{content:s.content},usage:s.usage?{inputTokens:s.usage.in,outputTokens:s.usage.out}:void 0,finishReason:s.finishReason}),e.end()},"setTurnResult");for(;;){if(l!==void 0&&M>=l)return c({result:"error",messages:o,error:{type:"model",error:{type:"error",error:{type:"MaxIterations",message:`Exceeded max iterations (${l})`}}},usage:t});M+=1;const e=m?.startSpan(`turn-${M}`,{type:"llm"}),s=await A({provider:a,model:i,messages:f,system:p,tools:d,tracer:e,options:C});if(F(t,s),v(e,s),s.type==="error")return c({result:"error",messages:o,error:{type:"model",error:s},usage:t});const R={role:"assistant",id:s.id,model:s.model,content:s.content,finishReason:s.finishReason};if(T(R),h=R,s.finishReason!==x.FunctionCall)return c({result:"success",messages:o,final:h,usage:t});const y=O(s.content);if(y.length===0)return c({result:"success",messages:o,final:h,usage:t});const{results:D,missingTool:k}=await q(y,g,m);if(D.length>0&&T({role:"tool",content:D}),k)return c({result:"error",messages:o,error:{type:"tool",error:k},usage:t})}}r(G,"generate");const H={Models:S,DefaultModel:U};export{ae as Agent,_ as Anthropic,x as AxleStopReason,b as Gemini,ie as History,le as Instruct,ce as MCP,H as OpenAI,ue as SimpleWriter,me as Tracer,pe as anthropic,de as braveSearchTool,ge as calculatorTool,fe as chatCompletions,Me as compileInstruct,he as gemini,G as generate,A as generateTurn,Te as loadFileContent,Re as openai,ye as parseResponse,De as stream};
1
+ import{D as o,M as a,a as s,b as e,c as t,d as r}from"./ProceduralMemory-BtEMO_Cx.js";import{A as x,e as C,H as P,I as U,L as _,f as b,P as y,S as H,T as R,g as j,h as k,i as q,j as v,k as G,l as W,m as w,n as z,o as B,p as J,q as K,s as N}from"./ProceduralMemory-BtEMO_Cx.js";import"@anthropic-ai/sdk";import"zod";import"@google/genai";import"openai";import"node:fs/promises";import"node:path";import"glob";import"mime";import"node:child_process";import"node:util";import"@modelcontextprotocol/sdk/client/index.js";import"@modelcontextprotocol/sdk/client/stdio.js";import"@modelcontextprotocol/sdk/client/streamableHttp.js";import"marked";import"marked-terminal";import"node:crypto";const i={Models:a,DefaultModel:o},p={Models:e,DefaultModel:s},m={Models:r,DefaultModel:t};export{x as Agent,i as Anthropic,C as AxleStopReason,p as Gemini,P as History,U as Instruct,_ as LocalFileStore,b as MCP,m as OpenAI,y as ProceduralMemory,H as SimpleWriter,R as Tracer,j as anthropic,k as braveSearchTool,q as calculatorTool,v as chatCompletions,G as compileInstruct,W as gemini,w as generate,z as generateTurn,B as loadFileContent,J as openai,K as parseResponse,N as stream};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fifthrevision/axle",
3
- "version": "0.8.1",
3
+ "version": "0.9.0",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "git+https://github.com/johncch/axle.git"
@@ -22,19 +22,16 @@
22
22
  "dist"
23
23
  ],
24
24
  "scripts": {
25
- "prepare": "npm run build",
25
+ "prepare": "pnpm run build",
26
26
  "start": "tsx ./src/cli.ts",
27
27
  "build": "pkgroll --clean-dist --minify",
28
28
  "build:watch": "pkgroll --watch",
29
29
  "build-dev": "pkgroll --clean-dist",
30
30
  "test": "vitest run",
31
- "get-models": "npx tsx scripts/getModels.ts",
32
- "prompt-scenarios": "npx tsx ./scripts/prompt.scenarios.ts",
33
- "test-providers": "npx tsx ./scripts/testProviders.ts",
34
- "sanity-check": "npx tsx ./scripts/sanity-check.ts",
35
- "release": "npm test && npm run build && npm version"
31
+ "changelog": "pnpm start -j ./jobs/changelog.job.yml --args",
32
+ "release": "pnpm test && pnpm run build && npm version"
36
33
  },
37
- "author": "",
34
+ "author": "Chong Han Chua",
38
35
  "license": "ISC",
39
36
  "dependencies": {
40
37
  "@anthropic-ai/sdk": "^0.78.0",
@@ -1,36 +0,0 @@
1
- var je=Object.defineProperty;var i=(t,e)=>je(t,"name",{value:e,configurable:!0});import*as O from"zod";import F,{z as $}from"zod";import"glob";import Be from"mime";import{readFile as J,access as qe,stat as He,writeFile as ie,mkdir as Je}from"node:fs/promises";import{resolve as Q,extname as ce,dirname as We}from"node:path";import ze from"@anthropic-ai/sdk";import{FinishReason as R,GoogleGenAI as Ke}from"@google/genai";import Ve from"openai";import{exec as Xe}from"node:child_process";import{promisify as Ze}from"node:util";import{Client as Ye}from"@modelcontextprotocol/sdk/client/index.js";import{StdioClientTransport as Qe}from"@modelcontextprotocol/sdk/client/stdio.js";import{StreamableHTTPClientTransport as et}from"@modelcontextprotocol/sdk/client/streamableHttp.js";import{marked as le}from"marked";import{markedTerminal as tt}from"marked-terminal";class V extends Error{static{i(this,"AxleError")}code;id;details;constructor(e,n){super(e,{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,V.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:ue(this.cause)}}}}function ue(t){return t instanceof Error?{name:t.name,message:t.message,...t.stack&&{stack:t.stack},..."cause"in t&&t.cause&&{cause:ue(t.cause)}}:t}i(ue,"serializeError");var T=(t=>(t.Stop="stop",t.Length="length",t.FunctionCall="function_call",t.Error="error",t.Custom="custom",t.Cancelled="cancelled",t))(T||{});class pe{static{i(this,"History")}system;_messages=[];constructor(e){e&&(this._messages=e)}get messages(){return[...this._messages]}addSystem(e){this.system=e}addUser(e){typeof e=="string"?this._messages.push({role:"user",content:[{type:"text",text:e}]}):this._messages.push({role:"user",content:e})}addAssistant(e){if(typeof e=="string"){const n=e;this._messages.push({role:"assistant",id:crypto.randomUUID(),content:[{type:"text",text:n}],model:"user",finishReason:T.Custom})}else this._messages.push({role:"assistant",...e})}addToolResults(e){this._messages.push({role:"tool",content:e})}add(e){Array.isArray(e)?this._messages.push(...e):this._messages.push(e)}latest(){return this._messages[this._messages.length-1]}toString(){return JSON.stringify({system:this.system,messages:this._messages})}}function nt(t){const{text:e,files:n}=t,s=[];if(e&&s.push({type:"text",text:e}),n)for(const r of n)s.push({type:"file",file:r});return s}i(nt,"toContentParts");function H(t){return typeof t=="string"?t:t.filter(e=>e.type==="text").map(e=>e.text).join(`
2
-
3
- `)}i(H,"getTextContent");function st(t){return t.filter(e=>e.type==="tool-call")}i(st,"getToolCalls");function rt(t,e){const n=e.usage??{in:0,out:0};t.in+=n.in??0,t.out+=n.out??0}i(rt,"appendUsage");function de(t){return JSON.stringify({error:t})}i(de,"serializeToolError");async function me(t,e,n){const s=[];let r;for(const o of t){const a=n?.startSpan(o.name,{type:"tool"});let l;try{l=await e(o.name,o.parameters)}catch(p){l={type:"error",error:{type:"exception",message:p instanceof Error?p.message:String(p)}}}if(l==null){r={name:o.name,message:`Tool not found: ${o.name}`},a?.setResult({kind:"tool",name:o.name,input:o.parameters,output:null}),a?.end("error"),s.push({id:o.id,name:o.name,content:de({type:"not-found",message:r.message}),isError:!0});break}l.type==="success"?(a?.setResult({kind:"tool",name:o.name,input:o.parameters,output:l.content}),a?.end("ok"),s.push({id:o.id,name:o.name,content:l.content})):(a?.setResult({kind:"tool",name:o.name,input:o.parameters,output:l.error}),a?.end("error"),s.push({id:o.id,name:o.name,content:de(l.error),isError:!0}))}return{results:s,missingTool:r}}i(me,"executeToolCalls");function C(t,e){for(const n of t)n(e)}i(C,"emit");function fe(t){const e=[],n=new AbortController;let s=!1,r,o;const a=new Promise((l,p)=>{r=i(d=>{s=!0,l(d)},"resolveResult"),o=i(d=>{s=!0,p(d)},"rejectResult")});return Promise.resolve().then(()=>ot(t,n.signal,e).then(r,o)),{on(l){e.push(l)},cancel(){s||n.abort()},get final(){return a}}}i(fe,"stream");async function ot(t,e,n){const{provider:s,model:r,messages:o,system:a,tools:l,serverTools:p,onToolCall:d,maxIterations:m,tracer:u,options:c}=t,_=[...o],h=[],f={in:0,out:0};let g=0,x=0;const S=i(E=>{_.push(E),h.push(E)},"addMessage"),k=i(E=>{E.result==="error"&&C(n,{type:"error",error:E.error});const G=E.result==="success"?E.final?.content:E.result==="cancelled"?E.partial?.content:null,D=E.result==="success"?E.final?.finishReason:E.result==="cancelled"?T.Cancelled:void 0;return u?.setResult({kind:"llm",model:r,request:{messages:o},response:{content:G??null},usage:E.usage?{inputTokens:E.usage.in,outputTokens:E.usage.out}:void 0,finishReason:D}),u?.end(E.result==="error"?"error":"ok"),E},"endWithResult"),L=i((E,G,D,I)=>{I();const M=E.length>0?{role:"assistant",id:G,model:D,content:E,finishReason:T.Cancelled}:void 0;return M&&S(M),u?.end("ok"),{result:"cancelled",messages:h,partial:M,usage:f}},"buildCancelledResult");for(;;){if(e.aborted)return L([],"","",()=>{});if(m!==void 0&&x>=m)return k({result:"error",messages:h,error:{type:"model",error:{type:"error",error:{type:"MaxIterations",message:`Exceeded max iterations (${m})`}}},usage:f});x+=1;const E=u?.startSpan(`turn-${x}`,{type:"llm"});E?.startLLMStream();const G=p?{...c,serverTools:p}:c,D=s.createStreamingRequest?.(r,{messages:_,system:a,tools:l,context:{tracer:E},signal:e,options:G});if(!D)throw E?.end("error"),new Error("Provider does not support streaming. Use generate() instead.");const I=[];let j="",M="",B=null,q={in:0,out:0},P=-1,W=null,v="";const ne=new Map;let U=-1;const N=i(()=>{W!==null&&P>=0&&(C(n,{type:W==="text"?"text:end":"thinking:end",index:P,final:v}),W=null,v="",P=-1)},"closePart");for await(const y of D){switch(y.type){case"start":j=y.id,M=y.data.model;break;case"text-start":{N(),I.push({type:"text",text:""}),U=I.length-1,P=g++,W="text",v="",C(n,{type:"text:start",index:P});break}case"text-delta":{const w=I[U];w.text+=y.data.text,v=w.text,E?.appendLLMStream(y.data.text),C(n,{type:"text:delta",index:P,delta:y.data.text,accumulated:v});break}case"text-complete":{N();break}case"thinking-start":{N(),I.push({type:"thinking",text:""}),U=I.length-1,P=g++,W="thinking",v="",C(n,{type:"thinking:start",index:P});break}case"thinking-delta":{const w=I[U];w.text+=y.data.text,v=w.text,C(n,{type:"thinking:delta",index:P,delta:y.data.text,accumulated:v});break}case"thinking-summary-delta":{const w=I[U];w.text+=y.data.text,v=w.text,C(n,{type:"thinking:delta",index:P,delta:y.data.text,accumulated:v});break}case"thinking-complete":{N();break}case"tool-call-start":{N();const w=g++;I.push({type:"tool-call",id:y.data.id,name:y.data.name,parameters:{}}),U=I.length-1,ne.set(y.data.id,w),C(n,{type:"tool:start",index:w,id:y.data.id,name:y.data.name});break}case"tool-call-complete":{const w=I[U];y.data.id&&(w.id=y.data.id),y.data.name&&(w.name=y.data.name),w.parameters=y.data.arguments,y.data.providerMetadata&&(w.providerMetadata=y.data.providerMetadata);break}case"internal-tool-start":{N();const w=g++;I.push({type:"internal-tool",id:y.data.id,name:y.data.name}),U=I.length-1,C(n,{type:"internal-tool:start",index:w,id:y.data.id,name:y.data.name});break}case"internal-tool-complete":{const w=I[U];y.data.output!=null&&(w.output=y.data.output),C(n,{type:"internal-tool:complete",index:y.data.index,id:y.data.id,name:y.data.name,output:y.data.output});break}case"complete":{N(),B=y.data.finishReason,q=y.data.usage;break}case"error":{N();const w=y.data.usage??{in:0,out:0};return f.in+=w.in??0,f.out+=w.out??0,E?.end("error"),k({result:"error",messages:h,error:{type:"model",error:{type:"error",error:{type:y.data.type,message:y.data.message}}},usage:f})}default:console.warn("[WARN] Unhandled chunk type. Should never happen")}if(e.aborted)break}if(e.aborted)return E?.end("ok"),L(I,j,M,N);if(B===null)return N(),E?.end("error"),k({result:"error",messages:h,error:{type:"model",error:{type:"error",error:{type:"IncompleteStream",message:"Stream ended without a completion signal"}}},usage:f});f.in+=q.in??0,f.out+=q.out??0;const Ue={kind:"llm",model:M,request:{messages:_},response:{content:I},usage:{inputTokens:q.in,outputTokens:q.out},finishReason:B};E?.endLLMStream(Ue),E?.end();const X={role:"assistant",id:j,model:M,content:I,finishReason:B};if(S(X),B!==T.FunctionCall)return k({result:"success",messages:h,final:X,usage:f});const Z=I.filter(y=>y.type==="tool-call");if(Z.length===0)return k({result:"success",messages:h,final:X,usage:f});if(e.aborted)return u?.end("ok"),{result:"cancelled",messages:h,usage:f};const Ge=d?async(y,w)=>d(y,w):async()=>null;let De=0;const Fe=i(async(y,w)=>{const Y=Z[De++],oe=ne.get(Y.id)??-1;C(n,{type:"tool:execute",index:oe,id:Y.id,name:y,parameters:w});const ae=await Ge(y,w);return C(n,{type:"tool:complete",index:oe,id:Y.id,name:y,result:ae??null}),ae},"emittingToolCall"),{results:se,missingTool:re}=await me(Z,Fe,u);if(se.length>0&&S({role:"tool",content:se}),re)return k({result:"error",messages:h,error:{type:"tool",error:re},usage:f})}}i(ot,"run");function at(t,e,n="{{}}"){const s=n==="{{}}"?/\{\{(.*?)\}\}/g:/\{(.*?)\}/g;return t=t.replace(s,(r,o)=>{if(o=o.trim(),Object.prototype.hasOwnProperty.call(e,o)){const a=e[o];return a==null?"":String(a)}return r}),t}i(at,"replaceVariables");function z(t){if(t instanceof O.ZodString)return["string","Your answer"];if(t instanceof O.ZodNumber)return["number",42];if(t instanceof O.ZodBoolean)return["boolean",!0];if(t instanceof O.ZodArray){const e=t.element;if(e instanceof O.ZodString)return["string array",["answer 1","answer 2","third answer"]];if(e instanceof O.ZodNumber)return["number array",[42,59,3.14]];if(e instanceof O.ZodBoolean)return["boolean array",[!0,!1,!1]];if(e instanceof O.ZodObject){const[n,s]=z(e);return["object array",[s,s]]}return["array",[]]}if(t instanceof O.ZodObject){const e=t.shape,n={};for(const[s,r]of Object.entries(e)){const[o,a]=z(r);n[s]=a}return["JSON object",n]}if(t instanceof O.ZodOptional){const e=t.unwrap(),[n,s]=z(e);return[`${n} | undefined`,s]}}i(z,"zodToExample");function he(t,e){if(!e)return t;if(Object.keys(e).length===0){if(t.trim()==="{}"||t.trim()==="")return{};throw new Error("Schema is empty, but rawValue is not an empty object representation or empty string.")}const s=it(t),r={};for(const[o,a]of Object.entries(e)){const l=s.tags[o];if(l!==void 0)r[o]=_e(a,l);else if(a.def.type!=="optional")throw new Error(`Expected results with tag ${o} but it does not exist`)}try{const o={};for(const[a,l]of Object.entries(e))a in r&&(o[a]=l.parse(r[a]));return o}catch(o){if(o&&typeof o=="object"&&"issues"in o){const a=o.issues.map(l=>`${l.path.join(".")}: ${l.message}`).join(", ");throw new Error(`Validation failed: ${a}`)}throw o}}i(he,"parseResponse");function _e(t,e){switch(e=e.trim(),t.def.type){case"string":try{return JSON.parse(e)}catch{if(typeof e=="string")return e;throw new Error(`Cannot parse '${e}' as string. Ensure it is a valid JSON string or a plain string.`)}case"number":{const n=parseFloat(e);if(isNaN(n))throw new Error(`Cannot parse '${e}' as number`);return n}case"boolean":{const n=e.toLowerCase();if(n==="true")return!0;if(n==="false")return!1;throw new Error(`Cannot parse '${e}' as boolean. Expected 'true' or 'false'`)}case"array":{if(e==="")return[];try{const n=JSON.parse(e);if(Array.isArray(n))return n}catch{}if(e.includes(","))return e.split(",").map(n=>{const s=n.trim();try{return JSON.parse(s)}catch{return s}}).filter(n=>n!=="")}case"object":{e.includes("```json")&&(e=e.replace(/```json/g,"").replace(/```/g,""));try{return JSON.parse(e)}catch(n){throw new Error(`Cannot parse object as JSON: ${n.message}`)}}case"optional":{const n=t.def.innerType;return _e(n,e)}default:return e}}i(_e,"preprocessValue");function it(t){t.trim().startsWith("```json")&&t.trim().endsWith("```")&&(t=t.trim().slice(7,-3).trim());const e=/<(\w+)>(.*?)<\/\1>/gs,n={};let s=t;s=s.replace(e,(o,a,l)=>(n[a]=l,""));const r=/<(\w+)>(.*?)(?:<\/?\w+>|$)/gs;return s=s.replace(r,(o,a,l)=>(n[a]=l,"")),{tags:n,remaining:s.trim()}}i(it,"parseTaggedSections");function ge(t,e={}){const n={...e,...t.inputs};let s=at(t.prompt,n);if(t.textReferences.length>0)for(const[a,l]of t.textReferences.entries()){const p=l.name?`: ${l.name}`:"";s+=`
4
-
5
- ## Reference ${a+1}${p}
6
-
7
- \`\`\`${l.content}'''`}let r=`# Instructions
8
-
9
- `;if((t.schema?Object.keys(t.schema):[]).length>0){r+=`## Output Format Instructions
10
- `,r+=`
11
- Here is how you should format your output. Follow the instructions strictly.
12
- `;for(const[a,l]of Object.entries(t.schema)){const[p,d]=z(l);r+=`
13
- - Use <${a}></${a}> tags to indicate the answer for ${a}. The answer must be a ${p}.
14
- Example: <${a}>${JSON.stringify(d)}</${a}>
15
- `}}if(t.instructions.length>0){r+=`
16
- ## Additional Instructions
17
-
18
- `;for(const a of t.instructions)r+=`- ${a}
19
- `}return r+s}i(ge,"compileInstruct");function ct(t){return t.type==="server"}i(ct,"isServerTool");class lt{static{i(this,"Agent")}provider;model;history;tracer;system;tools={};serverTools=[];mcps=[];mcpToolsResolved=!1;eventCallbacks=[];constructor(e){this.provider=e.provider,this.model=e.model,this.history=new pe,this.tracer=e.tracer,this.system=e.system,e.tools&&this.addTools(e.tools),e.mcps&&(this.mcps=[...e.mcps])}addTool(e){ct(e)?this.serverTools.push(e):this.tools[e.name]=e}addTools(e){for(const n of e)this.addTool(n)}addMcp(e){this.mcps.push(e),this.mcpToolsResolved=!1}addMcps(e){this.mcps.push(...e),this.mcpToolsResolved=!1}hasTools(){return Object.keys(this.tools).length>0||this.serverTools.length>0||this.mcps.length>0}on(e){this.eventCallbacks.push(e)}send(e,n){let s;if(typeof e=="string")this.history.addUser(e);else{const r=ge(e,n),o=e.files;this.history.addUser(nt({text:r,files:o})),s=e.schema}return this.execute(s)}async resolveMcpTools(){if(!this.mcpToolsResolved){this.tracer?.debug("resolving MCP tools",{count:this.mcps.length});for(const e of this.mcps){const n=await e.listTools({prefix:e.name,tracer:this.tracer});this.addTools(n)}this.mcpToolsResolved=!0}}execute(e){let n=!1,s;const r=(async()=>{if(await this.resolveMcpTools(),n)return{response:null,messages:[],final:void 0,usage:{in:0,out:0}};const o=this.tools,a=Object.values(o).map(u=>({name:u.name,description:u.description,schema:u.schema}));s=fe({provider:this.provider,model:this.model,messages:this.history.messages,system:this.system,tools:a.length>0?a:void 0,serverTools:this.serverTools.length>0?this.serverTools:void 0,tracer:this.tracer,onToolCall:i(async(u,c)=>{const _=o[u];if(!_)return null;try{return{type:"success",content:await _.execute(c)}}catch(h){return{type:"error",error:{type:"execution",message:h instanceof Error?h.message:String(h)}}}},"onToolCall")});for(const u of this.eventCallbacks)s.on(u);const l=await s.final;l.messages.length>0&&this.history.add(l.messages);let p=null,d;if(l.result==="error")throw new V(ut(l.error),{code:l.error.type==="model"?"MODEL_ERROR":"TOOL_ERROR",details:{error:l.error}});if(l.result==="success"){if(d=l.final,d){const u=H(d.content);p=he(u,e)}}else l.result==="cancelled"&&(d=l.partial);const m=l.usage??{in:0,out:0};return{response:p,messages:l.messages,final:d,usage:m}})();return{cancel:i(()=>{n=!0,s?.cancel()},"cancel"),get final(){return r}}}}function ut(t){return t.type==="model"?`Model error: ${t.error.error.message}`:`Tool error (${t.error.name}): ${t.error.message}`}i(ut,"formatGenerateError");async function pt(t,e){const{defaults:n,tag:s}=e;let r=null,o="";if(t)try{o=Q(t),r=await J(o,{encoding:"utf-8"})}catch{throw new Error(`${s} not found, see --help for details`)}else{for(const a of n.formats)try{o=Q(n.name+"."+a),r=await J(o,{encoding:"utf-8"});break}catch{continue}if(r===null)throw new Error(`${s} not found, see --help for details`)}return{content:r,format:o.split(".").pop()??""}}i(pt,"searchAndLoadFile");const ye=20*1024*1024;function dt(t){return t.type==="text"}i(dt,"isTextFileInfo");function mt(t){return t.type==="image"||t.type==="document"}i(mt,"isBase64FileInfo");const ft=new Set(["application/json","application/xml","application/yaml","application/x-yaml","application/toml"]);function ht(t){return t.startsWith("text/")||ft.has(t)}i(ht,"isTextLikeMimeType");function _t(t){const e=Be.getType(t);if(!e){const n=ce(t).toLowerCase();throw new Error(`Unsupported file type: ${n||"(no extension)"}`)}if(e.startsWith("image/"))return{type:"image",mimeType:e};if(e==="application/pdf")return{type:"document",mimeType:e};if(ht(e))return{type:"text",mimeType:e};{const n=ce(t).toLowerCase();throw new Error(`Unsupported file type: ${n} (${e})`)}}i(_t,"getFileCategory");async function gt(t,e){const n=Q(t);try{await qe(n)}catch{throw new Error(`File not found: ${t}`)}const s=await He(n);if(s.size>ye)throw new Error(`File too large: ${s.size} bytes. Maximum allowed: ${ye} bytes`);const r=n.split("/").pop()||"",o=_t(n);if((e||(o.type==="text"?"utf-8":"base64"))==="utf-8"){if(o.type!=="text")throw new Error(`Cannot read ${o.type} file as text: ${t}`);const l=await J(n,"utf-8");return{path:n,content:l,mimeType:o.mimeType,size:s.size,name:r,type:"text"}}else{if(o.type==="text")throw new Error(`Cannot read text file as binary: ${t}`);const p=(await J(n)).toString("base64");return{path:n,base64:p,mimeType:o.mimeType,size:s.size,name:r,type:o.type}}}i(gt,"loadFileContent");class yt{static{i(this,"Instruct")}prompt;inputs={};files=[];textReferences=[];instructions=[];schema;constructor(e,n){this.prompt=e,this.schema=n}setInputs(e){this.inputs=e}addInput(e,n){this.inputs[e]=n}addFile(e,n){if(typeof e=="string"){this.textReferences.push({content:e,name:n?.name});return}mt(e)?this.files.push(e):dt(e)&&this.textReferences.push({content:e.content,name:n?.name??e.name})}addInstructions(e){if(typeof e!="string"||e.trim()==="")throw new Error("Instruction must be a non-empty string");this.instructions.push(e)}hasFiles(){return this.files.length>0}}const A={CLAUDE_SONNET_4_6:"claude-sonnet-4-6",CLAUDE_OPUS_4_6:"claude-opus-4-6",CLAUDE_OPUS_4_5_20251101:"claude-opus-4-5-20251101",CLAUDE_OPUS_4_5:"claude-opus-4-5-20251101",CLAUDE_HAIKU_4_5_20251001:"claude-haiku-4-5-20251001",CLAUDE_HAIKU_4_5:"claude-haiku-4-5-20251001",CLAUDE_SONNET_4_5_20250929:"claude-sonnet-4-5-20250929",CLAUDE_SONNET_4_5:"claude-sonnet-4-5-20250929",CLAUDE_OPUS_4_1_20250805:"claude-opus-4-1-20250805",CLAUDE_OPUS_4_1:"claude-opus-4-1-20250805",CLAUDE_OPUS_4_20250514:"claude-opus-4-20250514",CLAUDE_OPUS_4:"claude-opus-4-20250514",CLAUDE_SONNET_4_20250514:"claude-sonnet-4-20250514",CLAUDE_SONNET_4:"claude-sonnet-4-20250514",CLAUDE_3_HAIKU_20240307:"claude-3-haiku-20240307",CLAUDE_3_HAIKU:"claude-3-haiku-20240307"};A.CLAUDE_SONNET_4_6,A.CLAUDE_OPUS_4_6,A.CLAUDE_OPUS_4_5_20251101,A.CLAUDE_HAIKU_4_5_20251001,A.CLAUDE_SONNET_4_5_20250929,A.CLAUDE_OPUS_4_1_20250805,A.CLAUDE_OPUS_4_20250514,A.CLAUDE_SONNET_4_20250514,A.CLAUDE_3_HAIKU_20240307;const xt=A.CLAUDE_HAIKU_4_5;function xe(t){return Array.isArray(t)?t:[t]}i(xe,"arrayify");function Et(t){return new Promise(e=>setTimeout(e,t))}i(Et,"delay");function K(t){if(t==null)return{type:"error",error:{type:"Undetermined",message:"Unknown error occurred"},usage:{in:0,out:0},raw:t};if(t instanceof Error)return{type:"error",error:{type:t.name||"Error",message:t.message||"Unexpected error"},usage:{in:0,out:0},raw:t};if(typeof t=="object"){const e=t,n=e?.error?.error?.type||e?.error?.type||e?.type||e?.code||e?.status||"Undetermined",s=e?.error?.error?.message||e?.error?.message||e?.message||e?.error||"Unexpected error";return{type:"error",error:{type:String(n),message:String(s)},usage:{in:0,out:0},raw:t}}return{type:"error",error:{type:"Undetermined",message:String(t)},usage:{in:0,out:0},raw:t}}i(K,"getUndefinedError");function Ee(t){return t.map(e=>{if(e.role==="assistant"){const n=[];for(const s of e.content)s.type==="text"?n.push({type:"text",text:s.text}):s.type==="thinking"?s.redacted?n.push({type:"redacted_thinking",data:s.text}):n.push({type:"thinking",thinking:s.text,signature:s.signature}):s.type==="tool-call"?n.push({type:"tool_use",id:s.id,name:s.name,input:s.parameters}):s.type==="internal-tool"&&(n.push({type:"server_tool_use",id:s.id,name:s.name,input:s.input??{}}),s.output!=null&&n.push({type:"web_search_tool_result",tool_use_id:s.id,content:s.output}));return{role:"assistant",content:n}}if(e.role==="tool")return{role:"user",content:e.content.map(n=>({type:"tool_result",tool_use_id:n.id,content:typeof n.content=="string"?n.content:wt(n.content),...n.isError?{is_error:!0}:{}}))};if(typeof e.content=="string")return{role:"user",content:e.content};{const n=[];for(const s of e.content)s.type==="text"?n.push({type:"text",text:s.text}):s.type==="file"&&(s.file.type==="image"?n.push({type:"image",source:{type:"base64",media_type:s.file.mimeType,data:s.file.base64}}):s.file.type==="document"&&s.file.mimeType==="application/pdf"&&n.push({type:"document",source:{type:"base64",media_type:"application/pdf",data:s.file.base64}}));return{role:"user",content:n}}})}i(Ee,"convertToProviderMessages");function Te(t){return t.map(e=>{const n=F.toJSONSchema(e.schema);if(!Tt(n))throw new Error(`Schema for tool ${e.name} must be an object type`);return{name:e.name,description:e.description,input_schema:n}})}i(Te,"convertToProviderTools");function we(t){const e=[];for(const n of t)if(n.type==="text")e.push({type:"text",text:n.text});else if(n.type==="thinking")e.push({type:"thinking",text:n.text||"",redacted:!1});else if(n.type==="redacted_thinking")e.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 new Error(`Invalid tool call input for ${n.name}: expected object, got ${typeof n.input}`);e.push({type:"tool-call",id:n.id,name:n.name,parameters:n.input})}return e}i(we,"convertToAxleContentParts");function Se(t){switch(t){case"max_tokens":return T.Length;case"end_turn":return T.Stop;case"stop_sequence":return T.Stop;case"tool_use":return T.FunctionCall;case"pause_turn":case"refusal":default:return T.Error}}i(Se,"convertStopReason$1");function Tt(t){return t&&typeof t=="object"&&t.type==="object"}i(Tt,"isObjectSchema");function wt(t){return t.map(e=>e.type==="text"?{type:"text",text:e.text}:{type:"image",source:{type:"base64",media_type:e.mimeType,data:e.data}})}i(wt,"convertToolResultParts");async function St(t){const{client:e,model:n,messages:s,system:r,tools:o,context:a,options:l}=t,p=a?.tracer,{stop:d,max_tokens:m,...u}=l??{},c={model:n,max_tokens:m??16e3,messages:Ee(s),...r&&{system:r},...d&&{stop_sequences:xe(d)},...o&&{tools:Te(o)},...u};p?.debug("Anthropic request",{request:c});let _;try{const h=await e.messages.create(c);_=It(h)}catch(h){_=K(h)}return p?.debug("Anthropic response",{result:_}),_}i(St,"createGenerationRequest$3");function It(t){const e=Se(t.stop_reason);if(e===T.Error)return{type:"error",error:{type:"Uncaught error",message:`Stop reason is not recognized or unhandled: ${t.stop_reason}`},usage:{in:t.usage.input_tokens,out:t.usage.output_tokens},raw:t};if(e===T.FunctionCall){const n=we(t.content);return{type:"success",id:t.id,model:t.model,role:t.role,finishReason:T.FunctionCall,content:n,text:H(n)??"",usage:{in:t.usage.input_tokens,out:t.usage.output_tokens},raw:t}}if(t.type=="message"){const n=we(t.content);return{type:"success",id:t.id,model:t.model,role:"assistant",finishReason:e,content:n,text:H(n)??"",usage:{in:t.usage.input_tokens,out:t.usage.output_tokens},raw:t}}}i(It,"convertToAIResponse");function bt(){const t=new Map,e=new Map,n=new Map;function s(r){const o=[];switch(r.type){case"message_start":o.push({type:"start",id:r.message.id,data:{model:r.message.model,timestamp:Date.now()}});break;case"message_delta":r.delta.stop_reason&&o.push({type:"complete",data:{finishReason:Se(r.delta.stop_reason),usage:r.usage?{in:r.usage.input_tokens||0,out:r.usage.output_tokens||0}:void 0}});case"message_stop":break;case"content_block_start":if(r.content_block.type==="text")t.set(r.index,"text"),o.push({type:"text-start",data:{index:r.index}});else if(r.content_block.type==="tool_use"){t.set(r.index,"tool");const a=r.content_block;n.set(r.index,{id:a.id,name:a.name,argumentsBuffer:""}),o.push({type:"tool-call-start",data:{index:r.index,id:a.id,name:a.name}})}else if(r.content_block.type==="thinking")t.set(r.index,"thinking"),o.push({type:"thinking-start",data:{index:r.index,redacted:!1}});else if(r.content_block.type==="redacted_thinking")t.set(r.index,"thinking"),o.push({type:"thinking-start",data:{index:r.index,redacted:!0}});else if(r.content_block.type==="server_tool_use"){t.set(r.index,"internal-tool");const a=r.content_block;e.set(a.id,{index:r.index,name:a.name}),o.push({type:"internal-tool-start",data:{index:r.index,id:a.id,name:a.name}})}else if(r.content_block.type==="web_search_tool_result"){const a=r.content_block,l=e.get(a.tool_use_id);l&&(o.push({type:"internal-tool-complete",data:{index:l.index,id:a.tool_use_id,name:l.name,output:a.content}}),e.delete(a.tool_use_id))}break;case"content_block_delta":if(r.delta.type==="text_delta")o.push({type:"text-delta",data:{text:r.delta.text,index:r.index}});else if(r.delta.type==="input_json_delta"){const a=n.get(r.index);a&&(a.argumentsBuffer+=r.delta.partial_json)}else r.delta.type==="thinking_delta"?o.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":{const a=t.get(r.index);if(a==="text")o.push({type:"text-complete",data:{index:r.index}});else if(a==="thinking")o.push({type:"thinking-complete",data:{index:r.index}});else if(a!=="internal-tool"){if(a==="tool"){const l=n.get(r.index);if(l){try{const p=l.argumentsBuffer?JSON.parse(l.argumentsBuffer):{};o.push({type:"tool-call-complete",data:{index:r.index,id:l.id,name:l.name,arguments:p}})}catch(p){throw new Error(`Failed to parse tool call arguments for ${l.name}: ${p instanceof Error?p.message:String(p)}
20
- Raw buffer: ${l.argumentsBuffer}`)}n.delete(r.index)}}}t.delete(r.index);break}}return o}return i(s,"handleEvent"),{handleEvent:s}}i(bt,"createAnthropicStreamingAdapter");async function*kt(t){const{client:e,model:n,messages:s,system:r,tools:o,runtime:a,signal:l,options:p}=t,d=a?.tracer,{stop:m,max_tokens:u,serverTools:c,..._}=p??{},h=o?Te(o):[];if(c){const x={web_search:"web_search_20250305"};for(const S of c){const k=x[S.name]??S.name;h.push({type:k,name:S.name,...S.config})}}const f={model:n,max_tokens:u??At(n),messages:Ee(s),...r&&{system:r},...m&&{stop_sequences:xe(m)},...h.length>0&&{tools:h},..._};d?.debug("Anthropic streaming request",{request:f});const g=bt();try{const x=await e.messages.create({...f,stream:!0},{signal:l});for await(const S of x){const k=g.handleEvent(S);for(const L of k)yield L}}catch(x){if(l?.aborted)return;yield{type:"error",data:{type:"STREAMING_ERROR",message:x instanceof Error?x.message:String(x),raw:x}}}}i(kt,"createStreamingRequest$3");const Ie={[A.CLAUDE_OPUS_4_6]:128e3,[A.CLAUDE_OPUS_4_5_20251101]:64e3,[A.CLAUDE_HAIKU_4_5_20251001]:64e3,[A.CLAUDE_SONNET_4_5_20250929]:64e3,[A.CLAUDE_SONNET_4_20250514]:64e3,[A.CLAUDE_OPUS_4_1_20250805]:32e3,[A.CLAUDE_OPUS_4_20250514]:32e3,[A.CLAUDE_3_HAIKU_20240307]:4096};function At(t){return t in Ie?Ie[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}i(At,"getMaxTokens");const $t="anthropic";function Mt(t){const e=new ze({apiKey:t});return{name:$t,async createGenerationRequest(n,s){return await St({client:e,model:n,...s})},createStreamingRequest(n,s){const{messages:r,system:o,tools:a,context:l,signal:p,options:d}=s;return kt({client:e,model:n,messages:r,system:o,tools:a,runtime:l,signal:p,options:d})}}}i(Mt,"anthropic");function be(t,e){const n=t.map(Ot).flat(1);return e?[{role:"system",content:e},...n]:n}i(be,"convertAxleMessages");function ke(t){if(t&&t.length>0)return t.map(e=>({type:"function",function:{name:e.name,description:e.description,parameters:F.toJSONSchema(e.schema)}}))}i(ke,"convertTools");function ee(t){switch(t){case"stop":return T.Stop;case"length":return T.Length;case"tool_calls":case"function_call":return T.FunctionCall;case"content_filter":return T.Error;default:return T.Stop}}i(ee,"convertFinishReason");function Ot(t){switch(t.role){case"tool":return Rt(t);case"assistant":return Ct(t);default:return Lt(t)}}i(Ot,"convertMessage$2");function Rt(t){return t.content.map(e=>({role:"tool",content:typeof e.content=="string"?e.content:e.content.filter(n=>n.type==="text").map(n=>n.text).join(`
21
- `),tool_call_id:e.id}))}i(Rt,"convertToolMessage$2");function Ct(t){const e=t.content.filter(r=>r.type==="tool-call"),n=t.content.filter(r=>r.type==="text"),s=e.length>0?e.map(r=>({type:"function",id:r.id,function:{name:r.name,arguments:JSON.stringify(r.parameters)}})):void 0;return{role:"assistant",content:n.map(r=>r.text).join(""),...s&&{tool_calls:s}}}i(Ct,"convertAssistantMessage$2");function Lt(t){if(typeof t.content=="string")return{role:"user",content:t.content};const e=t.content.map(Pt).filter(n=>n!==null);return e.every(n=>n.type==="text")?{role:"user",content:e.map(n=>n.text).join("")}:{role:"user",content:e}}i(Lt,"convertUserMessage$2");function Pt(t){return t.type==="text"?{type:"text",text:t.text}:t.type==="file"&&t.file.type==="image"?{type:"image_url",image_url:{url:`data:${t.file.mimeType};base64,${t.file.base64}`}}:null}i(Pt,"convertContentPart$2");async function vt(t){const{baseUrl:e,model:n,messages:s,system:r,tools:o,context:a,apiKey:l,options:p}=t,d=a?.tracer,m=be(s,r),u=ke(o),c={model:n,messages:m,...u&&{tools:u}};p&&(p.temperature!==void 0&&(c.temperature=p.temperature),p.top_p!==void 0&&(c.top_p=p.top_p),p.max_tokens!==void 0&&(c.max_tokens=p.max_tokens),p.frequency_penalty!==void 0&&(c.frequency_penalty=p.frequency_penalty),p.presence_penalty!==void 0&&(c.presence_penalty=p.presence_penalty),p.stop!==void 0&&(c.stop=p.stop)),d?.debug("ChatCompletions request",{request:c});let _;try{const h={"Content-Type":"application/json"};l&&(h.Authorization=`Bearer ${l}`);const f=await fetch(`${e}/chat/completions`,{method:"POST",headers:h,body:JSON.stringify(c)});if(!f.ok){const x=await f.text().catch(()=>"");throw new Error(`HTTP error! status: ${f.status}${x?` - ${x}`:""}`)}const g=await f.json();_=Nt(g)}catch(h){d?.error("Error fetching ChatCompletions response",{error:h instanceof Error?h.message:String(h)}),_=K(h)}return d?.debug("ChatCompletions response",{result:_}),_}i(vt,"createGenerationRequest$2");function Nt(t){const e=t.choices?.[0];if(!e)return{type:"error",error:{type:"ChatCompletionsError",message:"No choices in response"},usage:{in:0,out:0},raw:t};const n=[];if(e.message.reasoning_content&&n.push({type:"thinking",text:e.message.reasoning_content}),e.message.content&&n.push({type:"text",text:e.message.content}),e.message.tool_calls)for(const o of e.message.tool_calls){let a;try{a=JSON.parse(o.function.arguments)}catch(l){throw new Error(`Invalid tool call arguments for ${o.function.name}: ${l instanceof Error?l.message:String(l)}`)}if(typeof a!="object"||a===null||Array.isArray(a))throw new Error(`Invalid tool call arguments for ${o.function.name}: expected object, got ${typeof a}`);n.push({type:"tool-call",id:o.id,name:o.function.name,parameters:a})}const s=n.some(o=>o.type==="tool-call"),r=ee(s?"tool_calls":e.finish_reason);return{type:"success",id:t.id,model:t.model,role:"assistant",finishReason:r,content:n,text:H(n)??"",usage:{in:t.usage?.prompt_tokens||0,out:t.usage?.completion_tokens||0},raw:t}}i(Nt,"fromModelResponse$2");function Ut(){const t=new Map;let e=0,n=-1,s="",r="",o=null,a,l;function p(u){n<0||(o==="text"?u.push({type:"text-complete",data:{index:n}}):o==="thinking"&&u.push({type:"thinking-complete",data:{index:n}}),o=null,n=-1)}i(p,"closeActivePart");function d(u){const c=[];u.usage&&(l={in:u.usage.prompt_tokens,out:u.usage.completion_tokens});const _=u.choices?.[0];if(!_)return c;s||(s=u.id,r=u.model,c.push({type:"start",id:s,data:{model:r,timestamp:Date.now()}}));const h=_.delta;if(h.reasoning_content&&(o!=="thinking"&&(p(c),n=e++,o="thinking",c.push({type:"thinking-start",data:{index:n}})),c.push({type:"thinking-delta",data:{index:n,text:h.reasoning_content}})),h.content&&(o!=="text"&&(p(c),n=e++,o="text",c.push({type:"text-start",data:{index:n}})),c.push({type:"text-delta",data:{text:h.content,index:n}})),h.tool_calls){p(c);for(const f of h.tool_calls){const g=f.index;if(!t.has(g)){const S=e++,k=f.id||`tool-${S}`;t.set(g,{id:k,name:f.function?.name||"",argumentsBuffer:"",partIdx:S}),c.push({type:"tool-call-start",data:{index:S,id:k,name:f.function?.name||""}})}const x=t.get(g);f.id&&(x.id=f.id),f.function?.name&&(x.name=f.function.name),f.function?.arguments&&(x.argumentsBuffer+=f.function.arguments)}}if(_.finish_reason){p(c);for(const[,f]of t)try{const g=f.argumentsBuffer?JSON.parse(f.argumentsBuffer):{};c.push({type:"tool-call-complete",data:{index:f.partIdx,id:f.id,name:f.name,arguments:g}})}catch(g){throw new Error(`Failed to parse tool call arguments for ${f.name}: ${g instanceof Error?g.message:String(g)}
22
- Raw buffer: ${f.argumentsBuffer}`)}a=ee(_.finish_reason)}return c}i(d,"handleChunk");function m(){return a===void 0?[]:[{type:"complete",data:{finishReason:a,usage:l??{in:0,out:0}}}]}return i(m,"finalize"),{handleChunk:d,finalize:m}}i(Ut,"createStreamingAdapter$1");async function*Gt(t){const{baseUrl:e,model:n,messages:s,system:r,tools:o,context:a,signal:l,apiKey:p,options:d}=t,m=a?.tracer;d?.serverTools&&m?.warn("serverTools not supported by ChatCompletions provider");const u=be(s,r),c=ke(o),_={model:n,messages:u,stream:!0,stream_options:{include_usage:!0},...c&&{tools:c}};d&&(d.temperature!==void 0&&(_.temperature=d.temperature),d.top_p!==void 0&&(_.top_p=d.top_p),d.max_tokens!==void 0&&(_.max_tokens=d.max_tokens),d.frequency_penalty!==void 0&&(_.frequency_penalty=d.frequency_penalty),d.presence_penalty!==void 0&&(_.presence_penalty=d.presence_penalty),d.stop!==void 0&&(_.stop=d.stop)),m?.debug("ChatCompletions streaming request",{request:_});const h=Ut();try{const f={"Content-Type":"application/json"};p&&(f.Authorization=`Bearer ${p}`);const g=await fetch(`${e}/chat/completions`,{method:"POST",headers:f,body:JSON.stringify(_),signal:l});if(!g.ok){const L=await g.text().catch(()=>"");throw new Error(`HTTP error! status: ${g.status}${L?` - ${L}`:""}`)}if(!g.body)throw new Error("Response body is null");const x=g.body.getReader(),S=new TextDecoder;let k="";for(;;){const{done:L,value:E}=await x.read();if(L)break;k+=S.decode(E,{stream:!0});const G=k.split(`
23
- `);k=G.pop()||"";for(const D of G){const I=D.trim();if(!I||I.startsWith(":")||!I.startsWith("data: "))continue;const j=I.slice(6);if(j!=="[DONE]")try{const M=JSON.parse(j),B=h.handleChunk(M);for(const q of B)yield q}catch(M){m?.error("Error parsing ChatCompletions stream chunk",{error:M instanceof Error?M.message:String(M),line:I})}}}for(const L of h.finalize())yield L}catch(f){if(l?.aborted)return;m?.error("Error in ChatCompletions streaming request",{error:f instanceof Error?f.message:String(f)}),yield{type:"error",data:{type:"STREAMING_ERROR",message:f instanceof Error?f.message:String(f),raw:f}}}}i(Gt,"createStreamingRequest$2");function Dt(t,e){return{name:"ChatCompletions",async createGenerationRequest(n,s){return await vt({baseUrl:t,model:n,apiKey:e,...s})},createStreamingRequest(n,s){return Gt({baseUrl:t,model:n,apiKey:e,...s})}}}i(Dt,"chatCompletions");const b={GEMINI_3_1_PRO_PREVIEW:"gemini-3.1-pro-preview",GEMINI_3_1_PRO_PREVIEW_CUSTOMTOOLS:"gemini-3.1-pro-preview-customtools",GEMINI_3_PRO_PREVIEW:"gemini-3-pro-preview",GEMINI_3_FLASH_PREVIEW:"gemini-3-flash-preview",GEMINI_2_5_PRO:"gemini-2.5-pro",GEMINI_2_5_FLASH:"gemini-2.5-flash",GEMINI_2_5_FLASH_LITE:"gemini-2.5-flash-lite",GEMINI_2_5_FLASH_LITE_PREVIEW_09_2025:"gemini-2.5-flash-lite-preview-09-2025",GEMINI_2_0_FLASH:"gemini-2.0-flash",GEMINI_2_0_FLASH_001:"gemini-2.0-flash-001",GEMINI_2_0_FLASH_LITE:"gemini-2.0-flash-lite",GEMINI_2_0_FLASH_LITE_001:"gemini-2.0-flash-lite-001",GEMINI_FLASH_LATEST:"gemini-flash-latest",GEMINI_FLASH_LITE_LATEST:"gemini-flash-lite-latest",GEMINI_PRO_LATEST:"gemini-pro-latest",GEMMA_3_27B_IT:"gemma-3-27b-it",GEMMA_3_12B_IT:"gemma-3-12b-it",GEMMA_3_4B_IT:"gemma-3-4b-it",GEMMA_3_1B_IT:"gemma-3-1b-it",GEMMA_3N_E4B_IT:"gemma-3n-e4b-it",GEMMA_3N_E2B_IT:"gemma-3n-e2b-it"};b.GEMINI_3_1_PRO_PREVIEW,b.GEMINI_3_1_PRO_PREVIEW_CUSTOMTOOLS,b.GEMINI_3_PRO_PREVIEW,b.GEMINI_3_FLASH_PREVIEW,b.GEMINI_2_5_PRO,b.GEMINI_2_5_FLASH,b.GEMINI_2_5_FLASH_LITE,b.GEMINI_2_5_FLASH_LITE_PREVIEW_09_2025,b.GEMINI_2_0_FLASH,b.GEMINI_2_0_FLASH_001,b.GEMINI_2_0_FLASH_LITE,b.GEMINI_2_0_FLASH_LITE_001,b.GEMINI_FLASH_LATEST,b.GEMINI_FLASH_LITE_LATEST,b.GEMINI_PRO_LATEST,b.GEMMA_3_27B_IT,b.GEMMA_3_12B_IT,b.GEMMA_3_4B_IT,b.GEMMA_3_1B_IT,b.GEMMA_3N_E4B_IT,b.GEMMA_3N_E2B_IT;const Ft=b.GEMINI_3_FLASH_PREVIEW;function Ae(t,e,n){const s={};return e&&(s.systemInstruction=e),t&&t.length>0&&(s.tools=t.map(r=>({functionDeclarations:[{name:r.name,description:r.description,parametersJsonSchema:F.toJSONSchema(r.schema)}]}))),n&&Object.assign(s,n),s}i(Ae,"prepareConfig");function $e(t){return t.map(jt).filter(e=>e!==void 0)}i($e,"convertAxleMessagesToGemini");function jt(t){switch(t.role){case"tool":return Bt(t);case"assistant":return qt(t);case"user":return Ht(t)}}i(jt,"convertMessage$1");function Bt(t){return{role:"user",parts:t.content.flatMap(e=>{const n={functionResponse:{id:e.id??void 0,name:e.name,response:{output:typeof e.content=="string"?e.content:e.content.filter(r=>r.type==="text").map(r=>r.text).join(`
24
- `)}}};if(typeof e.content=="string")return[n];const s=e.content.filter(r=>r.type==="image").map(r=>({inlineData:{mimeType:r.mimeType,data:r.data}}));return[n,...s]})}}i(Bt,"convertToolMessage$1");function qt(t){const e=[],n=t.content.filter(r=>r.type==="text");if(n.length>0){const r=n.map(o=>o.text).join("");r&&e.push({text:r})}const s=t.content.filter(r=>r.type==="tool-call");return s.length>0&&e.push(...s.map(r=>{const o={functionCall:{id:r.id??void 0,name:r.name,args:r.parameters}};return r.providerMetadata?.thoughtSignature&&(o.thoughtSignature=r.providerMetadata.thoughtSignature),o})),{role:"model",parts:e}}i(qt,"convertAssistantMessage$1");function Ht(t){return typeof t.content=="string"?{role:"user",parts:[{text:t.content}]}:{role:"user",parts:t.content.map(Jt).filter(n=>n!==null)}}i(Ht,"convertUserMessage$1");function Jt(t){return t.type==="text"?{text:t.text}:t.type==="file"&&(t.file.type==="image"||t.file.type==="document")?{inlineData:{mimeType:t.file.mimeType,data:t.file.base64}}:null}i(Jt,"convertContentPart$1");function Me(t){switch(t){case R.STOP:return[!0,T.Stop];case R.MAX_TOKENS:return[!0,T.Length];case R.FINISH_REASON_UNSPECIFIED:case R.SAFETY:case R.RECITATION:case R.LANGUAGE:case R.OTHER:case R.BLOCKLIST:case R.PROHIBITED_CONTENT:case R.SPII:case R.MALFORMED_FUNCTION_CALL:case R.IMAGE_SAFETY:return[!1,T.Error]}}i(Me,"convertStopReason");async function Wt(t){const{client:e,model:n,messages:s,system:r,tools:o,context:a,options:l}=t,p=a?.tracer,d=l?{...l}:{};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);const m={contents:$e(s),config:Ae(o,r,d)};p?.debug("Gemini request",{request:m});let u;try{const c=await e.models.generateContent({model:n,...m});u=zt(c,{tracer:p})}catch(c){p?.error(c instanceof Error?c.message:String(c)),u=K(c)}return p?.debug("Gemini response",{result:u}),u}i(Wt,"createGenerationRequest$1");function zt(t,e){const{tracer:n}=e,s=t.usageMetadata.promptTokenCount,r=t.usageMetadata.totalTokenCount-s,o={in:s,out:r};if(!t)return{type:"error",error:{type:"InvalidResponse",message:"Invalid or empty response from Google AI"},usage:{in:0,out:0},raw:t};if(t.promptFeedback&&t.promptFeedback.blockReason)return{type:"error",error:{type:"Blocked",message:`Response blocked by Google AI: ${t.promptFeedback.blockReason}, ${t.promptFeedback.blockReasonMessage}`},usage:o,raw:t};if(!t.candidates||t.candidates.length===0)return{type:"error",error:{type:"InvalidResponse",message:"Invalid or empty response from Google AI"},usage:{in:0,out:0},raw:t};t.candidates.length>1&&n?.warn(`We received ${t.candidates.length} response candidates`);const a=t.candidates[0],p=(a.content?.parts||[]).map(u=>u.text).filter(u=>u!==void 0).join(""),[d,m]=Me(a.finishReason);if(d){const u=[];if(p&&u.push({type:"text",text:p}),t.functionCalls)for(const c of t.functionCalls)if(c.args==null)u.push({type:"tool-call",id:c.id,name:c.name,parameters:{}});else{if(typeof c.args!="object"||Array.isArray(c.args))throw new Error(`Invalid tool call arguments for ${c.name}: expected object, got ${typeof c.args}`);u.push({type:"tool-call",id:c.id,name:c.name,parameters:c.args})}return{type:"success",id:t.responseId,model:t.modelVersion,role:"assistant",finishReason:t.functionCalls?T.FunctionCall:m,content:u,text:H(u)??"",usage:o,raw:t}}else return{type:"error",error:{type:"Undetermined",message:`Unexpected stop reason: ${m}`},usage:o,raw:t}}i(zt,"fromModelResponse$1");function Kt(){let t=0,e=-1,n=!1,s="",r="",o=0,a=0,l=null;function p(m){e<0||(l==="text"?m.push({type:"text-complete",data:{index:e}}):l==="thinking"&&m.push({type:"thinking-complete",data:{index:e}}),l=null,e=-1)}i(p,"closeActivePart");function d(m){const u=[];s||(s=m.responseId||`gemini-${Date.now()}`,r=m.modelVersion||"gemini",u.push({type:"start",id:s,data:{model:r,timestamp:Date.now()}})),m.usageMetadata&&(o=m.usageMetadata.promptTokenCount||0,a=(m.usageMetadata.totalTokenCount||0)-o);const c=m.candidates?.[0];if(!c)return u;const _=c.content?.parts||[];for(const h of _){const f="thought"in h&&h.thought===!0;if(f&&h.text?(l!=="thinking"&&(p(u),e=t++,l="thinking",u.push({type:"thinking-start",data:{index:e}})),u.push({type:"thinking-delta",data:{index:e,text:h.text}})):h.text&&!f?(l!=="text"&&(p(u),e=t++,l="text",u.push({type:"text-start",data:{index:e}})),u.push({type:"text-delta",data:{text:h.text,index:e}})):h.functionCall||console.log(`[gemini] unhandled part type: ${JSON.stringify(Object.keys(h))}`),h.functionCall){p(u),n=!0;const g=t++,x=h.functionCall.id||`tool-${g}`;u.push({type:"tool-call-start",data:{index:g,id:x,name:h.functionCall.name}});const S={index:g,id:x,name:h.functionCall.name,arguments:h.functionCall.args??{}},k=h;k.thoughtSignature&&(S.providerMetadata={thoughtSignature:k.thoughtSignature}),u.push({type:"tool-call-complete",data:S})}}if(c.finishReason&&c.finishReason!==R.FINISH_REASON_UNSPECIFIED){p(u);const[h,f]=Me(c.finishReason),g=n?T.FunctionCall:f;!h&&!n?u.push({type:"error",data:{type:"FinishReasonError",message:`Unexpected finish reason: ${c.finishReason}`,usage:{in:o,out:a},raw:m}}):u.push({type:"complete",data:{finishReason:g,usage:{in:o,out:a}}})}return u}return i(d,"handleChunk"),{handleChunk:d}}i(Kt,"createGeminiStreamingAdapter");async function*Vt(t){const{client:e,model:n,messages:s,system:r,tools:o,runtime:a,signal:l,options:p}=t,d=a?.tracer,{serverTools:m,...u}=p??{},c=u?{...u}:{};c.max_tokens&&(c.maxOutputTokens=c.max_tokens,delete c.max_tokens),c.stop&&(c.stopSequences=Array.isArray(c.stop)?c.stop:[c.stop],delete c.stop),c.top_p!==void 0&&(c.topP=c.top_p,delete c.top_p);const _=Ae(o,r,c);if(m){const g={web_search:"googleSearch",code_execution:"codeExecution"};_.tools||(_.tools=[]);for(const x of m){const S=g[x.name]??x.name;_.tools.push({[S]:x.config??{}})}}const h={contents:$e(s),config:_};d?.debug("Gemini streaming request",{request:h});const f=Kt();try{const g=await e.models.generateContentStream({model:n,...h});for await(const x of g){const S=f.handleChunk(x);for(const k of S)yield k}}catch(g){if(l?.aborted)return;d?.error(g instanceof Error?g.message:String(g)),yield{type:"error",data:{type:"STREAMING_ERROR",message:g instanceof Error?g.message:String(g),raw:g}}}}i(Vt,"createStreamingRequest$1");const Xt="Gemini";function Zt(t){const e=new Ke({apiKey:t});return{name:Xt,async createGenerationRequest(n,s){return await Wt({client:e,model:n,...s})},createStreamingRequest(n,s){const{messages:r,system:o,tools:a,context:l,signal:p,options:d}=s;return Vt({client:e,model:n,messages:r,system:o,tools:a,runtime:l,signal:p,options:d})}}}i(Zt,"gemini");const Oe={GPT_5_2:"gpt-5.2",GPT_5_2_2025_12_11:"gpt-5.2-2025-12-11",GPT_5_2_CHAT_LATEST:"gpt-5.2-chat-latest",GPT_5_2_PRO:"gpt-5.2-pro",GPT_5_2_PRO_2025_12_11:"gpt-5.2-pro-2025-12-11",GPT_5_2_CODEX:"gpt-5.2-codex",GPT_5_1:"gpt-5.1",GPT_5_1_2025_11_13:"gpt-5.1-2025-11-13",GPT_5_1_CHAT_LATEST:"gpt-5.1-chat-latest",GPT_5_1_CODEX:"gpt-5.1-codex",GPT_5_1_CODEX_MAX:"gpt-5.1-codex-max",GPT_5_1_CODEX_MINI:"gpt-5.1-codex-mini",GPT_5:"gpt-5",GPT_5_2025_08_07:"gpt-5-2025-08-07",GPT_5_CHAT_LATEST:"gpt-5-chat-latest",GPT_5_CODEX:"gpt-5-codex",GPT_5_MINI:"gpt-5-mini",GPT_5_MINI_2025_08_07:"gpt-5-mini-2025-08-07",GPT_5_NANO:"gpt-5-nano",GPT_5_NANO_2025_08_07:"gpt-5-nano-2025-08-07",GPT_5_PRO:"gpt-5-pro",GPT_5_PRO_2025_10_06:"gpt-5-pro-2025-10-06",GPT_5_SEARCH_API:"gpt-5-search-api",GPT_5_SEARCH_API_2025_10_14:"gpt-5-search-api-2025-10-14",GPT_4_1:"gpt-4.1",GPT_4_1_2025_04_14:"gpt-4.1-2025-04-14",GPT_4_1_MINI:"gpt-4.1-mini",GPT_4_1_MINI_2025_04_14:"gpt-4.1-mini-2025-04-14",GPT_4_1_NANO:"gpt-4.1-nano",GPT_4_1_NANO_2025_04_14:"gpt-4.1-nano-2025-04-14",GPT_4O:"gpt-4o",GPT_4O_2024_11_20:"gpt-4o-2024-11-20",GPT_4O_2024_08_06:"gpt-4o-2024-08-06",GPT_4O_2024_05_13:"gpt-4o-2024-05-13",GPT_4O_MINI:"gpt-4o-mini",GPT_4O_MINI_2024_07_18:"gpt-4o-mini-2024-07-18",GPT_4O_SEARCH_PREVIEW:"gpt-4o-search-preview",GPT_4O_SEARCH_PREVIEW_2025_03_11:"gpt-4o-search-preview-2025-03-11",GPT_4O_MINI_SEARCH_PREVIEW:"gpt-4o-mini-search-preview",GPT_4O_MINI_SEARCH_PREVIEW_2025_03_11:"gpt-4o-mini-search-preview-2025-03-11",GPT_4_TURBO:"gpt-4-turbo",GPT_4_TURBO_2024_04_09:"gpt-4-turbo-2024-04-09",O4_MINI:"o4-mini",O4_MINI_2025_04_16:"o4-mini-2025-04-16",O3:"o3",O3_2025_04_16:"o3-2025-04-16",O3_PRO:"o3-pro",O3_PRO_2025_06_10:"o3-pro-2025-06-10",O3_MINI:"o3-mini",O3_MINI_2025_01_31:"o3-mini-2025-01-31",O1:"o1",O1_2024_12_17:"o1-2024-12-17",O1_PRO:"o1-pro",O1_PRO_2025_03_19:"o1-pro-2025-03-19"},Yt=Oe.GPT_5_MINI;function Re(t){if(t&&t.length>0)return t.map(e=>({type:"function",strict:!0,name:e.name,description:e.description,parameters:F.toJSONSchema(e.schema)}))}i(Re,"prepareTools");function Ce(t){return t.map(Qt).flat(1)}i(Ce,"convertAxleMessageToResponseInput");function Qt(t){switch(t.role){case"tool":return en(t);case"assistant":return tn(t);default:return nn(t)}}i(Qt,"convertMessage");function en(t){return t.content.map(e=>({type:"function_call_output",call_id:e.id,output:typeof e.content=="string"?e.content:e.content.map(n=>n.type==="text"?{type:"input_text",text:n.text}:{type:"input_image",image_url:`data:${n.mimeType};base64,${n.data}`})}))}i(en,"convertToolMessage");function tn(t){const e=[],n=H(t.content);n&&e.push({role:t.role,content:n});const s=t.content.filter(o=>o.type==="tool-call");for(const o of s)e.push({type:"function_call",call_id:o.id,name:o.name,arguments:JSON.stringify(o.parameters)});const r=t.content.filter(o=>o.type==="internal-tool");for(const o of r)o.output!=null&&e.push(o.output);return e}i(tn,"convertAssistantMessage");function nn(t){if(typeof t.content=="string")return{role:t.role,content:t.content};{const e=t.content.map(sn).filter(n=>n!==null);return{role:t.role,content:e}}}i(nn,"convertUserMessage");function sn(t){if(t.type==="text")return{type:"input_text",text:t.text};if(t.type==="file"){if(t.file.type==="image")return{type:"input_image",image_url:`data:${t.file.mimeType};base64,${t.file.base64}`,detail:"auto"};if(t.file.type==="document")return{type:"input_file",filename:t.file.path,file_data:`data:${t.file.mimeType};base64,${t.file.base64}`}}return t.type==="thinking",null}i(sn,"convertContentPart");async function rn(t){const{client:e,model:n,messages:s,system:r,tools:o,context:a,options:l}=t,p=a?.tracer,d=Re(o),m={model:n,input:Ce(s),...r&&{instructions:r},...d?{tools:d}:{},...l};p?.debug("OpenAI ResponsesAPI request",{request:m});let u;try{const c=await e.responses.create(m);u=on(c)}catch(c){p?.error(c instanceof Error?c.message:String(c)),u=K(c)}return p?.debug("OpenAI ResponsesAPI response",{result:u}),u}i(rn,"createGenerationRequest");function on(t){if(t.error)return{type:"error",error:{type:t.error.code||"undetermined",message:t.error.message||"Response generation failed"},usage:{in:t.usage?.input_tokens??0,out:t.usage?.output_tokens??0},raw:t};const e=t.output?.filter(r=>r.type==="reasoning")?.map(r=>r),n=[];if(e&&e.length>0)for(const r of e){const o=r.summary?.[0]?.text||r.content?.[0]?.text||"";(o||r.encrypted_content)&&n.push({type:"thinking",text:o,...r.encrypted_content&&{encrypted:r.encrypted_content}})}t.output_text&&n.push({type:"text",text:t.output_text});const s=t.output?.filter(r=>r.type==="function_call");if(s&&s.length>0)for(const r of s){const o=r;try{n.push({type:"tool-call",id:o.id||"",name:o.name||"",parameters:o.arguments?JSON.parse(o.arguments):{}})}catch(a){throw new Error(`Failed to parse tool call arguments for ${o.name}: ${a instanceof Error?a.message:String(a)}
25
- Raw value: ${o.arguments}`)}}return{type:"success",id:t.id,model:t.model||"",role:"assistant",finishReason:t.incomplete_details?T.Error:T.Stop,content:n,text:H(n)??"",usage:{in:t.usage?.input_tokens??0,out:t.usage?.output_tokens??0},raw:t}}i(on,"fromModelResponse");function an(){let t="",e="",n=0,s=-1,r=!1;const o=new Map,a=new Map,l=new Set(["web_search_call","file_search_call","code_interpreter_call"]),p=new Map;function d(m){const u=[];switch(m.type){case"response.created":{t=m.response.id||`openai-${Date.now()}`,e=m.response.model,u.push({type:"start",id:t,data:{model:e,timestamp:Date.now()}});break}case"response.output_text.delta":{s===-1&&(s=n++,u.push({type:"text-start",data:{index:s}})),u.push({type:"text-delta",data:{text:m.delta,index:s}});break}case"response.output_text.done":{s>=0&&(u.push({type:"text-complete",data:{index:s}}),s=-1);break}case"response.function_call_arguments.delta":{const c=m.item_id;if(!p.has(c)){const h=o.get(c),f=h?.name||"",g=h?.callId||c,x=n++;p.set(c,{id:c,callId:g,name:f,argumentsBuffer:"",partIdx:x}),u.push({type:"tool-call-start",data:{index:x,id:g,name:f}})}const _=p.get(c);_.argumentsBuffer+=m.delta;break}case"response.function_call_arguments.done":{r=!0;const c=m.item_id,_=p.get(c),h=m.name||_?.name||"";if(_){try{const f=m.arguments?JSON.parse(m.arguments):{};u.push({type:"tool-call-complete",data:{index:_.partIdx,id:_.callId,name:h,arguments:f}})}catch(f){throw new Error(`Failed to parse function call arguments for ${h}: ${f instanceof Error?f.message:String(f)}
26
- Raw value: ${m.arguments}`)}p.delete(c)}break}case"response.completed":{const c=m.response.usage;u.push({type:"complete",data:{finishReason:m.response.incomplete_details?T.Error:r?T.FunctionCall:T.Stop,usage:{in:c?.input_tokens||0,out:c?.output_tokens||0}}});break}case"response.failed":{u.push({type:"error",data:{type:"RESPONSES_API_ERROR",message:`Response failed: ${m.response.status}`,raw:m}});break}case"response.output_item.added":{if(m.item?.type==="reasoning")s=n++,u.push({type:"thinking-start",data:{index:s}});else if(m.item?.type==="function_call"){const c=m.item,_=c.id||c.call_id;_&&o.set(_,{name:c.name||"",callId:c.call_id||_})}else if(m.item&&l.has(m.item.type)){const c=m.item,_=n++;a.set(c.id,_),u.push({type:"internal-tool-start",data:{index:_,id:c.id,name:c.type}})}break}case"response.output_item.done":{if(m.item?.type==="reasoning"&&s>=0)u.push({type:"thinking-complete",data:{index:s}}),s=-1;else if(m.item&&l.has(m.item.type)){const c=m.item,_=a.get(c.id);_!==void 0&&(u.push({type:"internal-tool-complete",data:{index:_,id:c.id,name:c.type,output:m.item}}),a.delete(c.id))}break}case"response.reasoning_text.delta":{m.delta&&u.push({type:"thinking-delta",data:{index:s,text:m.delta}});break}case"response.reasoning_summary_text.delta":{m.delta&&u.push({type:"thinking-summary-delta",data:{index:s,text:m.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: ${m.type}`)}return u}return i(d,"handleEvent"),{handleEvent:d}}i(an,"createStreamingAdapter");async function*cn(t){const{client:e,model:n,messages:s,system:r,tools:o,runtime:a,signal:l,options:p}=t,d=a?.tracer,{serverTools:m,...u}=p??{},c=Re(o)??[];if(m){const f={web_search:"web_search_preview",code_execution:"code_interpreter"};for(const g of m){const x=f[g.name]??g.name;c.push({type:x,...g.config})}}const _={model:n,input:Ce(s),...r&&{instructions:r},stream:!0,...c.length>0?{tools:c}:{},...u};d?.debug("OpenAI ResponsesAPI streaming request",{request:_});const h=an();try{const f=e.responses.stream(_,...l?[{signal:l}]:[]);for await(const g of f){const x=h.handleEvent(g);for(const S of x)yield S}}catch(f){if(l?.aborted)return;d?.error(f instanceof Error?f.message:String(f)),yield{type:"error",data:{type:"STREAMING_ERROR",message:f instanceof Error?f.message:String(f),raw:f}}}}i(cn,"createStreamingRequest");const ln="OpenAI";function un(t){const e=new Ve({apiKey:t});return{name:ln,async createGenerationRequest(n,s){return await rn({client:e,model:n,...s})},createStreamingRequest(n,s){const{messages:r,system:o,tools:a,context:l,signal:p,options:d}=s;return cn({client:e,model:n,messages:r,system:o,tools:a,runtime:l,signal:p,options:d})}}}i(un,"openai");const pn=O.object({searchTerm:O.string().describe("The search term to query")});class dn{static{i(this,"BraveSearchTool")}name="brave";description="Perform a search using the Brave search engine";schema=pn;apiKey;throttle;lastExecTime=0;constructor(e){e&&this.configure(e)}configure(e){const{rateLimit:n}=e;this.apiKey=e["api-key"],this.throttle=n?1100/n:void 0}async execute(e){const{searchTerm:n}=e;if(this.throttle){for(;Date.now()-this.lastExecTime<this.throttle;)await Et(this.throttle-(Date.now()-this.lastExecTime));this.lastExecTime=Date.now()}try{const s=this.apiKey,r="https://api.search.brave.com/res/v1/web/search",o=new URL(r);o.searchParams.append("q",n),o.searchParams.append("format","json");const a=await fetch(o.toString(),{method:"GET",headers:{Accept:"application/json","X-Subscription-Token":s}});if(!a.ok)throw new Error(`[Brave] HTTP error ${a.status}: ${a.statusText}`);const l=await a.json();return JSON.stringify(l)}catch(s){throw s instanceof Error?new Error(`[Brave] Error fetching search results: ${s.message}`):s}}}const mn=new dn,fn=$.object({operation:$.enum(["add","subtract","multiply","divide"]).describe("The operation to perform (add, subtract, multiply, divide)"),a:$.number().describe("First operand"),b:$.number().describe("Second operand")}),hn={name:"calculator",description:"Performs basic arithmetic operations",schema:fn,execute:i(async({operation:t,a:e,b:n})=>{switch(t){case"add":return`${e} + ${n} = ${e+n}`;case"subtract":return`${e} - ${n} = ${e-n}`;case"multiply":return`${e} * ${n} = ${e*n}`;case"divide":if(n===0)throw new Error("Cannot divide by zero");return`${e} / ${n} = ${e/n}`;default:throw new Error(`Unknown operation: ${t}`)}},"execute")},_n=Ze(Xe),gn=3e4,yn=1024*1024;async function xn(t,e={}){const{stdout:n,stderr:s}=await _n(t,{cwd:e.cwd,timeout:e.timeout??gn,maxBuffer:e.maxBuffer??yn});return{stdout:n,stderr:s}}i(xn,"runCommand");function En(t){if(t instanceof Error){const e=t;let n=`Error executing command: ${t.message}`;return e.stdout&&(n+=`
27
- [stdout]: ${e.stdout}`),e.stderr&&(n+=`
28
- [stderr]: ${e.stderr}`),n}return`Error executing command: ${String(t)}`}i(En,"formatExecError");function Tn(t,e){return e&&e.trim()?`${t}
29
- [stderr]: ${e}`:t}i(Tn,"formatOutput");const wn=O.object({command:O.string().describe("The shell command to execute")});class Sn{static{i(this,"ExecTool")}name="exec";description="Execute a shell command and return the output.";schema=wn;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){const{command:n}=e;try{const s=await xn(n,{timeout:this.timeout,maxBuffer:this.maxBuffer,cwd:this.cwd});return Tn(s.stdout,s.stderr)}catch(s){return En(s)}}}const In=new Sn,bn=$.object({path:$.string().describe("The file path to patch"),old_string:$.string().describe("The exact text to find and replace"),new_string:$.string().describe("The replacement text"),start_line:$.number().int().positive().describe("1-indexed start line of the region to match within"),end_line:$.number().int().positive().describe("1-indexed end line (inclusive) of the region to match within")}),kn={name:"patch-file",description:"Patch a file by replacing an exact string match within a specified line range",schema:bn,summarize:i(({path:t,start_line:e,end_line:n})=>`${t}:${e}:${n}`,"summarize"),execute:i(async({path:t,old_string:e,new_string:n,start_line:s,end_line:r})=>{if(r<s)throw new Error(`end_line (${r}) must be >= start_line (${s})`);let o;try{o=await J(t,"utf-8")}catch(h){throw h instanceof Error?new Error(`Failed to read file "${t}": ${h.message}`):h}const a=o.split(`
30
- `);if(s>a.length)throw new Error(`start_line (${s}) exceeds file length (${a.length} lines)`);if(r>a.length)throw new Error(`end_line (${r}) exceeds file length (${a.length} lines)`);const p=a.slice(s-1,r).join(`
31
- `),d=p.indexOf(e);if(d===-1)throw new Error(`old_string not found within lines ${s}-${r} of "${t}"`);if(p.indexOf(e,d+1)!==-1)throw new Error(`old_string matches multiple times within lines ${s}-${r} of "${t}"`);const u=p.replace(e,n),_=[...a.slice(0,s-1),...u.split(`
32
- `),...a.slice(r)].join(`
33
- `);try{await ie(t,_,"utf-8")}catch(h){throw h instanceof Error?new Error(`Failed to write file "${t}": ${h.message}`):h}return`Successfully patched "${t}" (lines ${s}-${r})`},"execute")},An=$.object({path:$.string().describe("The file path to read from")}),$n={name:"read-file",description:"Read the contents of a file from disk",schema:An,summarize:i(({path:t})=>t,"summarize"),execute:i(async({path:t})=>{try{return await J(t,"utf-8")}catch(e){throw e instanceof Error?new Error(`Failed to read file "${t}": ${e.message}`):e}},"execute")},Mn=$.object({path:$.string().describe("The file path to write to"),content:$.string().describe("The content to write to the file")}),On={name:"write-file",description:"Write content to a file on disk, creating directories if needed",schema:Mn,summarize:i(({path:t})=>t,"summarize"),execute:i(async({path:t,content:e})=>{try{return await Je(We(t),{recursive:!0}),await ie(t,e,"utf-8"),`Successfully wrote ${e.length} characters to "${t}"`}catch(n){throw n instanceof Error?new Error(`Failed to write file "${t}": ${n.message}`):n}},"execute")};function Le(t){try{const e=F.fromJSONSchema(t);return e instanceof F.ZodObject?e.strict():F.object({}).passthrough()}catch{return F.object({}).passthrough()}}i(Le,"jsonSchemaToZod");function Rn(t,e,n){return t.map(s=>Ln(s,e,n))}i(Rn,"createMcpTools");function Cn(t,e){return t.map(n=>{const s=e?`${e}_${n.name}`:n.name,r=Le(n.inputSchema);return{name:s,description:n.description??"",schema:r}})}i(Cn,"createMcpToolDefinitions");function Ln(t,e,n){const s=n?`${n}_${t.name}`:t.name,r=Le(t.inputSchema);return{name:s,description:t.description??"",schema:r,async execute(o){const a=await e.callTool({name:t.name,arguments:o});if("isError"in a&&a.isError)throw new Error(vn(a.content));return Pn(a.content)}}}i(Ln,"createMcpTool");function Pn(t){return t.some(n=>n.type==="image")?t.filter(n=>n.type==="text"||n.type==="image").map(n=>{if(n.type==="text")return{type:"text",text:n.text};const s=n;return{type:"image",data:s.data,mimeType:s.mimeType}}):t.filter(n=>n.type==="text").map(n=>n.text).join(`
34
- `)}i(Pn,"formatToolResult");function vn(t){return t.filter(e=>e.type==="text").map(e=>e.text).join(`
35
- `)||"MCP tool execution error"}i(vn,"formatErrorContent");class Nn{static{i(this,"MCP")}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;const n=e?.tracer?.startSpan("mcp:connect",{type:"internal"});this.client=new Ye({name:"axle",version:"1.0.0"}),this.config.transport==="stdio"?this.transport=new Qe({command:this.config.command,args:this.config.args,env:this.config.env}):this.transport=new et(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,n?.end("ok")}catch(s){throw n?.end("error"),s}}async listTools(e){const n=this.assertConnected(),s=await this.fetchTools(n,e?.tracer);return Rn(s,n,e?.prefix)}async listToolDefinitions(e){const n=this.assertConnected(),s=await this.fetchTools(n,e?.tracer);return Cn(s,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,n){if(this.cachedMcpTools)return this.cachedMcpTools;n?.debug("mcp:listTools");const s=await e.listTools();return this.cachedMcpTools=s.tools.map(r=>({name:r.name,description:r.description,inputSchema:r.inputSchema})),this.cachedMcpTools}assertConnected(){if(!this._connected||!this.client)throw new Error("MCP not connected. Call connect() first.");return this.client}}const Pe={debug:0,info:1,warn:2,error:3};class Un{static{i(this,"Tracer")}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){const n=this.writers.indexOf(e);n!==-1&&this.writers.splice(n,1)}startSpan(e,n){const s={traceId:crypto.randomUUID(),spanId:crypto.randomUUID(),name:e,type:n?.type,startTime:performance.now(),status:"ok",attributes:{},events:[]};return this.writers.forEach(r=>r.onSpanStart(s)),new te(s,this)}async flush(){for(const e of this.writers)e.flush&&await e.flush()}_notifySpanEnd(e){this.writers.forEach(n=>n.onSpanEnd(e))}_notifySpanUpdate(e){this.writers.forEach(n=>n.onSpanUpdate?.(e))}_notifyEvent(e,n){this.writers.forEach(s=>s.onEvent?.(e,n))}_notifySpanStart(e){this.writers.forEach(n=>n.onSpanStart(e))}_notifyLLMStreamStart(e){this.writers.forEach(n=>n.onLLMStreamStart?.(e))}_notifyLLMStreamChunk(e,n){this.writers.forEach(s=>s.onLLMStreamChunk?.(e,n))}_notifyLLMStreamEnd(e,n){this.writers.forEach(s=>s.onLLMStreamEnd?.(e,n))}_shouldLog(e){return Pe[e]>=Pe[this._minLevel]}}class te{static{i(this,"Span")}data;tracer;ended=!1;llmStreamBuffer="";llmStreamActive=!1;constructor(e,n){this.data=e,this.tracer=n}startSpan(e,n){const s={traceId:this.data.traceId,spanId:crypto.randomUUID(),parentSpanId:this.data.spanId,name:e,type:n?.type,startTime:performance.now(),status:"ok",attributes:{},events:[]};return this.tracer._notifySpanStart(s),new te(s,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,n,s){if(this.ended||!this.tracer._shouldLog(n))return;const r={name:e,timestamp:performance.now(),level:n,attributes:s};this.data.events.push(r),this.tracer._notifyEvent(this.data,r)}debug(e,n){this.addEvent(e,"debug",n)}info(e,n){this.addEvent(e,"info",n)}warn(e,n){this.addEvent(e,"warn",n)}error(e,n){this.addEvent(e,"error",n)}setAttribute(e,n){this.ended||(this.data.attributes[e]=n,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))}startLLMStream(){this.ended||(this.llmStreamActive=!0,this.llmStreamBuffer="",this.tracer._notifyLLMStreamStart(this.data))}appendLLMStream(e){this.ended||!this.llmStreamActive||(this.llmStreamBuffer+=e,this.tracer._notifyLLMStreamChunk(this.data,e))}endLLMStream(e){if(this.ended||!this.llmStreamActive)return;this.llmStreamActive=!1;const n={...e,response:{...e.response,content:e.response.content??this.llmStreamBuffer}};this.data.result=n,this.tracer._notifyLLMStreamEnd(this.data,n)}}const ve={debug:0,info:1,warn:2,error:3};let Ne=!1;function Gn(){Ne||(le.use(tt()),Ne=!0)}i(Gn,"ensureMarkedInit");class Dn{static{i(this,"SimpleWriter")}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 ve[e]>=ve[this.minLevel]}isSpanVisible(e){return!(e.type==="internal"&&!this.showInternal)}findVisibleAncestor(e){let n=e.parentSpanId;for(;n;){const s=this.spans.get(n);if(!s)break;if(this.isSpanVisible(s))return s;n=s.parentSpanId}return null}calculateVisibleDepth(e){if(!this.isSpanVisible(e))return-1;const n=this.findVisibleAncestor(e);return n?(this.visibleDepths.get(n.spanId)??0)+1:0}formatTimestamp(){if(!this.showTimestamp)return"";const e=new Date,n=e.toTimeString().slice(0,8),s=e.getMilliseconds().toString().padStart(3,"0");return`[${n}.${s}] `}formatDuration(e){if(!this.showDuration||!e.endTime)return"";const n=e.endTime-e.startTime;return n<1e3?` (${Math.round(n)}ms)`:` (${(n/1e3).toFixed(2)}s)`}formatIndent(e){return" ".repeat(e)}formatSpanName(e){return e.type?`[${e.type}] ${e.name}`:e.name}renderMarkdown(e){return Gn(),le.parse(e).trimEnd()}onSpanStart(e){if(this.spans.set(e.spanId,e),!this.isSpanVisible(e))return;const s=this.calculateVisibleDepth(e);this.visibleDepths.set(e.spanId,s);const r=this.formatIndent(s),o=this.formatTimestamp(),a=this.formatSpanName(e);this.output(`${o}${r}START ${a}`)}onSpanEnd(e){if(this.spans.set(e.spanId,e),!this.isSpanVisible(e))return;const s=this.visibleDepths.get(e.spanId)??0,r=this.formatIndent(s),o=this.formatTimestamp(),a=this.formatDuration(e),l=this.formatSpanName(e),p=e.status==="error"?" [ERROR]":"";this.output(`${o}${r}END ${l}${a}${p}`)}onSpanUpdate(e){this.spans.set(e.spanId,e)}onEvent(e,n){if(!this.shouldShowEvent(n.level))return;this.spans.set(e.spanId,e);let s;if(this.isSpanVisible(e))s=this.visibleDepths.get(e.spanId)??0;else{const u=this.findVisibleAncestor(e);u?s=this.visibleDepths.get(u.spanId)??0:s=0}const r=this.formatIndent(s+1),o=this.formatTimestamp(),a=n.level.toUpperCase().padEnd(5),l=this.markdown&&n.attributes?.markdown===!0,p=n.attributes?Object.entries(n.attributes).filter(([u])=>u!=="markdown"):[];let d=n.name;l&&(d=this.renderMarkdown(d));let m=`${o}${r}${a} ${d}`;if(p.length>0){const u=p.map(([c,_])=>`${c}=${JSON.stringify(_)}`).join(" ");m+=` ${u}`}this.output(m)}onLLMStreamStart(e){if(this.spans.set(e.spanId,e),!this.isSpanVisible(e))return;const n=this.visibleDepths.get(e.spanId)??0,s=this.formatIndent(n+1),r=this.formatTimestamp();this.output(`${r}${s}INFO LLM streaming started`)}onLLMStreamChunk(e,n){}onLLMStreamEnd(e,n){if(this.spans.set(e.spanId,e),!this.isSpanVisible(e))return;const s=this.visibleDepths.get(e.spanId)??0,r=this.formatIndent(s+1),o=this.formatTimestamp(),a=[`model=${n.model}`];if(n.finishReason&&a.push(`finishReason=${n.finishReason}`),n.usage&&(n.usage.inputTokens!==void 0&&a.push(`inputTokens=${n.usage.inputTokens}`),n.usage.outputTokens!==void 0&&a.push(`outputTokens=${n.usage.outputTokens}`)),this.output(`${o}${r}INFO LLM complete ${a.join(" ")}`),this.shouldShowEvent("debug")&&n.response.content){const p=(typeof n.response.content=="string"?n.response.content:JSON.stringify(n.response.content,null,2)).split(`
36
- `);for(const d of p)this.output(`${o}${r}DEBUG ${d}`)}}}export{T as A,xt as D,pe as H,yt as I,A as M,Dn as S,Un as T,Ft as a,b,rt as c,Yt as d,me as e,Oe as f,st as g,lt as h,Nn as i,Mt as j,mn as k,hn as l,Dt as m,ge as n,Zt as o,gt as p,un as q,he as r,fe as s,V as t,pt as u,$n as v,On as w,kn as x,In as y};