@vinaverse/client 0.1.0-alpha.4 → 0.1.0-alpha.6

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 (41) hide show
  1. package/README.md +46 -0
  2. package/dist/agent/index.cjs +2852 -0
  3. package/dist/agent/index.cjs.map +1 -0
  4. package/dist/agent/index.d.cts +57 -0
  5. package/dist/agent/index.d.ts +57 -0
  6. package/dist/agent/index.js +99 -0
  7. package/dist/agent/index.js.map +1 -0
  8. package/dist/{chunk-MKUNSAMT.js → chunk-GWLLUOFY.js} +3 -9
  9. package/dist/chunk-GWLLUOFY.js.map +1 -0
  10. package/dist/chunk-VSJDVLCP.js +9 -0
  11. package/dist/chunk-VSJDVLCP.js.map +1 -0
  12. package/dist/chunk-XPES5PZ3.js +416 -0
  13. package/dist/chunk-XPES5PZ3.js.map +1 -0
  14. package/dist/chunk-ZWG2TMUL.js +975 -0
  15. package/dist/chunk-ZWG2TMUL.js.map +1 -0
  16. package/dist/contract-_NMdPjgN.d.cts +6 -0
  17. package/dist/contract-_NMdPjgN.d.ts +6 -0
  18. package/dist/conversation/index.cjs +1 -1
  19. package/dist/conversation/index.cjs.map +1 -1
  20. package/dist/conversation/index.d.cts +6 -377
  21. package/dist/conversation/index.d.ts +6 -377
  22. package/dist/conversation/index.js +5 -973
  23. package/dist/conversation/index.js.map +1 -1
  24. package/dist/index.cjs.map +1 -1
  25. package/dist/index.d.cts +2 -1
  26. package/dist/index.d.ts +2 -1
  27. package/dist/index.js +2 -1
  28. package/dist/runtime-CErMdYxJ.d.cts +234 -0
  29. package/dist/runtime-DLJbJkSr.d.ts +234 -0
  30. package/dist/{session-C3qZwGPG.d.cts → session-8W3fRNeb.d.cts} +1514 -253
  31. package/dist/{session-C3qZwGPG.d.ts → session-8W3fRNeb.d.ts} +1514 -253
  32. package/dist/store-C7FtS5AY.d.cts +384 -0
  33. package/dist/store-DFk0ayh8.d.ts +384 -0
  34. package/dist/testing/index.cjs +237 -0
  35. package/dist/testing/index.cjs.map +1 -0
  36. package/dist/testing/index.d.cts +49 -0
  37. package/dist/testing/index.d.ts +49 -0
  38. package/dist/testing/index.js +222 -0
  39. package/dist/testing/index.js.map +1 -0
  40. package/package.json +33 -1
  41. package/dist/chunk-MKUNSAMT.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/contract.ts","../src/engine.ts","../src/errors.ts","../src/events.ts","../src/secret.ts","../src/sse.ts","../src/session.ts"],"names":[],"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","// 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","/** 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\ntype 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","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"]}
1
+ {"version":3,"sources":["../src/contract.ts","../src/engine.ts","../src/errors.ts","../src/events.ts","../src/secret.ts","../src/sse.ts","../src/session.ts"],"names":[],"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","// 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","/** 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","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"]}