@witqq/agent-sdk 0.6.1 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +433 -6
- package/dist/auth/index.cjs +188 -1
- package/dist/auth/index.cjs.map +1 -1
- package/dist/auth/index.d.cts +154 -138
- package/dist/auth/index.d.ts +154 -138
- package/dist/auth/index.js +188 -2
- package/dist/auth/index.js.map +1 -1
- package/dist/backends/claude.cjs +315 -21
- package/dist/backends/claude.cjs.map +1 -1
- package/dist/backends/claude.d.cts +2 -1
- package/dist/backends/claude.d.ts +2 -1
- package/dist/backends/claude.js +315 -21
- package/dist/backends/claude.js.map +1 -1
- package/dist/backends/copilot.cjs +132 -24
- package/dist/backends/copilot.cjs.map +1 -1
- package/dist/backends/copilot.d.cts +2 -1
- package/dist/backends/copilot.d.ts +2 -1
- package/dist/backends/copilot.js +132 -24
- package/dist/backends/copilot.js.map +1 -1
- package/dist/backends/vercel-ai.cjs +56 -17
- package/dist/backends/vercel-ai.cjs.map +1 -1
- package/dist/backends/vercel-ai.d.cts +1 -1
- package/dist/backends/vercel-ai.d.ts +1 -1
- package/dist/backends/vercel-ai.js +56 -17
- package/dist/backends/vercel-ai.js.map +1 -1
- package/dist/chat/accumulator.cjs +147 -0
- package/dist/chat/accumulator.cjs.map +1 -0
- package/dist/chat/accumulator.d.cts +61 -0
- package/dist/chat/accumulator.d.ts +61 -0
- package/dist/chat/accumulator.js +145 -0
- package/dist/chat/accumulator.js.map +1 -0
- package/dist/chat/backends.cjs +3534 -0
- package/dist/chat/backends.cjs.map +1 -0
- package/dist/chat/backends.d.cts +62 -0
- package/dist/chat/backends.d.ts +62 -0
- package/dist/chat/backends.js +3501 -0
- package/dist/chat/backends.js.map +1 -0
- package/dist/chat/context.cjs +230 -0
- package/dist/chat/context.cjs.map +1 -0
- package/dist/chat/context.d.cts +167 -0
- package/dist/chat/context.d.ts +167 -0
- package/dist/chat/context.js +227 -0
- package/dist/chat/context.js.map +1 -0
- package/dist/chat/core.cjs +282 -0
- package/dist/chat/core.cjs.map +1 -0
- package/dist/chat/core.d.cts +435 -0
- package/dist/chat/core.d.ts +435 -0
- package/dist/chat/core.js +261 -0
- package/dist/chat/core.js.map +1 -0
- package/dist/chat/errors.cjs +251 -0
- package/dist/chat/errors.cjs.map +1 -0
- package/dist/chat/errors.d.cts +122 -0
- package/dist/chat/errors.d.ts +122 -0
- package/dist/chat/errors.js +243 -0
- package/dist/chat/errors.js.map +1 -0
- package/dist/chat/events.cjs +203 -0
- package/dist/chat/events.cjs.map +1 -0
- package/dist/chat/events.d.cts +241 -0
- package/dist/chat/events.d.ts +241 -0
- package/dist/chat/events.js +196 -0
- package/dist/chat/events.js.map +1 -0
- package/dist/chat/index.cjs +5359 -0
- package/dist/chat/index.cjs.map +1 -0
- package/dist/chat/index.d.cts +52 -0
- package/dist/chat/index.d.ts +52 -0
- package/dist/chat/index.js +5296 -0
- package/dist/chat/index.js.map +1 -0
- package/dist/chat/react.cjs +2739 -0
- package/dist/chat/react.cjs.map +1 -0
- package/dist/chat/react.d.cts +619 -0
- package/dist/chat/react.d.ts +619 -0
- package/dist/chat/react.js +2714 -0
- package/dist/chat/react.js.map +1 -0
- package/dist/chat/runtime.cjs +1030 -0
- package/dist/chat/runtime.cjs.map +1 -0
- package/dist/chat/runtime.d.cts +118 -0
- package/dist/chat/runtime.d.ts +118 -0
- package/dist/chat/runtime.js +1028 -0
- package/dist/chat/runtime.js.map +1 -0
- package/dist/chat/server.cjs +643 -0
- package/dist/chat/server.cjs.map +1 -0
- package/dist/chat/server.d.cts +287 -0
- package/dist/chat/server.d.ts +287 -0
- package/dist/chat/server.js +617 -0
- package/dist/chat/server.js.map +1 -0
- package/dist/chat/sessions.cjs +398 -0
- package/dist/chat/sessions.cjs.map +1 -0
- package/dist/chat/sessions.d.cts +239 -0
- package/dist/chat/sessions.d.ts +239 -0
- package/dist/chat/sessions.js +394 -0
- package/dist/chat/sessions.js.map +1 -0
- package/dist/chat/state.cjs +177 -0
- package/dist/chat/state.cjs.map +1 -0
- package/dist/chat/state.d.cts +92 -0
- package/dist/chat/state.d.ts +92 -0
- package/dist/chat/state.js +167 -0
- package/dist/chat/state.js.map +1 -0
- package/dist/chat/storage.cjs +240 -0
- package/dist/chat/storage.cjs.map +1 -0
- package/dist/chat/storage.d.cts +191 -0
- package/dist/chat/storage.d.ts +191 -0
- package/dist/chat/storage.js +236 -0
- package/dist/chat/storage.js.map +1 -0
- package/dist/errors-BDLbNu9w.d.cts +13 -0
- package/dist/errors-BDLbNu9w.d.ts +13 -0
- package/dist/in-process-transport-C2oPTYs6.d.ts +223 -0
- package/dist/in-process-transport-DG-w5G6k.d.cts +223 -0
- package/dist/index.cjs +25 -13
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +32 -4
- package/dist/index.d.ts +32 -4
- package/dist/index.js +25 -13
- package/dist/index.js.map +1 -1
- package/dist/transport-D1OaUgRk.d.ts +67 -0
- package/dist/transport-DX1Nhm4N.d.cts +67 -0
- package/dist/types-Bh5AhqD-.d.ts +141 -0
- package/dist/types-CGF7AEX1.d.cts +141 -0
- package/dist/{types-BvwNzZCj.d.cts → types-CqvUAYxt.d.cts} +21 -3
- package/dist/{types-BvwNzZCj.d.ts → types-CqvUAYxt.d.ts} +21 -3
- package/dist/types-DLZzlJxt.d.ts +39 -0
- package/dist/types-tE0CXwBl.d.cts +39 -0
- package/package.json +149 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/errors.ts","../../src/auth/types.ts","../../src/auth/copilot-auth.ts","../../src/auth/claude-auth.ts","../../src/auth/refresh-manager.ts","../../src/auth/index.ts","../../src/chat/react/ChatProvider.ts","../../src/chat/core.ts","../../src/chat/accumulator.ts","../../src/chat/react/useChat.ts","../../src/chat/react/useMessages.ts","../../src/chat/react/useSessions.ts","../../src/chat/react/Message.ts","../../src/chat/react/ThinkingBlock.ts","../../src/chat/react/ToolCallView.ts","../../src/chat/react/useToolApproval.ts","../../src/chat/react/MarkdownRenderer.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/useAuth.ts","../../src/chat/react/useRemoteAuth.ts","../../src/chat/react/RemoteChatRuntime.ts","../../src/chat/react/useRemoteChat.ts","../../src/chat/react/AuthDialog.ts"],"names":["nodeRandomBytes","CLIENT_ID","DEFAULT_SCOPES","useRef","useCallback","useEffect","useState","createElement","createContext","useContext","useMemo","CopilotAuth","ClaudeAuth"],"mappings":"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","file":"react.js","sourcesContent":["/** Base error class for agent-sdk.\n *\n * Use `AgentSDKError.is(err)` for reliable cross-module `instanceof` checks\n * (works across separately bundled entry points where `instanceof` may fail). */\nexport class AgentSDKError extends Error {\n /** @internal Marker for cross-bundle identity checks */\n readonly _agentSDKError = true as const;\n\n constructor(message: string, options?: ErrorOptions) {\n super(message, options);\n this.name = \"AgentSDKError\";\n }\n\n /** Check if an error is an AgentSDKError (works across bundled copies) */\n static is(error: unknown): error is AgentSDKError {\n return (\n error instanceof Error &&\n \"_agentSDKError\" in error &&\n (error as AgentSDKError)._agentSDKError === true\n );\n }\n}\n\n/** Thrown when agent.run() is called while already running (M8 re-entrancy guard) */\nexport class ReentrancyError extends AgentSDKError {\n constructor() {\n super(\"Agent is already running. Await the current run before starting another.\");\n this.name = \"ReentrancyError\";\n }\n}\n\n/** Thrown when an operation is attempted on a disposed agent/service */\nexport class DisposedError extends AgentSDKError {\n constructor(entity: string) {\n super(`${entity} has been disposed and cannot be used.`);\n this.name = \"DisposedError\";\n }\n}\n\n/** Thrown when a backend is not found in the registry */\nexport class BackendNotFoundError extends AgentSDKError {\n constructor(backend: string) {\n super(\n `Unknown backend: \"${backend}\". ` +\n `Built-in: copilot, claude, vercel-ai. ` +\n `Custom: use registerBackend() first.`,\n );\n this.name = \"BackendNotFoundError\";\n }\n}\n\n/** Thrown when a backend is already registered */\nexport class BackendAlreadyRegisteredError extends AgentSDKError {\n constructor(backend: string) {\n super(`Backend \"${backend}\" is already registered. Use a different name or unregister first.`);\n this.name = \"BackendAlreadyRegisteredError\";\n }\n}\n\n/** Thrown when subprocess management fails */\nexport class SubprocessError extends AgentSDKError {\n constructor(message: string, options?: ErrorOptions) {\n super(message, options);\n this.name = \"SubprocessError\";\n }\n}\n\n/** Thrown when a required peer dependency is not installed */\nexport class DependencyError extends AgentSDKError {\n public readonly packageName: string;\n\n constructor(packageName: string) {\n super(`${packageName} is not installed. Install it: npm install ${packageName}`);\n this.name = \"DependencyError\";\n this.packageName = packageName;\n }\n}\n\n/** Thrown when an agent run is aborted */\nexport class AbortError extends AgentSDKError {\n constructor() {\n super(\"Agent run was aborted.\");\n this.name = \"AbortError\";\n }\n}\n\n/** Thrown when a tool execution fails */\nexport class ToolExecutionError extends AgentSDKError {\n public readonly toolName: string;\n\n constructor(toolName: string, message: string, options?: ErrorOptions) {\n super(`Tool \"${toolName}\" failed: ${message}`, options);\n this.name = \"ToolExecutionError\";\n this.toolName = toolName;\n }\n}\n\n/** Thrown when structured output parsing fails */\nexport class StructuredOutputError extends AgentSDKError {\n constructor(message: string, options?: ErrorOptions) {\n super(`Structured output error: ${message}`, options);\n this.name = \"StructuredOutputError\";\n }\n}\n","// ─── Auth Token Types ──────────────────────────────────────────\n\nimport { AgentSDKError } from \"../errors.js\";\n\n/**\n * Base auth token returned by all auth providers.\n *\n * @example\n * ```ts\n * import type { AuthToken } from \"@witqq/agent-sdk/auth\";\n *\n * const token: AuthToken = {\n * accessToken: \"gho_abc123...\",\n * tokenType: \"bearer\",\n * obtainedAt: Date.now(),\n * };\n * ```\n */\nexport interface AuthToken {\n /** The access token string */\n accessToken: string;\n /** Token type (e.g. \"bearer\") */\n tokenType: string;\n /** Seconds until token expires (undefined = long-lived) */\n expiresIn?: number;\n /** Timestamp when the token was obtained */\n obtainedAt: number;\n}\n\n/**\n * Copilot-specific token (GitHub OAuth, long-lived).\n *\n * @example\n * ```ts\n * import type { CopilotAuthToken } from \"@witqq/agent-sdk/auth\";\n *\n * const token: CopilotAuthToken = {\n * accessToken: \"gho_abc123...\",\n * tokenType: \"bearer\",\n * obtainedAt: Date.now(),\n * login: \"octocat\",\n * };\n * ```\n */\nexport interface CopilotAuthToken extends AuthToken {\n /** GitHub user login associated with the token */\n login?: string;\n}\n\n/**\n * Claude-specific token (OAuth+PKCE, expires in 8h).\n *\n * @example\n * ```ts\n * import type { ClaudeAuthToken } from \"@witqq/agent-sdk/auth\";\n *\n * const token: ClaudeAuthToken = {\n * accessToken: \"sk-ant-oat01-...\",\n * tokenType: \"bearer\",\n * expiresIn: 28800,\n * obtainedAt: Date.now(),\n * refreshToken: \"sk-ant-rt01-...\",\n * scopes: [\"user:inference\", \"user:profile\"],\n * };\n * ```\n */\nexport interface ClaudeAuthToken extends AuthToken {\n /** Refresh token for obtaining new access tokens */\n refreshToken: string;\n /** OAuth scopes granted */\n scopes: string[];\n}\n\n// ─── Device Flow Types (Copilot) ──────────────────────────────\n\n/**\n * Result of initiating a GitHub Device Flow.\n *\n * @example\n * ```ts\n * import { CopilotAuth } from \"@witqq/agent-sdk/auth\";\n *\n * const auth = new CopilotAuth();\n * const { userCode, verificationUrl, waitForToken } = await auth.startDeviceFlow();\n * console.log(`Open ${verificationUrl} and enter code: ${userCode}`);\n * const token = await waitForToken();\n * ```\n */\nexport interface DeviceFlowResult {\n /** The code the user must enter at the verification URL */\n userCode: string;\n /** URL where the user enters the code */\n verificationUrl: string;\n /** Polls GitHub until user authorizes; resolves with token */\n waitForToken: (signal?: AbortSignal) => Promise<CopilotAuthToken>;\n}\n\n// ─── OAuth Flow Types (Claude) ────────────────────────────────\n\n/** Options for starting a Claude OAuth flow */\nexport interface OAuthFlowOptions {\n /** The redirect URI registered with the OAuth app */\n redirectUri?: string;\n /** OAuth scopes to request (defaults to user:profile user:inference) */\n scopes?: string;\n}\n\n/**\n * Result of initiating a Claude OAuth flow.\n *\n * @example\n * ```ts\n * import type { OAuthFlowResult } from \"@witqq/agent-sdk/auth\";\n *\n * const result: OAuthFlowResult = {\n * authorizeUrl: \"https://claude.ai/oauth/authorize?...\",\n * completeAuth: async (code) => ({ ... }),\n * };\n * // Open result.authorizeUrl in browser, get code from redirect\n * const token = await result.completeAuth(code);\n * ```\n */\nexport interface OAuthFlowResult {\n /** URL to open in browser for user authorization */\n authorizeUrl: string;\n /** Exchange the authorization code (or full redirect URL) for tokens */\n completeAuth: (codeOrUrl: string) => Promise<ClaudeAuthToken>;\n}\n\n// ─── Auth Errors ──────────────────────────────────────────────\n\n/** Base error for auth operations.\n * @param message - Error description\n * @param options - Standard ErrorOptions (e.g. cause)\n */\nexport class AuthError extends AgentSDKError {\n constructor(message: string, options?: ErrorOptions) {\n super(message, options);\n this.name = \"AuthError\";\n }\n}\n\n/** Device code expired before user authorized */\nexport class DeviceCodeExpiredError extends AuthError {\n constructor() {\n super(\"Device code expired. Please restart the auth flow.\");\n this.name = \"DeviceCodeExpiredError\";\n }\n}\n\n/** User denied access during OAuth flow */\nexport class AccessDeniedError extends AuthError {\n constructor() {\n super(\"Access was denied by the user.\");\n this.name = \"AccessDeniedError\";\n }\n}\n\n/** Token exchange or refresh failed.\n * @param message - Error description\n * @param options - Standard ErrorOptions (e.g. cause)\n */\nexport class TokenExchangeError extends AuthError {\n constructor(message: string, options?: ErrorOptions) {\n super(message, options);\n this.name = \"TokenExchangeError\";\n }\n}\n","import type { CopilotAuthToken, DeviceFlowResult } from \"./types.js\";\nimport {\n AuthError,\n DeviceCodeExpiredError,\n AccessDeniedError,\n} from \"./types.js\";\n\nconst CLIENT_ID = \"Ov23ctDVkRmgkPke0Mmm\";\nconst DEVICE_CODE_URL = \"https://github.com/login/device/code\";\nconst ACCESS_TOKEN_URL = \"https://github.com/login/oauth/access_token\";\nconst USER_API_URL = \"https://api.github.com/user\";\nconst DEFAULT_SCOPES = \"read:user,read:org,repo,gist\";\nconst GRANT_TYPE = \"urn:ietf:params:oauth:grant-type:device_code\";\n\ninterface DeviceCodeResponse {\n device_code: string;\n user_code: string;\n verification_uri: string;\n expires_in: number;\n interval: number;\n}\n\ninterface TokenPollResponse {\n access_token?: string;\n token_type?: string;\n scope?: string;\n error?: string;\n error_description?: string;\n interval?: number;\n}\n\ninterface GitHubUser {\n login: string;\n}\n\n/** Fetch function type for dependency injection in tests */\ntype FetchFn = typeof globalThis.fetch;\n\n/**\n * Programmatic GitHub Device Flow authentication for Copilot SDK.\n *\n * @example\n * ```ts\n * const auth = new CopilotAuth();\n * const flow = await auth.startDeviceFlow();\n * console.log(`Open ${flow.verificationUrl} and enter ${flow.userCode}`);\n * const token = await flow.waitForToken();\n * // Use token.accessToken with CopilotBackendOptions.githubToken\n * ```\n */\nexport class CopilotAuth {\n private readonly fetchFn: FetchFn;\n\n /** @param options - Optional configuration with custom fetch for testing */\n constructor(options?: { fetch?: FetchFn }) {\n this.fetchFn = options?.fetch ?? globalThis.fetch;\n }\n\n /**\n * Start the GitHub Device Flow.\n * Returns a device code result with user code, verification URL,\n * and a `waitForToken()` function that polls until the user authorizes.\n *\n * @param options - Optional scopes and abort signal\n * @returns Device flow result with user code, verification URL, and waitForToken poller\n * @throws {AuthError} If the device code request fails\n * @throws {DeviceCodeExpiredError} If the device code expires before user authorizes\n * @throws {AccessDeniedError} If the user denies access\n *\n * @example\n * ```ts\n * const auth = new CopilotAuth();\n * const { userCode, verificationUrl, waitForToken } = await auth.startDeviceFlow();\n * console.log(`Open ${verificationUrl} and enter code: ${userCode}`);\n * const token = await waitForToken();\n * ```\n */\n async startDeviceFlow(options?: {\n scopes?: string;\n signal?: AbortSignal;\n }): Promise<DeviceFlowResult> {\n const scopes = options?.scopes ?? DEFAULT_SCOPES;\n const response = await this.fetchFn(DEVICE_CODE_URL, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/x-www-form-urlencoded\",\n Accept: \"application/json\",\n },\n body: new URLSearchParams({\n client_id: CLIENT_ID,\n scope: scopes,\n }),\n signal: options?.signal,\n });\n\n if (!response.ok) {\n throw new AuthError(\n `Failed to request device code: ${response.status} ${response.statusText}`,\n );\n }\n\n const data = (await response.json()) as DeviceCodeResponse;\n\n return {\n userCode: data.user_code,\n verificationUrl: data.verification_uri,\n waitForToken: (signal?: AbortSignal) =>\n this.pollForToken(data.device_code, data.interval, signal),\n };\n }\n\n private async pollForToken(\n deviceCode: string,\n interval: number,\n signal?: AbortSignal,\n ): Promise<CopilotAuthToken> {\n let pollIntervalMs = interval * 1000;\n\n while (true) {\n if (signal?.aborted) {\n throw new AuthError(\"Authentication was aborted.\");\n }\n\n await this.delay(pollIntervalMs, signal);\n\n const response = await this.fetchFn(ACCESS_TOKEN_URL, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/x-www-form-urlencoded\",\n Accept: \"application/json\",\n },\n body: new URLSearchParams({\n client_id: CLIENT_ID,\n device_code: deviceCode,\n grant_type: GRANT_TYPE,\n }),\n signal,\n });\n\n if (!response.ok) {\n throw new AuthError(\n `Token poll failed: ${response.status} ${response.statusText}`,\n );\n }\n\n const data = (await response.json()) as TokenPollResponse;\n\n if (data.access_token) {\n const token: CopilotAuthToken = {\n accessToken: data.access_token,\n tokenType: data.token_type ?? \"bearer\",\n obtainedAt: Date.now(),\n };\n\n // Try to fetch user login\n try {\n const login = await this.fetchUserLogin(data.access_token, signal);\n if (login) token.login = login;\n } catch {\n // Non-critical: login is optional\n }\n\n return token;\n }\n\n if (data.error === \"authorization_pending\") {\n continue;\n }\n\n if (data.error === \"slow_down\") {\n pollIntervalMs = (data.interval ?? interval + 5) * 1000;\n continue;\n }\n\n if (data.error === \"expired_token\") {\n throw new DeviceCodeExpiredError();\n }\n\n if (data.error === \"access_denied\") {\n throw new AccessDeniedError();\n }\n\n throw new AuthError(\n data.error_description ?? `Unexpected error: ${data.error}`,\n );\n }\n }\n\n private async fetchUserLogin(\n token: string,\n signal?: AbortSignal,\n ): Promise<string | undefined> {\n const response = await this.fetchFn(USER_API_URL, {\n headers: {\n Authorization: `Bearer ${token}`,\n Accept: \"application/json\",\n },\n signal,\n });\n\n if (!response.ok) return undefined;\n\n const user = (await response.json()) as GitHubUser;\n return user.login;\n }\n\n private delay(ms: number, signal?: AbortSignal): Promise<void> {\n return new Promise((resolve, reject) => {\n const timer = setTimeout(resolve, ms);\n signal?.addEventListener(\n \"abort\",\n () => {\n clearTimeout(timer);\n reject(new AuthError(\"Authentication was aborted.\"));\n },\n { once: true },\n );\n });\n }\n}\n","import type { ClaudeAuthToken, OAuthFlowResult, OAuthFlowOptions } from \"./types.js\";\nimport { TokenExchangeError } from \"./types.js\";\nimport { createHash, randomBytes as nodeRandomBytes } from \"node:crypto\";\n\nconst CLIENT_ID = \"9d1c250a-e61b-44d9-88ed-5944d1962f5e\";\nconst AUTHORIZE_URL = \"https://claude.ai/oauth/authorize\";\nconst TOKEN_URL = \"https://platform.claude.com/v1/oauth/token\";\nconst DEFAULT_REDIRECT_URI =\n \"https://platform.claude.com/oauth/code/callback\";\nconst DEFAULT_SCOPES =\n \"user:profile user:inference user:sessions:claude_code user:mcp_servers\";\n\n/** Fetch function type for dependency injection in tests */\ntype FetchFn = typeof globalThis.fetch;\n\n/** Random bytes generator for dependency injection in tests */\ntype RandomBytesFn = (size: number) => Uint8Array;\n\n/**\n * Programmatic OAuth+PKCE authentication for Claude SDK.\n *\n * @example\n * ```ts\n * const auth = new ClaudeAuth();\n * const { authorizeUrl, completeAuth } = auth.startOAuthFlow({\n * redirectUri: \"https://platform.claude.com/oauth/code/callback\",\n * });\n * // Open authorizeUrl in browser, get code from redirect\n * const token = await completeAuth(code);\n * // Use token with ClaudeBackendOptions: env.CLAUDE_CODE_OAUTH_TOKEN\n * ```\n */\nexport class ClaudeAuth {\n private readonly fetchFn: FetchFn;\n private readonly randomBytes: RandomBytesFn;\n\n /**\n * @param options - Optional configuration with custom fetch and random bytes for testing\n */\n constructor(options?: {\n fetch?: FetchFn;\n randomBytes?: RandomBytesFn;\n }) {\n this.fetchFn = options?.fetch ?? globalThis.fetch;\n this.randomBytes = options?.randomBytes ?? defaultRandomBytes;\n }\n\n /**\n * Start the Claude OAuth+PKCE flow.\n * Generates PKCE code verifier/challenge and returns an authorize URL\n * plus a `completeAuth(code)` function for token exchange.\n *\n * @param options - Redirect URI and optional scopes\n * @returns OAuth flow result with authorize URL and completeAuth function\n * @throws {AuthError} If PKCE generation fails\n *\n * @example\n * ```ts\n * const auth = new ClaudeAuth();\n * const { authorizeUrl, completeAuth } = auth.startOAuthFlow({\n * redirectUri: \"https://platform.claude.com/oauth/code/callback\",\n * });\n * console.log(`Open: ${authorizeUrl}`);\n * const token = await completeAuth(authorizationCode);\n * ```\n */\n startOAuthFlow(options?: OAuthFlowOptions): OAuthFlowResult {\n const redirectUri = options?.redirectUri ?? DEFAULT_REDIRECT_URI;\n const scopes = options?.scopes ?? DEFAULT_SCOPES;\n\n const codeVerifier = this.generateCodeVerifier();\n const state = this.generateState();\n\n const authorizeUrl = this.buildAuthorizeUrl(\n redirectUri,\n scopes,\n codeVerifier,\n state,\n );\n\n return {\n authorizeUrl,\n completeAuth: (codeOrUrl: string) => {\n const code = ClaudeAuth.extractCode(codeOrUrl);\n return this.exchangeCode(code, codeVerifier, state, redirectUri);\n },\n };\n }\n\n /**\n * Extract an authorization code from user input.\n * Accepts a raw code string or a full redirect URL containing a `code` query parameter.\n *\n * @param input - Raw authorization code or redirect URL\n * @returns The extracted authorization code\n *\n * @example\n * ```ts\n * ClaudeAuth.extractCode(\"abc123\"); // \"abc123\"\n * ClaudeAuth.extractCode(\"https://platform.claude.com/oauth/code/callback?code=abc123&state=xyz\"); // \"abc123\"\n * ```\n */\n static extractCode(input: string): string {\n const trimmed = input.trim();\n try {\n const url = new URL(trimmed);\n const code = url.searchParams.get(\"code\");\n if (code) return code;\n } catch {\n // Not a URL — treat as raw code\n }\n // Handle code#state format from redirect page\n const hashIdx = trimmed.indexOf(\"#\");\n if (hashIdx > 0) {\n return trimmed.substring(0, hashIdx);\n }\n return trimmed;\n }\n\n /**\n * Refresh an expired Claude token.\n *\n * @param refreshToken - The refresh token from a previous authentication\n * @returns New auth token with refreshed access token\n * @throws {TokenExchangeError} If the refresh request fails\n *\n * @example\n * ```ts\n * const auth = new ClaudeAuth();\n * const newToken = await auth.refreshToken(oldToken.refreshToken);\n * ```\n */\n async refreshToken(refreshToken: string): Promise<ClaudeAuthToken> {\n const response = await this.fetchFn(TOKEN_URL, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n grant_type: \"refresh_token\",\n refresh_token: refreshToken,\n client_id: CLIENT_ID,\n }),\n });\n\n if (!response.ok) {\n const text = await response.text();\n throw new TokenExchangeError(\n `Token refresh failed: ${response.status} ${text}`,\n );\n }\n\n const data = (await response.json()) as TokenResponse;\n return this.mapTokenResponse(data);\n }\n\n private generateCodeVerifier(): string {\n const bytes = this.randomBytes(96);\n return base64Encode(bytes)\n .replace(/\\+/g, \"~\")\n .replace(/=/g, \"_\")\n .replace(/\\//g, \"-\");\n }\n\n private generateState(): string {\n const bytes = this.randomBytes(16);\n return hexEncode(bytes);\n }\n\n private buildAuthorizeUrl(\n redirectUri: string,\n scopes: string,\n codeVerifier: string,\n state: string,\n ): string {\n const codeChallenge = this.generateCodeChallengeSync(codeVerifier);\n\n const url = new URL(AUTHORIZE_URL);\n url.searchParams.set(\"code\", \"true\");\n url.searchParams.set(\"client_id\", CLIENT_ID);\n url.searchParams.set(\"response_type\", \"code\");\n url.searchParams.set(\"redirect_uri\", redirectUri);\n url.searchParams.set(\"scope\", scopes);\n url.searchParams.set(\"code_challenge\", codeChallenge);\n url.searchParams.set(\"code_challenge_method\", \"S256\");\n url.searchParams.set(\"state\", state);\n\n return url.toString();\n }\n\n private generateCodeChallengeSync(verifier: string): string {\n const hash = createHash(\"sha256\").update(verifier).digest(\"base64\");\n return hash.split(\"=\")[0].replace(/\\+/g, \"-\").replace(/\\//g, \"_\");\n }\n\n private async exchangeCode(\n code: string,\n codeVerifier: string,\n state: string,\n redirectUri: string,\n ): Promise<ClaudeAuthToken> {\n const response = await this.fetchFn(TOKEN_URL, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n grant_type: \"authorization_code\",\n code,\n redirect_uri: redirectUri,\n client_id: CLIENT_ID,\n code_verifier: codeVerifier,\n state,\n }),\n });\n\n if (!response.ok) {\n const text = await response.text();\n throw new TokenExchangeError(\n `Token exchange failed: ${response.status} ${text}`,\n );\n }\n\n const data = (await response.json()) as TokenResponse;\n return this.mapTokenResponse(data);\n }\n\n private mapTokenResponse(data: TokenResponse): ClaudeAuthToken {\n return {\n accessToken: data.access_token,\n tokenType: data.token_type ?? \"bearer\",\n expiresIn: data.expires_in,\n obtainedAt: Date.now(),\n refreshToken: data.refresh_token,\n scopes: data.scope?.split(\" \") ?? [],\n };\n }\n}\n\n// ─── Internal Types ───────────────────────────────────────────\n\ninterface TokenResponse {\n access_token: string;\n token_type?: string;\n expires_in?: number;\n scope?: string;\n refresh_token: string;\n}\n\n// ─── Utility Functions ────────────────────────────────────────\n\nfunction defaultRandomBytes(size: number): Uint8Array {\n return new Uint8Array(nodeRandomBytes(size));\n}\n\nfunction base64Encode(bytes: Uint8Array): string {\n return Buffer.from(bytes).toString(\"base64\");\n}\n\nfunction hexEncode(bytes: Uint8Array): string {\n return Buffer.from(bytes).toString(\"hex\");\n}\n","/**\n * Automatic background token refresh manager.\n *\n * Schedules token refresh at a configurable threshold before expiry\n * (default 80% of token lifetime). Emits events on refresh, failure,\n * and token expiry. Handles retry on failure and clean disposal.\n *\n * When all retries are exhausted but the token hasn't expired yet,\n * the manager waits until the token's expiry time and then starts\n * a fresh retry cycle. This continues until refresh succeeds or\n * the token expires.\n *\n * @example Basic usage\n * ```ts\n * import { TokenRefreshManager } from \"@witqq/agent-sdk/auth\";\n *\n * const manager = new TokenRefreshManager({\n * token: claudeToken,\n * refresh: (rt) => claudeAuth.refreshToken(rt),\n * });\n * manager.on(\"refreshed\", (newToken) => { tokenStore.save(\"claude\", newToken); });\n * manager.on(\"error\", (err) => { console.error(\"Refresh failed:\", err); });\n * manager.start();\n * // ...later\n * manager.dispose();\n * ```\n *\n * @example Integration with createAuthHandler\n * ```ts\n * import { TokenRefreshManager } from \"@witqq/agent-sdk/auth\";\n * import { createAuthHandler } from \"@witqq/agent-sdk/chat/server\";\n * import type { ClaudeAuthToken } from \"@witqq/agent-sdk/auth\";\n *\n * let refreshManager: TokenRefreshManager | undefined;\n *\n * const authHandler = createAuthHandler({\n * tokenStore,\n * onAuth: (provider, token) => {\n * // Clean up previous manager\n * refreshManager?.dispose();\n * refreshManager = undefined;\n *\n * if (provider === \"claude\" && token.expiresIn) {\n * refreshManager = new TokenRefreshManager({\n * token,\n * refresh: (t) =>\n * claudeAuth.refreshToken((t as ClaudeAuthToken).refreshToken),\n * });\n * refreshManager.on(\"refreshed\", (newToken) => {\n * tokenStore.save(\"claude\", newToken);\n * });\n * refreshManager.on(\"expired\", () => {\n * console.warn(\"Claude token expired — re-authentication required\");\n * });\n * refreshManager.start();\n * }\n * },\n * });\n * ```\n */\n\nimport type { AuthToken } from \"./types.js\";\n\n// ─── Types ─────────────────────────────────────────────────────\n\n/** Events emitted by TokenRefreshManager */\nexport interface TokenRefreshEvents {\n /** Emitted when token was successfully refreshed */\n refreshed: (token: AuthToken) => void;\n /** Emitted when refresh attempt failed (may retry) */\n error: (error: Error, attempt: number) => void;\n /** Emitted when token expired and could not be refreshed */\n expired: () => void;\n /** Emitted when manager is disposed */\n disposed: () => void;\n}\n\n/** Configuration for TokenRefreshManager */\nexport interface TokenRefreshOptions {\n /** Current token with expiresIn and obtainedAt */\n token: AuthToken;\n /**\n * Function that performs the actual token refresh.\n * Receives the current token and returns a new one.\n */\n refresh: (token: AuthToken) => Promise<AuthToken>;\n /**\n * Fraction of token lifetime at which to trigger refresh (0-1).\n * Default: 0.8 (refresh at 80% of lifetime, i.e. with 20% remaining)\n */\n refreshThreshold?: number;\n /**\n * Maximum retry attempts on refresh failure. Default: 3\n */\n maxRetries?: number;\n /**\n * Base delay between retries in ms. Exponential backoff applied. Default: 1000\n */\n retryDelayMs?: number;\n /**\n * Minimum schedule delay in ms (prevents scheduling in the past). Default: 1000\n */\n minDelayMs?: number;\n}\n\ntype EventName = keyof TokenRefreshEvents;\ntype ListenerMap = { [K in EventName]: Set<TokenRefreshEvents[K]> };\n\n// ─── Manager ───────────────────────────────────────────────────\n\n/**\n * Background token refresh manager with event emission and retry logic.\n *\n * Lifecycle: `new` → `start()` → (auto-refreshes) → `stop()` or `dispose()`\n */\nexport class TokenRefreshManager {\n private currentToken: AuthToken;\n private readonly refreshFn: (token: AuthToken) => Promise<AuthToken>;\n private readonly threshold: number;\n private readonly maxRetries: number;\n private readonly retryDelayMs: number;\n private readonly minDelayMs: number;\n\n private timerId: ReturnType<typeof setTimeout> | null = null;\n private running = false;\n private disposed = false;\n\n private readonly listeners: ListenerMap = {\n refreshed: new Set(),\n error: new Set(),\n expired: new Set(),\n disposed: new Set(),\n };\n\n constructor(options: TokenRefreshOptions) {\n this.currentToken = { ...options.token };\n this.refreshFn = options.refresh;\n this.threshold = options.refreshThreshold ?? 0.8;\n this.maxRetries = options.maxRetries ?? 3;\n this.retryDelayMs = options.retryDelayMs ?? 1000;\n this.minDelayMs = options.minDelayMs ?? 1000;\n }\n\n /** Register an event listener */\n on<K extends EventName>(event: K, listener: TokenRefreshEvents[K]): this {\n // TypeScript can't narrow Set type from generic key — safe because ListenerMap enforces per-event types\n this.listeners[event].add(listener as never);\n return this;\n }\n\n /** Remove an event listener */\n off<K extends EventName>(event: K, listener: TokenRefreshEvents[K]): this {\n // TypeScript can't narrow Set type from generic key — safe because ListenerMap enforces per-event types\n this.listeners[event].delete(listener as never);\n return this;\n }\n\n /** Current token managed by this instance */\n get token(): AuthToken {\n return { ...this.currentToken };\n }\n\n /** Whether the manager is currently running */\n get isRunning(): boolean {\n return this.running;\n }\n\n /** Whether the manager has been disposed */\n get isDisposed(): boolean {\n return this.disposed;\n }\n\n /**\n * Start automatic refresh scheduling.\n * If the token is already expired, emits \"expired\" immediately.\n * If the token has no expiresIn, does nothing (long-lived token).\n */\n start(): void {\n if (this.disposed) return;\n if (this.running) return;\n this.running = true;\n this.schedule();\n }\n\n /** Stop automatic refresh (can be restarted with start()) */\n stop(): void {\n this.running = false;\n this.clearTimer();\n }\n\n /**\n * Update the managed token (e.g. after manual refresh).\n * Reschedules automatic refresh if running.\n */\n updateToken(token: AuthToken): void {\n if (this.disposed) return;\n this.currentToken = { ...token };\n if (this.running) {\n this.clearTimer();\n this.schedule();\n }\n }\n\n /** Stop and clean up all resources */\n dispose(): void {\n if (this.disposed) return;\n this.stop();\n this.disposed = true;\n this.emit(\"disposed\");\n // Clear all listeners\n for (const set of Object.values(this.listeners)) {\n (set as Set<unknown>).clear();\n }\n }\n\n // ─── Private ──────────────────────────────────────────────────\n\n private schedule(): void {\n if (!this.running || this.disposed) return;\n\n const delayMs = this.computeRefreshDelay();\n\n if (delayMs === null) {\n // No expiresIn → long-lived token, nothing to schedule\n return;\n }\n\n if (delayMs <= 0) {\n // Past refresh point (or expired) — attempt refresh via timer to keep async chain clean\n this.timerId = setTimeout(() => {\n this.timerId = null;\n if (!this.running || this.disposed) return;\n void this.performRefresh();\n }, 0);\n return;\n }\n\n this.timerId = setTimeout(() => {\n this.timerId = null;\n if (!this.running || this.disposed) return;\n void this.performRefresh();\n }, Math.max(delayMs, this.minDelayMs));\n }\n\n private async performRefresh(attempt = 1): Promise<void> {\n if (!this.running || this.disposed) return;\n\n try {\n const newToken = await this.refreshFn(this.currentToken);\n if (!this.running || this.disposed) return;\n this.currentToken = { ...newToken };\n this.emit(\"refreshed\", newToken);\n this.schedule();\n } catch (err) {\n if (!this.running || this.disposed) return;\n const error = err instanceof Error ? err : new Error(String(err));\n this.emit(\"error\", error, attempt);\n\n if (attempt < this.maxRetries) {\n const delay = this.retryDelayMs * Math.pow(2, attempt - 1);\n this.timerId = setTimeout(() => {\n this.timerId = null;\n if (!this.running || this.disposed) return;\n void this.performRefresh(attempt + 1);\n }, delay);\n } else {\n // All retries exhausted\n if (this.isTokenExpired()) {\n this.running = false;\n this.emit(\"expired\");\n } else {\n // Token not yet expired — wait until expiry time and start fresh retry cycle\n const expiresIn = this.currentToken.expiresIn;\n if (expiresIn == null) return; // invariant: unreachable from schedule() which checks expiresIn\n const expiresAt = this.currentToken.obtainedAt + expiresIn * 1000;\n const waitMs = Math.max(expiresAt - Date.now(), this.minDelayMs);\n this.timerId = setTimeout(() => {\n this.timerId = null;\n if (!this.running || this.disposed) return;\n void this.performRefresh();\n }, waitMs);\n }\n }\n }\n }\n\n private computeRefreshDelay(): number | null {\n if (this.currentToken.expiresIn == null) return null;\n\n const lifetimeMs = this.currentToken.expiresIn * 1000;\n const refreshAtMs = this.currentToken.obtainedAt + lifetimeMs * this.threshold;\n const now = Date.now();\n const delay = refreshAtMs - now;\n\n // Return raw delay — caller decides whether to clamp or treat as immediate\n return delay;\n }\n\n private isTokenExpired(): boolean {\n if (this.currentToken.expiresIn == null) return false;\n const expiresAt = this.currentToken.obtainedAt + this.currentToken.expiresIn * 1000;\n return Date.now() >= expiresAt;\n }\n\n private clearTimer(): void {\n if (this.timerId !== null) {\n clearTimeout(this.timerId);\n this.timerId = null;\n }\n }\n\n private emit<K extends EventName>(event: K, ...args: Parameters<TokenRefreshEvents[K]>): void {\n for (const listener of this.listeners[event]) {\n try {\n (listener as (...a: unknown[]) => void)(...args);\n } catch {\n // Listener errors should not crash the manager\n }\n }\n }\n}\n","// ─── Auth Types ────────────────────────────────────────────────\nexport type {\n AuthToken,\n CopilotAuthToken,\n ClaudeAuthToken,\n DeviceFlowResult,\n OAuthFlowOptions,\n OAuthFlowResult,\n} from \"./types.js\";\n\nexport {\n AuthError,\n DeviceCodeExpiredError,\n AccessDeniedError,\n TokenExchangeError,\n} from \"./types.js\";\n\n// ─── Auth Providers ────────────────────────────────────────────\nexport { CopilotAuth } from \"./copilot-auth.js\";\nexport { ClaudeAuth } from \"./claude-auth.js\";\n\n// ─── Token Refresh ─────────────────────────────────────────────\nexport { TokenRefreshManager } from \"./refresh-manager.js\";\nexport type { TokenRefreshOptions, TokenRefreshEvents } from \"./refresh-manager.js\";\n","import { createContext, createElement, useContext, type ReactNode } from \"react\";\nimport type { IChatRuntime } from \"../runtime.js\";\n\nconst ChatRuntimeContext = createContext<IChatRuntime | null>(null);\n\n/** Props for ChatProvider. */\nexport interface ChatProviderProps {\n /** The chat runtime instance to provide to descendants. */\n runtime: IChatRuntime;\n children: ReactNode;\n}\n\n/**\n * React context provider wrapping IChatRuntime.\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 IChatRuntime from context.\n * Must be used within a ChatProvider.\n *\n * @throws {Error} If used outside ChatProvider\n */\nexport function useChatRuntime(): IChatRuntime {\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/core\n *\n * Foundational chat types and utilities: ChatMessage, ChatSession, ChatEvent,\n * IChatProvider, type guards, and AgentEvent↔ChatEvent bridge functions.\n */\n\nimport type {\n AgentEvent,\n Message,\n ToolCall,\n ToolResult,\n ToolDefinition,\n UsageData,\n ModelInfo,\n JSONValue,\n} from \"../types.js\";\n\n// ─── Unique ID ─────────────────────────────────────────────────\n\n/** Branded type for unique identifiers */\nexport type ChatId = string & { readonly __brand: \"ChatId\" };\n\n/**\n * Generate a new unique ChatId (crypto.randomUUID-based)\n * @returns Branded ChatId string\n */\nexport function createChatId(): ChatId {\n return crypto.randomUUID() as ChatId;\n}\n\n/** UUID v4 pattern for ChatId validation */\nconst UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;\n\n/**\n * Cast a string to ChatId with UUID format validation.\n * Use this instead of manual `as ChatId` type assertions.\n *\n * @param value - String to validate and cast\n * @returns Branded ChatId\n * @throws {TypeError} If value is not a valid UUID v4 format\n *\n * @example\n * ```ts\n * const id = toChatId(\"550e8400-e29b-41d4-a716-446655440000\");\n * ```\n */\nexport function toChatId(value: string): ChatId {\n if (!UUID_RE.test(value)) {\n throw new TypeError(`Invalid ChatId: \"${value}\" is not a valid UUID`);\n }\n return value as ChatId;\n}\n\n/**\n * Accepts either a plain string or branded ChatId for API convenience.\n * Use this in public API signatures so consumers don't need `as ChatId` casts.\n */\nexport type ChatIdLike = string | ChatId;\n\n// ─── Status Types ──────────────────────────────────────────────\n\n/** Lifecycle status of a message part (text, reasoning, etc.) */\nexport type PartStatus = \"pending\" | \"streaming\" | \"complete\" | \"error\";\n/** Lifecycle status of a tool call within a message */\nexport type ToolCallStatus = \"pending\" | \"running\" | \"requires_approval\" | \"complete\" | \"error\" | \"denied\";\n/** Lifecycle status of an entire message */\nexport type MessageStatus = \"pending\" | \"streaming\" | \"complete\" | \"error\" | \"cancelled\";\n/** Lifecycle status of a chat session */\nexport type SessionStatus = \"active\" | \"archived\";\n/** Lifecycle status of the chat runtime */\nexport type RuntimeStatus = \"idle\" | \"streaming\" | \"error\" | \"disposed\";\n\n// ─── Message Parts (union) ─────────────────────────────────────\n\n/** Plain text content part */\nexport interface TextPart { type: \"text\"; text: string; status: PartStatus; }\n/** Model reasoning/thinking content part */\nexport interface ReasoningPart { type: \"reasoning\"; text: string; status: PartStatus; }\n/** Tool invocation part with call ID, arguments, optional result */\nexport interface ToolCallPart { type: \"tool_call\"; toolCallId: string; name: string; args: unknown; result?: unknown; status: ToolCallStatus; error?: string; }\n/** Source reference part (URL citation) */\nexport interface SourcePart { type: \"source\"; url: string; title?: string; status: PartStatus; }\n/** File attachment part (base64-encoded data) */\nexport interface FilePart { type: \"file\"; name: string; mimeType: string; data: string; status: PartStatus; }\n/** Union of all message part types */\nexport type MessagePart = TextPart | ReasoningPart | ToolCallPart | SourcePart | FilePart;\n\n// ─── Chat Message ──────────────────────────────────────────────\n\n/** Role of message author */\nexport type ChatRole = \"user\" | \"assistant\" | \"system\";\n\n/** Metadata attached to messages — useful preset for the TMetadata generic */\nexport interface ChatMessageMetadata {\n model?: string;\n backend?: string;\n usage?: UsageData;\n isSummary?: boolean;\n isArchived?: boolean;\n estimatedTokens?: number;\n custom?: Record<string, unknown>;\n}\n\n/** Message status */\nexport type ChatMessageStatus = MessageStatus;\n\n/** A single chat message — the fundamental unit of conversation */\nexport interface ChatMessage<TMetadata = unknown> {\n id: ChatId;\n role: ChatRole;\n parts: MessagePart[];\n metadata?: TMetadata;\n createdAt: string;\n updatedAt?: string;\n status: MessageStatus;\n}\n\n// ─── Convenience Getters ───────────────────────────────────────\n\n/**\n * Join all TextPart texts in a message\n * @param message - The chat message to extract text from\n * @returns Concatenated text content\n */\nexport function getMessageText(message: ChatMessage): string {\n return message.parts\n .filter((p): p is TextPart => p.type === \"text\")\n .map((p) => p.text)\n .join(\"\");\n}\n\n/**\n * Filter all ToolCallParts from a message\n * @param message - The chat message to extract tool calls from\n * @returns Array of ToolCallPart\n */\nexport function getMessageToolCalls(message: ChatMessage): ToolCallPart[] {\n return message.parts.filter((p): p is ToolCallPart => p.type === \"tool_call\");\n}\n\n/**\n * Join all ReasoningPart texts in a message\n * @param message - The chat message to extract reasoning from\n * @returns Concatenated reasoning content\n */\nexport function getMessageReasoning(message: ChatMessage): string {\n return message.parts\n .filter((p): p is ReasoningPart => p.type === \"reasoning\")\n .map((p) => p.text)\n .join(\"\");\n}\n\n// ─── Supporting Types ──────────────────────────────────────────\n\n/** Options for sending a message */\nexport interface SendOpts { sessionId?: string; model?: string; signal?: AbortSignal; metadata?: Record<string, unknown>; }\n/** Options for creating a new session */\nexport interface CreateSessionOpts { id?: string; title?: string; model?: string; metadata?: Record<string, unknown>; }\n/** Options for listing sessions with pagination */\nexport interface ListOpts { limit?: number; offset?: number; status?: SessionStatus; }\n/** Options for backend execution (model, tokens, tools) */\nexport interface BackendOpts { model: string; signal?: AbortSignal; systemPrompt?: string; temperature?: number; maxTokens?: number; tools?: Record<string, unknown>; providerOptions?: Record<string, unknown>; }\n/** Context passed to tool execute functions */\nexport interface ToolContext { sessionId: string; userId?: string; signal: AbortSignal; }\n/** Configuration for creating a chat runtime */\nexport interface ChatRuntimeConfig { backend: string; model?: string; apiKey?: string; baseUrl?: string; context?: { maxTokens?: number; reserveTokens?: number; strategy?: \"sliding\" | \"summarize\" | \"truncate\"; }; retry?: { maxRetries?: number; initialDelay?: number; backoffFactor?: number; }; providerOptions?: Record<string, unknown>; }\n\n// ─── Chat Session ──────────────────────────────────────────────\n\n/** Session configuration snapshot */\nexport interface ChatSessionConfig {\n model: string;\n backend: string;\n systemPrompt?: string;\n temperature?: number;\n maxTokens?: number;\n}\n\n/** Session metadata */\nexport interface ChatSessionMetadata<TCustom extends Record<string, unknown> = Record<string, unknown>> {\n messageCount: number;\n totalTokens: number;\n tags?: string[];\n custom?: TCustom;\n}\n\n/** Chat session — a conversation with ordered messages */\nexport interface ChatSession<TCustom extends Record<string, unknown> = Record<string, unknown>> {\n id: ChatId;\n title?: string;\n messages: ChatMessage[];\n config: ChatSessionConfig;\n metadata: ChatSessionMetadata<TCustom>;\n status: SessionStatus;\n createdAt: string;\n updatedAt: string;\n backendSessionId?: string;\n /** Subscribe to session changes (for React useSyncExternalStore) */\n subscribe?(callback: () => void): () => void;\n /** Get immutable snapshot of session state (for React useSyncExternalStore) */\n getSnapshot?(): ChatSession<TCustom>;\n /** Last message in the session */\n readonly lastMessage?: ChatMessage;\n}\n\n/** Lightweight session info for listing (without full message array) */\nexport interface SessionInfo {\n id: ChatId;\n title?: string;\n status: SessionStatus;\n messageCount: number;\n lastMessage?: ChatMessage;\n createdAt: string;\n updatedAt: string;\n}\n\n// ─── Chat Events ───────────────────────────────────────────────\n\n/** Events emitted during chat operation */\nexport type ChatEvent =\n | { type: \"message:start\"; messageId: ChatId; role: ChatRole }\n | { type: \"message:delta\"; messageId: ChatId; text: string }\n | { type: \"message:complete\"; messageId: ChatId; message: ChatMessage }\n | {\n type: \"tool:start\";\n messageId: ChatId;\n toolCallId: string;\n toolName: string;\n args: Record<string, unknown>;\n }\n | {\n type: \"tool:complete\";\n messageId: ChatId;\n toolCallId: string;\n toolName: string;\n result: unknown;\n isError?: boolean;\n }\n | { type: \"thinking:start\"; messageId: ChatId }\n | { type: \"thinking:delta\"; messageId: ChatId; text: string }\n | { type: \"thinking:end\"; messageId: ChatId }\n | {\n type: \"permission:request\";\n messageId: ChatId;\n toolName: string;\n toolArgs: Record<string, unknown>;\n }\n | {\n type: \"permission:response\";\n messageId: ChatId;\n toolName: string;\n allowed: boolean;\n }\n | {\n type: \"usage\";\n promptTokens: number;\n completionTokens: number;\n model?: string;\n }\n | { type: \"session:created\"; sessionId: ChatId }\n | { type: \"session:updated\"; sessionId: ChatId }\n | {\n type: \"error\";\n error: string;\n recoverable: boolean;\n messageId?: ChatId;\n }\n | { type: \"typing:start\" }\n | { type: \"typing:end\" }\n | { type: \"heartbeat\" }\n | { type: \"done\"; finalOutput?: string };\n\n/** All possible ChatEvent type strings */\nexport type ChatEventType = ChatEvent[\"type\"];\n\n// ─── Chat Middleware ───────────────────────────────────────────\n\n/** Context passed to ChatMiddleware hooks */\nexport interface ChatMiddlewareContext {\n sessionId: ChatId;\n signal: AbortSignal;\n}\n\n/** Runtime-level middleware for the send/receive lifecycle.\n * Different from EventMiddleware which operates at the event bus level. */\nexport interface ChatMiddleware {\n /** Transform message before sending to backend */\n onBeforeSend?(message: ChatMessage, context: ChatMiddlewareContext): ChatMessage | Promise<ChatMessage>;\n /** Transform/intercept stream events */\n onEvent?(event: ChatEvent, context: ChatMiddlewareContext): ChatEvent | null | Promise<ChatEvent | null>;\n /** Transform completed message after receiving from backend */\n onAfterReceive?(message: ChatMessage, context: ChatMiddlewareContext): ChatMessage | Promise<ChatMessage>;\n /** Intercept errors — return null to suppress, return error to propagate */\n onError?(error: Error, context: ChatMiddlewareContext): Error | null | Promise<Error | null>;\n}\n\n// ─── Chat Provider Abstraction ─────────────────────────────────\n\n/** Options for sending a message to a provider */\nexport interface SendMessageOptions {\n signal?: AbortSignal;\n model?: string;\n context?: Record<string, unknown>;\n /** Additional tools to include in this request */\n tools?: ToolDefinition[];\n}\n\n/** Abstract chat provider — wraps an IAgentService for chat use */\nexport interface IChatProvider {\n readonly name: string;\n sendMessage(\n session: ChatSession,\n message: string,\n options?: SendMessageOptions,\n ): Promise<ChatMessage>;\n streamMessage(\n session: ChatSession,\n message: string,\n options?: SendMessageOptions,\n ): AsyncIterable<ChatEvent>;\n listModels(): Promise<ModelInfo[]>;\n validate(): Promise<{ valid: boolean; errors: string[] }>;\n dispose(): Promise<void>;\n}\n\n// ─── Type Guards ───────────────────────────────────────────────\n\n/**\n * Check if a value is a ChatMessage\n * @param value - Value to check\n * @returns True if value has ChatMessage shape\n */\nexport function isChatMessage(value: unknown): value is ChatMessage {\n if (typeof value !== \"object\" || value === null) return false;\n const obj = value as Record<string, unknown>;\n return (\n typeof obj.id === \"string\" &&\n typeof obj.role === \"string\" &&\n (obj.role === \"user\" ||\n obj.role === \"assistant\" ||\n obj.role === \"system\") &&\n Array.isArray(obj.parts) &&\n typeof obj.createdAt === \"string\" &&\n typeof obj.status === \"string\"\n );\n}\n\n/**\n * Check if a value is a ChatSession\n * @param value - Value to check\n * @returns True if value has ChatSession shape\n */\nexport function isChatSession(value: unknown): value is ChatSession {\n if (typeof value !== \"object\" || value === null) return false;\n const obj = value as Record<string, unknown>;\n return (\n typeof obj.id === \"string\" &&\n Array.isArray(obj.messages) &&\n typeof obj.config === \"object\" &&\n obj.config !== null &&\n typeof obj.createdAt === \"string\" &&\n typeof obj.updatedAt === \"string\" &&\n typeof obj.status === \"string\"\n );\n}\n\n/**\n * Check if a value is a MessagePart\n * @param value - Value to check\n * @returns True if value has MessagePart shape\n */\nexport function isMessagePart(value: unknown): value is MessagePart {\n if (typeof value !== \"object\" || value === null) return false;\n const obj = value as Record<string, unknown>;\n return (\n typeof obj.type === \"string\" &&\n (obj.type === \"text\" ||\n obj.type === \"reasoning\" ||\n obj.type === \"tool_call\" ||\n obj.type === \"source\" ||\n obj.type === \"file\")\n );\n}\n\n/**\n * Check if a value is a TextPart\n * @param value - Value to check\n * @returns True if value is a TextPart\n */\nexport function isTextPart(value: unknown): value is TextPart {\n if (typeof value !== \"object\" || value === null) return false;\n const obj = value as Record<string, unknown>;\n return obj.type === \"text\" && typeof obj.text === \"string\";\n}\n\n/**\n * Check if a value is a ToolCallPart\n * @param value - Value to check\n * @returns True if value is a ToolCallPart\n */\nexport function isToolCallPart(value: unknown): value is ToolCallPart {\n if (typeof value !== \"object\" || value === null) return false;\n const obj = value as Record<string, unknown>;\n return obj.type === \"tool_call\" && typeof obj.toolCallId === \"string\" && typeof obj.name === \"string\";\n}\n\n/**\n * Check if a value is a ReasoningPart\n * @param value - Value to check\n * @returns True if value is a ReasoningPart\n */\nexport function isReasoningPart(value: unknown): value is ReasoningPart {\n if (typeof value !== \"object\" || value === null) return false;\n const obj = value as Record<string, unknown>;\n return obj.type === \"reasoning\" && typeof obj.text === \"string\";\n}\n\n/**\n * Check if a value is a SourcePart\n * @param value - Value to check\n * @returns True if value is a SourcePart\n */\nexport function isSourcePart(value: unknown): value is SourcePart {\n if (typeof value !== \"object\" || value === null) return false;\n const obj = value as Record<string, unknown>;\n return obj.type === \"source\" && typeof obj.url === \"string\";\n}\n\n/**\n * Check if a value is a FilePart\n * @param value - Value to check\n * @returns True if value is a FilePart\n */\nexport function isFilePart(value: unknown): value is FilePart {\n if (typeof value !== \"object\" || value === null) return false;\n const obj = value as Record<string, unknown>;\n return obj.type === \"file\" && typeof obj.name === \"string\" && typeof obj.mimeType === \"string\";\n}\n\n/**\n * Check if a value is a ChatEvent\n * @param value - Value to check\n * @returns True if value has a valid ChatEvent type\n */\nexport function isChatEvent(value: unknown): value is ChatEvent {\n if (typeof value !== \"object\" || value === null) return false;\n const obj = value as Record<string, unknown>;\n const validTypes: ChatEventType[] = [\n \"message:start\",\n \"message:delta\",\n \"message:complete\",\n \"tool:start\",\n \"tool:complete\",\n \"thinking:start\",\n \"thinking:delta\",\n \"thinking:end\",\n \"permission:request\",\n \"permission:response\",\n \"usage\",\n \"session:created\",\n \"session:updated\",\n \"error\",\n \"typing:start\",\n \"typing:end\",\n \"heartbeat\",\n \"done\",\n ];\n return validTypes.includes(obj.type as ChatEventType);\n}\n\n// ─── Agent Event Adapter ───────────────────────────────────────\n\n/**\n * Map a single AgentEvent to a ChatEvent (or null if no mapping)\n * @param event - The AgentEvent to convert\n * @param messageId - ChatId to associate with the event\n * @returns Corresponding ChatEvent or null if unmappable\n */\nexport function agentEventToChatEvent(\n event: AgentEvent,\n messageId: ChatId,\n): ChatEvent | null {\n switch (event.type) {\n case \"text_delta\":\n return { type: \"message:delta\", messageId, text: event.text };\n case \"thinking_start\":\n return { type: \"thinking:start\", messageId };\n case \"thinking_delta\":\n return { type: \"thinking:delta\", messageId, text: event.text };\n case \"thinking_end\":\n return { type: \"thinking:end\", messageId };\n case \"tool_call_start\":\n return {\n type: \"tool:start\",\n messageId,\n toolCallId: event.toolCallId,\n toolName: event.toolName,\n args: event.args as Record<string, unknown>,\n };\n case \"tool_call_end\":\n return {\n type: \"tool:complete\",\n messageId,\n toolCallId: event.toolCallId,\n toolName: event.toolName,\n result: event.result,\n };\n case \"permission_request\":\n return {\n type: \"permission:request\",\n messageId,\n toolName: event.request.toolName,\n toolArgs: event.request.toolArgs,\n };\n case \"permission_response\":\n return {\n type: \"permission:response\",\n messageId,\n toolName: event.toolName,\n allowed: event.decision.allowed,\n };\n case \"usage_update\":\n return {\n type: \"usage\",\n promptTokens: event.promptTokens,\n completionTokens: event.completionTokens,\n model: event.model,\n };\n case \"error\":\n return {\n type: \"error\",\n error: event.error,\n recoverable: event.recoverable,\n messageId,\n };\n case \"heartbeat\":\n return { type: \"heartbeat\" };\n case \"ask_user\":\n case \"ask_user_response\":\n case \"session_info\":\n case \"done\":\n return null;\n default:\n return null;\n }\n}\n\n/**\n * Convert AgentEvent async iterable to ChatEvent async iterable\n * @param events - Source agent events\n * @param messageId - ChatId to associate with converted events\n * @returns Async iterable of ChatEvent (nulls filtered out)\n */\nexport async function* adaptAgentEvents(\n events: AsyncIterable<AgentEvent>,\n messageId: ChatId,\n): AsyncIterable<ChatEvent> {\n for await (const event of events) {\n const chatEvent = agentEventToChatEvent(event, messageId);\n if (chatEvent !== null) {\n yield chatEvent;\n }\n }\n}\n\n/**\n * Map a ChatEvent back to an AgentEvent for accumulator consumption.\n * Returns null for events that don't map to accumulator-relevant AgentEvents\n * (e.g. message:start, message:complete, usage, permission:*, heartbeat).\n *\n * @param event - The ChatEvent to convert\n * @returns Corresponding AgentEvent or null if not accumulator-relevant\n */\nexport function chatEventToAgentEvent(event: ChatEvent): AgentEvent | null {\n switch (event.type) {\n case \"message:delta\":\n return { type: \"text_delta\", text: event.text };\n case \"thinking:start\":\n return { type: \"thinking_start\" };\n case \"thinking:delta\":\n return { type: \"thinking_delta\", text: event.text };\n case \"thinking:end\":\n return { type: \"thinking_end\" };\n case \"tool:start\":\n return {\n type: \"tool_call_start\",\n toolCallId: event.toolCallId,\n toolName: event.toolName,\n args: event.args as JSONValue,\n };\n case \"tool:complete\":\n return {\n type: \"tool_call_end\",\n toolCallId: event.toolCallId,\n toolName: event.toolName,\n result: event.result as JSONValue,\n };\n case \"error\":\n return { type: \"error\", error: event.error, recoverable: event.recoverable };\n default:\n return null;\n }\n}\n\n// ─── Message Conversion ────────────────────────────────────────\n\n/**\n * Convert a ChatMessage to agent-sdk Message format\n * @param message - The ChatMessage to convert\n * @returns agent-sdk Message\n */\nexport function toAgentMessage(message: ChatMessage): Message {\n const textContent = getMessageText(message);\n const toolCallParts = getMessageToolCalls(message);\n\n switch (message.role) {\n case \"user\":\n return { role: \"user\", content: textContent };\n case \"assistant\": {\n const toolCalls: ToolCall[] | undefined = toolCallParts.length > 0\n ? toolCallParts.map((p) => ({ id: p.toolCallId, name: p.name, args: p.args as JSONValue }))\n : undefined;\n return {\n role: \"assistant\",\n content: textContent,\n toolCalls,\n };\n }\n case \"system\":\n return { role: \"system\", content: textContent };\n }\n}\n\n/**\n * Convert an agent-sdk Message to ChatMessage\n * @param message - The agent-sdk Message to convert\n * @param id - Optional ChatId (auto-generated if omitted)\n * @returns ChatMessage with status \"complete\"\n */\nexport function fromAgentMessage(message: Message, id?: ChatId): ChatMessage {\n const chatId = id ?? createChatId();\n const now = new Date().toISOString();\n\n const parts: MessagePart[] = [];\n\n // Build text content\n const textContent =\n typeof message.content === \"string\"\n ? message.content\n : Array.isArray(message.content)\n ? message.content\n .filter((part) => part.type === \"text\")\n .map((part) => part.text)\n .join(\"\\n\")\n : (message.content ?? \"\");\n\n if (textContent) {\n parts.push({ type: \"text\", text: textContent, status: \"complete\" });\n }\n\n // Add tool calls from assistant messages\n if (message.role === \"assistant\" && message.toolCalls) {\n for (const tc of message.toolCalls) {\n parts.push({\n type: \"tool_call\",\n toolCallId: tc.id,\n name: tc.name,\n args: tc.args,\n status: \"complete\",\n });\n }\n }\n\n // Add tool results — map 'tool' role to 'assistant'\n if (message.role === \"tool\" && message.toolResults) {\n for (const tr of message.toolResults) {\n parts.push({\n type: \"tool_call\",\n toolCallId: tr.toolCallId,\n name: tr.name,\n args: {},\n result: tr.result,\n status: \"complete\",\n });\n }\n }\n\n // Ensure at least an empty text part for empty messages\n if (parts.length === 0) {\n parts.push({ type: \"text\", text: \"\", status: \"complete\" });\n }\n\n const role: ChatRole = message.role === \"tool\" ? \"assistant\" : message.role;\n\n return {\n id: chatId,\n role,\n parts,\n createdAt: now,\n status: \"complete\",\n };\n}\n\n/**\n * Extract ToolResults from ToolCallParts that have results\n * @param message - The ChatMessage to extract results from\n * @returns Array of ToolResult for completed tool calls\n */\nexport function extractToolResults(message: ChatMessage): ToolResult[] {\n return getMessageToolCalls(message)\n .filter((p) => p.result !== undefined)\n .map((p) => ({\n toolCallId: p.toolCallId,\n name: p.name,\n result: p.result as JSONValue,\n isError: p.status === \"error\" ? true : undefined,\n }));\n}\n","/**\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}\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 /** Create a new session, resetting messages. */\n newSession: () => Promise<string>;\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 generatingRef = useRef(false);\n\n const onErrorRef = useRef(options.onError);\n onErrorRef.current = options.onError;\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 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 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 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 newSession = useCallback(async () => {\n const session = await runtime.createSession({\n config: { model: \"\", backend: \"\" },\n });\n setSessionId(session.id);\n setMessages([]);\n setError(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 newSession,\n };\n}\n","import { useCallback, useEffect, useRef, useSyncExternalStore } from \"react\";\nimport type { ChatMessage, ChatSession } 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, use it\n if (session.subscribe && session.getSnapshot) {\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 { IChatRuntime } 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, archive, and message send completion.\n */\nexport function useSessions(): UseSessionsReturn {\n const runtime: IChatRuntime = 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\";\nimport type {\n ChatMessage,\n MessagePart,\n TextPart,\n ReasoningPart,\n ToolCallPart,\n SourcePart,\n FilePart,\n} from \"../core.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(\"span\", { key: index, \"data-part\": \"text\" }, part.text);\n}\n\nfunction defaultRenderReasoning(part: ReasoningPart, index: number): ReactNode {\n return createElement(\"span\", { key: index, \"data-part\": \"reasoning\" }, part.text);\n}\n\nfunction defaultRenderToolCall(part: ToolCallPart, index: number): ReactNode {\n return createElement(\"span\", { key: index, \"data-part\": \"tool_call\", \"data-tool-name\": part.name }, part.name);\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 { 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, args, result, and approval buttons when needed.\n */\nexport function ToolCallView({ part, onApprove, onDeny, renderArgs, renderResult }: ToolCallViewProps): ReactNode {\n const children: ReactNode[] = [\n createElement(\"span\", { key: \"name\", \"data-tool-label\": \"name\" }, part.name),\n createElement(\"span\", { key: \"status\", \"data-tool-label\": \"status\" }, part.status),\n ];\n\n if (part.args !== undefined) {\n children.push(\n renderArgs\n ? renderArgs(part.args)\n : createElement(\"pre\", { key: \"args\", \"data-tool-label\": \"args\" }, JSON.stringify(part.args, null, 2)),\n );\n }\n\n if (part.result !== undefined) {\n children.push(\n renderResult\n ? renderResult(part.result)\n : createElement(\"pre\", { key: \"result\", \"data-tool-label\": \"result\" }, JSON.stringify(part.result, null, 2)),\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(\"button\", { key: \"approve\", onClick: onApprove, \"data-action\": \"approve\" }, \"Approve\"),\n createElement(\"button\", { key: \"deny\", onClick: onDeny, \"data-action\": \"deny\" }, \"Deny\"),\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 { 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 { 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 {\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 */\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\n const handleScroll = useCallback(() => {\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 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[] = messages.map((msg, 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 return createElement(\n \"div\",\n { key: msg.id, \"data-thread-message\": \"true\", \"data-role\": msg.role },\n content,\n );\n });\n\n // Sentinel element for auto-scroll anchoring\n children.push(createElement(\"div\", { key: \"__sentinel\", ref: sentinelRef }));\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(\"textarea\", {\n key: \"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 ];\n\n if (isGenerating) {\n children.push(\n createElement(\n \"button\",\n {\n key: \"stop\",\n \"data-action\": \"stop\",\n onClick: onStop,\n type: \"button\",\n },\n \"Stop\",\n ),\n );\n } else {\n children.push(\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/** 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 // Search input\n children.push(\n createElement(\"input\", {\n key: \"search\",\n \"data-thread-list-search\": \"true\",\n value: searchQuery ?? \"\",\n onChange: handleSearchChange,\n placeholder: \"Search sessions...\",\n }),\n );\n\n // Create button\n children.push(\n createElement(\n \"button\",\n {\n key: \"create\",\n \"data-action\": \"create-session\",\n onClick: onCreate,\n type: \"button\",\n },\n \"New\",\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\" }, session.title ?? \"Untitled\"),\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 \"Delete\",\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 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 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 response = await fetch(url, {\n headers: {\n Accept: \"text/event-stream\",\n ...optionsRef.current.headers,\n },\n signal: controller.signal,\n });\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}\n\n/** @deprecated Use ModelOption instead — renamed to avoid collision with core ModelInfo */\nexport type ModelInfo = ModelOption;\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 }));\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}\n\n/**\n * Dropdown model selector with search and keyboard navigation.\n */\nexport function ModelSelector({\n models,\n selectedModel,\n onSelect,\n placeholder = \"Select model\",\n className,\n}: ModelSelectorProps): 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 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 // Reset highlight when filter changes\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 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 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 (isSelected) {\n attrs[\"data-model-selected\"] = \"true\";\n }\n if (isHighlighted) {\n attrs[\"data-model-highlighted\"] = \"true\";\n }\n dropdownChildren.push(createElement(\"div\", attrs, model.name));\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","import { useState, useCallback, useRef } from \"react\";\nimport type { AuthToken, DeviceFlowResult, OAuthFlowResult } from \"../../auth/index.js\";\n\n// Lazy-load auth classes to avoid bundling node:crypto into browser builds.\n// Exported as mutable refs for testability (vi.mock on dynamic imports is unreliable in threads).\nexport const _authLoaders = {\n async loadCopilotAuth() {\n const { CopilotAuth } = await import(\"../../auth/index.js\");\n return CopilotAuth;\n },\n async loadClaudeAuth() {\n const { ClaudeAuth } = await import(\"../../auth/index.js\");\n return ClaudeAuth;\n },\n};\n\n/** Supported auth backends. */\nexport type AuthBackend = \"copilot\" | \"claude\" | \"api-key\";\n\n/** Auth status state machine: idle → pending → authenticated | error. */\nexport type AuthStatus = \"idle\" | \"pending\" | \"authenticated\" | \"error\";\n\n/** Options for the useAuth hook. */\nexport interface UseAuthOptions {\n backend: AuthBackend;\n onAuthenticated?: (token: AuthToken) => void;\n}\n\n/** Return value from useAuth. */\nexport interface UseAuthReturn {\n status: AuthStatus;\n error: Error | null;\n // Copilot Device Flow\n startDeviceFlow: () => Promise<void>;\n deviceCode: string | null;\n verificationUrl: string | null;\n // Claude OAuth\n startOAuthFlow: () => Promise<void>;\n authorizeUrl: string | null;\n completeOAuth: (codeOrUrl: string) => Promise<void>;\n // API key\n submitApiKey: (key: string) => void;\n // Common\n token: AuthToken | null;\n reset: () => void;\n}\n\n/**\n * Hook for multi-backend authentication.\n *\n * Wraps CopilotAuth (Device Flow), ClaudeAuth (OAuth+PKCE),\n * and plain API key validation into a unified React state machine.\n *\n * @deprecated Use `useRemoteAuth` instead for browser contexts.\n * `useAuth` directly instantiates auth classes which require `node:crypto`\n * (via ClaudeAuth). The `useRemoteAuth` hook delegates authentication to\n * server endpoints (createAuthHandler), avoiding browser crypto dependencies.\n *\n * Migration: replace `useAuth({ backend })` with\n * `useRemoteAuth({ backend, baseUrl: \"/api/auth\" })`.\n * Note: the `\"api-key\"` backend is renamed to `\"vercel-ai\"` in useRemoteAuth,\n * and `submitApiKey` is now async (returns Promise<void>).\n * The return interface is otherwise compatible — `startDeviceFlow`, `startOAuthFlow`,\n * `completeOAuth`, `submitApiKey`, `token`, `status`, `error`, `reset`\n * all work the same way.\n */\nexport function useAuth(options: UseAuthOptions): UseAuthReturn {\n const { backend, onAuthenticated } = options;\n const [status, setStatus] = useState<AuthStatus>(\"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 const [authorizeUrl, setAuthorizeUrl] = useState<string | null>(null);\n\n const onAuthenticatedRef = useRef(onAuthenticated);\n onAuthenticatedRef.current = onAuthenticated;\n\n // Store completeAuth callback from Claude OAuth flow\n const completeAuthRef = useRef<OAuthFlowResult[\"completeAuth\"] | null>(null);\n\n const startDeviceFlow = useCallback(async () => {\n if (backend !== \"copilot\") return;\n setStatus(\"pending\");\n setError(null);\n try {\n const CopilotAuth = await _authLoaders.loadCopilotAuth();\n const auth = new CopilotAuth();\n const result: DeviceFlowResult = await auth.startDeviceFlow();\n setDeviceCode(result.userCode);\n setVerificationUrl(result.verificationUrl);\n const authToken = await result.waitForToken();\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 }, [backend]);\n\n const startOAuthFlow = useCallback(async () => {\n if (backend !== \"claude\") return;\n setStatus(\"pending\");\n setError(null);\n try {\n const ClaudeAuth = await _authLoaders.loadClaudeAuth();\n const auth = new ClaudeAuth();\n const result: OAuthFlowResult = auth.startOAuthFlow();\n setAuthorizeUrl(result.authorizeUrl);\n completeAuthRef.current = result.completeAuth;\n } catch (err) {\n setError(err instanceof Error ? err : new Error(String(err)));\n setStatus(\"error\");\n }\n }, [backend]);\n\n const completeOAuth = useCallback(async (codeOrUrl: string) => {\n if (!completeAuthRef.current) return;\n try {\n const authToken = await completeAuthRef.current(codeOrUrl);\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\n const submitApiKey = useCallback((key: string) => {\n if (backend !== \"api-key\") return;\n if (!key || !key.trim()) {\n setError(new Error(\"API key cannot be empty\"));\n setStatus(\"error\");\n return;\n }\n const authToken: AuthToken = {\n accessToken: key.trim(),\n tokenType: \"bearer\",\n obtainedAt: Date.now(),\n };\n setToken(authToken);\n setStatus(\"authenticated\");\n onAuthenticatedRef.current?.(authToken);\n }, [backend]);\n\n const reset = useCallback(() => {\n setStatus(\"idle\");\n setError(null);\n setToken(null);\n setDeviceCode(null);\n setVerificationUrl(null);\n setAuthorizeUrl(null);\n completeAuthRef.current = null;\n }, []);\n\n return {\n status,\n error,\n startDeviceFlow,\n deviceCode,\n verificationUrl,\n startOAuthFlow,\n authorizeUrl,\n completeOAuth,\n submitApiKey,\n token,\n reset,\n };\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\";\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 const [status, setStatus] = useState<RemoteAuthStatus>(\"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 const [authorizeUrl, setAuthorizeUrl] = useState<string | null>(null);\n const [savedProviders, setSavedProviders] = useState<string[]>([]);\n\n const onAuthenticatedRef = useRef(onAuthenticated);\n onAuthenticatedRef.current = onAuthenticated;\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 const startDeviceFlow = useCallback(async () => {\n if (backend !== \"copilot\") return;\n setStatus(\"pending\");\n setError(null);\n try {\n // Start the flow on server\n const result = await post(\"/auth/start\", { provider: \"copilot\" });\n setDeviceCode(result.userCode);\n setVerificationUrl(result.verificationUrl);\n // Poll for completion (server blocks until device flow completes)\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 setError(err instanceof Error ? err : new Error(String(err)));\n setStatus(\"error\");\n }\n }, [backend, post]);\n\n const startOAuthFlow = useCallback(async () => {\n if (backend !== \"claude\") return;\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 setError(err instanceof Error ? err : new Error(String(err)));\n setStatus(\"error\");\n }\n }, [backend, post]);\n\n const completeOAuth = useCallback(\n 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 setError(err instanceof Error ? err : new Error(String(err)));\n setStatus(\"error\");\n }\n },\n [post],\n );\n\n const submitApiKey = useCallback(\n async (key: string, apiBaseUrl?: string) => {\n if (backend !== \"vercel-ai\") return;\n if (!key || !key.trim()) {\n setError(new Error(\"API key cannot be empty\"));\n setStatus(\"error\");\n return;\n }\n try {\n await post(\"/auth/vercel/complete\", {\n apiKey: key.trim(),\n ...(apiBaseUrl ? { baseUrl: apiBaseUrl } : {}),\n });\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 [backend, post],\n );\n\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 setDeviceCode(null);\n setVerificationUrl(null);\n setAuthorizeUrl(null);\n setSavedProviders([]);\n }, []);\n\n const start = useCallback(async (provider?: RemoteAuthBackend) => {\n const target = provider ?? backend;\n setStatus(\"pending\");\n setError(null);\n try {\n switch (target) {\n case \"copilot\": {\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 break;\n }\n case \"claude\": {\n const result = await post(\"/auth/start\", { provider: \"claude\" });\n setAuthorizeUrl(result.authorizeUrl);\n // OAuth is two-step: start sets authorizeUrl, user must call completeOAuth after redirect\n break;\n }\n case \"vercel-ai\":\n throw new Error(\"vercel-ai requires submitApiKey(key, baseUrl) — cannot auto-start\");\n default:\n throw new Error(`Unknown auth provider: ${target as string}`);\n }\n } catch (err) {\n setError(err instanceof Error ? err : new Error(String(err)));\n setStatus(\"error\");\n }\n }, [backend, post]);\n\n return {\n status,\n error,\n startDeviceFlow,\n deviceCode,\n verificationUrl,\n startOAuthFlow,\n authorizeUrl,\n completeOAuth,\n submitApiKey,\n start,\n token,\n reset,\n savedProviders,\n loadSavedTokens,\n useSavedToken,\n clearTokens,\n };\n}\n","/**\n * Client-side runtime adapter that implements IChatRuntime 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 { RemoteChatRuntime } from \"@witqq/agent-sdk/chat/react\";\n * import { ChatProvider } from \"@witqq/agent-sdk/chat/react\";\n *\n * const runtime = new RemoteChatRuntime({ baseUrl: \"/api\" });\n * <ChatProvider runtime={runtime}> ... </ChatProvider>\n * ```\n */\n\nimport type { ChatEvent, ChatSession, ChatId, ChatIdLike, RuntimeStatus, ChatMiddleware, SendMessageOptions } from \"../core.js\";\nimport type { IChatRuntime } from \"../runtime.js\";\nimport type { ToolDefinition, ModelInfo } from \"../../types.js\";\nimport type { CreateSessionOptions, SessionListOptions } from \"../sessions.js\";\nimport type { ContextStats } from \"../context.js\";\n\n// ─── Server Endpoint Contract ──────────────────────────────────\n\n/**\n * Standard server endpoint contract.\n * Server implementations expose these routes to work with RemoteChatRuntime.\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 * POST {baseUrl}/sessions/{id}/archive — Archive session\n * POST {baseUrl}/send — Send message (SSE stream response)\n * POST {baseUrl}/abort — Abort current stream\n * GET {baseUrl}/models — List models\n * POST {baseUrl}/backend/switch — Switch backend\n * POST {baseUrl}/model/switch — Switch model\n */\nexport interface RemoteChatRuntimeOptions {\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// ─── RemoteChatRuntime ─────────────────────────────────────────\n\nexport class RemoteChatRuntime implements IChatRuntime {\n private _status: RuntimeStatus = \"idle\";\n private _activeSessionId: ChatId | null = null;\n private _currentBackend = \"default\";\n private _currentModel: string | undefined;\n private _abortController: AbortController | null = null;\n private readonly _tools = new Map<string, ToolDefinition>();\n private readonly _middlewares: ChatMiddleware[] = [];\n\n private readonly baseUrl: string;\n private readonly headers: Record<string, string>;\n private readonly _fetch: typeof globalThis.fetch;\n\n constructor(options: RemoteChatRuntimeOptions) {\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 // ─── 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 async archiveSession(id: ChatIdLike): Promise<void> {\n this.assertNotDisposed();\n await this._post(`/sessions/${id}/archive`, {});\n this._notifySessionChange();\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 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 }),\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 // ─── Backend / Model ────────────────────────────────────────\n\n get currentBackend(): string {\n return this._currentBackend;\n }\n\n get currentModel(): string | undefined {\n return this._currentModel;\n }\n\n async switchBackend(name: string): Promise<void> {\n this.assertNotDisposed();\n await this._post(\"/backend/switch\", { backend: name });\n this._currentBackend = name;\n }\n\n switchModel(model: string): void {\n this._currentModel = model;\n // Fire-and-forget to sync server\n this._post(\"/model/switch\", { model }).catch(() => {});\n }\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 // ─── Tools (client-side registry) ───────────────────────────\n\n get registeredTools(): ReadonlyMap<string, ToolDefinition> {\n return this._tools;\n }\n\n registerTool(tool: ToolDefinition): void {\n this._tools.set(tool.name, tool);\n }\n\n removeTool(name: string): void {\n this._tools.delete(name);\n }\n\n // ─── Middleware (client-side) ───────────────────────────────\n\n use(middleware: ChatMiddleware): void {\n this._middlewares.push(middleware);\n }\n\n removeMiddleware(middleware: ChatMiddleware): void {\n const idx = this._middlewares.indexOf(middleware);\n if (idx !== -1) this._middlewares.splice(idx, 1);\n }\n\n // ─── Context ────────────────────────────────────────────────\n\n getContextStats(_sessionId: ChatIdLike): ContextStats | null {\n // Context management is server-side; client doesn't track this\n return null;\n }\n\n private readonly _sessionListeners = new Set<() => void>();\n\n onSessionChange(callback: () => void): () => void {\n this._sessionListeners.add(callback);\n return () => { this._sessionListeners.delete(callback); };\n }\n\n private _notifySessionChange(): void {\n for (const cb of this._sessionListeners) {\n try { cb(); } catch { /* ignore */ }\n }\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 // ─── 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 RemoteChatRuntime and initial session.\n * Exposes readiness phase, the runtime instance, and the auth sub-hook.\n */\n\nimport { useState, useCallback, useEffect, useRef } from \"react\";\nimport type { IChatRuntime } from \"../runtime.js\";\nimport { RemoteChatRuntime } from \"./RemoteChatRuntime.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 /** Auto-restore saved tokens on mount (default: true). */\n autoRestore?: boolean;\n}\n\n/** Return value from useRemoteChat. */\nexport interface UseRemoteChatReturn {\n /** Current lifecycle phase. */\n phase: RemoteChatPhase;\n /** Chat runtime (null until phase = \"ready\"). */\n runtime: IChatRuntime | 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 autoRestore = true,\n } = options;\n const fetchFn = options.fetch ?? globalThis.fetch.bind(globalThis);\n\n const [phase, setPhase] = useState<RemoteChatPhase>(\"initializing\");\n const [runtime, setRuntime] = useState<IChatRuntime | 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 // Auto-restore saved tokens on mount\n const restoredRef = useRef(false);\n const [tokensLoaded, setTokensLoaded] = useState(false);\n useEffect(() => {\n if (!autoRestore || 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 }, [autoRestore]);\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 RemoteChatRuntime({\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 {\n createElement,\n useState,\n useCallback,\n type ReactNode,\n} from \"react\";\nimport { useAuth } from \"./useAuth.js\";\nimport type { AuthBackend, AuthStatus } from \"./useAuth.js\";\nimport type { AuthToken } from \"../../auth/index.js\";\n\n/** Props for the AuthDialog component. */\nexport interface AuthDialogProps {\n backends: AuthBackend[];\n selectedBackend?: AuthBackend;\n onBackendChange?: (backend: AuthBackend) => void;\n onAuthenticated?: (token: AuthToken) => void;\n renderCopilotFlow?: (state: {\n deviceCode: string;\n verificationUrl: string;\n status: AuthStatus;\n }) => ReactNode;\n renderClaudeFlow?: (state: {\n authorizeUrl: string | null;\n status: AuthStatus;\n completeOAuth: (code: string) => Promise<void>;\n }) => ReactNode;\n renderApiKeyFlow?: (state: {\n submitApiKey: (key: string) => void;\n status: AuthStatus;\n }) => ReactNode;\n className?: string;\n}\n\n/**\n * Multi-backend auth dialog component.\n *\n * Headless component that renders backend selector buttons and\n * per-backend auth flows. Uses data attributes for styling hooks.\n * Supports custom render props for each flow type.\n */\nexport function AuthDialog({\n backends,\n selectedBackend: controlledBackend,\n onBackendChange,\n onAuthenticated,\n renderCopilotFlow,\n renderClaudeFlow,\n renderApiKeyFlow,\n className,\n}: AuthDialogProps): ReactNode {\n const [internalBackend, setInternalBackend] = useState<AuthBackend>(\n controlledBackend ?? backends[0] ?? \"copilot\",\n );\n\n const activeBackend = controlledBackend ?? internalBackend;\n\n const handleBackendChange = useCallback(\n (backend: AuthBackend) => {\n setInternalBackend(backend);\n onBackendChange?.(backend);\n },\n [onBackendChange],\n );\n\n const auth = useAuth({ backend: activeBackend, onAuthenticated });\n\n const children: ReactNode[] = [];\n\n // Backend selector buttons\n const selectorButtons = backends.map((backend) =>\n createElement(\n \"button\",\n {\n key: backend,\n type: \"button\",\n \"data-auth-backend\": backend,\n \"data-auth-selected\": String(backend === activeBackend),\n onClick: () => handleBackendChange(backend),\n },\n backend,\n ),\n );\n\n children.push(\n createElement(\n \"div\",\n { key: \"selector\", \"data-auth-selector\": \"true\" },\n ...selectorButtons,\n ),\n );\n\n // Status and error attributes\n const contentAttrs: Record<string, unknown> = {\n key: \"content\",\n \"data-auth-content\": \"true\",\n \"data-auth-status\": auth.status,\n };\n if (auth.error) {\n contentAttrs[\"data-auth-error\"] = auth.error.message;\n }\n\n // Per-backend content\n let flowContent: ReactNode = null;\n\n if (activeBackend === \"copilot\") {\n if (\n renderCopilotFlow &&\n auth.deviceCode &&\n auth.verificationUrl\n ) {\n flowContent = renderCopilotFlow({\n deviceCode: auth.deviceCode,\n verificationUrl: auth.verificationUrl,\n status: auth.status,\n });\n } else {\n const copilotChildren: ReactNode[] = [];\n if (auth.status === \"idle\") {\n copilotChildren.push(\n createElement(\n \"button\",\n {\n key: \"start\",\n type: \"button\",\n \"data-action\": \"start-device-flow\",\n onClick: auth.startDeviceFlow,\n },\n \"Start Device Flow\",\n ),\n );\n }\n if (auth.deviceCode && auth.verificationUrl) {\n copilotChildren.push(\n createElement(\"span\", { key: \"code\", \"data-device-code\": \"true\" }, auth.deviceCode),\n );\n copilotChildren.push(\n createElement(\"a\", { key: \"url\", \"data-verification-url\": \"true\", href: auth.verificationUrl }, auth.verificationUrl),\n );\n }\n if (auth.status === \"pending\") {\n copilotChildren.push(\n createElement(\"span\", { key: \"loading\", \"data-auth-loading\": \"true\" }, \"Waiting...\"),\n );\n }\n flowContent = createElement(\n \"div\",\n { \"data-auth-flow\": \"copilot\" },\n ...copilotChildren,\n );\n }\n } else if (activeBackend === \"claude\") {\n if (renderClaudeFlow) {\n flowContent = renderClaudeFlow({\n authorizeUrl: auth.authorizeUrl,\n status: auth.status,\n completeOAuth: auth.completeOAuth,\n });\n } else {\n const claudeChildren: ReactNode[] = [];\n if (auth.status === \"idle\") {\n claudeChildren.push(\n createElement(\n \"button\",\n {\n key: \"start\",\n type: \"button\",\n \"data-action\": \"start-oauth-flow\",\n onClick: auth.startOAuthFlow,\n },\n \"Start OAuth Flow\",\n ),\n );\n }\n if (auth.authorizeUrl) {\n claudeChildren.push(\n createElement(\"a\", { key: \"url\", \"data-authorize-url\": \"true\", href: auth.authorizeUrl }, auth.authorizeUrl),\n );\n }\n flowContent = createElement(\n \"div\",\n { \"data-auth-flow\": \"claude\" },\n ...claudeChildren,\n );\n }\n } else if (activeBackend === \"api-key\") {\n if (renderApiKeyFlow) {\n flowContent = renderApiKeyFlow({\n submitApiKey: auth.submitApiKey,\n status: auth.status,\n });\n } else {\n flowContent = createElement(\n \"div\",\n { \"data-auth-flow\": \"api-key\" },\n createElement(\n \"button\",\n {\n key: \"submit\",\n type: \"button\",\n \"data-action\": \"submit-api-key\",\n onClick: () => auth.submitApiKey(\"\"),\n },\n \"Submit API Key\",\n ),\n );\n }\n }\n\n children.push(createElement(\"div\", contentAttrs, flowContent));\n\n // Error display\n if (auth.error) {\n children.push(\n createElement(\n \"div\",\n { key: \"error\", \"data-auth-error-display\": \"true\" },\n auth.error.message,\n ),\n );\n }\n\n return createElement(\n \"div\",\n { \"data-auth-dialog\": \"true\", className },\n ...children,\n );\n}\n"]}
|