@witqq/agent-sdk 0.6.1 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (122) hide show
  1. package/README.md +433 -6
  2. package/dist/auth/index.cjs +188 -1
  3. package/dist/auth/index.cjs.map +1 -1
  4. package/dist/auth/index.d.cts +154 -138
  5. package/dist/auth/index.d.ts +154 -138
  6. package/dist/auth/index.js +188 -2
  7. package/dist/auth/index.js.map +1 -1
  8. package/dist/backends/claude.cjs +315 -21
  9. package/dist/backends/claude.cjs.map +1 -1
  10. package/dist/backends/claude.d.cts +2 -1
  11. package/dist/backends/claude.d.ts +2 -1
  12. package/dist/backends/claude.js +315 -21
  13. package/dist/backends/claude.js.map +1 -1
  14. package/dist/backends/copilot.cjs +132 -24
  15. package/dist/backends/copilot.cjs.map +1 -1
  16. package/dist/backends/copilot.d.cts +2 -1
  17. package/dist/backends/copilot.d.ts +2 -1
  18. package/dist/backends/copilot.js +132 -24
  19. package/dist/backends/copilot.js.map +1 -1
  20. package/dist/backends/vercel-ai.cjs +56 -17
  21. package/dist/backends/vercel-ai.cjs.map +1 -1
  22. package/dist/backends/vercel-ai.d.cts +1 -1
  23. package/dist/backends/vercel-ai.d.ts +1 -1
  24. package/dist/backends/vercel-ai.js +56 -17
  25. package/dist/backends/vercel-ai.js.map +1 -1
  26. package/dist/chat/accumulator.cjs +147 -0
  27. package/dist/chat/accumulator.cjs.map +1 -0
  28. package/dist/chat/accumulator.d.cts +61 -0
  29. package/dist/chat/accumulator.d.ts +61 -0
  30. package/dist/chat/accumulator.js +145 -0
  31. package/dist/chat/accumulator.js.map +1 -0
  32. package/dist/chat/backends.cjs +3534 -0
  33. package/dist/chat/backends.cjs.map +1 -0
  34. package/dist/chat/backends.d.cts +62 -0
  35. package/dist/chat/backends.d.ts +62 -0
  36. package/dist/chat/backends.js +3501 -0
  37. package/dist/chat/backends.js.map +1 -0
  38. package/dist/chat/context.cjs +230 -0
  39. package/dist/chat/context.cjs.map +1 -0
  40. package/dist/chat/context.d.cts +167 -0
  41. package/dist/chat/context.d.ts +167 -0
  42. package/dist/chat/context.js +227 -0
  43. package/dist/chat/context.js.map +1 -0
  44. package/dist/chat/core.cjs +282 -0
  45. package/dist/chat/core.cjs.map +1 -0
  46. package/dist/chat/core.d.cts +435 -0
  47. package/dist/chat/core.d.ts +435 -0
  48. package/dist/chat/core.js +261 -0
  49. package/dist/chat/core.js.map +1 -0
  50. package/dist/chat/errors.cjs +251 -0
  51. package/dist/chat/errors.cjs.map +1 -0
  52. package/dist/chat/errors.d.cts +122 -0
  53. package/dist/chat/errors.d.ts +122 -0
  54. package/dist/chat/errors.js +243 -0
  55. package/dist/chat/errors.js.map +1 -0
  56. package/dist/chat/events.cjs +203 -0
  57. package/dist/chat/events.cjs.map +1 -0
  58. package/dist/chat/events.d.cts +241 -0
  59. package/dist/chat/events.d.ts +241 -0
  60. package/dist/chat/events.js +196 -0
  61. package/dist/chat/events.js.map +1 -0
  62. package/dist/chat/index.cjs +5359 -0
  63. package/dist/chat/index.cjs.map +1 -0
  64. package/dist/chat/index.d.cts +52 -0
  65. package/dist/chat/index.d.ts +52 -0
  66. package/dist/chat/index.js +5296 -0
  67. package/dist/chat/index.js.map +1 -0
  68. package/dist/chat/react.cjs +2739 -0
  69. package/dist/chat/react.cjs.map +1 -0
  70. package/dist/chat/react.d.cts +619 -0
  71. package/dist/chat/react.d.ts +619 -0
  72. package/dist/chat/react.js +2714 -0
  73. package/dist/chat/react.js.map +1 -0
  74. package/dist/chat/runtime.cjs +1030 -0
  75. package/dist/chat/runtime.cjs.map +1 -0
  76. package/dist/chat/runtime.d.cts +118 -0
  77. package/dist/chat/runtime.d.ts +118 -0
  78. package/dist/chat/runtime.js +1028 -0
  79. package/dist/chat/runtime.js.map +1 -0
  80. package/dist/chat/server.cjs +643 -0
  81. package/dist/chat/server.cjs.map +1 -0
  82. package/dist/chat/server.d.cts +287 -0
  83. package/dist/chat/server.d.ts +287 -0
  84. package/dist/chat/server.js +617 -0
  85. package/dist/chat/server.js.map +1 -0
  86. package/dist/chat/sessions.cjs +398 -0
  87. package/dist/chat/sessions.cjs.map +1 -0
  88. package/dist/chat/sessions.d.cts +239 -0
  89. package/dist/chat/sessions.d.ts +239 -0
  90. package/dist/chat/sessions.js +394 -0
  91. package/dist/chat/sessions.js.map +1 -0
  92. package/dist/chat/state.cjs +177 -0
  93. package/dist/chat/state.cjs.map +1 -0
  94. package/dist/chat/state.d.cts +92 -0
  95. package/dist/chat/state.d.ts +92 -0
  96. package/dist/chat/state.js +167 -0
  97. package/dist/chat/state.js.map +1 -0
  98. package/dist/chat/storage.cjs +240 -0
  99. package/dist/chat/storage.cjs.map +1 -0
  100. package/dist/chat/storage.d.cts +191 -0
  101. package/dist/chat/storage.d.ts +191 -0
  102. package/dist/chat/storage.js +236 -0
  103. package/dist/chat/storage.js.map +1 -0
  104. package/dist/errors-BDLbNu9w.d.cts +13 -0
  105. package/dist/errors-BDLbNu9w.d.ts +13 -0
  106. package/dist/in-process-transport-C2oPTYs6.d.ts +223 -0
  107. package/dist/in-process-transport-DG-w5G6k.d.cts +223 -0
  108. package/dist/index.cjs +25 -13
  109. package/dist/index.cjs.map +1 -1
  110. package/dist/index.d.cts +32 -4
  111. package/dist/index.d.ts +32 -4
  112. package/dist/index.js +25 -13
  113. package/dist/index.js.map +1 -1
  114. package/dist/transport-D1OaUgRk.d.ts +67 -0
  115. package/dist/transport-DX1Nhm4N.d.cts +67 -0
  116. package/dist/types-Bh5AhqD-.d.ts +141 -0
  117. package/dist/types-CGF7AEX1.d.cts +141 -0
  118. package/dist/{types-BvwNzZCj.d.cts → types-CqvUAYxt.d.cts} +21 -3
  119. package/dist/{types-BvwNzZCj.d.ts → types-CqvUAYxt.d.ts} +21 -3
  120. package/dist/types-DLZzlJxt.d.ts +39 -0
  121. package/dist/types-tE0CXwBl.d.cts +39 -0
  122. package/package.json +149 -2
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/chat/core.ts"],"names":[],"mappings":"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","file":"core.js","sourcesContent":["/**\n * @witqq/agent-sdk/chat/core\n *\n * Foundational chat types and utilities: ChatMessage, ChatSession, ChatEvent,\n * IChatProvider, type guards, and AgentEvent↔ChatEvent bridge functions.\n */\n\nimport type {\n AgentEvent,\n Message,\n ToolCall,\n ToolResult,\n ToolDefinition,\n UsageData,\n ModelInfo,\n JSONValue,\n} from \"../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 *\n * @example\n * ```ts\n * const id = toChatId(\"550e8400-e29b-41d4-a716-446655440000\");\n * ```\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\" | \"archived\";\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 isArchived?: 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// ─── Convenience Getters ───────────────────────────────────────\n\n/**\n * Join all TextPart texts in a message\n * @param message - The chat message to extract text from\n * @returns Concatenated text content\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 * @param message - The chat message to extract tool calls from\n * @returns Array of ToolCallPart\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 * @param message - The chat message to extract reasoning from\n * @returns Concatenated reasoning content\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// ─── Supporting Types ──────────────────────────────────────────\n\n/** Options for sending a message */\nexport interface SendOpts { sessionId?: string; model?: string; signal?: AbortSignal; metadata?: Record<string, unknown>; }\n/** Options for creating a new session */\nexport interface CreateSessionOpts { id?: string; title?: string; model?: string; metadata?: Record<string, unknown>; }\n/** Options for listing sessions with pagination */\nexport interface ListOpts { limit?: number; offset?: number; status?: SessionStatus; }\n/** Options for backend execution (model, tokens, tools) */\nexport interface BackendOpts { model: string; signal?: AbortSignal; systemPrompt?: string; temperature?: number; maxTokens?: number; tools?: Record<string, unknown>; providerOptions?: Record<string, unknown>; }\n/** Context passed to tool execute functions */\nexport interface ToolContext { sessionId: string; userId?: string; signal: AbortSignal; }\n/** Configuration for creating a chat runtime */\nexport interface ChatRuntimeConfig { backend: string; model?: string; apiKey?: string; baseUrl?: string; context?: { maxTokens?: number; reserveTokens?: number; strategy?: \"sliding\" | \"summarize\" | \"truncate\"; }; retry?: { maxRetries?: number; initialDelay?: number; backoffFactor?: number; }; providerOptions?: Record<string, unknown>; }\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/** Session metadata */\nexport interface ChatSessionMetadata<TCustom extends Record<string, unknown> = Record<string, unknown>> {\n messageCount: number;\n totalTokens: number;\n tags?: string[];\n custom?: TCustom;\n}\n\n/** Chat session — a conversation with ordered messages */\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 /** 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;\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 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 */\n onBeforeSend?(message: ChatMessage, context: ChatMiddlewareContext): ChatMessage | Promise<ChatMessage>;\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?: string;\n context?: Record<string, unknown>;\n /** Additional tools to include in this request */\n tools?: ToolDefinition[];\n}\n\n/** Abstract chat provider — wraps an IAgentService for chat use */\nexport interface IChatProvider {\n readonly name: string;\n sendMessage(\n session: ChatSession,\n message: string,\n options?: SendMessageOptions,\n ): Promise<ChatMessage>;\n streamMessage(\n session: ChatSession,\n message: string,\n options?: SendMessageOptions,\n ): AsyncIterable<ChatEvent>;\n listModels(): Promise<ModelInfo[]>;\n validate(): Promise<{ valid: boolean; errors: string[] }>;\n dispose(): Promise<void>;\n}\n\n// ─── Type Guards ───────────────────────────────────────────────\n\n/**\n * Check if a value is a ChatMessage\n * @param value - Value to check\n * @returns True if value has ChatMessage shape\n */\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\" ||\n obj.role === \"assistant\" ||\n obj.role === \"system\") &&\n Array.isArray(obj.parts) &&\n typeof obj.createdAt === \"string\" &&\n typeof obj.status === \"string\"\n );\n}\n\n/**\n * Check if a value is a ChatSession\n * @param value - Value to check\n * @returns True if value has ChatSession shape\n */\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/**\n * Check if a value is a MessagePart\n * @param value - Value to check\n * @returns True if value has MessagePart shape\n */\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\" ||\n obj.type === \"reasoning\" ||\n obj.type === \"tool_call\" ||\n obj.type === \"source\" ||\n obj.type === \"file\")\n );\n}\n\n/**\n * Check if a value is a TextPart\n * @param value - Value to check\n * @returns True if value is a TextPart\n */\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/**\n * Check if a value is a ToolCallPart\n * @param value - Value to check\n * @returns True if value is a ToolCallPart\n */\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/**\n * Check if a value is a ReasoningPart\n * @param value - Value to check\n * @returns True if value is a ReasoningPart\n */\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/**\n * Check if a value is a SourcePart\n * @param value - Value to check\n * @returns True if value is a SourcePart\n */\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/**\n * Check if a value is a FilePart\n * @param value - Value to check\n * @returns True if value is a FilePart\n */\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/**\n * Check if a value is a ChatEvent\n * @param value - Value to check\n * @returns True if value has a valid ChatEvent type\n */\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\",\n \"message:delta\",\n \"message:complete\",\n \"tool:start\",\n \"tool:complete\",\n \"thinking:start\",\n \"thinking:delta\",\n \"thinking:end\",\n \"permission:request\",\n \"permission:response\",\n \"usage\",\n \"session:created\",\n \"session:updated\",\n \"error\",\n \"typing:start\",\n \"typing:end\",\n \"heartbeat\",\n \"done\",\n ];\n return validTypes.includes(obj.type as ChatEventType);\n}\n\n// ─── Agent Event Adapter ───────────────────────────────────────\n\n/**\n * Map a single AgentEvent to a ChatEvent (or null if no mapping)\n * @param event - The AgentEvent to convert\n * @param messageId - ChatId to associate with the event\n * @returns Corresponding ChatEvent or null if unmappable\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 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 * @param events - Source agent events\n * @param messageId - ChatId to associate with converted events\n * @returns Async iterable of ChatEvent (nulls filtered out)\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 * (e.g. message:start, message:complete, usage, permission:*, heartbeat).\n *\n * @param event - The ChatEvent to convert\n * @returns Corresponding AgentEvent or null if not accumulator-relevant\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 };\n default:\n return null;\n }\n}\n\n// ─── Message Conversion ────────────────────────────────────────\n\n/**\n * Convert a ChatMessage to agent-sdk Message format\n * @param message - The ChatMessage to convert\n * @returns agent-sdk Message\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 * @param message - The agent-sdk Message to convert\n * @param id - Optional ChatId (auto-generated if omitted)\n * @returns ChatMessage with status \"complete\"\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 // Build text content\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 // Add tool calls from assistant messages\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 // Add tool results — map 'tool' role to 'assistant'\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 // Ensure at least an empty text part for empty messages\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 * @param message - The ChatMessage to extract results from\n * @returns Array of ToolResult for completed tool calls\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"]}
@@ -0,0 +1,251 @@
1
+ 'use strict';
2
+
3
+ // src/errors.ts
4
+ var AgentSDKError = class extends Error {
5
+ /** @internal Marker for cross-bundle identity checks */
6
+ _agentSDKError = true;
7
+ constructor(message, options) {
8
+ super(message, options);
9
+ this.name = "AgentSDKError";
10
+ }
11
+ /** Check if an error is an AgentSDKError (works across bundled copies) */
12
+ static is(error) {
13
+ return error instanceof Error && "_agentSDKError" in error && error._agentSDKError === true;
14
+ }
15
+ };
16
+
17
+ // src/chat/errors.ts
18
+ var ChatErrorCode = /* @__PURE__ */ ((ChatErrorCode2) => {
19
+ ChatErrorCode2["NETWORK"] = "NETWORK";
20
+ ChatErrorCode2["TIMEOUT"] = "TIMEOUT";
21
+ ChatErrorCode2["AUTH_EXPIRED"] = "AUTH_EXPIRED";
22
+ ChatErrorCode2["AUTH_INVALID"] = "AUTH_INVALID";
23
+ ChatErrorCode2["RATE_LIMIT"] = "RATE_LIMIT";
24
+ ChatErrorCode2["PROVIDER_ERROR"] = "PROVIDER_ERROR";
25
+ ChatErrorCode2["MODEL_NOT_FOUND"] = "MODEL_NOT_FOUND";
26
+ ChatErrorCode2["MODEL_OVERLOADED"] = "MODEL_OVERLOADED";
27
+ ChatErrorCode2["CONTEXT_OVERFLOW"] = "CONTEXT_OVERFLOW";
28
+ ChatErrorCode2["INVALID_INPUT"] = "INVALID_INPUT";
29
+ ChatErrorCode2["INVALID_RESPONSE"] = "INVALID_RESPONSE";
30
+ ChatErrorCode2["PERMISSION_DENIED"] = "PERMISSION_DENIED";
31
+ ChatErrorCode2["BACKEND_NOT_INSTALLED"] = "BACKEND_NOT_INSTALLED";
32
+ ChatErrorCode2["SESSION_NOT_FOUND"] = "SESSION_NOT_FOUND";
33
+ ChatErrorCode2["STORAGE_ERROR"] = "STORAGE_ERROR";
34
+ ChatErrorCode2["SESSION_EXPIRED"] = "SESSION_EXPIRED";
35
+ ChatErrorCode2["DISPOSED"] = "DISPOSED";
36
+ ChatErrorCode2["ABORTED"] = "ABORTED";
37
+ ChatErrorCode2["INVALID_TRANSITION"] = "INVALID_TRANSITION";
38
+ ChatErrorCode2["REENTRANCY"] = "REENTRANCY";
39
+ return ChatErrorCode2;
40
+ })(ChatErrorCode || {});
41
+ var ChatError = class extends AgentSDKError {
42
+ code;
43
+ retryable;
44
+ retryAfter;
45
+ timestamp;
46
+ constructor(message, options) {
47
+ super(message, { cause: options.cause });
48
+ this.name = "ChatError";
49
+ this.code = options.code;
50
+ this.retryable = options.retryable ?? false;
51
+ this.retryAfter = options.retryAfter;
52
+ this.timestamp = (/* @__PURE__ */ new Date()).toISOString();
53
+ }
54
+ };
55
+ function classifyError(error) {
56
+ if (error instanceof ChatError) {
57
+ return error;
58
+ }
59
+ if (error instanceof Error) {
60
+ const msg = error.message.toLowerCase();
61
+ if (isNetworkError(msg)) {
62
+ return new ChatError(error.message, {
63
+ code: "NETWORK" /* NETWORK */,
64
+ retryable: true,
65
+ cause: error
66
+ });
67
+ }
68
+ if (isTimeoutPattern(msg)) {
69
+ return new ChatError(error.message, {
70
+ code: "TIMEOUT" /* TIMEOUT */,
71
+ retryable: true,
72
+ cause: error
73
+ });
74
+ }
75
+ if (isZodError(error)) {
76
+ return new ChatError(error.message, {
77
+ code: "INVALID_INPUT" /* INVALID_INPUT */,
78
+ retryable: false,
79
+ cause: error
80
+ });
81
+ }
82
+ const statusCode = extractStatusCode(error);
83
+ if (statusCode !== null) {
84
+ return classifyByStatusCode(statusCode, error);
85
+ }
86
+ if (isContextOverflow(msg)) {
87
+ return new ChatError(error.message, {
88
+ code: "CONTEXT_OVERFLOW" /* CONTEXT_OVERFLOW */,
89
+ retryable: false,
90
+ cause: error
91
+ });
92
+ }
93
+ }
94
+ const message = error instanceof Error ? error.message : String(error);
95
+ return new ChatError(message, {
96
+ code: "PROVIDER_ERROR" /* PROVIDER_ERROR */,
97
+ retryable: false,
98
+ cause: error
99
+ });
100
+ }
101
+ var NETWORK_PATTERNS = [
102
+ "econnrefused",
103
+ "econnreset",
104
+ "enotfound",
105
+ "etimedout",
106
+ "enetunreach",
107
+ "epipe",
108
+ "fetch failed",
109
+ "network error",
110
+ "network request failed",
111
+ "failed to fetch",
112
+ "dns lookup failed"
113
+ ];
114
+ function isNetworkError(msg) {
115
+ return NETWORK_PATTERNS.some((p) => msg.includes(p));
116
+ }
117
+ function isTimeoutPattern(msg) {
118
+ return msg.includes("timeout") || msg.includes("timed out") || msg.includes("deadline exceeded") || msg.includes("aborted due to timeout");
119
+ }
120
+ function isZodError(error) {
121
+ return error.name === "ZodError" || "issues" in error && Array.isArray(error.issues);
122
+ }
123
+ function extractStatusCode(error) {
124
+ const errRecord = error;
125
+ if (typeof errRecord.status === "number") return errRecord.status;
126
+ if (typeof errRecord.statusCode === "number") return errRecord.statusCode;
127
+ const match = error.message.match(/\b(4\d{2}|5\d{2})\b/);
128
+ return match ? parseInt(match[1], 10) : null;
129
+ }
130
+ function classifyByStatusCode(status, error) {
131
+ if (status === 401 || status === 403) {
132
+ return new ChatError(error.message, {
133
+ code: "AUTH_INVALID" /* AUTH_INVALID */,
134
+ retryable: false,
135
+ cause: error
136
+ });
137
+ }
138
+ if (status === 429) {
139
+ const retryAfterSeconds = extractRetryAfter(error);
140
+ return new ChatError(error.message, {
141
+ code: "RATE_LIMIT" /* RATE_LIMIT */,
142
+ retryable: true,
143
+ retryAfter: retryAfterSeconds != null ? retryAfterSeconds * 1e3 : void 0,
144
+ cause: error
145
+ });
146
+ }
147
+ if (status >= 500) {
148
+ return new ChatError(error.message, {
149
+ code: "PROVIDER_ERROR" /* PROVIDER_ERROR */,
150
+ retryable: true,
151
+ cause: error
152
+ });
153
+ }
154
+ if (status >= 400 && status < 500) {
155
+ return new ChatError(error.message, {
156
+ code: "INVALID_INPUT" /* INVALID_INPUT */,
157
+ retryable: false,
158
+ cause: error
159
+ });
160
+ }
161
+ return new ChatError(error.message, {
162
+ code: "NETWORK" /* NETWORK */,
163
+ retryable: true,
164
+ cause: error
165
+ });
166
+ }
167
+ function extractRetryAfter(error) {
168
+ const errRecord = error;
169
+ if (typeof errRecord.retryAfter === "number") return errRecord.retryAfter;
170
+ const match = error.message.match(/retry.after[:\s]*(\d+)/i);
171
+ return match ? parseInt(match[1], 10) : void 0;
172
+ }
173
+ function isContextOverflow(msg) {
174
+ return msg.includes("context length exceeded") || msg.includes("maximum context length") || msg.includes("context window") || msg.includes("token limit") || msg.includes("too many tokens");
175
+ }
176
+ var ExponentialBackoffStrategy = class {
177
+ baseMs;
178
+ maxMs;
179
+ maxAttempts;
180
+ jitter;
181
+ constructor(options) {
182
+ this.baseMs = options?.baseMs ?? 1e3;
183
+ this.maxMs = options?.maxMs ?? 3e4;
184
+ this.maxAttempts = options?.maxAttempts ?? 3;
185
+ this.jitter = Math.max(0, Math.min(1, options?.jitter ?? 0.1));
186
+ }
187
+ nextDelay(attempt, error) {
188
+ if (attempt >= this.maxAttempts) return null;
189
+ if (!error.retryable) return null;
190
+ if (error.code === "RATE_LIMIT" /* RATE_LIMIT */ && error.retryAfter) {
191
+ return error.retryAfter;
192
+ }
193
+ const delay = Math.min(this.baseMs * Math.pow(2, attempt), this.maxMs);
194
+ const jitterAmount = delay * this.jitter * (Math.random() * 2 - 1);
195
+ return Math.max(0, Math.round(delay + jitterAmount));
196
+ }
197
+ };
198
+ async function withRetry(fn, strategy, options) {
199
+ let attempt = 0;
200
+ for (; ; ) {
201
+ try {
202
+ return await fn();
203
+ } catch (raw) {
204
+ const error = classifyError(raw);
205
+ const delay = strategy.nextDelay(attempt, error);
206
+ if (delay === null) {
207
+ throw error;
208
+ }
209
+ if (options?.signal?.aborted) {
210
+ throw error;
211
+ }
212
+ options?.onRetry?.(error, attempt, delay);
213
+ await sleep(delay, options?.signal);
214
+ attempt++;
215
+ }
216
+ }
217
+ }
218
+ function isRetryable(error) {
219
+ if (error instanceof ChatError) {
220
+ return error.retryable;
221
+ }
222
+ const classified = classifyError(error);
223
+ return classified.retryable;
224
+ }
225
+ function sleep(ms, signal) {
226
+ return new Promise((resolve, reject) => {
227
+ if (signal?.aborted) {
228
+ reject(new ChatError("Retry aborted", { code: "ABORTED" /* ABORTED */ }));
229
+ return;
230
+ }
231
+ const timer = setTimeout(resolve, ms);
232
+ signal?.addEventListener(
233
+ "abort",
234
+ () => {
235
+ clearTimeout(timer);
236
+ reject(new ChatError("Retry aborted", { code: "ABORTED" /* ABORTED */ }));
237
+ },
238
+ { once: true }
239
+ );
240
+ });
241
+ }
242
+
243
+ exports.ChatError = ChatError;
244
+ exports.ChatErrorCode = ChatErrorCode;
245
+ exports.ChatSDKError = ChatError;
246
+ exports.ExponentialBackoffStrategy = ExponentialBackoffStrategy;
247
+ exports.classifyError = classifyError;
248
+ exports.isRetryable = isRetryable;
249
+ exports.withRetry = withRetry;
250
+ //# sourceMappingURL=errors.cjs.map
251
+ //# sourceMappingURL=errors.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/errors.ts","../../src/chat/errors.ts"],"names":["ChatErrorCode"],"mappings":"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","file":"errors.cjs","sourcesContent":["/** Base error class for agent-sdk.\n *\n * Use `AgentSDKError.is(err)` for reliable cross-module `instanceof` checks\n * (works across separately bundled entry points where `instanceof` may fail). */\nexport class AgentSDKError extends Error {\n /** @internal Marker for cross-bundle identity checks */\n readonly _agentSDKError = true as const;\n\n constructor(message: string, options?: ErrorOptions) {\n super(message, options);\n this.name = \"AgentSDKError\";\n }\n\n /** Check if an error is an AgentSDKError (works across bundled copies) */\n static is(error: unknown): error is AgentSDKError {\n return (\n error instanceof Error &&\n \"_agentSDKError\" in error &&\n (error as AgentSDKError)._agentSDKError === true\n );\n }\n}\n\n/** Thrown when agent.run() is called while already running (M8 re-entrancy guard) */\nexport class ReentrancyError extends AgentSDKError {\n constructor() {\n super(\"Agent is already running. Await the current run before starting another.\");\n this.name = \"ReentrancyError\";\n }\n}\n\n/** Thrown when an operation is attempted on a disposed agent/service */\nexport class DisposedError extends AgentSDKError {\n constructor(entity: string) {\n super(`${entity} has been disposed and cannot be used.`);\n this.name = \"DisposedError\";\n }\n}\n\n/** Thrown when a backend is not found in the registry */\nexport class BackendNotFoundError extends AgentSDKError {\n constructor(backend: string) {\n super(\n `Unknown backend: \"${backend}\". ` +\n `Built-in: copilot, claude, vercel-ai. ` +\n `Custom: use registerBackend() first.`,\n );\n this.name = \"BackendNotFoundError\";\n }\n}\n\n/** Thrown when a backend is already registered */\nexport class BackendAlreadyRegisteredError extends AgentSDKError {\n constructor(backend: string) {\n super(`Backend \"${backend}\" is already registered. Use a different name or unregister first.`);\n this.name = \"BackendAlreadyRegisteredError\";\n }\n}\n\n/** Thrown when subprocess management fails */\nexport class SubprocessError extends AgentSDKError {\n constructor(message: string, options?: ErrorOptions) {\n super(message, options);\n this.name = \"SubprocessError\";\n }\n}\n\n/** Thrown when a required peer dependency is not installed */\nexport class DependencyError extends AgentSDKError {\n public readonly packageName: string;\n\n constructor(packageName: string) {\n super(`${packageName} is not installed. Install it: npm install ${packageName}`);\n this.name = \"DependencyError\";\n this.packageName = packageName;\n }\n}\n\n/** Thrown when an agent run is aborted */\nexport class AbortError extends AgentSDKError {\n constructor() {\n super(\"Agent run was aborted.\");\n this.name = \"AbortError\";\n }\n}\n\n/** Thrown when a tool execution fails */\nexport class ToolExecutionError extends AgentSDKError {\n public readonly toolName: string;\n\n constructor(toolName: string, message: string, options?: ErrorOptions) {\n super(`Tool \"${toolName}\" failed: ${message}`, options);\n this.name = \"ToolExecutionError\";\n this.toolName = toolName;\n }\n}\n\n/** Thrown when structured output parsing fails */\nexport class StructuredOutputError extends AgentSDKError {\n constructor(message: string, options?: ErrorOptions) {\n super(`Structured output error: ${message}`, options);\n this.name = \"StructuredOutputError\";\n }\n}\n","/**\n * @witqq/agent-sdk/chat/errors\n *\n * Flat error taxonomy with ChatErrorCode enum, unified 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\";\n\n// ─── Error Code Enum ───────────────────────────────────────────\n\n/** Error codes for chat-specific errors — used by classifyError() and ChatError */\nexport enum ChatErrorCode {\n NETWORK = \"NETWORK\",\n TIMEOUT = \"TIMEOUT\",\n AUTH_EXPIRED = \"AUTH_EXPIRED\",\n AUTH_INVALID = \"AUTH_INVALID\",\n RATE_LIMIT = \"RATE_LIMIT\",\n PROVIDER_ERROR = \"PROVIDER_ERROR\",\n MODEL_NOT_FOUND = \"MODEL_NOT_FOUND\",\n MODEL_OVERLOADED = \"MODEL_OVERLOADED\",\n CONTEXT_OVERFLOW = \"CONTEXT_OVERFLOW\",\n INVALID_INPUT = \"INVALID_INPUT\",\n INVALID_RESPONSE = \"INVALID_RESPONSE\",\n PERMISSION_DENIED = \"PERMISSION_DENIED\",\n BACKEND_NOT_INSTALLED = \"BACKEND_NOT_INSTALLED\",\n SESSION_NOT_FOUND = \"SESSION_NOT_FOUND\",\n STORAGE_ERROR = \"STORAGE_ERROR\",\n SESSION_EXPIRED = \"SESSION_EXPIRED\",\n DISPOSED = \"DISPOSED\",\n ABORTED = \"ABORTED\",\n INVALID_TRANSITION = \"INVALID_TRANSITION\",\n REENTRANCY = \"REENTRANCY\",\n}\n\n// ─── Error Options ─────────────────────────────────────────────\n\n/** Options for constructing a ChatError */\nexport interface ChatErrorOptions {\n /** Machine-readable error code */\n code: ChatErrorCode;\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/** @deprecated Use ChatErrorOptions */\nexport type ChatSDKErrorOptions = ChatErrorOptions;\n\n// ─── Unified Error Class ───────────────────────────────────────\n\n/** Unified error class for all chat SDK errors */\nexport class ChatError extends AgentSDKError {\n readonly code: ChatErrorCode;\n readonly retryable: boolean;\n readonly retryAfter?: number;\n readonly timestamp: string;\n\n constructor(message: string, options: ChatErrorOptions) {\n super(message, { cause: options.cause });\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/** @deprecated Use ChatError */\nexport { ChatError as ChatSDKError };\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: ChatErrorCode.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: ChatErrorCode.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: ChatErrorCode.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: ChatErrorCode.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: ChatErrorCode.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: ChatErrorCode.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: ChatErrorCode.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: ChatErrorCode.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: ChatErrorCode.INVALID_INPUT,\n retryable: false,\n cause: error,\n });\n }\n return new ChatError(error.message, {\n code: ChatErrorCode.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 === ChatErrorCode.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: ChatErrorCode.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: ChatErrorCode.ABORTED }));\n },\n { once: true },\n );\n });\n}\n"]}
@@ -0,0 +1,122 @@
1
+ import { A as AgentSDKError } from '../errors-BDLbNu9w.cjs';
2
+
3
+ /**
4
+ * @witqq/agent-sdk/chat/errors
5
+ *
6
+ * Flat error taxonomy with ChatErrorCode enum, unified ChatError class,
7
+ * pattern-matching classifier, retry strategies with exponential backoff.
8
+ * Extends the existing AgentSDKError from @witqq/agent-sdk.
9
+ */
10
+
11
+ /** Error codes for chat-specific errors — used by classifyError() and ChatError */
12
+ declare enum ChatErrorCode {
13
+ NETWORK = "NETWORK",
14
+ TIMEOUT = "TIMEOUT",
15
+ AUTH_EXPIRED = "AUTH_EXPIRED",
16
+ AUTH_INVALID = "AUTH_INVALID",
17
+ RATE_LIMIT = "RATE_LIMIT",
18
+ PROVIDER_ERROR = "PROVIDER_ERROR",
19
+ MODEL_NOT_FOUND = "MODEL_NOT_FOUND",
20
+ MODEL_OVERLOADED = "MODEL_OVERLOADED",
21
+ CONTEXT_OVERFLOW = "CONTEXT_OVERFLOW",
22
+ INVALID_INPUT = "INVALID_INPUT",
23
+ INVALID_RESPONSE = "INVALID_RESPONSE",
24
+ PERMISSION_DENIED = "PERMISSION_DENIED",
25
+ BACKEND_NOT_INSTALLED = "BACKEND_NOT_INSTALLED",
26
+ SESSION_NOT_FOUND = "SESSION_NOT_FOUND",
27
+ STORAGE_ERROR = "STORAGE_ERROR",
28
+ SESSION_EXPIRED = "SESSION_EXPIRED",
29
+ DISPOSED = "DISPOSED",
30
+ ABORTED = "ABORTED",
31
+ INVALID_TRANSITION = "INVALID_TRANSITION",
32
+ REENTRANCY = "REENTRANCY"
33
+ }
34
+ /** Options for constructing a ChatError */
35
+ interface ChatErrorOptions {
36
+ /** Machine-readable error code */
37
+ code: ChatErrorCode;
38
+ /** Whether this error is retryable (default: false) */
39
+ retryable?: boolean;
40
+ /** Retry delay hint in milliseconds */
41
+ retryAfter?: number;
42
+ /** Original cause, if wrapping another error */
43
+ cause?: unknown;
44
+ }
45
+ /** @deprecated Use ChatErrorOptions */
46
+ type ChatSDKErrorOptions = ChatErrorOptions;
47
+ /** Unified error class for all chat SDK errors */
48
+ declare class ChatError extends AgentSDKError {
49
+ readonly code: ChatErrorCode;
50
+ readonly retryable: boolean;
51
+ readonly retryAfter?: number;
52
+ readonly timestamp: string;
53
+ constructor(message: string, options: ChatErrorOptions);
54
+ }
55
+
56
+ /**
57
+ * Classify an unknown thrown value into a ChatError with the appropriate code.
58
+ * Pattern-matches against common error shapes:
59
+ * - Already a ChatError → returned as-is
60
+ * - Fetch/network errors (ECONNREFUSED, ETIMEDOUT, etc.)
61
+ * - HTTP status codes (401→AUTH_INVALID, 429→RATE_LIMIT, 5xx→PROVIDER_ERROR)
62
+ * - Timeout patterns
63
+ * - Zod validation errors
64
+ * - Context overflow patterns
65
+ * - Unknown → wrapped as ChatError with PROVIDER_ERROR
66
+ *
67
+ * @param error - The thrown value to classify
68
+ * @returns ChatError with appropriate error code and retryable flag
69
+ */
70
+ declare function classifyError(error: unknown): ChatError;
71
+ /** Strategy for computing retry delays */
72
+ interface RetryStrategy {
73
+ /** Return delay in ms for the given attempt (0-based), or null to stop */
74
+ nextDelay(attempt: number, error: ChatError): number | null;
75
+ }
76
+ /** Options for ExponentialBackoffStrategy */
77
+ interface ExponentialBackoffOptions {
78
+ /** Base delay in ms (default: 1000) */
79
+ baseMs?: number;
80
+ /** Maximum delay in ms (default: 30000) */
81
+ maxMs?: number;
82
+ /** Maximum number of attempts (default: 3) */
83
+ maxAttempts?: number;
84
+ /** Jitter factor 0–1 (default: 0.1) */
85
+ jitter?: number;
86
+ }
87
+ /** Exponential backoff with optional jitter */
88
+ declare class ExponentialBackoffStrategy implements RetryStrategy {
89
+ private readonly baseMs;
90
+ private readonly maxMs;
91
+ private readonly maxAttempts;
92
+ private readonly jitter;
93
+ constructor(options?: ExponentialBackoffOptions);
94
+ nextDelay(attempt: number, error: ChatError): number | null;
95
+ }
96
+ /** Options for withRetry execution */
97
+ interface RetryOptions {
98
+ /** Abort signal to cancel retries */
99
+ signal?: AbortSignal;
100
+ /** Called before each retry with the error and delay */
101
+ onRetry?: (error: ChatError, attempt: number, delayMs: number) => void;
102
+ }
103
+ /**
104
+ * Execute an async function with automatic retries using the provided strategy.
105
+ * Respects ChatError.retryable and ChatError.retryAfter.
106
+ * Classifies non-ChatError errors before deciding on retry.
107
+ *
108
+ * @param fn - Async function to execute
109
+ * @param strategy - Retry strategy providing delay calculations
110
+ * @param options - Optional abort signal and retry callback
111
+ * @returns Result of fn on success
112
+ * @throws ChatError when all retries exhausted or error is non-retryable
113
+ */
114
+ declare function withRetry<T>(fn: () => Promise<T>, strategy: RetryStrategy, options?: RetryOptions): Promise<T>;
115
+ /**
116
+ * Type guard: check if an error is retryable
117
+ * @param error - The error to check
118
+ * @returns True if error is a retryable ChatError
119
+ */
120
+ declare function isRetryable(error: unknown): boolean;
121
+
122
+ export { ChatError, ChatErrorCode, type ChatErrorOptions, ChatError as ChatSDKError, type ChatSDKErrorOptions, type ExponentialBackoffOptions, ExponentialBackoffStrategy, type RetryOptions, type RetryStrategy, classifyError, isRetryable, withRetry };
@@ -0,0 +1,122 @@
1
+ import { A as AgentSDKError } from '../errors-BDLbNu9w.js';
2
+
3
+ /**
4
+ * @witqq/agent-sdk/chat/errors
5
+ *
6
+ * Flat error taxonomy with ChatErrorCode enum, unified ChatError class,
7
+ * pattern-matching classifier, retry strategies with exponential backoff.
8
+ * Extends the existing AgentSDKError from @witqq/agent-sdk.
9
+ */
10
+
11
+ /** Error codes for chat-specific errors — used by classifyError() and ChatError */
12
+ declare enum ChatErrorCode {
13
+ NETWORK = "NETWORK",
14
+ TIMEOUT = "TIMEOUT",
15
+ AUTH_EXPIRED = "AUTH_EXPIRED",
16
+ AUTH_INVALID = "AUTH_INVALID",
17
+ RATE_LIMIT = "RATE_LIMIT",
18
+ PROVIDER_ERROR = "PROVIDER_ERROR",
19
+ MODEL_NOT_FOUND = "MODEL_NOT_FOUND",
20
+ MODEL_OVERLOADED = "MODEL_OVERLOADED",
21
+ CONTEXT_OVERFLOW = "CONTEXT_OVERFLOW",
22
+ INVALID_INPUT = "INVALID_INPUT",
23
+ INVALID_RESPONSE = "INVALID_RESPONSE",
24
+ PERMISSION_DENIED = "PERMISSION_DENIED",
25
+ BACKEND_NOT_INSTALLED = "BACKEND_NOT_INSTALLED",
26
+ SESSION_NOT_FOUND = "SESSION_NOT_FOUND",
27
+ STORAGE_ERROR = "STORAGE_ERROR",
28
+ SESSION_EXPIRED = "SESSION_EXPIRED",
29
+ DISPOSED = "DISPOSED",
30
+ ABORTED = "ABORTED",
31
+ INVALID_TRANSITION = "INVALID_TRANSITION",
32
+ REENTRANCY = "REENTRANCY"
33
+ }
34
+ /** Options for constructing a ChatError */
35
+ interface ChatErrorOptions {
36
+ /** Machine-readable error code */
37
+ code: ChatErrorCode;
38
+ /** Whether this error is retryable (default: false) */
39
+ retryable?: boolean;
40
+ /** Retry delay hint in milliseconds */
41
+ retryAfter?: number;
42
+ /** Original cause, if wrapping another error */
43
+ cause?: unknown;
44
+ }
45
+ /** @deprecated Use ChatErrorOptions */
46
+ type ChatSDKErrorOptions = ChatErrorOptions;
47
+ /** Unified error class for all chat SDK errors */
48
+ declare class ChatError extends AgentSDKError {
49
+ readonly code: ChatErrorCode;
50
+ readonly retryable: boolean;
51
+ readonly retryAfter?: number;
52
+ readonly timestamp: string;
53
+ constructor(message: string, options: ChatErrorOptions);
54
+ }
55
+
56
+ /**
57
+ * Classify an unknown thrown value into a ChatError with the appropriate code.
58
+ * Pattern-matches against common error shapes:
59
+ * - Already a ChatError → returned as-is
60
+ * - Fetch/network errors (ECONNREFUSED, ETIMEDOUT, etc.)
61
+ * - HTTP status codes (401→AUTH_INVALID, 429→RATE_LIMIT, 5xx→PROVIDER_ERROR)
62
+ * - Timeout patterns
63
+ * - Zod validation errors
64
+ * - Context overflow patterns
65
+ * - Unknown → wrapped as ChatError with PROVIDER_ERROR
66
+ *
67
+ * @param error - The thrown value to classify
68
+ * @returns ChatError with appropriate error code and retryable flag
69
+ */
70
+ declare function classifyError(error: unknown): ChatError;
71
+ /** Strategy for computing retry delays */
72
+ interface RetryStrategy {
73
+ /** Return delay in ms for the given attempt (0-based), or null to stop */
74
+ nextDelay(attempt: number, error: ChatError): number | null;
75
+ }
76
+ /** Options for ExponentialBackoffStrategy */
77
+ interface ExponentialBackoffOptions {
78
+ /** Base delay in ms (default: 1000) */
79
+ baseMs?: number;
80
+ /** Maximum delay in ms (default: 30000) */
81
+ maxMs?: number;
82
+ /** Maximum number of attempts (default: 3) */
83
+ maxAttempts?: number;
84
+ /** Jitter factor 0–1 (default: 0.1) */
85
+ jitter?: number;
86
+ }
87
+ /** Exponential backoff with optional jitter */
88
+ declare class ExponentialBackoffStrategy implements RetryStrategy {
89
+ private readonly baseMs;
90
+ private readonly maxMs;
91
+ private readonly maxAttempts;
92
+ private readonly jitter;
93
+ constructor(options?: ExponentialBackoffOptions);
94
+ nextDelay(attempt: number, error: ChatError): number | null;
95
+ }
96
+ /** Options for withRetry execution */
97
+ interface RetryOptions {
98
+ /** Abort signal to cancel retries */
99
+ signal?: AbortSignal;
100
+ /** Called before each retry with the error and delay */
101
+ onRetry?: (error: ChatError, attempt: number, delayMs: number) => void;
102
+ }
103
+ /**
104
+ * Execute an async function with automatic retries using the provided strategy.
105
+ * Respects ChatError.retryable and ChatError.retryAfter.
106
+ * Classifies non-ChatError errors before deciding on retry.
107
+ *
108
+ * @param fn - Async function to execute
109
+ * @param strategy - Retry strategy providing delay calculations
110
+ * @param options - Optional abort signal and retry callback
111
+ * @returns Result of fn on success
112
+ * @throws ChatError when all retries exhausted or error is non-retryable
113
+ */
114
+ declare function withRetry<T>(fn: () => Promise<T>, strategy: RetryStrategy, options?: RetryOptions): Promise<T>;
115
+ /**
116
+ * Type guard: check if an error is retryable
117
+ * @param error - The error to check
118
+ * @returns True if error is a retryable ChatError
119
+ */
120
+ declare function isRetryable(error: unknown): boolean;
121
+
122
+ export { ChatError, ChatErrorCode, type ChatErrorOptions, ChatError as ChatSDKError, type ChatSDKErrorOptions, type ExponentialBackoffOptions, ExponentialBackoffStrategy, type RetryOptions, type RetryStrategy, classifyError, isRetryable, withRetry };