@witqq/agent-sdk 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +91 -8
- package/dist/backends/claude.cjs +160 -8
- package/dist/backends/claude.cjs.map +1 -1
- package/dist/backends/claude.d.cts +1 -1
- package/dist/backends/claude.d.ts +1 -1
- package/dist/backends/claude.js +160 -8
- package/dist/backends/claude.js.map +1 -1
- package/dist/backends/copilot.cjs +140 -10
- package/dist/backends/copilot.cjs.map +1 -1
- package/dist/backends/copilot.d.cts +3 -1
- package/dist/backends/copilot.d.ts +3 -1
- package/dist/backends/copilot.js +140 -10
- package/dist/backends/copilot.js.map +1 -1
- package/dist/backends/vercel-ai.cjs +117 -5
- package/dist/backends/vercel-ai.cjs.map +1 -1
- package/dist/backends/vercel-ai.d.cts +1 -1
- package/dist/backends/vercel-ai.d.ts +1 -1
- package/dist/backends/vercel-ai.js +117 -5
- package/dist/backends/vercel-ai.js.map +1 -1
- package/dist/index.cjs +113 -4
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +54 -5
- package/dist/index.d.ts +54 -5
- package/dist/index.js +113 -4
- package/dist/index.js.map +1 -1
- package/dist/{types-JVBEqeDw.d.cts → types-CBzhRrN9.d.cts} +41 -4
- package/dist/{types-JVBEqeDw.d.ts → types-CBzhRrN9.d.ts} +41 -4
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/types.ts","../../src/errors.ts","../../src/base-agent.ts","../../src/utils/schema.ts","../../src/backends/copilot.ts"],"names":[],"mappings":"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","file":"copilot.js","sourcesContent":["import type { z } from \"zod\";\nimport type { IPermissionStore } from \"./permission-store.js\";\n\n// ─── JSON Value ────────────────────────────────────────────────\n\n/** JSON-serializable value used for tool arguments and results */\nexport type JSONValue =\n | string\n | number\n | boolean\n | null\n | JSONValue[]\n | { [key: string]: JSONValue };\n\n// ─── Message Content ───────────────────────────────────────────\n\n/** Message content — plain string or array of text/image parts */\nexport type MessageContent = string | Array<ContentPart>;\n\n/** Individual content part within a multi-part message */\nexport type ContentPart =\n | { type: \"text\"; text: string }\n | { type: \"image\"; data: string; mimeType: string };\n\n// ─── Tool System (B1: Declaration/Definition split) ────────────\n\n/** What the LLM sees — name, description, schema. Passed to all backends. */\nexport interface ToolDeclaration<TParams = unknown> {\n name: string;\n description: string;\n parameters: z.ZodType<TParams>;\n needsApproval?: boolean;\n metadata?: {\n category?: string;\n icon?: string;\n tags?: string[];\n };\n}\n\n/** Full tool with execute function. Required for API-based backends.\n * CLI backends extract declaration; execute map held internally. */\nexport interface ToolDefinition<TParams = unknown>\n extends ToolDeclaration<TParams> {\n execute: (params: TParams) => Promise<JSONValue> | JSONValue;\n}\n\n// ─── Tool Calls / Results ──────────────────────────────────────\n\n/** A tool call made by the LLM during execution */\nexport interface ToolCall {\n id: string;\n name: string;\n args: JSONValue;\n}\n\n/** Result of executing a tool call */\nexport interface ToolResult {\n toolCallId: string;\n name: string;\n result: JSONValue;\n isError?: boolean;\n}\n\n// ─── Messages (Discriminated Union) ────────────────────────────\n\n/** Conversation message — discriminated union on `role` */\nexport type Message =\n | { role: \"user\"; content: MessageContent }\n | { role: \"assistant\"; content: MessageContent; toolCalls?: ToolCall[] }\n | { role: \"tool\"; content?: string; toolResults: ToolResult[] }\n | { role: \"system\"; content: string };\n\n// ─── Permission System (v3.1 with scopes) ──────────────────────\n\n/** Scope for \"remember this decision\" */\nexport type PermissionScope = \"once\" | \"session\" | \"project\" | \"always\";\n\n/** What the permission callback receives */\nexport interface PermissionRequest {\n toolName: string;\n toolArgs: Record<string, unknown>;\n /** SDK-suggested scope (from Claude CLI's suggestions) */\n suggestedScope?: PermissionScope;\n /** Original SDK permission request (for pass-through) */\n rawSDKRequest?: unknown;\n}\n\n/** What the permission callback returns */\nexport interface PermissionDecision {\n allowed: boolean;\n /** How long to remember this decision */\n scope?: PermissionScope;\n /** Modified tool arguments (tool args may be altered by user) */\n modifiedInput?: Record<string, unknown>;\n /** Denial reason (if denied) */\n reason?: string;\n}\n\n/** Permission callback signature */\nexport type PermissionCallback = (\n request: PermissionRequest,\n signal: AbortSignal,\n) => Promise<PermissionDecision>;\n\n// ─── User Input (Ask User) ────────────────────────────────────\n\n/** Request for user input — separate from permissions */\nexport interface UserInputRequest {\n question: string;\n choices?: string[];\n /** Whether to allow freeform text input (default: true) */\n allowFreeform?: boolean;\n}\n\n/** Response from user to an input request */\nexport interface UserInputResponse {\n answer: string;\n /** true if user typed a custom answer instead of selecting a choice */\n wasFreeform: boolean;\n /** Index of selected choice (if choice was selected) */\n selectedChoiceIndex?: number;\n}\n\n// ─── Supervisor Hooks ──────────────────────────────────────────\n\n/** Hooks for supervisor/UI to intercept agent actions */\nexport interface SupervisorHooks {\n onPermission?: PermissionCallback;\n onAskUser?: (\n request: UserInputRequest,\n signal: AbortSignal,\n ) => Promise<UserInputResponse>;\n}\n\n// ─── Structured Output ─────────────────────────────────────────\n\n/** Configuration for typed structured output from LLM */\nexport interface StructuredOutputConfig<T = unknown> {\n schema: z.ZodType<T>;\n name?: string;\n description?: string;\n}\n\n// ─── 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 MessageContent,\n RunOptions,\n StructuredOutputConfig,\n ToolDefinition,\n CopilotBackendOptions,\n ModelInfo,\n ValidationResult,\n JSONValue,\n PermissionRequest as UnifiedPermissionRequest,\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 { CopilotBackendOptions } from \"../types.js\";\n\n// ─── Local Type Definitions (matching @github/copilot-sdk shapes) ───\n// Avoids requiring the SDK to be installed at compile time.\n\n/** @internal */\ninterface SDKClientOptions {\n cliPath?: string;\n cwd?: string;\n useStdio?: boolean;\n autoStart?: boolean;\n autoRestart?: boolean;\n logLevel?: string;\n githubToken?: string;\n useLoggedInUser?: boolean;\n}\n\n/** @internal */\ninterface SDKTool {\n name: string;\n description?: string;\n parameters?: Record<string, unknown>;\n handler: (\n args: unknown,\n invocation: {\n sessionId: string;\n toolCallId: string;\n toolName: string;\n arguments: unknown;\n },\n ) => Promise<unknown> | unknown;\n}\n\n/** @internal */\ninterface SDKPermissionRequest {\n kind: string;\n toolCallId?: string;\n [key: string]: unknown;\n}\n\n/** @internal */\ninterface SDKPermissionResult {\n kind:\n | \"approved\"\n | \"denied-by-rules\"\n | \"denied-no-approval-rule-and-could-not-request-from-user\"\n | \"denied-interactively-by-user\";\n}\n\n/** @internal */\ninterface SDKUserInputRequest {\n question: string;\n choices?: string[];\n allowFreeform?: boolean;\n}\n\n/** @internal */\ninterface SDKUserInputResponse {\n answer: string;\n wasFreeform: boolean;\n}\n\n/** @internal */\ninterface SDKSessionConfig {\n model?: string;\n tools?: SDKTool[];\n systemMessage?: { mode: \"append\" | \"replace\"; content: string };\n onPermissionRequest?: (\n request: SDKPermissionRequest,\n ctx: { sessionId: string },\n ) => Promise<SDKPermissionResult> | SDKPermissionResult;\n onUserInputRequest?: (\n request: SDKUserInputRequest,\n ctx: { sessionId: string },\n ) => Promise<SDKUserInputResponse> | SDKUserInputResponse;\n streaming?: boolean;\n workingDirectory?: string;\n}\n\n/** @internal */\ninterface SDKSessionEvent {\n id: string;\n timestamp: string;\n parentId: string | null;\n ephemeral?: boolean;\n type: string;\n data: Record<string, unknown>;\n}\n\n/** @internal */\ninterface SDKAssistantMessageData {\n messageId: string;\n content: string;\n}\n\n/** @internal */\ninterface SDKSession {\n readonly sessionId: string;\n on(handler: (event: SDKSessionEvent) => void): () => void;\n send(options: { prompt: string }): Promise<string>;\n sendAndWait(\n options: { prompt: string },\n timeout?: number,\n ): Promise<\n | { type: \"assistant.message\"; data: SDKAssistantMessageData }\n | undefined\n >;\n destroy(): Promise<void>;\n abort(): Promise<void>;\n}\n\n/** @internal */\ninterface SDKModelInfo {\n id: string;\n name: string;\n}\n\n/** @internal */\ninterface SDKClient {\n start(): Promise<void>;\n stop(): Promise<Error[]>;\n getState(): string;\n createSession(config?: SDKSessionConfig): Promise<SDKSession>;\n listModels(): Promise<SDKModelInfo[]>;\n getAuthStatus(): Promise<{ isAuthenticated: boolean }>;\n}\n\n// ─── Dynamic SDK Loader ─────────────────────────────────────────\n\nlet sdkModule: {\n CopilotClient: new (options?: SDKClientOptions) => SDKClient;\n} | null = null;\n\nasync function loadSDK(): Promise<\n NonNullable<typeof sdkModule>\n> {\n if (sdkModule) return sdkModule;\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/ban-ts-comment\n // @ts-ignore — peer dependency, not present at compile time\n sdkModule = (await import(\"@github/copilot-sdk\")) as any;\n return sdkModule!;\n } catch {\n throw new SubprocessError(\n \"@github/copilot-sdk is not installed. Install it: npm install @github/copilot-sdk\",\n );\n }\n}\n\n/** @internal For testing: inject mock SDK module */\nexport function _injectSDK(\n mock: typeof sdkModule,\n): void {\n sdkModule = mock;\n}\n\n/** @internal For testing: reset injected SDK */\nexport function _resetSDK(): void {\n sdkModule = null;\n}\n\n// ─── Tool Mapping ───────────────────────────────────────────────\n\nfunction mapToolsToSDK(tools: ToolDefinition[]): SDKTool[] {\n return tools.map((tool) => ({\n name: tool.name,\n description: tool.description,\n parameters: zodToJsonSchema(tool.parameters),\n handler: async (args: unknown): Promise<unknown> => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const result = await tool.execute(args as any);\n return typeof result === \"string\" ? result : JSON.stringify(result);\n },\n }));\n}\n\n// ─── Permission Mapping ─────────────────────────────────────────\n\nfunction buildPermissionHandler(\n config: AgentConfig,\n): SDKSessionConfig[\"onPermissionRequest\"] | undefined {\n const onPermission = config.supervisor?.onPermission;\n if (!onPermission) return undefined;\n\n const permissionStore = config.permissionStore;\n\n return async (\n request: SDKPermissionRequest,\n ): Promise<SDKPermissionResult> => {\n const toolName = String(request.kind);\n\n // Check store first — if already approved, skip callback\n if (permissionStore && await permissionStore.isApproved(toolName)) {\n return { kind: \"approved\" };\n }\n\n const unifiedRequest: UnifiedPermissionRequest = {\n toolName,\n toolArgs: { ...request } as Record<string, unknown>,\n rawSDKRequest: request,\n };\n\n const ac = new AbortController();\n const decision = await onPermission(unifiedRequest, ac.signal);\n\n if (decision.allowed) {\n // Persist approval to store\n if (permissionStore && decision.scope) {\n await permissionStore.approve(toolName, decision.scope);\n }\n return { kind: \"approved\" };\n }\n\n return { kind: \"denied-interactively-by-user\" };\n };\n}\n\n// ─── User Input Mapping ─────────────────────────────────────────\n\nfunction buildUserInputHandler(\n config: AgentConfig,\n): SDKSessionConfig[\"onUserInputRequest\"] | undefined {\n const onAskUser = config.supervisor?.onAskUser;\n if (!onAskUser) return undefined;\n\n return async (\n request: SDKUserInputRequest,\n ): Promise<SDKUserInputResponse> => {\n const ac = new AbortController();\n const response = await onAskUser(\n {\n question: request.question,\n choices: request.choices,\n allowFreeform: request.allowFreeform,\n },\n ac.signal,\n );\n return { answer: response.answer, wasFreeform: response.wasFreeform };\n };\n}\n\n// ─── Event Mapping ──────────────────────────────────────────────\n\n/**\n * Tracks tool call IDs to tool names.\n *\n * The Copilot SDK's `tool.execution_complete` event only includes `toolCallId`\n * but not `toolName`. We capture the name from `tool.execution_start` events\n * (which include both) and look it up when mapping completion events to unified\n * `AgentEvent` objects and collecting `AgentResult.toolCalls`.\n */\nclass ToolCallTracker {\n private map = new Map<string, { toolName: string; args: JSONValue }>();\n\n trackStart(toolCallId: string, toolName: string, args: JSONValue): void {\n this.map.set(toolCallId, { toolName, args });\n }\n\n getInfo(\n toolCallId: string,\n ): { toolName: string; args: JSONValue } | undefined {\n return this.map.get(toolCallId);\n }\n\n clear(): void {\n this.map.clear();\n }\n}\n\n/**\n * Tracks whether we are inside a thinking (reasoning) block so we can emit\n * `thinking_end` when the block finishes. The Copilot SDK has no explicit\n * \"reasoning end\" event, so we detect the transition by observing the first\n * non-reasoning event after a reasoning event.\n */\nclass ThinkingTracker {\n private active = false;\n\n isActive(): boolean {\n return this.active;\n }\n\n startThinking(): void {\n this.active = true;\n }\n\n /** Returns true if thinking was active and is now ended. */\n endThinking(): boolean {\n if (!this.active) return false;\n this.active = false;\n return true;\n }\n}\n\nfunction mapSessionEvent(\n event: SDKSessionEvent,\n tracker: ToolCallTracker,\n thinkingTracker: ThinkingTracker,\n): AgentEvent | AgentEvent[] | null {\n const data = event.data;\n\n switch (event.type) {\n case \"assistant.message_delta\": {\n const textEvent: AgentEvent = {\n type: \"text_delta\",\n text: String(data.deltaContent ?? \"\"),\n };\n // Emit thinking_end before the first text_delta after reasoning\n if (thinkingTracker.endThinking()) {\n return [{ type: \"thinking_end\" }, textEvent];\n }\n return textEvent;\n }\n\n case \"assistant.reasoning\":\n case \"assistant.reasoning_delta\":\n if (!thinkingTracker.isActive()) {\n thinkingTracker.startThinking();\n return { type: \"thinking_start\" };\n }\n return null;\n\n case \"tool.execution_start\": {\n const toolCallId = String(data.toolCallId ?? \"\");\n const toolName = String(data.toolName ?? \"unknown\");\n const args = (data.arguments as JSONValue) ?? {};\n tracker.trackStart(toolCallId, toolName, args);\n const toolStartEvent: AgentEvent = { type: \"tool_call_start\", toolName, args };\n if (thinkingTracker.endThinking()) {\n return [{ type: \"thinking_end\" }, toolStartEvent];\n }\n return toolStartEvent;\n }\n\n case \"tool.execution_complete\": {\n const toolCallId = String(data.toolCallId ?? \"\");\n const info = tracker.getInfo(toolCallId);\n const resultContent = (\n data.result as Record<string, unknown> | undefined\n )?.content;\n return {\n type: \"tool_call_end\",\n toolName: info?.toolName ?? \"unknown\",\n result: (resultContent as JSONValue) ?? null,\n };\n }\n\n case \"assistant.usage\":\n return {\n type: \"usage_update\",\n promptTokens: Number(data.inputTokens ?? 0),\n completionTokens: Number(data.outputTokens ?? 0),\n };\n\n case \"session.error\":\n return {\n type: \"error\",\n error: String(data.message ?? \"Unknown error\"),\n recoverable: false,\n };\n\n case \"assistant.message\": {\n const doneEvent: AgentEvent = {\n type: \"done\",\n finalOutput: String(data.content ?? \"\"),\n };\n if (thinkingTracker.endThinking()) {\n return [{ type: \"thinking_end\" }, doneEvent];\n }\n return doneEvent;\n }\n\n default:\n return null;\n }\n}\n\n// ─── CopilotAgent ───────────────────────────────────────────────\n\nclass CopilotAgent extends BaseAgent {\n private readonly getClient: () => Promise<SDKClient>;\n private readonly sdkTools: SDKTool[];\n private readonly sessionConfig: Omit<SDKSessionConfig, \"streaming\">;\n\n constructor(\n config: AgentConfig,\n getClient: () => Promise<SDKClient>,\n ) {\n super(config);\n this.getClient = getClient;\n this.sdkTools = mapToolsToSDK(config.tools);\n this.sessionConfig = {\n model: config.model,\n tools: this.sdkTools,\n systemMessage: { mode: \"replace\", content: config.systemPrompt },\n onPermissionRequest: buildPermissionHandler(config),\n onUserInputRequest: buildUserInputHandler(config),\n };\n }\n\n private async createSession(streaming: boolean): Promise<SDKSession> {\n const client = await this.getClient();\n return client.createSession({ ...this.sessionConfig, streaming });\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 session = await this.createSession(false);\n const prompt = extractLastUserPrompt(messages);\n const tracker = new ToolCallTracker();\n const toolCalls: AgentResult[\"toolCalls\"] = [];\n let usage: AgentResult[\"usage\"];\n\n const unsubscribe = session.on((event: SDKSessionEvent) => {\n if (event.type === \"tool.execution_start\") {\n tracker.trackStart(\n String(event.data.toolCallId ?? \"\"),\n String(event.data.toolName ?? \"unknown\"),\n (event.data.arguments as JSONValue) ?? {},\n );\n }\n if (event.type === \"tool.execution_complete\") {\n const info = tracker.getInfo(String(event.data.toolCallId ?? \"\"));\n const resultContent = (\n event.data.result as Record<string, unknown> | undefined\n )?.content;\n toolCalls.push({\n toolName: info?.toolName ?? \"unknown\",\n args: info?.args ?? {},\n result: (resultContent as JSONValue) ?? null,\n approved: Boolean(event.data.success ?? true),\n });\n }\n if (event.type === \"assistant.usage\") {\n usage = {\n promptTokens: Number(event.data.inputTokens ?? 0),\n completionTokens: Number(event.data.outputTokens ?? 0),\n };\n }\n });\n\n const onAbort = () => {\n // Intentionally swallow abort errors: session may already be destroyed\n // or disconnected, and we must not mask the real error/abort reason.\n session.abort().catch(() => {});\n };\n signal.addEventListener(\"abort\", onAbort, { once: true });\n\n try {\n const response = await session.sendAndWait({ prompt });\n const output = response?.data?.content ?? null;\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 } finally {\n signal.removeEventListener(\"abort\", onAbort);\n unsubscribe();\n tracker.clear();\n // Best-effort cleanup: don't mask the original error from sendAndWait\n session.destroy().catch(() => {});\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 const jsonSchema = zodToJsonSchema(schema.schema);\n const instruction =\n `\\n\\nYou MUST respond with ONLY valid JSON matching this schema:\\n` +\n JSON.stringify(jsonSchema, null, 2);\n\n const augmented = [...messages];\n const lastIdx = augmented.length - 1;\n if (lastIdx >= 0 && augmented[lastIdx].role === \"user\") {\n const orig = augmented[lastIdx] as {\n role: \"user\";\n content: MessageContent;\n };\n augmented[lastIdx] = {\n role: \"user\",\n content: getTextContent(orig.content) + instruction,\n };\n }\n\n const result = await this.executeRun(augmented, options, signal);\n\n let structuredOutput: T | undefined;\n if (result.output) {\n try {\n const jsonMatch = result.output.match(\n /```(?:json)?\\s*([\\s\\S]*?)```/,\n );\n const raw = jsonMatch ? jsonMatch[1]!.trim() : result.output.trim();\n structuredOutput = schema.schema.parse(JSON.parse(raw));\n } catch {\n // Parse failed — leave undefined\n }\n }\n\n return {\n ...result,\n structuredOutput: structuredOutput as AgentResult<T>[\"structuredOutput\"],\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 session = await this.createSession(true);\n const prompt = extractLastUserPrompt(messages);\n const tracker = new ToolCallTracker();\n const thinkingTracker = new ThinkingTracker();\n\n type QueueItem =\n | { event: AgentEvent }\n | { done: true }\n | { error: Error };\n const queue: QueueItem[] = [];\n let notify: (() => void) | null = null;\n\n const push = (item: QueueItem) => {\n queue.push(item);\n if (notify) {\n notify();\n notify = null;\n }\n };\n const waitForItem = (): Promise<void> =>\n new Promise<void>((resolve) => {\n notify = resolve;\n });\n\n const unsubscribe = session.on((event: SDKSessionEvent) => {\n const mapped = mapSessionEvent(event, tracker, thinkingTracker);\n if (mapped) {\n if (Array.isArray(mapped)) {\n for (const e of mapped) push({ event: e });\n } else {\n push({ event: mapped });\n }\n }\n\n if (event.type === \"session.idle\") {\n push({ done: true });\n } else if (event.type === \"session.error\") {\n push({\n error: new Error(\n String(event.data.message ?? \"Session error\"),\n ),\n });\n }\n });\n\n const onAbort = () => {\n session.abort().catch(() => {});\n push({ error: new AbortError() });\n };\n signal.addEventListener(\"abort\", onAbort, { once: true });\n\n try {\n await session.send({ prompt });\n\n while (true) {\n while (queue.length === 0) await waitForItem();\n const item = queue.shift()!;\n if (\"done\" in item) break;\n if (\"error\" in item) throw item.error;\n yield item.event;\n }\n } finally {\n signal.removeEventListener(\"abort\", onAbort);\n unsubscribe();\n tracker.clear();\n // Best-effort cleanup: don't mask errors from the event stream\n session.destroy().catch(() => {});\n }\n }\n\n // ─── dispose ────────────────────────────────────────────────────\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// ─── CopilotAgentService ────────────────────────────────────────\n\nclass CopilotAgentService implements IAgentService {\n readonly name = \"copilot\";\n private client: SDKClient | null = null;\n private clientPromise: Promise<SDKClient> | null = null;\n private disposed = false;\n private readonly options: CopilotBackendOptions;\n\n constructor(options: CopilotBackendOptions) {\n this.options = options;\n }\n\n private async ensureClient(): Promise<SDKClient> {\n if (this.disposed) throw new DisposedError(\"CopilotAgentService\");\n if (this.client) return this.client;\n if (this.clientPromise) return this.clientPromise;\n\n this.clientPromise = (async () => {\n try {\n const sdk = await loadSDK();\n const client = new sdk.CopilotClient({\n cliPath: this.options.cliPath,\n cwd: this.options.workingDirectory,\n useStdio: true,\n autoStart: false,\n autoRestart: true,\n logLevel: \"error\",\n githubToken: this.options.githubToken,\n useLoggedInUser: this.options.useLoggedInUser ?? true,\n });\n await client.start();\n this.client = client;\n return client;\n } catch (e) {\n // M1 fix: clear cached promise so next call retries\n this.clientPromise = null;\n throw e;\n }\n })();\n\n return this.clientPromise;\n }\n\n createAgent(config: AgentConfig): IAgent {\n if (this.disposed) throw new DisposedError(\"CopilotAgentService\");\n return new CopilotAgent(config, () => this.ensureClient());\n }\n\n async listModels(): Promise<ModelInfo[]> {\n const client = await this.ensureClient();\n const models = await client.listModels();\n return models.map((m) => ({\n id: m.id,\n name: m.name,\n provider: \"copilot\",\n }));\n }\n\n async validate(): Promise<ValidationResult> {\n const errors: string[] = [];\n try {\n const client = await this.ensureClient();\n const auth = await client.getAuthStatus();\n if (!auth.isAuthenticated) {\n errors.push(\n \"Not authenticated with GitHub Copilot. Run 'copilot auth login'.\",\n );\n }\n } catch (e) {\n errors.push(\n `Failed to connect to Copilot CLI: ${e instanceof Error ? e.message : String(e)}`,\n );\n }\n return { valid: errors.length === 0, errors };\n }\n\n async dispose(): Promise<void> {\n if (this.disposed) return;\n this.disposed = true;\n // M2 fix: await pending clientPromise before stopping\n if (this.clientPromise) {\n try {\n await this.clientPromise;\n } catch {\n // Client start may have failed — ignore\n }\n }\n if (this.client) {\n await this.client.stop();\n this.client = null;\n }\n this.clientPromise = null;\n }\n}\n\n// ─── Factory ────────────────────────────────────────────────────\n\n/** Create Copilot CLI backend service. */\nexport function createCopilotService(\n options: CopilotBackendOptions,\n): IAgentService {\n return new CopilotAgentService(options);\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/types.ts","../../src/errors.ts","../../src/base-agent.ts","../../src/utils/schema.ts","../../src/backends/copilot.ts"],"names":[],"mappings":"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","file":"copilot.js","sourcesContent":["import type { z } from \"zod\";\nimport type { IPermissionStore } from \"./permission-store.js\";\n\n// ─── JSON Value ────────────────────────────────────────────────\n\n/** JSON-serializable value used for tool arguments and results */\nexport type JSONValue =\n | string\n | number\n | boolean\n | null\n | JSONValue[]\n | { [key: string]: JSONValue };\n\n// ─── Message Content ───────────────────────────────────────────\n\n/** Message content — plain string or array of text/image parts */\nexport type MessageContent = string | Array<ContentPart>;\n\n/** Individual content part within a multi-part message */\nexport type ContentPart =\n | { type: \"text\"; text: string }\n | { type: \"image\"; data: string; mimeType: string };\n\n// ─── Tool System (B1: Declaration/Definition split) ────────────\n\n/** What the LLM sees — name, description, schema. Passed to all backends. */\nexport interface ToolDeclaration<TParams = unknown> {\n name: string;\n description: string;\n parameters: z.ZodType<TParams>;\n needsApproval?: boolean;\n metadata?: {\n category?: string;\n icon?: string;\n tags?: string[];\n };\n}\n\n/** Full tool with execute function. Required for API-based backends.\n * CLI backends extract declaration; execute map held internally. */\nexport interface ToolDefinition<TParams = unknown>\n extends ToolDeclaration<TParams> {\n execute: (params: TParams) => Promise<JSONValue> | JSONValue;\n}\n\n// ─── Tool Calls / Results ──────────────────────────────────────\n\n/** A tool call made by the LLM during execution */\nexport interface ToolCall {\n id: string;\n name: string;\n args: JSONValue;\n}\n\n/** Result of executing a tool call */\nexport interface ToolResult {\n toolCallId: string;\n name: string;\n result: JSONValue;\n isError?: boolean;\n}\n\n// ─── Messages (Discriminated Union) ────────────────────────────\n\n/** Conversation message — discriminated union on `role` */\nexport type Message =\n | { role: \"user\"; content: MessageContent }\n | { role: \"assistant\"; content: MessageContent; toolCalls?: ToolCall[] }\n | { role: \"tool\"; content?: string; toolResults: ToolResult[] }\n | { role: \"system\"; content: string };\n\n// ─── Permission System (v3.1 with scopes) ──────────────────────\n\n/** Scope for \"remember this decision\" */\nexport type PermissionScope = \"once\" | \"session\" | \"project\" | \"always\";\n\n/** What the permission callback receives */\nexport interface PermissionRequest {\n toolName: string;\n toolArgs: Record<string, unknown>;\n /** SDK-suggested scope (from Claude CLI's suggestions) */\n suggestedScope?: PermissionScope;\n /** Original SDK permission request (for pass-through) */\n rawSDKRequest?: unknown;\n}\n\n/** What the permission callback returns */\nexport interface PermissionDecision {\n allowed: boolean;\n /** How long to remember this decision */\n scope?: PermissionScope;\n /** Modified tool arguments (tool args may be altered by user) */\n modifiedInput?: Record<string, unknown>;\n /** Denial reason (if denied) */\n reason?: string;\n}\n\n/** Permission callback signature */\nexport type PermissionCallback = (\n request: PermissionRequest,\n signal: AbortSignal,\n) => Promise<PermissionDecision>;\n\n// ─── User Input (Ask User) ────────────────────────────────────\n\n/** Request for user input — separate from permissions */\nexport interface UserInputRequest {\n question: string;\n choices?: string[];\n /** Whether to allow freeform text input (default: true) */\n allowFreeform?: boolean;\n}\n\n/** Response from user to an input request */\nexport interface UserInputResponse {\n answer: string;\n /** true if user typed a custom answer instead of selecting a choice */\n wasFreeform: boolean;\n /** Index of selected choice (if choice was selected) */\n selectedChoiceIndex?: number;\n}\n\n// ─── Supervisor Hooks ──────────────────────────────────────────\n\n/** Hooks for supervisor/UI to intercept agent actions */\nexport interface SupervisorHooks {\n onPermission?: PermissionCallback;\n onAskUser?: (\n request: UserInputRequest,\n signal: AbortSignal,\n ) => Promise<UserInputResponse>;\n}\n\n// ─── Structured Output ─────────────────────────────────────────\n\n/** Configuration for typed structured output from LLM */\nexport interface StructuredOutputConfig<T = unknown> {\n schema: z.ZodType<T>;\n name?: string;\n description?: string;\n}\n\n// ─── Usage Data ────────────────────────────────────────────────\n\n/** Usage data from LLM execution — tokens consumed plus optional metadata */\nexport interface UsageData {\n promptTokens: number;\n completionTokens: number;\n model?: string;\n backend?: string;\n}\n\n// ─── Agent Events (Streaming) ──────────────────────────────────\n\n/** Events emitted during streaming agent execution */\nexport type AgentEvent =\n | { type: \"text_delta\"; text: string }\n | { type: \"thinking_delta\"; text: string }\n | { type: \"tool_call_start\"; toolCallId: string; toolName: string; args: JSONValue }\n | { type: \"tool_call_end\"; toolCallId: string; toolName: string; result: JSONValue }\n | { type: \"permission_request\"; request: PermissionRequest }\n | {\n type: \"permission_response\";\n toolName: string;\n decision: PermissionDecision;\n }\n | { type: \"ask_user\"; request: UserInputRequest }\n | { type: \"ask_user_response\"; answer: string }\n | { type: \"thinking_start\" }\n | { type: \"thinking_end\" }\n | {\n type: \"usage_update\";\n promptTokens: number;\n completionTokens: number;\n model?: string;\n backend?: string;\n }\n | { type: \"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 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 * 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 MessageContent,\n RunOptions,\n StructuredOutputConfig,\n ToolDefinition,\n CopilotBackendOptions,\n ModelInfo,\n ValidationResult,\n JSONValue,\n PermissionRequest as UnifiedPermissionRequest,\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 { CopilotBackendOptions } from \"../types.js\";\n\n// ─── Local Type Definitions (matching @github/copilot-sdk shapes) ───\n// Avoids requiring the SDK to be installed at compile time.\n\n/** @internal */\ninterface SDKClientOptions {\n cliPath?: string;\n cwd?: string;\n useStdio?: boolean;\n autoStart?: boolean;\n autoRestart?: boolean;\n logLevel?: string;\n githubToken?: string;\n useLoggedInUser?: boolean;\n cliArgs?: string[];\n}\n\n/** @internal */\ninterface SDKTool {\n name: string;\n description?: string;\n parameters?: Record<string, unknown>;\n handler: (\n args: unknown,\n invocation: {\n sessionId: string;\n toolCallId: string;\n toolName: string;\n arguments: unknown;\n },\n ) => Promise<unknown> | unknown;\n}\n\n/** @internal */\ninterface SDKPermissionRequest {\n kind: string;\n toolCallId?: string;\n [key: string]: unknown;\n}\n\n/** @internal */\ninterface SDKPermissionResult {\n kind:\n | \"approved\"\n | \"denied-by-rules\"\n | \"denied-no-approval-rule-and-could-not-request-from-user\"\n | \"denied-interactively-by-user\";\n}\n\n/** @internal */\ninterface SDKUserInputRequest {\n question: string;\n choices?: string[];\n allowFreeform?: boolean;\n}\n\n/** @internal */\ninterface SDKUserInputResponse {\n answer: string;\n wasFreeform: boolean;\n}\n\n/** @internal */\ninterface SDKSessionConfig {\n model?: string;\n tools?: SDKTool[];\n systemMessage?: { mode: \"append\" | \"replace\"; content: string };\n onPermissionRequest?: (\n request: SDKPermissionRequest,\n ctx: { sessionId: string },\n ) => Promise<SDKPermissionResult> | SDKPermissionResult;\n onUserInputRequest?: (\n request: SDKUserInputRequest,\n ctx: { sessionId: string },\n ) => Promise<SDKUserInputResponse> | SDKUserInputResponse;\n streaming?: boolean;\n workingDirectory?: string;\n availableTools?: string[];\n}\n\n/** @internal */\ninterface SDKSessionEvent {\n id: string;\n timestamp: string;\n parentId: string | null;\n ephemeral?: boolean;\n type: string;\n data: Record<string, unknown>;\n}\n\n/** @internal */\ninterface SDKAssistantMessageData {\n messageId: string;\n content: string;\n}\n\n/** @internal */\ninterface SDKSession {\n readonly sessionId: string;\n on(handler: (event: SDKSessionEvent) => void): () => void;\n send(options: { prompt: string }): Promise<string>;\n sendAndWait(\n options: { prompt: string },\n timeout?: number,\n ): Promise<\n | { type: \"assistant.message\"; data: SDKAssistantMessageData }\n | undefined\n >;\n destroy(): Promise<void>;\n abort(): Promise<void>;\n}\n\n/** @internal */\ninterface SDKModelInfo {\n id: string;\n name: string;\n}\n\n/** @internal */\ninterface SDKClient {\n start(): Promise<void>;\n stop(): Promise<Error[]>;\n getState(): string;\n createSession(config?: SDKSessionConfig): Promise<SDKSession>;\n listModels(): Promise<SDKModelInfo[]>;\n getAuthStatus(): Promise<{ isAuthenticated: boolean }>;\n}\n\n// ─── Dynamic SDK Loader ─────────────────────────────────────────\n\nlet sdkModule: {\n CopilotClient: new (options?: SDKClientOptions) => SDKClient;\n} | null = null;\n\nasync function loadSDK(): Promise<\n NonNullable<typeof sdkModule>\n> {\n if (sdkModule) return sdkModule;\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/ban-ts-comment\n // @ts-ignore — peer dependency, not present at compile time\n sdkModule = (await import(\"@github/copilot-sdk\")) as any;\n return sdkModule!;\n } catch {\n throw new SubprocessError(\n \"@github/copilot-sdk is not installed. Install it: npm install @github/copilot-sdk\",\n );\n }\n}\n\n/** @internal For testing: inject mock SDK module */\nexport function _injectSDK(\n mock: typeof sdkModule,\n): void {\n sdkModule = mock;\n}\n\n/** @internal For testing: reset injected SDK */\nexport function _resetSDK(): void {\n sdkModule = null;\n}\n\n// ─── Tool Mapping ───────────────────────────────────────────────\n\nfunction mapToolsToSDK(tools: ToolDefinition[]): SDKTool[] {\n return tools.map((tool) => ({\n name: tool.name,\n description: tool.description,\n parameters: zodToJsonSchema(tool.parameters),\n handler: async (args: unknown): Promise<unknown> => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const result = await tool.execute(args as any);\n return typeof result === \"string\" ? result : JSON.stringify(result);\n },\n }));\n}\n\n// ─── Permission Mapping ─────────────────────────────────────────\n\nfunction buildPermissionHandler(\n config: AgentConfig,\n): SDKSessionConfig[\"onPermissionRequest\"] {\n const onPermission = config.supervisor?.onPermission;\n\n // Headless safety: always provide a handler to prevent SDK from hanging.\n // Without a handler the SDK waits for interactive input indefinitely.\n if (!onPermission) {\n return async (): Promise<SDKPermissionResult> => ({ kind: \"approved\" });\n }\n\n const permissionStore = config.permissionStore;\n\n return async (\n request: SDKPermissionRequest,\n ): Promise<SDKPermissionResult> => {\n const toolName = String(request.kind);\n\n // Check store first — if already approved, skip callback\n if (permissionStore && await permissionStore.isApproved(toolName)) {\n return { kind: \"approved\" };\n }\n\n const unifiedRequest: UnifiedPermissionRequest = {\n toolName,\n toolArgs: { ...request } as Record<string, unknown>,\n rawSDKRequest: request,\n };\n\n const ac = new AbortController();\n const decision = await onPermission(unifiedRequest, ac.signal);\n\n if (decision.allowed) {\n // Persist approval to store\n if (permissionStore && decision.scope) {\n await permissionStore.approve(toolName, decision.scope);\n }\n return { kind: \"approved\" };\n }\n\n return { kind: \"denied-interactively-by-user\" };\n };\n}\n\n// ─── User Input Mapping ─────────────────────────────────────────\n\nfunction buildUserInputHandler(\n config: AgentConfig,\n): SDKSessionConfig[\"onUserInputRequest\"] {\n const onAskUser = config.supervisor?.onAskUser;\n\n // Headless safety: always provide a handler to prevent SDK from hanging\n // or returning a question as the final output instead of completing the task.\n if (!onAskUser) {\n return async (): Promise<SDKUserInputResponse> => ({\n answer: \"Complete the task autonomously without asking questions.\",\n wasFreeform: true,\n });\n }\n\n return async (\n request: SDKUserInputRequest,\n ): Promise<SDKUserInputResponse> => {\n const ac = new AbortController();\n const response = await onAskUser(\n {\n question: request.question,\n choices: request.choices,\n allowFreeform: request.allowFreeform,\n },\n ac.signal,\n );\n return { answer: response.answer, wasFreeform: response.wasFreeform };\n };\n}\n\n// ─── Event Mapping ──────────────────────────────────────────────\n\n/**\n * Tracks tool call IDs to tool names.\n *\n * The Copilot SDK's `tool.execution_complete` event only includes `toolCallId`\n * but not `toolName`. We capture the name from `tool.execution_start` events\n * (which include both) and look it up when mapping completion events to unified\n * `AgentEvent` objects and collecting `AgentResult.toolCalls`.\n */\nclass ToolCallTracker {\n private map = new Map<string, { toolName: string; args: JSONValue }>();\n\n trackStart(toolCallId: string, toolName: string, args: JSONValue): void {\n this.map.set(toolCallId, { toolName, args });\n }\n\n getInfo(\n toolCallId: string,\n ): { toolName: string; args: JSONValue } | undefined {\n return this.map.get(toolCallId);\n }\n\n clear(): void {\n this.map.clear();\n }\n}\n\n/**\n * Tracks whether we are inside a thinking (reasoning) block so we can emit\n * `thinking_end` when the block finishes. The Copilot SDK has no explicit\n * \"reasoning end\" event, so we detect the transition by observing the first\n * non-reasoning event after a reasoning event.\n */\nclass ThinkingTracker {\n private active = false;\n\n isActive(): boolean {\n return this.active;\n }\n\n startThinking(): void {\n this.active = true;\n }\n\n /** Returns true if thinking was active and is now ended. */\n endThinking(): boolean {\n if (!this.active) return false;\n this.active = false;\n return true;\n }\n}\n\nfunction mapSessionEvent(\n event: SDKSessionEvent,\n tracker: ToolCallTracker,\n thinkingTracker: ThinkingTracker,\n): AgentEvent | AgentEvent[] | null {\n const data = event.data;\n\n switch (event.type) {\n case \"assistant.message_delta\": {\n const textEvent: AgentEvent = {\n type: \"text_delta\",\n text: String(data.deltaContent ?? \"\"),\n };\n // Emit thinking_end before the first text_delta after reasoning\n if (thinkingTracker.endThinking()) {\n return [{ type: \"thinking_end\" }, textEvent];\n }\n return textEvent;\n }\n\n case \"assistant.reasoning\":\n case \"assistant.reasoning_delta\":\n if (!thinkingTracker.isActive()) {\n thinkingTracker.startThinking();\n return { type: \"thinking_start\" };\n }\n return null;\n\n case \"tool.execution_start\": {\n const toolCallId = String(data.toolCallId ?? \"\");\n const toolName = String(data.toolName ?? \"unknown\");\n const args = (data.arguments as JSONValue) ?? {};\n tracker.trackStart(toolCallId, toolName, args);\n const toolStartEvent: AgentEvent = { type: \"tool_call_start\", toolCallId, toolName, args };\n if (thinkingTracker.endThinking()) {\n return [{ type: \"thinking_end\" }, toolStartEvent];\n }\n return toolStartEvent;\n }\n\n case \"tool.execution_complete\": {\n const toolCallId = String(data.toolCallId ?? \"\");\n const info = tracker.getInfo(toolCallId);\n const resultContent = (\n data.result as Record<string, unknown> | undefined\n )?.content;\n return {\n type: \"tool_call_end\",\n toolCallId,\n toolName: info?.toolName ?? \"unknown\",\n result: (resultContent as JSONValue) ?? null,\n };\n }\n\n case \"assistant.usage\":\n return {\n type: \"usage_update\",\n promptTokens: Number(data.inputTokens ?? 0),\n completionTokens: Number(data.outputTokens ?? 0),\n };\n\n case \"session.error\":\n return {\n type: \"error\",\n error: String(data.message ?? \"Unknown error\"),\n recoverable: false,\n };\n\n case \"assistant.message\": {\n const doneEvent: AgentEvent = {\n type: \"done\",\n finalOutput: String(data.content ?? \"\"),\n };\n if (thinkingTracker.endThinking()) {\n return [{ type: \"thinking_end\" }, doneEvent];\n }\n return doneEvent;\n }\n\n default:\n return null;\n }\n}\n\n// ─── CopilotAgent ───────────────────────────────────────────────\n\nclass CopilotAgent extends BaseAgent {\n protected readonly backendName = \"copilot\";\n private readonly getClient: () => Promise<SDKClient>;\n private readonly sdkTools: SDKTool[];\n private readonly sessionConfig: Omit<SDKSessionConfig, \"streaming\">;\n\n constructor(\n config: AgentConfig,\n getClient: () => Promise<SDKClient>,\n ) {\n super(config);\n this.getClient = getClient;\n this.sdkTools = mapToolsToSDK(config.tools);\n this.sessionConfig = {\n model: config.model,\n tools: this.sdkTools,\n systemMessage: {\n mode: config.systemMessageMode ?? \"append\",\n content: config.systemPrompt,\n },\n onPermissionRequest: buildPermissionHandler(config),\n onUserInputRequest: buildUserInputHandler(config),\n ...(config.availableTools ? { availableTools: config.availableTools } : {}),\n };\n }\n\n private async createSession(streaming: boolean): Promise<SDKSession> {\n const client = await this.getClient();\n return client.createSession({ ...this.sessionConfig, streaming });\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 session = await this.createSession(false);\n const prompt = extractLastUserPrompt(messages);\n const tracker = new ToolCallTracker();\n const toolCalls: AgentResult[\"toolCalls\"] = [];\n let usage: AgentResult[\"usage\"];\n\n const unsubscribe = session.on((event: SDKSessionEvent) => {\n if (event.type === \"tool.execution_start\") {\n tracker.trackStart(\n String(event.data.toolCallId ?? \"\"),\n String(event.data.toolName ?? \"unknown\"),\n (event.data.arguments as JSONValue) ?? {},\n );\n }\n if (event.type === \"tool.execution_complete\") {\n const info = tracker.getInfo(String(event.data.toolCallId ?? \"\"));\n const resultContent = (\n event.data.result as Record<string, unknown> | undefined\n )?.content;\n toolCalls.push({\n toolName: info?.toolName ?? \"unknown\",\n args: info?.args ?? {},\n result: (resultContent as JSONValue) ?? null,\n approved: Boolean(event.data.success ?? true),\n });\n }\n if (event.type === \"assistant.usage\") {\n usage = {\n promptTokens: Number(event.data.inputTokens ?? 0),\n completionTokens: Number(event.data.outputTokens ?? 0),\n };\n }\n });\n\n const onAbort = () => {\n // Intentionally swallow abort errors: session may already be destroyed\n // or disconnected, and we must not mask the real error/abort reason.\n session.abort().catch(() => {});\n };\n signal.addEventListener(\"abort\", onAbort, { once: true });\n\n try {\n const response = await session.sendAndWait({ prompt });\n const output = response?.data?.content ?? null;\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 } finally {\n signal.removeEventListener(\"abort\", onAbort);\n unsubscribe();\n tracker.clear();\n // Best-effort cleanup: don't mask the original error from sendAndWait\n session.destroy().catch(() => {});\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 const jsonSchema = zodToJsonSchema(schema.schema);\n const instruction =\n `\\n\\nYou MUST respond with ONLY valid JSON matching this schema:\\n` +\n JSON.stringify(jsonSchema, null, 2);\n\n const augmented = [...messages];\n const lastIdx = augmented.length - 1;\n if (lastIdx >= 0 && augmented[lastIdx].role === \"user\") {\n const orig = augmented[lastIdx] as {\n role: \"user\";\n content: MessageContent;\n };\n augmented[lastIdx] = {\n role: \"user\",\n content: getTextContent(orig.content) + instruction,\n };\n }\n\n const result = await this.executeRun(augmented, options, signal);\n\n let structuredOutput: T | undefined;\n if (result.output) {\n try {\n const jsonMatch = result.output.match(\n /```(?:json)?\\s*([\\s\\S]*?)```/,\n );\n const raw = jsonMatch ? jsonMatch[1]!.trim() : result.output.trim();\n structuredOutput = schema.schema.parse(JSON.parse(raw));\n } catch {\n // Parse failed — leave undefined\n }\n }\n\n return {\n ...result,\n structuredOutput: structuredOutput as AgentResult<T>[\"structuredOutput\"],\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 session = await this.createSession(true);\n const prompt = extractLastUserPrompt(messages);\n const tracker = new ToolCallTracker();\n const thinkingTracker = new ThinkingTracker();\n\n type QueueItem =\n | { event: AgentEvent }\n | { done: true }\n | { error: Error };\n const queue: QueueItem[] = [];\n let notify: (() => void) | null = null;\n\n const push = (item: QueueItem) => {\n queue.push(item);\n if (notify) {\n notify();\n notify = null;\n }\n };\n const waitForItem = (): Promise<void> =>\n new Promise<void>((resolve) => {\n notify = resolve;\n });\n\n const unsubscribe = session.on((event: SDKSessionEvent) => {\n const mapped = mapSessionEvent(event, tracker, thinkingTracker);\n if (mapped) {\n if (Array.isArray(mapped)) {\n for (const e of mapped) push({ event: e });\n } else {\n push({ event: mapped });\n }\n }\n\n if (event.type === \"session.idle\") {\n push({ done: true });\n } else if (event.type === \"session.error\") {\n push({\n error: new Error(\n String(event.data.message ?? \"Session error\"),\n ),\n });\n }\n });\n\n const onAbort = () => {\n session.abort().catch(() => {});\n push({ error: new AbortError() });\n };\n signal.addEventListener(\"abort\", onAbort, { once: true });\n\n try {\n await session.send({ prompt });\n\n while (true) {\n while (queue.length === 0) await waitForItem();\n const item = queue.shift()!;\n if (\"done\" in item) break;\n if (\"error\" in item) throw item.error;\n yield item.event;\n }\n } finally {\n signal.removeEventListener(\"abort\", onAbort);\n unsubscribe();\n tracker.clear();\n // Best-effort cleanup: don't mask errors from the event stream\n session.destroy().catch(() => {});\n }\n }\n\n // ─── dispose ────────────────────────────────────────────────────\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// ─── CopilotAgentService ────────────────────────────────────────\n\nclass CopilotAgentService implements IAgentService {\n readonly name = \"copilot\";\n private client: SDKClient | null = null;\n private clientPromise: Promise<SDKClient> | null = null;\n private disposed = false;\n private readonly options: CopilotBackendOptions;\n\n constructor(options: CopilotBackendOptions) {\n this.options = options;\n }\n\n private async ensureClient(): Promise<SDKClient> {\n if (this.disposed) throw new DisposedError(\"CopilotAgentService\");\n if (this.client) return this.client;\n if (this.clientPromise) return this.clientPromise;\n\n this.clientPromise = (async () => {\n try {\n const sdk = await loadSDK();\n const client = new sdk.CopilotClient({\n cliPath: this.options.cliPath,\n cwd: this.options.workingDirectory,\n useStdio: true,\n autoStart: false,\n autoRestart: true,\n logLevel: \"error\",\n githubToken: this.options.githubToken,\n useLoggedInUser: this.options.useLoggedInUser ?? true,\n ...(this.options.cliArgs ? { cliArgs: this.options.cliArgs } : {}),\n });\n await client.start();\n\n // Verify authentication early to fail fast instead of hanging\n const auth = await client.getAuthStatus();\n if (!auth.isAuthenticated) {\n await client.stop();\n throw new SubprocessError(\n \"Not authenticated with GitHub Copilot. Run 'copilot auth login' or set GITHUB_TOKEN.\",\n );\n }\n\n this.client = client;\n return client;\n } catch (e) {\n // M1 fix: clear cached promise so next call retries\n this.clientPromise = null;\n throw e;\n }\n })();\n\n return this.clientPromise;\n }\n\n createAgent(config: AgentConfig): IAgent {\n if (this.disposed) throw new DisposedError(\"CopilotAgentService\");\n return new CopilotAgent(config, () => this.ensureClient());\n }\n\n async listModels(): Promise<ModelInfo[]> {\n const client = await this.ensureClient();\n const models = await client.listModels();\n return models.map((m) => ({\n id: m.id,\n name: m.name,\n provider: \"copilot\",\n }));\n }\n\n async validate(): Promise<ValidationResult> {\n const errors: string[] = [];\n try {\n const client = await this.ensureClient();\n const auth = await client.getAuthStatus();\n if (!auth.isAuthenticated) {\n errors.push(\n \"Not authenticated with GitHub Copilot. Run 'copilot auth login'.\",\n );\n }\n } catch (e) {\n errors.push(\n `Failed to connect to Copilot CLI: ${e instanceof Error ? e.message : String(e)}`,\n );\n }\n return { valid: errors.length === 0, errors };\n }\n\n async dispose(): Promise<void> {\n if (this.disposed) return;\n this.disposed = true;\n // M2 fix: await pending clientPromise before stopping\n if (this.clientPromise) {\n try {\n await this.clientPromise;\n } catch {\n // Client start may have failed — ignore\n }\n }\n if (this.client) {\n await this.client.stop();\n this.client = null;\n }\n this.clientPromise = null;\n }\n}\n\n// ─── Factory ────────────────────────────────────────────────────\n\n/** Create Copilot CLI backend service. */\nexport function createCopilotService(\n options: CopilotBackendOptions,\n): IAgentService {\n return new CopilotAgentService(options);\n}\n"]}
|
|
@@ -64,7 +64,9 @@ var BaseAgent = class {
|
|
|
64
64
|
this.state = "running";
|
|
65
65
|
try {
|
|
66
66
|
const messages = [{ role: "user", content: prompt }];
|
|
67
|
-
|
|
67
|
+
const result = await this.executeRun(messages, options, ac.signal);
|
|
68
|
+
this.enrichAndNotifyUsage(result);
|
|
69
|
+
return result;
|
|
68
70
|
} finally {
|
|
69
71
|
this.state = "idle";
|
|
70
72
|
this.abortController = null;
|
|
@@ -76,7 +78,9 @@ var BaseAgent = class {
|
|
|
76
78
|
const ac = this.createAbortController(options?.signal);
|
|
77
79
|
this.state = "running";
|
|
78
80
|
try {
|
|
79
|
-
|
|
81
|
+
const result = await this.executeRun(messages, options, ac.signal);
|
|
82
|
+
this.enrichAndNotifyUsage(result);
|
|
83
|
+
return result;
|
|
80
84
|
} finally {
|
|
81
85
|
this.state = "idle";
|
|
82
86
|
this.abortController = null;
|
|
@@ -89,12 +93,14 @@ var BaseAgent = class {
|
|
|
89
93
|
this.state = "running";
|
|
90
94
|
try {
|
|
91
95
|
const messages = [{ role: "user", content: prompt }];
|
|
92
|
-
|
|
96
|
+
const result = await this.executeRunStructured(
|
|
93
97
|
messages,
|
|
94
98
|
schema,
|
|
95
99
|
options,
|
|
96
100
|
ac.signal
|
|
97
101
|
);
|
|
102
|
+
this.enrichAndNotifyUsage(result);
|
|
103
|
+
return result;
|
|
98
104
|
} finally {
|
|
99
105
|
this.state = "idle";
|
|
100
106
|
this.abortController = null;
|
|
@@ -107,7 +113,21 @@ var BaseAgent = class {
|
|
|
107
113
|
this.state = "streaming";
|
|
108
114
|
try {
|
|
109
115
|
const messages = [{ role: "user", content: prompt }];
|
|
110
|
-
|
|
116
|
+
const enriched = this.enrichStream(this.executeStream(messages, options, ac.signal));
|
|
117
|
+
yield* this.heartbeatStream(enriched);
|
|
118
|
+
} finally {
|
|
119
|
+
this.state = "idle";
|
|
120
|
+
this.abortController = null;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
async *streamWithContext(messages, options) {
|
|
124
|
+
this.guardReentrancy();
|
|
125
|
+
this.guardDisposed();
|
|
126
|
+
const ac = this.createAbortController(options?.signal);
|
|
127
|
+
this.state = "streaming";
|
|
128
|
+
try {
|
|
129
|
+
const enriched = this.enrichStream(this.executeStream(messages, options, ac.signal));
|
|
130
|
+
yield* this.heartbeatStream(enriched);
|
|
111
131
|
} finally {
|
|
112
132
|
this.state = "idle";
|
|
113
133
|
this.abortController = null;
|
|
@@ -129,6 +149,95 @@ var BaseAgent = class {
|
|
|
129
149
|
this.abort();
|
|
130
150
|
this.state = "disposed";
|
|
131
151
|
}
|
|
152
|
+
// ─── Usage Enrichment ───────────────────────────────────────────
|
|
153
|
+
/** Enrich result usage with model/backend and fire onUsage callback */
|
|
154
|
+
enrichAndNotifyUsage(result) {
|
|
155
|
+
if (result.usage) {
|
|
156
|
+
result.usage = {
|
|
157
|
+
...result.usage,
|
|
158
|
+
model: this.config.model,
|
|
159
|
+
backend: this.backendName
|
|
160
|
+
};
|
|
161
|
+
this.callOnUsage(result.usage);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
/** Wrap a stream to enrich usage_update events and fire onUsage callback */
|
|
165
|
+
async *enrichStream(source) {
|
|
166
|
+
for await (const event of source) {
|
|
167
|
+
if (event.type === "usage_update") {
|
|
168
|
+
const usage = {
|
|
169
|
+
promptTokens: event.promptTokens,
|
|
170
|
+
completionTokens: event.completionTokens,
|
|
171
|
+
model: this.config.model,
|
|
172
|
+
backend: this.backendName
|
|
173
|
+
};
|
|
174
|
+
this.callOnUsage(usage);
|
|
175
|
+
yield { type: "usage_update", ...usage };
|
|
176
|
+
} else {
|
|
177
|
+
yield event;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
/** Fire onUsage callback (fire-and-forget: errors logged, not propagated) */
|
|
182
|
+
callOnUsage(usage) {
|
|
183
|
+
if (!this.config.onUsage) return;
|
|
184
|
+
try {
|
|
185
|
+
this.config.onUsage(usage);
|
|
186
|
+
} catch (e) {
|
|
187
|
+
console.warn(
|
|
188
|
+
"[agent-sdk] onUsage callback error:",
|
|
189
|
+
e instanceof Error ? e.message : String(e)
|
|
190
|
+
);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
// ─── Heartbeat ───────────────────────────────────────────────
|
|
194
|
+
/** Wrap a stream to emit heartbeat events at configured intervals.
|
|
195
|
+
* When heartbeatInterval is not set, passes through directly. */
|
|
196
|
+
async *heartbeatStream(source) {
|
|
197
|
+
const interval = this.config.heartbeatInterval;
|
|
198
|
+
if (!interval || interval <= 0) {
|
|
199
|
+
yield* source;
|
|
200
|
+
return;
|
|
201
|
+
}
|
|
202
|
+
const iterator = source[Symbol.asyncIterator]();
|
|
203
|
+
let pendingEvent = null;
|
|
204
|
+
let heartbeatResolve = null;
|
|
205
|
+
const timer = setInterval(() => {
|
|
206
|
+
if (heartbeatResolve) {
|
|
207
|
+
const resolve = heartbeatResolve;
|
|
208
|
+
heartbeatResolve = null;
|
|
209
|
+
resolve();
|
|
210
|
+
}
|
|
211
|
+
}, interval);
|
|
212
|
+
try {
|
|
213
|
+
while (true) {
|
|
214
|
+
if (!pendingEvent) {
|
|
215
|
+
pendingEvent = iterator.next();
|
|
216
|
+
}
|
|
217
|
+
const heartbeatPromise = new Promise((resolve) => {
|
|
218
|
+
heartbeatResolve = resolve;
|
|
219
|
+
});
|
|
220
|
+
const eventDone = pendingEvent.then(
|
|
221
|
+
(r) => ({ kind: "event", result: r })
|
|
222
|
+
);
|
|
223
|
+
const heartbeatDone = heartbeatPromise.then(
|
|
224
|
+
() => ({ kind: "heartbeat" })
|
|
225
|
+
);
|
|
226
|
+
const winner = await Promise.race([eventDone, heartbeatDone]);
|
|
227
|
+
if (winner.kind === "heartbeat") {
|
|
228
|
+
yield { type: "heartbeat" };
|
|
229
|
+
} else {
|
|
230
|
+
pendingEvent = null;
|
|
231
|
+
heartbeatResolve = null;
|
|
232
|
+
if (winner.result.done) break;
|
|
233
|
+
yield winner.result.value;
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
} finally {
|
|
237
|
+
clearInterval(timer);
|
|
238
|
+
heartbeatResolve = null;
|
|
239
|
+
}
|
|
240
|
+
}
|
|
132
241
|
// ─── Guards ───────────────────────────────────────────────────
|
|
133
242
|
guardReentrancy() {
|
|
134
243
|
if (this.state === "running" || this.state === "streaming") {
|
|
@@ -355,12 +464,14 @@ function mapStreamPart(part) {
|
|
|
355
464
|
case "tool-call":
|
|
356
465
|
return {
|
|
357
466
|
type: "tool_call_start",
|
|
467
|
+
toolCallId: String(part.toolCallId ?? ""),
|
|
358
468
|
toolName: part.toolName ?? "unknown",
|
|
359
469
|
args: part.args ?? {}
|
|
360
470
|
};
|
|
361
471
|
case "tool-result":
|
|
362
472
|
return {
|
|
363
473
|
type: "tool_call_end",
|
|
474
|
+
toolCallId: String(part.toolCallId ?? ""),
|
|
364
475
|
toolName: part.toolName ?? "unknown",
|
|
365
476
|
result: part.result ?? null
|
|
366
477
|
};
|
|
@@ -375,7 +486,7 @@ function mapStreamPart(part) {
|
|
|
375
486
|
case "reasoning-end":
|
|
376
487
|
return { type: "thinking_end" };
|
|
377
488
|
case "reasoning-delta":
|
|
378
|
-
return { type: "
|
|
489
|
+
return { type: "thinking_delta", text: part.text ?? "" };
|
|
379
490
|
case "finish-step":
|
|
380
491
|
return {
|
|
381
492
|
type: "usage_update",
|
|
@@ -393,6 +504,7 @@ function mapStreamPart(part) {
|
|
|
393
504
|
}
|
|
394
505
|
}
|
|
395
506
|
var VercelAIAgent = class extends BaseAgent {
|
|
507
|
+
backendName = "vercel-ai";
|
|
396
508
|
backendOptions;
|
|
397
509
|
sessionApprovals = /* @__PURE__ */ new Set();
|
|
398
510
|
model = null;
|