@directive-run/ai 1.4.0 → 1.6.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.
Files changed (50) hide show
  1. package/dist/anthropic.cjs +1 -1
  2. package/dist/anthropic.cjs.map +1 -1
  3. package/dist/anthropic.js +1 -1
  4. package/dist/anthropic.js.map +1 -1
  5. package/dist/{chunk-265ZKXYE.js → chunk-3PGRBK4E.js} +2 -2
  6. package/dist/chunk-3PGRBK4E.js.map +1 -0
  7. package/dist/{chunk-QXMXSHYS.cjs → chunk-KP3G32S7.cjs} +2 -2
  8. package/dist/chunk-KP3G32S7.cjs.map +1 -0
  9. package/dist/{chunk-5ERCL33C.js → chunk-Q3PQLWBR.js} +3 -3
  10. package/dist/chunk-Q3PQLWBR.js.map +1 -0
  11. package/dist/{chunk-K2LZMRLN.js → chunk-RW4R3O5P.js} +3 -3
  12. package/dist/{chunk-K2LZMRLN.js.map → chunk-RW4R3O5P.js.map} +1 -1
  13. package/dist/{chunk-KALRDVN5.cjs → chunk-X3VQ5F7D.cjs} +3 -3
  14. package/dist/{chunk-KALRDVN5.cjs.map → chunk-X3VQ5F7D.cjs.map} +1 -1
  15. package/dist/{chunk-L35IQAWD.cjs → chunk-XV2QSBBE.cjs} +7 -7
  16. package/dist/chunk-XV2QSBBE.cjs.map +1 -0
  17. package/dist/gemini.cjs +1 -1
  18. package/dist/gemini.cjs.map +1 -1
  19. package/dist/gemini.js +1 -1
  20. package/dist/gemini.js.map +1 -1
  21. package/dist/index.cjs +18 -18
  22. package/dist/index.cjs.map +1 -1
  23. package/dist/index.d.cts +50 -6
  24. package/dist/index.d.ts +50 -6
  25. package/dist/index.js +18 -18
  26. package/dist/index.js.map +1 -1
  27. package/dist/{multi-agent-orchestrator-675FR2HF.js → multi-agent-orchestrator-4PXNYRHB.js} +2 -2
  28. package/dist/{multi-agent-orchestrator-675FR2HF.js.map → multi-agent-orchestrator-4PXNYRHB.js.map} +1 -1
  29. package/dist/multi-agent-orchestrator-KFGTEGE5.cjs +2 -0
  30. package/dist/{multi-agent-orchestrator-SH5TRRS3.cjs.map → multi-agent-orchestrator-KFGTEGE5.cjs.map} +1 -1
  31. package/dist/ollama.cjs +2 -2
  32. package/dist/ollama.cjs.map +1 -1
  33. package/dist/ollama.js +1 -1
  34. package/dist/ollama.js.map +1 -1
  35. package/dist/openai.cjs +1 -1
  36. package/dist/openai.cjs.map +1 -1
  37. package/dist/openai.js +1 -1
  38. package/dist/openai.js.map +1 -1
  39. package/dist/{orchestrator-types-BmvoZgfO.d.cts → orchestrator-types-Bh8r3_Sq.d.cts} +1 -1
  40. package/dist/{orchestrator-types-D6gzobwg.d.ts → orchestrator-types-CTfIKk0W.d.ts} +1 -1
  41. package/dist/testing.cjs +1 -1
  42. package/dist/testing.d.cts +1 -1
  43. package/dist/testing.d.ts +1 -1
  44. package/dist/testing.js +1 -1
  45. package/package.json +2 -2
  46. package/dist/chunk-265ZKXYE.js.map +0 -1
  47. package/dist/chunk-5ERCL33C.js.map +0 -1
  48. package/dist/chunk-L35IQAWD.cjs.map +0 -1
  49. package/dist/chunk-QXMXSHYS.cjs.map +0 -1
  50. package/dist/multi-agent-orchestrator-SH5TRRS3.cjs +0 -2
@@ -1,3 +1,3 @@
1
- 'use strict';var chunkQXMXSHYS_cjs=require('./chunk-QXMXSHYS.cjs'),chunkW6MVJKWN_cjs=require('./chunk-W6MVJKWN.cjs');var K={"claude-sonnet-4-5-20250929":{input:3,output:15},"claude-sonnet-4-20250514":{input:3,output:15},"claude-haiku-4-5-20250514":{input:.8,output:4},"claude-haiku-3-5-20241022":{input:.8,output:4},"claude-opus-4-20250514":{input:15,output:75}};function L(h){let{apiKey:i,model:k="claude-sonnet-4-5-20250929",maxTokens:d=4096,baseURL:u="https://api.anthropic.com/v1",fetch:f=globalThis.fetch,timeoutMs:r,hooks:m,temperature:p,topP:c,stopSequences:o}=h;return chunkW6MVJKWN_cjs.d(u),chunkQXMXSHYS_cjs.c(i,"createAnthropicRunner"),chunkW6MVJKWN_cjs.e({fetch:f,hooks:m,buildRequest:(n,s,a)=>({url:`${u}/messages`,init:{method:"POST",headers:{"Content-Type":"application/json","x-api-key":i,"anthropic-version":"2023-06-01"},body:JSON.stringify({model:n.model??k,max_tokens:d,...p!=null?{temperature:p}:{},...c!=null?{top_p:c}:{},...o!=null?{stop_sequences:o}:{},system:n.instructions??"",messages:a.map(e=>({role:e.role,content:e.content}))}),...r!=null?{signal:AbortSignal.timeout(r)}:{}}}),parseResponse:async n=>{let s=await n.json(),a=s.content?.[0]?.text??"",e=s.usage?.input_tokens??0,l=s.usage?.output_tokens??0;return {text:a,totalTokens:e+l,inputTokens:e,outputTokens:l}}})}function N(h){let{apiKey:i,model:k="claude-sonnet-4-5-20250929",maxTokens:d=4096,baseURL:u="https://api.anthropic.com/v1",fetch:f=globalThis.fetch,hooks:r,temperature:m,topP:p,stopSequences:c}=h;return chunkW6MVJKWN_cjs.d(u),chunkQXMXSHYS_cjs.c(i,"createAnthropicStreamingRunner"),async(o,n,s)=>{let a=chunkQXMXSHYS_cjs.e(r,o,n);try{let e=await f(`${u}/messages`,{method:"POST",headers:{"Content-Type":"application/json","x-api-key":i,"anthropic-version":"2023-06-01"},body:JSON.stringify({model:o.model??k,max_tokens:d,...m!=null?{temperature:m}:{},...p!=null?{top_p:p}:{},...c!=null?{stop_sequences:c}:{},system:o.instructions??"",messages:[{role:"user",content:n}],stream:!0}),signal:s.signal});e.ok||await chunkQXMXSHYS_cjs.a(e,"Anthropic");let l=chunkQXMXSHYS_cjs.b(e),{fullText:R,inputTokens:b,outputTokens:S}=await chunkQXMXSHYS_cjs.d(l,s.onToken,t=>{if(t.type==="error")throw new Error(`[Directive] Anthropic stream error: ${t.error?.message??JSON.stringify(t.error)}`);let g={};return t.type==="content_block_delta"&&t.delta?.type==="text_delta"&&(g.text=t.delta.text),t.type==="message_delta"&&t.usage&&(g.outputTokens=t.usage.output_tokens??0),t.type==="message_start"&&t.message?.usage&&(g.inputTokens=t.message.usage.input_tokens??0),g},"Anthropic"),x={inputTokens:b,outputTokens:S},A=b+S;return s.onMessage?.({role:"assistant",content:R}),chunkQXMXSHYS_cjs.f(r,o,n,R,A,x,a),chunkQXMXSHYS_cjs.h(n,R,A,x)}catch(e){throw chunkQXMXSHYS_cjs.g(r,o,n,e,a),e}}}
1
+ 'use strict';var chunkKP3G32S7_cjs=require('./chunk-KP3G32S7.cjs'),chunkW6MVJKWN_cjs=require('./chunk-W6MVJKWN.cjs');var K={"claude-sonnet-4-5-20250929":{input:3,output:15},"claude-sonnet-4-20250514":{input:3,output:15},"claude-haiku-4-5-20250514":{input:.8,output:4},"claude-haiku-3-5-20241022":{input:.8,output:4},"claude-opus-4-20250514":{input:15,output:75}};function L(h){let{apiKey:i,model:k="claude-sonnet-4-5-20250929",maxTokens:d=4096,baseURL:u="https://api.anthropic.com/v1",fetch:f=globalThis.fetch,timeoutMs:r,hooks:m,temperature:p,topP:c,stopSequences:o}=h;return chunkW6MVJKWN_cjs.d(u),chunkKP3G32S7_cjs.c(i,"createAnthropicRunner"),chunkW6MVJKWN_cjs.e({fetch:f,hooks:m,buildRequest:(n,s,a)=>({url:`${u}/messages`,init:{method:"POST",headers:{"Content-Type":"application/json","x-api-key":i,"anthropic-version":"2023-06-01"},body:JSON.stringify({model:n.model??k,max_tokens:d,...p!=null?{temperature:p}:{},...c!=null?{top_p:c}:{},...o!=null?{stop_sequences:o}:{},system:n.instructions??"",messages:a.map(e=>({role:e.role,content:e.content}))}),...r!=null?{signal:AbortSignal.timeout(r)}:{}}}),parseResponse:async n=>{let s=await n.json(),a=s.content?.[0]?.text??"",e=s.usage?.input_tokens??0,l=s.usage?.output_tokens??0;return {text:a,totalTokens:e+l,inputTokens:e,outputTokens:l}}})}function N(h){let{apiKey:i,model:k="claude-sonnet-4-5-20250929",maxTokens:d=4096,baseURL:u="https://api.anthropic.com/v1",fetch:f=globalThis.fetch,hooks:r,temperature:m,topP:p,stopSequences:c}=h;return chunkW6MVJKWN_cjs.d(u),chunkKP3G32S7_cjs.c(i,"createAnthropicStreamingRunner"),async(o,n,s)=>{let a=chunkKP3G32S7_cjs.e(r,o,n);try{let e=await f(`${u}/messages`,{method:"POST",headers:{"Content-Type":"application/json","x-api-key":i,"anthropic-version":"2023-06-01"},body:JSON.stringify({model:o.model??k,max_tokens:d,...m!=null?{temperature:m}:{},...p!=null?{top_p:p}:{},...c!=null?{stop_sequences:c}:{},system:o.instructions??"",messages:[{role:"user",content:n}],stream:!0}),signal:s.signal});e.ok||await chunkKP3G32S7_cjs.a(e,"Anthropic");let l=chunkKP3G32S7_cjs.b(e),{fullText:R,inputTokens:b,outputTokens:S}=await chunkKP3G32S7_cjs.d(l,s.onToken,t=>{if(t.type==="error")throw new Error(`[Directive] Anthropic stream error: ${t.error?.message??JSON.stringify(t.error)}`);let g={};return t.type==="content_block_delta"&&t.delta?.type==="text_delta"&&(g.text=t.delta.text),t.type==="message_delta"&&t.usage&&(g.outputTokens=t.usage.output_tokens??0),t.type==="message_start"&&t.message?.usage&&(g.inputTokens=t.message.usage.input_tokens??0),g},"Anthropic"),x={inputTokens:b,outputTokens:S},A=b+S;return s.onMessage?.({role:"assistant",content:R}),chunkKP3G32S7_cjs.f(r,o,n,R,A,x,a),chunkKP3G32S7_cjs.h(n,R,A,x)}catch(e){throw chunkKP3G32S7_cjs.g(r,o,n,e,a),e}}}
2
2
  exports.ANTHROPIC_PRICING=K;exports.createAnthropicRunner=L;exports.createAnthropicStreamingRunner=N;//# sourceMappingURL=anthropic.cjs.map
3
3
  //# sourceMappingURL=anthropic.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/adapters/anthropic.ts"],"names":["ANTHROPIC_PRICING","createAnthropicRunner","options","apiKey","model","maxTokens","baseURL","fetchFn","timeoutMs","hooks","temperature","topP","stopSequences","validateBaseURL","warnIfMissingApiKey","createRunner","agent","_input","messages","m","res","data","text","inputTokens","outputTokens","createAnthropicStreamingRunner","input","callbacks","startTime","fireBeforeCallHook","response","throwStreamingHTTPError","reader","getSSEReader","fullText","parseSSEStream","event","result","tokenUsage","totalTokens","fireAfterCallHook","buildStreamingResult","err","fireErrorHook"],"mappings":"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","file":"anthropic.cjs","sourcesContent":["/**\n * @directive-run/ai/anthropic\n *\n * Anthropic adapter for Directive AI. Provides runners for the\n * Anthropic Messages API, including streaming support.\n *\n * @example\n * ```typescript\n * import { createAnthropicRunner, createAnthropicStreamingRunner } from '@directive-run/ai/anthropic';\n *\n * const runner = createAnthropicRunner({ apiKey: process.env.ANTHROPIC_API_KEY! });\n * ```\n */\n\nimport { createRunner, validateBaseURL } from \"../agent-utils.js\";\nimport type {\n AdapterHooks,\n AgentRunner,\n} from \"../types.js\";\nimport type { StreamingCallbackRunner } from \"../types.js\";\nimport {\n buildStreamingResult,\n fireAfterCallHook,\n fireBeforeCallHook,\n fireErrorHook,\n getSSEReader,\n parseSSEStream,\n throwStreamingHTTPError,\n warnIfMissingApiKey,\n} from \"./shared.js\";\n\n// ============================================================================\n// Pricing Constants\n// ============================================================================\n\n/**\n * Anthropic model pricing (USD per million tokens).\n *\n * Use with `estimateCost()` for per-call cost tracking:\n * ```typescript\n * import { estimateCost } from '@directive-run/ai';\n * import { ANTHROPIC_PRICING } from '@directive-run/ai/anthropic';\n *\n * const cost =\n * estimateCost(result.tokenUsage!.inputTokens, ANTHROPIC_PRICING[\"claude-sonnet-4-5-20250929\"].input) +\n * estimateCost(result.tokenUsage!.outputTokens, ANTHROPIC_PRICING[\"claude-sonnet-4-5-20250929\"].output);\n * ```\n *\n * **Note:** Pricing changes over time. These values are provided as a convenience\n * and may not reflect the latest rates. Always verify at https://anthropic.com/pricing\n */\nexport const ANTHROPIC_PRICING: Record<\n string,\n { input: number; output: number }\n> = {\n \"claude-sonnet-4-5-20250929\": { input: 3, output: 15 },\n \"claude-sonnet-4-20250514\": { input: 3, output: 15 },\n \"claude-haiku-4-5-20250514\": { input: 0.8, output: 4 },\n \"claude-haiku-3-5-20241022\": { input: 0.8, output: 4 },\n \"claude-opus-4-20250514\": { input: 15, output: 75 },\n};\n\n// ============================================================================\n// Anthropic Runner\n// ============================================================================\n\n/** Options for createAnthropicRunner */\nexport interface AnthropicRunnerOptions {\n apiKey: string;\n model?: string;\n /** @default 4096 */\n maxTokens?: number;\n baseURL?: string;\n fetch?: typeof globalThis.fetch;\n /** @default undefined */\n timeoutMs?: number;\n /** Lifecycle hooks for tracing, logging, and metrics */\n hooks?: AdapterHooks;\n /** Sampling temperature (0–1). Higher = more random. */\n temperature?: number;\n /** Nucleus sampling: top-P probability mass (0–1). */\n topP?: number;\n /** Custom stop sequences. The model will stop generating when it encounters one. */\n stopSequences?: string[];\n}\n\n/**\n * Create an AgentRunner for the Anthropic Messages API.\n *\n * Returns `tokenUsage` with input/output breakdown for cost tracking.\n *\n * @example\n * ```typescript\n * const runner = createAnthropicRunner({\n * apiKey: process.env.ANTHROPIC_API_KEY!,\n * hooks: {\n * onAfterCall: ({ durationMs, tokenUsage }) => {\n * console.log(`${durationMs}ms – ${tokenUsage.inputTokens}in/${tokenUsage.outputTokens}out`);\n * },\n * },\n * });\n * const orchestrator = createAgentOrchestrator({ runner });\n * const result = await orchestrator.run(agent, input);\n * ```\n */\nexport function createAnthropicRunner(\n options: AnthropicRunnerOptions,\n): AgentRunner {\n const {\n apiKey,\n model = \"claude-sonnet-4-5-20250929\",\n maxTokens = 4096,\n baseURL = \"https://api.anthropic.com/v1\",\n fetch: fetchFn = globalThis.fetch,\n timeoutMs,\n hooks,\n temperature,\n topP,\n stopSequences,\n } = options;\n\n validateBaseURL(baseURL);\n warnIfMissingApiKey(apiKey, \"createAnthropicRunner\");\n\n return createRunner({\n fetch: fetchFn,\n hooks,\n buildRequest: (agent, _input, messages) => ({\n url: `${baseURL}/messages`,\n init: {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"x-api-key\": apiKey,\n \"anthropic-version\": \"2023-06-01\",\n },\n body: JSON.stringify({\n model: agent.model ?? model,\n max_tokens: maxTokens,\n ...(temperature != null ? { temperature } : {}),\n ...(topP != null ? { top_p: topP } : {}),\n ...(stopSequences != null ? { stop_sequences: stopSequences } : {}),\n system: agent.instructions ?? \"\",\n messages: messages.map((m) => ({\n role: m.role,\n content: m.content,\n })),\n }),\n ...(timeoutMs != null\n ? { signal: AbortSignal.timeout(timeoutMs) }\n : {}),\n },\n }),\n parseResponse: async (res) => {\n const data = await res.json();\n const text = data.content?.[0]?.text ?? \"\";\n const inputTokens = data.usage?.input_tokens ?? 0;\n const outputTokens = data.usage?.output_tokens ?? 0;\n\n return {\n text,\n totalTokens: inputTokens + outputTokens,\n inputTokens,\n outputTokens,\n };\n },\n });\n}\n\n// ============================================================================\n// Anthropic Streaming Runner\n// ============================================================================\n\n/** Options for createAnthropicStreamingRunner */\nexport interface AnthropicStreamingRunnerOptions {\n apiKey: string;\n model?: string;\n /** @default 4096 */\n maxTokens?: number;\n baseURL?: string;\n fetch?: typeof globalThis.fetch;\n /** Lifecycle hooks for tracing, logging, and metrics */\n hooks?: AdapterHooks;\n /** Sampling temperature (0–1). Higher = more random. */\n temperature?: number;\n /** Nucleus sampling: top-P probability mass (0–1). */\n topP?: number;\n /** Custom stop sequences. The model will stop generating when it encounters one. */\n stopSequences?: string[];\n}\n\n/**\n * Create a StreamingCallbackRunner for the Anthropic Messages API with\n * server-sent events. Can be used standalone or paired with `createAnthropicRunner`.\n *\n * Returns `tokenUsage` with input/output breakdown for cost tracking.\n *\n * @example\n * ```typescript\n * const streamingRunner = createAnthropicStreamingRunner({\n * apiKey: process.env.ANTHROPIC_API_KEY!,\n * });\n * const streamRunner = createStreamingRunner(streamingRunner);\n * const { stream, result } = streamRunner(agent, input);\n * ```\n */\nexport function createAnthropicStreamingRunner(\n options: AnthropicStreamingRunnerOptions,\n): StreamingCallbackRunner {\n const {\n apiKey,\n model = \"claude-sonnet-4-5-20250929\",\n maxTokens = 4096,\n baseURL = \"https://api.anthropic.com/v1\",\n fetch: fetchFn = globalThis.fetch,\n hooks,\n temperature,\n topP,\n stopSequences,\n } = options;\n\n validateBaseURL(baseURL);\n warnIfMissingApiKey(apiKey, \"createAnthropicStreamingRunner\");\n\n return async (agent, input, callbacks) => {\n const startTime = fireBeforeCallHook(hooks, agent, input);\n\n try {\n const response = await fetchFn(`${baseURL}/messages`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"x-api-key\": apiKey,\n \"anthropic-version\": \"2023-06-01\",\n },\n body: JSON.stringify({\n model: agent.model ?? model,\n max_tokens: maxTokens,\n ...(temperature != null ? { temperature } : {}),\n ...(topP != null ? { top_p: topP } : {}),\n ...(stopSequences != null ? { stop_sequences: stopSequences } : {}),\n system: agent.instructions ?? \"\",\n messages: [{ role: \"user\", content: input }],\n stream: true,\n }),\n signal: callbacks.signal,\n });\n\n if (!response.ok) {\n await throwStreamingHTTPError(response, \"Anthropic\");\n }\n\n const reader = getSSEReader(response);\n\n const { fullText, inputTokens, outputTokens } = await parseSSEStream(\n reader,\n callbacks.onToken,\n (event) => {\n if (event.type === \"error\") {\n throw new Error(\n `[Directive] Anthropic stream error: ${(event.error as Record<string, unknown>)?.message ?? JSON.stringify(event.error)}`,\n );\n }\n\n const result: { text?: string; inputTokens?: number; outputTokens?: number } = {};\n if (\n event.type === \"content_block_delta\" &&\n (event.delta as Record<string, unknown>)?.type === \"text_delta\"\n ) {\n result.text = (event.delta as Record<string, unknown>).text as string;\n }\n if (event.type === \"message_delta\" && event.usage) {\n result.outputTokens = (event.usage as Record<string, unknown>).output_tokens as number ?? 0;\n }\n if (event.type === \"message_start\" && (event.message as Record<string, unknown>)?.usage) {\n result.inputTokens = ((event.message as Record<string, unknown>).usage as Record<string, unknown>).input_tokens as number ?? 0;\n }\n\n return result;\n },\n \"Anthropic\",\n );\n\n const tokenUsage = { inputTokens, outputTokens };\n const totalTokens = inputTokens + outputTokens;\n\n callbacks.onMessage?.({ role: \"assistant\", content: fullText });\n fireAfterCallHook(hooks, agent, input, fullText, totalTokens, tokenUsage, startTime);\n\n return buildStreamingResult(input, fullText, totalTokens, tokenUsage);\n } catch (err) {\n fireErrorHook(hooks, agent, input, err, startTime);\n\n throw err;\n }\n };\n}\n"]}
1
+ {"version":3,"sources":["../src/adapters/anthropic.ts"],"names":["ANTHROPIC_PRICING","createAnthropicRunner","options","apiKey","model","maxTokens","baseURL","fetchFn","timeoutMs","hooks","temperature","topP","stopSequences","validateBaseURL","warnIfMissingApiKey","createRunner","agent","_input","messages","m","res","data","text","inputTokens","outputTokens","createAnthropicStreamingRunner","input","callbacks","startTime","fireBeforeCallHook","response","throwStreamingHTTPError","reader","getSSEReader","fullText","parseSSEStream","event","result","tokenUsage","totalTokens","fireAfterCallHook","buildStreamingResult","err","fireErrorHook"],"mappings":"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","file":"anthropic.cjs","sourcesContent":["/**\n * @directive-run/ai/anthropic\n *\n * Anthropic adapter for Directive AI. Provides runners for the\n * Anthropic Messages API, including streaming support.\n *\n * @example\n * ```typescript\n * import { createAnthropicRunner, createAnthropicStreamingRunner } from '@directive-run/ai/anthropic';\n *\n * const runner = createAnthropicRunner({ apiKey: process.env.ANTHROPIC_API_KEY! });\n * ```\n */\n\nimport { createRunner, validateBaseURL } from \"../agent-utils.js\";\nimport type { AdapterHooks, AgentRunner } from \"../types.js\";\nimport type { StreamingCallbackRunner } from \"../types.js\";\nimport {\n buildStreamingResult,\n fireAfterCallHook,\n fireBeforeCallHook,\n fireErrorHook,\n getSSEReader,\n parseSSEStream,\n throwStreamingHTTPError,\n warnIfMissingApiKey,\n} from \"./shared.js\";\n\n// ============================================================================\n// Pricing Constants\n// ============================================================================\n\n/**\n * Anthropic model pricing (USD per million tokens).\n *\n * Use with `estimateCost()` for per-call cost tracking:\n * ```typescript\n * import { estimateCost } from '@directive-run/ai';\n * import { ANTHROPIC_PRICING } from '@directive-run/ai/anthropic';\n *\n * const cost =\n * estimateCost(result.tokenUsage!.inputTokens, ANTHROPIC_PRICING[\"claude-sonnet-4-5-20250929\"].input) +\n * estimateCost(result.tokenUsage!.outputTokens, ANTHROPIC_PRICING[\"claude-sonnet-4-5-20250929\"].output);\n * ```\n *\n * **Note:** Pricing changes over time. These values are provided as a convenience\n * and may not reflect the latest rates. Always verify at https://anthropic.com/pricing\n */\nexport const ANTHROPIC_PRICING: Record<\n string,\n { input: number; output: number }\n> = {\n \"claude-sonnet-4-5-20250929\": { input: 3, output: 15 },\n \"claude-sonnet-4-20250514\": { input: 3, output: 15 },\n \"claude-haiku-4-5-20250514\": { input: 0.8, output: 4 },\n \"claude-haiku-3-5-20241022\": { input: 0.8, output: 4 },\n \"claude-opus-4-20250514\": { input: 15, output: 75 },\n};\n\n// ============================================================================\n// Anthropic Runner\n// ============================================================================\n\n/** Options for createAnthropicRunner */\nexport interface AnthropicRunnerOptions {\n apiKey: string;\n model?: string;\n /** @default 4096 */\n maxTokens?: number;\n baseURL?: string;\n fetch?: typeof globalThis.fetch;\n /** @default undefined */\n timeoutMs?: number;\n /** Lifecycle hooks for tracing, logging, and metrics */\n hooks?: AdapterHooks;\n /** Sampling temperature (0–1). Higher = more random. */\n temperature?: number;\n /** Nucleus sampling: top-P probability mass (0–1). */\n topP?: number;\n /** Custom stop sequences. The model will stop generating when it encounters one. */\n stopSequences?: string[];\n}\n\n/**\n * Create an AgentRunner for the Anthropic Messages API.\n *\n * Returns `tokenUsage` with input/output breakdown for cost tracking.\n *\n * @example\n * ```typescript\n * const runner = createAnthropicRunner({\n * apiKey: process.env.ANTHROPIC_API_KEY!,\n * hooks: {\n * onAfterCall: ({ durationMs, tokenUsage }) => {\n * console.log(`${durationMs}ms – ${tokenUsage.inputTokens}in/${tokenUsage.outputTokens}out`);\n * },\n * },\n * });\n * const orchestrator = createAgentOrchestrator({ runner });\n * const result = await orchestrator.run(agent, input);\n * ```\n */\nexport function createAnthropicRunner(\n options: AnthropicRunnerOptions,\n): AgentRunner {\n const {\n apiKey,\n model = \"claude-sonnet-4-5-20250929\",\n maxTokens = 4096,\n baseURL = \"https://api.anthropic.com/v1\",\n fetch: fetchFn = globalThis.fetch,\n timeoutMs,\n hooks,\n temperature,\n topP,\n stopSequences,\n } = options;\n\n validateBaseURL(baseURL);\n warnIfMissingApiKey(apiKey, \"createAnthropicRunner\");\n\n return createRunner({\n fetch: fetchFn,\n hooks,\n buildRequest: (agent, _input, messages) => ({\n url: `${baseURL}/messages`,\n init: {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"x-api-key\": apiKey,\n \"anthropic-version\": \"2023-06-01\",\n },\n body: JSON.stringify({\n model: agent.model ?? model,\n max_tokens: maxTokens,\n ...(temperature != null ? { temperature } : {}),\n ...(topP != null ? { top_p: topP } : {}),\n ...(stopSequences != null ? { stop_sequences: stopSequences } : {}),\n system: agent.instructions ?? \"\",\n messages: messages.map((m) => ({\n role: m.role,\n content: m.content,\n })),\n }),\n ...(timeoutMs != null\n ? { signal: AbortSignal.timeout(timeoutMs) }\n : {}),\n },\n }),\n parseResponse: async (res) => {\n const data = await res.json();\n const text = data.content?.[0]?.text ?? \"\";\n const inputTokens = data.usage?.input_tokens ?? 0;\n const outputTokens = data.usage?.output_tokens ?? 0;\n\n return {\n text,\n totalTokens: inputTokens + outputTokens,\n inputTokens,\n outputTokens,\n };\n },\n });\n}\n\n// ============================================================================\n// Anthropic Streaming Runner\n// ============================================================================\n\n/** Options for createAnthropicStreamingRunner */\nexport interface AnthropicStreamingRunnerOptions {\n apiKey: string;\n model?: string;\n /** @default 4096 */\n maxTokens?: number;\n baseURL?: string;\n fetch?: typeof globalThis.fetch;\n /** Lifecycle hooks for tracing, logging, and metrics */\n hooks?: AdapterHooks;\n /** Sampling temperature (0–1). Higher = more random. */\n temperature?: number;\n /** Nucleus sampling: top-P probability mass (0–1). */\n topP?: number;\n /** Custom stop sequences. The model will stop generating when it encounters one. */\n stopSequences?: string[];\n}\n\n/**\n * Create a StreamingCallbackRunner for the Anthropic Messages API with\n * server-sent events. Can be used standalone or paired with `createAnthropicRunner`.\n *\n * Returns `tokenUsage` with input/output breakdown for cost tracking.\n *\n * @example\n * ```typescript\n * const streamingRunner = createAnthropicStreamingRunner({\n * apiKey: process.env.ANTHROPIC_API_KEY!,\n * });\n * const streamRunner = createStreamingRunner(streamingRunner);\n * const { stream, result } = streamRunner(agent, input);\n * ```\n */\nexport function createAnthropicStreamingRunner(\n options: AnthropicStreamingRunnerOptions,\n): StreamingCallbackRunner {\n const {\n apiKey,\n model = \"claude-sonnet-4-5-20250929\",\n maxTokens = 4096,\n baseURL = \"https://api.anthropic.com/v1\",\n fetch: fetchFn = globalThis.fetch,\n hooks,\n temperature,\n topP,\n stopSequences,\n } = options;\n\n validateBaseURL(baseURL);\n warnIfMissingApiKey(apiKey, \"createAnthropicStreamingRunner\");\n\n return async (agent, input, callbacks) => {\n const startTime = fireBeforeCallHook(hooks, agent, input);\n\n try {\n const response = await fetchFn(`${baseURL}/messages`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"x-api-key\": apiKey,\n \"anthropic-version\": \"2023-06-01\",\n },\n body: JSON.stringify({\n model: agent.model ?? model,\n max_tokens: maxTokens,\n ...(temperature != null ? { temperature } : {}),\n ...(topP != null ? { top_p: topP } : {}),\n ...(stopSequences != null ? { stop_sequences: stopSequences } : {}),\n system: agent.instructions ?? \"\",\n messages: [{ role: \"user\", content: input }],\n stream: true,\n }),\n signal: callbacks.signal,\n });\n\n if (!response.ok) {\n await throwStreamingHTTPError(response, \"Anthropic\");\n }\n\n const reader = getSSEReader(response);\n\n const { fullText, inputTokens, outputTokens } = await parseSSEStream(\n reader,\n callbacks.onToken,\n (event) => {\n if (event.type === \"error\") {\n throw new Error(\n `[Directive] Anthropic stream error: ${(event.error as Record<string, unknown>)?.message ?? JSON.stringify(event.error)}`,\n );\n }\n\n const result: {\n text?: string;\n inputTokens?: number;\n outputTokens?: number;\n } = {};\n if (\n event.type === \"content_block_delta\" &&\n (event.delta as Record<string, unknown>)?.type === \"text_delta\"\n ) {\n result.text = (event.delta as Record<string, unknown>)\n .text as string;\n }\n if (event.type === \"message_delta\" && event.usage) {\n result.outputTokens =\n ((event.usage as Record<string, unknown>)\n .output_tokens as number) ?? 0;\n }\n if (\n event.type === \"message_start\" &&\n (event.message as Record<string, unknown>)?.usage\n ) {\n result.inputTokens =\n ((\n (event.message as Record<string, unknown>).usage as Record<\n string,\n unknown\n >\n ).input_tokens as number) ?? 0;\n }\n\n return result;\n },\n \"Anthropic\",\n );\n\n const tokenUsage = { inputTokens, outputTokens };\n const totalTokens = inputTokens + outputTokens;\n\n callbacks.onMessage?.({ role: \"assistant\", content: fullText });\n fireAfterCallHook(\n hooks,\n agent,\n input,\n fullText,\n totalTokens,\n tokenUsage,\n startTime,\n );\n\n return buildStreamingResult(input, fullText, totalTokens, tokenUsage);\n } catch (err) {\n fireErrorHook(hooks, agent, input, err, startTime);\n\n throw err;\n }\n };\n}\n"]}
package/dist/anthropic.js CHANGED
@@ -1,3 +1,3 @@
1
- import {c,e as e$1,a,b,d as d$1,f,h,g}from'./chunk-265ZKXYE.js';import {d,e}from'./chunk-W6WZBQER.js';var K={"claude-sonnet-4-5-20250929":{input:3,output:15},"claude-sonnet-4-20250514":{input:3,output:15},"claude-haiku-4-5-20250514":{input:.8,output:4},"claude-haiku-3-5-20241022":{input:.8,output:4},"claude-opus-4-20250514":{input:15,output:75}};function L(h){let{apiKey:i,model:k="claude-sonnet-4-5-20250929",maxTokens:d$1=4096,baseURL:u="https://api.anthropic.com/v1",fetch:f=globalThis.fetch,timeoutMs:r,hooks:m,temperature:p,topP:c$1,stopSequences:o}=h;return d(u),c(i,"createAnthropicRunner"),e({fetch:f,hooks:m,buildRequest:(n,s,a)=>({url:`${u}/messages`,init:{method:"POST",headers:{"Content-Type":"application/json","x-api-key":i,"anthropic-version":"2023-06-01"},body:JSON.stringify({model:n.model??k,max_tokens:d$1,...p!=null?{temperature:p}:{},...c$1!=null?{top_p:c$1}:{},...o!=null?{stop_sequences:o}:{},system:n.instructions??"",messages:a.map(e=>({role:e.role,content:e.content}))}),...r!=null?{signal:AbortSignal.timeout(r)}:{}}}),parseResponse:async n=>{let s=await n.json(),a=s.content?.[0]?.text??"",e=s.usage?.input_tokens??0,l=s.usage?.output_tokens??0;return {text:a,totalTokens:e+l,inputTokens:e,outputTokens:l}}})}function N(h$1){let{apiKey:i,model:k="claude-sonnet-4-5-20250929",maxTokens:d$2=4096,baseURL:u="https://api.anthropic.com/v1",fetch:f$1=globalThis.fetch,hooks:r,temperature:m,topP:p,stopSequences:c$1}=h$1;return d(u),c(i,"createAnthropicStreamingRunner"),async(o,n,s)=>{let a$1=e$1(r,o,n);try{let e=await f$1(`${u}/messages`,{method:"POST",headers:{"Content-Type":"application/json","x-api-key":i,"anthropic-version":"2023-06-01"},body:JSON.stringify({model:o.model??k,max_tokens:d$2,...m!=null?{temperature:m}:{},...p!=null?{top_p:p}:{},...c$1!=null?{stop_sequences:c$1}:{},system:o.instructions??"",messages:[{role:"user",content:n}],stream:!0}),signal:s.signal});e.ok||await a(e,"Anthropic");let l=b(e),{fullText:R,inputTokens:b$1,outputTokens:S}=await d$1(l,s.onToken,t=>{if(t.type==="error")throw new Error(`[Directive] Anthropic stream error: ${t.error?.message??JSON.stringify(t.error)}`);let g={};return t.type==="content_block_delta"&&t.delta?.type==="text_delta"&&(g.text=t.delta.text),t.type==="message_delta"&&t.usage&&(g.outputTokens=t.usage.output_tokens??0),t.type==="message_start"&&t.message?.usage&&(g.inputTokens=t.message.usage.input_tokens??0),g},"Anthropic"),x={inputTokens:b$1,outputTokens:S},A=b$1+S;return s.onMessage?.({role:"assistant",content:R}),f(r,o,n,R,A,x,a$1),h(n,R,A,x)}catch(e){throw g(r,o,n,e,a$1),e}}}
1
+ import {c,e as e$1,a,b,d as d$1,f,h,g}from'./chunk-3PGRBK4E.js';import {d,e}from'./chunk-W6WZBQER.js';var K={"claude-sonnet-4-5-20250929":{input:3,output:15},"claude-sonnet-4-20250514":{input:3,output:15},"claude-haiku-4-5-20250514":{input:.8,output:4},"claude-haiku-3-5-20241022":{input:.8,output:4},"claude-opus-4-20250514":{input:15,output:75}};function L(h){let{apiKey:i,model:k="claude-sonnet-4-5-20250929",maxTokens:d$1=4096,baseURL:u="https://api.anthropic.com/v1",fetch:f=globalThis.fetch,timeoutMs:r,hooks:m,temperature:p,topP:c$1,stopSequences:o}=h;return d(u),c(i,"createAnthropicRunner"),e({fetch:f,hooks:m,buildRequest:(n,s,a)=>({url:`${u}/messages`,init:{method:"POST",headers:{"Content-Type":"application/json","x-api-key":i,"anthropic-version":"2023-06-01"},body:JSON.stringify({model:n.model??k,max_tokens:d$1,...p!=null?{temperature:p}:{},...c$1!=null?{top_p:c$1}:{},...o!=null?{stop_sequences:o}:{},system:n.instructions??"",messages:a.map(e=>({role:e.role,content:e.content}))}),...r!=null?{signal:AbortSignal.timeout(r)}:{}}}),parseResponse:async n=>{let s=await n.json(),a=s.content?.[0]?.text??"",e=s.usage?.input_tokens??0,l=s.usage?.output_tokens??0;return {text:a,totalTokens:e+l,inputTokens:e,outputTokens:l}}})}function N(h$1){let{apiKey:i,model:k="claude-sonnet-4-5-20250929",maxTokens:d$2=4096,baseURL:u="https://api.anthropic.com/v1",fetch:f$1=globalThis.fetch,hooks:r,temperature:m,topP:p,stopSequences:c$1}=h$1;return d(u),c(i,"createAnthropicStreamingRunner"),async(o,n,s)=>{let a$1=e$1(r,o,n);try{let e=await f$1(`${u}/messages`,{method:"POST",headers:{"Content-Type":"application/json","x-api-key":i,"anthropic-version":"2023-06-01"},body:JSON.stringify({model:o.model??k,max_tokens:d$2,...m!=null?{temperature:m}:{},...p!=null?{top_p:p}:{},...c$1!=null?{stop_sequences:c$1}:{},system:o.instructions??"",messages:[{role:"user",content:n}],stream:!0}),signal:s.signal});e.ok||await a(e,"Anthropic");let l=b(e),{fullText:R,inputTokens:b$1,outputTokens:S}=await d$1(l,s.onToken,t=>{if(t.type==="error")throw new Error(`[Directive] Anthropic stream error: ${t.error?.message??JSON.stringify(t.error)}`);let g={};return t.type==="content_block_delta"&&t.delta?.type==="text_delta"&&(g.text=t.delta.text),t.type==="message_delta"&&t.usage&&(g.outputTokens=t.usage.output_tokens??0),t.type==="message_start"&&t.message?.usage&&(g.inputTokens=t.message.usage.input_tokens??0),g},"Anthropic"),x={inputTokens:b$1,outputTokens:S},A=b$1+S;return s.onMessage?.({role:"assistant",content:R}),f(r,o,n,R,A,x,a$1),h(n,R,A,x)}catch(e){throw g(r,o,n,e,a$1),e}}}
2
2
  export{K as ANTHROPIC_PRICING,L as createAnthropicRunner,N as createAnthropicStreamingRunner};//# sourceMappingURL=anthropic.js.map
3
3
  //# sourceMappingURL=anthropic.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/adapters/anthropic.ts"],"names":["ANTHROPIC_PRICING","createAnthropicRunner","options","apiKey","model","maxTokens","baseURL","fetchFn","timeoutMs","hooks","temperature","topP","stopSequences","validateBaseURL","warnIfMissingApiKey","createRunner","agent","_input","messages","m","res","data","text","inputTokens","outputTokens","createAnthropicStreamingRunner","input","callbacks","startTime","fireBeforeCallHook","response","throwStreamingHTTPError","reader","getSSEReader","fullText","parseSSEStream","event","result","tokenUsage","totalTokens","fireAfterCallHook","buildStreamingResult","err","fireErrorHook"],"mappings":"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","file":"anthropic.js","sourcesContent":["/**\n * @directive-run/ai/anthropic\n *\n * Anthropic adapter for Directive AI. Provides runners for the\n * Anthropic Messages API, including streaming support.\n *\n * @example\n * ```typescript\n * import { createAnthropicRunner, createAnthropicStreamingRunner } from '@directive-run/ai/anthropic';\n *\n * const runner = createAnthropicRunner({ apiKey: process.env.ANTHROPIC_API_KEY! });\n * ```\n */\n\nimport { createRunner, validateBaseURL } from \"../agent-utils.js\";\nimport type {\n AdapterHooks,\n AgentRunner,\n} from \"../types.js\";\nimport type { StreamingCallbackRunner } from \"../types.js\";\nimport {\n buildStreamingResult,\n fireAfterCallHook,\n fireBeforeCallHook,\n fireErrorHook,\n getSSEReader,\n parseSSEStream,\n throwStreamingHTTPError,\n warnIfMissingApiKey,\n} from \"./shared.js\";\n\n// ============================================================================\n// Pricing Constants\n// ============================================================================\n\n/**\n * Anthropic model pricing (USD per million tokens).\n *\n * Use with `estimateCost()` for per-call cost tracking:\n * ```typescript\n * import { estimateCost } from '@directive-run/ai';\n * import { ANTHROPIC_PRICING } from '@directive-run/ai/anthropic';\n *\n * const cost =\n * estimateCost(result.tokenUsage!.inputTokens, ANTHROPIC_PRICING[\"claude-sonnet-4-5-20250929\"].input) +\n * estimateCost(result.tokenUsage!.outputTokens, ANTHROPIC_PRICING[\"claude-sonnet-4-5-20250929\"].output);\n * ```\n *\n * **Note:** Pricing changes over time. These values are provided as a convenience\n * and may not reflect the latest rates. Always verify at https://anthropic.com/pricing\n */\nexport const ANTHROPIC_PRICING: Record<\n string,\n { input: number; output: number }\n> = {\n \"claude-sonnet-4-5-20250929\": { input: 3, output: 15 },\n \"claude-sonnet-4-20250514\": { input: 3, output: 15 },\n \"claude-haiku-4-5-20250514\": { input: 0.8, output: 4 },\n \"claude-haiku-3-5-20241022\": { input: 0.8, output: 4 },\n \"claude-opus-4-20250514\": { input: 15, output: 75 },\n};\n\n// ============================================================================\n// Anthropic Runner\n// ============================================================================\n\n/** Options for createAnthropicRunner */\nexport interface AnthropicRunnerOptions {\n apiKey: string;\n model?: string;\n /** @default 4096 */\n maxTokens?: number;\n baseURL?: string;\n fetch?: typeof globalThis.fetch;\n /** @default undefined */\n timeoutMs?: number;\n /** Lifecycle hooks for tracing, logging, and metrics */\n hooks?: AdapterHooks;\n /** Sampling temperature (0–1). Higher = more random. */\n temperature?: number;\n /** Nucleus sampling: top-P probability mass (0–1). */\n topP?: number;\n /** Custom stop sequences. The model will stop generating when it encounters one. */\n stopSequences?: string[];\n}\n\n/**\n * Create an AgentRunner for the Anthropic Messages API.\n *\n * Returns `tokenUsage` with input/output breakdown for cost tracking.\n *\n * @example\n * ```typescript\n * const runner = createAnthropicRunner({\n * apiKey: process.env.ANTHROPIC_API_KEY!,\n * hooks: {\n * onAfterCall: ({ durationMs, tokenUsage }) => {\n * console.log(`${durationMs}ms – ${tokenUsage.inputTokens}in/${tokenUsage.outputTokens}out`);\n * },\n * },\n * });\n * const orchestrator = createAgentOrchestrator({ runner });\n * const result = await orchestrator.run(agent, input);\n * ```\n */\nexport function createAnthropicRunner(\n options: AnthropicRunnerOptions,\n): AgentRunner {\n const {\n apiKey,\n model = \"claude-sonnet-4-5-20250929\",\n maxTokens = 4096,\n baseURL = \"https://api.anthropic.com/v1\",\n fetch: fetchFn = globalThis.fetch,\n timeoutMs,\n hooks,\n temperature,\n topP,\n stopSequences,\n } = options;\n\n validateBaseURL(baseURL);\n warnIfMissingApiKey(apiKey, \"createAnthropicRunner\");\n\n return createRunner({\n fetch: fetchFn,\n hooks,\n buildRequest: (agent, _input, messages) => ({\n url: `${baseURL}/messages`,\n init: {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"x-api-key\": apiKey,\n \"anthropic-version\": \"2023-06-01\",\n },\n body: JSON.stringify({\n model: agent.model ?? model,\n max_tokens: maxTokens,\n ...(temperature != null ? { temperature } : {}),\n ...(topP != null ? { top_p: topP } : {}),\n ...(stopSequences != null ? { stop_sequences: stopSequences } : {}),\n system: agent.instructions ?? \"\",\n messages: messages.map((m) => ({\n role: m.role,\n content: m.content,\n })),\n }),\n ...(timeoutMs != null\n ? { signal: AbortSignal.timeout(timeoutMs) }\n : {}),\n },\n }),\n parseResponse: async (res) => {\n const data = await res.json();\n const text = data.content?.[0]?.text ?? \"\";\n const inputTokens = data.usage?.input_tokens ?? 0;\n const outputTokens = data.usage?.output_tokens ?? 0;\n\n return {\n text,\n totalTokens: inputTokens + outputTokens,\n inputTokens,\n outputTokens,\n };\n },\n });\n}\n\n// ============================================================================\n// Anthropic Streaming Runner\n// ============================================================================\n\n/** Options for createAnthropicStreamingRunner */\nexport interface AnthropicStreamingRunnerOptions {\n apiKey: string;\n model?: string;\n /** @default 4096 */\n maxTokens?: number;\n baseURL?: string;\n fetch?: typeof globalThis.fetch;\n /** Lifecycle hooks for tracing, logging, and metrics */\n hooks?: AdapterHooks;\n /** Sampling temperature (0–1). Higher = more random. */\n temperature?: number;\n /** Nucleus sampling: top-P probability mass (0–1). */\n topP?: number;\n /** Custom stop sequences. The model will stop generating when it encounters one. */\n stopSequences?: string[];\n}\n\n/**\n * Create a StreamingCallbackRunner for the Anthropic Messages API with\n * server-sent events. Can be used standalone or paired with `createAnthropicRunner`.\n *\n * Returns `tokenUsage` with input/output breakdown for cost tracking.\n *\n * @example\n * ```typescript\n * const streamingRunner = createAnthropicStreamingRunner({\n * apiKey: process.env.ANTHROPIC_API_KEY!,\n * });\n * const streamRunner = createStreamingRunner(streamingRunner);\n * const { stream, result } = streamRunner(agent, input);\n * ```\n */\nexport function createAnthropicStreamingRunner(\n options: AnthropicStreamingRunnerOptions,\n): StreamingCallbackRunner {\n const {\n apiKey,\n model = \"claude-sonnet-4-5-20250929\",\n maxTokens = 4096,\n baseURL = \"https://api.anthropic.com/v1\",\n fetch: fetchFn = globalThis.fetch,\n hooks,\n temperature,\n topP,\n stopSequences,\n } = options;\n\n validateBaseURL(baseURL);\n warnIfMissingApiKey(apiKey, \"createAnthropicStreamingRunner\");\n\n return async (agent, input, callbacks) => {\n const startTime = fireBeforeCallHook(hooks, agent, input);\n\n try {\n const response = await fetchFn(`${baseURL}/messages`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"x-api-key\": apiKey,\n \"anthropic-version\": \"2023-06-01\",\n },\n body: JSON.stringify({\n model: agent.model ?? model,\n max_tokens: maxTokens,\n ...(temperature != null ? { temperature } : {}),\n ...(topP != null ? { top_p: topP } : {}),\n ...(stopSequences != null ? { stop_sequences: stopSequences } : {}),\n system: agent.instructions ?? \"\",\n messages: [{ role: \"user\", content: input }],\n stream: true,\n }),\n signal: callbacks.signal,\n });\n\n if (!response.ok) {\n await throwStreamingHTTPError(response, \"Anthropic\");\n }\n\n const reader = getSSEReader(response);\n\n const { fullText, inputTokens, outputTokens } = await parseSSEStream(\n reader,\n callbacks.onToken,\n (event) => {\n if (event.type === \"error\") {\n throw new Error(\n `[Directive] Anthropic stream error: ${(event.error as Record<string, unknown>)?.message ?? JSON.stringify(event.error)}`,\n );\n }\n\n const result: { text?: string; inputTokens?: number; outputTokens?: number } = {};\n if (\n event.type === \"content_block_delta\" &&\n (event.delta as Record<string, unknown>)?.type === \"text_delta\"\n ) {\n result.text = (event.delta as Record<string, unknown>).text as string;\n }\n if (event.type === \"message_delta\" && event.usage) {\n result.outputTokens = (event.usage as Record<string, unknown>).output_tokens as number ?? 0;\n }\n if (event.type === \"message_start\" && (event.message as Record<string, unknown>)?.usage) {\n result.inputTokens = ((event.message as Record<string, unknown>).usage as Record<string, unknown>).input_tokens as number ?? 0;\n }\n\n return result;\n },\n \"Anthropic\",\n );\n\n const tokenUsage = { inputTokens, outputTokens };\n const totalTokens = inputTokens + outputTokens;\n\n callbacks.onMessage?.({ role: \"assistant\", content: fullText });\n fireAfterCallHook(hooks, agent, input, fullText, totalTokens, tokenUsage, startTime);\n\n return buildStreamingResult(input, fullText, totalTokens, tokenUsage);\n } catch (err) {\n fireErrorHook(hooks, agent, input, err, startTime);\n\n throw err;\n }\n };\n}\n"]}
1
+ {"version":3,"sources":["../src/adapters/anthropic.ts"],"names":["ANTHROPIC_PRICING","createAnthropicRunner","options","apiKey","model","maxTokens","baseURL","fetchFn","timeoutMs","hooks","temperature","topP","stopSequences","validateBaseURL","warnIfMissingApiKey","createRunner","agent","_input","messages","m","res","data","text","inputTokens","outputTokens","createAnthropicStreamingRunner","input","callbacks","startTime","fireBeforeCallHook","response","throwStreamingHTTPError","reader","getSSEReader","fullText","parseSSEStream","event","result","tokenUsage","totalTokens","fireAfterCallHook","buildStreamingResult","err","fireErrorHook"],"mappings":"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","file":"anthropic.js","sourcesContent":["/**\n * @directive-run/ai/anthropic\n *\n * Anthropic adapter for Directive AI. Provides runners for the\n * Anthropic Messages API, including streaming support.\n *\n * @example\n * ```typescript\n * import { createAnthropicRunner, createAnthropicStreamingRunner } from '@directive-run/ai/anthropic';\n *\n * const runner = createAnthropicRunner({ apiKey: process.env.ANTHROPIC_API_KEY! });\n * ```\n */\n\nimport { createRunner, validateBaseURL } from \"../agent-utils.js\";\nimport type { AdapterHooks, AgentRunner } from \"../types.js\";\nimport type { StreamingCallbackRunner } from \"../types.js\";\nimport {\n buildStreamingResult,\n fireAfterCallHook,\n fireBeforeCallHook,\n fireErrorHook,\n getSSEReader,\n parseSSEStream,\n throwStreamingHTTPError,\n warnIfMissingApiKey,\n} from \"./shared.js\";\n\n// ============================================================================\n// Pricing Constants\n// ============================================================================\n\n/**\n * Anthropic model pricing (USD per million tokens).\n *\n * Use with `estimateCost()` for per-call cost tracking:\n * ```typescript\n * import { estimateCost } from '@directive-run/ai';\n * import { ANTHROPIC_PRICING } from '@directive-run/ai/anthropic';\n *\n * const cost =\n * estimateCost(result.tokenUsage!.inputTokens, ANTHROPIC_PRICING[\"claude-sonnet-4-5-20250929\"].input) +\n * estimateCost(result.tokenUsage!.outputTokens, ANTHROPIC_PRICING[\"claude-sonnet-4-5-20250929\"].output);\n * ```\n *\n * **Note:** Pricing changes over time. These values are provided as a convenience\n * and may not reflect the latest rates. Always verify at https://anthropic.com/pricing\n */\nexport const ANTHROPIC_PRICING: Record<\n string,\n { input: number; output: number }\n> = {\n \"claude-sonnet-4-5-20250929\": { input: 3, output: 15 },\n \"claude-sonnet-4-20250514\": { input: 3, output: 15 },\n \"claude-haiku-4-5-20250514\": { input: 0.8, output: 4 },\n \"claude-haiku-3-5-20241022\": { input: 0.8, output: 4 },\n \"claude-opus-4-20250514\": { input: 15, output: 75 },\n};\n\n// ============================================================================\n// Anthropic Runner\n// ============================================================================\n\n/** Options for createAnthropicRunner */\nexport interface AnthropicRunnerOptions {\n apiKey: string;\n model?: string;\n /** @default 4096 */\n maxTokens?: number;\n baseURL?: string;\n fetch?: typeof globalThis.fetch;\n /** @default undefined */\n timeoutMs?: number;\n /** Lifecycle hooks for tracing, logging, and metrics */\n hooks?: AdapterHooks;\n /** Sampling temperature (0–1). Higher = more random. */\n temperature?: number;\n /** Nucleus sampling: top-P probability mass (0–1). */\n topP?: number;\n /** Custom stop sequences. The model will stop generating when it encounters one. */\n stopSequences?: string[];\n}\n\n/**\n * Create an AgentRunner for the Anthropic Messages API.\n *\n * Returns `tokenUsage` with input/output breakdown for cost tracking.\n *\n * @example\n * ```typescript\n * const runner = createAnthropicRunner({\n * apiKey: process.env.ANTHROPIC_API_KEY!,\n * hooks: {\n * onAfterCall: ({ durationMs, tokenUsage }) => {\n * console.log(`${durationMs}ms – ${tokenUsage.inputTokens}in/${tokenUsage.outputTokens}out`);\n * },\n * },\n * });\n * const orchestrator = createAgentOrchestrator({ runner });\n * const result = await orchestrator.run(agent, input);\n * ```\n */\nexport function createAnthropicRunner(\n options: AnthropicRunnerOptions,\n): AgentRunner {\n const {\n apiKey,\n model = \"claude-sonnet-4-5-20250929\",\n maxTokens = 4096,\n baseURL = \"https://api.anthropic.com/v1\",\n fetch: fetchFn = globalThis.fetch,\n timeoutMs,\n hooks,\n temperature,\n topP,\n stopSequences,\n } = options;\n\n validateBaseURL(baseURL);\n warnIfMissingApiKey(apiKey, \"createAnthropicRunner\");\n\n return createRunner({\n fetch: fetchFn,\n hooks,\n buildRequest: (agent, _input, messages) => ({\n url: `${baseURL}/messages`,\n init: {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"x-api-key\": apiKey,\n \"anthropic-version\": \"2023-06-01\",\n },\n body: JSON.stringify({\n model: agent.model ?? model,\n max_tokens: maxTokens,\n ...(temperature != null ? { temperature } : {}),\n ...(topP != null ? { top_p: topP } : {}),\n ...(stopSequences != null ? { stop_sequences: stopSequences } : {}),\n system: agent.instructions ?? \"\",\n messages: messages.map((m) => ({\n role: m.role,\n content: m.content,\n })),\n }),\n ...(timeoutMs != null\n ? { signal: AbortSignal.timeout(timeoutMs) }\n : {}),\n },\n }),\n parseResponse: async (res) => {\n const data = await res.json();\n const text = data.content?.[0]?.text ?? \"\";\n const inputTokens = data.usage?.input_tokens ?? 0;\n const outputTokens = data.usage?.output_tokens ?? 0;\n\n return {\n text,\n totalTokens: inputTokens + outputTokens,\n inputTokens,\n outputTokens,\n };\n },\n });\n}\n\n// ============================================================================\n// Anthropic Streaming Runner\n// ============================================================================\n\n/** Options for createAnthropicStreamingRunner */\nexport interface AnthropicStreamingRunnerOptions {\n apiKey: string;\n model?: string;\n /** @default 4096 */\n maxTokens?: number;\n baseURL?: string;\n fetch?: typeof globalThis.fetch;\n /** Lifecycle hooks for tracing, logging, and metrics */\n hooks?: AdapterHooks;\n /** Sampling temperature (0–1). Higher = more random. */\n temperature?: number;\n /** Nucleus sampling: top-P probability mass (0–1). */\n topP?: number;\n /** Custom stop sequences. The model will stop generating when it encounters one. */\n stopSequences?: string[];\n}\n\n/**\n * Create a StreamingCallbackRunner for the Anthropic Messages API with\n * server-sent events. Can be used standalone or paired with `createAnthropicRunner`.\n *\n * Returns `tokenUsage` with input/output breakdown for cost tracking.\n *\n * @example\n * ```typescript\n * const streamingRunner = createAnthropicStreamingRunner({\n * apiKey: process.env.ANTHROPIC_API_KEY!,\n * });\n * const streamRunner = createStreamingRunner(streamingRunner);\n * const { stream, result } = streamRunner(agent, input);\n * ```\n */\nexport function createAnthropicStreamingRunner(\n options: AnthropicStreamingRunnerOptions,\n): StreamingCallbackRunner {\n const {\n apiKey,\n model = \"claude-sonnet-4-5-20250929\",\n maxTokens = 4096,\n baseURL = \"https://api.anthropic.com/v1\",\n fetch: fetchFn = globalThis.fetch,\n hooks,\n temperature,\n topP,\n stopSequences,\n } = options;\n\n validateBaseURL(baseURL);\n warnIfMissingApiKey(apiKey, \"createAnthropicStreamingRunner\");\n\n return async (agent, input, callbacks) => {\n const startTime = fireBeforeCallHook(hooks, agent, input);\n\n try {\n const response = await fetchFn(`${baseURL}/messages`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"x-api-key\": apiKey,\n \"anthropic-version\": \"2023-06-01\",\n },\n body: JSON.stringify({\n model: agent.model ?? model,\n max_tokens: maxTokens,\n ...(temperature != null ? { temperature } : {}),\n ...(topP != null ? { top_p: topP } : {}),\n ...(stopSequences != null ? { stop_sequences: stopSequences } : {}),\n system: agent.instructions ?? \"\",\n messages: [{ role: \"user\", content: input }],\n stream: true,\n }),\n signal: callbacks.signal,\n });\n\n if (!response.ok) {\n await throwStreamingHTTPError(response, \"Anthropic\");\n }\n\n const reader = getSSEReader(response);\n\n const { fullText, inputTokens, outputTokens } = await parseSSEStream(\n reader,\n callbacks.onToken,\n (event) => {\n if (event.type === \"error\") {\n throw new Error(\n `[Directive] Anthropic stream error: ${(event.error as Record<string, unknown>)?.message ?? JSON.stringify(event.error)}`,\n );\n }\n\n const result: {\n text?: string;\n inputTokens?: number;\n outputTokens?: number;\n } = {};\n if (\n event.type === \"content_block_delta\" &&\n (event.delta as Record<string, unknown>)?.type === \"text_delta\"\n ) {\n result.text = (event.delta as Record<string, unknown>)\n .text as string;\n }\n if (event.type === \"message_delta\" && event.usage) {\n result.outputTokens =\n ((event.usage as Record<string, unknown>)\n .output_tokens as number) ?? 0;\n }\n if (\n event.type === \"message_start\" &&\n (event.message as Record<string, unknown>)?.usage\n ) {\n result.inputTokens =\n ((\n (event.message as Record<string, unknown>).usage as Record<\n string,\n unknown\n >\n ).input_tokens as number) ?? 0;\n }\n\n return result;\n },\n \"Anthropic\",\n );\n\n const tokenUsage = { inputTokens, outputTokens };\n const totalTokens = inputTokens + outputTokens;\n\n callbacks.onMessage?.({ role: \"assistant\", content: fullText });\n fireAfterCallHook(\n hooks,\n agent,\n input,\n fullText,\n totalTokens,\n tokenUsage,\n startTime,\n );\n\n return buildStreamingResult(input, fullText, totalTokens, tokenUsage);\n } catch (err) {\n fireErrorHook(hooks, agent, input, err, startTime);\n\n throw err;\n }\n };\n}\n"]}
@@ -1,3 +1,3 @@
1
1
  async function k(e,t){let n=await e.text().catch(()=>"");throw new Error(`[Directive] ${t} streaming error ${e.status}${n?` \u2013 ${n.slice(0,200)}`:""}`)}function w(e){let t=e.body?.getReader();if(!t)throw new Error("[Directive] No response body");return t}function E(e,t){typeof process<"u"&&process.env?.NODE_ENV!=="production"&&!e&&console.warn(`[Directive] ${t}: apiKey is empty. API calls will fail.`);}async function T(e,t,n,o){let s=new TextDecoder,i="",a="",f=0,l=0;try{for(;;){let{done:g,value:m}=await e.read();if(g)break;i+=s.decode(m,{stream:!0});let d=i.split(`
2
- `);i=d.pop()??"";for(let p of d){if(!p.startsWith("data: "))continue;let c=p.slice(6).trim();if(c!=="[DONE]")try{let u=JSON.parse(c),r=n(u);r.text&&(a+=r.text,t?.(r.text)),r.inputTokens!==void 0&&(f=r.inputTokens),r.outputTokens!==void 0&&(l=r.outputTokens);}catch(u){if(u instanceof SyntaxError)typeof process<"u"&&process.env?.NODE_ENV==="development"&&console.warn(`[Directive] Malformed SSE event from ${o}:`,c);else throw u}}}}finally{e.cancel().catch(()=>{});}return {fullText:a,inputTokens:f,outputTokens:l}}function v(e,t,n){let o=Date.now();return e?.onBeforeCall?.({agent:t,input:n,timestamp:o}),o}function y(e,t,n,o,s,i,a){e?.onAfterCall?.({agent:t,input:n,output:o,totalTokens:s,tokenUsage:i,durationMs:Date.now()-a,timestamp:Date.now()});}function b(e,t,n,o,s){o instanceof Error&&e?.onError?.({agent:t,input:n,error:o,durationMs:Date.now()-s,timestamp:Date.now()});}function x(e,t,n,o){return {output:t,messages:[{role:"user",content:e},{role:"assistant",content:t}],toolCalls:[],totalTokens:n,tokenUsage:o}}export{k as a,w as b,E as c,T as d,v as e,y as f,b as g,x as h};//# sourceMappingURL=chunk-265ZKXYE.js.map
3
- //# sourceMappingURL=chunk-265ZKXYE.js.map
2
+ `);i=d.pop()??"";for(let p of d){if(!p.startsWith("data: "))continue;let c=p.slice(6).trim();if(c!=="[DONE]")try{let u=JSON.parse(c),r=n(u);r.text&&(a+=r.text,t?.(r.text)),r.inputTokens!==void 0&&(f=r.inputTokens),r.outputTokens!==void 0&&(l=r.outputTokens);}catch(u){if(u instanceof SyntaxError)typeof process<"u"&&process.env?.NODE_ENV==="development"&&console.warn(`[Directive] Malformed SSE event from ${o}:`,c);else throw u}}}}finally{e.cancel().catch(()=>{});}return {fullText:a,inputTokens:f,outputTokens:l}}function v(e,t,n){let o=Date.now();return e?.onBeforeCall?.({agent:t,input:n,timestamp:o}),o}function y(e,t,n,o,s,i,a){e?.onAfterCall?.({agent:t,input:n,output:o,totalTokens:s,tokenUsage:i,durationMs:Date.now()-a,timestamp:Date.now()});}function b(e,t,n,o,s){o instanceof Error&&e?.onError?.({agent:t,input:n,error:o,durationMs:Date.now()-s,timestamp:Date.now()});}function x(e,t,n,o){return {output:t,messages:[{role:"user",content:e},{role:"assistant",content:t}],toolCalls:[],totalTokens:n,tokenUsage:o}}export{k as a,w as b,E as c,T as d,v as e,y as f,b as g,x as h};//# sourceMappingURL=chunk-3PGRBK4E.js.map
3
+ //# sourceMappingURL=chunk-3PGRBK4E.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/adapters/shared.ts"],"names":["throwStreamingHTTPError","response","adapterName","errBody","getSSEReader","reader","warnIfMissingApiKey","apiKey","functionName","parseSSEStream","onToken","parseEvent","decoder","buf","fullText","inputTokens","outputTokens","done","value","lines","line","data","event","result","parseErr","fireBeforeCallHook","hooks","agent","input","startTime","fireAfterCallHook","output","totalTokens","tokenUsage","fireErrorHook","err","buildStreamingResult"],"mappings":"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","file":"chunk-3PGRBK4E.js","sourcesContent":["/**\n * Shared utilities for streaming adapters.\n *\n * Extracts common SSE parsing, error handling, hook lifecycle, and response\n * building logic used across Anthropic, OpenAI, and Gemini streaming runners.\n */\n\nimport type { AdapterHooks, AgentLike, Message, TokenUsage } from \"../types.js\";\n\n// ============================================================================\n// HTTP Error Handling\n// ============================================================================\n\n/**\n * Throw a standardized HTTP error from a streaming response.\n * Reads up to 200 chars of the error body for diagnostics.\n */\nexport async function throwStreamingHTTPError(\n response: Response,\n adapterName: string,\n): Promise<never> {\n const errBody = await response.text().catch(() => \"\");\n\n throw new Error(\n `[Directive] ${adapterName} streaming error ${response.status}${errBody ? ` – ${errBody.slice(0, 200)}` : \"\"}`,\n );\n}\n\n/**\n * Get an SSE reader from a response, throwing if body is missing.\n */\nexport function getSSEReader(\n response: Response,\n): ReadableStreamDefaultReader<Uint8Array> {\n const reader = response.body?.getReader();\n if (!reader) {\n throw new Error(\"[Directive] No response body\");\n }\n\n return reader;\n}\n\n// ============================================================================\n// API Key Validation\n// ============================================================================\n\n/**\n * Warn in non-production environments if an API key is empty.\n */\nexport function warnIfMissingApiKey(\n apiKey: string | undefined,\n functionName: string,\n): void {\n if (\n typeof process !== \"undefined\" &&\n process.env?.NODE_ENV !== \"production\" &&\n !apiKey\n ) {\n console.warn(\n `[Directive] ${functionName}: apiKey is empty. API calls will fail.`,\n );\n }\n}\n\n// ============================================================================\n// SSE Stream Parser\n// ============================================================================\n\n/** Result from parsing a single SSE event (provider-specific). */\nexport interface SSEEventResult {\n /** Text token to append to output. */\n text?: string;\n /** Updated input token count (cumulative, not delta). */\n inputTokens?: number;\n /** Updated output token count (cumulative, not delta). */\n outputTokens?: number;\n}\n\n/**\n * Parse an SSE stream from a Response, calling `onToken` for each text chunk\n * and `parseEvent` for provider-specific event extraction.\n *\n * Handles buffering, `[DONE]` sentinels, malformed JSON, and reader cleanup.\n *\n * @param reader - The ReadableStream reader from the response body.\n * @param onToken - Callback for each text token (may be undefined).\n * @param parseEvent - Provider-specific function to extract text and tokens from a parsed SSE event.\n * @param adapterName - Adapter name for dev-mode warnings.\n * @returns The full text output and final token counts.\n */\nexport async function parseSSEStream(\n reader: ReadableStreamDefaultReader<Uint8Array>,\n onToken: ((token: string) => void) | undefined,\n parseEvent: (event: Record<string, unknown>) => SSEEventResult,\n adapterName: string,\n): Promise<{ fullText: string; inputTokens: number; outputTokens: number }> {\n const decoder = new TextDecoder();\n let buf = \"\";\n let fullText = \"\";\n let inputTokens = 0;\n let outputTokens = 0;\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n break;\n }\n\n buf += decoder.decode(value, { stream: true });\n const lines = buf.split(\"\\n\");\n buf = lines.pop() ?? \"\";\n\n for (const line of lines) {\n if (!line.startsWith(\"data: \")) {\n continue;\n }\n const data = line.slice(6).trim();\n if (data === \"[DONE]\") {\n continue;\n }\n\n try {\n const event = JSON.parse(data);\n const result = parseEvent(event);\n if (result.text) {\n fullText += result.text;\n onToken?.(result.text);\n }\n if (result.inputTokens !== undefined) {\n inputTokens = result.inputTokens;\n }\n if (result.outputTokens !== undefined) {\n outputTokens = result.outputTokens;\n }\n } catch (parseErr) {\n if (parseErr instanceof SyntaxError) {\n if (\n typeof process !== \"undefined\" &&\n process.env?.NODE_ENV === \"development\"\n ) {\n console.warn(\n `[Directive] Malformed SSE event from ${adapterName}:`,\n data,\n );\n }\n } else {\n throw parseErr;\n }\n }\n }\n }\n } finally {\n reader.cancel().catch(() => {});\n }\n\n return { fullText, inputTokens, outputTokens };\n}\n\n// ============================================================================\n// Hook Lifecycle Helpers\n// ============================================================================\n\n/**\n * Fire the onBeforeCall hook and return the start timestamp.\n */\nexport function fireBeforeCallHook(\n hooks: AdapterHooks | undefined,\n agent: AgentLike,\n input: string,\n): number {\n const startTime = Date.now();\n hooks?.onBeforeCall?.({ agent, input, timestamp: startTime });\n\n return startTime;\n}\n\n/**\n * Fire the onAfterCall hook with timing and token data.\n */\nexport function fireAfterCallHook(\n hooks: AdapterHooks | undefined,\n agent: AgentLike,\n input: string,\n output: string,\n totalTokens: number,\n tokenUsage: TokenUsage,\n startTime: number,\n): void {\n hooks?.onAfterCall?.({\n agent,\n input,\n output,\n totalTokens,\n tokenUsage,\n durationMs: Date.now() - startTime,\n timestamp: Date.now(),\n });\n}\n\n/**\n * Fire the onError hook if the error is an Error instance.\n */\nexport function fireErrorHook(\n hooks: AdapterHooks | undefined,\n agent: AgentLike,\n input: string,\n err: unknown,\n startTime: number,\n): void {\n if (err instanceof Error) {\n hooks?.onError?.({\n agent,\n input,\n error: err,\n durationMs: Date.now() - startTime,\n timestamp: Date.now(),\n });\n }\n}\n\n// ============================================================================\n// Streaming Response Builder\n// ============================================================================\n\n/**\n * Build the standard streaming runner return value.\n */\nexport function buildStreamingResult(\n input: string,\n fullText: string,\n totalTokens: number,\n tokenUsage: TokenUsage,\n): {\n output: string;\n messages: Message[];\n toolCalls: never[];\n totalTokens: number;\n tokenUsage: TokenUsage;\n} {\n const assistantMsg: Message = { role: \"assistant\", content: fullText };\n\n return {\n output: fullText,\n messages: [{ role: \"user\" as const, content: input }, assistantMsg],\n toolCalls: [],\n totalTokens,\n tokenUsage,\n };\n}\n"]}
@@ -1,3 +1,3 @@
1
1
  'use strict';async function k(e,t){let n=await e.text().catch(()=>"");throw new Error(`[Directive] ${t} streaming error ${e.status}${n?` \u2013 ${n.slice(0,200)}`:""}`)}function w(e){let t=e.body?.getReader();if(!t)throw new Error("[Directive] No response body");return t}function E(e,t){typeof process<"u"&&process.env?.NODE_ENV!=="production"&&!e&&console.warn(`[Directive] ${t}: apiKey is empty. API calls will fail.`);}async function T(e,t,n,o){let s=new TextDecoder,i="",a="",f=0,l=0;try{for(;;){let{done:g,value:m}=await e.read();if(g)break;i+=s.decode(m,{stream:!0});let d=i.split(`
2
- `);i=d.pop()??"";for(let p of d){if(!p.startsWith("data: "))continue;let c=p.slice(6).trim();if(c!=="[DONE]")try{let u=JSON.parse(c),r=n(u);r.text&&(a+=r.text,t?.(r.text)),r.inputTokens!==void 0&&(f=r.inputTokens),r.outputTokens!==void 0&&(l=r.outputTokens);}catch(u){if(u instanceof SyntaxError)typeof process<"u"&&process.env?.NODE_ENV==="development"&&console.warn(`[Directive] Malformed SSE event from ${o}:`,c);else throw u}}}}finally{e.cancel().catch(()=>{});}return {fullText:a,inputTokens:f,outputTokens:l}}function v(e,t,n){let o=Date.now();return e?.onBeforeCall?.({agent:t,input:n,timestamp:o}),o}function y(e,t,n,o,s,i,a){e?.onAfterCall?.({agent:t,input:n,output:o,totalTokens:s,tokenUsage:i,durationMs:Date.now()-a,timestamp:Date.now()});}function b(e,t,n,o,s){o instanceof Error&&e?.onError?.({agent:t,input:n,error:o,durationMs:Date.now()-s,timestamp:Date.now()});}function x(e,t,n,o){return {output:t,messages:[{role:"user",content:e},{role:"assistant",content:t}],toolCalls:[],totalTokens:n,tokenUsage:o}}exports.a=k;exports.b=w;exports.c=E;exports.d=T;exports.e=v;exports.f=y;exports.g=b;exports.h=x;//# sourceMappingURL=chunk-QXMXSHYS.cjs.map
3
- //# sourceMappingURL=chunk-QXMXSHYS.cjs.map
2
+ `);i=d.pop()??"";for(let p of d){if(!p.startsWith("data: "))continue;let c=p.slice(6).trim();if(c!=="[DONE]")try{let u=JSON.parse(c),r=n(u);r.text&&(a+=r.text,t?.(r.text)),r.inputTokens!==void 0&&(f=r.inputTokens),r.outputTokens!==void 0&&(l=r.outputTokens);}catch(u){if(u instanceof SyntaxError)typeof process<"u"&&process.env?.NODE_ENV==="development"&&console.warn(`[Directive] Malformed SSE event from ${o}:`,c);else throw u}}}}finally{e.cancel().catch(()=>{});}return {fullText:a,inputTokens:f,outputTokens:l}}function v(e,t,n){let o=Date.now();return e?.onBeforeCall?.({agent:t,input:n,timestamp:o}),o}function y(e,t,n,o,s,i,a){e?.onAfterCall?.({agent:t,input:n,output:o,totalTokens:s,tokenUsage:i,durationMs:Date.now()-a,timestamp:Date.now()});}function b(e,t,n,o,s){o instanceof Error&&e?.onError?.({agent:t,input:n,error:o,durationMs:Date.now()-s,timestamp:Date.now()});}function x(e,t,n,o){return {output:t,messages:[{role:"user",content:e},{role:"assistant",content:t}],toolCalls:[],totalTokens:n,tokenUsage:o}}exports.a=k;exports.b=w;exports.c=E;exports.d=T;exports.e=v;exports.f=y;exports.g=b;exports.h=x;//# sourceMappingURL=chunk-KP3G32S7.cjs.map
3
+ //# sourceMappingURL=chunk-KP3G32S7.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/adapters/shared.ts"],"names":["throwStreamingHTTPError","response","adapterName","errBody","getSSEReader","reader","warnIfMissingApiKey","apiKey","functionName","parseSSEStream","onToken","parseEvent","decoder","buf","fullText","inputTokens","outputTokens","done","value","lines","line","data","event","result","parseErr","fireBeforeCallHook","hooks","agent","input","startTime","fireAfterCallHook","output","totalTokens","tokenUsage","fireErrorHook","err","buildStreamingResult"],"mappings":"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","file":"chunk-KP3G32S7.cjs","sourcesContent":["/**\n * Shared utilities for streaming adapters.\n *\n * Extracts common SSE parsing, error handling, hook lifecycle, and response\n * building logic used across Anthropic, OpenAI, and Gemini streaming runners.\n */\n\nimport type { AdapterHooks, AgentLike, Message, TokenUsage } from \"../types.js\";\n\n// ============================================================================\n// HTTP Error Handling\n// ============================================================================\n\n/**\n * Throw a standardized HTTP error from a streaming response.\n * Reads up to 200 chars of the error body for diagnostics.\n */\nexport async function throwStreamingHTTPError(\n response: Response,\n adapterName: string,\n): Promise<never> {\n const errBody = await response.text().catch(() => \"\");\n\n throw new Error(\n `[Directive] ${adapterName} streaming error ${response.status}${errBody ? ` – ${errBody.slice(0, 200)}` : \"\"}`,\n );\n}\n\n/**\n * Get an SSE reader from a response, throwing if body is missing.\n */\nexport function getSSEReader(\n response: Response,\n): ReadableStreamDefaultReader<Uint8Array> {\n const reader = response.body?.getReader();\n if (!reader) {\n throw new Error(\"[Directive] No response body\");\n }\n\n return reader;\n}\n\n// ============================================================================\n// API Key Validation\n// ============================================================================\n\n/**\n * Warn in non-production environments if an API key is empty.\n */\nexport function warnIfMissingApiKey(\n apiKey: string | undefined,\n functionName: string,\n): void {\n if (\n typeof process !== \"undefined\" &&\n process.env?.NODE_ENV !== \"production\" &&\n !apiKey\n ) {\n console.warn(\n `[Directive] ${functionName}: apiKey is empty. API calls will fail.`,\n );\n }\n}\n\n// ============================================================================\n// SSE Stream Parser\n// ============================================================================\n\n/** Result from parsing a single SSE event (provider-specific). */\nexport interface SSEEventResult {\n /** Text token to append to output. */\n text?: string;\n /** Updated input token count (cumulative, not delta). */\n inputTokens?: number;\n /** Updated output token count (cumulative, not delta). */\n outputTokens?: number;\n}\n\n/**\n * Parse an SSE stream from a Response, calling `onToken` for each text chunk\n * and `parseEvent` for provider-specific event extraction.\n *\n * Handles buffering, `[DONE]` sentinels, malformed JSON, and reader cleanup.\n *\n * @param reader - The ReadableStream reader from the response body.\n * @param onToken - Callback for each text token (may be undefined).\n * @param parseEvent - Provider-specific function to extract text and tokens from a parsed SSE event.\n * @param adapterName - Adapter name for dev-mode warnings.\n * @returns The full text output and final token counts.\n */\nexport async function parseSSEStream(\n reader: ReadableStreamDefaultReader<Uint8Array>,\n onToken: ((token: string) => void) | undefined,\n parseEvent: (event: Record<string, unknown>) => SSEEventResult,\n adapterName: string,\n): Promise<{ fullText: string; inputTokens: number; outputTokens: number }> {\n const decoder = new TextDecoder();\n let buf = \"\";\n let fullText = \"\";\n let inputTokens = 0;\n let outputTokens = 0;\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n break;\n }\n\n buf += decoder.decode(value, { stream: true });\n const lines = buf.split(\"\\n\");\n buf = lines.pop() ?? \"\";\n\n for (const line of lines) {\n if (!line.startsWith(\"data: \")) {\n continue;\n }\n const data = line.slice(6).trim();\n if (data === \"[DONE]\") {\n continue;\n }\n\n try {\n const event = JSON.parse(data);\n const result = parseEvent(event);\n if (result.text) {\n fullText += result.text;\n onToken?.(result.text);\n }\n if (result.inputTokens !== undefined) {\n inputTokens = result.inputTokens;\n }\n if (result.outputTokens !== undefined) {\n outputTokens = result.outputTokens;\n }\n } catch (parseErr) {\n if (parseErr instanceof SyntaxError) {\n if (\n typeof process !== \"undefined\" &&\n process.env?.NODE_ENV === \"development\"\n ) {\n console.warn(\n `[Directive] Malformed SSE event from ${adapterName}:`,\n data,\n );\n }\n } else {\n throw parseErr;\n }\n }\n }\n }\n } finally {\n reader.cancel().catch(() => {});\n }\n\n return { fullText, inputTokens, outputTokens };\n}\n\n// ============================================================================\n// Hook Lifecycle Helpers\n// ============================================================================\n\n/**\n * Fire the onBeforeCall hook and return the start timestamp.\n */\nexport function fireBeforeCallHook(\n hooks: AdapterHooks | undefined,\n agent: AgentLike,\n input: string,\n): number {\n const startTime = Date.now();\n hooks?.onBeforeCall?.({ agent, input, timestamp: startTime });\n\n return startTime;\n}\n\n/**\n * Fire the onAfterCall hook with timing and token data.\n */\nexport function fireAfterCallHook(\n hooks: AdapterHooks | undefined,\n agent: AgentLike,\n input: string,\n output: string,\n totalTokens: number,\n tokenUsage: TokenUsage,\n startTime: number,\n): void {\n hooks?.onAfterCall?.({\n agent,\n input,\n output,\n totalTokens,\n tokenUsage,\n durationMs: Date.now() - startTime,\n timestamp: Date.now(),\n });\n}\n\n/**\n * Fire the onError hook if the error is an Error instance.\n */\nexport function fireErrorHook(\n hooks: AdapterHooks | undefined,\n agent: AgentLike,\n input: string,\n err: unknown,\n startTime: number,\n): void {\n if (err instanceof Error) {\n hooks?.onError?.({\n agent,\n input,\n error: err,\n durationMs: Date.now() - startTime,\n timestamp: Date.now(),\n });\n }\n}\n\n// ============================================================================\n// Streaming Response Builder\n// ============================================================================\n\n/**\n * Build the standard streaming runner return value.\n */\nexport function buildStreamingResult(\n input: string,\n fullText: string,\n totalTokens: number,\n tokenUsage: TokenUsage,\n): {\n output: string;\n messages: Message[];\n toolCalls: never[];\n totalTokens: number;\n tokenUsage: TokenUsage;\n} {\n const assistantMsg: Message = { role: \"assistant\", content: fullText };\n\n return {\n output: fullText,\n messages: [{ role: \"user\" as const, content: input }, assistantMsg],\n toolCalls: [],\n totalTokens,\n tokenUsage,\n };\n}\n"]}
@@ -1,4 +1,4 @@
1
- import {f,y,n,z,o,i,q,s,u,w,x,j,v,A,F,E,p,k,l,a,m,t as t$1,r,g,I,C,B,d,e}from'./chunk-K2LZMRLN.js';import {t,createModule,createSystem}from'@directive-run/core';import {requirementGuard,createCallbackPlugin,setBridgeFact,getBridgeFact}from'@directive-run/core/adapter-utils';var Ue=500,je=200;function bt(me){let{runner:V,factsSchema:ge={},init:fe,constraints:He={},resolvers:We={},guardrails:P={},onApprovalRequest:re,autoApproveToolCalls:ne=true,maxTokenBudget:H,budgetWarningThreshold:J=.8,onBudgetWarning:he,plugins:Xe=[],debug:ke=false,approvalTimeoutMs:ae=3e5,agentRetry:z$1,hooks:ve={},memory:_,circuitBreaker:oe,selfHealing:T,outputSchema:Ke,maxSchemaRetries:Ye,checkpointStore:be,breakpoints:S,onBreakpoint:Ve,breakpointTimeoutMs:Je}=me,C$1=typeof ke=="object"?true:!!ke,se=5e3;if(C$1&&T&&!oe&&console.warn("[Directive] selfHealing config has no effect without a circuitBreaker \u2014 fallback behavior requires the circuit breaker to detect failures."),J<0||J>1)throw new Error(`[Directive Orchestrator] budgetWarningThreshold must be between 0 and 1, got ${J}`);if(!ne&&!re)throw new Error(`[Directive] Invalid approval configuration: autoApproveToolCalls is false but no onApprovalRequest callback provided. Tool calls would wait for approval indefinitely. Either:
1
+ import {f,y,n,z,o,i,q,s,u,w,x,j,v,A,F,E,p,k,l,a,m,t as t$1,r,g,I,C,B,d,e}from'./chunk-RW4R3O5P.js';import {t,createModule,createSystem}from'@directive-run/core';import {requirementGuard,createCallbackPlugin,setBridgeFact,getBridgeFact}from'@directive-run/core/adapter-utils';var Ue=500,je=200;function bt(me){let{runner:V,factsSchema:ge={},init:fe,constraints:He={},resolvers:We={},guardrails:P={},onApprovalRequest:re,autoApproveToolCalls:ne=true,maxTokenBudget:H,budgetWarningThreshold:J=.8,onBudgetWarning:he,plugins:Xe=[],debug:ke=false,approvalTimeoutMs:ae=3e5,agentRetry:z$1,hooks:ve={},memory:_,circuitBreaker:oe,selfHealing:T,outputSchema:Ke,maxSchemaRetries:Ye,checkpointStore:be,breakpoints:S,onBreakpoint:Ve,breakpointTimeoutMs:Je}=me,C$1=typeof ke=="object"?true:!!ke,se=5e3;if(C$1&&T&&!oe&&console.warn("[Directive] selfHealing config has no effect without a circuitBreaker \u2014 fallback behavior requires the circuit breaker to detect failures."),J<0||J>1)throw new Error(`[Directive Orchestrator] budgetWarningThreshold must be between 0 and 1, got ${J}`);if(!ne&&!re)throw new Error(`[Directive] Invalid approval configuration: autoApproveToolCalls is false but no onApprovalRequest callback provided. Tool calls would wait for approval indefinitely. Either:
2
2
  - Set autoApproveToolCalls: true to auto-approve all tool calls
3
3
  - Provide an onApprovalRequest callback to handle approvals programmatically`);function $(e,r){try{ve[e]?.(r);}catch(o){C$1&&console.debug(`[Directive] hooks.${e} threw:`,o);}}let ye=["agent","approval","conversation","toolCalls"];for(let e of Object.keys(ge))if(ye.includes(e))throw new Error(`[Directive] Facts schema key "${e}" conflicts with orchestrator state. Reserved keys: ${ye.join(", ")}. Rename your fact to avoid the collision.`);let ze={facts:{...f.facts,...ge,__budgetWarningFired:t.boolean()},derivations:{},events:{},requirements:{}},Te,t$2,we=y(He);H&&(we.__budgetLimit={priority:100,when:e=>n(e).tokenUsage>H,require:{type:"__PAUSE_BUDGET_EXCEEDED"}});let Re=z(We,(e,r,o,a)=>Te(e,r,o,a),()=>t$2.facts);Re.__pause={requirement:requirementGuard("__PAUSE_BUDGET_EXCEEDED"),resolve:async(e,r)=>{let o$1=n(r.facts);o(r.facts,{...o$1,status:"paused"});}};let f$1=null;C$1&&(f$1=i({getSnapshotId:()=>{try{return t$2.history?.currentIndex??null}catch{return null}},goToSnapshot:e=>{try{t$2.history?.goTo?.(e);}catch{}}}));let Qe=createCallbackPlugin("directive-ai-callbacks",{}),Ze=createModule("directive-ai-orchestrator",{schema:ze,init:e=>{if(o(e,{status:"idle",currentAgent:null,input:null,output:null,error:null,tokenUsage:0,turnCount:0,startedAt:null,completedAt:null}),q(e,{pending:[],approved:[],rejected:[]}),s(e,[]),u(e,[]),w(e,{pending:[],resolved:[],cancelled:[]}),setBridgeFact(e,"__budgetWarningFired",false),fe){let r=x(e),o={...e,...r};fe(o);}},constraints:we,resolvers:Re}),Ae=[...Xe,Qe];C$1&&f$1&&Ae.push(j(f$1,()=>{try{return t$2.history?.currentIndex??null}catch{return null}})),t$2=createSystem({module:Ze,plugins:Ae,history:C$1?true:void 0}),t$2.start();async function Se(e,r,o,a,i){if(oe)try{return await oe.execute(()=>Ce(e,r,o,a,i))}catch(u){if(T){if(T.fallbackRunners)for(let m of T.fallbackRunners)try{let b={originalAgent:e.name,reroutedTo:"fallback-runner",reason:u instanceof Error?u.message:String(u),timestamp:Date.now()};try{T.onReroute?.(b);}catch{}return f$1&&f$1.record({type:"reroute",timestamp:Date.now(),agentId:e.name,snapshotId:null,from:e.name,to:"fallback-runner",reason:u instanceof Error?u.message:String(u)}),await m(e,r,a)}catch{}if(T.fallbackAgent)try{let m={originalAgent:e.name,reroutedTo:T.fallbackAgent.name,reason:u instanceof Error?u.message:String(u),timestamp:Date.now()};try{T.onReroute?.(m);}catch{}return f$1&&f$1.record({type:"reroute",timestamp:Date.now(),agentId:e.name,snapshotId:null,from:e.name,to:T.fallbackAgent.name,reason:u instanceof Error?u.message:String(u)}),await V(T.fallbackAgent,r,a)}catch{}if(T.degradation==="fallback-response"&&T.fallbackResponse!==void 0)return {output:T.fallbackResponse,messages:[],toolCalls:[],totalTokens:0}}throw u}return Ce(e,r,o,a,i)}async function Ce(e,r$1,o$1,a$1,i){let u$1=Date.now();if(_){let n=_.getContextMessages();if(n.length>0){let c=n.map(v=>`${v.role}: ${v.content}`).join(`
4
4
  `);e={...e,instructions:(e.instructions??"")+`
@@ -12,5 +12,5 @@ Solutions:
12
12
  2. Set autoApproveToolCalls: true to auto-approve
13
13
  3. Increase approvalTimeoutMs (current: ${ae}ms)
14
14
  See: https://directive.run/docs/ai/running-agents`));},ae);})}function _e(){return {...x(t$2.facts)}}return {system:t$2,get facts(){return _e()},get totalTokens(){return n(t$2.facts).tokenUsage},get timeline(){return f$1},async run(e,r,o){return Se(e,r,_e(),void 0,o)},runStream(e,r$1,o$1={}){let a$1=new AbortController,i=1e4,u$1=[],m$1=[],b=false,D=Date.now(),w=0,A=1e5,l$1="",F;o$1.signal&&(F=()=>a$1.abort(),o$1.signal.addEventListener("abort",F,{once:true}));let Z=()=>{F&&o$1.signal&&o$1.signal.removeEventListener("abort",F);},k$1=d=>{if(b)return;let p=m$1.shift();p?p(d):(u$1.push(d),u$1.length>i&&u$1.shift());},n$1=()=>{b=true,Z();for(let d of m$1)d(null);m$1.length=0;},c=(async()=>{k$1({type:"progress",phase:"starting",message:"Running input guardrails"});try{let d=r$1,p$1=(P.input??[]).map((s,y)=>k(s,y,"input"));for(let s of p$1){let{name:y}=s,B={agentName:e.name,input:d,facts:t$2.facts.$store.toObject()},g=await l(s,{input:d,agentName:e.name},B);if(!g.passed)throw k$1({type:"guardrail_triggered",guardrailName:y,reason:g.reason??"Input validation failed",partialOutput:l$1,stopped:!0}),new a({code:"INPUT_GUARDRAIL_FAILED",message:`Input guardrail "${y}" failed: ${g.reason}`,guardrailName:y,guardrailType:"input",userMessage:g.reason??"Input validation failed",agentName:e.name,input:d});g.transformed!==void 0&&(d=g.transformed);}k$1({type:"progress",phase:"generating",message:"Starting agent"}),t$2.batch(()=>{let s=n(t$2.facts);o(t$2.facts,{...s,status:"running",currentAgent:e.name,input:d,startedAt:Date.now()});});let h=await m(V,e,d,{signal:a$1.signal,onMessage:s$1=>{let y=r(t$2.facts);if(s(t$2.facts,[...y,s$1]),k$1({type:"message",message:s$1}),s$1.role==="assistant"&&s$1.content){let B=Math.ceil(s$1.content.length/4);w+=B,l$1+=s$1.content,l$1.length>A&&(l$1=l$1.slice(-A)),k$1({type:"token",data:s$1.content,tokenCount:w});}},onToolCall:async s=>{k$1({type:"tool_start",tool:s.name,toolCallId:s.id,arguments:s.arguments});let y=(P.toolCall??[]).map((g,O)=>k(g,O,"toolCall"));for(let g of y){let{name:O}=g,ee={agentName:e.name,input:d,facts:t$2.facts.$store.toObject()},te=await l(g,{toolCall:s,agentName:e.name,input:d},ee);if(!te.passed)throw k$1({type:"guardrail_triggered",guardrailName:O,reason:te.reason??"Tool call blocked",partialOutput:l$1,stopped:!0}),new a({code:"TOOL_CALL_GUARDRAIL_FAILED",message:`Tool call guardrail "${O}" failed: ${te.reason}`,guardrailName:O,guardrailType:"toolCall",userMessage:te.reason??"Tool call blocked",data:{toolCall:s},agentName:e.name,input:d})}if(!ne){let g=`tool-${s.id}`;k$1({type:"approval_required",requestId:g,toolName:s.name});let O={id:g,type:"tool_call",agentName:e.name,description:`Tool call: ${s.name}`,data:s,requestedAt:Date.now()};t$2.batch(()=>{let ee=p(t$2.facts);q(t$2.facts,{...ee,pending:[...ee.pending,O]});}),re?.(O),await Ee(g,a$1.signal),k$1({type:"approval_resolved",requestId:g,approved:!0});}let B=t$1(t$2.facts);u(t$2.facts,[...B,s]),s.result&&k$1({type:"tool_end",tool:s.name,toolCallId:s.id,result:s.result});}},z$1);k$1({type:"progress",phase:"finishing",message:"Running output guardrails"});let L=(P.output??[]).map((s,y)=>k(s,y,"output"));for(let s of L){let{name:y}=s,B={agentName:e.name,input:d,facts:t$2.facts.$store.toObject()},g=await l(s,{output:h.output,agentName:e.name,input:d,messages:h.messages},B);if(!g.passed)throw k$1({type:"guardrail_triggered",guardrailName:y,reason:g.reason??"Output validation failed",partialOutput:typeof h.output=="string"?h.output:"",stopped:!0}),new a({code:"OUTPUT_GUARDRAIL_FAILED",message:`Output guardrail "${y}" failed: ${g.reason}`,guardrailName:y,guardrailType:"output",userMessage:g.reason??"Output validation failed",agentName:e.name,input:d});g.transformed!==void 0&&(h.output=g.transformed);}t$2.batch(()=>{let s=n(t$2.facts);o(t$2.facts,{...s,status:"completed",output:h.output,tokenUsage:s.tokenUsage+h.totalTokens,turnCount:s.turnCount+h.messages.length,completedAt:Date.now()});});let ie=Date.now()-D;return k$1({type:"done",totalTokens:h.totalTokens,duration:ie,droppedTokens:0}),n$1(),h}catch(d){throw k$1({type:"error",error:d instanceof Error?d:new Error(String(d))}),n$1(),d}})();return c.catch(()=>{}),{stream:{[Symbol.asyncIterator](){return {async next(){return u$1.length>0?{done:false,value:u$1.shift()}:b?{done:true,value:void 0}:new Promise(d=>{m$1.push(p=>{d(p===null?{done:true,value:void 0}:{done:false,value:p});});})}}}},result:c,abort:()=>{a$1.abort(),n$1();}}},async waitForIdle(e){let r=()=>n(t$2.facts).status!=="running";if(r())return;let o=Date.now();for(;!r();){if(e!==void 0&&Date.now()-o>e)throw new Error("[Directive Orchestrator] waitForIdle timed out");await new Promise(a=>setTimeout(a,50));}},approve(e){t$2.batch(()=>{let r=p(t$2.facts);if(!r.pending.some(i=>i.id===e)){C$1&&console.debug(`[Directive] approve() ignored: no pending request "${e}"`);return}let o=200,a=[...r.approved,e];q(t$2.facts,{...r,pending:r.pending.filter(i=>i.id!==e),approved:a.length>o?a.slice(-o):a});});},reject(e,r){t$2.batch(()=>{let o=p(t$2.facts);if(!o.pending.some(m=>m.id===e)){C$1&&console.debug(`[Directive] reject() ignored: no pending request "${e}"`);return}r&&C$1&&console.debug(`[Directive] Request ${e} rejected: ${r}`);let a={id:e,reason:r,rejectedAt:Date.now()},i=200,u=[...o.rejected,a];q(t$2.facts,{...o,pending:o.pending.filter(m=>m.id!==e),rejected:u.length>i?u.slice(-i):u});});},pause(){let e=n(t$2.facts);o(t$2.facts,{...e,status:"paused"});},resume(){let e=n(t$2.facts);e.status==="paused"&&o(t$2.facts,{...e,status:e.currentAgent?"running":"idle"});},reset(){t$2.batch(()=>{o(t$2.facts,{status:"idle",currentAgent:null,input:null,output:null,error:null,tokenUsage:0,turnCount:0,startedAt:null,completedAt:null}),q(t$2.facts,{pending:[],approved:[],rejected:[]}),s(t$2.facts,[]),u(t$2.facts,[]),w(t$2.facts,{pending:[],resolved:[],cancelled:[]}),setBridgeFact(t$2.facts,"__budgetWarningFired",false);}),G.clear(),W.clear();},async checkpoint(e){if(n(t$2.facts).status==="running")throw new Error("[Directive] Cannot checkpoint while agent is running");if(!t$2.history?.export)throw new Error("[Directive] Checkpointing requires history. Set `debug: true` in orchestrator options.");let o={version:1,id:E(),createdAt:new Date().toISOString(),label:e?.label,systemExport:t$2.history.export(),timelineExport:f$1?.export()??null,localState:{type:"single"},memoryExport:_?_.export?.()??null:null,orchestratorType:"single"};return be&&await be.save(o),o},restore(e,r){if(!F(e))throw new Error("[Directive] Invalid checkpoint data");if(e.orchestratorType!=="single")throw new Error("[Directive] Cannot restore multi-agent checkpoint in single-agent orchestrator");if(!t$2.history?.import)throw new Error("[Directive] Restoring a checkpoint requires history. Set `debug: true` in orchestrator options.");t$2.history.import(e.systemExport),r?.restoreTimeline!==false&&e.timelineExport&&f$1&&f$1.import(e.timelineExport),e.memoryExport!==null&&_&&_.import&&_.import(e.memoryExport);},resumeBreakpoint(e,r){r&&G.set(e,r),t$2.batch(()=>{let o=v(t$2.facts),a=[...o.resolved,e];w(t$2.facts,{...o,pending:o.pending.filter(i=>i.id!==e),resolved:a.length>A?a.slice(-A):a});});},cancelBreakpoint(e,r){r&&W.set(e,r),t$2.batch(()=>{let o=v(t$2.facts),a=[...o.cancelled,e];w(t$2.facts,{...o,pending:o.pending.filter(i=>i.id!==e),cancelled:a.length>A?a.slice(-A):a});});},getPendingBreakpoints(){return [...v(t$2.facts).pending]},destroy(){t$2.destroy();}}}
15
- export{bt as a};//# sourceMappingURL=chunk-5ERCL33C.js.map
16
- //# sourceMappingURL=chunk-5ERCL33C.js.map
15
+ export{bt as a};//# sourceMappingURL=chunk-Q3PQLWBR.js.map
16
+ //# sourceMappingURL=chunk-Q3PQLWBR.js.map