@witqq/agent-sdk 0.6.0 → 0.7.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 (122) hide show
  1. package/README.md +433 -6
  2. package/dist/auth/index.cjs +188 -1
  3. package/dist/auth/index.cjs.map +1 -1
  4. package/dist/auth/index.d.cts +154 -138
  5. package/dist/auth/index.d.ts +154 -138
  6. package/dist/auth/index.js +188 -2
  7. package/dist/auth/index.js.map +1 -1
  8. package/dist/backends/claude.cjs +341 -22
  9. package/dist/backends/claude.cjs.map +1 -1
  10. package/dist/backends/claude.d.cts +2 -1
  11. package/dist/backends/claude.d.ts +2 -1
  12. package/dist/backends/claude.js +341 -22
  13. package/dist/backends/claude.js.map +1 -1
  14. package/dist/backends/copilot.cjs +133 -25
  15. package/dist/backends/copilot.cjs.map +1 -1
  16. package/dist/backends/copilot.d.cts +2 -1
  17. package/dist/backends/copilot.d.ts +2 -1
  18. package/dist/backends/copilot.js +133 -25
  19. package/dist/backends/copilot.js.map +1 -1
  20. package/dist/backends/vercel-ai.cjs +66 -19
  21. package/dist/backends/vercel-ai.cjs.map +1 -1
  22. package/dist/backends/vercel-ai.d.cts +1 -1
  23. package/dist/backends/vercel-ai.d.ts +1 -1
  24. package/dist/backends/vercel-ai.js +66 -19
  25. package/dist/backends/vercel-ai.js.map +1 -1
  26. package/dist/chat/accumulator.cjs +147 -0
  27. package/dist/chat/accumulator.cjs.map +1 -0
  28. package/dist/chat/accumulator.d.cts +61 -0
  29. package/dist/chat/accumulator.d.ts +61 -0
  30. package/dist/chat/accumulator.js +145 -0
  31. package/dist/chat/accumulator.js.map +1 -0
  32. package/dist/chat/backends.cjs +3534 -0
  33. package/dist/chat/backends.cjs.map +1 -0
  34. package/dist/chat/backends.d.cts +62 -0
  35. package/dist/chat/backends.d.ts +62 -0
  36. package/dist/chat/backends.js +3501 -0
  37. package/dist/chat/backends.js.map +1 -0
  38. package/dist/chat/context.cjs +230 -0
  39. package/dist/chat/context.cjs.map +1 -0
  40. package/dist/chat/context.d.cts +167 -0
  41. package/dist/chat/context.d.ts +167 -0
  42. package/dist/chat/context.js +227 -0
  43. package/dist/chat/context.js.map +1 -0
  44. package/dist/chat/core.cjs +282 -0
  45. package/dist/chat/core.cjs.map +1 -0
  46. package/dist/chat/core.d.cts +435 -0
  47. package/dist/chat/core.d.ts +435 -0
  48. package/dist/chat/core.js +261 -0
  49. package/dist/chat/core.js.map +1 -0
  50. package/dist/chat/errors.cjs +251 -0
  51. package/dist/chat/errors.cjs.map +1 -0
  52. package/dist/chat/errors.d.cts +122 -0
  53. package/dist/chat/errors.d.ts +122 -0
  54. package/dist/chat/errors.js +243 -0
  55. package/dist/chat/errors.js.map +1 -0
  56. package/dist/chat/events.cjs +203 -0
  57. package/dist/chat/events.cjs.map +1 -0
  58. package/dist/chat/events.d.cts +241 -0
  59. package/dist/chat/events.d.ts +241 -0
  60. package/dist/chat/events.js +196 -0
  61. package/dist/chat/events.js.map +1 -0
  62. package/dist/chat/index.cjs +5359 -0
  63. package/dist/chat/index.cjs.map +1 -0
  64. package/dist/chat/index.d.cts +52 -0
  65. package/dist/chat/index.d.ts +52 -0
  66. package/dist/chat/index.js +5296 -0
  67. package/dist/chat/index.js.map +1 -0
  68. package/dist/chat/react.cjs +2739 -0
  69. package/dist/chat/react.cjs.map +1 -0
  70. package/dist/chat/react.d.cts +619 -0
  71. package/dist/chat/react.d.ts +619 -0
  72. package/dist/chat/react.js +2714 -0
  73. package/dist/chat/react.js.map +1 -0
  74. package/dist/chat/runtime.cjs +1030 -0
  75. package/dist/chat/runtime.cjs.map +1 -0
  76. package/dist/chat/runtime.d.cts +118 -0
  77. package/dist/chat/runtime.d.ts +118 -0
  78. package/dist/chat/runtime.js +1028 -0
  79. package/dist/chat/runtime.js.map +1 -0
  80. package/dist/chat/server.cjs +643 -0
  81. package/dist/chat/server.cjs.map +1 -0
  82. package/dist/chat/server.d.cts +287 -0
  83. package/dist/chat/server.d.ts +287 -0
  84. package/dist/chat/server.js +617 -0
  85. package/dist/chat/server.js.map +1 -0
  86. package/dist/chat/sessions.cjs +398 -0
  87. package/dist/chat/sessions.cjs.map +1 -0
  88. package/dist/chat/sessions.d.cts +239 -0
  89. package/dist/chat/sessions.d.ts +239 -0
  90. package/dist/chat/sessions.js +394 -0
  91. package/dist/chat/sessions.js.map +1 -0
  92. package/dist/chat/state.cjs +177 -0
  93. package/dist/chat/state.cjs.map +1 -0
  94. package/dist/chat/state.d.cts +92 -0
  95. package/dist/chat/state.d.ts +92 -0
  96. package/dist/chat/state.js +167 -0
  97. package/dist/chat/state.js.map +1 -0
  98. package/dist/chat/storage.cjs +240 -0
  99. package/dist/chat/storage.cjs.map +1 -0
  100. package/dist/chat/storage.d.cts +191 -0
  101. package/dist/chat/storage.d.ts +191 -0
  102. package/dist/chat/storage.js +236 -0
  103. package/dist/chat/storage.js.map +1 -0
  104. package/dist/errors-BDLbNu9w.d.cts +13 -0
  105. package/dist/errors-BDLbNu9w.d.ts +13 -0
  106. package/dist/in-process-transport-C2oPTYs6.d.ts +223 -0
  107. package/dist/in-process-transport-DG-w5G6k.d.cts +223 -0
  108. package/dist/index.cjs +25 -13
  109. package/dist/index.cjs.map +1 -1
  110. package/dist/index.d.cts +32 -4
  111. package/dist/index.d.ts +32 -4
  112. package/dist/index.js +25 -13
  113. package/dist/index.js.map +1 -1
  114. package/dist/transport-D1OaUgRk.d.ts +67 -0
  115. package/dist/transport-DX1Nhm4N.d.cts +67 -0
  116. package/dist/types-Bh5AhqD-.d.ts +141 -0
  117. package/dist/types-CGF7AEX1.d.cts +141 -0
  118. package/dist/{types-BvwNzZCj.d.cts → types-CqvUAYxt.d.cts} +21 -3
  119. package/dist/{types-BvwNzZCj.d.ts → types-CqvUAYxt.d.ts} +21 -3
  120. package/dist/types-DLZzlJxt.d.ts +39 -0
  121. package/dist/types-tE0CXwBl.d.cts +39 -0
  122. package/package.json +149 -2
@@ -6,10 +6,16 @@ function getTextContent(content) {
6
6
 
7
7
  // src/errors.ts
8
8
  var AgentSDKError = class extends Error {
9
+ /** @internal Marker for cross-bundle identity checks */
10
+ _agentSDKError = true;
9
11
  constructor(message, options) {
10
12
  super(message, options);
11
13
  this.name = "AgentSDKError";
12
14
  }
15
+ /** Check if an error is an AgentSDKError (works across bundled copies) */
16
+ static is(error) {
17
+ return error instanceof Error && "_agentSDKError" in error && error._agentSDKError === true;
18
+ }
13
19
  };
14
20
  var ReentrancyError = class extends AgentSDKError {
15
21
  constructor() {
@@ -51,6 +57,7 @@ var BaseAgent = class {
51
57
  state = "idle";
52
58
  abortController = null;
53
59
  config;
60
+ _cleanupExternalSignal = null;
54
61
  /** CLI session ID for persistent mode. Override in backends that support it. */
55
62
  get sessionId() {
56
63
  return void 0;
@@ -70,8 +77,7 @@ var BaseAgent = class {
70
77
  this.enrichAndNotifyUsage(result);
71
78
  return result;
72
79
  } finally {
73
- this.state = "idle";
74
- this.abortController = null;
80
+ this.cleanupRun();
75
81
  }
76
82
  }
77
83
  async runWithContext(messages, options) {
@@ -84,8 +90,7 @@ var BaseAgent = class {
84
90
  this.enrichAndNotifyUsage(result);
85
91
  return result;
86
92
  } finally {
87
- this.state = "idle";
88
- this.abortController = null;
93
+ this.cleanupRun();
89
94
  }
90
95
  }
91
96
  async runStructured(prompt, schema, options) {
@@ -104,8 +109,7 @@ var BaseAgent = class {
104
109
  this.enrichAndNotifyUsage(result);
105
110
  return result;
106
111
  } finally {
107
- this.state = "idle";
108
- this.abortController = null;
112
+ this.cleanupRun();
109
113
  }
110
114
  }
111
115
  async *stream(prompt, options) {
@@ -118,8 +122,7 @@ var BaseAgent = class {
118
122
  const enriched = this.enrichStream(this.executeStream(messages, options, ac.signal));
119
123
  yield* this.heartbeatStream(enriched);
120
124
  } finally {
121
- this.state = "idle";
122
- this.abortController = null;
125
+ this.cleanupRun();
123
126
  }
124
127
  }
125
128
  async *streamWithContext(messages, options) {
@@ -131,8 +134,7 @@ var BaseAgent = class {
131
134
  const enriched = this.enrichStream(this.executeStream(messages, options, ac.signal));
132
135
  yield* this.heartbeatStream(enriched);
133
136
  } finally {
134
- this.state = "idle";
135
- this.abortController = null;
137
+ this.cleanupRun();
136
138
  }
137
139
  }
138
140
  abort() {
@@ -152,6 +154,8 @@ var BaseAgent = class {
152
154
  }
153
155
  /** Mark agent as disposed. Override to add cleanup. */
154
156
  dispose() {
157
+ this._cleanupExternalSignal?.();
158
+ this._cleanupExternalSignal = null;
155
159
  this.abort();
156
160
  this.state = "disposed";
157
161
  }
@@ -262,16 +266,24 @@ var BaseAgent = class {
262
266
  }
263
267
  }
264
268
  // ─── Internal Helpers ─────────────────────────────────────────
269
+ /** Clean up after a run completes (success, error, or abort). */
270
+ cleanupRun() {
271
+ this._cleanupExternalSignal?.();
272
+ this._cleanupExternalSignal = null;
273
+ this.state = "idle";
274
+ this.abortController = null;
275
+ }
265
276
  createAbortController(externalSignal) {
266
277
  const ac = new AbortController();
267
278
  this.abortController = ac;
279
+ this._cleanupExternalSignal = null;
268
280
  if (externalSignal) {
269
281
  if (externalSignal.aborted) {
270
282
  ac.abort();
271
283
  } else {
272
- externalSignal.addEventListener("abort", () => ac.abort(), {
273
- once: true
274
- });
284
+ const listener = () => ac.abort();
285
+ externalSignal.addEventListener("abort", listener, { once: true });
286
+ this._cleanupExternalSignal = () => externalSignal.removeEventListener("abort", listener);
275
287
  }
276
288
  }
277
289
  return ac;
@@ -455,12 +467,39 @@ function messagesToSDK(messages) {
455
467
  switch (msg.role) {
456
468
  case "user":
457
469
  return { role: "user", content: getTextContent(msg.content) };
458
- case "assistant":
459
- return { role: "assistant", content: getTextContent(msg.content) };
470
+ case "assistant": {
471
+ let content = getTextContent(msg.content);
472
+ const thinking = msg.thinking;
473
+ if (thinking) {
474
+ content = `[reasoning: ${thinking}]
475
+ ${content}`;
476
+ }
477
+ const mapped = { role: "assistant", content };
478
+ if (msg.toolCalls && msg.toolCalls.length > 0) {
479
+ mapped.toolCalls = msg.toolCalls.map((tc) => ({
480
+ id: tc.id,
481
+ name: tc.name,
482
+ args: tc.args
483
+ }));
484
+ }
485
+ return mapped;
486
+ }
460
487
  case "system":
461
488
  return { role: "system", content: msg.content };
462
- case "tool":
489
+ case "tool": {
490
+ if (msg.toolResults && msg.toolResults.length > 0) {
491
+ return {
492
+ role: "tool",
493
+ toolResults: msg.toolResults.map((tr) => ({
494
+ toolCallId: tr.toolCallId,
495
+ name: tr.name,
496
+ result: tr.result,
497
+ isError: tr.isError ?? false
498
+ }))
499
+ };
500
+ }
463
501
  return { role: "tool", content: msg.content ?? "" };
502
+ }
464
503
  default:
465
504
  return { role: "user", content: "" };
466
505
  }
@@ -549,7 +588,7 @@ var VercelAIAgent = class extends BaseAgent {
549
588
  }
550
589
  async getSDKTools(signal) {
551
590
  const sdk = await loadSDK();
552
- return mapToolsToSDK(sdk, this.config.tools, this.config, this.sessionApprovals, this.config.permissionStore, signal);
591
+ return mapToolsToSDK(sdk, this.config.tools ?? [], this.config, this.sessionApprovals, this.config.permissionStore, signal);
553
592
  }
554
593
  // ─── executeRun ─────────────────────────────────────────────────
555
594
  async executeRun(messages, _options, signal) {
@@ -598,13 +637,15 @@ var VercelAIAgent = class extends BaseAgent {
598
637
  promptTokens: Number(result.totalUsage?.inputTokens ?? 0),
599
638
  completionTokens: Number(result.totalUsage?.outputTokens ?? 0)
600
639
  };
640
+ const lastStep = result.steps.length > 0 ? result.steps[result.steps.length - 1] : null;
641
+ const outputText = lastStep?.text || null;
601
642
  return {
602
- output: result.text || null,
643
+ output: outputText,
603
644
  structuredOutput: void 0,
604
645
  toolCalls,
605
646
  messages: [
606
647
  ...messages,
607
- ...result.text ? [{ role: "assistant", content: result.text }] : []
648
+ ...outputText ? [{ role: "assistant", content: outputText }] : []
608
649
  ],
609
650
  usage
610
651
  };
@@ -692,6 +733,12 @@ var VercelAIAgent = class extends BaseAgent {
692
733
  if (part.type === "text-delta") {
693
734
  finalText += part.text ?? "";
694
735
  }
736
+ if (part.type === "finish-step") {
737
+ const p = part;
738
+ if (p.finishReason === "tool-calls") {
739
+ finalText = "";
740
+ }
741
+ }
695
742
  }
696
743
  const totalUsage = await result.totalUsage;
697
744
  yield {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/types.ts","../../src/errors.ts","../../src/base-agent.ts","../../src/utils/schema.ts","../../src/backends/vercel-ai.ts"],"names":[],"mappings":"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","file":"vercel-ai.js","sourcesContent":["import type { z } from \"zod\";\nimport type { IPermissionStore } from \"./permission-store.js\";\n\n// ─── JSON Value ────────────────────────────────────────────────\n\n/** JSON-serializable value used for tool arguments and results */\nexport type JSONValue =\n | string\n | number\n | boolean\n | null\n | JSONValue[]\n | { [key: string]: JSONValue };\n\n// ─── Message Content ───────────────────────────────────────────\n\n/** Message content — plain string or array of text/image parts */\nexport type MessageContent = string | Array<ContentPart>;\n\n/** Individual content part within a multi-part message */\nexport type ContentPart =\n | { type: \"text\"; text: string }\n | { type: \"image\"; data: string; mimeType: string };\n\n// ─── Tool System (B1: Declaration/Definition split) ────────────\n\n/** What the LLM sees — name, description, schema. Passed to all backends. */\nexport interface ToolDeclaration<TParams = unknown> {\n name: string;\n description: string;\n parameters: z.ZodType<TParams>;\n needsApproval?: boolean;\n metadata?: {\n category?: string;\n icon?: string;\n tags?: string[];\n };\n}\n\n/** Full tool with execute function. Required for API-based backends.\n * CLI backends extract declaration; execute map held internally. */\nexport interface ToolDefinition<TParams = unknown>\n extends ToolDeclaration<TParams> {\n execute: (params: TParams) => Promise<JSONValue> | JSONValue;\n}\n\n// ─── Tool Calls / Results ──────────────────────────────────────\n\n/** A tool call made by the LLM during execution */\nexport interface ToolCall {\n id: string;\n name: string;\n args: JSONValue;\n}\n\n/** Result of executing a tool call */\nexport interface ToolResult {\n toolCallId: string;\n name: string;\n result: JSONValue;\n isError?: boolean;\n}\n\n// ─── Messages (Discriminated Union) ────────────────────────────\n\n/** Conversation message — discriminated union on `role` */\nexport type Message =\n | { role: \"user\"; content: MessageContent }\n | { role: \"assistant\"; content: MessageContent; toolCalls?: ToolCall[] }\n | { role: \"tool\"; content?: string; toolResults: ToolResult[] }\n | { role: \"system\"; content: string };\n\n// ─── Permission System (v3.1 with scopes) ──────────────────────\n\n/** Scope for \"remember this decision\" */\nexport type PermissionScope = \"once\" | \"session\" | \"project\" | \"always\";\n\n/** What the permission callback receives */\nexport interface PermissionRequest {\n toolName: string;\n toolArgs: Record<string, unknown>;\n /** SDK-suggested scope (from Claude CLI's suggestions) */\n suggestedScope?: PermissionScope;\n /** Original SDK permission request (for pass-through) */\n rawSDKRequest?: unknown;\n}\n\n/** What the permission callback returns */\nexport interface PermissionDecision {\n allowed: boolean;\n /** How long to remember this decision */\n scope?: PermissionScope;\n /** Modified tool arguments (tool args may be altered by user) */\n modifiedInput?: Record<string, unknown>;\n /** Denial reason (if denied) */\n reason?: string;\n}\n\n/** Permission callback signature */\nexport type PermissionCallback = (\n request: PermissionRequest,\n signal: AbortSignal,\n) => Promise<PermissionDecision>;\n\n// ─── User Input (Ask User) ────────────────────────────────────\n\n/** Request for user input — separate from permissions */\nexport interface UserInputRequest {\n question: string;\n choices?: string[];\n /** Whether to allow freeform text input (default: true) */\n allowFreeform?: boolean;\n}\n\n/** Response from user to an input request */\nexport interface UserInputResponse {\n answer: string;\n /** true if user typed a custom answer instead of selecting a choice */\n wasFreeform: boolean;\n /** Index of selected choice (if choice was selected) */\n selectedChoiceIndex?: number;\n}\n\n// ─── Supervisor Hooks ──────────────────────────────────────────\n\n/** Hooks for supervisor/UI to intercept agent actions */\nexport interface SupervisorHooks {\n onPermission?: PermissionCallback;\n onAskUser?: (\n request: UserInputRequest,\n signal: AbortSignal,\n ) => Promise<UserInputResponse>;\n}\n\n// ─── Structured Output ─────────────────────────────────────────\n\n/** Configuration for typed structured output from LLM */\nexport interface StructuredOutputConfig<T = unknown> {\n schema: z.ZodType<T>;\n name?: string;\n description?: string;\n}\n\n// ─── Usage Data ────────────────────────────────────────────────\n\n/** Usage data from LLM execution — tokens consumed plus optional metadata */\nexport interface UsageData {\n promptTokens: number;\n completionTokens: number;\n model?: string;\n backend?: string;\n}\n\n// ─── Agent Events (Streaming) ──────────────────────────────────\n\n/** Events emitted during streaming agent execution */\nexport type AgentEvent =\n | { type: \"text_delta\"; text: string }\n | { type: \"thinking_delta\"; text: string }\n | { type: \"tool_call_start\"; toolCallId: string; toolName: string; args: JSONValue }\n | { type: \"tool_call_end\"; toolCallId: string; toolName: string; result: JSONValue }\n | { type: \"permission_request\"; request: PermissionRequest }\n | {\n type: \"permission_response\";\n toolName: string;\n decision: PermissionDecision;\n }\n | { type: \"ask_user\"; request: UserInputRequest }\n | { type: \"ask_user_response\"; answer: string }\n | { type: \"thinking_start\" }\n | { type: \"thinking_end\" }\n | {\n type: \"usage_update\";\n promptTokens: number;\n completionTokens: number;\n model?: string;\n backend?: string;\n }\n | { type: \"session_info\"; sessionId: string; transcriptPath?: string; backend: string }\n | { type: \"heartbeat\" }\n | { type: \"error\"; error: string; recoverable: boolean }\n | { type: \"done\"; finalOutput: string | null; structuredOutput?: unknown };\n\n// ─── Run Options ───────────────────────────────────────────────\n\n/** Options passed to agent.run() / agent.stream() */\nexport interface RunOptions {\n /** AbortSignal for cancellation */\n signal?: AbortSignal;\n /** Arbitrary context passed to the agent run */\n context?: Record<string, unknown>;\n}\n\n// ─── Agent Configuration ───────────────────────────────────────\n\n/** LLM model parameters */\nexport interface ModelParams {\n temperature?: number;\n maxTokens?: number;\n topP?: number;\n stopSequences?: string[];\n}\n\n/** Timeout configuration for agent operations */\nexport interface TimeoutConfig {\n /** Max time for entire agent run (ms) */\n total?: number;\n /** Max time for a single tool execution (ms) */\n perTool?: number;\n /** Max time for a single LLM request (ms) */\n perLLMRequest?: number;\n}\n\n/** Error handling strategy configuration */\nexport interface ErrorHandlingConfig {\n /** What to do when a tool throws */\n onToolError?: \"fail\" | \"continue\" | \"ask-llm\";\n /** Retry config for transient LLM failures */\n retryLLM?: { maxAttempts: number; backoffMs: number };\n /** Global error callback for monitoring */\n onError?: (\n error: Error,\n context: { phase: \"tool\" | \"llm\" | \"permission\" | \"ask-user\" },\n ) => void;\n}\n\n/** Configuration for creating an agent */\nexport interface AgentConfig {\n model?: string;\n modelParams?: ModelParams;\n systemPrompt: string;\n tools: ToolDefinition[];\n supervisor?: SupervisorHooks;\n maxTurns?: number;\n timeout?: TimeoutConfig;\n errorHandling?: ErrorHandlingConfig;\n /** Pluggable store for persisting permission scope decisions across runs */\n permissionStore?: IPermissionStore;\n /** How to apply systemPrompt: \"append\" adds to backend default, \"replace\" overrides it.\n * Default: \"append\". Currently used by the Copilot backend. */\n systemMessageMode?: \"append\" | \"replace\";\n /** Filter for backend built-in tools (e.g. [\"web_search\", \"web_fetch\"] for Copilot).\n * When set, only listed built-in tools are available. Backend-specific. */\n availableTools?: string[];\n /** Callback invoked with usage data after run completion or during streaming.\n * Fire-and-forget: errors are logged but not propagated. */\n onUsage?: (usage: UsageData) => void;\n /** Interval in milliseconds for emitting heartbeat events during streaming.\n * When set, heartbeat events are emitted to keep the stream alive during\n * long tool executions. Default: off (no heartbeats). */\n heartbeatInterval?: number;\n /** Session reuse mode for CLI backends (Copilot, Claude).\n * \"per-call\" (default): creates a fresh CLI session for each run/stream call.\n * \"persistent\": reuses the same CLI session across calls, preserving conversation\n * history natively in the CLI backend. Session is destroyed on agent dispose(). */\n sessionMode?: \"per-call\" | \"persistent\";\n /** Provider-specific options passed through to the underlying SDK.\n * For Vercel AI: passed as providerOptions to generateText/streamText.\n * Example: { google: { thinkingConfig: { thinkingBudget: 1024 } } } */\n providerOptions?: Record<string, Record<string, unknown>>;\n}\n\n// ─── Agent Result (Generic) ────────────────────────────────────\n\n/** Result of an agent run, generic over structured output type T */\nexport interface AgentResult<T = void> {\n output: string | null;\n structuredOutput: T extends void ? undefined : T;\n toolCalls: Array<{\n toolName: string;\n args: JSONValue;\n result: JSONValue;\n approved: boolean;\n }>;\n messages: Message[];\n usage?: UsageData;\n}\n\n// ─── Agent State ───────────────────────────────────────────────\n\n/** Agent lifecycle state */\nexport type AgentState = \"idle\" | \"running\" | \"streaming\" | \"disposed\";\n\n// ─── Agent Interface ───────────────────────────────────────────\n\n/** Core agent interface — run prompts, stream events, manage lifecycle */\nexport interface IAgent {\n /** The CLI session ID when using persistent session mode. Undefined in per-call mode\n * or before the first call. Can be stored externally for session resume. */\n readonly sessionId: string | undefined;\n /** Run a single prompt and return the result. Wraps prompt in a user message. */\n run(prompt: MessageContent, options?: RunOptions): Promise<AgentResult>;\n /** Run with full conversation history. Messages are passed directly to the backend. */\n runWithContext(\n messages: Message[],\n options?: RunOptions,\n ): Promise<AgentResult>;\n /** Run with structured output validated against a Zod schema. */\n runStructured<T>(\n prompt: MessageContent,\n schema: StructuredOutputConfig<T>,\n options?: RunOptions,\n ): Promise<AgentResult<T>>;\n /** Stream events for a single prompt. Wraps prompt in a user message. */\n stream(\n prompt: MessageContent,\n options?: RunOptions,\n ): AsyncIterable<AgentEvent>;\n /** Stream events with full conversation history. Messages are passed directly to the backend. */\n streamWithContext(\n messages: Message[],\n options?: RunOptions,\n ): AsyncIterable<AgentEvent>;\n /** Abort the current operation. No-op if not running. */\n abort(): void;\n /** Gracefully interrupt the current operation. Resolves when the backend acknowledges. */\n interrupt(): Promise<void>;\n /** Get current agent lifecycle state. */\n getState(): AgentState;\n /** Get frozen agent configuration. */\n getConfig(): Readonly<AgentConfig>;\n /** Release resources. After dispose(), agent must not be used. */\n dispose(): void;\n}\n\n// ─── Service Interface ─────────────────────────────────────────\n\n/** Model metadata returned by listModels() */\nexport interface ModelInfo {\n id: string;\n name?: string;\n provider?: string;\n}\n\n/** Result of backend validation check */\nexport interface ValidationResult {\n valid: boolean;\n errors: string[];\n}\n\n/** Backend service interface — creates agents, lists models, validates config */\nexport interface IAgentService {\n readonly name: string;\n createAgent(config: AgentConfig): IAgent;\n listModels(): Promise<ModelInfo[]>;\n validate(): Promise<ValidationResult>;\n dispose(): Promise<void>;\n}\n\n// ─── Backend Options ───────────────────────────────────────────\n\n/** Options for Copilot CLI backend */\nexport interface CopilotBackendOptions {\n cliPath?: string;\n workingDirectory?: string;\n githubToken?: string;\n useLoggedInUser?: boolean;\n /** Extra CLI arguments passed to the Copilot subprocess (e.g. [\"--allow-all\"]) */\n cliArgs?: string[];\n /** Timeout in milliseconds for sendAndWait() calls. When undefined, uses copilot-sdk default (60s). */\n timeout?: number;\n /** Custom environment variables merged into the subprocess env */\n env?: Record<string, string | undefined>;\n}\n\n/** Options for Claude CLI backend */\nexport interface ClaudeBackendOptions {\n cliPath?: string;\n workingDirectory?: string;\n maxTurns?: number;\n /** OAuth token for Claude authentication (set as CLAUDE_CODE_OAUTH_TOKEN env var) */\n oauthToken?: string;\n /** Custom environment variables merged into the subprocess env */\n env?: Record<string, string | undefined>;\n}\n\n/** Options for Vercel AI SDK backend */\nexport interface VercelAIBackendOptions {\n apiKey: string;\n provider?: string;\n baseUrl?: string;\n}\n\n// ─── Type Guards ───────────────────────────────────────────────\n\n/** Type guard: checks if a ToolDeclaration has an execute function (i.e., is a ToolDefinition) */\nexport function isToolDefinition(\n tool: ToolDeclaration,\n): tool is ToolDefinition {\n return \"execute\" in tool && typeof (tool as ToolDefinition).execute === \"function\";\n}\n\n/** Type guard: checks if MessageContent is plain string */\nexport function isTextContent(content: MessageContent): content is string {\n return typeof content === \"string\";\n}\n\n/** Type guard: checks if MessageContent is multi-part array */\nexport function isMultiPartContent(\n content: MessageContent,\n): content is ContentPart[] {\n return Array.isArray(content);\n}\n\n/** Extract text from MessageContent regardless of format */\nexport function getTextContent(content: MessageContent): string {\n if (typeof content === \"string\") return content;\n return content\n .filter((p): p is Extract<ContentPart, { type: \"text\" }> => p.type === \"text\")\n .map((p) => p.text)\n .join(\"\\n\");\n}\n","/** Base error class for agent-sdk */\nexport class AgentSDKError extends Error {\n constructor(message: string, options?: ErrorOptions) {\n super(message, options);\n this.name = \"AgentSDKError\";\n }\n}\n\n/** Thrown when agent.run() is called while already running (M8 re-entrancy guard) */\nexport class ReentrancyError extends AgentSDKError {\n constructor() {\n super(\"Agent is already running. Await the current run before starting another.\");\n this.name = \"ReentrancyError\";\n }\n}\n\n/** Thrown when an operation is attempted on a disposed agent/service */\nexport class DisposedError extends AgentSDKError {\n constructor(entity: string) {\n super(`${entity} has been disposed and cannot be used.`);\n this.name = \"DisposedError\";\n }\n}\n\n/** Thrown when a backend is not found in the registry */\nexport class BackendNotFoundError extends AgentSDKError {\n constructor(backend: string) {\n super(\n `Unknown backend: \"${backend}\". ` +\n `Built-in: copilot, claude, vercel-ai. ` +\n `Custom: use registerBackend() first.`,\n );\n this.name = \"BackendNotFoundError\";\n }\n}\n\n/** Thrown when a backend is already registered */\nexport class BackendAlreadyRegisteredError extends AgentSDKError {\n constructor(backend: string) {\n super(`Backend \"${backend}\" is already registered. Use a different name or unregister first.`);\n this.name = \"BackendAlreadyRegisteredError\";\n }\n}\n\n/** Thrown when subprocess management fails */\nexport class SubprocessError extends AgentSDKError {\n constructor(message: string, options?: ErrorOptions) {\n super(message, options);\n this.name = \"SubprocessError\";\n }\n}\n\n/** Thrown when a required peer dependency is not installed */\nexport class DependencyError extends AgentSDKError {\n public readonly packageName: string;\n\n constructor(packageName: string) {\n super(`${packageName} is not installed. Install it: npm install ${packageName}`);\n this.name = \"DependencyError\";\n this.packageName = packageName;\n }\n}\n\n/** Thrown when an agent run is aborted */\nexport class AbortError extends AgentSDKError {\n constructor() {\n super(\"Agent run was aborted.\");\n this.name = \"AbortError\";\n }\n}\n\n/** Thrown when a tool execution fails */\nexport class ToolExecutionError extends AgentSDKError {\n public readonly toolName: string;\n\n constructor(toolName: string, message: string, options?: ErrorOptions) {\n super(`Tool \"${toolName}\" failed: ${message}`, options);\n this.name = \"ToolExecutionError\";\n this.toolName = toolName;\n }\n}\n\n/** Thrown when structured output parsing fails */\nexport class StructuredOutputError extends AgentSDKError {\n constructor(message: string, options?: ErrorOptions) {\n super(`Structured output error: ${message}`, options);\n this.name = \"StructuredOutputError\";\n }\n}\n","import type {\n IAgent,\n AgentConfig,\n AgentState,\n AgentResult,\n AgentEvent,\n MessageContent,\n Message,\n RunOptions,\n StructuredOutputConfig,\n UsageData,\n} from \"./types.js\";\nimport { ReentrancyError, DisposedError, AbortError } from \"./errors.js\";\n\n/** Abstract base agent with shared lifecycle logic.\n * Concrete backends extend this and implement the protected _run/_stream methods. */\nexport abstract class BaseAgent implements IAgent {\n protected state: AgentState = \"idle\";\n protected abortController: AbortController | null = null;\n protected readonly config: AgentConfig;\n\n /** Backend identifier (e.g. \"copilot\", \"claude\", \"vercel-ai\") */\n protected abstract readonly backendName: string;\n\n /** CLI session ID for persistent mode. Override in backends that support it. */\n get sessionId(): string | undefined {\n return undefined;\n }\n\n constructor(config: AgentConfig) {\n this.config = Object.freeze({ ...config });\n }\n\n // ─── Public Interface ─────────────────────────────────────────\n\n async run(\n prompt: MessageContent,\n options?: RunOptions,\n ): Promise<AgentResult> {\n this.guardReentrancy();\n this.guardDisposed();\n\n const ac = this.createAbortController(options?.signal);\n this.state = \"running\";\n\n try {\n const messages: Message[] = [{ role: \"user\", content: prompt }];\n const result = await this.executeRun(messages, options, ac.signal);\n this.enrichAndNotifyUsage(result);\n return result;\n } finally {\n this.state = \"idle\";\n this.abortController = null;\n }\n }\n\n async runWithContext(\n messages: Message[],\n options?: RunOptions,\n ): Promise<AgentResult> {\n this.guardReentrancy();\n this.guardDisposed();\n\n const ac = this.createAbortController(options?.signal);\n this.state = \"running\";\n\n try {\n const result = await this.executeRun(messages, options, ac.signal);\n this.enrichAndNotifyUsage(result);\n return result;\n } finally {\n this.state = \"idle\";\n this.abortController = null;\n }\n }\n\n async runStructured<T>(\n prompt: MessageContent,\n schema: StructuredOutputConfig<T>,\n options?: RunOptions,\n ): Promise<AgentResult<T>> {\n this.guardReentrancy();\n this.guardDisposed();\n\n const ac = this.createAbortController(options?.signal);\n this.state = \"running\";\n\n try {\n const messages: Message[] = [{ role: \"user\", content: prompt }];\n const result = await this.executeRunStructured(\n messages,\n schema,\n options,\n ac.signal,\n );\n this.enrichAndNotifyUsage(result);\n return result;\n } finally {\n this.state = \"idle\";\n this.abortController = null;\n }\n }\n\n async *stream(\n prompt: MessageContent,\n options?: RunOptions,\n ): AsyncIterable<AgentEvent> {\n this.guardReentrancy();\n this.guardDisposed();\n\n const ac = this.createAbortController(options?.signal);\n this.state = \"streaming\";\n\n try {\n const messages: Message[] = [{ role: \"user\", content: prompt }];\n const enriched = this.enrichStream(this.executeStream(messages, options, ac.signal));\n yield* this.heartbeatStream(enriched);\n } finally {\n this.state = \"idle\";\n this.abortController = null;\n }\n }\n\n async *streamWithContext(\n messages: Message[],\n options?: RunOptions,\n ): AsyncIterable<AgentEvent> {\n this.guardReentrancy();\n this.guardDisposed();\n\n const ac = this.createAbortController(options?.signal);\n this.state = \"streaming\";\n\n try {\n const enriched = this.enrichStream(this.executeStream(messages, options, ac.signal));\n yield* this.heartbeatStream(enriched);\n } finally {\n this.state = \"idle\";\n this.abortController = null;\n }\n }\n\n abort(): void {\n if (this.abortController) {\n this.abortController.abort();\n }\n }\n\n /** Default interrupt — falls back to abort(). Backends may override with graceful shutdown. */\n async interrupt(): Promise<void> {\n this.abort();\n }\n\n getState(): AgentState {\n return this.state;\n }\n\n getConfig(): Readonly<AgentConfig> {\n return this.config;\n }\n\n /** Mark agent as disposed. Override to add cleanup. */\n dispose(): void {\n this.abort();\n this.state = \"disposed\";\n }\n\n // ─── Abstract Methods (implemented by backends) ───────────────\n\n /** Execute a blocking run. Backend implements the actual LLM call. */\n protected abstract executeRun(\n messages: Message[],\n options: RunOptions | undefined,\n signal: AbortSignal,\n ): Promise<AgentResult>;\n\n /** Execute a structured output run. Backend implements parsing. */\n protected abstract executeRunStructured<T>(\n messages: Message[],\n schema: StructuredOutputConfig<T>,\n options: RunOptions | undefined,\n signal: AbortSignal,\n ): Promise<AgentResult<T>>;\n\n /** Execute a streaming run. Backend yields events. */\n protected abstract executeStream(\n messages: Message[],\n options: RunOptions | undefined,\n signal: AbortSignal,\n ): AsyncIterable<AgentEvent>;\n\n // ─── Usage Enrichment ───────────────────────────────────────────\n\n /** Enrich result usage with model/backend and fire onUsage callback */\n private enrichAndNotifyUsage(result: AgentResult<unknown>): void {\n if (result.usage) {\n result.usage = {\n ...result.usage,\n model: this.config.model,\n backend: this.backendName,\n };\n this.callOnUsage(result.usage);\n }\n }\n\n /** Wrap a stream to enrich usage_update events and fire onUsage callback */\n private async *enrichStream(\n source: AsyncIterable<AgentEvent>,\n ): AsyncIterable<AgentEvent> {\n for await (const event of source) {\n if (event.type === \"usage_update\") {\n const usage: UsageData = {\n promptTokens: event.promptTokens,\n completionTokens: event.completionTokens,\n model: this.config.model,\n backend: this.backendName,\n };\n this.callOnUsage(usage);\n yield { type: \"usage_update\", ...usage };\n } else {\n yield event;\n }\n }\n }\n\n /** Fire onUsage callback (fire-and-forget: errors logged, not propagated) */\n private callOnUsage(usage: UsageData): void {\n if (!this.config.onUsage) return;\n try {\n this.config.onUsage(usage);\n } catch (e) {\n console.warn(\n \"[agent-sdk] onUsage callback error:\",\n e instanceof Error ? e.message : String(e),\n );\n }\n }\n\n // ─── Heartbeat ───────────────────────────────────────────────\n\n /** Wrap a stream to emit heartbeat events at configured intervals.\n * When heartbeatInterval is not set, passes through directly. */\n private async *heartbeatStream(\n source: AsyncIterable<AgentEvent>,\n ): AsyncIterable<AgentEvent> {\n const interval = this.config.heartbeatInterval;\n if (!interval || interval <= 0) {\n yield* source;\n return;\n }\n\n const iterator = source[Symbol.asyncIterator]();\n let pendingEvent: Promise<IteratorResult<AgentEvent>> | null = null;\n let heartbeatResolve: (() => void) | null = null;\n\n const timer = setInterval(() => {\n if (heartbeatResolve) {\n const resolve = heartbeatResolve;\n heartbeatResolve = null;\n resolve();\n }\n }, interval);\n\n try {\n while (true) {\n if (!pendingEvent) {\n pendingEvent = iterator.next();\n }\n\n const heartbeatPromise = new Promise<void>((resolve) => {\n heartbeatResolve = resolve;\n });\n\n const eventDone = pendingEvent.then(\n (r) => ({ kind: \"event\" as const, result: r }),\n );\n const heartbeatDone = heartbeatPromise.then(\n () => ({ kind: \"heartbeat\" as const }),\n );\n\n const winner = await Promise.race([eventDone, heartbeatDone]);\n\n if (winner.kind === \"heartbeat\") {\n yield { type: \"heartbeat\" };\n } else {\n pendingEvent = null;\n heartbeatResolve = null;\n if (winner.result.done) break;\n yield winner.result.value;\n }\n }\n } finally {\n clearInterval(timer);\n heartbeatResolve = null;\n }\n }\n\n // ─── Guards ───────────────────────────────────────────────────\n\n protected guardReentrancy(): void {\n if (this.state === \"running\" || this.state === \"streaming\") {\n throw new ReentrancyError();\n }\n }\n\n protected guardDisposed(): void {\n if (this.state === \"disposed\") {\n throw new DisposedError(\"Agent\");\n }\n }\n\n /** Throw AbortError if signal is already aborted */\n protected checkAbort(signal: AbortSignal): void {\n if (signal.aborted) {\n throw new AbortError();\n }\n }\n\n // ─── Internal Helpers ─────────────────────────────────────────\n\n private createAbortController(externalSignal?: AbortSignal): AbortController {\n const ac = new AbortController();\n this.abortController = ac;\n\n if (externalSignal) {\n if (externalSignal.aborted) {\n ac.abort();\n } else {\n externalSignal.addEventListener(\"abort\", () => ac.abort(), {\n once: true,\n });\n }\n }\n\n return ac;\n }\n}\n","import type { z } from \"zod\";\n\n/** Convert a Zod schema to JSON Schema.\n * Detection order: toJSONSchema() (Zod v4) → jsonSchema() (Zod v3.24+) → _def extraction (Zod v3 legacy). */\nexport function zodToJsonSchema(schema: z.ZodType): Record<string, unknown> {\n const schemaAny = schema as unknown as Record<string, unknown>;\n\n // Zod v4: toJSONSchema()\n if (\"toJSONSchema\" in schema && typeof schemaAny.toJSONSchema === \"function\") {\n return (schemaAny.toJSONSchema as () => Record<string, unknown>)();\n }\n\n // Zod v3.24+: jsonSchema()\n if (\"jsonSchema\" in schema && typeof schemaAny.jsonSchema === \"function\") {\n return (schemaAny.jsonSchema as () => Record<string, unknown>)();\n }\n\n // Zod v3 legacy: _def.typeName extraction\n return extractSchemaFromDef(schema);\n}\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\nfunction extractSchemaFromDef(schema: z.ZodType): Record<string, unknown> {\n const def = (schema as unknown as { _def: Record<string, any> })._def;\n const typeName = def.typeName as string;\n\n switch (typeName) {\n case \"ZodString\":\n return { type: \"string\" };\n case \"ZodNumber\":\n return { type: \"number\" };\n case \"ZodBoolean\":\n return { type: \"boolean\" };\n case \"ZodNull\":\n return { type: \"null\" };\n case \"ZodArray\":\n return {\n type: \"array\",\n items: extractSchemaFromDef(def.type as z.ZodType),\n };\n case \"ZodObject\": {\n const shape = (schema as unknown as { shape: Record<string, z.ZodType> }).shape;\n const properties: Record<string, unknown> = {};\n const required: string[] = [];\n\n for (const [key, value] of Object.entries(shape)) {\n const valueDef = (value as unknown as { _def: Record<string, any> })._def;\n if (valueDef.typeName === \"ZodOptional\") {\n properties[key] = extractSchemaFromDef(valueDef.innerType as z.ZodType);\n } else {\n properties[key] = extractSchemaFromDef(value);\n required.push(key);\n }\n }\n\n return {\n type: \"object\",\n properties,\n ...(required.length > 0 ? { required } : {}),\n };\n }\n case \"ZodOptional\":\n return extractSchemaFromDef(def.innerType as z.ZodType);\n case \"ZodEnum\":\n return { type: \"string\", enum: def.values as string[] };\n default:\n return {};\n }\n}\n/* eslint-enable @typescript-eslint/no-explicit-any */\n","import type {\n IAgent,\n IAgentService,\n AgentConfig,\n AgentResult,\n AgentEvent,\n Message,\n RunOptions,\n StructuredOutputConfig,\n ToolDefinition,\n VercelAIBackendOptions,\n ModelInfo,\n ValidationResult,\n JSONValue,\n PermissionRequest as UnifiedPermissionRequest,\n PermissionDecision,\n} from \"../types.js\";\nimport { getTextContent } from \"../types.js\";\nimport { BaseAgent } from \"../base-agent.js\";\nimport { DisposedError, DependencyError, AbortError, ToolExecutionError } from \"../errors.js\";\nimport { zodToJsonSchema } from \"../utils/schema.js\";\nimport type { IPermissionStore } from \"../permission-store.js\";\n\nexport type { VercelAIBackendOptions } from \"../types.js\";\n\n// ─── Local Type Definitions (matching Vercel AI SDK v6 shapes) ──\n// Avoids requiring the SDK to be installed at compile time.\n\n/** @internal Vercel AI SDK tool result */\ninterface SDKToolDefinition {\n description: string;\n inputSchema: unknown;\n execute?: (input: unknown, options: unknown) => Promise<unknown>;\n needsApproval?: boolean | ((input: unknown, options: unknown) => Promise<boolean>);\n}\n\n/** @internal Vercel AI SDK v6 generateText result */\ninterface SDKGenerateTextResult {\n text: string;\n toolCalls: Array<{ toolCallId: string; toolName: string; input: unknown }>;\n toolResults: Array<{ toolCallId: string; toolName: string; output: unknown }>;\n steps: Array<{\n text: string;\n toolCalls: Array<{ toolCallId: string; toolName: string; input: unknown }>;\n toolResults: Array<{ toolCallId: string; toolName: string; output: unknown }>;\n usage: { inputTokens?: number; outputTokens?: number };\n finishReason: string;\n }>;\n totalUsage: { inputTokens?: number; outputTokens?: number };\n finishReason: string;\n response: { messages: unknown[] };\n}\n\n/** @internal Vercel AI SDK generateObject result */\ninterface SDKGenerateObjectResult {\n object: unknown;\n usage: { inputTokens?: number; outputTokens?: number };\n}\n\n/** @internal Vercel AI SDK streamText result */\ninterface SDKStreamTextResult {\n fullStream: AsyncIterable<SDKStreamPart>;\n totalUsage: PromiseLike<{ inputTokens?: number; outputTokens?: number }>;\n text: PromiseLike<string>;\n}\n\n/** @internal Vercel AI SDK v6 stream part union */\ntype SDKStreamPart =\n | { type: \"text-delta\"; text: string }\n | { type: \"tool-call\"; toolCallId: string; toolName: string; input: unknown }\n | { type: \"tool-result\"; toolCallId: string; toolName: string; output: unknown }\n | { type: \"tool-error\"; toolCallId: string; toolName: string; error: unknown }\n | { type: \"reasoning-start\" }\n | { type: \"reasoning-end\" }\n | { type: \"reasoning-delta\"; text: string }\n | { type: \"finish-step\"; usage: { inputTokens?: number; outputTokens?: number }; finishReason: string }\n | { type: \"finish\"; finishReason: string; totalUsage: { inputTokens?: number; outputTokens?: number } }\n | { type: \"error\"; error: unknown }\n | { type: string };\n\n/** @internal Vercel AI SDK LanguageModel — opaque type from SDK */\ntype SDKLanguageModel = Record<string, unknown>;\n\n/** @internal SDK module shape */\ninterface SDKModule {\n generateText: (options: Record<string, unknown>) => Promise<SDKGenerateTextResult>;\n streamText: (options: Record<string, unknown>) => SDKStreamTextResult;\n generateObject: (options: Record<string, unknown>) => Promise<SDKGenerateObjectResult>;\n tool: (options: Record<string, unknown>) => SDKToolDefinition;\n jsonSchema: (schema: unknown) => unknown;\n stepCountIs: (count: number) => unknown;\n}\n\n/** @internal OpenAI-compatible module shape */\ninterface SDKCompatModule {\n createOpenAICompatible: (options: Record<string, unknown>) => {\n chatModel: (modelId: string) => SDKLanguageModel;\n languageModel: (modelId: string) => SDKLanguageModel;\n };\n}\n\n// ─── Dynamic SDK Loader ─────────────────────────────────────────\n\nlet sdkModule: SDKModule | null = null;\nlet compatModule: SDKCompatModule | null = null;\n\nasync function loadSDK(): Promise<SDKModule> {\n if (sdkModule) return sdkModule;\n try {\n // @ts-ignore — peer dependency, not present at compile time\n sdkModule = (await import(\"ai\")) as SDKModule;\n return sdkModule!;\n } catch {\n throw new DependencyError(\"ai\");\n }\n}\n\nasync function loadCompat(): Promise<SDKCompatModule> {\n if (compatModule) return compatModule;\n try {\n // @ts-ignore — peer dependency, not present at compile time\n compatModule = (await import(\"@ai-sdk/openai-compatible\")) as SDKCompatModule;\n return compatModule!;\n } catch {\n throw new DependencyError(\"@ai-sdk/openai-compatible\");\n }\n}\n\n/** @internal For testing: inject mock SDK module */\nexport function _injectSDK(mock: SDKModule | null): void {\n sdkModule = mock;\n}\n\n/** @internal For testing: inject mock compat module */\nexport function _injectCompat(mock: SDKCompatModule | null): void {\n compatModule = mock;\n}\n\n/** @internal For testing: reset injected SDK */\nexport function _resetSDK(): void {\n sdkModule = null;\n compatModule = null;\n}\n\n// ─── Constants ──────────────────────────────────────────────────\n\nconst DEFAULT_BASE_URL = \"https://openrouter.ai/api/v1\";\nconst DEFAULT_PROVIDER = \"openrouter\";\nconst DEFAULT_MAX_TURNS = 10;\n\n// ─── Tool Mapping ───────────────────────────────────────────────\n\nfunction mapToolsToSDK(\n sdk: SDKModule,\n tools: ToolDefinition[],\n config: AgentConfig,\n sessionApprovals: Set<string>,\n permissionStore: IPermissionStore | undefined,\n signal: AbortSignal,\n): Record<string, SDKToolDefinition> {\n const toolMap: Record<string, SDKToolDefinition> = {};\n const supervisor = config.supervisor;\n\n for (const ourTool of tools) {\n const jsonSchema = zodToJsonSchema(ourTool.parameters);\n\n toolMap[ourTool.name] = sdk.tool({\n description: ourTool.description,\n inputSchema: sdk.jsonSchema(jsonSchema),\n execute: wrapToolExecute(ourTool, supervisor, sessionApprovals, permissionStore, signal),\n ...(ourTool.needsApproval && supervisor?.onPermission\n ? {\n needsApproval: async (_input: Record<string, unknown>) => {\n // If already approved via store, skip\n if (permissionStore && await permissionStore.isApproved(ourTool.name)) return false;\n // If already session-approved, skip\n if (sessionApprovals.has(ourTool.name)) return false;\n return true; // will be handled in execute wrapper\n },\n }\n : {}),\n });\n }\n\n // M1: Inject built-in ask_user tool when supervisor.onAskUser is provided\n if (supervisor?.onAskUser) {\n const onAskUser = supervisor.onAskUser;\n toolMap[\"ask_user\"] = sdk.tool({\n description: \"Ask the user a question and wait for their response\",\n inputSchema: sdk.jsonSchema({\n type: \"object\",\n properties: {\n question: { type: \"string\", description: \"The question to ask the user\" },\n },\n required: [\"question\"],\n }),\n execute: async (args: { question: string }) => {\n const response = await onAskUser(\n { question: args.question, allowFreeform: true },\n signal,\n );\n return response.answer;\n },\n });\n }\n\n return toolMap;\n}\n\nfunction wrapToolExecute(\n ourTool: ToolDefinition,\n supervisor: AgentConfig[\"supervisor\"],\n sessionApprovals: Set<string>,\n permissionStore: IPermissionStore | undefined,\n signal: AbortSignal,\n): (args: unknown) => Promise<JSONValue> {\n return async (args: unknown): Promise<JSONValue> => {\n // Permission check for tools with needsApproval\n if (ourTool.needsApproval && supervisor?.onPermission) {\n // Check store first, then fall back to sessionApprovals set\n const storeApproved = permissionStore && await permissionStore.isApproved(ourTool.name);\n if (!storeApproved && !sessionApprovals.has(ourTool.name)) {\n const request: UnifiedPermissionRequest = {\n toolName: ourTool.name,\n toolArgs: (args ?? {}) as Record<string, unknown>,\n };\n\n const decision: PermissionDecision = await supervisor.onPermission(\n request,\n signal,\n );\n\n if (!decision.allowed) {\n throw new ToolExecutionError(\n ourTool.name,\n decision.reason ?? \"Permission denied\",\n );\n }\n\n // Persist approval to store if available\n if (permissionStore && decision.scope) {\n await permissionStore.approve(ourTool.name, decision.scope);\n }\n\n // Also keep sessionApprovals for backward compat\n if (decision.scope === \"session\" || decision.scope === \"always\" || decision.scope === \"project\") {\n sessionApprovals.add(ourTool.name);\n }\n\n // Use modified input if provided\n if (decision.modifiedInput) {\n args = decision.modifiedInput;\n }\n }\n }\n\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const result = await ourTool.execute(args as any);\n return result as JSONValue;\n } catch (e) {\n if (e instanceof ToolExecutionError) throw e;\n throw new ToolExecutionError(\n ourTool.name,\n e instanceof Error ? e.message : String(e),\n );\n }\n };\n}\n\n// ─── Message Conversion ─────────────────────────────────────────\n\nfunction messagesToSDK(messages: Message[]): Array<Record<string, unknown>> {\n return messages.map((msg) => {\n switch (msg.role) {\n case \"user\":\n return { role: \"user\", content: getTextContent(msg.content) };\n case \"assistant\":\n return { role: \"assistant\", content: getTextContent(msg.content) };\n case \"system\":\n return { role: \"system\", content: msg.content };\n case \"tool\":\n return { role: \"tool\", content: msg.content ?? \"\" };\n default:\n return { role: \"user\", content: \"\" };\n }\n });\n}\n\n// ─── Event Mapping (fullStream → AgentEvent) ────────────────────\n\nfunction mapStreamPart(part: SDKStreamPart): AgentEvent | null {\n switch (part.type) {\n case \"text-delta\": {\n const p = part as Extract<SDKStreamPart, { type: \"text-delta\" }>;\n return { type: \"text_delta\", text: p.text ?? \"\" };\n }\n\n case \"tool-call\": {\n const p = part as Extract<SDKStreamPart, { type: \"tool-call\" }>;\n return {\n type: \"tool_call_start\",\n toolCallId: String(p.toolCallId ?? \"\"),\n toolName: p.toolName ?? \"unknown\",\n args: (p.input ?? {}) as JSONValue,\n };\n }\n\n case \"tool-result\": {\n const p = part as Extract<SDKStreamPart, { type: \"tool-result\" }>;\n return {\n type: \"tool_call_end\",\n toolCallId: String(p.toolCallId ?? \"\"),\n toolName: p.toolName ?? \"unknown\",\n result: (p.output ?? null) as JSONValue,\n };\n }\n\n case \"tool-error\": {\n const p = part as Extract<SDKStreamPart, { type: \"tool-error\" }>;\n return {\n type: \"error\",\n error: p.error instanceof Error\n ? p.error.message\n : String(p.error ?? \"Tool execution failed\"),\n recoverable: true,\n };\n }\n\n case \"reasoning-start\":\n return { type: \"thinking_start\" };\n\n case \"reasoning-end\":\n return { type: \"thinking_end\" };\n\n case \"reasoning-delta\": {\n const p = part as Extract<SDKStreamPart, { type: \"reasoning-delta\" }>;\n return { type: \"thinking_delta\", text: p.text ?? \"\" };\n }\n\n case \"finish-step\": {\n const p = part as Extract<SDKStreamPart, { type: \"finish-step\" }>;\n return {\n type: \"usage_update\",\n promptTokens: Number(p.usage?.inputTokens ?? 0),\n completionTokens: Number(p.usage?.outputTokens ?? 0),\n };\n }\n\n case \"error\": {\n const p = part as Extract<SDKStreamPart, { type: \"error\" }>;\n return {\n type: \"error\",\n error: p.error instanceof Error\n ? p.error.message\n : String(p.error ?? \"Unknown error\"),\n recoverable: false,\n };\n }\n\n default:\n return null;\n }\n}\n\n// ─── VercelAIAgent ──────────────────────────────────────────────\n\nclass VercelAIAgent extends BaseAgent {\n protected readonly backendName = \"vercel-ai\";\n private readonly backendOptions: VercelAIBackendOptions;\n private readonly sessionApprovals = new Set<string>();\n private model: SDKLanguageModel | null = null;\n\n constructor(\n config: AgentConfig,\n backendOptions: VercelAIBackendOptions,\n ) {\n super(config);\n this.backendOptions = backendOptions;\n }\n\n private async getModel(): Promise<SDKLanguageModel> {\n if (this.model) return this.model;\n\n const compat = await loadCompat();\n const provider = compat.createOpenAICompatible({\n name: this.backendOptions.provider ?? DEFAULT_PROVIDER,\n baseURL: this.backendOptions.baseUrl ?? DEFAULT_BASE_URL,\n apiKey: this.backendOptions.apiKey,\n });\n\n const modelId = this.config.model ?? \"anthropic/claude-sonnet-4-5\";\n this.model = provider.chatModel(modelId);\n return this.model;\n }\n\n private async getSDKTools(signal: AbortSignal): Promise<Record<string, SDKToolDefinition>> {\n const sdk = await loadSDK();\n return mapToolsToSDK(sdk, this.config.tools, this.config, this.sessionApprovals, this.config.permissionStore, signal);\n }\n\n // ─── executeRun ─────────────────────────────────────────────────\n\n protected async executeRun(\n messages: Message[],\n _options: RunOptions | undefined,\n signal: AbortSignal,\n ): Promise<AgentResult> {\n this.checkAbort(signal);\n\n const sdk = await loadSDK();\n const model = await this.getModel();\n const tools = await this.getSDKTools(signal);\n const maxTurns = this.config.maxTurns ?? DEFAULT_MAX_TURNS;\n\n const sdkMessages = messagesToSDK(messages);\n const hasTools = Object.keys(tools).length > 0;\n\n const result: SDKGenerateTextResult = await sdk.generateText({\n model,\n system: this.config.systemPrompt,\n messages: sdkMessages,\n tools: hasTools ? tools : undefined,\n stopWhen: sdk.stepCountIs(maxTurns),\n abortSignal: signal,\n ...(this.config.modelParams?.temperature !== undefined && {\n temperature: this.config.modelParams.temperature,\n }),\n ...(this.config.modelParams?.maxTokens !== undefined && {\n maxTokens: this.config.modelParams.maxTokens,\n }),\n ...(this.config.modelParams?.topP !== undefined && {\n topP: this.config.modelParams.topP,\n }),\n ...(this.config.providerOptions && {\n providerOptions: this.config.providerOptions,\n }),\n });\n\n // Collect all tool calls across all steps\n const toolCalls: AgentResult[\"toolCalls\"] = [];\n for (const step of result.steps) {\n for (const tc of step.toolCalls) {\n const matchingResult = step.toolResults.find(\n (tr) => tr.toolCallId === tc.toolCallId,\n );\n toolCalls.push({\n toolName: tc.toolName,\n args: (tc.input ?? {}) as JSONValue,\n result: (matchingResult?.output ?? null) as JSONValue,\n approved: true,\n });\n }\n }\n\n const usage = {\n promptTokens: Number(result.totalUsage?.inputTokens ?? 0),\n completionTokens: Number(result.totalUsage?.outputTokens ?? 0),\n };\n\n return {\n output: result.text || null,\n structuredOutput: undefined as AgentResult[\"structuredOutput\"],\n toolCalls,\n messages: [\n ...messages,\n ...(result.text\n ? [{ role: \"assistant\" as const, content: result.text }]\n : []),\n ],\n usage,\n };\n }\n\n // ─── executeRunStructured ───────────────────────────────────────\n\n protected async executeRunStructured<T>(\n messages: Message[],\n schema: StructuredOutputConfig<T>,\n _options: RunOptions | undefined,\n signal: AbortSignal,\n ): Promise<AgentResult<T>> {\n this.checkAbort(signal);\n\n const sdk = await loadSDK();\n const model = await this.getModel();\n\n const sdkMessages = messagesToSDK(messages);\n const jsonSchema = zodToJsonSchema(schema.schema);\n\n const result: SDKGenerateObjectResult = await sdk.generateObject({\n model,\n system: this.config.systemPrompt,\n messages: sdkMessages,\n schema: sdk.jsonSchema(jsonSchema),\n schemaName: schema.name,\n schemaDescription: schema.description,\n abortSignal: signal,\n ...(this.config.modelParams?.temperature !== undefined && {\n temperature: this.config.modelParams.temperature,\n }),\n ...(this.config.modelParams?.maxTokens !== undefined && {\n maxTokens: this.config.modelParams.maxTokens,\n }),\n ...(this.config.providerOptions && {\n providerOptions: this.config.providerOptions,\n }),\n });\n\n // Validate and parse through our zod schema\n let structuredOutput: T | undefined;\n try {\n structuredOutput = schema.schema.parse(result.object);\n } catch {\n // If zod validation fails, leave undefined\n }\n\n const usage = {\n promptTokens: Number(result.usage?.inputTokens ?? 0),\n completionTokens: Number(result.usage?.outputTokens ?? 0),\n };\n\n return {\n output: JSON.stringify(result.object),\n structuredOutput: structuredOutput as AgentResult<T>[\"structuredOutput\"],\n toolCalls: [],\n messages: [\n ...messages,\n ...(result.object != null\n ? [{ role: \"assistant\" as const, content: JSON.stringify(result.object) }]\n : []),\n ],\n usage,\n };\n }\n\n // ─── executeStream ──────────────────────────────────────────────\n\n protected async *executeStream(\n messages: Message[],\n _options: RunOptions | undefined,\n signal: AbortSignal,\n ): AsyncIterable<AgentEvent> {\n this.checkAbort(signal);\n\n const sdk = await loadSDK();\n const model = await this.getModel();\n const tools = await this.getSDKTools(signal);\n const maxTurns = this.config.maxTurns ?? DEFAULT_MAX_TURNS;\n\n const sdkMessages = messagesToSDK(messages);\n const hasTools = Object.keys(tools).length > 0;\n\n const result: SDKStreamTextResult = sdk.streamText({\n model,\n system: this.config.systemPrompt,\n messages: sdkMessages,\n tools: hasTools ? tools : undefined,\n stopWhen: sdk.stepCountIs(maxTurns),\n abortSignal: signal,\n ...(this.config.modelParams?.temperature !== undefined && {\n temperature: this.config.modelParams.temperature,\n }),\n ...(this.config.modelParams?.maxTokens !== undefined && {\n maxTokens: this.config.modelParams.maxTokens,\n }),\n ...(this.config.modelParams?.topP !== undefined && {\n topP: this.config.modelParams.topP,\n }),\n ...(this.config.providerOptions && {\n providerOptions: this.config.providerOptions,\n }),\n });\n\n let finalText = \"\";\n\n try {\n for await (const part of result.fullStream) {\n if (signal.aborted) throw new AbortError();\n\n const event = mapStreamPart(part as SDKStreamPart);\n if (event) yield event;\n\n if ((part as SDKStreamPart).type === \"text-delta\") {\n finalText += (part as Extract<SDKStreamPart, { type: \"text-delta\" }>).text ?? \"\";\n }\n }\n\n // Emit final usage from totalUsage\n const totalUsage = await result.totalUsage;\n yield {\n type: \"usage_update\",\n promptTokens: Number(totalUsage?.inputTokens ?? 0),\n completionTokens: Number(totalUsage?.outputTokens ?? 0),\n };\n\n yield {\n type: \"done\",\n finalOutput: finalText || null,\n };\n } catch (e) {\n if (signal.aborted) throw new AbortError();\n throw e;\n }\n }\n\n override dispose(): void {\n this.sessionApprovals.clear();\n this.model = null;\n super.dispose();\n }\n}\n\n// ─── VercelAIAgentService ───────────────────────────────────────\n\nclass VercelAIAgentService implements IAgentService {\n readonly name = \"vercel-ai\";\n private disposed = false;\n private readonly options: VercelAIBackendOptions;\n\n constructor(options: VercelAIBackendOptions) {\n this.options = options;\n }\n\n createAgent(config: AgentConfig): IAgent {\n if (this.disposed) throw new DisposedError(\"VercelAIAgentService\");\n return new VercelAIAgent(config, this.options);\n }\n\n async listModels(): Promise<ModelInfo[]> {\n if (this.disposed) throw new DisposedError(\"VercelAIAgentService\");\n\n const baseUrl = (this.options.baseUrl || \"https://api.openai.com/v1\").replace(/\\/+$/, \"\");\n\n try {\n const res = await globalThis.fetch(`${baseUrl}/models`, {\n headers: { Authorization: `Bearer ${this.options.apiKey}` },\n });\n\n if (!res.ok) {\n return [];\n }\n\n const body = (await res.json()) as { data?: Array<{ id: string }> };\n if (!body.data || body.data.length === 0) {\n return [];\n }\n\n return body.data.map((m) => ({ id: m.id }));\n } catch {\n return [];\n }\n }\n\n async validate(): Promise<ValidationResult> {\n if (this.disposed) throw new DisposedError(\"VercelAIAgentService\");\n\n const errors: string[] = [];\n\n if (!this.options.apiKey) {\n errors.push(\"apiKey is required for Vercel AI backend.\");\n }\n\n try {\n await loadSDK();\n } catch (e) {\n errors.push(e instanceof Error ? e.message : String(e));\n }\n\n try {\n await loadCompat();\n } catch (e) {\n errors.push(e instanceof Error ? e.message : String(e));\n }\n\n return { valid: errors.length === 0, errors };\n }\n\n async dispose(): Promise<void> {\n if (this.disposed) return;\n this.disposed = true;\n }\n}\n\n// ─── Factory ────────────────────────────────────────────────────\n\n/** Create Vercel AI SDK backend service. */\nexport function createVercelAIService(\n options: VercelAIBackendOptions,\n): IAgentService {\n return new VercelAIAgentService(options);\n}\n"]}
1
+ {"version":3,"sources":["../../src/types.ts","../../src/errors.ts","../../src/base-agent.ts","../../src/utils/schema.ts","../../src/backends/vercel-ai.ts"],"names":[],"mappings":"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","file":"vercel-ai.js","sourcesContent":["import type { z } from \"zod\";\nimport type { IPermissionStore } from \"./permission-store.js\";\n\n// ─── JSON Value ────────────────────────────────────────────────\n\n/** JSON-serializable value used for tool arguments and results */\nexport type JSONValue =\n | string\n | number\n | boolean\n | null\n | JSONValue[]\n | { [key: string]: JSONValue };\n\n// ─── Message Content ───────────────────────────────────────────\n\n/** Message content — plain string or array of text/image parts */\nexport type MessageContent = string | Array<ContentPart>;\n\n/** Individual content part within a multi-part message */\nexport type ContentPart =\n | { type: \"text\"; text: string }\n | { type: \"image\"; data: string; mimeType: string };\n\n// ─── Tool System (B1: Declaration/Definition split) ────────────\n\n/** What the LLM sees — name, description, schema. Passed to all backends. */\nexport interface ToolDeclaration<TParams = unknown> {\n name: string;\n description: string;\n parameters: z.ZodType<TParams>;\n needsApproval?: boolean;\n metadata?: {\n category?: string;\n icon?: string;\n tags?: string[];\n };\n}\n\n/** Full tool with execute function. Required for API-based backends.\n * CLI backends extract declaration; execute map held internally.\n * The optional second parameter receives request-scoped context\n * when invoked through ChatRuntime (session ID, user data, custom metadata). */\nexport interface ToolDefinition<TParams = unknown>\n extends ToolDeclaration<TParams> {\n execute: (params: TParams, context?: ToolContext) => Promise<JSONValue> | JSONValue;\n}\n\n/** Request-scoped context passed to tool execute functions via ChatRuntime.\n * Contains session identity and user-defined metadata from the current session. */\nexport interface ToolContext {\n /** Active chat session ID */\n sessionId: string;\n /** Custom metadata from the session (e.g. user ID, tenant, permissions) */\n custom?: Record<string, unknown>;\n}\n\n// ─── Tool Calls / Results ──────────────────────────────────────\n\n/** A tool call made by the LLM during execution */\nexport interface ToolCall {\n id: string;\n name: string;\n args: JSONValue;\n}\n\n/** Result of executing a tool call */\nexport interface ToolResult {\n toolCallId: string;\n name: string;\n result: JSONValue;\n isError?: boolean;\n}\n\n// ─── Messages (Discriminated Union) ────────────────────────────\n\n/** Conversation message — discriminated union on `role` */\nexport type Message =\n | { role: \"user\"; content: MessageContent }\n | { role: \"assistant\"; content: MessageContent; toolCalls?: ToolCall[] }\n | { role: \"tool\"; content?: string; toolResults: ToolResult[] }\n | { role: \"system\"; content: string };\n\n// ─── Permission System (v3.1 with scopes) ──────────────────────\n\n/** Scope for \"remember this decision\" */\nexport type PermissionScope = \"once\" | \"session\" | \"project\" | \"always\";\n\n/** What the permission callback receives */\nexport interface PermissionRequest {\n toolName: string;\n toolArgs: Record<string, unknown>;\n /** SDK-suggested scope (from Claude CLI's suggestions) */\n suggestedScope?: PermissionScope;\n /** Original SDK permission request (for pass-through) */\n rawSDKRequest?: unknown;\n}\n\n/** What the permission callback returns */\nexport interface PermissionDecision {\n allowed: boolean;\n /** How long to remember this decision */\n scope?: PermissionScope;\n /** Modified tool arguments (tool args may be altered by user) */\n modifiedInput?: Record<string, unknown>;\n /** Denial reason (if denied) */\n reason?: string;\n}\n\n/** Permission callback signature */\nexport type PermissionCallback = (\n request: PermissionRequest,\n signal: AbortSignal,\n) => Promise<PermissionDecision>;\n\n// ─── User Input (Ask User) ────────────────────────────────────\n\n/** Request for user input — separate from permissions */\nexport interface UserInputRequest {\n question: string;\n choices?: string[];\n /** Whether to allow freeform text input (default: true) */\n allowFreeform?: boolean;\n}\n\n/** Response from user to an input request */\nexport interface UserInputResponse {\n answer: string;\n /** true if user typed a custom answer instead of selecting a choice */\n wasFreeform: boolean;\n /** Index of selected choice (if choice was selected) */\n selectedChoiceIndex?: number;\n}\n\n// ─── Supervisor Hooks ──────────────────────────────────────────\n\n/** Hooks for supervisor/UI to intercept agent actions */\nexport interface SupervisorHooks {\n onPermission?: PermissionCallback;\n onAskUser?: (\n request: UserInputRequest,\n signal: AbortSignal,\n ) => Promise<UserInputResponse>;\n}\n\n// ─── Structured Output ─────────────────────────────────────────\n\n/** Configuration for typed structured output from LLM */\nexport interface StructuredOutputConfig<T = unknown> {\n schema: z.ZodType<T>;\n name?: string;\n description?: string;\n}\n\n// ─── Usage Data ────────────────────────────────────────────────\n\n/** Usage data from LLM execution — tokens consumed plus optional metadata */\nexport interface UsageData {\n promptTokens: number;\n completionTokens: number;\n model?: string;\n backend?: string;\n}\n\n// ─── Agent Events (Streaming) ──────────────────────────────────\n\n/** Events emitted during streaming agent execution */\nexport type AgentEvent =\n | { type: \"text_delta\"; text: string }\n | { type: \"thinking_delta\"; text: string }\n | { type: \"tool_call_start\"; toolCallId: string; toolName: string; args: JSONValue }\n | { type: \"tool_call_end\"; toolCallId: string; toolName: string; result: JSONValue }\n | { type: \"permission_request\"; request: PermissionRequest }\n | {\n type: \"permission_response\";\n toolName: string;\n decision: PermissionDecision;\n }\n | { type: \"ask_user\"; request: UserInputRequest }\n | { type: \"ask_user_response\"; answer: string }\n | { type: \"thinking_start\" }\n | { type: \"thinking_end\" }\n | {\n type: \"usage_update\";\n promptTokens: number;\n completionTokens: number;\n model?: string;\n backend?: string;\n }\n | { type: \"session_info\"; sessionId: string; transcriptPath?: string; backend: string }\n | { type: \"heartbeat\" }\n | { type: \"error\"; error: string; recoverable: boolean }\n | { type: \"done\"; finalOutput: string | null; structuredOutput?: unknown };\n\n// ─── Run Options ───────────────────────────────────────────────\n\n/** Options passed to agent.run() / agent.stream() */\nexport interface RunOptions {\n /** AbortSignal for cancellation */\n signal?: AbortSignal;\n /** Arbitrary context passed to the agent run */\n context?: Record<string, unknown>;\n}\n\n// ─── Agent Configuration ───────────────────────────────────────\n\n/** LLM model parameters */\nexport interface ModelParams {\n temperature?: number;\n maxTokens?: number;\n topP?: number;\n stopSequences?: string[];\n}\n\n/** Timeout configuration for agent operations */\nexport interface TimeoutConfig {\n /** Max time for entire agent run (ms) */\n total?: number;\n /** Max time for a single tool execution (ms) */\n perTool?: number;\n /** Max time for a single LLM request (ms) */\n perLLMRequest?: number;\n}\n\n/** Error handling strategy configuration */\nexport interface ErrorHandlingConfig {\n /** What to do when a tool throws */\n onToolError?: \"fail\" | \"continue\" | \"ask-llm\";\n /** Retry config for transient LLM failures */\n retryLLM?: { maxAttempts: number; backoffMs: number };\n /** Global error callback for monitoring */\n onError?: (\n error: Error,\n context: { phase: \"tool\" | \"llm\" | \"permission\" | \"ask-user\" },\n ) => void;\n}\n\n/** Configuration for creating an agent */\nexport interface AgentConfig {\n model?: string;\n modelParams?: ModelParams;\n systemPrompt: string;\n tools: ToolDefinition[];\n supervisor?: SupervisorHooks;\n maxTurns?: number;\n timeout?: TimeoutConfig;\n errorHandling?: ErrorHandlingConfig;\n /** Pluggable store for persisting permission scope decisions across runs */\n permissionStore?: IPermissionStore;\n /** How to apply systemPrompt: \"append\" adds to backend default, \"replace\" overrides it.\n * Default: \"append\". Currently used by the Copilot backend. */\n systemMessageMode?: \"append\" | \"replace\";\n /** Filter for backend built-in tools (e.g. [\"web_search\", \"web_fetch\"] for Copilot).\n * When set, only listed built-in tools are available. Backend-specific. */\n availableTools?: string[];\n /** Callback invoked with usage data after run completion or during streaming.\n * Fire-and-forget: errors are logged but not propagated. */\n onUsage?: (usage: UsageData) => void;\n /** Interval in milliseconds for emitting heartbeat events during streaming.\n * When set, heartbeat events are emitted to keep the stream alive during\n * long tool executions. Default: off (no heartbeats). */\n heartbeatInterval?: number;\n /** Session reuse mode for CLI backends (Copilot, Claude).\n * \"per-call\" (default): creates a fresh CLI session for each run/stream call.\n * \"persistent\": reuses the same CLI session across calls, preserving conversation\n * history natively in the CLI backend. Session is destroyed on agent dispose(). */\n sessionMode?: \"per-call\" | \"persistent\";\n /** Provider-specific options passed through to the underlying SDK.\n * For Vercel AI: passed as providerOptions to generateText/streamText.\n * Example: { google: { thinkingConfig: { thinkingBudget: 1024 } } } */\n providerOptions?: Record<string, Record<string, unknown>>;\n}\n\n// ─── Agent Result (Generic) ────────────────────────────────────\n\n/** Result of an agent run, generic over structured output type T */\nexport interface AgentResult<T = void> {\n output: string | null;\n structuredOutput: T extends void ? undefined : T;\n toolCalls: Array<{\n toolName: string;\n args: JSONValue;\n result: JSONValue;\n approved: boolean;\n }>;\n messages: Message[];\n usage?: UsageData;\n}\n\n// ─── Agent State ───────────────────────────────────────────────\n\n/** Agent lifecycle state */\nexport type AgentState = \"idle\" | \"running\" | \"streaming\" | \"disposed\";\n\n// ─── Agent Interface ───────────────────────────────────────────\n\n/** Core agent interface — run prompts, stream events, manage lifecycle */\nexport interface IAgent {\n /** The CLI session ID when using persistent session mode. Undefined in per-call mode\n * or before the first call. Can be stored externally for session resume. */\n readonly sessionId: string | undefined;\n /** Run a single prompt and return the result. Wraps prompt in a user message. */\n run(prompt: MessageContent, options?: RunOptions): Promise<AgentResult>;\n /** Run with full conversation history. Messages are passed directly to the backend. */\n runWithContext(\n messages: Message[],\n options?: RunOptions,\n ): Promise<AgentResult>;\n /** Run with structured output validated against a Zod schema. */\n runStructured<T>(\n prompt: MessageContent,\n schema: StructuredOutputConfig<T>,\n options?: RunOptions,\n ): Promise<AgentResult<T>>;\n /** Stream events for a single prompt. Wraps prompt in a user message. */\n stream(\n prompt: MessageContent,\n options?: RunOptions,\n ): AsyncIterable<AgentEvent>;\n /** Stream events with full conversation history. Messages are passed directly to the backend. */\n streamWithContext(\n messages: Message[],\n options?: RunOptions,\n ): AsyncIterable<AgentEvent>;\n /** Abort the current operation. No-op if not running. */\n abort(): void;\n /** Gracefully interrupt the current operation. Resolves when the backend acknowledges. */\n interrupt(): Promise<void>;\n /** Get current agent lifecycle state. */\n getState(): AgentState;\n /** Get frozen agent configuration. */\n getConfig(): Readonly<AgentConfig>;\n /** Release resources. After dispose(), agent must not be used. */\n dispose(): void;\n}\n\n// ─── Service Interface ─────────────────────────────────────────\n\n/** Model metadata returned by listModels() */\nexport interface ModelInfo {\n id: string;\n name?: string;\n provider?: string;\n}\n\n/** Result of backend validation check */\nexport interface ValidationResult {\n valid: boolean;\n errors: string[];\n}\n\n/** Backend service interface — creates agents, lists models, validates config */\nexport interface IAgentService {\n readonly name: string;\n createAgent(config: AgentConfig): IAgent;\n listModels(): Promise<ModelInfo[]>;\n validate(): Promise<ValidationResult>;\n dispose(): Promise<void>;\n}\n\n// ─── Backend Options ───────────────────────────────────────────\n\n/** Options for Copilot CLI backend */\nexport interface CopilotBackendOptions {\n cliPath?: string;\n workingDirectory?: string;\n githubToken?: string;\n useLoggedInUser?: boolean;\n /** Extra CLI arguments passed to the Copilot subprocess (e.g. [\"--allow-all\"]) */\n cliArgs?: string[];\n /** Timeout in milliseconds for sendAndWait() calls. When undefined, uses copilot-sdk default (60s). */\n timeout?: number;\n /** Timeout in milliseconds for CLI startup and auth check (default: 30000). */\n startupTimeoutMs?: number;\n /** Custom environment variables merged into the subprocess env */\n env?: Record<string, string | undefined>;\n /** Session ID to resume after server restart. On startup, the backend attempts\n * to resume this session before creating a new one. */\n resumeSessionId?: string;\n}\n\n/** Options for Claude CLI backend */\nexport interface ClaudeBackendOptions {\n cliPath?: string;\n workingDirectory?: string;\n maxTurns?: number;\n /** OAuth token for Claude authentication (set as CLAUDE_CODE_OAUTH_TOKEN env var) */\n oauthToken?: string;\n /** Custom environment variables merged into the subprocess env */\n env?: Record<string, string | undefined>;\n /** Session ID to resume after server restart. On startup, the backend attempts\n * to resume this session before creating a new one. */\n resumeSessionId?: string;\n}\n\n/** Options for Vercel AI SDK backend */\nexport interface VercelAIBackendOptions {\n apiKey: string;\n provider?: string;\n baseUrl?: string;\n}\n\n// ─── Type Guards ───────────────────────────────────────────────\n\n/** Type guard: checks if a ToolDeclaration has an execute function (i.e., is a ToolDefinition) */\nexport function isToolDefinition(\n tool: ToolDeclaration,\n): tool is ToolDefinition {\n return \"execute\" in tool && typeof (tool as ToolDefinition).execute === \"function\";\n}\n\n/** Type guard: checks if MessageContent is plain string */\nexport function isTextContent(content: MessageContent): content is string {\n return typeof content === \"string\";\n}\n\n/** Type guard: checks if MessageContent is multi-part array */\nexport function isMultiPartContent(\n content: MessageContent,\n): content is ContentPart[] {\n return Array.isArray(content);\n}\n\n/** Extract text from MessageContent regardless of format */\nexport function getTextContent(content: MessageContent): string {\n if (typeof content === \"string\") return content;\n return content\n .filter((p): p is Extract<ContentPart, { type: \"text\" }> => p.type === \"text\")\n .map((p) => p.text)\n .join(\"\\n\");\n}\n","/** Base error class for agent-sdk.\n *\n * Use `AgentSDKError.is(err)` for reliable cross-module `instanceof` checks\n * (works across separately bundled entry points where `instanceof` may fail). */\nexport class AgentSDKError extends Error {\n /** @internal Marker for cross-bundle identity checks */\n readonly _agentSDKError = true as const;\n\n constructor(message: string, options?: ErrorOptions) {\n super(message, options);\n this.name = \"AgentSDKError\";\n }\n\n /** Check if an error is an AgentSDKError (works across bundled copies) */\n static is(error: unknown): error is AgentSDKError {\n return (\n error instanceof Error &&\n \"_agentSDKError\" in error &&\n (error as AgentSDKError)._agentSDKError === true\n );\n }\n}\n\n/** Thrown when agent.run() is called while already running (M8 re-entrancy guard) */\nexport class ReentrancyError extends AgentSDKError {\n constructor() {\n super(\"Agent is already running. Await the current run before starting another.\");\n this.name = \"ReentrancyError\";\n }\n}\n\n/** Thrown when an operation is attempted on a disposed agent/service */\nexport class DisposedError extends AgentSDKError {\n constructor(entity: string) {\n super(`${entity} has been disposed and cannot be used.`);\n this.name = \"DisposedError\";\n }\n}\n\n/** Thrown when a backend is not found in the registry */\nexport class BackendNotFoundError extends AgentSDKError {\n constructor(backend: string) {\n super(\n `Unknown backend: \"${backend}\". ` +\n `Built-in: copilot, claude, vercel-ai. ` +\n `Custom: use registerBackend() first.`,\n );\n this.name = \"BackendNotFoundError\";\n }\n}\n\n/** Thrown when a backend is already registered */\nexport class BackendAlreadyRegisteredError extends AgentSDKError {\n constructor(backend: string) {\n super(`Backend \"${backend}\" is already registered. Use a different name or unregister first.`);\n this.name = \"BackendAlreadyRegisteredError\";\n }\n}\n\n/** Thrown when subprocess management fails */\nexport class SubprocessError extends AgentSDKError {\n constructor(message: string, options?: ErrorOptions) {\n super(message, options);\n this.name = \"SubprocessError\";\n }\n}\n\n/** Thrown when a required peer dependency is not installed */\nexport class DependencyError extends AgentSDKError {\n public readonly packageName: string;\n\n constructor(packageName: string) {\n super(`${packageName} is not installed. Install it: npm install ${packageName}`);\n this.name = \"DependencyError\";\n this.packageName = packageName;\n }\n}\n\n/** Thrown when an agent run is aborted */\nexport class AbortError extends AgentSDKError {\n constructor() {\n super(\"Agent run was aborted.\");\n this.name = \"AbortError\";\n }\n}\n\n/** Thrown when a tool execution fails */\nexport class ToolExecutionError extends AgentSDKError {\n public readonly toolName: string;\n\n constructor(toolName: string, message: string, options?: ErrorOptions) {\n super(`Tool \"${toolName}\" failed: ${message}`, options);\n this.name = \"ToolExecutionError\";\n this.toolName = toolName;\n }\n}\n\n/** Thrown when structured output parsing fails */\nexport class StructuredOutputError extends AgentSDKError {\n constructor(message: string, options?: ErrorOptions) {\n super(`Structured output error: ${message}`, options);\n this.name = \"StructuredOutputError\";\n }\n}\n","import type {\n IAgent,\n AgentConfig,\n AgentState,\n AgentResult,\n AgentEvent,\n MessageContent,\n Message,\n RunOptions,\n StructuredOutputConfig,\n UsageData,\n} from \"./types.js\";\nimport { ReentrancyError, DisposedError, AbortError } from \"./errors.js\";\n\n/** Abstract base agent with shared lifecycle logic.\n * Concrete backends extend this and implement the protected _run/_stream methods. */\nexport abstract class BaseAgent implements IAgent {\n protected state: AgentState = \"idle\";\n protected abortController: AbortController | null = null;\n protected readonly config: AgentConfig;\n private _cleanupExternalSignal: (() => void) | null = null;\n\n /** Backend identifier (e.g. \"copilot\", \"claude\", \"vercel-ai\") */\n protected abstract readonly backendName: string;\n\n /** CLI session ID for persistent mode. Override in backends that support it. */\n get sessionId(): string | undefined {\n return undefined;\n }\n\n constructor(config: AgentConfig) {\n this.config = Object.freeze({ ...config });\n }\n\n // ─── Public Interface ─────────────────────────────────────────\n\n async run(\n prompt: MessageContent,\n options?: RunOptions,\n ): Promise<AgentResult> {\n this.guardReentrancy();\n this.guardDisposed();\n\n const ac = this.createAbortController(options?.signal);\n this.state = \"running\";\n\n try {\n const messages: Message[] = [{ role: \"user\", content: prompt }];\n const result = await this.executeRun(messages, options, ac.signal);\n this.enrichAndNotifyUsage(result);\n return result;\n } finally {\n this.cleanupRun();\n }\n }\n\n async runWithContext(\n messages: Message[],\n options?: RunOptions,\n ): Promise<AgentResult> {\n this.guardReentrancy();\n this.guardDisposed();\n\n const ac = this.createAbortController(options?.signal);\n this.state = \"running\";\n\n try {\n const result = await this.executeRun(messages, options, ac.signal);\n this.enrichAndNotifyUsage(result);\n return result;\n } finally {\n this.cleanupRun();\n }\n }\n\n async runStructured<T>(\n prompt: MessageContent,\n schema: StructuredOutputConfig<T>,\n options?: RunOptions,\n ): Promise<AgentResult<T>> {\n this.guardReentrancy();\n this.guardDisposed();\n\n const ac = this.createAbortController(options?.signal);\n this.state = \"running\";\n\n try {\n const messages: Message[] = [{ role: \"user\", content: prompt }];\n const result = await this.executeRunStructured(\n messages,\n schema,\n options,\n ac.signal,\n );\n this.enrichAndNotifyUsage(result);\n return result;\n } finally {\n this.cleanupRun();\n }\n }\n\n async *stream(\n prompt: MessageContent,\n options?: RunOptions,\n ): AsyncIterable<AgentEvent> {\n this.guardReentrancy();\n this.guardDisposed();\n\n const ac = this.createAbortController(options?.signal);\n this.state = \"streaming\";\n\n try {\n const messages: Message[] = [{ role: \"user\", content: prompt }];\n const enriched = this.enrichStream(this.executeStream(messages, options, ac.signal));\n yield* this.heartbeatStream(enriched);\n } finally {\n this.cleanupRun();\n }\n }\n\n async *streamWithContext(\n messages: Message[],\n options?: RunOptions,\n ): AsyncIterable<AgentEvent> {\n this.guardReentrancy();\n this.guardDisposed();\n\n const ac = this.createAbortController(options?.signal);\n this.state = \"streaming\";\n\n try {\n const enriched = this.enrichStream(this.executeStream(messages, options, ac.signal));\n yield* this.heartbeatStream(enriched);\n } finally {\n this.cleanupRun();\n }\n }\n\n abort(): void {\n if (this.abortController) {\n this.abortController.abort();\n }\n }\n\n /** Default interrupt — falls back to abort(). Backends may override with graceful shutdown. */\n async interrupt(): Promise<void> {\n this.abort();\n }\n\n getState(): AgentState {\n return this.state;\n }\n\n getConfig(): Readonly<AgentConfig> {\n return this.config;\n }\n\n /** Mark agent as disposed. Override to add cleanup. */\n dispose(): void {\n this._cleanupExternalSignal?.();\n this._cleanupExternalSignal = null;\n this.abort();\n this.state = \"disposed\";\n }\n\n // ─── Abstract Methods (implemented by backends) ───────────────\n\n /** Execute a blocking run. Backend implements the actual LLM call. */\n protected abstract executeRun(\n messages: Message[],\n options: RunOptions | undefined,\n signal: AbortSignal,\n ): Promise<AgentResult>;\n\n /** Execute a structured output run. Backend implements parsing. */\n protected abstract executeRunStructured<T>(\n messages: Message[],\n schema: StructuredOutputConfig<T>,\n options: RunOptions | undefined,\n signal: AbortSignal,\n ): Promise<AgentResult<T>>;\n\n /** Execute a streaming run. Backend yields events. */\n protected abstract executeStream(\n messages: Message[],\n options: RunOptions | undefined,\n signal: AbortSignal,\n ): AsyncIterable<AgentEvent>;\n\n // ─── Usage Enrichment ───────────────────────────────────────────\n\n /** Enrich result usage with model/backend and fire onUsage callback */\n private enrichAndNotifyUsage(result: AgentResult<unknown>): void {\n if (result.usage) {\n result.usage = {\n ...result.usage,\n model: this.config.model,\n backend: this.backendName,\n };\n this.callOnUsage(result.usage);\n }\n }\n\n /** Wrap a stream to enrich usage_update events and fire onUsage callback */\n private async *enrichStream(\n source: AsyncIterable<AgentEvent>,\n ): AsyncIterable<AgentEvent> {\n for await (const event of source) {\n if (event.type === \"usage_update\") {\n const usage: UsageData = {\n promptTokens: event.promptTokens,\n completionTokens: event.completionTokens,\n model: this.config.model,\n backend: this.backendName,\n };\n this.callOnUsage(usage);\n yield { type: \"usage_update\", ...usage };\n } else {\n yield event;\n }\n }\n }\n\n /** Fire onUsage callback (fire-and-forget: errors logged, not propagated) */\n private callOnUsage(usage: UsageData): void {\n if (!this.config.onUsage) return;\n try {\n this.config.onUsage(usage);\n } catch (e) {\n console.warn(\n \"[agent-sdk] onUsage callback error:\",\n e instanceof Error ? e.message : String(e),\n );\n }\n }\n\n // ─── Heartbeat ───────────────────────────────────────────────\n\n /** Wrap a stream to emit heartbeat events at configured intervals.\n * When heartbeatInterval is not set, passes through directly. */\n private async *heartbeatStream(\n source: AsyncIterable<AgentEvent>,\n ): AsyncIterable<AgentEvent> {\n const interval = this.config.heartbeatInterval;\n if (!interval || interval <= 0) {\n yield* source;\n return;\n }\n\n const iterator = source[Symbol.asyncIterator]();\n let pendingEvent: Promise<IteratorResult<AgentEvent>> | null = null;\n let heartbeatResolve: (() => void) | null = null;\n\n const timer = setInterval(() => {\n if (heartbeatResolve) {\n const resolve = heartbeatResolve;\n heartbeatResolve = null;\n resolve();\n }\n }, interval);\n\n try {\n while (true) {\n if (!pendingEvent) {\n pendingEvent = iterator.next();\n }\n\n const heartbeatPromise = new Promise<void>((resolve) => {\n heartbeatResolve = resolve;\n });\n\n const eventDone = pendingEvent.then(\n (r) => ({ kind: \"event\" as const, result: r }),\n );\n const heartbeatDone = heartbeatPromise.then(\n () => ({ kind: \"heartbeat\" as const }),\n );\n\n const winner = await Promise.race([eventDone, heartbeatDone]);\n\n if (winner.kind === \"heartbeat\") {\n yield { type: \"heartbeat\" };\n } else {\n pendingEvent = null;\n heartbeatResolve = null;\n if (winner.result.done) break;\n yield winner.result.value;\n }\n }\n } finally {\n clearInterval(timer);\n heartbeatResolve = null;\n }\n }\n\n // ─── Guards ───────────────────────────────────────────────────\n\n protected guardReentrancy(): void {\n if (this.state === \"running\" || this.state === \"streaming\") {\n throw new ReentrancyError();\n }\n }\n\n protected guardDisposed(): void {\n if (this.state === \"disposed\") {\n throw new DisposedError(\"Agent\");\n }\n }\n\n /** Throw AbortError if signal is already aborted */\n protected checkAbort(signal: AbortSignal): void {\n if (signal.aborted) {\n throw new AbortError();\n }\n }\n\n // ─── Internal Helpers ─────────────────────────────────────────\n\n /** Clean up after a run completes (success, error, or abort). */\n private cleanupRun(): void {\n this._cleanupExternalSignal?.();\n this._cleanupExternalSignal = null;\n this.state = \"idle\";\n this.abortController = null;\n }\n\n private createAbortController(externalSignal?: AbortSignal): AbortController {\n const ac = new AbortController();\n this.abortController = ac;\n this._cleanupExternalSignal = null;\n\n if (externalSignal) {\n if (externalSignal.aborted) {\n ac.abort();\n } else {\n const listener = () => ac.abort();\n externalSignal.addEventListener(\"abort\", listener, { once: true });\n this._cleanupExternalSignal = () => externalSignal.removeEventListener(\"abort\", listener);\n }\n }\n\n return ac;\n }\n}\n","import type { z } from \"zod\";\n\n/** Convert a Zod schema to JSON Schema.\n * Detection order: toJSONSchema() (Zod v4) → jsonSchema() (Zod v3.24+) → _def extraction (Zod v3 legacy). */\nexport function zodToJsonSchema(schema: z.ZodType): Record<string, unknown> {\n const schemaAny = schema as unknown as Record<string, unknown>;\n\n // Zod v4: toJSONSchema()\n if (\"toJSONSchema\" in schema && typeof schemaAny.toJSONSchema === \"function\") {\n return (schemaAny.toJSONSchema as () => Record<string, unknown>)();\n }\n\n // Zod v3.24+: jsonSchema()\n if (\"jsonSchema\" in schema && typeof schemaAny.jsonSchema === \"function\") {\n return (schemaAny.jsonSchema as () => Record<string, unknown>)();\n }\n\n // Zod v3 legacy: _def.typeName extraction\n return extractSchemaFromDef(schema);\n}\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\nfunction extractSchemaFromDef(schema: z.ZodType): Record<string, unknown> {\n const def = (schema as unknown as { _def: Record<string, any> })._def;\n const typeName = def.typeName as string;\n\n switch (typeName) {\n case \"ZodString\":\n return { type: \"string\" };\n case \"ZodNumber\":\n return { type: \"number\" };\n case \"ZodBoolean\":\n return { type: \"boolean\" };\n case \"ZodNull\":\n return { type: \"null\" };\n case \"ZodArray\":\n return {\n type: \"array\",\n items: extractSchemaFromDef(def.type as z.ZodType),\n };\n case \"ZodObject\": {\n const shape = (schema as unknown as { shape: Record<string, z.ZodType> }).shape;\n const properties: Record<string, unknown> = {};\n const required: string[] = [];\n\n for (const [key, value] of Object.entries(shape)) {\n const valueDef = (value as unknown as { _def: Record<string, any> })._def;\n if (valueDef.typeName === \"ZodOptional\") {\n properties[key] = extractSchemaFromDef(valueDef.innerType as z.ZodType);\n } else {\n properties[key] = extractSchemaFromDef(value);\n required.push(key);\n }\n }\n\n return {\n type: \"object\",\n properties,\n ...(required.length > 0 ? { required } : {}),\n };\n }\n case \"ZodOptional\":\n return extractSchemaFromDef(def.innerType as z.ZodType);\n case \"ZodEnum\":\n return { type: \"string\", enum: def.values as string[] };\n default:\n return {};\n }\n}\n/* eslint-enable @typescript-eslint/no-explicit-any */\n","import type {\n IAgent,\n IAgentService,\n AgentConfig,\n AgentResult,\n AgentEvent,\n Message,\n RunOptions,\n StructuredOutputConfig,\n ToolDefinition,\n VercelAIBackendOptions,\n ModelInfo,\n ValidationResult,\n JSONValue,\n PermissionRequest as UnifiedPermissionRequest,\n PermissionDecision,\n} from \"../types.js\";\nimport { getTextContent } from \"../types.js\";\nimport { BaseAgent } from \"../base-agent.js\";\nimport { DisposedError, DependencyError, AbortError, ToolExecutionError } from \"../errors.js\";\nimport { zodToJsonSchema } from \"../utils/schema.js\";\nimport type { IPermissionStore } from \"../permission-store.js\";\n\nexport type { VercelAIBackendOptions } from \"../types.js\";\n\n// ─── Local Type Definitions (matching Vercel AI SDK v6 shapes) ──\n// Avoids requiring the SDK to be installed at compile time.\n\n/** @internal Vercel AI SDK tool result */\ninterface SDKToolDefinition {\n description: string;\n inputSchema: unknown;\n execute?: (input: unknown, options: unknown) => Promise<unknown>;\n needsApproval?: boolean | ((input: unknown, options: unknown) => Promise<boolean>);\n}\n\n/** @internal Vercel AI SDK v6 generateText result */\ninterface SDKGenerateTextResult {\n text: string;\n toolCalls: Array<{ toolCallId: string; toolName: string; input: unknown }>;\n toolResults: Array<{ toolCallId: string; toolName: string; output: unknown }>;\n steps: Array<{\n text: string;\n toolCalls: Array<{ toolCallId: string; toolName: string; input: unknown }>;\n toolResults: Array<{ toolCallId: string; toolName: string; output: unknown }>;\n usage: { inputTokens?: number; outputTokens?: number };\n finishReason: string;\n }>;\n totalUsage: { inputTokens?: number; outputTokens?: number };\n finishReason: string;\n response: { messages: unknown[] };\n}\n\n/** @internal Vercel AI SDK generateObject result */\ninterface SDKGenerateObjectResult {\n object: unknown;\n usage: { inputTokens?: number; outputTokens?: number };\n}\n\n/** @internal Vercel AI SDK streamText result */\ninterface SDKStreamTextResult {\n fullStream: AsyncIterable<SDKStreamPart>;\n totalUsage: PromiseLike<{ inputTokens?: number; outputTokens?: number }>;\n text: PromiseLike<string>;\n}\n\n/** @internal Vercel AI SDK v6 stream part union */\ntype SDKStreamPart =\n | { type: \"text-delta\"; text: string }\n | { type: \"tool-call\"; toolCallId: string; toolName: string; input: unknown }\n | { type: \"tool-result\"; toolCallId: string; toolName: string; output: unknown }\n | { type: \"tool-error\"; toolCallId: string; toolName: string; error: unknown }\n | { type: \"reasoning-start\" }\n | { type: \"reasoning-end\" }\n | { type: \"reasoning-delta\"; text: string }\n | { type: \"finish-step\"; usage: { inputTokens?: number; outputTokens?: number }; finishReason: string }\n | { type: \"finish\"; finishReason: string; totalUsage: { inputTokens?: number; outputTokens?: number } }\n | { type: \"error\"; error: unknown }\n | { type: string };\n\n/** @internal Vercel AI SDK LanguageModel — opaque type from SDK */\ntype SDKLanguageModel = Record<string, unknown>;\n\n/** @internal SDK module shape */\ninterface SDKModule {\n generateText: (options: Record<string, unknown>) => Promise<SDKGenerateTextResult>;\n streamText: (options: Record<string, unknown>) => SDKStreamTextResult;\n generateObject: (options: Record<string, unknown>) => Promise<SDKGenerateObjectResult>;\n tool: (options: Record<string, unknown>) => SDKToolDefinition;\n jsonSchema: (schema: unknown) => unknown;\n stepCountIs: (count: number) => unknown;\n}\n\n/** @internal OpenAI-compatible module shape */\ninterface SDKCompatModule {\n createOpenAICompatible: (options: Record<string, unknown>) => {\n chatModel: (modelId: string) => SDKLanguageModel;\n languageModel: (modelId: string) => SDKLanguageModel;\n };\n}\n\n// ─── Dynamic SDK Loader ─────────────────────────────────────────\n\nlet sdkModule: SDKModule | null = null;\nlet compatModule: SDKCompatModule | null = null;\n\nasync function loadSDK(): Promise<SDKModule> {\n if (sdkModule) return sdkModule;\n try {\n // @ts-ignore — peer dependency, not present at compile time\n sdkModule = (await import(\"ai\")) as SDKModule;\n return sdkModule!;\n } catch {\n throw new DependencyError(\"ai\");\n }\n}\n\nasync function loadCompat(): Promise<SDKCompatModule> {\n if (compatModule) return compatModule;\n try {\n // @ts-ignore — peer dependency, not present at compile time\n compatModule = (await import(\"@ai-sdk/openai-compatible\")) as SDKCompatModule;\n return compatModule!;\n } catch {\n throw new DependencyError(\"@ai-sdk/openai-compatible\");\n }\n}\n\n/** @internal For testing: inject mock SDK module */\nexport function _injectSDK(mock: SDKModule | null): void {\n sdkModule = mock;\n}\n\n/** @internal For testing: inject mock compat module */\nexport function _injectCompat(mock: SDKCompatModule | null): void {\n compatModule = mock;\n}\n\n/** @internal For testing: reset injected SDK */\nexport function _resetSDK(): void {\n sdkModule = null;\n compatModule = null;\n}\n\n// ─── Constants ──────────────────────────────────────────────────\n\nconst DEFAULT_BASE_URL = \"https://openrouter.ai/api/v1\";\nconst DEFAULT_PROVIDER = \"openrouter\";\nconst DEFAULT_MAX_TURNS = 10;\n\n// ─── Tool Mapping ───────────────────────────────────────────────\n\nfunction mapToolsToSDK(\n sdk: SDKModule,\n tools: ToolDefinition[],\n config: AgentConfig,\n sessionApprovals: Set<string>,\n permissionStore: IPermissionStore | undefined,\n signal: AbortSignal,\n): Record<string, SDKToolDefinition> {\n const toolMap: Record<string, SDKToolDefinition> = {};\n const supervisor = config.supervisor;\n\n for (const ourTool of tools) {\n const jsonSchema = zodToJsonSchema(ourTool.parameters);\n\n toolMap[ourTool.name] = sdk.tool({\n description: ourTool.description,\n inputSchema: sdk.jsonSchema(jsonSchema),\n execute: wrapToolExecute(ourTool, supervisor, sessionApprovals, permissionStore, signal),\n ...(ourTool.needsApproval && supervisor?.onPermission\n ? {\n needsApproval: async (_input: Record<string, unknown>) => {\n // If already approved via store, skip\n if (permissionStore && await permissionStore.isApproved(ourTool.name)) return false;\n // If already session-approved, skip\n if (sessionApprovals.has(ourTool.name)) return false;\n return true; // will be handled in execute wrapper\n },\n }\n : {}),\n });\n }\n\n // M1: Inject built-in ask_user tool when supervisor.onAskUser is provided\n if (supervisor?.onAskUser) {\n const onAskUser = supervisor.onAskUser;\n toolMap[\"ask_user\"] = sdk.tool({\n description: \"Ask the user a question and wait for their response\",\n inputSchema: sdk.jsonSchema({\n type: \"object\",\n properties: {\n question: { type: \"string\", description: \"The question to ask the user\" },\n },\n required: [\"question\"],\n }),\n execute: async (args: { question: string }) => {\n const response = await onAskUser(\n { question: args.question, allowFreeform: true },\n signal,\n );\n return response.answer;\n },\n });\n }\n\n return toolMap;\n}\n\nfunction wrapToolExecute(\n ourTool: ToolDefinition,\n supervisor: AgentConfig[\"supervisor\"],\n sessionApprovals: Set<string>,\n permissionStore: IPermissionStore | undefined,\n signal: AbortSignal,\n): (args: unknown) => Promise<JSONValue> {\n return async (args: unknown): Promise<JSONValue> => {\n // Permission check for tools with needsApproval\n if (ourTool.needsApproval && supervisor?.onPermission) {\n // Check store first, then fall back to sessionApprovals set\n const storeApproved = permissionStore && await permissionStore.isApproved(ourTool.name);\n if (!storeApproved && !sessionApprovals.has(ourTool.name)) {\n const request: UnifiedPermissionRequest = {\n toolName: ourTool.name,\n toolArgs: (args ?? {}) as Record<string, unknown>,\n };\n\n const decision: PermissionDecision = await supervisor.onPermission(\n request,\n signal,\n );\n\n if (!decision.allowed) {\n throw new ToolExecutionError(\n ourTool.name,\n decision.reason ?? \"Permission denied\",\n );\n }\n\n // Persist approval to store if available\n if (permissionStore && decision.scope) {\n await permissionStore.approve(ourTool.name, decision.scope);\n }\n\n // Also keep sessionApprovals for backward compat\n if (decision.scope === \"session\" || decision.scope === \"always\" || decision.scope === \"project\") {\n sessionApprovals.add(ourTool.name);\n }\n\n // Use modified input if provided\n if (decision.modifiedInput) {\n args = decision.modifiedInput;\n }\n }\n }\n\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const result = await ourTool.execute(args as any);\n return result as JSONValue;\n } catch (e) {\n if (e instanceof ToolExecutionError) throw e;\n throw new ToolExecutionError(\n ourTool.name,\n e instanceof Error ? e.message : String(e),\n );\n }\n };\n}\n\n// ─── Message Conversion ─────────────────────────────────────────\n\nfunction messagesToSDK(messages: Message[]): Array<Record<string, unknown>> {\n return messages.map((msg) => {\n switch (msg.role) {\n case \"user\":\n return { role: \"user\", content: getTextContent(msg.content) };\n case \"assistant\": {\n let content = getTextContent(msg.content);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const thinking = (msg as any).thinking as string | undefined;\n if (thinking) {\n content = `[reasoning: ${thinking}]\\n${content}`;\n }\n const mapped: Record<string, unknown> = { role: \"assistant\", content };\n if (msg.toolCalls && msg.toolCalls.length > 0) {\n mapped.toolCalls = msg.toolCalls.map((tc) => ({\n id: tc.id,\n name: tc.name,\n args: tc.args,\n }));\n }\n return mapped;\n }\n case \"system\":\n return { role: \"system\", content: msg.content };\n case \"tool\": {\n if (msg.toolResults && msg.toolResults.length > 0) {\n return {\n role: \"tool\",\n toolResults: msg.toolResults.map((tr) => ({\n toolCallId: tr.toolCallId,\n name: tr.name,\n result: tr.result,\n isError: tr.isError ?? false,\n })),\n };\n }\n return { role: \"tool\", content: msg.content ?? \"\" };\n }\n default:\n return { role: \"user\", content: \"\" };\n }\n });\n}\n\n// ─── Event Mapping (fullStream → AgentEvent) ────────────────────\n\nfunction mapStreamPart(part: SDKStreamPart): AgentEvent | null {\n switch (part.type) {\n case \"text-delta\": {\n const p = part as Extract<SDKStreamPart, { type: \"text-delta\" }>;\n return { type: \"text_delta\", text: p.text ?? \"\" };\n }\n\n case \"tool-call\": {\n const p = part as Extract<SDKStreamPart, { type: \"tool-call\" }>;\n return {\n type: \"tool_call_start\",\n toolCallId: String(p.toolCallId ?? \"\"),\n toolName: p.toolName ?? \"unknown\",\n args: (p.input ?? {}) as JSONValue,\n };\n }\n\n case \"tool-result\": {\n const p = part as Extract<SDKStreamPart, { type: \"tool-result\" }>;\n return {\n type: \"tool_call_end\",\n toolCallId: String(p.toolCallId ?? \"\"),\n toolName: p.toolName ?? \"unknown\",\n result: (p.output ?? null) as JSONValue,\n };\n }\n\n case \"tool-error\": {\n const p = part as Extract<SDKStreamPart, { type: \"tool-error\" }>;\n return {\n type: \"error\",\n error: p.error instanceof Error\n ? p.error.message\n : String(p.error ?? \"Tool execution failed\"),\n recoverable: true,\n };\n }\n\n case \"reasoning-start\":\n return { type: \"thinking_start\" };\n\n case \"reasoning-end\":\n return { type: \"thinking_end\" };\n\n case \"reasoning-delta\": {\n const p = part as Extract<SDKStreamPart, { type: \"reasoning-delta\" }>;\n return { type: \"thinking_delta\", text: p.text ?? \"\" };\n }\n\n case \"finish-step\": {\n const p = part as Extract<SDKStreamPart, { type: \"finish-step\" }>;\n return {\n type: \"usage_update\",\n promptTokens: Number(p.usage?.inputTokens ?? 0),\n completionTokens: Number(p.usage?.outputTokens ?? 0),\n };\n }\n\n case \"error\": {\n const p = part as Extract<SDKStreamPart, { type: \"error\" }>;\n return {\n type: \"error\",\n error: p.error instanceof Error\n ? p.error.message\n : String(p.error ?? \"Unknown error\"),\n recoverable: false,\n };\n }\n\n default:\n return null;\n }\n}\n\n// ─── VercelAIAgent ──────────────────────────────────────────────\n\nclass VercelAIAgent extends BaseAgent {\n protected readonly backendName = \"vercel-ai\";\n private readonly backendOptions: VercelAIBackendOptions;\n private readonly sessionApprovals = new Set<string>();\n private model: SDKLanguageModel | null = null;\n\n constructor(\n config: AgentConfig,\n backendOptions: VercelAIBackendOptions,\n ) {\n super(config);\n this.backendOptions = backendOptions;\n }\n\n private async getModel(): Promise<SDKLanguageModel> {\n if (this.model) return this.model;\n\n const compat = await loadCompat();\n const provider = compat.createOpenAICompatible({\n name: this.backendOptions.provider ?? DEFAULT_PROVIDER,\n baseURL: this.backendOptions.baseUrl ?? DEFAULT_BASE_URL,\n apiKey: this.backendOptions.apiKey,\n });\n\n const modelId = this.config.model ?? \"anthropic/claude-sonnet-4-5\";\n this.model = provider.chatModel(modelId);\n return this.model;\n }\n\n private async getSDKTools(signal: AbortSignal): Promise<Record<string, SDKToolDefinition>> {\n const sdk = await loadSDK();\n return mapToolsToSDK(sdk, this.config.tools ?? [], this.config, this.sessionApprovals, this.config.permissionStore, signal);\n }\n\n // ─── executeRun ─────────────────────────────────────────────────\n\n protected async executeRun(\n messages: Message[],\n _options: RunOptions | undefined,\n signal: AbortSignal,\n ): Promise<AgentResult> {\n this.checkAbort(signal);\n\n const sdk = await loadSDK();\n const model = await this.getModel();\n const tools = await this.getSDKTools(signal);\n const maxTurns = this.config.maxTurns ?? DEFAULT_MAX_TURNS;\n\n const sdkMessages = messagesToSDK(messages);\n const hasTools = Object.keys(tools).length > 0;\n\n const result: SDKGenerateTextResult = await sdk.generateText({\n model,\n system: this.config.systemPrompt,\n messages: sdkMessages,\n tools: hasTools ? tools : undefined,\n stopWhen: sdk.stepCountIs(maxTurns),\n abortSignal: signal,\n ...(this.config.modelParams?.temperature !== undefined && {\n temperature: this.config.modelParams.temperature,\n }),\n ...(this.config.modelParams?.maxTokens !== undefined && {\n maxTokens: this.config.modelParams.maxTokens,\n }),\n ...(this.config.modelParams?.topP !== undefined && {\n topP: this.config.modelParams.topP,\n }),\n ...(this.config.providerOptions && {\n providerOptions: this.config.providerOptions,\n }),\n });\n\n // Collect all tool calls across all steps\n const toolCalls: AgentResult[\"toolCalls\"] = [];\n for (const step of result.steps) {\n for (const tc of step.toolCalls) {\n const matchingResult = step.toolResults.find(\n (tr) => tr.toolCallId === tc.toolCallId,\n );\n toolCalls.push({\n toolName: tc.toolName,\n args: (tc.input ?? {}) as JSONValue,\n result: (matchingResult?.output ?? null) as JSONValue,\n approved: true,\n });\n }\n }\n\n const usage = {\n promptTokens: Number(result.totalUsage?.inputTokens ?? 0),\n completionTokens: Number(result.totalUsage?.outputTokens ?? 0),\n };\n\n // In multi-step flows, result.text includes intermediate reasoning from all steps.\n // Use only the last step's text as the final output.\n const lastStep = result.steps.length > 0 ? result.steps[result.steps.length - 1] : null;\n const outputText = lastStep?.text || null;\n\n return {\n output: outputText,\n structuredOutput: undefined as AgentResult[\"structuredOutput\"],\n toolCalls,\n messages: [\n ...messages,\n ...(outputText\n ? [{ role: \"assistant\" as const, content: outputText }]\n : []),\n ],\n usage,\n };\n }\n\n // ─── executeRunStructured ───────────────────────────────────────\n\n protected async executeRunStructured<T>(\n messages: Message[],\n schema: StructuredOutputConfig<T>,\n _options: RunOptions | undefined,\n signal: AbortSignal,\n ): Promise<AgentResult<T>> {\n this.checkAbort(signal);\n\n const sdk = await loadSDK();\n const model = await this.getModel();\n\n const sdkMessages = messagesToSDK(messages);\n const jsonSchema = zodToJsonSchema(schema.schema);\n\n const result: SDKGenerateObjectResult = await sdk.generateObject({\n model,\n system: this.config.systemPrompt,\n messages: sdkMessages,\n schema: sdk.jsonSchema(jsonSchema),\n schemaName: schema.name,\n schemaDescription: schema.description,\n abortSignal: signal,\n ...(this.config.modelParams?.temperature !== undefined && {\n temperature: this.config.modelParams.temperature,\n }),\n ...(this.config.modelParams?.maxTokens !== undefined && {\n maxTokens: this.config.modelParams.maxTokens,\n }),\n ...(this.config.providerOptions && {\n providerOptions: this.config.providerOptions,\n }),\n });\n\n // Validate and parse through our zod schema\n let structuredOutput: T | undefined;\n try {\n structuredOutput = schema.schema.parse(result.object);\n } catch {\n // If zod validation fails, leave undefined\n }\n\n const usage = {\n promptTokens: Number(result.usage?.inputTokens ?? 0),\n completionTokens: Number(result.usage?.outputTokens ?? 0),\n };\n\n return {\n output: JSON.stringify(result.object),\n structuredOutput: structuredOutput as AgentResult<T>[\"structuredOutput\"],\n toolCalls: [],\n messages: [\n ...messages,\n ...(result.object != null\n ? [{ role: \"assistant\" as const, content: JSON.stringify(result.object) }]\n : []),\n ],\n usage,\n };\n }\n\n // ─── executeStream ──────────────────────────────────────────────\n\n protected async *executeStream(\n messages: Message[],\n _options: RunOptions | undefined,\n signal: AbortSignal,\n ): AsyncIterable<AgentEvent> {\n this.checkAbort(signal);\n\n const sdk = await loadSDK();\n const model = await this.getModel();\n const tools = await this.getSDKTools(signal);\n const maxTurns = this.config.maxTurns ?? DEFAULT_MAX_TURNS;\n\n const sdkMessages = messagesToSDK(messages);\n const hasTools = Object.keys(tools).length > 0;\n\n const result: SDKStreamTextResult = sdk.streamText({\n model,\n system: this.config.systemPrompt,\n messages: sdkMessages,\n tools: hasTools ? tools : undefined,\n stopWhen: sdk.stepCountIs(maxTurns),\n abortSignal: signal,\n ...(this.config.modelParams?.temperature !== undefined && {\n temperature: this.config.modelParams.temperature,\n }),\n ...(this.config.modelParams?.maxTokens !== undefined && {\n maxTokens: this.config.modelParams.maxTokens,\n }),\n ...(this.config.modelParams?.topP !== undefined && {\n topP: this.config.modelParams.topP,\n }),\n ...(this.config.providerOptions && {\n providerOptions: this.config.providerOptions,\n }),\n });\n\n let finalText = \"\";\n\n try {\n for await (const part of result.fullStream) {\n if (signal.aborted) throw new AbortError();\n\n const event = mapStreamPart(part as SDKStreamPart);\n if (event) yield event;\n\n if ((part as SDKStreamPart).type === \"text-delta\") {\n finalText += (part as Extract<SDKStreamPart, { type: \"text-delta\" }>).text ?? \"\";\n }\n\n // When a step finishes with tool calls, the text accumulated so far is\n // intermediate reasoning (e.g. \"Let me search...\"). Reset so that only\n // the final step's text becomes the output.\n if ((part as SDKStreamPart).type === \"finish-step\") {\n const p = part as Extract<SDKStreamPart, { type: \"finish-step\" }>;\n if (p.finishReason === \"tool-calls\") {\n finalText = \"\";\n }\n }\n }\n\n // Emit final usage from totalUsage\n const totalUsage = await result.totalUsage;\n yield {\n type: \"usage_update\",\n promptTokens: Number(totalUsage?.inputTokens ?? 0),\n completionTokens: Number(totalUsage?.outputTokens ?? 0),\n };\n\n yield {\n type: \"done\",\n finalOutput: finalText || null,\n };\n } catch (e) {\n if (signal.aborted) throw new AbortError();\n throw e;\n }\n }\n\n override dispose(): void {\n this.sessionApprovals.clear();\n this.model = null;\n super.dispose();\n }\n}\n\n// ─── VercelAIAgentService ───────────────────────────────────────\n\nclass VercelAIAgentService implements IAgentService {\n readonly name = \"vercel-ai\";\n private disposed = false;\n private readonly options: VercelAIBackendOptions;\n\n constructor(options: VercelAIBackendOptions) {\n this.options = options;\n }\n\n createAgent(config: AgentConfig): IAgent {\n if (this.disposed) throw new DisposedError(\"VercelAIAgentService\");\n return new VercelAIAgent(config, this.options);\n }\n\n async listModels(): Promise<ModelInfo[]> {\n if (this.disposed) throw new DisposedError(\"VercelAIAgentService\");\n\n const baseUrl = (this.options.baseUrl || \"https://api.openai.com/v1\").replace(/\\/+$/, \"\");\n\n try {\n const res = await globalThis.fetch(`${baseUrl}/models`, {\n headers: { Authorization: `Bearer ${this.options.apiKey}` },\n });\n\n if (!res.ok) {\n return [];\n }\n\n const body = (await res.json()) as { data?: Array<{ id: string }> };\n if (!body.data || body.data.length === 0) {\n return [];\n }\n\n return body.data.map((m) => ({ id: m.id }));\n } catch {\n return [];\n }\n }\n\n async validate(): Promise<ValidationResult> {\n if (this.disposed) throw new DisposedError(\"VercelAIAgentService\");\n\n const errors: string[] = [];\n\n if (!this.options.apiKey) {\n errors.push(\"apiKey is required for Vercel AI backend.\");\n }\n\n try {\n await loadSDK();\n } catch (e) {\n errors.push(e instanceof Error ? e.message : String(e));\n }\n\n try {\n await loadCompat();\n } catch (e) {\n errors.push(e instanceof Error ? e.message : String(e));\n }\n\n return { valid: errors.length === 0, errors };\n }\n\n async dispose(): Promise<void> {\n if (this.disposed) return;\n this.disposed = true;\n }\n}\n\n// ─── Factory ────────────────────────────────────────────────────\n\n/** Create Vercel AI SDK backend service. */\nexport function createVercelAIService(\n options: VercelAIBackendOptions,\n): IAgentService {\n return new VercelAIAgentService(options);\n}\n"]}