@witqq/agent-sdk 0.1.1 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/types.ts","../src/errors.ts","../src/registry.ts","../src/base-agent.ts","../src/utils/schema.ts","../src/utils/messages.ts","../src/permission-store.ts"],"names":["path","fs","os"],"mappings":"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","file":"index.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 IAgentService,\n CopilotBackendOptions,\n ClaudeBackendOptions,\n VercelAIBackendOptions,\n} from \"./types.js\";\nimport {\n BackendNotFoundError,\n BackendAlreadyRegisteredError,\n} from \"./errors.js\";\n\n// ─── Backend Factory Types ──────────────────────────────────────\n\n/** Factory function that creates a backend service from options */\nexport type BackendFactory<TOptions = unknown> = (\n options: TOptions,\n) => IAgentService | Promise<IAgentService>;\n\n/** Map of built-in backend names to their options types */\nexport interface BackendOptionsMap {\n copilot: CopilotBackendOptions;\n claude: ClaudeBackendOptions;\n \"vercel-ai\": VercelAIBackendOptions;\n}\n\n/** All known backend names (built-in + custom) */\nexport type BuiltinBackendName = keyof BackendOptionsMap;\n\n// ─── Registry ───────────────────────────────────────────────────\n\ninterface RegistryEntry {\n factory: BackendFactory;\n /** Whether this is a built-in backend loaded lazily */\n builtin: boolean;\n}\n\nconst registry = new Map<string, RegistryEntry>();\n\n/** Register a custom backend factory */\nexport function registerBackend<TOptions = unknown>(\n name: string,\n factory: BackendFactory<TOptions>,\n): void {\n if (registry.has(name)) {\n throw new BackendAlreadyRegisteredError(name);\n }\n registry.set(name, { factory: factory as BackendFactory, builtin: false });\n}\n\n/** Unregister a backend (primarily for testing) */\nexport function unregisterBackend(name: string): boolean {\n return registry.delete(name);\n}\n\n/** Check if a backend is registered */\nexport function hasBackend(name: string): boolean {\n return registry.has(name) || isBuiltinName(name);\n}\n\n/** List all registered backend names */\nexport function listBackends(): string[] {\n const names = new Set<string>(registry.keys());\n for (const builtin of BUILTIN_BACKENDS) {\n names.add(builtin);\n }\n return [...names];\n}\n\n/** Reset registry to initial state (for testing) */\nexport function resetRegistry(): void {\n registry.clear();\n}\n\n// ─── Built-in Backend Names ─────────────────────────────────────\n\nconst BUILTIN_BACKENDS: ReadonlySet<string> = new Set([\n \"copilot\",\n \"claude\",\n \"vercel-ai\",\n]);\n\nfunction isBuiltinName(name: string): name is BuiltinBackendName {\n return BUILTIN_BACKENDS.has(name);\n}\n\n// ─── Lazy Import for Built-in Backends ──────────────────────────\n\nasync function loadBuiltinFactory(\n name: BuiltinBackendName,\n): Promise<BackendFactory> {\n switch (name) {\n case \"copilot\": {\n const mod = await import(\"./backends/copilot.js\");\n return (opts: unknown) =>\n mod.createCopilotService(opts as CopilotBackendOptions);\n }\n case \"claude\": {\n const mod = await import(\"./backends/claude.js\");\n return (opts: unknown) =>\n mod.createClaudeService(opts as ClaudeBackendOptions);\n }\n case \"vercel-ai\": {\n const mod = await import(\"./backends/vercel-ai.js\");\n return (opts: unknown) =>\n mod.createVercelAIService(opts as VercelAIBackendOptions);\n }\n }\n}\n\n// ─── Type-Safe Factory (B6) ─────────────────────────────────────\n\n/** Create a backend service with type-safe options */\nexport async function createAgentService<K extends BuiltinBackendName>(\n name: K,\n options: BackendOptionsMap[K],\n): Promise<IAgentService>;\nexport async function createAgentService(\n name: string,\n options: unknown,\n): Promise<IAgentService>;\nexport async function createAgentService(\n name: string,\n options: unknown,\n): Promise<IAgentService> {\n // Check custom registry first\n const entry = registry.get(name);\n if (entry) {\n return entry.factory(options);\n }\n\n // Try built-in lazy load\n if (isBuiltinName(name)) {\n const factory = await loadBuiltinFactory(name);\n // Cache for future calls\n registry.set(name, { factory, builtin: true });\n return factory(options);\n }\n\n throw new BackendNotFoundError(name);\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 { Message, MessageContent } from \"../types.js\";\nimport { getTextContent } from \"../types.js\";\n\n/** Convert our Message[] to a flat prompt string (for CLIs that accept text) */\nexport function messagesToPrompt(messages: Message[]): string {\n return messages\n .map((msg) => {\n switch (msg.role) {\n case \"user\":\n return contentToText(msg.content);\n case \"assistant\":\n return contentToText(msg.content);\n case \"system\":\n return msg.content;\n case \"tool\":\n return msg.content ?? \"\";\n }\n })\n .filter(Boolean)\n .join(\"\\n\\n\");\n}\n\n/** Convert MessageContent to plain text */\nexport function contentToText(content: MessageContent): string {\n return getTextContent(content);\n}\n\n/** Build a system prompt with optional structured output instruction */\nexport function buildSystemPrompt(\n base: string,\n schemaInstruction?: string,\n): string {\n if (!schemaInstruction) return base;\n return `${base}\\n\\n${schemaInstruction}`;\n}\n","import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport * as os from \"node:os\";\nimport type { PermissionScope } from \"./types.js\";\n\n// ─── Interface ──────────────────────────────────────────────────\n\n/** Pluggable store for persisting permission (scope) decisions across runs. */\nexport interface IPermissionStore {\n /** Check if tool is already approved */\n isApproved(toolName: string): Promise<boolean>;\n\n /** Store an approval decision */\n approve(toolName: string, scope: PermissionScope): Promise<void>;\n\n /** Revoke approval for a tool */\n revoke(toolName: string): Promise<void>;\n\n /** Clear all approvals */\n clear(): Promise<void>;\n\n /** Dispose resources */\n dispose(): Promise<void>;\n}\n\n// ─── InMemoryPermissionStore ────────────────────────────────────\n\n/** In-memory store — approvals live until process exits (or dispose). */\nexport class InMemoryPermissionStore implements IPermissionStore {\n private approvals = new Map<string, PermissionScope>();\n\n async isApproved(toolName: string): Promise<boolean> {\n return this.approvals.has(toolName);\n }\n\n async approve(toolName: string, scope: PermissionScope): Promise<void> {\n if (scope === \"once\") return; // \"once\" means don't persist\n this.approvals.set(toolName, scope);\n }\n\n async revoke(toolName: string): Promise<void> {\n this.approvals.delete(toolName);\n }\n\n async clear(): Promise<void> {\n this.approvals.clear();\n }\n\n async dispose(): Promise<void> {\n this.approvals.clear();\n }\n}\n\n// ─── FilePermissionStore ────────────────────────────────────────\n\ninterface FileStoreEntry {\n scope: PermissionScope;\n timestamp: number;\n}\n\ninterface FileStoreData {\n approvals: Record<string, FileStoreEntry>;\n}\n\n/** File-backed store — reads/writes a JSON file for persistent approvals. */\nexport class FilePermissionStore implements IPermissionStore {\n private readonly filePath: string;\n\n constructor(filePath: string) {\n this.filePath = path.resolve(filePath);\n }\n\n async isApproved(toolName: string): Promise<boolean> {\n const data = this.readFile();\n return toolName in data.approvals;\n }\n\n async approve(toolName: string, scope: PermissionScope): Promise<void> {\n if (scope === \"once\") return;\n const data = this.readFile();\n data.approvals[toolName] = { scope, timestamp: Date.now() };\n this.writeFileAtomic(data);\n }\n\n async revoke(toolName: string): Promise<void> {\n const data = this.readFile();\n delete data.approvals[toolName];\n this.writeFileAtomic(data);\n }\n\n async clear(): Promise<void> {\n this.writeFileAtomic({ approvals: {} });\n }\n\n async dispose(): Promise<void> {\n // No resources to release\n }\n\n private readFile(): FileStoreData {\n try {\n const raw = fs.readFileSync(this.filePath, \"utf-8\");\n const parsed = JSON.parse(raw) as FileStoreData;\n if (parsed && typeof parsed.approvals === \"object\") return parsed;\n } catch {\n // File doesn't exist or is invalid — start fresh\n }\n return { approvals: {} };\n }\n\n private writeFileAtomic(data: FileStoreData): void {\n const dir = path.dirname(this.filePath);\n fs.mkdirSync(dir, { recursive: true });\n const tmpPath = this.filePath + `.tmp.${process.pid}.${Date.now()}`;\n fs.writeFileSync(tmpPath, JSON.stringify(data, null, 2), \"utf-8\");\n fs.renameSync(tmpPath, this.filePath);\n }\n}\n\n// ─── CompositePermissionStore ───────────────────────────────────\n\n/**\n * Composes multiple stores — checks in order, routes writes by scope.\n *\n * - \"session\" → sessionStore (in-memory)\n * - \"project\" → projectStore (file-based in project directory)\n * - \"always\" → userStore (file-based in user home)\n */\nexport class CompositePermissionStore implements IPermissionStore {\n private readonly sessionStore: IPermissionStore;\n private readonly projectStore: IPermissionStore;\n private readonly userStore: IPermissionStore;\n\n constructor(\n sessionStore: IPermissionStore,\n projectStore: IPermissionStore,\n userStore?: IPermissionStore,\n ) {\n this.sessionStore = sessionStore;\n this.projectStore = projectStore;\n this.userStore = userStore ?? projectStore;\n }\n\n async isApproved(toolName: string): Promise<boolean> {\n return (\n (await this.sessionStore.isApproved(toolName)) ||\n (await this.projectStore.isApproved(toolName)) ||\n (await this.userStore.isApproved(toolName))\n );\n }\n\n async approve(toolName: string, scope: PermissionScope): Promise<void> {\n if (scope === \"once\") return;\n if (scope === \"session\") {\n await this.sessionStore.approve(toolName, scope);\n } else if (scope === \"project\") {\n await this.projectStore.approve(toolName, scope);\n } else {\n // \"always\" → user-level store\n await this.userStore.approve(toolName, scope);\n }\n }\n\n async revoke(toolName: string): Promise<void> {\n await this.sessionStore.revoke(toolName);\n await this.projectStore.revoke(toolName);\n await this.userStore.revoke(toolName);\n }\n\n async clear(): Promise<void> {\n await this.sessionStore.clear();\n await this.projectStore.clear();\n await this.userStore.clear();\n }\n\n async dispose(): Promise<void> {\n await this.sessionStore.dispose();\n await this.projectStore.dispose();\n if (this.userStore !== this.projectStore) {\n await this.userStore.dispose();\n }\n }\n}\n\n// ─── Helpers ────────────────────────────────────────────────────\n\n/** Create a default composite store with separate project and user-level persistence. */\nexport function createDefaultPermissionStore(\n projectDir?: string,\n): CompositePermissionStore {\n const sessionStore = new InMemoryPermissionStore();\n const projectPath = projectDir\n ? path.join(projectDir, \".agent-sdk\", \"permissions.json\")\n : path.join(process.cwd(), \".agent-sdk\", \"permissions.json\");\n const userPath = path.join(os.homedir(), \".agent-sdk\", \"permissions.json\");\n const projectStore = new FilePermissionStore(projectPath);\n const userStore = new FilePermissionStore(userPath);\n return new CompositePermissionStore(sessionStore, projectStore, userStore);\n}\n"]}
1
+ {"version":3,"sources":["../src/types.ts","../src/errors.ts","../src/registry.ts","../src/base-agent.ts","../src/utils/schema.ts","../src/utils/messages.ts","../src/permission-store.ts"],"names":["resolve","path","fs","os"],"mappings":"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","file":"index.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// ─── Usage Data ────────────────────────────────────────────────\n\n/** Usage data from LLM execution — tokens consumed plus optional metadata */\nexport interface UsageData {\n promptTokens: number;\n completionTokens: number;\n model?: string;\n backend?: string;\n}\n\n// ─── Agent Events (Streaming) ──────────────────────────────────\n\n/** Events emitted during streaming agent execution */\nexport type AgentEvent =\n | { type: \"text_delta\"; text: string }\n | { type: \"thinking_delta\"; text: string }\n | { type: \"tool_call_start\"; toolCallId: string; toolName: string; args: JSONValue }\n | { type: \"tool_call_end\"; toolCallId: string; toolName: string; result: JSONValue }\n | { type: \"permission_request\"; request: PermissionRequest }\n | {\n type: \"permission_response\";\n toolName: string;\n decision: PermissionDecision;\n }\n | { type: \"ask_user\"; request: UserInputRequest }\n | { type: \"ask_user_response\"; answer: string }\n | { type: \"thinking_start\" }\n | { type: \"thinking_end\" }\n | {\n type: \"usage_update\";\n promptTokens: number;\n completionTokens: number;\n model?: string;\n backend?: string;\n }\n | { type: \"heartbeat\" }\n | { type: \"error\"; error: string; recoverable: boolean }\n | { type: \"done\"; finalOutput: string | null; structuredOutput?: unknown };\n\n// ─── Run Options ───────────────────────────────────────────────\n\n/** Options passed to agent.run() / agent.stream() */\nexport interface RunOptions {\n /** AbortSignal for cancellation */\n signal?: AbortSignal;\n /** Arbitrary context passed to the agent run */\n context?: Record<string, unknown>;\n}\n\n// ─── Agent Configuration ───────────────────────────────────────\n\n/** LLM model parameters */\nexport interface ModelParams {\n temperature?: number;\n maxTokens?: number;\n topP?: number;\n stopSequences?: string[];\n}\n\n/** Timeout configuration for agent operations */\nexport interface TimeoutConfig {\n /** Max time for entire agent run (ms) */\n total?: number;\n /** Max time for a single tool execution (ms) */\n perTool?: number;\n /** Max time for a single LLM request (ms) */\n perLLMRequest?: number;\n}\n\n/** Error handling strategy configuration */\nexport interface ErrorHandlingConfig {\n /** What to do when a tool throws */\n onToolError?: \"fail\" | \"continue\" | \"ask-llm\";\n /** Retry config for transient LLM failures */\n retryLLM?: { maxAttempts: number; backoffMs: number };\n /** Global error callback for monitoring */\n onError?: (\n error: Error,\n context: { phase: \"tool\" | \"llm\" | \"permission\" | \"ask-user\" },\n ) => void;\n}\n\n/** Configuration for creating an agent */\nexport interface AgentConfig {\n model?: string;\n modelParams?: ModelParams;\n systemPrompt: string;\n tools: ToolDefinition[];\n supervisor?: SupervisorHooks;\n maxTurns?: number;\n timeout?: TimeoutConfig;\n errorHandling?: ErrorHandlingConfig;\n /** Pluggable store for persisting permission scope decisions across runs */\n permissionStore?: IPermissionStore;\n /** How to apply systemPrompt: \"append\" adds to backend default, \"replace\" overrides it.\n * Default: \"append\". Currently used by the Copilot backend. */\n systemMessageMode?: \"append\" | \"replace\";\n /** Filter for backend built-in tools (e.g. [\"web_search\", \"web_fetch\"] for Copilot).\n * When set, only listed built-in tools are available. Backend-specific. */\n availableTools?: string[];\n /** Callback invoked with usage data after run completion or during streaming.\n * Fire-and-forget: errors are logged but not propagated. */\n onUsage?: (usage: UsageData) => void;\n /** Interval in milliseconds for emitting heartbeat events during streaming.\n * When set, heartbeat events are emitted to keep the stream alive during\n * long tool executions. Default: off (no heartbeats). */\n heartbeatInterval?: number;\n}\n\n// ─── Agent Result (Generic) ────────────────────────────────────\n\n/** Result of an agent run, generic over structured output type T */\nexport interface AgentResult<T = void> {\n output: string | null;\n structuredOutput: T extends void ? undefined : T;\n toolCalls: Array<{\n toolName: string;\n args: JSONValue;\n result: JSONValue;\n approved: boolean;\n }>;\n messages: Message[];\n usage?: UsageData;\n}\n\n// ─── Agent State ───────────────────────────────────────────────\n\n/** Agent lifecycle state */\nexport type AgentState = \"idle\" | \"running\" | \"streaming\" | \"disposed\";\n\n// ─── Agent Interface ───────────────────────────────────────────\n\n/** Core agent interface — run prompts, stream events, manage lifecycle */\nexport interface IAgent {\n /** Run a single prompt and return the result. Wraps prompt in a user message. */\n run(prompt: MessageContent, options?: RunOptions): Promise<AgentResult>;\n /** Run with full conversation history. Messages are passed directly to the backend. */\n runWithContext(\n messages: Message[],\n options?: RunOptions,\n ): Promise<AgentResult>;\n /** Run with structured output validated against a Zod schema. */\n runStructured<T>(\n prompt: MessageContent,\n schema: StructuredOutputConfig<T>,\n options?: RunOptions,\n ): Promise<AgentResult<T>>;\n /** Stream events for a single prompt. Wraps prompt in a user message. */\n stream(\n prompt: MessageContent,\n options?: RunOptions,\n ): AsyncIterable<AgentEvent>;\n /** Stream events with full conversation history. Messages are passed directly to the backend. */\n streamWithContext(\n messages: Message[],\n options?: RunOptions,\n ): AsyncIterable<AgentEvent>;\n /** Abort the current operation. No-op if not running. */\n abort(): void;\n /** Get current agent lifecycle state. */\n getState(): AgentState;\n /** Get frozen agent configuration. */\n getConfig(): Readonly<AgentConfig>;\n /** Release resources. After dispose(), agent must not be used. */\n dispose(): void;\n}\n\n// ─── Service Interface ─────────────────────────────────────────\n\n/** Model metadata returned by listModels() */\nexport interface ModelInfo {\n id: string;\n name?: string;\n provider?: string;\n}\n\n/** Result of backend validation check */\nexport interface ValidationResult {\n valid: boolean;\n errors: string[];\n}\n\n/** Backend service interface — creates agents, lists models, validates config */\nexport interface IAgentService {\n readonly name: string;\n createAgent(config: AgentConfig): IAgent;\n listModels(): Promise<ModelInfo[]>;\n validate(): Promise<ValidationResult>;\n dispose(): Promise<void>;\n}\n\n// ─── Backend Options ───────────────────────────────────────────\n\n/** Options for Copilot CLI backend */\nexport interface CopilotBackendOptions {\n cliPath?: string;\n workingDirectory?: string;\n githubToken?: string;\n useLoggedInUser?: boolean;\n /** Extra CLI arguments passed to the Copilot subprocess (e.g. [\"--allow-all\"]) */\n cliArgs?: string[];\n}\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 IAgentService,\n CopilotBackendOptions,\n ClaudeBackendOptions,\n VercelAIBackendOptions,\n} from \"./types.js\";\nimport {\n BackendNotFoundError,\n BackendAlreadyRegisteredError,\n} from \"./errors.js\";\n\n// ─── Backend Factory Types ──────────────────────────────────────\n\n/** Factory function that creates a backend service from options */\nexport type BackendFactory<TOptions = unknown> = (\n options: TOptions,\n) => IAgentService | Promise<IAgentService>;\n\n/** Map of built-in backend names to their options types */\nexport interface BackendOptionsMap {\n copilot: CopilotBackendOptions;\n claude: ClaudeBackendOptions;\n \"vercel-ai\": VercelAIBackendOptions;\n}\n\n/** All known backend names (built-in + custom) */\nexport type BuiltinBackendName = keyof BackendOptionsMap;\n\n// ─── Registry ───────────────────────────────────────────────────\n\ninterface RegistryEntry {\n factory: BackendFactory;\n /** Whether this is a built-in backend loaded lazily */\n builtin: boolean;\n}\n\nconst registry = new Map<string, RegistryEntry>();\n\n/** Register a custom backend factory */\nexport function registerBackend<TOptions = unknown>(\n name: string,\n factory: BackendFactory<TOptions>,\n): void {\n if (registry.has(name)) {\n throw new BackendAlreadyRegisteredError(name);\n }\n registry.set(name, { factory: factory as BackendFactory, builtin: false });\n}\n\n/** Unregister a backend (primarily for testing) */\nexport function unregisterBackend(name: string): boolean {\n return registry.delete(name);\n}\n\n/** Check if a backend is registered */\nexport function hasBackend(name: string): boolean {\n return registry.has(name) || isBuiltinName(name);\n}\n\n/** List all registered backend names */\nexport function listBackends(): string[] {\n const names = new Set<string>(registry.keys());\n for (const builtin of BUILTIN_BACKENDS) {\n names.add(builtin);\n }\n return [...names];\n}\n\n/** Reset registry to initial state (for testing) */\nexport function resetRegistry(): void {\n registry.clear();\n}\n\n// ─── Built-in Backend Names ─────────────────────────────────────\n\nconst BUILTIN_BACKENDS: ReadonlySet<string> = new Set([\n \"copilot\",\n \"claude\",\n \"vercel-ai\",\n]);\n\nfunction isBuiltinName(name: string): name is BuiltinBackendName {\n return BUILTIN_BACKENDS.has(name);\n}\n\n// ─── Lazy Import for Built-in Backends ──────────────────────────\n\nasync function loadBuiltinFactory(\n name: BuiltinBackendName,\n): Promise<BackendFactory> {\n switch (name) {\n case \"copilot\": {\n const mod = await import(\"./backends/copilot.js\");\n return (opts: unknown) =>\n mod.createCopilotService(opts as CopilotBackendOptions);\n }\n case \"claude\": {\n const mod = await import(\"./backends/claude.js\");\n return (opts: unknown) =>\n mod.createClaudeService(opts as ClaudeBackendOptions);\n }\n case \"vercel-ai\": {\n const mod = await import(\"./backends/vercel-ai.js\");\n return (opts: unknown) =>\n mod.createVercelAIService(opts as VercelAIBackendOptions);\n }\n }\n}\n\n// ─── Type-Safe Factory (B6) ─────────────────────────────────────\n\n/** Create a backend service with type-safe options */\nexport async function createAgentService<K extends BuiltinBackendName>(\n name: K,\n options: BackendOptionsMap[K],\n): Promise<IAgentService>;\nexport async function createAgentService(\n name: string,\n options: unknown,\n): Promise<IAgentService>;\nexport async function createAgentService(\n name: string,\n options: unknown,\n): Promise<IAgentService> {\n // Check custom registry first\n const entry = registry.get(name);\n if (entry) {\n return entry.factory(options);\n }\n\n // Try built-in lazy load\n if (isBuiltinName(name)) {\n const factory = await loadBuiltinFactory(name);\n // Cache for future calls\n registry.set(name, { factory, builtin: true });\n return factory(options);\n }\n\n throw new BackendNotFoundError(name);\n}\n","import type {\n IAgent,\n AgentConfig,\n AgentState,\n AgentResult,\n AgentEvent,\n MessageContent,\n Message,\n RunOptions,\n StructuredOutputConfig,\n UsageData,\n} from \"./types.js\";\nimport { ReentrancyError, DisposedError, AbortError } from \"./errors.js\";\n\n/** Abstract base agent with shared lifecycle logic.\n * Concrete backends extend this and implement the protected _run/_stream methods. */\nexport abstract class BaseAgent implements IAgent {\n protected state: AgentState = \"idle\";\n protected abortController: AbortController | null = null;\n protected readonly config: AgentConfig;\n\n /** Backend identifier (e.g. \"copilot\", \"claude\", \"vercel-ai\") */\n protected abstract readonly backendName: string;\n\n constructor(config: AgentConfig) {\n this.config = Object.freeze({ ...config });\n }\n\n // ─── Public Interface ─────────────────────────────────────────\n\n async run(\n prompt: MessageContent,\n options?: RunOptions,\n ): Promise<AgentResult> {\n this.guardReentrancy();\n this.guardDisposed();\n\n const ac = this.createAbortController(options?.signal);\n this.state = \"running\";\n\n try {\n const messages: Message[] = [{ role: \"user\", content: prompt }];\n const result = await this.executeRun(messages, options, ac.signal);\n this.enrichAndNotifyUsage(result);\n return result;\n } finally {\n this.state = \"idle\";\n this.abortController = null;\n }\n }\n\n async runWithContext(\n messages: Message[],\n options?: RunOptions,\n ): Promise<AgentResult> {\n this.guardReentrancy();\n this.guardDisposed();\n\n const ac = this.createAbortController(options?.signal);\n this.state = \"running\";\n\n try {\n const result = await this.executeRun(messages, options, ac.signal);\n this.enrichAndNotifyUsage(result);\n return result;\n } finally {\n this.state = \"idle\";\n this.abortController = null;\n }\n }\n\n async runStructured<T>(\n prompt: MessageContent,\n schema: StructuredOutputConfig<T>,\n options?: RunOptions,\n ): Promise<AgentResult<T>> {\n this.guardReentrancy();\n this.guardDisposed();\n\n const ac = this.createAbortController(options?.signal);\n this.state = \"running\";\n\n try {\n const messages: Message[] = [{ role: \"user\", content: prompt }];\n const result = await this.executeRunStructured(\n messages,\n schema,\n options,\n ac.signal,\n );\n this.enrichAndNotifyUsage(result);\n return result;\n } finally {\n this.state = \"idle\";\n this.abortController = null;\n }\n }\n\n async *stream(\n prompt: MessageContent,\n options?: RunOptions,\n ): AsyncIterable<AgentEvent> {\n this.guardReentrancy();\n this.guardDisposed();\n\n const ac = this.createAbortController(options?.signal);\n this.state = \"streaming\";\n\n try {\n const messages: Message[] = [{ role: \"user\", content: prompt }];\n const enriched = this.enrichStream(this.executeStream(messages, options, ac.signal));\n yield* this.heartbeatStream(enriched);\n } finally {\n this.state = \"idle\";\n this.abortController = null;\n }\n }\n\n async *streamWithContext(\n messages: Message[],\n options?: RunOptions,\n ): AsyncIterable<AgentEvent> {\n this.guardReentrancy();\n this.guardDisposed();\n\n const ac = this.createAbortController(options?.signal);\n this.state = \"streaming\";\n\n try {\n const enriched = this.enrichStream(this.executeStream(messages, options, ac.signal));\n yield* this.heartbeatStream(enriched);\n } finally {\n this.state = \"idle\";\n this.abortController = null;\n }\n }\n\n abort(): void {\n if (this.abortController) {\n this.abortController.abort();\n }\n }\n\n getState(): AgentState {\n return this.state;\n }\n\n getConfig(): Readonly<AgentConfig> {\n return this.config;\n }\n\n /** Mark agent as disposed. Override to add cleanup. */\n dispose(): void {\n this.abort();\n this.state = \"disposed\";\n }\n\n // ─── Abstract Methods (implemented by backends) ───────────────\n\n /** Execute a blocking run. Backend implements the actual LLM call. */\n protected abstract executeRun(\n messages: Message[],\n options: RunOptions | undefined,\n signal: AbortSignal,\n ): Promise<AgentResult>;\n\n /** Execute a structured output run. Backend implements parsing. */\n protected abstract executeRunStructured<T>(\n messages: Message[],\n schema: StructuredOutputConfig<T>,\n options: RunOptions | undefined,\n signal: AbortSignal,\n ): Promise<AgentResult<T>>;\n\n /** Execute a streaming run. Backend yields events. */\n protected abstract executeStream(\n messages: Message[],\n options: RunOptions | undefined,\n signal: AbortSignal,\n ): AsyncIterable<AgentEvent>;\n\n // ─── Usage Enrichment ───────────────────────────────────────────\n\n /** Enrich result usage with model/backend and fire onUsage callback */\n private enrichAndNotifyUsage(result: AgentResult<unknown>): void {\n if (result.usage) {\n result.usage = {\n ...result.usage,\n model: this.config.model,\n backend: this.backendName,\n };\n this.callOnUsage(result.usage);\n }\n }\n\n /** Wrap a stream to enrich usage_update events and fire onUsage callback */\n private async *enrichStream(\n source: AsyncIterable<AgentEvent>,\n ): AsyncIterable<AgentEvent> {\n for await (const event of source) {\n if (event.type === \"usage_update\") {\n const usage: UsageData = {\n promptTokens: event.promptTokens,\n completionTokens: event.completionTokens,\n model: this.config.model,\n backend: this.backendName,\n };\n this.callOnUsage(usage);\n yield { type: \"usage_update\", ...usage };\n } else {\n yield event;\n }\n }\n }\n\n /** Fire onUsage callback (fire-and-forget: errors logged, not propagated) */\n private callOnUsage(usage: UsageData): void {\n if (!this.config.onUsage) return;\n try {\n this.config.onUsage(usage);\n } catch (e) {\n console.warn(\n \"[agent-sdk] onUsage callback error:\",\n e instanceof Error ? e.message : String(e),\n );\n }\n }\n\n // ─── Heartbeat ───────────────────────────────────────────────\n\n /** Wrap a stream to emit heartbeat events at configured intervals.\n * When heartbeatInterval is not set, passes through directly. */\n private async *heartbeatStream(\n source: AsyncIterable<AgentEvent>,\n ): AsyncIterable<AgentEvent> {\n const interval = this.config.heartbeatInterval;\n if (!interval || interval <= 0) {\n yield* source;\n return;\n }\n\n const iterator = source[Symbol.asyncIterator]();\n let pendingEvent: Promise<IteratorResult<AgentEvent>> | null = null;\n let heartbeatResolve: (() => void) | null = null;\n\n const timer = setInterval(() => {\n if (heartbeatResolve) {\n const resolve = heartbeatResolve;\n heartbeatResolve = null;\n resolve();\n }\n }, interval);\n\n try {\n while (true) {\n if (!pendingEvent) {\n pendingEvent = iterator.next();\n }\n\n const heartbeatPromise = new Promise<void>((resolve) => {\n heartbeatResolve = resolve;\n });\n\n const eventDone = pendingEvent.then(\n (r) => ({ kind: \"event\" as const, result: r }),\n );\n const heartbeatDone = heartbeatPromise.then(\n () => ({ kind: \"heartbeat\" as const }),\n );\n\n const winner = await Promise.race([eventDone, heartbeatDone]);\n\n if (winner.kind === \"heartbeat\") {\n yield { type: \"heartbeat\" };\n } else {\n pendingEvent = null;\n heartbeatResolve = null;\n if (winner.result.done) break;\n yield winner.result.value;\n }\n }\n } finally {\n clearInterval(timer);\n heartbeatResolve = null;\n }\n }\n\n // ─── Guards ───────────────────────────────────────────────────\n\n protected guardReentrancy(): void {\n if (this.state === \"running\" || this.state === \"streaming\") {\n throw new ReentrancyError();\n }\n }\n\n protected guardDisposed(): void {\n if (this.state === \"disposed\") {\n throw new DisposedError(\"Agent\");\n }\n }\n\n /** Throw AbortError if signal is already aborted */\n protected checkAbort(signal: AbortSignal): void {\n if (signal.aborted) {\n throw new AbortError();\n }\n }\n\n // ─── Internal Helpers ─────────────────────────────────────────\n\n private createAbortController(externalSignal?: AbortSignal): AbortController {\n const ac = new AbortController();\n this.abortController = ac;\n\n if (externalSignal) {\n if (externalSignal.aborted) {\n ac.abort();\n } else {\n externalSignal.addEventListener(\"abort\", () => ac.abort(), {\n once: true,\n });\n }\n }\n\n return ac;\n }\n}\n","import type { z } from \"zod\";\n\n/** Convert a Zod schema to JSON Schema.\n * Detection order: toJSONSchema() (Zod v4) → jsonSchema() (Zod v3.24+) → _def extraction (Zod v3 legacy). */\nexport function zodToJsonSchema(schema: z.ZodType): Record<string, unknown> {\n const schemaAny = schema as unknown as Record<string, unknown>;\n\n // Zod v4: toJSONSchema()\n if (\"toJSONSchema\" in schema && typeof schemaAny.toJSONSchema === \"function\") {\n return (schemaAny.toJSONSchema as () => Record<string, unknown>)();\n }\n\n // Zod v3.24+: jsonSchema()\n if (\"jsonSchema\" in schema && typeof schemaAny.jsonSchema === \"function\") {\n return (schemaAny.jsonSchema as () => Record<string, unknown>)();\n }\n\n // Zod v3 legacy: _def.typeName extraction\n return extractSchemaFromDef(schema);\n}\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\nfunction extractSchemaFromDef(schema: z.ZodType): Record<string, unknown> {\n const def = (schema as unknown as { _def: Record<string, any> })._def;\n const typeName = def.typeName as string;\n\n switch (typeName) {\n case \"ZodString\":\n return { type: \"string\" };\n case \"ZodNumber\":\n return { type: \"number\" };\n case \"ZodBoolean\":\n return { type: \"boolean\" };\n case \"ZodNull\":\n return { type: \"null\" };\n case \"ZodArray\":\n return {\n type: \"array\",\n items: extractSchemaFromDef(def.type as z.ZodType),\n };\n case \"ZodObject\": {\n const shape = (schema as unknown as { shape: Record<string, z.ZodType> }).shape;\n const properties: Record<string, unknown> = {};\n const required: string[] = [];\n\n for (const [key, value] of Object.entries(shape)) {\n const valueDef = (value as unknown as { _def: Record<string, any> })._def;\n if (valueDef.typeName === \"ZodOptional\") {\n properties[key] = extractSchemaFromDef(valueDef.innerType as z.ZodType);\n } else {\n properties[key] = extractSchemaFromDef(value);\n required.push(key);\n }\n }\n\n return {\n type: \"object\",\n properties,\n ...(required.length > 0 ? { required } : {}),\n };\n }\n case \"ZodOptional\":\n return extractSchemaFromDef(def.innerType as z.ZodType);\n case \"ZodEnum\":\n return { type: \"string\", enum: def.values as string[] };\n default:\n return {};\n }\n}\n/* eslint-enable @typescript-eslint/no-explicit-any */\n","import type { Message, MessageContent } from \"../types.js\";\nimport { getTextContent } from \"../types.js\";\n\n/** Convert our Message[] to a flat prompt string (for CLIs that accept text) */\nexport function messagesToPrompt(messages: Message[]): string {\n return messages\n .map((msg) => {\n switch (msg.role) {\n case \"user\":\n return contentToText(msg.content);\n case \"assistant\":\n return contentToText(msg.content);\n case \"system\":\n return msg.content;\n case \"tool\":\n return msg.content ?? \"\";\n }\n })\n .filter(Boolean)\n .join(\"\\n\\n\");\n}\n\n/** Convert MessageContent to plain text */\nexport function contentToText(content: MessageContent): string {\n return getTextContent(content);\n}\n\n/** Build a system prompt with optional structured output instruction */\nexport function buildSystemPrompt(\n base: string,\n schemaInstruction?: string,\n): string {\n if (!schemaInstruction) return base;\n return `${base}\\n\\n${schemaInstruction}`;\n}\n","import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport * as os from \"node:os\";\nimport type { PermissionScope } from \"./types.js\";\n\n// ─── Interface ──────────────────────────────────────────────────\n\n/** Pluggable store for persisting permission (scope) decisions across runs. */\nexport interface IPermissionStore {\n /** Check if tool is already approved */\n isApproved(toolName: string): Promise<boolean>;\n\n /** Store an approval decision */\n approve(toolName: string, scope: PermissionScope): Promise<void>;\n\n /** Revoke approval for a tool */\n revoke(toolName: string): Promise<void>;\n\n /** Clear all approvals */\n clear(): Promise<void>;\n\n /** Dispose resources */\n dispose(): Promise<void>;\n}\n\n// ─── InMemoryPermissionStore ────────────────────────────────────\n\n/** In-memory store — approvals live until process exits (or dispose). */\nexport class InMemoryPermissionStore implements IPermissionStore {\n private approvals = new Map<string, PermissionScope>();\n\n async isApproved(toolName: string): Promise<boolean> {\n return this.approvals.has(toolName);\n }\n\n async approve(toolName: string, scope: PermissionScope): Promise<void> {\n if (scope === \"once\") return; // \"once\" means don't persist\n this.approvals.set(toolName, scope);\n }\n\n async revoke(toolName: string): Promise<void> {\n this.approvals.delete(toolName);\n }\n\n async clear(): Promise<void> {\n this.approvals.clear();\n }\n\n async dispose(): Promise<void> {\n this.approvals.clear();\n }\n}\n\n// ─── FilePermissionStore ────────────────────────────────────────\n\ninterface FileStoreEntry {\n scope: PermissionScope;\n timestamp: number;\n}\n\ninterface FileStoreData {\n approvals: Record<string, FileStoreEntry>;\n}\n\n/** File-backed store — reads/writes a JSON file for persistent approvals. */\nexport class FilePermissionStore implements IPermissionStore {\n private readonly filePath: string;\n\n constructor(filePath: string) {\n this.filePath = path.resolve(filePath);\n }\n\n async isApproved(toolName: string): Promise<boolean> {\n const data = this.readFile();\n return toolName in data.approvals;\n }\n\n async approve(toolName: string, scope: PermissionScope): Promise<void> {\n if (scope === \"once\") return;\n const data = this.readFile();\n data.approvals[toolName] = { scope, timestamp: Date.now() };\n this.writeFileAtomic(data);\n }\n\n async revoke(toolName: string): Promise<void> {\n const data = this.readFile();\n delete data.approvals[toolName];\n this.writeFileAtomic(data);\n }\n\n async clear(): Promise<void> {\n this.writeFileAtomic({ approvals: {} });\n }\n\n async dispose(): Promise<void> {\n // No resources to release\n }\n\n private readFile(): FileStoreData {\n try {\n const raw = fs.readFileSync(this.filePath, \"utf-8\");\n const parsed = JSON.parse(raw) as FileStoreData;\n if (parsed && typeof parsed.approvals === \"object\") return parsed;\n } catch {\n // File doesn't exist or is invalid — start fresh\n }\n return { approvals: {} };\n }\n\n private writeFileAtomic(data: FileStoreData): void {\n const dir = path.dirname(this.filePath);\n fs.mkdirSync(dir, { recursive: true });\n const tmpPath = this.filePath + `.tmp.${process.pid}.${Date.now()}`;\n fs.writeFileSync(tmpPath, JSON.stringify(data, null, 2), \"utf-8\");\n fs.renameSync(tmpPath, this.filePath);\n }\n}\n\n// ─── CompositePermissionStore ───────────────────────────────────\n\n/**\n * Composes multiple stores — checks in order, routes writes by scope.\n *\n * - \"session\" → sessionStore (in-memory)\n * - \"project\" → projectStore (file-based in project directory)\n * - \"always\" → userStore (file-based in user home)\n */\nexport class CompositePermissionStore implements IPermissionStore {\n private readonly sessionStore: IPermissionStore;\n private readonly projectStore: IPermissionStore;\n private readonly userStore: IPermissionStore;\n\n constructor(\n sessionStore: IPermissionStore,\n projectStore: IPermissionStore,\n userStore?: IPermissionStore,\n ) {\n this.sessionStore = sessionStore;\n this.projectStore = projectStore;\n this.userStore = userStore ?? projectStore;\n }\n\n async isApproved(toolName: string): Promise<boolean> {\n return (\n (await this.sessionStore.isApproved(toolName)) ||\n (await this.projectStore.isApproved(toolName)) ||\n (await this.userStore.isApproved(toolName))\n );\n }\n\n async approve(toolName: string, scope: PermissionScope): Promise<void> {\n if (scope === \"once\") return;\n if (scope === \"session\") {\n await this.sessionStore.approve(toolName, scope);\n } else if (scope === \"project\") {\n await this.projectStore.approve(toolName, scope);\n } else {\n // \"always\" → user-level store\n await this.userStore.approve(toolName, scope);\n }\n }\n\n async revoke(toolName: string): Promise<void> {\n await this.sessionStore.revoke(toolName);\n await this.projectStore.revoke(toolName);\n await this.userStore.revoke(toolName);\n }\n\n async clear(): Promise<void> {\n await this.sessionStore.clear();\n await this.projectStore.clear();\n await this.userStore.clear();\n }\n\n async dispose(): Promise<void> {\n await this.sessionStore.dispose();\n await this.projectStore.dispose();\n if (this.userStore !== this.projectStore) {\n await this.userStore.dispose();\n }\n }\n}\n\n// ─── Helpers ────────────────────────────────────────────────────\n\n/** Create a default composite store with separate project and user-level persistence. */\nexport function createDefaultPermissionStore(\n projectDir?: string,\n): CompositePermissionStore {\n const sessionStore = new InMemoryPermissionStore();\n const projectPath = projectDir\n ? path.join(projectDir, \".agent-sdk\", \"permissions.json\")\n : path.join(process.cwd(), \".agent-sdk\", \"permissions.json\");\n const userPath = path.join(os.homedir(), \".agent-sdk\", \"permissions.json\");\n const projectStore = new FilePermissionStore(projectPath);\n const userStore = new FilePermissionStore(userPath);\n return new CompositePermissionStore(sessionStore, projectStore, userStore);\n}\n"]}
package/dist/index.d.cts CHANGED
@@ -165,16 +165,28 @@ interface StructuredOutputConfig<T = unknown> {
165
165
  name?: string;
166
166
  description?: string;
167
167
  }
168
+ /** Usage data from LLM execution — tokens consumed plus optional metadata */
169
+ interface UsageData {
170
+ promptTokens: number;
171
+ completionTokens: number;
172
+ model?: string;
173
+ backend?: string;
174
+ }
168
175
  /** Events emitted during streaming agent execution */
169
176
  type AgentEvent = {
170
177
  type: "text_delta";
171
178
  text: string;
179
+ } | {
180
+ type: "thinking_delta";
181
+ text: string;
172
182
  } | {
173
183
  type: "tool_call_start";
184
+ toolCallId: string;
174
185
  toolName: string;
175
186
  args: JSONValue;
176
187
  } | {
177
188
  type: "tool_call_end";
189
+ toolCallId: string;
178
190
  toolName: string;
179
191
  result: JSONValue;
180
192
  } | {
@@ -198,6 +210,10 @@ type AgentEvent = {
198
210
  type: "usage_update";
199
211
  promptTokens: number;
200
212
  completionTokens: number;
213
+ model?: string;
214
+ backend?: string;
215
+ } | {
216
+ type: "heartbeat";
201
217
  } | {
202
218
  type: "error";
203
219
  error: string;
@@ -262,6 +278,13 @@ interface AgentConfig {
262
278
  /** Filter for backend built-in tools (e.g. ["web_search", "web_fetch"] for Copilot).
263
279
  * When set, only listed built-in tools are available. Backend-specific. */
264
280
  availableTools?: string[];
281
+ /** Callback invoked with usage data after run completion or during streaming.
282
+ * Fire-and-forget: errors are logged but not propagated. */
283
+ onUsage?: (usage: UsageData) => void;
284
+ /** Interval in milliseconds for emitting heartbeat events during streaming.
285
+ * When set, heartbeat events are emitted to keep the stream alive during
286
+ * long tool executions. Default: off (no heartbeats). */
287
+ heartbeatInterval?: number;
265
288
  }
266
289
  /** Result of an agent run, generic over structured output type T */
267
290
  interface AgentResult<T = void> {
@@ -274,21 +297,27 @@ interface AgentResult<T = void> {
274
297
  approved: boolean;
275
298
  }>;
276
299
  messages: Message[];
277
- usage?: {
278
- promptTokens: number;
279
- completionTokens: number;
280
- };
300
+ usage?: UsageData;
281
301
  }
282
302
  /** Agent lifecycle state */
283
303
  type AgentState = "idle" | "running" | "streaming" | "disposed";
284
304
  /** Core agent interface — run prompts, stream events, manage lifecycle */
285
305
  interface IAgent {
306
+ /** Run a single prompt and return the result. Wraps prompt in a user message. */
286
307
  run(prompt: MessageContent, options?: RunOptions): Promise<AgentResult>;
308
+ /** Run with full conversation history. Messages are passed directly to the backend. */
287
309
  runWithContext(messages: Message[], options?: RunOptions): Promise<AgentResult>;
310
+ /** Run with structured output validated against a Zod schema. */
288
311
  runStructured<T>(prompt: MessageContent, schema: StructuredOutputConfig<T>, options?: RunOptions): Promise<AgentResult<T>>;
312
+ /** Stream events for a single prompt. Wraps prompt in a user message. */
289
313
  stream(prompt: MessageContent, options?: RunOptions): AsyncIterable<AgentEvent>;
314
+ /** Stream events with full conversation history. Messages are passed directly to the backend. */
315
+ streamWithContext(messages: Message[], options?: RunOptions): AsyncIterable<AgentEvent>;
316
+ /** Abort the current operation. No-op if not running. */
290
317
  abort(): void;
318
+ /** Get current agent lifecycle state. */
291
319
  getState(): AgentState;
320
+ /** Get frozen agent configuration. */
292
321
  getConfig(): Readonly<AgentConfig>;
293
322
  /** Release resources. After dispose(), agent must not be used. */
294
323
  dispose(): void;
@@ -415,11 +444,14 @@ declare abstract class BaseAgent implements IAgent {
415
444
  protected state: AgentState;
416
445
  protected abortController: AbortController | null;
417
446
  protected readonly config: AgentConfig;
447
+ /** Backend identifier (e.g. "copilot", "claude", "vercel-ai") */
448
+ protected abstract readonly backendName: string;
418
449
  constructor(config: AgentConfig);
419
450
  run(prompt: MessageContent, options?: RunOptions): Promise<AgentResult>;
420
451
  runWithContext(messages: Message[], options?: RunOptions): Promise<AgentResult>;
421
452
  runStructured<T>(prompt: MessageContent, schema: StructuredOutputConfig<T>, options?: RunOptions): Promise<AgentResult<T>>;
422
453
  stream(prompt: MessageContent, options?: RunOptions): AsyncIterable<AgentEvent>;
454
+ streamWithContext(messages: Message[], options?: RunOptions): AsyncIterable<AgentEvent>;
423
455
  abort(): void;
424
456
  getState(): AgentState;
425
457
  getConfig(): Readonly<AgentConfig>;
@@ -431,6 +463,15 @@ declare abstract class BaseAgent implements IAgent {
431
463
  protected abstract executeRunStructured<T>(messages: Message[], schema: StructuredOutputConfig<T>, options: RunOptions | undefined, signal: AbortSignal): Promise<AgentResult<T>>;
432
464
  /** Execute a streaming run. Backend yields events. */
433
465
  protected abstract executeStream(messages: Message[], options: RunOptions | undefined, signal: AbortSignal): AsyncIterable<AgentEvent>;
466
+ /** Enrich result usage with model/backend and fire onUsage callback */
467
+ private enrichAndNotifyUsage;
468
+ /** Wrap a stream to enrich usage_update events and fire onUsage callback */
469
+ private enrichStream;
470
+ /** Fire onUsage callback (fire-and-forget: errors logged, not propagated) */
471
+ private callOnUsage;
472
+ /** Wrap a stream to emit heartbeat events at configured intervals.
473
+ * When heartbeatInterval is not set, passes through directly. */
474
+ private heartbeatStream;
434
475
  protected guardReentrancy(): void;
435
476
  protected guardDisposed(): void;
436
477
  /** Throw AbortError if signal is already aborted */
@@ -439,7 +480,7 @@ declare abstract class BaseAgent implements IAgent {
439
480
  }
440
481
 
441
482
  /** Convert a Zod schema to JSON Schema.
442
- * Uses zod's built-in jsonSchema() if available, falls back to _def extraction. */
483
+ * Detection order: toJSONSchema() (Zod v4) jsonSchema() (Zod v3.24+) _def extraction (Zod v3 legacy). */
443
484
  declare function zodToJsonSchema(schema: z.ZodType): Record<string, unknown>;
444
485
 
445
486
  /** Convert our Message[] to a flat prompt string (for CLIs that accept text) */
@@ -449,4 +490,4 @@ declare function contentToText(content: MessageContent): string;
449
490
  /** Build a system prompt with optional structured output instruction */
450
491
  declare function buildSystemPrompt(base: string, schemaInstruction?: string): string;
451
492
 
452
- export { AbortError, type AgentConfig, type AgentEvent, type AgentResult, AgentSDKError, type AgentState, BackendAlreadyRegisteredError, type BackendFactory, BackendNotFoundError, type BackendOptionsMap, BaseAgent, type BuiltinBackendName, type ClaudeBackendOptions, CompositePermissionStore, type ContentPart, type CopilotBackendOptions, DependencyError, DisposedError, type ErrorHandlingConfig, FilePermissionStore, type IAgent, type IAgentService, type IPermissionStore, InMemoryPermissionStore, type JSONValue, type Message, type MessageContent, type ModelInfo, type ModelParams, type PermissionCallback, type PermissionDecision, type PermissionRequest, type PermissionScope, ReentrancyError, type RunOptions, type StructuredOutputConfig, StructuredOutputError, SubprocessError, type SupervisorHooks, type TimeoutConfig, type ToolCall, type ToolDeclaration, type ToolDefinition, ToolExecutionError, type ToolResult, type UserInputRequest, type UserInputResponse, type ValidationResult, type VercelAIBackendOptions, buildSystemPrompt, contentToText, createAgentService, createDefaultPermissionStore, getTextContent, hasBackend, isMultiPartContent, isTextContent, isToolDefinition, listBackends, messagesToPrompt, registerBackend, resetRegistry, unregisterBackend, zodToJsonSchema };
493
+ export { AbortError, type AgentConfig, type AgentEvent, type AgentResult, AgentSDKError, type AgentState, BackendAlreadyRegisteredError, type BackendFactory, BackendNotFoundError, type BackendOptionsMap, BaseAgent, type BuiltinBackendName, type ClaudeBackendOptions, CompositePermissionStore, type ContentPart, type CopilotBackendOptions, DependencyError, DisposedError, type ErrorHandlingConfig, FilePermissionStore, type IAgent, type IAgentService, type IPermissionStore, InMemoryPermissionStore, type JSONValue, type Message, type MessageContent, type ModelInfo, type ModelParams, type PermissionCallback, type PermissionDecision, type PermissionRequest, type PermissionScope, ReentrancyError, type RunOptions, type StructuredOutputConfig, StructuredOutputError, SubprocessError, type SupervisorHooks, type TimeoutConfig, type ToolCall, type ToolDeclaration, type ToolDefinition, ToolExecutionError, type ToolResult, type UsageData, type UserInputRequest, type UserInputResponse, type ValidationResult, type VercelAIBackendOptions, buildSystemPrompt, contentToText, createAgentService, createDefaultPermissionStore, getTextContent, hasBackend, isMultiPartContent, isTextContent, isToolDefinition, listBackends, messagesToPrompt, registerBackend, resetRegistry, unregisterBackend, zodToJsonSchema };
package/dist/index.d.ts CHANGED
@@ -165,16 +165,28 @@ interface StructuredOutputConfig<T = unknown> {
165
165
  name?: string;
166
166
  description?: string;
167
167
  }
168
+ /** Usage data from LLM execution — tokens consumed plus optional metadata */
169
+ interface UsageData {
170
+ promptTokens: number;
171
+ completionTokens: number;
172
+ model?: string;
173
+ backend?: string;
174
+ }
168
175
  /** Events emitted during streaming agent execution */
169
176
  type AgentEvent = {
170
177
  type: "text_delta";
171
178
  text: string;
179
+ } | {
180
+ type: "thinking_delta";
181
+ text: string;
172
182
  } | {
173
183
  type: "tool_call_start";
184
+ toolCallId: string;
174
185
  toolName: string;
175
186
  args: JSONValue;
176
187
  } | {
177
188
  type: "tool_call_end";
189
+ toolCallId: string;
178
190
  toolName: string;
179
191
  result: JSONValue;
180
192
  } | {
@@ -198,6 +210,10 @@ type AgentEvent = {
198
210
  type: "usage_update";
199
211
  promptTokens: number;
200
212
  completionTokens: number;
213
+ model?: string;
214
+ backend?: string;
215
+ } | {
216
+ type: "heartbeat";
201
217
  } | {
202
218
  type: "error";
203
219
  error: string;
@@ -262,6 +278,13 @@ interface AgentConfig {
262
278
  /** Filter for backend built-in tools (e.g. ["web_search", "web_fetch"] for Copilot).
263
279
  * When set, only listed built-in tools are available. Backend-specific. */
264
280
  availableTools?: string[];
281
+ /** Callback invoked with usage data after run completion or during streaming.
282
+ * Fire-and-forget: errors are logged but not propagated. */
283
+ onUsage?: (usage: UsageData) => void;
284
+ /** Interval in milliseconds for emitting heartbeat events during streaming.
285
+ * When set, heartbeat events are emitted to keep the stream alive during
286
+ * long tool executions. Default: off (no heartbeats). */
287
+ heartbeatInterval?: number;
265
288
  }
266
289
  /** Result of an agent run, generic over structured output type T */
267
290
  interface AgentResult<T = void> {
@@ -274,21 +297,27 @@ interface AgentResult<T = void> {
274
297
  approved: boolean;
275
298
  }>;
276
299
  messages: Message[];
277
- usage?: {
278
- promptTokens: number;
279
- completionTokens: number;
280
- };
300
+ usage?: UsageData;
281
301
  }
282
302
  /** Agent lifecycle state */
283
303
  type AgentState = "idle" | "running" | "streaming" | "disposed";
284
304
  /** Core agent interface — run prompts, stream events, manage lifecycle */
285
305
  interface IAgent {
306
+ /** Run a single prompt and return the result. Wraps prompt in a user message. */
286
307
  run(prompt: MessageContent, options?: RunOptions): Promise<AgentResult>;
308
+ /** Run with full conversation history. Messages are passed directly to the backend. */
287
309
  runWithContext(messages: Message[], options?: RunOptions): Promise<AgentResult>;
310
+ /** Run with structured output validated against a Zod schema. */
288
311
  runStructured<T>(prompt: MessageContent, schema: StructuredOutputConfig<T>, options?: RunOptions): Promise<AgentResult<T>>;
312
+ /** Stream events for a single prompt. Wraps prompt in a user message. */
289
313
  stream(prompt: MessageContent, options?: RunOptions): AsyncIterable<AgentEvent>;
314
+ /** Stream events with full conversation history. Messages are passed directly to the backend. */
315
+ streamWithContext(messages: Message[], options?: RunOptions): AsyncIterable<AgentEvent>;
316
+ /** Abort the current operation. No-op if not running. */
290
317
  abort(): void;
318
+ /** Get current agent lifecycle state. */
291
319
  getState(): AgentState;
320
+ /** Get frozen agent configuration. */
292
321
  getConfig(): Readonly<AgentConfig>;
293
322
  /** Release resources. After dispose(), agent must not be used. */
294
323
  dispose(): void;
@@ -415,11 +444,14 @@ declare abstract class BaseAgent implements IAgent {
415
444
  protected state: AgentState;
416
445
  protected abortController: AbortController | null;
417
446
  protected readonly config: AgentConfig;
447
+ /** Backend identifier (e.g. "copilot", "claude", "vercel-ai") */
448
+ protected abstract readonly backendName: string;
418
449
  constructor(config: AgentConfig);
419
450
  run(prompt: MessageContent, options?: RunOptions): Promise<AgentResult>;
420
451
  runWithContext(messages: Message[], options?: RunOptions): Promise<AgentResult>;
421
452
  runStructured<T>(prompt: MessageContent, schema: StructuredOutputConfig<T>, options?: RunOptions): Promise<AgentResult<T>>;
422
453
  stream(prompt: MessageContent, options?: RunOptions): AsyncIterable<AgentEvent>;
454
+ streamWithContext(messages: Message[], options?: RunOptions): AsyncIterable<AgentEvent>;
423
455
  abort(): void;
424
456
  getState(): AgentState;
425
457
  getConfig(): Readonly<AgentConfig>;
@@ -431,6 +463,15 @@ declare abstract class BaseAgent implements IAgent {
431
463
  protected abstract executeRunStructured<T>(messages: Message[], schema: StructuredOutputConfig<T>, options: RunOptions | undefined, signal: AbortSignal): Promise<AgentResult<T>>;
432
464
  /** Execute a streaming run. Backend yields events. */
433
465
  protected abstract executeStream(messages: Message[], options: RunOptions | undefined, signal: AbortSignal): AsyncIterable<AgentEvent>;
466
+ /** Enrich result usage with model/backend and fire onUsage callback */
467
+ private enrichAndNotifyUsage;
468
+ /** Wrap a stream to enrich usage_update events and fire onUsage callback */
469
+ private enrichStream;
470
+ /** Fire onUsage callback (fire-and-forget: errors logged, not propagated) */
471
+ private callOnUsage;
472
+ /** Wrap a stream to emit heartbeat events at configured intervals.
473
+ * When heartbeatInterval is not set, passes through directly. */
474
+ private heartbeatStream;
434
475
  protected guardReentrancy(): void;
435
476
  protected guardDisposed(): void;
436
477
  /** Throw AbortError if signal is already aborted */
@@ -439,7 +480,7 @@ declare abstract class BaseAgent implements IAgent {
439
480
  }
440
481
 
441
482
  /** Convert a Zod schema to JSON Schema.
442
- * Uses zod's built-in jsonSchema() if available, falls back to _def extraction. */
483
+ * Detection order: toJSONSchema() (Zod v4) jsonSchema() (Zod v3.24+) _def extraction (Zod v3 legacy). */
443
484
  declare function zodToJsonSchema(schema: z.ZodType): Record<string, unknown>;
444
485
 
445
486
  /** Convert our Message[] to a flat prompt string (for CLIs that accept text) */
@@ -449,4 +490,4 @@ declare function contentToText(content: MessageContent): string;
449
490
  /** Build a system prompt with optional structured output instruction */
450
491
  declare function buildSystemPrompt(base: string, schemaInstruction?: string): string;
451
492
 
452
- export { AbortError, type AgentConfig, type AgentEvent, type AgentResult, AgentSDKError, type AgentState, BackendAlreadyRegisteredError, type BackendFactory, BackendNotFoundError, type BackendOptionsMap, BaseAgent, type BuiltinBackendName, type ClaudeBackendOptions, CompositePermissionStore, type ContentPart, type CopilotBackendOptions, DependencyError, DisposedError, type ErrorHandlingConfig, FilePermissionStore, type IAgent, type IAgentService, type IPermissionStore, InMemoryPermissionStore, type JSONValue, type Message, type MessageContent, type ModelInfo, type ModelParams, type PermissionCallback, type PermissionDecision, type PermissionRequest, type PermissionScope, ReentrancyError, type RunOptions, type StructuredOutputConfig, StructuredOutputError, SubprocessError, type SupervisorHooks, type TimeoutConfig, type ToolCall, type ToolDeclaration, type ToolDefinition, ToolExecutionError, type ToolResult, type UserInputRequest, type UserInputResponse, type ValidationResult, type VercelAIBackendOptions, buildSystemPrompt, contentToText, createAgentService, createDefaultPermissionStore, getTextContent, hasBackend, isMultiPartContent, isTextContent, isToolDefinition, listBackends, messagesToPrompt, registerBackend, resetRegistry, unregisterBackend, zodToJsonSchema };
493
+ export { AbortError, type AgentConfig, type AgentEvent, type AgentResult, AgentSDKError, type AgentState, BackendAlreadyRegisteredError, type BackendFactory, BackendNotFoundError, type BackendOptionsMap, BaseAgent, type BuiltinBackendName, type ClaudeBackendOptions, CompositePermissionStore, type ContentPart, type CopilotBackendOptions, DependencyError, DisposedError, type ErrorHandlingConfig, FilePermissionStore, type IAgent, type IAgentService, type IPermissionStore, InMemoryPermissionStore, type JSONValue, type Message, type MessageContent, type ModelInfo, type ModelParams, type PermissionCallback, type PermissionDecision, type PermissionRequest, type PermissionScope, ReentrancyError, type RunOptions, type StructuredOutputConfig, StructuredOutputError, SubprocessError, type SupervisorHooks, type TimeoutConfig, type ToolCall, type ToolDeclaration, type ToolDefinition, ToolExecutionError, type ToolResult, type UsageData, type UserInputRequest, type UserInputResponse, type ValidationResult, type VercelAIBackendOptions, buildSystemPrompt, contentToText, createAgentService, createDefaultPermissionStore, getTextContent, hasBackend, isMultiPartContent, isTextContent, isToolDefinition, listBackends, messagesToPrompt, registerBackend, resetRegistry, unregisterBackend, zodToJsonSchema };