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