@fifthrevision/axle 0.7.2 → 0.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -185,27 +185,107 @@ 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
+
224
+ ### MCP (Model Context Protocol)
225
+
226
+ Axle supports connecting to MCP servers via stdio or HTTP transport. Create an
227
+ MCP instance, connect it, and pass it to Agent.
228
+
229
+ ```typescript
230
+ import { Agent, MCP } from "@fifthrevision/axle";
231
+
232
+ const mcp = new MCP({
233
+ transport: "stdio",
234
+ name: "wc",
235
+ command: "npx",
236
+ args: ["tsx", "path/to/wordcount-server.ts"],
237
+ });
238
+ await mcp.connect();
239
+
240
+ const agent = new Agent({ provider, model, mcps: [mcp] });
241
+ const result = await agent.send("Count the words in 'hello world'").final;
242
+
243
+ await mcp.close();
244
+ ```
245
+
246
+ The optional `name` field prefixes all tool names from that server (e.g.
247
+ `wc_word_count`) to avoid collisions when using multiple MCPs. When omitted,
248
+ the server's self-reported name is used as the prefix if available.
249
+
250
+ HTTP transport works the same way:
251
+
252
+ ```typescript
253
+ const mcp = new MCP({
254
+ transport: "http",
255
+ url: "http://localhost:3100/mcp",
256
+ });
257
+ ```
258
+
188
259
  ### Streaming
189
260
 
190
- Agent exposes callbacks for streaming output as it arrives.
261
+ Agent exposes a single `on()` method for streaming events as they arrive.
191
262
 
192
263
  ```typescript
193
264
  const agent = new Agent({ provider, model });
194
265
 
195
- agent.onPartStart((index, type) => {
196
- /* text, tool-call, thinking */
197
- });
198
- agent.onPartUpdate((index, type, delta) => process.stdout.write(delta));
199
- agent.onPartEnd((index, type) => {
200
- /* part finished */
266
+ agent.on((event) => {
267
+ switch (event.type) {
268
+ case "text:delta":
269
+ process.stdout.write(event.delta);
270
+ break;
271
+ case "tool:execute":
272
+ console.log(`Running tool: ${event.name}`);
273
+ break;
274
+ case "error":
275
+ console.error(event.error);
276
+ break;
277
+ }
201
278
  });
202
- agent.onError((error) => console.error(error));
203
279
 
204
280
  const handle = agent.send("Write me a poem.");
205
281
  // handle.cancel() to abort mid-stream
206
282
  const result = await handle.final;
207
283
  ```
208
284
 
285
+ Event types include `text:start`, `text:delta`, `text:end`, `thinking:start`,
286
+ `thinking:delta`, `thinking:end`, `tool:start`, `tool:execute`,
287
+ `tool:complete`, `internal-tool:start`, `internal-tool:complete`, and `error`.
288
+
209
289
  Callbacks are registered once and fire on every subsequent `send()`.
210
290
 
211
291
  ## Known Limitations
@@ -249,6 +329,9 @@ task: |
249
329
  tools:
250
330
  - calculator
251
331
 
332
+ server_tools:
333
+ - web_search
334
+
252
335
  files:
253
336
  - ./data/report.txt
254
337
  ```
@@ -276,6 +359,34 @@ batch:
276
359
  - `concurrency` — max parallel runs (default 3)
277
360
  - `resume` — skip files already processed in a previous run
278
361
 
362
+ ### MCP Servers
363
+
364
+ Add an `mcps` key to connect to MCP servers. Both stdio and HTTP transports
365
+ are supported.
366
+
367
+ ```yaml
368
+ # axle.job.yaml
369
+ provider:
370
+ type: anthropic
371
+
372
+ mcps:
373
+ - name: wc
374
+ transport: stdio
375
+ command: npx
376
+ args: ["tsx", "examples/mcps/wordcount-server.ts"]
377
+ - transport: http
378
+ url: http://localhost:3100/mcp
379
+
380
+ task: |
381
+ Count the words in "hello world"
382
+ ```
383
+
384
+ Each entry supports:
385
+ - `transport` — `"stdio"` or `"http"` (required)
386
+ - `name` — prefix for tool names from this server (optional)
387
+ - `command` / `args` / `env` — for stdio transport
388
+ - `url` / `headers` — for HTTP transport
389
+
279
390
  ### Configuration
280
391
 
281
392
  For CLI use, create an `axle.config.yaml` in your working directory with API
package/dist/cli.js CHANGED
@@ -1,7 +1,8 @@
1
1
  #!/usr/bin/env node
2
- var Y=Object.defineProperty;var i=(e,t)=>Y(e,"name",{value:t,configurable:!0});import{Command as Z}from"@commander-js/extra-typings";import J from"yaml";import{l as q,a as K,n as Q,D as ee,i as te,d as oe,p as ne,r as N,o as j,I as U,h as P,w as re,t as ae,u as ie,v as se,k as ce,j as le,T as ue,S as M}from"./simple-PYzpQ26F.js";import{z as n}from"zod";import{glob as pe}from"glob";import{readFile as _,mkdir as de,appendFile as fe}from"node:fs/promises";import{createHash as me}from"node:crypto";import{dirname as he}from"node:path";import"mime";import"@anthropic-ai/sdk";import"@google/genai";import"openai";import"node:child_process";import"node:util";class A extends Error{static{i(this,"AxleError")}code;id;details;constructor(t,o){super(t,{cause:o?.cause}),this.name=this.constructor.name,this.code=o?.code||"AXLE_ERROR",this.id=o?.id,this.details=o?.details,Object.setPrototypeOf(this,A.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:R(this.cause)}}}}function R(e){return e instanceof Error?{name:e.name,message:e.message,...e.stack&&{stack:e.stack},..."cause"in e&&e.cause&&{cause:R(e.cause)}}:e}i(R,"serializeError");function ge(e,t){if(!t||Object.keys(t).length===0)throw new A(`The provider ${e} is not configured. Please check your configuration.`);switch(e){case"openai":return{provider:ne(t["api-key"]),model:t.model||oe};case"anthropic":return{provider:te(t["api-key"]),model:t.model||ee};case"gemini":return{provider:Q(t["api-key"]),model:t.model||K};case"chatcompletions":{const o=t;return{provider:q(o["base-url"],o["api-key"]),model:o.model}}default:throw new A("The provider is unsupported")}}i(ge,"getProvider");var we="0.7.2",ye={version:we};n.object({value:n.string()});const be=n.object({"api-key":n.string(),rateLimit:n.number().optional()});n.object({timeout:n.number().optional(),maxBuffer:n.number().optional(),cwd:n.string().optional()});const ve=n.object({type:n.literal("chatcompletions")}).loose(),Se=n.object({type:n.literal("anthropic")}).loose(),ke=n.object({type:n.literal("openai")}).loose(),Ee=n.object({type:n.literal("gemini")}).loose(),Te=n.discriminatedUnion("type",[ve,Se,ke,Ee]),Ae=n.object({chatcompletions:n.custom().optional(),anthropic:n.custom().optional(),openai:n.custom().optional(),gemini:n.custom().optional(),brave:be.optional()}).loose(),Oe=n.object({files:n.string(),resume:n.boolean().default(!1),concurrency:n.number().int().positive().default(3)}),je=n.object({provider:Te,task:n.string(),tools:n.array(n.string()).optional(),files:n.array(n.string()).optional(),batch:Oe.optional()}),Le="axle.job",Fe=["yaml","yml","json"];async function xe(e,t){const{tracer:o}=t,{content:l,format:s}=await N(e,{defaults:{name:Le,formats:Fe},tag:"Job File"});let a=null;if(s==="json")a=JSON.parse(l);else if(s==="yaml"||s==="yml")a=J.parse(l);else throw new Error("Invalid job file format");o?.debug("Job config: "+JSON.stringify(a,null,2));const c=je.safeParse(a);if(!c.success)throw new Error(`The job file is not valid:
3
- ${B(c.error)}`);return c.data}i(xe,"getJobConfig");const De="axle.config",$e=["yaml","yml","json"];async function Ie(e,t){const{tracer:o}=t,{content:l,format:s}=await N(e,{defaults:{name:De,formats:$e},tag:"Config File"});let a=null;if(s==="json")a=JSON.parse(l);else if(s==="yaml"||s==="yml")a=J.parse(l);else throw new Error("Invalid config file format");o?.debug("Service config: "+JSON.stringify(a,null,2));const c=Ae.safeParse(a);if(!c.success)throw new Error(`The config file is not valid:
4
- ${B(c.error)}`);return c.data}i(Ie,"getServiceConfig");function B(e){return e.issues.map(t=>` - ${t.path.join(".")||"root"}: ${t.message}`).join(`
5
- `)}i(B,"formatZodError");const W=".axle/batch.jsonl";function Ce(e,t){const o=me("sha256");return o.update(e),o.update("\0"),o.update(t),o.digest("hex")}i(Ce,"computeHash");async function Je(e=W){const t=new Map;let o;try{o=await _(e,"utf-8")}catch{return t}for(const l of o.split(`
6
- `)){const s=l.trim();if(s)try{const a=JSON.parse(s);a.file&&a.hash&&t.set(a.file,a)}catch{}}return t}i(Je,"loadLedger");async function Ne(e,t=W){await de(he(t),{recursive:!0}),await fe(t,JSON.stringify(e)+`
7
- `,"utf-8")}i(Ne,"appendLedgerEntry");async function Ue(e,t,o,l,s,a,c,m){const p=new U(e.task);if(e.files)for(const v of e.files)p.addFile(await j(v));const g=m.startSpan("job",{type:"workflow"}),w=await new P({provider:t,model:o,tools:l,tracer:g}).send(p,s).final;g.end(),c.in+=w.usage.in,c.out+=w.usage.out,w.response&&m.info("Response: "+JSON.stringify(w.response,null,2))}i(Ue,"runSingle");async function Pe(e,t,o,l,s,a,c,m){const p=e.batch,g=await pe(p.files);if(g.length===0){m.warn(`No files matched pattern: ${p.files}`);return}m.info(`Batch: ${g.length} file(s) matched "${p.files}"`);const x=p.resume?await Je():new Map,w=e.files?await Promise.all(e.files.map(d=>j(d))):[];let v=0,D=0,$=0;const z=p.concurrency??3;await Me(z,g,async d=>{const y=m.startSpan(`batch:${d}`,{type:"workflow"});try{const b=await _(d),S=Ce(e.task,b),I=x.get(d);if(p.resume&&I&&I.hash===S){y.info("Skipped (already completed)"),y.end(),D++;return}const O=new U(e.task);for(const X of w)O.addFile(X);O.addFile(await j(d));const V={...s,file:d},C=await new P({provider:t,model:o,tools:l,tracer:y}).send(O,V).final;c.in+=C.usage.in,c.out+=C.usage.out,await Ne({file:d,hash:S,timestamp:Date.now()}),y.end(),v++}catch(b){const S=b instanceof Error?b.message:String(b);y.error(`Failed: ${S}`),y.end("error"),$++}}),m.info(`Batch complete: ${v} completed, ${D} skipped, ${$} failed`)}i(Pe,"runBatch");async function Me(e,t,o){let l=0;async function s(){for(;l<t.length;){const c=l++;await o(t[c])}}i(s,"worker");const a=Array.from({length:Math.min(e,t.length)},()=>s());await Promise.all(a)}i(Me,"runWithConcurrency");function _e(e,t){switch(e){case"brave":return le;case"calculator":return ce;case"exec":return se;case"patch-file":return ie;case"read-file":return ae;case"write-file":return re;default:throw new Error(`Unknown tool: ${e}`)}}i(_e,"createTool");function Re(e,t){return e.map(o=>_e(o))}i(Re,"createTools");const k=new Z().name("axle").description("Axle is a CLI tool for running AI workflows").version(ye.version).option("--dry-run","Run the application without executing against the AI providers").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("--no-warn-unused","Do not warn about unused variables").option("--no-inline","Do not inline the console output").option("-d, --debug","Print additional debug information").option("--truncate <num>","Truncate printed strings to a certain number of characters, 0 to disable",parseInt,100).option("--args <args...>","Additional arguments in the form key=value");k.parse(process.argv);const u=k.opts(),E={date:new Date().toISOString().split("T")[0],datetime:new Date().toISOString(),cwd:process.cwd()};u.args&&u.args.forEach(e=>{const[t,o]=e.split("=");t&&o&&(E[t.trim()]=o.trim())});const f=new ue;u.debug&&(f.minLevel="debug");const Be=new M({minLevel:u.debug?"debug":"info",showInternal:u.debug,showTimestamp:!0});if(f.addWriter(Be),u.log){const e=new M({minLevel:"debug",showInternal:!0,showTimestamp:!0,output:i(t=>{},"output")});f.addWriter(e)}const r=f.startSpan("cli",{type:"root"});process.on("uncaughtException",async e=>{console.error("Uncaught exception:"),console.error(e),r.error("Uncaught exception:"),r.error(e.message),r.error(e.stack||""),r.end("error"),await f.flush(),process.exit(1)}),u.debug&&(r.debug("Options: "+JSON.stringify(u,null,2)),r.debug("Additional Arguments: "+JSON.stringify(E,null,2)));let G,h;try{G=await Ie(u.config??null,{tracer:r}),h=await xe(u.job??null,{tracer:r})}catch(e){const t=e instanceof Error?e:new Error(String(e));r.error(t.message),r.debug(t.stack??""),r.end("error"),await f.flush(),k.outputHelp(),process.exit(1)}let L,F;try{const{type:e,...t}=h.provider,o={...G[e],...t};({provider:L,model:F}=ge(e,o))}catch(e){const t=e instanceof Error?e:new Error(String(e));r.error(t.message),r.error(t.stack??""),r.end("error"),await f.flush(),k.outputHelp(),process.exit(1)}r.info("All systems operational. Running job..."),u.dryRun&&r.info("Dry run mode enabled. No API calls will be made.");const H=h.tools?.length?Re(h.tools):[],T={in:0,out:0},We=performance.now();h.batch?await Pe(h,L,F,H,E,u,T,r):await Ue(h,L,F,H,E,u,T,r);const Ge=performance.now()-We;r.info(`Total run time: ${Math.round(Ge)}ms`),r.info(`Input tokens: ${T.in}`),r.info(`Output tokens: ${T.out}`),r.info("Complete. Goodbye"),r.end(),await f.flush();
2
+ var Z=Object.defineProperty;var l=(e,t)=>Z(e,"name",{value:t,configurable:!0});import{Command as K}from"@commander-js/extra-typings";import U from"yaml";import{t as D,m as Q,a as X,o as ee,D as te,j as oe,d as re,q as ne,u as J,i as ie,p as x,I as N,h as _,w as ae,v as se,x as ce,y as le,l as pe,k as ue,T as fe,S as B}from"./simple-Cn_DeT3l.js";import{z as o}from"zod";import{glob as me}from"glob";import{readFile as G,mkdir as de,appendFile as ge}from"node:fs/promises";import{createInterface as he}from"node:readline";import{createHash as we}from"node:crypto";import{dirname as ye}from"node:path";import"mime";import"@anthropic-ai/sdk";import"@google/genai";import"openai";import"node:child_process";import"node:util";import"@modelcontextprotocol/sdk/client/index.js";import"@modelcontextprotocol/sdk/client/stdio.js";import"@modelcontextprotocol/sdk/client/streamableHttp.js";import"marked";import"marked-terminal";function ve(e,t){if(!t||Object.keys(t).length===0)throw new D(`The provider ${e} is not configured. Please check your configuration.`);switch(e){case"openai":return{provider:ne(t["api-key"]),model:t.model||re};case"anthropic":return{provider:oe(t["api-key"]),model:t.model||te};case"gemini":return{provider:ee(t["api-key"]),model:t.model||X};case"chatcompletions":{const r=t;return{provider:Q(r["base-url"],r["api-key"]),model:r.model}}default:throw new D("The provider is unsupported")}}l(ve,"getProvider");var be="0.8.1",Se={version:be};o.object({value:o.string()});const ke=o.object({"api-key":o.string(),rateLimit:o.number().optional()});o.object({timeout:o.number().optional(),maxBuffer:o.number().optional(),cwd:o.string().optional()});const Ee=o.object({type:o.literal("chatcompletions")}).loose(),Te=o.object({type:o.literal("anthropic")}).loose(),je=o.object({type:o.literal("openai")}).loose(),Ae=o.object({type:o.literal("gemini")}).loose(),Ce=o.discriminatedUnion("type",[Ee,Te,je,Ae]),Oe=o.object({chatcompletions:o.custom().optional(),anthropic:o.custom().optional(),openai:o.custom().optional(),gemini:o.custom().optional(),brave:ke.optional()}).loose(),xe=o.object({transport:o.literal("stdio"),name:o.string().optional(),command:o.string(),args:o.array(o.string()).optional(),env:o.record(o.string(),o.string()).optional()}),Fe=o.object({transport:o.literal("http"),name:o.string().optional(),url:o.string(),headers:o.record(o.string(),o.string()).optional()}),Le=o.discriminatedUnion("transport",[xe,Fe]),Ie=o.object({files:o.string(),resume:o.boolean().default(!1),concurrency:o.number().int().positive().default(3)}),Me=o.object({provider:Ce,task:o.string(),tools:o.array(o.string()).optional(),server_tools:o.array(o.string()).optional(),files:o.array(o.string()).optional(),mcps:o.array(Le).optional(),batch:Ie.optional()}),Pe="axle.job",$e=["yaml","yml","json"];async function Ue(e,t){const{tracer:r}=t,{content:s,format:c}=await J(e,{defaults:{name:Pe,formats:$e},tag:"Job File"});let i=null;if(c==="json")i=JSON.parse(s);else if(c==="yaml"||c==="yml")i=U.parse(s);else throw new Error("Invalid job file format");r?.debug("Job config: "+JSON.stringify(i,null,2));const a=Me.safeParse(i);if(!a.success)throw new Error(`The job file is not valid:
3
+ ${H(a.error)}`);return a.data}l(Ue,"getJobConfig");const De="axle.config",Je=["yaml","yml","json"];async function Ne(e,t){const{tracer:r}=t,{content:s,format:c}=await J(e,{defaults:{name:De,formats:Je},tag:"Config File"});let i=null;if(c==="json")i=JSON.parse(s);else if(c==="yaml"||c==="yml")i=U.parse(s);else throw new Error("Invalid config file format");r?.debug("Service config: "+JSON.stringify(i,null,2));const a=Oe.safeParse(i);if(!a.success)throw new Error(`The config file is not valid:
4
+ ${H(a.error)}`);return a.data}l(Ne,"getServiceConfig");function H(e){return e.issues.map(t=>` - ${t.path.join(".")||"root"}: ${t.message}`).join(`
5
+ `)}l(H,"formatZodError");async function _e(e,t){const r=[];for(const s of e){const c=new ie(s);await c.connect({tracer:t}),r.push(c)}return r}l(_e,"connectMcps");async function Be(e,t){for(const r of e)try{await r.close({tracer:t})}catch{}}l(Be,"closeMcps");const W=".axle/batch.jsonl";function Ge(e,t){const r=we("sha256");return r.update(e),r.update("\0"),r.update(t),r.digest("hex")}l(Ge,"computeHash");async function He(e=W){const t=new Map;let r;try{r=await G(e,"utf-8")}catch{return t}for(const s of r.split(`
6
+ `)){const c=s.trim();if(c)try{const i=JSON.parse(c);i.file&&i.hash&&t.set(i.file,i)}catch{}}return t}l(He,"loadLedger");async function We(e,t=W){await de(ye(t),{recursive:!0}),await ge(t,JSON.stringify(e)+`
7
+ `,"utf-8")}l(We,"appendLedgerEntry");async function Re(e,t,r,s,c,i,a,f,h){const d=new N(e.task);if(e.files)for(const p of e.files)d.addFile(await x(p));const w=h.startSpan("job",{type:"workflow"}),E=new _({provider:t,model:r,tools:s,mcps:c,tracer:w});try{const p=await E.send(d,i).final;if(f.in+=p.usage.in,f.out+=p.usage.out,p.response){const v=typeof p.response=="string"?p.response:JSON.stringify(p.response,null,2);h.info(v,{markdown:!0})}a.interactive&&await qe(E,f,h),w.end()}catch(p){const v=p instanceof Error?p.message:String(p);throw w.error(v),w.end("error"),p}}l(Re,"runSingle");async function qe(e,t,r){const s=he({input:process.stdin,output:process.stdout});s.on("SIGINT",()=>{s.close()});const c=l(i=>new Promise(a=>{s.question(i,a),s.once("close",()=>a(null))}),"prompt");try{for(;;){const i=await c(`
8
+ > `);if(i===null||i.trim()==="")break;try{const a=await e.send(i.trim()).final;if(t.in+=a.usage.in,t.out+=a.usage.out,a.response){const f=typeof a.response=="string"?a.response:JSON.stringify(a.response,null,2);r.info(f,{markdown:!0})}}catch(a){const f=a instanceof Error?a.message:String(a);r.error(f)}}}finally{s.close()}}l(qe,"runInteractiveLoop");async function ze(e,t,r,s,c,i,a,f,h){const d=e.batch,w=await me(d.files);if(w.length===0){h.warn(`No files matched pattern: ${d.files}`);return}h.info(`Batch: ${w.length} file(s) matched "${d.files}"`);const E=d.resume?await He():new Map,p=e.files?await Promise.all(e.files.map(y=>x(y))):[];let v=0,I=0,M=0;const z=d.concurrency??3;await Ve(z,w,async y=>{const b=h.startSpan(`batch:${y}`,{type:"workflow"});try{const S=await G(y),T=Ge(e.task,S),P=E.get(y);if(d.resume&&P&&P.hash===T){b.info("Skipped (already completed)"),b.end(),I++;return}const O=new N(e.task);for(const Y of p)O.addFile(Y);O.addFile(await x(y));const V={...i,file:y},$=await new _({provider:t,model:r,tools:s,mcps:c,tracer:b}).send(O,V).final;f.in+=$.usage.in,f.out+=$.usage.out,await We({file:y,hash:T,timestamp:Date.now()}),b.end(),v++}catch(S){const T=S instanceof Error?S.message:String(S);b.error(`Failed: ${T}`),b.end("error"),M++}}),h.info(`Batch complete: ${v} completed, ${I} skipped, ${M} failed`)}l(ze,"runBatch");async function Ve(e,t,r){let s=0;async function c(){for(;s<t.length;){const a=s++;await r(t[a])}}l(c,"worker");const i=Array.from({length:Math.min(e,t.length)},()=>c());await Promise.all(i)}l(Ve,"runWithConcurrency");function Ye(e,t){switch(e){case"brave":return ue;case"calculator":return pe;case"exec":return le;case"patch-file":return ce;case"read-file":return se;case"write-file":return ae;default:throw new Error(`Unknown tool: ${e}`)}}l(Ye,"createTool");function Ze(e,t){return e.map(r=>Ye(r))}l(Ze,"createTools");const j=new K().name("axle").description("Axle is a CLI tool for running AI workflows").version(Se.version).option("-c, --config <path>","Path to the config file").option("-j, --job <path>","Path to the job file").option("--no-log","Do not write the output to a log file").option("-d, --debug","Print additional debug information").option("-i, --interactive","Continue the conversation interactively after the initial task").option("--args <args...>","Additional arguments in the form key=value");j.parse(process.argv);const u=j.opts(),A={date:new Date().toISOString().split("T")[0],datetime:new Date().toISOString(),cwd:process.cwd()};u.args&&u.args.forEach(e=>{const[t,r]=e.split("=");t&&r&&(A[t.trim()]=r.trim())});const g=new fe;u.debug&&(g.minLevel="debug");const Ke=new B({minLevel:u.debug?"debug":"info",showInternal:u.debug,showTimestamp:!0,markdown:!0});if(g.addWriter(Ke),u.log){const e=new B({minLevel:"debug",showInternal:!0,showTimestamp:!0,output:l(t=>{},"output")});g.addWriter(e)}const n=g.startSpan("cli",{type:"root"});process.on("uncaughtException",async e=>{console.error("Uncaught exception:"),console.error(e),n.error("Uncaught exception:"),n.error(e.message),n.error(e.stack||""),n.end("error"),await g.flush(),process.exit(1)}),u.debug&&(n.debug("Options: "+JSON.stringify(u,null,2)),n.debug("Additional Arguments: "+JSON.stringify(A,null,2)));let R,m;try{R=await Ne(u.config??null,{tracer:n}),m=await Ue(u.job??null,{tracer:n})}catch(e){const t=e instanceof Error?e:new Error(String(e));n.error(t.message),n.debug(t.stack??""),n.end("error"),await g.flush(),j.outputHelp(),process.exit(1)}let F,L;try{const{type:e,...t}=m.provider,r={...R[e],...t};({provider:F,model:L}=ve(e,r))}catch(e){const t=e instanceof Error?e:new Error(String(e));n.error(t.message),n.error(t.stack??""),n.end("error"),await g.flush(),j.outputHelp(),process.exit(1)}n.info("All systems operational. Running job...");const Qe=(m.server_tools??[]).map(e=>({type:"server",name:e})),q=[...m.tools?.length?Ze(m.tools):[],...Qe];let k=[];if(m.mcps?.length)try{k=await _e(m.mcps,n)}catch(e){const t=e instanceof Error?e:new Error(String(e));n.error("Failed to connect MCP servers: "+t.message),n.end("error"),await g.flush(),process.exit(1)}const C={in:0,out:0},Xe=performance.now();try{m.batch?await ze(m,F,L,q,k,A,u,C,n):await Re(m,F,L,q,k,A,u,C,n)}catch(e){const t=e instanceof Error?e:new Error(String(e));n.error(t.message),n.debug(t.stack??"")}finally{k.length>0&&await Be(k,n)}const et=performance.now()-Xe;n.info(`Total run time: ${Math.round(et)}ms`),n.info(`Input tokens: ${C.in}`),n.info(`Output tokens: ${C.out}`),n.info("Complete. Goodbye"),n.end(),await g.flush();
package/dist/index.d.ts CHANGED
@@ -98,6 +98,7 @@ interface StreamToolCallCompleteChunk extends StreamChunk {
98
98
  id: string;
99
99
  name: string;
100
100
  arguments: any;
101
+ providerMetadata?: Record<string, unknown>;
101
102
  };
102
103
  }
103
104
  interface StreamInternalToolStartChunk extends StreamChunk {
@@ -119,16 +120,6 @@ interface StreamInternalToolCompleteChunk extends StreamChunk {
119
120
  }
120
121
  type AnyStreamChunk = StreamStartChunk | StreamCompleteChunk | StreamErrorChunk | StreamTextStartChunk | StreamTextDeltaChunk | StreamTextCompleteChunk | StreamThinkingStartChunk | StreamThinkingDeltaChunk | StreamThinkingSummaryDeltaChunk | StreamThinkingCompleteChunk | StreamToolCallStartChunk | StreamToolCallCompleteChunk | StreamInternalToolStartChunk | StreamInternalToolCompleteChunk;
121
122
 
122
- interface Tool<TSchema extends ZodObject<any> = ZodObject<any>> {
123
- name: string;
124
- description: string;
125
- schema: TSchema;
126
- execute(input: z$1.infer<TSchema>): Promise<string>;
127
- configure?(config: Record<string, any>): void;
128
- summarize?(input: z$1.infer<TSchema>): string;
129
- }
130
- type ToolDefinition = Pick<Tool, "name" | "description" | "schema">;
131
-
132
123
  type SpanStatus = "ok" | "error";
133
124
  type EventLevel = "debug" | "info" | "warn" | "error";
134
125
  type SpanType = string;
@@ -327,10 +318,19 @@ interface AxleToolCallMessage {
327
318
  role: "tool";
328
319
  content: Array<AxleToolCallResult>;
329
320
  }
321
+ type ToolResultPart = {
322
+ type: "text";
323
+ text: string;
324
+ } | {
325
+ type: "image";
326
+ data: string;
327
+ mimeType: string;
328
+ };
330
329
  interface AxleToolCallResult {
331
330
  id: string;
332
331
  name: string;
333
- content: string;
332
+ content: string | ToolResultPart[];
333
+ isError?: boolean;
334
334
  }
335
335
  type ContentPart = ContentPartText | ContentPartFile | ContentPartToolCall | ContentPartThinking | ContentPartInternalTool;
336
336
  interface ContentPartText {
@@ -355,6 +355,7 @@ interface ContentPartToolCall {
355
355
  id: string;
356
356
  name: string;
357
357
  parameters: Record<string, unknown>;
358
+ providerMetadata?: Record<string, unknown>;
358
359
  }
359
360
  interface ContentPartInternalTool {
360
361
  type: "internal-tool";
@@ -364,6 +365,65 @@ interface ContentPartInternalTool {
364
365
  output?: unknown;
365
366
  }
366
367
 
368
+ interface ExecutableTool<TSchema extends ZodObject<any> = ZodObject<any>> {
369
+ type?: "function";
370
+ name: string;
371
+ description: string;
372
+ schema: TSchema;
373
+ execute(input: z$1.infer<TSchema>): Promise<string | ToolResultPart[]>;
374
+ configure?(config: Record<string, any>): void;
375
+ summarize?(input: z$1.infer<TSchema>): string;
376
+ }
377
+ interface ServerTool {
378
+ type: "server";
379
+ name: string;
380
+ config?: Record<string, unknown>;
381
+ }
382
+ type AxleTool = ExecutableTool | ServerTool;
383
+ type ToolDefinition = Pick<ExecutableTool, "name" | "description" | "schema">;
384
+
385
+ interface MCPStdioConfig {
386
+ transport: "stdio";
387
+ name?: string;
388
+ command: string;
389
+ args?: string[];
390
+ env?: Record<string, string>;
391
+ }
392
+ interface MCPHttpConfig {
393
+ transport: "http";
394
+ name?: string;
395
+ url: string;
396
+ headers?: Record<string, string>;
397
+ }
398
+ type MCPConfig = MCPStdioConfig | MCPHttpConfig;
399
+ declare class MCP {
400
+ private config;
401
+ private client;
402
+ private transport;
403
+ private cachedMcpTools;
404
+ private _connected;
405
+ constructor(config: MCPConfig);
406
+ get name(): string | undefined;
407
+ get connected(): boolean;
408
+ connect(options?: {
409
+ tracer?: TracingContext;
410
+ }): Promise<void>;
411
+ listTools(options?: {
412
+ prefix?: string;
413
+ tracer?: TracingContext;
414
+ }): Promise<ExecutableTool[]>;
415
+ listToolDefinitions(options?: {
416
+ prefix?: string;
417
+ tracer?: TracingContext;
418
+ }): Promise<ToolDefinition[]>;
419
+ refreshTools(): Promise<ExecutableTool[]>;
420
+ close(options?: {
421
+ tracer?: TracingContext;
422
+ }): Promise<void>;
423
+ private fetchTools;
424
+ private assertConnected;
425
+ }
426
+
367
427
  declare class History {
368
428
  system: string;
369
429
  private _messages;
@@ -402,7 +462,7 @@ declare function generateTurn(props: GenerateTurnProps): Promise<ModelResult>;
402
462
 
403
463
  type ToolCallResult = {
404
464
  type: "success";
405
- content: string;
465
+ content: string | ToolResultPart[];
406
466
  } | {
407
467
  type: "error";
408
468
  error: {
@@ -441,41 +501,77 @@ type StreamResult = GenerateResult | {
441
501
  usage: Stats;
442
502
  };
443
503
 
444
- type StreamPartType = "text" | "thinking";
445
- type PartStartCallback = (index: number, type: StreamPartType) => void;
446
- type PartUpdateCallback = (index: number, type: StreamPartType, delta: string, accumulated: string) => void;
447
- type PartEndCallback = (index: number, type: StreamPartType, final: string) => void;
448
- type InternalToolEvent = {
449
- type: "start";
504
+ type StreamEvent = {
505
+ type: "text:start";
506
+ index: number;
507
+ } | {
508
+ type: "text:delta";
509
+ index: number;
510
+ delta: string;
511
+ accumulated: string;
512
+ } | {
513
+ type: "text:end";
514
+ index: number;
515
+ final: string;
516
+ } | {
517
+ type: "thinking:start";
518
+ index: number;
519
+ } | {
520
+ type: "thinking:delta";
521
+ index: number;
522
+ delta: string;
523
+ accumulated: string;
524
+ } | {
525
+ type: "thinking:end";
526
+ index: number;
527
+ final: string;
528
+ } | {
529
+ type: "tool:start";
450
530
  index: number;
451
531
  id: string;
452
532
  name: string;
453
533
  } | {
454
- type: "complete";
534
+ type: "tool:execute";
535
+ index: number;
536
+ id: string;
537
+ name: string;
538
+ parameters: Record<string, unknown>;
539
+ } | {
540
+ type: "tool:complete";
541
+ index: number;
542
+ id: string;
543
+ name: string;
544
+ result: ToolCallResult | null;
545
+ } | {
546
+ type: "internal-tool:start";
547
+ index: number;
548
+ id: string;
549
+ name: string;
550
+ } | {
551
+ type: "internal-tool:complete";
455
552
  index: number;
456
553
  id: string;
457
554
  name: string;
458
555
  output?: unknown;
556
+ } | {
557
+ type: "error";
558
+ error: GenerateError;
459
559
  };
460
- type InternalToolCallback = (event: InternalToolEvent) => void;
461
- type ErrorCallback = (error: GenerateError) => void;
560
+ type StreamEventCallback = (event: StreamEvent) => void;
462
561
  interface StreamOptions {
463
562
  provider: AIProvider;
464
563
  model: string;
465
564
  messages: Array<AxleMessage>;
466
565
  system?: string;
467
566
  tools?: Array<ToolDefinition>;
567
+ serverTools?: Array<ServerTool>;
468
568
  onToolCall?: ToolCallCallback;
469
569
  maxIterations?: number;
470
570
  tracer?: TracingContext;
471
571
  options?: GenerateTurnOptions;
472
572
  }
473
573
  interface StreamHandle {
474
- onPartStart(callback: PartStartCallback): void;
475
- onPartUpdate(callback: PartUpdateCallback): void;
476
- onPartEnd(callback: PartEndCallback): void;
477
- onInternalTool(callback: InternalToolCallback): void;
478
- onError(callback: ErrorCallback): void;
574
+ on(callback: StreamEventCallback): void;
479
575
  cancel(): void;
480
576
  readonly final: Promise<StreamResult>;
481
577
  }
@@ -511,7 +607,8 @@ interface AgentConfig {
511
607
  provider: AIProvider;
512
608
  model: string;
513
609
  system?: string;
514
- tools?: Tool[];
610
+ tools?: AxleTool[];
611
+ mcps?: MCP[];
515
612
  tracer?: TracingContext;
516
613
  }
517
614
  interface AgentResult<T = string> {
@@ -530,24 +627,22 @@ declare class Agent {
530
627
  readonly history: History;
531
628
  readonly tracer?: TracingContext;
532
629
  system: string | undefined;
533
- tools: Record<string, Tool>;
534
- private partStartCallback?;
535
- private partUpdateCallback?;
536
- private partEndCallback?;
537
- private internalToolCallback?;
538
- private errorCallback?;
630
+ tools: Record<string, ExecutableTool>;
631
+ serverTools: ServerTool[];
632
+ private mcps;
633
+ private mcpToolsResolved;
634
+ private eventCallbacks;
539
635
  constructor(config: AgentConfig);
540
- addTool(tool: Tool): void;
541
- addTools(tools: Tool[]): void;
636
+ addTool(tool: AxleTool): void;
637
+ addTools(tools: AxleTool[]): void;
638
+ addMcp(mcp: MCP): void;
639
+ addMcps(mcps: MCP[]): void;
542
640
  hasTools(): boolean;
543
- onPartStart(callback: PartStartCallback): void;
544
- onPartUpdate(callback: PartUpdateCallback): void;
545
- onPartEnd(callback: PartEndCallback): void;
546
- onInternalTool(callback: InternalToolCallback): void;
547
- onError(callback: ErrorCallback): void;
641
+ on(callback: StreamEventCallback): void;
548
642
  send(message: string): AgentHandle<string>;
549
643
  send(instruct: Instruct<undefined>, variables?: Record<string, string>): AgentHandle<string>;
550
644
  send<TSchema extends OutputSchema>(instruct: Instruct<TSchema>, variables?: Record<string, string>): AgentHandle<ParsedSchema<TSchema>>;
645
+ private resolveMcpTools;
551
646
  private execute;
552
647
  }
553
648
 
@@ -587,22 +682,14 @@ declare const Gemini: {
587
682
  readonly GEMINI_3_1_PRO_PREVIEW_CUSTOMTOOLS: "gemini-3.1-pro-preview-customtools";
588
683
  readonly GEMINI_3_PRO_PREVIEW: "gemini-3-pro-preview";
589
684
  readonly GEMINI_3_FLASH_PREVIEW: "gemini-3-flash-preview";
590
- readonly GEMINI_3_PRO_IMAGE_PREVIEW: "gemini-3-pro-image-preview";
591
685
  readonly GEMINI_2_5_PRO: "gemini-2.5-pro";
592
686
  readonly GEMINI_2_5_FLASH: "gemini-2.5-flash";
593
- readonly GEMINI_2_5_FLASH_PREVIEW_09_2025: "gemini-2.5-flash-preview-09-2025";
594
- readonly GEMINI_2_5_FLASH_IMAGE: "gemini-2.5-flash-image";
595
687
  readonly GEMINI_2_5_FLASH_LITE: "gemini-2.5-flash-lite";
596
688
  readonly GEMINI_2_5_FLASH_LITE_PREVIEW_09_2025: "gemini-2.5-flash-lite-preview-09-2025";
597
- readonly GEMINI_2_5_FLASH_NATIVE_AUDIO_LATEST: "gemini-2.5-flash-native-audio-latest";
598
- readonly GEMINI_2_5_FLASH_NATIVE_AUDIO_PREVIEW_09_2025: "gemini-2.5-flash-native-audio-preview-09-2025";
599
- readonly GEMINI_2_5_FLASH_NATIVE_AUDIO_PREVIEW_12_2025: "gemini-2.5-flash-native-audio-preview-12-2025";
600
- readonly GEMINI_2_5_COMPUTER_USE_PREVIEW_10_2025: "gemini-2.5-computer-use-preview-10-2025";
601
689
  readonly GEMINI_2_0_FLASH: "gemini-2.0-flash";
602
690
  readonly GEMINI_2_0_FLASH_001: "gemini-2.0-flash-001";
603
691
  readonly GEMINI_2_0_FLASH_LITE: "gemini-2.0-flash-lite";
604
692
  readonly GEMINI_2_0_FLASH_LITE_001: "gemini-2.0-flash-lite-001";
605
- readonly GEMINI_EXP_1206: "gemini-exp-1206";
606
693
  readonly GEMINI_FLASH_LATEST: "gemini-flash-latest";
607
694
  readonly GEMINI_FLASH_LITE_LATEST: "gemini-flash-lite-latest";
608
695
  readonly GEMINI_PRO_LATEST: "gemini-pro-latest";
@@ -612,12 +699,8 @@ declare const Gemini: {
612
699
  readonly GEMMA_3_1B_IT: "gemma-3-1b-it";
613
700
  readonly GEMMA_3N_E4B_IT: "gemma-3n-e4b-it";
614
701
  readonly GEMMA_3N_E2B_IT: "gemma-3n-e2b-it";
615
- readonly DEEP_RESEARCH_PRO_PREVIEW_12_2025: "deep-research-pro-preview-12-2025";
616
- readonly GEMINI_ROBOTICS_ER_1_5_PREVIEW: "gemini-robotics-er-1.5-preview";
617
- readonly NANO_BANANA_PRO_PREVIEW: "nano-banana-pro-preview";
618
- readonly AQA: "aqa";
619
702
  };
620
- readonly DefaultModel: "gemini-2.5-flash-lite";
703
+ readonly DefaultModel: "gemini-3-flash-preview";
621
704
  };
622
705
 
623
706
  interface GenerateOptions {
@@ -681,23 +764,16 @@ declare const OpenAI: {
681
764
  readonly GPT_4_TURBO_2024_04_09: "gpt-4-turbo-2024-04-09";
682
765
  readonly O4_MINI: "o4-mini";
683
766
  readonly O4_MINI_2025_04_16: "o4-mini-2025-04-16";
684
- readonly O4_MINI_DEEP_RESEARCH: "o4-mini-deep-research";
685
- readonly O4_MINI_DEEP_RESEARCH_2025_06_26: "o4-mini-deep-research-2025-06-26";
686
767
  readonly O3: "o3";
687
768
  readonly O3_2025_04_16: "o3-2025-04-16";
688
769
  readonly O3_PRO: "o3-pro";
689
770
  readonly O3_PRO_2025_06_10: "o3-pro-2025-06-10";
690
771
  readonly O3_MINI: "o3-mini";
691
772
  readonly O3_MINI_2025_01_31: "o3-mini-2025-01-31";
692
- readonly O3_DEEP_RESEARCH: "o3-deep-research";
693
- readonly O3_DEEP_RESEARCH_2025_06_26: "o3-deep-research-2025-06-26";
694
773
  readonly O1: "o1";
695
774
  readonly O1_2024_12_17: "o1-2024-12-17";
696
775
  readonly O1_PRO: "o1-pro";
697
776
  readonly O1_PRO_2025_03_19: "o1-pro-2025-03-19";
698
- readonly COMPUTER_USE_PREVIEW: "computer-use-preview";
699
- readonly COMPUTER_USE_PREVIEW_2025_03_11: "computer-use-preview-2025-03-11";
700
- readonly CHATGPT_IMAGE_LATEST: "chatgpt-image-latest";
701
777
  };
702
778
  readonly DefaultModel: "gpt-5-mini";
703
779
  };
@@ -711,7 +787,7 @@ type BraveProviderConfig = z$1.infer<typeof BraveProviderConfigSchema>;
711
787
  declare const braveSearchSchema: z.ZodObject<{
712
788
  searchTerm: z.ZodString;
713
789
  }, z.core.$strip>;
714
- declare class BraveSearchTool implements Tool<typeof braveSearchSchema> {
790
+ declare class BraveSearchTool implements ExecutableTool<typeof braveSearchSchema> {
715
791
  name: string;
716
792
  description: string;
717
793
  schema: z.ZodObject<{
@@ -736,7 +812,7 @@ declare const calculatorSchema: z$1.ZodObject<{
736
812
  a: z$1.ZodNumber;
737
813
  b: z$1.ZodNumber;
738
814
  }, z$1.core.$strip>;
739
- declare const calculatorTool: Tool<typeof calculatorSchema>;
815
+ declare const calculatorTool: ExecutableTool<typeof calculatorSchema>;
740
816
 
741
817
  /**
742
818
  * Root tracer that manages writers and creates spans.
@@ -779,6 +855,8 @@ interface SimpleWriterOptions {
779
855
  showTimestamp?: boolean;
780
856
  /** Show duration on span end (default: true) */
781
857
  showDuration?: boolean;
858
+ /** Render markdown in event messages that have markdown: true attribute (default: false) */
859
+ markdown?: boolean;
782
860
  /** Custom output function (default: console.log) */
783
861
  output?: (line: string) => void;
784
862
  }
@@ -787,6 +865,7 @@ declare class SimpleWriter implements TraceWriter {
787
865
  private showInternal;
788
866
  private showTimestamp;
789
867
  private showDuration;
868
+ private markdown;
790
869
  private output;
791
870
  private spans;
792
871
  private visibleDepths;
@@ -807,6 +886,7 @@ declare class SimpleWriter implements TraceWriter {
807
886
  private formatDuration;
808
887
  private formatIndent;
809
888
  private formatSpanName;
889
+ private renderMarkdown;
810
890
  onSpanStart(span: SpanData): void;
811
891
  onSpanEnd(span: SpanData): void;
812
892
  onSpanUpdate(span: SpanData): void;
@@ -816,5 +896,5 @@ declare class SimpleWriter implements TraceWriter {
816
896
  onLLMStreamEnd(span: SpanData, result: LLMResult): void;
817
897
  }
818
898
 
819
- export { Agent, Anthropic, AxleStopReason, Gemini, History, Instruct, OpenAI, SimpleWriter, Tracer, anthropic, braveSearchTool, calculatorTool, chatCompletions, compileInstruct, gemini, generate, generateTurn, loadFileContent, openai, parseResponse, stream };
820
- export type { AIProvider, AgentConfig, AgentHandle, AgentResult, AxleAssistantMessage, AxleMessage, AxleToolCallMessage, AxleToolCallResult, AxleUserMessage, ContentPart, ContentPartFile, ContentPartText, ContentPartThinking, ContentPartToolCall, EventLevel, FileInfo, SimpleWriterOptions, SpanData, SpanOptions, SpanType, Tool, ToolDefinition, TraceWriter, TracingContext };
899
+ export { Agent, Anthropic, AxleStopReason, Gemini, History, Instruct, MCP, OpenAI, SimpleWriter, Tracer, anthropic, braveSearchTool, calculatorTool, chatCompletions, compileInstruct, gemini, generate, generateTurn, loadFileContent, openai, parseResponse, stream };
900
+ export type { AIProvider, AgentConfig, AgentHandle, AgentResult, AxleAssistantMessage, AxleMessage, AxleTool, AxleToolCallMessage, AxleToolCallResult, AxleUserMessage, ContentPart, ContentPartFile, ContentPartText, ContentPartThinking, ContentPartToolCall, EventLevel, ExecutableTool, FileInfo, MCPConfig, MCPHttpConfig, MCPStdioConfig, ServerTool, SimpleWriterOptions, SpanData, SpanOptions, SpanType, StreamEvent, StreamEventCallback, ToolDefinition, ToolResultPart, TraceWriter, TracingContext };
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- var $=Object.defineProperty;var r=(n,a)=>$(n,"name",{value:a,configurable:!0});import{D as I,M as L,a as w,b as F,c as O,A,g as q,e as U,d as S,f as _}from"./simple-PYzpQ26F.js";import{h as oe,H as te,I as re,S as ne,T as ae,i as ie,j as le,k as ce,l as ue,m as me,n as pe,o as de,p as ge,q as fe,s as Me}from"./simple-PYzpQ26F.js";import"@anthropic-ai/sdk";import"zod";import"@google/genai";import"openai";import"glob";import"mime";import"node:fs/promises";import"node:path";import"node:child_process";import"node:util";const b={Models:L,DefaultModel:I},G={Models:F,DefaultModel:w};async function v(n){const{provider:a,model:i,messages:u,system:p,tools:d,tracer:g,options:l}=n;return a.createGenerationRequest(i,{messages:u,system:p,tools:d,context:{tracer:g},options:l})}r(v,"generateTurn");async function H(n){const{provider:a,model:i,messages:u,system:p,tools:d,onToolCall:g,maxIterations:l,tracer:m,options:C}=n,f=[...u],o=[],t={in:0,out:0};let M=0,h;const R=r(e=>{f.push(e),o.push(e)},"addMessage"),c=r(e=>(m?.setResult({kind:"llm",model:i,request:{messages:u},response:{content:e.result==="success"?e.final?.content:null},usage:e.usage?{inputTokens:e.usage.in,outputTokens:e.usage.out}:void 0,finishReason:e.result==="success"?e.final?.finishReason:void 0}),m?.end(e.result==="error"?"error":"ok"),e),"endWithResult"),E=r((e,s)=>{if(!e||s.type==="error"){e?.end("error");return}e.setResult({kind:"llm",model:s.model??i,request:{messages:f},response:{content:s.content},usage:s.usage?{inputTokens:s.usage.in,outputTokens:s.usage.out}:void 0,finishReason:s.finishReason}),e.end()},"setTurnResult");for(;;){if(l!==void 0&&M>=l)return c({result:"error",messages:o,error:{type:"model",error:{type:"error",error:{type:"MaxIterations",message:`Exceeded max iterations (${l})`}}},usage:t});M+=1;const e=m?.startSpan(`turn-${M}`,{type:"llm"}),s=await v({provider:a,model:i,messages:f,system:p,tools:d,tracer:e,options:C});if(O(t,s),E(e,s),s.type==="error")return c({result:"error",messages:o,error:{type:"model",error:s},usage:t});const y={role:"assistant",id:s.id,model:s.model,content:s.content,finishReason:s.finishReason};if(R(y),h=y,s.finishReason!==A.FunctionCall)return c({result:"success",messages:o,final:h,usage:t});const T=q(s.content);if(T.length===0)return c({result:"success",messages:o,final:h,usage:t});for(const x of T)m?.info(`tool call: ${x.name}`,{parameters:x.parameters});const{results:D,missingTool:k}=await U(T,g);if(D.length>0&&R({role:"tool",content:D}),k)return c({result:"error",messages:o,error:{type:"tool",error:k},usage:t})}}r(H,"generate");const W={Models:_,DefaultModel:S};export{oe as Agent,b as Anthropic,A as AxleStopReason,G as Gemini,te as History,re as Instruct,W as OpenAI,ne as SimpleWriter,ae as Tracer,ie as anthropic,le as braveSearchTool,ce as calculatorTool,ue as chatCompletions,me as compileInstruct,pe as gemini,H as generate,v as generateTurn,de as loadFileContent,ge as openai,fe as parseResponse,Me as stream};
1
+ var E=Object.defineProperty;var r=(n,a)=>E(n,"name",{value:a,configurable:!0});import{D as I,M as L,a as $,b as w,c as F,A as x,g as O,e as q,d as U,f as S}from"./simple-Cn_DeT3l.js";import{h as ae,H as ie,I as le,i as ce,S as ue,T as me,j as pe,k as de,l as ge,m as fe,n as Me,o as he,p as Te,q as Re,r as ye,s as De}from"./simple-Cn_DeT3l.js";import"@anthropic-ai/sdk";import"zod";import"@google/genai";import"openai";import"glob";import"mime";import"node:fs/promises";import"node:path";import"node:child_process";import"node:util";import"@modelcontextprotocol/sdk/client/index.js";import"@modelcontextprotocol/sdk/client/stdio.js";import"@modelcontextprotocol/sdk/client/streamableHttp.js";import"marked";import"marked-terminal";const _={Models:L,DefaultModel:I},b={Models:w,DefaultModel:$};async function A(n){const{provider:a,model:i,messages:u,system:p,tools:d,tracer:g,options:l}=n;return a.createGenerationRequest(i,{messages:u,system:p,tools:d,context:{tracer:g},options:l})}r(A,"generateTurn");async function G(n){const{provider:a,model:i,messages:u,system:p,tools:d,onToolCall:g,maxIterations:l,tracer:m,options:C}=n,f=[...u],o=[],t={in:0,out:0};let M=0,h;const T=r(e=>{f.push(e),o.push(e)},"addMessage"),c=r(e=>(m?.setResult({kind:"llm",model:i,request:{messages:u},response:{content:e.result==="success"?e.final?.content:null},usage:e.usage?{inputTokens:e.usage.in,outputTokens:e.usage.out}:void 0,finishReason:e.result==="success"?e.final?.finishReason:void 0}),m?.end(e.result==="error"?"error":"ok"),e),"endWithResult"),v=r((e,s)=>{if(!e||s.type==="error"){e?.end("error");return}e.setResult({kind:"llm",model:s.model??i,request:{messages:f},response:{content:s.content},usage:s.usage?{inputTokens:s.usage.in,outputTokens:s.usage.out}:void 0,finishReason:s.finishReason}),e.end()},"setTurnResult");for(;;){if(l!==void 0&&M>=l)return c({result:"error",messages:o,error:{type:"model",error:{type:"error",error:{type:"MaxIterations",message:`Exceeded max iterations (${l})`}}},usage:t});M+=1;const e=m?.startSpan(`turn-${M}`,{type:"llm"}),s=await A({provider:a,model:i,messages:f,system:p,tools:d,tracer:e,options:C});if(F(t,s),v(e,s),s.type==="error")return c({result:"error",messages:o,error:{type:"model",error:s},usage:t});const R={role:"assistant",id:s.id,model:s.model,content:s.content,finishReason:s.finishReason};if(T(R),h=R,s.finishReason!==x.FunctionCall)return c({result:"success",messages:o,final:h,usage:t});const y=O(s.content);if(y.length===0)return c({result:"success",messages:o,final:h,usage:t});const{results:D,missingTool:k}=await q(y,g,m);if(D.length>0&&T({role:"tool",content:D}),k)return c({result:"error",messages:o,error:{type:"tool",error:k},usage:t})}}r(G,"generate");const H={Models:S,DefaultModel:U};export{ae as Agent,_ as Anthropic,x as AxleStopReason,b as Gemini,ie as History,le as Instruct,ce as MCP,H as OpenAI,ue as SimpleWriter,me as Tracer,pe as anthropic,de as braveSearchTool,ge as calculatorTool,fe as chatCompletions,Me as compileInstruct,he as gemini,G as generate,A as generateTurn,Te as loadFileContent,Re as openai,ye as parseResponse,De as stream};
@@ -0,0 +1,36 @@
1
+ var je=Object.defineProperty;var i=(t,e)=>je(t,"name",{value:e,configurable:!0});import*as O from"zod";import F,{z as $}from"zod";import"glob";import Be from"mime";import{readFile as J,access as qe,stat as He,writeFile as ie,mkdir as Je}from"node:fs/promises";import{resolve as Q,extname as ce,dirname as We}from"node:path";import ze from"@anthropic-ai/sdk";import{FinishReason as R,GoogleGenAI as Ke}from"@google/genai";import Ve from"openai";import{exec as Xe}from"node:child_process";import{promisify as Ze}from"node:util";import{Client as Ye}from"@modelcontextprotocol/sdk/client/index.js";import{StdioClientTransport as Qe}from"@modelcontextprotocol/sdk/client/stdio.js";import{StreamableHTTPClientTransport as et}from"@modelcontextprotocol/sdk/client/streamableHttp.js";import{marked as le}from"marked";import{markedTerminal as tt}from"marked-terminal";class V extends Error{static{i(this,"AxleError")}code;id;details;constructor(e,n){super(e,{cause:n?.cause}),this.name=this.constructor.name,this.code=n?.code||"AXLE_ERROR",this.id=n?.id,this.details=n?.details,Object.setPrototypeOf(this,V.prototype)}toJSON(){return{name:this.name,message:this.message,code:this.code,...this.id&&{id:this.id},...this.details&&{details:this.details},...this.cause&&{cause:ue(this.cause)}}}}function ue(t){return t instanceof Error?{name:t.name,message:t.message,...t.stack&&{stack:t.stack},..."cause"in t&&t.cause&&{cause:ue(t.cause)}}:t}i(ue,"serializeError");var T=(t=>(t.Stop="stop",t.Length="length",t.FunctionCall="function_call",t.Error="error",t.Custom="custom",t.Cancelled="cancelled",t))(T||{});class pe{static{i(this,"History")}system;_messages=[];constructor(e){e&&(this._messages=e)}get messages(){return[...this._messages]}addSystem(e){this.system=e}addUser(e){typeof e=="string"?this._messages.push({role:"user",content:[{type:"text",text:e}]}):this._messages.push({role:"user",content:e})}addAssistant(e){if(typeof e=="string"){const n=e;this._messages.push({role:"assistant",id:crypto.randomUUID(),content:[{type:"text",text:n}],model:"user",finishReason:T.Custom})}else this._messages.push({role:"assistant",...e})}addToolResults(e){this._messages.push({role:"tool",content:e})}add(e){Array.isArray(e)?this._messages.push(...e):this._messages.push(e)}latest(){return this._messages[this._messages.length-1]}toString(){return JSON.stringify({system:this.system,messages:this._messages})}}function nt(t){const{text:e,files:n}=t,s=[];if(e&&s.push({type:"text",text:e}),n)for(const r of n)s.push({type:"file",file:r});return s}i(nt,"toContentParts");function H(t){return typeof t=="string"?t:t.filter(e=>e.type==="text").map(e=>e.text).join(`
2
+
3
+ `)}i(H,"getTextContent");function st(t){return t.filter(e=>e.type==="tool-call")}i(st,"getToolCalls");function rt(t,e){const n=e.usage??{in:0,out:0};t.in+=n.in??0,t.out+=n.out??0}i(rt,"appendUsage");function de(t){return JSON.stringify({error:t})}i(de,"serializeToolError");async function me(t,e,n){const s=[];let r;for(const o of t){const a=n?.startSpan(o.name,{type:"tool"});let l;try{l=await e(o.name,o.parameters)}catch(p){l={type:"error",error:{type:"exception",message:p instanceof Error?p.message:String(p)}}}if(l==null){r={name:o.name,message:`Tool not found: ${o.name}`},a?.setResult({kind:"tool",name:o.name,input:o.parameters,output:null}),a?.end("error"),s.push({id:o.id,name:o.name,content:de({type:"not-found",message:r.message}),isError:!0});break}l.type==="success"?(a?.setResult({kind:"tool",name:o.name,input:o.parameters,output:l.content}),a?.end("ok"),s.push({id:o.id,name:o.name,content:l.content})):(a?.setResult({kind:"tool",name:o.name,input:o.parameters,output:l.error}),a?.end("error"),s.push({id:o.id,name:o.name,content:de(l.error),isError:!0}))}return{results:s,missingTool:r}}i(me,"executeToolCalls");function C(t,e){for(const n of t)n(e)}i(C,"emit");function fe(t){const e=[],n=new AbortController;let s=!1,r,o;const a=new Promise((l,p)=>{r=i(d=>{s=!0,l(d)},"resolveResult"),o=i(d=>{s=!0,p(d)},"rejectResult")});return Promise.resolve().then(()=>ot(t,n.signal,e).then(r,o)),{on(l){e.push(l)},cancel(){s||n.abort()},get final(){return a}}}i(fe,"stream");async function ot(t,e,n){const{provider:s,model:r,messages:o,system:a,tools:l,serverTools:p,onToolCall:d,maxIterations:m,tracer:u,options:c}=t,_=[...o],h=[],f={in:0,out:0};let g=0,x=0;const S=i(E=>{_.push(E),h.push(E)},"addMessage"),k=i(E=>{E.result==="error"&&C(n,{type:"error",error:E.error});const G=E.result==="success"?E.final?.content:E.result==="cancelled"?E.partial?.content:null,D=E.result==="success"?E.final?.finishReason:E.result==="cancelled"?T.Cancelled:void 0;return u?.setResult({kind:"llm",model:r,request:{messages:o},response:{content:G??null},usage:E.usage?{inputTokens:E.usage.in,outputTokens:E.usage.out}:void 0,finishReason:D}),u?.end(E.result==="error"?"error":"ok"),E},"endWithResult"),L=i((E,G,D,I)=>{I();const M=E.length>0?{role:"assistant",id:G,model:D,content:E,finishReason:T.Cancelled}:void 0;return M&&S(M),u?.end("ok"),{result:"cancelled",messages:h,partial:M,usage:f}},"buildCancelledResult");for(;;){if(e.aborted)return L([],"","",()=>{});if(m!==void 0&&x>=m)return k({result:"error",messages:h,error:{type:"model",error:{type:"error",error:{type:"MaxIterations",message:`Exceeded max iterations (${m})`}}},usage:f});x+=1;const E=u?.startSpan(`turn-${x}`,{type:"llm"});E?.startLLMStream();const G=p?{...c,serverTools:p}:c,D=s.createStreamingRequest?.(r,{messages:_,system:a,tools:l,context:{tracer:E},signal:e,options:G});if(!D)throw E?.end("error"),new Error("Provider does not support streaming. Use generate() instead.");const I=[];let j="",M="",B=null,q={in:0,out:0},P=-1,W=null,v="";const ne=new Map;let U=-1;const N=i(()=>{W!==null&&P>=0&&(C(n,{type:W==="text"?"text:end":"thinking:end",index:P,final:v}),W=null,v="",P=-1)},"closePart");for await(const y of D){switch(y.type){case"start":j=y.id,M=y.data.model;break;case"text-start":{N(),I.push({type:"text",text:""}),U=I.length-1,P=g++,W="text",v="",C(n,{type:"text:start",index:P});break}case"text-delta":{const w=I[U];w.text+=y.data.text,v=w.text,E?.appendLLMStream(y.data.text),C(n,{type:"text:delta",index:P,delta:y.data.text,accumulated:v});break}case"text-complete":{N();break}case"thinking-start":{N(),I.push({type:"thinking",text:""}),U=I.length-1,P=g++,W="thinking",v="",C(n,{type:"thinking:start",index:P});break}case"thinking-delta":{const w=I[U];w.text+=y.data.text,v=w.text,C(n,{type:"thinking:delta",index:P,delta:y.data.text,accumulated:v});break}case"thinking-summary-delta":{const w=I[U];w.text+=y.data.text,v=w.text,C(n,{type:"thinking:delta",index:P,delta:y.data.text,accumulated:v});break}case"thinking-complete":{N();break}case"tool-call-start":{N();const w=g++;I.push({type:"tool-call",id:y.data.id,name:y.data.name,parameters:{}}),U=I.length-1,ne.set(y.data.id,w),C(n,{type:"tool:start",index:w,id:y.data.id,name:y.data.name});break}case"tool-call-complete":{const w=I[U];y.data.id&&(w.id=y.data.id),y.data.name&&(w.name=y.data.name),w.parameters=y.data.arguments,y.data.providerMetadata&&(w.providerMetadata=y.data.providerMetadata);break}case"internal-tool-start":{N();const w=g++;I.push({type:"internal-tool",id:y.data.id,name:y.data.name}),U=I.length-1,C(n,{type:"internal-tool:start",index:w,id:y.data.id,name:y.data.name});break}case"internal-tool-complete":{const w=I[U];y.data.output!=null&&(w.output=y.data.output),C(n,{type:"internal-tool:complete",index:y.data.index,id:y.data.id,name:y.data.name,output:y.data.output});break}case"complete":{N(),B=y.data.finishReason,q=y.data.usage;break}case"error":{N();const w=y.data.usage??{in:0,out:0};return f.in+=w.in??0,f.out+=w.out??0,E?.end("error"),k({result:"error",messages:h,error:{type:"model",error:{type:"error",error:{type:y.data.type,message:y.data.message}}},usage:f})}default:console.warn("[WARN] Unhandled chunk type. Should never happen")}if(e.aborted)break}if(e.aborted)return E?.end("ok"),L(I,j,M,N);if(B===null)return N(),E?.end("error"),k({result:"error",messages:h,error:{type:"model",error:{type:"error",error:{type:"IncompleteStream",message:"Stream ended without a completion signal"}}},usage:f});f.in+=q.in??0,f.out+=q.out??0;const Ue={kind:"llm",model:M,request:{messages:_},response:{content:I},usage:{inputTokens:q.in,outputTokens:q.out},finishReason:B};E?.endLLMStream(Ue),E?.end();const X={role:"assistant",id:j,model:M,content:I,finishReason:B};if(S(X),B!==T.FunctionCall)return k({result:"success",messages:h,final:X,usage:f});const Z=I.filter(y=>y.type==="tool-call");if(Z.length===0)return k({result:"success",messages:h,final:X,usage:f});if(e.aborted)return u?.end("ok"),{result:"cancelled",messages:h,usage:f};const Ge=d?async(y,w)=>d(y,w):async()=>null;let De=0;const Fe=i(async(y,w)=>{const Y=Z[De++],oe=ne.get(Y.id)??-1;C(n,{type:"tool:execute",index:oe,id:Y.id,name:y,parameters:w});const ae=await Ge(y,w);return C(n,{type:"tool:complete",index:oe,id:Y.id,name:y,result:ae??null}),ae},"emittingToolCall"),{results:se,missingTool:re}=await me(Z,Fe,u);if(se.length>0&&S({role:"tool",content:se}),re)return k({result:"error",messages:h,error:{type:"tool",error:re},usage:f})}}i(ot,"run");function at(t,e,n="{{}}"){const s=n==="{{}}"?/\{\{(.*?)\}\}/g:/\{(.*?)\}/g;return t=t.replace(s,(r,o)=>{if(o=o.trim(),Object.prototype.hasOwnProperty.call(e,o)){const a=e[o];return a==null?"":String(a)}return r}),t}i(at,"replaceVariables");function z(t){if(t instanceof O.ZodString)return["string","Your answer"];if(t instanceof O.ZodNumber)return["number",42];if(t instanceof O.ZodBoolean)return["boolean",!0];if(t instanceof O.ZodArray){const e=t.element;if(e instanceof O.ZodString)return["string array",["answer 1","answer 2","third answer"]];if(e instanceof O.ZodNumber)return["number array",[42,59,3.14]];if(e instanceof O.ZodBoolean)return["boolean array",[!0,!1,!1]];if(e instanceof O.ZodObject){const[n,s]=z(e);return["object array",[s,s]]}return["array",[]]}if(t instanceof O.ZodObject){const e=t.shape,n={};for(const[s,r]of Object.entries(e)){const[o,a]=z(r);n[s]=a}return["JSON object",n]}if(t instanceof O.ZodOptional){const e=t.unwrap(),[n,s]=z(e);return[`${n} | undefined`,s]}}i(z,"zodToExample");function he(t,e){if(!e)return t;if(Object.keys(e).length===0){if(t.trim()==="{}"||t.trim()==="")return{};throw new Error("Schema is empty, but rawValue is not an empty object representation or empty string.")}const s=it(t),r={};for(const[o,a]of Object.entries(e)){const l=s.tags[o];if(l!==void 0)r[o]=_e(a,l);else if(a.def.type!=="optional")throw new Error(`Expected results with tag ${o} but it does not exist`)}try{const o={};for(const[a,l]of Object.entries(e))a in r&&(o[a]=l.parse(r[a]));return o}catch(o){if(o&&typeof o=="object"&&"issues"in o){const a=o.issues.map(l=>`${l.path.join(".")}: ${l.message}`).join(", ");throw new Error(`Validation failed: ${a}`)}throw o}}i(he,"parseResponse");function _e(t,e){switch(e=e.trim(),t.def.type){case"string":try{return JSON.parse(e)}catch{if(typeof e=="string")return e;throw new Error(`Cannot parse '${e}' as string. Ensure it is a valid JSON string or a plain string.`)}case"number":{const n=parseFloat(e);if(isNaN(n))throw new Error(`Cannot parse '${e}' as number`);return n}case"boolean":{const n=e.toLowerCase();if(n==="true")return!0;if(n==="false")return!1;throw new Error(`Cannot parse '${e}' as boolean. Expected 'true' or 'false'`)}case"array":{if(e==="")return[];try{const n=JSON.parse(e);if(Array.isArray(n))return n}catch{}if(e.includes(","))return e.split(",").map(n=>{const s=n.trim();try{return JSON.parse(s)}catch{return s}}).filter(n=>n!=="")}case"object":{e.includes("```json")&&(e=e.replace(/```json/g,"").replace(/```/g,""));try{return JSON.parse(e)}catch(n){throw new Error(`Cannot parse object as JSON: ${n.message}`)}}case"optional":{const n=t.def.innerType;return _e(n,e)}default:return e}}i(_e,"preprocessValue");function it(t){t.trim().startsWith("```json")&&t.trim().endsWith("```")&&(t=t.trim().slice(7,-3).trim());const e=/<(\w+)>(.*?)<\/\1>/gs,n={};let s=t;s=s.replace(e,(o,a,l)=>(n[a]=l,""));const r=/<(\w+)>(.*?)(?:<\/?\w+>|$)/gs;return s=s.replace(r,(o,a,l)=>(n[a]=l,"")),{tags:n,remaining:s.trim()}}i(it,"parseTaggedSections");function ge(t,e={}){const n={...e,...t.inputs};let s=at(t.prompt,n);if(t.textReferences.length>0)for(const[a,l]of t.textReferences.entries()){const p=l.name?`: ${l.name}`:"";s+=`
4
+
5
+ ## Reference ${a+1}${p}
6
+
7
+ \`\`\`${l.content}'''`}let r=`# Instructions
8
+
9
+ `;if((t.schema?Object.keys(t.schema):[]).length>0){r+=`## Output Format Instructions
10
+ `,r+=`
11
+ Here is how you should format your output. Follow the instructions strictly.
12
+ `;for(const[a,l]of Object.entries(t.schema)){const[p,d]=z(l);r+=`
13
+ - Use <${a}></${a}> tags to indicate the answer for ${a}. The answer must be a ${p}.
14
+ Example: <${a}>${JSON.stringify(d)}</${a}>
15
+ `}}if(t.instructions.length>0){r+=`
16
+ ## Additional Instructions
17
+
18
+ `;for(const a of t.instructions)r+=`- ${a}
19
+ `}return r+s}i(ge,"compileInstruct");function ct(t){return t.type==="server"}i(ct,"isServerTool");class lt{static{i(this,"Agent")}provider;model;history;tracer;system;tools={};serverTools=[];mcps=[];mcpToolsResolved=!1;eventCallbacks=[];constructor(e){this.provider=e.provider,this.model=e.model,this.history=new pe,this.tracer=e.tracer,this.system=e.system,e.tools&&this.addTools(e.tools),e.mcps&&(this.mcps=[...e.mcps])}addTool(e){ct(e)?this.serverTools.push(e):this.tools[e.name]=e}addTools(e){for(const n of e)this.addTool(n)}addMcp(e){this.mcps.push(e),this.mcpToolsResolved=!1}addMcps(e){this.mcps.push(...e),this.mcpToolsResolved=!1}hasTools(){return Object.keys(this.tools).length>0||this.serverTools.length>0||this.mcps.length>0}on(e){this.eventCallbacks.push(e)}send(e,n){let s;if(typeof e=="string")this.history.addUser(e);else{const r=ge(e,n),o=e.files;this.history.addUser(nt({text:r,files:o})),s=e.schema}return this.execute(s)}async resolveMcpTools(){if(!this.mcpToolsResolved){this.tracer?.debug("resolving MCP tools",{count:this.mcps.length});for(const e of this.mcps){const n=await e.listTools({prefix:e.name,tracer:this.tracer});this.addTools(n)}this.mcpToolsResolved=!0}}execute(e){let n=!1,s;const r=(async()=>{if(await this.resolveMcpTools(),n)return{response:null,messages:[],final:void 0,usage:{in:0,out:0}};const o=this.tools,a=Object.values(o).map(u=>({name:u.name,description:u.description,schema:u.schema}));s=fe({provider:this.provider,model:this.model,messages:this.history.messages,system:this.system,tools:a.length>0?a:void 0,serverTools:this.serverTools.length>0?this.serverTools:void 0,tracer:this.tracer,onToolCall:i(async(u,c)=>{const _=o[u];if(!_)return null;try{return{type:"success",content:await _.execute(c)}}catch(h){return{type:"error",error:{type:"execution",message:h instanceof Error?h.message:String(h)}}}},"onToolCall")});for(const u of this.eventCallbacks)s.on(u);const l=await s.final;l.messages.length>0&&this.history.add(l.messages);let p=null,d;if(l.result==="error")throw new V(ut(l.error),{code:l.error.type==="model"?"MODEL_ERROR":"TOOL_ERROR",details:{error:l.error}});if(l.result==="success"){if(d=l.final,d){const u=H(d.content);p=he(u,e)}}else l.result==="cancelled"&&(d=l.partial);const m=l.usage??{in:0,out:0};return{response:p,messages:l.messages,final:d,usage:m}})();return{cancel:i(()=>{n=!0,s?.cancel()},"cancel"),get final(){return r}}}}function ut(t){return t.type==="model"?`Model error: ${t.error.error.message}`:`Tool error (${t.error.name}): ${t.error.message}`}i(ut,"formatGenerateError");async function pt(t,e){const{defaults:n,tag:s}=e;let r=null,o="";if(t)try{o=Q(t),r=await J(o,{encoding:"utf-8"})}catch{throw new Error(`${s} not found, see --help for details`)}else{for(const a of n.formats)try{o=Q(n.name+"."+a),r=await J(o,{encoding:"utf-8"});break}catch{continue}if(r===null)throw new Error(`${s} not found, see --help for details`)}return{content:r,format:o.split(".").pop()??""}}i(pt,"searchAndLoadFile");const ye=20*1024*1024;function dt(t){return t.type==="text"}i(dt,"isTextFileInfo");function mt(t){return t.type==="image"||t.type==="document"}i(mt,"isBase64FileInfo");const ft=new Set(["application/json","application/xml","application/yaml","application/x-yaml","application/toml"]);function ht(t){return t.startsWith("text/")||ft.has(t)}i(ht,"isTextLikeMimeType");function _t(t){const e=Be.getType(t);if(!e){const n=ce(t).toLowerCase();throw new Error(`Unsupported file type: ${n||"(no extension)"}`)}if(e.startsWith("image/"))return{type:"image",mimeType:e};if(e==="application/pdf")return{type:"document",mimeType:e};if(ht(e))return{type:"text",mimeType:e};{const n=ce(t).toLowerCase();throw new Error(`Unsupported file type: ${n} (${e})`)}}i(_t,"getFileCategory");async function gt(t,e){const n=Q(t);try{await qe(n)}catch{throw new Error(`File not found: ${t}`)}const s=await He(n);if(s.size>ye)throw new Error(`File too large: ${s.size} bytes. Maximum allowed: ${ye} bytes`);const r=n.split("/").pop()||"",o=_t(n);if((e||(o.type==="text"?"utf-8":"base64"))==="utf-8"){if(o.type!=="text")throw new Error(`Cannot read ${o.type} file as text: ${t}`);const l=await J(n,"utf-8");return{path:n,content:l,mimeType:o.mimeType,size:s.size,name:r,type:"text"}}else{if(o.type==="text")throw new Error(`Cannot read text file as binary: ${t}`);const p=(await J(n)).toString("base64");return{path:n,base64:p,mimeType:o.mimeType,size:s.size,name:r,type:o.type}}}i(gt,"loadFileContent");class yt{static{i(this,"Instruct")}prompt;inputs={};files=[];textReferences=[];instructions=[];schema;constructor(e,n){this.prompt=e,this.schema=n}setInputs(e){this.inputs=e}addInput(e,n){this.inputs[e]=n}addFile(e,n){if(typeof e=="string"){this.textReferences.push({content:e,name:n?.name});return}mt(e)?this.files.push(e):dt(e)&&this.textReferences.push({content:e.content,name:n?.name??e.name})}addInstructions(e){if(typeof e!="string"||e.trim()==="")throw new Error("Instruction must be a non-empty string");this.instructions.push(e)}hasFiles(){return this.files.length>0}}const A={CLAUDE_SONNET_4_6:"claude-sonnet-4-6",CLAUDE_OPUS_4_6:"claude-opus-4-6",CLAUDE_OPUS_4_5_20251101:"claude-opus-4-5-20251101",CLAUDE_OPUS_4_5:"claude-opus-4-5-20251101",CLAUDE_HAIKU_4_5_20251001:"claude-haiku-4-5-20251001",CLAUDE_HAIKU_4_5:"claude-haiku-4-5-20251001",CLAUDE_SONNET_4_5_20250929:"claude-sonnet-4-5-20250929",CLAUDE_SONNET_4_5:"claude-sonnet-4-5-20250929",CLAUDE_OPUS_4_1_20250805:"claude-opus-4-1-20250805",CLAUDE_OPUS_4_1:"claude-opus-4-1-20250805",CLAUDE_OPUS_4_20250514:"claude-opus-4-20250514",CLAUDE_OPUS_4:"claude-opus-4-20250514",CLAUDE_SONNET_4_20250514:"claude-sonnet-4-20250514",CLAUDE_SONNET_4:"claude-sonnet-4-20250514",CLAUDE_3_HAIKU_20240307:"claude-3-haiku-20240307",CLAUDE_3_HAIKU:"claude-3-haiku-20240307"};A.CLAUDE_SONNET_4_6,A.CLAUDE_OPUS_4_6,A.CLAUDE_OPUS_4_5_20251101,A.CLAUDE_HAIKU_4_5_20251001,A.CLAUDE_SONNET_4_5_20250929,A.CLAUDE_OPUS_4_1_20250805,A.CLAUDE_OPUS_4_20250514,A.CLAUDE_SONNET_4_20250514,A.CLAUDE_3_HAIKU_20240307;const xt=A.CLAUDE_HAIKU_4_5;function xe(t){return Array.isArray(t)?t:[t]}i(xe,"arrayify");function Et(t){return new Promise(e=>setTimeout(e,t))}i(Et,"delay");function K(t){if(t==null)return{type:"error",error:{type:"Undetermined",message:"Unknown error occurred"},usage:{in:0,out:0},raw:t};if(t instanceof Error)return{type:"error",error:{type:t.name||"Error",message:t.message||"Unexpected error"},usage:{in:0,out:0},raw:t};if(typeof t=="object"){const e=t,n=e?.error?.error?.type||e?.error?.type||e?.type||e?.code||e?.status||"Undetermined",s=e?.error?.error?.message||e?.error?.message||e?.message||e?.error||"Unexpected error";return{type:"error",error:{type:String(n),message:String(s)},usage:{in:0,out:0},raw:t}}return{type:"error",error:{type:"Undetermined",message:String(t)},usage:{in:0,out:0},raw:t}}i(K,"getUndefinedError");function Ee(t){return t.map(e=>{if(e.role==="assistant"){const n=[];for(const s of e.content)s.type==="text"?n.push({type:"text",text:s.text}):s.type==="thinking"?s.redacted?n.push({type:"redacted_thinking",data:s.text}):n.push({type:"thinking",thinking:s.text,signature:s.signature}):s.type==="tool-call"?n.push({type:"tool_use",id:s.id,name:s.name,input:s.parameters}):s.type==="internal-tool"&&(n.push({type:"server_tool_use",id:s.id,name:s.name,input:s.input??{}}),s.output!=null&&n.push({type:"web_search_tool_result",tool_use_id:s.id,content:s.output}));return{role:"assistant",content:n}}if(e.role==="tool")return{role:"user",content:e.content.map(n=>({type:"tool_result",tool_use_id:n.id,content:typeof n.content=="string"?n.content:wt(n.content),...n.isError?{is_error:!0}:{}}))};if(typeof e.content=="string")return{role:"user",content:e.content};{const n=[];for(const s of e.content)s.type==="text"?n.push({type:"text",text:s.text}):s.type==="file"&&(s.file.type==="image"?n.push({type:"image",source:{type:"base64",media_type:s.file.mimeType,data:s.file.base64}}):s.file.type==="document"&&s.file.mimeType==="application/pdf"&&n.push({type:"document",source:{type:"base64",media_type:"application/pdf",data:s.file.base64}}));return{role:"user",content:n}}})}i(Ee,"convertToProviderMessages");function Te(t){return t.map(e=>{const n=F.toJSONSchema(e.schema);if(!Tt(n))throw new Error(`Schema for tool ${e.name} must be an object type`);return{name:e.name,description:e.description,input_schema:n}})}i(Te,"convertToProviderTools");function we(t){const e=[];for(const n of t)if(n.type==="text")e.push({type:"text",text:n.text});else if(n.type==="thinking")e.push({type:"thinking",text:n.text||"",redacted:!1});else if(n.type==="redacted_thinking")e.push({type:"thinking",text:n.text||"",redacted:!0});else if(n.type==="tool_use"){if(typeof n.input!="object"||n.input===null||Array.isArray(n.input))throw new Error(`Invalid tool call input for ${n.name}: expected object, got ${typeof n.input}`);e.push({type:"tool-call",id:n.id,name:n.name,parameters:n.input})}return e}i(we,"convertToAxleContentParts");function Se(t){switch(t){case"max_tokens":return T.Length;case"end_turn":return T.Stop;case"stop_sequence":return T.Stop;case"tool_use":return T.FunctionCall;case"pause_turn":case"refusal":default:return T.Error}}i(Se,"convertStopReason$1");function Tt(t){return t&&typeof t=="object"&&t.type==="object"}i(Tt,"isObjectSchema");function wt(t){return t.map(e=>e.type==="text"?{type:"text",text:e.text}:{type:"image",source:{type:"base64",media_type:e.mimeType,data:e.data}})}i(wt,"convertToolResultParts");async function St(t){const{client:e,model:n,messages:s,system:r,tools:o,context:a,options:l}=t,p=a?.tracer,{stop:d,max_tokens:m,...u}=l??{},c={model:n,max_tokens:m??16e3,messages:Ee(s),...r&&{system:r},...d&&{stop_sequences:xe(d)},...o&&{tools:Te(o)},...u};p?.debug("Anthropic request",{request:c});let _;try{const h=await e.messages.create(c);_=It(h)}catch(h){_=K(h)}return p?.debug("Anthropic response",{result:_}),_}i(St,"createGenerationRequest$3");function It(t){const e=Se(t.stop_reason);if(e===T.Error)return{type:"error",error:{type:"Uncaught error",message:`Stop reason is not recognized or unhandled: ${t.stop_reason}`},usage:{in:t.usage.input_tokens,out:t.usage.output_tokens},raw:t};if(e===T.FunctionCall){const n=we(t.content);return{type:"success",id:t.id,model:t.model,role:t.role,finishReason:T.FunctionCall,content:n,text:H(n)??"",usage:{in:t.usage.input_tokens,out:t.usage.output_tokens},raw:t}}if(t.type=="message"){const n=we(t.content);return{type:"success",id:t.id,model:t.model,role:"assistant",finishReason:e,content:n,text:H(n)??"",usage:{in:t.usage.input_tokens,out:t.usage.output_tokens},raw:t}}}i(It,"convertToAIResponse");function bt(){const t=new Map,e=new Map,n=new Map;function s(r){const o=[];switch(r.type){case"message_start":o.push({type:"start",id:r.message.id,data:{model:r.message.model,timestamp:Date.now()}});break;case"message_delta":r.delta.stop_reason&&o.push({type:"complete",data:{finishReason:Se(r.delta.stop_reason),usage:r.usage?{in:r.usage.input_tokens||0,out:r.usage.output_tokens||0}:void 0}});case"message_stop":break;case"content_block_start":if(r.content_block.type==="text")t.set(r.index,"text"),o.push({type:"text-start",data:{index:r.index}});else if(r.content_block.type==="tool_use"){t.set(r.index,"tool");const a=r.content_block;n.set(r.index,{id:a.id,name:a.name,argumentsBuffer:""}),o.push({type:"tool-call-start",data:{index:r.index,id:a.id,name:a.name}})}else if(r.content_block.type==="thinking")t.set(r.index,"thinking"),o.push({type:"thinking-start",data:{index:r.index,redacted:!1}});else if(r.content_block.type==="redacted_thinking")t.set(r.index,"thinking"),o.push({type:"thinking-start",data:{index:r.index,redacted:!0}});else if(r.content_block.type==="server_tool_use"){t.set(r.index,"internal-tool");const a=r.content_block;e.set(a.id,{index:r.index,name:a.name}),o.push({type:"internal-tool-start",data:{index:r.index,id:a.id,name:a.name}})}else if(r.content_block.type==="web_search_tool_result"){const a=r.content_block,l=e.get(a.tool_use_id);l&&(o.push({type:"internal-tool-complete",data:{index:l.index,id:a.tool_use_id,name:l.name,output:a.content}}),e.delete(a.tool_use_id))}break;case"content_block_delta":if(r.delta.type==="text_delta")o.push({type:"text-delta",data:{text:r.delta.text,index:r.index}});else if(r.delta.type==="input_json_delta"){const a=n.get(r.index);a&&(a.argumentsBuffer+=r.delta.partial_json)}else r.delta.type==="thinking_delta"?o.push({type:"thinking-delta",data:{text:r.delta.thinking,index:r.index}}):r.delta.type==="signature_delta"||r.delta.type;break;case"content_block_stop":{const a=t.get(r.index);if(a==="text")o.push({type:"text-complete",data:{index:r.index}});else if(a==="thinking")o.push({type:"thinking-complete",data:{index:r.index}});else if(a!=="internal-tool"){if(a==="tool"){const l=n.get(r.index);if(l){try{const p=l.argumentsBuffer?JSON.parse(l.argumentsBuffer):{};o.push({type:"tool-call-complete",data:{index:r.index,id:l.id,name:l.name,arguments:p}})}catch(p){throw new Error(`Failed to parse tool call arguments for ${l.name}: ${p instanceof Error?p.message:String(p)}
20
+ Raw buffer: ${l.argumentsBuffer}`)}n.delete(r.index)}}}t.delete(r.index);break}}return o}return i(s,"handleEvent"),{handleEvent:s}}i(bt,"createAnthropicStreamingAdapter");async function*kt(t){const{client:e,model:n,messages:s,system:r,tools:o,runtime:a,signal:l,options:p}=t,d=a?.tracer,{stop:m,max_tokens:u,serverTools:c,..._}=p??{},h=o?Te(o):[];if(c){const x={web_search:"web_search_20250305"};for(const S of c){const k=x[S.name]??S.name;h.push({type:k,name:S.name,...S.config})}}const f={model:n,max_tokens:u??At(n),messages:Ee(s),...r&&{system:r},...m&&{stop_sequences:xe(m)},...h.length>0&&{tools:h},..._};d?.debug("Anthropic streaming request",{request:f});const g=bt();try{const x=await e.messages.create({...f,stream:!0},{signal:l});for await(const S of x){const k=g.handleEvent(S);for(const L of k)yield L}}catch(x){if(l?.aborted)return;yield{type:"error",data:{type:"STREAMING_ERROR",message:x instanceof Error?x.message:String(x),raw:x}}}}i(kt,"createStreamingRequest$3");const Ie={[A.CLAUDE_OPUS_4_6]:128e3,[A.CLAUDE_OPUS_4_5_20251101]:64e3,[A.CLAUDE_HAIKU_4_5_20251001]:64e3,[A.CLAUDE_SONNET_4_5_20250929]:64e3,[A.CLAUDE_SONNET_4_20250514]:64e3,[A.CLAUDE_OPUS_4_1_20250805]:32e3,[A.CLAUDE_OPUS_4_20250514]:32e3,[A.CLAUDE_3_HAIKU_20240307]:4096};function At(t){return t in Ie?Ie[t]:t.includes("opus")?t.match(/opus-4-[6-9]|opus-[5-9]/)?128e3:64e3:t.includes("sonnet")||t.includes("haiku")?t.match(/claude-3-[0-5]-/)?8192:64e3:16384}i(At,"getMaxTokens");const $t="anthropic";function Mt(t){const e=new ze({apiKey:t});return{name:$t,async createGenerationRequest(n,s){return await St({client:e,model:n,...s})},createStreamingRequest(n,s){const{messages:r,system:o,tools:a,context:l,signal:p,options:d}=s;return kt({client:e,model:n,messages:r,system:o,tools:a,runtime:l,signal:p,options:d})}}}i(Mt,"anthropic");function be(t,e){const n=t.map(Ot).flat(1);return e?[{role:"system",content:e},...n]:n}i(be,"convertAxleMessages");function ke(t){if(t&&t.length>0)return t.map(e=>({type:"function",function:{name:e.name,description:e.description,parameters:F.toJSONSchema(e.schema)}}))}i(ke,"convertTools");function ee(t){switch(t){case"stop":return T.Stop;case"length":return T.Length;case"tool_calls":case"function_call":return T.FunctionCall;case"content_filter":return T.Error;default:return T.Stop}}i(ee,"convertFinishReason");function Ot(t){switch(t.role){case"tool":return Rt(t);case"assistant":return Ct(t);default:return Lt(t)}}i(Ot,"convertMessage$2");function Rt(t){return t.content.map(e=>({role:"tool",content:typeof e.content=="string"?e.content:e.content.filter(n=>n.type==="text").map(n=>n.text).join(`
21
+ `),tool_call_id:e.id}))}i(Rt,"convertToolMessage$2");function Ct(t){const e=t.content.filter(r=>r.type==="tool-call"),n=t.content.filter(r=>r.type==="text"),s=e.length>0?e.map(r=>({type:"function",id:r.id,function:{name:r.name,arguments:JSON.stringify(r.parameters)}})):void 0;return{role:"assistant",content:n.map(r=>r.text).join(""),...s&&{tool_calls:s}}}i(Ct,"convertAssistantMessage$2");function Lt(t){if(typeof t.content=="string")return{role:"user",content:t.content};const e=t.content.map(Pt).filter(n=>n!==null);return e.every(n=>n.type==="text")?{role:"user",content:e.map(n=>n.text).join("")}:{role:"user",content:e}}i(Lt,"convertUserMessage$2");function Pt(t){return t.type==="text"?{type:"text",text:t.text}:t.type==="file"&&t.file.type==="image"?{type:"image_url",image_url:{url:`data:${t.file.mimeType};base64,${t.file.base64}`}}:null}i(Pt,"convertContentPart$2");async function vt(t){const{baseUrl:e,model:n,messages:s,system:r,tools:o,context:a,apiKey:l,options:p}=t,d=a?.tracer,m=be(s,r),u=ke(o),c={model:n,messages:m,...u&&{tools:u}};p&&(p.temperature!==void 0&&(c.temperature=p.temperature),p.top_p!==void 0&&(c.top_p=p.top_p),p.max_tokens!==void 0&&(c.max_tokens=p.max_tokens),p.frequency_penalty!==void 0&&(c.frequency_penalty=p.frequency_penalty),p.presence_penalty!==void 0&&(c.presence_penalty=p.presence_penalty),p.stop!==void 0&&(c.stop=p.stop)),d?.debug("ChatCompletions request",{request:c});let _;try{const h={"Content-Type":"application/json"};l&&(h.Authorization=`Bearer ${l}`);const f=await fetch(`${e}/chat/completions`,{method:"POST",headers:h,body:JSON.stringify(c)});if(!f.ok){const x=await f.text().catch(()=>"");throw new Error(`HTTP error! status: ${f.status}${x?` - ${x}`:""}`)}const g=await f.json();_=Nt(g)}catch(h){d?.error("Error fetching ChatCompletions response",{error:h instanceof Error?h.message:String(h)}),_=K(h)}return d?.debug("ChatCompletions response",{result:_}),_}i(vt,"createGenerationRequest$2");function Nt(t){const e=t.choices?.[0];if(!e)return{type:"error",error:{type:"ChatCompletionsError",message:"No choices in response"},usage:{in:0,out:0},raw:t};const n=[];if(e.message.reasoning_content&&n.push({type:"thinking",text:e.message.reasoning_content}),e.message.content&&n.push({type:"text",text:e.message.content}),e.message.tool_calls)for(const o of e.message.tool_calls){let a;try{a=JSON.parse(o.function.arguments)}catch(l){throw new Error(`Invalid tool call arguments for ${o.function.name}: ${l instanceof Error?l.message:String(l)}`)}if(typeof a!="object"||a===null||Array.isArray(a))throw new Error(`Invalid tool call arguments for ${o.function.name}: expected object, got ${typeof a}`);n.push({type:"tool-call",id:o.id,name:o.function.name,parameters:a})}const s=n.some(o=>o.type==="tool-call"),r=ee(s?"tool_calls":e.finish_reason);return{type:"success",id:t.id,model:t.model,role:"assistant",finishReason:r,content:n,text:H(n)??"",usage:{in:t.usage?.prompt_tokens||0,out:t.usage?.completion_tokens||0},raw:t}}i(Nt,"fromModelResponse$2");function Ut(){const t=new Map;let e=0,n=-1,s="",r="",o=null,a,l;function p(u){n<0||(o==="text"?u.push({type:"text-complete",data:{index:n}}):o==="thinking"&&u.push({type:"thinking-complete",data:{index:n}}),o=null,n=-1)}i(p,"closeActivePart");function d(u){const c=[];u.usage&&(l={in:u.usage.prompt_tokens,out:u.usage.completion_tokens});const _=u.choices?.[0];if(!_)return c;s||(s=u.id,r=u.model,c.push({type:"start",id:s,data:{model:r,timestamp:Date.now()}}));const h=_.delta;if(h.reasoning_content&&(o!=="thinking"&&(p(c),n=e++,o="thinking",c.push({type:"thinking-start",data:{index:n}})),c.push({type:"thinking-delta",data:{index:n,text:h.reasoning_content}})),h.content&&(o!=="text"&&(p(c),n=e++,o="text",c.push({type:"text-start",data:{index:n}})),c.push({type:"text-delta",data:{text:h.content,index:n}})),h.tool_calls){p(c);for(const f of h.tool_calls){const g=f.index;if(!t.has(g)){const S=e++,k=f.id||`tool-${S}`;t.set(g,{id:k,name:f.function?.name||"",argumentsBuffer:"",partIdx:S}),c.push({type:"tool-call-start",data:{index:S,id:k,name:f.function?.name||""}})}const x=t.get(g);f.id&&(x.id=f.id),f.function?.name&&(x.name=f.function.name),f.function?.arguments&&(x.argumentsBuffer+=f.function.arguments)}}if(_.finish_reason){p(c);for(const[,f]of t)try{const g=f.argumentsBuffer?JSON.parse(f.argumentsBuffer):{};c.push({type:"tool-call-complete",data:{index:f.partIdx,id:f.id,name:f.name,arguments:g}})}catch(g){throw new Error(`Failed to parse tool call arguments for ${f.name}: ${g instanceof Error?g.message:String(g)}
22
+ Raw buffer: ${f.argumentsBuffer}`)}a=ee(_.finish_reason)}return c}i(d,"handleChunk");function m(){return a===void 0?[]:[{type:"complete",data:{finishReason:a,usage:l??{in:0,out:0}}}]}return i(m,"finalize"),{handleChunk:d,finalize:m}}i(Ut,"createStreamingAdapter$1");async function*Gt(t){const{baseUrl:e,model:n,messages:s,system:r,tools:o,context:a,signal:l,apiKey:p,options:d}=t,m=a?.tracer;d?.serverTools&&m?.warn("serverTools not supported by ChatCompletions provider");const u=be(s,r),c=ke(o),_={model:n,messages:u,stream:!0,stream_options:{include_usage:!0},...c&&{tools:c}};d&&(d.temperature!==void 0&&(_.temperature=d.temperature),d.top_p!==void 0&&(_.top_p=d.top_p),d.max_tokens!==void 0&&(_.max_tokens=d.max_tokens),d.frequency_penalty!==void 0&&(_.frequency_penalty=d.frequency_penalty),d.presence_penalty!==void 0&&(_.presence_penalty=d.presence_penalty),d.stop!==void 0&&(_.stop=d.stop)),m?.debug("ChatCompletions streaming request",{request:_});const h=Ut();try{const f={"Content-Type":"application/json"};p&&(f.Authorization=`Bearer ${p}`);const g=await fetch(`${e}/chat/completions`,{method:"POST",headers:f,body:JSON.stringify(_),signal:l});if(!g.ok){const L=await g.text().catch(()=>"");throw new Error(`HTTP error! status: ${g.status}${L?` - ${L}`:""}`)}if(!g.body)throw new Error("Response body is null");const x=g.body.getReader(),S=new TextDecoder;let k="";for(;;){const{done:L,value:E}=await x.read();if(L)break;k+=S.decode(E,{stream:!0});const G=k.split(`
23
+ `);k=G.pop()||"";for(const D of G){const I=D.trim();if(!I||I.startsWith(":")||!I.startsWith("data: "))continue;const j=I.slice(6);if(j!=="[DONE]")try{const M=JSON.parse(j),B=h.handleChunk(M);for(const q of B)yield q}catch(M){m?.error("Error parsing ChatCompletions stream chunk",{error:M instanceof Error?M.message:String(M),line:I})}}}for(const L of h.finalize())yield L}catch(f){if(l?.aborted)return;m?.error("Error in ChatCompletions streaming request",{error:f instanceof Error?f.message:String(f)}),yield{type:"error",data:{type:"STREAMING_ERROR",message:f instanceof Error?f.message:String(f),raw:f}}}}i(Gt,"createStreamingRequest$2");function Dt(t,e){return{name:"ChatCompletions",async createGenerationRequest(n,s){return await vt({baseUrl:t,model:n,apiKey:e,...s})},createStreamingRequest(n,s){return Gt({baseUrl:t,model:n,apiKey:e,...s})}}}i(Dt,"chatCompletions");const b={GEMINI_3_1_PRO_PREVIEW:"gemini-3.1-pro-preview",GEMINI_3_1_PRO_PREVIEW_CUSTOMTOOLS:"gemini-3.1-pro-preview-customtools",GEMINI_3_PRO_PREVIEW:"gemini-3-pro-preview",GEMINI_3_FLASH_PREVIEW:"gemini-3-flash-preview",GEMINI_2_5_PRO:"gemini-2.5-pro",GEMINI_2_5_FLASH:"gemini-2.5-flash",GEMINI_2_5_FLASH_LITE:"gemini-2.5-flash-lite",GEMINI_2_5_FLASH_LITE_PREVIEW_09_2025:"gemini-2.5-flash-lite-preview-09-2025",GEMINI_2_0_FLASH:"gemini-2.0-flash",GEMINI_2_0_FLASH_001:"gemini-2.0-flash-001",GEMINI_2_0_FLASH_LITE:"gemini-2.0-flash-lite",GEMINI_2_0_FLASH_LITE_001:"gemini-2.0-flash-lite-001",GEMINI_FLASH_LATEST:"gemini-flash-latest",GEMINI_FLASH_LITE_LATEST:"gemini-flash-lite-latest",GEMINI_PRO_LATEST:"gemini-pro-latest",GEMMA_3_27B_IT:"gemma-3-27b-it",GEMMA_3_12B_IT:"gemma-3-12b-it",GEMMA_3_4B_IT:"gemma-3-4b-it",GEMMA_3_1B_IT:"gemma-3-1b-it",GEMMA_3N_E4B_IT:"gemma-3n-e4b-it",GEMMA_3N_E2B_IT:"gemma-3n-e2b-it"};b.GEMINI_3_1_PRO_PREVIEW,b.GEMINI_3_1_PRO_PREVIEW_CUSTOMTOOLS,b.GEMINI_3_PRO_PREVIEW,b.GEMINI_3_FLASH_PREVIEW,b.GEMINI_2_5_PRO,b.GEMINI_2_5_FLASH,b.GEMINI_2_5_FLASH_LITE,b.GEMINI_2_5_FLASH_LITE_PREVIEW_09_2025,b.GEMINI_2_0_FLASH,b.GEMINI_2_0_FLASH_001,b.GEMINI_2_0_FLASH_LITE,b.GEMINI_2_0_FLASH_LITE_001,b.GEMINI_FLASH_LATEST,b.GEMINI_FLASH_LITE_LATEST,b.GEMINI_PRO_LATEST,b.GEMMA_3_27B_IT,b.GEMMA_3_12B_IT,b.GEMMA_3_4B_IT,b.GEMMA_3_1B_IT,b.GEMMA_3N_E4B_IT,b.GEMMA_3N_E2B_IT;const Ft=b.GEMINI_3_FLASH_PREVIEW;function Ae(t,e,n){const s={};return e&&(s.systemInstruction=e),t&&t.length>0&&(s.tools=t.map(r=>({functionDeclarations:[{name:r.name,description:r.description,parametersJsonSchema:F.toJSONSchema(r.schema)}]}))),n&&Object.assign(s,n),s}i(Ae,"prepareConfig");function $e(t){return t.map(jt).filter(e=>e!==void 0)}i($e,"convertAxleMessagesToGemini");function jt(t){switch(t.role){case"tool":return Bt(t);case"assistant":return qt(t);case"user":return Ht(t)}}i(jt,"convertMessage$1");function Bt(t){return{role:"user",parts:t.content.flatMap(e=>{const n={functionResponse:{id:e.id??void 0,name:e.name,response:{output:typeof e.content=="string"?e.content:e.content.filter(r=>r.type==="text").map(r=>r.text).join(`
24
+ `)}}};if(typeof e.content=="string")return[n];const s=e.content.filter(r=>r.type==="image").map(r=>({inlineData:{mimeType:r.mimeType,data:r.data}}));return[n,...s]})}}i(Bt,"convertToolMessage$1");function qt(t){const e=[],n=t.content.filter(r=>r.type==="text");if(n.length>0){const r=n.map(o=>o.text).join("");r&&e.push({text:r})}const s=t.content.filter(r=>r.type==="tool-call");return s.length>0&&e.push(...s.map(r=>{const o={functionCall:{id:r.id??void 0,name:r.name,args:r.parameters}};return r.providerMetadata?.thoughtSignature&&(o.thoughtSignature=r.providerMetadata.thoughtSignature),o})),{role:"model",parts:e}}i(qt,"convertAssistantMessage$1");function Ht(t){return typeof t.content=="string"?{role:"user",parts:[{text:t.content}]}:{role:"user",parts:t.content.map(Jt).filter(n=>n!==null)}}i(Ht,"convertUserMessage$1");function Jt(t){return t.type==="text"?{text:t.text}:t.type==="file"&&(t.file.type==="image"||t.file.type==="document")?{inlineData:{mimeType:t.file.mimeType,data:t.file.base64}}:null}i(Jt,"convertContentPart$1");function Me(t){switch(t){case R.STOP:return[!0,T.Stop];case R.MAX_TOKENS:return[!0,T.Length];case R.FINISH_REASON_UNSPECIFIED:case R.SAFETY:case R.RECITATION:case R.LANGUAGE:case R.OTHER:case R.BLOCKLIST:case R.PROHIBITED_CONTENT:case R.SPII:case R.MALFORMED_FUNCTION_CALL:case R.IMAGE_SAFETY:return[!1,T.Error]}}i(Me,"convertStopReason");async function Wt(t){const{client:e,model:n,messages:s,system:r,tools:o,context:a,options:l}=t,p=a?.tracer,d=l?{...l}:{};d.max_tokens&&(d.maxOutputTokens=d.max_tokens,delete d.max_tokens),d.stop&&(d.stopSequences=Array.isArray(d.stop)?d.stop:[d.stop],delete d.stop),d.top_p!==void 0&&(d.topP=d.top_p,delete d.top_p);const m={contents:$e(s),config:Ae(o,r,d)};p?.debug("Gemini request",{request:m});let u;try{const c=await e.models.generateContent({model:n,...m});u=zt(c,{tracer:p})}catch(c){p?.error(c instanceof Error?c.message:String(c)),u=K(c)}return p?.debug("Gemini response",{result:u}),u}i(Wt,"createGenerationRequest$1");function zt(t,e){const{tracer:n}=e,s=t.usageMetadata.promptTokenCount,r=t.usageMetadata.totalTokenCount-s,o={in:s,out:r};if(!t)return{type:"error",error:{type:"InvalidResponse",message:"Invalid or empty response from Google AI"},usage:{in:0,out:0},raw:t};if(t.promptFeedback&&t.promptFeedback.blockReason)return{type:"error",error:{type:"Blocked",message:`Response blocked by Google AI: ${t.promptFeedback.blockReason}, ${t.promptFeedback.blockReasonMessage}`},usage:o,raw:t};if(!t.candidates||t.candidates.length===0)return{type:"error",error:{type:"InvalidResponse",message:"Invalid or empty response from Google AI"},usage:{in:0,out:0},raw:t};t.candidates.length>1&&n?.warn(`We received ${t.candidates.length} response candidates`);const a=t.candidates[0],p=(a.content?.parts||[]).map(u=>u.text).filter(u=>u!==void 0).join(""),[d,m]=Me(a.finishReason);if(d){const u=[];if(p&&u.push({type:"text",text:p}),t.functionCalls)for(const c of t.functionCalls)if(c.args==null)u.push({type:"tool-call",id:c.id,name:c.name,parameters:{}});else{if(typeof c.args!="object"||Array.isArray(c.args))throw new Error(`Invalid tool call arguments for ${c.name}: expected object, got ${typeof c.args}`);u.push({type:"tool-call",id:c.id,name:c.name,parameters:c.args})}return{type:"success",id:t.responseId,model:t.modelVersion,role:"assistant",finishReason:t.functionCalls?T.FunctionCall:m,content:u,text:H(u)??"",usage:o,raw:t}}else return{type:"error",error:{type:"Undetermined",message:`Unexpected stop reason: ${m}`},usage:o,raw:t}}i(zt,"fromModelResponse$1");function Kt(){let t=0,e=-1,n=!1,s="",r="",o=0,a=0,l=null;function p(m){e<0||(l==="text"?m.push({type:"text-complete",data:{index:e}}):l==="thinking"&&m.push({type:"thinking-complete",data:{index:e}}),l=null,e=-1)}i(p,"closeActivePart");function d(m){const u=[];s||(s=m.responseId||`gemini-${Date.now()}`,r=m.modelVersion||"gemini",u.push({type:"start",id:s,data:{model:r,timestamp:Date.now()}})),m.usageMetadata&&(o=m.usageMetadata.promptTokenCount||0,a=(m.usageMetadata.totalTokenCount||0)-o);const c=m.candidates?.[0];if(!c)return u;const _=c.content?.parts||[];for(const h of _){const f="thought"in h&&h.thought===!0;if(f&&h.text?(l!=="thinking"&&(p(u),e=t++,l="thinking",u.push({type:"thinking-start",data:{index:e}})),u.push({type:"thinking-delta",data:{index:e,text:h.text}})):h.text&&!f?(l!=="text"&&(p(u),e=t++,l="text",u.push({type:"text-start",data:{index:e}})),u.push({type:"text-delta",data:{text:h.text,index:e}})):h.functionCall||console.log(`[gemini] unhandled part type: ${JSON.stringify(Object.keys(h))}`),h.functionCall){p(u),n=!0;const g=t++,x=h.functionCall.id||`tool-${g}`;u.push({type:"tool-call-start",data:{index:g,id:x,name:h.functionCall.name}});const S={index:g,id:x,name:h.functionCall.name,arguments:h.functionCall.args??{}},k=h;k.thoughtSignature&&(S.providerMetadata={thoughtSignature:k.thoughtSignature}),u.push({type:"tool-call-complete",data:S})}}if(c.finishReason&&c.finishReason!==R.FINISH_REASON_UNSPECIFIED){p(u);const[h,f]=Me(c.finishReason),g=n?T.FunctionCall:f;!h&&!n?u.push({type:"error",data:{type:"FinishReasonError",message:`Unexpected finish reason: ${c.finishReason}`,usage:{in:o,out:a},raw:m}}):u.push({type:"complete",data:{finishReason:g,usage:{in:o,out:a}}})}return u}return i(d,"handleChunk"),{handleChunk:d}}i(Kt,"createGeminiStreamingAdapter");async function*Vt(t){const{client:e,model:n,messages:s,system:r,tools:o,runtime:a,signal:l,options:p}=t,d=a?.tracer,{serverTools:m,...u}=p??{},c=u?{...u}:{};c.max_tokens&&(c.maxOutputTokens=c.max_tokens,delete c.max_tokens),c.stop&&(c.stopSequences=Array.isArray(c.stop)?c.stop:[c.stop],delete c.stop),c.top_p!==void 0&&(c.topP=c.top_p,delete c.top_p);const _=Ae(o,r,c);if(m){const g={web_search:"googleSearch",code_execution:"codeExecution"};_.tools||(_.tools=[]);for(const x of m){const S=g[x.name]??x.name;_.tools.push({[S]:x.config??{}})}}const h={contents:$e(s),config:_};d?.debug("Gemini streaming request",{request:h});const f=Kt();try{const g=await e.models.generateContentStream({model:n,...h});for await(const x of g){const S=f.handleChunk(x);for(const k of S)yield k}}catch(g){if(l?.aborted)return;d?.error(g instanceof Error?g.message:String(g)),yield{type:"error",data:{type:"STREAMING_ERROR",message:g instanceof Error?g.message:String(g),raw:g}}}}i(Vt,"createStreamingRequest$1");const Xt="Gemini";function Zt(t){const e=new Ke({apiKey:t});return{name:Xt,async createGenerationRequest(n,s){return await Wt({client:e,model:n,...s})},createStreamingRequest(n,s){const{messages:r,system:o,tools:a,context:l,signal:p,options:d}=s;return Vt({client:e,model:n,messages:r,system:o,tools:a,runtime:l,signal:p,options:d})}}}i(Zt,"gemini");const Oe={GPT_5_2:"gpt-5.2",GPT_5_2_2025_12_11:"gpt-5.2-2025-12-11",GPT_5_2_CHAT_LATEST:"gpt-5.2-chat-latest",GPT_5_2_PRO:"gpt-5.2-pro",GPT_5_2_PRO_2025_12_11:"gpt-5.2-pro-2025-12-11",GPT_5_2_CODEX:"gpt-5.2-codex",GPT_5_1:"gpt-5.1",GPT_5_1_2025_11_13:"gpt-5.1-2025-11-13",GPT_5_1_CHAT_LATEST:"gpt-5.1-chat-latest",GPT_5_1_CODEX:"gpt-5.1-codex",GPT_5_1_CODEX_MAX:"gpt-5.1-codex-max",GPT_5_1_CODEX_MINI:"gpt-5.1-codex-mini",GPT_5:"gpt-5",GPT_5_2025_08_07:"gpt-5-2025-08-07",GPT_5_CHAT_LATEST:"gpt-5-chat-latest",GPT_5_CODEX:"gpt-5-codex",GPT_5_MINI:"gpt-5-mini",GPT_5_MINI_2025_08_07:"gpt-5-mini-2025-08-07",GPT_5_NANO:"gpt-5-nano",GPT_5_NANO_2025_08_07:"gpt-5-nano-2025-08-07",GPT_5_PRO:"gpt-5-pro",GPT_5_PRO_2025_10_06:"gpt-5-pro-2025-10-06",GPT_5_SEARCH_API:"gpt-5-search-api",GPT_5_SEARCH_API_2025_10_14:"gpt-5-search-api-2025-10-14",GPT_4_1:"gpt-4.1",GPT_4_1_2025_04_14:"gpt-4.1-2025-04-14",GPT_4_1_MINI:"gpt-4.1-mini",GPT_4_1_MINI_2025_04_14:"gpt-4.1-mini-2025-04-14",GPT_4_1_NANO:"gpt-4.1-nano",GPT_4_1_NANO_2025_04_14:"gpt-4.1-nano-2025-04-14",GPT_4O:"gpt-4o",GPT_4O_2024_11_20:"gpt-4o-2024-11-20",GPT_4O_2024_08_06:"gpt-4o-2024-08-06",GPT_4O_2024_05_13:"gpt-4o-2024-05-13",GPT_4O_MINI:"gpt-4o-mini",GPT_4O_MINI_2024_07_18:"gpt-4o-mini-2024-07-18",GPT_4O_SEARCH_PREVIEW:"gpt-4o-search-preview",GPT_4O_SEARCH_PREVIEW_2025_03_11:"gpt-4o-search-preview-2025-03-11",GPT_4O_MINI_SEARCH_PREVIEW:"gpt-4o-mini-search-preview",GPT_4O_MINI_SEARCH_PREVIEW_2025_03_11:"gpt-4o-mini-search-preview-2025-03-11",GPT_4_TURBO:"gpt-4-turbo",GPT_4_TURBO_2024_04_09:"gpt-4-turbo-2024-04-09",O4_MINI:"o4-mini",O4_MINI_2025_04_16:"o4-mini-2025-04-16",O3:"o3",O3_2025_04_16:"o3-2025-04-16",O3_PRO:"o3-pro",O3_PRO_2025_06_10:"o3-pro-2025-06-10",O3_MINI:"o3-mini",O3_MINI_2025_01_31:"o3-mini-2025-01-31",O1:"o1",O1_2024_12_17:"o1-2024-12-17",O1_PRO:"o1-pro",O1_PRO_2025_03_19:"o1-pro-2025-03-19"},Yt=Oe.GPT_5_MINI;function Re(t){if(t&&t.length>0)return t.map(e=>({type:"function",strict:!0,name:e.name,description:e.description,parameters:F.toJSONSchema(e.schema)}))}i(Re,"prepareTools");function Ce(t){return t.map(Qt).flat(1)}i(Ce,"convertAxleMessageToResponseInput");function Qt(t){switch(t.role){case"tool":return en(t);case"assistant":return tn(t);default:return nn(t)}}i(Qt,"convertMessage");function en(t){return t.content.map(e=>({type:"function_call_output",call_id:e.id,output:typeof e.content=="string"?e.content:e.content.map(n=>n.type==="text"?{type:"input_text",text:n.text}:{type:"input_image",image_url:`data:${n.mimeType};base64,${n.data}`})}))}i(en,"convertToolMessage");function tn(t){const e=[],n=H(t.content);n&&e.push({role:t.role,content:n});const s=t.content.filter(o=>o.type==="tool-call");for(const o of s)e.push({type:"function_call",call_id:o.id,name:o.name,arguments:JSON.stringify(o.parameters)});const r=t.content.filter(o=>o.type==="internal-tool");for(const o of r)o.output!=null&&e.push(o.output);return e}i(tn,"convertAssistantMessage");function nn(t){if(typeof t.content=="string")return{role:t.role,content:t.content};{const e=t.content.map(sn).filter(n=>n!==null);return{role:t.role,content:e}}}i(nn,"convertUserMessage");function sn(t){if(t.type==="text")return{type:"input_text",text:t.text};if(t.type==="file"){if(t.file.type==="image")return{type:"input_image",image_url:`data:${t.file.mimeType};base64,${t.file.base64}`,detail:"auto"};if(t.file.type==="document")return{type:"input_file",filename:t.file.path,file_data:`data:${t.file.mimeType};base64,${t.file.base64}`}}return t.type==="thinking",null}i(sn,"convertContentPart");async function rn(t){const{client:e,model:n,messages:s,system:r,tools:o,context:a,options:l}=t,p=a?.tracer,d=Re(o),m={model:n,input:Ce(s),...r&&{instructions:r},...d?{tools:d}:{},...l};p?.debug("OpenAI ResponsesAPI request",{request:m});let u;try{const c=await e.responses.create(m);u=on(c)}catch(c){p?.error(c instanceof Error?c.message:String(c)),u=K(c)}return p?.debug("OpenAI ResponsesAPI response",{result:u}),u}i(rn,"createGenerationRequest");function on(t){if(t.error)return{type:"error",error:{type:t.error.code||"undetermined",message:t.error.message||"Response generation failed"},usage:{in:t.usage?.input_tokens??0,out:t.usage?.output_tokens??0},raw:t};const e=t.output?.filter(r=>r.type==="reasoning")?.map(r=>r),n=[];if(e&&e.length>0)for(const r of e){const o=r.summary?.[0]?.text||r.content?.[0]?.text||"";(o||r.encrypted_content)&&n.push({type:"thinking",text:o,...r.encrypted_content&&{encrypted:r.encrypted_content}})}t.output_text&&n.push({type:"text",text:t.output_text});const s=t.output?.filter(r=>r.type==="function_call");if(s&&s.length>0)for(const r of s){const o=r;try{n.push({type:"tool-call",id:o.id||"",name:o.name||"",parameters:o.arguments?JSON.parse(o.arguments):{}})}catch(a){throw new Error(`Failed to parse tool call arguments for ${o.name}: ${a instanceof Error?a.message:String(a)}
25
+ Raw value: ${o.arguments}`)}}return{type:"success",id:t.id,model:t.model||"",role:"assistant",finishReason:t.incomplete_details?T.Error:T.Stop,content:n,text:H(n)??"",usage:{in:t.usage?.input_tokens??0,out:t.usage?.output_tokens??0},raw:t}}i(on,"fromModelResponse");function an(){let t="",e="",n=0,s=-1,r=!1;const o=new Map,a=new Map,l=new Set(["web_search_call","file_search_call","code_interpreter_call"]),p=new Map;function d(m){const u=[];switch(m.type){case"response.created":{t=m.response.id||`openai-${Date.now()}`,e=m.response.model,u.push({type:"start",id:t,data:{model:e,timestamp:Date.now()}});break}case"response.output_text.delta":{s===-1&&(s=n++,u.push({type:"text-start",data:{index:s}})),u.push({type:"text-delta",data:{text:m.delta,index:s}});break}case"response.output_text.done":{s>=0&&(u.push({type:"text-complete",data:{index:s}}),s=-1);break}case"response.function_call_arguments.delta":{const c=m.item_id;if(!p.has(c)){const h=o.get(c),f=h?.name||"",g=h?.callId||c,x=n++;p.set(c,{id:c,callId:g,name:f,argumentsBuffer:"",partIdx:x}),u.push({type:"tool-call-start",data:{index:x,id:g,name:f}})}const _=p.get(c);_.argumentsBuffer+=m.delta;break}case"response.function_call_arguments.done":{r=!0;const c=m.item_id,_=p.get(c),h=m.name||_?.name||"";if(_){try{const f=m.arguments?JSON.parse(m.arguments):{};u.push({type:"tool-call-complete",data:{index:_.partIdx,id:_.callId,name:h,arguments:f}})}catch(f){throw new Error(`Failed to parse function call arguments for ${h}: ${f instanceof Error?f.message:String(f)}
26
+ Raw value: ${m.arguments}`)}p.delete(c)}break}case"response.completed":{const c=m.response.usage;u.push({type:"complete",data:{finishReason:m.response.incomplete_details?T.Error:r?T.FunctionCall:T.Stop,usage:{in:c?.input_tokens||0,out:c?.output_tokens||0}}});break}case"response.failed":{u.push({type:"error",data:{type:"RESPONSES_API_ERROR",message:`Response failed: ${m.response.status}`,raw:m}});break}case"response.output_item.added":{if(m.item?.type==="reasoning")s=n++,u.push({type:"thinking-start",data:{index:s}});else if(m.item?.type==="function_call"){const c=m.item,_=c.id||c.call_id;_&&o.set(_,{name:c.name||"",callId:c.call_id||_})}else if(m.item&&l.has(m.item.type)){const c=m.item,_=n++;a.set(c.id,_),u.push({type:"internal-tool-start",data:{index:_,id:c.id,name:c.type}})}break}case"response.output_item.done":{if(m.item?.type==="reasoning"&&s>=0)u.push({type:"thinking-complete",data:{index:s}}),s=-1;else if(m.item&&l.has(m.item.type)){const c=m.item,_=a.get(c.id);_!==void 0&&(u.push({type:"internal-tool-complete",data:{index:_,id:c.id,name:c.type,output:m.item}}),a.delete(c.id))}break}case"response.reasoning_text.delta":{m.delta&&u.push({type:"thinking-delta",data:{index:s,text:m.delta}});break}case"response.reasoning_summary_text.delta":{m.delta&&u.push({type:"thinking-summary-delta",data:{index:s,text:m.delta}});break}case"response.in_progress":case"response.content_part.added":case"response.content_part.done":case"response.reasoning_summary_part.added":case"response.reasoning_summary_part.done":case"response.reasoning_summary_text.done":case"response.reasoning_text.done":case"response.web_search_call.in_progress":case"response.web_search_call.searching":case"response.web_search_call.completed":break;default:console.log(`[OpenAI] unhandled stream event: ${m.type}`)}return u}return i(d,"handleEvent"),{handleEvent:d}}i(an,"createStreamingAdapter");async function*cn(t){const{client:e,model:n,messages:s,system:r,tools:o,runtime:a,signal:l,options:p}=t,d=a?.tracer,{serverTools:m,...u}=p??{},c=Re(o)??[];if(m){const f={web_search:"web_search_preview",code_execution:"code_interpreter"};for(const g of m){const x=f[g.name]??g.name;c.push({type:x,...g.config})}}const _={model:n,input:Ce(s),...r&&{instructions:r},stream:!0,...c.length>0?{tools:c}:{},...u};d?.debug("OpenAI ResponsesAPI streaming request",{request:_});const h=an();try{const f=e.responses.stream(_,...l?[{signal:l}]:[]);for await(const g of f){const x=h.handleEvent(g);for(const S of x)yield S}}catch(f){if(l?.aborted)return;d?.error(f instanceof Error?f.message:String(f)),yield{type:"error",data:{type:"STREAMING_ERROR",message:f instanceof Error?f.message:String(f),raw:f}}}}i(cn,"createStreamingRequest");const ln="OpenAI";function un(t){const e=new Ve({apiKey:t});return{name:ln,async createGenerationRequest(n,s){return await rn({client:e,model:n,...s})},createStreamingRequest(n,s){const{messages:r,system:o,tools:a,context:l,signal:p,options:d}=s;return cn({client:e,model:n,messages:r,system:o,tools:a,runtime:l,signal:p,options:d})}}}i(un,"openai");const pn=O.object({searchTerm:O.string().describe("The search term to query")});class dn{static{i(this,"BraveSearchTool")}name="brave";description="Perform a search using the Brave search engine";schema=pn;apiKey;throttle;lastExecTime=0;constructor(e){e&&this.configure(e)}configure(e){const{rateLimit:n}=e;this.apiKey=e["api-key"],this.throttle=n?1100/n:void 0}async execute(e){const{searchTerm:n}=e;if(this.throttle){for(;Date.now()-this.lastExecTime<this.throttle;)await Et(this.throttle-(Date.now()-this.lastExecTime));this.lastExecTime=Date.now()}try{const s=this.apiKey,r="https://api.search.brave.com/res/v1/web/search",o=new URL(r);o.searchParams.append("q",n),o.searchParams.append("format","json");const a=await fetch(o.toString(),{method:"GET",headers:{Accept:"application/json","X-Subscription-Token":s}});if(!a.ok)throw new Error(`[Brave] HTTP error ${a.status}: ${a.statusText}`);const l=await a.json();return JSON.stringify(l)}catch(s){throw s instanceof Error?new Error(`[Brave] Error fetching search results: ${s.message}`):s}}}const mn=new dn,fn=$.object({operation:$.enum(["add","subtract","multiply","divide"]).describe("The operation to perform (add, subtract, multiply, divide)"),a:$.number().describe("First operand"),b:$.number().describe("Second operand")}),hn={name:"calculator",description:"Performs basic arithmetic operations",schema:fn,execute:i(async({operation:t,a:e,b:n})=>{switch(t){case"add":return`${e} + ${n} = ${e+n}`;case"subtract":return`${e} - ${n} = ${e-n}`;case"multiply":return`${e} * ${n} = ${e*n}`;case"divide":if(n===0)throw new Error("Cannot divide by zero");return`${e} / ${n} = ${e/n}`;default:throw new Error(`Unknown operation: ${t}`)}},"execute")},_n=Ze(Xe),gn=3e4,yn=1024*1024;async function xn(t,e={}){const{stdout:n,stderr:s}=await _n(t,{cwd:e.cwd,timeout:e.timeout??gn,maxBuffer:e.maxBuffer??yn});return{stdout:n,stderr:s}}i(xn,"runCommand");function En(t){if(t instanceof Error){const e=t;let n=`Error executing command: ${t.message}`;return e.stdout&&(n+=`
27
+ [stdout]: ${e.stdout}`),e.stderr&&(n+=`
28
+ [stderr]: ${e.stderr}`),n}return`Error executing command: ${String(t)}`}i(En,"formatExecError");function Tn(t,e){return e&&e.trim()?`${t}
29
+ [stderr]: ${e}`:t}i(Tn,"formatOutput");const wn=O.object({command:O.string().describe("The shell command to execute")});class Sn{static{i(this,"ExecTool")}name="exec";description="Execute a shell command and return the output.";schema=wn;timeout=3e4;maxBuffer=1024*1024;cwd;constructor(e){e&&this.configure(e)}configure(e){this.timeout=e.timeout??3e4,this.maxBuffer=e.maxBuffer??1024*1024,this.cwd=e.cwd}summarize(e){return e.command}async execute(e){const{command:n}=e;try{const s=await xn(n,{timeout:this.timeout,maxBuffer:this.maxBuffer,cwd:this.cwd});return Tn(s.stdout,s.stderr)}catch(s){return En(s)}}}const In=new Sn,bn=$.object({path:$.string().describe("The file path to patch"),old_string:$.string().describe("The exact text to find and replace"),new_string:$.string().describe("The replacement text"),start_line:$.number().int().positive().describe("1-indexed start line of the region to match within"),end_line:$.number().int().positive().describe("1-indexed end line (inclusive) of the region to match within")}),kn={name:"patch-file",description:"Patch a file by replacing an exact string match within a specified line range",schema:bn,summarize:i(({path:t,start_line:e,end_line:n})=>`${t}:${e}:${n}`,"summarize"),execute:i(async({path:t,old_string:e,new_string:n,start_line:s,end_line:r})=>{if(r<s)throw new Error(`end_line (${r}) must be >= start_line (${s})`);let o;try{o=await J(t,"utf-8")}catch(h){throw h instanceof Error?new Error(`Failed to read file "${t}": ${h.message}`):h}const a=o.split(`
30
+ `);if(s>a.length)throw new Error(`start_line (${s}) exceeds file length (${a.length} lines)`);if(r>a.length)throw new Error(`end_line (${r}) exceeds file length (${a.length} lines)`);const p=a.slice(s-1,r).join(`
31
+ `),d=p.indexOf(e);if(d===-1)throw new Error(`old_string not found within lines ${s}-${r} of "${t}"`);if(p.indexOf(e,d+1)!==-1)throw new Error(`old_string matches multiple times within lines ${s}-${r} of "${t}"`);const u=p.replace(e,n),_=[...a.slice(0,s-1),...u.split(`
32
+ `),...a.slice(r)].join(`
33
+ `);try{await ie(t,_,"utf-8")}catch(h){throw h instanceof Error?new Error(`Failed to write file "${t}": ${h.message}`):h}return`Successfully patched "${t}" (lines ${s}-${r})`},"execute")},An=$.object({path:$.string().describe("The file path to read from")}),$n={name:"read-file",description:"Read the contents of a file from disk",schema:An,summarize:i(({path:t})=>t,"summarize"),execute:i(async({path:t})=>{try{return await J(t,"utf-8")}catch(e){throw e instanceof Error?new Error(`Failed to read file "${t}": ${e.message}`):e}},"execute")},Mn=$.object({path:$.string().describe("The file path to write to"),content:$.string().describe("The content to write to the file")}),On={name:"write-file",description:"Write content to a file on disk, creating directories if needed",schema:Mn,summarize:i(({path:t})=>t,"summarize"),execute:i(async({path:t,content:e})=>{try{return await Je(We(t),{recursive:!0}),await ie(t,e,"utf-8"),`Successfully wrote ${e.length} characters to "${t}"`}catch(n){throw n instanceof Error?new Error(`Failed to write file "${t}": ${n.message}`):n}},"execute")};function Le(t){try{const e=F.fromJSONSchema(t);return e instanceof F.ZodObject?e.strict():F.object({}).passthrough()}catch{return F.object({}).passthrough()}}i(Le,"jsonSchemaToZod");function Rn(t,e,n){return t.map(s=>Ln(s,e,n))}i(Rn,"createMcpTools");function Cn(t,e){return t.map(n=>{const s=e?`${e}_${n.name}`:n.name,r=Le(n.inputSchema);return{name:s,description:n.description??"",schema:r}})}i(Cn,"createMcpToolDefinitions");function Ln(t,e,n){const s=n?`${n}_${t.name}`:t.name,r=Le(t.inputSchema);return{name:s,description:t.description??"",schema:r,async execute(o){const a=await e.callTool({name:t.name,arguments:o});if("isError"in a&&a.isError)throw new Error(vn(a.content));return Pn(a.content)}}}i(Ln,"createMcpTool");function Pn(t){return t.some(n=>n.type==="image")?t.filter(n=>n.type==="text"||n.type==="image").map(n=>{if(n.type==="text")return{type:"text",text:n.text};const s=n;return{type:"image",data:s.data,mimeType:s.mimeType}}):t.filter(n=>n.type==="text").map(n=>n.text).join(`
34
+ `)}i(Pn,"formatToolResult");function vn(t){return t.filter(e=>e.type==="text").map(e=>e.text).join(`
35
+ `)||"MCP tool execution error"}i(vn,"formatErrorContent");class Nn{static{i(this,"MCP")}config;client;transport;cachedMcpTools;_connected=!1;constructor(e){this.config=e}get name(){return this.config.name??this.client?.getServerVersion()?.name}get connected(){return this._connected}async connect(e){if(this._connected)return;const n=e?.tracer?.startSpan("mcp:connect",{type:"internal"});this.client=new Ye({name:"axle",version:"1.0.0"}),this.config.transport==="stdio"?this.transport=new Qe({command:this.config.command,args:this.config.args,env:this.config.env}):this.transport=new et(new URL(this.config.url),{requestInit:this.config.headers?{headers:this.config.headers}:void 0});try{await this.client.connect(this.transport),this._connected=!0,n?.end("ok")}catch(s){throw n?.end("error"),s}}async listTools(e){const n=this.assertConnected(),s=await this.fetchTools(n,e?.tracer);return Rn(s,n,e?.prefix)}async listToolDefinitions(e){const n=this.assertConnected(),s=await this.fetchTools(n,e?.tracer);return Cn(s,e?.prefix)}async refreshTools(){return this.assertConnected(),this.cachedMcpTools=void 0,this.listTools()}async close(e){this._connected&&(e?.tracer?.debug("mcp:close"),await this.client?.close(),this._connected=!1,this.client=void 0,this.transport=void 0,this.cachedMcpTools=void 0)}async fetchTools(e,n){if(this.cachedMcpTools)return this.cachedMcpTools;n?.debug("mcp:listTools");const s=await e.listTools();return this.cachedMcpTools=s.tools.map(r=>({name:r.name,description:r.description,inputSchema:r.inputSchema})),this.cachedMcpTools}assertConnected(){if(!this._connected||!this.client)throw new Error("MCP not connected. Call connect() first.");return this.client}}const Pe={debug:0,info:1,warn:2,error:3};class Un{static{i(this,"Tracer")}writers=[];_minLevel="info";get minLevel(){return this._minLevel}set minLevel(e){this._minLevel=e}addWriter(e){this.writers.includes(e)||this.writers.push(e)}removeWriter(e){const n=this.writers.indexOf(e);n!==-1&&this.writers.splice(n,1)}startSpan(e,n){const s={traceId:crypto.randomUUID(),spanId:crypto.randomUUID(),name:e,type:n?.type,startTime:performance.now(),status:"ok",attributes:{},events:[]};return this.writers.forEach(r=>r.onSpanStart(s)),new te(s,this)}async flush(){for(const e of this.writers)e.flush&&await e.flush()}_notifySpanEnd(e){this.writers.forEach(n=>n.onSpanEnd(e))}_notifySpanUpdate(e){this.writers.forEach(n=>n.onSpanUpdate?.(e))}_notifyEvent(e,n){this.writers.forEach(s=>s.onEvent?.(e,n))}_notifySpanStart(e){this.writers.forEach(n=>n.onSpanStart(e))}_notifyLLMStreamStart(e){this.writers.forEach(n=>n.onLLMStreamStart?.(e))}_notifyLLMStreamChunk(e,n){this.writers.forEach(s=>s.onLLMStreamChunk?.(e,n))}_notifyLLMStreamEnd(e,n){this.writers.forEach(s=>s.onLLMStreamEnd?.(e,n))}_shouldLog(e){return Pe[e]>=Pe[this._minLevel]}}class te{static{i(this,"Span")}data;tracer;ended=!1;llmStreamBuffer="";llmStreamActive=!1;constructor(e,n){this.data=e,this.tracer=n}startSpan(e,n){const s={traceId:this.data.traceId,spanId:crypto.randomUUID(),parentSpanId:this.data.spanId,name:e,type:n?.type,startTime:performance.now(),status:"ok",attributes:{},events:[]};return this.tracer._notifySpanStart(s),new te(s,this.tracer)}end(e="ok"){this.ended||(this.ended=!0,this.data.endTime=performance.now(),this.data.status=e,this.tracer._notifySpanEnd(this.data))}addEvent(e,n,s){if(this.ended||!this.tracer._shouldLog(n))return;const r={name:e,timestamp:performance.now(),level:n,attributes:s};this.data.events.push(r),this.tracer._notifyEvent(this.data,r)}debug(e,n){this.addEvent(e,"debug",n)}info(e,n){this.addEvent(e,"info",n)}warn(e,n){this.addEvent(e,"warn",n)}error(e,n){this.addEvent(e,"error",n)}setAttribute(e,n){this.ended||(this.data.attributes[e]=n,this.tracer._notifySpanUpdate(this.data))}setAttributes(e){this.ended||(Object.assign(this.data.attributes,e),this.tracer._notifySpanUpdate(this.data))}setResult(e){this.ended||(this.data.result=e,this.tracer._notifySpanUpdate(this.data))}startLLMStream(){this.ended||(this.llmStreamActive=!0,this.llmStreamBuffer="",this.tracer._notifyLLMStreamStart(this.data))}appendLLMStream(e){this.ended||!this.llmStreamActive||(this.llmStreamBuffer+=e,this.tracer._notifyLLMStreamChunk(this.data,e))}endLLMStream(e){if(this.ended||!this.llmStreamActive)return;this.llmStreamActive=!1;const n={...e,response:{...e.response,content:e.response.content??this.llmStreamBuffer}};this.data.result=n,this.tracer._notifyLLMStreamEnd(this.data,n)}}const ve={debug:0,info:1,warn:2,error:3};let Ne=!1;function Gn(){Ne||(le.use(tt()),Ne=!0)}i(Gn,"ensureMarkedInit");class Dn{static{i(this,"SimpleWriter")}minLevel;showInternal;showTimestamp;showDuration;markdown;output;spans=new Map;visibleDepths=new Map;constructor(e={}){this.minLevel=e.minLevel??"info",this.showInternal=e.showInternal??!1,this.showTimestamp=e.showTimestamp??!0,this.showDuration=e.showDuration??!0,this.markdown=e.markdown??!1,this.output=e.output??console.log}shouldShowEvent(e){return ve[e]>=ve[this.minLevel]}isSpanVisible(e){return!(e.type==="internal"&&!this.showInternal)}findVisibleAncestor(e){let n=e.parentSpanId;for(;n;){const s=this.spans.get(n);if(!s)break;if(this.isSpanVisible(s))return s;n=s.parentSpanId}return null}calculateVisibleDepth(e){if(!this.isSpanVisible(e))return-1;const n=this.findVisibleAncestor(e);return n?(this.visibleDepths.get(n.spanId)??0)+1:0}formatTimestamp(){if(!this.showTimestamp)return"";const e=new Date,n=e.toTimeString().slice(0,8),s=e.getMilliseconds().toString().padStart(3,"0");return`[${n}.${s}] `}formatDuration(e){if(!this.showDuration||!e.endTime)return"";const n=e.endTime-e.startTime;return n<1e3?` (${Math.round(n)}ms)`:` (${(n/1e3).toFixed(2)}s)`}formatIndent(e){return" ".repeat(e)}formatSpanName(e){return e.type?`[${e.type}] ${e.name}`:e.name}renderMarkdown(e){return Gn(),le.parse(e).trimEnd()}onSpanStart(e){if(this.spans.set(e.spanId,e),!this.isSpanVisible(e))return;const s=this.calculateVisibleDepth(e);this.visibleDepths.set(e.spanId,s);const r=this.formatIndent(s),o=this.formatTimestamp(),a=this.formatSpanName(e);this.output(`${o}${r}START ${a}`)}onSpanEnd(e){if(this.spans.set(e.spanId,e),!this.isSpanVisible(e))return;const s=this.visibleDepths.get(e.spanId)??0,r=this.formatIndent(s),o=this.formatTimestamp(),a=this.formatDuration(e),l=this.formatSpanName(e),p=e.status==="error"?" [ERROR]":"";this.output(`${o}${r}END ${l}${a}${p}`)}onSpanUpdate(e){this.spans.set(e.spanId,e)}onEvent(e,n){if(!this.shouldShowEvent(n.level))return;this.spans.set(e.spanId,e);let s;if(this.isSpanVisible(e))s=this.visibleDepths.get(e.spanId)??0;else{const u=this.findVisibleAncestor(e);u?s=this.visibleDepths.get(u.spanId)??0:s=0}const r=this.formatIndent(s+1),o=this.formatTimestamp(),a=n.level.toUpperCase().padEnd(5),l=this.markdown&&n.attributes?.markdown===!0,p=n.attributes?Object.entries(n.attributes).filter(([u])=>u!=="markdown"):[];let d=n.name;l&&(d=this.renderMarkdown(d));let m=`${o}${r}${a} ${d}`;if(p.length>0){const u=p.map(([c,_])=>`${c}=${JSON.stringify(_)}`).join(" ");m+=` ${u}`}this.output(m)}onLLMStreamStart(e){if(this.spans.set(e.spanId,e),!this.isSpanVisible(e))return;const n=this.visibleDepths.get(e.spanId)??0,s=this.formatIndent(n+1),r=this.formatTimestamp();this.output(`${r}${s}INFO LLM streaming started`)}onLLMStreamChunk(e,n){}onLLMStreamEnd(e,n){if(this.spans.set(e.spanId,e),!this.isSpanVisible(e))return;const s=this.visibleDepths.get(e.spanId)??0,r=this.formatIndent(s+1),o=this.formatTimestamp(),a=[`model=${n.model}`];if(n.finishReason&&a.push(`finishReason=${n.finishReason}`),n.usage&&(n.usage.inputTokens!==void 0&&a.push(`inputTokens=${n.usage.inputTokens}`),n.usage.outputTokens!==void 0&&a.push(`outputTokens=${n.usage.outputTokens}`)),this.output(`${o}${r}INFO LLM complete ${a.join(" ")}`),this.shouldShowEvent("debug")&&n.response.content){const p=(typeof n.response.content=="string"?n.response.content:JSON.stringify(n.response.content,null,2)).split(`
36
+ `);for(const d of p)this.output(`${o}${r}DEBUG ${d}`)}}}export{T as A,xt as D,pe as H,yt as I,A as M,Dn as S,Un as T,Ft as a,b,rt as c,Yt as d,me as e,Oe as f,st as g,lt as h,Nn as i,Mt as j,mn as k,hn as l,Dt as m,ge as n,Zt as o,gt as p,un as q,he as r,fe as s,V as t,pt as u,$n as v,On as w,kn as x,In as y};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fifthrevision/axle",
3
- "version": "0.7.2",
3
+ "version": "0.8.1",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "git+https://github.com/johncch/axle.git"
@@ -40,9 +40,12 @@
40
40
  "@anthropic-ai/sdk": "^0.78.0",
41
41
  "@commander-js/extra-typings": "^14.0.0",
42
42
  "@google/genai": "^1.42.0",
43
+ "@modelcontextprotocol/sdk": "^1.26.0",
43
44
  "chalk": "^5.6.2",
44
45
  "commander": "^14.0.3",
45
46
  "glob": "^13.0.6",
47
+ "marked": "^15.0.12",
48
+ "marked-terminal": "^7.3.0",
46
49
  "mime": "^4.1.0",
47
50
  "openai": "^6.22.0",
48
51
  "serialize-error": "^13.0.1",
@@ -1,28 +0,0 @@
1
- var Pe=Object.defineProperty;var i=(t,e)=>Pe(t,"name",{value:e,configurable:!0});import*as C from"zod";import V,{z as k}from"zod";import"glob";import Le from"mime";import{readFile as H,access as Ne,stat as Ue,writeFile as re,mkdir as Ge}from"node:fs/promises";import{resolve as Y,extname as oe,dirname as ve}from"node:path";import De from"@anthropic-ai/sdk";import{FinishReason as O,GoogleGenAI as Fe}from"@google/genai";import He from"openai";import{exec as je}from"node:child_process";import{promisify as Be}from"node:util";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 ae{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 F(t){return typeof t=="string"?t:t.filter(e=>e.type==="text").map(e=>e.text).join(`
2
-
3
- `)}i(F,"getTextContent");function We(t){return t.filter(e=>e.type==="tool-call")}i(We,"getToolCalls");function Ve(t,e){const n=e.usage??{in:0,out:0};t.in+=n.in??0,t.out+=n.out??0}i(Ve,"appendUsage");function ie(t){return JSON.stringify({error:t})}i(ie,"serializeToolError");async function ce(t,e){const n=[];let s;for(const r of t){let a;try{a=await e(r.name,r.parameters)}catch(o){a={type:"error",error:{type:"exception",message:o instanceof Error?o.message:String(o)}}}if(a==null){s={name:r.name,message:`Tool not found: ${r.name}`},n.push({id:r.id,name:r.name,content:ie({type:"not-found",message:s.message})});break}a.type==="success"?n.push({id:r.id,name:r.name,content:a.content}):n.push({id:r.id,name:r.name,content:ie(a.error)})}return{results:n,missingTool:s}}i(ce,"executeToolCalls");function le(t){const e=[],n=[],s=[],r=[],a=[],o=new AbortController;let l=!1,c,u;const d=new Promise((f,p)=>{c=i(m=>{l=!0,f(m)},"resolveResult"),u=i(m=>{l=!0,p(m)},"rejectResult")});return Promise.resolve().then(()=>ze(t,o.signal,e,n,s,r,a).then(c,u)),{onPartStart(f){e.push(f)},onPartUpdate(f){n.push(f)},onPartEnd(f){s.push(f)},onInternalTool(f){r.push(f)},onError(f){a.push(f)},cancel(){l||o.abort()},get final(){return d}}}i(le,"stream");function ue(t,e,n){for(const s of t)s(e,n)}i(ue,"emitPartStart");function Q(t,e,n,s,r){for(const a of t)a(e,n,s,r)}i(Q,"emitPartUpdate");function Je(t,e,n,s){for(const r of t)r(e,n,s)}i(Je,"emitPartEnd");function Ke(t,e){for(const n of t)n(e)}i(Ke,"emitError");async function ze(t,e,n,s,r,a,o){const{provider:l,model:c,messages:u,system:d,tools:f,onToolCall:p,maxIterations:m,tracer:_,options:h}=t,x=[...u],T=[],A={in:0,out:0};let U=0,G=0;const j=i(y=>{x.push(y),T.push(y)},"addMessage"),P=i(y=>{y.result==="error"&&Ke(o,y.error);const L=y.result==="success"?y.final?.content:y.result==="cancelled"?y.partial?.content:null,S=y.result==="success"?y.final?.finishReason:y.result==="cancelled"?I.Cancelled:void 0;return _?.setResult({kind:"llm",model:c,request:{messages:u},response:{content:L??null},usage:y.usage?{inputTokens:y.usage.in,outputTokens:y.usage.out}:void 0,finishReason:S}),_?.end(y.result==="error"?"error":"ok"),y},"endWithResult"),W=i((y,L,S,v)=>{v();const N=y.length>0?{role:"assistant",id:L,model:S,content:y,finishReason:I.Cancelled}:void 0;return N&&j(N),_?.end("ok"),{result:"cancelled",messages:T,partial:N,usage:A}},"buildCancelledResult");for(;;){if(e.aborted)return W([],"","",()=>{});if(m!==void 0&&G>=m)return P({result:"error",messages:T,error:{type:"model",error:{type:"error",error:{type:"MaxIterations",message:`Exceeded max iterations (${m})`}}},usage:A});G+=1;const y=_?.startSpan(`turn-${G}`,{type:"llm"});y?.startLLMStream();const L=l.createStreamingRequest?.(c,{messages:x,system:d,tools:f,context:{tracer:y},signal:e,options:h});if(!L)throw y?.end("error"),new Error("Provider does not support streaming. Use generate() instead.");const S=[];let v="",D="",N=null,B={in:0,out:0},R=-1,q=null,M="";const $=i(()=>{q!==null&&R>=0&&(Je(r,R,q,M),q=null,M="",R=-1)},"closePart");for await(const g of L){switch(g.type){case"start":v=g.id,D=g.data.model;break;case"text-start":{$(),S.push({type:"text",text:""}),R=U++,q="text",M="",ue(n,R,"text");break}case"text-delta":{const w=S[g.data.index];w.text+=g.data.text,M=w.text,y?.appendLLMStream(g.data.text),Q(s,R,"text",g.data.text,M);break}case"text-complete":{$();break}case"thinking-start":{$(),S.push({type:"thinking",text:""}),R=U++,q="thinking",M="",ue(n,R,"thinking");break}case"thinking-delta":{const w=S[g.data.index];w.text+=g.data.text,M=w.text,Q(s,R,"thinking",g.data.text,M);break}case"thinking-summary-delta":{const w=S[g.data.index];w.text+=g.data.text,M=w.text,Q(s,R,"thinking",g.data.text,M);break}case"thinking-complete":{$();break}case"tool-call-start":{$(),S.push({type:"tool-call",id:g.data.id,name:g.data.name,parameters:{}}),U++;break}case"tool-call-complete":{const w=S[g.data.index];g.data.id&&(w.id=g.data.id),g.data.name&&(w.name=g.data.name),w.parameters=g.data.arguments;break}case"internal-tool-start":{$();const w=U++;S.push({type:"internal-tool",id:g.data.id,name:g.data.name});for(const Z of a)Z({type:"start",index:w,id:g.data.id,name:g.data.name});break}case"internal-tool-complete":{const w=S[g.data.index];g.data.output!=null&&(w.output=g.data.output);for(const Z of a)Z({type:"complete",index:g.data.index,id:g.data.id,name:g.data.name,output:g.data.output});break}case"complete":{$(),N=g.data.finishReason,B=g.data.usage;break}case"error":{$();const w=g.data.usage??{in:0,out:0};return A.in+=w.in??0,A.out+=w.out??0,y?.end("error"),P({result:"error",messages:T,error:{type:"model",error:{type:"error",error:{type:g.data.type,message:g.data.message}}},usage:A})}default:console.warn("[WARN] Unhandled chunk type. Should never happen")}if(e.aborted)break}if(e.aborted)return y?.end("ok"),W(S,v,D,$);if(N===null)return $(),y?.end("error"),P({result:"error",messages:T,error:{type:"model",error:{type:"error",error:{type:"IncompleteStream",message:"Stream ended without a completion signal"}}},usage:A});A.in+=B.in??0,A.out+=B.out??0;const Me={kind:"llm",model:D,request:{messages:x},response:{content:S},usage:{inputTokens:B.in,outputTokens:B.out},finishReason:N};y?.endLLMStream(Me),y?.end();const z={role:"assistant",id:v,model:D,content:S,finishReason:N};if(j(z),N!==I.FunctionCall)return P({result:"success",messages:T,final:z,usage:A});const X=S.filter(g=>g.type==="tool-call");if(X.length===0)return P({result:"success",messages:T,final:z,usage:A});if(e.aborted)return _?.end("ok"),{result:"cancelled",messages:T,usage:A};const $e=p?async(g,w)=>p(g,w):async()=>null;for(const g of X)_?.info(`tool call: ${g.name}`,{parameters:g.parameters});const{results:ne,missingTool:se}=await ce(X,$e);if(ne.length>0&&j({role:"tool",content:ne}),se)return P({result:"error",messages:T,error:{type:"tool",error:se},usage:A})}}i(ze,"run");function Xe(t,e,n="{{}}"){const s=n==="{{}}"?/\{\{(.*?)\}\}/g:/\{(.*?)\}/g;return t=t.replace(s,(r,a)=>{if(a=a.trim(),Object.prototype.hasOwnProperty.call(e,a)){const o=e[a];return o==null?"":String(o)}return r}),t}i(Xe,"replaceVariables");function J(t){if(t instanceof C.ZodString)return["string","Your answer"];if(t instanceof C.ZodNumber)return["number",42];if(t instanceof C.ZodBoolean)return["boolean",!0];if(t instanceof C.ZodArray){const e=t.element;if(e instanceof C.ZodString)return["string array",["answer 1","answer 2","third answer"]];if(e instanceof C.ZodNumber)return["number array",[42,59,3.14]];if(e instanceof C.ZodBoolean)return["boolean array",[!0,!1,!1]];if(e instanceof C.ZodObject){const[n,s]=J(e);return["object array",[s,s]]}return["array",[]]}if(t instanceof C.ZodObject){const e=t.shape,n={};for(const[s,r]of Object.entries(e)){const[a,o]=J(r);n[s]=o}return["JSON object",n]}if(t instanceof C.ZodOptional){const e=t.unwrap(),[n,s]=J(e);return[`${n} | undefined`,s]}}i(J,"zodToExample");function pe(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=Ze(t),r={};for(const[a,o]of Object.entries(e)){const l=s.tags[a];if(l!==void 0)r[a]=de(o,l);else if(o.def.type!=="optional")throw new Error(`Expected results with tag ${a} but it does not exist`)}try{const a={};for(const[o,l]of Object.entries(e))o in r&&(a[o]=l.parse(r[o]));return a}catch(a){if(a&&typeof a=="object"&&"issues"in a){const o=a.issues.map(l=>`${l.path.join(".")}: ${l.message}`).join(", ");throw new Error(`Validation failed: ${o}`)}throw a}}i(pe,"parseResponse");function de(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 de(n,e)}default:return e}}i(de,"preprocessValue");function Ze(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,(a,o,l)=>(n[o]=l,""));const r=/<(\w+)>(.*?)(?:<\/?\w+>|$)/gs;return s=s.replace(r,(a,o,l)=>(n[o]=l,"")),{tags:n,remaining:s.trim()}}i(Ze,"parseTaggedSections");function fe(t,e={}){const n={...e,...t.inputs};let s=Xe(t.prompt,n);if(t.textReferences.length>0)for(const[o,l]of t.textReferences.entries()){const c=l.name?`: ${l.name}`:"";s+=`
4
-
5
- ## Reference ${o+1}${c}
6
-
7
- \`\`\`${l.content}'''`}let r=`# Instructions
8
-
9
- `;if((t.schema?Object.keys(t.schema):[]).length>0){r+=`## Output Format Instructions
10
- `,r+=`
11
- Here is how you should format your output. Follow the instructions strictly.
12
- `;for(const[o,l]of Object.entries(t.schema)){const[c,u]=J(l);r+=`
13
- - Use <${o}></${o}> tags to indicate the answer for ${o}. The answer must be a ${c}.
14
- Example: <${o}>${JSON.stringify(u)}</${o}>
15
- `}}if(t.instructions.length>0){r+=`
16
- ## Additional Instructions
17
-
18
- `;for(const o of t.instructions)r+=`- ${o}
19
- `}return r+s}i(fe,"compileInstruct");class Ye{static{i(this,"Agent")}provider;model;history;tracer;system;tools={};partStartCallback;partUpdateCallback;partEndCallback;internalToolCallback;errorCallback;constructor(e){this.provider=e.provider,this.model=e.model,this.history=new ae,this.tracer=e.tracer,this.system=e.system,e.tools&&this.addTools(e.tools)}addTool(e){this.tools[e.name]=e}addTools(e){for(const n of e)this.tools[n.name]=n}hasTools(){return Object.keys(this.tools).length>0}onPartStart(e){this.partStartCallback=e}onPartUpdate(e){this.partUpdateCallback=e}onPartEnd(e){this.partEndCallback=e}onInternalTool(e){this.internalToolCallback=e}onError(e){this.errorCallback=e}send(e,n){let s;if(typeof e=="string")this.history.addUser(e);else{const r=fe(e,n),a=e.files;this.history.addUser(qe({text:r,files:a})),s=e.schema}return this.execute(s)}execute(e){const n=this.tools,s=Object.values(n).map(o=>({name:o.name,description:o.description,schema:o.schema})),r=le({provider:this.provider,model:this.model,messages:this.history.messages,system:this.system,tools:s.length>0?s:void 0,tracer:this.tracer,onToolCall:i(async(o,l)=>{const c=n[o];if(!c)return null;try{const u=await c.execute(l);return{type:"success",content:JSON.stringify(u)}}catch(u){return{type:"error",error:{type:"execution",message:u instanceof Error?u.message:String(u)}}}},"onToolCall")});this.partStartCallback&&r.onPartStart(this.partStartCallback),this.partUpdateCallback&&r.onPartUpdate(this.partUpdateCallback),this.partEndCallback&&r.onPartEnd(this.partEndCallback),this.internalToolCallback&&r.onInternalTool(this.internalToolCallback),this.errorCallback&&r.onError(this.errorCallback);const a=r.final.then(o=>{o.messages.length>0&&this.history.add(o.messages);let l=null,c;if(o.result==="success"){if(c=o.final,c){const d=F(c.content);l=pe(d,e)}}else o.result==="cancelled"&&(c=o.partial);const u=o.usage??{in:0,out:0};return{response:l,messages:o.messages,final:c,usage:u}});return{cancel:i(()=>r.cancel(),"cancel"),get final(){return a}}}}async function Qe(t,e){const{defaults:n,tag:s}=e;let r=null,a="";if(t)try{a=Y(t),r=await H(a,{encoding:"utf-8"})}catch{throw new Error(`${s} not found, see --help for details`)}else{for(const o of n.formats)try{a=Y(n.name+"."+o),r=await H(a,{encoding:"utf-8"});break}catch{continue}if(r===null)throw new Error(`${s} not found, see --help for details`)}return{content:r,format:a.split(".").pop()??""}}i(Qe,"searchAndLoadFile");const me=20*1024*1024;function et(t){return t.type==="text"}i(et,"isTextFileInfo");function tt(t){return t.type==="image"||t.type==="document"}i(tt,"isBase64FileInfo");const nt=new Set(["application/json","application/xml","application/yaml","application/x-yaml","application/toml"]);function st(t){return t.startsWith("text/")||nt.has(t)}i(st,"isTextLikeMimeType");function rt(t){const e=Le.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(st(e))return{type:"text",mimeType:e};{const n=oe(t).toLowerCase();throw new Error(`Unsupported file type: ${n} (${e})`)}}i(rt,"getFileCategory");async function ot(t,e){const n=Y(t);try{await Ne(n)}catch{throw new Error(`File not found: ${t}`)}const s=await Ue(n);if(s.size>me)throw new Error(`File too large: ${s.size} bytes. Maximum allowed: ${me} bytes`);const r=n.split("/").pop()||"",a=rt(n);if((e||(a.type==="text"?"utf-8":"base64"))==="utf-8"){if(a.type!=="text")throw new Error(`Cannot read ${a.type} file as text: ${t}`);const l=await H(n,"utf-8");return{path:n,content:l,mimeType:a.mimeType,size:s.size,name:r,type:"text"}}else{if(a.type==="text")throw new Error(`Cannot read text file as binary: ${t}`);const c=(await H(n)).toString("base64");return{path:n,base64:c,mimeType:a.mimeType,size:s.size,name:r,type:a.type}}}i(ot,"loadFileContent");class at{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}tt(e)?this.files.push(e):et(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 b={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"};b.CLAUDE_SONNET_4_6,b.CLAUDE_OPUS_4_6,b.CLAUDE_OPUS_4_5_20251101,b.CLAUDE_HAIKU_4_5_20251001,b.CLAUDE_SONNET_4_5_20250929,b.CLAUDE_OPUS_4_1_20250805,b.CLAUDE_OPUS_4_20250514,b.CLAUDE_SONNET_4_20250514,b.CLAUDE_3_HAIKU_20240307;const it=b.CLAUDE_HAIKU_4_5;function _e(t){return Array.isArray(t)?t:[t]}i(_e,"arrayify");function ct(t){return new Promise(e=>setTimeout(e,t))}i(ct,"delay");function K(t){if(t==null)return{type:"error",error:{type:"Undetermined",message:"Unknown error occurred"},usage:{in:0,out:0},raw:t};if(t instanceof Error)return{type:"error",error:{type:t.name||"Error",message:t.message||"Unexpected error"},usage:{in:0,out:0},raw:t};if(typeof t=="object"){const e=t,n=e?.error?.error?.type||e?.error?.type||e?.type||e?.code||e?.status||"Undetermined",s=e?.error?.error?.message||e?.error?.message||e?.message||e?.error||"Unexpected error";return{type:"error",error:{type:String(n),message:String(s)},usage:{in:0,out:0},raw:t}}return{type:"error",error:{type:"Undetermined",message:String(t)},usage:{in:0,out:0},raw:t}}i(K,"getUndefinedError");function he(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:n.content}))};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(he,"convertToProviderMessages");function ge(t){return t.map(e=>{const n=V.toJSONSchema(e.schema);if(!lt(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(ge,"convertToProviderTools");function ye(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(ye,"convertToAxleContentParts");function Ee(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(Ee,"convertStopReason$1");function lt(t){return t&&typeof t=="object"&&t.type==="object"}i(lt,"isObjectSchema");async function ut(t){const{client:e,model:n,messages:s,system:r,tools:a,context:o,options:l}=t,c=o?.tracer,{stop:u,max_tokens:d,...f}=l??{},p={model:n,max_tokens:d??16e3,messages:he(s),...r&&{system:r},...u&&{stop_sequences:_e(u)},...a&&{tools:ge(a)},...f};c?.debug("Anthropic request",{request:p});let m;try{const _=await e.messages.create(p);m=pt(_)}catch(_){m=K(_)}return c?.debug("Anthropic response",{result:m}),m}i(ut,"createGenerationRequest$3");function pt(t){const e=Ee(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=ye(t.content);return{type:"success",id:t.id,model:t.model,role:t.role,finishReason:I.FunctionCall,content:n,text:F(n)??"",usage:{in:t.usage.input_tokens,out:t.usage.output_tokens},raw:t}}if(t.type=="message"){const n=ye(t.content);return{type:"success",id:t.id,model:t.model,role:"assistant",finishReason:e,content:n,text:F(n)??"",usage:{in:t.usage.input_tokens,out:t.usage.output_tokens},raw:t}}}i(pt,"convertToAIResponse");function dt(){const t=new Map,e=new Map,n=new Map;function s(r){const a=[];switch(r.type){case"message_start":a.push({type:"start",id:r.message.id,data:{model:r.message.model,timestamp:Date.now()}});break;case"message_delta":r.delta.stop_reason&&a.push({type:"complete",data:{finishReason:Ee(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"),a.push({type:"text-start",data:{index:r.index}});else if(r.content_block.type==="tool_use"){t.set(r.index,"tool");const o=r.content_block;n.set(r.index,{id:o.id,name:o.name,argumentsBuffer:""}),a.push({type:"tool-call-start",data:{index:r.index,id:o.id,name:o.name}})}else if(r.content_block.type==="thinking")t.set(r.index,"thinking"),a.push({type:"thinking-start",data:{index:r.index,redacted:!1}});else if(r.content_block.type==="redacted_thinking")t.set(r.index,"thinking"),a.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 o=r.content_block;e.set(o.id,{index:r.index,name:o.name}),a.push({type:"internal-tool-start",data:{index:r.index,id:o.id,name:o.name}})}else if(r.content_block.type==="web_search_tool_result"){const o=r.content_block,l=e.get(o.tool_use_id);l&&(a.push({type:"internal-tool-complete",data:{index:l.index,id:o.tool_use_id,name:l.name,output:o.content}}),e.delete(o.tool_use_id))}break;case"content_block_delta":if(r.delta.type==="text_delta")a.push({type:"text-delta",data:{text:r.delta.text,index:r.index}});else if(r.delta.type==="input_json_delta"){const o=n.get(r.index);o&&(o.argumentsBuffer+=r.delta.partial_json)}else r.delta.type==="thinking_delta"?a.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 o=t.get(r.index);if(o==="text")a.push({type:"text-complete",data:{index:r.index}});else if(o==="thinking")a.push({type:"thinking-complete",data:{index:r.index}});else if(o!=="internal-tool"){if(o==="tool"){const l=n.get(r.index);if(l){try{const c=JSON.parse(l.argumentsBuffer);a.push({type:"tool-call-complete",data:{index:r.index,id:l.id,name:l.name,arguments:c}})}catch(c){throw new Error(`Failed to parse tool call arguments for ${l.name}: ${c instanceof Error?c.message:String(c)}`)}n.delete(r.index)}}}t.delete(r.index);break}}return a}return i(s,"handleEvent"),{handleEvent:s}}i(dt,"createAnthropicStreamingAdapter");async function*ft(t){const{client:e,model:n,messages:s,system:r,tools:a,runtime:o,signal:l,options:c}=t,u=o?.tracer,{stop:d,max_tokens:f,...p}=c??{},m={model:n,max_tokens:f??mt(n),messages:he(s),...r&&{system:r},...d&&{stop_sequences:_e(d)},...a&&{tools:ge(a)},...p};u?.debug("Anthropic streaming request",{request:m});const _=dt();try{const h=await e.messages.create({...m,stream:!0},{signal:l});for await(const x of h){const T=_.handleEvent(x);for(const A of T)yield A}}catch(h){if(l?.aborted)return;yield{type:"error",data:{type:"STREAMING_ERROR",message:h instanceof Error?h.message:String(h),raw:h}}}}i(ft,"createStreamingRequest$3");const xe={[b.CLAUDE_OPUS_4_6]:128e3,[b.CLAUDE_OPUS_4_5_20251101]:64e3,[b.CLAUDE_HAIKU_4_5_20251001]:64e3,[b.CLAUDE_SONNET_4_5_20250929]:64e3,[b.CLAUDE_SONNET_4_20250514]:64e3,[b.CLAUDE_3_7_SONNET_20250219]:64e3,[b.CLAUDE_OPUS_4_1_20250805]:32e3,[b.CLAUDE_OPUS_4_20250514]:32e3,[b.CLAUDE_3_5_HAIKU_20241022]:8192,[b.CLAUDE_3_HAIKU_20240307]:4096};function mt(t){return t in xe?xe[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(mt,"getMaxTokens");const _t="anthropic";function ht(t){const e=new De({apiKey:t});return{name:_t,async createGenerationRequest(n,s){return await ut({client:e,model:n,...s})},createStreamingRequest(n,s){const{messages:r,system:a,tools:o,context:l,signal:c,options:u}=s;return ft({client:e,model:n,messages:r,system:a,tools:o,runtime:l,signal:c,options:u})}}}i(ht,"anthropic");function Ie(t,e){const n=t.map(gt).flat(1);return e?[{role:"system",content:e},...n]:n}i(Ie,"convertAxleMessages");function Se(t){if(t&&t.length>0)return t.map(e=>({type:"function",function:{name:e.name,description:e.description,parameters:V.toJSONSchema(e.schema)}}))}i(Se,"convertTools");function ee(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(ee,"convertFinishReason");function gt(t){switch(t.role){case"tool":return yt(t);case"assistant":return Et(t);default:return xt(t)}}i(gt,"convertMessage$2");function yt(t){return t.content.map(e=>({role:"tool",content:e.content,tool_call_id:e.id}))}i(yt,"convertToolMessage$2");function Et(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(Et,"convertAssistantMessage$2");function xt(t){if(typeof t.content=="string")return{role:"user",content:t.content};const e=t.content.map(It).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(xt,"convertUserMessage$2");function It(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(It,"convertContentPart$2");async function St(t){const{baseUrl:e,model:n,messages:s,system:r,tools:a,context:o,apiKey:l,options:c}=t,u=o?.tracer,d=Ie(s,r),f=Se(a),p={model:n,messages:d,...f&&{tools:f}};c&&(c.temperature!==void 0&&(p.temperature=c.temperature),c.top_p!==void 0&&(p.top_p=c.top_p),c.max_tokens!==void 0&&(p.max_tokens=c.max_tokens),c.frequency_penalty!==void 0&&(p.frequency_penalty=c.frequency_penalty),c.presence_penalty!==void 0&&(p.presence_penalty=c.presence_penalty),c.stop!==void 0&&(p.stop=c.stop)),u?.debug("ChatCompletions request",{request:p});let m;try{const _={"Content-Type":"application/json"};l&&(_.Authorization=`Bearer ${l}`);const h=await fetch(`${e}/chat/completions`,{method:"POST",headers:_,body:JSON.stringify(p)});if(!h.ok){const T=await h.text().catch(()=>"");throw new Error(`HTTP error! status: ${h.status}${T?` - ${T}`:""}`)}const x=await h.json();m=Tt(x)}catch(_){u?.error("Error fetching ChatCompletions response",{error:_ instanceof Error?_.message:String(_)}),m=K(_)}return u?.debug("ChatCompletions response",{result:m}),m}i(St,"createGenerationRequest$2");function Tt(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 a of e.message.tool_calls){let o;try{o=JSON.parse(a.function.arguments)}catch(l){throw new Error(`Invalid tool call arguments for ${a.function.name}: ${l instanceof Error?l.message:String(l)}`)}if(typeof o!="object"||o===null||Array.isArray(o))throw new Error(`Invalid tool call arguments for ${a.function.name}: expected object, got ${typeof o}`);n.push({type:"tool-call",id:a.id,name:a.function.name,parameters:o})}const s=n.some(a=>a.type==="tool-call"),r=ee(s?"tool_calls":e.finish_reason);return{type:"success",id:t.id,model:t.model,role:"assistant",finishReason:r,content:n,text:F(n)??"",usage:{in:t.usage?.prompt_tokens||0,out:t.usage?.completion_tokens||0},raw:t}}i(Tt,"fromModelResponse$2");function wt(){const t=new Map;let e=0,n=-1,s="",r="",a=null;function o(c){n<0||(a==="text"?c.push({type:"text-complete",data:{index:n}}):a==="thinking"&&c.push({type:"thinking-complete",data:{index:n}}),a=null,n=-1)}i(o,"closeActivePart");function l(c){const u=[],d=c.choices[0];if(!d)return u;s||(s=c.id,r=c.model,u.push({type:"start",id:s,data:{model:r,timestamp:Date.now()}}));const f=d.delta;if(f.reasoning_content&&(a!=="thinking"&&(o(u),n=e++,a="thinking",u.push({type:"thinking-start",data:{index:n}})),u.push({type:"thinking-delta",data:{index:n,text:f.reasoning_content}})),f.content&&(a!=="text"&&(o(u),n=e++,a="text",u.push({type:"text-start",data:{index:n}})),u.push({type:"text-delta",data:{text:f.content,index:n}})),f.tool_calls){o(u);for(const p of f.tool_calls){const m=p.index;if(!t.has(m)){const h=e++,x=p.id||`tool-${h}`;t.set(m,{id:x,name:p.function?.name||"",argumentsBuffer:"",partIdx:h}),u.push({type:"tool-call-start",data:{index:h,id:x,name:p.function?.name||""}})}const _=t.get(m);p.id&&(_.id=p.id),p.function?.name&&(_.name=p.function.name),p.function?.arguments&&(_.argumentsBuffer+=p.function.arguments)}}if(d.finish_reason){o(u);for(const[,m]of t)try{const _=JSON.parse(m.argumentsBuffer);u.push({type:"tool-call-complete",data:{index:m.partIdx,id:m.id,name:m.name,arguments:_}})}catch(_){throw new Error(`Failed to parse tool call arguments for ${m.name}: ${_ instanceof Error?_.message:String(_)}`)}const p=ee(d.finish_reason);u.push({type:"complete",data:{finishReason:p,usage:c.usage?{in:c.usage.prompt_tokens,out:c.usage.completion_tokens}:{in:0,out:0}}})}return u}return i(l,"handleChunk"),{handleChunk:l}}i(wt,"createStreamingAdapter$1");async function*bt(t){const{baseUrl:e,model:n,messages:s,system:r,tools:a,context:o,signal:l,apiKey:c,options:u}=t,d=o?.tracer,f=Ie(s,r),p=Se(a),m={model:n,messages:f,stream:!0,stream_options:{include_usage:!0},...p&&{tools:p}};u&&(u.temperature!==void 0&&(m.temperature=u.temperature),u.top_p!==void 0&&(m.top_p=u.top_p),u.max_tokens!==void 0&&(m.max_tokens=u.max_tokens),u.frequency_penalty!==void 0&&(m.frequency_penalty=u.frequency_penalty),u.presence_penalty!==void 0&&(m.presence_penalty=u.presence_penalty),u.stop!==void 0&&(m.stop=u.stop)),d?.debug("ChatCompletions streaming request",{request:m});const _=wt();try{const h={"Content-Type":"application/json"};c&&(h.Authorization=`Bearer ${c}`);const x=await fetch(`${e}/chat/completions`,{method:"POST",headers:h,body:JSON.stringify(m),signal:l});if(!x.ok){const G=await x.text().catch(()=>"");throw new Error(`HTTP error! status: ${x.status}${G?` - ${G}`:""}`)}if(!x.body)throw new Error("Response body is null");const T=x.body.getReader(),A=new TextDecoder;let U="";for(;;){const{done:G,value:j}=await T.read();if(G)break;U+=A.decode(j,{stream:!0});const P=U.split(`
20
- `);U=P.pop()||"";for(const W of P){const y=W.trim();if(!y||y.startsWith(":")||!y.startsWith("data: "))continue;const L=y.slice(6);if(L!=="[DONE]")try{const S=JSON.parse(L),v=_.handleChunk(S);for(const D of v)yield D}catch(S){d?.error("Error parsing ChatCompletions stream chunk",{error:S instanceof Error?S.message:String(S),line:y})}}}}catch(h){if(l?.aborted)return;d?.error("Error in ChatCompletions streaming request",{error:h instanceof Error?h.message:String(h)}),yield{type:"error",data:{type:"STREAMING_ERROR",message:h instanceof Error?h.message:String(h),raw:h}}}}i(bt,"createStreamingRequest$2");function At(t,e){return{name:"ChatCompletions",async createGenerationRequest(n,s){return await St({baseUrl:t,model:n,apiKey:e,...s})},createStreamingRequest(n,s){return bt({baseUrl:t,model:n,apiKey:e,...s})}}}i(At,"chatCompletions");const E={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"};E.GEMINI_3_1_PRO_PREVIEW,E.GEMINI_3_1_PRO_PREVIEW_CUSTOMTOOLS,E.GEMINI_3_PRO_PREVIEW,E.GEMINI_3_FLASH_PREVIEW,E.GEMINI_3_PRO_IMAGE_PREVIEW,E.GEMINI_2_5_PRO,E.GEMINI_2_5_FLASH,E.GEMINI_2_5_FLASH_PREVIEW_09_2025,E.GEMINI_2_5_FLASH_IMAGE,E.GEMINI_2_5_FLASH_LITE,E.GEMINI_2_5_FLASH_LITE_PREVIEW_09_2025,E.GEMINI_2_5_FLASH_NATIVE_AUDIO_LATEST,E.GEMINI_2_5_FLASH_NATIVE_AUDIO_PREVIEW_09_2025,E.GEMINI_2_5_FLASH_NATIVE_AUDIO_PREVIEW_12_2025,E.GEMINI_2_5_COMPUTER_USE_PREVIEW_10_2025,E.GEMINI_2_0_FLASH,E.GEMINI_2_0_FLASH_001,E.GEMINI_2_0_FLASH_LITE,E.GEMINI_2_0_FLASH_LITE_001,E.GEMINI_EXP_1206,E.GEMINI_FLASH_LATEST,E.GEMINI_FLASH_LITE_LATEST,E.GEMINI_PRO_LATEST,E.GEMMA_3_27B_IT,E.GEMMA_3_12B_IT,E.GEMMA_3_4B_IT,E.GEMMA_3_1B_IT,E.GEMMA_3N_E4B_IT,E.GEMMA_3N_E2B_IT,E.DEEP_RESEARCH_PRO_PREVIEW_12_2025,E.GEMINI_ROBOTICS_ER_1_5_PREVIEW,E.NANO_BANANA_PRO_PREVIEW;const kt=E.GEMINI_2_5_FLASH_LITE;function Te(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:V.toJSONSchema(r.schema)}]}))),n&&Object.assign(s,n),s}i(Te,"prepareConfig");function we(t){return t.map(Ct).filter(e=>e!==void 0)}i(we,"convertAxleMessagesToGemini");function Ct(t){switch(t.role){case"tool":return Ot(t);case"assistant":return Rt(t);case"user":return Mt(t)}}i(Ct,"convertMessage$1");function Ot(t){return{role:"user",parts:t.content.map(e=>({functionResponse:{id:e.id??void 0,name:e.name,response:{output:e.content}}}))}}i(Ot,"convertToolMessage$1");function Rt(t){const e=[],n=t.content.filter(r=>r.type==="text");if(n.length>0){const r=n.map(a=>a.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=>({functionCall:{id:r.id??void 0,name:r.name,args:r.parameters}}))),{role:"model",parts:e}}i(Rt,"convertAssistantMessage$1");function Mt(t){return typeof t.content=="string"?{role:"user",parts:[{text:t.content}]}:{role:"user",parts:t.content.map($t).filter(n=>n!==null)}}i(Mt,"convertUserMessage$1");function $t(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($t,"convertContentPart$1");function be(t){switch(t){case O.STOP:return[!0,I.Stop];case O.MAX_TOKENS:return[!0,I.Length];case O.FINISH_REASON_UNSPECIFIED:case O.SAFETY:case O.RECITATION:case O.LANGUAGE:case O.OTHER:case O.BLOCKLIST:case O.PROHIBITED_CONTENT:case O.SPII:case O.MALFORMED_FUNCTION_CALL:case O.IMAGE_SAFETY:return[!1,I.Error]}}i(be,"convertStopReason");async function Pt(t){const{client:e,model:n,messages:s,system:r,tools:a,context:o,options:l}=t,c=o?.tracer,u=l?{...l}:{};u.max_tokens&&(u.maxOutputTokens=u.max_tokens,delete u.max_tokens),u.stop&&(u.stopSequences=Array.isArray(u.stop)?u.stop:[u.stop],delete u.stop),u.top_p!==void 0&&(u.topP=u.top_p,delete u.top_p);const d={contents:we(s),config:Te(a,r,u)};c?.debug("Gemini request",{request:d});let f;try{const p=await e.models.generateContent({model:n,...d});f=Lt(p,{tracer:c})}catch(p){c?.error(p instanceof Error?p.message:String(p)),f=K(p)}return c?.debug("Gemini response",{result:f}),f}i(Pt,"createGenerationRequest$1");function Lt(t,e){const{tracer:n}=e,s=t.usageMetadata.promptTokenCount,r=t.usageMetadata.totalTokenCount-s,a={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:a,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 o=t.candidates[0],c=(o.content?.parts||[]).map(f=>f.text).filter(f=>f!==void 0).join(""),[u,d]=be(o.finishReason);if(u){const f=[];if(c&&f.push({type:"text",text:c}),t.functionCalls)for(const p of t.functionCalls){if(typeof p.args!="object"||p.args===null||Array.isArray(p.args))throw new Error(`Invalid tool call arguments for ${p.name}: expected object, got ${typeof p.args}`);f.push({type:"tool-call",id:p.id,name:p.name,parameters:p.args})}return{type:"success",id:t.responseId,model:t.modelVersion,role:"assistant",finishReason:t.functionCalls?I.FunctionCall:d,content:f,text:F(f)??"",usage:a,raw:t}}else return{type:"error",error:{type:"Undetermined",message:`Unexpected stop reason: ${d}`},usage:a,raw:t}}i(Lt,"fromModelResponse$1");function Nt(){let t=0,e=-1,n=!1,s="",r="",a=0,o=0,l=null;function c(d){e<0||(l==="text"?d.push({type:"text-complete",data:{index:e}}):l==="thinking"&&d.push({type:"thinking-complete",data:{index:e}}),l=null,e=-1)}i(c,"closeActivePart");function u(d){const f=[];s||(s=d.responseId||`gemini-${Date.now()}`,r=d.modelVersion||"gemini",f.push({type:"start",id:s,data:{model:r,timestamp:Date.now()}})),d.usageMetadata&&(a=d.usageMetadata.promptTokenCount||0,o=(d.usageMetadata.totalTokenCount||0)-a);const p=d.candidates?.[0];if(!p)return f;const m=p.content?.parts||[];for(const _ of m){const h="thought"in _&&_.thought===!0;if(h&&_.text?(l!=="thinking"&&(c(f),e=t++,l="thinking",f.push({type:"thinking-start",data:{index:e}})),f.push({type:"thinking-delta",data:{index:e,text:_.text}})):_.text&&!h?(l!=="text"&&(c(f),e=t++,l="text",f.push({type:"text-start",data:{index:e}})),f.push({type:"text-delta",data:{text:_.text,index:e}})):_.functionCall||console.log(`[gemini] unhandled part type: ${JSON.stringify(Object.keys(_))}`),_.functionCall){c(f),n=!0;const x=t++,T=_.functionCall.id||`tool-${x}`;f.push({type:"tool-call-start",data:{index:x,id:T,name:_.functionCall.name}}),f.push({type:"tool-call-complete",data:{index:x,id:T,name:_.functionCall.name,arguments:_.functionCall.args}})}}if(p.finishReason&&p.finishReason!==O.FINISH_REASON_UNSPECIFIED){c(f);const[_,h]=be(p.finishReason),x=n?I.FunctionCall:h;!_&&!n?f.push({type:"error",data:{type:"FinishReasonError",message:`Unexpected finish reason: ${p.finishReason}`,usage:{in:a,out:o},raw:d}}):f.push({type:"complete",data:{finishReason:x,usage:{in:a,out:o}}})}return f}return i(u,"handleChunk"),{handleChunk:u}}i(Nt,"createGeminiStreamingAdapter");async function*Ut(t){const{client:e,model:n,messages:s,system:r,tools:a,runtime:o,signal:l,options:c}=t,u=o?.tracer,d=c?{...c}:{};d.max_tokens&&(d.maxOutputTokens=d.max_tokens,delete d.max_tokens),d.stop&&(d.stopSequences=Array.isArray(d.stop)?d.stop:[d.stop],delete d.stop),d.top_p!==void 0&&(d.topP=d.top_p,delete d.top_p);const f={contents:we(s),config:Te(a,r,d)};u?.debug("Gemini streaming request",{request:f});const p=Nt();try{const m=await e.models.generateContentStream({model:n,...f});for await(const _ of m){const h=p.handleChunk(_);for(const x of h)yield x}}catch(m){if(l?.aborted)return;u?.error(m instanceof Error?m.message:String(m)),yield{type:"error",data:{type:"STREAMING_ERROR",message:m instanceof Error?m.message:String(m),raw:m}}}}i(Ut,"createStreamingRequest$1");const Gt="Gemini";function vt(t){const e=new Fe({apiKey:t});return{name:Gt,async createGenerationRequest(n,s){return await Pt({client:e,model:n,...s})},createStreamingRequest(n,s){const{messages:r,system:a,tools:o,context:l,signal:c,options:u}=s;return Ut({client:e,model:n,messages:r,system:a,tools:o,runtime:l,signal:c,options:u})}}}i(vt,"gemini");const Ae={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"},Dt=Ae.GPT_5_MINI;function ke(t){if(t&&t.length>0)return t.map(e=>{const n=V.toJSONSchema(e.schema);return{type:"function",strict:!0,name:e.name,description:e.description,parameters:n}})}i(ke,"prepareTools");function Ce(t){return t.map(Ft).flat(1)}i(Ce,"convertAxleMessageToResponseInput");function Ft(t){switch(t.role){case"tool":return Ht(t);case"assistant":return jt(t);default:return Bt(t)}}i(Ft,"convertMessage");function Ht(t){return t.content.map(e=>({type:"function_call_output",call_id:e.id,output:e.content}))}i(Ht,"convertToolMessage");function jt(t){const e=[],n=F(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(jt,"convertAssistantMessage");function Bt(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(Bt,"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 Wt(t){const{client:e,model:n,messages:s,system:r,tools:a,context:o,options:l}=t,c=o?.tracer,u=ke(a),d={model:n,input:Ce(s),...r&&{instructions:r},...u?{tools:u}:{},...l};c?.debug("OpenAI ResponsesAPI request",{request:d});let f;try{const p=await e.responses.create(d);f=Vt(p)}catch(p){c?.error(p instanceof Error?p.message:String(p)),f=K(p)}return c?.debug("OpenAI ResponsesAPI response",{result:f}),f}i(Wt,"createGenerationRequest");function Vt(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 a=r.summary?.[0]?.text||r.content?.[0]?.text||"";(a||r.encrypted_content)&&n.push({type:"thinking",text:a,...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 a=r;try{n.push({type:"tool-call",id:a.id||"",name:a.name||"",parameters:a.arguments?JSON.parse(a.arguments):{}})}catch(o){throw new Error(`Failed to parse tool call arguments for ${a.name}: ${o instanceof Error?o.message:String(o)}`)}}return{type:"success",id:t.id,model:t.model||"",role:"assistant",finishReason:t.incomplete_details?I.Error:I.Stop,content:n,text:F(n)??"",usage:{in:t.usage?.input_tokens??0,out:t.usage?.output_tokens??0},raw:t}}i(Vt,"fromModelResponse");function Jt(){let t="",e="",n=0,s=-1,r=!1;const a=new Map,o=new Map,l=new Set(["web_search_call","file_search_call","code_interpreter_call"]),c=new Map;function u(d){const f=[];switch(d.type){case"response.created":{t=d.response.id||`openai-${Date.now()}`,e=d.response.model,f.push({type:"start",id:t,data:{model:e,timestamp:Date.now()}});break}case"response.output_text.delta":{s===-1&&(s=n++,f.push({type:"text-start",data:{index:s}})),f.push({type:"text-delta",data:{text:d.delta,index:s}});break}case"response.output_text.done":{s>=0&&(f.push({type:"text-complete",data:{index:s}}),s=-1);break}case"response.function_call_arguments.delta":{const p=d.item_id;if(!c.has(p)){const _=a.get(p),h=_?.name||"",x=_?.callId||p,T=n++;c.set(p,{id:p,callId:x,name:h,argumentsBuffer:"",partIdx:T}),f.push({type:"tool-call-start",data:{index:T,id:x,name:h}})}const m=c.get(p);m.argumentsBuffer+=d.delta;break}case"response.function_call_arguments.done":{r=!0;const p=d.item_id,m=c.get(p),_=d.name||m?.name||"";if(m){try{const h=JSON.parse(d.arguments);f.push({type:"tool-call-complete",data:{index:m.partIdx,id:m.callId,name:_,arguments:h}})}catch(h){throw new Error(`Failed to parse function call arguments for ${_}: ${h instanceof Error?h.message:String(h)}`)}c.delete(p)}break}case"response.completed":{const p=d.response.usage;f.push({type:"complete",data:{finishReason:d.response.incomplete_details?I.Error:r?I.FunctionCall:I.Stop,usage:{in:p?.input_tokens||0,out:p?.output_tokens||0}}});break}case"response.failed":{f.push({type:"error",data:{type:"RESPONSES_API_ERROR",message:`Response failed: ${d.response.status}`,raw:d}});break}case"response.output_item.added":{if(d.item?.type==="reasoning")s=n++,f.push({type:"thinking-start",data:{index:s}});else if(d.item?.type==="function_call"){const p=d.item,m=p.id||p.call_id;m&&a.set(m,{name:p.name||"",callId:p.call_id||m})}else if(d.item&&l.has(d.item.type)){const p=d.item,m=n++;o.set(p.id,m),f.push({type:"internal-tool-start",data:{index:m,id:p.id,name:p.type}})}break}case"response.output_item.done":{if(d.item?.type==="reasoning"&&s>=0)f.push({type:"thinking-complete",data:{index:s}}),s=-1;else if(d.item&&l.has(d.item.type)){const p=d.item,m=o.get(p.id);m!==void 0&&(f.push({type:"internal-tool-complete",data:{index:m,id:p.id,name:p.type,output:d.item}}),o.delete(p.id))}break}case"response.reasoning_text.delta":{d.delta&&f.push({type:"thinking-delta",data:{index:s,text:d.delta}});break}case"response.reasoning_summary_text.delta":{d.delta&&f.push({type:"thinking-summary-delta",data:{index:s,text:d.delta}});break}default:console.log(`[OpenAI] unhandled stream event: ${d.type}`)}return f}return i(u,"handleEvent"),{handleEvent:u}}i(Jt,"createStreamingAdapter");async function*Kt(t){const{client:e,model:n,messages:s,system:r,tools:a,runtime:o,signal:l,options:c}=t,u=o?.tracer,d=ke(a),f={model:n,input:Ce(s),...r&&{instructions:r},stream:!0,...d?{tools:d}:{},...c};u?.debug("OpenAI ResponsesAPI streaming request",{request:f});const p=Jt();try{const m=e.responses.stream(f,...l?[{signal:l}]:[]);for await(const _ of m){const h=p.handleEvent(_);for(const x of h)yield x}}catch(m){if(l?.aborted)return;u?.error(m instanceof Error?m.message:String(m)),yield{type:"error",data:{type:"STREAMING_ERROR",message:m instanceof Error?m.message:String(m),raw:m}}}}i(Kt,"createStreamingRequest");const zt="OpenAI";function Xt(t){const e=new He({apiKey:t});return{name:zt,async createGenerationRequest(n,s){return await Wt({client:e,model:n,...s})},createStreamingRequest(n,s){const{messages:r,system:a,tools:o,context:l,signal:c,options:u}=s;return Kt({client:e,model:n,messages:r,system:a,tools:o,runtime:l,signal:c,options:u})}}}i(Xt,"openai");const Zt=C.object({searchTerm:C.string().describe("The search term to query")});class Yt{static{i(this,"BraveSearchTool")}name="brave";description="Perform a search using the Brave search engine";schema=Zt;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 ct(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",a=new URL(r);a.searchParams.append("q",n),a.searchParams.append("format","json");const o=await fetch(a.toString(),{method:"GET",headers:{Accept:"application/json","X-Subscription-Token":s}});if(!o.ok)throw new Error(`[Brave] HTTP error ${o.status}: ${o.statusText}`);const l=await o.json();return JSON.stringify(l)}catch(s){throw s instanceof Error?new Error(`[Brave] Error fetching search results: ${s.message}`):s}}}const Qt=new Yt,en=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")}),tn={name:"calculator",description:"Performs basic arithmetic operations",schema:en,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")},nn=Be(je),sn=3e4,rn=1024*1024;async function on(t,e={}){const{stdout:n,stderr:s}=await nn(t,{cwd:e.cwd,timeout:e.timeout??sn,maxBuffer:e.maxBuffer??rn});return{stdout:n,stderr:s}}i(on,"runCommand");function an(t){if(t instanceof Error){const e=t;let n=`Error executing command: ${t.message}`;return e.stdout&&(n+=`
21
- [stdout]: ${e.stdout}`),e.stderr&&(n+=`
22
- [stderr]: ${e.stderr}`),n}return`Error executing command: ${String(t)}`}i(an,"formatExecError");function cn(t,e){return e&&e.trim()?`${t}
23
- [stderr]: ${e}`:t}i(cn,"formatOutput");const ln=C.object({command:C.string().describe("The shell command to execute")});class un{static{i(this,"ExecTool")}name="exec";description="Execute a shell command and return the output.";schema=ln;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 on(n,{timeout:this.timeout,maxBuffer:this.maxBuffer,cwd:this.cwd});return cn(s.stdout,s.stderr)}catch(s){return an(s)}}}const pn=new un,dn=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")}),fn={name:"patch-file",description:"Patch a file by replacing an exact string match within a specified line range",schema:dn,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 a;try{a=await H(t,"utf-8")}catch(_){throw _ instanceof Error?new Error(`Failed to read file "${t}": ${_.message}`):_}const o=a.split(`
24
- `);if(s>o.length)throw new Error(`start_line (${s}) exceeds file length (${o.length} lines)`);if(r>o.length)throw new Error(`end_line (${r}) exceeds file length (${o.length} lines)`);const c=o.slice(s-1,r).join(`
25
- `),u=c.indexOf(e);if(u===-1)throw new Error(`old_string not found within lines ${s}-${r} of "${t}"`);if(c.indexOf(e,u+1)!==-1)throw new Error(`old_string matches multiple times within lines ${s}-${r} of "${t}"`);const f=c.replace(e,n),m=[...o.slice(0,s-1),...f.split(`
26
- `),...o.slice(r)].join(`
27
- `);try{await re(t,m,"utf-8")}catch(_){throw _ instanceof Error?new Error(`Failed to write file "${t}": ${_.message}`):_}return`Successfully patched "${t}" (lines ${s}-${r})`},"execute")},mn=k.object({path:k.string().describe("The file path to read from")}),_n={name:"read-file",description:"Read the contents of a file from disk",schema:mn,summarize:i(({path:t})=>t,"summarize"),execute:i(async({path:t})=>{try{return await H(t,"utf-8")}catch(e){throw e instanceof Error?new Error(`Failed to read file "${t}": ${e.message}`):e}},"execute")},hn=k.object({path:k.string().describe("The file path to write to"),content:k.string().describe("The content to write to the file")}),gn={name:"write-file",description:"Write content to a file on disk, creating directories if needed",schema:hn,summarize:i(({path:t})=>t,"summarize"),execute:i(async({path:t,content:e})=>{try{return await Ge(ve(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")},Oe={debug:0,info:1,warn:2,error:3};class yn{static{i(this,"Tracer")}writers=[];_minLevel="info";get minLevel(){return this._minLevel}set minLevel(e){this._minLevel=e}addWriter(e){this.writers.includes(e)||this.writers.push(e)}removeWriter(e){const n=this.writers.indexOf(e);n!==-1&&this.writers.splice(n,1)}startSpan(e,n){const s={traceId:crypto.randomUUID(),spanId:crypto.randomUUID(),name:e,type:n?.type,startTime:performance.now(),status:"ok",attributes:{},events:[]};return this.writers.forEach(r=>r.onSpanStart(s)),new te(s,this)}async flush(){for(const e of this.writers)e.flush&&await e.flush()}_notifySpanEnd(e){this.writers.forEach(n=>n.onSpanEnd(e))}_notifySpanUpdate(e){this.writers.forEach(n=>n.onSpanUpdate?.(e))}_notifyEvent(e,n){this.writers.forEach(s=>s.onEvent?.(e,n))}_notifySpanStart(e){this.writers.forEach(n=>n.onSpanStart(e))}_notifyLLMStreamStart(e){this.writers.forEach(n=>n.onLLMStreamStart?.(e))}_notifyLLMStreamChunk(e,n){this.writers.forEach(s=>s.onLLMStreamChunk?.(e,n))}_notifyLLMStreamEnd(e,n){this.writers.forEach(s=>s.onLLMStreamEnd?.(e,n))}_shouldLog(e){return Oe[e]>=Oe[this._minLevel]}}class te{static{i(this,"Span")}data;tracer;ended=!1;llmStreamBuffer="";llmStreamActive=!1;constructor(e,n){this.data=e,this.tracer=n}startSpan(e,n){const s={traceId:this.data.traceId,spanId:crypto.randomUUID(),parentSpanId:this.data.spanId,name:e,type:n?.type,startTime:performance.now(),status:"ok",attributes:{},events:[]};return this.tracer._notifySpanStart(s),new te(s,this.tracer)}end(e="ok"){this.ended||(this.ended=!0,this.data.endTime=performance.now(),this.data.status=e,this.tracer._notifySpanEnd(this.data))}addEvent(e,n,s){if(this.ended||!this.tracer._shouldLog(n))return;const r={name:e,timestamp:performance.now(),level:n,attributes:s};this.data.events.push(r),this.tracer._notifyEvent(this.data,r)}debug(e,n){this.addEvent(e,"debug",n)}info(e,n){this.addEvent(e,"info",n)}warn(e,n){this.addEvent(e,"warn",n)}error(e,n){this.addEvent(e,"error",n)}setAttribute(e,n){this.ended||(this.data.attributes[e]=n,this.tracer._notifySpanUpdate(this.data))}setAttributes(e){this.ended||(Object.assign(this.data.attributes,e),this.tracer._notifySpanUpdate(this.data))}setResult(e){this.ended||(this.data.result=e,this.tracer._notifySpanUpdate(this.data))}startLLMStream(){this.ended||(this.llmStreamActive=!0,this.llmStreamBuffer="",this.tracer._notifyLLMStreamStart(this.data))}appendLLMStream(e){this.ended||!this.llmStreamActive||(this.llmStreamBuffer+=e,this.tracer._notifyLLMStreamChunk(this.data,e))}endLLMStream(e){if(this.ended||!this.llmStreamActive)return;this.llmStreamActive=!1;const n={...e,response:{...e.response,content:e.response.content??this.llmStreamBuffer}};this.data.result=n,this.tracer._notifyLLMStreamEnd(this.data,n)}}const Re={debug:0,info:1,warn:2,error:3};class En{static{i(this,"SimpleWriter")}minLevel;showInternal;showTimestamp;showDuration;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.output=e.output??console.log}shouldShowEvent(e){return Re[e]>=Re[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}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),a=this.formatTimestamp(),o=this.formatSpanName(e);this.output(`${a}${r}START ${o}`)}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),a=this.formatTimestamp(),o=this.formatDuration(e),l=this.formatSpanName(e),c=e.status==="error"?" [ERROR]":"";this.output(`${a}${r}END ${l}${o}${c}`)}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 c=this.findVisibleAncestor(e);c?s=this.visibleDepths.get(c.spanId)??0:s=0}const r=this.formatIndent(s+1),a=this.formatTimestamp(),o=n.level.toUpperCase().padEnd(5);let l=`${a}${r}${o} ${n.name}`;if(n.attributes&&Object.keys(n.attributes).length>0){const c=Object.entries(n.attributes).map(([u,d])=>`${u}=${JSON.stringify(d)}`).join(" ");l+=` ${c}`}this.output(l)}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),a=this.formatTimestamp(),o=[`model=${n.model}`];if(n.finishReason&&o.push(`finishReason=${n.finishReason}`),n.usage&&(n.usage.inputTokens!==void 0&&o.push(`inputTokens=${n.usage.inputTokens}`),n.usage.outputTokens!==void 0&&o.push(`outputTokens=${n.usage.outputTokens}`)),this.output(`${a}${r}INFO LLM complete ${o.join(" ")}`),this.shouldShowEvent("debug")&&n.response.content){const c=(typeof n.response.content=="string"?n.response.content:JSON.stringify(n.response.content,null,2)).split(`
28
- `);for(const u of c)this.output(`${a}${r}DEBUG ${u}`)}}}export{I as A,it as D,ae as H,at as I,b as M,En as S,yn as T,kt as a,E as b,Ve as c,Dt as d,ce as e,Ae as f,We as g,Ye as h,ht as i,Qt as j,tn as k,At as l,fe as m,vt as n,ot as o,Xt as p,pe as q,Qe as r,le as s,_n as t,fn as u,pn as v,gn as w};