@vinaverse/client 0.0.0-stage → 0.1.0-alpha.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +202 -0
- package/README.md +202 -2
- package/dist/agent/index.cjs +3319 -0
- package/dist/agent/index.cjs.map +1 -0
- package/dist/agent/index.d.cts +57 -0
- package/dist/agent/index.d.ts +57 -0
- package/dist/agent/index.js +99 -0
- package/dist/agent/index.js.map +1 -0
- package/dist/backend/index.cjs +268 -0
- package/dist/backend/index.cjs.map +1 -0
- package/dist/backend/index.d.cts +72 -0
- package/dist/backend/index.d.ts +72 -0
- package/dist/backend/index.js +250 -0
- package/dist/backend/index.js.map +1 -0
- package/dist/chunk-46D3FSLU.js +997 -0
- package/dist/chunk-46D3FSLU.js.map +1 -0
- package/dist/chunk-GWLLUOFY.js +1374 -0
- package/dist/chunk-GWLLUOFY.js.map +1 -0
- package/dist/chunk-O3NLAZGZ.js +859 -0
- package/dist/chunk-O3NLAZGZ.js.map +1 -0
- package/dist/chunk-YNUHXJD6.js +9 -0
- package/dist/chunk-YNUHXJD6.js.map +1 -0
- package/dist/contract-DmQs8amJ.d.cts +6 -0
- package/dist/contract-DmQs8amJ.d.ts +6 -0
- package/dist/conversation/index.cjs +2510 -0
- package/dist/conversation/index.cjs.map +1 -0
- package/dist/conversation/index.d.cts +65 -0
- package/dist/conversation/index.d.ts +65 -0
- package/dist/conversation/index.js +134 -0
- package/dist/conversation/index.js.map +1 -0
- package/dist/index.cjs +1390 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +11 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/dist/runtime-CISPp9nJ.d.cts +371 -0
- package/dist/runtime-Z1RI10lU.d.ts +371 -0
- package/dist/session-CPz4pcPu.d.cts +3651 -0
- package/dist/session-CPz4pcPu.d.ts +3651 -0
- package/dist/store-BxiicOKG.d.cts +414 -0
- package/dist/store-DZka9T2-.d.ts +414 -0
- package/dist/testing/index.cjs +274 -0
- package/dist/testing/index.cjs.map +1 -0
- package/dist/testing/index.d.cts +60 -0
- package/dist/testing/index.d.ts +60 -0
- package/dist/testing/index.js +259 -0
- package/dist/testing/index.js.map +1 -0
- package/package.json +151 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/backend/index.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["// @vinaverse/client/backend: an `AgentBackend` from the app's own routes (`backendFromFetch`), and the envelope a\n// tenant's backend answers with, `vinaverse.agent-backend/1` (vinaverse-contracts docs/agent-backend.md), written by the\n// .NET SDK's agent routes and pinned by the contracts fixture fixtures/agent-backend/v1.json:\n//\n// success: { \"version\": 1, \"session\" | \"client_secret\" | \"status\": ... }, or 204\n// failure: { \"version\": 1, \"outcome\", \"retryable\", \"retry_after\"? (rate_limited), \"open_id\"? (unknown_open),\n// \"current_revision\"? (context_conflict), \"code\"? (the gateway's problem code it was translated from) }\n//\n// Every outcome means exactly one thing to the runtime (`OUTCOMES`, with the contract's client action). An answer\n// without the envelope is read by its status alone, and a 404 or 410 there is never an ended conversation.\nimport {\n type AgentBackend,\n type AgentFailureReason,\n type AgentPlace,\n AgentRefusal,\n type AgentStatusRead,\n} from '../agent/runtime.js';\nimport type { ConversationSession } from '../conversation/store.js';\nimport type { ClientSecret } from '../events.js';\n\n/** `vinaverse.agent-backend/1`'s outcomes. */\nexport type BackendOutcome =\n | 'conversation_not_found'\n | 'conversation_expired'\n | 'conversation_mismatch'\n | 'conversation_completed'\n | 'session_closed'\n | 'feature_off'\n | 'rate_limited'\n | 'unauthorized'\n | 'forbidden_ownership'\n | 'context_conflict'\n | 'unavailable'\n | 'unknown_open';\n\n/** What the contract tells a kit to do for an outcome (docs/agent-backend.md, \"client action\"). */\nexport type BackendClientAction =\n | 'end'\n | 'rollover'\n | 'off'\n | 'wait'\n | 'sign_in'\n | 'refuse'\n | 'resend'\n | 'retry'\n | 'keep_open_id';\n\n/**\n * Each outcome: the status it comes with (another status is read by the status alone), the contract's client action,\n * and the runtime's reason. `end` and `rollover` are said as `ended` (a refused refresh rolls the session over); a\n * retryable answer is waited out; the rest are refusals.\n */\nexport const OUTCOMES: Readonly<\n Record<\n BackendOutcome,\n {\n readonly status: number;\n readonly client: BackendClientAction;\n readonly reason: AgentFailureReason;\n }\n >\n> = {\n conversation_not_found: { status: 404, client: 'end', reason: 'not_found' },\n conversation_expired: { status: 410, client: 'end', reason: 'expired' },\n conversation_mismatch: { status: 409, client: 'end', reason: 'mismatch' },\n conversation_completed: { status: 409, client: 'end', reason: 'completed' },\n session_closed: { status: 409, client: 'rollover', reason: 'ended' },\n feature_off: { status: 403, client: 'off', reason: 'off' },\n rate_limited: { status: 429, client: 'wait', reason: 'rate_limited' },\n unauthorized: { status: 401, client: 'sign_in', reason: 'auth' },\n forbidden_ownership: { status: 403, client: 'refuse', reason: 'forbidden' },\n context_conflict: { status: 409, client: 'resend', reason: 'conflict' },\n unavailable: { status: 503, client: 'retry', reason: 'server' },\n unknown_open: { status: 409, client: 'keep_open_id', reason: 'unknown_open' },\n};\n\ntype Headers = { get(name: string): string | null } | Record<string, string>;\n\nconst header = (headers: Headers | undefined, name: string) => {\n if (!headers) return null;\n if (typeof (headers as { get?: unknown }).get === 'function')\n return (headers as { get(n: string): string | null }).get(name);\n const found = Object.entries(headers).find(\n ([k]) => k.toLowerCase() === name.toLowerCase(),\n );\n return found ? found[1] : null;\n};\n\n/** `retry_after` in seconds from the body, else the `Retry-After` header (seconds or an HTTP date), in ms. */\nfunction uncappedRetryAfterMs(\n body: Record<string, unknown> | null,\n headers: Headers | undefined,\n): number | undefined {\n const given = body?.retry_after;\n if (typeof given === 'number' && given >= 0) return given * 1000;\n const raw = header(headers, 'retry-after');\n if (!raw) return undefined;\n const seconds = Number(raw);\n if (Number.isFinite(seconds) && seconds >= 0) return seconds * 1000;\n const at = Date.parse(raw);\n return Number.isNaN(at) ? undefined : Math.max(0, at - Date.now());\n}\n\nfunction parsed(body: unknown): Record<string, unknown> | null {\n let value = body;\n if (typeof value === 'string') {\n try {\n value = JSON.parse(value);\n } catch {\n return null;\n }\n }\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : null;\n}\n\n/** Waited out by the runtime's retry policy (at least `retryAfterMs`), then said as `unreachable` with its reason. */\nfunction unreachable(\n reason: AgentFailureReason,\n extra: Record<string, unknown>,\n message: string,\n): Error {\n return Object.assign(new Error(message), {\n name: 'AgentUnreachable',\n retryable: true,\n reason,\n ...extra,\n });\n}\n\n/**\n * What a failed call to the tenant's backend means to the runtime, to `throw` from an `AgentBackend` method:\n * - envelope v1 in `body` (an object or its JSON text) at its outcome's status: its outcome, one meaning each\n * (`OUTCOMES`); `unavailable` is waited out when `retryable` (a no-answer open's under its same `open_id`, which\n * the runtime keeps), `unknown_open` never;\n * - anything else (another version, an outcome v1 does not have, another status, a proxy page, a 2xx that is not the\n * operation's success): the status alone: 401 `auth`; 429 waited out (`Retry-After`); 408 and 5xx waited out as\n * `server`; any other, a 404 or 410 too, unavailable, never an ended conversation;\n * - a request that got no answer (pass what `fetch` threw instead of a status): waited out as `network`.\n * Every error carries `status`, `outcome`, `retryable`, and `openId`, `currentRevision`, `retryAfterMs` and the\n * gateway's `gatewayCode` when given.\n */\nexport function decodeBackendFailure(\n status: number | unknown,\n body?: unknown,\n headers?: Headers,\n): AgentRefusal | Error {\n if (typeof status !== 'number')\n return unreachable(\n 'network',\n { outcome: 'unavailable' },\n status instanceof Error ? status.message : 'No answer from the backend.',\n );\n const json = parsed(body);\n const named = json?.version === 1 ? json.outcome : undefined;\n const known =\n typeof named === 'string' &&\n Object.hasOwn(OUTCOMES, named) &&\n OUTCOMES[named as BackendOutcome].status === status\n ? (named as BackendOutcome)\n : null;\n const outcome: BackendOutcome =\n known ??\n (status === 401\n ? 'unauthorized'\n : status === 429\n ? 'rate_limited'\n : 'unavailable');\n const retryable = known\n ? outcome === 'rate_limited' ||\n (outcome === 'unavailable' && json?.retryable === true)\n : status === 429 || status === 408 || status >= 500;\n const wait = retryAfterMs(known ? json : null, headers);\n const extra = {\n status,\n outcome,\n ...(known && typeof json?.code === 'string'\n ? { gatewayCode: json.code }\n : {}),\n ...(known && typeof json?.open_id === 'string'\n ? { openId: json.open_id }\n : {}),\n ...(known === 'context_conflict' &&\n typeof json?.current_revision === 'number'\n ? { currentRevision: json.current_revision }\n : {}),\n ...(wait !== undefined ? { retryAfterMs: wait } : {}),\n };\n const message = `Backend answered ${status} (${outcome}).`;\n const { client, reason } = OUTCOMES[outcome];\n // Outside the envelope, a refusal no status explains is `unknown`.\n const said =\n known || outcome !== 'unavailable' || retryable ? reason : 'unknown';\n if (retryable) return unreachable(said, extra, message);\n return Object.assign(\n new AgentRefusal(\n client === 'end' || client === 'rollover' ? 'ended' : 'unavailable',\n {\n reason: said,\n code: outcome,\n message,\n },\n ),\n extra,\n { retryable: false },\n );\n}\n\n/** The app's own URLs for the agent's calls (its backend, which holds the Vinaverse key). */\nexport interface BackendRoutes {\n /** `POST`: a session (opened or resumed), answered `{ version, session }`. */\n readonly session: string;\n /** `POST { session_id }`: a fresh client secret, answered `{ version, client_secret }`. */\n readonly refresh?: string;\n /** `GET`: whether the agent is offered, and what it can do, answered `{ version, status }`. */\n readonly status?: string;\n /** `POST { session_id, turn_id, rating }`. */\n readonly feedback?: string;\n /** `POST {}`: end the person's open sessions (sign-out). */\n readonly end?: string;\n /** `PUT { session_id, screen_context }`: the person's place, live. */\n readonly context?: string;\n /**\n * `DELETE`, no body: one of the person's conversations (history's delete); `{conversation_id}` in the route is\n * replaced by its id. An already absent one is a success (204).\n */\n readonly delete?: string;\n}\n\n/** The routes the .NET SDK's `MapVinaverseAgentSessions` serves by default, under the app backend's `base` URL. */\nexport function backendRoutes(base: string): Required<BackendRoutes> {\n const at = (path: string) =>\n `${base.replace(/\\/$/, '')}/vinaverse/agent/${path}`;\n return {\n session: at('session'),\n refresh: at('session/refresh'),\n status: at('status'),\n feedback: at('feedback'),\n end: at('end'),\n context: at('context'),\n delete: at('conversations/{conversation_id}'),\n };\n}\n\nexport interface BackendFromFetchOptions {\n readonly routes: BackendRoutes;\n /** Default: the global `fetch`. */\n readonly fetch?: (input: string, init: RequestInit) => Promise<Response>;\n /** The person's own credentials for the app's backend (a bearer token), asked for on every call. */\n readonly headers?: () =>\n | Readonly<Record<string, string>>\n | Promise<Readonly<Record<string, string>>>;\n}\n\ntype StatusBody = {\n available?: unknown;\n launcher?: unknown;\n display_name?: unknown;\n avatar_url?: unknown;\n features?: {\n history?: unknown;\n memory?: unknown;\n business_agent?: unknown;\n business_setup?: unknown;\n };\n};\n\n/** `ScreenContext`: the screen, the entity and the filters when there are any, and the revision. */\nconst screenContext = (place: AgentPlace | null, revision: number) =>\n place\n ? {\n screen: place.screen,\n ...(place.entity ? { entity: place.entity } : {}),\n ...(place.filters ? { filters: place.filters } : {}),\n revision,\n }\n : null;\n\n/**\n * An `AgentBackend` over the app's own routes, speaking the same JSON as the .NET SDK's `MapVinaverseAgentSessions`:\n * snake_case bodies, the person known from `headers` (never in a body), failures read by `decodeBackendFailure`.\n */\nexport function backendFromFetch(\n options: BackendFromFetchOptions,\n): AgentBackend {\n const { routes } = options;\n const doFetch = options.fetch ?? ((input, init) => fetch(input, init));\n const call = async (\n method: string,\n url: string,\n body: unknown,\n field?: 'session' | 'client_secret' | 'status',\n signal?: AbortSignal,\n ): Promise<unknown> => {\n let response: Response;\n try {\n response = await doFetch(url, {\n method,\n headers: {\n accept: 'application/json',\n ...(body === undefined ? {} : { 'content-type': 'application/json' }),\n ...(await options.headers?.()),\n },\n ...(body === undefined ? {} : { body: JSON.stringify(body) }),\n ...(signal ? { signal } : {}),\n });\n } catch (error) {\n throw decodeBackendFailure(error);\n }\n const text = await response.text().catch(() => '');\n if (!response.ok)\n throw decodeBackendFailure(response.status, text, response.headers);\n if (!field) return undefined;\n // The operation's success, `{ version: 1, <field>: … }`; anything else is unavailable, not retried.\n const got = parsed(text);\n if (got?.version !== 1 || typeof got[field] !== 'object' || !got[field])\n throw decodeBackendFailure(response.status, text, response.headers);\n return got[field];\n };\n const backend: AgentBackend = {\n openSession: async (request) =>\n (await call(\n 'POST',\n routes.session,\n {\n open_id: request.openId,\n conversation_id: request.conversationId,\n reason: request.reason,\n mode: request.key.mode,\n scope: request.key.scope ?? null,\n thread: request.key.thread ?? 'chat',\n agent: request.agent,\n screen_context: screenContext(request.place, request.placeRevision),\n entry_point: request.entryPoint,\n ...(request.locale !== undefined ? { locale: request.locale } : {}),\n ...(request.timeZone !== undefined\n ? { time_zone: request.timeZone }\n : {}),\n },\n 'session',\n request.signal,\n )) as ConversationSession,\n };\n const { refresh, status, feedback, end, context } = routes;\n const remove = routes.delete;\n return {\n ...backend,\n ...(refresh\n ? {\n async refreshSecret(sessionId: string) {\n const s = (await call(\n 'POST',\n refresh,\n { session_id: sessionId },\n 'client_secret',\n )) as { value?: unknown; expires_at?: unknown };\n if (typeof s.value !== 'string' || typeof s.expires_at !== 'string')\n throw decodeBackendFailure(200);\n return { value: s.value, expires_at: s.expires_at } as ClientSecret;\n },\n }\n : {}),\n ...(status\n ? {\n async status(signal?: AbortSignal): Promise<AgentStatusRead> {\n const s = (await call(\n 'GET',\n status,\n undefined,\n 'status',\n signal,\n )) as StatusBody;\n const f = s.features ?? {};\n const name =\n typeof s.display_name === 'string' ? s.display_name : null;\n const avatar =\n typeof s.avatar_url === 'string' ? s.avatar_url : null;\n return {\n available: s.available === true,\n launcher: s.launcher === true,\n displayName: name,\n avatarUrl: avatar,\n features: {\n history: f.history === true,\n memory: f.memory === true,\n businessAgent: f.business_agent === true,\n businessSetup: f.business_setup === true,\n },\n };\n },\n }\n : {}),\n ...(feedback\n ? {\n async sendFeedback(given: {\n readonly sessionId: string;\n readonly turnId: string;\n readonly rating: 'up' | 'down';\n }) {\n await call('POST', feedback, {\n session_id: given.sessionId,\n turn_id: given.turnId,\n rating: given.rating,\n });\n },\n }\n : {}),\n ...(end\n ? {\n async endSessions() {\n await call('POST', end, {});\n },\n }\n : {}),\n ...(remove\n ? {\n async deleteConversation(conversationId: string) {\n await call(\n 'DELETE',\n remove.replace(\n '{conversation_id}',\n encodeURIComponent(conversationId),\n ),\n undefined,\n );\n },\n }\n : {}),\n ...(context\n ? {\n async updateContext(\n sessionId: string,\n place: AgentPlace,\n revision: number,\n ) {\n await call('PUT', context, {\n session_id: sessionId,\n screen_context: screenContext(place, revision),\n });\n },\n }\n : {}),\n };\n}\n\n/** The longest the runtime waits on a server's word: a bad `Retry-After` never stalls a conversation. */\nexport const MAX_RETRY_AFTER_MS = 60_000;\n\nfunction retryAfterMs(\n body: Record<string, unknown> | null,\n headers: Headers | undefined,\n): number | undefined {\n const ms = uncappedRetryAfterMs(body, headers);\n return ms === undefined ? undefined : Math.min(ms, MAX_RETRY_AFTER_MS);\n}\n"]}
|