omnix-chat 0.1.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/CHANGELOG.md +34 -0
- package/LICENSE +21 -0
- package/README.md +360 -0
- package/dist/es-BoccmK_s.js +457 -0
- package/dist/es-BoccmK_s.js.map +1 -0
- package/dist/favicon.svg +1 -0
- package/dist/logo.svg +1 -0
- package/dist/omnix-chat.es.js +3197 -0
- package/dist/omnix-chat.es.js.map +1 -0
- package/dist/omnix-chat.umd.js +4 -0
- package/dist/omnix-chat.umd.js.map +1 -0
- package/dist/react.es.js +26062 -0
- package/dist/react.es.js.map +1 -0
- package/dist/react.umd.js +593 -0
- package/dist/react.umd.js.map +1 -0
- package/dist/src/chat/ChatRoot.d.ts +9 -0
- package/dist/src/chat/ChatRoot.d.ts.map +1 -0
- package/dist/src/chat/bridge/index.d.ts +2 -0
- package/dist/src/chat/bridge/index.d.ts.map +1 -0
- package/dist/src/chat/bridge/messageBridge.d.ts +8 -0
- package/dist/src/chat/bridge/messageBridge.d.ts.map +1 -0
- package/dist/src/chat/components/AIAssistantBubble.d.ts +13 -0
- package/dist/src/chat/components/AIAssistantBubble.d.ts.map +1 -0
- package/dist/src/chat/components/ErrorBoundary.d.ts +25 -0
- package/dist/src/chat/components/ErrorBoundary.d.ts.map +1 -0
- package/dist/src/chat/components/LauncherSlot.d.ts +8 -0
- package/dist/src/chat/components/LauncherSlot.d.ts.map +1 -0
- package/dist/src/chat/components/LoginForm.d.ts +7 -0
- package/dist/src/chat/components/LoginForm.d.ts.map +1 -0
- package/dist/src/chat/components/PanelHeaderTitle.d.ts +7 -0
- package/dist/src/chat/components/PanelHeaderTitle.d.ts.map +1 -0
- package/dist/src/chat/components/message/BlockExportActions.d.ts +7 -0
- package/dist/src/chat/components/message/BlockExportActions.d.ts.map +1 -0
- package/dist/src/chat/components/message/MessageBlockRenderer.d.ts +6 -0
- package/dist/src/chat/components/message/MessageBlockRenderer.d.ts.map +1 -0
- package/dist/src/chat/components/message/SafeMarkdownHtml.d.ts +11 -0
- package/dist/src/chat/components/message/SafeMarkdownHtml.d.ts.map +1 -0
- package/dist/src/chat/components/message/blockExport.d.ts +5 -0
- package/dist/src/chat/components/message/blockExport.d.ts.map +1 -0
- package/dist/src/chat/components/message/chartBlockUtils.d.ts +10 -0
- package/dist/src/chat/components/message/chartBlockUtils.d.ts.map +1 -0
- package/dist/src/chat/components/message/index.d.ts +4 -0
- package/dist/src/chat/components/message/index.d.ts.map +1 -0
- package/dist/src/chat/components/message/parseMessageBlocks.d.ts +15 -0
- package/dist/src/chat/components/message/parseMessageBlocks.d.ts.map +1 -0
- package/dist/src/chat/components/message/types.d.ts +89 -0
- package/dist/src/chat/components/message/types.d.ts.map +1 -0
- package/dist/src/chat/components/panel/AIAssistantPanel.d.ts +4 -0
- package/dist/src/chat/components/panel/AIAssistantPanel.d.ts.map +1 -0
- package/dist/src/chat/components/panel/AgentSkillBar.d.ts +17 -0
- package/dist/src/chat/components/panel/AgentSkillBar.d.ts.map +1 -0
- package/dist/src/chat/components/panel/BubbleAvatars.d.ts +7 -0
- package/dist/src/chat/components/panel/BubbleAvatars.d.ts.map +1 -0
- package/dist/src/chat/components/panel/ConversationSidebar.d.ts +23 -0
- package/dist/src/chat/components/panel/ConversationSidebar.d.ts.map +1 -0
- package/dist/src/chat/components/panel/DownFeedbackModal.d.ts +18 -0
- package/dist/src/chat/components/panel/DownFeedbackModal.d.ts.map +1 -0
- package/dist/src/chat/components/panel/MessageBody.d.ts +16 -0
- package/dist/src/chat/components/panel/MessageBody.d.ts.map +1 -0
- package/dist/src/chat/components/panel/MessageFeedbackFooter.d.ts +10 -0
- package/dist/src/chat/components/panel/MessageFeedbackFooter.d.ts.map +1 -0
- package/dist/src/chat/components/panel/MessageList.d.ts +13 -0
- package/dist/src/chat/components/panel/MessageList.d.ts.map +1 -0
- package/dist/src/chat/components/panel/PanelModals.d.ts +13 -0
- package/dist/src/chat/components/panel/PanelModals.d.ts.map +1 -0
- package/dist/src/chat/components/panel/PromptsSection.d.ts +11 -0
- package/dist/src/chat/components/panel/PromptsSection.d.ts.map +1 -0
- package/dist/src/chat/components/panel/constants.d.ts +83 -0
- package/dist/src/chat/components/panel/constants.d.ts.map +1 -0
- package/dist/src/chat/components/panel/index.d.ts +3 -0
- package/dist/src/chat/components/panel/index.d.ts.map +1 -0
- package/dist/src/chat/components/panel/types.d.ts +60 -0
- package/dist/src/chat/components/panel/types.d.ts.map +1 -0
- package/dist/src/chat/components/panel/useBubbleItems.d.ts +15 -0
- package/dist/src/chat/components/panel/useBubbleItems.d.ts.map +1 -0
- package/dist/src/chat/components/panel/useBubbleScroll.d.ts +21 -0
- package/dist/src/chat/components/panel/useBubbleScroll.d.ts.map +1 -0
- package/dist/src/chat/components/panel/useConversationSidebarScroll.d.ts +10 -0
- package/dist/src/chat/components/panel/useConversationSidebarScroll.d.ts.map +1 -0
- package/dist/src/chat/components/panel/utils.d.ts +25 -0
- package/dist/src/chat/components/panel/utils.d.ts.map +1 -0
- package/dist/src/chat/config/assistantPrompts.d.ts +9 -0
- package/dist/src/chat/config/assistantPrompts.d.ts.map +1 -0
- package/dist/src/chat/config/globalInteractionCopy.d.ts +19 -0
- package/dist/src/chat/config/globalInteractionCopy.d.ts.map +1 -0
- package/dist/src/chat/config/index.d.ts +2 -0
- package/dist/src/chat/config/index.d.ts.map +1 -0
- package/dist/src/chat/hooks/index.d.ts +4 -0
- package/dist/src/chat/hooks/index.d.ts.map +1 -0
- package/dist/src/chat/hooks/useClientState.d.ts +15 -0
- package/dist/src/chat/hooks/useClientState.d.ts.map +1 -0
- package/dist/src/chat/hooks/useDebouncedSessionPrepare.d.ts +9 -0
- package/dist/src/chat/hooks/useDebouncedSessionPrepare.d.ts.map +1 -0
- package/dist/src/chat/hooks/useLauncherPosition.d.ts +11 -0
- package/dist/src/chat/hooks/useLauncherPosition.d.ts.map +1 -0
- package/dist/src/chat/i18n.d.ts +11 -0
- package/dist/src/chat/i18n.d.ts.map +1 -0
- package/dist/src/chat/styles/host-styles.d.ts +10 -0
- package/dist/src/chat/styles/host-styles.d.ts.map +1 -0
- package/dist/src/chat/styles/inject.d.ts +4 -0
- package/dist/src/chat/styles/inject.d.ts.map +1 -0
- package/dist/src/chat/types.d.ts +56 -0
- package/dist/src/chat/types.d.ts.map +1 -0
- package/dist/src/chat/utils.d.ts +3 -0
- package/dist/src/chat/utils.d.ts.map +1 -0
- package/dist/src/core/api-envelope.d.ts +6 -0
- package/dist/src/core/api-envelope.d.ts.map +1 -0
- package/dist/src/core/auth-headers.d.ts +19 -0
- package/dist/src/core/auth-headers.d.ts.map +1 -0
- package/dist/src/core/auth-response.d.ts +9 -0
- package/dist/src/core/auth-response.d.ts.map +1 -0
- package/dist/src/core/auth-store.d.ts +23 -0
- package/dist/src/core/auth-store.d.ts.map +1 -0
- package/dist/src/core/auth-types.d.ts +26 -0
- package/dist/src/core/auth-types.d.ts.map +1 -0
- package/dist/src/core/auth.d.ts +25 -0
- package/dist/src/core/auth.d.ts.map +1 -0
- package/dist/src/core/chat-response.d.ts +66 -0
- package/dist/src/core/chat-response.d.ts.map +1 -0
- package/dist/src/core/chat-sse.d.ts +66 -0
- package/dist/src/core/chat-sse.d.ts.map +1 -0
- package/dist/src/core/errors.d.ts +16 -0
- package/dist/src/core/errors.d.ts.map +1 -0
- package/dist/src/core/events.d.ts +19 -0
- package/dist/src/core/events.d.ts.map +1 -0
- package/dist/src/core/feedback-utils.d.ts +9 -0
- package/dist/src/core/feedback-utils.d.ts.map +1 -0
- package/dist/src/core/http/client.d.ts +3 -0
- package/dist/src/core/http/client.d.ts.map +1 -0
- package/dist/src/core/http/errors.d.ts +6 -0
- package/dist/src/core/http/errors.d.ts.map +1 -0
- package/dist/src/core/http/index.d.ts +3 -0
- package/dist/src/core/http/index.d.ts.map +1 -0
- package/dist/src/core/http/sse.d.ts +5 -0
- package/dist/src/core/http/sse.d.ts.map +1 -0
- package/dist/src/core/http/types.d.ts +30 -0
- package/dist/src/core/http/types.d.ts.map +1 -0
- package/dist/src/core/instance.d.ts +135 -0
- package/dist/src/core/instance.d.ts.map +1 -0
- package/dist/src/core/message-blocks.d.ts +25 -0
- package/dist/src/core/message-blocks.d.ts.map +1 -0
- package/dist/src/core/resolve.d.ts +5 -0
- package/dist/src/core/resolve.d.ts.map +1 -0
- package/dist/src/core/services/agent.service.d.ts +18 -0
- package/dist/src/core/services/agent.service.d.ts.map +1 -0
- package/dist/src/core/services/auth.service.d.ts +14 -0
- package/dist/src/core/services/auth.service.d.ts.map +1 -0
- package/dist/src/core/services/chat.service.d.ts +28 -0
- package/dist/src/core/services/chat.service.d.ts.map +1 -0
- package/dist/src/core/services/feedback.service.d.ts +15 -0
- package/dist/src/core/services/feedback.service.d.ts.map +1 -0
- package/dist/src/core/services/index.d.ts +5 -0
- package/dist/src/core/services/index.d.ts.map +1 -0
- package/dist/src/index.d.ts +15 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/react/AgentChat.d.ts +25 -0
- package/dist/src/react/AgentChat.d.ts.map +1 -0
- package/dist/src/react/AgentChatEmbedded.d.ts +12 -0
- package/dist/src/react/AgentChatEmbedded.d.ts.map +1 -0
- package/dist/src/react/AgentChatProvider.d.ts +15 -0
- package/dist/src/react/AgentChatProvider.d.ts.map +1 -0
- package/dist/src/react/context.d.ts +4 -0
- package/dist/src/react/context.d.ts.map +1 -0
- package/dist/src/react/index.d.ts +11 -0
- package/dist/src/react/index.d.ts.map +1 -0
- package/dist/src/react/useAgentChat.d.ts +36 -0
- package/dist/src/react/useAgentChat.d.ts.map +1 -0
- package/dist/src/types.d.ts +337 -0
- package/dist/src/types.d.ts.map +1 -0
- package/dist/src/utils/id.d.ts +7 -0
- package/dist/src/utils/id.d.ts.map +1 -0
- package/dist/src/utils/sdk-version.d.ts +9 -0
- package/dist/src/utils/sdk-version.d.ts.map +1 -0
- package/dist/xlsx-CXTDRHcz.js +12389 -0
- package/dist/xlsx-CXTDRHcz.js.map +1 -0
- package/package.json +115 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"omnix-chat.es.js","names":["objectToString"],"sources":["../src/core/errors.ts","../src/core/resolve.ts","../src/core/auth-headers.ts","../src/core/auth-response.ts","../src/core/chat-response.ts","../node_modules/.pnpm/zustand@5.0.5_@types+react@19.2.14_react@19.2.5/node_modules/zustand/esm/vanilla.mjs","../node_modules/.pnpm/zustand@5.0.5_@types+react@19.2.14_react@19.2.5/node_modules/zustand/esm/react.mjs","../node_modules/.pnpm/zustand@5.0.5_@types+react@19.2.14_react@19.2.5/node_modules/zustand/esm/middleware.mjs","../src/core/auth-store.ts","../src/core/events.ts","../src/core/chat-sse.ts","../node_modules/.pnpm/ky@2.0.2/node_modules/ky/distribution/errors/KyError.js","../node_modules/.pnpm/ky@2.0.2/node_modules/ky/distribution/errors/HTTPError.js","../node_modules/.pnpm/ky@2.0.2/node_modules/ky/distribution/errors/NetworkError.js","../node_modules/.pnpm/ky@2.0.2/node_modules/ky/distribution/errors/NonError.js","../node_modules/.pnpm/ky@2.0.2/node_modules/ky/distribution/errors/ForceRetryError.js","../node_modules/.pnpm/ky@2.0.2/node_modules/ky/distribution/errors/SchemaValidationError.js","../node_modules/.pnpm/ky@2.0.2/node_modules/ky/distribution/errors/TimeoutError.js","../node_modules/.pnpm/ky@2.0.2/node_modules/ky/distribution/core/constants.js","../node_modules/.pnpm/ky@2.0.2/node_modules/ky/distribution/utils/body.js","../node_modules/.pnpm/ky@2.0.2/node_modules/ky/distribution/utils/is.js","../node_modules/.pnpm/ky@2.0.2/node_modules/ky/distribution/utils/merge.js","../node_modules/.pnpm/ky@2.0.2/node_modules/ky/distribution/utils/normalize.js","../node_modules/.pnpm/ky@2.0.2/node_modules/ky/distribution/utils/timeout.js","../node_modules/.pnpm/ky@2.0.2/node_modules/ky/distribution/utils/delay.js","../node_modules/.pnpm/ky@2.0.2/node_modules/ky/distribution/utils/options.js","../node_modules/.pnpm/ky@2.0.2/node_modules/ky/distribution/utils/is-network-error.js","../node_modules/.pnpm/ky@2.0.2/node_modules/ky/distribution/utils/type-guards.js","../node_modules/.pnpm/ky@2.0.2/node_modules/ky/distribution/core/Ky.js","../node_modules/.pnpm/ky@2.0.2/node_modules/ky/distribution/index.js","../src/core/http/errors.ts","../src/core/http/sse.ts","../src/core/http/client.ts","../src/core/services/auth.service.ts","../src/core/services/agent.service.ts","../src/core/services/chat.service.ts","../src/core/api-envelope.ts","../src/core/services/feedback.service.ts","../src/core/auth.ts","../src/core/feedback-utils.ts","../src/core/message-blocks.ts","../src/utils/sdk-version.ts","../src/utils/id.ts","../src/core/instance.ts","../src/index.ts"],"sourcesContent":["export type AgentChatErrorCode =\n | 'INVALID_DSN'\n | 'DSN_RESOLVE_FAILED'\n | 'INVALID_OPTIONS'\n | 'AUTH_REQUIRED'\n | 'LOGIN_FAILED'\n | 'ALREADY_INITIALIZED'\n | 'NOT_INITIALIZED'\n | 'SESSION_HANDSHAKE_FAILED'\n | 'MESSAGE_FAILED'\n | 'TRANSPORT_ABORTED'\n | 'TRANSPORT_FAILED'\n | 'DESTROYED';\n\nexport interface AgentChatErrorOptions {\n cause?: unknown;\n details?: Record<string, unknown>;\n}\n\n/**\n * Single error class used everywhere in the SDK. The `code` field is the\n * stable contract — it is what consumers should `switch` on. The `message`\n * is human readable and may evolve between versions.\n */\nexport class AgentChatError extends Error {\n readonly code: AgentChatErrorCode;\n readonly details?: Record<string, unknown>;\n\n constructor(code: AgentChatErrorCode, message: string, options: AgentChatErrorOptions = {}) {\n super(message);\n this.name = 'AgentChatError';\n this.code = code;\n if (options.cause !== undefined) {\n (this as { cause?: unknown }).cause = options.cause;\n }\n if (options.details !== undefined) {\n this.details = options.details;\n }\n if (typeof Object.setPrototypeOf === 'function') {\n Object.setPrototypeOf(this, AgentChatError.prototype);\n }\n }\n}\n","import { AgentChatError } from './errors';\n\nexport const DEFAULT_BASE_URL = 'http://localhost:3030';\n\n/** Header name through which the opaque DSN is forwarded as a credential. */\nexport const DSN_AUTH_HEADER = 'x-app-dsn';\n\nexport function normalizeDsn(dsn: unknown): string {\n if (typeof dsn !== 'string' || dsn.trim() === '') {\n throw new AgentChatError('INVALID_DSN', 'DSN must be a non-empty string', {\n details: { received: typeof dsn },\n });\n }\n return dsn.trim();\n}\n","import type { HttpClient } from './http';\nimport { DSN_AUTH_HEADER } from './resolve';\n\n/** Sent on the first `/app-client/auth` call when an account token already exists. */\nexport const ACCOUNT_TOKEN_HEADER = 'x-account-token';\n\nexport const AUTHORIZATION_HEADER = 'Authorization';\n\n/** C-end client API DSN header (`AppClientDsnGuard`). */\nexport const CLIENT_DSN_HEADER = 'X-App-Dsn';\n\n/** Headers for `POST /app-client/auth` — `x-app-dsn` (+ optional `x-account-token`). */\nexport function buildAppClientAuthHeaders(\n dsn: string,\n accountToken?: string | null,\n): Record<string, string> {\n const headers: Record<string, string> = {\n [DSN_AUTH_HEADER]: dsn.trim(),\n };\n if (accountToken?.trim()) {\n headers[ACCOUNT_TOKEN_HEADER] = normalizeAccessToken(accountToken);\n }\n return headers;\n}\n\nexport function normalizeAccessToken(accessToken: string): string {\n return accessToken.trim().replace(/^Bearer\\s+/i, '');\n}\n\nexport function formatBearerToken(accessToken: string): string {\n return `Bearer ${normalizeAccessToken(accessToken)}`;\n}\n\n/**\n * Attach the access token returned by `/app-client/auth` for all subsequent API\n * calls (`/chat`, messages, etc.).\n */\nexport function applyAccessTokenHeader(http: HttpClient, accessToken: string): void {\n http.setDefaultHeader(AUTHORIZATION_HEADER, formatBearerToken(accessToken));\n}\n\nexport function clearAccessTokenHeader(http: HttpClient): void {\n http.setDefaultHeader(AUTHORIZATION_HEADER, undefined);\n}\n\n/** Headers for `/agent/*` client APIs (`X-App-Dsn` only; Bearer comes from defaults). */\nexport function buildAgentClientHeaders(dsn: string): Record<string, string> {\n return { [CLIENT_DSN_HEADER]: dsn.trim() };\n}\n","import type { AppClientAuthData } from './auth-types';\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object';\n}\n\n/**\n * Unwrap `{ data: T }` envelopes from the backend. Falls back to the root\n * object when no `data` key is present.\n */\nexport function unwrapApiData<T extends Record<string, unknown>>(body: unknown): T | null {\n if (!isRecord(body)) return null;\n if (isRecord(body.data)) return body.data as T;\n return body as T;\n}\n\nfunction readString(value: unknown): string | undefined {\n return typeof value === 'string' && value.trim().length > 0 ? value.trim() : undefined;\n}\n\nfunction parseAppClient(value: unknown): AppClientAuthData['appClient'] {\n if (!isRecord(value)) return undefined;\n const id = value.id;\n const dsn = readString(value.dsn);\n const name = readString(value.name);\n if (typeof id !== 'number' || !dsn || !name) return undefined;\n return { id, dsn, name };\n}\n\nfunction parseUser(value: unknown): AppClientAuthData['user'] {\n if (!isRecord(value)) return undefined;\n const id = value.id;\n const email = readString(value.email);\n const username = readString(value.username);\n const userType = readString(value.userType);\n const userRole = readString(value.userRole);\n if (typeof id !== 'number' || !email || !username || !userType || !userRole) {\n return undefined;\n }\n return {\n id,\n employeeId: readString(value.employeeId),\n email,\n username,\n userType,\n userRole,\n mustChangePassword:\n typeof value.mustChangePassword === 'boolean' ? value.mustChangePassword : undefined,\n createdAt: readString(value.createdAt),\n };\n}\n\n/** Parse `/app-client/auth` or `/user/login` JSON into a normalized auth payload. */\nexport function parseAuthResponse(body: unknown): AppClientAuthData | null {\n const raw = unwrapApiData<Record<string, unknown>>(body);\n if (!raw) return null;\n\n const accessToken = readString(raw.accessToken);\n const ok = raw.ok === true || (raw.ok !== false && accessToken !== undefined);\n\n return {\n ok,\n accessToken,\n appClient: parseAppClient(raw.appClient),\n user: parseUser(raw.user),\n accountTokenBound:\n typeof raw.accountTokenBound === 'boolean' ? raw.accountTokenBound : undefined,\n };\n}\n","import { unwrapApiData } from './auth-response';\nimport type { ChatAgentSummary, ChatSessionSummary, ChatSkillSummary } from '../types';\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object';\n}\n\nfunction readString(value: unknown): string | undefined {\n return typeof value === 'string' && value.trim().length > 0 ? value.trim() : undefined;\n}\n\nfunction parseSessionRow(row: unknown): ChatSessionSummary | null {\n if (!isRecord(row)) return null;\n\n const sessionId =\n readString(row.sessionId) ??\n readString(row.id) ??\n (typeof row.sessionId === 'number' ? String(row.sessionId) : undefined) ??\n (typeof row.id === 'number' ? String(row.id) : undefined);\n if (!sessionId) return null;\n\n const updatedAtRaw = row.updatedAt ?? row.updated_at ?? row.lastMessageAt;\n let updatedAt: number | undefined;\n if (typeof updatedAtRaw === 'number') {\n updatedAt = updatedAtRaw;\n } else if (updatedAtRaw !== undefined) {\n const parsed = new Date(updatedAtRaw as string | Date).getTime();\n updatedAt = Number.isFinite(parsed) ? parsed : undefined;\n }\n\n return {\n sessionId,\n title: readString(row.title) ?? readString(row.name),\n preview:\n readString(row.preview) ??\n readString(row.lastMessage) ??\n readString(row.summary),\n updatedAt,\n };\n}\n\nfunction rowsFromBody(body: unknown): unknown[] {\n if (Array.isArray(body)) return body;\n if (!isRecord(body)) return [];\n\n if (Array.isArray(body.data)) return body.data;\n\n if (isRecord(body.data)) {\n for (const key of ['sessions', 'agents', 'skills', 'list', 'items', 'records'] as const) {\n const candidate = body.data[key];\n if (Array.isArray(candidate)) return candidate;\n }\n }\n\n for (const key of ['sessions', 'agents', 'skills', 'list', 'items', 'records'] as const) {\n const candidate = body[key];\n if (Array.isArray(candidate)) return candidate;\n }\n\n return [];\n}\n\n/** Parse `GET /chat` response into sidebar session summaries. */\nexport function parseChatSessionList(body: unknown): ChatSessionSummary[] {\n return rowsFromBody(body)\n .map((row) => parseSessionRow(row))\n .filter((row): row is ChatSessionSummary => row !== null);\n}\n\nexport interface ChatSessionListPage {\n sessions: ChatSessionSummary[];\n page: number;\n size: number;\n total?: number;\n hasMore: boolean;\n}\n\nfunction readNumber(value: unknown): number | undefined {\n if (typeof value === 'number' && Number.isFinite(value)) return value;\n if (typeof value === 'string' && value.trim().length > 0) {\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : undefined;\n }\n return undefined;\n}\n\nfunction readBoolean(value: unknown): boolean | undefined {\n if (typeof value === 'boolean') return value;\n return undefined;\n}\n\nfunction metaRoot(body: unknown): Record<string, unknown> | null {\n if (!isRecord(body)) return null;\n if (isRecord(body.data)) return body.data;\n return body;\n}\n\n/** Parse paginated `GET /chat?page=&size=` response. */\nexport function parseChatSessionListPage(\n body: unknown,\n requestedPage: number,\n requestedSize: number,\n): ChatSessionListPage {\n const sessions = parseChatSessionList(body);\n const root = metaRoot(body);\n\n const page = readNumber(root?.page) ?? readNumber(root?.current) ?? requestedPage;\n const size =\n readNumber(root?.size) ?? readNumber(root?.pageSize) ?? requestedSize;\n const total = readNumber(root?.total) ?? readNumber(root?.totalCount);\n\n let hasMore =\n readBoolean(root?.hasMore) ??\n readBoolean(root?.hasNext) ??\n (total !== undefined ? page * size < total : sessions.length >= requestedSize);\n\n if (sessions.length < requestedSize) {\n hasMore = false;\n }\n\n return { sessions, page, size, total, hasMore };\n}\n\nexport interface ChatSessionDetail {\n sessionId: string;\n messages: unknown[];\n}\n\nexport interface ChatSessionDetailPage {\n sessionId: string;\n messages: unknown[];\n page: number;\n size: number;\n total?: number;\n hasMore: boolean;\n}\n\ninterface DetailMessagesPageSlice {\n messages: unknown[];\n page?: number;\n size?: number;\n total?: number;\n totalPages?: number;\n hasMore?: boolean;\n}\n\nfunction messagesPageFromDetailRaw(raw: Record<string, unknown>): DetailMessagesPageSlice {\n const messagesField = raw.messages;\n\n if (Array.isArray(messagesField)) {\n return { messages: messagesField };\n }\n\n if (isRecord(messagesField)) {\n const messages = Array.isArray(messagesField.items)\n ? messagesField.items\n : Array.isArray(messagesField.list)\n ? messagesField.list\n : Array.isArray(messagesField.records)\n ? messagesField.records\n : [];\n\n const page = readNumber(messagesField.page) ?? readNumber(messagesField.current);\n const size =\n readNumber(messagesField.pageSize) ??\n readNumber(messagesField.size);\n const total =\n readNumber(messagesField.total) ?? readNumber(messagesField.totalCount);\n const totalPages = readNumber(messagesField.totalPages);\n\n let hasMore =\n readBoolean(messagesField.hasMore) ?? readBoolean(messagesField.hasNext);\n if (hasMore === undefined && page !== undefined && totalPages !== undefined) {\n hasMore = page < totalPages;\n }\n if (hasMore === undefined && page !== undefined && size !== undefined && total !== undefined) {\n hasMore = page * size < total;\n }\n\n return { messages, page, size, total, totalPages, hasMore };\n }\n\n for (const key of ['list', 'items', 'records'] as const) {\n const candidate = raw[key];\n if (Array.isArray(candidate)) return { messages: candidate };\n }\n\n return { messages: [] };\n}\n\nfunction resolveSessionIdFromRaw(raw: Record<string, unknown>): string | undefined {\n return (\n readString(raw.sessionId) ??\n readString(raw.id) ??\n (typeof raw.sessionId === 'number' ? String(raw.sessionId) : undefined)\n );\n}\n\n/** Parse paginated `GET /chat/{sessionId}?page=&size=` response. */\nexport function parseChatSessionDetailPage(\n body: unknown,\n fallbackSessionId: string,\n requestedPage: number,\n requestedSize: number,\n): ChatSessionDetailPage | null {\n const raw = unwrapApiData<Record<string, unknown>>(body) ?? (isRecord(body) ? body : null);\n if (!raw) return null;\n\n const sessionId = resolveSessionIdFromRaw(raw) ?? fallbackSessionId.trim();\n if (!sessionId) return null;\n\n const slice = messagesPageFromDetailRaw(raw);\n const messages = slice.messages;\n const root = metaRoot(body);\n\n const page =\n slice.page ??\n readNumber(root?.page) ??\n readNumber(root?.current) ??\n requestedPage;\n const size =\n slice.size ??\n readNumber(root?.size) ??\n readNumber(root?.pageSize) ??\n requestedSize;\n const total = slice.total ?? readNumber(root?.total) ?? readNumber(root?.totalCount);\n\n let hasMore =\n slice.hasMore ??\n readBoolean(root?.hasMore) ??\n readBoolean(root?.hasNext);\n\n if (hasMore === undefined && slice.totalPages !== undefined) {\n hasMore = page < slice.totalPages;\n }\n if (hasMore === undefined && total !== undefined) {\n hasMore = page * size < total;\n }\n if (hasMore === undefined) {\n hasMore = messages.length >= requestedSize;\n }\n\n if (messages.length < requestedSize) {\n hasMore = false;\n }\n\n return { sessionId, messages, page, size, total, hasMore };\n}\n\nexport interface CreateSessionResult {\n sessionId: string;\n}\n\n/** Parse `POST /chat` response (`{ data: { sessionId } }` or bare `{ sessionId }`). */\nexport function parseCreateSessionResponse(body: unknown): CreateSessionResult | null {\n const raw = unwrapApiData<Record<string, unknown>>(body) ?? (isRecord(body) ? body : null);\n if (!raw) return null;\n\n const sessionId =\n readString(raw.sessionId) ??\n readString(raw.id) ??\n (typeof raw.sessionId === 'number' ? String(raw.sessionId) : undefined);\n if (!sessionId) return null;\n\n return { sessionId };\n}\n\nexport interface PostedMessagePayload {\n id: string | number;\n role: string;\n content: string | null;\n createdAt: string | number | Date;\n}\n\n/** Parse `POST /chat/{sessionId}/messages` response. */\nexport function parsePostedMessage(body: unknown): PostedMessagePayload | null {\n const raw = unwrapApiData<Record<string, unknown>>(body) ?? (isRecord(body) ? body : null);\n if (!raw) return null;\n\n const idRaw = raw.id;\n if (\n idRaw === undefined ||\n idRaw === null ||\n (typeof idRaw !== 'string' && typeof idRaw !== 'number')\n ) {\n return null;\n }\n\n const role = readString(raw.role) ?? 'user';\n const content =\n typeof raw.content === 'string' ? raw.content : raw.content == null ? null : String(raw.content);\n\n const createdAt = (raw.createdAt ?? raw.created_at ?? Date.now()) as string | number | Date;\n\n return { id: idRaw, role, content, createdAt };\n}\n\n/** Parse `GET /chat/{sessionId}` response. */\nexport function parseChatSessionDetail(body: unknown): ChatSessionDetail | null {\n const page = parseChatSessionDetailPage(body, '', 1, Number.MAX_SAFE_INTEGER);\n if (!page || !page.sessionId) return null;\n return { sessionId: page.sessionId, messages: page.messages };\n}\n\nfunction readCatalogId(\n row: Record<string, unknown>,\n ...keys: string[]\n): string | undefined {\n for (const key of keys) {\n const value = row[key];\n if (typeof value === 'number' && Number.isFinite(value)) return String(value);\n const text = readString(value);\n if (text) return text;\n }\n return undefined;\n}\n\nfunction parseAgentRow(row: unknown): ChatAgentSummary | null {\n if (!isRecord(row)) return null;\n const id = readCatalogId(row, 'id', 'agentId');\n const name =\n readString(row.name) ?? readString(row.title) ?? readString(row.label);\n if (!id || !name) return null;\n return {\n id,\n name,\n description: readString(row.description) ?? readString(row.desc) ?? null,\n };\n}\n\nfunction parseSkillRow(row: unknown): ChatSkillSummary | null {\n if (!isRecord(row)) return null;\n const id = readCatalogId(row, 'id', 'skillId');\n const name =\n readString(row.name) ?? readString(row.title) ?? readString(row.label);\n if (!id || !name) return null;\n const agentId = readCatalogId(row, 'agentId', 'agent_id');\n const riskLevelRaw = readString(row.riskLevel);\n const riskLevel =\n riskLevelRaw === 'L1' || riskLevelRaw === 'L2' || riskLevelRaw === 'L3'\n ? riskLevelRaw\n : undefined;\n const toolIds = Array.isArray(row.toolIds)\n ? row.toolIds.filter((value): value is number => typeof value === 'number')\n : undefined;\n return {\n id,\n name,\n description: readString(row.description) ?? readString(row.desc) ?? null,\n agentId,\n capabilityKey: readString(row.capabilityKey) ?? null,\n riskLevel,\n requiresWriteConfirmation:\n typeof row.requiresWriteConfirmation === 'boolean'\n ? row.requiresWriteConfirmation\n : undefined,\n toolIds,\n };\n}\n\n/** Parse `GET /agent/client/available` (or bare JSON array) response. */\nexport function parseAgentList(body: unknown): ChatAgentSummary[] {\n return rowsFromBody(body)\n .map((row) => parseAgentRow(row))\n .filter((row): row is ChatAgentSummary => row !== null);\n}\n\nfunction readStringArray(value: unknown): string[] {\n if (!Array.isArray(value)) return [];\n return value.filter((item): item is string => typeof item === 'string' && item.trim().length > 0);\n}\n\nfunction parseDownReasonTagRow(row: unknown): { key: string; label: string } | null {\n if (!isRecord(row)) return null;\n const key = readString(row.key);\n const label = readString(row.label);\n if (!key || !label) return null;\n return { key, label };\n}\n\n/** Parse `GET /chat/feedback/down-reason-tags` `data`. */\nexport function parseDownReasonTags(data: unknown): { items: { key: string; label: string }[] } {\n if (!isRecord(data)) return { items: [] };\n const rows = Array.isArray(data.items) ? data.items : [];\n return {\n items: rows\n .map((row) => parseDownReasonTagRow(row))\n .filter((row): row is { key: string; label: string } => row !== null),\n };\n}\n\n/** Parse `MessageFeedbackView` from API `data`. */\nexport function parseMessageFeedbackView(data: unknown): {\n messageId: number;\n rating: 'up' | 'down';\n reasonTags: string[];\n comment: string | null;\n createdAt: string;\n updatedAt: string;\n} {\n if (!isRecord(data)) {\n throw new Error('Invalid message feedback payload');\n }\n const messageId = readNumber(data.messageId);\n const rating = data.rating === 'up' || data.rating === 'down' ? data.rating : null;\n const createdAt = readString(data.createdAt);\n const updatedAt = readString(data.updatedAt);\n if (messageId === undefined || !rating || !createdAt || !updatedAt) {\n throw new Error('Invalid message feedback payload');\n }\n return {\n messageId,\n rating,\n reasonTags: readStringArray(data.reasonTags),\n comment: typeof data.comment === 'string' ? data.comment : data.comment == null ? null : String(data.comment),\n createdAt,\n updatedAt,\n };\n}\n\n/** Parse `GET .../messages/feedbacks` `data`. */\nexport function parseMessageFeedbackBatch(data: unknown): {\n items: ReturnType<typeof parseMessageFeedbackView>[];\n} {\n if (!isRecord(data)) return { items: [] };\n const rows = Array.isArray(data.items) ? data.items : [];\n const items: ReturnType<typeof parseMessageFeedbackView>[] = [];\n for (const row of rows) {\n try {\n items.push(parseMessageFeedbackView(row));\n } catch {\n /* skip malformed row */\n }\n }\n return { items };\n}\n\n/** Parse `GET /agent/:agentId/skills/client` (or bare JSON array) response. */\nexport function parseSkillList(body: unknown, agentId?: string): ChatSkillSummary[] {\n const normalizedAgentId = agentId?.trim().toLowerCase();\n return rowsFromBody(body)\n .map((row) => parseSkillRow(row))\n .filter((row): row is ChatSkillSummary => row !== null)\n .filter((row) => {\n if (!normalizedAgentId) return true;\n if (!row.agentId) return true;\n return row.agentId.trim().toLowerCase() === normalizedAgentId;\n });\n}\n","const createStoreImpl = (createState) => {\n let state;\n const listeners = /* @__PURE__ */ new Set();\n const setState = (partial, replace) => {\n const nextState = typeof partial === \"function\" ? partial(state) : partial;\n if (!Object.is(nextState, state)) {\n const previousState = state;\n state = (replace != null ? replace : typeof nextState !== \"object\" || nextState === null) ? nextState : Object.assign({}, state, nextState);\n listeners.forEach((listener) => listener(state, previousState));\n }\n };\n const getState = () => state;\n const getInitialState = () => initialState;\n const subscribe = (listener) => {\n listeners.add(listener);\n return () => listeners.delete(listener);\n };\n const api = { setState, getState, getInitialState, subscribe };\n const initialState = state = createState(setState, getState, api);\n return api;\n};\nconst createStore = (createState) => createState ? createStoreImpl(createState) : createStoreImpl;\n\nexport { createStore };\n","import React from 'react';\nimport { createStore } from 'zustand/vanilla';\n\nconst identity = (arg) => arg;\nfunction useStore(api, selector = identity) {\n const slice = React.useSyncExternalStore(\n api.subscribe,\n () => selector(api.getState()),\n () => selector(api.getInitialState())\n );\n React.useDebugValue(slice);\n return slice;\n}\nconst createImpl = (createState) => {\n const api = createStore(createState);\n const useBoundStore = (selector) => useStore(api, selector);\n Object.assign(useBoundStore, api);\n return useBoundStore;\n};\nconst create = (createState) => createState ? createImpl(createState) : createImpl;\n\nexport { create, useStore };\n","const reduxImpl = (reducer, initial) => (set, _get, api) => {\n api.dispatch = (action) => {\n set((state) => reducer(state, action), false, action);\n return action;\n };\n api.dispatchFromDevtools = true;\n return { dispatch: (...args) => api.dispatch(...args), ...initial };\n};\nconst redux = reduxImpl;\n\nconst trackedConnections = /* @__PURE__ */ new Map();\nconst getTrackedConnectionState = (name) => {\n const api = trackedConnections.get(name);\n if (!api) return {};\n return Object.fromEntries(\n Object.entries(api.stores).map(([key, api2]) => [key, api2.getState()])\n );\n};\nconst extractConnectionInformation = (store, extensionConnector, options) => {\n if (store === void 0) {\n return {\n type: \"untracked\",\n connection: extensionConnector.connect(options)\n };\n }\n const existingConnection = trackedConnections.get(options.name);\n if (existingConnection) {\n return { type: \"tracked\", store, ...existingConnection };\n }\n const newConnection = {\n connection: extensionConnector.connect(options),\n stores: {}\n };\n trackedConnections.set(options.name, newConnection);\n return { type: \"tracked\", store, ...newConnection };\n};\nconst removeStoreFromTrackedConnections = (name, store) => {\n if (store === void 0) return;\n const connectionInfo = trackedConnections.get(name);\n if (!connectionInfo) return;\n delete connectionInfo.stores[store];\n if (Object.keys(connectionInfo.stores).length === 0) {\n trackedConnections.delete(name);\n }\n};\nconst findCallerName = (stack) => {\n var _a, _b;\n if (!stack) return void 0;\n const traceLines = stack.split(\"\\n\");\n const apiSetStateLineIndex = traceLines.findIndex(\n (traceLine) => traceLine.includes(\"api.setState\")\n );\n if (apiSetStateLineIndex < 0) return void 0;\n const callerLine = ((_a = traceLines[apiSetStateLineIndex + 1]) == null ? void 0 : _a.trim()) || \"\";\n return (_b = /.+ (.+) .+/.exec(callerLine)) == null ? void 0 : _b[1];\n};\nconst devtoolsImpl = (fn, devtoolsOptions = {}) => (set, get, api) => {\n const { enabled, anonymousActionType, store, ...options } = devtoolsOptions;\n let extensionConnector;\n try {\n extensionConnector = (enabled != null ? enabled : (import.meta.env ? import.meta.env.MODE : void 0) !== \"production\") && window.__REDUX_DEVTOOLS_EXTENSION__;\n } catch (e) {\n }\n if (!extensionConnector) {\n return fn(set, get, api);\n }\n const { connection, ...connectionInformation } = extractConnectionInformation(store, extensionConnector, options);\n let isRecording = true;\n api.setState = (state, replace, nameOrAction) => {\n const r = set(state, replace);\n if (!isRecording) return r;\n const inferredActionType = findCallerName(new Error().stack);\n const action = nameOrAction === void 0 ? { type: anonymousActionType || inferredActionType || \"anonymous\" } : typeof nameOrAction === \"string\" ? { type: nameOrAction } : nameOrAction;\n if (store === void 0) {\n connection == null ? void 0 : connection.send(action, get());\n return r;\n }\n connection == null ? void 0 : connection.send(\n {\n ...action,\n type: `${store}/${action.type}`\n },\n {\n ...getTrackedConnectionState(options.name),\n [store]: api.getState()\n }\n );\n return r;\n };\n api.devtools = {\n cleanup: () => {\n if (connection && typeof connection.unsubscribe === \"function\") {\n connection.unsubscribe();\n }\n removeStoreFromTrackedConnections(options.name, store);\n }\n };\n const setStateFromDevtools = (...a) => {\n const originalIsRecording = isRecording;\n isRecording = false;\n set(...a);\n isRecording = originalIsRecording;\n };\n const initialState = fn(api.setState, get, api);\n if (connectionInformation.type === \"untracked\") {\n connection == null ? void 0 : connection.init(initialState);\n } else {\n connectionInformation.stores[connectionInformation.store] = api;\n connection == null ? void 0 : connection.init(\n Object.fromEntries(\n Object.entries(connectionInformation.stores).map(([key, store2]) => [\n key,\n key === connectionInformation.store ? initialState : store2.getState()\n ])\n )\n );\n }\n if (api.dispatchFromDevtools && typeof api.dispatch === \"function\") {\n let didWarnAboutReservedActionType = false;\n const originalDispatch = api.dispatch;\n api.dispatch = (...args) => {\n if ((import.meta.env ? import.meta.env.MODE : void 0) !== \"production\" && args[0].type === \"__setState\" && !didWarnAboutReservedActionType) {\n console.warn(\n '[zustand devtools middleware] \"__setState\" action type is reserved to set state from the devtools. Avoid using it.'\n );\n didWarnAboutReservedActionType = true;\n }\n originalDispatch(...args);\n };\n }\n connection.subscribe((message) => {\n var _a;\n switch (message.type) {\n case \"ACTION\":\n if (typeof message.payload !== \"string\") {\n console.error(\n \"[zustand devtools middleware] Unsupported action format\"\n );\n return;\n }\n return parseJsonThen(\n message.payload,\n (action) => {\n if (action.type === \"__setState\") {\n if (store === void 0) {\n setStateFromDevtools(action.state);\n return;\n }\n if (Object.keys(action.state).length !== 1) {\n console.error(\n `\n [zustand devtools middleware] Unsupported __setState action format.\n When using 'store' option in devtools(), the 'state' should have only one key, which is a value of 'store' that was passed in devtools(),\n and value of this only key should be a state object. Example: { \"type\": \"__setState\", \"state\": { \"abc123Store\": { \"foo\": \"bar\" } } }\n `\n );\n }\n const stateFromDevtools = action.state[store];\n if (stateFromDevtools === void 0 || stateFromDevtools === null) {\n return;\n }\n if (JSON.stringify(api.getState()) !== JSON.stringify(stateFromDevtools)) {\n setStateFromDevtools(stateFromDevtools);\n }\n return;\n }\n if (!api.dispatchFromDevtools) return;\n if (typeof api.dispatch !== \"function\") return;\n api.dispatch(action);\n }\n );\n case \"DISPATCH\":\n switch (message.payload.type) {\n case \"RESET\":\n setStateFromDevtools(initialState);\n if (store === void 0) {\n return connection == null ? void 0 : connection.init(api.getState());\n }\n return connection == null ? void 0 : connection.init(getTrackedConnectionState(options.name));\n case \"COMMIT\":\n if (store === void 0) {\n connection == null ? void 0 : connection.init(api.getState());\n return;\n }\n return connection == null ? void 0 : connection.init(getTrackedConnectionState(options.name));\n case \"ROLLBACK\":\n return parseJsonThen(message.state, (state) => {\n if (store === void 0) {\n setStateFromDevtools(state);\n connection == null ? void 0 : connection.init(api.getState());\n return;\n }\n setStateFromDevtools(state[store]);\n connection == null ? void 0 : connection.init(getTrackedConnectionState(options.name));\n });\n case \"JUMP_TO_STATE\":\n case \"JUMP_TO_ACTION\":\n return parseJsonThen(message.state, (state) => {\n if (store === void 0) {\n setStateFromDevtools(state);\n return;\n }\n if (JSON.stringify(api.getState()) !== JSON.stringify(state[store])) {\n setStateFromDevtools(state[store]);\n }\n });\n case \"IMPORT_STATE\": {\n const { nextLiftedState } = message.payload;\n const lastComputedState = (_a = nextLiftedState.computedStates.slice(-1)[0]) == null ? void 0 : _a.state;\n if (!lastComputedState) return;\n if (store === void 0) {\n setStateFromDevtools(lastComputedState);\n } else {\n setStateFromDevtools(lastComputedState[store]);\n }\n connection == null ? void 0 : connection.send(\n null,\n // FIXME no-any\n nextLiftedState\n );\n return;\n }\n case \"PAUSE_RECORDING\":\n return isRecording = !isRecording;\n }\n return;\n }\n });\n return initialState;\n};\nconst devtools = devtoolsImpl;\nconst parseJsonThen = (stringified, fn) => {\n let parsed;\n try {\n parsed = JSON.parse(stringified);\n } catch (e) {\n console.error(\n \"[zustand devtools middleware] Could not parse the received json\",\n e\n );\n }\n if (parsed !== void 0) fn(parsed);\n};\n\nconst subscribeWithSelectorImpl = (fn) => (set, get, api) => {\n const origSubscribe = api.subscribe;\n api.subscribe = (selector, optListener, options) => {\n let listener = selector;\n if (optListener) {\n const equalityFn = (options == null ? void 0 : options.equalityFn) || Object.is;\n let currentSlice = selector(api.getState());\n listener = (state) => {\n const nextSlice = selector(state);\n if (!equalityFn(currentSlice, nextSlice)) {\n const previousSlice = currentSlice;\n optListener(currentSlice = nextSlice, previousSlice);\n }\n };\n if (options == null ? void 0 : options.fireImmediately) {\n optListener(currentSlice, currentSlice);\n }\n }\n return origSubscribe(listener);\n };\n const initialState = fn(set, get, api);\n return initialState;\n};\nconst subscribeWithSelector = subscribeWithSelectorImpl;\n\nfunction combine(initialState, create) {\n return (...args) => Object.assign({}, initialState, create(...args));\n}\n\nfunction createJSONStorage(getStorage, options) {\n let storage;\n try {\n storage = getStorage();\n } catch (e) {\n return;\n }\n const persistStorage = {\n getItem: (name) => {\n var _a;\n const parse = (str2) => {\n if (str2 === null) {\n return null;\n }\n return JSON.parse(str2, options == null ? void 0 : options.reviver);\n };\n const str = (_a = storage.getItem(name)) != null ? _a : null;\n if (str instanceof Promise) {\n return str.then(parse);\n }\n return parse(str);\n },\n setItem: (name, newValue) => storage.setItem(name, JSON.stringify(newValue, options == null ? void 0 : options.replacer)),\n removeItem: (name) => storage.removeItem(name)\n };\n return persistStorage;\n}\nconst toThenable = (fn) => (input) => {\n try {\n const result = fn(input);\n if (result instanceof Promise) {\n return result;\n }\n return {\n then(onFulfilled) {\n return toThenable(onFulfilled)(result);\n },\n catch(_onRejected) {\n return this;\n }\n };\n } catch (e) {\n return {\n then(_onFulfilled) {\n return this;\n },\n catch(onRejected) {\n return toThenable(onRejected)(e);\n }\n };\n }\n};\nconst persistImpl = (config, baseOptions) => (set, get, api) => {\n let options = {\n storage: createJSONStorage(() => localStorage),\n partialize: (state) => state,\n version: 0,\n merge: (persistedState, currentState) => ({\n ...currentState,\n ...persistedState\n }),\n ...baseOptions\n };\n let hasHydrated = false;\n const hydrationListeners = /* @__PURE__ */ new Set();\n const finishHydrationListeners = /* @__PURE__ */ new Set();\n let storage = options.storage;\n if (!storage) {\n return config(\n (...args) => {\n console.warn(\n `[zustand persist middleware] Unable to update item '${options.name}', the given storage is currently unavailable.`\n );\n set(...args);\n },\n get,\n api\n );\n }\n const setItem = () => {\n const state = options.partialize({ ...get() });\n return storage.setItem(options.name, {\n state,\n version: options.version\n });\n };\n const savedSetState = api.setState;\n api.setState = (state, replace) => {\n savedSetState(state, replace);\n void setItem();\n };\n const configResult = config(\n (...args) => {\n set(...args);\n void setItem();\n },\n get,\n api\n );\n api.getInitialState = () => configResult;\n let stateFromStorage;\n const hydrate = () => {\n var _a, _b;\n if (!storage) return;\n hasHydrated = false;\n hydrationListeners.forEach((cb) => {\n var _a2;\n return cb((_a2 = get()) != null ? _a2 : configResult);\n });\n const postRehydrationCallback = ((_b = options.onRehydrateStorage) == null ? void 0 : _b.call(options, (_a = get()) != null ? _a : configResult)) || void 0;\n return toThenable(storage.getItem.bind(storage))(options.name).then((deserializedStorageValue) => {\n if (deserializedStorageValue) {\n if (typeof deserializedStorageValue.version === \"number\" && deserializedStorageValue.version !== options.version) {\n if (options.migrate) {\n const migration = options.migrate(\n deserializedStorageValue.state,\n deserializedStorageValue.version\n );\n if (migration instanceof Promise) {\n return migration.then((result) => [true, result]);\n }\n return [true, migration];\n }\n console.error(\n `State loaded from storage couldn't be migrated since no migrate function was provided`\n );\n } else {\n return [false, deserializedStorageValue.state];\n }\n }\n return [false, void 0];\n }).then((migrationResult) => {\n var _a2;\n const [migrated, migratedState] = migrationResult;\n stateFromStorage = options.merge(\n migratedState,\n (_a2 = get()) != null ? _a2 : configResult\n );\n set(stateFromStorage, true);\n if (migrated) {\n return setItem();\n }\n }).then(() => {\n postRehydrationCallback == null ? void 0 : postRehydrationCallback(stateFromStorage, void 0);\n stateFromStorage = get();\n hasHydrated = true;\n finishHydrationListeners.forEach((cb) => cb(stateFromStorage));\n }).catch((e) => {\n postRehydrationCallback == null ? void 0 : postRehydrationCallback(void 0, e);\n });\n };\n api.persist = {\n setOptions: (newOptions) => {\n options = {\n ...options,\n ...newOptions\n };\n if (newOptions.storage) {\n storage = newOptions.storage;\n }\n },\n clearStorage: () => {\n storage == null ? void 0 : storage.removeItem(options.name);\n },\n getOptions: () => options,\n rehydrate: () => hydrate(),\n hasHydrated: () => hasHydrated,\n onHydrate: (cb) => {\n hydrationListeners.add(cb);\n return () => {\n hydrationListeners.delete(cb);\n };\n },\n onFinishHydration: (cb) => {\n finishHydrationListeners.add(cb);\n return () => {\n finishHydrationListeners.delete(cb);\n };\n }\n };\n if (!options.skipHydration) {\n hydrate();\n }\n return stateFromStorage || configResult;\n};\nconst persist = persistImpl;\n\nexport { combine, createJSONStorage, devtools, persist, redux, subscribeWithSelector };\n","import { create } from 'zustand';\nimport { persist } from 'zustand/middleware';\nimport type { AppClientAuthData, AppClientInfo, AuthUser } from './auth-types';\n\nexport interface AuthStoreState {\n dsn: string | null;\n accessToken: string | null;\n user: AuthUser | null;\n appClient: AppClientInfo | null;\n accountTokenBound: boolean | null;\n setAuth: (dsn: string, data: AppClientAuthData) => void;\n clearAuth: () => void;\n getAccessTokenForDsn: (dsn: string) => string | null;\n}\n\nconst initialState = {\n dsn: null,\n accessToken: null,\n user: null,\n appClient: null,\n accountTokenBound: null,\n} as const;\n\nexport const useAuthStore = create<AuthStoreState>()(\n persist(\n (set, get) => ({\n ...initialState,\n setAuth(dsn, data) {\n set({\n dsn,\n accessToken: data.accessToken ?? null,\n user: data.user ?? null,\n appClient: data.appClient ?? null,\n accountTokenBound: data.accountTokenBound ?? null,\n });\n },\n clearAuth() {\n set({ ...initialState });\n },\n getAccessTokenForDsn(dsn) {\n const state = get();\n if (state.dsn === dsn && state.accessToken) return state.accessToken;\n return null;\n },\n }),\n { name: 'agent-chat-auth' },\n ),\n);\n","/**\n * Tiny typed event bus.\n *\n * Design notes:\n * - `on()` returns an unsubscribe function for ergonomic teardown.\n * - Re-registering the same `(event, handler)` pair is idempotent.\n * - During `emit()` we iterate over a snapshot, so handlers added or removed\n * while a broadcast is in progress do not affect the current pass — the\n * newly added handler will fire on the *next* `emit`.\n */\nexport class EventBus<EventMap extends Record<string, unknown> = Record<string, unknown>> {\n private handlers: Map<keyof EventMap, Set<(payload: never) => void>> = new Map();\n\n on<K extends keyof EventMap>(\n event: K,\n handler: (payload: EventMap[K]) => void,\n ): () => void {\n let bucket = this.handlers.get(event);\n if (!bucket) {\n bucket = new Set();\n this.handlers.set(event, bucket);\n }\n bucket.add(handler as (payload: never) => void);\n return () => this.off(event, handler);\n }\n\n off<K extends keyof EventMap>(\n event: K,\n handler: (payload: EventMap[K]) => void,\n ): void {\n const bucket = this.handlers.get(event);\n if (!bucket) return;\n bucket.delete(handler as (payload: never) => void);\n if (bucket.size === 0) {\n this.handlers.delete(event);\n }\n }\n\n emit<K extends keyof EventMap>(event: K, payload: EventMap[K]): void {\n const bucket = this.handlers.get(event);\n if (!bucket || bucket.size === 0) return;\n const snapshot = Array.from(bucket);\n for (const handler of snapshot) {\n try {\n (handler as (payload: EventMap[K]) => void)(payload);\n } catch (err) {\n if (typeof console !== 'undefined' && typeof console.error === 'function') {\n console.error('[agent-chat] event handler threw:', err);\n }\n }\n }\n }\n\n listenerCount<K extends keyof EventMap>(event: K): number {\n return this.handlers.get(event)?.size ?? 0;\n }\n\n clear(): void {\n this.handlers.clear();\n }\n}\n","/**\n * Maps backend SSE events to UI actions.\n *\n * Preferred SSE events: `think` | `message` | `complete` | `error`\n * Backward compatible: `result` | `message.delta` | `message.done`\n */\n\nexport interface ServerMessagePayload {\n id?: string | number;\n role?: string;\n content?: string;\n createdAt?: string | number | Date;\n}\n\nexport type SseMessageBlock = Record<string, unknown> & { type: string; id?: string };\nexport interface SseMessageBlockPatch {\n replaceId: string;\n block: SseMessageBlock;\n}\n\nexport type ChatSseUiAction =\n | { type: 'think'; text: string; mode: 'replace' | 'append'; messageId?: string }\n | { type: 'result'; text: string; mode: 'replace' | 'append'; messageId?: string }\n | {\n type: 'message-blocks';\n runId?: number;\n turnId?: number;\n action: 'stream' | 'patch';\n streamMode?: 'delta' | 'full' | 'patch';\n seq?: number;\n blocks?: SseMessageBlock[];\n patches?: SseMessageBlockPatch[];\n messageId?: string;\n }\n | {\n type: 'write-confirmation-required';\n runId: number;\n turnId?: number;\n message: string;\n code?: string;\n }\n | {\n type: 'write-confirmation-cancelled';\n runId?: number;\n turnId?: number;\n message: string;\n code?: string;\n }\n | { type: 'complete'; serverMessage?: ServerMessagePayload; messageId?: string }\n | { type: 'error'; message: string; code?: string }\n | { type: 'noop' };\n\nfunction tryParseJson(raw: string): unknown {\n try {\n return JSON.parse(raw) as unknown;\n } catch {\n return null;\n }\n}\n\nfunction readMessageId(data: string): string | undefined {\n const parsed = tryParseJson(data) as Record<string, unknown> | null;\n if (!parsed) return undefined;\n const raw =\n parsed.messageId ??\n parsed.message_id ??\n parsed.outputMessageId ??\n parsed.output_message_id ??\n parsed.id;\n if (raw == null) return undefined;\n return String(raw);\n}\n\nfunction readContentField(data: string): string {\n const parsed = tryParseJson(data) as { content?: string } | null;\n if (parsed?.content != null) return String(parsed.content);\n return data.trim();\n}\n\nfunction readErrorFromData(data: string): { message: string; code?: string } {\n const parsed = tryParseJson(data) as { message?: string; code?: string } | null;\n return {\n message: parsed?.message?.trim() || data.trim() || 'Stream failed',\n code: typeof parsed?.code === 'string' ? parsed.code : undefined,\n };\n}\n\nconst STREAM_APPEND_MODES = new Set([\n 'delta',\n 'stream',\n 'chunk',\n 'token',\n 'append',\n 'message.delta',\n]);\n\nfunction resolveStreamTextMode(modeRaw: string | undefined): 'replace' | 'append' {\n if (!modeRaw) return 'append';\n if (modeRaw === 'full' || modeRaw === 'replace') return 'replace';\n if (STREAM_APPEND_MODES.has(modeRaw)) return 'append';\n return 'append';\n}\n\nfunction parseThinkEnvelope(data: string): ChatSseUiAction {\n const messageId = readMessageId(data);\n const parsed = tryParseJson(data) as Record<string, unknown> | null;\n if (parsed && typeof parsed === 'object') {\n const text =\n typeof parsed.content === 'string'\n ? parsed.content\n : typeof parsed.text === 'string'\n ? parsed.text\n : '';\n if (!text) return { type: 'noop' };\n const mode = resolveStreamTextMode(\n typeof parsed.mode === 'string' ? parsed.mode : undefined,\n );\n return { type: 'think', text, mode, messageId };\n }\n const plain = readContentField(data);\n return plain ? { type: 'think', text: plain, mode: 'append', messageId } : { type: 'noop' };\n}\n\nfunction readResultChunkText(record: Record<string, unknown>): string {\n const blocks = record.blocks;\n if (Array.isArray(blocks) && blocks.length > 0) {\n const text = blocks\n .map((block) => {\n if (!block || typeof block !== 'object') return '';\n const content = (block as { content?: unknown }).content;\n return typeof content === 'string' ? content : '';\n })\n .join('');\n if (text) return text;\n }\n\n for (const key of ['output', 'content', 'text', 'delta', 'token'] as const) {\n const value = record[key];\n if (typeof value === 'string' && value.length > 0) return value;\n }\n return '';\n}\n\nfunction parseResultEnvelope(data: string): ChatSseUiAction {\n const messageId = readMessageId(data);\n const outer = tryParseJson(data) as { content?: string } | null;\n const innerRaw = outer?.content ?? data;\n const inner = typeof innerRaw === 'string' ? tryParseJson(innerRaw) : innerRaw;\n\n if (inner && typeof inner === 'object') {\n const record = inner as Record<string, unknown>;\n const source = typeof record.source === 'string' ? record.source : undefined;\n const action = typeof record.action === 'string' ? record.action : undefined;\n const streamMode =\n typeof (record.stream as { mode?: unknown } | undefined)?.mode === 'string'\n ? String((record.stream as { mode?: unknown }).mode)\n : undefined;\n const chunkText = readResultChunkText(record);\n const shouldAppend =\n (action ? STREAM_APPEND_MODES.has(action) : false) ||\n (streamMode ? STREAM_APPEND_MODES.has(streamMode) : false);\n\n if (source === 'agent-run') {\n if (action === 'final') {\n if (!chunkText.trim()) return { type: 'noop' };\n return { type: 'result', text: chunkText, mode: 'replace', messageId };\n }\n if (shouldAppend) {\n if (!chunkText) return { type: 'noop' };\n return { type: 'result', text: chunkText, mode: 'append', messageId };\n }\n if (chunkText) {\n return { type: 'result', text: chunkText, mode: 'append', messageId };\n }\n }\n\n if ((source === 'message' || nameLooksLikeMessage(record)) && chunkText) {\n return { type: 'result', text: chunkText, mode: 'append', messageId };\n }\n\n if (chunkText) {\n return {\n type: 'result',\n text: chunkText,\n mode: shouldAppend ? 'append' : 'append',\n messageId,\n };\n }\n }\n\n const plain = readContentField(data);\n if (plain) {\n return { type: 'result', text: plain, mode: 'append', messageId };\n }\n\n return { type: 'noop' };\n}\n\nfunction parseWriteConfirmationEnvelope(\n parsed: Record<string, unknown>,\n): ChatSseUiAction | null {\n const action = typeof parsed.action === 'string' ? parsed.action : undefined;\n const message =\n typeof parsed.message === 'string' ? parsed.message.trim() : '';\n const code = typeof parsed.code === 'string' ? parsed.code : undefined;\n const runId = typeof parsed.runId === 'number' ? parsed.runId : undefined;\n const turnId = typeof parsed.turnId === 'number' ? parsed.turnId : undefined;\n\n if (action === 'confirmation_required' && runId != null && message) {\n return {\n type: 'write-confirmation-required',\n runId,\n turnId,\n message,\n code,\n };\n }\n if (action === 'write_confirmation_cancelled' && message) {\n return {\n type: 'write-confirmation-cancelled',\n runId,\n turnId,\n message,\n code,\n };\n }\n return null;\n}\n\nfunction parseMessageBlocksEnvelope(data: string): ChatSseUiAction {\n const messageId = readMessageId(data);\n const parsed = tryParseJson(data) as Record<string, unknown> | null;\n if (!parsed) return parseResultEnvelope(data);\n if (parsed.source === 'message') return { type: 'noop' };\n\n const writeAction = parseWriteConfirmationEnvelope(parsed);\n if (writeAction) return writeAction;\n\n const actionRaw = parsed.action;\n const action = actionRaw === 'patch' ? 'patch' : actionRaw === 'stream' ? 'stream' : undefined;\n if (!action) return parseResultEnvelope(data);\n\n const runId = typeof parsed.runId === 'number' ? parsed.runId : undefined;\n const turnId = typeof parsed.turnId === 'number' ? parsed.turnId : undefined;\n const stream = (parsed.stream as Record<string, unknown> | undefined) ?? undefined;\n const modeRaw = stream?.mode;\n const streamMode = modeRaw === 'delta' || modeRaw === 'full' || modeRaw === 'patch' ? modeRaw : undefined;\n const seq = typeof stream?.seq === 'number' ? stream.seq : undefined;\n const blocks = Array.isArray(parsed.blocks)\n ? parsed.blocks.filter(\n (item): item is SseMessageBlock =>\n !!item && typeof item === 'object' && typeof (item as { type?: unknown }).type === 'string',\n )\n : undefined;\n const patches = Array.isArray(parsed.patches)\n ? parsed.patches\n .map((item) => {\n if (!item || typeof item !== 'object') return null;\n const row = item as { replaceId?: unknown; block?: unknown };\n if (typeof row.replaceId !== 'string') return null;\n if (!row.block || typeof row.block !== 'object') return null;\n const block = row.block as { type?: unknown };\n if (typeof block.type !== 'string') return null;\n return { replaceId: row.replaceId, block: row.block as SseMessageBlock };\n })\n .filter((item): item is SseMessageBlockPatch => item != null)\n : undefined;\n\n return {\n type: 'message-blocks',\n action,\n runId,\n turnId,\n streamMode,\n seq,\n blocks,\n patches,\n messageId,\n };\n}\n\nfunction nameLooksLikeMessage(record: Record<string, unknown>): boolean {\n const kind = record.type;\n if (typeof kind !== 'string') return false;\n return kind === 'message' || kind === 'result';\n}\n\n/** Map a raw SSE chunk to a UI action. */\nexport function parseChatSseEvent(event: string, data: string): ChatSseUiAction {\n const name = event.trim() || 'message';\n const messageId = readMessageId(data);\n\n switch (name) {\n case 'think':\n return parseThinkEnvelope(data);\n case 'message':\n case 'result': {\n const parsed = name === 'message' ? parseMessageBlocksEnvelope(data) : parseResultEnvelope(data);\n if (parsed.type === 'result' && !parsed.messageId && messageId) {\n return { ...parsed, messageId };\n }\n return parsed;\n }\n case 'message.delta': {\n const text = readContentField(data);\n return text ? { type: 'result', text, mode: 'append', messageId } : { type: 'noop' };\n }\n case 'complete': {\n const parsed = tryParseJson(data) as ServerMessagePayload | null;\n if (parsed && (parsed.content != null || parsed.id != null || parsed.role != null)) {\n return {\n type: 'complete',\n serverMessage: parsed,\n messageId: parsed.id != null ? String(parsed.id) : messageId,\n };\n }\n return { type: 'complete', messageId };\n }\n case 'error': {\n const err = readErrorFromData(data);\n return { type: 'error', message: err.message, code: err.code };\n }\n case 'message.done': {\n const parsed = tryParseJson(data) as ServerMessagePayload | null;\n return {\n type: 'complete',\n serverMessage: parsed ?? undefined,\n messageId: parsed?.id != null ? String(parsed.id) : messageId,\n };\n }\n default:\n return { type: 'noop' };\n }\n}\n","/**\nBase class for all Ky-specific errors. `HTTPError`, `NetworkError`, `TimeoutError`, and `ForceRetryError` extend this class.\n\nYou can use `instanceof KyError` to check if an error originated from Ky, or use the `isKyError()` type guard for cross-realm compatibility and TypeScript type narrowing.\n\nNote: `SchemaValidationError` is intentionally not considered a Ky error. `KyError` covers failures in Ky's HTTP lifecycle (bad status, timeout, retry), while schema validation errors originate from the user-provided schema, not from Ky itself.\n*/\nexport class KyError extends Error {\n name = 'KyError';\n get isKyError() {\n return true;\n }\n}\n//# sourceMappingURL=KyError.js.map","import { KyError } from './KyError.js';\n/**\nError thrown when the response has a non-2xx status code and `throwHttpErrors` is enabled.\n\nThe error has a `response` property with the `Response` object, a `request` property with the `Request` object, an `options` property with the normalized options (either passed to `ky` when creating an instance with `ky.create()` or directly when performing the request), and a `data` property with the pre-parsed response body. For JSON responses (based on `Content-Type`), the body is parsed using the `parseJson` option if set, or `JSON.parse` by default. For other content types, it is set as plain text. If the body is empty or parsing fails, `data` will be `undefined`. To avoid hanging or excessive buffering, `error.data` population is bounded by the request timeout and a 10 MiB response body size limit. The `data` property is populated before `beforeError` hooks run, so hooks can access it.\n\nThe response body is automatically consumed when populating `error.data`, so `error.response.json()` and other body methods will not work. Use `error.data` instead. The `error.response` object is still available for headers, status, etc.\n\nBe aware that some types of errors, such as network errors, inherently mean that a response was not received. In that case, the error will be an instance of `NetworkError` instead of `HTTPError` and will not contain a `response` property.\n*/\nexport class HTTPError extends KyError {\n name = 'HTTPError';\n response;\n request;\n options;\n data;\n constructor(response, request, options) {\n const code = (response.status || response.status === 0) ? response.status : '';\n const title = response.statusText ?? '';\n const status = `${code} ${title}`.trim();\n const reason = status ? `status code ${status}` : 'an unknown error';\n super(`Request failed with ${reason}: ${request.method} ${request.url}`);\n this.response = response;\n this.request = request;\n this.options = options;\n }\n}\n//# sourceMappingURL=HTTPError.js.map","import { KyError } from './KyError.js';\n/**\nError thrown when a network error occurs during the request (e.g., DNS failure, connection refused, offline). It has a `request` property with the `Request` object. The original error is available via the standard `cause` property.\n\nNetwork errors are automatically retried (for retriable methods).\n\nNote: Network errors are detected using runtime-specific heuristics. Unrecognized runtimes may produce errors that are not wrapped in `NetworkError`. Use the `shouldRetry` option to handle such cases.\n*/\nexport class NetworkError extends KyError {\n name = 'NetworkError';\n request;\n constructor(request, options) {\n super(`Request failed due to a network error: ${request.method} ${request.url}`, options);\n this.request = request;\n }\n}\n//# sourceMappingURL=NetworkError.js.map","/**\nWrapper for non-Error values that were thrown.\n\nIn JavaScript, any value can be thrown (not just Error instances). This class wraps such values to ensure consistent error handling.\n*/\nexport class NonError extends Error {\n name = 'NonError';\n value;\n constructor(value) {\n let message = 'Non-error value was thrown';\n // Intentionally minimal as this error is just an edge-case.\n try {\n if (typeof value === 'string') {\n message = value;\n }\n else if (value && typeof value === 'object' && 'message' in value && typeof value.message === 'string') {\n message = value.message;\n }\n }\n catch {\n // Use default message if accessing properties throws\n }\n super(message);\n this.value = value;\n }\n}\n//# sourceMappingURL=NonError.js.map","import { KyError } from './KyError.js';\nimport { NonError } from './NonError.js';\n/**\nError used to signal a forced retry from `afterResponse` hooks.\n\nThis is thrown when `ky.retry()` is returned from an `afterResponse` hook. It is observable in `beforeRetry` and `beforeError` hooks via the `isForceRetryError()` type guard.\n*/\nexport class ForceRetryError extends KyError {\n name = 'ForceRetryError';\n customDelay;\n code;\n customRequest;\n constructor(options) {\n // Runtime protection: wrap non-Error causes in NonError\n // TypeScript type is Error for guidance, but JS users can pass anything\n const cause = options?.cause\n ? (options.cause instanceof Error ? options.cause : new NonError(options.cause))\n : undefined;\n super(options?.code ? `Forced retry: ${options.code}` : 'Forced retry', cause ? { cause } : undefined);\n this.customDelay = options?.delay;\n this.code = options?.code;\n this.customRequest = options?.request;\n }\n}\n//# sourceMappingURL=ForceRetryError.js.map","/**\nThe error thrown when [Standard Schema](https://github.com/standard-schema/standard-schema) validation fails in `.json(schema)`. It has an `issues` property with the validation issues from the schema.\n\nThis error intentionally does not extend `KyError` because it does not represent a failure in Ky's HTTP lifecycle. The request succeeded; the user's schema rejected the data. As such, it is not matched by `isKyError()`.\n\n@example\n```\nimport ky, {SchemaValidationError} from 'ky';\nimport {z} from 'zod';\n\nconst userSchema = z.object({name: z.string()});\n\ntry {\n const user = await ky('/api/user').json(userSchema);\n console.log(user.name);\n} catch (error) {\n if (error instanceof SchemaValidationError) {\n console.error(error.issues);\n }\n}\n```\n*/\nexport class SchemaValidationError extends Error {\n name = 'SchemaValidationError';\n issues;\n constructor(issues) {\n super('Response schema validation failed');\n this.issues = issues;\n }\n}\n//# sourceMappingURL=SchemaValidationError.js.map","import { KyError } from './KyError.js';\n/**\nError thrown when the request times out. It has a `request` property with the `Request` object.\n*/\nexport class TimeoutError extends KyError {\n name = 'TimeoutError';\n request;\n constructor(request) {\n super(`Request timed out: ${request.method} ${request.url}`);\n this.request = request;\n }\n}\n//# sourceMappingURL=TimeoutError.js.map","export const supportsRequestStreams = (() => {\n let duplexAccessed = false;\n let hasContentType = false;\n const supportsReadableStream = typeof globalThis.ReadableStream === 'function';\n const supportsRequest = typeof globalThis.Request === 'function';\n if (supportsReadableStream && supportsRequest) {\n try {\n hasContentType = new globalThis.Request('https://empty.invalid', {\n body: new globalThis.ReadableStream(),\n method: 'POST',\n // @ts-expect-error - Types are outdated.\n get duplex() {\n duplexAccessed = true;\n return 'half';\n },\n }).headers.has('Content-Type');\n }\n catch (error) {\n // QQBrowser on iOS throws \"unsupported BodyInit type\" error (see issue #581)\n if (error instanceof Error && error.message === 'unsupported BodyInit type') {\n return false;\n }\n throw error;\n }\n }\n return duplexAccessed && !hasContentType;\n})();\nexport const supportsAbortController = typeof globalThis.AbortController === 'function';\nexport const supportsAbortSignal = typeof globalThis.AbortSignal === 'function' && typeof globalThis.AbortSignal.any === 'function';\nexport const supportsResponseStreams = typeof globalThis.ReadableStream === 'function';\nexport const supportsFormData = typeof globalThis.FormData === 'function';\nexport const requestMethods = ['get', 'post', 'put', 'patch', 'head', 'delete'];\nconst validate = () => undefined;\nvalidate();\nexport const responseTypes = {\n json: 'application/json',\n text: 'text/*',\n formData: 'multipart/form-data',\n arrayBuffer: '*/*',\n blob: '*/*',\n // Supported in modern Fetch implementations (for example, browsers and recent Node.js/undici).\n // We still feature-check at runtime before exposing the shortcut.\n bytes: '*/*',\n};\n// The maximum value of a 32bit int (see issue #117)\nexport const maxSafeTimeout = 2_147_483_647;\n// Size in bytes of a typical form boundary (e.g., '------WebKitFormBoundaryaxpyiPgbbPti10Rw'), used to help estimate upload size\nexport const usualFormBoundarySize = 40;\n/**\nSymbol that can be returned by a `beforeRetry` hook to stop retrying without throwing an error.\n*/\nexport const stop = Symbol('stop');\n/**\nMarker returned by `ky.retry()` to signal a forced retry from `afterResponse` hooks.\n*/\nexport class RetryMarker {\n options;\n constructor(options) {\n this.options = options;\n }\n}\n/**\nForce a retry from an `afterResponse` hook.\n\nThis allows you to retry a request based on the response content, even if the response has a successful status code. The retry will respect the `retry.limit` option and skip the `shouldRetry` check. The forced retry is observable in `beforeRetry` hooks, where the error will be a `ForceRetryError`.\n\n@param options - Optional configuration for the retry.\n\n@example\n```\nimport ky, {isForceRetryError} from 'ky';\n\nconst api = ky.extend({\n hooks: {\n afterResponse: [\n async ({request, response}) => {\n // Retry based on response body content\n if (response.status === 200) {\n const data = await response.json();\n\n // Simple retry with default delay\n if (data.error?.code === 'TEMPORARY_ERROR') {\n return ky.retry();\n }\n\n // Retry with custom delay from API response\n if (data.error?.code === 'RATE_LIMIT') {\n return ky.retry({\n delay: data.error.retryAfter * 1000,\n code: 'RATE_LIMIT'\n });\n }\n\n // Retry with a modified request (e.g., fallback endpoint)\n if (data.error?.code === 'FALLBACK_TO_BACKUP') {\n return ky.retry({\n request: new Request('https://backup-api.com/endpoint', {\n method: request.method,\n headers: request.headers,\n }),\n code: 'BACKUP_ENDPOINT'\n });\n }\n\n // Retry with refreshed authentication\n if (data.error?.code === 'TOKEN_REFRESH' && data.newToken) {\n return ky.retry({\n request: new Request(request, {\n headers: {\n ...Object.fromEntries(request.headers),\n 'Authorization': `Bearer ${data.newToken}`\n }\n }),\n code: 'TOKEN_REFRESHED'\n });\n }\n\n // Retry with cause to preserve error chain\n try {\n validateResponse(data);\n } catch (error) {\n return ky.retry({\n code: 'VALIDATION_FAILED',\n cause: error\n });\n }\n }\n }\n ],\n beforeRetry: [\n ({error, retryCount}) => {\n // Observable in beforeRetry hooks\n if (isForceRetryError(error)) {\n console.log(`Forced retry #${retryCount}: ${error.message}`);\n // Example output: \"Forced retry #1: Forced retry: RATE_LIMIT\"\n }\n }\n ]\n }\n});\n\nconst response = await api.get('https://example.com/api');\n```\n*/\nexport const retry = (options) => new RetryMarker(options);\nexport const kyOptionKeys = {\n json: true,\n parseJson: true,\n stringifyJson: true,\n searchParams: true,\n baseUrl: true,\n prefix: true,\n retry: true,\n timeout: true,\n totalTimeout: true,\n hooks: true,\n throwHttpErrors: true,\n onDownloadProgress: true,\n onUploadProgress: true,\n fetch: true,\n context: true,\n};\n// Standard RequestInit options that should NOT be passed separately to fetch()\n// because they're already applied to the Request object.\n// Note: `dispatcher` and `priority` are NOT included here - they're fetch-only\n// options that the Request constructor doesn't accept, so they need to be passed\n// separately to fetch().\nexport const requestOptionsRegistry = {\n method: true,\n headers: true,\n body: true,\n mode: true,\n credentials: true,\n cache: true,\n redirect: true,\n referrer: true,\n referrerPolicy: true,\n integrity: true,\n keepalive: true,\n signal: true,\n window: true,\n duplex: true,\n};\n//# sourceMappingURL=constants.js.map","import { usualFormBoundarySize } from '../core/constants.js';\nconst encoder = new TextEncoder();\n// eslint-disable-next-line @typescript-eslint/no-restricted-types\nexport const getBodySize = (body) => {\n if (!body) {\n return 0;\n }\n if (body instanceof FormData) {\n // This is an approximation, as FormData size calculation is not straightforward\n let size = 0;\n for (const [key, value] of body) {\n size += usualFormBoundarySize;\n size += encoder.encode(`Content-Disposition: form-data; name=\"${key}\"`).byteLength;\n size += typeof value === 'string'\n ? encoder.encode(value).byteLength\n : value.size;\n }\n return size;\n }\n if (body instanceof Blob) {\n return body.size;\n }\n if (body instanceof ArrayBuffer || ArrayBuffer.isView(body)) {\n return body.byteLength;\n }\n if (typeof body === 'string') {\n return encoder.encode(body).byteLength;\n }\n if (body instanceof URLSearchParams) {\n return encoder.encode(body.toString()).byteLength;\n }\n return 0;\n};\nconst withProgress = (stream, totalBytes, onProgress) => {\n let previousChunk;\n let transferredBytes = 0;\n return stream.pipeThrough(new TransformStream({\n transform(currentChunk, controller) {\n controller.enqueue(currentChunk);\n if (previousChunk) {\n transferredBytes += previousChunk.byteLength;\n let percent = totalBytes === 0 ? 0 : transferredBytes / totalBytes;\n // Avoid reporting 100% progress before the stream is actually finished (in case totalBytes is inaccurate)\n if (percent >= 1) {\n // Epsilon is used here to get as close as possible to 100% without reaching it.\n // If we were to use 0.99 here, percent could potentially go backwards.\n percent = 1 - Number.EPSILON;\n }\n onProgress?.({ percent, totalBytes: Math.max(totalBytes, transferredBytes), transferredBytes }, previousChunk);\n }\n previousChunk = currentChunk;\n },\n flush() {\n if (previousChunk) {\n transferredBytes += previousChunk.byteLength;\n onProgress?.({ percent: 1, totalBytes: Math.max(totalBytes, transferredBytes), transferredBytes }, previousChunk);\n }\n },\n }));\n};\nexport const streamResponse = (response, onDownloadProgress) => {\n if (!response.body) {\n return response;\n }\n const responseInit = {\n status: response.status,\n statusText: response.statusText,\n headers: response.headers,\n };\n if (response.status === 204) {\n return new Response(null, responseInit);\n }\n const totalBytes = Math.max(0, Number(response.headers.get('content-length')) || 0);\n return new Response(withProgress(response.body, totalBytes, onDownloadProgress), responseInit);\n};\n// eslint-disable-next-line @typescript-eslint/no-restricted-types\nexport const streamRequest = (request, onUploadProgress, originalBody) => {\n if (!request.body) {\n return request;\n }\n // Use original body for size calculation since request.body is already a stream\n const totalBytes = getBodySize(originalBody ?? request.body);\n return new Request(request, {\n // @ts-expect-error - Types are outdated.\n duplex: 'half',\n body: withProgress(request.body, totalBytes, onUploadProgress),\n });\n};\n//# sourceMappingURL=body.js.map","// eslint-disable-next-line @typescript-eslint/no-restricted-types\nexport const isObject = (value) => value !== null && typeof value === 'object';\n//# sourceMappingURL=is.js.map","import { supportsAbortSignal } from '../core/constants.js';\nimport { isObject } from './is.js';\nconst replaceSymbol = Symbol('replaceOption');\nconst getReplaceState = (value) => isObject(value) && value[replaceSymbol] === true\n ? {\n isReplace: true,\n value: value.value,\n }\n : {\n isReplace: false,\n value,\n };\n/**\nWraps a value so that `ky.extend()` will replace the parent value instead of merging with it. Works with hooks, headers, search parameters, context, and any other deep-merged option.\n\nBy default, `.extend()` deep-merges options with the parent instance: hooks get appended, headers get merged, and search parameters get accumulated. Use `replaceOption` when you want to fully replace a merged property instead.\n\n@example\n```\nimport ky, {replaceOption} from 'ky';\n\nconst base = ky.create({\n hooks: {beforeRequest: [addAuth, addTracking]},\n});\n\n// Replaces instead of appending\nconst extended = base.extend({\n hooks: replaceOption({beforeRequest: [onlyThis]}),\n});\n// hooks.beforeRequest is now [onlyThis], not [addAuth, addTracking, onlyThis]\n```\n*/\nexport const replaceOption = (value) => {\n const markedValue = { [replaceSymbol]: true, value };\n return markedValue;\n};\nexport const validateAndMerge = (...sources) => {\n for (const source of sources) {\n if ((!isObject(source) || Array.isArray(source)) && source !== undefined) {\n throw new TypeError('The `options` argument must be an object');\n }\n }\n return deepMerge({}, ...sources);\n};\nexport const mergeHeaders = (source1 = {}, source2 = {}) => {\n const result = new globalThis.Headers(source1);\n const isHeadersInstance = source2 instanceof globalThis.Headers;\n const source = new globalThis.Headers(source2);\n for (const [key, value] of source.entries()) {\n if ((isHeadersInstance && value === 'undefined') || value === undefined) {\n result.delete(key);\n }\n else {\n result.set(key, value);\n }\n }\n return result;\n};\nconst isPlainObject = (value) => {\n if (!isObject(value) || Array.isArray(value)) {\n return false;\n }\n const prototype = Object.getPrototypeOf(value);\n return prototype === Object.prototype || prototype === null;\n};\nexport const cloneShallow = (value) => {\n if (value instanceof URLSearchParams) {\n const copy = new URLSearchParams(value);\n const deleted = value[deletedParametersSymbol];\n if (deleted) {\n // Preserve internal deletion markers so init-hook cloning does not resurrect params removed during option merging.\n copy[deletedParametersSymbol] = new Set(deleted);\n }\n return copy;\n }\n if (value instanceof globalThis.Headers) {\n return new globalThis.Headers(value);\n }\n if (Array.isArray(value)) {\n return [...value];\n }\n if (isPlainObject(value)) {\n const copy = { ...value };\n return copy;\n }\n return value;\n};\nconst normalizeHeaderObject = (headers) => Object.fromEntries(Object.entries(headers).filter((entry) => entry[1] !== undefined));\nconst mergeHeaderContainers = (source1, source2) => {\n if (isPlainObject(source1) && isPlainObject(source2)) {\n return normalizeHeaderObject({ ...source1, ...source2 });\n }\n return mergeHeaders(source1, source2);\n};\nfunction newHookValue(original, incoming, property) {\n return (Object.hasOwn(incoming, property) && incoming[property] === undefined)\n ? []\n : deepMerge(original[property] ?? [], incoming[property] ?? []);\n}\nexport const mergeHooks = (original = {}, incoming = {}) => ({\n init: newHookValue(original, incoming, 'init'),\n beforeRequest: newHookValue(original, incoming, 'beforeRequest'),\n beforeRetry: newHookValue(original, incoming, 'beforeRetry'),\n beforeError: newHookValue(original, incoming, 'beforeError'),\n afterResponse: newHookValue(original, incoming, 'afterResponse'),\n});\nexport const deletedParametersSymbol = Symbol('deletedParameters');\nconst appendSearchParameters = (target, source) => {\n const result = new URLSearchParams();\n const deleted = new Set();\n for (const input of [target, source]) {\n if (input === undefined) {\n continue;\n }\n if (input instanceof URLSearchParams) {\n for (const [key, value] of input.entries()) {\n result.append(key, value);\n deleted.delete(key);\n }\n const inputDeleted = input[deletedParametersSymbol];\n if (inputDeleted) {\n for (const key of inputDeleted) {\n result.delete(key);\n deleted.add(key);\n }\n }\n }\n else if (Array.isArray(input)) {\n for (const pair of input) {\n if (!Array.isArray(pair) || pair.length !== 2) {\n throw new TypeError('Array search parameters must be provided in [[key, value], ...] format');\n }\n result.append(String(pair[0]), String(pair[1]));\n deleted.delete(String(pair[0]));\n }\n }\n else if (isObject(input)) {\n for (const [key, value] of Object.entries(input)) {\n if (value === undefined) {\n result.delete(key);\n deleted.add(key);\n }\n else {\n result.append(key, String(value));\n deleted.delete(key);\n }\n }\n }\n else {\n // String\n const parameters = new URLSearchParams(input);\n for (const [key, value] of parameters.entries()) {\n result.append(key, value);\n deleted.delete(key);\n }\n }\n }\n if (deleted.size > 0) {\n result[deletedParametersSymbol] = deleted;\n }\n return result;\n};\n// TODO: Make this strongly-typed (no `any`).\nexport const deepMerge = (...sources) => {\n let returnValue = {};\n let headers = {};\n let hooks = {};\n let searchParameters;\n const signals = [];\n for (const source of sources) {\n if (Array.isArray(source)) {\n if (!Array.isArray(returnValue)) {\n returnValue = [];\n }\n returnValue = [...returnValue, ...source];\n }\n else if (isObject(source)) {\n for (let [key, value] of Object.entries(source)) {\n // Special handling for AbortSignal instances\n if (key === 'signal' && value instanceof globalThis.AbortSignal) {\n signals.push(value);\n continue;\n }\n const replaceState = getReplaceState(value);\n const { isReplace } = replaceState;\n value = replaceState.value;\n // Special handling for context - shallow merge only\n if (key === 'context') {\n if (value !== undefined && value !== null && (!isObject(value) || Array.isArray(value))) {\n throw new TypeError('The `context` option must be an object');\n }\n // Shallow merge: always create a new object to prevent mutation bugs\n returnValue = {\n ...returnValue,\n context: (value === undefined || value === null)\n ? {}\n : (isReplace\n ? { ...value }\n : { ...returnValue.context, ...value }),\n };\n continue;\n }\n // Special handling for searchParams\n if (key === 'searchParams') {\n if (value === undefined || value === null) {\n // Explicit undefined or null removes searchParams\n searchParameters = undefined;\n }\n else if (isReplace) {\n searchParameters = value;\n }\n else {\n // First source: keep as-is to preserve type (string/object/URLSearchParams)\n // Subsequent sources: merge and convert to URLSearchParams\n searchParameters = searchParameters === undefined ? value : appendSearchParameters(searchParameters, value);\n }\n continue;\n }\n if (isObject(value) && !isReplace && key in returnValue) {\n value = deepMerge(returnValue[key], value);\n }\n returnValue = { ...returnValue, [key]: value };\n }\n if (isObject(source.hooks)) {\n const { value: hookValue, isReplace } = getReplaceState(source.hooks);\n hooks = isReplace\n ? mergeHooks({}, hookValue)\n : mergeHooks(hooks, hookValue);\n returnValue.hooks = hooks;\n }\n if (isObject(source.headers)) {\n const { value: headerValue, isReplace } = getReplaceState(source.headers);\n headers = isReplace\n ? cloneShallow(headerValue)\n : mergeHeaderContainers(headers, headerValue);\n returnValue.headers = headers;\n }\n }\n }\n if (searchParameters !== undefined) {\n returnValue.searchParams = searchParameters;\n }\n if (signals.length > 0) {\n if (signals.length === 1) {\n returnValue.signal = signals[0];\n }\n else if (supportsAbortSignal) {\n returnValue.signal = AbortSignal.any(signals);\n }\n else {\n // When AbortSignal.any is not available, use the last signal\n // This maintains the previous behavior before signal merging was added\n // This can be remove when the `supportsAbortSignal` check is removed.`\n returnValue.signal = signals.at(-1);\n }\n }\n return returnValue;\n};\n//# sourceMappingURL=merge.js.map","import { requestMethods } from '../core/constants.js';\nexport const normalizeRequestMethod = (input) => requestMethods.includes(input) ? input.toUpperCase() : input;\nconst retryMethods = ['get', 'put', 'head', 'delete', 'options', 'trace'];\nconst retryStatusCodes = [408, 413, 429, 500, 502, 503, 504];\nconst retryAfterStatusCodes = [413, 429, 503];\nconst defaultRetryOptions = {\n limit: 2,\n methods: retryMethods,\n statusCodes: retryStatusCodes,\n afterStatusCodes: retryAfterStatusCodes,\n maxRetryAfter: Number.POSITIVE_INFINITY,\n backoffLimit: Number.POSITIVE_INFINITY,\n delay: attemptCount => 0.3 * (2 ** (attemptCount - 1)) * 1000,\n jitter: undefined,\n retryOnTimeout: false,\n};\nexport const normalizeRetryOptions = (retry = {}) => {\n if (typeof retry === 'number') {\n return {\n ...defaultRetryOptions,\n limit: retry,\n };\n }\n if (retry.methods && !Array.isArray(retry.methods)) {\n throw new Error('retry.methods must be an array');\n }\n if (retry.statusCodes && !Array.isArray(retry.statusCodes)) {\n throw new Error('retry.statusCodes must be an array');\n }\n const normalizedRetry = Object.fromEntries(Object.entries({\n ...retry,\n methods: retry.methods?.map(method => method.toLowerCase()),\n }).filter(([, value]) => value !== undefined));\n return {\n ...defaultRetryOptions,\n ...normalizedRetry,\n };\n};\n//# sourceMappingURL=normalize.js.map","import { TimeoutError } from '../errors/TimeoutError.js';\n// `Promise.race()` workaround (#91)\nexport default async function timeout(request, init, abortController, options) {\n return new Promise((resolve, reject) => {\n const timeoutId = setTimeout(() => {\n if (abortController) {\n abortController.abort();\n }\n reject(new TimeoutError(request));\n }, options.timeout);\n void options\n .fetch(request, init)\n .then(resolve)\n .catch(reject)\n .then(() => {\n clearTimeout(timeoutId);\n });\n });\n}\n//# sourceMappingURL=timeout.js.map","// https://github.com/sindresorhus/delay/tree/ab98ae8dfcb38e1593286c94d934e70d14a4e111\nexport default async function delay(ms, { signal }) {\n return new Promise((resolve, reject) => {\n if (signal) {\n signal.throwIfAborted();\n signal.addEventListener('abort', abortHandler, { once: true });\n }\n function abortHandler() {\n clearTimeout(timeoutId);\n reject(signal.reason);\n }\n const timeoutId = setTimeout(() => {\n signal?.removeEventListener('abort', abortHandler);\n resolve();\n }, ms);\n });\n}\n//# sourceMappingURL=delay.js.map","import { kyOptionKeys, requestOptionsRegistry } from '../core/constants.js';\nimport { deletedParametersSymbol } from './merge.js';\nexport const findUnknownOptions = (options) => {\n const unknownOptions = {};\n for (const key in options) {\n // Skip inherited properties\n if (!Object.hasOwn(options, key)) {\n continue;\n }\n // Forward every non-standard, non-Ky option to fetch().\n // We intentionally do not check whether the key also exists on `Request`, because some runtimes\n // patch `Request.prototype` with fetch-only extensions. For example, Next.js adds `next`, and the\n // old `key in request` heuristic dropped it unless Ky kept a special-case allowlist.\n // Passing all non-standard keys makes that allowlist unnecessary and preserves future fetch extensions too.\n if (!(key in requestOptionsRegistry) && !(key in kyOptionKeys)) {\n unknownOptions[key] = options[key];\n }\n }\n return unknownOptions;\n};\nexport const hasSearchParameters = (search) => {\n if (search === undefined) {\n return false;\n }\n // The `typeof array` still gives \"object\", so we need different checking for array.\n if (Array.isArray(search)) {\n return search.length > 0;\n }\n if (search instanceof URLSearchParams) {\n return search.size > 0 || Boolean(search[deletedParametersSymbol]?.size);\n }\n // Record\n if (typeof search === 'object') {\n return Object.keys(search).length > 0;\n }\n if (typeof search === 'string') {\n return search.trim().length > 0;\n }\n return Boolean(search);\n};\n//# sourceMappingURL=options.js.map","// Inlined from https://github.com/sindresorhus/is-network-error v1.3.1\nconst objectToString = Object.prototype.toString;\nconst isError = (value) => objectToString.call(value) === '[object Error]';\nconst errorMessages = new Set([\n 'network error', // Chrome\n 'NetworkError when attempting to fetch resource.', // Firefox\n 'The Internet connection appears to be offline.', // Safari 16\n 'Network request failed', // `cross-fetch`\n 'fetch failed', // Undici (Node.js)\n 'terminated', // Undici (Node.js)\n ' A network error occurred.', // Bun (WebKit) - leading space is intentional\n 'Network connection lost', // Cloudflare Workers (fetch)\n]);\nexport default function isRawNetworkError(error) {\n const isValid = error\n && isError(error)\n && error.name === 'TypeError'\n && typeof error.message === 'string';\n if (!isValid) {\n return false;\n }\n const { message, stack } = error;\n // Safari 17+ has generic message but no stack for network errors\n if (message === 'Load failed') {\n return stack === undefined\n // Sentry adds its own stack trace to the fetch error, so also check for that\n || '__sentry_captured__' in error;\n }\n // Deno network errors start with specific text\n if (message.startsWith('error sending request for url')) {\n return true;\n }\n // Chrome: exact \"Failed to fetch\" or with hostname: \"Failed to fetch (example.com)\"\n if (message === 'Failed to fetch' || (message.startsWith('Failed to fetch (') && message.endsWith(')'))) {\n return true;\n }\n // Standard network error messages\n return errorMessages.has(message);\n}\n//# sourceMappingURL=is-network-error.js.map","import { HTTPError } from '../errors/HTTPError.js';\nimport { NetworkError } from '../errors/NetworkError.js';\nimport { TimeoutError } from '../errors/TimeoutError.js';\nimport { ForceRetryError } from '../errors/ForceRetryError.js';\n// Handles cross-realm cases (e.g., iframes, different JS contexts) where `instanceof` fails.\nconst isErrorType = (error, cls) => error instanceof cls || error?.name === cls.name;\n/**\nType guard to check if an error is a `KyError`.\n\nNote: `SchemaValidationError` is intentionally not considered a Ky error. `KyError` covers failures in Ky's HTTP lifecycle (bad status, timeout, retry), while schema validation errors originate from the user-provided schema, not from Ky itself.\n\n@param error - The error to check\n@returns `true` if the error is a Ky error, `false` otherwise\n\n@example\n```\nimport ky, {isKyError} from 'ky';\ntry {\n const response = await ky.get('/api/data');\n} catch (error) {\n if (isKyError(error)) {\n // Handle Ky-specific errors\n console.log('Ky error occurred:', error.message);\n } else {\n // Handle other errors\n console.log('Unknown error:', error);\n }\n}\n```\n*/\nexport function isKyError(error) {\n return error?.isKyError === true || isHTTPError(error) || isNetworkError(error) || isTimeoutError(error) || isForceRetryError(error);\n}\n/**\nType guard to check if an error is an `HTTPError`.\n\n@param error - The error to check\n@returns `true` if the error is an `HTTPError`, `false` otherwise\n\n@example\n```\nimport ky, {isHTTPError} from 'ky';\ntry {\n const response = await ky.get('/api/data');\n} catch (error) {\n if (isHTTPError(error)) {\n console.log('HTTP error status:', error.response.status);\n }\n}\n```\n*/\nexport function isHTTPError(error) {\n return isErrorType(error, HTTPError);\n}\n/**\nType guard to check if an error is a `NetworkError`.\n\n@param error - The error to check\n@returns `true` if the error is a `NetworkError`, `false` otherwise\n\n@example\n```\nimport ky, {isNetworkError} from 'ky';\ntry {\n const response = await ky.get('/api/data');\n} catch (error) {\n if (isNetworkError(error)) {\n console.log('Network error:', error.request.url);\n }\n}\n```\n*/\nexport function isNetworkError(error) {\n return isErrorType(error, NetworkError);\n}\n/**\nType guard to check if an error is a `TimeoutError`.\n\n@param error - The error to check\n@returns `true` if the error is a `TimeoutError`, `false` otherwise\n\n@example\n```\nimport ky, {isTimeoutError} from 'ky';\ntry {\n const response = await ky.get('/api/data', { timeout: 1000 });\n} catch (error) {\n if (isTimeoutError(error)) {\n console.log('Request timed out:', error.request.url);\n }\n}\n```\n*/\nexport function isTimeoutError(error) {\n return isErrorType(error, TimeoutError);\n}\n/**\nType guard to check if an error is a `ForceRetryError`.\n\n@param error - The error to check\n@returns `true` if the error is a `ForceRetryError`, `false` otherwise\n\n@example\n```\nimport ky, {isForceRetryError} from 'ky';\n\nconst api = ky.extend({\n hooks: {\n beforeRetry: [\n ({error, retryCount}) => {\n if (isForceRetryError(error)) {\n console.log(`Forced retry #${retryCount}: ${error.code}`);\n }\n }\n ]\n }\n});\n```\n*/\nexport function isForceRetryError(error) {\n return isErrorType(error, ForceRetryError);\n}\n//# sourceMappingURL=type-guards.js.map","import { HTTPError } from '../errors/HTTPError.js';\nimport { NetworkError } from '../errors/NetworkError.js';\nimport { NonError } from '../errors/NonError.js';\nimport { ForceRetryError } from '../errors/ForceRetryError.js';\nimport { SchemaValidationError } from '../errors/SchemaValidationError.js';\nimport { TimeoutError } from '../errors/TimeoutError.js';\nimport { streamRequest, streamResponse } from '../utils/body.js';\nimport { cloneShallow, mergeHeaders, mergeHooks, deletedParametersSymbol, } from '../utils/merge.js';\nimport { normalizeRequestMethod, normalizeRetryOptions } from '../utils/normalize.js';\nimport timeout from '../utils/timeout.js';\nimport delay from '../utils/delay.js';\nimport { findUnknownOptions, hasSearchParameters } from '../utils/options.js';\nimport isRawNetworkError from '../utils/is-network-error.js';\nimport { isHTTPError, isNetworkError, isTimeoutError } from '../utils/type-guards.js';\nimport { maxSafeTimeout, responseTypes, stop, RetryMarker, supportsAbortController, supportsAbortSignal, supportsFormData, supportsResponseStreams, supportsRequestStreams, } from './constants.js';\nconst maxErrorResponseBodySize = 10 * 1024 * 1024;\nconst prefixUrlRenamedErrorMessage = 'The `prefixUrl` option has been renamed `prefix` in v2 and enhanced to allow slashes in input. See also the new `baseUrl` option for improved flexibility with standard URL resolution: https://github.com/sindresorhus/ky#baseurl';\nconst timedOutResponseData = Symbol('timedOutResponseData');\nconst createTextDecoder = (contentType) => {\n const match = /;\\s*charset\\s*=\\s*(?:\"([^\"]+)\"|([^;,\\s]+))/i.exec(contentType);\n const charset = match?.[1] ?? match?.[2];\n if (charset) {\n try {\n return new TextDecoder(charset);\n }\n catch { }\n }\n return new TextDecoder();\n};\nconst invalidSchemaMessage = 'The `schema` argument must follow the Standard Schema specification';\nconst cloneRetryOptions = (retry) => {\n if (typeof retry !== 'object') {\n return retry;\n }\n // Clone nested arrays too so init hooks can mutate retry config without leaking state across requests.\n return {\n ...retry,\n ...(retry.methods && { methods: [...retry.methods] }),\n ...(retry.statusCodes && { statusCodes: [...retry.statusCodes] }),\n ...(retry.afterStatusCodes && { afterStatusCodes: [...retry.afterStatusCodes] }),\n };\n};\nconst objectToString = Object.prototype.toString;\nconst isRequestInstance = (value) => value instanceof globalThis.Request || objectToString.call(value) === '[object Request]';\n// Accepted custom responses are treated as full Responses throughout Ky.\n// If a custom fetch returns one, it must behave like a Response for cloning,\n// body consumption, `json()` decoration, and any enabled stream features.\nconst isResponseInstance = (value) => value instanceof globalThis.Response || objectToString.call(value) === '[object Response]';\nconst cloneSearchParametersForInitHook = (searchParameters) => {\n if (Array.isArray(searchParameters)) {\n return searchParameters.map(parameter => [...parameter]);\n }\n return cloneShallow(searchParameters);\n};\n// Shallow-clone mutable option properties so init hook mutations don't leak across requests.\nfunction cloneInitHookOptions(options) {\n const clonedOptions = {\n ...options,\n json: cloneShallow(options.json),\n context: cloneShallow(options.context),\n headers: cloneShallow(options.headers),\n searchParams: cloneSearchParametersForInitHook(options.searchParams),\n };\n if (options.retry !== undefined) {\n clonedOptions.retry = cloneRetryOptions(options.retry);\n }\n return clonedOptions;\n}\nconst validateJsonWithSchema = async (jsonValue, schema) => {\n if ((typeof schema !== 'object'\n && typeof schema !== 'function')\n || schema === null) {\n throw new TypeError(invalidSchemaMessage);\n }\n const standardSchema = schema['~standard'];\n if (typeof standardSchema !== 'object'\n || standardSchema === null\n || typeof standardSchema.validate !== 'function') {\n throw new TypeError(invalidSchemaMessage);\n }\n const validationResult = await standardSchema.validate(jsonValue);\n if (validationResult.issues) {\n throw new SchemaValidationError(validationResult.issues);\n }\n return validationResult.value;\n};\nexport class Ky {\n static create(input, options) {\n const initHooks = options.hooks?.init ?? [];\n const initHookOptions = initHooks.length > 0 ? cloneInitHookOptions(options) : options;\n for (const hook of initHooks) {\n hook(initHookOptions);\n }\n const ky = new Ky(input, initHookOptions);\n const function_ = async () => {\n if (typeof ky.#options.timeout === 'number' && ky.#options.timeout > maxSafeTimeout) {\n throw new RangeError(`The \\`timeout\\` option cannot be greater than ${maxSafeTimeout}`);\n }\n if (typeof ky.#options.totalTimeout === 'number' && ky.#options.totalTimeout > maxSafeTimeout) {\n throw new RangeError(`The \\`totalTimeout\\` option cannot be greater than ${maxSafeTimeout}`);\n }\n // Delay the fetch so that body method shortcuts can set the Accept header\n await Promise.resolve();\n const beforeRequestResponse = await ky.#runBeforeRequestHooks();\n let response = beforeRequestResponse ?? await ky.#retry(async () => ky.#fetch());\n let responseFromHook = beforeRequestResponse !== undefined\n || ky.#consumeReturnedResponseFromBeforeRetryHook();\n for (;;) {\n // `undefined` means a hook stopped the flow without providing a response.\n // Non-native Responses still continue through Ky if they pass `isResponseInstance()`.\n if (response === undefined) {\n return response;\n }\n if (isResponseInstance(response)) {\n try {\n // eslint-disable-next-line no-await-in-loop\n response = await ky.#runAfterResponseHooks(response);\n }\n catch (error) {\n if (!(error instanceof ForceRetryError)) {\n throw error;\n }\n // eslint-disable-next-line no-await-in-loop\n const retriedResponse = await ky.#retryFromError(error, async () => ky.#fetch());\n if (retriedResponse === undefined) {\n return retriedResponse;\n }\n response = retriedResponse;\n responseFromHook = ky.#consumeReturnedResponseFromBeforeRetryHook();\n continue;\n }\n }\n const currentResponse = response;\n // Opaque responses (`response.type === 'opaque'`) from `no-cors` requests always have `status: 0` and `ok: false`, but this is not a failure - the actual status is hidden by the browser.\n if (!currentResponse.ok && currentResponse.type !== 'opaque' && (typeof ky.#options.throwHttpErrors === 'function'\n ? ky.#options.throwHttpErrors(currentResponse.status)\n : ky.#options.throwHttpErrors)) {\n // `request` must reflect the request that actually failed, but `options` stays as Ky's\n // normalized options snapshot. Replacement `Request` instances do not preserve the\n // original `BodyInit`, so trying to make `options` mirror arbitrary requests would be lossy.\n const httpError = new HTTPError(currentResponse, ky.#getResponseRequest(currentResponse), ky.#getNormalizedOptions());\n const errorToThrow = httpError;\n // eslint-disable-next-line no-await-in-loop\n httpError.data = await ky.#getResponseData(currentResponse);\n if (responseFromHook) {\n throw errorToThrow;\n }\n // eslint-disable-next-line no-await-in-loop\n const retriedResponse = await ky.#retryFromError(httpError, async () => ky.#fetch());\n if (retriedResponse === undefined) {\n return retriedResponse;\n }\n response = retriedResponse;\n responseFromHook = ky.#consumeReturnedResponseFromBeforeRetryHook();\n continue;\n }\n break;\n }\n if (!isResponseInstance(response)) {\n return response;\n }\n ky.#decorateResponse(response);\n // If `onDownloadProgress` is passed, it uses the stream API internally\n if (ky.#options.onDownloadProgress) {\n if (typeof ky.#options.onDownloadProgress !== 'function') {\n throw new TypeError('The `onDownloadProgress` option must be a function');\n }\n if (!supportsResponseStreams) {\n throw new Error('Streams are not supported in your environment. `ReadableStream` is missing.');\n }\n const progressResponse = response.clone();\n ky.#cancelResponseBody(response);\n return streamResponse(progressResponse, ky.#options.onDownloadProgress);\n }\n return response;\n };\n const result = (async () => {\n try {\n return await function_();\n }\n catch (error) {\n // Non-Error throws (e.g., thrown strings) pass through unchanged\n if (!(error instanceof Error)) {\n throw error;\n }\n // Errors thrown by beforeRetry hooks must propagate unchanged.\n if (ky.#beforeRetryHookErrors.has(error)) {\n throw error;\n }\n let processedError = error;\n for (const hook of ky.#options.hooks.beforeError) {\n // `request` is the current failing request. `options` intentionally remains the\n // stable normalized Ky options snapshot for the same reason as `HTTPError` above.\n // eslint-disable-next-line no-await-in-loop\n const hookResult = await hook({\n request: ky.request,\n options: ky.#getNormalizedOptions(),\n error: processedError,\n retryCount: ky.#retryCount,\n });\n // Only overwrite if the hook returns a valid Error instance.\n if (hookResult instanceof Error) {\n processedError = hookResult;\n }\n }\n throw processedError;\n }\n finally {\n const originalRequest = ky.#originalRequest;\n // Ignore cancellation errors from already-locked or already-consumed streams.\n ky.#cancelBody(originalRequest?.body ?? undefined);\n // Only cancel the current request body if it's distinct from the original (i.e. it was cloned for retries).\n if (ky.request !== originalRequest) {\n ky.#cancelBody(ky.request.body ?? undefined);\n }\n }\n })();\n for (const [type, mimeType] of Object.entries(responseTypes)) {\n // Only expose `.bytes()` when the environment implements it.\n if (type === 'bytes'\n && typeof globalThis.Response?.prototype?.bytes !== 'function') {\n continue;\n }\n result[type] = async (schema) => {\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing\n ky.request.headers.set('accept', ky.request.headers.get('accept') || mimeType);\n const response = await result;\n if (type !== 'json') {\n return response[type]();\n }\n const text = await response.text();\n if (text === '') {\n if (schema !== undefined) {\n return validateJsonWithSchema(undefined, schema);\n }\n return JSON.parse(text);\n }\n const jsonValue = initHookOptions.parseJson\n ? await initHookOptions.parseJson(text, { request: ky.#getResponseRequest(response), response })\n : JSON.parse(text);\n return schema === undefined ? jsonValue : validateJsonWithSchema(jsonValue, schema);\n };\n }\n return result;\n }\n // eslint-disable-next-line unicorn/prevent-abbreviations\n static #normalizeSearchParams(searchParams) {\n // Filter out undefined values from plain objects\n if (searchParams && typeof searchParams === 'object' && !Array.isArray(searchParams) && !(searchParams instanceof URLSearchParams)) {\n return Object.fromEntries(Object.entries(searchParams).filter(([, value]) => value !== undefined));\n }\n return searchParams;\n }\n request;\n #abortController;\n #retryCount = 0;\n // eslint-disable-next-line @typescript-eslint/prefer-readonly -- False positive: #input is reassigned on line 202\n #input;\n #options;\n #originalRequest;\n #userProvidedAbortSignal;\n #beforeRetryHookErrors = new WeakSet();\n #cachedNormalizedOptions;\n #startTime;\n #returnedResponseFromBeforeRetryHook = false;\n #responseRequests = new WeakMap();\n // eslint-disable-next-line complexity\n constructor(input, options = {}) {\n this.#input = input;\n if (Object.hasOwn(options, 'prefixUrl')) {\n throw new Error(prefixUrlRenamedErrorMessage);\n }\n this.#options = {\n ...options,\n headers: mergeHeaders(this.#input.headers, options.headers),\n hooks: mergeHooks({}, options.hooks),\n method: normalizeRequestMethod(options.method ?? this.#input.method ?? 'GET'),\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing\n prefix: String(options.prefix || ''),\n retry: normalizeRetryOptions(options.retry),\n throwHttpErrors: options.throwHttpErrors ?? true,\n timeout: options.timeout ?? 10_000,\n totalTimeout: options.totalTimeout ?? false,\n fetch: options.fetch ?? globalThis.fetch.bind(globalThis),\n context: options.context ?? {},\n };\n if (typeof this.#input !== 'string' && !(this.#input instanceof URL || this.#input instanceof globalThis.Request)) {\n throw new TypeError('`input` must be a string, URL, or Request');\n }\n if (typeof this.#input === 'string') {\n if (this.#options.prefix) {\n const normalizedPrefix = this.#options.prefix.replace(/\\/+$/, '');\n const normalizedInput = this.#input.replace(/^\\/+/, '');\n this.#input = `${normalizedPrefix}/${normalizedInput}`;\n }\n if (this.#options.baseUrl) {\n let absoluteInput;\n try {\n absoluteInput = new URL(this.#input);\n }\n catch { }\n if (!absoluteInput) {\n this.#input = new URL(this.#input, (new Request(this.#options.baseUrl)).url);\n }\n }\n }\n if (supportsAbortController && supportsAbortSignal) {\n this.#userProvidedAbortSignal = this.#options.signal ?? this.#input.signal;\n this.#abortController = new globalThis.AbortController();\n this.#options.signal = this.#createManagedSignal();\n }\n if (supportsRequestStreams) {\n // @ts-expect-error - Types are outdated.\n this.#options.duplex = 'half';\n }\n if (this.#options.json !== undefined) {\n this.#options.body = this.#options.stringifyJson?.(this.#options.json) ?? JSON.stringify(this.#options.json);\n this.#options.headers.set('content-type', this.#options.headers.get('content-type') ?? 'application/json');\n }\n // To provide correct form boundary, Content-Type header should be deleted when creating Request from another Request with FormData/URLSearchParams body\n // Only delete if user didn't explicitly provide a custom content-type\n const userProvidedContentType = options.headers && new globalThis.Headers(options.headers).has('content-type');\n if (this.#input instanceof globalThis.Request\n && ((supportsFormData && this.#options.body instanceof globalThis.FormData) || this.#options.body instanceof URLSearchParams)\n && !userProvidedContentType) {\n this.#options.headers.delete('content-type');\n }\n this.request = new globalThis.Request(this.#input, this.#options);\n if (hasSearchParameters(this.#options.searchParams)) {\n const url = new URL(this.request.url);\n const deleted = this.#options.searchParams?.[deletedParametersSymbol];\n if (deleted) {\n // Remove keys from the input URL first so later searchParams entries can intentionally re-add them.\n for (const key of deleted) {\n url.searchParams.delete(key);\n }\n }\n if (typeof this.#options.searchParams === 'string') {\n const stringSearchParameters = this.#options.searchParams.replace(/^\\?/, '');\n if (stringSearchParameters !== '') {\n url.search = url.search ? `${url.search}&${stringSearchParameters}` : `?${stringSearchParameters}`;\n }\n }\n else {\n const optionsSearchParameters = new URLSearchParams(Ky.#normalizeSearchParams(this.#options.searchParams));\n for (const [key, value] of optionsSearchParameters.entries()) {\n url.searchParams.append(key, value);\n }\n }\n if (this.#options.searchParams\n && typeof this.#options.searchParams === 'object'\n && !Array.isArray(this.#options.searchParams)\n && !(this.#options.searchParams instanceof URLSearchParams)) {\n for (const [key, value] of Object.entries(this.#options.searchParams)) {\n if (value === undefined) {\n url.searchParams.delete(key);\n }\n }\n }\n // Recreate request with the updated URL. We already have all options in this.#options, including duplex.\n this.request = new globalThis.Request(url, this.#options);\n }\n if (this.#options.onUploadProgress && typeof this.#options.onUploadProgress !== 'function') {\n throw new TypeError('The `onUploadProgress` option must be a function');\n }\n // `totalTimeout` starts when the request pipeline is created, so it also includes\n // Ky's internal scheduling and user hook time before the first fetch attempt.\n this.#startTime = typeof this.#options.totalTimeout === 'number' ? this.#getCurrentTime() : undefined;\n }\n #calculateDelay() {\n const retryDelay = this.#options.retry.delay(this.#retryCount + 1);\n let jitteredDelay = retryDelay;\n if (this.#options.retry.jitter === true) {\n jitteredDelay = Math.random() * retryDelay;\n }\n else if (typeof this.#options.retry.jitter === 'function') {\n jitteredDelay = this.#options.retry.jitter(retryDelay);\n if (!Number.isFinite(jitteredDelay) || jitteredDelay < 0) {\n jitteredDelay = retryDelay;\n }\n }\n return Math.min(this.#options.retry.backoffLimit, jitteredDelay);\n }\n async #calculateRetryDelay(error) {\n if (this.#retryCount >= this.#options.retry.limit) {\n throw error;\n }\n // Wrap non-Error throws to ensure consistent error handling\n const errorObject = error instanceof Error ? error : new NonError(error);\n // Handle forced retry from afterResponse hook - skip method check and shouldRetry\n if (errorObject instanceof ForceRetryError) {\n return errorObject.customDelay ?? this.#calculateDelay();\n }\n // Check if method is retriable for non-forced retries\n if (!this.#options.retry.methods.includes(this.request.method.toLowerCase())) {\n throw error;\n }\n // User-provided shouldRetry function takes precedence over default checks (retryOnTimeout, status codes, etc.)\n if (this.#options.retry.shouldRetry !== undefined) {\n const result = await this.#options.retry.shouldRetry({ error: errorObject, retryCount: this.#retryCount + 1 });\n // Strict boolean checking - only exact true/false are handled specially\n if (result === false) {\n throw error;\n }\n if (result === true) {\n // Force retry - skip all other validation and return delay\n return this.#calculateDelay();\n }\n // If undefined or any other value, fall through to default behavior\n }\n // Default timeout behavior\n if (isTimeoutError(error)) {\n if (!this.#options.retry.retryOnTimeout) {\n throw error;\n }\n return this.#calculateDelay();\n }\n if (isHTTPError(error)) {\n if (!this.#options.retry.statusCodes.includes(error.response.status)) {\n throw error;\n }\n const retryAfter = error.response.headers.get('Retry-After')\n ?? error.response.headers.get('RateLimit-Reset')\n ?? error.response.headers.get('X-RateLimit-Retry-After') // Symfony-based services\n ?? error.response.headers.get('X-RateLimit-Reset') // GitHub\n ?? error.response.headers.get('X-Rate-Limit-Reset'); // Twitter\n if (retryAfter && this.#options.retry.afterStatusCodes.includes(error.response.status)) {\n let after = Number(retryAfter) * 1000;\n if (Number.isNaN(after)) {\n after = Date.parse(retryAfter) - Date.now();\n }\n else if (after >= Date.parse('2024-01-01')) {\n // A large number is treated as a timestamp (fixed threshold protects against clock skew)\n after -= Date.now();\n }\n if (!Number.isFinite(after)) {\n return Math.min(this.#options.retry.maxRetryAfter, this.#calculateDelay());\n }\n after = Math.max(0, after);\n // Don't apply jitter when server provides explicit retry timing\n return Math.min(this.#options.retry.maxRetryAfter, after);\n }\n if (error.response.status === 413) {\n throw error;\n }\n return this.#calculateDelay();\n }\n // Only retry known retriable error types. Unknown errors (e.g., programming bugs) are not retried.\n if (!isNetworkError(error)) {\n throw error;\n }\n return this.#calculateDelay();\n }\n #decorateResponse(response) {\n const request = this.#getResponseRequest(response);\n if (this.#options.parseJson) {\n response.json = async () => {\n const text = await response.text();\n if (text === '') {\n return JSON.parse(text);\n }\n return this.#options.parseJson(text, { request, response });\n };\n }\n return response;\n }\n async #getResponseData(response) {\n // Even with request timeouts disabled, bound error-body reads so retries and error propagation\n // cannot be stalled indefinitely by never-ending response streams.\n const text = await this.#readResponseText(response, this.#getErrorDataTimeout());\n if (text === timedOutResponseData) {\n this.#throwIfTotalTimeoutExhausted();\n return undefined;\n }\n if (!text) {\n return undefined;\n }\n if (!this.#isJsonContentType(response.headers.get('content-type') ?? '')) {\n return text;\n }\n const data = await this.#parseJson(text, response, this.#getErrorDataTimeout(), this.#getResponseRequest(response));\n if (data === timedOutResponseData) {\n this.#throwIfTotalTimeoutExhausted();\n return undefined;\n }\n return data;\n }\n #getErrorDataTimeout() {\n const errorDataTimeout = this.#options.timeout === false ? 10_000 : this.#options.timeout;\n const remainingTotal = this.#getRemainingTotalTimeout();\n if (remainingTotal === undefined) {\n return errorDataTimeout;\n }\n if (remainingTotal <= 0) {\n throw new TimeoutError(this.request);\n }\n return Math.min(errorDataTimeout, remainingTotal);\n }\n #isJsonContentType(contentType) {\n // Match JSON subtypes like `json`, `problem+json`, and `vnd.api+json`.\n const mimeType = (contentType.split(';', 1)[0] ?? '').trim().toLowerCase();\n return /\\/(?:.*[.+-])?json$/.test(mimeType);\n }\n async #readResponseText(response, timeoutMs) {\n const { body } = response;\n if (!body) {\n try {\n return await response.text();\n }\n catch {\n return undefined;\n }\n }\n let reader;\n try {\n reader = body.getReader();\n }\n catch {\n // Another consumer already locked the stream.\n return undefined;\n }\n const decoder = createTextDecoder(response.headers.get('content-type') ?? '');\n const chunks = [];\n let totalBytes = 0;\n const readAll = (async () => {\n try {\n for (;;) {\n // eslint-disable-next-line no-await-in-loop\n const { done, value } = await reader.read();\n if (done) {\n break;\n }\n totalBytes += value.byteLength;\n if (totalBytes > maxErrorResponseBodySize) {\n void reader.cancel().catch(() => undefined);\n return undefined;\n }\n chunks.push(decoder.decode(value, { stream: true }));\n }\n }\n catch {\n return undefined;\n }\n chunks.push(decoder.decode());\n return chunks.join('');\n })();\n const timeoutPromise = new Promise(resolve => {\n const timeoutId = setTimeout(() => {\n resolve(timedOutResponseData);\n }, timeoutMs);\n void readAll.finally(() => {\n clearTimeout(timeoutId);\n });\n });\n const result = await Promise.race([readAll, timeoutPromise]);\n if (result === timedOutResponseData) {\n void reader.cancel().catch(() => undefined);\n }\n return result;\n }\n async #parseJson(text, response, timeoutMs, request) {\n let timeoutId;\n try {\n return await Promise.race([\n Promise.resolve().then(() => this.#options.parseJson\n ? this.#options.parseJson(text, { request, response })\n : JSON.parse(text)),\n new Promise(resolve => {\n timeoutId = setTimeout(() => {\n resolve(timedOutResponseData);\n }, timeoutMs);\n }),\n ]);\n }\n catch {\n return undefined;\n }\n finally {\n clearTimeout(timeoutId);\n }\n }\n #cancelBody(body) {\n if (!body) {\n return;\n }\n // Ignore cancellation failures from already-locked or already-consumed streams.\n void body.cancel().catch(() => undefined);\n }\n #cancelResponseBody(response) {\n // Ignore cancellation failures from already-locked or already-consumed streams.\n this.#cancelBody(response.body ?? undefined);\n }\n #createManagedSignal() {\n return this.#userProvidedAbortSignal\n ? AbortSignal.any([this.#userProvidedAbortSignal, this.#abortController.signal])\n : this.#abortController.signal;\n }\n #throwIfTotalTimeoutExhausted() {\n const remaining = this.#getRemainingTotalTimeout();\n if (remaining !== undefined && remaining <= 0) {\n throw new TimeoutError(this.request);\n }\n }\n async #runBeforeRequestHooks() {\n for (const hook of this.#options.hooks.beforeRequest) {\n // eslint-disable-next-line no-await-in-loop\n const result = await hook({\n request: this.request,\n options: this.#getNormalizedOptions(),\n retryCount: 0,\n });\n if (isRequestInstance(result)) {\n this.#assignRequest(result);\n }\n else if (isResponseInstance(result)) {\n return result;\n }\n }\n return undefined;\n }\n async #runAfterResponseHooks(response) {\n const responseRequest = this.#getResponseRequest(response);\n for (const hook of this.#options.hooks.afterResponse) {\n const hookResponse = this.#setResponseRequest(response.clone(), responseRequest);\n this.#decorateResponse(hookResponse);\n let modifiedResponse;\n try {\n // eslint-disable-next-line no-await-in-loop\n modifiedResponse = await hook({\n request: this.request,\n options: this.#getNormalizedOptions(),\n response: hookResponse,\n retryCount: this.#retryCount,\n });\n }\n catch (error) {\n // Cancel both responses to prevent memory leaks when hook throws\n if (hookResponse !== response) {\n this.#cancelResponseBody(hookResponse);\n }\n this.#cancelResponseBody(response);\n throw error;\n }\n if (modifiedResponse instanceof RetryMarker) {\n // Cancel both the cloned response passed to the hook and the current response to prevent resource leaks (especially important in Deno/Bun).\n // Do not await cancellation since hooks can clone the response, leaving extra tee branches that keep cancel promises pending per the Streams spec.\n if (hookResponse !== response) {\n this.#cancelResponseBody(hookResponse);\n }\n this.#cancelResponseBody(response);\n throw new ForceRetryError(modifiedResponse.options);\n }\n const nextResponse = isResponseInstance(modifiedResponse)\n ? this.#setResponseRequest(modifiedResponse, responseRequest)\n : response;\n // Cancel any response bodies we won't use to prevent memory leaks.\n // Uses fire-and-forget since hooks may have cloned the response, creating tee branches that block cancellation.\n // If the hook wrapped an existing body into a new Response, both Response objects can still point at the same stream.\n if (hookResponse !== response && hookResponse !== nextResponse && hookResponse.body !== nextResponse.body) {\n this.#cancelResponseBody(hookResponse);\n }\n if (response !== nextResponse && response.body !== nextResponse.body) {\n this.#cancelResponseBody(response);\n }\n response = nextResponse;\n }\n return response;\n }\n async #retry(function_) {\n try {\n return await function_();\n }\n catch (error) {\n return this.#retryFromError(error, function_);\n }\n }\n async #retryFromError(error, function_) {\n this.#returnedResponseFromBeforeRetryHook = false;\n const retryDelay = Math.min(await this.#calculateRetryDelay(error), maxSafeTimeout);\n const delayOptions = { signal: this.#userProvidedAbortSignal };\n const remainingTimeout = this.#getRemainingTotalTimeout();\n if (remainingTimeout !== undefined) {\n if (remainingTimeout <= 0) {\n throw new TimeoutError(this.request);\n }\n // If waiting would consume all remaining budget, time out without starting another request.\n if (retryDelay >= remainingTimeout) {\n await delay(remainingTimeout, delayOptions);\n throw new TimeoutError(this.request);\n }\n }\n // Only use user-provided signal for delay, not our internal abortController\n await delay(retryDelay, delayOptions);\n this.#throwIfTotalTimeoutExhausted();\n // Apply custom request from forced retry before beforeRetry hooks\n // Ensure the custom request has the correct managed signal for timeouts and user aborts\n if (error instanceof ForceRetryError && error.customRequest) {\n const customRequest = new globalThis.Request(error.customRequest, this.#options.signal ? { signal: this.#options.signal } : undefined);\n // Replacement Requests are authoritative by design. Do not rewrite headers here,\n // even for cross-origin retries. Callers using `ky.retry({request})` explicitly\n // opted into the exact Request they constructed.\n this.#assignRequest(customRequest);\n }\n for (const hook of this.#options.hooks.beforeRetry) {\n let hookResult;\n try {\n // eslint-disable-next-line no-await-in-loop\n hookResult = await hook({\n request: this.request,\n options: this.#getNormalizedOptions(),\n error: error,\n retryCount: this.#retryCount + 1,\n });\n }\n catch (hookError) {\n // Preserve the original request error path (`throw error`) so beforeError hooks can still run.\n if (hookError instanceof Error && hookError !== error) {\n this.#beforeRetryHookErrors.add(hookError);\n }\n throw hookError;\n }\n if (isRequestInstance(hookResult)) {\n // Same contract as `ky.retry({request})`: a Request returned from `beforeRetry`\n // is used as-is rather than being sanitized or otherwise rewritten by Ky.\n this.#assignRequest(hookResult);\n break;\n }\n if (isResponseInstance(hookResult)) {\n this.#returnedResponseFromBeforeRetryHook = true;\n this.#retryCount++;\n return hookResult;\n }\n // If `stop` is returned from the hook, the retry process is stopped\n if (hookResult === stop) {\n return;\n }\n }\n this.#throwIfTotalTimeoutExhausted();\n this.#retryCount++;\n return this.#retry(function_);\n }\n #consumeReturnedResponseFromBeforeRetryHook() {\n const value = this.#returnedResponseFromBeforeRetryHook;\n this.#returnedResponseFromBeforeRetryHook = false;\n return value;\n }\n async #fetch() {\n // Reset abortController if it was aborted (happens on timeout retry)\n if (this.#abortController?.signal.aborted) {\n this.#abortController = new globalThis.AbortController();\n this.#options.signal = this.#createManagedSignal();\n // Recreate request with new signal\n this.request = new globalThis.Request(this.request, { signal: this.#options.signal });\n }\n const nonRequestOptions = findUnknownOptions(this.#options);\n const retryRequest = this.#options.retry.limit > 0 ? this.request.clone() : undefined;\n const request = this.#wrapRequestWithUploadProgress(this.request, this.#options.body ?? undefined);\n // Cloning is done here to prepare in advance for retries.\n // Skip cloning when retries are disabled - cloning a streaming body calls ReadableStream#tee()\n // which buffers the entire stream in memory, causing excessive memory usage for large uploads.\n this.#originalRequest = request;\n if (retryRequest) {\n this.request = retryRequest;\n }\n try {\n const remainingTotal = this.#getRemainingTotalTimeout();\n if (remainingTotal !== undefined && remainingTotal <= 0) {\n throw new TimeoutError(this.request);\n }\n const effectiveTimeout = this.#options.timeout === false\n ? remainingTotal\n : (remainingTotal === undefined\n ? this.#options.timeout\n : Math.min(this.#options.timeout, remainingTotal));\n const response = effectiveTimeout === undefined\n ? await this.#options.fetch(request, nonRequestOptions)\n : await timeout(request, nonRequestOptions, this.#abortController, {\n timeout: effectiveTimeout,\n fetch: this.#options.fetch,\n });\n return this.#setResponseRequest(response, request);\n }\n catch (error) {\n if (isRawNetworkError(error)) {\n throw new NetworkError(this.request, { cause: error });\n }\n throw error;\n }\n }\n #getRemainingTotalTimeout() {\n if (this.#startTime === undefined) {\n return undefined;\n }\n const elapsed = this.#getCurrentTime() - this.#startTime;\n return Math.max(0, this.#options.totalTimeout - elapsed);\n }\n #getCurrentTime() {\n return globalThis.performance?.now() ?? Date.now();\n }\n #getNormalizedOptions() {\n if (!this.#cachedNormalizedOptions) {\n // Exclude Ky-specific options that are not part of `RequestInit`.\n const { hooks, json, parseJson, stringifyJson, searchParams, timeout, totalTimeout, throwHttpErrors, fetch, ...normalizedOptions } = this.#options;\n this.#cachedNormalizedOptions = Object.freeze(normalizedOptions);\n }\n return this.#cachedNormalizedOptions;\n }\n #assignRequest(request) {\n this.#cachedNormalizedOptions = undefined;\n this.request = request;\n }\n #getResponseRequest(response) {\n return this.#responseRequests.get(response) ?? this.request;\n }\n #setResponseRequest(response, request) {\n this.#responseRequests.set(response, request);\n return response;\n }\n #wrapRequestWithUploadProgress(request, originalBody) {\n if (!this.#options.onUploadProgress || !request.body || !supportsRequestStreams) {\n return request;\n }\n return streamRequest(request, this.#options.onUploadProgress, originalBody ?? this.#options.body ?? undefined);\n }\n}\n//# sourceMappingURL=Ky.js.map","/*! MIT License © Sindre Sorhus */\nimport { Ky } from './core/Ky.js';\nimport { requestMethods, stop, retry } from './core/constants.js';\nimport { validateAndMerge } from './utils/merge.js';\nconst createInstance = (defaults) => {\n // eslint-disable-next-line @typescript-eslint/promise-function-async\n const ky = (input, options) => Ky.create(input, validateAndMerge(defaults, options));\n for (const method of requestMethods) {\n // eslint-disable-next-line @typescript-eslint/promise-function-async\n ky[method] = (input, options) => Ky.create(input, validateAndMerge(defaults, options, { method }));\n }\n ky.create = (newDefaults) => createInstance(validateAndMerge(newDefaults));\n ky.extend = (newDefaults) => {\n if (typeof newDefaults === 'function') {\n newDefaults = newDefaults(defaults ?? {});\n }\n return createInstance(validateAndMerge(defaults, newDefaults));\n };\n ky.stop = stop;\n ky.retry = retry;\n return ky;\n};\nconst ky = createInstance();\nexport default ky;\nexport { KyError } from './errors/KyError.js';\nexport { HTTPError } from './errors/HTTPError.js';\nexport { SchemaValidationError } from './errors/SchemaValidationError.js';\nexport { NetworkError } from './errors/NetworkError.js';\nexport { TimeoutError } from './errors/TimeoutError.js';\nexport { ForceRetryError } from './errors/ForceRetryError.js';\nexport { isKyError, isHTTPError, isNetworkError, isTimeoutError, isForceRetryError, } from './utils/type-guards.js';\nexport { replaceOption } from './utils/merge.js';\n// Intentionally not exporting this for now as it's just an implementation detail and we don't want to commit to a certain API yet at least.\n// export {NonError} from './errors/NonError.js';\n//# sourceMappingURL=index.js.map","import { AgentChatError } from '../errors';\n\ninterface ServerErrorBody {\n error?: { code?: string; message?: string };\n message?: string | string[];\n data?: { message?: string | string[] };\n code?: string;\n}\n\nfunction normalizeServerMessage(value: unknown): string | undefined {\n if (typeof value === 'string') return value;\n if (Array.isArray(value)) {\n const joined = value.filter((item): item is string => typeof item === 'string').join('; ');\n return joined || undefined;\n }\n return undefined;\n}\n\nfunction isJsonContent(headers: Headers): boolean {\n const ct = headers.get('content-type') ?? '';\n return ct.includes('application/json');\n}\n\nexport async function readHttpError(response: Response): Promise<AgentChatError> {\n let serverCode: string | undefined;\n let serverMessage: string | undefined;\n try {\n if (isJsonContent(response.headers)) {\n const body = (await response.json()) as ServerErrorBody;\n serverCode = body.error?.code ?? body.code;\n serverMessage =\n normalizeServerMessage(body.error?.message) ??\n normalizeServerMessage(body.message) ??\n normalizeServerMessage(body.data?.message);\n } else {\n serverMessage = (await response.text()).slice(0, 500);\n }\n } catch {\n // ignore parse errors and fall back to status text\n }\n\n const message = serverMessage\n ? `HTTP ${response.status}: ${serverMessage}`\n : `HTTP ${response.status}: ${response.statusText || 'request failed'}`;\n\n return new AgentChatError('TRANSPORT_FAILED', message, {\n details: {\n status: response.status,\n serverCode,\n url: response.url,\n },\n });\n}\n\nexport function toTransportAbortError(err: unknown, label = 'Request aborted'): AgentChatError {\n return new AgentChatError('TRANSPORT_ABORTED', label, { cause: err });\n}\n\nexport function toNetworkError(err: unknown, label = 'Network error'): AgentChatError {\n return new AgentChatError('TRANSPORT_FAILED', label, { cause: err });\n}\n\nexport function isAbortError(err: unknown): boolean {\n if (err instanceof AgentChatError && err.code === 'TRANSPORT_ABORTED') return true;\n const name = (err as { name?: string })?.name;\n return name === 'AbortError';\n}\n","import { createParser, type EventSourceMessage } from 'eventsource-parser';\nimport { AgentChatError } from '../errors';\nimport { readHttpError, toNetworkError } from './errors';\nimport type { HttpStreamOptions, SseEventChunk } from './types';\n\nfunction buildUrl(apiBase: string, path: string): string {\n const base = apiBase.replace(/\\/+$/, '');\n const tail = path.startsWith('/') ? path : `/${path}`;\n return `${base}${tail}`;\n}\n\nexport async function* readSseStream(\n fetchImpl: typeof fetch,\n url: string,\n headers: Record<string, string>,\n init: HttpStreamOptions = {},\n): AsyncIterable<SseEventChunk> {\n const method = init.method ?? (init.body !== undefined ? 'POST' : 'GET');\n\n const requestHeaders = new Headers(headers);\n for (const [key, value] of Object.entries(init.headers ?? {})) {\n requestHeaders.set(key, value);\n }\n requestHeaders.set('accept', 'text/event-stream');\n\n let body: BodyInit | undefined;\n if (init.body !== undefined && method !== 'GET' && method !== 'HEAD') {\n body = typeof init.body === 'string' ? init.body : JSON.stringify(init.body);\n if (!requestHeaders.has('content-type') && typeof init.body !== 'string') {\n requestHeaders.set('content-type', 'application/json');\n }\n }\n\n let response: Response;\n try {\n response = await fetchImpl(url, {\n method,\n headers: requestHeaders,\n body,\n signal: init.signal,\n });\n } catch (err) {\n throw toNetworkError(err);\n }\n\n if (!response.ok) throw await readHttpError(response);\n if (!response.body) {\n throw new AgentChatError('TRANSPORT_FAILED', 'SSE response has no body');\n }\n\n init.onConnected?.();\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder('utf-8');\n const queue: SseEventChunk[] = [];\n const parser = createParser({\n onEvent(evt: EventSourceMessage) {\n const eventName = evt.event?.trim() ? evt.event.trim() : 'message';\n queue.push({ event: eventName, data: evt.data, id: evt.id });\n },\n });\n\n const drainQueue = (): SseEventChunk[] => queue.splice(0, queue.length);\n\n try {\n while (true) {\n const { value, done } = await reader.read();\n if (done) {\n const tail = decoder.decode();\n if (tail) parser.feed(tail);\n for (const chunk of drainQueue()) yield chunk;\n break;\n }\n parser.feed(decoder.decode(value, { stream: true }));\n for (const chunk of drainQueue()) yield chunk;\n }\n } finally {\n reader.releaseLock();\n }\n}\n\nexport { buildUrl };\n","import ky, { HTTPError } from 'ky';\nimport { AgentChatError } from '../errors';\nimport {\n isAbortError,\n readHttpError,\n toNetworkError,\n toTransportAbortError,\n} from './errors';\nimport { buildUrl, readSseStream } from './sse';\nimport type {\n HttpClient,\n HttpClientOptions,\n HttpRequestOptions,\n HttpStreamOptions,\n SseEventChunk,\n} from './types';\n\nfunction normalizePath(path: string): string {\n return path.replace(/^\\//, '');\n}\n\nfunction mergeRequestHeaders(\n defaults: Record<string, string>,\n init: HttpRequestOptions,\n): Record<string, string> {\n const omit = new Set(\n (init.omitDefaultHeaders ?? []).map((name) => name.toLowerCase()),\n );\n const merged: Record<string, string> = {};\n for (const [name, value] of Object.entries(defaults)) {\n if (!omit.has(name.toLowerCase())) merged[name] = value;\n }\n return { ...merged, ...(init.headers ?? {}) };\n}\n\nexport function createHttpClient(options: HttpClientOptions): HttpClient {\n const apiBase = options.apiBase.replace(/\\/+$/, '');\n const defaultHeaders: Record<string, string> = { ...(options.defaultHeaders ?? {}) };\n const fetchImpl =\n options.fetch ?? (typeof fetch !== 'undefined' ? fetch.bind(globalThis) : undefined);\n\n if (!fetchImpl) {\n throw new AgentChatError(\n 'TRANSPORT_FAILED',\n 'No fetch implementation available. Provide one via HttpClientOptions.fetch.',\n );\n }\n\n const api = ky.create({\n baseUrl: `${apiBase}/`,\n retry: { limit: 0 },\n timeout: false,\n fetch: fetchImpl,\n hooks: {\n beforeError: [\n async (error) => {\n if (error instanceof HTTPError) {\n throw await readHttpError(error.response);\n }\n if (isAbortError(error)) {\n throw toTransportAbortError(error);\n }\n throw toNetworkError(error);\n },\n ],\n },\n });\n\n return {\n setDefaultHeader(name, value) {\n if (value === undefined) delete defaultHeaders[name];\n else defaultHeaders[name] = value;\n },\n\n async request<T>(path: string, init: HttpRequestOptions = {}): Promise<T> {\n const method = init.method ?? (init.body !== undefined ? 'POST' : 'GET');\n const headers = {\n accept: 'application/json',\n ...mergeRequestHeaders(defaultHeaders, init),\n };\n\n const searchParams: Record<string, string> | undefined = init.searchParams\n ? Object.fromEntries(\n Object.entries(init.searchParams)\n .filter(([, value]) => value !== undefined)\n .map(([key, value]) => [key, String(value)]),\n )\n : undefined;\n\n try {\n const response = await api(normalizePath(path), {\n method,\n headers,\n searchParams,\n json: method === 'GET' || method === 'HEAD' ? undefined : init.body,\n signal: init.signal,\n });\n\n if (response.status === 204) return undefined as T;\n\n const contentType = response.headers.get('content-type') ?? '';\n if (contentType.includes('application/json')) {\n return await response.json<T>();\n }\n return (await response.text()) as unknown as T;\n } catch (err) {\n if (err instanceof AgentChatError) throw err;\n if (isAbortError(err)) throw toTransportAbortError(err);\n throw toNetworkError(err);\n }\n },\n\n stream(path: string, init: HttpStreamOptions = {}): AsyncIterable<SseEventChunk> {\n const url = buildUrl(apiBase, path);\n return readSseStream(fetchImpl, url, defaultHeaders, init);\n },\n };\n}\n","import { buildAppClientAuthHeaders } from '../auth-headers';\nimport { parseAuthResponse } from '../auth-response';\nimport type { AppClientAuthData } from '../auth-types';\nimport { AgentChatError } from '../errors';\nimport type { HttpClient } from '../http';\n\nexport class AuthService {\n private http: HttpClient;\n\n constructor(http: HttpClient) {\n this.http = http;\n }\n\n /**\n * Exchange `x-app-dsn` (+ optional `x-account-token`) for a user access token\n * via `POST /app-client/auth`.\n */\n async authenticate(dsn: string, accountToken?: string | null): Promise<AppClientAuthData> {\n const body = await this.http.request<unknown>('/app-client/auth', {\n method: 'POST',\n headers: buildAppClientAuthHeaders(dsn, accountToken),\n });\n const authData = parseAuthResponse(body);\n if (!authData?.ok) {\n throw new AgentChatError('AUTH_REQUIRED', 'App client authentication failed');\n }\n return authData;\n }\n\n /** Email/password login via `POST /user/login`. */\n async login(email: string, password: string): Promise<AppClientAuthData> {\n const body = await this.http.request<unknown>('/user/login', {\n method: 'POST',\n body: { email, password },\n });\n const loginAuth = parseAuthResponse(body);\n if (!loginAuth?.accessToken) {\n throw new AgentChatError('LOGIN_FAILED', 'Login succeeded but accessToken is missing');\n }\n return loginAuth;\n }\n}\n","import type { QueryClientAvailableAgents, QueryClientSkillByAgent } from '../../types';\nimport { buildAgentClientHeaders } from '../auth-headers';\nimport type { HttpClient } from '../http';\nimport { DSN_AUTH_HEADER } from '../resolve';\n\nexport type AgentClientAuthContext = () => {\n dsn: string;\n};\n\nfunction compactSearchParams(\n query?: QueryClientAvailableAgents | QueryClientSkillByAgent,\n): Record<string, string | number | boolean | undefined> | undefined {\n if (!query) return undefined;\n const entries = Object.entries(query).filter(\n ([, value]) => value !== undefined && value !== '',\n );\n return entries.length > 0 ? Object.fromEntries(entries) : undefined;\n}\n\nexport class AgentService {\n private http: HttpClient;\n private resolveAuth: AgentClientAuthContext;\n\n constructor(http: HttpClient, resolveAuth: AgentClientAuthContext) {\n this.http = http;\n this.resolveAuth = resolveAuth;\n }\n\n private agentRequestInit(\n dsn: string,\n init: { signal?: AbortSignal; searchParams?: Record<string, string | number | boolean | undefined> },\n ) {\n return {\n method: 'GET' as const,\n signal: init.signal,\n searchParams: init.searchParams,\n omitDefaultHeaders: [DSN_AUTH_HEADER],\n headers: buildAgentClientHeaders(dsn),\n };\n }\n\n /** `GET /agent/client/available` — role-filtered agents for C-end picker. */\n listAvailableAgents(\n query?: QueryClientAvailableAgents,\n signal?: AbortSignal,\n ): Promise<unknown> {\n const { dsn } = this.resolveAuth();\n return this.http.request(\n '/agent/client/available',\n this.agentRequestInit(dsn, { signal, searchParams: compactSearchParams(query) }),\n );\n }\n\n /** `GET /agent/client/list` — all app agents (no role filter); used for empty-state hints. */\n listAllClientAgents(signal?: AbortSignal): Promise<unknown> {\n const { dsn } = this.resolveAuth();\n return this.http.request('/agent/client/list', this.agentRequestInit(dsn, { signal }));\n }\n\n /** `GET /agent/:agentId/skills/client` — role-filtered skills for the selected agent. */\n listClientSkills(\n agentId: string,\n query?: QueryClientSkillByAgent,\n signal?: AbortSignal,\n ): Promise<unknown> {\n const { dsn } = this.resolveAuth();\n const id = agentId.trim();\n return this.http.request(\n `/agent/${id}/skills/client`,\n this.agentRequestInit(dsn, { signal, searchParams: compactSearchParams(query) }),\n );\n }\n}\n","import { AgentChatError } from '../errors';\nimport type { HttpClient, HttpStreamOptions, SseEventChunk } from '../http';\n\nexport const DEFAULT_SESSION_PAGE_SIZE = 20;\nexport const DEFAULT_MESSAGE_PAGE_SIZE = 20;\n\nexport interface MessageSendContext {\n agentId?: string;\n skillId?: string;\n}\n\nfunction isContentFieldRejected(error: unknown): boolean {\n if (!(error instanceof AgentChatError)) return false;\n if (error.code !== 'TRANSPORT_FAILED') return false;\n const msg = error.message.toLowerCase();\n return msg.includes('property content should not exist');\n}\n\nfunction normalizeSessionId(sessionId: string): string {\n return sessionId.trim().toLowerCase();\n}\n\nexport class ChatService {\n private http: HttpClient;\n\n constructor(http: HttpClient) {\n this.http = http;\n }\n\n listSessions(\n page: number,\n size: number,\n signal?: AbortSignal,\n ): Promise<unknown> {\n return this.http.request('/chat', {\n method: 'GET',\n signal,\n searchParams: { page, size },\n });\n }\n\n getSession(\n sessionId: string,\n page: number,\n size: number,\n signal?: AbortSignal,\n ): Promise<unknown> {\n return this.http.request(`/chat/${normalizeSessionId(sessionId)}`, {\n method: 'GET',\n signal,\n searchParams: { page, size },\n });\n }\n\n prepareSession(sessionId: string, signal?: AbortSignal): Promise<void> {\n return this.http.request(`/chat/${normalizeSessionId(sessionId)}/prepare`, {\n method: 'POST',\n signal,\n });\n }\n\n deleteSession(sessionId: string): Promise<void> {\n return this.http.request(`/chat/${normalizeSessionId(sessionId)}`, {\n method: 'DELETE',\n });\n }\n\n streamSession(\n sessionId: string,\n init?: Omit<HttpStreamOptions, 'method'>,\n ): AsyncIterable<SseEventChunk> {\n return this.http.stream(`/chat/${normalizeSessionId(sessionId)}/stream`, init);\n }\n\n /** `POST /chat` — create session with the first user message. */\n createSession(\n content: string,\n signal: AbortSignal,\n context?: MessageSendContext,\n ): Promise<unknown> {\n return this.postUserPayload('/chat', content, signal, context);\n }\n\n /** `POST /chat/{sessionId}/messages` */\n postMessage(\n sessionId: string,\n content: string,\n signal: AbortSignal,\n context?: MessageSendContext,\n ): Promise<unknown> {\n return this.postUserPayload(`/chat/${sessionId}/messages`, content, signal, context);\n }\n\n postWriteConfirmation(\n sessionId: string,\n flags: { confirmWrite?: true; cancelWrite?: true },\n signal: AbortSignal,\n ): Promise<void> {\n const path = `/chat/${normalizeSessionId(sessionId)}/messages`;\n const body = { role: 'user', content: '', ...flags };\n return this.postUserPayloadVoid(path, body, signal);\n }\n\n private async postUserPayload(\n path: string,\n text: string,\n signal: AbortSignal,\n context?: MessageSendContext,\n ): Promise<unknown> {\n const body = this.buildUserMessageBody(text, context);\n try {\n return await this.http.request(path, {\n method: 'POST',\n body,\n signal,\n });\n } catch (error) {\n if (!isContentFieldRejected(error)) throw error;\n const { content, ...rest } = body;\n return this.http.request(path, {\n method: 'POST',\n body: { ...rest, message: content },\n signal,\n });\n }\n }\n\n private buildUserMessageBody(\n text: string,\n context?: MessageSendContext,\n ): Record<string, unknown> {\n const body: Record<string, unknown> = { role: 'user', content: text };\n const agentId = context?.agentId?.trim();\n const skillId = context?.skillId?.trim();\n if (agentId) {\n body.agentId = /^\\d+$/.test(agentId) ? Number(agentId) : agentId;\n }\n if (skillId) {\n body.skillId = /^\\d+$/.test(skillId) ? Number(skillId) : skillId;\n }\n return body;\n }\n\n private async postUserPayloadVoid(\n path: string,\n body: Record<string, unknown>,\n signal: AbortSignal,\n ): Promise<void> {\n try {\n await this.http.request(path, { method: 'POST', body, signal });\n } catch (error) {\n if (!isContentFieldRejected(error)) throw error;\n const { content, ...rest } = body;\n await this.http.request(path, {\n method: 'POST',\n body: { ...rest, message: content },\n signal,\n });\n }\n }\n}\n","import { AgentChatError } from './errors';\nimport { unwrapApiData } from './auth-response';\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object';\n}\n\nfunction readString(value: unknown): string | undefined {\n return typeof value === 'string' && value.trim().length > 0 ? value.trim() : undefined;\n}\n\nfunction readNumber(value: unknown): number | undefined {\n if (typeof value === 'number' && Number.isFinite(value)) return value;\n if (typeof value === 'string' && value.trim().length > 0) {\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : undefined;\n }\n return undefined;\n}\n\n/**\n * Unwrap `{ status, message, data }` from ReqInterceptor. Throws when\n * `status !== 200` even if HTTP status is 200.\n */\nexport function parseApiEnvelope<T>(body: unknown): T {\n if (!isRecord(body)) {\n throw new AgentChatError('TRANSPORT_FAILED', 'Invalid API response');\n }\n\n const status = readNumber(body.status);\n if (status !== undefined && status !== 200) {\n throw new AgentChatError(\n 'TRANSPORT_FAILED',\n readString(body.message) ?? 'request failed',\n { details: { status, data: body.data } },\n );\n }\n\n if ('data' in body && body.data === null) {\n return null as T;\n }\n\n const data = unwrapApiData(body);\n if (data !== null) return data as T;\n return body as T;\n}\n","import { parseApiEnvelope } from '../api-envelope';\nimport {\n parseDownReasonTags,\n parseMessageFeedbackBatch,\n parseMessageFeedbackView,\n} from '../chat-response';\nimport type { HttpClient } from '../http';\nimport type {\n MessageFeedbackBatchData,\n MessageFeedbackDownReasonTag,\n MessageFeedbackView,\n UpsertMessageFeedbackBody,\n} from '../../types';\n\nfunction normalizeSessionId(sessionId: string): string {\n return sessionId.trim().toLowerCase();\n}\n\nexport class FeedbackService {\n private http: HttpClient;\n\n constructor(http: HttpClient) {\n this.http = http;\n }\n\n /** `GET /chat/feedback/down-reason-tags` */\n async getDownReasonTags(signal?: AbortSignal): Promise<MessageFeedbackDownReasonTag[]> {\n const body = await this.http.request<unknown>('/chat/feedback/down-reason-tags', {\n method: 'GET',\n signal,\n });\n return parseDownReasonTags(parseApiEnvelope(body)).items;\n }\n\n /** `GET /chat/:sessionId/messages/feedbacks?messageIds=…` */\n async batchFeedbacks(\n sessionId: string,\n messageIds: number[],\n signal?: AbortSignal,\n ): Promise<MessageFeedbackBatchData> {\n if (messageIds.length === 0) return { items: [] };\n const body = await this.http.request<unknown>(\n `/chat/${normalizeSessionId(sessionId)}/messages/feedbacks`,\n {\n method: 'GET',\n signal,\n searchParams: { messageIds: messageIds.join(',') },\n },\n );\n return parseMessageFeedbackBatch(parseApiEnvelope(body));\n }\n\n /** `PUT /chat/:sessionId/messages/:messageId/feedback` */\n async upsert(\n sessionId: string,\n messageId: number,\n payload: UpsertMessageFeedbackBody,\n signal?: AbortSignal,\n ): Promise<MessageFeedbackView> {\n const body = await this.http.request<unknown>(\n `/chat/${normalizeSessionId(sessionId)}/messages/${messageId}/feedback`,\n {\n method: 'PUT',\n body: payload,\n signal,\n },\n );\n return parseMessageFeedbackView(parseApiEnvelope(body));\n }\n\n /** `DELETE /chat/:sessionId/messages/:messageId/feedback` */\n async remove(\n sessionId: string,\n messageId: number,\n signal?: AbortSignal,\n ): Promise<void> {\n const body = await this.http.request<unknown>(\n `/chat/${normalizeSessionId(sessionId)}/messages/${messageId}/feedback`,\n {\n method: 'DELETE',\n signal,\n },\n );\n parseApiEnvelope<null>(body);\n }\n}\n","import type { SessionInfo, UserContext, AgentMessage } from '../types';\n\nexport interface SessionContext {\n sdkVersion: string;\n origin: string;\n locale: string;\n user?: UserContext;\n}\n\nexport interface SessionManagerOptions {\n context: SessionContext;\n}\n\n/**\n * Lightweight in-memory holder for active chat session metadata.\n */\nexport class SessionManager {\n private context: SessionContext;\n\n private sessionId: string | null = null;\n private initialMessages: AgentMessage[] = [];\n\n constructor(options: SessionManagerOptions) {\n this.context = options.context;\n }\n\n updateContext(partial: Partial<SessionContext>): void {\n this.context = { ...this.context, ...partial };\n }\n\n getSession(): SessionInfo | null {\n if (!this.sessionId) return null;\n return { sessionId: this.sessionId, conversationId: this.sessionId };\n }\n\n getInitialMessages(): AgentMessage[] {\n return this.initialMessages;\n }\n\n setSession(sessionId: string, initialMessages: AgentMessage[] = []): void {\n this.sessionId = sessionId.trim().toLowerCase();\n this.initialMessages = initialMessages;\n }\n\n reset(): void {\n this.sessionId = null;\n this.initialMessages = [];\n }\n}\n","/** Database-assigned message ids used by feedback APIs. */\nexport function isPersistedMessageId(id: string): boolean {\n return /^\\d+$/.test(id);\n}\n\nexport function parsePersistedMessageId(id: string): number | null {\n if (!isPersistedMessageId(id)) return null;\n const value = Number(id);\n return Number.isFinite(value) ? value : null;\n}\n\n/** Mirrors backend down-feedback validation. */\nexport function canSubmitDownFeedback(input: {\n reasonTagKeys: string[];\n comment: string;\n}): boolean {\n const tags = input.reasonTagKeys;\n const text = input.comment.trim();\n if (tags.length === 0 && !text) return false;\n if (tags.includes('other') && !text) return false;\n return true;\n}\n","export type CoreMessageBlock = Record<string, unknown> & { type: string; id?: string };\n\nexport interface CoreMessageBlockPatch {\n replaceId: string;\n block: CoreMessageBlock;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nexport function parseStoredBlocks(content: string | null | undefined): CoreMessageBlock[] | undefined {\n if (!content) return undefined;\n const trimmed = content.trim();\n if (!trimmed || trimmed[0] !== '{') return undefined;\n try {\n const parsed = JSON.parse(trimmed) as { blocks?: unknown };\n if (!Array.isArray(parsed.blocks)) return undefined;\n return parsed.blocks.filter(\n (item): item is CoreMessageBlock => isRecord(item) && typeof item.type === 'string',\n );\n } catch {\n return undefined;\n }\n}\n\nexport function blocksToText(blocks: CoreMessageBlock[] | undefined): string {\n if (!blocks?.length) return '';\n return blocks\n .map((block) => (block.type === 'text' && typeof block.content === 'string' ? block.content : ''))\n .join('');\n}\n\nfunction appendDeltaText(previous: CoreMessageBlock[], incoming: CoreMessageBlock[]): CoreMessageBlock[] {\n let textPiece = '';\n for (const block of incoming) {\n if (block.type === 'text' && typeof block.content === 'string') {\n textPiece += block.content;\n }\n }\n if (!textPiece) return previous;\n const next = [...previous];\n const last = next[next.length - 1];\n if (last?.type === 'text' && typeof last.content === 'string') {\n next[next.length - 1] = { ...last, content: `${last.content}${textPiece}` };\n return next;\n }\n next.push({ type: 'text', format: 'markdown', content: textPiece });\n return next;\n}\n\nconst STRUCTURED_BLOCK_TYPES = new Set([\n 'table',\n 'chart',\n 'metric',\n 'list',\n 'image',\n 'alert',\n]);\n\nfunction stripBlocksJsonTextBlocks(blocks: CoreMessageBlock[]): CoreMessageBlock[] {\n return blocks.filter((block) => {\n if (block.type !== 'text' || typeof block.content !== 'string') {\n return true;\n }\n const trimmed = block.content.trimStart();\n if (!trimmed.startsWith('{')) {\n return true;\n }\n return !parseStoredBlocks(block.content);\n });\n}\n\nfunction looksLikeMarkdownTable(text: string): boolean {\n const lines = text.trim().split('\\n').filter((line) => line.trim().length > 0);\n if (lines.length < 2) return false;\n return lines.slice(0, 3).some((line) => line.includes('|'));\n}\n\nfunction replaceOrAppendStructuredBlock(\n next: CoreMessageBlock[],\n block: CoreMessageBlock,\n): CoreMessageBlock[] {\n const id = typeof block.id === 'string' ? block.id.trim() : '';\n if (id) {\n const hit = next.findIndex((item) => item.id === id);\n if (hit >= 0) {\n const copy = [...next];\n copy[hit] = { ...block, id };\n return copy;\n }\n return [...next, { ...block, id }];\n }\n\n if (STRUCTURED_BLOCK_TYPES.has(block.type)) {\n const hit = next.findIndex((item) => item.type === block.type);\n if (hit >= 0) {\n const copy = [...next];\n copy[hit] = block;\n return copy;\n }\n }\n\n return [...next, block];\n}\n\nexport function applyStreamFull(previous: CoreMessageBlock[], incoming: CoreMessageBlock[]): CoreMessageBlock[] {\n let next = [...previous];\n const incomingHasStructured = incoming.some(\n (block) => block.type !== 'text' && block.type !== 'loading',\n );\n if (incomingHasStructured) {\n next = stripBlocksJsonTextBlocks(next);\n }\n const hasStructuredBlock = next.some((item) => STRUCTURED_BLOCK_TYPES.has(item.type));\n let sawText = false;\n\n for (const block of incoming) {\n if (block.type === 'text') {\n sawText = true;\n const text = typeof block.content === 'string' ? block.content : '';\n if (!text) continue;\n const hasDeltaText = next.some((item) => item.type === 'text' && typeof item.content === 'string');\n if (hasDeltaText) continue;\n // After patch/table blocks, ignore duplicate markdown table fallback from backend.\n if (hasStructuredBlock && looksLikeMarkdownTable(text)) continue;\n next.push({ ...block, content: text });\n continue;\n }\n next = replaceOrAppendStructuredBlock(next, block);\n }\n\n if (!sawText && incoming.length === 0) return previous;\n return next;\n}\n\nexport function applyStreamDelta(previous: CoreMessageBlock[], incoming: CoreMessageBlock[]): CoreMessageBlock[] {\n return appendDeltaText(previous, incoming);\n}\n\nfunction unescapeJsonStringFragment(fragment: string): string {\n let out = '';\n for (let i = 0; i < fragment.length; i += 1) {\n const ch = fragment[i];\n if (ch !== '\\\\') {\n out += ch;\n continue;\n }\n const next = fragment[i + 1];\n if (next === undefined) {\n out += ch;\n break;\n }\n switch (next) {\n case 'n':\n out += '\\n';\n break;\n case 't':\n out += '\\t';\n break;\n case 'r':\n out += '\\r';\n break;\n case '\"':\n out += '\"';\n break;\n case '\\\\':\n out += '\\\\';\n break;\n default:\n out += next;\n break;\n }\n i += 1;\n }\n return out;\n}\n\nfunction looksLikeBlocksJsonStreaming(text: string): boolean {\n const trimmed = text.trimStart();\n if (!trimmed.startsWith('{')) return false;\n return /\"blocks\"/.test(trimmed);\n}\n\nconst STREAMING_TEXT_CONTENT_MARKER =\n /\"type\"\\s*:\\s*\"text\"\\s*,\\s*\"content\"\\s*:\\s*\"/;\n\n/**\n * Extract markdown from an in-progress `{\"blocks\":[{\"type\":\"text\",\"content\":\"...\"}]}` payload.\n * Returns `undefined` when the string is not a blocks JSON envelope.\n * Returns `null` when the envelope prefix is still streaming (hide raw JSON).\n */\nexport function extractPartialBlocksJsonTextContent(raw: string): string | null | undefined {\n if (!looksLikeBlocksJsonStreaming(raw)) return undefined;\n\n const parsed = parseStoredBlocks(raw);\n if (parsed) return blocksToText(parsed);\n\n const match = STREAMING_TEXT_CONTENT_MARKER.exec(raw);\n if (!match) return null;\n\n const start = match.index + match[0].length;\n let i = start;\n let escaped = '';\n while (i < raw.length) {\n const ch = raw[i];\n if (ch === '\\\\') {\n if (i + 1 >= raw.length) {\n escaped += ch;\n break;\n }\n escaped += raw.slice(i, i + 2);\n i += 2;\n continue;\n }\n if (ch === '\"') break;\n escaped += ch;\n i += 1;\n }\n return unescapeJsonStringFragment(escaped);\n}\n\n/**\n * When the model streams a full `{\"blocks\":[...]}` JSON string inside a single\n * text block, unwrap it into structured blocks for rendering.\n */\nexport function unwrapBlocksJsonEnvelope(blocks: CoreMessageBlock[]): CoreMessageBlock[] {\n if (blocks.length !== 1) return blocks;\n const only = blocks[0];\n if (only?.type !== 'text' || typeof only.content !== 'string') return blocks;\n const parsed = parseStoredBlocks(only.content);\n if (parsed && parsed.length > 0) return parsed;\n\n const partial = extractPartialBlocksJsonTextContent(only.content);\n if (partial !== undefined) {\n const format = typeof only.format === 'string' ? only.format : 'markdown';\n return [{ type: 'text', format, content: partial ?? '' }];\n }\n\n return blocks;\n}\n\nexport function applyPatches(\n previous: CoreMessageBlock[],\n patches: CoreMessageBlockPatch[],\n): CoreMessageBlock[] {\n if (!patches.length) return previous;\n const next = [...previous];\n for (const patch of patches) {\n const id = patch.replaceId.trim();\n if (!id) continue;\n const hit = next.findIndex((block) => block.id === id);\n if (hit >= 0) next[hit] = { ...patch.block, id };\n else next.push({ ...patch.block, id });\n }\n return next;\n}\n","/**\n * Source-of-truth SDK version string. Kept here (rather than importing\n * package.json) so the library can be consumed without JSON imports.\n *\n * This must be bumped together with `package.json.version` and the\n * `CHANGELOG.md` entry on every release.\n */\nexport const SDK_VERSION = '0.1.0';\n","/**\n * Generate a short, URL-safe random id. Uses `crypto.randomUUID` when\n * available (modern browsers + Node 19+) and falls back to `Math.random`\n * for very old engines or test environments.\n */\nexport function nanoId(prefix = 'id'): string {\n const cryptoLike = (globalThis as { crypto?: { randomUUID?: () => string } }).crypto;\n if (cryptoLike?.randomUUID) {\n return `${prefix}_${cryptoLike.randomUUID().replace(/-/g, '').slice(0, 12)}`;\n }\n const rand = Math.random().toString(36).slice(2, 14);\n return `${prefix}_${rand}`;\n}\n","import {\n applyAccessTokenHeader,\n clearAccessTokenHeader,\n} from './auth-headers';\nimport {\n parseAgentList,\n parseChatSessionDetailPage,\n parseChatSessionListPage,\n parseCreateSessionResponse,\n parsePostedMessage,\n parseSkillList,\n} from './chat-response';\nimport { useAuthStore } from './auth-store';\nimport type { AppClientAuthData } from './auth-types';\nimport { AgentChatError } from './errors';\nimport { EventBus } from './events';\nimport { normalizeDsn, DSN_AUTH_HEADER, DEFAULT_BASE_URL } from './resolve';\nimport { parseChatSseEvent } from './chat-sse';\nimport { createHttpClient } from './http';\nimport { AuthService, AgentService, ChatService, FeedbackService, DEFAULT_MESSAGE_PAGE_SIZE, DEFAULT_SESSION_PAGE_SIZE } from './services';\nimport type { MessageSendContext } from './services/chat.service';\nimport { SessionManager } from './auth';\nimport {\n isPersistedMessageId,\n parsePersistedMessageId,\n} from './feedback-utils';\nimport {\n applyPatches,\n applyStreamDelta,\n applyStreamFull,\n blocksToText,\n parseStoredBlocks,\n unwrapBlocksJsonEnvelope,\n type CoreMessageBlock,\n} from './message-blocks';\nimport type {\n AgentChatEventMap,\n AgentChatErrorPayload,\n AgentChatInstance,\n AgentChatLoginCredentials,\n AgentChatLifecycle,\n AgentChatOptions,\n AgentChatState,\n AgentMessage,\n AgentStreamState,\n AgentsEmptyReason,\n ChatAgentSummary,\n ChatSessionSummary,\n ChatSkillSummary,\n MessageFeedbackDownReasonTag,\n MessageFeedbackView,\n UpsertMessageFeedbackBody,\n UserContext,\n WriteConfirmationState,\n} from '../types';\nimport { SDK_VERSION } from '../utils/sdk-version';\nimport { nanoId } from '../utils/id';\n\nfunction trimRight(s: string): string {\n return s.replace(/\\/+$/, '');\n}\n\nfunction normalizeSessionId(sessionId: string): string {\n return sessionId.trim().toLowerCase();\n}\n\nfunction mergeSessionSummaries(\n existing: ChatSessionSummary[],\n incoming: ChatSessionSummary[],\n): ChatSessionSummary[] {\n const seen = new Set(existing.map((row) => normalizeSessionId(row.sessionId)));\n const merged = [...existing];\n for (const row of incoming) {\n const key = normalizeSessionId(row.sessionId);\n if (seen.has(key)) continue;\n seen.add(key);\n merged.push(row);\n }\n return merged;\n}\n\nfunction mergeOlderMessages(\n existing: AgentMessage[],\n older: AgentMessage[],\n): AgentMessage[] {\n const seen = new Set(existing.map((message) => String(message.id)));\n const prepended: AgentMessage[] = [];\n for (const message of older) {\n const key = String(message.id);\n if (seen.has(key)) continue;\n seen.add(key);\n prepended.push(message);\n }\n return [...prepended, ...existing];\n}\n\ninterface SessionMessagesCacheEntry {\n messages: AgentMessage[];\n page: number;\n hasMore: boolean;\n}\n\nfunction createEmptyAgentStream(): AgentStreamState {\n return { phase: 'thinking', thinkText: '', resultText: '' };\n}\n\n/** Finalize a streamed assistant turn (result only; thinking is not kept). */\nfunction finalizeAgentReply(\n message: AgentMessage,\n stream: AgentStreamState,\n overrides: Partial<AgentMessage> = {},\n): AgentMessage {\n const resultText =\n (overrides.content?.type === 'text' ? overrides.content.text : undefined) ??\n (stream.resultText || message.content.text);\n const rawBlocks = overrides.blocks ?? stream.resultBlocks ?? message.blocks;\n const parsedFromText = parseStoredBlocks(resultText);\n const blocks = parsedFromText ?? unwrapBlocksJsonEnvelope((rawBlocks ?? []) as CoreMessageBlock[]);\n const text = parsedFromText ? blocksToText(blocks) : resultText;\n return {\n ...message,\n ...overrides,\n status: overrides.status ?? 'sent',\n content: { type: 'text', text },\n blocks,\n thinkText: undefined,\n stream: undefined,\n };\n}\n\ninterface ServerMessage {\n id: number | string;\n role: 'user' | 'assistant' | 'system' | 'tool';\n content: string | null;\n createdAt: string | number | Date;\n}\n\ninterface InternalState {\n options: AgentChatOptions;\n /** Opaque DSN string the consumer supplied; forwarded as `x-app-dsn`. */\n dsn: string;\n /**\n * Backend base URL used for **all** API calls (sessions, messages, login,\n * and the init-time `/app-client/auth` ping). Normalized to have no\n * trailing slash. Mirrors the value of {@link InternalState.options.baseUrl}\n * after applying defaults.\n */\n apiBaseUrl: string;\n http: ReturnType<typeof createHttpClient>;\n auth: AuthService;\n chat: ChatService;\n agent: AgentService;\n feedback: FeedbackService;\n session: SessionManager;\n abortControllers: Set<AbortController>;\n isOpen: boolean;\n /** `POST /app-client/auth` succeeded at init; gates the floating launcher. */\n isClientAuthenticated: boolean;\n isLoggedIn: boolean;\n sessions: ChatSessionSummary[];\n sessionsPage: number;\n sessionsPageSize: number;\n sessionsHasMore: boolean;\n sessionsLoadingMore: boolean;\n activeSessionId: string | null;\n activeSessionMessagesPage: number;\n activeSessionMessagesHasMore: boolean;\n sessionMessagesLoadingMore: boolean;\n sessionMessagesPageSize: number;\n sessionMessagesCache: Map<string, SessionMessagesCacheEntry>;\n agents: ChatAgentSummary[];\n skills: ChatSkillSummary[];\n selectedAgentId: string | null;\n selectedSkillId: string | null;\n agentsLoading: boolean;\n skillsLoading: boolean;\n agentsEmptyReason: AgentsEmptyReason;\n /** User JWT used as `Authorization: Bearer` on C-end APIs. */\n userJwt: string | null;\n activeStreamAbort: AbortController | null;\n activeStreamSessionId: string | null;\n activeStreamTargetMessageId: string | null;\n messages: AgentMessage[];\n lastError: AgentChatErrorPayload | null;\n writeConfirmation: WriteConfirmationState | null;\n downReasonTagsCache: MessageFeedbackDownReasonTag[] | null;\n}\n\nfunction defaultLocale(): string {\n if (typeof navigator !== 'undefined' && navigator.language) return navigator.language;\n return 'en';\n}\n\nfunction browserOrigin(): string {\n if (typeof window !== 'undefined' && window.location?.origin) return window.location.origin;\n return 'unknown://sdk';\n}\n\nexport class AgentChatClient implements AgentChatInstance {\n readonly id: string;\n private bus = new EventBus<AgentChatEventMap>();\n private lifecycle: AgentChatLifecycle = 'uninitialized';\n private state: InternalState | null = null;\n private stateChangeListeners = new Set<() => void>();\n /** Bumped when session/messages are changed locally; stale `selectSession` loads are ignored. */\n private sessionEpoch = 0;\n /**\n * Cached `AgentChatState` snapshot returned by {@link getState}. React's\n * `useSyncExternalStore` requires `getSnapshot` to return the same object\n * reference until the store actually changes — otherwise concurrent\n * rendering treats it as torn state, repeatedly remounts the subtree, and\n * (combined with antd's cssinjs cache) the launcher visibly flashes and\n * disappears. We invalidate this cache from {@link notifyStateChange}.\n */\n private stateSnapshot: AgentChatState | null = null;\n\n constructor(id: string = nanoId('inst')) {\n this.id = id;\n }\n\n // ------------------------------------------------------------------ public\n\n async init(options: AgentChatOptions): Promise<this> {\n if (this.state) {\n if (this.state.options.dsn === options.dsn) {\n if (typeof console !== 'undefined' && typeof console.warn === 'function') {\n console.warn(\n '[agent-chat] init() called twice with the same DSN — keeping existing instance state.',\n );\n }\n return this;\n }\n throw new AgentChatError(\n 'ALREADY_INITIALIZED',\n 'AgentChat is already initialized with a different DSN. Call destroy() first.',\n );\n }\n\n if (!options || typeof options !== 'object') {\n throw new AgentChatError('INVALID_OPTIONS', 'init(options): options object is required');\n }\n\n // `baseUrl` is the single root for every SDK request.\n const apiBaseUrl = trimRight(\n (options.baseUrl?.trim() || DEFAULT_BASE_URL).replace(/\\s+/g, ''),\n );\n\n const dsn = normalizeDsn(options.dsn);\n const storedAccountToken = useAuthStore.getState().getAccessTokenForDsn(dsn);\n const accountToken =\n (typeof options.accountToken === 'string' && options.accountToken.trim()) ||\n (typeof options.userAccessToken === 'string' && options.userAccessToken.trim()) ||\n storedAccountToken ||\n null;\n\n const http = createHttpClient({\n apiBase: apiBaseUrl,\n defaultHeaders: {\n [DSN_AUTH_HEADER]: dsn,\n 'X-Agent-Sdk-Version': SDK_VERSION,\n ...(options.headers ?? {}),\n },\n });\n const auth = new AuthService(http);\n const chat = new ChatService(http);\n const feedback = new FeedbackService(http);\n\n const authData = await auth.authenticate(dsn, accountToken);\n const resolvedUserJwt = authData.accessToken?.trim() ?? null;\n useAuthStore.getState().setAuth(dsn, authData);\n\n if (resolvedUserJwt) {\n applyAccessTokenHeader(http, resolvedUserJwt);\n }\n\n const agent = new AgentService(http, () => ({\n dsn: this.state?.dsn ?? dsn,\n }));\n\n const sdkVersion = SDK_VERSION;\n\n const session = new SessionManager({\n context: {\n sdkVersion,\n origin: browserOrigin(),\n locale: options.locale ?? defaultLocale(),\n user: options.user ?? authUserToContext(authData.user),\n },\n });\n\n this.state = {\n options,\n dsn,\n apiBaseUrl,\n http,\n auth,\n chat,\n agent,\n feedback,\n session,\n abortControllers: new Set(),\n isOpen: false,\n isClientAuthenticated: true,\n isLoggedIn: Boolean(resolvedUserJwt),\n sessions: [],\n sessionsPage: 0,\n sessionsPageSize: DEFAULT_SESSION_PAGE_SIZE,\n sessionsHasMore: false,\n sessionsLoadingMore: false,\n activeSessionId: null,\n activeSessionMessagesPage: 0,\n activeSessionMessagesHasMore: false,\n sessionMessagesLoadingMore: false,\n sessionMessagesPageSize: DEFAULT_MESSAGE_PAGE_SIZE,\n sessionMessagesCache: new Map(),\n agents: options.agents ? [...options.agents] : [],\n skills: [],\n selectedAgentId: options.defaultAgentId?.trim() ?? null,\n selectedSkillId: options.defaultSkillId?.trim() ?? null,\n agentsLoading: false,\n skillsLoading: false,\n agentsEmptyReason: null,\n userJwt: resolvedUserJwt,\n activeStreamAbort: null,\n activeStreamSessionId: null,\n activeStreamTargetMessageId: null,\n messages: [],\n lastError: null,\n writeConfirmation: null,\n downReasonTagsCache: null,\n };\n this.lifecycle = 'initialized';\n this.stateSnapshot = null;\n\n this.applyStaticSkills(this.state);\n this.syncDefaultAgentSelection(this.state);\n\n if (options.onReady) {\n this.bus.on('ready', options.onReady);\n }\n\n queueMicrotask(() => this.bus.emit('ready', undefined));\n\n if (options.autoOpen) {\n this.open();\n }\n\n return this;\n }\n\n async login(credentials: AgentChatLoginCredentials): Promise<void> {\n const state = this.requireState('login');\n const email = credentials?.email?.trim();\n const password = credentials?.password?.trim();\n if (!email || !password) {\n throw new AgentChatError('INVALID_OPTIONS', 'login requires email and password');\n }\n\n let loginAuth: AppClientAuthData;\n try {\n loginAuth = await state.auth.login(email, password);\n } catch (err) {\n if (err instanceof AgentChatError && err.code === 'TRANSPORT_FAILED') {\n throw new AgentChatError('LOGIN_FAILED', err.message, { cause: err, details: err.details });\n }\n throw err;\n }\n\n useAuthStore.getState().setAuth(state.dsn, loginAuth);\n\n const accountToken = loginAuth.accessToken?.trim();\n if (!accountToken) {\n throw new AgentChatError('LOGIN_FAILED', 'Login succeeded but no access token was returned.');\n }\n\n clearAccessTokenHeader(state.http);\n const authData = await state.auth.authenticate(state.dsn, accountToken);\n const userJwt = authData.accessToken?.trim();\n if (!userJwt) {\n throw new AgentChatError('LOGIN_FAILED', 'App client auth succeeded but accessToken is missing');\n }\n useAuthStore.getState().setAuth(state.dsn, authData);\n applyAccessTokenHeader(state.http, userJwt);\n\n state.userJwt = userJwt;\n state.isLoggedIn = true;\n this.notifyStateChange();\n if (state.isOpen) {\n void this.refreshAgentCatalog().catch(() => {\n /* catalog is optional */\n });\n }\n }\n\n logout(): void {\n const state = this.state;\n if (!state) return;\n this.abortActiveStream();\n state.isLoggedIn = false;\n clearAccessTokenHeader(state.http);\n useAuthStore.getState().clearAuth();\n state.session.reset();\n state.sessions = [];\n state.sessionsPage = 0;\n state.sessionsHasMore = false;\n state.sessionsLoadingMore = false;\n state.activeSessionId = null;\n state.activeSessionMessagesPage = 0;\n state.activeSessionMessagesHasMore = false;\n state.sessionMessagesLoadingMore = false;\n state.sessionMessagesCache.clear();\n state.agents = [];\n state.skills = [];\n state.selectedAgentId = null;\n state.selectedSkillId = null;\n state.agentsLoading = false;\n state.skillsLoading = false;\n state.agentsEmptyReason = null;\n state.userJwt = null;\n state.messages = [];\n this.notifyStateChange();\n }\n\n isLoggedIn(): boolean {\n return this.state?.isLoggedIn ?? false;\n }\n\n destroy(): void {\n if (!this.state) return;\n\n this.abortActiveStream();\n\n for (const ctrl of this.state.abortControllers) {\n try {\n ctrl.abort();\n } catch {\n /* noop */\n }\n }\n this.state.abortControllers.clear();\n\n this.state.session.reset();\n this.state.isOpen = false;\n this.state = null;\n this.lifecycle = 'destroyed';\n this.stateSnapshot = null;\n\n this.bus.emit('destroyed', undefined);\n this.bus.clear();\n this.stateChangeListeners.clear();\n }\n\n open(): void {\n // Graceful when called against a destroyed/uninitialized client. This\n // happens in dev when a stale launcher (e.g. left behind by an HMR or\n // StrictMode race) is clicked after destroy() has run — we don't want\n // those clicks to crash the host page.\n const state = this.state;\n if (!state) {\n if (typeof console !== 'undefined') {\n console.warn(\n '[agent-chat] open() called before init() (or after destroy()) — ignoring.',\n );\n }\n return;\n }\n if (state.isOpen) return;\n state.isOpen = true;\n this.notifyStateChange();\n this.bus.emit('open', undefined);\n if (state.isLoggedIn) {\n // Defer sidebar/session fetch until after the panel has painted so open()\n // does not interleave dozens of store updates with the first Panel mount.\n queueMicrotask(() => {\n if (!this.state?.isOpen) return;\n void this.prefetch().catch(() => {\n /* error already broadcast via SessionManager.onError */\n });\n });\n }\n }\n\n close(): void {\n const state = this.state;\n if (!state || !state.isOpen) return;\n state.isOpen = false;\n this.notifyStateChange();\n this.bus.emit('close', undefined);\n }\n\n toggle(): void {\n if (this.isOpen()) this.close();\n else this.open();\n }\n\n isOpen(): boolean {\n return this.state?.isOpen ?? false;\n }\n\n identify(user: UserContext): void {\n const state = this.requireState('identify');\n const previous = state.session.getSession();\n state.session.updateContext({ user });\n\n const previousUserId = state.options.user?.id;\n state.options = { ...state.options, user };\n\n if (previous && previousUserId && previousUserId !== user.id) {\n state.session.reset();\n state.messages = [];\n this.notifyStateChange();\n }\n }\n\n async prefetch(): Promise<void> {\n const state = this.requireState('prefetch');\n this.requireLoggedIn('prefetch');\n const ctrl = this.makeAbortController();\n try {\n await Promise.all([\n this.refreshSessions(ctrl.signal),\n this.refreshAgentCatalog(ctrl.signal),\n ]);\n if (!state.sessions.length) return;\n const targetId =\n state.activeSessionId && state.sessions.some((s) => s.sessionId === state.activeSessionId)\n ? state.activeSessionId\n : state.sessions[0]!.sessionId;\n await this.selectSession(targetId, { signal: ctrl.signal, skipAbortStream: true });\n } finally {\n state.abortControllers.delete(ctrl);\n }\n }\n\n async selectSession(\n sessionId: string,\n opts: { signal?: AbortSignal; skipAbortStream?: boolean } = {},\n ): Promise<void> {\n const state = this.requireState('selectSession');\n this.requireLoggedIn('selectSession');\n const id = sessionId.trim();\n if (!id) {\n throw new AgentChatError('INVALID_OPTIONS', 'selectSession: sessionId is required');\n }\n\n const loadEpoch = this.sessionEpoch;\n\n if (!opts.skipAbortStream) {\n this.abortActiveStream();\n }\n\n if (state.activeSessionId && state.activeSessionId !== id) {\n this.writeSessionMessagesCache(state, state.activeSessionId);\n }\n state.writeConfirmation = null;\n\n const cached = state.sessionMessagesCache.get(id);\n if (cached) {\n if (loadEpoch === this.sessionEpoch) {\n state.activeSessionId = id;\n state.messages = cached.messages;\n state.activeSessionMessagesPage = cached.page;\n state.activeSessionMessagesHasMore = cached.hasMore;\n state.session.setSession(id, cached.messages);\n this.notifyStateChange();\n this.bus.emit('session', state.session.getSession()!);\n if (!opts.signal?.aborted) {\n void this.ensureSessionStream(id).catch(() => {\n /* stream error already reported */\n });\n void this.syncMessageFeedbacks(state, id).catch(() => {\n /* feedback sync is best-effort */\n });\n }\n }\n return;\n }\n\n const ctrl = this.makeAbortController();\n const signal = opts.signal;\n if (signal) {\n signal.addEventListener('abort', () => ctrl.abort(), { once: true });\n }\n try {\n const detailPage = await this.fetchSessionMessagesPage(state, id, 1, ctrl.signal);\n const mapped = detailPage.messages.map((m) => this.toAgentMessage(m as ServerMessage));\n const cacheEntry: SessionMessagesCacheEntry = {\n messages: mapped,\n page: detailPage.page,\n hasMore: detailPage.hasMore,\n };\n state.sessionMessagesCache.set(id, cacheEntry);\n if (loadEpoch !== this.sessionEpoch) return;\n state.activeSessionId = id;\n state.activeSessionMessagesPage = detailPage.page;\n state.activeSessionMessagesHasMore = detailPage.hasMore;\n state.session.setSession(detailPage.sessionId, mapped);\n state.messages = mapped;\n this.notifyStateChange();\n this.bus.emit('session', state.session.getSession()!);\n if (!opts.signal?.aborted) {\n void this.ensureSessionStream(id).catch(() => {\n /* stream error already reported */\n });\n void this.syncMessageFeedbacks(state, id).catch(() => {\n /* feedback sync is best-effort */\n });\n }\n } finally {\n state.abortControllers.delete(ctrl);\n }\n }\n\n /**\n * Send a user turn end-to-end:\n *\n * 1. Optimistic user bubble (`pending`) → `notifyStateChange` → React re-render\n * 2. Ensure `sessionId` (create via `POST /chat` on first send)\n * 3. `POST /chat/{sessionId}/messages` (existing session) or skip (new session: message already in `POST /chat`)\n * 4. Append empty assistant placeholder (`pending`) with a new id\n * 5. `POST` user message (existing session) → `GET /chat/{sessionId}/stream`\n * 6. SSE updates **only** the placeholder message by id (`think` / `result` / `complete`)\n */\n async sendMessage(text: string, opts: { id?: string } = {}): Promise<AgentMessage> {\n const state = this.requireState('sendMessage');\n this.requireLoggedIn('sendMessage');\n const trimmed = text.trim();\n if (trimmed.length === 0) {\n throw new AgentChatError('INVALID_OPTIONS', 'sendMessage: text must not be empty');\n }\n\n this.sessionEpoch += 1;\n this.settlePendingAgentReplies(state);\n state.writeConfirmation = null;\n\n const userMessage = this.appendOptimisticUserMessage(state, trimmed, opts.id);\n const agentPlaceholder = this.appendAgentPlaceholder(state);\n state.activeStreamTargetMessageId = agentPlaceholder.id;\n const ctrl = this.makeAbortController();\n\n try {\n let sessionId = state.activeSessionId ?? state.session.getSession()?.sessionId ?? null;\n\n if (!sessionId) {\n sessionId = await this.createChatSession(state, trimmed, ctrl.signal);\n void this.refreshSessions(ctrl.signal).catch(() => {\n /* sidebar refresh is best-effort */\n });\n await this.ensureSessionStream(sessionId);\n return this.applyUserMessageSent(state, userMessage);\n }\n\n const sentUser = await this.postUserMessageAndApply(\n state,\n sessionId,\n trimmed,\n ctrl.signal,\n userMessage,\n );\n await this.ensureSessionStream(sessionId);\n return sentUser;\n } catch (err) {\n const failedUser: AgentMessage = { ...userMessage, status: 'failed' };\n state.messages = state.messages.map((m) => (m.id === userMessage.id ? failedUser : m));\n this.cacheActiveSessionMessages(state);\n this.notifyStateChange();\n\n const wrapped =\n err instanceof AgentChatError\n ? new AgentChatError('MESSAGE_FAILED', err.message, {\n cause: err,\n details: { ...(err.details ?? {}), messageId: userMessage.id },\n })\n : new AgentChatError('MESSAGE_FAILED', 'Failed to send message', {\n cause: err,\n details: { messageId: userMessage.id },\n });\n this.reportError(wrapped);\n throw wrapped;\n } finally {\n state.abortControllers.delete(ctrl);\n }\n }\n\n async confirmWrite(): Promise<void> {\n const state = this.requireState('confirmWrite');\n this.requireLoggedIn('confirmWrite');\n const pending = state.writeConfirmation;\n if (!pending?.awaiting) {\n throw new AgentChatError('INVALID_OPTIONS', 'No pending write confirmation');\n }\n\n const sessionId = state.activeSessionId ?? state.session.getSession()?.sessionId ?? null;\n if (!sessionId) {\n throw new AgentChatError('INVALID_OPTIONS', 'confirmWrite: no active session');\n }\n\n state.writeConfirmation = { ...pending, awaiting: false, submitting: true };\n this.notifyStateChange();\n\n const agentPlaceholder = this.appendAgentPlaceholder(state);\n state.activeStreamTargetMessageId = agentPlaceholder.id;\n const ctrl = this.makeAbortController();\n\n try {\n // Worker run events arrive on the session SSE opened for the original turn;\n // do not open another GET /stream after confirm.\n await this.postWriteConfirmationAction(state, sessionId, { confirmWrite: true }, ctrl.signal);\n } catch (err) {\n state.writeConfirmation = { ...pending, awaiting: true, submitting: false };\n this.notifyStateChange();\n const wrapped =\n err instanceof AgentChatError\n ? err\n : new AgentChatError('MESSAGE_FAILED', 'Failed to confirm write operation', { cause: err });\n this.reportError(wrapped);\n throw wrapped;\n } finally {\n state.abortControllers.delete(ctrl);\n }\n }\n\n async cancelWrite(): Promise<void> {\n const state = this.requireState('cancelWrite');\n this.requireLoggedIn('cancelWrite');\n const pending = state.writeConfirmation;\n if (!pending?.awaiting) {\n throw new AgentChatError('INVALID_OPTIONS', 'No pending write confirmation');\n }\n\n const sessionId = state.activeSessionId ?? state.session.getSession()?.sessionId ?? null;\n if (!sessionId) {\n throw new AgentChatError('INVALID_OPTIONS', 'cancelWrite: no active session');\n }\n\n state.writeConfirmation = { ...pending, awaiting: false, submitting: true };\n this.notifyStateChange();\n\n const ctrl = this.makeAbortController();\n try {\n await this.postWriteConfirmationAction(state, sessionId, { cancelWrite: true }, ctrl.signal);\n } catch (err) {\n state.writeConfirmation = { ...pending, awaiting: true, submitting: false };\n this.notifyStateChange();\n const wrapped =\n err instanceof AgentChatError\n ? err\n : new AgentChatError('MESSAGE_FAILED', 'Failed to cancel write operation', { cause: err });\n this.reportError(wrapped);\n throw wrapped;\n } finally {\n state.abortControllers.delete(ctrl);\n }\n }\n\n async getDownReasonTags(): Promise<MessageFeedbackDownReasonTag[]> {\n const state = this.requireState('getDownReasonTags');\n this.requireLoggedIn('getDownReasonTags');\n if (state.downReasonTagsCache) return state.downReasonTagsCache;\n const items = await state.feedback.getDownReasonTags();\n state.downReasonTagsCache = items;\n return items;\n }\n\n async submitMessageFeedback(\n messageId: string,\n body: UpsertMessageFeedbackBody,\n ): Promise<void> {\n const state = this.requireState('submitMessageFeedback');\n this.requireLoggedIn('submitMessageFeedback');\n const sessionId = state.activeSessionId ?? state.session.getSession()?.sessionId ?? null;\n if (!sessionId) {\n throw new AgentChatError('INVALID_OPTIONS', 'submitMessageFeedback: no active session');\n }\n const numericId = parsePersistedMessageId(messageId);\n if (numericId === null) {\n throw new AgentChatError('INVALID_OPTIONS', 'submitMessageFeedback: invalid messageId');\n }\n\n const current = state.messages.find((m) => m.id === messageId);\n if (!current || current.role !== 'agent') {\n throw new AgentChatError('INVALID_OPTIONS', 'submitMessageFeedback: not an assistant message');\n }\n\n const previousFeedback = current.feedback ?? null;\n const optimistic = this.buildOptimisticFeedback(numericId, body);\n this.patchMessageFeedback(state, messageId, optimistic);\n\n try {\n const saved = await state.feedback.upsert(sessionId, numericId, body);\n this.patchMessageFeedback(state, messageId, saved);\n } catch (err) {\n this.patchMessageFeedback(state, messageId, previousFeedback);\n const wrapped =\n err instanceof AgentChatError\n ? err\n : new AgentChatError('MESSAGE_FAILED', 'Failed to submit feedback', { cause: err });\n this.reportError(wrapped);\n throw wrapped;\n }\n }\n\n async removeMessageFeedback(messageId: string): Promise<void> {\n const state = this.requireState('removeMessageFeedback');\n this.requireLoggedIn('removeMessageFeedback');\n const sessionId = state.activeSessionId ?? state.session.getSession()?.sessionId ?? null;\n if (!sessionId) {\n throw new AgentChatError('INVALID_OPTIONS', 'removeMessageFeedback: no active session');\n }\n const numericId = parsePersistedMessageId(messageId);\n if (numericId === null) {\n throw new AgentChatError('INVALID_OPTIONS', 'removeMessageFeedback: invalid messageId');\n }\n\n const current = state.messages.find((m) => m.id === messageId);\n if (!current || current.role !== 'agent') {\n throw new AgentChatError('INVALID_OPTIONS', 'removeMessageFeedback: not an assistant message');\n }\n\n const previousFeedback = current.feedback ?? null;\n this.patchMessageFeedback(state, messageId, null);\n\n try {\n await state.feedback.remove(sessionId, numericId);\n } catch (err) {\n this.patchMessageFeedback(state, messageId, previousFeedback);\n const wrapped =\n err instanceof AgentChatError\n ? err\n : new AgentChatError('MESSAGE_FAILED', 'Failed to remove feedback', { cause: err });\n this.reportError(wrapped);\n throw wrapped;\n }\n }\n\n /** Internal: read the immutable options snapshot supplied at init time. */\n getOptions(): AgentChatOptions | null {\n return this.state?.options ?? null;\n }\n\n getState(): AgentChatState {\n if (this.stateSnapshot) return this.stateSnapshot;\n if (!this.state) {\n this.stateSnapshot = {\n lifecycle: this.lifecycle,\n isOpen: false,\n isClientAuthenticated: false,\n isLoggedIn: false,\n session: null,\n sessions: [],\n sessionsHasMore: false,\n sessionsLoadingMore: false,\n activeSessionId: null,\n messages: [],\n sessionMessagesHasMore: false,\n sessionMessagesLoadingMore: false,\n agents: [],\n skills: [],\n selectedAgentId: null,\n selectedSkillId: null,\n agentsLoading: false,\n skillsLoading: false,\n agentsEmptyReason: null,\n lastError: null,\n writeConfirmation: null,\n };\n } else {\n this.stateSnapshot = {\n lifecycle: this.lifecycle,\n isOpen: this.state.isOpen,\n isClientAuthenticated: this.state.isClientAuthenticated,\n isLoggedIn: this.state.isLoggedIn,\n session: this.state.session.getSession(),\n sessions: this.state.sessions,\n sessionsHasMore: this.state.sessionsHasMore,\n sessionsLoadingMore: this.state.sessionsLoadingMore,\n activeSessionId: this.state.activeSessionId,\n messages: [...this.state.messages],\n sessionMessagesHasMore: this.state.activeSessionMessagesHasMore,\n sessionMessagesLoadingMore: this.state.sessionMessagesLoadingMore,\n agents: [...this.state.agents],\n skills: [...this.state.skills],\n selectedAgentId: this.state.selectedAgentId,\n selectedSkillId: this.state.selectedSkillId,\n agentsLoading: this.state.agentsLoading,\n skillsLoading: this.state.skillsLoading,\n agentsEmptyReason: this.state.agentsEmptyReason,\n lastError: this.state.lastError,\n writeConfirmation: this.state.writeConfirmation,\n };\n }\n return this.stateSnapshot;\n }\n\n on<K extends keyof AgentChatEventMap>(\n event: K,\n handler: (payload: AgentChatEventMap[K]) => void,\n ): () => void {\n return this.bus.on(event, handler);\n }\n\n off<K extends keyof AgentChatEventMap>(\n event: K,\n handler: (payload: AgentChatEventMap[K]) => void,\n ): void {\n this.bus.off(event, handler);\n }\n\n // ------------------------------------------------------------- internal API\n\n /**\n * Subscribe to internal state changes (open/close, messages, session, error).\n * Used by the UI layer's `useSyncExternalStore` integration.\n */\n subscribeStateChange(listener: () => void): () => void {\n this.stateChangeListeners.add(listener);\n return () => this.stateChangeListeners.delete(listener);\n }\n\n /** Internal: append a message produced outside `sendMessage` (e.g. system). */\n appendMessage(message: AgentMessage): void {\n const state = this.state;\n if (!state) return;\n state.messages = [...state.messages, message];\n this.notifyStateChange();\n this.bus.emit('message', { message, source: message.role });\n }\n\n // ----------------------------------------------------------------- helpers\n\n private notifyStateChange(): void {\n this.stateSnapshot = null;\n for (const listener of Array.from(this.stateChangeListeners)) {\n try {\n listener();\n } catch (err) {\n if (this.state?.options.debug) console.error('[agent-chat] state listener threw:', err);\n }\n }\n }\n\n private reportError(err: AgentChatError): void {\n const payload: AgentChatErrorPayload = {\n code: err.code,\n message: err.message,\n cause: (err as { cause?: unknown }).cause,\n };\n if (this.state) {\n this.state.lastError = payload;\n this.notifyStateChange();\n }\n if (this.state?.options.debug && typeof console !== 'undefined') {\n console.error('[agent-chat]', err);\n if (this.bus.listenerCount('error') === 0) {\n console.warn('[agent-chat] Unhandled AgentChat error (no `error` listeners attached)');\n }\n }\n this.bus.emit('error', payload);\n }\n\n private requireState(method: string): InternalState {\n if (!this.state) {\n throw new AgentChatError(\n 'NOT_INITIALIZED',\n `AgentChat.${method}() called before init(). Call AgentChat.init({ dsn }) first.`,\n );\n }\n return this.state;\n }\n\n private requireLoggedIn(method: string): void {\n const state = this.state;\n if (!state || state.isLoggedIn) return;\n throw new AgentChatError(\n 'AUTH_REQUIRED',\n `AgentChat.${method}() requires authentication. Call init() and ensure /app-client/auth succeeds.`,\n );\n }\n\n private makeAbortController(): AbortController {\n const ctrl = new AbortController();\n this.state?.abortControllers.add(ctrl);\n return ctrl;\n }\n\n /**\n * Warm up backend resources for a session (`POST /chat/{sessionId}/prepare`).\n * Best-effort: failures are swallowed unless `debug` is enabled.\n */\n async prepareSession(sessionId: string, signal?: AbortSignal): Promise<void> {\n const state = this.requireState('prepareSession');\n this.requireLoggedIn('prepareSession');\n const id = sessionId.trim();\n if (!id) return;\n\n try {\n await state.chat.prepareSession(id, signal);\n } catch (err) {\n if (signal?.aborted) return;\n if (state.options.debug) {\n console.warn('[agent-chat] prepareSession failed:', err);\n }\n }\n }\n\n /** Delete a chat session (`DELETE /chat/{sessionId}`) and refresh the sidebar list. */\n async deleteSession(sessionId: string): Promise<void> {\n const state = this.requireState('deleteSession');\n this.requireLoggedIn('deleteSession');\n const id = sessionId.trim();\n if (!id) {\n throw new AgentChatError('INVALID_OPTIONS', 'deleteSession: sessionId is required');\n }\n\n const normalizedId = normalizeSessionId(id);\n const isActive =\n state.activeSessionId != null &&\n normalizeSessionId(state.activeSessionId) === normalizedId;\n\n if (isActive) {\n this.sessionEpoch += 1;\n this.abortActiveStream();\n this.settlePendingAgentReplies(state);\n state.activeSessionId = null;\n state.activeSessionMessagesPage = 0;\n state.activeSessionMessagesHasMore = false;\n state.session.reset();\n state.messages = [];\n state.writeConfirmation = null;\n }\n\n for (const key of [...state.sessionMessagesCache.keys()]) {\n if (normalizeSessionId(key) === normalizedId) {\n state.sessionMessagesCache.delete(key);\n }\n }\n\n try {\n await state.chat.deleteSession(id);\n await this.refreshSessions();\n } catch (err) {\n const wrapped =\n err instanceof AgentChatError\n ? err\n : new AgentChatError('TRANSPORT_FAILED', 'Failed to delete session', { cause: err });\n this.reportError(wrapped);\n throw wrapped;\n }\n\n if (isActive) {\n const next = state.sessions[0];\n if (next) {\n await this.selectSession(next.sessionId);\n }\n }\n }\n\n /** Load session list via `GET /chat?page=1&size=` and update sidebar state. */\n async refreshSessions(signal?: AbortSignal): Promise<void> {\n const state = this.requireState('refreshSessions');\n this.requireLoggedIn('refreshSessions');\n const page = await this.fetchSessionsPage(state, 1, signal);\n state.sessions = page.sessions;\n state.sessionsPage = page.page;\n state.sessionsHasMore = page.hasMore;\n state.sessionsLoadingMore = false;\n this.notifyStateChange();\n this.bus.emit('sessions', { sessions: state.sessions });\n }\n\n /** Append the next page when the session sidebar is scrolled to the bottom. */\n async loadMoreSessions(signal?: AbortSignal): Promise<void> {\n const state = this.requireState('loadMoreSessions');\n this.requireLoggedIn('loadMoreSessions');\n if (!state.sessionsHasMore || state.sessionsLoadingMore) return;\n\n state.sessionsLoadingMore = true;\n this.notifyStateChange();\n try {\n const page = await this.fetchSessionsPage(state, state.sessionsPage + 1, signal);\n state.sessions = mergeSessionSummaries(state.sessions, page.sessions);\n state.sessionsPage = page.page;\n state.sessionsHasMore = page.hasMore;\n this.bus.emit('sessions', { sessions: state.sessions });\n } finally {\n state.sessionsLoadingMore = false;\n this.notifyStateChange();\n }\n }\n\n private async fetchSessionsPage(\n state: InternalState,\n page: number,\n signal?: AbortSignal,\n ) {\n const body = await state.chat.listSessions(page, state.sessionsPageSize, signal);\n return parseChatSessionListPage(body, page, state.sessionsPageSize);\n }\n\n /** Append older messages when the message list is scrolled to the top. */\n async loadMoreSessionMessages(signal?: AbortSignal): Promise<void> {\n const state = this.requireState('loadMoreSessionMessages');\n this.requireLoggedIn('loadMoreSessionMessages');\n const sessionId = state.activeSessionId;\n if (!sessionId || !state.activeSessionMessagesHasMore || state.sessionMessagesLoadingMore) {\n return;\n }\n\n state.sessionMessagesLoadingMore = true;\n this.notifyStateChange();\n try {\n const detailPage = await this.fetchSessionMessagesPage(\n state,\n sessionId,\n state.activeSessionMessagesPage + 1,\n signal,\n );\n const older = detailPage.messages.map((m) => this.toAgentMessage(m as ServerMessage));\n const merged = mergeOlderMessages(state.messages, older);\n state.messages = merged;\n state.activeSessionMessagesPage = detailPage.page;\n state.activeSessionMessagesHasMore = detailPage.hasMore;\n state.session.setSession(sessionId, merged);\n this.writeSessionMessagesCache(state, sessionId, merged, detailPage.page, detailPage.hasMore);\n this.notifyStateChange();\n void this.syncMessageFeedbacks(state, sessionId).catch(() => {\n /* feedback sync is best-effort */\n });\n } finally {\n state.sessionMessagesLoadingMore = false;\n this.notifyStateChange();\n }\n }\n\n async selectAgent(agentId: string): Promise<void> {\n const state = this.requireState('selectAgent');\n this.requireLoggedIn('selectAgent');\n const id = agentId.trim();\n if (!id || state.selectedAgentId === id) return;\n\n state.selectedAgentId = id;\n state.selectedSkillId = null;\n this.notifyStateChange();\n await this.refreshSkills(id);\n }\n\n selectSkill(skillId: string): void {\n const state = this.requireState('selectSkill');\n const id = skillId.trim();\n if (!id) {\n if (state.selectedSkillId == null) return;\n state.selectedSkillId = null;\n this.notifyStateChange();\n return;\n }\n if (state.selectedSkillId === id) return;\n state.selectedSkillId = id;\n this.notifyStateChange();\n }\n\n async refreshAgentCatalog(signal?: AbortSignal): Promise<void> {\n const state = this.requireState('refreshAgentCatalog');\n\n if (state.options.agents?.length) {\n state.agents = [...state.options.agents];\n state.agentsEmptyReason = null;\n this.syncDefaultAgentSelection(state);\n if (!state.options.skills?.length) {\n await this.refreshSkills(state.selectedAgentId ?? undefined, signal);\n }\n return;\n }\n\n if (!state.userJwt) return;\n\n state.agentsLoading = true;\n state.agentsEmptyReason = null;\n this.notifyStateChange();\n try {\n const body = await state.agent.listAvailableAgents(\n state.options.agentListQuery,\n signal,\n );\n const agents = parseAgentList(body);\n state.agents = agents;\n if (agents.length === 0) {\n state.agentsEmptyReason = await this.resolveAgentsEmptyReason(state, signal);\n }\n this.syncDefaultAgentSelection(state);\n await this.refreshSkills(state.selectedAgentId ?? undefined, signal);\n } catch {\n state.agents = [];\n state.agentsEmptyReason = null;\n this.applyStaticSkills(state);\n } finally {\n state.agentsLoading = false;\n this.notifyStateChange();\n }\n }\n\n private async resolveAgentsEmptyReason(\n state: InternalState,\n signal?: AbortSignal,\n ): Promise<AgentsEmptyReason> {\n try {\n const allBody = await state.agent.listAllClientAgents(signal);\n const allAgents = parseAgentList(allBody);\n return allAgents.length > 0 ? 'permission' : 'not_configured';\n } catch {\n return null;\n }\n }\n\n private async refreshSkills(agentId?: string, signal?: AbortSignal): Promise<void> {\n const state = this.requireState('refreshSkills');\n const normalizedAgentId = agentId?.trim() || state.selectedAgentId || undefined;\n\n if (state.options.skills?.length) {\n state.skills = normalizedAgentId\n ? state.options.skills.filter(\n (skill) => !skill.agentId || skill.agentId === normalizedAgentId,\n )\n : [...state.options.skills];\n this.syncDefaultSkillSelection(state);\n this.notifyStateChange();\n return;\n }\n\n if (!normalizedAgentId) {\n state.skills = [];\n state.selectedSkillId = null;\n this.notifyStateChange();\n return;\n }\n\n state.skillsLoading = true;\n this.notifyStateChange();\n try {\n const body = await state.agent.listClientSkills(\n normalizedAgentId,\n state.options.skillListQuery,\n signal,\n );\n state.skills = parseSkillList(body);\n this.syncDefaultSkillSelection(state);\n } catch {\n state.skills = [];\n state.selectedSkillId = null;\n } finally {\n state.skillsLoading = false;\n this.notifyStateChange();\n }\n }\n\n private applyStaticSkills(state: InternalState): void {\n const staticSkills = state.options.skills;\n if (!staticSkills?.length) return;\n const agentId = state.selectedAgentId;\n state.skills = agentId\n ? staticSkills.filter((skill) => !skill.agentId || skill.agentId === agentId)\n : [...staticSkills];\n this.syncDefaultSkillSelection(state);\n }\n\n private syncDefaultAgentSelection(state: InternalState): void {\n if (state.selectedAgentId) {\n if (!state.agents.some((agent) => agent.id === state.selectedAgentId)) {\n state.selectedAgentId = state.agents[0]?.id ?? state.selectedAgentId;\n }\n } else if (state.agents.length) {\n state.selectedAgentId = state.agents[0]!.id;\n }\n this.applyStaticSkills(state);\n }\n\n private syncDefaultSkillSelection(state: InternalState): void {\n const defaultSkillId = state.options.defaultSkillId?.trim();\n if (\n state.selectedSkillId &&\n state.skills.some((skill) => skill.id === state.selectedSkillId)\n ) {\n return;\n }\n if (defaultSkillId && state.skills.some((skill) => skill.id === defaultSkillId)) {\n state.selectedSkillId = defaultSkillId;\n return;\n }\n state.selectedSkillId = state.skills[0]?.id ?? null;\n }\n\n private getMessageSendContext(state: InternalState): MessageSendContext | undefined {\n const agentId = state.selectedAgentId?.trim();\n const skillId = state.selectedSkillId?.trim();\n if (!agentId && !skillId) return undefined;\n return {\n agentId: agentId || undefined,\n skillId: skillId || undefined,\n };\n }\n\n private async fetchSessionMessagesPage(\n state: InternalState,\n sessionId: string,\n page: number,\n signal?: AbortSignal,\n ) {\n const body = await state.chat.getSession(\n sessionId,\n page,\n state.sessionMessagesPageSize,\n signal,\n );\n const detailPage = parseChatSessionDetailPage(\n body,\n sessionId,\n page,\n state.sessionMessagesPageSize,\n );\n if (!detailPage) {\n throw new AgentChatError('TRANSPORT_FAILED', 'Invalid session detail response', {\n details: { sessionId, page },\n });\n }\n return detailPage;\n }\n\n /** Clear the active session so the next send creates a new chat. */\n startNewChat(): void {\n const state = this.requireState('startNewChat');\n this.requireLoggedIn('startNewChat');\n this.sessionEpoch += 1;\n this.abortActiveStream();\n if (state.activeSessionId) {\n this.writeSessionMessagesCache(state, state.activeSessionId);\n }\n state.activeSessionId = null;\n state.activeSessionMessagesPage = 0;\n state.activeSessionMessagesHasMore = false;\n state.session.reset();\n state.messages = [];\n state.writeConfirmation = null;\n this.notifyStateChange();\n }\n\n /** Stop the in-flight assistant SSE stream. */\n cancelGeneration(): void {\n this.abortActiveStream();\n }\n\n private abortActiveStream(): void {\n const state = this.state;\n if (!state?.activeStreamAbort) return;\n try {\n state.activeStreamAbort.abort();\n } catch {\n /* noop */\n }\n state.activeStreamAbort = null;\n state.activeStreamSessionId = null;\n state.activeStreamTargetMessageId = null;\n }\n\n private async ensureSessionStream(sessionId: string): Promise<void> {\n const state = this.requireState('ensureSessionStream');\n const normalizedId = normalizeSessionId(sessionId);\n if (state.activeStreamAbort && state.activeStreamSessionId === normalizedId) {\n return;\n }\n this.abortActiveStream();\n const streamCtrl = new AbortController();\n await this.connectSessionStream(normalizedId, streamCtrl);\n }\n\n private writeSessionMessagesCache(\n state: InternalState,\n sessionId: string,\n messages = state.messages,\n page = state.activeSessionMessagesPage,\n hasMore = state.activeSessionMessagesHasMore,\n ): void {\n state.sessionMessagesCache.set(sessionId, { messages, page, hasMore });\n }\n\n private cacheActiveSessionMessages(state: InternalState): void {\n if (!state.activeSessionId) return;\n this.writeSessionMessagesCache(state, state.activeSessionId);\n }\n\n /** Finalize in-flight assistant turns; drop only empty placeholders. */\n private settlePendingAgentReplies(state: InternalState): void {\n const next: AgentMessage[] = [];\n let changed = false;\n\n for (const message of state.messages) {\n if (message.role !== 'agent' || message.status !== 'pending') {\n next.push(message);\n continue;\n }\n changed = true;\n const stream = message.stream ?? createEmptyAgentStream();\n const text = (stream.resultText || message.content.text).trim();\n if (!text) continue;\n next.push(finalizeAgentReply(message, stream, { status: 'sent' }));\n }\n\n if (!changed) return;\n state.messages = next;\n this.cacheActiveSessionMessages(state);\n this.notifyStateChange();\n }\n\n private removeAgentMessage(state: InternalState, messageId: string): void {\n const next = state.messages.filter((m) => m.id !== messageId);\n if (next.length === state.messages.length) return;\n state.messages = next;\n this.cacheActiveSessionMessages(state);\n this.notifyStateChange();\n }\n\n private patchMessageById(\n state: InternalState,\n messageId: string,\n patch: (current: AgentMessage) => AgentMessage,\n ): AgentMessage | null {\n const current = state.messages.find((m) => m.id === messageId);\n if (!current) return null;\n const next = patch(current);\n state.messages = state.messages.map((m) => (m.id === messageId ? next : m));\n this.cacheActiveSessionMessages(state);\n this.notifyStateChange();\n this.bus.emit('message', { message: next, source: next.role === 'user' ? 'user' : 'agent' });\n return next;\n }\n\n private isExistingSentAssistantText(\n state: InternalState,\n text: string,\n excludeId: string,\n ): boolean {\n const normalized = text.trim();\n if (!normalized) return false;\n return state.messages.some(\n (m) =>\n m.role === 'agent' &&\n m.id !== excludeId &&\n m.status === 'sent' &&\n m.content.text.trim() === normalized,\n );\n }\n\n private resolveStreamTargetMessageId(state: InternalState, messageId?: string): string | null {\n if (messageId) return messageId;\n const explicit = state.activeStreamTargetMessageId;\n if (explicit && state.messages.some((m) => m.id === explicit)) return explicit;\n for (let i = state.messages.length - 1; i >= 0; i -= 1) {\n const message = state.messages[i];\n if (message?.role === 'agent' && (message.status ?? 'pending') === 'pending') {\n state.activeStreamTargetMessageId = message.id;\n return message.id;\n }\n }\n return null;\n }\n\n /** Empty assistant bubble for the in-flight turn (shown before SSE events arrive). */\n private appendAgentPlaceholder(state: InternalState): AgentMessage {\n const agentMessage: AgentMessage = {\n id: nanoId('msg'),\n role: 'agent',\n content: { type: 'text', text: '' },\n createdAt: Date.now(),\n status: 'pending',\n stream: createEmptyAgentStream(),\n };\n state.messages = [...state.messages, agentMessage];\n this.cacheActiveSessionMessages(state);\n this.notifyStateChange();\n this.bus.emit('message', { message: agentMessage, source: 'agent' });\n return agentMessage;\n }\n\n private appendOptimisticUserMessage(\n state: InternalState,\n text: string,\n id?: string,\n ): AgentMessage {\n const userMessage: AgentMessage = {\n id: id ?? nanoId('msg'),\n role: 'user',\n content: { type: 'text', text },\n createdAt: Date.now(),\n status: 'pending',\n };\n state.messages = [...state.messages, userMessage];\n this.cacheActiveSessionMessages(state);\n this.notifyStateChange();\n this.bus.emit('message', { message: userMessage, source: 'user' });\n return userMessage;\n }\n\n private async createChatSession(\n state: InternalState,\n content: string,\n signal: AbortSignal,\n ): Promise<string> {\n const createBody = await state.chat.createSession(\n content,\n signal,\n this.getMessageSendContext(state),\n );\n const created = parseCreateSessionResponse(createBody);\n if (!created?.sessionId) {\n throw new AgentChatError('TRANSPORT_FAILED', 'POST /chat did not return sessionId', {\n details: { body: createBody },\n });\n }\n state.activeSessionId = created.sessionId;\n state.activeSessionMessagesPage = 1;\n state.activeSessionMessagesHasMore = false;\n state.session.setSession(created.sessionId, state.messages);\n this.writeSessionMessagesCache(state, created.sessionId);\n this.bus.emit('session', state.session.getSession()!);\n return created.sessionId;\n }\n\n private applyUserMessageSent(state: InternalState, userMessage: AgentMessage): AgentMessage {\n const sentUser: AgentMessage = { ...userMessage, status: 'sent' };\n state.messages = state.messages.map((m) => (m.id === userMessage.id ? sentUser : m));\n this.cacheActiveSessionMessages(state);\n this.notifyStateChange();\n this.bus.emit('message', { message: sentUser, source: 'user' });\n return sentUser;\n }\n\n private async postUserMessageAndApply(\n state: InternalState,\n sessionId: string,\n content: string,\n signal: AbortSignal,\n userMessage: AgentMessage,\n ): Promise<AgentMessage> {\n const postBody = await state.chat.postMessage(\n sessionId,\n content,\n signal,\n this.getMessageSendContext(state),\n );\n const posted = parsePostedMessage(postBody);\n const sentUser: AgentMessage = posted\n ? { ...this.toAgentMessage(posted as ServerMessage), status: 'sent' }\n : { ...userMessage, status: 'sent' };\n state.messages = state.messages.map((m) => (m.id === userMessage.id ? sentUser : m));\n this.cacheActiveSessionMessages(state);\n this.notifyStateChange();\n this.bus.emit('message', { message: sentUser, source: sentUser.role });\n return sentUser;\n }\n\n private async postWriteConfirmationAction(\n state: InternalState,\n sessionId: string,\n flags: { confirmWrite?: true; cancelWrite?: true },\n signal: AbortSignal,\n ): Promise<void> {\n await state.chat.postWriteConfirmation(sessionId, flags, signal);\n }\n\n /**\n * Open `GET /chat/{sessionId}/stream` and resolve once the SSE connection is up.\n * Consumption continues in the background until the stream ends or is aborted.\n */\n private connectSessionStream(\n sessionId: string,\n streamCtrl: AbortController,\n ): Promise<void> {\n const state = this.requireState('connectSessionStream');\n state.activeStreamAbort = streamCtrl;\n state.activeStreamSessionId = normalizeSessionId(sessionId);\n state.abortControllers.add(streamCtrl);\n\n return new Promise<void>((resolve, reject) => {\n let settled = false;\n const settleResolve = () => {\n if (settled) return;\n settled = true;\n resolve();\n };\n const settleReject = (err: unknown) => {\n if (settled) return;\n settled = true;\n reject(err);\n };\n\n void this.consumeSessionStream(sessionId, streamCtrl, settleResolve)\n .catch((err) => {\n if (!settled) settleReject(err);\n })\n .finally(() => {\n state.abortControllers.delete(streamCtrl);\n if (state.activeStreamAbort === streamCtrl) {\n state.activeStreamAbort = null;\n state.activeStreamSessionId = null;\n }\n });\n });\n }\n\n private async consumeSessionStream(\n sessionId: string,\n ctrl: AbortController,\n onConnected?: () => void,\n ): Promise<void> {\n const state = this.requireState('consumeSessionStream');\n\n const getAgent = (id: string | null): AgentMessage | undefined =>\n id ? state.messages.find((m) => m.id === id) : undefined;\n\n const replaceAgentMessage = (next: AgentMessage, previousId: string): void => {\n state.messages = state.messages.map((m) => (m.id === previousId ? next : m));\n this.cacheActiveSessionMessages(state);\n this.notifyStateChange();\n this.bus.emit('message', { message: next, source: 'agent' });\n };\n\n try {\n for await (const chunk of state.chat.streamSession(sessionId, {\n signal: ctrl.signal,\n onConnected,\n })) {\n if (state.options.debug) {\n console.debug('[agent-chat] SSE', chunk.event, chunk.data.slice(0, 120));\n }\n\n const action = parseChatSseEvent(chunk.event, chunk.data);\n let currentTargetId =\n action.type === 'think' ||\n action.type === 'result' ||\n action.type === 'message-blocks' ||\n action.type === 'complete'\n ? this.resolveStreamTargetMessageId(state, action.messageId)\n : null;\n currentTargetId = this.maybeRebindStreamMessageId(\n state,\n currentTargetId,\n action.type === 'think' ||\n action.type === 'result' ||\n action.type === 'message-blocks' ||\n action.type === 'complete'\n ? action.messageId\n : undefined,\n );\n\n switch (action.type) {\n case 'think': {\n if (!currentTargetId) break;\n this.patchMessageById(state, currentTargetId, (current) => {\n const stream = { ...(current.stream ?? createEmptyAgentStream()) };\n const thinkText =\n action.mode === 'append'\n ? `${stream.thinkText}${action.text}`\n : action.text;\n const hasResult =\n Boolean(stream.resultText?.trim()) ||\n Boolean((stream.resultBlocks ?? current.blocks ?? []).length);\n return {\n ...current,\n status: 'pending',\n content: hasResult ? current.content : { type: 'text', text: '' },\n stream: {\n ...stream,\n thinkText,\n phase: hasResult ? 'result' : 'thinking',\n },\n };\n });\n break;\n }\n case 'result': {\n if (!currentTargetId) break;\n if (\n action.mode === 'replace' &&\n this.isExistingSentAssistantText(state, action.text, currentTargetId)\n ) {\n break;\n }\n this.patchMessageById(state, currentTargetId, (current) => {\n const stream = { ...(current.stream ?? createEmptyAgentStream()) };\n const nextResult =\n action.mode === 'append' ? `${stream.resultText}${action.text}` : action.text;\n return {\n ...current,\n status: 'pending',\n content: { type: 'text', text: nextResult },\n stream: { ...stream, resultText: nextResult, phase: 'result' },\n };\n });\n break;\n }\n case 'message-blocks': {\n if (\n !currentTargetId &&\n action.runId != null &&\n state.writeConfirmation?.submitting\n ) {\n const placeholder = this.appendAgentPlaceholder(state);\n state.activeStreamTargetMessageId = placeholder.id;\n currentTargetId = placeholder.id;\n }\n if (!currentTargetId) break;\n const streamSeq = action.seq;\n this.patchMessageById(state, currentTargetId, (current) => {\n const stream = { ...(current.stream ?? createEmptyAgentStream()) };\n const seenSeq = new Set<number>(stream.seenSeq ?? []);\n if (streamSeq != null && seenSeq.has(streamSeq)) return current;\n if (streamSeq != null) seenSeq.add(streamSeq);\n\n const previousBlocks = (stream.resultBlocks ?? current.blocks ?? []) as CoreMessageBlock[];\n let nextBlocks = previousBlocks;\n if (action.action === 'stream') {\n if (action.streamMode === 'full') {\n nextBlocks = applyStreamFull(previousBlocks, (action.blocks ?? []) as CoreMessageBlock[]);\n } else {\n nextBlocks = applyStreamDelta(previousBlocks, (action.blocks ?? []) as CoreMessageBlock[]);\n }\n } else if (action.action === 'patch') {\n nextBlocks = applyPatches(\n previousBlocks,\n (action.patches ?? []).map((patch) => ({\n replaceId: patch.replaceId,\n block: patch.block as CoreMessageBlock,\n })),\n );\n }\n\n nextBlocks = unwrapBlocksJsonEnvelope(nextBlocks);\n const nextResult = blocksToText(nextBlocks);\n return {\n ...current,\n status: 'pending',\n content: { type: 'text', text: nextResult },\n blocks: nextBlocks,\n stream: {\n ...stream,\n runId: action.runId ?? stream.runId,\n resultBlocks: nextBlocks,\n resultText: nextResult,\n phase: 'result',\n seenSeq: [...seenSeq],\n },\n };\n });\n break;\n }\n case 'write-confirmation-required': {\n state.writeConfirmation = {\n awaiting: true,\n submitting: false,\n runId: action.runId,\n turnId: action.turnId,\n message: action.message,\n };\n this.notifyStateChange();\n break;\n }\n case 'write-confirmation-cancelled': {\n state.writeConfirmation = null;\n this.notifyStateChange();\n const hint: AgentMessage = {\n id: nanoId('msg'),\n role: 'system',\n content: { type: 'text', text: action.message },\n createdAt: Date.now(),\n status: 'sent',\n };\n state.messages = [...state.messages, hint];\n this.cacheActiveSessionMessages(state);\n this.notifyStateChange();\n this.bus.emit('message', { message: hint, source: 'agent' });\n break;\n }\n case 'complete': {\n if (!currentTargetId) break;\n const current = getAgent(currentTargetId);\n if (!current) break;\n const awaitingConfirm = state.writeConfirmation?.awaiting;\n const stream = { ...(current.stream ?? createEmptyAgentStream()), phase: 'complete' as const };\n let finalized: AgentMessage;\n if (action.serverMessage) {\n const parsed = this.toAgentMessage(action.serverMessage as ServerMessage);\n finalized = finalizeAgentReply(\n { ...current, content: parsed.content, blocks: parsed.blocks ?? current.blocks },\n { ...stream, resultText: parsed.content.text, resultBlocks: parsed.blocks ?? stream.resultBlocks },\n { status: 'sent' },\n );\n } else {\n finalized = finalizeAgentReply(current, stream, { status: 'sent' });\n }\n const serverId = this.resolveCompleteServerMessageId(action);\n if (\n serverId &&\n serverId !== currentTargetId &&\n !state.messages.some((m) => m.id === serverId)\n ) {\n replaceAgentMessage({ ...finalized, id: serverId }, currentTargetId);\n } else {\n replaceAgentMessage(finalized, currentTargetId);\n }\n state.activeStreamTargetMessageId = null;\n if (!awaitingConfirm) {\n state.writeConfirmation = null;\n this.notifyStateChange();\n }\n void this.alignPersistedMessageIds(state, sessionId, {\n preferLocalId: currentTargetId,\n preferServerId: serverId,\n }).catch(() => {\n /* best-effort id alignment for feedback */\n });\n break;\n }\n case 'error': {\n if (action.code === 'WRITE_CONFIRMATION_EXPIRED') {\n state.writeConfirmation = null;\n this.notifyStateChange();\n }\n throw new AgentChatError('MESSAGE_FAILED', action.message, {\n details: action.code ? { code: action.code } : undefined,\n });\n }\n case 'noop':\n break;\n default:\n break;\n }\n }\n\n const snapshot = getAgent(this.resolveStreamTargetMessageId(state));\n if (snapshot && (snapshot.status ?? 'pending') === 'pending') {\n const stream = { ...(snapshot.stream ?? createEmptyAgentStream()), phase: 'complete' as const };\n replaceAgentMessage(finalizeAgentReply(snapshot, stream, { status: 'sent' }), snapshot.id);\n }\n void this.alignPersistedMessageIds(state, sessionId).catch(() => {\n /* best-effort id alignment for feedback */\n });\n } catch (err) {\n if ((err as { name?: string })?.name === 'AbortError') {\n const snapshot = getAgent(this.resolveStreamTargetMessageId(state));\n if (!snapshot) return;\n const stream = snapshot.stream ?? createEmptyAgentStream();\n const text = (stream.resultText || snapshot.content.text).trim();\n if (!text) {\n this.removeAgentMessage(state, snapshot.id);\n } else {\n replaceAgentMessage(\n finalizeAgentReply(snapshot, { ...stream, phase: 'complete' }, { status: 'sent' }),\n snapshot.id,\n );\n }\n return;\n }\n const snapshot = getAgent(this.resolveStreamTargetMessageId(state));\n if (snapshot) {\n const stream = snapshot.stream ?? createEmptyAgentStream();\n replaceAgentMessage(\n {\n ...snapshot,\n status: 'failed',\n stream: {\n ...stream,\n phase: 'error',\n errorMessage: err instanceof Error ? err.message : 'Stream failed',\n },\n },\n snapshot.id,\n );\n }\n const wrapped =\n err instanceof AgentChatError\n ? err\n : new AgentChatError('MESSAGE_FAILED', 'Failed to receive assistant reply', {\n cause: err,\n });\n this.reportError(wrapped);\n }\n }\n\n private toAgentMessage(input: ServerMessage): AgentMessage {\n const role =\n input.role === 'assistant' ? 'agent' : input.role === 'user' ? 'user' : 'system';\n const createdAtRaw = input.createdAt;\n const createdAt =\n typeof createdAtRaw === 'number'\n ? createdAtRaw\n : new Date(createdAtRaw as string | Date).getTime();\n const blocks = parseStoredBlocks(input.content);\n const text = blocks ? blocksToText(blocks) : input.content ?? '';\n return {\n id: String(input.id),\n role,\n content: { type: 'text', text },\n blocks,\n createdAt: Number.isFinite(createdAt) ? createdAt : Date.now(),\n status: 'sent',\n };\n }\n\n private resolveCompleteServerMessageId(action: {\n serverMessage?: { id?: string | number };\n messageId?: string;\n }): string | undefined {\n if (action.serverMessage?.id != null) {\n return String(action.serverMessage.id);\n }\n if (action.messageId && isPersistedMessageId(action.messageId)) {\n return action.messageId;\n }\n return undefined;\n }\n\n /**\n * SSE placeholders use client ids until the assistant message is persisted.\n * Match unresolved local agent bubbles to server ids from the latest session page.\n */\n private async alignPersistedMessageIds(\n state: InternalState,\n sessionId: string,\n opts: { preferLocalId?: string; preferServerId?: string } = {},\n ): Promise<void> {\n const preferLocalId = opts.preferLocalId?.trim();\n const preferServerId =\n opts.preferServerId && isPersistedMessageId(opts.preferServerId)\n ? opts.preferServerId\n : undefined;\n\n if (preferLocalId && preferServerId) {\n const current = state.messages.find((message) => message.id === preferLocalId);\n if (current && !isPersistedMessageId(current.id) && !state.messages.some((m) => m.id === preferServerId)) {\n state.messages = state.messages.map((message) =>\n message.id === preferLocalId ? { ...message, id: preferServerId } : message,\n );\n if (state.activeStreamTargetMessageId === preferLocalId) {\n state.activeStreamTargetMessageId = preferServerId;\n }\n this.cacheActiveSessionMessages(state);\n this.notifyStateChange();\n void this.syncMessageFeedbacks(state, sessionId).catch(() => {\n /* best-effort */\n });\n return;\n }\n }\n\n const unresolved = state.messages.filter(\n (message) =>\n message.role === 'agent' &&\n message.status === 'sent' &&\n !message.stream &&\n !isPersistedMessageId(message.id),\n );\n if (unresolved.length === 0) return;\n\n const detailPage = await this.fetchSessionMessagesPage(state, sessionId, 1);\n const serverAgents = detailPage.messages\n .map((raw) => this.toAgentMessage(raw as ServerMessage))\n .filter((message) => message.role === 'agent');\n\n const claimedServerIds = new Set(\n state.messages\n .filter((message) => message.role === 'agent' && isPersistedMessageId(message.id))\n .map((message) => message.id),\n );\n\n const available = serverAgents.filter((message) => !claimedServerIds.has(message.id));\n if (available.length === 0) return;\n\n const pairsStart = Math.max(0, available.length - unresolved.length);\n let changed = false;\n\n state.messages = state.messages.map((message) => {\n const unresolvedIndex = unresolved.findIndex((candidate) => candidate.id === message.id);\n if (unresolvedIndex < 0) return message;\n const server = available[pairsStart + unresolvedIndex];\n if (!server || !isPersistedMessageId(server.id)) return message;\n changed = true;\n return {\n ...message,\n id: server.id,\n createdAt: server.createdAt,\n };\n });\n\n if (!changed) return;\n this.cacheActiveSessionMessages(state);\n this.notifyStateChange();\n void this.syncMessageFeedbacks(state, sessionId).catch(() => {\n /* best-effort */\n });\n }\n\n private maybeRebindStreamMessageId(\n state: InternalState,\n currentTargetId: string | null,\n incomingMessageId?: string,\n ): string | null {\n if (!currentTargetId || !incomingMessageId || !isPersistedMessageId(incomingMessageId)) {\n return currentTargetId;\n }\n if (currentTargetId === incomingMessageId) return currentTargetId;\n if (isPersistedMessageId(currentTargetId)) return currentTargetId;\n if (state.messages.some((message) => message.id === incomingMessageId)) {\n return currentTargetId;\n }\n\n const current = state.messages.find((message) => message.id === currentTargetId);\n if (!current) return incomingMessageId;\n\n state.messages = state.messages.map((message) =>\n message.id === currentTargetId ? { ...message, id: incomingMessageId } : message,\n );\n if (state.activeStreamTargetMessageId === currentTargetId) {\n state.activeStreamTargetMessageId = incomingMessageId;\n }\n this.cacheActiveSessionMessages(state);\n this.notifyStateChange();\n return incomingMessageId;\n }\n\n private buildOptimisticFeedback(\n messageId: number,\n body: UpsertMessageFeedbackBody,\n ): MessageFeedbackView {\n const now = new Date().toISOString();\n if (body.rating === 'up') {\n return {\n messageId,\n rating: 'up',\n reasonTags: [],\n comment: null,\n createdAt: now,\n updatedAt: now,\n };\n }\n return {\n messageId,\n rating: 'down',\n reasonTags: body.reasonTags ?? [],\n comment: body.comment?.trim() || null,\n createdAt: now,\n updatedAt: now,\n };\n }\n\n private patchMessageFeedback(\n state: InternalState,\n messageId: string,\n feedback: MessageFeedbackView | null,\n ): void {\n const next = state.messages.map((message) =>\n message.id === messageId ? { ...message, feedback } : message,\n );\n if (next.every((message, index) => message === state.messages[index])) return;\n state.messages = next;\n this.cacheActiveSessionMessages(state);\n this.notifyStateChange();\n }\n\n private collectFeedbackMessageIds(messages: AgentMessage[]): number[] {\n const ids: number[] = [];\n for (const message of messages) {\n if (message.role !== 'agent' || message.status !== 'sent' || message.stream) continue;\n const numericId = parsePersistedMessageId(message.id);\n if (numericId !== null) ids.push(numericId);\n }\n return ids;\n }\n\n private async syncMessageFeedbacks(state: InternalState, sessionId: string): Promise<void> {\n const messageIds = this.collectFeedbackMessageIds(state.messages);\n if (messageIds.length === 0) return;\n\n const batch = await state.feedback.batchFeedbacks(sessionId, messageIds);\n const map = new Map<string, MessageFeedbackView>(\n batch.items.map((row: MessageFeedbackView) => [String(row.messageId), row]),\n );\n let changed = false;\n\n state.messages = state.messages.map((message) => {\n if (message.role !== 'agent' || !isPersistedMessageId(message.id)) return message;\n const nextFeedback: MessageFeedbackView | null = map.get(message.id) ?? null;\n const prev = message.feedback ?? null;\n if (prev === null && nextFeedback === null) return message;\n if (\n prev &&\n nextFeedback &&\n prev.rating === nextFeedback.rating &&\n prev.updatedAt === nextFeedback.updatedAt\n ) {\n return message;\n }\n changed = true;\n return { ...message, feedback: nextFeedback };\n });\n\n if (!changed) return;\n this.cacheActiveSessionMessages(state);\n this.notifyStateChange();\n }\n\n}\n\nfunction authUserToContext(user: AppClientAuthData['user']): UserContext | undefined {\n if (!user) return undefined;\n return {\n id: String(user.id),\n email: user.email,\n name: user.username,\n };\n}\n\nexport function createAgentChat(): AgentChatClient {\n return new AgentChatClient();\n}\n","import { AgentChatClient, createAgentChat } from './core/instance';\n\n/**\n * Headless singleton client. Mount UI with `<AgentChat />` from `omnix-chat/react`.\n */\nexport const AgentChat: AgentChatClient = createAgentChat();\n\nexport { createAgentChat, AgentChatClient } from './core/instance';\nexport { AgentChatError } from './core/errors';\nexport type { AgentChatErrorCode } from './core/errors';\nexport { normalizeDsn, DEFAULT_BASE_URL, DSN_AUTH_HEADER } from './core/resolve';\nexport { useAuthStore } from './core/auth-store';\nexport type { AppClientAuthData, AppClientInfo, AuthUser } from './core/auth-types';\nexport { SDK_VERSION } from './utils/sdk-version';\nexport type {\n AgentChatOptions,\n AgentChatInstance,\n AgentChatState,\n AgentChatLifecycle,\n AgentChatEventMap,\n AgentChatErrorPayload,\n AgentChatLoginCredentials,\n AgentChatMessagePayload,\n AgentMessage,\n AgentStreamState,\n AgentMessageContent,\n AgentMessageContentText,\n AgentMessageRole,\n AgentMessageStatus,\n SessionInfo,\n ChatSessionSummary,\n ChatAgentSummary,\n ChatSkillSummary,\n AgentsEmptyReason,\n QueryClientAvailableAgents,\n QueryClientSkillByAgent,\n ToolLevel,\n AgentChatSessionsPayload,\n AgentChatProjectConfig,\n AgentChatLauncherProps,\n Theme,\n UserContext,\n WidgetPosition,\n WriteConfirmationState,\n MessageFeedbackRating,\n MessageFeedbackDownReasonTag,\n MessageFeedbackView,\n UpsertMessageFeedbackBody,\n} from './types';\n\nexport default AgentChat;\n"],"x_google_ignoreList":[5,6,7,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29],"mappings":"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"}
|