@vinaverse/client 0.1.0-alpha.12 → 0.1.0-alpha.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agent/index.cjs +146 -15
- package/dist/agent/index.cjs.map +1 -1
- package/dist/agent/index.d.cts +3 -3
- package/dist/agent/index.d.ts +3 -3
- package/dist/agent/index.js +3 -3
- package/dist/backend/index.cjs +3 -0
- package/dist/backend/index.cjs.map +1 -1
- package/dist/backend/index.d.cts +3 -3
- package/dist/backend/index.d.ts +3 -3
- package/dist/backend/index.js +6 -3
- package/dist/backend/index.js.map +1 -1
- package/dist/{chunk-46D3FSLU.js → chunk-5HKZB2CJ.js} +14 -6
- package/dist/chunk-5HKZB2CJ.js.map +1 -0
- package/dist/{chunk-GWLLUOFY.js → chunk-LAB2FPXF.js} +31 -8
- package/dist/chunk-LAB2FPXF.js.map +1 -0
- package/dist/{chunk-5THD6XC7.js → chunk-WOMAGTI5.js} +108 -11
- package/dist/chunk-WOMAGTI5.js.map +1 -0
- package/dist/conversation/index.cjs +40 -9
- package/dist/conversation/index.cjs.map +1 -1
- package/dist/conversation/index.d.cts +4 -4
- package/dist/conversation/index.d.ts +4 -4
- package/dist/conversation/index.js +3 -3
- package/dist/history/index.cjs +7 -1
- package/dist/history/index.cjs.map +1 -1
- package/dist/history/index.d.cts +10 -4
- package/dist/history/index.d.ts +10 -4
- package/dist/history/index.js +10 -5
- package/dist/history/index.js.map +1 -1
- package/dist/index.cjs +29 -6
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/{runtime-CZyVCueC.d.ts → runtime-44JlV32O.d.ts} +91 -13
- package/dist/{runtime-BR2lS_Vg.d.cts → runtime-DWiB-XHX.d.cts} +91 -13
- package/dist/{session-D0ijOQX3.d.cts → session-lPGrKdhf.d.cts} +5 -0
- package/dist/{session-D0ijOQX3.d.ts → session-lPGrKdhf.d.ts} +5 -0
- package/dist/{store-CGRSxVcL.d.ts → store-Cjw9YmXA.d.ts} +6 -1
- package/dist/{store-CxoHwd64.d.cts → store-D-an5vch.d.cts} +6 -1
- package/dist/testing/index.cjs.map +1 -1
- package/dist/testing/index.d.cts +3 -3
- package/dist/testing/index.d.ts +3 -3
- package/dist/testing/index.js +3 -3
- package/package.json +2 -2
- package/dist/chunk-46D3FSLU.js.map +0 -1
- package/dist/chunk-5THD6XC7.js.map +0 -1
- package/dist/chunk-GWLLUOFY.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/agent/runtime.ts"],"names":["b","kept","current","status","list"],"mappings":"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","file":"chunk-WOMAGTI5.js","sourcesContent":["// The agent runtime: everything an app needs around a conversation store, so the app keeps only its own API (the\n// `AgentBackend`), its router and its brand. One conversation per person, mode, business and thread, never mixed; kept\n// while a view shows it (and, by policy, across screens while its session lives); the tenant's backend waited out by a\n// retry policy, never answered with a new conversation; typed reasons when there is no session; a clock adapter for\n// the session's end; the screen context told at open and live where the backend serves it; status, name, ratings,\n// sign-out and events. No React: the kits bind to it.\n\nimport {\n type ConversationActivity,\n type ConversationOptions,\n type ConversationPersistence,\n type ConversationSession,\n type ConversationStore,\n createConversation,\n type SessionRequest,\n} from '../conversation/store.js';\nimport { VinaverseClientError } from '../errors.js';\nimport type { ClientSecret, Schemas } from '../events.js';\nimport { randomId } from '../session.js';\n\n/** Whose conversation: a person (null for a guest), the app's side, the business acted for, and the thread. */\nexport interface AgentKey {\n readonly subject: string | null;\n readonly mode: string;\n readonly scope?: string | null;\n /** Default `chat`; a flow of its own (a business setup, say) is another thread. */\n readonly thread?: string;\n}\n\ntype ScreenContext = Schemas['ScreenContext'];\n\n/**\n * Where the person asks from, in the contract's vocabulary (`ScreenContext`: the screen, the entity, the filters): told\n * to the agent as data (`Session.screen_context`), never as their words. The tenant's backend vouches for it.\n */\nexport interface AgentPlace {\n readonly screen: ScreenContext['screen'];\n readonly entity?: { readonly type: string; readonly id: string } | null;\n readonly filters?: ScreenContext['filters'];\n}\n\n/**\n * The object a conversation is about, as the contract's anchor names it (vinaverse-v1 v1-draft.37 `createSession.anchor`,\n * contracts#86): its type and id. The tenant's backend builds the anchor itself, from its own reads.\n */\nexport interface AgentAnchorRef {\n readonly type: AgentAnchorType;\n readonly id: string;\n}\n\n/** The contract's closed list of objects a conversation can be about (`AnchorType`). */\nexport type AgentAnchorType =\n | 'booking'\n | 'rental'\n | 'professional'\n | 'workspace'\n | 'service'\n | 'class'\n | 'policy';\n\nconst ANCHOR_TYPES = new Set<string>([\n 'booking',\n 'rental',\n 'professional',\n 'workspace',\n 'service',\n 'class',\n 'policy',\n]);\n\n/** The anchor reference for an object, or null when its type is not the contract's or its id not a tool id. */\nexport function anchorRef(type: string, id: string): AgentAnchorRef | null {\n return ANCHOR_TYPES.has(type) &&\n /^[A-Za-z0-9][A-Za-z0-9_.:-]{0,127}$/.test(id)\n ? { type: type as AgentAnchorType, id }\n : null;\n}\n\n/** Joined to the character before it, as code-point ranges: combining marks, the joiner, variation selectors, skin tones. */\nconst JOINS = [\n 0x300, 0x36f, 0x1ab0, 0x1aff, 0x1dc0, 0x1dff, 0x20d0, 0x20ff, 0xfe20, 0xfe2f,\n 0x200d, 0x200d, 0xfe0e, 0xfe0f, 0x1f3fb, 0x1f3ff,\n];\nconst joins = (point: string | undefined) => {\n const c = point?.codePointAt(0) ?? -1;\n for (let i = 0; i < JOINS.length; i += 2)\n if (c >= (JOINS[i] as number) && c <= (JOINS[i + 1] as number)) return true;\n return false;\n};\n\n/**\n * An entry label as the contract takes it (`SessionEntry.label`): trimmed, at most 60 code points, cut at a whole\n * character so no accent or emoji is split; undefined when nothing is left. The same rule as the .NET SDK's.\n */\nexport function entryLabel(label: string): string | undefined {\n let out = '';\n let size = 0;\n const points = Array.from(label.trim());\n for (let i = 0; i < points.length; ) {\n let end = i + 1; // a character: a code point and what joins it\n while (\n end < points.length &&\n (joins(points[end]) || points[end - 1] === '\\u200d')\n )\n end++;\n if (size + end - i > 60) break;\n out += points.slice(i, end).join('');\n size += end - i;\n i = end;\n }\n return out || undefined;\n}\n\n/**\n * How the person came in, as the contract will carry it (`entry_point`, `entry_label`): `ask_about` from an \"ask about\n * this\" row, with the app's own word for analytics (`label`, at most 64 characters).\n */\nexport interface AgentEntry {\n readonly point: 'ask_about' | (string & Record<never, never>);\n readonly label?: string;\n}\n\n/**\n * The object as the screen the person just left showed it: drawn, marked provisional, until the agent's verified card\n * arrives. Never sent.\n */\nexport interface AgentPlacePreview {\n readonly title: string;\n readonly image_url?: string;\n readonly kind?: string;\n}\n\n/** A place at one of the app's objects (a booking, a professional, a space), where \"ask about this\" opens a conversation. */\nexport interface AskAboutPlace extends AgentPlace {\n readonly entity: { readonly type: string; readonly id: string };\n readonly preview?: AgentPlacePreview;\n}\n\n/**\n * The key of the conversation about one object: the app's key (its person, mode and business as they are), on a thread\n * of the object's own (`ask:<type>:<id>`), so each object gets its own conversation and the app's main one is left alone.\n */\nexport function askAboutKey(\n key: AgentKey,\n place: { readonly entity: { readonly type: string; readonly id: string } },\n): AgentKey {\n return { ...key, thread: `ask:${place.entity.type}:${place.entity.id}` };\n}\n\n/** The entry as the contract takes it (`point` an open code, `label` cut), or null when its point is not one. */\nfunction entryOf(entry: AgentEntry): AgentEntry | null {\n if (!/^[a-z][a-z0-9_]{0,31}$/.test(entry.point)) return null;\n const label = entry.label === undefined ? undefined : entryLabel(entry.label);\n return label ? { point: entry.point, label } : { point: entry.point };\n}\n\n/** How the person came in: the kit's parts say `launcher` and `ask`; an app adds `deep_link` or its own words. */\nexport type AgentEntryPoint =\n | 'launcher'\n | 'ask'\n | 'deep_link'\n | (string & Record<never, never>);\n\n/** What the runtime asks the tenant's backend for: a session, for this key, told this place. */\nexport interface AgentSessionRequest extends SessionRequest {\n readonly key: AgentKey;\n /**\n * This session creation's id: the same through its retries, so the backend uses it as the gateway's idempotency key\n * and never opens twice; a new one for every creation (a first open, a resume, continue-here, a rollover). A creation\n * that could not reach the backend keeps it, and its whole request, for the next try, the person's \"try again\" too,\n * for 24 hours. An `unknown_open` answer is final: not retried under it.\n */\n readonly openId: string;\n /** The runtime's `agent`, for a backend that serves more than one. */\n readonly agent: string | null;\n readonly place: AgentPlace | null;\n /**\n * The place's revision (`ScreenContext.revision`): higher than any the session was told before, and lower than any\n * `updateContext` after it, so the API keeps the newest place across a session's rollover.\n */\n readonly placeRevision: number;\n /** How the person came in (`launcher`, `ask`, `deep_link`, the app's own words), passed through. */\n readonly entryPoint: AgentEntryPoint | null;\n /** The object the conversation is about; only with `sendAnchor`. */\n readonly anchor?: AgentAnchorRef;\n /** How the person came in, in the contract's words; only with `sendAnchor`. */\n readonly entry?: AgentEntry;\n}\n\n/** Why there is no session, typed, so an app never needs sentinel errors of its own. */\nexport type AgentFailureReason =\n /** The conversation is over (its session's own end, or a refusal with no finer reason). */\n | 'ended'\n /** The conversation asked for does not exist for this person (deleted, or never theirs). */\n | 'not_found'\n /** Past the time the conversation is kept. */\n | 'expired'\n /** The conversation belongs to another business, mode or agent than the key's. */\n | 'mismatch'\n /** The conversation's flow is completed; a new one starts when the person asks. */\n | 'completed'\n /** The person may not act for this business or conversation. */\n | 'forbidden'\n /** The server holds a newer screen context than the one told (an update, never a session). */\n | 'conflict'\n /** The backend could not tell whether the session opened: unavailable, never retried, its `openId` kept for support. */\n | 'unknown_open'\n /** The person's sign-in was refused by the tenant's API. */\n | 'auth'\n /** The agent is switched off for this tenant, mode or person. */\n | 'off'\n | 'rate_limited'\n /** No network, a timeout: retried, then said. */\n | 'network'\n /** The tenant's API or Vinaverse failed (5xx): retried, then said. */\n | 'server'\n /** The backend answered with a session the runtime will not use (not wss://, a field missing). */\n | 'invalid_session'\n | 'unknown';\n\n/**\n * A refusal from the backend, typed: `ended` (the conversation is over; a new one starts only when the person asks) or\n * `unavailable` with its reason. An error with `retryable: true` (and its `reason`, `network` by default) is waited out\n * by the retry policy, then said as `unreachable`.\n */\nexport class AgentRefusal extends Error {\n readonly reason: AgentFailureReason;\n readonly code: string | null;\n constructor(\n readonly kind: 'ended' | 'unavailable',\n options: {\n readonly reason?: AgentFailureReason;\n readonly code?: string;\n readonly message?: string;\n } = {},\n ) {\n super(\n options.message ??\n (kind === 'ended' ? 'The conversation is over.' : 'No agent now.'),\n );\n this.name = 'AgentRefusal';\n this.reason = options.reason ?? (kind === 'ended' ? 'ended' : 'unknown');\n this.code = options.code ?? null;\n }\n}\n\nexport interface AgentStatus {\n readonly available: boolean;\n /** The floating launcher may show. */\n readonly launcher: boolean;\n readonly displayName: string | null;\n readonly avatarUrl: string | null;\n readonly features: {\n readonly history: boolean;\n readonly memory: boolean;\n readonly businessAgent: boolean;\n readonly businessSetup: boolean;\n };\n}\n\n/** The status as the backend reads it; what it leaves out is off. */\nexport interface AgentStatusRead {\n readonly available: boolean;\n readonly launcher?: boolean;\n readonly displayName?: string | null;\n readonly avatarUrl?: string | null;\n readonly features?: Partial<AgentStatus['features']>;\n}\n\n/** The status and where its read stands, so a screen tells \"reading\" from \"could not read\". */\nexport interface AgentStatusState {\n readonly status: AgentStatus | null;\n readonly reading: boolean;\n readonly failed: boolean;\n}\n\n/** The tenant's backend: the one piece of integration an app writes. */\nexport interface AgentBackend {\n /** A session from the tenant's API (it creates it at Vinaverse with its service key), or an `AgentRefusal`. */\n openSession(request: AgentSessionRequest): Promise<ConversationSession>;\n /**\n * A fresh client secret for the same session (before its end): a `ClientSecret` `{ value, expires_at }`, or its\n * value. A refusal (`session_closed`: the session is over) goes on with the conversation in a new session.\n */\n refreshSecret?(sessionId: string): Promise<ClientSecret | string>;\n /**\n * The person's place changed while the chat is open: the tenant's backend tells Vinaverse\n * (`PUT /v1/sessions/{id}/context`). A place cleared (`tell({ place: null })`) comes as `{ screen: 'other' }`.\n * `revision` only grows for a conversation, across its sessions. A conflict (`decodeBackendFailure`'s\n * `context_conflict`, or a refusal with reason `conflict`, with the server's `currentRevision`) is sent once more\n * above it, then said as `moved`. Absent, or refused otherwise, the kit offers a question about the new place.\n */\n updateContext?(\n sessionId: string,\n place: AgentPlace,\n revision: number,\n ): Promise<void>;\n /** Whether the agent is offered, and what it can do. Absent: available, nothing extra. */\n status?(signal?: AbortSignal): Promise<AgentStatusRead>;\n /** A thumbs on a whole reply; best effort, never an error for the person. */\n sendFeedback?(feedback: {\n readonly sessionId: string;\n readonly turnId: string;\n readonly rating: AgentRating;\n }): Promise<void>;\n /** Sign-out: end the person's open sessions at the tenant's API. */\n endSessions?(): Promise<void>;\n /** History's delete: the tenant's API deletes the person's conversation (authenticated, theirs only). */\n deleteConversation?(conversationId: string): Promise<void>;\n /**\n * History: the person's past conversations with the agent, newest activity first, a page at a time (`cursor` from\n * the page before). The person comes from the backend's authentication, never from here.\n */\n listConversations?(\n query: {\n readonly mode: string;\n readonly scope: string | null;\n readonly agent: string | null;\n readonly limit?: number;\n readonly cursor: string | null;\n },\n signal?: AbortSignal,\n ): Promise<Schemas['ConversationPage']>;\n /** History: a past conversation's messages and cards, the newest page first, oldest first within a page. */\n readConversation?(\n conversationId: string,\n page: { readonly limit?: number; readonly cursor: string | null },\n signal?: AbortSignal,\n ): Promise<Schemas['TimelinePage']>;\n}\n\nexport type AgentRating = 'up' | 'down';\nexport type AgentFailure = 'ended' | 'unreachable' | 'unavailable';\n\nexport type AgentEventType =\n | 'session_opened'\n | 'session_resumed'\n | 'session_retried'\n | 'session_failed'\n | 'conversation_ended'\n | 'context_updated'\n | 'rated'\n | 'chip_tapped'\n | 'card_action'\n | 'target_opened'\n | 'link_opened'\n | 'launcher_shown'\n | 'launcher_opened'\n | 'launcher_greeted'\n | 'greeting_closed'\n | 'message_sent'\n | 'reply_completed'\n | 'card_shown';\n\n/** For the app's analytics: what happened, for which conversation, with nothing the person said. */\nexport interface AgentEvent {\n readonly type: AgentEventType;\n /** The conversation, as a hash of its key (`hashKey`): stable, and never the person's id. */\n readonly key?: string;\n readonly sessionId?: string;\n readonly failure?: AgentFailure;\n readonly reason?: AgentFailureReason;\n readonly attempt?: number;\n readonly turnId?: string;\n readonly rating?: AgentRating;\n readonly cardId?: string;\n readonly kind?: string;\n /** Where the person opened from (`launcher`, `ask`, `deep_link`, the app's own words). */\n readonly from?: AgentEntryPoint;\n}\n\n/** What a UI draws around the store: why there is no session, whether the person moved, the thumbs given. */\nexport interface AgentConversationState {\n readonly failure: AgentFailure | null;\n readonly reason: AgentFailureReason | null;\n /** The API's own code for the failure (`conversation_expired`, …), when it gave one. */\n readonly code: string | null;\n /** The session was told another place than the one the person now asks from, and it could not be told live. */\n readonly moved: boolean;\n readonly ratings: ReadonlyMap<string, AgentRating>;\n readonly sessionId: string | null;\n /**\n * The conversation the key holds: the one it continues before a session opens, then its session's. Null for a new\n * one not yet opened. History's delete compares against it (`deleteConversation` does).\n */\n readonly conversationId: string | null;\n /** The open the backend could not settle (`unknown_open`), for support; null otherwise. */\n readonly openId: string | null;\n}\n\n/** Where and how a view opens a conversation. `undefined` keeps what was told; `null` clears it. */\nexport interface AgentOpen {\n readonly place?: AgentPlace | null;\n readonly entryPoint?: AgentEntryPoint | null;\n /** The object the conversation is about; sent only with `sendAnchor`. */\n readonly anchor?: AgentAnchorRef | null;\n /** How the person came in, in the contract's words; sent only with `sendAnchor`. */\n readonly entry?: AgentEntry | null;\n}\n\nexport interface AgentConversation {\n /** The key as a string, for the app's own maps and the events. */\n readonly key: string;\n readonly store: ConversationStore;\n /**\n * A view attaches: kept, with its connection, while any view is attached. The first time, it starts. Returns the\n * detach: with no view attached it is suspended (no pings; closed with `closeInBackground`) while its session lives\n * (`keepAlive: 'session'`), and let go when it has none, is past its end, or `keepAlive` is `'view'`. Separate from the\n * app's background, which the platform adapter tells the store.\n */\n show(open?: AgentOpen): () => void;\n /**\n * The place and the way in changed while a view is attached: told live where the backend can, else on the next\n * session. `undefined` keeps what was told; `null` clears it.\n */\n tell(open: AgentOpen): void;\n getState(): AgentConversationState;\n subscribe(listener: () => void): () => void;\n /** Asks for a session again, after the backend could not be reached. */\n retry(): void;\n /**\n * Whether a reply can be rated: one this runtime saw given live. A reply restored from the device or a resumed\n * transcript cannot be, until the API rates a turn by its conversation; the kits draw no thumbs for it.\n */\n canRate(turnId: string): boolean;\n /** A thumbs on a whole reply, against the session it was given in; a change of mind only is sent again. */\n rate(turnId: string, rating: AgentRating): void;\n /**\n * Sends the person's `text` once in this conversation's life (a chip tapped twice, a retried tap). It is shown as\n * theirs: only words they typed or tapped, never the app's in their name.\n */\n sendOnce(text: string): void;\n}\n\n/** When the runtime tries the backend again: before each try, a delay; `isRetryable` decides which errors are waited out. */\nexport interface AgentRetryPolicy {\n readonly delays: readonly number[];\n readonly isRetryable?: (error: unknown) => boolean;\n}\n\n/** The time the runtime judges a session's end by: the server's, when the app has it (a clock synced from responses). */\nexport interface AgentClock {\n now(): number;\n}\n\nexport interface AgentRuntimeOptions {\n readonly backend: AgentBackend;\n /**\n * The agent this runtime talks to (its id at Vinaverse). It is part of every key, so two agents sharing the device's\n * storage (`conversation.persistence`) never share a conversation. Default: none (one agent per storage namespace).\n */\n readonly agent?: string;\n /** The store's own options (locale, time zone, deep-link prefixes, transport, persistence, closeInBackground…). */\n readonly conversation?: Omit<\n ConversationOptions,\n 'getSession' | 'refreshSecret' | 'clock'\n >;\n /** Default: 500, 1500, 3500 ms, for errors with `retryable: true`; applied to `openSession` and `refreshSecret`. */\n readonly retry?: AgentRetryPolicy;\n /** Default: the device's clock. Give the server's: a phone set wrong otherwise reuses a dead session or drops a live one. */\n readonly clock?: AgentClock;\n /** `session` (default): kept while its session lives with no view attached; `view`: let go when the last view goes. */\n readonly keepAlive?: 'session' | 'view';\n /**\n * How long a conversation no view shows stays connected before it is suspended, so a quick reopen (back, then in\n * again) is instant: no reconnect, no new secret. Default 60 s; 0 suspends at once. The app going to the background\n * ends the grace at once (`background()`).\n */\n readonly graceMs?: number;\n /** How long a status read stays fresh. Default 5 minutes. */\n readonly statusStaleMs?: number;\n /**\n * DANGEROUS: for mocks and local development only. Lets a leg's session address be plaintext (`ws://`, `http://`),\n * which would carry the person's messages and the session's secret unencrypted. Off by default, whatever transport\n * the app supplies; outside `__DEV__` the runtime warns once.\n */\n readonly insecureAddresses?: AgentInsecureAddresses;\n readonly onEvent?: (event: AgentEvent) => void;\n /**\n * Where the launcher remembers it greeted a person (the app's preferences store). Given here, the launcher reads and\n * writes it through the runtime (`greetings`), a sign-out fences it, and `erase()` removes it.\n */\n readonly greetingStorage?: ConversationPersistence;\n /**\n * Keys an earlier version of the app or the kit wrote that no index lists, for a storage with neither `keys` nor\n * `removePrefix`: removed by every sign-out from `conversation.persistence`, and by `erase()` from `greetingStorage`\n * too. The migration that makes their removal certain on such a storage.\n */\n readonly legacyKeys?: readonly string[];\n /** Where the runtime's warnings go (the app's logger, crash reporter); default `console.warn`. */\n readonly onWarning?: (message: string, warning: AgentWarning) => void;\n /**\n * Sends `anchor` and `entry` in the session request, for the tenant's backend to pass on once the gateway reads them\n * (vinaverse-v1 v1-draft.37, contracts#86). Default false: kept with the conversation, never sent.\n */\n readonly sendAnchor?: boolean;\n}\n\n/**\n * What a warning is about, for an app's logger to count without reading the message: `insecure_addresses` (a leg let\n * off the wss:// and https:// check outside development), `callback_threw` (the app's `onEvent` or `onActivity` threw;\n * `callback` names it), `events_dropped` (the oldest analytics events, while the salt is read).\n */\nexport interface AgentWarning {\n readonly code:\n | 'insecure_addresses'\n | 'callback_threw'\n | 'events_dropped'\n | 'context_refused';\n readonly callback?: 'onEvent' | 'onActivity';\n}\n\n/** The legs whose session address may be plaintext: `realtime` (the WebSocket), `turns` (HTTP). */\nexport interface AgentInsecureAddresses {\n readonly realtime?: boolean;\n readonly turns?: boolean;\n}\n\nexport interface AgentRuntime {\n /** The app's backend, as given: history (`@vinaverse/client/history`) reads its pages through it. */\n readonly backend: AgentBackend;\n /** The key's conversation: the same while it lives; a new one after `startNew`, `dispose` or its end. */\n conversation(key: AgentKey): AgentConversation;\n /**\n * The key's conversation as it stands, ending nothing and telling no one: for a render (`useSyncExternalStore`).\n * One past its session's end is ended when it is next shown, and subscribers then read the key's next one.\n */\n peek(key: AgentKey): AgentConversation;\n /** A new conversation for the key from the person's next opening; the old one is let go and forgotten. */\n startNew(key: AgentKey): void;\n /**\n * Closes the key's conversation now; the next opening continues it in a new session. What the device kept of it and\n * the conversation it continues stay: `forget` removes them.\n */\n dispose(key: AgentKey): void;\n /**\n * Closes the key's conversation and forgets it on this device: the conversation it continued and the transcript kept\n * by `persistence`. History's \"delete\" calls it after the tenant's backend deleted the conversation.\n */\n forget(key: AgentKey): void;\n /** Ends every conversation no view shows that is past its session's end. The kits call it when the app comes back. */\n sweep(): void;\n /**\n * The app went to the background: every conversation no view shows is suspended now, its grace cut short (its socket\n * closes with `closeInBackground`). The kits' parts call it; an app with none mounted calls it from its own listener.\n */\n background(): void;\n /**\n * History's delete: the backend deletes the conversation, then the device forgets it, only where the key still\n * continues that conversation (an older history entry never forgets the key's newer one).\n */\n deleteConversation(key: AgentKey, conversationId: string): Promise<void>;\n /**\n * The person's erasure on this device: a sign-out, plus the launcher's greeting records (`greetingStorage`) and the\n * analytics salt, every key this version and alpha.5 or alpha.6 wrote. Keys no index lists (an earlier version's, a\n * write lost with its process) are found only when the storage has `keys` or `removePrefix`.\n */\n erase(): Promise<void>;\n /** The launcher's greeting storage, under the sign-out fence; null without `greetingStorage`. */\n readonly greetings: ConversationPersistence | null;\n /**\n * The key goes on with this conversation (history's \"Continue\"): pinned for the key and opened through the backend's\n * resume. One that is gone (404, 410: the backend's `AgentRefusal('ended')`) is said as `ended`, never replaced by a\n * new one silently.\n */\n continue(key: AgentKey, conversationId: string): AgentConversation;\n /**\n * Every conversation closed and forgotten, and everything this runtime kept on the device (every transcript it ever\n * wrote under `conversation.persistenceKey`, even of conversations already closed), the status and the name; then\n * the backend is told to end the sessions at the same time. A late answer from before (a session, a status, a write)\n * changes nothing. Kept on purpose: the launcher's greeting records and the analytics salt (`erase` takes them).\n */\n signOut(): Promise<void>;\n /** The agent's status, read from the backend at most every `statusStaleMs`. */\n status(): Promise<AgentStatus>;\n getStatus(): AgentStatus | null;\n /**\n * The status with where its read stands: `reading` while one is out, `failed` when the last one could not be read\n * (the status held before, if any, stays). One object until it changes, for `useSyncExternalStore`.\n */\n getStatusState(): AgentStatusState;\n /**\n * Which person's turn it is on this device: a number that changes at every sign-out and erasure. Work begun under an\n * older one (a history page, a transcript) is dropped when it lands.\n */\n epoch(): number;\n /**\n * The agent's name: from the newest session, else from the status. With `mode`, only that mode's sessions count: a\n * business agent's name never names the customer side's agent.\n */\n getName(mode?: string): string | null;\n /** Told when the status or name changes, and when a key's conversation is let go (its next one is another). */\n subscribe(listener: () => void): () => void;\n /** An event from a kit or the app, passed to `onEvent`. */\n emit(event: AgentEvent): void;\n}\n\n/** The launcher's greeting records' prefix: outside the transcripts' (`vinaverse.agent.`), so a sign-out keeps them. */\nconst GREETED = 'vinaverse.greeted';\n/** Where alpha.5 and alpha.6 kept them. */\nconst GREETED_BEFORE = 'vinaverse.agent.greeted';\n\n/**\n * Where the launcher remembers that it greeted a person in a mode, the key its storage sees. Encoded so a guest\n * (`null`) is never a person whose id is \"guest\".\n */\nexport function greetedKey(subject: string | null, mode: string): string {\n return `${GREETED}.${JSON.stringify([subject, mode])}`;\n}\n\n/** The tuple inside a key written by this version (`<prefix>.<agentKey>`), or null for any other. */\nfunction tupleOf(key: string, prefix: string): unknown[] | null {\n if (!key.startsWith(`${prefix}.[`)) return null;\n try {\n const t: unknown = JSON.parse(key.slice(prefix.length + 1));\n return Array.isArray(t) ? t : null;\n } catch {\n return null;\n }\n}\n\n/** alpha.5 and alpha.6 kept a transcript and a greeting under these names: found from the keys this version knows. */\nfunction legacyTranscripts(keys: ReadonlySet<string>, prefix: string) {\n const out: string[] = [];\n for (const key of keys) {\n const t = tupleOf(key, prefix);\n if (t)\n out.push(\n `${prefix}.${t[1] ?? 'guest'}|${t[2]}|${t[3] ?? '-'}|${t[4] ?? 'chat'}`,\n );\n }\n return out;\n}\nfunction legacyGreetings(pairs: Iterable<readonly [unknown, unknown]>) {\n const out: string[] = [];\n for (const [subject, mode] of pairs)\n out.push(`${GREETED_BEFORE}.${subject ?? 'guest'}:${mode}`);\n return out;\n}\n\nconst NOT_KEPT = new Set(['starting', 'unavailable', 'unauthorized', 'closed']);\n/** A place cleared, as `updateContext` sends it: a screen the vocabulary keeps for none in particular. */\nconst CLEARED: AgentPlace = { screen: 'other' };\n\n/**\n * A conversation's key as analytics sees it: SHA-256 of the install's salt and the key, 128 bits in hex. Stable per\n * install (the runtime keeps the salt in the app's storage until `erase()`), never the person's id, and not\n * recomputable from a guessed id without the salt.\n */\nexport function hashKey(key: string, salt: string): string {\n return `k${sha256(`${salt}\\u0000${key}`).slice(0, 32)}`;\n}\n\nlet K: number[] | undefined;\nlet H: number[] | undefined;\n\n/** SHA-256 of a string's UTF-8 bytes, in hex (FIPS 180-4; no platform crypto: Hermes has none, and this is sync). */\nexport function sha256(text: string): string {\n if (!K || !H) {\n // The first 32 bits of the fractional parts of the primes' cube roots (K) and the first eight's square roots (H).\n K = [];\n H = [];\n for (let n = 2; K.length < 64; n++) {\n let prime = true;\n for (let d = 2; d * d <= n; d++) if (n % d === 0) prime = false;\n if (!prime) continue;\n if (H.length < 8) H.push(((Math.sqrt(n) % 1) * 2 ** 32) | 0);\n K.push(((Math.cbrt(n) % 1) * 2 ** 32) | 0);\n }\n }\n const bytes: number[] = [];\n const s = encodeURIComponent(text);\n for (let i = 0; i < s.length; i++)\n if (s[i] === '%') {\n bytes.push(Number.parseInt(s.slice(i + 1, i + 3), 16));\n i += 2;\n } else bytes.push(s.charCodeAt(i));\n const bits = bytes.length * 8;\n bytes.push(0x80);\n while (bytes.length % 64 !== 56) bytes.push(0);\n for (const word of [Math.floor(bits / 2 ** 32), bits >>> 0])\n bytes.push(\n word >>> 24,\n (word >>> 16) & 255,\n (word >>> 8) & 255,\n word & 255,\n );\n const h = [...H];\n const w = new Array<number>(64);\n const ror = (x: number, n: number) => (x >>> n) | (x << (32 - n));\n for (let at = 0; at < bytes.length; at += 64) {\n for (let i = 0; i < 64; i++) {\n if (i < 16) {\n const b = at + i * 4;\n w[i] =\n ((bytes[b] as number) << 24) |\n ((bytes[b + 1] as number) << 16) |\n ((bytes[b + 2] as number) << 8) |\n (bytes[b + 3] as number);\n } else {\n const x = w[i - 15] as number;\n const y = w[i - 2] as number;\n w[i] =\n ((w[i - 16] as number) +\n (ror(x, 7) ^ ror(x, 18) ^ (x >>> 3)) +\n (w[i - 7] as number) +\n (ror(y, 17) ^ ror(y, 19) ^ (y >>> 10))) |\n 0;\n }\n }\n let [a, b, c, d, e, f, g, k] = h as [\n number,\n number,\n number,\n number,\n number,\n number,\n number,\n number,\n ];\n for (let i = 0; i < 64; i++) {\n const t1 =\n (k +\n (ror(e, 6) ^ ror(e, 11) ^ ror(e, 25)) +\n ((e & f) ^ (~e & g)) +\n (K[i] as number) +\n (w[i] as number)) |\n 0;\n const t2 =\n ((ror(a, 2) ^ ror(a, 13) ^ ror(a, 22)) +\n ((a & b) ^ (a & c) ^ (b & c))) |\n 0;\n k = g;\n g = f;\n f = e;\n e = (d + t1) | 0;\n d = c;\n c = b;\n b = a;\n a = (t1 + t2) | 0;\n }\n [a, b, c, d, e, f, g, k].forEach((v, i) => {\n h[i] = ((h[i] as number) + v) | 0;\n });\n }\n return h.map((v) => (v >>> 0).toString(16).padStart(8, '0')).join('');\n}\nconst NO_FEATURES: AgentStatus['features'] = {\n history: false,\n memory: false,\n businessAgent: false,\n businessSetup: false,\n};\nconst SYSTEM_CLOCK: AgentClock = { now: () => Date.now() };\n\n/**\n * The key as a string: one conversation per agent, person, mode, business and thread. Encoded as a JSON array, so no\n * value can pass for another (a guest is `null`, never a subject named \"guest\"; a `|` in an id is just a character).\n */\nexport function agentKey(key: AgentKey, agent: string | null = null): string {\n return JSON.stringify([\n agent,\n key.subject,\n key.mode,\n key.scope ?? null,\n key.thread ?? 'chat',\n ]);\n}\n\nconst samePlace = (a: AgentPlace | null, b: AgentPlace | null) =>\n a?.screen === b?.screen &&\n (a?.entity?.type ?? null) === (b?.entity?.type ?? null) &&\n (a?.entity?.id ?? null) === (b?.entity?.id ?? null) &&\n JSON.stringify(a?.filters ?? null) === JSON.stringify(b?.filters ?? null);\n\n/** A session the runtime will use: an id, a secret, and `wss://` and `https://` addresses unless a leg is let off. */\nfunction usable(\n session: ConversationSession,\n insecure: AgentInsecureAddresses,\n): boolean {\n return (\n typeof session.id === 'string' &&\n session.id !== '' &&\n (insecure.realtime === true ||\n /^wss:\\/\\//i.test(session.realtime_url ?? '')) &&\n (insecure.turns === true || /^https:\\/\\//i.test(session.turns_url ?? '')) &&\n Boolean(session.client_secret)\n );\n}\n\n/** Whether this is a development build (React Native's `__DEV__`): what only a developer should read is said there. */\nconst devBuild = () => (globalThis as { __DEV__?: boolean }).__DEV__ === true;\n\n/** Once, as the runtime is made (once per app), outside development: plaintext would carry messages and the secret. */\nfunction warnInsecure(\n insecure: AgentInsecureAddresses,\n warn: (message: string, warning: AgentWarning) => void,\n): void {\n if (!(insecure.realtime || insecure.turns)) return;\n if ((globalThis as { __DEV__?: boolean }).__DEV__ === true) return;\n warn(\n '@vinaverse/client/agent: insecureAddresses lets sessions use plaintext ws:// or http:// addresses. For mocks and local development only.',\n { code: 'insecure_addresses' },\n );\n}\n\ninterface Entry {\n readonly key: string;\n readonly store: ConversationStore;\n readonly listeners: Set<() => void>;\n state: AgentConversationState;\n place: AgentPlace | null;\n told: AgentPlace | null;\n revision: number;\n /** A place being told (one `updateContext` in flight at a time), and whether a newer one waits behind it. */\n telling: boolean;\n queued: boolean;\n entryPoint: string | null;\n anchor: AgentAnchorRef | null;\n via: AgentEntry | null;\n expiresAt: number | null;\n shown: number;\n started: boolean;\n suspended: boolean;\n sentOnce: Set<string>;\n /** Ends it at its session's end while no view shows it (when the app's timers run; `sweep` otherwise). */\n timer: ReturnType<typeof setTimeout> | undefined;\n /** The grace after its last view left, before it is suspended (`graceMs`). */\n grace: ReturnType<typeof setTimeout> | undefined;\n /** Each reply's own session, so a thumbs rates the turn against the session it was given in. */\n readonly turns: Map<string, string>;\n /**\n * The session creation that could not reach the backend: asked again unchanged (its `openId`, its body) by the next\n * try, the person's too, for a day, so a creation whose answer was lost never opens a second session.\n */\n failedOpen:\n | { readonly request: AgentSessionRequest; readonly at: number }\n | undefined;\n}\n\n/** How long a failed session creation is asked again under its own `openId` (the gateway keeps one 24 hours). */\nconst OPEN_KEPT_MS = 24 * 3_600_000;\n/** Events kept while the analytics salt is read; the oldest go past it. */\nconst MAX_WAITING = 100;\n\nexport function createAgentRuntime(options: AgentRuntimeOptions): AgentRuntime {\n const { backend } = options;\n const policy: Required<AgentRetryPolicy> = {\n delays: options.retry?.delays ?? [500, 1500, 3500],\n isRetryable: options.retry?.isRetryable ?? retryable,\n };\n const clock = options.clock ?? SYSTEM_CLOCK;\n const keepAlive = options.keepAlive ?? 'session';\n const graceMs = options.graceMs ?? 60_000;\n const staleMs = options.statusStaleMs ?? 5 * 60_000;\n const insecure = options.insecureAddresses ?? {};\n warnInsecure(insecure, options.onWarning ?? ((m: string) => console.warn(m)));\n const live = new Map<string, Entry>();\n const current = new Map<string, string>();\n const listeners = new Set<() => void>();\n let status: { value: AgentStatus; at: number } | null = null;\n let reading: Promise<AgentStatus> | null = null;\n const NO_STATUS: AgentStatusState = {\n status: null,\n reading: false,\n failed: false,\n };\n let statusState = NO_STATUS;\n const setStatusState = (next: Omit<AgentStatusState, 'status'>) => {\n statusState = { status: status?.value ?? null, ...next };\n changed();\n };\n let sessionName: string | null = null;\n // Each mode's newest session's name, so one mode's agent is never named after another's.\n const names = new Map<string, string>();\n // Bumped by every sign-out: anything begun before it (a status read, a write to the device) lands nowhere.\n let generation = 0;\n const keyOf = (key: AgentKey) => agentKey(key, options.agent ?? null);\n const prefix = options.conversation?.persistenceKey ?? 'vinaverse.agent';\n const storage = guardedStorage(\n options.conversation?.persistence,\n prefix,\n () => generation,\n );\n const greetings = guardedStorage(\n options.greetingStorage,\n GREETED,\n () => generation,\n );\n\n const warn: (message: string, warning: AgentWarning) => void =\n options.onWarning ?? ((m: string) => console.warn(m));\n /** The app's callback runs isolated: what it throws is said through `onWarning`, never in the way of a frame. */\n const isolated = (what: 'onEvent' | 'onActivity', call: () => void) => {\n try {\n call();\n } catch (error) {\n warn(\n `@vinaverse/client/agent: the app's ${what} threw (${error instanceof Error ? error.message : String(error)}); the conversation went on.`,\n { code: 'callback_threw', callback: what },\n );\n }\n };\n\n // Analytics never sees a key, which names the person: a hash of it under the install's salt, kept in the app's\n // storage (a new one per process without storage). Events wait for the salt's first read.\n const saltStore =\n options.conversation?.persistence ?? options.greetingStorage;\n const saltKey = `${prefix}:salt`;\n let salt: string | null = null;\n const waiting: AgentEvent[] = [];\n const loadSalt = () => {\n if (!options.onEvent) return; // no analytics, nothing kept for it\n const settle = (kept: string | null | undefined) => {\n if (salt !== null) return;\n if (kept) salt = kept;\n else {\n salt = randomId().slice(3);\n void Promise.resolve(saltStore?.setItem(saltKey, salt)).catch(\n () => undefined,\n );\n }\n for (const event of waiting.splice(0)) deliver(event);\n };\n try {\n const got = saltStore?.getItem(saltKey);\n if (typeof got === 'string' || got == null) settle(got);\n else got.then(settle, () => settle(null));\n } catch {\n settle(null);\n }\n };\n const deliver = (event: AgentEvent) =>\n isolated('onEvent', () =>\n options.onEvent?.(\n event.key ? { ...event, key: hashKey(event.key, salt ?? '') } : event,\n ),\n );\n let dropping = false;\n const emit = (event: AgentEvent) => {\n if (!options.onEvent) return;\n if (salt !== null) return deliver(event);\n // A storage whose read never settles costs the oldest events, never memory.\n if (waiting.push(event) > MAX_WAITING) {\n waiting.shift();\n if (!dropping)\n warn(\n '@vinaverse/client/agent: the analytics salt is still being read from storage; the oldest events are dropped.',\n { code: 'events_dropped' },\n );\n dropping = true;\n }\n };\n loadSalt();\n const changed = () => {\n for (const l of [...listeners]) l();\n };\n const update = (entry: Entry, next: Partial<AgentConversationState>) => {\n entry.state = { ...entry.state, ...next };\n for (const l of [...entry.listeners]) l();\n };\n\n const end = (k: string) => {\n const entry = live.get(k);\n if (!entry) return;\n live.delete(k);\n clearTimeout(entry.timer);\n clearTimeout(entry.grace);\n entry.store.dispose();\n emit({ type: 'conversation_ended', key: k });\n changed(); // the key's next conversation is another one\n };\n\n const patiently = <T>(\n run: () => Promise<T>,\n signal: AbortSignal | undefined,\n key: string,\n ) =>\n retrying(run, policy, signal, (attempt) =>\n emit({ type: 'session_retried', key, attempt }),\n );\n\n async function open(\n entry: Entry,\n key: AgentKey,\n request: SessionRequest,\n ): Promise<ConversationSession> {\n // Let go meanwhile (a start new, a sign-out): nothing to open.\n if (live.get(entry.key) !== entry) throw new AgentRefusal('unavailable');\n // A creation that could not reach the backend is asked again as it was; any other is a new one, with its own id\n // (a first open, a resume, continue-here, a rollover), the same through its retries. The runtime keeps which\n // conversation the key continues: the app's adapter is a plain call.\n const held =\n entry.failedOpen && clock.now() - entry.failedOpen.at < OPEN_KEPT_MS\n ? entry.failedOpen\n : undefined;\n entry.failedOpen = undefined;\n const asked: AgentSessionRequest = held\n ? {\n ...held.request,\n ...(request.signal ? { signal: request.signal } : {}),\n }\n : {\n ...request,\n conversationId:\n request.conversationId ?? current.get(entry.key) ?? null,\n key,\n openId: `op_${randomId().slice(3)}`,\n agent: options.agent ?? null,\n place: entry.place,\n placeRevision: ++entry.revision,\n entryPoint: entry.entryPoint,\n ...(options.sendAnchor && entry.anchor\n ? { anchor: entry.anchor }\n : {}),\n ...(options.sendAnchor && entry.via ? { entry: entry.via } : {}),\n };\n const { conversationId, openId, place: told } = asked;\n let session: ConversationSession;\n try {\n session = await patiently(\n () => backend.openSession(asked),\n request.signal,\n entry.key,\n );\n if (!usable(session, insecure))\n throw new AgentRefusal('unavailable', {\n reason: 'invalid_session',\n message:\n 'Unusable session: an id, a secret, wss:// and https:// addresses.',\n });\n } catch (error) {\n if (live.get(entry.key) === entry) {\n const failure: AgentFailure = isRefusal(error)\n ? error.kind === 'ended' && conversationId !== null\n ? 'ended'\n : 'unavailable'\n : policy.isRetryable(error)\n ? 'unreachable'\n : 'unavailable';\n const reason = reasonOf(error, failure);\n const code = isRefusal(error) ? error.code : codeOf(error);\n if (failure === 'unreachable') {\n const { signal, ...again } = asked;\n void signal; // kept without its signal: the next try brings its own\n entry.failedOpen = { request: again, at: held?.at ?? clock.now() };\n }\n // An open the backend could not settle is said as unavailable, never retried, its id kept for support.\n const unsettled =\n reason === 'unknown_open'\n ? String(field(error, 'openId') ?? openId)\n : null;\n update(entry, { failure, reason, code, openId: unsettled });\n emit({ type: 'session_failed', key: entry.key, failure, reason });\n if (entry.shown === 0) end(entry.key); // its view left while it opened: nothing waits for it\n }\n throw error;\n }\n // Let go while the backend answered (a start new, a sign-out): touch nothing, or the old conversation would be\n // pinned again as the key's current one.\n if (live.get(entry.key) !== entry) throw new AgentRefusal('unavailable');\n entry.told = told;\n entry.expiresAt = session.expires_at\n ? Date.parse(session.expires_at)\n : null;\n if (session.conversation_id)\n current.set(entry.key, session.conversation_id);\n const name = session.agent?.display_name?.trim();\n if (name && (name !== sessionName || names.get(key.mode) !== name)) {\n sessionName = name;\n names.set(key.mode, name);\n changed();\n }\n update(entry, {\n failure: null,\n reason: null,\n code: null,\n openId: null,\n sessionId: session.id,\n conversationId: session.conversation_id ?? conversationId,\n moved: !samePlace(told, entry.place),\n });\n emit({\n type: conversationId === null ? 'session_opened' : 'session_resumed',\n key: entry.key,\n sessionId: session.id,\n ...(entry.entryPoint ? { from: entry.entryPoint } : {}),\n });\n // Its view left while it opened: kept, hidden, until its end, so the next view finds it instead of opening\n // another session; let go now when it has no end to keep it to.\n if (entry.shown === 0) {\n if (entry.expiresAt === null || over(entry)) {\n end(entry.key);\n return session;\n }\n expireLater(entry);\n }\n // The person moved while it opened (or a held open was asked again from before they moved): the place they now\n // ask from is told live, as any move after it is.\n if (!samePlace(told, entry.place)) tell(entry, {});\n return session;\n }\n\n /** Where a key's conversation is kept on the device, with `persistence`. */\n const kept = (k: string) => `${prefix}.${k}`;\n\n /**\n * Everything of the person on this device goes; the backend is told to end the sessions at the same time, never\n * after a slow storage. A write, a read or a status from before lands nowhere (the generation).\n */\n const signOut = async (erasing: boolean) => {\n generation++;\n if (erasing) salt = null; // events wait for the next install's salt\n for (const entry of live.values()) {\n clearTimeout(entry.timer);\n entry.store.clear();\n }\n const known = new Set([...live.keys(), ...current.keys()]);\n live.clear();\n current.clear();\n sessionName = null;\n names.clear();\n status = null;\n reading = null;\n statusState = NO_STATUS;\n changed();\n // The people this device knew, for the greeting records alpha.5 and alpha.6 named after them.\n const pairs: [unknown, unknown][] = [];\n await Promise.all([\n backend.endSessions?.().catch(() => undefined),\n storage?.purge(\n [`${prefix}.`],\n (keys) => {\n const all = new Set([...keys, ...[...known].map(kept)]);\n for (const key of all) {\n const t = tupleOf(key, prefix);\n if (t) pairs.push([t[1], t[2]]);\n }\n return [\n ...all,\n ...legacyTranscripts(all, prefix),\n ...(options.legacyKeys ?? []),\n ];\n },\n `${GREETED}.`,\n ),\n ]);\n if (!erasing) return;\n await Promise.all([\n Promise.resolve(saltStore?.removeItem(saltKey)).catch(() => undefined),\n greetings?.purge([`${GREETED}.`, `${GREETED_BEFORE}.`], (keys) => {\n for (const key of keys) {\n const t = tupleOf(key, GREETED);\n if (t) pairs.push([t[0], t[1]]);\n }\n return [...legacyGreetings(pairs), ...(options.legacyKeys ?? [])];\n }),\n ]);\n loadSalt(); // a new install's, as far as analytics can tell\n };\n\n /** The key's conversation is no longer this device's: its pinned id and its kept transcript go. */\n const forget = (k: string) => {\n current.delete(k);\n const entry = live.get(k);\n if (entry) {\n entry.store.clear();\n end(k);\n } else void storage?.removeItem(kept(k));\n };\n\n const activity = (entry: Entry, a: ConversationActivity) => {\n const sessionId = entry.state.sessionId;\n if (a.type === 'reply_completed' && sessionId) {\n entry.turns.set(a.turnId, sessionId);\n update(entry, {}); // the reply can be rated now\n }\n emit({\n type: a.type,\n key: entry.key,\n ...(sessionId ? { sessionId } : {}),\n ...(a.type === 'reply_completed' ? { turnId: a.turnId } : {}),\n ...(a.type === 'card_shown' ? { cardId: a.cardId, kind: a.kind } : {}),\n });\n };\n\n function make(key: AgentKey): Entry {\n const k = keyOf(key);\n const own = options.conversation ?? {};\n const refresh = backend.refreshSecret?.bind(backend);\n const entry: Entry = {\n key: k,\n store: createConversation({\n ...own,\n ...(storage\n ? {\n persistence: storage,\n persistenceKey: kept(k),\n }\n : {}),\n onActivity: (a) => {\n activity(entry, a);\n isolated('onActivity', () => own.onActivity?.(a));\n },\n getSession: (request) => open(entry, key, request),\n ...(refresh\n ? {\n // A refusal (`session_closed`) is the store's cue to go on in a new session, never a fault.\n refreshSecret: (id: string) =>\n patiently(() => refresh(id), undefined, k).catch((error) => {\n throw isRefusal(error)\n ? new VinaverseClientError(\n 'needs_new_session',\n error.message,\n )\n : error;\n }),\n }\n : {}),\n clock,\n onError: (error) => {\n // A refusal is said through the state, and a session the server closed is rolled over: neither is a fault.\n if (!isRefusal(error) && codeOf(error) !== 'needs_new_session')\n own.onError?.(error);\n },\n }),\n listeners: new Set(),\n state: {\n failure: null,\n reason: null,\n code: null,\n moved: false,\n ratings: new Map(),\n sessionId: null,\n conversationId: current.get(k) ?? null,\n openId: null,\n },\n place: null,\n told: null,\n revision: 0,\n telling: false,\n queued: false,\n entryPoint: null,\n anchor: null,\n via: null,\n expiresAt: null,\n shown: 0,\n started: false,\n suspended: false,\n sentOnce: new Set(),\n timer: undefined,\n grace: undefined,\n turns: new Map(),\n failedOpen: undefined,\n };\n return entry;\n }\n\n /** No view shows it, and its grace is over (or cut short by the background): no pings, closed in the background. */\n const suspend = (entry: Entry) => {\n clearTimeout(entry.grace);\n entry.grace = undefined;\n if (entry.shown > 0 || entry.suspended || live.get(entry.key) !== entry)\n return;\n entry.suspended = true;\n entry.store.setForeground(false);\n };\n\n const over = (entry: Entry) =>\n entry.expiresAt !== null && entry.expiresAt <= clock.now();\n\n /** No view shows it: it ends at its session's end, even unseen (while the app's timers run). */\n const expireLater = (entry: Entry) => {\n clearTimeout(entry.timer);\n if (entry.expiresAt === null) return;\n entry.timer = setTimeout(\n () => {\n entry.timer = undefined;\n if (live.get(entry.key) !== entry || entry.shown > 0) return;\n if (over(entry)) end(entry.key);\n else expireLater(entry); // the clock it is judged by ran slower than the timer\n },\n Math.max(0, entry.expiresAt - clock.now()),\n );\n };\n\n /**\n * The new place: told live when the backend can (the session then knows it; `null` clears it), else `moved` until the\n * next session. Only the newest telling lands, and only on the session it was told to. One `updateContext` is in\n * flight per conversation: a place told meanwhile (`show` and `tell` in one move, or rapid moves) waits, only the\n * newest, and goes with the next revision when the one in flight settles.\n */\n const tell = (entry: Entry, at: AgentOpen) => {\n if (at.place !== undefined) entry.place = at.place;\n if (at.entryPoint !== undefined) entry.entryPoint = at.entryPoint;\n if (at.anchor !== undefined)\n entry.anchor = at.anchor && anchorRef(at.anchor.type, at.anchor.id);\n if (at.entry !== undefined) entry.via = at.entry && entryOf(at.entry);\n const sessionId = entry.state.sessionId;\n const moved = sessionId !== null && !samePlace(entry.told, entry.place);\n update(entry, { moved });\n const updateContext = backend.updateContext?.bind(backend);\n if (!moved || !updateContext || sessionId === null) return;\n if (entry.telling) {\n entry.queued = true; // the newest place goes when the one in flight settles\n return;\n }\n entry.telling = true;\n const asked = generation;\n const current = () =>\n asked === generation &&\n live.get(entry.key) === entry &&\n entry.state.sessionId === sessionId;\n // The one in flight settled: the place told meanwhile, if any and still this conversation's, goes next.\n const settle = () => {\n entry.telling = false;\n if (!entry.queued) return;\n entry.queued = false;\n if (asked === generation && live.get(entry.key) === entry)\n tell(entry, {});\n };\n const send = (again: boolean) => {\n // Always the newest place: a resend after a conflict carries what the person sees now.\n const place = entry.place;\n const revision = ++entry.revision;\n // A backend that throws as it is called (not in its promise) is a refusal too: settled like one, so the\n // next place is never left waiting behind a telling that never ends.\n let told: Promise<void>;\n try {\n told = updateContext(sessionId, place ?? CLEARED, revision);\n } catch (error) {\n told = Promise.reject(error);\n }\n told.then(\n () => {\n if (current() && entry.revision === revision) {\n entry.told = place;\n update(entry, { moved: !samePlace(entry.told, entry.place) });\n emit({ type: 'context_updated', key: entry.key, sessionId });\n }\n settle();\n },\n (error: unknown) => {\n // The server holds a newer revision (`current_revision`): the newest place once more above it, only if the\n // session and the person are still the ones it was told for; then `moved`.\n const theirs = field(error, 'currentRevision');\n const conflict =\n field(error, 'outcome') === 'context_conflict' ||\n field(error, 'reason') === 'conflict';\n if (conflict && !again && current() && entry.revision === revision) {\n if (typeof theirs === 'number' && theirs >= entry.revision)\n entry.revision = theirs;\n send(true);\n return;\n }\n // Not served, or refused: the question about this place stays the way to say it. A refusal that is no\n // conflict (a 400 is the kit's or the backend's mistake, never the person's) is said in development.\n if (!conflict && devBuild()) {\n const status = field(error, 'status');\n warn(\n `@vinaverse/client/agent: updateContext was refused${typeof status === 'number' ? ` (${status})` : ''}: ${error instanceof Error ? error.message : String(error)}. The new place is offered as a question instead.`,\n { code: 'context_refused' },\n );\n }\n settle();\n },\n );\n };\n send(false);\n };\n\n function handle(entry: Entry): AgentConversation {\n return {\n key: entry.key,\n store: entry.store,\n show(at = {}) {\n // Let go meanwhile, or past its session's end with no view: nothing to show; the key's next one is read anew.\n if (live.get(entry.key) !== entry) return () => undefined;\n if (entry.shown === 0 && over(entry)) {\n end(entry.key);\n return () => undefined;\n }\n entry.shown++;\n clearTimeout(entry.timer);\n entry.timer = undefined;\n clearTimeout(entry.grace); // back within its grace: still connected, nothing to do\n entry.grace = undefined;\n if (entry.suspended) {\n entry.suspended = false;\n entry.store.setForeground(true);\n }\n tell(entry, at);\n if (!entry.started) {\n entry.started = true;\n entry.store.start();\n }\n let released = false;\n return () => {\n if (released) return;\n released = true;\n entry.shown--;\n if (entry.shown > 0 || live.get(entry.key) !== entry) return;\n const status = entry.store.getSnapshot().status;\n // Still opening: the open goes on, hidden, so a view that comes back (a screen mounted again) takes this\n // session instead of asking for another; its answer keeps or lets it go (`open`).\n const opening = status === 'starting' && keepAlive !== 'view';\n if (\n !opening &&\n (keepAlive === 'view' ||\n NOT_KEPT.has(status) ||\n entry.expiresAt === null ||\n over(entry))\n ) {\n end(entry.key);\n return;\n }\n // Suspended after a grace: a view that comes back soon finds it connected, with its secret.\n if (graceMs > 0)\n entry.grace = setTimeout(() => suspend(entry), graceMs);\n else suspend(entry);\n expireLater(entry);\n };\n },\n tell: (at) => tell(entry, at),\n getState: () => entry.state,\n subscribe(listener) {\n entry.listeners.add(listener);\n return () => entry.listeners.delete(listener);\n },\n retry() {\n update(entry, {\n failure: null,\n reason: null,\n code: null,\n openId: null,\n });\n entry.store.start();\n },\n canRate: (turnId) => entry.turns.has(turnId),\n rate(turnId, rating) {\n // The session the reply was given in, never the one open now: a reply restored from before is not rated.\n const sessionId = entry.turns.get(turnId);\n if (!sessionId || entry.state.ratings.get(turnId) === rating) return;\n update(entry, {\n ratings: new Map(entry.state.ratings).set(turnId, rating),\n });\n emit({ type: 'rated', key: entry.key, sessionId, turnId, rating });\n void backend\n .sendFeedback?.({ sessionId, turnId, rating })\n .catch(() => undefined);\n },\n sendOnce(text) {\n if (entry.sentOnce.has(text)) return;\n entry.sentOnce.add(text);\n entry.store.send(text);\n },\n };\n }\n\n const handles = new WeakMap<Entry, AgentConversation>();\n\n const lookup = (key: AgentKey) => {\n const k = keyOf(key);\n let entry = live.get(k);\n if (!entry) {\n entry = make(key);\n live.set(k, entry);\n }\n let h = handles.get(entry);\n if (!h) {\n h = handle(entry);\n handles.set(entry, h);\n }\n return h;\n };\n\n return {\n conversation(key) {\n const k = keyOf(key);\n const entry = live.get(k);\n if (entry && entry.shown === 0 && over(entry)) end(k);\n return lookup(key);\n },\n peek: lookup,\n startNew(key) {\n const k = keyOf(key);\n current.delete(k);\n end(k);\n },\n dispose(key) {\n end(keyOf(key));\n },\n forget(key) {\n forget(keyOf(key));\n },\n background() {\n for (const entry of live.values()) if (entry.grace) suspend(entry);\n },\n sweep() {\n for (const entry of [...live.values()])\n if (entry.shown === 0 && over(entry)) end(entry.key);\n },\n continue(key, conversationId) {\n const k = keyOf(key);\n if (current.get(k) !== conversationId) {\n // What the device kept is another conversation's: forgotten, so the resumed transcript is the only one drawn.\n forget(k);\n current.set(k, conversationId);\n }\n return lookup(key);\n },\n async signOut() {\n await signOut(false);\n },\n async erase() {\n await signOut(true);\n },\n async deleteConversation(key, conversationId) {\n if (!backend.deleteConversation)\n throw new Error(\n '@vinaverse/client/agent: deleteConversation needs AgentBackend.deleteConversation.',\n );\n await backend.deleteConversation(conversationId);\n const k = keyOf(key);\n const continued =\n current.get(k) ??\n live.get(k)?.store.getSnapshot().conversationId ??\n null;\n if (continued === conversationId) forget(k);\n },\n greetings: greetings ?? null,\n status() {\n if (status && clock.now() - status.at < staleMs)\n return Promise.resolve(status.value);\n if (reading) return reading;\n const asked = generation;\n const read = readStatus(backend).then(\n (value) => {\n if (asked !== generation) return value; // read for the person before a sign-out: not kept\n reading = null;\n status = { value, at: clock.now() };\n setStatusState({ reading: false, failed: false });\n return value;\n },\n (error: unknown) => {\n if (asked === generation) {\n reading = null;\n setStatusState({ reading: false, failed: true });\n }\n throw error;\n },\n );\n reading = read;\n setStatusState({ reading: true, failed: statusState.failed });\n return read;\n },\n getStatus: () => status?.value ?? null,\n getStatusState: () => statusState,\n backend,\n epoch: () => generation,\n getName: (mode) =>\n (mode === undefined ? sessionName : names.get(mode)) ??\n status?.value.displayName ??\n null,\n subscribe(listener) {\n listeners.add(listener);\n return () => listeners.delete(listener);\n },\n emit,\n };\n}\n\n/**\n * The app's storage as the runtime's stores use it: writes and removals for a key run in the order they were made, a\n * read waits for them, a write begun before a sign-out lands nowhere, and every key written is listed (under\n * `<prefix>:index`), so a sign-out removes all of them, closed conversations' too.\n */\nfunction guardedStorage(\n raw: ConversationPersistence | undefined,\n prefix: string,\n generation: () => number,\n):\n | (ConversationPersistence & {\n purge(\n under: readonly string[],\n extra?: (keys: ReadonlySet<string>) => Iterable<string>,\n keep?: string,\n ): Promise<void>;\n })\n | undefined {\n if (!raw) return undefined;\n const indexKey = `${prefix}:index`;\n const chains = new Map<string, Promise<unknown>>();\n const pending = new Map<string, number>();\n const queued = <T>(key: string, op: () => T | Promise<T>): Promise<T> => {\n pending.set(key, (pending.get(key) ?? 0) + 1);\n const run = (chains.get(key) ?? Promise.resolve()).then(op);\n const settled = run.then(\n () => undefined,\n () => undefined,\n );\n chains.set(key, settled);\n void settled.then(() => {\n const left = (pending.get(key) ?? 1) - 1;\n if (left > 0) pending.set(key, left);\n else {\n pending.delete(key);\n if (chains.get(key) === settled) chains.delete(key);\n }\n });\n return run;\n };\n const safe = <T>(p: Promise<T>) => p.catch(() => undefined);\n const readIndex = async (): Promise<Set<string>> => {\n try {\n const value = await raw.getItem(indexKey);\n const list: unknown = value ? JSON.parse(value) : [];\n return new Set(\n Array.isArray(list)\n ? list.filter((k): k is string => typeof k === 'string')\n : [],\n );\n } catch {\n return new Set();\n }\n };\n const listed = new Set<string>();\n const list = (key: string) => {\n if (listed.has(key)) return;\n listed.add(key);\n void safe(\n queued(indexKey, async () => {\n const all = await readIndex();\n if (all.has(key)) return;\n all.add(key);\n await raw.setItem(indexKey, JSON.stringify([...all]));\n }),\n );\n };\n return {\n getItem(key) {\n // A read that finishes after a sign-out answers nothing: the next person never sees the last one's record.\n const asked = generation();\n const read = pending.has(key)\n ? queued(key, () => raw.getItem(key))\n : raw.getItem(key);\n if (typeof read === 'string' || read === null) return read;\n return Promise.resolve(read).then(\n (v) => (asked === generation() ? (v ?? null) : null),\n () => null,\n );\n },\n setItem(key, value) {\n const asked = generation();\n return safe(\n queued(key, () => {\n if (asked !== generation()) return;\n list(key);\n return raw.setItem(key, value);\n }),\n );\n },\n removeItem: (key) => safe(queued(key, () => raw.removeItem(key))),\n /**\n * Everything kept: the index, what the app's storage finds under `under` (`removePrefix`, else `keys`), and `extra`\n * (older key shapes). Nothing under `keep` goes, so `removePrefix` is used only for a prefix that cannot reach it.\n */\n async purge(\n under: readonly string[],\n extra: (keys: ReadonlySet<string>) => Iterable<string> = () => [],\n keep?: string,\n ) {\n const all = new Set([...listed, ...(await readIndex())]);\n listed.clear();\n for (const p of under)\n try {\n if (raw.removePrefix && !keep?.startsWith(p))\n await raw.removePrefix(p);\n else if (raw.keys)\n for (const key of await raw.keys(p))\n if (!keep || !key.startsWith(keep)) all.add(key);\n } catch {\n // storage that cannot list: the index and the known shapes still go\n }\n for (const key of extra(all)) all.add(key);\n await Promise.all(\n [...all].map((key) => safe(queued(key, () => raw.removeItem(key)))),\n );\n await safe(queued(indexKey, () => raw.removeItem(indexKey)));\n },\n };\n}\n\nasync function readStatus(backend: AgentBackend): Promise<AgentStatus> {\n const read: AgentStatusRead = backend.status\n ? await backend.status()\n : { available: true };\n const available = read.available === true;\n const features = read.features ?? NO_FEATURES;\n return {\n available,\n launcher: available && read.launcher === true,\n displayName: read.displayName?.trim() || null,\n avatarUrl: read.avatarUrl?.startsWith('https://') ? read.avatarUrl : null,\n features: {\n history: available && features.history === true,\n memory: available && features.memory === true,\n businessAgent: available && features.businessAgent === true,\n businessSetup: available && features.businessSetup === true,\n },\n };\n}\n\n/**\n * An `AgentRefusal`, also one made by another copy of this package (the mock in `@vinaverse/client/testing`, the\n * backend helpers in `@vinaverse/client/backend`, a second install): recognised by its name and kind, not its class.\n */\nexport function isRefusal(error: unknown): error is AgentRefusal {\n return (\n error instanceof AgentRefusal ||\n (field(error, 'name') === 'AgentRefusal' &&\n (field(error, 'kind') === 'ended' ||\n field(error, 'kind') === 'unavailable'))\n );\n}\n\nconst field = (error: unknown, name: string): unknown =>\n typeof error === 'object' && error !== null\n ? (error as Record<string, unknown>)[name]\n : undefined;\n\nconst retryable = (error: unknown) => field(error, 'retryable') === true;\n\nconst REASONS = new Set<AgentFailureReason>([\n 'ended',\n 'not_found',\n 'expired',\n 'mismatch',\n 'completed',\n 'forbidden',\n 'conflict',\n 'unknown_open',\n 'auth',\n 'off',\n 'rate_limited',\n 'network',\n 'server',\n 'invalid_session',\n 'unknown',\n]);\n\nfunction reasonOf(error: unknown, failure: AgentFailure): AgentFailureReason {\n if (isRefusal(error)) return error.reason;\n const given = field(error, 'reason');\n if (typeof given === 'string' && REASONS.has(given as AgentFailureReason))\n return given as AgentFailureReason;\n const status = field(error, 'status');\n if (status === 401 || status === 403) return 'auth';\n if (status === 429) return 'rate_limited';\n if (typeof status === 'number' && status >= 500) return 'server';\n return failure === 'unreachable' ? 'network' : 'unknown';\n}\n\nfunction codeOf(error: unknown): string | null {\n const code = field(error, 'code') ?? field(error, 'outcome');\n return typeof code === 'string' ? code : null;\n}\n\n/** Tries again after each delay while the policy says so; an outage is said, never answered with a new conversation. */\nasync function retrying<T>(\n run: () => Promise<T>,\n policy: Required<AgentRetryPolicy>,\n signal: AbortSignal | undefined,\n onRetry: (attempt: number) => void,\n): Promise<T> {\n for (let attempt = 0; ; attempt++) {\n try {\n return await run();\n } catch (error) {\n const delay = policy.delays[attempt];\n if (delay === undefined || !policy.isRetryable(error) || signal?.aborted)\n throw error;\n // The server's own wait (`Retry-After`), when longer than the policy's.\n const asked = field(error, 'retryAfterMs');\n const wait =\n typeof asked === 'number' && asked > delay\n ? Math.min(asked, 60_000) // never stalled by a bad `Retry-After`\n : delay;\n await new Promise<void>((resolve, reject) => {\n const timer = setTimeout(() => {\n signal?.removeEventListener('abort', stop);\n resolve();\n }, wait);\n function stop() {\n clearTimeout(timer);\n reject(error);\n }\n signal?.addEventListener('abort', stop, { once: true });\n });\n onRetry(attempt + 1);\n }\n }\n}\n"]}
|
|
@@ -37,7 +37,8 @@ var CARD_KINDS = {
|
|
|
37
37
|
question: true,
|
|
38
38
|
proposal: true,
|
|
39
39
|
next_step: true,
|
|
40
|
-
links: true
|
|
40
|
+
links: true,
|
|
41
|
+
anchor: true
|
|
41
42
|
};
|
|
42
43
|
function isKnownCard(card) {
|
|
43
44
|
return Object.hasOwn(CARD_KINDS, card.kind);
|
|
@@ -162,6 +163,11 @@ var RECONNECTABLE = /* @__PURE__ */ new Set(["server_restart"]);
|
|
|
162
163
|
var NEW_SESSION = /* @__PURE__ */ new Set(["idle", "expired", "limit_reached"]);
|
|
163
164
|
var str = (v) => typeof v === "string" ? v : void 0;
|
|
164
165
|
var ConversationEngine = class {
|
|
166
|
+
/** `now`: the clock a message is stamped by when the server gives no time. */
|
|
167
|
+
constructor(now = Date.now) {
|
|
168
|
+
this.now = now;
|
|
169
|
+
}
|
|
170
|
+
now;
|
|
165
171
|
sessionId = null;
|
|
166
172
|
conversationId = null;
|
|
167
173
|
connection = null;
|
|
@@ -350,7 +356,14 @@ var ConversationEngine = class {
|
|
|
350
356
|
case "message.staff": {
|
|
351
357
|
const id = str(event.message_id);
|
|
352
358
|
if (id !== void 0)
|
|
353
|
-
this.say(
|
|
359
|
+
this.say(
|
|
360
|
+
"staff",
|
|
361
|
+
str(event.text) ?? "",
|
|
362
|
+
`s:${id}`,
|
|
363
|
+
{},
|
|
364
|
+
void 0,
|
|
365
|
+
str(event.at)
|
|
366
|
+
);
|
|
354
367
|
return;
|
|
355
368
|
}
|
|
356
369
|
case "input.received": {
|
|
@@ -432,7 +445,9 @@ var ConversationEngine = class {
|
|
|
432
445
|
role,
|
|
433
446
|
str(item.text) ?? "",
|
|
434
447
|
transcriptKey(role, str(item.id), str(item.at)),
|
|
435
|
-
item.interrupted === true ? { partial: "interrupted" } : {}
|
|
448
|
+
item.interrupted === true ? { partial: "interrupted" } : {},
|
|
449
|
+
void 0,
|
|
450
|
+
str(item.at)
|
|
436
451
|
);
|
|
437
452
|
}
|
|
438
453
|
}
|
|
@@ -477,7 +492,8 @@ var ConversationEngine = class {
|
|
|
477
492
|
text,
|
|
478
493
|
key,
|
|
479
494
|
partial ? { partial } : {},
|
|
480
|
-
at
|
|
495
|
+
at,
|
|
496
|
+
str(item.at)
|
|
481
497
|
);
|
|
482
498
|
else
|
|
483
499
|
this.messages = this.messages.map((m) => {
|
|
@@ -605,9 +621,16 @@ var ConversationEngine = class {
|
|
|
605
621
|
this.unqueue(id);
|
|
606
622
|
}
|
|
607
623
|
/** Adds a message once: a key already held (a frame seen twice) changes nothing. */
|
|
608
|
-
say(role, text, key, extra = {}, seq) {
|
|
624
|
+
say(role, text, key, extra = {}, seq, at) {
|
|
609
625
|
if (this.messages.some((m) => m.key === key)) return;
|
|
610
|
-
this.messages.push({
|
|
626
|
+
this.messages.push({
|
|
627
|
+
role,
|
|
628
|
+
text,
|
|
629
|
+
key,
|
|
630
|
+
seq: seq ?? this.seq++,
|
|
631
|
+
...extra,
|
|
632
|
+
at: at || new Date(this.now()).toISOString()
|
|
633
|
+
});
|
|
611
634
|
}
|
|
612
635
|
/** The turn's streamed text, kept as the agent's message when the turn ends without its `message.completed`. */
|
|
613
636
|
cutOff(partial) {
|
|
@@ -1551,6 +1574,7 @@ function buildTimeline(input, previous) {
|
|
|
1551
1574
|
role: "person",
|
|
1552
1575
|
text: sent.text,
|
|
1553
1576
|
state: pending,
|
|
1577
|
+
at: sent.at,
|
|
1554
1578
|
...pending === "not_sent" ? {
|
|
1555
1579
|
rejection: rejection ?? {
|
|
1556
1580
|
code: state.refused[id] ?? "",
|
|
@@ -1602,7 +1626,8 @@ function messageItem(m) {
|
|
|
1602
1626
|
text: m.text,
|
|
1603
1627
|
state: m.received ? "delivered" : "sent",
|
|
1604
1628
|
...m.partial ? { partial: m.partial } : {},
|
|
1605
|
-
...m.refusal ? { refusal: true } : {}
|
|
1629
|
+
...m.refusal ? { refusal: true } : {},
|
|
1630
|
+
at: m.at
|
|
1606
1631
|
};
|
|
1607
1632
|
}
|
|
1608
1633
|
function equal(a, b) {
|
|
@@ -1636,7 +1661,9 @@ var OUTCOMES2 = /* @__PURE__ */ new Set([
|
|
|
1636
1661
|
]);
|
|
1637
1662
|
var ConversationStore = class {
|
|
1638
1663
|
options;
|
|
1639
|
-
engine = new ConversationEngine(
|
|
1664
|
+
engine = new ConversationEngine(
|
|
1665
|
+
() => this.options.clock?.now() ?? Date.now()
|
|
1666
|
+
);
|
|
1640
1667
|
session = null;
|
|
1641
1668
|
info = null;
|
|
1642
1669
|
getting = null;
|
|
@@ -1819,7 +1846,11 @@ var ConversationStore = class {
|
|
|
1819
1846
|
if ([...text].length > MAX_TEXT)
|
|
1820
1847
|
throw new RangeError(`A message is at most ${MAX_TEXT} characters.`);
|
|
1821
1848
|
const id = (this.options.createId ?? randomId)();
|
|
1822
|
-
this.sent.set(id, {
|
|
1849
|
+
this.sent.set(id, {
|
|
1850
|
+
text,
|
|
1851
|
+
order: lastOrder(this.engine.state()) + 0.5,
|
|
1852
|
+
at: new Date(this.options.clock?.now() ?? Date.now()).toISOString()
|
|
1853
|
+
});
|
|
1823
1854
|
this.tellActivity({ type: "message_sent", id });
|
|
1824
1855
|
if (!this.session) {
|
|
1825
1856
|
this.early.set(id, text);
|