@osvi-ai/chat 0.0.0-stage → 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/LICENSE +21 -0
- package/README.md +1 -3
- package/dist/core.js +10 -0
- package/dist/core.js.map +1 -0
- package/dist/index-BsRyQwUM.js +1331 -0
- package/dist/index-BsRyQwUM.js.map +1 -0
- package/dist/types/core/client.d.ts +65 -0
- package/dist/types/core/connection.d.ts +78 -0
- package/dist/types/core/errors.d.ts +14 -0
- package/dist/types/core/http.d.ts +38 -0
- package/dist/types/core/index.d.ts +7 -0
- package/dist/types/core/interactions.d.ts +50 -0
- package/dist/types/core/protocol/envelope.d.ts +2 -0
- package/dist/types/core/protocol/readers.d.ts +14 -0
- package/dist/types/core/protocol/types.d.ts +118 -0
- package/dist/types/core/protocol/validators.d.ts +10 -0
- package/dist/types/core/state.d.ts +23 -0
- package/dist/types/core/storage.d.ts +10 -0
- package/dist/types/core/version.d.ts +1 -0
- package/dist/types/ui/define.d.ts +1 -0
- package/dist/types/ui/index.d.ts +9 -0
- package/dist/types/ui/osvi-chat.d.ts +69 -0
- package/dist/types/ui/panel/attrs.d.ts +6 -0
- package/dist/types/ui/panel/composer.d.ts +10 -0
- package/dist/types/ui/panel/linkify.d.ts +7 -0
- package/dist/types/ui/panel/transcript.d.ts +4 -0
- package/dist/types/ui/strings.d.ts +27 -0
- package/dist/types/ui/styles.d.ts +1 -0
- package/dist/types/ui/theme.d.ts +22 -0
- package/dist/types/ui/tools/base.d.ts +14 -0
- package/dist/types/ui/tools/osvi-buttons.d.ts +10 -0
- package/dist/types/ui/tools/osvi-carousel.d.ts +16 -0
- package/dist/types/ui/tools/osvi-date-picker.d.ts +17 -0
- package/dist/types/widget/config.d.ts +22 -0
- package/dist/types/widget/index.d.ts +1 -0
- package/dist/types/widget/launcher.d.ts +35 -0
- package/dist/types/widget/widget.d.ts +13 -0
- package/dist/ui.js +49 -0
- package/dist/ui.js.map +1 -0
- package/dist/ui.mjs +570 -0
- package/dist/ui.mjs.map +1 -0
- package/dist/widget.js +59 -0
- package/dist/widget.js.map +1 -0
- package/package.json +60 -4
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-BsRyQwUM.js","sources":["../src/core/version.ts","../src/core/errors.ts","../src/core/http.ts","../src/core/protocol/types.ts","../src/core/protocol/validators.ts","../src/core/protocol/readers.ts","../src/core/interactions.ts","../src/core/protocol/envelope.ts","../src/core/connection.ts","../src/core/storage.ts","../src/core/client.ts"],"sourcesContent":["declare const __SDK_VERSION__: string;\nexport const SDK_VERSION: string = __SDK_VERSION__;\n","export type ChatErrorCode = 'origin_not_allowed' | 'agent_inactive' | 'agent_archived' | 'agent_not_found'\n | 'session_not_found' | 'session_closed' | 'invalid_customer_id' | 'invalid_token' | 'session_unavailable'\n | 'stream_unavailable' | 'token_failed' | 'rate_limited' | 'network' | 'interaction_not_pending'\n | 'interaction_suspended' | 'invalid_interaction' | 'unknown';\n\nexport interface ChatError {\n code: ChatErrorCode;\n message: string;\n retryable: boolean;\n retryAfterSeconds?: number;\n origin?: string;\n}\n\nconst CODES = new Set<ChatErrorCode>(['origin_not_allowed', 'agent_inactive', 'agent_archived', 'agent_not_found',\n 'session_not_found', 'session_closed', 'invalid_customer_id', 'invalid_token', 'session_unavailable',\n 'stream_unavailable', 'token_failed', 'rate_limited', 'network', 'interaction_not_pending',\n 'interaction_suspended', 'invalid_interaction', 'unknown']);\nconst RETRYABLE = new Set<ChatErrorCode>(['rate_limited', 'network', 'session_unavailable', 'stream_unavailable', 'token_failed']);\n\nexport function toChatError(code: string | undefined, message?: string): ChatError {\n const known = (code && CODES.has(code as ChatErrorCode) ? code : 'unknown') as ChatErrorCode;\n return { code: known, message: message || known, retryable: RETRYABLE.has(known) };\n}\n\nexport class ChatRequestError extends Error {\n constructor(public readonly error: ChatError, public readonly status: number) {\n super(error.message);\n this.name = 'ChatRequestError';\n }\n}\n","import { ChatRequestError, toChatError } from './errors';\n\nexport interface MintedToken { token: string; wsUrl: string; expiresAt: number }\nexport interface PublicSession { id: string; mode: string; status: string; help_requested?: boolean; created_at?: string }\nexport interface Snapshot {\n session: PublicSession | null;\n messages: unknown[];\n active_interaction?: unknown;\n interaction_cursor?: string;\n interaction_response_message?: unknown;\n}\nexport interface Bootstrap extends Snapshot { agent: { agent_uuid: string; name: string; features: string[] } }\n\nconst DEFAULT_TTL_MS = 300_000;\n\nexport function normalizeExpiry(expiresAt: number | undefined, now: number = Date.now()): number {\n if (typeof expiresAt !== 'number' || !Number.isFinite(expiresAt)) return now + DEFAULT_TTL_MS;\n return expiresAt < 1e12 ? expiresAt * 1000 : expiresAt;\n}\n\nexport class HttpClient {\n private readonly base: string;\n\n constructor(baseUrl: string, private readonly fetchImpl: typeof fetch = (...a) => globalThis.fetch.bind(globalThis)(...a)) {\n this.base = baseUrl.replace(/\\/+$/, '');\n }\n\n resolveUrl(path: string): string {\n return `${this.base}${path}`;\n }\n\n bootstrap(agentId: string, customerId: string, signal?: AbortSignal): Promise<Bootstrap> {\n const q = `?customer_id=${encodeURIComponent(customerId)}`;\n return this.request<Bootstrap>(`/public/chat/agents/${encodeURIComponent(agentId)}/bootstrap${q}`, { signal });\n }\n\n createSession(agentId: string, customerId: string): Promise<PublicSession> {\n return this.request<PublicSession>(`/public/chat/agents/${encodeURIComponent(agentId)}/session`, {\n method: 'POST', body: JSON.stringify({ customer_id: customerId }),\n });\n }\n\n async mintPublicToken(sessionId: string): Promise<MintedToken> {\n const d = await this.request<{ token?: string; ws_url?: string; expires_at?: number }>(\n `/public/chat/session/${encodeURIComponent(sessionId)}/ws_token`, { method: 'POST', body: '{}' });\n if (!d?.token || !d?.ws_url) throw new ChatRequestError(toChatError('stream_unavailable'), 200);\n return { token: d.token, wsUrl: d.ws_url, expiresAt: normalizeExpiry(d.expires_at) };\n }\n\n snapshot(sessionId: string, token: string): Promise<Snapshot> {\n return this.request<Snapshot>(`/public/chat/session/${encodeURIComponent(sessionId)}/snapshot`, {\n headers: { Authorization: `Bearer ${token}` },\n });\n }\n\n private async request<T>(path: string, init: RequestInit = {}): Promise<T> {\n let response: Response;\n try {\n const f = this.fetchImpl; // local call: a method call would bind `this` to the client\n const headers: Record<string, string> = { ...(init.headers as Record<string, string> | undefined) };\n if (init.body !== undefined) headers['Content-Type'] = 'application/json';\n response = await f(this.resolveUrl(path), { ...init, credentials: 'omit', headers });\n } catch (e) {\n if ((e as { name?: string })?.name === 'AbortError') throw e;\n throw new ChatRequestError(toChatError('network', 'Network error'), 0);\n }\n let body: Record<string, unknown> | null = null;\n try { body = (await response.json()) as Record<string, unknown>; } catch { body = null; }\n if (!response.ok || body?.success === false) {\n const error = toChatError(typeof body?.error === 'string' ? body.error : undefined,\n typeof body?.message === 'string' ? body.message : undefined);\n if (typeof body?.origin === 'string') error.origin = body.origin;\n if (response.status === 429) {\n error.code = 'rate_limited';\n error.retryable = true;\n const header = Number(response.headers.get('Retry-After'));\n const fromBody = Number(body?.retry_after);\n const seconds = Number.isFinite(header) && header > 0 ? header : fromBody;\n if (Number.isFinite(seconds) && seconds > 0) error.retryAfterSeconds = seconds;\n }\n throw new ChatRequestError(error, response.status);\n }\n return ((body?.data ?? body) as T);\n }\n}\n","export interface InteractionCapability {\n tool_type: string;\n schema_version: number;\n}\n\nexport interface ChoiceOption {\n id: string;\n label: string;\n description?: string;\n allow_input?: true;\n input_placeholder?: string;\n}\n\nexport interface ChoicePresentation {\n label: string;\n description?: string;\n options: ChoiceOption[];\n}\n\nexport interface CarouselImage {\n url: string;\n alt: string;\n}\n\nexport interface CarouselItem {\n id: string;\n title: string;\n description?: string;\n image?: CarouselImage;\n action_label?: string;\n}\n\nexport interface CarouselPresentation {\n label: string;\n description?: string;\n items: CarouselItem[];\n}\n\nexport interface DatePickerPresentation {\n label: string;\n description?: string;\n selection_mode: 'single' | 'range';\n min_date?: string;\n max_date?: string;\n confirm_label?: string;\n}\n\nexport type InteractionPresentation =\n | ChoicePresentation\n | CarouselPresentation\n | DatePickerPresentation;\n\nexport type InteractionResponse =\n | { kind: 'selection'; value: string }\n | { kind: 'text'; value: string }\n | { kind: 'date'; value: string }\n | { kind: 'date_range'; value: { start_date: string; end_date: string } };\n\nexport interface InteractionMessage {\n id: string;\n type: 'interaction';\n role: string;\n content: string;\n created_at?: string;\n interaction_id: string;\n tool_type: string;\n schema_version: number;\n presentation: InteractionPresentation;\n interaction_status: 'preparing' | 'pending' | 'accepted' | 'resumed' | 'cancelled' | 'expired';\n interaction_revision: number;\n selected_option_id?: string | null;\n response_payload?: InteractionResponse | null;\n}\n\nexport const SUPPORTED_INTERACTIONS = [\n { tool_type: 'ui_buttons', schema_version: 1 },\n { tool_type: 'ui_buttons', schema_version: 2 },\n { tool_type: 'ui_carousel', schema_version: 1 },\n { tool_type: 'ui_date_picker', schema_version: 1 },\n] as const;\n\nexport interface WireEnvelope {\n type: string;\n session_id?: string;\n account_id?: number | string;\n ts?: string;\n event_id?: string | number;\n payload: Record<string, unknown>;\n}\n\nexport type WriteState = 'accepted' | 'merged' | 'done' | 'failed' | 'busy' | 'invalid' | 'error';\n\nexport interface WriteResult {\n state: WriteState;\n error?: string;\n message_id?: string;\n turn_id?: string;\n interaction_id?: string;\n merged_into?: string;\n}\n\nexport interface WireMessage {\n id: string;\n role: 'user' | 'ai' | 'assistant' | 'operator' | 'support' | 'system';\n content: string;\n created_at?: string;\n type?: 'message' | 'interaction';\n}\n\nexport interface PublicRow extends Partial<Omit<InteractionMessage, 'id' | 'role' | 'content' | 'type' | 'presentation'>> {\n id: string;\n role: 'assistant' | 'user' | 'operator' | 'system';\n content: string;\n ts: string;\n type?: 'message' | 'interaction';\n presentation?: unknown;\n local?: true;\n}\n","import type {\n CarouselPresentation,\n ChoicePresentation,\n DatePickerPresentation,\n InteractionCapability,\n InteractionPresentation,\n InteractionResponse,\n} from './types';\n\nconst PRESENTATION_BYTES = 65_536;\nconst RESPONSE_TEXT_CODE_POINTS = 2_000;\nconst RESPONSE_TEXT_BYTES = 8_192;\nconst URL_CHARACTERS = 2_048;\nconst IDENTIFIER = /^[A-Za-z0-9_-]{1,64}$/;\n\nconst object = (value: unknown): value is Record<string, unknown> =>\n !!value && typeof value === 'object' && !Array.isArray(value);\nconst only = (value: Record<string, unknown>, keys: readonly string[]) =>\n Object.keys(value).every((key) => keys.includes(key));\nconst codePoints = (value: string) => [...value].length;\nconst bytes = (value: string) => new TextEncoder().encode(value).length;\nconst hasDisallowedControl = (value: string) =>\n [...value].some((character) => {\n const code = character.codePointAt(0) ?? 0;\n return code === 127 || (code < 32 && code !== 9 && code !== 10 && code !== 13);\n });\nconst hasUrlWhitespaceOrControl = (value: string) =>\n [...value].some((character) => {\n const code = character.codePointAt(0) ?? 0;\n return code <= 32 || code === 127;\n });\nconst text = (value: unknown, maximum: number, required = false): value is string =>\n typeof value === 'string' && codePoints(value) <= maximum && !hasDisallowedControl(value) &&\n (!required || value.trim().length > 0);\nconst canonical = (value: unknown): unknown =>\n Array.isArray(value) ? value.map(canonical) : object(value)\n ? Object.fromEntries(Object.keys(value).sort().map((key) => [key, canonical(value[key])])) : value;\nconst withinPresentationBudget = (value: unknown) => {\n try {\n return bytes(JSON.stringify(canonical(value))) <= PRESENTATION_BYTES;\n } catch {\n return false;\n }\n};\n\nexport function isProxyImageUrl(value: unknown): value is string {\n return typeof value === 'string' && /^\\/public\\/chat\\/images\\/[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\\/(?:0|[1-9][0-9]*)$/i.test(value);\n}\n\nexport function isPublicHttpsUrl(value: unknown): value is string {\n if (typeof value !== 'string' || value.length === 0 || value.length > URL_CHARACTERS || hasUrlWhitespaceOrControl(value)) return false;\n try {\n const url = new URL(value);\n const hostname = url.hostname.toLowerCase();\n if (url.protocol !== 'https:' || url.username || url.password || url.hash || url.port) return false;\n if (!hostname || hostname === 'localhost' || hostname.endsWith('.localhost') || hostname.endsWith('.local') || hostname.endsWith('.internal')) return false;\n if (hostname.startsWith('[') || /^\\d{1,3}(?:\\.\\d{1,3}){3}$/.test(hostname)) return false;\n return url.toString().length <= URL_CHARACTERS;\n } catch {\n return false;\n }\n}\n\nexport function isChoicePresentation(value: unknown, maximum?: number): value is ChoicePresentation {\n if (!object(value) || !only(value, ['label', 'description', 'options']) || !text(value.label, 160, true) ||\n ('description' in value && value.description !== undefined && !text(value.description, 240)) || !Array.isArray(value.options) || value.options.length === 0 ||\n (maximum !== undefined && value.options.length > maximum)) return false;\n const ids = new Set<string>();\n let typedOptions = 0;\n for (const option of value.options) {\n if (!object(option) || !only(option, ['id', 'label', 'description', 'allow_input', 'input_placeholder']) ||\n typeof option.id !== 'string' || !IDENTIFIER.test(option.id) || ids.has(option.id) || !text(option.label, 80, true) ||\n ('description' in option && option.description !== undefined && !text(option.description, 240))) return false;\n const allowsInput = option.allow_input === true;\n if ('allow_input' in option && !allowsInput) return false;\n if ('input_placeholder' in option && (!allowsInput || !text(option.input_placeholder, 160, true))) return false;\n if (allowsInput) typedOptions += 1;\n if (typedOptions > 1) return false;\n ids.add(option.id);\n }\n return withinPresentationBudget(value);\n}\n\nexport function isButtonsV1Presentation(value: unknown, maximum?: number): value is ChoicePresentation {\n return isChoicePresentation(value, maximum) && value.options.every((option) =>\n !Object.prototype.hasOwnProperty.call(option, 'allow_input') &&\n !Object.prototype.hasOwnProperty.call(option, 'input_placeholder'));\n}\n\nexport function isCarouselPresentation(value: unknown, maximum?: number, allowProxy = false): value is CarouselPresentation {\n if (!object(value) || !only(value, ['label', 'description', 'items']) || !text(value.label, 160, true) ||\n ('description' in value && value.description !== undefined && !text(value.description, 240)) || !Array.isArray(value.items) || value.items.length === 0 ||\n (maximum !== undefined && value.items.length > maximum)) return false;\n const ids = new Set<string>();\n for (const item of value.items) {\n if (!object(item) || !only(item, ['id', 'title', 'description', 'image', 'action_label']) ||\n typeof item.id !== 'string' || !IDENTIFIER.test(item.id) || ids.has(item.id) || !text(item.title, 120, true) ||\n ('description' in item && item.description !== undefined && !text(item.description, 500)) ||\n ('action_label' in item && item.action_label !== undefined && !text(item.action_label, 80, true))) return false;\n if ('image' in item && item.image !== undefined) {\n if (!object(item.image) || !only(item.image, ['url', 'alt']) ||\n !(isPublicHttpsUrl(item.image.url) || (allowProxy && isProxyImageUrl(item.image.url))) || !text(item.image.alt, 240, true)) return false;\n }\n ids.add(item.id);\n }\n return withinPresentationBudget(value);\n}\n\nexport function isCalendarDate(value: unknown): value is string {\n if (typeof value !== 'string' || !/^[0-9]{4}-[0-9]{2}-[0-9]{2}$/.test(value)) return false;\n const year = Number(value.slice(0, 4));\n const month = Number(value.slice(5, 7));\n const day = Number(value.slice(8, 10));\n if (year < 1 || year > 9999 || month < 1 || month > 12 || day < 1) return false;\n const leap = year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0);\n const monthDays = [31, leap ? 29 : 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\n return day <= monthDays[month - 1]!;\n}\n\nexport function isDatePickerPresentation(value: unknown): value is DatePickerPresentation {\n if (!object(value) || !only(value, ['label', 'description', 'min_date', 'max_date', 'confirm_label', 'selection_mode']) || !text(value.label, 160, true) ||\n !['single', 'range'].includes(String(value.selection_mode)) ||\n ('description' in value && value.description !== undefined && !text(value.description, 240)) ||\n ('confirm_label' in value && value.confirm_label !== undefined && !text(value.confirm_label, 80, true)) ||\n ('min_date' in value && value.min_date !== undefined && !isCalendarDate(value.min_date)) ||\n ('max_date' in value && value.max_date !== undefined && !isCalendarDate(value.max_date))) return false;\n if (typeof value.min_date === 'string' && typeof value.max_date === 'string' && value.min_date > value.max_date) return false;\n return withinPresentationBudget(value);\n}\n\nexport function isInteractionPresentation(pair: InteractionCapability, value: unknown): value is InteractionPresentation {\n if (pair.tool_type === 'ui_buttons' && pair.schema_version === 1) return isButtonsV1Presentation(value);\n if (pair.tool_type === 'ui_buttons' && pair.schema_version === 2) return isChoicePresentation(value);\n if (pair.tool_type === 'ui_carousel' && pair.schema_version === 1) return isCarouselPresentation(value, undefined, true);\n if (pair.tool_type === 'ui_date_picker' && pair.schema_version === 1) return isDatePickerPresentation(value);\n return false;\n}\n\nexport function isInteractionResponse(pair: InteractionCapability, value: unknown): value is InteractionResponse {\n if (!object(value) || !only(value, ['kind', 'value']) || Object.keys(value).length !== 2) return false;\n if (value.kind === 'date_range') {\n return pair.tool_type === 'ui_date_picker' && pair.schema_version === 1 && object(value.value) &&\n only(value.value, ['start_date', 'end_date']) && Object.keys(value.value).length === 2 &&\n isCalendarDate(value.value.start_date) && isCalendarDate(value.value.end_date) &&\n value.value.start_date < value.value.end_date;\n }\n if (typeof value.value !== 'string') return false;\n if (value.kind === 'selection') return (pair.tool_type === 'ui_buttons' || pair.tool_type === 'ui_carousel') && IDENTIFIER.test(value.value);\n if (value.kind === 'text') return pair.tool_type === 'ui_buttons' && pair.schema_version === 2 && value.value === value.value.trim() &&\n text(value.value, RESPONSE_TEXT_CODE_POINTS, true) && bytes(value.value) <= RESPONSE_TEXT_BYTES;\n if (value.kind === 'date') return pair.tool_type === 'ui_date_picker' && pair.schema_version === 1 && isCalendarDate(value.value);\n return false;\n}\n\n","import type { InteractionMessage, PublicRow, WireMessage } from './types';\nimport { isInteractionResponse } from './validators';\n\nconst object = (value: unknown): value is Record<string, unknown> =>\n value !== null && typeof value === 'object' && !Array.isArray(value);\nconst statuses = new Set(['preparing', 'pending', 'accepted', 'resumed', 'cancelled', 'expired']);\n\nexport function readInteraction(value: unknown): (InteractionMessage & { role: 'assistant' }) | null {\n if (!object(value) || value.type !== 'interaction' || typeof value.id !== 'string' || !value.id ||\n value.role !== 'assistant' || typeof value.content !== 'string' ||\n typeof value.interaction_id !== 'string' || !value.interaction_id ||\n typeof value.tool_type !== 'string' || !Number.isSafeInteger(value.schema_version) || Number(value.schema_version) < 1 ||\n !Number.isSafeInteger(value.interaction_revision) || Number(value.interaction_revision) < 1 ||\n !statuses.has(String(value.interaction_status)) || !object(value.presentation)) return null;\n const pair = { tool_type: value.tool_type, schema_version: Number(value.schema_version) };\n const responsePayload = value.response_payload;\n if (responsePayload !== undefined && responsePayload !== null && !isInteractionResponse(pair, responsePayload)) return null;\n return {\n id: value.id, type: 'interaction', role: 'assistant', content: value.content,\n interaction_id: value.interaction_id, tool_type: value.tool_type, schema_version: Number(value.schema_version),\n presentation: value.presentation as unknown as InteractionMessage['presentation'],\n interaction_status: value.interaction_status as InteractionMessage['interaction_status'],\n interaction_revision: Number(value.interaction_revision),\n ...(typeof value.created_at === 'string' ? { created_at: value.created_at } : {}),\n ...(typeof value.selected_option_id === 'string' ? { selected_option_id: value.selected_option_id } : {}),\n ...(responsePayload !== undefined ? { response_payload: responsePayload as InteractionMessage['response_payload'] } : {}),\n };\n}\n\nexport function readPublicMessage(value: unknown): PublicRow | null {\n if (!object(value) || (typeof value.id !== 'string' && typeof value.id !== 'number') ||\n typeof value.content !== 'string' || !['assistant', 'user', 'operator', 'system'].includes(String(value.role))) return null;\n const interaction = readInteraction({ ...value, id: String(value.id) });\n return {\n id: String(value.id), content: value.content,\n type: value.type === 'interaction' ? 'interaction' : 'message',\n ts: typeof value.created_at === 'string' ? value.created_at : typeof value.ts === 'string' ? value.ts : new Date().toISOString(),\n ...(interaction ?? {}),\n role: value.role as PublicRow['role'],\n };\n}\n\nexport function interactionCursor(value: unknown): string | null {\n return typeof value === 'string' && /^\\d+$/.test(value) ? value.replace(/^0+(?=\\d)/, '') : null;\n}\n\nexport function compareCursors(left: string, right: string): number {\n return left.length === right.length ? (left === right ? 0 : left > right ? 1 : -1) : left.length > right.length ? 1 : -1;\n}\n\nexport function mergeItems<T extends { id: string; interaction_id?: string; interaction_revision?: number; interaction_status?: string }>(current: T[], additions: T[]): T[] {\n const result = [...current];\n for (const message of additions) {\n const index = result.findIndex((row) => row.id === message.id ||\n (message.interaction_id && row.interaction_id === message.interaction_id));\n if (index < 0) result.push(message);\n else {\n const previous = result[index]!;\n const lifecycleRank = (row: T) => row.interaction_status === 'preparing' ? 0 :\n row.interaction_status === 'pending' ? 1 : row.interaction_status === 'accepted' ? 2 : 3;\n const equalRevisionDowngrade = message.interaction_revision === previous.interaction_revision &&\n lifecycleRank(message) < lifecycleRank(previous);\n if (!equalRevisionDowngrade && (!message.interaction_revision || !previous.interaction_revision ||\n message.interaction_revision >= previous.interaction_revision)) result[index] = { ...previous, ...message };\n }\n }\n return result;\n}\n\nconst WIRE_ROLES = new Set(['user', 'ai', 'assistant', 'operator', 'support', 'system']);\n\nexport function readWireMessage(v: unknown): WireMessage | null {\n if (!v || typeof v !== 'object') return null;\n const o = v as Record<string, unknown>;\n const id = typeof o.id === 'number' ? String(o.id) : o.id;\n if (typeof id !== 'string' || id === '') return null;\n if (typeof o.content !== 'string') return null;\n if (typeof o.role !== 'string' || !WIRE_ROLES.has(o.role)) return null;\n const out: WireMessage = { id, role: o.role as WireMessage['role'], content: o.content };\n if (typeof o.created_at === 'string') out.created_at = o.created_at;\n if (o.type === 'interaction' || o.type === 'message') out.type = o.type;\n return out;\n}\n","import type { Snapshot } from './http';\nimport type { TranscriptItem, Message } from './state';\nimport { SUPPORTED_INTERACTIONS, type InteractionMessage, type InteractionResponse, type PublicRow, type WireEnvelope, type WriteResult } from './protocol/types';\nimport { compareCursors, interactionCursor, mergeItems, readInteraction, readPublicMessage } from './protocol/readers';\nimport { isButtonsV1Presentation, isCarouselPresentation, isChoicePresentation, isDatePickerPresentation, isInteractionResponse } from './protocol/validators';\nexport interface InteractionHost {\n sessionId(): string | null;\n humanConnected(): boolean;\n sendFrame(frame: Record<string, unknown>): boolean;\n updateItems(fn: (items: TranscriptItem[]) => TranscriptItem[]): void;\n refreshSnapshot(): Promise<Snapshot | null>;\n onChange(): void;\n newId(): string;\n}\nexport type InteractionError = { code: 'interaction_not_pending' | 'interaction_suspended' | 'invalid_interaction' | 'network'; message: string };\ninterface Selection {\n interactionId: string;\n messageId: string;\n original: InteractionMessage;\n frame: Record<string, unknown>;\n acknowledged: boolean;\n sent: boolean;\n}\n\nconst activeOffer = (offer: InteractionMessage) => ['pending', 'accepted'].includes(offer.interaction_status);\nexport class InteractionController {\n private _active: InteractionMessage | null = null;\n private _cursor = '0';\n private _pending = false;\n private _error: InteractionError | null = null;\n private operations = new Map<string, Selection>();\n private operation: Selection | null = null;\n private generation = 0;\n private refreshInFlight = false;\n private recoveryCursor: string | null = null;\n constructor(private readonly host: InteractionHost) {}\n get active(): InteractionMessage | null { return this._active; }\n get cursor(): string { return this._cursor; }\n get pending(): boolean { return this._pending; }\n get error(): InteractionError | null { return this._error; }\n private setActive(value: InteractionMessage | null): void { this._active = value; this.host.onChange(); }\n private setCursor(value: string): void { this._cursor = value; this.host.onChange(); }\n private setSelectionPending(value: boolean): void { this._pending = value; this.host.onChange(); }\n private setInteractionError(value: InteractionError | null): void { this._error = value; this.host.onChange(); }\n private setRows(fn: (rows: PublicRow[]) => PublicRow[]): void {\n this.host.updateItems((items) => {\n let cut = items.length;\n while (cut > 0 && items[cut - 1]!.kind !== 'divider') cut -= 1;\n const tail = items.slice(cut);\n return [...items.slice(0, cut), ...fromRows(fn(toRows(tail)), tail)];\n });\n }\n reset() {\n this.generation += 1;\n this.refreshInFlight = false;\n this.recoveryCursor = null;\n this.setActive(null);\n this._cursor = '0';\n this.setCursor('0');\n this.operations.clear();\n this.operation = null;\n this.setSelectionPending(false);\n this.setInteractionError(null);\n }\n\n private reject(operation: Selection, reason: InteractionError) {\n this.operations.delete(operation.interactionId);\n if (this.operations.size === 0) this.recoveryCursor = null;\n if (this.operation === operation) this.operation = null;\n this.setSelectionPending(false);\n this.setInteractionError(reason);\n const current = this._active;\n const restore = current?.interaction_id === operation.interactionId &&\n current.interaction_revision <= operation.original.interaction_revision;\n if (restore) this.setActive(operation.original);\n this.setRows((rows) => rows.filter((row) => row.id !== operation.messageId)\n .map((row) => restore && row.interaction_id === operation.interactionId ? readPublicMessage(operation.original)! : row));\n }\n\n private mergeProjection(offer: InteractionMessage | null, answer: unknown) {\n const response = readPublicMessage(answer);\n const operation = offer && this.operations.get(offer.interaction_id);\n if (operation && response?.role === 'user') {\n this.operations.delete(operation.interactionId);\n if (this.operations.size === 0) this.recoveryCursor = null;\n if (this.operation === operation) this.operation = null;\n this.setSelectionPending(false);\n this.setInteractionError(null);\n }\n const rows = [offer && readPublicMessage(offer), response?.role === 'user' ? response : null].filter((row): row is PublicRow => row !== null);\n this.setRows((current) => {\n // The continuation can arrive before the accepted-choice event. Replace\n // the optimistic answer in place so reconciliation cannot move it below\n // the assistant's reply, and discard any earlier canonical echo.\n const reconciled = operation && response?.role === 'user' &&\n current.some((row) => row.id === operation.messageId)\n ? current.flatMap((row) => row.id === operation.messageId ? [response] :\n row.id === response.id ? [] : [row])\n : current;\n return mergeItems(reconciled, rows);\n });\n }\n\n private refreshMissingOutcome(minimumCursor: string) {\n if (this.operations.size === 0) {\n this.recoveryCursor = null;\n return;\n }\n if (this.recoveryCursor === null || compareCursors(minimumCursor, this.recoveryCursor) > 0) {\n this.recoveryCursor = minimumCursor;\n }\n if (this.refreshInFlight) return;\n const requestedCursor = this.recoveryCursor;\n const requestedOperations = [...this.operations.values()];\n const stillUnresolved = (operation: Selection) => this.operations.get(operation.interactionId) === operation;\n const scope = this.generation;\n const sessionId = this.host.sessionId();\n this.refreshInFlight = true;\n this.setSelectionPending(true);\n void this.host.refreshSnapshot().then((snapshot) => {\n if (!snapshot) throw new Error(\"Snapshot unavailable\");\n if (scope !== this.generation || sessionId !== this.host.sessionId() || (snapshot.session !== null && snapshot.session.id !== sessionId)) return;\n if (!requestedOperations.some(stillUnresolved)) return;\n const nextCursor = interactionCursor(snapshot.interaction_cursor);\n if (nextCursor === null || compareCursors(nextCursor, this.recoveryCursor ?? requestedCursor) < 0 || compareCursors(nextCursor, this._cursor) < 0) return;\n const offer = snapshot.active_interaction === null ? null : readInteraction(snapshot.active_interaction);\n if (snapshot.active_interaction !== null && (!offer || !activeOffer(offer))) return;\n const canonical = snapshot.messages.map(readPublicMessage).filter((row): row is PublicRow => row !== null);\n const linked = readPublicMessage(snapshot.interaction_response_message);\n if (offer) canonical.push(readPublicMessage(offer)!);\n if (linked?.role === 'user') canonical.push(linked);\n const settled = requestedOperations.filter((operation) => stillUnresolved(operation) &&\n (offer?.interaction_id !== operation.interactionId || (offer.interaction_status === 'accepted' && linked?.role === 'user')));\n const optimisticIds = new Set(settled.map((operation) => operation.messageId));\n this.setRows((rows) => mergeItems(rows.filter((row) => !optimisticIds.has(row.id)), canonical)\n .sort((left, right) => (Date.parse(left.ts) - Date.parse(right.ts)) || 0));\n settled.forEach((operation) => this.operations.delete(operation.interactionId));\n if (this.operation && settled.includes(this.operation)) this.operation = null;\n this._cursor = nextCursor;\n this.recoveryCursor = null;\n this.setCursor(nextCursor);\n this.setActive(offer);\n this.setSelectionPending(this.operation !== null);\n this.setInteractionError(null);\n }).catch(() => {\n if (scope === this.generation && requestedOperations.some(stillUnresolved)) {\n this.setInteractionError({ code: 'network', message: 'Reconnecting to confirm your selection…' });\n }\n }).finally(() => {\n if (scope === this.generation) {\n this.refreshInFlight = false;\n if (this.operations.size === 0) {\n this.recoveryCursor = null;\n return;\n }\n // A lifecycle event received during this request raises the required\n // snapshot cursor; never lose it behind the in-flight request guard.\n const required = this.recoveryCursor;\n if (required !== null && compareCursors(required, requestedCursor) > 0) this.refreshMissingOutcome(required);\n }\n });\n }\n\n private hasMissingOutcome(offer: InteractionMessage | null): boolean { return [...this.operations.values()].some((operation) => !offer || operation.interactionId !== offer.interaction_id); }\n\n applySnapshot(snapshot: Snapshot) {\n const nextCursor = interactionCursor(snapshot.interaction_cursor);\n if (nextCursor === null || !Object.prototype.hasOwnProperty.call(snapshot, 'active_interaction')) return;\n const order = compareCursors(nextCursor, this._cursor);\n if (order < 0) return;\n const offer = snapshot.active_interaction === null ? null : readInteraction(snapshot.active_interaction);\n if (snapshot.active_interaction !== null && (!offer || !activeOffer(offer))) return;\n if (order > 0 && this.hasMissingOutcome(offer)) {\n this.refreshMissingOutcome(nextCursor);\n return;\n }\n // Equal-revision polls cannot undo a local selection still awaiting its outcome.\n if (order === 0 && (this.operation || (offer && this.operations.has(offer.interaction_id)) ||\n (offer === null && this._active))) return;\n this._cursor = nextCursor;\n this.setCursor(nextCursor);\n this.setActive(offer);\n this.mergeProjection(offer, snapshot.interaction_response_message);\n if (!offer || this.operation?.interactionId !== offer.interaction_id) {\n this.operation = null;\n this.setSelectionPending(false);\n }\n }\n\n applyEvent(event: WireEnvelope): boolean {\n if (!['interaction_published', 'interaction_updated', 'interaction_closed'].includes(event.type)) return false;\n if (event.session_id && event.session_id !== this.host.sessionId()) return true;\n const nextCursor = interactionCursor(event.payload.interaction_cursor);\n const offer = readInteraction(event.payload);\n if (!offer || offer.interaction_status === 'preparing' || nextCursor === null || compareCursors(nextCursor, this._cursor) <= 0) return true;\n if (this.hasMissingOutcome(offer) || (!activeOffer(offer) && this.operations.has(offer.interaction_id) &&\n !readPublicMessage(event.payload.interaction_response_message))) {\n this.refreshMissingOutcome(nextCursor);\n return true;\n }\n this._cursor = nextCursor;\n this.setCursor(nextCursor);\n this.mergeProjection(offer, event.payload.interaction_response_message);\n if (activeOffer(offer)) this.setActive(offer);\n else if (this._active?.interaction_id === offer.interaction_id) this.setActive(null);\n if (this.operation && (this.operation.interactionId !== offer.interaction_id || !activeOffer(offer))) {\n this.operation = null;\n this.setSelectionPending(false);\n }\n return true;\n }\n\n handleWriteResult(result: WriteResult): boolean {\n const payload = result as unknown as Record<string, unknown>;\n const operation = [...this.operations.values()].find((item) => item.messageId === payload.message_id);\n if (!operation) return false;\n if (payload.error || ['refused', 'failed', 'error', 'busy'].includes(String(payload.state))) {\n const code = ['interaction_not_pending', 'interaction_suspended', 'invalid_interaction', 'network'].includes(String(payload.error)) ? payload.error as InteractionError['code'] : 'invalid_interaction';\n this.reject(operation, { code, message: String(payload.error || payload.reason || 'The selection was not accepted. Please try again.') });\n } else {\n operation.acknowledged = true;\n if (this.operation === operation) this.operation = null;\n this.setSelectionPending(false);\n this.setInteractionError(null);\n }\n return true;\n }\n\n respond(interactionId: string, response: InteractionResponse): boolean {\n const offer = this._active;\n if (!this.host.sessionId() || this.host.humanConnected() || this.operation || !offer ||\n offer.interaction_id !== interactionId || offer.interaction_status !== 'pending' ||\n !SUPPORTED_INTERACTIONS.some((pair) => pair.tool_type === offer.tool_type && pair.schema_version === offer.schema_version) ||\n !isInteractionResponse(offer, response)) return false;\n const legacy = offer.tool_type === 'ui_buttons' && offer.schema_version === 1;\n let displayText: string | null = null;\n if (legacy && response.kind === 'selection' && isButtonsV1Presentation(offer.presentation)) {\n displayText = offer.presentation.options.find((option) => option.id === response.value)?.label ?? null;\n } else if (!legacy && response.kind === 'text' && offer.tool_type === 'ui_buttons' && isChoicePresentation(offer.presentation)) {\n displayText = response.value;\n } else if (!legacy && response.kind === 'selection' && offer.tool_type === 'ui_buttons' && isChoicePresentation(offer.presentation)) {\n displayText = offer.presentation.options.find((option) => option.id === response.value)?.label ?? null;\n } else if (response.kind === 'selection' && offer.tool_type === 'ui_carousel' && isCarouselPresentation(offer.presentation, undefined, true)) {\n displayText = offer.presentation.items.find((item) => item.id === response.value)?.title ?? null;\n } else if (response.kind === 'date' && offer.tool_type === 'ui_date_picker' && offer.schema_version === 1 &&\n isDatePickerPresentation(offer.presentation) && offer.presentation.selection_mode === 'single') {\n if ((!offer.presentation.min_date || response.value >= offer.presentation.min_date) &&\n (!offer.presentation.max_date || response.value <= offer.presentation.max_date)) displayText = response.value;\n } else if (response.kind === 'date_range' && offer.tool_type === 'ui_date_picker' && offer.schema_version === 1 &&\n isDatePickerPresentation(offer.presentation) && offer.presentation.selection_mode === 'range') {\n const { start_date: start, end_date: end } = response.value;\n if ((!offer.presentation.min_date || start >= offer.presentation.min_date) &&\n (!offer.presentation.max_date || end <= offer.presentation.max_date)) displayText = `${start} to ${end}`;\n }\n if (!displayText) return false;\n const messageId = this.host.newId();\n const operation: Selection = {\n interactionId, messageId, original: offer, acknowledged: false, sent: false,\n frame: { type: 'interaction_response', interaction_id: interactionId,\n ...(legacy ? { option_id: response.value } : { response }),\n message_id: messageId, idempotency_key: this.host.newId(), supported_interactions: SUPPORTED_INTERACTIONS },\n };\n this.operations.set(interactionId, operation);\n this.operation = operation;\n this.setSelectionPending(true);\n this.setInteractionError(null);\n const optimistic: InteractionMessage = { ...offer, interaction_status: 'accepted',\n ...(legacy ? { selected_option_id: response.value as string } : { response_payload: response }) };\n this.setActive(optimistic);\n this.setRows((rows) => mergeItems(rows, [readPublicMessage(optimistic)!,\n { id: messageId, type: 'message', role: 'user', content: displayText!, ts: new Date().toISOString(), local: true }]));\n operation.sent = this.host.sendFrame(operation.frame);\n return true;\n }\n\n onConnectionOpen(): void {\n const operation = this.operation;\n if (operation && !operation.acknowledged && !this.host.humanConnected()) {\n operation.sent = this.host.sendFrame(operation.frame);\n }\n }\n}\n\nexport function toRows(items: TranscriptItem[]): PublicRow[] {\n const rows: PublicRow[] = [];\n for (const item of items) {\n if (item.kind === 'interaction') rows.push(readPublicMessage(item.interaction)!);\n else if (item.kind === 'message') {\n rows.push({ id: item.serverId ?? item.id, type: 'message', role: item.role === 'human' ? 'operator' : item.role,\n content: item.content, ts: item.createdAt });\n }\n }\n return rows;\n}\n\nexport function fromRows(rows: PublicRow[], previous: TranscriptItem[]): TranscriptItem[] {\n const known = new Map<string, Message>();\n for (const item of previous) if (item.kind === 'message') { known.set(item.id, item); if (item.serverId) known.set(item.serverId, item); }\n const out: TranscriptItem[] = [];\n for (const row of rows) {\n if (row.type === 'interaction' && row.interaction_id) {\n const interaction = readInteraction(row);\n if (interaction) out.push({ kind: 'interaction', id: row.interaction_id, interaction });\n continue;\n }\n if (row.role === 'system') continue;\n const prev = known.get(row.id);\n if (prev) { out.push(prev.content === row.content ? prev : { ...prev, content: row.content }); continue; }\n if (row.local) {\n out.push({ kind: 'message', id: row.id, role: 'user', content: row.content, createdAt: row.ts, status: 'sending' });\n continue;\n }\n out.push({ kind: 'message', id: `srv:${row.id}`, serverId: row.id, role: row.role === 'operator' ? 'human' : row.role,\n content: row.content, createdAt: row.ts, status: 'sent' });\n }\n return out;\n}\n","import type { WireEnvelope } from './types';\n\nexport function parseEnvelope(data: unknown): WireEnvelope | null {\n let raw: unknown = data;\n if (typeof data === 'string') {\n try { raw = JSON.parse(data); } catch { return null; }\n }\n if (!raw || typeof raw !== 'object' || Array.isArray(raw)) return null;\n const o = raw as Record<string, unknown>;\n if (typeof o.type !== 'string') return null;\n const payload = o.payload && typeof o.payload === 'object' && !Array.isArray(o.payload)\n ? (o.payload as Record<string, unknown>) : {};\n return { ...(o as object), type: o.type, payload } as WireEnvelope;\n}\n","import { ChatRequestError, toChatError, type ChatError } from './errors';\nimport type { MintedToken } from './http';\nimport { parseEnvelope } from './protocol/envelope';\nimport type { WireEnvelope } from './protocol/types';\n\nexport type ConnectionStatus = 'connecting' | 'open' | 'recovering' | 'offline';\nexport interface PageSignals {\n isVisible(): boolean;\n onVisible(cb: () => void): () => void;\n onOnline(cb: () => void): () => void;\n}\nexport interface ConnectionOptions {\n mint: () => Promise<MintedToken>;\n sdkVersion: string;\n onFrame: (env: WireEnvelope) => void;\n onStatus: (status: ConnectionStatus) => void;\n onOpen: () => void;\n onReconnected: () => void;\n onError: (error: ChatError) => void;\n onClosed: (reason: string) => void;\n WebSocketImpl?: typeof WebSocket;\n page?: PageSignals;\n random?: () => number;\n}\n\nexport const PING_INTERVAL_MS = 25_000;\nexport const SILENCE_LIMIT_MS = 60_000;\nexport const ROTATE_LEAD_MS = 30_000;\nexport const AGENT_INACTIVE_RETRY_MS = 60_000;\nexport const BACKOFF_MS = [1000, 2000, 4000, 8000, 16000, 30000];\nconst ROTATE_RETRY_MS = 10_000;\nconst CLIENT_ROTATE = 4000;\nconst MAX_AUTH_CLOSES = 2;\nconst TERMINAL_MINT_CODES = new Set(['invalid_token', 'session_not_found', 'session_closed', 'origin_not_allowed', 'agent_archived', 'agent_not_found']);\n\nexport function browserPage(): PageSignals {\n return {\n isVisible: () => typeof document === 'undefined' || document.visibilityState !== 'hidden',\n onVisible: (cb) => {\n const h = () => { if (document.visibilityState !== 'hidden') cb(); };\n if (typeof document === 'undefined') return () => {};\n document.addEventListener('visibilitychange', h);\n return () => document.removeEventListener('visibilitychange', h);\n },\n onOnline: (cb) => {\n if (typeof window === 'undefined') return () => {};\n window.addEventListener('online', cb);\n return () => window.removeEventListener('online', cb);\n },\n };\n}\n\nfunction detach(s: WebSocket | null): void {\n if (!s) return;\n s.onopen = null; s.onmessage = null; s.onclose = null; s.onerror = null;\n}\n\nexport class StreamConnection {\n private socket: WebSocket | null = null; // current socket\n private next: WebSocket | null = null; // rotation socket, not yet open\n private stopped = false;\n private started = false;\n private everOpened = false;\n private failures = 0;\n private authCloses = 0; // consecutive 4401 closes without a successful open\n private epoch = 0; // bumped on every close of the current socket\n private rotating = false;\n private pingSupported = true;\n private lastInbound = 0;\n private lastPingSentAt = 0;\n private expiresAt = 0;\n private timers = new Set<ReturnType<typeof setTimeout>>();\n private pingTimer: ReturnType<typeof setInterval> | null = null;\n private waitingForPage = new Set<() => void>();\n private readonly page: PageSignals;\n private readonly WS: typeof WebSocket;\n private readonly random: () => number;\n\n constructor(private readonly opts: ConnectionOptions) {\n this.page = opts.page ?? browserPage();\n this.WS = opts.WebSocketImpl ?? WebSocket;\n this.random = opts.random ?? Math.random;\n }\n\n get isOpen(): boolean {\n return !this.stopped && this.socket?.readyState === 1;\n }\n\n start(): void {\n if (this.started || this.stopped) return;\n this.started = true;\n this.opts.onStatus('connecting');\n void this.connect();\n }\n\n send(frame: Record<string, unknown>): boolean {\n if (!this.isOpen) return false;\n this.socket!.send(JSON.stringify(frame));\n return true;\n }\n\n stop(): void {\n this.stopped = true;\n this.epoch += 1;\n this.clearTimers();\n this.stopPings();\n this.waitingForPage.forEach((off) => off());\n this.waitingForPage.clear();\n this.abandon(this.next); this.next = null;\n this.abandon(this.socket); this.socket = null;\n }\n\n private abandon(s: WebSocket | null): void {\n detach(s);\n try { s?.close(1000, 'client-stop'); } catch { /* already closed */ }\n }\n\n private recoveringStatus(): ConnectionStatus {\n return this.everOpened ? 'recovering' : 'connecting';\n }\n\n private urlFor(m: MintedToken): string {\n const sep = m.wsUrl.includes('?') ? '&' : '?';\n return `${m.wsUrl}${sep}token=${encodeURIComponent(m.token)}&sdk=${encodeURIComponent(this.opts.sdkVersion)}`;\n }\n\n private async connect(): Promise<void> {\n if (this.stopped) return;\n const epoch = this.epoch;\n let minted: MintedToken;\n try {\n minted = await this.opts.mint();\n } catch (e) {\n if (this.stopped || epoch !== this.epoch) return;\n this.handleMintFailure(e);\n return;\n }\n if (this.stopped || epoch !== this.epoch) return;\n try { this.openSocket(minted, false); } catch (e) { this.handleMintFailure(e); }\n }\n\n // Handlers are bound to `s`: events from a socket that is no longer current are ignored.\n private openSocket(minted: MintedToken, rotation: boolean): void {\n const s = new this.WS(this.urlFor(minted));\n if (rotation) this.next = s; else { this.socket = s; this.expiresAt = minted.expiresAt; }\n s.onopen = () => {\n if (this.stopped) return;\n if (rotation) { if (this.next === s) this.swapIn(s, minted.expiresAt); } else if (this.socket === s) this.handleOpen();\n };\n s.onmessage = (e: MessageEvent) => { if (this.socket === s) this.handleMessage(e.data); };\n s.onclose = (e: CloseEvent) => {\n if (this.stopped) return;\n if (this.next === s) { // rotation socket died before opening: keep the current one, retry later\n detach(s);\n this.next = null;\n this.later(ROTATE_RETRY_MS, () => this.whenVisible(() => void this.rotate()));\n return;\n }\n if (this.socket === s) this.handleClose(e.code, e.reason);\n };\n }\n\n private handleOpen(): void {\n const reconnect = this.everOpened;\n this.everOpened = true;\n this.failures = 0;\n this.authCloses = 0;\n this.pingSupported = true;\n this.lastInbound = Date.now();\n this.opts.onStatus('open');\n if (this.stopped) return;\n this.startPings();\n this.scheduleRotation();\n if (this.stopped) return;\n this.opts.onOpen();\n if (reconnect && !this.stopped) this.opts.onReconnected();\n }\n\n private swapIn(s: WebSocket, expiresAt: number): void {\n const old = this.socket;\n this.next = null;\n this.socket = s;\n this.expiresAt = expiresAt;\n this.failures = 0;\n this.authCloses = 0;\n this.pingSupported = true;\n detach(old);\n try { old?.close(CLIENT_ROTATE, 'token-refresh'); } catch { /* already closed */ }\n this.clearTimers();\n this.lastInbound = Date.now();\n this.startPings();\n this.scheduleRotation();\n this.opts.onOpen(); // client resends unacked frames\n if (!this.stopped) this.opts.onReconnected(); // client reconciles; status stays 'open'\n }\n\n private handleMessage(data: unknown): void {\n if (this.stopped) return;\n this.lastInbound = Date.now();\n const env = parseEnvelope(data);\n if (!env) return;\n if (env.type === 'ws_write_result' && env.payload.error === 'invalid_input_type' && !env.payload.message_id) {\n this.pingSupported = false; // engine predates ping; rely on reconnects\n this.stopPings();\n return;\n }\n this.opts.onFrame(env);\n }\n\n private handleClose(code: number, reason: string): void {\n if (this.stopped) return;\n this.epoch += 1;\n detach(this.socket);\n this.socket = null;\n this.abandon(this.next); this.next = null;\n this.rotating = false;\n this.stopPings();\n this.clearTimers();\n this.clearPageListeners();\n if (code === 4401) {\n this.authCloses += 1;\n if (this.authCloses > MAX_AUTH_CLOSES) { // reconnecting is not fixing it\n this.opts.onError(toChatError('invalid_token'));\n this.scheduleBackoff();\n return;\n }\n this.opts.onStatus(this.recoveringStatus());\n this.whenVisible(() => this.reconnectNow());\n return;\n }\n if (code === 1008 && reason === 'agent_inactive') {\n this.opts.onError(toChatError('agent_inactive'));\n if (!this.stopped) this.opts.onStatus(this.recoveringStatus());\n this.later(AGENT_INACTIVE_RETRY_MS, () => this.reconnectNow());\n return;\n }\n if (code === 1008) { this.terminate(reason || 'policy'); return; }\n this.scheduleBackoff();\n }\n\n private handleMintFailure(e: unknown): void {\n const err = e instanceof ChatRequestError ? e.error : toChatError('network');\n if (err.code === 'agent_inactive') {\n this.opts.onError(err);\n if (!this.stopped) this.opts.onStatus(this.recoveringStatus());\n this.later(AGENT_INACTIVE_RETRY_MS, () => this.reconnectNow());\n return;\n }\n if (TERMINAL_MINT_CODES.has(err.code)) { this.terminate(err.code); return; }\n if (err.code === 'rate_limited' && err.retryAfterSeconds) {\n this.opts.onError(err);\n if (!this.stopped) this.opts.onStatus(this.recoveringStatus());\n this.later(err.retryAfterSeconds * 1000, () => this.reconnectNow());\n return;\n }\n this.scheduleBackoff();\n }\n\n private reconnectNow(): void {\n if (this.stopped) return;\n this.opts.onStatus(this.recoveringStatus());\n void this.connect();\n }\n\n private scheduleBackoff(): void {\n if (this.stopped) return;\n const index = Math.min(this.failures, BACKOFF_MS.length - 1);\n this.failures += 1;\n if (this.failures > BACKOFF_MS.length) { // the 7th consecutive failure\n this.opts.onStatus('offline');\n this.retryWhenReachable();\n return;\n }\n this.opts.onStatus(this.recoveringStatus());\n const delay = Math.round(BACKOFF_MS[index]! * (0.8 + 0.4 * this.random()));\n this.later(delay, () => void this.connect());\n }\n\n // First of online / visible / 30 s timer wins and cancels the other two.\n private retryWhenReachable(): void {\n if (this.stopped) return;\n let fired = false;\n const cancel = () => { clearTimeout(timer); this.timers.delete(timer); offVisible(); offOnline(); this.waitingForPage.delete(cancel); };\n const retry = () => { if (fired || this.stopped) return; fired = true; cancel(); this.reconnectNow(); };\n const offVisible = this.page.onVisible(retry);\n const offOnline = this.page.onOnline(retry);\n const timer = setTimeout(() => { if (!this.stopped) retry(); }, BACKOFF_MS[BACKOFF_MS.length - 1]);\n this.timers.add(timer);\n this.waitingForPage.add(cancel);\n }\n\n private whenVisible(fn: () => void): void {\n if (this.stopped) return;\n if (this.page.isVisible()) { fn(); return; }\n let fired = false;\n const off = this.page.onVisible(() => {\n if (fired || this.stopped || !this.page.isVisible()) return;\n fired = true; off(); this.waitingForPage.delete(off); fn();\n });\n this.waitingForPage.add(off);\n }\n\n private startPings(): void {\n this.stopPings();\n this.lastPingSentAt = 0;\n this.pingTimer = setInterval(() => {\n if (this.stopped || !this.isOpen || !this.pingSupported) return;\n const now = Date.now();\n const pingedSinceInbound = this.lastPingSentAt > this.lastInbound;\n if (this.page.isVisible() && pingedSinceInbound && now - this.lastInbound >= SILENCE_LIMIT_MS) {\n this.declareDead();\n return;\n }\n if (this.send({ type: 'ping' })) this.lastPingSentAt = now;\n }, PING_INTERVAL_MS);\n }\n\n private declareDead(): void {\n const s = this.socket;\n if (!s) return;\n detach(s);\n try { s.close(4001, 'silent'); } catch { /* already dead */ }\n this.handleClose(4001, 'silent'); // do not wait for an onclose that may never come\n }\n\n private stopPings(): void {\n if (this.pingTimer !== null) clearInterval(this.pingTimer);\n this.pingTimer = null;\n }\n\n private scheduleRotation(): void {\n const delay = Math.max(5_000, this.expiresAt - Date.now() - ROTATE_LEAD_MS);\n this.later(delay, () => this.whenVisible(() => void this.rotate()));\n }\n\n // Mint first, open the new socket, close the old one only once the new one is open.\n private async rotate(): Promise<void> {\n if (this.stopped || this.rotating || !this.isOpen || this.next) return;\n this.rotating = true;\n const epoch = this.epoch;\n let minted: MintedToken;\n try {\n minted = await this.opts.mint();\n } catch (e) {\n if (this.stopped || epoch !== this.epoch) return;\n this.rotating = false;\n const err = e instanceof ChatRequestError ? e.error : toChatError('network');\n if (TERMINAL_MINT_CODES.has(err.code)) { this.terminate(err.code); return; }\n const wait = err.retryAfterSeconds ? err.retryAfterSeconds * 1000 : ROTATE_RETRY_MS;\n this.later(wait, () => this.whenVisible(() => void this.rotate())); // current socket stays open\n return;\n }\n if (this.stopped || epoch !== this.epoch) return; // socket closed meanwhile; its own reconnect mints\n this.rotating = false;\n try { this.openSocket(minted, true); } catch {\n this.later(ROTATE_RETRY_MS, () => this.whenVisible(() => void this.rotate()));\n }\n }\n\n private terminate(reason: string): void {\n this.stop();\n this.opts.onClosed(reason);\n }\n\n private later(ms: number, fn: () => void): void {\n if (this.stopped) return;\n const t = setTimeout(() => { this.timers.delete(t); if (!this.stopped) fn(); }, ms);\n this.timers.add(t);\n }\n\n private clearPageListeners(): void {\n this.waitingForPage.forEach((off) => off());\n this.waitingForPage.clear();\n }\n\n private clearTimers(): void {\n this.timers.forEach(clearTimeout);\n this.timers.clear();\n }\n}\n","export interface KeyValueStore {\n get(key: string): string | null;\n set(key: string, value: string): void;\n remove(key: string): void;\n}\n\nexport const VISITOR_KEY = 'osvi.chat.visitor';\nconst VISITOR_FORMAT = /^web:[0-9a-f]{32}$/;\n\nexport function memoryStore(): KeyValueStore {\n const values = new Map<string, string>();\n return {\n get: (key) => values.get(key) ?? null,\n set: (key, value) => void values.set(key, value),\n remove: (key) => void values.delete(key),\n };\n}\n\nexport function browserStore(): KeyValueStore {\n const memory = memoryStore();\n let broken = false;\n const attempt = <T>(operation: () => T, fallback: () => T): T => {\n if (broken) return fallback();\n try {\n return operation();\n } catch {\n broken = true;\n return fallback();\n }\n };\n\n return {\n get: (key) => attempt(() => window.localStorage.getItem(key), () => memory.get(key)),\n set: (key, value) => attempt(() => window.localStorage.setItem(key, value), () => memory.set(key, value)),\n remove: (key) => attempt(() => window.localStorage.removeItem(key), () => memory.remove(key)),\n };\n}\n\nconst toVisitorId = (bytes: Uint8Array): string =>\n `web:${Array.from(bytes, (byte) => byte.toString(16).padStart(2, '0')).join('')}`;\n\nlet ephemeralId: string | null = null;\n\nexport function getVisitorId(store: KeyValueStore, random?: () => Uint8Array): string {\n const existing = store.get(VISITOR_KEY);\n if (existing && VISITOR_FORMAT.test(existing)) return existing;\n if (existing !== null) store.remove(VISITOR_KEY);\n\n let bytes: Uint8Array | undefined;\n if (random) {\n bytes = random();\n } else {\n try {\n bytes = globalThis.crypto?.getRandomValues?.(new Uint8Array(16));\n } catch {\n // Some browsers expose crypto but deny access to its random source.\n }\n }\n\n if (bytes) {\n const id = toVisitorId(bytes);\n store.set(VISITOR_KEY, id);\n return id;\n }\n\n if (!ephemeralId) {\n const weak = new Uint8Array(16);\n for (let index = 0; index < weak.length; index += 1) {\n weak[index] = Math.floor(Math.random() * 256);\n }\n ephemeralId = toVisitorId(weak);\n }\n\n return ephemeralId;\n}\n\nexport function sessionHintKey(agentId: string): string {\n return `osvi.chat.session.${agentId}`;\n}\n","import { ChatRequestError, toChatError, type ChatError } from './errors';\nimport { HttpClient, normalizeExpiry, type MintedToken, type Snapshot } from './http';\nimport { InteractionController } from './interactions';\nimport { browserPage, StreamConnection, type PageSignals } from './connection';\nimport { readInteraction, readWireMessage } from './protocol/readers';\nimport { SUPPORTED_INTERACTIONS, type InteractionMessage, type InteractionResponse, type WireEnvelope, type WriteResult } from './protocol/types';\nimport type { Divider, Message, TranscriptItem } from './state';\nimport { browserStore, getVisitorId, sessionHintKey, type KeyValueStore } from './storage';\nimport { SDK_VERSION } from './version';\n\nexport const DEFAULT_BASE_URL = 'https://api.osvi.ai';\nexport const AWAITING_REPLY_TIMEOUT_MS = 120_000;\nexport const SEND_ACK_TIMEOUT_MS = 15_000;\nconst BUSY_DELAYS_MS = [1000, 2000, 4000, 8000, 16000];\nconst SEEN_EVENT_CAP = 2048;\nconst QUIET_END_REASONS = new Set(['session_closed', 'session_dormant', 'new_session']);\n\nexport interface ServerToken { sessionId: string; token: string; wsUrl: string; expiresAt: number }\nexport type ChatAuth = { mode: 'anonymous' } | { mode: 'server'; getToken: (opts?: { newSession?: boolean }) => Promise<ServerToken> };\nexport interface ChatClientOptions {\n agentId: string; baseUrl?: string; auth?: ChatAuth;\n fetch?: typeof fetch; WebSocketImpl?: typeof WebSocket; store?: KeyValueStore; page?: PageSignals; random?: () => number;\n}\nexport type ChatStatus = 'idle' | 'connecting' | 'open' | 'recovering' | 'offline' | 'closed';\nexport interface ChatState {\n status: ChatStatus;\n mode: 'ai' | 'human';\n awaitingReply: boolean;\n items: TranscriptItem[];\n activeInteraction: InteractionMessage | null;\n interactionPending: boolean;\n agent: { agentId: string; name: string } | null;\n error: ChatError | null;\n}\nexport type SendOutcome = { ok: true; messageId: string } | { ok: false; reason: 'empty' | 'destroyed' | 'awaiting_interaction' | 'unavailable' };\nexport interface ChatClient {\n start(): Promise<void>;\n send(text: string): Promise<SendOutcome>;\n respond(interactionId: string, response: InteractionResponse): Promise<boolean>;\n retry(messageId: string): Promise<boolean>;\n newSession(): Promise<boolean>;\n subscribe(listener: (state: ChatState) => void): () => void;\n getState(): ChatState;\n resolveUrl(path: string): string;\n destroy(): void;\n}\n\ninterface PendingSend {\n frame: Record<string, unknown>;\n attempts: number;\n gen: number; // socket generation this frame was last written on (-1: never)\n ackTimer: ReturnType<typeof setTimeout> | null;\n}\n\n// Message ids and idempotency keys are not secrets, so the last-resort fallback is allowed here.\n// Anything security-relevant (the visitor id, D4) never falls back to Math.random.\nfunction uuid(): string {\n const c = globalThis.crypto;\n if (c?.randomUUID) return c.randomUUID();\n if (c?.getRandomValues) {\n const b = c.getRandomValues(new Uint8Array(16));\n b[6] = (b[6]! & 0x0f) | 0x40; b[8] = (b[8]! & 0x3f) | 0x80;\n const h = Array.from(b, (x) => x.toString(16).padStart(2, '0')).join('');\n return `${h.slice(0, 8)}-${h.slice(8, 12)}-${h.slice(12, 16)}-${h.slice(16, 20)}-${h.slice(20)}`;\n }\n return `${Date.now().toString(16)}-${Math.random().toString(16).slice(2)}`;\n}\n\nconst emptyState = (): ChatState => ({ status: 'idle', mode: 'ai', awaitingReply: false, items: [], activeInteraction: null,\n interactionPending: false, agent: null, error: null });\n\nconst ROLE_MAP: Record<string, Message['role'] | undefined> = {\n user: 'user', ai: 'assistant', assistant: 'assistant', operator: 'human', support: 'human',\n};\n\nclass Client implements ChatClient {\n private state: ChatState = emptyState();\n private readonly listeners = new Set<(s: ChatState) => void>();\n private readonly http: HttpClient;\n private readonly store: KeyValueStore;\n private readonly page: PageSignals;\n private readonly interactions: InteractionController;\n private conn: StreamConnection | null = null;\n private sessionId: string | null = null;\n private latestToken: string | null = null;\n private chain: Promise<unknown> = Promise.resolve(); // serializes start / ensureSession / newSession\n private startP: Promise<void> | null = null;\n private ensureP: Promise<string | null> | null = null;\n private readonly pending = new Map<string, PendingSend>(); // sends not yet acked/echoed, in send order\n private openGen = 0;\n private sessionGeneration = 0;\n private seen: string[] = [];\n private readonly seenSet = new Set<string>();\n private readonly timers = new Set<ReturnType<typeof setTimeout>>();\n private awaitingTimer: ReturnType<typeof setTimeout> | null = null;\n private destroyed = false;\n private wantNewServerSession = false;\n private switchTo: ServerToken | null = null; // server mode: rotation returned a different session\n\n constructor(private readonly opts: ChatClientOptions) {\n this.http = new HttpClient(opts.baseUrl ?? DEFAULT_BASE_URL, opts.fetch);\n this.store = opts.store ?? browserStore();\n this.page = opts.page ?? browserPage();\n this.interactions = new InteractionController({\n sessionId: () => this.sessionId,\n humanConnected: () => this.state.mode === 'human',\n sendFrame: (frame) => this.conn?.send(frame) ?? false,\n updateItems: (fn) => this.patch({ items: fn(this.state.items) }),\n refreshSnapshot: () => this.fetchSnapshot(),\n onChange: () => this.patch({}),\n newId: uuid,\n });\n }\n\n private get serverMode(): boolean { return this.opts.auth?.mode === 'server'; }\n\n private serialize<T>(fn: () => Promise<T>): Promise<T> {\n const run = this.chain.then(fn);\n this.chain = run.catch(() => undefined);\n return run;\n }\n\n // ---------- public API ----------\n\n start(): Promise<void> {\n if (this.destroyed) return Promise.resolve();\n if (!this.startP) this.startP = this.serialize(() => this.doStart()).finally(() => { this.startP = null; });\n return this.startP;\n }\n\n private async doStart(): Promise<void> {\n if (this.destroyed || (this.sessionId && this.conn)) return;\n if (this.serverMode) { await this.openServerSession(); return; }\n try {\n const boot = await this.http.bootstrap(this.opts.agentId, getVisitorId(this.store));\n if (this.destroyed) return;\n this.patch({ agent: { agentId: this.opts.agentId, name: boot.agent?.name ?? '' } });\n if (boot.session?.id && boot.session.status === 'active') this.adopt(boot.session.id, boot, this.pending.size ? 'append' : 'replace');\n else this.store.remove(sessionHintKey(this.opts.agentId));\n } catch (e) {\n this.fail(e, false); // a network blip must not lock the composer\n }\n }\n\n async send(text: string): Promise<SendOutcome> {\n if (this.destroyed) return { ok: false, reason: 'destroyed' };\n const content = text.trim();\n if (!content) return { ok: false, reason: 'empty' };\n if (this.state.mode === 'ai' && (this.interactions.pending || this.interactions.active?.interaction_status === 'pending')) {\n return { ok: false, reason: 'awaiting_interaction' };\n }\n const id = uuid();\n const key = uuid();\n const message: Message = { kind: 'message', id, role: 'user', content, createdAt: new Date().toISOString(),\n status: 'sending', idempotencyKey: key };\n this.patch({ items: [...this.state.items, message] });\n this.pending.set(id, { frame: this.frameFor(message), attempts: 0, gen: -1, ackTimer: null });\n const sid = await this.ensureSession();\n if (!sid) {\n this.dropPending(id);\n this.setMessage(id, { status: 'failed' });\n return { ok: false, reason: 'unavailable' };\n }\n this.transmit(id);\n return { ok: true, messageId: id };\n }\n\n async respond(interactionId: string, response: InteractionResponse): Promise<boolean> {\n if (this.destroyed) return false;\n return this.interactions.respond(interactionId, response);\n }\n\n async retry(messageId: string): Promise<boolean> {\n const item = this.state.items.find((i): i is Message => i.kind === 'message' && i.id === messageId);\n if (!item || item.status !== 'failed' || !item.idempotencyKey || this.destroyed) return false;\n this.dropPending(messageId);\n this.pending.set(messageId, { frame: this.frameFor(item), attempts: 0, gen: -1, ackTimer: null }); // stored key, never a new one\n this.setMessage(messageId, { status: 'sending' });\n if (!(await this.ensureSession())) {\n this.dropPending(messageId);\n this.setMessage(messageId, { status: 'failed' });\n return false;\n }\n this.transmit(messageId);\n return true;\n }\n\n newSession(): Promise<boolean> {\n if (this.destroyed) return Promise.resolve(false);\n // A send already provisioning the first session satisfies a concurrent New chat.\n if (!this.sessionId && this.ensureP) return this.ensureP.then((sid) => sid !== null);\n return this.serialize(async () => {\n if (this.destroyed) return false;\n if (this.sessionId) this.endSession('new_session');\n if (this.serverMode) {\n this.wantNewServerSession = true;\n return (await this.openServerSession()) !== null;\n }\n try {\n const created = await this.http.createSession(this.opts.agentId, getVisitorId(this.store));\n if (this.destroyed) return false;\n this.adopt(created.id, null, 'keep');\n return true;\n } catch (e) {\n this.fail(e, false);\n return false;\n }\n });\n }\n\n subscribe(listener: (state: ChatState) => void): () => void {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n }\n\n getState(): ChatState { return this.state; }\n\n resolveUrl(path: string): string { return this.http.resolveUrl(path); }\n\n destroy(): void {\n if (this.destroyed) return;\n this.destroyed = true;\n this.sessionGeneration += 1;\n this.conn?.stop();\n this.conn = null;\n this.timers.forEach(clearTimeout);\n this.timers.clear();\n this.pending.forEach((e) => { if (e.ackTimer) clearTimeout(e.ackTimer); });\n this.pending.clear();\n if (this.awaitingTimer) clearTimeout(this.awaitingTimer);\n this.interactions.reset();\n this.sessionId = null;\n this.latestToken = null;\n this.switchTo = null;\n this.state = emptyState(); // drops every in-memory item; listeners are not notified\n this.listeners.clear();\n }\n\n // ---------- sessions ----------\n\n private ensureSession(): Promise<string | null> {\n if (this.ensureP) return this.ensureP;\n this.ensureP = this.serialize(async () => {\n if (this.destroyed) return null;\n if (this.sessionId) return this.sessionId;\n return this.serverMode ? this.openServerSession() : this.openAnonymousSession();\n }).finally(() => { this.ensureP = null; });\n return this.ensureP;\n }\n\n private async openAnonymousSession(): Promise<string | null> {\n try {\n const visitor = getVisitorId(this.store);\n const boot = await this.http.bootstrap(this.opts.agentId, visitor);\n if (this.destroyed) return null;\n this.patch({ agent: { agentId: this.opts.agentId, name: boot.agent?.name ?? '' } });\n if (boot.session?.id && boot.session.status === 'active') {\n this.adopt(boot.session.id, boot, 'append');\n return this.sessionId;\n }\n const created = await this.http.createSession(this.opts.agentId, visitor);\n if (this.destroyed) return null;\n this.adopt(created.id, null, 'keep');\n return this.sessionId;\n } catch (e) {\n this.fail(e, false);\n return null;\n }\n }\n\n private async openServerSession(given?: ServerToken): Promise<string | null> {\n const generation = this.sessionGeneration;\n try {\n let first = given ? this.accept(given) : await this.serverToken(generation);\n this.assertCurrent(generation);\n this.latestToken = first.token;\n let snap: Snapshot;\n try { snap = await this.http.snapshot(first.sessionId, first.token); }\n catch (e) {\n this.assertCurrent(generation);\n if (!(e instanceof ChatRequestError) || e.error.code !== 'invalid_token') throw e;\n first = await this.serverToken(generation);\n this.assertCurrent(generation);\n this.latestToken = first.token;\n snap = await this.http.snapshot(first.sessionId, first.token);\n }\n this.assertCurrent(generation);\n this.adopt(first.sessionId, snap, this.state.items.length ? 'append' : 'replace', first);\n return this.sessionId;\n } catch (e) {\n if (this.isCurrent(generation)) this.fail(e, true);\n return null;\n }\n }\n\n private async serverToken(generation = this.sessionGeneration): Promise<ServerToken> {\n this.assertCurrent(generation);\n if (this.opts.auth?.mode !== 'server') throw new Error('not server mode');\n let t: ServerToken;\n const fresh = this.wantNewServerSession;\n this.wantNewServerSession = false;\n try { t = await (fresh ? this.opts.auth.getToken({ newSession: true }) : this.opts.auth.getToken()); }\n catch { throw new ChatRequestError(toChatError('token_failed', 'getToken failed'), 0); }\n this.assertCurrent(generation);\n try { return this.accept(t); }\n catch (e) { if (this.isCurrent(generation)) this.fail(e, false); throw e; }\n }\n\n private accept(t: ServerToken): ServerToken {\n this.checkWsUrl(t.wsUrl);\n return { ...t, expiresAt: normalizeExpiry(t.expiresAt) };\n }\n\n // wss: only (ws: for localhost during development); anything else is a token failure.\n private checkWsUrl(url: string): void {\n let u: URL | null = null;\n try { u = new URL(url); } catch { /* invalid */ }\n const local = u?.hostname === 'localhost' || u?.hostname === '127.0.0.1';\n if (u && (u.protocol === 'wss:' || (u.protocol === 'ws:' && local))) return;\n const error = toChatError('token_failed', 'The chat stream URL must use wss://');\n throw new ChatRequestError(error, 0);\n }\n\n private isCurrent(generation: number, sessionId?: string): boolean {\n return !this.destroyed && this.sessionGeneration === generation &&\n (sessionId === undefined || this.sessionId === sessionId);\n }\n\n private assertCurrent(generation: number, sessionId?: string): void {\n if (!this.isCurrent(generation, sessionId)) throw new ChatRequestError(toChatError('session_closed'), 0);\n }\n\n /** Bind to a session; `firstToken` lets server mode reuse the token it just fetched. */\n private adopt(sessionId: string, snapshot: Snapshot | null, merge: 'replace' | 'append' | 'keep', firstToken?: ServerToken, allowInitialReplacement = true): void {\n if (this.sessionId === sessionId && this.conn) return; // already bound: never open a second socket\n this.conn?.stop();\n this.conn = null;\n this.sessionId = sessionId;\n const generation = ++this.sessionGeneration;\n if (!this.serverMode) this.store.set(sessionHintKey(this.opts.agentId), sessionId);\n if (snapshot) this.applySnapshot(snapshot, merge);\n let reuse = firstToken ?? null;\n const visitor = this.serverMode ? null : getVisitorId(this.store);\n let initialMint = true;\n let replaceInitialSession = false;\n const mint = async (): Promise<MintedToken> => {\n this.assertCurrent(generation, sessionId);\n if (reuse) { const t = reuse; reuse = null; this.latestToken = t.token; return t; }\n if (this.serverMode) {\n const t = await this.serverToken(generation);\n this.assertCurrent(generation, sessionId);\n if (t.sessionId !== sessionId) { // the host's backend moved this user to another session\n this.switchTo = t;\n throw new ChatRequestError(toChatError('session_closed'), 0);\n }\n this.latestToken = t.token;\n return t;\n }\n const firstMint = initialMint;\n initialMint = false;\n let t: MintedToken;\n try { t = await this.http.mintPublicToken(sessionId); }\n catch (e) {\n replaceInitialSession = firstMint && allowInitialReplacement && this.isCurrent(generation, sessionId) &&\n e instanceof ChatRequestError && e.status === 404 && e.error.code === 'session_not_found' &&\n [...this.pending.values()].every((entry) => entry.gen === -1);\n throw e;\n }\n this.assertCurrent(generation, sessionId);\n try { this.checkWsUrl(t.wsUrl); }\n catch (e) { this.fail(e, false); throw e; }\n this.latestToken = t.token;\n return t;\n };\n this.conn = new StreamConnection({\n mint, sdkVersion: SDK_VERSION, page: this.page, random: this.opts.random, WebSocketImpl: this.opts.WebSocketImpl,\n onFrame: (env) => this.onFrame(env),\n onStatus: (status) => this.patch({ status, ...(status === 'open' ? { error: null } : {}) }),\n onOpen: () => this.onOpen(),\n onReconnected: () => void this.recover(),\n onError: (error) => this.patch({ error }),\n onClosed: (reason) => {\n if (!this.isCurrent(generation, sessionId)) return;\n if (replaceInitialSession && visitor && reason === 'session_not_found') {\n replaceInitialSession = false;\n void this.serialize(() => this.replaceBeforeFirstWrite(generation, sessionId, visitor));\n return;\n }\n const next = this.switchTo;\n this.switchTo = null;\n this.endSession(reason);\n if (next) void this.serialize(() => this.openServerSession(next));\n },\n });\n this.conn.start();\n }\n\n /** An initial mint can lose to a sibling tab before this tab has written anything. */\n private async replaceBeforeFirstWrite(generation: number, predecessor: string, visitor: string): Promise<void> {\n if (!this.isCurrent(generation, predecessor)) return;\n try {\n const boot = await this.http.bootstrap(this.opts.agentId, visitor);\n if (!this.isCurrent(generation, predecessor)) return;\n const session = boot?.session;\n const identity = session as unknown as Record<string, unknown> | null;\n const uuidPattern = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\n if (boot?.agent?.agent_uuid !== this.opts.agentId || !Array.isArray(boot.messages) ||\n !session || typeof session.id !== 'string' || !uuidPattern.test(session.id) ||\n session.id === predecessor || session.status !== 'active' ||\n (session.mode !== 'ai' && session.mode !== 'support') ||\n (identity && 'customer_id' in identity && identity.customer_id !== visitor) ||\n (identity && 'agent_uuid' in identity && identity.agent_uuid !== this.opts.agentId) ||\n [...this.pending.values()].some((entry) => entry.gen !== -1)) {\n this.endSession('session_not_found');\n return;\n }\n // Keep the original pending frames and forbid another replacement on its initial mint.\n this.adopt(session.id, boot, 'append', undefined, false);\n } catch {\n if (this.isCurrent(generation, predecessor)) this.endSession('session_not_found');\n }\n }\n\n // Every socket that becomes current (first open, reconnect, rotation): resend what is unacked.\n private onOpen(): void {\n this.openGen += 1;\n this.seen = [];\n this.seenSet.clear();\n for (const id of [...this.pending.keys()]) this.write(id);\n this.interactions.onConnectionOpen();\n }\n\n private async recover(): Promise<void> {\n const sid = this.sessionId;\n const generation = this.sessionGeneration;\n const snap = await this.fetchSnapshot();\n if (snap && sid && this.isCurrent(generation, sid)) this.applySnapshot(snap, 'reconcile');\n }\n\n private async fetchSnapshot(): Promise<Snapshot | null> {\n if (this.destroyed) return null;\n const sid = this.sessionId;\n const generation = this.sessionGeneration;\n if (!sid) return null;\n try {\n try {\n const snapshot = await this.http.snapshot(sid, this.latestToken ?? (await this.mintFresh(sid)));\n return this.isCurrent(generation, sid) ? snapshot : null;\n } catch (e) {\n this.assertCurrent(generation, sid);\n if (!(e instanceof ChatRequestError) || e.error.code !== 'invalid_token') throw e;\n const snapshot = await this.http.snapshot(sid, await this.mintFresh(sid)); // mint once, retry once\n return this.isCurrent(generation, sid) ? snapshot : null;\n }\n } catch (e) {\n if (e instanceof ChatRequestError && e.error.code === 'session_not_found') {\n if (!this.isCurrent(generation, sid)) return null;\n this.endSession('session_closed'); // not an error to show: a sibling tab may have replaced it\n if (!this.serverMode) void this.readoptAfterReplacement();\n }\n return null;\n }\n }\n\n private async mintFresh(sessionId: string): Promise<string> {\n const generation = this.sessionGeneration;\n this.assertCurrent(generation, sessionId);\n if (this.serverMode) {\n const t = await this.serverToken(generation);\n this.assertCurrent(generation, sessionId);\n this.latestToken = t.token;\n return t.token;\n }\n const t = await this.http.mintPublicToken(sessionId);\n this.assertCurrent(generation, sessionId);\n this.checkWsUrl(t.wsUrl);\n this.latestToken = t.token;\n return t.token;\n }\n\n private async readoptAfterReplacement(): Promise<void> {\n try {\n const boot = await this.http.bootstrap(this.opts.agentId, getVisitorId(this.store));\n if (!this.destroyed && !this.sessionId && boot.session?.id && boot.session.status === 'active') {\n this.adopt(boot.session.id, boot, 'append');\n }\n } catch { /* stays closed; next send re-bootstraps */ }\n }\n\n private endSession(reason: string): void {\n if (this.destroyed) return;\n this.sessionGeneration += 1;\n this.conn?.stop();\n this.conn = null;\n this.sessionId = null;\n this.latestToken = null;\n if (!this.serverMode) this.store.remove(sessionHintKey(this.opts.agentId));\n this.interactions.reset();\n this.pending.forEach((e) => { if (e.ackTimer) clearTimeout(e.ackTimer); });\n this.pending.clear();\n // Every send still in flight has an unknown outcome: failed, and retry() reuses its key.\n const settled = this.state.items.map((i) => (i.kind === 'message' && i.status === 'sending' ? { ...i, status: 'failed' as const } : i));\n const last = settled[settled.length - 1];\n const divider: Divider = { kind: 'divider', id: uuid(), reason: 'session_ended' };\n this.setAwaiting(false);\n this.patch({\n status: 'closed', mode: 'ai',\n items: settled.length && last?.kind !== 'divider' ? [...settled, divider] : settled,\n ...(QUIET_END_REASONS.has(reason) ? {} : { error: toChatError(reason) }),\n });\n }\n\n // ---------- frames ----------\n\n private onFrame(env: WireEnvelope): void {\n if (this.destroyed) return;\n if (env.event_id !== undefined) {\n const key = String(env.event_id);\n if (this.seenSet.has(key)) return;\n this.seenSet.add(key);\n this.seen.push(key);\n if (this.seen.length > SEEN_EVENT_CAP) this.seenSet.delete(this.seen.shift()!);\n }\n const p = env.payload;\n switch (env.type) {\n case 'ws_write_result':\n if (!this.interactions.handleWriteResult(p as unknown as WriteResult)) this.onWriteResult(p as unknown as WriteResult);\n return;\n case 'message_received': {\n if (p.type === 'interaction') return;\n const msg = readWireMessage(p);\n if (!msg) return;\n if (msg.role === 'user') this.onUserEcho(msg.id, msg.content, msg.created_at, typeof p.message_id === 'string' ? p.message_id : undefined);\n else this.appendRemote(msg.id, msg.role, msg.content, msg.created_at);\n return;\n }\n case 'operator_message': {\n const msg = readWireMessage({ ...p, role: 'operator' });\n if (msg) this.appendRemote(msg.id, 'operator', msg.content, msg.created_at);\n return;\n }\n case 'mode_changed':\n if (p.to === 'support') this.setMode('human');\n else if (p.to === 'ai') this.setMode('ai');\n return;\n case 'takeover_started': this.setMode('human'); return;\n case 'takeover_ended': this.setMode('ai'); return;\n case 'interaction_published':\n case 'interaction_updated':\n case 'interaction_closed':\n if (this.interactions.applyEvent(env) && env.type === 'interaction_published') this.setAwaiting(false);\n this.patch({});\n return;\n case 'turn_result':\n if (p.state === 'failed' || p.state === 'error') {\n this.setAwaiting(false);\n this.patch({ error: { code: 'unknown', message: 'The assistant could not reply', retryable: true } });\n }\n return;\n case 'session_closed':\n case 'session_dormant':\n this.endSession(env.type);\n return;\n default:\n return;\n }\n }\n\n private onWriteResult(r: WriteResult): void {\n const id = r.message_id;\n if (!id) return;\n const entry = this.pending.get(id);\n if (!entry) return;\n if (entry.ackTimer) { clearTimeout(entry.ackTimer); entry.ackTimer = null; }\n if (r.state === 'accepted' || r.state === 'merged' || r.state === 'done') {\n this.pending.delete(id);\n this.setMessage(id, { status: 'sent' });\n this.setAwaiting(true);\n return;\n }\n if (r.state === 'busy' && entry.attempts < BUSY_DELAYS_MS.length) {\n const delay = BUSY_DELAYS_MS[entry.attempts]!;\n entry.attempts += 1;\n this.later(delay, () => {\n if (this.pending.get(id) !== entry) return;\n entry.gen = -1;\n this.transmit(id);\n });\n return;\n }\n this.pending.delete(id);\n this.setMessage(id, { status: 'failed' });\n this.patch({ error: toChatError(r.error, r.error) });\n }\n\n /** Our own message comes back as a user echo: adopt it (by client message_id, else by content on an older engine). */\n private onUserEcho(serverId: string, content: string, createdAt?: string, clientId?: string): void {\n const items = this.state.items;\n if (items.some((i) => i.kind === 'message' && i.serverId === serverId)) return;\n const own = clientId\n ? items.findIndex((i) => i.kind === 'message' && i.role === 'user' && i.id === clientId)\n : items.findIndex((i) => i.kind === 'message' && i.role === 'user' && !i.serverId && i.status !== 'failed' && i.content === content);\n if (own >= 0) {\n const next = items.slice();\n const mine = next[own] as Message;\n next[own] = { ...mine, serverId, status: 'sent' };\n this.dropPending(mine.id);\n this.patch({ items: next });\n return;\n }\n this.appendRemote(serverId, 'user', content, createdAt);\n }\n\n private appendRemote(serverId: string, wireRole: string, content: string, createdAt?: string): void {\n const role = ROLE_MAP[wireRole];\n if (!role) return;\n if (this.state.items.some((i) => i.kind === 'message' && i.serverId === serverId)) return;\n const item: Message = { kind: 'message', id: `srv:${serverId}`, serverId, role, content,\n createdAt: createdAt ?? new Date().toISOString(), status: 'sent' };\n this.patch({ items: [...this.state.items, item] });\n if (role !== 'user') this.setAwaiting(false);\n }\n\n // ---------- snapshot → items ----------\n\n private applySnapshot(snapshot: Snapshot, merge: 'replace' | 'append' | 'keep' | 'reconcile'): void {\n if (this.destroyed) return;\n const incoming: TranscriptItem[] = [];\n const clientIds = new Map<string, string>(); // serverId -> client message_id, when the snapshot carries it\n for (const raw of snapshot.messages ?? []) {\n const offer = readInteraction(raw);\n if (offer) { incoming.push({ kind: 'interaction', id: offer.interaction_id, interaction: offer }); continue; }\n const m = readWireMessage(raw);\n const role = m ? ROLE_MAP[m.role] : undefined;\n if (m && role) {\n incoming.push({ kind: 'message', id: `srv:${m.id}`, serverId: m.id, role, content: m.content,\n createdAt: m.created_at ?? new Date().toISOString(), status: 'sent' });\n const cid = (raw as Record<string, unknown>).message_id;\n if (typeof cid === 'string') clientIds.set(m.id, cid);\n }\n }\n let items = this.state.items;\n if (merge === 'replace') items = incoming;\n else if (merge === 'append') {\n // New session history goes after what is shown (endSession already added the divider)\n // but before this tab's still-unsent messages, which belong to the new session.\n let cut = items.length;\n while (cut > 0) {\n const i = items[cut - 1]!;\n if (i.kind === 'message' && i.role === 'user' && i.status === 'sending' && !i.serverId) cut -= 1;\n else break;\n }\n items = [...items.slice(0, cut), ...incoming, ...items.slice(cut)];\n } else if (merge === 'reconcile') {\n const known = new Set(items.flatMap((i) => (i.kind === 'message' ? [i.serverId] : i.kind === 'interaction' ? [i.id] : [])));\n for (const item of incoming) {\n const key = item.kind === 'message' ? item.serverId : item.id;\n if (item.kind === 'message' && item.role === 'user' && !known.has(key)) {\n const cid = clientIds.get(item.serverId!);\n const own = items.findIndex((i) => i.kind === 'message' && i.role === 'user' && !i.serverId &&\n (cid ? i.id === cid : i.content === item.content));\n if (own >= 0) {\n const mine = items[own] as Message;\n items = items.slice();\n items[own] = { ...mine, serverId: item.serverId, status: 'sent' };\n this.dropPending(mine.id);\n known.add(key);\n continue;\n }\n }\n if (!known.has(key)) { items = [...items, item]; known.add(key); }\n }\n }\n const session = snapshot.session;\n this.patch({ items, ...(session ? { mode: session.mode === 'support' ? 'human' : 'ai' } : {}) });\n this.interactions.applySnapshot(snapshot);\n const last = items.filter((i) => i.kind !== 'divider').at(-1);\n if (last && !(last.kind === 'message' && last.role === 'user')) this.setAwaiting(false);\n this.patch({});\n }\n\n // ---------- sends ----------\n\n private frameFor(m: Message): Record<string, unknown> {\n return { type: 'message', content: m.content, message_id: m.id, idempotency_key: m.idempotencyKey,\n supported_interactions: SUPPORTED_INTERACTIONS };\n }\n\n private transmit(id: string): void {\n this.write(id); // when the socket is not open the entry waits in `pending`; onOpen() writes it\n }\n\n // Write once per socket generation; an ack timer starts with every write.\n private write(id: string): void {\n const entry = this.pending.get(id);\n if (!entry || !this.conn?.isOpen || entry.gen === this.openGen) return;\n if (!this.conn.send(entry.frame)) return;\n entry.gen = this.openGen;\n if (entry.ackTimer) clearTimeout(entry.ackTimer);\n entry.ackTimer = setTimeout(() => void this.onAckTimeout(id), SEND_ACK_TIMEOUT_MS);\n }\n\n // No ack within 15 s: reconcile with the server; if the message is still unconfirmed, it failed (retry reuses the key).\n private async onAckTimeout(id: string): Promise<void> {\n const entry = this.pending.get(id);\n if (!entry || this.destroyed) return;\n entry.ackTimer = null;\n if (!this.conn?.isOpen) return; // a reopen will resend and re-arm\n const generation = this.openGen;\n await this.recover();\n if (this.destroyed || this.pending.get(id) !== entry || !this.conn?.isOpen || generation !== this.openGen) return;\n this.dropPending(id);\n this.setMessage(id, { status: 'failed' });\n this.patch({ error: toChatError('network', 'The message could not be confirmed') });\n }\n\n private dropPending(id: string): void {\n const entry = this.pending.get(id);\n if (entry?.ackTimer) clearTimeout(entry.ackTimer);\n this.pending.delete(id);\n }\n\n // ---------- helpers ----------\n\n private setMode(mode: 'ai' | 'human'): void {\n this.setAwaiting(false);\n this.patch({ mode });\n }\n\n private setAwaiting(on: boolean): void {\n if (this.awaitingTimer) { clearTimeout(this.awaitingTimer); this.awaitingTimer = null; }\n if (on) this.awaitingTimer = setTimeout(() => { this.awaitingTimer = null; this.patch({ awaitingReply: false }); }, AWAITING_REPLY_TIMEOUT_MS);\n if (this.state.awaitingReply !== on) this.patch({ awaitingReply: on });\n }\n\n private setMessage(id: string, change: Partial<Message>): void {\n this.patch({ items: this.state.items.map((i) => (i.kind === 'message' && i.id === id ? { ...i, ...change } : i)) });\n }\n\n private fail(e: unknown, terminal: boolean): void {\n const error = e instanceof ChatRequestError ? e.error : toChatError('network', 'Network error');\n this.patch({ error, ...(terminal || !error.retryable ? { status: 'closed' as const } : {}) });\n }\n\n private later(ms: number, fn: () => void): void {\n const t = setTimeout(() => { this.timers.delete(t); if (!this.destroyed) fn(); }, ms);\n this.timers.add(t);\n }\n\n private patch(change: Partial<ChatState>): void {\n if (this.destroyed) return;\n const next: ChatState = {\n ...this.state, ...change,\n activeInteraction: this.interactions.active,\n interactionPending: this.interactions.pending,\n };\n const changed = (Object.keys(next) as (keyof ChatState)[]).some((k) => next[k] !== this.state[k]);\n if (!changed) return;\n this.state = next;\n this.listeners.forEach((l) => l(next));\n }\n}\n\nexport function createChatClient(options: ChatClientOptions): ChatClient {\n return new Client(options);\n}\n"],"names":["SDK_VERSION","CODES","RETRYABLE","toChatError","code","message","known","ChatRequestError","error","status","DEFAULT_TTL_MS","normalizeExpiry","expiresAt","now","HttpClient","baseUrl","fetchImpl","a","path","agentId","customerId","signal","q","sessionId","d","token","init","response","f","headers","e","body","header","fromBody","seconds","SUPPORTED_INTERACTIONS","PRESENTATION_BYTES","RESPONSE_TEXT_CODE_POINTS","RESPONSE_TEXT_BYTES","URL_CHARACTERS","IDENTIFIER","object","value","only","keys","key","codePoints","bytes","hasDisallowedControl","character","hasUrlWhitespaceOrControl","text","maximum","required","canonical","withinPresentationBudget","isProxyImageUrl","isPublicHttpsUrl","url","hostname","isChoicePresentation","ids","typedOptions","option","allowsInput","isButtonsV1Presentation","isCarouselPresentation","allowProxy","item","isCalendarDate","year","month","day","monthDays","isDatePickerPresentation","isInteractionPresentation","pair","isInteractionResponse","statuses","readInteraction","responsePayload","readPublicMessage","interaction","interactionCursor","compareCursors","left","right","mergeItems","current","additions","result","index","row","previous","lifecycleRank","WIRE_ROLES","readWireMessage","v","o","id","out","activeOffer","offer","InteractionController","host","fn","items","cut","tail","fromRows","toRows","operation","reason","restore","rows","answer","reconciled","minimumCursor","requestedCursor","requestedOperations","stillUnresolved","scope","snapshot","nextCursor","linked","settled","optimisticIds","order","event","payload","interactionId","legacy","displayText","start","end","messageId","optimistic","prev","parseEnvelope","data","raw","PING_INTERVAL_MS","SILENCE_LIMIT_MS","ROTATE_LEAD_MS","AGENT_INACTIVE_RETRY_MS","BACKOFF_MS","ROTATE_RETRY_MS","CLIENT_ROTATE","MAX_AUTH_CLOSES","TERMINAL_MINT_CODES","browserPage","cb","h","detach","s","StreamConnection","opts","frame","off","m","sep","epoch","minted","rotation","reconnect","old","env","err","delay","fired","cancel","timer","offVisible","offOnline","retry","pingedSinceInbound","wait","ms","t","VISITOR_KEY","VISITOR_FORMAT","memoryStore","values","browserStore","memory","broken","attempt","fallback","toVisitorId","byte","ephemeralId","getVisitorId","store","random","existing","weak","sessionHintKey","DEFAULT_BASE_URL","AWAITING_REPLY_TIMEOUT_MS","SEND_ACK_TIMEOUT_MS","BUSY_DELAYS_MS","SEEN_EVENT_CAP","QUIET_END_REASONS","uuid","c","b","x","emptyState","ROLE_MAP","Client","run","boot","content","i","sid","created","listener","visitor","given","generation","first","snap","fresh","u","local","merge","firstToken","allowInitialReplacement","reuse","initialMint","replaceInitialSession","mint","firstMint","entry","next","predecessor","session","identity","uuidPattern","last","divider","p","msg","r","serverId","createdAt","clientId","own","mine","wireRole","role","incoming","clientIds","cid","mode","on","change","terminal","k","l","createChatClient","options"],"mappings":"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"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { type ChatError } from './errors';
|
|
2
|
+
import { type PageSignals } from './connection';
|
|
3
|
+
import { type InteractionMessage, type InteractionResponse } from './protocol/types';
|
|
4
|
+
import type { TranscriptItem } from './state';
|
|
5
|
+
import { type KeyValueStore } from './storage';
|
|
6
|
+
export declare const DEFAULT_BASE_URL = "https://api.osvi.ai";
|
|
7
|
+
export declare const AWAITING_REPLY_TIMEOUT_MS = 120000;
|
|
8
|
+
export declare const SEND_ACK_TIMEOUT_MS = 15000;
|
|
9
|
+
export interface ServerToken {
|
|
10
|
+
sessionId: string;
|
|
11
|
+
token: string;
|
|
12
|
+
wsUrl: string;
|
|
13
|
+
expiresAt: number;
|
|
14
|
+
}
|
|
15
|
+
export type ChatAuth = {
|
|
16
|
+
mode: 'anonymous';
|
|
17
|
+
} | {
|
|
18
|
+
mode: 'server';
|
|
19
|
+
getToken: (opts?: {
|
|
20
|
+
newSession?: boolean;
|
|
21
|
+
}) => Promise<ServerToken>;
|
|
22
|
+
};
|
|
23
|
+
export interface ChatClientOptions {
|
|
24
|
+
agentId: string;
|
|
25
|
+
baseUrl?: string;
|
|
26
|
+
auth?: ChatAuth;
|
|
27
|
+
fetch?: typeof fetch;
|
|
28
|
+
WebSocketImpl?: typeof WebSocket;
|
|
29
|
+
store?: KeyValueStore;
|
|
30
|
+
page?: PageSignals;
|
|
31
|
+
random?: () => number;
|
|
32
|
+
}
|
|
33
|
+
export type ChatStatus = 'idle' | 'connecting' | 'open' | 'recovering' | 'offline' | 'closed';
|
|
34
|
+
export interface ChatState {
|
|
35
|
+
status: ChatStatus;
|
|
36
|
+
mode: 'ai' | 'human';
|
|
37
|
+
awaitingReply: boolean;
|
|
38
|
+
items: TranscriptItem[];
|
|
39
|
+
activeInteraction: InteractionMessage | null;
|
|
40
|
+
interactionPending: boolean;
|
|
41
|
+
agent: {
|
|
42
|
+
agentId: string;
|
|
43
|
+
name: string;
|
|
44
|
+
} | null;
|
|
45
|
+
error: ChatError | null;
|
|
46
|
+
}
|
|
47
|
+
export type SendOutcome = {
|
|
48
|
+
ok: true;
|
|
49
|
+
messageId: string;
|
|
50
|
+
} | {
|
|
51
|
+
ok: false;
|
|
52
|
+
reason: 'empty' | 'destroyed' | 'awaiting_interaction' | 'unavailable';
|
|
53
|
+
};
|
|
54
|
+
export interface ChatClient {
|
|
55
|
+
start(): Promise<void>;
|
|
56
|
+
send(text: string): Promise<SendOutcome>;
|
|
57
|
+
respond(interactionId: string, response: InteractionResponse): Promise<boolean>;
|
|
58
|
+
retry(messageId: string): Promise<boolean>;
|
|
59
|
+
newSession(): Promise<boolean>;
|
|
60
|
+
subscribe(listener: (state: ChatState) => void): () => void;
|
|
61
|
+
getState(): ChatState;
|
|
62
|
+
resolveUrl(path: string): string;
|
|
63
|
+
destroy(): void;
|
|
64
|
+
}
|
|
65
|
+
export declare function createChatClient(options: ChatClientOptions): ChatClient;
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { type ChatError } from './errors';
|
|
2
|
+
import type { MintedToken } from './http';
|
|
3
|
+
import type { WireEnvelope } from './protocol/types';
|
|
4
|
+
export type ConnectionStatus = 'connecting' | 'open' | 'recovering' | 'offline';
|
|
5
|
+
export interface PageSignals {
|
|
6
|
+
isVisible(): boolean;
|
|
7
|
+
onVisible(cb: () => void): () => void;
|
|
8
|
+
onOnline(cb: () => void): () => void;
|
|
9
|
+
}
|
|
10
|
+
export interface ConnectionOptions {
|
|
11
|
+
mint: () => Promise<MintedToken>;
|
|
12
|
+
sdkVersion: string;
|
|
13
|
+
onFrame: (env: WireEnvelope) => void;
|
|
14
|
+
onStatus: (status: ConnectionStatus) => void;
|
|
15
|
+
onOpen: () => void;
|
|
16
|
+
onReconnected: () => void;
|
|
17
|
+
onError: (error: ChatError) => void;
|
|
18
|
+
onClosed: (reason: string) => void;
|
|
19
|
+
WebSocketImpl?: typeof WebSocket;
|
|
20
|
+
page?: PageSignals;
|
|
21
|
+
random?: () => number;
|
|
22
|
+
}
|
|
23
|
+
export declare const PING_INTERVAL_MS = 25000;
|
|
24
|
+
export declare const SILENCE_LIMIT_MS = 60000;
|
|
25
|
+
export declare const ROTATE_LEAD_MS = 30000;
|
|
26
|
+
export declare const AGENT_INACTIVE_RETRY_MS = 60000;
|
|
27
|
+
export declare const BACKOFF_MS: number[];
|
|
28
|
+
export declare function browserPage(): PageSignals;
|
|
29
|
+
export declare class StreamConnection {
|
|
30
|
+
private readonly opts;
|
|
31
|
+
private socket;
|
|
32
|
+
private next;
|
|
33
|
+
private stopped;
|
|
34
|
+
private started;
|
|
35
|
+
private everOpened;
|
|
36
|
+
private failures;
|
|
37
|
+
private authCloses;
|
|
38
|
+
private epoch;
|
|
39
|
+
private rotating;
|
|
40
|
+
private pingSupported;
|
|
41
|
+
private lastInbound;
|
|
42
|
+
private lastPingSentAt;
|
|
43
|
+
private expiresAt;
|
|
44
|
+
private timers;
|
|
45
|
+
private pingTimer;
|
|
46
|
+
private waitingForPage;
|
|
47
|
+
private readonly page;
|
|
48
|
+
private readonly WS;
|
|
49
|
+
private readonly random;
|
|
50
|
+
constructor(opts: ConnectionOptions);
|
|
51
|
+
get isOpen(): boolean;
|
|
52
|
+
start(): void;
|
|
53
|
+
send(frame: Record<string, unknown>): boolean;
|
|
54
|
+
stop(): void;
|
|
55
|
+
private abandon;
|
|
56
|
+
private recoveringStatus;
|
|
57
|
+
private urlFor;
|
|
58
|
+
private connect;
|
|
59
|
+
private openSocket;
|
|
60
|
+
private handleOpen;
|
|
61
|
+
private swapIn;
|
|
62
|
+
private handleMessage;
|
|
63
|
+
private handleClose;
|
|
64
|
+
private handleMintFailure;
|
|
65
|
+
private reconnectNow;
|
|
66
|
+
private scheduleBackoff;
|
|
67
|
+
private retryWhenReachable;
|
|
68
|
+
private whenVisible;
|
|
69
|
+
private startPings;
|
|
70
|
+
private declareDead;
|
|
71
|
+
private stopPings;
|
|
72
|
+
private scheduleRotation;
|
|
73
|
+
private rotate;
|
|
74
|
+
private terminate;
|
|
75
|
+
private later;
|
|
76
|
+
private clearPageListeners;
|
|
77
|
+
private clearTimers;
|
|
78
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export type ChatErrorCode = 'origin_not_allowed' | 'agent_inactive' | 'agent_archived' | 'agent_not_found' | 'session_not_found' | 'session_closed' | 'invalid_customer_id' | 'invalid_token' | 'session_unavailable' | 'stream_unavailable' | 'token_failed' | 'rate_limited' | 'network' | 'interaction_not_pending' | 'interaction_suspended' | 'invalid_interaction' | 'unknown';
|
|
2
|
+
export interface ChatError {
|
|
3
|
+
code: ChatErrorCode;
|
|
4
|
+
message: string;
|
|
5
|
+
retryable: boolean;
|
|
6
|
+
retryAfterSeconds?: number;
|
|
7
|
+
origin?: string;
|
|
8
|
+
}
|
|
9
|
+
export declare function toChatError(code: string | undefined, message?: string): ChatError;
|
|
10
|
+
export declare class ChatRequestError extends Error {
|
|
11
|
+
readonly error: ChatError;
|
|
12
|
+
readonly status: number;
|
|
13
|
+
constructor(error: ChatError, status: number);
|
|
14
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
export interface MintedToken {
|
|
2
|
+
token: string;
|
|
3
|
+
wsUrl: string;
|
|
4
|
+
expiresAt: number;
|
|
5
|
+
}
|
|
6
|
+
export interface PublicSession {
|
|
7
|
+
id: string;
|
|
8
|
+
mode: string;
|
|
9
|
+
status: string;
|
|
10
|
+
help_requested?: boolean;
|
|
11
|
+
created_at?: string;
|
|
12
|
+
}
|
|
13
|
+
export interface Snapshot {
|
|
14
|
+
session: PublicSession | null;
|
|
15
|
+
messages: unknown[];
|
|
16
|
+
active_interaction?: unknown;
|
|
17
|
+
interaction_cursor?: string;
|
|
18
|
+
interaction_response_message?: unknown;
|
|
19
|
+
}
|
|
20
|
+
export interface Bootstrap extends Snapshot {
|
|
21
|
+
agent: {
|
|
22
|
+
agent_uuid: string;
|
|
23
|
+
name: string;
|
|
24
|
+
features: string[];
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
export declare function normalizeExpiry(expiresAt: number | undefined, now?: number): number;
|
|
28
|
+
export declare class HttpClient {
|
|
29
|
+
private readonly fetchImpl;
|
|
30
|
+
private readonly base;
|
|
31
|
+
constructor(baseUrl: string, fetchImpl?: typeof fetch);
|
|
32
|
+
resolveUrl(path: string): string;
|
|
33
|
+
bootstrap(agentId: string, customerId: string, signal?: AbortSignal): Promise<Bootstrap>;
|
|
34
|
+
createSession(agentId: string, customerId: string): Promise<PublicSession>;
|
|
35
|
+
mintPublicToken(sessionId: string): Promise<MintedToken>;
|
|
36
|
+
snapshot(sessionId: string, token: string): Promise<Snapshot>;
|
|
37
|
+
private request;
|
|
38
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { SDK_VERSION } from './version';
|
|
2
|
+
export { createChatClient, DEFAULT_BASE_URL, AWAITING_REPLY_TIMEOUT_MS, SEND_ACK_TIMEOUT_MS } from './client';
|
|
3
|
+
export type { ChatClient, ChatClientOptions, ChatAuth, ServerToken, ChatState, ChatStatus, SendOutcome } from './client';
|
|
4
|
+
export type { ChatError, ChatErrorCode } from './errors';
|
|
5
|
+
export type { TranscriptItem, Message, InteractionItem, Divider } from './state';
|
|
6
|
+
export { SUPPORTED_INTERACTIONS } from './protocol/types';
|
|
7
|
+
export type { InteractionMessage, InteractionResponse, InteractionPresentation } from './protocol/types';
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import type { Snapshot } from './http';
|
|
2
|
+
import type { TranscriptItem } from './state';
|
|
3
|
+
import { type InteractionMessage, type InteractionResponse, type PublicRow, type WireEnvelope, type WriteResult } from './protocol/types';
|
|
4
|
+
export interface InteractionHost {
|
|
5
|
+
sessionId(): string | null;
|
|
6
|
+
humanConnected(): boolean;
|
|
7
|
+
sendFrame(frame: Record<string, unknown>): boolean;
|
|
8
|
+
updateItems(fn: (items: TranscriptItem[]) => TranscriptItem[]): void;
|
|
9
|
+
refreshSnapshot(): Promise<Snapshot | null>;
|
|
10
|
+
onChange(): void;
|
|
11
|
+
newId(): string;
|
|
12
|
+
}
|
|
13
|
+
export type InteractionError = {
|
|
14
|
+
code: 'interaction_not_pending' | 'interaction_suspended' | 'invalid_interaction' | 'network';
|
|
15
|
+
message: string;
|
|
16
|
+
};
|
|
17
|
+
export declare class InteractionController {
|
|
18
|
+
private readonly host;
|
|
19
|
+
private _active;
|
|
20
|
+
private _cursor;
|
|
21
|
+
private _pending;
|
|
22
|
+
private _error;
|
|
23
|
+
private operations;
|
|
24
|
+
private operation;
|
|
25
|
+
private generation;
|
|
26
|
+
private refreshInFlight;
|
|
27
|
+
private recoveryCursor;
|
|
28
|
+
constructor(host: InteractionHost);
|
|
29
|
+
get active(): InteractionMessage | null;
|
|
30
|
+
get cursor(): string;
|
|
31
|
+
get pending(): boolean;
|
|
32
|
+
get error(): InteractionError | null;
|
|
33
|
+
private setActive;
|
|
34
|
+
private setCursor;
|
|
35
|
+
private setSelectionPending;
|
|
36
|
+
private setInteractionError;
|
|
37
|
+
private setRows;
|
|
38
|
+
reset(): void;
|
|
39
|
+
private reject;
|
|
40
|
+
private mergeProjection;
|
|
41
|
+
private refreshMissingOutcome;
|
|
42
|
+
private hasMissingOutcome;
|
|
43
|
+
applySnapshot(snapshot: Snapshot): void;
|
|
44
|
+
applyEvent(event: WireEnvelope): boolean;
|
|
45
|
+
handleWriteResult(result: WriteResult): boolean;
|
|
46
|
+
respond(interactionId: string, response: InteractionResponse): boolean;
|
|
47
|
+
onConnectionOpen(): void;
|
|
48
|
+
}
|
|
49
|
+
export declare function toRows(items: TranscriptItem[]): PublicRow[];
|
|
50
|
+
export declare function fromRows(rows: PublicRow[], previous: TranscriptItem[]): TranscriptItem[];
|