@fifthrevision/axle 0.16.3 → 0.18.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -3,6 +3,8 @@
3
3
  Axle is a TypeScript library for building multi-turn LLM agents. It provides a
4
4
  small, focused API for building agentic applications.
5
5
 
6
+ **Documentation:** https://axle.fifthrevision.com
7
+
6
8
  ## Quick Start
7
9
 
8
10
  ```typescript
@@ -12,10 +14,12 @@ const provider = anthropic(process.env.ANTHROPIC_API_KEY);
12
14
  const agent = new Agent({ provider, model: "claude-sonnet-4-5-20250929" });
13
15
 
14
16
  const r1 = await agent.send("What is the capital of France?").final;
17
+ if (!r1.ok) throw new Error(r1.error.kind);
15
18
  console.log(r1.response); // "Paris is the capital of France."
16
19
 
17
20
  // Multi-turn — history is managed automatically
18
21
  const r2 = await agent.send("And what about Germany?").final;
22
+ if (!r2.ok) throw new Error(r2.error.kind);
19
23
  ```
20
24
 
21
25
  ## Philosophy
@@ -65,13 +69,17 @@ attachments, bound template inputs, or additional instructions.
65
69
  ```typescript
66
70
  import * as z from "zod";
67
71
 
68
- const instruct = new Instruct("Summarize the following {{topic}}.", {
69
- summary: z.string(),
70
- keyPoints: z.array(z.string()),
72
+ const instruct = new Instruct({
73
+ prompt: "Summarize the following {{topic}}.",
74
+ schema: z.object({
75
+ summary: z.string(),
76
+ keyPoints: z.array(z.string()),
77
+ }),
71
78
  }).withInputs({ topic: "document" });
72
79
  instruct.addFile(await loadFileContent("./report.pdf"));
73
80
 
74
81
  const result = await agent.send(instruct).final;
82
+ if (!result.ok) throw new Error(result.error.kind);
75
83
  // result.response is { summary: string, keyPoints: string[] }
76
84
  ```
77
85
 
@@ -110,8 +118,12 @@ const handle = stream({
110
118
  onToolCall: async (name, params) => ({ type: "success", content: "result" }),
111
119
  });
112
120
 
113
- handle.onPartUpdate((index, type, delta) => process.stdout.write(delta));
121
+ handle.on((event) => {
122
+ if (event.type === "text:delta") process.stdout.write(event.delta);
123
+ });
124
+
114
125
  const result = await handle.final;
126
+ if (!result.ok) throw new Error(result.error.kind);
115
127
  ```
116
128
 
117
129
  `generate()` does the same but without streaming — it returns the final result
@@ -127,6 +139,9 @@ const result = await generate({
127
139
  tools: [myTool],
128
140
  onToolCall: async (name, params) => ({ type: "success", content: "result" }),
129
141
  });
142
+
143
+ if (!result.ok) throw new Error(result.error.kind);
144
+ result.response; // final assistant message
130
145
  ```
131
146
 
132
147
  Both `stream()` and `generate()` also accept an `Instruct` as the latest user
@@ -141,20 +156,45 @@ const result = await generate({
141
156
  provider,
142
157
  model,
143
158
  messages: previousMessages,
144
- instruct: new Instruct("Answer {{question}}.", {
145
- answer: z.string(),
159
+ instruct: new Instruct({
160
+ prompt: "Answer {{question}}.",
161
+ schema: z.object({
162
+ answer: z.string(),
163
+ }),
146
164
  }).withInput("question", "Should we proceed?"),
147
165
  });
148
166
 
149
- if (result.result === "success") {
150
- result.response?.answer; // string
151
- }
167
+ if (!result.ok) throw new Error(result.error.kind);
168
+ result.response.answer; // string
152
169
  ```
153
170
 
154
171
  Both handle the full tool-call loop automatically. Agent uses `stream()`
155
172
  internally and adds history management, system prompt, and callback wiring on
156
173
  top.
157
174
 
175
+ ### Results
176
+
177
+ `generate(...)`, `stream(...).final`, and `agent.send(...).final` all resolve to
178
+ a two-state result:
179
+
180
+ ```typescript
181
+ if (!result.ok) {
182
+ result.error.kind; // "model" | "tool" | "parse"
183
+ if (result.error.kind === "parse") {
184
+ result.error.message;
185
+ }
186
+ return;
187
+ }
188
+
189
+ result.response; // always present when ok is true
190
+ ```
191
+
192
+ For `generate()` and `stream()`, plain calls return the final assistant message.
193
+ For `Agent.send("...")`, plain calls return the assistant text. `Instruct`
194
+ calls return the parsed schema value. Model, tool, and parse failures return
195
+ `ok: false`; abort, fatal tool, configuration, and unexpected execution errors
196
+ still throw.
197
+
158
198
  Cancellation follows standard JavaScript abort semantics:
159
199
 
160
200
  - `handle.cancel(reason)` aborts a `stream()` or `agent.send()` handle.
@@ -165,21 +205,25 @@ Cancellation follows standard JavaScript abort semantics:
165
205
 
166
206
  ### Structured Output
167
207
 
168
- Pass a Zod schema as the second argument to Instruct. Axle compiles the schema
208
+ Pass a Zod schema to Instruct. Axle compiles the schema
169
209
  into output format instructions, then parses the response back into typed
170
210
  objects.
171
211
 
172
212
  ```typescript
173
213
  import * as z from "zod";
174
214
 
175
- const instruct = new Instruct("Tell me about Mars.", {
176
- name: z.string(),
177
- distanceFromSun: z.number(),
178
- moons: z.array(z.string()),
215
+ const instruct = new Instruct({
216
+ prompt: "Tell me about Mars.",
217
+ schema: z.object({
218
+ name: z.string(),
219
+ distanceFromSun: z.number(),
220
+ moons: z.array(z.string()),
221
+ }),
179
222
  });
180
223
 
181
224
  const agent = new Agent({ provider, model });
182
225
  const result = await agent.send(instruct).final;
226
+ if (!result.ok) throw new Error(result.error.kind);
183
227
 
184
228
  result.response.name; // string
185
229
  result.response.distanceFromSun; // number
@@ -268,6 +312,7 @@ await mcp.connect();
268
312
 
269
313
  const agent = new Agent({ provider, model, mcps: [mcp] });
270
314
  const result = await agent.send("Count the words in 'hello world'").final;
315
+ if (!result.ok) throw new Error(result.error.kind);
271
316
 
272
317
  await mcp.close();
273
318
  ```
@@ -287,7 +332,17 @@ const mcp = new MCP({
287
332
 
288
333
  ### Streaming
289
334
 
290
- Agent exposes a single `on()` method for streaming events as they arrive.
335
+ Axle has two event models, used at different levels:
336
+
337
+ - `Agent.on(...)` emits `AgentEvent` — a high-level turn view organized
338
+ around parts (text, thinking, action).
339
+ - `stream(...).on(...)` emits `StreamEvent` — a lower-level view that
340
+ surfaces every text/thinking/tool transition the provider produces.
341
+
342
+ `Agent` uses `stream()` internally and translates each `StreamEvent` into
343
+ one or more `AgentEvent`s.
344
+
345
+ #### Agent events
291
346
 
292
347
  ```typescript
293
348
  const agent = new Agent({ provider, model });
@@ -297,11 +352,16 @@ agent.on((event) => {
297
352
  case "text:delta":
298
353
  process.stdout.write(event.delta);
299
354
  break;
300
- case "turn:complete":
301
- console.log(`Turn done: ${event.message.id}`);
355
+ case "part:start":
356
+ if (event.part.type === "action") {
357
+ console.log(`Tool: ${event.part.detail.name}`);
358
+ }
302
359
  break;
303
- case "tool:exec-start":
304
- console.log(`Running tool: ${event.name}`);
360
+ case "action:complete":
361
+ console.log("Tool complete");
362
+ break;
363
+ case "turn:end":
364
+ console.log(`Turn ${event.status} (in: ${event.usage.in})`);
305
365
  break;
306
366
  case "error":
307
367
  console.error(event.error);
@@ -313,6 +373,9 @@ const handle = agent.send("Write me a poem.");
313
373
  // handle.cancel(reason) aborts mid-stream and rejects handle.final with an AbortError
314
374
  try {
315
375
  const result = await handle.final;
376
+ if (!result.ok) {
377
+ console.error(result.error);
378
+ }
316
379
  } catch (err) {
317
380
  if (err instanceof Error && err.name === "AbortError") {
318
381
  // Cancellation preserves partial state on AxleAbortError: reason, turn, partial, usage
@@ -323,16 +386,34 @@ try {
323
386
  }
324
387
  ```
325
388
 
326
- Event types include `turn:start`, `turn:complete`, `tool-results:start`,
327
- `tool-results:complete`, `text:start`, `text:delta`, `text:end`,
328
- `thinking:start`, `thinking:delta`, `thinking:end`, `tool:request`,
329
- `tool:exec-start`, `tool:exec-complete`, `provider-tool:start`,
330
- `provider-tool:complete`, and `error`. The `turn:*` and `tool-results:*`
331
- events carry complete `AxleAssistantMessage` and `AxleToolCallMessage` objects
332
- for client-server architectures that need authoritative message boundaries.
389
+ `AgentEvent` types: `session:restore`, `turn:user`, `turn:start`, `turn:end`,
390
+ `part:start`, `part:end`, `text:delta`, `thinking:delta`, `action:args-delta`,
391
+ `action:running`, `action:progress`, `action:complete`, `action:error`,
392
+ `action:child-event`, `error`.
393
+
394
+ `part:start` carries a `TurnPart`, discriminated by `part.type` (`"text"`,
395
+ `"thinking"`, `"file"`, `"action"`). Action parts further discriminate on
396
+ `part.kind` (`"tool" | "agent" | "provider-tool"`).
333
397
 
334
398
  Callbacks are registered once and fire on every subsequent `send()`.
335
399
 
400
+ #### stream() events
401
+
402
+ The low-level `stream()` primitive emits a different event shape — closer
403
+ to the raw provider stream, with separate `start`/`end` events for each
404
+ text and thinking block, and distinct events for tool request, execution,
405
+ and completion.
406
+
407
+ `StreamEvent` types: `text:start`, `text:delta`, `text:end`,
408
+ `thinking:start`, `thinking:delta`, `thinking:end`, `tool:request`,
409
+ `tool:exec-start`, `tool:exec-delta`, `tool:exec-complete`,
410
+ `provider-tool:start`, `provider-tool:complete`, `turn:complete`,
411
+ `tool-results:start`, `tool-results:complete`, `error`.
412
+
413
+ The `turn:complete` and `tool-results:complete` events carry complete
414
+ `AxleAssistantMessage` and `AxleToolCallMessage` objects for client-server
415
+ architectures that need authoritative message boundaries.
416
+
336
417
  ### Hosting / Sessions
337
418
 
338
419
  Axle stops at the agent runtime boundary. If you need long-lived sessions,
@@ -0,0 +1,45 @@
1
+ import{c as e}from"./models-DnS0bPB-.js";import*as t from"zod";import n,{z as r}from"zod";import i,{access as a,mkdir as o,readFile as s,stat as c,writeFile as l}from"node:fs/promises";import u,{dirname as d,extname as f,resolve as p}from"node:path";import m from"@anthropic-ai/sdk";import"glob";import h from"mime";import{FinishReason as g,FunctionCallingConfigMode as _,GoogleGenAI as v}from"@google/genai";import y from"openai";import{spawn as b}from"node:child_process";import{Client as x}from"@modelcontextprotocol/sdk/client/index.js";import{StdioClientTransport as S}from"@modelcontextprotocol/sdk/client/stdio.js";import{StreamableHTTPClientTransport as C}from"@modelcontextprotocol/sdk/client/streamableHttp.js";import w from"chalk";import{marked as T}from"marked";import E from"node:crypto";var D=class e extends Error{code;id;details;constructor(t,n){super(t,{cause:n?.cause}),this.name=this.constructor.name,this.code=n?.code||`AXLE_ERROR`,this.id=n?.id,this.details=n?.details,Object.setPrototypeOf(this,e.prototype)}toJSON(){return{name:this.name,message:this.message,code:this.code,...this.id?{id:this.id}:{},...this.details?{details:this.details}:{},...this.cause?{cause:ee(this.cause)}:{}}}};function ee(e){return e instanceof Error?{name:e.name,message:e.message,...e.stack?{stack:e.stack}:{},...`cause`in e&&e.cause?{cause:ee(e.cause)}:{}}:e}var O=class e extends D{reason;messages;partial;usage;constructor(t=`Operation aborted`,n){super(t,{code:`ABORTED`,details:{reason:n?.reason,usage:n?.usage}}),this.name=`AbortError`,this.reason=n?.reason,this.messages=n?.messages,this.partial=n?.partial,this.usage=n?.usage,Object.setPrototypeOf(this,e.prototype)}toJSON(){return{...super.toJSON(),reason:this.reason,...this.messages?{messages:this.messages}:{},...this.partial?{partial:this.partial}:{},...this.usage?{usage:this.usage}:{}}}},k=class e extends O{turn;constructor(t=`Agent send aborted`,n){super(t,n),this.turn=n?.turn,Object.setPrototypeOf(this,e.prototype)}toJSON(){return{...super.toJSON(),...this.turn?{turn:this.turn}:{}}}},A=class e extends D{toolName;messages;partial;usage;constructor(t=`Fatal tool error`,n){super(t,{code:`TOOL_FATAL_ERROR`,details:{toolName:n?.toolName,usage:n?.usage},cause:n?.cause}),this.toolName=n?.toolName,this.messages=n?.messages,this.partial=n?.partial,this.usage=n?.usage,Object.setPrototypeOf(this,e.prototype)}toJSON(){return{...super.toJSON(),...this.toolName?{toolName:this.toolName}:{},...this.messages?{messages:this.messages}:{},...this.partial?{partial:this.partial}:{},...this.usage?{usage:this.usage}:{}}}};function te(e){let t=z(e.system??``),n=F(e.tools),r=F(e.mcpTools),i=I(e.providerTools),a=e.messages.reduce((e,t)=>e+j(t),0),o=t+n+r+i+a;return{total:o,system:t,tools:n,mcpTools:r,providerTools:i,messages:a,...e.limit===void 0?{}:{limit:e.limit,free:Math.max(0,e.limit-o)}}}function j(e){switch(e.role){case`user`:return M(e.content);case`assistant`:return M(e.content);case`tool`:return e.content.reduce((e,t)=>e+P(t),0)}}function M(e){return typeof e==`string`?z(e):e.reduce((e,t)=>e+N(t),0)}function N(e){switch(e.type){case`text`:return z(e.text);case`thinking`:return z(e.summary??e.text);case`tool-call`:return z(e.name)+R(e.parameters);case`provider-tool`:return z(e.name)+R(e.input)+R(e.output);case`file`:return R(e.file)}}function P(e){return z(e.name)+ne(e.content)}function ne(e){return typeof e==`string`?z(e):e.reduce((e,t)=>t.type===`text`?e+z(t.text):e+R(t.file),0)}function F(e){let t=e?.map(L)??[];return t.length===0?0:R({tools:t})}function I(e){return!e||e.length===0?0:R({providerTools:e})}function L(e){try{return{name:e.name,description:e.description,parameters:n.toJSONSchema(e.schema)}}catch{return{name:e.name,description:e.description}}}function R(e){return e==null?0:z(JSON.stringify(e))}function z(e){return e?Math.ceil(e.length/3):0}function B(e){let{text:t,files:n}=e,r=[];if(t&&r.push({type:`text`,text:t}),n)for(let e of n)r.push({type:`file`,file:e});return r}function V(e){return e.filter(e=>e.type===`text`).map(e=>e.text).join(`
2
+
3
+ `)}function H(e){return e.filter(e=>e.type===`tool-call`)}function U(e){if(e instanceof t.ZodString)return[`string`,`Your answer`];if(e instanceof t.ZodNumber)return[`number`,42];if(e instanceof t.ZodBoolean)return[`boolean`,!0];if(e instanceof t.ZodEnum){let t=e.options;return[t.map(ie).join(` | `),t[0]]}if(e instanceof t.ZodLiteral){let t=e.value;return[ie(t),t]}if(e instanceof t.ZodArray){let n=e.element;if(n instanceof t.ZodString)return[`string array`,[`answer 1`,`answer 2`,`third answer`]];if(n instanceof t.ZodNumber)return[`number array`,[42,59,3.14]];if(n instanceof t.ZodBoolean)return[`boolean array`,[!0,!1,!1]];if(n instanceof t.ZodObject){let[,e]=U(n);return[`object array`,[e,e]]}else if(n instanceof t.ZodEnum||n instanceof t.ZodLiteral){let[e,t]=U(n);return[`${e} array`,[t]]}return[`array`,[]]}if(e instanceof t.ZodObject){let t=e.shape,n={};for(let[e,r]of Object.entries(t)){let[,t]=U(r);n[e]=t}return[`JSON object`,n]}if(e instanceof t.ZodOptional){let[t,n]=U(e.unwrap());return[`${t} | undefined`,n]}throw Error(`Unsupported Zod schema: ${e.constructor.name}`)}function re(e){if(e instanceof t.ZodObject)return Object.entries(e.shape).map(([e,t])=>{let[n]=U(t);return[e,n]});let[n]=U(e);return[[`response`,n]]}function ie(e){return typeof e==`string`?JSON.stringify(e):String(e)}function ae(e,t){if(!t)return e;let n=oe(e);try{return t.parse(n)}catch(e){if(e&&typeof e==`object`&&`issues`in e){let t=e.issues.map(e=>`${e.path.join(`.`)}: ${e.message}`).join(`, `);throw Error(`Validation failed: ${t}`)}throw e}}function oe(e){let t=e.trim(),n=t.match(/^```(?:json)?\s*([\s\S]*?)\s*```$/i),r=n?n[1].trim():t;try{return JSON.parse(r)}catch(e){throw Error(`Cannot parse response as JSON: ${e.message}`)}}function se(e){if(typeof e==`string`)return{message:{role:`user`,id:crypto.randomUUID(),content:[{type:`text`,text:e}]},parse:e=>ce(e,void 0)};let t=e.render(),n=e.files,r=e.schema;return{message:{role:`user`,id:crypto.randomUUID(),content:B({text:t,files:n})},parse:e=>ce(e,r)}}function ce(e,t){return e?ae(V(e.content),t):null}function W(){return{in:0,out:0}}function le(e,t){t&&(e.in+=t.in??0,e.out+=t.out??0,de(e,`cachedIn`,t.cachedIn),de(e,`cacheWriteIn`,t.cacheWriteIn),de(e,`reasoningOut`,t.reasoningOut))}function G(e,t){return{...e,...fe(`cachedIn`,t.cachedIn),...fe(`cacheWriteIn`,t.cacheWriteIn),...fe(`reasoningOut`,t.reasoningOut)}}function ue(e){if(e)return{inputTokens:e.in,outputTokens:e.out,...e.cachedIn===void 0?{}:{cachedInputTokens:e.cachedIn},...e.cacheWriteIn===void 0?{}:{cacheWriteInputTokens:e.cacheWriteIn},...e.reasoningOut===void 0?{}:{reasoningOutputTokens:e.reasoningOut}}}function de(e,t,n){n!==void 0&&(e[t]=(e[t]??0)+n)}function fe(e,t){return typeof t==`number`?{[e]:t}:{}}var pe=class{tools=new Map;mcpTools=new Map;providerTools=new Map;constructor(e){e?.tools&&this.add(e.tools),e?.providerTools&&this.addProvider(e.providerTools)}add(e){let t=Array.isArray(e)?e:[e];for(let e of t){if(this.has(e.name))throw new D(`Tool already registered: ${e.name}`,{code:`TOOL_REGISTRY_DUPLICATE`,details:{name:e.name}});this.tools.set(e.name,e)}}addMcp(e){let t=Array.isArray(e)?e:[e];for(let e of t){if(this.has(e.name))throw new D(`Tool already registered: ${e.name}`,{code:`TOOL_REGISTRY_DUPLICATE`,details:{name:e.name}});this.mcpTools.set(e.name,e)}}addProvider(e){let t=Array.isArray(e)?e:[e];for(let e of t){if(this.has(e.name))throw new D(`Tool already registered: ${e.name}`,{code:`TOOL_REGISTRY_DUPLICATE`,details:{name:e.name}});this.providerTools.set(e.name,e)}}remove(e){let t=this.tools.delete(e),n=this.mcpTools.delete(e),r=this.providerTools.delete(e);return t||n||r}has(e){return this.tools.has(e)||this.mcpTools.has(e)||this.providerTools.has(e)}get(e){return this.tools.get(e)??this.mcpTools.get(e)}getProvider(e){return this.providerTools.get(e)}executable(){return[...this.tools.values(),...this.mcpTools.values()]}local(){return[...this.tools.values()]}mcp(){return[...this.mcpTools.values()]}provider(){return[...this.providerTools.values()]}get size(){return this.tools.size+this.mcpTools.size+this.providerTools.size}};function me(e,t){le(e,t.usage)}function he(e){return JSON.stringify({error:e})}function ge(e){let t=e.tools!==void 0||e.providerTools!==void 0;if(e.registry&&t)throw new D("Cannot specify both `registry` and `tools` / `providerTools`. Use one or the other.",{code:`TOOL_OPTIONS_CONFLICT`});return e.registry?e.registry:new pe({tools:e.tools,providerTools:e.providerTools})}async function _e(e,t=async()=>null,n,r,i){let a=[],o=()=>{throw new O(`Operation aborted`,{reason:n.reason})};for(let s of e){n.aborted&&o();let e=i?.startSpan(s.name,{type:`tool`}),c={signal:n,tracer:e,registry:r,emit:()=>{}},l;try{l=await t(s.name,s.parameters,c),n.aborted&&(e?.end(`ok`),o())}catch(t){if(t instanceof A)throw e?.setResult({kind:`tool`,name:s.name,input:s.parameters,output:{type:`fatal`,message:t.message}}),e?.end(`error`),t;(n.aborted||t instanceof O||t instanceof Error&&t.name===`AbortError`)&&(e?.end(`ok`),o()),l={type:`error`,error:{type:`exception`,message:t instanceof Error?t.message:String(t)}}}if(l==null){let t=r.get(s.name);if(t)try{let n=await t.execute(s.parameters,c);e?.setResult({kind:`tool`,name:s.name,input:s.parameters,output:n}),e?.end(`ok`),a.push({id:s.id,name:s.name,content:n});continue}catch(t){if(t instanceof A)throw e?.setResult({kind:`tool`,name:s.name,input:s.parameters,output:{type:`fatal`,message:t.message}}),e?.end(`error`),t;(n.aborted||t instanceof O||t instanceof Error&&t.name===`AbortError`)&&(e?.end(`ok`),o()),l={type:`error`,error:{type:`execution`,message:t instanceof Error?t.message:String(t)}}}}if(l==null){let t=`Tool not found: ${s.name}`;e?.setResult({kind:`tool`,name:s.name,input:s.parameters,output:{type:`not-found`,message:t}}),e?.end(`error`),a.push({id:s.id,name:s.name,content:he({type:`not-found`,message:t}),isError:!0});continue}l.type===`success`?(e?.setResult({kind:`tool`,name:s.name,input:s.parameters,output:l.content}),e?.end(`ok`),a.push({id:s.id,name:s.name,content:l.content})):(e?.setResult({kind:`tool`,name:s.name,input:s.parameters,output:l.error}),e?.end(`error`),a.push({id:s.id,name:s.name,content:he(l.error),isError:!0}))}return{results:a}}let ve=function(e){return e.Stop=`stop`,e.Length=`length`,e.FunctionCall=`function_call`,e.Error=`error`,e.Custom=`custom`,e.Cancelled=`cancelled`,e}({});function K(e,t){for(let n of e)n(t)}function ye(e){return{type:`error`,error:{type:`not-found`,message:`Tool not found: ${e}`}}}function be(e){return{name:e.name,description:e.description,schema:e.schema}}function xe(e){let t=[],n,r;if(`instruct`in e){let{instruct:t,messages:i,...a}=e,o=se(t);r=o.parse,n={...a,messages:[...i??[],o.message]}}else n=e;let i=new AbortController,a=n.signal?AbortSignal.any([i.signal,n.signal]):i.signal,{promise:o,resolve:s,reject:c}=Promise.withResolvers();return Promise.resolve().then(()=>Se(n,a,t).then(e=>{if(r&&e.ok){try{s({...e,response:r(e.final)})}catch(t){s({ok:!1,messages:e.messages,final:e.final,usage:e.usage,error:{kind:`parse`,error:t,message:t instanceof Error?t.message:String(t)}})}return}s(e)},c)),{on(e){t.push(e)},cancel(e){i.abort(e)},get final(){return o}}}async function Se(e,t,n){let{provider:r,model:i,messages:a,system:o,onToolCall:s,maxIterations:c,tracer:l,fileResolver:u,reasoning:d,maxOutputTokens:f,temperature:p,topP:m,stop:h,toolChoice:g,parallelToolCalls:_,providerOptions:v}=e,y=ge(e),b=[...a],x=[],S=W(),C=0,w=0,T=e=>{b.push(e),x.push(e)},E=e=>{e.ok||K(n,{type:`error`,error:e.error});let t=e.ok?e.final.content:null,r=e.ok?e.final.finishReason:void 0;return l?.setResult({kind:`llm`,model:i,request:{messages:a},response:{content:t??null},usage:ue(e.usage),finishReason:r}),l?.end(e.ok?`ok`:`error`),e},D=(e,n,r,i)=>{i();let a=e.length?{role:`assistant`,id:n,model:r,content:e,finishReason:`cancelled`}:void 0;throw a&&T(a),l?.end(`ok`),new O(`Stream aborted`,{reason:t.reason,messages:x,partial:a,usage:S})};for(;;){if(t.aborted&&D([],``,``,()=>{}),c!==void 0&&w>=c)return E({ok:!1,messages:x,error:{kind:`model`,error:{type:`error`,error:{type:`MaxIterations`,message:`Exceeded max iterations (${c})`}}},usage:S});w+=1;let e=l?.startSpan(`turn-${w}`,{type:`llm`}),a=y?.executable()??[],ee=a.length>0?a.map(be):void 0,k=y?.provider()??[],te=r.createStreamingRequest(i,{messages:b,system:o,tools:ee,providerTools:k.length>0?k:void 0,runtime:{tracer:e,fileResolver:u},signal:t,reasoning:d,maxOutputTokens:f,temperature:p,topP:m,stop:h,toolChoice:g,parallelToolCalls:_,providerOptions:v}),j=[],M=``,N=``,P=null,ne=W(),F=-1,I=null,L=``,R=new Map,z=-1,B=()=>{I!==null&&F>=0&&(K(n,{type:I===`text`?`text:end`:`thinking:end`,index:F,final:L}),I=null,L=``,F=-1)};for await(let r of te){switch(r.type){case`start`:M=r.id,N=r.data.model,K(n,{type:`turn:start`,id:M,model:N});break;case`text-start`:B(),j.push({type:`text`,text:``}),z=j.length-1,F=C++,I=`text`,L=``,K(n,{type:`text:start`,index:F});break;case`text-delta`:{let e=j[z];e.text+=r.data.text,L=e.text,K(n,{type:`text:delta`,index:F,delta:r.data.text,accumulated:L});break}case`text-complete`:B();break;case`thinking-start`:B(),j.push({type:`thinking`,text:``}),z=j.length-1,F=C++,I=`thinking`,L=``,K(n,{type:`thinking:start`,index:F});break;case`thinking-delta`:{let e=j[z];e.text+=r.data.text,L=e.text,K(n,{type:`thinking:delta`,index:F,delta:r.data.text,accumulated:L});break}case`thinking-summary-delta`:{let e=j[z];e.text+=r.data.text,L=e.text,K(n,{type:`thinking:delta`,index:F,delta:r.data.text,accumulated:L});break}case`thinking-complete`:B();break;case`tool-call-start`:{B();let e=C++;j.push({type:`tool-call`,id:r.data.id,name:r.data.name,parameters:{}}),z=j.length-1,R.set(r.data.id,e),K(n,{type:`tool:request`,index:e,id:r.data.id,name:r.data.name});break}case`tool-call-args-delta`:K(n,{type:`tool:args-delta`,index:R.get(r.data.id)??-1,id:r.data.id,name:r.data.name,delta:r.data.delta,accumulated:r.data.accumulated});break;case`tool-call-complete`:{let e=j[z];r.data.id&&(e.id=r.data.id),r.data.name&&(e.name=r.data.name),e.parameters=r.data.arguments,r.data.providerMetadata&&(e.providerMetadata=r.data.providerMetadata);break}case`provider-tool-start`:{B();let e=C++;j.push({type:`provider-tool`,id:r.data.id,name:r.data.name}),z=j.length-1,K(n,{type:`provider-tool:start`,index:e,id:r.data.id,name:r.data.name});break}case`provider-tool-complete`:{let e=j[z];r.data.output!=null&&(e.output=r.data.output),K(n,{type:`provider-tool:complete`,index:r.data.index,id:r.data.id,name:r.data.name,output:r.data.output});break}case`complete`:B(),P=r.data.finishReason,ne=r.data.usage;break;case`error`:return B(),le(S,r.data.usage),e?.end(`error`),E({ok:!1,messages:x,error:{kind:`model`,error:{type:`error`,error:{type:r.data.type,message:r.data.message}}},usage:S});default:console.warn(`[WARN] Unhandled chunk type. Should never happen`)}if(t.aborted)break}if(t.aborted&&(e?.end(`ok`),D(j,M,N,B)),P===null)return B(),e?.end(`error`),E({ok:!1,messages:x,error:{kind:`model`,error:{type:`error`,error:{type:`IncompleteStream`,message:`Stream ended without a completion signal`}}},usage:S});le(S,ne);let V={kind:`llm`,model:N,request:{messages:b},response:{content:j},usage:ue(ne),finishReason:P};e?.setResult(V),e?.end();let H={role:`assistant`,id:M,model:N,content:j,finishReason:P};if(T(H),K(n,{type:`turn:complete`,message:H,usage:ne}),P!==`function_call`)return E({ok:!0,response:H,messages:x,final:H,usage:S});let U=j.filter(e=>e.type===`tool-call`);if(U.length===0)return E({ok:!0,response:H,messages:x,final:H,usage:S});if(t.aborted)throw l?.end(`ok`),new O(`Stream aborted`,{reason:t.reason,messages:x,usage:S});let re=crypto.randomUUID();K(n,{type:`tool-results:start`,id:re});let ie=0,ae=async(e,t,r)=>{let i=U[ie++],a=R.get(i.id)??-1;K(n,{type:`tool:exec-start`,index:a,id:i.id,name:e,parameters:t});let o={...r,emit:t=>{K(n,{type:`tool:exec-delta`,index:a,id:i.id,name:e,chunk:t})}},c=y.get(e),l=(s?await s(e,t,o):c?{type:`success`,content:await c.execute(t,o)}:null)??ye(e);return K(n,{type:`tool:exec-complete`,index:a,id:i.id,name:e,result:l}),l},oe;try{({results:oe}=await _e(U,ae,t,y,l))}catch(e){throw e instanceof A?(l?.end(`error`),new A(e.message,{toolName:e.toolName,messages:e.messages??x,partial:e.partial??H,usage:e.usage??S,cause:e.cause})):e instanceof O?(l?.end(`ok`),new O(`Stream aborted`,{reason:e.reason,messages:e.messages??x,partial:e.partial,usage:e.usage??S})):e}if(oe.length>0){let e={role:`tool`,id:re,content:oe};T(e),K(n,{type:`tool-results:complete`,message:e})}}}var Ce=class{rootPath;constructor(e){this.rootPath=e}async read(e){let t=u.join(this.rootPath,e);try{return await i.readFile(t,`utf-8`)}catch{return null}}async write(e,t){let n=u.join(this.rootPath,e);await i.mkdir(u.dirname(n),{recursive:!0}),await i.writeFile(n,t,`utf-8`)}};function q(e=new Date){return{start:e.toISOString()}}function J(e,t=new Date){let n=t.toISOString();return e?{...e,end:n}:{start:n,end:n}}var we=class{currentTurn=null;currentTextPart=null;currentThinkingPart=null;toolIdMap=new Map;accumulatedUsage=W();createUserTurn(e){let t=e.id??crypto.randomUUID(),n=[],r=new Date,i=J(q(r),r),a=()=>({...i});if(typeof e.content==`string`)n.push({id:crypto.randomUUID(),type:`text`,text:e.content,timing:a()});else for(let t of e.content)t.type===`text`?n.push({id:crypto.randomUUID(),type:`text`,text:t.text,timing:a()}):t.type===`file`&&n.push({id:crypto.randomUUID(),type:`file`,file:t.file,timing:a()});let o={id:t,owner:`user`,parts:n,status:`complete`,timing:i};return{turn:o,events:[{type:`turn:user`,turn:o}]}}startAgentTurn(){let e=crypto.randomUUID(),t={id:e,owner:`agent`,parts:[],status:`streaming`,timing:q()};return this.currentTurn=t,this.currentTextPart=null,this.currentThinkingPart=null,this.toolIdMap.clear(),this.accumulatedUsage=W(),{turn:t,events:[{type:`turn:start`,turnId:e}]}}handleStreamEvent(e){let t=this.currentTurn;if(!t)return[];let n=[];switch(e.type){case`turn:start`:break;case`text:start`:{this.closeOpenParts(t,n);let e={id:crypto.randomUUID(),type:`text`,text:``,timing:q()};t.parts.push(e),this.currentTextPart=e,n.push({type:`part:start`,turnId:t.id,part:{...e}});break}case`text:delta`:this.currentTextPart&&(this.currentTextPart.text=e.accumulated,n.push({type:`text:delta`,turnId:t.id,partId:this.currentTextPart.id,delta:e.delta}));break;case`text:end`:this.currentTextPart&&=(this.currentTextPart.text=e.final,this.currentTextPart.timing=J(this.currentTextPart.timing),n.push({type:`part:end`,turnId:t.id,partId:this.currentTextPart.id,timing:this.currentTextPart.timing}),null);break;case`thinking:start`:{this.closeOpenParts(t,n);let e={id:crypto.randomUUID(),type:`thinking`,text:``,timing:q()};t.parts.push(e),this.currentThinkingPart=e,n.push({type:`part:start`,turnId:t.id,part:{...e}});break}case`thinking:delta`:this.currentThinkingPart&&(this.currentThinkingPart.text=e.accumulated,n.push({type:`thinking:delta`,turnId:t.id,partId:this.currentThinkingPart.id,delta:e.delta}));break;case`thinking:end`:this.currentThinkingPart&&=(this.currentThinkingPart.text=e.final,this.currentThinkingPart.timing=J(this.currentThinkingPart.timing),n.push({type:`part:end`,turnId:t.id,partId:this.currentThinkingPart.id,timing:this.currentThinkingPart.timing}),null);break;case`tool:request`:{this.closeOpenParts(t,n);let r=crypto.randomUUID(),i={id:r,type:`action`,kind:`tool`,status:`pending`,timing:q(),detail:{name:e.name,parameters:{}}};t.parts.push(i),this.toolIdMap.set(e.id,{partId:r,turnId:t.id}),n.push({type:`part:start`,turnId:t.id,part:{...i,detail:{...i.detail}}});break}case`tool:args-delta`:{let r=this.toolIdMap.get(e.id);if(r){let i=this.findActionPart(t,r.partId);i&&(i.detail.pendingArgs=e.accumulated),n.push({type:`action:args-delta`,turnId:t.id,partId:r.partId,delta:e.delta,accumulated:e.accumulated})}break}case`tool:exec-start`:{let r=this.toolIdMap.get(e.id);if(r){let i=this.findActionPart(t,r.partId);i&&(i.status=`running`,i.detail.parameters=e.parameters,delete i.detail.pendingArgs,n.push({type:`action:running`,turnId:t.id,partId:r.partId,parameters:e.parameters}))}break}case`tool:exec-delta`:{let r=this.toolIdMap.get(e.id);if(r){let i=this.findActionPart(t,r.partId);if(i){let t=i.detail.result?.type===`in-progress`?i.detail.result.content:``;i.detail.result={type:`in-progress`,content:t+e.chunk}}n.push({type:`action:progress`,turnId:t.id,partId:r.partId,chunk:e.chunk})}break}case`tool:exec-complete`:{let r=this.toolIdMap.get(e.id);if(r){let i=this.findActionPart(t,r.partId);i&&(e.result.type===`success`?(i.status=`complete`,i.timing=J(i.timing),i.detail.result={type:`success`,content:e.result.content},n.push({type:`action:complete`,turnId:t.id,partId:r.partId,result:i.detail.result})):(i.status=`error`,i.timing=J(i.timing),i.detail.result={type:`error`,error:e.result.error},n.push({type:`action:error`,turnId:t.id,partId:r.partId,error:e.result.error})))}break}case`provider-tool:start`:{this.closeOpenParts(t,n);let r=crypto.randomUUID(),i={id:r,type:`action`,kind:`provider-tool`,status:`running`,timing:q(),detail:{name:e.name}};t.parts.push(i),this.toolIdMap.set(e.id,{partId:r,turnId:t.id}),n.push({type:`part:start`,turnId:t.id,part:{...i,detail:{...i.detail}}}),n.push({type:`action:running`,turnId:t.id,partId:r});break}case`provider-tool:complete`:{let r=this.toolIdMap.get(e.id);if(r){let i=this.findActionPart(t,r.partId);i&&(i.status=`complete`,i.timing=J(i.timing),i.detail.result={type:`success`,content:e.output},n.push({type:`action:complete`,turnId:t.id,partId:r.partId,result:i.detail.result}))}break}case`turn:complete`:this.closeOpenParts(t,n),le(this.accumulatedUsage,e.usage);break;case`tool-results:start`:case`tool-results:complete`:break;case`error`:{let t=e.error,r=t.kind===`model`?t.error.error.message:t.kind===`tool`?`Tool error (${t.error.name}): ${t.error.message}`:`Parse error: ${t.message}`;n.push({type:`error`,error:{type:t.kind,message:r}});break}}return n}finalizeTurn(e=`complete`){let t=this.currentTurn;if(!t)return[];let n=[];return this.closeOpenParts(t,n),t.status=e,t.usage={...this.accumulatedUsage},t.timing=J(t.timing),n.push({type:`turn:end`,turnId:t.id,status:e,usage:t.usage,timing:t.timing}),this.currentTurn=null,n}closeOpenParts(e,t){this.currentTextPart&&=(this.currentTextPart.timing=J(this.currentTextPart.timing),t.push({type:`part:end`,turnId:e.id,partId:this.currentTextPart.id,timing:this.currentTextPart.timing}),null),this.currentThinkingPart&&=(this.currentThinkingPart.timing=J(this.currentThinkingPart.timing),t.push({type:`part:end`,turnId:e.id,partId:this.currentThinkingPart.id,timing:this.currentThinkingPart.timing}),null)}findActionPart(e,t){return e.parts.find(e=>e.id===t&&e.type===`action`)}};function Te(e){return Array.isArray(e)?e:[e]}function Ee(e){return new Promise(t=>setTimeout(t,e))}function De(e){return e.then(()=>{},()=>{})}function Oe(e,t,n){let r=new AbortController,i=n?AbortSignal.any([n,r.signal]):r.signal,a=e.then(()=>t(i));return{handle:{cancel:e=>r.abort(e),get final(){return a}},settled:De(a)}}var ke=class{_turns=[];_log=[];constructor(e){e?.turns&&(this._turns=e.turns),e?.log&&(this._log=e.log)}get turns(){return[...this._turns]}get log(){return[...this._log]}addTurn(e){this._turns.push(e)}appendToLog(e){Array.isArray(e)?this._log.push(...e):this._log.push(e)}latestTurn(){return this._turns[this._turns.length-1]}toString(){return JSON.stringify({turns:this._turns})}};function Ae(e,t){return{...e,...t,providerOptions:e?.providerOptions||t?.providerOptions?{...e?.providerOptions,...t?.providerOptions}:void 0}}var je=class{provider;model;history;tracer;name;scope;store;fileResolver;requestOptions;registry;system;mcps=[];resolvedMcps=new WeakSet;memory;eventCallbacks=[];sendQueue=Promise.resolve();constructor(e){if(this.provider=e.provider,this.model=e.model,this.history=new ke,this.tracer=e.tracer,this.system=e.system,this.name=e.name,this.scope=e.scope,this.store=new Ce(`.axle`),this.fileResolver=e.fileResolver,this.requestOptions={reasoning:e.reasoning,maxOutputTokens:e.maxOutputTokens,temperature:e.temperature,topP:e.topP,stop:e.stop,toolChoice:e.toolChoice,parallelToolCalls:e.parallelToolCalls,providerOptions:e.providerOptions},this.registry=new pe({tools:e.tools,providerTools:e.providerTools}),e.mcps&&(this.mcps=[...e.mcps]),e.memory){if(!e.name)throw new D(`Agent requires a 'name' when memory is provided. The name is used to partition memory storage.`);this.memory=e.memory;let t=e.memory.tools?.();t&&this.registry.add(t)}}addMcp(e){this.mcps.push(e)}addMcps(e){this.mcps.push(...e)}hasTools(){return this.registry.size>0||this.mcps.length>0}on(e){this.eventCallbacks.push(e)}context(){return te({system:this.system,messages:this.history.log,tools:this.toToolDefinitions(this.registry.local()),providerTools:this.registry.provider(),mcpTools:this.toToolDefinitions(this.registry.mcp())})}send(e,t){let n=se(e),r=Ae(this.requestOptions,t),{handle:i,settled:a}=Oe(this.sendQueue,e=>this.run(n,e,t?.fileResolver,r),t?.signal);return this.sendQueue=a,i}async resolveMcpTools(e){for(let t of this.mcps){if(this.resolvedMcps.has(t))continue;let n=await t.listTools({prefix:t.name,tracer:this.tracer,signal:e});this.registry.addMcp(n),this.resolvedMcps.add(t)}}emitEvent(e){for(let t of this.eventCallbacks)t(e)}toToolDefinitions(e){return e.map(e=>({name:e.name,description:e.description,schema:e.schema}))}async run(e,t,n,r){let i=new we,a=W();if(t.aborted)throw new k(`Agent send aborted`,{reason:t.reason,usage:a});try{await this.resolveMcpTools(t)}catch(e){throw t.aborted||e instanceof O||e instanceof Error&&e.name===`AbortError`?new k(`Agent send aborted`,{reason:e instanceof O?e.reason:t.reason,usage:a}):e}let o=this.system,s=[...this.history.log,e.message];if(this.memory){let e=await this.memory.recall({name:this.name,scope:this.scope,system:this.system,messages:s,store:this.store,tracer:this.tracer});e.systemSuffix&&(o=(o??``)+`
4
+
5
+ `+e.systemSuffix)}if(t.aborted)throw new k(`Agent send aborted`,{reason:t.reason,usage:a});let{turn:c,events:l}=i.createUserTurn(e.message);this.history.addTurn(c),this.history.appendToLog(e.message);for(let e of l)this.emitEvent(e);let{turn:u,events:d}=i.startAgentTurn();this.history.addTurn(u);for(let e of d)this.emitEvent(e);let{signal:f,...p}=r??{},m=xe({provider:this.provider,model:this.model,messages:s,system:o,registry:this.registry,tracer:this.tracer,fileResolver:n??this.fileResolver,...p,signal:t,onToolCall:async(e,t,n)=>{let r=this.registry.get(e);if(!r)return null;try{return{type:`success`,content:await r.execute(t,n)}}catch(e){if(e instanceof A)throw e;return{type:`error`,error:{type:`execution`,message:e instanceof Error?e.message:String(e)}}}}});m.on(e=>{let t=i.handleStreamEvent(e);for(let e of t)this.emitEvent(e)});let h;try{h=await m.final}catch(e){if(e instanceof A){e.messages&&e.messages.length>0&&this.history.appendToLog(e.messages);let t=i.finalizeTurn(`error`);for(let e of t)this.emitEvent(e);throw new A(e.message,{toolName:e.toolName,messages:e.messages,partial:e.partial,usage:e.usage??a,cause:e.cause})}if(e instanceof O){e.messages&&e.messages.length>0&&this.history.appendToLog(e.messages);let t=i.finalizeTurn(`cancelled`);for(let e of t)this.emitEvent(e);throw new k(`Agent send aborted`,{reason:e.reason,messages:e.messages,partial:e.partial,turn:u,usage:e.usage??a})}throw e}let g=h.ok?`complete`:`error`;h.messages.length>0&&this.history.appendToLog(h.messages);let _=i.finalizeTurn(g);for(let e of _)this.emitEvent(e);let v=h.usage??a;if(!h.ok)return{ok:!1,error:h.error,turn:u,usage:v};let y;try{y=e.parse(h.final)}catch(e){return{ok:!1,error:{kind:`parse`,error:e,message:e instanceof Error?e.message:String(e)},turn:u,usage:v}}if(this.memory)try{await this.memory.record({name:this.name,scope:this.scope,system:this.system,messages:this.history.log,newMessages:h.messages,store:this.store,tracer:this.tracer})}catch(e){this.tracer?.warn(`memory record failed`,{error:e instanceof Error?e.message:String(e)})}return{ok:!0,response:y,turn:u,usage:v}}},Me=class e extends D{missingVariables;constructor(t){super(Ne(t),{code:`INSTRUCT_VARIABLE_ERROR`,details:{missingVariables:t}}),this.missingVariables=t,Object.setPrototypeOf(this,e.prototype)}toJSON(){return{...super.toJSON(),missingVariables:this.missingVariables}}};function Ne(e){return`Missing variable${e.length>1?`s`:``}: ${e.join(`, `)}`}var Pe=class e extends Error{missingVariables;constructor(t){super(Ie(t)),this.name=`MissingVariablesError`,this.missingVariables=t,Object.setPrototypeOf(this,e.prototype)}};function Fe(e,t,n={}){let{placeholderStyle:r=`{{}}`,strict:i=!0}=n,a=r===`{{}}`?/\{\{(.*?)\}\}/g:/\{(.*?)\}/g,o=[];if(e=e.replace(a,(e,n)=>{if(n=n.trim(),Object.prototype.hasOwnProperty.call(t,n)){let e=t[n];return e==null?``:String(e)}return o.push(n),e}),o.length>0){let e=[...new Set(o)];if(i)throw new Pe(e)}return e}function Ie(e){return`Missing variable${e.length>1?`s`:``}: ${e.join(`, `)}`}var Le=class e{prompt;inputs={};files=[];textReferences=[];vars;schema;constructor(e){this.prompt=e.prompt,this.schema=e.schema,this.vars=e.vars??`required`}clone(){let t=new e({prompt:this.prompt,schema:this.schema,vars:this.vars});return t.inputs={...this.inputs},t.files=[...this.files],t.textReferences=this.textReferences.map(e=>({...e})),t}withInputs(e){let t=this.clone();return t.inputs={...t.inputs,...e},t}withInput(e,t){return this.withInputs({[e]:t})}setInputs(e){this.inputs={...e}}addInput(e,t){this.inputs[e]=t}addFile(e,t){if(typeof e==`string`){this.textReferences.push({content:e,name:t?.name});return}if(e.kind===`text`&&e.source.type===`text`){this.textReferences.push({content:e.source.content,name:t?.name??e.name});return}this.files.push(t?.name?{...e,name:t.name}:e)}hasFiles(){return this.files.length>0}render(e={}){let t;try{t=Fe(this.prompt,this.inputs,{strict:(e.vars??this.vars)===`required`})}catch(e){throw e instanceof Pe?new Me(e.missingVariables):e}if(this.textReferences.length>0)for(let[e,n]of this.textReferences.entries()){let r=n.name?`: ${n.name}`:``;t+=`\n\n## Reference ${e+1}${r}\n\n\`\`\`${n.content}'''`}if(!this.schema)return t;let n=`# Output Format Instructions
6
+
7
+ Return only valid JSON matching this schema. Do not wrap it in markdown. Do not include prose before or after the JSON.
8
+ `,[,r]=U(this.schema);for(let[e,t]of re(this.schema))n+=`\n- ${e}: ${t}`;return n+=`\n\nExample:\n${JSON.stringify(r,null,2)}\n\n`,n+t}};function Y(e,t=`Operation aborted`){if(e?.aborted)throw new O(t,{reason:e.reason})}function X(e,t,n=`Operation aborted`){return t?t.aborted?Promise.reject(new O(n,{reason:t.reason})):new Promise((r,i)=>{let a=()=>{t.removeEventListener(`abort`,a),i(new O(n,{reason:t.reason}))};t.addEventListener(`abort`,a,{once:!0}),e.then(e=>{t.removeEventListener(`abort`,a),r(e)},e=>{t.removeEventListener(`abort`,a),i(e)})}):e}function Re(e,t,n=`[redacted]`){return ze(e,null,t,n)}function ze(e,t,n,r){if(typeof e!=`object`||!e)return typeof e==`string`&&t&&n.has(t)?r:e;if(Array.isArray(e))return e.map(e=>ze(e,t,n,r));let i={};for(let[t,a]of Object.entries(e))i[t]=ze(a,t,n,r);return i}const Be=new Set([`data`,`file_data`,`file_url`,`image_url`,`url`,`uri`,`fileUri`]);function Z(e){return Re(e,Be,`[redacted-file-value]`)}function Ve(e){if(e==null)return{type:`error`,error:{type:`Undetermined`,message:`Unknown error occurred`},usage:{in:0,out:0},raw:e};if(e instanceof Error)return{type:`error`,error:{type:e.name||`Error`,message:e.message||`Unexpected error`},usage:{in:0,out:0},raw:e};if(typeof e==`object`){let t=e,n=t?.error?.error?.type||t?.error?.type||t?.type||t?.code||t?.status||`Undetermined`,r=t?.error?.error?.message||t?.error?.message||t?.message||t?.error||`Unexpected error`;return{type:`error`,error:{type:String(n),message:String(r)},usage:{in:0,out:0},raw:e}}return{type:`error`,error:{type:`Undetermined`,message:String(e)},usage:{in:0,out:0},raw:e}}async function He(e,t){let{defaults:n,tag:r}=t,i=null,a=``;if(e)try{a=p(e),i=await s(a,{encoding:`utf-8`})}catch{throw Error(`${r} not found, see --help for details`)}else{for(let e of n.formats)try{a=p(n.name+`.`+e),i=await s(a,{encoding:`utf-8`});break}catch{continue}if(i===null)throw Error(`${r} not found, see --help for details`)}return{content:i,format:a.split(`.`).pop()??``,path:a}}const Ue=20*1024*1024;async function Q(e,t){if(t.signal?.aborted)throw new DOMException(`File resolution aborted`,`AbortError`);let{source:n}=e;if(n.type===`base64`)return We({type:`base64`,data:n.data},e,t);if(n.type===`text`)return We({type:`text`,content:n.content},e,t);if(n.type===`url`)return We({type:`url`,url:n.url},e,t);if(!t.resolver)throw Error(`No fileResolver configured for deferred file: ${e.name}`);return We(await t.resolver({file:e,ref:n.ref,provider:t.provider,model:t.model,accepted:t.accepted,signal:t.signal}),e,t)}function We(e,t,n){if(n.accepted.includes(e.type))return{...e,mimeType:e.mimeType??t.mimeType,name:e.name??t.name};throw Error(`File source '${e.type}' is not supported for ${n.provider} ${t.kind} file '${t.name}'. Accepted: ${n.accepted.join(`, `)}`)}const Ge=new Set([`application/json`,`application/xml`,`application/yaml`,`application/x-yaml`,`application/toml`]);function Ke(e){return e.startsWith(`text/`)||Ge.has(e)}function qe(e){let t=h.getType(e);if(!t){let t=f(e).toLowerCase();throw Error(`Unsupported file type: ${t||`(no extension)`}`)}if(t.startsWith(`image/`))return{kind:`image`,mimeType:t};if(t===`application/pdf`)return{kind:`document`,mimeType:t};if(Ke(t))return{kind:`text`,mimeType:t};{let n=f(e).toLowerCase();throw Error(`Unsupported file type: ${n} (${t})`)}}async function Je(e,t){let n=p(e);try{await a(n)}catch{throw Error(`File not found: ${e}`)}let r=await c(n);if(r.size>Ue)throw Error(`File too large: ${r.size} bytes. Maximum allowed: ${Ue} bytes`);let i=n.split(`/`).pop()||``,o=qe(n);if((t||(o.kind===`text`?`utf-8`:`base64`))===`utf-8`){if(o.kind!==`text`)throw Error(`Cannot read ${o.kind} file as text: ${e}`);let t=await s(n,`utf-8`);return{kind:`text`,mimeType:o.mimeType,size:r.size,name:i,source:{type:`text`,content:t}}}else{if(o.kind===`text`)throw Error(`Cannot read text file as binary: ${e}`);let t=(await s(n)).toString(`base64`);return{kind:o.kind,mimeType:o.mimeType,size:r.size,name:i,source:{type:`base64`,data:t}}}}async function Ye(e,t={model:``}){return Promise.all(e.map(e=>Xe(e,t)))}async function Xe(e,t){if(e.role===`assistant`){let t=[];for(let n of e.content)n.type===`text`?t.push({type:`text`,text:n.text}):n.type===`thinking`?n.redacted?t.push({type:`redacted_thinking`,data:n.text}):n.signature&&t.push({type:`thinking`,thinking:n.text,signature:n.signature}):n.type===`tool-call`?t.push({type:`tool_use`,id:n.id,name:n.name,input:n.parameters}):n.type===`provider-tool`&&(t.push({type:`server_tool_use`,id:n.id,name:n.name,input:n.input??{}}),n.output!=null&&t.push({type:`web_search_tool_result`,tool_use_id:n.id,content:n.output}));return{role:`assistant`,content:t}}if(e.role===`tool`)return{role:`user`,content:await Promise.all(e.content.map(async e=>({type:`tool_result`,tool_use_id:e.id,content:typeof e.content==`string`?e.content:await lt(e.content,t),...e.isError?{is_error:!0}:{}})))};if(typeof e.content==`string`)return{role:`user`,content:e.content};{let n=[];for(let r of e.content)r.type===`text`?n.push({type:`text`,text:r.text}):r.type===`file`&&n.push(await Ze(r.file,t,`user-message`));return{role:`user`,content:n}}}async function Ze(e,t,n){if(e.kind===`image`)return{type:`image`,source:$e(await Q(e,{provider:`anthropic`,model:t.model,accepted:[`url`,`base64`],purpose:n,resolver:t.fileResolver,signal:t.signal}),e)};if(e.kind===`document`){if(e.mimeType!==`application/pdf`)throw Error(`Anthropic only supports PDF document files. Received ${e.mimeType}`);let r=await Q(e,{provider:`anthropic`,model:t.model,accepted:[`url`,`base64`],purpose:n,resolver:t.fileResolver,signal:t.signal});return{type:`document`,source:et(r),title:r.name??e.name}}let r=await Q(e,{provider:`anthropic`,model:t.model,accepted:[`text`],purpose:n,resolver:t.fileResolver,signal:t.signal});if(r.type!==`text`)throw Error(`Unsupported Anthropic text source: ${r.type}`);return n===`tool-result`?{type:`text`,text:r.content}:{type:`document`,source:{type:`text`,media_type:`text/plain`,data:r.content},title:r.name??e.name}}function Qe(e){if(e===`image/jpeg`||e===`image/png`||e===`image/gif`||e===`image/webp`)return e;throw Error(`Anthropic does not support image MIME type: ${e}. Supported types: image/jpeg, image/png, image/gif, image/webp.`)}function $e(e,t){if(e.type===`url`)return{type:`url`,url:e.url};if(e.type===`base64`)return{type:`base64`,media_type:Qe(e.mimeType??t.mimeType),data:e.data};throw Error(`Unsupported Anthropic image source: ${e.type}`)}function et(e){if(e.type===`url`)return{type:`url`,url:e.url};if(e.type===`base64`)return{type:`base64`,media_type:`application/pdf`,data:e.data};throw Error(`Unsupported Anthropic PDF source: ${e.type}`)}function tt(e){return e===!0?{thinking:{type:`enabled`,budget_tokens:8192}}:{}}function nt(e){return e.map(e=>{let t=n.toJSONSchema(e.schema);if(!ct(t))throw Error(`Schema for tool ${e.name} must be an object type`);return{name:e.name,description:e.description,input_schema:t}})}const rt={web_search:`web_search_20250305`};function it(e){return(e??[]).map(e=>({type:rt[e.name]??e.name,name:e.name,...e.config}))}function at(e,t,n,r){if(e===void 0&&t!==!1)return{};let i=t===!1?{disable_parallel_tool_use:!0}:{};if(e===void 0||e===`auto`)return{tool_choice:{type:`auto`,...i}};if(e===`required`)return{tool_choice:{type:`any`,...i}};if(e===`none`)return{tool_choice:{type:`none`}};if(!(n?.some(t=>t.name===e.name)||r?.some(t=>t.name===e.name)))throw Error(`Tool choice references an unavailable tool: ${e.name}`);return{tool_choice:{type:`tool`,name:e.name,...i}}}function ot(e){let t=[];for(let n of e)if(n.type===`text`)t.push({type:`text`,text:n.text});else if(n.type===`thinking`)t.push({type:`thinking`,text:n.text||``,redacted:!1});else if(n.type===`redacted_thinking`)t.push({type:`thinking`,text:n.text||``,redacted:!0});else if(n.type===`tool_use`){if(typeof n.input!=`object`||n.input===null||Array.isArray(n.input))throw Error(`Invalid tool call input for ${n.name}: expected object, got ${typeof n.input}`);t.push({type:`tool-call`,id:n.id,name:n.name,parameters:n.input})}return t}function st(e){switch(e){case`max_tokens`:return`length`;case`end_turn`:return`stop`;case`stop_sequence`:return`stop`;case`tool_use`:return`function_call`;default:return`error`}}function ct(e){return e&&typeof e==`object`&&e.type===`object`}async function lt(e,t){return Promise.all(e.map(async e=>e.type===`text`?{type:`text`,text:e.text}:Ze(e.file,t,`tool-result`)))}async function ut(e){let{client:t,model:n,messages:r,system:i,tools:a,providerTools:o,runtime:s,reasoning:c,maxOutputTokens:l,temperature:u,topP:d,stop:f,toolChoice:p,parallelToolCalls:m,providerOptions:h,signal:g}=e,_=s?.tracer,v;try{Y(g,`Generate aborted`);let e=await Ye(r,{model:n,fileResolver:s?.fileResolver,signal:g}),y={model:n,max_tokens:l??16e3,messages:e,...i&&{system:i},...f&&{stop_sequences:Te(f)},...(a||o)&&{tools:[...a?nt(a):[],...it(o)]},...tt(c),...u===void 0?{}:{temperature:u},...d===void 0?{}:{top_p:d},...at(p,m,a,o),...h};_?.debug(`Anthropic request`,{request:Z(y)});let b=await X(t.messages.create(y,...g?[{signal:g}]:[]),g,`Generate aborted`);Y(g,`Generate aborted`),v=dt(b)}catch(e){Y(g,`Generate aborted`),v=Ve(e)}return _?.debug(`Anthropic response`,{result:v}),v}function dt(e){let t=st(e.stop_reason);if(t===`error`)return{type:`error`,error:{type:`Uncaught error`,message:`Stop reason is not recognized or unhandled: ${e.stop_reason}`},usage:pt(e.usage),raw:e};if(t===`function_call`){let t=ot(e.content);return{type:`success`,id:e.id,model:e.model,role:e.role,finishReason:`function_call`,content:t,text:V(t),usage:pt(e.usage),raw:e}}if(e.type==`message`){let n=ot(e.content);return{type:`success`,id:e.id,model:e.model,role:`assistant`,finishReason:t,content:n,text:V(n),usage:pt(e.usage),raw:e}}return{type:`error`,error:{type:`InvalidResponse`,message:`Unsupported completion type: ${e.type}`},usage:pt(e.usage),raw:e}}function ft(e){return e.input_tokens+(e.cache_creation_input_tokens??0)+(e.cache_read_input_tokens??0)}function pt(e){return G({in:ft(e),out:e.output_tokens},{cachedIn:e.cache_read_input_tokens??void 0,cacheWriteIn:e.cache_creation_input_tokens??void 0})}function mt(){let e=new Map,t=new Map,n=0,r=0,i=0,a=0,o=new Map;function s(s){let c=[];switch(s.type){case`message_start`:n=(s.message.usage?.input_tokens??0)+(s.message.usage?.cache_creation_input_tokens??0)+(s.message.usage?.cache_read_input_tokens??0),a=s.message.usage?.cache_creation_input_tokens??0,i=s.message.usage?.cache_read_input_tokens??0,c.push({type:`start`,id:s.message.id,data:{model:s.message.model,timestamp:Date.now()}});break;case`message_delta`:s.usage&&(r=s.usage.output_tokens??r,s.usage.input_tokens!=null&&(n=s.usage.input_tokens+(s.usage.cache_creation_input_tokens??a)+(s.usage.cache_read_input_tokens??i)),a=s.usage.cache_creation_input_tokens??a,i=s.usage.cache_read_input_tokens??i),s.delta.stop_reason&&c.push({type:`complete`,data:{finishReason:st(s.delta.stop_reason),usage:G({in:n,out:r},{cachedIn:i,cacheWriteIn:a})}});case`message_stop`:break;case`content_block_start`:if(s.content_block.type===`text`)e.set(s.index,`text`),c.push({type:`text-start`,data:{index:s.index}});else if(s.content_block.type===`tool_use`){e.set(s.index,`tool`);let t=s.content_block;o.set(s.index,{id:t.id,name:t.name,argumentsBuffer:``}),c.push({type:`tool-call-start`,data:{index:s.index,id:t.id,name:t.name}})}else if(s.content_block.type===`thinking`)e.set(s.index,`thinking`),c.push({type:`thinking-start`,data:{index:s.index,redacted:!1}});else if(s.content_block.type===`redacted_thinking`)e.set(s.index,`thinking`),c.push({type:`thinking-start`,data:{index:s.index,redacted:!0}});else if(s.content_block.type===`server_tool_use`){e.set(s.index,`provider-tool`);let n=s.content_block;t.set(n.id,{index:s.index,name:n.name}),c.push({type:`provider-tool-start`,data:{index:s.index,id:n.id,name:n.name}})}else if(s.content_block.type===`web_search_tool_result`){let e=s.content_block,n=t.get(e.tool_use_id);n&&(c.push({type:`provider-tool-complete`,data:{index:n.index,id:e.tool_use_id,name:n.name,output:e.content}}),t.delete(e.tool_use_id))}break;case`content_block_delta`:if(s.delta.type===`text_delta`)c.push({type:`text-delta`,data:{text:s.delta.text,index:s.index}});else if(s.delta.type===`input_json_delta`){let e=o.get(s.index);e&&(e.argumentsBuffer+=s.delta.partial_json,c.push({type:`tool-call-args-delta`,data:{index:s.index,id:e.id,name:e.name,delta:s.delta.partial_json,accumulated:e.argumentsBuffer}}))}else s.delta.type===`thinking_delta`?c.push({type:`thinking-delta`,data:{text:s.delta.thinking,index:s.index}}):s.delta.type===`signature_delta`||s.delta.type;break;case`content_block_stop`:{let t=e.get(s.index);if(t===`text`)c.push({type:`text-complete`,data:{index:s.index}});else if(t===`thinking`)c.push({type:`thinking-complete`,data:{index:s.index}});else if(t!==`provider-tool`&&t===`tool`){let e=o.get(s.index);if(e){try{let t=e.argumentsBuffer?JSON.parse(e.argumentsBuffer):{};c.push({type:`tool-call-complete`,data:{index:s.index,id:e.id,name:e.name,arguments:t}})}catch(t){throw Error(`Failed to parse tool call arguments for ${e.name}: ${t instanceof Error?t.message:String(t)}\nRaw buffer: ${e.argumentsBuffer}`)}o.delete(s.index)}}e.delete(s.index);break}}return c}return{handleEvent:s}}async function*ht(e){let{client:t,model:n,messages:r,system:i,tools:a,providerTools:o,runtime:s,signal:c,reasoning:l,maxOutputTokens:u,temperature:d,topP:f,stop:p,toolChoice:m,parallelToolCalls:h,providerOptions:g}=e,_=s?.tracer,v=[...a?nt(a):[],...it(o)],y=mt();try{let e=await Ye(r,{model:n,fileResolver:s?.fileResolver,signal:c}),b={model:n,max_tokens:u??gt(n),messages:e,...i&&{system:i},...p&&{stop_sequences:Te(p)},...v.length>0&&{tools:v},...tt(l),...d===void 0?{}:{temperature:d},...f===void 0?{}:{top_p:f},...at(m,h,a,o),...g};_?.debug(`Anthropic streaming request`,{request:Z(b)});let x=await t.messages.create({...b,stream:!0},{signal:c});for await(let e of x){let t=y.handleEvent(e);for(let e of t)yield e}}catch(e){if(c?.aborted)return;yield{type:`error`,data:{type:`STREAMING_ERROR`,message:e instanceof Error?e.message:String(e),raw:e}}}}function gt(t){return t in e?e[t]:t.includes(`opus`)?t.match(/opus-4-[6-9]|opus-[5-9]/)?128e3:64e3:t.includes(`sonnet`)||t.includes(`haiku`)?t.match(/claude-3-[0-5]-/)?8192:64e3:16384}function _t(e){let t=new m({apiKey:e});return{name:`anthropic`,async createGenerationRequest(e,n){return await ut({client:t,model:e,...n})},createStreamingRequest(e,n){return ht({client:t,model:e,...n})}}}async function vt(e,t,n={model:``}){let r=(await Promise.all(e.map(e=>wt(e,n)))).flat(1);return t?[{role:`system`,content:t},...r]:r}function yt(e){return e===!0?{reasoning_effort:`high`}:e===!1?{reasoning_effort:`none`}:{}}function bt(e){return G({in:e?.prompt_tokens||0,out:e?.completion_tokens||0},{cachedIn:e?.prompt_tokens_details?.cached_tokens??e?.input_tokens_details?.cached_tokens,cacheWriteIn:e?.prompt_tokens_details?.cache_write_tokens??e?.prompt_tokens_details?.cache_creation_tokens??e?.input_tokens_details?.cache_write_tokens??e?.input_tokens_details?.cache_creation_tokens,reasoningOut:e?.completion_tokens_details?.reasoning_tokens??e?.output_tokens_details?.reasoning_tokens})}function xt(e){if(e&&e.length>0)return e.map(e=>({type:`function`,function:{name:e.name,description:e.description,parameters:n.toJSONSchema(e.schema)}}))}function St(e,t,n){if(e===void 0)return{};if(e===`auto`||e===`none`||e===`required`)return{tool_choice:e};if(t?.some(t=>t.name===e.name))return{tool_choice:{type:`function`,function:{name:e.name}}};throw n?.some(t=>t.name===e.name)?Error(`ChatCompletions does not support provider tool choice: ${e.name}`):Error(`Tool choice references an unavailable tool: ${e.name}`)}function Ct(e){switch(e){case`stop`:return`stop`;case`length`:return`length`;case`tool_calls`:case`function_call`:return`function_call`;case`content_filter`:return`error`;default:return`stop`}}async function wt(e,t){switch(e.role){case`tool`:return Tt(e,t);case`assistant`:return Et(e);default:return Dt(e,t)}}async function Tt(e,t){return Promise.all(e.content.map(async e=>({role:`tool`,content:typeof e.content==`string`?e.content:await kt(e.content,t),tool_call_id:e.id})))}function Et(e){let t=e.content.filter(e=>e.type===`tool-call`),n=e.content.filter(e=>e.type===`text`),r=t.length>0?t.map(e=>({type:`function`,id:e.id,function:{name:e.name,arguments:JSON.stringify(e.parameters)}})):void 0;return{role:`assistant`,content:n.map(e=>e.text).join(``),...r&&{tool_calls:r}}}async function Dt(e,t){if(typeof e.content==`string`)return{role:`user`,content:e.content};let n=(await Promise.all(e.content.map(e=>Ot(e,t)))).filter(e=>e!==null);return n.every(e=>e.type===`text`)?{role:`user`,content:n.map(e=>e.text).join(``)}:{role:`user`,content:n}}async function Ot(e,t){return e.type===`text`?{type:`text`,text:e.text}:e.type===`file`?At(e.file,t,`user-message`):null}async function kt(e,t){let n=[];for(let r of e){if(r.type===`text`){n.push(r.text);continue}if(r.file.kind===`text`){let e=await Q(r.file,{provider:`chatcompletions`,model:t.model,accepted:[`text`],purpose:`tool-result`,resolver:t.fileResolver,signal:t.signal});if(e.type!==`text`)throw Error(`Unsupported ChatCompletions text source: ${e.type}`);n.push(Nt(r.file,e.content,e.name,e.mimeType));continue}throw Error(`ChatCompletions tool results do not support file parts other than text`)}return n.join(`
9
+ `)}async function At(e,t,n){if(e.kind===`text`){let r=await Q(e,{provider:`chatcompletions`,model:t.model,accepted:[`text`],purpose:n,resolver:t.fileResolver,signal:t.signal});if(r.type!==`text`)throw Error(`Unsupported ChatCompletions text source: ${r.type}`);return{type:`text`,text:Nt(e,r.content,r.name,r.mimeType)}}if(e.kind===`document`){if(e.mimeType!==`application/pdf`)throw Error(`ChatCompletions document file inputs currently support PDF only. Received ${e.mimeType}`);let r=await Q(e,{provider:`chatcompletions`,model:t.model,accepted:[`url`,`base64`],purpose:n,resolver:t.fileResolver,signal:t.signal});return{type:`file`,file:{filename:r.name??e.name,file_data:Mt(r,e)}}}return{type:`image_url`,image_url:{url:jt(await Q(e,{provider:`chatcompletions`,model:t.model,accepted:[`url`,`base64`],purpose:n,resolver:t.fileResolver,signal:t.signal}),e)}}}function jt(e,t){if(e.type===`url`)return e.url;if(e.type===`base64`)return`data:${e.mimeType??t.mimeType};base64,${e.data}`;throw Error(`Unsupported ChatCompletions image source: ${e.type}`)}function Mt(e,t){if(e.type===`url`)return e.url;if(e.type===`base64`)return`data:${e.mimeType??t.mimeType};base64,${e.data}`;throw Error(`Unsupported ChatCompletions file source: ${e.type}`)}function Nt(e,t,n,r){return`File: ${n??e.name}\nMIME type: ${r??e.mimeType}\n\n${t}`}async function Pt(e){let{baseUrl:t,model:n,messages:r,system:i,tools:a,providerTools:o,runtime:s,apiKey:c,reasoning:l,maxOutputTokens:u,temperature:d,topP:f,stop:p,toolChoice:m,parallelToolCalls:h,providerOptions:g,signal:_}=e,v=s?.tracer,y;try{Y(_,`Generate aborted`);let e=await vt(r,i,{model:n,fileResolver:s?.fileResolver,signal:_}),b=xt(a);o&&o.length>0&&v?.warn(`providerTools not supported by ChatCompletions provider`);let x={model:n,messages:e,...b&&{tools:b},...yt(l),...u===void 0?{}:{max_tokens:u},...d===void 0?{}:{temperature:d},...f===void 0?{}:{top_p:f},...p===void 0?{}:{stop:p},...St(m,a,o),...h===void 0?{}:{parallel_tool_calls:h},...g};v?.debug(`ChatCompletions request`,{request:Z(x)});let S={"Content-Type":`application/json`};c&&(S.Authorization=`Bearer ${c}`);let C=await X(fetch(`${t}/chat/completions`,{method:`POST`,headers:S,body:JSON.stringify(x),signal:_}),_,`Generate aborted`);if(!C.ok){let e=await C.text().catch(()=>``);throw Error(`HTTP error! status: ${C.status}${e?` - ${e}`:``}`)}let w=await X(C.json(),_,`Generate aborted`);Y(_,`Generate aborted`),y=Ft(w)}catch(e){Y(_,`Generate aborted`),v?.error(`Error fetching ChatCompletions response`,{error:e instanceof Error?e.message:String(e)}),y=Ve(e)}return v?.debug(`ChatCompletions response`,{result:y}),y}function Ft(e){let t=e.choices?.[0];if(!t)return{type:`error`,error:{type:`ChatCompletionsError`,message:`No choices in response`},usage:{in:0,out:0},raw:e};let n=[],r=t.message.reasoning_content??t.message.reasoning;if(r&&n.push({type:`thinking`,text:r}),t.message.content&&n.push({type:`text`,text:t.message.content}),t.message.tool_calls)for(let e of t.message.tool_calls){let t;try{t=JSON.parse(e.function.arguments)}catch(t){throw Error(`Invalid tool call arguments for ${e.function.name}: ${t instanceof Error?t.message:String(t)}`)}if(typeof t!=`object`||!t||Array.isArray(t))throw Error(`Invalid tool call arguments for ${e.function.name}: expected object, got ${typeof t}`);n.push({type:`tool-call`,id:e.id,name:e.function.name,parameters:t})}let i=n.some(e=>e.type===`tool-call`)?Ct(`tool_calls`):Ct(t.finish_reason);return{type:`success`,id:e.id,model:e.model,role:`assistant`,finishReason:i,content:n,text:V(n),usage:bt(e.usage),raw:e}}function It(){let e=new Map,t=0,n=-1,r=``,i=``,a=null,o,s;function c(e){n<0||(a===`text`?e.push({type:`text-complete`,data:{index:n}}):a===`thinking`&&e.push({type:`thinking-complete`,data:{index:n}}),a=null,n=-1)}function l(l){let u=[];l.usage&&(s=bt(l.usage));let d=l.choices?.[0];if(!d)return u;r||(r=l.id,i=l.model,u.push({type:`start`,id:r,data:{model:i,timestamp:Date.now()}}));let f=d.delta,p=f.reasoning_content??f.reasoning;if(p&&(a!==`thinking`&&(c(u),n=t++,a=`thinking`,u.push({type:`thinking-start`,data:{index:n}})),u.push({type:`thinking-delta`,data:{index:n,text:p}})),f.content&&(a!==`text`&&(c(u),n=t++,a=`text`,u.push({type:`text-start`,data:{index:n}})),u.push({type:`text-delta`,data:{text:f.content,index:n}})),f.tool_calls){c(u);for(let n of f.tool_calls){let r=n.index;if(!e.has(r)){let i=t++,a=n.id||`tool-${i}`;e.set(r,{id:a,name:n.function?.name||``,argumentsBuffer:``,partIdx:i}),u.push({type:`tool-call-start`,data:{index:i,id:a,name:n.function?.name||``}})}let i=e.get(r);n.id&&(i.id=n.id),n.function?.name&&(i.name=n.function.name),n.function?.arguments&&(i.argumentsBuffer+=n.function.arguments,u.push({type:`tool-call-args-delta`,data:{index:i.partIdx,id:i.id,name:i.name,delta:n.function.arguments,accumulated:i.argumentsBuffer}}))}}if(d.finish_reason){c(u);for(let[,t]of e)try{let e=t.argumentsBuffer?JSON.parse(t.argumentsBuffer):{};u.push({type:`tool-call-complete`,data:{index:t.partIdx,id:t.id,name:t.name,arguments:e}})}catch(e){throw Error(`Failed to parse tool call arguments for ${t.name}: ${e instanceof Error?e.message:String(e)}\nRaw buffer: ${t.argumentsBuffer}`)}o=Ct(d.finish_reason)}return u}function u(){return o===void 0?[]:[{type:`complete`,data:{finishReason:o,usage:s??{in:0,out:0}}}]}return{handleChunk:l,finalize:u}}async function*Lt(e){let{baseUrl:t,model:n,messages:r,system:i,tools:a,providerTools:o,runtime:s,signal:c,apiKey:l,reasoning:u,maxOutputTokens:d,temperature:f,topP:p,stop:m,toolChoice:h,parallelToolCalls:g,providerOptions:_}=e,v=s?.tracer;o&&o.length>0&&v?.warn(`providerTools not supported by ChatCompletions provider`);let y=It();try{let e=await vt(r,i,{model:n,fileResolver:s?.fileResolver,signal:c}),b=xt(a),x={model:n,messages:e,stream:!0,stream_options:{include_usage:!0},...b&&{tools:b},...yt(u),...d===void 0?{}:{max_tokens:d},...f===void 0?{}:{temperature:f},...p===void 0?{}:{top_p:p},...m===void 0?{}:{stop:m},...St(h,a,o),...g===void 0?{}:{parallel_tool_calls:g},..._};v?.debug(`ChatCompletions streaming request`,{request:Z(x)});let S={"Content-Type":`application/json`};l&&(S.Authorization=`Bearer ${l}`);let C=await fetch(`${t}/chat/completions`,{method:`POST`,headers:S,body:JSON.stringify(x),signal:c});if(!C.ok){let e=await C.text().catch(()=>``);throw Error(`HTTP error! status: ${C.status}${e?` - ${e}`:``}`)}if(!C.body)throw Error(`Response body is null`);let w=C.body.getReader(),T=new TextDecoder,E=``;for(;;){let{done:e,value:t}=await w.read();if(e)break;E+=T.decode(t,{stream:!0});let n=E.split(`
10
+ `);E=n.pop()||``;for(let e of n){let t=e.trim();if(!t||t.startsWith(`:`)||!t.startsWith(`data: `))continue;let n=t.slice(6);if(n!==`[DONE]`)try{let e=JSON.parse(n),t=y.handleChunk(e);for(let e of t)yield e}catch(e){v?.error(`Error parsing ChatCompletions stream chunk`,{error:e instanceof Error?e.message:String(e),line:t})}}}for(let e of y.finalize())yield e}catch(e){if(c?.aborted)return;v?.error(`Error in ChatCompletions streaming request`,{error:e instanceof Error?e.message:String(e)}),yield{type:`error`,data:{type:`STREAMING_ERROR`,message:e instanceof Error?e.message:String(e),raw:e}}}}function Rt(e,t){return{name:`ChatCompletions`,async createGenerationRequest(n,r){return await Pt({baseUrl:e,model:n,apiKey:t,...r})},createStreamingRequest(n,r){return Lt({baseUrl:e,model:n,apiKey:t,...r})}}}function zt(e,t,r){let i={};return t&&(i.systemInstruction=t),e&&e.length>0&&(i.tools=e.map(e=>({functionDeclarations:[{name:e.name,description:e.description,parametersJsonSchema:n.toJSONSchema(e.schema)}]}))),r&&Object.assign(i,r),i}const Bt={web_search:`googleSearch`,code_execution:`codeExecution`};function Vt(e,t){if(!(!t||t.length===0)){e.tools||=[];for(let n of t){let t=Bt[n.name]??n.name;e.tools.push({[t]:n.config??{}})}}}function Ht(e,t,n,r){if(t===!1)throw Error(`Gemini does not support disabling parallel tool calls`);if(e===void 0)return{};if(e===`auto`)return{toolConfig:{functionCallingConfig:{mode:_.AUTO}}};if(e===`none`)return{toolConfig:{functionCallingConfig:{mode:_.NONE}}};if(e===`required`){if(!n||n.length===0)throw Error(`Gemini requires function tools for required tool choice`);return{toolConfig:{functionCallingConfig:{mode:_.ANY}}}}if(n?.some(t=>t.name===e.name))return{toolConfig:{functionCallingConfig:{mode:_.ANY,allowedFunctionNames:[e.name]}}};throw r?.some(t=>t.name===e.name)?Error(`Gemini does not support provider tool choice: ${e.name}`):Error(`Tool choice references an unavailable tool: ${e.name}`)}function Ut(e){return e===!0?{thinkingConfig:{thinkingBudget:8192,includeThoughts:!0}}:e===!1?{thinkingConfig:{thinkingBudget:0}}:{}}async function Wt(e,t={model:``}){return(await Promise.all(e.map(e=>Gt(e,t)))).filter(e=>e!==void 0)}async function Gt(e,t){switch(e.role){case`tool`:return Kt(e,t);case`assistant`:return qt(e);case`user`:return Jt(e,t)}}async function Kt(e,t){return{role:`user`,parts:(await Promise.all(e.content.map(async e=>{let n=typeof e.content==`string`?e.content:e.content.filter(e=>e.type===`text`).map(e=>e.text).join(`
11
+ `),r={functionResponse:{id:e.id??void 0,name:e.name,response:{output:n}}};return typeof e.content==`string`?[r]:[r,...await Promise.all(e.content.filter(e=>e.type===`file`).map(e=>Xt(e.file,t,`tool-result`)))]}))).flat(1)}}function qt(e){let t=[],n=e.content.filter(e=>e.type===`text`);if(n.length>0){let e=n.map(e=>e.text).join(``);e&&t.push({text:e})}let r=e.content.filter(e=>e.type===`tool-call`);return r.length>0&&t.push(...r.map(e=>{let t={functionCall:{id:e.id??void 0,name:e.name,args:e.parameters}};return e.providerMetadata?.thoughtSignature&&(t.thoughtSignature=e.providerMetadata.thoughtSignature),t})),{role:`model`,parts:t}}async function Jt(e,t){return typeof e.content==`string`?{role:`user`,parts:[{text:e.content}]}:{role:`user`,parts:(await Promise.all(e.content.map(e=>Yt(e,t)))).filter(e=>e!==null)}}async function Yt(e,t){return e.type===`text`?{text:e.text}:e.type===`file`?Xt(e.file,t,`user-message`):null}async function Xt(e,t,n){if(e.kind===`text`){let r=await Q(e,{provider:`gemini`,model:t.model,accepted:[`text`],purpose:n,resolver:t.fileResolver,signal:t.signal});if(r.type!==`text`)throw Error(`Unsupported Gemini text source: ${r.type}`);return{text:Qt(e,r.content,r.name,r.mimeType)}}if(e.kind===`document`&&e.mimeType!==`application/pdf`)throw Error(`Gemini document file support is limited to PDFs. Received ${e.mimeType}`);return Zt(await Q(e,{provider:`gemini`,model:t.model,accepted:[`gemini-file-uri`,`url`,`base64`],purpose:n,resolver:t.fileResolver,signal:t.signal}),e)}function Zt(e,t){if(e.type===`base64`)return{inlineData:{mimeType:e.mimeType??t.mimeType,data:e.data}};if(e.type===`url`)return{fileData:{mimeType:e.mimeType??t.mimeType,fileUri:e.url}};if(e.type===`gemini-file-uri`)return{fileData:{mimeType:e.mimeType??t.mimeType,fileUri:e.uri}};throw Error(`Unsupported Gemini file source: ${e.type}`)}function Qt(e,t,n,r){return`File: ${n??e.name}\nMIME type: ${r??e.mimeType}\n\n${t}`}function $t(e){switch(e){case g.STOP:return[!0,`stop`];case g.MAX_TOKENS:return[!0,`length`];case g.FINISH_REASON_UNSPECIFIED:case g.SAFETY:case g.RECITATION:case g.LANGUAGE:case g.OTHER:case g.BLOCKLIST:case g.PROHIBITED_CONTENT:case g.SPII:case g.MALFORMED_FUNCTION_CALL:case g.IMAGE_SAFETY:return[!1,`error`]}return[!1,`error`]}async function en(e){let{client:t,model:n,messages:r,system:i,tools:a,providerTools:o,runtime:s,reasoning:c,maxOutputTokens:l,temperature:u,topP:d,stop:f,toolChoice:p,parallelToolCalls:m,providerOptions:h,signal:g}=e,_=s?.tracer,v={...Ut(c),...l===void 0?{}:{maxOutputTokens:l},...u===void 0?{}:{temperature:u},...d===void 0?{}:{topP:d},...f===void 0?{}:{stopSequences:Array.isArray(f)?f:[f]},...Ht(p,m,a,o),...h},y;try{Y(g,`Generate aborted`);let e=await Wt(r,{model:n,fileResolver:s?.fileResolver,signal:g}),c=zt(a,i,v);p!==`none`&&Vt(c,o);let l={contents:e,config:c};_?.debug(`Gemini request`,{request:Z(l)});let u=await X(t.models.generateContent({model:n,...l}),g,`Generate aborted`);Y(g,`Generate aborted`),y=tn(u,{tracer:_})}catch(e){Y(g,`Generate aborted`),_?.error(e instanceof Error?e.message:String(e)),y=Ve(e)}return _?.debug(`Gemini response`,{result:y}),y}function tn(e,t){let{tracer:n}=t,r=e.usageMetadata?.promptTokenCount??0,i=G({in:r,out:(e.usageMetadata?.totalTokenCount??r)-r},{cachedIn:e.usageMetadata?.cachedContentTokenCount,reasoningOut:e.usageMetadata?.thoughtsTokenCount});if(!e)return{type:`error`,error:{type:`InvalidResponse`,message:`Invalid or empty response from Google AI`},usage:{in:0,out:0},raw:e};if(e.promptFeedback&&e.promptFeedback.blockReason)return{type:`error`,error:{type:`Blocked`,message:`Response blocked by Google AI: ${e.promptFeedback.blockReason}, ${e.promptFeedback.blockReasonMessage}`},usage:i,raw:e};if(!e.candidates||e.candidates.length===0)return{type:`error`,error:{type:`InvalidResponse`,message:`Invalid or empty response from Google AI`},usage:{in:0,out:0},raw:e};e.candidates.length>1&&n?.warn(`We received ${e.candidates.length} response candidates`);let a=e.candidates[0],o=a.content?.parts||[],s=o.map(e=>e.text).filter(e=>e!==void 0).join(``),[c,l]=$t(a.finishReason);if(c){let t=[];s&&t.push({type:`text`,text:s});let n=o.filter(e=>e.functionCall),r=n.length>0?n.map(e=>({call:e.functionCall,thoughtSignature:e.thoughtSignature})):(e.functionCalls??[]).map(e=>({call:e,thoughtSignature:void 0}));if(r.length>0)for(let{call:e,thoughtSignature:n}of r)if(e.args==null)t.push({type:`tool-call`,id:e.id??``,name:e.name??``,parameters:{},...n?{providerMetadata:{thoughtSignature:n}}:{}});else if(typeof e.args!=`object`||Array.isArray(e.args))throw Error(`Invalid tool call arguments for ${e.name}: expected object, got ${typeof e.args}`);else t.push({type:`tool-call`,id:e.id??``,name:e.name??``,parameters:e.args,...n?{providerMetadata:{thoughtSignature:n}}:{}});return{type:`success`,id:e.responseId??``,model:e.modelVersion??``,role:`assistant`,finishReason:r.length>0?`function_call`:l,content:t,text:V(t),usage:i,raw:e}}else return{type:`error`,error:{type:`Undetermined`,message:`Unexpected stop reason: ${l}`},usage:i,raw:e}}function nn(){let e=0,t=-1,n=!1,r=``,i=``,a=0,o=0,s=0,c=0,l=null;function u(e){t<0||(l===`text`?e.push({type:`text-complete`,data:{index:t}}):l===`thinking`&&e.push({type:`thinking-complete`,data:{index:t}}),l=null,t=-1)}function d(d){let f=[];r||(r=d.responseId||`gemini-${Date.now()}`,i=d.modelVersion||`gemini`,f.push({type:`start`,id:r,data:{model:i,timestamp:Date.now()}})),d.usageMetadata&&(a=d.usageMetadata.promptTokenCount||0,o=(d.usageMetadata.totalTokenCount||0)-a,s=d.usageMetadata.cachedContentTokenCount||0,c=d.usageMetadata.thoughtsTokenCount||0);let p=d.candidates?.[0];if(!p)return f;let m=p.content?.parts||[];for(let r of m){let i=`thought`in r&&r.thought===!0,a=Object.keys(r),o=a.length===1&&`text`in r&&!r.text;if(!(`thoughtSignature`in r&&!r.text&&!r.functionCall||a.length===2&&`text`in r&&`thoughtSignature`in r&&!r.text||o)&&(i&&r.text?(l!==`thinking`&&(u(f),t=e++,l=`thinking`,f.push({type:`thinking-start`,data:{index:t}})),f.push({type:`thinking-delta`,data:{index:t,text:r.text}})):r.text&&!i?(l!==`text`&&(u(f),t=e++,l=`text`,f.push({type:`text-start`,data:{index:t}})),f.push({type:`text-delta`,data:{text:r.text,index:t}})):r.functionCall||console.log(`[gemini] unhandled part type: ${JSON.stringify(Object.keys(r))}`),r.functionCall)){u(f),n=!0;let t=e++,i=r.functionCall.id||`tool-${t}`,a=r.functionCall.name??``;f.push({type:`tool-call-start`,data:{index:t,id:i,name:a}});let o=r.functionCall.args??{},s=JSON.stringify(o);f.push({type:`tool-call-args-delta`,data:{index:t,id:i,name:a,delta:s,accumulated:s}});let c={index:t,id:i,name:a,arguments:o},l=r;l.thoughtSignature&&(c.providerMetadata={thoughtSignature:l.thoughtSignature}),f.push({type:`tool-call-complete`,data:c})}}if(p.finishReason&&p.finishReason!==g.FINISH_REASON_UNSPECIFIED){u(f);let[e,t]=$t(p.finishReason),r=n?`function_call`:t;!e&&!n?f.push({type:`error`,data:{type:`FinishReasonError`,message:`Unexpected finish reason: ${p.finishReason}`,usage:G({in:a,out:o},{cachedIn:s,reasoningOut:c}),raw:d}}):f.push({type:`complete`,data:{finishReason:r,usage:G({in:a,out:o},{cachedIn:s,reasoningOut:c})}})}return f}return{handleChunk:d}}async function*rn(e){let{client:t,model:n,messages:r,system:i,tools:a,providerTools:o,runtime:s,signal:c,reasoning:l,maxOutputTokens:u,temperature:d,topP:f,stop:p,toolChoice:m,parallelToolCalls:h,providerOptions:g}=e,_=s?.tracer,v=zt(a,i,{...Ut(l),...u===void 0?{}:{maxOutputTokens:u},...d===void 0?{}:{temperature:d},...f===void 0?{}:{topP:f},...p===void 0?{}:{stopSequences:Array.isArray(p)?p:[p]},...Ht(m,h,a,o),...g});m!==`none`&&Vt(v,o);let y=nn();try{let e={contents:await Wt(r,{model:n,fileResolver:s?.fileResolver,signal:c}),config:v};_?.debug(`Gemini streaming request`,{request:Z(e)});let i=await t.models.generateContentStream({model:n,...e});for await(let e of i){let t=y.handleChunk(e);for(let e of t)yield e}}catch(e){if(c?.aborted)return;_?.error(e instanceof Error?e.message:String(e)),yield{type:`error`,data:{type:`STREAMING_ERROR`,message:e instanceof Error?e.message:String(e),raw:e}}}}function an(e){let t=new v({apiKey:e});return{name:`Gemini`,async createGenerationRequest(e,n){return await en({client:t,model:e,...n})},createStreamingRequest(e,n){return rn({client:t,model:e,...n})}}}async function on(e){let{provider:t,model:n,messages:r,system:i,tools:a,providerTools:o,tracer:s,fileResolver:c,...l}=e;return t.createGenerationRequest(n,{messages:r,system:i,tools:a,providerTools:o,runtime:{tracer:s,fileResolver:c},...l})}async function sn(e){if(`instruct`in e){let{instruct:t,messages:n,...r}=e,i=se(t),a=await cn({...r,messages:[...n??[],i.message]});if(!a.ok)return a;try{return{...a,response:i.parse(a.final)}}catch(e){return{ok:!1,messages:a.messages,final:a.final,usage:a.usage,error:{kind:`parse`,error:e,message:e instanceof Error?e.message:String(e)}}}}return cn(e)}async function cn(e){let{provider:t,model:n,messages:r,system:i,onToolCall:a,maxIterations:o,tracer:s,fileResolver:c,reasoning:l,maxOutputTokens:u,temperature:d,topP:f,stop:p,toolChoice:m,parallelToolCalls:h,providerOptions:g,signal:_=new AbortController().signal}=e,v=ge(e),y=[...r],b=[],x=W(),S=0,C,w=e=>{y.push(e),b.push(e)},T=e=>(s?.setResult({kind:`llm`,model:n,request:{messages:r},response:{content:e.ok?e.final.content:null},usage:ue(e.usage),finishReason:e.ok?e.final.finishReason:void 0}),s?.end(e.ok?`ok`:`error`),e),E=(e,t)=>{if(!e||t.type===`error`){e?.end(`error`);return}e.setResult({kind:`llm`,model:t.model??n,request:{messages:y},response:{content:t.content},usage:ue(t.usage),finishReason:t.finishReason}),e.end()};try{for(;;){if(Y(_,`Generate aborted`),o!==void 0&&S>=o)return T({ok:!1,messages:b,error:{kind:`model`,error:{type:`error`,error:{type:`MaxIterations`,message:`Exceeded max iterations (${o})`}}},usage:x});S+=1;let e=s?.startSpan(`turn-${S}`,{type:`llm`}),r=v.executable(),D=r.length>0?r.map(e=>({name:e.name,description:e.description,schema:e.schema})):void 0,ee=v.provider(),O;try{O=await on({provider:t,model:n,messages:y,system:i,tools:D,providerTools:ee.length>0?ee:void 0,tracer:e,fileResolver:c,reasoning:l,maxOutputTokens:u,temperature:d,topP:f,stop:p,toolChoice:m,parallelToolCalls:h,providerOptions:g,signal:_}),Y(_,`Generate aborted`)}catch(t){throw t instanceof Error&&t.name===`AbortError`&&e?.end(`ok`),t}if(me(x,O),E(e,O),O.type===`error`)return T({ok:!1,messages:b,error:{kind:`model`,error:O},usage:x});let k={role:`assistant`,id:O.id,model:O.model,content:O.content,finishReason:O.finishReason};if(w(k),C=k,O.finishReason!==`function_call`)return T({ok:!0,response:C,messages:b,final:C,usage:x});let A=H(O.content);if(A.length===0)return T({ok:!0,response:C,messages:b,final:C,usage:x});let{results:te}=await _e(A,a,_,v,s);Y(_,`Generate aborted`),te.length>0&&w({role:`tool`,id:crypto.randomUUID(),content:te})}}catch(e){throw e instanceof A?(s?.end(`error`),new A(e.message,{toolName:e.toolName,messages:e.messages??b,partial:e.partial??C,usage:e.usage??x,cause:e.cause})):e instanceof O?(s?.end(`ok`),new O(`Generate aborted`,{reason:e.reason,messages:e.messages??b,partial:e.partial,usage:e.usage??x})):e instanceof Error&&e.name===`AbortError`?(s?.end(`ok`),new O(`Generate aborted`,{reason:_.reason,messages:b,usage:x})):e}}function ln(e){if(e&&e.length>0)return e.map(e=>({type:`function`,strict:!0,name:e.name,description:e.description,parameters:n.toJSONSchema(e.schema)}))}const un={web_search:`web_search_preview`,code_execution:`code_interpreter`};function dn(e){return e?.map(e=>({type:un[e.name]??e.name,...e.config}))}function fn(e,t,n){if(e===void 0)return{};if(e===`auto`||e===`none`||e===`required`)return{tool_choice:e};if(t?.some(t=>t.name===e.name))return{tool_choice:{type:`function`,name:e.name}};let r=n?.find(t=>t.name===e.name);if(r)return{tool_choice:{type:un[r.name]??r.name}};throw Error(`Tool choice references an unavailable tool: ${e.name}`)}function pn(e){return e===!0?{reasoning:{effort:`high`}}:e===!1?{reasoning:{effort:`none`}}:{}}async function mn(e,t={model:``}){return(await Promise.all(e.map(e=>hn(e,t)))).flat(1)}async function hn(e,t){switch(e.role){case`tool`:return gn(e,t);case`assistant`:return _n(e);default:return vn(e,t)}}async function gn(e,t){return Promise.all(e.content.map(async e=>({type:`function_call_output`,call_id:e.id,output:typeof e.content==`string`?e.content:await Promise.all(e.content.map(e=>e.type===`text`?Promise.resolve({type:`input_text`,text:e.text}):bn(e.file,t,`tool-result`)))})))}function _n(e){let t=[],n=V(e.content);n&&t.push({role:e.role,content:n});let r=e.content.filter(e=>e.type===`tool-call`);for(let e of r)t.push({type:`function_call`,call_id:e.id,name:e.name,arguments:JSON.stringify(e.parameters)});let i=e.content.filter(e=>e.type===`provider-tool`);for(let e of i)e.output!=null&&t.push(e.output);return t}async function vn(e,t){if(typeof e.content==`string`)return{role:e.role,content:e.content};{let n=(await Promise.all(e.content.map(e=>yn(e,t)))).filter(e=>e!==null);return{role:e.role,content:n}}}async function yn(e,t){return e.type===`text`?{type:`input_text`,text:e.text}:e.type===`file`?bn(e.file,t,`user-message`):(e.type,null)}async function bn(e,t,n){if(e.kind===`image`)return{type:`input_image`,image_url:xn(await Q(e,{provider:`openai`,model:t.model,accepted:[`url`,`base64`],purpose:n,resolver:t.fileResolver,signal:t.signal}),e),detail:`auto`};if(e.kind===`document`){if(e.mimeType!==`application/pdf`)throw Error(`OpenAI file inputs currently support PDF documents. Received ${e.mimeType}`);return Sn(await Q(e,{provider:`openai`,model:t.model,accepted:[`url`,`base64`],purpose:n,resolver:t.fileResolver,signal:t.signal}),e)}let r=await Q(e,{provider:`openai`,model:t.model,accepted:[`text`,`url`,`base64`],purpose:n,resolver:t.fileResolver,signal:t.signal});return r.type===`text`?{type:`input_text`,text:r.content}:Sn(r,e)}function xn(e,t){if(e.type===`url`)return e.url;if(e.type===`base64`)return`data:${e.mimeType??t.mimeType};base64,${e.data}`;throw Error(`Unsupported OpenAI image source: ${e.type}`)}function Sn(e,t){if(e.type===`url`)return{type:`input_file`,filename:e.name??t.name,file_url:e.url};if(e.type===`base64`)return{type:`input_file`,filename:e.name??t.name,file_data:`data:${e.mimeType??t.mimeType};base64,${e.data}`};throw Error(`Unsupported OpenAI file source: ${e.type}`)}async function Cn(e){let{client:t,model:n,messages:r,system:i,tools:a,providerTools:o,runtime:s,reasoning:c,maxOutputTokens:l,temperature:u,topP:d,stop:f,toolChoice:p,parallelToolCalls:m,providerOptions:h,signal:g}=e,_=s?.tracer,v;try{if(Y(g,`Generate aborted`),f!==void 0)throw Error(`OpenAI Responses does not support normalized stop sequences`);let e=[...ln(a)??[],...dn(o)??[]],y={model:n,input:await mn(r,{model:n,fileResolver:s?.fileResolver,signal:g}),...i&&{instructions:i},...e.length>0?{tools:e}:{},...pn(c),...l===void 0?{}:{max_output_tokens:l},...u===void 0?{}:{temperature:u},...d===void 0?{}:{top_p:d},...fn(p,a,o),...m===void 0?{}:{parallel_tool_calls:m},...h};_?.debug(`OpenAI ResponsesAPI request`,{request:Z(y)});let b=await X(t.responses.create(y,...g?[{signal:g}]:[]),g,`Generate aborted`);Y(g,`Generate aborted`),v=wn(b)}catch(e){Y(g,`Generate aborted`),_?.error(e instanceof Error?e.message:String(e)),v=Ve(e)}return _?.debug(`OpenAI ResponsesAPI response`,{result:v}),v}function wn(e){if(e.error)return{type:`error`,error:{type:e.error.code||`undetermined`,message:e.error.message||`Response generation failed`},usage:Tn(e.usage),raw:e};let t=e.output?.filter(e=>e.type===`reasoning`)?.map(e=>e),n=[];if(t&&t.length>0)for(let e of t){let t=e.summary?.[0]?.text||e.content?.[0]?.text||``;(t||e.encrypted_content)&&n.push({type:`thinking`,text:t,...e.encrypted_content&&{encrypted:e.encrypted_content}})}e.output_text&&n.push({type:`text`,text:e.output_text});let r=e.output?.filter(e=>e.type===`function_call`);if(r&&r.length>0)for(let e of r){let t=e;try{n.push({type:`tool-call`,id:t.call_id||t.id||``,name:t.name||``,parameters:t.arguments?JSON.parse(t.arguments):{}})}catch(e){throw Error(`Failed to parse tool call arguments for ${t.name}: ${e instanceof Error?e.message:String(e)}\nRaw value: ${t.arguments}`)}}return{type:`success`,id:e.id,model:e.model||``,role:`assistant`,finishReason:e.incomplete_details?`error`:r&&r.length>0?`function_call`:`stop`,content:n,text:V(n),usage:Tn(e.usage),raw:e}}function Tn(e){return G({in:e?.input_tokens??0,out:e?.output_tokens??0},{cachedIn:e?.input_tokens_details?.cached_tokens,reasoningOut:e?.output_tokens_details?.reasoning_tokens})}function En(){let e=``,t=``,n=0,r=-1,i=!1,a=new Map,o=new Map,s=new Set([`web_search_call`,`file_search_call`,`code_interpreter_call`]),c=new Map;function l(l){let u=[];switch(l.type){case`response.created`:e=l.response.id||`openai-${Date.now()}`,t=l.response.model,u.push({type:`start`,id:e,data:{model:t,timestamp:Date.now()}});break;case`response.output_text.delta`:r===-1&&(r=n++,u.push({type:`text-start`,data:{index:r}})),u.push({type:`text-delta`,data:{text:l.delta,index:r}});break;case`response.output_text.done`:r>=0&&(u.push({type:`text-complete`,data:{index:r}}),r=-1);break;case`response.function_call_arguments.delta`:{let e=l.item_id;if(!c.has(e)){let t=a.get(e),r=t?.name||``,i=t?.callId||e,o=n++;c.set(e,{id:e,callId:i,name:r,argumentsBuffer:``,partIdx:o}),u.push({type:`tool-call-start`,data:{index:o,id:i,name:r}})}let t=c.get(e);t.argumentsBuffer+=l.delta,u.push({type:`tool-call-args-delta`,data:{index:t.partIdx,id:t.callId,name:t.name,delta:l.delta,accumulated:t.argumentsBuffer}});break}case`response.function_call_arguments.done`:{i=!0;let e=l.item_id,t=c.get(e),n=l.name||t?.name||``;if(t){try{let e=l.arguments?JSON.parse(l.arguments):{};u.push({type:`tool-call-complete`,data:{index:t.partIdx,id:t.callId,name:n,arguments:e}})}catch(e){throw Error(`Failed to parse function call arguments for ${n}: ${e instanceof Error?e.message:String(e)}\nRaw value: ${l.arguments}`)}c.delete(e)}break}case`response.completed`:{let e=l.response.usage;u.push({type:`complete`,data:{finishReason:l.response.incomplete_details?`error`:i?`function_call`:`stop`,usage:G({in:e?.input_tokens||0,out:e?.output_tokens||0},{cachedIn:e?.input_tokens_details?.cached_tokens,reasoningOut:e?.output_tokens_details?.reasoning_tokens})}});break}case`response.failed`:u.push({type:`error`,data:{type:`RESPONSES_API_ERROR`,message:`Response failed: ${l.response.status}`,raw:l}});break;case`response.output_item.added`:if(l.item?.type===`reasoning`)r=n++,u.push({type:`thinking-start`,data:{index:r}});else if(l.item?.type===`function_call`){let e=l.item,t=e.id||e.call_id;t&&a.set(t,{name:e.name||``,callId:e.call_id||t})}else if(l.item&&s.has(l.item.type)){let e=l.item,t=n++;o.set(e.id,t),u.push({type:`provider-tool-start`,data:{index:t,id:e.id,name:e.type}})}break;case`response.output_item.done`:if(l.item?.type===`reasoning`&&r>=0)u.push({type:`thinking-complete`,data:{index:r}}),r=-1;else if(l.item&&s.has(l.item.type)){let e=l.item,t=o.get(e.id);t!==void 0&&(u.push({type:`provider-tool-complete`,data:{index:t,id:e.id,name:e.type,output:l.item}}),o.delete(e.id))}break;case`response.reasoning_text.delta`:l.delta&&u.push({type:`thinking-delta`,data:{index:r,text:l.delta}});break;case`response.reasoning_summary_text.delta`:l.delta&&u.push({type:`thinking-summary-delta`,data:{index:r,text:l.delta}});break;case`response.in_progress`:case`response.content_part.added`:case`response.content_part.done`:case`response.reasoning_summary_part.added`:case`response.reasoning_summary_part.done`:case`response.reasoning_summary_text.done`:case`response.reasoning_text.done`:case`response.web_search_call.in_progress`:case`response.web_search_call.searching`:case`response.web_search_call.completed`:break;default:console.log(`[OpenAI] unhandled stream event: ${l.type}`)}return u}return{handleEvent:l}}async function*Dn(e){let{client:t,model:n,messages:r,system:i,tools:a,providerTools:o,runtime:s,signal:c,reasoning:l,maxOutputTokens:u,temperature:d,topP:f,stop:p,toolChoice:m,parallelToolCalls:h,providerOptions:g}=e,_=s?.tracer;if(p!==void 0)throw Error(`OpenAI Responses does not support normalized stop sequences`);let v=[...ln(a)??[],...dn(o)??[]],y=En();try{let e={model:n,input:await mn(r,{model:n,fileResolver:s?.fileResolver,signal:c}),...i&&{instructions:i},stream:!0,...v.length>0?{tools:v}:{},...pn(l),...u===void 0?{}:{max_output_tokens:u},...d===void 0?{}:{temperature:d},...f===void 0?{}:{top_p:f},...fn(m,a,o),...h===void 0?{}:{parallel_tool_calls:h},...g};_?.debug(`OpenAI ResponsesAPI streaming request`,{request:Z(e)});let p=t.responses.stream(e,...c?[{signal:c}]:[]);for await(let e of p){let t=y.handleEvent(e);for(let e of t)yield e}}catch(e){if(c?.aborted)return;_?.error(e instanceof Error?e.message:String(e)),yield{type:`error`,data:{type:`STREAMING_ERROR`,message:e instanceof Error?e.message:String(e),raw:e}}}}function On(e){let t=new y({apiKey:e});return{name:`OpenAI`,async createGenerationRequest(e,n){return await Cn({client:t,model:e,...n})},createStreamingRequest(e,n){return Dn({client:t,model:e,...n})}}}const kn=t.object({searchTerm:t.string().describe(`The search term to query`)}),An=new class{name=`brave`;description=`Perform a search using the Brave search engine`;schema=kn;apiKey;throttle;lastExecTime=0;constructor(e){e&&this.configure(e)}configure(e){let{rateLimit:t}=e;this.apiKey=e[`api-key`],this.throttle=t?1100/t:void 0}async execute(e,t){let{searchTerm:n}=e;if(this.throttle){for(;Date.now()-this.lastExecTime<this.throttle;)await X(Ee(this.throttle-(Date.now()-this.lastExecTime)),t.signal);this.lastExecTime=Date.now()}try{Y(t.signal);let e=this.apiKey,r=new URL(`https://api.search.brave.com/res/v1/web/search`);r.searchParams.append(`q`,n),r.searchParams.append(`format`,`json`);let i=await fetch(r.toString(),{method:`GET`,signal:t.signal,headers:{Accept:`application/json`,"X-Subscription-Token":e??``}});if(!i.ok)throw Error(`[Brave] HTTP error ${i.status}: ${i.statusText}`);let a=await i.json();return JSON.stringify(a)}catch(e){throw t.signal.aborted||e instanceof Error&&e.name===`AbortError`?e:e instanceof Error?Error(`[Brave] Error fetching search results: ${e.message}`):e}}},jn={name:`calculator`,description:`Performs basic arithmetic operations`,schema:r.object({operation:r.enum([`add`,`subtract`,`multiply`,`divide`]).describe(`The operation to perform (add, subtract, multiply, divide)`),a:r.number().describe(`First operand`),b:r.number().describe(`Second operand`)}),execute:async({operation:e,a:t,b:n})=>{switch(e){case`add`:return`${t} + ${n} = ${t+n}`;case`subtract`:return`${t} - ${n} = ${t-n}`;case`multiply`:return`${t} * ${n} = ${t*n}`;case`divide`:if(n===0)throw Error(`Cannot divide by zero`);return`${t} / ${n} = ${t/n}`;default:throw Error(`Unknown operation: ${e}`)}}};async function Mn(e,t={}){let n=t.timeout??3e4,r=t.maxBuffer??1048576;return new Promise((i,a)=>{let o=b(e,[],{shell:!0,cwd:t.cwd}),s=``,c=``,l=!1,u=!1,d=!1,f=setTimeout(()=>{l=!0,o.kill(`SIGTERM`)},n),p=()=>{u=!0,o.kill(`SIGTERM`)};t.signal?.addEventListener(`abort`,p);let m=()=>{clearTimeout(f),t.signal?.removeEventListener(`abort`,p)};o.stdout?.setEncoding(`utf-8`),o.stderr?.setEncoding(`utf-8`),o.stdout?.on(`data`,e=>{if(s+=e,s.length+c.length>r){d=!0,o.kill(`SIGTERM`);return}t.onChunk?.(e)}),o.stderr?.on(`data`,e=>{if(c+=e,s.length+c.length>r){d=!0,o.kill(`SIGTERM`);return}t.onChunk?.(e)}),o.on(`error`,e=>{m(),a(e)}),o.on(`close`,e=>{if(m(),l){let e=Error(`Command timed out after ${n}ms`);e.stdout=s,e.stderr=c,a(e);return}if(u){let e=Error(`Command aborted`);e.stdout=s,e.stderr=c,a(e);return}if(d){let e=Error(`Command output exceeded maxBuffer (${r} bytes)`);e.stdout=s,e.stderr=c,a(e);return}if(e!==0){let t=Error(`Command failed with exit code ${e}`);t.stdout=s,t.stderr=c,t.code=e??-1,a(t);return}i({stdout:s,stderr:c})})})}function Nn(e){if(e instanceof Error){let t=e,n=`Error executing command: ${e.message}`;return t.stdout&&(n+=`\n[stdout]: ${t.stdout}`),t.stderr&&(n+=`\n[stderr]: ${t.stderr}`),n}return`Error executing command: ${String(e)}`}function Pn(e,t){return t&&t.trim()?`${e}\n[stderr]: ${t}`:e}const Fn=t.object({command:t.string().describe(`The shell command to execute`)}),In=new class{name=`exec`;description=`Execute a shell command and return the output.`;schema=Fn;timeout=3e4;maxBuffer=1024*1024;cwd;constructor(e){e&&this.configure(e)}configure(e){this.timeout=e.timeout??3e4,this.maxBuffer=e.maxBuffer??1024*1024,this.cwd=e.cwd}summarize(e){return e.command}async execute(e,t){let{command:n}=e;try{let e=await Mn(n,{timeout:this.timeout,maxBuffer:this.maxBuffer,cwd:this.cwd,signal:t.signal,onChunk:e=>t.emit(e)});return Pn(e.stdout,e.stderr)}catch(e){return Nn(e)}}},Ln={name:`patch-file`,description:`Patch a file by replacing an exact string match within a specified line range`,schema:r.object({path:r.string().describe(`The file path to patch`),old_string:r.string().describe(`The exact text to find and replace`),new_string:r.string().describe(`The replacement text`),start_line:r.number().int().positive().describe(`1-indexed start line of the region to match within`),end_line:r.number().int().positive().describe(`1-indexed end line (inclusive) of the region to match within`)}),summarize:({path:e,start_line:t,end_line:n})=>`${e}:${t}:${n}`,execute:async({path:e,old_string:t,new_string:n,start_line:r,end_line:i})=>{if(i<r)throw Error(`end_line (${i}) must be >= start_line (${r})`);let a;try{a=await s(e,`utf-8`)}catch(t){throw t instanceof Error?Error(`Failed to read file "${e}": ${t.message}`):t}let o=a.split(`
12
+ `);if(r>o.length)throw Error(`start_line (${r}) exceeds file length (${o.length} lines)`);if(i>o.length)throw Error(`end_line (${i}) exceeds file length (${o.length} lines)`);let c=o.slice(r-1,i).join(`
13
+ `),u=c.indexOf(t);if(u===-1)throw Error(`old_string not found within lines ${r}-${i} of "${e}"`);if(c.indexOf(t,u+1)!==-1)throw Error(`old_string matches multiple times within lines ${r}-${i} of "${e}"`);let d=c.replace(t,n),f=[...o.slice(0,r-1),...d.split(`
14
+ `),...o.slice(i)].join(`
15
+ `);try{await l(e,f,`utf-8`)}catch(t){throw t instanceof Error?Error(`Failed to write file "${e}": ${t.message}`):t}return`Successfully patched "${e}" (lines ${r}-${i})`}},Rn={name:`read-file`,description:`Read the contents of a file from disk`,schema:r.object({path:r.string().describe(`The file path to read from`)}),summarize:({path:e})=>e,execute:async({path:e})=>{try{return await s(e,`utf-8`)}catch(t){throw t instanceof Error?Error(`Failed to read file "${e}": ${t.message}`):t}}},zn={name:`write-file`,description:`Write content to a file on disk, creating directories if needed`,schema:r.object({path:r.string().describe(`The file path to write to`),content:r.string().describe(`The content to write to the file`)}),summarize:({path:e})=>e,execute:async({path:e,content:t})=>{try{return await o(d(e),{recursive:!0}),await l(e,t,`utf-8`),`Successfully wrote ${t.length} characters to "${e}"`}catch(t){throw t instanceof Error?Error(`Failed to write file "${e}": ${t.message}`):t}}};function Bn(e){try{let t=n.fromJSONSchema(e);return t instanceof n.ZodObject?t.strict():n.object({}).passthrough()}catch{return n.object({}).passthrough()}}function Vn(e,t,n){return e.map(e=>Un(e,t,n))}function Hn(e,t){return e.map(e=>{let n=t?`${t}_${e.name}`:e.name,r=Bn(e.inputSchema);return{name:n,description:e.description??``,schema:r}})}function Un(e,t,n){let r=n?`${n}_${e.name}`:e.name,i=Bn(e.inputSchema);return{name:r,description:e.description??``,schema:i,async execute(n,i){let a;try{a=await t.callTool({name:e.name,arguments:n},void 0,{signal:i.signal})}catch(t){throw i.signal.aborted||t instanceof Error&&t.name===`AbortError`?t:new A(`MCP tool call failed: ${e.name}`,{toolName:r,cause:t})}if(`isError`in a&&a.isError)throw Error(Gn(a.content));return Wn(a.content)}}}function Wn(e){return e.some(e=>e.type===`image`)?e.filter(e=>e.type===`text`||e.type===`image`).map(e=>{if(e.type===`text`)return{type:`text`,text:e.text};let t=e;return{type:`file`,file:{kind:`image`,mimeType:t.mimeType,name:`mcp-image`,source:{type:`base64`,data:t.data}}}}):e.filter(e=>e.type===`text`).map(e=>e.text).join(`
16
+ `)}function Gn(e){return e.filter(e=>e.type===`text`).map(e=>e.text).join(`
17
+ `)||`MCP tool execution error`}var Kn=class{config;client;transport;cachedMcpTools;_connected=!1;constructor(e){this.config=e}get name(){return this.config.name??this.client?.getServerVersion()?.name}get connected(){return this._connected}async connect(e){if(this._connected)return;let t=e?.tracer?.startSpan(`mcp:connect`,{type:`internal`});this.client=new x({name:`axle`,version:`1.0.0`}),this.config.transport===`stdio`?this.transport=new S({command:this.config.command,args:this.config.args,env:this.config.env}):this.transport=new C(new URL(this.config.url),{requestInit:this.config.headers?{headers:this.config.headers}:void 0});try{await this.client.connect(this.transport,{signal:e?.signal}),this._connected=!0,t?.end(`ok`)}catch(e){throw t?.end(`error`),e}}async listTools(e){let t=this.assertConnected();return Vn(await this.fetchTools(t,e?.tracer,e?.signal),t,e?.prefix)}async listToolDefinitions(e){let t=this.assertConnected();return Hn(await this.fetchTools(t,e?.tracer,e?.signal),e?.prefix)}async refreshTools(){return this.assertConnected(),this.cachedMcpTools=void 0,this.listTools()}async close(e){this._connected&&(e?.tracer?.debug(`mcp:close`),await this.client?.close(),this._connected=!1,this.client=void 0,this.transport=void 0,this.cachedMcpTools=void 0)}async fetchTools(e,t,n){if(this.cachedMcpTools)return this.cachedMcpTools;t?.debug(`mcp:listTools`);let r=await e.listTools(void 0,{signal:n});return this.cachedMcpTools=r.tools.map(e=>({name:e.name,description:e.description,inputSchema:e.inputSchema})),this.cachedMcpTools}assertConnected(){if(!this._connected||!this.client)throw Error(`MCP not connected. Call connect() first.`);return this.client}};const qn={debug:0,info:1,warn:2,error:3};var Jn=class{writers=[];_minLevel=`info`;get minLevel(){return this._minLevel}set minLevel(e){this._minLevel=e}addWriter(e){this.writers.includes(e)||this.writers.push(e)}removeWriter(e){let t=this.writers.indexOf(e);t!==-1&&this.writers.splice(t,1)}startSpan(e,t){let n={traceId:crypto.randomUUID(),spanId:crypto.randomUUID(),name:e,type:t?.type,startTime:performance.now(),status:`ok`,attributes:{},events:[]};return this.writers.forEach(e=>e.onSpanStart(n)),new Yn(n,this)}async flush(){for(let e of this.writers)e.flush&&await e.flush()}_notifySpanEnd(e){this.writers.forEach(t=>t.onSpanEnd(e))}_notifySpanUpdate(e){this.writers.forEach(t=>t.onSpanUpdate?.(e))}_notifyEvent(e,t){this.writers.forEach(n=>n.onEvent?.(e,t))}_notifySpanStart(e){this.writers.forEach(t=>t.onSpanStart(e))}_shouldLog(e){return qn[e]>=qn[this._minLevel]}},Yn=class e{data;tracer;ended=!1;constructor(e,t){this.data=e,this.tracer=t}startSpan(t,n){let r={traceId:this.data.traceId,spanId:crypto.randomUUID(),parentSpanId:this.data.spanId,name:t,type:n?.type,startTime:performance.now(),status:`ok`,attributes:{},events:[]};return this.tracer._notifySpanStart(r),new e(r,this.tracer)}end(e=`ok`){this.ended||(this.ended=!0,this.data.endTime=performance.now(),this.data.status=e,this.tracer._notifySpanEnd(this.data))}addEvent(e,t,n){if(this.ended||!this.tracer._shouldLog(t))return;let r={name:e,timestamp:performance.now(),level:t,attributes:n};this.data.events.push(r),this.tracer._notifyEvent(this.data,r)}debug(e,t){this.addEvent(e,`debug`,t)}info(e,t){this.addEvent(e,`info`,t)}warn(e,t){this.addEvent(e,`warn`,t)}error(e,t){this.addEvent(e,`error`,t)}setAttribute(e,t){this.ended||(this.data.attributes[e]=t,this.tracer._notifySpanUpdate(this.data))}setAttributes(e){this.ended||(Object.assign(this.data.attributes,e),this.tracer._notifySpanUpdate(this.data))}setResult(e){this.ended||(this.data.result=e,this.tracer._notifySpanUpdate(this.data))}};const Xn={debug:0,info:1,warn:2,error:3};var Zn=class{minLevel;showInternal;showTimestamp;showDuration;markdown;output;spans=new Map;visibleDepths=new Map;constructor(e={}){this.minLevel=e.minLevel??`info`,this.showInternal=e.showInternal??!1,this.showTimestamp=e.showTimestamp??!0,this.showDuration=e.showDuration??!0,this.markdown=e.markdown??!1,this.output=e.output??console.log}shouldShowEvent(e){return Xn[e]>=Xn[this.minLevel]}isSpanVisible(e){return!(e.type===`internal`&&!this.showInternal)}findVisibleAncestor(e){let t=e.parentSpanId;for(;t;){let e=this.spans.get(t);if(!e)break;if(this.isSpanVisible(e))return e;t=e.parentSpanId}return null}calculateVisibleDepth(e){if(!this.isSpanVisible(e))return-1;let t=this.findVisibleAncestor(e);return t?(this.visibleDepths.get(t.spanId)??0)+1:0}formatTimestamp(){if(!this.showTimestamp)return``;let e=new Date;return`[${e.toTimeString().slice(0,8)}.${e.getMilliseconds().toString().padStart(3,`0`)}] `}formatDuration(e){if(!this.showDuration||!e.endTime)return``;let t=e.endTime-e.startTime;return t<1e3?` (${Math.round(t)}ms)`:` (${(t/1e3).toFixed(2)}s)`}formatIndent(e){return` `.repeat(e)}formatSpanName(e){return e.type?`[${e.type}] ${e.name}`:e.name}renderMarkdown(e){return Qn(e).trimEnd()}onSpanStart(e){if(this.spans.set(e.spanId,e),!this.isSpanVisible(e))return;let t=this.calculateVisibleDepth(e);this.visibleDepths.set(e.spanId,t);let n=this.formatIndent(t),r=this.formatTimestamp(),i=this.formatSpanName(e);this.output(`${r}${n}START ${i}`)}onSpanEnd(e){if(this.spans.set(e.spanId,e),!this.isSpanVisible(e))return;let t=this.visibleDepths.get(e.spanId)??0,n=this.formatIndent(t),r=this.formatTimestamp(),i=this.formatDuration(e),a=this.formatSpanName(e),o=e.status===`error`?` [ERROR]`:``;if(this.output(`${r}${n}END ${a}${i}${o}`),e.result?.kind===`llm`){let t=e.result,i=[`model=${t.model}`];if(t.finishReason&&i.push(`finishReason=${t.finishReason}`),t.usage&&(t.usage.inputTokens!==void 0&&i.push(`inputTokens=${t.usage.inputTokens}`),t.usage.outputTokens!==void 0&&i.push(`outputTokens=${t.usage.outputTokens}`),t.usage.cachedInputTokens!==void 0&&i.push(`cachedInputTokens=${t.usage.cachedInputTokens}`),t.usage.cacheWriteInputTokens!==void 0&&i.push(`cacheWriteInputTokens=${t.usage.cacheWriteInputTokens}`),t.usage.reasoningOutputTokens!==void 0&&i.push(`reasoningOutputTokens=${t.usage.reasoningOutputTokens}`)),this.output(`${r}${n} INFO LLM complete ${i.join(` `)}`),this.shouldShowEvent(`debug`)&&t.response.content){let e=(typeof t.response.content==`string`?t.response.content:JSON.stringify(t.response.content,null,2)).split(`
18
+ `);for(let t of e)this.output(`${r}${n} DEBUG ${t}`)}}}onSpanUpdate(e){this.spans.set(e.spanId,e)}onEvent(e,t){if(!this.shouldShowEvent(t.level))return;this.spans.set(e.spanId,e);let n;if(this.isSpanVisible(e))n=this.visibleDepths.get(e.spanId)??0;else{let t=this.findVisibleAncestor(e);n=t?this.visibleDepths.get(t.spanId)??0:0}let r=this.formatIndent(n+1),i=this.formatTimestamp(),a=t.level.toUpperCase().padEnd(5),o=this.markdown&&t.attributes?.markdown===!0,s=t.attributes?Object.entries(t.attributes).filter(([e])=>e!==`markdown`):[],c=t.name;o&&(c=this.renderMarkdown(c));let l=`${i}${r}${a} ${c}`;if(s.length>0){let e=s.map(([e,t])=>`${e}=${JSON.stringify(t)}`).join(` `);l+=` ${e}`}this.output(l)}};function Qn(e){return $n(T.lexer(e))}function $n(e=[]){return e.map(e=>er(e)).filter(e=>e.length>0).join(`
19
+ `)}function er(e){switch(e.type){case`space`:return``;case`heading`:return w.bold($(e.tokens));case`paragraph`:return $(e.tokens);case`blockquote`:return or($n(e.tokens),`> `);case`code`:return(e.lang?w.dim(`${e.lang}\n`):``)+w.yellow(e.text);case`list`:return nr(e)?ir(e):e.raw;case`hr`:return w.dim(`-`.repeat(40));case`table`:return rr(e)?ar(e):e.raw;case`html`:return e.text;case`text`:return e.tokens?$(e.tokens):cr(e.text);default:return`tokens`in e&&e.tokens?$(e.tokens):e.raw}}function $(e=[]){return e.map(e=>tr(e)).join(``)}function tr(e){switch(e.type){case`text`:case`escape`:return cr(e.text);case`strong`:return w.bold($(e.tokens));case`em`:return w.italic($(e.tokens));case`codespan`:return w.yellow(e.text);case`del`:return w.strikethrough($(e.tokens));case`link`:{let t=$(e.tokens);return e.href&&e.href!==e.text?`${w.blue.underline(t)} ${w.dim(`(${e.href})`)}`:w.blue.underline(t)}case`image`:return e.text?`${e.text} (${e.href})`:e.href;case`br`:return`
20
+ `;case`html`:return e.text;default:return`tokens`in e&&e.tokens?$(e.tokens):e.raw}}function nr(e){return e.type===`list`&&`items`in e&&Array.isArray(e.items)}function rr(e){return e.type===`table`&&`header`in e&&`rows`in e}function ir(e){return e.items.map((t,n)=>{let r=e.ordered?`${Number(e.start||1)+n}. `:`- `,i=t.task?`[${t.checked?`x`:` `}] `:``,a=$n(t.tokens).trimEnd();return r+i+sr(a,r.length+i.length)}).join(`
21
+ `)}function ar(e){let t=e.header.map(e=>$(e.tokens)).join(` | `),n=e.rows.map(e=>e.map(e=>$(e.tokens)).join(` | `));return[w.bold(t),...n].join(`
22
+ `)}function or(e,t){return e.split(`
23
+ `).map(e=>t+e).join(`
24
+ `)}function sr(e,t){let[n=``,...r]=e.split(`
25
+ `);if(r.length===0)return n;let i=` `.repeat(t);return[n,...r.map(e=>i+e)].join(`
26
+ `)}function cr(e){return e.replace(/&quot;/g,`"`).replace(/&#39;/g,`'`).replace(/&lt;/g,`<`).replace(/&gt;/g,`>`).replace(/&amp;/g,`&`)}var lr=class{provider;model;enableTools;lastStore;lastName;lastScope;constructor(e){this.provider=e.provider,this.model=e.model,this.enableTools=e.enableTools??!1}async recall(e){let t=e.tracer?.startSpan(`memory.recall`,{type:`internal`});this.lastStore=e.store,this.lastName=e.name,this.lastScope=e.scope;let n=await this.loadStore(e.store,e.name,e.scope);if(n.instructions.length===0)return t?.info(`no stored instructions`),t?.end(),{};t?.info(`loaded instructions`,{count:n.instructions.length});let r=n.instructions.map((e,t)=>`${t+1}. ${e}`).join(`
27
+ `);return t?.end(),{systemSuffix:`## Learned Instructions\n\n${r}`}}async record(e){if(!e.newMessages||e.newMessages.length===0)return;let t=e.tracer?.startSpan(`memory.record`,{type:`internal`}),n=this.formatMessages(e.newMessages);if(!n.trim()){t?.info(`no text content to extract from`),t?.end();return}let r=t?.startSpan(`memory.extract`,{type:`llm`}),i=await sn({provider:this.provider,model:this.model,messages:[{role:`user`,content:n}],system:`You are a memory extraction system. Your job is to extract learnings from a conversation that should be remembered for future runs.
28
+
29
+ Only extract:
30
+ - Explicit user corrections (e.g., "No, always use bullet points")
31
+ - Stated preferences (e.g., "I prefer concise summaries")
32
+ - Patterns that clearly emerged from user feedback
33
+
34
+ Do NOT extract:
35
+ - General knowledge or facts from the conversation content
36
+ - Inferences or speculation about what the user might want
37
+ - Task-specific details that won't apply to future runs
38
+
39
+ Respond with a JSON array of instruction strings. Each instruction should be a clear, actionable directive.
40
+ If there are no learnings to extract, respond with an empty array: []
41
+
42
+ Example response:
43
+ ["Always use bullet points for lists", "Keep summaries under 3 sentences"]`,tracer:r});if(!i.ok){t?.warn(`extraction failed`,{error:i.error}),t?.end();return}let a=V(i.final.content);if(!a){t?.end();return}let o=this.parseInstructions(a);if(o.length===0){t?.info(`no instructions extracted`),t?.end();return}let s=await this.loadStore(e.store,e.name,e.scope);s.instructions.push(...o),await this.saveStore(e.store,e.name,e.scope,s),t?.info(`saved instructions`,{count:o.length}),t?.end()}tools(){if(!this.enableTools)return[];let e=this;return[{name:`add_instruction`,description:`Save a learned instruction for future runs. Use this when the user explicitly asks you to remember something.`,schema:r.object({instruction:r.string().describe(`The instruction to remember`)}),async execute(t){if(!e.lastStore)return`Error: memory not initialized (no recall has been called yet)`;let n=await e.loadStore(e.lastStore,e.lastName,e.lastScope);return n.instructions.push(t.instruction),await e.saveStore(e.lastStore,e.lastName,e.lastScope,n),`Instruction saved: "${t.instruction}"`}}]}formatMessages(e){let t=[];for(let n of e)if(n.role===`user`){let e=typeof n.content==`string`?n.content:V(n.content);e&&t.push(`User: ${e}`)}else if(n.role===`assistant`){let e=V(n.content);e&&t.push(`Assistant: ${e}`)}return t.join(`
44
+
45
+ `)}parseInstructions(e){let t=e.trim(),n=t.match(/^```(?:json)?\s*\n?([\s\S]*?)\n?\s*```$/);n&&(t=n[1].trim());try{let e=JSON.parse(t);if(Array.isArray(e)&&e.every(e=>typeof e==`string`))return e}catch{}return[]}getStorePath(e,t){let n=e??`default`,r=n;if(t&&Object.keys(t).length>0){let e=Object.entries(t).sort(([e],[t])=>e.localeCompare(t)).map(([e,t])=>`${e}=${t}`).join(`&`);r=`${n}-${E.createHash(`sha256`).update(e).digest(`hex`).slice(0,8)}`}return`memory/procedural/${r}.json`}async loadStore(e,t,n){let r=this.getStorePath(t,n),i=await e.read(r);if(i)try{let e=JSON.parse(i);if(e&&Array.isArray(e.instructions))return{instructions:e.instructions}}catch{}return{instructions:[]}}async saveStore(e,t,n,r){if(!r)return;let i=this.getStorePath(t,n);await e.write(i,JSON.stringify(r,null,2))}};export{W as A,Oe as C,ve as D,xe as E,O as F,D as I,te as M,A as N,pe as O,k as P,ke as S,Ce as T,Je as _,zn as a,Me as b,In as c,On as d,sn as f,_t as g,Rt as h,Kn as i,ae as j,le as k,jn as l,an as m,Zn as n,Rn as o,on as p,Jn as r,Ln as s,lr as t,An as u,He as v,we as w,je as x,Le as y};
package/dist/cli.js CHANGED
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
- import{_ as e,a as t,b as n,c as r,d as i,g as a,h as o,i as s,l as c,m as l,n as u,o as d,r as f,s as p,t as m,u as h,v as g,y as _}from"./ProceduralMemory-9bDT803s.js";import{i as v,s as y,t as b}from"./models-DlE4tfcj.js";import{z as x}from"zod";import{appendFile as S,mkdir as C,readFile as w}from"node:fs/promises";import{basename as T,dirname as ee,extname as te}from"node:path";import{glob as E}from"glob";import{createHash as D}from"node:crypto";import{Command as ne}from"@commander-js/extra-typings";import O from"yaml";import{createInterface as re}from"node:readline";var ie=`0.16.3`;x.object({value:x.string()});const ae=x.object({"api-key":x.string(),rateLimit:x.number().optional()});x.object({timeout:x.number().optional(),maxBuffer:x.number().optional(),cwd:x.string().optional()});const oe=x.object({type:x.literal(`chatcompletions`)}).loose(),se=x.object({type:x.literal(`anthropic`)}).loose(),ce=x.object({type:x.literal(`openai`)}).loose(),le=x.object({type:x.literal(`gemini`)}).loose(),ue=x.discriminatedUnion(`type`,[oe,se,ce,le]),de=x.object({chatcompletions:x.custom().optional(),anthropic:x.custom().optional(),openai:x.custom().optional(),gemini:x.custom().optional(),brave:ae.optional()}).loose(),fe=x.object({transport:x.literal(`stdio`),name:x.string().optional(),command:x.string(),args:x.array(x.string()).optional(),env:x.record(x.string(),x.string()).optional()}),pe=x.object({transport:x.literal(`http`),name:x.string().optional(),url:x.string(),headers:x.record(x.string(),x.string()).optional()}),me=x.discriminatedUnion(`transport`,[fe,pe]),he=x.object({files:x.string(),resume:x.boolean().default(!1),concurrency:x.number().int().positive().default(3)}),k=x.object({name:x.string().optional(),provider:ue,task:x.string(),tools:x.array(x.string()).optional(),provider_tools:x.array(x.string()).optional(),files:x.array(x.string()).optional(),mcps:x.array(me).optional(),batch:he.optional()}),A=[`yaml`,`yml`,`json`];async function j(e,t){let{tracer:n}=t,{content:r,format:i,path:a}=await g(e,{defaults:{name:`axle.job`,formats:A},tag:`Job File`}),o=null;if(i===`json`)o=JSON.parse(r);else if(i===`yaml`||i===`yml`)o=O.parse(r);else throw Error(`Invalid job file format`);n?.debug(`Job config: `+JSON.stringify(o,null,2));let s=k.safeParse(o);if(!s.success)throw Error(`The job file is not valid:\n${P(s.error)}`);return s.data.name||(s.data.name=T(a,te(a))),s.data}const M=[`yaml`,`yml`,`json`];async function N(e,t){let{tracer:n}=t,{content:r,format:i}=await g(e,{defaults:{name:`axle.config`,formats:M},tag:`Config File`}),a=null;if(i===`json`)a=JSON.parse(r);else if(i===`yaml`||i===`yml`)a=O.parse(r);else throw Error(`Invalid config file format`);n?.debug(`Service config: `+JSON.stringify(a,null,2));let o=de.safeParse(a);if(!o.success)throw Error(`The config file is not valid:\n${P(o.error)}`);return o.data}function P(e){return e.issues.map(e=>` - ${e.path.join(`.`)||`root`}: ${e.message}`).join(`
3
- `)}async function F(e,t){let n=[];for(let r of e){let e=new s(r);await e.connect({tracer:t}),n.push(e)}return n}async function I(e,t){for(let n of e)try{await n.close({tracer:t})}catch{}}const L=`.axle/batch.jsonl`;function R(e,t){let n=D(`sha256`);return n.update(e),n.update(`\0`),n.update(t),n.digest(`hex`)}async function ge(e=L){let t=new Map,n;try{n=await w(e,`utf-8`)}catch{return t}for(let e of n.split(`
4
- `)){let n=e.trim();if(n)try{let e=JSON.parse(n);e.file&&e.hash&&t.set(e.file,e)}catch{}}return t}async function _e(e,t=L){await C(ee(t),{recursive:!0}),await S(t,JSON.stringify(e)+`
5
- `,`utf-8`)}async function ve(t,r,i,a,o,s,c,l,u,d,f){let p=new _(t.task);if(t.files)for(let n of t.files)p.addFile(await e(n));let m=d.startSpan(`job`,{type:`workflow`}),h=new n({provider:r,model:i,tools:a,providerTools:o,mcps:s,tracer:m,name:t.name,memory:f});try{let e=await h.send(p.withInputs(c)).final;if(u.in+=e.usage.in,u.out+=e.usage.out,e.response){let t=typeof e.response==`string`?e.response:JSON.stringify(e.response,null,2);d.info(t,{markdown:!0})}l.interactive&&await ye(h,u,d),m.end()}catch(e){let t=e instanceof Error?e.message:String(e);throw m.error(t),m.end(`error`),e}}async function ye(e,t,n){let r=re({input:process.stdin,output:process.stdout});r.on(`SIGINT`,()=>{r.close()});let i=e=>new Promise(t=>{r.question(e,t),r.once(`close`,()=>t(null))});try{for(;;){let r=await i(`
6
- > `);if(r===null||r.trim()===``)break;try{let i=await e.send(r.trim()).final;if(t.in+=i.usage.in,t.out+=i.usage.out,i.response){let e=typeof i.response==`string`?i.response:JSON.stringify(i.response,null,2);n.info(e,{markdown:!0})}}catch(e){let t=e instanceof Error?e.message:String(e);n.error(t)}}}finally{r.close()}}async function be(t,r,i,a,o,s,c,l,u,d,f){let p=t.batch,m=await E(p.files);if(m.length===0){d.warn(`No files matched pattern: ${p.files}`);return}d.info(`Batch: ${m.length} file(s) matched "${p.files}"`);let h=p.resume?await ge():new Map,g=t.files?await Promise.all(t.files.map(t=>e(t))):[],v=0,y=0,b=0;await xe(p.concurrency??3,m,async l=>{let m=d.startSpan(`batch:${l}`,{type:`workflow`});try{let d=await w(l),b=R(t.task,d),x=h.get(l);if(p.resume&&x&&x.hash===b){m.info(`Skipped (already completed)`),m.end(),y++;return}let S=new _(t.task);for(let e of g)S.addFile(e);S.addFile(await e(l));let C={...c,file:l},T=await new n({provider:r,model:i,tools:a,providerTools:o,mcps:s,tracer:m,name:t.name,memory:f}).send(S.withInputs(C)).final;u.in+=T.usage.in,u.out+=T.usage.out,await _e({file:l,hash:b,timestamp:Date.now()}),m.end(),v++}catch(e){let t=e instanceof Error?e.message:String(e);m.error(`Failed: ${t}`),m.end(`error`),b++}}),d.info(`Batch complete: ${v} completed, ${y} skipped, ${b} failed`)}async function xe(e,t,n){let r=0;async function i(){for(;r<t.length;)await n(t[r++])}let a=Array.from({length:Math.min(e,t.length)},()=>i());await Promise.all(a)}function Se(e,n){switch(e){case`brave`:{let e=n?.brave;return e&&h.configure(e),h}case`calculator`:return c;case`exec`:{let e=n?.exec;return e&&r.configure(e),r}case`patch-file`:return p;case`read-file`:return d;case`write-file`:return t;default:throw Error(`Unknown tool: ${e}`)}}function Ce(e,t){return e.map(e=>Se(e,t))}const z=new ne().name(`axle`).description(`Axle is a CLI tool for running AI workflows`).version(ie).option(`-c, --config <path>`,`Path to the config file`).option(`-j, --job <path>`,`Path to the job file`).option(`--no-log`,`Do not write the output to a log file`).option(`-d, --debug`,`Print additional debug information`).option(`-i, --interactive`,`Continue the conversation interactively after the initial task`).option(`--args <args...>`,`Additional arguments in the form key=value`);z.parse(process.argv);const B=z.opts(),V={date:new Date().toISOString().split(`T`)[0],datetime:new Date().toISOString(),cwd:process.cwd()};B.args&&B.args.forEach(e=>{let[t,n]=e.split(`=`);t&&n&&(V[t.trim()]=n.trim())});const H=new f;B.debug&&(H.minLevel=`debug`);const U=new u({minLevel:B.debug?`debug`:`info`,showInternal:B.debug,showTimestamp:!0,markdown:!0});if(H.addWriter(U),B.log){let e=new u({minLevel:`debug`,showInternal:!0,showTimestamp:!0,output:e=>{}});H.addWriter(e)}const W=H.startSpan(`cli`,{type:`root`});process.on(`uncaughtException`,async e=>{console.error(`Uncaught exception:`),console.error(e),W.error(`Uncaught exception:`),W.error(e.message),W.error(e.stack||``),W.end(`error`),await H.flush(),process.exit(1)}),B.debug&&(W.debug(`Options: `+JSON.stringify(B,null,2)),W.debug(`Additional Arguments: `+JSON.stringify(V,null,2)));let G,K;try{G=await N(B.config??null,{tracer:W}),K=await j(B.job??null,{tracer:W})}catch(e){let t=e instanceof Error?e:Error(String(e));W.error(t.message),W.debug(t.stack??``),W.end(`error`),await H.flush(),z.outputHelp(),process.exit(1)}let q,J;try{let{type:e,...t}=K.provider;switch(e){case`openai`:{let e={...G.openai,...t},n=e[`api-key`];if(!n)throw Error(`The provider openai is not configured. Please check your configuration.`);let r={"api-key":n,model:e.model};q=i(r[`api-key`]),J=r.model||b;break}case`anthropic`:{let e={...G.anthropic,...t},n=e[`api-key`];if(!n)throw Error(`The provider anthropic is not configured. Please check your configuration.`);let r={"api-key":n,model:e.model};q=a(r[`api-key`]),J=r.model||y;break}case`gemini`:{let e={...G.gemini,...t},n=e[`api-key`];if(!n)throw Error(`The provider gemini is not configured. Please check your configuration.`);let r={"api-key":n,model:e.model};q=l(r[`api-key`]),J=r.model||v;break}case`chatcompletions`:{let e={...G.chatcompletions,...t},n=e[`base-url`],r=e.model;if(!n||!r)throw Error(`The provider chatcompletions is not configured. Please check your configuration.`);let i={"base-url":n,model:r,"api-key":e[`api-key`]};q=o(i[`base-url`],i[`api-key`]),J=i.model;break}}}catch(e){let t=e instanceof Error?e:Error(String(e));W.error(t.message),W.error(t.stack??``),W.end(`error`),await H.flush(),z.outputHelp(),process.exit(1)}W.info(`All systems operational. Running job...`);const Y=new m({provider:q,model:J}),X=(K.provider_tools??[]).map(e=>({type:`provider`,name:e})),Z=K.tools?.length?Ce(K.tools):[];let Q=[];if(K.mcps?.length)try{Q=await F(K.mcps,W)}catch(e){let t=e instanceof Error?e:Error(String(e));W.error(`Failed to connect MCP servers: `+t.message),W.end(`error`),await H.flush(),process.exit(1)}const $={in:0,out:0},we=performance.now();try{K.batch?await be(K,q,J,Z,X,Q,V,B,$,W,Y):await ve(K,q,J,Z,X,Q,V,B,$,W,Y)}catch(e){let t=e instanceof Error?e:Error(String(e));W.error(t.message),W.debug(t.stack??``)}finally{Q.length>0&&await I(Q,W)}const Te=performance.now()-we;W.info(`Total run time: ${Math.round(Te)}ms`),W.info(`Input tokens: ${$.in}`),W.info(`Output tokens: ${$.out}`),W.info(`Complete. Goodbye`),W.end(),await H.flush();export{};
2
+ import{A as e,_ as t,a as n,c as r,d as i,g as a,h as o,i as s,k as c,l,m as u,n as d,o as f,r as p,s as m,t as h,u as g,v as _,x as v,y}from"./ProceduralMemory-DI4cTlDN.js";import{i as b,s as x,t as S}from"./models-DnS0bPB-.js";import{z as C}from"zod";import{appendFile as w,mkdir as ee,readFile as T}from"node:fs/promises";import{basename as te,dirname as ne,extname as re}from"node:path";import{glob as ie}from"glob";import{createHash as ae}from"node:crypto";import{Command as oe}from"@commander-js/extra-typings";import E from"yaml";import{createInterface as se}from"node:readline";var ce=`0.18.0`;C.object({value:C.string()});const D=C.object({"api-key":C.string(),rateLimit:C.number().optional()});C.object({timeout:C.number().optional(),maxBuffer:C.number().optional(),cwd:C.string().optional()});const le=C.object({type:C.literal(`chatcompletions`)}).loose(),ue=C.object({type:C.literal(`anthropic`)}).loose(),de=C.object({type:C.literal(`openai`)}).loose(),fe=C.object({type:C.literal(`gemini`)}).loose(),pe=C.discriminatedUnion(`type`,[le,ue,de,fe]),me=C.object({chatcompletions:C.custom().optional(),anthropic:C.custom().optional(),openai:C.custom().optional(),gemini:C.custom().optional(),brave:D.optional()}).loose(),he=C.object({transport:C.literal(`stdio`),name:C.string().optional(),command:C.string(),args:C.array(C.string()).optional(),env:C.record(C.string(),C.string()).optional()}),ge=C.object({transport:C.literal(`http`),name:C.string().optional(),url:C.string(),headers:C.record(C.string(),C.string()).optional()}),O=C.discriminatedUnion(`transport`,[he,ge]),k=C.object({files:C.string(),resume:C.boolean().default(!1),concurrency:C.number().int().positive().default(3)}),A=C.object({name:C.string().optional(),provider:pe,task:C.string(),tools:C.array(C.string()).optional(),provider_tools:C.array(C.string()).optional(),files:C.array(C.string()).optional(),mcps:C.array(O).optional(),batch:k.optional()}),j=[`yaml`,`yml`,`json`];async function M(e,t){let{tracer:n}=t,{content:r,format:i,path:a}=await _(e,{defaults:{name:`axle.job`,formats:j},tag:`Job File`}),o=null;if(i===`json`)o=JSON.parse(r);else if(i===`yaml`||i===`yml`)o=E.parse(r);else throw Error(`Invalid job file format`);n?.debug(`Job config: `+JSON.stringify(o,null,2));let s=A.safeParse(o);if(!s.success)throw Error(`The job file is not valid:\n${F(s.error)}`);return s.data.name||(s.data.name=te(a,re(a))),s.data}const N=[`yaml`,`yml`,`json`];async function P(e,t){let{tracer:n}=t,{content:r,format:i}=await _(e,{defaults:{name:`axle.config`,formats:N},tag:`Config File`}),a=null;if(i===`json`)a=JSON.parse(r);else if(i===`yaml`||i===`yml`)a=E.parse(r);else throw Error(`Invalid config file format`);n?.debug(`Service config: `+JSON.stringify(a,null,2));let o=me.safeParse(a);if(!o.success)throw Error(`The config file is not valid:\n${F(o.error)}`);return o.data}function F(e){return e.issues.map(e=>` - ${e.path.join(`.`)||`root`}: ${e.message}`).join(`
3
+ `)}async function I(e,t){let n=[];for(let r of e){let e=new s(r);await e.connect({tracer:t}),n.push(e)}return n}async function L(e,t){for(let n of e)try{await n.close({tracer:t})}catch{}}const R=`.axle/batch.jsonl`;function _e(e,t){let n=ae(`sha256`);return n.update(e),n.update(`\0`),n.update(t),n.digest(`hex`)}async function ve(e=R){let t=new Map,n;try{n=await T(e,`utf-8`)}catch{return t}for(let e of n.split(`
4
+ `)){let n=e.trim();if(n)try{let e=JSON.parse(n);e.file&&e.hash&&t.set(e.file,e)}catch{}}return t}async function z(e,t=R){await ee(ne(t),{recursive:!0}),await w(t,JSON.stringify(e)+`
5
+ `,`utf-8`)}async function ye(e,n,r,i,a,o,s,l,u,d,f){let p=new y({prompt:e.task});if(e.files)for(let n of e.files)p.addFile(await t(n));let m=d.startSpan(`job`,{type:`workflow`}),h=new v({provider:n,model:r,tools:i,providerTools:a,mcps:o,tracer:m,name:e.name,memory:f});try{let e=await h.send(p.withInputs(s)).final;if(c(u,e.usage),e.response){let t=e.response;d.info(t,{markdown:!0})}l.interactive&&await be(h,u,d),m.end()}catch(e){let t=e instanceof Error?e.message:String(e);throw m.error(t),m.end(`error`),e}}async function be(e,t,n){let r=se({input:process.stdin,output:process.stdout});r.on(`SIGINT`,()=>{r.close()});let i=e=>new Promise(t=>{r.question(e,t),r.once(`close`,()=>t(null))});try{for(;;){let r=await i(`
6
+ > `);if(r===null||r.trim()===``)break;try{let i=await e.send(r.trim()).final;if(c(t,i.usage),i.response){let e=i.response;n.info(e,{markdown:!0})}}catch(e){let t=e instanceof Error?e.message:String(e);n.error(t)}}}finally{r.close()}}async function xe(e,n,r,i,a,o,s,l,u,d,f){let p=e.batch,m=await ie(p.files);if(m.length===0){d.warn(`No files matched pattern: ${p.files}`);return}d.info(`Batch: ${m.length} file(s) matched "${p.files}"`);let h=p.resume?await ve():new Map,g=e.files?await Promise.all(e.files.map(e=>t(e))):[],_=0,b=0,x=0;await Se(p.concurrency??3,m,async l=>{let m=d.startSpan(`batch:${l}`,{type:`workflow`});try{let d=await T(l),x=_e(e.task,d),S=h.get(l);if(p.resume&&S&&S.hash===x){m.info(`Skipped (already completed)`),m.end(),b++;return}let C=new y({prompt:e.task});for(let e of g)C.addFile(e);C.addFile(await t(l));let w={...s,file:l};c(u,(await new v({provider:n,model:r,tools:i,providerTools:a,mcps:o,tracer:m,name:e.name,memory:f}).send(C.withInputs(w)).final).usage),await z({file:l,hash:x,timestamp:Date.now()}),m.end(),_++}catch(e){let t=e instanceof Error?e.message:String(e);m.error(`Failed: ${t}`),m.end(`error`),x++}}),d.info(`Batch complete: ${_} completed, ${b} skipped, ${x} failed`)}async function Se(e,t,n){let r=0;async function i(){for(;r<t.length;)await n(t[r++])}let a=Array.from({length:Math.min(e,t.length)},()=>i());await Promise.all(a)}function Ce(e,t){switch(e){case`brave`:{let e=t?.brave;return e&&g.configure(e),g}case`calculator`:return l;case`exec`:{let e=t?.exec;return e&&r.configure(e),r}case`patch-file`:return m;case`read-file`:return f;case`write-file`:return n;default:throw Error(`Unknown tool: ${e}`)}}function we(e,t){return e.map(e=>Ce(e,t))}const B=new oe().name(`axle`).description(`Axle is a CLI tool for running AI workflows`).version(ce).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`);B.parse(process.argv);const V=B.opts(),H={date:new Date().toISOString().split(`T`)[0],datetime:new Date().toISOString(),cwd:process.cwd()};V.args&&V.args.forEach(e=>{let[t,n]=e.split(`=`);t&&n&&(H[t.trim()]=n.trim())});const U=new p;V.debug&&(U.minLevel=`debug`);const Te=new d({minLevel:V.debug?`debug`:`info`,showInternal:V.debug,showTimestamp:!0,markdown:!0});if(U.addWriter(Te),V.log){let e=new d({minLevel:`debug`,showInternal:!0,showTimestamp:!0,output:e=>{}});U.addWriter(e)}const W=U.startSpan(`cli`,{type:`root`});process.on(`uncaughtException`,async e=>{console.error(`Uncaught exception:`),console.error(e),W.error(`Uncaught exception:`),W.error(e.message),W.error(e.stack||``),W.end(`error`),await U.flush(),process.exit(1)}),V.debug&&(W.debug(`Options: `+JSON.stringify(V,null,2)),W.debug(`Additional Arguments: `+JSON.stringify(H,null,2)));let G,K;try{G=await P(V.config??null,{tracer:W}),K=await M(V.job??null,{tracer:W})}catch(e){let t=e instanceof Error?e:Error(String(e));W.error(t.message),W.debug(t.stack??``),W.end(`error`),await U.flush(),B.outputHelp(),process.exit(1)}let q,J;try{let{type:e,...t}=K.provider;switch(e){case`openai`:{let e={...G.openai,...t},n=e[`api-key`];if(!n)throw Error(`The provider openai is not configured. Please check your configuration.`);let r={"api-key":n,model:e.model};q=i(r[`api-key`]),J=r.model||S;break}case`anthropic`:{let e={...G.anthropic,...t},n=e[`api-key`];if(!n)throw Error(`The provider anthropic is not configured. Please check your configuration.`);let r={"api-key":n,model:e.model};q=a(r[`api-key`]),J=r.model||x;break}case`gemini`:{let e={...G.gemini,...t},n=e[`api-key`];if(!n)throw Error(`The provider gemini is not configured. Please check your configuration.`);let r={"api-key":n,model:e.model};q=u(r[`api-key`]),J=r.model||b;break}case`chatcompletions`:{let e={...G.chatcompletions,...t},n=e[`base-url`],r=e.model;if(!n||!r)throw Error(`The provider chatcompletions is not configured. Please check your configuration.`);let i={"base-url":n,model:r,"api-key":e[`api-key`]};q=o(i[`base-url`],i[`api-key`]),J=i.model;break}}}catch(e){let t=e instanceof Error?e:Error(String(e));W.error(t.message),W.error(t.stack??``),W.end(`error`),await U.flush(),B.outputHelp(),process.exit(1)}W.info(`All systems operational. Running job...`);const Y=new h({provider:q,model:J}),X=(K.provider_tools??[]).map(e=>({type:`provider`,name:e})),Z=K.tools?.length?we(K.tools):[];let Q=[];if(K.mcps?.length)try{Q=await I(K.mcps,W)}catch(e){let t=e instanceof Error?e:Error(String(e));W.error(`Failed to connect MCP servers: `+t.message),W.end(`error`),await U.flush(),process.exit(1)}const $=e(),Ee=performance.now();try{K.batch?await xe(K,q,J,Z,X,Q,H,V,$,W,Y):await ye(K,q,J,Z,X,Q,H,V,$,W,Y)}catch(e){let t=e instanceof Error?e:Error(String(e));W.error(t.message),W.debug(t.stack??``)}finally{Q.length>0&&await L(Q,W)}const De=performance.now()-Ee;W.info(`Total run time: ${Math.round(De)}ms`),W.info(`Input tokens: ${$.in}`),W.info(`Output tokens: ${$.out}`),$.cachedIn!==void 0&&W.info(`Cached input tokens: ${$.cachedIn}`),$.cacheWriteIn!==void 0&&W.info(`Cache write input tokens: ${$.cacheWriteIn}`),$.reasoningOut!==void 0&&W.info(`Reasoning output tokens: ${$.reasoningOut}`),W.info(`Complete. Goodbye`),W.end(),await U.flush();export{};