@witqq/agent-sdk 0.1.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -10,11 +10,13 @@ npm install @witqq/agent-sdk zod
10
10
 
11
11
  ## Backends
12
12
 
13
- | Backend | Peer dependency | Type |
14
- |---|---|---|
15
- | `copilot` | `@github/copilot-sdk` | CLI subprocess |
16
- | `claude` | `@anthropic-ai/claude-agent-sdk` | CLI subprocess |
17
- | `vercel-ai` | `ai` + `@ai-sdk/openai-compatible` | API-based |
13
+ `zod` is the only required peer dependency. Backend SDKs are **optional** — install only what you use:
14
+
15
+ | Backend | Peer dependency | Required | Type |
16
+ |---|---|---|---|
17
+ | `copilot` | `@github/copilot-sdk` ^0.1.22 | optional | CLI subprocess |
18
+ | `claude` | `@anthropic-ai/claude-agent-sdk` >=0.2.0 | optional | CLI subprocess |
19
+ | `vercel-ai` | `ai` >=4.0.0 + `@ai-sdk/openai-compatible` >=2.0.0 | optional | API-based |
18
20
 
19
21
  Install only the backend you need:
20
22
 
@@ -221,6 +223,23 @@ const service = createCopilotService({
221
223
  cliPath: "/path/to/copilot", // optional custom CLI path
222
224
  workingDirectory: process.cwd(),
223
225
  githubToken: "ghp_...", // optional, alternative to useLoggedInUser
226
+ cliArgs: ["--allow-all"], // extra CLI flags for the subprocess
227
+ });
228
+ ```
229
+
230
+ **System requirements:** `@github/copilot-sdk` includes a native binary that requires glibc. Alpine Linux (musl) is not supported — use `node:20-bookworm-slim` or similar glibc-based images.
231
+
232
+ **Headless defaults:** When `supervisor.onPermission` or `supervisor.onAskUser` are not provided, the Copilot backend auto-approves permission requests and auto-answers user questions to prevent the SDK from hanging in headless mode.
233
+
234
+ **System prompt mode:** By default, `systemPrompt` is appended to the Copilot CLI's built-in prompt (`mode: "append"`). Set `systemMessageMode: "replace"` in `AgentConfig` to fully replace it (note: this removes built-in tool instructions).
235
+
236
+ **Available tools filter:** Use `availableTools` in `AgentConfig` to restrict which Copilot built-in tools are available:
237
+
238
+ ```typescript
239
+ const agent = service.createAgent({
240
+ systemPrompt: "Research assistant",
241
+ tools: [],
242
+ availableTools: ["web_search", "web_fetch"], // only these built-in tools
224
243
  });
225
244
  ```
226
245
 
@@ -297,6 +316,18 @@ import { createClaudeService } from "@witqq/agent-sdk/claude";
297
316
  import { createVercelAIService } from "@witqq/agent-sdk/vercel-ai";
298
317
  ```
299
318
 
319
+ ## Model Names
320
+
321
+ `AgentConfig.model` accepts both full model IDs and short names:
322
+
323
+ | Backend | Full ID example | Short name |
324
+ |---|---|---|
325
+ | Copilot | `gpt-4o` | (same) |
326
+ | Claude | `claude-sonnet-4-5-20250514` | `sonnet` |
327
+ | Vercel AI | `anthropic/claude-sonnet-4-5` | (provider-specific) |
328
+
329
+ Use `service.listModels()` to get available model IDs for each backend.
330
+
300
331
  ## Build
301
332
 
302
333
  ```bash
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/types.ts","../../src/errors.ts","../../src/base-agent.ts","../../src/utils/schema.ts","../../src/backends/claude.ts"],"names":[],"mappings":"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","file":"claude.cjs","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// ─── Agent Events (Streaming) ──────────────────────────────────\n\n/** Events emitted during streaming agent execution */\nexport type AgentEvent =\n | { type: \"text_delta\"; text: string }\n | { type: \"tool_call_start\"; toolName: string; args: JSONValue }\n | { type: \"tool_call_end\"; 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 }\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}\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?: { promptTokens: number; completionTokens: number };\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 run(prompt: MessageContent, options?: RunOptions): Promise<AgentResult>;\n runWithContext(\n messages: Message[],\n options?: RunOptions,\n ): Promise<AgentResult>;\n runStructured<T>(\n prompt: MessageContent,\n schema: StructuredOutputConfig<T>,\n options?: RunOptions,\n ): Promise<AgentResult<T>>;\n stream(\n prompt: MessageContent,\n options?: RunOptions,\n ): AsyncIterable<AgentEvent>;\n abort(): void;\n getState(): AgentState;\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}\n\n/** Options for Claude CLI backend */\nexport interface ClaudeBackendOptions {\n cliPath?: string;\n workingDirectory?: string;\n maxTurns?: number;\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} 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 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 return await this.executeRun(messages, options, ac.signal);\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 return await this.executeRun(messages, options, ac.signal);\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 return await this.executeRunStructured(\n messages,\n schema,\n options,\n ac.signal,\n );\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 yield* this.executeStream(messages, options, ac.signal);\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 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 // ─── 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 * Uses zod's built-in jsonSchema() if available, falls back to _def extraction. */\nexport function zodToJsonSchema(schema: z.ZodType): Record<string, unknown> {\n // Try zod's built-in jsonSchema() method (available in zod v3.24+)\n const schemaAny = schema as unknown as Record<string, unknown>;\n if (\"jsonSchema\" in schema && typeof schemaAny.jsonSchema === \"function\") {\n return (schemaAny.jsonSchema as () => Record<string, unknown>)();\n }\n\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 ClaudeBackendOptions,\n ModelInfo,\n ValidationResult,\n JSONValue,\n PermissionRequest as UnifiedPermissionRequest,\n PermissionDecision,\n PermissionScope,\n} from \"../types.js\";\nimport { getTextContent } from \"../types.js\";\nimport { BaseAgent } from \"../base-agent.js\";\nimport { DisposedError, SubprocessError, AbortError } from \"../errors.js\";\nimport { zodToJsonSchema } from \"../utils/schema.js\";\n\nexport type { ClaudeBackendOptions } from \"../types.js\";\n\n// ─── Local Type Definitions (matching @anthropic-ai/claude-agent-sdk shapes) ──\n// Avoids requiring the SDK to be installed at compile time.\n\n/** @internal Claude SDK PermissionUpdate destination */\ntype PermissionUpdateDestination =\n | \"userSettings\"\n | \"projectSettings\"\n | \"localSettings\"\n | \"session\"\n | \"cliArg\";\n\n/** @internal Claude SDK PermissionUpdate */\ninterface SDKPermissionUpdate {\n type: \"addRules\" | \"replaceRules\" | \"removeRules\" | \"setMode\" | \"addDirectories\" | \"removeDirectories\";\n destination: PermissionUpdateDestination;\n [key: string]: unknown;\n}\n\n/** @internal Claude SDK PermissionResult */\ntype SDKPermissionResult =\n | {\n behavior: \"allow\";\n updatedInput?: Record<string, unknown>;\n updatedPermissions?: SDKPermissionUpdate[];\n toolUseID?: string;\n }\n | {\n behavior: \"deny\";\n message: string;\n interrupt?: boolean;\n toolUseID?: string;\n };\n\n/** @internal Claude SDK CanUseTool callback */\ntype SDKCanUseTool = (\n toolName: string,\n input: Record<string, unknown>,\n options: {\n signal: AbortSignal;\n suggestions?: SDKPermissionUpdate[];\n blockedPath?: string;\n decisionReason?: string;\n toolUseID: string;\n agentID?: string;\n },\n) => Promise<SDKPermissionResult>;\n\n/** @internal Claude SDK Options */\ninterface SDKOptions {\n abortController?: AbortController;\n allowedTools?: string[];\n canUseTool?: SDKCanUseTool;\n cwd?: string;\n disallowedTools?: string[];\n includePartialMessages?: boolean;\n maxTurns?: number;\n model?: string;\n outputFormat?: { type: \"json_schema\"; schema: Record<string, unknown> };\n pathToClaudeCodeExecutable?: string;\n permissionMode?: string;\n persistSession?: boolean;\n systemPrompt?:\n | string\n | { type: \"preset\"; preset: \"claude_code\"; append?: string };\n mcpServers?: Record<string, unknown>;\n}\n\n/** @internal Claude SDK ModelInfo */\ninterface SDKModelInfo {\n value: string;\n displayName: string;\n description: string;\n}\n\n/** @internal Claude SDK ResultSuccess */\ninterface SDKResultSuccess {\n type: \"result\";\n subtype: \"success\";\n result: string;\n structured_output?: unknown;\n num_turns: number;\n total_cost_usd: number;\n usage: Record<string, number>;\n modelUsage: Record<string, { inputTokens: number; outputTokens: number }>;\n session_id: string;\n}\n\n/** @internal Claude SDK ResultError */\ninterface SDKResultError {\n type: \"result\";\n subtype: string;\n errors: string[];\n is_error: boolean;\n usage: Record<string, number>;\n modelUsage: Record<string, { inputTokens: number; outputTokens: number }>;\n session_id: string;\n}\n\n/** @internal Claude SDK message union */\ninterface SDKMessage {\n type: string;\n subtype?: string;\n [key: string]: unknown;\n}\n\n/** @internal Claude SDK Query interface — AsyncGenerator<SDKMessage> with control methods */\ninterface SDKQuery extends AsyncGenerator<SDKMessage, void> {\n close(): void;\n interrupt(): Promise<void>;\n supportedModels(): Promise<SDKModelInfo[]>;\n}\n\n/** @internal SDK's MCP tool definition */\ninterface SDKMcpToolDefinition {\n name: string;\n description: string;\n inputSchema: Record<string, unknown>;\n handler: (args: Record<string, unknown>, extra: unknown) => Promise<{ content: Array<{ type: string; text: string }> }>;\n}\n\n/** @internal SDK server config */\ninterface SDKMcpServerConfigWithInstance {\n type: \"sdk\";\n name: string;\n instance: unknown;\n}\n\n/** @internal */\ntype SDKModule = {\n query: (params: { prompt: string; options?: SDKOptions }) => SDKQuery;\n createSdkMcpServer: (options: {\n name: string;\n version?: string;\n tools?: SDKMcpToolDefinition[];\n }) => SDKMcpServerConfigWithInstance;\n tool: (\n name: string,\n description: string,\n inputSchema: Record<string, unknown>,\n handler: (args: Record<string, unknown>, extra: unknown) => Promise<{ content: Array<{ type: string; text: string }> }>,\n ) => SDKMcpToolDefinition;\n};\n\n// ─── Dynamic SDK Loader ─────────────────────────────────────────\n\nlet sdkModule: SDKModule | 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(\"@anthropic-ai/claude-agent-sdk\")) as SDKModule;\n return sdkModule!;\n } catch {\n throw new SubprocessError(\n \"@anthropic-ai/claude-agent-sdk is not installed. Install it: npm install @anthropic-ai/claude-agent-sdk\",\n );\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: reset injected SDK */\nexport function _resetSDK(): void {\n sdkModule = null;\n}\n\n// ─── Known Models ───────────────────────────────────────────────\n\nconst CLAUDE_KNOWN_MODELS: Array<{ id: string; name: string }> = [\n { id: \"claude-sonnet-4-5-20250514\", name: \"Claude Sonnet 4.5\" },\n { id: \"claude-haiku-3-5-20241022\", name: \"Claude 3.5 Haiku\" },\n { id: \"claude-opus-4-20250514\", name: \"Claude Opus 4\" },\n { id: \"claude-sonnet-4-20250514\", name: \"Claude Sonnet 4\" },\n];\n\n// ─── Tool Mapping ───────────────────────────────────────────────\n\nfunction buildMcpServer(\n sdk: SDKModule,\n tools: ToolDefinition[],\n toolResultCapture?: Map<string, JSONValue>,\n): SDKMcpServerConfigWithInstance | undefined {\n if (tools.length === 0) return undefined;\n\n const mcpTools = tools.map((tool) =>\n sdk.tool(\n tool.name,\n tool.description ?? \"\",\n zodToJsonSchema(tool.parameters) as Record<string, unknown>,\n async (args: Record<string, unknown>) => {\n const result = await tool.execute(args);\n // Capture result for AgentResult.toolCalls\n if (toolResultCapture) {\n toolResultCapture.set(tool.name, result as JSONValue);\n }\n return {\n content: [\n {\n type: \"text\" as const,\n text: typeof result === \"string\" ? result : JSON.stringify(result),\n },\n ],\n };\n },\n ),\n );\n\n return sdk.createSdkMcpServer({\n name: \"agent-sdk-tools\",\n version: \"1.0.0\",\n tools: mcpTools,\n });\n}\n\n// ─── Permission Mapping ─────────────────────────────────────────\n\n/** Map our PermissionScope to Claude SDK's PermissionUpdateDestination */\nfunction scopeToDestination(scope: PermissionScope): PermissionUpdateDestination {\n switch (scope) {\n case \"once\":\n return \"session\";\n case \"session\":\n return \"session\";\n case \"project\":\n return \"projectSettings\";\n case \"always\":\n return \"userSettings\";\n }\n}\n\n/** Map Claude SDK suggestions to our PermissionScope */\nfunction destinationToScope(dest: PermissionUpdateDestination): PermissionScope {\n switch (dest) {\n case \"session\":\n case \"cliArg\":\n return \"session\";\n case \"projectSettings\":\n case \"localSettings\":\n return \"project\";\n case \"userSettings\":\n return \"always\";\n }\n}\n\n/** Extract best suggestedScope from SDK's PermissionUpdate[] */\nfunction extractSuggestedScope(\n suggestions?: SDKPermissionUpdate[],\n): PermissionScope | undefined {\n if (!suggestions || suggestions.length === 0) return undefined;\n // Use the destination of the first suggestion as the scope hint\n return destinationToScope(suggestions[0].destination);\n}\n\nfunction buildCanUseTool(\n config: AgentConfig,\n): SDKCanUseTool | undefined {\n const onPermission = config.supervisor?.onPermission;\n if (!onPermission) return undefined;\n\n const permissionStore = config.permissionStore;\n\n return async (\n toolName: string,\n input: Record<string, unknown>,\n options,\n ): Promise<SDKPermissionResult> => {\n // Check store first — if already approved, skip callback\n if (permissionStore && await permissionStore.isApproved(toolName)) {\n return {\n behavior: \"allow\",\n toolUseID: options.toolUseID,\n };\n }\n\n const unifiedRequest: UnifiedPermissionRequest = {\n toolName,\n toolArgs: input,\n suggestedScope: extractSuggestedScope(options.suggestions),\n rawSDKRequest: { toolName, input, ...options },\n };\n\n const decision: PermissionDecision = await onPermission(\n unifiedRequest,\n options.signal,\n );\n\n if (decision.allowed) {\n // Persist approval to store\n if (permissionStore && decision.scope) {\n await permissionStore.approve(toolName, decision.scope);\n }\n\n const result: SDKPermissionResult = {\n behavior: \"allow\",\n toolUseID: options.toolUseID,\n };\n if (decision.modifiedInput) {\n (result as { updatedInput?: Record<string, unknown> }).updatedInput =\n decision.modifiedInput;\n }\n // Map scope decision to SDK's updatedPermissions\n if (decision.scope && decision.scope !== \"once\" && options.suggestions) {\n (result as { updatedPermissions?: SDKPermissionUpdate[] }).updatedPermissions =\n options.suggestions.map((s) => ({\n ...s,\n destination: scopeToDestination(decision.scope!),\n }));\n }\n return result;\n }\n\n return {\n behavior: \"deny\",\n message: decision.reason ?? \"Permission denied\",\n toolUseID: options.toolUseID,\n };\n };\n}\n\n// ─── Usage Aggregation Helper ───────────────────────────────────\n\nfunction aggregateUsage(\n modelUsage?: Record<string, { inputTokens: number; outputTokens: number }>,\n): { promptTokens: number; completionTokens: number } {\n let promptTokens = 0;\n let completionTokens = 0;\n for (const u of Object.values(modelUsage ?? {})) {\n promptTokens += u.inputTokens ?? 0;\n completionTokens += u.outputTokens ?? 0;\n }\n return { promptTokens, completionTokens };\n}\n\n// ─── Event Mapping ──────────────────────────────────────────────\n\nfunction mapSDKMessage(msg: SDKMessage, thinkingBlockIndices?: Set<number>): AgentEvent | AgentEvent[] | null {\n switch (msg.type) {\n case \"assistant\": {\n // Full assistant message — contains BetaMessage with content blocks\n const betaMessage = msg.message as {\n content?: Array<{\n type: string;\n text?: string;\n name?: string;\n input?: unknown;\n id?: string;\n }>;\n } | undefined;\n if (!betaMessage?.content) return null;\n\n const events: AgentEvent[] = [];\n\n // Extract text content from the message\n const textParts = betaMessage.content\n .filter((b) => b.type === \"text\" && b.text)\n .map((b) => b.text!)\n .join(\"\");\n\n if (textParts) {\n events.push({ type: \"text_delta\", text: textParts });\n }\n\n // Emit tool_call_start for each tool_use block\n for (const block of betaMessage.content) {\n if (block.type === \"tool_use\") {\n events.push({\n type: \"tool_call_start\",\n toolName: block.name ?? \"unknown\",\n args: (block.input as JSONValue) ?? {},\n });\n }\n }\n\n return events.length > 0 ? events : null;\n }\n\n case \"user\": {\n // User messages with tool_use_result indicate tool completion\n const toolResult = msg.tool_use_result as JSONValue | undefined;\n // Extract tool name from the message context if available\n if (toolResult !== undefined) {\n // The user message after tool execution — emit tool_call_end\n // tool_name may not be in user messages, but we can infer from context\n return null; // Handled via tool_use_summary below\n }\n return null;\n }\n\n case \"tool_use_summary\": {\n // Emitted after tool execution — contains summary of tool results\n const summary = msg.summary as string | undefined;\n const toolName = (msg.tool_name as string | undefined) ?? \"unknown\";\n // Emit as tool_call_end with summary as result\n if (summary) {\n return {\n type: \"tool_call_end\",\n toolName,\n result: summary as JSONValue,\n };\n }\n return null;\n }\n\n case \"stream_event\": {\n // Partial streaming events — BetaRawMessageStreamEvent\n const event = msg.event as {\n type: string;\n delta?: { type: string; text?: string };\n content_block?: { type: string; name?: string; id?: string };\n index?: number;\n } | undefined;\n if (!event) return null;\n\n if (\n event.type === \"content_block_delta\" &&\n event.delta?.type === \"text_delta\" &&\n event.delta.text\n ) {\n return { type: \"text_delta\", text: event.delta.text };\n }\n\n if (event.type === \"content_block_start\" && event.content_block?.type === \"thinking\") {\n if (thinkingBlockIndices && event.index !== undefined) {\n thinkingBlockIndices.add(event.index);\n }\n return { type: \"thinking_start\" };\n }\n\n if (event.type === \"content_block_stop\" && event.index !== undefined && thinkingBlockIndices?.has(event.index)) {\n thinkingBlockIndices.delete(event.index);\n return { type: \"thinking_end\" };\n }\n\n return null;\n }\n\n case \"tool_progress\": {\n const toolName = msg.tool_name as string | undefined;\n return toolName\n ? { type: \"tool_call_start\", toolName, args: {} }\n : null;\n }\n\n case \"result\": {\n if (msg.subtype === \"success\") {\n const r = msg as unknown as SDKResultSuccess;\n return {\n type: \"usage_update\",\n ...aggregateUsage(r.modelUsage),\n };\n }\n if (msg.is_error) {\n const r = msg as unknown as SDKResultError;\n return {\n type: \"error\",\n error: r.errors?.join(\"; \") ?? \"Unknown error\",\n recoverable: false,\n };\n }\n return null;\n }\n\n default:\n return null;\n }\n}\n\n// ─── ClaudeAgent ────────────────────────────────────────────────\n\nclass ClaudeAgent extends BaseAgent {\n private readonly options: ClaudeBackendOptions;\n private readonly tools: ToolDefinition[];\n private readonly canUseTool: SDKCanUseTool | undefined;\n\n constructor(config: AgentConfig, options: ClaudeBackendOptions) {\n super(config);\n this.options = options;\n this.tools = config.tools;\n this.canUseTool = buildCanUseTool(config);\n\n // Warn if onAskUser is set — Claude CLI SDK doesn't support user interaction hooks\n if (config.supervisor?.onAskUser) {\n console.warn(\n \"[agent-sdk/claude] supervisor.onAskUser is not supported by the Claude CLI backend. \" +\n \"User interaction requests from the model will not be forwarded.\",\n );\n }\n }\n\n private buildQueryOptions(signal: AbortSignal): SDKOptions {\n const ac = new AbortController();\n // Link external signal → SDK's abort controller\n signal.addEventListener(\"abort\", () => ac.abort(), { once: true });\n\n const opts: SDKOptions = {\n abortController: ac,\n model: this.config.model,\n maxTurns: this.options.maxTurns,\n cwd: this.options.workingDirectory,\n pathToClaudeCodeExecutable: this.options.cliPath,\n persistSession: false,\n includePartialMessages: true,\n canUseTool: this.canUseTool,\n };\n\n if (this.config.systemPrompt) {\n opts.systemPrompt = this.config.systemPrompt;\n }\n\n return opts;\n }\n\n private async buildMcpConfig(\n opts: SDKOptions,\n toolResultCapture?: Map<string, JSONValue>,\n ): Promise<SDKOptions> {\n if (this.tools.length === 0) return opts;\n\n const sdk = await loadSDK();\n const mcpServer = buildMcpServer(sdk, this.tools, toolResultCapture);\n if (mcpServer) {\n opts.mcpServers = {\n \"agent-sdk-tools\": mcpServer,\n };\n }\n return opts;\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 prompt = extractLastUserPrompt(messages);\n let opts = this.buildQueryOptions(signal);\n const toolResultCapture = new Map<string, JSONValue>();\n opts = await this.buildMcpConfig(opts, toolResultCapture);\n\n const q = sdk.query({ prompt, options: opts });\n const toolCalls: AgentResult[\"toolCalls\"] = [];\n let output: string | null = null;\n let usage: AgentResult[\"usage\"];\n\n try {\n for await (const msg of q) {\n // Collect tool calls from assistant messages\n if (msg.type === \"assistant\") {\n const betaMessage = msg.message as {\n content?: Array<{\n type: string;\n text?: string;\n name?: string;\n input?: unknown;\n id?: string;\n }>;\n } | undefined;\n if (betaMessage?.content) {\n for (const block of betaMessage.content) {\n if (block.type === \"tool_use\") {\n const toolName = block.name ?? \"unknown\";\n toolCalls.push({\n toolName,\n args: (block.input as JSONValue) ?? {},\n result: toolResultCapture.get(toolName) ?? null,\n approved: true,\n });\n }\n }\n }\n }\n\n // Back-fill results from capture map for previously added tool calls\n if (msg.type === \"tool_use_summary\" || msg.type === \"result\") {\n for (const tc of toolCalls) {\n if (tc.result === null) {\n const captured = toolResultCapture.get(tc.toolName);\n if (captured !== undefined) tc.result = captured;\n }\n }\n }\n\n // Capture result\n if (msg.type === \"result\") {\n if (msg.subtype === \"success\") {\n const r = msg as unknown as SDKResultSuccess;\n output = r.result;\n usage = aggregateUsage(r.modelUsage);\n } else if (msg.is_error) {\n const r = msg as unknown as SDKResultError;\n throw new Error(\n `Claude query failed: ${r.errors?.join(\"; \") ?? \"unknown error\"}`,\n );\n }\n }\n }\n } catch (e) {\n if (signal.aborted) throw new AbortError();\n throw e;\n }\n\n return {\n output,\n structuredOutput: undefined as AgentResult[\"structuredOutput\"],\n toolCalls,\n messages: [\n ...messages,\n ...(output !== null\n ? [{ role: \"assistant\" as const, content: output }]\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 prompt = extractLastUserPrompt(messages);\n let opts = this.buildQueryOptions(signal);\n opts = await this.buildMcpConfig(opts);\n\n // Claude SDK has native structured output via outputFormat\n const jsonSchema = zodToJsonSchema(schema.schema);\n opts.outputFormat = {\n type: \"json_schema\",\n schema: jsonSchema as Record<string, unknown>,\n };\n\n const q = sdk.query({ prompt, options: opts });\n const toolCalls: AgentResult[\"toolCalls\"] = [];\n let output: string | null = null;\n let structuredOutput: T | undefined;\n let usage: AgentResult[\"usage\"];\n\n try {\n for await (const msg of q) {\n if (msg.type === \"result\" && msg.subtype === \"success\") {\n const r = msg as unknown as SDKResultSuccess;\n output = r.result;\n\n // Claude SDK returns parsed structured_output when using outputFormat\n if (r.structured_output !== undefined) {\n try {\n structuredOutput = schema.schema.parse(r.structured_output);\n } catch {\n // Fallback: try parsing result string\n try {\n structuredOutput = schema.schema.parse(JSON.parse(r.result));\n } catch {\n // Leave undefined\n }\n }\n } else if (r.result) {\n // Fallback: parse from result string\n try {\n const jsonMatch = r.result.match(/```(?:json)?\\s*([\\s\\S]*?)```/);\n const raw = jsonMatch ? jsonMatch[1]!.trim() : r.result.trim();\n structuredOutput = schema.schema.parse(JSON.parse(raw));\n } catch {\n // Leave undefined\n }\n }\n\n usage = aggregateUsage(r.modelUsage);\n } else if (msg.type === \"result\" && msg.is_error) {\n const r = msg as unknown as SDKResultError;\n throw new Error(\n `Claude query failed: ${r.errors?.join(\"; \") ?? \"unknown error\"}`,\n );\n }\n }\n } catch (e) {\n if (signal.aborted) throw new AbortError();\n throw e;\n }\n\n return {\n output,\n structuredOutput: structuredOutput as AgentResult<T>[\"structuredOutput\"],\n toolCalls,\n messages: [\n ...messages,\n ...(output !== null\n ? [{ role: \"assistant\" as const, content: output }]\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 prompt = extractLastUserPrompt(messages);\n let opts = this.buildQueryOptions(signal);\n opts = await this.buildMcpConfig(opts);\n\n const q = sdk.query({ prompt, options: opts });\n const thinkingBlockIndices = new Set<number>();\n\n try {\n for await (const msg of q) {\n if (signal.aborted) throw new AbortError();\n\n const event = mapSDKMessage(msg, thinkingBlockIndices);\n if (event) {\n if (Array.isArray(event)) {\n for (const e of event) yield e;\n } else {\n yield event;\n }\n }\n\n // Emit done event on result\n if (msg.type === \"result\" && msg.subtype === \"success\") {\n const r = msg as unknown as SDKResultSuccess;\n yield { type: \"done\", finalOutput: r.result };\n }\n }\n } catch (e) {\n if (signal.aborted) throw new AbortError();\n throw e;\n }\n }\n\n override dispose(): void {\n super.dispose();\n }\n}\n\n// ─── Helpers ────────────────────────────────────────────────────\n\nfunction extractLastUserPrompt(messages: Message[]): string {\n for (let i = messages.length - 1; i >= 0; i--) {\n const msg = messages[i];\n if (msg.role === \"user\") {\n return getTextContent(msg.content);\n }\n }\n return \"\";\n}\n\n// ─── ClaudeAgentService ─────────────────────────────────────────\n\nclass ClaudeAgentService implements IAgentService {\n readonly name = \"claude\";\n private disposed = false;\n private readonly options: ClaudeBackendOptions;\n private cachedModels: ModelInfo[] | null = null;\n\n constructor(options: ClaudeBackendOptions) {\n this.options = options;\n }\n\n createAgent(config: AgentConfig): IAgent {\n if (this.disposed) throw new DisposedError(\"ClaudeAgentService\");\n return new ClaudeAgent(config, this.options);\n }\n\n async listModels(): Promise<ModelInfo[]> {\n if (this.disposed) throw new DisposedError(\"ClaudeAgentService\");\n if (this.cachedModels) return this.cachedModels;\n\n // Return well-known Claude models without spawning a query subprocess.\n // Claude SDK's supportedModels() requires a live query which costs API credits.\n // The static list covers all publicly available Claude models.\n this.cachedModels = CLAUDE_KNOWN_MODELS.map((m) => ({\n id: m.id,\n name: m.name,\n provider: \"claude\",\n }));\n return this.cachedModels;\n }\n\n async validate(): Promise<ValidationResult> {\n if (this.disposed) throw new DisposedError(\"ClaudeAgentService\");\n\n const errors: string[] = [];\n try {\n await loadSDK();\n } catch (e) {\n errors.push(\n e instanceof Error ? e.message : String(e),\n );\n return { valid: false, errors };\n }\n\n // Verify CLI is accessible by attempting a minimal query\n try {\n const sdk = await loadSDK();\n const q = sdk.query({\n prompt: \"echo test\",\n options: {\n model: CLAUDE_KNOWN_MODELS[0].id,\n pathToClaudeCodeExecutable: this.options.cliPath,\n cwd: this.options.workingDirectory,\n persistSession: false,\n maxTurns: 1,\n permissionMode: \"plan\",\n },\n });\n // Wait for first message (auth check)\n const first = await q.next();\n q.close();\n if (first.done) {\n errors.push(\"Claude CLI returned no messages — may not be authenticated.\");\n }\n } catch (e) {\n errors.push(\n `Failed to connect to Claude CLI: ${e instanceof Error ? e.message : String(e)}`,\n );\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 this.cachedModels = null;\n }\n}\n\n// ─── Factory ────────────────────────────────────────────────────\n\n/** Create Claude CLI backend service. */\nexport function createClaudeService(\n options: ClaudeBackendOptions,\n): IAgentService {\n return new ClaudeAgentService(options);\n}\n"]}
1
+ {"version":3,"sources":["../../src/types.ts","../../src/errors.ts","../../src/base-agent.ts","../../src/utils/schema.ts","../../src/backends/claude.ts"],"names":[],"mappings":"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","file":"claude.cjs","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// ─── Agent Events (Streaming) ──────────────────────────────────\n\n/** Events emitted during streaming agent execution */\nexport type AgentEvent =\n | { type: \"text_delta\"; text: string }\n | { type: \"tool_call_start\"; toolName: string; args: JSONValue }\n | { type: \"tool_call_end\"; 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 }\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}\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?: { promptTokens: number; completionTokens: number };\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 run(prompt: MessageContent, options?: RunOptions): Promise<AgentResult>;\n runWithContext(\n messages: Message[],\n options?: RunOptions,\n ): Promise<AgentResult>;\n runStructured<T>(\n prompt: MessageContent,\n schema: StructuredOutputConfig<T>,\n options?: RunOptions,\n ): Promise<AgentResult<T>>;\n stream(\n prompt: MessageContent,\n options?: RunOptions,\n ): AsyncIterable<AgentEvent>;\n abort(): void;\n getState(): AgentState;\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}\n\n/** Options for Claude CLI backend */\nexport interface ClaudeBackendOptions {\n cliPath?: string;\n workingDirectory?: string;\n maxTurns?: number;\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} 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 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 return await this.executeRun(messages, options, ac.signal);\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 return await this.executeRun(messages, options, ac.signal);\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 return await this.executeRunStructured(\n messages,\n schema,\n options,\n ac.signal,\n );\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 yield* this.executeStream(messages, options, ac.signal);\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 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 // ─── 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 * Uses zod's built-in jsonSchema() if available, falls back to _def extraction. */\nexport function zodToJsonSchema(schema: z.ZodType): Record<string, unknown> {\n // Try zod's built-in jsonSchema() method (available in zod v3.24+)\n const schemaAny = schema as unknown as Record<string, unknown>;\n if (\"jsonSchema\" in schema && typeof schemaAny.jsonSchema === \"function\") {\n return (schemaAny.jsonSchema as () => Record<string, unknown>)();\n }\n\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 ClaudeBackendOptions,\n ModelInfo,\n ValidationResult,\n JSONValue,\n PermissionRequest as UnifiedPermissionRequest,\n PermissionDecision,\n PermissionScope,\n} from \"../types.js\";\nimport { getTextContent } from \"../types.js\";\nimport { BaseAgent } from \"../base-agent.js\";\nimport { DisposedError, SubprocessError, AbortError } from \"../errors.js\";\nimport { zodToJsonSchema } from \"../utils/schema.js\";\n\nexport type { ClaudeBackendOptions } from \"../types.js\";\n\n// ─── Local Type Definitions (matching @anthropic-ai/claude-agent-sdk shapes) ──\n// Avoids requiring the SDK to be installed at compile time.\n\n/** @internal Claude SDK PermissionUpdate destination */\ntype PermissionUpdateDestination =\n | \"userSettings\"\n | \"projectSettings\"\n | \"localSettings\"\n | \"session\"\n | \"cliArg\";\n\n/** @internal Claude SDK PermissionUpdate */\ninterface SDKPermissionUpdate {\n type: \"addRules\" | \"replaceRules\" | \"removeRules\" | \"setMode\" | \"addDirectories\" | \"removeDirectories\";\n destination: PermissionUpdateDestination;\n [key: string]: unknown;\n}\n\n/** @internal Claude SDK PermissionResult */\ntype SDKPermissionResult =\n | {\n behavior: \"allow\";\n updatedInput?: Record<string, unknown>;\n updatedPermissions?: SDKPermissionUpdate[];\n toolUseID?: string;\n }\n | {\n behavior: \"deny\";\n message: string;\n interrupt?: boolean;\n toolUseID?: string;\n };\n\n/** @internal Claude SDK CanUseTool callback */\ntype SDKCanUseTool = (\n toolName: string,\n input: Record<string, unknown>,\n options: {\n signal: AbortSignal;\n suggestions?: SDKPermissionUpdate[];\n blockedPath?: string;\n decisionReason?: string;\n toolUseID: string;\n agentID?: string;\n },\n) => Promise<SDKPermissionResult>;\n\n/** @internal Claude SDK Options */\ninterface SDKOptions {\n abortController?: AbortController;\n allowedTools?: string[];\n canUseTool?: SDKCanUseTool;\n cwd?: string;\n disallowedTools?: string[];\n includePartialMessages?: boolean;\n maxTurns?: number;\n model?: string;\n outputFormat?: { type: \"json_schema\"; schema: Record<string, unknown> };\n pathToClaudeCodeExecutable?: string;\n permissionMode?: string;\n persistSession?: boolean;\n systemPrompt?:\n | string\n | { type: \"preset\"; preset: \"claude_code\"; append?: string };\n mcpServers?: Record<string, unknown>;\n}\n\n/** @internal Claude SDK ModelInfo */\ninterface SDKModelInfo {\n value: string;\n displayName: string;\n description: string;\n}\n\n/** @internal Claude SDK ResultSuccess */\ninterface SDKResultSuccess {\n type: \"result\";\n subtype: \"success\";\n result: string;\n structured_output?: unknown;\n num_turns: number;\n total_cost_usd: number;\n usage: Record<string, number>;\n modelUsage: Record<string, { inputTokens: number; outputTokens: number }>;\n session_id: string;\n}\n\n/** @internal Claude SDK ResultError */\ninterface SDKResultError {\n type: \"result\";\n subtype: string;\n errors: string[];\n is_error: boolean;\n usage: Record<string, number>;\n modelUsage: Record<string, { inputTokens: number; outputTokens: number }>;\n session_id: string;\n}\n\n/** @internal Claude SDK message union */\ninterface SDKMessage {\n type: string;\n subtype?: string;\n [key: string]: unknown;\n}\n\n/** @internal Claude SDK Query interface — AsyncGenerator<SDKMessage> with control methods */\ninterface SDKQuery extends AsyncGenerator<SDKMessage, void> {\n close(): void;\n interrupt(): Promise<void>;\n supportedModels(): Promise<SDKModelInfo[]>;\n}\n\n/** @internal SDK's MCP tool definition */\ninterface SDKMcpToolDefinition {\n name: string;\n description: string;\n inputSchema: Record<string, unknown>;\n handler: (args: Record<string, unknown>, extra: unknown) => Promise<{ content: Array<{ type: string; text: string }> }>;\n}\n\n/** @internal SDK server config */\ninterface SDKMcpServerConfigWithInstance {\n type: \"sdk\";\n name: string;\n instance: unknown;\n}\n\n/** @internal */\ntype SDKModule = {\n query: (params: { prompt: string; options?: SDKOptions }) => SDKQuery;\n createSdkMcpServer: (options: {\n name: string;\n version?: string;\n tools?: SDKMcpToolDefinition[];\n }) => SDKMcpServerConfigWithInstance;\n tool: (\n name: string,\n description: string,\n inputSchema: Record<string, unknown>,\n handler: (args: Record<string, unknown>, extra: unknown) => Promise<{ content: Array<{ type: string; text: string }> }>,\n ) => SDKMcpToolDefinition;\n};\n\n// ─── Dynamic SDK Loader ─────────────────────────────────────────\n\nlet sdkModule: SDKModule | 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(\"@anthropic-ai/claude-agent-sdk\")) as SDKModule;\n return sdkModule!;\n } catch {\n throw new SubprocessError(\n \"@anthropic-ai/claude-agent-sdk is not installed. Install it: npm install @anthropic-ai/claude-agent-sdk\",\n );\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: reset injected SDK */\nexport function _resetSDK(): void {\n sdkModule = null;\n}\n\n// ─── Known Models ───────────────────────────────────────────────\n\nconst CLAUDE_KNOWN_MODELS: Array<{ id: string; name: string }> = [\n { id: \"claude-sonnet-4-5-20250514\", name: \"Claude Sonnet 4.5\" },\n { id: \"claude-haiku-3-5-20241022\", name: \"Claude 3.5 Haiku\" },\n { id: \"claude-opus-4-20250514\", name: \"Claude Opus 4\" },\n { id: \"claude-sonnet-4-20250514\", name: \"Claude Sonnet 4\" },\n];\n\n// ─── Tool Mapping ───────────────────────────────────────────────\n\nfunction buildMcpServer(\n sdk: SDKModule,\n tools: ToolDefinition[],\n toolResultCapture?: Map<string, JSONValue>,\n): SDKMcpServerConfigWithInstance | undefined {\n if (tools.length === 0) return undefined;\n\n const mcpTools = tools.map((tool) =>\n sdk.tool(\n tool.name,\n tool.description ?? \"\",\n zodToJsonSchema(tool.parameters) as Record<string, unknown>,\n async (args: Record<string, unknown>) => {\n const result = await tool.execute(args);\n // Capture result for AgentResult.toolCalls\n if (toolResultCapture) {\n toolResultCapture.set(tool.name, result as JSONValue);\n }\n return {\n content: [\n {\n type: \"text\" as const,\n text: typeof result === \"string\" ? result : JSON.stringify(result),\n },\n ],\n };\n },\n ),\n );\n\n return sdk.createSdkMcpServer({\n name: \"agent-sdk-tools\",\n version: \"1.0.0\",\n tools: mcpTools,\n });\n}\n\n// ─── Permission Mapping ─────────────────────────────────────────\n\n/** Map our PermissionScope to Claude SDK's PermissionUpdateDestination */\nfunction scopeToDestination(scope: PermissionScope): PermissionUpdateDestination {\n switch (scope) {\n case \"once\":\n return \"session\";\n case \"session\":\n return \"session\";\n case \"project\":\n return \"projectSettings\";\n case \"always\":\n return \"userSettings\";\n }\n}\n\n/** Map Claude SDK suggestions to our PermissionScope */\nfunction destinationToScope(dest: PermissionUpdateDestination): PermissionScope {\n switch (dest) {\n case \"session\":\n case \"cliArg\":\n return \"session\";\n case \"projectSettings\":\n case \"localSettings\":\n return \"project\";\n case \"userSettings\":\n return \"always\";\n }\n}\n\n/** Extract best suggestedScope from SDK's PermissionUpdate[] */\nfunction extractSuggestedScope(\n suggestions?: SDKPermissionUpdate[],\n): PermissionScope | undefined {\n if (!suggestions || suggestions.length === 0) return undefined;\n // Use the destination of the first suggestion as the scope hint\n return destinationToScope(suggestions[0].destination);\n}\n\nfunction buildCanUseTool(\n config: AgentConfig,\n): SDKCanUseTool | undefined {\n const onPermission = config.supervisor?.onPermission;\n if (!onPermission) return undefined;\n\n const permissionStore = config.permissionStore;\n\n return async (\n toolName: string,\n input: Record<string, unknown>,\n options,\n ): Promise<SDKPermissionResult> => {\n // Check store first — if already approved, skip callback\n if (permissionStore && await permissionStore.isApproved(toolName)) {\n return {\n behavior: \"allow\",\n toolUseID: options.toolUseID,\n };\n }\n\n const unifiedRequest: UnifiedPermissionRequest = {\n toolName,\n toolArgs: input,\n suggestedScope: extractSuggestedScope(options.suggestions),\n rawSDKRequest: { toolName, input, ...options },\n };\n\n const decision: PermissionDecision = await onPermission(\n unifiedRequest,\n options.signal,\n );\n\n if (decision.allowed) {\n // Persist approval to store\n if (permissionStore && decision.scope) {\n await permissionStore.approve(toolName, decision.scope);\n }\n\n const result: SDKPermissionResult = {\n behavior: \"allow\",\n toolUseID: options.toolUseID,\n };\n if (decision.modifiedInput) {\n (result as { updatedInput?: Record<string, unknown> }).updatedInput =\n decision.modifiedInput;\n }\n // Map scope decision to SDK's updatedPermissions\n if (decision.scope && decision.scope !== \"once\" && options.suggestions) {\n (result as { updatedPermissions?: SDKPermissionUpdate[] }).updatedPermissions =\n options.suggestions.map((s) => ({\n ...s,\n destination: scopeToDestination(decision.scope!),\n }));\n }\n return result;\n }\n\n return {\n behavior: \"deny\",\n message: decision.reason ?? \"Permission denied\",\n toolUseID: options.toolUseID,\n };\n };\n}\n\n// ─── Usage Aggregation Helper ───────────────────────────────────\n\nfunction aggregateUsage(\n modelUsage?: Record<string, { inputTokens: number; outputTokens: number }>,\n): { promptTokens: number; completionTokens: number } {\n let promptTokens = 0;\n let completionTokens = 0;\n for (const u of Object.values(modelUsage ?? {})) {\n promptTokens += u.inputTokens ?? 0;\n completionTokens += u.outputTokens ?? 0;\n }\n return { promptTokens, completionTokens };\n}\n\n// ─── Event Mapping ──────────────────────────────────────────────\n\nfunction mapSDKMessage(msg: SDKMessage, thinkingBlockIndices?: Set<number>): AgentEvent | AgentEvent[] | null {\n switch (msg.type) {\n case \"assistant\": {\n // Full assistant message — contains BetaMessage with content blocks\n const betaMessage = msg.message as {\n content?: Array<{\n type: string;\n text?: string;\n name?: string;\n input?: unknown;\n id?: string;\n }>;\n } | undefined;\n if (!betaMessage?.content) return null;\n\n const events: AgentEvent[] = [];\n\n // Extract text content from the message\n const textParts = betaMessage.content\n .filter((b) => b.type === \"text\" && b.text)\n .map((b) => b.text!)\n .join(\"\");\n\n if (textParts) {\n events.push({ type: \"text_delta\", text: textParts });\n }\n\n // Emit tool_call_start for each tool_use block\n for (const block of betaMessage.content) {\n if (block.type === \"tool_use\") {\n events.push({\n type: \"tool_call_start\",\n toolName: block.name ?? \"unknown\",\n args: (block.input as JSONValue) ?? {},\n });\n }\n }\n\n return events.length > 0 ? events : null;\n }\n\n case \"user\": {\n // User messages with tool_use_result indicate tool completion\n const toolResult = msg.tool_use_result as JSONValue | undefined;\n // Extract tool name from the message context if available\n if (toolResult !== undefined) {\n // The user message after tool execution — emit tool_call_end\n // tool_name may not be in user messages, but we can infer from context\n return null; // Handled via tool_use_summary below\n }\n return null;\n }\n\n case \"tool_use_summary\": {\n // Emitted after tool execution — contains summary of tool results\n const summary = msg.summary as string | undefined;\n const toolName = (msg.tool_name as string | undefined) ?? \"unknown\";\n // Emit as tool_call_end with summary as result\n if (summary) {\n return {\n type: \"tool_call_end\",\n toolName,\n result: summary as JSONValue,\n };\n }\n return null;\n }\n\n case \"stream_event\": {\n // Partial streaming events — BetaRawMessageStreamEvent\n const event = msg.event as {\n type: string;\n delta?: { type: string; text?: string };\n content_block?: { type: string; name?: string; id?: string };\n index?: number;\n } | undefined;\n if (!event) return null;\n\n if (\n event.type === \"content_block_delta\" &&\n event.delta?.type === \"text_delta\" &&\n event.delta.text\n ) {\n return { type: \"text_delta\", text: event.delta.text };\n }\n\n if (event.type === \"content_block_start\" && event.content_block?.type === \"thinking\") {\n if (thinkingBlockIndices && event.index !== undefined) {\n thinkingBlockIndices.add(event.index);\n }\n return { type: \"thinking_start\" };\n }\n\n if (event.type === \"content_block_stop\" && event.index !== undefined && thinkingBlockIndices?.has(event.index)) {\n thinkingBlockIndices.delete(event.index);\n return { type: \"thinking_end\" };\n }\n\n return null;\n }\n\n case \"tool_progress\": {\n const toolName = msg.tool_name as string | undefined;\n return toolName\n ? { type: \"tool_call_start\", toolName, args: {} }\n : null;\n }\n\n case \"result\": {\n if (msg.subtype === \"success\") {\n const r = msg as unknown as SDKResultSuccess;\n return {\n type: \"usage_update\",\n ...aggregateUsage(r.modelUsage),\n };\n }\n if (msg.is_error) {\n const r = msg as unknown as SDKResultError;\n return {\n type: \"error\",\n error: r.errors?.join(\"; \") ?? \"Unknown error\",\n recoverable: false,\n };\n }\n return null;\n }\n\n default:\n return null;\n }\n}\n\n// ─── ClaudeAgent ────────────────────────────────────────────────\n\nclass ClaudeAgent extends BaseAgent {\n private readonly options: ClaudeBackendOptions;\n private readonly tools: ToolDefinition[];\n private readonly canUseTool: SDKCanUseTool | undefined;\n\n constructor(config: AgentConfig, options: ClaudeBackendOptions) {\n super(config);\n this.options = options;\n this.tools = config.tools;\n this.canUseTool = buildCanUseTool(config);\n\n // Warn if onAskUser is set — Claude CLI SDK doesn't support user interaction hooks\n if (config.supervisor?.onAskUser) {\n console.warn(\n \"[agent-sdk/claude] supervisor.onAskUser is not supported by the Claude CLI backend. \" +\n \"User interaction requests from the model will not be forwarded.\",\n );\n }\n }\n\n private buildQueryOptions(signal: AbortSignal): SDKOptions {\n const ac = new AbortController();\n // Link external signal → SDK's abort controller\n signal.addEventListener(\"abort\", () => ac.abort(), { once: true });\n\n const opts: SDKOptions = {\n abortController: ac,\n model: this.config.model,\n maxTurns: this.options.maxTurns,\n cwd: this.options.workingDirectory,\n pathToClaudeCodeExecutable: this.options.cliPath,\n persistSession: false,\n includePartialMessages: true,\n canUseTool: this.canUseTool,\n };\n\n if (this.config.systemPrompt) {\n opts.systemPrompt = this.config.systemPrompt;\n }\n\n return opts;\n }\n\n private async buildMcpConfig(\n opts: SDKOptions,\n toolResultCapture?: Map<string, JSONValue>,\n ): Promise<SDKOptions> {\n if (this.tools.length === 0) return opts;\n\n const sdk = await loadSDK();\n const mcpServer = buildMcpServer(sdk, this.tools, toolResultCapture);\n if (mcpServer) {\n opts.mcpServers = {\n \"agent-sdk-tools\": mcpServer,\n };\n }\n return opts;\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 prompt = extractLastUserPrompt(messages);\n let opts = this.buildQueryOptions(signal);\n const toolResultCapture = new Map<string, JSONValue>();\n opts = await this.buildMcpConfig(opts, toolResultCapture);\n\n const q = sdk.query({ prompt, options: opts });\n const toolCalls: AgentResult[\"toolCalls\"] = [];\n let output: string | null = null;\n let usage: AgentResult[\"usage\"];\n\n try {\n for await (const msg of q) {\n // Collect tool calls from assistant messages\n if (msg.type === \"assistant\") {\n const betaMessage = msg.message as {\n content?: Array<{\n type: string;\n text?: string;\n name?: string;\n input?: unknown;\n id?: string;\n }>;\n } | undefined;\n if (betaMessage?.content) {\n for (const block of betaMessage.content) {\n if (block.type === \"tool_use\") {\n const toolName = block.name ?? \"unknown\";\n toolCalls.push({\n toolName,\n args: (block.input as JSONValue) ?? {},\n result: toolResultCapture.get(toolName) ?? null,\n approved: true,\n });\n }\n }\n }\n }\n\n // Back-fill results from capture map for previously added tool calls\n if (msg.type === \"tool_use_summary\" || msg.type === \"result\") {\n for (const tc of toolCalls) {\n if (tc.result === null) {\n const captured = toolResultCapture.get(tc.toolName);\n if (captured !== undefined) tc.result = captured;\n }\n }\n }\n\n // Capture result\n if (msg.type === \"result\") {\n if (msg.subtype === \"success\") {\n const r = msg as unknown as SDKResultSuccess;\n output = r.result;\n usage = aggregateUsage(r.modelUsage);\n } else if (msg.is_error) {\n const r = msg as unknown as SDKResultError;\n throw new Error(\n `Claude query failed: ${r.errors?.join(\"; \") ?? \"unknown error\"}`,\n );\n }\n }\n }\n } catch (e) {\n if (signal.aborted) throw new AbortError();\n throw e;\n }\n\n return {\n output,\n structuredOutput: undefined as AgentResult[\"structuredOutput\"],\n toolCalls,\n messages: [\n ...messages,\n ...(output !== null\n ? [{ role: \"assistant\" as const, content: output }]\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 prompt = extractLastUserPrompt(messages);\n let opts = this.buildQueryOptions(signal);\n opts = await this.buildMcpConfig(opts);\n\n // Claude SDK has native structured output via outputFormat\n const jsonSchema = zodToJsonSchema(schema.schema);\n opts.outputFormat = {\n type: \"json_schema\",\n schema: jsonSchema as Record<string, unknown>,\n };\n\n const q = sdk.query({ prompt, options: opts });\n const toolCalls: AgentResult[\"toolCalls\"] = [];\n let output: string | null = null;\n let structuredOutput: T | undefined;\n let usage: AgentResult[\"usage\"];\n\n try {\n for await (const msg of q) {\n if (msg.type === \"result\" && msg.subtype === \"success\") {\n const r = msg as unknown as SDKResultSuccess;\n output = r.result;\n\n // Claude SDK returns parsed structured_output when using outputFormat\n if (r.structured_output !== undefined) {\n try {\n structuredOutput = schema.schema.parse(r.structured_output);\n } catch {\n // Fallback: try parsing result string\n try {\n structuredOutput = schema.schema.parse(JSON.parse(r.result));\n } catch {\n // Leave undefined\n }\n }\n } else if (r.result) {\n // Fallback: parse from result string\n try {\n const jsonMatch = r.result.match(/```(?:json)?\\s*([\\s\\S]*?)```/);\n const raw = jsonMatch ? jsonMatch[1]!.trim() : r.result.trim();\n structuredOutput = schema.schema.parse(JSON.parse(raw));\n } catch {\n // Leave undefined\n }\n }\n\n usage = aggregateUsage(r.modelUsage);\n } else if (msg.type === \"result\" && msg.is_error) {\n const r = msg as unknown as SDKResultError;\n throw new Error(\n `Claude query failed: ${r.errors?.join(\"; \") ?? \"unknown error\"}`,\n );\n }\n }\n } catch (e) {\n if (signal.aborted) throw new AbortError();\n throw e;\n }\n\n return {\n output,\n structuredOutput: structuredOutput as AgentResult<T>[\"structuredOutput\"],\n toolCalls,\n messages: [\n ...messages,\n ...(output !== null\n ? [{ role: \"assistant\" as const, content: output }]\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 prompt = extractLastUserPrompt(messages);\n let opts = this.buildQueryOptions(signal);\n opts = await this.buildMcpConfig(opts);\n\n const q = sdk.query({ prompt, options: opts });\n const thinkingBlockIndices = new Set<number>();\n\n try {\n for await (const msg of q) {\n if (signal.aborted) throw new AbortError();\n\n const event = mapSDKMessage(msg, thinkingBlockIndices);\n if (event) {\n if (Array.isArray(event)) {\n for (const e of event) yield e;\n } else {\n yield event;\n }\n }\n\n // Emit done event on result\n if (msg.type === \"result\" && msg.subtype === \"success\") {\n const r = msg as unknown as SDKResultSuccess;\n yield { type: \"done\", finalOutput: r.result };\n }\n }\n } catch (e) {\n if (signal.aborted) throw new AbortError();\n throw e;\n }\n }\n\n override dispose(): void {\n super.dispose();\n }\n}\n\n// ─── Helpers ────────────────────────────────────────────────────\n\nfunction extractLastUserPrompt(messages: Message[]): string {\n for (let i = messages.length - 1; i >= 0; i--) {\n const msg = messages[i];\n if (msg.role === \"user\") {\n return getTextContent(msg.content);\n }\n }\n return \"\";\n}\n\n// ─── ClaudeAgentService ─────────────────────────────────────────\n\nclass ClaudeAgentService implements IAgentService {\n readonly name = \"claude\";\n private disposed = false;\n private readonly options: ClaudeBackendOptions;\n private cachedModels: ModelInfo[] | null = null;\n\n constructor(options: ClaudeBackendOptions) {\n this.options = options;\n }\n\n createAgent(config: AgentConfig): IAgent {\n if (this.disposed) throw new DisposedError(\"ClaudeAgentService\");\n return new ClaudeAgent(config, this.options);\n }\n\n async listModels(): Promise<ModelInfo[]> {\n if (this.disposed) throw new DisposedError(\"ClaudeAgentService\");\n if (this.cachedModels) return this.cachedModels;\n\n // Return well-known Claude models without spawning a query subprocess.\n // Claude SDK's supportedModels() requires a live query which costs API credits.\n // The static list covers all publicly available Claude models.\n this.cachedModels = CLAUDE_KNOWN_MODELS.map((m) => ({\n id: m.id,\n name: m.name,\n provider: \"claude\",\n }));\n return this.cachedModels;\n }\n\n async validate(): Promise<ValidationResult> {\n if (this.disposed) throw new DisposedError(\"ClaudeAgentService\");\n\n const errors: string[] = [];\n try {\n await loadSDK();\n } catch (e) {\n errors.push(\n e instanceof Error ? e.message : String(e),\n );\n return { valid: false, errors };\n }\n\n // Verify CLI is accessible by attempting a minimal query\n try {\n const sdk = await loadSDK();\n const q = sdk.query({\n prompt: \"echo test\",\n options: {\n model: CLAUDE_KNOWN_MODELS[0].id,\n pathToClaudeCodeExecutable: this.options.cliPath,\n cwd: this.options.workingDirectory,\n persistSession: false,\n maxTurns: 1,\n permissionMode: \"plan\",\n },\n });\n // Wait for first message (auth check)\n const first = await q.next();\n q.close();\n if (first.done) {\n errors.push(\"Claude CLI returned no messages — may not be authenticated.\");\n }\n } catch (e) {\n errors.push(\n `Failed to connect to Claude CLI: ${e instanceof Error ? e.message : String(e)}`,\n );\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 this.cachedModels = null;\n }\n}\n\n// ─── Factory ────────────────────────────────────────────────────\n\n/** Create Claude CLI backend service. */\nexport function createClaudeService(\n options: ClaudeBackendOptions,\n): IAgentService {\n return new ClaudeAgentService(options);\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { a as ClaudeBackendOptions, I as IAgentService } from '../types-JVBEqeDw.cjs';
1
+ import { a as ClaudeBackendOptions, I as IAgentService } from '../types-DxstXhLL.cjs';
2
2
  import 'zod';
3
3
 
4
4
  /** @internal Claude SDK PermissionUpdate destination */
@@ -1,4 +1,4 @@
1
- import { a as ClaudeBackendOptions, I as IAgentService } from '../types-JVBEqeDw.js';
1
+ import { a as ClaudeBackendOptions, I as IAgentService } from '../types-DxstXhLL.js';
2
2
  import 'zod';
3
3
 
4
4
  /** @internal Claude SDK PermissionUpdate destination */