@fifthrevision/axle 0.10.0 → 0.10.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ProceduralMemory-g6rvICO7.js +42 -0
- package/dist/cli.d.ts +1 -0
- package/dist/cli.js +6 -0
- package/dist/index.js +1 -0
- package/package.json +5 -5
- package/dist/index.mjs +0 -38
- /package/dist/{index.d.mts → index.d.ts} +0 -0
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import e,{access as t,mkdir as n,readFile as r,stat as i,writeFile as a}from"node:fs/promises";import o,{dirname as s,extname as c,resolve as l}from"node:path";import*as u from"zod";import d,{z as f}from"zod";import"glob";import p from"mime";import m from"@anthropic-ai/sdk";import{FinishReason as h,GoogleGenAI as g}from"@google/genai";import _ from"openai";import{exec as v}from"node:child_process";import{promisify as y}from"node:util";import{Client as b}from"@modelcontextprotocol/sdk/client/index.js";import{StdioClientTransport as x}from"@modelcontextprotocol/sdk/client/stdio.js";import{StreamableHTTPClientTransport as S}from"@modelcontextprotocol/sdk/client/streamableHttp.js";import{marked as C}from"marked";import{markedTerminal as w}from"marked-terminal";import T from"node:crypto";var E=class e extends Error{code;id;details;constructor(t,n){super(t,{cause:n?.cause}),this.name=this.constructor.name,this.code=n?.code||`AXLE_ERROR`,this.id=n?.id,this.details=n?.details,Object.setPrototypeOf(this,e.prototype)}toJSON(){return{name:this.name,message:this.message,code:this.code,...this.id?{id:this.id}:{},...this.details?{details:this.details}:{},...this.cause?{cause:D(this.cause)}:{}}}};function D(e){return e instanceof Error?{name:e.name,message:e.message,...e.stack?{stack:e.stack}:{},...`cause`in e&&e.cause?{cause:D(e.cause)}:{}}:e}function O(e){let{text:t,files:n}=e,r=[];if(t&&r.push({type:`text`,text:t}),n)for(let e of n)r.push({type:`file`,file:e});return r}function k(e){return e.filter(e=>e.type===`text`).map(e=>e.text).join(`
|
|
2
|
+
|
|
3
|
+
`)}function A(e){return e.filter(e=>e.type===`tool-call`)}function j(e,t){let n=t.usage??{in:0,out:0};e.in+=n.in??0,e.out+=n.out??0}function M(e){return JSON.stringify({error:e})}async function N(e,t=async()=>null,n){let r=[];for(let i of e){let e=n?.startSpan(i.name,{type:`tool`}),a;try{a=await t(i.name,i.parameters)}catch(e){a={type:`error`,error:{type:`exception`,message:e instanceof Error?e.message:String(e)}}}if(a==null){let t=`Tool not found: ${i.name}`;e?.setResult({kind:`tool`,name:i.name,input:i.parameters,output:{type:`not-found`,message:t}}),e?.end(`error`),r.push({id:i.id,name:i.name,content:M({type:`not-found`,message:t}),isError:!0});continue}a.type===`success`?(e?.setResult({kind:`tool`,name:i.name,input:i.parameters,output:a.content}),e?.end(`ok`),r.push({id:i.id,name:i.name,content:a.content})):(e?.setResult({kind:`tool`,name:i.name,input:i.parameters,output:a.error}),e?.end(`error`),r.push({id:i.id,name:i.name,content:M(a.error),isError:!0}))}return{results:r}}let P=function(e){return e.Stop=`stop`,e.Length=`length`,e.FunctionCall=`function_call`,e.Error=`error`,e.Custom=`custom`,e.Cancelled=`cancelled`,e}({});function F(e,t){for(let n of e)n(t)}function ee(e){return{type:`error`,error:{type:`not-found`,message:`Tool not found: ${e}`}}}function I(e){let t=[],n=new AbortController,r=e.signal?AbortSignal.any([n.signal,e.signal]):n.signal,{promise:i,resolve:a,reject:o}=Promise.withResolvers();return Promise.resolve().then(()=>L(e,r,t).then(a,o)),{on(e){t.push(e)},cancel(){n.abort()},get final(){return i}}}async function L(e,t,n){let{provider:r,model:i,messages:a,system:o,tools:s,serverTools:c,onToolCall:l,maxIterations:u,tracer:d,options:f}=e,p=[...a],m=[],h={in:0,out:0},g=0,_=0,v=e=>{p.push(e),m.push(e)},y=e=>{e.result===`error`&&F(n,{type:`error`,error:e.error});let t=e.result===`success`?e.final?.content:e.result===`cancelled`?e.partial?.content:null,r=e.result===`success`?e.final?.finishReason:e.result===`cancelled`?P.Cancelled:void 0;return d?.setResult({kind:`llm`,model:i,request:{messages:a},response:{content:t??null},usage:e.usage?{inputTokens:e.usage.in,outputTokens:e.usage.out}:void 0,finishReason:r}),d?.end(e.result===`error`?`error`:`ok`),e},b=(e,t,n,r)=>{r();let i=e.length>0?{role:`assistant`,id:t,model:n,content:e,finishReason:P.Cancelled}:void 0;return i&&v(i),d?.end(`ok`),{result:`cancelled`,messages:m,partial:i,usage:h}};for(;;){if(t.aborted)return b([],``,``,()=>{});if(u!==void 0&&_>=u)return y({result:`error`,messages:m,error:{type:`model`,error:{type:`error`,error:{type:`MaxIterations`,message:`Exceeded max iterations (${u})`}}},usage:h});_+=1;let e=d?.startSpan(`turn-${_}`,{type:`llm`}),a=c?{...f,serverTools:c}:f,x=r.createStreamingRequest?.(i,{messages:p,system:o,tools:s,context:{tracer:e},signal:t,options:a});if(!x)throw e?.end(`error`),Error(`Provider does not support streaming. Use generate() instead.`);let S=[],C=``,w=``,T=null,E={in:0,out:0},D=-1,O=null,k=``,A=new Map,j=-1,M=()=>{O!==null&&D>=0&&(F(n,{type:O===`text`?`text:end`:`thinking:end`,index:D,final:k}),O=null,k=``,D=-1)};for await(let r of x){switch(r.type){case`start`:C=r.id,w=r.data.model,F(n,{type:`turn:start`,id:C,model:w});break;case`text-start`:M(),S.push({type:`text`,text:``}),j=S.length-1,D=g++,O=`text`,k=``,F(n,{type:`text:start`,index:D});break;case`text-delta`:{let e=S[j];e.text+=r.data.text,k=e.text,F(n,{type:`text:delta`,index:D,delta:r.data.text,accumulated:k});break}case`text-complete`:M();break;case`thinking-start`:M(),S.push({type:`thinking`,text:``}),j=S.length-1,D=g++,O=`thinking`,k=``,F(n,{type:`thinking:start`,index:D});break;case`thinking-delta`:{let e=S[j];e.text+=r.data.text,k=e.text,F(n,{type:`thinking:delta`,index:D,delta:r.data.text,accumulated:k});break}case`thinking-summary-delta`:{let e=S[j];e.text+=r.data.text,k=e.text,F(n,{type:`thinking:delta`,index:D,delta:r.data.text,accumulated:k});break}case`thinking-complete`:M();break;case`tool-call-start`:{M();let e=g++;S.push({type:`tool-call`,id:r.data.id,name:r.data.name,parameters:{}}),j=S.length-1,A.set(r.data.id,e),F(n,{type:`tool:request`,index:e,id:r.data.id,name:r.data.name});break}case`tool-call-complete`:{let e=S[j];r.data.id&&(e.id=r.data.id),r.data.name&&(e.name=r.data.name),e.parameters=r.data.arguments,r.data.providerMetadata&&(e.providerMetadata=r.data.providerMetadata);break}case`internal-tool-start`:{M();let e=g++;S.push({type:`internal-tool`,id:r.data.id,name:r.data.name}),j=S.length-1,F(n,{type:`internal-tool:start`,index:e,id:r.data.id,name:r.data.name});break}case`internal-tool-complete`:{let e=S[j];r.data.output!=null&&(e.output=r.data.output),F(n,{type:`internal-tool:complete`,index:r.data.index,id:r.data.id,name:r.data.name,output:r.data.output});break}case`complete`:M(),T=r.data.finishReason,E=r.data.usage;break;case`error`:{M();let t=r.data.usage??{in:0,out:0};return h.in+=t.in??0,h.out+=t.out??0,e?.end(`error`),y({result:`error`,messages:m,error:{type:`model`,error:{type:`error`,error:{type:r.data.type,message:r.data.message}}},usage:h})}default:console.warn(`[WARN] Unhandled chunk type. Should never happen`)}if(t.aborted)break}if(t.aborted)return e?.end(`ok`),b(S,C,w,M);if(T===null)return M(),e?.end(`error`),y({result:`error`,messages:m,error:{type:`model`,error:{type:`error`,error:{type:`IncompleteStream`,message:`Stream ended without a completion signal`}}},usage:h});h.in+=E.in??0,h.out+=E.out??0;let I={kind:`llm`,model:w,request:{messages:p},response:{content:S},usage:{inputTokens:E.in,outputTokens:E.out},finishReason:T};e?.setResult(I),e?.end();let L={role:`assistant`,id:C,model:w,content:S,finishReason:T};if(v(L),F(n,{type:`turn:complete`,message:L,usage:E}),T!==P.FunctionCall)return y({result:`success`,messages:m,final:L,usage:h});let R=S.filter(e=>e.type===`tool-call`);if(R.length===0)return y({result:`success`,messages:m,final:L,usage:h});if(t.aborted)return d?.end(`ok`),{result:`cancelled`,messages:m,usage:h};let z=crypto.randomUUID();F(n,{type:`tool-results:start`,id:z});let B=0,{results:V}=await N(R,async(e,t)=>{let r=R[B++],i=A.get(r.id)??-1;F(n,{type:`tool:exec-start`,index:i,id:r.id,name:e,parameters:t});let a=(l?await l(e,t):null)??ee(e);return F(n,{type:`tool:exec-complete`,index:i,id:r.id,name:e,result:a}),a},d);if(V.length>0){let e={role:`tool`,id:z,content:V};v(e),F(n,{type:`tool-results:complete`,message:e})}}}var R=class{rootPath;constructor(e){this.rootPath=e}async read(t){let n=o.join(this.rootPath,t);try{return await e.readFile(n,`utf-8`)}catch{return null}}async write(t,n){let r=o.join(this.rootPath,t);await e.mkdir(o.dirname(r),{recursive:!0}),await e.writeFile(r,n,`utf-8`)}},z=class{currentTurn=null;currentTextPart=null;currentThinkingPart=null;toolIdMap=new Map;accumulatedUsage={in:0,out:0};createUserTurn(e){let t=e.id??crypto.randomUUID(),n=[];if(typeof e.content==`string`)n.push({id:crypto.randomUUID(),type:`text`,text:e.content});else for(let t of e.content)t.type===`text`?n.push({id:crypto.randomUUID(),type:`text`,text:t.text}):t.type===`file`&&n.push({id:crypto.randomUUID(),type:`file`,file:t.file});let r={id:t,owner:`user`,parts:n,status:`complete`};return{turn:r,events:[{type:`turn:user`,turn:r}]}}startAgentTurn(){let e=crypto.randomUUID(),t={id:e,owner:`agent`,parts:[],status:`streaming`};return this.currentTurn=t,this.currentTextPart=null,this.currentThinkingPart=null,this.toolIdMap.clear(),this.accumulatedUsage={in:0,out:0},{turn:t,events:[{type:`turn:start`,turnId:e}]}}handleStreamEvent(e){let t=this.currentTurn;if(!t)return[];let n=[];switch(e.type){case`turn:start`:break;case`text:start`:{this.closeOpenParts(t,n);let e={id:crypto.randomUUID(),type:`text`,text:``};t.parts.push(e),this.currentTextPart=e,n.push({type:`part:start`,turnId:t.id,part:{...e}});break}case`text:delta`:this.currentTextPart&&(this.currentTextPart.text=e.accumulated,n.push({type:`text:delta`,turnId:t.id,partId:this.currentTextPart.id,delta:e.delta}));break;case`text:end`:this.currentTextPart&&=(this.currentTextPart.text=e.final,n.push({type:`part:end`,turnId:t.id,partId:this.currentTextPart.id}),null);break;case`thinking:start`:{this.closeOpenParts(t,n);let e={id:crypto.randomUUID(),type:`thinking`,text:``};t.parts.push(e),this.currentThinkingPart=e,n.push({type:`part:start`,turnId:t.id,part:{...e}});break}case`thinking:delta`:this.currentThinkingPart&&(this.currentThinkingPart.text=e.accumulated,n.push({type:`thinking:delta`,turnId:t.id,partId:this.currentThinkingPart.id,delta:e.delta}));break;case`thinking:end`:this.currentThinkingPart&&=(this.currentThinkingPart.text=e.final,n.push({type:`part:end`,turnId:t.id,partId:this.currentThinkingPart.id}),null);break;case`tool:request`:{this.closeOpenParts(t,n);let r=crypto.randomUUID(),i={id:r,type:`action`,kind:`tool`,status:`pending`,detail:{name:e.name,parameters:{}}};t.parts.push(i),this.toolIdMap.set(e.id,{partId:r,turnId:t.id}),n.push({type:`part:start`,turnId:t.id,part:{...i,detail:{...i.detail}}});break}case`tool:exec-start`:{let r=this.toolIdMap.get(e.id);if(r){let i=this.findActionPart(t,r.partId);i&&(i.status=`running`,i.detail.parameters=e.parameters,n.push({type:`action:running`,turnId:t.id,partId:r.partId,parameters:e.parameters}))}break}case`tool:exec-complete`:{let r=this.toolIdMap.get(e.id);if(r){let i=this.findActionPart(t,r.partId);i&&(e.result.type===`success`?(i.status=`complete`,i.detail.result={type:`success`,content:e.result.content},n.push({type:`action:complete`,turnId:t.id,partId:r.partId,result:i.detail.result})):(i.status=`error`,i.detail.result={type:`error`,error:e.result.error},n.push({type:`action:error`,turnId:t.id,partId:r.partId,error:e.result.error})))}break}case`internal-tool:start`:{this.closeOpenParts(t,n);let r=crypto.randomUUID(),i={id:r,type:`action`,kind:`internal-tool`,status:`running`,detail:{name:e.name}};t.parts.push(i),this.toolIdMap.set(e.id,{partId:r,turnId:t.id}),n.push({type:`part:start`,turnId:t.id,part:{...i,detail:{...i.detail}}}),n.push({type:`action:running`,turnId:t.id,partId:r});break}case`internal-tool:complete`:{let r=this.toolIdMap.get(e.id);if(r){let i=this.findActionPart(t,r.partId);i&&(i.status=`complete`,i.detail.result={type:`success`,content:e.output},n.push({type:`action:complete`,turnId:t.id,partId:r.partId,result:i.detail.result}))}break}case`turn:complete`:{this.closeOpenParts(t,n);let r=e.usage??{in:0,out:0};this.accumulatedUsage.in+=r.in,this.accumulatedUsage.out+=r.out;break}case`tool-results:start`:case`tool-results:complete`:break;case`error`:{let t=e.error,r=t.type===`model`?t.error.error.message:`Tool error (${t.error.name}): ${t.error.message}`;n.push({type:`error`,error:{type:t.type,message:r}});break}}return n}finalizeTurn(e=`complete`){let t=this.currentTurn;if(!t)return[];let n=[];return this.closeOpenParts(t,n),t.status=e,t.usage={...this.accumulatedUsage},n.push({type:`turn:end`,turnId:t.id,status:e,usage:t.usage}),this.currentTurn=null,n}closeOpenParts(e,t){this.currentTextPart&&=(t.push({type:`part:end`,turnId:e.id,partId:this.currentTextPart.id}),null),this.currentThinkingPart&&=(t.push({type:`part:end`,turnId:e.id,partId:this.currentThinkingPart.id}),null)}findActionPart(e,t){return e.parts.find(e=>e.id===t&&e.type===`action`)}};function B(e){return Array.isArray(e)?e:[e]}function V(e){return new Promise(t=>setTimeout(t,e))}function te(e){return e.then(()=>{},()=>{})}function ne(e,t,n){let r=new AbortController,i=n?AbortSignal.any([n,r.signal]):r.signal,a=e.then(()=>t(i));return{handle:{cancel:()=>r.abort(),get final(){return a}},settled:te(a)}}function re(e,t,n={}){let{placeholderStyle:r=`{{}}`,strict:i=!1}=n,a=r===`{{}}`?/\{\{(.*?)\}\}/g:/\{(.*?)\}/g,o=[];if(e=e.replace(a,(e,n)=>{if(n=n.trim(),Object.prototype.hasOwnProperty.call(t,n)){let e=t[n];return e==null?``:String(e)}return i&&o.push(n),e}),o.length>0){let e=[...new Set(o)];throw Error(`Missing variable${e.length>1?`s`:``}: ${e.join(`, `)}. Pass them as --args key=value or use --allow-missing-vars to suppress this error.`)}return e}function H(e){if(e instanceof u.ZodString)return[`string`,`Your answer`];if(e instanceof u.ZodNumber)return[`number`,42];if(e instanceof u.ZodBoolean)return[`boolean`,!0];if(e instanceof u.ZodArray){let t=e.element;if(t instanceof u.ZodString)return[`string array`,[`answer 1`,`answer 2`,`third answer`]];if(t instanceof u.ZodNumber)return[`number array`,[42,59,3.14]];if(t instanceof u.ZodBoolean)return[`boolean array`,[!0,!1,!1]];if(t instanceof u.ZodObject){let[,e]=H(t);return[`object array`,[e,e]]}return[`array`,[]]}if(e instanceof u.ZodObject){let t=e.shape,n={};for(let[e,r]of Object.entries(t)){let[,t]=H(r);n[e]=t}return[`JSON object`,n]}if(e instanceof u.ZodOptional){let[t,n]=H(e.unwrap());return[`${t} | undefined`,n]}throw Error(`Unsupported Zod schema: ${e.constructor.name}`)}function U(e,t){if(!t)return e;if(Object.keys(t).length===0){if(e.trim()===`{}`||e.trim()===``)return{};throw Error(`Schema is empty, but rawValue is not an empty object representation or empty string.`)}let n=ie(e),r={};for(let[e,i]of Object.entries(t)){let t=n.tags[e];if(t!==void 0)r[e]=W(i,t);else if(i.def.type!==`optional`)throw Error(`Expected results with tag ${e} but it does not exist`)}try{let e={};for(let[n,i]of Object.entries(t))n in r&&(e[n]=i.parse(r[n]));return e}catch(e){if(e&&typeof e==`object`&&`issues`in e){let t=e.issues.map(e=>`${e.path.join(`.`)}: ${e.message}`).join(`, `);throw Error(`Validation failed: ${t}`)}throw e}}function W(e,t){switch(t=t.trim(),e.def.type){case`string`:try{return JSON.parse(t)}catch{if(typeof t==`string`)return t;throw Error(`Cannot parse '${t}' as string. Ensure it is a valid JSON string or a plain string.`)}case`number`:{let e=parseFloat(t);if(isNaN(e))throw Error(`Cannot parse '${t}' as number`);return e}case`boolean`:{let e=t.toLowerCase();if(e===`true`)return!0;if(e===`false`)return!1;throw Error(`Cannot parse '${t}' as boolean. Expected 'true' or 'false'`)}case`array`:if(t===``)return[];try{let e=JSON.parse(t);if(Array.isArray(e))return e}catch{}if(t.includes(`,`))return t.split(`,`).map(e=>{let t=e.trim();try{return JSON.parse(t)}catch{return t}}).filter(e=>e!==``);case`object`:t.includes("```json")&&(t=t.replace(/```json/g,``).replace(/```/g,``));try{return JSON.parse(t)}catch(e){throw Error(`Cannot parse object as JSON: ${e.message}`)}case`optional`:{let n=e.def.innerType;return W(n,t)}default:return t}}function ie(e){e.trim().startsWith("```json")&&e.trim().endsWith("```")&&(e=e.trim().slice(7,-3).trim());let t=/<(\w+)>(.*?)<\/\1>/gs,n={},r=e;return r=r.replace(t,(e,t,r)=>(n[t]=r,``)),r=r.replace(/<(\w+)>(.*?)(?:<\/?\w+>|$)/gs,(e,t,r)=>(n[t]=r,``)),{tags:n,remaining:r.trim()}}function G(e,t={},n={}){let r={...t,...e.inputs},i=re(e.prompt,r,{strict:n.strictVariables});if(e.textReferences.length>0)for(let[t,n]of e.textReferences.entries()){let e=n.name?`: ${n.name}`:``;i+=`\n\n## Reference ${t+1}${e}\n\n\`\`\`${n.content}'''`}let a=`# Instructions
|
|
4
|
+
|
|
5
|
+
`;if((e.schema?Object.keys(e.schema):[]).length>0){a+=`## Output Format Instructions
|
|
6
|
+
`,a+=`
|
|
7
|
+
Here is how you should format your output. Follow the instructions strictly.
|
|
8
|
+
`;for(let[t,n]of Object.entries(e.schema)){let[e,r]=H(n);a+=`\n- Use <${t}></${t}> tags to indicate the answer for ${t}. The answer must be a ${e}.\n Example: <${t}>${JSON.stringify(r)}</${t}>\n`}}if(e.instructions.length>0){a+=`
|
|
9
|
+
## Additional Instructions
|
|
10
|
+
|
|
11
|
+
`;for(let t of e.instructions)a+=`- ${t}\n`}return a+i}var K=class{_turns=[];_log=[];constructor(e){e?.turns&&(this._turns=e.turns),e?.log&&(this._log=e.log)}get turns(){return[...this._turns]}get log(){return[...this._log]}addTurn(e){this._turns.push(e)}appendToLog(e){Array.isArray(e)?this._log.push(...e):this._log.push(e)}latestTurn(){return this._turns[this._turns.length-1]}toString(){return JSON.stringify({turns:this._turns})}};function ae(e){return e.type===`server`}var oe=class{provider;model;history;tracer;name;scope;store;system;tools={};serverTools=[];mcps=[];mcpToolsResolved=!1;memory;options;eventCallbacks=[];sendQueue=Promise.resolve();constructor(e){if(this.provider=e.provider,this.model=e.model,this.history=new K,this.tracer=e.tracer,this.system=e.system,this.name=e.name,this.scope=e.scope,this.store=new R(`.axle`),this.options=e.options??{},e.tools&&this.addTools(e.tools),e.mcps&&(this.mcps=[...e.mcps]),e.memory){if(!e.name)throw new E(`Agent requires a 'name' when memory is provided. The name is used to partition memory storage.`);this.memory=e.memory;let t=e.memory.tools?.();t&&this.addTools(t)}}addTool(e){ae(e)?this.serverTools.push(e):this.tools[e.name]=e}addTools(e){for(let t of e)this.addTool(t)}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,t){let n,r;if(typeof e==`string`)r={role:`user`,id:crypto.randomUUID(),content:[{type:`text`,text:e}]};else{let i=G(e,t?.variables,{strictVariables:this.options.strictVariables}),a=e.files;r={role:`user`,id:crypto.randomUUID(),content:O({text:i,files:a})},n=e.schema}let{handle:i,settled:a}=ne(this.sendQueue,e=>this.run(r,n,e),t?.signal);return this.sendQueue=a,i}async resolveMcpTools(){if(!this.mcpToolsResolved){this.tracer?.debug(`resolving MCP tools`,{count:this.mcps.length});for(let e of this.mcps){let t=await e.listTools({prefix:e.name,tracer:this.tracer});this.addTools(t)}this.mcpToolsResolved=!0}}emitEvent(e){for(let t of this.eventCallbacks)t(e)}async run(e,t,n){let r=new z;await this.resolveMcpTools();let i=this.system,a=[...this.history.log,e];if(this.memory){let e=await this.memory.recall({name:this.name,scope:this.scope,system:this.system,messages:a,store:this.store,tracer:this.tracer});e.systemSuffix&&(i=(i??``)+`
|
|
12
|
+
|
|
13
|
+
`+e.systemSuffix)}if(n.aborted)return{response:null,turn:void 0,usage:{in:0,out:0}};let{turn:o,events:s}=r.createUserTurn(e);this.history.addTurn(o),this.history.appendToLog(e);for(let e of s)this.emitEvent(e);let c=this.tools,l=Object.values(c).map(e=>({name:e.name,description:e.description,schema:e.schema})),{turn:u,events:d}=r.startAgentTurn();this.history.addTurn(u);for(let e of d)this.emitEvent(e);let f=I({provider:this.provider,model:this.model,messages:a,system:i,tools:l.length>0?l:void 0,serverTools:this.serverTools.length>0?this.serverTools:void 0,tracer:this.tracer,onToolCall:async(e,t)=>{let n=c[e];if(!n)return null;try{return{type:`success`,content:await n.execute(t)}}catch(e){return{type:`error`,error:{type:`execution`,message:e instanceof Error?e.message:String(e)}}}},signal:n});f.on(e=>{let t=r.handleStreamEvent(e);for(let e of t)this.emitEvent(e)});let p=await f.final,m=p.result===`cancelled`?`cancelled`:p.result===`error`?`error`:`complete`;p.messages.length>0&&this.history.appendToLog(p.messages);let h=r.finalizeTurn(m);for(let e of h)this.emitEvent(e);if(p.result===`error`)throw new E(se(p.error),{code:p.error.type===`model`?`MODEL_ERROR`:`TOOL_ERROR`,details:{error:p.error}});let g=null;if(p.result===`success`&&(p.final&&(g=U(k(p.final.content),t)),this.memory))try{await this.memory.record({name:this.name,scope:this.scope,system:this.system,messages:this.history.log,newMessages:p.messages,store:this.store,tracer:this.tracer})}catch(e){this.tracer?.warn(`memory record failed`,{error:e instanceof Error?e.message:String(e)})}let _=p.usage??{in:0,out:0};return{response:g,turn:u,usage:_}}};function se(e){return e.type===`model`?`Model error: ${e.error.error.message}`:`Tool error (${e.error.name}): ${e.error.message}`}async function ce(e,t){let{defaults:n,tag:i}=t,a=null,o=``;if(e)try{o=l(e),a=await r(o,{encoding:`utf-8`})}catch{throw Error(`${i} not found, see --help for details`)}else{for(let e of n.formats)try{o=l(n.name+`.`+e),a=await r(o,{encoding:`utf-8`});break}catch{continue}if(a===null)throw Error(`${i} not found, see --help for details`)}return{content:a,format:o.split(`.`).pop()??``,path:o}}const q=20*1024*1024;function le(e){return e.type===`text`}function ue(e){return e.type===`image`||e.type===`document`}const de=new Set([`application/json`,`application/xml`,`application/yaml`,`application/x-yaml`,`application/toml`]);function fe(e){return e.startsWith(`text/`)||de.has(e)}function pe(e){let t=p.getType(e);if(!t){let t=c(e).toLowerCase();throw Error(`Unsupported file type: ${t||`(no extension)`}`)}if(t.startsWith(`image/`))return{type:`image`,mimeType:t};if(t===`application/pdf`)return{type:`document`,mimeType:t};if(fe(t))return{type:`text`,mimeType:t};{let n=c(e).toLowerCase();throw Error(`Unsupported file type: ${n} (${t})`)}}async function me(e,n){let a=l(e);try{await t(a)}catch{throw Error(`File not found: ${e}`)}let o=await i(a);if(o.size>q)throw Error(`File too large: ${o.size} bytes. Maximum allowed: ${q} bytes`);let s=a.split(`/`).pop()||``,c=pe(a);if((n||(c.type===`text`?`utf-8`:`base64`))===`utf-8`){if(c.type!==`text`)throw Error(`Cannot read ${c.type} file as text: ${e}`);return{path:a,content:await r(a,`utf-8`),mimeType:c.mimeType,size:o.size,name:s,type:`text`}}else{if(c.type===`text`)throw Error(`Cannot read text file as binary: ${e}`);return{path:a,base64:(await r(a)).toString(`base64`),mimeType:c.mimeType,size:o.size,name:s,type:c.type}}}var he=class{prompt;inputs={};files=[];textReferences=[];instructions=[];schema;constructor(e,t){this.prompt=e,this.schema=t}setInputs(e){this.inputs=e}addInput(e,t){this.inputs[e]=t}addFile(e,t){if(typeof e==`string`){this.textReferences.push({content:e,name:t?.name});return}ue(e)?this.files.push(e):le(e)&&this.textReferences.push({content:e.content,name:t?.name??e.name})}addInstructions(e){if(typeof e!=`string`||e.trim()===``)throw Error(`Instruction must be a non-empty string`);this.instructions.push(e)}hasFiles(){return this.files.length>0}};const J={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_SONNET_4_5_20250929:`claude-sonnet-4-5-20250929`,CLAUDE_SONNET_4_5:`claude-sonnet-4-5-20250929`,CLAUDE_HAIKU_4_5_20251001:`claude-haiku-4-5-20251001`,CLAUDE_HAIKU_4_5:`claude-haiku-4-5-20251001`,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`};J.CLAUDE_SONNET_4_6,J.CLAUDE_OPUS_4_6,J.CLAUDE_OPUS_4_5_20251101,J.CLAUDE_SONNET_4_5_20250929,J.CLAUDE_HAIKU_4_5_20251001,J.CLAUDE_OPUS_4_1_20250805,J.CLAUDE_OPUS_4_20250514,J.CLAUDE_SONNET_4_20250514,J.CLAUDE_3_HAIKU_20240307;const ge=J.CLAUDE_HAIKU_4_5;function Y(e){if(e==null)return{type:`error`,error:{type:`Undetermined`,message:`Unknown error occurred`},usage:{in:0,out:0},raw:e};if(e instanceof Error)return{type:`error`,error:{type:e.name||`Error`,message:e.message||`Unexpected error`},usage:{in:0,out:0},raw:e};if(typeof e==`object`){let t=e,n=t?.error?.error?.type||t?.error?.type||t?.type||t?.code||t?.status||`Undetermined`,r=t?.error?.error?.message||t?.error?.message||t?.message||t?.error||`Unexpected error`;return{type:`error`,error:{type:String(n),message:String(r)},usage:{in:0,out:0},raw:e}}return{type:`error`,error:{type:`Undetermined`,message:String(e)},usage:{in:0,out:0},raw:e}}function X(e){return e.map(e=>{if(e.role===`assistant`){let t=[];for(let n of e.content)n.type===`text`?t.push({type:`text`,text:n.text}):n.type===`thinking`?n.redacted?t.push({type:`redacted_thinking`,data:n.text}):n.signature&&t.push({type:`thinking`,thinking:n.text,signature:n.signature}):n.type===`tool-call`?t.push({type:`tool_use`,id:n.id,name:n.name,input:n.parameters}):n.type===`internal-tool`&&(t.push({type:`server_tool_use`,id:n.id,name:n.name,input:n.input??{}}),n.output!=null&&t.push({type:`web_search_tool_result`,tool_use_id:n.id,content:n.output}));return{role:`assistant`,content:t}}if(e.role===`tool`)return{role:`user`,content:e.content.map(e=>({type:`tool_result`,tool_use_id:e.id,content:typeof e.content==`string`?e.content:xe(e.content),...e.isError?{is_error:!0}:{}}))};if(typeof e.content==`string`)return{role:`user`,content:e.content};{let t=[];for(let n of e.content)n.type===`text`?t.push({type:`text`,text:n.text}):n.type===`file`&&(n.file.type===`image`?n.file.base64&&t.push({type:`image`,source:{type:`base64`,media_type:n.file.mimeType,data:n.file.base64}}):n.file.type===`document`&&n.file.mimeType===`application/pdf`&&n.file.base64&&t.push({type:`document`,source:{type:`base64`,media_type:`application/pdf`,data:n.file.base64}}));return{role:`user`,content:t}}})}function _e(e){return e.map(e=>{let t=d.toJSONSchema(e.schema);if(!be(t))throw Error(`Schema for tool ${e.name} must be an object type`);return{name:e.name,description:e.description,input_schema:t}})}function ve(e){let t=[];for(let n of e)if(n.type===`text`)t.push({type:`text`,text:n.text});else if(n.type===`thinking`)t.push({type:`thinking`,text:n.text||``,redacted:!1});else if(n.type===`redacted_thinking`)t.push({type:`thinking`,text:n.text||``,redacted:!0});else if(n.type===`tool_use`){if(typeof n.input!=`object`||n.input===null||Array.isArray(n.input))throw Error(`Invalid tool call input for ${n.name}: expected object, got ${typeof n.input}`);t.push({type:`tool-call`,id:n.id,name:n.name,parameters:n.input})}return t}function ye(e){switch(e){case`max_tokens`:return P.Length;case`end_turn`:return P.Stop;case`stop_sequence`:return P.Stop;case`tool_use`:return P.FunctionCall;default:return P.Error}}function be(e){return e&&typeof e==`object`&&e.type===`object`}function xe(e){return e.map(e=>e.type===`text`?{type:`text`,text:e.text}:{type:`image`,source:{type:`base64`,media_type:e.mimeType,data:e.data}})}async function Se(e){let{client:t,model:n,messages:r,system:i,tools:a,context:o,options:s}=e,c=o?.tracer,{stop:l,max_tokens:u,...d}=s??{},f={model:n,max_tokens:u??16e3,messages:X(r),...i&&{system:i},...l&&{stop_sequences:B(l)},...a&&{tools:_e(a)},...d};c?.debug(`Anthropic request`,{request:f});let p;try{p=Ce(await t.messages.create(f))}catch(e){p=Y(e)}return c?.debug(`Anthropic response`,{result:p}),p}function Ce(e){let t=ye(e.stop_reason);if(t===P.Error)return{type:`error`,error:{type:`Uncaught error`,message:`Stop reason is not recognized or unhandled: ${e.stop_reason}`},usage:{in:e.usage.input_tokens,out:e.usage.output_tokens},raw:e};if(t===P.FunctionCall){let t=ve(e.content);return{type:`success`,id:e.id,model:e.model,role:e.role,finishReason:P.FunctionCall,content:t,text:k(t),usage:{in:e.usage.input_tokens,out:e.usage.output_tokens},raw:e}}if(e.type==`message`){let n=ve(e.content);return{type:`success`,id:e.id,model:e.model,role:`assistant`,finishReason:t,content:n,text:k(n),usage:{in:e.usage.input_tokens,out:e.usage.output_tokens},raw:e}}return{type:`error`,error:{type:`InvalidResponse`,message:`Unsupported completion type: ${e.type}`},usage:{in:e.usage.input_tokens,out:e.usage.output_tokens},raw:e}}function we(){let e=new Map,t=new Map,n=new Map;function r(r){let i=[];switch(r.type){case`message_start`:i.push({type:`start`,id:r.message.id,data:{model:r.message.model,timestamp:Date.now()}});break;case`message_delta`:r.delta.stop_reason&&i.push({type:`complete`,data:{finishReason:ye(r.delta.stop_reason),usage:{in:r.usage?.input_tokens||0,out:r.usage?.output_tokens||0}}});case`message_stop`:break;case`content_block_start`:if(r.content_block.type===`text`)e.set(r.index,`text`),i.push({type:`text-start`,data:{index:r.index}});else if(r.content_block.type===`tool_use`){e.set(r.index,`tool`);let t=r.content_block;n.set(r.index,{id:t.id,name:t.name,argumentsBuffer:``}),i.push({type:`tool-call-start`,data:{index:r.index,id:t.id,name:t.name}})}else if(r.content_block.type===`thinking`)e.set(r.index,`thinking`),i.push({type:`thinking-start`,data:{index:r.index,redacted:!1}});else if(r.content_block.type===`redacted_thinking`)e.set(r.index,`thinking`),i.push({type:`thinking-start`,data:{index:r.index,redacted:!0}});else if(r.content_block.type===`server_tool_use`){e.set(r.index,`internal-tool`);let n=r.content_block;t.set(n.id,{index:r.index,name:n.name}),i.push({type:`internal-tool-start`,data:{index:r.index,id:n.id,name:n.name}})}else if(r.content_block.type===`web_search_tool_result`){let e=r.content_block,n=t.get(e.tool_use_id);n&&(i.push({type:`internal-tool-complete`,data:{index:n.index,id:e.tool_use_id,name:n.name,output:e.content}}),t.delete(e.tool_use_id))}break;case`content_block_delta`:if(r.delta.type===`text_delta`)i.push({type:`text-delta`,data:{text:r.delta.text,index:r.index}});else if(r.delta.type===`input_json_delta`){let e=n.get(r.index);e&&(e.argumentsBuffer+=r.delta.partial_json)}else r.delta.type===`thinking_delta`?i.push({type:`thinking-delta`,data:{text:r.delta.thinking,index:r.index}}):r.delta.type===`signature_delta`||r.delta.type;break;case`content_block_stop`:{let t=e.get(r.index);if(t===`text`)i.push({type:`text-complete`,data:{index:r.index}});else if(t===`thinking`)i.push({type:`thinking-complete`,data:{index:r.index}});else if(t!==`internal-tool`&&t===`tool`){let e=n.get(r.index);if(e){try{let t=e.argumentsBuffer?JSON.parse(e.argumentsBuffer):{};i.push({type:`tool-call-complete`,data:{index:r.index,id:e.id,name:e.name,arguments:t}})}catch(t){throw Error(`Failed to parse tool call arguments for ${e.name}: ${t instanceof Error?t.message:String(t)}\nRaw buffer: ${e.argumentsBuffer}`)}n.delete(r.index)}}e.delete(r.index);break}}return i}return{handleEvent:r}}async function*Te(e){let{client:t,model:n,messages:r,system:i,tools:a,runtime:o,signal:s,options:c}=e,l=o?.tracer,{stop:u,max_tokens:d,serverTools:f,...p}=c??{},m=a?_e(a):[];if(f){let e={web_search:`web_search_20250305`};for(let t of f){let n=e[t.name]??t.name;m.push({type:n,name:t.name,...t.config})}}let h={model:n,max_tokens:d??De(n),messages:X(r),...i&&{system:i},...u&&{stop_sequences:B(u)},...m.length>0&&{tools:m},...p};l?.debug(`Anthropic streaming request`,{request:h});let g=we();try{let e=await t.messages.create({...h,stream:!0},{signal:s});for await(let t of e){let e=g.handleEvent(t);for(let t of e)yield t}}catch(e){if(s?.aborted)return;yield{type:`error`,data:{type:`STREAMING_ERROR`,message:e instanceof Error?e.message:String(e),raw:e}}}}const Ee={[J.CLAUDE_OPUS_4_6]:128e3,[J.CLAUDE_OPUS_4_5_20251101]:64e3,[J.CLAUDE_HAIKU_4_5_20251001]:64e3,[J.CLAUDE_SONNET_4_5_20250929]:64e3,[J.CLAUDE_SONNET_4_20250514]:64e3,[J.CLAUDE_OPUS_4_1_20250805]:32e3,[J.CLAUDE_OPUS_4_20250514]:32e3,[J.CLAUDE_3_HAIKU_20240307]:4096};function De(e){return e in Ee?Ee[e]:e.includes(`opus`)?e.match(/opus-4-[6-9]|opus-[5-9]/)?128e3:64e3:e.includes(`sonnet`)||e.includes(`haiku`)?e.match(/claude-3-[0-5]-/)?8192:64e3:16384}function Oe(e){let t=new m({apiKey:e});return{name:`anthropic`,async createGenerationRequest(e,n){return await Se({client:t,model:e,...n})},createStreamingRequest(e,n){let{messages:r,system:i,tools:a,context:o,signal:s,options:c}=n;return Te({client:t,model:e,messages:r,system:i,tools:a,runtime:o,signal:s,options:c})}}}function ke(e,t){let n=e.map(je).flat(1);return t?[{role:`system`,content:t},...n]:n}function Ae(e){if(e&&e.length>0)return e.map(e=>({type:`function`,function:{name:e.name,description:e.description,parameters:d.toJSONSchema(e.schema)}}))}function Z(e){switch(e){case`stop`:return P.Stop;case`length`:return P.Length;case`tool_calls`:case`function_call`:return P.FunctionCall;case`content_filter`:return P.Error;default:return P.Stop}}function je(e){switch(e.role){case`tool`:return Me(e);case`assistant`:return Ne(e);default:return Pe(e)}}function Me(e){return e.content.map(e=>({role:`tool`,content:typeof e.content==`string`?e.content:e.content.filter(e=>e.type===`text`).map(e=>e.text).join(`
|
|
14
|
+
`),tool_call_id:e.id}))}function Ne(e){let t=e.content.filter(e=>e.type===`tool-call`),n=e.content.filter(e=>e.type===`text`),r=t.length>0?t.map(e=>({type:`function`,id:e.id,function:{name:e.name,arguments:JSON.stringify(e.parameters)}})):void 0;return{role:`assistant`,content:n.map(e=>e.text).join(``),...r&&{tool_calls:r}}}function Pe(e){if(typeof e.content==`string`)return{role:`user`,content:e.content};let t=e.content.map(Fe).filter(e=>e!==null);return t.every(e=>e.type===`text`)?{role:`user`,content:t.map(e=>e.text).join(``)}:{role:`user`,content:t}}function Fe(e){return e.type===`text`?{type:`text`,text:e.text}:e.type===`file`&&e.file.type===`image`?{type:`image_url`,image_url:{url:`data:${e.file.mimeType};base64,${e.file.base64}`}}:null}async function Ie(e){let{baseUrl:t,model:n,messages:r,system:i,tools:a,context:o,apiKey:s,options:c}=e,l=o?.tracer,u=ke(r,i),d=Ae(a),f={model:n,messages:u,...d&&{tools:d}};c&&(c.temperature!==void 0&&(f.temperature=c.temperature),c.top_p!==void 0&&(f.top_p=c.top_p),c.max_tokens!==void 0&&(f.max_tokens=c.max_tokens),c.frequency_penalty!==void 0&&(f.frequency_penalty=c.frequency_penalty),c.presence_penalty!==void 0&&(f.presence_penalty=c.presence_penalty),c.stop!==void 0&&(f.stop=c.stop)),l?.debug(`ChatCompletions request`,{request:f});let p;try{let e={"Content-Type":`application/json`};s&&(e.Authorization=`Bearer ${s}`);let n=await fetch(`${t}/chat/completions`,{method:`POST`,headers:e,body:JSON.stringify(f)});if(!n.ok){let e=await n.text().catch(()=>``);throw Error(`HTTP error! status: ${n.status}${e?` - ${e}`:``}`)}p=Le(await n.json())}catch(e){l?.error(`Error fetching ChatCompletions response`,{error:e instanceof Error?e.message:String(e)}),p=Y(e)}return l?.debug(`ChatCompletions response`,{result:p}),p}function Le(e){let t=e.choices?.[0];if(!t)return{type:`error`,error:{type:`ChatCompletionsError`,message:`No choices in response`},usage:{in:0,out:0},raw:e};let n=[];if(t.message.reasoning_content&&n.push({type:`thinking`,text:t.message.reasoning_content}),t.message.content&&n.push({type:`text`,text:t.message.content}),t.message.tool_calls)for(let e of t.message.tool_calls){let t;try{t=JSON.parse(e.function.arguments)}catch(t){throw Error(`Invalid tool call arguments for ${e.function.name}: ${t instanceof Error?t.message:String(t)}`)}if(typeof t!=`object`||!t||Array.isArray(t))throw Error(`Invalid tool call arguments for ${e.function.name}: expected object, got ${typeof t}`);n.push({type:`tool-call`,id:e.id,name:e.function.name,parameters:t})}let r=n.some(e=>e.type===`tool-call`)?Z(`tool_calls`):Z(t.finish_reason);return{type:`success`,id:e.id,model:e.model,role:`assistant`,finishReason:r,content:n,text:k(n),usage:{in:e.usage?.prompt_tokens||0,out:e.usage?.completion_tokens||0},raw:e}}function Re(){let e=new Map,t=0,n=-1,r=``,i=``,a=null,o,s;function c(e){n<0||(a===`text`?e.push({type:`text-complete`,data:{index:n}}):a===`thinking`&&e.push({type:`thinking-complete`,data:{index:n}}),a=null,n=-1)}function l(l){let u=[];l.usage&&(s={in:l.usage.prompt_tokens,out:l.usage.completion_tokens});let d=l.choices?.[0];if(!d)return u;r||(r=l.id,i=l.model,u.push({type:`start`,id:r,data:{model:i,timestamp:Date.now()}}));let f=d.delta;if(f.reasoning_content&&(a!==`thinking`&&(c(u),n=t++,a=`thinking`,u.push({type:`thinking-start`,data:{index:n}})),u.push({type:`thinking-delta`,data:{index:n,text:f.reasoning_content}})),f.content&&(a!==`text`&&(c(u),n=t++,a=`text`,u.push({type:`text-start`,data:{index:n}})),u.push({type:`text-delta`,data:{text:f.content,index:n}})),f.tool_calls){c(u);for(let n of f.tool_calls){let r=n.index;if(!e.has(r)){let i=t++,a=n.id||`tool-${i}`;e.set(r,{id:a,name:n.function?.name||``,argumentsBuffer:``,partIdx:i}),u.push({type:`tool-call-start`,data:{index:i,id:a,name:n.function?.name||``}})}let i=e.get(r);n.id&&(i.id=n.id),n.function?.name&&(i.name=n.function.name),n.function?.arguments&&(i.argumentsBuffer+=n.function.arguments)}}if(d.finish_reason){c(u);for(let[,t]of e)try{let e=t.argumentsBuffer?JSON.parse(t.argumentsBuffer):{};u.push({type:`tool-call-complete`,data:{index:t.partIdx,id:t.id,name:t.name,arguments:e}})}catch(e){throw Error(`Failed to parse tool call arguments for ${t.name}: ${e instanceof Error?e.message:String(e)}\nRaw buffer: ${t.argumentsBuffer}`)}o=Z(d.finish_reason)}return u}function u(){return o===void 0?[]:[{type:`complete`,data:{finishReason:o,usage:s??{in:0,out:0}}}]}return{handleChunk:l,finalize:u}}async function*ze(e){let{baseUrl:t,model:n,messages:r,system:i,tools:a,context:o,signal:s,apiKey:c,options:l}=e,u=o?.tracer;l?.serverTools&&u?.warn(`serverTools not supported by ChatCompletions provider`);let d=ke(r,i),f=Ae(a),p={model:n,messages:d,stream:!0,stream_options:{include_usage:!0},...f&&{tools:f}};l&&(l.temperature!==void 0&&(p.temperature=l.temperature),l.top_p!==void 0&&(p.top_p=l.top_p),l.max_tokens!==void 0&&(p.max_tokens=l.max_tokens),l.frequency_penalty!==void 0&&(p.frequency_penalty=l.frequency_penalty),l.presence_penalty!==void 0&&(p.presence_penalty=l.presence_penalty),l.stop!==void 0&&(p.stop=l.stop)),u?.debug(`ChatCompletions streaming request`,{request:p});let m=Re();try{let e={"Content-Type":`application/json`};c&&(e.Authorization=`Bearer ${c}`);let n=await fetch(`${t}/chat/completions`,{method:`POST`,headers:e,body:JSON.stringify(p),signal:s});if(!n.ok){let e=await n.text().catch(()=>``);throw Error(`HTTP error! status: ${n.status}${e?` - ${e}`:``}`)}if(!n.body)throw Error(`Response body is null`);let r=n.body.getReader(),i=new TextDecoder,a=``;for(;;){let{done:e,value:t}=await r.read();if(e)break;a+=i.decode(t,{stream:!0});let n=a.split(`
|
|
15
|
+
`);a=n.pop()||``;for(let e of n){let t=e.trim();if(!t||t.startsWith(`:`)||!t.startsWith(`data: `))continue;let n=t.slice(6);if(n!==`[DONE]`)try{let e=JSON.parse(n),t=m.handleChunk(e);for(let e of t)yield e}catch(e){u?.error(`Error parsing ChatCompletions stream chunk`,{error:e instanceof Error?e.message:String(e),line:t})}}}for(let e of m.finalize())yield e}catch(e){if(s?.aborted)return;u?.error(`Error in ChatCompletions streaming request`,{error:e instanceof Error?e.message:String(e)}),yield{type:`error`,data:{type:`STREAMING_ERROR`,message:e instanceof Error?e.message:String(e),raw:e}}}}function Be(e,t){return{name:`ChatCompletions`,async createGenerationRequest(n,r){return await Ie({baseUrl:e,model:n,apiKey:t,...r})},createStreamingRequest(n,r){return ze({baseUrl:e,model:n,apiKey:t,...r})}}}const Q={GEMINI_3_1_PRO_PREVIEW:`gemini-3.1-pro-preview`,GEMINI_3_1_PRO_PREVIEW_CUSTOMTOOLS:`gemini-3.1-pro-preview-customtools`,GEMINI_3_1_FLASH_LITE_PREVIEW:`gemini-3.1-flash-lite-preview`,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_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_4_31B_IT:`gemma-4-31b-it`,GEMMA_4_E4B_IT:`gemma-4-26b-a4b-it`,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`};Q.GEMINI_3_1_PRO_PREVIEW,Q.GEMINI_3_1_PRO_PREVIEW_CUSTOMTOOLS,Q.GEMINI_3_1_FLASH_LITE_PREVIEW,Q.GEMINI_3_PRO_PREVIEW,Q.GEMINI_3_FLASH_PREVIEW,Q.GEMINI_2_5_PRO,Q.GEMINI_2_5_FLASH,Q.GEMINI_2_5_FLASH_LITE,Q.GEMINI_2_0_FLASH,Q.GEMINI_2_0_FLASH_001,Q.GEMINI_2_0_FLASH_LITE,Q.GEMINI_2_0_FLASH_LITE_001,Q.GEMINI_FLASH_LATEST,Q.GEMINI_FLASH_LITE_LATEST,Q.GEMINI_PRO_LATEST,Q.GEMMA_4_31B_IT,Q.GEMMA_4_E4B_IT,Q.GEMMA_3_27B_IT,Q.GEMMA_3_12B_IT,Q.GEMMA_3_4B_IT,Q.GEMMA_3_1B_IT,Q.GEMMA_3N_E4B_IT,Q.GEMMA_3N_E2B_IT;const Ve=Q.GEMINI_3_1_FLASH_LITE_PREVIEW;function He(e,t,n){let r={};return t&&(r.systemInstruction=t),e&&e.length>0&&(r.tools=e.map(e=>({functionDeclarations:[{name:e.name,description:e.description,parametersJsonSchema:d.toJSONSchema(e.schema)}]}))),n&&Object.assign(r,n),r}function Ue(e){return e.map(We).filter(e=>e!==void 0)}function We(e){switch(e.role){case`tool`:return Ge(e);case`assistant`:return Ke(e);case`user`:return qe(e)}}function Ge(e){return{role:`user`,parts:e.content.flatMap(e=>{let t={functionResponse:{id:e.id??void 0,name:e.name,response:{output:typeof e.content==`string`?e.content:e.content.filter(e=>e.type===`text`).map(e=>e.text).join(`
|
|
16
|
+
`)}}};return typeof e.content==`string`?[t]:[t,...e.content.filter(e=>e.type===`image`).map(e=>({inlineData:{mimeType:e.mimeType,data:e.data}}))]})}}function Ke(e){let t=[],n=e.content.filter(e=>e.type===`text`);if(n.length>0){let e=n.map(e=>e.text).join(``);e&&t.push({text:e})}let r=e.content.filter(e=>e.type===`tool-call`);return r.length>0&&t.push(...r.map(e=>{let t={functionCall:{id:e.id??void 0,name:e.name,args:e.parameters}};return e.providerMetadata?.thoughtSignature&&(t.thoughtSignature=e.providerMetadata.thoughtSignature),t})),{role:`model`,parts:t}}function qe(e){return typeof e.content==`string`?{role:`user`,parts:[{text:e.content}]}:{role:`user`,parts:e.content.map(Je).filter(e=>e!==null)}}function Je(e){return e.type===`text`?{text:e.text}:e.type===`file`&&(e.file.type===`image`||e.file.type===`document`)?{inlineData:{mimeType:e.file.mimeType,data:e.file.base64}}:null}function Ye(e){switch(e){case h.STOP:return[!0,P.Stop];case h.MAX_TOKENS:return[!0,P.Length];case h.FINISH_REASON_UNSPECIFIED:case h.SAFETY:case h.RECITATION:case h.LANGUAGE:case h.OTHER:case h.BLOCKLIST:case h.PROHIBITED_CONTENT:case h.SPII:case h.MALFORMED_FUNCTION_CALL:case h.IMAGE_SAFETY:return[!1,P.Error]}return[!1,P.Error]}async function Xe(e){let{client:t,model:n,messages:r,system:i,tools:a,context:o,options:s}=e,c=o?.tracer,l=s?{...s}:{};l.max_tokens&&(l.maxOutputTokens=l.max_tokens,delete l.max_tokens),l.stop&&(l.stopSequences=Array.isArray(l.stop)?l.stop:[l.stop],delete l.stop),l.top_p!==void 0&&(l.topP=l.top_p,delete l.top_p);let u={contents:Ue(r),config:He(a,i,l)};c?.debug(`Gemini request`,{request:u});let d;try{d=Ze(await t.models.generateContent({model:n,...u}),{tracer:c})}catch(e){c?.error(e instanceof Error?e.message:String(e)),d=Y(e)}return c?.debug(`Gemini response`,{result:d}),d}function Ze(e,t){let{tracer:n}=t,r=e.usageMetadata?.promptTokenCount??0,i={in:r,out:(e.usageMetadata?.totalTokenCount??r)-r};if(!e)return{type:`error`,error:{type:`InvalidResponse`,message:`Invalid or empty response from Google AI`},usage:{in:0,out:0},raw:e};if(e.promptFeedback&&e.promptFeedback.blockReason)return{type:`error`,error:{type:`Blocked`,message:`Response blocked by Google AI: ${e.promptFeedback.blockReason}, ${e.promptFeedback.blockReasonMessage}`},usage:i,raw:e};if(!e.candidates||e.candidates.length===0)return{type:`error`,error:{type:`InvalidResponse`,message:`Invalid or empty response from Google AI`},usage:{in:0,out:0},raw:e};e.candidates.length>1&&n?.warn(`We received ${e.candidates.length} response candidates`);let a=e.candidates[0],o=(a.content?.parts||[]).map(e=>e.text).filter(e=>e!==void 0).join(``),[s,c]=Ye(a.finishReason);if(s){let t=[];if(o&&t.push({type:`text`,text:o}),e.functionCalls)for(let n of e.functionCalls)if(n.args==null)t.push({type:`tool-call`,id:n.id??``,name:n.name??``,parameters:{}});else if(typeof n.args!=`object`||Array.isArray(n.args))throw Error(`Invalid tool call arguments for ${n.name}: expected object, got ${typeof n.args}`);else t.push({type:`tool-call`,id:n.id??``,name:n.name??``,parameters:n.args});return{type:`success`,id:e.responseId??``,model:e.modelVersion??``,role:`assistant`,finishReason:e.functionCalls?P.FunctionCall:c,content:t,text:k(t),usage:i,raw:e}}else return{type:`error`,error:{type:`Undetermined`,message:`Unexpected stop reason: ${c}`},usage:i,raw:e}}function Qe(){let e=0,t=-1,n=!1,r=``,i=``,a=0,o=0,s=null;function c(e){t<0||(s===`text`?e.push({type:`text-complete`,data:{index:t}}):s===`thinking`&&e.push({type:`thinking-complete`,data:{index:t}}),s=null,t=-1)}function l(l){let u=[];r||(r=l.responseId||`gemini-${Date.now()}`,i=l.modelVersion||`gemini`,u.push({type:`start`,id:r,data:{model:i,timestamp:Date.now()}})),l.usageMetadata&&(a=l.usageMetadata.promptTokenCount||0,o=(l.usageMetadata.totalTokenCount||0)-a);let d=l.candidates?.[0];if(!d)return u;let f=d.content?.parts||[];for(let r of f){let i=`thought`in r&&r.thought===!0;if(i&&r.text?(s!==`thinking`&&(c(u),t=e++,s=`thinking`,u.push({type:`thinking-start`,data:{index:t}})),u.push({type:`thinking-delta`,data:{index:t,text:r.text}})):r.text&&!i?(s!==`text`&&(c(u),t=e++,s=`text`,u.push({type:`text-start`,data:{index:t}})),u.push({type:`text-delta`,data:{text:r.text,index:t}})):r.functionCall||console.log(`[gemini] unhandled part type: ${JSON.stringify(Object.keys(r))}`),r.functionCall){c(u),n=!0;let t=e++,i=r.functionCall.id||`tool-${t}`,a=r.functionCall.name??``;u.push({type:`tool-call-start`,data:{index:t,id:i,name:a}});let o={index:t,id:i,name:a,arguments:r.functionCall.args??{}},s=r;s.thoughtSignature&&(o.providerMetadata={thoughtSignature:s.thoughtSignature}),u.push({type:`tool-call-complete`,data:o})}}if(d.finishReason&&d.finishReason!==h.FINISH_REASON_UNSPECIFIED){c(u);let[e,t]=Ye(d.finishReason),r=n?P.FunctionCall:t;!e&&!n?u.push({type:`error`,data:{type:`FinishReasonError`,message:`Unexpected finish reason: ${d.finishReason}`,usage:{in:a,out:o},raw:l}}):u.push({type:`complete`,data:{finishReason:r,usage:{in:a,out:o}}})}return u}return{handleChunk:l}}async function*$e(e){let{client:t,model:n,messages:r,system:i,tools:a,runtime:o,signal:s,options:c}=e,l=o?.tracer,{serverTools:u,...d}=c??{},f=d?{...d}:{};f.max_tokens&&(f.maxOutputTokens=f.max_tokens,delete f.max_tokens),f.stop&&(f.stopSequences=Array.isArray(f.stop)?f.stop:[f.stop],delete f.stop),f.top_p!==void 0&&(f.topP=f.top_p,delete f.top_p);let p=He(a,i,f);if(u){let e={web_search:`googleSearch`,code_execution:`codeExecution`};p.tools||=[];for(let t of u){let n=e[t.name]??t.name;p.tools.push({[n]:t.config??{}})}}let m={contents:Ue(r),config:p};l?.debug(`Gemini streaming request`,{request:m});let h=Qe();try{let e=await t.models.generateContentStream({model:n,...m});for await(let t of e){let e=h.handleChunk(t);for(let t of e)yield t}}catch(e){if(s?.aborted)return;l?.error(e instanceof Error?e.message:String(e)),yield{type:`error`,data:{type:`STREAMING_ERROR`,message:e instanceof Error?e.message:String(e),raw:e}}}}function et(e){let t=new g({apiKey:e});return{name:`Gemini`,async createGenerationRequest(e,n){return await Xe({client:t,model:e,...n})},createStreamingRequest(e,n){let{messages:r,system:i,tools:a,context:o,signal:s,options:c}=n;return $e({client:t,model:e,messages:r,system:i,tools:a,runtime:o,signal:s,options:c})}}}async function tt(e){let{provider:t,model:n,messages:r,system:i,tools:a,tracer:o,options:s}=e;return t.createGenerationRequest(n,{messages:r,system:i,tools:a,context:{tracer:o},options:s})}async function nt(e){let{provider:t,model:n,messages:r,system:i,tools:a,onToolCall:o,maxIterations:s,tracer:c,options:l}=e,u=[...r],d=[],f={in:0,out:0},p=0,m,h=e=>{u.push(e),d.push(e)},g=e=>(c?.setResult({kind:`llm`,model:n,request:{messages:r},response:{content:e.result===`success`?e.final?.content:null},usage:e.usage?{inputTokens:e.usage.in,outputTokens:e.usage.out}:void 0,finishReason:e.result===`success`?e.final?.finishReason:void 0}),c?.end(e.result===`error`?`error`:`ok`),e),_=(e,t)=>{if(!e||t.type===`error`){e?.end(`error`);return}e.setResult({kind:`llm`,model:t.model??n,request:{messages:u},response:{content:t.content},usage:t.usage?{inputTokens:t.usage.in,outputTokens:t.usage.out}:void 0,finishReason:t.finishReason}),e.end()};for(;;){if(s!==void 0&&p>=s)return g({result:`error`,messages:d,error:{type:`model`,error:{type:`error`,error:{type:`MaxIterations`,message:`Exceeded max iterations (${s})`}}},usage:f});p+=1;let e=c?.startSpan(`turn-${p}`,{type:`llm`}),r=await tt({provider:t,model:n,messages:u,system:i,tools:a,tracer:e,options:l});if(j(f,r),_(e,r),r.type===`error`)return g({result:`error`,messages:d,error:{type:`model`,error:r},usage:f});let v={role:`assistant`,id:r.id,model:r.model,content:r.content,finishReason:r.finishReason};if(h(v),m=v,r.finishReason!==P.FunctionCall)return g({result:`success`,messages:d,final:m,usage:f});let y=A(r.content);if(y.length===0)return g({result:`success`,messages:d,final:m,usage:f});let{results:b}=await N(y,o,c);b.length>0&&h({role:`tool`,id:crypto.randomUUID(),content:b})}}const $={GPT_5_4_2026_03_05:`gpt-5.4-2026-03-05`,GPT_5_4:`gpt-5.4`,GPT_5_4_PRO_2026_03_05:`gpt-5.4-pro-2026-03-05`,GPT_5_4_PRO:`gpt-5.4-pro`,GPT_5_4_MINI_2026_03_17:`gpt-5.4-mini-2026-03-17`,GPT_5_4_MINI:`gpt-5.4-mini`,GPT_5_4_NANO_2026_03_17:`gpt-5.4-nano-2026-03-17`,GPT_5_4_NANO:`gpt-5.4-nano`,GPT_5_2_2025_12_11:`gpt-5.2-2025-12-11`,GPT_5_2:`gpt-5.2`,GPT_5_2_CHAT_LATEST:`gpt-5.2-chat-latest`,GPT_5_2_PRO_2025_12_11:`gpt-5.2-pro-2025-12-11`,GPT_5_2_PRO:`gpt-5.2-pro`,GPT_5_1_2025_11_13:`gpt-5.1-2025-11-13`,GPT_5_1:`gpt-5.1`,GPT_5_1_CHAT_LATEST:`gpt-5.1-chat-latest`,GPT_5_2025_08_07:`gpt-5-2025-08-07`,GPT_5:`gpt-5`,GPT_5_CHAT_LATEST:`gpt-5-chat-latest`,GPT_5_PRO_2025_10_06:`gpt-5-pro-2025-10-06`,GPT_5_PRO:`gpt-5-pro`,GPT_5_MINI_2025_08_07:`gpt-5-mini-2025-08-07`,GPT_5_MINI:`gpt-5-mini`,GPT_5_NANO_2025_08_07:`gpt-5-nano-2025-08-07`,GPT_5_NANO:`gpt-5-nano`,GPT_4_1_2025_04_14:`gpt-4.1-2025-04-14`,GPT_4_1:`gpt-4.1`,GPT_4_1_MINI_2025_04_14:`gpt-4.1-mini-2025-04-14`,GPT_4_1_MINI:`gpt-4.1-mini`,GPT_4_1_NANO_2025_04_14:`gpt-4.1-nano-2025-04-14`,GPT_4_1_NANO:`gpt-4.1-nano`,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:`gpt-4o`,GPT_4O_MINI_2024_07_18:`gpt-4o-mini-2024-07-18`,GPT_4O_MINI:`gpt-4o-mini`,O4_MINI_2025_04_16:`o4-mini-2025-04-16`,O4_MINI:`o4-mini`,O3_2025_04_16:`o3-2025-04-16`,O3:`o3`,O3_PRO_2025_06_10:`o3-pro-2025-06-10`,O3_PRO:`o3-pro`,O3_MINI_2025_01_31:`o3-mini-2025-01-31`,O3_MINI:`o3-mini`,O1_2024_12_17:`o1-2024-12-17`,O1:`o1`,O1_PRO_2025_03_19:`o1-pro-2025-03-19`,O1_PRO:`o1-pro`};$.GPT_5_4,$.GPT_5_4_PRO,$.GPT_5_4_MINI,$.GPT_5_4_NANO,$.GPT_5_2,$.GPT_5_2_PRO,$.GPT_5_1,$.GPT_5,$.GPT_5_PRO,$.GPT_5_MINI,$.GPT_5_NANO,$.GPT_4_1,$.GPT_4_1_MINI,$.GPT_4_1_NANO,$.GPT_4O,$.GPT_4O_MINI,$.O4_MINI,$.O3,$.O3_PRO,$.O1,$.O1_PRO;const rt=$.GPT_5_4_MINI;function it(e){if(e&&e.length>0)return e.map(e=>({type:`function`,strict:!0,name:e.name,description:e.description,parameters:d.toJSONSchema(e.schema)}))}function at(e){return e.map(ot).flat(1)}function ot(e){switch(e.role){case`tool`:return st(e);case`assistant`:return ct(e);default:return lt(e)}}function st(e){return e.content.map(e=>({type:`function_call_output`,call_id:e.id,output:typeof e.content==`string`?e.content:e.content.map(e=>e.type===`text`?{type:`input_text`,text:e.text}:{type:`input_image`,image_url:`data:${e.mimeType};base64,${e.data}`})}))}function ct(e){let t=[],n=k(e.content);n&&t.push({role:e.role,content:n});let r=e.content.filter(e=>e.type===`tool-call`);for(let e of r)t.push({type:`function_call`,call_id:e.id,name:e.name,arguments:JSON.stringify(e.parameters)});let i=e.content.filter(e=>e.type===`internal-tool`);for(let e of i)e.output!=null&&t.push(e.output);return t}function lt(e){if(typeof e.content==`string`)return{role:e.role,content:e.content};{let t=e.content.map(ut).filter(e=>e!==null);return{role:e.role,content:t}}}function ut(e){if(e.type===`text`)return{type:`input_text`,text:e.text};if(e.type===`file`){if(e.file.type===`image`)return{type:`input_image`,image_url:`data:${e.file.mimeType};base64,${e.file.base64}`,detail:`auto`};if(e.file.type===`document`)return{type:`input_file`,filename:e.file.path,file_data:`data:${e.file.mimeType};base64,${e.file.base64}`}}return e.type,null}async function dt(e){let{client:t,model:n,messages:r,system:i,tools:a,context:o,options:s}=e,c=o?.tracer,l=it(a),u={model:n,input:at(r),...i&&{instructions:i},...l?{tools:l}:{},...s};c?.debug(`OpenAI ResponsesAPI request`,{request:u});let d;try{d=ft(await t.responses.create(u))}catch(e){c?.error(e instanceof Error?e.message:String(e)),d=Y(e)}return c?.debug(`OpenAI ResponsesAPI response`,{result:d}),d}function ft(e){if(e.error)return{type:`error`,error:{type:e.error.code||`undetermined`,message:e.error.message||`Response generation failed`},usage:{in:e.usage?.input_tokens??0,out:e.usage?.output_tokens??0},raw:e};let t=e.output?.filter(e=>e.type===`reasoning`)?.map(e=>e),n=[];if(t&&t.length>0)for(let e of t){let t=e.summary?.[0]?.text||e.content?.[0]?.text||``;(t||e.encrypted_content)&&n.push({type:`thinking`,text:t,...e.encrypted_content&&{encrypted:e.encrypted_content}})}e.output_text&&n.push({type:`text`,text:e.output_text});let r=e.output?.filter(e=>e.type===`function_call`);if(r&&r.length>0)for(let e of r){let t=e;try{n.push({type:`tool-call`,id:t.id||``,name:t.name||``,parameters:t.arguments?JSON.parse(t.arguments):{}})}catch(e){throw Error(`Failed to parse tool call arguments for ${t.name}: ${e instanceof Error?e.message:String(e)}\nRaw value: ${t.arguments}`)}}return{type:`success`,id:e.id,model:e.model||``,role:`assistant`,finishReason:e.incomplete_details?P.Error:P.Stop,content:n,text:k(n),usage:{in:e.usage?.input_tokens??0,out:e.usage?.output_tokens??0},raw:e}}function pt(){let e=``,t=``,n=0,r=-1,i=!1,a=new Map,o=new Map,s=new Set([`web_search_call`,`file_search_call`,`code_interpreter_call`]),c=new Map;function l(l){let u=[];switch(l.type){case`response.created`:e=l.response.id||`openai-${Date.now()}`,t=l.response.model,u.push({type:`start`,id:e,data:{model:t,timestamp:Date.now()}});break;case`response.output_text.delta`:r===-1&&(r=n++,u.push({type:`text-start`,data:{index:r}})),u.push({type:`text-delta`,data:{text:l.delta,index:r}});break;case`response.output_text.done`:r>=0&&(u.push({type:`text-complete`,data:{index:r}}),r=-1);break;case`response.function_call_arguments.delta`:{let e=l.item_id;if(!c.has(e)){let t=a.get(e),r=t?.name||``,i=t?.callId||e,o=n++;c.set(e,{id:e,callId:i,name:r,argumentsBuffer:``,partIdx:o}),u.push({type:`tool-call-start`,data:{index:o,id:i,name:r}})}let t=c.get(e);t.argumentsBuffer+=l.delta;break}case`response.function_call_arguments.done`:{i=!0;let e=l.item_id,t=c.get(e),n=l.name||t?.name||``;if(t){try{let e=l.arguments?JSON.parse(l.arguments):{};u.push({type:`tool-call-complete`,data:{index:t.partIdx,id:t.callId,name:n,arguments:e}})}catch(e){throw Error(`Failed to parse function call arguments for ${n}: ${e instanceof Error?e.message:String(e)}\nRaw value: ${l.arguments}`)}c.delete(e)}break}case`response.completed`:{let e=l.response.usage;u.push({type:`complete`,data:{finishReason:l.response.incomplete_details?P.Error:i?P.FunctionCall:P.Stop,usage:{in:e?.input_tokens||0,out:e?.output_tokens||0}}});break}case`response.failed`:u.push({type:`error`,data:{type:`RESPONSES_API_ERROR`,message:`Response failed: ${l.response.status}`,raw:l}});break;case`response.output_item.added`:if(l.item?.type===`reasoning`)r=n++,u.push({type:`thinking-start`,data:{index:r}});else if(l.item?.type===`function_call`){let e=l.item,t=e.id||e.call_id;t&&a.set(t,{name:e.name||``,callId:e.call_id||t})}else if(l.item&&s.has(l.item.type)){let e=l.item,t=n++;o.set(e.id,t),u.push({type:`internal-tool-start`,data:{index:t,id:e.id,name:e.type}})}break;case`response.output_item.done`:if(l.item?.type===`reasoning`&&r>=0)u.push({type:`thinking-complete`,data:{index:r}}),r=-1;else if(l.item&&s.has(l.item.type)){let e=l.item,t=o.get(e.id);t!==void 0&&(u.push({type:`internal-tool-complete`,data:{index:t,id:e.id,name:e.type,output:l.item}}),o.delete(e.id))}break;case`response.reasoning_text.delta`:l.delta&&u.push({type:`thinking-delta`,data:{index:r,text:l.delta}});break;case`response.reasoning_summary_text.delta`:l.delta&&u.push({type:`thinking-summary-delta`,data:{index:r,text:l.delta}});break;case`response.in_progress`:case`response.content_part.added`:case`response.content_part.done`:case`response.reasoning_summary_part.added`:case`response.reasoning_summary_part.done`:case`response.reasoning_summary_text.done`:case`response.reasoning_text.done`:case`response.web_search_call.in_progress`:case`response.web_search_call.searching`:case`response.web_search_call.completed`:break;default:console.log(`[OpenAI] unhandled stream event: ${l.type}`)}return u}return{handleEvent:l}}async function*mt(e){let{client:t,model:n,messages:r,system:i,tools:a,runtime:o,signal:s,options:c}=e,l=o?.tracer,{serverTools:u,...d}=c??{},f=it(a)??[];if(u){let e={web_search:`web_search_preview`,code_execution:`code_interpreter`};for(let t of u){let n=e[t.name]??t.name;f.push({type:n,...t.config})}}let p={model:n,input:at(r),...i&&{instructions:i},stream:!0,...f.length>0?{tools:f}:{},...d};l?.debug(`OpenAI ResponsesAPI streaming request`,{request:p});let m=pt();try{let e=t.responses.stream(p,...s?[{signal:s}]:[]);for await(let t of e){let e=m.handleEvent(t);for(let t of e)yield t}}catch(e){if(s?.aborted)return;l?.error(e instanceof Error?e.message:String(e)),yield{type:`error`,data:{type:`STREAMING_ERROR`,message:e instanceof Error?e.message:String(e),raw:e}}}}function ht(e){let t=new _({apiKey:e});return{name:`OpenAI`,async createGenerationRequest(e,n){return await dt({client:t,model:e,...n})},createStreamingRequest(e,n){let{messages:r,system:i,tools:a,context:o,signal:s,options:c}=n;return mt({client:t,model:e,messages:r,system:i,tools:a,runtime:o,signal:s,options:c})}}}const gt=u.object({searchTerm:u.string().describe(`The search term to query`)}),_t=new class{name=`brave`;description=`Perform a search using the Brave search engine`;schema=gt;apiKey;throttle;lastExecTime=0;constructor(e){e&&this.configure(e)}configure(e){let{rateLimit:t}=e;this.apiKey=e[`api-key`],this.throttle=t?1100/t:void 0}async execute(e){let{searchTerm:t}=e;if(this.throttle){for(;Date.now()-this.lastExecTime<this.throttle;)await V(this.throttle-(Date.now()-this.lastExecTime));this.lastExecTime=Date.now()}try{let e=this.apiKey,n=new URL(`https://api.search.brave.com/res/v1/web/search`);n.searchParams.append(`q`,t),n.searchParams.append(`format`,`json`);let r=await fetch(n.toString(),{method:`GET`,headers:{Accept:`application/json`,"X-Subscription-Token":e??``}});if(!r.ok)throw Error(`[Brave] HTTP error ${r.status}: ${r.statusText}`);let i=await r.json();return JSON.stringify(i)}catch(e){throw e instanceof Error?Error(`[Brave] Error fetching search results: ${e.message}`):e}}},vt={name:`calculator`,description:`Performs basic arithmetic operations`,schema:f.object({operation:f.enum([`add`,`subtract`,`multiply`,`divide`]).describe(`The operation to perform (add, subtract, multiply, divide)`),a:f.number().describe(`First operand`),b:f.number().describe(`Second operand`)}),execute:async({operation:e,a:t,b:n})=>{switch(e){case`add`:return`${t} + ${n} = ${t+n}`;case`subtract`:return`${t} - ${n} = ${t-n}`;case`multiply`:return`${t} * ${n} = ${t*n}`;case`divide`:if(n===0)throw Error(`Cannot divide by zero`);return`${t} / ${n} = ${t/n}`;default:throw Error(`Unknown operation: ${e}`)}}},yt=y(v);async function bt(e,t={}){let{stdout:n,stderr:r}=await yt(e,{cwd:t.cwd,timeout:t.timeout??3e4,maxBuffer:t.maxBuffer??1048576});return{stdout:n,stderr:r}}function xt(e){if(e instanceof Error){let t=e,n=`Error executing command: ${e.message}`;return t.stdout&&(n+=`\n[stdout]: ${t.stdout}`),t.stderr&&(n+=`\n[stderr]: ${t.stderr}`),n}return`Error executing command: ${String(e)}`}function St(e,t){return t&&t.trim()?`${e}\n[stderr]: ${t}`:e}const Ct=u.object({command:u.string().describe(`The shell command to execute`)}),wt=new class{name=`exec`;description=`Execute a shell command and return the output.`;schema=Ct;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){let{command:t}=e;try{let e=await bt(t,{timeout:this.timeout,maxBuffer:this.maxBuffer,cwd:this.cwd});return St(e.stdout,e.stderr)}catch(e){return xt(e)}}},Tt={name:`patch-file`,description:`Patch a file by replacing an exact string match within a specified line range`,schema:f.object({path:f.string().describe(`The file path to patch`),old_string:f.string().describe(`The exact text to find and replace`),new_string:f.string().describe(`The replacement text`),start_line:f.number().int().positive().describe(`1-indexed start line of the region to match within`),end_line:f.number().int().positive().describe(`1-indexed end line (inclusive) of the region to match within`)}),summarize:({path:e,start_line:t,end_line:n})=>`${e}:${t}:${n}`,execute:async({path:e,old_string:t,new_string:n,start_line:i,end_line:o})=>{if(o<i)throw Error(`end_line (${o}) must be >= start_line (${i})`);let s;try{s=await r(e,`utf-8`)}catch(t){throw t instanceof Error?Error(`Failed to read file "${e}": ${t.message}`):t}let c=s.split(`
|
|
17
|
+
`);if(i>c.length)throw Error(`start_line (${i}) exceeds file length (${c.length} lines)`);if(o>c.length)throw Error(`end_line (${o}) exceeds file length (${c.length} lines)`);let l=c.slice(i-1,o).join(`
|
|
18
|
+
`),u=l.indexOf(t);if(u===-1)throw Error(`old_string not found within lines ${i}-${o} of "${e}"`);if(l.indexOf(t,u+1)!==-1)throw Error(`old_string matches multiple times within lines ${i}-${o} of "${e}"`);let d=l.replace(t,n),f=[...c.slice(0,i-1),...d.split(`
|
|
19
|
+
`),...c.slice(o)].join(`
|
|
20
|
+
`);try{await a(e,f,`utf-8`)}catch(t){throw t instanceof Error?Error(`Failed to write file "${e}": ${t.message}`):t}return`Successfully patched "${e}" (lines ${i}-${o})`}},Et={name:`read-file`,description:`Read the contents of a file from disk`,schema:f.object({path:f.string().describe(`The file path to read from`)}),summarize:({path:e})=>e,execute:async({path:e})=>{try{return await r(e,`utf-8`)}catch(t){throw t instanceof Error?Error(`Failed to read file "${e}": ${t.message}`):t}}},Dt={name:`write-file`,description:`Write content to a file on disk, creating directories if needed`,schema:f.object({path:f.string().describe(`The file path to write to`),content:f.string().describe(`The content to write to the file`)}),summarize:({path:e})=>e,execute:async({path:e,content:t})=>{try{return await n(s(e),{recursive:!0}),await a(e,t,`utf-8`),`Successfully wrote ${t.length} characters to "${e}"`}catch(t){throw t instanceof Error?Error(`Failed to write file "${e}": ${t.message}`):t}}};function Ot(e){try{let t=d.fromJSONSchema(e);return t instanceof d.ZodObject?t.strict():d.object({}).passthrough()}catch{return d.object({}).passthrough()}}function kt(e,t,n){return e.map(e=>jt(e,t,n))}function At(e,t){return e.map(e=>{let n=t?`${t}_${e.name}`:e.name,r=Ot(e.inputSchema);return{name:n,description:e.description??``,schema:r}})}function jt(e,t,n){let r=n?`${n}_${e.name}`:e.name,i=Ot(e.inputSchema);return{name:r,description:e.description??``,schema:i,async execute(n){let r=await t.callTool({name:e.name,arguments:n});if(`isError`in r&&r.isError)throw Error(Nt(r.content));return Mt(r.content)}}}function Mt(e){return e.some(e=>e.type===`image`)?e.filter(e=>e.type===`text`||e.type===`image`).map(e=>{if(e.type===`text`)return{type:`text`,text:e.text};let t=e;return{type:`image`,data:t.data,mimeType:t.mimeType}}):e.filter(e=>e.type===`text`).map(e=>e.text).join(`
|
|
21
|
+
`)}function Nt(e){return e.filter(e=>e.type===`text`).map(e=>e.text).join(`
|
|
22
|
+
`)||`MCP tool execution error`}var Pt=class{config;client;transport;cachedMcpTools;_connected=!1;constructor(e){this.config=e}get name(){return this.config.name??this.client?.getServerVersion()?.name}get connected(){return this._connected}async connect(e){if(this._connected)return;let t=e?.tracer?.startSpan(`mcp:connect`,{type:`internal`});this.client=new b({name:`axle`,version:`1.0.0`}),this.config.transport===`stdio`?this.transport=new x({command:this.config.command,args:this.config.args,env:this.config.env}):this.transport=new S(new URL(this.config.url),{requestInit:this.config.headers?{headers:this.config.headers}:void 0});try{await this.client.connect(this.transport),this._connected=!0,t?.end(`ok`)}catch(e){throw t?.end(`error`),e}}async listTools(e){let t=this.assertConnected();return kt(await this.fetchTools(t,e?.tracer),t,e?.prefix)}async listToolDefinitions(e){let t=this.assertConnected();return At(await this.fetchTools(t,e?.tracer),e?.prefix)}async refreshTools(){return this.assertConnected(),this.cachedMcpTools=void 0,this.listTools()}async close(e){this._connected&&(e?.tracer?.debug(`mcp:close`),await this.client?.close(),this._connected=!1,this.client=void 0,this.transport=void 0,this.cachedMcpTools=void 0)}async fetchTools(e,t){return this.cachedMcpTools?this.cachedMcpTools:(t?.debug(`mcp:listTools`),this.cachedMcpTools=(await e.listTools()).tools.map(e=>({name:e.name,description:e.description,inputSchema:e.inputSchema})),this.cachedMcpTools)}assertConnected(){if(!this._connected||!this.client)throw Error(`MCP not connected. Call connect() first.`);return this.client}};const Ft={debug:0,info:1,warn:2,error:3};var It=class{writers=[];_minLevel=`info`;get minLevel(){return this._minLevel}set minLevel(e){this._minLevel=e}addWriter(e){this.writers.includes(e)||this.writers.push(e)}removeWriter(e){let t=this.writers.indexOf(e);t!==-1&&this.writers.splice(t,1)}startSpan(e,t){let n={traceId:crypto.randomUUID(),spanId:crypto.randomUUID(),name:e,type:t?.type,startTime:performance.now(),status:`ok`,attributes:{},events:[]};return this.writers.forEach(e=>e.onSpanStart(n)),new Lt(n,this)}async flush(){for(let e of this.writers)e.flush&&await e.flush()}_notifySpanEnd(e){this.writers.forEach(t=>t.onSpanEnd(e))}_notifySpanUpdate(e){this.writers.forEach(t=>t.onSpanUpdate?.(e))}_notifyEvent(e,t){this.writers.forEach(n=>n.onEvent?.(e,t))}_notifySpanStart(e){this.writers.forEach(t=>t.onSpanStart(e))}_shouldLog(e){return Ft[e]>=Ft[this._minLevel]}},Lt=class e{data;tracer;ended=!1;constructor(e,t){this.data=e,this.tracer=t}startSpan(t,n){let r={traceId:this.data.traceId,spanId:crypto.randomUUID(),parentSpanId:this.data.spanId,name:t,type:n?.type,startTime:performance.now(),status:`ok`,attributes:{},events:[]};return this.tracer._notifySpanStart(r),new e(r,this.tracer)}end(e=`ok`){this.ended||(this.ended=!0,this.data.endTime=performance.now(),this.data.status=e,this.tracer._notifySpanEnd(this.data))}addEvent(e,t,n){if(this.ended||!this.tracer._shouldLog(t))return;let r={name:e,timestamp:performance.now(),level:t,attributes:n};this.data.events.push(r),this.tracer._notifyEvent(this.data,r)}debug(e,t){this.addEvent(e,`debug`,t)}info(e,t){this.addEvent(e,`info`,t)}warn(e,t){this.addEvent(e,`warn`,t)}error(e,t){this.addEvent(e,`error`,t)}setAttribute(e,t){this.ended||(this.data.attributes[e]=t,this.tracer._notifySpanUpdate(this.data))}setAttributes(e){this.ended||(Object.assign(this.data.attributes,e),this.tracer._notifySpanUpdate(this.data))}setResult(e){this.ended||(this.data.result=e,this.tracer._notifySpanUpdate(this.data))}};const Rt={debug:0,info:1,warn:2,error:3};let zt=!1;function Bt(){zt||=(C.use(w()),!0)}var Vt=class{minLevel;showInternal;showTimestamp;showDuration;markdown;output;spans=new Map;visibleDepths=new Map;constructor(e={}){this.minLevel=e.minLevel??`info`,this.showInternal=e.showInternal??!1,this.showTimestamp=e.showTimestamp??!0,this.showDuration=e.showDuration??!0,this.markdown=e.markdown??!1,this.output=e.output??console.log}shouldShowEvent(e){return Rt[e]>=Rt[this.minLevel]}isSpanVisible(e){return!(e.type===`internal`&&!this.showInternal)}findVisibleAncestor(e){let t=e.parentSpanId;for(;t;){let e=this.spans.get(t);if(!e)break;if(this.isSpanVisible(e))return e;t=e.parentSpanId}return null}calculateVisibleDepth(e){if(!this.isSpanVisible(e))return-1;let t=this.findVisibleAncestor(e);return t?(this.visibleDepths.get(t.spanId)??0)+1:0}formatTimestamp(){if(!this.showTimestamp)return``;let e=new Date;return`[${e.toTimeString().slice(0,8)}.${e.getMilliseconds().toString().padStart(3,`0`)}] `}formatDuration(e){if(!this.showDuration||!e.endTime)return``;let t=e.endTime-e.startTime;return t<1e3?` (${Math.round(t)}ms)`:` (${(t/1e3).toFixed(2)}s)`}formatIndent(e){return` `.repeat(e)}formatSpanName(e){return e.type?`[${e.type}] ${e.name}`:e.name}renderMarkdown(e){return Bt(),C.parse(e).trimEnd()}onSpanStart(e){if(this.spans.set(e.spanId,e),!this.isSpanVisible(e))return;let t=this.calculateVisibleDepth(e);this.visibleDepths.set(e.spanId,t);let n=this.formatIndent(t),r=this.formatTimestamp(),i=this.formatSpanName(e);this.output(`${r}${n}START ${i}`)}onSpanEnd(e){if(this.spans.set(e.spanId,e),!this.isSpanVisible(e))return;let t=this.visibleDepths.get(e.spanId)??0,n=this.formatIndent(t),r=this.formatTimestamp(),i=this.formatDuration(e),a=this.formatSpanName(e),o=e.status===`error`?` [ERROR]`:``;if(this.output(`${r}${n}END ${a}${i}${o}`),e.result?.kind===`llm`){let t=e.result,i=[`model=${t.model}`];if(t.finishReason&&i.push(`finishReason=${t.finishReason}`),t.usage&&(t.usage.inputTokens!==void 0&&i.push(`inputTokens=${t.usage.inputTokens}`),t.usage.outputTokens!==void 0&&i.push(`outputTokens=${t.usage.outputTokens}`)),this.output(`${r}${n} INFO LLM complete ${i.join(` `)}`),this.shouldShowEvent(`debug`)&&t.response.content){let e=(typeof t.response.content==`string`?t.response.content:JSON.stringify(t.response.content,null,2)).split(`
|
|
23
|
+
`);for(let t of e)this.output(`${r}${n} DEBUG ${t}`)}}}onSpanUpdate(e){this.spans.set(e.spanId,e)}onEvent(e,t){if(!this.shouldShowEvent(t.level))return;this.spans.set(e.spanId,e);let n;if(this.isSpanVisible(e))n=this.visibleDepths.get(e.spanId)??0;else{let t=this.findVisibleAncestor(e);n=t?this.visibleDepths.get(t.spanId)??0:0}let r=this.formatIndent(n+1),i=this.formatTimestamp(),a=t.level.toUpperCase().padEnd(5),o=this.markdown&&t.attributes?.markdown===!0,s=t.attributes?Object.entries(t.attributes).filter(([e])=>e!==`markdown`):[],c=t.name;o&&(c=this.renderMarkdown(c));let l=`${i}${r}${a} ${c}`;if(s.length>0){let e=s.map(([e,t])=>`${e}=${JSON.stringify(t)}`).join(` `);l+=` ${e}`}this.output(l)}},Ht=class{provider;model;enableTools;lastStore;lastName;lastScope;constructor(e){this.provider=e.provider,this.model=e.model,this.enableTools=e.enableTools??!1}async recall(e){let t=e.tracer?.startSpan(`memory.recall`,{type:`internal`});this.lastStore=e.store,this.lastName=e.name,this.lastScope=e.scope;let n=await this.loadStore(e.store,e.name,e.scope);if(n.instructions.length===0)return t?.info(`no stored instructions`),t?.end(),{};t?.info(`loaded instructions`,{count:n.instructions.length});let r=n.instructions.map((e,t)=>`${t+1}. ${e}`).join(`
|
|
24
|
+
`);return t?.end(),{systemSuffix:`## Learned Instructions\n\n${r}`}}async record(e){if(!e.newMessages||e.newMessages.length===0)return;let t=e.tracer?.startSpan(`memory.record`,{type:`internal`}),n=this.formatMessages(e.newMessages);if(!n.trim()){t?.info(`no text content to extract from`),t?.end();return}let r=t?.startSpan(`memory.extract`,{type:`llm`}),i=await nt({provider:this.provider,model:this.model,messages:[{role:`user`,content:n}],system:`You are a memory extraction system. Your job is to extract learnings from a conversation that should be remembered for future runs.
|
|
25
|
+
|
|
26
|
+
Only extract:
|
|
27
|
+
- Explicit user corrections (e.g., "No, always use bullet points")
|
|
28
|
+
- Stated preferences (e.g., "I prefer concise summaries")
|
|
29
|
+
- Patterns that clearly emerged from user feedback
|
|
30
|
+
|
|
31
|
+
Do NOT extract:
|
|
32
|
+
- General knowledge or facts from the conversation content
|
|
33
|
+
- Inferences or speculation about what the user might want
|
|
34
|
+
- Task-specific details that won't apply to future runs
|
|
35
|
+
|
|
36
|
+
Respond with a JSON array of instruction strings. Each instruction should be a clear, actionable directive.
|
|
37
|
+
If there are no learnings to extract, respond with an empty array: []
|
|
38
|
+
|
|
39
|
+
Example response:
|
|
40
|
+
["Always use bullet points for lists", "Keep summaries under 3 sentences"]`,tracer:r});if(i.result!==`success`||!i.final){t?.warn(`extraction failed`,{result:i.result}),t?.end();return}let a=k(i.final.content);if(!a){t?.end();return}let o=this.parseInstructions(a);if(o.length===0){t?.info(`no instructions extracted`),t?.end();return}let s=await this.loadStore(e.store,e.name,e.scope);s.instructions.push(...o),await this.saveStore(e.store,e.name,e.scope,s),t?.info(`saved instructions`,{count:o.length}),t?.end()}tools(){if(!this.enableTools)return[];let e=this;return[{name:`add_instruction`,description:`Save a learned instruction for future runs. Use this when the user explicitly asks you to remember something.`,schema:f.object({instruction:f.string().describe(`The instruction to remember`)}),async execute(t){if(!e.lastStore)return`Error: memory not initialized (no recall has been called yet)`;let n=await e.loadStore(e.lastStore,e.lastName,e.lastScope);return n.instructions.push(t.instruction),await e.saveStore(e.lastStore,e.lastName,e.lastScope,n),`Instruction saved: "${t.instruction}"`}}]}formatMessages(e){let t=[];for(let n of e)if(n.role===`user`){let e=typeof n.content==`string`?n.content:k(n.content);e&&t.push(`User: ${e}`)}else if(n.role===`assistant`){let e=k(n.content);e&&t.push(`Assistant: ${e}`)}return t.join(`
|
|
41
|
+
|
|
42
|
+
`)}parseInstructions(e){let t=e.trim(),n=t.match(/^```(?:json)?\s*\n?([\s\S]*?)\n?\s*```$/);n&&(t=n[1].trim());try{let e=JSON.parse(t);if(Array.isArray(e)&&e.every(e=>typeof e==`string`))return e}catch{}return[]}getStorePath(e,t){let n=e??`default`,r=n;if(t&&Object.keys(t).length>0){let e=Object.entries(t).sort(([e],[t])=>e.localeCompare(t)).map(([e,t])=>`${e}=${t}`).join(`&`);r=`${n}-${T.createHash(`sha256`).update(e).digest(`hex`).slice(0,8)}`}return`memory/procedural/${r}.json`}async loadStore(e,t,n){let r=this.getStorePath(t,n),i=await e.read(r);if(i)try{let e=JSON.parse(i);if(e&&Array.isArray(e.instructions))return{instructions:e.instructions}}catch{}return{instructions:[]}}async saveStore(e,t,n,r){if(!r)return;let i=this.getStorePath(t,n);await e.write(i,JSON.stringify(r,null,2))}};export{ne as A,he as C,K as D,oe as E,R as M,I as N,G as O,P,J as S,ce as T,Ve as _,Dt as a,Oe as b,wt as c,ht as d,rt as f,et as g,tt as h,Pt as i,z as j,U as k,vt as l,nt as m,Vt as n,Et as o,$ as p,It as r,Tt as s,Ht as t,_t as u,Q as v,me as w,ge as x,Be as y};
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { };
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import{C as e,E as t,T as n,_ as r,a as i,b as a,c as o,d as s,f as c,g as l,i as u,l as d,n as f,o as p,r as m,s as h,t as g,u as _,w as v,x as y,y as b}from"./ProceduralMemory-g6rvICO7.js";import{appendFile as x,mkdir as S,readFile as C}from"node:fs/promises";import{basename as w,dirname as T,extname as ee}from"node:path";import{z as E}from"zod";import{glob as te}from"glob";import{createHash as D}from"node:crypto";import{Command as O}from"@commander-js/extra-typings";import k from"yaml";import{createInterface as ne}from"node:readline";var re=`0.10.1`;E.object({value:E.string()});const ie=E.object({"api-key":E.string(),rateLimit:E.number().optional()});E.object({timeout:E.number().optional(),maxBuffer:E.number().optional(),cwd:E.string().optional()});const ae=E.object({type:E.literal(`chatcompletions`)}).loose(),oe=E.object({type:E.literal(`anthropic`)}).loose(),se=E.object({type:E.literal(`openai`)}).loose(),ce=E.object({type:E.literal(`gemini`)}).loose(),le=E.discriminatedUnion(`type`,[ae,oe,se,ce]),ue=E.object({chatcompletions:E.custom().optional(),anthropic:E.custom().optional(),openai:E.custom().optional(),gemini:E.custom().optional(),brave:ie.optional()}).loose(),de=E.object({transport:E.literal(`stdio`),name:E.string().optional(),command:E.string(),args:E.array(E.string()).optional(),env:E.record(E.string(),E.string()).optional()}),fe=E.object({transport:E.literal(`http`),name:E.string().optional(),url:E.string(),headers:E.record(E.string(),E.string()).optional()}),pe=E.discriminatedUnion(`transport`,[de,fe]),me=E.object({files:E.string(),resume:E.boolean().default(!1),concurrency:E.number().int().positive().default(3)}),A=E.object({name:E.string().optional(),provider:le,task:E.string(),tools:E.array(E.string()).optional(),server_tools:E.array(E.string()).optional(),files:E.array(E.string()).optional(),mcps:E.array(pe).optional(),batch:me.optional()}),j=[`yaml`,`yml`,`json`];async function M(e,t){let{tracer:r}=t,{content:i,format:a,path:o}=await n(e,{defaults:{name:`axle.job`,formats:j},tag:`Job File`}),s=null;if(a===`json`)s=JSON.parse(i);else if(a===`yaml`||a===`yml`)s=k.parse(i);else throw Error(`Invalid job file format`);r?.debug(`Job config: `+JSON.stringify(s,null,2));let c=A.safeParse(s);if(!c.success)throw Error(`The job file is not valid:\n${F(c.error)}`);return c.data.name||(c.data.name=w(o,ee(o))),c.data}const N=[`yaml`,`yml`,`json`];async function P(e,t){let{tracer:r}=t,{content:i,format:a}=await n(e,{defaults:{name:`axle.config`,formats:N},tag:`Config File`}),o=null;if(a===`json`)o=JSON.parse(i);else if(a===`yaml`||a===`yml`)o=k.parse(i);else throw Error(`Invalid config file format`);r?.debug(`Service config: `+JSON.stringify(o,null,2));let s=ue.safeParse(o);if(!s.success)throw Error(`The config file is not valid:\n${F(s.error)}`);return s.data}function F(e){return e.issues.map(e=>` - ${e.path.join(`.`)||`root`}: ${e.message}`).join(`
|
|
3
|
+
`)}async function I(e,t){let n=[];for(let r of e){let e=new u(r);await e.connect({tracer:t}),n.push(e)}return n}async function L(e,t){for(let n of e)try{await n.close({tracer:t})}catch{}}const R=`.axle/batch.jsonl`;function z(e,t){let n=D(`sha256`);return n.update(e),n.update(`\0`),n.update(t),n.digest(`hex`)}async function he(e=R){let t=new Map,n;try{n=await C(e,`utf-8`)}catch{return t}for(let e of n.split(`
|
|
4
|
+
`)){let n=e.trim();if(n)try{let e=JSON.parse(n);e.file&&e.hash&&t.set(e.file,e)}catch{}}return t}async function ge(e,t=R){await S(T(t),{recursive:!0}),await x(t,JSON.stringify(e)+`
|
|
5
|
+
`,`utf-8`)}async function _e(n,r,i,a,o,s,c,l,u,d){let f=new e(n.task);if(n.files)for(let e of n.files)f.addFile(await v(e));let p=u.startSpan(`job`,{type:`workflow`}),m=new t({provider:r,model:i,tools:a,mcps:o,tracer:p,name:n.name,memory:d,options:{strictVariables:!c.allowMissingVars}});try{let e=await m.send(f,{variables:s}).final;if(l.in+=e.usage.in,l.out+=e.usage.out,e.response){let t=typeof e.response==`string`?e.response:JSON.stringify(e.response,null,2);u.info(t,{markdown:!0})}c.interactive&&await ve(m,l,u),p.end()}catch(e){let t=e instanceof Error?e.message:String(e);throw p.error(t),p.end(`error`),e}}async function ve(e,t,n){let r=ne({input:process.stdin,output:process.stdout});r.on(`SIGINT`,()=>{r.close()});let i=e=>new Promise(t=>{r.question(e,t),r.once(`close`,()=>t(null))});try{for(;;){let r=await i(`
|
|
6
|
+
> `);if(r===null||r.trim()===``)break;try{let i=await e.send(r.trim()).final;if(t.in+=i.usage.in,t.out+=i.usage.out,i.response){let e=typeof i.response==`string`?i.response:JSON.stringify(i.response,null,2);n.info(e,{markdown:!0})}}catch(e){let t=e instanceof Error?e.message:String(e);n.error(t)}}}finally{r.close()}}async function ye(n,r,i,a,o,s,c,l,u,d){let f=n.batch,p=await te(f.files);if(p.length===0){u.warn(`No files matched pattern: ${f.files}`);return}u.info(`Batch: ${p.length} file(s) matched "${f.files}"`);let m=f.resume?await he():new Map,h=n.files?await Promise.all(n.files.map(e=>v(e))):[],g=0,_=0,y=0;await be(f.concurrency??3,p,async p=>{let b=u.startSpan(`batch:${p}`,{type:`workflow`});try{let u=await C(p),y=z(n.task,u),x=m.get(p);if(f.resume&&x&&x.hash===y){b.info(`Skipped (already completed)`),b.end(),_++;return}let S=new e(n.task);for(let e of h)S.addFile(e);S.addFile(await v(p));let w={...s,file:p},T=await new t({provider:r,model:i,tools:a,mcps:o,tracer:b,name:n.name,memory:d,options:{strictVariables:!c.allowMissingVars}}).send(S,{variables:w}).final;l.in+=T.usage.in,l.out+=T.usage.out,await ge({file:p,hash:y,timestamp:Date.now()}),b.end(),g++}catch(e){let t=e instanceof Error?e.message:String(e);b.error(`Failed: ${t}`),b.end(`error`),y++}}),u.info(`Batch complete: ${g} completed, ${_} skipped, ${y} failed`)}async function be(e,t,n){let r=0;async function i(){for(;r<t.length;)await n(t[r++])}let a=Array.from({length:Math.min(e,t.length)},()=>i());await Promise.all(a)}function xe(e,t){switch(e){case`brave`:{let e=t?.brave;return e&&_.configure(e),_}case`calculator`:return d;case`exec`:{let e=t?.exec;return e&&o.configure(e),o}case`patch-file`:return h;case`read-file`:return p;case`write-file`:return i;default:throw Error(`Unknown tool: ${e}`)}}function Se(e,t){return e.map(e=>xe(e,t))}const B=new O().name(`axle`).description(`Axle is a CLI tool for running AI workflows`).version(re).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`);B.parse(process.argv);const V=B.opts(),H={date:new Date().toISOString().split(`T`)[0],datetime:new Date().toISOString(),cwd:process.cwd()};V.args&&V.args.forEach(e=>{let[t,n]=e.split(`=`);t&&n&&(H[t.trim()]=n.trim())});const U=new m;V.debug&&(U.minLevel=`debug`);const W=new f({minLevel:V.debug?`debug`:`info`,showInternal:V.debug,showTimestamp:!0,markdown:!0});if(U.addWriter(W),V.log){let e=new f({minLevel:`debug`,showInternal:!0,showTimestamp:!0,output:e=>{}});U.addWriter(e)}const G=U.startSpan(`cli`,{type:`root`});process.on(`uncaughtException`,async e=>{console.error(`Uncaught exception:`),console.error(e),G.error(`Uncaught exception:`),G.error(e.message),G.error(e.stack||``),G.end(`error`),await U.flush(),process.exit(1)}),V.debug&&(G.debug(`Options: `+JSON.stringify(V,null,2)),G.debug(`Additional Arguments: `+JSON.stringify(H,null,2)));let K,q;try{K=await P(V.config??null,{tracer:G}),q=await M(V.job??null,{tracer:G})}catch(e){let t=e instanceof Error?e:Error(String(e));G.error(t.message),G.debug(t.stack??``),G.end(`error`),await U.flush(),B.outputHelp(),process.exit(1)}let J,Y;try{let{type:e,...t}=q.provider;switch(e){case`openai`:{let e={...K.openai,...t},n=e[`api-key`];if(!n)throw Error(`The provider openai is not configured. Please check your configuration.`);let r={"api-key":n,model:e.model};J=s(r[`api-key`]),Y=r.model||c;break}case`anthropic`:{let e={...K.anthropic,...t},n=e[`api-key`];if(!n)throw Error(`The provider anthropic is not configured. Please check your configuration.`);let r={"api-key":n,model:e.model};J=a(r[`api-key`]),Y=r.model||y;break}case`gemini`:{let e={...K.gemini,...t},n=e[`api-key`];if(!n)throw Error(`The provider gemini is not configured. Please check your configuration.`);let i={"api-key":n,model:e.model};J=l(i[`api-key`]),Y=i.model||r;break}case`chatcompletions`:{let e={...K.chatcompletions,...t},n=e[`base-url`],r=e.model;if(!n||!r)throw Error(`The provider chatcompletions is not configured. Please check your configuration.`);let i={"base-url":n,model:r,"api-key":e[`api-key`]};J=b(i[`base-url`],i[`api-key`]),Y=i.model;break}}}catch(e){let t=e instanceof Error?e:Error(String(e));G.error(t.message),G.error(t.stack??``),G.end(`error`),await U.flush(),B.outputHelp(),process.exit(1)}G.info(`All systems operational. Running job...`);const X=new g({provider:J,model:Y}),Ce=(q.server_tools??[]).map(e=>({type:`server`,name:e})),Z=[...q.tools?.length?Se(q.tools):[],...Ce];let Q=[];if(q.mcps?.length)try{Q=await I(q.mcps,G)}catch(e){let t=e instanceof Error?e:Error(String(e));G.error(`Failed to connect MCP servers: `+t.message),G.end(`error`),await U.flush(),process.exit(1)}const $={in:0,out:0},we=performance.now();try{q.batch?await ye(q,J,Y,Z,Q,H,V,$,G,X):await _e(q,J,Y,Z,Q,H,V,$,G,X)}catch(e){let t=e instanceof Error?e:Error(String(e));G.error(t.message),G.debug(t.stack??``)}finally{Q.length>0&&await L(Q,G)}const Te=performance.now()-we;G.info(`Total run time: ${Math.round(Te)}ms`),G.info(`Input tokens: ${$.in}`),G.info(`Output tokens: ${$.out}`),G.info(`Complete. Goodbye`),G.end(),await U.flush();export{};
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{A as e,C as t,D as n,E as r,M as i,N as a,O as o,P as s,S as c,_ as l,b as u,d,f,g as p,h as m,i as h,j as g,k as _,l as v,m as y,n as b,p as x,r as S,t as C,u as w,v as T,w as E,x as D,y as O}from"./ProceduralMemory-g6rvICO7.js";const k={Models:c,DefaultModel:D},A={Models:T,DefaultModel:l},j={Models:x,DefaultModel:f};export{r as Agent,k as Anthropic,s as AxleStopReason,A as Gemini,n as History,t as Instruct,i as LocalFileStore,h as MCP,j as OpenAI,C as ProceduralMemory,b as SimpleWriter,S as Tracer,g as TurnBuilder,u as anthropic,w as braveSearchTool,v as calculatorTool,O as chatCompletions,o as compileInstruct,e as createHandle,p as gemini,y as generate,m as generateTurn,E as loadFileContent,d as openai,_ as parseResponse,a as stream};
|
package/package.json
CHANGED
|
@@ -1,18 +1,16 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fifthrevision/axle",
|
|
3
|
-
"version": "0.10.
|
|
3
|
+
"version": "0.10.1",
|
|
4
4
|
"repository": {
|
|
5
5
|
"type": "git",
|
|
6
6
|
"url": "git+https://github.com/johncch/axle.git"
|
|
7
7
|
},
|
|
8
8
|
"description": "axle is a command line tool for running workflows against LLM APIs.",
|
|
9
9
|
"type": "module",
|
|
10
|
-
"main": "./dist/index.js",
|
|
11
|
-
"types": "./dist/index.d.ts",
|
|
12
10
|
"exports": {
|
|
13
11
|
".": {
|
|
14
|
-
"
|
|
15
|
-
"
|
|
12
|
+
"types": "./dist/index.d.ts",
|
|
13
|
+
"import": "./dist/index.js"
|
|
16
14
|
}
|
|
17
15
|
},
|
|
18
16
|
"bin": {
|
|
@@ -51,10 +49,12 @@
|
|
|
51
49
|
"zod": "^4.3.6"
|
|
52
50
|
},
|
|
53
51
|
"devDependencies": {
|
|
52
|
+
"@arethetypeswrong/core": "^0.18.2",
|
|
54
53
|
"@types/marked-terminal": "^6.1.1",
|
|
55
54
|
"dotenv": "^17.4.0",
|
|
56
55
|
"prettier": "^3.8.1",
|
|
57
56
|
"prettier-plugin-organize-imports": "^4.3.0",
|
|
57
|
+
"publint": "^0.3.18",
|
|
58
58
|
"tsdown": "^0.21.7",
|
|
59
59
|
"tsx": "^4.21.0",
|
|
60
60
|
"typescript": "^6.0.2",
|
package/dist/index.mjs
DELETED
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
import e,{access as t,readFile as n,stat as r}from"node:fs/promises";import i,{extname as a,resolve as o}from"node:path";import*as s from"zod";import c,{z as l}from"zod";import"glob";import u from"mime";import d from"@anthropic-ai/sdk";import{FinishReason as f,GoogleGenAI as p}from"@google/genai";import m from"openai";import{exec as h}from"node:child_process";import{promisify as g}from"node:util";import{Client as _}from"@modelcontextprotocol/sdk/client/index.js";import{StdioClientTransport as v}from"@modelcontextprotocol/sdk/client/stdio.js";import{StreamableHTTPClientTransport as y}from"@modelcontextprotocol/sdk/client/streamableHttp.js";import{marked as b}from"marked";import{markedTerminal as x}from"marked-terminal";import S from"node:crypto";var C=class e extends Error{code;id;details;constructor(t,n){super(t,{cause:n?.cause}),this.name=this.constructor.name,this.code=n?.code||`AXLE_ERROR`,this.id=n?.id,this.details=n?.details,Object.setPrototypeOf(this,e.prototype)}toJSON(){return{name:this.name,message:this.message,code:this.code,...this.id?{id:this.id}:{},...this.details?{details:this.details}:{},...this.cause?{cause:w(this.cause)}:{}}}};function w(e){return e instanceof Error?{name:e.name,message:e.message,...e.stack?{stack:e.stack}:{},...`cause`in e&&e.cause?{cause:w(e.cause)}:{}}:e}function T(e){let{text:t,files:n}=e,r=[];if(t&&r.push({type:`text`,text:t}),n)for(let e of n)r.push({type:`file`,file:e});return r}function E(e){return e.filter(e=>e.type===`text`).map(e=>e.text).join(`
|
|
2
|
-
|
|
3
|
-
`)}function D(e){return e.filter(e=>e.type===`tool-call`)}function O(e,t){let n=t.usage??{in:0,out:0};e.in+=n.in??0,e.out+=n.out??0}function k(e){return JSON.stringify({error:e})}async function ee(e,t=async()=>null,n){let r=[];for(let i of e){let e=n?.startSpan(i.name,{type:`tool`}),a;try{a=await t(i.name,i.parameters)}catch(e){a={type:`error`,error:{type:`exception`,message:e instanceof Error?e.message:String(e)}}}if(a==null){let t=`Tool not found: ${i.name}`;e?.setResult({kind:`tool`,name:i.name,input:i.parameters,output:{type:`not-found`,message:t}}),e?.end(`error`),r.push({id:i.id,name:i.name,content:k({type:`not-found`,message:t}),isError:!0});continue}a.type===`success`?(e?.setResult({kind:`tool`,name:i.name,input:i.parameters,output:a.content}),e?.end(`ok`),r.push({id:i.id,name:i.name,content:a.content})):(e?.setResult({kind:`tool`,name:i.name,input:i.parameters,output:a.error}),e?.end(`error`),r.push({id:i.id,name:i.name,content:k(a.error),isError:!0}))}return{results:r}}let A=function(e){return e.Stop=`stop`,e.Length=`length`,e.FunctionCall=`function_call`,e.Error=`error`,e.Custom=`custom`,e.Cancelled=`cancelled`,e}({});function j(e,t){for(let n of e)n(t)}function te(e){return{type:`error`,error:{type:`not-found`,message:`Tool not found: ${e}`}}}function M(e){let t=[],n=new AbortController,r=e.signal?AbortSignal.any([n.signal,e.signal]):n.signal,{promise:i,resolve:a,reject:o}=Promise.withResolvers();return Promise.resolve().then(()=>N(e,r,t).then(a,o)),{on(e){t.push(e)},cancel(){n.abort()},get final(){return i}}}async function N(e,t,n){let{provider:r,model:i,messages:a,system:o,tools:s,serverTools:c,onToolCall:l,maxIterations:u,tracer:d,options:f}=e,p=[...a],m=[],h={in:0,out:0},g=0,_=0,v=e=>{p.push(e),m.push(e)},y=e=>{e.result===`error`&&j(n,{type:`error`,error:e.error});let t=e.result===`success`?e.final?.content:e.result===`cancelled`?e.partial?.content:null,r=e.result===`success`?e.final?.finishReason:e.result===`cancelled`?A.Cancelled:void 0;return d?.setResult({kind:`llm`,model:i,request:{messages:a},response:{content:t??null},usage:e.usage?{inputTokens:e.usage.in,outputTokens:e.usage.out}:void 0,finishReason:r}),d?.end(e.result===`error`?`error`:`ok`),e},b=(e,t,n,r)=>{r();let i=e.length>0?{role:`assistant`,id:t,model:n,content:e,finishReason:A.Cancelled}:void 0;return i&&v(i),d?.end(`ok`),{result:`cancelled`,messages:m,partial:i,usage:h}};for(;;){if(t.aborted)return b([],``,``,()=>{});if(u!==void 0&&_>=u)return y({result:`error`,messages:m,error:{type:`model`,error:{type:`error`,error:{type:`MaxIterations`,message:`Exceeded max iterations (${u})`}}},usage:h});_+=1;let e=d?.startSpan(`turn-${_}`,{type:`llm`}),a=c?{...f,serverTools:c}:f,x=r.createStreamingRequest?.(i,{messages:p,system:o,tools:s,context:{tracer:e},signal:t,options:a});if(!x)throw e?.end(`error`),Error(`Provider does not support streaming. Use generate() instead.`);let S=[],C=``,w=``,T=null,E={in:0,out:0},D=-1,O=null,k=``,M=new Map,N=-1,P=()=>{O!==null&&D>=0&&(j(n,{type:O===`text`?`text:end`:`thinking:end`,index:D,final:k}),O=null,k=``,D=-1)};for await(let r of x){switch(r.type){case`start`:C=r.id,w=r.data.model,j(n,{type:`turn:start`,id:C,model:w});break;case`text-start`:P(),S.push({type:`text`,text:``}),N=S.length-1,D=g++,O=`text`,k=``,j(n,{type:`text:start`,index:D});break;case`text-delta`:{let e=S[N];e.text+=r.data.text,k=e.text,j(n,{type:`text:delta`,index:D,delta:r.data.text,accumulated:k});break}case`text-complete`:P();break;case`thinking-start`:P(),S.push({type:`thinking`,text:``}),N=S.length-1,D=g++,O=`thinking`,k=``,j(n,{type:`thinking:start`,index:D});break;case`thinking-delta`:{let e=S[N];e.text+=r.data.text,k=e.text,j(n,{type:`thinking:delta`,index:D,delta:r.data.text,accumulated:k});break}case`thinking-summary-delta`:{let e=S[N];e.text+=r.data.text,k=e.text,j(n,{type:`thinking:delta`,index:D,delta:r.data.text,accumulated:k});break}case`thinking-complete`:P();break;case`tool-call-start`:{P();let e=g++;S.push({type:`tool-call`,id:r.data.id,name:r.data.name,parameters:{}}),N=S.length-1,M.set(r.data.id,e),j(n,{type:`tool:request`,index:e,id:r.data.id,name:r.data.name});break}case`tool-call-complete`:{let e=S[N];r.data.id&&(e.id=r.data.id),r.data.name&&(e.name=r.data.name),e.parameters=r.data.arguments,r.data.providerMetadata&&(e.providerMetadata=r.data.providerMetadata);break}case`internal-tool-start`:{P();let e=g++;S.push({type:`internal-tool`,id:r.data.id,name:r.data.name}),N=S.length-1,j(n,{type:`internal-tool:start`,index:e,id:r.data.id,name:r.data.name});break}case`internal-tool-complete`:{let e=S[N];r.data.output!=null&&(e.output=r.data.output),j(n,{type:`internal-tool:complete`,index:r.data.index,id:r.data.id,name:r.data.name,output:r.data.output});break}case`complete`:P(),T=r.data.finishReason,E=r.data.usage;break;case`error`:{P();let t=r.data.usage??{in:0,out:0};return h.in+=t.in??0,h.out+=t.out??0,e?.end(`error`),y({result:`error`,messages:m,error:{type:`model`,error:{type:`error`,error:{type:r.data.type,message:r.data.message}}},usage:h})}default:console.warn(`[WARN] Unhandled chunk type. Should never happen`)}if(t.aborted)break}if(t.aborted)return e?.end(`ok`),b(S,C,w,P);if(T===null)return P(),e?.end(`error`),y({result:`error`,messages:m,error:{type:`model`,error:{type:`error`,error:{type:`IncompleteStream`,message:`Stream ended without a completion signal`}}},usage:h});h.in+=E.in??0,h.out+=E.out??0;let F={kind:`llm`,model:w,request:{messages:p},response:{content:S},usage:{inputTokens:E.in,outputTokens:E.out},finishReason:T};e?.setResult(F),e?.end();let I={role:`assistant`,id:C,model:w,content:S,finishReason:T};if(v(I),j(n,{type:`turn:complete`,message:I,usage:E}),T!==A.FunctionCall)return y({result:`success`,messages:m,final:I,usage:h});let L=S.filter(e=>e.type===`tool-call`);if(L.length===0)return y({result:`success`,messages:m,final:I,usage:h});if(t.aborted)return d?.end(`ok`),{result:`cancelled`,messages:m,usage:h};let R=crypto.randomUUID();j(n,{type:`tool-results:start`,id:R});let z=0,{results:B}=await ee(L,async(e,t)=>{let r=L[z++],i=M.get(r.id)??-1;j(n,{type:`tool:exec-start`,index:i,id:r.id,name:e,parameters:t});let a=(l?await l(e,t):null)??te(e);return j(n,{type:`tool:exec-complete`,index:i,id:r.id,name:e,result:a}),a},d);if(B.length>0){let e={role:`tool`,id:R,content:B};v(e),j(n,{type:`tool-results:complete`,message:e})}}}var P=class{rootPath;constructor(e){this.rootPath=e}async read(t){let n=i.join(this.rootPath,t);try{return await e.readFile(n,`utf-8`)}catch{return null}}async write(t,n){let r=i.join(this.rootPath,t);await e.mkdir(i.dirname(r),{recursive:!0}),await e.writeFile(r,n,`utf-8`)}},F=class{currentTurn=null;currentTextPart=null;currentThinkingPart=null;toolIdMap=new Map;accumulatedUsage={in:0,out:0};createUserTurn(e){let t=e.id??crypto.randomUUID(),n=[];if(typeof e.content==`string`)n.push({id:crypto.randomUUID(),type:`text`,text:e.content});else for(let t of e.content)t.type===`text`?n.push({id:crypto.randomUUID(),type:`text`,text:t.text}):t.type===`file`&&n.push({id:crypto.randomUUID(),type:`file`,file:t.file});let r={id:t,owner:`user`,parts:n,status:`complete`};return{turn:r,events:[{type:`turn:user`,turn:r}]}}startAgentTurn(){let e=crypto.randomUUID(),t={id:e,owner:`agent`,parts:[],status:`streaming`};return this.currentTurn=t,this.currentTextPart=null,this.currentThinkingPart=null,this.toolIdMap.clear(),this.accumulatedUsage={in:0,out:0},{turn:t,events:[{type:`turn:start`,turnId:e}]}}handleStreamEvent(e){let t=this.currentTurn;if(!t)return[];let n=[];switch(e.type){case`turn:start`:break;case`text:start`:{this.closeOpenParts(t,n);let e={id:crypto.randomUUID(),type:`text`,text:``};t.parts.push(e),this.currentTextPart=e,n.push({type:`part:start`,turnId:t.id,part:{...e}});break}case`text:delta`:this.currentTextPart&&(this.currentTextPart.text=e.accumulated,n.push({type:`text:delta`,turnId:t.id,partId:this.currentTextPart.id,delta:e.delta}));break;case`text:end`:this.currentTextPart&&=(this.currentTextPart.text=e.final,n.push({type:`part:end`,turnId:t.id,partId:this.currentTextPart.id}),null);break;case`thinking:start`:{this.closeOpenParts(t,n);let e={id:crypto.randomUUID(),type:`thinking`,text:``};t.parts.push(e),this.currentThinkingPart=e,n.push({type:`part:start`,turnId:t.id,part:{...e}});break}case`thinking:delta`:this.currentThinkingPart&&(this.currentThinkingPart.text=e.accumulated,n.push({type:`thinking:delta`,turnId:t.id,partId:this.currentThinkingPart.id,delta:e.delta}));break;case`thinking:end`:this.currentThinkingPart&&=(this.currentThinkingPart.text=e.final,n.push({type:`part:end`,turnId:t.id,partId:this.currentThinkingPart.id}),null);break;case`tool:request`:{this.closeOpenParts(t,n);let r=crypto.randomUUID(),i={id:r,type:`action`,kind:`tool`,status:`pending`,detail:{name:e.name,parameters:{}}};t.parts.push(i),this.toolIdMap.set(e.id,{partId:r,turnId:t.id}),n.push({type:`part:start`,turnId:t.id,part:{...i,detail:{...i.detail}}});break}case`tool:exec-start`:{let r=this.toolIdMap.get(e.id);if(r){let i=this.findActionPart(t,r.partId);i&&(i.status=`running`,i.detail.parameters=e.parameters,n.push({type:`action:running`,turnId:t.id,partId:r.partId,parameters:e.parameters}))}break}case`tool:exec-complete`:{let r=this.toolIdMap.get(e.id);if(r){let i=this.findActionPart(t,r.partId);i&&(e.result.type===`success`?(i.status=`complete`,i.detail.result={type:`success`,content:e.result.content},n.push({type:`action:complete`,turnId:t.id,partId:r.partId,result:i.detail.result})):(i.status=`error`,i.detail.result={type:`error`,error:e.result.error},n.push({type:`action:error`,turnId:t.id,partId:r.partId,error:e.result.error})))}break}case`internal-tool:start`:{this.closeOpenParts(t,n);let r=crypto.randomUUID(),i={id:r,type:`action`,kind:`internal-tool`,status:`running`,detail:{name:e.name}};t.parts.push(i),this.toolIdMap.set(e.id,{partId:r,turnId:t.id}),n.push({type:`part:start`,turnId:t.id,part:{...i,detail:{...i.detail}}}),n.push({type:`action:running`,turnId:t.id,partId:r});break}case`internal-tool:complete`:{let r=this.toolIdMap.get(e.id);if(r){let i=this.findActionPart(t,r.partId);i&&(i.status=`complete`,i.detail.result={type:`success`,content:e.output},n.push({type:`action:complete`,turnId:t.id,partId:r.partId,result:i.detail.result}))}break}case`turn:complete`:{this.closeOpenParts(t,n);let r=e.usage??{in:0,out:0};this.accumulatedUsage.in+=r.in,this.accumulatedUsage.out+=r.out;break}case`tool-results:start`:case`tool-results:complete`:break;case`error`:{let t=e.error,r=t.type===`model`?t.error.error.message:`Tool error (${t.error.name}): ${t.error.message}`;n.push({type:`error`,error:{type:t.type,message:r}});break}}return n}finalizeTurn(e=`complete`){let t=this.currentTurn;if(!t)return[];let n=[];return this.closeOpenParts(t,n),t.status=e,t.usage={...this.accumulatedUsage},n.push({type:`turn:end`,turnId:t.id,status:e,usage:t.usage}),this.currentTurn=null,n}closeOpenParts(e,t){this.currentTextPart&&=(t.push({type:`part:end`,turnId:e.id,partId:this.currentTextPart.id}),null),this.currentThinkingPart&&=(t.push({type:`part:end`,turnId:e.id,partId:this.currentThinkingPart.id}),null)}findActionPart(e,t){return e.parts.find(e=>e.id===t&&e.type===`action`)}};function I(e){return Array.isArray(e)?e:[e]}function L(e){return new Promise(t=>setTimeout(t,e))}function R(e){return e.then(()=>{},()=>{})}function z(e,t,n){let r=new AbortController,i=n?AbortSignal.any([n,r.signal]):r.signal,a=e.then(()=>t(i));return{handle:{cancel:()=>r.abort(),get final(){return a}},settled:R(a)}}function B(e,t,n={}){let{placeholderStyle:r=`{{}}`,strict:i=!1}=n,a=r===`{{}}`?/\{\{(.*?)\}\}/g:/\{(.*?)\}/g,o=[];if(e=e.replace(a,(e,n)=>{if(n=n.trim(),Object.prototype.hasOwnProperty.call(t,n)){let e=t[n];return e==null?``:String(e)}return i&&o.push(n),e}),o.length>0){let e=[...new Set(o)];throw Error(`Missing variable${e.length>1?`s`:``}: ${e.join(`, `)}. Pass them as --args key=value or use --allow-missing-vars to suppress this error.`)}return e}function V(e){if(e instanceof s.ZodString)return[`string`,`Your answer`];if(e instanceof s.ZodNumber)return[`number`,42];if(e instanceof s.ZodBoolean)return[`boolean`,!0];if(e instanceof s.ZodArray){let t=e.element;if(t instanceof s.ZodString)return[`string array`,[`answer 1`,`answer 2`,`third answer`]];if(t instanceof s.ZodNumber)return[`number array`,[42,59,3.14]];if(t instanceof s.ZodBoolean)return[`boolean array`,[!0,!1,!1]];if(t instanceof s.ZodObject){let[,e]=V(t);return[`object array`,[e,e]]}return[`array`,[]]}if(e instanceof s.ZodObject){let t=e.shape,n={};for(let[e,r]of Object.entries(t)){let[,t]=V(r);n[e]=t}return[`JSON object`,n]}if(e instanceof s.ZodOptional){let[t,n]=V(e.unwrap());return[`${t} | undefined`,n]}throw Error(`Unsupported Zod schema: ${e.constructor.name}`)}function H(e,t){if(!t)return e;if(Object.keys(t).length===0){if(e.trim()===`{}`||e.trim()===``)return{};throw Error(`Schema is empty, but rawValue is not an empty object representation or empty string.`)}let n=ne(e),r={};for(let[e,i]of Object.entries(t)){let t=n.tags[e];if(t!==void 0)r[e]=U(i,t);else if(i.def.type!==`optional`)throw Error(`Expected results with tag ${e} but it does not exist`)}try{let e={};for(let[n,i]of Object.entries(t))n in r&&(e[n]=i.parse(r[n]));return e}catch(e){if(e&&typeof e==`object`&&`issues`in e){let t=e.issues.map(e=>`${e.path.join(`.`)}: ${e.message}`).join(`, `);throw Error(`Validation failed: ${t}`)}throw e}}function U(e,t){switch(t=t.trim(),e.def.type){case`string`:try{return JSON.parse(t)}catch{if(typeof t==`string`)return t;throw Error(`Cannot parse '${t}' as string. Ensure it is a valid JSON string or a plain string.`)}case`number`:{let e=parseFloat(t);if(isNaN(e))throw Error(`Cannot parse '${t}' as number`);return e}case`boolean`:{let e=t.toLowerCase();if(e===`true`)return!0;if(e===`false`)return!1;throw Error(`Cannot parse '${t}' as boolean. Expected 'true' or 'false'`)}case`array`:if(t===``)return[];try{let e=JSON.parse(t);if(Array.isArray(e))return e}catch{}if(t.includes(`,`))return t.split(`,`).map(e=>{let t=e.trim();try{return JSON.parse(t)}catch{return t}}).filter(e=>e!==``);case`object`:t.includes("```json")&&(t=t.replace(/```json/g,``).replace(/```/g,``));try{return JSON.parse(t)}catch(e){throw Error(`Cannot parse object as JSON: ${e.message}`)}case`optional`:{let n=e.def.innerType;return U(n,t)}default:return t}}function ne(e){e.trim().startsWith("```json")&&e.trim().endsWith("```")&&(e=e.trim().slice(7,-3).trim());let t=/<(\w+)>(.*?)<\/\1>/gs,n={},r=e;return r=r.replace(t,(e,t,r)=>(n[t]=r,``)),r=r.replace(/<(\w+)>(.*?)(?:<\/?\w+>|$)/gs,(e,t,r)=>(n[t]=r,``)),{tags:n,remaining:r.trim()}}function W(e,t={},n={}){let r={...t,...e.inputs},i=B(e.prompt,r,{strict:n.strictVariables});if(e.textReferences.length>0)for(let[t,n]of e.textReferences.entries()){let e=n.name?`: ${n.name}`:``;i+=`\n\n## Reference ${t+1}${e}\n\n\`\`\`${n.content}'''`}let a=`# Instructions
|
|
4
|
-
|
|
5
|
-
`;if((e.schema?Object.keys(e.schema):[]).length>0){a+=`## Output Format Instructions
|
|
6
|
-
`,a+=`
|
|
7
|
-
Here is how you should format your output. Follow the instructions strictly.
|
|
8
|
-
`;for(let[t,n]of Object.entries(e.schema)){let[e,r]=V(n);a+=`\n- Use <${t}></${t}> tags to indicate the answer for ${t}. The answer must be a ${e}.\n Example: <${t}>${JSON.stringify(r)}</${t}>\n`}}if(e.instructions.length>0){a+=`
|
|
9
|
-
## Additional Instructions
|
|
10
|
-
|
|
11
|
-
`;for(let t of e.instructions)a+=`- ${t}\n`}return a+i}var G=class{_turns=[];_log=[];constructor(e){e?.turns&&(this._turns=e.turns),e?.log&&(this._log=e.log)}get turns(){return[...this._turns]}get log(){return[...this._log]}addTurn(e){this._turns.push(e)}appendToLog(e){Array.isArray(e)?this._log.push(...e):this._log.push(e)}latestTurn(){return this._turns[this._turns.length-1]}toString(){return JSON.stringify({turns:this._turns})}};function re(e){return e.type===`server`}var ie=class{provider;model;history;tracer;name;scope;store;system;tools={};serverTools=[];mcps=[];mcpToolsResolved=!1;memory;options;eventCallbacks=[];sendQueue=Promise.resolve();constructor(e){if(this.provider=e.provider,this.model=e.model,this.history=new G,this.tracer=e.tracer,this.system=e.system,this.name=e.name,this.scope=e.scope,this.store=new P(`.axle`),this.options=e.options??{},e.tools&&this.addTools(e.tools),e.mcps&&(this.mcps=[...e.mcps]),e.memory){if(!e.name)throw new C(`Agent requires a 'name' when memory is provided. The name is used to partition memory storage.`);this.memory=e.memory;let t=e.memory.tools?.();t&&this.addTools(t)}}addTool(e){re(e)?this.serverTools.push(e):this.tools[e.name]=e}addTools(e){for(let t of e)this.addTool(t)}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,t){let n,r;if(typeof e==`string`)r={role:`user`,id:crypto.randomUUID(),content:[{type:`text`,text:e}]};else{let i=W(e,t?.variables,{strictVariables:this.options.strictVariables}),a=e.files;r={role:`user`,id:crypto.randomUUID(),content:T({text:i,files:a})},n=e.schema}let{handle:i,settled:a}=z(this.sendQueue,e=>this.run(r,n,e),t?.signal);return this.sendQueue=a,i}async resolveMcpTools(){if(!this.mcpToolsResolved){this.tracer?.debug(`resolving MCP tools`,{count:this.mcps.length});for(let e of this.mcps){let t=await e.listTools({prefix:e.name,tracer:this.tracer});this.addTools(t)}this.mcpToolsResolved=!0}}emitEvent(e){for(let t of this.eventCallbacks)t(e)}async run(e,t,n){let r=new F;await this.resolveMcpTools();let i=this.system,a=[...this.history.log,e];if(this.memory){let e=await this.memory.recall({name:this.name,scope:this.scope,system:this.system,messages:a,store:this.store,tracer:this.tracer});e.systemSuffix&&(i=(i??``)+`
|
|
12
|
-
|
|
13
|
-
`+e.systemSuffix)}if(n.aborted)return{response:null,turn:void 0,usage:{in:0,out:0}};let{turn:o,events:s}=r.createUserTurn(e);this.history.addTurn(o),this.history.appendToLog(e);for(let e of s)this.emitEvent(e);let c=this.tools,l=Object.values(c).map(e=>({name:e.name,description:e.description,schema:e.schema})),{turn:u,events:d}=r.startAgentTurn();this.history.addTurn(u);for(let e of d)this.emitEvent(e);let f=M({provider:this.provider,model:this.model,messages:a,system:i,tools:l.length>0?l:void 0,serverTools:this.serverTools.length>0?this.serverTools:void 0,tracer:this.tracer,onToolCall:async(e,t)=>{let n=c[e];if(!n)return null;try{return{type:`success`,content:await n.execute(t)}}catch(e){return{type:`error`,error:{type:`execution`,message:e instanceof Error?e.message:String(e)}}}},signal:n});f.on(e=>{let t=r.handleStreamEvent(e);for(let e of t)this.emitEvent(e)});let p=await f.final,m=p.result===`cancelled`?`cancelled`:p.result===`error`?`error`:`complete`;p.messages.length>0&&this.history.appendToLog(p.messages);let h=r.finalizeTurn(m);for(let e of h)this.emitEvent(e);if(p.result===`error`)throw new C(ae(p.error),{code:p.error.type===`model`?`MODEL_ERROR`:`TOOL_ERROR`,details:{error:p.error}});let g=null;if(p.result===`success`&&(p.final&&(g=H(E(p.final.content),t)),this.memory))try{await this.memory.record({name:this.name,scope:this.scope,system:this.system,messages:this.history.log,newMessages:p.messages,store:this.store,tracer:this.tracer})}catch(e){this.tracer?.warn(`memory record failed`,{error:e instanceof Error?e.message:String(e)})}let _=p.usage??{in:0,out:0};return{response:g,turn:u,usage:_}}};function ae(e){return e.type===`model`?`Model error: ${e.error.error.message}`:`Tool error (${e.error.name}): ${e.error.message}`}const K=20*1024*1024;function oe(e){return e.type===`text`}function se(e){return e.type===`image`||e.type===`document`}const ce=new Set([`application/json`,`application/xml`,`application/yaml`,`application/x-yaml`,`application/toml`]);function le(e){return e.startsWith(`text/`)||ce.has(e)}function ue(e){let t=u.getType(e);if(!t){let t=a(e).toLowerCase();throw Error(`Unsupported file type: ${t||`(no extension)`}`)}if(t.startsWith(`image/`))return{type:`image`,mimeType:t};if(t===`application/pdf`)return{type:`document`,mimeType:t};if(le(t))return{type:`text`,mimeType:t};{let n=a(e).toLowerCase();throw Error(`Unsupported file type: ${n} (${t})`)}}async function de(e,i){let a=o(e);try{await t(a)}catch{throw Error(`File not found: ${e}`)}let s=await r(a);if(s.size>K)throw Error(`File too large: ${s.size} bytes. Maximum allowed: ${K} bytes`);let c=a.split(`/`).pop()||``,l=ue(a);if((i||(l.type===`text`?`utf-8`:`base64`))===`utf-8`){if(l.type!==`text`)throw Error(`Cannot read ${l.type} file as text: ${e}`);return{path:a,content:await n(a,`utf-8`),mimeType:l.mimeType,size:s.size,name:c,type:`text`}}else{if(l.type===`text`)throw Error(`Cannot read text file as binary: ${e}`);return{path:a,base64:(await n(a)).toString(`base64`),mimeType:l.mimeType,size:s.size,name:c,type:l.type}}}var fe=class{prompt;inputs={};files=[];textReferences=[];instructions=[];schema;constructor(e,t){this.prompt=e,this.schema=t}setInputs(e){this.inputs=e}addInput(e,t){this.inputs[e]=t}addFile(e,t){if(typeof e==`string`){this.textReferences.push({content:e,name:t?.name});return}se(e)?this.files.push(e):oe(e)&&this.textReferences.push({content:e.content,name:t?.name??e.name})}addInstructions(e){if(typeof e!=`string`||e.trim()===``)throw Error(`Instruction must be a non-empty string`);this.instructions.push(e)}hasFiles(){return this.files.length>0}};const q={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_SONNET_4_5_20250929:`claude-sonnet-4-5-20250929`,CLAUDE_SONNET_4_5:`claude-sonnet-4-5-20250929`,CLAUDE_HAIKU_4_5_20251001:`claude-haiku-4-5-20251001`,CLAUDE_HAIKU_4_5:`claude-haiku-4-5-20251001`,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`};q.CLAUDE_SONNET_4_6,q.CLAUDE_OPUS_4_6,q.CLAUDE_OPUS_4_5_20251101,q.CLAUDE_SONNET_4_5_20250929,q.CLAUDE_HAIKU_4_5_20251001,q.CLAUDE_OPUS_4_1_20250805,q.CLAUDE_OPUS_4_20250514,q.CLAUDE_SONNET_4_20250514,q.CLAUDE_3_HAIKU_20240307;const pe=q.CLAUDE_HAIKU_4_5;function J(e){if(e==null)return{type:`error`,error:{type:`Undetermined`,message:`Unknown error occurred`},usage:{in:0,out:0},raw:e};if(e instanceof Error)return{type:`error`,error:{type:e.name||`Error`,message:e.message||`Unexpected error`},usage:{in:0,out:0},raw:e};if(typeof e==`object`){let t=e,n=t?.error?.error?.type||t?.error?.type||t?.type||t?.code||t?.status||`Undetermined`,r=t?.error?.error?.message||t?.error?.message||t?.message||t?.error||`Unexpected error`;return{type:`error`,error:{type:String(n),message:String(r)},usage:{in:0,out:0},raw:e}}return{type:`error`,error:{type:`Undetermined`,message:String(e)},usage:{in:0,out:0},raw:e}}function Y(e){return e.map(e=>{if(e.role===`assistant`){let t=[];for(let n of e.content)n.type===`text`?t.push({type:`text`,text:n.text}):n.type===`thinking`?n.redacted?t.push({type:`redacted_thinking`,data:n.text}):n.signature&&t.push({type:`thinking`,thinking:n.text,signature:n.signature}):n.type===`tool-call`?t.push({type:`tool_use`,id:n.id,name:n.name,input:n.parameters}):n.type===`internal-tool`&&(t.push({type:`server_tool_use`,id:n.id,name:n.name,input:n.input??{}}),n.output!=null&&t.push({type:`web_search_tool_result`,tool_use_id:n.id,content:n.output}));return{role:`assistant`,content:t}}if(e.role===`tool`)return{role:`user`,content:e.content.map(e=>({type:`tool_result`,tool_use_id:e.id,content:typeof e.content==`string`?e.content:_e(e.content),...e.isError?{is_error:!0}:{}}))};if(typeof e.content==`string`)return{role:`user`,content:e.content};{let t=[];for(let n of e.content)n.type===`text`?t.push({type:`text`,text:n.text}):n.type===`file`&&(n.file.type===`image`?n.file.base64&&t.push({type:`image`,source:{type:`base64`,media_type:n.file.mimeType,data:n.file.base64}}):n.file.type===`document`&&n.file.mimeType===`application/pdf`&&n.file.base64&&t.push({type:`document`,source:{type:`base64`,media_type:`application/pdf`,data:n.file.base64}}));return{role:`user`,content:t}}})}function X(e){return e.map(e=>{let t=c.toJSONSchema(e.schema);if(!ge(t))throw Error(`Schema for tool ${e.name} must be an object type`);return{name:e.name,description:e.description,input_schema:t}})}function me(e){let t=[];for(let n of e)if(n.type===`text`)t.push({type:`text`,text:n.text});else if(n.type===`thinking`)t.push({type:`thinking`,text:n.text||``,redacted:!1});else if(n.type===`redacted_thinking`)t.push({type:`thinking`,text:n.text||``,redacted:!0});else if(n.type===`tool_use`){if(typeof n.input!=`object`||n.input===null||Array.isArray(n.input))throw Error(`Invalid tool call input for ${n.name}: expected object, got ${typeof n.input}`);t.push({type:`tool-call`,id:n.id,name:n.name,parameters:n.input})}return t}function he(e){switch(e){case`max_tokens`:return A.Length;case`end_turn`:return A.Stop;case`stop_sequence`:return A.Stop;case`tool_use`:return A.FunctionCall;default:return A.Error}}function ge(e){return e&&typeof e==`object`&&e.type===`object`}function _e(e){return e.map(e=>e.type===`text`?{type:`text`,text:e.text}:{type:`image`,source:{type:`base64`,media_type:e.mimeType,data:e.data}})}async function ve(e){let{client:t,model:n,messages:r,system:i,tools:a,context:o,options:s}=e,c=o?.tracer,{stop:l,max_tokens:u,...d}=s??{},f={model:n,max_tokens:u??16e3,messages:Y(r),...i&&{system:i},...l&&{stop_sequences:I(l)},...a&&{tools:X(a)},...d};c?.debug(`Anthropic request`,{request:f});let p;try{p=ye(await t.messages.create(f))}catch(e){p=J(e)}return c?.debug(`Anthropic response`,{result:p}),p}function ye(e){let t=he(e.stop_reason);if(t===A.Error)return{type:`error`,error:{type:`Uncaught error`,message:`Stop reason is not recognized or unhandled: ${e.stop_reason}`},usage:{in:e.usage.input_tokens,out:e.usage.output_tokens},raw:e};if(t===A.FunctionCall){let t=me(e.content);return{type:`success`,id:e.id,model:e.model,role:e.role,finishReason:A.FunctionCall,content:t,text:E(t),usage:{in:e.usage.input_tokens,out:e.usage.output_tokens},raw:e}}if(e.type==`message`){let n=me(e.content);return{type:`success`,id:e.id,model:e.model,role:`assistant`,finishReason:t,content:n,text:E(n),usage:{in:e.usage.input_tokens,out:e.usage.output_tokens},raw:e}}return{type:`error`,error:{type:`InvalidResponse`,message:`Unsupported completion type: ${e.type}`},usage:{in:e.usage.input_tokens,out:e.usage.output_tokens},raw:e}}function be(){let e=new Map,t=new Map,n=new Map;function r(r){let i=[];switch(r.type){case`message_start`:i.push({type:`start`,id:r.message.id,data:{model:r.message.model,timestamp:Date.now()}});break;case`message_delta`:r.delta.stop_reason&&i.push({type:`complete`,data:{finishReason:he(r.delta.stop_reason),usage:{in:r.usage?.input_tokens||0,out:r.usage?.output_tokens||0}}});case`message_stop`:break;case`content_block_start`:if(r.content_block.type===`text`)e.set(r.index,`text`),i.push({type:`text-start`,data:{index:r.index}});else if(r.content_block.type===`tool_use`){e.set(r.index,`tool`);let t=r.content_block;n.set(r.index,{id:t.id,name:t.name,argumentsBuffer:``}),i.push({type:`tool-call-start`,data:{index:r.index,id:t.id,name:t.name}})}else if(r.content_block.type===`thinking`)e.set(r.index,`thinking`),i.push({type:`thinking-start`,data:{index:r.index,redacted:!1}});else if(r.content_block.type===`redacted_thinking`)e.set(r.index,`thinking`),i.push({type:`thinking-start`,data:{index:r.index,redacted:!0}});else if(r.content_block.type===`server_tool_use`){e.set(r.index,`internal-tool`);let n=r.content_block;t.set(n.id,{index:r.index,name:n.name}),i.push({type:`internal-tool-start`,data:{index:r.index,id:n.id,name:n.name}})}else if(r.content_block.type===`web_search_tool_result`){let e=r.content_block,n=t.get(e.tool_use_id);n&&(i.push({type:`internal-tool-complete`,data:{index:n.index,id:e.tool_use_id,name:n.name,output:e.content}}),t.delete(e.tool_use_id))}break;case`content_block_delta`:if(r.delta.type===`text_delta`)i.push({type:`text-delta`,data:{text:r.delta.text,index:r.index}});else if(r.delta.type===`input_json_delta`){let e=n.get(r.index);e&&(e.argumentsBuffer+=r.delta.partial_json)}else r.delta.type===`thinking_delta`?i.push({type:`thinking-delta`,data:{text:r.delta.thinking,index:r.index}}):r.delta.type===`signature_delta`||r.delta.type;break;case`content_block_stop`:{let t=e.get(r.index);if(t===`text`)i.push({type:`text-complete`,data:{index:r.index}});else if(t===`thinking`)i.push({type:`thinking-complete`,data:{index:r.index}});else if(t!==`internal-tool`&&t===`tool`){let e=n.get(r.index);if(e){try{let t=e.argumentsBuffer?JSON.parse(e.argumentsBuffer):{};i.push({type:`tool-call-complete`,data:{index:r.index,id:e.id,name:e.name,arguments:t}})}catch(t){throw Error(`Failed to parse tool call arguments for ${e.name}: ${t instanceof Error?t.message:String(t)}\nRaw buffer: ${e.argumentsBuffer}`)}n.delete(r.index)}}e.delete(r.index);break}}return i}return{handleEvent:r}}async function*xe(e){let{client:t,model:n,messages:r,system:i,tools:a,runtime:o,signal:s,options:c}=e,l=o?.tracer,{stop:u,max_tokens:d,serverTools:f,...p}=c??{},m=a?X(a):[];if(f){let e={web_search:`web_search_20250305`};for(let t of f){let n=e[t.name]??t.name;m.push({type:n,name:t.name,...t.config})}}let h={model:n,max_tokens:d??Ce(n),messages:Y(r),...i&&{system:i},...u&&{stop_sequences:I(u)},...m.length>0&&{tools:m},...p};l?.debug(`Anthropic streaming request`,{request:h});let g=be();try{let e=await t.messages.create({...h,stream:!0},{signal:s});for await(let t of e){let e=g.handleEvent(t);for(let t of e)yield t}}catch(e){if(s?.aborted)return;yield{type:`error`,data:{type:`STREAMING_ERROR`,message:e instanceof Error?e.message:String(e),raw:e}}}}const Se={[q.CLAUDE_OPUS_4_6]:128e3,[q.CLAUDE_OPUS_4_5_20251101]:64e3,[q.CLAUDE_HAIKU_4_5_20251001]:64e3,[q.CLAUDE_SONNET_4_5_20250929]:64e3,[q.CLAUDE_SONNET_4_20250514]:64e3,[q.CLAUDE_OPUS_4_1_20250805]:32e3,[q.CLAUDE_OPUS_4_20250514]:32e3,[q.CLAUDE_3_HAIKU_20240307]:4096};function Ce(e){return e in Se?Se[e]:e.includes(`opus`)?e.match(/opus-4-[6-9]|opus-[5-9]/)?128e3:64e3:e.includes(`sonnet`)||e.includes(`haiku`)?e.match(/claude-3-[0-5]-/)?8192:64e3:16384}function we(e){let t=new d({apiKey:e});return{name:`anthropic`,async createGenerationRequest(e,n){return await ve({client:t,model:e,...n})},createStreamingRequest(e,n){let{messages:r,system:i,tools:a,context:o,signal:s,options:c}=n;return xe({client:t,model:e,messages:r,system:i,tools:a,runtime:o,signal:s,options:c})}}}const Te={Models:q,DefaultModel:pe};function Ee(e,t){let n=e.map(Oe).flat(1);return t?[{role:`system`,content:t},...n]:n}function De(e){if(e&&e.length>0)return e.map(e=>({type:`function`,function:{name:e.name,description:e.description,parameters:c.toJSONSchema(e.schema)}}))}function Z(e){switch(e){case`stop`:return A.Stop;case`length`:return A.Length;case`tool_calls`:case`function_call`:return A.FunctionCall;case`content_filter`:return A.Error;default:return A.Stop}}function Oe(e){switch(e.role){case`tool`:return ke(e);case`assistant`:return Ae(e);default:return je(e)}}function ke(e){return e.content.map(e=>({role:`tool`,content:typeof e.content==`string`?e.content:e.content.filter(e=>e.type===`text`).map(e=>e.text).join(`
|
|
14
|
-
`),tool_call_id:e.id}))}function Ae(e){let t=e.content.filter(e=>e.type===`tool-call`),n=e.content.filter(e=>e.type===`text`),r=t.length>0?t.map(e=>({type:`function`,id:e.id,function:{name:e.name,arguments:JSON.stringify(e.parameters)}})):void 0;return{role:`assistant`,content:n.map(e=>e.text).join(``),...r&&{tool_calls:r}}}function je(e){if(typeof e.content==`string`)return{role:`user`,content:e.content};let t=e.content.map(Me).filter(e=>e!==null);return t.every(e=>e.type===`text`)?{role:`user`,content:t.map(e=>e.text).join(``)}:{role:`user`,content:t}}function Me(e){return e.type===`text`?{type:`text`,text:e.text}:e.type===`file`&&e.file.type===`image`?{type:`image_url`,image_url:{url:`data:${e.file.mimeType};base64,${e.file.base64}`}}:null}async function Ne(e){let{baseUrl:t,model:n,messages:r,system:i,tools:a,context:o,apiKey:s,options:c}=e,l=o?.tracer,u=Ee(r,i),d=De(a),f={model:n,messages:u,...d&&{tools:d}};c&&(c.temperature!==void 0&&(f.temperature=c.temperature),c.top_p!==void 0&&(f.top_p=c.top_p),c.max_tokens!==void 0&&(f.max_tokens=c.max_tokens),c.frequency_penalty!==void 0&&(f.frequency_penalty=c.frequency_penalty),c.presence_penalty!==void 0&&(f.presence_penalty=c.presence_penalty),c.stop!==void 0&&(f.stop=c.stop)),l?.debug(`ChatCompletions request`,{request:f});let p;try{let e={"Content-Type":`application/json`};s&&(e.Authorization=`Bearer ${s}`);let n=await fetch(`${t}/chat/completions`,{method:`POST`,headers:e,body:JSON.stringify(f)});if(!n.ok){let e=await n.text().catch(()=>``);throw Error(`HTTP error! status: ${n.status}${e?` - ${e}`:``}`)}p=Pe(await n.json())}catch(e){l?.error(`Error fetching ChatCompletions response`,{error:e instanceof Error?e.message:String(e)}),p=J(e)}return l?.debug(`ChatCompletions response`,{result:p}),p}function Pe(e){let t=e.choices?.[0];if(!t)return{type:`error`,error:{type:`ChatCompletionsError`,message:`No choices in response`},usage:{in:0,out:0},raw:e};let n=[];if(t.message.reasoning_content&&n.push({type:`thinking`,text:t.message.reasoning_content}),t.message.content&&n.push({type:`text`,text:t.message.content}),t.message.tool_calls)for(let e of t.message.tool_calls){let t;try{t=JSON.parse(e.function.arguments)}catch(t){throw Error(`Invalid tool call arguments for ${e.function.name}: ${t instanceof Error?t.message:String(t)}`)}if(typeof t!=`object`||!t||Array.isArray(t))throw Error(`Invalid tool call arguments for ${e.function.name}: expected object, got ${typeof t}`);n.push({type:`tool-call`,id:e.id,name:e.function.name,parameters:t})}let r=n.some(e=>e.type===`tool-call`)?Z(`tool_calls`):Z(t.finish_reason);return{type:`success`,id:e.id,model:e.model,role:`assistant`,finishReason:r,content:n,text:E(n),usage:{in:e.usage?.prompt_tokens||0,out:e.usage?.completion_tokens||0},raw:e}}function Fe(){let e=new Map,t=0,n=-1,r=``,i=``,a=null,o,s;function c(e){n<0||(a===`text`?e.push({type:`text-complete`,data:{index:n}}):a===`thinking`&&e.push({type:`thinking-complete`,data:{index:n}}),a=null,n=-1)}function l(l){let u=[];l.usage&&(s={in:l.usage.prompt_tokens,out:l.usage.completion_tokens});let d=l.choices?.[0];if(!d)return u;r||(r=l.id,i=l.model,u.push({type:`start`,id:r,data:{model:i,timestamp:Date.now()}}));let f=d.delta;if(f.reasoning_content&&(a!==`thinking`&&(c(u),n=t++,a=`thinking`,u.push({type:`thinking-start`,data:{index:n}})),u.push({type:`thinking-delta`,data:{index:n,text:f.reasoning_content}})),f.content&&(a!==`text`&&(c(u),n=t++,a=`text`,u.push({type:`text-start`,data:{index:n}})),u.push({type:`text-delta`,data:{text:f.content,index:n}})),f.tool_calls){c(u);for(let n of f.tool_calls){let r=n.index;if(!e.has(r)){let i=t++,a=n.id||`tool-${i}`;e.set(r,{id:a,name:n.function?.name||``,argumentsBuffer:``,partIdx:i}),u.push({type:`tool-call-start`,data:{index:i,id:a,name:n.function?.name||``}})}let i=e.get(r);n.id&&(i.id=n.id),n.function?.name&&(i.name=n.function.name),n.function?.arguments&&(i.argumentsBuffer+=n.function.arguments)}}if(d.finish_reason){c(u);for(let[,t]of e)try{let e=t.argumentsBuffer?JSON.parse(t.argumentsBuffer):{};u.push({type:`tool-call-complete`,data:{index:t.partIdx,id:t.id,name:t.name,arguments:e}})}catch(e){throw Error(`Failed to parse tool call arguments for ${t.name}: ${e instanceof Error?e.message:String(e)}\nRaw buffer: ${t.argumentsBuffer}`)}o=Z(d.finish_reason)}return u}function u(){return o===void 0?[]:[{type:`complete`,data:{finishReason:o,usage:s??{in:0,out:0}}}]}return{handleChunk:l,finalize:u}}async function*Ie(e){let{baseUrl:t,model:n,messages:r,system:i,tools:a,context:o,signal:s,apiKey:c,options:l}=e,u=o?.tracer;l?.serverTools&&u?.warn(`serverTools not supported by ChatCompletions provider`);let d=Ee(r,i),f=De(a),p={model:n,messages:d,stream:!0,stream_options:{include_usage:!0},...f&&{tools:f}};l&&(l.temperature!==void 0&&(p.temperature=l.temperature),l.top_p!==void 0&&(p.top_p=l.top_p),l.max_tokens!==void 0&&(p.max_tokens=l.max_tokens),l.frequency_penalty!==void 0&&(p.frequency_penalty=l.frequency_penalty),l.presence_penalty!==void 0&&(p.presence_penalty=l.presence_penalty),l.stop!==void 0&&(p.stop=l.stop)),u?.debug(`ChatCompletions streaming request`,{request:p});let m=Fe();try{let e={"Content-Type":`application/json`};c&&(e.Authorization=`Bearer ${c}`);let n=await fetch(`${t}/chat/completions`,{method:`POST`,headers:e,body:JSON.stringify(p),signal:s});if(!n.ok){let e=await n.text().catch(()=>``);throw Error(`HTTP error! status: ${n.status}${e?` - ${e}`:``}`)}if(!n.body)throw Error(`Response body is null`);let r=n.body.getReader(),i=new TextDecoder,a=``;for(;;){let{done:e,value:t}=await r.read();if(e)break;a+=i.decode(t,{stream:!0});let n=a.split(`
|
|
15
|
-
`);a=n.pop()||``;for(let e of n){let t=e.trim();if(!t||t.startsWith(`:`)||!t.startsWith(`data: `))continue;let n=t.slice(6);if(n!==`[DONE]`)try{let e=JSON.parse(n),t=m.handleChunk(e);for(let e of t)yield e}catch(e){u?.error(`Error parsing ChatCompletions stream chunk`,{error:e instanceof Error?e.message:String(e),line:t})}}}for(let e of m.finalize())yield e}catch(e){if(s?.aborted)return;u?.error(`Error in ChatCompletions streaming request`,{error:e instanceof Error?e.message:String(e)}),yield{type:`error`,data:{type:`STREAMING_ERROR`,message:e instanceof Error?e.message:String(e),raw:e}}}}function Le(e,t){return{name:`ChatCompletions`,async createGenerationRequest(n,r){return await Ne({baseUrl:e,model:n,apiKey:t,...r})},createStreamingRequest(n,r){return Ie({baseUrl:e,model:n,apiKey:t,...r})}}}const Q={GEMINI_3_1_PRO_PREVIEW:`gemini-3.1-pro-preview`,GEMINI_3_1_PRO_PREVIEW_CUSTOMTOOLS:`gemini-3.1-pro-preview-customtools`,GEMINI_3_1_FLASH_LITE_PREVIEW:`gemini-3.1-flash-lite-preview`,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_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_4_31B_IT:`gemma-4-31b-it`,GEMMA_4_E4B_IT:`gemma-4-26b-a4b-it`,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`};Q.GEMINI_3_1_PRO_PREVIEW,Q.GEMINI_3_1_PRO_PREVIEW_CUSTOMTOOLS,Q.GEMINI_3_1_FLASH_LITE_PREVIEW,Q.GEMINI_3_PRO_PREVIEW,Q.GEMINI_3_FLASH_PREVIEW,Q.GEMINI_2_5_PRO,Q.GEMINI_2_5_FLASH,Q.GEMINI_2_5_FLASH_LITE,Q.GEMINI_2_0_FLASH,Q.GEMINI_2_0_FLASH_001,Q.GEMINI_2_0_FLASH_LITE,Q.GEMINI_2_0_FLASH_LITE_001,Q.GEMINI_FLASH_LATEST,Q.GEMINI_FLASH_LITE_LATEST,Q.GEMINI_PRO_LATEST,Q.GEMMA_4_31B_IT,Q.GEMMA_4_E4B_IT,Q.GEMMA_3_27B_IT,Q.GEMMA_3_12B_IT,Q.GEMMA_3_4B_IT,Q.GEMMA_3_1B_IT,Q.GEMMA_3N_E4B_IT,Q.GEMMA_3N_E2B_IT;const Re=Q.GEMINI_3_1_FLASH_LITE_PREVIEW;function ze(e,t,n){let r={};return t&&(r.systemInstruction=t),e&&e.length>0&&(r.tools=e.map(e=>({functionDeclarations:[{name:e.name,description:e.description,parametersJsonSchema:c.toJSONSchema(e.schema)}]}))),n&&Object.assign(r,n),r}function Be(e){return e.map(Ve).filter(e=>e!==void 0)}function Ve(e){switch(e.role){case`tool`:return He(e);case`assistant`:return Ue(e);case`user`:return We(e)}}function He(e){return{role:`user`,parts:e.content.flatMap(e=>{let t={functionResponse:{id:e.id??void 0,name:e.name,response:{output:typeof e.content==`string`?e.content:e.content.filter(e=>e.type===`text`).map(e=>e.text).join(`
|
|
16
|
-
`)}}};return typeof e.content==`string`?[t]:[t,...e.content.filter(e=>e.type===`image`).map(e=>({inlineData:{mimeType:e.mimeType,data:e.data}}))]})}}function Ue(e){let t=[],n=e.content.filter(e=>e.type===`text`);if(n.length>0){let e=n.map(e=>e.text).join(``);e&&t.push({text:e})}let r=e.content.filter(e=>e.type===`tool-call`);return r.length>0&&t.push(...r.map(e=>{let t={functionCall:{id:e.id??void 0,name:e.name,args:e.parameters}};return e.providerMetadata?.thoughtSignature&&(t.thoughtSignature=e.providerMetadata.thoughtSignature),t})),{role:`model`,parts:t}}function We(e){return typeof e.content==`string`?{role:`user`,parts:[{text:e.content}]}:{role:`user`,parts:e.content.map(Ge).filter(e=>e!==null)}}function Ge(e){return e.type===`text`?{text:e.text}:e.type===`file`&&(e.file.type===`image`||e.file.type===`document`)?{inlineData:{mimeType:e.file.mimeType,data:e.file.base64}}:null}function Ke(e){switch(e){case f.STOP:return[!0,A.Stop];case f.MAX_TOKENS:return[!0,A.Length];case f.FINISH_REASON_UNSPECIFIED:case f.SAFETY:case f.RECITATION:case f.LANGUAGE:case f.OTHER:case f.BLOCKLIST:case f.PROHIBITED_CONTENT:case f.SPII:case f.MALFORMED_FUNCTION_CALL:case f.IMAGE_SAFETY:return[!1,A.Error]}return[!1,A.Error]}async function qe(e){let{client:t,model:n,messages:r,system:i,tools:a,context:o,options:s}=e,c=o?.tracer,l=s?{...s}:{};l.max_tokens&&(l.maxOutputTokens=l.max_tokens,delete l.max_tokens),l.stop&&(l.stopSequences=Array.isArray(l.stop)?l.stop:[l.stop],delete l.stop),l.top_p!==void 0&&(l.topP=l.top_p,delete l.top_p);let u={contents:Be(r),config:ze(a,i,l)};c?.debug(`Gemini request`,{request:u});let d;try{d=Je(await t.models.generateContent({model:n,...u}),{tracer:c})}catch(e){c?.error(e instanceof Error?e.message:String(e)),d=J(e)}return c?.debug(`Gemini response`,{result:d}),d}function Je(e,t){let{tracer:n}=t,r=e.usageMetadata?.promptTokenCount??0,i={in:r,out:(e.usageMetadata?.totalTokenCount??r)-r};if(!e)return{type:`error`,error:{type:`InvalidResponse`,message:`Invalid or empty response from Google AI`},usage:{in:0,out:0},raw:e};if(e.promptFeedback&&e.promptFeedback.blockReason)return{type:`error`,error:{type:`Blocked`,message:`Response blocked by Google AI: ${e.promptFeedback.blockReason}, ${e.promptFeedback.blockReasonMessage}`},usage:i,raw:e};if(!e.candidates||e.candidates.length===0)return{type:`error`,error:{type:`InvalidResponse`,message:`Invalid or empty response from Google AI`},usage:{in:0,out:0},raw:e};e.candidates.length>1&&n?.warn(`We received ${e.candidates.length} response candidates`);let a=e.candidates[0],o=(a.content?.parts||[]).map(e=>e.text).filter(e=>e!==void 0).join(``),[s,c]=Ke(a.finishReason);if(s){let t=[];if(o&&t.push({type:`text`,text:o}),e.functionCalls)for(let n of e.functionCalls)if(n.args==null)t.push({type:`tool-call`,id:n.id??``,name:n.name??``,parameters:{}});else if(typeof n.args!=`object`||Array.isArray(n.args))throw Error(`Invalid tool call arguments for ${n.name}: expected object, got ${typeof n.args}`);else t.push({type:`tool-call`,id:n.id??``,name:n.name??``,parameters:n.args});return{type:`success`,id:e.responseId??``,model:e.modelVersion??``,role:`assistant`,finishReason:e.functionCalls?A.FunctionCall:c,content:t,text:E(t),usage:i,raw:e}}else return{type:`error`,error:{type:`Undetermined`,message:`Unexpected stop reason: ${c}`},usage:i,raw:e}}function Ye(){let e=0,t=-1,n=!1,r=``,i=``,a=0,o=0,s=null;function c(e){t<0||(s===`text`?e.push({type:`text-complete`,data:{index:t}}):s===`thinking`&&e.push({type:`thinking-complete`,data:{index:t}}),s=null,t=-1)}function l(l){let u=[];r||(r=l.responseId||`gemini-${Date.now()}`,i=l.modelVersion||`gemini`,u.push({type:`start`,id:r,data:{model:i,timestamp:Date.now()}})),l.usageMetadata&&(a=l.usageMetadata.promptTokenCount||0,o=(l.usageMetadata.totalTokenCount||0)-a);let d=l.candidates?.[0];if(!d)return u;let p=d.content?.parts||[];for(let r of p){let i=`thought`in r&&r.thought===!0;if(i&&r.text?(s!==`thinking`&&(c(u),t=e++,s=`thinking`,u.push({type:`thinking-start`,data:{index:t}})),u.push({type:`thinking-delta`,data:{index:t,text:r.text}})):r.text&&!i?(s!==`text`&&(c(u),t=e++,s=`text`,u.push({type:`text-start`,data:{index:t}})),u.push({type:`text-delta`,data:{text:r.text,index:t}})):r.functionCall||console.log(`[gemini] unhandled part type: ${JSON.stringify(Object.keys(r))}`),r.functionCall){c(u),n=!0;let t=e++,i=r.functionCall.id||`tool-${t}`,a=r.functionCall.name??``;u.push({type:`tool-call-start`,data:{index:t,id:i,name:a}});let o={index:t,id:i,name:a,arguments:r.functionCall.args??{}},s=r;s.thoughtSignature&&(o.providerMetadata={thoughtSignature:s.thoughtSignature}),u.push({type:`tool-call-complete`,data:o})}}if(d.finishReason&&d.finishReason!==f.FINISH_REASON_UNSPECIFIED){c(u);let[e,t]=Ke(d.finishReason),r=n?A.FunctionCall:t;!e&&!n?u.push({type:`error`,data:{type:`FinishReasonError`,message:`Unexpected finish reason: ${d.finishReason}`,usage:{in:a,out:o},raw:l}}):u.push({type:`complete`,data:{finishReason:r,usage:{in:a,out:o}}})}return u}return{handleChunk:l}}async function*Xe(e){let{client:t,model:n,messages:r,system:i,tools:a,runtime:o,signal:s,options:c}=e,l=o?.tracer,{serverTools:u,...d}=c??{},f=d?{...d}:{};f.max_tokens&&(f.maxOutputTokens=f.max_tokens,delete f.max_tokens),f.stop&&(f.stopSequences=Array.isArray(f.stop)?f.stop:[f.stop],delete f.stop),f.top_p!==void 0&&(f.topP=f.top_p,delete f.top_p);let p=ze(a,i,f);if(u){let e={web_search:`googleSearch`,code_execution:`codeExecution`};p.tools||=[];for(let t of u){let n=e[t.name]??t.name;p.tools.push({[n]:t.config??{}})}}let m={contents:Be(r),config:p};l?.debug(`Gemini streaming request`,{request:m});let h=Ye();try{let e=await t.models.generateContentStream({model:n,...m});for await(let t of e){let e=h.handleChunk(t);for(let t of e)yield t}}catch(e){if(s?.aborted)return;l?.error(e instanceof Error?e.message:String(e)),yield{type:`error`,data:{type:`STREAMING_ERROR`,message:e instanceof Error?e.message:String(e),raw:e}}}}function Ze(e){let t=new p({apiKey:e});return{name:`Gemini`,async createGenerationRequest(e,n){return await qe({client:t,model:e,...n})},createStreamingRequest(e,n){let{messages:r,system:i,tools:a,context:o,signal:s,options:c}=n;return Xe({client:t,model:e,messages:r,system:i,tools:a,runtime:o,signal:s,options:c})}}}const Qe={Models:Q,DefaultModel:Re};async function $e(e){let{provider:t,model:n,messages:r,system:i,tools:a,tracer:o,options:s}=e;return t.createGenerationRequest(n,{messages:r,system:i,tools:a,context:{tracer:o},options:s})}async function et(e){let{provider:t,model:n,messages:r,system:i,tools:a,onToolCall:o,maxIterations:s,tracer:c,options:l}=e,u=[...r],d=[],f={in:0,out:0},p=0,m,h=e=>{u.push(e),d.push(e)},g=e=>(c?.setResult({kind:`llm`,model:n,request:{messages:r},response:{content:e.result===`success`?e.final?.content:null},usage:e.usage?{inputTokens:e.usage.in,outputTokens:e.usage.out}:void 0,finishReason:e.result===`success`?e.final?.finishReason:void 0}),c?.end(e.result===`error`?`error`:`ok`),e),_=(e,t)=>{if(!e||t.type===`error`){e?.end(`error`);return}e.setResult({kind:`llm`,model:t.model??n,request:{messages:u},response:{content:t.content},usage:t.usage?{inputTokens:t.usage.in,outputTokens:t.usage.out}:void 0,finishReason:t.finishReason}),e.end()};for(;;){if(s!==void 0&&p>=s)return g({result:`error`,messages:d,error:{type:`model`,error:{type:`error`,error:{type:`MaxIterations`,message:`Exceeded max iterations (${s})`}}},usage:f});p+=1;let e=c?.startSpan(`turn-${p}`,{type:`llm`}),r=await $e({provider:t,model:n,messages:u,system:i,tools:a,tracer:e,options:l});if(O(f,r),_(e,r),r.type===`error`)return g({result:`error`,messages:d,error:{type:`model`,error:r},usage:f});let v={role:`assistant`,id:r.id,model:r.model,content:r.content,finishReason:r.finishReason};if(h(v),m=v,r.finishReason!==A.FunctionCall)return g({result:`success`,messages:d,final:m,usage:f});let y=D(r.content);if(y.length===0)return g({result:`success`,messages:d,final:m,usage:f});let{results:b}=await ee(y,o,c);b.length>0&&h({role:`tool`,id:crypto.randomUUID(),content:b})}}const $={GPT_5_4_2026_03_05:`gpt-5.4-2026-03-05`,GPT_5_4:`gpt-5.4`,GPT_5_4_PRO_2026_03_05:`gpt-5.4-pro-2026-03-05`,GPT_5_4_PRO:`gpt-5.4-pro`,GPT_5_4_MINI_2026_03_17:`gpt-5.4-mini-2026-03-17`,GPT_5_4_MINI:`gpt-5.4-mini`,GPT_5_4_NANO_2026_03_17:`gpt-5.4-nano-2026-03-17`,GPT_5_4_NANO:`gpt-5.4-nano`,GPT_5_2_2025_12_11:`gpt-5.2-2025-12-11`,GPT_5_2:`gpt-5.2`,GPT_5_2_CHAT_LATEST:`gpt-5.2-chat-latest`,GPT_5_2_PRO_2025_12_11:`gpt-5.2-pro-2025-12-11`,GPT_5_2_PRO:`gpt-5.2-pro`,GPT_5_1_2025_11_13:`gpt-5.1-2025-11-13`,GPT_5_1:`gpt-5.1`,GPT_5_1_CHAT_LATEST:`gpt-5.1-chat-latest`,GPT_5_2025_08_07:`gpt-5-2025-08-07`,GPT_5:`gpt-5`,GPT_5_CHAT_LATEST:`gpt-5-chat-latest`,GPT_5_PRO_2025_10_06:`gpt-5-pro-2025-10-06`,GPT_5_PRO:`gpt-5-pro`,GPT_5_MINI_2025_08_07:`gpt-5-mini-2025-08-07`,GPT_5_MINI:`gpt-5-mini`,GPT_5_NANO_2025_08_07:`gpt-5-nano-2025-08-07`,GPT_5_NANO:`gpt-5-nano`,GPT_4_1_2025_04_14:`gpt-4.1-2025-04-14`,GPT_4_1:`gpt-4.1`,GPT_4_1_MINI_2025_04_14:`gpt-4.1-mini-2025-04-14`,GPT_4_1_MINI:`gpt-4.1-mini`,GPT_4_1_NANO_2025_04_14:`gpt-4.1-nano-2025-04-14`,GPT_4_1_NANO:`gpt-4.1-nano`,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:`gpt-4o`,GPT_4O_MINI_2024_07_18:`gpt-4o-mini-2024-07-18`,GPT_4O_MINI:`gpt-4o-mini`,O4_MINI_2025_04_16:`o4-mini-2025-04-16`,O4_MINI:`o4-mini`,O3_2025_04_16:`o3-2025-04-16`,O3:`o3`,O3_PRO_2025_06_10:`o3-pro-2025-06-10`,O3_PRO:`o3-pro`,O3_MINI_2025_01_31:`o3-mini-2025-01-31`,O3_MINI:`o3-mini`,O1_2024_12_17:`o1-2024-12-17`,O1:`o1`,O1_PRO_2025_03_19:`o1-pro-2025-03-19`,O1_PRO:`o1-pro`};$.GPT_5_4,$.GPT_5_4_PRO,$.GPT_5_4_MINI,$.GPT_5_4_NANO,$.GPT_5_2,$.GPT_5_2_PRO,$.GPT_5_1,$.GPT_5,$.GPT_5_PRO,$.GPT_5_MINI,$.GPT_5_NANO,$.GPT_4_1,$.GPT_4_1_MINI,$.GPT_4_1_NANO,$.GPT_4O,$.GPT_4O_MINI,$.O4_MINI,$.O3,$.O3_PRO,$.O1,$.O1_PRO;const tt=$.GPT_5_4_MINI;function nt(e){if(e&&e.length>0)return e.map(e=>({type:`function`,strict:!0,name:e.name,description:e.description,parameters:c.toJSONSchema(e.schema)}))}function rt(e){return e.map(it).flat(1)}function it(e){switch(e.role){case`tool`:return at(e);case`assistant`:return ot(e);default:return st(e)}}function at(e){return e.content.map(e=>({type:`function_call_output`,call_id:e.id,output:typeof e.content==`string`?e.content:e.content.map(e=>e.type===`text`?{type:`input_text`,text:e.text}:{type:`input_image`,image_url:`data:${e.mimeType};base64,${e.data}`})}))}function ot(e){let t=[],n=E(e.content);n&&t.push({role:e.role,content:n});let r=e.content.filter(e=>e.type===`tool-call`);for(let e of r)t.push({type:`function_call`,call_id:e.id,name:e.name,arguments:JSON.stringify(e.parameters)});let i=e.content.filter(e=>e.type===`internal-tool`);for(let e of i)e.output!=null&&t.push(e.output);return t}function st(e){if(typeof e.content==`string`)return{role:e.role,content:e.content};{let t=e.content.map(ct).filter(e=>e!==null);return{role:e.role,content:t}}}function ct(e){if(e.type===`text`)return{type:`input_text`,text:e.text};if(e.type===`file`){if(e.file.type===`image`)return{type:`input_image`,image_url:`data:${e.file.mimeType};base64,${e.file.base64}`,detail:`auto`};if(e.file.type===`document`)return{type:`input_file`,filename:e.file.path,file_data:`data:${e.file.mimeType};base64,${e.file.base64}`}}return e.type,null}async function lt(e){let{client:t,model:n,messages:r,system:i,tools:a,context:o,options:s}=e,c=o?.tracer,l=nt(a),u={model:n,input:rt(r),...i&&{instructions:i},...l?{tools:l}:{},...s};c?.debug(`OpenAI ResponsesAPI request`,{request:u});let d;try{d=ut(await t.responses.create(u))}catch(e){c?.error(e instanceof Error?e.message:String(e)),d=J(e)}return c?.debug(`OpenAI ResponsesAPI response`,{result:d}),d}function ut(e){if(e.error)return{type:`error`,error:{type:e.error.code||`undetermined`,message:e.error.message||`Response generation failed`},usage:{in:e.usage?.input_tokens??0,out:e.usage?.output_tokens??0},raw:e};let t=e.output?.filter(e=>e.type===`reasoning`)?.map(e=>e),n=[];if(t&&t.length>0)for(let e of t){let t=e.summary?.[0]?.text||e.content?.[0]?.text||``;(t||e.encrypted_content)&&n.push({type:`thinking`,text:t,...e.encrypted_content&&{encrypted:e.encrypted_content}})}e.output_text&&n.push({type:`text`,text:e.output_text});let r=e.output?.filter(e=>e.type===`function_call`);if(r&&r.length>0)for(let e of r){let t=e;try{n.push({type:`tool-call`,id:t.id||``,name:t.name||``,parameters:t.arguments?JSON.parse(t.arguments):{}})}catch(e){throw Error(`Failed to parse tool call arguments for ${t.name}: ${e instanceof Error?e.message:String(e)}\nRaw value: ${t.arguments}`)}}return{type:`success`,id:e.id,model:e.model||``,role:`assistant`,finishReason:e.incomplete_details?A.Error:A.Stop,content:n,text:E(n),usage:{in:e.usage?.input_tokens??0,out:e.usage?.output_tokens??0},raw:e}}function dt(){let e=``,t=``,n=0,r=-1,i=!1,a=new Map,o=new Map,s=new Set([`web_search_call`,`file_search_call`,`code_interpreter_call`]),c=new Map;function l(l){let u=[];switch(l.type){case`response.created`:e=l.response.id||`openai-${Date.now()}`,t=l.response.model,u.push({type:`start`,id:e,data:{model:t,timestamp:Date.now()}});break;case`response.output_text.delta`:r===-1&&(r=n++,u.push({type:`text-start`,data:{index:r}})),u.push({type:`text-delta`,data:{text:l.delta,index:r}});break;case`response.output_text.done`:r>=0&&(u.push({type:`text-complete`,data:{index:r}}),r=-1);break;case`response.function_call_arguments.delta`:{let e=l.item_id;if(!c.has(e)){let t=a.get(e),r=t?.name||``,i=t?.callId||e,o=n++;c.set(e,{id:e,callId:i,name:r,argumentsBuffer:``,partIdx:o}),u.push({type:`tool-call-start`,data:{index:o,id:i,name:r}})}let t=c.get(e);t.argumentsBuffer+=l.delta;break}case`response.function_call_arguments.done`:{i=!0;let e=l.item_id,t=c.get(e),n=l.name||t?.name||``;if(t){try{let e=l.arguments?JSON.parse(l.arguments):{};u.push({type:`tool-call-complete`,data:{index:t.partIdx,id:t.callId,name:n,arguments:e}})}catch(e){throw Error(`Failed to parse function call arguments for ${n}: ${e instanceof Error?e.message:String(e)}\nRaw value: ${l.arguments}`)}c.delete(e)}break}case`response.completed`:{let e=l.response.usage;u.push({type:`complete`,data:{finishReason:l.response.incomplete_details?A.Error:i?A.FunctionCall:A.Stop,usage:{in:e?.input_tokens||0,out:e?.output_tokens||0}}});break}case`response.failed`:u.push({type:`error`,data:{type:`RESPONSES_API_ERROR`,message:`Response failed: ${l.response.status}`,raw:l}});break;case`response.output_item.added`:if(l.item?.type===`reasoning`)r=n++,u.push({type:`thinking-start`,data:{index:r}});else if(l.item?.type===`function_call`){let e=l.item,t=e.id||e.call_id;t&&a.set(t,{name:e.name||``,callId:e.call_id||t})}else if(l.item&&s.has(l.item.type)){let e=l.item,t=n++;o.set(e.id,t),u.push({type:`internal-tool-start`,data:{index:t,id:e.id,name:e.type}})}break;case`response.output_item.done`:if(l.item?.type===`reasoning`&&r>=0)u.push({type:`thinking-complete`,data:{index:r}}),r=-1;else if(l.item&&s.has(l.item.type)){let e=l.item,t=o.get(e.id);t!==void 0&&(u.push({type:`internal-tool-complete`,data:{index:t,id:e.id,name:e.type,output:l.item}}),o.delete(e.id))}break;case`response.reasoning_text.delta`:l.delta&&u.push({type:`thinking-delta`,data:{index:r,text:l.delta}});break;case`response.reasoning_summary_text.delta`:l.delta&&u.push({type:`thinking-summary-delta`,data:{index:r,text:l.delta}});break;case`response.in_progress`:case`response.content_part.added`:case`response.content_part.done`:case`response.reasoning_summary_part.added`:case`response.reasoning_summary_part.done`:case`response.reasoning_summary_text.done`:case`response.reasoning_text.done`:case`response.web_search_call.in_progress`:case`response.web_search_call.searching`:case`response.web_search_call.completed`:break;default:console.log(`[OpenAI] unhandled stream event: ${l.type}`)}return u}return{handleEvent:l}}async function*ft(e){let{client:t,model:n,messages:r,system:i,tools:a,runtime:o,signal:s,options:c}=e,l=o?.tracer,{serverTools:u,...d}=c??{},f=nt(a)??[];if(u){let e={web_search:`web_search_preview`,code_execution:`code_interpreter`};for(let t of u){let n=e[t.name]??t.name;f.push({type:n,...t.config})}}let p={model:n,input:rt(r),...i&&{instructions:i},stream:!0,...f.length>0?{tools:f}:{},...d};l?.debug(`OpenAI ResponsesAPI streaming request`,{request:p});let m=dt();try{let e=t.responses.stream(p,...s?[{signal:s}]:[]);for await(let t of e){let e=m.handleEvent(t);for(let t of e)yield t}}catch(e){if(s?.aborted)return;l?.error(e instanceof Error?e.message:String(e)),yield{type:`error`,data:{type:`STREAMING_ERROR`,message:e instanceof Error?e.message:String(e),raw:e}}}}function pt(e){let t=new m({apiKey:e});return{name:`OpenAI`,async createGenerationRequest(e,n){return await lt({client:t,model:e,...n})},createStreamingRequest(e,n){let{messages:r,system:i,tools:a,context:o,signal:s,options:c}=n;return ft({client:t,model:e,messages:r,system:i,tools:a,runtime:o,signal:s,options:c})}}}const mt={Models:$,DefaultModel:tt},ht=s.object({searchTerm:s.string().describe(`The search term to query`)}),gt=new class{name=`brave`;description=`Perform a search using the Brave search engine`;schema=ht;apiKey;throttle;lastExecTime=0;constructor(e){e&&this.configure(e)}configure(e){let{rateLimit:t}=e;this.apiKey=e[`api-key`],this.throttle=t?1100/t:void 0}async execute(e){let{searchTerm:t}=e;if(this.throttle){for(;Date.now()-this.lastExecTime<this.throttle;)await L(this.throttle-(Date.now()-this.lastExecTime));this.lastExecTime=Date.now()}try{let e=this.apiKey,n=new URL(`https://api.search.brave.com/res/v1/web/search`);n.searchParams.append(`q`,t),n.searchParams.append(`format`,`json`);let r=await fetch(n.toString(),{method:`GET`,headers:{Accept:`application/json`,"X-Subscription-Token":e??``}});if(!r.ok)throw Error(`[Brave] HTTP error ${r.status}: ${r.statusText}`);let i=await r.json();return JSON.stringify(i)}catch(e){throw e instanceof Error?Error(`[Brave] Error fetching search results: ${e.message}`):e}}},_t={name:`calculator`,description:`Performs basic arithmetic operations`,schema:l.object({operation:l.enum([`add`,`subtract`,`multiply`,`divide`]).describe(`The operation to perform (add, subtract, multiply, divide)`),a:l.number().describe(`First operand`),b:l.number().describe(`Second operand`)}),execute:async({operation:e,a:t,b:n})=>{switch(e){case`add`:return`${t} + ${n} = ${t+n}`;case`subtract`:return`${t} - ${n} = ${t-n}`;case`multiply`:return`${t} * ${n} = ${t*n}`;case`divide`:if(n===0)throw Error(`Cannot divide by zero`);return`${t} / ${n} = ${t/n}`;default:throw Error(`Unknown operation: ${e}`)}}},vt=g(h);async function yt(e,t={}){let{stdout:n,stderr:r}=await vt(e,{cwd:t.cwd,timeout:t.timeout??3e4,maxBuffer:t.maxBuffer??1048576});return{stdout:n,stderr:r}}function bt(e){if(e instanceof Error){let t=e,n=`Error executing command: ${e.message}`;return t.stdout&&(n+=`\n[stdout]: ${t.stdout}`),t.stderr&&(n+=`\n[stderr]: ${t.stderr}`),n}return`Error executing command: ${String(e)}`}function xt(e,t){return t&&t.trim()?`${e}\n[stderr]: ${t}`:e}const St=s.object({command:s.string().describe(`The shell command to execute`)});new class{name=`exec`;description=`Execute a shell command and return the output.`;schema=St;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){let{command:t}=e;try{let e=await yt(t,{timeout:this.timeout,maxBuffer:this.maxBuffer,cwd:this.cwd});return xt(e.stdout,e.stderr)}catch(e){return bt(e)}}},l.object({path:l.string().describe(`The file path to patch`),old_string:l.string().describe(`The exact text to find and replace`),new_string:l.string().describe(`The replacement text`),start_line:l.number().int().positive().describe(`1-indexed start line of the region to match within`),end_line:l.number().int().positive().describe(`1-indexed end line (inclusive) of the region to match within`)}),l.object({path:l.string().describe(`The file path to read from`)}),l.object({path:l.string().describe(`The file path to write to`),content:l.string().describe(`The content to write to the file`)});function Ct(e){try{let t=c.fromJSONSchema(e);return t instanceof c.ZodObject?t.strict():c.object({}).passthrough()}catch{return c.object({}).passthrough()}}function wt(e,t,n){return e.map(e=>Et(e,t,n))}function Tt(e,t){return e.map(e=>{let n=t?`${t}_${e.name}`:e.name,r=Ct(e.inputSchema);return{name:n,description:e.description??``,schema:r}})}function Et(e,t,n){let r=n?`${n}_${e.name}`:e.name,i=Ct(e.inputSchema);return{name:r,description:e.description??``,schema:i,async execute(n){let r=await t.callTool({name:e.name,arguments:n});if(`isError`in r&&r.isError)throw Error(Ot(r.content));return Dt(r.content)}}}function Dt(e){return e.some(e=>e.type===`image`)?e.filter(e=>e.type===`text`||e.type===`image`).map(e=>{if(e.type===`text`)return{type:`text`,text:e.text};let t=e;return{type:`image`,data:t.data,mimeType:t.mimeType}}):e.filter(e=>e.type===`text`).map(e=>e.text).join(`
|
|
17
|
-
`)}function Ot(e){return e.filter(e=>e.type===`text`).map(e=>e.text).join(`
|
|
18
|
-
`)||`MCP tool execution error`}var kt=class{config;client;transport;cachedMcpTools;_connected=!1;constructor(e){this.config=e}get name(){return this.config.name??this.client?.getServerVersion()?.name}get connected(){return this._connected}async connect(e){if(this._connected)return;let t=e?.tracer?.startSpan(`mcp:connect`,{type:`internal`});this.client=new _({name:`axle`,version:`1.0.0`}),this.config.transport===`stdio`?this.transport=new v({command:this.config.command,args:this.config.args,env:this.config.env}):this.transport=new y(new URL(this.config.url),{requestInit:this.config.headers?{headers:this.config.headers}:void 0});try{await this.client.connect(this.transport),this._connected=!0,t?.end(`ok`)}catch(e){throw t?.end(`error`),e}}async listTools(e){let t=this.assertConnected();return wt(await this.fetchTools(t,e?.tracer),t,e?.prefix)}async listToolDefinitions(e){let t=this.assertConnected();return Tt(await this.fetchTools(t,e?.tracer),e?.prefix)}async refreshTools(){return this.assertConnected(),this.cachedMcpTools=void 0,this.listTools()}async close(e){this._connected&&(e?.tracer?.debug(`mcp:close`),await this.client?.close(),this._connected=!1,this.client=void 0,this.transport=void 0,this.cachedMcpTools=void 0)}async fetchTools(e,t){return this.cachedMcpTools?this.cachedMcpTools:(t?.debug(`mcp:listTools`),this.cachedMcpTools=(await e.listTools()).tools.map(e=>({name:e.name,description:e.description,inputSchema:e.inputSchema})),this.cachedMcpTools)}assertConnected(){if(!this._connected||!this.client)throw Error(`MCP not connected. Call connect() first.`);return this.client}};const At={debug:0,info:1,warn:2,error:3};var jt=class{writers=[];_minLevel=`info`;get minLevel(){return this._minLevel}set minLevel(e){this._minLevel=e}addWriter(e){this.writers.includes(e)||this.writers.push(e)}removeWriter(e){let t=this.writers.indexOf(e);t!==-1&&this.writers.splice(t,1)}startSpan(e,t){let n={traceId:crypto.randomUUID(),spanId:crypto.randomUUID(),name:e,type:t?.type,startTime:performance.now(),status:`ok`,attributes:{},events:[]};return this.writers.forEach(e=>e.onSpanStart(n)),new Mt(n,this)}async flush(){for(let e of this.writers)e.flush&&await e.flush()}_notifySpanEnd(e){this.writers.forEach(t=>t.onSpanEnd(e))}_notifySpanUpdate(e){this.writers.forEach(t=>t.onSpanUpdate?.(e))}_notifyEvent(e,t){this.writers.forEach(n=>n.onEvent?.(e,t))}_notifySpanStart(e){this.writers.forEach(t=>t.onSpanStart(e))}_shouldLog(e){return At[e]>=At[this._minLevel]}},Mt=class e{data;tracer;ended=!1;constructor(e,t){this.data=e,this.tracer=t}startSpan(t,n){let r={traceId:this.data.traceId,spanId:crypto.randomUUID(),parentSpanId:this.data.spanId,name:t,type:n?.type,startTime:performance.now(),status:`ok`,attributes:{},events:[]};return this.tracer._notifySpanStart(r),new e(r,this.tracer)}end(e=`ok`){this.ended||(this.ended=!0,this.data.endTime=performance.now(),this.data.status=e,this.tracer._notifySpanEnd(this.data))}addEvent(e,t,n){if(this.ended||!this.tracer._shouldLog(t))return;let r={name:e,timestamp:performance.now(),level:t,attributes:n};this.data.events.push(r),this.tracer._notifyEvent(this.data,r)}debug(e,t){this.addEvent(e,`debug`,t)}info(e,t){this.addEvent(e,`info`,t)}warn(e,t){this.addEvent(e,`warn`,t)}error(e,t){this.addEvent(e,`error`,t)}setAttribute(e,t){this.ended||(this.data.attributes[e]=t,this.tracer._notifySpanUpdate(this.data))}setAttributes(e){this.ended||(Object.assign(this.data.attributes,e),this.tracer._notifySpanUpdate(this.data))}setResult(e){this.ended||(this.data.result=e,this.tracer._notifySpanUpdate(this.data))}};const Nt={debug:0,info:1,warn:2,error:3};let Pt=!1;function Ft(){Pt||=(b.use(x()),!0)}var It=class{minLevel;showInternal;showTimestamp;showDuration;markdown;output;spans=new Map;visibleDepths=new Map;constructor(e={}){this.minLevel=e.minLevel??`info`,this.showInternal=e.showInternal??!1,this.showTimestamp=e.showTimestamp??!0,this.showDuration=e.showDuration??!0,this.markdown=e.markdown??!1,this.output=e.output??console.log}shouldShowEvent(e){return Nt[e]>=Nt[this.minLevel]}isSpanVisible(e){return!(e.type===`internal`&&!this.showInternal)}findVisibleAncestor(e){let t=e.parentSpanId;for(;t;){let e=this.spans.get(t);if(!e)break;if(this.isSpanVisible(e))return e;t=e.parentSpanId}return null}calculateVisibleDepth(e){if(!this.isSpanVisible(e))return-1;let t=this.findVisibleAncestor(e);return t?(this.visibleDepths.get(t.spanId)??0)+1:0}formatTimestamp(){if(!this.showTimestamp)return``;let e=new Date;return`[${e.toTimeString().slice(0,8)}.${e.getMilliseconds().toString().padStart(3,`0`)}] `}formatDuration(e){if(!this.showDuration||!e.endTime)return``;let t=e.endTime-e.startTime;return t<1e3?` (${Math.round(t)}ms)`:` (${(t/1e3).toFixed(2)}s)`}formatIndent(e){return` `.repeat(e)}formatSpanName(e){return e.type?`[${e.type}] ${e.name}`:e.name}renderMarkdown(e){return Ft(),b.parse(e).trimEnd()}onSpanStart(e){if(this.spans.set(e.spanId,e),!this.isSpanVisible(e))return;let t=this.calculateVisibleDepth(e);this.visibleDepths.set(e.spanId,t);let n=this.formatIndent(t),r=this.formatTimestamp(),i=this.formatSpanName(e);this.output(`${r}${n}START ${i}`)}onSpanEnd(e){if(this.spans.set(e.spanId,e),!this.isSpanVisible(e))return;let t=this.visibleDepths.get(e.spanId)??0,n=this.formatIndent(t),r=this.formatTimestamp(),i=this.formatDuration(e),a=this.formatSpanName(e),o=e.status===`error`?` [ERROR]`:``;if(this.output(`${r}${n}END ${a}${i}${o}`),e.result?.kind===`llm`){let t=e.result,i=[`model=${t.model}`];if(t.finishReason&&i.push(`finishReason=${t.finishReason}`),t.usage&&(t.usage.inputTokens!==void 0&&i.push(`inputTokens=${t.usage.inputTokens}`),t.usage.outputTokens!==void 0&&i.push(`outputTokens=${t.usage.outputTokens}`)),this.output(`${r}${n} INFO LLM complete ${i.join(` `)}`),this.shouldShowEvent(`debug`)&&t.response.content){let e=(typeof t.response.content==`string`?t.response.content:JSON.stringify(t.response.content,null,2)).split(`
|
|
19
|
-
`);for(let t of e)this.output(`${r}${n} DEBUG ${t}`)}}}onSpanUpdate(e){this.spans.set(e.spanId,e)}onEvent(e,t){if(!this.shouldShowEvent(t.level))return;this.spans.set(e.spanId,e);let n;if(this.isSpanVisible(e))n=this.visibleDepths.get(e.spanId)??0;else{let t=this.findVisibleAncestor(e);n=t?this.visibleDepths.get(t.spanId)??0:0}let r=this.formatIndent(n+1),i=this.formatTimestamp(),a=t.level.toUpperCase().padEnd(5),o=this.markdown&&t.attributes?.markdown===!0,s=t.attributes?Object.entries(t.attributes).filter(([e])=>e!==`markdown`):[],c=t.name;o&&(c=this.renderMarkdown(c));let l=`${i}${r}${a} ${c}`;if(s.length>0){let e=s.map(([e,t])=>`${e}=${JSON.stringify(t)}`).join(` `);l+=` ${e}`}this.output(l)}},Lt=class{provider;model;enableTools;lastStore;lastName;lastScope;constructor(e){this.provider=e.provider,this.model=e.model,this.enableTools=e.enableTools??!1}async recall(e){let t=e.tracer?.startSpan(`memory.recall`,{type:`internal`});this.lastStore=e.store,this.lastName=e.name,this.lastScope=e.scope;let n=await this.loadStore(e.store,e.name,e.scope);if(n.instructions.length===0)return t?.info(`no stored instructions`),t?.end(),{};t?.info(`loaded instructions`,{count:n.instructions.length});let r=n.instructions.map((e,t)=>`${t+1}. ${e}`).join(`
|
|
20
|
-
`);return t?.end(),{systemSuffix:`## Learned Instructions\n\n${r}`}}async record(e){if(!e.newMessages||e.newMessages.length===0)return;let t=e.tracer?.startSpan(`memory.record`,{type:`internal`}),n=this.formatMessages(e.newMessages);if(!n.trim()){t?.info(`no text content to extract from`),t?.end();return}let r=t?.startSpan(`memory.extract`,{type:`llm`}),i=await et({provider:this.provider,model:this.model,messages:[{role:`user`,content:n}],system:`You are a memory extraction system. Your job is to extract learnings from a conversation that should be remembered for future runs.
|
|
21
|
-
|
|
22
|
-
Only extract:
|
|
23
|
-
- Explicit user corrections (e.g., "No, always use bullet points")
|
|
24
|
-
- Stated preferences (e.g., "I prefer concise summaries")
|
|
25
|
-
- Patterns that clearly emerged from user feedback
|
|
26
|
-
|
|
27
|
-
Do NOT extract:
|
|
28
|
-
- General knowledge or facts from the conversation content
|
|
29
|
-
- Inferences or speculation about what the user might want
|
|
30
|
-
- Task-specific details that won't apply to future runs
|
|
31
|
-
|
|
32
|
-
Respond with a JSON array of instruction strings. Each instruction should be a clear, actionable directive.
|
|
33
|
-
If there are no learnings to extract, respond with an empty array: []
|
|
34
|
-
|
|
35
|
-
Example response:
|
|
36
|
-
["Always use bullet points for lists", "Keep summaries under 3 sentences"]`,tracer:r});if(i.result!==`success`||!i.final){t?.warn(`extraction failed`,{result:i.result}),t?.end();return}let a=E(i.final.content);if(!a){t?.end();return}let o=this.parseInstructions(a);if(o.length===0){t?.info(`no instructions extracted`),t?.end();return}let s=await this.loadStore(e.store,e.name,e.scope);s.instructions.push(...o),await this.saveStore(e.store,e.name,e.scope,s),t?.info(`saved instructions`,{count:o.length}),t?.end()}tools(){if(!this.enableTools)return[];let e=this;return[{name:`add_instruction`,description:`Save a learned instruction for future runs. Use this when the user explicitly asks you to remember something.`,schema:l.object({instruction:l.string().describe(`The instruction to remember`)}),async execute(t){if(!e.lastStore)return`Error: memory not initialized (no recall has been called yet)`;let n=await e.loadStore(e.lastStore,e.lastName,e.lastScope);return n.instructions.push(t.instruction),await e.saveStore(e.lastStore,e.lastName,e.lastScope,n),`Instruction saved: "${t.instruction}"`}}]}formatMessages(e){let t=[];for(let n of e)if(n.role===`user`){let e=typeof n.content==`string`?n.content:E(n.content);e&&t.push(`User: ${e}`)}else if(n.role===`assistant`){let e=E(n.content);e&&t.push(`Assistant: ${e}`)}return t.join(`
|
|
37
|
-
|
|
38
|
-
`)}parseInstructions(e){let t=e.trim(),n=t.match(/^```(?:json)?\s*\n?([\s\S]*?)\n?\s*```$/);n&&(t=n[1].trim());try{let e=JSON.parse(t);if(Array.isArray(e)&&e.every(e=>typeof e==`string`))return e}catch{}return[]}getStorePath(e,t){let n=e??`default`,r=n;if(t&&Object.keys(t).length>0){let e=Object.entries(t).sort(([e],[t])=>e.localeCompare(t)).map(([e,t])=>`${e}=${t}`).join(`&`);r=`${n}-${S.createHash(`sha256`).update(e).digest(`hex`).slice(0,8)}`}return`memory/procedural/${r}.json`}async loadStore(e,t,n){let r=this.getStorePath(t,n),i=await e.read(r);if(i)try{let e=JSON.parse(i);if(e&&Array.isArray(e.instructions))return{instructions:e.instructions}}catch{}return{instructions:[]}}async saveStore(e,t,n,r){if(!r)return;let i=this.getStorePath(t,n);await e.write(i,JSON.stringify(r,null,2))}};export{ie as Agent,Te as Anthropic,A as AxleStopReason,Qe as Gemini,G as History,fe as Instruct,P as LocalFileStore,kt as MCP,mt as OpenAI,Lt as ProceduralMemory,It as SimpleWriter,jt as Tracer,F as TurnBuilder,we as anthropic,gt as braveSearchTool,_t as calculatorTool,Le as chatCompletions,W as compileInstruct,z as createHandle,Ze as gemini,et as generate,$e as generateTurn,de as loadFileContent,pt as openai,H as parseResponse,M as stream};
|
|
File without changes
|