@yushaw/sanqian-sdk 0.3.21 → 0.3.23

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.browser.ts","../src/errors.ts","../src/client.browser.ts"],"sourcesContent":["/**\n * Sanqian SDK - Browser Build\n *\n * This entry point is optimized for browser environments.\n * It does NOT include DiscoveryManager (which uses Node.js APIs).\n *\n * When using this build, you MUST provide connectionInfo in config:\n *\n * @example\n * ```typescript\n * import { SanqianSDK } from '@yushaw/sanqian-sdk';\n *\n * const sdk = new SanqianSDK({\n * appName: 'my-app',\n * appVersion: '1.0.0',\n * tools: [...],\n * connectionInfo: {\n * version: 1,\n * port: 38765,\n * ws_path: '/ws/apps',\n * token: 'your-token',\n * pid: 0,\n * started_at: new Date().toISOString(),\n * },\n * });\n *\n * await sdk.connect();\n * ```\n */\n\nexport { SanqianSDK, Conversation } from \"./client.browser\";\n\n// Errors\nexport {\n SanqianSDKError,\n SDKErrorCode,\n createSDKError,\n ErrorMessages,\n SANQIAN_WEBSITE,\n} from \"./errors\";\n\n// Types\nexport type {\n SDKConfig,\n ToolDefinition,\n JSONSchema,\n JSONSchemaProperty,\n ConnectionInfo,\n ConnectionState,\n ChatRequest,\n ChatMessage,\n ChatResponse,\n ChatStreamEvent,\n LoadItem,\n LoadItemType,\n LoadItemAction,\n ToolCall,\n SDKEvents,\n SDKEventName,\n // Private Agent API\n AgentConfig,\n AgentInfo,\n AgentUpdateConfig,\n ConversationInfo,\n ConversationMessage,\n ConversationDetail,\n // Remote Tools\n RemoteToolDefinition,\n // HITL (Human-in-the-Loop)\n HitlInterruptType,\n HitlRiskLevel,\n HitlInterruptPayload,\n HitlResponse,\n // Embedding Config API\n EmbeddingConfigResult,\n // Rerank Config API\n RerankConfigResult,\n // Capability Discovery API\n CapabilityType,\n Capability,\n ToolCapability,\n SkillCapability,\n AgentCapability,\n CapabilitySearchResult,\n ListCapabilitiesOptions,\n SearchCapabilitiesOptions,\n // Context Provider API\n ContextProvider,\n ContextData,\n ContextListItem,\n // Session Resources API\n SessionResource,\n StoredSessionResource,\n // Messaging Channels API\n ChannelChatType,\n ChannelDmPolicy,\n ChannelDmScope,\n ChannelGroupPolicy,\n ChannelAccountStatus,\n ChannelRuntimeStatus,\n ChannelBindingMatchType,\n ChannelPluginInfo,\n ChannelAccount,\n ChannelBinding,\n ChannelStatus,\n ChannelProbeResult,\n CreateChannelAccountRequest,\n UpdateChannelAccountRequest,\n CreateChannelBindingRequest,\n UpdateChannelBindingRequest,\n SendChannelMessageRequest,\n SendChannelMessageResponse,\n} from \"./types\";\n","/**\n * SDK Error Messages\n *\n * User-friendly error messages in English and Chinese.\n * All errors guide users to sanqian.io for installation.\n */\n\nexport const SANQIAN_WEBSITE = \"https://sanqian.io\";\n\n/**\n * Error codes for SDK errors\n */\nexport enum SDKErrorCode {\n INVALID_CONFIG = \"INVALID_CONFIG\",\n NOT_INSTALLED = \"NOT_INSTALLED\",\n NOT_RUNNING = \"NOT_RUNNING\",\n CONNECTION_TIMEOUT = \"CONNECTION_TIMEOUT\",\n STARTUP_TIMEOUT = \"STARTUP_TIMEOUT\",\n REGISTRATION_FAILED = \"REGISTRATION_FAILED\",\n REQUEST_TIMEOUT = \"REQUEST_TIMEOUT\",\n REQUEST_FAILED = \"REQUEST_FAILED\",\n DISCONNECTED = \"DISCONNECTED\",\n WEBSOCKET_ERROR = \"WEBSOCKET_ERROR\",\n AGENT_NOT_FOUND = \"AGENT_NOT_FOUND\",\n CONVERSATION_NOT_FOUND = \"CONVERSATION_NOT_FOUND\",\n TOOL_NOT_FOUND = \"TOOL_NOT_FOUND\",\n TOOL_EXECUTION_TIMEOUT = \"TOOL_EXECUTION_TIMEOUT\",\n}\n\n/**\n * Bilingual error messages\n */\nexport const ErrorMessages: Record<\n SDKErrorCode,\n { en: string; zh: string; hint?: { en: string; zh: string } }\n> = {\n [SDKErrorCode.INVALID_CONFIG]: {\n en: `SDK configuration is invalid.`,\n zh: `SDK 配置无效。`,\n hint: {\n en: `Please check required fields and option values in your SDK config.`,\n zh: `请检查 SDK 配置中的必填字段和选项取值。`,\n },\n },\n [SDKErrorCode.NOT_INSTALLED]: {\n en: `Sanqian is not installed on this computer.`,\n zh: `Sanqian 尚未安装在此电脑上。`,\n hint: {\n en: `Please download and install Sanqian from ${SANQIAN_WEBSITE}`,\n zh: `请访问 ${SANQIAN_WEBSITE} 下载安装 Sanqian`,\n },\n },\n [SDKErrorCode.NOT_RUNNING]: {\n en: `Sanqian is not running.`,\n zh: `Sanqian 未在运行。`,\n hint: {\n en: `Please start Sanqian first, or enable autoLaunchSanqian option in SDK config.`,\n zh: `请先启动 Sanqian,或在 SDK 配置中启用 autoLaunchSanqian 选项。`,\n },\n },\n [SDKErrorCode.CONNECTION_TIMEOUT]: {\n en: `Failed to connect to Sanqian (connection timeout).`,\n zh: `连接 Sanqian 失败(连接超时)。`,\n hint: {\n en: `Please check if Sanqian is running properly. If the problem persists, try restarting Sanqian.`,\n zh: `请检查 Sanqian 是否正常运行。如问题持续,请尝试重启 Sanqian。`,\n },\n },\n [SDKErrorCode.STARTUP_TIMEOUT]: {\n en: `Sanqian failed to start within 2 minutes.`,\n zh: `Sanqian 在 2 分钟内未能启动。`,\n hint: {\n en: `Please try starting Sanqian manually. If it fails to start, reinstall from ${SANQIAN_WEBSITE}`,\n zh: `请尝试手动启动 Sanqian。如仍无法启动,请从 ${SANQIAN_WEBSITE} 重新安装。`,\n },\n },\n [SDKErrorCode.REGISTRATION_FAILED]: {\n en: `Failed to register with Sanqian.`,\n zh: `向 Sanqian 注册失败。`,\n hint: {\n en: `Please check your SDK configuration (appName, tools). If the problem persists, try restarting Sanqian.`,\n zh: `请检查 SDK 配置(appName、tools)。如问题持续,请尝试重启 Sanqian。`,\n },\n },\n [SDKErrorCode.REQUEST_TIMEOUT]: {\n en: `Request timed out.`,\n zh: `请求超时。`,\n hint: {\n en: `The operation took too long. Please try again.`,\n zh: `操作耗时过长,请重试。`,\n },\n },\n [SDKErrorCode.REQUEST_FAILED]: {\n en: `Request failed.`,\n zh: `请求失败。`,\n hint: {\n en: `Please check the error details and try again.`,\n zh: `请检查错误详情后重试。`,\n },\n },\n [SDKErrorCode.DISCONNECTED]: {\n en: `Disconnected from Sanqian.`,\n zh: `与 Sanqian 的连接已断开。`,\n hint: {\n en: `The SDK will automatically reconnect. If problems persist, check if Sanqian is still running.`,\n zh: `SDK 会自动重连。如问题持续,请检查 Sanqian 是否仍在运行。`,\n },\n },\n [SDKErrorCode.WEBSOCKET_ERROR]: {\n en: `WebSocket connection error.`,\n zh: `WebSocket 连接错误。`,\n hint: {\n en: `Please check your network and firewall settings. Sanqian uses local WebSocket on port shown in settings.`,\n zh: `请检查网络和防火墙设置。Sanqian 使用本地 WebSocket,端口可在设置中查看。`,\n },\n },\n [SDKErrorCode.AGENT_NOT_FOUND]: {\n en: `Agent not found.`,\n zh: `找不到该 Agent。`,\n hint: {\n en: `Please check the agent ID. Use listAgents() to see available agents.`,\n zh: `请检查 Agent ID。使用 listAgents() 查看可用的 Agent。`,\n },\n },\n [SDKErrorCode.CONVERSATION_NOT_FOUND]: {\n en: `Conversation not found.`,\n zh: `找不到该对话。`,\n hint: {\n en: `The conversation may have been deleted. Start a new conversation with startConversation().`,\n zh: `该对话可能已被删除。使用 startConversation() 开始新对话。`,\n },\n },\n [SDKErrorCode.TOOL_NOT_FOUND]: {\n en: `Tool not found.`,\n zh: `找不到该工具。`,\n hint: {\n en: `Please check that the tool is registered in your SDK config.`,\n zh: `请检查该工具是否已在 SDK 配置中注册。`,\n },\n },\n [SDKErrorCode.TOOL_EXECUTION_TIMEOUT]: {\n en: `Tool execution timed out.`,\n zh: `工具执行超时。`,\n hint: {\n en: `The tool took too long to execute. Consider increasing toolExecutionTimeout in SDK config.`,\n zh: `工具执行时间过长。可在 SDK 配置中增加 toolExecutionTimeout。`,\n },\n },\n};\n\n/**\n * Custom SDK Error with code and bilingual message\n */\nexport class SanqianSDKError extends Error {\n code: SDKErrorCode;\n messageZh: string;\n hint?: string;\n hintZh?: string;\n\n constructor(code: SDKErrorCode, details?: string) {\n const msg = ErrorMessages[code];\n const fullMessage = details ? `${msg.en} ${details}` : msg.en;\n\n super(fullMessage);\n this.name = \"SanqianSDKError\";\n this.code = code;\n this.messageZh = details ? `${msg.zh} ${details}` : msg.zh;\n this.hint = msg.hint?.en;\n this.hintZh = msg.hint?.zh;\n }\n\n /**\n * Get full error message with hint (English)\n */\n getFullMessage(): string {\n return this.hint ? `${this.message}\\n${this.hint}` : this.message;\n }\n\n /**\n * Get full error message with hint (Chinese)\n */\n getFullMessageZh(): string {\n return this.hintZh ? `${this.messageZh}\\n${this.hintZh}` : this.messageZh;\n }\n\n /**\n * Get bilingual error message\n */\n getBilingualMessage(): string {\n return `${this.getFullMessage()}\\n\\n${this.getFullMessageZh()}`;\n }\n}\n\n/**\n * Create a user-friendly SDK error\n */\nexport function createSDKError(\n code: SDKErrorCode,\n details?: string\n): SanqianSDKError {\n return new SanqianSDKError(code, details);\n}\n","/**\n * Sanqian SDK Client - Browser Build\n *\n * This is a browser-optimized version of the SDK client that does NOT include\n * DiscoveryManager or any Node.js APIs (fs, path, child_process, os).\n *\n * IMPORTANT: When using this build, you MUST provide connectionInfo in config.\n * Auto-discovery and auto-launch features are not available in browser environments.\n *\n * TODO: Consider refactoring to share code with client.ts using composition or\n * inheritance pattern to reduce duplication (~900 lines shared). Currently kept\n * separate for simplicity and to avoid complex build configurations.\n * See: https://github.com/anthropics/claude-code/issues/xxx (if tracked)\n */\n\n// Browser build uses native WebSocket directly (no isomorphic-ws)\n// This avoids \"Dynamic require of 'ws' is not supported\" errors in ESM bundlers\n\n// Browser global types (avoid adding DOM to tsconfig.json which affects Node.js code)\ndeclare const WebSocket: {\n new (url: string): WebSocket;\n readonly OPEN: number;\n readonly CLOSED: number;\n readonly CONNECTING: number;\n readonly CLOSING: number;\n};\n// eslint-disable-next-line no-redeclare -- intentional: type augmentation for browser WebSocket\ninterface WebSocket {\n readonly readyState: number;\n onopen: ((this: WebSocket, ev: Event) => void) | null;\n onclose: ((this: WebSocket, ev: CloseEvent) => void) | null;\n onerror: ((this: WebSocket, ev: Event) => void) | null;\n onmessage: ((this: WebSocket, ev: MessageEvent) => void) | null;\n send(data: string): void;\n close(code?: number, reason?: string): void;\n}\ninterface CloseEvent extends Event {\n readonly code: number;\n readonly reason: string;\n}\ninterface MessageEvent extends Event {\n readonly data: unknown;\n}\n\nimport type {\n SDKConfig,\n ConnectionInfo,\n ConnectionState,\n ToolDefinition,\n RegisterMessage,\n RegisterAckMessage,\n ToolCallMessage,\n ToolResultMessage,\n HeartbeatMessage,\n SDKEvents,\n SDKEventName,\n AgentConfig,\n AgentInfo,\n AgentUpdateConfig,\n ConversationInfo,\n ConversationDetail,\n CreateAgentMessage,\n CreateAgentAckMessage,\n UpdateAgentMessage,\n UpdateAgentAckMessage,\n ListAgentsMessage,\n ListAgentsAckMessage,\n DeleteAgentMessage,\n DeleteAgentAckMessage,\n ListConversationsMessage,\n ListConversationsAckMessage,\n GetConversationMessage,\n GetConversationAckMessage,\n DeleteConversationMessage,\n DeleteConversationAckMessage,\n ChatMessage,\n ChatResponse,\n ChatRequestMessage,\n ChatResponseMessage,\n ChatStreamMessage,\n ChatStreamEvent,\n LoadItem,\n RemoteToolDefinition,\n HitlResponse,\n HitlResponseMessage,\n HitlInterruptType,\n HitlInterruptPayload,\n ToolCall,\n // Embedding & Rerank Config\n EmbeddingConfigResult,\n GetEmbeddingConfigMessage,\n GetEmbeddingConfigAckMessage,\n RerankConfigResult,\n GetRerankConfigMessage,\n GetRerankConfigAckMessage,\n // Capability Discovery\n Capability,\n ToolCapability,\n SkillCapability,\n AgentCapability,\n CapabilitySearchResult,\n ListCapabilitiesOptions,\n SearchCapabilitiesOptions,\n // Session Resources\n SessionResource,\n StoredSessionResource,\n ResourcePushMessage,\n ResourcePushAckMessage,\n ResourceRemoveMessage,\n ResourceRemoveAckMessage,\n ResourceClearMessage,\n ResourceClearAckMessage,\n ResourceRemovedByUserMessage,\n // Context Provider\n ContextProvider,\n // Channel types\n ChannelPluginInfo,\n ChannelAccount,\n ChannelBinding,\n ChannelStatus,\n ChannelProbeResult,\n CreateChannelAccountRequest,\n UpdateChannelAccountRequest,\n CreateChannelBindingRequest,\n UpdateChannelBindingRequest,\n SendChannelMessageRequest,\n SendChannelMessageResponse,\n} from \"./types\";\nimport { SanqianSDKError, SDKErrorCode, createSDKError } from \"./errors\";\n\ntype EventListener<T extends SDKEventName> = SDKEvents[T];\n\nexport class SanqianSDK {\n private config: SDKConfig;\n private ws: WebSocket | null = null;\n private connectionInfo: ConnectionInfo | null = null;\n\n private state: ConnectionState = {\n connected: false,\n registering: false,\n registered: false,\n reconnectAttempts: 0,\n };\n\n // Tool handlers by name\n private toolHandlers: Map<string, (args: unknown) => Promise<unknown>> =\n new Map();\n\n // Pending request futures\n private pendingRequests: Map<\n string,\n {\n resolve: (value: unknown) => void;\n reject: (error: Error) => void;\n }\n > = new Map();\n\n // Timers\n private heartbeatTimer: ReturnType<typeof setInterval> | null = null;\n private reconnectTimer: ReturnType<typeof setTimeout> | null = null;\n private heartbeatAckPending: boolean = false;\n private missedHeartbeats: number = 0;\n private static readonly MAX_MISSED_HEARTBEATS = 2;\n\n // Connection promise for deduplication\n private connectingPromise: Promise<void> | null = null;\n\n // Reconnect reference count\n private reconnectRefCount: number = 0;\n\n // Event listeners\n private eventListeners: Map<SDKEventName, Set<EventListener<SDKEventName>>> =\n new Map();\n\n // Session resources cache\n private sessionResources: Map<string, StoredSessionResource> = new Map();\n\n // Context providers\n private contextProviders: Map<string, ContextProvider> = new Map();\n\n // Map run_id -> msgId for routing backend messages to correct handler\n private runIdToMsgId: Map<string, string> = new Map();\n // Queue pending stream requests for backend-native \"start\" routing (which has no msgId)\n private pendingStreamRequests: Array<{ msgId: string; conversationId?: string }> = [];\n // Streams requested to cancel before run_id is available\n private pendingCancelMsgIds: Set<string> = new Set();\n // Prevent ambiguous routing when multiple streams target the same conversation.\n private activeStreamConversations: Set<string> = new Set();\n\n private static readonly VALID_SECURITY_LEVELS = new Set([\n \"standard\",\n \"elevated\",\n \"unrestricted\",\n ]);\n\n // ============================================\n // Debug Logging\n // ============================================\n\n private log(...args: unknown[]): void {\n if (this.config.debug) {\n console.log(\"[SDK]\", ...args);\n }\n }\n\n private warn(...args: unknown[]): void {\n if (this.config.debug) {\n console.warn(\"[SDK]\", ...args);\n }\n }\n\n private normalizeRequestedSecurityLevel(level: unknown): SDKConfig[\"requestedSecurityLevel\"] {\n if (level === undefined || level === null) {\n return undefined;\n }\n if (typeof level === \"string\" && SanqianSDK.VALID_SECURITY_LEVELS.has(level)) {\n return level as SDKConfig[\"requestedSecurityLevel\"];\n }\n throw createSDKError(\n SDKErrorCode.INVALID_CONFIG,\n \"requestedSecurityLevel must be one of: standard, elevated, unrestricted\"\n );\n }\n\n private sendRunCancel(runId: string): void {\n const message = {\n type: \"cancel\",\n run_id: runId,\n };\n this.send(message);\n this.log(`Sent cancel for run ${runId}`);\n }\n\n private requestStreamCancel(msgId: string, runId?: string): void {\n if (runId) {\n this.pendingCancelMsgIds.delete(msgId);\n this.sendRunCancel(runId);\n return;\n }\n this.pendingCancelMsgIds.add(msgId);\n }\n\n private reserveConversationStream(conversationId?: string): void {\n if (!conversationId) {\n return;\n }\n if (this.activeStreamConversations.has(conversationId)) {\n throw createSDKError(\n SDKErrorCode.REQUEST_FAILED,\n `Another stream is already active for conversation '${conversationId}'. Wait for it to finish before starting a new one.`\n );\n }\n this.activeStreamConversations.add(conversationId);\n }\n\n private releaseConversationStream(conversationId?: string): void {\n if (!conversationId) {\n return;\n }\n this.activeStreamConversations.delete(conversationId);\n }\n\n private failPendingStreamStarts(reason: string): void {\n const error = createSDKError(SDKErrorCode.REQUEST_FAILED, reason);\n const pending = [...this.pendingStreamRequests];\n this.pendingStreamRequests = [];\n for (const request of pending) {\n const handler = this.streamHandlers.get(request.msgId);\n handler?.onError(error);\n }\n }\n\n private resolvePendingStartIndex(\n message: { payload?: { request_id?: string; session_id?: string } }\n ): number {\n const requestId = message.payload?.request_id;\n if (requestId) {\n return this.pendingStreamRequests.findIndex((item) => item.msgId === requestId);\n }\n\n const sessionId = message.payload?.session_id;\n if (sessionId) {\n const exactMatchIndex = this.pendingStreamRequests.findIndex(\n (item) => item.conversationId === sessionId\n );\n if (exactMatchIndex >= 0) {\n return exactMatchIndex;\n }\n }\n\n if (this.pendingStreamRequests.length <= 1) {\n return this.pendingStreamRequests.length - 1;\n }\n\n const unboundIndexes: number[] = [];\n this.pendingStreamRequests.forEach((item, index) => {\n if (!item.conversationId) {\n unboundIndexes.push(index);\n }\n });\n\n if (unboundIndexes.length === this.pendingStreamRequests.length) {\n // Legacy backend mode: no correlation key available, keep request-order routing.\n return 0;\n }\n if (unboundIndexes.length === 1) {\n // Prefer the only unbound request (common when backend remaps new conversation IDs).\n return unboundIndexes[0];\n }\n return -1;\n }\n\n constructor(config: SDKConfig) {\n // Browser build REQUIRES connectionInfo\n if (!config.connectionInfo) {\n throw new SanqianSDKError(\n SDKErrorCode.NOT_RUNNING,\n \"Browser build requires connectionInfo in config. \" +\n \"Use the Node.js build for auto-discovery, or provide connectionInfo manually.\"\n );\n }\n\n const requestedSecurityLevel = this.normalizeRequestedSecurityLevel(\n (config as { requestedSecurityLevel?: unknown }).requestedSecurityLevel\n );\n\n this.config = {\n reconnectInterval: 5000,\n heartbeatInterval: 30000,\n toolExecutionTimeout: 30000,\n debug: false,\n autoLaunchSanqian: false, // Not supported in browser\n ...config,\n requestedSecurityLevel,\n };\n\n // Register tool handlers\n for (const tool of config.tools) {\n this.toolHandlers.set(tool.name, tool.handler);\n }\n }\n\n /**\n * Build WebSocket URL from connection info\n */\n private buildWebSocketUrl(info: ConnectionInfo): string {\n const wsPath = info.ws_path || \"/ws/apps\";\n const protocol = info.ws_protocol || \"ws\";\n const host = info.ws_host || \"127.0.0.1\";\n return `${protocol}://${host}:${info.port}${wsPath}?token=${info.token}`;\n }\n\n // ============================================\n // Lifecycle\n // ============================================\n\n async connect(): Promise<void> {\n return this.ensureReady();\n }\n\n private async connectWithInfo(info: ConnectionInfo): Promise<void> {\n this.connectionInfo = info;\n const url = this.buildWebSocketUrl(info);\n\n return new Promise((resolve, reject) => {\n this.log(`Connecting to ${url.replace(/[?&]token=[^&]+/, (m) => m[0] + 'token=***')}`);\n\n this.ws = new WebSocket(url);\n\n const connectTimeout = setTimeout(() => {\n reject(createSDKError(SDKErrorCode.CONNECTION_TIMEOUT));\n this.ws?.close();\n }, 10000);\n\n this.ws.onopen = async () => {\n clearTimeout(connectTimeout);\n this.log(\"WebSocket connected\");\n this.state.connected = true;\n this.state.reconnectAttempts = 0;\n this.emit(\"connected\");\n\n try {\n await this.register();\n resolve();\n } catch (e) {\n reject(e);\n }\n };\n\n this.ws.onclose = (event: CloseEvent) => {\n const reason = event.reason || \"\";\n this.log(`WebSocket closed: ${event.code} ${reason}`);\n this.handleDisconnect(reason);\n };\n\n this.ws.onerror = (event: Event) => {\n // Browser Event may not expose details, but preserve event.error when available\n const error = (event as Event & { error?: Error }).error || new Error(\"WebSocket error\");\n console.error(\"[SDK] WebSocket error:\", error);\n this.state.lastError = error;\n this.emit(\"error\", error);\n };\n\n this.ws.onmessage = (event: MessageEvent) => {\n try {\n // In browser, event.data is always string for text messages\n const message = JSON.parse(event.data as string);\n this.handleMessage(message);\n } catch (e) {\n this.warn(\"Failed to parse message:\", e);\n }\n };\n });\n }\n\n async disconnect(): Promise<void> {\n this.stopHeartbeat();\n this.stopReconnect();\n\n if (this.ws) {\n this.ws.close(1000, \"Client disconnect\");\n this.ws = null;\n }\n\n this.state = {\n connected: false,\n registering: false,\n registered: false,\n reconnectAttempts: 0,\n };\n }\n\n // ============================================\n // Registration\n // ============================================\n\n private async register(): Promise<void> {\n this.state.registering = true;\n\n const msgId = this.generateId();\n\n const message: RegisterMessage = {\n id: msgId,\n type: \"register\",\n app: {\n name: this.config.appName,\n version: this.config.appVersion,\n display_name: this.config.displayName,\n launch_command: this.config.launchCommand,\n metadata: this.config.metadata,\n ...(this.config.requestedSecurityLevel\n ? { requested_security_level: this.config.requestedSecurityLevel }\n : {}),\n },\n tools: this.config.tools.map((t) => ({\n name: `${this.config.appName}:${t.name}`,\n description: t.description,\n parameters: t.parameters,\n searchable: t.searchable ?? true,\n })),\n };\n\n try {\n const response = await this.sendAndWait<RegisterAckMessage>(\n message,\n msgId,\n 10000\n );\n\n if (!response.success) {\n throw createSDKError(SDKErrorCode.REGISTRATION_FAILED, response.error);\n }\n\n this.state.registering = false;\n this.state.registered = true;\n this.state.securityLevel = response.security_level;\n this.startHeartbeat();\n this.emit(\"registered\");\n\n this.log(\n `Registered as '${this.config.appName}' (security_level: ${response.security_level || \"standard\"})`\n );\n } catch (e) {\n this.state.registering = false;\n throw e;\n }\n }\n\n // ============================================\n // Message Handling\n // ============================================\n\n private handleMessage(message: {\n id?: string;\n type: string;\n [key: string]: unknown;\n }): void {\n const { id, type } = message;\n\n if (id && this.pendingRequests.has(id)) {\n const pending = this.pendingRequests.get(id)!;\n this.pendingRequests.delete(id);\n pending.resolve(message);\n return;\n }\n\n switch (type) {\n case \"tool_call\":\n this.handleToolCall(message as unknown as ToolCallMessage);\n break;\n\n case \"heartbeat_ack\":\n this.heartbeatAckPending = false;\n this.missedHeartbeats = 0;\n break;\n\n case \"chat_stream\":\n this.handleChatStream(message as unknown as ChatStreamMessage);\n break;\n\n case \"start\":\n // Handle start message (backend native format)\n this.handleBackendStart(\n message as { payload?: { run_id?: string; session_id?: string; request_id?: string } }\n );\n break;\n\n case \"stream\":\n // Handle stream message (backend native format for text content)\n this.handleBackendStream(message as { run_id?: string; content?: string });\n break;\n\n case \"thinking\":\n // Handle thinking message (backend native format)\n this.handleBackendThinking(message as { run_id?: string; content?: string });\n break;\n\n case \"tool_start\":\n // Handle tool_start message (backend native format)\n this.handleBackendToolStart(message as { run_id?: string; tool_call?: ToolCall });\n break;\n\n case \"tool_args_chunk\":\n // Handle tool_args_chunk message (backend native format)\n this.handleBackendToolArgsChunk(message as { run_id?: string; tool_call_id?: string; tool_name?: string; chunk?: string });\n break;\n\n case \"tool_result\":\n // Handle tool_result message (backend native format)\n this.handleBackendToolResult(message as { run_id?: string; tool_call_id?: string; result?: unknown; success?: boolean; error?: string });\n break;\n\n case \"complete\":\n // Handle complete message (backend native format)\n this.handleBackendComplete(message as { run_id?: string; conversation_id?: string; title?: string; content?: string });\n break;\n\n case \"error\":\n // Handle error message (backend native format)\n this.handleBackendError(message as { run_id?: string; error?: string; message?: string });\n break;\n\n case \"cancelled\":\n // Handle cancelled message (backend native format)\n this.handleBackendCancelled(message as { run_id?: string });\n break;\n\n case \"interrupt\":\n // Handle interrupt/HITL message (backend native format)\n this.handleBackendInterrupt(message as { run_id?: string; interrupt_type?: string; interrupt_payload?: unknown });\n break;\n\n case \"resource_removed_by_user\":\n this.handleResourceRemovedByUser(message as unknown as ResourceRemovedByUserMessage);\n break;\n\n default:\n this.warn(`Unknown message type: ${type}`);\n }\n }\n\n private handleChatStream(message: ChatStreamMessage): void {\n const {\n id,\n event,\n content,\n tool_call,\n tool_result,\n conversation_id,\n title,\n usage,\n error,\n } = message;\n\n if (!id) return;\n\n const handler = this.streamHandlers.get(id);\n if (!handler) {\n this.warn(`No stream handler for message ${id}`);\n return;\n }\n\n switch (event) {\n case \"start\":\n handler.onEvent({\n type: \"start\",\n run_id: message.run_id,\n conversationId: conversation_id || \"\",\n });\n break;\n\n case \"text\":\n handler.onEvent({ type: \"text\", content });\n break;\n\n case \"thinking\":\n // Reasoning content from thinking models (DeepSeek R1, o3, etc.)\n handler.onEvent({ type: \"thinking\", content });\n break;\n\n case \"tool_call\":\n handler.onEvent({ type: \"tool_call\", tool_call });\n break;\n\n case \"tool_result\":\n // Forward tool_result as proper event (not disguised as tool_call)\n if (tool_result) {\n handler.onEvent({\n type: \"tool_result\",\n tool_call_id: tool_result.call_id,\n result: tool_result.result,\n success: tool_result.success,\n error: tool_result.error,\n });\n } else {\n this.log(\"Received tool_result event without tool_result data\");\n }\n break;\n\n case \"done\":\n handler.onDone({\n message: message.message || { role: \"assistant\", content: \"\" },\n conversationId: conversation_id || \"\",\n title,\n usage,\n });\n break;\n\n case \"error\":\n handler.onError(new Error(error || \"Unknown stream error\"));\n break;\n\n case \"interrupt\":\n // HITL interrupt - user input required to continue\n handler.onEvent({\n type: \"interrupt\",\n interrupt_type: message.interrupt_type,\n interrupt_payload: message.interrupt_payload,\n run_id: message.run_id,\n });\n break;\n\n case \"cancelled\":\n handler.onEvent({ type: \"cancelled\", run_id: message.run_id });\n break;\n }\n }\n\n private handleResourceRemovedByUser(message: ResourceRemovedByUserMessage): void {\n const { resourceId } = message;\n this.sessionResources.delete(resourceId);\n this.emit(\"resourceRemoved\", resourceId);\n this.log(`Resource removed by user: ${resourceId}`);\n }\n\n // ============================================\n // Backend Native Message Handlers\n // ============================================\n\n private getHandlerByRunId(runId?: string): ReturnType<typeof this.streamHandlers.get> | undefined {\n if (!runId) return undefined;\n const msgId = this.runIdToMsgId.get(runId);\n if (msgId) {\n return this.streamHandlers.get(msgId);\n }\n return undefined;\n }\n\n private handleBackendStart(\n message: { payload?: { run_id?: string; session_id?: string; request_id?: string } }\n ): void {\n const runId = message.payload?.run_id;\n if (!runId) {\n this.warn(\"Received start message without run_id\");\n return;\n }\n\n const pendingIndex = this.resolvePendingStartIndex(message);\n const pending = this.pendingStreamRequests[pendingIndex];\n if (!pending) {\n if (this.pendingStreamRequests.length > 0) {\n this.failPendingStreamStarts(\n \"Unable to correlate stream start event. Retry with a single active stream, or use a backend that echoes request_id in start payload.\"\n );\n } else {\n this.warn(\"Received start message but no pending stream handler\");\n }\n return;\n }\n this.pendingStreamRequests.splice(pendingIndex, 1);\n\n const pendingMsgId = pending.msgId;\n\n this.runIdToMsgId.set(runId, pendingMsgId);\n const handler = this.streamHandlers.get(pendingMsgId);\n if (handler) {\n handler.onEvent({\n type: \"start\",\n run_id: runId,\n conversationId: message.payload?.session_id || \"\",\n });\n }\n\n if (this.pendingCancelMsgIds.has(pendingMsgId)) {\n try {\n this.requestStreamCancel(pendingMsgId, runId);\n } catch (e) {\n this.warn(\"Failed to send queued cancel for run\", runId, e);\n }\n }\n }\n\n private handleBackendStream(message: { run_id?: string; content?: string }): void {\n const handler = this.getHandlerByRunId(message.run_id);\n if (handler) {\n handler.onEvent({ type: \"text\", content: message.content });\n }\n }\n\n private handleBackendThinking(message: { run_id?: string; content?: string }): void {\n const handler = this.getHandlerByRunId(message.run_id);\n if (handler) {\n handler.onEvent({ type: \"thinking\", content: message.content });\n }\n }\n\n private handleBackendToolStart(message: { run_id?: string; tool_call?: ToolCall }): void {\n const handler = this.getHandlerByRunId(message.run_id);\n if (handler && message.tool_call) {\n handler.onEvent({ type: \"tool_call\", tool_call: message.tool_call });\n }\n }\n\n private handleBackendToolArgsChunk(message: { run_id?: string; tool_call_id?: string; tool_name?: string; chunk?: string }): void {\n const handler = this.getHandlerByRunId(message.run_id);\n if (handler) {\n handler.onEvent({\n type: \"tool_args_chunk\",\n tool_call_id: message.tool_call_id,\n tool_name: message.tool_name,\n chunk: message.chunk,\n });\n }\n }\n\n private handleBackendToolResult(message: { run_id?: string; tool_call_id?: string; result?: unknown; success?: boolean; error?: string }): void {\n const handler = this.getHandlerByRunId(message.run_id);\n if (handler) {\n handler.onEvent({\n type: \"tool_result\",\n tool_call_id: message.tool_call_id,\n result: message.result,\n success: message.success,\n error: message.error,\n });\n }\n }\n\n private handleBackendComplete(message: { run_id?: string; conversation_id?: string; title?: string; content?: string }): void {\n const handler = this.getHandlerByRunId(message.run_id);\n if (handler) {\n handler.onDone({\n message: { role: \"assistant\", content: message.content || \"\" },\n conversationId: message.conversation_id || \"\",\n title: message.title,\n });\n }\n }\n\n private handleBackendError(message: { run_id?: string; error?: string; message?: string }): void {\n const handler = this.getHandlerByRunId(message.run_id);\n if (handler) {\n handler.onError(new Error(message.error || message.message || \"Unknown error\"));\n }\n }\n\n private handleBackendCancelled(message: { run_id?: string }): void {\n const handler = this.getHandlerByRunId(message.run_id);\n if (handler) {\n handler.onEvent({ type: \"cancelled\", run_id: message.run_id });\n }\n }\n\n private handleBackendInterrupt(message: { run_id?: string; interrupt_type?: string; interrupt_payload?: unknown }): void {\n const handler = this.getHandlerByRunId(message.run_id);\n if (handler) {\n // Validate interrupt_type to catch unexpected values from backend\n const validTypes: HitlInterruptType[] = [\"approval_request\", \"user_input_request\", \"user_action_request\"];\n const interruptType = message.interrupt_type as HitlInterruptType;\n if (message.interrupt_type && !validTypes.includes(interruptType)) {\n this.log(`Warning: Unknown interrupt_type '${message.interrupt_type}', proceeding anyway`);\n }\n\n handler.onEvent({\n type: \"interrupt\",\n interrupt_type: interruptType,\n interrupt_payload: message.interrupt_payload as HitlInterruptPayload,\n run_id: message.run_id,\n });\n }\n }\n\n private async handleToolCall(message: ToolCallMessage): Promise<void> {\n this.log(`handleToolCall received:`, JSON.stringify(message));\n const { id, call_id, name, arguments: args } = message;\n const msgId = id || call_id;\n\n const toolName = name.includes(\":\") ? name.split(\":\")[1] : name;\n this.log(\n `Looking for handler: '${toolName}', available handlers:`,\n Array.from(this.toolHandlers.keys())\n );\n const handler = this.toolHandlers.get(toolName);\n\n this.emit(\"tool_call\", { name: toolName, arguments: args });\n\n if (!handler) {\n await this.sendToolResult(\n msgId,\n call_id,\n false,\n undefined,\n `Tool '${toolName}' not found`\n );\n return;\n }\n\n try {\n this.log(`Executing tool '${toolName}' with args:`, args);\n const result = await Promise.race([\n handler(args),\n this.createTimeout(this.config.toolExecutionTimeout!),\n ]);\n\n this.log(`Tool '${toolName}' completed successfully`);\n await this.sendToolResult(msgId, call_id, true, result);\n } catch (e) {\n const errorMessage = e instanceof Error ? e.message : String(e);\n const errorStack = e instanceof Error ? e.stack : undefined;\n this.log(`Tool '${toolName}' failed:`, errorMessage);\n if (errorStack) {\n this.log(`Tool error stack:`, errorStack);\n }\n await this.sendToolResult(msgId, call_id, false, undefined, errorMessage);\n }\n }\n\n private async sendToolResult(\n id: string,\n callId: string,\n success: boolean,\n result?: unknown,\n error?: string\n ): Promise<void> {\n const message: ToolResultMessage = {\n id,\n type: \"tool_result\",\n call_id: callId,\n success,\n result,\n error,\n };\n\n this.log(\n `Sending tool_result for ${callId}:`,\n success ? \"success\" : `error: ${error}`\n );\n this.send(message);\n }\n\n // ============================================\n // Connection Management\n // ============================================\n\n private handleDisconnect(reason: string): void {\n this.stopHeartbeat();\n this.state.connected = false;\n this.state.registered = false;\n this.emit(\"disconnected\", reason);\n\n for (const [, pending] of this.pendingRequests) {\n pending.reject(createSDKError(SDKErrorCode.DISCONNECTED));\n }\n this.pendingRequests.clear();\n\n const disconnectError = createSDKError(SDKErrorCode.DISCONNECTED, reason);\n for (const [, handler] of this.streamHandlers) {\n handler.onError(disconnectError);\n }\n this.streamHandlers.clear();\n this.runIdToMsgId.clear();\n this.pendingStreamRequests = [];\n this.pendingCancelMsgIds.clear();\n this.activeStreamConversations.clear();\n\n if (reason === \"Client disconnect\") {\n this.log(\"Client disconnected intentionally, skipping auto-reconnect\");\n return;\n }\n\n if (reason === \"Replaced by new connection\") {\n this.log(\"Connection replaced by newer one, skipping auto-reconnect\");\n return;\n }\n\n if (this.connectingPromise) {\n this.log(\n \"Connection attempt already in progress, skipping auto-reconnect\"\n );\n return;\n }\n\n if (!this.shouldAutoReconnect()) {\n this.log(\n \"No components require reconnection (refCount=0), skipping auto-reconnect\"\n );\n return;\n }\n\n this.scheduleReconnect();\n }\n\n private shouldAutoReconnect(): boolean {\n return this.reconnectRefCount > 0;\n }\n\n acquireReconnect(): void {\n this.reconnectRefCount++;\n this.log(`acquireReconnect: refCount=${this.reconnectRefCount}`);\n }\n\n releaseReconnect(): void {\n this.reconnectRefCount = Math.max(0, this.reconnectRefCount - 1);\n this.log(`releaseReconnect: refCount=${this.reconnectRefCount}`);\n }\n\n private scheduleReconnect(): void {\n if (this.reconnectTimer) return;\n\n const baseDelay = Math.min(\n 500 * Math.pow(2, this.state.reconnectAttempts),\n 5000\n );\n const jitter = Math.random() * 500;\n const delay = baseDelay + jitter;\n\n this.log(\n `Scheduling reconnect in ${Math.round(delay)}ms (attempt ${this.state.reconnectAttempts + 1})`\n );\n\n this.reconnectTimer = setTimeout(async () => {\n this.reconnectTimer = null;\n this.state.reconnectAttempts++;\n\n try {\n await this.ensureReady();\n } catch (e) {\n console.error(\"[SDK] Reconnect failed:\", e);\n if (!this.isConnected()) {\n this.scheduleReconnect();\n }\n }\n }, delay);\n }\n\n private stopReconnect(): void {\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n }\n }\n\n // ============================================\n // Heartbeat\n // ============================================\n\n private startHeartbeat(): void {\n this.stopHeartbeat();\n this.missedHeartbeats = 0;\n this.heartbeatAckPending = false;\n\n this.heartbeatTimer = setInterval(() => {\n if (this.heartbeatAckPending) {\n this.missedHeartbeats++;\n this.warn(\n `Missed heartbeat ack (${this.missedHeartbeats}/${SanqianSDK.MAX_MISSED_HEARTBEATS})`\n );\n\n if (this.missedHeartbeats >= SanqianSDK.MAX_MISSED_HEARTBEATS) {\n this.warn(\"Too many missed heartbeat acks, connection may be dead\");\n this.ws?.close(4000, \"Heartbeat timeout\");\n return;\n }\n }\n\n const message: HeartbeatMessage = {\n type: \"heartbeat\",\n timestamp: new Date().toISOString(),\n };\n this.heartbeatAckPending = true;\n try {\n this.send(message);\n } catch (e) {\n console.error(\"[SDK] Heartbeat send failed:\", e);\n this.ws?.close(4000, \"Heartbeat send failed\");\n }\n }, this.config.heartbeatInterval);\n }\n\n private stopHeartbeat(): void {\n if (this.heartbeatTimer) {\n clearInterval(this.heartbeatTimer);\n this.heartbeatTimer = null;\n }\n }\n\n // ============================================\n // Communication\n // ============================================\n\n private send(message: object): void {\n if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {\n const error = new Error(\n `WebSocket not open (state: ${this.ws?.readyState ?? \"null\"}), cannot send message`\n );\n console.error(`[SDK] ${error.message}:`, message);\n throw error;\n }\n\n const data = JSON.stringify(message);\n this.log(`WebSocket send:`, data.substring(0, 200));\n this.ws.send(data);\n }\n\n private sendAndWait<T>(\n message: object,\n id: string,\n timeout: number\n ): Promise<T> {\n return new Promise((resolve, reject) => {\n const timer = setTimeout(() => {\n this.pendingRequests.delete(id);\n reject(createSDKError(SDKErrorCode.REQUEST_TIMEOUT));\n }, timeout);\n\n this.pendingRequests.set(id, {\n resolve: (value) => {\n clearTimeout(timer);\n resolve(value as T);\n },\n reject: (error) => {\n clearTimeout(timer);\n reject(error);\n },\n });\n\n try {\n this.send(message);\n } catch (e) {\n clearTimeout(timer);\n this.pendingRequests.delete(id);\n reject(e);\n }\n });\n }\n\n // ============================================\n // Public API\n // ============================================\n\n getState(): ConnectionState {\n return { ...this.state };\n }\n\n isConnected(): boolean {\n return this.state.connected && this.state.registered;\n }\n\n async ensureReady(): Promise<void> {\n if (this.isConnected()) {\n return;\n }\n\n if (this.connectingPromise) {\n this.log(\"Connection already in progress, waiting...\");\n return this.connectingPromise;\n }\n\n this.connectingPromise = this.doFullConnect();\n\n try {\n await this.connectingPromise;\n } finally {\n this.connectingPromise = null;\n }\n }\n\n private async doFullConnect(): Promise<void> {\n this.log(\"Starting connection (browser mode)...\");\n\n // Browser mode: always use pre-configured connectionInfo\n const info = this.config.connectionInfo!;\n await this.connectWithInfo(info);\n }\n\n async updateTools(tools: ToolDefinition[]): Promise<void> {\n this.toolHandlers.clear();\n for (const tool of tools) {\n this.toolHandlers.set(tool.name, tool.handler);\n }\n\n if (this.isConnected()) {\n const msgId = this.generateId();\n const message = {\n id: msgId,\n type: \"tools_update\",\n tools: tools.map((t) => ({\n name: `${this.config.appName}:${t.name}`,\n description: t.description,\n parameters: t.parameters,\n searchable: t.searchable ?? true,\n })),\n };\n\n await this.sendAndWait(message, msgId, 5000);\n }\n }\n\n // ============================================\n // Private Agent API\n // ============================================\n\n async createAgent(config: AgentConfig): Promise<AgentInfo> {\n await this.ensureReady();\n\n const msgId = this.generateId();\n const message: CreateAgentMessage = {\n id: msgId,\n type: \"create_agent\",\n agent: config,\n };\n\n const response = await this.sendAndWait<CreateAgentAckMessage>(\n message,\n msgId,\n 10000\n );\n\n if (!response.success) {\n throw createSDKError(SDKErrorCode.AGENT_NOT_FOUND, response.error);\n }\n\n if (response.agent) {\n return response.agent;\n }\n\n return {\n agent_id: response.agent_id!,\n name: config.name,\n description: config.description,\n tools: config.tools || [],\n skills: config.skills || [],\n };\n }\n\n async listAgents(): Promise<AgentInfo[]> {\n await this.ensureReady();\n\n const msgId = this.generateId();\n const message: ListAgentsMessage = {\n id: msgId,\n type: \"list_agents\",\n };\n\n const response = await this.sendAndWait<ListAgentsAckMessage>(\n message,\n msgId,\n 10000\n );\n\n if (response.error) {\n throw new Error(response.error);\n }\n\n return response.agents;\n }\n\n async deleteAgent(agentId: string): Promise<void> {\n await this.ensureReady();\n\n const msgId = this.generateId();\n const message: DeleteAgentMessage = {\n id: msgId,\n type: \"delete_agent\",\n agent_id: agentId,\n };\n\n const response = await this.sendAndWait<DeleteAgentAckMessage>(\n message,\n msgId,\n 10000\n );\n\n if (!response.success) {\n throw createSDKError(SDKErrorCode.AGENT_NOT_FOUND, response.error);\n }\n }\n\n async updateAgent(\n agentId: string,\n updates: Omit<AgentUpdateConfig, \"agent_id\">\n ): Promise<AgentInfo> {\n await this.ensureReady();\n\n const msgId = this.generateId();\n const message: UpdateAgentMessage = {\n id: msgId,\n type: \"update_agent\",\n agent_id: agentId,\n updates,\n };\n\n const response = await this.sendAndWait<UpdateAgentAckMessage>(\n message,\n msgId,\n 10000\n );\n\n if (!response.success || !response.agent) {\n throw createSDKError(SDKErrorCode.AGENT_NOT_FOUND, response.error);\n }\n\n return response.agent;\n }\n\n // ============================================\n // Conversation API\n // ============================================\n\n async listConversations(options?: {\n agentId?: string;\n limit?: number;\n offset?: number;\n }): Promise<{ conversations: ConversationInfo[]; total: number }> {\n await this.ensureReady();\n\n const msgId = this.generateId();\n const message: ListConversationsMessage = {\n id: msgId,\n type: \"list_conversations\",\n agent_id: options?.agentId,\n limit: options?.limit,\n offset: options?.offset,\n };\n\n const response = await this.sendAndWait<ListConversationsAckMessage>(\n message,\n msgId,\n 10000\n );\n\n if (response.error) {\n throw new Error(response.error);\n }\n\n return {\n conversations: response.conversations,\n total: response.total,\n };\n }\n\n private getHttpBaseUrl(): string {\n const info = this.connectionInfo || this.config.connectionInfo;\n if (!info) {\n throw new Error(\"Connection info not available\");\n }\n const protocol = info.ws_protocol === \"wss\" ? \"https\" : \"http\";\n const host = info.ws_host || \"127.0.0.1\";\n return `${protocol}://${host}:${info.port}`;\n }\n\n private getHttpAuthHeaders(): Record<string, string> {\n const info = this.connectionInfo || this.config.connectionInfo;\n const token = info?.token;\n return token ? { \"X-App-Token\": token } : {};\n }\n\n /**\n * Get the port number for the Sanqian backend\n * @throws Error if not connected\n */\n getPort(): number {\n const info = this.connectionInfo || this.config.connectionInfo;\n if (!info) {\n throw new Error(\"Connection info not available\");\n }\n return info.port;\n }\n\n /**\n * Get conversation messages via history API (aligned with main app history)\n */\n async getMessages(\n conversationId: string,\n options?: { limit?: number; offset?: number }\n ): Promise<import(\"./types\").ConversationHistoryResult> {\n await this.ensureReady();\n\n const params = new URLSearchParams({ session_id: conversationId });\n if (options?.limit !== undefined) params.append(\"limit\", String(options.limit));\n if (options?.offset !== undefined) params.append(\"offset\", String(options.offset));\n\n const url = `${this.getHttpBaseUrl()}/api/sdk/history?${params.toString()}`;\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`Failed to fetch messages: ${response.statusText}`);\n }\n return (await response.json()) as import(\"./types\").ConversationHistoryResult;\n }\n\n async getConversation(\n conversationId: string,\n options?: {\n includeMessages?: boolean;\n messageLimit?: number;\n messageOffset?: number;\n }\n ): Promise<ConversationDetail> {\n await this.ensureReady();\n\n const msgId = this.generateId();\n const message: GetConversationMessage = {\n id: msgId,\n type: \"get_conversation\",\n conversation_id: conversationId,\n include_messages: options?.includeMessages ?? true,\n message_limit: options?.messageLimit,\n message_offset: options?.messageOffset,\n };\n\n const response = await this.sendAndWait<GetConversationAckMessage>(\n message,\n msgId,\n 10000\n );\n\n if (!response.success || !response.conversation) {\n throw createSDKError(SDKErrorCode.CONVERSATION_NOT_FOUND, response.error);\n }\n\n return response.conversation;\n }\n\n async deleteConversation(conversationId: string): Promise<void> {\n await this.ensureReady();\n\n const msgId = this.generateId();\n const message: DeleteConversationMessage = {\n id: msgId,\n type: \"delete_conversation\",\n conversation_id: conversationId,\n };\n\n const response = await this.sendAndWait<DeleteConversationAckMessage>(\n message,\n msgId,\n 10000\n );\n\n if (!response.success) {\n throw createSDKError(SDKErrorCode.CONVERSATION_NOT_FOUND, response.error);\n }\n }\n\n // ============================================\n // Chat API\n // ============================================\n\n private streamHandlers: Map<\n string,\n {\n onEvent: (event: ChatStreamEvent) => void;\n onDone: (response: ChatResponse) => void;\n onError: (error: Error) => void;\n }\n > = new Map();\n\n async chat(\n agentId: string,\n messages: ChatMessage[],\n options?: {\n conversationId?: string;\n remoteTools?: RemoteToolDefinition[];\n autoDiscoverSkills?: boolean;\n autoDiscoverTools?: boolean;\n autoDiscoverSubagents?: boolean;\n persistHistory?: boolean;\n filePaths?: string[];\n loadItems?: LoadItem[];\n mentionedTools?: string[];\n }\n ): Promise<ChatResponse> {\n await this.ensureReady();\n\n const msgId = this.generateId();\n const message: ChatRequestMessage = {\n id: msgId,\n type: \"chat\",\n request_id: msgId,\n agent_id: agentId,\n messages,\n conversation_id: options?.conversationId,\n stream: false,\n persist_history: options?.persistHistory ?? false,\n auto_discover_skills: options?.autoDiscoverSkills ?? false,\n auto_discover_tools: options?.autoDiscoverTools ?? false,\n auto_discover_subagents: options?.autoDiscoverSubagents ?? false,\n file_paths: options?.filePaths,\n load_items: options?.loadItems,\n mentioned_tools: options?.mentionedTools,\n remote_tools: options?.remoteTools?.map((t) => ({\n name: t.name,\n description: t.description,\n parameters: t.parameters,\n })),\n };\n\n const response = await this.sendAndWait<ChatResponseMessage>(\n message,\n msgId,\n 600000\n );\n\n if (!response.success) {\n const errorLower = (response.error || \"\").toLowerCase();\n if (errorLower.includes(\"agent\") && errorLower.includes(\"not found\")) {\n throw createSDKError(SDKErrorCode.AGENT_NOT_FOUND, response.error);\n }\n throw createSDKError(SDKErrorCode.REQUEST_FAILED, response.error);\n }\n\n return {\n message: response.message!,\n conversationId: response.conversation_id || \"\",\n title: response.title,\n usage: response.usage,\n };\n }\n\n async *chatStream(\n agentId: string,\n messages: ChatMessage[],\n options?: {\n conversationId?: string;\n remoteTools?: RemoteToolDefinition[];\n autoDiscoverSkills?: boolean;\n autoDiscoverTools?: boolean;\n autoDiscoverSubagents?: boolean;\n persistHistory?: boolean;\n attachedContexts?: string[];\n attachedResources?: string[];\n sessionResources?: string[];\n filePaths?: string[];\n loadItems?: LoadItem[];\n mentionedTools?: string[];\n signal?: AbortSignal;\n }\n ): AsyncGenerator<ChatStreamEvent> {\n await this.ensureReady();\n\n const msgId = this.generateId();\n const message: ChatRequestMessage = {\n id: msgId,\n type: \"chat\",\n request_id: msgId,\n agent_id: agentId,\n messages,\n conversation_id: options?.conversationId,\n stream: true,\n persist_history: options?.persistHistory ?? false,\n auto_discover_skills: options?.autoDiscoverSkills ?? false,\n auto_discover_tools: options?.autoDiscoverTools ?? false,\n auto_discover_subagents: options?.autoDiscoverSubagents ?? false,\n attached_contexts: options?.attachedContexts,\n attached_resources: options?.attachedResources,\n session_resources: options?.sessionResources,\n file_paths: options?.filePaths,\n load_items: options?.loadItems,\n mentioned_tools: options?.mentionedTools,\n remote_tools: options?.remoteTools?.map((t) => ({\n name: t.name,\n description: t.description,\n parameters: t.parameters,\n })),\n };\n\n const eventQueue: ChatStreamEvent[] = [];\n let done = false;\n let error: Error | null = null;\n let resolveNext: (() => void) | null = null;\n let activeRunId: string | undefined;\n\n if (options?.signal?.aborted) {\n throw createSDKError(\n SDKErrorCode.REQUEST_FAILED,\n \"Chat stream aborted before request was sent\"\n );\n }\n\n const handleAbort = () => {\n try {\n this.requestStreamCancel(msgId, activeRunId);\n } catch (e) {\n error = e instanceof Error ? e : new Error(String(e));\n resolveNext?.();\n }\n };\n\n this.reserveConversationStream(options?.conversationId);\n options?.signal?.addEventListener(\"abort\", handleAbort, { once: true });\n\n this.streamHandlers.set(msgId, {\n onEvent: (event) => {\n eventQueue.push(event);\n if (event.type === \"start\") {\n activeRunId = event.run_id;\n this.pendingStreamRequests = this.pendingStreamRequests.filter((item) => item.msgId !== msgId);\n if (this.pendingCancelMsgIds.has(msgId)) {\n try {\n this.requestStreamCancel(msgId, activeRunId);\n } catch (e) {\n error = e instanceof Error ? e : new Error(String(e));\n }\n }\n }\n if (event.type === \"cancelled\") {\n done = true;\n }\n resolveNext?.();\n },\n onDone: (response) => {\n eventQueue.push({\n type: \"done\",\n conversationId: response.conversationId,\n title: response.title,\n });\n done = true;\n resolveNext?.();\n },\n onError: (e) => {\n error = e;\n resolveNext?.();\n },\n });\n\n try {\n // Track pending stream for backend-native start routing (start has no msgId)\n this.pendingStreamRequests.push({\n msgId,\n conversationId: options?.conversationId,\n });\n\n this.send(message);\n\n while (!done && !error) {\n if (eventQueue.length > 0) {\n yield eventQueue.shift()!;\n } else {\n await new Promise<void>((resolve) => {\n resolveNext = resolve;\n });\n resolveNext = null;\n }\n }\n\n while (eventQueue.length > 0) {\n yield eventQueue.shift()!;\n }\n\n if (error) {\n throw error;\n }\n } finally {\n options?.signal?.removeEventListener(\"abort\", handleAbort);\n this.streamHandlers.delete(msgId);\n this.pendingStreamRequests = this.pendingStreamRequests.filter((item) => item.msgId !== msgId);\n this.pendingCancelMsgIds.delete(msgId);\n this.releaseConversationStream(options?.conversationId);\n // Clean up run_id -> msgId mapping\n for (const [runId, id] of this.runIdToMsgId) {\n if (id === msgId) {\n this.runIdToMsgId.delete(runId);\n }\n }\n }\n }\n\n /**\n * Send HITL (Human-in-the-Loop) response to resume after interrupt\n *\n * Call this after receiving an \"interrupt\" event in chatStream.\n *\n * @param runId - The run_id from the interrupt event\n * @param response - User's response (approval, input, etc.)\n */\n sendHitlResponse(runId: string, response: HitlResponse): void {\n if (!this.state.connected) {\n throw createSDKError(SDKErrorCode.DISCONNECTED, \"Not connected to Sanqian\");\n }\n\n const message: HitlResponseMessage = {\n type: \"hitl_response\",\n run_id: runId,\n response,\n };\n\n this.send(message);\n this.log(`Sent HITL response for run ${runId}`);\n }\n\n /**\n * Cancel an in-flight chat run\n *\n * @param runId - The run_id from the stream \"start\"/\"interrupt\" event\n */\n cancelRun(runId: string): void {\n if (!this.state.connected) {\n throw createSDKError(SDKErrorCode.DISCONNECTED, \"Not connected to Sanqian\");\n }\n this.sendRunCancel(runId);\n }\n\n startConversation(agentId: string): Conversation {\n return new Conversation(this, agentId);\n }\n\n // ============================================\n // Embedding Config API\n // ============================================\n\n /**\n * Get embedding configuration from Sanqian\n *\n * Returns the current embedding model configuration including API URL, key, and model name.\n * This allows external apps to use the same embedding service configured in Sanqian.\n */\n async getEmbeddingConfig(): Promise<EmbeddingConfigResult> {\n await this.ensureReady();\n\n const msgId = this.generateId();\n const message: GetEmbeddingConfigMessage = {\n id: msgId,\n type: \"get_embedding_config\",\n };\n\n const response = await this.sendAndWait<GetEmbeddingConfigAckMessage>(message, msgId, 10000);\n\n if (!response.success) {\n this.log(`getEmbeddingConfig failed: ${response.error}`);\n return { available: false };\n }\n\n return response.config || { available: false };\n }\n\n // ============================================\n // Rerank Config API\n // ============================================\n\n /**\n * Get rerank configuration from Sanqian\n *\n * Returns the current rerank model configuration including API URL, key, and model name.\n * This allows external apps to use the same rerank service configured in Sanqian.\n */\n async getRerankConfig(): Promise<RerankConfigResult> {\n await this.ensureReady();\n\n const msgId = this.generateId();\n const message: GetRerankConfigMessage = {\n id: msgId,\n type: \"get_rerank_config\",\n };\n\n const response = await this.sendAndWait<GetRerankConfigAckMessage>(message, msgId, 10000);\n\n if (!response.success) {\n this.log(`getRerankConfig failed: ${response.error}`);\n return { available: false };\n }\n\n return response.config || { available: false };\n }\n\n // ============================================\n // Session Resources API\n // ============================================\n\n /**\n * Push a session resource to Sanqian\n *\n * Session resources are temporary context pushed by the app, visible in all Chat UI instances.\n * They persist until the app disconnects or explicitly removes them.\n */\n async pushResource(resource: SessionResource): Promise<StoredSessionResource> {\n await this.ensureReady();\n\n const msgId = this.generateId();\n const message: ResourcePushMessage = {\n id: msgId,\n type: \"resource_push\",\n resource,\n };\n\n const response = await this.sendAndWait<ResourcePushAckMessage>(message, msgId, 10000);\n\n if (!response.success || !response.resourceId) {\n throw createSDKError(SDKErrorCode.REQUEST_FAILED, response.error || \"Failed to push resource\");\n }\n\n const stored: StoredSessionResource = {\n ...resource,\n fullId: response.resourceId,\n appName: this.config.appName,\n pushedAt: new Date().toISOString(),\n };\n\n this.sessionResources.set(stored.fullId, stored);\n this.emit(\"resourcePushed\", stored);\n this.log(`Pushed resource: ${stored.fullId}`);\n return stored;\n }\n\n /**\n * Remove a session resource\n */\n async removeResource(resourceId: string): Promise<void> {\n await this.ensureReady();\n\n const msgId = this.generateId();\n const message: ResourceRemoveMessage = {\n id: msgId,\n type: \"resource_remove\",\n resourceId,\n };\n\n const response = await this.sendAndWait<ResourceRemoveAckMessage>(message, msgId, 10000);\n\n if (!response.success) {\n throw createSDKError(SDKErrorCode.REQUEST_FAILED, response.error || \"Failed to remove resource\");\n }\n\n this.sessionResources.delete(resourceId);\n this.emit(\"resourceRemoved\", resourceId);\n this.log(`Removed resource: ${resourceId}`);\n }\n\n /**\n * Clear all session resources pushed by this app\n */\n async clearResources(): Promise<void> {\n await this.ensureReady();\n\n const msgId = this.generateId();\n const message: ResourceClearMessage = {\n id: msgId,\n type: \"resource_clear\",\n };\n\n const response = await this.sendAndWait<ResourceClearAckMessage>(message, msgId, 10000);\n\n if (!response.success) {\n throw createSDKError(SDKErrorCode.REQUEST_FAILED, response.error || \"Failed to clear resources\");\n }\n\n this.sessionResources.clear();\n this.emit(\"resourcesCleared\", this.config.appName);\n this.log(\"Cleared all resources\");\n }\n\n /**\n * Get all session resources pushed by this app (local cache)\n */\n getSessionResources(): StoredSessionResource[] {\n return Array.from(this.sessionResources.values());\n }\n\n /**\n * Fetch session resources from server\n */\n async fetchSessionResources(agentId?: string): Promise<StoredSessionResource[]> {\n await this.ensureReady();\n\n let url = `${this.getHttpBaseUrl()}/api/sdk/session-resources`;\n if (agentId) {\n const params = new URLSearchParams({ agent_id: agentId });\n url += `?${params.toString()}`;\n }\n\n const response = await fetch(url);\n\n if (!response.ok) {\n throw createSDKError(\n SDKErrorCode.REQUEST_FAILED,\n `Failed to fetch session resources: ${response.statusText}`\n );\n }\n\n return response.json() as Promise<StoredSessionResource[]>;\n }\n\n // ============================================\n // Capability Discovery API\n // ============================================\n\n /**\n * List available capabilities (tools, skills, agents)\n */\n async listCapabilities(options?: ListCapabilitiesOptions): Promise<Capability[]> {\n await this.ensureReady();\n\n const params = new URLSearchParams();\n if (options?.type && options.type !== \"all\") {\n params.append(\"type\", options.type);\n }\n if (options?.source) {\n params.append(\"source\", options.source);\n }\n if (options?.category) {\n params.append(\"category\", options.category);\n }\n if (options?.appName) {\n params.append(\"appName\", options.appName);\n }\n if (options?.scope) {\n params.append(\"scope\", options.scope);\n }\n\n const url = `${this.getHttpBaseUrl()}/api/capabilities?${params.toString()}`;\n const response = await fetch(url);\n\n if (!response.ok) {\n throw createSDKError(\n SDKErrorCode.REQUEST_FAILED,\n `Failed to list capabilities: ${response.statusText}`\n );\n }\n\n return response.json() as Promise<Capability[]>;\n }\n\n /**\n * Search capabilities by query using hybrid search (BM25 + Vector)\n */\n async searchCapabilities(\n query: string,\n options?: SearchCapabilitiesOptions\n ): Promise<CapabilitySearchResult[]> {\n await this.ensureReady();\n\n const params = new URLSearchParams({ query });\n if (options?.type && options.type !== \"all\") {\n params.append(\"type\", options.type);\n }\n if (options?.limit) {\n params.append(\"limit\", String(options.limit));\n }\n\n const url = `${this.getHttpBaseUrl()}/api/capabilities/search?${params.toString()}`;\n const response = await fetch(url);\n\n if (!response.ok) {\n throw createSDKError(\n SDKErrorCode.REQUEST_FAILED,\n `Failed to search capabilities: ${response.statusText}`\n );\n }\n\n return response.json() as Promise<CapabilitySearchResult[]>;\n }\n\n /**\n * List available tools\n */\n async listTools(source?: \"builtin\" | \"sdk\" | \"mcp\"): Promise<ToolCapability[]> {\n const caps = await this.listCapabilities({ type: \"tool\", source });\n return caps as ToolCapability[];\n }\n\n /**\n * List available skills\n */\n async listSkills(): Promise<SkillCapability[]> {\n const caps = await this.listCapabilities({ type: \"skill\" });\n return caps as SkillCapability[];\n }\n\n /**\n * List all available agents\n */\n async listAvailableAgents(): Promise<AgentCapability[]> {\n const caps = await this.listCapabilities({\n type: \"agent\",\n appName: this.config.appName,\n scope: \"available\",\n });\n return caps as AgentCapability[];\n }\n\n // ============================================\n // Context API\n // ============================================\n\n /**\n * Update context providers dynamically\n */\n async updateContexts(contexts: ContextProvider[]): Promise<void> {\n this.contextProviders.clear();\n for (const provider of contexts) {\n this.contextProviders.set(provider.id, provider);\n }\n\n this.config.contexts = contexts;\n\n if (this.isConnected()) {\n const msgId = this.generateId();\n const message = {\n id: msgId,\n type: \"contexts_update\",\n contexts: contexts.map((c) => ({\n id: `${this.config.appName}:${c.id}`,\n name: c.name,\n description: c.description,\n has_get_current: !!c.getCurrent,\n has_get_list: !!c.getList,\n has_get_by_id: !!c.getById,\n })),\n };\n\n await this.sendAndWait(message, msgId, 5000);\n }\n }\n\n // ============================================\n // Events\n // ============================================\n\n on<T extends SDKEventName>(event: T, listener: SDKEvents[T]): this {\n if (!this.eventListeners.has(event)) {\n this.eventListeners.set(event, new Set());\n }\n this.eventListeners.get(event)!.add(listener as EventListener<SDKEventName>);\n return this;\n }\n\n off<T extends SDKEventName>(event: T, listener: SDKEvents[T]): this {\n this.eventListeners\n .get(event)\n ?.delete(listener as EventListener<SDKEventName>);\n return this;\n }\n\n once<T extends SDKEventName>(event: T, listener: SDKEvents[T]): this {\n const onceWrapper = ((...args: Parameters<SDKEvents[T]>) => {\n this.off(event, onceWrapper as SDKEvents[T]);\n (listener as (...args: unknown[]) => void)(...args);\n }) as SDKEvents[T];\n return this.on(event, onceWrapper);\n }\n\n /**\n * Remove all event listeners\n *\n * Call this to prevent memory leaks when disposing the SDK instance.\n * If event is specified, only removes listeners for that event.\n */\n removeAllListeners(event?: SDKEventName): this {\n if (event) {\n this.eventListeners.delete(event);\n } else {\n this.eventListeners.clear();\n }\n return this;\n }\n\n private emit<T extends SDKEventName>(\n event: T,\n ...args: Parameters<SDKEvents[T]>\n ): void {\n const listeners = this.eventListeners.get(event);\n if (listeners) {\n for (const listener of listeners) {\n try {\n (listener as (...args: unknown[]) => void)(...args);\n } catch (e) {\n console.error(`[SDK] Event listener error for '${event}':`, e);\n }\n }\n }\n }\n\n // ============================================\n // Channels\n // ============================================\n\n async listChannelPlugins(): Promise<ChannelPluginInfo[]> {\n await this.ensureReady();\n const url = `${this.getHttpBaseUrl()}/api/channels/plugins`;\n const response = await fetch(url, { headers: this.getHttpAuthHeaders() });\n if (!response.ok) {\n throw createSDKError(SDKErrorCode.REQUEST_FAILED, `Failed to list channel plugins: ${response.statusText}`);\n }\n return response.json() as Promise<ChannelPluginInfo[]>;\n }\n\n async listChannelAccounts(): Promise<ChannelAccount[]> {\n await this.ensureReady();\n const url = `${this.getHttpBaseUrl()}/api/channels/accounts`;\n const response = await fetch(url, { headers: this.getHttpAuthHeaders() });\n if (!response.ok) {\n throw createSDKError(SDKErrorCode.REQUEST_FAILED, `Failed to list channel accounts: ${response.statusText}`);\n }\n return response.json() as Promise<ChannelAccount[]>;\n }\n\n async createChannelAccount(req: CreateChannelAccountRequest): Promise<ChannelAccount> {\n await this.ensureReady();\n const url = `${this.getHttpBaseUrl()}/api/channels/accounts`;\n const response = await fetch(url, {\n method: \"POST\",\n headers: { ...this.getHttpAuthHeaders(), \"Content-Type\": \"application/json\" },\n body: JSON.stringify(req),\n });\n if (!response.ok) {\n const detail = await response.text();\n throw createSDKError(SDKErrorCode.REQUEST_FAILED, `Failed to create channel account: ${detail}`);\n }\n return response.json() as Promise<ChannelAccount>;\n }\n\n async getChannelAccount(id: string): Promise<ChannelAccount> {\n await this.ensureReady();\n const url = `${this.getHttpBaseUrl()}/api/channels/accounts/${encodeURIComponent(id)}`;\n const response = await fetch(url, { headers: this.getHttpAuthHeaders() });\n if (!response.ok) {\n throw createSDKError(SDKErrorCode.REQUEST_FAILED, `Failed to get channel account: ${response.statusText}`);\n }\n return response.json() as Promise<ChannelAccount>;\n }\n\n async updateChannelAccount(id: string, req: UpdateChannelAccountRequest): Promise<ChannelAccount> {\n await this.ensureReady();\n const url = `${this.getHttpBaseUrl()}/api/channels/accounts/${encodeURIComponent(id)}`;\n const response = await fetch(url, {\n method: \"PUT\",\n headers: { ...this.getHttpAuthHeaders(), \"Content-Type\": \"application/json\" },\n body: JSON.stringify(req),\n });\n if (!response.ok) {\n const detail = await response.text();\n throw createSDKError(SDKErrorCode.REQUEST_FAILED, `Failed to update channel account: ${detail}`);\n }\n return response.json() as Promise<ChannelAccount>;\n }\n\n async deleteChannelAccount(id: string): Promise<void> {\n await this.ensureReady();\n const url = `${this.getHttpBaseUrl()}/api/channels/accounts/${encodeURIComponent(id)}`;\n const response = await fetch(url, { method: \"DELETE\", headers: this.getHttpAuthHeaders() });\n if (!response.ok) {\n throw createSDKError(SDKErrorCode.REQUEST_FAILED, `Failed to delete channel account: ${response.statusText}`);\n }\n }\n\n async startChannelAccount(id: string): Promise<{ status: string }> {\n await this.ensureReady();\n const url = `${this.getHttpBaseUrl()}/api/channels/accounts/${encodeURIComponent(id)}/start`;\n const response = await fetch(url, { method: \"POST\", headers: this.getHttpAuthHeaders() });\n if (!response.ok) {\n const detail = await response.text();\n throw createSDKError(SDKErrorCode.REQUEST_FAILED, `Failed to start channel account: ${detail}`);\n }\n return response.json() as Promise<{ status: string }>;\n }\n\n async stopChannelAccount(id: string): Promise<{ status: string }> {\n await this.ensureReady();\n const url = `${this.getHttpBaseUrl()}/api/channels/accounts/${encodeURIComponent(id)}/stop`;\n const response = await fetch(url, { method: \"POST\", headers: this.getHttpAuthHeaders() });\n if (!response.ok) {\n throw createSDKError(SDKErrorCode.REQUEST_FAILED, `Failed to stop channel account: ${response.statusText}`);\n }\n return response.json() as Promise<{ status: string }>;\n }\n\n async getChannelStatus(id: string): Promise<ChannelStatus> {\n await this.ensureReady();\n const url = `${this.getHttpBaseUrl()}/api/channels/accounts/${encodeURIComponent(id)}/status`;\n const response = await fetch(url, { headers: this.getHttpAuthHeaders() });\n if (!response.ok) {\n throw createSDKError(SDKErrorCode.REQUEST_FAILED, `Failed to get channel status: ${response.statusText}`);\n }\n return response.json() as Promise<ChannelStatus>;\n }\n\n async probeChannelAccount(id: string): Promise<ChannelProbeResult> {\n await this.ensureReady();\n const url = `${this.getHttpBaseUrl()}/api/channels/accounts/${encodeURIComponent(id)}/probe`;\n const response = await fetch(url, { method: \"POST\", headers: this.getHttpAuthHeaders() });\n if (!response.ok) {\n const detail = await response.text();\n throw createSDKError(SDKErrorCode.REQUEST_FAILED, `Failed to probe channel account: ${detail}`);\n }\n return response.json() as Promise<ChannelProbeResult>;\n }\n\n async listChannelBindings(accountId?: string): Promise<ChannelBinding[]> {\n await this.ensureReady();\n const params = accountId ? `?account_id=${encodeURIComponent(accountId)}` : \"\";\n const url = `${this.getHttpBaseUrl()}/api/channels/bindings${params}`;\n const response = await fetch(url, { headers: this.getHttpAuthHeaders() });\n if (!response.ok) {\n throw createSDKError(SDKErrorCode.REQUEST_FAILED, `Failed to list channel bindings: ${response.statusText}`);\n }\n return response.json() as Promise<ChannelBinding[]>;\n }\n\n async createChannelBinding(req: CreateChannelBindingRequest): Promise<ChannelBinding> {\n await this.ensureReady();\n const url = `${this.getHttpBaseUrl()}/api/channels/bindings`;\n const response = await fetch(url, {\n method: \"POST\",\n headers: { ...this.getHttpAuthHeaders(), \"Content-Type\": \"application/json\" },\n body: JSON.stringify(req),\n });\n if (!response.ok) {\n const detail = await response.text();\n throw createSDKError(SDKErrorCode.REQUEST_FAILED, `Failed to create channel binding: ${detail}`);\n }\n return response.json() as Promise<ChannelBinding>;\n }\n\n async updateChannelBinding(id: string, req: UpdateChannelBindingRequest): Promise<ChannelBinding> {\n await this.ensureReady();\n const url = `${this.getHttpBaseUrl()}/api/channels/bindings/${encodeURIComponent(id)}`;\n const response = await fetch(url, {\n method: \"PUT\",\n headers: { ...this.getHttpAuthHeaders(), \"Content-Type\": \"application/json\" },\n body: JSON.stringify(req),\n });\n if (!response.ok) {\n const detail = await response.text();\n throw createSDKError(SDKErrorCode.REQUEST_FAILED, `Failed to update channel binding: ${detail}`);\n }\n return response.json() as Promise<ChannelBinding>;\n }\n\n async deleteChannelBinding(id: string): Promise<void> {\n await this.ensureReady();\n const url = `${this.getHttpBaseUrl()}/api/channels/bindings/${encodeURIComponent(id)}`;\n const response = await fetch(url, { method: \"DELETE\", headers: this.getHttpAuthHeaders() });\n if (!response.ok) {\n throw createSDKError(SDKErrorCode.REQUEST_FAILED, `Failed to delete channel binding: ${response.statusText}`);\n }\n }\n\n async sendChannelMessage(req: SendChannelMessageRequest): Promise<SendChannelMessageResponse> {\n await this.ensureReady();\n const url = `${this.getHttpBaseUrl()}/api/channels/send`;\n const response = await fetch(url, {\n method: \"POST\",\n headers: { ...this.getHttpAuthHeaders(), \"Content-Type\": \"application/json\" },\n body: JSON.stringify(req),\n });\n if (!response.ok) {\n const detail = await response.text();\n throw createSDKError(SDKErrorCode.REQUEST_FAILED, `Failed to send channel message: ${detail}`);\n }\n return response.json() as Promise<SendChannelMessageResponse>;\n }\n\n // ============================================\n // Utilities\n // ============================================\n\n private generateId(): string {\n return `${Date.now()}-${Math.random().toString(36).substring(2, 9)}`;\n }\n\n private createTimeout(ms: number): Promise<never> {\n return new Promise((_, reject) => {\n setTimeout(\n () => reject(createSDKError(SDKErrorCode.TOOL_EXECUTION_TIMEOUT)),\n ms\n );\n });\n }\n}\n\n/**\n * Conversation helper for multi-turn chat\n */\nexport class Conversation {\n private sdk: SanqianSDK;\n private agentId: string;\n private _conversationId: string | null = null;\n\n constructor(sdk: SanqianSDK, agentId: string, conversationId?: string) {\n this.sdk = sdk;\n this.agentId = agentId;\n this._conversationId = conversationId || null;\n }\n\n get id(): string | null {\n return this._conversationId;\n }\n\n async send(\n content: string,\n options?: { remoteTools?: RemoteToolDefinition[] }\n ): Promise<ChatResponse> {\n const response = await this.sdk.chat(\n this.agentId,\n [{ role: \"user\", content }],\n {\n conversationId: this._conversationId || undefined,\n // Conversation helper is stateful by design: first turn must create server-side history.\n persistHistory: this._conversationId ? undefined : true,\n remoteTools: options?.remoteTools,\n }\n );\n\n if (response.conversationId && !this._conversationId) {\n this._conversationId = response.conversationId;\n }\n\n return response;\n }\n\n async *sendStream(\n content: string,\n options?: { remoteTools?: RemoteToolDefinition[] }\n ): AsyncGenerator<ChatStreamEvent> {\n const stream = this.sdk.chatStream(\n this.agentId,\n [{ role: \"user\", content }],\n {\n conversationId: this._conversationId || undefined,\n // Conversation helper is stateful by design: first turn must create server-side history.\n persistHistory: this._conversationId ? undefined : true,\n remoteTools: options?.remoteTools,\n }\n );\n\n for await (const event of stream) {\n if (\n event.type === \"done\" &&\n event.conversationId &&\n !this._conversationId\n ) {\n this._conversationId = event.conversationId;\n }\n yield event;\n }\n }\n\n async delete(): Promise<void> {\n if (!this._conversationId) {\n throw new Error(\"No conversation to delete\");\n }\n await this.sdk.deleteConversation(this._conversationId);\n this._conversationId = null;\n }\n\n async getDetails(options?: {\n messageLimit?: number;\n }): Promise<ConversationDetail> {\n if (!this._conversationId) {\n throw new Error(\"No conversation to get details for\");\n }\n return this.sdk.getConversation(this._conversationId, {\n includeMessages: true,\n messageLimit: options?.messageLimit,\n });\n }\n}\n"],"mappings":"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","names":["SDKErrorCode"]}
1
+ {"version":3,"sources":["../src/index.browser.ts","../src/errors.ts","../src/client.browser.ts"],"sourcesContent":["/**\n * Sanqian SDK - Browser Build\n *\n * This entry point is optimized for browser environments.\n * It does NOT include DiscoveryManager (which uses Node.js APIs).\n *\n * When using this build, you MUST provide connectionInfo in config:\n *\n * @example\n * ```typescript\n * import { SanqianSDK } from '@yushaw/sanqian-sdk';\n *\n * const sdk = new SanqianSDK({\n * appName: 'my-app',\n * appVersion: '1.0.0',\n * tools: [...],\n * connectionInfo: {\n * version: 1,\n * port: 38765,\n * ws_path: '/ws/apps',\n * token: 'your-token',\n * pid: 0,\n * started_at: new Date().toISOString(),\n * },\n * });\n *\n * await sdk.connect();\n * ```\n */\n\nexport { SanqianSDK, Conversation } from \"./client.browser\";\n\n// Errors\nexport {\n SanqianSDKError,\n SDKErrorCode,\n createSDKError,\n ErrorMessages,\n SANQIAN_WEBSITE,\n} from \"./errors\";\n\n// Types\nexport type {\n SDKConfig,\n ToolDefinition,\n JSONSchema,\n JSONSchemaProperty,\n ConnectionInfo,\n ConnectionState,\n ChatRequest,\n ChatMessage,\n ChatResponse,\n ChatStreamEvent,\n LoadItem,\n LoadItemType,\n LoadItemAction,\n ToolCall,\n SDKEvents,\n SDKEventName,\n // Private Agent API\n AgentConfig,\n AgentInfo,\n AgentUpdateConfig,\n ConversationInfo,\n ConversationMessage,\n ConversationDetail,\n // Remote Tools\n RemoteToolDefinition,\n // HITL (Human-in-the-Loop)\n HitlInterruptType,\n HitlRiskLevel,\n HitlInterruptPayload,\n HitlResponse,\n // Embedding Config API\n EmbeddingConfigResult,\n // Rerank Config API\n RerankConfigResult,\n // Capability Discovery API\n CapabilityType,\n Capability,\n ToolCapability,\n SkillCapability,\n AgentCapability,\n CapabilitySearchResult,\n ListCapabilitiesOptions,\n SearchCapabilitiesOptions,\n // Context Provider API\n ContextProvider,\n ContextData,\n ContextListItem,\n // Session Resources API\n SessionResource,\n StoredSessionResource,\n // Messaging Channels API\n ChannelChatType,\n ChannelDmPolicy,\n ChannelDmScope,\n ChannelGroupPolicy,\n ChannelAccountStatus,\n ChannelRuntimeStatus,\n ChannelBindingMatchType,\n ChannelPluginInfo,\n ChannelAccount,\n ChannelBinding,\n ChannelStatus,\n ChannelProbeResult,\n ProbeChannelConfigRequest,\n ChannelConfigSchema,\n CreateChannelAccountRequest,\n UpdateChannelAccountRequest,\n CreateChannelBindingRequest,\n UpdateChannelBindingRequest,\n SendChannelMessageRequest,\n SendChannelMessageResponse,\n} from \"./types\";\n","/**\n * SDK Error Messages\n *\n * User-friendly error messages in English and Chinese.\n * All errors guide users to sanqian.io for installation.\n */\n\nexport const SANQIAN_WEBSITE = \"https://sanqian.io\";\n\n/**\n * Error codes for SDK errors\n */\nexport enum SDKErrorCode {\n INVALID_CONFIG = \"INVALID_CONFIG\",\n NOT_INSTALLED = \"NOT_INSTALLED\",\n NOT_RUNNING = \"NOT_RUNNING\",\n CONNECTION_TIMEOUT = \"CONNECTION_TIMEOUT\",\n STARTUP_TIMEOUT = \"STARTUP_TIMEOUT\",\n REGISTRATION_FAILED = \"REGISTRATION_FAILED\",\n REQUEST_TIMEOUT = \"REQUEST_TIMEOUT\",\n REQUEST_FAILED = \"REQUEST_FAILED\",\n DISCONNECTED = \"DISCONNECTED\",\n WEBSOCKET_ERROR = \"WEBSOCKET_ERROR\",\n AGENT_NOT_FOUND = \"AGENT_NOT_FOUND\",\n CONVERSATION_NOT_FOUND = \"CONVERSATION_NOT_FOUND\",\n TOOL_NOT_FOUND = \"TOOL_NOT_FOUND\",\n TOOL_EXECUTION_TIMEOUT = \"TOOL_EXECUTION_TIMEOUT\",\n}\n\n/**\n * Bilingual error messages\n */\nexport const ErrorMessages: Record<\n SDKErrorCode,\n { en: string; zh: string; hint?: { en: string; zh: string } }\n> = {\n [SDKErrorCode.INVALID_CONFIG]: {\n en: `SDK configuration is invalid.`,\n zh: `SDK 配置无效。`,\n hint: {\n en: `Please check required fields and option values in your SDK config.`,\n zh: `请检查 SDK 配置中的必填字段和选项取值。`,\n },\n },\n [SDKErrorCode.NOT_INSTALLED]: {\n en: `Sanqian is not installed on this computer.`,\n zh: `Sanqian 尚未安装在此电脑上。`,\n hint: {\n en: `Please download and install Sanqian from ${SANQIAN_WEBSITE}`,\n zh: `请访问 ${SANQIAN_WEBSITE} 下载安装 Sanqian`,\n },\n },\n [SDKErrorCode.NOT_RUNNING]: {\n en: `Sanqian is not running.`,\n zh: `Sanqian 未在运行。`,\n hint: {\n en: `Please start Sanqian first, or enable autoLaunchSanqian option in SDK config.`,\n zh: `请先启动 Sanqian,或在 SDK 配置中启用 autoLaunchSanqian 选项。`,\n },\n },\n [SDKErrorCode.CONNECTION_TIMEOUT]: {\n en: `Failed to connect to Sanqian (connection timeout).`,\n zh: `连接 Sanqian 失败(连接超时)。`,\n hint: {\n en: `Please check if Sanqian is running properly. If the problem persists, try restarting Sanqian.`,\n zh: `请检查 Sanqian 是否正常运行。如问题持续,请尝试重启 Sanqian。`,\n },\n },\n [SDKErrorCode.STARTUP_TIMEOUT]: {\n en: `Sanqian failed to start within 2 minutes.`,\n zh: `Sanqian 在 2 分钟内未能启动。`,\n hint: {\n en: `Please try starting Sanqian manually. If it fails to start, reinstall from ${SANQIAN_WEBSITE}`,\n zh: `请尝试手动启动 Sanqian。如仍无法启动,请从 ${SANQIAN_WEBSITE} 重新安装。`,\n },\n },\n [SDKErrorCode.REGISTRATION_FAILED]: {\n en: `Failed to register with Sanqian.`,\n zh: `向 Sanqian 注册失败。`,\n hint: {\n en: `Please check your SDK configuration (appName, tools). If the problem persists, try restarting Sanqian.`,\n zh: `请检查 SDK 配置(appName、tools)。如问题持续,请尝试重启 Sanqian。`,\n },\n },\n [SDKErrorCode.REQUEST_TIMEOUT]: {\n en: `Request timed out.`,\n zh: `请求超时。`,\n hint: {\n en: `The operation took too long. Please try again.`,\n zh: `操作耗时过长,请重试。`,\n },\n },\n [SDKErrorCode.REQUEST_FAILED]: {\n en: `Request failed.`,\n zh: `请求失败。`,\n hint: {\n en: `Please check the error details and try again.`,\n zh: `请检查错误详情后重试。`,\n },\n },\n [SDKErrorCode.DISCONNECTED]: {\n en: `Disconnected from Sanqian.`,\n zh: `与 Sanqian 的连接已断开。`,\n hint: {\n en: `The SDK will automatically reconnect. If problems persist, check if Sanqian is still running.`,\n zh: `SDK 会自动重连。如问题持续,请检查 Sanqian 是否仍在运行。`,\n },\n },\n [SDKErrorCode.WEBSOCKET_ERROR]: {\n en: `WebSocket connection error.`,\n zh: `WebSocket 连接错误。`,\n hint: {\n en: `Please check your network and firewall settings. Sanqian uses local WebSocket on port shown in settings.`,\n zh: `请检查网络和防火墙设置。Sanqian 使用本地 WebSocket,端口可在设置中查看。`,\n },\n },\n [SDKErrorCode.AGENT_NOT_FOUND]: {\n en: `Agent not found.`,\n zh: `找不到该 Agent。`,\n hint: {\n en: `Please check the agent ID. Use listAgents() to see available agents.`,\n zh: `请检查 Agent ID。使用 listAgents() 查看可用的 Agent。`,\n },\n },\n [SDKErrorCode.CONVERSATION_NOT_FOUND]: {\n en: `Conversation not found.`,\n zh: `找不到该对话。`,\n hint: {\n en: `The conversation may have been deleted. Start a new conversation with startConversation().`,\n zh: `该对话可能已被删除。使用 startConversation() 开始新对话。`,\n },\n },\n [SDKErrorCode.TOOL_NOT_FOUND]: {\n en: `Tool not found.`,\n zh: `找不到该工具。`,\n hint: {\n en: `Please check that the tool is registered in your SDK config.`,\n zh: `请检查该工具是否已在 SDK 配置中注册。`,\n },\n },\n [SDKErrorCode.TOOL_EXECUTION_TIMEOUT]: {\n en: `Tool execution timed out.`,\n zh: `工具执行超时。`,\n hint: {\n en: `The tool took too long to execute. Consider increasing toolExecutionTimeout in SDK config.`,\n zh: `工具执行时间过长。可在 SDK 配置中增加 toolExecutionTimeout。`,\n },\n },\n};\n\n/**\n * Custom SDK Error with code and bilingual message\n */\nexport class SanqianSDKError extends Error {\n code: SDKErrorCode;\n messageZh: string;\n hint?: string;\n hintZh?: string;\n\n constructor(code: SDKErrorCode, details?: string) {\n const msg = ErrorMessages[code];\n const fullMessage = details ? `${msg.en} ${details}` : msg.en;\n\n super(fullMessage);\n this.name = \"SanqianSDKError\";\n this.code = code;\n this.messageZh = details ? `${msg.zh} ${details}` : msg.zh;\n this.hint = msg.hint?.en;\n this.hintZh = msg.hint?.zh;\n }\n\n /**\n * Get full error message with hint (English)\n */\n getFullMessage(): string {\n return this.hint ? `${this.message}\\n${this.hint}` : this.message;\n }\n\n /**\n * Get full error message with hint (Chinese)\n */\n getFullMessageZh(): string {\n return this.hintZh ? `${this.messageZh}\\n${this.hintZh}` : this.messageZh;\n }\n\n /**\n * Get bilingual error message\n */\n getBilingualMessage(): string {\n return `${this.getFullMessage()}\\n\\n${this.getFullMessageZh()}`;\n }\n}\n\n/**\n * Create a user-friendly SDK error\n */\nexport function createSDKError(\n code: SDKErrorCode,\n details?: string\n): SanqianSDKError {\n return new SanqianSDKError(code, details);\n}\n","/**\n * Sanqian SDK Client - Browser Build\n *\n * This is a browser-optimized version of the SDK client that does NOT include\n * DiscoveryManager or any Node.js APIs (fs, path, child_process, os).\n *\n * IMPORTANT: When using this build, you MUST provide connectionInfo in config.\n * Auto-discovery and auto-launch features are not available in browser environments.\n *\n * TODO: Consider refactoring to share code with client.ts using composition or\n * inheritance pattern to reduce duplication (~900 lines shared). Currently kept\n * separate for simplicity and to avoid complex build configurations.\n * See: https://github.com/anthropics/claude-code/issues/xxx (if tracked)\n */\n\n// Browser build uses native WebSocket directly (no isomorphic-ws)\n// This avoids \"Dynamic require of 'ws' is not supported\" errors in ESM bundlers\n\n// Browser global types (avoid adding DOM to tsconfig.json which affects Node.js code)\ndeclare const WebSocket: {\n new (url: string): WebSocket;\n readonly OPEN: number;\n readonly CLOSED: number;\n readonly CONNECTING: number;\n readonly CLOSING: number;\n};\n// eslint-disable-next-line no-redeclare -- intentional: type augmentation for browser WebSocket\ninterface WebSocket {\n readonly readyState: number;\n onopen: ((this: WebSocket, ev: Event) => void) | null;\n onclose: ((this: WebSocket, ev: CloseEvent) => void) | null;\n onerror: ((this: WebSocket, ev: Event) => void) | null;\n onmessage: ((this: WebSocket, ev: MessageEvent) => void) | null;\n send(data: string): void;\n close(code?: number, reason?: string): void;\n}\ninterface CloseEvent extends Event {\n readonly code: number;\n readonly reason: string;\n}\ninterface MessageEvent extends Event {\n readonly data: unknown;\n}\n\nimport type {\n SDKConfig,\n ConnectionInfo,\n ConnectionState,\n ToolDefinition,\n RegisterMessage,\n RegisterAckMessage,\n ToolCallMessage,\n ToolResultMessage,\n HeartbeatMessage,\n SDKEvents,\n SDKEventName,\n AgentConfig,\n AgentInfo,\n AgentUpdateConfig,\n ConversationInfo,\n ConversationDetail,\n CreateAgentMessage,\n CreateAgentAckMessage,\n UpdateAgentMessage,\n UpdateAgentAckMessage,\n ListAgentsMessage,\n ListAgentsAckMessage,\n DeleteAgentMessage,\n DeleteAgentAckMessage,\n ListConversationsMessage,\n ListConversationsAckMessage,\n GetConversationMessage,\n GetConversationAckMessage,\n DeleteConversationMessage,\n DeleteConversationAckMessage,\n ChatMessage,\n ChatResponse,\n ChatRequestMessage,\n ChatResponseMessage,\n ChatStreamMessage,\n ChatStreamEvent,\n LoadItem,\n RemoteToolDefinition,\n HitlResponse,\n HitlResponseMessage,\n HitlInterruptType,\n HitlInterruptPayload,\n ToolCall,\n // Embedding & Rerank Config\n EmbeddingConfigResult,\n GetEmbeddingConfigMessage,\n GetEmbeddingConfigAckMessage,\n RerankConfigResult,\n GetRerankConfigMessage,\n GetRerankConfigAckMessage,\n // Capability Discovery\n Capability,\n ToolCapability,\n SkillCapability,\n AgentCapability,\n CapabilitySearchResult,\n ListCapabilitiesOptions,\n SearchCapabilitiesOptions,\n // Session Resources\n SessionResource,\n StoredSessionResource,\n ResourcePushMessage,\n ResourcePushAckMessage,\n ResourceRemoveMessage,\n ResourceRemoveAckMessage,\n ResourceClearMessage,\n ResourceClearAckMessage,\n ResourceRemovedByUserMessage,\n // Context Provider\n ContextProvider,\n // Channel types\n ChannelPluginInfo,\n ChannelAccount,\n ChannelBinding,\n ChannelStatus,\n ChannelProbeResult,\n ProbeChannelConfigRequest,\n ChannelConfigSchema,\n CreateChannelAccountRequest,\n UpdateChannelAccountRequest,\n CreateChannelBindingRequest,\n UpdateChannelBindingRequest,\n SendChannelMessageRequest,\n SendChannelMessageResponse,\n} from \"./types\";\nimport { SanqianSDKError, SDKErrorCode, createSDKError } from \"./errors\";\n\ntype EventListener<T extends SDKEventName> = SDKEvents[T];\n\nexport class SanqianSDK {\n private config: SDKConfig;\n private ws: WebSocket | null = null;\n private connectionInfo: ConnectionInfo | null = null;\n\n private state: ConnectionState = {\n connected: false,\n registering: false,\n registered: false,\n reconnectAttempts: 0,\n };\n\n // Tool handlers by name\n private toolHandlers: Map<string, (args: unknown) => Promise<unknown>> =\n new Map();\n\n // Pending request futures\n private pendingRequests: Map<\n string,\n {\n resolve: (value: unknown) => void;\n reject: (error: Error) => void;\n }\n > = new Map();\n\n // Timers\n private heartbeatTimer: ReturnType<typeof setInterval> | null = null;\n private reconnectTimer: ReturnType<typeof setTimeout> | null = null;\n private heartbeatAckPending: boolean = false;\n private missedHeartbeats: number = 0;\n private static readonly MAX_MISSED_HEARTBEATS = 2;\n\n // Connection promise for deduplication\n private connectingPromise: Promise<void> | null = null;\n\n // Reconnect reference count\n private reconnectRefCount: number = 0;\n\n // Event listeners\n private eventListeners: Map<SDKEventName, Set<EventListener<SDKEventName>>> =\n new Map();\n\n // Session resources cache\n private sessionResources: Map<string, StoredSessionResource> = new Map();\n\n // Context providers\n private contextProviders: Map<string, ContextProvider> = new Map();\n\n // Map run_id -> msgId for routing backend messages to correct handler\n private runIdToMsgId: Map<string, string> = new Map();\n // Queue pending stream requests for backend-native \"start\" routing (which has no msgId)\n private pendingStreamRequests: Array<{ msgId: string; conversationId?: string }> = [];\n // Streams requested to cancel before run_id is available\n private pendingCancelMsgIds: Set<string> = new Set();\n // Prevent ambiguous routing when multiple streams target the same conversation.\n private activeStreamConversations: Set<string> = new Set();\n\n private static readonly VALID_SECURITY_LEVELS = new Set([\n \"standard\",\n \"elevated\",\n \"unrestricted\",\n ]);\n\n // ============================================\n // Debug Logging\n // ============================================\n\n private log(...args: unknown[]): void {\n if (this.config.debug) {\n console.log(\"[SDK]\", ...args);\n }\n }\n\n private warn(...args: unknown[]): void {\n if (this.config.debug) {\n console.warn(\"[SDK]\", ...args);\n }\n }\n\n private normalizeRequestedSecurityLevel(level: unknown): SDKConfig[\"requestedSecurityLevel\"] {\n if (level === undefined || level === null) {\n return undefined;\n }\n if (typeof level === \"string\" && SanqianSDK.VALID_SECURITY_LEVELS.has(level)) {\n return level as SDKConfig[\"requestedSecurityLevel\"];\n }\n throw createSDKError(\n SDKErrorCode.INVALID_CONFIG,\n \"requestedSecurityLevel must be one of: standard, elevated, unrestricted\"\n );\n }\n\n private sendRunCancel(runId: string): void {\n const message = {\n type: \"cancel\",\n run_id: runId,\n };\n this.send(message);\n this.log(`Sent cancel for run ${runId}`);\n }\n\n private requestStreamCancel(msgId: string, runId?: string): void {\n if (runId) {\n this.pendingCancelMsgIds.delete(msgId);\n this.sendRunCancel(runId);\n return;\n }\n this.pendingCancelMsgIds.add(msgId);\n }\n\n private reserveConversationStream(conversationId?: string): void {\n if (!conversationId) {\n return;\n }\n if (this.activeStreamConversations.has(conversationId)) {\n throw createSDKError(\n SDKErrorCode.REQUEST_FAILED,\n `Another stream is already active for conversation '${conversationId}'. Wait for it to finish before starting a new one.`\n );\n }\n this.activeStreamConversations.add(conversationId);\n }\n\n private releaseConversationStream(conversationId?: string): void {\n if (!conversationId) {\n return;\n }\n this.activeStreamConversations.delete(conversationId);\n }\n\n private failPendingStreamStarts(reason: string): void {\n const error = createSDKError(SDKErrorCode.REQUEST_FAILED, reason);\n const pending = [...this.pendingStreamRequests];\n this.pendingStreamRequests = [];\n for (const request of pending) {\n const handler = this.streamHandlers.get(request.msgId);\n handler?.onError(error);\n }\n }\n\n private resolvePendingStartIndex(\n message: { payload?: { request_id?: string; session_id?: string } }\n ): number {\n const requestId = message.payload?.request_id;\n if (requestId) {\n return this.pendingStreamRequests.findIndex((item) => item.msgId === requestId);\n }\n\n const sessionId = message.payload?.session_id;\n if (sessionId) {\n const exactMatchIndex = this.pendingStreamRequests.findIndex(\n (item) => item.conversationId === sessionId\n );\n if (exactMatchIndex >= 0) {\n return exactMatchIndex;\n }\n }\n\n if (this.pendingStreamRequests.length <= 1) {\n return this.pendingStreamRequests.length - 1;\n }\n\n const unboundIndexes: number[] = [];\n this.pendingStreamRequests.forEach((item, index) => {\n if (!item.conversationId) {\n unboundIndexes.push(index);\n }\n });\n\n if (unboundIndexes.length === this.pendingStreamRequests.length) {\n // Legacy backend mode: no correlation key available, keep request-order routing.\n return 0;\n }\n if (unboundIndexes.length === 1) {\n // Prefer the only unbound request (common when backend remaps new conversation IDs).\n return unboundIndexes[0];\n }\n return -1;\n }\n\n constructor(config: SDKConfig) {\n // Browser build REQUIRES connectionInfo\n if (!config.connectionInfo) {\n throw new SanqianSDKError(\n SDKErrorCode.NOT_RUNNING,\n \"Browser build requires connectionInfo in config. \" +\n \"Use the Node.js build for auto-discovery, or provide connectionInfo manually.\"\n );\n }\n\n const requestedSecurityLevel = this.normalizeRequestedSecurityLevel(\n (config as { requestedSecurityLevel?: unknown }).requestedSecurityLevel\n );\n\n this.config = {\n reconnectInterval: 5000,\n heartbeatInterval: 30000,\n toolExecutionTimeout: 30000,\n debug: false,\n autoLaunchSanqian: false, // Not supported in browser\n ...config,\n requestedSecurityLevel,\n };\n\n // Register tool handlers\n for (const tool of config.tools) {\n this.toolHandlers.set(tool.name, tool.handler);\n }\n }\n\n /**\n * Build WebSocket URL from connection info\n */\n private buildWebSocketUrl(info: ConnectionInfo): string {\n const wsPath = info.ws_path || \"/ws/apps\";\n const protocol = info.ws_protocol || \"ws\";\n const host = info.ws_host || \"127.0.0.1\";\n return `${protocol}://${host}:${info.port}${wsPath}?token=${info.token}`;\n }\n\n // ============================================\n // Lifecycle\n // ============================================\n\n async connect(): Promise<void> {\n return this.ensureReady();\n }\n\n private async connectWithInfo(info: ConnectionInfo): Promise<void> {\n this.connectionInfo = info;\n const url = this.buildWebSocketUrl(info);\n\n return new Promise((resolve, reject) => {\n this.log(`Connecting to ${url.replace(/[?&]token=[^&]+/, (m) => m[0] + 'token=***')}`);\n\n this.ws = new WebSocket(url);\n\n const connectTimeout = setTimeout(() => {\n reject(createSDKError(SDKErrorCode.CONNECTION_TIMEOUT));\n this.ws?.close();\n }, 10000);\n\n this.ws.onopen = async () => {\n clearTimeout(connectTimeout);\n this.log(\"WebSocket connected\");\n this.state.connected = true;\n this.state.reconnectAttempts = 0;\n this.emit(\"connected\");\n\n try {\n await this.register();\n resolve();\n } catch (e) {\n reject(e);\n }\n };\n\n this.ws.onclose = (event: CloseEvent) => {\n const reason = event.reason || \"\";\n this.log(`WebSocket closed: ${event.code} ${reason}`);\n this.handleDisconnect(reason);\n };\n\n this.ws.onerror = (event: Event) => {\n // Browser Event may not expose details, but preserve event.error when available\n const error = (event as Event & { error?: Error }).error || new Error(\"WebSocket error\");\n console.error(\"[SDK] WebSocket error:\", error);\n this.state.lastError = error;\n this.emit(\"error\", error);\n };\n\n this.ws.onmessage = (event: MessageEvent) => {\n try {\n // In browser, event.data is always string for text messages\n const message = JSON.parse(event.data as string);\n this.handleMessage(message);\n } catch (e) {\n this.warn(\"Failed to parse message:\", e);\n }\n };\n });\n }\n\n async disconnect(): Promise<void> {\n this.stopHeartbeat();\n this.stopReconnect();\n\n if (this.ws) {\n this.ws.close(1000, \"Client disconnect\");\n this.ws = null;\n }\n\n this.state = {\n connected: false,\n registering: false,\n registered: false,\n reconnectAttempts: 0,\n };\n }\n\n // ============================================\n // Registration\n // ============================================\n\n private async register(): Promise<void> {\n this.state.registering = true;\n\n const msgId = this.generateId();\n\n const message: RegisterMessage = {\n id: msgId,\n type: \"register\",\n app: {\n name: this.config.appName,\n version: this.config.appVersion,\n display_name: this.config.displayName,\n launch_command: this.config.launchCommand,\n metadata: this.config.metadata,\n ...(this.config.requestedSecurityLevel\n ? { requested_security_level: this.config.requestedSecurityLevel }\n : {}),\n },\n tools: this.config.tools.map((t) => ({\n name: `${this.config.appName}:${t.name}`,\n description: t.description,\n parameters: t.parameters,\n searchable: t.searchable ?? true,\n })),\n };\n\n try {\n const response = await this.sendAndWait<RegisterAckMessage>(\n message,\n msgId,\n 10000\n );\n\n if (!response.success) {\n throw createSDKError(SDKErrorCode.REGISTRATION_FAILED, response.error);\n }\n\n this.state.registering = false;\n this.state.registered = true;\n this.state.securityLevel = response.security_level;\n this.startHeartbeat();\n this.emit(\"registered\");\n\n this.log(\n `Registered as '${this.config.appName}' (security_level: ${response.security_level || \"standard\"})`\n );\n } catch (e) {\n this.state.registering = false;\n throw e;\n }\n }\n\n // ============================================\n // Message Handling\n // ============================================\n\n private handleMessage(message: {\n id?: string;\n type: string;\n [key: string]: unknown;\n }): void {\n const { id, type } = message;\n\n if (id && this.pendingRequests.has(id)) {\n const pending = this.pendingRequests.get(id)!;\n this.pendingRequests.delete(id);\n pending.resolve(message);\n return;\n }\n\n switch (type) {\n case \"tool_call\":\n this.handleToolCall(message as unknown as ToolCallMessage);\n break;\n\n case \"heartbeat_ack\":\n this.heartbeatAckPending = false;\n this.missedHeartbeats = 0;\n break;\n\n case \"chat_stream\":\n this.handleChatStream(message as unknown as ChatStreamMessage);\n break;\n\n case \"start\":\n // Handle start message (backend native format)\n this.handleBackendStart(\n message as { payload?: { run_id?: string; session_id?: string; request_id?: string } }\n );\n break;\n\n case \"stream\":\n // Handle stream message (backend native format for text content)\n this.handleBackendStream(message as { run_id?: string; content?: string });\n break;\n\n case \"thinking\":\n // Handle thinking message (backend native format)\n this.handleBackendThinking(message as { run_id?: string; content?: string });\n break;\n\n case \"tool_start\":\n // Handle tool_start message (backend native format)\n this.handleBackendToolStart(message as { run_id?: string; tool_call?: ToolCall });\n break;\n\n case \"tool_args_chunk\":\n // Handle tool_args_chunk message (backend native format)\n this.handleBackendToolArgsChunk(message as { run_id?: string; tool_call_id?: string; tool_name?: string; chunk?: string });\n break;\n\n case \"tool_result\":\n // Handle tool_result message (backend native format)\n this.handleBackendToolResult(message as { run_id?: string; tool_call_id?: string; result?: unknown; success?: boolean; error?: string });\n break;\n\n case \"complete\":\n // Handle complete message (backend native format)\n this.handleBackendComplete(message as { run_id?: string; conversation_id?: string; title?: string; content?: string });\n break;\n\n case \"error\":\n // Handle error message (backend native format)\n this.handleBackendError(message as { run_id?: string; error?: string; message?: string });\n break;\n\n case \"cancelled\":\n // Handle cancelled message (backend native format)\n this.handleBackendCancelled(message as { run_id?: string });\n break;\n\n case \"interrupt\":\n // Handle interrupt/HITL message (backend native format)\n this.handleBackendInterrupt(message as { run_id?: string; interrupt_type?: string; interrupt_payload?: unknown });\n break;\n\n case \"resource_removed_by_user\":\n this.handleResourceRemovedByUser(message as unknown as ResourceRemovedByUserMessage);\n break;\n\n default:\n this.warn(`Unknown message type: ${type}`);\n }\n }\n\n private handleChatStream(message: ChatStreamMessage): void {\n const {\n id,\n event,\n content,\n tool_call,\n tool_result,\n conversation_id,\n title,\n usage,\n error,\n } = message;\n\n if (!id) return;\n\n const handler = this.streamHandlers.get(id);\n if (!handler) {\n this.warn(`No stream handler for message ${id}`);\n return;\n }\n\n switch (event) {\n case \"start\":\n handler.onEvent({\n type: \"start\",\n run_id: message.run_id,\n conversationId: conversation_id || \"\",\n });\n break;\n\n case \"text\":\n handler.onEvent({ type: \"text\", content });\n break;\n\n case \"thinking\":\n // Reasoning content from thinking models (DeepSeek R1, o3, etc.)\n handler.onEvent({ type: \"thinking\", content });\n break;\n\n case \"tool_call\":\n handler.onEvent({ type: \"tool_call\", tool_call });\n break;\n\n case \"tool_result\":\n // Forward tool_result as proper event (not disguised as tool_call)\n if (tool_result) {\n handler.onEvent({\n type: \"tool_result\",\n tool_call_id: tool_result.call_id,\n result: tool_result.result,\n success: tool_result.success,\n error: tool_result.error,\n });\n } else {\n this.log(\"Received tool_result event without tool_result data\");\n }\n break;\n\n case \"done\":\n handler.onDone({\n message: message.message || { role: \"assistant\", content: \"\" },\n conversationId: conversation_id || \"\",\n title,\n usage,\n });\n break;\n\n case \"error\":\n handler.onError(new Error(error || \"Unknown stream error\"));\n break;\n\n case \"interrupt\":\n // HITL interrupt - user input required to continue\n handler.onEvent({\n type: \"interrupt\",\n interrupt_type: message.interrupt_type,\n interrupt_payload: message.interrupt_payload,\n run_id: message.run_id,\n });\n break;\n\n case \"cancelled\":\n handler.onEvent({ type: \"cancelled\", run_id: message.run_id });\n break;\n }\n }\n\n private handleResourceRemovedByUser(message: ResourceRemovedByUserMessage): void {\n const { resourceId } = message;\n this.sessionResources.delete(resourceId);\n this.emit(\"resourceRemoved\", resourceId);\n this.log(`Resource removed by user: ${resourceId}`);\n }\n\n // ============================================\n // Backend Native Message Handlers\n // ============================================\n\n private getHandlerByRunId(runId?: string): ReturnType<typeof this.streamHandlers.get> | undefined {\n if (!runId) return undefined;\n const msgId = this.runIdToMsgId.get(runId);\n if (msgId) {\n return this.streamHandlers.get(msgId);\n }\n return undefined;\n }\n\n private handleBackendStart(\n message: { payload?: { run_id?: string; session_id?: string; request_id?: string } }\n ): void {\n const runId = message.payload?.run_id;\n if (!runId) {\n this.warn(\"Received start message without run_id\");\n return;\n }\n\n const pendingIndex = this.resolvePendingStartIndex(message);\n const pending = this.pendingStreamRequests[pendingIndex];\n if (!pending) {\n if (this.pendingStreamRequests.length > 0) {\n this.failPendingStreamStarts(\n \"Unable to correlate stream start event. Retry with a single active stream, or use a backend that echoes request_id in start payload.\"\n );\n } else {\n this.warn(\"Received start message but no pending stream handler\");\n }\n return;\n }\n this.pendingStreamRequests.splice(pendingIndex, 1);\n\n const pendingMsgId = pending.msgId;\n\n this.runIdToMsgId.set(runId, pendingMsgId);\n const handler = this.streamHandlers.get(pendingMsgId);\n if (handler) {\n handler.onEvent({\n type: \"start\",\n run_id: runId,\n conversationId: message.payload?.session_id || \"\",\n });\n }\n\n if (this.pendingCancelMsgIds.has(pendingMsgId)) {\n try {\n this.requestStreamCancel(pendingMsgId, runId);\n } catch (e) {\n this.warn(\"Failed to send queued cancel for run\", runId, e);\n }\n }\n }\n\n private handleBackendStream(message: { run_id?: string; content?: string }): void {\n const handler = this.getHandlerByRunId(message.run_id);\n if (handler) {\n handler.onEvent({ type: \"text\", content: message.content });\n }\n }\n\n private handleBackendThinking(message: { run_id?: string; content?: string }): void {\n const handler = this.getHandlerByRunId(message.run_id);\n if (handler) {\n handler.onEvent({ type: \"thinking\", content: message.content });\n }\n }\n\n private handleBackendToolStart(message: { run_id?: string; tool_call?: ToolCall }): void {\n const handler = this.getHandlerByRunId(message.run_id);\n if (handler && message.tool_call) {\n handler.onEvent({ type: \"tool_call\", tool_call: message.tool_call });\n }\n }\n\n private handleBackendToolArgsChunk(message: { run_id?: string; tool_call_id?: string; tool_name?: string; chunk?: string }): void {\n const handler = this.getHandlerByRunId(message.run_id);\n if (handler) {\n handler.onEvent({\n type: \"tool_args_chunk\",\n tool_call_id: message.tool_call_id,\n tool_name: message.tool_name,\n chunk: message.chunk,\n });\n }\n }\n\n private handleBackendToolResult(message: { run_id?: string; tool_call_id?: string; result?: unknown; success?: boolean; error?: string }): void {\n const handler = this.getHandlerByRunId(message.run_id);\n if (handler) {\n handler.onEvent({\n type: \"tool_result\",\n tool_call_id: message.tool_call_id,\n result: message.result,\n success: message.success,\n error: message.error,\n });\n }\n }\n\n private handleBackendComplete(message: { run_id?: string; conversation_id?: string; title?: string; content?: string }): void {\n const handler = this.getHandlerByRunId(message.run_id);\n if (handler) {\n handler.onDone({\n message: { role: \"assistant\", content: message.content || \"\" },\n conversationId: message.conversation_id || \"\",\n title: message.title,\n });\n }\n }\n\n private handleBackendError(message: { run_id?: string; error?: string; message?: string }): void {\n const handler = this.getHandlerByRunId(message.run_id);\n if (handler) {\n handler.onError(new Error(message.error || message.message || \"Unknown error\"));\n }\n }\n\n private handleBackendCancelled(message: { run_id?: string }): void {\n const handler = this.getHandlerByRunId(message.run_id);\n if (handler) {\n handler.onEvent({ type: \"cancelled\", run_id: message.run_id });\n }\n }\n\n private handleBackendInterrupt(message: { run_id?: string; interrupt_type?: string; interrupt_payload?: unknown }): void {\n const handler = this.getHandlerByRunId(message.run_id);\n if (handler) {\n // Validate interrupt_type to catch unexpected values from backend\n const validTypes: HitlInterruptType[] = [\"approval_request\", \"user_input_request\", \"user_action_request\"];\n const interruptType = message.interrupt_type as HitlInterruptType;\n if (message.interrupt_type && !validTypes.includes(interruptType)) {\n this.log(`Warning: Unknown interrupt_type '${message.interrupt_type}', proceeding anyway`);\n }\n\n handler.onEvent({\n type: \"interrupt\",\n interrupt_type: interruptType,\n interrupt_payload: message.interrupt_payload as HitlInterruptPayload,\n run_id: message.run_id,\n });\n }\n }\n\n private async handleToolCall(message: ToolCallMessage): Promise<void> {\n this.log(`handleToolCall received:`, JSON.stringify(message));\n const { id, call_id, name, arguments: args } = message;\n const msgId = id || call_id;\n\n const toolName = name.includes(\":\") ? name.split(\":\")[1] : name;\n this.log(\n `Looking for handler: '${toolName}', available handlers:`,\n Array.from(this.toolHandlers.keys())\n );\n const handler = this.toolHandlers.get(toolName);\n\n this.emit(\"tool_call\", { name: toolName, arguments: args });\n\n if (!handler) {\n await this.sendToolResult(\n msgId,\n call_id,\n false,\n undefined,\n `Tool '${toolName}' not found`\n );\n return;\n }\n\n try {\n this.log(`Executing tool '${toolName}' with args:`, args);\n const result = await Promise.race([\n handler(args),\n this.createTimeout(this.config.toolExecutionTimeout!),\n ]);\n\n this.log(`Tool '${toolName}' completed successfully`);\n await this.sendToolResult(msgId, call_id, true, result);\n } catch (e) {\n const errorMessage = e instanceof Error ? e.message : String(e);\n const errorStack = e instanceof Error ? e.stack : undefined;\n this.log(`Tool '${toolName}' failed:`, errorMessage);\n if (errorStack) {\n this.log(`Tool error stack:`, errorStack);\n }\n await this.sendToolResult(msgId, call_id, false, undefined, errorMessage);\n }\n }\n\n private async sendToolResult(\n id: string,\n callId: string,\n success: boolean,\n result?: unknown,\n error?: string\n ): Promise<void> {\n const message: ToolResultMessage = {\n id,\n type: \"tool_result\",\n call_id: callId,\n success,\n result,\n error,\n };\n\n this.log(\n `Sending tool_result for ${callId}:`,\n success ? \"success\" : `error: ${error}`\n );\n this.send(message);\n }\n\n // ============================================\n // Connection Management\n // ============================================\n\n private handleDisconnect(reason: string): void {\n this.stopHeartbeat();\n this.state.connected = false;\n this.state.registered = false;\n this.emit(\"disconnected\", reason);\n\n for (const [, pending] of this.pendingRequests) {\n pending.reject(createSDKError(SDKErrorCode.DISCONNECTED));\n }\n this.pendingRequests.clear();\n\n const disconnectError = createSDKError(SDKErrorCode.DISCONNECTED, reason);\n for (const [, handler] of this.streamHandlers) {\n handler.onError(disconnectError);\n }\n this.streamHandlers.clear();\n this.runIdToMsgId.clear();\n this.pendingStreamRequests = [];\n this.pendingCancelMsgIds.clear();\n this.activeStreamConversations.clear();\n\n if (reason === \"Client disconnect\") {\n this.log(\"Client disconnected intentionally, skipping auto-reconnect\");\n return;\n }\n\n if (reason === \"Replaced by new connection\") {\n this.log(\"Connection replaced by newer one, skipping auto-reconnect\");\n return;\n }\n\n if (this.connectingPromise) {\n this.log(\n \"Connection attempt already in progress, skipping auto-reconnect\"\n );\n return;\n }\n\n if (!this.shouldAutoReconnect()) {\n this.log(\n \"No components require reconnection (refCount=0), skipping auto-reconnect\"\n );\n return;\n }\n\n this.scheduleReconnect();\n }\n\n private shouldAutoReconnect(): boolean {\n return this.reconnectRefCount > 0;\n }\n\n acquireReconnect(): void {\n this.reconnectRefCount++;\n this.log(`acquireReconnect: refCount=${this.reconnectRefCount}`);\n }\n\n releaseReconnect(): void {\n this.reconnectRefCount = Math.max(0, this.reconnectRefCount - 1);\n this.log(`releaseReconnect: refCount=${this.reconnectRefCount}`);\n }\n\n private scheduleReconnect(): void {\n if (this.reconnectTimer) return;\n\n const baseDelay = Math.min(\n 500 * Math.pow(2, this.state.reconnectAttempts),\n 5000\n );\n const jitter = Math.random() * 500;\n const delay = baseDelay + jitter;\n\n this.log(\n `Scheduling reconnect in ${Math.round(delay)}ms (attempt ${this.state.reconnectAttempts + 1})`\n );\n\n this.reconnectTimer = setTimeout(async () => {\n this.reconnectTimer = null;\n this.state.reconnectAttempts++;\n\n try {\n await this.ensureReady();\n } catch (e) {\n console.error(\"[SDK] Reconnect failed:\", e);\n if (!this.isConnected()) {\n this.scheduleReconnect();\n }\n }\n }, delay);\n }\n\n private stopReconnect(): void {\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n }\n }\n\n // ============================================\n // Heartbeat\n // ============================================\n\n private startHeartbeat(): void {\n this.stopHeartbeat();\n this.missedHeartbeats = 0;\n this.heartbeatAckPending = false;\n\n this.heartbeatTimer = setInterval(() => {\n if (this.heartbeatAckPending) {\n this.missedHeartbeats++;\n this.warn(\n `Missed heartbeat ack (${this.missedHeartbeats}/${SanqianSDK.MAX_MISSED_HEARTBEATS})`\n );\n\n if (this.missedHeartbeats >= SanqianSDK.MAX_MISSED_HEARTBEATS) {\n this.warn(\"Too many missed heartbeat acks, connection may be dead\");\n this.ws?.close(4000, \"Heartbeat timeout\");\n return;\n }\n }\n\n const message: HeartbeatMessage = {\n type: \"heartbeat\",\n timestamp: new Date().toISOString(),\n };\n this.heartbeatAckPending = true;\n try {\n this.send(message);\n } catch (e) {\n console.error(\"[SDK] Heartbeat send failed:\", e);\n this.ws?.close(4000, \"Heartbeat send failed\");\n }\n }, this.config.heartbeatInterval);\n }\n\n private stopHeartbeat(): void {\n if (this.heartbeatTimer) {\n clearInterval(this.heartbeatTimer);\n this.heartbeatTimer = null;\n }\n }\n\n // ============================================\n // Communication\n // ============================================\n\n private send(message: object): void {\n if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {\n const error = new Error(\n `WebSocket not open (state: ${this.ws?.readyState ?? \"null\"}), cannot send message`\n );\n console.error(`[SDK] ${error.message}:`, message);\n throw error;\n }\n\n const data = JSON.stringify(message);\n this.log(`WebSocket send:`, data.substring(0, 200));\n this.ws.send(data);\n }\n\n private sendAndWait<T>(\n message: object,\n id: string,\n timeout: number\n ): Promise<T> {\n return new Promise((resolve, reject) => {\n const timer = setTimeout(() => {\n this.pendingRequests.delete(id);\n reject(createSDKError(SDKErrorCode.REQUEST_TIMEOUT));\n }, timeout);\n\n this.pendingRequests.set(id, {\n resolve: (value) => {\n clearTimeout(timer);\n resolve(value as T);\n },\n reject: (error) => {\n clearTimeout(timer);\n reject(error);\n },\n });\n\n try {\n this.send(message);\n } catch (e) {\n clearTimeout(timer);\n this.pendingRequests.delete(id);\n reject(e);\n }\n });\n }\n\n // ============================================\n // Public API\n // ============================================\n\n getState(): ConnectionState {\n return { ...this.state };\n }\n\n isConnected(): boolean {\n return this.state.connected && this.state.registered;\n }\n\n async ensureReady(): Promise<void> {\n if (this.isConnected()) {\n return;\n }\n\n if (this.connectingPromise) {\n this.log(\"Connection already in progress, waiting...\");\n return this.connectingPromise;\n }\n\n this.connectingPromise = this.doFullConnect();\n\n try {\n await this.connectingPromise;\n } finally {\n this.connectingPromise = null;\n }\n }\n\n private async doFullConnect(): Promise<void> {\n this.log(\"Starting connection (browser mode)...\");\n await this.ensureHttpReady();\n const info = this.connectionInfo || this.config.connectionInfo;\n if (!info) {\n throw createSDKError(\n SDKErrorCode.NOT_RUNNING,\n \"Connection info not available in browser mode\"\n );\n }\n await this.connectWithInfo(info);\n }\n\n async updateTools(tools: ToolDefinition[]): Promise<void> {\n this.toolHandlers.clear();\n for (const tool of tools) {\n this.toolHandlers.set(tool.name, tool.handler);\n }\n\n if (this.isConnected()) {\n const msgId = this.generateId();\n const message = {\n id: msgId,\n type: \"tools_update\",\n tools: tools.map((t) => ({\n name: `${this.config.appName}:${t.name}`,\n description: t.description,\n parameters: t.parameters,\n searchable: t.searchable ?? true,\n })),\n };\n\n await this.sendAndWait(message, msgId, 5000);\n }\n }\n\n // ============================================\n // Private Agent API\n // ============================================\n\n async createAgent(config: AgentConfig): Promise<AgentInfo> {\n await this.ensureReady();\n\n const msgId = this.generateId();\n const message: CreateAgentMessage = {\n id: msgId,\n type: \"create_agent\",\n agent: config,\n };\n\n const response = await this.sendAndWait<CreateAgentAckMessage>(\n message,\n msgId,\n 10000\n );\n\n if (!response.success) {\n throw createSDKError(SDKErrorCode.AGENT_NOT_FOUND, response.error);\n }\n\n if (response.agent) {\n return response.agent;\n }\n\n return {\n agent_id: response.agent_id!,\n name: config.name,\n description: config.description,\n tools: config.tools || [],\n skills: config.skills || [],\n };\n }\n\n async listAgents(): Promise<AgentInfo[]> {\n await this.ensureReady();\n\n const msgId = this.generateId();\n const message: ListAgentsMessage = {\n id: msgId,\n type: \"list_agents\",\n };\n\n const response = await this.sendAndWait<ListAgentsAckMessage>(\n message,\n msgId,\n 10000\n );\n\n if (response.error) {\n throw new Error(response.error);\n }\n\n return response.agents;\n }\n\n async deleteAgent(agentId: string): Promise<void> {\n await this.ensureReady();\n\n const msgId = this.generateId();\n const message: DeleteAgentMessage = {\n id: msgId,\n type: \"delete_agent\",\n agent_id: agentId,\n };\n\n const response = await this.sendAndWait<DeleteAgentAckMessage>(\n message,\n msgId,\n 10000\n );\n\n if (!response.success) {\n throw createSDKError(SDKErrorCode.AGENT_NOT_FOUND, response.error);\n }\n }\n\n async updateAgent(\n agentId: string,\n updates: Omit<AgentUpdateConfig, \"agent_id\">\n ): Promise<AgentInfo> {\n await this.ensureReady();\n\n const msgId = this.generateId();\n const message: UpdateAgentMessage = {\n id: msgId,\n type: \"update_agent\",\n agent_id: agentId,\n updates,\n };\n\n const response = await this.sendAndWait<UpdateAgentAckMessage>(\n message,\n msgId,\n 10000\n );\n\n if (!response.success || !response.agent) {\n throw createSDKError(SDKErrorCode.AGENT_NOT_FOUND, response.error);\n }\n\n return response.agent;\n }\n\n // ============================================\n // Conversation API\n // ============================================\n\n async listConversations(options?: {\n agentId?: string;\n limit?: number;\n offset?: number;\n }): Promise<{ conversations: ConversationInfo[]; total: number }> {\n await this.ensureReady();\n\n const msgId = this.generateId();\n const message: ListConversationsMessage = {\n id: msgId,\n type: \"list_conversations\",\n agent_id: options?.agentId,\n limit: options?.limit,\n offset: options?.offset,\n };\n\n const response = await this.sendAndWait<ListConversationsAckMessage>(\n message,\n msgId,\n 10000\n );\n\n if (response.error) {\n throw new Error(response.error);\n }\n\n return {\n conversations: response.conversations,\n total: response.total,\n };\n }\n\n private getHttpBaseUrl(): string {\n const info = this.connectionInfo || this.config.connectionInfo;\n if (!info) {\n throw new Error(\"Connection info not available\");\n }\n const protocol = info.ws_protocol === \"wss\" ? \"https\" : \"http\";\n const host = info.ws_host || \"127.0.0.1\";\n return `${protocol}://${host}:${info.port}`;\n }\n\n private getHttpAuthHeaders(): Record<string, string> {\n const info = this.connectionInfo || this.config.connectionInfo;\n const token = info?.token;\n return token ? { \"X-App-Token\": token } : {};\n }\n\n private async ensureHttpReady(): Promise<void> {\n const info = this.connectionInfo || this.config.connectionInfo;\n if (!info) {\n throw createSDKError(\n SDKErrorCode.NOT_RUNNING,\n \"Connection info not available for HTTP API in browser build\"\n );\n }\n this.connectionInfo = info;\n }\n\n /**\n * Get the port number for the Sanqian backend\n * @throws Error if not connected\n */\n getPort(): number {\n const info = this.connectionInfo || this.config.connectionInfo;\n if (!info) {\n throw new Error(\"Connection info not available\");\n }\n return info.port;\n }\n\n /**\n * Get the HTTP base URL for Sanqian backend.\n *\n * @throws Error if connection info is not available\n */\n getBaseUrl(): string {\n return this.getHttpBaseUrl();\n }\n\n /**\n * Get conversation messages via history API (aligned with main app history)\n */\n async getMessages(\n conversationId: string,\n options?: { limit?: number; offset?: number }\n ): Promise<import(\"./types\").ConversationHistoryResult> {\n await this.ensureReady();\n\n const params = new URLSearchParams({ session_id: conversationId });\n if (options?.limit !== undefined) params.append(\"limit\", String(options.limit));\n if (options?.offset !== undefined) params.append(\"offset\", String(options.offset));\n\n const url = `${this.getHttpBaseUrl()}/api/sdk/history?${params.toString()}`;\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`Failed to fetch messages: ${response.statusText}`);\n }\n return (await response.json()) as import(\"./types\").ConversationHistoryResult;\n }\n\n async getConversation(\n conversationId: string,\n options?: {\n includeMessages?: boolean;\n messageLimit?: number;\n messageOffset?: number;\n }\n ): Promise<ConversationDetail> {\n await this.ensureReady();\n\n const msgId = this.generateId();\n const message: GetConversationMessage = {\n id: msgId,\n type: \"get_conversation\",\n conversation_id: conversationId,\n include_messages: options?.includeMessages ?? true,\n message_limit: options?.messageLimit,\n message_offset: options?.messageOffset,\n };\n\n const response = await this.sendAndWait<GetConversationAckMessage>(\n message,\n msgId,\n 10000\n );\n\n if (!response.success || !response.conversation) {\n throw createSDKError(SDKErrorCode.CONVERSATION_NOT_FOUND, response.error);\n }\n\n return response.conversation;\n }\n\n async deleteConversation(conversationId: string): Promise<void> {\n await this.ensureReady();\n\n const msgId = this.generateId();\n const message: DeleteConversationMessage = {\n id: msgId,\n type: \"delete_conversation\",\n conversation_id: conversationId,\n };\n\n const response = await this.sendAndWait<DeleteConversationAckMessage>(\n message,\n msgId,\n 10000\n );\n\n if (!response.success) {\n throw createSDKError(SDKErrorCode.CONVERSATION_NOT_FOUND, response.error);\n }\n }\n\n // ============================================\n // Chat API\n // ============================================\n\n private streamHandlers: Map<\n string,\n {\n onEvent: (event: ChatStreamEvent) => void;\n onDone: (response: ChatResponse) => void;\n onError: (error: Error) => void;\n }\n > = new Map();\n\n async chat(\n agentId: string,\n messages: ChatMessage[],\n options?: {\n conversationId?: string;\n remoteTools?: RemoteToolDefinition[];\n autoDiscoverSkills?: boolean;\n autoDiscoverTools?: boolean;\n autoDiscoverSubagents?: boolean;\n persistHistory?: boolean;\n filePaths?: string[];\n loadItems?: LoadItem[];\n mentionedTools?: string[];\n }\n ): Promise<ChatResponse> {\n await this.ensureReady();\n\n const msgId = this.generateId();\n const message: ChatRequestMessage = {\n id: msgId,\n type: \"chat\",\n request_id: msgId,\n agent_id: agentId,\n messages,\n conversation_id: options?.conversationId,\n stream: false,\n persist_history: options?.persistHistory ?? false,\n auto_discover_skills: options?.autoDiscoverSkills ?? false,\n auto_discover_tools: options?.autoDiscoverTools ?? false,\n auto_discover_subagents: options?.autoDiscoverSubagents ?? false,\n file_paths: options?.filePaths,\n load_items: options?.loadItems,\n mentioned_tools: options?.mentionedTools,\n remote_tools: options?.remoteTools?.map((t) => ({\n name: t.name,\n description: t.description,\n parameters: t.parameters,\n })),\n };\n\n const response = await this.sendAndWait<ChatResponseMessage>(\n message,\n msgId,\n 600000\n );\n\n if (!response.success) {\n const errorLower = (response.error || \"\").toLowerCase();\n if (errorLower.includes(\"agent\") && errorLower.includes(\"not found\")) {\n throw createSDKError(SDKErrorCode.AGENT_NOT_FOUND, response.error);\n }\n throw createSDKError(SDKErrorCode.REQUEST_FAILED, response.error);\n }\n\n return {\n message: response.message!,\n conversationId: response.conversation_id || \"\",\n title: response.title,\n usage: response.usage,\n };\n }\n\n async *chatStream(\n agentId: string,\n messages: ChatMessage[],\n options?: {\n conversationId?: string;\n remoteTools?: RemoteToolDefinition[];\n autoDiscoverSkills?: boolean;\n autoDiscoverTools?: boolean;\n autoDiscoverSubagents?: boolean;\n persistHistory?: boolean;\n attachedContexts?: string[];\n attachedResources?: string[];\n sessionResources?: string[];\n filePaths?: string[];\n loadItems?: LoadItem[];\n mentionedTools?: string[];\n signal?: AbortSignal;\n }\n ): AsyncGenerator<ChatStreamEvent> {\n await this.ensureReady();\n\n const msgId = this.generateId();\n const message: ChatRequestMessage = {\n id: msgId,\n type: \"chat\",\n request_id: msgId,\n agent_id: agentId,\n messages,\n conversation_id: options?.conversationId,\n stream: true,\n persist_history: options?.persistHistory ?? false,\n auto_discover_skills: options?.autoDiscoverSkills ?? false,\n auto_discover_tools: options?.autoDiscoverTools ?? false,\n auto_discover_subagents: options?.autoDiscoverSubagents ?? false,\n attached_contexts: options?.attachedContexts,\n attached_resources: options?.attachedResources,\n session_resources: options?.sessionResources,\n file_paths: options?.filePaths,\n load_items: options?.loadItems,\n mentioned_tools: options?.mentionedTools,\n remote_tools: options?.remoteTools?.map((t) => ({\n name: t.name,\n description: t.description,\n parameters: t.parameters,\n })),\n };\n\n const eventQueue: ChatStreamEvent[] = [];\n let done = false;\n let error: Error | null = null;\n let resolveNext: (() => void) | null = null;\n let activeRunId: string | undefined;\n\n if (options?.signal?.aborted) {\n throw createSDKError(\n SDKErrorCode.REQUEST_FAILED,\n \"Chat stream aborted before request was sent\"\n );\n }\n\n const handleAbort = () => {\n try {\n this.requestStreamCancel(msgId, activeRunId);\n } catch (e) {\n error = e instanceof Error ? e : new Error(String(e));\n resolveNext?.();\n }\n };\n\n this.reserveConversationStream(options?.conversationId);\n options?.signal?.addEventListener(\"abort\", handleAbort, { once: true });\n\n this.streamHandlers.set(msgId, {\n onEvent: (event) => {\n eventQueue.push(event);\n if (event.type === \"start\") {\n activeRunId = event.run_id;\n this.pendingStreamRequests = this.pendingStreamRequests.filter((item) => item.msgId !== msgId);\n if (this.pendingCancelMsgIds.has(msgId)) {\n try {\n this.requestStreamCancel(msgId, activeRunId);\n } catch (e) {\n error = e instanceof Error ? e : new Error(String(e));\n }\n }\n }\n if (event.type === \"cancelled\") {\n done = true;\n }\n resolveNext?.();\n },\n onDone: (response) => {\n eventQueue.push({\n type: \"done\",\n conversationId: response.conversationId,\n title: response.title,\n });\n done = true;\n resolveNext?.();\n },\n onError: (e) => {\n error = e;\n resolveNext?.();\n },\n });\n\n try {\n // Track pending stream for backend-native start routing (start has no msgId)\n this.pendingStreamRequests.push({\n msgId,\n conversationId: options?.conversationId,\n });\n\n this.send(message);\n\n while (!done && !error) {\n if (eventQueue.length > 0) {\n yield eventQueue.shift()!;\n } else {\n await new Promise<void>((resolve) => {\n resolveNext = resolve;\n });\n resolveNext = null;\n }\n }\n\n while (eventQueue.length > 0) {\n yield eventQueue.shift()!;\n }\n\n if (error) {\n throw error;\n }\n } finally {\n options?.signal?.removeEventListener(\"abort\", handleAbort);\n this.streamHandlers.delete(msgId);\n this.pendingStreamRequests = this.pendingStreamRequests.filter((item) => item.msgId !== msgId);\n this.pendingCancelMsgIds.delete(msgId);\n this.releaseConversationStream(options?.conversationId);\n // Clean up run_id -> msgId mapping\n for (const [runId, id] of this.runIdToMsgId) {\n if (id === msgId) {\n this.runIdToMsgId.delete(runId);\n }\n }\n }\n }\n\n /**\n * Send HITL (Human-in-the-Loop) response to resume after interrupt\n *\n * Call this after receiving an \"interrupt\" event in chatStream.\n *\n * @param runId - The run_id from the interrupt event\n * @param response - User's response (approval, input, etc.)\n */\n sendHitlResponse(runId: string, response: HitlResponse): void {\n if (!this.state.connected) {\n throw createSDKError(SDKErrorCode.DISCONNECTED, \"Not connected to Sanqian\");\n }\n\n const message: HitlResponseMessage = {\n type: \"hitl_response\",\n run_id: runId,\n response,\n };\n\n this.send(message);\n this.log(`Sent HITL response for run ${runId}`);\n }\n\n /**\n * Cancel an in-flight chat run\n *\n * @param runId - The run_id from the stream \"start\"/\"interrupt\" event\n */\n cancelRun(runId: string): void {\n if (!this.state.connected) {\n throw createSDKError(SDKErrorCode.DISCONNECTED, \"Not connected to Sanqian\");\n }\n this.sendRunCancel(runId);\n }\n\n startConversation(agentId: string): Conversation {\n return new Conversation(this, agentId);\n }\n\n // ============================================\n // Embedding Config API\n // ============================================\n\n /**\n * Get embedding configuration from Sanqian\n *\n * Returns the current embedding model configuration including API URL, key, and model name.\n * This allows external apps to use the same embedding service configured in Sanqian.\n */\n async getEmbeddingConfig(): Promise<EmbeddingConfigResult> {\n await this.ensureReady();\n\n const msgId = this.generateId();\n const message: GetEmbeddingConfigMessage = {\n id: msgId,\n type: \"get_embedding_config\",\n };\n\n const response = await this.sendAndWait<GetEmbeddingConfigAckMessage>(message, msgId, 10000);\n\n if (!response.success) {\n this.log(`getEmbeddingConfig failed: ${response.error}`);\n return { available: false };\n }\n\n return response.config || { available: false };\n }\n\n // ============================================\n // Rerank Config API\n // ============================================\n\n /**\n * Get rerank configuration from Sanqian\n *\n * Returns the current rerank model configuration including API URL, key, and model name.\n * This allows external apps to use the same rerank service configured in Sanqian.\n */\n async getRerankConfig(): Promise<RerankConfigResult> {\n await this.ensureReady();\n\n const msgId = this.generateId();\n const message: GetRerankConfigMessage = {\n id: msgId,\n type: \"get_rerank_config\",\n };\n\n const response = await this.sendAndWait<GetRerankConfigAckMessage>(message, msgId, 10000);\n\n if (!response.success) {\n this.log(`getRerankConfig failed: ${response.error}`);\n return { available: false };\n }\n\n return response.config || { available: false };\n }\n\n // ============================================\n // Session Resources API\n // ============================================\n\n /**\n * Push a session resource to Sanqian\n *\n * Session resources are temporary context pushed by the app, visible in all Chat UI instances.\n * They persist until the app disconnects or explicitly removes them.\n */\n async pushResource(resource: SessionResource): Promise<StoredSessionResource> {\n await this.ensureReady();\n\n const msgId = this.generateId();\n const message: ResourcePushMessage = {\n id: msgId,\n type: \"resource_push\",\n resource,\n };\n\n const response = await this.sendAndWait<ResourcePushAckMessage>(message, msgId, 10000);\n\n if (!response.success || !response.resourceId) {\n throw createSDKError(SDKErrorCode.REQUEST_FAILED, response.error || \"Failed to push resource\");\n }\n\n const stored: StoredSessionResource = {\n ...resource,\n fullId: response.resourceId,\n appName: this.config.appName,\n pushedAt: new Date().toISOString(),\n };\n\n this.sessionResources.set(stored.fullId, stored);\n this.emit(\"resourcePushed\", stored);\n this.log(`Pushed resource: ${stored.fullId}`);\n return stored;\n }\n\n /**\n * Remove a session resource\n */\n async removeResource(resourceId: string): Promise<void> {\n await this.ensureReady();\n\n const msgId = this.generateId();\n const message: ResourceRemoveMessage = {\n id: msgId,\n type: \"resource_remove\",\n resourceId,\n };\n\n const response = await this.sendAndWait<ResourceRemoveAckMessage>(message, msgId, 10000);\n\n if (!response.success) {\n throw createSDKError(SDKErrorCode.REQUEST_FAILED, response.error || \"Failed to remove resource\");\n }\n\n this.sessionResources.delete(resourceId);\n this.emit(\"resourceRemoved\", resourceId);\n this.log(`Removed resource: ${resourceId}`);\n }\n\n /**\n * Clear all session resources pushed by this app\n */\n async clearResources(): Promise<void> {\n await this.ensureReady();\n\n const msgId = this.generateId();\n const message: ResourceClearMessage = {\n id: msgId,\n type: \"resource_clear\",\n };\n\n const response = await this.sendAndWait<ResourceClearAckMessage>(message, msgId, 10000);\n\n if (!response.success) {\n throw createSDKError(SDKErrorCode.REQUEST_FAILED, response.error || \"Failed to clear resources\");\n }\n\n this.sessionResources.clear();\n this.emit(\"resourcesCleared\", this.config.appName);\n this.log(\"Cleared all resources\");\n }\n\n /**\n * Get all session resources pushed by this app (local cache)\n */\n getSessionResources(): StoredSessionResource[] {\n return Array.from(this.sessionResources.values());\n }\n\n /**\n * Fetch session resources from server\n */\n async fetchSessionResources(agentId?: string): Promise<StoredSessionResource[]> {\n await this.ensureReady();\n\n let url = `${this.getHttpBaseUrl()}/api/sdk/session-resources`;\n if (agentId) {\n const params = new URLSearchParams({ agent_id: agentId });\n url += `?${params.toString()}`;\n }\n\n const response = await fetch(url);\n\n if (!response.ok) {\n throw createSDKError(\n SDKErrorCode.REQUEST_FAILED,\n `Failed to fetch session resources: ${response.statusText}`\n );\n }\n\n return response.json() as Promise<StoredSessionResource[]>;\n }\n\n // ============================================\n // Capability Discovery API\n // ============================================\n\n /**\n * List available capabilities (tools, skills, agents)\n */\n async listCapabilities(options?: ListCapabilitiesOptions): Promise<Capability[]> {\n await this.ensureReady();\n\n const params = new URLSearchParams();\n if (options?.type && options.type !== \"all\") {\n params.append(\"type\", options.type);\n }\n if (options?.source) {\n params.append(\"source\", options.source);\n }\n if (options?.category) {\n params.append(\"category\", options.category);\n }\n if (options?.appName) {\n params.append(\"appName\", options.appName);\n }\n if (options?.scope) {\n params.append(\"scope\", options.scope);\n }\n\n const url = `${this.getHttpBaseUrl()}/api/capabilities?${params.toString()}`;\n const response = await fetch(url);\n\n if (!response.ok) {\n throw createSDKError(\n SDKErrorCode.REQUEST_FAILED,\n `Failed to list capabilities: ${response.statusText}`\n );\n }\n\n return response.json() as Promise<Capability[]>;\n }\n\n /**\n * Search capabilities by query using hybrid search (BM25 + Vector)\n */\n async searchCapabilities(\n query: string,\n options?: SearchCapabilitiesOptions\n ): Promise<CapabilitySearchResult[]> {\n await this.ensureReady();\n\n const params = new URLSearchParams({ query });\n if (options?.type && options.type !== \"all\") {\n params.append(\"type\", options.type);\n }\n if (options?.limit) {\n params.append(\"limit\", String(options.limit));\n }\n\n const url = `${this.getHttpBaseUrl()}/api/capabilities/search?${params.toString()}`;\n const response = await fetch(url);\n\n if (!response.ok) {\n throw createSDKError(\n SDKErrorCode.REQUEST_FAILED,\n `Failed to search capabilities: ${response.statusText}`\n );\n }\n\n return response.json() as Promise<CapabilitySearchResult[]>;\n }\n\n /**\n * List available tools\n */\n async listTools(source?: \"builtin\" | \"sdk\" | \"mcp\"): Promise<ToolCapability[]> {\n const caps = await this.listCapabilities({ type: \"tool\", source });\n return caps as ToolCapability[];\n }\n\n /**\n * List available skills\n */\n async listSkills(): Promise<SkillCapability[]> {\n const caps = await this.listCapabilities({ type: \"skill\" });\n return caps as SkillCapability[];\n }\n\n /**\n * List all available agents\n */\n async listAvailableAgents(): Promise<AgentCapability[]> {\n const caps = await this.listCapabilities({\n type: \"agent\",\n appName: this.config.appName,\n scope: \"available\",\n });\n return caps as AgentCapability[];\n }\n\n // ============================================\n // Context API\n // ============================================\n\n /**\n * Update context providers dynamically\n */\n async updateContexts(contexts: ContextProvider[]): Promise<void> {\n this.contextProviders.clear();\n for (const provider of contexts) {\n this.contextProviders.set(provider.id, provider);\n }\n\n this.config.contexts = contexts;\n\n if (this.isConnected()) {\n const msgId = this.generateId();\n const message = {\n id: msgId,\n type: \"contexts_update\",\n contexts: contexts.map((c) => ({\n id: `${this.config.appName}:${c.id}`,\n name: c.name,\n description: c.description,\n has_get_current: !!c.getCurrent,\n has_get_list: !!c.getList,\n has_get_by_id: !!c.getById,\n })),\n };\n\n await this.sendAndWait(message, msgId, 5000);\n }\n }\n\n // ============================================\n // Events\n // ============================================\n\n on<T extends SDKEventName>(event: T, listener: SDKEvents[T]): this {\n if (!this.eventListeners.has(event)) {\n this.eventListeners.set(event, new Set());\n }\n this.eventListeners.get(event)!.add(listener as EventListener<SDKEventName>);\n return this;\n }\n\n off<T extends SDKEventName>(event: T, listener: SDKEvents[T]): this {\n this.eventListeners\n .get(event)\n ?.delete(listener as EventListener<SDKEventName>);\n return this;\n }\n\n once<T extends SDKEventName>(event: T, listener: SDKEvents[T]): this {\n const onceWrapper = ((...args: Parameters<SDKEvents[T]>) => {\n this.off(event, onceWrapper as SDKEvents[T]);\n (listener as (...args: unknown[]) => void)(...args);\n }) as SDKEvents[T];\n return this.on(event, onceWrapper);\n }\n\n /**\n * Remove all event listeners\n *\n * Call this to prevent memory leaks when disposing the SDK instance.\n * If event is specified, only removes listeners for that event.\n */\n removeAllListeners(event?: SDKEventName): this {\n if (event) {\n this.eventListeners.delete(event);\n } else {\n this.eventListeners.clear();\n }\n return this;\n }\n\n private emit<T extends SDKEventName>(\n event: T,\n ...args: Parameters<SDKEvents[T]>\n ): void {\n const listeners = this.eventListeners.get(event);\n if (listeners) {\n for (const listener of listeners) {\n try {\n (listener as (...args: unknown[]) => void)(...args);\n } catch (e) {\n console.error(`[SDK] Event listener error for '${event}':`, e);\n }\n }\n }\n }\n\n // ============================================\n // Channels\n // ============================================\n\n async listChannelPlugins(): Promise<ChannelPluginInfo[]> {\n await this.ensureHttpReady();\n const url = `${this.getHttpBaseUrl()}/api/channels/plugins`;\n const response = await fetch(url, { headers: this.getHttpAuthHeaders() });\n if (!response.ok) {\n throw createSDKError(SDKErrorCode.REQUEST_FAILED, `Failed to list channel plugins: ${response.statusText}`);\n }\n return response.json() as Promise<ChannelPluginInfo[]>;\n }\n\n async listChannelAccounts(): Promise<ChannelAccount[]> {\n await this.ensureHttpReady();\n const url = `${this.getHttpBaseUrl()}/api/channels/accounts`;\n const response = await fetch(url, { headers: this.getHttpAuthHeaders() });\n if (!response.ok) {\n throw createSDKError(SDKErrorCode.REQUEST_FAILED, `Failed to list channel accounts: ${response.statusText}`);\n }\n return response.json() as Promise<ChannelAccount[]>;\n }\n\n async createChannelAccount(req: CreateChannelAccountRequest): Promise<ChannelAccount> {\n await this.ensureHttpReady();\n const url = `${this.getHttpBaseUrl()}/api/channels/accounts`;\n const response = await fetch(url, {\n method: \"POST\",\n headers: { ...this.getHttpAuthHeaders(), \"Content-Type\": \"application/json\" },\n body: JSON.stringify(req),\n });\n if (!response.ok) {\n const detail = await response.text();\n throw createSDKError(SDKErrorCode.REQUEST_FAILED, `Failed to create channel account: ${detail}`);\n }\n return response.json() as Promise<ChannelAccount>;\n }\n\n async getChannelAccount(id: string): Promise<ChannelAccount> {\n await this.ensureHttpReady();\n const url = `${this.getHttpBaseUrl()}/api/channels/accounts/${encodeURIComponent(id)}`;\n const response = await fetch(url, { headers: this.getHttpAuthHeaders() });\n if (!response.ok) {\n throw createSDKError(SDKErrorCode.REQUEST_FAILED, `Failed to get channel account: ${response.statusText}`);\n }\n return response.json() as Promise<ChannelAccount>;\n }\n\n async updateChannelAccount(id: string, req: UpdateChannelAccountRequest): Promise<ChannelAccount> {\n await this.ensureHttpReady();\n const url = `${this.getHttpBaseUrl()}/api/channels/accounts/${encodeURIComponent(id)}`;\n const response = await fetch(url, {\n method: \"PUT\",\n headers: { ...this.getHttpAuthHeaders(), \"Content-Type\": \"application/json\" },\n body: JSON.stringify(req),\n });\n if (!response.ok) {\n const detail = await response.text();\n throw createSDKError(SDKErrorCode.REQUEST_FAILED, `Failed to update channel account: ${detail}`);\n }\n return response.json() as Promise<ChannelAccount>;\n }\n\n async deleteChannelAccount(id: string): Promise<void> {\n await this.ensureHttpReady();\n const url = `${this.getHttpBaseUrl()}/api/channels/accounts/${encodeURIComponent(id)}`;\n const response = await fetch(url, { method: \"DELETE\", headers: this.getHttpAuthHeaders() });\n if (!response.ok) {\n throw createSDKError(SDKErrorCode.REQUEST_FAILED, `Failed to delete channel account: ${response.statusText}`);\n }\n }\n\n async startChannelAccount(id: string): Promise<{ status: string }> {\n await this.ensureHttpReady();\n const url = `${this.getHttpBaseUrl()}/api/channels/accounts/${encodeURIComponent(id)}/start`;\n const response = await fetch(url, { method: \"POST\", headers: this.getHttpAuthHeaders() });\n if (!response.ok) {\n const detail = await response.text();\n throw createSDKError(SDKErrorCode.REQUEST_FAILED, `Failed to start channel account: ${detail}`);\n }\n return response.json() as Promise<{ status: string }>;\n }\n\n async stopChannelAccount(id: string): Promise<{ status: string }> {\n await this.ensureHttpReady();\n const url = `${this.getHttpBaseUrl()}/api/channels/accounts/${encodeURIComponent(id)}/stop`;\n const response = await fetch(url, { method: \"POST\", headers: this.getHttpAuthHeaders() });\n if (!response.ok) {\n throw createSDKError(SDKErrorCode.REQUEST_FAILED, `Failed to stop channel account: ${response.statusText}`);\n }\n return response.json() as Promise<{ status: string }>;\n }\n\n async getChannelStatus(id: string): Promise<ChannelStatus> {\n await this.ensureHttpReady();\n const url = `${this.getHttpBaseUrl()}/api/channels/accounts/${encodeURIComponent(id)}/status`;\n const response = await fetch(url, { headers: this.getHttpAuthHeaders() });\n if (!response.ok) {\n throw createSDKError(SDKErrorCode.REQUEST_FAILED, `Failed to get channel status: ${response.statusText}`);\n }\n return response.json() as Promise<ChannelStatus>;\n }\n\n async probeChannelAccount(id: string): Promise<ChannelProbeResult> {\n await this.ensureHttpReady();\n const url = `${this.getHttpBaseUrl()}/api/channels/accounts/${encodeURIComponent(id)}/probe`;\n const response = await fetch(url, { method: \"POST\", headers: this.getHttpAuthHeaders() });\n if (!response.ok) {\n const detail = await response.text();\n throw createSDKError(SDKErrorCode.REQUEST_FAILED, `Failed to probe channel account: ${detail}`);\n }\n return response.json() as Promise<ChannelProbeResult>;\n }\n\n async probeChannelConfig(req: ProbeChannelConfigRequest): Promise<ChannelProbeResult> {\n await this.ensureHttpReady();\n const url = `${this.getHttpBaseUrl()}/api/channels/probe-config`;\n const response = await fetch(url, {\n method: \"POST\",\n headers: { ...this.getHttpAuthHeaders(), \"Content-Type\": \"application/json\" },\n body: JSON.stringify(req),\n });\n if (!response.ok) {\n const detail = await response.text();\n throw createSDKError(SDKErrorCode.REQUEST_FAILED, `Failed to probe channel config: ${detail}`);\n }\n return response.json() as Promise<ChannelProbeResult>;\n }\n\n async getChannelConfigSchema(channelType: string): Promise<ChannelConfigSchema> {\n await this.ensureHttpReady();\n const url = `${this.getHttpBaseUrl()}/api/channels/plugins/${encodeURIComponent(channelType)}/config-schema`;\n const response = await fetch(url, { headers: this.getHttpAuthHeaders() });\n if (!response.ok) {\n const detail = await response.text();\n throw createSDKError(SDKErrorCode.REQUEST_FAILED, `Failed to get channel config schema: ${detail}`);\n }\n return response.json() as Promise<ChannelConfigSchema>;\n }\n\n async listChannelBindings(accountId?: string): Promise<ChannelBinding[]> {\n await this.ensureHttpReady();\n const params = accountId ? `?account_id=${encodeURIComponent(accountId)}` : \"\";\n const url = `${this.getHttpBaseUrl()}/api/channels/bindings${params}`;\n const response = await fetch(url, { headers: this.getHttpAuthHeaders() });\n if (!response.ok) {\n throw createSDKError(SDKErrorCode.REQUEST_FAILED, `Failed to list channel bindings: ${response.statusText}`);\n }\n return response.json() as Promise<ChannelBinding[]>;\n }\n\n async createChannelBinding(req: CreateChannelBindingRequest): Promise<ChannelBinding> {\n await this.ensureHttpReady();\n const url = `${this.getHttpBaseUrl()}/api/channels/bindings`;\n const response = await fetch(url, {\n method: \"POST\",\n headers: { ...this.getHttpAuthHeaders(), \"Content-Type\": \"application/json\" },\n body: JSON.stringify(req),\n });\n if (!response.ok) {\n const detail = await response.text();\n throw createSDKError(SDKErrorCode.REQUEST_FAILED, `Failed to create channel binding: ${detail}`);\n }\n return response.json() as Promise<ChannelBinding>;\n }\n\n async updateChannelBinding(id: string, req: UpdateChannelBindingRequest): Promise<ChannelBinding> {\n await this.ensureHttpReady();\n const url = `${this.getHttpBaseUrl()}/api/channels/bindings/${encodeURIComponent(id)}`;\n const response = await fetch(url, {\n method: \"PUT\",\n headers: { ...this.getHttpAuthHeaders(), \"Content-Type\": \"application/json\" },\n body: JSON.stringify(req),\n });\n if (!response.ok) {\n const detail = await response.text();\n throw createSDKError(SDKErrorCode.REQUEST_FAILED, `Failed to update channel binding: ${detail}`);\n }\n return response.json() as Promise<ChannelBinding>;\n }\n\n async deleteChannelBinding(id: string): Promise<void> {\n await this.ensureHttpReady();\n const url = `${this.getHttpBaseUrl()}/api/channels/bindings/${encodeURIComponent(id)}`;\n const response = await fetch(url, { method: \"DELETE\", headers: this.getHttpAuthHeaders() });\n if (!response.ok) {\n throw createSDKError(SDKErrorCode.REQUEST_FAILED, `Failed to delete channel binding: ${response.statusText}`);\n }\n }\n\n async sendChannelMessage(req: SendChannelMessageRequest): Promise<SendChannelMessageResponse> {\n await this.ensureHttpReady();\n const url = `${this.getHttpBaseUrl()}/api/channels/send`;\n const response = await fetch(url, {\n method: \"POST\",\n headers: { ...this.getHttpAuthHeaders(), \"Content-Type\": \"application/json\" },\n body: JSON.stringify(req),\n });\n if (!response.ok) {\n const detail = await response.text();\n throw createSDKError(SDKErrorCode.REQUEST_FAILED, `Failed to send channel message: ${detail}`);\n }\n return response.json() as Promise<SendChannelMessageResponse>;\n }\n\n // ============================================\n // Utilities\n // ============================================\n\n private generateId(): string {\n return `${Date.now()}-${Math.random().toString(36).substring(2, 9)}`;\n }\n\n private createTimeout(ms: number): Promise<never> {\n return new Promise((_, reject) => {\n setTimeout(\n () => reject(createSDKError(SDKErrorCode.TOOL_EXECUTION_TIMEOUT)),\n ms\n );\n });\n }\n}\n\n/**\n * Conversation helper for multi-turn chat\n */\nexport class Conversation {\n private sdk: SanqianSDK;\n private agentId: string;\n private _conversationId: string | null = null;\n\n constructor(sdk: SanqianSDK, agentId: string, conversationId?: string) {\n this.sdk = sdk;\n this.agentId = agentId;\n this._conversationId = conversationId || null;\n }\n\n get id(): string | null {\n return this._conversationId;\n }\n\n async send(\n content: string,\n options?: { remoteTools?: RemoteToolDefinition[] }\n ): Promise<ChatResponse> {\n const response = await this.sdk.chat(\n this.agentId,\n [{ role: \"user\", content }],\n {\n conversationId: this._conversationId || undefined,\n // Conversation helper is stateful by design: first turn must create server-side history.\n persistHistory: this._conversationId ? undefined : true,\n remoteTools: options?.remoteTools,\n }\n );\n\n if (response.conversationId && !this._conversationId) {\n this._conversationId = response.conversationId;\n }\n\n return response;\n }\n\n async *sendStream(\n content: string,\n options?: { remoteTools?: RemoteToolDefinition[] }\n ): AsyncGenerator<ChatStreamEvent> {\n const stream = this.sdk.chatStream(\n this.agentId,\n [{ role: \"user\", content }],\n {\n conversationId: this._conversationId || undefined,\n // Conversation helper is stateful by design: first turn must create server-side history.\n persistHistory: this._conversationId ? undefined : true,\n remoteTools: options?.remoteTools,\n }\n );\n\n for await (const event of stream) {\n if (\n event.type === \"done\" &&\n event.conversationId &&\n !this._conversationId\n ) {\n this._conversationId = event.conversationId;\n }\n yield event;\n }\n }\n\n async delete(): Promise<void> {\n if (!this._conversationId) {\n throw new Error(\"No conversation to delete\");\n }\n await this.sdk.deleteConversation(this._conversationId);\n this._conversationId = null;\n }\n\n async getDetails(options?: {\n messageLimit?: number;\n }): Promise<ConversationDetail> {\n if (!this._conversationId) {\n throw new Error(\"No conversation to get details for\");\n }\n return this.sdk.getConversation(this._conversationId, {\n includeMessages: true,\n messageLimit: options?.messageLimit,\n });\n }\n}\n"],"mappings":"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","names":["SDKErrorCode"]}