@witqq/agent-sdk 0.8.0 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (113) hide show
  1. package/dist/{agent-DxY68NZL.d.cts → agent-C6H2CgJA.d.cts} +2 -0
  2. package/dist/{agent-CW9XbmG_.d.ts → agent-F7oB6eKp.d.ts} +2 -0
  3. package/dist/backends/claude.cjs.map +1 -1
  4. package/dist/backends/claude.d.cts +2 -2
  5. package/dist/backends/claude.d.ts +2 -2
  6. package/dist/backends/claude.js.map +1 -1
  7. package/dist/backends/copilot.cjs +8 -15
  8. package/dist/backends/copilot.cjs.map +1 -1
  9. package/dist/backends/copilot.d.cts +2 -2
  10. package/dist/backends/copilot.d.ts +2 -2
  11. package/dist/backends/copilot.js +8 -15
  12. package/dist/backends/copilot.js.map +1 -1
  13. package/dist/backends/mock-llm.cjs +719 -0
  14. package/dist/backends/mock-llm.cjs.map +1 -0
  15. package/dist/backends/mock-llm.d.cts +37 -0
  16. package/dist/backends/mock-llm.d.ts +37 -0
  17. package/dist/backends/mock-llm.js +717 -0
  18. package/dist/backends/mock-llm.js.map +1 -0
  19. package/dist/backends/vercel-ai.cjs +8 -1
  20. package/dist/backends/vercel-ai.cjs.map +1 -1
  21. package/dist/backends/vercel-ai.d.cts +2 -2
  22. package/dist/backends/vercel-ai.d.ts +2 -2
  23. package/dist/backends/vercel-ai.js +8 -1
  24. package/dist/backends/vercel-ai.js.map +1 -1
  25. package/dist/backends-Cno0gZjy.d.cts +114 -0
  26. package/dist/backends-Cno0gZjy.d.ts +114 -0
  27. package/dist/chat/accumulator.cjs.map +1 -1
  28. package/dist/chat/accumulator.d.cts +2 -2
  29. package/dist/chat/accumulator.d.ts +2 -2
  30. package/dist/chat/accumulator.js.map +1 -1
  31. package/dist/chat/backends.cjs +350 -77
  32. package/dist/chat/backends.cjs.map +1 -1
  33. package/dist/chat/backends.d.cts +7 -7
  34. package/dist/chat/backends.d.ts +7 -7
  35. package/dist/chat/backends.js +349 -78
  36. package/dist/chat/backends.js.map +1 -1
  37. package/dist/chat/context.d.cts +2 -2
  38. package/dist/chat/context.d.ts +2 -2
  39. package/dist/chat/core.cjs +35 -25
  40. package/dist/chat/core.cjs.map +1 -1
  41. package/dist/chat/core.d.cts +15 -5
  42. package/dist/chat/core.d.ts +15 -5
  43. package/dist/chat/core.js +35 -26
  44. package/dist/chat/core.js.map +1 -1
  45. package/dist/chat/events.d.cts +2 -2
  46. package/dist/chat/events.d.ts +2 -2
  47. package/dist/chat/index.cjs +418 -122
  48. package/dist/chat/index.cjs.map +1 -1
  49. package/dist/chat/index.d.cts +7 -7
  50. package/dist/chat/index.d.ts +7 -7
  51. package/dist/chat/index.js +418 -124
  52. package/dist/chat/index.js.map +1 -1
  53. package/dist/chat/react.cjs +216 -12
  54. package/dist/chat/react.cjs.map +1 -1
  55. package/dist/chat/react.d.cts +78 -4
  56. package/dist/chat/react.d.ts +78 -4
  57. package/dist/chat/react.js +215 -13
  58. package/dist/chat/react.js.map +1 -1
  59. package/dist/chat/runtime.cjs +6 -2
  60. package/dist/chat/runtime.cjs.map +1 -1
  61. package/dist/chat/runtime.d.cts +2 -2
  62. package/dist/chat/runtime.d.ts +2 -2
  63. package/dist/chat/runtime.js +6 -2
  64. package/dist/chat/runtime.js.map +1 -1
  65. package/dist/chat/server.cjs +15 -5
  66. package/dist/chat/server.cjs.map +1 -1
  67. package/dist/chat/server.d.cts +3 -3
  68. package/dist/chat/server.d.ts +3 -3
  69. package/dist/chat/server.js +15 -5
  70. package/dist/chat/server.js.map +1 -1
  71. package/dist/chat/sessions.cjs +39 -23
  72. package/dist/chat/sessions.cjs.map +1 -1
  73. package/dist/chat/sessions.d.cts +2 -2
  74. package/dist/chat/sessions.d.ts +2 -2
  75. package/dist/chat/sessions.js +40 -24
  76. package/dist/chat/sessions.js.map +1 -1
  77. package/dist/chat/sqlite.cjs +95 -0
  78. package/dist/chat/sqlite.cjs.map +1 -1
  79. package/dist/chat/sqlite.d.cts +39 -3
  80. package/dist/chat/sqlite.d.ts +39 -3
  81. package/dist/chat/sqlite.js +93 -1
  82. package/dist/chat/sqlite.js.map +1 -1
  83. package/dist/chat/state.d.cts +2 -2
  84. package/dist/chat/state.d.ts +2 -2
  85. package/dist/chat/storage.cjs +39 -23
  86. package/dist/chat/storage.cjs.map +1 -1
  87. package/dist/chat/storage.d.cts +7 -3
  88. package/dist/chat/storage.d.ts +7 -3
  89. package/dist/chat/storage.js +40 -24
  90. package/dist/chat/storage.js.map +1 -1
  91. package/dist/{in-process-transport-C1JnJGVR.d.ts → in-process-transport-7EIit9Xk.d.ts} +51 -17
  92. package/dist/{in-process-transport-C7DSqPyX.d.cts → in-process-transport-Ct9YcX8I.d.cts} +51 -17
  93. package/dist/index.cjs +14 -14
  94. package/dist/index.cjs.map +1 -1
  95. package/dist/index.d.cts +4 -2
  96. package/dist/index.d.ts +4 -2
  97. package/dist/index.js +13 -13
  98. package/dist/index.js.map +1 -1
  99. package/dist/testing.cjs +724 -0
  100. package/dist/testing.cjs.map +1 -1
  101. package/dist/testing.d.cts +14 -2
  102. package/dist/testing.d.ts +14 -2
  103. package/dist/testing.js +724 -0
  104. package/dist/testing.js.map +1 -1
  105. package/dist/{transport-Cdh3M0tS.d.cts → transport-DLWCN18G.d.cts} +1 -1
  106. package/dist/{transport-Ciap4PWK.d.ts → transport-DsuS-GeM.d.ts} +1 -1
  107. package/dist/{types-ajANVzf7.d.ts → types-DgtI1hzh.d.ts} +2 -1
  108. package/dist/{types-DRgd_9R7.d.cts → types-DkSXALKg.d.cts} +2 -1
  109. package/package.json +18 -7
  110. package/LICENSE +0 -21
  111. package/README.md +0 -1054
  112. package/dist/backends-BSrsBYFn.d.cts +0 -39
  113. package/dist/backends-BSrsBYFn.d.ts +0 -39
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/types/errors.ts","../../src/errors.ts","../../src/types/guards.ts","../../src/types/index.ts","../../src/types.ts","../../src/base-agent.ts","../../src/utils/schema.ts","../../src/backends/shared.ts","../../src/backends/copilot.ts","../../src/backends/claude.ts","../../src/backends/vercel-ai.ts","../../src/chat/types.ts","../../src/chat/chat-utils.ts","../../src/chat/guards.ts","../../src/chat/bridge.ts","../../src/chat/conversion.ts","../../src/chat/context.ts","../../src/chat/errors.ts","../../src/chat/state.ts","../../src/chat/accumulator.ts","../../src/chat/watchdog.ts","../../src/chat/listener-set.ts","../../src/chat/runtime.ts","../../src/chat/storage.ts","../../src/chat/sessions.ts","../../src/chat/backends/types.ts","../../src/chat/backends/base.ts","../../src/chat/backends/copilot.ts","../../src/chat/backends/claude.ts","../../src/chat/backends/vercel-ai.ts","../../src/chat/backends/transport.ts","../../src/chat/backends/ws-transport.ts","../../src/chat/backends/in-process-transport.ts","../../src/chat/events.ts"],"names":["ErrorCode","init_errors","init_types","delay","text","session","_injectSDK","_resetSDK","loadSDK","_sdkMock","opts","mapToolsToSDK","result","createCopilotService","createClaudeService","createVercelAIService"],"mappings":"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","file":"index.js","sourcesContent":["// ─── Unified Error Code Enum ───────────────────────────────────\n\n/** Unified error codes for all SDK errors — single source of truth. */\nexport enum ErrorCode {\n // Auth\n AUTH_EXPIRED = \"AUTH_EXPIRED\",\n AUTH_INVALID = \"AUTH_INVALID\",\n\n // Rate limiting\n RATE_LIMIT = \"RATE_LIMIT\",\n\n // Network\n NETWORK = \"NETWORK\",\n TIMEOUT = \"TIMEOUT\",\n\n // Provider\n PROVIDER_ERROR = \"PROVIDER_ERROR\",\n MODEL_NOT_FOUND = \"MODEL_NOT_FOUND\",\n MODEL_OVERLOADED = \"MODEL_OVERLOADED\",\n CONTEXT_OVERFLOW = \"CONTEXT_OVERFLOW\",\n\n // Input / Response\n INVALID_INPUT = \"INVALID_INPUT\",\n INVALID_RESPONSE = \"INVALID_RESPONSE\",\n\n // SDK internal\n REENTRANCY = \"REENTRANCY\",\n DISPOSED = \"DISPOSED\",\n ABORTED = \"ABORTED\",\n INVALID_TRANSITION = \"INVALID_TRANSITION\",\n DEPENDENCY_MISSING = \"DEPENDENCY_MISSING\",\n BACKEND_NOT_INSTALLED = \"BACKEND_NOT_INSTALLED\",\n\n // Tool\n TOOL_EXECUTION = \"TOOL_EXECUTION\",\n PERMISSION_DENIED = \"PERMISSION_DENIED\",\n\n // Session\n SESSION_NOT_FOUND = \"SESSION_NOT_FOUND\",\n SESSION_EXPIRED = \"SESSION_EXPIRED\",\n\n // Provider resolution\n PROVIDER_NOT_FOUND = \"PROVIDER_NOT_FOUND\",\n AUTH_REQUIRED = \"AUTH_REQUIRED\",\n\n // Storage (generic)\n STORAGE_ERROR = \"STORAGE_ERROR\",\n // Storage (specific)\n STORAGE_NOT_FOUND = \"STORAGE_NOT_FOUND\",\n STORAGE_DUPLICATE_KEY = \"STORAGE_DUPLICATE_KEY\",\n STORAGE_IO_ERROR = \"STORAGE_IO_ERROR\",\n STORAGE_SERIALIZATION_ERROR = \"STORAGE_SERIALIZATION_ERROR\",\n}\n\n// ─── Classification ────────────────────────────────────────────\n\n/** Error codes that are typically recoverable (retry-safe) */\nconst RECOVERABLE_CODES = new Set<ErrorCode>([\n ErrorCode.TIMEOUT,\n ErrorCode.RATE_LIMIT,\n ErrorCode.NETWORK,\n ErrorCode.TOOL_EXECUTION,\n ErrorCode.MODEL_OVERLOADED,\n ErrorCode.PROVIDER_ERROR,\n]);\n\n/** Check if an error code is recoverable */\nexport function isRecoverableErrorCode(code: ErrorCode): boolean {\n return RECOVERABLE_CODES.has(code);\n}\n\n/** Classify an error message string into an ErrorCode */\nexport function classifyAgentError(error: string | Error): ErrorCode {\n const msg = (error instanceof Error ? error.message : error).toLowerCase();\n\n if (msg.includes(\"timeout\") || msg.includes(\"timed out\") || msg.includes(\"timedout\") || msg.includes(\"etimedout\")) {\n return ErrorCode.TIMEOUT;\n }\n\n if (msg.includes(\"rate limit\") || msg.includes(\"rate_limit\") || msg.includes(\"429\") || msg.includes(\"too many requests\")) {\n return ErrorCode.RATE_LIMIT;\n }\n\n if (msg.includes(\"unauthorized\") || msg.includes(\"401\") || msg.includes(\"auth\") && (msg.includes(\"expired\") || msg.includes(\"invalid\") || msg.includes(\"denied\") || msg.includes(\"failed\"))) {\n return ErrorCode.AUTH_EXPIRED;\n }\n\n if (msg.includes(\"econnrefused\") || msg.includes(\"econnreset\") || msg.includes(\"enotfound\") || msg.includes(\"network\") || msg.includes(\"fetch failed\") || msg.includes(\"socket hang up\")) {\n return ErrorCode.NETWORK;\n }\n\n if (msg.includes(\"subprocess\") || msg.includes(\"process exited\") || msg.includes(\"spawn\") || msg.includes(\"enoent\") || msg.includes(\"killed\")) {\n return ErrorCode.DEPENDENCY_MISSING;\n }\n\n if (msg.includes(\"abort\") || msg.includes(\"cancel\")) {\n return ErrorCode.ABORTED;\n }\n\n if (msg.includes(\"500\") || msg.includes(\"502\") || msg.includes(\"503\") || msg.includes(\"internal server error\") || msg.includes(\"service unavailable\") || msg.includes(\"bad gateway\") || msg.includes(\"overloaded\")) {\n return ErrorCode.PROVIDER_ERROR;\n }\n\n return ErrorCode.PROVIDER_ERROR;\n}\n","import { ErrorCode } from \"./types/errors.js\";\n\n/** Options for constructing an AgentSDKError */\nexport interface AgentSDKErrorOptions extends ErrorOptions {\n /** Machine-readable error code */\n code?: string;\n /** Whether this error is retryable (default: false) */\n retryable?: boolean;\n /** HTTP status code hint (e.g. 401, 429, 500) */\n httpStatus?: number;\n}\n\n/** Base error class for agent-sdk.\n *\n * Use `AgentSDKError.is(err)` for reliable cross-module `instanceof` checks\n * (works across separately bundled entry points where `instanceof` may fail). */\nexport class AgentSDKError extends Error {\n /** @internal Marker for cross-bundle identity checks */\n readonly _agentSDKError = true as const;\n /** Machine-readable error code. Prefer values from the ErrorCode enum. */\n readonly code?: string;\n /** Whether this error is safe to retry */\n readonly retryable: boolean;\n /** HTTP status code hint for error classification */\n readonly httpStatus?: number;\n\n constructor(message: string, options?: AgentSDKErrorOptions) {\n super(message, options);\n this.name = \"AgentSDKError\";\n this.code = options?.code;\n this.retryable = options?.retryable ?? false;\n this.httpStatus = options?.httpStatus;\n }\n\n /** Check if an error is an AgentSDKError (works across bundled copies) */\n static is(error: unknown): error is AgentSDKError {\n return (\n error instanceof Error &&\n \"_agentSDKError\" in error &&\n (error as AgentSDKError)._agentSDKError === true\n );\n }\n}\n\n/** Thrown when agent.run() is called while already running (M8 re-entrancy guard) */\nexport class ReentrancyError extends AgentSDKError {\n constructor() {\n super(\"Agent is already running. Await the current run before starting another.\", {\n code: ErrorCode.REENTRANCY,\n });\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 code: ErrorCode.DISPOSED,\n });\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 { code: ErrorCode.BACKEND_NOT_INSTALLED },\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, code: ErrorCode.DEPENDENCY_MISSING });\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 code: ErrorCode.DEPENDENCY_MISSING,\n });\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.\", { code: ErrorCode.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, code: ErrorCode.TOOL_EXECUTION });\n this.name = \"ToolExecutionError\";\n this.toolName = toolName;\n }\n}\n\n/** Thrown when a stream has no activity within the configured timeout */\nexport class ActivityTimeoutError extends AgentSDKError {\n constructor(timeoutMs: number) {\n super(`Stream activity timeout: no event received within ${timeoutMs}ms.`, {\n code: ErrorCode.TIMEOUT,\n retryable: true,\n });\n this.name = \"ActivityTimeoutError\";\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, code: ErrorCode.INVALID_RESPONSE });\n this.name = \"StructuredOutputError\";\n }\n}\n","import type { ToolDeclaration, ToolDefinition } from \"./tools.js\";\nimport type { MessageContent, ContentPart } from \"./messages.js\";\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","// ─── Barrel re-export ───────────────────────────────────────────\n\nexport type { JSONValue } from \"./json.js\";\n\nexport type {\n ToolDeclaration,\n ToolDefinition,\n ToolDefinitionLike,\n ToolContext,\n ToolCall,\n ToolResult,\n} from \"./tools.js\";\n\nexport type {\n MessageContent,\n ContentPart,\n Message,\n} from \"./messages.js\";\n\nexport type {\n PermissionScope,\n PermissionRequest,\n PermissionDecision,\n PermissionCallback,\n UserInputRequest,\n UserInputResponse,\n SupervisorHooks,\n} from \"./permissions.js\";\n\nexport type {\n ModelInfo,\n ModelParams,\n ValidationResult,\n} from \"./models.js\";\n\nexport {\n ErrorCode,\n isRecoverableErrorCode,\n classifyAgentError,\n} from \"./errors.js\";\n\nexport type {\n UsageData,\n AgentEvent,\n StreamContext,\n StreamMiddleware,\n} from \"./events.js\";\n\nexport type {\n CallOptions,\n RetryConfig,\n StructuredOutputConfig,\n RunOptions,\n TimeoutConfig,\n ErrorHandlingConfig,\n AgentConfig,\n CallDefaults,\n FullAgentConfig,\n AgentResult,\n AgentState,\n IAgent,\n IAgentService,\n AgentServiceLike,\n} from \"./agent.js\";\n\nexport type {\n CopilotBackendOptions,\n ClaudeBackendOptions,\n VercelAIBackendOptions,\n} from \"./backends.js\";\n\nexport {\n isToolDefinition,\n isTextContent,\n isMultiPartContent,\n getTextContent,\n} from \"./guards.js\";\n","// Barrel re-export from split type modules.\n// All existing imports from \"./types.js\" continue to work unchanged.\nexport * from \"./types/index.js\";\n","import type {\n IAgent,\n FullAgentConfig,\n AgentState,\n AgentResult,\n AgentEvent,\n MessageContent,\n Message,\n RunOptions,\n RetryConfig,\n StructuredOutputConfig,\n UsageData,\n ToolDefinition,\n StreamMiddleware,\n StreamContext,\n} from \"./types.js\";\nimport { ReentrancyError, DisposedError, AbortError, ActivityTimeoutError } from \"./errors.js\";\nimport { AgentSDKError } from \"./errors.js\";\nimport { isRecoverableErrorCode } from \"./types/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: FullAgentConfig;\n private _cleanupExternalSignal: (() => void) | null = null;\n private _streamMiddleware: StreamMiddleware[] = [];\n\n /** Backend identifier (e.g. \"copilot\", \"claude\", \"vercel-ai\") */\n protected abstract readonly backendName: string;\n\n /** CLI session ID for persistent mode. Override in backends that support it. */\n get sessionId(): string | undefined {\n return undefined;\n }\n\n constructor(config: FullAgentConfig) {\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.withRetry(\n () => this.executeRun(messages, options, ac.signal), options,\n );\n this.enrichAndNotifyUsage(result, options);\n return result;\n } finally {\n this.cleanupRun();\n }\n }\n\n async runWithContext(\n messages: Message[],\n options: RunOptions,\n ): Promise<AgentResult> {\n this.guardReentrancy();\n this.guardDisposed();\n\n const ac = this.createAbortController(options?.signal);\n this.state = \"running\";\n\n try {\n const result = await this.withRetry(\n () => this.executeRun(messages, options, ac.signal), options,\n );\n this.enrichAndNotifyUsage(result, options);\n return result;\n } finally {\n this.cleanupRun();\n }\n }\n\n async runStructured<T>(\n prompt: MessageContent,\n schema: StructuredOutputConfig<T>,\n options: RunOptions,\n ): Promise<AgentResult<T>> {\n this.guardReentrancy();\n this.guardDisposed();\n\n const ac = this.createAbortController(options?.signal);\n this.state = \"running\";\n\n try {\n const messages: Message[] = [{ role: \"user\", content: prompt }];\n const result = await this.withRetry(\n () => this.executeRunStructured(messages, schema, options, ac.signal), options,\n );\n this.enrichAndNotifyUsage(result, options);\n return result;\n } finally {\n this.cleanupRun();\n }\n }\n\n async *stream(\n prompt: MessageContent,\n options: RunOptions,\n ): AsyncIterable<AgentEvent> {\n this.guardReentrancy();\n this.guardDisposed();\n\n const ac = this.createAbortController(options?.signal);\n this.state = \"streaming\";\n\n try {\n const messages: Message[] = [{ role: \"user\", content: prompt }];\n yield* this.streamWithRetry(\n () => this.applyStreamPipeline(this.executeStream(messages, options, ac.signal), options, ac),\n options,\n );\n } finally {\n this.cleanupRun();\n }\n }\n\n async *streamWithContext(\n messages: Message[],\n options: RunOptions,\n ): AsyncIterable<AgentEvent> {\n this.guardReentrancy();\n this.guardDisposed();\n\n const ac = this.createAbortController(options?.signal);\n this.state = \"streaming\";\n\n try {\n yield* this.streamWithRetry(\n () => this.applyStreamPipeline(this.executeStream(messages, options, ac.signal), options, ac),\n options,\n );\n } finally {\n this.cleanupRun();\n }\n }\n\n /** Register a stream middleware. Applied in registration order after built-in transforms. */\n addStreamMiddleware(middleware: StreamMiddleware): void {\n this.guardDisposed();\n this._streamMiddleware.push(middleware);\n }\n\n /** Apply built-in transforms (enrich→timeout→heartbeat) then custom middleware */\n private async *applyStreamPipeline(\n source: AsyncIterable<AgentEvent>,\n options: RunOptions,\n ac: AbortController,\n ): AsyncIterable<AgentEvent> {\n // Built-in pipeline\n let stream: AsyncIterable<AgentEvent> = this.enrichStream(source, options);\n stream = this.activityTimeoutStream(stream, options?.activityTimeoutMs, ac);\n stream = this.heartbeatStream(stream);\n\n // Custom middleware\n if (this._streamMiddleware.length > 0) {\n const ctx: StreamContext = {\n model: options.model,\n backend: this.backendName,\n abortController: ac,\n config: Object.freeze({ ...this.config }),\n };\n for (const mw of this._streamMiddleware) {\n stream = mw(stream, ctx);\n }\n }\n\n yield* stream;\n }\n\n abort(): void {\n if (this.abortController) {\n this.abortController.abort();\n }\n }\n\n /** Default interrupt — falls back to abort(). Backends may override with graceful shutdown. */\n async interrupt(): Promise<void> {\n this.abort();\n }\n\n getState(): AgentState {\n return this.state;\n }\n\n getConfig(): Readonly<FullAgentConfig> {\n return this.config;\n }\n\n /** Mark agent as disposed. Override to add cleanup. */\n dispose(): void {\n this._cleanupExternalSignal?.();\n this._cleanupExternalSignal = null;\n this.abort();\n this.state = \"disposed\";\n }\n\n // ─── Abstract Methods (implemented by backends) ───────────────\n\n /** Execute a blocking run. Backend implements the actual LLM call. */\n protected abstract executeRun(\n messages: Message[],\n options: RunOptions,\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,\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,\n signal: AbortSignal,\n ): AsyncIterable<AgentEvent>;\n\n // ─── Retry Logic ─────────────────────────────────────────────\n\n /** Check if an error should be retried given the retry configuration. */\n private isRetryableError(error: unknown, retry: RetryConfig): boolean {\n // Abort and reentrancy errors are never retryable\n if (error instanceof AbortError || error instanceof ReentrancyError || error instanceof DisposedError) {\n return false;\n }\n if (AgentSDKError.is(error)) {\n // If specific retryable error codes configured, check against them\n if (retry.retryableErrors && retry.retryableErrors.length > 0 && error.code) {\n return retry.retryableErrors.includes(error.code as typeof retry.retryableErrors[number]);\n }\n // Otherwise check the retryable flag or recoverable code\n if (error.retryable) return true;\n if (error.code) return isRecoverableErrorCode(error.code as Parameters<typeof isRecoverableErrorCode>[0]);\n }\n return false;\n }\n\n /** Execute a function with retry logic per RetryConfig. */\n private async withRetry<T>(\n fn: () => Promise<T>,\n options: RunOptions,\n ): Promise<T> {\n const retry = options?.retry;\n if (!retry || !retry.maxRetries || retry.maxRetries <= 0) {\n return fn();\n }\n\n const maxRetries = retry.maxRetries;\n const initialDelay = retry.initialDelayMs ?? 1000;\n const multiplier = retry.backoffMultiplier ?? 2;\n let lastError: unknown;\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n try {\n return await fn();\n } catch (err) {\n lastError = err;\n if (attempt >= maxRetries || !this.isRetryableError(err, retry)) {\n throw err;\n }\n // Exponential backoff\n const delay = initialDelay * Math.pow(multiplier, attempt);\n await new Promise((resolve) => setTimeout(resolve, delay));\n // Check abort between retries\n if (options?.signal?.aborted || this.abortController?.signal.aborted) {\n throw err;\n }\n }\n }\n throw lastError;\n }\n\n /** Execute a stream factory with pre-stream retry: retries until first event, then committed. */\n private async *streamWithRetry(\n factory: () => AsyncIterable<AgentEvent>,\n options: RunOptions,\n ): AsyncIterable<AgentEvent> {\n const retry = options?.retry;\n if (!retry || !retry.maxRetries || retry.maxRetries <= 0) {\n yield* factory();\n return;\n }\n\n const maxRetries = retry.maxRetries;\n const initialDelay = retry.initialDelayMs ?? 1000;\n const multiplier = retry.backoffMultiplier ?? 2;\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n try {\n const stream = factory();\n const iterator = stream[Symbol.asyncIterator]();\n // Try to get first event — this is the \"pre-stream\" phase\n const first = await iterator.next();\n if (first.done) return;\n // First event received — stream committed, no more retries\n yield first.value;\n // Yield remaining events\n while (true) {\n const next = await iterator.next();\n if (next.done) break;\n yield next.value;\n }\n return;\n } catch (err) {\n if (attempt >= maxRetries || !this.isRetryableError(err, retry)) {\n throw err;\n }\n const delay = initialDelay * Math.pow(multiplier, attempt);\n await new Promise((resolve) => setTimeout(resolve, delay));\n if (options?.signal?.aborted || this.abortController?.signal.aborted) {\n throw err;\n }\n }\n }\n }\n\n // ─── CallOptions Resolution ──────────────────────────────────\n\n /** Resolve tools to use for this call (per-call override > config default) */\n protected resolveTools(options?: RunOptions): ToolDefinition[] {\n return options?.tools ?? this.config.tools ?? [];\n }\n\n // ─── Usage Enrichment ───────────────────────────────────────────\n\n /** Enrich result usage with model/backend and fire onUsage callback */\n private enrichAndNotifyUsage(result: AgentResult<unknown>, options: RunOptions): void {\n if (result.usage) {\n result.usage = {\n ...result.usage,\n model: options.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 options: RunOptions,\n ): AsyncIterable<AgentEvent> {\n const model = options.model;\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,\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 // ─── Activity Timeout ────────────────────────────────────────\n\n /** Wrap a stream to abort on inactivity. Resets timer on every event.\n * When timeoutMs is not set, passes through directly. */\n private async *activityTimeoutStream(\n source: AsyncIterable<AgentEvent>,\n timeoutMs: number | undefined,\n ac: AbortController,\n ): AsyncIterable<AgentEvent> {\n if (!timeoutMs || timeoutMs <= 0) {\n yield* source;\n return;\n }\n\n const iterator = source[Symbol.asyncIterator]();\n let timerId: ReturnType<typeof setTimeout> | undefined;\n try {\n while (true) {\n const timeoutPromise = new Promise<never>((_, reject) => {\n timerId = setTimeout(() => reject(new ActivityTimeoutError(timeoutMs)), timeoutMs);\n });\n const result = await Promise.race([iterator.next(), timeoutPromise]);\n clearTimeout(timerId);\n if (result.done) break;\n yield result.value;\n }\n } catch (err) {\n if (err instanceof ActivityTimeoutError) {\n ac.abort(err);\n }\n throw err;\n } finally {\n clearTimeout(timerId);\n }\n }\n\n // ─── Guards ───────────────────────────────────────────────────\n\n protected guardReentrancy(): void {\n if (this.state === \"running\" || this.state === \"streaming\") {\n throw new ReentrancyError();\n }\n }\n\n protected guardDisposed(): void {\n if (this.state === \"disposed\") {\n throw new DisposedError(\"Agent\");\n }\n }\n\n /** Throw AbortError if signal is already aborted */\n protected checkAbort(signal: AbortSignal): void {\n if (signal.aborted) {\n throw new AbortError();\n }\n }\n\n // ─── Internal Helpers ─────────────────────────────────────────\n\n /** Clean up after a run completes (success, error, or abort). */\n private cleanupRun(): void {\n this._cleanupExternalSignal?.();\n this._cleanupExternalSignal = null;\n this.state = \"idle\";\n this.abortController = null;\n }\n\n private createAbortController(externalSignal?: AbortSignal): AbortController {\n const ac = new AbortController();\n this.abortController = ac;\n this._cleanupExternalSignal = null;\n\n if (externalSignal) {\n if (externalSignal.aborted) {\n ac.abort();\n } else {\n const listener = () => ac.abort();\n externalSignal.addEventListener(\"abort\", listener, { once: true });\n this._cleanupExternalSignal = () => externalSignal.removeEventListener(\"abort\", listener);\n }\n }\n\n return ac;\n }\n}\n","import type { z } from \"zod\";\n\n/** Convert a Zod schema to JSON Schema.\n * Detection order: toJSONSchema() (Zod v4) → jsonSchema() (Zod v3.24+) → _def extraction (Zod v3 legacy). */\nexport function zodToJsonSchema(schema: z.ZodType): Record<string, unknown> {\n const schemaAny = schema as unknown as Record<string, unknown>;\n\n // Zod v4: toJSONSchema()\n if (\"toJSONSchema\" in schema && typeof schemaAny.toJSONSchema === \"function\") {\n return (schemaAny.toJSONSchema as () => Record<string, unknown>)();\n }\n\n // Zod v3.24+: jsonSchema()\n if (\"jsonSchema\" in schema && typeof schemaAny.jsonSchema === \"function\") {\n return (schemaAny.jsonSchema as () => Record<string, unknown>)();\n }\n\n // Zod v3 legacy: _def.typeName extraction\n return extractSchemaFromDef(schema);\n}\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\nfunction extractSchemaFromDef(schema: z.ZodType): Record<string, unknown> {\n const def = (schema as unknown as { _def: Record<string, any> })._def;\n const typeName = def.typeName as string;\n\n switch (typeName) {\n case \"ZodString\":\n return { type: \"string\" };\n case \"ZodNumber\":\n return { type: \"number\" };\n case \"ZodBoolean\":\n return { type: \"boolean\" };\n case \"ZodNull\":\n return { type: \"null\" };\n case \"ZodArray\":\n return {\n type: \"array\",\n items: extractSchemaFromDef(def.type as z.ZodType),\n };\n case \"ZodObject\": {\n const shape = (schema as unknown as { shape: Record<string, z.ZodType> }).shape;\n const properties: Record<string, unknown> = {};\n const required: string[] = [];\n\n for (const [key, value] of Object.entries(shape)) {\n const valueDef = (value as unknown as { _def: Record<string, any> })._def;\n if (valueDef.typeName === \"ZodOptional\") {\n properties[key] = extractSchemaFromDef(valueDef.innerType as z.ZodType);\n } else {\n properties[key] = extractSchemaFromDef(value);\n required.push(key);\n }\n }\n\n return {\n type: \"object\",\n properties,\n ...(required.length > 0 ? { required } : {}),\n };\n }\n case \"ZodOptional\":\n return extractSchemaFromDef(def.innerType as z.ZodType);\n case \"ZodEnum\":\n return { type: \"string\", enum: def.values as string[] };\n default:\n return {};\n }\n}\n/* eslint-enable @typescript-eslint/no-explicit-any */\n","/**\n * Shared utilities for CLI backends (Copilot, Claude).\n * Extracted to avoid duplication between copilot.ts and claude.ts.\n */\nimport type { Message, JSONValue } from \"../types.js\";\nimport { getTextContent } from \"../types.js\";\n\n/** Extract the last user message as plain text */\nexport function 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\nfunction serializeToolCall(tc: { name: string; args: JSONValue }): string {\n const args = typeof tc.args === \"string\" ? tc.args : JSON.stringify(tc.args);\n return ` Tool call: ${tc.name}(${args})`;\n}\n\nfunction serializeToolResult(tr: { name: string; result: JSONValue; isError?: boolean }): string {\n const result = typeof tr.result === \"string\" ? tr.result : JSON.stringify(tr.result);\n const prefix = tr.isError ? \"[ERROR] \" : \"\";\n return ` ${tr.name} → ${prefix}${result}`;\n}\n\n/** Build prompt with conversation history for CLI backends that create fresh sessions */\nexport function buildContextualPrompt(messages: Message[]): string {\n if (messages.length <= 1) {\n return extractLastUserPrompt(messages);\n }\n\n const history = messages.slice(0, -1).map((msg) => {\n if (msg.role === \"user\") {\n return `User: ${msg.content ? getTextContent(msg.content) : \"\"}`;\n }\n if (msg.role === \"tool\" && msg.toolResults) {\n const results = msg.toolResults.map(serializeToolResult).join(\"\\n\");\n return `Tool results:\\n${results}`;\n }\n if (msg.role === \"assistant\") {\n const parts: string[] = [];\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const thinking = (msg as any).thinking as string | undefined;\n if (thinking) {\n parts.push(`[reasoning: ${thinking}]`);\n }\n const text = msg.content ? getTextContent(msg.content) : \"\";\n if (text) parts.push(text);\n if (msg.toolCalls && msg.toolCalls.length > 0) {\n parts.push(msg.toolCalls.map(serializeToolCall).join(\"\\n\"));\n }\n return `Assistant: ${parts.join(\"\\n\")}`;\n }\n const text = msg.content ? getTextContent(msg.content) : \"\";\n return `${msg.role}: ${text}`;\n }).join(\"\\n\");\n\n const lastPrompt = extractLastUserPrompt(messages);\n\n return `Conversation history:\\n${history}\\n\\nUser: ${lastPrompt}`;\n}\n","import type { z } from \"zod\";\nimport type {\n IAgent,\n IAgentService,\n FullAgentConfig,\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, classifyAgentError, isRecoverableErrorCode } from \"../types.js\";\nimport { BaseAgent } from \"../base-agent.js\";\nimport { DisposedError, SubprocessError, AbortError } from \"../errors.js\";\nimport { zodToJsonSchema } from \"../utils/schema.js\";\nimport { extractLastUserPrompt, buildContextualPrompt } from \"./shared.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 env?: Record<string, string | undefined>;\n}\n\n/** @internal */\ninterface SDKTool {\n name: string;\n description?: string;\n parameters?: z.ZodType | 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 capabilities?: {\n limits?: {\n max_context_window_tokens?: number;\n max_prompt_tokens?: number;\n };\n };\n}\n\n/** @internal */\ninterface SDKClient {\n start(): Promise<void>;\n stop(): Promise<Error[]>;\n getState(): string;\n createSession(config?: SDKSessionConfig): Promise<SDKSession>;\n resumeSession(sessionId: string, config?: SDKSessionConfig): Promise<SDKSession>;\n listModels(): Promise<SDKModelInfo[]>;\n getAuthStatus(): Promise<{ isAuthenticated: boolean }>;\n}\n\n// ─── Dynamic SDK Loader ─────────────────────────────────────────\n\ntype CopilotSDKModule = {\n CopilotClient: new (options?: SDKClientOptions) => SDKClient;\n};\n\n/** Module-level mock set by _injectSDK() for testing */\nlet _sdkMock: CopilotSDKModule | null = null;\n\n/** Load the Copilot SDK. Checks module-level mock first, then dynamic import. */\nasync function loadSDK(): Promise<CopilotSDKModule> {\n if (_sdkMock) return _sdkMock;\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 return (await import(\"@github/copilot-sdk\")) as any;\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: CopilotSDKModule | null,\n): void {\n _sdkMock = mock;\n}\n\n/** @internal For testing: reset injected SDK */\nexport function _resetSDK(): void {\n _sdkMock = 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: convertParameters(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/** Convert Zod schema or JSON Schema to JSON Schema object.\n * Zod schemas are converted via zodToJsonSchema; plain objects pass through. */\nfunction convertParameters(params: unknown): z.ZodType | Record<string, unknown> | undefined {\n if (!params) return undefined;\n if (params && typeof params === \"object\" && \"_def\" in (params as Record<string, unknown>)) {\n return zodToJsonSchema(params as Parameters<typeof zodToJsonSchema>[0]);\n }\n return params as Record<string, unknown>;\n}\n\n/** Async tool mapping that pre-converts Zod schemas to JSON Schema.\n * Handles ESM environments where synchronous Zod import may fail. */\nasync function mapToolsToSDKAsync(tools: ToolDefinition[]): Promise<SDKTool[]> {\n return tools.map((tool) => ({\n name: tool.name,\n description: tool.description,\n parameters: convertParameters(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: FullAgentConfig,\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 toolCallId: request.toolCallId,\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: FullAgentConfig,\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 private completed = false;\n\n isActive(): boolean {\n return this.active;\n }\n\n /** Returns true if thinking already completed (should ignore further reasoning events). */\n isCompleted(): boolean {\n return this.completed;\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 this.completed = true;\n return true;\n }\n\n /** Reset for next turn (e.g. after done event). */\n reset(): void {\n this.active = false;\n this.completed = false;\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 // Skip duplicate reasoning events — SDK replays full reasoning after response\n if (thinkingTracker.isCompleted()) return null;\n\n const events: AgentEvent[] = [];\n if (!thinkingTracker.isActive()) {\n thinkingTracker.startThinking();\n events.push({ type: \"thinking_start\" });\n }\n const reasoningText = String(data.deltaContent ?? data.content ?? \"\");\n if (reasoningText) {\n events.push({ type: \"thinking_delta\", text: reasoningText });\n }\n return events.length === 1 ? events[0] : events.length > 1 ? events : null;\n }\n\n case \"tool.execution_start\": {\n const toolCallId = String(data.toolCallId ?? \"\");\n const toolName = String(data.toolName ?? \"unknown\");\n let args: JSONValue = {};\n if (typeof data.arguments === \"string\") {\n try { args = JSON.parse(data.arguments); } catch { args = data.arguments as JSONValue; }\n } else if (data.arguments != null) {\n args = data.arguments as JSONValue;\n }\n tracker.trackStart(toolCallId, toolName, args);\n const toolStartEvent: AgentEvent = { type: \"tool_call_start\", toolCallId, toolName, args };\n const events: AgentEvent[] = [];\n if (thinkingTracker.endThinking()) {\n events.push({ type: \"thinking_end\" });\n }\n // Reset completed flag so next turn's thinking is captured\n thinkingTracker.reset();\n events.push(toolStartEvent);\n return events.length === 1 ? events[0] : events;\n }\n\n case \"tool.execution_complete\": {\n const toolCallId = String(data.toolCallId ?? \"\");\n const info = tracker.getInfo(toolCallId);\n const rawResult = data.result as Record<string, unknown> | JSONValue | undefined;\n // Copilot SDK wraps result in { content: ... } — unwrap if present\n const result = (rawResult && typeof rawResult === \"object\" && \"content\" in rawResult\n ? rawResult.content\n : rawResult) as JSONValue ?? null;\n return {\n type: \"tool_call_end\",\n toolCallId,\n toolName: info?.toolName ?? \"unknown\",\n result,\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 console.error(\"[copilot] mapSessionEvent error:\", JSON.stringify(data));\n {\n const errorMsg = String(data.message ?? \"Unknown error\");\n const code = classifyAgentError(errorMsg);\n return {\n type: \"error\",\n error: errorMsg,\n recoverable: isRecoverableErrorCode(code),\n code,\n };\n }\n\n case \"assistant.message\": {\n // Text was already streamed via text_delta events — suppress finalOutput to avoid duplication\n const doneEvent: AgentEvent = {\n type: \"done\",\n finalOutput: null,\n streamed: true,\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 sdkTools: SDKTool[];\n private readonly sessionConfig: Omit<SDKSessionConfig, \"streaming\"> & { tools?: SDKTool[] };\n private readonly sendAndWaitTimeout: number | undefined;\n private readonly isPersistent: boolean;\n private persistentSession: SDKSession | null = null;\n private _sessionId: string | undefined;\n private _persistentModel: string | undefined;\n private activeSession: SDKSession | null = null;\n private _resumeSessionId: string | undefined;\n private _toolsReady: Promise<void> | null = null;\n\n constructor(\n config: FullAgentConfig,\n getClient: () => Promise<SDKClient>,\n sendAndWaitTimeout?: number,\n resumeSessionId?: string,\n ) {\n super(config);\n this.getClient = getClient;\n this.sendAndWaitTimeout = sendAndWaitTimeout;\n this.isPersistent = config.sessionMode === \"persistent\";\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?.length ? { availableTools: config.availableTools } : {}),\n };\n // Start async Zod converter loading — remaps tools with proper JSON Schema before first session\n this._toolsReady = this._initToolsAsync(config);\n // Store resume session ID from stored identifier for session recovery after server restart\n this._resumeSessionId = resumeSessionId;\n }\n\n /** Pre-convert Zod schemas to JSON Schema asynchronously.\n * Updates sdkTools and sessionConfig.tools before first session creation. */\n private async _initToolsAsync(config: FullAgentConfig): Promise<void> {\n this.sdkTools = await mapToolsToSDKAsync(config.tools ?? []);\n this.sessionConfig.tools = this.sdkTools;\n }\n\n override get sessionId(): string | undefined {\n return this._sessionId;\n }\n\n override async interrupt(): Promise<void> {\n if (this.activeSession) {\n this.activeSession.abort().catch(() => {});\n }\n this.abort();\n }\n\n private emitSessionInfo(sessionId: string): AgentEvent {\n const home = process.env.HOME ?? process.env.USERPROFILE ?? \"\";\n const transcriptPath = home\n ? `${home}/.copilot/session-state/${sessionId}/events.jsonl`\n : undefined;\n return { type: \"session_info\", sessionId, transcriptPath, backend: \"copilot\" };\n }\n\n private clearPersistentSession(): void {\n if (this.isPersistent) {\n this.persistentSession?.destroy().catch(() => {});\n this.persistentSession = null;\n this._sessionId = undefined;\n this._persistentModel = undefined;\n }\n }\n\n private async getOrCreateSession(streaming: boolean, options: RunOptions): Promise<{ session: SDKSession; isNew: boolean }> {\n if (this.isPersistent && this.persistentSession) {\n // Check if model has changed — if so, recreate the session\n if (options.model !== this._persistentModel) {\n this.persistentSession.destroy().catch(() => {});\n this.persistentSession = null;\n this._sessionId = undefined;\n // Fall through to create new session with new model\n } else {\n return { session: this.persistentSession, isNew: false };\n }\n }\n // Wait for async Zod converter initialization before first session creation\n if (this._toolsReady) {\n await this._toolsReady;\n this._toolsReady = null;\n }\n\n // Apply per-call overrides to session config\n const sessionConfig = { ...this.sessionConfig };\n sessionConfig.model = options.model;\n const resolvedTools = this.resolveTools(options);\n if (options?.tools) {\n sessionConfig.tools = mapToolsToSDK(resolvedTools);\n }\n\n const client = await this.getClient();\n // Try to resume a stored session (from DB) before creating a new one.\n // This enables session recovery after server restart for persistent sessions.\n if (this._resumeSessionId) {\n const storedId = this._resumeSessionId;\n this._resumeSessionId = undefined; // Only attempt once\n try {\n const session = await client.resumeSession(storedId, {\n ...sessionConfig,\n streaming: this.isPersistent ? true : streaming,\n });\n if (this.isPersistent) {\n this.persistentSession = session;\n this._sessionId = session.sessionId;\n this._persistentModel = options.model;\n }\n return { session, isNew: false };\n } catch {\n // Resume failed (session expired, deleted, etc.) — fall through to createSession\n }\n }\n const session = await client.createSession({\n ...sessionConfig,\n streaming: this.isPersistent ? true : streaming,\n });\n if (this.isPersistent) {\n this.persistentSession = session;\n this._sessionId = session.sessionId;\n this._persistentModel = options.model;\n }\n return { session, isNew: true };\n }\n\n // ─── executeRun ─────────────────────────────────────────────────\n\n protected async executeRun(\n messages: Message[],\n options: RunOptions,\n signal: AbortSignal,\n ): Promise<AgentResult> {\n this.checkAbort(signal);\n\n const { session, isNew: isNewSession } = await this.getOrCreateSession(false, options);\n this.activeSession = session;\n // In per-call mode, include conversation context in prompt.\n const prompt = this.isPersistent && !isNewSession\n ? extractLastUserPrompt(messages)\n : buildContextualPrompt(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 = this.sendAndWaitTimeout !== undefined\n ? await session.sendAndWait({ prompt }, this.sendAndWaitTimeout)\n : 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 } catch (error) {\n // Clear broken persistent session so next call creates a fresh one\n this.clearPersistentSession();\n throw error;\n } finally {\n this.activeSession = null;\n signal.removeEventListener(\"abort\", onAbort);\n unsubscribe();\n tracker.clear();\n if (!this.isPersistent) {\n // Best-effort cleanup: don't mask the original error from sendAndWait\n session.destroy().catch(() => {});\n }\n }\n }\n\n // ─── executeRunStructured ───────────────────────────────────────\n\n protected async executeRunStructured<T>(\n messages: Message[],\n schema: StructuredOutputConfig<T>,\n options: RunOptions,\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,\n signal: AbortSignal,\n ): AsyncIterable<AgentEvent> {\n this.checkAbort(signal);\n\n const { session, isNew: isNewSession } = await this.getOrCreateSession(true, options);\n this.activeSession = session;\n if (isNewSession) {\n yield this.emitSessionInfo(session.sessionId);\n }\n const prompt = this.isPersistent && !isNewSession\n ? extractLastUserPrompt(messages)\n : buildContextualPrompt(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 // Close any open thinking block before completing the stream\n if (thinkingTracker.endThinking()) {\n push({ event: { type: \"thinking_end\" } });\n }\n push({ done: true });\n } else if (event.type === \"session.error\") {\n console.error(\"[copilot] session.error:\", JSON.stringify(event.data));\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) {\n // Clear broken persistent session so next call creates a fresh one\n this.clearPersistentSession();\n throw item.error;\n }\n yield item.event;\n }\n } catch (error) {\n this.clearPersistentSession();\n throw error;\n } finally {\n this.activeSession = null;\n signal.removeEventListener(\"abort\", onAbort);\n unsubscribe();\n tracker.clear();\n if (!this.isPersistent) {\n // Best-effort cleanup: don't mask errors from the event stream\n session.destroy().catch(() => {});\n }\n }\n }\n\n // ─── dispose ────────────────────────────────────────────────────\n\n override dispose(): void {\n if (this.persistentSession) {\n this.persistentSession.destroy().catch(() => {});\n this.persistentSession = null;\n this._sessionId = undefined;\n }\n super.dispose();\n }\n}\n\n// ─── Helpers ────────────────────────────────────────────────────\n\n// ─── Helpers ─────────────────────────────────────────────────────\n\n/** Race a promise against a timeout. Rejects with SubprocessError on timeout. */\nfunction withTimeout<T>(promise: Promise<T>, ms: number, message: string): Promise<T> {\n return new Promise<T>((resolve, reject) => {\n const timer = setTimeout(() => reject(new SubprocessError(message)), ms);\n promise.then(\n (val) => { clearTimeout(timer); resolve(val); },\n (err) => { clearTimeout(timer); reject(err); },\n );\n });\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 ?? !this.options.githubToken,\n ...(this.options.cliArgs ? { cliArgs: this.options.cliArgs } : {}),\n ...(this.options.env ? { env: { ...process.env, ...this.options.env } } : {}),\n });\n\n const startupTimeout = this.options.startupTimeoutMs ?? 30_000;\n await withTimeout(client.start(), startupTimeout, \"CLI startup timed out\");\n\n // Verify authentication early to fail fast instead of hanging\n const auth = await withTimeout(\n client.getAuthStatus(),\n startupTimeout,\n \"Auth status check timed out — token may be expired\",\n );\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: FullAgentConfig): IAgent {\n if (this.disposed) throw new DisposedError(\"CopilotAgentService\");\n return new CopilotAgent(config, () => this.ensureClient(), this.options.timeout, this.options.resumeSessionId);\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 ...(m.capabilities?.limits?.max_context_window_tokens != null && {\n contextWindow: m.capabilities.limits.max_context_window_tokens,\n }),\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","import type {\n IAgent,\n IAgentService,\n FullAgentConfig,\n AgentResult,\n AgentEvent,\n Message,\n RunOptions,\n StructuredOutputConfig,\n ToolDefinition,\n ClaudeBackendOptions,\n ModelInfo,\n ValidationResult,\n JSONValue,\n PermissionRequest as UnifiedPermissionRequest,\n PermissionDecision,\n PermissionScope,\n UserInputRequest,\n UserInputResponse,\n SupervisorHooks,\n} from \"../types.js\";\nimport { classifyAgentError, isRecoverableErrorCode } from \"../types.js\";\nimport { BaseAgent } from \"../base-agent.js\";\nimport { DisposedError, SubprocessError, AbortError } from \"../errors.js\";\nimport { zodToJsonSchema } from \"../utils/schema.js\";\nimport { extractLastUserPrompt, buildContextualPrompt } from \"./shared.js\";\n\nexport type { ClaudeBackendOptions } from \"../types.js\";\n\n// ─── Local Type Definitions (matching @anthropic-ai/claude-agent-sdk shapes) ──\n// Avoids requiring the SDK to be installed at compile time.\n\n/** @internal Claude SDK PermissionUpdate destination */\ntype PermissionUpdateDestination =\n | \"userSettings\"\n | \"projectSettings\"\n | \"localSettings\"\n | \"session\"\n | \"cliArg\";\n\n/** @internal Claude SDK PermissionUpdate */\ninterface SDKPermissionUpdate {\n type: \"addRules\" | \"replaceRules\" | \"removeRules\" | \"setMode\" | \"addDirectories\" | \"removeDirectories\";\n destination: PermissionUpdateDestination;\n [key: string]: unknown;\n}\n\n/** @internal Claude SDK PermissionResult */\ntype SDKPermissionResult =\n | {\n behavior: \"allow\";\n updatedInput?: Record<string, unknown>;\n updatedPermissions?: SDKPermissionUpdate[];\n toolUseID?: string;\n }\n | {\n behavior: \"deny\";\n message: string;\n interrupt?: boolean;\n toolUseID?: string;\n };\n\n/** @internal Claude SDK CanUseTool callback */\ntype SDKCanUseTool = (\n toolName: string,\n input: Record<string, unknown>,\n options: {\n signal: AbortSignal;\n suggestions?: SDKPermissionUpdate[];\n blockedPath?: string;\n decisionReason?: string;\n toolUseID: string;\n agentID?: string;\n },\n) => Promise<SDKPermissionResult>;\n\n/** @internal MCP server name used when registering agent-sdk tools */\nconst MCP_SERVER_NAME = \"agent-sdk-tools\";\nconst MCP_TOOL_PREFIX = `mcp__${MCP_SERVER_NAME}__`;\n\n/** @internal Claude Code MCP tool naming convention: mcp__<server>__<tool> */\nfunction mcpToolName(toolName: string): string {\n return `${MCP_TOOL_PREFIX}${toolName}`;\n}\n\n/** @internal Strip MCP prefix to recover original tool name */\nfunction stripMcpPrefix(name: string): string {\n return name.startsWith(MCP_TOOL_PREFIX) ? name.slice(MCP_TOOL_PREFIX.length) : name;\n}\n\n/**\n * Claude CLI built-in tool names that should be filtered from AgentEvent stream.\n * These are internal tools handled by the CLI runtime, not user-registered tools.\n * Matches Copilot behavior where ask_user is callback-only, never exposed as tool events.\n */\nconst CLAUDE_INTERNAL_TOOL_NAMES = new Set([\"AskUserQuestion\"]);\n\n/** @internal Claude SDK Options */\ninterface SDKOptions {\n abortController?: AbortController;\n allowedTools?: string[];\n canUseTool?: SDKCanUseTool;\n cwd?: string;\n disallowedTools?: string[];\n env?: { [envVar: string]: string | undefined };\n includePartialMessages?: boolean;\n maxTurns?: number;\n model?: string;\n outputFormat?: { type: \"json_schema\"; schema: Record<string, unknown> };\n pathToClaudeCodeExecutable?: string;\n permissionMode?: string;\n persistSession?: boolean;\n resume?: string;\n sessionId?: string;\n systemPrompt?:\n | string\n | { type: \"preset\"; preset: \"claude_code\"; append?: string };\n tools?: string[];\n mcpServers?: Record<string, unknown>;\n}\n\n/** @internal Claude SDK ModelInfo */\ninterface SDKModelInfo {\n value: string;\n displayName: string;\n description: string;\n}\n\n/** @internal Claude SDK ResultSuccess */\ninterface SDKResultSuccess {\n type: \"result\";\n subtype: \"success\";\n result: string;\n structured_output?: unknown;\n num_turns: number;\n total_cost_usd: number;\n usage: Record<string, number>;\n modelUsage: Record<string, { inputTokens: number; outputTokens: number }>;\n session_id: string;\n}\n\n/** @internal Claude SDK ResultError */\ninterface SDKResultError {\n type: \"result\";\n subtype: string;\n errors: string[];\n is_error: boolean;\n usage: Record<string, number>;\n modelUsage: Record<string, { inputTokens: number; outputTokens: number }>;\n session_id: string;\n}\n\n/** @internal Claude SDK message union */\ninterface SDKMessage {\n type: string;\n subtype?: string;\n [key: string]: unknown;\n}\n\n/** @internal Claude SDK Query interface — AsyncGenerator<SDKMessage> with control methods */\ninterface SDKQuery extends AsyncGenerator<SDKMessage, void> {\n close(): void;\n interrupt(): Promise<void>;\n supportedModels(): Promise<SDKModelInfo[]>;\n}\n\n/** @internal SDK's MCP tool definition */\ninterface SDKMcpToolDefinition {\n name: string;\n description: string;\n inputSchema: Record<string, unknown>;\n handler: (args: Record<string, unknown>, extra: unknown) => Promise<{ content: Array<{ type: string; text: string }> }>;\n}\n\n/** @internal SDK server config */\ninterface SDKMcpServerConfigWithInstance {\n type: \"sdk\";\n name: string;\n instance: unknown;\n}\n\n/** @internal */\ntype SDKModule = {\n query: (params: { prompt: string; options?: SDKOptions }) => SDKQuery;\n createSdkMcpServer: (options: {\n name: string;\n version?: string;\n tools?: SDKMcpToolDefinition[];\n }) => SDKMcpServerConfigWithInstance;\n tool: (\n name: string,\n description: string,\n inputSchema: Record<string, unknown>,\n handler: (args: Record<string, unknown>, extra: unknown) => Promise<{ content: Array<{ type: string; text: string }> }>,\n ) => SDKMcpToolDefinition;\n};\n\n// ─── Dynamic SDK Loader ─────────────────────────────────────────\n\n/** Module-level mock set by _injectSDK() for testing */\nlet _sdkMock: SDKModule | null = null;\n\n/** Load the Claude SDK. Checks module-level mock first, then dynamic import. */\nasync function loadSDK(): Promise<SDKModule> {\n if (_sdkMock) return _sdkMock;\n try {\n // @ts-ignore — peer dependency, not present at compile time\n return (await import(\"@anthropic-ai/claude-agent-sdk\")) as SDKModule;\n } catch {\n throw new SubprocessError(\n \"@anthropic-ai/claude-agent-sdk is not installed. Install it: npm install @anthropic-ai/claude-agent-sdk\",\n );\n }\n}\n\n/** @internal For testing: inject mock SDK module */\nexport function _injectSDK(mock: SDKModule | null): void {\n _sdkMock = mock;\n}\n\n/** @internal For testing: reset injected SDK */\nexport function _resetSDK(): void {\n _sdkMock = null;\n}\n\n// ─── Known Models ───────────────────────────────────────────────\n\nconst ANTHROPIC_MODELS_URL = \"https://api.anthropic.com/v1/models\";\nconst ANTHROPIC_API_VERSION = \"2023-06-01\";\nconst ANTHROPIC_OAUTH_BETA = \"oauth-2025-04-20\";\n\n// ─── Tool Mapping ───────────────────────────────────────────────\n\n/**\n * Normalize Claude's AskUserQuestion input format to UserInputRequest.\n * Claude sends: { questions: [{ question, options?: [{ label }] }] }\n * SDK expects: { question, choices?, allowFreeform? }\n */\nfunction normalizeAskUserInput(args: Record<string, unknown>): UserInputRequest {\n // Direct format (already normalized or simple question)\n if (typeof args.question === \"string\") {\n return {\n question: args.question,\n choices: Array.isArray(args.choices) ? args.choices as string[] : undefined,\n allowFreeform: args.allowFreeform !== false,\n };\n }\n\n // Claude's nested format: { questions: [{ question, options?: [{ label }] }] }\n const questions = args.questions as Array<{\n question: string;\n options?: Array<{ label: string }>;\n }> | undefined;\n\n if (questions && questions.length > 0) {\n const first = questions[0];\n return {\n question: first.question,\n choices: first.options?.map((o) => o.label),\n allowFreeform: true,\n };\n }\n\n // Fallback: stringify the entire input as the question\n return { question: JSON.stringify(args), allowFreeform: true };\n}\n\nfunction buildMcpServer(\n sdk: SDKModule,\n tools: ToolDefinition[],\n toolResultCapture?: Map<string, JSONValue>,\n onAskUser?: SupervisorHooks[\"onAskUser\"],\n): SDKMcpServerConfigWithInstance | undefined {\n if (tools.length === 0 && !onAskUser) return undefined;\n\n const mcpTools = tools.map((tool) => {\n // Claude SDK's tool() expects a Zod raw shape ({key: z.string(), ...}),\n // not a JSON Schema object. Extract .shape from ZodObject.\n const zodSchema = tool.parameters as { shape?: Record<string, unknown> };\n const inputSchema = zodSchema.shape ?? zodToJsonSchema(tool.parameters) as Record<string, unknown>;\n return sdk.tool(\n tool.name,\n tool.description ?? \"\",\n inputSchema,\n async (args: Record<string, unknown>) => {\n const result = await tool.execute(args);\n if (toolResultCapture) {\n toolResultCapture.set(tool.name, result as JSONValue);\n }\n return {\n content: [\n {\n type: \"text\" as const,\n text: typeof result === \"string\" ? result : JSON.stringify(result),\n },\n ],\n };\n },\n );\n });\n\n // Inject ask_user MCP tool when onAskUser callback is configured\n if (onAskUser) {\n const askUserTool = sdk.tool(\n \"ask_user\",\n \"Ask the user a question and wait for their response\",\n {\n question: { type: \"string\", description: \"The question to ask the user\" },\n choices: {\n type: \"array\",\n items: { type: \"string\" },\n description: \"Optional list of choices for multiple choice\",\n },\n questions: {\n type: \"array\",\n items: {\n type: \"object\",\n properties: {\n question: { type: \"string\" },\n options: { type: \"array\", items: { type: \"object\", properties: { label: { type: \"string\" } } } },\n },\n },\n description: \"Alternative nested question format\",\n },\n },\n async (args: Record<string, unknown>) => {\n const normalized = normalizeAskUserInput(args);\n // No parent signal available in MCP tool context; provide a standalone controller\n const response: UserInputResponse = await onAskUser(normalized, AbortSignal.timeout(300_000));\n return {\n content: [{ type: \"text\" as const, text: response.answer }],\n };\n },\n );\n mcpTools.push(askUserTool);\n }\n\n return sdk.createSdkMcpServer({\n name: MCP_SERVER_NAME,\n version: \"1.0.0\",\n tools: mcpTools,\n });\n}\n\n// ─── Permission Mapping ─────────────────────────────────────────\n\n/** Map our PermissionScope to Claude SDK's PermissionUpdateDestination */\nfunction scopeToDestination(scope: PermissionScope): PermissionUpdateDestination {\n switch (scope) {\n case \"once\":\n return \"session\";\n case \"session\":\n return \"session\";\n case \"project\":\n return \"projectSettings\";\n case \"always\":\n return \"userSettings\";\n }\n}\n\n/** Map Claude SDK suggestions to our PermissionScope */\nfunction destinationToScope(dest: PermissionUpdateDestination): PermissionScope {\n switch (dest) {\n case \"session\":\n case \"cliArg\":\n return \"session\";\n case \"projectSettings\":\n case \"localSettings\":\n return \"project\";\n case \"userSettings\":\n return \"always\";\n }\n}\n\n/** Extract best suggestedScope from SDK's PermissionUpdate[] */\nfunction extractSuggestedScope(\n suggestions?: SDKPermissionUpdate[],\n): PermissionScope | undefined {\n if (!suggestions || suggestions.length === 0) return undefined;\n // Use the destination of the first suggestion as the scope hint\n return destinationToScope(suggestions[0].destination);\n}\n\nfunction buildCanUseTool(\n config: FullAgentConfig,\n): SDKCanUseTool | undefined {\n const onPermission = config.supervisor?.onPermission;\n if (!onPermission) return undefined;\n\n const permissionStore = config.permissionStore;\n\n return async (\n rawToolName: string,\n input: Record<string, unknown>,\n options,\n ): Promise<SDKPermissionResult> => {\n const toolName = stripMcpPrefix(rawToolName);\n // Check store first — if already approved, skip callback\n if (permissionStore && await permissionStore.isApproved(toolName)) {\n return {\n behavior: \"allow\",\n toolUseID: options.toolUseID,\n };\n }\n\n const unifiedRequest: UnifiedPermissionRequest = {\n toolName,\n toolArgs: input,\n toolCallId: options.toolUseID,\n suggestedScope: extractSuggestedScope(options.suggestions),\n rawSDKRequest: { toolName, input, ...options },\n };\n\n const decision: PermissionDecision = await onPermission(\n unifiedRequest,\n options.signal,\n );\n\n if (decision.allowed) {\n // Persist approval to store\n if (permissionStore && decision.scope) {\n await permissionStore.approve(toolName, decision.scope);\n }\n\n const result: SDKPermissionResult = {\n behavior: \"allow\",\n toolUseID: options.toolUseID,\n };\n if (decision.modifiedInput) {\n (result as { updatedInput?: Record<string, unknown> }).updatedInput =\n decision.modifiedInput;\n }\n // Map scope decision to SDK's updatedPermissions\n if (decision.scope && decision.scope !== \"once\" && options.suggestions) {\n (result as { updatedPermissions?: SDKPermissionUpdate[] }).updatedPermissions =\n options.suggestions.map((s) => ({\n ...s,\n destination: scopeToDestination(decision.scope!),\n }));\n }\n return result;\n }\n\n return {\n behavior: \"deny\",\n message: decision.reason ?? \"Permission denied\",\n toolUseID: options.toolUseID,\n };\n };\n}\n\n// ─── Usage Aggregation Helper ───────────────────────────────────\n\nfunction aggregateUsage(\n modelUsage?: Record<string, { inputTokens: number; outputTokens: number }>,\n): { promptTokens: number; completionTokens: number } {\n let promptTokens = 0;\n let completionTokens = 0;\n for (const u of Object.values(modelUsage ?? {})) {\n promptTokens += u.inputTokens ?? 0;\n completionTokens += u.outputTokens ?? 0;\n }\n return { promptTokens, completionTokens };\n}\n\n// ─── Event Mapping ──────────────────────────────────────────────\n\n/**\n * Tracks tool call IDs to tool names for Claude backend.\n *\n * The Claude SDK emits tool_use blocks (with `id` and `name`) in assistant messages,\n * but tool_use_summary messages only carry `tool_name` (and optionally\n * `preceding_tool_use_ids`). This tracker correlates start/end events using a\n * per-tool-name FIFO queue to handle parallel calls to the same tool.\n */\nclass ClaudeToolCallTracker {\n private queues = new Map<string, string[]>();\n\n trackStart(toolCallId: string, toolName: string): void {\n if (!this.queues.has(toolName)) {\n this.queues.set(toolName, []);\n }\n this.queues.get(toolName)!.push(toolCallId);\n }\n\n /** Peek at the current tool call ID for a tool name (does not consume) */\n peekToolCallId(toolName: string): string {\n const queue = this.queues.get(toolName);\n if (!queue || queue.length === 0) return \"\";\n return queue[0];\n }\n\n /** Consume and return the first tool call ID for a tool name */\n consumeToolCallId(toolName: string): string {\n const queue = this.queues.get(toolName);\n if (!queue || queue.length === 0) return \"\";\n return queue.shift()!;\n }\n\n clear(): void {\n this.queues.clear();\n }\n}\n\nfunction mapSDKMessage(msg: SDKMessage, thinkingBlockIndices?: Set<number>, toolCallTracker?: ClaudeToolCallTracker): AgentEvent | AgentEvent[] | null {\n switch (msg.type) {\n case \"assistant\": {\n // Full assistant message — contains BetaMessage with content blocks\n const betaMessage = msg.message as {\n content?: Array<{\n type: string;\n text?: string;\n name?: string;\n input?: unknown;\n id?: string;\n }>;\n } | undefined;\n if (!betaMessage?.content) return null;\n\n const events: AgentEvent[] = [];\n\n // Emit tool_call_start for each tool_use block\n // NOTE: Text content is NOT extracted here — during streaming it arrives\n // via content_block_delta events, and during executeRun it comes from\n // the result message. Emitting text from assistant messages would cause\n // duplication.\n for (const block of betaMessage.content) {\n if (block.type === \"tool_use\") {\n const toolCallId = String(block.id ?? \"\");\n const toolName = stripMcpPrefix(block.name ?? \"unknown\");\n // Filter out internal Claude CLI tools (e.g. AskUserQuestion)\n if (CLAUDE_INTERNAL_TOOL_NAMES.has(toolName)) continue;\n if (toolCallTracker) {\n toolCallTracker.trackStart(toolCallId, toolName);\n }\n events.push({\n type: \"tool_call_start\",\n toolCallId,\n toolName,\n args: (block.input as JSONValue) ?? {},\n });\n }\n }\n\n return events.length > 0 ? events : null;\n }\n\n case \"user\": {\n // User messages with tool_use_result indicate tool completion\n const toolResult = msg.tool_use_result as JSONValue | undefined;\n // Extract tool name from the message context if available\n if (toolResult !== undefined) {\n // The user message after tool execution — emit tool_call_end\n // tool_name may not be in user messages, but we can infer from context\n return null; // Handled via tool_use_summary below\n }\n return null;\n }\n\n case \"tool_use_summary\": {\n // Emitted after tool execution — contains summary of tool results\n const summary = msg.summary as string | undefined;\n const toolName = stripMcpPrefix((msg.tool_name as string | undefined) ?? \"unknown\");\n // Filter out internal Claude CLI tools (e.g. AskUserQuestion)\n if (CLAUDE_INTERNAL_TOOL_NAMES.has(toolName)) return null;\n // Resolve toolCallId: prefer preceding_tool_use_ids, fall back to tracker\n const precedingIds = msg.preceding_tool_use_ids as string[] | undefined;\n let toolCallId = \"\";\n if (precedingIds && precedingIds.length > 0) {\n toolCallId = precedingIds[0];\n // Consume from tracker to keep queue in sync\n if (toolCallTracker) toolCallTracker.consumeToolCallId(toolName);\n } else if (toolCallTracker) {\n toolCallId = toolCallTracker.consumeToolCallId(toolName);\n }\n // Always emit tool_call_end — summary may be empty\n return {\n type: \"tool_call_end\",\n toolCallId,\n toolName,\n result: (summary ?? null) as JSONValue,\n };\n }\n\n case \"stream_event\": {\n // Partial streaming events — BetaRawMessageStreamEvent\n const event = msg.event as {\n type: string;\n delta?: { type: string; text?: string; thinking?: string };\n content_block?: { type: string; name?: string; id?: string };\n index?: number;\n } | undefined;\n if (!event) return null;\n\n // Thinking block deltas — emit thinking_delta instead of text_delta\n if (\n event.type === \"content_block_delta\" &&\n event.index !== undefined &&\n thinkingBlockIndices?.has(event.index)\n ) {\n const thinkingText = String(event.delta?.thinking ?? event.delta?.text ?? \"\");\n if (thinkingText) {\n return { type: \"thinking_delta\", text: thinkingText };\n }\n return null;\n }\n\n if (\n event.type === \"content_block_delta\" &&\n event.delta?.type === \"text_delta\" &&\n event.delta.text\n ) {\n return { type: \"text_delta\", text: event.delta.text };\n }\n\n if (event.type === \"content_block_start\" && event.content_block?.type === \"thinking\") {\n if (thinkingBlockIndices && event.index !== undefined) {\n thinkingBlockIndices.add(event.index);\n }\n return { type: \"thinking_start\" };\n }\n\n if (event.type === \"content_block_stop\" && event.index !== undefined && thinkingBlockIndices?.has(event.index)) {\n thinkingBlockIndices.delete(event.index);\n return { type: \"thinking_end\" };\n }\n\n return null;\n }\n\n case \"tool_progress\": {\n // Heartbeat while tool is executing — not a new tool call\n return null;\n }\n\n case \"result\": {\n if (msg.subtype === \"success\") {\n const r = msg as unknown as SDKResultSuccess;\n return {\n type: \"usage_update\",\n ...aggregateUsage(r.modelUsage),\n };\n }\n if (msg.is_error) {\n const r = msg as unknown as SDKResultError;\n const errorMsg = r.errors?.join(\"; \") ?? \"Unknown error\";\n const code = classifyAgentError(errorMsg);\n return {\n type: \"error\",\n error: errorMsg,\n recoverable: isRecoverableErrorCode(code),\n code,\n };\n }\n return null;\n }\n\n default:\n return null;\n }\n}\n\n// ─── ClaudeAgent ────────────────────────────────────────────────\n\nclass ClaudeAgent extends BaseAgent {\n protected readonly backendName = \"claude\";\n private readonly options: ClaudeBackendOptions;\n private readonly tools: ToolDefinition[];\n private readonly canUseTool: SDKCanUseTool | undefined;\n private readonly isPersistent: boolean;\n private _sessionId: string | undefined;\n private activeQuery: SDKQuery | null = null;\n\n constructor(config: FullAgentConfig, options: ClaudeBackendOptions) {\n super(config);\n this.options = options;\n this.tools = config.tools ?? [];\n this.canUseTool = buildCanUseTool(config);\n this.isPersistent = config.sessionMode === \"persistent\";\n\n // Restore session ID from stored identifier for session resume after server restart.\n // buildQueryOptions() uses _sessionId to set opts.resume when isPersistent.\n if (options.resumeSessionId) {\n this._sessionId = options.resumeSessionId;\n }\n }\n\n override get sessionId(): string | undefined {\n return this._sessionId;\n }\n\n override async interrupt(): Promise<void> {\n try {\n if (this.activeQuery) {\n await this.activeQuery.interrupt();\n }\n } catch {\n // fire-and-forget: SDK interrupt errors should not prevent abort\n } finally {\n this.abort();\n }\n }\n\n /** Clear persistent session state after an error so next call starts fresh */\n private clearPersistentSession(): void {\n this._sessionId = undefined;\n }\n\n private emitSessionInfo(sessionId: string): AgentEvent {\n const home = process.env.HOME ?? process.env.USERPROFILE ?? \"\";\n const transcriptPath = home\n ? `${home}/.claude/projects/.session/sessions/${sessionId}/conversation.jsonl`\n : undefined;\n return { type: \"session_info\", sessionId, transcriptPath, backend: \"claude\" };\n }\n\n private buildQueryOptions(signal: AbortSignal, options: RunOptions): SDKOptions {\n const ac = new AbortController();\n // Link external signal → SDK's abort controller\n signal.addEventListener(\"abort\", () => ac.abort(), { once: true });\n\n const opts: SDKOptions = {\n abortController: ac,\n model: options.model,\n maxTurns: this.options.maxTurns,\n cwd: this.options.workingDirectory,\n pathToClaudeCodeExecutable: this.options.cliPath,\n persistSession: this.isPersistent,\n includePartialMessages: true,\n canUseTool: this.canUseTool,\n };\n\n // Resume persistent session on subsequent calls\n if (this.isPersistent && this._sessionId) {\n opts.resume = this._sessionId;\n }\n\n if (this.config.systemPrompt) {\n opts.systemPrompt = this.config.systemPrompt;\n }\n\n if (this.options.oauthToken || this.options.env) {\n opts.env = {\n ...process.env,\n ...(this.options.env ?? {}),\n ...(this.options.oauthToken\n ? { CLAUDE_CODE_OAUTH_TOKEN: this.options.oauthToken }\n : {}),\n };\n }\n\n // Auto-set permissionMode when canUseTool is configured so Claude CLI\n // actually invokes the callback instead of using built-in rules.\n if (opts.canUseTool && !opts.permissionMode) {\n opts.permissionMode = \"default\";\n }\n\n // When availableTools is set, restrict built-in tool availability.\n // opts.tools controls which tools are available (Bash, Read, Edit, etc.).\n // opts.allowedTools only auto-approves permissions but does NOT restrict availability.\n // MCP tool names are added to allowedTools later by buildMcpConfig().\n if (this.config.availableTools) {\n opts.tools = [...this.config.availableTools];\n }\n\n return opts;\n }\n\n private async buildMcpConfig(\n opts: SDKOptions,\n toolResultCapture?: Map<string, JSONValue>,\n ): Promise<SDKOptions> {\n const onAskUser = this.config.supervisor?.onAskUser;\n if (this.tools.length === 0 && !onAskUser) return opts;\n\n const sdk = await loadSDK();\n const mcpServer = buildMcpServer(sdk, this.tools, toolResultCapture, onAskUser);\n if (mcpServer) {\n opts.mcpServers = {\n [MCP_SERVER_NAME]: mcpServer,\n };\n // Auto-allow MCP tools so Claude Code invokes them without blocking.\n // Claude Code names MCP tools as mcp__<server>__<tool>.\n const mcpToolNames = this.tools.map((t) => mcpToolName(t.name));\n if (onAskUser) {\n mcpToolNames.push(mcpToolName(\"ask_user\"));\n }\n opts.allowedTools = [...(opts.allowedTools ?? []), ...mcpToolNames];\n }\n\n // When onAskUser is configured, block built-in AskUserQuestion so Claude uses our MCP tool\n if (onAskUser) {\n opts.disallowedTools = [...(opts.disallowedTools ?? []), \"AskUserQuestion\"];\n }\n\n return opts;\n }\n\n // ─── Retry Helpers (shared across executeRun/RunStructured/Stream) ──\n\n /** Setup a retry query: clear session, rebuild with full history */\n private async prepareRetryQuery(\n sdk: SDKModule,\n messages: Message[],\n signal: AbortSignal,\n options: RunOptions,\n toolResultCapture: Map<string, JSONValue>,\n modifyOpts?: (opts: SDKOptions) => void,\n ): Promise<SDKQuery> {\n this.clearPersistentSession();\n const retryPrompt = buildContextualPrompt(messages);\n let retryOpts = this.buildQueryOptions(signal, options);\n toolResultCapture.clear();\n retryOpts = await this.buildMcpConfig(retryOpts, toolResultCapture);\n modifyOpts?.(retryOpts);\n const retryQ = sdk.query({ prompt: retryPrompt, options: retryOpts });\n this.activeQuery = retryQ;\n return retryQ;\n }\n\n /** Extract tool_use blocks from an assistant SDK message into toolCalls array */\n private collectToolCallsFromMessage(\n msg: SDKMessage,\n toolCalls: AgentResult[\"toolCalls\"],\n toolResultCapture: Map<string, JSONValue>,\n ): void {\n if (msg.type !== \"assistant\") return;\n const betaMessage = msg.message as {\n content?: Array<{ type: string; name?: string; input?: unknown }>;\n } | undefined;\n if (!betaMessage?.content) return;\n for (const block of betaMessage.content) {\n if (block.type === \"tool_use\") {\n const toolName = stripMcpPrefix(block.name ?? \"unknown\");\n if (CLAUDE_INTERNAL_TOOL_NAMES.has(toolName)) continue;\n toolCalls.push({\n toolName,\n args: (block.input as JSONValue) ?? {},\n result: toolResultCapture.get(toolName) ?? null,\n approved: true,\n });\n }\n }\n }\n\n /** Back-fill tool results from capture map on summary/result messages */\n private backfillToolResults(\n msg: SDKMessage,\n toolCalls: AgentResult[\"toolCalls\"],\n toolResultCapture: Map<string, JSONValue>,\n ): void {\n if (msg.type !== \"tool_use_summary\" && msg.type !== \"result\") return;\n for (const tc of toolCalls) {\n if (tc.result === null) {\n const captured = toolResultCapture.get(tc.toolName);\n if (captured !== undefined) tc.result = captured;\n }\n }\n }\n\n /** Wrap retry inner loop with shared error handling */\n private async withRetryErrorHandling<T>(\n signal: AbortSignal,\n fn: () => Promise<T>,\n ): Promise<T> {\n try {\n return await fn();\n } catch (retryError) {\n if (this.isPersistent) this.clearPersistentSession();\n if (signal.aborted) throw new AbortError();\n throw retryError;\n } finally {\n this.activeQuery = null;\n }\n }\n\n // ─── executeRun ─────────────────────────────────────────────────\n\n protected async executeRun(\n messages: Message[],\n options: RunOptions,\n signal: AbortSignal,\n ): Promise<AgentResult> {\n this.checkAbort(signal);\n\n const sdk = await loadSDK();\n const isResuming = this.isPersistent && this._sessionId !== undefined;\n const prompt = isResuming\n ? extractLastUserPrompt(messages)\n : buildContextualPrompt(messages);\n let opts = this.buildQueryOptions(signal, options);\n const toolResultCapture = new Map<string, JSONValue>();\n opts = await this.buildMcpConfig(opts, toolResultCapture);\n\n const q = sdk.query({ prompt, options: opts });\n this.activeQuery = q;\n const toolCalls: AgentResult[\"toolCalls\"] = [];\n let output: string | null = null;\n let usage: AgentResult[\"usage\"];\n\n try {\n for await (const msg of q) {\n this.collectToolCallsFromMessage(msg, toolCalls, toolResultCapture);\n this.backfillToolResults(msg, toolCalls, toolResultCapture);\n\n // Capture result and session_id\n if (msg.type === \"result\") {\n if (msg.subtype === \"success\") {\n const r = msg as unknown as SDKResultSuccess;\n output = r.result;\n usage = aggregateUsage(r.modelUsage);\n if (this.isPersistent && r.session_id) {\n this._sessionId = r.session_id;\n }\n } else if (msg.is_error) {\n const r = msg as unknown as SDKResultError;\n throw new Error(\n `Claude query failed: ${r.errors?.join(\"; \") ?? \"unknown error\"}`,\n );\n }\n }\n }\n } catch (e) {\n if (signal.aborted) throw new AbortError();\n if (isResuming && this.isPersistent) {\n const retryQ = await this.prepareRetryQuery(sdk, messages, signal, options, toolResultCapture);\n toolCalls.length = 0;\n output = null;\n return this.withRetryErrorHandling(signal, async () => {\n for await (const msg of retryQ) {\n this.collectToolCallsFromMessage(msg, toolCalls, toolResultCapture);\n this.backfillToolResults(msg, toolCalls, toolResultCapture);\n if (msg.type === \"result\") {\n if (msg.subtype === \"success\") {\n const r = msg as unknown as SDKResultSuccess;\n output = r.result;\n usage = aggregateUsage(r.modelUsage);\n if (this.isPersistent && r.session_id) {\n this._sessionId = r.session_id;\n }\n } else if (msg.is_error) {\n const r = msg as unknown as SDKResultError;\n throw new Error(\n `Claude query failed: ${r.errors?.join(\"; \") ?? \"unknown error\"}`,\n );\n }\n }\n }\n return {\n output,\n structuredOutput: undefined as AgentResult[\"structuredOutput\"],\n toolCalls,\n messages: [\n ...messages,\n ...(output !== null\n ? [{ role: \"assistant\" as const, content: output }]\n : []),\n ],\n usage,\n };\n });\n }\n if (this.isPersistent) this.clearPersistentSession();\n throw e;\n } finally {\n this.activeQuery = null;\n }\n\n return {\n output,\n structuredOutput: undefined as AgentResult[\"structuredOutput\"],\n toolCalls,\n messages: [\n ...messages,\n ...(output !== null\n ? [{ role: \"assistant\" as const, content: output }]\n : []),\n ],\n usage,\n };\n }\n\n // ─── executeRunStructured ───────────────────────────────────────\n\n protected async executeRunStructured<T>(\n messages: Message[],\n schema: StructuredOutputConfig<T>,\n options: RunOptions,\n signal: AbortSignal,\n ): Promise<AgentResult<T>> {\n this.checkAbort(signal);\n\n const sdk = await loadSDK();\n const isResuming = this.isPersistent && this._sessionId !== undefined;\n const prompt = isResuming\n ? extractLastUserPrompt(messages)\n : buildContextualPrompt(messages);\n let opts = this.buildQueryOptions(signal, options);\n const toolResultCapture = new Map<string, JSONValue>();\n opts = await this.buildMcpConfig(opts, toolResultCapture);\n\n // Claude SDK has native structured output via outputFormat\n const jsonSchema = zodToJsonSchema(schema.schema);\n opts.outputFormat = {\n type: \"json_schema\",\n schema: jsonSchema as Record<string, unknown>,\n };\n\n const q = sdk.query({ prompt, options: opts });\n this.activeQuery = q;\n const toolCalls: AgentResult[\"toolCalls\"] = [];\n let output: string | null = null;\n let structuredOutput: T | undefined;\n let usage: AgentResult[\"usage\"];\n\n try {\n for await (const msg of q) {\n this.collectToolCallsFromMessage(msg, toolCalls, toolResultCapture);\n this.backfillToolResults(msg, toolCalls, toolResultCapture);\n\n if (msg.type === \"result\" && msg.subtype === \"success\") {\n const r = msg as unknown as SDKResultSuccess;\n output = r.result;\n\n // Claude SDK returns parsed structured_output when using outputFormat\n if (r.structured_output !== undefined) {\n try {\n structuredOutput = schema.schema.parse(r.structured_output);\n } catch {\n // Fallback: try parsing result string\n try {\n structuredOutput = schema.schema.parse(JSON.parse(r.result));\n } catch {\n // Leave undefined\n }\n }\n } else if (r.result) {\n // Fallback: parse from result string\n try {\n const jsonMatch = r.result.match(/```(?:json)?\\s*([\\s\\S]*?)```/);\n const raw = jsonMatch ? jsonMatch[1]!.trim() : r.result.trim();\n structuredOutput = schema.schema.parse(JSON.parse(raw));\n } catch {\n // Leave undefined\n }\n }\n\n usage = aggregateUsage(r.modelUsage);\n if (this.isPersistent && r.session_id) {\n this._sessionId = r.session_id;\n }\n } else if (msg.type === \"result\" && msg.is_error) {\n const r = msg as unknown as SDKResultError;\n throw new Error(\n `Claude query failed: ${r.errors?.join(\"; \") ?? \"unknown error\"}`,\n );\n }\n }\n } catch (e) {\n if (signal.aborted) throw new AbortError();\n if (isResuming && this.isPersistent) {\n const retryQ = await this.prepareRetryQuery(\n sdk, messages, signal, options, toolResultCapture,\n (opts) => { opts.outputFormat = { type: \"json_schema\", schema: jsonSchema as Record<string, unknown> }; },\n );\n toolCalls.length = 0;\n output = null;\n structuredOutput = undefined;\n return this.withRetryErrorHandling(signal, async () => {\n for await (const msg of retryQ) {\n this.collectToolCallsFromMessage(msg, toolCalls, toolResultCapture);\n this.backfillToolResults(msg, toolCalls, toolResultCapture);\n if (msg.type === \"result\" && msg.subtype === \"success\") {\n const r = msg as unknown as SDKResultSuccess;\n output = r.result;\n if (r.structured_output !== undefined) {\n try { structuredOutput = schema.schema.parse(r.structured_output); } catch {\n try { structuredOutput = schema.schema.parse(JSON.parse(r.result)); } catch {\n // Leave undefined\n }\n }\n } else if (r.result) {\n try {\n const jsonMatch = r.result.match(/```(?:json)?\\s*([\\s\\S]*?)```/);\n const raw = jsonMatch ? jsonMatch[1]!.trim() : r.result.trim();\n structuredOutput = schema.schema.parse(JSON.parse(raw));\n } catch {\n // Leave undefined\n }\n }\n usage = aggregateUsage(r.modelUsage);\n if (this.isPersistent && r.session_id) {\n this._sessionId = r.session_id;\n }\n } else if (msg.type === \"result\" && msg.is_error) {\n const r = msg as unknown as SDKResultError;\n throw new Error(\n `Claude query failed: ${r.errors?.join(\"; \") ?? \"unknown error\"}`,\n );\n }\n }\n return {\n output,\n structuredOutput: structuredOutput as AgentResult<T>[\"structuredOutput\"],\n toolCalls,\n messages: [\n ...messages,\n ...(output !== null\n ? [{ role: \"assistant\" as const, content: output }]\n : []),\n ],\n usage,\n };\n });\n }\n if (this.isPersistent) this.clearPersistentSession();\n throw e;\n } finally {\n this.activeQuery = null;\n }\n\n return {\n output,\n structuredOutput: structuredOutput as AgentResult<T>[\"structuredOutput\"],\n toolCalls,\n messages: [\n ...messages,\n ...(output !== null\n ? [{ role: \"assistant\" as const, content: output }]\n : []),\n ],\n usage,\n };\n }\n\n // ─── executeStream ──────────────────────────────────────────────\n\n protected async *executeStream(\n messages: Message[],\n options: RunOptions,\n signal: AbortSignal,\n ): AsyncIterable<AgentEvent> {\n this.checkAbort(signal);\n\n const sdk = await loadSDK();\n const isResuming = this.isPersistent && this._sessionId !== undefined;\n const prompt = isResuming\n ? extractLastUserPrompt(messages)\n : buildContextualPrompt(messages);\n let opts = this.buildQueryOptions(signal, options);\n // Capture actual tool results from MCP handler execution\n const toolResultCapture = new Map<string, JSONValue>();\n opts = await this.buildMcpConfig(opts, toolResultCapture);\n\n const q = sdk.query({ prompt, options: opts });\n this.activeQuery = q;\n const thinkingBlockIndices = new Set<number>();\n const toolCallTracker = new ClaudeToolCallTracker();\n // Track pending tool calls to emit tool_call_end for tools without tool_use_summary\n const pendingStreamToolCalls = new Map<string, string>();\n let hasStreamedText = false;\n\n try {\n for await (const msg of q) {\n if (signal.aborted) throw new AbortError();\n\n const events = mapSDKMessage(msg, thinkingBlockIndices, toolCallTracker);\n if (events) {\n const mapped = Array.isArray(events) ? events : [events];\n for (const e of mapped) {\n // Track tool_call_start for fallback emission\n if (e.type === \"tool_call_start\") {\n pendingStreamToolCalls.set(e.toolCallId, e.toolName);\n }\n // Enrich tool_call_end with captured actual result instead of summary text\n if (e.type === \"tool_call_end\" && toolResultCapture.has(e.toolName)) {\n e.result = toolResultCapture.get(e.toolName)!;\n toolResultCapture.delete(e.toolName);\n pendingStreamToolCalls.delete(e.toolCallId);\n } else if (e.type === \"tool_call_end\") {\n pendingStreamToolCalls.delete(e.toolCallId);\n }\n if (e.type === \"text_delta\") hasStreamedText = true;\n yield e;\n }\n }\n\n // Capture session_id and emit done event on result\n if (msg.type === \"result\" && msg.subtype === \"success\") {\n const r = msg as unknown as SDKResultSuccess;\n // Emit tool_call_end for any tools that executed but never got tool_use_summary\n for (const [toolCallId, toolName] of pendingStreamToolCalls) {\n if (toolResultCapture.has(toolName)) {\n yield {\n type: \"tool_call_end\" as const,\n toolCallId,\n toolName,\n result: toolResultCapture.get(toolName)!,\n };\n toolResultCapture.delete(toolName);\n }\n }\n pendingStreamToolCalls.clear();\n if (r.session_id) {\n if (this.isPersistent) {\n this._sessionId = r.session_id;\n }\n yield this.emitSessionInfo(r.session_id);\n }\n yield {\n type: \"done\",\n finalOutput: hasStreamedText ? null : r.result,\n ...(hasStreamedText ? { streamed: true } : {}),\n };\n }\n }\n } catch (e) {\n if (signal.aborted) throw new AbortError();\n // Single retry on resume failure: clear session, rebuild with full history\n if (isResuming && this.isPersistent) {\n const retryQ = await this.prepareRetryQuery(sdk, messages, signal, options, toolResultCapture);\n const retryThinkingBlockIndices = new Set<number>();\n const retryToolCallTracker = new ClaudeToolCallTracker();\n const retryPendingToolCalls = new Map<string, string>();\n let retryHasStreamedText = false;\n try {\n for await (const msg of retryQ) {\n if (signal.aborted) throw new AbortError();\n const retryEvents = mapSDKMessage(msg, retryThinkingBlockIndices, retryToolCallTracker);\n if (retryEvents) {\n const mapped = Array.isArray(retryEvents) ? retryEvents : [retryEvents];\n for (const ev of mapped) {\n if (ev.type === \"tool_call_start\") {\n retryPendingToolCalls.set(ev.toolCallId, ev.toolName);\n }\n if (ev.type === \"tool_call_end\" && toolResultCapture.has(ev.toolName)) {\n ev.result = toolResultCapture.get(ev.toolName)!;\n toolResultCapture.delete(ev.toolName);\n retryPendingToolCalls.delete(ev.toolCallId);\n } else if (ev.type === \"tool_call_end\") {\n retryPendingToolCalls.delete(ev.toolCallId);\n }\n if (ev.type === \"text_delta\") retryHasStreamedText = true;\n yield ev;\n }\n }\n if (msg.type === \"result\" && msg.subtype === \"success\") {\n const r = msg as unknown as SDKResultSuccess;\n for (const [toolCallId, toolName] of retryPendingToolCalls) {\n if (toolResultCapture.has(toolName)) {\n yield {\n type: \"tool_call_end\" as const,\n toolCallId,\n toolName,\n result: toolResultCapture.get(toolName)!,\n };\n toolResultCapture.delete(toolName);\n }\n }\n retryPendingToolCalls.clear();\n if (r.session_id) {\n if (this.isPersistent) {\n this._sessionId = r.session_id;\n }\n yield this.emitSessionInfo(r.session_id);\n }\n yield {\n type: \"done\",\n finalOutput: retryHasStreamedText ? null : r.result,\n ...(retryHasStreamedText ? { streamed: true } : {}),\n };\n }\n }\n } catch (retryError) {\n if (this.isPersistent) this.clearPersistentSession();\n if (signal.aborted) throw new AbortError();\n throw retryError;\n } finally {\n this.activeQuery = null;\n }\n return;\n }\n if (this.isPersistent) this.clearPersistentSession();\n throw e;\n } finally {\n this.activeQuery = null;\n }\n }\n\n override dispose(): void {\n this._sessionId = undefined;\n super.dispose();\n }\n}\n\n// ─── Helpers ────────────────────────────────────────────────────\n\nclass ClaudeAgentService implements IAgentService {\n readonly name = \"claude\";\n private disposed = false;\n private readonly options: ClaudeBackendOptions;\n private cachedModels: ModelInfo[] | null = null;\n\n constructor(options: ClaudeBackendOptions) {\n this.options = options;\n }\n\n createAgent(config: FullAgentConfig): IAgent {\n if (this.disposed) throw new DisposedError(\"ClaudeAgentService\");\n return new ClaudeAgent(config, this.options);\n }\n\n async listModels(): Promise<ModelInfo[]> {\n if (this.disposed) throw new DisposedError(\"ClaudeAgentService\");\n if (this.cachedModels) return this.cachedModels;\n\n const token = this.options.oauthToken;\n if (!token) {\n return [];\n }\n\n const res = await globalThis.fetch(\n `${ANTHROPIC_MODELS_URL}?limit=100`,\n {\n headers: {\n Authorization: `Bearer ${token}`,\n \"anthropic-version\": ANTHROPIC_API_VERSION,\n \"anthropic-beta\": ANTHROPIC_OAUTH_BETA,\n },\n },\n );\n\n if (!res.ok) {\n return [];\n }\n\n const body = (await res.json()) as {\n data?: Array<{ id: string; display_name?: string; max_input_tokens?: number }>;\n };\n\n if (!body.data || body.data.length === 0) {\n return [];\n }\n\n this.cachedModels = body.data.map((m) => ({\n id: m.id,\n name: m.display_name,\n provider: \"claude\",\n ...(m.max_input_tokens != null && { contextWindow: m.max_input_tokens }),\n }));\n return this.cachedModels;\n }\n\n async validate(): Promise<ValidationResult> {\n if (this.disposed) throw new DisposedError(\"ClaudeAgentService\");\n\n const errors: string[] = [];\n try {\n await loadSDK();\n } catch (e) {\n errors.push(\n e instanceof Error ? e.message : String(e),\n );\n return { valid: false, errors };\n }\n\n // Verify CLI is accessible by attempting a minimal query\n try {\n const sdk = await loadSDK();\n const q = sdk.query({\n prompt: \"echo test\",\n options: {\n model: \"claude-sonnet-4-20250514\",\n pathToClaudeCodeExecutable: this.options.cliPath,\n cwd: this.options.workingDirectory,\n persistSession: false,\n maxTurns: 1,\n permissionMode: \"plan\",\n },\n });\n // Wait for first message (auth check)\n const first = await q.next();\n q.close();\n if (first.done) {\n errors.push(\"Claude CLI returned no messages — may not be authenticated.\");\n }\n } catch (e) {\n errors.push(\n `Failed to connect to Claude CLI: ${e instanceof Error ? e.message : String(e)}`,\n );\n }\n\n return { valid: errors.length === 0, errors };\n }\n\n async dispose(): Promise<void> {\n if (this.disposed) return;\n this.disposed = true;\n this.cachedModels = null;\n }\n}\n\n// ─── Factory ────────────────────────────────────────────────────\n\n/** Create Claude CLI backend service. */\nexport function createClaudeService(\n options: ClaudeBackendOptions,\n): IAgentService {\n return new ClaudeAgentService(options);\n}\n","import type {\n IAgent,\n IAgentService,\n FullAgentConfig,\n AgentResult,\n AgentEvent,\n Message,\n RunOptions,\n StructuredOutputConfig,\n ToolDefinition,\n VercelAIBackendOptions,\n ModelInfo,\n ValidationResult,\n JSONValue,\n PermissionRequest as UnifiedPermissionRequest,\n PermissionDecision,\n} from \"../types.js\";\nimport { getTextContent, ErrorCode, classifyAgentError, isRecoverableErrorCode } from \"../types.js\";\nimport { BaseAgent } from \"../base-agent.js\";\nimport { DisposedError, DependencyError, AbortError, ToolExecutionError } from \"../errors.js\";\nimport { zodToJsonSchema } from \"../utils/schema.js\";\nimport type { IPermissionStore } from \"../permission-store.js\";\n\nexport type { VercelAIBackendOptions } from \"../types.js\";\n\n// ─── Local Type Definitions (matching Vercel AI SDK v6 shapes) ──\n// Avoids requiring the SDK to be installed at compile time.\n\n/** @internal Vercel AI SDK tool result */\ninterface SDKToolDefinition {\n description: string;\n inputSchema: unknown;\n execute?: (input: unknown, options: unknown) => Promise<unknown>;\n needsApproval?: boolean | ((input: unknown, options: unknown) => Promise<boolean>);\n}\n\n/** @internal Vercel AI SDK v6 generateText result */\ninterface SDKGenerateTextResult {\n text: string;\n toolCalls: Array<{ toolCallId: string; toolName: string; input: unknown }>;\n toolResults: Array<{ toolCallId: string; toolName: string; output: unknown }>;\n steps: Array<{\n text: string;\n toolCalls: Array<{ toolCallId: string; toolName: string; input: unknown }>;\n toolResults: Array<{ toolCallId: string; toolName: string; output: unknown }>;\n usage: { inputTokens?: number; outputTokens?: number };\n finishReason: string;\n }>;\n totalUsage: { inputTokens?: number; outputTokens?: number };\n finishReason: string;\n response: { messages: unknown[] };\n}\n\n/** @internal Vercel AI SDK generateObject result */\ninterface SDKGenerateObjectResult {\n object: unknown;\n usage: { inputTokens?: number; outputTokens?: number };\n}\n\n/** @internal Vercel AI SDK streamText result */\ninterface SDKStreamTextResult {\n fullStream: AsyncIterable<SDKStreamPart>;\n totalUsage: PromiseLike<{ inputTokens?: number; outputTokens?: number }>;\n text: PromiseLike<string>;\n}\n\n/** @internal Vercel AI SDK v6 stream part union */\ntype SDKStreamPart =\n | { type: \"text-delta\"; text: string }\n | { type: \"tool-call\"; toolCallId: string; toolName: string; input: unknown }\n | { type: \"tool-result\"; toolCallId: string; toolName: string; output: unknown }\n | { type: \"tool-error\"; toolCallId: string; toolName: string; error: unknown }\n | { type: \"reasoning-start\" }\n | { type: \"reasoning-end\" }\n | { type: \"reasoning-delta\"; text: string }\n | { type: \"finish-step\"; usage: { inputTokens?: number; outputTokens?: number }; finishReason: string }\n | { type: \"finish\"; finishReason: string; totalUsage: { inputTokens?: number; outputTokens?: number } }\n | { type: \"error\"; error: unknown }\n | { type: string };\n\n/** @internal Vercel AI SDK LanguageModel — opaque type from SDK */\ntype SDKLanguageModel = Record<string, unknown>;\n\n/** @internal SDK module shape */\ninterface SDKModule {\n generateText: (options: Record<string, unknown>) => Promise<SDKGenerateTextResult>;\n streamText: (options: Record<string, unknown>) => SDKStreamTextResult;\n generateObject: (options: Record<string, unknown>) => Promise<SDKGenerateObjectResult>;\n tool: (options: Record<string, unknown>) => SDKToolDefinition;\n jsonSchema: (schema: unknown) => unknown;\n stepCountIs: (count: number) => unknown;\n}\n\n/** @internal OpenAI-compatible module shape */\ninterface SDKCompatModule {\n createOpenAICompatible: (options: Record<string, unknown>) => {\n chatModel: (modelId: string) => SDKLanguageModel;\n languageModel: (modelId: string) => SDKLanguageModel;\n };\n}\n\n// ─── Dynamic SDK Loader ─────────────────────────────────────────\n\n/** Module-level mocks set by _injectSDK()/_injectCompat() for testing */\nlet _sdkMock: SDKModule | null = null;\nlet _compatMock: SDKCompatModule | null = null;\n\n/** Load the Vercel AI SDK. Checks module-level mock first, then dynamic import. */\nasync function loadSDK(): Promise<SDKModule> {\n if (_sdkMock) return _sdkMock;\n try {\n // @ts-ignore — peer dependency, not present at compile time\n return (await import(\"ai\")) as SDKModule;\n } catch {\n throw new DependencyError(\"ai\");\n }\n}\n\n/** Load the OpenAI-compatible module. Checks module-level mock first, then dynamic import. */\nasync function loadCompat(): Promise<SDKCompatModule> {\n if (_compatMock) return _compatMock;\n try {\n // @ts-ignore — peer dependency, not present at compile time\n return (await import(\"@ai-sdk/openai-compatible\")) as SDKCompatModule;\n } catch {\n throw new DependencyError(\"@ai-sdk/openai-compatible\");\n }\n}\n\n/** @internal For testing: inject mock SDK module */\nexport function _injectSDK(mock: SDKModule | null): void {\n _sdkMock = mock;\n}\n\n/** @internal For testing: inject mock compat module */\nexport function _injectCompat(mock: SDKCompatModule | null): void {\n _compatMock = mock;\n}\n\n/** @internal For testing: reset injected SDK */\nexport function _resetSDK(): void {\n _sdkMock = null;\n _compatMock = null;\n}\n\n// ─── Constants ──────────────────────────────────────────────────\n\nconst DEFAULT_BASE_URL = \"https://openrouter.ai/api/v1\";\nconst DEFAULT_PROVIDER = \"openrouter\";\nconst DEFAULT_MAX_TURNS = 10;\n\n// ─── Tool Mapping ───────────────────────────────────────────────\n\nfunction mapToolsToSDK(\n sdk: SDKModule,\n tools: ToolDefinition[],\n config: FullAgentConfig,\n sessionApprovals: Set<string>,\n permissionStore: IPermissionStore | undefined,\n signal: AbortSignal,\n): Record<string, SDKToolDefinition> {\n const toolMap: Record<string, SDKToolDefinition> = {};\n const supervisor = config.supervisor;\n\n for (const ourTool of tools) {\n const jsonSchema = zodToJsonSchema(ourTool.parameters);\n\n toolMap[ourTool.name] = sdk.tool({\n description: ourTool.description,\n inputSchema: sdk.jsonSchema(jsonSchema),\n execute: wrapToolExecute(ourTool, supervisor, sessionApprovals, permissionStore, signal),\n ...(ourTool.needsApproval && supervisor?.onPermission\n ? {\n needsApproval: async (_input: Record<string, unknown>) => {\n // If already approved via store, skip\n if (permissionStore && await permissionStore.isApproved(ourTool.name)) return false;\n // If already session-approved, skip\n if (sessionApprovals.has(ourTool.name)) return false;\n return true; // will be handled in execute wrapper\n },\n }\n : {}),\n });\n }\n\n // M1: Inject built-in ask_user tool when supervisor.onAskUser is provided\n if (supervisor?.onAskUser) {\n const onAskUser = supervisor.onAskUser;\n toolMap[\"ask_user\"] = sdk.tool({\n description: \"Ask the user a question and wait for their response\",\n inputSchema: sdk.jsonSchema({\n type: \"object\",\n properties: {\n question: { type: \"string\", description: \"The question to ask the user\" },\n },\n required: [\"question\"],\n }),\n execute: async (args: { question: string }) => {\n const response = await onAskUser(\n { question: args.question, allowFreeform: true },\n signal,\n );\n return response.answer;\n },\n });\n }\n\n return toolMap;\n}\n\nfunction wrapToolExecute(\n ourTool: ToolDefinition,\n supervisor: FullAgentConfig[\"supervisor\"],\n sessionApprovals: Set<string>,\n permissionStore: IPermissionStore | undefined,\n signal: AbortSignal,\n): (args: unknown, options?: { toolCallId?: string }) => Promise<JSONValue> {\n return async (args: unknown, options?: { toolCallId?: string }): Promise<JSONValue> => {\n // Permission check for tools with needsApproval\n if (ourTool.needsApproval && supervisor?.onPermission) {\n // Check store first, then fall back to sessionApprovals set\n const storeApproved = permissionStore && await permissionStore.isApproved(ourTool.name);\n if (!storeApproved && !sessionApprovals.has(ourTool.name)) {\n const request: UnifiedPermissionRequest = {\n toolName: ourTool.name,\n toolArgs: (args ?? {}) as Record<string, unknown>,\n toolCallId: options?.toolCallId,\n };\n\n const decision: PermissionDecision = await supervisor.onPermission(\n request,\n signal,\n );\n\n if (!decision.allowed) {\n throw new ToolExecutionError(\n ourTool.name,\n decision.reason ?? \"Permission denied\",\n );\n }\n\n // Persist approval to store if available\n if (permissionStore && decision.scope) {\n await permissionStore.approve(ourTool.name, decision.scope);\n }\n\n // Cache session-scoped approvals in memory\n if (decision.scope === \"session\" || decision.scope === \"always\" || decision.scope === \"project\") {\n sessionApprovals.add(ourTool.name);\n }\n\n // Use modified input if provided\n if (decision.modifiedInput) {\n args = decision.modifiedInput;\n }\n }\n }\n\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const result = await ourTool.execute(args as any);\n return result as JSONValue;\n } catch (e) {\n if (e instanceof ToolExecutionError) throw e;\n throw new ToolExecutionError(\n ourTool.name,\n e instanceof Error ? e.message : String(e),\n );\n }\n };\n}\n\n// ─── Message Conversion ─────────────────────────────────────────\n\nfunction messagesToSDK(messages: Message[]): Array<Record<string, unknown>> {\n return messages.map((msg) => {\n switch (msg.role) {\n case \"user\":\n return { role: \"user\", content: getTextContent(msg.content) };\n case \"assistant\": {\n let content = getTextContent(msg.content);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const thinking = (msg as any).thinking as string | undefined;\n if (thinking) {\n content = `[reasoning: ${thinking}]\\n${content}`;\n }\n const mapped: Record<string, unknown> = { role: \"assistant\", content };\n if (msg.toolCalls && msg.toolCalls.length > 0) {\n mapped.toolCalls = msg.toolCalls.map((tc) => ({\n id: tc.id,\n name: tc.name,\n args: tc.args,\n }));\n }\n return mapped;\n }\n case \"system\":\n return { role: \"system\", content: msg.content };\n case \"tool\": {\n if (msg.toolResults && msg.toolResults.length > 0) {\n return {\n role: \"tool\",\n toolResults: msg.toolResults.map((tr) => ({\n toolCallId: tr.toolCallId,\n name: tr.name,\n result: tr.result,\n isError: tr.isError ?? false,\n })),\n };\n }\n return { role: \"tool\", content: msg.content ?? \"\" };\n }\n default:\n return { role: \"user\", content: \"\" };\n }\n });\n}\n\n// ─── Event Mapping (fullStream → AgentEvent) ────────────────────\n\nfunction mapStreamPart(part: SDKStreamPart): AgentEvent | null {\n switch (part.type) {\n case \"text-delta\": {\n const p = part as Extract<SDKStreamPart, { type: \"text-delta\" }>;\n return { type: \"text_delta\", text: p.text ?? \"\" };\n }\n\n case \"tool-call\": {\n const p = part as Extract<SDKStreamPart, { type: \"tool-call\" }>;\n return {\n type: \"tool_call_start\",\n toolCallId: String(p.toolCallId ?? \"\"),\n toolName: p.toolName ?? \"unknown\",\n args: (p.input ?? {}) as JSONValue,\n };\n }\n\n case \"tool-result\": {\n const p = part as Extract<SDKStreamPart, { type: \"tool-result\" }>;\n return {\n type: \"tool_call_end\",\n toolCallId: String(p.toolCallId ?? \"\"),\n toolName: p.toolName ?? \"unknown\",\n result: (p.output ?? null) as JSONValue,\n };\n }\n\n case \"tool-error\": {\n const p = part as Extract<SDKStreamPart, { type: \"tool-error\" }>;\n return {\n type: \"error\",\n error: p.error instanceof Error\n ? p.error.message\n : String(p.error ?? \"Tool execution failed\"),\n recoverable: true,\n code: ErrorCode.TOOL_EXECUTION,\n };\n }\n\n case \"reasoning-start\":\n return { type: \"thinking_start\" };\n\n case \"reasoning-end\":\n return { type: \"thinking_end\" };\n\n case \"reasoning-delta\": {\n const p = part as Extract<SDKStreamPart, { type: \"reasoning-delta\" }>;\n return { type: \"thinking_delta\", text: p.text ?? \"\" };\n }\n\n case \"finish-step\": {\n const p = part as Extract<SDKStreamPart, { type: \"finish-step\" }>;\n return {\n type: \"usage_update\",\n promptTokens: Number(p.usage?.inputTokens ?? 0),\n completionTokens: Number(p.usage?.outputTokens ?? 0),\n };\n }\n\n case \"error\": {\n const p = part as Extract<SDKStreamPart, { type: \"error\" }>;\n const errorMsg = p.error instanceof Error\n ? p.error.message\n : String(p.error ?? \"Unknown error\");\n const code = classifyAgentError(errorMsg);\n return {\n type: \"error\",\n error: errorMsg,\n recoverable: isRecoverableErrorCode(code),\n code,\n };\n }\n\n default:\n return null;\n }\n}\n\n// ─── VercelAIAgent ──────────────────────────────────────────────\n\nclass VercelAIAgent extends BaseAgent {\n protected readonly backendName = \"vercel-ai\";\n private readonly backendOptions: VercelAIBackendOptions;\n private readonly sessionApprovals = new Set<string>();\n private model: SDKLanguageModel | null = null;\n\n constructor(\n config: FullAgentConfig,\n backendOptions: VercelAIBackendOptions,\n ) {\n super(config);\n this.backendOptions = backendOptions;\n }\n\n private async getModel(options: RunOptions): Promise<SDKLanguageModel> {\n const requestedModel = options.model;\n const defaultModel = this.config.model;\n\n // If same as default/cached, reuse\n if (requestedModel === defaultModel && this.model) return this.model;\n\n const compat = await loadCompat();\n const provider = compat.createOpenAICompatible({\n name: this.backendOptions.provider ?? DEFAULT_PROVIDER,\n baseURL: this.backendOptions.baseUrl ?? DEFAULT_BASE_URL,\n apiKey: this.backendOptions.apiKey,\n });\n\n const model = provider.chatModel(requestedModel);\n // Cache only when using default model\n if (requestedModel === defaultModel) {\n this.model = model;\n }\n return model;\n }\n\n private async getSDKTools(signal: AbortSignal, options?: RunOptions): Promise<Record<string, SDKToolDefinition>> {\n const sdk = await loadSDK();\n const tools = this.resolveTools(options);\n return mapToolsToSDK(sdk, tools, this.config, this.sessionApprovals, this.config.permissionStore, signal);\n }\n\n // ─── executeRun ─────────────────────────────────────────────────\n\n protected async executeRun(\n messages: Message[],\n options: RunOptions,\n signal: AbortSignal,\n ): Promise<AgentResult> {\n this.checkAbort(signal);\n\n const sdk = await loadSDK();\n const model = await this.getModel(options);\n const tools = await this.getSDKTools(signal, options);\n const maxTurns = this.config.maxTurns ?? DEFAULT_MAX_TURNS;\n\n const sdkMessages = messagesToSDK(messages);\n const hasTools = Object.keys(tools).length > 0;\n\n const result: SDKGenerateTextResult = await sdk.generateText({\n model,\n system: this.config.systemPrompt,\n messages: sdkMessages,\n tools: hasTools ? tools : undefined,\n stopWhen: sdk.stepCountIs(maxTurns),\n abortSignal: signal,\n ...(this.config.modelParams?.temperature !== undefined && {\n temperature: this.config.modelParams.temperature,\n }),\n ...(this.config.modelParams?.maxTokens !== undefined && {\n maxTokens: this.config.modelParams.maxTokens,\n }),\n ...(this.config.modelParams?.topP !== undefined && {\n topP: this.config.modelParams.topP,\n }),\n ...(this.config.providerOptions && {\n providerOptions: this.config.providerOptions,\n }),\n });\n\n // Collect all tool calls across all steps\n const toolCalls: AgentResult[\"toolCalls\"] = [];\n for (const step of result.steps) {\n for (const tc of step.toolCalls) {\n const matchingResult = step.toolResults.find(\n (tr) => tr.toolCallId === tc.toolCallId,\n );\n toolCalls.push({\n toolName: tc.toolName,\n args: (tc.input ?? {}) as JSONValue,\n result: (matchingResult?.output ?? null) as JSONValue,\n approved: true,\n });\n }\n }\n\n const usage = {\n promptTokens: Number(result.totalUsage?.inputTokens ?? 0),\n completionTokens: Number(result.totalUsage?.outputTokens ?? 0),\n };\n\n // In multi-step flows, result.text includes intermediate reasoning from all steps.\n // Use only the last step's text as the final output.\n const lastStep = result.steps.length > 0 ? result.steps[result.steps.length - 1] : null;\n const outputText = lastStep?.text || null;\n\n return {\n output: outputText,\n structuredOutput: undefined as AgentResult[\"structuredOutput\"],\n toolCalls,\n messages: [\n ...messages,\n ...(outputText\n ? [{ role: \"assistant\" as const, content: outputText }]\n : []),\n ],\n usage,\n };\n }\n\n // ─── executeRunStructured ───────────────────────────────────────\n\n protected async executeRunStructured<T>(\n messages: Message[],\n schema: StructuredOutputConfig<T>,\n options: RunOptions,\n signal: AbortSignal,\n ): Promise<AgentResult<T>> {\n this.checkAbort(signal);\n\n const sdk = await loadSDK();\n const model = await this.getModel(options);\n\n const sdkMessages = messagesToSDK(messages);\n const jsonSchema = zodToJsonSchema(schema.schema);\n\n const result: SDKGenerateObjectResult = await sdk.generateObject({\n model,\n system: this.config.systemPrompt,\n messages: sdkMessages,\n schema: sdk.jsonSchema(jsonSchema),\n schemaName: schema.name,\n schemaDescription: schema.description,\n abortSignal: signal,\n ...(this.config.modelParams?.temperature !== undefined && {\n temperature: this.config.modelParams.temperature,\n }),\n ...(this.config.modelParams?.maxTokens !== undefined && {\n maxTokens: this.config.modelParams.maxTokens,\n }),\n ...(this.config.providerOptions && {\n providerOptions: this.config.providerOptions,\n }),\n });\n\n // Validate and parse through our zod schema\n let structuredOutput: T | undefined;\n try {\n structuredOutput = schema.schema.parse(result.object);\n } catch {\n // If zod validation fails, leave undefined\n }\n\n const usage = {\n promptTokens: Number(result.usage?.inputTokens ?? 0),\n completionTokens: Number(result.usage?.outputTokens ?? 0),\n };\n\n return {\n output: JSON.stringify(result.object),\n structuredOutput: structuredOutput as AgentResult<T>[\"structuredOutput\"],\n toolCalls: [],\n messages: [\n ...messages,\n ...(result.object != null\n ? [{ role: \"assistant\" as const, content: JSON.stringify(result.object) }]\n : []),\n ],\n usage,\n };\n }\n\n // ─── executeStream ──────────────────────────────────────────────\n\n protected async *executeStream(\n messages: Message[],\n options: RunOptions,\n signal: AbortSignal,\n ): AsyncIterable<AgentEvent> {\n this.checkAbort(signal);\n\n const sdk = await loadSDK();\n const model = await this.getModel(options);\n const tools = await this.getSDKTools(signal, options);\n const maxTurns = this.config.maxTurns ?? DEFAULT_MAX_TURNS;\n\n const sdkMessages = messagesToSDK(messages);\n const hasTools = Object.keys(tools).length > 0;\n\n const result: SDKStreamTextResult = sdk.streamText({\n model,\n system: this.config.systemPrompt,\n messages: sdkMessages,\n tools: hasTools ? tools : undefined,\n stopWhen: sdk.stepCountIs(maxTurns),\n abortSignal: signal,\n ...(this.config.modelParams?.temperature !== undefined && {\n temperature: this.config.modelParams.temperature,\n }),\n ...(this.config.modelParams?.maxTokens !== undefined && {\n maxTokens: this.config.modelParams.maxTokens,\n }),\n ...(this.config.modelParams?.topP !== undefined && {\n topP: this.config.modelParams.topP,\n }),\n ...(this.config.providerOptions && {\n providerOptions: this.config.providerOptions,\n }),\n });\n\n let finalText = \"\";\n\n try {\n for await (const part of result.fullStream) {\n if (signal.aborted) throw new AbortError();\n\n const event = mapStreamPart(part as SDKStreamPart);\n if (event) yield event;\n\n if ((part as SDKStreamPart).type === \"text-delta\") {\n finalText += (part as Extract<SDKStreamPart, { type: \"text-delta\" }>).text ?? \"\";\n }\n\n // When a step finishes with tool calls, the text accumulated so far is\n // intermediate reasoning (e.g. \"Let me search...\"). Reset so that only\n // the final step's text becomes the output.\n if ((part as SDKStreamPart).type === \"finish-step\") {\n const p = part as Extract<SDKStreamPart, { type: \"finish-step\" }>;\n if (p.finishReason === \"tool-calls\") {\n finalText = \"\";\n }\n }\n }\n\n // Emit final usage from totalUsage\n const totalUsage = await result.totalUsage;\n yield {\n type: \"usage_update\",\n promptTokens: Number(totalUsage?.inputTokens ?? 0),\n completionTokens: Number(totalUsage?.outputTokens ?? 0),\n };\n\n const hasStreamed = finalText.length > 0;\n yield {\n type: \"done\",\n finalOutput: hasStreamed ? null : (finalText || null),\n ...(hasStreamed ? { streamed: true } : {}),\n };\n } catch (e) {\n if (signal.aborted) throw new AbortError();\n throw e;\n }\n }\n\n override dispose(): void {\n this.sessionApprovals.clear();\n this.model = null;\n super.dispose();\n }\n}\n\n// ─── VercelAIAgentService ───────────────────────────────────────\n\nclass VercelAIAgentService implements IAgentService {\n readonly name = \"vercel-ai\";\n private disposed = false;\n private readonly options: VercelAIBackendOptions;\n\n constructor(options: VercelAIBackendOptions) {\n this.options = options;\n }\n\n createAgent(config: FullAgentConfig): IAgent {\n if (this.disposed) throw new DisposedError(\"VercelAIAgentService\");\n return new VercelAIAgent(config, this.options);\n }\n\n async listModels(): Promise<ModelInfo[]> {\n if (this.disposed) throw new DisposedError(\"VercelAIAgentService\");\n\n const baseUrl = (this.options.baseUrl || \"https://api.openai.com/v1\").replace(/\\/+$/, \"\");\n\n try {\n const res = await globalThis.fetch(`${baseUrl}/models`, {\n headers: {\n Authorization: `Bearer ${this.options.apiKey}`,\n // OpenRouter requires HTTP-Referer for API access\n \"HTTP-Referer\": \"https://github.com/nicepkg/agent-sdk\",\n },\n });\n\n if (!res.ok) {\n return [];\n }\n\n const body = await res.json() as Record<string, unknown>;\n\n // OpenAI-compatible format: { data: [{ id, name?, description?, context_length? }] }\n if (body.data && Array.isArray(body.data)) {\n return (body.data as Array<Record<string, unknown>>)\n .filter((m) => typeof m.id === \"string\")\n .map((m) => ({\n id: m.id as string,\n ...(typeof m.name === \"string\" && { name: m.name }),\n ...(typeof m.description === \"string\" && { description: m.description }),\n ...(typeof m.context_length === \"number\" && { contextWindow: m.context_length }),\n }));\n }\n\n // Some providers return a flat array of model objects\n if (Array.isArray(body)) {\n return (body as Array<Record<string, unknown>>)\n .filter((m) => typeof m.id === \"string\")\n .map((m) => ({\n id: m.id as string,\n ...(typeof m.name === \"string\" && { name: m.name }),\n ...(typeof m.description === \"string\" && { description: m.description }),\n ...(typeof m.context_length === \"number\" && { contextWindow: m.context_length }),\n }));\n }\n\n return [];\n } catch {\n return [];\n }\n }\n\n async validate(): Promise<ValidationResult> {\n if (this.disposed) throw new DisposedError(\"VercelAIAgentService\");\n\n const errors: string[] = [];\n\n if (!this.options.apiKey) {\n errors.push(\"apiKey is required for Vercel AI backend.\");\n }\n\n try {\n await loadSDK();\n } catch (e) {\n errors.push(e instanceof Error ? e.message : String(e));\n }\n\n try {\n await loadCompat();\n } catch (e) {\n errors.push(e instanceof Error ? e.message : String(e));\n }\n\n return { valid: errors.length === 0, errors };\n }\n\n async dispose(): Promise<void> {\n if (this.disposed) return;\n this.disposed = true;\n }\n}\n\n// ─── Factory ────────────────────────────────────────────────────\n\n/** Create Vercel AI SDK backend service. */\nexport function createVercelAIService(\n options: VercelAIBackendOptions,\n): IAgentService {\n return new VercelAIAgentService(options);\n}\n","/**\n * @witqq/agent-sdk — Chat domain types\n *\n * All type definitions and interfaces for the chat layer.\n * Pure types + ChatId generation (tightly coupled to branded type).\n */\n\nimport type { UsageData, ToolDefinition, ErrorCode } from \"../types.js\";\nimport type { AuthToken } from \"../auth/types.js\";\n\n// ─── Unique ID ─────────────────────────────────────────────────\n\n/** Branded type for unique identifiers */\nexport type ChatId = string & { readonly __brand: \"ChatId\" };\n\n/**\n * Generate a new unique ChatId (crypto.randomUUID-based)\n * @returns Branded ChatId string\n */\nexport function createChatId(): ChatId {\n return crypto.randomUUID() as ChatId;\n}\n\n/** UUID v4 pattern for ChatId validation */\nconst UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;\n\n/**\n * Cast a string to ChatId with UUID format validation.\n * Use this instead of manual `as ChatId` type assertions.\n *\n * @param value - String to validate and cast\n * @returns Branded ChatId\n * @throws {TypeError} If value is not a valid UUID v4 format\n */\nexport function toChatId(value: string): ChatId {\n if (!UUID_RE.test(value)) {\n throw new TypeError(`Invalid ChatId: \"${value}\" is not a valid UUID`);\n }\n return value as ChatId;\n}\n\n/**\n * Accepts either a plain string or branded ChatId for API convenience.\n * Use this in public API signatures so consumers don't need `as ChatId` casts.\n */\nexport type ChatIdLike = string | ChatId;\n\n// ─── Status Types ──────────────────────────────────────────────\n\n/** Lifecycle status of a message part (text, reasoning, etc.) */\nexport type PartStatus = \"pending\" | \"streaming\" | \"complete\" | \"error\";\n/** Lifecycle status of a tool call within a message */\nexport type ToolCallStatus = \"pending\" | \"running\" | \"requires_approval\" | \"complete\" | \"error\" | \"denied\";\n/** Lifecycle status of an entire message */\nexport type MessageStatus = \"pending\" | \"streaming\" | \"complete\" | \"error\" | \"cancelled\";\n/** Lifecycle status of a chat session */\nexport type SessionStatus = \"active\";\n/** Lifecycle status of the chat runtime */\nexport type RuntimeStatus = \"idle\" | \"streaming\" | \"error\" | \"disposed\";\n\n// ─── Message Parts (union) ─────────────────────────────────────\n\n/** Plain text content part */\nexport interface TextPart { type: \"text\"; text: string; status: PartStatus; }\n/** Model reasoning/thinking content part */\nexport interface ReasoningPart { type: \"reasoning\"; text: string; status: PartStatus; }\n/** Tool invocation part with call ID, arguments, optional result */\nexport interface ToolCallPart { type: \"tool_call\"; toolCallId: string; name: string; args: unknown; result?: unknown; status: ToolCallStatus; error?: string; }\n/** Source reference part (URL citation) */\nexport interface SourcePart { type: \"source\"; url: string; title?: string; status: PartStatus; }\n/** File attachment part (base64-encoded data) */\nexport interface FilePart { type: \"file\"; name: string; mimeType: string; data: string; status: PartStatus; }\n/** Union of all message part types */\nexport type MessagePart = TextPart | ReasoningPart | ToolCallPart | SourcePart | FilePart;\n\n// ─── Chat Message ──────────────────────────────────────────────\n\n/** Role of message author */\nexport type ChatRole = \"user\" | \"assistant\" | \"system\";\n\n/** Metadata attached to messages — useful preset for the TMetadata generic */\nexport interface ChatMessageMetadata {\n model?: string;\n backend?: string;\n usage?: UsageData;\n isSummary?: boolean;\n estimatedTokens?: number;\n custom?: Record<string, unknown>;\n}\n\n/** Message status */\nexport type ChatMessageStatus = MessageStatus;\n\n/** A single chat message — the fundamental unit of conversation */\nexport interface ChatMessage<TMetadata = unknown> {\n id: ChatId;\n role: ChatRole;\n parts: MessagePart[];\n metadata?: TMetadata;\n createdAt: string;\n updatedAt?: string;\n status: MessageStatus;\n}\n\n// ─── Supporting Types ──────────────────────────────────────────\n\n// ─── Chat Session ──────────────────────────────────────────────\n\n/** Session configuration snapshot */\nexport interface ChatSessionConfig {\n model: string;\n backend: string;\n systemPrompt?: string;\n temperature?: number;\n maxTokens?: number;\n}\n\n/**\n * Session metadata tracking usage statistics and custom extensions.\n *\n * Updated automatically by session stores on each `addMessage()` call.\n * The generic `TCustom` parameter allows type-safe application-specific\n * metadata via the `custom` field.\n *\n * @typeParam TCustom - Shape of the `custom` field (defaults to `Record<string, unknown>`)\n */\nexport interface ChatSessionMetadata<TCustom extends Record<string, unknown> = Record<string, unknown>> {\n /** Number of messages in the session (updated by session store) */\n messageCount: number;\n /** Total token count across all messages in the session */\n totalTokens: number;\n /** Optional tags for session categorization and filtering */\n tags?: string[];\n /** Application-specific metadata — typed via the TCustom generic parameter */\n custom?: TCustom;\n}\n\n/** Chat session — a conversation with ordered messages (pure serializable data) */\nexport interface ChatSession<TCustom extends Record<string, unknown> = Record<string, unknown>> {\n id: ChatId;\n title?: string;\n messages: ChatMessage[];\n config: ChatSessionConfig;\n metadata: ChatSessionMetadata<TCustom>;\n status: SessionStatus;\n createdAt: string;\n updatedAt: string;\n backendSessionId?: string;\n}\n\n/**\n * Reactive wrapper around ChatSession — provides subscribe/getSnapshot for\n * React useSyncExternalStore integration and lastMessage convenience getter.\n * Session stores may optionally return ObservableSession instances.\n */\nexport interface ObservableSession<TCustom extends Record<string, unknown> = Record<string, unknown>>\n extends ChatSession<TCustom> {\n /** Subscribe to session changes (for React useSyncExternalStore) */\n subscribe(callback: () => void): () => void;\n /** Get immutable snapshot of session state (for React useSyncExternalStore) */\n getSnapshot(): ChatSession<TCustom>;\n /** Last message in the session */\n readonly lastMessage: ChatMessage | undefined;\n}\n\n/** Lightweight session info for listing (without full message array) */\nexport interface SessionInfo {\n id: ChatId;\n title?: string;\n status: SessionStatus;\n messageCount: number;\n lastMessage?: ChatMessage;\n createdAt: string;\n updatedAt: string;\n}\n\n// ─── Chat Events ───────────────────────────────────────────────\n\n/** Events emitted during chat operation */\nexport type ChatEvent =\n | { type: \"message:start\"; messageId: ChatId; role: ChatRole }\n | { type: \"message:delta\"; messageId: ChatId; text: string }\n | { type: \"message:complete\"; messageId: ChatId; message: ChatMessage }\n | {\n type: \"tool:start\";\n messageId: ChatId;\n toolCallId: string;\n toolName: string;\n args: Record<string, unknown>;\n }\n | {\n type: \"tool:complete\";\n messageId: ChatId;\n toolCallId: string;\n toolName: string;\n result: unknown;\n isError?: boolean;\n }\n | { type: \"thinking:start\"; messageId: ChatId }\n | { type: \"thinking:delta\"; messageId: ChatId; text: string }\n | { type: \"thinking:end\"; messageId: ChatId }\n | {\n type: \"permission:request\";\n messageId: ChatId;\n toolName: string;\n toolArgs: Record<string, unknown>;\n }\n | {\n type: \"permission:response\";\n messageId: ChatId;\n toolName: string;\n allowed: boolean;\n }\n | {\n type: \"usage\";\n promptTokens: number;\n completionTokens: number;\n model?: string;\n }\n | { type: \"session:created\"; sessionId: ChatId }\n | { type: \"session:updated\"; sessionId: ChatId }\n | {\n type: \"error\";\n error: string;\n recoverable: boolean;\n code?: ErrorCode;\n messageId?: ChatId;\n }\n | { type: \"typing:start\" }\n | { type: \"typing:end\" }\n | { type: \"heartbeat\" }\n | { type: \"done\"; finalOutput?: string };\n\n/** All possible ChatEvent type strings */\nexport type ChatEventType = ChatEvent[\"type\"];\n\n// ─── Chat Middleware ───────────────────────────────────────────\n\n/** Context passed to ChatMiddleware hooks */\nexport interface ChatMiddlewareContext {\n sessionId: ChatId;\n signal: AbortSignal;\n}\n\n/** Runtime-level middleware for the send/receive lifecycle.\n * Different from EventMiddleware which operates at the event bus level. */\nexport interface ChatMiddleware {\n /** Transform message before sending to backend. Return null to reject the send. */\n onBeforeSend?(message: ChatMessage, context: ChatMiddlewareContext): ChatMessage | null | Promise<ChatMessage | null>;\n /** Transform/intercept stream events */\n onEvent?(event: ChatEvent, context: ChatMiddlewareContext): ChatEvent | null | Promise<ChatEvent | null>;\n /** Transform completed message after receiving from backend */\n onAfterReceive?(message: ChatMessage, context: ChatMiddlewareContext): ChatMessage | Promise<ChatMessage>;\n /** Intercept errors — return null to suppress, return error to propagate */\n onError?(error: Error, context: ChatMiddlewareContext): Error | null | Promise<Error | null>;\n}\n\n// ─── Chat Provider Abstraction ─────────────────────────────────\n\n/** Options for sending a message to a provider */\nexport interface SendMessageOptions {\n signal?: AbortSignal;\n /** Model to use for this request. Required for server-side runtime.send(). */\n model?: string;\n /** Per-call system prompt override (forwarded to the backend agent) */\n systemPrompt?: string;\n context?: Record<string, unknown>;\n /** Additional tools to include in this request */\n tools?: ToolDefinition[];\n}\n\n/** Options for runtime.send() — requires backend routing info */\nexport interface RuntimeSendOptions {\n /** Backend to route this request to (key in backends map) */\n backend: string;\n /** Authentication credentials for the backend factory */\n credentials: AuthToken;\n /** Model to use for this request */\n model: string;\n /** Per-call system prompt override (forwarded to the backend agent) */\n systemPrompt?: string;\n /** Abort signal */\n signal?: AbortSignal;\n /** Request-scoped context */\n context?: Record<string, unknown>;\n /** Additional tools */\n tools?: ToolDefinition[];\n}\n\n/**\n * @deprecated IChatProvider has been inlined into IChatBackend.\n * Import IChatBackend from \"@witqq/agent-sdk/chat/backends\" instead.\n * Kept as type alias for backward compatibility.\n */\nexport type IChatProvider = import(\"./backends/types.js\").IChatBackend;\n\n// ─── Factory Functions ─────────────────────────────────────────\n\n/**\n * Create a simple text ChatMessage.\n *\n * @param text - Message text content\n * @param role - Message role (default: \"user\")\n * @returns A complete ChatMessage with a single TextPart\n */\nexport function createTextMessage(text: string, role: ChatRole = \"user\"): ChatMessage {\n return {\n id: createChatId(),\n role,\n parts: [{ type: \"text\", text, status: \"complete\" }],\n createdAt: new Date().toISOString(),\n status: \"complete\",\n };\n}\n\n/** Type guard: checks if a session has reactive API (subscribe/getSnapshot) */\nexport function isObservableSession<TCustom extends Record<string, unknown> = Record<string, unknown>>(\n session: ChatSession<TCustom>,\n): session is ObservableSession<TCustom> {\n return \"subscribe\" in session && typeof (session as ObservableSession<TCustom>).subscribe === \"function\"\n && \"getSnapshot\" in session && typeof (session as ObservableSession<TCustom>).getSnapshot === \"function\";\n}\n","/**\n * @witqq/agent-sdk — Chat utility functions\n */\n\nimport type { ChatMessage, TextPart, ToolCallPart, ReasoningPart } from \"./types.js\";\nexport { createChatId, toChatId } from \"./types.js\";\n\n/**\n * Join all TextPart texts in a message\n */\nexport function getMessageText(message: ChatMessage): string {\n return message.parts\n .filter((p): p is TextPart => p.type === \"text\")\n .map((p) => p.text)\n .join(\"\");\n}\n\n/**\n * Filter all ToolCallParts from a message\n */\nexport function getMessageToolCalls(message: ChatMessage): ToolCallPart[] {\n return message.parts.filter((p): p is ToolCallPart => p.type === \"tool_call\");\n}\n\n/**\n * Join all ReasoningPart texts in a message\n */\nexport function getMessageReasoning(message: ChatMessage): string {\n return message.parts\n .filter((p): p is ReasoningPart => p.type === \"reasoning\")\n .map((p) => p.text)\n .join(\"\");\n}\n","/**\n * @witqq/agent-sdk — Chat type guards\n */\n\nimport type {\n ChatMessage,\n ChatSession,\n MessagePart,\n TextPart,\n ToolCallPart,\n ReasoningPart,\n SourcePart,\n FilePart,\n ChatEvent,\n ChatEventType,\n} from \"./types.js\";\n\n/** Check if a value is a ChatMessage */\nexport function isChatMessage(value: unknown): value is ChatMessage {\n if (typeof value !== \"object\" || value === null) return false;\n const obj = value as Record<string, unknown>;\n return (\n typeof obj.id === \"string\" &&\n typeof obj.role === \"string\" &&\n (obj.role === \"user\" || obj.role === \"assistant\" || obj.role === \"system\") &&\n Array.isArray(obj.parts) &&\n typeof obj.createdAt === \"string\" &&\n typeof obj.status === \"string\"\n );\n}\n\n/** Check if a value is a ChatSession */\nexport function isChatSession(value: unknown): value is ChatSession {\n if (typeof value !== \"object\" || value === null) return false;\n const obj = value as Record<string, unknown>;\n return (\n typeof obj.id === \"string\" &&\n Array.isArray(obj.messages) &&\n typeof obj.config === \"object\" &&\n obj.config !== null &&\n typeof obj.createdAt === \"string\" &&\n typeof obj.updatedAt === \"string\" &&\n typeof obj.status === \"string\"\n );\n}\n\n/** Check if a value is a MessagePart */\nexport function isMessagePart(value: unknown): value is MessagePart {\n if (typeof value !== \"object\" || value === null) return false;\n const obj = value as Record<string, unknown>;\n return (\n typeof obj.type === \"string\" &&\n (obj.type === \"text\" || obj.type === \"reasoning\" || obj.type === \"tool_call\" || obj.type === \"source\" || obj.type === \"file\")\n );\n}\n\n/** Check if a value is a TextPart */\nexport function isTextPart(value: unknown): value is TextPart {\n if (typeof value !== \"object\" || value === null) return false;\n const obj = value as Record<string, unknown>;\n return obj.type === \"text\" && typeof obj.text === \"string\";\n}\n\n/** Check if a value is a ToolCallPart */\nexport function isToolCallPart(value: unknown): value is ToolCallPart {\n if (typeof value !== \"object\" || value === null) return false;\n const obj = value as Record<string, unknown>;\n return obj.type === \"tool_call\" && typeof obj.toolCallId === \"string\" && typeof obj.name === \"string\";\n}\n\n/** Check if a value is a ReasoningPart */\nexport function isReasoningPart(value: unknown): value is ReasoningPart {\n if (typeof value !== \"object\" || value === null) return false;\n const obj = value as Record<string, unknown>;\n return obj.type === \"reasoning\" && typeof obj.text === \"string\";\n}\n\n/** Check if a value is a SourcePart */\nexport function isSourcePart(value: unknown): value is SourcePart {\n if (typeof value !== \"object\" || value === null) return false;\n const obj = value as Record<string, unknown>;\n return obj.type === \"source\" && typeof obj.url === \"string\";\n}\n\n/** Check if a value is a FilePart */\nexport function isFilePart(value: unknown): value is FilePart {\n if (typeof value !== \"object\" || value === null) return false;\n const obj = value as Record<string, unknown>;\n return obj.type === \"file\" && typeof obj.name === \"string\" && typeof obj.mimeType === \"string\";\n}\n\n/** Check if a value is a ChatEvent */\nexport function isChatEvent(value: unknown): value is ChatEvent {\n if (typeof value !== \"object\" || value === null) return false;\n const obj = value as Record<string, unknown>;\n const validTypes: ChatEventType[] = [\n \"message:start\", \"message:delta\", \"message:complete\",\n \"tool:start\", \"tool:complete\",\n \"thinking:start\", \"thinking:delta\", \"thinking:end\",\n \"permission:request\", \"permission:response\",\n \"usage\", \"session:created\", \"session:updated\",\n \"error\", \"typing:start\", \"typing:end\", \"heartbeat\", \"done\",\n ];\n return validTypes.includes(obj.type as ChatEventType);\n}\n","/**\n * @witqq/agent-sdk — AgentEvent ↔ ChatEvent bridge\n */\n\nimport type { AgentEvent, JSONValue } from \"../types.js\";\nimport type { ChatId, ChatEvent } from \"./types.js\";\n\n/**\n * Map a single AgentEvent to a ChatEvent (or null if no mapping)\n */\nexport function agentEventToChatEvent(\n event: AgentEvent,\n messageId: ChatId,\n): ChatEvent | null {\n switch (event.type) {\n case \"text_delta\":\n return { type: \"message:delta\", messageId, text: event.text };\n case \"thinking_start\":\n return { type: \"thinking:start\", messageId };\n case \"thinking_delta\":\n return { type: \"thinking:delta\", messageId, text: event.text };\n case \"thinking_end\":\n return { type: \"thinking:end\", messageId };\n case \"tool_call_start\":\n return {\n type: \"tool:start\",\n messageId,\n toolCallId: event.toolCallId,\n toolName: event.toolName,\n args: event.args as Record<string, unknown>,\n };\n case \"tool_call_end\":\n return {\n type: \"tool:complete\",\n messageId,\n toolCallId: event.toolCallId,\n toolName: event.toolName,\n result: event.result,\n };\n case \"permission_request\":\n return {\n type: \"permission:request\",\n messageId,\n toolName: event.request.toolName,\n toolArgs: event.request.toolArgs,\n };\n case \"permission_response\":\n return {\n type: \"permission:response\",\n messageId,\n toolName: event.toolName,\n allowed: event.decision.allowed,\n };\n case \"usage_update\":\n return {\n type: \"usage\",\n promptTokens: event.promptTokens,\n completionTokens: event.completionTokens,\n model: event.model,\n };\n case \"error\":\n return {\n type: \"error\",\n error: event.error,\n recoverable: event.recoverable,\n code: event.code,\n messageId,\n };\n case \"heartbeat\":\n return { type: \"heartbeat\" };\n case \"ask_user\":\n case \"ask_user_response\":\n case \"session_info\":\n case \"done\":\n return null;\n default:\n return null;\n }\n}\n\n/**\n * Convert AgentEvent async iterable to ChatEvent async iterable\n */\nexport async function* adaptAgentEvents(\n events: AsyncIterable<AgentEvent>,\n messageId: ChatId,\n): AsyncIterable<ChatEvent> {\n for await (const event of events) {\n const chatEvent = agentEventToChatEvent(event, messageId);\n if (chatEvent !== null) {\n yield chatEvent;\n }\n }\n}\n\n/**\n * Map a ChatEvent back to an AgentEvent for accumulator consumption.\n * Returns null for events that don't map to accumulator-relevant AgentEvents.\n */\nexport function chatEventToAgentEvent(event: ChatEvent): AgentEvent | null {\n switch (event.type) {\n case \"message:delta\":\n return { type: \"text_delta\", text: event.text };\n case \"thinking:start\":\n return { type: \"thinking_start\" };\n case \"thinking:delta\":\n return { type: \"thinking_delta\", text: event.text };\n case \"thinking:end\":\n return { type: \"thinking_end\" };\n case \"tool:start\":\n return {\n type: \"tool_call_start\",\n toolCallId: event.toolCallId,\n toolName: event.toolName,\n args: event.args as JSONValue,\n };\n case \"tool:complete\":\n return {\n type: \"tool_call_end\",\n toolCallId: event.toolCallId,\n toolName: event.toolName,\n result: event.result as JSONValue,\n };\n case \"error\":\n return { type: \"error\", error: event.error, recoverable: event.recoverable, code: event.code };\n default:\n return null;\n }\n}\n","/**\n * @witqq/agent-sdk — ChatMessage ↔ agent-sdk Message conversion\n */\n\nimport type { Message, ToolCall, ToolResult, JSONValue } from \"../types.js\";\nimport type { ChatId, ChatMessage, ChatRole, MessagePart } from \"./types.js\";\nimport { createChatId, getMessageText, getMessageToolCalls } from \"./chat-utils.js\";\n\n/**\n * Convert a ChatMessage to agent-sdk Message format\n */\nexport function toAgentMessage(message: ChatMessage): Message {\n const textContent = getMessageText(message);\n const toolCallParts = getMessageToolCalls(message);\n\n switch (message.role) {\n case \"user\":\n return { role: \"user\", content: textContent };\n case \"assistant\": {\n const toolCalls: ToolCall[] | undefined = toolCallParts.length > 0\n ? toolCallParts.map((p) => ({ id: p.toolCallId, name: p.name, args: p.args as JSONValue }))\n : undefined;\n return {\n role: \"assistant\",\n content: textContent,\n toolCalls,\n };\n }\n case \"system\":\n return { role: \"system\", content: textContent };\n }\n}\n\n/**\n * Convert an agent-sdk Message to ChatMessage\n */\nexport function fromAgentMessage(message: Message, id?: ChatId): ChatMessage {\n const chatId = id ?? createChatId();\n const now = new Date().toISOString();\n\n const parts: MessagePart[] = [];\n\n const textContent =\n typeof message.content === \"string\"\n ? message.content\n : Array.isArray(message.content)\n ? message.content\n .filter((part) => part.type === \"text\")\n .map((part) => part.text)\n .join(\"\\n\")\n : (message.content ?? \"\");\n\n if (textContent) {\n parts.push({ type: \"text\", text: textContent, status: \"complete\" });\n }\n\n if (message.role === \"assistant\" && message.toolCalls) {\n for (const tc of message.toolCalls) {\n parts.push({\n type: \"tool_call\",\n toolCallId: tc.id,\n name: tc.name,\n args: tc.args,\n status: \"complete\",\n });\n }\n }\n\n if (message.role === \"tool\" && message.toolResults) {\n for (const tr of message.toolResults) {\n parts.push({\n type: \"tool_call\",\n toolCallId: tr.toolCallId,\n name: tr.name,\n args: {},\n result: tr.result,\n status: \"complete\",\n });\n }\n }\n\n if (parts.length === 0) {\n parts.push({ type: \"text\", text: \"\", status: \"complete\" });\n }\n\n const role: ChatRole = message.role === \"tool\" ? \"assistant\" : message.role;\n\n return {\n id: chatId,\n role,\n parts,\n createdAt: now,\n status: \"complete\",\n };\n}\n\n/**\n * Extract ToolResults from ToolCallParts that have results\n */\nexport function extractToolResults(message: ChatMessage): ToolResult[] {\n return getMessageToolCalls(message)\n .filter((p) => p.result !== undefined)\n .map((p) => ({\n toolCallId: p.toolCallId,\n name: p.name,\n result: p.result as JSONValue,\n isError: p.status === \"error\" ? true : undefined,\n }));\n}\n","/**\n * @witqq/agent-sdk/chat/context\n *\n * Context window manager for selecting which messages fit within a token budget.\n * Stateless: takes messages in, returns trimmed messages out.\n * Three overflow strategies: truncate-oldest, sliding-window, summarize-placeholder.\n */\n\nimport type { ChatMessage, MessagePart } from \"./core.js\";\n\n// ─── Token Estimation ──────────────────────────────────────────\n\n/**\n * Options for token estimation.\n */\nexport interface TokenEstimationOptions {\n /**\n * Characters per token ratio.\n * Lower = more conservative (fewer messages fit).\n * @default 4\n */\n charsPerToken?: number;\n}\n\n/**\n * Estimate token count for a single chat message.\n * Uses character-based heuristic: `Math.ceil(charCount / charsPerToken)`.\n *\n * Counts:\n * - Text content (string or text parts)\n * - Serialized tool calls and tool results\n * - Thinking blocks\n * - Role overhead (~4 tokens)\n *\n * @param message - Chat message to estimate\n * @param options - Estimation options\n * @returns Estimated token count\n *\n * @example\n * ```typescript\n * const tokens = estimateTokens(message);\n * const conservative = estimateTokens(message, { charsPerToken: 3 });\n * ```\n */\nexport function estimateTokens(\n message: ChatMessage,\n options?: TokenEstimationOptions,\n): number {\n const ratio = options?.charsPerToken ?? 4;\n let charCount = 0;\n\n // Role overhead\n charCount += message.role.length + 4;\n\n // Parts\n for (const part of message.parts) {\n charCount += estimatePartChars(part);\n }\n\n return Math.ceil(charCount / ratio);\n}\n\nfunction estimatePartChars(part: MessagePart): number {\n switch (part.type) {\n case \"text\":\n return part.text.length;\n case \"reasoning\":\n return part.text.length;\n case \"tool_call\":\n return JSON.stringify(part.args).length + part.name.length + 20 +\n (part.result !== undefined ? JSON.stringify(part.result).length : 0);\n case \"source\":\n return (part.title?.length ?? 0) + part.url.length + 10;\n case \"file\":\n return part.name.length + part.data.length + 20;\n }\n}\n\n// ─── Overflow Strategies ───────────────────────────────────────\n\n/** Overflow strategy type */\nexport type OverflowStrategy =\n | \"truncate-oldest\"\n | \"sliding-window\"\n | \"summarize-placeholder\";\n\n// ─── Context Window Configuration ──────────────────────────────\n\n/**\n * Async summarizer function for the summarize-placeholder strategy.\n * Receives removed messages and returns a summary string.\n * When configured, replaces the static placeholder text with actual summary.\n */\nexport type ContextSummarizer = (removedMessages: readonly ChatMessage[]) => Promise<string>;\n\n/**\n * Configuration for the context window manager.\n */\nexport interface ContextWindowConfig {\n /** Maximum token budget for the context window */\n maxTokens: number;\n\n /**\n * Tokens reserved for system prompt and response generation.\n * Subtracted from maxTokens to get available budget.\n * @default 0\n */\n reservedTokens?: number;\n\n /**\n * Strategy for handling overflow when messages exceed budget.\n * @default \"truncate-oldest\"\n */\n strategy?: OverflowStrategy;\n\n /**\n * Token estimation options.\n */\n estimation?: TokenEstimationOptions;\n\n /**\n * Optional async summarizer for the summarize-placeholder strategy.\n * When provided, replaces the static placeholder with a generated summary.\n * Falls back to static placeholder if summarizer throws.\n */\n summarizer?: ContextSummarizer;\n}\n\n// ─── Context Window Result ─────────────────────────────────────\n\n/**\n * Result of context window trimming.\n */\nexport interface ContextWindowResult {\n /** Messages that fit within the budget */\n messages: ChatMessage[];\n /** Total estimated tokens for included messages */\n totalTokens: number;\n /** Number of messages removed */\n removedCount: number;\n /** Whether any messages were truncated */\n wasTruncated: boolean;\n}\n\n// ─── Context Stats ─────────────────────────────────────────────\n\n/**\n * Context usage statistics for a session.\n * Returned by `IChatRuntime.getContextStats()`.\n *\n * When real usage data is available (after the first API response),\n * `realPromptTokens` and `realCompletionTokens` contain actual token counts.\n * `modelContextWindow` is the model's context window from `listModels()`.\n */\nexport interface ContextStats {\n /** Estimated total tokens in the trimmed context (heuristic, kept for backward compat) */\n totalTokens: number;\n /** Number of messages removed by trimming */\n removedCount: number;\n /** Whether context was truncated */\n wasTruncated: boolean;\n /** Available token budget (maxTokens − reservedTokens) */\n availableBudget: number;\n /** Real prompt tokens from the last API response (undefined before first response) */\n realPromptTokens?: number;\n /** Real completion tokens from the last API response (undefined before first response) */\n realCompletionTokens?: number;\n /** Model's context window in tokens from listModels() (undefined if not available) */\n modelContextWindow?: number;\n}\n\n// ─── Context Window Manager ────────────────────────────────────\n\n/**\n * Stateless context window manager.\n * Takes messages and returns the subset that fits within a token budget.\n *\n * @example\n * ```typescript\n * const manager = new ContextWindowManager({\n * maxTokens: 4096,\n * reservedTokens: 500,\n * strategy: \"sliding-window\",\n * });\n *\n * const result = manager.fitMessages(messages);\n * // result.messages — trimmed to fit budget\n * // result.totalTokens — estimated token usage\n * // result.wasTruncated — whether messages were removed\n * ```\n */\nexport class ContextWindowManager {\n private readonly config: Required<\n Pick<ContextWindowConfig, \"maxTokens\" | \"reservedTokens\" | \"strategy\">\n > &\n Pick<ContextWindowConfig, \"estimation\" | \"summarizer\">;\n\n constructor(config: ContextWindowConfig) {\n this.config = {\n maxTokens: config.maxTokens,\n reservedTokens: config.reservedTokens ?? 0,\n strategy: config.strategy ?? \"truncate-oldest\",\n estimation: config.estimation,\n summarizer: config.summarizer,\n };\n }\n\n /** Available token budget after reserving tokens */\n get availableBudget(): number {\n return Math.max(0, this.config.maxTokens - this.config.reservedTokens);\n }\n\n /**\n * Estimate tokens for a single message.\n * @param message - Message to estimate\n * @returns Estimated token count\n */\n estimateMessageTokens(message: ChatMessage): number {\n return estimateTokens(message, this.config.estimation);\n }\n\n /**\n * Fit messages within the token budget using the configured strategy.\n * @param messages - All messages to consider\n * @returns Result with fitted messages and metadata\n */\n fitMessages(messages: readonly ChatMessage[]): ContextWindowResult {\n if (messages.length === 0) {\n return { messages: [], totalTokens: 0, removedCount: 0, wasTruncated: false };\n }\n\n const budget = this.availableBudget;\n\n // Calculate tokens for each message\n const tokenCounts = messages.map((m) => this.estimateMessageTokens(m));\n const totalTokens = tokenCounts.reduce((a, b) => a + b, 0);\n\n // All messages fit\n if (totalTokens <= budget) {\n return {\n messages: [...messages],\n totalTokens,\n removedCount: 0,\n wasTruncated: false,\n };\n }\n\n switch (this.config.strategy) {\n case \"truncate-oldest\":\n return this.truncateOldest(messages, tokenCounts, budget);\n case \"sliding-window\":\n return this.slidingWindow(messages, tokenCounts, budget);\n case \"summarize-placeholder\":\n return this.summarizePlaceholder(messages, tokenCounts, budget);\n }\n }\n\n /**\n * Async variant of fitMessages that supports async summarization.\n * When strategy is \"summarize-placeholder\" and a summarizer is configured,\n * calls the summarizer with removed messages and replaces the placeholder text.\n * Falls back to static placeholder if summarizer throws.\n * For other strategies, behaves identically to fitMessages().\n */\n async fitMessagesAsync(messages: readonly ChatMessage[]): Promise<ContextWindowResult> {\n const result = this.fitMessages(messages);\n\n // Only enhance if summarize-placeholder strategy, messages were removed, and summarizer is configured\n if (\n this.config.strategy !== \"summarize-placeholder\" ||\n !result.wasTruncated ||\n !this.config.summarizer\n ) {\n return result;\n }\n\n // Find removed messages (those in original but not in result)\n const keptIds = new Set(result.messages.map(m => m.id));\n const removed = messages.filter(m => !keptIds.has(m.id));\n if (removed.length === 0) return result;\n\n // Call async summarizer, fall back to static placeholder on error\n let summaryText: string;\n try {\n summaryText = await this.config.summarizer(removed);\n } catch {\n return result; // Keep static placeholder on summarizer failure\n }\n\n // Replace placeholder text with summarizer output\n const updatedMessages = result.messages.map(m => {\n if ((m.metadata as Record<string, unknown>)?.isSummary === true) {\n return {\n ...m,\n parts: [{ type: \"text\" as const, text: summaryText, status: \"complete\" as const }],\n };\n }\n return m;\n });\n\n return { ...result, messages: updatedMessages };\n }\n\n /**\n * Trim messages using real token usage data from the previous API call.\n * Uses average-based algorithm: `avgTokensPerMessage = lastPromptTokens / messageCount`.\n * Removes oldest non-system messages until freed budget brings usage under modelContextWindow.\n *\n * @param messages - All messages in the session\n * @param lastPromptTokens - Real prompt tokens from the last API response\n * @param modelContextWindow - Model's total context window size in tokens\n * @returns Result with fitted messages and metadata\n */\n fitMessagesWithUsage(\n messages: readonly ChatMessage[],\n lastPromptTokens: number,\n modelContextWindow: number,\n ): ContextWindowResult {\n if (messages.length === 0) {\n return { messages: [], totalTokens: 0, removedCount: 0, wasTruncated: false };\n }\n\n const budget = modelContextWindow - this.config.reservedTokens;\n if (budget <= 0 || lastPromptTokens <= budget) {\n return {\n messages: [...messages],\n totalTokens: lastPromptTokens,\n removedCount: 0,\n wasTruncated: false,\n };\n }\n\n // Average tokens per message from real data\n const avgTokensPerMessage = lastPromptTokens / messages.length;\n\n // How many tokens we need to free\n const tokensToFree = lastPromptTokens - budget;\n // How many messages to remove (ceil to be safe)\n const messagesToRemove = Math.ceil(tokensToFree / avgTokensPerMessage);\n\n // Separate system and non-system messages\n const systemIndices: number[] = [];\n const nonSystemIndices: number[] = [];\n for (let i = 0; i < messages.length; i++) {\n if (messages[i].role === \"system\") {\n systemIndices.push(i);\n } else {\n nonSystemIndices.push(i);\n }\n }\n\n // Remove oldest non-system messages (from the beginning of conversation)\n const removableCount = Math.min(messagesToRemove, nonSystemIndices.length);\n const removedIndices = new Set(nonSystemIndices.slice(0, removableCount));\n\n const result: ChatMessage[] = [];\n for (let i = 0; i < messages.length; i++) {\n if (!removedIndices.has(i)) {\n result.push(messages[i]);\n }\n }\n\n // Estimate new total: proportional reduction\n const estimatedTokens = Math.round(\n lastPromptTokens * (result.length / messages.length),\n );\n\n return {\n messages: result,\n totalTokens: estimatedTokens,\n removedCount: removableCount,\n wasTruncated: removableCount > 0,\n };\n }\n\n /**\n * Truncate oldest: keeps system messages, removes oldest non-system messages first.\n * Always keeps the most recent user message.\n */\n private truncateOldest(\n messages: readonly ChatMessage[],\n tokenCounts: number[],\n budget: number,\n ): ContextWindowResult {\n // Separate system messages (always kept) and non-system\n const systemIndices: number[] = [];\n const nonSystemIndices: number[] = [];\n\n for (let i = 0; i < messages.length; i++) {\n if (messages[i].role === \"system\") {\n systemIndices.push(i);\n } else {\n nonSystemIndices.push(i);\n }\n }\n\n // System messages cost\n let usedTokens = systemIndices.reduce(\n (sum, i) => sum + tokenCounts[i],\n 0,\n );\n\n // If system messages alone exceed budget, still include them\n // (caller should configure reservedTokens properly)\n\n // Try to fit non-system from newest to oldest\n const includedNonSystem: number[] = [];\n for (let i = nonSystemIndices.length - 1; i >= 0; i--) {\n const idx = nonSystemIndices[i];\n if (usedTokens + tokenCounts[idx] <= budget) {\n includedNonSystem.unshift(idx);\n usedTokens += tokenCounts[idx];\n }\n }\n\n // Build result preserving original order\n const includedSet = new Set([...systemIndices, ...includedNonSystem]);\n const result: ChatMessage[] = [];\n let resultTokens = 0;\n for (let i = 0; i < messages.length; i++) {\n if (includedSet.has(i)) {\n result.push(messages[i]);\n resultTokens += tokenCounts[i];\n }\n }\n\n return {\n messages: result,\n totalTokens: resultTokens,\n removedCount: messages.length - result.length,\n wasTruncated: true,\n };\n }\n\n /**\n * Sliding window: keeps the most recent messages that fit within budget.\n */\n private slidingWindow(\n messages: readonly ChatMessage[],\n tokenCounts: number[],\n budget: number,\n ): ContextWindowResult {\n const result: ChatMessage[] = [];\n let usedTokens = 0;\n\n // Walk from newest to oldest\n for (let i = messages.length - 1; i >= 0; i--) {\n if (usedTokens + tokenCounts[i] <= budget) {\n result.unshift(messages[i]);\n usedTokens += tokenCounts[i];\n } else {\n break;\n }\n }\n\n return {\n messages: result,\n totalTokens: usedTokens,\n removedCount: messages.length - result.length,\n wasTruncated: true,\n };\n }\n\n /**\n * Summarize placeholder: replaces truncated messages with a placeholder,\n * preserving system messages and recent context.\n */\n private summarizePlaceholder(\n messages: readonly ChatMessage[],\n tokenCounts: number[],\n budget: number,\n ): ContextWindowResult {\n // First, identify system messages and recent messages\n const systemMessages: { msg: ChatMessage; tokens: number }[] = [];\n const nonSystem: { msg: ChatMessage; tokens: number; idx: number }[] = [];\n\n for (let i = 0; i < messages.length; i++) {\n if (messages[i].role === \"system\") {\n systemMessages.push({ msg: messages[i], tokens: tokenCounts[i] });\n } else {\n nonSystem.push({ msg: messages[i], tokens: tokenCounts[i], idx: i });\n }\n }\n\n // System message cost\n let usedTokens = systemMessages.reduce((s, m) => s + m.tokens, 0);\n\n // Placeholder costs ~20 tokens\n const placeholderTokens = 20;\n usedTokens += placeholderTokens;\n\n // Fit recent non-system messages from newest\n const recentKept: typeof nonSystem = [];\n for (let i = nonSystem.length - 1; i >= 0; i--) {\n if (usedTokens + nonSystem[i].tokens <= budget) {\n recentKept.unshift(nonSystem[i]);\n usedTokens += nonSystem[i].tokens;\n } else {\n break;\n }\n }\n\n const removedCount =\n messages.length -\n systemMessages.length -\n recentKept.length;\n\n // Build result: system messages, placeholder, recent messages\n const result: ChatMessage[] = [];\n\n // System messages first\n for (const sm of systemMessages) {\n result.push(sm.msg);\n }\n\n // Placeholder if messages were removed\n if (removedCount > 0) {\n result.push({\n id: \"context-placeholder\" as ChatMessage[\"id\"],\n role: \"system\",\n parts: [{ type: \"text\", text: `[${removedCount} earlier message${removedCount === 1 ? \"\" : \"s\"} omitted for context window]`, status: \"complete\" as const }],\n metadata: { isSummary: true },\n createdAt: new Date().toISOString(),\n status: \"complete\",\n });\n }\n\n // Recent messages\n for (const m of recentKept) {\n result.push(m.msg);\n }\n\n return {\n messages: result,\n totalTokens: usedTokens,\n removedCount,\n wasTruncated: true,\n };\n }\n}\n","/**\n * @witqq/agent-sdk/chat/errors\n *\n * Flat error taxonomy with unified ErrorCode enum, ChatError class,\n * pattern-matching classifier, retry strategies with exponential backoff.\n * Extends the existing AgentSDKError from @witqq/agent-sdk.\n */\n\nimport { AgentSDKError } from \"../errors.js\";\nimport { ErrorCode } from \"../types/errors.js\";\n\n// ─── Re-export ErrorCode ───────────────────────────────────────\n\nexport { ErrorCode };\n\n// ─── Error Options ─────────────────────────────────────────────\n\n/** Options for constructing a ChatError */\nexport interface ChatErrorOptions {\n /** Machine-readable error code */\n code: ErrorCode;\n /** Whether this error is retryable (default: false) */\n retryable?: boolean;\n /** Retry delay hint in milliseconds */\n retryAfter?: number;\n /** Original cause, if wrapping another error */\n cause?: unknown;\n}\n\n// ─── Unified Error Class ───────────────────────────────────────\n\n/** Unified error class for all chat SDK errors */\nexport class ChatError extends AgentSDKError {\n readonly code: ErrorCode;\n readonly retryable: boolean;\n readonly retryAfter?: number;\n readonly timestamp: string;\n\n constructor(message: string, options: ChatErrorOptions) {\n super(message, {\n cause: options.cause,\n code: options.code,\n retryable: options.retryable,\n });\n this.name = \"ChatError\";\n this.code = options.code;\n this.retryable = options.retryable ?? false;\n this.retryAfter = options.retryAfter;\n this.timestamp = new Date().toISOString();\n }\n}\n\n// ─── Classification ────────────────────────────────────────────\n\n/**\n * Classify an unknown thrown value into a ChatError with the appropriate code.\n * Pattern-matches against common error shapes:\n * - Already a ChatError → returned as-is\n * - Fetch/network errors (ECONNREFUSED, ETIMEDOUT, etc.)\n * - HTTP status codes (401→AUTH_INVALID, 429→RATE_LIMIT, 5xx→PROVIDER_ERROR)\n * - Timeout patterns\n * - Zod validation errors\n * - Context overflow patterns\n * - Unknown → wrapped as ChatError with PROVIDER_ERROR\n *\n * @param error - The thrown value to classify\n * @returns ChatError with appropriate error code and retryable flag\n */\nexport function classifyError(error: unknown): ChatError {\n if (error instanceof ChatError) {\n return error;\n }\n\n if (error instanceof Error) {\n const msg = error.message.toLowerCase();\n\n // Network errors\n if (isNetworkError(msg)) {\n return new ChatError(error.message, {\n code: ErrorCode.NETWORK,\n retryable: true,\n cause: error,\n });\n }\n\n // Timeout errors\n if (isTimeoutPattern(msg)) {\n return new ChatError(error.message, {\n code: ErrorCode.TIMEOUT,\n retryable: true,\n cause: error,\n });\n }\n\n // Zod validation errors\n if (isZodError(error)) {\n return new ChatError(error.message, {\n code: ErrorCode.INVALID_INPUT,\n retryable: false,\n cause: error,\n });\n }\n\n // HTTP status code errors\n const statusCode = extractStatusCode(error);\n if (statusCode !== null) {\n return classifyByStatusCode(statusCode, error);\n }\n\n // Context overflow patterns\n if (isContextOverflow(msg)) {\n return new ChatError(error.message, {\n code: ErrorCode.CONTEXT_OVERFLOW,\n retryable: false,\n cause: error,\n });\n }\n }\n\n // Unknown errors\n const message =\n error instanceof Error ? error.message : String(error);\n return new ChatError(message, {\n code: ErrorCode.PROVIDER_ERROR,\n retryable: false,\n cause: error,\n });\n}\n\n// ─── Classification Helpers ────────────────────────────────────\n\nconst NETWORK_PATTERNS = [\n \"econnrefused\",\n \"econnreset\",\n \"enotfound\",\n \"etimedout\",\n \"enetunreach\",\n \"epipe\",\n \"fetch failed\",\n \"network error\",\n \"network request failed\",\n \"failed to fetch\",\n \"dns lookup failed\",\n] as const;\n\nfunction isNetworkError(msg: string): boolean {\n return NETWORK_PATTERNS.some((p) => msg.includes(p));\n}\n\nfunction isTimeoutPattern(msg: string): boolean {\n return (\n msg.includes(\"timeout\") ||\n msg.includes(\"timed out\") ||\n msg.includes(\"deadline exceeded\") ||\n msg.includes(\"aborted due to timeout\")\n );\n}\n\nfunction isZodError(error: Error): boolean {\n return (\n error.name === \"ZodError\" ||\n (\"issues\" in error && Array.isArray((error as unknown as Record<string, unknown>).issues))\n );\n}\n\nfunction extractStatusCode(error: Error): number | null {\n const errRecord = error as unknown as Record<string, unknown>;\n if (typeof errRecord.status === \"number\") return errRecord.status;\n if (typeof errRecord.statusCode === \"number\") return errRecord.statusCode;\n\n // Check message for HTTP status codes\n const match = error.message.match(/\\b(4\\d{2}|5\\d{2})\\b/);\n return match ? parseInt(match[1], 10) : null;\n}\n\nfunction classifyByStatusCode(status: number, error: Error): ChatError {\n if (status === 401 || status === 403) {\n return new ChatError(error.message, {\n code: ErrorCode.AUTH_INVALID,\n retryable: false,\n cause: error,\n });\n }\n if (status === 429) {\n const retryAfterSeconds = extractRetryAfter(error);\n return new ChatError(error.message, {\n code: ErrorCode.RATE_LIMIT,\n retryable: true,\n retryAfter: retryAfterSeconds != null ? retryAfterSeconds * 1000 : undefined,\n cause: error,\n });\n }\n if (status >= 500) {\n return new ChatError(error.message, {\n code: ErrorCode.PROVIDER_ERROR,\n retryable: true,\n cause: error,\n });\n }\n // 4xx other than auth/rate-limit → invalid input\n if (status >= 400 && status < 500) {\n return new ChatError(error.message, {\n code: ErrorCode.INVALID_INPUT,\n retryable: false,\n cause: error,\n });\n }\n return new ChatError(error.message, {\n code: ErrorCode.NETWORK,\n retryable: true,\n cause: error,\n });\n}\n\nfunction extractRetryAfter(error: Error): number | undefined {\n const errRecord = error as unknown as Record<string, unknown>;\n if (typeof errRecord.retryAfter === \"number\") return errRecord.retryAfter;\n const match = error.message.match(/retry.after[:\\s]*(\\d+)/i);\n return match ? parseInt(match[1], 10) : undefined;\n}\n\nfunction isContextOverflow(msg: string): boolean {\n return (\n msg.includes(\"context length exceeded\") ||\n msg.includes(\"maximum context length\") ||\n msg.includes(\"context window\") ||\n msg.includes(\"token limit\") ||\n msg.includes(\"too many tokens\")\n );\n}\n\n// ─── Retry Strategy ────────────────────────────────────────────\n\n/** Strategy for computing retry delays */\nexport interface RetryStrategy {\n /** Return delay in ms for the given attempt (0-based), or null to stop */\n nextDelay(attempt: number, error: ChatError): number | null;\n}\n\n/** Options for ExponentialBackoffStrategy */\nexport interface ExponentialBackoffOptions {\n /** Base delay in ms (default: 1000) */\n baseMs?: number;\n /** Maximum delay in ms (default: 30000) */\n maxMs?: number;\n /** Maximum number of attempts (default: 3) */\n maxAttempts?: number;\n /** Jitter factor 0–1 (default: 0.1) */\n jitter?: number;\n}\n\n/** Exponential backoff with optional jitter */\nexport class ExponentialBackoffStrategy implements RetryStrategy {\n private readonly baseMs: number;\n private readonly maxMs: number;\n private readonly maxAttempts: number;\n private readonly jitter: number;\n\n constructor(options?: ExponentialBackoffOptions) {\n this.baseMs = options?.baseMs ?? 1000;\n this.maxMs = options?.maxMs ?? 30000;\n this.maxAttempts = options?.maxAttempts ?? 3;\n this.jitter = Math.max(0, Math.min(1, options?.jitter ?? 0.1));\n }\n\n nextDelay(attempt: number, error: ChatError): number | null {\n if (attempt >= this.maxAttempts) return null;\n if (!error.retryable) return null;\n\n // Rate-limit errors with retryAfter (already in ms) take priority\n if (error.code === ErrorCode.RATE_LIMIT && error.retryAfter) {\n return error.retryAfter;\n }\n\n const delay = Math.min(this.baseMs * Math.pow(2, attempt), this.maxMs);\n const jitterAmount = delay * this.jitter * (Math.random() * 2 - 1);\n return Math.max(0, Math.round(delay + jitterAmount));\n }\n}\n\n// ─── Retry Execution ───────────────────────────────────────────\n\n/** Options for withRetry execution */\nexport interface RetryOptions {\n /** Abort signal to cancel retries */\n signal?: AbortSignal;\n /** Called before each retry with the error and delay */\n onRetry?: (error: ChatError, attempt: number, delayMs: number) => void;\n}\n\n/**\n * Execute an async function with automatic retries using the provided strategy.\n * Respects ChatError.retryable and ChatError.retryAfter.\n * Classifies non-ChatError errors before deciding on retry.\n *\n * @param fn - Async function to execute\n * @param strategy - Retry strategy providing delay calculations\n * @param options - Optional abort signal and retry callback\n * @returns Result of fn on success\n * @throws ChatError when all retries exhausted or error is non-retryable\n */\nexport async function withRetry<T>(\n fn: () => Promise<T>,\n strategy: RetryStrategy,\n options?: RetryOptions,\n): Promise<T> {\n let attempt = 0;\n\n for (;;) {\n try {\n return await fn();\n } catch (raw) {\n const error = classifyError(raw);\n const delay = strategy.nextDelay(attempt, error);\n\n if (delay === null) {\n throw error;\n }\n\n if (options?.signal?.aborted) {\n throw error;\n }\n\n options?.onRetry?.(error, attempt, delay);\n\n await sleep(delay, options?.signal);\n attempt++;\n }\n }\n}\n\n/**\n * Type guard: check if an error is retryable\n * @param error - The error to check\n * @returns True if error is a retryable ChatError\n */\nexport function isRetryable(error: unknown): boolean {\n if (error instanceof ChatError) {\n return error.retryable;\n }\n const classified = classifyError(error);\n return classified.retryable;\n}\n\n// ─── Internal Helpers ──────────────────────────────────────────\n\nfunction sleep(ms: number, signal?: AbortSignal): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n if (signal?.aborted) {\n reject(new ChatError(\"Retry aborted\", { code: ErrorCode.ABORTED }));\n return;\n }\n\n const timer = setTimeout(resolve, ms);\n\n signal?.addEventListener(\n \"abort\",\n () => {\n clearTimeout(timer);\n reject(new ChatError(\"Retry aborted\", { code: ErrorCode.ABORTED }));\n },\n { once: true },\n );\n });\n}\n","/**\n * @witqq/agent-sdk/chat/state\n *\n * Validated state machines for runtime, message, and tool-call lifecycles.\n * Generic StateMachine<S> with declarative transition maps.\n */\n\nimport type { RuntimeStatus, MessageStatus, ToolCallStatus } from \"./core.js\";\nimport { ChatError, ErrorCode } from \"./errors.js\";\n\n// ─── Generic State Machine ─────────────────────────────────────\n\n/** Map of allowed transitions: current state → set of valid next states */\nexport type TransitionMap<S extends string> = Readonly<Record<S, readonly S[]>>;\n\n/**\n * Generic validated state machine.\n * Enforces that every transition is declared in the transition map.\n * Throws ChatError(INVALID_TRANSITION) on illegal moves.\n */\nexport class StateMachine<S extends string> {\n private _current: S;\n\n constructor(\n readonly initial: S,\n readonly transitions: TransitionMap<S>,\n ) {\n this._current = initial;\n }\n\n /** Current state */\n get current(): S {\n return this._current;\n }\n\n /**\n * Check whether transitioning to `next` is allowed from current state\n * @param next - Target state to check\n * @returns True if transition is allowed\n */\n canTransition(next: S): boolean {\n const allowed = this.transitions[this._current];\n return allowed !== undefined && allowed.includes(next);\n }\n\n /**\n * Transition to `next` state.\n * @throws ChatError(INVALID_TRANSITION) if the transition is not allowed\n */\n transition(next: S): void {\n if (!this.canTransition(next)) {\n throw new ChatError(\n `Invalid transition: ${this._current} → ${next}`,\n { code: ErrorCode.INVALID_TRANSITION },\n );\n }\n this._current = next;\n }\n\n /** Reset to initial state */\n reset(): void {\n this._current = this.initial;\n }\n}\n\n// ─── Transition Maps ───────────────────────────────────────────\n\n/** Allowed transitions for RuntimeStatus (idle → streaming/disposed, etc.) */\nexport const RUNTIME_TRANSITIONS: TransitionMap<RuntimeStatus> = {\n idle: [\"streaming\", \"disposed\"],\n streaming: [\"idle\", \"error\", \"disposed\"],\n error: [\"idle\", \"disposed\"],\n disposed: [],\n};\n\n/** Allowed transitions for MessageStatus (pending → streaming → complete, etc.) */\nexport const MESSAGE_TRANSITIONS: TransitionMap<MessageStatus> = {\n pending: [\"streaming\", \"error\", \"cancelled\"],\n streaming: [\"complete\", \"error\", \"cancelled\"],\n complete: [],\n error: [],\n cancelled: [],\n};\n\n/** Allowed transitions for ToolCallStatus (pending → running → complete, etc.) */\nexport const TOOL_CALL_TRANSITIONS: TransitionMap<ToolCallStatus> = {\n pending: [\"running\", \"requires_approval\", \"error\"],\n running: [\"complete\", \"error\"],\n requires_approval: [\"running\", \"denied\", \"error\"],\n complete: [],\n error: [],\n denied: [],\n};\n\n// ─── Pre-configured Factories ──────────────────────────────────\n\n/** Create a RuntimeStatus state machine starting at \"idle\" */\nexport function createRuntimeStateMachine(): StateMachine<RuntimeStatus> {\n return new StateMachine<RuntimeStatus>(\"idle\", RUNTIME_TRANSITIONS);\n}\n\n/** Create a MessageStatus state machine starting at \"pending\" */\nexport function createMessageStateMachine(): StateMachine<MessageStatus> {\n return new StateMachine<MessageStatus>(\"pending\", MESSAGE_TRANSITIONS);\n}\n\n/** Create a ToolCallStatus state machine starting at \"pending\" */\nexport function createToolCallStateMachine(): StateMachine<ToolCallStatus> {\n return new StateMachine<ToolCallStatus>(\"pending\", TOOL_CALL_TRANSITIONS);\n}\n\n// ─── Reentrancy Guard ──────────────────────────────────────────\n\n/**\n * Guards against concurrent send() calls in a chat runtime.\n * acquire() before work, release() after (use try/finally).\n * Throws ChatError(REENTRANCY) if already acquired.\n */\nexport class ChatReentrancyGuard {\n private _acquired = false;\n\n /** Whether the guard is currently held */\n get isAcquired(): boolean {\n return this._acquired;\n }\n\n /**\n * Acquire the guard. Throws if already acquired.\n * @throws ChatError with code REENTRANCY\n */\n acquire(): void {\n if (this._acquired) {\n throw new ChatError(\n \"Concurrent operation detected: a send is already in progress\",\n { code: ErrorCode.REENTRANCY },\n );\n }\n this._acquired = true;\n }\n\n /** Release the guard. Safe to call even if not acquired. */\n release(): void {\n this._acquired = false;\n }\n}\n\n// ─── Abort Controller ──────────────────────────────────────────\n\n/**\n * Abort controller with external signal linking.\n * Wraps an AbortController and optionally links an external AbortSignal\n * so aborting either side cancels the operation.\n */\nexport class ChatAbortController {\n private readonly _controller: AbortController;\n private readonly _onExternalAbort?: () => void;\n private readonly _externalSignal?: AbortSignal;\n\n constructor(externalSignal?: AbortSignal) {\n this._controller = new AbortController();\n this._externalSignal = externalSignal;\n\n if (externalSignal) {\n // If external signal already aborted, abort immediately\n if (externalSignal.aborted) {\n this._controller.abort(externalSignal.reason);\n } else {\n // Link: external abort → our controller\n this._onExternalAbort = () => {\n this._controller.abort(externalSignal.reason);\n };\n externalSignal.addEventListener(\"abort\", this._onExternalAbort, { once: true });\n }\n }\n }\n\n /** The AbortSignal for this controller */\n get signal(): AbortSignal {\n return this._controller.signal;\n }\n\n /** Whether the operation has been aborted */\n get isAborted(): boolean {\n return this._controller.signal.aborted;\n }\n\n /**\n * Abort the operation.\n * @param reason - Optional abort reason\n */\n abort(reason?: unknown): void {\n this._controller.abort(reason);\n }\n\n /** Clean up external signal listener to prevent memory leaks */\n dispose(): void {\n if (this._onExternalAbort && this._externalSignal) {\n this._externalSignal.removeEventListener(\"abort\", this._onExternalAbort);\n }\n }\n}\n","/**\n * @witqq/agent-sdk/chat/accumulator\n *\n * MessageAccumulator converts a stream of AgentEvent objects into a ChatMessage\n * with correct MessagePart array. Handles text, reasoning, and tool call\n * accumulation with proper status transitions.\n */\n\nimport type { AgentEvent } from \"../types.js\";\nimport type { ChatMessage, ChatId, MessagePart, TextPart, ReasoningPart, ToolCallPart } from \"./core.js\";\nimport { createChatId } from \"./core.js\";\n\n/**\n * Converts a stream of AgentEvent objects into a complete ChatMessage.\n * Tracks text, reasoning, and tool call parts with proper status transitions.\n *\n * @example\n * ```typescript\n * const acc = new MessageAccumulator();\n * for await (const event of agentEvents) {\n * acc.apply(event);\n * renderMessage(acc.snapshot()); // in-progress UI update\n * }\n * const message = acc.finalize();\n * ```\n */\nexport class MessageAccumulator {\n private readonly messageId: ChatId;\n private readonly parts: MessagePart[] = [];\n private status: \"pending\" | \"streaming\" | \"complete\" | \"error\" | \"cancelled\" = \"pending\";\n private currentTextPart: TextPart | null = null;\n private currentReasoningPart: ReasoningPart | null = null;\n private toolCallParts = new Map<string, ToolCallPart>();\n private _finalized = false;\n\n constructor(messageId?: ChatId) {\n this.messageId = messageId ?? createChatId();\n }\n\n /** Get current message ID */\n get id(): ChatId { return this.messageId; }\n\n /**\n * Apply an AgentEvent to accumulate into the message\n * @param event - AgentEvent to process\n * @throws Error if accumulator is already finalized\n */\n apply(event: AgentEvent): void {\n if (this._finalized) throw new Error(\"Cannot apply events to finalized accumulator\");\n\n if (this.status === \"pending\") {\n this.status = \"streaming\";\n }\n\n switch (event.type) {\n case \"text_delta\":\n this.handleTextDelta(event.text);\n break;\n case \"thinking_start\":\n this.finalizeCurrentText();\n this.currentReasoningPart = { type: \"reasoning\", text: \"\", status: \"streaming\" };\n this.parts.push(this.currentReasoningPart);\n break;\n case \"thinking_delta\":\n if (this.currentReasoningPart) {\n this.currentReasoningPart.text += event.text;\n }\n break;\n case \"thinking_end\":\n if (this.currentReasoningPart) {\n this.currentReasoningPart.status = \"complete\";\n this.currentReasoningPart = null;\n }\n break;\n case \"tool_call_start\": {\n this.finalizeCurrentText();\n const toolPart: ToolCallPart = {\n type: \"tool_call\",\n toolCallId: event.toolCallId,\n name: event.toolName,\n args: event.args,\n status: \"running\",\n };\n this.toolCallParts.set(event.toolCallId, toolPart);\n this.parts.push(toolPart);\n break;\n }\n case \"tool_call_end\": {\n const existing = this.toolCallParts.get(event.toolCallId);\n if (existing) {\n existing.result = event.result;\n existing.status = \"complete\";\n }\n break;\n }\n case \"error\":\n this.status = \"error\";\n break;\n case \"done\":\n break;\n // Other events (heartbeat, ask_user, etc.) — ignore\n }\n }\n\n private handleTextDelta(text: string): void {\n if (!this.currentTextPart) {\n this.currentTextPart = { type: \"text\", text: \"\", status: \"streaming\" };\n this.parts.push(this.currentTextPart);\n }\n this.currentTextPart.text += text;\n }\n\n private finalizeCurrentText(): void {\n if (this.currentTextPart) {\n this.currentTextPart.status = \"complete\";\n this.currentTextPart = null;\n }\n }\n\n /**\n * Get a snapshot of the current accumulated message (for streaming UI)\n * @returns ChatMessage with current parts and \"streaming\" status\n */\n snapshot(): ChatMessage {\n const now = new Date().toISOString();\n return {\n id: this.messageId,\n role: \"assistant\",\n parts: this.parts.map(p => ({ ...p })),\n status: this.status === \"pending\" ? \"pending\" : \"streaming\",\n createdAt: now,\n updatedAt: now,\n };\n }\n\n /**\n * Finalize the accumulator and return the complete ChatMessage\n * @returns Completed ChatMessage with all parts finalized\n * @throws Error if accumulator is already finalized\n */\n finalize(): ChatMessage {\n if (this._finalized) throw new Error(\"Accumulator already finalized\");\n this._finalized = true;\n\n // Finalize any open parts\n this.finalizeCurrentText();\n if (this.currentReasoningPart) {\n this.currentReasoningPart.status = \"complete\";\n this.currentReasoningPart = null;\n }\n\n // Mark incomplete tool calls as error\n for (const [, toolPart] of this.toolCallParts) {\n if (toolPart.status === \"running\" || toolPart.status === \"pending\") {\n toolPart.status = \"error\";\n }\n }\n\n // Set final message status\n if (this.status !== \"error\" && this.status !== \"cancelled\") {\n this.status = \"complete\";\n }\n\n const now = new Date().toISOString();\n return {\n id: this.messageId,\n role: \"assistant\",\n parts: this.parts,\n status: this.status,\n createdAt: now,\n updatedAt: now,\n };\n }\n\n /** Check if the accumulator has been finalized */\n get finalized(): boolean { return this._finalized; }\n}\n","/**\n * @witqq/agent-sdk - Stream Watchdog\n *\n * Activity-based timeout wrapper for async event streams.\n * Aborts the stream if no events arrive within a configurable inactivity window.\n * Timer resets on each received event.\n */\n\nimport { ChatError, ErrorCode } from \"./errors.js\";\n\n// ─── Configuration ─────────────────────────────────────────────\n\n/** Stream watchdog configuration */\nexport interface StreamWatchdogConfig {\n /** Maximum inactivity time in milliseconds before aborting the stream */\n timeoutMs: number;\n /** AbortSignal to link with (watchdog aborts when this signal fires) */\n signal?: AbortSignal;\n}\n\n// ─── Watchdog Implementation ───────────────────────────────────\n\n/**\n * Wraps an async iterable with an activity timeout.\n * If no event arrives within `timeoutMs`, the stream is aborted with a ChatError.\n * The timer resets after each received event.\n *\n * Uses Promise.race() so even if the source iterator is stuck on an\n * unresolvable promise, the timeout fires and aborts iteration.\n *\n * @example\n * ```ts\n * const watched = withStreamWatchdog(adapter.streamMessage(session, msg), {\n * timeoutMs: 30000,\n * signal: abortController.signal,\n * });\n *\n * for await (const event of watched) {\n * // Each event resets the 30s inactivity timer\n * }\n * ```\n */\nexport async function* withStreamWatchdog<T>(\n source: AsyncIterable<T>,\n config: StreamWatchdogConfig,\n): AsyncGenerator<T> {\n const { timeoutMs, signal } = config;\n\n const iterator = source[Symbol.asyncIterator]();\n let aborted = false;\n\n // Link external abort signal\n if (signal?.aborted) {\n iterator.return?.();\n return;\n }\n\n const onAbort = (): void => {\n aborted = true;\n iterator.return?.();\n };\n signal?.addEventListener(\"abort\", onAbort, { once: true });\n\n try {\n while (true) {\n if (aborted) break;\n\n // Race iterator.next() against a cancellable inactivity timeout.\n // The timeout is cleared when iterator.next() wins, preventing\n // unhandled promise rejections from orphaned setTimeout callbacks.\n const timeout = new CancellableTimeout<T>(timeoutMs);\n try {\n const result = await Promise.race([\n iterator.next(),\n timeout.promise,\n ]);\n timeout.cancel();\n\n if (result.done) break;\n yield result.value;\n } catch (err) {\n timeout.cancel();\n throw err;\n }\n }\n } finally {\n signal?.removeEventListener(\"abort\", onAbort);\n iterator.return?.();\n }\n}\n\n/** Timeout that can be cancelled to prevent unhandled rejections */\nclass CancellableTimeout<T> {\n readonly promise: Promise<IteratorResult<T>>;\n private _timer: ReturnType<typeof setTimeout> | undefined;\n private _cancelled = false;\n\n constructor(ms: number) {\n this.promise = new Promise<IteratorResult<T>>((_, reject) => {\n this._timer = setTimeout(() => {\n if (!this._cancelled) {\n reject(\n new ChatError(\n `Stream timed out after ${ms}ms of inactivity`,\n { code: ErrorCode.TIMEOUT },\n ),\n );\n }\n }, ms);\n });\n // Prevent unhandled rejection when cancelled\n this.promise.catch(() => {});\n }\n\n cancel(): void {\n this._cancelled = true;\n if (this._timer !== undefined) {\n clearTimeout(this._timer);\n this._timer = undefined;\n }\n }\n}\n","/**\n * Generic listener set utility for subscribe/notify patterns.\n *\n * Encapsulates the recurring pattern of:\n * - Set<callback> storage\n * - add(callback) → unsubscribe function\n * - notify(...args) with try/catch per listener\n * - clear() for disposal\n */\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport class ListenerSet<T extends (...args: any[]) => void> {\n private readonly _listeners = new Set<T>();\n\n /** Add a listener. Returns an unsubscribe function. */\n add(callback: T): () => void {\n this._listeners.add(callback);\n return () => { this._listeners.delete(callback); };\n }\n\n /** Notify all listeners with the given arguments. Errors are isolated per listener. */\n notify(...args: Parameters<T>): void {\n for (const cb of this._listeners) {\n try { cb(...args); } catch { /* listener errors must not propagate */ }\n }\n }\n\n /** Remove all listeners. */\n clear(): void {\n this._listeners.clear();\n }\n\n /** Current number of listeners. */\n get size(): number {\n return this._listeners.size;\n }\n}\n","/**\n * @witqq/agent-sdk/chat/runtime\n *\n * Unified chat runtime orchestrator. Creates a fully-wired runtime instance\n * from a configuration object, managing backend adapters, sessions, context\n * trimming, streaming, and middleware in a single facade.\n *\n * Usage:\n * ```typescript\n * import { createChatRuntime } from \"@witqq/agent-sdk/chat/runtime\";\n * const runtime = createChatRuntime({ backends: { ... }, sessionStore, ... });\n * const session = await runtime.createSession({ config: { model: \"gpt-4\", backend: \"copilot\" } });\n * for await (const event of runtime.send(session.id, \"Hello\")) { ... }\n * ```\n */\n\nimport type {\n ChatEvent,\n ChatId,\n ChatIdLike,\n ChatMessage,\n ChatMiddleware,\n ChatMiddlewareContext,\n ChatSession,\n ChatSessionConfig,\n RuntimeStatus,\n SendMessageOptions,\n RuntimeSendOptions,\n} from \"./core.js\";\nimport { createChatId, toChatId, chatEventToAgentEvent } from \"./core.js\";\nimport type { IChatBackend } from \"./backends/types.js\";\nimport type { IChatSessionStore, CreateSessionOptions, SessionListOptions } from \"./sessions.js\";\nimport type { ContextWindowConfig, ContextStats } from \"./context.js\";\nimport { ContextWindowManager } from \"./context.js\";\nimport {\n StateMachine,\n RUNTIME_TRANSITIONS,\n ChatReentrancyGuard,\n ChatAbortController,\n} from \"./state.js\";\nimport { ChatError, ErrorCode } from \"./errors.js\";\nimport { MessageAccumulator } from \"./accumulator.js\";\nimport { withStreamWatchdog } from \"./watchdog.js\";\nimport { ListenerSet } from \"./listener-set.js\";\nimport type { ToolDefinition, ToolContext } from \"../types.js\";\nimport type { ModelInfo } from \"../types.js\";\nimport type { AuthToken } from \"../auth/types.js\";\nimport type { ProviderConfig } from \"./provider-types.js\";\n\n// ─── Runtime Configuration ─────────────────────────────────────\n\n/** Factory function that creates a backend adapter on demand */\nexport type BackendAdapterFactory = (credentials: AuthToken) => IChatBackend | Promise<IChatBackend>;\n\n/** Configuration for creating a chat runtime via createChatRuntime() */\nexport interface ChatRuntimeOptions {\n /** Map of backend name → adapter factory (lazy creation on first use) */\n backends: Record<string, BackendAdapterFactory>;\n /** Default backend name (must be a key in `backends`) */\n defaultBackend: string;\n /** Session store for persistence */\n sessionStore: IChatSessionStore;\n /** Context window configuration (optional) */\n context?: ContextWindowConfig;\n /** Middleware pipeline (optional, applied in order) */\n middleware?: ChatMiddleware[];\n /** Retry configuration for pre-stream connection errors */\n retryConfig?: StreamRetryConfig;\n /**\n * Stream inactivity timeout in milliseconds (optional).\n * When set, aborts the stream if no events arrive within this window.\n * Timer resets after each received event.\n */\n streamTimeoutMs?: number;\n /**\n * Called when context trimming removes messages.\n * Use for archiving, logging, or analytics.\n */\n onContextTrimmed?: (sessionId: ChatIdLike, removedMessages: ChatMessage[]) => void;\n /**\n * Initial tools to register on the runtime.\n * Equivalent to calling `registerTool()` for each tool after creation.\n */\n tools?: ToolDefinition[];\n}\n\n/** Retry configuration for pre-stream failures (renamed to avoid clash with agent-level RetryConfig) */\nexport interface StreamRetryConfig {\n /** Maximum number of attempts (default: 1 = no retry) */\n maxAttempts: number;\n /** Delay between retries in milliseconds */\n delayMs: number;\n}\n\n/** @deprecated Use StreamRetryConfig */\nexport type RetryConfig = StreamRetryConfig;\n\n// ─── Backend Discovery ─────────────────────────────────────────\n\n/** Information about a registered backend */\nexport interface BackendInfo {\n /** Backend name (key in backends map) */\n name: string;\n}\n\n// ─── Provider CRUD Interface ───────────────────────────────────\n\n/**\n * Provider CRUD operations — separated per Interface Segregation Principle.\n * Implemented by IChatClient (which needs provider management for UI).\n * Not required on IChatRuntime (providers are a handler-layer concern).\n */\nexport interface IProviderClient {\n listProviders(): Promise<ProviderConfig[]>;\n createProvider(config: Omit<ProviderConfig, \"id\" | \"createdAt\">): Promise<ProviderConfig>;\n updateProvider(id: string, changes: Partial<Omit<ProviderConfig, \"id\" | \"createdAt\">>): Promise<void>;\n deleteProvider(id: string): Promise<void>;\n}\n\n// ─── IChatClient Interface (client-side remote) ────────────────\n\n/** Callback for provider selection changes */\nexport type SelectionChangeCallback = (providerId: string | null) => void;\n\n/**\n * Client-side interface for interacting with a remote chat server.\n * Fully self-contained — no shared base with IChatRuntime.\n * Extends IProviderClient for provider CRUD (ISP).\n * Used by React components and remote clients.\n *\n * @typeParam TMetadata - Type-level convenience for message metadata.\n * NOT enforced at the storage boundary — session stores always use `unknown`.\n * Consumers are responsible for metadata shape consistency.\n */\nexport interface IChatClient<TMetadata extends Record<string, unknown> = Record<string, unknown>>\n extends IProviderClient {\n\n // ── Lifecycle ──\n readonly status: RuntimeStatus;\n dispose(): Promise<void>;\n\n // ── Sessions ──\n createSession(options: CreateSessionOptions<TMetadata>): Promise<ChatSession<TMetadata>>;\n getSession(id: ChatIdLike): Promise<ChatSession<TMetadata> | null>;\n listSessions(options?: SessionListOptions): Promise<ChatSession<TMetadata>[]>;\n deleteSession(id: ChatIdLike): Promise<void>;\n\n // ── Client-side session state ──\n switchSession(id: ChatIdLike): Promise<ChatSession<TMetadata>>;\n readonly activeSessionId: ChatId | null;\n\n // ── Messaging ──\n /**\n * Send a message. Options are optional — the server handler resolves\n * model and backend from provider selection state.\n * Compare with IChatRuntime.send() where RuntimeSendOptions is required.\n */\n send(sessionId: ChatIdLike, message: string, options?: SendMessageOptions): AsyncIterable<ChatEvent>;\n\n // ── Messaging control ──\n abort(): void;\n\n // ── Provider Selection (local client state) ──\n selectProvider(providerId: string): void;\n readonly selectedProviderId: string | null;\n onSelectionChange(callback: SelectionChangeCallback): () => void;\n\n // ── Subscriptions ──\n onSessionChange(callback: () => void): () => void;\n\n // ── Discovery ──\n listModels(): Promise<ModelInfo[]>;\n listBackends(): Promise<BackendInfo[]>;\n\n // ── Context Stats ──\n getContextStats(sessionId: ChatIdLike): Promise<ContextStats | null>;\n}\n\n// ─── IChatRuntime Interface (server-only) ──────────────────────\n\n/**\n * Server-side chat runtime. Fully self-contained — no shared base with IChatClient.\n * Manages backend adapters, tools, middleware, and context trimming.\n * Does NOT include client-facing provider CRUD or selection — those are\n * handled by the server handler layer.\n *\n * @typeParam TMetadata - Type-level convenience for message metadata.\n * NOT enforced at the storage boundary — session stores always use `unknown`.\n * Casts in `ChatRuntime.createSession()`/`getSession()` are intentionally unsafe\n * to provide typed access. Consumers are responsible for metadata shape consistency.\n */\nexport interface IChatRuntime<TMetadata extends Record<string, unknown> = Record<string, unknown>> {\n\n // ── Lifecycle ──\n readonly status: RuntimeStatus;\n dispose(): Promise<void>;\n\n // ── Sessions ──\n createSession(options: CreateSessionOptions<TMetadata>): Promise<ChatSession<TMetadata>>;\n getSession(id: ChatIdLike): Promise<ChatSession<TMetadata> | null>;\n listSessions(options?: SessionListOptions): Promise<ChatSession<TMetadata>[]>;\n deleteSession(id: ChatIdLike): Promise<void>;\n\n // ── Messaging ──\n /**\n * Send a message. RuntimeSendOptions is required on the server — the caller\n * (usually a handler) must supply backend, model, and credentials.\n * Compare with IChatClient.send() where options are optional.\n */\n send(sessionId: ChatIdLike, message: string, options: RuntimeSendOptions): AsyncIterable<ChatEvent>;\n \n // ── Messaging control ──\n abort(): void;\n\n // ── Subscriptions ──\n onSessionChange(callback: () => void): () => void;\n\n // ── Discovery ──\n listModels(options?: { backend?: string; credentials?: AuthToken }): Promise<ModelInfo[]>;\n listBackends(): Promise<BackendInfo[]>;\n\n // ── Tools ──\n registerTool(tool: ToolDefinition): void;\n removeTool(name: string): void;\n readonly registeredTools: ReadonlyMap<string, ToolDefinition>;\n\n // ── Middleware ──\n use(middleware: ChatMiddleware): void;\n removeMiddleware(middleware: ChatMiddleware): void;\n\n // ── Context Stats ──\n getContextStats(sessionId: ChatIdLike): Promise<ContextStats | null>;\n}\n\n// ─── ChatRuntime Implementation ────────────────────────────────\n\nclass ChatRuntime<TMetadata extends Record<string, unknown> = Record<string, unknown>> implements IChatRuntime<TMetadata> {\n private readonly _state: StateMachine<RuntimeStatus>;\n private readonly _guard: ChatReentrancyGuard;\n private readonly _backends: Record<string, BackendAdapterFactory>;\n private readonly _sessionStore: IChatSessionStore;\n private readonly _contextConfig?: ContextWindowConfig;\n private readonly _middleware: ChatMiddleware[];\n private readonly _tools = new Map<string, ToolDefinition>();\n private readonly _retryConfig?: StreamRetryConfig;\n private readonly _contextStats = new Map<ChatId, ContextStats>();\n private readonly _sessionUsage = new Map<ChatId, { promptTokens: number; completionTokens: number }>();\n private readonly _modelContextWindows = new Map<string, number>();\n private readonly _onContextTrimmed?: (sessionId: ChatIdLike, removedMessages: ChatMessage[]) => void;\n private readonly _streamTimeoutMs?: number;\n private readonly _sessionListeners = new ListenerSet<() => void>();\n\n private readonly _adapterPool = new Map<string, IChatBackend>();\n private readonly _defaultBackend: string;\n private _abortController: ChatAbortController | null = null;\n\n constructor(options: ChatRuntimeOptions) {\n this._state = new StateMachine<RuntimeStatus>(\"idle\", RUNTIME_TRANSITIONS);\n this._guard = new ChatReentrancyGuard();\n this._backends = options.backends;\n this._defaultBackend = options.defaultBackend;\n this._sessionStore = options.sessionStore;\n this._contextConfig = options.context;\n this._middleware = [...(options.middleware ?? [])];\n this._retryConfig = options.retryConfig;\n this._onContextTrimmed = options.onContextTrimmed;\n this._streamTimeoutMs = options.streamTimeoutMs;\n\n if (!options.backends[options.defaultBackend]) {\n throw new ChatError(\n `Default backend \"${options.defaultBackend}\" not found in backends map`,\n { code: ErrorCode.INVALID_INPUT },\n );\n }\n\n // Register initial tools if provided\n if (options.tools) {\n for (const tool of options.tools) {\n this._tools.set(tool.name, tool);\n }\n }\n }\n\n // ── Lifecycle ──────────────────────────────────────────────\n\n get status(): RuntimeStatus {\n return this._state.current;\n }\n\n async dispose(): Promise<void> {\n if (this._state.current === \"disposed\") return;\n\n // Abort any in-flight send\n this._abortController?.abort(\"Runtime disposed\");\n this._abortController?.dispose();\n this._abortController = null;\n\n // Direct transition to disposed from any state (streaming→disposed now valid)\n this._state.transition(\"disposed\");\n\n // Dispose all adapters in pool\n for (const adapter of this._adapterPool.values()) {\n try { await adapter.dispose(); } catch { /* best-effort */ }\n }\n this._adapterPool.clear();\n }\n\n // ── Sessions ───────────────────────────────────────────────\n\n async createSession(options: CreateSessionOptions<TMetadata>): Promise<ChatSession<TMetadata>> {\n this.assertNotDisposed();\n const config: ChatSessionConfig = {\n model: options.config?.model ?? \"\",\n backend: options.config?.backend ?? this._defaultBackend,\n ...options.config,\n };\n const session = await this._sessionStore.createSession({ ...options, config });\n this._notifySessionChange();\n // TMetadata safety: session store uses unknown metadata. Cast is intentional —\n // consumers control metadata shape via TMetadata generic at compile time.\n return session as ChatSession<TMetadata>;\n }\n\n async getSession(id: ChatIdLike): Promise<ChatSession<TMetadata> | null> {\n this.assertNotDisposed();\n const cid = toChatId(id);\n return this._sessionStore.getSession(cid) as Promise<ChatSession<TMetadata> | null>;\n }\n\n async listSessions(options?: SessionListOptions): Promise<ChatSession<TMetadata>[]> {\n this.assertNotDisposed();\n return this._sessionStore.listSessions(options) as Promise<ChatSession<TMetadata>[]>;\n }\n\n async deleteSession(id: ChatIdLike): Promise<void> {\n this.assertNotDisposed();\n const cid = toChatId(id);\n const session = await this._sessionStore.getSession(cid);\n if (!session) return;\n\n await this._sessionStore.deleteSession(cid);\n this._contextStats.delete(cid);\n this._sessionUsage.delete(cid);\n this._notifySessionChange();\n }\n\n // ── Messaging ──────────────────────────────────────────────\n\n async *send(\n sessionId: ChatIdLike,\n message: string,\n options: RuntimeSendOptions,\n ): AsyncIterable<ChatEvent> {\n this.validateSendInput(message, options);\n this._guard.acquire();\n\n const cid = toChatId(sessionId);\n this._abortController = new ChatAbortController(options?.signal);\n\n try {\n if (this._state.current === \"error\") {\n this._state.transition(\"idle\");\n }\n this._state.transition(\"streaming\");\n\n await this.loadSession(cid);\n const mwCtx: ChatMiddlewareContext = {\n sessionId: cid,\n signal: this._abortController.signal,\n };\n\n const userMessage = await this.applyBeforeSendMiddleware(\n this.createUserMessage(message), mwCtx,\n );\n if (userMessage === null) {\n // Middleware rejected the send — transition back to idle silently\n this._state.transition(\"idle\");\n return;\n }\n const updatedSession = await this.persistAndReload(cid, userMessage);\n const sessionForAdapter = await this.trimSessionContext(cid, updatedSession, options.model);\n\n const stream = await this.prepareEventStream(\n cid, sessionForAdapter, updatedSession, message, options,\n );\n\n const accumulator = new MessageAccumulator();\n const eventSource = this._streamTimeoutMs\n ? withStreamWatchdog(stream, { timeoutMs: this._streamTimeoutMs, signal: this._abortController.signal })\n : stream;\n\n for await (const event of eventSource) {\n if (this._abortController.isAborted) break;\n this.feedAccumulator(accumulator, event);\n\n // Capture real usage data from usage events\n if (event.type === \"usage\") {\n this._sessionUsage.set(cid, {\n promptTokens: event.promptTokens,\n completionTokens: event.completionTokens,\n });\n this.updateContextStatsWithUsage(cid, event.promptTokens, event.completionTokens, options);\n }\n\n const processed = await this.applyOnEventMiddleware(event, mwCtx);\n if (processed) yield processed;\n }\n\n if (this._state.current === \"disposed\") return;\n\n await this.finalizeAssistantMessage(cid, accumulator, mwCtx);\n\n this._state.transition(\"idle\");\n } catch (error) {\n const result = await this.handleSendError(error, cid);\n if (result !== null) throw result;\n // null = error suppressed by middleware, exit silently\n } finally {\n this._guard.release();\n this._abortController?.dispose();\n this._abortController = null;\n }\n }\n\n // ── Send Pipeline Stages ──────────────────────────────────────\n\n /** Stage 1: Validate send inputs (message content + required fields). */\n private validateSendInput(message: string, options: RuntimeSendOptions): void {\n this.assertNotDisposed();\n\n if (!message || message.trim().length === 0) {\n throw new ChatError(\"Message cannot be empty\", { code: ErrorCode.INVALID_INPUT });\n }\n\n if (!options.model) {\n throw new ChatError(\n \"options.model is required — caller must specify which model to use\",\n { code: ErrorCode.INVALID_INPUT },\n );\n }\n\n if (!options.backend) {\n throw new ChatError(\n \"options.backend is required — caller must specify which backend to use\",\n { code: ErrorCode.INVALID_INPUT },\n );\n }\n\n if (!options.credentials) {\n throw new ChatError(\n \"options.credentials is required — caller must provide authentication credentials\",\n { code: ErrorCode.INVALID_INPUT },\n );\n }\n }\n\n /** Stage 2: Load session from store. */\n private async loadSession(cid: ChatId): Promise<ChatSession> {\n const session = await this._sessionStore.getSession(cid);\n if (!session) {\n throw new ChatError(\n `Session \"${cid}\" not found`,\n { code: ErrorCode.SESSION_NOT_FOUND },\n );\n }\n return session;\n }\n\n /** Stage 3: Apply onBeforeSend middleware pipeline. Returns null if middleware rejected the send. */\n private async applyBeforeSendMiddleware(\n userMessage: ChatMessage,\n ctx: ChatMiddlewareContext,\n ): Promise<ChatMessage | null> {\n let msg: ChatMessage | null = userMessage;\n for (const mw of this._middleware) {\n if (mw.onBeforeSend && msg) {\n msg = await mw.onBeforeSend(msg, ctx);\n if (msg === null) return null;\n }\n }\n return msg;\n }\n\n /** Stage 4: Persist user message and reload session with full history. */\n private async persistAndReload(cid: ChatId, userMessage: ChatMessage): Promise<ChatSession> {\n await this._sessionStore.appendMessage(cid, userMessage);\n return (await this._sessionStore.getSession(cid))!;\n }\n\n /** Stage 5: Auto-trim context window if configured. Returns session snapshot for adapter. */\n private async trimSessionContext(cid: ChatId, session: ChatSession, model?: string): Promise<ChatSession> {\n if (!this._contextConfig) return session;\n\n const ctxManager = new ContextWindowManager(this._contextConfig);\n const lastUsage = this._sessionUsage.get(cid);\n const modelContextWindow = model ? this._modelContextWindows.get(model) : undefined;\n\n // When real usage data is available, use average-based trimming\n if (lastUsage && modelContextWindow) {\n const result = ctxManager.fitMessagesWithUsage(\n session.messages,\n lastUsage.promptTokens,\n modelContextWindow,\n );\n\n this._contextStats.set(cid, {\n totalTokens: result.totalTokens,\n removedCount: result.removedCount,\n wasTruncated: result.wasTruncated,\n availableBudget: Math.max(0, modelContextWindow - result.totalTokens),\n realPromptTokens: lastUsage.promptTokens,\n realCompletionTokens: lastUsage.completionTokens,\n modelContextWindow,\n });\n\n if (result.wasTruncated && this._onContextTrimmed) {\n const keptIds = new Set(result.messages.map(m => m.id));\n const removed = session.messages.filter(m => !keptIds.has(m.id));\n if (removed.length > 0) {\n try { this._onContextTrimmed(cid, removed); } catch { /* swallow user callback errors */ }\n }\n }\n\n return { ...session, messages: result.messages };\n }\n\n // First message (no prior usage data): skip trimming, rely on model's large context window\n // Still use heuristic-based trimming as safety net via fitMessagesAsync\n const result = await ctxManager.fitMessagesAsync(session.messages);\n\n this._contextStats.set(cid, {\n totalTokens: result.totalTokens,\n removedCount: result.removedCount,\n wasTruncated: result.wasTruncated,\n availableBudget: ctxManager.availableBudget,\n modelContextWindow,\n });\n\n if (result.wasTruncated && this._onContextTrimmed) {\n const keptIds = new Set(result.messages.map(m => m.id));\n const removed = session.messages.filter(m => !keptIds.has(m.id));\n if (removed.length > 0) {\n try { this._onContextTrimmed(cid, removed); } catch { /* swallow user callback errors */ }\n }\n }\n\n return { ...session, messages: result.messages };\n }\n\n /** Update context stats with real usage data from a usage event. */\n private updateContextStatsWithUsage(\n cid: ChatId,\n promptTokens: number,\n completionTokens: number,\n options: RuntimeSendOptions,\n ): void {\n const modelContextWindow = options.model\n ? this._modelContextWindows.get(options.model)\n : undefined;\n\n const existing = this._contextStats.get(cid);\n this._contextStats.set(cid, {\n totalTokens: promptTokens,\n removedCount: existing?.removedCount ?? 0,\n wasTruncated: existing?.wasTruncated ?? false,\n availableBudget: modelContextWindow\n ? Math.max(0, modelContextWindow - promptTokens)\n : (existing?.availableBudget ?? 0),\n realPromptTokens: promptTokens,\n realCompletionTokens: completionTokens,\n modelContextWindow,\n });\n }\n\n /** Stage 6: Prepare event stream — adapter with retry, tool injection. */\n private async prepareEventStream(\n cid: ChatId,\n sessionForAdapter: ChatSession,\n fullSession: ChatSession,\n message: string,\n options: RuntimeSendOptions,\n ): Promise<AsyncIterable<ChatEvent>> {\n const adapter = await this.getOrCreateAdapterWithRetry(options.backend, options.credentials);\n\n const runtimeTools = this._tools.size > 0\n ? this.injectToolContext([...this._tools.values()], {\n sessionId: cid as string,\n custom: fullSession.metadata?.custom as Record<string, unknown> | undefined,\n })\n : undefined;\n\n const streamOptions: SendMessageOptions = {\n signal: this._abortController!.signal,\n model: options.model,\n systemPrompt: options.systemPrompt,\n tools: runtimeTools,\n };\n\n return this.createStreamWithRetry(\n adapter, sessionForAdapter, message, streamOptions,\n options.backend, options.credentials,\n );\n }\n\n /** Stage 7: Apply onEvent middleware pipeline (sequential transform/suppress). */\n private async applyOnEventMiddleware(\n event: ChatEvent,\n ctx: ChatMiddlewareContext,\n ): Promise<ChatEvent | null> {\n let processed: ChatEvent | null = event;\n for (const mw of this._middleware) {\n if (mw.onEvent && processed) {\n processed = await mw.onEvent(processed, ctx);\n }\n }\n return processed;\n }\n\n /** Stage 8: Finalize accumulator, apply afterReceive middleware, persist assistant message. */\n private async finalizeAssistantMessage(\n cid: ChatId,\n accumulator: MessageAccumulator,\n ctx: ChatMiddlewareContext,\n ): Promise<void> {\n let assistantMessage = accumulator.finalize();\n\n for (const mw of this._middleware) {\n if (mw.onAfterReceive) {\n assistantMessage = await mw.onAfterReceive(assistantMessage, ctx);\n }\n }\n\n await this._sessionStore.appendMessage(cid, assistantMessage);\n this._notifySessionChange();\n }\n\n /** Stage 9: Error handling — apply onError middleware, transition state. Returns null if suppressed. */\n private async handleSendError(error: unknown, cid: ChatId): Promise<Error | null> {\n let processedError = error instanceof Error ? error : new Error(String(error));\n const ctx: ChatMiddlewareContext = {\n sessionId: cid,\n signal: this._abortController?.signal ?? new AbortController().signal,\n };\n\n for (const mw of this._middleware) {\n if (mw.onError) {\n const result = await mw.onError(processedError, ctx);\n if (result === null) {\n if (this._state.canTransition(\"idle\")) {\n this._state.transition(\"idle\");\n }\n return null;\n }\n processedError = result;\n }\n }\n\n if (this._state.canTransition(\"error\")) {\n this._state.transition(\"error\");\n }\n return processedError;\n }\n\n abort(): void {\n this._abortController?.abort(\"User abort\");\n }\n\n // ── Backend / Model ────────────────────────────────────────\n\n async listModels(options?: { backend?: string; credentials?: AuthToken }): Promise<ModelInfo[]> {\n this.assertNotDisposed();\n let models: ModelInfo[] = [];\n // Use existing adapter from pool if available\n const firstAdapter = [...this._adapterPool.values()][0];\n if (firstAdapter) {\n try { models = await firstAdapter.listModels(); } catch { return []; }\n } else if (options?.backend && options?.credentials) {\n // Pool empty — try to create adapter from provided credentials\n try {\n const adapter = await this.getOrCreateAdapter(options.backend, options.credentials);\n models = await adapter.listModels();\n } catch { return []; }\n }\n // Cache context windows for models that provide them\n for (const model of models) {\n if (model.contextWindow != null) {\n this._modelContextWindows.set(model.id, model.contextWindow);\n }\n }\n return models;\n }\n\n async listBackends(): Promise<BackendInfo[]> {\n this.assertNotDisposed();\n return Object.keys(this._backends).map((name) => ({ name }));\n }\n\n // ── Tools ──────────────────────────────────────────────────\n\n get registeredTools(): ReadonlyMap<string, ToolDefinition> {\n return this._tools;\n }\n\n registerTool(tool: ToolDefinition): void {\n this.assertNotDisposed();\n this._tools.set(tool.name, tool);\n }\n\n removeTool(name: string): void {\n this.assertNotDisposed();\n this._tools.delete(name);\n }\n\n // ── Middleware ──────────────────────────────────────────────\n\n use(middleware: ChatMiddleware): void {\n this.assertNotDisposed();\n this._middleware.push(middleware);\n }\n\n removeMiddleware(middleware: ChatMiddleware): void {\n this.assertNotDisposed();\n const idx = this._middleware.indexOf(middleware);\n if (idx >= 0) this._middleware.splice(idx, 1);\n }\n\n // ── Context Stats ─────────────────────────────────────────\n\n async getContextStats(sessionId: ChatIdLike): Promise<ContextStats | null> {\n const cid = toChatId(sessionId);\n return this._contextStats.get(cid) ?? null;\n }\n\n // ── Session Subscription ──────────────────────────────────\n\n onSessionChange(callback: () => void): () => void {\n return this._sessionListeners.add(callback);\n }\n\n private _notifySessionChange(): void {\n this._sessionListeners.notify();\n }\n\n // ── Private Helpers ────────────────────────────────────────\n\n private async getOrCreateAdapter(backend: string, credentials: AuthToken): Promise<IChatBackend> {\n const key = this.getPoolKey(backend, credentials);\n const existing = this._adapterPool.get(key);\n if (existing) return existing;\n\n // Dispose stale adapters for same backend with different credentials\n for (const [oldKey, oldAdapter] of this._adapterPool) {\n if (oldKey.startsWith(backend + \":\")) {\n try { await oldAdapter.dispose(); } catch { /* best-effort */ }\n this._adapterPool.delete(oldKey);\n }\n }\n\n const factory = this._backends[backend];\n if (!factory) {\n throw new ChatError(\n `Backend \"${backend}\" not found`,\n { code: ErrorCode.INVALID_INPUT },\n );\n }\n\n const adapter = await factory(credentials);\n\n this._adapterPool.set(key, adapter);\n return adapter;\n }\n\n private getPoolKey(backend: string, credentials: AuthToken): string {\n const token = credentials.accessToken;\n const hash = token.length > 16 ? token.slice(0, 8) + token.slice(-8) : token;\n return `${backend}:${hash}`;\n }\n\n /** Wrap each tool's execute to inject ToolContext as 2nd argument */\n private injectToolContext(tools: ToolDefinition[], context: ToolContext): ToolDefinition[] {\n return tools.map(tool => ({\n ...tool,\n execute: (params: unknown) => tool.execute(params, context),\n }));\n }\n\n /** Map ChatEvent to AgentEvent for MessageAccumulator */\n private feedAccumulator(acc: MessageAccumulator, event: ChatEvent): void {\n const agentEvent = chatEventToAgentEvent(event);\n if (agentEvent) acc.apply(agentEvent);\n }\n\n private createUserMessage(text: string): ChatMessage {\n return {\n id: createChatId(),\n role: \"user\",\n parts: [{ type: \"text\", text, status: \"complete\" }],\n createdAt: new Date().toISOString(),\n status: \"complete\",\n };\n }\n\n private assertNotDisposed(): void {\n if (this._state.current === \"disposed\") {\n throw new ChatError(\n \"Runtime is disposed\",\n { code: ErrorCode.DISPOSED },\n );\n }\n }\n\n /** Get or create adapter with retry on connection errors */\n private async getOrCreateAdapterWithRetry(backend: string, credentials: AuthToken): Promise<IChatBackend> {\n const maxAttempts = this._retryConfig?.maxAttempts ?? 1;\n const delayMs = this._retryConfig?.delayMs ?? 0;\n let lastError: Error | undefined;\n\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n try {\n return await this.getOrCreateAdapter(backend, credentials);\n } catch (err) {\n lastError = err instanceof Error ? err : new Error(String(err));\n if (attempt < maxAttempts) {\n // Remove cached adapter so next attempt creates fresh\n const key = this.getPoolKey(backend, credentials);\n const old = this._adapterPool.get(key);\n if (old) { try { await old.dispose(); } catch { /* best-effort */ } }\n this._adapterPool.delete(key);\n await delay(delayMs);\n }\n }\n }\n\n throw lastError!;\n }\n\n /**\n * Create stream with retry for pre-stream connection errors.\n * Tries to get the first event from the stream; if that fails,\n * retries with a fresh adapter. Once first event is received,\n * the stream is committed (no more retries).\n */\n private async createStreamWithRetry(\n adapter: IChatBackend,\n session: ChatSession,\n message: string,\n options: SendMessageOptions | undefined,\n backend: string,\n credentials: AuthToken,\n ): Promise<AsyncIterable<ChatEvent>> {\n const maxAttempts = this._retryConfig?.maxAttempts ?? 1;\n const delayMs = this._retryConfig?.delayMs ?? 0;\n let lastError: Error | undefined;\n let currentAdapter = adapter;\n\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n try {\n const stream = currentAdapter.streamMessage(session, message, options);\n const iterator = (stream as AsyncIterable<ChatEvent>)[Symbol.asyncIterator]();\n const first = await iterator.next();\n\n // First event received — stream is live. Wrap remaining into iterable.\n return (async function* () {\n if (!first.done) yield first.value;\n while (true) {\n const next = await iterator.next();\n if (next.done) break;\n yield next.value;\n }\n })();\n } catch (err) {\n lastError = err instanceof Error ? err : new Error(String(err));\n if (attempt < maxAttempts) {\n // Dispose failed adapter before creating fresh one\n try { await currentAdapter.dispose(); } catch { /* best-effort */ }\n const key = this.getPoolKey(backend, credentials);\n this._adapterPool.delete(key);\n await delay(delayMs);\n currentAdapter = await this.getOrCreateAdapter(backend, credentials);\n }\n }\n }\n\n throw lastError!;\n }\n}\n\n// ─── Helpers ───────────────────────────────────────────────────\n\nfunction delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n// ─── Factory ───────────────────────────────────────────────────\n\n/**\n * Create a fully-wired chat runtime from configuration.\n *\n * @param options - Runtime configuration (backends, session store, context, middleware)\n * @returns IChatRuntime instance ready to use\n *\n * @example\n * ```typescript\n * import { createChatRuntime } from \"@witqq/agent-sdk/chat/runtime\";\n * import { InMemorySessionStore } from \"@witqq/agent-sdk/chat/sessions\";\n *\n * const runtime = createChatRuntime({\n * backends: {\n * copilot: () => new CopilotAdapter({ agentConfig: { model: \"gpt-4\" } }),\n * },\n * defaultBackend: \"copilot\",\n * sessionStore: new InMemorySessionStore(),\n * });\n * ```\n */\nexport function createChatRuntime<TMetadata extends Record<string, unknown> = Record<string, unknown>>(\n options: ChatRuntimeOptions,\n): IChatRuntime<TMetadata> {\n return new ChatRuntime<TMetadata>(options);\n}\n","/**\n * @witqq/agent-sdk/chat/storage\n *\n * Generic storage adapter layer with pluggable backends.\n * Provides CRUD operations for any data type via `IStorageAdapter<T>`.\n * Implementations: `InMemoryStorage` (Map-based) and `FileStorage` (JSON files).\n */\n\nimport { existsSync, mkdirSync, readFileSync, readdirSync, unlinkSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { AgentSDKError } from \"../errors.js\";\nimport { ErrorCode } from \"../types/errors.js\";\n\n// ─── Storage Errors ────────────────────────────────────────────\n\n/**\n * Error thrown by storage operations.\n *\n * @example\n * ```typescript\n * try {\n * await store.get(\"missing-id\");\n * } catch (e) {\n * if (e instanceof StorageError && e.code === ErrorCode.STORAGE_NOT_FOUND) {\n * // handle missing item\n * }\n * }\n * ```\n */\nexport class StorageError extends AgentSDKError {\n /** Machine-readable error code from the unified ErrorCode enum */\n readonly code: StorageErrorCode;\n\n constructor(message: string, code: StorageErrorCode) {\n super(message);\n this.name = \"StorageError\";\n this.code = code;\n }\n}\n\n/** Storage-specific subset of ErrorCode */\nexport type StorageErrorCode =\n | ErrorCode.STORAGE_NOT_FOUND\n | ErrorCode.STORAGE_DUPLICATE_KEY\n | ErrorCode.STORAGE_IO_ERROR\n | ErrorCode.STORAGE_SERIALIZATION_ERROR;\n\n// ─── Storage Adapter Interface ─────────────────────────────────\n\n/**\n * Options for listing stored items.\n *\n * @typeParam T - The type of stored items\n */\nexport interface ListOptions<T> {\n /** Filter predicate — return `true` to include the item */\n filter?: (item: T) => boolean;\n /** Sort comparator — standard Array.sort semantics */\n sort?: (a: T, b: T) => number;\n /** Maximum number of items to return */\n limit?: number;\n /** Number of items to skip (for pagination) */\n offset?: number;\n}\n\n/**\n * Generic storage adapter for CRUD operations on any data type.\n * Items are identified by a string key.\n *\n * @typeParam T - The type of stored items\n *\n * @example\n * ```typescript\n * const store: IStorageAdapter<{ name: string }> = new InMemoryStorage();\n * await store.create(\"key1\", { name: \"Alice\" });\n * const item = await store.get(\"key1\"); // { name: \"Alice\" }\n * ```\n */\nexport interface IStorageAdapter<T> {\n /**\n * Retrieve an item by key.\n * @param key - Unique identifier\n * @returns The item, or `null` if not found\n */\n get(key: string): Promise<T | null>;\n\n /**\n * List items with optional filtering, sorting, and pagination.\n * @param options - Filter, sort, limit, offset options\n * @returns Array of matching items\n */\n list(options?: ListOptions<T>): Promise<T[]>;\n\n /**\n * Create a new item. Throws `StorageError` with code `DUPLICATE_KEY` if key exists.\n * @param key - Unique identifier\n * @param item - Data to store\n */\n create(key: string, item: T): Promise<void>;\n\n /**\n * Update an existing item. Throws `StorageError` with code `NOT_FOUND` if key missing.\n * @param key - Unique identifier\n * @param item - Updated data\n */\n update(key: string, item: T): Promise<void>;\n\n /**\n * Delete an item by key. Throws `StorageError` with code `NOT_FOUND` if key missing.\n * @param key - Unique identifier\n */\n delete(key: string): Promise<void>;\n\n /**\n * Check whether a key exists.\n * @param key - Unique identifier\n * @returns `true` if key exists\n */\n has(key: string): Promise<boolean>;\n\n /**\n * Return the number of stored items.\n * @returns Count of items\n */\n count(): Promise<number>;\n\n /**\n * Remove all items from storage.\n */\n clear(): Promise<void>;\n\n /**\n * Release any resources held by this adapter (DB connections, file handles).\n * Optional — adapters that don't hold resources need not implement this.\n */\n dispose?(): Promise<void>;\n}\n\n// ─── InMemoryStorage ───────────────────────────────────────────\n\n/**\n * In-memory storage adapter backed by a `Map`.\n * Suitable for development, testing, and short-lived processes.\n * Data is lost when the process exits.\n *\n * @typeParam T - The type of stored items\n *\n * @example\n * ```typescript\n * const store = new InMemoryStorage<{ name: string }>();\n * await store.create(\"k1\", { name: \"Alice\" });\n * await store.create(\"k2\", { name: \"Bob\" });\n * const items = await store.list({ filter: i => i.name.startsWith(\"A\") });\n * // [{ name: \"Alice\" }]\n * ```\n */\nexport class InMemoryStorage<T> implements IStorageAdapter<T> {\n private readonly data = new Map<string, T>();\n\n /** @inheritdoc */\n async get(key: string): Promise<T | null> {\n const item = this.data.get(key);\n return item !== undefined ? structuredClone(item) : null;\n }\n\n /** @inheritdoc */\n async list(options?: ListOptions<T>): Promise<T[]> {\n let items = Array.from(this.data.values()).map((item) => structuredClone(item));\n\n if (options?.filter) {\n items = items.filter(options.filter);\n }\n if (options?.sort) {\n items.sort(options.sort);\n }\n if (options?.offset !== undefined) {\n items = items.slice(options.offset);\n }\n if (options?.limit !== undefined) {\n items = items.slice(0, options.limit);\n }\n\n return items;\n }\n\n /** @inheritdoc */\n async create(key: string, item: T): Promise<void> {\n if (this.data.has(key)) {\n throw new StorageError(\n `Item with key \"${key}\" already exists`,\n ErrorCode.STORAGE_DUPLICATE_KEY,\n );\n }\n this.data.set(key, structuredClone(item));\n }\n\n /** @inheritdoc */\n async update(key: string, item: T): Promise<void> {\n if (!this.data.has(key)) {\n throw new StorageError(\n `Item with key \"${key}\" not found`,\n ErrorCode.STORAGE_NOT_FOUND,\n );\n }\n this.data.set(key, structuredClone(item));\n }\n\n /** @inheritdoc */\n async delete(key: string): Promise<void> {\n if (!this.data.has(key)) {\n throw new StorageError(\n `Item with key \"${key}\" not found`,\n ErrorCode.STORAGE_NOT_FOUND,\n );\n }\n this.data.delete(key);\n }\n\n /** @inheritdoc */\n async has(key: string): Promise<boolean> {\n return this.data.has(key);\n }\n\n /** @inheritdoc */\n async count(): Promise<number> {\n return this.data.size;\n }\n\n /** @inheritdoc */\n async clear(): Promise<void> {\n this.data.clear();\n }\n}\n\n// ─── FileStorage ───────────────────────────────────────────────\n\n/**\n * Options for configuring `FileStorage`.\n */\nexport interface FileStorageOptions {\n /** Directory path where JSON files are stored */\n directory: string;\n /** File extension (default: `.json`) */\n extension?: string;\n}\n\n/**\n * File-based storage adapter that persists each item as a JSON file.\n * Suitable for local applications, CLI tools, and development.\n * Creates the storage directory if it doesn't exist.\n *\n * @typeParam T - The type of stored items (must be JSON-serializable)\n *\n * @example\n * ```typescript\n * const store = new FileStorage<ChatSession>({\n * directory: \"./data/sessions\",\n * });\n * await store.create(\"session-1\", mySession);\n * ```\n */\nexport class FileStorage<T> implements IStorageAdapter<T> {\n private readonly directory: string;\n private readonly extension: string;\n\n constructor(options: FileStorageOptions) {\n this.directory = options.directory;\n this.extension = options.extension ?? \".json\";\n this.ensureDirectory();\n }\n\n /** @inheritdoc */\n async get(key: string): Promise<T | null> {\n const filePath = this.keyToPath(key);\n if (!existsSync(filePath)) {\n return null;\n }\n return this.readFile(filePath);\n }\n\n /** @inheritdoc */\n async list(options?: ListOptions<T>): Promise<T[]> {\n this.ensureDirectory();\n const files = readdirSync(this.directory).filter((f) =>\n f.endsWith(this.extension),\n );\n\n let items: T[] = [];\n for (const file of files) {\n const item = this.readFile(join(this.directory, file));\n items.push(item);\n }\n\n if (options?.filter) {\n items = items.filter(options.filter);\n }\n if (options?.sort) {\n items.sort(options.sort);\n }\n if (options?.offset !== undefined) {\n items = items.slice(options.offset);\n }\n if (options?.limit !== undefined) {\n items = items.slice(0, options.limit);\n }\n\n return items;\n }\n\n /** @inheritdoc */\n async create(key: string, item: T): Promise<void> {\n const filePath = this.keyToPath(key);\n if (existsSync(filePath)) {\n throw new StorageError(\n `Item with key \"${key}\" already exists`,\n ErrorCode.STORAGE_DUPLICATE_KEY,\n );\n }\n this.writeFile(filePath, item);\n }\n\n /** @inheritdoc */\n async update(key: string, item: T): Promise<void> {\n const filePath = this.keyToPath(key);\n if (!existsSync(filePath)) {\n throw new StorageError(\n `Item with key \"${key}\" not found`,\n ErrorCode.STORAGE_NOT_FOUND,\n );\n }\n this.writeFile(filePath, item);\n }\n\n /** @inheritdoc */\n async delete(key: string): Promise<void> {\n const filePath = this.keyToPath(key);\n if (!existsSync(filePath)) {\n throw new StorageError(\n `Item with key \"${key}\" not found`,\n ErrorCode.STORAGE_NOT_FOUND,\n );\n }\n unlinkSync(filePath);\n }\n\n /** @inheritdoc */\n async has(key: string): Promise<boolean> {\n return existsSync(this.keyToPath(key));\n }\n\n /** @inheritdoc */\n async count(): Promise<number> {\n this.ensureDirectory();\n return readdirSync(this.directory).filter((f) =>\n f.endsWith(this.extension),\n ).length;\n }\n\n /** @inheritdoc */\n async clear(): Promise<void> {\n this.ensureDirectory();\n const files = readdirSync(this.directory).filter((f) =>\n f.endsWith(this.extension),\n );\n for (const file of files) {\n unlinkSync(join(this.directory, file));\n }\n }\n\n private keyToPath(key: string): string {\n const safeKey = key.replace(/[^a-zA-Z0-9_-]/g, (c) =>\n \"%\" + c.charCodeAt(0).toString(16).padStart(2, \"0\"),\n );\n return join(this.directory, `${safeKey}${this.extension}`);\n }\n\n private ensureDirectory(): void {\n if (!existsSync(this.directory)) {\n mkdirSync(this.directory, { recursive: true });\n }\n }\n\n private readFile(filePath: string): T {\n try {\n const content = readFileSync(filePath, \"utf-8\");\n return JSON.parse(content) as T;\n } catch (error) {\n if (error instanceof SyntaxError) {\n throw new StorageError(\n `Failed to parse file: ${filePath}`,\n ErrorCode.STORAGE_SERIALIZATION_ERROR,\n );\n }\n throw new StorageError(\n `Failed to read file: ${filePath}`,\n ErrorCode.STORAGE_IO_ERROR,\n );\n }\n }\n\n private writeFile(filePath: string, item: T): void {\n try {\n const content = JSON.stringify(item, null, 2);\n writeFileSync(filePath, content, \"utf-8\");\n } catch {\n throw new StorageError(\n `Failed to write file: ${filePath}`,\n ErrorCode.STORAGE_IO_ERROR,\n );\n }\n }\n}\n","/**\n * @witqq/agent-sdk/chat/sessions\n *\n * Session store layer wrapping generic storage adapters.\n * Provides session-specific operations: message management,\n * paginated retrieval, search, and session lifecycle.\n */\n\nimport type {\n ChatSession,\n ChatMessage,\n ChatId,\n ChatSessionConfig,\n} from \"./core.js\";\nimport { createChatId } from \"./core.js\";\nimport type { IStorageAdapter, ListOptions } from \"./storage.js\";\nimport { InMemoryStorage, FileStorage, StorageError } from \"./storage.js\";\nimport { ErrorCode } from \"../types/errors.js\";\n\n// ─── Session Store Interface ───────────────────────────────────\n\n/** Options for creating a new session */\nexport interface CreateSessionOptions<TCustom extends Record<string, unknown> = Record<string, unknown>> {\n /** Session title (defaults to \"Untitled\") */\n title?: string;\n /** Session configuration (optional — runtime defaults used when omitted) */\n config?: Partial<ChatSessionConfig>;\n /** Initial tags */\n tags?: string[];\n /** Custom metadata */\n custom?: TCustom;\n}\n\n/** Paginated result of messages */\nexport interface PaginatedMessages {\n /** Messages in this page */\n messages: ChatMessage[];\n /** Total number of messages in session */\n total: number;\n /** Whether there are more messages after this page */\n hasMore: boolean;\n}\n\n/** Options for listing sessions */\nexport interface SessionListOptions {\n /** Filter predicate */\n filter?: (session: ChatSession) => boolean;\n /** Sort comparator */\n sort?: (a: ChatSession, b: ChatSession) => number;\n /** Maximum number of sessions to return */\n limit?: number;\n /** Number of sessions to skip */\n offset?: number;\n}\n\n/** Search options for finding sessions */\nexport interface SessionSearchOptions {\n /** Text query to match against title and message content */\n query: string;\n /** Maximum results (default: 20) */\n limit?: number;\n}\n\n/**\n * Read-only session operations.\n * Consumers needing read-only access (dashboards, analytics) implement only this.\n */\nexport interface ISessionReader {\n getSession(id: ChatId): Promise<ChatSession | null>;\n listSessions(options?: SessionListOptions): Promise<ChatSession[]>;\n loadMessages(\n sessionId: ChatId,\n options?: { limit?: number; offset?: number },\n ): Promise<PaginatedMessages>;\n searchSessions(options: SessionSearchOptions): Promise<ChatSession[]>;\n count(): Promise<number>;\n}\n\n/**\n * Write/mutate session operations.\n * Consumers needing full access implement both ISessionReader & ISessionWriter.\n */\nexport interface ISessionWriter {\n createSession(options: CreateSessionOptions): Promise<ChatSession>;\n updateTitle(id: ChatId, title: string): Promise<void>;\n updateConfig(id: ChatId, config: Partial<ChatSessionConfig>): Promise<void>;\n deleteSession(id: ChatId): Promise<void>;\n appendMessage(sessionId: ChatId, message: ChatMessage): Promise<void>;\n saveMessages(sessionId: ChatId, messages: ChatMessage[]): Promise<void>;\n clear(): Promise<void>;\n /** Release any resources held by this store (optional). */\n dispose?(): Promise<void>;\n}\n\n/**\n * Full session store interface — union of reader and writer.\n * Backward-compatible: all existing implementations continue to work.\n *\n * @example\n * ```typescript\n * const store = new InMemorySessionStore();\n * const session = await store.createSession({ config: { model: \"gpt-4\", backend: \"vercel-ai\" } });\n * await store.appendMessage(session.id, message);\n * const page = await store.loadMessages(session.id, { limit: 20, offset: 0 });\n * ```\n */\nexport interface IChatSessionStore extends ISessionReader, ISessionWriter {}\n\n// ─── Base Session Store ────────────────────────────────────────\n\n/**\n * Base session store implementation backed by any `IStorageAdapter<ChatSession>`.\n * Handles all session-specific logic; subclasses only need to provide the adapter.\n */\nclass BaseSessionStore implements IChatSessionStore {\n constructor(protected readonly adapter: IStorageAdapter<ChatSession>) {}\n\n async createSession(options: CreateSessionOptions): Promise<ChatSession> {\n const now = new Date().toISOString();\n const id = createChatId();\n const session: ChatSession = {\n id,\n title: options.title ?? \"Untitled\",\n messages: [],\n config: {\n model: options.config?.model ?? \"\",\n backend: options.config?.backend ?? \"\",\n ...options.config,\n },\n metadata: {\n messageCount: 0,\n totalTokens: 0,\n tags: options.tags ? [...options.tags] : undefined,\n custom: options.custom ? { ...options.custom } : undefined,\n },\n status: \"active\" as const,\n createdAt: now,\n updatedAt: now,\n };\n await this.adapter.create(id, session);\n return structuredClone(session);\n }\n\n async getSession(id: ChatId): Promise<ChatSession | null> {\n return this.adapter.get(id);\n }\n\n async listSessions(options?: SessionListOptions): Promise<ChatSession[]> {\n return this.adapter.list(options as ListOptions<ChatSession>);\n }\n\n async updateTitle(id: ChatId, title: string): Promise<void> {\n const session = await this.adapter.get(id);\n if (!session) {\n throw new StorageError(`Session \"${id}\" not found`, ErrorCode.STORAGE_NOT_FOUND);\n }\n session.title = title;\n session.updatedAt = new Date().toISOString();\n await this.adapter.update(id, session);\n }\n\n async updateConfig(\n id: ChatId,\n config: Partial<ChatSessionConfig>,\n ): Promise<void> {\n const session = await this.adapter.get(id);\n if (!session) {\n throw new StorageError(`Session \"${id}\" not found`, ErrorCode.STORAGE_NOT_FOUND);\n }\n session.config = { ...session.config, ...config };\n session.updatedAt = new Date().toISOString();\n await this.adapter.update(id, session);\n }\n\n async deleteSession(id: ChatId): Promise<void> {\n await this.adapter.delete(id);\n }\n\n async appendMessage(sessionId: ChatId, message: ChatMessage): Promise<void> {\n const session = await this.adapter.get(sessionId);\n if (!session) {\n throw new StorageError(`Session \"${sessionId}\" not found`, ErrorCode.STORAGE_NOT_FOUND);\n }\n session.messages.push(structuredClone(message));\n session.metadata.messageCount = session.messages.length;\n session.updatedAt = new Date().toISOString();\n await this.adapter.update(sessionId, session);\n }\n\n async saveMessages(sessionId: ChatId, messages: ChatMessage[]): Promise<void> {\n if (messages.length === 0) return;\n const session = await this.adapter.get(sessionId);\n if (!session) {\n throw new StorageError(`Session \"${sessionId}\" not found`, ErrorCode.STORAGE_NOT_FOUND);\n }\n for (const msg of messages) {\n session.messages.push(structuredClone(msg));\n }\n session.metadata.messageCount = session.messages.length;\n session.updatedAt = new Date().toISOString();\n await this.adapter.update(sessionId, session);\n }\n\n async loadMessages(\n sessionId: ChatId,\n options?: { limit?: number; offset?: number },\n ): Promise<PaginatedMessages> {\n const session = await this.adapter.get(sessionId);\n if (!session) {\n throw new StorageError(`Session \"${sessionId}\" not found`, ErrorCode.STORAGE_NOT_FOUND);\n }\n const total = session.messages.length;\n const offset = options?.offset ?? 0;\n const limit = options?.limit ?? total;\n const messages = session.messages.slice(offset, offset + limit);\n return {\n messages: structuredClone(messages),\n total,\n hasMore: offset + limit < total,\n };\n }\n\n async searchSessions(\n options: SessionSearchOptions,\n ): Promise<ChatSession[]> {\n const query = options.query.toLowerCase();\n const limit = options.limit ?? 20;\n return this.adapter.list({\n filter: (session) => {\n if (session.title?.toLowerCase().includes(query)) return true;\n return session.messages.some((msg) => {\n return msg.parts.some(\n (part) =>\n part.type === \"text\" &&\n part.text.toLowerCase().includes(query),\n );\n });\n },\n limit,\n });\n }\n\n async count(): Promise<number> {\n return this.adapter.count();\n }\n\n async clear(): Promise<void> {\n return this.adapter.clear();\n }\n}\n\n// ─── InMemorySessionStore ──────────────────────────────────────\n\n/**\n * In-memory session store. Data is lost when the process exits.\n * Uses `InMemoryStorage` internally.\n *\n * @example\n * ```typescript\n * const store = new InMemorySessionStore();\n * const session = await store.createSession({\n * config: { model: \"gpt-4\", backend: \"vercel-ai\" },\n * });\n * ```\n */\nexport class InMemorySessionStore extends BaseSessionStore {\n constructor() {\n super(new InMemoryStorage<ChatSession>());\n }\n}\n\n// ─── FileSessionStore ──────────────────────────────────────────\n\n/** Configuration for FileSessionStore */\nexport interface FileSessionStoreOptions {\n /** Directory to store session JSON files */\n directory: string;\n}\n\n/**\n * File-based session store. Each session is a JSON file on disk.\n * Uses `FileStorage` internally.\n *\n * @example\n * ```typescript\n * const store = new FileSessionStore({ directory: \"./data/sessions\" });\n * const session = await store.createSession({\n * config: { model: \"claude-3\", backend: \"claude\" },\n * });\n * ```\n */\nexport class FileSessionStore extends BaseSessionStore {\n constructor(options: FileSessionStoreOptions) {\n super(new FileStorage<ChatSession>({ directory: options.directory }));\n }\n}\n\n// Re-export StorageError for consumers that only import from chat/sessions\nexport { StorageError } from \"./storage.js\";\n","/**\n * @witqq/agent-sdk/chat/backends/types\n *\n * IChatBackend — core backend interface for sending/streaming messages.\n * IResumableBackend — extends IChatBackend with session resume support.\n */\n\nimport type {\n ChatEvent,\n ChatMessage,\n ChatSession,\n SendMessageOptions,\n} from \"../core.js\";\nimport type {\n FullAgentConfig,\n IAgentService,\n ModelInfo,\n} from \"../../types.js\";\n\n// ─── Backend Adapter Options ───────────────────────────────────\n\n/** Options for creating a backend adapter */\nexport interface BackendAdapterOptions {\n /** Agent configuration (model, systemPrompt, tools, etc.) */\n agentConfig: FullAgentConfig;\n /** Pre-created agent service (if adapter should not own lifecycle) */\n agentService?: IAgentService;\n /** Factory for lazy service creation (called on first use, not at construction) */\n agentServiceFactory?: () => IAgentService;\n}\n\n// ─── Core Backend Interface ────────────────────────────────────\n\n/**\n * Core chat backend — send, stream, models, validate, dispose.\n * All backends implement this. Resume support is optional.\n *\n * Note: `agentService` is intentionally NOT on this interface.\n * It's an implementation detail exposed on BaseBackendAdapter for\n * advanced consumers who need direct service access.\n */\nexport interface IChatBackend {\n /** Backend name (e.g. \"copilot\", \"claude\", \"vercel-ai\") */\n readonly name: string;\n\n /** Send a message and receive a complete response */\n sendMessage(\n session: ChatSession,\n message: string,\n options?: SendMessageOptions,\n ): Promise<ChatMessage>;\n\n /** Stream a message response as ChatEvents */\n streamMessage(\n session: ChatSession,\n message: string,\n options?: SendMessageOptions,\n ): AsyncIterable<ChatEvent>;\n\n /** List available models */\n listModels(): Promise<ModelInfo[]>;\n\n /** Validate backend configuration/credentials */\n validate(): Promise<{ valid: boolean; errors: string[] }>;\n\n /** Dispose resources */\n dispose(): Promise<void>;\n\n /** Current effective model */\n readonly currentModel: string | undefined;\n}\n\n// ─── Resumable Backend Interface ───────────────────────────────\n\n/**\n * Extended backend with session resume capabilities.\n * Only backends with persistent sessions (Copilot, Claude) implement this.\n * Use `isResumableBackend()` to type-narrow at runtime.\n */\nexport interface IResumableBackend extends IChatBackend {\n /** Whether this adapter supports session resume */\n canResume(): boolean;\n\n /**\n * Resume a previous session by its backend session ID.\n * Streams events from the resumed session.\n * @throws ChatError with SESSION_EXPIRED if session is no longer valid\n * @throws ChatError with SESSION_NOT_FOUND if session ID is unknown\n */\n resume(\n session: ChatSession,\n backendSessionId: string,\n options?: SendMessageOptions,\n ): AsyncIterable<ChatEvent>;\n\n /** The backend session ID from the last stream, or null if not yet streamed */\n readonly backendSessionId: string | null;\n}\n\n/** Type guard: checks if a backend adapter supports session resume */\nexport function isResumableBackend(\n adapter: IChatBackend,\n): adapter is IResumableBackend {\n return \"canResume\" in adapter && typeof (adapter as IResumableBackend).canResume === \"function\";\n}\n\n\n","/**\n * @witqq/agent-sdk/chat/backends/base\n *\n * Abstract base class for backend adapters. Provides shared lifecycle\n * management, event bridge via adaptAgentEvents(), and tool forwarding.\n */\n\nimport type {\n ChatEvent,\n ChatSession,\n ChatMessage,\n SendMessageOptions,\n} from \"../core.js\";\nimport {\n createChatId,\n adaptAgentEvents,\n toAgentMessage,\n} from \"../core.js\";\nimport { ChatError, ErrorCode } from \"../errors.js\";\nimport type {\n FullAgentConfig,\n IAgent,\n IAgentService,\n Message,\n ModelInfo,\n} from \"../../types.js\";\nimport type { IChatBackend, BackendAdapterOptions } from \"./types.js\";\n\n/**\n * Abstract base for backend adapters implementing IChatBackend (core only).\n * Subclasses implement createService() for backend-specific service creation.\n * Resume support is NOT required — subclasses can implement IResumableBackend separately.\n */\nexport abstract class BaseBackendAdapter implements IChatBackend {\n readonly name: string;\n private _agentService: IAgentService | null = null;\n private _agentServiceFactory: (() => IAgentService) | null = null;\n private _disposed = false;\n protected readonly _agentConfig: FullAgentConfig;\n private _ownsService: boolean;\n // Agent lifecycle: tracks current agent and the model it was created with.\n // For persistent sessions, reused across calls when model matches.\n // For non-persistent, recreated every call.\n private _currentAgent: { instance: IAgent; model: string | undefined } | null = null;\n\n constructor(name: string, options: BackendAdapterOptions) {\n this.name = name;\n this._agentConfig = options.agentConfig;\n if (options.agentService) {\n this._agentService = options.agentService;\n this._ownsService = false;\n } else if (options.agentServiceFactory) {\n this._agentServiceFactory = options.agentServiceFactory;\n this._ownsService = true;\n } else {\n this._agentService = this.createService();\n this._ownsService = true;\n }\n }\n\n /** Subclasses create their specific IAgentService */\n protected abstract createService(): IAgentService;\n\n get agentService(): IAgentService {\n if (!this._agentService) {\n if (this._agentServiceFactory) {\n this._agentService = this._agentServiceFactory();\n this._agentServiceFactory = null; // factory used once\n } else {\n throw new ChatError(\"Agent service not available\", {\n code: ErrorCode.BACKEND_NOT_INSTALLED,\n });\n }\n }\n return this._agentService;\n }\n\n get currentModel(): string | undefined {\n return this._agentConfig.model;\n }\n\n /**\n * @deprecated No-op. Tools are passed per-call via SendMessageOptions.tools.\n * Kept for backward compatibility with code that calls setTools() directly.\n */\n setTools(): void {\n // No-op — tools flow per-call via SendMessageOptions.tools\n }\n\n async sendMessage(\n session: ChatSession,\n message: string,\n options?: SendMessageOptions,\n ): Promise<ChatMessage> {\n this.assertNotDisposed();\n const events = this.streamMessage(session, message, options);\n\n let text = \"\";\n let lastMessage: ChatMessage | undefined;\n\n for await (const event of events) {\n if (event.type === \"message:delta\") {\n text += event.text;\n }\n if (event.type === \"message:complete\") {\n lastMessage = event.message;\n }\n }\n\n if (lastMessage) return lastMessage;\n\n // Construct message from accumulated text\n const messageId = createChatId();\n return {\n id: messageId,\n role: \"assistant\",\n parts: [{ type: \"text\", text, status: \"complete\" }],\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n status: \"complete\",\n };\n }\n\n async *streamMessage(\n session: ChatSession,\n message: string,\n options?: SendMessageOptions,\n ): AsyncIterable<ChatEvent> {\n this.assertNotDisposed();\n\n const agent = this.getOrCreateAgent(options);\n\n // Convert session messages to agent format + new user message\n const messages: Message[] = session.messages.map(toAgentMessage);\n messages.push({ role: \"user\", content: message });\n\n yield* this.streamAgentEvents(agent, messages, options);\n }\n\n /**\n * Shared streaming helper: bridges agent events to chat events.\n * Used by both streamMessage() and resume() to avoid duplication.\n */\n protected async *streamAgentEvents(\n agent: IAgent,\n messages: Message[],\n options?: SendMessageOptions,\n ): AsyncIterable<ChatEvent> {\n const messageId = createChatId();\n const model = options?.model ?? this._agentConfig.model ?? \"\";\n\n const agentEvents = agent.streamWithContext(messages, {\n model,\n signal: options?.signal,\n context: options?.context,\n tools: options?.tools,\n ...(options?.systemPrompt ? { systemMessage: options.systemPrompt } : {}),\n });\n\n yield { type: \"message:start\", messageId, role: \"assistant\" };\n\n let text = \"\";\n for await (const chatEvent of adaptAgentEvents(agentEvents, messageId)) {\n if (chatEvent.type === \"message:delta\") {\n text += chatEvent.text;\n }\n yield chatEvent;\n }\n\n this.captureSessionId(agent);\n\n yield {\n type: \"message:complete\",\n messageId,\n message: {\n id: messageId,\n role: \"assistant\",\n parts: [{ type: \"text\", text, status: \"complete\" }],\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n status: \"complete\",\n },\n };\n }\n\n async listModels(): Promise<ModelInfo[]> {\n this.assertNotDisposed();\n return this.agentService.listModels();\n }\n\n async validate(): Promise<{ valid: boolean; errors: string[] }> {\n this.assertNotDisposed();\n return this.agentService.validate();\n }\n\n async dispose(): Promise<void> {\n if (this._disposed) return;\n this._disposed = true;\n if (this._currentAgent) {\n this._currentAgent.instance.dispose();\n this._currentAgent = null;\n }\n if (this._ownsService && this._agentService && typeof this._agentService.dispose === \"function\") {\n await this._agentService.dispose();\n }\n }\n\n /** Get or create an agent. Model is passed per-call via RunOptions.\n * Tools are passed per-call via SendMessageOptions — not baked into config.\n * For persistent sessions, reuses agent when model matches. */\n protected getOrCreateAgent(options?: SendMessageOptions): IAgent {\n const model = options?.model ?? this._agentConfig.model;\n\n // For persistent session mode, reuse if model matches\n if (this._agentConfig.sessionMode === \"persistent\" && this._currentAgent) {\n if (this._currentAgent.model === model) {\n return this._currentAgent.instance;\n }\n // Model changed — dispose old agent, create new one below\n this._currentAgent.instance.dispose();\n this._currentAgent = null;\n }\n\n // Dispose previous agent to prevent leaks (P23)\n if (this._currentAgent) {\n this._currentAgent.instance.dispose();\n this._currentAgent = null;\n }\n\n // Create fresh agent — tools come per-call, not in config\n const config: FullAgentConfig = {\n ...this._agentConfig,\n ...(model !== undefined && { model }),\n };\n const agent = this.agentService.createAgent(config);\n this._currentAgent = { instance: agent, model };\n return agent;\n }\n\n /** Subclasses capture backend session ID from agent after streaming */\n protected abstract captureSessionId(agent: IAgent): void;\n\n protected assertNotDisposed(): void {\n if (this._disposed) {\n throw new ChatError(\"Adapter is disposed\", {\n code: ErrorCode.DISPOSED,\n });\n }\n }\n}\n","/**\n * @witqq/agent-sdk/chat/backends/copilot\n *\n * CopilotChatAdapter wraps CopilotAgentService for chat use.\n * Supports persistent session mode for canResume/resume.\n */\n\nimport type {\n ChatEvent,\n ChatSession,\n SendMessageOptions,\n} from \"../core.js\";\nimport { toAgentMessage } from \"../core.js\";\nimport { ChatError, ErrorCode } from \"../errors.js\";\nimport type {\n IAgent,\n IAgentService,\n CopilotBackendOptions,\n Message,\n} from \"../../types.js\";\nimport { BaseBackendAdapter } from \"./base.js\";\nimport type { BackendAdapterOptions, IResumableBackend } from \"./types.js\";\n\n// ─── Copilot-Specific Options ──────────────────────────────────\n\n/** Options for creating a CopilotChatAdapter */\nexport interface CopilotChatAdapterOptions extends BackendAdapterOptions {\n /** Copilot backend options (cliPath, token, etc.) */\n copilotOptions?: CopilotBackendOptions;\n}\n\n// ─── CopilotChatAdapter ────────────────────────────────────────\n\n/**\n * Backend adapter for GitHub Copilot CLI.\n * Uses persistent session mode for session resume via CLI session ID.\n */\nexport class CopilotChatAdapter extends BaseBackendAdapter implements IResumableBackend {\n private _backendSessionId: string | null = null;\n private readonly _copilotOptions?: CopilotBackendOptions;\n\n constructor(options: CopilotChatAdapterOptions) {\n // Force persistent session mode for resume support\n const agentConfig = {\n ...options.agentConfig,\n sessionMode: \"persistent\" as const,\n };\n super(\"copilot\", { ...options, agentConfig });\n this._copilotOptions = options.copilotOptions;\n }\n\n protected createService(): IAgentService {\n // Use synchronous factory directly (not the async registry createAgentService)\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const { createCopilotService } = require(\"../../backends/copilot.js\");\n return createCopilotService(this._copilotOptions || {});\n }\n\n get backendSessionId(): string | null {\n return this._backendSessionId;\n }\n\n canResume(): boolean {\n return this._backendSessionId !== null;\n }\n\n async *resume(\n session: ChatSession,\n backendSessionId: string,\n options?: SendMessageOptions,\n ): AsyncIterable<ChatEvent> {\n this.assertNotDisposed();\n\n if (!backendSessionId) {\n throw new ChatError(\"Backend session ID is required for resume\", {\n code: ErrorCode.INVALID_INPUT,\n });\n }\n\n const agent = this.getOrCreateAgent(options);\n const currentSessionId = agent.sessionId;\n\n // No prior session — adapter was never streamed or session was lost\n if (!currentSessionId) {\n throw new ChatError(\n `No active session to resume (requested: ${backendSessionId})`,\n { code: ErrorCode.SESSION_NOT_FOUND },\n );\n }\n\n // Session ID mismatch — session expired or was replaced\n if (currentSessionId !== backendSessionId) {\n throw new ChatError(\n `Session expired: expected ${backendSessionId}, got ${currentSessionId}`,\n { code: ErrorCode.SESSION_EXPIRED },\n );\n }\n\n const messages: Message[] = session.messages.map(toAgentMessage);\n yield* this.streamAgentEvents(agent, messages, options);\n }\n\n protected captureSessionId(agent: IAgent): void {\n if (agent.sessionId) {\n this._backendSessionId = agent.sessionId;\n }\n }\n}\n","/**\n * @witqq/agent-sdk/chat/backends/claude\n *\n * ClaudeChatAdapter wraps ClaudeAgentService for chat use.\n * Supports persistent session mode with Claude's session_id for resume.\n */\n\nimport type {\n ChatEvent,\n ChatSession,\n SendMessageOptions,\n} from \"../core.js\";\nimport { toAgentMessage } from \"../core.js\";\nimport { ChatError, ErrorCode } from \"../errors.js\";\nimport type {\n IAgent,\n IAgentService,\n ClaudeBackendOptions,\n Message,\n} from \"../../types.js\";\nimport { BaseBackendAdapter } from \"./base.js\";\nimport type { BackendAdapterOptions, IResumableBackend } from \"./types.js\";\n\n// ─── Claude-Specific Options ──────────────────────────────────\n\n/** Options for creating a ClaudeChatAdapter */\nexport interface ClaudeChatAdapterOptions extends BackendAdapterOptions {\n /** Claude backend options (cliPath, model, etc.) */\n claudeOptions?: ClaudeBackendOptions;\n}\n\n// ─── ClaudeChatAdapter ─────────────────────────────────────────\n\n/**\n * Backend adapter for Claude CLI.\n * Uses persistent session mode for session resume via Claude's session_id.\n */\nexport class ClaudeChatAdapter extends BaseBackendAdapter implements IResumableBackend {\n private _backendSessionId: string | null = null;\n private readonly _claudeOptions?: ClaudeBackendOptions;\n\n constructor(options: ClaudeChatAdapterOptions) {\n // Force persistent session mode for resume support\n const agentConfig = {\n ...options.agentConfig,\n sessionMode: \"persistent\" as const,\n };\n super(\"claude\", { ...options, agentConfig });\n this._claudeOptions = options.claudeOptions;\n }\n\n protected createService(): IAgentService {\n // Use synchronous factory directly (not the async registry createAgentService)\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const { createClaudeService } = require(\"../../backends/claude.js\");\n return createClaudeService(this._claudeOptions || {});\n }\n\n get backendSessionId(): string | null {\n return this._backendSessionId;\n }\n\n canResume(): boolean {\n return this._backendSessionId !== null;\n }\n\n async *resume(\n session: ChatSession,\n backendSessionId: string,\n options?: SendMessageOptions,\n ): AsyncIterable<ChatEvent> {\n this.assertNotDisposed();\n\n if (!backendSessionId) {\n throw new ChatError(\"Backend session ID is required for resume\", {\n code: ErrorCode.INVALID_INPUT,\n });\n }\n\n const agent = this.getOrCreateAgent(options);\n const currentSessionId = agent.sessionId;\n\n // No prior session — adapter was never streamed or session was lost\n if (!currentSessionId) {\n throw new ChatError(\n `No active session to resume (requested: ${backendSessionId})`,\n { code: ErrorCode.SESSION_NOT_FOUND },\n );\n }\n\n // Session ID mismatch — session expired or was replaced\n if (currentSessionId !== backendSessionId) {\n throw new ChatError(\n `Session expired: expected ${backendSessionId}, got ${currentSessionId}`,\n { code: ErrorCode.SESSION_EXPIRED },\n );\n }\n\n const messages: Message[] = session.messages.map(toAgentMessage);\n yield* this.streamAgentEvents(agent, messages, options);\n }\n\n protected captureSessionId(agent: IAgent): void {\n if (agent.sessionId) {\n this._backendSessionId = agent.sessionId;\n }\n }\n}\n","/**\n * @witqq/agent-sdk/chat/backends/vercel-ai\n *\n * VercelAIChatAdapter wraps VercelAIAgentService for chat use.\n * Stateless adapter — implements IChatBackend only (no resume support).\n * Each streamMessage/sendMessage creates a fresh agent (per-call session mode).\n */\n\nimport type {\n IAgent,\n IAgentService,\n VercelAIBackendOptions,\n} from \"../../types.js\";\nimport { BaseBackendAdapter } from \"./base.js\";\nimport type { BackendAdapterOptions } from \"./types.js\";\n\n// ─── Vercel AI-Specific Options ────────────────────────────────\n\n/** Options for creating a VercelAIChatAdapter */\nexport interface VercelAIChatAdapterOptions extends BackendAdapterOptions {\n /** Vercel AI backend options (baseURL, apiKey, provider, etc.) */\n vercelOptions?: VercelAIBackendOptions;\n}\n\n// ─── VercelAIChatAdapter ───────────────────────────────────────\n\n/**\n * Backend adapter for Vercel AI SDK (API-based).\n * Stateless — each call creates a fresh agent. Does not support resume.\n * Implements IChatBackend only (no IResumableBackend).\n */\nexport class VercelAIChatAdapter extends BaseBackendAdapter {\n private readonly _vercelOptions?: VercelAIBackendOptions;\n\n constructor(options: VercelAIChatAdapterOptions) {\n // Vercel AI is stateless — per-call session mode (default)\n super(\"vercel-ai\", options);\n this._vercelOptions = options.vercelOptions;\n }\n\n protected createService(): IAgentService {\n // Use synchronous factory directly (not the async registry createAgentService)\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const { createVercelAIService } = require(\"../../backends/vercel-ai.js\");\n return createVercelAIService(this._vercelOptions || {});\n }\n\n protected captureSessionId(_agent: IAgent): void {\n // No-op: Vercel AI is stateless, no session ID to capture\n }\n}\n","/**\n * @witqq/agent-sdk/chat/backends/transport\n *\n * IChatTransport abstracts how ChatEvents are delivered to clients.\n * SSEChatTransport implements Server-Sent Events over HTTP.\n */\n\nimport type { ChatEvent } from \"../core.js\";\n\n// ─── IChatTransport Interface ──────────────────────────────────\n\n/**\n * Abstraction for delivering chat events to a client.\n * Implementations handle protocol details (SSE, WebSocket, etc.).\n */\nexport interface IChatTransport {\n /** Send a single chat event to the client */\n send(event: ChatEvent): void;\n\n /** Signal stream completion and close the connection */\n close(): void;\n\n /** Signal an error to the client */\n error(err: Error): void;\n\n /** Whether the transport is still open */\n readonly isOpen: boolean;\n}\n\n// ─── SSE Chat Transport ────────────────────────────────────────\n\n/** Writable HTTP response interface — minimal type satisfied by Express, Fastify (raw), and Node http.ServerResponse without casts. */\nexport interface WritableResponse {\n writeHead(statusCode: number, headers?: Record<string, string | string[]>): unknown;\n setHeader(name: string, value: string): unknown;\n write(chunk: string): boolean;\n end(body?: string): unknown;\n readonly writableEnded: boolean;\n}\n\n/** Minimal interface for detecting client disconnection */\nexport interface CloseDetectable {\n on(event: \"close\", listener: () => void): void;\n}\n\n/** Configuration options for SSEChatTransport */\nexport interface SSETransportOptions {\n /** Heartbeat interval in milliseconds. 0 or undefined disables heartbeat. */\n heartbeatMs?: number;\n /** Request object for detecting client disconnection (listens for 'close' event) */\n request?: CloseDetectable;\n}\n\n/**\n * Server-Sent Events transport for ChatEvent streaming.\n * Sends events as `data: JSON\\n\\n` lines with SSE headers.\n */\nexport class SSEChatTransport implements IChatTransport {\n private readonly res: WritableResponse;\n private _open: boolean;\n private _heartbeatTimer: ReturnType<typeof setInterval> | undefined;\n\n constructor(res: WritableResponse, options?: SSETransportOptions) {\n this.res = res;\n this._open = true;\n\n res.writeHead(200, {\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache\",\n \"Connection\": \"keep-alive\",\n \"X-Accel-Buffering\": \"no\",\n });\n\n // Close detection via request 'close' event\n if (options?.request) {\n options.request.on(\"close\", () => {\n this._cleanup();\n });\n }\n\n // Periodic heartbeat to keep connection alive\n const heartbeatMs = options?.heartbeatMs;\n if (heartbeatMs && heartbeatMs > 0) {\n this._heartbeatTimer = setInterval(() => {\n if (!this.isOpen) {\n this._clearHeartbeat();\n return;\n }\n this.res.write(\": heartbeat\\n\\n\");\n }, heartbeatMs);\n }\n }\n\n get isOpen(): boolean {\n return this._open && !this.res.writableEnded;\n }\n\n send(event: ChatEvent): void {\n if (!this.isOpen) return;\n this.res.write(`data: ${JSON.stringify(event)}\\n\\n`);\n }\n\n close(): void {\n if (!this.isOpen) return;\n this._open = false;\n this._clearHeartbeat();\n this.res.write(`data: [DONE]\\n\\n`);\n this.res.end();\n }\n\n error(err: Error): void {\n if (!this.isOpen) return;\n this._open = false;\n this._clearHeartbeat();\n const errorEvent: ChatEvent = {\n type: \"error\",\n error: err.message,\n recoverable: false,\n };\n this.res.write(`data: ${JSON.stringify(errorEvent)}\\n\\n`);\n this.res.end();\n }\n\n private _cleanup(): void {\n this._open = false;\n this._clearHeartbeat();\n }\n\n private _clearHeartbeat(): void {\n if (this._heartbeatTimer !== undefined) {\n clearInterval(this._heartbeatTimer);\n this._heartbeatTimer = undefined;\n }\n }\n}\n\n// ─── Helper: Stream Adapter Events to Transport ────────────────\n\n/**\n * Pipes an async iterable of ChatEvents into a transport.\n * Handles errors and ensures transport is closed on completion.\n *\n * @param events - Async iterable of ChatEvent (from adapter.streamMessage)\n * @param transport - Transport to send events through\n */\nexport async function streamToTransport(\n events: AsyncIterable<ChatEvent>,\n transport: IChatTransport,\n): Promise<void> {\n try {\n let accumulatedText = \"\";\n\n for await (const event of events) {\n if (!transport.isOpen) break;\n transport.send(event);\n\n if (event.type === \"message:delta\") {\n accumulatedText += event.text;\n }\n }\n\n if (transport.isOpen) {\n transport.send({ type: \"done\", finalOutput: accumulatedText || undefined });\n }\n transport.close();\n } catch (err) {\n transport.error(err instanceof Error ? err : new Error(String(err)));\n }\n}\n","/**\n * @witqq/agent-sdk - WebSocket Chat Transport\n *\n * IChatTransport implementation over WebSocket connections.\n * Accepts a WebSocket-like abstraction compatible with `ws`, native WebSocket, etc.\n */\n\nimport type { ChatEvent } from \"../core.js\";\nimport type { IChatTransport } from \"./transport.js\";\n\n// ─── WebSocket Abstraction ─────────────────────────────────────\n\n/** Ready states matching the WebSocket spec (ws, browser, Deno, Bun) */\nexport const WS_READY_STATE = {\n CONNECTING: 0,\n OPEN: 1,\n CLOSING: 2,\n CLOSED: 3,\n} as const;\n\n/**\n * Minimal WebSocket interface compatible with `ws`, browser WebSocket, Deno, Bun.\n * Only the methods/properties used by WsChatTransport.\n */\nexport interface WebSocketLike {\n readonly readyState: number;\n send(data: string): void;\n close(code?: number, reason?: string): void;\n addEventListener(type: \"close\", listener: () => void): void;\n addEventListener(type: \"error\", listener: (err: unknown) => void): void;\n}\n\n/** Configuration options for WsChatTransport */\nexport interface WsTransportOptions {\n /** Heartbeat interval in ms. 0 or undefined disables heartbeat. */\n heartbeatMs?: number;\n /** Custom JSON serializer (defaults to JSON.stringify) */\n serialize?: (event: ChatEvent) => string;\n}\n\n// ─── WsChatTransport ───────────────────────────────────────────\n\n/**\n * WebSocket transport for ChatEvent streaming.\n * Sends events as JSON messages over a WebSocket connection.\n */\nexport class WsChatTransport implements IChatTransport {\n private readonly ws: WebSocketLike;\n private readonly serialize: (event: ChatEvent) => string;\n private _open: boolean;\n private _heartbeatTimer: ReturnType<typeof setInterval> | undefined;\n\n constructor(ws: WebSocketLike, options?: WsTransportOptions) {\n this.ws = ws;\n this.serialize = options?.serialize ?? JSON.stringify;\n this._open = ws.readyState === WS_READY_STATE.OPEN;\n\n ws.addEventListener(\"close\", () => {\n this._cleanup();\n });\n\n ws.addEventListener(\"error\", () => {\n this._cleanup();\n });\n\n const heartbeatMs = options?.heartbeatMs;\n if (heartbeatMs && heartbeatMs > 0) {\n this._heartbeatTimer = setInterval(() => {\n if (!this.isOpen) {\n this._clearHeartbeat();\n return;\n }\n this.ws.send(this.serialize({ type: \"heartbeat\" } as ChatEvent));\n }, heartbeatMs);\n }\n }\n\n get isOpen(): boolean {\n return this._open && this.ws.readyState === WS_READY_STATE.OPEN;\n }\n\n send(event: ChatEvent): void {\n if (!this.isOpen) return;\n this.ws.send(this.serialize(event));\n }\n\n close(): void {\n if (!this.isOpen) return;\n this._open = false;\n this._clearHeartbeat();\n // Send done signal before closing\n this.ws.send(this.serialize({ type: \"done\" } as ChatEvent));\n this.ws.close(1000, \"stream complete\");\n }\n\n error(err: Error): void {\n if (!this.isOpen) return;\n this._open = false;\n this._clearHeartbeat();\n const errorEvent: ChatEvent = {\n type: \"error\",\n error: err.message,\n recoverable: false,\n };\n this.ws.send(this.serialize(errorEvent));\n this.ws.close(1011, err.message);\n }\n\n private _cleanup(): void {\n this._open = false;\n this._clearHeartbeat();\n }\n\n private _clearHeartbeat(): void {\n if (this._heartbeatTimer !== undefined) {\n clearInterval(this._heartbeatTimer);\n this._heartbeatTimer = undefined;\n }\n }\n}\n","/**\n * @witqq/agent-sdk - In-Process Chat Transport\n *\n * IChatTransport implementation for zero-network communication.\n * Events are pushed into an internal buffer and consumed via async iteration.\n * Useful for testing, embedded runtimes, CLI tools, and in-process communication.\n */\n\nimport type { ChatEvent } from \"../core.js\";\nimport type { IChatTransport } from \"./transport.js\";\n\n// ─── InProcessChatTransport ────────────────────────────────────\n\n/**\n * In-process transport for ChatEvent streaming.\n * Producer pushes events via IChatTransport.send(), consumer reads via async iteration.\n *\n * @example\n * ```ts\n * const transport = new InProcessChatTransport();\n *\n * // Consumer side (async iteration)\n * (async () => {\n * for await (const event of transport) {\n * console.log(\"Received:\", event);\n * }\n * })();\n *\n * // Producer side (via streamToTransport or manual)\n * transport.send({ type: \"message:start\", messageId, role: \"assistant\" });\n * transport.send({ type: \"message:delta\", messageId, text: \"Hello\" });\n * transport.close();\n * ```\n */\nexport class InProcessChatTransport implements IChatTransport {\n private _open: boolean = true;\n private _buffer: ChatEvent[] = [];\n private _resolve: ((value: IteratorResult<ChatEvent>) => void) | null = null;\n private _error: Error | null = null;\n\n get isOpen(): boolean {\n return this._open;\n }\n\n send(event: ChatEvent): void {\n if (!this._open) return;\n\n if (this._resolve) {\n // Consumer is waiting — deliver immediately\n const resolve = this._resolve;\n this._resolve = null;\n resolve({ value: event, done: false });\n } else {\n // Buffer for later consumption\n this._buffer.push(event);\n }\n }\n\n close(): void {\n if (!this._open) return;\n this._open = false;\n\n if (this._resolve) {\n // Consumer is waiting — signal completion\n const resolve = this._resolve;\n this._resolve = null;\n resolve({ value: undefined as unknown as ChatEvent, done: true });\n }\n }\n\n error(err: Error): void {\n if (!this._open) return;\n this._open = false;\n\n const errorEvent: ChatEvent = {\n type: \"error\",\n error: err.message,\n recoverable: false,\n };\n\n if (this._resolve) {\n // Consumer is waiting — deliver error event directly\n const resolve = this._resolve;\n this._resolve = null;\n resolve({ value: errorEvent, done: false });\n } else {\n // Buffer error event for later consumption\n this._error = err;\n }\n }\n\n // ─── AsyncIterable protocol ────────────────────────────────\n\n [Symbol.asyncIterator](): AsyncIterator<ChatEvent> {\n return {\n next: (): Promise<IteratorResult<ChatEvent>> => {\n // Deliver buffered events first\n if (this._buffer.length > 0) {\n return Promise.resolve({ value: this._buffer.shift()!, done: false });\n }\n\n // If there was an error, deliver error event then done\n if (this._error) {\n const err = this._error;\n this._error = null;\n const errorEvent: ChatEvent = {\n type: \"error\",\n error: err.message,\n recoverable: false,\n };\n return Promise.resolve({ value: errorEvent, done: false });\n }\n\n // If closed and buffer empty, we're done\n if (!this._open) {\n return Promise.resolve({ value: undefined as unknown as ChatEvent, done: true });\n }\n\n // Wait for next event\n return new Promise<IteratorResult<ChatEvent>>((resolve) => {\n this._resolve = resolve;\n });\n },\n };\n }\n}\n","/**\n * @witqq/agent-sdk/chat/events\n *\n * Type-safe event emitter, chat event bus, and middleware pipeline.\n * Generic TypedEventEmitter<EventMap> for arbitrary typed event maps.\n * ChatEventBus specializing TypedEventEmitter for ChatEvent types.\n * Middleware support for event interception, transformation, and suppression.\n * Utility functions for filtering and mapping event streams.\n */\n\nimport type { ChatEvent, ChatEventType } from \"./core.js\";\n\n// ─── EventMap constraint ──────────────────────────────────────\n\n/** Constraint for event maps: keys are strings, values are payloads */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type EventMap = Record<string, any>;\n\n// ─── Listener types ───────────────────────────────────────────\n\n/** Listener callback for a specific event */\nexport type Listener<T> = (payload: T) => void;\n\n/** Unsubscribe function returned by on/once */\nexport type Unsubscribe = () => void;\n\n// ─── TypedEventEmitter ────────────────────────────────────────\n\n/**\n * Generic type-safe event emitter parameterized by an EventMap.\n *\n * @typeParam T - Map of event names to payload types\n *\n * @example\n * ```typescript\n * type MyEvents = {\n * message: string;\n * count: number;\n * done: void;\n * };\n * const emitter = new TypedEventEmitter<MyEvents>();\n * emitter.on(\"message\", (text) => console.log(text));\n * emitter.emit(\"message\", \"hello\");\n * ```\n */\nexport class TypedEventEmitter<T extends EventMap> {\n private readonly listeners = new Map<keyof T, Set<Listener<unknown>>>();\n\n /**\n * Subscribe to an event.\n * @param event - Event name\n * @param listener - Callback receiving the event payload\n * @returns Unsubscribe function\n */\n on<K extends keyof T>(event: K, listener: Listener<T[K]>): Unsubscribe {\n let set = this.listeners.get(event);\n if (!set) {\n set = new Set();\n this.listeners.set(event, set);\n }\n const fn = listener as Listener<unknown>;\n set.add(fn);\n return () => {\n set!.delete(fn);\n if (set!.size === 0) {\n this.listeners.delete(event);\n }\n };\n }\n\n /**\n * Subscribe to an event, firing the listener at most once.\n * @param event - Event name\n * @param listener - Callback receiving the event payload\n * @returns Unsubscribe function\n */\n once<K extends keyof T>(event: K, listener: Listener<T[K]>): Unsubscribe {\n const unsub = this.on(event, (payload) => {\n unsub();\n listener(payload);\n });\n return unsub;\n }\n\n /**\n * Remove a specific listener from an event.\n * @param event - Event name\n * @param listener - The listener to remove\n */\n off<K extends keyof T>(event: K, listener: Listener<T[K]>): void {\n const set = this.listeners.get(event);\n if (!set) return;\n set.delete(listener as Listener<unknown>);\n if (set.size === 0) {\n this.listeners.delete(event);\n }\n }\n\n /**\n * Emit an event, calling all registered listeners synchronously.\n * @param event - Event name\n * @param payload - Event payload\n */\n emit<K extends keyof T>(event: K, payload: T[K]): void {\n const set = this.listeners.get(event);\n if (!set) return;\n for (const fn of [...set]) {\n fn(payload);\n }\n }\n\n /**\n * Remove all listeners for a specific event, or all events if no event specified.\n * @param event - Optional event name\n */\n removeAllListeners<K extends keyof T>(event?: K): void {\n if (event !== undefined) {\n this.listeners.delete(event);\n } else {\n this.listeners.clear();\n }\n }\n\n /**\n * Get the number of listeners for a specific event.\n * @param event - Event name\n * @returns Number of listeners\n */\n listenerCount<K extends keyof T>(event: K): number {\n const set = this.listeners.get(event);\n return set ? set.size : 0;\n }\n\n /**\n * Get all event names that have at least one listener.\n * @returns Array of event names\n */\n eventNames(): Array<keyof T> {\n return [...this.listeners.keys()];\n }\n}\n\n// ─── ChatEventMap ─────────────────────────────────────────────\n\n/**\n * Map of ChatEvent type strings to their corresponding ChatEvent payloads.\n * Used to parameterize TypedEventEmitter for chat events.\n */\nexport type ChatEventMap = {\n [K in ChatEventType]: Extract<ChatEvent, { type: K }>;\n};\n\n// ─── Middleware ────────────────────────────────────────────────\n\n/**\n * Context passed to middleware functions.\n * Contains the event and control methods for the middleware pipeline.\n */\nexport interface MiddlewareContext {\n /** The current event (may be transformed by prior middleware) */\n event: ChatEvent;\n /** Call the next middleware in the chain, or deliver to listeners if last */\n next: () => void;\n /** Suppress the event — do not deliver to listeners or subsequent middleware */\n suppress: () => void;\n}\n\n/**\n * Middleware function for intercepting, transforming, or suppressing events.\n * EventMiddleware operates at the ChatEventBus level.\n *\n * @param ctx - Middleware context with event, next(), and suppress()\n *\n * @example\n * ```typescript\n * // Logging middleware\n * const logger: EventMiddleware = (ctx) => {\n * console.log(`Event: ${ctx.event.type}`);\n * ctx.next();\n * };\n *\n * // Suppressing middleware\n * const filter: EventMiddleware = (ctx) => {\n * if (ctx.event.type === \"heartbeat\") {\n * ctx.suppress();\n * } else {\n * ctx.next();\n * }\n * };\n * ```\n */\nexport type EventMiddleware = (ctx: MiddlewareContext) => void;\n\n// ─── ChatEventBus ─────────────────────────────────────────────\n\n/**\n * Chat event bus: a typed event emitter specialized for ChatEvent types\n * with middleware pipeline support.\n *\n * Events pass through the middleware pipeline before reaching listeners.\n * Middleware can inspect, transform, or suppress events.\n *\n * @example\n * ```typescript\n * const bus = new ChatEventBus();\n *\n * // Add middleware\n * bus.use((ctx) => {\n * console.log(`[${ctx.event.type}]`);\n * ctx.next();\n * });\n *\n * // Listen for events\n * bus.on(\"message:delta\", (event) => {\n * console.log(event.text);\n * });\n *\n * // Emit events\n * bus.emit(\"message:delta\", { type: \"message:delta\", messageId: id, text: \"hi\" });\n * ```\n */\nexport class ChatEventBus extends TypedEventEmitter<ChatEventMap> {\n private readonly middlewares: EventMiddleware[] = [];\n\n /**\n * Register a middleware function. Middleware runs in registration order.\n * @param middleware - Middleware function\n * @returns Unsubscribe function to remove the middleware\n */\n use(middleware: EventMiddleware): Unsubscribe {\n this.middlewares.push(middleware);\n return () => {\n const idx = this.middlewares.indexOf(middleware);\n if (idx !== -1) {\n this.middlewares.splice(idx, 1);\n }\n };\n }\n\n /**\n * Emit a chat event through the middleware pipeline, then to listeners.\n *\n * @param event - ChatEvent type string\n * @param payload - The full ChatEvent object\n */\n override emit<K extends ChatEventType>(\n event: K,\n payload: ChatEventMap[K],\n ): void {\n if (this.middlewares.length === 0) {\n super.emit(event, payload);\n return;\n }\n\n let suppressed = false;\n let currentEvent: ChatEvent = payload;\n let index = 0;\n\n const runNext = (): void => {\n if (suppressed) return;\n\n if (index >= this.middlewares.length) {\n super.emit(\n currentEvent.type as K,\n currentEvent as ChatEventMap[K],\n );\n return;\n }\n\n const mw = this.middlewares[index++];\n const ctx: MiddlewareContext = {\n event: currentEvent,\n next: () => {\n currentEvent = ctx.event;\n runNext();\n },\n suppress: () => {\n suppressed = true;\n },\n };\n mw(ctx);\n };\n\n runNext();\n }\n\n /**\n * Replace the event in the middleware context.\n * Middleware should mutate ctx.event or create a new MiddlewareContext\n * to transform events passing through the pipeline.\n */\n\n /**\n * Remove all middleware functions.\n */\n clearMiddleware(): void {\n this.middlewares.length = 0;\n }\n\n /**\n * Get the number of registered middleware functions.\n * @returns Number of middleware\n */\n middlewareCount(): number {\n return this.middlewares.length;\n }\n}\n\n// ─── Utility: Event Filtering ─────────────────────────────────\n\n/**\n * Create a filter function that passes only events of specified types.\n *\n * @param types - Event types to allow through\n * @returns Predicate function for filtering ChatEvents\n *\n * @example\n * ```typescript\n * const isTextEvent = eventFilter(\"message:start\", \"message:delta\", \"message:complete\");\n * const textEvents = allEvents.filter(isTextEvent);\n * ```\n */\nexport function eventFilter(\n ...types: ChatEventType[]\n): (event: ChatEvent) => boolean {\n const allowed = new Set<string>(types);\n return (event: ChatEvent) => allowed.has(event.type);\n}\n\n/**\n * Filter an async iterable of ChatEvents to only specified types.\n *\n * @param source - Async iterable of ChatEvents\n * @param types - Event types to keep\n * @returns Async iterable of filtered ChatEvents\n *\n * @example\n * ```typescript\n * for await (const event of filterEvents(stream, \"message:delta\", \"message:complete\")) {\n * // only message:delta and message:complete events\n * }\n * ```\n */\nexport async function* filterEvents(\n source: AsyncIterable<ChatEvent>,\n ...types: ChatEventType[]\n): AsyncIterable<ChatEvent> {\n const pred = eventFilter(...types);\n for await (const event of source) {\n if (pred(event)) {\n yield event;\n }\n }\n}\n\n// ─── Utility: Event Mapping ───────────────────────────────────\n\n/**\n * Map/transform events from an async iterable.\n *\n * @param source - Async iterable of ChatEvents\n * @param transform - Function to transform each event (return null to skip)\n * @returns Async iterable of transformed values\n *\n * @example\n * ```typescript\n * // Extract text from message:delta events\n * const texts = mapEvents(stream, (event) =>\n * event.type === \"message:delta\" ? event.text : null\n * );\n * ```\n */\nexport async function* mapEvents<R>(\n source: AsyncIterable<ChatEvent>,\n transform: (event: ChatEvent) => R | null,\n): AsyncIterable<R> {\n for await (const event of source) {\n const result = transform(event);\n if (result !== null) {\n yield result;\n }\n }\n}\n\n/**\n * Collect text from message:delta events into a single string.\n *\n * @param source - Async iterable of ChatEvents\n * @returns Complete text assembled from message:delta payloads\n *\n * @example\n * ```typescript\n * const fullText = await collectText(stream);\n * ```\n */\nexport async function collectText(\n source: AsyncIterable<ChatEvent>,\n): Promise<string> {\n const parts: string[] = [];\n for await (const event of source) {\n if (event.type === \"message:delta\") {\n parts.push(event.text);\n }\n }\n return parts.join(\"\");\n}\n"]}
1
+ {"version":3,"sources":["../../src/types/errors.ts","../../src/errors.ts","../../src/types/guards.ts","../../src/types/index.ts","../../src/types.ts","../../src/base-agent.ts","../../src/utils/schema.ts","../../src/backends/shared.ts","../../src/backends/copilot.ts","../../src/backends/claude.ts","../../src/backends/vercel-ai.ts","../../src/chat/types.ts","../../src/chat/chat-utils.ts","../../src/chat/guards.ts","../../src/chat/bridge.ts","../../src/chat/conversion.ts","../../src/chat/context.ts","../../src/chat/errors.ts","../../src/chat/state.ts","../../src/chat/accumulator.ts","../../src/chat/watchdog.ts","../../src/chat/listener-set.ts","../../src/chat/runtime.ts","../../src/chat/storage.ts","../../src/chat/sessions.ts","../../src/chat/backends/types.ts","../../src/chat/backends/base.ts","../../src/chat/backends/resumable.ts","../../src/chat/backends/copilot.ts","../../src/chat/backends/claude.ts","../../src/chat/backends/vercel-ai.ts","../../src/backends/mock-llm.ts","../../src/chat/backends/mock-llm.ts","../../src/chat/backends/transport.ts","../../src/chat/backends/ws-transport.ts","../../src/chat/backends/in-process-transport.ts","../../src/chat/events.ts"],"names":["ErrorCode","init_errors","init_types","delay","text","session","_injectSDK","_resetSDK","loadSDK","_sdkMock","opts","mapToolsToSDK","result","createCopilotService","createClaudeService","createVercelAIService"],"mappings":"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","file":"index.js","sourcesContent":["// ─── Unified Error Code Enum ───────────────────────────────────\n\n/** Unified error codes for all SDK errors — single source of truth. */\nexport enum ErrorCode {\n // Auth\n AUTH_EXPIRED = \"AUTH_EXPIRED\",\n AUTH_INVALID = \"AUTH_INVALID\",\n\n // Rate limiting\n RATE_LIMIT = \"RATE_LIMIT\",\n\n // Network\n NETWORK = \"NETWORK\",\n TIMEOUT = \"TIMEOUT\",\n\n // Provider\n PROVIDER_ERROR = \"PROVIDER_ERROR\",\n MODEL_NOT_FOUND = \"MODEL_NOT_FOUND\",\n MODEL_OVERLOADED = \"MODEL_OVERLOADED\",\n CONTEXT_OVERFLOW = \"CONTEXT_OVERFLOW\",\n\n // Input / Response\n INVALID_INPUT = \"INVALID_INPUT\",\n INVALID_RESPONSE = \"INVALID_RESPONSE\",\n\n // SDK internal\n REENTRANCY = \"REENTRANCY\",\n DISPOSED = \"DISPOSED\",\n ABORTED = \"ABORTED\",\n INVALID_TRANSITION = \"INVALID_TRANSITION\",\n DEPENDENCY_MISSING = \"DEPENDENCY_MISSING\",\n BACKEND_NOT_INSTALLED = \"BACKEND_NOT_INSTALLED\",\n\n // Tool\n TOOL_EXECUTION = \"TOOL_EXECUTION\",\n PERMISSION_DENIED = \"PERMISSION_DENIED\",\n\n // Session\n SESSION_NOT_FOUND = \"SESSION_NOT_FOUND\",\n SESSION_EXPIRED = \"SESSION_EXPIRED\",\n\n // Provider resolution\n PROVIDER_NOT_FOUND = \"PROVIDER_NOT_FOUND\",\n AUTH_REQUIRED = \"AUTH_REQUIRED\",\n\n // Storage (generic)\n STORAGE_ERROR = \"STORAGE_ERROR\",\n // Storage (specific)\n STORAGE_NOT_FOUND = \"STORAGE_NOT_FOUND\",\n STORAGE_DUPLICATE_KEY = \"STORAGE_DUPLICATE_KEY\",\n STORAGE_IO_ERROR = \"STORAGE_IO_ERROR\",\n STORAGE_SERIALIZATION_ERROR = \"STORAGE_SERIALIZATION_ERROR\",\n}\n\n// ─── Classification ────────────────────────────────────────────\n\n/** Error codes that are typically recoverable (retry-safe) */\nconst RECOVERABLE_CODES = new Set<ErrorCode>([\n ErrorCode.TIMEOUT,\n ErrorCode.RATE_LIMIT,\n ErrorCode.NETWORK,\n ErrorCode.TOOL_EXECUTION,\n ErrorCode.MODEL_OVERLOADED,\n ErrorCode.PROVIDER_ERROR,\n]);\n\n/** Check if an error code is recoverable */\nexport function isRecoverableErrorCode(code: ErrorCode): boolean {\n return RECOVERABLE_CODES.has(code);\n}\n\n/** Classify an error message string into an ErrorCode */\nexport function classifyAgentError(error: string | Error): ErrorCode {\n const msg = (error instanceof Error ? error.message : error).toLowerCase();\n\n if (msg.includes(\"timeout\") || msg.includes(\"timed out\") || msg.includes(\"timedout\") || msg.includes(\"etimedout\")) {\n return ErrorCode.TIMEOUT;\n }\n\n if (msg.includes(\"rate limit\") || msg.includes(\"rate_limit\") || msg.includes(\"429\") || msg.includes(\"too many requests\")) {\n return ErrorCode.RATE_LIMIT;\n }\n\n if (msg.includes(\"unauthorized\") || msg.includes(\"401\") || msg.includes(\"auth\") && (msg.includes(\"expired\") || msg.includes(\"invalid\") || msg.includes(\"denied\") || msg.includes(\"failed\"))) {\n return ErrorCode.AUTH_EXPIRED;\n }\n\n if (msg.includes(\"econnrefused\") || msg.includes(\"econnreset\") || msg.includes(\"enotfound\") || msg.includes(\"network\") || msg.includes(\"fetch failed\") || msg.includes(\"socket hang up\")) {\n return ErrorCode.NETWORK;\n }\n\n if (msg.includes(\"subprocess\") || msg.includes(\"process exited\") || msg.includes(\"spawn\") || msg.includes(\"enoent\") || msg.includes(\"killed\")) {\n return ErrorCode.DEPENDENCY_MISSING;\n }\n\n if (msg.includes(\"abort\") || msg.includes(\"cancel\")) {\n return ErrorCode.ABORTED;\n }\n\n if (msg.includes(\"500\") || msg.includes(\"502\") || msg.includes(\"503\") || msg.includes(\"internal server error\") || msg.includes(\"service unavailable\") || msg.includes(\"bad gateway\") || msg.includes(\"overloaded\")) {\n return ErrorCode.PROVIDER_ERROR;\n }\n\n return ErrorCode.PROVIDER_ERROR;\n}\n","import { ErrorCode } from \"./types/errors.js\";\n\n/** Options for constructing an AgentSDKError */\nexport interface AgentSDKErrorOptions extends ErrorOptions {\n /** Machine-readable error code */\n code?: string;\n /** Whether this error is retryable (default: false) */\n retryable?: boolean;\n /** HTTP status code hint (e.g. 401, 429, 500) */\n httpStatus?: number;\n}\n\n/** Base error class for agent-sdk.\n *\n * Use `AgentSDKError.is(err)` for reliable cross-module `instanceof` checks\n * (works across separately bundled entry points where `instanceof` may fail). */\nexport class AgentSDKError extends Error {\n /** @internal Marker for cross-bundle identity checks */\n readonly _agentSDKError = true as const;\n /** Machine-readable error code. Prefer values from the ErrorCode enum. */\n readonly code?: string;\n /** Whether this error is safe to retry */\n readonly retryable: boolean;\n /** HTTP status code hint for error classification */\n readonly httpStatus?: number;\n\n constructor(message: string, options?: AgentSDKErrorOptions) {\n super(message, options);\n this.name = \"AgentSDKError\";\n this.code = options?.code;\n this.retryable = options?.retryable ?? false;\n this.httpStatus = options?.httpStatus;\n }\n\n /** Check if an error is an AgentSDKError (works across bundled copies) */\n static is(error: unknown): error is AgentSDKError {\n return (\n error instanceof Error &&\n \"_agentSDKError\" in error &&\n (error as AgentSDKError)._agentSDKError === true\n );\n }\n}\n\n/** Thrown when agent.run() is called while already running (M8 re-entrancy guard) */\nexport class ReentrancyError extends AgentSDKError {\n constructor() {\n super(\"Agent is already running. Await the current run before starting another.\", {\n code: ErrorCode.REENTRANCY,\n });\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 code: ErrorCode.DISPOSED,\n });\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 { code: ErrorCode.BACKEND_NOT_INSTALLED },\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, code: ErrorCode.DEPENDENCY_MISSING });\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 code: ErrorCode.DEPENDENCY_MISSING,\n });\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.\", { code: ErrorCode.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, code: ErrorCode.TOOL_EXECUTION });\n this.name = \"ToolExecutionError\";\n this.toolName = toolName;\n }\n}\n\n/** Thrown when a stream has no activity within the configured timeout */\nexport class ActivityTimeoutError extends AgentSDKError {\n constructor(timeoutMs: number) {\n super(`Stream activity timeout: no event received within ${timeoutMs}ms.`, {\n code: ErrorCode.TIMEOUT,\n retryable: true,\n });\n this.name = \"ActivityTimeoutError\";\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, code: ErrorCode.INVALID_RESPONSE });\n this.name = \"StructuredOutputError\";\n }\n}\n","import type { ToolDeclaration, ToolDefinition } from \"./tools.js\";\nimport type { MessageContent, ContentPart } from \"./messages.js\";\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","// ─── Barrel re-export ───────────────────────────────────────────\n\nexport type { JSONValue } from \"./json.js\";\n\nexport type {\n ToolDeclaration,\n ToolDefinition,\n ToolDefinitionLike,\n ToolContext,\n ToolCall,\n ToolResult,\n} from \"./tools.js\";\n\nexport type {\n MessageContent,\n ContentPart,\n Message,\n} from \"./messages.js\";\n\nexport type {\n PermissionScope,\n PermissionRequest,\n PermissionDecision,\n PermissionCallback,\n UserInputRequest,\n UserInputResponse,\n SupervisorHooks,\n} from \"./permissions.js\";\n\nexport type {\n ModelInfo,\n ModelParams,\n ValidationResult,\n} from \"./models.js\";\n\nexport {\n ErrorCode,\n isRecoverableErrorCode,\n classifyAgentError,\n} from \"./errors.js\";\n\nexport type {\n UsageData,\n AgentEvent,\n StreamContext,\n StreamMiddleware,\n} from \"./events.js\";\n\nexport type {\n CallOptions,\n RetryConfig,\n StructuredOutputConfig,\n RunOptions,\n TimeoutConfig,\n ErrorHandlingConfig,\n AgentConfig,\n CallDefaults,\n FullAgentConfig,\n AgentResult,\n AgentState,\n IAgent,\n IAgentService,\n AgentServiceLike,\n} from \"./agent.js\";\n\nexport type {\n CopilotBackendOptions,\n ClaudeBackendOptions,\n MockLLMBackendOptions,\n MockLLMResponseMode,\n MockLLMLatency,\n MockLLMStreamingOptions,\n MockLLMPermissionOptions,\n MockLLMToolCall,\n VercelAIBackendOptions,\n} from \"./backends.js\";\n\nexport {\n isToolDefinition,\n isTextContent,\n isMultiPartContent,\n getTextContent,\n} from \"./guards.js\";\n","// Barrel re-export from split type modules.\n// All existing imports from \"./types.js\" continue to work unchanged.\nexport * from \"./types/index.js\";\n","import type {\n IAgent,\n FullAgentConfig,\n AgentState,\n AgentResult,\n AgentEvent,\n MessageContent,\n Message,\n RunOptions,\n RetryConfig,\n StructuredOutputConfig,\n UsageData,\n ToolDefinition,\n StreamMiddleware,\n StreamContext,\n} from \"./types.js\";\nimport { ReentrancyError, DisposedError, AbortError, ActivityTimeoutError } from \"./errors.js\";\nimport { AgentSDKError } from \"./errors.js\";\nimport { isRecoverableErrorCode } from \"./types/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: FullAgentConfig;\n private _cleanupExternalSignal: (() => void) | null = null;\n private _streamMiddleware: StreamMiddleware[] = [];\n\n /** Backend identifier (e.g. \"copilot\", \"claude\", \"vercel-ai\") */\n protected abstract readonly backendName: string;\n\n /** CLI session ID for persistent mode. Override in backends that support it. */\n get sessionId(): string | undefined {\n return undefined;\n }\n\n constructor(config: FullAgentConfig) {\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.withRetry(\n () => this.executeRun(messages, options, ac.signal), options,\n );\n this.enrichAndNotifyUsage(result, options);\n return result;\n } finally {\n this.cleanupRun();\n }\n }\n\n async runWithContext(\n messages: Message[],\n options: RunOptions,\n ): Promise<AgentResult> {\n this.guardReentrancy();\n this.guardDisposed();\n\n const ac = this.createAbortController(options?.signal);\n this.state = \"running\";\n\n try {\n const result = await this.withRetry(\n () => this.executeRun(messages, options, ac.signal), options,\n );\n this.enrichAndNotifyUsage(result, options);\n return result;\n } finally {\n this.cleanupRun();\n }\n }\n\n async runStructured<T>(\n prompt: MessageContent,\n schema: StructuredOutputConfig<T>,\n options: RunOptions,\n ): Promise<AgentResult<T>> {\n this.guardReentrancy();\n this.guardDisposed();\n\n const ac = this.createAbortController(options?.signal);\n this.state = \"running\";\n\n try {\n const messages: Message[] = [{ role: \"user\", content: prompt }];\n const result = await this.withRetry(\n () => this.executeRunStructured(messages, schema, options, ac.signal), options,\n );\n this.enrichAndNotifyUsage(result, options);\n return result;\n } finally {\n this.cleanupRun();\n }\n }\n\n async *stream(\n prompt: MessageContent,\n options: RunOptions,\n ): AsyncIterable<AgentEvent> {\n this.guardReentrancy();\n this.guardDisposed();\n\n const ac = this.createAbortController(options?.signal);\n this.state = \"streaming\";\n\n try {\n const messages: Message[] = [{ role: \"user\", content: prompt }];\n yield* this.streamWithRetry(\n () => this.applyStreamPipeline(this.executeStream(messages, options, ac.signal), options, ac),\n options,\n );\n } finally {\n this.cleanupRun();\n }\n }\n\n async *streamWithContext(\n messages: Message[],\n options: RunOptions,\n ): AsyncIterable<AgentEvent> {\n this.guardReentrancy();\n this.guardDisposed();\n\n const ac = this.createAbortController(options?.signal);\n this.state = \"streaming\";\n\n try {\n yield* this.streamWithRetry(\n () => this.applyStreamPipeline(this.executeStream(messages, options, ac.signal), options, ac),\n options,\n );\n } finally {\n this.cleanupRun();\n }\n }\n\n /** Register a stream middleware. Applied in registration order after built-in transforms. */\n addStreamMiddleware(middleware: StreamMiddleware): void {\n this.guardDisposed();\n this._streamMiddleware.push(middleware);\n }\n\n /** Apply built-in transforms (enrich→timeout→heartbeat) then custom middleware */\n private async *applyStreamPipeline(\n source: AsyncIterable<AgentEvent>,\n options: RunOptions,\n ac: AbortController,\n ): AsyncIterable<AgentEvent> {\n // Built-in pipeline\n let stream: AsyncIterable<AgentEvent> = this.enrichStream(source, options);\n stream = this.activityTimeoutStream(stream, options?.activityTimeoutMs, ac);\n stream = this.heartbeatStream(stream);\n\n // Custom middleware\n if (this._streamMiddleware.length > 0) {\n const ctx: StreamContext = {\n model: options.model,\n backend: this.backendName,\n abortController: ac,\n config: Object.freeze({ ...this.config }),\n };\n for (const mw of this._streamMiddleware) {\n stream = mw(stream, ctx);\n }\n }\n\n yield* stream;\n }\n\n abort(): void {\n if (this.abortController) {\n this.abortController.abort();\n }\n }\n\n /** Default interrupt — falls back to abort(). Backends may override with graceful shutdown. */\n async interrupt(): Promise<void> {\n this.abort();\n }\n\n getState(): AgentState {\n return this.state;\n }\n\n getConfig(): Readonly<FullAgentConfig> {\n return this.config;\n }\n\n /** Mark agent as disposed. Override to add cleanup. */\n dispose(): void {\n this._cleanupExternalSignal?.();\n this._cleanupExternalSignal = null;\n this.abort();\n this.state = \"disposed\";\n }\n\n // ─── Abstract Methods (implemented by backends) ───────────────\n\n /** Execute a blocking run. Backend implements the actual LLM call. */\n protected abstract executeRun(\n messages: Message[],\n options: RunOptions,\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,\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,\n signal: AbortSignal,\n ): AsyncIterable<AgentEvent>;\n\n // ─── Retry Logic ─────────────────────────────────────────────\n\n /** Check if an error should be retried given the retry configuration. */\n private isRetryableError(error: unknown, retry: RetryConfig): boolean {\n // Abort and reentrancy errors are never retryable\n if (error instanceof AbortError || error instanceof ReentrancyError || error instanceof DisposedError) {\n return false;\n }\n if (AgentSDKError.is(error)) {\n // If specific retryable error codes configured, check against them\n if (retry.retryableErrors && retry.retryableErrors.length > 0 && error.code) {\n return retry.retryableErrors.includes(error.code as typeof retry.retryableErrors[number]);\n }\n // Otherwise check the retryable flag or recoverable code\n if (error.retryable) return true;\n if (error.code) return isRecoverableErrorCode(error.code as Parameters<typeof isRecoverableErrorCode>[0]);\n }\n return false;\n }\n\n /** Execute a function with retry logic per RetryConfig. */\n private async withRetry<T>(\n fn: () => Promise<T>,\n options: RunOptions,\n ): Promise<T> {\n const retry = options?.retry;\n if (!retry || !retry.maxRetries || retry.maxRetries <= 0) {\n return fn();\n }\n\n const maxRetries = retry.maxRetries;\n const initialDelay = retry.initialDelayMs ?? 1000;\n const multiplier = retry.backoffMultiplier ?? 2;\n let lastError: unknown;\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n try {\n return await fn();\n } catch (err) {\n lastError = err;\n if (attempt >= maxRetries || !this.isRetryableError(err, retry)) {\n throw err;\n }\n // Exponential backoff\n const delay = initialDelay * Math.pow(multiplier, attempt);\n await new Promise((resolve) => setTimeout(resolve, delay));\n // Check abort between retries\n if (options?.signal?.aborted || this.abortController?.signal.aborted) {\n throw err;\n }\n }\n }\n throw lastError;\n }\n\n /** Execute a stream factory with pre-stream retry: retries until first event, then committed. */\n private async *streamWithRetry(\n factory: () => AsyncIterable<AgentEvent>,\n options: RunOptions,\n ): AsyncIterable<AgentEvent> {\n const retry = options?.retry;\n if (!retry || !retry.maxRetries || retry.maxRetries <= 0) {\n yield* factory();\n return;\n }\n\n const maxRetries = retry.maxRetries;\n const initialDelay = retry.initialDelayMs ?? 1000;\n const multiplier = retry.backoffMultiplier ?? 2;\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n try {\n const stream = factory();\n const iterator = stream[Symbol.asyncIterator]();\n // Try to get first event — this is the \"pre-stream\" phase\n const first = await iterator.next();\n if (first.done) return;\n // First event received — stream committed, no more retries\n yield first.value;\n // Yield remaining events\n while (true) {\n const next = await iterator.next();\n if (next.done) break;\n yield next.value;\n }\n return;\n } catch (err) {\n if (attempt >= maxRetries || !this.isRetryableError(err, retry)) {\n throw err;\n }\n const delay = initialDelay * Math.pow(multiplier, attempt);\n await new Promise((resolve) => setTimeout(resolve, delay));\n if (options?.signal?.aborted || this.abortController?.signal.aborted) {\n throw err;\n }\n }\n }\n }\n\n // ─── CallOptions Resolution ──────────────────────────────────\n\n /** Resolve tools to use for this call (per-call override > config default) */\n protected resolveTools(options?: RunOptions): ToolDefinition[] {\n return options?.tools ?? this.config.tools ?? [];\n }\n\n // ─── Usage Enrichment ───────────────────────────────────────────\n\n /** Enrich result usage with model/backend and fire onUsage callback */\n private enrichAndNotifyUsage(result: AgentResult<unknown>, options: RunOptions): void {\n if (result.usage) {\n result.usage = {\n ...result.usage,\n model: options.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 options: RunOptions,\n ): AsyncIterable<AgentEvent> {\n const model = options.model;\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,\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 // ─── Activity Timeout ────────────────────────────────────────\n\n /** Wrap a stream to abort on inactivity. Resets timer on every event.\n * When timeoutMs is not set, passes through directly. */\n private async *activityTimeoutStream(\n source: AsyncIterable<AgentEvent>,\n timeoutMs: number | undefined,\n ac: AbortController,\n ): AsyncIterable<AgentEvent> {\n if (!timeoutMs || timeoutMs <= 0) {\n yield* source;\n return;\n }\n\n const iterator = source[Symbol.asyncIterator]();\n let timerId: ReturnType<typeof setTimeout> | undefined;\n try {\n while (true) {\n const timeoutPromise = new Promise<never>((_, reject) => {\n timerId = setTimeout(() => reject(new ActivityTimeoutError(timeoutMs)), timeoutMs);\n });\n const result = await Promise.race([iterator.next(), timeoutPromise]);\n clearTimeout(timerId);\n if (result.done) break;\n yield result.value;\n }\n } catch (err) {\n if (err instanceof ActivityTimeoutError) {\n ac.abort(err);\n }\n throw err;\n } finally {\n clearTimeout(timerId);\n }\n }\n\n // ─── Guards ───────────────────────────────────────────────────\n\n protected guardReentrancy(): void {\n if (this.state === \"running\" || this.state === \"streaming\") {\n throw new ReentrancyError();\n }\n }\n\n protected guardDisposed(): void {\n if (this.state === \"disposed\") {\n throw new DisposedError(\"Agent\");\n }\n }\n\n /** Throw AbortError if signal is already aborted */\n protected checkAbort(signal: AbortSignal): void {\n if (signal.aborted) {\n throw new AbortError();\n }\n }\n\n // ─── Internal Helpers ─────────────────────────────────────────\n\n /** Clean up after a run completes (success, error, or abort). */\n private cleanupRun(): void {\n this._cleanupExternalSignal?.();\n this._cleanupExternalSignal = null;\n this.state = \"idle\";\n this.abortController = null;\n }\n\n private createAbortController(externalSignal?: AbortSignal): AbortController {\n const ac = new AbortController();\n this.abortController = ac;\n this._cleanupExternalSignal = null;\n\n if (externalSignal) {\n if (externalSignal.aborted) {\n ac.abort();\n } else {\n const listener = () => ac.abort();\n externalSignal.addEventListener(\"abort\", listener, { once: true });\n this._cleanupExternalSignal = () => externalSignal.removeEventListener(\"abort\", listener);\n }\n }\n\n return ac;\n }\n}\n","import type { z } from \"zod\";\n\n/** Convert a Zod schema to JSON Schema.\n * Detection order: toJSONSchema() (Zod v4) → jsonSchema() (Zod v3.24+) → _def extraction (Zod v3 legacy). */\nexport function zodToJsonSchema(schema: z.ZodType): Record<string, unknown> {\n const schemaAny = schema as unknown as Record<string, unknown>;\n\n // Zod v4: toJSONSchema()\n if (\"toJSONSchema\" in schema && typeof schemaAny.toJSONSchema === \"function\") {\n return (schemaAny.toJSONSchema as () => Record<string, unknown>)();\n }\n\n // Zod v3.24+: jsonSchema()\n if (\"jsonSchema\" in schema && typeof schemaAny.jsonSchema === \"function\") {\n return (schemaAny.jsonSchema as () => Record<string, unknown>)();\n }\n\n // Zod v3 legacy: _def.typeName extraction\n return extractSchemaFromDef(schema);\n}\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\nfunction extractSchemaFromDef(schema: z.ZodType): Record<string, unknown> {\n const def = (schema as unknown as { _def: Record<string, any> })._def;\n const typeName = def.typeName as string;\n\n switch (typeName) {\n case \"ZodString\":\n return { type: \"string\" };\n case \"ZodNumber\":\n return { type: \"number\" };\n case \"ZodBoolean\":\n return { type: \"boolean\" };\n case \"ZodNull\":\n return { type: \"null\" };\n case \"ZodArray\":\n return {\n type: \"array\",\n items: extractSchemaFromDef(def.type as z.ZodType),\n };\n case \"ZodObject\": {\n const shape = (schema as unknown as { shape: Record<string, z.ZodType> }).shape;\n const properties: Record<string, unknown> = {};\n const required: string[] = [];\n\n for (const [key, value] of Object.entries(shape)) {\n const valueDef = (value as unknown as { _def: Record<string, any> })._def;\n if (valueDef.typeName === \"ZodOptional\") {\n properties[key] = extractSchemaFromDef(valueDef.innerType as z.ZodType);\n } else {\n properties[key] = extractSchemaFromDef(value);\n required.push(key);\n }\n }\n\n return {\n type: \"object\",\n properties,\n ...(required.length > 0 ? { required } : {}),\n };\n }\n case \"ZodOptional\":\n return extractSchemaFromDef(def.innerType as z.ZodType);\n case \"ZodEnum\":\n return { type: \"string\", enum: def.values as string[] };\n default:\n return {};\n }\n}\n/* eslint-enable @typescript-eslint/no-explicit-any */\n","/**\n * Shared utilities for CLI backends (Copilot, Claude).\n * Extracted to avoid duplication between copilot.ts and claude.ts.\n */\nimport type { Message, JSONValue } from \"../types.js\";\nimport { getTextContent } from \"../types.js\";\n\n/** Extract the last user message as plain text */\nexport function 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\nfunction serializeToolCall(tc: { name: string; args: JSONValue }): string {\n const args = typeof tc.args === \"string\" ? tc.args : JSON.stringify(tc.args);\n return ` Tool call: ${tc.name}(${args})`;\n}\n\nfunction serializeToolResult(tr: { name: string; result: JSONValue; isError?: boolean }): string {\n const result = typeof tr.result === \"string\" ? tr.result : JSON.stringify(tr.result);\n const prefix = tr.isError ? \"[ERROR] \" : \"\";\n return ` ${tr.name} → ${prefix}${result}`;\n}\n\n/** Build prompt with conversation history for CLI backends that create fresh sessions */\nexport function buildContextualPrompt(messages: Message[]): string {\n if (messages.length <= 1) {\n return extractLastUserPrompt(messages);\n }\n\n const history = messages.slice(0, -1).map((msg) => {\n if (msg.role === \"user\") {\n return `User: ${msg.content ? getTextContent(msg.content) : \"\"}`;\n }\n if (msg.role === \"tool\" && msg.toolResults) {\n const results = msg.toolResults.map(serializeToolResult).join(\"\\n\");\n return `Tool results:\\n${results}`;\n }\n if (msg.role === \"assistant\") {\n const parts: string[] = [];\n const thinking = msg.thinking;\n if (thinking) {\n parts.push(`[reasoning: ${thinking}]`);\n }\n const text = msg.content ? getTextContent(msg.content) : \"\";\n if (text) parts.push(text);\n if (msg.toolCalls && msg.toolCalls.length > 0) {\n parts.push(msg.toolCalls.map(serializeToolCall).join(\"\\n\"));\n }\n return `Assistant: ${parts.join(\"\\n\")}`;\n }\n const text = msg.content ? getTextContent(msg.content) : \"\";\n return `${msg.role}: ${text}`;\n }).join(\"\\n\");\n\n const lastPrompt = extractLastUserPrompt(messages);\n\n return `Conversation history:\\n${history}\\n\\nUser: ${lastPrompt}`;\n}\n","import type { z } from \"zod\";\nimport type {\n IAgent,\n IAgentService,\n FullAgentConfig,\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, classifyAgentError, isRecoverableErrorCode } from \"../types.js\";\nimport { BaseAgent } from \"../base-agent.js\";\nimport { DisposedError, SubprocessError, AbortError } from \"../errors.js\";\nimport { zodToJsonSchema } from \"../utils/schema.js\";\nimport { extractLastUserPrompt, buildContextualPrompt } from \"./shared.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 env?: Record<string, string | undefined>;\n}\n\n/** @internal */\ninterface SDKTool {\n name: string;\n description?: string;\n parameters?: z.ZodType | 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 capabilities?: {\n limits?: {\n max_context_window_tokens?: number;\n max_prompt_tokens?: number;\n };\n };\n}\n\n/** @internal */\ninterface SDKClient {\n start(): Promise<void>;\n stop(): Promise<Error[]>;\n getState(): string;\n createSession(config?: SDKSessionConfig): Promise<SDKSession>;\n resumeSession(sessionId: string, config?: SDKSessionConfig): Promise<SDKSession>;\n listModels(): Promise<SDKModelInfo[]>;\n getAuthStatus(): Promise<{ isAuthenticated: boolean }>;\n}\n\n// ─── Dynamic SDK Loader ─────────────────────────────────────────\n\ntype CopilotSDKModule = {\n CopilotClient: new (options?: SDKClientOptions) => SDKClient;\n};\n\n/** Module-level mock set by _injectSDK() for testing */\nlet _sdkMock: CopilotSDKModule | null = null;\n\n/** Load the Copilot SDK. Checks module-level mock first, then dynamic import. */\nasync function loadSDK(): Promise<CopilotSDKModule> {\n if (_sdkMock) return _sdkMock;\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 return (await import(\"@github/copilot-sdk\")) as any;\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: CopilotSDKModule | null,\n): void {\n _sdkMock = mock;\n}\n\n/** @internal For testing: reset injected SDK */\nexport function _resetSDK(): void {\n _sdkMock = 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: convertParameters(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/** Convert Zod schema or JSON Schema to JSON Schema object.\n * Zod schemas are converted via zodToJsonSchema; plain objects pass through. */\nfunction convertParameters(params: unknown): z.ZodType | Record<string, unknown> | undefined {\n if (!params) return undefined;\n if (params && typeof params === \"object\" && \"_def\" in (params as Record<string, unknown>)) {\n return zodToJsonSchema(params as Parameters<typeof zodToJsonSchema>[0]);\n }\n return params as Record<string, unknown>;\n}\n\n// ─── Permission Mapping ─────────────────────────────────────────\n\nfunction buildPermissionHandler(\n config: FullAgentConfig,\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 toolCallId: request.toolCallId,\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: FullAgentConfig,\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 private completed = false;\n\n isActive(): boolean {\n return this.active;\n }\n\n /** Returns true if thinking already completed (should ignore further reasoning events). */\n isCompleted(): boolean {\n return this.completed;\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 this.completed = true;\n return true;\n }\n\n /** Reset for next turn (e.g. after done event). */\n reset(): void {\n this.active = false;\n this.completed = false;\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 // Skip duplicate reasoning events — SDK replays full reasoning after response\n if (thinkingTracker.isCompleted()) return null;\n\n const events: AgentEvent[] = [];\n if (!thinkingTracker.isActive()) {\n thinkingTracker.startThinking();\n events.push({ type: \"thinking_start\" });\n }\n const reasoningText = String(data.deltaContent ?? data.content ?? \"\");\n if (reasoningText) {\n events.push({ type: \"thinking_delta\", text: reasoningText });\n }\n return events.length === 1 ? events[0] : events.length > 1 ? events : null;\n }\n\n case \"tool.execution_start\": {\n const toolCallId = String(data.toolCallId ?? \"\");\n const toolName = String(data.toolName ?? \"unknown\");\n let args: JSONValue = {};\n if (typeof data.arguments === \"string\") {\n try { args = JSON.parse(data.arguments); } catch { args = data.arguments as JSONValue; }\n } else if (data.arguments != null) {\n args = data.arguments as JSONValue;\n }\n tracker.trackStart(toolCallId, toolName, args);\n const toolStartEvent: AgentEvent = { type: \"tool_call_start\", toolCallId, toolName, args };\n const events: AgentEvent[] = [];\n if (thinkingTracker.endThinking()) {\n events.push({ type: \"thinking_end\" });\n }\n // Reset completed flag so next turn's thinking is captured\n thinkingTracker.reset();\n events.push(toolStartEvent);\n return events.length === 1 ? events[0] : events;\n }\n\n case \"tool.execution_complete\": {\n const toolCallId = String(data.toolCallId ?? \"\");\n const info = tracker.getInfo(toolCallId);\n const rawResult = data.result as Record<string, unknown> | JSONValue | undefined;\n // Copilot SDK wraps result in { content: ... } — unwrap if present\n const result = (rawResult && typeof rawResult === \"object\" && \"content\" in rawResult\n ? rawResult.content\n : rawResult) as JSONValue ?? null;\n return {\n type: \"tool_call_end\",\n toolCallId,\n toolName: info?.toolName ?? \"unknown\",\n result,\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 console.error(\"[copilot] mapSessionEvent error:\", JSON.stringify(data));\n {\n const errorMsg = String(data.message ?? \"Unknown error\");\n const code = classifyAgentError(errorMsg);\n return {\n type: \"error\",\n error: errorMsg,\n recoverable: isRecoverableErrorCode(code),\n code,\n };\n }\n\n case \"assistant.message\": {\n // Text was already streamed via text_delta events — suppress finalOutput to avoid duplication\n const doneEvent: AgentEvent = {\n type: \"done\",\n finalOutput: null,\n streamed: true,\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 sdkTools: SDKTool[];\n private readonly sessionConfig: Omit<SDKSessionConfig, \"streaming\"> & { tools?: SDKTool[] };\n private readonly sendAndWaitTimeout: number | undefined;\n private readonly isPersistent: boolean;\n private persistentSession: SDKSession | null = null;\n private _sessionId: string | undefined;\n private _persistentModel: string | undefined;\n private activeSession: SDKSession | null = null;\n private _resumeSessionId: string | undefined;\n private _toolsReady: Promise<void> | null = null;\n\n constructor(\n config: FullAgentConfig,\n getClient: () => Promise<SDKClient>,\n sendAndWaitTimeout?: number,\n resumeSessionId?: string,\n ) {\n super(config);\n this.getClient = getClient;\n this.sendAndWaitTimeout = sendAndWaitTimeout;\n this.isPersistent = config.sessionMode === \"persistent\";\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 // Start async Zod converter loading — remaps tools with proper JSON Schema before first session\n this._toolsReady = this._initToolsAsync(config);\n // Store resume session ID from stored identifier for session recovery after server restart\n this._resumeSessionId = resumeSessionId;\n }\n\n /** Pre-convert Zod schemas to JSON Schema.\n * Updates sdkTools and sessionConfig.tools before first session creation. */\n private async _initToolsAsync(config: FullAgentConfig): Promise<void> {\n this.sdkTools = mapToolsToSDK(config.tools ?? []);\n this.sessionConfig.tools = this.sdkTools;\n }\n\n override get sessionId(): string | undefined {\n return this._sessionId;\n }\n\n override async interrupt(): Promise<void> {\n if (this.activeSession) {\n this.activeSession.abort().catch(() => {});\n }\n this.abort();\n }\n\n private emitSessionInfo(sessionId: string): AgentEvent {\n const home = process.env.HOME ?? process.env.USERPROFILE ?? \"\";\n const transcriptPath = home\n ? `${home}/.copilot/session-state/${sessionId}/events.jsonl`\n : undefined;\n return { type: \"session_info\", sessionId, transcriptPath, backend: \"copilot\" };\n }\n\n private clearPersistentSession(): void {\n if (this.isPersistent) {\n this.persistentSession?.destroy().catch(() => {});\n this.persistentSession = null;\n this._sessionId = undefined;\n this._persistentModel = undefined;\n }\n }\n\n private async getOrCreateSession(streaming: boolean, options: RunOptions): Promise<{ session: SDKSession; isNew: boolean }> {\n if (this.isPersistent && this.persistentSession) {\n // Check if model has changed — if so, recreate the session\n if (options.model !== this._persistentModel) {\n this.persistentSession.destroy().catch(() => {});\n this.persistentSession = null;\n this._sessionId = undefined;\n // Fall through to create new session with new model\n } else {\n return { session: this.persistentSession, isNew: false };\n }\n }\n // Wait for async Zod converter initialization before first session creation\n if (this._toolsReady) {\n await this._toolsReady;\n this._toolsReady = null;\n }\n\n // Apply per-call overrides to session config\n const sessionConfig = { ...this.sessionConfig };\n sessionConfig.model = options.model;\n const resolvedTools = this.resolveTools(options);\n if (options?.tools) {\n sessionConfig.tools = mapToolsToSDK(resolvedTools);\n }\n\n const client = await this.getClient();\n // Try to resume a stored session (from DB) before creating a new one.\n // This enables session recovery after server restart for persistent sessions.\n if (this._resumeSessionId) {\n const storedId = this._resumeSessionId;\n this._resumeSessionId = undefined; // Only attempt once\n try {\n const session = await client.resumeSession(storedId, {\n ...sessionConfig,\n streaming: this.isPersistent ? true : streaming,\n });\n if (this.isPersistent) {\n this.persistentSession = session;\n this._sessionId = session.sessionId;\n this._persistentModel = options.model;\n }\n return { session, isNew: false };\n } catch {\n // Resume failed (session expired, deleted, etc.) — fall through to createSession\n }\n }\n const session = await client.createSession({\n ...sessionConfig,\n streaming: this.isPersistent ? true : streaming,\n });\n if (this.isPersistent) {\n this.persistentSession = session;\n this._sessionId = session.sessionId;\n this._persistentModel = options.model;\n }\n return { session, isNew: true };\n }\n\n // ─── executeRun ─────────────────────────────────────────────────\n\n protected async executeRun(\n messages: Message[],\n options: RunOptions,\n signal: AbortSignal,\n ): Promise<AgentResult> {\n this.checkAbort(signal);\n\n const { session, isNew: isNewSession } = await this.getOrCreateSession(false, options);\n this.activeSession = session;\n // In per-call mode, include conversation context in prompt.\n const prompt = this.isPersistent && !isNewSession\n ? extractLastUserPrompt(messages)\n : buildContextualPrompt(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 = this.sendAndWaitTimeout !== undefined\n ? await session.sendAndWait({ prompt }, this.sendAndWaitTimeout)\n : 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 } catch (error) {\n // Clear broken persistent session so next call creates a fresh one\n this.clearPersistentSession();\n throw error;\n } finally {\n this.activeSession = null;\n signal.removeEventListener(\"abort\", onAbort);\n unsubscribe();\n tracker.clear();\n if (!this.isPersistent) {\n // Best-effort cleanup: don't mask the original error from sendAndWait\n session.destroy().catch(() => {});\n }\n }\n }\n\n // ─── executeRunStructured ───────────────────────────────────────\n\n protected async executeRunStructured<T>(\n messages: Message[],\n schema: StructuredOutputConfig<T>,\n options: RunOptions,\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,\n signal: AbortSignal,\n ): AsyncIterable<AgentEvent> {\n this.checkAbort(signal);\n\n const { session, isNew: isNewSession } = await this.getOrCreateSession(true, options);\n this.activeSession = session;\n if (isNewSession) {\n yield this.emitSessionInfo(session.sessionId);\n }\n const prompt = this.isPersistent && !isNewSession\n ? extractLastUserPrompt(messages)\n : buildContextualPrompt(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 // Close any open thinking block before completing the stream\n if (thinkingTracker.endThinking()) {\n push({ event: { type: \"thinking_end\" } });\n }\n push({ done: true });\n } else if (event.type === \"session.error\") {\n console.error(\"[copilot] session.error:\", JSON.stringify(event.data));\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) {\n // Clear broken persistent session so next call creates a fresh one\n this.clearPersistentSession();\n throw item.error;\n }\n yield item.event;\n }\n } catch (error) {\n this.clearPersistentSession();\n throw error;\n } finally {\n this.activeSession = null;\n signal.removeEventListener(\"abort\", onAbort);\n unsubscribe();\n tracker.clear();\n if (!this.isPersistent) {\n // Best-effort cleanup: don't mask errors from the event stream\n session.destroy().catch(() => {});\n }\n }\n }\n\n // ─── dispose ────────────────────────────────────────────────────\n\n override dispose(): void {\n if (this.persistentSession) {\n this.persistentSession.destroy().catch(() => {});\n this.persistentSession = null;\n this._sessionId = undefined;\n }\n super.dispose();\n }\n}\n\n// ─── Helpers ────────────────────────────────────────────────────\n\n// ─── Helpers ─────────────────────────────────────────────────────\n\n/** Race a promise against a timeout. Rejects with SubprocessError on timeout. */\nfunction withTimeout<T>(promise: Promise<T>, ms: number, message: string): Promise<T> {\n return new Promise<T>((resolve, reject) => {\n const timer = setTimeout(() => reject(new SubprocessError(message)), ms);\n promise.then(\n (val) => { clearTimeout(timer); resolve(val); },\n (err) => { clearTimeout(timer); reject(err); },\n );\n });\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 ?? !this.options.githubToken,\n ...(this.options.cliArgs ? { cliArgs: this.options.cliArgs } : {}),\n env: {\n ...process.env,\n ...(this.options.githubToken ? { GITHUB_TOKEN: this.options.githubToken } : {}),\n ...this.options.env,\n },\n });\n\n const startupTimeout = this.options.startupTimeoutMs ?? 30_000;\n await withTimeout(client.start(), startupTimeout, \"CLI startup timed out\");\n\n // Verify authentication early to fail fast instead of hanging\n const auth = await withTimeout(\n client.getAuthStatus(),\n startupTimeout,\n \"Auth status check timed out — token may be expired\",\n );\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: FullAgentConfig): IAgent {\n if (this.disposed) throw new DisposedError(\"CopilotAgentService\");\n return new CopilotAgent(config, () => this.ensureClient(), this.options.timeout, this.options.resumeSessionId);\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 ...(m.capabilities?.limits?.max_context_window_tokens != null && {\n contextWindow: m.capabilities.limits.max_context_window_tokens,\n }),\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","import type {\n IAgent,\n IAgentService,\n FullAgentConfig,\n AgentResult,\n AgentEvent,\n Message,\n RunOptions,\n StructuredOutputConfig,\n ToolDefinition,\n ClaudeBackendOptions,\n ModelInfo,\n ValidationResult,\n JSONValue,\n PermissionRequest as UnifiedPermissionRequest,\n PermissionDecision,\n PermissionScope,\n UserInputRequest,\n UserInputResponse,\n SupervisorHooks,\n} from \"../types.js\";\nimport { classifyAgentError, isRecoverableErrorCode } from \"../types.js\";\nimport { BaseAgent } from \"../base-agent.js\";\nimport { DisposedError, SubprocessError, AbortError } from \"../errors.js\";\nimport { zodToJsonSchema } from \"../utils/schema.js\";\nimport { extractLastUserPrompt, buildContextualPrompt } from \"./shared.js\";\n\nexport type { ClaudeBackendOptions } from \"../types.js\";\n\n// ─── Local Type Definitions (matching @anthropic-ai/claude-agent-sdk shapes) ──\n// Avoids requiring the SDK to be installed at compile time.\n\n/** @internal Claude SDK PermissionUpdate destination */\ntype PermissionUpdateDestination =\n | \"userSettings\"\n | \"projectSettings\"\n | \"localSettings\"\n | \"session\"\n | \"cliArg\";\n\n/** @internal Claude SDK PermissionUpdate */\ninterface SDKPermissionUpdate {\n type: \"addRules\" | \"replaceRules\" | \"removeRules\" | \"setMode\" | \"addDirectories\" | \"removeDirectories\";\n destination: PermissionUpdateDestination;\n [key: string]: unknown;\n}\n\n/** @internal Claude SDK PermissionResult */\ntype SDKPermissionResult =\n | {\n behavior: \"allow\";\n updatedInput?: Record<string, unknown>;\n updatedPermissions?: SDKPermissionUpdate[];\n toolUseID?: string;\n }\n | {\n behavior: \"deny\";\n message: string;\n interrupt?: boolean;\n toolUseID?: string;\n };\n\n/** @internal Claude SDK CanUseTool callback */\ntype SDKCanUseTool = (\n toolName: string,\n input: Record<string, unknown>,\n options: {\n signal: AbortSignal;\n suggestions?: SDKPermissionUpdate[];\n blockedPath?: string;\n decisionReason?: string;\n toolUseID: string;\n agentID?: string;\n },\n) => Promise<SDKPermissionResult>;\n\n/** @internal MCP server name used when registering agent-sdk tools */\nconst MCP_SERVER_NAME = \"agent-sdk-tools\";\nconst MCP_TOOL_PREFIX = `mcp__${MCP_SERVER_NAME}__`;\n\n/** @internal Claude Code MCP tool naming convention: mcp__<server>__<tool> */\nfunction mcpToolName(toolName: string): string {\n return `${MCP_TOOL_PREFIX}${toolName}`;\n}\n\n/** @internal Strip MCP prefix to recover original tool name */\nfunction stripMcpPrefix(name: string): string {\n return name.startsWith(MCP_TOOL_PREFIX) ? name.slice(MCP_TOOL_PREFIX.length) : name;\n}\n\n/**\n * Claude CLI built-in tool names that should be filtered from AgentEvent stream.\n * These are internal tools handled by the CLI runtime, not user-registered tools.\n * Matches Copilot behavior where ask_user is callback-only, never exposed as tool events.\n */\nconst CLAUDE_INTERNAL_TOOL_NAMES = new Set([\"AskUserQuestion\"]);\n\n/** @internal Claude SDK Options */\ninterface SDKOptions {\n abortController?: AbortController;\n allowedTools?: string[];\n canUseTool?: SDKCanUseTool;\n cwd?: string;\n disallowedTools?: string[];\n env?: { [envVar: string]: string | undefined };\n includePartialMessages?: boolean;\n maxTurns?: number;\n model?: string;\n outputFormat?: { type: \"json_schema\"; schema: Record<string, unknown> };\n pathToClaudeCodeExecutable?: string;\n permissionMode?: string;\n persistSession?: boolean;\n resume?: string;\n sessionId?: string;\n systemPrompt?:\n | string\n | { type: \"preset\"; preset: \"claude_code\"; append?: string };\n tools?: string[];\n mcpServers?: Record<string, unknown>;\n}\n\n/** @internal Claude SDK ModelInfo */\ninterface SDKModelInfo {\n value: string;\n displayName: string;\n description: string;\n}\n\n/** @internal Claude SDK ResultSuccess */\ninterface SDKResultSuccess {\n type: \"result\";\n subtype: \"success\";\n result: string;\n structured_output?: unknown;\n num_turns: number;\n total_cost_usd: number;\n usage: Record<string, number>;\n modelUsage: Record<string, { inputTokens: number; outputTokens: number }>;\n session_id: string;\n}\n\n/** @internal Claude SDK ResultError */\ninterface SDKResultError {\n type: \"result\";\n subtype: string;\n errors: string[];\n is_error: boolean;\n usage: Record<string, number>;\n modelUsage: Record<string, { inputTokens: number; outputTokens: number }>;\n session_id: string;\n}\n\n/** @internal Claude SDK message union */\ninterface SDKMessage {\n type: string;\n subtype?: string;\n [key: string]: unknown;\n}\n\n/** @internal Claude SDK Query interface — AsyncGenerator<SDKMessage> with control methods */\ninterface SDKQuery extends AsyncGenerator<SDKMessage, void> {\n close(): void;\n interrupt(): Promise<void>;\n supportedModels(): Promise<SDKModelInfo[]>;\n}\n\n/** @internal SDK's MCP tool definition */\ninterface SDKMcpToolDefinition {\n name: string;\n description: string;\n inputSchema: Record<string, unknown>;\n handler: (args: Record<string, unknown>, extra: unknown) => Promise<{ content: Array<{ type: string; text: string }> }>;\n}\n\n/** @internal SDK server config */\ninterface SDKMcpServerConfigWithInstance {\n type: \"sdk\";\n name: string;\n instance: unknown;\n}\n\n/** @internal */\ntype SDKModule = {\n query: (params: { prompt: string; options?: SDKOptions }) => SDKQuery;\n createSdkMcpServer: (options: {\n name: string;\n version?: string;\n tools?: SDKMcpToolDefinition[];\n }) => SDKMcpServerConfigWithInstance;\n tool: (\n name: string,\n description: string,\n inputSchema: Record<string, unknown>,\n handler: (args: Record<string, unknown>, extra: unknown) => Promise<{ content: Array<{ type: string; text: string }> }>,\n ) => SDKMcpToolDefinition;\n};\n\n// ─── Dynamic SDK Loader ─────────────────────────────────────────\n\n/** Module-level mock set by _injectSDK() for testing */\nlet _sdkMock: SDKModule | null = null;\n\n/** Load the Claude SDK. Checks module-level mock first, then dynamic import. */\nasync function loadSDK(): Promise<SDKModule> {\n if (_sdkMock) return _sdkMock;\n try {\n // @ts-ignore — peer dependency, not present at compile time\n return (await import(\"@anthropic-ai/claude-agent-sdk\")) as SDKModule;\n } catch {\n throw new SubprocessError(\n \"@anthropic-ai/claude-agent-sdk is not installed. Install it: npm install @anthropic-ai/claude-agent-sdk\",\n );\n }\n}\n\n/** @internal For testing: inject mock SDK module */\nexport function _injectSDK(mock: SDKModule | null): void {\n _sdkMock = mock;\n}\n\n/** @internal For testing: reset injected SDK */\nexport function _resetSDK(): void {\n _sdkMock = null;\n}\n\n// ─── Known Models ───────────────────────────────────────────────\n\nconst ANTHROPIC_MODELS_URL = \"https://api.anthropic.com/v1/models\";\nconst ANTHROPIC_API_VERSION = \"2023-06-01\";\nconst ANTHROPIC_OAUTH_BETA = \"oauth-2025-04-20\";\n\n// ─── Tool Mapping ───────────────────────────────────────────────\n\n/**\n * Normalize Claude's AskUserQuestion input format to UserInputRequest.\n * Claude sends: { questions: [{ question, options?: [{ label }] }] }\n * SDK expects: { question, choices?, allowFreeform? }\n */\nfunction normalizeAskUserInput(args: Record<string, unknown>): UserInputRequest {\n // Direct format (already normalized or simple question)\n if (typeof args.question === \"string\") {\n return {\n question: args.question,\n choices: Array.isArray(args.choices) ? args.choices as string[] : undefined,\n allowFreeform: args.allowFreeform !== false,\n };\n }\n\n // Claude's nested format: { questions: [{ question, options?: [{ label }] }] }\n const questions = args.questions as Array<{\n question: string;\n options?: Array<{ label: string }>;\n }> | undefined;\n\n if (questions && questions.length > 0) {\n const first = questions[0];\n return {\n question: first.question,\n choices: first.options?.map((o) => o.label),\n allowFreeform: true,\n };\n }\n\n // Fallback: stringify the entire input as the question\n return { question: JSON.stringify(args), allowFreeform: true };\n}\n\nfunction buildMcpServer(\n sdk: SDKModule,\n tools: ToolDefinition[],\n toolResultCapture?: Map<string, JSONValue>,\n onAskUser?: SupervisorHooks[\"onAskUser\"],\n): SDKMcpServerConfigWithInstance | undefined {\n if (tools.length === 0 && !onAskUser) return undefined;\n\n const mcpTools = tools.map((tool) => {\n // Claude SDK's tool() expects a Zod raw shape ({key: z.string(), ...}),\n // not a JSON Schema object. Extract .shape from ZodObject.\n const zodSchema = tool.parameters as { shape?: Record<string, unknown> };\n const inputSchema = zodSchema.shape ?? zodToJsonSchema(tool.parameters) as Record<string, unknown>;\n return sdk.tool(\n tool.name,\n tool.description ?? \"\",\n inputSchema,\n async (args: Record<string, unknown>) => {\n const result = await tool.execute(args);\n if (toolResultCapture) {\n toolResultCapture.set(tool.name, result as JSONValue);\n }\n return {\n content: [\n {\n type: \"text\" as const,\n text: typeof result === \"string\" ? result : JSON.stringify(result),\n },\n ],\n };\n },\n );\n });\n\n // Inject ask_user MCP tool when onAskUser callback is configured\n if (onAskUser) {\n const askUserTool = sdk.tool(\n \"ask_user\",\n \"Ask the user a question and wait for their response\",\n {\n question: { type: \"string\", description: \"The question to ask the user\" },\n choices: {\n type: \"array\",\n items: { type: \"string\" },\n description: \"Optional list of choices for multiple choice\",\n },\n questions: {\n type: \"array\",\n items: {\n type: \"object\",\n properties: {\n question: { type: \"string\" },\n options: { type: \"array\", items: { type: \"object\", properties: { label: { type: \"string\" } } } },\n },\n },\n description: \"Alternative nested question format\",\n },\n },\n async (args: Record<string, unknown>) => {\n const normalized = normalizeAskUserInput(args);\n // No parent signal available in MCP tool context; provide a standalone controller\n const response: UserInputResponse = await onAskUser(normalized, AbortSignal.timeout(300_000));\n return {\n content: [{ type: \"text\" as const, text: response.answer }],\n };\n },\n );\n mcpTools.push(askUserTool);\n }\n\n return sdk.createSdkMcpServer({\n name: MCP_SERVER_NAME,\n version: \"1.0.0\",\n tools: mcpTools,\n });\n}\n\n// ─── Permission Mapping ─────────────────────────────────────────\n\n/** Map our PermissionScope to Claude SDK's PermissionUpdateDestination */\nfunction scopeToDestination(scope: PermissionScope): PermissionUpdateDestination {\n switch (scope) {\n case \"once\":\n return \"session\";\n case \"session\":\n return \"session\";\n case \"project\":\n return \"projectSettings\";\n case \"always\":\n return \"userSettings\";\n }\n}\n\n/** Map Claude SDK suggestions to our PermissionScope */\nfunction destinationToScope(dest: PermissionUpdateDestination): PermissionScope {\n switch (dest) {\n case \"session\":\n case \"cliArg\":\n return \"session\";\n case \"projectSettings\":\n case \"localSettings\":\n return \"project\";\n case \"userSettings\":\n return \"always\";\n }\n}\n\n/** Extract best suggestedScope from SDK's PermissionUpdate[] */\nfunction extractSuggestedScope(\n suggestions?: SDKPermissionUpdate[],\n): PermissionScope | undefined {\n if (!suggestions || suggestions.length === 0) return undefined;\n // Use the destination of the first suggestion as the scope hint\n return destinationToScope(suggestions[0].destination);\n}\n\nfunction buildCanUseTool(\n config: FullAgentConfig,\n): SDKCanUseTool | undefined {\n const onPermission = config.supervisor?.onPermission;\n if (!onPermission) return undefined;\n\n const permissionStore = config.permissionStore;\n\n return async (\n rawToolName: string,\n input: Record<string, unknown>,\n options,\n ): Promise<SDKPermissionResult> => {\n const toolName = stripMcpPrefix(rawToolName);\n // Check store first — if already approved, skip callback\n if (permissionStore && await permissionStore.isApproved(toolName)) {\n return {\n behavior: \"allow\",\n toolUseID: options.toolUseID,\n };\n }\n\n const unifiedRequest: UnifiedPermissionRequest = {\n toolName,\n toolArgs: input,\n toolCallId: options.toolUseID,\n suggestedScope: extractSuggestedScope(options.suggestions),\n rawSDKRequest: { toolName, input, ...options },\n };\n\n const decision: PermissionDecision = await onPermission(\n unifiedRequest,\n options.signal,\n );\n\n if (decision.allowed) {\n // Persist approval to store\n if (permissionStore && decision.scope) {\n await permissionStore.approve(toolName, decision.scope);\n }\n\n const result: SDKPermissionResult = {\n behavior: \"allow\",\n toolUseID: options.toolUseID,\n };\n if (decision.modifiedInput) {\n (result as { updatedInput?: Record<string, unknown> }).updatedInput =\n decision.modifiedInput;\n }\n // Map scope decision to SDK's updatedPermissions\n if (decision.scope && decision.scope !== \"once\" && options.suggestions) {\n (result as { updatedPermissions?: SDKPermissionUpdate[] }).updatedPermissions =\n options.suggestions.map((s) => ({\n ...s,\n destination: scopeToDestination(decision.scope!),\n }));\n }\n return result;\n }\n\n return {\n behavior: \"deny\",\n message: decision.reason ?? \"Permission denied\",\n toolUseID: options.toolUseID,\n };\n };\n}\n\n// ─── Usage Aggregation Helper ───────────────────────────────────\n\nfunction aggregateUsage(\n modelUsage?: Record<string, { inputTokens: number; outputTokens: number }>,\n): { promptTokens: number; completionTokens: number } {\n let promptTokens = 0;\n let completionTokens = 0;\n for (const u of Object.values(modelUsage ?? {})) {\n promptTokens += u.inputTokens ?? 0;\n completionTokens += u.outputTokens ?? 0;\n }\n return { promptTokens, completionTokens };\n}\n\n// ─── Event Mapping ──────────────────────────────────────────────\n\n/**\n * Tracks tool call IDs to tool names for Claude backend.\n *\n * The Claude SDK emits tool_use blocks (with `id` and `name`) in assistant messages,\n * but tool_use_summary messages only carry `tool_name` (and optionally\n * `preceding_tool_use_ids`). This tracker correlates start/end events using a\n * per-tool-name FIFO queue to handle parallel calls to the same tool.\n */\nclass ClaudeToolCallTracker {\n private queues = new Map<string, string[]>();\n\n trackStart(toolCallId: string, toolName: string): void {\n if (!this.queues.has(toolName)) {\n this.queues.set(toolName, []);\n }\n this.queues.get(toolName)!.push(toolCallId);\n }\n\n /** Peek at the current tool call ID for a tool name (does not consume) */\n peekToolCallId(toolName: string): string {\n const queue = this.queues.get(toolName);\n if (!queue || queue.length === 0) return \"\";\n return queue[0];\n }\n\n /** Consume and return the first tool call ID for a tool name */\n consumeToolCallId(toolName: string): string {\n const queue = this.queues.get(toolName);\n if (!queue || queue.length === 0) return \"\";\n return queue.shift()!;\n }\n\n clear(): void {\n this.queues.clear();\n }\n}\n\nfunction mapSDKMessage(msg: SDKMessage, thinkingBlockIndices?: Set<number>, toolCallTracker?: ClaudeToolCallTracker): AgentEvent | AgentEvent[] | null {\n switch (msg.type) {\n case \"assistant\": {\n // Full assistant message — contains BetaMessage with content blocks\n const betaMessage = msg.message as {\n content?: Array<{\n type: string;\n text?: string;\n name?: string;\n input?: unknown;\n id?: string;\n }>;\n } | undefined;\n if (!betaMessage?.content) return null;\n\n const events: AgentEvent[] = [];\n\n // Emit tool_call_start for each tool_use block\n // NOTE: Text content is NOT extracted here — during streaming it arrives\n // via content_block_delta events, and during executeRun it comes from\n // the result message. Emitting text from assistant messages would cause\n // duplication.\n for (const block of betaMessage.content) {\n if (block.type === \"tool_use\") {\n const toolCallId = String(block.id ?? \"\");\n const toolName = stripMcpPrefix(block.name ?? \"unknown\");\n // Filter out internal Claude CLI tools (e.g. AskUserQuestion)\n if (CLAUDE_INTERNAL_TOOL_NAMES.has(toolName)) continue;\n if (toolCallTracker) {\n toolCallTracker.trackStart(toolCallId, toolName);\n }\n events.push({\n type: \"tool_call_start\",\n toolCallId,\n toolName,\n args: (block.input as JSONValue) ?? {},\n });\n }\n }\n\n return events.length > 0 ? events : null;\n }\n\n case \"user\": {\n // User messages with tool_use_result indicate tool completion\n const toolResult = msg.tool_use_result as JSONValue | undefined;\n // Extract tool name from the message context if available\n if (toolResult !== undefined) {\n // The user message after tool execution — emit tool_call_end\n // tool_name may not be in user messages, but we can infer from context\n return null; // Handled via tool_use_summary below\n }\n return null;\n }\n\n case \"tool_use_summary\": {\n // Emitted after tool execution — contains summary of tool results\n const summary = msg.summary as string | undefined;\n const toolName = stripMcpPrefix((msg.tool_name as string | undefined) ?? \"unknown\");\n // Filter out internal Claude CLI tools (e.g. AskUserQuestion)\n if (CLAUDE_INTERNAL_TOOL_NAMES.has(toolName)) return null;\n // Resolve toolCallId: prefer preceding_tool_use_ids, fall back to tracker\n const precedingIds = msg.preceding_tool_use_ids as string[] | undefined;\n let toolCallId = \"\";\n if (precedingIds && precedingIds.length > 0) {\n toolCallId = precedingIds[0];\n // Consume from tracker to keep queue in sync\n if (toolCallTracker) toolCallTracker.consumeToolCallId(toolName);\n } else if (toolCallTracker) {\n toolCallId = toolCallTracker.consumeToolCallId(toolName);\n }\n // Always emit tool_call_end — summary may be empty\n return {\n type: \"tool_call_end\",\n toolCallId,\n toolName,\n result: (summary ?? null) as JSONValue,\n };\n }\n\n case \"stream_event\": {\n // Partial streaming events — BetaRawMessageStreamEvent\n const event = msg.event as {\n type: string;\n delta?: { type: string; text?: string; thinking?: string };\n content_block?: { type: string; name?: string; id?: string };\n index?: number;\n } | undefined;\n if (!event) return null;\n\n // Thinking block deltas — emit thinking_delta instead of text_delta\n if (\n event.type === \"content_block_delta\" &&\n event.index !== undefined &&\n thinkingBlockIndices?.has(event.index)\n ) {\n const thinkingText = String(event.delta?.thinking ?? event.delta?.text ?? \"\");\n if (thinkingText) {\n return { type: \"thinking_delta\", text: thinkingText };\n }\n return null;\n }\n\n if (\n event.type === \"content_block_delta\" &&\n event.delta?.type === \"text_delta\" &&\n event.delta.text\n ) {\n return { type: \"text_delta\", text: event.delta.text };\n }\n\n if (event.type === \"content_block_start\" && event.content_block?.type === \"thinking\") {\n if (thinkingBlockIndices && event.index !== undefined) {\n thinkingBlockIndices.add(event.index);\n }\n return { type: \"thinking_start\" };\n }\n\n if (event.type === \"content_block_stop\" && event.index !== undefined && thinkingBlockIndices?.has(event.index)) {\n thinkingBlockIndices.delete(event.index);\n return { type: \"thinking_end\" };\n }\n\n return null;\n }\n\n case \"tool_progress\": {\n // Heartbeat while tool is executing — not a new tool call\n return null;\n }\n\n case \"result\": {\n if (msg.subtype === \"success\") {\n const r = msg as unknown as SDKResultSuccess;\n return {\n type: \"usage_update\",\n ...aggregateUsage(r.modelUsage),\n };\n }\n if (msg.is_error) {\n const r = msg as unknown as SDKResultError;\n const errorMsg = r.errors?.join(\"; \") ?? \"Unknown error\";\n const code = classifyAgentError(errorMsg);\n return {\n type: \"error\",\n error: errorMsg,\n recoverable: isRecoverableErrorCode(code),\n code,\n };\n }\n return null;\n }\n\n default:\n return null;\n }\n}\n\n// ─── ClaudeAgent ────────────────────────────────────────────────\n\nclass ClaudeAgent extends BaseAgent {\n protected readonly backendName = \"claude\";\n private readonly options: ClaudeBackendOptions;\n private readonly tools: ToolDefinition[];\n private readonly canUseTool: SDKCanUseTool | undefined;\n private readonly isPersistent: boolean;\n private _sessionId: string | undefined;\n private activeQuery: SDKQuery | null = null;\n\n constructor(config: FullAgentConfig, options: ClaudeBackendOptions) {\n super(config);\n this.options = options;\n this.tools = config.tools ?? [];\n this.canUseTool = buildCanUseTool(config);\n this.isPersistent = config.sessionMode === \"persistent\";\n\n // Restore session ID from stored identifier for session resume after server restart.\n // buildQueryOptions() uses _sessionId to set opts.resume when isPersistent.\n if (options.resumeSessionId) {\n this._sessionId = options.resumeSessionId;\n }\n }\n\n override get sessionId(): string | undefined {\n return this._sessionId;\n }\n\n override async interrupt(): Promise<void> {\n try {\n if (this.activeQuery) {\n await this.activeQuery.interrupt();\n }\n } catch {\n // fire-and-forget: SDK interrupt errors should not prevent abort\n } finally {\n this.abort();\n }\n }\n\n /** Clear persistent session state after an error so next call starts fresh */\n private clearPersistentSession(): void {\n this._sessionId = undefined;\n }\n\n private emitSessionInfo(sessionId: string): AgentEvent {\n const home = process.env.HOME ?? process.env.USERPROFILE ?? \"\";\n const transcriptPath = home\n ? `${home}/.claude/projects/.session/sessions/${sessionId}/conversation.jsonl`\n : undefined;\n return { type: \"session_info\", sessionId, transcriptPath, backend: \"claude\" };\n }\n\n private buildQueryOptions(signal: AbortSignal, options: RunOptions): SDKOptions {\n const ac = new AbortController();\n // Link external signal → SDK's abort controller\n signal.addEventListener(\"abort\", () => ac.abort(), { once: true });\n\n const opts: SDKOptions = {\n abortController: ac,\n model: options.model,\n maxTurns: this.options.maxTurns,\n cwd: this.options.workingDirectory,\n pathToClaudeCodeExecutable: this.options.cliPath,\n persistSession: this.isPersistent,\n includePartialMessages: true,\n canUseTool: this.canUseTool,\n };\n\n // Resume persistent session on subsequent calls\n if (this.isPersistent && this._sessionId) {\n opts.resume = this._sessionId;\n }\n\n if (this.config.systemPrompt) {\n opts.systemPrompt = this.config.systemPrompt;\n }\n\n if (this.options.oauthToken || this.options.env) {\n opts.env = {\n ...process.env,\n ...(this.options.env ?? {}),\n ...(this.options.oauthToken\n ? { CLAUDE_CODE_OAUTH_TOKEN: this.options.oauthToken }\n : {}),\n };\n }\n\n // Auto-set permissionMode when canUseTool is configured so Claude CLI\n // actually invokes the callback instead of using built-in rules.\n if (opts.canUseTool && !opts.permissionMode) {\n opts.permissionMode = \"default\";\n }\n\n // When availableTools is set, restrict built-in tool availability.\n // opts.tools controls which tools are available (Bash, Read, Edit, etc.).\n // opts.allowedTools only auto-approves permissions but does NOT restrict availability.\n // MCP tool names are added to allowedTools later by buildMcpConfig().\n if (this.config.availableTools) {\n opts.tools = [...this.config.availableTools];\n }\n\n return opts;\n }\n\n private async buildMcpConfig(\n opts: SDKOptions,\n toolResultCapture?: Map<string, JSONValue>,\n ): Promise<SDKOptions> {\n const onAskUser = this.config.supervisor?.onAskUser;\n if (this.tools.length === 0 && !onAskUser) return opts;\n\n const sdk = await loadSDK();\n const mcpServer = buildMcpServer(sdk, this.tools, toolResultCapture, onAskUser);\n if (mcpServer) {\n opts.mcpServers = {\n [MCP_SERVER_NAME]: mcpServer,\n };\n // Auto-allow MCP tools so Claude Code invokes them without blocking.\n // Claude Code names MCP tools as mcp__<server>__<tool>.\n const mcpToolNames = this.tools.map((t) => mcpToolName(t.name));\n if (onAskUser) {\n mcpToolNames.push(mcpToolName(\"ask_user\"));\n }\n opts.allowedTools = [...(opts.allowedTools ?? []), ...mcpToolNames];\n }\n\n // When onAskUser is configured, block built-in AskUserQuestion so Claude uses our MCP tool\n if (onAskUser) {\n opts.disallowedTools = [...(opts.disallowedTools ?? []), \"AskUserQuestion\"];\n }\n\n return opts;\n }\n\n // ─── Retry Helpers (shared across executeRun/RunStructured/Stream) ──\n\n /** Setup a retry query: clear session, rebuild with full history */\n private async prepareRetryQuery(\n sdk: SDKModule,\n messages: Message[],\n signal: AbortSignal,\n options: RunOptions,\n toolResultCapture: Map<string, JSONValue>,\n modifyOpts?: (opts: SDKOptions) => void,\n ): Promise<SDKQuery> {\n this.clearPersistentSession();\n const retryPrompt = buildContextualPrompt(messages);\n let retryOpts = this.buildQueryOptions(signal, options);\n toolResultCapture.clear();\n retryOpts = await this.buildMcpConfig(retryOpts, toolResultCapture);\n modifyOpts?.(retryOpts);\n const retryQ = sdk.query({ prompt: retryPrompt, options: retryOpts });\n this.activeQuery = retryQ;\n return retryQ;\n }\n\n /** Extract tool_use blocks from an assistant SDK message into toolCalls array */\n private collectToolCallsFromMessage(\n msg: SDKMessage,\n toolCalls: AgentResult[\"toolCalls\"],\n toolResultCapture: Map<string, JSONValue>,\n ): void {\n if (msg.type !== \"assistant\") return;\n const betaMessage = msg.message as {\n content?: Array<{ type: string; name?: string; input?: unknown }>;\n } | undefined;\n if (!betaMessage?.content) return;\n for (const block of betaMessage.content) {\n if (block.type === \"tool_use\") {\n const toolName = stripMcpPrefix(block.name ?? \"unknown\");\n if (CLAUDE_INTERNAL_TOOL_NAMES.has(toolName)) continue;\n toolCalls.push({\n toolName,\n args: (block.input as JSONValue) ?? {},\n result: toolResultCapture.get(toolName) ?? null,\n approved: true,\n });\n }\n }\n }\n\n /** Back-fill tool results from capture map on summary/result messages */\n private backfillToolResults(\n msg: SDKMessage,\n toolCalls: AgentResult[\"toolCalls\"],\n toolResultCapture: Map<string, JSONValue>,\n ): void {\n if (msg.type !== \"tool_use_summary\" && msg.type !== \"result\") return;\n for (const tc of toolCalls) {\n if (tc.result === null) {\n const captured = toolResultCapture.get(tc.toolName);\n if (captured !== undefined) tc.result = captured;\n }\n }\n }\n\n /** Wrap retry inner loop with shared error handling */\n private async withRetryErrorHandling<T>(\n signal: AbortSignal,\n fn: () => Promise<T>,\n ): Promise<T> {\n try {\n return await fn();\n } catch (retryError) {\n if (this.isPersistent) this.clearPersistentSession();\n if (signal.aborted) throw new AbortError();\n throw retryError;\n } finally {\n this.activeQuery = null;\n }\n }\n\n // ─── executeRun ─────────────────────────────────────────────────\n\n protected async executeRun(\n messages: Message[],\n options: RunOptions,\n signal: AbortSignal,\n ): Promise<AgentResult> {\n this.checkAbort(signal);\n\n const sdk = await loadSDK();\n const isResuming = this.isPersistent && this._sessionId !== undefined;\n const prompt = isResuming\n ? extractLastUserPrompt(messages)\n : buildContextualPrompt(messages);\n let opts = this.buildQueryOptions(signal, options);\n const toolResultCapture = new Map<string, JSONValue>();\n opts = await this.buildMcpConfig(opts, toolResultCapture);\n\n const q = sdk.query({ prompt, options: opts });\n this.activeQuery = q;\n const toolCalls: AgentResult[\"toolCalls\"] = [];\n let output: string | null = null;\n let usage: AgentResult[\"usage\"];\n\n try {\n for await (const msg of q) {\n this.collectToolCallsFromMessage(msg, toolCalls, toolResultCapture);\n this.backfillToolResults(msg, toolCalls, toolResultCapture);\n\n // Capture result and session_id\n if (msg.type === \"result\") {\n if (msg.subtype === \"success\") {\n const r = msg as unknown as SDKResultSuccess;\n output = r.result;\n usage = aggregateUsage(r.modelUsage);\n if (this.isPersistent && r.session_id) {\n this._sessionId = r.session_id;\n }\n } else if (msg.is_error) {\n const r = msg as unknown as SDKResultError;\n throw new Error(\n `Claude query failed: ${r.errors?.join(\"; \") ?? \"unknown error\"}`,\n );\n }\n }\n }\n } catch (e) {\n if (signal.aborted) throw new AbortError();\n if (isResuming && this.isPersistent) {\n const retryQ = await this.prepareRetryQuery(sdk, messages, signal, options, toolResultCapture);\n toolCalls.length = 0;\n output = null;\n return this.withRetryErrorHandling(signal, async () => {\n for await (const msg of retryQ) {\n this.collectToolCallsFromMessage(msg, toolCalls, toolResultCapture);\n this.backfillToolResults(msg, toolCalls, toolResultCapture);\n if (msg.type === \"result\") {\n if (msg.subtype === \"success\") {\n const r = msg as unknown as SDKResultSuccess;\n output = r.result;\n usage = aggregateUsage(r.modelUsage);\n if (this.isPersistent && r.session_id) {\n this._sessionId = r.session_id;\n }\n } else if (msg.is_error) {\n const r = msg as unknown as SDKResultError;\n throw new Error(\n `Claude query failed: ${r.errors?.join(\"; \") ?? \"unknown error\"}`,\n );\n }\n }\n }\n return {\n output,\n structuredOutput: undefined as AgentResult[\"structuredOutput\"],\n toolCalls,\n messages: [\n ...messages,\n ...(output !== null\n ? [{ role: \"assistant\" as const, content: output }]\n : []),\n ],\n usage,\n };\n });\n }\n if (this.isPersistent) this.clearPersistentSession();\n throw e;\n } finally {\n this.activeQuery = null;\n }\n\n return {\n output,\n structuredOutput: undefined as AgentResult[\"structuredOutput\"],\n toolCalls,\n messages: [\n ...messages,\n ...(output !== null\n ? [{ role: \"assistant\" as const, content: output }]\n : []),\n ],\n usage,\n };\n }\n\n // ─── executeRunStructured ───────────────────────────────────────\n\n protected async executeRunStructured<T>(\n messages: Message[],\n schema: StructuredOutputConfig<T>,\n options: RunOptions,\n signal: AbortSignal,\n ): Promise<AgentResult<T>> {\n this.checkAbort(signal);\n\n const sdk = await loadSDK();\n const isResuming = this.isPersistent && this._sessionId !== undefined;\n const prompt = isResuming\n ? extractLastUserPrompt(messages)\n : buildContextualPrompt(messages);\n let opts = this.buildQueryOptions(signal, options);\n const toolResultCapture = new Map<string, JSONValue>();\n opts = await this.buildMcpConfig(opts, toolResultCapture);\n\n // Claude SDK has native structured output via outputFormat\n const jsonSchema = zodToJsonSchema(schema.schema);\n opts.outputFormat = {\n type: \"json_schema\",\n schema: jsonSchema as Record<string, unknown>,\n };\n\n const q = sdk.query({ prompt, options: opts });\n this.activeQuery = q;\n const toolCalls: AgentResult[\"toolCalls\"] = [];\n let output: string | null = null;\n let structuredOutput: T | undefined;\n let usage: AgentResult[\"usage\"];\n\n try {\n for await (const msg of q) {\n this.collectToolCallsFromMessage(msg, toolCalls, toolResultCapture);\n this.backfillToolResults(msg, toolCalls, toolResultCapture);\n\n if (msg.type === \"result\" && msg.subtype === \"success\") {\n const r = msg as unknown as SDKResultSuccess;\n output = r.result;\n\n // Claude SDK returns parsed structured_output when using outputFormat\n if (r.structured_output !== undefined) {\n try {\n structuredOutput = schema.schema.parse(r.structured_output);\n } catch {\n // Fallback: try parsing result string\n try {\n structuredOutput = schema.schema.parse(JSON.parse(r.result));\n } catch {\n // Leave undefined\n }\n }\n } else if (r.result) {\n // Fallback: parse from result string\n try {\n const jsonMatch = r.result.match(/```(?:json)?\\s*([\\s\\S]*?)```/);\n const raw = jsonMatch ? jsonMatch[1]!.trim() : r.result.trim();\n structuredOutput = schema.schema.parse(JSON.parse(raw));\n } catch {\n // Leave undefined\n }\n }\n\n usage = aggregateUsage(r.modelUsage);\n if (this.isPersistent && r.session_id) {\n this._sessionId = r.session_id;\n }\n } else if (msg.type === \"result\" && msg.is_error) {\n const r = msg as unknown as SDKResultError;\n throw new Error(\n `Claude query failed: ${r.errors?.join(\"; \") ?? \"unknown error\"}`,\n );\n }\n }\n } catch (e) {\n if (signal.aborted) throw new AbortError();\n if (isResuming && this.isPersistent) {\n const retryQ = await this.prepareRetryQuery(\n sdk, messages, signal, options, toolResultCapture,\n (opts) => { opts.outputFormat = { type: \"json_schema\", schema: jsonSchema as Record<string, unknown> }; },\n );\n toolCalls.length = 0;\n output = null;\n structuredOutput = undefined;\n return this.withRetryErrorHandling(signal, async () => {\n for await (const msg of retryQ) {\n this.collectToolCallsFromMessage(msg, toolCalls, toolResultCapture);\n this.backfillToolResults(msg, toolCalls, toolResultCapture);\n if (msg.type === \"result\" && msg.subtype === \"success\") {\n const r = msg as unknown as SDKResultSuccess;\n output = r.result;\n if (r.structured_output !== undefined) {\n try { structuredOutput = schema.schema.parse(r.structured_output); } catch {\n try { structuredOutput = schema.schema.parse(JSON.parse(r.result)); } catch {\n // Leave undefined\n }\n }\n } else if (r.result) {\n try {\n const jsonMatch = r.result.match(/```(?:json)?\\s*([\\s\\S]*?)```/);\n const raw = jsonMatch ? jsonMatch[1]!.trim() : r.result.trim();\n structuredOutput = schema.schema.parse(JSON.parse(raw));\n } catch {\n // Leave undefined\n }\n }\n usage = aggregateUsage(r.modelUsage);\n if (this.isPersistent && r.session_id) {\n this._sessionId = r.session_id;\n }\n } else if (msg.type === \"result\" && msg.is_error) {\n const r = msg as unknown as SDKResultError;\n throw new Error(\n `Claude query failed: ${r.errors?.join(\"; \") ?? \"unknown error\"}`,\n );\n }\n }\n return {\n output,\n structuredOutput: structuredOutput as AgentResult<T>[\"structuredOutput\"],\n toolCalls,\n messages: [\n ...messages,\n ...(output !== null\n ? [{ role: \"assistant\" as const, content: output }]\n : []),\n ],\n usage,\n };\n });\n }\n if (this.isPersistent) this.clearPersistentSession();\n throw e;\n } finally {\n this.activeQuery = null;\n }\n\n return {\n output,\n structuredOutput: structuredOutput as AgentResult<T>[\"structuredOutput\"],\n toolCalls,\n messages: [\n ...messages,\n ...(output !== null\n ? [{ role: \"assistant\" as const, content: output }]\n : []),\n ],\n usage,\n };\n }\n\n // ─── executeStream ──────────────────────────────────────────────\n\n protected async *executeStream(\n messages: Message[],\n options: RunOptions,\n signal: AbortSignal,\n ): AsyncIterable<AgentEvent> {\n this.checkAbort(signal);\n\n const sdk = await loadSDK();\n const isResuming = this.isPersistent && this._sessionId !== undefined;\n const prompt = isResuming\n ? extractLastUserPrompt(messages)\n : buildContextualPrompt(messages);\n let opts = this.buildQueryOptions(signal, options);\n // Capture actual tool results from MCP handler execution\n const toolResultCapture = new Map<string, JSONValue>();\n opts = await this.buildMcpConfig(opts, toolResultCapture);\n\n const q = sdk.query({ prompt, options: opts });\n this.activeQuery = q;\n const thinkingBlockIndices = new Set<number>();\n const toolCallTracker = new ClaudeToolCallTracker();\n // Track pending tool calls to emit tool_call_end for tools without tool_use_summary\n const pendingStreamToolCalls = new Map<string, string>();\n let hasStreamedText = false;\n\n try {\n for await (const msg of q) {\n if (signal.aborted) throw new AbortError();\n\n const events = mapSDKMessage(msg, thinkingBlockIndices, toolCallTracker);\n if (events) {\n const mapped = Array.isArray(events) ? events : [events];\n for (const e of mapped) {\n // Track tool_call_start for fallback emission\n if (e.type === \"tool_call_start\") {\n pendingStreamToolCalls.set(e.toolCallId, e.toolName);\n }\n // Enrich tool_call_end with captured actual result instead of summary text\n if (e.type === \"tool_call_end\" && toolResultCapture.has(e.toolName)) {\n e.result = toolResultCapture.get(e.toolName)!;\n toolResultCapture.delete(e.toolName);\n pendingStreamToolCalls.delete(e.toolCallId);\n } else if (e.type === \"tool_call_end\") {\n pendingStreamToolCalls.delete(e.toolCallId);\n }\n if (e.type === \"text_delta\") hasStreamedText = true;\n yield e;\n }\n }\n\n // Capture session_id and emit done event on result\n if (msg.type === \"result\" && msg.subtype === \"success\") {\n const r = msg as unknown as SDKResultSuccess;\n // Emit tool_call_end for any tools that executed but never got tool_use_summary\n for (const [toolCallId, toolName] of pendingStreamToolCalls) {\n if (toolResultCapture.has(toolName)) {\n yield {\n type: \"tool_call_end\" as const,\n toolCallId,\n toolName,\n result: toolResultCapture.get(toolName)!,\n };\n toolResultCapture.delete(toolName);\n }\n }\n pendingStreamToolCalls.clear();\n if (r.session_id) {\n if (this.isPersistent) {\n this._sessionId = r.session_id;\n }\n yield this.emitSessionInfo(r.session_id);\n }\n yield {\n type: \"done\",\n finalOutput: hasStreamedText ? null : r.result,\n ...(hasStreamedText ? { streamed: true } : {}),\n };\n }\n }\n } catch (e) {\n if (signal.aborted) throw new AbortError();\n // Single retry on resume failure: clear session, rebuild with full history\n if (isResuming && this.isPersistent) {\n const retryQ = await this.prepareRetryQuery(sdk, messages, signal, options, toolResultCapture);\n const retryThinkingBlockIndices = new Set<number>();\n const retryToolCallTracker = new ClaudeToolCallTracker();\n const retryPendingToolCalls = new Map<string, string>();\n let retryHasStreamedText = false;\n try {\n for await (const msg of retryQ) {\n if (signal.aborted) throw new AbortError();\n const retryEvents = mapSDKMessage(msg, retryThinkingBlockIndices, retryToolCallTracker);\n if (retryEvents) {\n const mapped = Array.isArray(retryEvents) ? retryEvents : [retryEvents];\n for (const ev of mapped) {\n if (ev.type === \"tool_call_start\") {\n retryPendingToolCalls.set(ev.toolCallId, ev.toolName);\n }\n if (ev.type === \"tool_call_end\" && toolResultCapture.has(ev.toolName)) {\n ev.result = toolResultCapture.get(ev.toolName)!;\n toolResultCapture.delete(ev.toolName);\n retryPendingToolCalls.delete(ev.toolCallId);\n } else if (ev.type === \"tool_call_end\") {\n retryPendingToolCalls.delete(ev.toolCallId);\n }\n if (ev.type === \"text_delta\") retryHasStreamedText = true;\n yield ev;\n }\n }\n if (msg.type === \"result\" && msg.subtype === \"success\") {\n const r = msg as unknown as SDKResultSuccess;\n for (const [toolCallId, toolName] of retryPendingToolCalls) {\n if (toolResultCapture.has(toolName)) {\n yield {\n type: \"tool_call_end\" as const,\n toolCallId,\n toolName,\n result: toolResultCapture.get(toolName)!,\n };\n toolResultCapture.delete(toolName);\n }\n }\n retryPendingToolCalls.clear();\n if (r.session_id) {\n if (this.isPersistent) {\n this._sessionId = r.session_id;\n }\n yield this.emitSessionInfo(r.session_id);\n }\n yield {\n type: \"done\",\n finalOutput: retryHasStreamedText ? null : r.result,\n ...(retryHasStreamedText ? { streamed: true } : {}),\n };\n }\n }\n } catch (retryError) {\n if (this.isPersistent) this.clearPersistentSession();\n if (signal.aborted) throw new AbortError();\n throw retryError;\n } finally {\n this.activeQuery = null;\n }\n return;\n }\n if (this.isPersistent) this.clearPersistentSession();\n throw e;\n } finally {\n this.activeQuery = null;\n }\n }\n\n override dispose(): void {\n this._sessionId = undefined;\n super.dispose();\n }\n}\n\n// ─── Helpers ────────────────────────────────────────────────────\n\nclass ClaudeAgentService implements IAgentService {\n readonly name = \"claude\";\n private disposed = false;\n private readonly options: ClaudeBackendOptions;\n private cachedModels: ModelInfo[] | null = null;\n\n constructor(options: ClaudeBackendOptions) {\n this.options = options;\n }\n\n createAgent(config: FullAgentConfig): IAgent {\n if (this.disposed) throw new DisposedError(\"ClaudeAgentService\");\n return new ClaudeAgent(config, this.options);\n }\n\n async listModels(): Promise<ModelInfo[]> {\n if (this.disposed) throw new DisposedError(\"ClaudeAgentService\");\n if (this.cachedModels) return this.cachedModels;\n\n const token = this.options.oauthToken;\n if (!token) {\n return [];\n }\n\n const res = await globalThis.fetch(\n `${ANTHROPIC_MODELS_URL}?limit=100`,\n {\n headers: {\n Authorization: `Bearer ${token}`,\n \"anthropic-version\": ANTHROPIC_API_VERSION,\n \"anthropic-beta\": ANTHROPIC_OAUTH_BETA,\n },\n },\n );\n\n if (!res.ok) {\n return [];\n }\n\n const body = (await res.json()) as {\n data?: Array<{ id: string; display_name?: string; max_input_tokens?: number }>;\n };\n\n if (!body.data || body.data.length === 0) {\n return [];\n }\n\n this.cachedModels = body.data.map((m) => ({\n id: m.id,\n name: m.display_name,\n provider: \"claude\",\n ...(m.max_input_tokens != null && { contextWindow: m.max_input_tokens }),\n }));\n return this.cachedModels;\n }\n\n async validate(): Promise<ValidationResult> {\n if (this.disposed) throw new DisposedError(\"ClaudeAgentService\");\n\n const errors: string[] = [];\n try {\n await loadSDK();\n } catch (e) {\n errors.push(\n e instanceof Error ? e.message : String(e),\n );\n return { valid: false, errors };\n }\n\n // Verify CLI is accessible by attempting a minimal query\n try {\n const sdk = await loadSDK();\n const q = sdk.query({\n prompt: \"echo test\",\n options: {\n model: \"claude-sonnet-4-20250514\",\n pathToClaudeCodeExecutable: this.options.cliPath,\n cwd: this.options.workingDirectory,\n persistSession: false,\n maxTurns: 1,\n permissionMode: \"plan\",\n },\n });\n // Wait for first message (auth check)\n const first = await q.next();\n q.close();\n if (first.done) {\n errors.push(\"Claude CLI returned no messages — may not be authenticated.\");\n }\n } catch (e) {\n errors.push(\n `Failed to connect to Claude CLI: ${e instanceof Error ? e.message : String(e)}`,\n );\n }\n\n return { valid: errors.length === 0, errors };\n }\n\n async dispose(): Promise<void> {\n if (this.disposed) return;\n this.disposed = true;\n this.cachedModels = null;\n }\n}\n\n// ─── Factory ────────────────────────────────────────────────────\n\n/** Create Claude CLI backend service. */\nexport function createClaudeService(\n options: ClaudeBackendOptions,\n): IAgentService {\n return new ClaudeAgentService(options);\n}\n","import type {\n IAgent,\n IAgentService,\n FullAgentConfig,\n AgentResult,\n AgentEvent,\n Message,\n RunOptions,\n StructuredOutputConfig,\n ToolDefinition,\n VercelAIBackendOptions,\n ModelInfo,\n ValidationResult,\n JSONValue,\n PermissionRequest as UnifiedPermissionRequest,\n PermissionDecision,\n} from \"../types.js\";\nimport { getTextContent, ErrorCode, classifyAgentError, isRecoverableErrorCode } from \"../types.js\";\nimport { BaseAgent } from \"../base-agent.js\";\nimport { DisposedError, DependencyError, AbortError, ToolExecutionError } from \"../errors.js\";\nimport { zodToJsonSchema } from \"../utils/schema.js\";\nimport type { IPermissionStore } from \"../permission-store.js\";\n\nexport type { VercelAIBackendOptions } from \"../types.js\";\n\n// ─── Local Type Definitions (matching Vercel AI SDK v6 shapes) ──\n// Avoids requiring the SDK to be installed at compile time.\n\n/** @internal Vercel AI SDK tool result */\ninterface SDKToolDefinition {\n description: string;\n inputSchema: unknown;\n execute?: (input: unknown, options: unknown) => Promise<unknown>;\n needsApproval?: boolean | ((input: unknown, options: unknown) => Promise<boolean>);\n}\n\n/** @internal Vercel AI SDK v6 generateText result */\ninterface SDKGenerateTextResult {\n text: string;\n toolCalls: Array<{ toolCallId: string; toolName: string; input: unknown }>;\n toolResults: Array<{ toolCallId: string; toolName: string; output: unknown }>;\n steps: Array<{\n text: string;\n toolCalls: Array<{ toolCallId: string; toolName: string; input: unknown }>;\n toolResults: Array<{ toolCallId: string; toolName: string; output: unknown }>;\n usage: { inputTokens?: number; outputTokens?: number };\n finishReason: string;\n }>;\n totalUsage: { inputTokens?: number; outputTokens?: number };\n finishReason: string;\n response: { messages: unknown[] };\n}\n\n/** @internal Vercel AI SDK generateObject result */\ninterface SDKGenerateObjectResult {\n object: unknown;\n usage: { inputTokens?: number; outputTokens?: number };\n}\n\n/** @internal Vercel AI SDK streamText result */\ninterface SDKStreamTextResult {\n fullStream: AsyncIterable<SDKStreamPart>;\n totalUsage: PromiseLike<{ inputTokens?: number; outputTokens?: number }>;\n text: PromiseLike<string>;\n}\n\n/** @internal Vercel AI SDK v6 stream part union */\ntype SDKStreamPart =\n | { type: \"text-delta\"; text: string }\n | { type: \"tool-call\"; toolCallId: string; toolName: string; input: unknown }\n | { type: \"tool-result\"; toolCallId: string; toolName: string; output: unknown }\n | { type: \"tool-error\"; toolCallId: string; toolName: string; error: unknown }\n | { type: \"reasoning-start\" }\n | { type: \"reasoning-end\" }\n | { type: \"reasoning-delta\"; text: string }\n | { type: \"finish-step\"; usage: { inputTokens?: number; outputTokens?: number }; finishReason: string }\n | { type: \"finish\"; finishReason: string; totalUsage: { inputTokens?: number; outputTokens?: number } }\n | { type: \"error\"; error: unknown }\n | { type: string };\n\n/** @internal Vercel AI SDK LanguageModel — opaque type from SDK */\ntype SDKLanguageModel = Record<string, unknown>;\n\n/** @internal SDK module shape */\ninterface SDKModule {\n generateText: (options: Record<string, unknown>) => Promise<SDKGenerateTextResult>;\n streamText: (options: Record<string, unknown>) => SDKStreamTextResult;\n generateObject: (options: Record<string, unknown>) => Promise<SDKGenerateObjectResult>;\n tool: (options: Record<string, unknown>) => SDKToolDefinition;\n jsonSchema: (schema: unknown) => unknown;\n stepCountIs: (count: number) => unknown;\n}\n\n/** @internal OpenAI-compatible module shape */\ninterface SDKCompatModule {\n createOpenAICompatible: (options: Record<string, unknown>) => {\n chatModel: (modelId: string) => SDKLanguageModel;\n languageModel: (modelId: string) => SDKLanguageModel;\n };\n}\n\n// ─── Dynamic SDK Loader ─────────────────────────────────────────\n\n/** Module-level mocks set by _injectSDK()/_injectCompat() for testing */\nlet _sdkMock: SDKModule | null = null;\nlet _compatMock: SDKCompatModule | null = null;\n\n/** Load the Vercel AI SDK. Checks module-level mock first, then dynamic import. */\nasync function loadSDK(): Promise<SDKModule> {\n if (_sdkMock) return _sdkMock;\n try {\n // @ts-ignore — peer dependency, not present at compile time\n return (await import(\"ai\")) as SDKModule;\n } catch {\n throw new DependencyError(\"ai\");\n }\n}\n\n/** Load the OpenAI-compatible module. Checks module-level mock first, then dynamic import. */\nasync function loadCompat(): Promise<SDKCompatModule> {\n if (_compatMock) return _compatMock;\n try {\n // @ts-ignore — peer dependency, not present at compile time\n return (await import(\"@ai-sdk/openai-compatible\")) as SDKCompatModule;\n } catch {\n throw new DependencyError(\"@ai-sdk/openai-compatible\");\n }\n}\n\n/** @internal For testing: inject mock SDK module */\nexport function _injectSDK(mock: SDKModule | null): void {\n _sdkMock = mock;\n}\n\n/** @internal For testing: inject mock compat module */\nexport function _injectCompat(mock: SDKCompatModule | null): void {\n _compatMock = mock;\n}\n\n/** @internal For testing: reset injected SDK */\nexport function _resetSDK(): void {\n _sdkMock = null;\n _compatMock = null;\n}\n\n// ─── Constants ──────────────────────────────────────────────────\n\nconst DEFAULT_BASE_URL = \"https://openrouter.ai/api/v1\";\nconst DEFAULT_PROVIDER = \"openrouter\";\nconst DEFAULT_MAX_TURNS = 10;\n\n// ─── Tool Mapping ───────────────────────────────────────────────\n\nfunction mapToolsToSDK(\n sdk: SDKModule,\n tools: ToolDefinition[],\n config: FullAgentConfig,\n sessionApprovals: Set<string>,\n permissionStore: IPermissionStore | undefined,\n signal: AbortSignal,\n): Record<string, SDKToolDefinition> {\n const toolMap: Record<string, SDKToolDefinition> = {};\n const supervisor = config.supervisor;\n\n for (const ourTool of tools) {\n const jsonSchema = zodToJsonSchema(ourTool.parameters);\n\n toolMap[ourTool.name] = sdk.tool({\n description: ourTool.description,\n inputSchema: sdk.jsonSchema(jsonSchema),\n execute: wrapToolExecute(ourTool, supervisor, sessionApprovals, permissionStore, signal),\n ...(ourTool.needsApproval && supervisor?.onPermission\n ? {\n needsApproval: async (_input: Record<string, unknown>) => {\n // If already approved via store, skip\n if (permissionStore && await permissionStore.isApproved(ourTool.name)) return false;\n // If already session-approved, skip\n if (sessionApprovals.has(ourTool.name)) return false;\n return true; // will be handled in execute wrapper\n },\n }\n : {}),\n });\n }\n\n // M1: Inject built-in ask_user tool when supervisor.onAskUser is provided\n if (supervisor?.onAskUser) {\n const onAskUser = supervisor.onAskUser;\n toolMap[\"ask_user\"] = sdk.tool({\n description: \"Ask the user a question and wait for their response\",\n inputSchema: sdk.jsonSchema({\n type: \"object\",\n properties: {\n question: { type: \"string\", description: \"The question to ask the user\" },\n },\n required: [\"question\"],\n }),\n execute: async (args: { question: string }) => {\n const response = await onAskUser(\n { question: args.question, allowFreeform: true },\n signal,\n );\n return response.answer;\n },\n });\n }\n\n return toolMap;\n}\n\nfunction wrapToolExecute(\n ourTool: ToolDefinition,\n supervisor: FullAgentConfig[\"supervisor\"],\n sessionApprovals: Set<string>,\n permissionStore: IPermissionStore | undefined,\n signal: AbortSignal,\n): (args: unknown, options?: { toolCallId?: string }) => Promise<JSONValue> {\n return async (args: unknown, options?: { toolCallId?: string }): Promise<JSONValue> => {\n // Permission check for tools with needsApproval\n if (ourTool.needsApproval && supervisor?.onPermission) {\n // Check store first, then fall back to sessionApprovals set\n const storeApproved = permissionStore && await permissionStore.isApproved(ourTool.name);\n if (!storeApproved && !sessionApprovals.has(ourTool.name)) {\n const request: UnifiedPermissionRequest = {\n toolName: ourTool.name,\n toolArgs: (args ?? {}) as Record<string, unknown>,\n toolCallId: options?.toolCallId,\n };\n\n const decision: PermissionDecision = await supervisor.onPermission(\n request,\n signal,\n );\n\n if (!decision.allowed) {\n throw new ToolExecutionError(\n ourTool.name,\n decision.reason ?? \"Permission denied\",\n );\n }\n\n // Persist approval to store if available\n if (permissionStore && decision.scope) {\n await permissionStore.approve(ourTool.name, decision.scope);\n }\n\n // Cache session-scoped approvals in memory\n if (decision.scope === \"session\" || decision.scope === \"always\" || decision.scope === \"project\") {\n sessionApprovals.add(ourTool.name);\n }\n\n // Use modified input if provided\n if (decision.modifiedInput) {\n args = decision.modifiedInput;\n }\n }\n }\n\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const result = await ourTool.execute(args as any);\n return result as JSONValue;\n } catch (e) {\n if (e instanceof ToolExecutionError) throw e;\n throw new ToolExecutionError(\n ourTool.name,\n e instanceof Error ? e.message : String(e),\n );\n }\n };\n}\n\n// ─── Message Conversion ─────────────────────────────────────────\n\nfunction messagesToSDK(messages: Message[]): Array<Record<string, unknown>> {\n return messages.map((msg) => {\n switch (msg.role) {\n case \"user\":\n return { role: \"user\", content: getTextContent(msg.content) };\n case \"assistant\": {\n let content = getTextContent(msg.content);\n const thinking = msg.thinking;\n if (thinking) {\n content = `[reasoning: ${thinking}]\\n${content}`;\n }\n const mapped: Record<string, unknown> = { role: \"assistant\", content };\n if (msg.toolCalls && msg.toolCalls.length > 0) {\n mapped.toolCalls = msg.toolCalls.map((tc) => ({\n id: tc.id,\n name: tc.name,\n args: tc.args,\n }));\n }\n return mapped;\n }\n case \"system\":\n return { role: \"system\", content: msg.content };\n case \"tool\": {\n if (msg.toolResults && msg.toolResults.length > 0) {\n return {\n role: \"tool\",\n toolResults: msg.toolResults.map((tr) => ({\n toolCallId: tr.toolCallId,\n name: tr.name,\n result: tr.result,\n isError: tr.isError ?? false,\n })),\n };\n }\n return { role: \"tool\", content: msg.content ?? \"\" };\n }\n default:\n return { role: \"user\", content: \"\" };\n }\n });\n}\n\n// ─── Event Mapping (fullStream → AgentEvent) ────────────────────\n\nfunction mapStreamPart(part: SDKStreamPart): AgentEvent | null {\n switch (part.type) {\n case \"text-delta\": {\n const p = part as Extract<SDKStreamPart, { type: \"text-delta\" }>;\n return { type: \"text_delta\", text: p.text ?? \"\" };\n }\n\n case \"tool-call\": {\n const p = part as Extract<SDKStreamPart, { type: \"tool-call\" }>;\n return {\n type: \"tool_call_start\",\n toolCallId: String(p.toolCallId ?? \"\"),\n toolName: p.toolName ?? \"unknown\",\n args: (p.input ?? {}) as JSONValue,\n };\n }\n\n case \"tool-result\": {\n const p = part as Extract<SDKStreamPart, { type: \"tool-result\" }>;\n return {\n type: \"tool_call_end\",\n toolCallId: String(p.toolCallId ?? \"\"),\n toolName: p.toolName ?? \"unknown\",\n result: (p.output ?? null) as JSONValue,\n };\n }\n\n case \"tool-error\": {\n const p = part as Extract<SDKStreamPart, { type: \"tool-error\" }>;\n return {\n type: \"error\",\n error: p.error instanceof Error\n ? p.error.message\n : String(p.error ?? \"Tool execution failed\"),\n recoverable: true,\n code: ErrorCode.TOOL_EXECUTION,\n };\n }\n\n case \"reasoning-start\":\n return { type: \"thinking_start\" };\n\n case \"reasoning-end\":\n return { type: \"thinking_end\" };\n\n case \"reasoning-delta\": {\n const p = part as Extract<SDKStreamPart, { type: \"reasoning-delta\" }>;\n return { type: \"thinking_delta\", text: p.text ?? \"\" };\n }\n\n case \"finish-step\": {\n const p = part as Extract<SDKStreamPart, { type: \"finish-step\" }>;\n return {\n type: \"usage_update\",\n promptTokens: Number(p.usage?.inputTokens ?? 0),\n completionTokens: Number(p.usage?.outputTokens ?? 0),\n };\n }\n\n case \"error\": {\n const p = part as Extract<SDKStreamPart, { type: \"error\" }>;\n const errorMsg = p.error instanceof Error\n ? p.error.message\n : String(p.error ?? \"Unknown error\");\n const code = classifyAgentError(errorMsg);\n return {\n type: \"error\",\n error: errorMsg,\n recoverable: isRecoverableErrorCode(code),\n code,\n };\n }\n\n default:\n return null;\n }\n}\n\n// ─── VercelAIAgent ──────────────────────────────────────────────\n\nclass VercelAIAgent extends BaseAgent {\n protected readonly backendName = \"vercel-ai\";\n private readonly backendOptions: VercelAIBackendOptions;\n private readonly sessionApprovals = new Set<string>();\n private model: SDKLanguageModel | null = null;\n\n constructor(\n config: FullAgentConfig,\n backendOptions: VercelAIBackendOptions,\n ) {\n super(config);\n this.backendOptions = backendOptions;\n }\n\n private async getModel(options: RunOptions): Promise<SDKLanguageModel> {\n const requestedModel = options.model;\n const defaultModel = this.config.model;\n\n // If same as default/cached, reuse\n if (requestedModel === defaultModel && this.model) return this.model;\n\n const compat = await loadCompat();\n const provider = compat.createOpenAICompatible({\n name: this.backendOptions.provider ?? DEFAULT_PROVIDER,\n baseURL: this.backendOptions.baseUrl ?? DEFAULT_BASE_URL,\n apiKey: this.backendOptions.apiKey,\n });\n\n const model = provider.chatModel(requestedModel);\n // Cache only when using default model\n if (requestedModel === defaultModel) {\n this.model = model;\n }\n return model;\n }\n\n private async getSDKTools(signal: AbortSignal, options?: RunOptions): Promise<Record<string, SDKToolDefinition>> {\n const sdk = await loadSDK();\n const tools = this.resolveTools(options);\n return mapToolsToSDK(sdk, tools, this.config, this.sessionApprovals, this.config.permissionStore, signal);\n }\n\n // ─── executeRun ─────────────────────────────────────────────────\n\n protected async executeRun(\n messages: Message[],\n options: RunOptions,\n signal: AbortSignal,\n ): Promise<AgentResult> {\n this.checkAbort(signal);\n\n const sdk = await loadSDK();\n const model = await this.getModel(options);\n const tools = await this.getSDKTools(signal, options);\n const maxTurns = this.config.maxTurns ?? DEFAULT_MAX_TURNS;\n\n const sdkMessages = messagesToSDK(messages);\n const hasTools = Object.keys(tools).length > 0;\n\n const result: SDKGenerateTextResult = await sdk.generateText({\n model,\n system: this.config.systemPrompt,\n messages: sdkMessages,\n tools: hasTools ? tools : undefined,\n stopWhen: sdk.stepCountIs(maxTurns),\n abortSignal: signal,\n ...(this.config.modelParams?.temperature !== undefined && {\n temperature: this.config.modelParams.temperature,\n }),\n ...(this.config.modelParams?.maxTokens !== undefined && {\n maxTokens: this.config.modelParams.maxTokens,\n }),\n ...(this.config.modelParams?.topP !== undefined && {\n topP: this.config.modelParams.topP,\n }),\n ...(this.config.providerOptions && {\n providerOptions: this.config.providerOptions,\n }),\n });\n\n // Collect all tool calls across all steps\n const toolCalls: AgentResult[\"toolCalls\"] = [];\n for (const step of result.steps) {\n for (const tc of step.toolCalls) {\n const matchingResult = step.toolResults.find(\n (tr) => tr.toolCallId === tc.toolCallId,\n );\n toolCalls.push({\n toolName: tc.toolName,\n args: (tc.input ?? {}) as JSONValue,\n result: (matchingResult?.output ?? null) as JSONValue,\n approved: true,\n });\n }\n }\n\n const usage = {\n promptTokens: Number(result.totalUsage?.inputTokens ?? 0),\n completionTokens: Number(result.totalUsage?.outputTokens ?? 0),\n };\n\n // In multi-step flows, result.text includes intermediate reasoning from all steps.\n // Use only the last step's text as the final output.\n const lastStep = result.steps.length > 0 ? result.steps[result.steps.length - 1] : null;\n const outputText = lastStep?.text || null;\n\n return {\n output: outputText,\n structuredOutput: undefined as AgentResult[\"structuredOutput\"],\n toolCalls,\n messages: [\n ...messages,\n ...(outputText\n ? [{ role: \"assistant\" as const, content: outputText }]\n : []),\n ],\n usage,\n };\n }\n\n // ─── executeRunStructured ───────────────────────────────────────\n\n protected async executeRunStructured<T>(\n messages: Message[],\n schema: StructuredOutputConfig<T>,\n options: RunOptions,\n signal: AbortSignal,\n ): Promise<AgentResult<T>> {\n this.checkAbort(signal);\n\n const sdk = await loadSDK();\n const model = await this.getModel(options);\n\n const sdkMessages = messagesToSDK(messages);\n const jsonSchema = zodToJsonSchema(schema.schema);\n\n const result: SDKGenerateObjectResult = await sdk.generateObject({\n model,\n system: this.config.systemPrompt,\n messages: sdkMessages,\n schema: sdk.jsonSchema(jsonSchema),\n schemaName: schema.name,\n schemaDescription: schema.description,\n abortSignal: signal,\n ...(this.config.modelParams?.temperature !== undefined && {\n temperature: this.config.modelParams.temperature,\n }),\n ...(this.config.modelParams?.maxTokens !== undefined && {\n maxTokens: this.config.modelParams.maxTokens,\n }),\n ...(this.config.providerOptions && {\n providerOptions: this.config.providerOptions,\n }),\n });\n\n // Validate and parse through our zod schema\n let structuredOutput: T | undefined;\n try {\n structuredOutput = schema.schema.parse(result.object);\n } catch {\n // If zod validation fails, leave undefined\n }\n\n const usage = {\n promptTokens: Number(result.usage?.inputTokens ?? 0),\n completionTokens: Number(result.usage?.outputTokens ?? 0),\n };\n\n return {\n output: JSON.stringify(result.object),\n structuredOutput: structuredOutput as AgentResult<T>[\"structuredOutput\"],\n toolCalls: [],\n messages: [\n ...messages,\n ...(result.object != null\n ? [{ role: \"assistant\" as const, content: JSON.stringify(result.object) }]\n : []),\n ],\n usage,\n };\n }\n\n // ─── executeStream ──────────────────────────────────────────────\n\n protected async *executeStream(\n messages: Message[],\n options: RunOptions,\n signal: AbortSignal,\n ): AsyncIterable<AgentEvent> {\n this.checkAbort(signal);\n\n const sdk = await loadSDK();\n const model = await this.getModel(options);\n const tools = await this.getSDKTools(signal, options);\n const maxTurns = this.config.maxTurns ?? DEFAULT_MAX_TURNS;\n\n const sdkMessages = messagesToSDK(messages);\n const hasTools = Object.keys(tools).length > 0;\n\n const result: SDKStreamTextResult = sdk.streamText({\n model,\n system: this.config.systemPrompt,\n messages: sdkMessages,\n tools: hasTools ? tools : undefined,\n stopWhen: sdk.stepCountIs(maxTurns),\n abortSignal: signal,\n ...(this.config.modelParams?.temperature !== undefined && {\n temperature: this.config.modelParams.temperature,\n }),\n ...(this.config.modelParams?.maxTokens !== undefined && {\n maxTokens: this.config.modelParams.maxTokens,\n }),\n ...(this.config.modelParams?.topP !== undefined && {\n topP: this.config.modelParams.topP,\n }),\n ...(this.config.providerOptions && {\n providerOptions: this.config.providerOptions,\n }),\n });\n\n let finalText = \"\";\n let lastFinishReason: string | undefined;\n\n try {\n for await (const part of result.fullStream) {\n if (signal.aborted) throw new AbortError();\n\n const event = mapStreamPart(part as SDKStreamPart);\n if (event) yield event;\n\n if ((part as SDKStreamPart).type === \"text-delta\") {\n finalText += (part as Extract<SDKStreamPart, { type: \"text-delta\" }>).text ?? \"\";\n }\n\n // When a step finishes with tool calls, the text accumulated so far is\n // intermediate reasoning (e.g. \"Let me search...\"). Reset so that only\n // the final step's text becomes the output.\n if ((part as SDKStreamPart).type === \"finish-step\") {\n const p = part as Extract<SDKStreamPart, { type: \"finish-step\" }>;\n lastFinishReason = p.finishReason;\n if (p.finishReason === \"tool-calls\") {\n finalText = \"\";\n }\n }\n\n // The final `finish` part carries the overall finishReason\n if ((part as SDKStreamPart).type === \"finish\") {\n const p = part as Extract<SDKStreamPart, { type: \"finish\" }>;\n lastFinishReason = p.finishReason;\n }\n }\n\n // Emit final usage from totalUsage\n const totalUsage = await result.totalUsage;\n yield {\n type: \"usage_update\",\n promptTokens: Number(totalUsage?.inputTokens ?? 0),\n completionTokens: Number(totalUsage?.outputTokens ?? 0),\n };\n\n const hasStreamed = finalText.length > 0;\n yield {\n type: \"done\",\n finalOutput: hasStreamed ? null : (finalText || null),\n ...(hasStreamed ? { streamed: true } : {}),\n ...(lastFinishReason ? { finishReason: lastFinishReason } : {}),\n };\n } catch (e) {\n if (signal.aborted) throw new AbortError();\n throw e;\n }\n }\n\n override dispose(): void {\n this.sessionApprovals.clear();\n this.model = null;\n super.dispose();\n }\n}\n\n// ─── VercelAIAgentService ───────────────────────────────────────\n\nclass VercelAIAgentService implements IAgentService {\n readonly name = \"vercel-ai\";\n private disposed = false;\n private readonly options: VercelAIBackendOptions;\n\n constructor(options: VercelAIBackendOptions) {\n this.options = options;\n }\n\n createAgent(config: FullAgentConfig): IAgent {\n if (this.disposed) throw new DisposedError(\"VercelAIAgentService\");\n return new VercelAIAgent(config, this.options);\n }\n\n async listModels(): Promise<ModelInfo[]> {\n if (this.disposed) throw new DisposedError(\"VercelAIAgentService\");\n\n const baseUrl = (this.options.baseUrl || \"https://api.openai.com/v1\").replace(/\\/+$/, \"\");\n\n try {\n const res = await globalThis.fetch(`${baseUrl}/models`, {\n headers: {\n Authorization: `Bearer ${this.options.apiKey}`,\n // OpenRouter requires HTTP-Referer for API access\n \"HTTP-Referer\": \"https://github.com/nicepkg/agent-sdk\",\n },\n });\n\n if (!res.ok) {\n return [];\n }\n\n const body = await res.json() as Record<string, unknown>;\n\n // OpenAI-compatible format: { data: [{ id, name?, description?, context_length? }] }\n if (body.data && Array.isArray(body.data)) {\n return (body.data as Array<Record<string, unknown>>)\n .filter((m) => typeof m.id === \"string\")\n .map((m) => ({\n id: m.id as string,\n ...(typeof m.name === \"string\" && { name: m.name }),\n ...(typeof m.description === \"string\" && { description: m.description }),\n ...(typeof m.context_length === \"number\" && { contextWindow: m.context_length }),\n }));\n }\n\n // Some providers return a flat array of model objects\n if (Array.isArray(body)) {\n return (body as Array<Record<string, unknown>>)\n .filter((m) => typeof m.id === \"string\")\n .map((m) => ({\n id: m.id as string,\n ...(typeof m.name === \"string\" && { name: m.name }),\n ...(typeof m.description === \"string\" && { description: m.description }),\n ...(typeof m.context_length === \"number\" && { contextWindow: m.context_length }),\n }));\n }\n\n return [];\n } catch {\n return [];\n }\n }\n\n async validate(): Promise<ValidationResult> {\n if (this.disposed) throw new DisposedError(\"VercelAIAgentService\");\n\n const errors: string[] = [];\n\n if (!this.options.apiKey) {\n errors.push(\"apiKey is required for Vercel AI backend.\");\n }\n\n try {\n await loadSDK();\n } catch (e) {\n errors.push(e instanceof Error ? e.message : String(e));\n }\n\n try {\n await loadCompat();\n } catch (e) {\n errors.push(e instanceof Error ? e.message : String(e));\n }\n\n return { valid: errors.length === 0, errors };\n }\n\n async dispose(): Promise<void> {\n if (this.disposed) return;\n this.disposed = true;\n }\n}\n\n// ─── Factory ────────────────────────────────────────────────────\n\n/** Create Vercel AI SDK backend service. */\nexport function createVercelAIService(\n options: VercelAIBackendOptions,\n): IAgentService {\n return new VercelAIAgentService(options);\n}\n","/**\n * @witqq/agent-sdk — Chat domain types\n *\n * All type definitions and interfaces for the chat layer.\n * Pure types + ChatId generation (tightly coupled to branded type).\n */\n\nimport type { UsageData, ToolDefinition, ErrorCode } from \"../types.js\";\nimport type { AuthToken } from \"../auth/types.js\";\n\n// ─── Unique ID ─────────────────────────────────────────────────\n\n/** Branded type for unique identifiers */\nexport type ChatId = string & { readonly __brand: \"ChatId\" };\n\n/**\n * Generate a new unique ChatId (crypto.randomUUID-based)\n * @returns Branded ChatId string\n */\nexport function createChatId(): ChatId {\n return crypto.randomUUID() as ChatId;\n}\n\n/** UUID v4 pattern for ChatId validation */\nconst UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;\n\n/**\n * Cast a string to ChatId with UUID format validation.\n * Use this instead of manual `as ChatId` type assertions.\n *\n * @param value - String to validate and cast\n * @returns Branded ChatId\n * @throws {TypeError} If value is not a valid UUID v4 format\n */\nexport function toChatId(value: string): ChatId {\n if (!UUID_RE.test(value)) {\n throw new TypeError(`Invalid ChatId: \"${value}\" is not a valid UUID`);\n }\n return value as ChatId;\n}\n\n/**\n * Accepts either a plain string or branded ChatId for API convenience.\n * Use this in public API signatures so consumers don't need `as ChatId` casts.\n */\nexport type ChatIdLike = string | ChatId;\n\n// ─── Status Types ──────────────────────────────────────────────\n\n/** Lifecycle status of a message part (text, reasoning, etc.) */\nexport type PartStatus = \"pending\" | \"streaming\" | \"complete\" | \"error\";\n/** Lifecycle status of a tool call within a message */\nexport type ToolCallStatus = \"pending\" | \"running\" | \"requires_approval\" | \"complete\" | \"error\" | \"denied\";\n/** Lifecycle status of an entire message */\nexport type MessageStatus = \"pending\" | \"streaming\" | \"complete\" | \"error\" | \"cancelled\";\n/** Lifecycle status of a chat session */\nexport type SessionStatus = \"active\";\n/** Lifecycle status of the chat runtime */\nexport type RuntimeStatus = \"idle\" | \"streaming\" | \"error\" | \"disposed\";\n\n// ─── Message Parts (union) ─────────────────────────────────────\n\n/** Plain text content part */\nexport interface TextPart { type: \"text\"; text: string; status: PartStatus; }\n/** Model reasoning/thinking content part */\nexport interface ReasoningPart { type: \"reasoning\"; text: string; status: PartStatus; }\n/** Tool invocation part with call ID, arguments, optional result */\nexport interface ToolCallPart { type: \"tool_call\"; toolCallId: string; name: string; args: unknown; result?: unknown; status: ToolCallStatus; error?: string; }\n/** Source reference part (URL citation) */\nexport interface SourcePart { type: \"source\"; url: string; title?: string; status: PartStatus; }\n/** File attachment part (base64-encoded data) */\nexport interface FilePart { type: \"file\"; name: string; mimeType: string; data: string; status: PartStatus; }\n/** Union of all message part types */\nexport type MessagePart = TextPart | ReasoningPart | ToolCallPart | SourcePart | FilePart;\n\n// ─── Chat Message ──────────────────────────────────────────────\n\n/** Role of message author */\nexport type ChatRole = \"user\" | \"assistant\" | \"system\";\n\n/** Metadata attached to messages — useful preset for the TMetadata generic */\nexport interface ChatMessageMetadata {\n model?: string;\n backend?: string;\n usage?: UsageData;\n isSummary?: boolean;\n estimatedTokens?: number;\n custom?: Record<string, unknown>;\n}\n\n/** Message status */\nexport type ChatMessageStatus = MessageStatus;\n\n/** A single chat message — the fundamental unit of conversation */\nexport interface ChatMessage<TMetadata = unknown> {\n id: ChatId;\n role: ChatRole;\n parts: MessagePart[];\n metadata?: TMetadata;\n createdAt: string;\n updatedAt?: string;\n status: MessageStatus;\n}\n\n// ─── Supporting Types ──────────────────────────────────────────\n\n// ─── Chat Session ──────────────────────────────────────────────\n\n/** Session configuration snapshot */\nexport interface ChatSessionConfig {\n model: string;\n backend: string;\n systemPrompt?: string;\n temperature?: number;\n maxTokens?: number;\n}\n\n/**\n * Session metadata tracking usage statistics and custom extensions.\n *\n * Updated automatically by session stores on each `addMessage()` call.\n * The generic `TCustom` parameter allows type-safe application-specific\n * metadata via the `custom` field.\n *\n * @typeParam TCustom - Shape of the `custom` field (defaults to `Record<string, unknown>`)\n */\nexport interface ChatSessionMetadata<TCustom extends Record<string, unknown> = Record<string, unknown>> {\n /** Number of messages in the session (updated by session store) */\n messageCount: number;\n /** Total token count across all messages in the session */\n totalTokens: number;\n /** Optional tags for session categorization and filtering */\n tags?: string[];\n /** Application-specific metadata — typed via the TCustom generic parameter */\n custom?: TCustom;\n}\n\n/** Chat session — a conversation with ordered messages (pure serializable data) */\nexport interface ChatSession<TCustom extends Record<string, unknown> = Record<string, unknown>> {\n id: ChatId;\n title?: string;\n messages: ChatMessage[];\n config: ChatSessionConfig;\n metadata: ChatSessionMetadata<TCustom>;\n status: SessionStatus;\n createdAt: string;\n updatedAt: string;\n backendSessionId?: string;\n}\n\n/**\n * Reactive wrapper around ChatSession — provides subscribe/getSnapshot for\n * React useSyncExternalStore integration and lastMessage convenience getter.\n * Session stores may optionally return ObservableSession instances.\n */\nexport interface ObservableSession<TCustom extends Record<string, unknown> = Record<string, unknown>>\n extends ChatSession<TCustom> {\n /** Subscribe to session changes (for React useSyncExternalStore) */\n subscribe(callback: () => void): () => void;\n /** Get immutable snapshot of session state (for React useSyncExternalStore) */\n getSnapshot(): ChatSession<TCustom>;\n /** Last message in the session */\n readonly lastMessage: ChatMessage | undefined;\n}\n\n/** Lightweight session info for listing (without full message array) */\nexport interface SessionInfo {\n id: ChatId;\n title?: string;\n status: SessionStatus;\n messageCount: number;\n lastMessage?: ChatMessage;\n createdAt: string;\n updatedAt: string;\n}\n\n// ─── Chat Events ───────────────────────────────────────────────\n\n/** Events emitted during chat operation */\nexport type ChatEvent =\n | { type: \"message:start\"; messageId: ChatId; role: ChatRole }\n | { type: \"message:delta\"; messageId: ChatId; text: string }\n | { type: \"message:complete\"; messageId: ChatId; message: ChatMessage }\n | {\n type: \"tool:start\";\n messageId: ChatId;\n toolCallId: string;\n toolName: string;\n args: Record<string, unknown>;\n }\n | {\n type: \"tool:complete\";\n messageId: ChatId;\n toolCallId: string;\n toolName: string;\n result: unknown;\n isError?: boolean;\n }\n | { type: \"thinking:start\"; messageId: ChatId }\n | { type: \"thinking:delta\"; messageId: ChatId; text: string }\n | { type: \"thinking:end\"; messageId: ChatId }\n | {\n type: \"permission:request\";\n messageId: ChatId;\n toolName: string;\n toolArgs: Record<string, unknown>;\n }\n | {\n type: \"permission:response\";\n messageId: ChatId;\n toolName: string;\n allowed: boolean;\n }\n | {\n type: \"usage\";\n promptTokens: number;\n completionTokens: number;\n model?: string;\n }\n | { type: \"session:created\"; sessionId: ChatId }\n | { type: \"session:updated\"; sessionId: ChatId }\n | {\n type: \"error\";\n error: string;\n recoverable: boolean;\n code?: ErrorCode;\n messageId?: ChatId;\n }\n | { type: \"typing:start\" }\n | { type: \"typing:end\" }\n | { type: \"heartbeat\" }\n | { type: \"done\"; finalOutput?: string; finishReason?: string };\n\n/** All possible ChatEvent type strings */\nexport type ChatEventType = ChatEvent[\"type\"];\n\n// ─── Chat Middleware ───────────────────────────────────────────\n\n/** Context passed to ChatMiddleware hooks */\nexport interface ChatMiddlewareContext {\n sessionId: ChatId;\n signal: AbortSignal;\n}\n\n/** Runtime-level middleware for the send/receive lifecycle.\n * Different from EventMiddleware which operates at the event bus level. */\nexport interface ChatMiddleware {\n /** Transform message before sending to backend. Return null to reject the send. */\n onBeforeSend?(message: ChatMessage, context: ChatMiddlewareContext): ChatMessage | null | Promise<ChatMessage | null>;\n /** Transform/intercept stream events */\n onEvent?(event: ChatEvent, context: ChatMiddlewareContext): ChatEvent | null | Promise<ChatEvent | null>;\n /** Transform completed message after receiving from backend */\n onAfterReceive?(message: ChatMessage, context: ChatMiddlewareContext): ChatMessage | Promise<ChatMessage>;\n /** Intercept errors — return null to suppress, return error to propagate */\n onError?(error: Error, context: ChatMiddlewareContext): Error | null | Promise<Error | null>;\n}\n\n// ─── Chat Provider Abstraction ─────────────────────────────────\n\n/** Options for sending a message to a provider */\nexport interface SendMessageOptions {\n signal?: AbortSignal;\n /** Model to use for this request. Required for server-side runtime.send(). */\n model?: string;\n /** Per-call system prompt override (forwarded to the backend agent) */\n systemPrompt?: string;\n context?: Record<string, unknown>;\n /** Additional tools to include in this request */\n tools?: ToolDefinition[];\n}\n\n/** Options for runtime.send() — requires backend routing info */\nexport interface RuntimeSendOptions {\n /** Backend to route this request to (key in backends map) */\n backend: string;\n /** Authentication credentials for the backend factory */\n credentials: AuthToken;\n /** Model to use for this request */\n model: string;\n /** Per-call system prompt override (forwarded to the backend agent) */\n systemPrompt?: string;\n /** Abort signal */\n signal?: AbortSignal;\n /** Request-scoped context */\n context?: Record<string, unknown>;\n /** Additional tools */\n tools?: ToolDefinition[];\n}\n\n/**\n * @deprecated IChatProvider has been inlined into IChatBackend.\n * Import IChatBackend from \"@witqq/agent-sdk/chat/backends\" instead.\n * Kept as type alias for backward compatibility.\n */\nexport type IChatProvider = import(\"./backends/types.js\").IChatBackend;\n\n// ─── Factory Functions ─────────────────────────────────────────\n\n/**\n * Create a simple text ChatMessage.\n *\n * @param text - Message text content\n * @param role - Message role (default: \"user\")\n * @returns A complete ChatMessage with a single TextPart\n */\nexport function createTextMessage(text: string, role: ChatRole = \"user\"): ChatMessage {\n return {\n id: createChatId(),\n role,\n parts: [{ type: \"text\", text, status: \"complete\" }],\n createdAt: new Date().toISOString(),\n status: \"complete\",\n };\n}\n\n/** Type guard: checks if a session has reactive API (subscribe/getSnapshot) */\nexport function isObservableSession<TCustom extends Record<string, unknown> = Record<string, unknown>>(\n session: ChatSession<TCustom>,\n): session is ObservableSession<TCustom> {\n return \"subscribe\" in session && typeof (session as ObservableSession<TCustom>).subscribe === \"function\"\n && \"getSnapshot\" in session && typeof (session as ObservableSession<TCustom>).getSnapshot === \"function\";\n}\n","/**\n * @witqq/agent-sdk — Chat utility functions\n */\n\nimport type { ChatMessage, TextPart, ToolCallPart, ReasoningPart } from \"./types.js\";\nexport { createChatId, toChatId } from \"./types.js\";\n\n/**\n * Join all TextPart texts in a message\n */\nexport function getMessageText(message: ChatMessage): string {\n return message.parts\n .filter((p): p is TextPart => p.type === \"text\")\n .map((p) => p.text)\n .join(\"\");\n}\n\n/**\n * Filter all ToolCallParts from a message\n */\nexport function getMessageToolCalls(message: ChatMessage): ToolCallPart[] {\n return message.parts.filter((p): p is ToolCallPart => p.type === \"tool_call\");\n}\n\n/**\n * Join all ReasoningPart texts in a message\n */\nexport function getMessageReasoning(message: ChatMessage): string {\n return message.parts\n .filter((p): p is ReasoningPart => p.type === \"reasoning\")\n .map((p) => p.text)\n .join(\"\");\n}\n","/**\n * @witqq/agent-sdk — Chat type guards\n */\n\nimport type {\n ChatMessage,\n ChatSession,\n MessagePart,\n TextPart,\n ToolCallPart,\n ReasoningPart,\n SourcePart,\n FilePart,\n ChatEvent,\n} from \"./types.js\";\n\n/** Check if a value is a ChatMessage */\nexport function isChatMessage(value: unknown): value is ChatMessage {\n if (typeof value !== \"object\" || value === null) return false;\n const obj = value as Record<string, unknown>;\n return (\n typeof obj.id === \"string\" &&\n typeof obj.role === \"string\" &&\n (obj.role === \"user\" || obj.role === \"assistant\" || obj.role === \"system\") &&\n Array.isArray(obj.parts) &&\n typeof obj.createdAt === \"string\" &&\n typeof obj.status === \"string\"\n );\n}\n\n/** Check if a value is a ChatSession */\nexport function isChatSession(value: unknown): value is ChatSession {\n if (typeof value !== \"object\" || value === null) return false;\n const obj = value as Record<string, unknown>;\n return (\n typeof obj.id === \"string\" &&\n Array.isArray(obj.messages) &&\n typeof obj.config === \"object\" &&\n obj.config !== null &&\n typeof obj.createdAt === \"string\" &&\n typeof obj.updatedAt === \"string\" &&\n typeof obj.status === \"string\"\n );\n}\n\n/** Check if a value is a MessagePart */\nexport function isMessagePart(value: unknown): value is MessagePart {\n if (typeof value !== \"object\" || value === null) return false;\n const obj = value as Record<string, unknown>;\n return (\n typeof obj.type === \"string\" &&\n (obj.type === \"text\" || obj.type === \"reasoning\" || obj.type === \"tool_call\" || obj.type === \"source\" || obj.type === \"file\")\n );\n}\n\n/** Check if a value is a TextPart */\nexport function isTextPart(value: unknown): value is TextPart {\n if (typeof value !== \"object\" || value === null) return false;\n const obj = value as Record<string, unknown>;\n return obj.type === \"text\" && typeof obj.text === \"string\";\n}\n\n/** Check if a value is a ToolCallPart */\nexport function isToolCallPart(value: unknown): value is ToolCallPart {\n if (typeof value !== \"object\" || value === null) return false;\n const obj = value as Record<string, unknown>;\n return obj.type === \"tool_call\" && typeof obj.toolCallId === \"string\" && typeof obj.name === \"string\";\n}\n\n/** Check if a value is a ReasoningPart */\nexport function isReasoningPart(value: unknown): value is ReasoningPart {\n if (typeof value !== \"object\" || value === null) return false;\n const obj = value as Record<string, unknown>;\n return obj.type === \"reasoning\" && typeof obj.text === \"string\";\n}\n\n/** Check if a value is a SourcePart */\nexport function isSourcePart(value: unknown): value is SourcePart {\n if (typeof value !== \"object\" || value === null) return false;\n const obj = value as Record<string, unknown>;\n return obj.type === \"source\" && typeof obj.url === \"string\";\n}\n\n/** Check if a value is a FilePart */\nexport function isFilePart(value: unknown): value is FilePart {\n if (typeof value !== \"object\" || value === null) return false;\n const obj = value as Record<string, unknown>;\n return obj.type === \"file\" && typeof obj.name === \"string\" && typeof obj.mimeType === \"string\";\n}\n\nconst VALID_CHAT_EVENT_TYPES: ReadonlySet<string> = new Set([\n \"message:start\", \"message:delta\", \"message:complete\",\n \"tool:start\", \"tool:complete\",\n \"thinking:start\", \"thinking:delta\", \"thinking:end\",\n \"permission:request\", \"permission:response\",\n \"usage\", \"session:created\", \"session:updated\",\n \"error\", \"typing:start\", \"typing:end\", \"heartbeat\", \"done\",\n]);\n\n/** Check if a value is a ChatEvent */\nexport function isChatEvent(value: unknown): value is ChatEvent {\n if (typeof value !== \"object\" || value === null) return false;\n const obj = value as Record<string, unknown>;\n return VALID_CHAT_EVENT_TYPES.has(obj.type as string);\n}\n","/**\n * @witqq/agent-sdk — AgentEvent ↔ ChatEvent bridge\n */\n\nimport type { AgentEvent, JSONValue } from \"../types.js\";\nimport type { ChatId, ChatEvent } from \"./types.js\";\n\n/**\n * Map a single AgentEvent to a ChatEvent (or null if no mapping)\n */\nexport function agentEventToChatEvent(\n event: AgentEvent,\n messageId: ChatId,\n): ChatEvent | null {\n switch (event.type) {\n case \"text_delta\":\n return { type: \"message:delta\", messageId, text: event.text };\n case \"thinking_start\":\n return { type: \"thinking:start\", messageId };\n case \"thinking_delta\":\n return { type: \"thinking:delta\", messageId, text: event.text };\n case \"thinking_end\":\n return { type: \"thinking:end\", messageId };\n case \"tool_call_start\":\n return {\n type: \"tool:start\",\n messageId,\n toolCallId: event.toolCallId,\n toolName: event.toolName,\n args: event.args as Record<string, unknown>,\n };\n case \"tool_call_end\":\n return {\n type: \"tool:complete\",\n messageId,\n toolCallId: event.toolCallId,\n toolName: event.toolName,\n result: event.result,\n };\n case \"permission_request\":\n return {\n type: \"permission:request\",\n messageId,\n toolName: event.request.toolName,\n toolArgs: event.request.toolArgs,\n };\n case \"permission_response\":\n return {\n type: \"permission:response\",\n messageId,\n toolName: event.toolName,\n allowed: event.decision.allowed,\n };\n case \"usage_update\":\n return {\n type: \"usage\",\n promptTokens: event.promptTokens,\n completionTokens: event.completionTokens,\n model: event.model,\n };\n case \"error\":\n return {\n type: \"error\",\n error: event.error,\n recoverable: event.recoverable,\n code: event.code,\n messageId,\n };\n case \"heartbeat\":\n return { type: \"heartbeat\" };\n case \"ask_user\":\n case \"ask_user_response\":\n case \"session_info\":\n return null;\n case \"done\":\n return { type: \"done\", finalOutput: event.finalOutput ?? undefined, finishReason: event.finishReason };\n default:\n return null;\n }\n}\n\n/**\n * Convert AgentEvent async iterable to ChatEvent async iterable\n */\nexport async function* adaptAgentEvents(\n events: AsyncIterable<AgentEvent>,\n messageId: ChatId,\n): AsyncIterable<ChatEvent> {\n for await (const event of events) {\n const chatEvent = agentEventToChatEvent(event, messageId);\n if (chatEvent !== null) {\n yield chatEvent;\n }\n }\n}\n\n/**\n * Map a ChatEvent back to an AgentEvent for accumulator consumption.\n * Returns null for events that don't map to accumulator-relevant AgentEvents.\n */\nexport function chatEventToAgentEvent(event: ChatEvent): AgentEvent | null {\n switch (event.type) {\n case \"message:delta\":\n return { type: \"text_delta\", text: event.text };\n case \"thinking:start\":\n return { type: \"thinking_start\" };\n case \"thinking:delta\":\n return { type: \"thinking_delta\", text: event.text };\n case \"thinking:end\":\n return { type: \"thinking_end\" };\n case \"tool:start\":\n return {\n type: \"tool_call_start\",\n toolCallId: event.toolCallId,\n toolName: event.toolName,\n args: event.args as JSONValue,\n };\n case \"tool:complete\":\n return {\n type: \"tool_call_end\",\n toolCallId: event.toolCallId,\n toolName: event.toolName,\n result: event.result as JSONValue,\n };\n case \"error\":\n return { type: \"error\", error: event.error, recoverable: event.recoverable, code: event.code };\n default:\n return null;\n }\n}\n","/**\n * @witqq/agent-sdk — ChatMessage ↔ agent-sdk Message conversion\n */\n\nimport type { Message, ToolCall, ToolResult, JSONValue } from \"../types.js\";\nimport type { ChatId, ChatMessage, ChatRole, MessagePart } from \"./types.js\";\nimport { createChatId, getMessageText, getMessageToolCalls } from \"./chat-utils.js\";\n\n/**\n * Convert a ChatMessage to agent-sdk Message format.\n * @deprecated Use toAgentMessages() which correctly handles tool results.\n * This function drops tool results for assistant messages with completed tool calls.\n */\nexport function toAgentMessage(message: ChatMessage): Message {\n return toAgentMessages(message)[0];\n}\n\n/**\n * Convert a ChatMessage to one or more agent-sdk Messages.\n * For assistant messages with completed tool calls, emits both:\n * 1. {role: \"assistant\", toolCalls: [...]} — the tool invocation\n * 2. {role: \"tool\", toolResults: [...]} — the tool results\n * This preserves tool results when replaying conversation history to backends.\n */\nexport function toAgentMessages(message: ChatMessage): Message[] {\n const textContent = getMessageText(message);\n const toolCallParts = getMessageToolCalls(message);\n\n switch (message.role) {\n case \"user\":\n return [{ role: \"user\", content: textContent }];\n case \"assistant\": {\n const toolCalls: ToolCall[] | undefined = toolCallParts.length > 0\n ? toolCallParts.map((p) => ({ id: p.toolCallId, name: p.name, args: p.args as JSONValue }))\n : undefined;\n const assistantMsg: Message = {\n role: \"assistant\",\n content: textContent,\n toolCalls,\n };\n\n // Emit tool results as a separate message if any tool calls have results\n const toolResults = extractToolResults(message);\n if (toolResults.length > 0) {\n return [assistantMsg, { role: \"tool\", toolResults }];\n }\n\n return [assistantMsg];\n }\n case \"system\":\n return [{ role: \"system\", content: textContent }];\n }\n}\n\n/**\n * Convert an agent-sdk Message to ChatMessage\n */\nexport function fromAgentMessage(message: Message, id?: ChatId): ChatMessage {\n const chatId = id ?? createChatId();\n const now = new Date().toISOString();\n\n const parts: MessagePart[] = [];\n\n const textContent =\n typeof message.content === \"string\"\n ? message.content\n : Array.isArray(message.content)\n ? message.content\n .filter((part) => part.type === \"text\")\n .map((part) => part.text)\n .join(\"\\n\")\n : (message.content ?? \"\");\n\n if (textContent) {\n parts.push({ type: \"text\", text: textContent, status: \"complete\" });\n }\n\n if (message.role === \"assistant\" && message.toolCalls) {\n for (const tc of message.toolCalls) {\n parts.push({\n type: \"tool_call\",\n toolCallId: tc.id,\n name: tc.name,\n args: tc.args,\n status: \"complete\",\n });\n }\n }\n\n if (message.role === \"tool\" && message.toolResults) {\n for (const tr of message.toolResults) {\n parts.push({\n type: \"tool_call\",\n toolCallId: tr.toolCallId,\n name: tr.name,\n args: {},\n result: tr.result,\n status: \"complete\",\n });\n }\n }\n\n if (parts.length === 0) {\n parts.push({ type: \"text\", text: \"\", status: \"complete\" });\n }\n\n const role: ChatRole = message.role === \"tool\" ? \"assistant\" : message.role;\n\n return {\n id: chatId,\n role,\n parts,\n createdAt: now,\n status: \"complete\",\n };\n}\n\n/**\n * Extract ToolResults from ToolCallParts that have results\n */\nexport function extractToolResults(message: ChatMessage): ToolResult[] {\n return getMessageToolCalls(message)\n .filter((p) => p.result !== undefined)\n .map((p) => ({\n toolCallId: p.toolCallId,\n name: p.name,\n result: p.result as JSONValue,\n isError: p.status === \"error\" ? true : undefined,\n }));\n}\n","/**\n * @witqq/agent-sdk/chat/context\n *\n * Context window manager for selecting which messages fit within a token budget.\n * Stateless: takes messages in, returns trimmed messages out.\n * Three overflow strategies: truncate-oldest, sliding-window, summarize-placeholder.\n */\n\nimport type { ChatMessage, MessagePart } from \"./core.js\";\n\n// ─── Token Estimation ──────────────────────────────────────────\n\n/**\n * Options for token estimation.\n */\nexport interface TokenEstimationOptions {\n /**\n * Characters per token ratio.\n * Lower = more conservative (fewer messages fit).\n * @default 4\n */\n charsPerToken?: number;\n}\n\n/**\n * Estimate token count for a single chat message.\n * Uses character-based heuristic: `Math.ceil(charCount / charsPerToken)`.\n *\n * Counts:\n * - Text content (string or text parts)\n * - Serialized tool calls and tool results\n * - Thinking blocks\n * - Role overhead (~4 tokens)\n *\n * @param message - Chat message to estimate\n * @param options - Estimation options\n * @returns Estimated token count\n *\n * @example\n * ```typescript\n * const tokens = estimateTokens(message);\n * const conservative = estimateTokens(message, { charsPerToken: 3 });\n * ```\n */\nexport function estimateTokens(\n message: ChatMessage,\n options?: TokenEstimationOptions,\n): number {\n const ratio = options?.charsPerToken ?? 4;\n let charCount = 0;\n\n // Role overhead\n charCount += message.role.length + 4;\n\n // Parts\n for (const part of message.parts) {\n charCount += estimatePartChars(part);\n }\n\n return Math.ceil(charCount / ratio);\n}\n\nfunction estimatePartChars(part: MessagePart): number {\n switch (part.type) {\n case \"text\":\n return part.text.length;\n case \"reasoning\":\n return part.text.length;\n case \"tool_call\":\n return JSON.stringify(part.args).length + part.name.length + 20 +\n (part.result !== undefined ? JSON.stringify(part.result).length : 0);\n case \"source\":\n return (part.title?.length ?? 0) + part.url.length + 10;\n case \"file\":\n return part.name.length + part.data.length + 20;\n }\n}\n\n// ─── Overflow Strategies ───────────────────────────────────────\n\n/** Overflow strategy type */\nexport type OverflowStrategy =\n | \"truncate-oldest\"\n | \"sliding-window\"\n | \"summarize-placeholder\";\n\n// ─── Context Window Configuration ──────────────────────────────\n\n/**\n * Async summarizer function for the summarize-placeholder strategy.\n * Receives removed messages and returns a summary string.\n * When configured, replaces the static placeholder text with actual summary.\n */\nexport type ContextSummarizer = (removedMessages: readonly ChatMessage[]) => Promise<string>;\n\n/**\n * Configuration for the context window manager.\n */\nexport interface ContextWindowConfig {\n /** Maximum token budget for the context window */\n maxTokens: number;\n\n /**\n * Tokens reserved for system prompt and response generation.\n * Subtracted from maxTokens to get available budget.\n * @default 0\n */\n reservedTokens?: number;\n\n /**\n * Strategy for handling overflow when messages exceed budget.\n * @default \"truncate-oldest\"\n */\n strategy?: OverflowStrategy;\n\n /**\n * Token estimation options.\n */\n estimation?: TokenEstimationOptions;\n\n /**\n * Optional async summarizer for the summarize-placeholder strategy.\n * When provided, replaces the static placeholder with a generated summary.\n * Falls back to static placeholder if summarizer throws.\n */\n summarizer?: ContextSummarizer;\n}\n\n// ─── Context Window Result ─────────────────────────────────────\n\n/**\n * Result of context window trimming.\n */\nexport interface ContextWindowResult {\n /** Messages that fit within the budget */\n messages: ChatMessage[];\n /** Total estimated tokens for included messages */\n totalTokens: number;\n /** Number of messages removed */\n removedCount: number;\n /** Whether any messages were truncated */\n wasTruncated: boolean;\n}\n\n// ─── Context Stats ─────────────────────────────────────────────\n\n/**\n * Context usage statistics for a session.\n * Returned by `IChatRuntime.getContextStats()`.\n *\n * When real usage data is available (after the first API response),\n * `realPromptTokens` and `realCompletionTokens` contain actual token counts.\n * `modelContextWindow` is the model's context window from `listModels()`.\n */\nexport interface ContextStats {\n /** Estimated total tokens in the trimmed context (heuristic, kept for backward compat) */\n totalTokens: number;\n /** Number of messages removed by trimming */\n removedCount: number;\n /** Whether context was truncated */\n wasTruncated: boolean;\n /** Available token budget (maxTokens − reservedTokens) */\n availableBudget: number;\n /** Real prompt tokens from the last API response (undefined before first response) */\n realPromptTokens?: number;\n /** Real completion tokens from the last API response (undefined before first response) */\n realCompletionTokens?: number;\n /** Model's context window in tokens from listModels() (undefined if not available) */\n modelContextWindow?: number;\n}\n\n// ─── Context Window Manager ────────────────────────────────────\n\n/**\n * Stateless context window manager.\n * Takes messages and returns the subset that fits within a token budget.\n *\n * @example\n * ```typescript\n * const manager = new ContextWindowManager({\n * maxTokens: 4096,\n * reservedTokens: 500,\n * strategy: \"sliding-window\",\n * });\n *\n * const result = manager.fitMessages(messages);\n * // result.messages — trimmed to fit budget\n * // result.totalTokens — estimated token usage\n * // result.wasTruncated — whether messages were removed\n * ```\n */\nexport class ContextWindowManager {\n private readonly config: Required<\n Pick<ContextWindowConfig, \"maxTokens\" | \"reservedTokens\" | \"strategy\">\n > &\n Pick<ContextWindowConfig, \"estimation\" | \"summarizer\">;\n\n constructor(config: ContextWindowConfig) {\n this.config = {\n maxTokens: config.maxTokens,\n reservedTokens: config.reservedTokens ?? 0,\n strategy: config.strategy ?? \"truncate-oldest\",\n estimation: config.estimation,\n summarizer: config.summarizer,\n };\n }\n\n /** Available token budget after reserving tokens */\n get availableBudget(): number {\n return Math.max(0, this.config.maxTokens - this.config.reservedTokens);\n }\n\n /**\n * Estimate tokens for a single message.\n * @param message - Message to estimate\n * @returns Estimated token count\n */\n estimateMessageTokens(message: ChatMessage): number {\n return estimateTokens(message, this.config.estimation);\n }\n\n /**\n * Fit messages within the token budget using the configured strategy.\n * @param messages - All messages to consider\n * @returns Result with fitted messages and metadata\n */\n fitMessages(messages: readonly ChatMessage[]): ContextWindowResult {\n if (messages.length === 0) {\n return { messages: [], totalTokens: 0, removedCount: 0, wasTruncated: false };\n }\n\n const budget = this.availableBudget;\n\n // Calculate tokens for each message\n const tokenCounts = messages.map((m) => this.estimateMessageTokens(m));\n const totalTokens = tokenCounts.reduce((a, b) => a + b, 0);\n\n // All messages fit\n if (totalTokens <= budget) {\n return {\n messages: [...messages],\n totalTokens,\n removedCount: 0,\n wasTruncated: false,\n };\n }\n\n switch (this.config.strategy) {\n case \"truncate-oldest\":\n return this.truncateOldest(messages, tokenCounts, budget);\n case \"sliding-window\":\n return this.slidingWindow(messages, tokenCounts, budget);\n case \"summarize-placeholder\":\n return this.summarizePlaceholder(messages, tokenCounts, budget);\n }\n }\n\n /**\n * Async variant of fitMessages that supports async summarization.\n * When strategy is \"summarize-placeholder\" and a summarizer is configured,\n * calls the summarizer with removed messages and replaces the placeholder text.\n * Falls back to static placeholder if summarizer throws.\n * For other strategies, behaves identically to fitMessages().\n */\n async fitMessagesAsync(messages: readonly ChatMessage[]): Promise<ContextWindowResult> {\n const result = this.fitMessages(messages);\n\n // Only enhance if summarize-placeholder strategy, messages were removed, and summarizer is configured\n if (\n this.config.strategy !== \"summarize-placeholder\" ||\n !result.wasTruncated ||\n !this.config.summarizer\n ) {\n return result;\n }\n\n // Find removed messages (those in original but not in result)\n const keptIds = new Set(result.messages.map(m => m.id));\n const removed = messages.filter(m => !keptIds.has(m.id));\n if (removed.length === 0) return result;\n\n // Call async summarizer, fall back to static placeholder on error\n let summaryText: string;\n try {\n summaryText = await this.config.summarizer(removed);\n } catch {\n return result; // Keep static placeholder on summarizer failure\n }\n\n // Replace placeholder text with summarizer output\n const updatedMessages = result.messages.map(m => {\n if ((m.metadata as Record<string, unknown>)?.isSummary === true) {\n return {\n ...m,\n parts: [{ type: \"text\" as const, text: summaryText, status: \"complete\" as const }],\n };\n }\n return m;\n });\n\n return { ...result, messages: updatedMessages };\n }\n\n /**\n * Trim messages using real token usage data from the previous API call.\n * Uses average-based algorithm: `avgTokensPerMessage = lastPromptTokens / messageCount`.\n * Removes oldest non-system messages until freed budget brings usage under modelContextWindow.\n *\n * @param messages - All messages in the session\n * @param lastPromptTokens - Real prompt tokens from the last API response\n * @param modelContextWindow - Model's total context window size in tokens\n * @returns Result with fitted messages and metadata\n */\n fitMessagesWithUsage(\n messages: readonly ChatMessage[],\n lastPromptTokens: number,\n modelContextWindow: number,\n ): ContextWindowResult {\n if (messages.length === 0) {\n return { messages: [], totalTokens: 0, removedCount: 0, wasTruncated: false };\n }\n\n const budget = modelContextWindow - this.config.reservedTokens;\n if (budget <= 0 || lastPromptTokens <= budget) {\n return {\n messages: [...messages],\n totalTokens: lastPromptTokens,\n removedCount: 0,\n wasTruncated: false,\n };\n }\n\n // Average tokens per message from real data\n const avgTokensPerMessage = lastPromptTokens / messages.length;\n\n // How many tokens we need to free\n const tokensToFree = lastPromptTokens - budget;\n // How many messages to remove (ceil to be safe)\n const messagesToRemove = Math.ceil(tokensToFree / avgTokensPerMessage);\n\n // Separate system and non-system messages\n const systemIndices: number[] = [];\n const nonSystemIndices: number[] = [];\n for (let i = 0; i < messages.length; i++) {\n if (messages[i].role === \"system\") {\n systemIndices.push(i);\n } else {\n nonSystemIndices.push(i);\n }\n }\n\n // Remove oldest non-system messages (from the beginning of conversation)\n const removableCount = Math.min(messagesToRemove, nonSystemIndices.length);\n const removedIndices = new Set(nonSystemIndices.slice(0, removableCount));\n\n const result: ChatMessage[] = [];\n for (let i = 0; i < messages.length; i++) {\n if (!removedIndices.has(i)) {\n result.push(messages[i]);\n }\n }\n\n // Estimate new total: proportional reduction\n const estimatedTokens = Math.round(\n lastPromptTokens * (result.length / messages.length),\n );\n\n return {\n messages: result,\n totalTokens: estimatedTokens,\n removedCount: removableCount,\n wasTruncated: removableCount > 0,\n };\n }\n\n /**\n * Truncate oldest: keeps system messages, removes oldest non-system messages first.\n * Always keeps the most recent user message.\n */\n private truncateOldest(\n messages: readonly ChatMessage[],\n tokenCounts: number[],\n budget: number,\n ): ContextWindowResult {\n // Separate system messages (always kept) and non-system\n const systemIndices: number[] = [];\n const nonSystemIndices: number[] = [];\n\n for (let i = 0; i < messages.length; i++) {\n if (messages[i].role === \"system\") {\n systemIndices.push(i);\n } else {\n nonSystemIndices.push(i);\n }\n }\n\n // System messages cost\n let usedTokens = systemIndices.reduce(\n (sum, i) => sum + tokenCounts[i],\n 0,\n );\n\n // If system messages alone exceed budget, still include them\n // (caller should configure reservedTokens properly)\n\n // Try to fit non-system from newest to oldest\n const includedNonSystem: number[] = [];\n for (let i = nonSystemIndices.length - 1; i >= 0; i--) {\n const idx = nonSystemIndices[i];\n if (usedTokens + tokenCounts[idx] <= budget) {\n includedNonSystem.unshift(idx);\n usedTokens += tokenCounts[idx];\n }\n }\n\n // Build result preserving original order\n const includedSet = new Set([...systemIndices, ...includedNonSystem]);\n const result: ChatMessage[] = [];\n let resultTokens = 0;\n for (let i = 0; i < messages.length; i++) {\n if (includedSet.has(i)) {\n result.push(messages[i]);\n resultTokens += tokenCounts[i];\n }\n }\n\n return {\n messages: result,\n totalTokens: resultTokens,\n removedCount: messages.length - result.length,\n wasTruncated: true,\n };\n }\n\n /**\n * Sliding window: keeps the most recent messages that fit within budget.\n */\n private slidingWindow(\n messages: readonly ChatMessage[],\n tokenCounts: number[],\n budget: number,\n ): ContextWindowResult {\n const result: ChatMessage[] = [];\n let usedTokens = 0;\n\n // Walk from newest to oldest\n for (let i = messages.length - 1; i >= 0; i--) {\n if (usedTokens + tokenCounts[i] <= budget) {\n result.unshift(messages[i]);\n usedTokens += tokenCounts[i];\n } else {\n break;\n }\n }\n\n return {\n messages: result,\n totalTokens: usedTokens,\n removedCount: messages.length - result.length,\n wasTruncated: true,\n };\n }\n\n /**\n * Summarize placeholder: replaces truncated messages with a placeholder,\n * preserving system messages and recent context.\n */\n private summarizePlaceholder(\n messages: readonly ChatMessage[],\n tokenCounts: number[],\n budget: number,\n ): ContextWindowResult {\n // First, identify system messages and recent messages\n const systemMessages: { msg: ChatMessage; tokens: number }[] = [];\n const nonSystem: { msg: ChatMessage; tokens: number; idx: number }[] = [];\n\n for (let i = 0; i < messages.length; i++) {\n if (messages[i].role === \"system\") {\n systemMessages.push({ msg: messages[i], tokens: tokenCounts[i] });\n } else {\n nonSystem.push({ msg: messages[i], tokens: tokenCounts[i], idx: i });\n }\n }\n\n // System message cost\n let usedTokens = systemMessages.reduce((s, m) => s + m.tokens, 0);\n\n // Placeholder costs ~20 tokens\n const placeholderTokens = 20;\n usedTokens += placeholderTokens;\n\n // Fit recent non-system messages from newest\n const recentKept: typeof nonSystem = [];\n for (let i = nonSystem.length - 1; i >= 0; i--) {\n if (usedTokens + nonSystem[i].tokens <= budget) {\n recentKept.unshift(nonSystem[i]);\n usedTokens += nonSystem[i].tokens;\n } else {\n break;\n }\n }\n\n const removedCount =\n messages.length -\n systemMessages.length -\n recentKept.length;\n\n // Build result: system messages, placeholder, recent messages\n const result: ChatMessage[] = [];\n\n // System messages first\n for (const sm of systemMessages) {\n result.push(sm.msg);\n }\n\n // Placeholder if messages were removed\n if (removedCount > 0) {\n result.push({\n id: \"context-placeholder\" as ChatMessage[\"id\"],\n role: \"system\",\n parts: [{ type: \"text\", text: `[${removedCount} earlier message${removedCount === 1 ? \"\" : \"s\"} omitted for context window]`, status: \"complete\" as const }],\n metadata: { isSummary: true },\n createdAt: new Date().toISOString(),\n status: \"complete\",\n });\n }\n\n // Recent messages\n for (const m of recentKept) {\n result.push(m.msg);\n }\n\n return {\n messages: result,\n totalTokens: usedTokens,\n removedCount,\n wasTruncated: true,\n };\n }\n}\n","/**\n * @witqq/agent-sdk/chat/errors\n *\n * Flat error taxonomy with unified ErrorCode enum, ChatError class,\n * pattern-matching classifier, retry strategies with exponential backoff.\n * Extends the existing AgentSDKError from @witqq/agent-sdk.\n */\n\nimport { AgentSDKError } from \"../errors.js\";\nimport { ErrorCode } from \"../types/errors.js\";\n\n// ─── Re-export ErrorCode ───────────────────────────────────────\n\nexport { ErrorCode };\n\n// ─── Error Options ─────────────────────────────────────────────\n\n/** Options for constructing a ChatError */\nexport interface ChatErrorOptions {\n /** Machine-readable error code */\n code: ErrorCode;\n /** Whether this error is retryable (default: false) */\n retryable?: boolean;\n /** Retry delay hint in milliseconds */\n retryAfter?: number;\n /** Original cause, if wrapping another error */\n cause?: unknown;\n}\n\n// ─── Unified Error Class ───────────────────────────────────────\n\n/** Unified error class for all chat SDK errors */\nexport class ChatError extends AgentSDKError {\n readonly code: ErrorCode;\n readonly retryable: boolean;\n readonly retryAfter?: number;\n readonly timestamp: string;\n\n constructor(message: string, options: ChatErrorOptions) {\n super(message, {\n cause: options.cause,\n code: options.code,\n retryable: options.retryable,\n });\n this.name = \"ChatError\";\n this.code = options.code;\n this.retryable = options.retryable ?? false;\n this.retryAfter = options.retryAfter;\n this.timestamp = new Date().toISOString();\n }\n}\n\n// ─── Classification ────────────────────────────────────────────\n\n/**\n * Classify an unknown thrown value into a ChatError with the appropriate code.\n * Pattern-matches against common error shapes:\n * - Already a ChatError → returned as-is\n * - Fetch/network errors (ECONNREFUSED, ETIMEDOUT, etc.)\n * - HTTP status codes (401→AUTH_INVALID, 429→RATE_LIMIT, 5xx→PROVIDER_ERROR)\n * - Timeout patterns\n * - Zod validation errors\n * - Context overflow patterns\n * - Unknown → wrapped as ChatError with PROVIDER_ERROR\n *\n * @param error - The thrown value to classify\n * @returns ChatError with appropriate error code and retryable flag\n */\nexport function classifyError(error: unknown): ChatError {\n if (error instanceof ChatError) {\n return error;\n }\n\n if (error instanceof Error) {\n const msg = error.message.toLowerCase();\n\n // Network errors\n if (isNetworkError(msg)) {\n return new ChatError(error.message, {\n code: ErrorCode.NETWORK,\n retryable: true,\n cause: error,\n });\n }\n\n // Timeout errors\n if (isTimeoutPattern(msg)) {\n return new ChatError(error.message, {\n code: ErrorCode.TIMEOUT,\n retryable: true,\n cause: error,\n });\n }\n\n // Zod validation errors\n if (isZodError(error)) {\n return new ChatError(error.message, {\n code: ErrorCode.INVALID_INPUT,\n retryable: false,\n cause: error,\n });\n }\n\n // HTTP status code errors\n const statusCode = extractStatusCode(error);\n if (statusCode !== null) {\n return classifyByStatusCode(statusCode, error);\n }\n\n // Context overflow patterns\n if (isContextOverflow(msg)) {\n return new ChatError(error.message, {\n code: ErrorCode.CONTEXT_OVERFLOW,\n retryable: false,\n cause: error,\n });\n }\n }\n\n // Unknown errors\n const message =\n error instanceof Error ? error.message : String(error);\n return new ChatError(message, {\n code: ErrorCode.PROVIDER_ERROR,\n retryable: false,\n cause: error,\n });\n}\n\n// ─── Classification Helpers ────────────────────────────────────\n\nconst NETWORK_PATTERNS = [\n \"econnrefused\",\n \"econnreset\",\n \"enotfound\",\n \"etimedout\",\n \"enetunreach\",\n \"epipe\",\n \"fetch failed\",\n \"network error\",\n \"network request failed\",\n \"failed to fetch\",\n \"dns lookup failed\",\n] as const;\n\nfunction isNetworkError(msg: string): boolean {\n return NETWORK_PATTERNS.some((p) => msg.includes(p));\n}\n\nfunction isTimeoutPattern(msg: string): boolean {\n return (\n msg.includes(\"timeout\") ||\n msg.includes(\"timed out\") ||\n msg.includes(\"deadline exceeded\") ||\n msg.includes(\"aborted due to timeout\")\n );\n}\n\nfunction isZodError(error: Error): boolean {\n return (\n error.name === \"ZodError\" ||\n (\"issues\" in error && Array.isArray((error as unknown as Record<string, unknown>).issues))\n );\n}\n\nfunction extractStatusCode(error: Error): number | null {\n const errRecord = error as unknown as Record<string, unknown>;\n if (typeof errRecord.status === \"number\") return errRecord.status;\n if (typeof errRecord.statusCode === \"number\") return errRecord.statusCode;\n\n // Check message for HTTP status codes\n const match = error.message.match(/\\b(4\\d{2}|5\\d{2})\\b/);\n return match ? parseInt(match[1], 10) : null;\n}\n\nfunction classifyByStatusCode(status: number, error: Error): ChatError {\n if (status === 401 || status === 403) {\n return new ChatError(error.message, {\n code: ErrorCode.AUTH_INVALID,\n retryable: false,\n cause: error,\n });\n }\n if (status === 429) {\n const retryAfterSeconds = extractRetryAfter(error);\n return new ChatError(error.message, {\n code: ErrorCode.RATE_LIMIT,\n retryable: true,\n retryAfter: retryAfterSeconds != null ? retryAfterSeconds * 1000 : undefined,\n cause: error,\n });\n }\n if (status >= 500) {\n return new ChatError(error.message, {\n code: ErrorCode.PROVIDER_ERROR,\n retryable: true,\n cause: error,\n });\n }\n // 4xx other than auth/rate-limit → invalid input\n if (status >= 400 && status < 500) {\n return new ChatError(error.message, {\n code: ErrorCode.INVALID_INPUT,\n retryable: false,\n cause: error,\n });\n }\n return new ChatError(error.message, {\n code: ErrorCode.NETWORK,\n retryable: true,\n cause: error,\n });\n}\n\nfunction extractRetryAfter(error: Error): number | undefined {\n const errRecord = error as unknown as Record<string, unknown>;\n if (typeof errRecord.retryAfter === \"number\") return errRecord.retryAfter;\n const match = error.message.match(/retry.after[:\\s]*(\\d+)/i);\n return match ? parseInt(match[1], 10) : undefined;\n}\n\nfunction isContextOverflow(msg: string): boolean {\n return (\n msg.includes(\"context length exceeded\") ||\n msg.includes(\"maximum context length\") ||\n msg.includes(\"context window\") ||\n msg.includes(\"token limit\") ||\n msg.includes(\"too many tokens\")\n );\n}\n\n// ─── Retry Strategy ────────────────────────────────────────────\n\n/** Strategy for computing retry delays */\nexport interface RetryStrategy {\n /** Return delay in ms for the given attempt (0-based), or null to stop */\n nextDelay(attempt: number, error: ChatError): number | null;\n}\n\n/** Options for ExponentialBackoffStrategy */\nexport interface ExponentialBackoffOptions {\n /** Base delay in ms (default: 1000) */\n baseMs?: number;\n /** Maximum delay in ms (default: 30000) */\n maxMs?: number;\n /** Maximum number of attempts (default: 3) */\n maxAttempts?: number;\n /** Jitter factor 0–1 (default: 0.1) */\n jitter?: number;\n}\n\n/** Exponential backoff with optional jitter */\nexport class ExponentialBackoffStrategy implements RetryStrategy {\n private readonly baseMs: number;\n private readonly maxMs: number;\n private readonly maxAttempts: number;\n private readonly jitter: number;\n\n constructor(options?: ExponentialBackoffOptions) {\n this.baseMs = options?.baseMs ?? 1000;\n this.maxMs = options?.maxMs ?? 30000;\n this.maxAttempts = options?.maxAttempts ?? 3;\n this.jitter = Math.max(0, Math.min(1, options?.jitter ?? 0.1));\n }\n\n nextDelay(attempt: number, error: ChatError): number | null {\n if (attempt >= this.maxAttempts) return null;\n if (!error.retryable) return null;\n\n // Rate-limit errors with retryAfter (already in ms) take priority\n if (error.code === ErrorCode.RATE_LIMIT && error.retryAfter) {\n return error.retryAfter;\n }\n\n const delay = Math.min(this.baseMs * Math.pow(2, attempt), this.maxMs);\n const jitterAmount = delay * this.jitter * (Math.random() * 2 - 1);\n return Math.max(0, Math.round(delay + jitterAmount));\n }\n}\n\n// ─── Retry Execution ───────────────────────────────────────────\n\n/** Options for withRetry execution */\nexport interface RetryOptions {\n /** Abort signal to cancel retries */\n signal?: AbortSignal;\n /** Called before each retry with the error and delay */\n onRetry?: (error: ChatError, attempt: number, delayMs: number) => void;\n}\n\n/**\n * Execute an async function with automatic retries using the provided strategy.\n * Respects ChatError.retryable and ChatError.retryAfter.\n * Classifies non-ChatError errors before deciding on retry.\n *\n * @param fn - Async function to execute\n * @param strategy - Retry strategy providing delay calculations\n * @param options - Optional abort signal and retry callback\n * @returns Result of fn on success\n * @throws ChatError when all retries exhausted or error is non-retryable\n */\nexport async function withRetry<T>(\n fn: () => Promise<T>,\n strategy: RetryStrategy,\n options?: RetryOptions,\n): Promise<T> {\n let attempt = 0;\n\n for (;;) {\n try {\n return await fn();\n } catch (raw) {\n const error = classifyError(raw);\n const delay = strategy.nextDelay(attempt, error);\n\n if (delay === null) {\n throw error;\n }\n\n if (options?.signal?.aborted) {\n throw error;\n }\n\n options?.onRetry?.(error, attempt, delay);\n\n await sleep(delay, options?.signal);\n attempt++;\n }\n }\n}\n\n/**\n * Type guard: check if an error is retryable\n * @param error - The error to check\n * @returns True if error is a retryable ChatError\n */\nexport function isRetryable(error: unknown): boolean {\n if (error instanceof ChatError) {\n return error.retryable;\n }\n const classified = classifyError(error);\n return classified.retryable;\n}\n\n// ─── Internal Helpers ──────────────────────────────────────────\n\nfunction sleep(ms: number, signal?: AbortSignal): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n if (signal?.aborted) {\n reject(new ChatError(\"Retry aborted\", { code: ErrorCode.ABORTED }));\n return;\n }\n\n const timer = setTimeout(resolve, ms);\n\n signal?.addEventListener(\n \"abort\",\n () => {\n clearTimeout(timer);\n reject(new ChatError(\"Retry aborted\", { code: ErrorCode.ABORTED }));\n },\n { once: true },\n );\n });\n}\n","/**\n * @witqq/agent-sdk/chat/state\n *\n * Validated state machines for runtime, message, and tool-call lifecycles.\n * Generic StateMachine<S> with declarative transition maps.\n */\n\nimport type { RuntimeStatus, MessageStatus, ToolCallStatus } from \"./core.js\";\nimport { ChatError, ErrorCode } from \"./errors.js\";\n\n// ─── Generic State Machine ─────────────────────────────────────\n\n/** Map of allowed transitions: current state → set of valid next states */\nexport type TransitionMap<S extends string> = Readonly<Record<S, readonly S[]>>;\n\n/**\n * Generic validated state machine.\n * Enforces that every transition is declared in the transition map.\n * Throws ChatError(INVALID_TRANSITION) on illegal moves.\n */\nexport class StateMachine<S extends string> {\n private _current: S;\n\n constructor(\n readonly initial: S,\n readonly transitions: TransitionMap<S>,\n ) {\n this._current = initial;\n }\n\n /** Current state */\n get current(): S {\n return this._current;\n }\n\n /**\n * Check whether transitioning to `next` is allowed from current state\n * @param next - Target state to check\n * @returns True if transition is allowed\n */\n canTransition(next: S): boolean {\n const allowed = this.transitions[this._current];\n return allowed !== undefined && allowed.includes(next);\n }\n\n /**\n * Transition to `next` state.\n * @throws ChatError(INVALID_TRANSITION) if the transition is not allowed\n */\n transition(next: S): void {\n if (!this.canTransition(next)) {\n throw new ChatError(\n `Invalid transition: ${this._current} → ${next}`,\n { code: ErrorCode.INVALID_TRANSITION },\n );\n }\n this._current = next;\n }\n\n /** Reset to initial state */\n reset(): void {\n this._current = this.initial;\n }\n}\n\n// ─── Transition Maps ───────────────────────────────────────────\n\n/** Allowed transitions for RuntimeStatus (idle → streaming/disposed, etc.) */\nexport const RUNTIME_TRANSITIONS: TransitionMap<RuntimeStatus> = {\n idle: [\"streaming\", \"disposed\"],\n streaming: [\"idle\", \"error\", \"disposed\"],\n error: [\"idle\", \"disposed\"],\n disposed: [],\n};\n\n/** Allowed transitions for MessageStatus (pending → streaming → complete, etc.) */\nexport const MESSAGE_TRANSITIONS: TransitionMap<MessageStatus> = {\n pending: [\"streaming\", \"error\", \"cancelled\"],\n streaming: [\"complete\", \"error\", \"cancelled\"],\n complete: [],\n error: [],\n cancelled: [],\n};\n\n/** Allowed transitions for ToolCallStatus (pending → running → complete, etc.) */\nexport const TOOL_CALL_TRANSITIONS: TransitionMap<ToolCallStatus> = {\n pending: [\"running\", \"requires_approval\", \"error\"],\n running: [\"complete\", \"error\"],\n requires_approval: [\"running\", \"denied\", \"error\"],\n complete: [],\n error: [],\n denied: [],\n};\n\n// ─── Pre-configured Factories ──────────────────────────────────\n\n/** Create a RuntimeStatus state machine starting at \"idle\" */\nexport function createRuntimeStateMachine(): StateMachine<RuntimeStatus> {\n return new StateMachine<RuntimeStatus>(\"idle\", RUNTIME_TRANSITIONS);\n}\n\n/** Create a MessageStatus state machine starting at \"pending\" */\nexport function createMessageStateMachine(): StateMachine<MessageStatus> {\n return new StateMachine<MessageStatus>(\"pending\", MESSAGE_TRANSITIONS);\n}\n\n/** Create a ToolCallStatus state machine starting at \"pending\" */\nexport function createToolCallStateMachine(): StateMachine<ToolCallStatus> {\n return new StateMachine<ToolCallStatus>(\"pending\", TOOL_CALL_TRANSITIONS);\n}\n\n// ─── Reentrancy Guard ──────────────────────────────────────────\n\n/**\n * Guards against concurrent send() calls in a chat runtime.\n * acquire() before work, release() after (use try/finally).\n * Throws ChatError(REENTRANCY) if already acquired.\n */\nexport class ChatReentrancyGuard {\n private _acquired = false;\n\n /** Whether the guard is currently held */\n get isAcquired(): boolean {\n return this._acquired;\n }\n\n /**\n * Acquire the guard. Throws if already acquired.\n * @throws ChatError with code REENTRANCY\n */\n acquire(): void {\n if (this._acquired) {\n throw new ChatError(\n \"Concurrent operation detected: a send is already in progress\",\n { code: ErrorCode.REENTRANCY },\n );\n }\n this._acquired = true;\n }\n\n /** Release the guard. Safe to call even if not acquired. */\n release(): void {\n this._acquired = false;\n }\n}\n\n// ─── Abort Controller ──────────────────────────────────────────\n\n/**\n * Abort controller with external signal linking.\n * Wraps an AbortController and optionally links an external AbortSignal\n * so aborting either side cancels the operation.\n */\nexport class ChatAbortController {\n private readonly _controller: AbortController;\n private readonly _onExternalAbort?: () => void;\n private readonly _externalSignal?: AbortSignal;\n\n constructor(externalSignal?: AbortSignal) {\n this._controller = new AbortController();\n this._externalSignal = externalSignal;\n\n if (externalSignal) {\n // If external signal already aborted, abort immediately\n if (externalSignal.aborted) {\n this._controller.abort(externalSignal.reason);\n } else {\n // Link: external abort → our controller\n this._onExternalAbort = () => {\n this._controller.abort(externalSignal.reason);\n };\n externalSignal.addEventListener(\"abort\", this._onExternalAbort, { once: true });\n }\n }\n }\n\n /** The AbortSignal for this controller */\n get signal(): AbortSignal {\n return this._controller.signal;\n }\n\n /** Whether the operation has been aborted */\n get isAborted(): boolean {\n return this._controller.signal.aborted;\n }\n\n /**\n * Abort the operation.\n * @param reason - Optional abort reason\n */\n abort(reason?: unknown): void {\n this._controller.abort(reason);\n }\n\n /** Clean up external signal listener to prevent memory leaks */\n dispose(): void {\n if (this._onExternalAbort && this._externalSignal) {\n this._externalSignal.removeEventListener(\"abort\", this._onExternalAbort);\n }\n }\n}\n","/**\n * @witqq/agent-sdk/chat/accumulator\n *\n * MessageAccumulator converts a stream of AgentEvent objects into a ChatMessage\n * with correct MessagePart array. Handles text, reasoning, and tool call\n * accumulation with proper status transitions.\n */\n\nimport type { AgentEvent } from \"../types.js\";\nimport type { ChatMessage, ChatId, MessagePart, TextPart, ReasoningPart, ToolCallPart } from \"./core.js\";\nimport { createChatId } from \"./core.js\";\n\n/**\n * Converts a stream of AgentEvent objects into a complete ChatMessage.\n * Tracks text, reasoning, and tool call parts with proper status transitions.\n *\n * @example\n * ```typescript\n * const acc = new MessageAccumulator();\n * for await (const event of agentEvents) {\n * acc.apply(event);\n * renderMessage(acc.snapshot()); // in-progress UI update\n * }\n * const message = acc.finalize();\n * ```\n */\nexport class MessageAccumulator {\n private readonly messageId: ChatId;\n private readonly parts: MessagePart[] = [];\n private status: \"pending\" | \"streaming\" | \"complete\" | \"error\" | \"cancelled\" = \"pending\";\n private currentTextPart: TextPart | null = null;\n private currentReasoningPart: ReasoningPart | null = null;\n private toolCallParts = new Map<string, ToolCallPart>();\n private _finalized = false;\n\n constructor(messageId?: ChatId) {\n this.messageId = messageId ?? createChatId();\n }\n\n /** Get current message ID */\n get id(): ChatId { return this.messageId; }\n\n /**\n * Apply an AgentEvent to accumulate into the message\n * @param event - AgentEvent to process\n * @throws Error if accumulator is already finalized\n */\n apply(event: AgentEvent): void {\n if (this._finalized) throw new Error(\"Cannot apply events to finalized accumulator\");\n\n if (this.status === \"pending\") {\n this.status = \"streaming\";\n }\n\n switch (event.type) {\n case \"text_delta\":\n this.handleTextDelta(event.text);\n break;\n case \"thinking_start\":\n this.finalizeCurrentText();\n this.currentReasoningPart = { type: \"reasoning\", text: \"\", status: \"streaming\" };\n this.parts.push(this.currentReasoningPart);\n break;\n case \"thinking_delta\":\n if (this.currentReasoningPart) {\n this.currentReasoningPart.text += event.text;\n }\n break;\n case \"thinking_end\":\n if (this.currentReasoningPart) {\n this.currentReasoningPart.status = \"complete\";\n this.currentReasoningPart = null;\n }\n break;\n case \"tool_call_start\": {\n this.finalizeCurrentText();\n const toolPart: ToolCallPart = {\n type: \"tool_call\",\n toolCallId: event.toolCallId,\n name: event.toolName,\n args: event.args,\n status: \"running\",\n };\n this.toolCallParts.set(event.toolCallId, toolPart);\n this.parts.push(toolPart);\n break;\n }\n case \"tool_call_end\": {\n const existing = this.toolCallParts.get(event.toolCallId);\n if (existing) {\n existing.result = event.result;\n existing.status = \"complete\";\n }\n break;\n }\n case \"error\":\n this.status = \"error\";\n break;\n case \"done\":\n break;\n // Other events (heartbeat, ask_user, etc.) — ignore\n }\n }\n\n private handleTextDelta(text: string): void {\n if (!this.currentTextPart) {\n this.currentTextPart = { type: \"text\", text: \"\", status: \"streaming\" };\n this.parts.push(this.currentTextPart);\n }\n this.currentTextPart.text += text;\n }\n\n private finalizeCurrentText(): void {\n if (this.currentTextPart) {\n this.currentTextPart.status = \"complete\";\n this.currentTextPart = null;\n }\n }\n\n /**\n * Get a snapshot of the current accumulated message (for streaming UI)\n * @returns ChatMessage with current parts and \"streaming\" status\n */\n snapshot(): ChatMessage {\n const now = new Date().toISOString();\n return {\n id: this.messageId,\n role: \"assistant\",\n parts: this.parts.map(p => ({ ...p })),\n status: this.status === \"pending\" ? \"pending\" : \"streaming\",\n createdAt: now,\n updatedAt: now,\n };\n }\n\n /**\n * Finalize the accumulator and return the complete ChatMessage\n * @returns Completed ChatMessage with all parts finalized\n * @throws Error if accumulator is already finalized\n */\n finalize(): ChatMessage {\n if (this._finalized) throw new Error(\"Accumulator already finalized\");\n this._finalized = true;\n\n // Finalize any open parts\n this.finalizeCurrentText();\n if (this.currentReasoningPart) {\n this.currentReasoningPart.status = \"complete\";\n this.currentReasoningPart = null;\n }\n\n // Mark incomplete tool calls as error\n for (const [, toolPart] of this.toolCallParts) {\n if (toolPart.status === \"running\" || toolPart.status === \"pending\") {\n toolPart.status = \"error\";\n }\n }\n\n // Set final message status\n if (this.status !== \"error\" && this.status !== \"cancelled\") {\n this.status = \"complete\";\n }\n\n const now = new Date().toISOString();\n return {\n id: this.messageId,\n role: \"assistant\",\n parts: this.parts,\n status: this.status,\n createdAt: now,\n updatedAt: now,\n };\n }\n\n /** Check if the accumulator has been finalized */\n get finalized(): boolean { return this._finalized; }\n}\n","/**\n * @witqq/agent-sdk - Stream Watchdog\n *\n * Activity-based timeout wrapper for async event streams.\n * Aborts the stream if no events arrive within a configurable inactivity window.\n * Timer resets on each received event.\n */\n\nimport { ChatError, ErrorCode } from \"./errors.js\";\n\n// ─── Configuration ─────────────────────────────────────────────\n\n/** Stream watchdog configuration */\nexport interface StreamWatchdogConfig {\n /** Maximum inactivity time in milliseconds before aborting the stream */\n timeoutMs: number;\n /** AbortSignal to link with (watchdog aborts when this signal fires) */\n signal?: AbortSignal;\n}\n\n// ─── Watchdog Implementation ───────────────────────────────────\n\n/**\n * Wraps an async iterable with an activity timeout.\n * If no event arrives within `timeoutMs`, the stream is aborted with a ChatError.\n * The timer resets after each received event.\n *\n * Uses Promise.race() so even if the source iterator is stuck on an\n * unresolvable promise, the timeout fires and aborts iteration.\n *\n * @example\n * ```ts\n * const watched = withStreamWatchdog(adapter.streamMessage(session, msg), {\n * timeoutMs: 30000,\n * signal: abortController.signal,\n * });\n *\n * for await (const event of watched) {\n * // Each event resets the 30s inactivity timer\n * }\n * ```\n */\nexport async function* withStreamWatchdog<T>(\n source: AsyncIterable<T>,\n config: StreamWatchdogConfig,\n): AsyncGenerator<T> {\n const { timeoutMs, signal } = config;\n\n const iterator = source[Symbol.asyncIterator]();\n let aborted = false;\n\n // Link external abort signal\n if (signal?.aborted) {\n iterator.return?.();\n return;\n }\n\n const onAbort = (): void => {\n aborted = true;\n iterator.return?.();\n };\n signal?.addEventListener(\"abort\", onAbort, { once: true });\n\n try {\n while (true) {\n if (aborted) break;\n\n // Race iterator.next() against a cancellable inactivity timeout.\n // The timeout is cleared when iterator.next() wins, preventing\n // unhandled promise rejections from orphaned setTimeout callbacks.\n const timeout = new CancellableTimeout<T>(timeoutMs);\n try {\n const result = await Promise.race([\n iterator.next(),\n timeout.promise,\n ]);\n timeout.cancel();\n\n if (result.done) break;\n yield result.value;\n } catch (err) {\n timeout.cancel();\n throw err;\n }\n }\n } finally {\n signal?.removeEventListener(\"abort\", onAbort);\n iterator.return?.();\n }\n}\n\n/** Timeout that can be cancelled to prevent unhandled rejections */\nclass CancellableTimeout<T> {\n readonly promise: Promise<IteratorResult<T>>;\n private _timer: ReturnType<typeof setTimeout> | undefined;\n private _cancelled = false;\n\n constructor(ms: number) {\n this.promise = new Promise<IteratorResult<T>>((_, reject) => {\n this._timer = setTimeout(() => {\n if (!this._cancelled) {\n reject(\n new ChatError(\n `Stream timed out after ${ms}ms of inactivity`,\n { code: ErrorCode.TIMEOUT },\n ),\n );\n }\n }, ms);\n });\n // Prevent unhandled rejection when cancelled\n this.promise.catch(() => {});\n }\n\n cancel(): void {\n this._cancelled = true;\n if (this._timer !== undefined) {\n clearTimeout(this._timer);\n this._timer = undefined;\n }\n }\n}\n","/**\n * Generic listener set utility for subscribe/notify patterns.\n *\n * Encapsulates the recurring pattern of:\n * - Set<callback> storage\n * - add(callback) → unsubscribe function\n * - notify(...args) with try/catch per listener\n * - clear() for disposal\n */\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport class ListenerSet<T extends (...args: any[]) => void> {\n private readonly _listeners = new Set<T>();\n\n /** Add a listener. Returns an unsubscribe function. */\n add(callback: T): () => void {\n this._listeners.add(callback);\n return () => { this._listeners.delete(callback); };\n }\n\n /** Notify all listeners with the given arguments. Errors are isolated per listener. */\n notify(...args: Parameters<T>): void {\n for (const cb of this._listeners) {\n try { cb(...args); } catch { /* listener errors must not propagate */ }\n }\n }\n\n /** Remove all listeners. */\n clear(): void {\n this._listeners.clear();\n }\n\n /** Current number of listeners. */\n get size(): number {\n return this._listeners.size;\n }\n}\n","/**\n * @witqq/agent-sdk/chat/runtime\n *\n * Unified chat runtime orchestrator. Creates a fully-wired runtime instance\n * from a configuration object, managing backend adapters, sessions, context\n * trimming, streaming, and middleware in a single facade.\n *\n * Usage:\n * ```typescript\n * import { createChatRuntime } from \"@witqq/agent-sdk/chat/runtime\";\n * const runtime = createChatRuntime({ backends: { ... }, sessionStore, ... });\n * const session = await runtime.createSession({ config: { model: \"gpt-4\", backend: \"copilot\" } });\n * for await (const event of runtime.send(session.id, \"Hello\")) { ... }\n * ```\n */\n\nimport type {\n ChatEvent,\n ChatId,\n ChatIdLike,\n ChatMessage,\n ChatMiddleware,\n ChatMiddlewareContext,\n ChatSession,\n ChatSessionConfig,\n RuntimeStatus,\n SendMessageOptions,\n RuntimeSendOptions,\n} from \"./core.js\";\nimport { createChatId, toChatId, chatEventToAgentEvent } from \"./core.js\";\nimport type { IChatBackend } from \"./backends/types.js\";\nimport type { IChatSessionStore, CreateSessionOptions, SessionListOptions } from \"./sessions.js\";\nimport type { ContextWindowConfig, ContextStats } from \"./context.js\";\nimport { ContextWindowManager } from \"./context.js\";\nimport {\n StateMachine,\n RUNTIME_TRANSITIONS,\n ChatReentrancyGuard,\n ChatAbortController,\n} from \"./state.js\";\nimport { ChatError, ErrorCode } from \"./errors.js\";\nimport { MessageAccumulator } from \"./accumulator.js\";\nimport { withStreamWatchdog } from \"./watchdog.js\";\nimport { ListenerSet } from \"./listener-set.js\";\nimport type { ToolDefinition, ToolContext } from \"../types.js\";\nimport type { ModelInfo } from \"../types.js\";\nimport type { AuthToken } from \"../auth/types.js\";\nimport type { ProviderConfig } from \"./provider-types.js\";\n\n// ─── Runtime Configuration ─────────────────────────────────────\n\n/** Factory function that creates a backend adapter on demand */\nexport type BackendAdapterFactory = (credentials: AuthToken) => IChatBackend | Promise<IChatBackend>;\n\n/** Configuration for creating a chat runtime via createChatRuntime() */\nexport interface ChatRuntimeOptions {\n /** Map of backend name → adapter factory (lazy creation on first use) */\n backends: Record<string, BackendAdapterFactory>;\n /** Default backend name (must be a key in `backends`) */\n defaultBackend: string;\n /** Session store for persistence */\n sessionStore: IChatSessionStore;\n /** Context window configuration (optional) */\n context?: ContextWindowConfig;\n /** Middleware pipeline (optional, applied in order) */\n middleware?: ChatMiddleware[];\n /** Retry configuration for pre-stream connection errors */\n retryConfig?: StreamRetryConfig;\n /**\n * Stream inactivity timeout in milliseconds (optional).\n * When set, aborts the stream if no events arrive within this window.\n * Timer resets after each received event.\n */\n streamTimeoutMs?: number;\n /**\n * Called when context trimming removes messages.\n * Use for archiving, logging, or analytics.\n */\n onContextTrimmed?: (sessionId: ChatIdLike, removedMessages: ChatMessage[]) => void;\n /**\n * Initial tools to register on the runtime.\n * Equivalent to calling `registerTool()` for each tool after creation.\n */\n tools?: ToolDefinition[];\n}\n\n/** Retry configuration for pre-stream failures (renamed to avoid clash with agent-level RetryConfig) */\nexport interface StreamRetryConfig {\n /** Maximum number of attempts (default: 1 = no retry) */\n maxAttempts: number;\n /** Delay between retries in milliseconds */\n delayMs: number;\n}\n\n/** @deprecated Use StreamRetryConfig */\nexport type RetryConfig = StreamRetryConfig;\n\n// ─── Backend Discovery ─────────────────────────────────────────\n\n/** Information about a registered backend */\nexport interface BackendInfo {\n /** Backend name (key in backends map) */\n name: string;\n}\n\n// ─── Provider CRUD Interface ───────────────────────────────────\n\n/**\n * Provider CRUD operations — separated per Interface Segregation Principle.\n * Implemented by IChatClient (which needs provider management for UI).\n * Not required on IChatRuntime (providers are a handler-layer concern).\n */\nexport interface IProviderClient {\n listProviders(): Promise<ProviderConfig[]>;\n createProvider(config: Omit<ProviderConfig, \"id\" | \"createdAt\">): Promise<ProviderConfig>;\n updateProvider(id: string, changes: Partial<Omit<ProviderConfig, \"id\" | \"createdAt\">>): Promise<void>;\n deleteProvider(id: string): Promise<void>;\n}\n\n// ─── IChatClient Interface (client-side remote) ────────────────\n\n/** Callback for provider selection changes */\nexport type SelectionChangeCallback = (providerId: string | null) => void;\n\n/**\n * Client-side interface for interacting with a remote chat server.\n * Fully self-contained — no shared base with IChatRuntime.\n * Extends IProviderClient for provider CRUD (ISP).\n * Used by React components and remote clients.\n *\n * @typeParam TMetadata - Type-level convenience for message metadata.\n * NOT enforced at the storage boundary — session stores always use `unknown`.\n * Consumers are responsible for metadata shape consistency.\n */\nexport interface IChatClient<TMetadata extends Record<string, unknown> = Record<string, unknown>>\n extends IProviderClient {\n\n // ── Lifecycle ──\n readonly status: RuntimeStatus;\n dispose(): Promise<void>;\n\n // ── Sessions ──\n createSession(options: CreateSessionOptions<TMetadata>): Promise<ChatSession<TMetadata>>;\n getSession(id: ChatIdLike): Promise<ChatSession<TMetadata> | null>;\n listSessions(options?: SessionListOptions): Promise<ChatSession<TMetadata>[]>;\n deleteSession(id: ChatIdLike): Promise<void>;\n\n // ── Client-side session state ──\n switchSession(id: ChatIdLike): Promise<ChatSession<TMetadata>>;\n readonly activeSessionId: ChatId | null;\n\n // ── Messaging ──\n /**\n * Send a message. Options are optional — the server handler resolves\n * model and backend from provider selection state.\n * Compare with IChatRuntime.send() where RuntimeSendOptions is required.\n */\n send(sessionId: ChatIdLike, message: string, options?: SendMessageOptions): AsyncIterable<ChatEvent>;\n\n // ── Messaging control ──\n abort(): void;\n\n // ── Provider Selection (local client state) ──\n selectProvider(providerId: string): void;\n readonly selectedProviderId: string | null;\n onSelectionChange(callback: SelectionChangeCallback): () => void;\n\n // ── Subscriptions ──\n onSessionChange(callback: () => void): () => void;\n\n // ── Discovery ──\n listModels(): Promise<ModelInfo[]>;\n listBackends(): Promise<BackendInfo[]>;\n\n // ── Context Stats ──\n getContextStats(sessionId: ChatIdLike): Promise<ContextStats | null>;\n}\n\n// ─── IChatRuntime Interface (server-only) ──────────────────────\n\n/**\n * Server-side chat runtime. Fully self-contained — no shared base with IChatClient.\n * Manages backend adapters, tools, middleware, and context trimming.\n * Does NOT include client-facing provider CRUD or selection — those are\n * handled by the server handler layer.\n *\n * @typeParam TMetadata - Type-level convenience for message metadata.\n * NOT enforced at the storage boundary — session stores always use `unknown`.\n * Casts in `ChatRuntime.createSession()`/`getSession()` are intentionally unsafe\n * to provide typed access. Consumers are responsible for metadata shape consistency.\n */\nexport interface IChatRuntime<TMetadata extends Record<string, unknown> = Record<string, unknown>> {\n\n // ── Lifecycle ──\n readonly status: RuntimeStatus;\n dispose(): Promise<void>;\n\n // ── Sessions ──\n createSession(options: CreateSessionOptions<TMetadata>): Promise<ChatSession<TMetadata>>;\n getSession(id: ChatIdLike): Promise<ChatSession<TMetadata> | null>;\n listSessions(options?: SessionListOptions): Promise<ChatSession<TMetadata>[]>;\n deleteSession(id: ChatIdLike): Promise<void>;\n\n // ── Messaging ──\n /**\n * Send a message. RuntimeSendOptions is required on the server — the caller\n * (usually a handler) must supply backend, model, and credentials.\n * Compare with IChatClient.send() where options are optional.\n */\n send(sessionId: ChatIdLike, message: string, options: RuntimeSendOptions): AsyncIterable<ChatEvent>;\n \n // ── Messaging control ──\n abort(): void;\n\n // ── Subscriptions ──\n onSessionChange(callback: () => void): () => void;\n\n // ── Discovery ──\n listModels(options?: { backend?: string; credentials?: AuthToken }): Promise<ModelInfo[]>;\n listBackends(): Promise<BackendInfo[]>;\n\n // ── Tools ──\n registerTool(tool: ToolDefinition): void;\n removeTool(name: string): void;\n readonly registeredTools: ReadonlyMap<string, ToolDefinition>;\n\n // ── Middleware ──\n use(middleware: ChatMiddleware): void;\n removeMiddleware(middleware: ChatMiddleware): void;\n\n // ── Context Stats ──\n getContextStats(sessionId: ChatIdLike): Promise<ContextStats | null>;\n}\n\n// ─── ChatRuntime Implementation ────────────────────────────────\n\nclass ChatRuntime<TMetadata extends Record<string, unknown> = Record<string, unknown>> implements IChatRuntime<TMetadata> {\n private readonly _state: StateMachine<RuntimeStatus>;\n private readonly _guard: ChatReentrancyGuard;\n private readonly _backends: Record<string, BackendAdapterFactory>;\n private readonly _sessionStore: IChatSessionStore;\n private readonly _contextConfig?: ContextWindowConfig;\n private readonly _ctxManager?: ContextWindowManager;\n private readonly _middleware: ChatMiddleware[];\n private readonly _tools = new Map<string, ToolDefinition>();\n private readonly _retryConfig?: StreamRetryConfig;\n private readonly _contextStats = new Map<ChatId, ContextStats>();\n private readonly _sessionUsage = new Map<ChatId, { promptTokens: number; completionTokens: number }>();\n private readonly _modelContextWindows = new Map<string, number>();\n private readonly _onContextTrimmed?: (sessionId: ChatIdLike, removedMessages: ChatMessage[]) => void;\n private readonly _streamTimeoutMs?: number;\n private readonly _sessionListeners = new ListenerSet<() => void>();\n\n private readonly _adapterPool = new Map<string, IChatBackend>();\n private readonly _defaultBackend: string;\n private _abortController: ChatAbortController | null = null;\n\n constructor(options: ChatRuntimeOptions) {\n this._state = new StateMachine<RuntimeStatus>(\"idle\", RUNTIME_TRANSITIONS);\n this._guard = new ChatReentrancyGuard();\n this._backends = options.backends;\n this._defaultBackend = options.defaultBackend;\n this._sessionStore = options.sessionStore;\n this._contextConfig = options.context;\n if (this._contextConfig) {\n this._ctxManager = new ContextWindowManager(this._contextConfig);\n }\n this._middleware = [...(options.middleware ?? [])];\n this._retryConfig = options.retryConfig;\n this._onContextTrimmed = options.onContextTrimmed;\n this._streamTimeoutMs = options.streamTimeoutMs;\n\n if (!options.backends[options.defaultBackend]) {\n throw new ChatError(\n `Default backend \"${options.defaultBackend}\" not found in backends map`,\n { code: ErrorCode.INVALID_INPUT },\n );\n }\n\n // Register initial tools if provided\n if (options.tools) {\n for (const tool of options.tools) {\n this._tools.set(tool.name, tool);\n }\n }\n }\n\n // ── Lifecycle ──────────────────────────────────────────────\n\n get status(): RuntimeStatus {\n return this._state.current;\n }\n\n async dispose(): Promise<void> {\n if (this._state.current === \"disposed\") return;\n\n // Abort any in-flight send\n this._abortController?.abort(\"Runtime disposed\");\n this._abortController?.dispose();\n this._abortController = null;\n\n // Direct transition to disposed from any state (streaming→disposed now valid)\n this._state.transition(\"disposed\");\n\n // Dispose all adapters in pool\n for (const adapter of this._adapterPool.values()) {\n try { await adapter.dispose(); } catch { /* best-effort */ }\n }\n this._adapterPool.clear();\n }\n\n // ── Sessions ───────────────────────────────────────────────\n\n async createSession(options: CreateSessionOptions<TMetadata>): Promise<ChatSession<TMetadata>> {\n this.assertNotDisposed();\n const config: ChatSessionConfig = {\n model: options.config?.model ?? \"\",\n backend: options.config?.backend ?? this._defaultBackend,\n ...options.config,\n };\n const session = await this._sessionStore.createSession({ ...options, config });\n this._notifySessionChange();\n // TMetadata safety: session store uses unknown metadata. Cast is intentional —\n // consumers control metadata shape via TMetadata generic at compile time.\n return session as ChatSession<TMetadata>;\n }\n\n async getSession(id: ChatIdLike): Promise<ChatSession<TMetadata> | null> {\n this.assertNotDisposed();\n const cid = toChatId(id);\n return this._sessionStore.getSession(cid) as Promise<ChatSession<TMetadata> | null>;\n }\n\n async listSessions(options?: SessionListOptions): Promise<ChatSession<TMetadata>[]> {\n this.assertNotDisposed();\n return this._sessionStore.listSessions(options) as Promise<ChatSession<TMetadata>[]>;\n }\n\n async deleteSession(id: ChatIdLike): Promise<void> {\n this.assertNotDisposed();\n const cid = toChatId(id);\n const session = await this._sessionStore.getSession(cid);\n if (!session) return;\n\n await this._sessionStore.deleteSession(cid);\n this._contextStats.delete(cid);\n this._sessionUsage.delete(cid);\n this._notifySessionChange();\n }\n\n // ── Messaging ──────────────────────────────────────────────\n\n async *send(\n sessionId: ChatIdLike,\n message: string,\n options: RuntimeSendOptions,\n ): AsyncIterable<ChatEvent> {\n this.validateSendInput(message, options);\n this._guard.acquire();\n\n const cid = toChatId(sessionId);\n this._abortController = new ChatAbortController(options?.signal);\n\n try {\n if (this._state.current === \"error\") {\n this._state.transition(\"idle\");\n }\n this._state.transition(\"streaming\");\n\n await this.loadSession(cid);\n const mwCtx: ChatMiddlewareContext = {\n sessionId: cid,\n signal: this._abortController.signal,\n };\n\n const userMessage = await this.applyBeforeSendMiddleware(\n this.createUserMessage(message), mwCtx,\n );\n if (userMessage === null) {\n // Middleware rejected the send — transition back to idle silently\n this._state.transition(\"idle\");\n return;\n }\n const updatedSession = await this.persistAndReload(cid, userMessage);\n const sessionForAdapter = await this.trimSessionContext(cid, updatedSession, options.model);\n\n const stream = await this.prepareEventStream(\n cid, sessionForAdapter, updatedSession, message, options,\n );\n\n const accumulator = new MessageAccumulator();\n const eventSource = this._streamTimeoutMs\n ? withStreamWatchdog(stream, { timeoutMs: this._streamTimeoutMs, signal: this._abortController.signal })\n : stream;\n\n for await (const event of eventSource) {\n if (this._abortController.isAborted) break;\n this.feedAccumulator(accumulator, event);\n\n // Capture real usage data from usage events\n if (event.type === \"usage\") {\n this._sessionUsage.set(cid, {\n promptTokens: event.promptTokens,\n completionTokens: event.completionTokens,\n });\n this.updateContextStatsWithUsage(cid, event.promptTokens, event.completionTokens, options);\n }\n\n const processed = await this.applyOnEventMiddleware(event, mwCtx);\n if (processed) yield processed;\n }\n\n if (this._state.current === \"disposed\") return;\n\n await this.finalizeAssistantMessage(cid, accumulator, mwCtx);\n\n this._state.transition(\"idle\");\n } catch (error) {\n const result = await this.handleSendError(error, cid);\n if (result !== null) throw result;\n // null = error suppressed by middleware, exit silently\n } finally {\n this._guard.release();\n this._abortController?.dispose();\n this._abortController = null;\n }\n }\n\n // ── Send Pipeline Stages ──────────────────────────────────────\n\n /** Stage 1: Validate send inputs (message content + required fields). */\n private validateSendInput(message: string, options: RuntimeSendOptions): void {\n this.assertNotDisposed();\n\n if (!message || message.trim().length === 0) {\n throw new ChatError(\"Message cannot be empty\", { code: ErrorCode.INVALID_INPUT });\n }\n\n if (!options.model) {\n throw new ChatError(\n \"options.model is required — caller must specify which model to use\",\n { code: ErrorCode.INVALID_INPUT },\n );\n }\n\n if (!options.backend) {\n throw new ChatError(\n \"options.backend is required — caller must specify which backend to use\",\n { code: ErrorCode.INVALID_INPUT },\n );\n }\n\n if (!options.credentials) {\n throw new ChatError(\n \"options.credentials is required — caller must provide authentication credentials\",\n { code: ErrorCode.INVALID_INPUT },\n );\n }\n }\n\n /** Stage 2: Load session from store. */\n private async loadSession(cid: ChatId): Promise<ChatSession> {\n const session = await this._sessionStore.getSession(cid);\n if (!session) {\n throw new ChatError(\n `Session \"${cid}\" not found`,\n { code: ErrorCode.SESSION_NOT_FOUND },\n );\n }\n return session;\n }\n\n /** Stage 3: Apply onBeforeSend middleware pipeline. Returns null if middleware rejected the send. */\n private async applyBeforeSendMiddleware(\n userMessage: ChatMessage,\n ctx: ChatMiddlewareContext,\n ): Promise<ChatMessage | null> {\n let msg: ChatMessage | null = userMessage;\n for (const mw of this._middleware) {\n if (mw.onBeforeSend && msg) {\n msg = await mw.onBeforeSend(msg, ctx);\n if (msg === null) return null;\n }\n }\n return msg;\n }\n\n /** Stage 4: Persist user message and reload session with full history. */\n private async persistAndReload(cid: ChatId, userMessage: ChatMessage): Promise<ChatSession> {\n await this._sessionStore.appendMessage(cid, userMessage);\n return (await this._sessionStore.getSession(cid))!;\n }\n\n /** Stage 5: Auto-trim context window if configured. Returns session snapshot for adapter. */\n private async trimSessionContext(cid: ChatId, session: ChatSession, model?: string): Promise<ChatSession> {\n if (!this._ctxManager) return session;\n\n const ctxManager = this._ctxManager;\n const lastUsage = this._sessionUsage.get(cid);\n const modelContextWindow = model ? this._modelContextWindows.get(model) : undefined;\n\n // When real usage data is available, use average-based trimming\n if (lastUsage && modelContextWindow) {\n const result = ctxManager.fitMessagesWithUsage(\n session.messages,\n lastUsage.promptTokens,\n modelContextWindow,\n );\n\n this._contextStats.set(cid, {\n totalTokens: result.totalTokens,\n removedCount: result.removedCount,\n wasTruncated: result.wasTruncated,\n availableBudget: Math.max(0, modelContextWindow - result.totalTokens),\n realPromptTokens: lastUsage.promptTokens,\n realCompletionTokens: lastUsage.completionTokens,\n modelContextWindow,\n });\n\n if (result.wasTruncated && this._onContextTrimmed) {\n const keptIds = new Set(result.messages.map(m => m.id));\n const removed = session.messages.filter(m => !keptIds.has(m.id));\n if (removed.length > 0) {\n try { this._onContextTrimmed(cid, removed); } catch { /* swallow user callback errors */ }\n }\n }\n\n return { ...session, messages: result.messages };\n }\n\n // First message (no prior usage data): skip trimming, rely on model's large context window\n // Still use heuristic-based trimming as safety net via fitMessagesAsync\n const result = await ctxManager.fitMessagesAsync(session.messages);\n\n this._contextStats.set(cid, {\n totalTokens: result.totalTokens,\n removedCount: result.removedCount,\n wasTruncated: result.wasTruncated,\n availableBudget: ctxManager.availableBudget,\n modelContextWindow,\n });\n\n if (result.wasTruncated && this._onContextTrimmed) {\n const keptIds = new Set(result.messages.map(m => m.id));\n const removed = session.messages.filter(m => !keptIds.has(m.id));\n if (removed.length > 0) {\n try { this._onContextTrimmed(cid, removed); } catch { /* swallow user callback errors */ }\n }\n }\n\n return { ...session, messages: result.messages };\n }\n\n /** Update context stats with real usage data from a usage event. */\n private updateContextStatsWithUsage(\n cid: ChatId,\n promptTokens: number,\n completionTokens: number,\n options: RuntimeSendOptions,\n ): void {\n const modelContextWindow = options.model\n ? this._modelContextWindows.get(options.model)\n : undefined;\n\n const existing = this._contextStats.get(cid);\n this._contextStats.set(cid, {\n totalTokens: promptTokens,\n removedCount: existing?.removedCount ?? 0,\n wasTruncated: existing?.wasTruncated ?? false,\n availableBudget: modelContextWindow\n ? Math.max(0, modelContextWindow - promptTokens)\n : (existing?.availableBudget ?? 0),\n realPromptTokens: promptTokens,\n realCompletionTokens: completionTokens,\n modelContextWindow,\n });\n }\n\n /** Stage 6: Prepare event stream — adapter with retry, tool injection. */\n private async prepareEventStream(\n cid: ChatId,\n sessionForAdapter: ChatSession,\n fullSession: ChatSession,\n message: string,\n options: RuntimeSendOptions,\n ): Promise<AsyncIterable<ChatEvent>> {\n const adapter = await this.getOrCreateAdapterWithRetry(options.backend, options.credentials);\n\n const runtimeTools = this._tools.size > 0\n ? this.injectToolContext([...this._tools.values()], {\n sessionId: cid as string,\n custom: fullSession.metadata?.custom as Record<string, unknown> | undefined,\n })\n : undefined;\n\n const streamOptions: SendMessageOptions = {\n signal: this._abortController!.signal,\n model: options.model,\n systemPrompt: options.systemPrompt,\n tools: runtimeTools,\n };\n\n return this.createStreamWithRetry(\n adapter, sessionForAdapter, message, streamOptions,\n options.backend, options.credentials,\n );\n }\n\n /** Stage 7: Apply onEvent middleware pipeline (sequential transform/suppress). */\n private async applyOnEventMiddleware(\n event: ChatEvent,\n ctx: ChatMiddlewareContext,\n ): Promise<ChatEvent | null> {\n let processed: ChatEvent | null = event;\n for (const mw of this._middleware) {\n if (mw.onEvent && processed) {\n processed = await mw.onEvent(processed, ctx);\n }\n }\n return processed;\n }\n\n /** Stage 8: Finalize accumulator, apply afterReceive middleware, persist assistant message. */\n private async finalizeAssistantMessage(\n cid: ChatId,\n accumulator: MessageAccumulator,\n ctx: ChatMiddlewareContext,\n ): Promise<void> {\n let assistantMessage = accumulator.finalize();\n\n for (const mw of this._middleware) {\n if (mw.onAfterReceive) {\n assistantMessage = await mw.onAfterReceive(assistantMessage, ctx);\n }\n }\n\n await this._sessionStore.appendMessage(cid, assistantMessage);\n this._notifySessionChange();\n }\n\n /** Stage 9: Error handling — apply onError middleware, transition state. Returns null if suppressed. */\n private async handleSendError(error: unknown, cid: ChatId): Promise<Error | null> {\n let processedError = error instanceof Error ? error : new Error(String(error));\n const ctx: ChatMiddlewareContext = {\n sessionId: cid,\n signal: this._abortController?.signal ?? new AbortController().signal,\n };\n\n for (const mw of this._middleware) {\n if (mw.onError) {\n const result = await mw.onError(processedError, ctx);\n if (result === null) {\n if (this._state.canTransition(\"idle\")) {\n this._state.transition(\"idle\");\n }\n return null;\n }\n processedError = result;\n }\n }\n\n if (this._state.canTransition(\"error\")) {\n this._state.transition(\"error\");\n }\n return processedError;\n }\n\n abort(): void {\n this._abortController?.abort(\"User abort\");\n }\n\n // ── Backend / Model ────────────────────────────────────────\n\n async listModels(options?: { backend?: string; credentials?: AuthToken }): Promise<ModelInfo[]> {\n this.assertNotDisposed();\n let models: ModelInfo[] = [];\n // Use existing adapter from pool if available\n const firstAdapter = [...this._adapterPool.values()][0];\n if (firstAdapter) {\n try { models = await firstAdapter.listModels(); } catch { return []; }\n } else if (options?.backend && options?.credentials) {\n // Pool empty — try to create adapter from provided credentials\n try {\n const adapter = await this.getOrCreateAdapter(options.backend, options.credentials);\n models = await adapter.listModels();\n } catch { return []; }\n }\n // Cache context windows for models that provide them\n for (const model of models) {\n if (model.contextWindow != null) {\n this._modelContextWindows.set(model.id, model.contextWindow);\n }\n }\n return models;\n }\n\n async listBackends(): Promise<BackendInfo[]> {\n this.assertNotDisposed();\n return Object.keys(this._backends).map((name) => ({ name }));\n }\n\n // ── Tools ──────────────────────────────────────────────────\n\n get registeredTools(): ReadonlyMap<string, ToolDefinition> {\n return this._tools;\n }\n\n registerTool(tool: ToolDefinition): void {\n this.assertNotDisposed();\n this._tools.set(tool.name, tool);\n }\n\n removeTool(name: string): void {\n this.assertNotDisposed();\n this._tools.delete(name);\n }\n\n // ── Middleware ──────────────────────────────────────────────\n\n use(middleware: ChatMiddleware): void {\n this.assertNotDisposed();\n this._middleware.push(middleware);\n }\n\n removeMiddleware(middleware: ChatMiddleware): void {\n this.assertNotDisposed();\n const idx = this._middleware.indexOf(middleware);\n if (idx >= 0) this._middleware.splice(idx, 1);\n }\n\n // ── Context Stats ─────────────────────────────────────────\n\n async getContextStats(sessionId: ChatIdLike): Promise<ContextStats | null> {\n const cid = toChatId(sessionId);\n return this._contextStats.get(cid) ?? null;\n }\n\n // ── Session Subscription ──────────────────────────────────\n\n onSessionChange(callback: () => void): () => void {\n return this._sessionListeners.add(callback);\n }\n\n private _notifySessionChange(): void {\n this._sessionListeners.notify();\n }\n\n // ── Private Helpers ────────────────────────────────────────\n\n private async getOrCreateAdapter(backend: string, credentials: AuthToken): Promise<IChatBackend> {\n const key = this.getPoolKey(backend, credentials);\n const existing = this._adapterPool.get(key);\n if (existing) return existing;\n\n // Dispose stale adapters for same backend with different credentials\n for (const [oldKey, oldAdapter] of this._adapterPool) {\n if (oldKey.startsWith(backend + \":\")) {\n try { await oldAdapter.dispose(); } catch { /* best-effort */ }\n this._adapterPool.delete(oldKey);\n }\n }\n\n const factory = this._backends[backend];\n if (!factory) {\n throw new ChatError(\n `Backend \"${backend}\" not found`,\n { code: ErrorCode.INVALID_INPUT },\n );\n }\n\n const adapter = await factory(credentials);\n\n this._adapterPool.set(key, adapter);\n return adapter;\n }\n\n private getPoolKey(backend: string, credentials: AuthToken): string {\n const token = credentials.accessToken;\n const hash = token.length > 16 ? token.slice(0, 8) + token.slice(-8) : token;\n return `${backend}:${hash}`;\n }\n\n /** Wrap each tool's execute to inject ToolContext as 2nd argument */\n private injectToolContext(tools: ToolDefinition[], context: ToolContext): ToolDefinition[] {\n return tools.map(tool => ({\n ...tool,\n execute: (params: unknown) => tool.execute(params, context),\n }));\n }\n\n /** Map ChatEvent to AgentEvent for MessageAccumulator */\n private feedAccumulator(acc: MessageAccumulator, event: ChatEvent): void {\n const agentEvent = chatEventToAgentEvent(event);\n if (agentEvent) acc.apply(agentEvent);\n }\n\n private createUserMessage(text: string): ChatMessage {\n return {\n id: createChatId(),\n role: \"user\",\n parts: [{ type: \"text\", text, status: \"complete\" }],\n createdAt: new Date().toISOString(),\n status: \"complete\",\n };\n }\n\n private assertNotDisposed(): void {\n if (this._state.current === \"disposed\") {\n throw new ChatError(\n \"Runtime is disposed\",\n { code: ErrorCode.DISPOSED },\n );\n }\n }\n\n /** Get or create adapter with retry on connection errors */\n private async getOrCreateAdapterWithRetry(backend: string, credentials: AuthToken): Promise<IChatBackend> {\n const maxAttempts = this._retryConfig?.maxAttempts ?? 1;\n const delayMs = this._retryConfig?.delayMs ?? 0;\n let lastError: Error | undefined;\n\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n try {\n return await this.getOrCreateAdapter(backend, credentials);\n } catch (err) {\n lastError = err instanceof Error ? err : new Error(String(err));\n if (attempt < maxAttempts) {\n // Remove cached adapter so next attempt creates fresh\n const key = this.getPoolKey(backend, credentials);\n const old = this._adapterPool.get(key);\n if (old) { try { await old.dispose(); } catch { /* best-effort */ } }\n this._adapterPool.delete(key);\n await delay(delayMs);\n }\n }\n }\n\n throw lastError!;\n }\n\n /**\n * Create stream with retry for pre-stream connection errors.\n * Tries to get the first event from the stream; if that fails,\n * retries with a fresh adapter. Once first event is received,\n * the stream is committed (no more retries).\n */\n private async createStreamWithRetry(\n adapter: IChatBackend,\n session: ChatSession,\n message: string,\n options: SendMessageOptions | undefined,\n backend: string,\n credentials: AuthToken,\n ): Promise<AsyncIterable<ChatEvent>> {\n const maxAttempts = this._retryConfig?.maxAttempts ?? 1;\n const delayMs = this._retryConfig?.delayMs ?? 0;\n let lastError: Error | undefined;\n let currentAdapter = adapter;\n\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n try {\n const stream = currentAdapter.streamMessage(session, message, options);\n const iterator = (stream as AsyncIterable<ChatEvent>)[Symbol.asyncIterator]();\n const first = await iterator.next();\n\n // First event received — stream is live. Wrap remaining into iterable.\n return (async function* () {\n if (!first.done) yield first.value;\n while (true) {\n const next = await iterator.next();\n if (next.done) break;\n yield next.value;\n }\n })();\n } catch (err) {\n lastError = err instanceof Error ? err : new Error(String(err));\n if (attempt < maxAttempts) {\n // Dispose failed adapter before creating fresh one\n try { await currentAdapter.dispose(); } catch { /* best-effort */ }\n const key = this.getPoolKey(backend, credentials);\n this._adapterPool.delete(key);\n await delay(delayMs);\n currentAdapter = await this.getOrCreateAdapter(backend, credentials);\n }\n }\n }\n\n throw lastError!;\n }\n}\n\n// ─── Helpers ───────────────────────────────────────────────────\n\nfunction delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n// ─── Factory ───────────────────────────────────────────────────\n\n/**\n * Create a fully-wired chat runtime from configuration.\n *\n * @param options - Runtime configuration (backends, session store, context, middleware)\n * @returns IChatRuntime instance ready to use\n *\n * @example\n * ```typescript\n * import { createChatRuntime } from \"@witqq/agent-sdk/chat/runtime\";\n * import { InMemorySessionStore } from \"@witqq/agent-sdk/chat/sessions\";\n *\n * const runtime = createChatRuntime({\n * backends: {\n * copilot: () => new CopilotAdapter({ agentConfig: { model: \"gpt-4\" } }),\n * },\n * defaultBackend: \"copilot\",\n * sessionStore: new InMemorySessionStore(),\n * });\n * ```\n */\nexport function createChatRuntime<TMetadata extends Record<string, unknown> = Record<string, unknown>>(\n options: ChatRuntimeOptions,\n): IChatRuntime<TMetadata> {\n return new ChatRuntime<TMetadata>(options);\n}\n","/**\n * @witqq/agent-sdk/chat/storage\n *\n * Generic storage adapter layer with pluggable backends.\n * Provides CRUD operations for any data type via `IStorageAdapter<T>`.\n * Implementations: `InMemoryStorage` (Map-based) and `FileStorage` (JSON files).\n */\n\nimport { existsSync, mkdirSync } from \"node:fs\";\nimport { access, mkdir, readdir, readFile, unlink, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { AgentSDKError } from \"../errors.js\";\nimport { ErrorCode } from \"../types/errors.js\";\n\n// ─── Storage Errors ────────────────────────────────────────────\n\n/**\n * Error thrown by storage operations.\n *\n * @example\n * ```typescript\n * try {\n * await store.get(\"missing-id\");\n * } catch (e) {\n * if (e instanceof StorageError && e.code === ErrorCode.STORAGE_NOT_FOUND) {\n * // handle missing item\n * }\n * }\n * ```\n */\nexport class StorageError extends AgentSDKError {\n /** Machine-readable error code from the unified ErrorCode enum */\n readonly code: StorageErrorCode;\n\n constructor(message: string, code: StorageErrorCode) {\n super(message);\n this.name = \"StorageError\";\n this.code = code;\n }\n}\n\n/** Storage-specific subset of ErrorCode */\nexport type StorageErrorCode =\n | ErrorCode.STORAGE_NOT_FOUND\n | ErrorCode.STORAGE_DUPLICATE_KEY\n | ErrorCode.STORAGE_IO_ERROR\n | ErrorCode.STORAGE_SERIALIZATION_ERROR;\n\n// ─── Storage Adapter Interface ─────────────────────────────────\n\n/**\n * Options for listing stored items.\n *\n * @typeParam T - The type of stored items\n */\nexport interface ListOptions<T> {\n /** Filter predicate — return `true` to include the item */\n filter?: (item: T) => boolean;\n /** Sort comparator — standard Array.sort semantics */\n sort?: (a: T, b: T) => number;\n /** Maximum number of items to return */\n limit?: number;\n /** Number of items to skip (for pagination) */\n offset?: number;\n}\n\n/**\n * Generic storage adapter for CRUD operations on any data type.\n * Items are identified by a string key.\n *\n * @typeParam T - The type of stored items\n *\n * @example\n * ```typescript\n * const store: IStorageAdapter<{ name: string }> = new InMemoryStorage();\n * await store.create(\"key1\", { name: \"Alice\" });\n * const item = await store.get(\"key1\"); // { name: \"Alice\" }\n * ```\n */\nexport interface IStorageAdapter<T> {\n /**\n * Retrieve an item by key.\n * @param key - Unique identifier\n * @returns The item, or `null` if not found\n */\n get(key: string): Promise<T | null>;\n\n /**\n * List items with optional filtering, sorting, and pagination.\n * @param options - Filter, sort, limit, offset options\n * @returns Array of matching items\n */\n list(options?: ListOptions<T>): Promise<T[]>;\n\n /**\n * Create a new item. Throws `StorageError` with code `DUPLICATE_KEY` if key exists.\n * @param key - Unique identifier\n * @param item - Data to store\n */\n create(key: string, item: T): Promise<void>;\n\n /**\n * Update an existing item. Throws `StorageError` with code `NOT_FOUND` if key missing.\n * @param key - Unique identifier\n * @param item - Updated data\n */\n update(key: string, item: T): Promise<void>;\n\n /**\n * Delete an item by key. Throws `StorageError` with code `NOT_FOUND` if key missing.\n * @param key - Unique identifier\n */\n delete(key: string): Promise<void>;\n\n /**\n * Check whether a key exists.\n * @param key - Unique identifier\n * @returns `true` if key exists\n */\n has(key: string): Promise<boolean>;\n\n /**\n * Return the number of stored items.\n * @returns Count of items\n */\n count(): Promise<number>;\n\n /**\n * Remove all items from storage.\n */\n clear(): Promise<void>;\n\n /**\n * Release any resources held by this adapter (DB connections, file handles).\n * Optional — adapters that don't hold resources need not implement this.\n */\n dispose?(): Promise<void>;\n}\n\n// ─── InMemoryStorage ───────────────────────────────────────────\n\n/**\n * In-memory storage adapter backed by a `Map`.\n * Suitable for development, testing, and short-lived processes.\n * Data is lost when the process exits.\n *\n * @typeParam T - The type of stored items\n *\n * @example\n * ```typescript\n * const store = new InMemoryStorage<{ name: string }>();\n * await store.create(\"k1\", { name: \"Alice\" });\n * await store.create(\"k2\", { name: \"Bob\" });\n * const items = await store.list({ filter: i => i.name.startsWith(\"A\") });\n * // [{ name: \"Alice\" }]\n * ```\n */\nexport class InMemoryStorage<T> implements IStorageAdapter<T> {\n private readonly data = new Map<string, T>();\n\n /** @inheritdoc */\n async get(key: string): Promise<T | null> {\n const item = this.data.get(key);\n return item !== undefined ? structuredClone(item) : null;\n }\n\n /** @inheritdoc */\n async list(options?: ListOptions<T>): Promise<T[]> {\n let items = Array.from(this.data.values()).map((item) => structuredClone(item));\n\n if (options?.filter) {\n items = items.filter(options.filter);\n }\n if (options?.sort) {\n items.sort(options.sort);\n }\n if (options?.offset !== undefined) {\n items = items.slice(options.offset);\n }\n if (options?.limit !== undefined) {\n items = items.slice(0, options.limit);\n }\n\n return items;\n }\n\n /** @inheritdoc */\n async create(key: string, item: T): Promise<void> {\n if (this.data.has(key)) {\n throw new StorageError(\n `Item with key \"${key}\" already exists`,\n ErrorCode.STORAGE_DUPLICATE_KEY,\n );\n }\n this.data.set(key, structuredClone(item));\n }\n\n /** @inheritdoc */\n async update(key: string, item: T): Promise<void> {\n if (!this.data.has(key)) {\n throw new StorageError(\n `Item with key \"${key}\" not found`,\n ErrorCode.STORAGE_NOT_FOUND,\n );\n }\n this.data.set(key, structuredClone(item));\n }\n\n /** @inheritdoc */\n async delete(key: string): Promise<void> {\n if (!this.data.has(key)) {\n throw new StorageError(\n `Item with key \"${key}\" not found`,\n ErrorCode.STORAGE_NOT_FOUND,\n );\n }\n this.data.delete(key);\n }\n\n /** @inheritdoc */\n async has(key: string): Promise<boolean> {\n return this.data.has(key);\n }\n\n /** @inheritdoc */\n async count(): Promise<number> {\n return this.data.size;\n }\n\n /** @inheritdoc */\n async clear(): Promise<void> {\n this.data.clear();\n }\n}\n\n// ─── FileStorage ───────────────────────────────────────────────\n\n/**\n * Options for configuring `FileStorage`.\n */\nexport interface FileStorageOptions {\n /** Directory path where JSON files are stored */\n directory: string;\n /** File extension (default: `.json`) */\n extension?: string;\n}\n\n/**\n * File-based storage adapter that persists each item as a JSON file.\n * Suitable for local applications, CLI tools, and development.\n * Creates the storage directory if it doesn't exist.\n *\n * @typeParam T - The type of stored items (must be JSON-serializable)\n *\n * @example\n * ```typescript\n * const store = new FileStorage<ChatSession>({\n * directory: \"./data/sessions\",\n * });\n * await store.create(\"session-1\", mySession);\n * ```\n */\nexport class FileStorage<T> implements IStorageAdapter<T> {\n private readonly directory: string;\n private readonly extension: string;\n\n constructor(options: FileStorageOptions) {\n this.directory = options.directory;\n this.extension = options.extension ?? \".json\";\n this.ensureDirectorySync();\n }\n\n /** @inheritdoc */\n async get(key: string): Promise<T | null> {\n const filePath = this.keyToPath(key);\n if (!(await this.fileExists(filePath))) {\n return null;\n }\n return this.readJsonFile(filePath);\n }\n\n /** @inheritdoc */\n async list(options?: ListOptions<T>): Promise<T[]> {\n await this.ensureDirectoryAsync();\n const files = (await readdir(this.directory)).filter((f) =>\n f.endsWith(this.extension),\n );\n\n let items: T[] = [];\n for (const file of files) {\n const item = await this.readJsonFile(join(this.directory, file));\n items.push(item);\n }\n\n if (options?.filter) {\n items = items.filter(options.filter);\n }\n if (options?.sort) {\n items.sort(options.sort);\n }\n if (options?.offset !== undefined) {\n items = items.slice(options.offset);\n }\n if (options?.limit !== undefined) {\n items = items.slice(0, options.limit);\n }\n\n return items;\n }\n\n /** @inheritdoc */\n async create(key: string, item: T): Promise<void> {\n const filePath = this.keyToPath(key);\n if (await this.fileExists(filePath)) {\n throw new StorageError(\n `Item with key \"${key}\" already exists`,\n ErrorCode.STORAGE_DUPLICATE_KEY,\n );\n }\n await this.writeJsonFile(filePath, item);\n }\n\n /** @inheritdoc */\n async update(key: string, item: T): Promise<void> {\n const filePath = this.keyToPath(key);\n if (!(await this.fileExists(filePath))) {\n throw new StorageError(\n `Item with key \"${key}\" not found`,\n ErrorCode.STORAGE_NOT_FOUND,\n );\n }\n await this.writeJsonFile(filePath, item);\n }\n\n /** @inheritdoc */\n async delete(key: string): Promise<void> {\n const filePath = this.keyToPath(key);\n if (!(await this.fileExists(filePath))) {\n throw new StorageError(\n `Item with key \"${key}\" not found`,\n ErrorCode.STORAGE_NOT_FOUND,\n );\n }\n await unlink(filePath);\n }\n\n /** @inheritdoc */\n async has(key: string): Promise<boolean> {\n return this.fileExists(this.keyToPath(key));\n }\n\n /** @inheritdoc */\n async count(): Promise<number> {\n await this.ensureDirectoryAsync();\n return (await readdir(this.directory)).filter((f) =>\n f.endsWith(this.extension),\n ).length;\n }\n\n /** @inheritdoc */\n async clear(): Promise<void> {\n await this.ensureDirectoryAsync();\n const files = (await readdir(this.directory)).filter((f) =>\n f.endsWith(this.extension),\n );\n for (const file of files) {\n await unlink(join(this.directory, file));\n }\n }\n\n private keyToPath(key: string): string {\n const safeKey = key.replace(/[^a-zA-Z0-9_-]/g, (c) =>\n \"%\" + c.charCodeAt(0).toString(16).padStart(2, \"0\"),\n );\n return join(this.directory, `${safeKey}${this.extension}`);\n }\n\n /** Sync directory init — used only in constructor (one-time). */\n private ensureDirectorySync(): void {\n if (!existsSync(this.directory)) {\n mkdirSync(this.directory, { recursive: true });\n }\n }\n\n /** Async directory init — used in operations. */\n private async ensureDirectoryAsync(): Promise<void> {\n if (!(await this.fileExists(this.directory))) {\n await mkdir(this.directory, { recursive: true });\n }\n }\n\n private async fileExists(filePath: string): Promise<boolean> {\n try {\n await access(filePath);\n return true;\n } catch {\n return false;\n }\n }\n\n private async readJsonFile(filePath: string): Promise<T> {\n try {\n const content = await readFile(filePath, \"utf-8\");\n return JSON.parse(content) as T;\n } catch (error) {\n if (error instanceof SyntaxError) {\n throw new StorageError(\n `Failed to parse file: ${filePath}`,\n ErrorCode.STORAGE_SERIALIZATION_ERROR,\n );\n }\n throw new StorageError(\n `Failed to read file: ${filePath}`,\n ErrorCode.STORAGE_IO_ERROR,\n );\n }\n }\n\n private async writeJsonFile(filePath: string, item: T): Promise<void> {\n try {\n const content = JSON.stringify(item, null, 2);\n await writeFile(filePath, content, \"utf-8\");\n } catch {\n throw new StorageError(\n `Failed to write file: ${filePath}`,\n ErrorCode.STORAGE_IO_ERROR,\n );\n }\n }\n}\n","/**\n * @witqq/agent-sdk/chat/sessions\n *\n * Session store layer wrapping generic storage adapters.\n * Provides session-specific operations: message management,\n * paginated retrieval, search, and session lifecycle.\n */\n\nimport type {\n ChatSession,\n ChatMessage,\n ChatId,\n ChatSessionConfig,\n} from \"./core.js\";\nimport { createChatId } from \"./core.js\";\nimport type { IStorageAdapter, ListOptions } from \"./storage.js\";\nimport { InMemoryStorage, FileStorage, StorageError } from \"./storage.js\";\nimport { ErrorCode } from \"../types/errors.js\";\n\n// ─── Session Store Interface ───────────────────────────────────\n\n/** Options for creating a new session */\nexport interface CreateSessionOptions<TCustom extends Record<string, unknown> = Record<string, unknown>> {\n /** Session title (defaults to \"Untitled\") */\n title?: string;\n /** Session configuration (optional — runtime defaults used when omitted) */\n config?: Partial<ChatSessionConfig>;\n /** Initial tags */\n tags?: string[];\n /** Custom metadata */\n custom?: TCustom;\n}\n\n/** Paginated result of messages */\nexport interface PaginatedMessages {\n /** Messages in this page */\n messages: ChatMessage[];\n /** Total number of messages in session */\n total: number;\n /** Whether there are more messages after this page */\n hasMore: boolean;\n}\n\n/** Options for listing sessions */\nexport interface SessionListOptions {\n /** Filter predicate */\n filter?: (session: ChatSession) => boolean;\n /** Sort comparator */\n sort?: (a: ChatSession, b: ChatSession) => number;\n /** Maximum number of sessions to return */\n limit?: number;\n /** Number of sessions to skip */\n offset?: number;\n}\n\n/** Search options for finding sessions */\nexport interface SessionSearchOptions {\n /** Text query to match against title and message content */\n query: string;\n /** Maximum results (default: 20) */\n limit?: number;\n}\n\n/**\n * Read-only session operations.\n * Consumers needing read-only access (dashboards, analytics) implement only this.\n */\nexport interface ISessionReader {\n getSession(id: ChatId): Promise<ChatSession | null>;\n listSessions(options?: SessionListOptions): Promise<ChatSession[]>;\n loadMessages(\n sessionId: ChatId,\n options?: { limit?: number; offset?: number },\n ): Promise<PaginatedMessages>;\n searchSessions(options: SessionSearchOptions): Promise<ChatSession[]>;\n count(): Promise<number>;\n}\n\n/**\n * Write/mutate session operations.\n * Consumers needing full access implement both ISessionReader & ISessionWriter.\n */\nexport interface ISessionWriter {\n createSession(options: CreateSessionOptions): Promise<ChatSession>;\n updateTitle(id: ChatId, title: string): Promise<void>;\n updateConfig(id: ChatId, config: Partial<ChatSessionConfig>): Promise<void>;\n deleteSession(id: ChatId): Promise<void>;\n appendMessage(sessionId: ChatId, message: ChatMessage): Promise<void>;\n saveMessages(sessionId: ChatId, messages: ChatMessage[]): Promise<void>;\n clear(): Promise<void>;\n /** Release any resources held by this store (optional). */\n dispose?(): Promise<void>;\n}\n\n/**\n * Full session store interface — union of reader and writer.\n * Backward-compatible: all existing implementations continue to work.\n *\n * @example\n * ```typescript\n * const store = new InMemorySessionStore();\n * const session = await store.createSession({ config: { model: \"gpt-4\", backend: \"vercel-ai\" } });\n * await store.appendMessage(session.id, message);\n * const page = await store.loadMessages(session.id, { limit: 20, offset: 0 });\n * ```\n */\nexport interface IChatSessionStore extends ISessionReader, ISessionWriter {}\n\n// ─── Base Session Store ────────────────────────────────────────\n\n/**\n * Base session store implementation backed by any `IStorageAdapter<ChatSession>`.\n * Handles all session-specific logic; subclasses only need to provide the adapter.\n */\nclass BaseSessionStore implements IChatSessionStore {\n constructor(protected readonly adapter: IStorageAdapter<ChatSession>) {}\n\n async createSession(options: CreateSessionOptions): Promise<ChatSession> {\n const now = new Date().toISOString();\n const id = createChatId();\n const session: ChatSession = {\n id,\n title: options.title ?? \"Untitled\",\n messages: [],\n config: {\n model: options.config?.model ?? \"\",\n backend: options.config?.backend ?? \"\",\n ...options.config,\n },\n metadata: {\n messageCount: 0,\n totalTokens: 0,\n tags: options.tags ? [...options.tags] : undefined,\n custom: options.custom ? { ...options.custom } : undefined,\n },\n status: \"active\" as const,\n createdAt: now,\n updatedAt: now,\n };\n await this.adapter.create(id, session);\n return structuredClone(session);\n }\n\n async getSession(id: ChatId): Promise<ChatSession | null> {\n return this.adapter.get(id);\n }\n\n async listSessions(options?: SessionListOptions): Promise<ChatSession[]> {\n return this.adapter.list(options as ListOptions<ChatSession>);\n }\n\n async updateTitle(id: ChatId, title: string): Promise<void> {\n const session = await this.adapter.get(id);\n if (!session) {\n throw new StorageError(`Session \"${id}\" not found`, ErrorCode.STORAGE_NOT_FOUND);\n }\n session.title = title;\n session.updatedAt = new Date().toISOString();\n await this.adapter.update(id, session);\n }\n\n async updateConfig(\n id: ChatId,\n config: Partial<ChatSessionConfig>,\n ): Promise<void> {\n const session = await this.adapter.get(id);\n if (!session) {\n throw new StorageError(`Session \"${id}\" not found`, ErrorCode.STORAGE_NOT_FOUND);\n }\n session.config = { ...session.config, ...config };\n session.updatedAt = new Date().toISOString();\n await this.adapter.update(id, session);\n }\n\n async deleteSession(id: ChatId): Promise<void> {\n await this.adapter.delete(id);\n }\n\n async appendMessage(sessionId: ChatId, message: ChatMessage): Promise<void> {\n const session = await this.adapter.get(sessionId);\n if (!session) {\n throw new StorageError(`Session \"${sessionId}\" not found`, ErrorCode.STORAGE_NOT_FOUND);\n }\n session.messages.push(structuredClone(message));\n session.metadata.messageCount = session.messages.length;\n session.updatedAt = new Date().toISOString();\n await this.adapter.update(sessionId, session);\n }\n\n async saveMessages(sessionId: ChatId, messages: ChatMessage[]): Promise<void> {\n if (messages.length === 0) return;\n const session = await this.adapter.get(sessionId);\n if (!session) {\n throw new StorageError(`Session \"${sessionId}\" not found`, ErrorCode.STORAGE_NOT_FOUND);\n }\n for (const msg of messages) {\n session.messages.push(structuredClone(msg));\n }\n session.metadata.messageCount = session.messages.length;\n session.updatedAt = new Date().toISOString();\n await this.adapter.update(sessionId, session);\n }\n\n async loadMessages(\n sessionId: ChatId,\n options?: { limit?: number; offset?: number },\n ): Promise<PaginatedMessages> {\n const session = await this.adapter.get(sessionId);\n if (!session) {\n throw new StorageError(`Session \"${sessionId}\" not found`, ErrorCode.STORAGE_NOT_FOUND);\n }\n const total = session.messages.length;\n const offset = options?.offset ?? 0;\n const limit = options?.limit ?? total;\n const messages = session.messages.slice(offset, offset + limit);\n return {\n messages: structuredClone(messages),\n total,\n hasMore: offset + limit < total,\n };\n }\n\n async searchSessions(\n options: SessionSearchOptions,\n ): Promise<ChatSession[]> {\n const query = options.query.toLowerCase();\n const limit = options.limit ?? 20;\n return this.adapter.list({\n filter: (session) => {\n if (session.title?.toLowerCase().includes(query)) return true;\n return session.messages.some((msg) => {\n return msg.parts.some(\n (part) =>\n part.type === \"text\" &&\n part.text.toLowerCase().includes(query),\n );\n });\n },\n limit,\n });\n }\n\n async count(): Promise<number> {\n return this.adapter.count();\n }\n\n async clear(): Promise<void> {\n return this.adapter.clear();\n }\n}\n\n// ─── InMemorySessionStore ──────────────────────────────────────\n\n/**\n * In-memory session store. Data is lost when the process exits.\n * Uses `InMemoryStorage` internally.\n *\n * @example\n * ```typescript\n * const store = new InMemorySessionStore();\n * const session = await store.createSession({\n * config: { model: \"gpt-4\", backend: \"vercel-ai\" },\n * });\n * ```\n */\nexport class InMemorySessionStore extends BaseSessionStore {\n constructor() {\n super(new InMemoryStorage<ChatSession>());\n }\n}\n\n// ─── FileSessionStore ──────────────────────────────────────────\n\n/** Configuration for FileSessionStore */\nexport interface FileSessionStoreOptions {\n /** Directory to store session JSON files */\n directory: string;\n}\n\n/**\n * File-based session store. Each session is a JSON file on disk.\n * Uses `FileStorage` internally.\n *\n * @example\n * ```typescript\n * const store = new FileSessionStore({ directory: \"./data/sessions\" });\n * const session = await store.createSession({\n * config: { model: \"claude-3\", backend: \"claude\" },\n * });\n * ```\n */\nexport class FileSessionStore extends BaseSessionStore {\n constructor(options: FileSessionStoreOptions) {\n super(new FileStorage<ChatSession>({ directory: options.directory }));\n }\n}\n\n// Re-export StorageError for consumers that only import from chat/sessions\nexport { StorageError } from \"./storage.js\";\n","/**\n * @witqq/agent-sdk/chat/backends/types\n *\n * IChatBackend — core backend interface for sending/streaming messages.\n * IResumableBackend — extends IChatBackend with session resume support.\n */\n\nimport type {\n ChatEvent,\n ChatMessage,\n ChatSession,\n SendMessageOptions,\n} from \"../core.js\";\nimport type {\n FullAgentConfig,\n IAgentService,\n ModelInfo,\n} from \"../../types.js\";\n\n// ─── Backend Adapter Options ───────────────────────────────────\n\n/** Options for creating a backend adapter */\nexport interface BackendAdapterOptions {\n /** Agent configuration (model, systemPrompt, tools, etc.) */\n agentConfig: FullAgentConfig;\n /** Pre-created agent service (if adapter should not own lifecycle) */\n agentService?: IAgentService;\n /** Factory for lazy service creation (called on first use, not at construction) */\n agentServiceFactory?: () => IAgentService;\n}\n\n// ─── Core Backend Interface ────────────────────────────────────\n\n/**\n * Core chat backend — send, stream, models, validate, dispose.\n * All backends implement this. Resume support is optional.\n *\n * Note: `agentService` is intentionally NOT on this interface.\n * It's an implementation detail exposed on BaseBackendAdapter for\n * advanced consumers who need direct service access.\n */\nexport interface IChatBackend {\n /** Backend name (e.g. \"copilot\", \"claude\", \"vercel-ai\") */\n readonly name: string;\n\n /** Send a message and receive a complete response */\n sendMessage(\n session: ChatSession,\n message: string,\n options?: SendMessageOptions,\n ): Promise<ChatMessage>;\n\n /** Stream a message response as ChatEvents */\n streamMessage(\n session: ChatSession,\n message: string,\n options?: SendMessageOptions,\n ): AsyncIterable<ChatEvent>;\n\n /** List available models */\n listModels(): Promise<ModelInfo[]>;\n\n /** Validate backend configuration/credentials */\n validate(): Promise<{ valid: boolean; errors: string[] }>;\n\n /** Dispose resources */\n dispose(): Promise<void>;\n\n /** Current effective model */\n readonly currentModel: string | undefined;\n}\n\n// ─── Resumable Backend Interface ───────────────────────────────\n\n/**\n * Extended backend with session resume capabilities.\n * Only backends with persistent sessions (Copilot, Claude) implement this.\n * Use `isResumableBackend()` to type-narrow at runtime.\n */\nexport interface IResumableBackend extends IChatBackend {\n /** Whether this adapter supports session resume */\n canResume(): boolean;\n\n /**\n * Resume a previous session by its backend session ID.\n * Streams events from the resumed session.\n * @throws ChatError with SESSION_EXPIRED if session is no longer valid\n * @throws ChatError with SESSION_NOT_FOUND if session ID is unknown\n */\n resume(\n session: ChatSession,\n backendSessionId: string,\n options?: SendMessageOptions,\n ): AsyncIterable<ChatEvent>;\n\n /** The backend session ID from the last stream, or null if not yet streamed */\n readonly backendSessionId: string | null;\n}\n\n/** Type guard: checks if a backend adapter supports session resume */\nexport function isResumableBackend(\n adapter: IChatBackend,\n): adapter is IResumableBackend {\n return \"canResume\" in adapter && typeof (adapter as IResumableBackend).canResume === \"function\";\n}\n\n\n","/**\n * @witqq/agent-sdk/chat/backends/base\n *\n * Abstract base class for backend adapters. Provides shared lifecycle\n * management, event bridge via adaptAgentEvents(), and tool forwarding.\n */\n\nimport type {\n ChatEvent,\n ChatSession,\n ChatMessage,\n SendMessageOptions,\n} from \"../core.js\";\nimport {\n createChatId,\n adaptAgentEvents,\n toAgentMessages,\n} from \"../core.js\";\nimport { ChatError, ErrorCode } from \"../errors.js\";\nimport type {\n FullAgentConfig,\n IAgent,\n IAgentService,\n Message,\n ModelInfo,\n} from \"../../types.js\";\nimport type { IChatBackend, BackendAdapterOptions } from \"./types.js\";\n\n/**\n * Abstract base for backend adapters implementing IChatBackend (core only).\n * Subclasses implement createService() for backend-specific service creation.\n * Resume support is NOT required — subclasses can implement IResumableBackend separately.\n */\nexport abstract class BaseBackendAdapter implements IChatBackend {\n readonly name: string;\n private _agentService: IAgentService | null = null;\n private _agentServiceFactory: (() => IAgentService) | null = null;\n private _disposed = false;\n protected readonly _agentConfig: FullAgentConfig;\n private _ownsService: boolean;\n // Agent lifecycle: tracks current agent and the model it was created with.\n // For persistent sessions, reused across calls when model matches.\n // For non-persistent, recreated every call.\n private _currentAgent: { instance: IAgent; model: string | undefined } | null = null;\n\n constructor(name: string, options: BackendAdapterOptions) {\n this.name = name;\n this._agentConfig = options.agentConfig;\n if (options.agentService) {\n this._agentService = options.agentService;\n this._ownsService = false;\n } else if (options.agentServiceFactory) {\n this._agentServiceFactory = options.agentServiceFactory;\n this._ownsService = true;\n } else {\n this._agentService = this.createService();\n this._ownsService = true;\n }\n }\n\n /** Subclasses create their specific IAgentService */\n protected abstract createService(): IAgentService;\n\n get agentService(): IAgentService {\n if (!this._agentService) {\n if (this._agentServiceFactory) {\n this._agentService = this._agentServiceFactory();\n this._agentServiceFactory = null; // factory used once\n } else {\n throw new ChatError(\"Agent service not available\", {\n code: ErrorCode.BACKEND_NOT_INSTALLED,\n });\n }\n }\n return this._agentService;\n }\n\n get currentModel(): string | undefined {\n return this._agentConfig.model;\n }\n\n /**\n * @deprecated No-op. Tools are passed per-call via SendMessageOptions.tools.\n * Kept for backward compatibility with code that calls setTools() directly.\n */\n setTools(): void {\n // No-op — tools flow per-call via SendMessageOptions.tools\n }\n\n async sendMessage(\n session: ChatSession,\n message: string,\n options?: SendMessageOptions,\n ): Promise<ChatMessage> {\n this.assertNotDisposed();\n const events = this.streamMessage(session, message, options);\n\n let text = \"\";\n let lastMessage: ChatMessage | undefined;\n\n for await (const event of events) {\n if (event.type === \"message:delta\") {\n text += event.text;\n }\n if (event.type === \"message:complete\") {\n lastMessage = event.message;\n }\n }\n\n if (lastMessage) return lastMessage;\n\n // Construct message from accumulated text\n const messageId = createChatId();\n return {\n id: messageId,\n role: \"assistant\",\n parts: [{ type: \"text\", text, status: \"complete\" }],\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n status: \"complete\",\n };\n }\n\n async *streamMessage(\n session: ChatSession,\n message: string,\n options?: SendMessageOptions,\n ): AsyncIterable<ChatEvent> {\n this.assertNotDisposed();\n\n const agent = this.getOrCreateAgent(options);\n\n // Convert session messages to agent format + new user message\n const messages: Message[] = session.messages.flatMap(toAgentMessages);\n messages.push({ role: \"user\", content: message });\n\n yield* this.streamAgentEvents(agent, messages, options);\n }\n\n /**\n * Shared streaming helper: bridges agent events to chat events.\n * Used by both streamMessage() and resume() to avoid duplication.\n */\n protected async *streamAgentEvents(\n agent: IAgent,\n messages: Message[],\n options?: SendMessageOptions,\n ): AsyncIterable<ChatEvent> {\n const messageId = createChatId();\n const model = options?.model ?? this._agentConfig.model ?? \"\";\n\n const agentEvents = agent.streamWithContext(messages, {\n model,\n signal: options?.signal,\n context: options?.context,\n tools: options?.tools,\n ...(options?.systemPrompt ? { systemMessage: options.systemPrompt } : {}),\n });\n\n yield { type: \"message:start\", messageId, role: \"assistant\" };\n\n let text = \"\";\n for await (const chatEvent of adaptAgentEvents(agentEvents, messageId)) {\n if (chatEvent.type === \"message:delta\") {\n text += chatEvent.text;\n }\n yield chatEvent;\n }\n\n this.captureSessionId(agent);\n\n yield {\n type: \"message:complete\",\n messageId,\n message: {\n id: messageId,\n role: \"assistant\",\n parts: [{ type: \"text\", text, status: \"complete\" }],\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n status: \"complete\",\n },\n };\n }\n\n async listModels(): Promise<ModelInfo[]> {\n this.assertNotDisposed();\n return this.agentService.listModels();\n }\n\n async validate(): Promise<{ valid: boolean; errors: string[] }> {\n this.assertNotDisposed();\n return this.agentService.validate();\n }\n\n async dispose(): Promise<void> {\n if (this._disposed) return;\n this._disposed = true;\n if (this._currentAgent) {\n this._currentAgent.instance.dispose();\n this._currentAgent = null;\n }\n if (this._ownsService && this._agentService && typeof this._agentService.dispose === \"function\") {\n await this._agentService.dispose();\n }\n }\n\n /** Get or create an agent. Model is passed per-call via RunOptions.\n * Tools are passed per-call via SendMessageOptions — not baked into config.\n * For persistent sessions, reuses agent when model matches. */\n protected getOrCreateAgent(options?: SendMessageOptions): IAgent {\n const model = options?.model ?? this._agentConfig.model;\n\n // For persistent session mode, reuse if model matches\n if (this._agentConfig.sessionMode === \"persistent\" && this._currentAgent) {\n if (this._currentAgent.model === model) {\n return this._currentAgent.instance;\n }\n // Model changed — dispose old agent, create new one below\n this._currentAgent.instance.dispose();\n this._currentAgent = null;\n }\n\n // Dispose previous agent to prevent leaks (P23)\n if (this._currentAgent) {\n this._currentAgent.instance.dispose();\n this._currentAgent = null;\n }\n\n // Create fresh agent — merge model and tools from per-call options\n const config: FullAgentConfig = {\n ...this._agentConfig,\n ...(model !== undefined && { model }),\n ...(options?.tools?.length ? { tools: options.tools } : {}),\n };\n const agent = this.agentService.createAgent(config);\n this._currentAgent = { instance: agent, model };\n return agent;\n }\n\n /** Subclasses capture backend session ID from agent after streaming */\n protected abstract captureSessionId(agent: IAgent): void;\n\n protected assertNotDisposed(): void {\n if (this._disposed) {\n throw new ChatError(\"Adapter is disposed\", {\n code: ErrorCode.DISPOSED,\n });\n }\n }\n}\n","/**\n * @witqq/agent-sdk/chat/backends/resumable\n *\n * Abstract base for CLI-backed adapters with session resume support.\n * Shared by CopilotChatAdapter and ClaudeChatAdapter — the only\n * difference between them is createService() and constructor options.\n */\n\nimport type {\n ChatEvent,\n ChatSession,\n SendMessageOptions,\n} from \"../core.js\";\nimport { toAgentMessages } from \"../core.js\";\nimport { ChatError, ErrorCode } from \"../errors.js\";\nimport type {\n IAgent,\n Message,\n} from \"../../types.js\";\nimport { BaseBackendAdapter } from \"./base.js\";\nimport type { BackendAdapterOptions, IResumableBackend } from \"./types.js\";\n\n/**\n * Abstract base for backend adapters that support session resume.\n * Handles backendSessionId tracking, canResume(), resume(), captureSessionId().\n * Subclasses only define constructor (with backend-specific options) and createService().\n */\nexport abstract class ResumableChatAdapter extends BaseBackendAdapter implements IResumableBackend {\n private _backendSessionId: string | null = null;\n\n constructor(name: string, options: BackendAdapterOptions) {\n // Force persistent session mode for resume support\n const agentConfig = {\n ...options.agentConfig,\n sessionMode: \"persistent\" as const,\n };\n super(name, { ...options, agentConfig });\n }\n\n get backendSessionId(): string | null {\n return this._backendSessionId;\n }\n\n canResume(): boolean {\n return this._backendSessionId !== null;\n }\n\n async *resume(\n session: ChatSession,\n backendSessionId: string,\n options?: SendMessageOptions,\n ): AsyncIterable<ChatEvent> {\n this.assertNotDisposed();\n\n if (!backendSessionId) {\n throw new ChatError(\"Backend session ID is required for resume\", {\n code: ErrorCode.INVALID_INPUT,\n });\n }\n\n const agent = this.getOrCreateAgent(options);\n const currentSessionId = agent.sessionId;\n\n if (!currentSessionId) {\n throw new ChatError(\n `No active session to resume (requested: ${backendSessionId})`,\n { code: ErrorCode.SESSION_NOT_FOUND },\n );\n }\n\n if (currentSessionId !== backendSessionId) {\n throw new ChatError(\n `Session expired: expected ${backendSessionId}, got ${currentSessionId}`,\n { code: ErrorCode.SESSION_EXPIRED },\n );\n }\n\n const messages: Message[] = session.messages.flatMap(toAgentMessages);\n yield* this.streamAgentEvents(agent, messages, options);\n }\n\n protected captureSessionId(agent: IAgent): void {\n if (agent.sessionId) {\n this._backendSessionId = agent.sessionId;\n }\n }\n}\n","/**\n * @witqq/agent-sdk/chat/backends/copilot\n *\n * CopilotChatAdapter wraps CopilotAgentService for chat use.\n * Supports persistent session mode for canResume/resume.\n */\n\nimport type {\n IAgentService,\n CopilotBackendOptions,\n} from \"../../types.js\";\nimport type { BackendAdapterOptions } from \"./types.js\";\nimport { ResumableChatAdapter } from \"./resumable.js\";\n\n// ─── Copilot-Specific Options ──────────────────────────────────\n\n/** Options for creating a CopilotChatAdapter */\nexport interface CopilotChatAdapterOptions extends BackendAdapterOptions {\n /** Copilot backend options (cliPath, token, etc.) */\n copilotOptions?: CopilotBackendOptions;\n}\n\n// ─── CopilotChatAdapter ────────────────────────────────────────\n\n/**\n * Backend adapter for GitHub Copilot CLI.\n * Uses persistent session mode for session resume via CLI session ID.\n */\nexport class CopilotChatAdapter extends ResumableChatAdapter {\n private readonly _copilotOptions?: CopilotBackendOptions;\n\n constructor(options: CopilotChatAdapterOptions) {\n super(\"copilot\", options);\n this._copilotOptions = options.copilotOptions;\n }\n\n protected createService(): IAgentService {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const { createCopilotService } = require(\"../../backends/copilot.js\");\n return createCopilotService(this._copilotOptions || {});\n }\n}\n","/**\n * @witqq/agent-sdk/chat/backends/claude\n *\n * ClaudeChatAdapter wraps ClaudeAgentService for chat use.\n * Supports persistent session mode with Claude's session_id for resume.\n */\n\nimport type {\n IAgentService,\n ClaudeBackendOptions,\n} from \"../../types.js\";\nimport type { BackendAdapterOptions } from \"./types.js\";\nimport { ResumableChatAdapter } from \"./resumable.js\";\n\n// ─── Claude-Specific Options ──────────────────────────────────\n\n/** Options for creating a ClaudeChatAdapter */\nexport interface ClaudeChatAdapterOptions extends BackendAdapterOptions {\n /** Claude backend options (cliPath, model, etc.) */\n claudeOptions?: ClaudeBackendOptions;\n}\n\n// ─── ClaudeChatAdapter ─────────────────────────────────────────\n\n/**\n * Backend adapter for Claude CLI.\n * Uses persistent session mode for session resume via Claude's session_id.\n */\nexport class ClaudeChatAdapter extends ResumableChatAdapter {\n private readonly _claudeOptions?: ClaudeBackendOptions;\n\n constructor(options: ClaudeChatAdapterOptions) {\n super(\"claude\", options);\n this._claudeOptions = options.claudeOptions;\n }\n\n protected createService(): IAgentService {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const { createClaudeService } = require(\"../../backends/claude.js\");\n return createClaudeService(this._claudeOptions || {});\n }\n}\n","/**\n * @witqq/agent-sdk/chat/backends/vercel-ai\n *\n * VercelAIChatAdapter wraps VercelAIAgentService for chat use.\n * Stateless adapter — implements IChatBackend only (no resume support).\n * Each streamMessage/sendMessage creates a fresh agent (per-call session mode).\n */\n\nimport type {\n IAgent,\n IAgentService,\n VercelAIBackendOptions,\n} from \"../../types.js\";\nimport { BaseBackendAdapter } from \"./base.js\";\nimport type { BackendAdapterOptions } from \"./types.js\";\n\n// ─── Vercel AI-Specific Options ────────────────────────────────\n\n/** Options for creating a VercelAIChatAdapter */\nexport interface VercelAIChatAdapterOptions extends BackendAdapterOptions {\n /** Vercel AI backend options (baseURL, apiKey, provider, etc.) */\n vercelOptions?: VercelAIBackendOptions;\n}\n\n// ─── VercelAIChatAdapter ───────────────────────────────────────\n\n/**\n * Backend adapter for Vercel AI SDK (API-based).\n * Stateless — each call creates a fresh agent. Does not support resume.\n * Implements IChatBackend only (no IResumableBackend).\n */\nexport class VercelAIChatAdapter extends BaseBackendAdapter {\n private readonly _vercelOptions?: VercelAIBackendOptions;\n\n constructor(options: VercelAIChatAdapterOptions) {\n // Vercel AI is stateless — per-call session mode (default)\n super(\"vercel-ai\", options);\n this._vercelOptions = options.vercelOptions;\n }\n\n protected createService(): IAgentService {\n // Use synchronous factory directly (not the async registry createAgentService)\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const { createVercelAIService } = require(\"../../backends/vercel-ai.js\");\n return createVercelAIService(this._vercelOptions || {});\n }\n\n protected captureSessionId(_agent: IAgent): void {\n // No-op: Vercel AI is stateless, no session ID to capture\n }\n}\n","/**\n * Mock LLM backend — a fully functional backend for automated testing.\n *\n * Implements IAgentService using BaseAgent, providing configurable response\n * modes (echo, static, scripted, error) with full streaming support.\n * Unlike the lightweight testing mock (createMockAgentService), this backend\n * participates in the full BaseAgent lifecycle: retry, heartbeat, activity\n * timeout, middleware pipeline, and usage enrichment.\n *\n * Advanced capabilities:\n * - Latency simulation (fixed or random delay)\n * - Streaming chunk control (chunk size, inter-chunk delay)\n * - Configurable finishReason in done events\n * - Permission simulation (auto-approve, deny, or delegate to supervisor)\n */\nimport { BaseAgent } from \"../base-agent.js\";\nimport { AgentSDKError } from \"../errors.js\";\nimport type {\n IAgentService,\n IAgent,\n FullAgentConfig,\n ModelInfo,\n ValidationResult,\n AgentResult,\n AgentEvent,\n Message,\n RunOptions,\n StructuredOutputConfig,\n MockLLMBackendOptions,\n MockLLMResponseMode,\n MockLLMLatency,\n MockLLMStreamingOptions,\n MockLLMPermissionOptions,\n MockLLMToolCall,\n JSONValue,\n} from \"../types.js\";\n\n// ─── Helpers ────────────────────────────────────────────────────\n\n/** Extract the user's prompt text from the last message */\nfunction extractPrompt(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 typeof msg.content === \"string\"\n ? msg.content\n : msg.content\n .filter((p) => p.type === \"text\")\n .map((p) => (p as { type: \"text\"; text: string }).text)\n .join(\"\");\n }\n }\n return \"\";\n}\n\n/** Resolve the response text for the given mode and call index */\nfunction resolveResponse(\n mode: MockLLMResponseMode,\n messages: Message[],\n callIndex: number,\n): string {\n switch (mode.type) {\n case \"echo\":\n return extractPrompt(messages);\n case \"static\":\n return mode.response;\n case \"scripted\": {\n if (mode.loop) {\n return mode.responses[callIndex % mode.responses.length];\n }\n if (callIndex < mode.responses.length) {\n return mode.responses[callIndex];\n }\n return mode.responses[mode.responses.length - 1];\n }\n case \"error\":\n throw new AgentSDKError(mode.error, {\n code: mode.code ?? \"backend_error\",\n retryable: mode.recoverable ?? false,\n });\n }\n}\n\n/** Apply latency delay if configured */\nasync function applyLatency(\n latency: MockLLMLatency | undefined,\n signal: AbortSignal,\n): Promise<void> {\n if (!latency) return;\n const ms =\n latency.type === \"fixed\"\n ? latency.ms\n : latency.minMs + Math.random() * (latency.maxMs - latency.minMs);\n if (ms <= 0) return;\n await new Promise<void>((resolve, reject) => {\n const timer = setTimeout(resolve, ms);\n const onAbort = () => {\n clearTimeout(timer);\n reject(new Error(\"aborted\"));\n };\n if (signal.aborted) {\n clearTimeout(timer);\n reject(new Error(\"aborted\"));\n return;\n }\n signal.addEventListener(\"abort\", onAbort, { once: true });\n });\n}\n\n/** Split text into chunks based on streaming options */\nfunction chunkText(\n text: string,\n streaming: MockLLMStreamingOptions | undefined,\n): string[] {\n if (streaming?.chunkSize && streaming.chunkSize > 0) {\n const chunks: string[] = [];\n for (let i = 0; i < text.length; i += streaming.chunkSize) {\n chunks.push(text.slice(i, i + streaming.chunkSize));\n }\n return chunks;\n }\n // Default: word-boundary splitting\n return text.split(/(\\s+)/).filter(Boolean);\n}\n\n/** Delay between stream chunks if configured */\nasync function chunkDelay(\n streaming: MockLLMStreamingOptions | undefined,\n signal: AbortSignal,\n): Promise<void> {\n const ms = streaming?.chunkDelayMs;\n if (!ms || ms <= 0) return;\n await new Promise<void>((resolve, reject) => {\n const timer = setTimeout(resolve, ms);\n const onAbort = () => {\n clearTimeout(timer);\n reject(new Error(\"aborted\"));\n };\n if (signal.aborted) {\n clearTimeout(timer);\n reject(new Error(\"aborted\"));\n return;\n }\n signal.addEventListener(\"abort\", onAbort, { once: true });\n });\n}\n\n// ─── MockLLMAgent ──────────────────────────────────────────────\n\nclass MockLLMAgent extends BaseAgent {\n protected readonly backendName = \"mock-llm\";\n private readonly mode: MockLLMResponseMode;\n private readonly latency: MockLLMLatency | undefined;\n private readonly streaming: MockLLMStreamingOptions | undefined;\n private readonly finishReason: string;\n private readonly permissions: MockLLMPermissionOptions | undefined;\n private readonly toolCallConfigs: MockLLMToolCall[];\n private readonly configuredStructuredOutput: unknown;\n private callIndex = 0;\n\n constructor(config: FullAgentConfig, options: MockLLMBackendOptions) {\n super(config);\n this.mode = options.mode ?? { type: \"echo\" };\n this.latency = options.latency;\n this.streaming = options.streaming;\n this.finishReason = options.finishReason ?? \"stop\";\n this.permissions = options.permissions;\n this.toolCallConfigs = options.toolCalls ?? [];\n this.configuredStructuredOutput = options.structuredOutput;\n }\n\n protected async executeRun(\n messages: Message[],\n _options: RunOptions,\n signal: AbortSignal,\n ): Promise<AgentResult> {\n this.checkAbort(signal);\n await applyLatency(this.latency, signal);\n this.checkAbort(signal);\n\n const idx = this.callIndex++;\n const output = resolveResponse(this.mode, messages, idx);\n const toolCalls = this.toolCallConfigs.map((tc) => ({\n toolName: tc.toolName,\n args: (tc.args ?? {}) as JSONValue,\n result: (tc.result ?? null) as JSONValue,\n approved: true,\n }));\n\n return {\n output,\n structuredOutput: undefined,\n toolCalls,\n messages: [\n ...messages,\n { role: \"assistant\" as const, content: output },\n ],\n usage: { promptTokens: 10, completionTokens: output.length },\n };\n }\n\n protected async executeRunStructured<T>(\n messages: Message[],\n _schema: StructuredOutputConfig<T>,\n _options: RunOptions,\n signal: AbortSignal,\n ): Promise<AgentResult<T>> {\n this.checkAbort(signal);\n await applyLatency(this.latency, signal);\n this.checkAbort(signal);\n\n const idx = this.callIndex++;\n const output = resolveResponse(this.mode, messages, idx);\n\n let parsed: T;\n if (this.configuredStructuredOutput !== undefined) {\n parsed = this.configuredStructuredOutput as T;\n } else {\n try {\n parsed = JSON.parse(output) as T;\n } catch {\n parsed = output as unknown as T;\n }\n }\n\n return {\n output,\n structuredOutput: parsed as T extends void ? undefined : T,\n toolCalls: [],\n messages: [\n ...messages,\n { role: \"assistant\" as const, content: output },\n ],\n usage: { promptTokens: 10, completionTokens: output.length },\n };\n }\n\n protected async *executeStream(\n messages: Message[],\n _options: RunOptions,\n signal: AbortSignal,\n ): AsyncIterable<AgentEvent> {\n this.checkAbort(signal);\n await applyLatency(this.latency, signal);\n this.checkAbort(signal);\n\n // Permission simulation — emit before generating response\n if (this.permissions) {\n yield* this.simulatePermissions(signal);\n }\n\n // Tool call simulation — emit tool_call_start/end pairs\n if (this.toolCallConfigs.length > 0) {\n yield* this.simulateToolCalls(signal);\n }\n\n const idx = this.callIndex++;\n const output = resolveResponse(this.mode, messages, idx);\n\n const chunks = chunkText(output, this.streaming);\n for (let i = 0; i < chunks.length; i++) {\n this.checkAbort(signal);\n if (i > 0) {\n await chunkDelay(this.streaming, signal);\n }\n yield { type: \"text_delta\", text: chunks[i] };\n }\n\n yield {\n type: \"usage_update\",\n promptTokens: 10,\n completionTokens: output.length,\n };\n\n yield {\n type: \"done\",\n finalOutput: output,\n finishReason: this.finishReason,\n };\n }\n\n private async *simulateToolCalls(\n signal: AbortSignal,\n ): AsyncIterable<AgentEvent> {\n for (let i = 0; i < this.toolCallConfigs.length; i++) {\n this.checkAbort(signal);\n const tc = this.toolCallConfigs[i];\n const toolCallId = tc.toolCallId ?? `mock-tc-${i}`;\n\n yield {\n type: \"tool_call_start\",\n toolCallId,\n toolName: tc.toolName,\n args: (tc.args ?? {}) as JSONValue,\n };\n\n yield {\n type: \"tool_call_end\",\n toolCallId,\n toolName: tc.toolName,\n result: (tc.result ?? null) as JSONValue,\n };\n }\n }\n\n private async *simulatePermissions(\n signal: AbortSignal,\n ): AsyncIterable<AgentEvent> {\n const perms = this.permissions!;\n for (const toolName of perms.toolNames) {\n this.checkAbort(signal);\n\n const request = {\n toolName,\n toolArgs: {},\n };\n\n yield { type: \"permission_request\", request };\n\n // Determine decision\n if (perms.denyTools?.includes(toolName)) {\n yield {\n type: \"permission_response\",\n toolName,\n decision: { allowed: false, reason: \"Denied by mock configuration\" },\n };\n } else if (perms.autoApprove) {\n yield {\n type: \"permission_response\",\n toolName,\n decision: { allowed: true, scope: \"once\" as const },\n };\n } else {\n // Delegate to supervisor callback if available\n const supervisor = this.getConfig().supervisor;\n if (supervisor?.onPermission) {\n const decision = await supervisor.onPermission(request, signal);\n yield { type: \"permission_response\", toolName, decision };\n } else {\n // No supervisor — auto-approve (headless mode)\n yield {\n type: \"permission_response\",\n toolName,\n decision: { allowed: true, scope: \"once\" as const },\n };\n }\n }\n }\n }\n}\n\n// ─── MockLLMService ─────────────────────────────────────────────\n\nclass MockLLMService implements IAgentService {\n readonly name = \"mock-llm\";\n private readonly options: MockLLMBackendOptions;\n private readonly models: ModelInfo[];\n\n constructor(options: MockLLMBackendOptions = {}) {\n this.options = options;\n this.models = (options.models ?? [\n { id: \"mock-fast\", name: \"Mock Fast\" },\n { id: \"mock-quality\", name: \"Mock Quality\" },\n ]).map((m) => ({\n id: m.id,\n name: m.name,\n description: m.description,\n }));\n }\n\n createAgent(config: FullAgentConfig): IAgent {\n return new MockLLMAgent(config, this.options);\n }\n\n async listModels(): Promise<ModelInfo[]> {\n return this.models;\n }\n\n async validate(): Promise<ValidationResult> {\n return { valid: true, errors: [] };\n }\n\n async dispose(): Promise<void> {\n // no-op — mock has no resources to release\n }\n}\n\n// ─── Public API ─────────────────────────────────────────────────\n\n/** Create a mock LLM backend service for automated testing.\n *\n * Unlike the lightweight `createMockAgentService` (from `@witqq/agent-sdk/testing`),\n * this backend extends `BaseAgent` and participates in the full agent lifecycle:\n * retry, heartbeat, activity timeout, middleware pipeline, and usage enrichment.\n *\n * @example\n * ```ts\n * import { createMockLLMService } from \"@witqq/agent-sdk/mock-llm\";\n *\n * // Basic echo mode\n * const service = createMockLLMService({ mode: { type: \"echo\" } });\n *\n * // With latency simulation and streaming control\n * const realisticService = createMockLLMService({\n * mode: { type: \"static\", response: \"Hello!\" },\n * latency: { type: \"fixed\", ms: 100 },\n * streaming: { chunkSize: 5, chunkDelayMs: 10 },\n * finishReason: \"stop\",\n * });\n *\n * // With permission simulation\n * const permService = createMockLLMService({\n * mode: { type: \"echo\" },\n * permissions: { toolNames: [\"bash\", \"file_write\"], autoApprove: true },\n * });\n * ```\n */\nexport function createMockLLMService(\n options: MockLLMBackendOptions = {},\n): IAgentService {\n return new MockLLMService(options);\n}\n\nexport type {\n MockLLMBackendOptions,\n MockLLMResponseMode,\n MockLLMLatency,\n MockLLMStreamingOptions,\n MockLLMPermissionOptions,\n MockLLMToolCall,\n};\n","/**\n * @witqq/agent-sdk/chat/backends/mock-llm\n *\n * MockLLMChatAdapter wraps MockLLMService for chat use.\n * No auth, no credentials — fully deterministic testing backend.\n */\n\nimport type { IAgentService, IAgent, MockLLMBackendOptions } from \"../../types.js\";\nimport type { BackendAdapterOptions } from \"./types.js\";\nimport { BaseBackendAdapter } from \"./base.js\";\nimport { createMockLLMService } from \"../../backends/mock-llm.js\";\n\n// ─── MockLLM-Specific Options ──────────────────────────────────\n\n/** Options for creating a MockLLMChatAdapter */\nexport interface MockLLMChatAdapterOptions extends BackendAdapterOptions {\n /** MockLLM backend options (mode, latency, streaming, etc.) */\n mockOptions?: MockLLMBackendOptions;\n}\n\n// ─── MockLLMChatAdapter ────────────────────────────────────────\n\n/**\n * Backend adapter for Mock LLM.\n * Zero-auth, deterministic, fully configurable for E2E testing.\n */\nexport class MockLLMChatAdapter extends BaseBackendAdapter {\n constructor(options: MockLLMChatAdapterOptions) {\n // Use agentServiceFactory to avoid the base-class constructor calling\n // createService() before subclass fields are initialised.\n const mockOpts = options.mockOptions;\n super(\"mock-llm\", {\n ...options,\n agentServiceFactory: () => createMockLLMService(mockOpts || {}),\n });\n }\n\n protected createService(): IAgentService {\n // Only reached if agentServiceFactory is not provided (never in practice).\n return createMockLLMService({});\n }\n\n protected captureSessionId(_agent: IAgent): void {\n // Mock LLM has no persistent sessions — no-op\n }\n}\n","/**\n * @witqq/agent-sdk/chat/backends/transport\n *\n * IChatTransport abstracts how ChatEvents are delivered to clients.\n * SSEChatTransport implements Server-Sent Events over HTTP.\n */\n\nimport type { ChatEvent } from \"../core.js\";\n\n// ─── IChatTransport Interface ──────────────────────────────────\n\n/**\n * Abstraction for delivering chat events to a client.\n * Implementations handle protocol details (SSE, WebSocket, etc.).\n */\nexport interface IChatTransport {\n /** Send a single chat event to the client */\n send(event: ChatEvent): void;\n\n /** Signal stream completion and close the connection */\n close(): void;\n\n /** Signal an error to the client */\n error(err: Error): void;\n\n /** Whether the transport is still open */\n readonly isOpen: boolean;\n}\n\n// ─── SSE Chat Transport ────────────────────────────────────────\n\n/** Writable HTTP response interface — minimal type satisfied by Express, Fastify (raw), and Node http.ServerResponse without casts. */\nexport interface WritableResponse {\n writeHead(statusCode: number, headers?: Record<string, string | string[]>): unknown;\n setHeader(name: string, value: string): unknown;\n write(chunk: string): boolean;\n end(body?: string): unknown;\n readonly writableEnded: boolean;\n}\n\n/** Minimal interface for detecting client disconnection */\nexport interface CloseDetectable {\n on(event: \"close\", listener: () => void): void;\n}\n\n/** Configuration options for SSEChatTransport */\nexport interface SSETransportOptions {\n /** Heartbeat interval in milliseconds. 0 or undefined disables heartbeat. */\n heartbeatMs?: number;\n /** Request object for detecting client disconnection (listens for 'close' event) */\n request?: CloseDetectable;\n}\n\n/**\n * Server-Sent Events transport for ChatEvent streaming.\n * Sends events as `data: JSON\\n\\n` lines with SSE headers.\n */\nexport class SSEChatTransport implements IChatTransport {\n private readonly res: WritableResponse;\n private _open: boolean;\n private _heartbeatTimer: ReturnType<typeof setInterval> | undefined;\n\n constructor(res: WritableResponse, options?: SSETransportOptions) {\n this.res = res;\n this._open = true;\n\n res.writeHead(200, {\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache\",\n \"Connection\": \"keep-alive\",\n \"X-Accel-Buffering\": \"no\",\n });\n\n // Close detection via request 'close' event\n if (options?.request) {\n options.request.on(\"close\", () => {\n this._cleanup();\n });\n }\n\n // Periodic heartbeat to keep connection alive\n const heartbeatMs = options?.heartbeatMs;\n if (heartbeatMs && heartbeatMs > 0) {\n this._heartbeatTimer = setInterval(() => {\n if (!this.isOpen) {\n this._clearHeartbeat();\n return;\n }\n this.res.write(\": heartbeat\\n\\n\");\n }, heartbeatMs);\n }\n }\n\n get isOpen(): boolean {\n return this._open && !this.res.writableEnded;\n }\n\n send(event: ChatEvent): void {\n if (!this.isOpen) return;\n this.res.write(`data: ${JSON.stringify(event)}\\n\\n`);\n }\n\n close(): void {\n if (!this.isOpen) return;\n this._open = false;\n this._clearHeartbeat();\n this.res.write(`data: [DONE]\\n\\n`);\n this.res.end();\n }\n\n error(err: Error): void {\n if (!this.isOpen) return;\n this._open = false;\n this._clearHeartbeat();\n const errorEvent: ChatEvent = {\n type: \"error\",\n error: err.message,\n recoverable: false,\n };\n this.res.write(`data: ${JSON.stringify(errorEvent)}\\n\\n`);\n this.res.end();\n }\n\n private _cleanup(): void {\n this._open = false;\n this._clearHeartbeat();\n }\n\n private _clearHeartbeat(): void {\n if (this._heartbeatTimer !== undefined) {\n clearInterval(this._heartbeatTimer);\n this._heartbeatTimer = undefined;\n }\n }\n}\n\n// ─── Helper: Stream Adapter Events to Transport ────────────────\n\n/**\n * Pipes an async iterable of ChatEvents into a transport.\n * Handles errors and ensures transport is closed on completion.\n *\n * @param events - Async iterable of ChatEvent (from adapter.streamMessage)\n * @param transport - Transport to send events through\n */\nexport async function streamToTransport(\n events: AsyncIterable<ChatEvent>,\n transport: IChatTransport,\n): Promise<void> {\n try {\n const textChunks: string[] = [];\n let finishReason: string | undefined;\n\n for await (const event of events) {\n if (!transport.isOpen) break;\n\n if (event.type === \"done\") {\n // Capture finishReason from stream; don't forward — we build our own done below\n finishReason = event.finishReason;\n continue;\n }\n\n transport.send(event);\n\n if (event.type === \"message:delta\") {\n textChunks.push(event.text);\n }\n }\n\n if (transport.isOpen) {\n const finalOutput = textChunks.length > 0 ? textChunks.join(\"\") : undefined;\n transport.send({ type: \"done\", finalOutput, finishReason });\n }\n transport.close();\n } catch (err) {\n transport.error(err instanceof Error ? err : new Error(String(err)));\n }\n}\n","/**\n * @witqq/agent-sdk - WebSocket Chat Transport\n *\n * IChatTransport implementation over WebSocket connections.\n * Accepts a WebSocket-like abstraction compatible with `ws`, native WebSocket, etc.\n */\n\nimport type { ChatEvent } from \"../core.js\";\nimport type { IChatTransport } from \"./transport.js\";\n\n// ─── WebSocket Abstraction ─────────────────────────────────────\n\n/** Ready states matching the WebSocket spec (ws, browser, Deno, Bun) */\nexport const WS_READY_STATE = {\n CONNECTING: 0,\n OPEN: 1,\n CLOSING: 2,\n CLOSED: 3,\n} as const;\n\n/**\n * Minimal WebSocket interface compatible with `ws`, browser WebSocket, Deno, Bun.\n * Only the methods/properties used by WsChatTransport.\n */\nexport interface WebSocketLike {\n readonly readyState: number;\n send(data: string): void;\n close(code?: number, reason?: string): void;\n addEventListener(type: \"close\", listener: () => void): void;\n addEventListener(type: \"error\", listener: (err: unknown) => void): void;\n}\n\n/** Configuration options for WsChatTransport */\nexport interface WsTransportOptions {\n /** Heartbeat interval in ms. 0 or undefined disables heartbeat. */\n heartbeatMs?: number;\n /** Custom JSON serializer (defaults to JSON.stringify) */\n serialize?: (event: ChatEvent) => string;\n}\n\n// ─── WsChatTransport ───────────────────────────────────────────\n\n/**\n * WebSocket transport for ChatEvent streaming.\n * Sends events as JSON messages over a WebSocket connection.\n */\nexport class WsChatTransport implements IChatTransport {\n private readonly ws: WebSocketLike;\n private readonly serialize: (event: ChatEvent) => string;\n private _open: boolean;\n private _heartbeatTimer: ReturnType<typeof setInterval> | undefined;\n\n constructor(ws: WebSocketLike, options?: WsTransportOptions) {\n this.ws = ws;\n this.serialize = options?.serialize ?? JSON.stringify;\n this._open = ws.readyState === WS_READY_STATE.OPEN;\n\n ws.addEventListener(\"close\", () => {\n this._cleanup();\n });\n\n ws.addEventListener(\"error\", () => {\n this._cleanup();\n });\n\n const heartbeatMs = options?.heartbeatMs;\n if (heartbeatMs && heartbeatMs > 0) {\n this._heartbeatTimer = setInterval(() => {\n if (!this.isOpen) {\n this._clearHeartbeat();\n return;\n }\n this.ws.send(this.serialize({ type: \"heartbeat\" } as ChatEvent));\n }, heartbeatMs);\n }\n }\n\n get isOpen(): boolean {\n return this._open && this.ws.readyState === WS_READY_STATE.OPEN;\n }\n\n send(event: ChatEvent): void {\n if (!this.isOpen) return;\n this.ws.send(this.serialize(event));\n }\n\n close(): void {\n if (!this.isOpen) return;\n this._open = false;\n this._clearHeartbeat();\n // Send done signal before closing\n this.ws.send(this.serialize({ type: \"done\" } as ChatEvent));\n this.ws.close(1000, \"stream complete\");\n }\n\n error(err: Error): void {\n if (!this.isOpen) return;\n this._open = false;\n this._clearHeartbeat();\n const errorEvent: ChatEvent = {\n type: \"error\",\n error: err.message,\n recoverable: false,\n };\n this.ws.send(this.serialize(errorEvent));\n this.ws.close(1011, err.message);\n }\n\n private _cleanup(): void {\n this._open = false;\n this._clearHeartbeat();\n }\n\n private _clearHeartbeat(): void {\n if (this._heartbeatTimer !== undefined) {\n clearInterval(this._heartbeatTimer);\n this._heartbeatTimer = undefined;\n }\n }\n}\n","/**\n * @witqq/agent-sdk - In-Process Chat Transport\n *\n * IChatTransport implementation for zero-network communication.\n * Events are pushed into an internal buffer and consumed via async iteration.\n * Useful for testing, embedded runtimes, CLI tools, and in-process communication.\n */\n\nimport type { ChatEvent } from \"../core.js\";\nimport type { IChatTransport } from \"./transport.js\";\n\n// ─── InProcessChatTransport ────────────────────────────────────\n\n/**\n * In-process transport for ChatEvent streaming.\n * Producer pushes events via IChatTransport.send(), consumer reads via async iteration.\n *\n * @example\n * ```ts\n * const transport = new InProcessChatTransport();\n *\n * // Consumer side (async iteration)\n * (async () => {\n * for await (const event of transport) {\n * console.log(\"Received:\", event);\n * }\n * })();\n *\n * // Producer side (via streamToTransport or manual)\n * transport.send({ type: \"message:start\", messageId, role: \"assistant\" });\n * transport.send({ type: \"message:delta\", messageId, text: \"Hello\" });\n * transport.close();\n * ```\n */\nexport class InProcessChatTransport implements IChatTransport {\n private _open: boolean = true;\n private _buffer: ChatEvent[] = [];\n private _resolve: ((value: IteratorResult<ChatEvent>) => void) | null = null;\n private _error: Error | null = null;\n\n get isOpen(): boolean {\n return this._open;\n }\n\n send(event: ChatEvent): void {\n if (!this._open) return;\n\n if (this._resolve) {\n // Consumer is waiting — deliver immediately\n const resolve = this._resolve;\n this._resolve = null;\n resolve({ value: event, done: false });\n } else {\n // Buffer for later consumption\n this._buffer.push(event);\n }\n }\n\n close(): void {\n if (!this._open) return;\n this._open = false;\n\n if (this._resolve) {\n // Consumer is waiting — signal completion\n const resolve = this._resolve;\n this._resolve = null;\n resolve({ value: undefined as unknown as ChatEvent, done: true });\n }\n }\n\n error(err: Error): void {\n if (!this._open) return;\n this._open = false;\n\n const errorEvent: ChatEvent = {\n type: \"error\",\n error: err.message,\n recoverable: false,\n };\n\n if (this._resolve) {\n // Consumer is waiting — deliver error event directly\n const resolve = this._resolve;\n this._resolve = null;\n resolve({ value: errorEvent, done: false });\n } else {\n // Buffer error event for later consumption\n this._error = err;\n }\n }\n\n // ─── AsyncIterable protocol ────────────────────────────────\n\n [Symbol.asyncIterator](): AsyncIterator<ChatEvent> {\n return {\n next: (): Promise<IteratorResult<ChatEvent>> => {\n // Deliver buffered events first\n if (this._buffer.length > 0) {\n return Promise.resolve({ value: this._buffer.shift()!, done: false });\n }\n\n // If there was an error, deliver error event then done\n if (this._error) {\n const err = this._error;\n this._error = null;\n const errorEvent: ChatEvent = {\n type: \"error\",\n error: err.message,\n recoverable: false,\n };\n return Promise.resolve({ value: errorEvent, done: false });\n }\n\n // If closed and buffer empty, we're done\n if (!this._open) {\n return Promise.resolve({ value: undefined as unknown as ChatEvent, done: true });\n }\n\n // Wait for next event\n return new Promise<IteratorResult<ChatEvent>>((resolve) => {\n this._resolve = resolve;\n });\n },\n };\n }\n}\n","/**\n * @witqq/agent-sdk/chat/events\n *\n * Type-safe event emitter, chat event bus, and middleware pipeline.\n * Generic TypedEventEmitter<EventMap> for arbitrary typed event maps.\n * ChatEventBus specializing TypedEventEmitter for ChatEvent types.\n * Middleware support for event interception, transformation, and suppression.\n * Utility functions for filtering and mapping event streams.\n */\n\nimport type { ChatEvent, ChatEventType } from \"./core.js\";\n\n// ─── EventMap constraint ──────────────────────────────────────\n\n/** Constraint for event maps: keys are strings, values are payloads */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type EventMap = Record<string, any>;\n\n// ─── Listener types ───────────────────────────────────────────\n\n/** Listener callback for a specific event */\nexport type Listener<T> = (payload: T) => void;\n\n/** Unsubscribe function returned by on/once */\nexport type Unsubscribe = () => void;\n\n// ─── TypedEventEmitter ────────────────────────────────────────\n\n/**\n * Generic type-safe event emitter parameterized by an EventMap.\n *\n * @typeParam T - Map of event names to payload types\n *\n * @example\n * ```typescript\n * type MyEvents = {\n * message: string;\n * count: number;\n * done: void;\n * };\n * const emitter = new TypedEventEmitter<MyEvents>();\n * emitter.on(\"message\", (text) => console.log(text));\n * emitter.emit(\"message\", \"hello\");\n * ```\n */\nexport class TypedEventEmitter<T extends EventMap> {\n private readonly listeners = new Map<keyof T, Set<Listener<unknown>>>();\n\n /**\n * Subscribe to an event.\n * @param event - Event name\n * @param listener - Callback receiving the event payload\n * @returns Unsubscribe function\n */\n on<K extends keyof T>(event: K, listener: Listener<T[K]>): Unsubscribe {\n let set = this.listeners.get(event);\n if (!set) {\n set = new Set();\n this.listeners.set(event, set);\n }\n const fn = listener as Listener<unknown>;\n set.add(fn);\n return () => {\n set!.delete(fn);\n if (set!.size === 0) {\n this.listeners.delete(event);\n }\n };\n }\n\n /**\n * Subscribe to an event, firing the listener at most once.\n * @param event - Event name\n * @param listener - Callback receiving the event payload\n * @returns Unsubscribe function\n */\n once<K extends keyof T>(event: K, listener: Listener<T[K]>): Unsubscribe {\n const unsub = this.on(event, (payload) => {\n unsub();\n listener(payload);\n });\n return unsub;\n }\n\n /**\n * Remove a specific listener from an event.\n * @param event - Event name\n * @param listener - The listener to remove\n */\n off<K extends keyof T>(event: K, listener: Listener<T[K]>): void {\n const set = this.listeners.get(event);\n if (!set) return;\n set.delete(listener as Listener<unknown>);\n if (set.size === 0) {\n this.listeners.delete(event);\n }\n }\n\n /**\n * Emit an event, calling all registered listeners synchronously.\n * @param event - Event name\n * @param payload - Event payload\n */\n emit<K extends keyof T>(event: K, payload: T[K]): void {\n const set = this.listeners.get(event);\n if (!set) return;\n for (const fn of [...set]) {\n fn(payload);\n }\n }\n\n /**\n * Remove all listeners for a specific event, or all events if no event specified.\n * @param event - Optional event name\n */\n removeAllListeners<K extends keyof T>(event?: K): void {\n if (event !== undefined) {\n this.listeners.delete(event);\n } else {\n this.listeners.clear();\n }\n }\n\n /**\n * Get the number of listeners for a specific event.\n * @param event - Event name\n * @returns Number of listeners\n */\n listenerCount<K extends keyof T>(event: K): number {\n const set = this.listeners.get(event);\n return set ? set.size : 0;\n }\n\n /**\n * Get all event names that have at least one listener.\n * @returns Array of event names\n */\n eventNames(): Array<keyof T> {\n return [...this.listeners.keys()];\n }\n}\n\n// ─── ChatEventMap ─────────────────────────────────────────────\n\n/**\n * Map of ChatEvent type strings to their corresponding ChatEvent payloads.\n * Used to parameterize TypedEventEmitter for chat events.\n */\nexport type ChatEventMap = {\n [K in ChatEventType]: Extract<ChatEvent, { type: K }>;\n};\n\n// ─── Middleware ────────────────────────────────────────────────\n\n/**\n * Context passed to middleware functions.\n * Contains the event and control methods for the middleware pipeline.\n */\nexport interface MiddlewareContext {\n /** The current event (may be transformed by prior middleware) */\n event: ChatEvent;\n /** Call the next middleware in the chain, or deliver to listeners if last */\n next: () => void;\n /** Suppress the event — do not deliver to listeners or subsequent middleware */\n suppress: () => void;\n}\n\n/**\n * Middleware function for intercepting, transforming, or suppressing events.\n * EventMiddleware operates at the ChatEventBus level.\n *\n * @param ctx - Middleware context with event, next(), and suppress()\n *\n * @example\n * ```typescript\n * // Logging middleware\n * const logger: EventMiddleware = (ctx) => {\n * console.log(`Event: ${ctx.event.type}`);\n * ctx.next();\n * };\n *\n * // Suppressing middleware\n * const filter: EventMiddleware = (ctx) => {\n * if (ctx.event.type === \"heartbeat\") {\n * ctx.suppress();\n * } else {\n * ctx.next();\n * }\n * };\n * ```\n */\nexport type EventMiddleware = (ctx: MiddlewareContext) => void;\n\n// ─── ChatEventBus ─────────────────────────────────────────────\n\n/**\n * Chat event bus: a typed event emitter specialized for ChatEvent types\n * with middleware pipeline support.\n *\n * Events pass through the middleware pipeline before reaching listeners.\n * Middleware can inspect, transform, or suppress events.\n *\n * @example\n * ```typescript\n * const bus = new ChatEventBus();\n *\n * // Add middleware\n * bus.use((ctx) => {\n * console.log(`[${ctx.event.type}]`);\n * ctx.next();\n * });\n *\n * // Listen for events\n * bus.on(\"message:delta\", (event) => {\n * console.log(event.text);\n * });\n *\n * // Emit events\n * bus.emit(\"message:delta\", { type: \"message:delta\", messageId: id, text: \"hi\" });\n * ```\n */\nexport class ChatEventBus extends TypedEventEmitter<ChatEventMap> {\n private readonly middlewares: EventMiddleware[] = [];\n\n /**\n * Register a middleware function. Middleware runs in registration order.\n * @param middleware - Middleware function\n * @returns Unsubscribe function to remove the middleware\n */\n use(middleware: EventMiddleware): Unsubscribe {\n this.middlewares.push(middleware);\n return () => {\n const idx = this.middlewares.indexOf(middleware);\n if (idx !== -1) {\n this.middlewares.splice(idx, 1);\n }\n };\n }\n\n /**\n * Emit a chat event through the middleware pipeline, then to listeners.\n *\n * @param event - ChatEvent type string\n * @param payload - The full ChatEvent object\n */\n override emit<K extends ChatEventType>(\n event: K,\n payload: ChatEventMap[K],\n ): void {\n if (this.middlewares.length === 0) {\n super.emit(event, payload);\n return;\n }\n\n let suppressed = false;\n let currentEvent: ChatEvent = payload;\n let index = 0;\n\n const runNext = (): void => {\n if (suppressed) return;\n\n if (index >= this.middlewares.length) {\n super.emit(\n currentEvent.type as K,\n currentEvent as ChatEventMap[K],\n );\n return;\n }\n\n const mw = this.middlewares[index++];\n const ctx: MiddlewareContext = {\n event: currentEvent,\n next: () => {\n currentEvent = ctx.event;\n runNext();\n },\n suppress: () => {\n suppressed = true;\n },\n };\n mw(ctx);\n };\n\n runNext();\n }\n\n /**\n * Replace the event in the middleware context.\n * Middleware should mutate ctx.event or create a new MiddlewareContext\n * to transform events passing through the pipeline.\n */\n\n /**\n * Remove all middleware functions.\n */\n clearMiddleware(): void {\n this.middlewares.length = 0;\n }\n\n /**\n * Get the number of registered middleware functions.\n * @returns Number of middleware\n */\n middlewareCount(): number {\n return this.middlewares.length;\n }\n}\n\n// ─── Utility: Event Filtering ─────────────────────────────────\n\n/**\n * Create a filter function that passes only events of specified types.\n *\n * @param types - Event types to allow through\n * @returns Predicate function for filtering ChatEvents\n *\n * @example\n * ```typescript\n * const isTextEvent = eventFilter(\"message:start\", \"message:delta\", \"message:complete\");\n * const textEvents = allEvents.filter(isTextEvent);\n * ```\n */\nexport function eventFilter(\n ...types: ChatEventType[]\n): (event: ChatEvent) => boolean {\n const allowed = new Set<string>(types);\n return (event: ChatEvent) => allowed.has(event.type);\n}\n\n/**\n * Filter an async iterable of ChatEvents to only specified types.\n *\n * @param source - Async iterable of ChatEvents\n * @param types - Event types to keep\n * @returns Async iterable of filtered ChatEvents\n *\n * @example\n * ```typescript\n * for await (const event of filterEvents(stream, \"message:delta\", \"message:complete\")) {\n * // only message:delta and message:complete events\n * }\n * ```\n */\nexport async function* filterEvents(\n source: AsyncIterable<ChatEvent>,\n ...types: ChatEventType[]\n): AsyncIterable<ChatEvent> {\n const pred = eventFilter(...types);\n for await (const event of source) {\n if (pred(event)) {\n yield event;\n }\n }\n}\n\n// ─── Utility: Event Mapping ───────────────────────────────────\n\n/**\n * Map/transform events from an async iterable.\n *\n * @param source - Async iterable of ChatEvents\n * @param transform - Function to transform each event (return null to skip)\n * @returns Async iterable of transformed values\n *\n * @example\n * ```typescript\n * // Extract text from message:delta events\n * const texts = mapEvents(stream, (event) =>\n * event.type === \"message:delta\" ? event.text : null\n * );\n * ```\n */\nexport async function* mapEvents<R>(\n source: AsyncIterable<ChatEvent>,\n transform: (event: ChatEvent) => R | null,\n): AsyncIterable<R> {\n for await (const event of source) {\n const result = transform(event);\n if (result !== null) {\n yield result;\n }\n }\n}\n\n/**\n * Collect text from message:delta events into a single string.\n *\n * @param source - Async iterable of ChatEvents\n * @returns Complete text assembled from message:delta payloads\n *\n * @example\n * ```typescript\n * const fullText = await collectText(stream);\n * ```\n */\nexport async function collectText(\n source: AsyncIterable<ChatEvent>,\n): Promise<string> {\n const parts: string[] = [];\n for await (const event of source) {\n if (event.type === \"message:delta\") {\n parts.push(event.text);\n }\n }\n return parts.join(\"\");\n}\n"]}