@witqq/agent-sdk 0.6.1 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (145) hide show
  1. package/README.md +539 -6
  2. package/dist/{types-BvwNzZCj.d.cts → agent-CW9XbmG_.d.ts} +148 -95
  3. package/dist/{types-BvwNzZCj.d.ts → agent-DxY68NZL.d.cts} +148 -95
  4. package/dist/auth/index.cjs +260 -2
  5. package/dist/auth/index.cjs.map +1 -1
  6. package/dist/auth/index.d.cts +21 -138
  7. package/dist/auth/index.d.ts +21 -138
  8. package/dist/auth/index.js +260 -3
  9. package/dist/auth/index.js.map +1 -1
  10. package/dist/backends/claude.cjs +653 -140
  11. package/dist/backends/claude.cjs.map +1 -1
  12. package/dist/backends/claude.d.cts +4 -1
  13. package/dist/backends/claude.d.ts +4 -1
  14. package/dist/backends/claude.js +653 -140
  15. package/dist/backends/claude.js.map +1 -1
  16. package/dist/backends/copilot.cjs +428 -88
  17. package/dist/backends/copilot.cjs.map +1 -1
  18. package/dist/backends/copilot.d.cts +13 -4
  19. package/dist/backends/copilot.d.ts +13 -4
  20. package/dist/backends/copilot.js +428 -88
  21. package/dist/backends/copilot.js.map +1 -1
  22. package/dist/backends/vercel-ai.cjs +349 -77
  23. package/dist/backends/vercel-ai.cjs.map +1 -1
  24. package/dist/backends/vercel-ai.d.cts +3 -1
  25. package/dist/backends/vercel-ai.d.ts +3 -1
  26. package/dist/backends/vercel-ai.js +349 -77
  27. package/dist/backends/vercel-ai.js.map +1 -1
  28. package/dist/backends-BSrsBYFn.d.cts +39 -0
  29. package/dist/backends-BSrsBYFn.d.ts +39 -0
  30. package/dist/chat/accumulator.cjs +147 -0
  31. package/dist/chat/accumulator.cjs.map +1 -0
  32. package/dist/chat/accumulator.d.cts +64 -0
  33. package/dist/chat/accumulator.d.ts +64 -0
  34. package/dist/chat/accumulator.js +145 -0
  35. package/dist/chat/accumulator.js.map +1 -0
  36. package/dist/chat/backends.cjs +3524 -0
  37. package/dist/chat/backends.cjs.map +1 -0
  38. package/dist/chat/backends.d.cts +66 -0
  39. package/dist/chat/backends.d.ts +66 -0
  40. package/dist/chat/backends.js +3512 -0
  41. package/dist/chat/backends.js.map +1 -0
  42. package/dist/chat/context.cjs +280 -0
  43. package/dist/chat/context.cjs.map +1 -0
  44. package/dist/chat/context.d.cts +191 -0
  45. package/dist/chat/context.d.ts +191 -0
  46. package/dist/chat/context.js +277 -0
  47. package/dist/chat/context.js.map +1 -0
  48. package/dist/chat/core.cjs +305 -0
  49. package/dist/chat/core.cjs.map +1 -0
  50. package/dist/chat/core.d.cts +84 -0
  51. package/dist/chat/core.d.ts +84 -0
  52. package/dist/chat/core.js +282 -0
  53. package/dist/chat/core.js.map +1 -0
  54. package/dist/chat/errors.cjs +273 -0
  55. package/dist/chat/errors.cjs.map +1 -0
  56. package/dist/chat/errors.d.cts +97 -0
  57. package/dist/chat/errors.d.ts +97 -0
  58. package/dist/chat/errors.js +266 -0
  59. package/dist/chat/errors.js.map +1 -0
  60. package/dist/chat/events.cjs +203 -0
  61. package/dist/chat/events.cjs.map +1 -0
  62. package/dist/chat/events.d.cts +245 -0
  63. package/dist/chat/events.d.ts +245 -0
  64. package/dist/chat/events.js +196 -0
  65. package/dist/chat/events.js.map +1 -0
  66. package/dist/chat/index.cjs +5550 -0
  67. package/dist/chat/index.cjs.map +1 -0
  68. package/dist/chat/index.d.cts +77 -0
  69. package/dist/chat/index.d.ts +77 -0
  70. package/dist/chat/index.js +5505 -0
  71. package/dist/chat/index.js.map +1 -0
  72. package/dist/chat/react/theme.css +2517 -0
  73. package/dist/chat/react.cjs +3589 -0
  74. package/dist/chat/react.cjs.map +1 -0
  75. package/dist/chat/react.d.cts +1088 -0
  76. package/dist/chat/react.d.ts +1088 -0
  77. package/dist/chat/react.js +3547 -0
  78. package/dist/chat/react.js.map +1 -0
  79. package/dist/chat/runtime.cjs +1245 -0
  80. package/dist/chat/runtime.cjs.map +1 -0
  81. package/dist/chat/runtime.d.cts +182 -0
  82. package/dist/chat/runtime.d.ts +182 -0
  83. package/dist/chat/runtime.js +1243 -0
  84. package/dist/chat/runtime.js.map +1 -0
  85. package/dist/chat/server.cjs +2668 -0
  86. package/dist/chat/server.cjs.map +1 -0
  87. package/dist/chat/server.d.cts +648 -0
  88. package/dist/chat/server.d.ts +648 -0
  89. package/dist/chat/server.js +2628 -0
  90. package/dist/chat/server.js.map +1 -0
  91. package/dist/chat/sessions.cjs +380 -0
  92. package/dist/chat/sessions.cjs.map +1 -0
  93. package/dist/chat/sessions.d.cts +158 -0
  94. package/dist/chat/sessions.d.ts +158 -0
  95. package/dist/chat/sessions.js +376 -0
  96. package/dist/chat/sessions.js.map +1 -0
  97. package/dist/chat/sqlite.cjs +441 -0
  98. package/dist/chat/sqlite.cjs.map +1 -0
  99. package/dist/chat/sqlite.d.cts +128 -0
  100. package/dist/chat/sqlite.d.ts +128 -0
  101. package/dist/chat/sqlite.js +435 -0
  102. package/dist/chat/sqlite.js.map +1 -0
  103. package/dist/chat/state.cjs +190 -0
  104. package/dist/chat/state.cjs.map +1 -0
  105. package/dist/chat/state.d.cts +95 -0
  106. package/dist/chat/state.d.ts +95 -0
  107. package/dist/chat/state.js +180 -0
  108. package/dist/chat/state.js.map +1 -0
  109. package/dist/chat/storage.cjs +249 -0
  110. package/dist/chat/storage.cjs.map +1 -0
  111. package/dist/chat/storage.d.cts +197 -0
  112. package/dist/chat/storage.d.ts +197 -0
  113. package/dist/chat/storage.js +245 -0
  114. package/dist/chat/storage.js.map +1 -0
  115. package/dist/errors-C-so0M4t.d.cts +33 -0
  116. package/dist/errors-C-so0M4t.d.ts +33 -0
  117. package/dist/errors-CmVvczxZ.d.cts +28 -0
  118. package/dist/errors-CmVvczxZ.d.ts +28 -0
  119. package/dist/in-process-transport-C1JnJGVR.d.ts +228 -0
  120. package/dist/in-process-transport-C7DSqPyX.d.cts +228 -0
  121. package/dist/index.cjs +365 -59
  122. package/dist/index.cjs.map +1 -1
  123. package/dist/index.d.cts +322 -125
  124. package/dist/index.d.ts +322 -125
  125. package/dist/index.js +359 -60
  126. package/dist/index.js.map +1 -1
  127. package/dist/provider-types-PTSlRPNB.d.cts +39 -0
  128. package/dist/provider-types-PTSlRPNB.d.ts +39 -0
  129. package/dist/refresh-manager-B81PpYBr.d.cts +153 -0
  130. package/dist/refresh-manager-Dlv_iNZi.d.ts +153 -0
  131. package/dist/testing.cjs +383 -0
  132. package/dist/testing.cjs.map +1 -0
  133. package/dist/testing.d.cts +132 -0
  134. package/dist/testing.d.ts +132 -0
  135. package/dist/testing.js +377 -0
  136. package/dist/testing.js.map +1 -0
  137. package/dist/token-store-CSUBgYwn.d.ts +48 -0
  138. package/dist/token-store-CuC4hB9Z.d.cts +48 -0
  139. package/dist/transport-Cdh3M0tS.d.cts +68 -0
  140. package/dist/transport-Ciap4PWK.d.ts +68 -0
  141. package/dist/types-4vbcmPTp.d.cts +143 -0
  142. package/dist/types-BxggH0Yh.d.ts +143 -0
  143. package/dist/types-DRgd_9R7.d.cts +363 -0
  144. package/dist/types-ajANVzf7.d.ts +363 -0
  145. package/package.json +178 -6
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/chat/react/ChatProvider.ts","../../src/chat/types.ts","../../src/chat/bridge.ts","../../src/chat/accumulator.ts","../../src/chat/react/useChat.ts","../../src/chat/react/useMessages.ts","../../src/chat/react/useSessions.ts","../../src/chat/react/MarkdownRenderer.ts","../../src/chat/react/ThinkingBlock.ts","../../src/chat/react/ToolCallView.ts","../../src/chat/react/Message.ts","../../src/chat/react/useToolApproval.ts","../../src/chat/react/ThreadSlots.ts","../../src/chat/react/Thread.ts","../../src/chat/react/Composer.ts","../../src/chat/react/ThreadList.ts","../../src/chat/react/useSSE.ts","../../src/chat/react/useModels.ts","../../src/chat/react/ModelSelector.ts","../../src/chat/react/auth/useCopilotAuth.ts","../../src/chat/react/auth/useClaudeAuth.ts","../../src/chat/react/auth/useApiKeyAuth.ts","../../src/chat/react/useRemoteAuth.ts","../../src/chat/listener-set.ts","../../src/chat/react/RemoteChatClient.ts","../../src/chat/react/useRemoteChat.ts","../../src/chat/react/auth/CopilotAuthForm.ts","../../src/chat/react/auth/ClaudeAuthForm.ts","../../src/chat/react/auth/VercelAIAuthForm.ts","../../src/chat/react/BackendSelector.ts","../../src/chat/react/useBackends.ts","../../src/chat/react/useProviders.ts","../../src/chat/react/ProviderSelector.ts","../../src/chat/react/ProviderModelSelector.ts","../../src/chat/react/ProviderSettings.ts","../../src/chat/react/ContextStatsDisplay.ts","../../src/chat/react/ChatLayout.ts","../../src/chat/react/ChatHeader.ts","../../src/chat/react/UsageBadge.ts","../../src/chat/react/ChatInputArea.ts","../../src/chat/react/ChatSettingsOverlay.ts","../../src/chat/react/ChatUI.ts"],"names":["useRef","useCallback","useEffect","useState","createElement","createContext","useContext","useMemo"],"mappings":"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","file":"react.js","sourcesContent":["import { createContext, createElement, useContext, type ReactNode } from \"react\";\nimport type { IChatClient } from \"../runtime.js\";\n\nconst ChatRuntimeContext = createContext<IChatClient | null>(null);\n\n/** Props for ChatProvider. */\nexport interface ChatProviderProps {\n /** The chat runtime or client instance to provide to descendants. Accepts IChatClient (or any structurally compatible type). */\n runtime: IChatClient;\n children: ReactNode;\n}\n\n/**\n * React context provider wrapping IChatClient.\n * All chat hooks must be used within a ChatProvider.\n */\nexport function ChatProvider({ runtime, children }: ChatProviderProps) {\n return createElement(ChatRuntimeContext.Provider, { value: runtime }, children);\n}\n\n/**\n * Access the IChatClient from context.\n * Must be used within a ChatProvider.\n *\n * @throws {Error} If used outside ChatProvider\n */\nexport function useChatRuntime(): IChatClient {\n const runtime = useContext(ChatRuntimeContext);\n if (!runtime) {\n throw new Error(\"useChatRuntime must be used within a ChatProvider\");\n }\n return runtime;\n}\n","/**\n * @witqq/agent-sdk — Chat domain types\n *\n * All type definitions and interfaces for the chat layer.\n * Pure types + ChatId generation (tightly coupled to branded type).\n */\n\nimport type { UsageData, ToolDefinition, ErrorCode } from \"../types.js\";\nimport type { AuthToken } from \"../auth/types.js\";\n\n// ─── Unique ID ─────────────────────────────────────────────────\n\n/** Branded type for unique identifiers */\nexport type ChatId = string & { readonly __brand: \"ChatId\" };\n\n/**\n * Generate a new unique ChatId (crypto.randomUUID-based)\n * @returns Branded ChatId string\n */\nexport function createChatId(): ChatId {\n return crypto.randomUUID() as ChatId;\n}\n\n/** UUID v4 pattern for ChatId validation */\nconst UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;\n\n/**\n * Cast a string to ChatId with UUID format validation.\n * Use this instead of manual `as ChatId` type assertions.\n *\n * @param value - String to validate and cast\n * @returns Branded ChatId\n * @throws {TypeError} If value is not a valid UUID v4 format\n */\nexport function toChatId(value: string): ChatId {\n if (!UUID_RE.test(value)) {\n throw new TypeError(`Invalid ChatId: \"${value}\" is not a valid UUID`);\n }\n return value as ChatId;\n}\n\n/**\n * Accepts either a plain string or branded ChatId for API convenience.\n * Use this in public API signatures so consumers don't need `as ChatId` casts.\n */\nexport type ChatIdLike = string | ChatId;\n\n// ─── Status Types ──────────────────────────────────────────────\n\n/** Lifecycle status of a message part (text, reasoning, etc.) */\nexport type PartStatus = \"pending\" | \"streaming\" | \"complete\" | \"error\";\n/** Lifecycle status of a tool call within a message */\nexport type ToolCallStatus = \"pending\" | \"running\" | \"requires_approval\" | \"complete\" | \"error\" | \"denied\";\n/** Lifecycle status of an entire message */\nexport type MessageStatus = \"pending\" | \"streaming\" | \"complete\" | \"error\" | \"cancelled\";\n/** Lifecycle status of a chat session */\nexport type SessionStatus = \"active\";\n/** Lifecycle status of the chat runtime */\nexport type RuntimeStatus = \"idle\" | \"streaming\" | \"error\" | \"disposed\";\n\n// ─── Message Parts (union) ─────────────────────────────────────\n\n/** Plain text content part */\nexport interface TextPart { type: \"text\"; text: string; status: PartStatus; }\n/** Model reasoning/thinking content part */\nexport interface ReasoningPart { type: \"reasoning\"; text: string; status: PartStatus; }\n/** Tool invocation part with call ID, arguments, optional result */\nexport interface ToolCallPart { type: \"tool_call\"; toolCallId: string; name: string; args: unknown; result?: unknown; status: ToolCallStatus; error?: string; }\n/** Source reference part (URL citation) */\nexport interface SourcePart { type: \"source\"; url: string; title?: string; status: PartStatus; }\n/** File attachment part (base64-encoded data) */\nexport interface FilePart { type: \"file\"; name: string; mimeType: string; data: string; status: PartStatus; }\n/** Union of all message part types */\nexport type MessagePart = TextPart | ReasoningPart | ToolCallPart | SourcePart | FilePart;\n\n// ─── Chat Message ──────────────────────────────────────────────\n\n/** Role of message author */\nexport type ChatRole = \"user\" | \"assistant\" | \"system\";\n\n/** Metadata attached to messages — useful preset for the TMetadata generic */\nexport interface ChatMessageMetadata {\n model?: string;\n backend?: string;\n usage?: UsageData;\n isSummary?: boolean;\n estimatedTokens?: number;\n custom?: Record<string, unknown>;\n}\n\n/** Message status */\nexport type ChatMessageStatus = MessageStatus;\n\n/** A single chat message — the fundamental unit of conversation */\nexport interface ChatMessage<TMetadata = unknown> {\n id: ChatId;\n role: ChatRole;\n parts: MessagePart[];\n metadata?: TMetadata;\n createdAt: string;\n updatedAt?: string;\n status: MessageStatus;\n}\n\n// ─── Supporting Types ──────────────────────────────────────────\n\n// ─── Chat Session ──────────────────────────────────────────────\n\n/** Session configuration snapshot */\nexport interface ChatSessionConfig {\n model: string;\n backend: string;\n systemPrompt?: string;\n temperature?: number;\n maxTokens?: number;\n}\n\n/**\n * Session metadata tracking usage statistics and custom extensions.\n *\n * Updated automatically by session stores on each `addMessage()` call.\n * The generic `TCustom` parameter allows type-safe application-specific\n * metadata via the `custom` field.\n *\n * @typeParam TCustom - Shape of the `custom` field (defaults to `Record<string, unknown>`)\n */\nexport interface ChatSessionMetadata<TCustom extends Record<string, unknown> = Record<string, unknown>> {\n /** Number of messages in the session (updated by session store) */\n messageCount: number;\n /** Total token count across all messages in the session */\n totalTokens: number;\n /** Optional tags for session categorization and filtering */\n tags?: string[];\n /** Application-specific metadata — typed via the TCustom generic parameter */\n custom?: TCustom;\n}\n\n/** Chat session — a conversation with ordered messages (pure serializable data) */\nexport interface ChatSession<TCustom extends Record<string, unknown> = Record<string, unknown>> {\n id: ChatId;\n title?: string;\n messages: ChatMessage[];\n config: ChatSessionConfig;\n metadata: ChatSessionMetadata<TCustom>;\n status: SessionStatus;\n createdAt: string;\n updatedAt: string;\n backendSessionId?: string;\n}\n\n/**\n * Reactive wrapper around ChatSession — provides subscribe/getSnapshot for\n * React useSyncExternalStore integration and lastMessage convenience getter.\n * Session stores may optionally return ObservableSession instances.\n */\nexport interface ObservableSession<TCustom extends Record<string, unknown> = Record<string, unknown>>\n extends ChatSession<TCustom> {\n /** Subscribe to session changes (for React useSyncExternalStore) */\n subscribe(callback: () => void): () => void;\n /** Get immutable snapshot of session state (for React useSyncExternalStore) */\n getSnapshot(): ChatSession<TCustom>;\n /** Last message in the session */\n readonly lastMessage: ChatMessage | undefined;\n}\n\n/** Lightweight session info for listing (without full message array) */\nexport interface SessionInfo {\n id: ChatId;\n title?: string;\n status: SessionStatus;\n messageCount: number;\n lastMessage?: ChatMessage;\n createdAt: string;\n updatedAt: string;\n}\n\n// ─── Chat Events ───────────────────────────────────────────────\n\n/** Events emitted during chat operation */\nexport type ChatEvent =\n | { type: \"message:start\"; messageId: ChatId; role: ChatRole }\n | { type: \"message:delta\"; messageId: ChatId; text: string }\n | { type: \"message:complete\"; messageId: ChatId; message: ChatMessage }\n | {\n type: \"tool:start\";\n messageId: ChatId;\n toolCallId: string;\n toolName: string;\n args: Record<string, unknown>;\n }\n | {\n type: \"tool:complete\";\n messageId: ChatId;\n toolCallId: string;\n toolName: string;\n result: unknown;\n isError?: boolean;\n }\n | { type: \"thinking:start\"; messageId: ChatId }\n | { type: \"thinking:delta\"; messageId: ChatId; text: string }\n | { type: \"thinking:end\"; messageId: ChatId }\n | {\n type: \"permission:request\";\n messageId: ChatId;\n toolName: string;\n toolArgs: Record<string, unknown>;\n }\n | {\n type: \"permission:response\";\n messageId: ChatId;\n toolName: string;\n allowed: boolean;\n }\n | {\n type: \"usage\";\n promptTokens: number;\n completionTokens: number;\n model?: string;\n }\n | { type: \"session:created\"; sessionId: ChatId }\n | { type: \"session:updated\"; sessionId: ChatId }\n | {\n type: \"error\";\n error: string;\n recoverable: boolean;\n code?: ErrorCode;\n messageId?: ChatId;\n }\n | { type: \"typing:start\" }\n | { type: \"typing:end\" }\n | { type: \"heartbeat\" }\n | { type: \"done\"; finalOutput?: string };\n\n/** All possible ChatEvent type strings */\nexport type ChatEventType = ChatEvent[\"type\"];\n\n// ─── Chat Middleware ───────────────────────────────────────────\n\n/** Context passed to ChatMiddleware hooks */\nexport interface ChatMiddlewareContext {\n sessionId: ChatId;\n signal: AbortSignal;\n}\n\n/** Runtime-level middleware for the send/receive lifecycle.\n * Different from EventMiddleware which operates at the event bus level. */\nexport interface ChatMiddleware {\n /** Transform message before sending to backend. Return null to reject the send. */\n onBeforeSend?(message: ChatMessage, context: ChatMiddlewareContext): ChatMessage | null | Promise<ChatMessage | null>;\n /** Transform/intercept stream events */\n onEvent?(event: ChatEvent, context: ChatMiddlewareContext): ChatEvent | null | Promise<ChatEvent | null>;\n /** Transform completed message after receiving from backend */\n onAfterReceive?(message: ChatMessage, context: ChatMiddlewareContext): ChatMessage | Promise<ChatMessage>;\n /** Intercept errors — return null to suppress, return error to propagate */\n onError?(error: Error, context: ChatMiddlewareContext): Error | null | Promise<Error | null>;\n}\n\n// ─── Chat Provider Abstraction ─────────────────────────────────\n\n/** Options for sending a message to a provider */\nexport interface SendMessageOptions {\n signal?: AbortSignal;\n /** Model to use for this request. Required for server-side runtime.send(). */\n model?: string;\n /** Per-call system prompt override (forwarded to the backend agent) */\n systemPrompt?: string;\n context?: Record<string, unknown>;\n /** Additional tools to include in this request */\n tools?: ToolDefinition[];\n}\n\n/** Options for runtime.send() — requires backend routing info */\nexport interface RuntimeSendOptions {\n /** Backend to route this request to (key in backends map) */\n backend: string;\n /** Authentication credentials for the backend factory */\n credentials: AuthToken;\n /** Model to use for this request */\n model: string;\n /** Per-call system prompt override (forwarded to the backend agent) */\n systemPrompt?: string;\n /** Abort signal */\n signal?: AbortSignal;\n /** Request-scoped context */\n context?: Record<string, unknown>;\n /** Additional tools */\n tools?: ToolDefinition[];\n}\n\n/**\n * @deprecated IChatProvider has been inlined into IChatBackend.\n * Import IChatBackend from \"@witqq/agent-sdk/chat/backends\" instead.\n * Kept as type alias for backward compatibility.\n */\nexport type IChatProvider = import(\"./backends/types.js\").IChatBackend;\n\n// ─── Factory Functions ─────────────────────────────────────────\n\n/**\n * Create a simple text ChatMessage.\n *\n * @param text - Message text content\n * @param role - Message role (default: \"user\")\n * @returns A complete ChatMessage with a single TextPart\n */\nexport function createTextMessage(text: string, role: ChatRole = \"user\"): ChatMessage {\n return {\n id: createChatId(),\n role,\n parts: [{ type: \"text\", text, status: \"complete\" }],\n createdAt: new Date().toISOString(),\n status: \"complete\",\n };\n}\n\n/** Type guard: checks if a session has reactive API (subscribe/getSnapshot) */\nexport function isObservableSession<TCustom extends Record<string, unknown> = Record<string, unknown>>(\n session: ChatSession<TCustom>,\n): session is ObservableSession<TCustom> {\n return \"subscribe\" in session && typeof (session as ObservableSession<TCustom>).subscribe === \"function\"\n && \"getSnapshot\" in session && typeof (session as ObservableSession<TCustom>).getSnapshot === \"function\";\n}\n","/**\n * @witqq/agent-sdk — AgentEvent ↔ ChatEvent bridge\n */\n\nimport type { AgentEvent, JSONValue } from \"../types.js\";\nimport type { ChatId, ChatEvent } from \"./types.js\";\n\n/**\n * Map a single AgentEvent to a ChatEvent (or null if no mapping)\n */\nexport function agentEventToChatEvent(\n event: AgentEvent,\n messageId: ChatId,\n): ChatEvent | null {\n switch (event.type) {\n case \"text_delta\":\n return { type: \"message:delta\", messageId, text: event.text };\n case \"thinking_start\":\n return { type: \"thinking:start\", messageId };\n case \"thinking_delta\":\n return { type: \"thinking:delta\", messageId, text: event.text };\n case \"thinking_end\":\n return { type: \"thinking:end\", messageId };\n case \"tool_call_start\":\n return {\n type: \"tool:start\",\n messageId,\n toolCallId: event.toolCallId,\n toolName: event.toolName,\n args: event.args as Record<string, unknown>,\n };\n case \"tool_call_end\":\n return {\n type: \"tool:complete\",\n messageId,\n toolCallId: event.toolCallId,\n toolName: event.toolName,\n result: event.result,\n };\n case \"permission_request\":\n return {\n type: \"permission:request\",\n messageId,\n toolName: event.request.toolName,\n toolArgs: event.request.toolArgs,\n };\n case \"permission_response\":\n return {\n type: \"permission:response\",\n messageId,\n toolName: event.toolName,\n allowed: event.decision.allowed,\n };\n case \"usage_update\":\n return {\n type: \"usage\",\n promptTokens: event.promptTokens,\n completionTokens: event.completionTokens,\n model: event.model,\n };\n case \"error\":\n return {\n type: \"error\",\n error: event.error,\n recoverable: event.recoverable,\n code: event.code,\n messageId,\n };\n case \"heartbeat\":\n return { type: \"heartbeat\" };\n case \"ask_user\":\n case \"ask_user_response\":\n case \"session_info\":\n case \"done\":\n return null;\n default:\n return null;\n }\n}\n\n/**\n * Convert AgentEvent async iterable to ChatEvent async iterable\n */\nexport async function* adaptAgentEvents(\n events: AsyncIterable<AgentEvent>,\n messageId: ChatId,\n): AsyncIterable<ChatEvent> {\n for await (const event of events) {\n const chatEvent = agentEventToChatEvent(event, messageId);\n if (chatEvent !== null) {\n yield chatEvent;\n }\n }\n}\n\n/**\n * Map a ChatEvent back to an AgentEvent for accumulator consumption.\n * Returns null for events that don't map to accumulator-relevant AgentEvents.\n */\nexport function chatEventToAgentEvent(event: ChatEvent): AgentEvent | null {\n switch (event.type) {\n case \"message:delta\":\n return { type: \"text_delta\", text: event.text };\n case \"thinking:start\":\n return { type: \"thinking_start\" };\n case \"thinking:delta\":\n return { type: \"thinking_delta\", text: event.text };\n case \"thinking:end\":\n return { type: \"thinking_end\" };\n case \"tool:start\":\n return {\n type: \"tool_call_start\",\n toolCallId: event.toolCallId,\n toolName: event.toolName,\n args: event.args as JSONValue,\n };\n case \"tool:complete\":\n return {\n type: \"tool_call_end\",\n toolCallId: event.toolCallId,\n toolName: event.toolName,\n result: event.result as JSONValue,\n };\n case \"error\":\n return { type: \"error\", error: event.error, recoverable: event.recoverable, code: event.code };\n default:\n return null;\n }\n}\n","/**\n * @witqq/agent-sdk/chat/accumulator\n *\n * MessageAccumulator converts a stream of AgentEvent objects into a ChatMessage\n * with correct MessagePart array. Handles text, reasoning, and tool call\n * accumulation with proper status transitions.\n */\n\nimport type { AgentEvent } from \"../types.js\";\nimport type { ChatMessage, ChatId, MessagePart, TextPart, ReasoningPart, ToolCallPart } from \"./core.js\";\nimport { createChatId } from \"./core.js\";\n\n/**\n * Converts a stream of AgentEvent objects into a complete ChatMessage.\n * Tracks text, reasoning, and tool call parts with proper status transitions.\n *\n * @example\n * ```typescript\n * const acc = new MessageAccumulator();\n * for await (const event of agentEvents) {\n * acc.apply(event);\n * renderMessage(acc.snapshot()); // in-progress UI update\n * }\n * const message = acc.finalize();\n * ```\n */\nexport class MessageAccumulator {\n private readonly messageId: ChatId;\n private readonly parts: MessagePart[] = [];\n private status: \"pending\" | \"streaming\" | \"complete\" | \"error\" | \"cancelled\" = \"pending\";\n private currentTextPart: TextPart | null = null;\n private currentReasoningPart: ReasoningPart | null = null;\n private toolCallParts = new Map<string, ToolCallPart>();\n private _finalized = false;\n\n constructor(messageId?: ChatId) {\n this.messageId = messageId ?? createChatId();\n }\n\n /** Get current message ID */\n get id(): ChatId { return this.messageId; }\n\n /**\n * Apply an AgentEvent to accumulate into the message\n * @param event - AgentEvent to process\n * @throws Error if accumulator is already finalized\n */\n apply(event: AgentEvent): void {\n if (this._finalized) throw new Error(\"Cannot apply events to finalized accumulator\");\n\n if (this.status === \"pending\") {\n this.status = \"streaming\";\n }\n\n switch (event.type) {\n case \"text_delta\":\n this.handleTextDelta(event.text);\n break;\n case \"thinking_start\":\n this.finalizeCurrentText();\n this.currentReasoningPart = { type: \"reasoning\", text: \"\", status: \"streaming\" };\n this.parts.push(this.currentReasoningPart);\n break;\n case \"thinking_delta\":\n if (this.currentReasoningPart) {\n this.currentReasoningPart.text += event.text;\n }\n break;\n case \"thinking_end\":\n if (this.currentReasoningPart) {\n this.currentReasoningPart.status = \"complete\";\n this.currentReasoningPart = null;\n }\n break;\n case \"tool_call_start\": {\n this.finalizeCurrentText();\n const toolPart: ToolCallPart = {\n type: \"tool_call\",\n toolCallId: event.toolCallId,\n name: event.toolName,\n args: event.args,\n status: \"running\",\n };\n this.toolCallParts.set(event.toolCallId, toolPart);\n this.parts.push(toolPart);\n break;\n }\n case \"tool_call_end\": {\n const existing = this.toolCallParts.get(event.toolCallId);\n if (existing) {\n existing.result = event.result;\n existing.status = \"complete\";\n }\n break;\n }\n case \"error\":\n this.status = \"error\";\n break;\n case \"done\":\n break;\n // Other events (heartbeat, ask_user, etc.) — ignore\n }\n }\n\n private handleTextDelta(text: string): void {\n if (!this.currentTextPart) {\n this.currentTextPart = { type: \"text\", text: \"\", status: \"streaming\" };\n this.parts.push(this.currentTextPart);\n }\n this.currentTextPart.text += text;\n }\n\n private finalizeCurrentText(): void {\n if (this.currentTextPart) {\n this.currentTextPart.status = \"complete\";\n this.currentTextPart = null;\n }\n }\n\n /**\n * Get a snapshot of the current accumulated message (for streaming UI)\n * @returns ChatMessage with current parts and \"streaming\" status\n */\n snapshot(): ChatMessage {\n const now = new Date().toISOString();\n return {\n id: this.messageId,\n role: \"assistant\",\n parts: this.parts.map(p => ({ ...p })),\n status: this.status === \"pending\" ? \"pending\" : \"streaming\",\n createdAt: now,\n updatedAt: now,\n };\n }\n\n /**\n * Finalize the accumulator and return the complete ChatMessage\n * @returns Completed ChatMessage with all parts finalized\n * @throws Error if accumulator is already finalized\n */\n finalize(): ChatMessage {\n if (this._finalized) throw new Error(\"Accumulator already finalized\");\n this._finalized = true;\n\n // Finalize any open parts\n this.finalizeCurrentText();\n if (this.currentReasoningPart) {\n this.currentReasoningPart.status = \"complete\";\n this.currentReasoningPart = null;\n }\n\n // Mark incomplete tool calls as error\n for (const [, toolPart] of this.toolCallParts) {\n if (toolPart.status === \"running\" || toolPart.status === \"pending\") {\n toolPart.status = \"error\";\n }\n }\n\n // Set final message status\n if (this.status !== \"error\" && this.status !== \"cancelled\") {\n this.status = \"complete\";\n }\n\n const now = new Date().toISOString();\n return {\n id: this.messageId,\n role: \"assistant\",\n parts: this.parts,\n status: this.status,\n createdAt: now,\n updatedAt: now,\n };\n }\n\n /** Check if the accumulator has been finalized */\n get finalized(): boolean { return this._finalized; }\n}\n","import { useCallback, useEffect, useRef, useState } from \"react\";\nimport type { ChatMessage, RuntimeStatus } from \"../core.js\";\nimport { chatEventToAgentEvent } from \"../core.js\";\nimport { MessageAccumulator } from \"../accumulator.js\";\nimport { useChatRuntime } from \"./ChatProvider.js\";\n\n/** Options for the useChat hook. */\nexport interface UseChatOptions {\n /** Session ID. If omitted, a new session is created on first send. */\n sessionId?: string;\n /** Called on error during send. */\n onError?: (error: Error) => void;\n /** Auto-dismiss errors after this many ms (0 = disabled, default: 0). */\n autoDismissMs?: number;\n}\n\n/** Token usage data from the last completed response. */\nexport interface ChatUsage {\n promptTokens: number;\n completionTokens: number;\n totalTokens: number;\n model?: string;\n}\n\n/** Return value from useChat. */\nexport interface UseChatReturn {\n /** Current session ID (null until session created). */\n sessionId: string | null;\n /** Ordered messages in the current session. */\n messages: ChatMessage[];\n /** Send a user message and trigger assistant response. */\n sendMessage: (content: string) => Promise<void>;\n /** Abort the current generation. */\n stop: () => void;\n /** Whether the assistant is currently generating. */\n isGenerating: boolean;\n /** Current runtime status. */\n status: RuntimeStatus;\n /** Current error, if any. */\n error: Error | null;\n /** Clear the error state. */\n clearError: () => void;\n /** Retry the last failed message. No-op if no error or no last user message. */\n retryLastMessage: () => Promise<void>;\n /** Create a new session, resetting messages. */\n newSession: () => Promise<string>;\n /** Token usage from the last completed response. */\n usage: ChatUsage | null;\n}\n\n/**\n * Convenience hook for chat interaction.\n * Wraps IChatRuntime with React state management and progressive streaming.\n * Messages update in real-time as tokens arrive (not after full response).\n */\nexport function useChat(options: UseChatOptions = {}): UseChatReturn {\n const runtime = useChatRuntime();\n const [sessionId, setSessionId] = useState<string | null>(\n options.sessionId ?? null,\n );\n const [messages, setMessages] = useState<ChatMessage[]>([]);\n const [isGenerating, setIsGenerating] = useState(false);\n const [status, setStatus] = useState<RuntimeStatus>(\"idle\");\n const [error, setError] = useState<Error | null>(null);\n const [usage, setUsage] = useState<ChatUsage | null>(null);\n const generatingRef = useRef(false);\n const lastUserMessageRef = useRef<string | null>(null);\n\n const onErrorRef = useRef(options.onError);\n onErrorRef.current = options.onError;\n\n // Auto-dismiss timer\n const dismissTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const autoDismissMs = options.autoDismissMs ?? 0;\n useEffect(() => {\n if (!error || autoDismissMs <= 0) return;\n dismissTimerRef.current = setTimeout(() => {\n setError(null);\n dismissTimerRef.current = null;\n }, autoDismissMs);\n return () => {\n if (dismissTimerRef.current) {\n clearTimeout(dismissTimerRef.current);\n dismissTimerRef.current = null;\n }\n };\n }, [error, autoDismissMs]);\n\n // Sync session messages when sessionId changes\n useEffect(() => {\n if (!sessionId) {\n setMessages([]);\n return;\n }\n runtime.getSession(sessionId).then((session) => {\n if (session) {\n setMessages([...session.messages]);\n }\n });\n }, [sessionId, runtime]);\n\n // Sync with external session switches (e.g. sidebar click → runtime.switchSession)\n useEffect(() => {\n return runtime.onSessionChange(() => {\n const activeId = runtime.activeSessionId;\n if (activeId && activeId !== sessionId) {\n setSessionId(activeId);\n setError(null);\n }\n });\n }, [runtime, sessionId]);\n\n const ensureSession = useCallback(async (): Promise<string> => {\n if (sessionId) return sessionId;\n const session = await runtime.createSession({\n config: { model: \"\", backend: \"\" },\n });\n setSessionId(session.id);\n return session.id;\n }, [sessionId, runtime]);\n\n const sendMessage = useCallback(\n async (content: string) => {\n if (generatingRef.current) return;\n lastUserMessageRef.current = content;\n setError(null);\n generatingRef.current = true;\n setIsGenerating(true);\n setStatus(\"streaming\");\n\n // Hoisted for catch block access\n const accumulator = new MessageAccumulator();\n let hasEvents = false;\n\n try {\n const sid = await ensureSession();\n\n // Optimistic user message\n const now = new Date().toISOString();\n const userMsg: ChatMessage = {\n id: crypto.randomUUID() as unknown as ChatMessage[\"id\"],\n role: \"user\",\n parts: [{ type: \"text\", text: content, status: \"complete\" }],\n status: \"complete\",\n createdAt: now,\n updatedAt: now,\n };\n setMessages((prev) => [...prev, userMsg]);\n\n for await (const event of runtime.send(sid, content)) {\n // Track usage from usage events\n if (event.type === \"usage\") {\n setUsage({\n promptTokens: event.promptTokens,\n completionTokens: event.completionTokens,\n totalTokens: event.promptTokens + event.completionTokens,\n model: event.model,\n });\n }\n const agentEvent = chatEventToAgentEvent(event);\n if (agentEvent) {\n accumulator.apply(agentEvent);\n hasEvents = true;\n // Update messages with streaming snapshot\n const snapshot = accumulator.snapshot();\n setMessages((prev) => {\n // Replace the last message if it's the streaming assistant message,\n // otherwise append\n const last = prev[prev.length - 1];\n if (last && last.id === snapshot.id) {\n return [...prev.slice(0, -1), snapshot];\n }\n return [...prev, snapshot];\n });\n }\n }\n\n // Replace streaming message with final persisted message from session\n const session = await runtime.getSession(sid);\n if (session) {\n setMessages([...session.messages]);\n } else if (hasEvents) {\n // Fallback: finalize accumulator if session fetch fails\n const final = accumulator.finalize();\n setMessages((prev) => {\n const last = prev[prev.length - 1];\n if (last && last.id === final.id) {\n return [...prev.slice(0, -1), final];\n }\n return [...prev, final];\n });\n }\n } catch (err) {\n const e = err instanceof Error ? err : new Error(String(err));\n setError(e);\n onErrorRef.current?.(e);\n\n // Finalize accumulator with error status so partial message shows correctly\n if (hasEvents && !accumulator.finalized) {\n accumulator.apply({ type: \"error\", error: e.message, recoverable: false });\n const errorSnapshot = accumulator.finalize();\n setMessages((prev) => {\n const last = prev[prev.length - 1];\n if (last && last.id === errorSnapshot.id) {\n return [...prev.slice(0, -1), errorSnapshot];\n }\n return prev;\n });\n }\n } finally {\n generatingRef.current = false;\n setIsGenerating(false);\n setStatus(runtime.status);\n }\n },\n [ensureSession, runtime],\n );\n\n const stop = useCallback(() => {\n runtime.abort();\n }, [runtime]);\n\n const clearError = useCallback(() => {\n setError(null);\n }, []);\n\n const retryLastMessage = useCallback(async () => {\n if (!lastUserMessageRef.current || generatingRef.current) return;\n await sendMessage(lastUserMessageRef.current);\n }, [sendMessage]);\n\n const newSession = useCallback(async () => {\n const session = await runtime.createSession({\n config: { model: \"\", backend: \"\" },\n });\n setSessionId(session.id);\n setMessages([]);\n setError(null);\n lastUserMessageRef.current = null;\n return session.id;\n }, [runtime]);\n\n return {\n sessionId,\n messages,\n sendMessage,\n stop,\n isGenerating,\n status,\n error,\n clearError,\n retryLastMessage,\n newSession,\n usage,\n };\n}\n","import { useCallback, useEffect, useRef, useSyncExternalStore } from \"react\";\nimport type { ChatMessage, ChatSession } from \"../core.js\";\nimport { isObservableSession } from \"../core.js\";\nimport { useChatRuntime } from \"./ChatProvider.js\";\n\n/** Options for the useMessages hook. */\nexport interface UseMessagesOptions {\n /** Session ID to observe. */\n sessionId: string;\n}\n\n/** Return value from useMessages. */\nexport interface UseMessagesReturn {\n /** Ordered messages in the session. */\n messages: ChatMessage[];\n /** Whether the session was found. */\n isLoaded: boolean;\n}\n\nconst EMPTY_MESSAGES: ChatMessage[] = [];\n\n/**\n * Reactive message list via useSyncExternalStore.\n *\n * If the session supports subscribe/getSnapshot (reactive session),\n * uses useSyncExternalStore for granular updates.\n * Otherwise, falls back to polling via getSession().\n */\nexport function useMessages(options: UseMessagesOptions): UseMessagesReturn {\n const runtime = useChatRuntime();\n const { sessionId } = options;\n\n // Track session object for subscribe/getSnapshot\n const sessionRef = useRef<ChatSession | null>(null);\n const messagesRef = useRef<ChatMessage[]>(EMPTY_MESSAGES);\n const isLoadedRef = useRef(false);\n const versionRef = useRef(0);\n const listenersRef = useRef(new Set<() => void>());\n\n // Emit change to external store subscribers\n const emitChange = useCallback(() => {\n versionRef.current++;\n for (const listener of listenersRef.current) {\n listener();\n }\n }, []);\n\n // Subscribe function for useSyncExternalStore\n const subscribe = useCallback(\n (callback: () => void) => {\n listenersRef.current.add(callback);\n return () => {\n listenersRef.current.delete(callback);\n };\n },\n [],\n );\n\n // Snapshot function for useSyncExternalStore\n const getSnapshot = useCallback(() => {\n return messagesRef.current;\n }, []);\n\n // Load session and set up reactive subscription or polling\n useEffect(() => {\n let cancelled = false;\n let unsubscribe: (() => void) | undefined;\n let pollInterval: ReturnType<typeof setInterval> | undefined;\n\n async function load() {\n const session = await runtime.getSession(sessionId);\n if (cancelled) return;\n\n if (!session) {\n sessionRef.current = null;\n messagesRef.current = EMPTY_MESSAGES;\n isLoadedRef.current = false;\n emitChange();\n return;\n }\n\n sessionRef.current = session;\n messagesRef.current = session.messages;\n isLoadedRef.current = true;\n emitChange();\n\n // If session supports reactive API (ObservableSession), use it\n if (isObservableSession(session)) {\n unsubscribe = session.subscribe(() => {\n const snapshot = session.getSnapshot();\n messagesRef.current = snapshot.messages;\n emitChange();\n });\n } else {\n // Fallback: poll for changes\n pollInterval = setInterval(async () => {\n if (cancelled) return;\n const updated = await runtime.getSession(sessionId);\n if (cancelled || !updated) return;\n if (updated.messages.length !== messagesRef.current.length) {\n messagesRef.current = updated.messages;\n emitChange();\n }\n }, 500);\n }\n }\n\n load();\n\n return () => {\n cancelled = true;\n unsubscribe?.();\n if (pollInterval) clearInterval(pollInterval);\n };\n }, [sessionId, runtime, emitChange]);\n\n const messages = useSyncExternalStore(subscribe, getSnapshot, getSnapshot);\n\n return {\n messages,\n isLoaded: isLoadedRef.current,\n };\n}\n","/**\n * @witqq/agent-sdk/chat/react — useSessions\n *\n * Reactive session list hook that subscribes to runtime session changes.\n * Auto-updates without manual polling via `onSessionChange` subscription.\n */\n\nimport { useState, useEffect, useCallback } from \"react\";\nimport type { SessionInfo, ChatSession } from \"../core.js\";\nimport type { IChatClient } from \"../runtime.js\";\nimport { useChatRuntime } from \"./ChatProvider.js\";\n\n/** Return type of useSessions hook. */\nexport interface UseSessionsReturn {\n /** Current session list (lightweight SessionInfo format) */\n sessions: SessionInfo[];\n /** Whether initial load or refresh is in progress */\n loading: boolean;\n /** Last error from session fetch */\n error: Error | null;\n /** Manually trigger a refresh */\n refresh: () => void;\n}\n\n/** Map a full ChatSession to lightweight SessionInfo. */\nfunction toSessionInfo(s: ChatSession): SessionInfo {\n return {\n id: s.id,\n title: s.title,\n status: s.status,\n messageCount: s.metadata.messageCount,\n lastMessage: s.messages[s.messages.length - 1],\n createdAt: s.createdAt,\n updatedAt: s.updatedAt,\n };\n}\n\n/**\n * Reactive session list hook.\n * Subscribes to `runtime.onSessionChange()` and refreshes the list automatically\n * on create, delete, and message send completion.\n */\nexport function useSessions(): UseSessionsReturn {\n const runtime: IChatClient = useChatRuntime();\n const [sessions, setSessions] = useState<SessionInfo[]>([]);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n\n const fetchSessions = useCallback(async () => {\n try {\n const list = await runtime.listSessions();\n setSessions(list.map(toSessionInfo));\n setError(null);\n } catch (err) {\n setError(err instanceof Error ? err : new Error(String(err)));\n } finally {\n setLoading(false);\n }\n }, [runtime]);\n\n // Initial load\n useEffect(() => {\n fetchSessions();\n }, [fetchSessions]);\n\n // Subscribe to session changes\n useEffect(() => {\n return runtime.onSessionChange(() => {\n fetchSessions();\n });\n }, [runtime, fetchSessions]);\n\n const refresh = useCallback(() => {\n setLoading(true);\n fetchSessions();\n }, [fetchSessions]);\n\n return { sessions, loading, error, refresh };\n}\n","import { createElement, type ReactNode } from \"react\";\n\n/** Props for the MarkdownRenderer component. */\nexport interface MarkdownRendererProps {\n content: string;\n renderCode?: (code: string, language?: string) => ReactNode;\n renderLink?: (href: string, text: string) => ReactNode;\n}\n\n// ─── Token types for the parser ────────────────────────────────\n\ninterface HeadingToken { type: \"heading\"; level: number; content: string; }\ninterface ParagraphToken { type: \"paragraph\"; content: string; }\ninterface CodeBlockToken { type: \"code_block\"; code: string; language?: string; }\ninterface BlockquoteToken { type: \"blockquote\"; content: string; }\ninterface ListToken { type: \"list\"; ordered: boolean; items: string[]; }\n\ntype BlockToken = HeadingToken | ParagraphToken | CodeBlockToken | BlockquoteToken | ListToken;\n\n// ─── Block-level parser ────────────────────────────────────────\n\nfunction parseBlocks(text: string): BlockToken[] {\n const tokens: BlockToken[] = [];\n const lines = text.split(\"\\n\");\n let i = 0;\n\n while (i < lines.length) {\n const line = lines[i];\n\n // Code block (fenced)\n const fenceMatch = line.match(/^```(\\w*)/);\n if (fenceMatch) {\n const language = fenceMatch[1] || undefined;\n const codeLines: string[] = [];\n i++;\n while (i < lines.length && !lines[i].startsWith(\"```\")) {\n codeLines.push(lines[i]);\n i++;\n }\n i++; // skip closing ```\n tokens.push({ type: \"code_block\", code: codeLines.join(\"\\n\"), language });\n continue;\n }\n\n // Heading\n const headingMatch = line.match(/^(#{1,6})\\s+(.+)$/);\n if (headingMatch) {\n tokens.push({ type: \"heading\", level: headingMatch[1].length, content: headingMatch[2] });\n i++;\n continue;\n }\n\n // Blockquote\n if (line.startsWith(\"> \")) {\n const quoteLines: string[] = [];\n while (i < lines.length && lines[i].startsWith(\"> \")) {\n quoteLines.push(lines[i].slice(2));\n i++;\n }\n tokens.push({ type: \"blockquote\", content: quoteLines.join(\"\\n\") });\n continue;\n }\n\n // Unordered list\n if (/^[-*]\\s+/.test(line)) {\n const items: string[] = [];\n while (i < lines.length && /^[-*]\\s+/.test(lines[i])) {\n items.push(lines[i].replace(/^[-*]\\s+/, \"\"));\n i++;\n }\n tokens.push({ type: \"list\", ordered: false, items });\n continue;\n }\n\n // Ordered list\n if (/^\\d+\\.\\s+/.test(line)) {\n const items: string[] = [];\n while (i < lines.length && /^\\d+\\.\\s+/.test(lines[i])) {\n items.push(lines[i].replace(/^\\d+\\.\\s+/, \"\"));\n i++;\n }\n tokens.push({ type: \"list\", ordered: true, items });\n continue;\n }\n\n // Empty line — skip\n if (line.trim() === \"\") {\n i++;\n continue;\n }\n\n // Paragraph (collect consecutive non-empty lines)\n const paraLines: string[] = [];\n while (i < lines.length && lines[i].trim() !== \"\" && !lines[i].match(/^(#{1,6}\\s|```|>\\s|[-*]\\s|\\d+\\.\\s)/)) {\n paraLines.push(lines[i]);\n i++;\n }\n if (paraLines.length > 0) {\n tokens.push({ type: \"paragraph\", content: paraLines.join(\"\\n\") });\n }\n }\n\n return tokens;\n}\n\n// ─── Inline parser ─────────────────────────────────────────────\n\nfunction parseInline(text: string, props?: MarkdownRendererProps): ReactNode[] {\n const nodes: ReactNode[] = [];\n // Pattern: inline code, bold, italic, links\n const regex = /(`[^`]+`)|(\\*\\*[^*]+\\*\\*)|(\\*[^*]+\\*)|(_[^_]+_)|(\\[[^\\]]+\\]\\([^)]+\\))/g;\n let lastIndex = 0;\n let match: RegExpExecArray | null;\n\n while ((match = regex.exec(text)) !== null) {\n // Text before match\n if (match.index > lastIndex) {\n nodes.push(text.slice(lastIndex, match.index));\n }\n\n const fragment = match[0];\n\n if (fragment.startsWith(\"`\")) {\n // Inline code\n const code = fragment.slice(1, -1);\n nodes.push(createElement(\"code\", { key: `ic-${match.index}`, \"data-md-inline-code\": true }, code));\n } else if (fragment.startsWith(\"**\")) {\n // Bold\n const content = fragment.slice(2, -2);\n nodes.push(createElement(\"strong\", { key: `b-${match.index}` }, content));\n } else if (fragment.startsWith(\"*\") || fragment.startsWith(\"_\")) {\n // Italic\n const content = fragment.slice(1, -1);\n nodes.push(createElement(\"em\", { key: `i-${match.index}` }, content));\n } else if (fragment.startsWith(\"[\")) {\n // Link\n const linkMatch = fragment.match(/\\[([^\\]]+)\\]\\(([^)]+)\\)/);\n if (linkMatch) {\n nodes.push(\n props?.renderLink\n ? props.renderLink(linkMatch[2], linkMatch[1])\n : createElement(\"a\", { key: `a-${match.index}`, href: linkMatch[2] }, linkMatch[1]),\n );\n }\n }\n\n lastIndex = match.index + fragment.length;\n }\n\n // Remaining text\n if (lastIndex < text.length) {\n nodes.push(text.slice(lastIndex));\n }\n\n return nodes;\n}\n\n// ─── Block renderer ────────────────────────────────────────────\n\nfunction renderBlock(token: BlockToken, index: number, props: MarkdownRendererProps): ReactNode {\n switch (token.type) {\n case \"heading\":\n return createElement(\n `h${token.level}` as keyof HTMLElementTagNameMap,\n { key: index, \"data-md-heading\": true },\n ...parseInline(token.content, props),\n );\n\n case \"paragraph\":\n return createElement(\n \"p\",\n { key: index, \"data-md-paragraph\": true },\n ...parseInline(token.content, props),\n );\n\n case \"code_block\":\n if (props.renderCode) {\n return props.renderCode(token.code, token.language);\n }\n return createElement(\n \"pre\",\n { key: index, \"data-md-code-block\": true },\n createElement(\n \"code\",\n { className: token.language ? `language-${token.language}` : undefined },\n token.code,\n ),\n );\n\n case \"blockquote\":\n return createElement(\n \"blockquote\",\n { key: index, \"data-md-blockquote\": true },\n ...parseInline(token.content, props),\n );\n\n case \"list\": {\n const tag = token.ordered ? \"ol\" : \"ul\";\n const items = token.items.map((item, i) =>\n createElement(\"li\", { key: i }, ...parseInline(item, props)),\n );\n return createElement(tag, { key: index, \"data-md-list\": true }, ...items);\n }\n }\n}\n\n/**\n * Headless markdown renderer.\n * Parses markdown text to semantic HTML elements via createElement.\n * Supports headings, paragraphs, bold, italic, inline code, code blocks,\n * links, blockquotes, and lists. No external dependencies.\n */\nexport function MarkdownRenderer(props: MarkdownRendererProps): ReactNode {\n const tokens = parseBlocks(props.content);\n const children = tokens.map((token, i) => renderBlock(token, i, props));\n return createElement(\"div\", { \"data-md-root\": true }, ...children);\n}\n","import { createElement, type ReactNode } from \"react\";\n\n/** Props for the ThinkingBlock component. */\nexport interface ThinkingBlockProps {\n text: string;\n isStreaming?: boolean;\n defaultOpen?: boolean;\n}\n\n/**\n * Headless thinking/reasoning block using native details/summary elements.\n * Displays \"Thinking...\" while streaming, \"Reasoning\" when complete.\n */\nexport function ThinkingBlock({ text, isStreaming, defaultOpen }: ThinkingBlockProps): ReactNode {\n const attrs: Record<string, unknown> = {\n \"data-thinking\": \"true\",\n };\n if (isStreaming) {\n attrs[\"data-streaming\"] = \"true\";\n }\n if (defaultOpen) {\n attrs.open = true;\n }\n\n return createElement(\n \"details\",\n attrs,\n createElement(\"summary\", null, isStreaming ? \"Thinking...\" : \"Reasoning\"),\n createElement(\"div\", null, text),\n );\n}\n","import { createElement, type ReactNode } from \"react\";\nimport type { ToolCallPart } from \"../core.js\";\n\n/** Props for the ToolCallView component. */\nexport interface ToolCallViewProps {\n part: ToolCallPart;\n onApprove?: () => void;\n onDeny?: () => void;\n renderArgs?: (args: unknown) => ReactNode;\n renderResult?: (result: unknown) => ReactNode;\n}\n\n/**\n * Headless tool call display component.\n * Shows tool name, status, collapsible args/result, and approval buttons when needed.\n */\nexport function ToolCallView({ part, onApprove, onDeny, renderArgs, renderResult }: ToolCallViewProps): ReactNode {\n const children: ReactNode[] = [];\n\n // Header row: tool name + status badge\n children.push(\n createElement(\"div\", { key: \"header\", \"data-tool-header\": \"true\" },\n createElement(\"span\", { \"data-tool-label\": \"name\" }, part.name),\n createElement(\"span\", { \"data-tool-label\": \"status\" }, part.status),\n ),\n );\n\n // Collapsible args section\n if (part.args !== undefined) {\n children.push(\n renderArgs\n ? renderArgs(part.args)\n : createElement(\"details\", { key: \"args\", \"data-tool-details\": \"args\" },\n createElement(\"summary\", null, \"Arguments\"),\n createElement(\"pre\", { \"data-tool-label\": \"args\" }, JSON.stringify(part.args, null, 2)),\n ),\n );\n }\n\n // Collapsible result section\n if (part.result !== undefined) {\n children.push(\n renderResult\n ? renderResult(part.result)\n : createElement(\"details\", { key: \"result\", \"data-tool-details\": \"result\", open: true },\n createElement(\"summary\", null, \"Result\"),\n createElement(\"pre\", { \"data-tool-label\": \"result\" }, JSON.stringify(part.result, null, 2)),\n ),\n );\n }\n\n if (part.error) {\n children.push(\n createElement(\"span\", { key: \"error\", \"data-tool-label\": \"error\", role: \"alert\" }, part.error),\n );\n }\n\n if (part.status === \"requires_approval\") {\n children.push(\n createElement(\"div\", { key: \"actions\", \"data-tool-actions\": \"true\" },\n createElement(\"button\", { key: \"approve\", onClick: onApprove, \"data-action\": \"approve\" }, \"Approve\"),\n createElement(\"button\", { key: \"deny\", onClick: onDeny, \"data-action\": \"deny\" }, \"Deny\"),\n ),\n );\n }\n\n return createElement(\n \"div\",\n {\n \"data-tool-status\": part.status,\n \"data-tool-name\": part.name,\n },\n ...children,\n );\n}\n","import { createElement, type ReactNode } from \"react\";\nimport type {\n ChatMessage,\n MessagePart,\n TextPart,\n ReasoningPart,\n ToolCallPart,\n SourcePart,\n FilePart,\n} from \"../core.js\";\nimport { MarkdownRenderer } from \"./MarkdownRenderer.js\";\nimport { ThinkingBlock } from \"./ThinkingBlock.js\";\nimport { ToolCallView } from \"./ToolCallView.js\";\n\n/** Props for the Message component. */\nexport interface MessageProps {\n message: ChatMessage;\n renderText?: (part: TextPart, index: number) => ReactNode;\n renderReasoning?: (part: ReasoningPart, index: number) => ReactNode;\n renderToolCall?: (part: ToolCallPart, index: number) => ReactNode;\n renderSource?: (part: SourcePart, index: number) => ReactNode;\n renderFile?: (part: FilePart, index: number) => ReactNode;\n}\n\nfunction defaultRenderText(part: TextPart, index: number): ReactNode {\n return createElement(\"div\", { key: index, \"data-part\": \"text\" },\n createElement(MarkdownRenderer, { content: part.text }),\n );\n}\n\nfunction defaultRenderReasoning(part: ReasoningPart, index: number): ReactNode {\n return createElement(ThinkingBlock, {\n key: index,\n text: part.text,\n isStreaming: part.status === \"streaming\",\n });\n}\n\nfunction defaultRenderToolCall(part: ToolCallPart, index: number): ReactNode {\n return createElement(\"div\", { key: index, \"data-part\": \"tool_call\" },\n createElement(ToolCallView, { part }),\n );\n}\n\nfunction defaultRenderSource(part: SourcePart, index: number): ReactNode {\n return createElement(\"a\", { key: index, href: part.url, \"data-part\": \"source\" }, part.title ?? part.url);\n}\n\nfunction defaultRenderFile(part: FilePart, index: number): ReactNode {\n return createElement(\"span\", { key: index, \"data-part\": \"file\" }, part.name);\n}\n\nfunction renderPart(props: MessageProps, part: MessagePart, index: number): ReactNode {\n switch (part.type) {\n case \"text\":\n return (props.renderText ?? defaultRenderText)(part, index);\n case \"reasoning\":\n return (props.renderReasoning ?? defaultRenderReasoning)(part, index);\n case \"tool_call\":\n return (props.renderToolCall ?? defaultRenderToolCall)(part, index);\n case \"source\":\n return (props.renderSource ?? defaultRenderSource)(part, index);\n case \"file\":\n return (props.renderFile ?? defaultRenderFile)(part, index);\n }\n}\n\n/**\n * Headless message component rendering ChatMessage parts.\n * Wraps parts in a div with data-role and data-status attributes.\n */\nexport function Message(props: MessageProps): ReactNode {\n const { message } = props;\n const children = message.parts.map((part, i) => renderPart(props, part, i));\n return createElement(\n \"div\",\n {\n \"data-role\": message.role,\n \"data-status\": message.status,\n },\n ...children,\n );\n}\n","import { useMemo, useCallback } from \"react\";\nimport type { ChatMessage } from \"../core.js\";\n\n/** A pending tool call requiring user approval. */\nexport interface PendingToolRequest {\n toolCallId: string;\n toolName: string;\n toolArgs: Record<string, unknown>;\n messageId: string;\n}\n\n/** Return value from useToolApproval. */\nexport interface UseToolApprovalReturn {\n pendingRequests: PendingToolRequest[];\n approve: (toolCallId: string) => void;\n deny: (toolCallId: string) => void;\n}\n\n/**\n * Hook that tracks tool calls requiring approval from messages.\n *\n * Scans messages for ToolCallParts with status \"requires_approval\"\n * and provides approve/deny callbacks. Currently state-only\n * (no ChatEventBus integration).\n *\n * @param messages - Messages to scan for pending tool approvals\n * @param onApprove - Called when a tool call is approved\n * @param onDeny - Called when a tool call is denied\n */\nexport function useToolApproval(\n messages: ChatMessage[],\n onApprove?: (toolCallId: string) => void,\n onDeny?: (toolCallId: string) => void,\n): UseToolApprovalReturn {\n const pendingRequests = useMemo(() => {\n const requests: PendingToolRequest[] = [];\n for (const msg of messages) {\n for (const part of msg.parts) {\n if (part.type === \"tool_call\" && part.status === \"requires_approval\") {\n requests.push({\n toolCallId: part.toolCallId,\n toolName: part.name,\n toolArgs: (part.args ?? {}) as Record<string, unknown>,\n messageId: msg.id,\n });\n }\n }\n }\n return requests;\n }, [messages]);\n\n const approve = useCallback((toolCallId: string): void => {\n onApprove?.(toolCallId);\n }, [onApprove]);\n\n const deny = useCallback((toolCallId: string): void => {\n onDeny?.(toolCallId);\n }, [onDeny]);\n\n return { pendingRequests, approve, deny };\n}\n","import {\n createContext,\n createElement,\n useContext,\n type ReactNode,\n} from \"react\";\nimport type { ChatMessage, ReasoningPart, ToolCallPart } from \"../core.js\";\n\n/** Slot override functions for Thread customization. */\nexport interface ThreadSlotOverrides {\n renderMessage?: (message: ChatMessage, index: number) => ReactNode;\n renderToolCall?: (part: ToolCallPart, index: number) => ReactNode;\n renderThinkingBlock?: (part: ReasoningPart, index: number) => ReactNode;\n}\n\nconst ThreadSlotsContext = createContext<ThreadSlotOverrides | null>(null);\n\n/** Props for ThreadProvider. */\nexport interface ThreadProviderProps extends ThreadSlotOverrides {\n children: ReactNode;\n}\n\n/**\n * Provides slot-based customization for Thread message rendering.\n * Wrap a Thread in ThreadProvider to override how messages, tool calls,\n * or thinking blocks are rendered.\n */\nexport function ThreadProvider({\n children,\n renderMessage,\n renderToolCall,\n renderThinkingBlock,\n}: ThreadProviderProps): ReactNode {\n const value: ThreadSlotOverrides = { renderMessage, renderToolCall, renderThinkingBlock };\n return createElement(ThreadSlotsContext.Provider, { value }, children);\n}\n\n/**\n * Access slot overrides from ThreadProvider context.\n * @throws {Error} If used outside a ThreadProvider\n */\nexport function useThreadSlots(): ThreadSlotOverrides {\n const ctx = useContext(ThreadSlotsContext);\n if (!ctx) {\n throw new Error(\"useThreadSlots must be used within a ThreadProvider\");\n }\n return ctx;\n}\n\n/**\n * Access slot overrides if inside a ThreadProvider, or null if not.\n * Safe to call without a ThreadProvider ancestor.\n */\nexport function useOptionalThreadSlots(): ThreadSlotOverrides | null {\n return useContext(ThreadSlotsContext);\n}\n","import {\n createElement,\n useRef,\n useEffect,\n useCallback,\n useState,\n type ReactNode,\n} from \"react\";\nimport type { ChatMessage, ReasoningPart } from \"../core.js\";\nimport { Message } from \"./Message.js\";\nimport { useOptionalThreadSlots } from \"./ThreadSlots.js\";\n\n/** Props for the Thread component. */\nexport interface ThreadProps {\n messages: ChatMessage[];\n isGenerating?: boolean;\n autoScroll?: boolean;\n className?: string;\n}\n\n/**\n * Headless thread component wrapping a scrollable message list.\n * Auto-scrolls to bottom when new messages arrive unless user has scrolled up.\n * Shows a scroll-to-bottom button when scrolled up and an empty state when no messages.\n */\nexport function Thread({\n messages,\n isGenerating,\n autoScroll = true,\n className,\n}: ThreadProps): ReactNode {\n const sentinelRef = useRef<HTMLDivElement>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n const [userScrolledUp, setUserScrolledUp] = useState(false);\n const isScrollingProgrammatically = useRef(false);\n\n const handleScroll = useCallback(() => {\n if (isScrollingProgrammatically.current) return;\n const el = containerRef.current;\n if (!el) return;\n const atBottom = el.scrollHeight - el.scrollTop - el.clientHeight < 1;\n setUserScrolledUp(!atBottom);\n }, []);\n\n const scrollToBottom = useCallback(() => {\n isScrollingProgrammatically.current = true;\n sentinelRef.current?.scrollIntoView({ behavior: \"smooth\" });\n setUserScrolledUp(false);\n // Reset guard after smooth scroll completes\n setTimeout(() => { isScrollingProgrammatically.current = false; }, 500);\n }, []);\n\n useEffect(() => {\n if (!autoScroll || userScrolledUp) return;\n sentinelRef.current?.scrollIntoView({ behavior: \"smooth\" });\n }, [messages, autoScroll, userScrolledUp]);\n\n const slots = useOptionalThreadSlots();\n\n const attrs: Record<string, unknown> = { \"data-thread\": \"true\", className };\n if (isGenerating) {\n attrs[\"data-thread-loading\"] = \"true\";\n }\n attrs.ref = containerRef;\n attrs.onScroll = handleScroll;\n\n const children: ReactNode[] = [];\n\n // Empty state when no messages\n if (messages.length === 0 && !isGenerating) {\n children.push(\n createElement(\"div\", { key: \"__empty\", \"data-thread-empty\": \"true\" },\n \"Start a conversation\",\n ),\n );\n }\n\n // Message list\n for (let i = 0; i < messages.length; i++) {\n const msg = messages[i];\n const content = slots?.renderMessage\n ? slots.renderMessage(msg, i)\n : createElement(Message, {\n key: msg.id,\n message: msg,\n renderToolCall: slots?.renderToolCall,\n renderReasoning: slots?.renderThinkingBlock\n ? (part: ReasoningPart, idx: number) => slots!.renderThinkingBlock!(part, idx)\n : undefined,\n });\n\n children.push(\n createElement(\n \"div\",\n { key: msg.id, \"data-thread-message\": \"true\", \"data-role\": msg.role },\n content,\n ),\n );\n }\n\n // Loading indicator — bouncing dots shown during generation\n if (isGenerating) {\n children.push(\n createElement(\"div\", { key: \"__loading\", \"data-thread-loading-indicator\": \"true\" },\n createElement(\"span\", null),\n createElement(\"span\", null),\n createElement(\"span\", null),\n ),\n );\n }\n\n // Sentinel element for auto-scroll anchoring\n children.push(createElement(\"div\", { key: \"__sentinel\", ref: sentinelRef }));\n\n // Scroll-to-bottom button — shown when user scrolled up\n if (userScrolledUp) {\n children.push(\n createElement(\"button\", {\n key: \"__scroll-to-bottom\",\n \"data-action\": \"scroll-to-bottom\",\n type: \"button\",\n onClick: scrollToBottom,\n \"aria-label\": \"Scroll to bottom\",\n }),\n );\n }\n\n return createElement(\"div\", attrs, ...children);\n}\n","import {\n createElement,\n useRef,\n useCallback,\n useState,\n useEffect,\n type ReactNode,\n} from \"react\";\n\n/** Props for the Composer component. */\nexport interface ComposerProps {\n onSend: (text: string) => void;\n onStop?: () => void;\n isGenerating?: boolean;\n disabled?: boolean;\n placeholder?: string;\n maxRows?: number;\n className?: string;\n}\n\n/**\n * Headless composer component for sending messages.\n * Includes auto-resizing textarea, send/stop buttons, and keyboard shortcuts.\n */\nexport function Composer({\n onSend,\n onStop,\n isGenerating,\n disabled,\n placeholder = \"Type a message...\",\n maxRows = 5,\n className,\n}: ComposerProps): ReactNode {\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n const [value, setValue] = useState(\"\");\n\n const resize = useCallback(() => {\n const el = textareaRef.current;\n if (!el) return;\n el.style.height = \"auto\";\n const lineHeight = parseInt(getComputedStyle(el).lineHeight) || 20;\n const maxHeight = lineHeight * maxRows;\n el.style.height = `${Math.min(el.scrollHeight, maxHeight)}px`;\n }, [maxRows]);\n\n useEffect(() => {\n resize();\n }, [value, resize]);\n\n const handleSend = useCallback(() => {\n const trimmed = value.trim();\n if (!trimmed || isGenerating) return;\n onSend(trimmed);\n setValue(\"\");\n }, [value, isGenerating, onSend]);\n\n const handleKeyDown = useCallback(\n (e: KeyboardEvent) => {\n if (e.key === \"Enter\" && !e.shiftKey) {\n e.preventDefault();\n handleSend();\n }\n },\n [handleSend],\n );\n\n const handleChange = useCallback(\n (e: Event) => {\n setValue((e.target as HTMLTextAreaElement).value);\n },\n [],\n );\n\n const children: ReactNode[] = [\n createElement(\"div\", { key: \"input-wrapper\", \"data-input\": \"\" },\n createElement(\"textarea\", {\n ref: textareaRef,\n value,\n onChange: handleChange,\n onKeyDown: handleKeyDown,\n placeholder,\n disabled: disabled || false,\n \"aria-label\": \"Message input\",\n rows: 1,\n }),\n isGenerating\n ? createElement(\n \"button\",\n {\n key: \"stop\",\n \"data-action\": \"stop\",\n onClick: onStop,\n type: \"button\",\n },\n \"Stop\",\n )\n : createElement(\n \"button\",\n {\n key: \"send\",\n \"data-action\": \"send\",\n onClick: handleSend,\n disabled: !value.trim() || isGenerating,\n type: \"button\",\n },\n \"Send\",\n ),\n ),\n ];\n\n return createElement(\n \"div\",\n { \"data-composer\": \"true\", className },\n ...children,\n );\n}\n","import { createElement, useCallback, useMemo, type ReactNode } from \"react\";\nimport type { SessionInfo, ChatSession } from \"../core.js\";\n\n/** A session item that ThreadList can display — either full ChatSession or lightweight SessionInfo. */\ntype SessionItem = SessionInfo | ChatSession;\n\n/** Type guard: checks if item has `messages` array (ChatSession) vs `messageCount` (SessionInfo). */\nfunction isFullSession(item: SessionItem): item is ChatSession {\n return \"messages\" in item && Array.isArray((item as ChatSession).messages);\n}\n\n/** Format a Date to a short relative time string (e.g. \"2m\", \"3h\", \"5d\"). */\nfunction formatRelativeTime(date: Date): string {\n const now = Date.now();\n const diff = now - date.getTime();\n const seconds = Math.floor(diff / 1000);\n if (seconds < 60) return \"now\";\n const minutes = Math.floor(seconds / 60);\n if (minutes < 60) return `${minutes}m`;\n const hours = Math.floor(minutes / 60);\n if (hours < 24) return `${hours}h`;\n const days = Math.floor(hours / 24);\n if (days < 30) return `${days}d`;\n const months = Math.floor(days / 30);\n return `${months}mo`;\n}\n\n/** Normalize any session item to SessionInfo for display. */\nfunction normalizeSession(item: SessionItem): SessionInfo {\n if (isFullSession(item)) {\n return {\n id: item.id,\n title: item.title,\n status: item.status,\n messageCount: item.metadata?.messageCount ?? item.messages.length,\n lastMessage: item.messages[item.messages.length - 1],\n createdAt: item.createdAt,\n updatedAt: item.updatedAt,\n };\n }\n return item;\n}\n\n/** Props for the ThreadList component. */\nexport interface ThreadListProps {\n sessions: SessionItem[];\n activeSessionId?: string;\n onSelect: (id: string) => void;\n onCreate?: () => void;\n onDelete?: (id: string) => void;\n searchQuery?: string;\n onSearchChange?: (query: string) => void;\n className?: string;\n}\n\n/**\n * Session sidebar component for listing, searching, creating, and deleting sessions.\n */\nexport function ThreadList({\n sessions,\n activeSessionId,\n onSelect,\n onCreate,\n onDelete,\n searchQuery,\n onSearchChange,\n className,\n}: ThreadListProps): ReactNode {\n const handleSearchChange = useCallback(\n (e: Event) => {\n onSearchChange?.((e.target as HTMLInputElement).value);\n },\n [onSearchChange],\n );\n\n const normalized = useMemo(() => sessions.map(normalizeSession), [sessions]);\n\n const filtered = useMemo(() => {\n if (!searchQuery) return normalized;\n const q = searchQuery.toLowerCase();\n return normalized.filter((s) => (s.title ?? \"\").toLowerCase().includes(q));\n }, [normalized, searchQuery]);\n\n const children: ReactNode[] = [];\n\n // Header with search + create button\n children.push(\n createElement(\"div\", { key: \"header\", \"data-thread-list-header\": \"true\" },\n createElement(\"input\", {\n \"data-thread-list-search\": \"true\",\n value: searchQuery ?? \"\",\n onChange: handleSearchChange,\n placeholder: \"Search...\",\n }),\n createElement(\n \"button\",\n {\n \"data-action\": \"create-session\",\n onClick: onCreate,\n type: \"button\",\n },\n \"+\",\n ),\n ),\n );\n\n // Session items\n const items = filtered.map((session) => {\n const isActive = session.id === activeSessionId;\n const itemChildren: ReactNode[] = [\n createElement(\"span\", { key: \"title\", \"data-session-title\": \"true\" }, session.title ?? \"Untitled\"),\n ];\n\n if (session.updatedAt) {\n const timeStr = formatRelativeTime(new Date(session.updatedAt));\n itemChildren.push(\n createElement(\"span\", { key: \"time\", \"data-session-time\": \"true\" }, timeStr),\n );\n }\n\n if (onDelete) {\n itemChildren.push(\n createElement(\n \"button\",\n {\n key: \"delete\",\n \"data-action\": \"delete-session\",\n onClick: (e: MouseEvent) => {\n e.stopPropagation();\n onDelete(session.id);\n },\n type: \"button\",\n },\n \"×\",\n ),\n );\n }\n\n return createElement(\n \"div\",\n {\n key: session.id,\n \"data-session-item\": \"true\",\n \"data-session-active\": isActive ? \"true\" : \"false\",\n \"data-session-status\": session.status ?? \"active\",\n onClick: () => onSelect(session.id),\n },\n ...itemChildren,\n );\n });\n\n children.push(\n createElement(\n \"div\",\n { key: \"items\", \"data-thread-list-items\": \"true\" },\n ...items,\n ),\n );\n\n return createElement(\n \"div\",\n { \"data-thread-list\": \"true\", className },\n ...children,\n );\n}\n","import { useState, useRef, useCallback, useEffect } from \"react\";\nimport type { ChatEvent } from \"../core.js\";\n\n/** Connection status of the SSE hook. */\nexport type SSEStatus = \"idle\" | \"connecting\" | \"open\" | \"closed\" | \"error\";\n\n/** Options for the useSSE hook. */\nexport interface UseSSEOptions {\n /** HTTP method (default: \"GET\") */\n method?: \"GET\" | \"POST\";\n /** Request body for POST requests (JSON-serialized automatically) */\n body?: unknown;\n headers?: Record<string, string>;\n onEvent?: (event: ChatEvent) => void;\n onError?: (error: Error) => void;\n reconnect?: boolean;\n reconnectInterval?: number;\n}\n\n/** Return type for the useSSE hook. */\nexport interface UseSSEReturn {\n status: SSEStatus;\n connect: () => void;\n disconnect: () => void;\n lastEvent: ChatEvent | null;\n}\n\n/**\n * SSE transport hook using fetch (not EventSource).\n * Parses text/event-stream format with support for multi-line data and event types.\n */\nexport function useSSE(\n url: string | null,\n options: UseSSEOptions = {},\n): UseSSEReturn {\n const [status, setStatus] = useState<SSEStatus>(url === null ? \"idle\" : \"idle\");\n const [lastEvent, setLastEvent] = useState<ChatEvent | null>(null);\n const abortRef = useRef<AbortController | null>(null);\n const reconnectTimerRef = useRef<number | null>(null);\n const optionsRef = useRef(options);\n optionsRef.current = options;\n\n const disconnect = useCallback(() => {\n if (reconnectTimerRef.current !== null) {\n clearTimeout(reconnectTimerRef.current);\n reconnectTimerRef.current = null;\n }\n if (abortRef.current) {\n abortRef.current.abort();\n abortRef.current = null;\n }\n setStatus(\"closed\");\n }, []);\n\n const connect = useCallback(() => {\n if (!url) return;\n\n // Clear any pending reconnect timer\n if (reconnectTimerRef.current !== null) {\n clearTimeout(reconnectTimerRef.current);\n reconnectTimerRef.current = null;\n }\n\n // Abort previous connection\n if (abortRef.current) {\n abortRef.current.abort();\n }\n\n const controller = new AbortController();\n abortRef.current = controller;\n setStatus(\"connecting\");\n\n (async () => {\n try {\n const fetchInit: RequestInit = {\n method: optionsRef.current.method ?? \"GET\",\n headers: {\n Accept: \"text/event-stream\",\n ...optionsRef.current.headers,\n },\n signal: controller.signal,\n };\n\n if (fetchInit.method === \"POST\" && optionsRef.current.body !== undefined) {\n (fetchInit.headers as Record<string, string>)[\"Content-Type\"] = \"application/json\";\n fetchInit.body = JSON.stringify(optionsRef.current.body);\n }\n\n const response = await fetch(url, fetchInit);\n\n if (!response.ok) {\n throw new Error(`SSE request failed: ${response.status}`);\n }\n\n if (!response.body) {\n throw new Error(\"SSE response has no body\");\n }\n\n setStatus(\"open\");\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n let dataLines: string[] = [];\n\n const dispatchEvent = () => {\n if (dataLines.length === 0) return;\n const data = dataLines.join(\"\\n\");\n dataLines = [];\n\n try {\n const parsed = JSON.parse(data) as ChatEvent;\n setLastEvent(parsed);\n optionsRef.current.onEvent?.(parsed);\n } catch {\n // Non-JSON data, ignore\n }\n };\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop()!; // Keep incomplete last line in buffer\n\n for (const line of lines) {\n if (line === \"\") {\n // Empty line = dispatch event\n dispatchEvent();\n } else if (line.startsWith(\"data:\")) {\n dataLines.push(line.slice(5).trimStart());\n } else if (line.startsWith(\"event:\")) {\n // Event type field — parsed but not used separately\n // since ChatEvent carries its own type in the JSON data\n }\n // Ignore comments (lines starting with :) and other fields\n }\n }\n\n // Dispatch any remaining data\n if (dataLines.length > 0) {\n dispatchEvent();\n }\n\n if (!controller.signal.aborted) {\n setStatus(\"closed\");\n }\n } catch (err) {\n if (controller.signal.aborted) return;\n const error =\n err instanceof Error ? err : new Error(String(err));\n setStatus(\"error\");\n optionsRef.current.onError?.(error);\n\n // Reconnect on error if enabled\n if (optionsRef.current.reconnect && !controller.signal.aborted) {\n const delay = optionsRef.current.reconnectInterval ?? 3000;\n reconnectTimerRef.current = setTimeout(() => {\n if (abortRef.current && !abortRef.current.signal.aborted) {\n connect();\n }\n }, delay) as unknown as number;\n }\n }\n })();\n }, [url]);\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n if (reconnectTimerRef.current !== null) {\n clearTimeout(reconnectTimerRef.current);\n reconnectTimerRef.current = null;\n }\n if (abortRef.current) {\n abortRef.current.abort();\n abortRef.current = null;\n }\n };\n }, []);\n\n return { status, connect, disconnect, lastEvent };\n}\n","import { useState, useCallback, useEffect, useRef } from \"react\";\nimport { useChatRuntime } from \"./ChatProvider.js\";\n\n/** Model display option returned by useModels (mapped from core ModelInfo). */\nexport interface ModelOption {\n id: string;\n name: string;\n tier?: string;\n /** Provider/backend name for multi-provider context. */\n provider?: string;\n}\n\n/** Return type for the useModels hook. */\nexport interface UseModelsReturn {\n models: ModelOption[];\n isLoading: boolean;\n error: Error | null;\n refresh: () => void;\n search: (query: string) => ModelOption[];\n}\n\n/**\n * Hook for fetching and searching available models from the chat runtime.\n */\nexport function useModels(): UseModelsReturn {\n const runtime = useChatRuntime();\n const [models, setModels] = useState<ModelOption[]>([]);\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n const mountedRef = useRef(true);\n\n const fetchModels = useCallback(async () => {\n setIsLoading(true);\n setError(null);\n try {\n const result = await runtime.listModels();\n if (!mountedRef.current) return;\n const mapped: ModelOption[] = result.map((m) => ({\n id: m.id,\n name: m.name ?? m.id,\n tier: m.provider,\n provider: m.provider,\n }));\n setModels(mapped);\n } catch (err) {\n if (!mountedRef.current) return;\n setError(err instanceof Error ? err : new Error(String(err)));\n } finally {\n if (mountedRef.current) {\n setIsLoading(false);\n }\n }\n }, [runtime]);\n\n useEffect(() => {\n mountedRef.current = true;\n fetchModels();\n return () => {\n mountedRef.current = false;\n };\n }, [fetchModels]);\n\n const search = useCallback(\n (query: string): ModelOption[] => {\n const q = query.toLowerCase();\n return models.filter((m) => m.name.toLowerCase().includes(q));\n },\n [models],\n );\n\n return { models, isLoading, error, refresh: fetchModels, search };\n}\n","import {\n createElement,\n useState,\n useCallback,\n useEffect,\n useRef,\n useMemo,\n type ReactNode,\n} from \"react\";\nimport type { ModelOption } from \"./useModels.js\";\n\n/** Props for the ModelSelector component. */\nexport interface ModelSelectorProps {\n models: ModelOption[];\n selectedModel?: string;\n onSelect: (modelId: string) => void;\n placeholder?: string;\n className?: string;\n /** Allow free-text model input when models list is empty. Default: true. */\n allowFreeText?: boolean;\n}\n\n/**\n * Dropdown model selector with search and keyboard navigation.\n * Falls back to a free-text input when models list is empty.\n */\nexport function ModelSelector({\n models,\n selectedModel,\n onSelect,\n placeholder = \"Select model\",\n className,\n allowFreeText = true,\n}: ModelSelectorProps): ReactNode {\n const [open, setOpen] = useState(false);\n const [search, setSearch] = useState(\"\");\n const [highlightIndex, setHighlightIndex] = useState(0);\n const [freeText, setFreeText] = useState(selectedModel ?? \"\");\n const containerRef = useRef<HTMLDivElement>(null);\n\n const filtered = useMemo(() => {\n if (!search) return models;\n const q = search.toLowerCase();\n return models.filter((m) => m.name.toLowerCase().includes(q));\n }, [models, search]);\n\n useEffect(() => {\n setHighlightIndex(0);\n }, [filtered.length]);\n\n const selectedInfo = useMemo(\n () => models.find((m) => m.id === selectedModel),\n [models, selectedModel],\n );\n\n const handleToggle = useCallback(() => {\n setOpen((prev) => {\n if (!prev) {\n setSearch(\"\");\n setHighlightIndex(0);\n }\n return !prev;\n });\n }, []);\n\n const handleSelect = useCallback(\n (modelId: string) => {\n onSelect(modelId);\n setOpen(false);\n setSearch(\"\");\n },\n [onSelect],\n );\n\n const handleSearchChange = useCallback((e: Event) => {\n setSearch((e.target as HTMLInputElement).value);\n }, []);\n\n const handleKeyDown = useCallback(\n (e: KeyboardEvent) => {\n if (e.key === \"ArrowDown\") {\n e.preventDefault();\n setHighlightIndex((prev) => Math.min(prev + 1, filtered.length - 1));\n } else if (e.key === \"ArrowUp\") {\n e.preventDefault();\n setHighlightIndex((prev) => Math.max(prev - 1, 0));\n } else if (e.key === \"Enter\") {\n e.preventDefault();\n if (filtered[highlightIndex]) {\n handleSelect(filtered[highlightIndex].id);\n }\n } else if (e.key === \"Escape\") {\n e.preventDefault();\n setOpen(false);\n }\n },\n [filtered, highlightIndex, handleSelect],\n );\n\n // Free-text mode when no models available and allowFreeText is true\n if (models.length === 0 && allowFreeText) {\n return createElement(\n \"div\",\n {\n \"data-model-selector\": \"true\",\n \"data-model-selector-freetext\": \"true\",\n className,\n ref: containerRef,\n },\n createElement(\"input\", {\n \"data-model-input\": \"true\",\n value: freeText,\n placeholder: \"Enter model name...\",\n onChange: (e: Event) => setFreeText((e.target as HTMLInputElement).value),\n onKeyDown: (e: KeyboardEvent) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n const val = freeText.trim();\n if (val) onSelect(val);\n }\n },\n }),\n createElement(\n \"button\",\n {\n type: \"button\",\n \"data-action\": \"apply-model\",\n onClick: () => {\n const val = freeText.trim();\n if (val) onSelect(val);\n },\n },\n \"Apply\",\n ),\n );\n }\n\n const children: ReactNode[] = [];\n\n // Trigger button\n children.push(\n createElement(\n \"button\",\n {\n key: \"trigger\",\n \"data-model-selector-trigger\": \"true\",\n onClick: handleToggle,\n type: \"button\",\n },\n selectedInfo ? selectedInfo.name : placeholder,\n ),\n );\n\n // Dropdown panel\n if (open) {\n const dropdownChildren: ReactNode[] = [];\n\n // Search input\n dropdownChildren.push(\n createElement(\"input\", {\n key: \"search\",\n \"data-model-selector-search\": \"true\",\n value: search,\n onChange: handleSearchChange,\n onKeyDown: handleKeyDown,\n placeholder: \"Search models...\",\n autoFocus: true,\n }),\n );\n\n // Model options\n const hasMultipleProviders = new Set(filtered.map((m) => m.provider).filter(Boolean)).size > 1;\n filtered.forEach((model, idx) => {\n const isSelected = model.id === selectedModel;\n const isHighlighted = idx === highlightIndex;\n const attrs: Record<string, unknown> = {\n key: model.id,\n \"data-model-option\": \"true\",\n onClick: () => handleSelect(model.id),\n };\n if (model.tier) {\n attrs[\"data-tier\"] = model.tier;\n }\n if (model.provider && hasMultipleProviders) {\n attrs[\"data-model-provider\"] = model.provider;\n }\n if (isSelected) {\n attrs[\"data-model-selected\"] = \"true\";\n }\n if (isHighlighted) {\n attrs[\"data-model-highlighted\"] = \"true\";\n }\n const label = model.provider && hasMultipleProviders\n ? `${model.name} (${model.provider})`\n : model.name;\n dropdownChildren.push(createElement(\"div\", attrs, label));\n });\n\n children.push(\n createElement(\n \"div\",\n { key: \"dropdown\", \"data-model-selector-dropdown\": \"true\" },\n ...dropdownChildren,\n ),\n );\n }\n\n return createElement(\n \"div\",\n {\n \"data-model-selector\": \"true\",\n className,\n ref: containerRef,\n },\n ...children,\n );\n}\n","/**\n * @witqq/agent-sdk/chat/react — useCopilotAuth\n *\n * Server-delegated Copilot Device Flow authentication hook.\n * Independently usable — does not require useRemoteAuth orchestrator.\n */\n\nimport { useState, useCallback, useRef } from \"react\";\nimport type { AuthToken } from \"../../../auth/types.js\";\n\n/** Options for useCopilotAuth. */\nexport interface UseCopilotAuthOptions {\n /** Base URL of the auth server (e.g. \"/api/auth\") */\n baseUrl: string;\n /** Called after successful authentication */\n onAuthenticated?: (token: AuthToken) => void;\n /** Called on authentication error */\n onError?: (error: Error) => void;\n /** Optional fetch override (for testing) */\n fetch?: typeof globalThis.fetch;\n /** Optional headers for all requests */\n headers?: Record<string, string>;\n}\n\n/** Return value from useCopilotAuth. */\nexport interface UseCopilotAuthReturn {\n status: \"idle\" | \"pending\" | \"authenticated\" | \"error\";\n error: Error | null;\n token: AuthToken | null;\n deviceCode: string | null;\n verificationUrl: string | null;\n /** Start the device flow. Shows deviceCode and verificationUrl, then polls for completion. */\n start: () => Promise<void>;\n reset: () => void;\n}\n\n/**\n * Copilot Device Flow authentication.\n * Starts device flow on server, provides code/URL for user, polls until complete.\n */\nexport function useCopilotAuth(options: UseCopilotAuthOptions): UseCopilotAuthReturn {\n const { baseUrl, headers } = options;\n const fetchFn = options.fetch ?? globalThis.fetch.bind(globalThis);\n\n const [status, setStatus] = useState<\"idle\" | \"pending\" | \"authenticated\" | \"error\">(\"idle\");\n const [error, setError] = useState<Error | null>(null);\n const [token, setToken] = useState<AuthToken | null>(null);\n const [deviceCode, setDeviceCode] = useState<string | null>(null);\n const [verificationUrl, setVerificationUrl] = useState<string | null>(null);\n\n const onAuthenticatedRef = useRef(options.onAuthenticated);\n onAuthenticatedRef.current = options.onAuthenticated;\n const onErrorRef = useRef(options.onError);\n onErrorRef.current = options.onError;\n\n const post = useCallback(\n async (path: string, body?: Record<string, unknown>) => {\n const res = await fetchFn(`${baseUrl}${path}`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\", ...headers },\n body: body ? JSON.stringify(body) : undefined,\n });\n const data = await res.json();\n if (!res.ok) throw new Error(data.error || `HTTP ${res.status}`);\n return data;\n },\n [baseUrl, fetchFn, headers],\n );\n\n const start = useCallback(async () => {\n setStatus(\"pending\");\n setError(null);\n try {\n const result = await post(\"/auth/start\", { provider: \"copilot\" });\n setDeviceCode(result.userCode);\n setVerificationUrl(result.verificationUrl);\n await post(\"/auth/copilot/poll\");\n const authToken: AuthToken = {\n accessToken: \"server-managed\",\n tokenType: \"bearer\",\n obtainedAt: Date.now(),\n };\n setToken(authToken);\n setStatus(\"authenticated\");\n onAuthenticatedRef.current?.(authToken);\n } catch (err) {\n const e = err instanceof Error ? err : new Error(String(err));\n setError(e);\n setStatus(\"error\");\n onErrorRef.current?.(e);\n }\n }, [post]);\n\n const reset = useCallback(() => {\n setStatus(\"idle\");\n setError(null);\n setToken(null);\n setDeviceCode(null);\n setVerificationUrl(null);\n }, []);\n\n return { status, error, token, deviceCode, verificationUrl, start, reset };\n}\n","/**\n * @witqq/agent-sdk/chat/react — useClaudeAuth\n *\n * Server-delegated Claude OAuth + PKCE authentication hook.\n * Independently usable — does not require useRemoteAuth orchestrator.\n */\n\nimport { useState, useCallback, useRef } from \"react\";\nimport type { AuthToken } from \"../../../auth/types.js\";\n\n/** Options for useClaudeAuth. */\nexport interface UseClaudeAuthOptions {\n /** Base URL of the auth server (e.g. \"/api/auth\") */\n baseUrl: string;\n /** Called after successful authentication */\n onAuthenticated?: (token: AuthToken) => void;\n /** Called on authentication error */\n onError?: (error: Error) => void;\n /** Optional fetch override (for testing) */\n fetch?: typeof globalThis.fetch;\n /** Optional headers for all requests */\n headers?: Record<string, string>;\n}\n\n/** Return value from useClaudeAuth. */\nexport interface UseClaudeAuthReturn {\n status: \"idle\" | \"pending\" | \"authenticated\" | \"error\";\n error: Error | null;\n token: AuthToken | null;\n authorizeUrl: string | null;\n /** Start OAuth flow. Sets authorizeUrl for user redirect. */\n start: () => Promise<void>;\n /** Complete OAuth after redirect. Pass the code or callback URL. */\n complete: (codeOrUrl: string) => Promise<void>;\n reset: () => void;\n}\n\n/**\n * Claude OAuth + PKCE authentication.\n * Two-step flow: start() gets authorizeUrl → user redirects → complete(code) finishes.\n */\nexport function useClaudeAuth(options: UseClaudeAuthOptions): UseClaudeAuthReturn {\n const { baseUrl, headers } = options;\n const fetchFn = options.fetch ?? globalThis.fetch.bind(globalThis);\n\n const [status, setStatus] = useState<\"idle\" | \"pending\" | \"authenticated\" | \"error\">(\"idle\");\n const [error, setError] = useState<Error | null>(null);\n const [token, setToken] = useState<AuthToken | null>(null);\n const [authorizeUrl, setAuthorizeUrl] = useState<string | null>(null);\n\n const onAuthenticatedRef = useRef(options.onAuthenticated);\n onAuthenticatedRef.current = options.onAuthenticated;\n const onErrorRef = useRef(options.onError);\n onErrorRef.current = options.onError;\n\n const post = useCallback(\n async (path: string, body?: Record<string, unknown>) => {\n const res = await fetchFn(`${baseUrl}${path}`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\", ...headers },\n body: body ? JSON.stringify(body) : undefined,\n });\n const data = await res.json();\n if (!res.ok) throw new Error(data.error || `HTTP ${res.status}`);\n return data;\n },\n [baseUrl, fetchFn, headers],\n );\n\n const start = useCallback(async () => {\n setStatus(\"pending\");\n setError(null);\n try {\n const result = await post(\"/auth/start\", { provider: \"claude\" });\n setAuthorizeUrl(result.authorizeUrl);\n } catch (err) {\n const e = err instanceof Error ? err : new Error(String(err));\n setError(e);\n setStatus(\"error\");\n onErrorRef.current?.(e);\n }\n }, [post]);\n\n const complete = useCallback(async (codeOrUrl: string) => {\n try {\n await post(\"/auth/claude/complete\", { code: codeOrUrl });\n const authToken: AuthToken = {\n accessToken: \"server-managed\",\n tokenType: \"bearer\",\n obtainedAt: Date.now(),\n };\n setToken(authToken);\n setStatus(\"authenticated\");\n onAuthenticatedRef.current?.(authToken);\n } catch (err) {\n const e = err instanceof Error ? err : new Error(String(err));\n setError(e);\n setStatus(\"error\");\n onErrorRef.current?.(e);\n }\n }, [post]);\n\n const reset = useCallback(() => {\n setStatus(\"idle\");\n setError(null);\n setToken(null);\n setAuthorizeUrl(null);\n }, []);\n\n return { status, error, token, authorizeUrl, start, complete, reset };\n}\n","/**\n * @witqq/agent-sdk/chat/react — useApiKeyAuth\n *\n * Server-delegated API key authentication hook (for Vercel AI / OpenRouter / etc.).\n * Independently usable — does not require useRemoteAuth orchestrator.\n */\n\nimport { useState, useCallback, useRef } from \"react\";\nimport type { AuthToken } from \"../../../auth/types.js\";\n\n/** Options for useApiKeyAuth. */\nexport interface UseApiKeyAuthOptions {\n /** Base URL of the auth server (e.g. \"/api/auth\") */\n baseUrl: string;\n /** Called after successful authentication */\n onAuthenticated?: (token: AuthToken) => void;\n /** Called on authentication error */\n onError?: (error: Error) => void;\n /** Optional fetch override (for testing) */\n fetch?: typeof globalThis.fetch;\n /** Optional headers for all requests */\n headers?: Record<string, string>;\n}\n\n/** Return value from useApiKeyAuth. */\nexport interface UseApiKeyAuthReturn {\n status: \"idle\" | \"pending\" | \"authenticated\" | \"error\";\n error: Error | null;\n token: AuthToken | null;\n /** Submit an API key (and optional provider base URL). */\n submit: (key: string, apiBaseUrl?: string) => Promise<void>;\n reset: () => void;\n}\n\n/**\n * API key authentication.\n * Sends key to server for validation and storage.\n */\nexport function useApiKeyAuth(options: UseApiKeyAuthOptions): UseApiKeyAuthReturn {\n const { baseUrl, headers } = options;\n const fetchFn = options.fetch ?? globalThis.fetch.bind(globalThis);\n\n const [status, setStatus] = useState<\"idle\" | \"pending\" | \"authenticated\" | \"error\">(\"idle\");\n const [error, setError] = useState<Error | null>(null);\n const [token, setToken] = useState<AuthToken | null>(null);\n\n const onAuthenticatedRef = useRef(options.onAuthenticated);\n onAuthenticatedRef.current = options.onAuthenticated;\n const onErrorRef = useRef(options.onError);\n onErrorRef.current = options.onError;\n\n const submit = useCallback(async (key: string, apiBaseUrl?: string) => {\n if (!key || !key.trim()) {\n const e = new Error(\"API key cannot be empty\");\n setError(e);\n setStatus(\"error\");\n onErrorRef.current?.(e);\n return;\n }\n setStatus(\"pending\");\n setError(null);\n try {\n const res = await fetchFn(`${baseUrl}/auth/vercel/complete`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\", ...headers },\n body: JSON.stringify({\n apiKey: key.trim(),\n ...(apiBaseUrl ? { baseUrl: apiBaseUrl } : {}),\n }),\n });\n const data = await res.json();\n if (!res.ok) throw new Error(data.error || `HTTP ${res.status}`);\n const authToken: AuthToken = {\n accessToken: \"server-managed\",\n tokenType: \"bearer\",\n obtainedAt: Date.now(),\n };\n setToken(authToken);\n setStatus(\"authenticated\");\n onAuthenticatedRef.current?.(authToken);\n } catch (err) {\n const e = err instanceof Error ? err : new Error(String(err));\n setError(e);\n setStatus(\"error\");\n onErrorRef.current?.(e);\n }\n }, [baseUrl, fetchFn, headers]);\n\n const reset = useCallback(() => {\n setStatus(\"idle\");\n setError(null);\n setToken(null);\n }, []);\n\n return { status, error, token, submit, reset };\n}\n","/**\n * @witqq/agent-sdk/chat/react — useRemoteAuth\n *\n * Server-delegated authentication hook. Delegates all auth flows to\n * the server auth handler (createAuthHandler) via HTTP, avoiding\n * browser crypto dependencies entirely.\n *\n * Replaces useAuth for browser contexts. Same interface shape for easy migration.\n */\n\nimport { useState, useCallback, useRef } from \"react\";\nimport type { AuthToken } from \"../../auth/types.js\";\nimport { useCopilotAuth } from \"./auth/useCopilotAuth.js\";\nimport { useClaudeAuth } from \"./auth/useClaudeAuth.js\";\nimport { useApiKeyAuth } from \"./auth/useApiKeyAuth.js\";\n\n/** Supported remote auth backends. */\nexport type RemoteAuthBackend = \"copilot\" | \"claude\" | \"vercel-ai\";\n\n/** Auth status state machine: idle → pending → authenticated | error. */\nexport type RemoteAuthStatus = \"idle\" | \"pending\" | \"authenticated\" | \"error\";\n\n/** Options for the useRemoteAuth hook. */\nexport interface UseRemoteAuthOptions {\n /** Auth backend to use */\n backend: RemoteAuthBackend;\n /** Base URL of the auth server (e.g. \"http://localhost:3456/api/auth\") */\n baseUrl: string;\n /** Called after successful authentication */\n onAuthenticated?: (token: AuthToken) => void;\n /** Optional fetch override (for testing) */\n fetch?: typeof globalThis.fetch;\n /** Optional headers for all requests */\n headers?: Record<string, string>;\n}\n\n/** Return value from useRemoteAuth. */\nexport interface UseRemoteAuthReturn {\n status: RemoteAuthStatus;\n error: Error | null;\n // Copilot Device Flow (server-delegated)\n startDeviceFlow: () => Promise<void>;\n deviceCode: string | null;\n verificationUrl: string | null;\n // Claude OAuth (server-delegated)\n startOAuthFlow: () => Promise<void>;\n authorizeUrl: string | null;\n completeOAuth: (codeOrUrl: string) => Promise<void>;\n // API key (server-delegated)\n submitApiKey: (key: string, baseUrl?: string) => Promise<void>;\n // Unified start (auto-dispatches to correct flow by provider)\n start: (provider?: RemoteAuthBackend) => Promise<void>;\n // Common\n token: AuthToken | null;\n reset: () => void;\n // Server-specific\n savedProviders: string[];\n loadSavedTokens: () => Promise<void>;\n useSavedToken: (provider: RemoteAuthBackend) => Promise<void>;\n clearTokens: () => Promise<void>;\n}\n\n/**\n * Server-delegated authentication hook.\n *\n * Communicates with server auth handler endpoints (POST /auth/start,\n * POST /auth/copilot/poll, etc.) instead of running auth flows in the browser.\n * No node:crypto dependency since all crypto operations happen server-side.\n *\n * @param options - Hook configuration\n * @returns Auth state and action methods\n *\n * @example\n * ```ts\n * const auth = useRemoteAuth({\n * backend: \"copilot\",\n * baseUrl: \"/api/auth\",\n * onAuthenticated: (token) => console.log(\"Authenticated:\", token),\n * });\n * ```\n */\nexport function useRemoteAuth(options: UseRemoteAuthOptions): UseRemoteAuthReturn {\n const { backend, baseUrl, onAuthenticated, headers } = options;\n const fetchFn = options.fetch ?? globalThis.fetch.bind(globalThis);\n\n // Orchestrator-level state (single source of truth for public interface)\n const [status, setStatus] = useState<RemoteAuthStatus>(\"idle\");\n const [error, setError] = useState<Error | null>(null);\n const [token, setToken] = useState<AuthToken | null>(null);\n const [savedProviders, setSavedProviders] = useState<string[]>([]);\n\n const onAuthenticatedRef = useRef(onAuthenticated);\n onAuthenticatedRef.current = onAuthenticated;\n\n // Callbacks to sync per-backend hook outcomes → orchestrator state\n const handleSuccess = useCallback((authToken: AuthToken) => {\n setToken(authToken);\n setStatus(\"authenticated\");\n onAuthenticatedRef.current?.(authToken);\n }, []);\n\n const handleError = useCallback((err: Error) => {\n setError(err);\n setStatus(\"error\");\n }, []);\n\n const hookOpts = { baseUrl, headers, fetch: fetchFn, onAuthenticated: handleSuccess, onError: handleError };\n\n // Per-backend hooks for backend-specific state + auth HTTP calls\n const copilot = useCopilotAuth(hookOpts);\n const claude = useClaudeAuth(hookOpts);\n const apiKey = useApiKeyAuth(hookOpts);\n\n const post = useCallback(\n async (path: string, body?: Record<string, unknown>) => {\n const res = await fetchFn(`${baseUrl}${path}`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\", ...headers },\n body: body ? JSON.stringify(body) : undefined,\n });\n const data = await res.json();\n if (!res.ok) throw new Error(data.error || `HTTP ${res.status}`);\n return data;\n },\n [baseUrl, fetchFn, headers],\n );\n\n const get = useCallback(\n async (path: string) => {\n const res = await fetchFn(`${baseUrl}${path}`, {\n method: \"GET\",\n headers: { ...headers },\n });\n const data = await res.json();\n if (!res.ok) throw new Error(data.error || `HTTP ${res.status}`);\n return data;\n },\n [baseUrl, fetchFn, headers],\n );\n\n // Wrap per-backend methods with backend guards and orchestrator status\n const startDeviceFlow = useCallback(async () => {\n if (backend !== \"copilot\") return;\n setStatus(\"pending\");\n setError(null);\n await copilot.start();\n }, [backend, copilot]);\n\n const startOAuthFlow = useCallback(async () => {\n if (backend !== \"claude\") return;\n setStatus(\"pending\");\n setError(null);\n await claude.start();\n }, [backend, claude]);\n\n const completeOAuth = useCallback(\n async (codeOrUrl: string) => {\n await claude.complete(codeOrUrl);\n },\n [claude],\n );\n\n const submitApiKey = useCallback(\n async (key: string, apiBaseUrl?: string) => {\n if (backend !== \"vercel-ai\") return;\n await apiKey.submit(key, apiBaseUrl);\n },\n [backend, apiKey],\n );\n\n // Cross-cutting operations managed at orchestrator level\n const loadSavedTokens = useCallback(async () => {\n try {\n const data = await get(\"/tokens/saved\");\n setSavedProviders(data.saved || []);\n } catch {\n // Silently fail — saved tokens are optional\n }\n }, [get]);\n\n const useSavedToken = useCallback(\n async (provider: RemoteAuthBackend) => {\n try {\n await post(\"/tokens/use\", { provider });\n const authToken: AuthToken = {\n accessToken: \"server-managed\",\n tokenType: \"bearer\",\n obtainedAt: Date.now(),\n };\n setToken(authToken);\n setStatus(\"authenticated\");\n onAuthenticatedRef.current?.(authToken);\n } catch (err) {\n setError(err instanceof Error ? err : new Error(String(err)));\n setStatus(\"error\");\n }\n },\n [post],\n );\n\n const clearTokens = useCallback(async () => {\n try {\n await post(\"/tokens/clear\");\n setSavedProviders([]);\n } catch {\n // Silently fail\n }\n }, [post]);\n\n const reset = useCallback(() => {\n setStatus(\"idle\");\n setError(null);\n setToken(null);\n copilot.reset();\n claude.reset();\n apiKey.reset();\n setSavedProviders([]);\n }, [copilot, claude, apiKey]);\n\n const start = useCallback(async (provider?: RemoteAuthBackend) => {\n const target = provider ?? backend;\n setStatus(\"pending\");\n setError(null);\n switch (target) {\n case \"copilot\":\n await copilot.start();\n break;\n case \"claude\":\n await claude.start();\n break;\n case \"vercel-ai\": {\n const e = new Error(\"vercel-ai requires submitApiKey(key, baseUrl) — cannot auto-start\");\n setError(e);\n setStatus(\"error\");\n return;\n }\n default: {\n const e = new Error(`Unknown auth provider: ${target as string}`);\n setError(e);\n setStatus(\"error\");\n return;\n }\n }\n }, [backend, copilot, claude]);\n\n return {\n status,\n error,\n startDeviceFlow,\n deviceCode: copilot.deviceCode,\n verificationUrl: copilot.verificationUrl,\n startOAuthFlow,\n authorizeUrl: claude.authorizeUrl,\n completeOAuth,\n submitApiKey,\n start,\n token,\n reset,\n savedProviders,\n loadSavedTokens,\n useSavedToken,\n clearTokens,\n };\n}\n","/**\n * Generic listener set utility for subscribe/notify patterns.\n *\n * Encapsulates the recurring pattern of:\n * - Set<callback> storage\n * - add(callback) → unsubscribe function\n * - notify(...args) with try/catch per listener\n * - clear() for disposal\n */\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport class ListenerSet<T extends (...args: any[]) => void> {\n private readonly _listeners = new Set<T>();\n\n /** Add a listener. Returns an unsubscribe function. */\n add(callback: T): () => void {\n this._listeners.add(callback);\n return () => { this._listeners.delete(callback); };\n }\n\n /** Notify all listeners with the given arguments. Errors are isolated per listener. */\n notify(...args: Parameters<T>): void {\n for (const cb of this._listeners) {\n try { cb(...args); } catch { /* listener errors must not propagate */ }\n }\n }\n\n /** Remove all listeners. */\n clear(): void {\n this._listeners.clear();\n }\n\n /** Current number of listeners. */\n get size(): number {\n return this._listeners.size;\n }\n}\n","/**\n * Client-side adapter that implements IChatClient by delegating\n * operations over HTTP/SSE to a remote server.\n *\n * Bridges the gap between SDK React hooks (which require an in-process runtime)\n * and the common architecture where ChatRuntime runs on a server.\n *\n * @example\n * ```ts\n * import { RemoteChatClient } from \"@witqq/agent-sdk/chat/react\";\n * import { ChatProvider } from \"@witqq/agent-sdk/chat/react\";\n *\n * const client = new RemoteChatClient({ baseUrl: \"/api\" });\n * <ChatProvider runtime={client}> ... </ChatProvider>\n * ```\n */\n\nimport type { ChatEvent, ChatSession, ChatId, ChatIdLike, RuntimeStatus, SendMessageOptions } from \"../core.js\";\nimport type { IChatClient, BackendInfo, SelectionChangeCallback } from \"../runtime.js\";\nimport type { ModelInfo } from \"../../types.js\";\nimport type { CreateSessionOptions, SessionListOptions } from \"../sessions.js\";\nimport type { ProviderConfig } from \"../provider-types.js\";\nimport type { ContextStats } from \"../context.js\";\nimport { ListenerSet } from \"../listener-set.js\";\n\n// ─── Server Endpoint Contract ──────────────────────────────────\n\n/**\n * Standard server endpoint contract.\n * Server implementations expose these routes to work with RemoteChatClient.\n *\n * POST {baseUrl}/sessions/create — Create session\n * GET {baseUrl}/sessions/{id} — Get session\n * GET {baseUrl}/sessions — List sessions\n * DELETE {baseUrl}/sessions/{id} — Delete session\n * GET {baseUrl}/sessions/{id}/context-stats — Get context window stats\n * POST {baseUrl}/send — Send message (SSE stream response)\n * POST {baseUrl}/abort — Abort current stream\n * GET {baseUrl}/models — List models\n * GET {baseUrl}/backends — List backends\n * POST {baseUrl}/model/switch — Switch model\n * POST {baseUrl}/provider/switch — Switch provider (backend + model)\n * GET {baseUrl}/providers — List providers\n * POST {baseUrl}/providers — Create provider\n * PUT {baseUrl}/providers/{id} — Update provider\n * DELETE {baseUrl}/providers/{id} — Delete provider\n */\nexport interface RemoteChatClientOptions {\n /** Base URL for API endpoints (e.g. \"/api\" or \"https://example.com/api\") */\n baseUrl: string;\n /** Optional headers for all requests (e.g. auth tokens) */\n headers?: Record<string, string>;\n /** Custom fetch implementation for testability */\n fetch?: typeof globalThis.fetch;\n}\n\n// ─── RemoteChatClient ─────────────────────────────────────────\n\nexport class RemoteChatClient implements IChatClient {\n private _status: RuntimeStatus = \"idle\";\n private _activeSessionId: ChatId | null = null;\n private _selectedProviderId: string | null = null;\n private _abortController: AbortController | null = null;\n\n private readonly baseUrl: string;\n private readonly headers: Record<string, string>;\n private readonly _fetch: typeof globalThis.fetch;\n private readonly _selectionListeners = new ListenerSet<SelectionChangeCallback>();\n\n constructor(options: RemoteChatClientOptions) {\n this.baseUrl = options.baseUrl.replace(/\\/$/, \"\");\n this.headers = options.headers ?? {};\n this._fetch = options.fetch ?? globalThis.fetch.bind(globalThis);\n }\n\n // ─── Lifecycle ──────────────────────────────────────────────\n\n get status(): RuntimeStatus {\n return this._status;\n }\n\n async dispose(): Promise<void> {\n this.abort();\n this._status = \"disposed\";\n }\n\n private assertNotDisposed(): void {\n if (this._status === \"disposed\") {\n throw new Error(\"Runtime is disposed\");\n }\n }\n\n // ─── Provider Selection ────────────────────────────────────\n\n get selectedProviderId(): string | null {\n return this._selectedProviderId;\n }\n\n selectProvider(providerId: string): void {\n this.assertNotDisposed();\n this._selectedProviderId = providerId;\n this._notifySelectionChange(providerId);\n }\n\n onSelectionChange(callback: SelectionChangeCallback): () => void {\n return this._selectionListeners.add(callback);\n }\n\n private _notifySelectionChange(providerId: string | null): void {\n this._selectionListeners.notify(providerId);\n }\n\n // ─── Sessions ───────────────────────────────────────────────\n\n get activeSessionId(): ChatId | null {\n return this._activeSessionId;\n }\n\n async createSession(options: CreateSessionOptions): Promise<ChatSession> {\n this.assertNotDisposed();\n const res = await this._post(\"/sessions/create\", options);\n const session = await res.json() as ChatSession;\n this._activeSessionId = session.id;\n this._notifySessionChange();\n return session;\n }\n\n async getSession(id: ChatIdLike): Promise<ChatSession | null> {\n this.assertNotDisposed();\n const res = await this._get(`/sessions/${id}`);\n if (res.status === 404) return null;\n return await res.json() as ChatSession;\n }\n\n async listSessions(_options?: SessionListOptions): Promise<ChatSession[]> {\n this.assertNotDisposed();\n const res = await this._get(\"/sessions\");\n return await res.json() as ChatSession[];\n }\n\n async deleteSession(id: ChatIdLike): Promise<void> {\n this.assertNotDisposed();\n await this._delete(`/sessions/${id}`);\n if (this._activeSessionId === (id as ChatId)) {\n this._activeSessionId = null;\n }\n this._notifySessionChange();\n }\n\n /**\n * Fetch context window stats from server.\n * Returns null if stats not available (e.g. no messages sent yet).\n */\n async getContextStats(sessionId: ChatIdLike): Promise<ContextStats | null> {\n this.assertNotDisposed();\n const res = await this._get(`/sessions/${sessionId}/context-stats`);\n const data = await res.json();\n return data as ContextStats | null;\n }\n\n async switchSession(id: ChatIdLike): Promise<ChatSession> {\n this.assertNotDisposed();\n const session = await this.getSession(id);\n if (!session) throw new Error(`Session not found: ${id}`);\n this._activeSessionId = session.id;\n this._notifySessionChange();\n return session;\n }\n\n // ─── Messaging ──────────────────────────────────────────────\n\n async *send(\n sessionId: ChatIdLike,\n message: string,\n options?: SendMessageOptions,\n ): AsyncIterable<ChatEvent> {\n this.assertNotDisposed();\n this._status = \"streaming\";\n this._abortController = new AbortController();\n\n try {\n const res = await this._fetch(`${this.baseUrl}/send`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Accept: \"text/event-stream\",\n ...this.headers,\n },\n body: JSON.stringify({\n sessionId,\n message,\n model: options?.model,\n providerId: this._selectedProviderId ?? undefined,\n }),\n signal: this._abortController.signal,\n });\n\n if (!res.ok) {\n throw new Error(`Send failed: ${res.status} ${res.statusText}`);\n }\n\n if (!res.body) {\n throw new Error(\"No response body for SSE stream\");\n }\n\n yield* this._parseSSEStream(res.body, this._abortController.signal);\n } catch (err: unknown) {\n if (err instanceof DOMException && err.name === \"AbortError\") {\n // Abort is expected — not an error\n } else {\n this._status = \"error\";\n throw err;\n }\n } finally {\n this._abortController = null;\n if (this._status === \"streaming\") {\n this._status = \"idle\";\n }\n this._notifySessionChange();\n }\n }\n\n abort(): void {\n if (this._abortController) {\n this._abortController.abort();\n this._abortController = null;\n }\n if (this._status === \"streaming\") {\n this._status = \"idle\";\n }\n // Fire-and-forget server abort notification\n this._post(\"/abort\", {}).catch(() => {});\n }\n\n // ─── Discovery ─────────────────────────────────────────────\n\n async listModels(): Promise<ModelInfo[]> {\n this.assertNotDisposed();\n const res = await this._get(\"/models\");\n return await res.json() as ModelInfo[];\n }\n\n async listBackends(): Promise<BackendInfo[]> {\n this.assertNotDisposed();\n const res = await this._get(\"/backends\");\n return await res.json() as BackendInfo[];\n }\n\n // ─── Providers ──────────────────────────────────────────────\n\n async listProviders(): Promise<ProviderConfig[]> {\n this.assertNotDisposed();\n const res = await this._get(\"/providers\");\n return await res.json() as ProviderConfig[];\n }\n\n async createProvider(config: Omit<ProviderConfig, \"id\" | \"createdAt\">): Promise<ProviderConfig> {\n this.assertNotDisposed();\n const res = await this._post(\"/providers\", config);\n return await res.json() as ProviderConfig;\n }\n\n async updateProvider(id: string, changes: Partial<Omit<ProviderConfig, \"id\" | \"createdAt\">>): Promise<void> {\n this.assertNotDisposed();\n await this._put(`/providers/${id}`, changes);\n }\n\n async deleteProvider(id: string): Promise<void> {\n this.assertNotDisposed();\n await this._delete(`/providers/${id}`);\n }\n\n // ─── Session Change Notifications ────────────────────────────\n\n private readonly _sessionListeners = new ListenerSet<() => void>();\n\n onSessionChange(callback: () => void): () => void {\n return this._sessionListeners.add(callback);\n }\n\n private _notifySessionChange(): void {\n this._sessionListeners.notify();\n }\n\n // ─── Internal HTTP helpers ──────────────────────────────────\n\n private async _get(path: string): Promise<Response> {\n const res = await this._fetch(`${this.baseUrl}${path}`, {\n method: \"GET\",\n headers: { ...this.headers },\n });\n if (!res.ok && res.status !== 404) {\n throw new Error(`GET ${path} failed: ${res.status} ${res.statusText}`);\n }\n return res;\n }\n\n private async _post(path: string, body: unknown): Promise<Response> {\n const res = await this._fetch(`${this.baseUrl}${path}`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...this.headers,\n },\n body: JSON.stringify(body),\n });\n if (!res.ok) {\n throw new Error(`POST ${path} failed: ${res.status} ${res.statusText}`);\n }\n return res;\n }\n\n private async _delete(path: string): Promise<Response> {\n const res = await this._fetch(`${this.baseUrl}${path}`, {\n method: \"DELETE\",\n headers: { ...this.headers },\n });\n if (!res.ok) {\n throw new Error(`DELETE ${path} failed: ${res.status} ${res.statusText}`);\n }\n return res;\n }\n\n private async _put(path: string, body: unknown): Promise<Response> {\n const res = await this._fetch(`${this.baseUrl}${path}`, {\n method: \"PUT\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...this.headers,\n },\n body: JSON.stringify(body),\n });\n if (!res.ok) {\n throw new Error(`PUT ${path} failed: ${res.status} ${res.statusText}`);\n }\n return res;\n }\n\n // ─── SSE Parser ─────────────────────────────────────────────\n\n private async *_parseSSEStream(\n body: ReadableStream<Uint8Array>,\n signal: AbortSignal,\n ): AsyncGenerator<ChatEvent> {\n const reader = body.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n\n // Create a promise that rejects on abort — used to race with reader.read()\n const abortPromise = new Promise<never>((_, reject) => {\n if (signal.aborted) {\n reject(new DOMException(\"Aborted\", \"AbortError\"));\n return;\n }\n signal.addEventListener(\"abort\", () => {\n reject(new DOMException(\"Aborted\", \"AbortError\"));\n }, { once: true });\n });\n\n try {\n while (true) {\n if (signal.aborted) break;\n\n // Race reader.read() against abort signal\n const { done, value } = await Promise.race([\n reader.read(),\n abortPromise,\n ]);\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop()!; // Keep incomplete line in buffer\n\n for (const line of lines) {\n if (signal.aborted) return;\n if (line.startsWith(\"data: \")) {\n const data = line.slice(6).trim();\n if (data === \"[DONE]\") return;\n try {\n yield JSON.parse(data) as ChatEvent;\n } catch {\n // Skip malformed JSON lines\n }\n }\n }\n }\n } catch (err: unknown) {\n if (err instanceof DOMException && err.name === \"AbortError\") {\n // Expected on abort — exit cleanly\n } else {\n throw err;\n }\n } finally {\n reader.releaseLock();\n }\n }\n}\n","/**\n * @witqq/agent-sdk/chat/react — useRemoteChat\n *\n * Lifecycle hook that orchestrates auth → runtime → session.\n *\n * On mount, checks for saved auth tokens and auto-restores.\n * Once authenticated, creates a RemoteChatClient and initial session.\n * Exposes readiness phase, the client instance, and the auth sub-hook.\n */\n\nimport { useState, useCallback, useEffect, useRef } from \"react\";\nimport type { IChatClient } from \"../runtime.js\";\nimport { RemoteChatClient } from \"./RemoteChatClient.js\";\nimport { useRemoteAuth } from \"./useRemoteAuth.js\";\nimport type { RemoteAuthBackend, UseRemoteAuthReturn } from \"./useRemoteAuth.js\";\n\n/** Lifecycle phase for the useRemoteChat hook. */\nexport type RemoteChatPhase =\n | \"initializing\"\n | \"unauthenticated\"\n | \"authenticating\"\n | \"creating\"\n | \"ready\"\n | \"error\";\n\n/** Options for useRemoteChat. */\nexport interface UseRemoteChatOptions {\n /** Base URL for chat API (e.g. \"/api/chat\"). */\n chatBaseUrl: string;\n /** Base URL for auth API (e.g. \"/api/auth\"). */\n authBaseUrl: string;\n /** Auth backend to use. */\n backend: RemoteAuthBackend;\n /** Called when lifecycle reaches \"ready\" phase. */\n onReady?: () => void;\n /** Custom fetch for testability. */\n fetch?: typeof globalThis.fetch;\n /** Optional headers for all requests. */\n headers?: Record<string, string>;\n}\n\n/** Return value from useRemoteChat. */\nexport interface UseRemoteChatReturn {\n /** Current lifecycle phase. */\n phase: RemoteChatPhase;\n /** Chat client (null until phase = \"ready\"). */\n runtime: IChatClient | null;\n /** Initial session ID (null until phase = \"ready\"). */\n sessionId: string | null;\n /** Auth sub-hook for manual auth control. */\n auth: UseRemoteAuthReturn;\n /** Current error (null when no error). */\n error: Error | null;\n /** Create a new chat session. Returns session ID. */\n newSession: () => Promise<string>;\n /** Logout: clear tokens, dispose runtime, reset to unauthenticated. */\n logout: () => Promise<void>;\n}\n\n/**\n * Lifecycle hook: auth → runtime → session.\n *\n * @example\n * ```tsx\n * const chat = useRemoteChat({\n * chatBaseUrl: \"/api/chat\",\n * authBaseUrl: \"/api/auth\",\n * backend: \"copilot\",\n * });\n *\n * if (chat.phase === \"unauthenticated\") {\n * return <button onClick={() => chat.auth.start()}>Login</button>;\n * }\n * if (chat.phase === \"ready\" && chat.runtime) {\n * return <ChatProvider runtime={chat.runtime}>...</ChatProvider>;\n * }\n * ```\n */\nexport function useRemoteChat(options: UseRemoteChatOptions): UseRemoteChatReturn {\n const {\n chatBaseUrl,\n authBaseUrl,\n backend,\n onReady,\n headers,\n } = options;\n const fetchFn = options.fetch ?? globalThis.fetch.bind(globalThis);\n\n const [phase, setPhase] = useState<RemoteChatPhase>(\"initializing\");\n const [runtime, setRuntime] = useState<IChatClient | null>(null);\n const [sessionId, setSessionId] = useState<string | null>(null);\n const [error, setError] = useState<Error | null>(null);\n\n const onReadyRef = useRef(onReady);\n onReadyRef.current = onReady;\n\n // Track if component is still mounted\n const mountedRef = useRef(true);\n useEffect(() => {\n return () => { mountedRef.current = false; };\n }, []);\n\n // Auth sub-hook\n const auth = useRemoteAuth({\n backend,\n baseUrl: authBaseUrl,\n fetch: fetchFn,\n headers,\n });\n\n // Load saved tokens on mount\n const restoredRef = useRef(false);\n const [tokensLoaded, setTokensLoaded] = useState(false);\n useEffect(() => {\n if (restoredRef.current) return;\n restoredRef.current = true;\n\n (async () => {\n try {\n await auth.loadSavedTokens();\n } catch {\n // No saved tokens — that's fine\n }\n if (mountedRef.current) setTokensLoaded(true);\n })();\n // auth.loadSavedTokens is stable (useCallback)\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // When saved tokens load, auto-use if backend matches\n useEffect(() => {\n if (!tokensLoaded) return;\n if (\n auth.status === \"idle\" &&\n auth.savedProviders.includes(backend) &&\n phase === \"initializing\"\n ) {\n auth.useSavedToken(backend).catch(() => {\n if (mountedRef.current) setPhase(\"unauthenticated\");\n });\n } else if (\n auth.status === \"idle\" &&\n !auth.savedProviders.includes(backend) &&\n phase === \"initializing\"\n ) {\n setPhase(\"unauthenticated\");\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [tokensLoaded, auth.status, auth.savedProviders, backend, phase]);\n\n // Track auth status → phase transitions\n useEffect(() => {\n if (auth.status === \"pending\") {\n setPhase(\"authenticating\");\n } else if (auth.status === \"error\" && auth.error) {\n setError(auth.error);\n setPhase(\"error\");\n }\n }, [auth.status, auth.error]);\n\n // When authenticated → create runtime + session\n const creatingRef = useRef(false);\n useEffect(() => {\n if (auth.status !== \"authenticated\" || creatingRef.current || runtime !== null) return;\n creatingRef.current = true;\n setPhase(\"creating\");\n setError(null);\n\n (async () => {\n try {\n const rt = new RemoteChatClient({\n baseUrl: chatBaseUrl,\n headers,\n fetch: fetchFn,\n });\n const session = await rt.createSession({});\n if (!mountedRef.current) return;\n setRuntime(rt);\n setSessionId(session.id);\n setPhase(\"ready\");\n onReadyRef.current?.();\n } catch (err) {\n if (!mountedRef.current) return;\n creatingRef.current = false;\n setError(err instanceof Error ? err : new Error(String(err)));\n setPhase(\"error\");\n }\n })();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [auth.status, chatBaseUrl]);\n\n const newSession = useCallback(async () => {\n if (!runtime) throw new Error(\"Runtime not ready\");\n const session = await runtime.createSession({});\n setSessionId(session.id);\n return session.id;\n }, [runtime]);\n\n const logout = useCallback(async () => {\n try { await auth.clearTokens(); } catch { /* best effort */ }\n if (runtime) {\n try { runtime.dispose(); } catch { /* best effort */ }\n }\n auth.reset();\n setRuntime(null);\n setSessionId(null);\n setError(null);\n setTokensLoaded(false);\n creatingRef.current = false;\n restoredRef.current = false;\n setPhase(\"unauthenticated\");\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [auth.clearTokens, auth.reset, runtime]);\n\n return {\n phase,\n runtime,\n sessionId,\n auth,\n error,\n newSession,\n logout,\n };\n}\n","import { createElement, type ReactNode } from \"react\";\nimport type { AuthFormProps } from \"./types.js\";\n\n/**\n * Copilot (GitHub) auth form — device flow.\n *\n * Shows \"Authenticate with GitHub\" button → device code + verification URL →\n * \"Waiting...\" → \"✓ Authenticated\" + \"Continue →\".\n *\n * Co-located with the Copilot backend.\n */\nexport function CopilotAuthForm({ auth, onAuthComplete }: AuthFormProps): ReactNode {\n const children: ReactNode[] = [];\n\n if (auth.status === \"idle\") {\n children.push(\n createElement(\"button\", {\n key: \"start\",\n type: \"button\",\n \"data-action\": \"start-auth\",\n onClick: () => {\n auth.startDeviceFlow().then(() => onAuthComplete());\n },\n }, \"Authenticate with GitHub\"),\n );\n }\n\n if (auth.deviceCode) {\n children.push(\n createElement(\"div\", { key: \"code\", \"data-device-code\": \"true\" }, auth.deviceCode),\n );\n if (auth.verificationUrl) {\n children.push(\n createElement(\"a\", {\n key: \"url\",\n href: auth.verificationUrl,\n target: \"_blank\",\n rel: \"noreferrer\",\n }, \"Open GitHub →\"),\n );\n }\n }\n\n if (auth.status === \"pending\") {\n children.push(\n createElement(\"span\", { key: \"wait\", \"data-auth-loading\": \"true\" }, \"Waiting...\"),\n );\n }\n\n if (auth.status === \"authenticated\") {\n children.push(\n createElement(\"div\", { key: \"done\", \"data-auth-success\": \"true\" },\n \"✓ Authenticated\",\n createElement(\"button\", {\n type: \"button\",\n \"data-action\": \"continue\",\n onClick: onAuthComplete,\n }, \"Continue →\"),\n ),\n );\n }\n\n if (auth.error) {\n children.push(\n createElement(\"div\", { key: \"error\", \"data-auth-error-display\": \"true\" }, auth.error.message),\n );\n }\n\n return createElement(\"div\", { \"data-auth-flow\": \"copilot\" }, ...children);\n}\n","import { createElement, useRef, type ReactNode } from \"react\";\nimport type { AuthFormProps } from \"./types.js\";\n\n/**\n * Claude auth form — OAuth Authorization Code + PKCE.\n *\n * Shows \"Authenticate with Claude\" button → authorize URL link +\n * paste-code input + \"Submit\" button.\n *\n * Co-located with the Claude backend.\n */\nexport function ClaudeAuthForm({ auth, onAuthComplete }: AuthFormProps): ReactNode {\n const codeRef = useRef<HTMLInputElement>(null);\n const children: ReactNode[] = [];\n\n if (auth.status === \"idle\") {\n children.push(\n createElement(\"button\", {\n key: \"start\",\n type: \"button\",\n \"data-action\": \"start-auth\",\n onClick: () => auth.startOAuthFlow(),\n }, \"Authenticate with Claude\"),\n );\n }\n\n if (auth.authorizeUrl) {\n children.push(\n createElement(\"a\", {\n key: \"url\",\n href: auth.authorizeUrl,\n target: \"_blank\",\n rel: \"noreferrer\",\n }, \"Open authorization page →\"),\n );\n children.push(\n createElement(\"div\", { key: \"complete\", \"data-auth-complete\": \"true\" },\n createElement(\"input\", {\n ref: codeRef,\n placeholder: \"Paste code or redirect URL...\",\n }),\n createElement(\"button\", {\n type: \"button\",\n \"data-action\": \"complete-auth\",\n onClick: () => {\n const v = codeRef.current?.value?.trim();\n if (v) auth.completeOAuth(v).then(() => onAuthComplete());\n },\n }, \"Submit\"),\n ),\n );\n }\n\n if (auth.status === \"authenticated\") {\n children.push(\n createElement(\"div\", { key: \"done\", \"data-auth-success\": \"true\" },\n \"✓ Authenticated\",\n createElement(\"button\", {\n type: \"button\",\n \"data-action\": \"continue\",\n onClick: onAuthComplete,\n }, \"Continue →\"),\n ),\n );\n }\n\n if (auth.error) {\n children.push(\n createElement(\"div\", { key: \"error\", \"data-auth-error-display\": \"true\" }, auth.error.message),\n );\n }\n\n return createElement(\"div\", { \"data-auth-flow\": \"claude\" }, ...children);\n}\n","import { createElement, useRef, type ReactNode } from \"react\";\nimport type { AuthFormProps } from \"./types.js\";\n\n/**\n * Vercel AI auth form — API key + optional base URL.\n *\n * Shows base URL input + API key input + \"Connect\" button.\n *\n * Co-located with the Vercel AI backend.\n */\nexport function VercelAIAuthForm({ auth, onAuthComplete }: AuthFormProps): ReactNode {\n const apiKeyRef = useRef<HTMLInputElement>(null);\n const baseUrlRef = useRef<HTMLInputElement>(null);\n const children: ReactNode[] = [];\n\n if (auth.status !== \"authenticated\") {\n children.push(\n createElement(\"div\", { key: \"apikey\", \"data-auth-apikey\": \"true\" },\n createElement(\"input\", {\n ref: baseUrlRef,\n placeholder: \"Base URL (default: openai.com/v1)\",\n }),\n createElement(\"input\", {\n ref: apiKeyRef,\n type: \"password\",\n placeholder: \"API Key (sk-...)\",\n }),\n createElement(\"button\", {\n type: \"button\",\n \"data-action\": \"submit-apikey\",\n onClick: () => {\n const k = apiKeyRef.current?.value?.trim();\n if (k) {\n auth.submitApiKey(k, baseUrlRef.current?.value?.trim() || undefined)\n .then(() => onAuthComplete());\n }\n },\n }, \"Connect\"),\n ),\n );\n }\n\n if (auth.status === \"authenticated\") {\n children.push(\n createElement(\"div\", { key: \"done\", \"data-auth-success\": \"true\" },\n \"✓ Connected\",\n createElement(\"button\", {\n type: \"button\",\n \"data-action\": \"continue\",\n onClick: onAuthComplete,\n }, \"Continue →\"),\n ),\n );\n }\n\n if (auth.error) {\n children.push(\n createElement(\"div\", { key: \"error\", \"data-auth-error-display\": \"true\" }, auth.error.message),\n );\n }\n\n return createElement(\"div\", { \"data-auth-flow\": \"vercel-ai\" }, ...children);\n}\n","import {\n createElement,\n useCallback,\n type ReactNode,\n} from \"react\";\nimport type { BackendInfo } from \"../runtime.js\";\n\n/** Props for the BackendSelector component. */\nexport interface BackendSelectorProps {\n backends: BackendInfo[];\n onSelect: (name: string) => void;\n className?: string;\n}\n\n/**\n * Headless backend selector showing registered backends with active indicator.\n * Uses data attributes for styling:\n * - `[data-backend-selector]` on root\n * - `[data-backend-item]` on each item\n * - `[data-backend-active=\"true\"]` on the active backend\n * - `[data-backend-name]` with backend name value\n */\nexport function BackendSelector({\n backends,\n onSelect,\n className,\n}: BackendSelectorProps): ReactNode {\n const handleClick = useCallback(\n (name: string) => () => onSelect(name),\n [onSelect],\n );\n\n const items = backends.map((backend) =>\n createElement(\n \"button\",\n {\n key: backend.name,\n type: \"button\",\n \"data-backend-item\": \"true\",\n \"data-backend-name\": backend.name,\n onClick: handleClick(backend.name),\n },\n backend.name,\n ),\n );\n\n return createElement(\n \"div\",\n { \"data-backend-selector\": \"true\", className },\n ...items,\n );\n}\n","import { useState, useCallback, useEffect, useRef } from \"react\";\nimport { useChatRuntime } from \"./ChatProvider.js\";\nimport type { BackendInfo } from \"../runtime.js\";\n\n/** Return type for the useBackends hook. */\nexport interface UseBackendsReturn {\n backends: BackendInfo[];\n isLoading: boolean;\n error: Error | null;\n refresh: () => void;\n}\n\n/**\n * Hook for discovering registered backends and switching between them.\n */\nexport function useBackends(): UseBackendsReturn {\n const runtime = useChatRuntime();\n const [backends, setBackends] = useState<BackendInfo[]>([]);\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n const mountedRef = useRef(true);\n\n const fetchBackends = useCallback(() => {\n setIsLoading(true);\n setError(null);\n try {\n // listBackends is sync on ChatRuntime, async on RemoteChatClient\n const result = runtime.listBackends();\n if (result instanceof Promise) {\n (result as Promise<BackendInfo[]>)\n .then((data) => {\n if (mountedRef.current) {\n setBackends(data);\n setIsLoading(false);\n }\n })\n .catch((err) => {\n if (mountedRef.current) {\n setError(err instanceof Error ? err : new Error(String(err)));\n setIsLoading(false);\n }\n });\n } else {\n if (mountedRef.current) {\n setBackends(result);\n setIsLoading(false);\n }\n }\n } catch (err) {\n if (mountedRef.current) {\n setError(err instanceof Error ? err : new Error(String(err)));\n setIsLoading(false);\n }\n }\n }, [runtime]);\n\n useEffect(() => {\n mountedRef.current = true;\n fetchBackends();\n return () => {\n mountedRef.current = false;\n };\n }, [fetchBackends]);\n\n return { backends, isLoading, error, refresh: fetchBackends };\n}\n","import { useState, useCallback, useEffect, useRef } from \"react\";\nimport { useChatRuntime } from \"./ChatProvider.js\";\nimport type { ProviderConfig } from \"../provider-types.js\";\n\n/** Runtime that supports provider operations. */\ninterface ProviderCapable {\n listProviders(): Promise<ProviderConfig[]>;\n createProvider(config: Omit<ProviderConfig, \"id\" | \"createdAt\">): Promise<ProviderConfig>;\n updateProvider(id: string, changes: Partial<Omit<ProviderConfig, \"id\" | \"createdAt\">>): Promise<ProviderConfig>;\n deleteProvider(id: string): Promise<void>;\n selectProvider(id: string): void;\n}\n\n/** Check if runtime supports provider operations via feature detection. */\nfunction isProviderCapable(runtime: unknown): runtime is ProviderCapable {\n return (\n typeof runtime === \"object\" &&\n runtime !== null &&\n typeof (runtime as Record<string, unknown>).listProviders === \"function\"\n );\n}\n\n/** Return type for the useProviders hook. */\nexport interface UseProvidersReturn {\n providers: ProviderConfig[];\n isLoading: boolean;\n error: Error | null;\n refresh: () => void;\n createProvider: (config: Omit<ProviderConfig, \"id\" | \"createdAt\">) => Promise<void>;\n updateProvider: (id: string, changes: Partial<Omit<ProviderConfig, \"id\" | \"createdAt\">>) => Promise<void>;\n deleteProvider: (id: string) => Promise<void>;\n selectProvider: (id: string) => void;\n}\n\n/**\n * Hook for managing providers (backend + model combos).\n * Requires an IChatClient with provider methods (e.g. RemoteChatClient).\n */\nexport function useProviders(): UseProvidersReturn {\n const runtime = useChatRuntime();\n const [providers, setProviders] = useState<ProviderConfig[]>([]);\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n const mountedRef = useRef(true);\n\n const fetchProviders = useCallback(() => {\n setIsLoading(true);\n setError(null);\n if (!isProviderCapable(runtime)) {\n setIsLoading(false);\n return;\n }\n runtime.listProviders()\n .then((data) => {\n if (mountedRef.current) {\n setProviders(data);\n setIsLoading(false);\n }\n })\n .catch((err) => {\n if (mountedRef.current) {\n setError(err instanceof Error ? err : new Error(String(err)));\n setIsLoading(false);\n }\n });\n }, [runtime]);\n\n useEffect(() => {\n mountedRef.current = true;\n fetchProviders();\n return () => {\n mountedRef.current = false;\n };\n }, [fetchProviders]);\n\n const createProvider = useCallback(\n async (config: Omit<ProviderConfig, \"id\" | \"createdAt\">) => {\n if (!isProviderCapable(runtime)) return;\n try {\n await runtime.createProvider(config);\n fetchProviders();\n } catch (err) {\n setError(err instanceof Error ? err : new Error(String(err)));\n }\n },\n [runtime, fetchProviders],\n );\n\n const updateProvider = useCallback(\n async (id: string, changes: Partial<Omit<ProviderConfig, \"id\" | \"createdAt\">>) => {\n if (!isProviderCapable(runtime)) return;\n try {\n await runtime.updateProvider(id, changes);\n fetchProviders();\n } catch (err) {\n setError(err instanceof Error ? err : new Error(String(err)));\n }\n },\n [runtime, fetchProviders],\n );\n\n const deleteProvider = useCallback(\n async (id: string) => {\n if (!isProviderCapable(runtime)) return;\n try {\n await runtime.deleteProvider(id);\n fetchProviders();\n } catch (err) {\n setError(err instanceof Error ? err : new Error(String(err)));\n }\n },\n [runtime, fetchProviders],\n );\n\n const selectProvider = useCallback(\n (id: string) => {\n if (!isProviderCapable(runtime)) return;\n runtime.selectProvider(id);\n },\n [runtime],\n );\n\n return { providers, isLoading, error, refresh: fetchProviders, createProvider, updateProvider, deleteProvider, selectProvider };\n}\n","import {\n createElement,\n useState,\n useCallback,\n useEffect,\n useRef,\n useMemo,\n type ReactNode,\n} from \"react\";\nimport type { ProviderConfig } from \"../provider-types.js\";\n\n/** Props for the ProviderSelector component. */\nexport interface ProviderSelectorProps {\n providers: ProviderConfig[];\n activeProviderId?: string;\n onSelect: (id: string) => void;\n onSettingsClick?: () => void;\n className?: string;\n}\n\n/**\n * Headless dropdown for selecting a configured provider.\n * Uses data attributes for styling hooks. Follows ModelSelector pattern.\n */\nexport function ProviderSelector({\n providers,\n activeProviderId,\n onSelect,\n onSettingsClick,\n className,\n}: ProviderSelectorProps): ReactNode {\n const [open, setOpen] = useState(false);\n const [highlightIndex, setHighlightIndex] = useState(0);\n const containerRef = useRef<HTMLDivElement>(null);\n\n const activeProvider = useMemo(\n () => providers.find((p) => p.id === activeProviderId),\n [providers, activeProviderId],\n );\n\n // Close on click outside\n useEffect(() => {\n if (!open) return;\n const handler = (e: MouseEvent) => {\n if (containerRef.current && !containerRef.current.contains(e.target as Node)) {\n setOpen(false);\n }\n };\n document.addEventListener(\"mousedown\", handler);\n return () => document.removeEventListener(\"mousedown\", handler);\n }, [open]);\n\n useEffect(() => {\n setHighlightIndex(0);\n }, [providers.length]);\n\n const handleToggle = useCallback(() => {\n setOpen((prev) => {\n if (!prev) setHighlightIndex(0);\n return !prev;\n });\n }, []);\n\n const handleSelect = useCallback(\n (id: string) => {\n onSelect(id);\n setOpen(false);\n },\n [onSelect],\n );\n\n const handleKeyDown = useCallback(\n (e: KeyboardEvent) => {\n if (e.key === \"ArrowDown\") {\n e.preventDefault();\n setHighlightIndex((prev) => Math.min(prev + 1, providers.length - 1));\n } else if (e.key === \"ArrowUp\") {\n e.preventDefault();\n setHighlightIndex((prev) => Math.max(prev - 1, 0));\n } else if (e.key === \"Enter\") {\n e.preventDefault();\n if (providers[highlightIndex]) {\n handleSelect(providers[highlightIndex].id);\n }\n } else if (e.key === \"Escape\") {\n e.preventDefault();\n setOpen(false);\n }\n },\n [providers, highlightIndex, handleSelect],\n );\n\n const children: ReactNode[] = [];\n\n // Trigger button\n children.push(\n createElement(\n \"button\",\n {\n key: \"trigger\",\n type: \"button\",\n \"data-provider-trigger\": \"true\",\n onClick: handleToggle,\n onKeyDown: handleKeyDown,\n },\n activeProvider ? activeProvider.label : \"Select provider\",\n ),\n );\n\n // Dropdown panel\n if (open) {\n const dropdownChildren: ReactNode[] = [];\n\n providers.forEach((provider, idx) => {\n const isActive = provider.id === activeProviderId;\n const isHighlighted = idx === highlightIndex;\n const attrs: Record<string, unknown> = {\n key: provider.id,\n \"data-provider-item\": \"true\",\n onClick: () => handleSelect(provider.id),\n };\n if (isActive) attrs[\"data-provider-active\"] = \"true\";\n if (isHighlighted) attrs[\"data-provider-highlighted\"] = \"true\";\n\n dropdownChildren.push(\n createElement(\n \"div\",\n attrs,\n createElement(\"span\", { \"data-provider-label\": \"true\" }, provider.label),\n createElement(\"span\", { \"data-provider-model\": \"true\" }, provider.model),\n ),\n );\n });\n\n // Settings button\n if (onSettingsClick) {\n dropdownChildren.push(\n createElement(\n \"button\",\n {\n key: \"settings\",\n type: \"button\",\n \"data-provider-settings-btn\": \"true\",\n onClick: (e: Event) => {\n (e as Event).stopPropagation();\n setOpen(false);\n onSettingsClick();\n },\n },\n \"⚙ Settings\",\n ),\n );\n }\n\n children.push(\n createElement(\n \"div\",\n { key: \"dropdown\", \"data-provider-dropdown\": \"true\", onKeyDown: handleKeyDown },\n ...dropdownChildren,\n ),\n );\n }\n\n return createElement(\n \"div\",\n {\n \"data-provider-selector\": \"true\",\n className,\n ref: containerRef,\n },\n ...children,\n );\n}\n","import {\n createElement,\n useState,\n useCallback,\n useEffect,\n useRef,\n useMemo,\n type ReactNode,\n} from \"react\";\nimport type { ProviderConfig } from \"../provider-types.js\";\nimport type { ModelOption } from \"./useModels.js\";\n\n/** A unified item rendered in the ProviderModelSelector dropdown. */\nexport interface ProviderModelItem {\n id: string;\n label: string;\n sublabel?: string;\n tier?: string;\n type: \"provider\" | \"model\";\n}\n\n/** Props for the ProviderModelSelector component. */\nexport interface ProviderModelSelectorProps {\n /** Configured providers (backend + model combos). When non-empty, provider mode is used. */\n providers?: ProviderConfig[];\n /** Available models. Used when providers is empty or undefined. */\n models?: ModelOption[];\n /** Currently selected provider ID. */\n activeProviderId?: string;\n /** Currently selected model ID (fallback mode). */\n selectedModel?: string;\n /** Called when a provider is selected. */\n onSelectProvider?: (id: string) => void;\n /** Called when a model is selected (fallback mode). */\n onSelectModel?: (modelId: string) => void;\n /** Called when settings gear is clicked. */\n onSettingsClick?: () => void;\n /** Placeholder text for the trigger button. */\n placeholder?: string;\n className?: string;\n}\n\n/**\n * Unified selector that shows providers when available, falls back to model list.\n * Replaces the need for separate ProviderSelector + ModelSelector in ChatUI.\n */\nexport function ProviderModelSelector({\n providers = [],\n models = [],\n activeProviderId,\n selectedModel,\n onSelectProvider,\n onSelectModel,\n onSettingsClick,\n placeholder = \"Select model\",\n className,\n}: ProviderModelSelectorProps): ReactNode {\n const [open, setOpen] = useState(false);\n const [search, setSearch] = useState(\"\");\n const [highlightIndex, setHighlightIndex] = useState(0);\n const containerRef = useRef<HTMLDivElement>(null);\n\n const isProviderMode = providers.length > 0;\n\n // Build unified items list\n const items: ProviderModelItem[] = useMemo(() => {\n if (isProviderMode) {\n return providers.map((p) => ({\n id: p.id,\n label: p.label,\n sublabel: p.model,\n type: \"provider\" as const,\n }));\n }\n return models.map((m) => ({\n id: m.id,\n label: m.name,\n sublabel: m.provider,\n tier: m.tier,\n type: \"model\" as const,\n }));\n }, [isProviderMode, providers, models]);\n\n // Filter by search\n const filtered = useMemo(() => {\n if (!search) return items;\n const q = search.toLowerCase();\n return items.filter(\n (item) =>\n item.label.toLowerCase().includes(q) ||\n (item.sublabel && item.sublabel.toLowerCase().includes(q)),\n );\n }, [items, search]);\n\n useEffect(() => {\n setHighlightIndex(0);\n }, [filtered.length]);\n\n // Close on click outside\n useEffect(() => {\n if (!open) return;\n const handler = (e: MouseEvent) => {\n if (containerRef.current && !containerRef.current.contains(e.target as Node)) {\n setOpen(false);\n }\n };\n document.addEventListener(\"mousedown\", handler);\n return () => document.removeEventListener(\"mousedown\", handler);\n }, [open]);\n\n // Resolve trigger label\n const triggerLabel = useMemo(() => {\n if (isProviderMode && activeProviderId) {\n const p = providers.find((prov) => prov.id === activeProviderId);\n return p ? p.label : placeholder;\n }\n if (!isProviderMode && selectedModel) {\n const m = models.find((mod) => mod.id === selectedModel);\n return m ? m.name : selectedModel;\n }\n return placeholder;\n }, [isProviderMode, activeProviderId, providers, selectedModel, models, placeholder]);\n\n const handleToggle = useCallback(() => {\n setOpen((prev) => {\n if (!prev) {\n setSearch(\"\");\n setHighlightIndex(0);\n }\n return !prev;\n });\n }, []);\n\n const handleSelect = useCallback(\n (item: ProviderModelItem) => {\n if (item.type === \"provider\" && onSelectProvider) {\n onSelectProvider(item.id);\n } else if (item.type === \"model\" && onSelectModel) {\n onSelectModel(item.id);\n }\n setOpen(false);\n setSearch(\"\");\n },\n [onSelectProvider, onSelectModel],\n );\n\n const handleSearchChange = useCallback((e: Event) => {\n setSearch((e.target as HTMLInputElement).value);\n }, []);\n\n const handleKeyDown = useCallback(\n (e: KeyboardEvent) => {\n if (e.key === \"ArrowDown\") {\n e.preventDefault();\n setHighlightIndex((prev) => Math.min(prev + 1, filtered.length - 1));\n } else if (e.key === \"ArrowUp\") {\n e.preventDefault();\n setHighlightIndex((prev) => Math.max(prev - 1, 0));\n } else if (e.key === \"Enter\") {\n e.preventDefault();\n if (filtered[highlightIndex]) {\n handleSelect(filtered[highlightIndex]);\n }\n } else if (e.key === \"Escape\") {\n e.preventDefault();\n setOpen(false);\n }\n },\n [filtered, highlightIndex, handleSelect],\n );\n\n const children: ReactNode[] = [];\n\n // Trigger button\n children.push(\n createElement(\n \"button\",\n {\n key: \"trigger\",\n type: \"button\",\n \"data-pms-trigger\": \"true\",\n onClick: handleToggle,\n },\n triggerLabel,\n ),\n );\n\n // Dropdown panel\n if (open) {\n const dropdownChildren: ReactNode[] = [];\n\n // Search input (only if more than a few items)\n if (items.length > 3) {\n dropdownChildren.push(\n createElement(\"input\", {\n key: \"search\",\n \"data-pms-search\": \"true\",\n value: search,\n onChange: handleSearchChange,\n onKeyDown: handleKeyDown,\n placeholder: isProviderMode ? \"Search providers...\" : \"Search models...\",\n autoFocus: true,\n }),\n );\n }\n\n // Items\n filtered.forEach((item, idx) => {\n const isActive = isProviderMode\n ? item.id === activeProviderId\n : item.id === selectedModel;\n const isHighlighted = idx === highlightIndex;\n const attrs: Record<string, unknown> = {\n key: item.id,\n \"data-pms-item\": \"true\",\n \"data-pms-type\": item.type,\n onClick: () => handleSelect(item),\n };\n if (item.tier) attrs[\"data-tier\"] = item.tier;\n if (isActive) attrs[\"data-pms-active\"] = \"true\";\n if (isHighlighted) attrs[\"data-pms-highlighted\"] = \"true\";\n\n const itemChildren: ReactNode[] = [\n createElement(\"span\", { key: \"label\", \"data-pms-label\": \"true\" }, item.label),\n ];\n if (item.sublabel) {\n itemChildren.push(\n createElement(\"span\", { key: \"sub\", \"data-pms-sublabel\": \"true\" }, item.sublabel),\n );\n }\n dropdownChildren.push(createElement(\"div\", attrs, ...itemChildren));\n });\n\n // Settings button\n if (onSettingsClick) {\n dropdownChildren.push(\n createElement(\n \"button\",\n {\n key: \"settings\",\n type: \"button\",\n \"data-pms-settings\": \"true\",\n onClick: (e: Event) => {\n (e as Event).stopPropagation();\n setOpen(false);\n onSettingsClick();\n },\n },\n \"⚙ Settings\",\n ),\n );\n }\n\n children.push(\n createElement(\n \"div\",\n { key: \"dropdown\", \"data-pms-dropdown\": \"true\", onKeyDown: handleKeyDown },\n ...dropdownChildren,\n ),\n );\n }\n\n return createElement(\n \"div\",\n {\n \"data-provider-model-selector\": \"true\",\n \"data-pms-mode\": isProviderMode ? \"provider\" : \"model\",\n className,\n ref: containerRef,\n },\n ...children,\n );\n}\n","import {\n createElement,\n useState,\n useCallback,\n useRef,\n useEffect,\n type ReactNode,\n} from \"react\";\nimport type { ProviderConfig } from \"../provider-types.js\";\nimport { useRemoteAuth } from \"./useRemoteAuth.js\";\nimport type { RemoteAuthBackend } from \"./useRemoteAuth.js\";\nimport { useChatRuntime } from \"./ChatProvider.js\";\nimport { CopilotAuthForm } from \"./auth/CopilotAuthForm.js\";\nimport { ClaudeAuthForm } from \"./auth/ClaudeAuthForm.js\";\nimport { VercelAIAuthForm } from \"./auth/VercelAIAuthForm.js\";\nimport type { AuthFormComponent } from \"./auth/types.js\";\n\n/** Props for the ProviderSettings component. */\nexport interface ProviderSettingsProps {\n providers: ProviderConfig[];\n onClose?: () => void;\n onProviderCreated?: (p: ProviderConfig) => void;\n onProviderDeleted?: (id: string) => void;\n onProviderUpdated?: (id: string, changes: { model?: string; label?: string }) => void;\n /** Called when authentication succeeds (before configure step). Parent should refresh providers. */\n onAuthCompleted?: (backend: string) => void;\n authBaseUrl?: string;\n className?: string;\n}\n\ntype SettingsView = \"list\" | \"add\" | \"edit\";\ntype AddStep = \"select-backend\" | \"auth\" | \"configure\";\nconst BACKENDS: { id: RemoteAuthBackend; label: string }[] = [\n { id: \"copilot\", label: \"GitHub Copilot\" },\n { id: \"claude\", label: \"Claude\" },\n { id: \"vercel-ai\", label: \"Vercel AI\" },\n];\n\n/** Map of backend ID → auth form component. */\nconst AUTH_FORMS: Record<RemoteAuthBackend, AuthFormComponent> = {\n copilot: CopilotAuthForm,\n claude: ClaudeAuthForm,\n \"vercel-ai\": VercelAIAuthForm,\n};\n\n/**\n * Headless settings panel for managing providers.\n * States: list (all providers), add (new provider flow), edit (existing).\n */\nexport function ProviderSettings({\n providers,\n onClose,\n onProviderCreated,\n onProviderDeleted,\n onProviderUpdated,\n onAuthCompleted,\n authBaseUrl = \"/api/auth\",\n className,\n}: ProviderSettingsProps): ReactNode {\n const [view, setView] = useState<SettingsView>(\"list\");\n const [addStep, setAddStep] = useState<AddStep>(\"select-backend\");\n const [selectedBackend, setSelectedBackend] = useState<RemoteAuthBackend>(\"copilot\");\n const [editingId, setEditingId] = useState<string | null>(null);\n const [availableModels, setAvailableModels] = useState<{ id: string; name?: string }[]>([]);\n\n const modelRef = useRef<HTMLInputElement>(null);\n const labelRef = useRef<HTMLInputElement>(null);\n const editModelRef = useRef<HTMLInputElement>(null);\n const editLabelRef = useRef<HTMLInputElement>(null);\n\n // Access runtime for model listing (ProviderSettings is always inside ChatProvider)\n const runtime = useChatRuntime();\n\n const auth = useRemoteAuth({\n backend: selectedBackend,\n baseUrl: authBaseUrl,\n });\n\n const handleBackendSelect = useCallback((backend: RemoteAuthBackend) => {\n setSelectedBackend(backend);\n auth.reset();\n setAddStep(\"auth\");\n }, [auth]);\n\n const handleAuthComplete = useCallback(() => {\n // Notify parent to refresh providers — server may have auto-created one\n onAuthCompleted?.(selectedBackend);\n setAddStep(\"configure\");\n }, [selectedBackend, onAuthCompleted]);\n\n // Fetch models when entering configure step or edit view\n useEffect(() => {\n if (addStep !== \"configure\" && view !== \"edit\") return;\n const load = async () => {\n try {\n const models = await runtime.listModels();\n setAvailableModels(models);\n } catch { /* models unavailable — user can type manually */ }\n };\n load();\n }, [addStep, view, runtime]);\n\n const handleCreate = useCallback(() => {\n const modelEl = modelRef.current as HTMLInputElement | HTMLSelectElement | null;\n const model = modelEl?.value?.trim();\n const label = labelRef.current?.value?.trim() || model;\n if (!model) return;\n // If server auto-created a provider for this backend, update it instead of creating duplicate\n const existing = providers.find(p => p.backend === selectedBackend);\n if (existing) {\n onProviderUpdated?.(existing.id, { model, label: label! });\n } else {\n onProviderCreated?.({ backend: selectedBackend, model, label: label! } as ProviderConfig);\n }\n setView(\"list\");\n setAddStep(\"select-backend\");\n setAvailableModels([]);\n auth.reset();\n }, [selectedBackend, providers, onProviderCreated, onProviderUpdated, auth]);\n\n const handleEdit = useCallback((id: string) => {\n setEditingId(id);\n setView(\"edit\");\n }, []);\n\n const handleUpdate = useCallback(() => {\n if (!editingId) return;\n const modelEl = editModelRef.current as HTMLInputElement | HTMLSelectElement | null;\n const model = modelEl?.value?.trim();\n const label = editLabelRef.current?.value?.trim();\n if (!model && !label) return;\n const changes: { model?: string; label?: string } = {};\n if (model) changes.model = model;\n if (label) changes.label = label;\n onProviderUpdated?.(editingId, changes);\n setView(\"list\");\n setEditingId(null);\n }, [editingId, onProviderUpdated]);\n\n const handleDelete = useCallback((id: string) => {\n onProviderDeleted?.(id);\n }, [onProviderDeleted]);\n\n const handleStartAdd = useCallback(() => {\n setView(\"add\");\n setAddStep(\"select-backend\");\n auth.reset();\n }, [auth]);\n\n // ─── List view ─────────────────────────────────────────────\n if (view === \"list\") {\n const items = providers.map((p) =>\n createElement(\n \"div\",\n { key: p.id, \"data-provider-settings-item\": \"true\" },\n createElement(\"span\", { \"data-provider-settings-label\": \"true\" }, p.label),\n createElement(\"span\", { \"data-provider-settings-model\": \"true\" }, `${p.backend} / ${p.model}`),\n createElement(\"div\", { \"data-provider-settings-actions\": \"true\" },\n createElement(\"button\", {\n type: \"button\",\n \"data-action\": \"edit-provider\",\n onClick: () => handleEdit(p.id),\n }, \"Edit\"),\n createElement(\"button\", {\n type: \"button\",\n \"data-action\": \"delete-provider\",\n onClick: () => handleDelete(p.id),\n }, \"Delete\"),\n ),\n ),\n );\n\n return createElement(\n \"div\",\n { \"data-provider-settings\": \"true\", className },\n createElement(\"div\", { \"data-provider-settings-header\": \"true\" },\n createElement(\"span\", null, \"Providers\"),\n onClose\n ? createElement(\"button\", {\n type: \"button\",\n \"data-provider-settings-close\": \"true\",\n onClick: onClose,\n }, \"✕\")\n : null,\n ),\n createElement(\"div\", { \"data-provider-settings-list\": \"true\" },\n ...items,\n items.length === 0\n ? createElement(\"div\", { \"data-provider-settings-empty\": \"true\" }, \"No providers configured\")\n : null,\n ),\n createElement(\"button\", {\n type: \"button\",\n \"data-action\": \"add-provider\",\n onClick: handleStartAdd,\n }, \"+ Add Provider\"),\n );\n }\n\n // ─── Add view ──────────────────────────────────────────────\n if (view === \"add\") {\n const formChildren: ReactNode[] = [];\n\n formChildren.push(\n createElement(\"div\", { \"data-provider-settings-header\": \"true\", key: \"header\" },\n createElement(\"span\", null, \"Add Provider\"),\n createElement(\"button\", {\n type: \"button\",\n \"data-provider-settings-close\": \"true\",\n onClick: () => { setView(\"list\"); setAddStep(\"select-backend\"); },\n }, \"← Back\"),\n ),\n );\n\n if (addStep === \"select-backend\") {\n formChildren.push(\n createElement(\"div\", { key: \"backends\", \"data-provider-settings-backends\": \"true\" },\n ...BACKENDS.map((b) =>\n createElement(\"button\", {\n key: b.id,\n type: \"button\",\n \"data-provider-backend-option\": b.id,\n onClick: () => handleBackendSelect(b.id),\n }, b.label),\n ),\n ),\n );\n } else if (addStep === \"auth\") {\n const FormComponent = selectedBackend ? AUTH_FORMS[selectedBackend] : null;\n formChildren.push(\n createElement(\"div\", { key: \"auth\", \"data-provider-settings-auth\": \"true\" },\n FormComponent\n ? createElement(FormComponent, { auth, onAuthComplete: handleAuthComplete })\n : null,\n ),\n );\n } else if (addStep === \"configure\") {\n // Model selector: dropdown when models available, text input as fallback\n const modelInput = availableModels.length > 0\n ? createElement(\"select\", {\n ref: modelRef as any,\n \"data-input\": \"model\",\n defaultValue: \"\",\n },\n createElement(\"option\", { value: \"\", disabled: true }, \"Select a model…\"),\n ...availableModels.map((m) =>\n createElement(\"option\", { key: m.id, value: m.id }, m.name || m.id),\n ),\n )\n : createElement(\"input\", {\n ref: modelRef,\n placeholder: \"Model name (e.g. gpt-5-mini)\",\n \"data-input\": \"model\",\n });\n\n formChildren.push(\n createElement(\"div\", { key: \"config\", \"data-provider-settings-form\": \"true\" },\n modelInput,\n createElement(\"input\", {\n ref: labelRef,\n placeholder: \"Display label (e.g. GPT-5 Mini)\",\n \"data-input\": \"label\",\n }),\n createElement(\"button\", {\n type: \"button\",\n \"data-action\": \"save-provider\",\n onClick: handleCreate,\n }, \"Save Provider\"),\n ),\n );\n }\n\n return createElement(\n \"div\",\n { \"data-provider-settings\": \"true\", className },\n ...formChildren,\n );\n }\n\n // ─── Edit view ─────────────────────────────────────────────\n const editingProvider = providers.find((p) => p.id === editingId);\n\n return createElement(\n \"div\",\n { \"data-provider-settings\": \"true\", className },\n createElement(\"div\", { \"data-provider-settings-header\": \"true\" },\n createElement(\"span\", null, \"Edit Provider\"),\n createElement(\"button\", {\n type: \"button\",\n \"data-provider-settings-close\": \"true\",\n onClick: () => { setView(\"list\"); setEditingId(null); },\n }, \"← Back\"),\n ),\n createElement(\"div\", { \"data-provider-settings-form\": \"true\" },\n availableModels.length > 0\n ? createElement(\"select\", {\n ref: editModelRef as any,\n defaultValue: editingProvider?.model ?? \"\",\n \"data-input\": \"model\",\n },\n createElement(\"option\", { value: \"\", disabled: true }, \"Select a model…\"),\n ...availableModels.map((m) =>\n createElement(\"option\", { key: m.id, value: m.id }, m.name || m.id),\n ),\n )\n : createElement(\"input\", {\n ref: editModelRef,\n defaultValue: editingProvider?.model ?? \"\",\n placeholder: \"Model name\",\n \"data-input\": \"model\",\n }),\n createElement(\"input\", {\n ref: editLabelRef,\n defaultValue: editingProvider?.label ?? \"\",\n placeholder: \"Display label\",\n \"data-input\": \"label\",\n }),\n createElement(\"button\", {\n type: \"button\",\n \"data-action\": \"update-provider\",\n onClick: handleUpdate,\n }, \"Update\"),\n ),\n );\n}\n","import { createElement, type ReactNode } from \"react\";\nimport type { ContextStats } from \"../context.js\";\n\n/** Props for the ContextStatsDisplay component. */\nexport interface ContextStatsDisplayProps {\n /** Context stats from runtime.getContextStats(sessionId). Null = nothing to display. */\n stats: ContextStats | null;\n /** CSS class on the root element. */\n className?: string;\n}\n\n/** Format a token count for display (e.g. 1234 → \"1.2k\"). */\nfunction formatTokens(n: number): string {\n if (n >= 1000) return `${(n / 1000).toFixed(1)}k`;\n return String(n);\n}\n\n/**\n * Headless component displaying context window statistics.\n *\n * When real usage data is available (realPromptTokens + modelContextWindow),\n * displays actual token usage and model context window size.\n * When real data is not yet available (before first API response), returns null.\n *\n * All elements use `data-*` attributes for CSS styling — no inline styles.\n */\nexport function ContextStatsDisplay({ stats, className }: ContextStatsDisplayProps): ReactNode {\n if (!stats) return null;\n\n // Prefer real data — if not available, show nothing (no heuristic fallback)\n const hasRealData = stats.realPromptTokens != null && stats.modelContextWindow != null;\n if (!hasRealData) return null;\n\n const promptTokens = stats.realPromptTokens!;\n const contextWindow = stats.modelContextWindow!;\n const availableBudget = Math.max(0, contextWindow - promptTokens);\n const usagePercent = contextWindow > 0\n ? Math.round((promptTokens / contextWindow) * 100)\n : 0;\n\n return createElement(\"div\", {\n \"data-context-stats\": \"\",\n \"data-context-truncated\": stats.wasTruncated ? \"true\" : \"false\",\n className,\n },\n createElement(\"span\", { \"data-context-tokens\": \"\" },\n `${formatTokens(promptTokens)} tokens`),\n createElement(\"span\", { \"data-context-budget\": \"\" },\n `${formatTokens(availableBudget)} available`),\n createElement(\"span\", { \"data-context-usage\": \"\", \"data-usage-percent\": String(usagePercent) },\n `${usagePercent}%`),\n stats.removedCount > 0\n ? createElement(\"span\", { \"data-context-removed\": \"\" },\n `${stats.removedCount} trimmed`)\n : null,\n );\n}\n","/**\n * @witqq/agent-sdk/chat/react — ChatLayout\n *\n * Pure layout container for chat interfaces. Renders sidebar + main area\n * without any logic or state. ChatUI uses this internally.\n */\n\nimport { createElement, type ReactNode } from \"react\";\n\n/** Props for the ChatLayout component. */\nexport interface ChatLayoutProps {\n /** Main chat content (thread, input area, etc.). */\n children: ReactNode;\n /** Sidebar content (thread list, session list, etc.). */\n sidebar?: ReactNode;\n /** Modal/overlay content. Accepts a single node or array of nodes. */\n overlay?: ReactNode | ReactNode[];\n /** CSS class on the root element. */\n className?: string;\n}\n\n/**\n * Pure layout container — flex row with optional sidebar and overlay.\n *\n * Renders `[data-chat-ui]` root with:\n * - overlay (rendered first for z-index stacking)\n * - sidebar (rendered before main content)\n * - children (main chat area)\n */\nexport function ChatLayout({ children, sidebar, overlay, className }: ChatLayoutProps): ReactNode {\n const overlayNodes = Array.isArray(overlay) ? overlay : [overlay ?? null];\n return createElement(\"div\", { \"data-chat-ui\": \"\", className },\n ...overlayNodes,\n sidebar ?? null,\n children,\n );\n}\n","/**\n * @witqq/agent-sdk/chat/react — ChatHeader\n *\n * Selector composition for the chat header area. Renders backend selector,\n * model selector, or nothing based on configuration.\n */\n\nimport { createElement, type ReactNode, type ComponentType } from \"react\";\nimport { BackendSelector, type BackendSelectorProps } from \"./BackendSelector.js\";\nimport { ModelSelector, type ModelSelectorProps } from \"./ModelSelector.js\";\nimport type { ModelOption } from \"./useModels.js\";\nimport type { BackendInfo } from \"../runtime.js\";\n\n/** Props for the ChatHeader component. */\nexport interface ChatHeaderProps {\n /** Whether to show backend selector. Default: false. */\n showBackendSelector?: boolean;\n /** Whether to show model selector. Default: true. */\n showModelSelector?: boolean;\n /** Whether providers are configured (hides model selector when true). */\n hasProviders?: boolean;\n /** Available backends list. */\n backends?: BackendInfo[];\n /** Available models list. */\n models?: ModelOption[];\n /** Currently selected model. */\n selectedModel?: string;\n /** Backend selection handler. */\n onBackendSelect?: (name: string) => void;\n /** Model selection handler. */\n onModelSelect?: (modelId: string) => void;\n /** Slot override for BackendSelector. */\n BackendSelectorComponent?: ComponentType<BackendSelectorProps>;\n /** Slot override for ModelSelector. */\n ModelSelectorComponent?: ComponentType<ModelSelectorProps>;\n}\n\n/**\n * Header area with backend and model selectors.\n * Returns null when no selectors need to be shown.\n */\nexport function ChatHeader({\n showBackendSelector = false,\n showModelSelector = true,\n hasProviders = false,\n backends = [],\n models = [],\n selectedModel,\n onBackendSelect,\n onModelSelect,\n BackendSelectorComponent: BSC = BackendSelector,\n ModelSelectorComponent: MSC = ModelSelector,\n}: ChatHeaderProps): ReactNode {\n const children: ReactNode[] = [];\n\n if (showBackendSelector) {\n children.push(\n createElement(BSC, {\n key: \"backend-selector\",\n backends,\n onSelect: onBackendSelect ?? (() => {}),\n }),\n );\n }\n\n // Standalone model selector: shown when no providers and models available\n if (showModelSelector && !hasProviders && models.length > 0) {\n children.push(\n createElement(MSC, {\n key: \"model-selector\",\n models,\n selectedModel,\n onSelect: onModelSelect ?? (() => {}),\n }),\n );\n }\n\n if (children.length === 0) return null;\n return createElement(\"div\", { \"data-chat-header\": \"\" }, ...children);\n}\n","import { createElement, type ReactNode } from \"react\";\nimport type { ChatUsage } from \"./useChat.js\";\n\n/** Props for the UsageBadge component. */\nexport interface UsageBadgeProps {\n usage: ChatUsage | null;\n className?: string;\n}\n\n/** Compact token usage display. Shows prompt/completion/total tokens. */\nexport function UsageBadge({ usage, className }: UsageBadgeProps): ReactNode {\n if (!usage) return null;\n\n return createElement(\n \"span\",\n { \"data-usage-badge\": \"true\", className },\n createElement(\"span\", { \"data-usage-tokens\": \"prompt\" }, `↑${usage.promptTokens}`),\n createElement(\"span\", { \"data-usage-tokens\": \"completion\" }, `↓${usage.completionTokens}`),\n createElement(\"span\", { \"data-usage-tokens\": \"total\" }, `Σ${usage.totalTokens}`),\n );\n}\n","/**\n * @witqq/agent-sdk/chat/react — ChatInputArea\n *\n * Input area combining the unified provider/model selector with the composer.\n */\n\nimport { createElement, type ReactNode, type ComponentType } from \"react\";\nimport { Composer, type ComposerProps } from \"./Composer.js\";\nimport { ProviderModelSelector, type ProviderModelSelectorProps } from \"./ProviderModelSelector.js\";\nimport { UsageBadge } from \"./UsageBadge.js\";\nimport type { ChatUsage } from \"./useChat.js\";\nimport type { ProviderConfig } from \"../provider-types.js\";\nimport type { ModelOption } from \"./useModels.js\";\n\n/** Props for the ChatInputArea component. */\nexport interface ChatInputAreaProps {\n /** Send message handler. */\n onSend: (message: string) => void;\n /** Stop generation handler. */\n onStop?: () => void;\n /** Whether generation is in progress. */\n isGenerating?: boolean;\n /** Placeholder text for the textarea. */\n placeholder?: string;\n /** Available providers. */\n providers?: ProviderConfig[];\n /** Available models. */\n models?: ModelOption[];\n /** Active provider ID. */\n activeProviderId?: string;\n /** Selected model. */\n selectedModel?: string;\n /** Provider selection handler. */\n onSelectProvider?: (id: string) => void;\n /** Model selection handler. */\n onSelectModel?: (modelId: string) => void;\n /** Settings button handler. */\n onSettingsClick?: () => void;\n /** Slot override for Composer. */\n ComposerComponent?: ComponentType<ComposerProps>;\n /** Slot override for ProviderModelSelector. */\n ProviderModelSelectorComponent?: ComponentType<ProviderModelSelectorProps>;\n /** Token usage data to display. */\n usage?: ChatUsage | null;\n}\n\n/**\n * Input area — unified selector + composer in a `[data-chat-input-area]` container.\n */\nexport function ChatInputArea({\n onSend,\n onStop,\n isGenerating,\n placeholder,\n providers = [],\n models = [],\n activeProviderId,\n selectedModel,\n onSelectProvider,\n onSelectModel,\n onSettingsClick,\n ComposerComponent: CC = Composer,\n ProviderModelSelectorComponent: PMSC = ProviderModelSelector,\n usage,\n}: ChatInputAreaProps): ReactNode {\n const selectorRow = createElement(\"div\", { \"data-chat-input-controls\": \"\" },\n createElement(PMSC, {\n providers,\n models,\n activeProviderId,\n selectedModel,\n onSelectProvider,\n onSelectModel,\n onSettingsClick,\n }),\n usage ? createElement(UsageBadge, { usage }) : null,\n );\n\n return createElement(\"div\", { \"data-chat-input-area\": \"\" },\n createElement(\"div\", { \"data-chat-input-container\": \"\" },\n selectorRow,\n createElement(CC, {\n onSend,\n onStop,\n isGenerating,\n placeholder,\n }),\n ),\n );\n}\n","/**\n * @witqq/agent-sdk/chat/react — ChatSettingsOverlay\n *\n * Modal overlay for provider settings management.\n * Features: backdrop click-to-close, ESC key handler, focus trap.\n */\n\nimport { createElement, useState, useEffect, useRef, useCallback, type ReactNode, type ComponentType } from \"react\";\nimport { ProviderSettings, type ProviderSettingsProps } from \"./ProviderSettings.js\";\nimport type { ProviderConfig } from \"../provider-types.js\";\n\n/** Props for the ChatSettingsOverlay component. */\nexport interface ChatSettingsOverlayProps {\n /** Whether the overlay is visible. */\n open: boolean;\n /** Close handler. */\n onClose: () => void;\n /** Available providers. */\n providers?: ProviderConfig[];\n /** Auth API base URL. */\n authBaseUrl?: string;\n /** Provider created handler. */\n onProviderCreated?: (provider: { backend: string; model: string; label?: string }) => void;\n /** Provider deleted handler. */\n onProviderDeleted?: (id: string) => void;\n /** Provider updated handler. */\n onProviderUpdated?: (id: string, changes: Partial<ProviderConfig>) => void;\n /** Called when authentication succeeds. Parent should refresh providers. */\n onAuthCompleted?: (backend: string) => void;\n /** Slot override for ProviderSettings. */\n ProviderSettingsComponent?: ComponentType<ProviderSettingsProps>;\n}\n\nconst FOCUSABLE = 'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])';\nconst CLOSE_ANIMATION_MS = 150;\n\n/**\n * Settings modal — renders `[data-provider-settings-overlay]` when open.\n * Returns null when closed.\n * Backdrop click and Escape key close the overlay with exit animation.\n * Focus is trapped within the overlay content.\n */\nexport function ChatSettingsOverlay({\n open,\n onClose,\n providers = [],\n authBaseUrl,\n onProviderCreated,\n onProviderDeleted,\n onProviderUpdated,\n onAuthCompleted,\n ProviderSettingsComponent: PSC = ProviderSettings,\n}: ChatSettingsOverlayProps): ReactNode {\n const [isClosing, setIsClosing] = useState(false);\n const contentRef = useRef<HTMLDivElement>(null);\n const previousFocusRef = useRef<Element | null>(null);\n\n const handleClose = useCallback(() => {\n setIsClosing(true);\n setTimeout(() => {\n setIsClosing(false);\n onClose();\n }, CLOSE_ANIMATION_MS);\n }, [onClose]);\n\n const handleKeyDown = useCallback((e: KeyboardEvent) => {\n if (e.key === \"Escape\") {\n e.stopPropagation();\n handleClose();\n return;\n }\n if (e.key === \"Tab\" && contentRef.current) {\n const focusable = Array.from(contentRef.current.querySelectorAll(FOCUSABLE)) as HTMLElement[];\n if (focusable.length === 0) return;\n const first = focusable[0];\n const last = focusable[focusable.length - 1];\n if (e.shiftKey && document.activeElement === first) {\n e.preventDefault();\n last.focus();\n } else if (!e.shiftKey && document.activeElement === last) {\n e.preventDefault();\n first.focus();\n }\n }\n }, [handleClose]);\n\n const handleBackdropClick = useCallback((e: { target: unknown; currentTarget: unknown }) => {\n if (e.target === e.currentTarget) handleClose();\n }, [handleClose]);\n\n useEffect(() => {\n if (!open) return;\n previousFocusRef.current = document.activeElement;\n document.addEventListener(\"keydown\", handleKeyDown);\n const timer = setTimeout(() => {\n if (contentRef.current) {\n const first = contentRef.current.querySelector(FOCUSABLE) as HTMLElement | null;\n if (first) first.focus();\n }\n }, 50);\n return () => {\n document.removeEventListener(\"keydown\", handleKeyDown);\n clearTimeout(timer);\n const prev = previousFocusRef.current as HTMLElement | null;\n if (prev && typeof prev.focus === \"function\") prev.focus();\n };\n }, [open, handleKeyDown]);\n\n if (!open && !isClosing) return null;\n\n return createElement(\"div\", {\n \"data-provider-settings-overlay\": \"true\",\n \"data-closing\": isClosing ? \"true\" : undefined,\n onClick: handleBackdropClick,\n role: \"dialog\",\n \"aria-modal\": \"true\",\n \"aria-label\": \"Provider settings\",\n },\n createElement(\"div\", {\n ref: contentRef,\n \"data-provider-settings-content\": \"true\",\n \"data-closing\": isClosing ? \"true\" : undefined,\n },\n createElement(PSC, {\n providers,\n authBaseUrl,\n onClose: handleClose,\n onProviderCreated: onProviderCreated ?? undefined,\n onProviderDeleted: onProviderDeleted ?? undefined,\n onProviderUpdated: onProviderUpdated ?? undefined,\n onAuthCompleted: onAuthCompleted ?? undefined,\n }),\n ),\n );\n}\n","/**\n * @witqq/agent-sdk/chat/react — ChatUI\n *\n * Composite component that wires Thread, Composer, ThreadList, ModelSelector,\n * and ProviderSettings into a complete chat interface. Consumers get a full AI chat\n * in ~3 lines:\n *\n * import { ChatUI } from \"@witqq/agent-sdk/chat/react\";\n * <ChatUI runtime={myRuntime} />\n *\n * Slot system: replace any sub-component while keeping all others as defaults.\n *\n * Built from composable sub-components: ChatLayout, ChatHeader, ChatInputArea,\n * ChatSettingsOverlay — each usable independently for custom layouts.\n */\n\nimport {\n createElement,\n useState,\n useCallback,\n useEffect,\n type ReactNode,\n type ComponentType,\n} from \"react\";\nimport type { ChatMessage, ReasoningPart, ToolCallPart } from \"../core.js\";\nimport type { ContextStats } from \"../context.js\";\nimport type { IChatClient } from \"../runtime.js\";\nimport { ChatProvider, useChatRuntime } from \"./ChatProvider.js\";\nimport { useChat } from \"./useChat.js\";\nimport { useSessions } from \"./useSessions.js\";\nimport { useModels } from \"./useModels.js\";\nimport { useBackends } from \"./useBackends.js\";\nimport { useProviders } from \"./useProviders.js\";\nimport { Thread, type ThreadProps } from \"./Thread.js\";\nimport { type ComposerProps } from \"./Composer.js\";\nimport { ThreadList, type ThreadListProps } from \"./ThreadList.js\";\nimport { type ModelSelectorProps } from \"./ModelSelector.js\";\nimport { type BackendSelectorProps } from \"./BackendSelector.js\";\nimport type { ProviderSelectorProps } from \"./ProviderSelector.js\";\nimport { type ProviderModelSelectorProps } from \"./ProviderModelSelector.js\";\nimport { type ProviderSettingsProps } from \"./ProviderSettings.js\";\nimport { ContextStatsDisplay, type ContextStatsDisplayProps } from \"./ContextStatsDisplay.js\";\nimport { ThreadProvider } from \"./ThreadSlots.js\";\nimport { ChatLayout } from \"./ChatLayout.js\";\nimport { ChatHeader } from \"./ChatHeader.js\";\nimport { ChatInputArea } from \"./ChatInputArea.js\";\nimport { ChatSettingsOverlay } from \"./ChatSettingsOverlay.js\";\n\n/** Slot overrides for ChatUI sub-components. */\nexport interface ChatUISlots {\n /** Replace the Thread component. */\n thread?: ComponentType<ThreadProps>;\n /** Replace the Composer component. */\n composer?: ComponentType<ComposerProps>;\n /** Replace the ThreadList (sidebar) component. */\n threadList?: ComponentType<ThreadListProps>;\n /** Replace the ModelSelector component (used in header when no providers). */\n modelSelector?: ComponentType<ModelSelectorProps>;\n /** Replace the BackendSelector component. */\n backendSelector?: ComponentType<BackendSelectorProps>;\n /** Replace the ProviderSelector component (legacy, use providerModelSelector). */\n providerSelector?: ComponentType<ProviderSelectorProps>;\n /** Replace the unified ProviderModelSelector component (near composer). */\n providerModelSelector?: ComponentType<ProviderModelSelectorProps>;\n /** Replace the ProviderSettings component. */\n providerSettings?: ComponentType<ProviderSettingsProps>;\n /** Replace the ContextStatsDisplay component. */\n contextStats?: ComponentType<ContextStatsDisplayProps>;\n /** Custom auth dialog element rendered when provided. */\n authDialog?: ReactNode;\n /** Custom message renderer (forwarded to ThreadProvider). */\n renderMessage?: (message: ChatMessage, index: number) => ReactNode;\n /** Custom tool call renderer (forwarded to ThreadProvider). */\n renderToolCall?: (part: ToolCallPart, index: number) => ReactNode;\n /** Custom thinking block renderer (forwarded to ThreadProvider). */\n renderThinkingBlock?: (part: ReasoningPart, index: number) => ReactNode;\n}\n\n/** Props for the ChatUI composite component. */\nexport interface ChatUIProps {\n /** The chat runtime or client instance. ChatUI wraps it in ChatProvider. Accepts IChatClient. */\n runtime: IChatClient;\n /** Slot overrides for sub-components. */\n slots?: ChatUISlots;\n /** CSS class on the root element. */\n className?: string;\n /** Show the session sidebar. Default: true. */\n showSidebar?: boolean;\n /** Show the model selector header. Default: true. */\n showModelSelector?: boolean;\n /** Show the backend selector in header. Default: false. */\n showBackendSelector?: boolean;\n /** Show the provider selector near composer. Default: auto (true when providers available). */\n showProviderSelector?: boolean;\n /** Base URL for auth API (needed by ProviderSettings). */\n authBaseUrl?: string;\n /** Placeholder text for the Composer textarea. */\n placeholder?: string;\n}\n\n/**\n * Internal component rendered inside ChatProvider.\n * Uses hooks that require the ChatProvider context.\n */\nfunction ChatUIInner({\n slots,\n className,\n showSidebar = true,\n showModelSelector = true,\n showBackendSelector: showBackendSelectorProp,\n showProviderSelector: _showProviderSelectorProp,\n authBaseUrl,\n placeholder,\n}: Omit<ChatUIProps, \"runtime\">): ReactNode {\n const runtime = useChatRuntime();\n const { messages, sendMessage, stop, isGenerating, newSession, error, clearError, retryLastMessage, usage } = useChat();\n const { sessions } = useSessions();\n const { models, refresh: refreshModels } = useModels();\n const { backends } = useBackends();\n const { providers, createProvider, updateProvider, deleteProvider, selectProvider, refresh } = useProviders();\n const [settingsOpen, setSettingsOpen] = useState(false);\n const [activeProviderId, setActiveProviderId] = useState<string | undefined>(undefined);\n const [selectedModelId, setSelectedModelId] = useState<string | undefined>(undefined);\n const [searchQuery, setSearchQuery] = useState(\"\");\n\n const hasProviders = providers.length > 0;\n\n // Track active provider — initialize from first provider, update on switch\n useEffect(() => {\n if (providers.length > 0 && !activeProviderId) {\n setActiveProviderId(providers[0].id);\n selectProvider(providers[0].id);\n }\n }, [providers, activeProviderId, selectProvider]);\n\n const showBackendSelectorResolved = showBackendSelectorProp ?? false;\n\n const handleSelect = useCallback(async (id: string) => {\n try { await runtime.switchSession(id); } catch { /* session may not exist */ }\n }, [runtime]);\n\n const handleCreate = useCallback(async () => {\n try { await newSession(); } catch { /* best effort */ }\n }, [newSession]);\n\n const handleDelete = useCallback(async (id: string) => {\n try { await runtime.deleteSession(id); } catch { /* best effort */ }\n }, [runtime]);\n\n const handleModelSelect = useCallback((modelId: string) => {\n setSelectedModelId(modelId);\n }, []);\n\n const handleBackendSelect = useCallback((_name: string) => {\n refreshModels();\n }, [refreshModels]);\n\n const handleProviderSelect = useCallback((id: string) => {\n selectProvider(id);\n setActiveProviderId(id);\n }, [selectProvider]);\n\n const hasSlotOverrides = !!(slots?.renderToolCall || slots?.renderMessage || slots?.renderThinkingBlock);\n const ThreadComponent = slots?.thread ?? Thread;\n const ThreadListComponent = slots?.threadList ?? ThreadList;\n const ContextStatsComponent = slots?.contextStats ?? ContextStatsDisplay;\n\n // Context stats — getContextStats may be sync (IChatRuntime) or async (RemoteChatClient)\n const [contextStats, setContextStats] = useState<ContextStats | null>(null);\n useEffect(() => {\n if (!runtime.activeSessionId) {\n setContextStats(null);\n return;\n }\n const result = runtime.getContextStats(runtime.activeSessionId);\n if (result instanceof Promise) {\n result.then(setContextStats, () => setContextStats(null));\n } else {\n setContextStats(result);\n }\n }, [runtime, runtime.activeSessionId, messages.length]);\n\n // Empty state: shown when no providers connected and no messages\n const showEmptyState = !hasProviders && messages.length === 0;\n\n const mainContent = createElement(\"div\", { \"data-chat-main\": \"\" },\n createElement(ChatHeader, {\n showBackendSelector: showBackendSelectorResolved,\n showModelSelector,\n hasProviders,\n backends,\n models,\n selectedModel: selectedModelId,\n onBackendSelect: handleBackendSelect,\n onModelSelect: handleModelSelect,\n BackendSelectorComponent: slots?.backendSelector,\n ModelSelectorComponent: slots?.modelSelector,\n }),\n contextStats ? createElement(ContextStatsComponent, { stats: contextStats }) : null,\n error\n ? createElement(\"div\", { \"data-chat-error\": \"\" },\n createElement(\"span\", { \"data-chat-error-text\": \"\" }, error.message),\n createElement(\"div\", { \"data-chat-error-actions\": \"\" },\n createElement(\"button\", {\n \"data-action\": \"retry\",\n type: \"button\",\n onClick: retryLastMessage,\n }, \"Retry\"),\n createElement(\"button\", {\n \"data-action\": \"dismiss-error\",\n type: \"button\",\n onClick: clearError,\n }, \"✕\"),\n ),\n error.stack\n ? createElement(\"details\", { \"data-chat-error-details\": \"\" },\n createElement(\"summary\", null, \"Details\"),\n createElement(\"pre\", null, error.stack),\n )\n : null,\n )\n : null,\n showEmptyState\n ? createElement(\"div\", { \"data-chat-empty-state\": \"\" },\n createElement(\"div\", { \"data-chat-empty-title\": \"\" }, \"Connect a provider to start chatting\"),\n createElement(\"button\", {\n \"data-action\": \"open-settings\",\n onClick: () => setSettingsOpen(true),\n }, \"+ Connect Provider\"),\n )\n : createElement(ThreadComponent, { messages, isGenerating, autoScroll: true }),\n createElement(ChatInputArea, {\n onSend: sendMessage,\n onStop: stop,\n isGenerating,\n placeholder,\n providers,\n models,\n activeProviderId,\n selectedModel: selectedModelId,\n onSelectProvider: handleProviderSelect,\n onSelectModel: handleModelSelect,\n onSettingsClick: () => setSettingsOpen(true),\n ComposerComponent: slots?.composer,\n ProviderModelSelectorComponent: slots?.providerModelSelector,\n usage,\n }),\n );\n\n const wrappedMain = hasSlotOverrides\n ? createElement(ThreadProvider, {\n renderToolCall: slots!.renderToolCall,\n renderMessage: slots!.renderMessage,\n renderThinkingBlock: slots!.renderThinkingBlock,\n children: mainContent,\n })\n : mainContent;\n\n const sidebar = showSidebar\n ? createElement(ThreadListComponent, {\n sessions,\n activeSessionId: runtime.activeSessionId ?? undefined,\n onSelect: handleSelect,\n onCreate: handleCreate,\n onDelete: handleDelete,\n searchQuery,\n onSearchChange: setSearchQuery,\n })\n : undefined;\n\n const settingsOverlay = createElement(ChatSettingsOverlay, {\n open: settingsOpen,\n onClose: () => setSettingsOpen(false),\n providers,\n authBaseUrl,\n onProviderCreated: (p) => createProvider({ backend: p.backend, model: p.model, label: p.label ?? \"\" }),\n onProviderDeleted: (id) => deleteProvider(id),\n onProviderUpdated: (id, changes) => updateProvider(id, changes),\n onAuthCompleted: () => refresh(),\n ProviderSettingsComponent: slots?.providerSettings,\n });\n\n return createElement(ChatLayout, {\n className,\n sidebar,\n overlay: [slots?.authDialog ?? null, settingsOverlay],\n children: wrappedMain,\n });\n}\n\n/**\n * Composite chat component — complete AI chat interface in one import.\n *\n * ```tsx\n * import { ChatUI } from \"@witqq/agent-sdk/chat/react\";\n *\n * function App() {\n * return <ChatUI runtime={myRuntime} />;\n * }\n * ```\n */\nexport function ChatUI({ runtime, ...rest }: ChatUIProps): ReactNode {\n return createElement(ChatProvider, {\n runtime,\n children: createElement(ChatUIInner, rest),\n });\n}\n"]}