@vinaverse/client 0.1.0-alpha.1 → 0.1.0-alpha.3

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/conversation/answers.ts","../../src/conversation/links.ts","../../src/conversation/timeline.ts","../../src/conversation/store.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["// Whether an answer to a question card can be sent: the card's own rules (`Question`, `QuestionAnswer`), checked as\n// the person answers so a UI enables Send only for an answer the server will take. The server still decides: what it\n// rejects arrives as `ui.answer.rejected` and unlocks the question. Shared by every UI kit.\nimport type { AnswerInput, Question } from '../events.js';\n\nexport type AnswerProblem =\n /** Nothing chosen or typed, and the question is required (or skipped while required). */\n | 'required'\n /** Fewer choices than `min`. */\n | 'too_few'\n /** More choices than `max`, or more than one where one is asked. */\n | 'too_many'\n /** A value that is not on the card, `none_of_the_above` with another choice, or a form the kind does not take. */\n | 'not_allowed'\n /** The text, or the \"Other\" text, is longer than the card allows (in code points). */\n | 'too_long'\n /** A number outside `min`…`max`, or off its `step`. */\n | 'out_of_range'\n /** Not a calendar date, or outside the card's bounds. */\n | 'bad_date';\n\nconst CHOICE = new Set([\n 'single_choice',\n 'multi_choice',\n 'image_choice',\n 'yes_no',\n 'list_choice',\n]);\nconst ONE_CHOICE = new Set(['single_choice', 'yes_no', 'list_choice']);\n\n/** Unicode code points, as the contract counts every text limit (an emoji outside the BMP is one). */\nexport function codePoints(text: string): number {\n let n = 0;\n for (const _ of text) n++;\n return n;\n}\n\ntype Answer = {\n values?: readonly string[];\n other_text?: string;\n text?: string;\n number?: number;\n date?: string;\n upload_ref?: string;\n skipped?: boolean;\n};\n\n/**\n * The first rule an answer breaks, or null when it can be sent. For `rate_each`, check each row's answer against\n * the question: one column from `options`, or `skipped` when not required. A kind this client does not know is the\n * server's to judge (null).\n */\nexport function answerProblem(\n question: Question,\n input: AnswerInput,\n): AnswerProblem | null {\n const answer = input as Answer;\n if (answer.skipped === true) return question.required ? 'required' : null;\n const kind = question.kind as string;\n if (CHOICE.has(kind)) return choiceProblem(question, answer);\n switch (kind) {\n case 'rate_each': {\n const values = answer.values ?? [];\n if (answer.other_text !== undefined) return 'not_allowed';\n if (values.length === 0) return 'required';\n if (values.length > 1) return 'too_many';\n return (question.options ?? []).some((o) => o.value === values[0])\n ? null\n : 'not_allowed';\n }\n case 'short_text':\n case 'long_text': {\n const text = answer.text ?? '';\n if (!text.trim()) return 'required';\n return codePoints(text) > (question.text?.max_length ?? 2000)\n ? 'too_long'\n : null;\n }\n case 'number':\n case 'scale': {\n const n = answer.number;\n if (typeof n !== 'number' || !Number.isFinite(n)) return 'required';\n const range = kind === 'number' ? question.number : question.scale;\n if (!range) return null;\n if (n < range.min || n > range.max) return 'out_of_range';\n const steps = (n - range.min) / range.step;\n return Math.abs(steps - Math.round(steps)) > 1e-9 ? 'out_of_range' : null;\n }\n case 'date':\n return dateProblem(question, answer.date);\n case 'photo':\n return answer.upload_ref ? null : 'required';\n default:\n return null;\n }\n}\n\nfunction choiceProblem(\n question: Question,\n answer: Answer,\n): AnswerProblem | null {\n const values = answer.values ?? [];\n const other = answer.other_text;\n if (other !== undefined) {\n if (!question.allows_other) return 'not_allowed';\n if (!other.trim()) return 'required';\n if (codePoints(other) > (question.other_max_length ?? 500))\n return 'too_long';\n if (\n values.length > 0 &&\n question.kind !== 'single_choice' &&\n question.kind !== 'multi_choice'\n )\n return 'not_allowed';\n }\n if (values.length === 0) return other !== undefined ? null : 'required';\n if (new Set(values).size !== values.length) return 'not_allowed';\n const none = question.none_of_the_above?.value;\n if (none !== undefined && values.includes(none))\n return values.length === 1 && other === undefined ? null : 'not_allowed';\n const known = new Set((question.options ?? []).map((o) => o.value));\n if (!values.every((v) => known.has(v))) return 'not_allowed';\n // One option for the single kinds (a single_choice may add its \"Other\" too, as the contract allows); the \"Other\"\n // counts as a choice against min and max.\n if (ONE_CHOICE.has(question.kind) && values.length > 1) return 'too_many';\n const chosen = values.length + (other !== undefined ? 1 : 0);\n if (question.min !== undefined && chosen < question.min) return 'too_few';\n if (question.max !== undefined && chosen > question.max) return 'too_many';\n return null;\n}\n\nfunction dateProblem(\n question: Question,\n date: string | undefined,\n): AnswerProblem | null {\n if (!date) return 'required';\n const m = /^(\\d{4})-(\\d{2})-(\\d{2})$/.exec(date);\n if (!m) return 'bad_date';\n const [y, mo, d] = [Number(m[1]), Number(m[2]), Number(m[3])];\n const at = new Date(Date.UTC(y, mo - 1, d));\n if (\n at.getUTCFullYear() !== y ||\n at.getUTCMonth() !== mo - 1 ||\n at.getUTCDate() !== d\n )\n return 'bad_date';\n // ISO dates compare as text.\n if (question.date?.min !== undefined && date < question.date.min)\n return 'bad_date';\n if (question.date?.max !== undefined && date > question.date.max)\n return 'bad_date';\n return null;\n}\n","// The deep-link rule an app applies to a card's `deep_link` and a proposal's `edit_deep_link` before it opens one\n// (docs/realtime-protocol.md §6, admin-v1.yaml `Connector.deep_link_prefixes`): the link starts with a prefix the\n// tenant registered, compared code point for code point, and what follows the prefix is on the allowlist. The\n// patterns are the contract's own (fixtures/api/deep-link-vectors.json), and the tests run its vectors.\n\nconst PREFIX =\n /^[a-z][a-z0-9+.-]*:(\\/\\/\\.*[A-Za-z0-9_~-][A-Za-z0-9._~-]*(:(6553[0-5]|655[0-2][0-9]|65[0-4][0-9]{2}|6[0-4][0-9]{3}|[1-5][0-9]{4}|[1-9][0-9]{0,3}))?\\/|\\.*[A-Za-z0-9_~-][A-Za-z0-9._~-]*\\/)(\\.*[A-Za-z0-9_~-][A-Za-z0-9._~-]*\\/)*$/;\nconst PREFIX_HTTPS =\n /^https?:\\/\\/[a-z0-9-]+(\\.[a-z0-9-]+)*(:(6553[0-5]|655[0-2][0-9]|65[0-4][0-9]{2}|6[0-4][0-9]{3}|[1-5][0-9]{4}|[1-9][0-9]{0,3}))?\\/\\.*[A-Za-z0-9_~-][A-Za-z0-9._~-]*\\//;\nconst REFUSED_SCHEMES =\n /^(javascript|vbscript|data|blob|file|filesystem|about|view-source|intent|android-app|content|jar|mhtml|itms-services|ftp|ws|wss):/;\n// biome-ignore lint/suspicious/noControlCharactersInRegex: the contract refuses control characters in a prefix.\nconst CONTROLS = /[\\x00-\\x1f\\x7f]/;\nconst REMAINDER =\n /^(\\.*[A-Za-z0-9_~-][A-Za-z0-9._~-]*(\\/\\.*[A-Za-z0-9_~-][A-Za-z0-9._~-]*)*\\/?)?(\\?([A-Za-z0-9._~=&-]|%(2[0-46-9A-Ea-e]|3[0-9B-Fb-f]|[46][0-9A-Fa-f]|5[0-9ABD-Fabd-f]|7[0-9A-Ea-e]))*)?$/;\n\n/** Whether a prefix may be registered: the contract's prefix pattern, no refused scheme, no control character. */\nexport function isValidLinkPrefix(prefix: string): boolean {\n if (CONTROLS.test(prefix) || REFUSED_SCHEMES.test(prefix)) return false;\n if (/^https?:/.test(prefix) && !PREFIX_HTTPS.test(prefix)) return false;\n return PREFIX.test(prefix);\n}\n\n/**\n * Whether a card's link may be opened: it starts with one of the registered prefixes (invalid ones are ignored) and\n * what follows is a path and an optional query of the allowed characters. Route by the page it names; never open a\n * query value.\n */\nexport function isAllowedLink(\n link: string,\n prefixes: readonly string[],\n): boolean {\n return prefixes.some(\n (prefix) =>\n isValidLinkPrefix(prefix) &&\n link.startsWith(prefix) &&\n REMAINDER.test(link.slice(prefix.length)),\n );\n}\n","// The timeline: the engine's messages and cards, the store's pending texts and system rows, in one list sorted by\n// arrival, each item reused from the previous list when nothing about it changed (structural sharing).\nimport type { ConversationState, HeldCard, Message } from '../engine.js';\nimport { isKnownCard } from '../events.js';\nimport type {\n MessageItem,\n MessageState,\n SystemItem,\n TimelineItem,\n} from './view.js';\n\n/** A text the person sent through the store, kept until the engine holds it as a message or forgets it. */\nexport interface SentText {\n readonly text: string;\n /** Where it sorts until it becomes a message: just after what was drawn when it was sent. */\n readonly order: number;\n}\n\nexport interface TimelineInput {\n readonly state: ConversationState;\n /** Items restored from persistence, drawn first. */\n readonly history: readonly TimelineItem[];\n /** By `client_event_id`, in the order sent. */\n readonly sent: ReadonlyMap<string, SentText>;\n /** Texts not yet given to a session (no session yet): drawn as sending. */\n readonly early: ReadonlySet<string>;\n /** Ids the person sent again (`retry`): their old \"not sent\" item is gone. */\n readonly retried: ReadonlySet<string>;\n readonly busy: ReadonlySet<string>;\n /** A resumed session brought its own transcript: the history kept on the device gives way to it. */\n readonly transcriptSeen?: boolean;\n /** Proposals whose tenant decision threw. */\n readonly decisionErrors?: ReadonlySet<string>;\n readonly system: readonly {\n readonly item: SystemItem;\n readonly order: number;\n }[];\n}\n\n/** The highest arrival number drawn, so something added now sorts after it. */\nexport function lastOrder(state: ConversationState): number {\n let last = -1;\n for (const m of state.messages) last = Math.max(last, m.seq);\n for (const c of state.cards) last = Math.max(last, c.seq);\n if (state.streaming) last = Math.max(last, state.streaming.seq);\n return last;\n}\n\n/** The person's text's state, or null when it is no longer pending (a message now, or settled with nothing to draw). */\nexport function pendingState(\n id: string,\n input: Pick<TimelineInput, 'state' | 'early' | 'retried'>,\n): Exclude<MessageState, 'sent' | 'delivered' | 'streaming'> | null {\n const { state } = input;\n if (input.retried.has(id)) return null;\n if (input.early.has(id)) return 'sending';\n if (state.messages.some((m) => m.key === id)) return null;\n const refused = state.refused[id];\n if (refused !== undefined) return refused === 'guardrail' ? null : 'not_sent';\n if (state.heldForNextSession.includes(id)) return 'held';\n if (\n state.resend.includes(id) ||\n state.held.includes(id) ||\n state.unacknowledged.some((f) => f.client_event_id === id)\n )\n return 'sending';\n return null; // a duplicate whose earlier turn stands, or forgotten\n}\n\nexport function buildTimeline(\n input: TimelineInput,\n previous: readonly TimelineItem[],\n): readonly TimelineItem[] {\n const before = new Map(previous.map((item) => [item.key, item]));\n const live: { item: TimelineItem; order: number }[] = [];\n const { state } = input;\n\n for (const m of state.messages)\n live.push({ item: messageItem(m), order: m.seq });\n if (state.streaming) {\n live.push({\n item: {\n type: 'message',\n key: `a:${state.streaming.turnId}`,\n role: 'agent',\n text: '',\n state: 'streaming',\n },\n order: state.streaming.seq,\n });\n }\n for (const card of state.cards) {\n if (!isKnownCard(card.card as { kind: string })) continue; // §5: skip a kind this client does not know\n live.push({\n item: {\n type: 'card',\n key: card.id,\n card,\n busy: input.busy.has(card.id),\n ...(input.decisionErrors?.has(card.id)\n ? { decisionError: true as const }\n : {}),\n },\n order: card.seq,\n });\n }\n for (const { item, order } of input.system) live.push({ item, order });\n for (const [id, sent] of input.sent) {\n const pending = pendingState(id, input);\n if (pending === null) continue;\n const rejection = state.rejections[id];\n live.push({\n item: {\n type: 'message',\n key: id,\n role: 'person',\n text: sent.text,\n state: pending,\n ...(pending === 'not_sent'\n ? {\n rejection: rejection ?? {\n code: state.refused[id] ?? '',\n message: '',\n },\n }\n : {}),\n },\n order: sent.order,\n });\n }\n live.sort((a, b) => a.order - b.order); // stable: equal orders keep the order they were added in\n\n // History gives way to the conversation: an item the live session holds again (a restored card in pending_cards)\n // takes the history item's place, so it updates without moving; the whole of it gives way once a resumed session\n // brought its own transcript.\n const liveByKey = new Map(live.map((l) => [l.item.key, l.item]));\n const transcript = input.transcriptSeen === true;\n const items: TimelineItem[] = [];\n const placed = new Set<string>();\n if (!transcript)\n for (const item of input.history) {\n const current = liveByKey.get(item.key);\n items.push(current ?? item);\n if (current) placed.add(item.key);\n }\n for (const { item } of live) if (!placed.has(item.key)) items.push(item);\n\n let same = items.length === previous.length;\n const shared = items.map((item, i) => {\n const prev = before.get(item.key);\n const kept = prev !== undefined && equal(prev, item) ? prev : item;\n if (kept !== previous[i]) same = false;\n return kept;\n });\n return same ? previous : shared;\n}\n\nfunction messageItem(m: Message): MessageItem {\n const role = m.role === 'assistant' ? 'agent' : m.role;\n return {\n type: 'message',\n key: m.key,\n role,\n text: m.text,\n state: m.received ? 'delivered' : 'sent',\n ...(m.partial ? { partial: m.partial } : {}),\n ...(m.refusal ? { refusal: true as const } : {}),\n };\n}\n\nfunction equal(a: TimelineItem, b: TimelineItem): boolean {\n if (a.type !== b.type || a.key !== b.key) return false;\n if (a.type === 'message' && b.type === 'message')\n return (\n a.role === b.role &&\n a.text === b.text &&\n a.state === b.state &&\n a.partial === b.partial &&\n a.refusal === b.refusal &&\n a.rejection?.code === b.rejection?.code &&\n a.rejection?.message === b.rejection?.message\n );\n if (a.type === 'card' && b.type === 'card')\n return (\n a.busy === b.busy &&\n a.restored === b.restored &&\n a.decisionError === b.decisionError &&\n sameCard(a.card, b.card)\n );\n return a === b; // system items are made once and kept\n}\n\nfunction sameCard(a: HeldCard, b: HeldCard): boolean {\n return (\n a.card === b.card &&\n a.seq === b.seq &&\n a.turnId === b.turnId &&\n a.outcome === b.outcome &&\n a.locked.length === b.locked.length &&\n a.locked.every((q, i) => q === b.locked[i]) &&\n a.question?.state === b.question?.state &&\n JSON.stringify(a.question?.answer) === JSON.stringify(b.question?.answer) &&\n JSON.stringify(a.question?.row_answers) ===\n JSON.stringify(b.question?.row_answers)\n );\n}\n\n/** The parts of an item worth keeping across an app restart: what was on the server, never what was pending. */\nexport function persistable(item: TimelineItem): boolean {\n if (item.type === 'message')\n return item.state === 'sent' || item.state === 'delivered';\n return item.type === 'card';\n}\n","// The conversation store: one conversation with an agent, for any UI framework. It owns the session (and the next\n// one after a resume), turns the engine's state into a view a UI draws, and runs what the protocol asks of an app\n// on the person's actions: resume on the next action, hold what was typed early, decide proposals through the\n// tenant's handler, keep streamed text to one update per frame. No framework import: React, React Native and Angular\n// bind to `subscribe` and `getSnapshot`.\nimport { ConversationEngine, type ConversationState } from '../engine.js';\nimport { VinaverseClientError } from '../errors.js';\nimport type {\n AnswerInput,\n ClientSecret,\n ProposalOutcome,\n ServerEvent,\n SessionInfo,\n} from '../events.js';\nimport {\n randomId,\n type SessionOptions,\n type SessionStatus,\n VinaverseSession,\n} from '../session.js';\nimport { isAllowedLink } from './links.js';\nimport {\n buildTimeline,\n lastOrder,\n persistable,\n type SentText,\n} from './timeline.js';\nimport type {\n CardItem,\n ConversationBanner,\n ConversationStatus,\n ConversationView,\n StreamingText,\n SystemItem,\n TimelineItem,\n} from './view.js';\n\n/** Why the store asks the tenant's backend for a session. */\nexport type SessionReason =\n /** The conversation opens (`start()`). */\n | 'open'\n /** The session ended (idle, expired, its turn limit) and the person acted again. */\n | 'resume'\n /** The conversation continued on another device, and the person chose to continue here. */\n | 'continue_here';\n\nexport interface SessionRequest {\n readonly reason: SessionReason;\n /** The conversation so far, when known: the backend names it (with its `conversation_key`) to resume it. */\n readonly conversationId: string | null;\n /** For `subject.locale` and `subject.timezone`, which the backend sets. */\n readonly locale?: string;\n readonly timeZone?: string;\n /**\n * Aborted when the answer is no longer wanted (the conversation was disposed or cleared, or a newer request took\n * its place): pass it to `fetch`, so a late answer never opens a socket after the person left.\n */\n readonly signal?: AbortSignal;\n}\n\n/** What `createSession` gave the tenant's backend, as it passes it on: the session, its agent and disclosure. */\nexport type ConversationSession = SessionInfo & {\n readonly agent?: {\n readonly display_name?: string;\n readonly avatar_url?: string;\n };\n readonly disclosure?: string;\n};\n\n/**\n * Runs a callback before the next frame; `requestAnimationFrame` where there is one. Every listener, of the view and\n * of the streaming text, is called from it, at most once per frame: a zone.js app re-enters its zone here once. A\n * test passes one that runs the callback at once.\n */\nexport interface FrameScheduler {\n request(callback: () => void): unknown;\n cancel(handle: unknown): void;\n}\n\n/** Where the drawn conversation is kept across app restarts (opt-in; prefer encrypted storage). */\nexport interface ConversationPersistence {\n getItem(key: string): string | null | Promise<string | null>;\n setItem(key: string, value: string): void | Promise<void>;\n removeItem(key: string): void | Promise<void>;\n}\n\nexport interface ConversationOptions {\n /**\n * A session from the tenant's backend, which creates it with its service key (the app never holds one). Asked once\n * per need: when the conversation opens, and on the person's action after a session ended.\n */\n readonly getSession: (\n request: SessionRequest,\n ) => Promise<ConversationSession>;\n /** A fresh client secret for a session (on 4401), from the tenant's backend. */\n readonly refreshSecret?: (\n sessionId: string,\n ) => Promise<ClientSecret | string>;\n readonly locale?: string;\n readonly timeZone?: string;\n /** The prefixes the tenant registered for card links (`checkLink`). */\n readonly deepLinkPrefixes?: readonly string[];\n /** Keep the drawn conversation across restarts (off unless given). */\n readonly persistence?: ConversationPersistence;\n /** Its key; one per signed-in person. Default `vinaverse.conversation`. */\n readonly persistenceKey?: string;\n /** Default: `requestAnimationFrame`, else a 16 ms timer, resolved when first used (never at import or creation). */\n readonly scheduler?: FrameScheduler;\n /** The transport's own options (`auth`, `webSocket`, `fetch`, delays…). */\n readonly transport?: Omit<\n SessionOptions,\n 'session' | 'refreshSecret' | 'engine' | 'createId'\n >;\n /** New `client_event_id`s. Default: random, `ce_` and 22 characters. */\n readonly createId?: () => string;\n /** Something failed that no call returned: getting a session, an input that could not be delivered. */\n readonly onError?: (error: unknown) => void;\n}\n\n/** A text is at most 2000 code points (`TurnInput`). */\nexport const MAX_TEXT = 2000;\n/** History kept across restarts: the newest items. */\nconst HISTORY = 100;\nconst PERSIST_DELAY = 500;\nconst PERSIST_VERSION = 1;\n\nconst NO_ITEMS: readonly TimelineItem[] = [];\nconst OUTCOMES: ReadonlySet<string> = new Set([\n 'confirmed',\n 'declined',\n 'failed',\n 'expired',\n]);\n\nexport class ConversationStore {\n private readonly options: ConversationOptions;\n private readonly engine = new ConversationEngine();\n private session: VinaverseSession | null = null;\n private info: ConversationSession | null = null;\n private getting: Promise<VinaverseSession | null> | null = null;\n private failed = false;\n private disposed = false;\n private online: boolean | null = null;\n private foreground = true;\n private lastStatus: SessionStatus = 'idle';\n private offlineAfterRetries = false;\n /** The id the next send gets, so a text typed before the session keeps its key. */\n private nextId: string | null = null;\n\n private readonly sent = new Map<string, SentText>();\n private readonly early = new Map<string, string>();\n private readonly retried = new Set<string>();\n private readonly busy = new Set<string>();\n /** Proposals whose tenant decision threw: shown as recoverable, the person may decide again. */\n private readonly decisionErrors = new Set<string>();\n private system: { item: SystemItem; order: number }[] = [];\n /** Numbers system rows that carry no id of their own. */\n private systemSeq = 0;\n private history: readonly TimelineItem[] = NO_ITEMS;\n private historyState: ConversationView['history'] = 'none';\n /** A resumed session.ready carried a transcript: the server's history replaced what the device kept. */\n private transcriptSeen = false;\n private locale: string | undefined;\n /** The request for a session in flight, to abort when it is no longer wanted. */\n private fetching: { abort(): void } | null = null;\n\n private view: ConversationView;\n private readonly listeners = new Set<() => void>();\n private streaming: StreamingText | null = null;\n private readonly streamListeners = new Set<() => void>();\n /** The frame that will notify, and what it will notify about. */\n private frame: unknown = undefined;\n private framePending = false;\n private viewDirty = false;\n private streamDirty = false;\n private persistTimer: ReturnType<typeof setTimeout> | undefined;\n private unsubscribe: (() => void)[] = [];\n\n constructor(options: ConversationOptions) {\n this.options = options;\n this.locale = options.locale;\n this.view = this.compute(null);\n this.restore();\n }\n\n // ------------------------------------------------------------ reading\n\n getSnapshot = (): ConversationView => this.view;\n\n subscribe = (listener: () => void): (() => void) => {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n };\n\n getStreaming = (): StreamingText | null => this.streaming;\n\n subscribeStreaming = (listener: () => void): (() => void) => {\n this.streamListeners.add(listener);\n return () => this.streamListeners.delete(listener);\n };\n\n /** Whether a card's link may be opened (the deep-link rule, against `deepLinkPrefixes`). */\n checkLink(link: string): boolean {\n return isAllowedLink(link, this.options.deepLinkPrefixes ?? []);\n }\n\n // ------------------------------------------------------------ the conversation's life\n\n /** Ask for a session and connect, early: a client secret must open its first connection within two minutes. */\n start(): void {\n this.live();\n if (this.session) {\n if (this.session.status === 'idle') this.session.connect();\n return;\n }\n void this.ensureSession('open');\n }\n\n /** Close for good. */\n dispose(): void {\n if (this.disposed) return;\n this.disposed = true;\n this.fetching?.abort();\n this.fetching = null;\n this.session?.close();\n for (const off of this.unsubscribe) off();\n this.unsubscribe = [];\n clearTimeout(this.persistTimer);\n this.update();\n this.flush(); // the closed view reaches the listeners now: no frame may come after the screen is gone\n }\n\n /** Close for good and forget the conversation kept on the device (sign-out). Never throws for the storage. */\n clear(): void {\n this.dispose();\n this.history = NO_ITEMS;\n try {\n const removed = this.options.persistence?.removeItem(this.key());\n if (removed) removed.catch(() => undefined);\n } catch {\n // storage blocked: sign-out goes on\n }\n this.update();\n this.flush();\n }\n\n /**\n * The person switched the app's language: the UI's words change at once (the kit's own locale); the next session\n * asks for this locale (`subject.locale`). The open session keeps its language: the agent answers in the new one\n * from the next session, and the store never starts a session for it.\n */\n setLocale(locale: string | undefined): void {\n this.locale = locale;\n }\n\n /** The app came to the foreground or went to the background (AppState, `visibilitychange`). */\n setForeground(foreground: boolean): void {\n this.foreground = foreground;\n this.session?.setForeground(foreground);\n if (foreground) this.reconnectIfDown();\n }\n\n /** The network as the app sees it; null when unknown. Back online reconnects a connection that gave up. */\n setOnline(online: boolean | null): void {\n this.online = online;\n if (online) this.reconnectIfDown();\n this.update();\n }\n\n // ------------------------------------------------------------ the person's actions\n\n /** Send a typed message; returns its `client_event_id`. Typed before a session exists, it is sent once one does. */\n send(text: string): string {\n this.live();\n if (!text.trim()) throw new RangeError('A message needs some text.');\n if ([...text].length > MAX_TEXT)\n throw new RangeError(`A message is at most ${MAX_TEXT} characters.`);\n const id = (this.options.createId ?? randomId)();\n this.sent.set(id, { text, order: lastOrder(this.engine.state()) + 0.5 });\n if (!this.session) {\n this.early.set(id, text);\n void this.ensureSession('open');\n this.update();\n return id;\n }\n if (this.nextFrom(this.engine.state()) === 'continue_here') {\n // The session refuses input now; typing here is the person continuing here, so it goes to the next session.\n this.early.set(id, text);\n void this.resumeWith('continue_here');\n this.update();\n return id;\n }\n this.nextId = id;\n this.session.sendText(text);\n this.nextId = null;\n this.continueIfEnded();\n return id;\n }\n\n /** Answer a question card (a `rate_each` row by its `question_id`); returns the `client_event_id`. */\n answer(cardId: string, questionId: string, answer: AnswerInput): string {\n const session = this.required();\n const id = session.answer(cardId, questionId, answer);\n this.continueIfEnded();\n return id;\n }\n\n /** A card action (`ui.action`) other than a proposal's outcome. */\n cardAction(cardId: string, action: string): string {\n return this.required().action(cardId, action);\n }\n\n /**\n * Decide a proposal: `decide` is the tenant's own call (its backend, the person's token), which confirms or\n * declines it and says the outcome; the store then reports it. One decision per card; the card is busy meanwhile.\n * Resolves to the outcome reported, or null when the card was busy or already decided.\n *\n * Only an outcome `decide` resolves with is reported (§6: the first is final). When `decide` throws, or resolves\n * with anything but `confirmed`, `declined`, `failed` or `expired`, nothing is reported: the backend may have\n * applied the change, so the outcome stays unknown; the card shows `decisionError` and the person may decide\n * again. When the conversation is disposed meanwhile (sign-out), the outcome is not reported either: the tenant's\n * backend holds it, and the session takes it as unknown.\n */\n async decideProposal(\n cardId: string,\n decide: () => Promise<ProposalOutcome>,\n ): Promise<ProposalOutcome | null> {\n this.live();\n const card = this.engine.state().cards.find((c) => c.id === cardId);\n if (card?.kind !== 'proposal') return null;\n if (this.busy.has(cardId) || (card.outcome ?? null) !== null) return null;\n this.busy.add(cardId);\n this.decisionErrors.delete(cardId);\n this.update();\n try {\n const outcome: unknown = await decide();\n if (typeof outcome !== 'string' || !OUTCOMES.has(outcome))\n throw new TypeError(\n `decide() resolved with ${JSON.stringify(outcome)}, not confirmed, declined, failed or expired`,\n );\n if (this.disposed) return outcome as ProposalOutcome;\n if (this.view.next === 'continue') await this.resumeWith('resume');\n this.required().reportOutcome(cardId, outcome as ProposalOutcome);\n return outcome as ProposalOutcome;\n } catch (error) {\n this.decisionErrors.add(cardId);\n throw error;\n } finally {\n this.busy.delete(cardId);\n this.update();\n }\n }\n\n /** Send a \"not sent\" message again, as a new message (the person's action). Returns the new id. */\n retry(key: string): string | null {\n const sent = this.sent.get(key);\n if (!sent || this.engine.state().refused[key] === undefined) return null;\n this.retried.add(key);\n this.sent.delete(key);\n return this.send(sent.text);\n }\n\n /** After the conversation continued on another device: continue it here (the person's choice). */\n continueHere(): Promise<void> {\n return this.resumeWith('continue_here');\n }\n\n /** Stop the turn in progress. */\n cancel(): void {\n const turn = this.engine.state().turn;\n if (this.session && turn) this.session.cancel(turn);\n }\n\n // ------------------------------------------------------------ sessions\n\n private async ensureSession(\n reason: SessionReason,\n ): Promise<VinaverseSession | null> {\n if (this.session) return this.session;\n if (this.getting) return this.getting;\n this.getting = this.fetchSession(reason).then((info) => {\n this.getting = null;\n if (!info || this.disposed) return null;\n this.open(info);\n return this.session;\n });\n this.update();\n return this.getting;\n }\n\n private async fetchSession(\n reason: SessionReason,\n ): Promise<ConversationSession | null> {\n this.failed = false;\n this.fetching?.abort(); // a newer request takes the place of an older one\n const Controller = (\n globalThis as { AbortController?: new () => AbortController }\n ).AbortController;\n const controller = Controller ? new Controller() : null;\n const mine = { abort: () => controller?.abort() };\n this.fetching = mine;\n let aborted = false;\n const signal = controller?.signal;\n signal?.addEventListener('abort', () => {\n aborted = true;\n });\n try {\n const info = await this.options.getSession({\n reason,\n conversationId: this.engine.state().conversationId,\n ...(this.locale !== undefined ? { locale: this.locale } : {}),\n ...(this.options.timeZone !== undefined\n ? { timeZone: this.options.timeZone }\n : {}),\n ...(signal ? { signal } : {}),\n });\n return aborted || this.fetching !== mine ? null : info;\n } catch (error) {\n if (aborted || this.fetching !== mine) return null; // no longer wanted: not a failure\n this.failed = true;\n this.getting = null;\n this.options.onError?.(error);\n this.update();\n return null;\n } finally {\n if (this.fetching === mine) this.fetching = null;\n }\n }\n\n private open(info: ConversationSession): void {\n this.info = info;\n const session = new VinaverseSession({\n ...this.options.transport,\n session: info,\n engine: this.engine,\n ...(this.options.refreshSecret\n ? { refreshSecret: this.options.refreshSecret }\n : {}),\n createId: () => this.nextId ?? (this.options.createId ?? randomId)(),\n });\n this.session = session;\n this.unsubscribe.push(\n session.on('state', () => this.update()),\n session.on('status', (status) => this.statusChanged(status)),\n session.on('event', (event) => this.event(event)),\n session.on('error', (error) => this.options.onError?.(error)),\n );\n session.setForeground(this.foreground);\n session.connect();\n this.flushEarly();\n }\n\n /** What was typed before there was a session to take it. */\n private flushEarly(): void {\n const session = this.session;\n if (!session) return;\n for (const [id, text] of this.early) {\n this.nextId = id;\n session.sendText(text);\n }\n this.nextId = null;\n this.early.clear();\n this.update();\n }\n\n /** A new session for the conversation, then `resume()`: once per person action, never in a loop. */\n private resuming: Promise<void> | null = null;\n private resumeWith(reason: SessionReason): Promise<void> {\n this.live();\n if (this.resuming) return this.resuming;\n if (!this.session) return this.ensureSession(reason).then(() => undefined);\n this.resuming = this.fetchSession(reason).then((info) => {\n this.resuming = null;\n if (!info || this.disposed || !this.session) return;\n this.info = info;\n this.session.resume(info);\n this.flushEarly();\n });\n return this.resuming;\n }\n\n /** The person acted after the session ended idle, expired or at its limit: the next session takes what they sent. */\n private continueIfEnded(): void {\n if (this.nextFrom(this.engine.state()) === 'continue')\n void this.resumeWith('resume');\n this.update();\n }\n\n private reconnectIfDown(): void {\n const session = this.session;\n if (\n session &&\n session.status === 'idle' &&\n this.nextFrom(this.engine.state()) === null\n )\n session.connect();\n }\n\n private statusChanged(status: SessionStatus): void {\n if (status === 'idle')\n this.offlineAfterRetries = this.lastStatus === 'reconnecting';\n else if (status !== 'reconnecting') this.offlineAfterRetries = false;\n this.lastStatus = status;\n this.update();\n }\n\n private event(event: ServerEvent): void {\n const frame = event as unknown as Record<string, unknown>;\n const str = (v: unknown) => (typeof v === 'string' ? v : null);\n const add = (\n key: string,\n kind: SystemItem['event'],\n data: SystemItem['data'],\n ) => {\n if (this.system.some((s) => s.item.key === key)) return;\n this.system = [\n ...this.system,\n {\n item: { type: 'system', key, event: kind, data },\n order: lastOrder(this.engine.state()) + 0.75,\n },\n ];\n };\n switch (frame.type) {\n case 'session.ready':\n if (frame.resumed === true && Array.isArray(frame.transcript))\n this.transcriptSeen = true;\n return;\n // `at` is required (v1-draft.15); the same takeover announced again after a reconnect has the same `at`, so it\n // draws one row. A frame without one still gets a row of its own.\n case 'takeover.started':\n add(\n `takeover:${str(frame.at) ?? `#${++this.systemSeq}`}`,\n 'takeover_started',\n { by: str(frame.by) },\n );\n return;\n case 'takeover.ended':\n add(\n `takeover-ended:${str(frame.at) ?? `#${++this.systemSeq}`}`,\n 'takeover_ended',\n {},\n );\n return;\n case 'handoff.created': {\n const ticket = frame.ticket as Record<string, unknown> | undefined;\n add(`handoff:${str(ticket?.id) ?? ''}`, 'handoff_created', {\n expected_response: str(ticket?.expected_response),\n });\n return;\n }\n case 'flow.completed':\n add(`flow:#${++this.systemSeq}`, 'flow_completed', {\n result: str(frame.result),\n code: str(frame.code),\n });\n return;\n case 'turn.failed': {\n const turn = str(frame.turn_id) ?? '';\n // A reply that streamed is kept, cut off; a turn that failed before any text gets a row of its own.\n if (this.engine.state().messages.some((m) => m.key === `a:${turn}`))\n return;\n if (frame.code === 'cancelled') return; // stopped on purpose (cancel(), a takeover): nothing failed\n add(`failed:${turn}`, 'turn_failed', {\n code: str(frame.code),\n message: str(frame.message),\n retryable: frame.retryable === true,\n });\n return;\n }\n default:\n return;\n }\n }\n\n // ------------------------------------------------------------ the view\n\n /**\n * Recomputes now (getSnapshot and getStreaming are always current) and notifies from the scheduler, at most once\n * per frame, both channels in the same flush: a streamed reply that completes becomes its message in one frame.\n */\n private update(): void {\n const state = this.engine.state();\n this.stream(state);\n const view = this.compute(state);\n if (view !== this.view) {\n this.view = view;\n this.viewDirty = true;\n this.schedulePersist();\n }\n if (this.viewDirty || this.streamDirty) this.scheduleNotify();\n }\n\n private scheduleNotify(): void {\n if (this.framePending || this.disposed) return;\n // Nobody listens yet (a store created on the server, or before its screen): no frame is asked for, so no global is\n // touched; a listener reads the current snapshot when it subscribes.\n if (this.listeners.size === 0 && this.streamListeners.size === 0) return;\n this.framePending = true;\n this.frame = this.scheduler().request(() => {\n this.frame = undefined;\n this.framePending = false;\n this.flush();\n });\n }\n\n /** Calls the listeners of what changed since the last flush. */\n private flush(): void {\n if (this.frame !== undefined) {\n this.scheduler().cancel(this.frame);\n this.frame = undefined;\n this.framePending = false;\n }\n const view = this.viewDirty;\n const stream = this.streamDirty;\n this.viewDirty = false;\n this.streamDirty = false;\n if (stream) for (const l of [...this.streamListeners]) l();\n if (view) for (const l of [...this.listeners]) l();\n }\n\n private compute(state: ConversationState | null): ConversationView {\n const s = state ?? this.engine.state();\n const prev: ConversationView | undefined = this.view;\n for (const id of [...this.sent.keys()])\n if (!this.early.has(id) && s.messages.some((m) => m.key === id))\n this.sent.delete(id);\n const items = buildTimeline(\n {\n state: s,\n history: this.history,\n sent: this.sent,\n early: new Set(this.early.keys()),\n retried: this.retried,\n busy: this.busy,\n decisionErrors: this.decisionErrors,\n transcriptSeen: this.transcriptSeen,\n system: this.system,\n },\n prev?.items ?? NO_ITEMS,\n );\n const status = this.status();\n const next = this.nextFrom(s);\n const activity =\n s.turn === null ? [] : s.tools.filter((t) => t.turn_id === s.turn);\n const name = this.info?.agent?.display_name ?? null;\n const avatarUrl = this.info?.agent?.avatar_url ?? null;\n const view: ConversationView = {\n status,\n banner: banner(status, next),\n next,\n agent: sameAgent(prev?.agent, name, avatarUrl)\n ? (prev as ConversationView).agent\n : { name, avatarUrl },\n disclosure: s.disclosure ?? this.info?.disclosure ?? null,\n takeover: s.takeover,\n items,\n activity:\n prev && sameTools(prev.activity, activity) ? prev.activity : activity,\n responding: s.turn !== null || s.streaming !== null,\n openQuestion: s.openQuestion,\n answersNeedWebSocket: status === 'sse',\n turnsLeft: s.turnsLeft,\n history: this.historyState,\n };\n if (prev && shallowEqual(prev, view)) return prev;\n return view;\n }\n\n private status(): ConversationStatus {\n if (this.disposed) return 'closed';\n const session = this.session;\n if (!session) {\n if (this.failed) return 'unavailable';\n return this.getting || this.early.size ? 'starting' : 'idle';\n }\n const status = session.status;\n if (this.failed && status === 'ended') return 'unavailable';\n if (status === 'idle')\n return this.offlineAfterRetries || this.online === false\n ? 'offline'\n : 'idle';\n if (status === 'reconnecting' && this.online === false) return 'offline';\n return status;\n }\n\n private nextFrom(state: ConversationState): ConversationView['next'] {\n if (this.session?.status !== 'ended' && state.reconnect === 'allowed')\n return null;\n if (state.reconnect === 'new_session_on_next_action') return 'continue';\n if (state.reconnect === 'user_action_only') return 'continue_here';\n return null;\n }\n\n /** The streamed text, current at once; its listeners hear of it with the next flush. */\n private stream(state: ConversationState): void {\n const s = state.streaming;\n if (!s) {\n if (this.streaming !== null) {\n this.streaming = null;\n this.streamDirty = true;\n }\n return;\n }\n if (this.streaming?.turnId === s.turnId && this.streaming.text === s.text)\n return;\n this.streaming = { key: `a:${s.turnId}`, turnId: s.turnId, text: s.text };\n this.streamDirty = true;\n }\n\n private scheduler(): FrameScheduler {\n return this.options.scheduler ?? defaultScheduler;\n }\n\n // ------------------------------------------------------------ persistence\n\n private key(): string {\n return this.options.persistenceKey ?? 'vinaverse.conversation';\n }\n\n private restore(): void {\n const store = this.options.persistence;\n if (!store) return;\n const done = () => {\n this.historyState = 'restored';\n this.update();\n };\n const apply = (raw: string | null) => {\n if (this.disposed) return;\n if (raw === null) return done();\n try {\n const saved = JSON.parse(raw) as { v?: unknown; items?: unknown };\n // Another version (an older kit's), or not a list: dropped. It still ends restored, or the skeleton stays.\n if (saved.v === PERSIST_VERSION && Array.isArray(saved.items))\n this.history = (saved.items as TimelineItem[]).map((item) =>\n item.type === 'card'\n ? ({ ...item, busy: false, restored: true } as CardItem)\n : item,\n );\n } catch {\n // A kept conversation that no longer reads is dropped, never fatal.\n }\n done();\n };\n try {\n const raw = store.getItem(this.key());\n if (typeof raw === 'string' || raw === null) apply(raw);\n else {\n // Async storage (Capacitor Preferences, IndexedDB): the UI draws a skeleton, not an empty conversation.\n this.historyState = 'restoring';\n this.view = this.compute(null);\n raw.then(apply, () => {\n if (!this.disposed) done();\n });\n }\n } catch {\n done(); // storage unavailable: nothing restored\n }\n }\n\n private schedulePersist(): void {\n const store = this.options.persistence;\n if (!store || this.disposed || this.persistTimer !== undefined) return;\n this.persistTimer = setTimeout(() => {\n this.persistTimer = undefined;\n const items = this.view.items.filter(persistable).slice(-HISTORY);\n try {\n void store.setItem(\n this.key(),\n JSON.stringify({ v: PERSIST_VERSION, items }),\n );\n } catch {\n // storage full or unavailable: the conversation goes on\n }\n }, PERSIST_DELAY);\n }\n\n // ------------------------------------------------------------ guards\n\n private live(): void {\n if (this.disposed)\n throw new VinaverseClientError(\n 'session_ended',\n 'This conversation was closed.',\n );\n }\n\n private required(): VinaverseSession {\n this.live();\n if (!this.session)\n throw new VinaverseClientError(\n 'session_ended',\n 'The conversation has no session yet: start() it first.',\n );\n return this.session;\n }\n}\n\n/** One conversation with an agent, for any UI: see `ConversationStore`. */\nexport function createConversation(\n options: ConversationOptions,\n): ConversationStore {\n return new ConversationStore(options);\n}\n\nconst defaultScheduler: FrameScheduler = {\n request(callback) {\n const raf = (\n globalThis as {\n requestAnimationFrame?: (cb: () => void) => unknown;\n }\n ).requestAnimationFrame;\n return raf ? { raf: raf(callback) } : { timer: setTimeout(callback, 16) };\n },\n cancel(handle) {\n const h = handle as {\n raf?: unknown;\n timer?: ReturnType<typeof setTimeout>;\n };\n const caf = (globalThis as { cancelAnimationFrame?: (id: unknown) => void })\n .cancelAnimationFrame;\n if (h.raf !== undefined) caf?.(h.raf);\n if (h.timer !== undefined) clearTimeout(h.timer);\n },\n};\n\nfunction banner(\n status: ConversationStatus,\n next: ConversationView['next'],\n): ConversationBanner {\n if (status === 'connecting' || status === 'starting') return 'connecting';\n if (status === 'reconnecting') return 'reconnecting';\n if (status === 'offline') return 'offline';\n if (status === 'unavailable' || status === 'unauthorized')\n return 'unavailable';\n if (next === 'continue_here') return 'continued_elsewhere';\n return null;\n}\n\nfunction sameAgent(\n agent: ConversationView['agent'] | undefined,\n name: string | null,\n avatarUrl: string | null,\n): boolean {\n return agent?.name === name && agent?.avatarUrl === avatarUrl;\n}\n\nfunction sameTools(\n a: ConversationView['activity'],\n b: ConversationView['activity'],\n): boolean {\n return (\n a.length === b.length &&\n a.every(\n (t, i) =>\n t.turn_id === b[i]?.turn_id &&\n t.label === b[i]?.label &&\n t.state === b[i]?.state,\n )\n );\n}\n\nfunction shallowEqual(a: ConversationView, b: ConversationView): boolean {\n return (\n a.status === b.status &&\n a.banner === b.banner &&\n a.next === b.next &&\n a.agent.name === b.agent.name &&\n a.agent.avatarUrl === b.agent.avatarUrl &&\n a.disclosure === b.disclosure &&\n a.takeover?.by === b.takeover?.by &&\n a.takeover?.at === b.takeover?.at &&\n (a.takeover === null) === (b.takeover === null) &&\n a.items === b.items &&\n a.activity === b.activity &&\n a.responding === b.responding &&\n a.openQuestion === b.openQuestion &&\n a.answersNeedWebSocket === b.answersNeedWebSocket &&\n a.turnsLeft === b.turnsLeft &&\n a.history === b.history\n );\n}\n"]}
1
+ {"version":3,"sources":["../../src/conversation/answers.ts","../../src/conversation/links.ts","../../src/conversation/timeline.ts","../../src/conversation/store.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["// Whether an answer to a question card can be sent: the card's own rules (`Question`, `QuestionAnswer`), checked as\n// the person answers so a UI enables Send only for an answer the server will take. The server still decides: what it\n// rejects arrives as `ui.answer.rejected` and unlocks the question. Shared by every UI kit.\nimport type { AnswerInput, Question } from '../events.js';\n\nexport type AnswerProblem =\n /** Nothing chosen or typed, and the question is required (or skipped while required). */\n | 'required'\n /** Fewer choices than `min`. */\n | 'too_few'\n /** More choices than `max`, or more than one where one is asked. */\n | 'too_many'\n /** A value that is not on the card, `none_of_the_above` with another choice, or a form the kind does not take. */\n | 'not_allowed'\n /** The text, or the \"Other\" text, is longer than the card allows (in code points). */\n | 'too_long'\n /** A number outside `min`…`max`, or off its `step`. */\n | 'out_of_range'\n /** Not a calendar date, or outside the card's bounds. */\n | 'bad_date';\n\nconst CHOICE = new Set([\n 'single_choice',\n 'multi_choice',\n 'image_choice',\n 'yes_no',\n 'list_choice',\n]);\nconst ONE_CHOICE = new Set(['single_choice', 'yes_no', 'list_choice']);\n\n/** Unicode code points, as the contract counts every text limit (an emoji outside the BMP is one). */\nexport function codePoints(text: string): number {\n let n = 0;\n for (const _ of text) n++;\n return n;\n}\n\ntype Answer = {\n values?: readonly string[];\n other_text?: string;\n text?: string;\n number?: number;\n date?: string;\n upload_ref?: string;\n skipped?: boolean;\n};\n\n/**\n * The first rule an answer breaks, or null when it can be sent. For `rate_each`, check each row's answer against\n * the question: one column from `options`, or `skipped` when not required. A kind this client does not know is the\n * server's to judge (null).\n */\nexport function answerProblem(\n question: Question,\n input: AnswerInput,\n): AnswerProblem | null {\n const answer = input as Answer;\n if (answer.skipped === true) return question.required ? 'required' : null;\n const kind = question.kind as string;\n if (CHOICE.has(kind)) return choiceProblem(question, answer);\n switch (kind) {\n case 'rate_each': {\n const values = answer.values ?? [];\n if (answer.other_text !== undefined) return 'not_allowed';\n if (values.length === 0) return 'required';\n if (values.length > 1) return 'too_many';\n return (question.options ?? []).some((o) => o.value === values[0])\n ? null\n : 'not_allowed';\n }\n case 'short_text':\n case 'long_text': {\n const text = answer.text ?? '';\n if (!text.trim()) return 'required';\n return codePoints(text) > (question.text?.max_length ?? 2000)\n ? 'too_long'\n : null;\n }\n case 'number':\n case 'scale': {\n const n = answer.number;\n if (typeof n !== 'number' || !Number.isFinite(n)) return 'required';\n const range = kind === 'number' ? question.number : question.scale;\n if (!range) return null;\n if (n < range.min || n > range.max) return 'out_of_range';\n const steps = (n - range.min) / range.step;\n return Math.abs(steps - Math.round(steps)) > 1e-9 ? 'out_of_range' : null;\n }\n case 'date':\n return dateProblem(question, answer.date);\n case 'photo':\n return answer.upload_ref ? null : 'required';\n default:\n return null;\n }\n}\n\nfunction choiceProblem(\n question: Question,\n answer: Answer,\n): AnswerProblem | null {\n const values = answer.values ?? [];\n const other = answer.other_text;\n if (other !== undefined) {\n if (!question.allows_other) return 'not_allowed';\n if (!other.trim()) return 'required';\n if (codePoints(other) > (question.other_max_length ?? 500))\n return 'too_long';\n if (\n values.length > 0 &&\n question.kind !== 'single_choice' &&\n question.kind !== 'multi_choice'\n )\n return 'not_allowed';\n }\n if (values.length === 0) return other !== undefined ? null : 'required';\n if (new Set(values).size !== values.length) return 'not_allowed';\n const none = question.none_of_the_above?.value;\n if (none !== undefined && values.includes(none))\n return values.length === 1 && other === undefined ? null : 'not_allowed';\n const known = new Set((question.options ?? []).map((o) => o.value));\n if (!values.every((v) => known.has(v))) return 'not_allowed';\n // One option for the single kinds (a single_choice may add its \"Other\" too, as the contract allows); the \"Other\"\n // counts as a choice against min and max.\n if (ONE_CHOICE.has(question.kind) && values.length > 1) return 'too_many';\n const chosen = values.length + (other !== undefined ? 1 : 0);\n if (question.min !== undefined && chosen < question.min) return 'too_few';\n if (question.max !== undefined && chosen > question.max) return 'too_many';\n return null;\n}\n\nfunction dateProblem(\n question: Question,\n date: string | undefined,\n): AnswerProblem | null {\n if (!date) return 'required';\n const m = /^(\\d{4})-(\\d{2})-(\\d{2})$/.exec(date);\n if (!m) return 'bad_date';\n const [y, mo, d] = [Number(m[1]), Number(m[2]), Number(m[3])];\n const at = new Date(Date.UTC(y, mo - 1, d));\n if (\n at.getUTCFullYear() !== y ||\n at.getUTCMonth() !== mo - 1 ||\n at.getUTCDate() !== d\n )\n return 'bad_date';\n // ISO dates compare as text.\n if (question.date?.min !== undefined && date < question.date.min)\n return 'bad_date';\n if (question.date?.max !== undefined && date > question.date.max)\n return 'bad_date';\n return null;\n}\n","// The deep-link rule an app applies to a card's `deep_link` and a proposal's `edit_deep_link` before it opens one\n// (docs/realtime-protocol.md §6, admin-v1.yaml `Connector.deep_link_prefixes`): the link starts with a prefix the\n// tenant registered, compared code point for code point, and what follows the prefix is on the allowlist. The\n// patterns are the contract's own (fixtures/api/deep-link-vectors.json), and the tests run its vectors.\n\nconst PREFIX =\n /^[a-z][a-z0-9+.-]*:(\\/\\/\\.*[A-Za-z0-9_~-][A-Za-z0-9._~-]*(:(6553[0-5]|655[0-2][0-9]|65[0-4][0-9]{2}|6[0-4][0-9]{3}|[1-5][0-9]{4}|[1-9][0-9]{0,3}))?\\/|\\.*[A-Za-z0-9_~-][A-Za-z0-9._~-]*\\/)(\\.*[A-Za-z0-9_~-][A-Za-z0-9._~-]*\\/)*$/;\nconst PREFIX_HTTPS =\n /^https?:\\/\\/[a-z0-9-]+(\\.[a-z0-9-]+)*(:(6553[0-5]|655[0-2][0-9]|65[0-4][0-9]{2}|6[0-4][0-9]{3}|[1-5][0-9]{4}|[1-9][0-9]{0,3}))?\\/\\.*[A-Za-z0-9_~-][A-Za-z0-9._~-]*\\//;\nconst REFUSED_SCHEMES =\n /^(javascript|vbscript|data|blob|file|filesystem|about|view-source|intent|android-app|content|jar|mhtml|itms-services|ftp|ws|wss):/;\n// biome-ignore lint/suspicious/noControlCharactersInRegex: the contract refuses control characters in a prefix.\nconst CONTROLS = /[\\x00-\\x1f\\x7f]/;\nconst REMAINDER =\n /^(\\.*[A-Za-z0-9_~-][A-Za-z0-9._~-]*(\\/\\.*[A-Za-z0-9_~-][A-Za-z0-9._~-]*)*\\/?)?(\\?([A-Za-z0-9._~=&-]|%(2[0-46-9A-Ea-e]|3[0-9B-Fb-f]|[46][0-9A-Fa-f]|5[0-9ABD-Fabd-f]|7[0-9A-Ea-e]))*)?$/;\n\n/** Whether a prefix may be registered: the contract's prefix pattern, no refused scheme, no control character. */\nexport function isValidLinkPrefix(prefix: string): boolean {\n if (CONTROLS.test(prefix) || REFUSED_SCHEMES.test(prefix)) return false;\n if (/^https?:/.test(prefix) && !PREFIX_HTTPS.test(prefix)) return false;\n return PREFIX.test(prefix);\n}\n\n/**\n * Whether a card's link may be opened: it starts with one of the registered prefixes (invalid ones are ignored) and\n * what follows is a path and an optional query of the allowed characters. Route by the page it names; never open a\n * query value.\n */\nexport function isAllowedLink(\n link: string,\n prefixes: readonly string[],\n): boolean {\n return prefixes.some(\n (prefix) =>\n isValidLinkPrefix(prefix) &&\n link.startsWith(prefix) &&\n REMAINDER.test(link.slice(prefix.length)),\n );\n}\n","// The timeline: the engine's messages and cards, the store's pending texts and system rows, in one list sorted by\n// arrival, each item reused from the previous list when nothing about it changed (structural sharing).\nimport type { ConversationState, HeldCard, Message } from '../engine.js';\nimport { isKnownCard } from '../events.js';\nimport type {\n CardItem,\n MessageItem,\n MessageState,\n SystemItem,\n TimelineItem,\n} from './view.js';\n\n/** A text the person sent through the store, kept until the engine holds it as a message or forgets it. */\nexport interface SentText {\n readonly text: string;\n /** Where it sorts until it becomes a message: just after what was drawn when it was sent. */\n readonly order: number;\n}\n\nexport interface TimelineInput {\n readonly state: ConversationState;\n /** Items restored from persistence, drawn first. */\n readonly history: readonly TimelineItem[];\n /** By `client_event_id`, in the order sent. */\n readonly sent: ReadonlyMap<string, SentText>;\n /** Texts not yet given to a session (no session yet): drawn as sending. */\n readonly early: ReadonlySet<string>;\n /** Ids the person sent again (`retry`): their old \"not sent\" item is gone. */\n readonly retried: ReadonlySet<string>;\n readonly busy: ReadonlySet<string>;\n /**\n * Where cards sit after a resumed session's transcript replaced the messages: by card key, an order just after the\n * message they followed, so a card the session draws again (a pending proposal) stays in its place.\n */\n readonly cardOrder?: ReadonlyMap<string, number>;\n /** Cards a transcript (text only) dropped from the engine, kept where they were. */\n readonly kept?: readonly {\n readonly item: CardItem;\n readonly order: number;\n }[];\n /** A resumed session brought its own transcript: the history kept on the device gives way to it. */\n readonly transcriptSeen?: boolean;\n /** Proposals whose tenant decision threw. */\n readonly decisionErrors?: ReadonlySet<string>;\n readonly system: readonly {\n readonly item: SystemItem;\n readonly order: number;\n }[];\n}\n\n/** The highest arrival number drawn, so something added now sorts after it. */\nexport function lastOrder(state: ConversationState): number {\n let last = -1;\n for (const m of state.messages) last = Math.max(last, m.seq);\n for (const c of state.cards) last = Math.max(last, c.seq);\n if (state.streaming) last = Math.max(last, state.streaming.seq);\n return last;\n}\n\n/** The person's text's state, or null when it is no longer pending (a message now, or settled with nothing to draw). */\nexport function pendingState(\n id: string,\n input: Pick<TimelineInput, 'state' | 'early' | 'retried'>,\n): Exclude<MessageState, 'sent' | 'delivered' | 'streaming'> | null {\n const { state } = input;\n if (input.retried.has(id)) return null;\n if (input.early.has(id)) return 'sending';\n if (state.messages.some((m) => m.key === id)) return null;\n const refused = state.refused[id];\n if (refused !== undefined) return refused === 'guardrail' ? null : 'not_sent';\n if (state.heldForNextSession.includes(id)) return 'held';\n if (\n state.resend.includes(id) ||\n state.held.includes(id) ||\n state.unacknowledged.some((f) => f.client_event_id === id)\n )\n return 'sending';\n return null; // a duplicate whose earlier turn stands, or forgotten\n}\n\nexport function buildTimeline(\n input: TimelineInput,\n previous: readonly TimelineItem[],\n): readonly TimelineItem[] {\n const before = new Map(previous.map((item) => [item.key, item]));\n const live: { item: TimelineItem; order: number }[] = [];\n const { state } = input;\n\n for (const m of state.messages)\n live.push({ item: messageItem(m), order: m.seq });\n if (state.streaming) {\n live.push({\n item: {\n type: 'message',\n key: `a:${state.streaming.turnId}`,\n role: 'agent',\n text: '',\n state: 'streaming',\n },\n order: state.streaming.seq,\n });\n }\n for (const card of state.cards) {\n if (!isKnownCard(card.card as { kind: string })) continue; // §5: skip a kind this client does not know\n live.push({\n item: {\n type: 'card',\n key: card.id,\n card,\n busy: input.busy.has(card.id),\n ...(input.decisionErrors?.has(card.id)\n ? { decisionError: true as const }\n : {}),\n },\n order: input.cardOrder?.get(card.id) ?? card.seq,\n });\n }\n for (const { item, order } of input.system) live.push({ item, order });\n const held = new Set(state.cards.map((c) => c.id));\n for (const { item, order } of input.kept ?? [])\n if (!held.has(item.key)) live.push({ item, order });\n for (const [id, sent] of input.sent) {\n const pending = pendingState(id, input);\n if (pending === null) continue;\n const rejection = state.rejections[id];\n live.push({\n item: {\n type: 'message',\n key: id,\n role: 'person',\n text: sent.text,\n state: pending,\n ...(pending === 'not_sent'\n ? {\n rejection: rejection ?? {\n code: state.refused[id] ?? '',\n message: '',\n },\n }\n : {}),\n },\n order: sent.order,\n });\n }\n live.sort((a, b) => a.order - b.order); // stable: equal orders keep the order they were added in\n\n // History gives way to the conversation: an item the live session holds again (a restored card in pending_cards)\n // takes the history item's place, so it updates without moving; the whole of it gives way once a resumed session\n // brought its own transcript.\n const liveByKey = new Map(live.map((l) => [l.item.key, l.item]));\n const transcript = input.transcriptSeen === true;\n const items: TimelineItem[] = [];\n const placed = new Set<string>();\n if (!transcript)\n for (const item of input.history) {\n const current = liveByKey.get(item.key);\n items.push(current ?? item);\n if (current) placed.add(item.key);\n }\n for (const { item } of live) if (!placed.has(item.key)) items.push(item);\n\n let same = items.length === previous.length;\n const shared = items.map((item, i) => {\n const prev = before.get(item.key);\n const kept = prev !== undefined && equal(prev, item) ? prev : item;\n if (kept !== previous[i]) same = false;\n return kept;\n });\n return same ? previous : shared;\n}\n\nfunction messageItem(m: Message): MessageItem {\n const role = m.role === 'assistant' ? 'agent' : m.role;\n return {\n type: 'message',\n key: m.key,\n role,\n text: m.text,\n state: m.received ? 'delivered' : 'sent',\n ...(m.partial ? { partial: m.partial } : {}),\n ...(m.refusal ? { refusal: true as const } : {}),\n };\n}\n\nfunction equal(a: TimelineItem, b: TimelineItem): boolean {\n if (a.type !== b.type || a.key !== b.key) return false;\n if (a.type === 'message' && b.type === 'message')\n return (\n a.role === b.role &&\n a.text === b.text &&\n a.state === b.state &&\n a.partial === b.partial &&\n a.refusal === b.refusal &&\n a.rejection?.code === b.rejection?.code &&\n a.rejection?.message === b.rejection?.message\n );\n if (a.type === 'card' && b.type === 'card')\n return (\n a.busy === b.busy &&\n a.restored === b.restored &&\n a.decisionError === b.decisionError &&\n sameCard(a.card, b.card)\n );\n return a === b; // system items are made once and kept\n}\n\nfunction sameCard(a: HeldCard, b: HeldCard): boolean {\n return (\n a.card === b.card &&\n a.seq === b.seq &&\n a.turnId === b.turnId &&\n a.outcome === b.outcome &&\n a.locked.length === b.locked.length &&\n a.locked.every((q, i) => q === b.locked[i]) &&\n a.question?.state === b.question?.state &&\n JSON.stringify(a.question?.answer) === JSON.stringify(b.question?.answer) &&\n JSON.stringify(a.question?.row_answers) ===\n JSON.stringify(b.question?.row_answers)\n );\n}\n\n/** The parts of an item worth keeping across an app restart: what was on the server, never what was pending. */\nexport function persistable(item: TimelineItem): boolean {\n if (item.type === 'message')\n return item.state === 'sent' || item.state === 'delivered';\n return item.type === 'card';\n}\n","// The conversation store: one conversation with an agent, for any UI framework. It owns the session (and the next\n// one after a resume), turns the engine's state into a view a UI draws, and runs what the protocol asks of an app\n// on the person's actions: resume on the next action, hold what was typed early, decide proposals through the\n// tenant's handler, keep streamed text to one update per frame. No framework import: React, React Native and Angular\n// bind to `subscribe` and `getSnapshot`.\nimport { ConversationEngine, type ConversationState } from '../engine.js';\nimport { VinaverseClientError } from '../errors.js';\nimport type {\n AnswerInput,\n ClientSecret,\n ProposalOutcome,\n ServerEvent,\n SessionInfo,\n} from '../events.js';\nimport {\n randomId,\n type SessionOptions,\n type SessionStatus,\n VinaverseSession,\n} from '../session.js';\nimport { isAllowedLink } from './links.js';\nimport {\n buildTimeline,\n lastOrder,\n persistable,\n type SentText,\n} from './timeline.js';\nimport type {\n CardItem,\n ConversationBanner,\n ConversationStatus,\n ConversationView,\n StreamingText,\n SystemItem,\n TimelineItem,\n} from './view.js';\n\n/** Why the store asks the tenant's backend for a session. */\nexport type SessionReason =\n /** The conversation opens (`start()`). */\n | 'open'\n /** The session ended (idle, expired, its turn limit) and the person acted again. */\n | 'resume'\n /** The conversation continued on another device, and the person chose to continue here. */\n | 'continue_here';\n\nexport interface SessionRequest {\n readonly reason: SessionReason;\n /** The conversation so far, when known: the backend names it (with its `conversation_key`) to resume it. */\n readonly conversationId: string | null;\n /** For `subject.locale` and `subject.timezone`, which the backend sets. */\n readonly locale?: string;\n readonly timeZone?: string;\n /**\n * Aborted when the answer is no longer wanted (the conversation was disposed or cleared, or a newer request took\n * its place): pass it to `fetch`, so a late answer never opens a socket after the person left.\n */\n readonly signal?: AbortSignal;\n}\n\n/** What `createSession` gave the tenant's backend, as it passes it on: the session, its agent and disclosure. */\nexport type ConversationSession = SessionInfo & {\n readonly agent?: {\n readonly display_name?: string;\n readonly avatar_url?: string;\n };\n readonly disclosure?: string;\n};\n\n/**\n * Runs a callback before the next frame; `requestAnimationFrame` where there is one. Every listener, of the view and\n * of the streaming text, is called from it, at most once per frame: a zone.js app re-enters its zone here once. A\n * test passes one that runs the callback at once.\n */\nexport interface FrameScheduler {\n request(callback: () => void): unknown;\n cancel(handle: unknown): void;\n}\n\n/** Where the drawn conversation is kept across app restarts (opt-in; prefer encrypted storage). */\nexport interface ConversationPersistence {\n getItem(key: string): string | null | Promise<string | null>;\n setItem(key: string, value: string): void | Promise<void>;\n removeItem(key: string): void | Promise<void>;\n}\n\nexport interface ConversationOptions {\n /**\n * A session from the tenant's backend, which creates it with its service key (the app never holds one). Asked once\n * per need: when the conversation opens, and on the person's action after a session ended.\n */\n readonly getSession: (\n request: SessionRequest,\n ) => Promise<ConversationSession>;\n /** A fresh client secret for a session (on 4401), from the tenant's backend. */\n readonly refreshSecret?: (\n sessionId: string,\n ) => Promise<ClientSecret | string>;\n readonly locale?: string;\n readonly timeZone?: string;\n /** The prefixes the tenant registered for card links (`checkLink`). */\n readonly deepLinkPrefixes?: readonly string[];\n /** Keep the drawn conversation across restarts (off unless given). */\n readonly persistence?: ConversationPersistence;\n /** Its key; one per signed-in person. Default `vinaverse.conversation`. */\n readonly persistenceKey?: string;\n /** Default: `requestAnimationFrame`, else a 16 ms timer, resolved when first used (never at import or creation). */\n readonly scheduler?: FrameScheduler;\n /** The transport's own options (`auth`, `webSocket`, `fetch`, delays…). */\n readonly transport?: Omit<\n SessionOptions,\n 'session' | 'refreshSecret' | 'engine' | 'createId'\n >;\n /** New `client_event_id`s. Default: random, `ce_` and 22 characters. */\n readonly createId?: () => string;\n /** Something failed that no call returned: getting a session, an input that could not be delivered. */\n readonly onError?: (error: unknown) => void;\n /**\n * Close the connection while the app is in the background, and open it again in the foreground (a backend that\n * mints a client secret per connection: with `refreshSecret`, a fresh one is asked for first). Default false: the\n * connection stays, with no pings, until the session idles out. Nothing typed or answered is lost either way.\n */\n readonly closeInBackground?: boolean;\n}\n\n/** A text is at most 2000 code points (`TurnInput`). */\nexport const MAX_TEXT = 2000;\n/** Turns whose starting text the store remembers, for `retryTurn`. */\nconst TURN_INPUTS = 50;\n/** History kept across restarts: the newest items. */\nconst HISTORY = 100;\nconst PERSIST_DELAY = 500;\nconst PERSIST_VERSION = 1;\n\nconst NO_ITEMS: readonly TimelineItem[] = [];\nconst OUTCOMES: ReadonlySet<string> = new Set([\n 'confirmed',\n 'declined',\n 'failed',\n 'expired',\n]);\n\nexport class ConversationStore {\n private readonly options: ConversationOptions;\n private readonly engine = new ConversationEngine();\n private session: VinaverseSession | null = null;\n private info: ConversationSession | null = null;\n private getting: Promise<VinaverseSession | null> | null = null;\n private failed = false;\n private disposed = false;\n private online: boolean | null = null;\n private foreground = true;\n private lastStatus: SessionStatus = 'idle';\n private offlineAfterRetries = false;\n /** The id the next send gets, so a text typed before the session keeps its key. */\n private nextId: string | null = null;\n\n private readonly sent = new Map<string, SentText>();\n private readonly early = new Map<string, string>();\n private readonly retried = new Set<string>();\n private readonly busy = new Set<string>();\n /** Proposals whose tenant decision threw: shown as recoverable, the person may decide again. */\n private readonly decisionErrors = new Set<string>();\n private system: { item: SystemItem; order: number }[] = [];\n /** The person's text that started each recent turn, by `turn_id` (`turn.started` echoes its `client_event_id`). */\n private readonly turnInputs = new Map<string, string>();\n /** Numbers system rows that carry no id of their own. */\n private systemSeq = 0;\n private history: readonly TimelineItem[] = NO_ITEMS;\n private historyState: ConversationView['history'] = 'none';\n /** A resumed session.ready carried a transcript: the server's history replaced what the device kept. */\n private transcriptSeen = false;\n /** The session of the last session.ready: a card of another one takes no tap (§6). */\n private readySession: string | null = null;\n private cardOrder = new Map<string, number>();\n private kept: { item: CardItem; order: number }[] = [];\n private locale: string | undefined;\n /** The request for a session in flight, to abort when it is no longer wanted. */\n private fetching: { abort(): void } | null = null;\n\n private view: ConversationView;\n private readonly listeners = new Set<() => void>();\n private streaming: StreamingText | null = null;\n private readonly streamListeners = new Set<() => void>();\n /** The frame that will notify, and what it will notify about. */\n private frame: unknown = undefined;\n private framePending = false;\n private viewDirty = false;\n private streamDirty = false;\n private persistTimer: ReturnType<typeof setTimeout> | undefined;\n private unsubscribe: (() => void)[] = [];\n\n constructor(options: ConversationOptions) {\n this.options = options;\n this.locale = options.locale;\n this.view = this.compute(null);\n this.restore();\n }\n\n // ------------------------------------------------------------ reading\n\n getSnapshot = (): ConversationView => this.view;\n\n subscribe = (listener: () => void): (() => void) => {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n };\n\n getStreaming = (): StreamingText | null => this.streaming;\n\n subscribeStreaming = (listener: () => void): (() => void) => {\n this.streamListeners.add(listener);\n return () => this.streamListeners.delete(listener);\n };\n\n /** Whether a card's link may be opened (the deep-link rule, against `deepLinkPrefixes`). */\n checkLink(link: string): boolean {\n return isAllowedLink(link, this.options.deepLinkPrefixes ?? []);\n }\n\n // ------------------------------------------------------------ the conversation's life\n\n /** Ask for a session and connect, early: a client secret must open its first connection within two minutes. */\n start(): void {\n this.live();\n if (this.session) {\n if (this.session.status === 'idle') this.session.connect();\n return;\n }\n void this.ensureSession('open');\n }\n\n /** Close for good. */\n dispose(): void {\n if (this.disposed) return;\n this.disposed = true;\n this.fetching?.abort();\n this.fetching = null;\n this.session?.close();\n for (const off of this.unsubscribe) off();\n this.unsubscribe = [];\n clearTimeout(this.persistTimer);\n this.update();\n this.flush(); // the closed view reaches the listeners now: no frame may come after the screen is gone\n }\n\n /** Close for good and forget the conversation kept on the device (sign-out). Never throws for the storage. */\n clear(): void {\n this.dispose();\n this.history = NO_ITEMS;\n try {\n const removed = this.options.persistence?.removeItem(this.key());\n if (removed) removed.catch(() => undefined);\n } catch {\n // storage blocked: sign-out goes on\n }\n this.update();\n this.flush();\n }\n\n /**\n * The person switched the app's language: the UI's words change at once (the kit's own locale); the next session\n * asks for this locale (`subject.locale`). The open session keeps its language: the agent answers in the new one\n * from the next session, and the store never starts a session for it.\n */\n setLocale(locale: string | undefined): void {\n this.locale = locale;\n }\n\n /** The app came to the foreground or went to the background (AppState, `visibilitychange`). */\n setForeground(foreground: boolean): void {\n this.foreground = foreground;\n if (this.options.closeInBackground && !this.disposed) {\n if (!foreground) {\n this.suspend();\n return;\n }\n if (this.suspended) {\n void this.wake();\n return;\n }\n }\n this.session?.setForeground(foreground);\n if (foreground) this.reconnectIfDown();\n }\n\n /** In the background (`closeInBackground`): the connection is closed; the engine keeps what was sent, to resend. */\n private suspended = false;\n private suspend(): void {\n const session = this.session;\n if (!session || this.suspended || session.status === 'ended') return;\n this.suspended = true;\n for (const off of this.unsubscribe) off();\n this.unsubscribe = [];\n session.close();\n this.update();\n }\n\n /** Back in the foreground: a new connection to the same session, with a fresh secret when the backend gives one. */\n private async wake(): Promise<void> {\n const info = this.info;\n this.suspended = false;\n if (!info) return;\n let next: ConversationSession = info;\n if (this.options.refreshSecret) {\n try {\n next = {\n ...info,\n client_secret: await this.options.refreshSecret(info.id),\n };\n } catch (error) {\n this.options.onError?.(error); // the secret held may still open it; a refused one asks again (4401)\n }\n }\n if (this.disposed || this.suspended) return;\n this.open(next);\n }\n\n /** The network as the app sees it; null when unknown. Back online reconnects a connection that gave up. */\n setOnline(online: boolean | null): void {\n this.online = online;\n if (online) this.reconnectIfDown();\n this.update();\n }\n\n // ------------------------------------------------------------ the person's actions\n\n /** Send a typed message; returns its `client_event_id`. Typed before a session exists, it is sent once one does. */\n send(text: string): string {\n this.live();\n if (!text.trim()) throw new RangeError('A message needs some text.');\n if ([...text].length > MAX_TEXT)\n throw new RangeError(`A message is at most ${MAX_TEXT} characters.`);\n const id = (this.options.createId ?? randomId)();\n this.sent.set(id, { text, order: lastOrder(this.engine.state()) + 0.5 });\n if (!this.session) {\n this.early.set(id, text);\n void this.ensureSession('open');\n this.update();\n return id;\n }\n if (this.suspended) {\n // Typed while the connection is closed for the background: held, and sent once it is open again.\n this.early.set(id, text);\n void this.wake();\n this.update();\n return id;\n }\n if (this.nextFrom(this.engine.state()) === 'continue_here') {\n // The session refuses input now; typing here is the person continuing here, so it goes to the next session.\n this.early.set(id, text);\n void this.resumeWith('continue_here');\n this.update();\n return id;\n }\n this.nextId = id;\n this.session.sendText(text);\n this.nextId = null;\n this.continueIfEnded();\n return id;\n }\n\n /** Answer a question card (a `rate_each` row by its `question_id`); returns the `client_event_id`. */\n answer(cardId: string, questionId: string, answer: AnswerInput): string {\n const session = this.required();\n const id = session.answer(cardId, questionId, answer);\n this.continueIfEnded();\n return id;\n }\n\n /** A card action (`ui.action`) other than a proposal's outcome. */\n cardAction(cardId: string, action: string): string {\n return this.required().action(cardId, action);\n }\n\n /**\n * Decide a proposal: `decide` is the tenant's own call (its backend, the person's token), which confirms or\n * declines it and says the outcome; the store then reports it. One decision per card; the card is busy meanwhile.\n * Resolves to the outcome reported, or null when the card was busy or already decided.\n *\n * Only an outcome `decide` resolves with is reported (§6: the first is final). When `decide` throws, or resolves\n * with anything but `confirmed`, `declined`, `failed` or `expired`, nothing is reported: the backend may have\n * applied the change, so the outcome stays unknown; the card shows `decisionError` and the person may decide\n * again. When the conversation is disposed meanwhile (sign-out), the outcome is not reported either: the tenant's\n * backend holds it, and the session takes it as unknown.\n */\n async decideProposal(\n cardId: string,\n decide: () => Promise<ProposalOutcome>,\n ): Promise<ProposalOutcome | null> {\n this.live();\n const card = this.engine.state().cards.find((c) => c.id === cardId);\n if (card?.kind !== 'proposal') return null;\n if (this.busy.has(cardId) || (card.outcome ?? null) !== null) return null;\n this.busy.add(cardId);\n this.decisionErrors.delete(cardId);\n this.update();\n try {\n const outcome: unknown = await decide();\n if (typeof outcome !== 'string' || !OUTCOMES.has(outcome))\n throw new TypeError(\n `decide() resolved with ${JSON.stringify(outcome)}, not confirmed, declined, failed or expired`,\n );\n if (this.disposed) return outcome as ProposalOutcome;\n if (this.view.next === 'continue') await this.resumeWith('resume');\n this.required().reportOutcome(cardId, outcome as ProposalOutcome);\n return outcome as ProposalOutcome;\n } catch (error) {\n this.decisionErrors.add(cardId);\n throw error;\n } finally {\n this.busy.delete(cardId);\n this.update();\n }\n }\n\n /** Send a \"not sent\" message again, as a new message (the person's action). Returns the new id. */\n retry(key: string): string | null {\n const sent = this.sent.get(key);\n if (!sent || this.engine.state().refused[key] === undefined) return null;\n this.retried.add(key);\n this.sent.delete(key);\n return this.send(sent.text);\n }\n\n /**\n * Send again the person's text whose turn failed before any reply (a `turn_failed` row with `data.retry`), as a new\n * message (the person's action). Once per row: its `retry` turns false. Returns the new id, or null when the row\n * allows no retry.\n */\n retryTurn(key: string): string | null {\n const at = this.system.findIndex(\n (s) => s.item.key === key && s.item.event === 'turn_failed',\n );\n const entry = this.system[at];\n if (entry?.item.data.retry !== true) return null;\n const text = this.turnText(String(entry.item.data.turn ?? ''));\n if (text === undefined) return null;\n this.system = this.system.map((s, i) =>\n i === at\n ? { ...s, item: { ...s.item, data: { ...s.item.data, retry: false } } }\n : s,\n );\n return this.send(text);\n }\n\n /** After the conversation continued on another device: continue it here (the person's choice). */\n continueHere(): Promise<void> {\n return this.resumeWith('continue_here');\n }\n\n /** Stop the turn in progress. */\n cancel(): void {\n const turn = this.engine.state().turn;\n if (this.session && turn) this.session.cancel(turn);\n }\n\n // ------------------------------------------------------------ sessions\n\n private async ensureSession(\n reason: SessionReason,\n ): Promise<VinaverseSession | null> {\n if (this.session) return this.session;\n if (this.getting) return this.getting;\n this.getting = this.fetchSession(reason).then((info) => {\n this.getting = null;\n if (!info || this.disposed) return null;\n this.open(info);\n return this.session;\n });\n this.update();\n return this.getting;\n }\n\n private async fetchSession(\n reason: SessionReason,\n ): Promise<ConversationSession | null> {\n this.failed = false;\n this.fetching?.abort(); // a newer request takes the place of an older one\n const Controller = (\n globalThis as { AbortController?: new () => AbortController }\n ).AbortController;\n const controller = Controller ? new Controller() : null;\n const mine = { abort: () => controller?.abort() };\n this.fetching = mine;\n let aborted = false;\n const signal = controller?.signal;\n signal?.addEventListener('abort', () => {\n aborted = true;\n });\n try {\n const info = await this.options.getSession({\n reason,\n conversationId: this.engine.state().conversationId,\n ...(this.locale !== undefined ? { locale: this.locale } : {}),\n ...(this.options.timeZone !== undefined\n ? { timeZone: this.options.timeZone }\n : {}),\n ...(signal ? { signal } : {}),\n });\n return aborted || this.fetching !== mine ? null : info;\n } catch (error) {\n if (aborted || this.fetching !== mine) return null; // no longer wanted: not a failure\n this.failed = true;\n this.getting = null;\n this.options.onError?.(error);\n this.update();\n return null;\n } finally {\n if (this.fetching === mine) this.fetching = null;\n }\n }\n\n private open(info: ConversationSession): void {\n this.info = info;\n const session = new VinaverseSession({\n ...this.options.transport,\n session: info,\n engine: this.engine,\n ...(this.options.refreshSecret\n ? { refreshSecret: this.options.refreshSecret }\n : {}),\n createId: () => this.nextId ?? (this.options.createId ?? randomId)(),\n });\n this.session = session;\n this.unsubscribe.push(\n session.on('state', () => this.update()),\n session.on('status', (status) => this.statusChanged(status)),\n session.on('event', (event) => this.event(event)),\n session.on('error', (error) => this.options.onError?.(error)),\n );\n session.setForeground(this.foreground);\n session.connect();\n this.flushEarly();\n }\n\n /** What was typed before there was a session to take it. */\n private flushEarly(): void {\n const session = this.session;\n if (!session) return;\n for (const [id, text] of this.early) {\n this.nextId = id;\n session.sendText(text);\n }\n this.nextId = null;\n this.early.clear();\n this.update();\n }\n\n /** A new session for the conversation, then `resume()`: once per person action, never in a loop. */\n private resuming: Promise<void> | null = null;\n private resumeWith(reason: SessionReason): Promise<void> {\n this.live();\n if (this.resuming) return this.resuming;\n if (!this.session) return this.ensureSession(reason).then(() => undefined);\n this.resuming = this.fetchSession(reason).then((info) => {\n this.resuming = null;\n if (!info || this.disposed || !this.session) return;\n this.info = info;\n this.session.resume(info);\n this.flushEarly();\n });\n return this.resuming;\n }\n\n /** The person acted after the session ended idle, expired or at its limit: the next session takes what they sent. */\n private continueIfEnded(): void {\n if (this.nextFrom(this.engine.state()) === 'continue')\n void this.resumeWith('resume');\n this.update();\n }\n\n private reconnectIfDown(): void {\n const session = this.session;\n if (\n session &&\n session.status === 'idle' &&\n this.nextFrom(this.engine.state()) === null\n )\n session.connect();\n }\n\n private statusChanged(status: SessionStatus): void {\n if (status === 'idle')\n this.offlineAfterRetries = this.lastStatus === 'reconnecting';\n else if (status !== 'reconnecting') this.offlineAfterRetries = false;\n this.lastStatus = status;\n this.update();\n }\n\n private event(event: ServerEvent): void {\n const frame = event as unknown as Record<string, unknown>;\n const str = (v: unknown) => (typeof v === 'string' ? v : null);\n const add = (\n key: string,\n kind: SystemItem['event'],\n data: SystemItem['data'],\n ) => {\n if (this.system.some((s) => s.item.key === key)) return;\n this.system = [\n ...this.system,\n {\n item: { type: 'system', key, event: kind, data },\n order: lastOrder(this.engine.state()) + 0.75,\n },\n ];\n };\n switch (frame.type) {\n case 'session.ready': {\n const session = (frame.session as { id?: unknown } | undefined)?.id;\n const moved =\n typeof session === 'string' && session !== this.readySession;\n if (typeof session === 'string') this.readySession = session;\n if (frame.resumed === true && Array.isArray(frame.transcript)) {\n this.transcriptSeen = true;\n this.anchorCards(moved);\n }\n return;\n }\n // `at` is required (v1-draft.15); the same takeover announced again after a reconnect has the same `at`, so it\n // draws one row. A frame without one still gets a row of its own.\n case 'takeover.started':\n add(\n `takeover:${str(frame.at) ?? `#${++this.systemSeq}`}`,\n 'takeover_started',\n { by: str(frame.by) },\n );\n return;\n case 'takeover.ended':\n add(\n `takeover-ended:${str(frame.at) ?? `#${++this.systemSeq}`}`,\n 'takeover_ended',\n {},\n );\n return;\n case 'handoff.created': {\n const ticket = frame.ticket as Record<string, unknown> | undefined;\n add(`handoff:${str(ticket?.id) ?? ''}`, 'handoff_created', {\n expected_response: str(ticket?.expected_response),\n });\n return;\n }\n case 'flow.completed':\n add(`flow:#${++this.systemSeq}`, 'flow_completed', {\n result: str(frame.result),\n code: str(frame.code),\n });\n return;\n case 'turn.started': {\n const turn = str(frame.turn_id);\n const input = str(frame.client_event_id);\n if (turn === null || input === null) return;\n this.turnInputs.set(turn, input);\n if (this.turnInputs.size > TURN_INPUTS) {\n const oldest = this.turnInputs.keys().next().value;\n if (oldest !== undefined) this.turnInputs.delete(oldest);\n }\n return;\n }\n case 'turn.failed': {\n const turn = str(frame.turn_id) ?? '';\n // A reply that streamed is kept, cut off; a turn that failed before any text gets a row of its own.\n if (this.engine.state().messages.some((m) => m.key === `a:${turn}`))\n return;\n if (frame.code === 'cancelled') return; // stopped on purpose (cancel(), a takeover): nothing failed\n add(`failed:${turn}`, 'turn_failed', {\n code: str(frame.code),\n message: str(frame.message),\n retryable: frame.retryable === true,\n retry: frame.retryable === true && this.turnText(turn) !== undefined,\n turn,\n });\n return;\n }\n default:\n return;\n }\n }\n\n /** The person's text that started a turn, while its message is on screen. */\n private turnText(turn: string): string | undefined {\n const input = this.turnInputs.get(turn);\n if (input === undefined) return undefined;\n const message = this.engine\n .state()\n .messages.find((m) => m.key === input && m.role === 'person');\n return message?.text || undefined;\n }\n\n /**\n * A resumed session's transcript replaced the messages, and a chat transcript carries text only: the engine drops\n * the cards it drew, and draws the pending ones again at the end. Each card on screen is anchored just after the\n * message it followed (by key; the transcript keeps the live keys), so a pending proposal stays where it was, and a\n * card the transcript dropped stays drawn there; taking no tap when it belongs to an earlier session.\n */\n private anchorCards(sessionChanged: boolean): void {\n const state = this.engine.state();\n const seqOf = new Map(state.messages.map((m) => [m.key, m.seq]));\n const first = Math.min(...state.messages.map((m) => m.seq), 0);\n const held = new Set(state.cards.map((c) => c.id));\n const order = new Map<string, number>();\n const kept: { item: CardItem; order: number }[] = [];\n let anchor = first - 1;\n let step = 0;\n for (const item of this.view.items) {\n if (item.type === 'message' && seqOf.has(item.key)) {\n anchor = seqOf.get(item.key) as number;\n step = 0;\n } else if (item.type === 'card') {\n const at = anchor + 0.5 + ++step / 1000;\n order.set(item.key, at);\n if (!held.has(item.key))\n kept.push({\n item: sessionChanged\n ? { ...item, busy: false, restored: true }\n : item,\n order: at,\n });\n }\n }\n this.cardOrder = order;\n this.kept = kept;\n }\n\n // ------------------------------------------------------------ the view\n\n /**\n * Recomputes now (getSnapshot and getStreaming are always current) and notifies from the scheduler, at most once\n * per frame, both channels in the same flush: a streamed reply that completes becomes its message in one frame.\n */\n private update(): void {\n const state = this.engine.state();\n this.stream(state);\n const view = this.compute(state);\n if (view !== this.view) {\n this.view = view;\n this.viewDirty = true;\n this.schedulePersist();\n }\n if (this.viewDirty || this.streamDirty) this.scheduleNotify();\n }\n\n private scheduleNotify(): void {\n if (this.framePending || this.disposed) return;\n // Nobody listens yet (a store created on the server, or before its screen): no frame is asked for, so no global is\n // touched; a listener reads the current snapshot when it subscribes.\n if (this.listeners.size === 0 && this.streamListeners.size === 0) return;\n this.framePending = true;\n this.frame = this.scheduler().request(() => {\n this.frame = undefined;\n this.framePending = false;\n this.flush();\n });\n }\n\n /** Calls the listeners of what changed since the last flush. */\n private flush(): void {\n if (this.frame !== undefined) {\n this.scheduler().cancel(this.frame);\n this.frame = undefined;\n this.framePending = false;\n }\n const view = this.viewDirty;\n const stream = this.streamDirty;\n this.viewDirty = false;\n this.streamDirty = false;\n if (stream) for (const l of [...this.streamListeners]) l();\n if (view) for (const l of [...this.listeners]) l();\n }\n\n private compute(state: ConversationState | null): ConversationView {\n const s = state ?? this.engine.state();\n const prev: ConversationView | undefined = this.view;\n for (const id of [...this.sent.keys()])\n if (!this.early.has(id) && s.messages.some((m) => m.key === id))\n this.sent.delete(id);\n const items = buildTimeline(\n {\n state: s,\n history: this.history,\n sent: this.sent,\n early: new Set(this.early.keys()),\n retried: this.retried,\n busy: this.busy,\n decisionErrors: this.decisionErrors,\n transcriptSeen: this.transcriptSeen,\n cardOrder: this.cardOrder,\n kept: this.kept,\n system: this.system,\n },\n prev?.items ?? NO_ITEMS,\n );\n const status = this.status();\n const next = this.nextFrom(s);\n const activity =\n s.turn === null ? [] : s.tools.filter((t) => t.turn_id === s.turn);\n const name = this.info?.agent?.display_name ?? null;\n const avatarUrl = this.info?.agent?.avatar_url ?? null;\n const view: ConversationView = {\n status,\n conversationId: s.conversationId,\n banner: banner(status, next),\n next,\n agent: sameAgent(prev?.agent, name, avatarUrl)\n ? (prev as ConversationView).agent\n : { name, avatarUrl },\n disclosure: s.disclosure ?? this.info?.disclosure ?? null,\n takeover: s.takeover,\n items,\n activity:\n prev && sameTools(prev.activity, activity) ? prev.activity : activity,\n responding: s.turn !== null || s.streaming !== null,\n openQuestion: s.openQuestion,\n answersNeedWebSocket: status === 'sse',\n turnsLeft: s.turnsLeft,\n history: this.historyState,\n };\n if (prev && shallowEqual(prev, view)) return prev;\n return view;\n }\n\n private status(): ConversationStatus {\n if (this.disposed) return 'closed';\n if (this.suspended) return 'idle'; // in the background on purpose: nothing to show\n const session = this.session;\n if (!session) {\n if (this.failed) return 'unavailable';\n return this.getting || this.early.size ? 'starting' : 'idle';\n }\n const status = session.status;\n if (this.failed && status === 'ended') return 'unavailable';\n if (status === 'idle')\n return this.offlineAfterRetries || this.online === false\n ? 'offline'\n : 'idle';\n if (status === 'reconnecting' && this.online === false) return 'offline';\n return status;\n }\n\n private nextFrom(state: ConversationState): ConversationView['next'] {\n if (this.session?.status !== 'ended' && state.reconnect === 'allowed')\n return null;\n if (state.reconnect === 'new_session_on_next_action') return 'continue';\n if (state.reconnect === 'user_action_only') return 'continue_here';\n return null;\n }\n\n /** The streamed text, current at once; its listeners hear of it with the next flush. */\n private stream(state: ConversationState): void {\n const s = state.streaming;\n if (!s) {\n if (this.streaming !== null) {\n this.streaming = null;\n this.streamDirty = true;\n }\n return;\n }\n if (this.streaming?.turnId === s.turnId && this.streaming.text === s.text)\n return;\n this.streaming = { key: `a:${s.turnId}`, turnId: s.turnId, text: s.text };\n this.streamDirty = true;\n }\n\n private scheduler(): FrameScheduler {\n return this.options.scheduler ?? defaultScheduler;\n }\n\n // ------------------------------------------------------------ persistence\n\n private key(): string {\n return this.options.persistenceKey ?? 'vinaverse.conversation';\n }\n\n private restore(): void {\n const store = this.options.persistence;\n if (!store) return;\n const done = () => {\n this.historyState = 'restored';\n this.update();\n };\n const apply = (raw: string | null) => {\n if (this.disposed) return;\n if (raw === null) return done();\n try {\n const saved = JSON.parse(raw) as { v?: unknown; items?: unknown };\n // Another version (an older kit's), or not a list: dropped. It still ends restored, or the skeleton stays.\n if (saved.v === PERSIST_VERSION && Array.isArray(saved.items))\n this.history = (saved.items as TimelineItem[]).map((item) =>\n item.type === 'card'\n ? ({ ...item, busy: false, restored: true } as CardItem)\n : item,\n );\n } catch {\n // A kept conversation that no longer reads is dropped, never fatal.\n }\n done();\n };\n try {\n const raw = store.getItem(this.key());\n if (typeof raw === 'string' || raw === null) apply(raw);\n else {\n // Async storage (Capacitor Preferences, IndexedDB): the UI draws a skeleton, not an empty conversation.\n this.historyState = 'restoring';\n this.view = this.compute(null);\n raw.then(apply, () => {\n if (!this.disposed) done();\n });\n }\n } catch {\n done(); // storage unavailable: nothing restored\n }\n }\n\n private schedulePersist(): void {\n const store = this.options.persistence;\n if (!store || this.disposed || this.persistTimer !== undefined) return;\n this.persistTimer = setTimeout(() => {\n this.persistTimer = undefined;\n const items = this.view.items.filter(persistable).slice(-HISTORY);\n try {\n void store.setItem(\n this.key(),\n JSON.stringify({ v: PERSIST_VERSION, items }),\n );\n } catch {\n // storage full or unavailable: the conversation goes on\n }\n }, PERSIST_DELAY);\n }\n\n // ------------------------------------------------------------ guards\n\n private live(): void {\n if (this.disposed)\n throw new VinaverseClientError(\n 'session_ended',\n 'This conversation was closed.',\n );\n }\n\n private required(): VinaverseSession {\n this.live();\n if (!this.session)\n throw new VinaverseClientError(\n 'session_ended',\n 'The conversation has no session yet: start() it first.',\n );\n return this.session;\n }\n}\n\n/** One conversation with an agent, for any UI: see `ConversationStore`. */\nexport function createConversation(\n options: ConversationOptions,\n): ConversationStore {\n return new ConversationStore(options);\n}\n\nconst defaultScheduler: FrameScheduler = {\n request(callback) {\n const raf = (\n globalThis as {\n requestAnimationFrame?: (cb: () => void) => unknown;\n }\n ).requestAnimationFrame;\n return raf ? { raf: raf(callback) } : { timer: setTimeout(callback, 16) };\n },\n cancel(handle) {\n const h = handle as {\n raf?: unknown;\n timer?: ReturnType<typeof setTimeout>;\n };\n const caf = (globalThis as { cancelAnimationFrame?: (id: unknown) => void })\n .cancelAnimationFrame;\n if (h.raf !== undefined) caf?.(h.raf);\n if (h.timer !== undefined) clearTimeout(h.timer);\n },\n};\n\nfunction banner(\n status: ConversationStatus,\n next: ConversationView['next'],\n): ConversationBanner {\n if (status === 'connecting' || status === 'starting') return 'connecting';\n if (status === 'reconnecting') return 'reconnecting';\n if (status === 'offline') return 'offline';\n if (status === 'unavailable' || status === 'unauthorized')\n return 'unavailable';\n if (next === 'continue_here') return 'continued_elsewhere';\n return null;\n}\n\nfunction sameAgent(\n agent: ConversationView['agent'] | undefined,\n name: string | null,\n avatarUrl: string | null,\n): boolean {\n return agent?.name === name && agent?.avatarUrl === avatarUrl;\n}\n\nfunction sameTools(\n a: ConversationView['activity'],\n b: ConversationView['activity'],\n): boolean {\n return (\n a.length === b.length &&\n a.every(\n (t, i) =>\n t.turn_id === b[i]?.turn_id &&\n t.label === b[i]?.label &&\n t.state === b[i]?.state,\n )\n );\n}\n\nfunction shallowEqual(a: ConversationView, b: ConversationView): boolean {\n return (\n a.status === b.status &&\n a.banner === b.banner &&\n a.next === b.next &&\n a.agent.name === b.agent.name &&\n a.agent.avatarUrl === b.agent.avatarUrl &&\n a.disclosure === b.disclosure &&\n a.takeover?.by === b.takeover?.by &&\n a.takeover?.at === b.takeover?.at &&\n (a.takeover === null) === (b.takeover === null) &&\n a.items === b.items &&\n a.activity === b.activity &&\n a.responding === b.responding &&\n a.openQuestion === b.openQuestion &&\n a.answersNeedWebSocket === b.answersNeedWebSocket &&\n a.turnsLeft === b.turnsLeft &&\n a.history === b.history\n );\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vinaverse/client",
3
- "version": "0.1.0-alpha.1",
3
+ "version": "0.1.0-alpha.3",
4
4
  "description": "Vinaverse for apps: the realtime session client (WebSocket with SSE fallback, resume, typed events and cards). No UI.",
5
5
  "license": "Apache-2.0",
6
6
  "author": "Vinaverse, Inc.",
@@ -61,11 +61,6 @@
61
61
  "access": "public",
62
62
  "provenance": true
63
63
  },
64
- "scripts": {
65
- "build": "tsup",
66
- "typecheck": "tsc --noEmit -p tsconfig.json",
67
- "package:check": "publint --strict && attw --pack . && size-limit"
68
- },
69
64
  "size-limit": [
70
65
  {
71
66
  "name": "@vinaverse/client (ESM, everything; why 6.7 kB: docs/architecture/client.md, Size budget)",
@@ -77,7 +72,12 @@
77
72
  "name": "@vinaverse/client/conversation (ESM, everything, the session included; docs/architecture/conversation.md, Size budget)",
78
73
  "path": "dist/conversation/index.js",
79
74
  "import": "*",
80
- "limit": "11.5 kB"
75
+ "limit": "12 kB"
81
76
  }
82
- ]
83
- }
77
+ ],
78
+ "scripts": {
79
+ "build": "tsup",
80
+ "typecheck": "tsc --noEmit -p tsconfig.json",
81
+ "package:check": "publint --strict && attw --pack . && size-limit"
82
+ }
83
+ }