@vinaverse/client 0.1.0-alpha.5 → 0.1.0-alpha.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. package/README.md +67 -7
  2. package/dist/agent/index.cjs +526 -78
  3. package/dist/agent/index.cjs.map +1 -1
  4. package/dist/agent/index.d.cts +2 -2
  5. package/dist/agent/index.d.ts +2 -2
  6. package/dist/agent/index.js +2 -2
  7. package/dist/backend/index.cjs +268 -0
  8. package/dist/backend/index.cjs.map +1 -0
  9. package/dist/backend/index.d.cts +72 -0
  10. package/dist/backend/index.d.ts +72 -0
  11. package/dist/backend/index.js +250 -0
  12. package/dist/backend/index.js.map +1 -0
  13. package/dist/chunk-3BLRAWNC.js +840 -0
  14. package/dist/chunk-3BLRAWNC.js.map +1 -0
  15. package/dist/{chunk-ZWG2TMUL.js → chunk-46D3FSLU.js} +24 -2
  16. package/dist/chunk-46D3FSLU.js.map +1 -0
  17. package/dist/conversation/index.cjs +22 -0
  18. package/dist/conversation/index.cjs.map +1 -1
  19. package/dist/conversation/index.d.cts +2 -2
  20. package/dist/conversation/index.d.ts +2 -2
  21. package/dist/conversation/index.js +2 -2
  22. package/dist/{runtime-DDxwWBBr.d.cts → runtime-C3ZknHdG.d.cts} +139 -20
  23. package/dist/{runtime-B4nKwOTF.d.ts → runtime-CZ1hLvAl.d.ts} +139 -20
  24. package/dist/{store-C7FtS5AY.d.cts → store-7WU1kD9W.d.cts} +31 -1
  25. package/dist/{store-DFk0ayh8.d.ts → store-DrXSPHu6.d.ts} +31 -1
  26. package/dist/testing/index.cjs +38 -1
  27. package/dist/testing/index.cjs.map +1 -1
  28. package/dist/testing/index.d.cts +14 -3
  29. package/dist/testing/index.d.ts +14 -3
  30. package/dist/testing/index.js +40 -3
  31. package/dist/testing/index.js.map +1 -1
  32. package/package.json +21 -2
  33. package/dist/chunk-3WR2SUG2.js +0 -416
  34. package/dist/chunk-3WR2SUG2.js.map +0 -1
  35. package/dist/chunk-ZWG2TMUL.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/contract.ts","../../src/errors.ts","../../src/events.ts","../../src/conversation/answers.ts","../../src/conversation/links.ts","../../src/engine.ts","../../src/secret.ts","../../src/sse.ts","../../src/session.ts","../../src/conversation/timeline.ts","../../src/conversation/store.ts","../../src/conversation/modes.ts"],"names":["OUTCOMES","str"],"mappings":"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","file":"index.cjs","sourcesContent":["// The contract this package version targets: the public API's version and the\n// vinaverse-contracts commit its types were generated from (contracts.lock).\n// A test holds both to the pinned contracts, so they cannot drift.\nexport const CONTRACT = {\n api: 'v1-draft.20',\n commit: '5f6f41bdbfbdd6eadf21180eed1ffddfa5310355',\n} as const;\n","/** Why the client refused to do something; `code` is stable, `message` is for people. */\nexport type ClientErrorCode =\n /** A service key (`vv_sk_`) was given: it belongs on the tenant's backend, never in an app. */\n | 'service_key'\n /** The value is not a client secret (`vv_cs_` and at least 16 base64url characters). */\n | 'invalid_secret'\n /** The action needs the WebSocket (answers to question cards); the session runs over SSE. */\n | 'needs_websocket'\n /** The session was closed by the app, or ended for good (replaced, revoked, expired). */\n | 'session_ended'\n /** An SSE request failed: `status` holds the HTTP status. */\n | 'http_error'\n /**\n * The session ended but the conversation did not (idle, expired, its turn limit): its secret is spent. Have your\n * backend create a new session for the conversation and call `resume()` with it.\n */\n | 'needs_new_session';\n\nexport class VinaverseClientError extends Error {\n override readonly name = 'VinaverseClientError';\n readonly code: ClientErrorCode;\n readonly status: number | undefined;\n\n constructor(code: ClientErrorCode, message: string, status?: number) {\n super(message);\n this.code = code;\n this.status = status;\n }\n}\n","// Typed events and cards, from the generated contract types (vinaverse-v1.yaml). Within v1 the server may add event\n// types, card kinds, question kinds and codes (docs/realtime-protocol.md §5), so inbound frames are never validated\n// strictly: an unknown event is ignored and an unknown card kind is skipped where it is drawn.\nimport type { components } from './generated/vinaverse-v1.js';\n\n/** Every schema of the pinned public contract (vinaverse-v1), by name: `Schemas['Session']`, `Schemas['Card']`, … */\nexport type Schemas = components['schemas'];\n\nexport type ClientEvent = Schemas['ClientEvent'];\nexport type ServerEvent = Schemas['ServerEvent'];\nexport type ServerEventType = ServerEvent['type'];\nexport type ServerEventOf<T extends ServerEventType> = Extract<\n ServerEvent,\n { type: T }\n>;\nexport type Card = Schemas['Card'];\nexport type CardKind = Card['kind'];\nexport type Question = Schemas['Question'];\nexport type AnswerInput = Schemas['AnswerInput'];\nexport type Proposal = Schemas['Proposal'];\nexport type TranscriptItem = Schemas['TranscriptItem'];\nexport type ClientSecret = Schemas['ClientSecret'];\nexport type TurnInput = Schemas['TurnInput'];\n/** v1-draft.20: the tenant's greeting for the session's mode, and the chips that send a message as the person's own. */\nexport type Welcome = Schemas['Welcome'];\nexport type CardImage = Schemas['CardImage'];\nexport type CardGroup = Schemas['CardGroup'];\nexport type CardLink = Schemas['CardLink'];\n/** The session as createSession returns it to the tenant's backend, which passes this part to the app. */\nexport type SessionInfo = Pick<\n Schemas['Session'],\n 'id' | 'realtime_url' | 'turns_url' | 'conversation_id'\n> & {\n client_secret: ClientSecret | string;\n};\n\n/** The outcomes an app reports on a proposal card with `ui.action`. */\nexport type ProposalOutcome = 'confirmed' | 'declined' | 'failed' | 'expired';\n\n// A record over every kind, so a kind added to the contract fails the type check until it is listed here.\nconst CARD_KINDS: Record<CardKind, true> = {\n professional: true,\n workspace: true,\n service: true,\n time_slots: true,\n booking: true,\n quote: true,\n policy: true,\n handoff: true,\n metric_chart: true,\n metric_table: true,\n gap_list: true,\n cluster: true,\n claim: true,\n document: true,\n question: true,\n proposal: true,\n next_step: true,\n links: true,\n};\n\n/** Whether this client knows how to read a card of this kind; skip any other card (§5). */\nexport function isKnownCard(card: { kind: string }): card is Card {\n return Object.hasOwn(CARD_KINDS, card.kind);\n}\n","// Whether an answer to a question card can be sent: the card's own rules (`Question`, `QuestionAnswer`), checked as\n// the person answers so a UI enables Send only for an answer the server will take. The server still decides: what it\n// rejects arrives as `ui.answer.rejected` and unlocks the question. Shared by every UI kit.\nimport type { AnswerInput, Question } from '../events.js';\n\nexport type AnswerProblem =\n /** Nothing chosen or typed, and the question is required (or skipped while required). */\n | 'required'\n /** Fewer choices than `min`. */\n | 'too_few'\n /** More choices than `max`, or more than one where one is asked. */\n | 'too_many'\n /** A value that is not on the card, `none_of_the_above` with another choice, or a form the kind does not take. */\n | 'not_allowed'\n /** The text, or the \"Other\" text, is longer than the card allows (in code points). */\n | 'too_long'\n /** A number outside `min`…`max`, or off its `step`. */\n | 'out_of_range'\n /** Not a calendar date, or outside the card's bounds. */\n | 'bad_date';\n\nconst CHOICE = new Set([\n 'single_choice',\n 'multi_choice',\n 'image_choice',\n 'yes_no',\n 'list_choice',\n]);\nconst ONE_CHOICE = new Set(['single_choice', 'yes_no', 'list_choice']);\n\n/** Unicode code points, as the contract counts every text limit (an emoji outside the BMP is one). */\nexport function codePoints(text: string): number {\n let n = 0;\n for (const _ of text) n++;\n return n;\n}\n\ntype Answer = {\n values?: readonly string[];\n other_text?: string;\n text?: string;\n number?: number;\n date?: string;\n upload_ref?: string;\n skipped?: boolean;\n};\n\n/**\n * The first rule an answer breaks, or null when it can be sent. For `rate_each`, check each row's answer against\n * the question: one column from `options`, or `skipped` when not required. A kind this client does not know is the\n * server's to judge (null).\n */\nexport function answerProblem(\n question: Question,\n input: AnswerInput,\n): AnswerProblem | null {\n const answer = input as Answer;\n if (answer.skipped === true) return question.required ? 'required' : null;\n const kind = question.kind as string;\n if (CHOICE.has(kind)) return choiceProblem(question, answer);\n switch (kind) {\n case 'rate_each': {\n const values = answer.values ?? [];\n if (answer.other_text !== undefined) return 'not_allowed';\n if (values.length === 0) return 'required';\n if (values.length > 1) return 'too_many';\n return (question.options ?? []).some((o) => o.value === values[0])\n ? null\n : 'not_allowed';\n }\n case 'short_text':\n case 'long_text': {\n const text = answer.text ?? '';\n if (!text.trim()) return 'required';\n return codePoints(text) > (question.text?.max_length ?? 2000)\n ? 'too_long'\n : null;\n }\n case 'number':\n case 'scale': {\n const n = answer.number;\n if (typeof n !== 'number' || !Number.isFinite(n)) return 'required';\n const range = kind === 'number' ? question.number : question.scale;\n if (!range) return null;\n if (n < range.min || n > range.max) return 'out_of_range';\n const steps = (n - range.min) / range.step;\n return Math.abs(steps - Math.round(steps)) > 1e-9 ? 'out_of_range' : null;\n }\n case 'date':\n return dateProblem(question, answer.date);\n case 'photo':\n return answer.upload_ref ? null : 'required';\n default:\n return null;\n }\n}\n\nfunction choiceProblem(\n question: Question,\n answer: Answer,\n): AnswerProblem | null {\n const values = answer.values ?? [];\n const other = answer.other_text;\n if (other !== undefined) {\n if (!question.allows_other) return 'not_allowed';\n if (!other.trim()) return 'required';\n if (codePoints(other) > (question.other_max_length ?? 500))\n return 'too_long';\n if (\n values.length > 0 &&\n question.kind !== 'single_choice' &&\n question.kind !== 'multi_choice'\n )\n return 'not_allowed';\n }\n if (values.length === 0) return other !== undefined ? null : 'required';\n if (new Set(values).size !== values.length) return 'not_allowed';\n const none = question.none_of_the_above?.value;\n if (none !== undefined && values.includes(none))\n return values.length === 1 && other === undefined ? null : 'not_allowed';\n const known = new Set((question.options ?? []).map((o) => o.value));\n if (!values.every((v) => known.has(v))) return 'not_allowed';\n // One option for the single kinds (a single_choice may add its \"Other\" too, as the contract allows); the \"Other\"\n // counts as a choice against min and max.\n if (ONE_CHOICE.has(question.kind) && values.length > 1) return 'too_many';\n const chosen = values.length + (other !== undefined ? 1 : 0);\n if (question.min !== undefined && chosen < question.min) return 'too_few';\n if (question.max !== undefined && chosen > question.max) return 'too_many';\n return null;\n}\n\nfunction dateProblem(\n question: Question,\n date: string | undefined,\n): AnswerProblem | null {\n if (!date) return 'required';\n const m = /^(\\d{4})-(\\d{2})-(\\d{2})$/.exec(date);\n if (!m) return 'bad_date';\n const [y, mo, d] = [Number(m[1]), Number(m[2]), Number(m[3])];\n const at = new Date(Date.UTC(y, mo - 1, d));\n if (\n at.getUTCFullYear() !== y ||\n at.getUTCMonth() !== mo - 1 ||\n at.getUTCDate() !== d\n )\n return 'bad_date';\n // ISO dates compare as text.\n if (question.date?.min !== undefined && date < question.date.min)\n return 'bad_date';\n if (question.date?.max !== undefined && date > question.date.max)\n return 'bad_date';\n return null;\n}\n","// The deep-link rule an app applies to a card's `deep_link` and a proposal's `edit_deep_link` before it opens one\n// (docs/realtime-protocol.md §6, admin-v1.yaml `Connector.deep_link_prefixes`): the link starts with a prefix the\n// tenant registered, compared code point for code point, and what follows the prefix is on the allowlist. The\n// patterns are the contract's own (fixtures/api/deep-link-vectors.json), and the tests run its vectors.\n\nconst PREFIX =\n /^[a-z][a-z0-9+.-]*:(\\/\\/\\.*[A-Za-z0-9_~-][A-Za-z0-9._~-]*(:(6553[0-5]|655[0-2][0-9]|65[0-4][0-9]{2}|6[0-4][0-9]{3}|[1-5][0-9]{4}|[1-9][0-9]{0,3}))?\\/|\\.*[A-Za-z0-9_~-][A-Za-z0-9._~-]*\\/)(\\.*[A-Za-z0-9_~-][A-Za-z0-9._~-]*\\/)*$/;\nconst PREFIX_HTTPS =\n /^https?:\\/\\/[a-z0-9-]+(\\.[a-z0-9-]+)*(:(6553[0-5]|655[0-2][0-9]|65[0-4][0-9]{2}|6[0-4][0-9]{3}|[1-5][0-9]{4}|[1-9][0-9]{0,3}))?\\/\\.*[A-Za-z0-9_~-][A-Za-z0-9._~-]*\\//;\nconst REFUSED_SCHEMES =\n /^(javascript|vbscript|data|blob|file|filesystem|about|view-source|intent|android-app|content|jar|mhtml|itms-services|ftp|ws|wss):/;\n// biome-ignore lint/suspicious/noControlCharactersInRegex: the contract refuses control characters in a prefix.\nconst CONTROLS = /[\\x00-\\x1f\\x7f]/;\nconst REMAINDER =\n /^(\\.*[A-Za-z0-9_~-][A-Za-z0-9._~-]*(\\/\\.*[A-Za-z0-9_~-][A-Za-z0-9._~-]*)*\\/?)?(\\?([A-Za-z0-9._~=&-]|%(2[0-46-9A-Ea-e]|3[0-9B-Fb-f]|[46][0-9A-Fa-f]|5[0-9ABD-Fabd-f]|7[0-9A-Ea-e]))*)?$/;\n\n/** Whether a prefix may be registered: the contract's prefix pattern, no refused scheme, no control character. */\nexport function isValidLinkPrefix(prefix: string): boolean {\n if (CONTROLS.test(prefix) || REFUSED_SCHEMES.test(prefix)) return false;\n if (/^https?:/.test(prefix) && !PREFIX_HTTPS.test(prefix)) return false;\n return PREFIX.test(prefix);\n}\n\n/**\n * Whether a card's link may be opened: it starts with one of the registered prefixes (invalid ones are ignored) and\n * what follows is a path and an optional query of the allowed characters. Route by the page it names; never open a\n * query value.\n */\nexport function isAllowedLink(\n link: string,\n prefixes: readonly string[],\n): boolean {\n return prefixes.some(\n (prefix) =>\n isValidLinkPrefix(prefix) &&\n link.startsWith(prefix) &&\n REMAINDER.test(link.slice(prefix.length)),\n );\n}\n","// The conversation engine: the state an app keeps for one agent\n// conversation, moved by what it sends, what it receives and what happens to\n// its connection, as docs/realtime-protocol.md decides it. It models what the\n// protocol decides (cards, locks, acknowledgements, resends, outcomes,\n// reconnects), never how an app draws it, and it is held to the shared\n// recordings (vinaverse-contracts conformance/realtime/*) by its tests.\n// Pure and synchronous: the session transport feeds it, and so can a test.\n\n/** A frame as received or sent: its `type`, and whatever else the contract gives it. */\nexport interface Frame {\n readonly type: string;\n readonly [field: string]: unknown;\n}\n\n/** A card as the app holds it. `locked` lists the question ids (the card's, or a `rate_each` row's) drawn locked. */\nexport interface HeldCard {\n readonly id: string;\n readonly kind: string;\n readonly card: Readonly<Record<string, unknown>>;\n readonly question?: HeldQuestion;\n readonly locked: readonly string[];\n /** The turn that drew the card, when known: `ui.action` names it with the card's `id`. */\n readonly turnId?: string;\n /** A proposal's first reported outcome (`confirmed`, `declined`, `failed`, `expired`); later ones change nothing. */\n readonly outcome?: string | null;\n /** Arrival order, shared with messages: a timeline sorts both by it. Moves when the card is drawn again. */\n readonly seq: number;\n}\n\nexport interface HeldQuestion {\n readonly question_id: string;\n readonly kind: string;\n readonly state: string;\n readonly answer?: unknown;\n readonly row_answers?: readonly { question_id: string; answer: unknown }[];\n readonly rows?: readonly { question_id: string }[];\n readonly [field: string]: unknown;\n}\n\nexport interface Message {\n readonly role: 'assistant' | 'person' | 'staff' | (string & {});\n readonly text: string;\n /**\n * Stable for the message's life, to key it in a list: a person's text by its `client_event_id`, an agent's reply by\n * its turn (`a:<turn_id>`), a staff reply by its `message_id` (`s:<id>`), a guardrail refusal by the input it answers\n * (`r:<client_event_id>`), a transcript item by its server `id` as the live key it matches, or by its time and role\n * (`t:<at>:<role>`) from a server that sends no `id`.\n */\n readonly key: string;\n /** Arrival order, shared with cards: a timeline sorts both by it. */\n readonly seq: number;\n /**\n * A reply cut off after some of it streamed; what streamed stands (§6): `blocked` (`output_blocked`), `interrupted`\n * (`cancelled`, as when a person from the business takes over, or the connection dropped), `failed` (any other code).\n */\n readonly partial?: 'blocked' | 'interrupted' | 'failed';\n /** A person's text recorded during a takeover (`input.received`): the business reads it; no agent turn runs. */\n readonly received?: true;\n /** The agent's reply is a guardrail refusal (`input.rejected` `guardrail`, its `message`). */\n readonly refusal?: true;\n}\n\n/** A person from the business is replying (`takeover.started`); `by` is their role as the person sees it. */\nexport interface Takeover {\n readonly by: string | null;\n readonly at: string;\n}\n\n/** The turn's text streamed so far (`message.delta`), until its `message.completed`. */\nexport interface Streaming {\n readonly turnId: string;\n readonly text: string;\n /** Taken at the turn's first delta, and kept by its message: a reply sorts before the cards its turn drew after it. */\n readonly seq: number;\n}\n\nexport interface Connection {\n readonly name: string;\n readonly state: 'open' | 'closed';\n readonly code?: number;\n readonly reason?: string;\n}\n\nexport interface ToolLine {\n readonly turn_id: string;\n readonly label: string;\n readonly state: string;\n}\n\n/**\n * Whether and how the conversation goes on after a connection ends:\n * - `allowed`: reconnect to the same session;\n * - `user_action_only`: the session was revoked or replaced (the conversation continued elsewhere): resume only when\n * the person asks;\n * - `new_session_on_next_action`: the session ended (idle, expired, limit_reached) but the conversation did not; its\n * secret is spent. On the person's next action, the app has its backend create a new session for the same\n * conversation and calls `resume()`.\n */\nexport type Reconnect =\n | 'allowed'\n | 'user_action_only'\n | 'new_session_on_next_action';\n\n/** The engine's whole state, for an app to draw. */\nexport interface ConversationState {\n readonly sessionId: string | null;\n readonly conversationId: string | null;\n readonly connection: Connection | null;\n /** How the conversation goes on after the connection ends (`Reconnect`). */\n readonly reconnect: Reconnect;\n readonly messages: readonly Message[];\n /** Every card held, oldest first. */\n readonly cards: readonly HeldCard[];\n /** The newest question card still open: the one to answer. */\n readonly openQuestion: string | null;\n /** Events sent and neither acknowledged nor refused, by `client_event_id`: resend them, same id, after a reconnect. */\n readonly unacknowledged: readonly Frame[];\n /** Ids refused for now (`turn_in_progress`, `screen_unavailable`): send again with the same id. */\n readonly resend: readonly string[];\n /**\n * Texts and answers refused with `limit_reached`: never resent in this session (it would get the same refusal);\n * resent, same id, on the next session's `session.ready`. Kept apart from `resend` (conformance README, `held`). A\n * refused action is dropped: a new session cannot act on an earlier session's card.\n */\n readonly held: readonly string[];\n /** Typed messages whose refusal stands, by `client_event_id`: shown as not sent, never resent. */\n readonly refused: Readonly<Record<string, string>>;\n /** The last `flow.completed`: `ok`, `refused` or `failed` (an unknown result reads as `failed`). */\n readonly flow: {\n readonly flow: unknown;\n readonly result: 'ok' | 'refused' | 'failed';\n } | null;\n /** The turn in progress. */\n readonly turn: string | null;\n /** The last state of each tool line (the last 100). */\n readonly tools: readonly ToolLine[];\n readonly handoffs: readonly unknown[];\n /** The codes of `error` and `turn.failed` events (the last 100). */\n readonly errors: readonly string[];\n /**\n * While `reconnect` is `new_session_on_next_action`: the `client_event_id`s held for the next session (unacknowledged,\n * or refused for this session's turn limit). Draw them as \"sends when you continue\", not as failed. Empty otherwise.\n */\n readonly heldForNextSession: readonly string[];\n /** Seconds left when `session.expiring` arrived (WebSocket only, about a minute before the end); null otherwise. */\n readonly expiring: number | null;\n /** The turn's text streamed so far, until its `message.completed` (or its end, which keeps it as a message). */\n readonly streaming: Streaming | null;\n /** While a person from the business replies (§8): from `takeover.started` to `takeover.ended`. */\n readonly takeover: Takeover | null;\n /** Every refusal's code and `message` (`input.rejected`), by `client_event_id`; `refused` lists those that stand. */\n readonly rejections: Readonly<\n Record<string, { code: string; message: string }>\n >;\n /** The AI disclosure `session.ready` carries: always shown, never removed. Null until the first one. */\n readonly disclosure: string | null;\n /** `session.ready`'s `limits.turns_left`, when given. */\n readonly turnsLeft: number | null;\n}\n\nconst UNLOCKS_KEEP_LOCKED = new Set([\n 'card_superseded',\n 'client_event_id_reused',\n]);\nconst RESEND = new Set(['turn_in_progress', 'screen_unavailable']);\nconst FLOW_RESULTS = new Set(['ok', 'refused', 'failed']);\nconst OUTCOMES = new Set(['confirmed', 'declined', 'failed', 'expired']);\n/** `session.closed` reasons after which the conversation goes on here: reconnect (idle, on the next input). */\n/** `server_restart`: reserved (the gateway does not send it today); the same session is reconnected to. */\nconst RECONNECTABLE = new Set(['server_restart']);\n/** The session ended, the conversation goes on: a new session on the next action. */\nconst NEW_SESSION = new Set(['idle', 'expired', 'limit_reached']);\nconst KEEP = 100;\n\ntype Mutable<T> = { -readonly [K in keyof T]: T[K] };\ninterface Card {\n id: string;\n kind: string;\n card: Record<string, unknown>;\n question?: Mutable<HeldQuestion>;\n locked: string[];\n turnId?: string;\n outcome?: string | null;\n /** The `client_event_id` that reported `outcome`. */\n outcomeBy?: string;\n seq: number;\n}\n\nconst str = (v: unknown): string | undefined =>\n typeof v === 'string' ? v : undefined;\n\n// TypeScript `private` rather than `#` fields: the package ships ES2022 as is, and Hermes (React Native) has no\n// `#` private fields.\nexport class ConversationEngine {\n private sessionId: string | null = null;\n private conversationId: string | null = null;\n private connection: Mutable<Connection> | null = null;\n private reconnect: Reconnect = 'allowed';\n private messages: Message[] = [];\n private cards = new Map<string, Card>();\n private unacknowledged = new Map<string, Frame>();\n private resend: string[] = [];\n private held: string[] = [];\n private refused: Record<string, string> = {};\n private flow: ConversationState['flow'] = null;\n private turn: string | null = null;\n private tools: ToolLine[] = [];\n private handoffs: unknown[] = [];\n private errors: string[] = [];\n private expiring: number | null = null;\n private streaming: Streaming | null = null;\n private takeover: Takeover | null = null;\n private rejections: Record<string, { code: string; message: string }> = {};\n private disclosure: string | null = null;\n private turnsLeft: number | null = null;\n /** The next arrival number for a message or a card. */\n private seq = 0;\n /** The cards drawn before a resumed flow's transcript replaced them: proposal outcomes carry over. */\n private replaced: Map<string, Card> | null = null;\n /** client_event_id → the first event the app sent under it, until it is settled. */\n private readonly inputs = new Map<string, Frame>();\n\n // ------------------------------------------------------------ what happens around the frames\n\n /** The tenant's backend created a session (and named its conversation). */\n sessionCreated(sessionId: string, conversationId?: string | null): void {\n this.sessionId = sessionId;\n this.conversationId = conversationId ?? null;\n }\n\n /** A connection opened: the user's own action, or an allowed reconnect, so it lifts a hold on reconnecting. */\n connected(name: string): void {\n this.connection = { name, state: 'open' };\n this.reconnect = 'allowed';\n }\n\n /** A connection closed with its code. `4403` (revoked) and `4409` (replaced) hold reconnecting for a user action. */\n closed(name: string, code: number): void {\n if (this.connection?.name !== name) return;\n this.connection.state = 'closed';\n this.connection.code = code;\n // The session.closed reason decides when one preceded the close ({idle} then 4403 is still a new session on the\n // next action); the close code decides only on its own: 4403 and 4409 wait for the person, 4408 wants a new\n // session.\n if (this.connection.reason === undefined) {\n if (code === 4403 || code === 4409) this.reconnect = 'user_action_only';\n else if (code === 4408) this.reconnect = 'new_session_on_next_action';\n }\n this.cutOff('interrupted');\n this.turn = null;\n }\n\n /** The app was killed: what it drew is gone; what it sent and never saw acknowledged it kept, to resend. */\n killed(): void {\n this.messages = [];\n this.cards = new Map();\n this.turn = null;\n this.streaming = null;\n this.takeover = null; // announced again on the next connection's session.ready, if it goes on\n }\n\n // ------------------------------------------------------------ what the app sends\n\n sent(event: Frame): void {\n const id = str(event.client_event_id);\n switch (event.type) {\n case 'ui.answer': {\n if (id === undefined) return;\n if (!this.inputs.has(id)) this.inputs.set(id, event);\n this.unqueue(id);\n this.unacknowledged.set(id, event);\n const card = this.cards.get(str(event.card_id) ?? '');\n const questionId = str(event.question_id);\n if (card && questionId) lock(card, questionId);\n return;\n }\n case 'input.text': {\n if (id === undefined) return;\n if (!this.inputs.has(id)) this.inputs.set(id, event);\n this.unqueue(id);\n delete this.refused[id];\n this.unacknowledged.set(id, event);\n return;\n }\n case 'ui.action': {\n if (id !== undefined) {\n if (!this.inputs.has(id)) this.inputs.set(id, event);\n this.unqueue(id);\n this.unacknowledged.set(id, event);\n }\n const card = this.cards.get(str(event.card_id) ?? '');\n const action = str(event.action);\n if (\n card?.kind === 'proposal' &&\n action &&\n OUTCOMES.has(action) &&\n card.outcome === null\n ) {\n card.outcome = action;\n if (id !== undefined) card.outcomeBy = id;\n }\n return;\n }\n default:\n return;\n }\n }\n\n // ------------------------------------------------------------ what the server sends\n\n received(event: Frame): void {\n switch (event.type) {\n case 'session.ready':\n this.ready(event);\n return;\n case 'turn.started': {\n this.turn = str(event.turn_id) ?? null;\n const id = str(event.client_event_id);\n if (id !== undefined) {\n const sent = this.inputs.get(id);\n this.settle(id);\n if (sent?.type === 'input.text') {\n this.say('person', str(sent.text) ?? '', id);\n }\n }\n return;\n }\n case 'message.delta': {\n const turnId = str(event.turn_id) ?? '';\n const text = str(event.text) ?? '';\n if (this.streaming?.turnId === turnId)\n this.streaming = {\n ...this.streaming,\n text: this.streaming.text + text,\n };\n else {\n this.cutOff('interrupted'); // another turn's text, never completed\n this.streaming = { turnId, text, seq: this.seq++ };\n }\n return;\n }\n case 'message.completed': {\n const turnId = str(event.turn_id) ?? '';\n const streaming =\n this.streaming?.turnId === turnId ? this.streaming : null;\n if (streaming) this.streaming = null;\n this.say(\n 'assistant',\n str(event.text) ?? '',\n `a:${turnId}`,\n {},\n streaming?.seq,\n );\n return;\n }\n case 'ui.cards':\n for (const card of asArray(event.cards))\n this.hold(card, str(event.turn_id));\n return;\n case 'tool.status': {\n const line = {\n turn_id: str(event.turn_id) ?? '',\n label: str(event.label) ?? '',\n state: str(event.state) ?? '',\n };\n const at = this.tools.findIndex(\n (t) => t.turn_id === line.turn_id && t.label === line.label,\n );\n if (at === -1) this.tools = [...this.tools, line].slice(-KEEP);\n else this.tools[at] = line;\n return;\n }\n case 'handoff.created':\n this.handoffs.push(event.ticket);\n return;\n case 'turn.completed':\n this.turn = null;\n return;\n case 'turn.failed': {\n // What streamed before the failure stands (§6), cut off: blocked, interrupted (a takeover) or failed.\n const code = str(event.code) ?? '';\n if (this.streaming?.turnId === str(event.turn_id))\n this.cutOff(\n code === 'output_blocked'\n ? 'blocked'\n : code === 'cancelled'\n ? 'interrupted'\n : 'failed',\n );\n this.turn = null;\n this.error(code);\n return;\n }\n case 'takeover.started':\n this.takeover = {\n by: str(event.by) ?? null,\n at: str(event.at) ?? '',\n };\n return;\n case 'takeover.ended':\n this.takeover = null;\n return;\n case 'message.staff': {\n const id = str(event.message_id);\n if (id !== undefined)\n this.say('staff', str(event.text) ?? '', `s:${id}`);\n return;\n }\n case 'input.received': {\n // During a takeover: the text was recorded for the business; no turn runs, and it is never resent.\n const id = str(event.client_event_id);\n if (id === undefined) return;\n const sent = this.inputs.get(id);\n this.settle(id);\n if (sent?.type === 'input.text')\n this.say('person', str(sent.text) ?? '', id, { received: true });\n return;\n }\n case 'ui.answer.recorded':\n this.recorded(event);\n return;\n case 'ui.answer.rejected':\n this.rejected(event);\n return;\n case 'input.rejected':\n this.inputRejected(event);\n return;\n case 'flow.completed': {\n const result = str(event.result) ?? '';\n this.flow = {\n flow: event.flow,\n result: (FLOW_RESULTS.has(result) ? result : 'failed') as\n | 'ok'\n | 'refused'\n | 'failed',\n };\n return;\n }\n case 'session.closed': {\n const reason = str(event.reason);\n // No reason (a malformed frame): read as a bare close, so the close code that follows decides.\n if (reason === undefined) return;\n // Idle, expired, limit_reached: the session is over, the conversation is not; a new session on the next\n // action. A server restart (reserved): the same session again. Replaced, revoked, or a reason this client\n // does not know (read as revoked): only on a user action.\n if (NEW_SESSION.has(reason))\n this.reconnect = 'new_session_on_next_action';\n else if (!RECONNECTABLE.has(reason))\n this.reconnect = 'user_action_only';\n if (this.connection) this.connection.reason = reason;\n return;\n }\n case 'session.expiring':\n this.expiring =\n typeof event.seconds_left === 'number' ? event.seconds_left : null;\n return;\n case 'error': {\n this.error(str(event.code) ?? '');\n const id = str(event.client_event_id);\n // An older server's retryable error for an unchecked input: handled as input.rejected.\n if (id !== undefined && event.code === 'screen_unavailable') {\n this.inputRejected(event);\n } else if (id !== undefined) {\n this.settle(id);\n }\n return;\n }\n default:\n return; // an event type this client does not know is ignored\n }\n }\n\n private ready(event: Frame): void {\n const session = event.session as { id?: unknown } | undefined;\n this.sessionId = str(session?.id) ?? this.sessionId;\n this.turn = null;\n this.expiring = null;\n this.disclosure = str(event.disclosure) ?? this.disclosure;\n const limits = event.limits as { turns_left?: unknown } | undefined;\n this.turnsLeft =\n typeof limits?.turns_left === 'number' ? limits.turns_left : null;\n // A takeover still in progress is announced again after session.ready (§8).\n this.takeover = null;\n this.cutOff('interrupted');\n if (event.resumed !== true) return;\n // A resumed session brings the server's view of the conversation. With the live ids (v1-draft.17) it merges\n // into what the app holds, so older history the app loaded stays; without them it replaces what the app drew.\n if (event.transcript !== undefined && transcriptHasIds(event.transcript)) {\n this.mergeTranscript(asArray(event.transcript));\n } else if (event.transcript !== undefined) {\n this.messages = [];\n this.replaced = this.cards;\n this.cards = new Map();\n for (const item of asArray(event.transcript)) {\n if (item.role === 'card')\n this.hold(item.card as Record<string, unknown>);\n else {\n const role = str(item.role) ?? '';\n this.say(\n role,\n str(item.text) ?? '',\n transcriptKey(role, str(item.id), str(item.at)),\n item.interrupted === true ? { partial: 'interrupted' } : {},\n );\n }\n }\n }\n // The open question, and the proposals still awaiting an outcome.\n for (const card of asArray(event.pending_cards))\n this.hold(card, str(card.turn_id));\n this.replaced = null;\n }\n\n /**\n * A transcript merged by key: an item the app holds keeps its place, with the text the server recorded; one it does\n * not hold goes just after the nearest earlier item it does (just before the first later one when none came before,\n * at the end when it holds none of them). Nothing the app holds is dropped.\n */\n private mergeTranscript(items: Record<string, unknown>[]): void {\n const seqOf = (key: string | undefined) =>\n key === undefined\n ? undefined\n : (this.messages.find((m) => m.key === key) ?? this.cards.get(key))\n ?.seq;\n const keys = items.map((item) =>\n item.role === 'card'\n ? str((item.card as Frame | undefined)?.id)\n : transcriptKey(str(item.role) ?? '', str(item.id), str(item.at)),\n );\n let prev: number | undefined;\n items.forEach((item, i) => {\n const key = keys[i];\n if (key === undefined) return;\n const known = seqOf(key);\n let at: number | undefined;\n if (known === undefined) {\n // Halfway to the nearest held item: after the one before, or before the first one after; else at the end.\n const near =\n prev ??\n keys\n .slice(i + 1)\n .map(seqOf)\n .find((q) => q !== undefined);\n if (near !== undefined) {\n const seqs = [...this.messages, ...this.cards.values()].map(\n (h) => h.seq,\n );\n const bound =\n prev === undefined\n ? Math.max(near - 1, ...seqs.filter((q) => q < near))\n : Math.min(...seqs.filter((q) => q > near));\n if (Number.isFinite(bound)) at = (near + bound) / 2;\n }\n }\n if (item.role === 'card') this.hold(item.card as Frame, undefined, at);\n else {\n const text = str(item.text) ?? '';\n const partial = item.interrupted === true ? 'interrupted' : undefined;\n if (known === undefined)\n this.say(\n str(item.role) ?? '',\n text,\n key,\n partial ? { partial } : {},\n at,\n );\n else\n this.messages = this.messages.map((m) => {\n if (m.key !== key) return m;\n // The server's record stands: a reply cut off here but finished there is whole again.\n const { partial: local, ...rest } = m;\n const kept =\n partial ?? (local === 'interrupted' ? undefined : local);\n return {\n ...rest,\n text: text || m.text,\n ...(kept ? { partial: kept } : {}),\n };\n });\n }\n prev = seqOf(key);\n });\n this.messages.sort((a, b) => a.seq - b.seq);\n }\n\n private hold(\n raw: Record<string, unknown> | undefined,\n turnId?: string,\n at?: number,\n ): void {\n if (!raw) return;\n const id = str(raw.id);\n if (id === undefined) return;\n const kind = str(raw.kind) ?? '';\n const question = raw.question as Mutable<HeldQuestion> | undefined;\n const card: Card = {\n id,\n kind,\n card: raw,\n ...(question ? { question: structuredCopy(question) } : {}),\n locked: lockedFrom(question),\n ...(turnId !== undefined ? { turnId } : {}),\n // A card still held keeps its place when it is drawn again (a reconnect's pending cards, a repeated ui.cards).\n seq: this.cards.get(id)?.seq ?? at ?? this.seq++,\n };\n // A held answer keeps its question locked until it is resent (§2), however the card is drawn again (a resumed\n // session.ready, or a turn's ui.cards before the resend).\n for (const held of this.held) {\n const sent = this.inputs.get(held);\n if (sent?.type === 'ui.answer' && sent.card_id === id) {\n const questionId = str(sent.question_id);\n if (questionId !== undefined) lock(card, questionId);\n }\n }\n if (kind === 'proposal') {\n // Drawn again (a resumed session's pending cards, a repeated ui.cards): the outcome reported stands.\n const held = this.cards.get(id) ?? this.replaced?.get(id);\n card.outcome = held?.outcome ?? null;\n if (held?.outcomeBy !== undefined) card.outcomeBy = held.outcomeBy;\n }\n this.cards.delete(id); // newest last\n this.cards.set(id, card);\n }\n\n private recorded(event: Frame): void {\n const id = str(event.client_event_id) ?? '';\n const card = this.cards.get(str(event.card_id) ?? '');\n const sent = this.inputs.get(id);\n this.settle(id);\n if (!card?.question || !sent) return;\n const q = card.question;\n const questionId = str(event.question_id) ?? '';\n lock(card, questionId);\n if (q.kind === 'rate_each') {\n const rows = (q.row_answers ?? []).filter(\n (r) => r.question_id !== questionId,\n );\n q.row_answers = [\n ...rows,\n { question_id: questionId, answer: sent.answer },\n ];\n const answered = q.row_answers;\n if (\n (q.rows ?? []).every((r) =>\n answered.some((a) => a.question_id === r.question_id),\n )\n ) {\n q.state = 'answered';\n lock(card, q.question_id); // every row answered: the whole card is locked\n }\n } else {\n q.answer = sent.answer;\n q.state = 'answered';\n }\n }\n\n private rejected(event: Frame): void {\n this.settle(str(event.client_event_id) ?? '');\n const card = this.cards.get(str(event.card_id) ?? ''); // a rejected answer shows on its question\n const questionId = str(event.question_id);\n if (!card || questionId === undefined) return;\n if (UNLOCKS_KEEP_LOCKED.has(str(event.code) ?? '')) lock(card, questionId);\n else unlock(card, questionId); // the four unlocking codes, and any code this client does not know\n }\n\n private inputRejected(event: Frame): void {\n const id = str(event.client_event_id);\n if (id === undefined) return;\n this.unacknowledged.delete(id);\n const code = str(event.code) ?? '';\n this.rejections[id] = { code, message: str(event.message) ?? '' };\n if (RESEND.has(code)) {\n if (!this.resend.includes(id)) this.resend.push(id);\n return;\n }\n if (code === 'limit_reached') {\n // The session has no turns left (the socket stays open; no session.closed follows). A text or an answer never\n // ran: it is held for the next session of the conversation, which only the tenant's backend creates, on the\n // person's next action, and resent there under the same id, never in this session (it would get the same\n // refusal). An action is dropped: a new session cannot act on an earlier session's card.\n this.unqueue(id);\n const kind = this.inputs.get(id)?.type;\n if (kind === 'input.text' || kind === 'ui.answer') {\n if (!this.held.includes(id)) this.held.push(id);\n } else this.inputs.delete(id); // an action, or nothing this client sent\n this.reconnect = 'new_session_on_next_action';\n return;\n }\n // screened, guardrail, an unknown code…: shown as not sent, never resent. A duplicate's earlier turn stands.\n if (code !== 'duplicate') this.refused[id] = code;\n const sent = this.inputs.get(id);\n if (code === 'guardrail' && sent?.type === 'input.text') {\n // The tenant's refusal is the agent's reply to the person's text (§6).\n this.say('person', str(sent.text) ?? '', id);\n this.say('assistant', str(event.message) ?? '', `r:${id}`, {\n refusal: true,\n });\n }\n this.inputs.delete(id);\n }\n\n /** No longer to resend, nor held for the next session (sent again, or settled). */\n private unqueue(id: string): void {\n this.resend = this.resend.filter((r) => r !== id);\n this.held = this.held.filter((r) => r !== id);\n }\n\n /** An input acknowledged or refused for good: nothing more is resent under its id. */\n private settle(id: string): void {\n delete this.rejections[id]; // a refusal for now (turn_in_progress, screen_unavailable) no longer applies\n this.unacknowledged.delete(id);\n this.inputs.delete(id);\n this.unqueue(id); // a copy sent twice can be answered after a refusal\n }\n\n /** Adds a message once: a key already held (a frame seen twice) changes nothing. */\n private say(\n role: string,\n text: string,\n key: string,\n extra: Pick<Message, 'partial' | 'received' | 'refusal'> = {},\n seq?: number,\n ): void {\n if (this.messages.some((m) => m.key === key)) return;\n this.messages.push({ role, text, key, seq: seq ?? this.seq++, ...extra });\n }\n\n /** The turn's streamed text, kept as the agent's message when the turn ends without its `message.completed`. */\n private cutOff(partial: NonNullable<Message['partial']>): void {\n const streaming = this.streaming;\n this.streaming = null;\n // Stored as the runtime records it: trimmed (the reference client does the same).\n const text = streaming?.text.trim();\n if (streaming && text)\n this.say(\n 'assistant',\n text,\n `a:${streaming.turnId}`,\n { partial },\n streaming.seq,\n );\n }\n\n private error(code: string): void {\n this.errors = [...this.errors, code].slice(-KEEP);\n }\n\n /**\n * An input that could not be delivered, or whose retries are spent (`screen_unavailable` after the last try): it is\n * no longer resent. A typed message is shown as not sent, with `code`; an answer's question unlocks so the person\n * can answer again; a proposal outcome it reported is taken back, so it can be reported again.\n */\n giveUp(clientEventId: string, code: string): void {\n const sent = this.inputs.get(clientEventId);\n if (!sent) return;\n const rejection = this.rejections[clientEventId];\n this.resend = this.resend.filter((r) => r !== clientEventId);\n this.settle(clientEventId);\n const card = this.cards.get(str(sent.card_id) ?? '');\n if (sent.type === 'input.text') {\n this.refused[clientEventId] = code;\n if (rejection) this.rejections[clientEventId] = rejection; // its last message, shown with \"not sent\"\n } else if (sent.type === 'ui.answer') {\n const questionId = str(sent.question_id);\n if (card && questionId !== undefined) unlock(card, questionId);\n } else if (card?.outcomeBy === clientEventId) {\n card.outcome = null;\n delete card.outcomeBy;\n }\n }\n\n /** A turn the app stopped where no event will say so (an SSE turn cancelled): none is in progress. */\n turnEnded(): void {\n this.turn = null;\n }\n\n // ------------------------------------------------------------ reading it\n\n /** The event first sent under a `client_event_id`, to resend it unchanged. */\n input(clientEventId: string): Frame | undefined {\n return this.inputs.get(clientEventId);\n }\n\n state(): ConversationState {\n const cards = [...this.cards.values()].map(freeze);\n const open = cards.filter(\n (c) => c.kind === 'question' && c.question?.state === 'open',\n );\n return {\n sessionId: this.sessionId,\n conversationId: this.conversationId,\n connection: this.connection ? { ...this.connection } : null,\n reconnect: this.reconnect,\n messages: [...this.messages],\n cards,\n openQuestion: open.length ? (open[open.length - 1] as HeldCard).id : null,\n unacknowledged: [...this.unacknowledged.values()],\n resend: [...this.resend],\n held: [...this.held],\n refused: { ...this.refused },\n flow: this.flow,\n turn: this.turn,\n tools: [...this.tools],\n handoffs: [...this.handoffs],\n errors: [...this.errors],\n streaming: this.streaming,\n takeover: this.takeover,\n rejections: { ...this.rejections },\n disclosure: this.disclosure,\n turnsLeft: this.turnsLeft,\n heldForNextSession:\n this.reconnect === 'new_session_on_next_action'\n ? [\n ...new Set([\n ...this.unacknowledged.keys(),\n ...this.resend,\n ...this.held,\n ]),\n ]\n : [],\n expiring: this.expiring,\n };\n }\n}\n\n/**\n * A transcript item's key: the live one when the server names it (`id`, v1-draft.17: the turn, the\n * `client_event_id` or the staff `message_id`), so a resumed message keeps the key it was drawn under; its time and\n * role from an older server.\n */\nfunction transcriptKey(\n role: string,\n id: string | undefined,\n at: string | undefined,\n): string {\n if (id === undefined) return `t:${at ?? ''}:${role}`;\n if (role === 'assistant') return `a:${id}`;\n if (role === 'staff') return `s:${id}`;\n return id;\n}\n\n/**\n * Whether a resumed transcript names every message by its live id (v1-draft.17), so it can merge into what the app\n * holds by key. A card item is named by its card's `id`.\n */\nexport function transcriptHasIds(transcript: unknown): boolean {\n return asArray(transcript).every((item) =>\n item.role === 'card'\n ? str((item.card as Record<string, unknown> | undefined)?.id) !==\n undefined\n : str(item.id) !== undefined,\n );\n}\n\nfunction lockedFrom(question: HeldQuestion | undefined): string[] {\n if (!question) return [];\n if (question.state !== 'open') {\n return [\n question.question_id,\n ...(question.rows ?? []).map((r) => r.question_id),\n ];\n }\n return (question.row_answers ?? []).map((r) => r.question_id);\n}\n\nfunction lock(card: Card, id: string): void {\n if (!card.locked.includes(id)) card.locked.push(id);\n}\n\nfunction unlock(card: Card, id: string): void {\n card.locked = card.locked.filter((q) => q !== id);\n}\n\nfunction freeze(card: Card): HeldCard {\n return {\n id: card.id,\n kind: card.kind,\n card: card.card,\n ...(card.question ? { question: { ...card.question } } : {}),\n locked: [...card.locked],\n ...(card.turnId !== undefined ? { turnId: card.turnId } : {}),\n ...(card.outcome !== undefined ? { outcome: card.outcome } : {}),\n seq: card.seq,\n };\n}\n\nfunction asArray(value: unknown): Record<string, unknown>[] {\n return Array.isArray(value) ? (value as Record<string, unknown>[]) : [];\n}\n\nfunction structuredCopy<T>(value: T): T {\n return JSON.parse(JSON.stringify(value)) as T;\n}\n","import { VinaverseClientError } from './errors.js';\n\nconst CLIENT_SECRET = /^vv_cs_[A-Za-z0-9_-]{16,}$/;\n\n/**\n * The client secret, checked: an app holds only the session's `vv_cs_` secret, which the tenant's backend got from\n * createSession. A service key is refused outright, so it never reaches a socket or a request from an app. The error\n * never repeats the value.\n */\nexport function clientSecret(value: unknown): string {\n const secret =\n typeof value === 'object' && value !== null\n ? (value as { value?: unknown }).value\n : value;\n if (typeof secret === 'string' && secret.startsWith('vv_sk_')) {\n throw new VinaverseClientError(\n 'service_key',\n 'A Vinaverse service key belongs on your backend only. Pass the session client secret (vv_cs_…) to the app.',\n );\n }\n if (typeof secret !== 'string' || !CLIENT_SECRET.test(secret)) {\n throw new VinaverseClientError(\n 'invalid_secret',\n 'Expected a session client secret (vv_cs_…).',\n );\n }\n return secret;\n}\n","// The SSE fallback (createTurnSse, createCardActionSse): one POST per turn, whose response streams that turn's\n// ServerEvents. Each SSE event's `event:` is a ServerEvent `type` and its `data:` the event JSON.\n\nimport type { Frame } from './engine.js';\nimport { VinaverseClientError } from './errors.js';\n\n/** The largest SSE event read: a ServerEvent is far smaller; more means the stream is not what it should be. */\nconst MAX_EVENT_CHARS = 1024 * 1024;\n\nexport type FetchLike = (input: string, init: RequestInit) => Promise<Response>;\n\n/** One SSE request: where and with which secret, and the `fetch` to use. */\nexport interface SseTarget {\n /** The session's `turns_url` (`…/v1/sessions/{session_id}/turns`). */\n readonly turnsUrl: string;\n readonly secret: string;\n readonly fetch?: FetchLike;\n readonly signal?: AbortSignal;\n}\n\n/** Run one turn from a typed message (`createTurnSse`), yielding its events as they arrive. */\nexport function turnSse(\n target: SseTarget,\n input: { text: string; client_event_id?: string },\n): AsyncGenerator<Frame> {\n return post(target, target.turnsUrl, input);\n}\n\n/** Send a card action, such as a proposal outcome, and stream the resulting turn (`createCardActionSse`). */\nexport function cardActionSse(\n target: SseTarget,\n turnId: string,\n input: { card_id: string; action: string; client_event_id?: string },\n): AsyncGenerator<Frame> {\n return post(\n target,\n `${target.turnsUrl.replace(/\\/+$/, '')}/${encodeURIComponent(turnId)}/actions`,\n input,\n );\n}\n\nasync function* post(\n target: SseTarget,\n url: string,\n body: unknown,\n): AsyncGenerator<Frame> {\n const doFetch = target.fetch ?? globalThis.fetch;\n const response = await doFetch(url, {\n method: 'POST',\n headers: {\n authorization: `Bearer ${target.secret}`,\n 'content-type': 'application/json',\n accept: 'text/event-stream',\n },\n body: JSON.stringify(body),\n ...(target.signal ? { signal: target.signal } : {}),\n });\n if (!response.ok) {\n throw new VinaverseClientError(\n 'http_error',\n `The turn request failed with HTTP ${response.status}.`,\n response.status,\n );\n }\n // React Native's fetch has no streaming body: the events then arrive together, when the turn ends.\n const chunks = response.body\n ? decode(response.body)\n : once(await response.text());\n yield* sseFrames(chunks);\n}\n\n/** Frames from an SSE text stream: blank-line separated events, `data:` lines joined; comments and non-JSON skipped. */\nexport async function* sseFrames(\n chunks: AsyncIterable<string>,\n): AsyncGenerator<Frame> {\n let buffer = '';\n for await (const chunk of chunks) {\n buffer += chunk;\n if (buffer.length > MAX_EVENT_CHARS && boundary(buffer) === null) {\n throw new VinaverseClientError(\n 'http_error',\n 'An SSE event is larger than 1 MiB.',\n );\n }\n let end = boundary(buffer);\n while (end !== null) {\n const frame = parseEvent(buffer.slice(0, end.at));\n buffer = buffer.slice(end.at + end.length);\n if (frame) yield frame;\n end = boundary(buffer);\n }\n }\n const last = parseEvent(buffer);\n if (last) yield last;\n}\n\nfunction boundary(buffer: string): { at: number; length: number } | null {\n const match = /\\r?\\n\\r?\\n|\\r\\r/.exec(buffer);\n return match ? { at: match.index, length: match[0].length } : null;\n}\n\nfunction parseEvent(block: string): Frame | null {\n let type: string | undefined;\n const data: string[] = [];\n for (const line of block.split(/\\r?\\n|\\r/)) {\n if (line === '' || line.startsWith(':')) continue;\n const colon = line.indexOf(':');\n const field = colon === -1 ? line : line.slice(0, colon);\n let value = colon === -1 ? '' : line.slice(colon + 1);\n if (value.startsWith(' ')) value = value.slice(1);\n if (field === 'event') type = value;\n else if (field === 'data') data.push(value);\n }\n if (data.length === 0) return null;\n let parsed: unknown;\n try {\n parsed = JSON.parse(data.join('\\n'));\n } catch {\n return null;\n }\n if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed))\n return null;\n const frame = parsed as Record<string, unknown>;\n const kind = typeof frame.type === 'string' ? frame.type : type;\n return kind === undefined ? null : ({ ...frame, type: kind } as Frame);\n}\n\nasync function* decode(\n body: ReadableStream<Uint8Array>,\n): AsyncGenerator<string> {\n const reader = body.getReader();\n const decoder = new TextDecoder();\n try {\n for (;;) {\n const { done, value } = await reader.read();\n if (done) break;\n yield decoder.decode(value, { stream: true });\n }\n const rest = decoder.decode();\n if (rest) yield rest;\n } finally {\n reader.releaseLock();\n }\n}\n\nasync function* once(text: string): AsyncGenerator<string> {\n yield text;\n}\n","// The realtime session for apps: one conversation with an agent over the WebSocket (docs/realtime-protocol.md), with the\n// SSE turns as the fallback. It authenticates with the session's client secret only, reconnects and resumes from\n// `session.ready`, resends what was never acknowledged under the same `client_event_id`, retries what was refused\n// for now, and holds the conversation's state in a ConversationEngine. Headless: an app draws from `state`.\nimport {\n ConversationEngine,\n type ConversationState,\n type Frame,\n} from './engine.js';\nimport { VinaverseClientError } from './errors.js';\nimport type {\n AnswerInput,\n ClientEvent,\n ClientSecret,\n ProposalOutcome,\n ServerEvent,\n SessionInfo,\n} from './events.js';\nimport { clientSecret } from './secret.js';\nimport { cardActionSse, type FetchLike, turnSse } from './sse.js';\n\n/** The part of a WebSocket the session uses: the browser, React Native and Node 22+ ones all fit. */\nexport interface WebSocketLike {\n readonly readyState: number;\n send(data: string): void;\n close(code?: number, reason?: string): void;\n onopen: ((event: unknown) => void) | null;\n onmessage: ((event: { data: unknown }) => void) | null;\n onclose: ((event: { code: number; reason?: string }) => void) | null;\n onerror: ((event: unknown) => void) | null;\n}\n\n/**\n * Opens a WebSocket. `headers` is set only with `auth: 'header'`. The default factory passes them as React Native's\n * WebSocket takes them (its third argument) or, on Node 22+, as its WebSocket does (`{ protocols, headers }`); a\n * browser's WebSocket cannot send headers, so browsers use the subprotocol.\n */\nexport type WebSocketFactory = (\n url: string,\n protocols: string[],\n headers?: Record<string, string>,\n) => WebSocketLike;\n\n/** How the client secret reaches the server (§1); the secret never goes in the URL. */\nexport type AuthMode = 'header' | 'subprotocol' | 'first_frame';\n\nexport type SessionStatus =\n /** Opening a connection, or waiting for `session.ready`. */\n | 'connecting'\n /** `session.ready` arrived: events flow. */\n | 'ready'\n /** Waiting to reconnect after the connection dropped. */\n | 'reconnecting'\n /** Disconnected; connects again on the next send or `connect()`. */\n | 'idle'\n /** Running turns over SSE, because the WebSocket could not be opened (twice); `connect()` tries it again. */\n | 'sse'\n /**\n * The session ended. `state.reconnect` says what next: `new_session_on_next_action` after it ended idle, expired\n * or at its limit (have your backend create a new session for the conversation on the person's next action, then\n * `resume()` it; what they send meanwhile is held and resent there), or `user_action_only` (the conversation\n * continued elsewhere, or the session was revoked: resume only when the person asks).\n */\n | 'ended'\n /** The client secret was refused (4401) and no fresh one could be had. */\n | 'unauthorized'\n /** Closed by the app. */\n | 'closed';\n\nexport interface SessionOptions {\n /** The session the tenant's backend created: its `id`, `realtime_url`, `turns_url` and `client_secret`. */\n readonly session: SessionInfo;\n /**\n * A fresh client secret for the session named, from the tenant's backend (refreshClientSecret is a service-key\n * call), when the server refuses the current one (4401): for example after the first connection's window (two\n * minutes from issue on the current gateway) passed. It is asked for the session in use; an answer that arrives\n * after `resume()` moved to another session, or after `close()`, is dropped. Without it, a refused secret ends in\n * `unauthorized`.\n */\n readonly refreshSecret?: (\n sessionId: string,\n ) => Promise<ClientSecret | string>;\n /**\n * Default `subprotocol` (`vinaverse.v1, bearer.<secret>`). `header` where the WebSocket takes headers: React\n * Native and Node 22+ with the default factory, or your own `webSocket`.\n */\n readonly auth?: AuthMode;\n /** Default: the global WebSocket. */\n readonly webSocket?: WebSocketFactory;\n /** Default: the global fetch. Used by the SSE fallback. */\n readonly fetch?: FetchLike;\n /** Fall back to SSE turns when the WebSocket cannot be opened. Default true. */\n readonly sseFallback?: boolean;\n /** Delays before reconnecting after a drop, in ms; the last one repeats. Default 1 s doubling to 30 s. */\n readonly reconnectDelays?: readonly number[];\n /** Attempts to reconnect before going `idle`; they count again once a connection stayed up 30 s. Default 8. */\n readonly maxReconnects?: number;\n /** Delays before resending an input refused with `screen_unavailable`, in ms. Default 2 s, 4 s, 8 s. */\n readonly screenRetryDelays?: readonly number[];\n /** The `ping` interval while in the foreground, in ms. Default 25 s. */\n readonly pingInterval?: number;\n /** New `client_event_id`s. Default: random, `ce_` and 22 characters. */\n readonly createId?: () => string;\n /** An engine to continue, for example one an app kept across a restart. */\n readonly engine?: ConversationEngine;\n}\n\nexport interface SessionEvents {\n /**\n * Every event the server sends, `message.delta` included. A type this client does not know arrives too (§5), so a\n * `switch` on `type` keeps a default branch.\n */\n event: ServerEvent;\n /** The conversation's state changed. */\n state: ConversationState;\n status: SessionStatus;\n /**\n * Something failed that no call returned: an input that could not be delivered (it is also shown as not sent in\n * the state), an SSE turn, or getting a fresh secret.\n */\n error: VinaverseClientError;\n}\n\ntype Listener<T> = (value: T) => void;\n\nconst OPEN = 1;\nconst SUBPROTOCOL = 'vinaverse.v1';\nconst DEFAULT_RECONNECT = [1000, 2000, 4000, 8000, 16000, 30000];\nconst DEFAULT_SCREEN_RETRY = [2000, 4000, 8000];\nconst NO_RECONNECT = new Set([4403, 4409]);\n/** Failed first connections before falling back to SSE. */\nconst FALLBACK_AFTER = 2;\n/** A connection up this long gives the reconnect budget back. */\nconst STABLE_MS = 30_000;\n\n/** Why an SSE request was stopped. */\ntype Stop = 'close' | 'cancel';\n\n/** An SSE request in flight: the input it delivers, and why it was stopped (tracked here, not in the signal). */\ninterface Stream {\n readonly id: string | undefined;\n stop?: Stop;\n}\n\n// TypeScript `private` rather than `#` fields: the package ships ES2022 as is, and Hermes (React Native) has no\n// `#` private fields.\nexport class VinaverseSession {\n readonly engine: ConversationEngine;\n private info: SessionInfo;\n private secret: string;\n private readonly options: SessionOptions;\n private socket: WebSocketLike | null = null;\n /** The engine's name for the connection in `socket`, once it opened. */\n private opened: string | null = null;\n private connection = 0;\n private ready = false;\n private current: SessionStatus = 'idle';\n private everOpened = false;\n private firstFailures = 0;\n private attempts = 0;\n /** The reason of the `session.closed` that preceded the close, on the current connection. */\n private closeReason: string | null = null;\n private stableTimer: ReturnType<typeof setTimeout> | undefined;\n /** SSE requests in flight. */\n private readonly streams = new Map<AbortController, Stream>();\n private reconnectTimer: ReturnType<typeof setTimeout> | undefined;\n private pingTimer: ReturnType<typeof setInterval> | undefined;\n private foreground = true;\n private refreshed = false;\n /** client_event_id → why it waits: after the turn, or after a backoff. */\n private readonly waiting = new Map<string, 'turn' | 'screen'>();\n /** client_event_id → the session that refused it for its turn limit: resent only on another session. */\n private readonly heldForSession = new Map<string, string>();\n private readonly screenTries = new Map<string, number>();\n private readonly screenTimers = new Map<\n string,\n ReturnType<typeof setTimeout>\n >();\n private readonly listeners: {\n [K in keyof SessionEvents]: Set<Listener<SessionEvents[K]>>;\n } = {\n event: new Set(),\n state: new Set(),\n status: new Set(),\n error: new Set(),\n };\n\n constructor(options: SessionOptions) {\n this.options = options;\n this.info = options.session;\n this.secret = clientSecret(options.session.client_secret);\n this.engine = options.engine ?? new ConversationEngine();\n this.named(options.session);\n }\n\n /** The engine names the session, and keeps the conversation it already knew when this one does not say. */\n private named(session: SessionInfo): void {\n this.engine.sessionCreated(\n session.id,\n session.conversation_id ?? this.engine.state().conversationId,\n );\n }\n\n get status(): SessionStatus {\n return this.current;\n }\n\n get state(): ConversationState {\n return this.engine.state();\n }\n\n on<K extends keyof SessionEvents>(\n name: K,\n listener: Listener<SessionEvents[K]>,\n ): () => void {\n this.listeners[name].add(listener);\n return () => this.listeners[name].delete(listener);\n }\n\n // ------------------------------------------------------------ connecting\n\n /**\n * Connect, or reconnect: the user's own action, so it also resumes after the conversation continued elsewhere\n * or the secret was refused.\n */\n connect(): void {\n if (this.current === 'closed') throw ended();\n if (this.engine.state().reconnect === 'new_session_on_next_action') {\n // The secret is spent: a connection with it would only be refused (and read as \"continued elsewhere\").\n throw new VinaverseClientError(\n 'needs_new_session',\n 'This session has ended; create a new session for the conversation and call resume() with it.',\n );\n }\n this.start();\n }\n\n private start(): void {\n this.cancelReconnect();\n this.attempts = 0;\n this.refreshed = false;\n this.open();\n }\n\n /**\n * Continue the conversation on a new session the tenant's backend created for it (by `conversation_key` or\n * `conversation_id`): its `session.ready` brings the transcript and pending cards, and what was never\n * acknowledged is resent there. A user action, like `connect()`.\n */\n resume(session: SessionInfo): void {\n const secret = clientSecret(session.client_secret);\n if (this.current === 'closed') throw ended();\n this.info = session;\n this.secret = secret;\n this.named(session);\n this.drop(1000);\n this.start();\n }\n\n /** Close for good: the connection, any SSE turn still streaming, and every timer. */\n close(): void {\n this.cancelReconnect();\n this.drop(1000);\n this.stopSse('close');\n for (const timer of this.screenTimers.values()) clearTimeout(timer);\n this.screenTimers.clear();\n this.setStatus('closed');\n }\n\n /** Ping only while the app is in the foreground (every 25 s); in the background the connection may idle out. */\n setForeground(foreground: boolean): void {\n this.foreground = foreground;\n if (foreground && this.ready) this.startPing();\n else this.stopPing();\n }\n\n private open(): void {\n this.drop(1000);\n const factory = this.options.webSocket ?? defaultWebSocket();\n if (!factory) {\n this.fallBack();\n return;\n }\n const auth = this.options.auth ?? 'subprotocol';\n const protocols =\n auth === 'subprotocol'\n ? [SUBPROTOCOL, `bearer.${this.secret}`]\n : [SUBPROTOCOL];\n const headers =\n auth === 'header'\n ? { authorization: `Bearer ${this.secret}` }\n : undefined;\n const name = `c${++this.connection}`;\n this.closeReason = null;\n let socket: WebSocketLike;\n try {\n socket = factory(this.info.realtime_url, protocols, headers);\n } catch {\n this.fallBack();\n return;\n }\n this.socket = socket;\n this.ready = false;\n this.setStatus(this.attempts > 0 ? 'reconnecting' : 'connecting');\n socket.onopen = () => {\n if (this.socket !== socket) return;\n this.opened = name;\n this.everOpened = true;\n this.engine.connected(name);\n this.emitState();\n if (auth === 'first_frame')\n socket.send(\n JSON.stringify({ type: 'session.auth', client_secret: this.secret }),\n );\n };\n socket.onmessage = (event) => {\n if (this.socket === socket) this.frame(event.data);\n };\n socket.onerror = () => {};\n socket.onclose = (event) => {\n if (this.socket !== socket) return;\n const opened = this.opened !== null;\n this.forget(event.code);\n this.afterClose(event.code, opened);\n };\n }\n\n private afterClose(code: number, opened: boolean): void {\n if (this.current === 'closed') return;\n if (this.engine.state().reconnect !== 'allowed' || NO_RECONNECT.has(code)) {\n this.setStatus('ended');\n return;\n }\n if (code === 4401) {\n this.refresh();\n return;\n }\n if (!opened && !this.everOpened) {\n // Never connected yet: try once more before running turns over SSE.\n this.firstFailures++;\n if (\n this.firstFailures >= FALLBACK_AFTER &&\n this.options.sseFallback !== false\n ) {\n this.fallBack();\n return;\n }\n this.scheduleReconnect();\n return;\n }\n // server_restart is reserved (the gateway does not send it today): the same session again, with backoff.\n if (this.closeReason === 'server_restart') {\n this.scheduleReconnect();\n return;\n }\n if (code === 1000) {\n this.setStatus('idle'); // reconnect on the next send\n return;\n }\n this.scheduleReconnect();\n }\n\n /** After a 4401: one fresh secret for the session in use, unless it moved on or was closed meanwhile. */\n private refresh(): void {\n const refreshSecret = this.options.refreshSecret;\n if (!refreshSecret || this.refreshed) {\n this.setStatus('unauthorized');\n return;\n }\n this.refreshed = true;\n const sessionId = this.info.id;\n const current = () =>\n this.current !== 'closed' && this.info.id === sessionId;\n refreshSecret(sessionId)\n .then((fresh) => {\n if (!current()) return;\n this.secret = clientSecret(fresh);\n this.open();\n })\n .catch((error: unknown) => {\n if (!current()) return;\n this.setStatus('unauthorized');\n this.emit('error', asClientError(error, 'invalid_secret'));\n });\n }\n\n private scheduleReconnect(): void {\n const max = this.options.maxReconnects ?? 8;\n if (this.attempts >= max) {\n this.setStatus('idle');\n return;\n }\n const delays = this.options.reconnectDelays ?? DEFAULT_RECONNECT;\n const delay = delays[Math.min(this.attempts, delays.length - 1)] ?? 0;\n this.attempts++;\n this.setStatus('reconnecting');\n this.reconnectTimer = setTimeout(() => {\n this.reconnectTimer = undefined;\n this.open();\n }, delay);\n }\n\n private cancelReconnect(): void {\n if (this.reconnectTimer !== undefined) clearTimeout(this.reconnectTimer);\n this.reconnectTimer = undefined;\n }\n\n private fallBack(): void {\n this.socket = null;\n if (this.options.sseFallback === false) {\n this.setStatus('idle');\n return;\n }\n this.setStatus('sse');\n // What was held for the WebSocket goes over SSE now (an answer cannot: it is shown as not sent); what is\n // already streaming over SSE is not sent twice.\n for (const event of this.engine.state().unacknowledged) this.overSse(event);\n // Inputs waiting for a turn to end: with no SSE turn running, none will end to resend them.\n if (this.streams.size === 0) this.resendWaiting('turn');\n }\n\n /** Close the current connection, if any, without reacting to its close event. */\n private drop(code: number): void {\n const socket = this.socket;\n this.forget(code);\n if (socket && socket.readyState <= OPEN) {\n try {\n socket.close(code);\n } catch {\n // already closing\n }\n }\n }\n\n private forget(code: number): void {\n this.socket = null;\n this.ready = false;\n this.stopPing();\n if (this.stableTimer !== undefined) clearTimeout(this.stableTimer);\n this.stableTimer = undefined;\n if (this.opened !== null) {\n this.engine.closed(this.opened, code);\n this.opened = null;\n this.emitState();\n }\n }\n\n // ------------------------------------------------------------ receiving\n\n private frame(data: unknown): void {\n if (typeof data !== 'string') return;\n let parsed: unknown;\n try {\n parsed = JSON.parse(data);\n } catch {\n return;\n }\n if (\n typeof parsed !== 'object' ||\n parsed === null ||\n typeof (parsed as Frame).type !== 'string'\n )\n return;\n this.receive(parsed as Frame);\n }\n\n private receive(event: Frame): void {\n if (this.current === 'closed') return;\n this.engine.received(event);\n this.emit('event', event as unknown as ServerEvent);\n const id =\n typeof event.client_event_id === 'string'\n ? event.client_event_id\n : undefined;\n switch (event.type) {\n case 'session.ready':\n this.ready = true;\n this.refreshed = false;\n this.firstFailures = 0;\n this.stableTimer = setTimeout(() => {\n this.stableTimer = undefined;\n this.attempts = 0;\n }, STABLE_MS);\n this.setStatus('ready');\n if (this.foreground) this.startPing();\n this.resendUnacknowledged();\n this.resendWaiting('turn');\n this.resendHeldForSession();\n break;\n case 'turn.completed':\n case 'turn.failed':\n // A tap or an answer refused with turn_in_progress during a takeover waits for no turn: the hand-back frees it.\n case 'takeover.ended':\n this.resendWaiting('turn');\n break;\n case 'turn.started':\n case 'ui.answer.recorded':\n case 'ui.answer.rejected':\n if (id !== undefined) this.screenTries.delete(id);\n break;\n case 'input.rejected':\n case 'error':\n this.refusedForNow(event);\n break;\n case 'session.closed':\n // Every reason but server_restart (reserved) ends the session here; the engine says what comes next.\n this.closeReason = typeof event.reason === 'string' ? event.reason : '';\n if (this.engine.state().reconnect !== 'allowed')\n this.setStatus('ended');\n break;\n default:\n break;\n }\n this.emitState();\n }\n\n private refusedForNow(event: Frame): void {\n const id =\n typeof event.client_event_id === 'string'\n ? event.client_event_id\n : undefined;\n if (id === undefined) return;\n if (event.code === 'limit_reached') {\n // No turns left in this session: a text or an answer is held for the next one (resume()); an action is\n // dropped. The session has ended for new input either way.\n this.heldForSession.set(id, this.info.id); // an action is dropped: resending it later finds nothing\n this.setStatus('ended');\n return;\n }\n if (!this.engine.state().resend.includes(id)) return;\n if (event.code === 'turn_in_progress') {\n this.waiting.set(id, 'turn');\n return;\n }\n // screen_unavailable: a short backoff, then the same input under the same id; after the last try, not sent.\n const tries = this.screenTries.get(id) ?? 0;\n const delays = this.options.screenRetryDelays ?? DEFAULT_SCREEN_RETRY;\n if (tries >= delays.length) {\n this.screenTries.delete(id);\n this.waiting.delete(id);\n this.engine.giveUp(id, 'screen_unavailable');\n return;\n }\n this.screenTries.set(id, tries + 1);\n this.waiting.set(id, 'screen');\n this.screenTimers.set(\n id,\n setTimeout(() => {\n this.screenTimers.delete(id);\n if (this.waiting.get(id) === 'screen') this.resend(id);\n }, delays[tries]),\n );\n }\n\n private resendUnacknowledged(): void {\n for (const event of this.engine.state().unacknowledged)\n this.transmit(event);\n }\n\n /** What a turn limit held, on a session other than the one that refused it. */\n private resendHeldForSession(): void {\n for (const [id, refusedIn] of [...this.heldForSession]) {\n if (refusedIn === this.info.id) continue;\n this.heldForSession.delete(id);\n this.resend(id);\n }\n }\n\n private resendWaiting(reason: 'turn'): void {\n for (const [id, why] of [...this.waiting])\n if (why === reason) this.resend(id);\n }\n\n private resend(id: string): void {\n this.waiting.delete(id);\n const event = this.engine.input(id);\n if (!event) return;\n if (this.live() || this.awaitingNewSession()) this.deliver(event);\n else this.hold(event);\n }\n\n /** Keep an input for a later session: unacknowledged, so the next `session.ready` (after resume()) sends it. */\n private hold(event: Frame): void {\n if (this.current === 'closed') return;\n this.engine.sent(event);\n this.emitState();\n }\n\n /** The session ended: retries waiting on a timer would go nowhere, so their inputs are held for the next session. */\n private holdRetries(): void {\n for (const [id, timer] of [...this.screenTimers]) {\n clearTimeout(timer);\n this.screenTimers.delete(id);\n this.waiting.delete(id);\n const event = this.engine.input(id);\n if (event) this.hold(event);\n }\n }\n\n // ------------------------------------------------------------ sending\n\n /** Send a typed message; returns its `client_event_id`. Over SSE it runs the turn there. */\n sendText(text: string): string {\n const id = this.newId();\n this.deliver({ type: 'input.text', text, client_event_id: id });\n return id;\n }\n\n /** Answer a question card (or a `rate_each` row, by the row's `question_id`); returns the `client_event_id`. */\n answer(cardId: string, questionId: string, answer: AnswerInput): string {\n if (this.current === 'sse') {\n throw new VinaverseClientError(\n 'needs_websocket',\n 'Question cards are answered over the WebSocket.',\n );\n }\n const id = this.newId();\n this.deliver({\n type: 'ui.answer',\n client_event_id: id,\n card_id: cardId,\n question_id: questionId,\n answer,\n });\n return id;\n }\n\n /**\n * Report a proposal's outcome after the tenant's backend answered (§6): `confirmed`, `declined`, `failed` or\n * `expired`. The first outcome per card is final. Returns the `client_event_id`.\n */\n reportOutcome(cardId: string, outcome: ProposalOutcome): string {\n return this.action(cardId, outcome);\n }\n\n /** A card action (`ui.action`), named by the card's `id`; the card's turn is taken from the state. */\n action(cardId: string, action: string): string {\n const turnId = this.engine\n .state()\n .cards.find((c) => c.id === cardId)?.turnId;\n if (turnId === undefined)\n throw new RangeError(`No turn is known for card ${cardId}.`);\n const id = this.newId();\n this.deliver({\n type: 'ui.action',\n client_event_id: id,\n turn_id: turnId,\n card_id: cardId,\n action,\n });\n return id;\n }\n\n /** Stop the turn in progress: `input.cancel` on the WebSocket; over SSE, the turn's request is stopped. */\n cancel(turnId: string): void {\n if (this.current === 'sse') {\n this.stopSse('cancel');\n this.engine.turnEnded();\n this.emitState();\n return;\n }\n this.transmit({ type: 'input.cancel', turn_id: turnId });\n }\n\n /** Ended idle: inputs are held for the new session that `resume()` brings. */\n private awaitingNewSession(): boolean {\n return (\n this.current === 'ended' &&\n this.engine.state().reconnect === 'new_session_on_next_action'\n );\n }\n\n private live(): boolean {\n return (\n this.current !== 'closed' &&\n this.current !== 'ended' &&\n this.current !== 'unauthorized'\n );\n }\n\n /**\n * Every input goes through here: recorded as sent (unacknowledged until the server answers it), then over SSE,\n * or on the WebSocket when the session is ready, or held and resent once `session.ready` arrives.\n */\n private deliver(event: Frame): void {\n if (!this.live() && !this.awaitingNewSession()) throw ended();\n this.engine.sent(event);\n this.emitState();\n if (this.current === 'sse') this.overSse(event);\n else if (this.ready) this.transmit(event);\n else if (this.current === 'idle') this.connect();\n }\n\n private transmit(event: Frame | ClientEvent): void {\n const socket = this.socket;\n if (!socket || socket.readyState !== OPEN) return;\n socket.send(JSON.stringify(event));\n }\n\n /** One input over SSE: a typed message or a card action; an answer cannot go, and is shown as not sent. */\n private overSse(event: Frame): void {\n const id =\n typeof event.client_event_id === 'string'\n ? event.client_event_id\n : undefined;\n const notSent = (error: VinaverseClientError) => {\n if (id !== undefined) this.engine.giveUp(id, error.code);\n this.emitState();\n this.emit('error', error);\n };\n if (id !== undefined && this.inFlight(id)) return;\n const controller = new AbortController();\n const target = { ...this.sseTarget(), signal: controller.signal };\n let frames: AsyncGenerator<Frame>;\n if (event.type === 'input.text') {\n frames = turnSse(target, {\n text: String(event.text),\n ...(id !== undefined ? { client_event_id: id } : {}),\n });\n } else if (event.type === 'ui.action') {\n frames = cardActionSse(target, String(event.turn_id), {\n card_id: String(event.card_id),\n action: String(event.action),\n ...(id !== undefined ? { client_event_id: id } : {}),\n });\n } else {\n notSent(\n new VinaverseClientError(\n 'needs_websocket',\n 'Question cards are answered over the WebSocket.',\n ),\n );\n return;\n }\n const stream: Stream = { id };\n this.streams.set(controller, stream);\n void (async () => {\n try {\n for await (const frame of frames) {\n if (controller.signal.aborted) break;\n this.receive(frame);\n }\n } catch (error) {\n if (!controller.signal.aborted) {\n notSent(asClientError(error, 'http_error'));\n return;\n }\n } finally {\n this.streams.delete(controller);\n }\n if (controller.signal.aborted) {\n if (stream.stop === 'cancel' && id !== undefined) {\n this.engine.giveUp(id, 'cancelled'); // a no-op once its turn started\n this.emitState();\n }\n return;\n }\n // The stream ended without answering the input (no turn, no refusal): it was not sent.\n if (id !== undefined && this.isUnacknowledged(id)) {\n notSent(\n new VinaverseClientError(\n 'http_error',\n 'The turn ended without taking the input.',\n ),\n );\n }\n })();\n }\n\n private isUnacknowledged(id: string): boolean {\n return this.engine\n .state()\n .unacknowledged.some((e) => e.client_event_id === id);\n }\n\n private inFlight(id: string): boolean {\n for (const stream of this.streams.values())\n if (stream.id === id) return true;\n return false;\n }\n\n private stopSse(why: Stop): void {\n for (const [controller, stream] of [...this.streams]) {\n stream.stop = why;\n controller.abort();\n }\n }\n\n private sseTarget() {\n return {\n turnsUrl: this.info.turns_url,\n secret: this.secret,\n ...(this.options.fetch ? { fetch: this.options.fetch } : {}),\n };\n }\n\n private newId(): string {\n return (this.options.createId ?? randomId)();\n }\n\n // ------------------------------------------------------------ pings and listeners\n\n private startPing(): void {\n this.stopPing();\n this.pingTimer = setInterval(\n () => this.transmit({ type: 'ping' }),\n this.options.pingInterval ?? 25_000,\n );\n }\n\n private stopPing(): void {\n if (this.pingTimer !== undefined) clearInterval(this.pingTimer);\n this.pingTimer = undefined;\n }\n\n private setStatus(status: SessionStatus): void {\n if (this.current === status) return;\n this.current = status;\n if (status === 'ended') this.holdRetries();\n this.emit('status', status);\n }\n\n private emitState(): void {\n if (this.listeners.state.size) this.emit('state', this.engine.state());\n }\n\n private emit<K extends keyof SessionEvents>(\n name: K,\n value: SessionEvents[K],\n ): void {\n for (const listener of this.listeners[name]) listener(value);\n }\n}\n\nfunction ended(): VinaverseClientError {\n return new VinaverseClientError(\n 'session_ended',\n 'The session has ended; resume it on a new session.',\n );\n}\n\nfunction asClientError(\n error: unknown,\n code: VinaverseClientError['code'],\n): VinaverseClientError {\n if (error instanceof VinaverseClientError) return error;\n return new VinaverseClientError(\n code,\n error instanceof Error ? error.message : String(error),\n );\n}\n\nfunction defaultWebSocket(): WebSocketFactory | null {\n const Ctor = (\n globalThis as { WebSocket?: new (...args: unknown[]) => WebSocketLike }\n ).WebSocket;\n if (!Ctor) return null;\n // Node itself, not a browser that also has `process` (an Electron renderer): its WebSocket cannot take headers.\n const scope = globalThis as {\n process?: { versions?: { node?: unknown } };\n document?: unknown;\n };\n const node =\n typeof scope.process?.versions?.node === 'string' &&\n scope.document === undefined;\n return (url, protocols, headers) => {\n if (!headers) return new Ctor(url, protocols);\n // Node's WebSocket (undici) takes headers in its init; React Native's in its third argument.\n return node\n ? new Ctor(url, { protocols, headers })\n : new Ctor(url, protocols, { headers });\n };\n}\n\nconst ALPHABET =\n '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';\n\n/** A `client_event_id`: not a secret, only unique in its conversation; Math.random where no crypto exists (Hermes). */\nexport function randomId(): string {\n const bytes = new Uint8Array(22);\n const crypto = (\n globalThis as {\n crypto?: { getRandomValues?: (a: Uint8Array) => Uint8Array };\n }\n ).crypto;\n if (crypto?.getRandomValues) crypto.getRandomValues(bytes);\n else\n for (let i = 0; i < bytes.length; i++)\n bytes[i] = Math.floor(Math.random() * 256);\n let id = 'ce_';\n for (const byte of bytes) id += ALPHABET[byte % ALPHABET.length];\n return id;\n}\n","// The timeline: the engine's messages and cards, the store's pending texts and system rows, in one list sorted by\n// arrival, each item reused from the previous list when nothing about it changed (structural sharing).\nimport type { ConversationState, HeldCard, Message } from '../engine.js';\nimport { isKnownCard } from '../events.js';\nimport type {\n CardItem,\n MessageItem,\n MessageState,\n SystemItem,\n TimelineItem,\n} from './view.js';\n\n/** A text the person sent through the store, kept until the engine holds it as a message or forgets it. */\nexport interface SentText {\n readonly text: string;\n /** Where it sorts until it becomes a message: just after what was drawn when it was sent. */\n readonly order: number;\n}\n\nexport interface TimelineInput {\n readonly state: ConversationState;\n /** Items restored from persistence, drawn first. */\n readonly history: readonly TimelineItem[];\n /** By `client_event_id`, in the order sent. */\n readonly sent: ReadonlyMap<string, SentText>;\n /** Texts not yet given to a session (no session yet): drawn as sending. */\n readonly early: ReadonlySet<string>;\n /** Ids the person sent again (`retry`): their old \"not sent\" item is gone. */\n readonly retried: ReadonlySet<string>;\n readonly busy: ReadonlySet<string>;\n /**\n * Where cards sit after a resumed session's transcript replaced the messages: by card key, an order just after the\n * message they followed, so a card the session draws again (a pending proposal) stays in its place.\n */\n readonly cardOrder?: ReadonlyMap<string, number>;\n /** Cards a transcript (text only) dropped from the engine, kept where they were. */\n readonly kept?: readonly {\n readonly item: CardItem;\n readonly order: number;\n }[];\n /** Cards an earlier session drew that the current one does not hold again: drawn restored, taking no tap. */\n readonly inert?: ReadonlySet<string>;\n /** A resumed session brought its own transcript: the history kept on the device gives way to it. */\n readonly transcriptSeen?: boolean;\n /** Proposals whose tenant decision threw. */\n readonly decisionErrors?: ReadonlySet<string>;\n readonly system: readonly {\n readonly item: SystemItem;\n readonly order: number;\n }[];\n}\n\n/** The highest arrival number drawn, so something added now sorts after it. */\nexport function lastOrder(state: ConversationState): number {\n let last = -1;\n for (const m of state.messages) last = Math.max(last, m.seq);\n for (const c of state.cards) last = Math.max(last, c.seq);\n if (state.streaming) last = Math.max(last, state.streaming.seq);\n return last;\n}\n\n/** The person's text's state, or null when it is no longer pending (a message now, or settled with nothing to draw). */\nexport function pendingState(\n id: string,\n input: Pick<TimelineInput, 'state' | 'early' | 'retried'>,\n): Exclude<MessageState, 'sent' | 'delivered' | 'streaming'> | null {\n const { state } = input;\n if (input.retried.has(id)) return null;\n if (input.early.has(id)) return 'sending';\n if (state.messages.some((m) => m.key === id)) return null;\n const refused = state.refused[id];\n if (refused !== undefined) return refused === 'guardrail' ? null : 'not_sent';\n if (state.heldForNextSession.includes(id)) return 'held';\n if (\n state.resend.includes(id) ||\n state.held.includes(id) ||\n state.unacknowledged.some((f) => f.client_event_id === id)\n )\n return 'sending';\n return null; // a duplicate whose earlier turn stands, or forgotten\n}\n\nexport function buildTimeline(\n input: TimelineInput,\n previous: readonly TimelineItem[],\n): readonly TimelineItem[] {\n const before = new Map(previous.map((item) => [item.key, item]));\n const live: { item: TimelineItem; order: number }[] = [];\n const { state } = input;\n\n for (const m of state.messages)\n live.push({ item: messageItem(m), order: m.seq });\n if (state.streaming) {\n live.push({\n item: {\n type: 'message',\n key: `a:${state.streaming.turnId}`,\n role: 'agent',\n text: '',\n state: 'streaming',\n },\n order: state.streaming.seq,\n });\n }\n for (const card of state.cards) {\n if (!isKnownCard(card.card as { kind: string })) continue; // §5: skip a kind this client does not know\n live.push({\n item: {\n type: 'card',\n key: card.id,\n card,\n busy: !input.inert?.has(card.id) && input.busy.has(card.id),\n ...(input.inert?.has(card.id) ? { restored: true as const } : {}),\n ...(input.decisionErrors?.has(card.id)\n ? { decisionError: true as const }\n : {}),\n },\n order: input.cardOrder?.get(card.id) ?? card.seq,\n });\n }\n for (const { item, order } of input.system) live.push({ item, order });\n const held = new Set(state.cards.map((c) => c.id));\n for (const { item, order } of input.kept ?? [])\n if (!held.has(item.key)) live.push({ item, order });\n for (const [id, sent] of input.sent) {\n const pending = pendingState(id, input);\n if (pending === null) continue;\n const rejection = state.rejections[id];\n live.push({\n item: {\n type: 'message',\n key: id,\n role: 'person',\n text: sent.text,\n state: pending,\n ...(pending === 'not_sent'\n ? {\n rejection: rejection ?? {\n code: state.refused[id] ?? '',\n message: '',\n },\n }\n : {}),\n },\n order: sent.order,\n });\n }\n live.sort((a, b) => a.order - b.order); // stable: equal orders keep the order they were added in\n\n // History gives way to the conversation: an item the live session holds again (a restored card in pending_cards)\n // takes the history item's place, so it updates without moving; the whole of it gives way once a resumed session\n // brought its own transcript.\n const items = mergeByKey(\n input.transcriptSeen === true ? [] : input.history,\n live.map((l) => l.item),\n );\n\n let same = items.length === previous.length;\n const shared = items.map((item, i) => {\n const prev = before.get(item.key);\n const kept = prev !== undefined && equal(prev, item) ? prev : item;\n if (kept !== previous[i]) same = false;\n return kept;\n });\n return same ? previous : shared;\n}\n\n/**\n * History and the live conversation as one list, by key: a live item the history holds takes its place (it updates\n * without moving). One it does not hold, between two that it does, goes just after the live item before it (just\n * before the next one when none came before); after the last one the history holds, it goes at the end, after the\n * history.\n */\nexport function mergeByKey(\n history: readonly TimelineItem[],\n live: readonly TimelineItem[],\n): TimelineItem[] {\n if (!history.length) return [...live];\n const items = [...history];\n const at = (key: string) => items.findIndex((item) => item.key === key);\n let last = -1;\n live.forEach((item, i) => {\n const found = at(item.key);\n if (found >= 0) {\n items[found] = item;\n last = found;\n return;\n }\n const next = live\n .slice(i + 1)\n .map((l) => at(l.key))\n .find((p) => p >= 0);\n last = next === undefined ? items.length : last >= 0 ? last + 1 : next;\n items.splice(last, 0, item);\n });\n return items;\n}\n\nfunction messageItem(m: Message): MessageItem {\n const role = m.role === 'assistant' ? 'agent' : m.role;\n return {\n type: 'message',\n key: m.key,\n role,\n text: m.text,\n state: m.received ? 'delivered' : 'sent',\n ...(m.partial ? { partial: m.partial } : {}),\n ...(m.refusal ? { refusal: true as const } : {}),\n };\n}\n\nfunction equal(a: TimelineItem, b: TimelineItem): boolean {\n if (a.type !== b.type || a.key !== b.key) return false;\n if (a.type === 'message' && b.type === 'message')\n return (\n a.role === b.role &&\n a.text === b.text &&\n a.state === b.state &&\n a.partial === b.partial &&\n a.refusal === b.refusal &&\n a.rejection?.code === b.rejection?.code &&\n a.rejection?.message === b.rejection?.message\n );\n if (a.type === 'card' && b.type === 'card')\n return (\n a.busy === b.busy &&\n a.restored === b.restored &&\n a.decisionError === b.decisionError &&\n sameCard(a.card, b.card)\n );\n return a === b; // system items are made once and kept\n}\n\nfunction sameCard(a: HeldCard, b: HeldCard): boolean {\n return (\n a.card === b.card &&\n a.seq === b.seq &&\n a.turnId === b.turnId &&\n a.outcome === b.outcome &&\n a.locked.length === b.locked.length &&\n a.locked.every((q, i) => q === b.locked[i]) &&\n a.question?.state === b.question?.state &&\n JSON.stringify(a.question?.answer) === JSON.stringify(b.question?.answer) &&\n JSON.stringify(a.question?.row_answers) ===\n JSON.stringify(b.question?.row_answers)\n );\n}\n\n/** The parts of an item worth keeping across an app restart: what was on the server, never what was pending. */\nexport function persistable(item: TimelineItem): boolean {\n if (item.type === 'message')\n return item.state === 'sent' || item.state === 'delivered';\n return item.type === 'card';\n}\n","// The conversation store: one conversation with an agent, for any UI framework. It owns the session (and the next\n// one after a resume), turns the engine's state into a view a UI draws, and runs what the protocol asks of an app\n// on the person's actions: resume on the next action, hold what was typed early, decide proposals through the\n// tenant's handler, keep streamed text to one update per frame. No framework import: React, React Native and Angular\n// bind to `subscribe` and `getSnapshot`.\nimport {\n ConversationEngine,\n type ConversationState,\n transcriptHasIds,\n} from '../engine.js';\nimport { VinaverseClientError } from '../errors.js';\nimport type {\n AnswerInput,\n ClientSecret,\n ProposalOutcome,\n ServerEvent,\n SessionInfo,\n Welcome,\n} from '../events.js';\nimport {\n randomId,\n type SessionOptions,\n type SessionStatus,\n VinaverseSession,\n} from '../session.js';\nimport { isAllowedLink } from './links.js';\nimport {\n buildTimeline,\n lastOrder,\n persistable,\n type SentText,\n} from './timeline.js';\nimport type {\n CardItem,\n ConversationBanner,\n ConversationStatus,\n ConversationView,\n StreamingText,\n SystemItem,\n TimelineItem,\n} from './view.js';\n\n/** Why the store asks the tenant's backend for a session. */\nexport type SessionReason =\n /** The conversation opens (`start()`). */\n | 'open'\n /** The session ended (idle, expired, its turn limit) and the person acted again. */\n | 'resume'\n /** The conversation continued on another device, and the person chose to continue here. */\n | 'continue_here';\n\nexport interface SessionRequest {\n readonly reason: SessionReason;\n /** The conversation so far, when known: the backend names it (with its `conversation_key`) to resume it. */\n readonly conversationId: string | null;\n /** For `subject.locale` and `subject.timezone`, which the backend sets. */\n readonly locale?: string;\n readonly timeZone?: string;\n /**\n * Aborted when the answer is no longer wanted (the conversation was disposed or cleared, or a newer request took\n * its place): pass it to `fetch`, so a late answer never opens a socket after the person left.\n */\n readonly signal?: AbortSignal;\n}\n\n/** What `createSession` gave the tenant's backend, as it passes it on: the session, its agent and disclosure. */\nexport type ConversationSession = SessionInfo & {\n readonly agent?: {\n readonly display_name?: string;\n readonly avatar_url?: string;\n };\n readonly disclosure?: string;\n /**\n * When the session ends (`Session.expires_at`: the earliest of its own limit and the tenant's tool token). Past it,\n * the conversation goes on in a new session from `getSession`, never with a fresh secret for this one.\n */\n readonly expires_at?: string;\n /** v1-draft.20: the tenant's greeting and chips for the session's mode (`Session.welcome`); no model call. */\n readonly welcome?: Welcome;\n};\n\n/**\n * Runs a callback before the next frame; `requestAnimationFrame` where there is one. Every listener, of the view and\n * of the streaming text, is called from it, at most once per frame: a zone.js app re-enters its zone here once. A\n * test passes one that runs the callback at once.\n */\nexport interface FrameScheduler {\n request(callback: () => void): unknown;\n cancel(handle: unknown): void;\n}\n\n/** Where the drawn conversation is kept across app restarts (opt-in; prefer encrypted storage). */\nexport interface ConversationPersistence {\n getItem(key: string): string | null | Promise<string | null>;\n setItem(key: string, value: string): void | Promise<void>;\n removeItem(key: string): void | Promise<void>;\n}\n\nexport interface ConversationOptions {\n /**\n * A session from the tenant's backend, which creates it with its service key (the app never holds one). Asked once\n * per need: when the conversation opens, and on the person's action after a session ended.\n */\n readonly getSession: (\n request: SessionRequest,\n ) => Promise<ConversationSession>;\n /** A fresh client secret for a session (on 4401), from the tenant's backend. */\n readonly refreshSecret?: (\n sessionId: string,\n ) => Promise<ClientSecret | string>;\n readonly locale?: string;\n readonly timeZone?: string;\n /** The prefixes the tenant registered for card links (`checkLink`). */\n readonly deepLinkPrefixes?: readonly string[];\n /** Keep the drawn conversation across restarts (off unless given). */\n readonly persistence?: ConversationPersistence;\n /** Its key; one per signed-in person. Default `vinaverse.conversation`. */\n readonly persistenceKey?: string;\n /** Default: `requestAnimationFrame`, else a 16 ms timer, resolved when first used (never at import or creation). */\n readonly scheduler?: FrameScheduler;\n /** The transport's own options (`auth`, `webSocket`, `fetch`, delays…). */\n readonly transport?: Omit<\n SessionOptions,\n 'session' | 'refreshSecret' | 'engine' | 'createId'\n >;\n /** New `client_event_id`s. Default: random, `ce_` and 22 characters. */\n readonly createId?: () => string;\n /** Something failed that no call returned: getting a session, an input that could not be delivered. */\n readonly onError?: (error: unknown) => void;\n /**\n * Close the connection while the app is in the background, and open it again in the foreground (a backend that\n * mints a client secret per connection: with `refreshSecret`, a fresh one is asked for first). Default false: the\n * connection stays, with no pings, until the session idles out. Nothing typed or answered is lost either way.\n */\n readonly closeInBackground?: boolean;\n /**\n * The time a session's end (`expires_at`) is judged by. Default: the device's. Give the server's (a clock synced from\n * responses): a phone set late would reuse a dead session, set early drop a live one.\n */\n readonly clock?: { now(): number };\n}\n\n/** A text is at most 2000 code points (`TurnInput`). */\nexport const MAX_TEXT = 2000;\n/** Turns whose starting text the store remembers, for `retryTurn`. */\nconst TURN_INPUTS = 50;\n/** History kept across restarts: the newest items. */\nconst HISTORY = 100;\nconst PERSIST_DELAY = 500;\nconst PERSIST_VERSION = 1;\n\nconst NO_ITEMS: readonly TimelineItem[] = [];\nconst OUTCOMES: ReadonlySet<string> = new Set([\n 'confirmed',\n 'declined',\n 'failed',\n 'expired',\n]);\n\nexport class ConversationStore {\n private readonly options: ConversationOptions;\n private readonly engine = new ConversationEngine();\n private session: VinaverseSession | null = null;\n private info: ConversationSession | null = null;\n private getting: Promise<VinaverseSession | null> | null = null;\n private failed = false;\n private disposed = false;\n private online: boolean | null = null;\n private foreground = true;\n private lastStatus: SessionStatus = 'idle';\n private offlineAfterRetries = false;\n /** The id the next send gets, so a text typed before the session keeps its key. */\n private nextId: string | null = null;\n\n private readonly sent = new Map<string, SentText>();\n private readonly early = new Map<string, string>();\n private readonly retried = new Set<string>();\n private readonly busy = new Set<string>();\n /** Proposals whose tenant decision threw: shown as recoverable, the person may decide again. */\n private readonly decisionErrors = new Set<string>();\n private system: { item: SystemItem; order: number }[] = [];\n /** The person's text that started each recent turn, by `turn_id` (`turn.started` echoes its `client_event_id`). */\n private readonly turnInputs = new Map<string, string>();\n /** Numbers system rows that carry no id of their own. */\n private systemSeq = 0;\n private history: readonly TimelineItem[] = NO_ITEMS;\n private historyState: ConversationView['history'] = 'none';\n /** A resumed session.ready carried a transcript: the server's history replaced what the device kept. */\n private transcriptSeen = false;\n /** The session of the last session.ready: a card of another one takes no tap (§6). */\n private readySession: string | null = null;\n private cardOrder = new Map<string, number>();\n private kept: { item: CardItem; order: number }[] = [];\n /** Cards an earlier session drew, kept by a merged transcript: drawn as restored, taking no tap. */\n private readonly inert = new Set<string>();\n private locale: string | undefined;\n /** The request for a session in flight, to abort when it is no longer wanted. */\n private fetching: { abort(): void } | null = null;\n\n private view: ConversationView;\n private readonly listeners = new Set<() => void>();\n private streaming: StreamingText | null = null;\n private readonly streamListeners = new Set<() => void>();\n /** The frame that will notify, and what it will notify about. */\n private frame: unknown = undefined;\n private framePending = false;\n private viewDirty = false;\n private streamDirty = false;\n private persistTimer: ReturnType<typeof setTimeout> | undefined;\n private unsubscribe: (() => void)[] = [];\n\n constructor(options: ConversationOptions) {\n this.options = options;\n this.locale = options.locale;\n this.view = this.compute(null);\n this.restore();\n }\n\n // ------------------------------------------------------------ reading\n\n getSnapshot = (): ConversationView => this.view;\n\n subscribe = (listener: () => void): (() => void) => {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n };\n\n getStreaming = (): StreamingText | null => this.streaming;\n\n subscribeStreaming = (listener: () => void): (() => void) => {\n this.streamListeners.add(listener);\n return () => this.streamListeners.delete(listener);\n };\n\n /** Whether a card's link may be opened (the deep-link rule, against `deepLinkPrefixes`). */\n checkLink(link: string): boolean {\n return isAllowedLink(link, this.options.deepLinkPrefixes ?? []);\n }\n\n // ------------------------------------------------------------ the conversation's life\n\n /** Ask for a session and connect, early: a client secret must open its first connection within two minutes. */\n start(): void {\n this.live();\n if (this.session) {\n if (this.session.status === 'idle') this.session.connect();\n // Refused, and a new session refused as well: the person's \"Try again\" asks for another.\n else if (this.session.status === 'unauthorized')\n void this.resumeWith('resume');\n return;\n }\n void this.ensureSession('open');\n }\n\n /** Close for good. */\n dispose(): void {\n if (this.disposed) return;\n this.disposed = true;\n this.fetching?.abort();\n this.fetching = null;\n this.session?.close();\n for (const off of this.unsubscribe) off();\n this.unsubscribe = [];\n clearTimeout(this.persistTimer);\n this.update();\n this.flush(); // the closed view reaches the listeners now: no frame may come after the screen is gone\n }\n\n /** Close for good and forget the conversation kept on the device (sign-out). Never throws for the storage. */\n clear(): void {\n this.dispose();\n this.history = NO_ITEMS;\n try {\n const removed = this.options.persistence?.removeItem(this.key());\n if (removed) removed.catch(() => undefined);\n } catch {\n // storage blocked: sign-out goes on\n }\n this.update();\n this.flush();\n }\n\n /**\n * The person switched the app's language: the UI's words change at once (the kit's own locale); the next session\n * asks for this locale (`subject.locale`). The open session keeps its language: the agent answers in the new one\n * from the next session, and the store never starts a session for it.\n */\n setLocale(locale: string | undefined): void {\n this.locale = locale;\n }\n\n /** The app came to the foreground or went to the background (AppState, `visibilitychange`). */\n setForeground(foreground: boolean): void {\n this.foreground = foreground;\n if (this.options.closeInBackground && !this.disposed) {\n if (!foreground) {\n this.suspend();\n return;\n }\n if (this.suspended) {\n void this.wake();\n return;\n }\n }\n this.session?.setForeground(foreground);\n if (foreground) this.reconnectIfDown();\n }\n\n /** In the background (`closeInBackground`): the connection is closed; the engine keeps what was sent, to resend. */\n private suspended = false;\n private suspend(): void {\n const session = this.session;\n if (!session || this.suspended || session.status === 'ended') return;\n this.suspended = true;\n for (const off of this.unsubscribe) off();\n this.unsubscribe = [];\n session.close();\n this.update();\n }\n\n /**\n * Back in the foreground, or the person acted while away: a new connection to the same session, with a fresh secret\n * when the backend gives one. A session that passed its end meanwhile is never reopened (a fresh secret cannot bring\n * back an expired tool token): the person's action continues the conversation in a new session from `getSession`,\n * and until then nothing connects.\n */\n private async wake(byPerson = false): Promise<void> {\n const info = this.info;\n if (info && this.sessionOver()) {\n if (byPerson) await this.resumeWith('resume');\n else this.update();\n return;\n }\n this.suspended = false;\n if (!info) return;\n let next: ConversationSession = info;\n if (this.options.refreshSecret) {\n try {\n next = {\n ...info,\n client_secret: await this.options.refreshSecret(info.id),\n };\n } catch (error) {\n this.options.onError?.(error); // the secret held may still open it; a refused one asks again (4401)\n }\n }\n if (this.disposed || this.suspended) return;\n this.open(next);\n }\n\n /** The network as the app sees it; null when unknown. Back online reconnects a connection that gave up. */\n setOnline(online: boolean | null): void {\n this.online = online;\n if (online) this.reconnectIfDown();\n this.update();\n }\n\n // ------------------------------------------------------------ the person's actions\n\n /** Send a typed message; returns its `client_event_id`. Typed before a session exists, it is sent once one does. */\n send(text: string): string {\n this.live();\n if (!text.trim()) throw new RangeError('A message needs some text.');\n if ([...text].length > MAX_TEXT)\n throw new RangeError(`A message is at most ${MAX_TEXT} characters.`);\n const id = (this.options.createId ?? randomId)();\n this.sent.set(id, { text, order: lastOrder(this.engine.state()) + 0.5 });\n if (!this.session) {\n this.early.set(id, text);\n void this.ensureSession('open');\n this.update();\n return id;\n }\n if (this.suspended) {\n // Typed while the connection is closed for the background: held, and sent once it is open again.\n this.early.set(id, text);\n void this.wake(true);\n this.update();\n return id;\n }\n if (this.nextFrom(this.engine.state()) === 'continue_here') {\n // The session refuses input now; typing here is the person continuing here, so it goes to the next session.\n this.early.set(id, text);\n void this.resumeWith('continue_here');\n this.update();\n return id;\n }\n if (this.sessionOver()) {\n // Past the session's end (its tool token with it): the text goes to a new session for the same conversation.\n this.early.set(id, text);\n void this.resumeWith('resume');\n this.update();\n return id;\n }\n this.nextId = id;\n this.session.sendText(text);\n this.nextId = null;\n this.continueIfEnded();\n return id;\n }\n\n /** Answer a question card (a `rate_each` row by its `question_id`); returns the `client_event_id`. */\n answer(cardId: string, questionId: string, answer: AnswerInput): string {\n const session = this.required();\n const id = session.answer(cardId, questionId, answer);\n this.continueIfEnded();\n return id;\n }\n\n /** A card action (`ui.action`) other than a proposal's outcome. */\n cardAction(cardId: string, action: string): string {\n return this.required().action(cardId, action);\n }\n\n /**\n * Decide a proposal: `decide` is the tenant's own call (its backend, the person's token), which confirms or\n * declines it and says the outcome; the store then reports it. One decision per card; the card is busy meanwhile.\n * Resolves to the outcome reported, or null when the card was busy or already decided.\n *\n * Only an outcome `decide` resolves with is reported (§6: the first is final). When `decide` throws, or resolves\n * with anything but `confirmed`, `declined`, `failed` or `expired`, nothing is reported: the backend may have\n * applied the change, so the outcome stays unknown; the card shows `decisionError` and the person may decide\n * again. When the conversation is disposed meanwhile (sign-out), the outcome is not reported either: the tenant's\n * backend holds it, and the session takes it as unknown.\n */\n async decideProposal(\n cardId: string,\n decide: () => Promise<ProposalOutcome>,\n ): Promise<ProposalOutcome | null> {\n this.live();\n const card = this.engine.state().cards.find((c) => c.id === cardId);\n if (card?.kind !== 'proposal') return null;\n if (this.busy.has(cardId) || (card.outcome ?? null) !== null) return null;\n this.busy.add(cardId);\n this.decisionErrors.delete(cardId);\n this.update();\n try {\n const outcome: unknown = await decide();\n if (typeof outcome !== 'string' || !OUTCOMES.has(outcome))\n throw new TypeError(\n `decide() resolved with ${JSON.stringify(outcome)}, not confirmed, declined, failed or expired`,\n );\n if (this.disposed) return outcome as ProposalOutcome;\n if (this.view.next === 'continue') await this.resumeWith('resume');\n this.required().reportOutcome(cardId, outcome as ProposalOutcome);\n return outcome as ProposalOutcome;\n } catch (error) {\n this.decisionErrors.add(cardId);\n throw error;\n } finally {\n this.busy.delete(cardId);\n this.update();\n }\n }\n\n /** Send a \"not sent\" message again, as a new message (the person's action). Returns the new id. */\n retry(key: string): string | null {\n const sent = this.sent.get(key);\n if (!sent || this.engine.state().refused[key] === undefined) return null;\n this.retried.add(key);\n this.sent.delete(key);\n return this.send(sent.text);\n }\n\n /**\n * Send again the person's text whose turn failed before any reply (a `turn_failed` row with `data.retry`), as a new\n * message (the person's action). Once per row: its `retry` turns false. Returns the new id, or null when the row\n * allows no retry.\n */\n retryTurn(key: string): string | null {\n const at = this.system.findIndex(\n (s) => s.item.key === key && s.item.event === 'turn_failed',\n );\n const entry = this.system[at];\n if (entry?.item.data.retry !== true) return null;\n const text = this.turnText(String(entry.item.data.turn ?? ''));\n if (text === undefined) return null;\n this.system = this.system.map((s, i) =>\n i === at\n ? { ...s, item: { ...s.item, data: { ...s.item.data, retry: false } } }\n : s,\n );\n return this.send(text);\n }\n\n /** After the conversation continued on another device: continue it here (the person's choice). */\n continueHere(): Promise<void> {\n return this.resumeWith('continue_here');\n }\n\n /** Stop the turn in progress. */\n cancel(): void {\n const turn = this.engine.state().turn;\n if (this.session && turn) this.session.cancel(turn);\n }\n\n // ------------------------------------------------------------ sessions\n\n private async ensureSession(\n reason: SessionReason,\n ): Promise<VinaverseSession | null> {\n if (this.session) return this.session;\n if (this.getting) return this.getting;\n this.getting = this.fetchSession(reason).then((info) => {\n this.getting = null;\n if (!info || this.disposed) return null;\n this.open(info);\n return this.session;\n });\n this.update();\n return this.getting;\n }\n\n private async fetchSession(\n reason: SessionReason,\n ): Promise<ConversationSession | null> {\n this.failed = false;\n this.fetching?.abort(); // a newer request takes the place of an older one\n const Controller = (\n globalThis as { AbortController?: new () => AbortController }\n ).AbortController;\n const controller = Controller ? new Controller() : null;\n const mine = { abort: () => controller?.abort() };\n this.fetching = mine;\n let aborted = false;\n const signal = controller?.signal;\n signal?.addEventListener('abort', () => {\n aborted = true;\n });\n try {\n const info = await this.options.getSession({\n reason,\n conversationId: this.engine.state().conversationId,\n ...(this.locale !== undefined ? { locale: this.locale } : {}),\n ...(this.options.timeZone !== undefined\n ? { timeZone: this.options.timeZone }\n : {}),\n ...(signal ? { signal } : {}),\n });\n return aborted || this.fetching !== mine ? null : info;\n } catch (error) {\n if (aborted || this.fetching !== mine) return null; // no longer wanted: not a failure\n this.failed = true;\n this.getting = null;\n this.options.onError?.(error);\n this.update();\n return null;\n } finally {\n if (this.fetching === mine) this.fetching = null;\n }\n }\n\n private open(info: ConversationSession): void {\n this.info = info;\n this.suspended = false;\n const refreshSecret = this.options.refreshSecret;\n const session = new VinaverseSession({\n ...this.options.transport,\n session: info,\n engine: this.engine,\n ...(refreshSecret\n ? {\n // Past the session's end a fresh secret cannot help: refused here, and the store rolls over instead.\n refreshSecret: (id: string) =>\n this.sessionOver()\n ? Promise.reject(\n new VinaverseClientError(\n 'needs_new_session',\n 'This session has ended.',\n ),\n )\n : refreshSecret(id),\n }\n : {}),\n createId: () => this.nextId ?? (this.options.createId ?? randomId)(),\n });\n this.session = session;\n this.unsubscribe.push(\n session.on('state', () => this.update()),\n session.on('status', (status) => this.statusChanged(status)),\n session.on('event', (event) => this.event(event)),\n session.on('error', (error) => {\n if (!this.sessionOver()) this.options.onError?.(error); // past its end, the refusal is the rollover's cue\n }),\n );\n session.setForeground(this.foreground);\n session.connect();\n this.flushEarly();\n }\n\n /** What was typed before there was a session to take it. */\n private flushEarly(): void {\n const session = this.session;\n if (!session) return;\n for (const [id, text] of this.early) {\n this.nextId = id;\n session.sendText(text);\n }\n this.nextId = null;\n this.early.clear();\n this.update();\n }\n\n /** A new session for the conversation, then `resume()`: once per person action, never in a loop. */\n private resuming: Promise<void> | null = null;\n private resumeWith(reason: SessionReason): Promise<void> {\n this.live();\n if (this.resuming) return this.resuming;\n if (!this.session) return this.ensureSession(reason).then(() => undefined);\n this.resuming = this.fetchSession(reason).then((info) => {\n this.resuming = null;\n if (!info || this.disposed || !this.session) return;\n if (this.session.status === 'closed') {\n this.open(info); // closed for the background: a connection of its own\n return;\n }\n this.info = info;\n this.session.resume(info);\n this.flushEarly();\n });\n return this.resuming;\n }\n\n /** The person acted after the session ended idle, expired or at its limit: the next session takes what they sent. */\n private continueIfEnded(): void {\n if (this.nextFrom(this.engine.state()) === 'continue')\n void this.resumeWith('resume');\n this.update();\n }\n\n private reconnectIfDown(): void {\n const session = this.session;\n if (\n session &&\n session.status === 'idle' &&\n !this.sessionOver() && // past its end: the person's next action gets a new session\n this.nextFrom(this.engine.state()) === null\n )\n session.connect();\n }\n\n /** A refusal already led to a new session, and none has been ready since: another refusal is no cue. */\n private rolled = false;\n\n private statusChanged(status: SessionStatus): void {\n // A refused secret (a 4401 that no fresh secret got past) means the session is over, whatever the device's clock\n // says: a phone running behind the server still thinks it open. The conversation goes on in a new session, once\n // until a session is ready, so a backend whose new session is refused too leaves the view unauthorized, never a\n // loop.\n if (status === 'ready') this.rolled = false;\n if (status === 'unauthorized' && !this.rolled) {\n this.rolled = true;\n void this.resumeWith('resume');\n }\n if (status === 'idle')\n this.offlineAfterRetries = this.lastStatus === 'reconnecting';\n else if (status !== 'reconnecting') this.offlineAfterRetries = false;\n this.lastStatus = status;\n this.update();\n }\n\n private event(event: ServerEvent): void {\n const frame = event as unknown as Record<string, unknown>;\n const str = (v: unknown) => (typeof v === 'string' ? v : null);\n const add = (\n key: string,\n kind: SystemItem['event'],\n data: SystemItem['data'],\n ) => {\n if (this.system.some((s) => s.item.key === key)) return;\n this.system = [\n ...this.system,\n {\n item: { type: 'system', key, event: kind, data },\n order: lastOrder(this.engine.state()) + 0.75,\n },\n ];\n };\n switch (frame.type) {\n case 'session.ready': {\n const session = (frame.session as { id?: unknown } | undefined)?.id;\n const moved =\n typeof session === 'string' && session !== this.readySession;\n if (typeof session === 'string') this.readySession = session;\n // A transcript without the live ids replaced the messages: the device's history gives way, and the cards on\n // screen are anchored where they were. One with them merged by key, and nothing gives way.\n if (\n frame.resumed === true &&\n Array.isArray(frame.transcript) &&\n !transcriptHasIds(frame.transcript)\n ) {\n this.transcriptSeen = true;\n this.anchorCards(moved);\n } else if (moved && frame.resumed === true) {\n // A card an earlier session drew takes no tap in this one (§6), unless this session holds it again.\n const pending = new Set(\n (Array.isArray(frame.pending_cards) ? frame.pending_cards : []).map(\n (c) => str((c as { id?: unknown }).id),\n ),\n );\n for (const card of this.engine.state().cards)\n if (pending.has(card.id)) this.inert.delete(card.id);\n else this.inert.add(card.id);\n }\n return;\n }\n // `at` is required (v1-draft.15); the same takeover announced again after a reconnect has the same `at`, so it\n // draws one row. A frame without one still gets a row of its own.\n case 'takeover.started':\n add(\n `takeover:${str(frame.at) ?? `#${++this.systemSeq}`}`,\n 'takeover_started',\n { by: str(frame.by) },\n );\n return;\n case 'takeover.ended':\n add(\n `takeover-ended:${str(frame.at) ?? `#${++this.systemSeq}`}`,\n 'takeover_ended',\n {},\n );\n return;\n case 'handoff.created': {\n const ticket = frame.ticket as Record<string, unknown> | undefined;\n add(`handoff:${str(ticket?.id) ?? ''}`, 'handoff_created', {\n expected_response: str(ticket?.expected_response),\n });\n return;\n }\n case 'flow.completed':\n add(`flow:#${++this.systemSeq}`, 'flow_completed', {\n result: str(frame.result),\n code: str(frame.code),\n });\n return;\n case 'turn.started': {\n const turn = str(frame.turn_id);\n const input = str(frame.client_event_id);\n if (turn === null || input === null) return;\n this.turnInputs.set(turn, input);\n if (this.turnInputs.size > TURN_INPUTS) {\n const oldest = this.turnInputs.keys().next().value;\n if (oldest !== undefined) this.turnInputs.delete(oldest);\n }\n return;\n }\n case 'turn.failed': {\n const turn = str(frame.turn_id) ?? '';\n // A reply that streamed is kept, cut off; a turn that failed before any text gets a row of its own.\n if (this.engine.state().messages.some((m) => m.key === `a:${turn}`))\n return;\n if (frame.code === 'cancelled') return; // stopped on purpose (cancel(), a takeover): nothing failed\n add(`failed:${turn}`, 'turn_failed', {\n code: str(frame.code),\n message: str(frame.message),\n retryable: frame.retryable === true,\n retry: frame.retryable === true && this.turnText(turn) !== undefined,\n turn,\n });\n return;\n }\n default:\n return;\n }\n }\n\n /** The person's text that started a turn, while its message is on screen. */\n private turnText(turn: string): string | undefined {\n const input = this.turnInputs.get(turn);\n if (input === undefined) return undefined;\n const message = this.engine\n .state()\n .messages.find((m) => m.key === input && m.role === 'person');\n return message?.text || undefined;\n }\n\n /**\n * A resumed session's transcript replaced the messages, and a chat transcript carries text only: the engine drops\n * the cards it drew, and draws the pending ones again at the end. Each card on screen is anchored just after the\n * message it followed (by key; the transcript keeps the live keys), so a pending proposal stays where it was, and a\n * card the transcript dropped stays drawn there; taking no tap when it belongs to an earlier session.\n */\n private anchorCards(sessionChanged: boolean): void {\n const state = this.engine.state();\n const seqOf = new Map(state.messages.map((m) => [m.key, m.seq]));\n const first = Math.min(...state.messages.map((m) => m.seq), 0);\n const held = new Set(state.cards.map((c) => c.id));\n const order = new Map<string, number>();\n const kept: { item: CardItem; order: number }[] = [];\n let anchor = first - 1;\n let step = 0;\n for (const item of this.view.items) {\n if (item.type === 'message' && seqOf.has(item.key)) {\n anchor = seqOf.get(item.key) as number;\n step = 0;\n } else if (item.type === 'card') {\n const at = anchor + 0.5 + ++step / 1000;\n order.set(item.key, at);\n if (!held.has(item.key))\n kept.push({\n item: sessionChanged\n ? { ...item, busy: false, restored: true }\n : item,\n order: at,\n });\n }\n }\n this.cardOrder = order;\n this.kept = kept;\n }\n\n // ------------------------------------------------------------ the view\n\n /**\n * Recomputes now (getSnapshot and getStreaming are always current) and notifies from the scheduler, at most once\n * per frame, both channels in the same flush: a streamed reply that completes becomes its message in one frame.\n */\n private update(): void {\n const state = this.engine.state();\n this.stream(state);\n const view = this.compute(state);\n if (view !== this.view) {\n this.view = view;\n this.viewDirty = true;\n this.schedulePersist();\n }\n if (this.viewDirty || this.streamDirty) this.scheduleNotify();\n }\n\n private scheduleNotify(): void {\n if (this.framePending || this.disposed) return;\n // Nobody listens yet (a store created on the server, or before its screen): no frame is asked for, so no global is\n // touched; a listener reads the current snapshot when it subscribes.\n if (this.listeners.size === 0 && this.streamListeners.size === 0) return;\n this.framePending = true;\n this.frame = this.scheduler().request(() => {\n this.frame = undefined;\n this.framePending = false;\n this.flush();\n });\n }\n\n /** Calls the listeners of what changed since the last flush. */\n private flush(): void {\n if (this.frame !== undefined) {\n this.scheduler().cancel(this.frame);\n this.frame = undefined;\n this.framePending = false;\n }\n const view = this.viewDirty;\n const stream = this.streamDirty;\n this.viewDirty = false;\n this.streamDirty = false;\n if (stream) for (const l of [...this.streamListeners]) l();\n if (view) for (const l of [...this.listeners]) l();\n }\n\n private compute(state: ConversationState | null): ConversationView {\n const s = state ?? this.engine.state();\n const prev: ConversationView | undefined = this.view;\n for (const id of [...this.sent.keys()])\n if (!this.early.has(id) && s.messages.some((m) => m.key === id))\n this.sent.delete(id);\n const items = buildTimeline(\n {\n state: s,\n history: this.history,\n sent: this.sent,\n early: new Set(this.early.keys()),\n retried: this.retried,\n busy: this.busy,\n decisionErrors: this.decisionErrors,\n transcriptSeen: this.transcriptSeen,\n cardOrder: this.cardOrder,\n kept: this.kept,\n inert: this.inert,\n system: this.system,\n },\n prev?.items ?? NO_ITEMS,\n );\n const status = this.status();\n const next = this.nextFrom(s);\n const activity =\n s.turn === null ? [] : s.tools.filter((t) => t.turn_id === s.turn);\n const name = this.info?.agent?.display_name ?? null;\n const avatarUrl = this.info?.agent?.avatar_url ?? null;\n const view: ConversationView = {\n status,\n conversationId: s.conversationId,\n banner: banner(status, next),\n next,\n agent: sameAgent(prev?.agent, name, avatarUrl)\n ? (prev as ConversationView).agent\n : { name, avatarUrl },\n disclosure: s.disclosure ?? this.info?.disclosure ?? null,\n welcome: this.info?.welcome ?? null,\n takeover: s.takeover,\n items,\n activity:\n prev && sameTools(prev.activity, activity) ? prev.activity : activity,\n responding: s.turn !== null || s.streaming !== null,\n openQuestion: s.openQuestion,\n answersNeedWebSocket: status === 'sse',\n turnsLeft: s.turnsLeft,\n history: this.historyState,\n };\n if (prev && shallowEqual(prev, view)) return prev;\n return view;\n }\n\n private status(): ConversationStatus {\n if (this.disposed) return 'closed';\n if (this.suspended) return 'idle'; // in the background on purpose: nothing to show\n const session = this.session;\n if (!session) {\n if (this.failed) return 'unavailable';\n return this.getting || this.early.size ? 'starting' : 'idle';\n }\n const status = session.status;\n if (this.failed && status === 'ended') return 'unavailable';\n if (status === 'idle')\n return this.offlineAfterRetries || this.online === false\n ? 'offline'\n : 'idle';\n if (status === 'reconnecting' && this.online === false) return 'offline';\n return status;\n }\n\n private nextFrom(state: ConversationState): ConversationView['next'] {\n if (this.session?.status !== 'ended' && state.reconnect === 'allowed')\n return null;\n if (state.reconnect === 'new_session_on_next_action') return 'continue';\n if (state.reconnect === 'user_action_only') return 'continue_here';\n return null;\n }\n\n /** The streamed text, current at once; its listeners hear of it with the next flush. */\n private stream(state: ConversationState): void {\n const s = state.streaming;\n if (!s) {\n if (this.streaming !== null) {\n this.streaming = null;\n this.streamDirty = true;\n }\n return;\n }\n if (this.streaming?.turnId === s.turnId && this.streaming.text === s.text)\n return;\n this.streaming = { key: `a:${s.turnId}`, turnId: s.turnId, text: s.text };\n this.streamDirty = true;\n }\n\n private scheduler(): FrameScheduler {\n return this.options.scheduler ?? defaultScheduler;\n }\n\n // ------------------------------------------------------------ persistence\n\n private key(): string {\n return this.options.persistenceKey ?? 'vinaverse.conversation';\n }\n\n private restore(): void {\n const store = this.options.persistence;\n if (!store) return;\n const done = () => {\n this.historyState = 'restored';\n this.update();\n };\n const apply = (raw: string | null) => {\n if (this.disposed) return;\n if (raw === null) return done();\n try {\n const saved = JSON.parse(raw) as { v?: unknown; items?: unknown };\n // Another version (an older kit's), or not a list: dropped. It still ends restored, or the skeleton stays.\n if (saved.v === PERSIST_VERSION && Array.isArray(saved.items))\n this.history = (saved.items as TimelineItem[]).map((item) =>\n item.type === 'card'\n ? ({ ...item, busy: false, restored: true } as CardItem)\n : item,\n );\n } catch {\n // A kept conversation that no longer reads is dropped, never fatal.\n }\n done();\n };\n try {\n const raw = store.getItem(this.key());\n if (typeof raw === 'string' || raw === null) apply(raw);\n else {\n // Async storage (Capacitor Preferences, IndexedDB): the UI draws a skeleton, not an empty conversation.\n this.historyState = 'restoring';\n this.view = this.compute(null);\n raw.then(apply, () => {\n if (!this.disposed) done();\n });\n }\n } catch {\n done(); // storage unavailable: nothing restored\n }\n }\n\n private schedulePersist(): void {\n const store = this.options.persistence;\n if (!store || this.disposed || this.persistTimer !== undefined) return;\n this.persistTimer = setTimeout(() => {\n this.persistTimer = undefined;\n const items = this.view.items.filter(persistable).slice(-HISTORY);\n try {\n void store.setItem(\n this.key(),\n JSON.stringify({ v: PERSIST_VERSION, items }),\n );\n } catch {\n // storage full or unavailable: the conversation goes on\n }\n }, PERSIST_DELAY);\n }\n\n // ------------------------------------------------------------ guards\n\n /** Past the session's end (`expires_at`), when the backend passed it on. */\n private sessionOver(): boolean {\n const end = this.info?.expires_at;\n return (\n end !== undefined &&\n (this.options.clock?.now() ?? Date.now()) >= Date.parse(end)\n );\n }\n\n private live(): void {\n if (this.disposed)\n throw new VinaverseClientError(\n 'session_ended',\n 'This conversation was closed.',\n );\n }\n\n private required(): VinaverseSession {\n this.live();\n if (!this.session)\n throw new VinaverseClientError(\n 'session_ended',\n 'The conversation has no session yet: start() it first.',\n );\n return this.session;\n }\n}\n\n/** One conversation with an agent, for any UI: see `ConversationStore`. */\nexport function createConversation(\n options: ConversationOptions,\n): ConversationStore {\n return new ConversationStore(options);\n}\n\nconst defaultScheduler: FrameScheduler = {\n request(callback) {\n const raf = (\n globalThis as {\n requestAnimationFrame?: (cb: () => void) => unknown;\n }\n ).requestAnimationFrame;\n return raf ? { raf: raf(callback) } : { timer: setTimeout(callback, 16) };\n },\n cancel(handle) {\n const h = handle as {\n raf?: unknown;\n timer?: ReturnType<typeof setTimeout>;\n };\n const caf = (globalThis as { cancelAnimationFrame?: (id: unknown) => void })\n .cancelAnimationFrame;\n if (h.raf !== undefined) caf?.(h.raf);\n if (h.timer !== undefined) clearTimeout(h.timer);\n },\n};\n\nfunction banner(\n status: ConversationStatus,\n next: ConversationView['next'],\n): ConversationBanner {\n if (status === 'connecting' || status === 'starting') return 'connecting';\n if (status === 'reconnecting') return 'reconnecting';\n if (status === 'offline') return 'offline';\n if (status === 'unavailable' || status === 'unauthorized')\n return 'unavailable';\n if (next === 'continue_here') return 'continued_elsewhere';\n return null;\n}\n\nfunction sameAgent(\n agent: ConversationView['agent'] | undefined,\n name: string | null,\n avatarUrl: string | null,\n): boolean {\n return agent?.name === name && agent?.avatarUrl === avatarUrl;\n}\n\nfunction sameTools(\n a: ConversationView['activity'],\n b: ConversationView['activity'],\n): boolean {\n return (\n a.length === b.length &&\n a.every(\n (t, i) =>\n t.turn_id === b[i]?.turn_id &&\n t.label === b[i]?.label &&\n t.state === b[i]?.state,\n )\n );\n}\n\nfunction shallowEqual(a: ConversationView, b: ConversationView): boolean {\n return (\n a.status === b.status &&\n a.banner === b.banner &&\n a.next === b.next &&\n a.agent.name === b.agent.name &&\n a.agent.avatarUrl === b.agent.avatarUrl &&\n a.disclosure === b.disclosure &&\n a.takeover?.by === b.takeover?.by &&\n a.takeover?.at === b.takeover?.at &&\n (a.takeover === null) === (b.takeover === null) &&\n a.items === b.items &&\n a.activity === b.activity &&\n a.responding === b.responding &&\n a.openQuestion === b.openQuestion &&\n a.answersNeedWebSocket === b.answersNeedWebSocket &&\n a.turnsLeft === b.turnsLeft &&\n a.history === b.history\n );\n}\n","// One conversation store per mode (a customer and a professional, say, each with an agent of its own): each mode keeps\n// its own timeline, its own history on the device (a persistence key of its own) and its own sessions, so switching\n// modes never shows one mode's conversation in the other. The tenant's backend gets the mode with every session\n// request and creates the session for that mode's agent.\nimport {\n type ConversationOptions,\n type ConversationSession,\n type ConversationStore,\n createConversation,\n type SessionRequest,\n} from './store.js';\n\n/** A session request, with the mode it is for. */\nexport interface ModeSessionRequest extends SessionRequest {\n readonly mode: string;\n}\n\nexport interface ConversationsByModeOptions\n extends Omit<ConversationOptions, 'getSession'> {\n /** Your backend creates the session for the mode's agent (its `subject.type`, its agent), with its service key. */\n readonly getSession: (\n request: ModeSessionRequest,\n ) => Promise<ConversationSession>;\n /** Every mode the app has, so `clear()` forgets each one's kept history, even one not opened since launch. */\n readonly modes?: readonly string[];\n}\n\nexport interface ConversationsByMode {\n /** The mode's store, made the first time it is asked for; the same store after that. */\n get(mode: string): ConversationStore;\n /**\n * The mode the person switched to: its store, with every other mode's sent to the background (no pings; closed\n * with `closeInBackground`). The kit then drives the selected one with the app's foreground and background.\n */\n select(mode: string): ConversationStore;\n /** Close every mode's store. */\n dispose(): void;\n /** Close every mode's store and forget what each kept on the device (sign-out). */\n clear(): void;\n}\n\nexport function createConversationsByMode(\n options: ConversationsByModeOptions,\n): ConversationsByMode {\n const { getSession, modes = [], ...shared } = options;\n const base = shared.persistenceKey ?? 'vinaverse.conversation';\n const stores = new Map<string, ConversationStore>();\n const get = (mode: string): ConversationStore => {\n let store = stores.get(mode);\n if (!store) {\n store = createConversation({\n ...shared,\n persistenceKey: `${base}.${mode}`,\n getSession: (request) => getSession({ ...request, mode }),\n });\n stores.set(mode, store);\n }\n return store;\n };\n return {\n get,\n select(mode) {\n for (const [other, store] of stores)\n if (other !== mode) store.setForeground(false);\n return get(mode);\n },\n dispose() {\n for (const store of stores.values()) store.dispose();\n stores.clear();\n },\n clear() {\n for (const mode of new Set([...stores.keys(), ...modes]))\n get(mode).clear();\n stores.clear();\n },\n };\n}\n"]}
1
+ {"version":3,"sources":["../../src/contract.ts","../../src/errors.ts","../../src/events.ts","../../src/conversation/answers.ts","../../src/conversation/links.ts","../../src/engine.ts","../../src/secret.ts","../../src/sse.ts","../../src/session.ts","../../src/conversation/timeline.ts","../../src/conversation/store.ts","../../src/conversation/modes.ts"],"names":["OUTCOMES","str"],"mappings":"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","file":"index.cjs","sourcesContent":["// The contract this package version targets: the public API's version and the\n// vinaverse-contracts commit its types were generated from (contracts.lock).\n// A test holds both to the pinned contracts, so they cannot drift.\nexport const CONTRACT = {\n api: 'v1-draft.20',\n commit: '5f6f41bdbfbdd6eadf21180eed1ffddfa5310355',\n} as const;\n","/** Why the client refused to do something; `code` is stable, `message` is for people. */\nexport type ClientErrorCode =\n /** A service key (`vv_sk_`) was given: it belongs on the tenant's backend, never in an app. */\n | 'service_key'\n /** The value is not a client secret (`vv_cs_` and at least 16 base64url characters). */\n | 'invalid_secret'\n /** The action needs the WebSocket (answers to question cards); the session runs over SSE. */\n | 'needs_websocket'\n /** The session was closed by the app, or ended for good (replaced, revoked, expired). */\n | 'session_ended'\n /** An SSE request failed: `status` holds the HTTP status. */\n | 'http_error'\n /**\n * The session ended but the conversation did not (idle, expired, its turn limit): its secret is spent. Have your\n * backend create a new session for the conversation and call `resume()` with it.\n */\n | 'needs_new_session';\n\nexport class VinaverseClientError extends Error {\n override readonly name = 'VinaverseClientError';\n readonly code: ClientErrorCode;\n readonly status: number | undefined;\n\n constructor(code: ClientErrorCode, message: string, status?: number) {\n super(message);\n this.code = code;\n this.status = status;\n }\n}\n","// Typed events and cards, from the generated contract types (vinaverse-v1.yaml). Within v1 the server may add event\n// types, card kinds, question kinds and codes (docs/realtime-protocol.md §5), so inbound frames are never validated\n// strictly: an unknown event is ignored and an unknown card kind is skipped where it is drawn.\nimport type { components } from './generated/vinaverse-v1.js';\n\n/** Every schema of the pinned public contract (vinaverse-v1), by name: `Schemas['Session']`, `Schemas['Card']`, … */\nexport type Schemas = components['schemas'];\n\nexport type ClientEvent = Schemas['ClientEvent'];\nexport type ServerEvent = Schemas['ServerEvent'];\nexport type ServerEventType = ServerEvent['type'];\nexport type ServerEventOf<T extends ServerEventType> = Extract<\n ServerEvent,\n { type: T }\n>;\nexport type Card = Schemas['Card'];\nexport type CardKind = Card['kind'];\nexport type Question = Schemas['Question'];\nexport type AnswerInput = Schemas['AnswerInput'];\nexport type Proposal = Schemas['Proposal'];\nexport type TranscriptItem = Schemas['TranscriptItem'];\nexport type ClientSecret = Schemas['ClientSecret'];\nexport type TurnInput = Schemas['TurnInput'];\n/** v1-draft.20: the tenant's greeting for the session's mode, and the chips that send a message as the person's own. */\nexport type Welcome = Schemas['Welcome'];\nexport type CardImage = Schemas['CardImage'];\nexport type CardGroup = Schemas['CardGroup'];\nexport type CardLink = Schemas['CardLink'];\n/** The session as createSession returns it to the tenant's backend, which passes this part to the app. */\nexport type SessionInfo = Pick<\n Schemas['Session'],\n 'id' | 'realtime_url' | 'turns_url' | 'conversation_id'\n> & {\n client_secret: ClientSecret | string;\n};\n\n/** The outcomes an app reports on a proposal card with `ui.action`. */\nexport type ProposalOutcome = 'confirmed' | 'declined' | 'failed' | 'expired';\n\n// A record over every kind, so a kind added to the contract fails the type check until it is listed here.\nconst CARD_KINDS: Record<CardKind, true> = {\n professional: true,\n workspace: true,\n service: true,\n time_slots: true,\n booking: true,\n quote: true,\n policy: true,\n handoff: true,\n metric_chart: true,\n metric_table: true,\n gap_list: true,\n cluster: true,\n claim: true,\n document: true,\n question: true,\n proposal: true,\n next_step: true,\n links: true,\n};\n\n/** Whether this client knows how to read a card of this kind; skip any other card (§5). */\nexport function isKnownCard(card: { kind: string }): card is Card {\n return Object.hasOwn(CARD_KINDS, card.kind);\n}\n","// Whether an answer to a question card can be sent: the card's own rules (`Question`, `QuestionAnswer`), checked as\n// the person answers so a UI enables Send only for an answer the server will take. The server still decides: what it\n// rejects arrives as `ui.answer.rejected` and unlocks the question. Shared by every UI kit.\nimport type { AnswerInput, Question } from '../events.js';\n\nexport type AnswerProblem =\n /** Nothing chosen or typed, and the question is required (or skipped while required). */\n | 'required'\n /** Fewer choices than `min`. */\n | 'too_few'\n /** More choices than `max`, or more than one where one is asked. */\n | 'too_many'\n /** A value that is not on the card, `none_of_the_above` with another choice, or a form the kind does not take. */\n | 'not_allowed'\n /** The text, or the \"Other\" text, is longer than the card allows (in code points). */\n | 'too_long'\n /** A number outside `min`…`max`, or off its `step`. */\n | 'out_of_range'\n /** Not a calendar date, or outside the card's bounds. */\n | 'bad_date';\n\nconst CHOICE = new Set([\n 'single_choice',\n 'multi_choice',\n 'image_choice',\n 'yes_no',\n 'list_choice',\n]);\nconst ONE_CHOICE = new Set(['single_choice', 'yes_no', 'list_choice']);\n\n/** Unicode code points, as the contract counts every text limit (an emoji outside the BMP is one). */\nexport function codePoints(text: string): number {\n let n = 0;\n for (const _ of text) n++;\n return n;\n}\n\ntype Answer = {\n values?: readonly string[];\n other_text?: string;\n text?: string;\n number?: number;\n date?: string;\n upload_ref?: string;\n skipped?: boolean;\n};\n\n/**\n * The first rule an answer breaks, or null when it can be sent. For `rate_each`, check each row's answer against\n * the question: one column from `options`, or `skipped` when not required. A kind this client does not know is the\n * server's to judge (null).\n */\nexport function answerProblem(\n question: Question,\n input: AnswerInput,\n): AnswerProblem | null {\n const answer = input as Answer;\n if (answer.skipped === true) return question.required ? 'required' : null;\n const kind = question.kind as string;\n if (CHOICE.has(kind)) return choiceProblem(question, answer);\n switch (kind) {\n case 'rate_each': {\n const values = answer.values ?? [];\n if (answer.other_text !== undefined) return 'not_allowed';\n if (values.length === 0) return 'required';\n if (values.length > 1) return 'too_many';\n return (question.options ?? []).some((o) => o.value === values[0])\n ? null\n : 'not_allowed';\n }\n case 'short_text':\n case 'long_text': {\n const text = answer.text ?? '';\n if (!text.trim()) return 'required';\n return codePoints(text) > (question.text?.max_length ?? 2000)\n ? 'too_long'\n : null;\n }\n case 'number':\n case 'scale': {\n const n = answer.number;\n if (typeof n !== 'number' || !Number.isFinite(n)) return 'required';\n const range = kind === 'number' ? question.number : question.scale;\n if (!range) return null;\n if (n < range.min || n > range.max) return 'out_of_range';\n const steps = (n - range.min) / range.step;\n return Math.abs(steps - Math.round(steps)) > 1e-9 ? 'out_of_range' : null;\n }\n case 'date':\n return dateProblem(question, answer.date);\n case 'photo':\n return answer.upload_ref ? null : 'required';\n default:\n return null;\n }\n}\n\nfunction choiceProblem(\n question: Question,\n answer: Answer,\n): AnswerProblem | null {\n const values = answer.values ?? [];\n const other = answer.other_text;\n if (other !== undefined) {\n if (!question.allows_other) return 'not_allowed';\n if (!other.trim()) return 'required';\n if (codePoints(other) > (question.other_max_length ?? 500))\n return 'too_long';\n if (\n values.length > 0 &&\n question.kind !== 'single_choice' &&\n question.kind !== 'multi_choice'\n )\n return 'not_allowed';\n }\n if (values.length === 0) return other !== undefined ? null : 'required';\n if (new Set(values).size !== values.length) return 'not_allowed';\n const none = question.none_of_the_above?.value;\n if (none !== undefined && values.includes(none))\n return values.length === 1 && other === undefined ? null : 'not_allowed';\n const known = new Set((question.options ?? []).map((o) => o.value));\n if (!values.every((v) => known.has(v))) return 'not_allowed';\n // One option for the single kinds (a single_choice may add its \"Other\" too, as the contract allows); the \"Other\"\n // counts as a choice against min and max.\n if (ONE_CHOICE.has(question.kind) && values.length > 1) return 'too_many';\n const chosen = values.length + (other !== undefined ? 1 : 0);\n if (question.min !== undefined && chosen < question.min) return 'too_few';\n if (question.max !== undefined && chosen > question.max) return 'too_many';\n return null;\n}\n\nfunction dateProblem(\n question: Question,\n date: string | undefined,\n): AnswerProblem | null {\n if (!date) return 'required';\n const m = /^(\\d{4})-(\\d{2})-(\\d{2})$/.exec(date);\n if (!m) return 'bad_date';\n const [y, mo, d] = [Number(m[1]), Number(m[2]), Number(m[3])];\n const at = new Date(Date.UTC(y, mo - 1, d));\n if (\n at.getUTCFullYear() !== y ||\n at.getUTCMonth() !== mo - 1 ||\n at.getUTCDate() !== d\n )\n return 'bad_date';\n // ISO dates compare as text.\n if (question.date?.min !== undefined && date < question.date.min)\n return 'bad_date';\n if (question.date?.max !== undefined && date > question.date.max)\n return 'bad_date';\n return null;\n}\n","// The deep-link rule an app applies to a card's `deep_link` and a proposal's `edit_deep_link` before it opens one\n// (docs/realtime-protocol.md §6, admin-v1.yaml `Connector.deep_link_prefixes`): the link starts with a prefix the\n// tenant registered, compared code point for code point, and what follows the prefix is on the allowlist. The\n// patterns are the contract's own (fixtures/api/deep-link-vectors.json), and the tests run its vectors.\n\nconst PREFIX =\n /^[a-z][a-z0-9+.-]*:(\\/\\/\\.*[A-Za-z0-9_~-][A-Za-z0-9._~-]*(:(6553[0-5]|655[0-2][0-9]|65[0-4][0-9]{2}|6[0-4][0-9]{3}|[1-5][0-9]{4}|[1-9][0-9]{0,3}))?\\/|\\.*[A-Za-z0-9_~-][A-Za-z0-9._~-]*\\/)(\\.*[A-Za-z0-9_~-][A-Za-z0-9._~-]*\\/)*$/;\nconst PREFIX_HTTPS =\n /^https?:\\/\\/[a-z0-9-]+(\\.[a-z0-9-]+)*(:(6553[0-5]|655[0-2][0-9]|65[0-4][0-9]{2}|6[0-4][0-9]{3}|[1-5][0-9]{4}|[1-9][0-9]{0,3}))?\\/\\.*[A-Za-z0-9_~-][A-Za-z0-9._~-]*\\//;\nconst REFUSED_SCHEMES =\n /^(javascript|vbscript|data|blob|file|filesystem|about|view-source|intent|android-app|content|jar|mhtml|itms-services|ftp|ws|wss):/;\n// biome-ignore lint/suspicious/noControlCharactersInRegex: the contract refuses control characters in a prefix.\nconst CONTROLS = /[\\x00-\\x1f\\x7f]/;\nconst REMAINDER =\n /^(\\.*[A-Za-z0-9_~-][A-Za-z0-9._~-]*(\\/\\.*[A-Za-z0-9_~-][A-Za-z0-9._~-]*)*\\/?)?(\\?([A-Za-z0-9._~=&-]|%(2[0-46-9A-Ea-e]|3[0-9B-Fb-f]|[46][0-9A-Fa-f]|5[0-9ABD-Fabd-f]|7[0-9A-Ea-e]))*)?$/;\n\n/** Whether a prefix may be registered: the contract's prefix pattern, no refused scheme, no control character. */\nexport function isValidLinkPrefix(prefix: string): boolean {\n if (CONTROLS.test(prefix) || REFUSED_SCHEMES.test(prefix)) return false;\n if (/^https?:/.test(prefix) && !PREFIX_HTTPS.test(prefix)) return false;\n return PREFIX.test(prefix);\n}\n\n/**\n * Whether a card's link may be opened: it starts with one of the registered prefixes (invalid ones are ignored) and\n * what follows is a path and an optional query of the allowed characters. Route by the page it names; never open a\n * query value.\n */\nexport function isAllowedLink(\n link: string,\n prefixes: readonly string[],\n): boolean {\n return prefixes.some(\n (prefix) =>\n isValidLinkPrefix(prefix) &&\n link.startsWith(prefix) &&\n REMAINDER.test(link.slice(prefix.length)),\n );\n}\n","// The conversation engine: the state an app keeps for one agent\n// conversation, moved by what it sends, what it receives and what happens to\n// its connection, as docs/realtime-protocol.md decides it. It models what the\n// protocol decides (cards, locks, acknowledgements, resends, outcomes,\n// reconnects), never how an app draws it, and it is held to the shared\n// recordings (vinaverse-contracts conformance/realtime/*) by its tests.\n// Pure and synchronous: the session transport feeds it, and so can a test.\n\n/** A frame as received or sent: its `type`, and whatever else the contract gives it. */\nexport interface Frame {\n readonly type: string;\n readonly [field: string]: unknown;\n}\n\n/** A card as the app holds it. `locked` lists the question ids (the card's, or a `rate_each` row's) drawn locked. */\nexport interface HeldCard {\n readonly id: string;\n readonly kind: string;\n readonly card: Readonly<Record<string, unknown>>;\n readonly question?: HeldQuestion;\n readonly locked: readonly string[];\n /** The turn that drew the card, when known: `ui.action` names it with the card's `id`. */\n readonly turnId?: string;\n /** A proposal's first reported outcome (`confirmed`, `declined`, `failed`, `expired`); later ones change nothing. */\n readonly outcome?: string | null;\n /** Arrival order, shared with messages: a timeline sorts both by it. Moves when the card is drawn again. */\n readonly seq: number;\n}\n\nexport interface HeldQuestion {\n readonly question_id: string;\n readonly kind: string;\n readonly state: string;\n readonly answer?: unknown;\n readonly row_answers?: readonly { question_id: string; answer: unknown }[];\n readonly rows?: readonly { question_id: string }[];\n readonly [field: string]: unknown;\n}\n\nexport interface Message {\n readonly role: 'assistant' | 'person' | 'staff' | (string & {});\n readonly text: string;\n /**\n * Stable for the message's life, to key it in a list: a person's text by its `client_event_id`, an agent's reply by\n * its turn (`a:<turn_id>`), a staff reply by its `message_id` (`s:<id>`), a guardrail refusal by the input it answers\n * (`r:<client_event_id>`), a transcript item by its server `id` as the live key it matches, or by its time and role\n * (`t:<at>:<role>`) from a server that sends no `id`.\n */\n readonly key: string;\n /** Arrival order, shared with cards: a timeline sorts both by it. */\n readonly seq: number;\n /**\n * A reply cut off after some of it streamed; what streamed stands (§6): `blocked` (`output_blocked`), `interrupted`\n * (`cancelled`, as when a person from the business takes over, or the connection dropped), `failed` (any other code).\n */\n readonly partial?: 'blocked' | 'interrupted' | 'failed';\n /** A person's text recorded during a takeover (`input.received`): the business reads it; no agent turn runs. */\n readonly received?: true;\n /** The agent's reply is a guardrail refusal (`input.rejected` `guardrail`, its `message`). */\n readonly refusal?: true;\n}\n\n/** A person from the business is replying (`takeover.started`); `by` is their role as the person sees it. */\nexport interface Takeover {\n readonly by: string | null;\n readonly at: string;\n}\n\n/** The turn's text streamed so far (`message.delta`), until its `message.completed`. */\nexport interface Streaming {\n readonly turnId: string;\n readonly text: string;\n /** Taken at the turn's first delta, and kept by its message: a reply sorts before the cards its turn drew after it. */\n readonly seq: number;\n}\n\nexport interface Connection {\n readonly name: string;\n readonly state: 'open' | 'closed';\n readonly code?: number;\n readonly reason?: string;\n}\n\nexport interface ToolLine {\n readonly turn_id: string;\n readonly label: string;\n readonly state: string;\n}\n\n/**\n * Whether and how the conversation goes on after a connection ends:\n * - `allowed`: reconnect to the same session;\n * - `user_action_only`: the session was revoked or replaced (the conversation continued elsewhere): resume only when\n * the person asks;\n * - `new_session_on_next_action`: the session ended (idle, expired, limit_reached) but the conversation did not; its\n * secret is spent. On the person's next action, the app has its backend create a new session for the same\n * conversation and calls `resume()`.\n */\nexport type Reconnect =\n | 'allowed'\n | 'user_action_only'\n | 'new_session_on_next_action';\n\n/** The engine's whole state, for an app to draw. */\nexport interface ConversationState {\n readonly sessionId: string | null;\n readonly conversationId: string | null;\n readonly connection: Connection | null;\n /** How the conversation goes on after the connection ends (`Reconnect`). */\n readonly reconnect: Reconnect;\n readonly messages: readonly Message[];\n /** Every card held, oldest first. */\n readonly cards: readonly HeldCard[];\n /** The newest question card still open: the one to answer. */\n readonly openQuestion: string | null;\n /** Events sent and neither acknowledged nor refused, by `client_event_id`: resend them, same id, after a reconnect. */\n readonly unacknowledged: readonly Frame[];\n /** Ids refused for now (`turn_in_progress`, `screen_unavailable`): send again with the same id. */\n readonly resend: readonly string[];\n /**\n * Texts and answers refused with `limit_reached`: never resent in this session (it would get the same refusal);\n * resent, same id, on the next session's `session.ready`. Kept apart from `resend` (conformance README, `held`). A\n * refused action is dropped: a new session cannot act on an earlier session's card.\n */\n readonly held: readonly string[];\n /** Typed messages whose refusal stands, by `client_event_id`: shown as not sent, never resent. */\n readonly refused: Readonly<Record<string, string>>;\n /** The last `flow.completed`: `ok`, `refused` or `failed` (an unknown result reads as `failed`). */\n readonly flow: {\n readonly flow: unknown;\n readonly result: 'ok' | 'refused' | 'failed';\n } | null;\n /** The turn in progress. */\n readonly turn: string | null;\n /** The last state of each tool line (the last 100). */\n readonly tools: readonly ToolLine[];\n readonly handoffs: readonly unknown[];\n /** The codes of `error` and `turn.failed` events (the last 100). */\n readonly errors: readonly string[];\n /**\n * While `reconnect` is `new_session_on_next_action`: the `client_event_id`s held for the next session (unacknowledged,\n * or refused for this session's turn limit). Draw them as \"sends when you continue\", not as failed. Empty otherwise.\n */\n readonly heldForNextSession: readonly string[];\n /** Seconds left when `session.expiring` arrived (WebSocket only, about a minute before the end); null otherwise. */\n readonly expiring: number | null;\n /** The turn's text streamed so far, until its `message.completed` (or its end, which keeps it as a message). */\n readonly streaming: Streaming | null;\n /** While a person from the business replies (§8): from `takeover.started` to `takeover.ended`. */\n readonly takeover: Takeover | null;\n /** Every refusal's code and `message` (`input.rejected`), by `client_event_id`; `refused` lists those that stand. */\n readonly rejections: Readonly<\n Record<string, { code: string; message: string }>\n >;\n /** The AI disclosure `session.ready` carries: always shown, never removed. Null until the first one. */\n readonly disclosure: string | null;\n /** `session.ready`'s `limits.turns_left`, when given. */\n readonly turnsLeft: number | null;\n}\n\nconst UNLOCKS_KEEP_LOCKED = new Set([\n 'card_superseded',\n 'client_event_id_reused',\n]);\nconst RESEND = new Set(['turn_in_progress', 'screen_unavailable']);\nconst FLOW_RESULTS = new Set(['ok', 'refused', 'failed']);\nconst OUTCOMES = new Set(['confirmed', 'declined', 'failed', 'expired']);\n/** `session.closed` reasons after which the conversation goes on here: reconnect (idle, on the next input). */\n/** `server_restart`: reserved (the gateway does not send it today); the same session is reconnected to. */\nconst RECONNECTABLE = new Set(['server_restart']);\n/** The session ended, the conversation goes on: a new session on the next action. */\nconst NEW_SESSION = new Set(['idle', 'expired', 'limit_reached']);\nconst KEEP = 100;\n\ntype Mutable<T> = { -readonly [K in keyof T]: T[K] };\ninterface Card {\n id: string;\n kind: string;\n card: Record<string, unknown>;\n question?: Mutable<HeldQuestion>;\n locked: string[];\n turnId?: string;\n outcome?: string | null;\n /** The `client_event_id` that reported `outcome`. */\n outcomeBy?: string;\n seq: number;\n}\n\nconst str = (v: unknown): string | undefined =>\n typeof v === 'string' ? v : undefined;\n\n// TypeScript `private` rather than `#` fields: the package ships ES2022 as is, and Hermes (React Native) has no\n// `#` private fields.\nexport class ConversationEngine {\n private sessionId: string | null = null;\n private conversationId: string | null = null;\n private connection: Mutable<Connection> | null = null;\n private reconnect: Reconnect = 'allowed';\n private messages: Message[] = [];\n private cards = new Map<string, Card>();\n private unacknowledged = new Map<string, Frame>();\n private resend: string[] = [];\n private held: string[] = [];\n private refused: Record<string, string> = {};\n private flow: ConversationState['flow'] = null;\n private turn: string | null = null;\n private tools: ToolLine[] = [];\n private handoffs: unknown[] = [];\n private errors: string[] = [];\n private expiring: number | null = null;\n private streaming: Streaming | null = null;\n private takeover: Takeover | null = null;\n private rejections: Record<string, { code: string; message: string }> = {};\n private disclosure: string | null = null;\n private turnsLeft: number | null = null;\n /** The next arrival number for a message or a card. */\n private seq = 0;\n /** The cards drawn before a resumed flow's transcript replaced them: proposal outcomes carry over. */\n private replaced: Map<string, Card> | null = null;\n /** client_event_id → the first event the app sent under it, until it is settled. */\n private readonly inputs = new Map<string, Frame>();\n\n // ------------------------------------------------------------ what happens around the frames\n\n /** The tenant's backend created a session (and named its conversation). */\n sessionCreated(sessionId: string, conversationId?: string | null): void {\n this.sessionId = sessionId;\n this.conversationId = conversationId ?? null;\n }\n\n /** A connection opened: the user's own action, or an allowed reconnect, so it lifts a hold on reconnecting. */\n connected(name: string): void {\n this.connection = { name, state: 'open' };\n this.reconnect = 'allowed';\n }\n\n /** A connection closed with its code. `4403` (revoked) and `4409` (replaced) hold reconnecting for a user action. */\n closed(name: string, code: number): void {\n if (this.connection?.name !== name) return;\n this.connection.state = 'closed';\n this.connection.code = code;\n // The session.closed reason decides when one preceded the close ({idle} then 4403 is still a new session on the\n // next action); the close code decides only on its own: 4403 and 4409 wait for the person, 4408 wants a new\n // session.\n if (this.connection.reason === undefined) {\n if (code === 4403 || code === 4409) this.reconnect = 'user_action_only';\n else if (code === 4408) this.reconnect = 'new_session_on_next_action';\n }\n this.cutOff('interrupted');\n this.turn = null;\n }\n\n /** The app was killed: what it drew is gone; what it sent and never saw acknowledged it kept, to resend. */\n killed(): void {\n this.messages = [];\n this.cards = new Map();\n this.turn = null;\n this.streaming = null;\n this.takeover = null; // announced again on the next connection's session.ready, if it goes on\n }\n\n // ------------------------------------------------------------ what the app sends\n\n sent(event: Frame): void {\n const id = str(event.client_event_id);\n switch (event.type) {\n case 'ui.answer': {\n if (id === undefined) return;\n if (!this.inputs.has(id)) this.inputs.set(id, event);\n this.unqueue(id);\n this.unacknowledged.set(id, event);\n const card = this.cards.get(str(event.card_id) ?? '');\n const questionId = str(event.question_id);\n if (card && questionId) lock(card, questionId);\n return;\n }\n case 'input.text': {\n if (id === undefined) return;\n if (!this.inputs.has(id)) this.inputs.set(id, event);\n this.unqueue(id);\n delete this.refused[id];\n this.unacknowledged.set(id, event);\n return;\n }\n case 'ui.action': {\n if (id !== undefined) {\n if (!this.inputs.has(id)) this.inputs.set(id, event);\n this.unqueue(id);\n this.unacknowledged.set(id, event);\n }\n const card = this.cards.get(str(event.card_id) ?? '');\n const action = str(event.action);\n if (\n card?.kind === 'proposal' &&\n action &&\n OUTCOMES.has(action) &&\n card.outcome === null\n ) {\n card.outcome = action;\n if (id !== undefined) card.outcomeBy = id;\n }\n return;\n }\n default:\n return;\n }\n }\n\n // ------------------------------------------------------------ what the server sends\n\n received(event: Frame): void {\n switch (event.type) {\n case 'session.ready':\n this.ready(event);\n return;\n case 'turn.started': {\n this.turn = str(event.turn_id) ?? null;\n const id = str(event.client_event_id);\n if (id !== undefined) {\n const sent = this.inputs.get(id);\n this.settle(id);\n if (sent?.type === 'input.text') {\n this.say('person', str(sent.text) ?? '', id);\n }\n }\n return;\n }\n case 'message.delta': {\n const turnId = str(event.turn_id) ?? '';\n const text = str(event.text) ?? '';\n if (this.streaming?.turnId === turnId)\n this.streaming = {\n ...this.streaming,\n text: this.streaming.text + text,\n };\n else {\n this.cutOff('interrupted'); // another turn's text, never completed\n this.streaming = { turnId, text, seq: this.seq++ };\n }\n return;\n }\n case 'message.completed': {\n const turnId = str(event.turn_id) ?? '';\n const streaming =\n this.streaming?.turnId === turnId ? this.streaming : null;\n if (streaming) this.streaming = null;\n this.say(\n 'assistant',\n str(event.text) ?? '',\n `a:${turnId}`,\n {},\n streaming?.seq,\n );\n return;\n }\n case 'ui.cards':\n for (const card of asArray(event.cards))\n this.hold(card, str(event.turn_id));\n return;\n case 'tool.status': {\n const line = {\n turn_id: str(event.turn_id) ?? '',\n label: str(event.label) ?? '',\n state: str(event.state) ?? '',\n };\n const at = this.tools.findIndex(\n (t) => t.turn_id === line.turn_id && t.label === line.label,\n );\n if (at === -1) this.tools = [...this.tools, line].slice(-KEEP);\n else this.tools[at] = line;\n return;\n }\n case 'handoff.created':\n this.handoffs.push(event.ticket);\n return;\n case 'turn.completed':\n this.turn = null;\n return;\n case 'turn.failed': {\n // What streamed before the failure stands (§6), cut off: blocked, interrupted (a takeover) or failed.\n const code = str(event.code) ?? '';\n if (this.streaming?.turnId === str(event.turn_id))\n this.cutOff(\n code === 'output_blocked'\n ? 'blocked'\n : code === 'cancelled'\n ? 'interrupted'\n : 'failed',\n );\n this.turn = null;\n this.error(code);\n return;\n }\n case 'takeover.started':\n this.takeover = {\n by: str(event.by) ?? null,\n at: str(event.at) ?? '',\n };\n return;\n case 'takeover.ended':\n this.takeover = null;\n return;\n case 'message.staff': {\n const id = str(event.message_id);\n if (id !== undefined)\n this.say('staff', str(event.text) ?? '', `s:${id}`);\n return;\n }\n case 'input.received': {\n // During a takeover: the text was recorded for the business; no turn runs, and it is never resent.\n const id = str(event.client_event_id);\n if (id === undefined) return;\n const sent = this.inputs.get(id);\n this.settle(id);\n if (sent?.type === 'input.text')\n this.say('person', str(sent.text) ?? '', id, { received: true });\n return;\n }\n case 'ui.answer.recorded':\n this.recorded(event);\n return;\n case 'ui.answer.rejected':\n this.rejected(event);\n return;\n case 'input.rejected':\n this.inputRejected(event);\n return;\n case 'flow.completed': {\n const result = str(event.result) ?? '';\n this.flow = {\n flow: event.flow,\n result: (FLOW_RESULTS.has(result) ? result : 'failed') as\n | 'ok'\n | 'refused'\n | 'failed',\n };\n return;\n }\n case 'session.closed': {\n const reason = str(event.reason);\n // No reason (a malformed frame): read as a bare close, so the close code that follows decides.\n if (reason === undefined) return;\n // Idle, expired, limit_reached: the session is over, the conversation is not; a new session on the next\n // action. A server restart (reserved): the same session again. Replaced, revoked, or a reason this client\n // does not know (read as revoked): only on a user action.\n if (NEW_SESSION.has(reason))\n this.reconnect = 'new_session_on_next_action';\n else if (!RECONNECTABLE.has(reason))\n this.reconnect = 'user_action_only';\n if (this.connection) this.connection.reason = reason;\n return;\n }\n case 'session.expiring':\n this.expiring =\n typeof event.seconds_left === 'number' ? event.seconds_left : null;\n return;\n case 'error': {\n this.error(str(event.code) ?? '');\n const id = str(event.client_event_id);\n // An older server's retryable error for an unchecked input: handled as input.rejected.\n if (id !== undefined && event.code === 'screen_unavailable') {\n this.inputRejected(event);\n } else if (id !== undefined) {\n this.settle(id);\n }\n return;\n }\n default:\n return; // an event type this client does not know is ignored\n }\n }\n\n private ready(event: Frame): void {\n const session = event.session as { id?: unknown } | undefined;\n this.sessionId = str(session?.id) ?? this.sessionId;\n this.turn = null;\n this.expiring = null;\n this.disclosure = str(event.disclosure) ?? this.disclosure;\n const limits = event.limits as { turns_left?: unknown } | undefined;\n this.turnsLeft =\n typeof limits?.turns_left === 'number' ? limits.turns_left : null;\n // A takeover still in progress is announced again after session.ready (§8).\n this.takeover = null;\n this.cutOff('interrupted');\n if (event.resumed !== true) return;\n // A resumed session brings the server's view of the conversation. With the live ids (v1-draft.17) it merges\n // into what the app holds, so older history the app loaded stays; without them it replaces what the app drew.\n if (event.transcript !== undefined && transcriptHasIds(event.transcript)) {\n this.mergeTranscript(asArray(event.transcript));\n } else if (event.transcript !== undefined) {\n this.messages = [];\n this.replaced = this.cards;\n this.cards = new Map();\n for (const item of asArray(event.transcript)) {\n if (item.role === 'card')\n this.hold(item.card as Record<string, unknown>);\n else {\n const role = str(item.role) ?? '';\n this.say(\n role,\n str(item.text) ?? '',\n transcriptKey(role, str(item.id), str(item.at)),\n item.interrupted === true ? { partial: 'interrupted' } : {},\n );\n }\n }\n }\n // The open question, and the proposals still awaiting an outcome.\n for (const card of asArray(event.pending_cards))\n this.hold(card, str(card.turn_id));\n this.replaced = null;\n }\n\n /**\n * A transcript merged by key: an item the app holds keeps its place, with the text the server recorded; one it does\n * not hold goes just after the nearest earlier item it does (just before the first later one when none came before,\n * at the end when it holds none of them). Nothing the app holds is dropped.\n */\n private mergeTranscript(items: Record<string, unknown>[]): void {\n const seqOf = (key: string | undefined) =>\n key === undefined\n ? undefined\n : (this.messages.find((m) => m.key === key) ?? this.cards.get(key))\n ?.seq;\n const keys = items.map((item) =>\n item.role === 'card'\n ? str((item.card as Frame | undefined)?.id)\n : transcriptKey(str(item.role) ?? '', str(item.id), str(item.at)),\n );\n let prev: number | undefined;\n items.forEach((item, i) => {\n const key = keys[i];\n if (key === undefined) return;\n const known = seqOf(key);\n let at: number | undefined;\n if (known === undefined) {\n // Halfway to the nearest held item: after the one before, or before the first one after; else at the end.\n const near =\n prev ??\n keys\n .slice(i + 1)\n .map(seqOf)\n .find((q) => q !== undefined);\n if (near !== undefined) {\n const seqs = [...this.messages, ...this.cards.values()].map(\n (h) => h.seq,\n );\n const bound =\n prev === undefined\n ? Math.max(near - 1, ...seqs.filter((q) => q < near))\n : Math.min(...seqs.filter((q) => q > near));\n if (Number.isFinite(bound)) at = (near + bound) / 2;\n }\n }\n if (item.role === 'card') this.hold(item.card as Frame, undefined, at);\n else {\n const text = str(item.text) ?? '';\n const partial = item.interrupted === true ? 'interrupted' : undefined;\n if (known === undefined)\n this.say(\n str(item.role) ?? '',\n text,\n key,\n partial ? { partial } : {},\n at,\n );\n else\n this.messages = this.messages.map((m) => {\n if (m.key !== key) return m;\n // The server's record stands: a reply cut off here but finished there is whole again.\n const { partial: local, ...rest } = m;\n const kept =\n partial ?? (local === 'interrupted' ? undefined : local);\n return {\n ...rest,\n text: text || m.text,\n ...(kept ? { partial: kept } : {}),\n };\n });\n }\n prev = seqOf(key);\n });\n this.messages.sort((a, b) => a.seq - b.seq);\n }\n\n private hold(\n raw: Record<string, unknown> | undefined,\n turnId?: string,\n at?: number,\n ): void {\n if (!raw) return;\n const id = str(raw.id);\n if (id === undefined) return;\n const kind = str(raw.kind) ?? '';\n const question = raw.question as Mutable<HeldQuestion> | undefined;\n const card: Card = {\n id,\n kind,\n card: raw,\n ...(question ? { question: structuredCopy(question) } : {}),\n locked: lockedFrom(question),\n ...(turnId !== undefined ? { turnId } : {}),\n // A card still held keeps its place when it is drawn again (a reconnect's pending cards, a repeated ui.cards).\n seq: this.cards.get(id)?.seq ?? at ?? this.seq++,\n };\n // A held answer keeps its question locked until it is resent (§2), however the card is drawn again (a resumed\n // session.ready, or a turn's ui.cards before the resend).\n for (const held of this.held) {\n const sent = this.inputs.get(held);\n if (sent?.type === 'ui.answer' && sent.card_id === id) {\n const questionId = str(sent.question_id);\n if (questionId !== undefined) lock(card, questionId);\n }\n }\n if (kind === 'proposal') {\n // Drawn again (a resumed session's pending cards, a repeated ui.cards): the outcome reported stands.\n const held = this.cards.get(id) ?? this.replaced?.get(id);\n card.outcome = held?.outcome ?? null;\n if (held?.outcomeBy !== undefined) card.outcomeBy = held.outcomeBy;\n }\n this.cards.delete(id); // newest last\n this.cards.set(id, card);\n }\n\n private recorded(event: Frame): void {\n const id = str(event.client_event_id) ?? '';\n const card = this.cards.get(str(event.card_id) ?? '');\n const sent = this.inputs.get(id);\n this.settle(id);\n if (!card?.question || !sent) return;\n const q = card.question;\n const questionId = str(event.question_id) ?? '';\n lock(card, questionId);\n if (q.kind === 'rate_each') {\n const rows = (q.row_answers ?? []).filter(\n (r) => r.question_id !== questionId,\n );\n q.row_answers = [\n ...rows,\n { question_id: questionId, answer: sent.answer },\n ];\n const answered = q.row_answers;\n if (\n (q.rows ?? []).every((r) =>\n answered.some((a) => a.question_id === r.question_id),\n )\n ) {\n q.state = 'answered';\n lock(card, q.question_id); // every row answered: the whole card is locked\n }\n } else {\n q.answer = sent.answer;\n q.state = 'answered';\n }\n }\n\n private rejected(event: Frame): void {\n this.settle(str(event.client_event_id) ?? '');\n const card = this.cards.get(str(event.card_id) ?? ''); // a rejected answer shows on its question\n const questionId = str(event.question_id);\n if (!card || questionId === undefined) return;\n if (UNLOCKS_KEEP_LOCKED.has(str(event.code) ?? '')) lock(card, questionId);\n else unlock(card, questionId); // the four unlocking codes, and any code this client does not know\n }\n\n private inputRejected(event: Frame): void {\n const id = str(event.client_event_id);\n if (id === undefined) return;\n this.unacknowledged.delete(id);\n const code = str(event.code) ?? '';\n this.rejections[id] = { code, message: str(event.message) ?? '' };\n if (RESEND.has(code)) {\n if (!this.resend.includes(id)) this.resend.push(id);\n return;\n }\n if (code === 'limit_reached') {\n // The session has no turns left (the socket stays open; no session.closed follows). A text or an answer never\n // ran: it is held for the next session of the conversation, which only the tenant's backend creates, on the\n // person's next action, and resent there under the same id, never in this session (it would get the same\n // refusal). An action is dropped: a new session cannot act on an earlier session's card.\n this.unqueue(id);\n const kind = this.inputs.get(id)?.type;\n if (kind === 'input.text' || kind === 'ui.answer') {\n if (!this.held.includes(id)) this.held.push(id);\n } else this.inputs.delete(id); // an action, or nothing this client sent\n this.reconnect = 'new_session_on_next_action';\n return;\n }\n // screened, guardrail, an unknown code…: shown as not sent, never resent. A duplicate's earlier turn stands.\n if (code !== 'duplicate') this.refused[id] = code;\n const sent = this.inputs.get(id);\n if (code === 'guardrail' && sent?.type === 'input.text') {\n // The tenant's refusal is the agent's reply to the person's text (§6).\n this.say('person', str(sent.text) ?? '', id);\n this.say('assistant', str(event.message) ?? '', `r:${id}`, {\n refusal: true,\n });\n }\n this.inputs.delete(id);\n }\n\n /** No longer to resend, nor held for the next session (sent again, or settled). */\n private unqueue(id: string): void {\n this.resend = this.resend.filter((r) => r !== id);\n this.held = this.held.filter((r) => r !== id);\n }\n\n /** An input acknowledged or refused for good: nothing more is resent under its id. */\n private settle(id: string): void {\n delete this.rejections[id]; // a refusal for now (turn_in_progress, screen_unavailable) no longer applies\n this.unacknowledged.delete(id);\n this.inputs.delete(id);\n this.unqueue(id); // a copy sent twice can be answered after a refusal\n }\n\n /** Adds a message once: a key already held (a frame seen twice) changes nothing. */\n private say(\n role: string,\n text: string,\n key: string,\n extra: Pick<Message, 'partial' | 'received' | 'refusal'> = {},\n seq?: number,\n ): void {\n if (this.messages.some((m) => m.key === key)) return;\n this.messages.push({ role, text, key, seq: seq ?? this.seq++, ...extra });\n }\n\n /** The turn's streamed text, kept as the agent's message when the turn ends without its `message.completed`. */\n private cutOff(partial: NonNullable<Message['partial']>): void {\n const streaming = this.streaming;\n this.streaming = null;\n // Stored as the runtime records it: trimmed (the reference client does the same).\n const text = streaming?.text.trim();\n if (streaming && text)\n this.say(\n 'assistant',\n text,\n `a:${streaming.turnId}`,\n { partial },\n streaming.seq,\n );\n }\n\n private error(code: string): void {\n this.errors = [...this.errors, code].slice(-KEEP);\n }\n\n /**\n * An input that could not be delivered, or whose retries are spent (`screen_unavailable` after the last try): it is\n * no longer resent. A typed message is shown as not sent, with `code`; an answer's question unlocks so the person\n * can answer again; a proposal outcome it reported is taken back, so it can be reported again.\n */\n giveUp(clientEventId: string, code: string): void {\n const sent = this.inputs.get(clientEventId);\n if (!sent) return;\n const rejection = this.rejections[clientEventId];\n this.resend = this.resend.filter((r) => r !== clientEventId);\n this.settle(clientEventId);\n const card = this.cards.get(str(sent.card_id) ?? '');\n if (sent.type === 'input.text') {\n this.refused[clientEventId] = code;\n if (rejection) this.rejections[clientEventId] = rejection; // its last message, shown with \"not sent\"\n } else if (sent.type === 'ui.answer') {\n const questionId = str(sent.question_id);\n if (card && questionId !== undefined) unlock(card, questionId);\n } else if (card?.outcomeBy === clientEventId) {\n card.outcome = null;\n delete card.outcomeBy;\n }\n }\n\n /** A turn the app stopped where no event will say so (an SSE turn cancelled): none is in progress. */\n turnEnded(): void {\n this.turn = null;\n }\n\n // ------------------------------------------------------------ reading it\n\n /** The event first sent under a `client_event_id`, to resend it unchanged. */\n input(clientEventId: string): Frame | undefined {\n return this.inputs.get(clientEventId);\n }\n\n state(): ConversationState {\n const cards = [...this.cards.values()].map(freeze);\n const open = cards.filter(\n (c) => c.kind === 'question' && c.question?.state === 'open',\n );\n return {\n sessionId: this.sessionId,\n conversationId: this.conversationId,\n connection: this.connection ? { ...this.connection } : null,\n reconnect: this.reconnect,\n messages: [...this.messages],\n cards,\n openQuestion: open.length ? (open[open.length - 1] as HeldCard).id : null,\n unacknowledged: [...this.unacknowledged.values()],\n resend: [...this.resend],\n held: [...this.held],\n refused: { ...this.refused },\n flow: this.flow,\n turn: this.turn,\n tools: [...this.tools],\n handoffs: [...this.handoffs],\n errors: [...this.errors],\n streaming: this.streaming,\n takeover: this.takeover,\n rejections: { ...this.rejections },\n disclosure: this.disclosure,\n turnsLeft: this.turnsLeft,\n heldForNextSession:\n this.reconnect === 'new_session_on_next_action'\n ? [\n ...new Set([\n ...this.unacknowledged.keys(),\n ...this.resend,\n ...this.held,\n ]),\n ]\n : [],\n expiring: this.expiring,\n };\n }\n}\n\n/**\n * A transcript item's key: the live one when the server names it (`id`, v1-draft.17: the turn, the\n * `client_event_id` or the staff `message_id`), so a resumed message keeps the key it was drawn under; its time and\n * role from an older server.\n */\nfunction transcriptKey(\n role: string,\n id: string | undefined,\n at: string | undefined,\n): string {\n if (id === undefined) return `t:${at ?? ''}:${role}`;\n if (role === 'assistant') return `a:${id}`;\n if (role === 'staff') return `s:${id}`;\n return id;\n}\n\n/**\n * Whether a resumed transcript names every message by its live id (v1-draft.17), so it can merge into what the app\n * holds by key. A card item is named by its card's `id`.\n */\nexport function transcriptHasIds(transcript: unknown): boolean {\n return asArray(transcript).every((item) =>\n item.role === 'card'\n ? str((item.card as Record<string, unknown> | undefined)?.id) !==\n undefined\n : str(item.id) !== undefined,\n );\n}\n\nfunction lockedFrom(question: HeldQuestion | undefined): string[] {\n if (!question) return [];\n if (question.state !== 'open') {\n return [\n question.question_id,\n ...(question.rows ?? []).map((r) => r.question_id),\n ];\n }\n return (question.row_answers ?? []).map((r) => r.question_id);\n}\n\nfunction lock(card: Card, id: string): void {\n if (!card.locked.includes(id)) card.locked.push(id);\n}\n\nfunction unlock(card: Card, id: string): void {\n card.locked = card.locked.filter((q) => q !== id);\n}\n\nfunction freeze(card: Card): HeldCard {\n return {\n id: card.id,\n kind: card.kind,\n card: card.card,\n ...(card.question ? { question: { ...card.question } } : {}),\n locked: [...card.locked],\n ...(card.turnId !== undefined ? { turnId: card.turnId } : {}),\n ...(card.outcome !== undefined ? { outcome: card.outcome } : {}),\n seq: card.seq,\n };\n}\n\nfunction asArray(value: unknown): Record<string, unknown>[] {\n return Array.isArray(value) ? (value as Record<string, unknown>[]) : [];\n}\n\nfunction structuredCopy<T>(value: T): T {\n return JSON.parse(JSON.stringify(value)) as T;\n}\n","import { VinaverseClientError } from './errors.js';\n\nconst CLIENT_SECRET = /^vv_cs_[A-Za-z0-9_-]{16,}$/;\n\n/**\n * The client secret, checked: an app holds only the session's `vv_cs_` secret, which the tenant's backend got from\n * createSession. A service key is refused outright, so it never reaches a socket or a request from an app. The error\n * never repeats the value.\n */\nexport function clientSecret(value: unknown): string {\n const secret =\n typeof value === 'object' && value !== null\n ? (value as { value?: unknown }).value\n : value;\n if (typeof secret === 'string' && secret.startsWith('vv_sk_')) {\n throw new VinaverseClientError(\n 'service_key',\n 'A Vinaverse service key belongs on your backend only. Pass the session client secret (vv_cs_…) to the app.',\n );\n }\n if (typeof secret !== 'string' || !CLIENT_SECRET.test(secret)) {\n throw new VinaverseClientError(\n 'invalid_secret',\n 'Expected a session client secret (vv_cs_…).',\n );\n }\n return secret;\n}\n","// The SSE fallback (createTurnSse, createCardActionSse): one POST per turn, whose response streams that turn's\n// ServerEvents. Each SSE event's `event:` is a ServerEvent `type` and its `data:` the event JSON.\n\nimport type { Frame } from './engine.js';\nimport { VinaverseClientError } from './errors.js';\n\n/** The largest SSE event read: a ServerEvent is far smaller; more means the stream is not what it should be. */\nconst MAX_EVENT_CHARS = 1024 * 1024;\n\nexport type FetchLike = (input: string, init: RequestInit) => Promise<Response>;\n\n/** One SSE request: where and with which secret, and the `fetch` to use. */\nexport interface SseTarget {\n /** The session's `turns_url` (`…/v1/sessions/{session_id}/turns`). */\n readonly turnsUrl: string;\n readonly secret: string;\n readonly fetch?: FetchLike;\n readonly signal?: AbortSignal;\n}\n\n/** Run one turn from a typed message (`createTurnSse`), yielding its events as they arrive. */\nexport function turnSse(\n target: SseTarget,\n input: { text: string; client_event_id?: string },\n): AsyncGenerator<Frame> {\n return post(target, target.turnsUrl, input);\n}\n\n/** Send a card action, such as a proposal outcome, and stream the resulting turn (`createCardActionSse`). */\nexport function cardActionSse(\n target: SseTarget,\n turnId: string,\n input: { card_id: string; action: string; client_event_id?: string },\n): AsyncGenerator<Frame> {\n return post(\n target,\n `${target.turnsUrl.replace(/\\/+$/, '')}/${encodeURIComponent(turnId)}/actions`,\n input,\n );\n}\n\nasync function* post(\n target: SseTarget,\n url: string,\n body: unknown,\n): AsyncGenerator<Frame> {\n const doFetch = target.fetch ?? globalThis.fetch;\n const response = await doFetch(url, {\n method: 'POST',\n headers: {\n authorization: `Bearer ${target.secret}`,\n 'content-type': 'application/json',\n accept: 'text/event-stream',\n },\n body: JSON.stringify(body),\n ...(target.signal ? { signal: target.signal } : {}),\n });\n if (!response.ok) {\n throw new VinaverseClientError(\n 'http_error',\n `The turn request failed with HTTP ${response.status}.`,\n response.status,\n );\n }\n // React Native's fetch has no streaming body: the events then arrive together, when the turn ends.\n const chunks = response.body\n ? decode(response.body)\n : once(await response.text());\n yield* sseFrames(chunks);\n}\n\n/** Frames from an SSE text stream: blank-line separated events, `data:` lines joined; comments and non-JSON skipped. */\nexport async function* sseFrames(\n chunks: AsyncIterable<string>,\n): AsyncGenerator<Frame> {\n let buffer = '';\n for await (const chunk of chunks) {\n buffer += chunk;\n if (buffer.length > MAX_EVENT_CHARS && boundary(buffer) === null) {\n throw new VinaverseClientError(\n 'http_error',\n 'An SSE event is larger than 1 MiB.',\n );\n }\n let end = boundary(buffer);\n while (end !== null) {\n const frame = parseEvent(buffer.slice(0, end.at));\n buffer = buffer.slice(end.at + end.length);\n if (frame) yield frame;\n end = boundary(buffer);\n }\n }\n const last = parseEvent(buffer);\n if (last) yield last;\n}\n\nfunction boundary(buffer: string): { at: number; length: number } | null {\n const match = /\\r?\\n\\r?\\n|\\r\\r/.exec(buffer);\n return match ? { at: match.index, length: match[0].length } : null;\n}\n\nfunction parseEvent(block: string): Frame | null {\n let type: string | undefined;\n const data: string[] = [];\n for (const line of block.split(/\\r?\\n|\\r/)) {\n if (line === '' || line.startsWith(':')) continue;\n const colon = line.indexOf(':');\n const field = colon === -1 ? line : line.slice(0, colon);\n let value = colon === -1 ? '' : line.slice(colon + 1);\n if (value.startsWith(' ')) value = value.slice(1);\n if (field === 'event') type = value;\n else if (field === 'data') data.push(value);\n }\n if (data.length === 0) return null;\n let parsed: unknown;\n try {\n parsed = JSON.parse(data.join('\\n'));\n } catch {\n return null;\n }\n if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed))\n return null;\n const frame = parsed as Record<string, unknown>;\n const kind = typeof frame.type === 'string' ? frame.type : type;\n return kind === undefined ? null : ({ ...frame, type: kind } as Frame);\n}\n\nasync function* decode(\n body: ReadableStream<Uint8Array>,\n): AsyncGenerator<string> {\n const reader = body.getReader();\n const decoder = new TextDecoder();\n try {\n for (;;) {\n const { done, value } = await reader.read();\n if (done) break;\n yield decoder.decode(value, { stream: true });\n }\n const rest = decoder.decode();\n if (rest) yield rest;\n } finally {\n reader.releaseLock();\n }\n}\n\nasync function* once(text: string): AsyncGenerator<string> {\n yield text;\n}\n","// The realtime session for apps: one conversation with an agent over the WebSocket (docs/realtime-protocol.md), with the\n// SSE turns as the fallback. It authenticates with the session's client secret only, reconnects and resumes from\n// `session.ready`, resends what was never acknowledged under the same `client_event_id`, retries what was refused\n// for now, and holds the conversation's state in a ConversationEngine. Headless: an app draws from `state`.\nimport {\n ConversationEngine,\n type ConversationState,\n type Frame,\n} from './engine.js';\nimport { VinaverseClientError } from './errors.js';\nimport type {\n AnswerInput,\n ClientEvent,\n ClientSecret,\n ProposalOutcome,\n ServerEvent,\n SessionInfo,\n} from './events.js';\nimport { clientSecret } from './secret.js';\nimport { cardActionSse, type FetchLike, turnSse } from './sse.js';\n\n/** The part of a WebSocket the session uses: the browser, React Native and Node 22+ ones all fit. */\nexport interface WebSocketLike {\n readonly readyState: number;\n send(data: string): void;\n close(code?: number, reason?: string): void;\n onopen: ((event: unknown) => void) | null;\n onmessage: ((event: { data: unknown }) => void) | null;\n onclose: ((event: { code: number; reason?: string }) => void) | null;\n onerror: ((event: unknown) => void) | null;\n}\n\n/**\n * Opens a WebSocket. `headers` is set only with `auth: 'header'`. The default factory passes them as React Native's\n * WebSocket takes them (its third argument) or, on Node 22+, as its WebSocket does (`{ protocols, headers }`); a\n * browser's WebSocket cannot send headers, so browsers use the subprotocol.\n */\nexport type WebSocketFactory = (\n url: string,\n protocols: string[],\n headers?: Record<string, string>,\n) => WebSocketLike;\n\n/** How the client secret reaches the server (§1); the secret never goes in the URL. */\nexport type AuthMode = 'header' | 'subprotocol' | 'first_frame';\n\nexport type SessionStatus =\n /** Opening a connection, or waiting for `session.ready`. */\n | 'connecting'\n /** `session.ready` arrived: events flow. */\n | 'ready'\n /** Waiting to reconnect after the connection dropped. */\n | 'reconnecting'\n /** Disconnected; connects again on the next send or `connect()`. */\n | 'idle'\n /** Running turns over SSE, because the WebSocket could not be opened (twice); `connect()` tries it again. */\n | 'sse'\n /**\n * The session ended. `state.reconnect` says what next: `new_session_on_next_action` after it ended idle, expired\n * or at its limit (have your backend create a new session for the conversation on the person's next action, then\n * `resume()` it; what they send meanwhile is held and resent there), or `user_action_only` (the conversation\n * continued elsewhere, or the session was revoked: resume only when the person asks).\n */\n | 'ended'\n /** The client secret was refused (4401) and no fresh one could be had. */\n | 'unauthorized'\n /** Closed by the app. */\n | 'closed';\n\nexport interface SessionOptions {\n /** The session the tenant's backend created: its `id`, `realtime_url`, `turns_url` and `client_secret`. */\n readonly session: SessionInfo;\n /**\n * A fresh client secret for the session named, from the tenant's backend (refreshClientSecret is a service-key\n * call), when the server refuses the current one (4401): for example after the first connection's window (two\n * minutes from issue on the current gateway) passed. It is asked for the session in use; an answer that arrives\n * after `resume()` moved to another session, or after `close()`, is dropped. Without it, a refused secret ends in\n * `unauthorized`.\n */\n readonly refreshSecret?: (\n sessionId: string,\n ) => Promise<ClientSecret | string>;\n /**\n * Default `subprotocol` (`vinaverse.v1, bearer.<secret>`). `header` where the WebSocket takes headers: React\n * Native and Node 22+ with the default factory, or your own `webSocket`.\n */\n readonly auth?: AuthMode;\n /** Default: the global WebSocket. */\n readonly webSocket?: WebSocketFactory;\n /** Default: the global fetch. Used by the SSE fallback. */\n readonly fetch?: FetchLike;\n /** Fall back to SSE turns when the WebSocket cannot be opened. Default true. */\n readonly sseFallback?: boolean;\n /** Delays before reconnecting after a drop, in ms; the last one repeats. Default 1 s doubling to 30 s. */\n readonly reconnectDelays?: readonly number[];\n /** Attempts to reconnect before going `idle`; they count again once a connection stayed up 30 s. Default 8. */\n readonly maxReconnects?: number;\n /** Delays before resending an input refused with `screen_unavailable`, in ms. Default 2 s, 4 s, 8 s. */\n readonly screenRetryDelays?: readonly number[];\n /** The `ping` interval while in the foreground, in ms. Default 25 s. */\n readonly pingInterval?: number;\n /** New `client_event_id`s. Default: random, `ce_` and 22 characters. */\n readonly createId?: () => string;\n /** An engine to continue, for example one an app kept across a restart. */\n readonly engine?: ConversationEngine;\n}\n\nexport interface SessionEvents {\n /**\n * Every event the server sends, `message.delta` included. A type this client does not know arrives too (§5), so a\n * `switch` on `type` keeps a default branch.\n */\n event: ServerEvent;\n /** The conversation's state changed. */\n state: ConversationState;\n status: SessionStatus;\n /**\n * Something failed that no call returned: an input that could not be delivered (it is also shown as not sent in\n * the state), an SSE turn, or getting a fresh secret.\n */\n error: VinaverseClientError;\n}\n\ntype Listener<T> = (value: T) => void;\n\nconst OPEN = 1;\nconst SUBPROTOCOL = 'vinaverse.v1';\nconst DEFAULT_RECONNECT = [1000, 2000, 4000, 8000, 16000, 30000];\nconst DEFAULT_SCREEN_RETRY = [2000, 4000, 8000];\nconst NO_RECONNECT = new Set([4403, 4409]);\n/** Failed first connections before falling back to SSE. */\nconst FALLBACK_AFTER = 2;\n/** A connection up this long gives the reconnect budget back. */\nconst STABLE_MS = 30_000;\n\n/** Why an SSE request was stopped. */\ntype Stop = 'close' | 'cancel';\n\n/** An SSE request in flight: the input it delivers, and why it was stopped (tracked here, not in the signal). */\ninterface Stream {\n readonly id: string | undefined;\n stop?: Stop;\n}\n\n// TypeScript `private` rather than `#` fields: the package ships ES2022 as is, and Hermes (React Native) has no\n// `#` private fields.\nexport class VinaverseSession {\n readonly engine: ConversationEngine;\n private info: SessionInfo;\n private secret: string;\n private readonly options: SessionOptions;\n private socket: WebSocketLike | null = null;\n /** The engine's name for the connection in `socket`, once it opened. */\n private opened: string | null = null;\n private connection = 0;\n private ready = false;\n private current: SessionStatus = 'idle';\n private everOpened = false;\n private firstFailures = 0;\n private attempts = 0;\n /** The reason of the `session.closed` that preceded the close, on the current connection. */\n private closeReason: string | null = null;\n private stableTimer: ReturnType<typeof setTimeout> | undefined;\n /** SSE requests in flight. */\n private readonly streams = new Map<AbortController, Stream>();\n private reconnectTimer: ReturnType<typeof setTimeout> | undefined;\n private pingTimer: ReturnType<typeof setInterval> | undefined;\n private foreground = true;\n private refreshed = false;\n /** client_event_id → why it waits: after the turn, or after a backoff. */\n private readonly waiting = new Map<string, 'turn' | 'screen'>();\n /** client_event_id → the session that refused it for its turn limit: resent only on another session. */\n private readonly heldForSession = new Map<string, string>();\n private readonly screenTries = new Map<string, number>();\n private readonly screenTimers = new Map<\n string,\n ReturnType<typeof setTimeout>\n >();\n private readonly listeners: {\n [K in keyof SessionEvents]: Set<Listener<SessionEvents[K]>>;\n } = {\n event: new Set(),\n state: new Set(),\n status: new Set(),\n error: new Set(),\n };\n\n constructor(options: SessionOptions) {\n this.options = options;\n this.info = options.session;\n this.secret = clientSecret(options.session.client_secret);\n this.engine = options.engine ?? new ConversationEngine();\n this.named(options.session);\n }\n\n /** The engine names the session, and keeps the conversation it already knew when this one does not say. */\n private named(session: SessionInfo): void {\n this.engine.sessionCreated(\n session.id,\n session.conversation_id ?? this.engine.state().conversationId,\n );\n }\n\n get status(): SessionStatus {\n return this.current;\n }\n\n get state(): ConversationState {\n return this.engine.state();\n }\n\n on<K extends keyof SessionEvents>(\n name: K,\n listener: Listener<SessionEvents[K]>,\n ): () => void {\n this.listeners[name].add(listener);\n return () => this.listeners[name].delete(listener);\n }\n\n // ------------------------------------------------------------ connecting\n\n /**\n * Connect, or reconnect: the user's own action, so it also resumes after the conversation continued elsewhere\n * or the secret was refused.\n */\n connect(): void {\n if (this.current === 'closed') throw ended();\n if (this.engine.state().reconnect === 'new_session_on_next_action') {\n // The secret is spent: a connection with it would only be refused (and read as \"continued elsewhere\").\n throw new VinaverseClientError(\n 'needs_new_session',\n 'This session has ended; create a new session for the conversation and call resume() with it.',\n );\n }\n this.start();\n }\n\n private start(): void {\n this.cancelReconnect();\n this.attempts = 0;\n this.refreshed = false;\n this.open();\n }\n\n /**\n * Continue the conversation on a new session the tenant's backend created for it (by `conversation_key` or\n * `conversation_id`): its `session.ready` brings the transcript and pending cards, and what was never\n * acknowledged is resent there. A user action, like `connect()`.\n */\n resume(session: SessionInfo): void {\n const secret = clientSecret(session.client_secret);\n if (this.current === 'closed') throw ended();\n this.info = session;\n this.secret = secret;\n this.named(session);\n this.drop(1000);\n this.start();\n }\n\n /** Close for good: the connection, any SSE turn still streaming, and every timer. */\n close(): void {\n this.cancelReconnect();\n this.drop(1000);\n this.stopSse('close');\n for (const timer of this.screenTimers.values()) clearTimeout(timer);\n this.screenTimers.clear();\n this.setStatus('closed');\n }\n\n /** Ping only while the app is in the foreground (every 25 s); in the background the connection may idle out. */\n setForeground(foreground: boolean): void {\n this.foreground = foreground;\n if (foreground && this.ready) this.startPing();\n else this.stopPing();\n }\n\n private open(): void {\n this.drop(1000);\n const factory = this.options.webSocket ?? defaultWebSocket();\n if (!factory) {\n this.fallBack();\n return;\n }\n const auth = this.options.auth ?? 'subprotocol';\n const protocols =\n auth === 'subprotocol'\n ? [SUBPROTOCOL, `bearer.${this.secret}`]\n : [SUBPROTOCOL];\n const headers =\n auth === 'header'\n ? { authorization: `Bearer ${this.secret}` }\n : undefined;\n const name = `c${++this.connection}`;\n this.closeReason = null;\n let socket: WebSocketLike;\n try {\n socket = factory(this.info.realtime_url, protocols, headers);\n } catch {\n this.fallBack();\n return;\n }\n this.socket = socket;\n this.ready = false;\n this.setStatus(this.attempts > 0 ? 'reconnecting' : 'connecting');\n socket.onopen = () => {\n if (this.socket !== socket) return;\n this.opened = name;\n this.everOpened = true;\n this.engine.connected(name);\n this.emitState();\n if (auth === 'first_frame')\n socket.send(\n JSON.stringify({ type: 'session.auth', client_secret: this.secret }),\n );\n };\n socket.onmessage = (event) => {\n if (this.socket === socket) this.frame(event.data);\n };\n socket.onerror = () => {};\n socket.onclose = (event) => {\n if (this.socket !== socket) return;\n const opened = this.opened !== null;\n this.forget(event.code);\n this.afterClose(event.code, opened);\n };\n }\n\n private afterClose(code: number, opened: boolean): void {\n if (this.current === 'closed') return;\n if (this.engine.state().reconnect !== 'allowed' || NO_RECONNECT.has(code)) {\n this.setStatus('ended');\n return;\n }\n if (code === 4401) {\n this.refresh();\n return;\n }\n if (!opened && !this.everOpened) {\n // Never connected yet: try once more before running turns over SSE.\n this.firstFailures++;\n if (\n this.firstFailures >= FALLBACK_AFTER &&\n this.options.sseFallback !== false\n ) {\n this.fallBack();\n return;\n }\n this.scheduleReconnect();\n return;\n }\n // server_restart is reserved (the gateway does not send it today): the same session again, with backoff.\n if (this.closeReason === 'server_restart') {\n this.scheduleReconnect();\n return;\n }\n if (code === 1000) {\n this.setStatus('idle'); // reconnect on the next send\n return;\n }\n this.scheduleReconnect();\n }\n\n /** After a 4401: one fresh secret for the session in use, unless it moved on or was closed meanwhile. */\n private refresh(): void {\n const refreshSecret = this.options.refreshSecret;\n if (!refreshSecret || this.refreshed) {\n this.setStatus('unauthorized');\n return;\n }\n this.refreshed = true;\n const sessionId = this.info.id;\n const current = () =>\n this.current !== 'closed' && this.info.id === sessionId;\n refreshSecret(sessionId)\n .then((fresh) => {\n if (!current()) return;\n this.secret = clientSecret(fresh);\n this.open();\n })\n .catch((error: unknown) => {\n if (!current()) return;\n this.setStatus('unauthorized');\n this.emit('error', asClientError(error, 'invalid_secret'));\n });\n }\n\n private scheduleReconnect(): void {\n const max = this.options.maxReconnects ?? 8;\n if (this.attempts >= max) {\n this.setStatus('idle');\n return;\n }\n const delays = this.options.reconnectDelays ?? DEFAULT_RECONNECT;\n const delay = delays[Math.min(this.attempts, delays.length - 1)] ?? 0;\n this.attempts++;\n this.setStatus('reconnecting');\n this.reconnectTimer = setTimeout(() => {\n this.reconnectTimer = undefined;\n this.open();\n }, delay);\n }\n\n private cancelReconnect(): void {\n if (this.reconnectTimer !== undefined) clearTimeout(this.reconnectTimer);\n this.reconnectTimer = undefined;\n }\n\n private fallBack(): void {\n this.socket = null;\n if (this.options.sseFallback === false) {\n this.setStatus('idle');\n return;\n }\n this.setStatus('sse');\n // What was held for the WebSocket goes over SSE now (an answer cannot: it is shown as not sent); what is\n // already streaming over SSE is not sent twice.\n for (const event of this.engine.state().unacknowledged) this.overSse(event);\n // Inputs waiting for a turn to end: with no SSE turn running, none will end to resend them.\n if (this.streams.size === 0) this.resendWaiting('turn');\n }\n\n /** Close the current connection, if any, without reacting to its close event. */\n private drop(code: number): void {\n const socket = this.socket;\n this.forget(code);\n if (socket && socket.readyState <= OPEN) {\n try {\n socket.close(code);\n } catch {\n // already closing\n }\n }\n }\n\n private forget(code: number): void {\n this.socket = null;\n this.ready = false;\n this.stopPing();\n if (this.stableTimer !== undefined) clearTimeout(this.stableTimer);\n this.stableTimer = undefined;\n if (this.opened !== null) {\n this.engine.closed(this.opened, code);\n this.opened = null;\n this.emitState();\n }\n }\n\n // ------------------------------------------------------------ receiving\n\n private frame(data: unknown): void {\n if (typeof data !== 'string') return;\n let parsed: unknown;\n try {\n parsed = JSON.parse(data);\n } catch {\n return;\n }\n if (\n typeof parsed !== 'object' ||\n parsed === null ||\n typeof (parsed as Frame).type !== 'string'\n )\n return;\n this.receive(parsed as Frame);\n }\n\n private receive(event: Frame): void {\n if (this.current === 'closed') return;\n this.engine.received(event);\n this.emit('event', event as unknown as ServerEvent);\n const id =\n typeof event.client_event_id === 'string'\n ? event.client_event_id\n : undefined;\n switch (event.type) {\n case 'session.ready':\n this.ready = true;\n this.refreshed = false;\n this.firstFailures = 0;\n this.stableTimer = setTimeout(() => {\n this.stableTimer = undefined;\n this.attempts = 0;\n }, STABLE_MS);\n this.setStatus('ready');\n if (this.foreground) this.startPing();\n this.resendUnacknowledged();\n this.resendWaiting('turn');\n this.resendHeldForSession();\n break;\n case 'turn.completed':\n case 'turn.failed':\n // A tap or an answer refused with turn_in_progress during a takeover waits for no turn: the hand-back frees it.\n case 'takeover.ended':\n this.resendWaiting('turn');\n break;\n case 'turn.started':\n case 'ui.answer.recorded':\n case 'ui.answer.rejected':\n if (id !== undefined) this.screenTries.delete(id);\n break;\n case 'input.rejected':\n case 'error':\n this.refusedForNow(event);\n break;\n case 'session.closed':\n // Every reason but server_restart (reserved) ends the session here; the engine says what comes next.\n this.closeReason = typeof event.reason === 'string' ? event.reason : '';\n if (this.engine.state().reconnect !== 'allowed')\n this.setStatus('ended');\n break;\n default:\n break;\n }\n this.emitState();\n }\n\n private refusedForNow(event: Frame): void {\n const id =\n typeof event.client_event_id === 'string'\n ? event.client_event_id\n : undefined;\n if (id === undefined) return;\n if (event.code === 'limit_reached') {\n // No turns left in this session: a text or an answer is held for the next one (resume()); an action is\n // dropped. The session has ended for new input either way.\n this.heldForSession.set(id, this.info.id); // an action is dropped: resending it later finds nothing\n this.setStatus('ended');\n return;\n }\n if (!this.engine.state().resend.includes(id)) return;\n if (event.code === 'turn_in_progress') {\n this.waiting.set(id, 'turn');\n return;\n }\n // screen_unavailable: a short backoff, then the same input under the same id; after the last try, not sent.\n const tries = this.screenTries.get(id) ?? 0;\n const delays = this.options.screenRetryDelays ?? DEFAULT_SCREEN_RETRY;\n if (tries >= delays.length) {\n this.screenTries.delete(id);\n this.waiting.delete(id);\n this.engine.giveUp(id, 'screen_unavailable');\n return;\n }\n this.screenTries.set(id, tries + 1);\n this.waiting.set(id, 'screen');\n this.screenTimers.set(\n id,\n setTimeout(() => {\n this.screenTimers.delete(id);\n if (this.waiting.get(id) === 'screen') this.resend(id);\n }, delays[tries]),\n );\n }\n\n private resendUnacknowledged(): void {\n for (const event of this.engine.state().unacknowledged)\n this.transmit(event);\n }\n\n /** What a turn limit held, on a session other than the one that refused it. */\n private resendHeldForSession(): void {\n for (const [id, refusedIn] of [...this.heldForSession]) {\n if (refusedIn === this.info.id) continue;\n this.heldForSession.delete(id);\n this.resend(id);\n }\n }\n\n private resendWaiting(reason: 'turn'): void {\n for (const [id, why] of [...this.waiting])\n if (why === reason) this.resend(id);\n }\n\n private resend(id: string): void {\n this.waiting.delete(id);\n const event = this.engine.input(id);\n if (!event) return;\n if (this.live() || this.awaitingNewSession()) this.deliver(event);\n else this.hold(event);\n }\n\n /** Keep an input for a later session: unacknowledged, so the next `session.ready` (after resume()) sends it. */\n private hold(event: Frame): void {\n if (this.current === 'closed') return;\n this.engine.sent(event);\n this.emitState();\n }\n\n /** The session ended: retries waiting on a timer would go nowhere, so their inputs are held for the next session. */\n private holdRetries(): void {\n for (const [id, timer] of [...this.screenTimers]) {\n clearTimeout(timer);\n this.screenTimers.delete(id);\n this.waiting.delete(id);\n const event = this.engine.input(id);\n if (event) this.hold(event);\n }\n }\n\n // ------------------------------------------------------------ sending\n\n /** Send a typed message; returns its `client_event_id`. Over SSE it runs the turn there. */\n sendText(text: string): string {\n const id = this.newId();\n this.deliver({ type: 'input.text', text, client_event_id: id });\n return id;\n }\n\n /** Answer a question card (or a `rate_each` row, by the row's `question_id`); returns the `client_event_id`. */\n answer(cardId: string, questionId: string, answer: AnswerInput): string {\n if (this.current === 'sse') {\n throw new VinaverseClientError(\n 'needs_websocket',\n 'Question cards are answered over the WebSocket.',\n );\n }\n const id = this.newId();\n this.deliver({\n type: 'ui.answer',\n client_event_id: id,\n card_id: cardId,\n question_id: questionId,\n answer,\n });\n return id;\n }\n\n /**\n * Report a proposal's outcome after the tenant's backend answered (§6): `confirmed`, `declined`, `failed` or\n * `expired`. The first outcome per card is final. Returns the `client_event_id`.\n */\n reportOutcome(cardId: string, outcome: ProposalOutcome): string {\n return this.action(cardId, outcome);\n }\n\n /** A card action (`ui.action`), named by the card's `id`; the card's turn is taken from the state. */\n action(cardId: string, action: string): string {\n const turnId = this.engine\n .state()\n .cards.find((c) => c.id === cardId)?.turnId;\n if (turnId === undefined)\n throw new RangeError(`No turn is known for card ${cardId}.`);\n const id = this.newId();\n this.deliver({\n type: 'ui.action',\n client_event_id: id,\n turn_id: turnId,\n card_id: cardId,\n action,\n });\n return id;\n }\n\n /** Stop the turn in progress: `input.cancel` on the WebSocket; over SSE, the turn's request is stopped. */\n cancel(turnId: string): void {\n if (this.current === 'sse') {\n this.stopSse('cancel');\n this.engine.turnEnded();\n this.emitState();\n return;\n }\n this.transmit({ type: 'input.cancel', turn_id: turnId });\n }\n\n /** Ended idle: inputs are held for the new session that `resume()` brings. */\n private awaitingNewSession(): boolean {\n return (\n this.current === 'ended' &&\n this.engine.state().reconnect === 'new_session_on_next_action'\n );\n }\n\n private live(): boolean {\n return (\n this.current !== 'closed' &&\n this.current !== 'ended' &&\n this.current !== 'unauthorized'\n );\n }\n\n /**\n * Every input goes through here: recorded as sent (unacknowledged until the server answers it), then over SSE,\n * or on the WebSocket when the session is ready, or held and resent once `session.ready` arrives.\n */\n private deliver(event: Frame): void {\n if (!this.live() && !this.awaitingNewSession()) throw ended();\n this.engine.sent(event);\n this.emitState();\n if (this.current === 'sse') this.overSse(event);\n else if (this.ready) this.transmit(event);\n else if (this.current === 'idle') this.connect();\n }\n\n private transmit(event: Frame | ClientEvent): void {\n const socket = this.socket;\n if (!socket || socket.readyState !== OPEN) return;\n socket.send(JSON.stringify(event));\n }\n\n /** One input over SSE: a typed message or a card action; an answer cannot go, and is shown as not sent. */\n private overSse(event: Frame): void {\n const id =\n typeof event.client_event_id === 'string'\n ? event.client_event_id\n : undefined;\n const notSent = (error: VinaverseClientError) => {\n if (id !== undefined) this.engine.giveUp(id, error.code);\n this.emitState();\n this.emit('error', error);\n };\n if (id !== undefined && this.inFlight(id)) return;\n const controller = new AbortController();\n const target = { ...this.sseTarget(), signal: controller.signal };\n let frames: AsyncGenerator<Frame>;\n if (event.type === 'input.text') {\n frames = turnSse(target, {\n text: String(event.text),\n ...(id !== undefined ? { client_event_id: id } : {}),\n });\n } else if (event.type === 'ui.action') {\n frames = cardActionSse(target, String(event.turn_id), {\n card_id: String(event.card_id),\n action: String(event.action),\n ...(id !== undefined ? { client_event_id: id } : {}),\n });\n } else {\n notSent(\n new VinaverseClientError(\n 'needs_websocket',\n 'Question cards are answered over the WebSocket.',\n ),\n );\n return;\n }\n const stream: Stream = { id };\n this.streams.set(controller, stream);\n void (async () => {\n try {\n for await (const frame of frames) {\n if (controller.signal.aborted) break;\n this.receive(frame);\n }\n } catch (error) {\n if (!controller.signal.aborted) {\n notSent(asClientError(error, 'http_error'));\n return;\n }\n } finally {\n this.streams.delete(controller);\n }\n if (controller.signal.aborted) {\n if (stream.stop === 'cancel' && id !== undefined) {\n this.engine.giveUp(id, 'cancelled'); // a no-op once its turn started\n this.emitState();\n }\n return;\n }\n // The stream ended without answering the input (no turn, no refusal): it was not sent.\n if (id !== undefined && this.isUnacknowledged(id)) {\n notSent(\n new VinaverseClientError(\n 'http_error',\n 'The turn ended without taking the input.',\n ),\n );\n }\n })();\n }\n\n private isUnacknowledged(id: string): boolean {\n return this.engine\n .state()\n .unacknowledged.some((e) => e.client_event_id === id);\n }\n\n private inFlight(id: string): boolean {\n for (const stream of this.streams.values())\n if (stream.id === id) return true;\n return false;\n }\n\n private stopSse(why: Stop): void {\n for (const [controller, stream] of [...this.streams]) {\n stream.stop = why;\n controller.abort();\n }\n }\n\n private sseTarget() {\n return {\n turnsUrl: this.info.turns_url,\n secret: this.secret,\n ...(this.options.fetch ? { fetch: this.options.fetch } : {}),\n };\n }\n\n private newId(): string {\n return (this.options.createId ?? randomId)();\n }\n\n // ------------------------------------------------------------ pings and listeners\n\n private startPing(): void {\n this.stopPing();\n this.pingTimer = setInterval(\n () => this.transmit({ type: 'ping' }),\n this.options.pingInterval ?? 25_000,\n );\n }\n\n private stopPing(): void {\n if (this.pingTimer !== undefined) clearInterval(this.pingTimer);\n this.pingTimer = undefined;\n }\n\n private setStatus(status: SessionStatus): void {\n if (this.current === status) return;\n this.current = status;\n if (status === 'ended') this.holdRetries();\n this.emit('status', status);\n }\n\n private emitState(): void {\n if (this.listeners.state.size) this.emit('state', this.engine.state());\n }\n\n private emit<K extends keyof SessionEvents>(\n name: K,\n value: SessionEvents[K],\n ): void {\n for (const listener of this.listeners[name]) listener(value);\n }\n}\n\nfunction ended(): VinaverseClientError {\n return new VinaverseClientError(\n 'session_ended',\n 'The session has ended; resume it on a new session.',\n );\n}\n\nfunction asClientError(\n error: unknown,\n code: VinaverseClientError['code'],\n): VinaverseClientError {\n if (error instanceof VinaverseClientError) return error;\n return new VinaverseClientError(\n code,\n error instanceof Error ? error.message : String(error),\n );\n}\n\nfunction defaultWebSocket(): WebSocketFactory | null {\n const Ctor = (\n globalThis as { WebSocket?: new (...args: unknown[]) => WebSocketLike }\n ).WebSocket;\n if (!Ctor) return null;\n // Node itself, not a browser that also has `process` (an Electron renderer): its WebSocket cannot take headers.\n const scope = globalThis as {\n process?: { versions?: { node?: unknown } };\n document?: unknown;\n };\n const node =\n typeof scope.process?.versions?.node === 'string' &&\n scope.document === undefined;\n return (url, protocols, headers) => {\n if (!headers) return new Ctor(url, protocols);\n // Node's WebSocket (undici) takes headers in its init; React Native's in its third argument.\n return node\n ? new Ctor(url, { protocols, headers })\n : new Ctor(url, protocols, { headers });\n };\n}\n\nconst ALPHABET =\n '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';\n\n/** A `client_event_id`: not a secret, only unique in its conversation; Math.random where no crypto exists (Hermes). */\nexport function randomId(): string {\n const bytes = new Uint8Array(22);\n const crypto = (\n globalThis as {\n crypto?: { getRandomValues?: (a: Uint8Array) => Uint8Array };\n }\n ).crypto;\n if (crypto?.getRandomValues) crypto.getRandomValues(bytes);\n else\n for (let i = 0; i < bytes.length; i++)\n bytes[i] = Math.floor(Math.random() * 256);\n let id = 'ce_';\n for (const byte of bytes) id += ALPHABET[byte % ALPHABET.length];\n return id;\n}\n","// The timeline: the engine's messages and cards, the store's pending texts and system rows, in one list sorted by\n// arrival, each item reused from the previous list when nothing about it changed (structural sharing).\nimport type { ConversationState, HeldCard, Message } from '../engine.js';\nimport { isKnownCard } from '../events.js';\nimport type {\n CardItem,\n MessageItem,\n MessageState,\n SystemItem,\n TimelineItem,\n} from './view.js';\n\n/** A text the person sent through the store, kept until the engine holds it as a message or forgets it. */\nexport interface SentText {\n readonly text: string;\n /** Where it sorts until it becomes a message: just after what was drawn when it was sent. */\n readonly order: number;\n}\n\nexport interface TimelineInput {\n readonly state: ConversationState;\n /** Items restored from persistence, drawn first. */\n readonly history: readonly TimelineItem[];\n /** By `client_event_id`, in the order sent. */\n readonly sent: ReadonlyMap<string, SentText>;\n /** Texts not yet given to a session (no session yet): drawn as sending. */\n readonly early: ReadonlySet<string>;\n /** Ids the person sent again (`retry`): their old \"not sent\" item is gone. */\n readonly retried: ReadonlySet<string>;\n readonly busy: ReadonlySet<string>;\n /**\n * Where cards sit after a resumed session's transcript replaced the messages: by card key, an order just after the\n * message they followed, so a card the session draws again (a pending proposal) stays in its place.\n */\n readonly cardOrder?: ReadonlyMap<string, number>;\n /** Cards a transcript (text only) dropped from the engine, kept where they were. */\n readonly kept?: readonly {\n readonly item: CardItem;\n readonly order: number;\n }[];\n /** Cards an earlier session drew that the current one does not hold again: drawn restored, taking no tap. */\n readonly inert?: ReadonlySet<string>;\n /** A resumed session brought its own transcript: the history kept on the device gives way to it. */\n readonly transcriptSeen?: boolean;\n /** Proposals whose tenant decision threw. */\n readonly decisionErrors?: ReadonlySet<string>;\n readonly system: readonly {\n readonly item: SystemItem;\n readonly order: number;\n }[];\n}\n\n/** The highest arrival number drawn, so something added now sorts after it. */\nexport function lastOrder(state: ConversationState): number {\n let last = -1;\n for (const m of state.messages) last = Math.max(last, m.seq);\n for (const c of state.cards) last = Math.max(last, c.seq);\n if (state.streaming) last = Math.max(last, state.streaming.seq);\n return last;\n}\n\n/** The person's text's state, or null when it is no longer pending (a message now, or settled with nothing to draw). */\nexport function pendingState(\n id: string,\n input: Pick<TimelineInput, 'state' | 'early' | 'retried'>,\n): Exclude<MessageState, 'sent' | 'delivered' | 'streaming'> | null {\n const { state } = input;\n if (input.retried.has(id)) return null;\n if (input.early.has(id)) return 'sending';\n if (state.messages.some((m) => m.key === id)) return null;\n const refused = state.refused[id];\n if (refused !== undefined) return refused === 'guardrail' ? null : 'not_sent';\n if (state.heldForNextSession.includes(id)) return 'held';\n if (\n state.resend.includes(id) ||\n state.held.includes(id) ||\n state.unacknowledged.some((f) => f.client_event_id === id)\n )\n return 'sending';\n return null; // a duplicate whose earlier turn stands, or forgotten\n}\n\nexport function buildTimeline(\n input: TimelineInput,\n previous: readonly TimelineItem[],\n): readonly TimelineItem[] {\n const before = new Map(previous.map((item) => [item.key, item]));\n const live: { item: TimelineItem; order: number }[] = [];\n const { state } = input;\n\n for (const m of state.messages)\n live.push({ item: messageItem(m), order: m.seq });\n if (state.streaming) {\n live.push({\n item: {\n type: 'message',\n key: `a:${state.streaming.turnId}`,\n role: 'agent',\n text: '',\n state: 'streaming',\n },\n order: state.streaming.seq,\n });\n }\n for (const card of state.cards) {\n if (!isKnownCard(card.card as { kind: string })) continue; // §5: skip a kind this client does not know\n live.push({\n item: {\n type: 'card',\n key: card.id,\n card,\n busy: !input.inert?.has(card.id) && input.busy.has(card.id),\n ...(input.inert?.has(card.id) ? { restored: true as const } : {}),\n ...(input.decisionErrors?.has(card.id)\n ? { decisionError: true as const }\n : {}),\n },\n order: input.cardOrder?.get(card.id) ?? card.seq,\n });\n }\n for (const { item, order } of input.system) live.push({ item, order });\n const held = new Set(state.cards.map((c) => c.id));\n for (const { item, order } of input.kept ?? [])\n if (!held.has(item.key)) live.push({ item, order });\n for (const [id, sent] of input.sent) {\n const pending = pendingState(id, input);\n if (pending === null) continue;\n const rejection = state.rejections[id];\n live.push({\n item: {\n type: 'message',\n key: id,\n role: 'person',\n text: sent.text,\n state: pending,\n ...(pending === 'not_sent'\n ? {\n rejection: rejection ?? {\n code: state.refused[id] ?? '',\n message: '',\n },\n }\n : {}),\n },\n order: sent.order,\n });\n }\n live.sort((a, b) => a.order - b.order); // stable: equal orders keep the order they were added in\n\n // History gives way to the conversation: an item the live session holds again (a restored card in pending_cards)\n // takes the history item's place, so it updates without moving; the whole of it gives way once a resumed session\n // brought its own transcript.\n const items = mergeByKey(\n input.transcriptSeen === true ? [] : input.history,\n live.map((l) => l.item),\n );\n\n let same = items.length === previous.length;\n const shared = items.map((item, i) => {\n const prev = before.get(item.key);\n const kept = prev !== undefined && equal(prev, item) ? prev : item;\n if (kept !== previous[i]) same = false;\n return kept;\n });\n return same ? previous : shared;\n}\n\n/**\n * History and the live conversation as one list, by key: a live item the history holds takes its place (it updates\n * without moving). One it does not hold, between two that it does, goes just after the live item before it (just\n * before the next one when none came before); after the last one the history holds, it goes at the end, after the\n * history.\n */\nexport function mergeByKey(\n history: readonly TimelineItem[],\n live: readonly TimelineItem[],\n): TimelineItem[] {\n if (!history.length) return [...live];\n const items = [...history];\n const at = (key: string) => items.findIndex((item) => item.key === key);\n let last = -1;\n live.forEach((item, i) => {\n const found = at(item.key);\n if (found >= 0) {\n items[found] = item;\n last = found;\n return;\n }\n const next = live\n .slice(i + 1)\n .map((l) => at(l.key))\n .find((p) => p >= 0);\n last = next === undefined ? items.length : last >= 0 ? last + 1 : next;\n items.splice(last, 0, item);\n });\n return items;\n}\n\nfunction messageItem(m: Message): MessageItem {\n const role = m.role === 'assistant' ? 'agent' : m.role;\n return {\n type: 'message',\n key: m.key,\n role,\n text: m.text,\n state: m.received ? 'delivered' : 'sent',\n ...(m.partial ? { partial: m.partial } : {}),\n ...(m.refusal ? { refusal: true as const } : {}),\n };\n}\n\nfunction equal(a: TimelineItem, b: TimelineItem): boolean {\n if (a.type !== b.type || a.key !== b.key) return false;\n if (a.type === 'message' && b.type === 'message')\n return (\n a.role === b.role &&\n a.text === b.text &&\n a.state === b.state &&\n a.partial === b.partial &&\n a.refusal === b.refusal &&\n a.rejection?.code === b.rejection?.code &&\n a.rejection?.message === b.rejection?.message\n );\n if (a.type === 'card' && b.type === 'card')\n return (\n a.busy === b.busy &&\n a.restored === b.restored &&\n a.decisionError === b.decisionError &&\n sameCard(a.card, b.card)\n );\n return a === b; // system items are made once and kept\n}\n\nfunction sameCard(a: HeldCard, b: HeldCard): boolean {\n return (\n a.card === b.card &&\n a.seq === b.seq &&\n a.turnId === b.turnId &&\n a.outcome === b.outcome &&\n a.locked.length === b.locked.length &&\n a.locked.every((q, i) => q === b.locked[i]) &&\n a.question?.state === b.question?.state &&\n JSON.stringify(a.question?.answer) === JSON.stringify(b.question?.answer) &&\n JSON.stringify(a.question?.row_answers) ===\n JSON.stringify(b.question?.row_answers)\n );\n}\n\n/** The parts of an item worth keeping across an app restart: what was on the server, never what was pending. */\nexport function persistable(item: TimelineItem): boolean {\n if (item.type === 'message')\n return item.state === 'sent' || item.state === 'delivered';\n return item.type === 'card';\n}\n","// The conversation store: one conversation with an agent, for any UI framework. It owns the session (and the next\n// one after a resume), turns the engine's state into a view a UI draws, and runs what the protocol asks of an app\n// on the person's actions: resume on the next action, hold what was typed early, decide proposals through the\n// tenant's handler, keep streamed text to one update per frame. No framework import: React, React Native and Angular\n// bind to `subscribe` and `getSnapshot`.\nimport {\n ConversationEngine,\n type ConversationState,\n transcriptHasIds,\n} from '../engine.js';\nimport { VinaverseClientError } from '../errors.js';\nimport type {\n AnswerInput,\n ClientSecret,\n ProposalOutcome,\n ServerEvent,\n SessionInfo,\n Welcome,\n} from '../events.js';\nimport {\n randomId,\n type SessionOptions,\n type SessionStatus,\n VinaverseSession,\n} from '../session.js';\nimport { isAllowedLink } from './links.js';\nimport {\n buildTimeline,\n lastOrder,\n persistable,\n type SentText,\n} from './timeline.js';\nimport type {\n CardItem,\n ConversationBanner,\n ConversationStatus,\n ConversationView,\n StreamingText,\n SystemItem,\n TimelineItem,\n} from './view.js';\n\n/** Why the store asks the tenant's backend for a session. */\nexport type SessionReason =\n /** The conversation opens (`start()`). */\n | 'open'\n /** The session ended (idle, expired, its turn limit) and the person acted again. */\n | 'resume'\n /** The conversation continued on another device, and the person chose to continue here. */\n | 'continue_here';\n\nexport interface SessionRequest {\n readonly reason: SessionReason;\n /** The conversation so far, when known: the backend names it (with its `conversation_key`) to resume it. */\n readonly conversationId: string | null;\n /** For `subject.locale` and `subject.timezone`, which the backend sets. */\n readonly locale?: string;\n readonly timeZone?: string;\n /**\n * Aborted when the answer is no longer wanted (the conversation was disposed or cleared, or a newer request took\n * its place): pass it to `fetch`, so a late answer never opens a socket after the person left.\n */\n readonly signal?: AbortSignal;\n}\n\n/** What `createSession` gave the tenant's backend, as it passes it on: the session, its agent and disclosure. */\nexport type ConversationSession = SessionInfo & {\n readonly agent?: {\n readonly display_name?: string;\n readonly avatar_url?: string;\n };\n readonly disclosure?: string;\n /**\n * When the session ends (`Session.expires_at`: the earliest of its own limit and the tenant's tool token). Past it,\n * the conversation goes on in a new session from `getSession`, never with a fresh secret for this one.\n */\n readonly expires_at?: string;\n /** v1-draft.20: the tenant's greeting and chips for the session's mode (`Session.welcome`); no model call. */\n readonly welcome?: Welcome;\n};\n\n/**\n * Runs a callback before the next frame; `requestAnimationFrame` where there is one. Every listener, of the view and\n * of the streaming text, is called from it, at most once per frame: a zone.js app re-enters its zone here once. A\n * test passes one that runs the callback at once.\n */\nexport interface FrameScheduler {\n request(callback: () => void): unknown;\n cancel(handle: unknown): void;\n}\n\n/** Where the drawn conversation is kept across app restarts (opt-in; prefer encrypted storage). */\nexport interface ConversationPersistence {\n getItem(key: string): string | null | Promise<string | null>;\n setItem(key: string, value: string): void | Promise<void>;\n removeItem(key: string): void | Promise<void>;\n /**\n * Optional: the keys under a prefix. With it (or `removePrefix`), a sign-out and an erasure are guaranteed to find every\n * key kept, ones no index lists too (an earlier version's, a write lost with its process); without either, only the\n * keys this version indexed and the shapes it can derive from them. AsyncStorage and MMKV: `getAllKeys()` filtered\n * by the prefix; web `localStorage`: `Object.keys(localStorage)` filtered.\n */\n keys?(prefix: string): readonly string[] | Promise<readonly string[]>;\n /** Optional: removes every key under a prefix at once (used instead of `keys` where it cannot reach a kept record). */\n removePrefix?(prefix: string): void | Promise<void>;\n}\n\nexport interface ConversationOptions {\n /**\n * A session from the tenant's backend, which creates it with its service key (the app never holds one). Asked once\n * per need: when the conversation opens, and on the person's action after a session ended.\n */\n readonly getSession: (\n request: SessionRequest,\n ) => Promise<ConversationSession>;\n /** A fresh client secret for a session (on 4401), from the tenant's backend. */\n readonly refreshSecret?: (\n sessionId: string,\n ) => Promise<ClientSecret | string>;\n readonly locale?: string;\n readonly timeZone?: string;\n /** The prefixes the tenant registered for card links (`checkLink`). */\n readonly deepLinkPrefixes?: readonly string[];\n /** Keep the drawn conversation across restarts (off unless given). */\n readonly persistence?: ConversationPersistence;\n /** Its key; one per signed-in person. Default `vinaverse.conversation`. */\n readonly persistenceKey?: string;\n /** Default: `requestAnimationFrame`, else a 16 ms timer, resolved when first used (never at import or creation). */\n readonly scheduler?: FrameScheduler;\n /** The transport's own options (`auth`, `webSocket`, `fetch`, delays…). */\n readonly transport?: Omit<\n SessionOptions,\n 'session' | 'refreshSecret' | 'engine' | 'createId'\n >;\n /** New `client_event_id`s. Default: random, `ce_` and 22 characters. */\n readonly createId?: () => string;\n /** Something failed that no call returned: getting a session, an input that could not be delivered. */\n readonly onError?: (error: unknown) => void;\n /**\n * Close the connection while the app is in the background, and open it again in the foreground (a backend that\n * mints a client secret per connection: with `refreshSecret`, a fresh one is asked for first). Default false: the\n * connection stays, with no pings, until the session idles out. Nothing typed or answered is lost either way.\n */\n readonly closeInBackground?: boolean;\n /**\n * The time a session's end (`expires_at`) is judged by. Default: the device's. Give the server's (a clock synced from\n * responses): a phone set late would reuse a dead session, set early drop a live one.\n */\n readonly clock?: { now(): number };\n /**\n * What the person and the agent did live, for analytics (never what a transcript or the device brought back): the\n * person sent a text, a reply finished, a card was drawn. Carries no text.\n */\n readonly onActivity?: (activity: ConversationActivity) => void;\n}\n\n/** One live step of the conversation, without its words. */\nexport type ConversationActivity =\n | { readonly type: 'message_sent'; readonly id: string }\n | { readonly type: 'reply_completed'; readonly turnId: string }\n | {\n readonly type: 'card_shown';\n readonly cardId: string;\n readonly kind: string;\n };\n\n/** A text is at most 2000 code points (`TurnInput`). */\nexport const MAX_TEXT = 2000;\n/** Turns whose starting text the store remembers, for `retryTurn`. */\nconst TURN_INPUTS = 50;\n/** History kept across restarts: the newest items. */\nconst HISTORY = 100;\nconst PERSIST_DELAY = 500;\nconst PERSIST_VERSION = 1;\n\nconst NO_ITEMS: readonly TimelineItem[] = [];\nconst OUTCOMES: ReadonlySet<string> = new Set([\n 'confirmed',\n 'declined',\n 'failed',\n 'expired',\n]);\n\nexport class ConversationStore {\n private readonly options: ConversationOptions;\n private readonly engine = new ConversationEngine();\n private session: VinaverseSession | null = null;\n private info: ConversationSession | null = null;\n private getting: Promise<VinaverseSession | null> | null = null;\n private failed = false;\n private disposed = false;\n private online: boolean | null = null;\n private foreground = true;\n private lastStatus: SessionStatus = 'idle';\n private offlineAfterRetries = false;\n /** The id the next send gets, so a text typed before the session keeps its key. */\n private nextId: string | null = null;\n\n private readonly sent = new Map<string, SentText>();\n private readonly early = new Map<string, string>();\n private readonly retried = new Set<string>();\n private readonly busy = new Set<string>();\n /** Proposals whose tenant decision threw: shown as recoverable, the person may decide again. */\n private readonly decisionErrors = new Set<string>();\n private system: { item: SystemItem; order: number }[] = [];\n /** The person's text that started each recent turn, by `turn_id` (`turn.started` echoes its `client_event_id`). */\n private readonly turnInputs = new Map<string, string>();\n /** Numbers system rows that carry no id of their own. */\n private systemSeq = 0;\n private history: readonly TimelineItem[] = NO_ITEMS;\n private historyState: ConversationView['history'] = 'none';\n /** A resumed session.ready carried a transcript: the server's history replaced what the device kept. */\n private transcriptSeen = false;\n /** The session of the last session.ready: a card of another one takes no tap (§6). */\n private readySession: string | null = null;\n private cardOrder = new Map<string, number>();\n private kept: { item: CardItem; order: number }[] = [];\n /** Cards an earlier session drew, kept by a merged transcript: drawn as restored, taking no tap. */\n private readonly inert = new Set<string>();\n private locale: string | undefined;\n /** The request for a session in flight, to abort when it is no longer wanted. */\n private fetching: { abort(): void } | null = null;\n\n private view: ConversationView;\n private readonly listeners = new Set<() => void>();\n private streaming: StreamingText | null = null;\n private readonly streamListeners = new Set<() => void>();\n /** The frame that will notify, and what it will notify about. */\n private frame: unknown = undefined;\n private framePending = false;\n private viewDirty = false;\n private streamDirty = false;\n private persistTimer: ReturnType<typeof setTimeout> | undefined;\n private unsubscribe: (() => void)[] = [];\n\n constructor(options: ConversationOptions) {\n this.options = options;\n this.locale = options.locale;\n this.view = this.compute(null);\n this.restore();\n }\n\n // ------------------------------------------------------------ reading\n\n getSnapshot = (): ConversationView => this.view;\n\n subscribe = (listener: () => void): (() => void) => {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n };\n\n getStreaming = (): StreamingText | null => this.streaming;\n\n subscribeStreaming = (listener: () => void): (() => void) => {\n this.streamListeners.add(listener);\n return () => this.streamListeners.delete(listener);\n };\n\n /** Whether a card's link may be opened (the deep-link rule, against `deepLinkPrefixes`). */\n checkLink(link: string): boolean {\n return isAllowedLink(link, this.options.deepLinkPrefixes ?? []);\n }\n\n // ------------------------------------------------------------ the conversation's life\n\n /** Ask for a session and connect, early: a client secret must open its first connection within two minutes. */\n start(): void {\n this.live();\n if (this.session) {\n if (this.session.status === 'idle') this.session.connect();\n // Refused, and a new session refused as well: the person's \"Try again\" asks for another.\n else if (this.session.status === 'unauthorized')\n void this.resumeWith('resume');\n return;\n }\n void this.ensureSession('open');\n }\n\n /** Close for good. */\n dispose(): void {\n if (this.disposed) return;\n this.disposed = true;\n this.fetching?.abort();\n this.fetching = null;\n this.session?.close();\n for (const off of this.unsubscribe) off();\n this.unsubscribe = [];\n clearTimeout(this.persistTimer);\n this.update();\n this.flush(); // the closed view reaches the listeners now: no frame may come after the screen is gone\n }\n\n /** Close for good and forget the conversation kept on the device (sign-out). Never throws for the storage. */\n clear(): void {\n this.dispose();\n this.history = NO_ITEMS;\n try {\n const removed = this.options.persistence?.removeItem(this.key());\n if (removed) removed.catch(() => undefined);\n } catch {\n // storage blocked: sign-out goes on\n }\n this.update();\n this.flush();\n }\n\n /**\n * The person switched the app's language: the UI's words change at once (the kit's own locale); the next session\n * asks for this locale (`subject.locale`). The open session keeps its language: the agent answers in the new one\n * from the next session, and the store never starts a session for it.\n */\n setLocale(locale: string | undefined): void {\n this.locale = locale;\n }\n\n /** The app came to the foreground or went to the background (AppState, `visibilitychange`). */\n setForeground(foreground: boolean): void {\n this.foreground = foreground;\n if (this.options.closeInBackground && !this.disposed) {\n if (!foreground) {\n this.suspend();\n return;\n }\n if (this.suspended) {\n void this.wake();\n return;\n }\n }\n this.session?.setForeground(foreground);\n if (foreground) this.reconnectIfDown();\n }\n\n /** In the background (`closeInBackground`): the connection is closed; the engine keeps what was sent, to resend. */\n private suspended = false;\n private suspend(): void {\n const session = this.session;\n if (!session || this.suspended || session.status === 'ended') return;\n this.suspended = true;\n for (const off of this.unsubscribe) off();\n this.unsubscribe = [];\n session.close();\n this.update();\n }\n\n /**\n * Back in the foreground, or the person acted while away: a new connection to the same session, with a fresh secret\n * when the backend gives one. A session that passed its end meanwhile is never reopened (a fresh secret cannot bring\n * back an expired tool token): the person's action continues the conversation in a new session from `getSession`,\n * and until then nothing connects.\n */\n private async wake(byPerson = false): Promise<void> {\n const info = this.info;\n if (info && this.sessionOver()) {\n if (byPerson) await this.resumeWith('resume');\n else this.update();\n return;\n }\n this.suspended = false;\n if (!info) return;\n let next: ConversationSession = info;\n if (this.options.refreshSecret) {\n try {\n next = {\n ...info,\n client_secret: await this.options.refreshSecret(info.id),\n };\n } catch (error) {\n this.options.onError?.(error); // the secret held may still open it; a refused one asks again (4401)\n }\n }\n if (this.disposed || this.suspended) return;\n this.open(next);\n }\n\n /** The network as the app sees it; null when unknown. Back online reconnects a connection that gave up. */\n setOnline(online: boolean | null): void {\n this.online = online;\n if (online) this.reconnectIfDown();\n this.update();\n }\n\n // ------------------------------------------------------------ the person's actions\n\n /** Send a typed message; returns its `client_event_id`. Typed before a session exists, it is sent once one does. */\n send(text: string): string {\n this.live();\n if (!text.trim()) throw new RangeError('A message needs some text.');\n if ([...text].length > MAX_TEXT)\n throw new RangeError(`A message is at most ${MAX_TEXT} characters.`);\n const id = (this.options.createId ?? randomId)();\n this.sent.set(id, { text, order: lastOrder(this.engine.state()) + 0.5 });\n this.tellActivity({ type: 'message_sent', id });\n if (!this.session) {\n this.early.set(id, text);\n void this.ensureSession('open');\n this.update();\n return id;\n }\n if (this.suspended) {\n // Typed while the connection is closed for the background: held, and sent once it is open again.\n this.early.set(id, text);\n void this.wake(true);\n this.update();\n return id;\n }\n if (this.nextFrom(this.engine.state()) === 'continue_here') {\n // The session refuses input now; typing here is the person continuing here, so it goes to the next session.\n this.early.set(id, text);\n void this.resumeWith('continue_here');\n this.update();\n return id;\n }\n if (this.sessionOver()) {\n // Past the session's end (its tool token with it): the text goes to a new session for the same conversation.\n this.early.set(id, text);\n void this.resumeWith('resume');\n this.update();\n return id;\n }\n this.nextId = id;\n this.session.sendText(text);\n this.nextId = null;\n this.continueIfEnded();\n return id;\n }\n\n /** Answer a question card (a `rate_each` row by its `question_id`); returns the `client_event_id`. */\n answer(cardId: string, questionId: string, answer: AnswerInput): string {\n const session = this.required();\n const id = session.answer(cardId, questionId, answer);\n this.continueIfEnded();\n return id;\n }\n\n /** A card action (`ui.action`) other than a proposal's outcome. */\n cardAction(cardId: string, action: string): string {\n return this.required().action(cardId, action);\n }\n\n /**\n * Decide a proposal: `decide` is the tenant's own call (its backend, the person's token), which confirms or\n * declines it and says the outcome; the store then reports it. One decision per card; the card is busy meanwhile.\n * Resolves to the outcome reported, or null when the card was busy or already decided.\n *\n * Only an outcome `decide` resolves with is reported (§6: the first is final). When `decide` throws, or resolves\n * with anything but `confirmed`, `declined`, `failed` or `expired`, nothing is reported: the backend may have\n * applied the change, so the outcome stays unknown; the card shows `decisionError` and the person may decide\n * again. When the conversation is disposed meanwhile (sign-out), the outcome is not reported either: the tenant's\n * backend holds it, and the session takes it as unknown.\n */\n async decideProposal(\n cardId: string,\n decide: () => Promise<ProposalOutcome>,\n ): Promise<ProposalOutcome | null> {\n this.live();\n const card = this.engine.state().cards.find((c) => c.id === cardId);\n if (card?.kind !== 'proposal') return null;\n if (this.busy.has(cardId) || (card.outcome ?? null) !== null) return null;\n this.busy.add(cardId);\n this.decisionErrors.delete(cardId);\n this.update();\n try {\n const outcome: unknown = await decide();\n if (typeof outcome !== 'string' || !OUTCOMES.has(outcome))\n throw new TypeError(\n `decide() resolved with ${JSON.stringify(outcome)}, not confirmed, declined, failed or expired`,\n );\n if (this.disposed) return outcome as ProposalOutcome;\n if (this.view.next === 'continue') await this.resumeWith('resume');\n this.required().reportOutcome(cardId, outcome as ProposalOutcome);\n return outcome as ProposalOutcome;\n } catch (error) {\n this.decisionErrors.add(cardId);\n throw error;\n } finally {\n this.busy.delete(cardId);\n this.update();\n }\n }\n\n /** Send a \"not sent\" message again, as a new message (the person's action). Returns the new id. */\n retry(key: string): string | null {\n const sent = this.sent.get(key);\n if (!sent || this.engine.state().refused[key] === undefined) return null;\n this.retried.add(key);\n this.sent.delete(key);\n return this.send(sent.text);\n }\n\n /**\n * Send again the person's text whose turn failed before any reply (a `turn_failed` row with `data.retry`), as a new\n * message (the person's action). Once per row: its `retry` turns false. Returns the new id, or null when the row\n * allows no retry.\n */\n retryTurn(key: string): string | null {\n const at = this.system.findIndex(\n (s) => s.item.key === key && s.item.event === 'turn_failed',\n );\n const entry = this.system[at];\n if (entry?.item.data.retry !== true) return null;\n const text = this.turnText(String(entry.item.data.turn ?? ''));\n if (text === undefined) return null;\n this.system = this.system.map((s, i) =>\n i === at\n ? { ...s, item: { ...s.item, data: { ...s.item.data, retry: false } } }\n : s,\n );\n return this.send(text);\n }\n\n /** After the conversation continued on another device: continue it here (the person's choice). */\n continueHere(): Promise<void> {\n return this.resumeWith('continue_here');\n }\n\n /** Stop the turn in progress. */\n cancel(): void {\n const turn = this.engine.state().turn;\n if (this.session && turn) this.session.cancel(turn);\n }\n\n // ------------------------------------------------------------ sessions\n\n private async ensureSession(\n reason: SessionReason,\n ): Promise<VinaverseSession | null> {\n if (this.session) return this.session;\n if (this.getting) return this.getting;\n this.getting = this.fetchSession(reason).then((info) => {\n this.getting = null;\n if (!info || this.disposed) return null;\n this.open(info);\n return this.session;\n });\n this.update();\n return this.getting;\n }\n\n private async fetchSession(\n reason: SessionReason,\n ): Promise<ConversationSession | null> {\n this.failed = false;\n this.fetching?.abort(); // a newer request takes the place of an older one\n const Controller = (\n globalThis as { AbortController?: new () => AbortController }\n ).AbortController;\n const controller = Controller ? new Controller() : null;\n const mine = { abort: () => controller?.abort() };\n this.fetching = mine;\n let aborted = false;\n const signal = controller?.signal;\n signal?.addEventListener('abort', () => {\n aborted = true;\n });\n try {\n const info = await this.options.getSession({\n reason,\n conversationId: this.engine.state().conversationId,\n ...(this.locale !== undefined ? { locale: this.locale } : {}),\n ...(this.options.timeZone !== undefined\n ? { timeZone: this.options.timeZone }\n : {}),\n ...(signal ? { signal } : {}),\n });\n return aborted || this.fetching !== mine ? null : info;\n } catch (error) {\n if (aborted || this.fetching !== mine) return null; // no longer wanted: not a failure\n this.failed = true;\n this.getting = null;\n this.options.onError?.(error);\n this.update();\n return null;\n } finally {\n if (this.fetching === mine) this.fetching = null;\n }\n }\n\n private open(info: ConversationSession): void {\n this.info = info;\n this.suspended = false;\n const refreshSecret = this.options.refreshSecret;\n const session = new VinaverseSession({\n ...this.options.transport,\n session: info,\n engine: this.engine,\n ...(refreshSecret\n ? {\n // Past the session's end a fresh secret cannot help: refused here, and the store rolls over instead.\n refreshSecret: (id: string) =>\n this.sessionOver()\n ? Promise.reject(\n new VinaverseClientError(\n 'needs_new_session',\n 'This session has ended.',\n ),\n )\n : refreshSecret(id),\n }\n : {}),\n createId: () => this.nextId ?? (this.options.createId ?? randomId)(),\n });\n this.session = session;\n this.unsubscribe.push(\n session.on('state', () => this.update()),\n session.on('status', (status) => this.statusChanged(status)),\n session.on('event', (event) => this.event(event)),\n session.on('error', (error) => {\n if (!this.sessionOver()) this.options.onError?.(error); // past its end, the refusal is the rollover's cue\n }),\n );\n session.setForeground(this.foreground);\n session.connect();\n this.flushEarly();\n }\n\n /** What was typed before there was a session to take it. */\n private flushEarly(): void {\n const session = this.session;\n if (!session) return;\n for (const [id, text] of this.early) {\n this.nextId = id;\n session.sendText(text);\n }\n this.nextId = null;\n this.early.clear();\n this.update();\n }\n\n /** A new session for the conversation, then `resume()`: once per person action, never in a loop. */\n private resuming: Promise<void> | null = null;\n private resumeWith(reason: SessionReason): Promise<void> {\n this.live();\n if (this.resuming) return this.resuming;\n if (!this.session) return this.ensureSession(reason).then(() => undefined);\n this.resuming = this.fetchSession(reason).then((info) => {\n this.resuming = null;\n if (!info || this.disposed || !this.session) return;\n if (this.session.status === 'closed') {\n this.open(info); // closed for the background: a connection of its own\n return;\n }\n this.info = info;\n this.session.resume(info);\n this.flushEarly();\n });\n return this.resuming;\n }\n\n /** The person acted after the session ended idle, expired or at its limit: the next session takes what they sent. */\n private continueIfEnded(): void {\n if (this.nextFrom(this.engine.state()) === 'continue')\n void this.resumeWith('resume');\n this.update();\n }\n\n private reconnectIfDown(): void {\n const session = this.session;\n if (\n session &&\n session.status === 'idle' &&\n !this.sessionOver() && // past its end: the person's next action gets a new session\n this.nextFrom(this.engine.state()) === null\n )\n session.connect();\n }\n\n /** A refusal already led to a new session, and none has been ready since: another refusal is no cue. */\n private rolled = false;\n\n private statusChanged(status: SessionStatus): void {\n // A refused secret (a 4401 that no fresh secret got past) means the session is over, whatever the device's clock\n // says: a phone running behind the server still thinks it open. The conversation goes on in a new session, once\n // until a session is ready, so a backend whose new session is refused too leaves the view unauthorized, never a\n // loop.\n if (status === 'ready') this.rolled = false;\n if (status === 'unauthorized' && !this.rolled) {\n this.rolled = true;\n void this.resumeWith('resume');\n }\n if (status === 'idle')\n this.offlineAfterRetries = this.lastStatus === 'reconnecting';\n else if (status !== 'reconnecting') this.offlineAfterRetries = false;\n this.lastStatus = status;\n this.update();\n }\n\n /** The app's analytics hears of a step; what it throws is reported (`onError`), never in the way of a send or a frame. */\n private tellActivity(activity: ConversationActivity): void {\n try {\n this.options.onActivity?.(activity);\n } catch (error) {\n this.options.onError?.(error);\n }\n }\n\n /** The live frames analytics hears of: a reply finished, cards drawn. */\n private activity(frame: Record<string, unknown>): void {\n if (!this.options.onActivity) return;\n const on = (a: ConversationActivity) => this.tellActivity(a);\n if (frame.type === 'message.completed' && typeof frame.turn_id === 'string')\n on({ type: 'reply_completed', turnId: frame.turn_id });\n if (frame.type === 'ui.cards' && Array.isArray(frame.cards))\n for (const card of frame.cards as { id?: unknown; kind?: unknown }[])\n if (typeof card.id === 'string' && typeof card.kind === 'string')\n on({ type: 'card_shown', cardId: card.id, kind: card.kind });\n }\n\n private event(event: ServerEvent): void {\n const frame = event as unknown as Record<string, unknown>;\n const str = (v: unknown) => (typeof v === 'string' ? v : null);\n this.activity(frame);\n const add = (\n key: string,\n kind: SystemItem['event'],\n data: SystemItem['data'],\n ) => {\n if (this.system.some((s) => s.item.key === key)) return;\n this.system = [\n ...this.system,\n {\n item: { type: 'system', key, event: kind, data },\n order: lastOrder(this.engine.state()) + 0.75,\n },\n ];\n };\n switch (frame.type) {\n case 'session.ready': {\n const session = (frame.session as { id?: unknown } | undefined)?.id;\n const moved =\n typeof session === 'string' && session !== this.readySession;\n if (typeof session === 'string') this.readySession = session;\n // A transcript without the live ids replaced the messages: the device's history gives way, and the cards on\n // screen are anchored where they were. One with them merged by key, and nothing gives way.\n if (\n frame.resumed === true &&\n Array.isArray(frame.transcript) &&\n !transcriptHasIds(frame.transcript)\n ) {\n this.transcriptSeen = true;\n this.anchorCards(moved);\n } else if (moved && frame.resumed === true) {\n // A card an earlier session drew takes no tap in this one (§6), unless this session holds it again.\n const pending = new Set(\n (Array.isArray(frame.pending_cards) ? frame.pending_cards : []).map(\n (c) => str((c as { id?: unknown }).id),\n ),\n );\n for (const card of this.engine.state().cards)\n if (pending.has(card.id)) this.inert.delete(card.id);\n else this.inert.add(card.id);\n }\n return;\n }\n // `at` is required (v1-draft.15); the same takeover announced again after a reconnect has the same `at`, so it\n // draws one row. A frame without one still gets a row of its own.\n case 'takeover.started':\n add(\n `takeover:${str(frame.at) ?? `#${++this.systemSeq}`}`,\n 'takeover_started',\n { by: str(frame.by) },\n );\n return;\n case 'takeover.ended':\n add(\n `takeover-ended:${str(frame.at) ?? `#${++this.systemSeq}`}`,\n 'takeover_ended',\n {},\n );\n return;\n case 'handoff.created': {\n const ticket = frame.ticket as Record<string, unknown> | undefined;\n add(`handoff:${str(ticket?.id) ?? ''}`, 'handoff_created', {\n expected_response: str(ticket?.expected_response),\n });\n return;\n }\n case 'flow.completed':\n add(`flow:#${++this.systemSeq}`, 'flow_completed', {\n result: str(frame.result),\n code: str(frame.code),\n });\n return;\n case 'turn.started': {\n const turn = str(frame.turn_id);\n const input = str(frame.client_event_id);\n if (turn === null || input === null) return;\n this.turnInputs.set(turn, input);\n if (this.turnInputs.size > TURN_INPUTS) {\n const oldest = this.turnInputs.keys().next().value;\n if (oldest !== undefined) this.turnInputs.delete(oldest);\n }\n return;\n }\n case 'turn.failed': {\n const turn = str(frame.turn_id) ?? '';\n // A reply that streamed is kept, cut off; a turn that failed before any text gets a row of its own.\n if (this.engine.state().messages.some((m) => m.key === `a:${turn}`))\n return;\n if (frame.code === 'cancelled') return; // stopped on purpose (cancel(), a takeover): nothing failed\n add(`failed:${turn}`, 'turn_failed', {\n code: str(frame.code),\n message: str(frame.message),\n retryable: frame.retryable === true,\n retry: frame.retryable === true && this.turnText(turn) !== undefined,\n turn,\n });\n return;\n }\n default:\n return;\n }\n }\n\n /** The person's text that started a turn, while its message is on screen. */\n private turnText(turn: string): string | undefined {\n const input = this.turnInputs.get(turn);\n if (input === undefined) return undefined;\n const message = this.engine\n .state()\n .messages.find((m) => m.key === input && m.role === 'person');\n return message?.text || undefined;\n }\n\n /**\n * A resumed session's transcript replaced the messages, and a chat transcript carries text only: the engine drops\n * the cards it drew, and draws the pending ones again at the end. Each card on screen is anchored just after the\n * message it followed (by key; the transcript keeps the live keys), so a pending proposal stays where it was, and a\n * card the transcript dropped stays drawn there; taking no tap when it belongs to an earlier session.\n */\n private anchorCards(sessionChanged: boolean): void {\n const state = this.engine.state();\n const seqOf = new Map(state.messages.map((m) => [m.key, m.seq]));\n const first = Math.min(...state.messages.map((m) => m.seq), 0);\n const held = new Set(state.cards.map((c) => c.id));\n const order = new Map<string, number>();\n const kept: { item: CardItem; order: number }[] = [];\n let anchor = first - 1;\n let step = 0;\n for (const item of this.view.items) {\n if (item.type === 'message' && seqOf.has(item.key)) {\n anchor = seqOf.get(item.key) as number;\n step = 0;\n } else if (item.type === 'card') {\n const at = anchor + 0.5 + ++step / 1000;\n order.set(item.key, at);\n if (!held.has(item.key))\n kept.push({\n item: sessionChanged\n ? { ...item, busy: false, restored: true }\n : item,\n order: at,\n });\n }\n }\n this.cardOrder = order;\n this.kept = kept;\n }\n\n // ------------------------------------------------------------ the view\n\n /**\n * Recomputes now (getSnapshot and getStreaming are always current) and notifies from the scheduler, at most once\n * per frame, both channels in the same flush: a streamed reply that completes becomes its message in one frame.\n */\n private update(): void {\n const state = this.engine.state();\n this.stream(state);\n const view = this.compute(state);\n if (view !== this.view) {\n this.view = view;\n this.viewDirty = true;\n this.schedulePersist();\n }\n if (this.viewDirty || this.streamDirty) this.scheduleNotify();\n }\n\n private scheduleNotify(): void {\n if (this.framePending || this.disposed) return;\n // Nobody listens yet (a store created on the server, or before its screen): no frame is asked for, so no global is\n // touched; a listener reads the current snapshot when it subscribes.\n if (this.listeners.size === 0 && this.streamListeners.size === 0) return;\n this.framePending = true;\n this.frame = this.scheduler().request(() => {\n this.frame = undefined;\n this.framePending = false;\n this.flush();\n });\n }\n\n /** Calls the listeners of what changed since the last flush. */\n private flush(): void {\n if (this.frame !== undefined) {\n this.scheduler().cancel(this.frame);\n this.frame = undefined;\n this.framePending = false;\n }\n const view = this.viewDirty;\n const stream = this.streamDirty;\n this.viewDirty = false;\n this.streamDirty = false;\n if (stream) for (const l of [...this.streamListeners]) l();\n if (view) for (const l of [...this.listeners]) l();\n }\n\n private compute(state: ConversationState | null): ConversationView {\n const s = state ?? this.engine.state();\n const prev: ConversationView | undefined = this.view;\n for (const id of [...this.sent.keys()])\n if (!this.early.has(id) && s.messages.some((m) => m.key === id))\n this.sent.delete(id);\n const items = buildTimeline(\n {\n state: s,\n history: this.history,\n sent: this.sent,\n early: new Set(this.early.keys()),\n retried: this.retried,\n busy: this.busy,\n decisionErrors: this.decisionErrors,\n transcriptSeen: this.transcriptSeen,\n cardOrder: this.cardOrder,\n kept: this.kept,\n inert: this.inert,\n system: this.system,\n },\n prev?.items ?? NO_ITEMS,\n );\n const status = this.status();\n const next = this.nextFrom(s);\n const activity =\n s.turn === null ? [] : s.tools.filter((t) => t.turn_id === s.turn);\n const name = this.info?.agent?.display_name ?? null;\n const avatarUrl = this.info?.agent?.avatar_url ?? null;\n const view: ConversationView = {\n status,\n conversationId: s.conversationId,\n banner: banner(status, next),\n next,\n agent: sameAgent(prev?.agent, name, avatarUrl)\n ? (prev as ConversationView).agent\n : { name, avatarUrl },\n disclosure: s.disclosure ?? this.info?.disclosure ?? null,\n welcome: this.info?.welcome ?? null,\n takeover: s.takeover,\n items,\n activity:\n prev && sameTools(prev.activity, activity) ? prev.activity : activity,\n responding: s.turn !== null || s.streaming !== null,\n openQuestion: s.openQuestion,\n answersNeedWebSocket: status === 'sse',\n turnsLeft: s.turnsLeft,\n history: this.historyState,\n };\n if (prev && shallowEqual(prev, view)) return prev;\n return view;\n }\n\n private status(): ConversationStatus {\n if (this.disposed) return 'closed';\n if (this.suspended) return 'idle'; // in the background on purpose: nothing to show\n const session = this.session;\n if (!session) {\n if (this.failed) return 'unavailable';\n return this.getting || this.early.size ? 'starting' : 'idle';\n }\n const status = session.status;\n if (this.failed && status === 'ended') return 'unavailable';\n if (status === 'idle')\n return this.offlineAfterRetries || this.online === false\n ? 'offline'\n : 'idle';\n if (status === 'reconnecting' && this.online === false) return 'offline';\n return status;\n }\n\n private nextFrom(state: ConversationState): ConversationView['next'] {\n if (this.session?.status !== 'ended' && state.reconnect === 'allowed')\n return null;\n if (state.reconnect === 'new_session_on_next_action') return 'continue';\n if (state.reconnect === 'user_action_only') return 'continue_here';\n return null;\n }\n\n /** The streamed text, current at once; its listeners hear of it with the next flush. */\n private stream(state: ConversationState): void {\n const s = state.streaming;\n if (!s) {\n if (this.streaming !== null) {\n this.streaming = null;\n this.streamDirty = true;\n }\n return;\n }\n if (this.streaming?.turnId === s.turnId && this.streaming.text === s.text)\n return;\n this.streaming = { key: `a:${s.turnId}`, turnId: s.turnId, text: s.text };\n this.streamDirty = true;\n }\n\n private scheduler(): FrameScheduler {\n return this.options.scheduler ?? defaultScheduler;\n }\n\n // ------------------------------------------------------------ persistence\n\n private key(): string {\n return this.options.persistenceKey ?? 'vinaverse.conversation';\n }\n\n private restore(): void {\n const store = this.options.persistence;\n if (!store) return;\n const done = () => {\n this.historyState = 'restored';\n this.update();\n };\n const apply = (raw: string | null) => {\n if (this.disposed) return;\n if (raw === null) return done();\n try {\n const saved = JSON.parse(raw) as { v?: unknown; items?: unknown };\n // Another version (an older kit's), or not a list: dropped. It still ends restored, or the skeleton stays.\n if (saved.v === PERSIST_VERSION && Array.isArray(saved.items))\n this.history = (saved.items as TimelineItem[]).map((item) =>\n item.type === 'card'\n ? ({ ...item, busy: false, restored: true } as CardItem)\n : item,\n );\n } catch {\n // A kept conversation that no longer reads is dropped, never fatal.\n }\n done();\n };\n try {\n const raw = store.getItem(this.key());\n if (typeof raw === 'string' || raw === null) apply(raw);\n else {\n // Async storage (Capacitor Preferences, IndexedDB): the UI draws a skeleton, not an empty conversation.\n this.historyState = 'restoring';\n this.view = this.compute(null);\n raw.then(apply, () => {\n if (!this.disposed) done();\n });\n }\n } catch {\n done(); // storage unavailable: nothing restored\n }\n }\n\n private schedulePersist(): void {\n const store = this.options.persistence;\n if (!store || this.disposed || this.persistTimer !== undefined) return;\n this.persistTimer = setTimeout(() => {\n this.persistTimer = undefined;\n const items = this.view.items.filter(persistable).slice(-HISTORY);\n try {\n void store.setItem(\n this.key(),\n JSON.stringify({ v: PERSIST_VERSION, items }),\n );\n } catch {\n // storage full or unavailable: the conversation goes on\n }\n }, PERSIST_DELAY);\n }\n\n // ------------------------------------------------------------ guards\n\n /** Past the session's end (`expires_at`), when the backend passed it on. */\n private sessionOver(): boolean {\n const end = this.info?.expires_at;\n return (\n end !== undefined &&\n (this.options.clock?.now() ?? Date.now()) >= Date.parse(end)\n );\n }\n\n private live(): void {\n if (this.disposed)\n throw new VinaverseClientError(\n 'session_ended',\n 'This conversation was closed.',\n );\n }\n\n private required(): VinaverseSession {\n this.live();\n if (!this.session)\n throw new VinaverseClientError(\n 'session_ended',\n 'The conversation has no session yet: start() it first.',\n );\n return this.session;\n }\n}\n\n/** One conversation with an agent, for any UI: see `ConversationStore`. */\nexport function createConversation(\n options: ConversationOptions,\n): ConversationStore {\n return new ConversationStore(options);\n}\n\nconst defaultScheduler: FrameScheduler = {\n request(callback) {\n const raf = (\n globalThis as {\n requestAnimationFrame?: (cb: () => void) => unknown;\n }\n ).requestAnimationFrame;\n return raf ? { raf: raf(callback) } : { timer: setTimeout(callback, 16) };\n },\n cancel(handle) {\n const h = handle as {\n raf?: unknown;\n timer?: ReturnType<typeof setTimeout>;\n };\n const caf = (globalThis as { cancelAnimationFrame?: (id: unknown) => void })\n .cancelAnimationFrame;\n if (h.raf !== undefined) caf?.(h.raf);\n if (h.timer !== undefined) clearTimeout(h.timer);\n },\n};\n\nfunction banner(\n status: ConversationStatus,\n next: ConversationView['next'],\n): ConversationBanner {\n if (status === 'connecting' || status === 'starting') return 'connecting';\n if (status === 'reconnecting') return 'reconnecting';\n if (status === 'offline') return 'offline';\n if (status === 'unavailable' || status === 'unauthorized')\n return 'unavailable';\n if (next === 'continue_here') return 'continued_elsewhere';\n return null;\n}\n\nfunction sameAgent(\n agent: ConversationView['agent'] | undefined,\n name: string | null,\n avatarUrl: string | null,\n): boolean {\n return agent?.name === name && agent?.avatarUrl === avatarUrl;\n}\n\nfunction sameTools(\n a: ConversationView['activity'],\n b: ConversationView['activity'],\n): boolean {\n return (\n a.length === b.length &&\n a.every(\n (t, i) =>\n t.turn_id === b[i]?.turn_id &&\n t.label === b[i]?.label &&\n t.state === b[i]?.state,\n )\n );\n}\n\nfunction shallowEqual(a: ConversationView, b: ConversationView): boolean {\n return (\n a.status === b.status &&\n a.banner === b.banner &&\n a.next === b.next &&\n a.agent.name === b.agent.name &&\n a.agent.avatarUrl === b.agent.avatarUrl &&\n a.disclosure === b.disclosure &&\n a.takeover?.by === b.takeover?.by &&\n a.takeover?.at === b.takeover?.at &&\n (a.takeover === null) === (b.takeover === null) &&\n a.items === b.items &&\n a.activity === b.activity &&\n a.responding === b.responding &&\n a.openQuestion === b.openQuestion &&\n a.answersNeedWebSocket === b.answersNeedWebSocket &&\n a.turnsLeft === b.turnsLeft &&\n a.history === b.history\n );\n}\n","// One conversation store per mode (a customer and a professional, say, each with an agent of its own): each mode keeps\n// its own timeline, its own history on the device (a persistence key of its own) and its own sessions, so switching\n// modes never shows one mode's conversation in the other. The tenant's backend gets the mode with every session\n// request and creates the session for that mode's agent.\nimport {\n type ConversationOptions,\n type ConversationSession,\n type ConversationStore,\n createConversation,\n type SessionRequest,\n} from './store.js';\n\n/** A session request, with the mode it is for. */\nexport interface ModeSessionRequest extends SessionRequest {\n readonly mode: string;\n}\n\nexport interface ConversationsByModeOptions\n extends Omit<ConversationOptions, 'getSession'> {\n /** Your backend creates the session for the mode's agent (its `subject.type`, its agent), with its service key. */\n readonly getSession: (\n request: ModeSessionRequest,\n ) => Promise<ConversationSession>;\n /** Every mode the app has, so `clear()` forgets each one's kept history, even one not opened since launch. */\n readonly modes?: readonly string[];\n}\n\nexport interface ConversationsByMode {\n /** The mode's store, made the first time it is asked for; the same store after that. */\n get(mode: string): ConversationStore;\n /**\n * The mode the person switched to: its store, with every other mode's sent to the background (no pings; closed\n * with `closeInBackground`). The kit then drives the selected one with the app's foreground and background.\n */\n select(mode: string): ConversationStore;\n /** Close every mode's store. */\n dispose(): void;\n /** Close every mode's store and forget what each kept on the device (sign-out). */\n clear(): void;\n}\n\nexport function createConversationsByMode(\n options: ConversationsByModeOptions,\n): ConversationsByMode {\n const { getSession, modes = [], ...shared } = options;\n const base = shared.persistenceKey ?? 'vinaverse.conversation';\n const stores = new Map<string, ConversationStore>();\n const get = (mode: string): ConversationStore => {\n let store = stores.get(mode);\n if (!store) {\n store = createConversation({\n ...shared,\n persistenceKey: `${base}.${mode}`,\n getSession: (request) => getSession({ ...request, mode }),\n });\n stores.set(mode, store);\n }\n return store;\n };\n return {\n get,\n select(mode) {\n for (const [other, store] of stores)\n if (other !== mode) store.setForeground(false);\n return get(mode);\n },\n dispose() {\n for (const store of stores.values()) store.dispose();\n stores.clear();\n },\n clear() {\n for (const mode of new Set([...stores.keys(), ...modes]))\n get(mode).clear();\n stores.clear();\n },\n };\n}\n"]}