@niadra/sdk 0.1.0 → 0.1.1
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/CHANGELOG.md +49 -0
- package/README.md +35 -18
- package/dist/index.cjs +169 -42
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +107 -13
- package/dist/index.d.ts +107 -13
- package/dist/index.js +167 -43
- package/dist/index.js.map +1 -1
- package/package.json +6 -3
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cache.ts","../src/errors.ts","../src/handles.ts","../src/context.ts","../src/ids.ts","../src/types/events.ts","../src/items.ts","../src/session.ts","../src/conversation.ts","../src/exit.ts","../src/media.ts","../src/objects.ts","../src/key.ts","../src/logger.ts","../src/options.ts","../src/queue.ts","../src/task.ts","../src/tools.ts","../src/version.ts","../src/transport.ts","../src/client.ts","../src/wrap.ts"],"names":["limit","build","value"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { CacheOptions } from \"./options.js\";\nimport type { ContextResponse } from \"./types/context.js\";\n\n/** How usable a cached pack is at the moment of a lookup. */\nexport type Freshness = \"fresh\" | \"stale\" | \"expired\";\n\ninterface Entry {\n response: ContextResponse;\n /** When the server last confirmed this pack, by sending it or by answering `not_modified`. */\n confirmedAt: number;\n /** The conversation or task the pack belongs to, so ending one drops its packs. */\n scope: string;\n /** Deltas received for this pack that no caller has been given yet. */\n pending: string[];\n}\n\nexport interface Lookup {\n response: ContextResponse;\n freshness: Freshness;\n}\n\n/** What one request for a key settled on: the server's answer, or the good pack it could not replace. */\nexport interface Revalidated {\n response: ContextResponse;\n source: \"network\" | \"fallback\";\n}\n\n/**\n * Packs per conversation, with stale-while-revalidate.\n *\n * Every agent framework rebuilds its prompt on every turn and none of them cache, so without\n * this each turn would cost a network round trip on the hot path. An entry moves through\n * three states as it ages: `fresh` (served as is), `stale` (served at once while one\n * background request refreshes it) and `expired` (only used as a last good value when a\n * request fails). Past `maxStaleMs` it is dropped entirely.\n *\n * Keys hold handle values, so the cache lives in process memory only and is never logged.\n *\n * A delta is what changed since this agent last read the subject, and the server moves that\n * mark as it answers, so a delta it sent once never comes back. Each one is therefore handed\n * out exactly once through `take()`: a delta fetched by a background refresh waits in its\n * entry for the next reader instead of being overwritten or served twice.\n */\nexport class ContextCache {\n private readonly entries = new Map<string, Entry>();\n private readonly inflight = new Map<string, Promise<Revalidated>>();\n private epoch = 0;\n\n constructor(\n private readonly options: CacheOptions,\n private readonly now: () => number = Date.now,\n ) {}\n\n get size(): number {\n return this.entries.size;\n }\n\n /**\n * Bumped by `clear()`. A request started before a purge carries the old epoch, and its\n * answer is not stored: a revoked key must not repopulate the cache on its way out.\n */\n get generation(): number {\n return this.epoch;\n }\n\n lookup(key: string): Lookup | null {\n const entry = this.entries.get(key);\n if (!entry) return null;\n const age = this.now() - entry.confirmedAt;\n if (age > this.options.maxStaleMs) {\n this.entries.delete(key);\n return null;\n }\n // Re-insert so iteration order doubles as least-recently-used order for eviction.\n this.entries.delete(key);\n this.entries.set(key, entry);\n let freshness: Freshness = \"expired\";\n if (age <= this.options.ttlMs) freshness = \"fresh\";\n else if (age <= this.options.ttlMs + this.options.staleWhileRevalidateMs) freshness = \"stale\";\n return { response: entry.response, freshness };\n }\n\n store(key: string, scope: string, response: ContextResponse, generation: number = this.epoch): void {\n if (generation !== this.epoch) return;\n const previous = this.entries.get(key);\n // A new pack already contains every change the deltas pending against the old one carried.\n const pending = previous?.response.etag === response.etag ? [...previous.pending] : [];\n if (response.delta) pending.push(response.delta);\n this.entries.delete(key);\n this.entries.set(key, { response: { ...response, delta: null }, confirmedAt: this.now(), scope, pending });\n while (this.entries.size > this.options.maxEntries) {\n const oldest = this.entries.keys().next();\n if (oldest.done) break;\n this.entries.delete(oldest.value);\n }\n }\n\n /**\n * The deltas pending for `key`, joined, which then count as delivered: `null` when there are\n * none, `undefined` when the key is not cached at all.\n */\n take(key: string): string | null | undefined {\n const entry = this.entries.get(key);\n if (!entry) return undefined;\n const delta = entry.pending.join(\"\\n\\n\") || null;\n entry.pending = [];\n return delta;\n }\n\n delete(key: string): void {\n this.entries.delete(key);\n }\n\n /** Drops every pack of one conversation or task. */\n deleteScope(scope: string): void {\n for (const [key, entry] of this.entries) {\n if (entry.scope === scope) this.entries.delete(key);\n }\n }\n\n clear(): void {\n this.entries.clear();\n this.epoch++;\n }\n\n /**\n * Runs `load` for a key unless a request for the same key is already in flight, in which\n * case every caller shares that one request. This is what keeps a burst of turns in one\n * conversation, or a stale entry read by many callers, down to a single refresh.\n */\n dedupe(key: string, load: () => Promise<Revalidated>): Promise<Revalidated> {\n const running = this.inflight.get(key);\n if (running) return running;\n const started = load().finally(() => {\n this.inflight.delete(key);\n });\n this.inflight.set(key, started);\n return started;\n }\n}\n","import type { Problem } from \"./types/common.js\";\n\n/**\n * Base class of every error the SDK produces. In the default fail-open mode these errors are\n * logged and returned in results rather than thrown; with `strict: true` they are thrown.\n */\nexport class NiadraError extends Error {\n override readonly name: string = \"NiadraError\";\n}\n\n/** The client was built without a usable API key, or with an option the SDK cannot honour. */\nexport class NiadraConfigError extends NiadraError {\n override readonly name = \"NiadraConfigError\";\n}\n\n/** A request failed validation before it left the process. Nothing was sent. */\nexport class NiadraValidationError extends NiadraError {\n override readonly name = \"NiadraValidationError\";\n}\n\n/** The request did not finish within its time budget. */\nexport class NiadraTimeoutError extends NiadraError {\n override readonly name = \"NiadraTimeoutError\";\n\n constructor(readonly timeoutMs: number) {\n super(`request timed out after ${timeoutMs} ms`);\n }\n}\n\n/** The network call failed before an HTTP response arrived (DNS, TLS, reset connection). */\nexport class NiadraConnectionError extends NiadraError {\n override readonly name = \"NiadraConnectionError\";\n}\n\n/** The request was cancelled through the caller's `AbortSignal`. */\nexport class NiadraAbortError extends NiadraError {\n override readonly name = \"NiadraAbortError\";\n}\n\n/**\n * The API answered with an error status. `code` comes from the problem document when the\n * server sent one; `requestId` is what Niadra support needs to find the call.\n */\nexport class NiadraAPIError extends NiadraError {\n override readonly name: string = \"NiadraAPIError\";\n readonly status: number;\n readonly code: string;\n readonly requestId: string | null;\n readonly problem: Problem | null;\n /** How long the server asked callers to wait, from `Retry-After`, when it said so. */\n readonly retryAfterMs: number | null;\n\n constructor(status: number, problem: Problem | null, requestId: string | null, retryAfterMs: number | null = null) {\n const code = problem?.code ?? `http_${status}`;\n const detail = problem?.detail ? `: ${problem.detail}` : \"\";\n super(`${status} ${code}${detail}`);\n this.status = status;\n this.code = code;\n this.problem = problem;\n this.requestId = requestId ?? problem?.request_id ?? null;\n this.retryAfterMs = retryAfterMs;\n }\n}\n\n/** 401: the key is missing, malformed, rotated or revoked. */\nexport class NiadraAuthenticationError extends NiadraAPIError {\n override readonly name = \"NiadraAuthenticationError\";\n}\n\n/** 403: the key is valid but lacks the scope, or its source was cut off. */\nexport class NiadraPermissionError extends NiadraAPIError {\n override readonly name = \"NiadraPermissionError\";\n}\n\n/** 429: over the rate limit. Batches wait `retryAfterMs` before trying again. */\nexport class NiadraRateLimitError extends NiadraAPIError {\n override readonly name = \"NiadraRateLimitError\";\n}\n\n/** Builds the most specific `NiadraAPIError` subclass for a status code. */\nexport function apiErrorFor(\n status: number,\n problem: Problem | null,\n requestId: string | null,\n retryAfterMs: number | null,\n): NiadraAPIError {\n if (status === 401) return new NiadraAuthenticationError(status, problem, requestId, retryAfterMs);\n if (status === 403) return new NiadraPermissionError(status, problem, requestId, retryAfterMs);\n if (status === 429) return new NiadraRateLimitError(status, problem, requestId, retryAfterMs);\n return new NiadraAPIError(status, problem, requestId, retryAfterMs);\n}\n\n/** Wraps anything thrown into a `NiadraError`, keeping the original as `cause`. */\nexport function toNiadraError(error: unknown): NiadraError {\n if (error instanceof NiadraError) return error;\n const message = error instanceof Error ? error.message : String(error);\n return new NiadraError(message, { cause: error });\n}\n","import { NiadraValidationError } from \"./errors.js\";\nimport type { Handle, ObjectRef } from \"./types/common.js\";\nimport type { SubjectKind } from \"./types/vocabulary.js\";\n\ninterface HandleOptions {\n /** Overrides the subject kind the server would infer from the handle type. */\n subjectKind?: SubjectKind;\n}\n\nfunction build(type: Handle[\"type\"], value: string, scope?: string, options?: HandleOptions): Handle {\n const handle: Handle = { type, value };\n if (scope !== undefined) handle.scope = scope;\n if (options?.subjectKind !== undefined) handle.subject_kind = options.subjectKind;\n return handle;\n}\n\n/**\n * Builders for the handle types the API accepts. They only assemble the object; the value is\n * normalized and validated on the server, which is the single source of truth for matching.\n *\n * @example\n * niadra.context({ subject: handles.phone(\"+5511987654321\"), conversation_id: \"wa-8812\" })\n */\nexport const handles = {\n /** A phone number in E.164 form, such as `+5511987654321`. */\n phone: (e164: string, options?: HandleOptions): Handle => build(\"phone_e164\", e164, undefined, options),\n email: (address: string, options?: HandleOptions): Handle => build(\"email\", address, undefined, options),\n /** The WhatsApp id (`wa_id`) the Cloud API reports for a contact. */\n waId: (value: string, options?: HandleOptions): Handle => build(\"wa_id\", value, undefined, options),\n waJid: (value: string, options?: HandleOptions): Handle => build(\"wa_jid\", value, undefined, options),\n waLid: (value: string, options?: HandleOptions): Handle => build(\"wa_lid\", value, undefined, options),\n /** A business-scoped WhatsApp user id; `businessAccount` is the WhatsApp Business account it belongs to. */\n waBsuid: (value: string, businessAccount: string, options?: HandleOptions): Handle =>\n build(\"wa_bsuid\", value, businessAccount, options),\n /** The user id in your own app or site. */\n appUserId: (value: string, options?: HandleOptions): Handle => build(\"app_user_id\", value, undefined, options),\n /** The id of a person or organization in a system of record; `system` names that system, such as `crm`. */\n systemId: (value: string, system: string, options?: HandleOptions): Handle =>\n build(\"system_id\", value, system, options),\n /** An HMAC of a national document number; `country` is its ISO 3166-1 alpha-2 code. */\n govIdHmac: (value: string, country: string, options?: HandleOptions): Handle =>\n build(\"gov_id_hmac\", value, country, options),\n /** An HMAC of a company registry number. Identifies an organization. */\n orgRegistryHmac: (value: string, country: string): Handle =>\n build(\"org_registry_hmac\", value, country, { subjectKind: \"account\" }),\n /** An e-mail domain, such as `acme.com`. Identifies an organization. */\n emailDomain: (domain: string): Handle => build(\"email_domain\", domain, undefined, { subjectKind: \"account\" }),\n /** An anonymous visitor or device id, before the person is known. */\n anonId: (value: string, options?: HandleOptions): Handle => build(\"anon_id\", value, undefined, options),\n} as const;\n\n/**\n * Accepts an `ObjectRef` or the `type:namespace:id` shorthand. The id may itself contain\n * colons (`invoice:erp:2026:0823`); only the first two separate the parts.\n */\nexport function toObjectRef(object: ObjectRef | string): ObjectRef {\n if (typeof object !== \"string\") return object;\n const first = object.indexOf(\":\");\n const second = first < 0 ? -1 : object.indexOf(\":\", first + 1);\n if (first <= 0 || second <= first + 1 || second === object.length - 1) {\n throw new NiadraValidationError(\"object must look like `type:namespace:id`\");\n }\n return { type: object.slice(0, first), namespace: object.slice(first + 1, second), id: object.slice(second + 1) };\n}\n","import { NiadraValidationError } from \"./errors.js\";\nimport type { NiadraError } from \"./errors.js\";\nimport { toObjectRef } from \"./handles.js\";\nimport type { Handle, ObjectRef } from \"./types/common.js\";\nimport type { ContextRequest, ContextResponse, LiveTurn, TargetModel } from \"./types/context.js\";\nimport type { Verification, View } from \"./types/vocabulary.js\";\n\n/** Arguments of `context()`. Pass exactly one of `subject` or `object`. */\nexport interface ContextParams {\n /** The customer, by any handle the server knows. */\n subject?: Handle;\n /** A business object, such as an invoice, when the task is about the object rather than a person. */\n object?: ObjectRef | string;\n /** The account or partner the person acts for. Requires an active link between the two. */\n about?: Handle;\n /** Defaults to `chat`. */\n view?: View;\n /**\n * The level proven in this conversation. The server may answer with a lower effective level\n * when the source's ceiling is lower; see `response.verification`.\n */\n verification?: Verification;\n /** Enables the per-conversation cache and the server's pinning of the pack. */\n conversation_id?: string;\n /** For internal agents: the task plays the role of the conversation. */\n task_id?: string;\n /** What the turn is about, so selection can favour relevant history. Up to 2,000 characters. */\n query?: string;\n /** Ask only for what changed since this source last read the subject. */\n delta?: boolean;\n /** The model that will read the pack, so the server can size it for that model's prompt cache. */\n target?: TargetModel;\n}\n\n/** Per-call options shared by every read method. */\nexport interface RequestOptions {\n /** Overrides the method's default time budget, in milliseconds. */\n timeout?: number | undefined;\n /** Cancels the wait. A request shared with other callers keeps running for them. */\n signal?: AbortSignal | undefined;\n /** Extra headers, such as a W3C `traceparent`. */\n headers?: Record<string, string> | undefined;\n}\n\nexport interface ContextOptions extends RequestOptions {\n /** Pass `false` to skip the per-conversation cache for this call. */\n cache?: boolean | undefined;\n}\n\n/**\n * Where a `context()` result came from.\n *\n * - `network`: a response the server just sent (or confirmed unchanged).\n * - `cache`: a pack younger than the cache TTL; no request was made.\n * - `stale`: an older pack returned at once while a background request refreshes it.\n * - `fallback`: the request failed and this is the last good pack for the conversation.\n * - `none`: nothing was available; `text` is empty and `error` says why.\n */\nexport type ContextSource = \"network\" | \"cache\" | \"stale\" | \"fallback\" | \"none\";\n\n/** What `context()` resolves to. Always usable: on failure `text` is an empty string. */\nexport interface ContextResult {\n /** The pack, ready for the system prompt. Empty when there is nothing to inject. */\n text: string;\n /**\n * The parts that change turn by turn and belong at the end of the prompt, after the\n * conversation: the delta and the live turns from other channels. Empty when there are none.\n */\n suffix: string;\n /** Named values from the pack, for templates that place them individually. */\n variables: Record<string, string>;\n source: ContextSource;\n /** The response this result was built from; `null` when `source` is `none`. */\n response: ContextResponse | null;\n /** What went wrong, when `source` is `fallback` or `none`. */\n error: NiadraError | null;\n}\n\nconst VIEW = /^(voice|chat|brief|full|custom|account|partner|task:[a-z0-9_]{1,40})$/;\nconst MAX_QUERY = 2000;\n\n/** Validates the arguments and builds the wire request, without `known_etag`. */\nexport function buildContextRequest(params: ContextParams): ContextRequest {\n if ((params.subject === undefined) === (params.object === undefined)) {\n throw new NiadraValidationError(\"pass exactly one of `subject` or `object`\");\n }\n if (params.conversation_id && params.task_id) {\n throw new NiadraValidationError(\"pass `conversation_id` or `task_id`, not both\");\n }\n if (params.view !== undefined && !VIEW.test(params.view)) {\n throw new NiadraValidationError(\"unknown view; task views look like `task:billing`\");\n }\n if (params.query !== undefined && params.query.length > MAX_QUERY) {\n throw new NiadraValidationError(`query is longer than ${MAX_QUERY} characters`);\n }\n\n const request: ContextRequest = { view: params.view ?? \"chat\" };\n if (params.subject) request.subject = params.subject;\n if (params.object !== undefined) request.object = toObjectRef(params.object);\n if (params.about) request.about = params.about;\n if (params.verification) request.verification = params.verification;\n if (params.conversation_id) request.conversation_id = params.conversation_id;\n if (params.task_id) request.task_id = params.task_id;\n if (params.query) request.query = params.query;\n if (params.delta) request.delta = true;\n if (params.target) request.target = params.target;\n return request;\n}\n\n/** Packs are only cached inside a conversation or task, the unit the server pins them to. */\nexport function cacheScope(request: ContextRequest): string | null {\n if (request.conversation_id) return `conversation:${request.conversation_id}`;\n if (request.task_id) return `task:${request.task_id}`;\n return null;\n}\n\n/**\n * Every field that changes what the server would compile goes into the key, in a fixed order.\n * `delta` does not: a plain read and a delta read of one conversation get the same pinned\n * bytes, so they share one entry.\n */\nexport function cacheKey(request: ContextRequest): string {\n return JSON.stringify([\n request.subject ?? null,\n request.object ?? null,\n request.about ?? null,\n request.view ?? \"chat\",\n request.verification ?? \"V0\",\n request.conversation_id ?? null,\n request.task_id ?? null,\n request.query ?? null,\n request.target ?? null,\n ]);\n}\n\n/**\n * Applies a `not_modified` answer to the cached pack: the pinned text and its metadata stay,\n * while the parts outside the pin (live turns, delta, coverage, timing) come from the new answer.\n */\nexport function mergeNotModified(cached: ContextResponse, fresh: ContextResponse): ContextResponse {\n return {\n ...fresh,\n not_modified: false,\n text: cached.text ?? null,\n variables: cached.variables,\n version: cached.version,\n etag: cached.etag,\n manifest_hash: cached.manifest_hash ?? null,\n withheld: cached.withheld,\n cache: cached.cache ?? null,\n };\n}\n\nexport function resultFrom(\n response: ContextResponse,\n source: ContextSource,\n error: NiadraError | null = null,\n): ContextResult {\n // A conversation in the control group gets an empty pack on purpose; it is not an error.\n const text = response.path === \"holdout\" ? \"\" : (response.text ?? \"\");\n return { text, suffix: renderSuffix(response), variables: response.variables, source, response, error };\n}\n\nexport function emptyResult(error: NiadraError | null): ContextResult {\n return { text: \"\", suffix: \"\", variables: {}, source: \"none\", response: null, error };\n}\n\n/**\n * Renders the delta and the live turns for the end of the prompt. Kept outside the pinned\n * pack so that the prompt prefix stays byte-identical across turns and the model provider's\n * prompt cache keeps hitting. Returns an empty string when there is nothing to add.\n */\nexport function renderSuffix(response: ContextResponse): string {\n if (response.path === \"holdout\") return \"\";\n return [response.delta ?? \"\", renderLive(response)].filter(Boolean).join(\"\\n\\n\");\n}\n\n/**\n * Renders the live turns (recent turns from other channels that the pack has not absorbed\n * yet) as one tagged block, or an empty string when there are none. `complete=\"false\"` tells\n * the model the list may be missing turns because the server could not read all of them.\n */\nexport function renderLive(response: ContextResponse): string {\n if (response.path === \"holdout\" || response.live.length === 0) return \"\";\n const complete = response.live_complete ? \"\" : ' complete=\"false\"';\n const lines = response.live.map(renderLiveTurn).join(\"\\n\");\n return `<live_turns source=\"niadra\"${complete}>\\n${lines}\\n</live_turns>`;\n}\n\nfunction renderLiveTurn(turn: LiveTurn): string {\n return `[${utcSeconds(turn.at)}] ${turn.channel} · ${turn.speaker}: ${turn.text}`;\n}\n\n/** The same timestamp form in every SDK, whatever precision or offset the server sent. */\nfunction utcSeconds(at: string): string {\n const ms = Date.parse(at);\n return Number.isNaN(ms) ? at : `${new Date(ms).toISOString().slice(0, 19)}Z`;\n}\n","let lastMs = -1;\nlet counter = 0;\n\nfunction randomBytes(length: number): Uint8Array {\n const bytes = new Uint8Array(length);\n const webCrypto = (globalThis as { crypto?: { getRandomValues?: (array: Uint8Array) => Uint8Array } })\n .crypto;\n if (webCrypto?.getRandomValues) {\n webCrypto.getRandomValues(bytes);\n } else {\n // Node 18 hides Web Crypto behind a flag; idempotency keys need uniqueness, not secrecy.\n for (let i = 0; i < length; i++) bytes[i] = Math.floor(Math.random() * 256);\n }\n return bytes;\n}\n\n/**\n * A UUIDv7 (RFC 9562): time-ordered, so keys minted by one process sort in the order the\n * events happened. A 12-bit counter keeps keys monotonic within the same millisecond.\n */\nexport function uuidv7(now: number = Date.now()): string {\n let ms = now;\n if (ms <= lastMs) {\n ms = lastMs;\n counter = (counter + 1) & 0xfff;\n if (counter === 0) ms += 1;\n } else {\n counter = (randomBytes(2)[0] ?? 0) & 0x7f;\n }\n lastMs = ms;\n\n const bytes = randomBytes(16);\n const high = Math.floor(ms / 2 ** 16);\n const low = ms % 2 ** 16;\n bytes[0] = (high >>> 24) & 0xff;\n bytes[1] = (high >>> 16) & 0xff;\n bytes[2] = (high >>> 8) & 0xff;\n bytes[3] = high & 0xff;\n bytes[4] = (low >>> 8) & 0xff;\n bytes[5] = low & 0xff;\n bytes[6] = 0x70 | ((counter >>> 8) & 0x0f);\n bytes[7] = counter & 0xff;\n bytes[8] = 0x80 | ((bytes[8] ?? 0) & 0x3f);\n\n let hex = \"\";\n for (const byte of bytes) hex += byte.toString(16).padStart(2, \"0\");\n return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`;\n}\n","/**\n * The write side: items of `POST /v1/batch`. A batch mixes item types, and one bad item never\n * fails the batch; the server answers 207 with one error per rejected item.\n */\n\nimport type { Handle, ObjectRef, Subject } from \"./common.js\";\nimport type {\n AssertionMethod,\n EventKind,\n Speaker,\n SubjectKind,\n Verification,\n VerifyMethod,\n Visibility,\n} from \"./vocabulary.js\";\n\n/** Longest text the server accepts in `content.text` or `content.transcript`. */\nexport const MAX_EVENT_TEXT = 200_000;\n\n/** Largest batch the server accepts. */\nexport const MAX_BATCH_ITEMS = 500;\n\n/** Largest file `POST /v1/media/uploads` reserves room for: 500 MiB. */\nexport const MAX_MEDIA_BYTES = 500 * 1024 * 1024;\n\nexport interface SpeakerRef {\n role: Speaker;\n /** Agent or attendant id inside the source. */\n id?: string | null;\n}\n\nexport interface Content {\n type?: \"text\" | \"audio\" | \"image\" | \"file\";\n text?: string | null;\n /** Reference returned by `/v1/media/uploads`; the media itself never travels in the event. */\n media_ref?: string | null;\n /** Lowercase hex SHA-256 of the media. */\n media_sha256?: string | null;\n transcript?: string | null;\n /** Speech-to-text confidence between 0 and 1. Low-confidence agent turns are not measured. */\n stt_confidence?: number | null;\n}\n\nexport interface VoiceInfo {\n ani?: string | null;\n dnis?: string | null;\n trunk?: string | null;\n network_attestation?: \"A\" | \"B\" | \"C\" | null;\n answered_at?: string | null;\n ended_at?: string | null;\n end_reason?: string | null;\n recording_ref?: string | null;\n turn_offset_ms?: number | null;\n}\n\n/**\n * The open item an action fulfils. Pass either `item_id`, or `object` together with the\n * canonical `operation`; the server rejects any other combination.\n */\nexport interface Closes {\n item_id?: string | null;\n object?: ObjectRef | null;\n operation?: string | null;\n}\n\nexport interface ActionInfo {\n /** Canonical operation, such as `credit` or `reschedule`. */\n operation: string;\n /** What happened, up to 2,000 characters. */\n result?: string | null;\n purpose?: string | null;\n closes?: Closes | null;\n corrects_action_id?: string | null;\n}\n\n/**\n * Which context the agent's prompt carried and when it went in. Set on the agent's own turns\n * and actions, so measurement can tell a context that arrived after the agent spoke from one\n * it had and did not use.\n */\nexport interface ContextStamp {\n /** The etag of the pack in the prompt; absent when the prompt carried no pack. */\n etag?: string | null;\n injected_at: string;\n}\n\n/** A message, a system event or an agent action, exactly as sent on the wire. */\nexport interface EventItem {\n type: \"event\";\n kind: EventKind;\n idempotency_key: string;\n channel: string;\n conversation_id?: string | null;\n conversation_aliases?: string[];\n task_id?: string | null;\n handles?: Handle[];\n subjects?: Subject[];\n object_refs?: ObjectRef[];\n speaker: SpeakerRef;\n direction?: \"inbound\" | \"outbound\" | null;\n content?: Content | null;\n occurred_at: string;\n visibility?: Visibility;\n verification_hint?: Verification | null;\n /** System events only, such as `invoice.credited`. */\n canonical_type?: string | null;\n /** Structured fields of a system event. */\n fields?: Record<string, unknown>;\n action?: ActionInfo | null;\n corrects_event_id?: string | null;\n voice?: VoiceInfo | null;\n context_stamp?: ContextStamp | null;\n}\n\n/** States that several handles belong to the same subject. */\nexport interface IdentifyItem {\n type: \"identify\";\n idempotency_key: string;\n /** Between 2 and 16 handles. */\n handles: Handle[];\n method: AssertionMethod;\n subject_kind: SubjectKind;\n conversation_id?: string | null;\n occurred_at: string;\n}\n\n/** Raises the verification level of one conversation or task. The server never infers it. */\nexport interface VerifyItem {\n type: \"verify\";\n idempotency_key: string;\n method: VerifyMethod;\n level: Verification;\n conversation_id?: string | null;\n task_id?: string | null;\n handle: Handle;\n valid_until?: string | null;\n occurred_at: string;\n}\n\nexport interface ConversationEndedItem {\n type: \"conversation.ended\";\n idempotency_key: string;\n conversation_id: string;\n occurred_at: string;\n}\n\nexport interface TaskEndedItem {\n type: \"task.ended\";\n idempotency_key: string;\n task_id: string;\n occurred_at: string;\n}\n\n/** A transfer to a human or another agent. */\nexport interface HandoffItem {\n type: \"handoff\";\n idempotency_key: string;\n conversation_id: string;\n target: \"human\" | \"agent\";\n target_source?: string | null;\n reason?: string | null;\n mode: \"warm\" | \"cold\";\n occurred_at: string;\n}\n\n/** Periodic counter the SDK sends so the server can tell a quiet source from a broken one. */\nexport interface HeartbeatItem {\n type: \"heartbeat\";\n window_start: string;\n sent: number;\n}\n\nexport type BatchItem =\n | EventItem\n | IdentifyItem\n | VerifyItem\n | ConversationEndedItem\n | TaskEndedItem\n | HandoffItem\n | HeartbeatItem;\n\nexport interface BatchRequest {\n items: BatchItem[];\n}\n\nexport interface ItemError {\n /** Position of the rejected item in the batch that was sent. */\n index: number;\n code: string;\n detail?: string | null;\n}\n\nexport interface BatchResponse {\n accepted: number;\n duplicates: number;\n errors: ItemError[];\n}\n\n/** Body of `POST /v1/media/uploads`. */\nexport interface MediaUploadRequest {\n content_type: string;\n /** Between 1 byte and 500 MiB. */\n size_bytes: number;\n /** Lowercase hex SHA-256 of the bytes. */\n sha256: string;\n /** Whose media it is. Stored under that person, so erasing them erases it too. */\n subject?: Handle | null;\n}\n\n/** Where to send the bytes: a short-lived signed URL, and the reference events carry afterwards. */\nexport interface MediaUploadResponse {\n media_ref: string;\n upload_url: string;\n /** Send exactly these headers with the bytes; the store refuses anything else. */\n upload_headers?: Record<string, string>;\n expires_at: string;\n}\n\nexport type FeedbackAction = \"retract_fact\" | \"correct_fact\" | \"resolve_open_item\" | \"conversation_outcome\";\n\n/** Body of `POST /v1/feedback`. The server records it as a `feedback.<action>` system event. */\nexport interface FeedbackRequest {\n idempotency_key: string;\n subject: Handle;\n action: FeedbackAction;\n fact_id?: string | null;\n open_item_id?: string | null;\n conversation_id?: string | null;\n /** Up to 2,000 characters. */\n value?: string | null;\n /** Up to 500 characters. */\n reason?: string | null;\n}\n","/**\n * Turns what callers pass to `track()`, `identify()` and friends into batch items, applying the\n * same shape rules the server enforces. Catching a malformed event here means it is dropped\n * with a log line instead of occupying the queue and coming back as a 207 error.\n */\n\nimport { NiadraValidationError } from \"./errors.js\";\nimport { toObjectRef } from \"./handles.js\";\nimport { uuidv7 } from \"./ids.js\";\nimport type { Handle, ObjectRef, Subject } from \"./types/common.js\";\nimport {\n MAX_EVENT_TEXT,\n type ActionInfo,\n type Closes,\n type Content,\n type ContextStamp,\n type ConversationEndedItem,\n type EventItem,\n type FeedbackAction,\n type FeedbackRequest,\n type HandoffItem,\n type IdentifyItem,\n type SpeakerRef,\n type TaskEndedItem,\n type VerifyItem,\n type VoiceInfo,\n} from \"./types/events.js\";\nimport type {\n AssertionMethod,\n EventKind,\n Speaker,\n SubjectKind,\n Verification,\n VerifyMethod,\n Visibility,\n} from \"./types/vocabulary.js\";\n\n/** An ISO 8601 string or a `Date`. */\nexport type Timestamp = string | Date;\n\n/** Fields shared by everything `track()` records. */\ninterface EventBase {\n /** Where it happened, such as `whatsapp`, `voice`, `app` or `erp`. */\n channel: string;\n /** Provider message id, when there is one; otherwise the SDK mints a UUIDv7. */\n idempotency_key?: string;\n conversation_id?: string | null;\n /** Other ids the same conversation has in other systems. Up to 8. */\n conversation_aliases?: string[];\n task_id?: string | null;\n /** Up to 16. An event needs at least one handle, subject or object. */\n handles?: Handle[];\n /** Up to 8. */\n subjects?: Subject[];\n /** Up to 16. Accepts `type:namespace:id` strings. */\n object_refs?: (ObjectRef | string)[];\n /** Defaults to now. */\n occurred_at?: Timestamp;\n visibility?: Visibility;\n verification_hint?: Verification | null;\n corrects_event_id?: string | null;\n voice?: VoiceInfo | null;\n /**\n * Which context the agent acted on, for the agent's own turns and actions. Conversations and\n * tasks set it from `markInjected()`.\n */\n context_stamp?: ContextStamp | null;\n}\n\n/** An event for `track()`. `kind` defaults to `message`. */\nexport interface TrackEvent extends EventBase {\n kind?: EventKind;\n /** Who produced it. A bare role is shorthand for `{ role }`. */\n speaker: SpeakerRef | Speaker;\n /** Defaults to `inbound` for customer messages and `outbound` for agent messages. */\n direction?: \"inbound\" | \"outbound\" | null;\n content?: Content | null;\n /** Shorthand for `content: { type: \"text\", text }`. Cannot be combined with `content`. */\n text?: string;\n /** Required for `system_event`, such as `invoice.credited`. */\n canonical_type?: string | null;\n fields?: Record<string, unknown>;\n /** Required for `action`, and only valid there. */\n action?: ActionInfo | null;\n}\n\n/** An agent action for `action()`: what an agent did in a system of record. */\nexport interface ActionEvent extends EventBase {\n /** Canonical operation, such as `credit` or `reschedule`. */\n operation: string;\n /** What happened, up to 2,000 characters. */\n result?: string | null;\n purpose?: string | null;\n /** The open item this action fulfils, which the server then marks resolved. */\n closes?: Closes | null;\n corrects_action_id?: string | null;\n /** Defaults to `ai_agent`. */\n speaker?: SpeakerRef | Speaker;\n}\n\nexport interface IdentifyParams {\n /** Between 2 and 16 handles that belong to the same subject. */\n handles: Handle[];\n /** Defaults to `explicit_identify`. */\n method?: AssertionMethod;\n /** Defaults to `person`. */\n subject_kind?: SubjectKind;\n conversation_id?: string | null;\n occurred_at?: Timestamp;\n idempotency_key?: string;\n}\n\nexport interface VerifyParams {\n /** The handle whose possession was proven. */\n handle: Handle;\n method: VerifyMethod;\n /** The level reached. It applies to this conversation or task only. */\n level: Verification;\n conversation_id?: string | null;\n task_id?: string | null;\n /** When the proof stops counting. */\n valid_until?: Timestamp | null;\n occurred_at?: Timestamp;\n idempotency_key?: string;\n}\n\nexport interface HandoffParams {\n conversation_id: string;\n target: \"human\" | \"agent\";\n /** The source that takes over, when it is integrated with Niadra. */\n target_source?: string | null;\n reason?: string | null;\n /** `warm` when the receiver gets a briefing. Defaults to `warm`. */\n mode?: \"warm\" | \"cold\";\n occurred_at?: Timestamp;\n idempotency_key?: string;\n}\n\n/** Arguments of `feedback()`: a correction of what Niadra derived about a subject. */\nexport interface FeedbackParams {\n subject: Handle;\n /**\n * `retract_fact` or `correct_fact` (with `fact_id`, and `value` for the right one),\n * `resolve_open_item` (with `open_item_id`) or `conversation_outcome` (with `conversation_id`\n * and `value`).\n */\n action: FeedbackAction;\n fact_id?: string | null;\n open_item_id?: string | null;\n conversation_id?: string | null;\n /** Up to 2,000 characters. */\n value?: string | null;\n /** Why, up to 500 characters. */\n reason?: string | null;\n idempotency_key?: string;\n}\n\nconst FEEDBACK_ACTIONS: readonly FeedbackAction[] = [\n \"retract_fact\",\n \"correct_fact\",\n \"resolve_open_item\",\n \"conversation_outcome\",\n];\n\nconst SHORT = 256;\n\nfunction fail(message: string): never {\n throw new NiadraValidationError(message);\n}\n\nfunction iso(value: Timestamp | undefined): string {\n if (value === undefined) return new Date().toISOString();\n if (value instanceof Date) {\n if (Number.isNaN(value.getTime())) fail(\"invalid Date\");\n return value.toISOString();\n }\n if (Number.isNaN(Date.parse(value))) fail(\"timestamps must be ISO 8601\");\n return value;\n}\n\nfunction short(value: string | null | undefined, field: string): void {\n if (value === undefined || value === null) return;\n if (value.length === 0 || value.length > SHORT) fail(`${field} must be 1 to ${SHORT} characters`);\n}\n\nfunction limit(list: readonly unknown[] | undefined, max: number, field: string): void {\n if (list && list.length > max) fail(`${field} takes at most ${max} entries`);\n}\n\nfunction speakerRef(speaker: SpeakerRef | Speaker): SpeakerRef {\n return typeof speaker === \"string\" ? { role: speaker } : speaker;\n}\n\nfunction checkCloses(closes: Closes | null | undefined): void {\n if (!closes) return;\n const byId = Boolean(closes.item_id);\n const byObject = Boolean(closes.object && closes.operation);\n if (byId === byObject) fail(\"closes takes either item_id, or object and operation\");\n}\n\nfunction checkContent(content: Content | null | undefined): void {\n if (!content) return;\n if ((content.text?.length ?? 0) > MAX_EVENT_TEXT) fail(`content.text is longer than ${MAX_EVENT_TEXT}`);\n if ((content.transcript?.length ?? 0) > MAX_EVENT_TEXT) {\n fail(`content.transcript is longer than ${MAX_EVENT_TEXT}`);\n }\n}\n\n/** Builds the wire event and checks it against the server's shape rules. */\nexport function buildEvent(input: TrackEvent): EventItem {\n if (input.text !== undefined && input.content) fail(\"pass `text` or `content`, not both\");\n const kind: EventKind = input.kind ?? \"message\";\n const speaker = speakerRef(input.speaker);\n const content: Content | null =\n input.text !== undefined ? { type: \"text\", text: input.text } : (input.content ?? null);\n\n short(input.channel, \"channel\");\n checkContent(content);\n limit(input.handles, 16, \"handles\");\n limit(input.subjects, 8, \"subjects\");\n limit(input.object_refs, 16, \"object_refs\");\n limit(input.conversation_aliases, 8, \"conversation_aliases\");\n if (kind === \"action\" && !input.action) fail(\"an action event needs the `action` block\");\n if (kind !== \"action\" && input.action) fail(\"`action` is only valid when kind is `action`\");\n if (kind === \"system_event\" && !input.canonical_type) fail(\"a system event needs `canonical_type`\");\n if (kind === \"message\" && !(content?.text || content?.media_ref || content?.transcript)) {\n fail(\"a message needs text, a transcript or a media reference\");\n }\n if (!hasTarget(input)) fail(\"an event needs at least one handle, subject or object\");\n if (input.action) {\n short(input.action.operation, \"action.operation\");\n if ((input.action.result?.length ?? 0) > 2000) fail(\"action.result is longer than 2000\");\n checkCloses(input.action.closes);\n }\n\n const event: EventItem = {\n type: \"event\",\n kind,\n idempotency_key: input.idempotency_key ?? uuidv7(),\n channel: input.channel,\n speaker,\n occurred_at: iso(input.occurred_at),\n };\n if (content) event.content = content;\n const direction = input.direction ?? (kind === \"message\" ? defaultDirection(speaker.role) : undefined);\n if (direction) event.direction = direction;\n if (input.object_refs) event.object_refs = input.object_refs.map(toObjectRef);\n if (input.canonical_type) event.canonical_type = input.canonical_type;\n if (input.fields) event.fields = input.fields;\n if (input.action) event.action = input.action;\n copyOptional(event, input);\n assertSerializable(event);\n return event;\n}\n\n/** Builds an `action` event: `track()` with `kind: \"action\"` and the action block filled in. */\nexport function buildAction(input: ActionEvent): EventItem {\n const { operation, result, purpose, closes, corrects_action_id, speaker, ...base } = input;\n const action: ActionInfo = { operation };\n if (result !== undefined) action.result = result;\n if (purpose !== undefined) action.purpose = purpose;\n if (closes !== undefined) action.closes = closes;\n if (corrects_action_id !== undefined) action.corrects_action_id = corrects_action_id;\n return buildEvent({ ...base, kind: \"action\", speaker: speaker ?? \"ai_agent\", action });\n}\n\nexport function buildIdentify(input: IdentifyParams): IdentifyItem {\n if (input.handles.length < 2 || input.handles.length > 16) fail(\"identify takes 2 to 16 handles\");\n const item: IdentifyItem = {\n type: \"identify\",\n idempotency_key: input.idempotency_key ?? uuidv7(),\n handles: input.handles,\n method: input.method ?? \"explicit_identify\",\n subject_kind: input.subject_kind ?? \"person\",\n occurred_at: iso(input.occurred_at),\n };\n if (input.conversation_id) item.conversation_id = input.conversation_id;\n return item;\n}\n\nexport function buildVerify(input: Omit<VerifyParams, \"handle\"> & { handle: Handle | undefined }): VerifyItem {\n if (!input.handle) fail(\"verify needs the handle whose possession was proven\");\n if (input.conversation_id && input.task_id) fail(\"pass `conversation_id` or `task_id`, not both\");\n const item: VerifyItem = {\n type: \"verify\",\n idempotency_key: input.idempotency_key ?? uuidv7(),\n method: input.method,\n level: input.level,\n handle: input.handle,\n occurred_at: iso(input.occurred_at),\n };\n if (input.conversation_id) item.conversation_id = input.conversation_id;\n if (input.task_id) item.task_id = input.task_id;\n if (input.valid_until) item.valid_until = iso(input.valid_until);\n return item;\n}\n\nexport function buildHandoff(input: HandoffParams): HandoffItem {\n short(input.conversation_id, \"conversation_id\");\n const item: HandoffItem = {\n type: \"handoff\",\n idempotency_key: input.idempotency_key ?? uuidv7(),\n conversation_id: input.conversation_id,\n target: input.target,\n mode: input.mode ?? \"warm\",\n occurred_at: iso(input.occurred_at),\n };\n if (input.target_source) item.target_source = input.target_source;\n if (input.reason) item.reason = input.reason;\n return item;\n}\n\nexport function buildFeedback(input: FeedbackParams): FeedbackRequest {\n if (!FEEDBACK_ACTIONS.includes(input.action)) fail(`action must be one of ${FEEDBACK_ACTIONS.join(\", \")}`);\n if ((input.value?.length ?? 0) > 2000) fail(\"value is longer than 2000\");\n if ((input.reason?.length ?? 0) > 500) fail(\"reason is longer than 500\");\n const request: FeedbackRequest = {\n idempotency_key: input.idempotency_key ?? uuidv7(),\n subject: input.subject,\n action: input.action,\n };\n if (input.fact_id) request.fact_id = input.fact_id;\n if (input.open_item_id) request.open_item_id = input.open_item_id;\n if (input.conversation_id) request.conversation_id = input.conversation_id;\n if (input.value) request.value = input.value;\n if (input.reason) request.reason = input.reason;\n return request;\n}\n\nexport function buildConversationEnded(conversationId: string): ConversationEndedItem {\n return {\n type: \"conversation.ended\",\n idempotency_key: uuidv7(),\n conversation_id: conversationId,\n occurred_at: iso(undefined),\n };\n}\n\nexport function buildTaskEnded(taskId: string): TaskEndedItem {\n return { type: \"task.ended\", idempotency_key: uuidv7(), task_id: taskId, occurred_at: iso(undefined) };\n}\n\n/** Whether an event names who or what it is about. */\nexport function hasTarget(event: {\n handles?: readonly unknown[] | undefined;\n subjects?: readonly unknown[] | undefined;\n object_refs?: readonly unknown[] | undefined;\n}): boolean {\n return [event.handles, event.subjects, event.object_refs].some((list) => (list?.length ?? 0) > 0);\n}\n\nfunction defaultDirection(role: Speaker): \"inbound\" | \"outbound\" | undefined {\n if (role === \"customer\") return \"inbound\";\n if (role === \"ai_agent\" || role === \"human_agent\") return \"outbound\";\n return undefined;\n}\n\nfunction copyOptional(event: EventItem, input: EventBase): void {\n if (input.conversation_id) event.conversation_id = input.conversation_id;\n if (input.conversation_aliases?.length) event.conversation_aliases = input.conversation_aliases;\n if (input.task_id) event.task_id = input.task_id;\n if (input.handles?.length) event.handles = input.handles;\n if (input.subjects?.length) event.subjects = input.subjects;\n if (input.visibility) event.visibility = input.visibility;\n if (input.verification_hint) event.verification_hint = input.verification_hint;\n if (input.corrects_event_id) event.corrects_event_id = input.corrects_event_id;\n if (input.voice) event.voice = input.voice;\n if (input.context_stamp) {\n const { etag, injected_at } = input.context_stamp;\n event.context_stamp = etag ? { etag, injected_at: iso(injected_at) } : { injected_at: iso(injected_at) };\n }\n}\n\n/** `fields` can hold anything; a value JSON cannot encode would poison the whole batch. */\nfunction assertSerializable(event: EventItem): void {\n try {\n JSON.stringify(event);\n } catch {\n fail(\"event is not JSON-serializable (check `fields` for BigInt or circular values)\");\n }\n}\n","import { renderSuffix } from \"./context.js\";\nimport type { ContextResult } from \"./context.js\";\nimport type { ContextResponse } from \"./types/context.js\";\nimport type { ContextStamp, SpeakerRef } from \"./types/events.js\";\nimport type { Speaker } from \"./types/vocabulary.js\";\n\n/** Bounds the suffix of a very long conversation; the oldest deltas go first. */\nconst MAX_DELTAS = 20;\n\n/** When context first went into the prompt, and when the agent first spoke. */\nexport interface Timings {\n contextInjectedAt: Date | null;\n firstAgentTurnAt: Date | null;\n}\n\n/**\n * What a conversation and a task keep between turns: the deltas received against the pack the\n * server pinned for them, and the stamp of the last context that went into the prompt.\n *\n * The server sends each delta once, relative to what this agent last read, so the deltas are\n * kept, in order, for as long as the pack stays the same. A new pack (after a verification,\n * say) already includes them, and so does the delta that arrives with it: both are dropped.\n */\nexport class SessionState {\n private etag: string | null = null;\n private deltas: string[] = [];\n private stamp: ContextStamp | null = null;\n private firstInjection: Date | null = null;\n private firstAgentTurn: Date | null = null;\n private last: ContextResult | null = null;\n\n /** After the first pack, every read also asks what changed since. */\n get wantsDelta(): boolean {\n return this.etag !== null;\n }\n\n get lastContext(): ContextResult | null {\n return this.last;\n }\n\n get contextStamp(): ContextStamp | null {\n return this.stamp;\n }\n\n get timings(): Timings {\n return { contextInjectedAt: this.firstInjection, firstAgentTurnAt: this.firstAgentTurn };\n }\n\n /** Folds one `context()` result into the session and returns it with every delta since the pin. */\n absorb(result: ContextResult): ContextResult {\n const response = result.response;\n if (result.source === \"none\" || !response) {\n // Nothing is being served, not even the last good pack (a 401 or 403 lands here):\n // deltas mean nothing without the pack they are relative to.\n this.reset();\n } else if (response.etag !== this.etag) {\n this.etag = response.etag;\n this.deltas = [];\n } else if (response.delta && !this.deltas.includes(response.delta)) {\n this.deltas = [...this.deltas, response.delta].slice(-MAX_DELTAS);\n }\n const absorbed = response ? withDeltas(result, response, this.deltas) : result;\n this.last = absorbed;\n return absorbed;\n }\n\n /** Starts over from the next pack the server pins, as after a raised verification level. */\n reset(): void {\n this.etag = null;\n this.deltas = [];\n }\n\n markInjected(context: ContextResult | null | undefined, at: Date): void {\n const etag = (context ?? this.last)?.response?.etag;\n this.firstInjection ??= at;\n this.stamp = etag ? { etag, injected_at: at.toISOString() } : { injected_at: at.toISOString() };\n }\n\n /** Notes an agent turn and returns the stamp it carries, if context went in before it. */\n agentTurn(): ContextStamp | null {\n this.firstAgentTurn ??= new Date();\n return this.stamp;\n }\n\n /** The stamp for an action, which only the AI agent took on the injected context. */\n actionStamp(speaker: SpeakerRef | Speaker | undefined): ContextStamp | null {\n const role = typeof speaker === \"string\" ? speaker : (speaker?.role ?? \"ai_agent\");\n return role === \"ai_agent\" ? this.stamp : null;\n }\n}\n\nfunction withDeltas(result: ContextResult, response: ContextResponse, deltas: string[]): ContextResult {\n const merged = { ...response, delta: deltas.join(\"\\n\\n\") || null };\n return { ...result, response: merged, suffix: renderSuffix(merged) };\n}\n","import type { Niadra, WriteResult } from \"./client.js\";\nimport type { ContextOptions, ContextParams, ContextResult } from \"./context.js\";\nimport { uuidv7 } from \"./ids.js\";\nimport { hasTarget } from \"./items.js\";\nimport type { ActionEvent, Timestamp, TrackEvent } from \"./items.js\";\nimport type { Logger } from \"./logger.js\";\nimport { SessionState } from \"./session.js\";\nimport type { Timings } from \"./session.js\";\nimport type { BoundTools, ToolBinding } from \"./tools.js\";\nimport type { Handle } from \"./types/common.js\";\nimport type { TargetModel } from \"./types/context.js\";\nimport type { Content, ContextStamp, VoiceInfo } from \"./types/events.js\";\nimport type { Speaker, Verification, VerifyMethod, View, Visibility } from \"./types/vocabulary.js\";\n\nexport interface ConversationParams {\n /** The customer on the other side. */\n subject: Handle;\n /** Where the conversation happens, such as `whatsapp` or `voice`. */\n channel: string;\n /** Your id for the thread. A UUIDv7 is minted when omitted. */\n conversation_id?: string;\n /** Defaults to `voice` when the channel is `voice`, otherwise `chat`. */\n view?: View;\n /** The level already proven when the conversation starts. Defaults to `V0`. */\n verification?: Verification;\n /** The account or partner the customer acts for. */\n about?: Handle;\n target?: TargetModel;\n}\n\n/** Optional details of one captured turn. */\nexport interface TurnOptions {\n /** The provider's message id, which makes retries of the same turn harmless. */\n idempotency_key?: string;\n occurred_at?: Timestamp;\n /** The agent or attendant id inside your system. */\n speaker_id?: string;\n visibility?: Visibility;\n /** Marks the text as a speech-to-text transcript with this confidence, between 0 and 1. */\n stt_confidence?: number;\n voice?: VoiceInfo;\n /** Overrides the stamp an agent turn would carry from `markInjected()`. */\n context_stamp?: ContextStamp;\n}\n\nexport type ConversationEvent = Omit<TrackEvent, \"channel\" | \"conversation_id\"> & { channel?: string };\nexport type ConversationAction = Omit<ActionEvent, \"channel\" | \"conversation_id\"> & { channel?: string };\n\nexport interface ConversationHooks {\n endConversation(id: string): Promise<WriteResult>;\n}\n\n/**\n * One customer conversation.\n *\n * The server pins the pack to the conversation: every turn gets the same bytes, so the prompt\n * prefix stays byte-identical and the model provider's prompt cache keeps hitting. After the\n * first pack, each read also asks for the delta, what changed since this agent last looked\n * (a new open item, an action another agent took). The server sends each delta once, so the\n * conversation keeps them, in order, in `suffix`, with the live turns, for the end of the\n * prompt. A successful `verify()` starts over from the pack the server pins for the new level.\n *\n * Call `markInjected()` when the pack goes into the prompt; the agent's later turns and actions\n * carry that moment and the pack's etag as `context_stamp`. `wrap()` does it for you.\n *\n * @example\n * const convo = niadra.conversation({ subject: handles.waId(\"5511987654321\"), channel: \"whatsapp\" });\n * convo.customer(inbound.text, { idempotency_key: inbound.id });\n * const ctx = await convo.context();\n * convo.markInjected(ctx);\n * const reply = await llm(ctx.text, history, ctx.suffix);\n * convo.agent(reply);\n */\nexport class Conversation {\n readonly id: string;\n readonly channel: string;\n readonly subject: Handle;\n private level: Verification;\n private readonly view: View;\n private readonly state = new SessionState();\n private ending: Promise<WriteResult> | null = null;\n\n constructor(\n private readonly client: Niadra,\n private readonly params: ConversationParams,\n private readonly hooks: ConversationHooks,\n ) {\n this.id = params.conversation_id ?? uuidv7();\n this.channel = params.channel;\n this.subject = params.subject;\n this.level = params.verification ?? \"V0\";\n this.view = params.view ?? (params.channel === \"voice\" ? \"voice\" : \"chat\");\n }\n\n /** The level in force for this conversation, raised by a successful `verify()`. */\n get verification(): Verification {\n return this.level;\n }\n\n /**\n * When context first went into the prompt, and when the agent first spoke. Context injected\n * after the agent's first turn is the \"late context\" signal the usage measurement reports.\n */\n get timings(): Timings {\n return this.state.timings;\n }\n\n /** What the agent's next turn and action carry: the last `markInjected()`, or `null`. */\n get contextStamp(): ContextStamp | null {\n return this.state.contextStamp;\n }\n\n /** The last result `context()` returned for this conversation. */\n get lastContext(): ContextResult | null {\n return this.state.lastContext;\n }\n\n /** Where `wrap()` reports what it swallowed: the client's logger. */\n get logger(): Logger {\n return this.client.logger;\n }\n\n /**\n * The pack for this turn: the pinned `text`, and a `suffix` with every delta since the pin\n * and the current live turns. A read with `query` is compiled for that query and never\n * pinned, so it leaves the conversation's deltas alone.\n */\n async context(options: ContextOptions & { query?: string } = {}): Promise<ContextResult> {\n const { query, ...requestOptions } = options;\n const params: ContextParams = {\n subject: this.subject,\n view: this.view,\n verification: this.level,\n conversation_id: this.id,\n ...(this.params.about ? { about: this.params.about } : {}),\n ...(this.params.target ? { target: this.params.target } : {}),\n };\n if (query) return this.client.context({ ...params, query }, requestOptions);\n if (this.state.wantsDelta) params.delta = true;\n return this.state.absorb(await this.client.context(params, requestOptions));\n }\n\n /**\n * Records that `context` (by default the last one this conversation returned) went into the\n * prompt. Call it each time you build the prompt; `timings.contextInjectedAt` keeps the first.\n */\n markInjected(context?: ContextResult | null, at: Date = new Date()): void {\n this.state.markInjected(context, at);\n }\n\n /** Captures what the customer said. */\n customer(text: string, options: TurnOptions = {}): string | null {\n return this.turn(\"customer\", text, options);\n }\n\n /** Captures what the AI agent said, stamped with the context its prompt carried. */\n agent(text: string, options: TurnOptions = {}): string | null {\n const stamp = this.state.agentTurn();\n return this.turn(\"ai_agent\", text, stamp ? { context_stamp: stamp, ...options } : options);\n }\n\n /** Captures what a human attendant said, for example after a handoff. */\n human(text: string, options: TurnOptions = {}): string | null {\n return this.turn(\"human_agent\", text, options);\n }\n\n /** Records any event in this conversation. The customer's handle is attached unless you pass your own. */\n track(event: ConversationEvent): string | null {\n return this.client.track({ ...this.bind(event), ...event, channel: event.channel ?? this.channel });\n }\n\n /** Records an action the agent took during this conversation, stamped like its turns. */\n action(event: ConversationAction): string | null {\n const stamp = this.state.actionStamp(event.speaker);\n return this.client.action({\n ...this.bind(event),\n ...(stamp ? { context_stamp: stamp } : {}),\n ...event,\n channel: event.channel ?? this.channel,\n });\n }\n\n /**\n * Records that the customer proved who they are, and raises the level for later reads.\n * `handle` defaults to the conversation's subject.\n */\n async verify(params: { method: VerifyMethod; level: Verification; handle?: Handle }): Promise<WriteResult> {\n const result = await this.client.verify({\n method: params.method,\n level: params.level,\n handle: params.handle ?? this.subject,\n conversation_id: this.id,\n });\n if (result.ok) {\n this.level = params.level;\n this.state.reset();\n }\n return result;\n }\n\n /** Records a transfer to a human or another agent. */\n handoff(params: {\n target: \"human\" | \"agent\";\n target_source?: string;\n reason?: string;\n mode?: \"warm\" | \"cold\";\n }): Promise<WriteResult> {\n return this.client.handoff({ ...params, conversation_id: this.id });\n }\n\n /**\n * The navigation kit bound to this customer and conversation. The verification level is\n * read at each call, so tools created before a `verify()` pick up the new level.\n */\n tools(): BoundTools {\n const read = (): Verification => this.level;\n const binding: ToolBinding = {\n conversation_id: this.id,\n voice: this.view === \"voice\",\n get verification() {\n return read();\n },\n };\n if (this.params.about) binding.about = this.params.about;\n return this.client.tools(this.subject, binding);\n }\n\n /** Emits `conversation.ended` and drops the conversation's cached packs. Safe to call twice. */\n end(): Promise<WriteResult> {\n this.ending ??= this.hooks.endConversation(this.id);\n return this.ending;\n }\n\n private bind(event: { handles?: Handle[]; subjects?: unknown[]; object_refs?: unknown[] }): {\n conversation_id: string;\n handles?: Handle[];\n } {\n const own = hasTarget(event);\n return own ? { conversation_id: this.id } : { conversation_id: this.id, handles: [this.subject] };\n }\n\n private turn(role: Speaker, text: string, options: TurnOptions): string | null {\n const transcript = options.stt_confidence !== undefined;\n const content: Content = transcript\n ? { type: \"audio\", transcript: text, stt_confidence: options.stt_confidence ?? null }\n : { type: \"text\", text };\n const event: TrackEvent = {\n channel: this.channel,\n conversation_id: this.id,\n handles: [this.subject],\n speaker: options.speaker_id ? { role, id: options.speaker_id } : { role },\n content,\n };\n if (options.idempotency_key) event.idempotency_key = options.idempotency_key;\n if (options.occurred_at) event.occurred_at = options.occurred_at;\n if (options.visibility) event.visibility = options.visibility;\n if (options.voice) event.voice = options.voice;\n if (options.context_stamp) event.context_stamp = options.context_stamp;\n return this.client.track(event);\n }\n}\n","/**\n * Flushes queued events when a Node process runs out of work.\n *\n * `beforeExit` is the only exit event that allows asynchronous work, and it fires every time\n * the event loop drains, so a flush that finishes simply lets the process exit afterwards.\n * It does not fire on `process.exit()` or on signals: services that stop on SIGTERM should\n * call `shutdown()` in their own handler. The SDK never installs signal handlers, because\n * doing so would replace Node's default behaviour of exiting.\n *\n * Everything here is feature-detected, so edge runtimes without `process` skip it.\n */\n\ninterface Flushable {\n flush(): Promise<unknown>;\n}\n\ninterface NodeLikeProcess {\n on(event: \"beforeExit\", listener: () => void): unknown;\n removeListener(event: \"beforeExit\", listener: () => void): unknown;\n versions?: { node?: string };\n}\n\nconst registered = new Set<WeakRef<Flushable>>();\nlet installedOn: NodeLikeProcess | null = null;\n\nfunction nodeProcess(): NodeLikeProcess | null {\n const candidate = (globalThis as { process?: Partial<NodeLikeProcess> }).process;\n if (!candidate?.versions?.node) return null;\n if (typeof candidate.on !== \"function\" || typeof candidate.removeListener !== \"function\") return null;\n return candidate as NodeLikeProcess;\n}\n\nfunction onBeforeExit(): void {\n for (const ref of registered) {\n const client = ref.deref();\n if (client) {\n // Strict clients reject on a lost batch; unhandled here, that would change the exit code.\n client.flush().catch(() => undefined);\n } else {\n registered.delete(ref);\n }\n }\n}\n\n/**\n * Registers a client for the exit flush and returns the function that unregisters it. Clients\n * are held weakly, so one that is no longer referenced can still be garbage collected.\n */\nexport function registerExitFlush(client: Flushable): () => void {\n const proc = nodeProcess();\n if (!proc || typeof WeakRef === \"undefined\") return () => undefined;\n const ref = new WeakRef(client);\n registered.add(ref);\n if (!installedOn) {\n proc.on(\"beforeExit\", onBeforeExit);\n installedOn = proc;\n }\n return () => {\n registered.delete(ref);\n if (registered.size === 0 && installedOn) {\n installedOn.removeListener(\"beforeExit\", onBeforeExit);\n installedOn = null;\n }\n };\n}\n","import { NiadraValidationError } from \"./errors.js\";\nimport { MAX_MEDIA_BYTES } from \"./types/events.js\";\nimport type { Handle } from \"./types/common.js\";\nimport type { MediaUploadRequest } from \"./types/events.js\";\n\n/** Arguments of `uploadMedia()`. */\nexport interface UploadParams {\n /** The file itself. It is read into memory once, to hash it and send it. */\n data: Uint8Array | ArrayBuffer | Blob;\n /** Such as `audio/wav` or `image/png`. Storage checks it against the signed URL. */\n content_type: string;\n /**\n * Whose file it is, whenever you know. It is then stored under that person, so erasing them\n * erases it, even if no event ever references it.\n */\n subject?: Handle;\n}\n\n/** A file handed to Niadra. Put `media_ref` and `media_sha256` in the event's `content`. */\nexport interface MediaUpload {\n media_ref: string;\n media_sha256: string;\n content_type: string;\n size_bytes: number;\n expires_at: string | null;\n}\n\nexport interface PreparedUpload {\n bytes: Uint8Array<ArrayBuffer>;\n request: MediaUploadRequest;\n}\n\n/** Reads, checks and hashes the file, and builds the body of `POST /v1/media/uploads`. */\nexport async function prepareUpload(params: UploadParams): Promise<PreparedUpload> {\n if (!params.content_type || params.content_type.length > 256) {\n throw new NiadraValidationError(\"content_type must be 1 to 256 characters\");\n }\n const bytes = await readBytes(params.data);\n if (bytes.byteLength === 0 || bytes.byteLength > MAX_MEDIA_BYTES) {\n throw new NiadraValidationError(`media must be 1 byte to ${MAX_MEDIA_BYTES} bytes`);\n }\n const request: MediaUploadRequest = {\n content_type: params.content_type,\n size_bytes: bytes.byteLength,\n sha256: await sha256Hex(bytes),\n };\n if (params.subject) request.subject = params.subject;\n return { bytes, request };\n}\n\n/**\n * The bytes go straight to storage, so the URL must be HTTPS unless the API itself is not:\n * only the local emulator is served over plain HTTP, and anywhere else a downgrade would send\n * the customer's media in the clear.\n */\nexport function checkUploadURL(url: string, baseURL: string): void {\n const protocol = new URL(url).protocol;\n if (protocol === \"https:\" || (protocol === \"http:\" && new URL(baseURL).protocol === \"http:\")) return;\n throw new NiadraValidationError(\"the upload URL is not HTTPS\");\n}\n\nasync function readBytes(data: Uint8Array | ArrayBuffer | Blob): Promise<Uint8Array<ArrayBuffer>> {\n if (data instanceof ArrayBuffer) return new Uint8Array(data);\n if (data instanceof Uint8Array) {\n // A view over a SharedArrayBuffer cannot be a fetch body; only that case pays for a copy.\n return isPlain(data) ? data : new Uint8Array(data);\n }\n return new Uint8Array(await data.arrayBuffer());\n}\n\nfunction isPlain(view: Uint8Array): view is Uint8Array<ArrayBuffer> {\n return view.buffer instanceof ArrayBuffer;\n}\n\nasync function sha256Hex(bytes: Uint8Array<ArrayBuffer>): Promise<string> {\n const subtle = (globalThis as { crypto?: { subtle?: SubtleCrypto } }).crypto?.subtle;\n if (!subtle) throw new NiadraValidationError(\"uploadMedia() needs Web Crypto, which this runtime lacks\");\n const digest = new Uint8Array(await subtle.digest(\"SHA-256\", bytes));\n let hex = \"\";\n for (const byte of digest) hex += byte.toString(16).padStart(2, \"0\");\n return hex;\n}\n","import { NiadraValidationError } from \"./errors.js\";\nimport { toObjectRef } from \"./handles.js\";\nimport type { ObjectRef } from \"./types/common.js\";\n\n/** Paging of `objectTimeline()`. */\nexport interface ObjectTimelineParams {\n /** `next_cursor` from the previous page. */\n cursor?: string;\n /** Between 1 and 100. Defaults to 20. */\n limit?: number;\n}\n\n/**\n * `/v1/objects/{type}/{namespace}/{id}` for an object reference. The segments are system record\n * ids, never personal data, so they may go in the path. A slash cannot: the server's route would\n * split on it, even percent-encoded.\n */\nexport function objectPath(object: ObjectRef | string): string {\n const ref = toObjectRef(object);\n const segments = [ref.type, ref.namespace, ref.id];\n if (segments.some((segment) => !segment || segment.includes(\"/\"))) {\n throw new NiadraValidationError(\"object type, namespace and id must be non-empty and cannot contain a slash\");\n }\n return `/v1/objects/${segments.map(encodeURIComponent).join(\"/\")}`;\n}\n","/** The parts of a source key the SDK needs to find the right endpoint. */\nexport interface ParsedApiKey {\n /** `live` keys reach production spaces, `test` keys reach sandbox spaces. */\n mode: \"live\" | \"test\";\n /** Data region, such as `sa-east-1`. */\n region: string;\n /** The space (project and environment) the key belongs to. */\n space: string;\n keyId: string;\n}\n\nconst PREFIX = \"nia_sk_\";\nconst DNS_LABEL = /^[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$/;\nconst KEY_ID = /^[A-Za-z0-9]+$/;\n\n/**\n * Parses `nia_sk_<live|test>_<region>_<space>_<key_id>_<secret>`.\n *\n * Region and space become DNS labels in the base URL, so they are held to lowercase letters,\n * digits and inner hyphens. The secret is everything after the fifth underscore and is never\n * returned. Returns `null` for anything that does not match, rather than guessing.\n */\nexport function parseApiKey(apiKey: string): ParsedApiKey | null {\n if (!apiKey.startsWith(PREFIX)) return null;\n const parts = apiKey.slice(PREFIX.length).split(\"_\");\n if (parts.length < 5) return null;\n const [mode, region, space, keyId] = parts as [string, string, string, string];\n const secret = parts.slice(4).join(\"_\");\n if (mode !== \"live\" && mode !== \"test\") return null;\n if (!DNS_LABEL.test(region) || !DNS_LABEL.test(space)) return null;\n if (!KEY_ID.test(keyId) || secret.length === 0) return null;\n return { mode, region, space, keyId };\n}\n\n/**\n * The stable address of a space: `https://<space>.<region>.api.niadra.com`. It never names a\n * cell; when a space moves between cells, the old cell answers 421 and the SDK retries.\n */\nexport function baseURLFromKey(key: ParsedApiKey): string {\n return `https://${key.space}.${key.region}.api.niadra.com`;\n}\n","/**\n * Where the SDK reports what it swallowed in fail-open mode. Messages carry status codes,\n * error codes and request ids, never handles, message text or other personal data.\n */\nexport interface Logger {\n debug(message: string, ...details: unknown[]): void;\n warn(message: string, ...details: unknown[]): void;\n error(message: string, ...details: unknown[]): void;\n}\n\nconst noop = (): void => undefined;\n\n/** Warnings and errors go to the console; debug output is off unless you pass your own logger. */\nexport const consoleLogger: Logger = {\n debug: noop,\n warn: (message, ...details) => {\n console.warn(`[niadra] ${message}`, ...details);\n },\n error: (message, ...details) => {\n console.error(`[niadra] ${message}`, ...details);\n },\n};\n\nexport const silentLogger: Logger = { debug: noop, warn: noop, error: noop };\n","import type { Logger } from \"./logger.js\";\n\n/**\n * Per-method time budgets in milliseconds. They are the SDK's own and deliberately short:\n * managed agent platforms allow 7 to 10 seconds per turn and self-hosted frameworks allow no\n * limit at all, so a slow memory call must never become a slow agent.\n */\nexport interface Timeouts {\n /** `context()` for every view except `voice`. */\n context: number;\n /** `context()` with `view: \"voice\"`, where the budget is a fraction of a spoken turn. */\n contextVoice: number;\n /** `search()`, `timeline()` and `open()`. */\n navigation: number;\n /** Navigation calls made through a voice conversation or voice-bound tools. */\n navigationVoice: number;\n /** Each attempt of a batch upload. Writes happen off the hot path, so this one is generous. */\n write: number;\n /** `subjectToken()`, usually called once when a session starts. */\n token: number;\n /** Each attempt of sending media bytes to storage in `uploadMedia()`, off the hot path. */\n upload: number;\n}\n\nexport const DEFAULT_TIMEOUTS: Timeouts = {\n context: 300,\n contextVoice: 150,\n navigation: 600,\n navigationVoice: 300,\n write: 5_000,\n token: 2_000,\n upload: 60_000,\n};\n\n/** How `context()` reuses packs inside a conversation. */\nexport interface CacheOptions {\n /** A pack younger than this is returned without any request. */\n ttlMs: number;\n /**\n * After `ttlMs`, the cached pack is still returned at once for this long while a single\n * background request refreshes it.\n */\n staleWhileRevalidateMs: number;\n /**\n * Oldest pack the SDK will fall back to when a request fails. Older packs are dropped\n * rather than shown to a model as if they were current.\n */\n maxStaleMs: number;\n /** Least recently used packs are evicted past this many conversations. */\n maxEntries: number;\n}\n\nexport const DEFAULT_CACHE: CacheOptions = {\n ttlMs: 10_000,\n staleWhileRevalidateMs: 10 * 60_000,\n maxStaleMs: 30 * 60_000,\n maxEntries: 1_000,\n};\n\n/** How `track()` and the other write methods batch events on their way to `POST /v1/batch`. */\nexport interface QueueOptions {\n /** Send as soon as this many items are waiting. */\n flushAt: number;\n /** Send whatever is waiting at least this often. */\n flushIntervalMs: number;\n /** Items per request. The server accepts up to 500. */\n maxBatchSize: number;\n /** Items held in memory before new ones are dropped. Keeps a long outage from exhausting memory. */\n maxQueueSize: number;\n /** Attempts per batch, including the first. 4xx answers other than 408, 421 and 429 are never retried. */\n maxAttempts: number;\n /** First backoff delay; each retry doubles it, with full jitter, up to `maxRetryDelayMs`. */\n retryDelayMs: number;\n maxRetryDelayMs: number;\n}\n\nexport const DEFAULT_QUEUE: QueueOptions = {\n flushAt: 15,\n flushIntervalMs: 1_000,\n maxBatchSize: 100,\n maxQueueSize: 10_000,\n maxAttempts: 3,\n retryDelayMs: 250,\n maxRetryDelayMs: 5_000,\n};\n\nexport interface ClientOptions {\n /**\n * A source key, `nia_sk_<live|test>_<region>_<space>_<key_id>_<secret>`. Defaults to the\n * `NIADRA_API_KEY` environment variable where one exists. Without a key the client is a\n * no-op: every method resolves with an empty result and nothing is sent.\n */\n apiKey?: string | undefined;\n /**\n * Overrides the address derived from the key, for the local emulator or a private endpoint.\n * Defaults to `NIADRA_BASE_URL`, then to `https://<space>.<region>.api.niadra.com`.\n */\n baseURL?: string | undefined;\n timeouts?: Partial<Timeouts>;\n /** Pass `false` to send every `context()` call to the server. */\n cache?: Partial<CacheOptions> | false;\n queue?: Partial<QueueOptions>;\n /**\n * Throw errors instead of logging them and resolving with an empty result. Meant for tests\n * and development, where a silent failure hides a broken integration.\n */\n strict?: boolean;\n /** Flush queued events when a Node process is about to exit. Defaults to `true`. */\n flushOnExit?: boolean;\n /** A `fetch` implementation. Defaults to the global one. */\n fetch?: typeof fetch;\n logger?: Logger;\n /** Extra headers sent with every request. */\n defaultHeaders?: Record<string, string>;\n}\n","import { NiadraError, NiadraValidationError, toNiadraError } from \"./errors.js\";\nimport type { Logger } from \"./logger.js\";\nimport type { QueueOptions } from \"./options.js\";\nimport type { BatchItem, BatchResponse, HeartbeatItem } from \"./types/events.js\";\n\n/** Called once per item with `null` when the server accepted it, or the reason it did not. */\nexport type Settle = (error: NiadraError | null) => void;\n\ninterface Pending {\n item: BatchItem;\n settle?: Settle | undefined;\n}\n\nexport interface DrainReport {\n sent: number;\n failed: number;\n errors: NiadraError[];\n}\n\nconst HEARTBEAT_WINDOW_MS = 60_000;\n\n/**\n * A bounded in-memory queue in front of `POST /v1/batch`.\n *\n * Items leave in batches when `flushAt` of them are waiting or `flushIntervalMs` has passed,\n * whichever comes first. Only one batch is in flight at a time, so items reach the server in\n * the order they were queued. A batch that still fails after its retries is dropped and logged:\n * holding it would let one bad outage grow the queue without bound.\n */\nexport class EventQueue {\n private items: Pending[] = [];\n private timer: ReturnType<typeof setTimeout> | null = null;\n private tail: Promise<unknown> = Promise.resolve();\n private closed = false;\n private droppedSinceWarning = 0;\n private windowStart: number;\n private sentInWindow = 0;\n\n constructor(\n private readonly send: (items: BatchItem[]) => Promise<BatchResponse>,\n private readonly options: QueueOptions,\n private readonly logger: Logger,\n private readonly now: () => number = Date.now,\n ) {\n this.windowStart = now();\n }\n\n /** Items waiting to be sent, not counting a batch already in flight. */\n get size(): number {\n return this.items.length;\n }\n\n /** Queues one item. Returns `false`, and settles it with an error, when the queue is full or closed. */\n push(item: BatchItem, settle?: Settle): boolean {\n if (this.closed || this.items.length >= this.options.maxQueueSize) {\n this.droppedSinceWarning++;\n if (this.droppedSinceWarning === 1) {\n this.logger.warn(this.closed ? \"client is shut down; dropping events\" : \"event queue is full; dropping events\");\n }\n settle?.(new NiadraError(this.closed ? \"client is shut down\" : \"event queue is full\"));\n return false;\n }\n this.droppedSinceWarning = 0;\n this.items.push({ item, settle });\n if (this.items.length >= this.options.flushAt) {\n this.flushInBackground();\n } else {\n this.schedule();\n }\n return true;\n }\n\n /**\n * Sends everything queued so far and resolves when it is done. Concurrent calls are\n * serialized behind the batch already in flight rather than sending in parallel.\n */\n flush(): Promise<DrainReport> {\n this.cancelTimer();\n const run = this.tail.then(() => this.drain());\n this.tail = run.catch(() => undefined);\n return run;\n }\n\n /**\n * Starts a flush without waiting for it. Item failures are logged and settled inside the\n * drain, so only an unexpected error reaches this catch.\n */\n flushInBackground(): void {\n this.flush().catch((error: unknown) => {\n this.logger.error(`event flush failed: ${toNiadraError(error).message}`);\n });\n }\n\n /** Flushes, then refuses new items. */\n async close(): Promise<DrainReport> {\n const report = await this.flush();\n this.closed = true;\n this.cancelTimer();\n return report;\n }\n\n private async drain(): Promise<DrainReport> {\n const report: DrainReport = { sent: 0, failed: 0, errors: [] };\n while (this.items.length > 0) {\n const batch = this.items.splice(0, this.options.maxBatchSize);\n const heartbeat = this.heartbeat();\n const wire = batch.map((pending) => pending.item);\n if (heartbeat) wire.push(heartbeat);\n await this.sendBatch(batch, wire, report);\n }\n return report;\n }\n\n private async sendBatch(batch: Pending[], wire: BatchItem[], report: DrainReport): Promise<void> {\n let response: BatchResponse;\n try {\n response = await this.send(wire);\n } catch (error) {\n const failure = toNiadraError(error);\n report.failed += batch.length;\n report.errors.push(failure);\n this.logger.warn(`dropped ${batch.length} events after retries: ${failure.message}`);\n for (const pending of batch) pending.settle?.(failure);\n return;\n }\n\n const rejected = new Map<number, NiadraError>();\n for (const itemError of response.errors) {\n const detail = itemError.detail ? `: ${itemError.detail}` : \"\";\n rejected.set(itemError.index, new NiadraValidationError(`${itemError.code}${detail}`));\n }\n if (rejected.size > 0) {\n const codes = [...new Set(response.errors.map((e) => e.code))].join(\", \");\n this.logger.warn(`server rejected ${rejected.size} of ${wire.length} items (${codes})`);\n }\n batch.forEach((pending, index) => {\n const error = rejected.get(index) ?? null;\n if (error) {\n report.failed++;\n report.errors.push(error);\n } else {\n report.sent++;\n this.sentInWindow++;\n }\n pending.settle?.(error);\n });\n }\n\n /**\n * Once a minute, the next batch carries the number of items sent in the previous window.\n * The server uses it to tell a source that went quiet from one whose events are being lost.\n */\n private heartbeat(): HeartbeatItem | null {\n const now = this.now();\n if (now - this.windowStart < HEARTBEAT_WINDOW_MS) return null;\n const item: HeartbeatItem = {\n type: \"heartbeat\",\n window_start: new Date(this.windowStart).toISOString(),\n sent: this.sentInWindow,\n };\n this.windowStart = now;\n this.sentInWindow = 0;\n return item;\n }\n\n private schedule(): void {\n if (this.timer !== null) return;\n this.timer = setTimeout(() => {\n this.timer = null;\n this.flushInBackground();\n }, this.options.flushIntervalMs);\n unref(this.timer);\n }\n\n private cancelTimer(): void {\n if (this.timer === null) return;\n clearTimeout(this.timer);\n this.timer = null;\n }\n}\n\n/** In Node, a pending flush timer must not keep an otherwise finished process alive. */\nfunction unref(timer: unknown): void {\n if (typeof timer === \"object\" && timer !== null && \"unref\" in timer && typeof timer.unref === \"function\") {\n (timer as { unref(): void }).unref();\n }\n}\n","import type { Niadra, WriteResult } from \"./client.js\";\nimport type { ContextOptions, ContextParams, ContextResult } from \"./context.js\";\nimport type { TurnOptions } from \"./conversation.js\";\nimport { uuidv7 } from \"./ids.js\";\nimport { hasTarget } from \"./items.js\";\nimport type { ActionEvent, TrackEvent, VerifyParams } from \"./items.js\";\nimport type { Logger } from \"./logger.js\";\nimport { SessionState } from \"./session.js\";\nimport type { Timings } from \"./session.js\";\nimport type { BoundTools, ToolBinding } from \"./tools.js\";\nimport type { Handle, ObjectRef } from \"./types/common.js\";\nimport type { TargetModel } from \"./types/context.js\";\nimport type { ContextStamp } from \"./types/events.js\";\nimport type { Verification, VerifyMethod, View } from \"./types/vocabulary.js\";\n\nexport interface TaskParams {\n /** Your id for the task. A UUIDv7 is minted when omitted. */\n task_id?: string;\n /** The internal agent or system doing the work, such as `billing-agent`. */\n channel: string;\n /** The person the task is about. Pass this, `object`, or both. */\n subject?: Handle;\n /** The business object the task is about, as an `ObjectRef` or `type:namespace:id`. */\n object?: ObjectRef | string;\n about?: Handle;\n /** A task view such as `task:billing`. Defaults to `brief`. */\n view?: View;\n verification?: Verification;\n target?: TargetModel;\n}\n\nexport type TaskEvent = Omit<TrackEvent, \"channel\" | \"task_id\"> & { channel?: string };\nexport type TaskAction = Omit<ActionEvent, \"channel\" | \"task_id\"> & { channel?: string };\n\nexport interface TaskHooks {\n endTask(id: string): Promise<WriteResult>;\n /** `verify()` for a task, which may have no subject to default the handle to. */\n verifyTask(params: Omit<VerifyParams, \"handle\"> & { handle: Handle | undefined }): Promise<WriteResult>;\n}\n\n/**\n * One unit of work by an internal agent: a collection run, a ticket triage, a refund. The task\n * plays the role a conversation plays for customer-facing agents: the server pins its pack,\n * deltas arrive and are kept the same way, it scopes the context cache, groups the events for\n * billing and closes with `task.ended`. Without `end()`, the server closes the task after 10\n * minutes of inactivity.\n */\nexport class Task {\n readonly id: string;\n private readonly object: ObjectRef | string | null;\n private level: Verification | undefined;\n private readonly state = new SessionState();\n private ending: Promise<WriteResult> | null = null;\n\n constructor(\n private readonly client: Niadra,\n private readonly params: TaskParams,\n private readonly hooks: TaskHooks,\n ) {\n this.id = params.task_id ?? uuidv7();\n // Kept raw so a malformed shorthand fails open in context() and track() instead of throwing here.\n this.object = params.object ?? null;\n this.level = params.verification;\n }\n\n /** When context first went into the prompt, and when the agent first acted. */\n get timings(): Timings {\n return this.state.timings;\n }\n\n /** What the agent's next turn and action carry: the last `markInjected()`, or `null`. */\n get contextStamp(): ContextStamp | null {\n return this.state.contextStamp;\n }\n\n /** The last result `context()` returned for this task. */\n get lastContext(): ContextResult | null {\n return this.state.lastContext;\n }\n\n /** Where `wrap()` reports what it swallowed: the client's logger. */\n get logger(): Logger {\n return this.client.logger;\n }\n\n /**\n * Context for the task, centered on its object when it has one, otherwise on its subject.\n * Resolves with an empty result, never rejects, unless the client is strict.\n */\n async context(options: ContextOptions & { query?: string } = {}): Promise<ContextResult> {\n const { query, ...requestOptions } = options;\n const target = this.object ? { object: this.object } : this.params.subject ? { subject: this.params.subject } : {};\n const params: ContextParams = {\n ...target,\n view: this.params.view ?? \"brief\",\n task_id: this.id,\n ...(this.params.about ? { about: this.params.about } : {}),\n ...(this.level ? { verification: this.level } : {}),\n ...(this.params.target ? { target: this.params.target } : {}),\n };\n if (query) return this.client.context({ ...params, query }, requestOptions);\n if (this.state.wantsDelta) params.delta = true;\n return this.state.absorb(await this.client.context(params, requestOptions));\n }\n\n /** Records that `context` (by default the last one this task returned) went into the prompt. */\n markInjected(context?: ContextResult | null, at: Date = new Date()): void {\n this.state.markInjected(context, at);\n }\n\n /** Captures what the agent answered, stamped with the context its prompt carried. */\n agent(text: string, options: TurnOptions = {}): string | null {\n const stamp = this.state.agentTurn();\n const event: TaskEvent = {\n ...this.bind({}),\n speaker: options.speaker_id ? { role: \"ai_agent\", id: options.speaker_id } : \"ai_agent\",\n text,\n };\n const context_stamp = options.context_stamp ?? stamp;\n if (context_stamp) event.context_stamp = context_stamp;\n if (options.idempotency_key) event.idempotency_key = options.idempotency_key;\n if (options.occurred_at) event.occurred_at = options.occurred_at;\n if (options.visibility) event.visibility = options.visibility;\n return this.track(event);\n }\n\n /**\n * Records that the person the task is about proved who they are, and reads at the new level\n * from then on. `handle` defaults to the task's subject.\n */\n async verify(params: { method: VerifyMethod; level: Verification; handle?: Handle }): Promise<WriteResult> {\n const handle = params.handle ?? this.params.subject;\n const result = await this.hooks.verifyTask({ method: params.method, level: params.level, handle, task_id: this.id });\n if (result.ok) {\n this.level = params.level;\n this.state.reset();\n }\n return result;\n }\n\n /** Records an event in this task, attaching the task's subject and object unless you pass your own. */\n track(event: TaskEvent): string | null {\n return this.client.track({ ...this.bind(event), ...event, channel: event.channel ?? this.params.channel });\n }\n\n /** Records an action taken in a system of record, such as `credit` on an invoice, stamped like its turns. */\n action(event: TaskAction): string | null {\n const stamp = this.state.actionStamp(event.speaker);\n return this.client.action({\n ...this.bind(event),\n ...(stamp ? { context_stamp: stamp } : {}),\n ...event,\n channel: event.channel ?? this.params.channel,\n });\n }\n\n /**\n * The navigation kit bound to the task's subject, or `null` for a task about an object only.\n * The verification level is read at each call, so tools created before a `verify()` pick up\n * the new level.\n */\n tools(): BoundTools | null {\n const subject = this.params.subject;\n if (!subject) return null;\n const read = (): Verification => this.level ?? \"V0\";\n const binding: ToolBinding = {\n task_id: this.id,\n voice: this.params.view === \"voice\",\n get verification() {\n return read();\n },\n };\n if (this.params.about) binding.about = this.params.about;\n return this.client.tools(subject, binding);\n }\n\n /** Emits `task.ended` and drops the task's cached packs. Safe to call twice. */\n end(): Promise<WriteResult> {\n this.ending ??= this.hooks.endTask(this.id);\n return this.ending;\n }\n\n private bind(event: { handles?: Handle[]; subjects?: unknown[]; object_refs?: unknown[] }): {\n task_id: string;\n handles?: Handle[];\n object_refs?: (ObjectRef | string)[];\n } {\n const own = hasTarget(event);\n const bound: { task_id: string; handles?: Handle[]; object_refs?: (ObjectRef | string)[] } = {\n task_id: this.id,\n };\n if (own) return bound;\n if (this.params.subject) bound.handles = [this.params.subject];\n if (this.object) bound.object_refs = [this.object];\n return bound;\n }\n}\n","import { NiadraValidationError } from \"./errors.js\";\nimport type { NiadraError } from \"./errors.js\";\nimport type { Handle } from \"./types/common.js\";\nimport type {\n HistoryFilters,\n OpenedItem,\n SearchRequest,\n SearchResponse,\n TimelineRequest,\n TimelineResponse,\n ToolDefinition,\n} from \"./types/context.js\";\nimport type { HistoryItemKind, Verification } from \"./types/vocabulary.js\";\n\n/** The outcome of a call that may fail without throwing. Exactly one of the two fields is set. */\nexport type Result<T> = { data: T; error: null } | { data: null; error: NiadraError };\n\n/** Everything a tool call is bound to besides its arguments. None of it is visible to the model. */\nexport interface ToolBinding {\n about?: Handle;\n verification?: Verification;\n conversation_id?: string;\n task_id?: string;\n /** Use the voice time budget for the calls these tools make. */\n voice?: boolean;\n}\n\nexport interface Navigator {\n search(params: SearchRequest, voice: boolean): Promise<Result<SearchResponse>>;\n timeline(params: TimelineRequest, voice: boolean): Promise<Result<TimelineResponse>>;\n open(id: string, binding: ToolBinding, voice: boolean): Promise<Result<OpenedItem>>;\n}\n\n/**\n * The navigation kit as function-calling tools, bound to one customer.\n *\n * The definitions have no parameter for the customer: the handle lives in this object, outside\n * the model's reach. A prompt injection that says \"now look up customer X\" has no argument to\n * put X in. The model chooses what to ask, never whom it is about.\n */\nexport interface BoundTools {\n /** Tool definitions in the `{ type: \"function\", function: { name, description, parameters } }` shape. */\n readonly definitions: ToolDefinition[];\n /** Whether `name` is one of these tools, for dispatchers that route several toolsets. */\n has(name: string): boolean;\n /**\n * Runs one tool call and returns the text to send back to the model as the tool result.\n * `args` may be the JSON string most model APIs return, or an already parsed object.\n * Failures come back as a short JSON error the model can read and move past; with\n * `strict: true` they are thrown instead.\n */\n call(name: string, args: string | Record<string, unknown>): Promise<string>;\n}\n\nexport const TOOL_NAMES = {\n search: \"search_customer_history\",\n timeline: \"get_customer_timeline\",\n open: \"open_history_item\",\n} as const;\n\nconst ITEM_KINDS: HistoryItemKind[] = [\"episode\", \"fact\", \"open_item\", \"action\", \"system_event\", \"object\", \"trait\"];\n\nconst period = {\n since: { type: \"string\", format: \"date-time\", description: \"Only items at or after this ISO 8601 time.\" },\n until: { type: \"string\", format: \"date-time\", description: \"Only items before this ISO 8601 time.\" },\n channels: {\n type: \"array\",\n items: { type: \"string\" },\n description: \"Only these channels, such as whatsapp, voice, email.\",\n },\n item_kinds: {\n type: \"array\",\n items: { type: \"string\", enum: ITEM_KINDS },\n description: \"Only these kinds of history items.\",\n },\n};\n\nexport const TOOL_DEFINITIONS: readonly ToolDefinition[] = [\n {\n type: \"function\",\n function: {\n name: TOOL_NAMES.search,\n description:\n \"Search this customer's past conversations, actions and system events by meaning and keywords. \" +\n \"Use it when the customer refers to something that happened before and the details are not in the \" +\n \"customer context you already have. Do not use it for facts already listed there. The result also \" +\n \"says how often the same kind of issue came back. To read one result in full, call open_history_item.\",\n parameters: {\n type: \"object\",\n properties: {\n query: { type: \"string\", description: \"What to look for, in the customer's own terms.\" },\n ...period,\n categories: { type: \"array\", items: { type: \"string\" }, description: \"Only these topics.\" },\n outcome: { type: \"string\", description: \"Only items with this outcome, such as resolved.\" },\n },\n required: [\"query\"],\n additionalProperties: false,\n },\n },\n },\n {\n type: \"function\",\n function: {\n name: TOOL_NAMES.timeline,\n description:\n \"List this customer's history in chronological order, one line per item. Use it \" +\n \"when you need the sequence of events, for example what happened since a given date. Prefer \" +\n \"search_customer_history when you are looking for something specific.\",\n parameters: {\n type: \"object\",\n properties: {\n ...period,\n limit: { type: \"integer\", minimum: 1, maximum: 100, description: \"How many items. Defaults to 20.\" },\n cursor: { type: \"string\", description: \"The next_cursor of a previous page.\" },\n },\n additionalProperties: false,\n },\n },\n },\n {\n type: \"function\",\n function: {\n name: TOOL_NAMES.open,\n description:\n \"Open one history item returned by search_customer_history or get_customer_timeline: its summary, \" +\n \"what was requested, commitments made by either side, the outcome and the resolution. Only use ids \" +\n \"returned by those tools.\",\n parameters: {\n type: \"object\",\n properties: { id: { type: \"string\", description: \"The item id.\" } },\n required: [\"id\"],\n additionalProperties: false,\n },\n },\n },\n];\n\nfunction parseArgs(args: string | Record<string, unknown>): Record<string, unknown> {\n if (typeof args !== \"string\") return args;\n if (args.trim() === \"\") return {};\n let parsed: unknown;\n try {\n parsed = JSON.parse(args);\n } catch {\n throw new NiadraValidationError(\"tool arguments are not valid JSON\");\n }\n if (typeof parsed !== \"object\" || parsed === null || Array.isArray(parsed)) {\n throw new NiadraValidationError(\"tool arguments must be a JSON object\");\n }\n return parsed as Record<string, unknown>;\n}\n\nfunction str(args: Record<string, unknown>, name: string): string | undefined {\n const value = args[name];\n return typeof value === \"string\" && value.length > 0 ? value : undefined;\n}\n\nfunction strings(args: Record<string, unknown>, name: string): string[] | undefined {\n const value = args[name];\n if (!Array.isArray(value)) return undefined;\n const list = value.filter((entry): entry is string => typeof entry === \"string\");\n return list.length > 0 ? list : undefined;\n}\n\nfunction filtersFrom(args: Record<string, unknown>): HistoryFilters {\n const filters: HistoryFilters = {};\n const since = str(args, \"since\");\n const until = str(args, \"until\");\n const channels = strings(args, \"channels\");\n const categories = strings(args, \"categories\");\n const kinds = strings(args, \"item_kinds\")?.filter((kind): kind is HistoryItemKind =>\n (ITEM_KINDS as string[]).includes(kind),\n );\n const outcome = str(args, \"outcome\");\n if (since) filters.since = since;\n if (until) filters.until = until;\n if (channels) filters.channels = channels;\n if (categories) filters.categories = categories;\n if (kinds?.length) filters.item_kinds = kinds;\n if (outcome) filters.outcome = outcome;\n return filters;\n}\n\n/** Builds the bound toolset. `strict` decides whether failures are thrown or described to the model. */\nexport function bindTools(subject: Handle, binding: ToolBinding, navigator: Navigator, strict: boolean): BoundTools {\n const voice = binding.voice ?? false;\n const names = new Set<string>(Object.values(TOOL_NAMES));\n\n async function run(name: string, args: Record<string, unknown>): Promise<Result<unknown>> {\n switch (name) {\n case TOOL_NAMES.search: {\n const query = str(args, \"query\");\n if (!query) throw new NiadraValidationError(\"search_customer_history needs a query\");\n const request: SearchRequest = { subject, query, filters: filtersFrom(args) };\n applyBinding(request, binding);\n if (binding.task_id) request.task_id = binding.task_id;\n const result = await navigator.search(request, voice);\n return result.error ? result : { data: compactSearch(result.data), error: null };\n }\n case TOOL_NAMES.timeline: {\n const request: TimelineRequest = { subject, filters: filtersFrom(args) };\n applyBinding(request, binding);\n const cursor = str(args, \"cursor\");\n if (cursor) request.cursor = cursor;\n const limit = args.limit;\n if (typeof limit === \"number\" && Number.isInteger(limit)) request.limit = Math.min(100, Math.max(1, limit));\n return navigator.timeline(request, voice);\n }\n case TOOL_NAMES.open: {\n const id = str(args, \"id\");\n if (!id) throw new NiadraValidationError(\"open_history_item needs an id\");\n return navigator.open(id, binding, voice);\n }\n default:\n throw new NiadraValidationError(`unknown tool: ${name}`);\n }\n }\n\n return {\n definitions: TOOL_DEFINITIONS.map((definition) => cloneDefinition(definition)),\n has: (name) => names.has(name),\n async call(name, rawArgs) {\n let result: Result<unknown>;\n try {\n result = await run(name, parseArgs(rawArgs));\n } catch (error) {\n if (strict) throw error;\n return JSON.stringify({ error: \"invalid_call\", detail: (error as Error).message });\n }\n if (result.error) {\n if (strict) throw result.error;\n return JSON.stringify({ error: \"unavailable\", detail: \"customer history is unavailable right now\" });\n }\n return JSON.stringify(result.data);\n },\n };\n}\n\nfunction applyBinding(request: SearchRequest | TimelineRequest, binding: ToolBinding): void {\n if (binding.about) request.about = binding.about;\n if (binding.verification) request.verification = binding.verification;\n if (binding.conversation_id) request.conversation_id = binding.conversation_id;\n}\n\n/** Token accounting is for the caller, not the model; everything else the model can use. */\nfunction compactSearch(response: SearchResponse): Omit<SearchResponse, \"tokens_used\"> {\n const { tokens_used: _, ...rest } = response;\n return rest;\n}\n\nfunction cloneDefinition(definition: ToolDefinition): ToolDefinition {\n return JSON.parse(JSON.stringify(definition)) as ToolDefinition;\n}\n","export const VERSION = \"0.1.0\";\n","import {\n NiadraAPIError,\n NiadraAbortError,\n NiadraConnectionError,\n NiadraError,\n NiadraTimeoutError,\n apiErrorFor,\n} from \"./errors.js\";\nimport type { Problem } from \"./types/common.js\";\nimport { VERSION } from \"./version.js\";\n\n/**\n * When a request may be sent again.\n *\n * Reads run against one deadline for the whole call and are only retried on 421, which means\n * the space just moved to another cell: the answer was not \"no\", it was \"not here\". Writes\n * give each attempt its own timeout and retry anything transient, because every batch item\n * carries an idempotency key and a repeat is harmless.\n */\nexport type RetryPolicy =\n | { kind: \"read\"; maxAttempts: number }\n | { kind: \"write\"; maxAttempts: number; baseDelayMs: number; maxDelayMs: number };\n\nexport interface RequestSpec {\n method: \"GET\" | \"POST\";\n path: string;\n query?: Record<string, string | undefined>;\n body?: unknown;\n timeoutMs: number;\n retry: RetryPolicy;\n signal?: AbortSignal | undefined;\n headers?: Record<string, string> | undefined;\n}\n\n/** Bytes for a pre-signed storage URL. The URL is the credential; nothing of the API's goes along. */\nexport interface UploadSpec {\n url: string;\n body: Uint8Array<ArrayBuffer>;\n /** Exactly the headers the signature covers, as the reservation named them. */\n headers: Record<string, string>;\n timeoutMs: number;\n retry: Extract<RetryPolicy, { kind: \"write\" }>;\n signal?: AbortSignal | undefined;\n}\n\nexport interface TransportResponse<T> {\n status: number;\n data: T;\n requestId: string | null;\n}\n\nexport interface TransportConfig {\n baseURL: string;\n apiKey: string;\n fetch: typeof fetch;\n defaultHeaders: Record<string, string>;\n}\n\nconst RETRYABLE_WRITE_STATUS = new Set([408, 421, 429, 500, 502, 503, 504]);\nconst READ_421_ATTEMPTS = 3;\n\nexport const READ_POLICY: RetryPolicy = { kind: \"read\", maxAttempts: READ_421_ATTEMPTS };\n\nexport class Transport {\n private readonly baseURL: string;\n\n constructor(private readonly config: TransportConfig) {\n this.baseURL = config.baseURL.replace(/\\/+$/, \"\");\n }\n\n async request<T>(spec: RequestSpec): Promise<TransportResponse<T>> {\n return spec.retry.kind === \"read\" ? this.read<T>(spec, spec.retry) : this.write<T>(spec, spec.retry);\n }\n\n private async read<T>(spec: RequestSpec, policy: { maxAttempts: number }): Promise<TransportResponse<T>> {\n const deadline = new Deadline(spec.timeoutMs, spec.signal);\n try {\n for (let attempt = 1; ; attempt++) {\n try {\n return await this.send<T>(spec, deadline);\n } catch (error) {\n // The old cell closes the connection with its 421, so the retry reaches the new one.\n if (isStatus(error, 421) && attempt < policy.maxAttempts && !deadline.expired) continue;\n throw error;\n }\n }\n } finally {\n deadline.clear();\n }\n }\n\n private async write<T>(\n spec: RequestSpec,\n policy: { maxAttempts: number; baseDelayMs: number; maxDelayMs: number },\n ): Promise<TransportResponse<T>> {\n return this.retrying(spec.timeoutMs, policy, spec.signal, (deadline) => this.send<T>(spec, deadline));\n }\n\n /**\n * Sends media bytes to the signed URL `POST /v1/media/uploads` returned, with the write retry\n * rules. Only the headers the reservation named go along: the signature covers them (content\n * type, and the digest the store checks the body against), and the key must never reach a\n * host other than the API.\n */\n async upload(spec: UploadSpec): Promise<void> {\n await this.retrying(spec.timeoutMs, spec.retry, spec.signal, (deadline) =>\n this.exchange<unknown>(\n spec.url,\n { method: \"PUT\", headers: spec.headers, body: spec.body, signal: deadline.signal },\n deadline,\n ),\n );\n }\n\n private async retrying<T>(\n timeoutMs: number,\n policy: { maxAttempts: number; baseDelayMs: number; maxDelayMs: number },\n signal: AbortSignal | undefined,\n attempt: (deadline: Deadline) => Promise<T>,\n ): Promise<T> {\n for (let count = 1; ; count++) {\n const deadline = new Deadline(timeoutMs, signal);\n try {\n return await attempt(deadline);\n } catch (error) {\n if (count >= policy.maxAttempts || !isTransient(error)) throw error;\n const delay = retryDelay(error, count, policy.baseDelayMs, policy.maxDelayMs);\n await sleep(delay, signal);\n } finally {\n deadline.clear();\n }\n }\n }\n\n private async send<T>(spec: RequestSpec, deadline: Deadline): Promise<TransportResponse<T>> {\n const headers: Record<string, string> = {\n accept: \"application/json, application/problem+json\",\n authorization: `Bearer ${this.config.apiKey}`,\n \"x-niadra-sdk\": `js/${VERSION}`,\n ...this.config.defaultHeaders,\n ...spec.headers,\n };\n const init: RequestInit = { method: spec.method, headers, signal: deadline.signal };\n if (spec.body !== undefined) {\n headers[\"content-type\"] = \"application/json\";\n init.body = JSON.stringify(spec.body);\n }\n return this.exchange<T>(this.url(spec.path, spec.query), init, deadline);\n }\n\n private async exchange<T>(url: string, init: RequestInit, deadline: Deadline): Promise<TransportResponse<T>> {\n let response: Response;\n try {\n response = await this.config.fetch(url, init);\n } catch (error) {\n throw deadline.explain(error);\n }\n\n const requestId = response.headers.get(\"x-request-id\");\n let payload: unknown;\n try {\n payload = await readBody(response);\n } catch (error) {\n throw deadline.explain(error);\n }\n\n if (!response.ok) {\n throw apiErrorFor(\n response.status,\n asProblem(payload),\n requestId,\n parseRetryAfter(response.headers.get(\"retry-after\")),\n );\n }\n return { status: response.status, data: payload as T, requestId };\n }\n\n private url(path: string, query?: Record<string, string | undefined>): string {\n const url = `${this.baseURL}${path}`;\n if (!query) return url;\n const params = new URLSearchParams();\n for (const [name, value] of Object.entries(query)) {\n if (value !== undefined) params.set(name, value);\n }\n const encoded = params.toString();\n return encoded ? `${url}?${encoded}` : url;\n }\n}\n\n/**\n * One time budget, optionally tied to the caller's own signal. `AbortSignal.any` would do\n * this, but it is missing from Node 18 and several edge runtimes.\n */\nclass Deadline {\n readonly signal: AbortSignal;\n private readonly controller = new AbortController();\n private readonly timer: ReturnType<typeof setTimeout>;\n private readonly detach: () => void;\n private timedOut = false;\n\n constructor(\n private readonly timeoutMs: number,\n private readonly outer?: AbortSignal,\n ) {\n this.signal = this.controller.signal;\n this.timer = setTimeout(() => {\n this.timedOut = true;\n this.controller.abort();\n }, timeoutMs);\n const onAbort = (): void => {\n this.controller.abort();\n };\n if (outer?.aborted) this.controller.abort();\n outer?.addEventListener(\"abort\", onAbort, { once: true });\n this.detach = () => {\n outer?.removeEventListener(\"abort\", onAbort);\n };\n }\n\n get expired(): boolean {\n return this.signal.aborted;\n }\n\n clear(): void {\n clearTimeout(this.timer);\n this.detach();\n }\n\n explain(error: unknown): NiadraError {\n if (this.timedOut) return new NiadraTimeoutError(this.timeoutMs);\n if (this.outer?.aborted) return new NiadraAbortError(\"request aborted by the caller\", { cause: error });\n if (error instanceof NiadraError) return error;\n const message = error instanceof Error ? error.message : String(error);\n return new NiadraConnectionError(`connection failed: ${message}`, { cause: error });\n }\n}\n\nasync function readBody(response: Response): Promise<unknown> {\n const text = await response.text();\n if (text.length === 0) return null;\n const type = response.headers.get(\"content-type\") ?? \"\";\n if (!type.includes(\"json\")) return text;\n try {\n return JSON.parse(text) as unknown;\n } catch {\n return text;\n }\n}\n\nfunction asProblem(payload: unknown): Problem | null {\n if (typeof payload !== \"object\" || payload === null) return null;\n const candidate = payload as Partial<Problem>;\n if (typeof candidate.code !== \"string\" || typeof candidate.status !== \"number\") return null;\n return candidate as Problem;\n}\n\nfunction isStatus(error: unknown, status: number): boolean {\n return error instanceof NiadraAPIError && error.status === status;\n}\n\nfunction isTransient(error: unknown): boolean {\n if (error instanceof NiadraTimeoutError || error instanceof NiadraConnectionError) return true;\n return error instanceof NiadraAPIError && RETRYABLE_WRITE_STATUS.has(error.status);\n}\n\nfunction retryDelay(error: unknown, attempt: number, baseMs: number, maxMs: number): number {\n if (isStatus(error, 421)) return 0;\n if (error instanceof NiadraAPIError && error.retryAfterMs !== null) return Math.min(error.retryAfterMs, maxMs);\n const ceiling = Math.min(maxMs, baseMs * 2 ** (attempt - 1));\n return Math.round(ceiling / 2 + (Math.random() * ceiling) / 2);\n}\n\n/** `Retry-After` is either delay seconds or an HTTP date. */\nexport function parseRetryAfter(header: string | null): number | null {\n if (!header) return null;\n const seconds = Number(header);\n if (Number.isFinite(seconds)) return Math.max(0, seconds * 1000);\n const date = Date.parse(header);\n return Number.isNaN(date) ? null : Math.max(0, date - Date.now());\n}\n\nfunction sleep(ms: number, signal?: AbortSignal): Promise<void> {\n if (ms <= 0) return Promise.resolve();\n return new Promise((resolve, reject) => {\n const timer = setTimeout(() => {\n signal?.removeEventListener(\"abort\", onAbort);\n resolve();\n }, ms);\n const onAbort = (): void => {\n clearTimeout(timer);\n reject(new NiadraAbortError(\"request aborted by the caller\"));\n };\n signal?.addEventListener(\"abort\", onAbort, { once: true });\n });\n}\n","import { ContextCache } from \"./cache.js\";\nimport type { Revalidated } from \"./cache.js\";\nimport {\n buildContextRequest,\n cacheKey,\n cacheScope,\n emptyResult,\n mergeNotModified,\n resultFrom,\n} from \"./context.js\";\nimport type { ContextOptions, ContextParams, ContextResult, RequestOptions } from \"./context.js\";\nimport { Conversation } from \"./conversation.js\";\nimport type { ConversationParams } from \"./conversation.js\";\nimport {\n NiadraAPIError,\n NiadraAbortError,\n NiadraAuthenticationError,\n NiadraConfigError,\n NiadraError,\n NiadraPermissionError,\n NiadraValidationError,\n toNiadraError,\n} from \"./errors.js\";\nimport { registerExitFlush } from \"./exit.js\";\nimport {\n buildAction,\n buildConversationEnded,\n buildEvent,\n buildFeedback,\n buildHandoff,\n buildIdentify,\n buildTaskEnded,\n buildVerify,\n} from \"./items.js\";\nimport { checkUploadURL, prepareUpload } from \"./media.js\";\nimport type { MediaUpload, UploadParams } from \"./media.js\";\nimport { objectPath } from \"./objects.js\";\nimport type { ObjectTimelineParams } from \"./objects.js\";\nimport type {\n ActionEvent,\n FeedbackParams,\n HandoffParams,\n IdentifyParams,\n TrackEvent,\n VerifyParams,\n} from \"./items.js\";\nimport { baseURLFromKey, parseApiKey } from \"./key.js\";\nimport { consoleLogger } from \"./logger.js\";\nimport type { Logger } from \"./logger.js\";\nimport { DEFAULT_CACHE, DEFAULT_QUEUE, DEFAULT_TIMEOUTS } from \"./options.js\";\nimport type { ClientOptions, Timeouts } from \"./options.js\";\nimport { EventQueue } from \"./queue.js\";\nimport { Task } from \"./task.js\";\nimport type { TaskParams } from \"./task.js\";\nimport { bindTools } from \"./tools.js\";\nimport type { BoundTools, Navigator, Result, ToolBinding } from \"./tools.js\";\nimport { READ_POLICY, Transport } from \"./transport.js\";\nimport type { RequestSpec, RetryPolicy } from \"./transport.js\";\nimport type { Handle, ObjectRef } from \"./types/common.js\";\nimport type {\n ContextRequest,\n ContextResponse,\n ObjectState,\n ObjectTimeline,\n OpenedItem,\n SearchRequest,\n SearchResponse,\n TimelineRequest,\n TimelineResponse,\n} from \"./types/context.js\";\nimport type { BatchItem, BatchResponse, MediaUploadResponse } from \"./types/events.js\";\nimport type { SubjectToken, SubjectTokenRequest } from \"./types/tokens.js\";\nimport type { Verification } from \"./types/vocabulary.js\";\n\n/** What `identify()`, `verify()`, `handoff()` and the `end()` helpers resolve to. */\nexport type WriteResult =\n | { ok: true; idempotency_key: string; error: null }\n | { ok: false; idempotency_key: string | null; error: NiadraError };\n\n/** Scope of `open()`: the same verification and conversation the rest of the session uses. */\nexport interface OpenParams {\n verification?: Verification;\n conversation_id?: string;\n task_id?: string;\n}\n\ninterface Core {\n transport: Transport;\n queue: EventQueue;\n cache: ContextCache | null;\n baseURL: string;\n /** How requests sent at once, outside the queue, are retried: like a batch. */\n writes: WritePolicy;\n}\n\ntype WritePolicy = Extract<RetryPolicy, { kind: \"write\" }>;\n\nfunction readEnv(name: string): string | undefined {\n const env = (globalThis as { process?: { env?: Record<string, string | undefined> } }).process?.env;\n const value = env?.[name];\n return value === \"\" ? undefined : value;\n}\n\nfunction describe(error: NiadraError): string {\n if (error instanceof NiadraAPIError) {\n return error.requestId ? `${error.message} (request ${error.requestId})` : error.message;\n }\n return `${error.name}: ${error.message}`;\n}\n\n/**\n * The Niadra client.\n *\n * Reads (`context`, `search`, `timeline`, `open`) run on the agent's hot path with short time\n * budgets of their own. Writes (`track` and friends) go through an in-memory queue and never\n * block the caller. By default every method is fail-open: an outage, a timeout or a bad\n * argument is logged and the method resolves with an empty result, so the agent keeps\n * working without memory rather than not working at all. Pass `strict: true` to throw instead.\n *\n * Create one client per process and share it; it holds the queue, the cache and the\n * connection pool.\n *\n * @example\n * const niadra = new Niadra({ apiKey: process.env.NIADRA_API_KEY });\n * const ctx = await niadra.context({ subject: handles.phone(\"+5511987654321\"), conversation_id: \"wa-8812\" });\n */\nexport class Niadra {\n /** `false` when the client was built without a usable key and sends nothing. */\n readonly enabled: boolean;\n private readonly core: Core | null;\n private readonly timeouts: Timeouts;\n private readonly strict: boolean;\n /** Where the client reports what it swallows in fail-open mode. */\n readonly logger: Logger;\n private readonly disabledReason: NiadraConfigError | null;\n private unregisterExit: () => void = () => undefined;\n\n constructor(options: ClientOptions = {}) {\n this.strict = options.strict ?? false;\n this.logger = options.logger ?? consoleLogger;\n this.timeouts = { ...DEFAULT_TIMEOUTS, ...options.timeouts };\n\n const setup = this.setup(options);\n if (setup instanceof NiadraConfigError) {\n if (this.strict) throw setup;\n this.logger.warn(`${setup.message}; the client is disabled and will send nothing`);\n this.core = null;\n this.enabled = false;\n this.disabledReason = setup;\n return;\n }\n\n this.core = setup;\n this.enabled = true;\n this.disabledReason = null;\n if (options.flushOnExit ?? true) this.unregisterExit = registerExitFlush(this);\n }\n\n private setup(options: ClientOptions): Core | NiadraConfigError {\n const apiKey = options.apiKey ?? readEnv(\"NIADRA_API_KEY\");\n if (!apiKey) return new NiadraConfigError(\"no API key: pass `apiKey` or set NIADRA_API_KEY\");\n\n let baseURL = options.baseURL ?? readEnv(\"NIADRA_BASE_URL\");\n if (!baseURL) {\n const parsed = parseApiKey(apiKey);\n if (!parsed) {\n return new NiadraConfigError(\n \"the API key does not look like nia_sk_<live|test>_<region>_<space>_<key_id>_<secret>; pass `baseURL` to use it anyway\",\n );\n }\n baseURL = baseURLFromKey(parsed);\n }\n\n const fetchImpl = options.fetch ?? (typeof fetch === \"function\" ? fetch.bind(globalThis) : undefined);\n if (!fetchImpl) return new NiadraConfigError(\"no fetch implementation: pass `fetch` on this runtime\");\n\n const transport = new Transport({\n baseURL,\n apiKey,\n fetch: fetchImpl,\n defaultHeaders: options.defaultHeaders ?? {},\n });\n const queueOptions = { ...DEFAULT_QUEUE, ...options.queue };\n // One slot of the server's 500-item limit stays free for the heartbeat.\n queueOptions.maxBatchSize = Math.min(queueOptions.maxBatchSize, 499);\n const queue = new EventQueue(\n (items) => this.sendBatch(transport, items, queueOptions.maxAttempts, queueOptions),\n queueOptions,\n this.logger,\n );\n const cache = options.cache === false ? null : new ContextCache({ ...DEFAULT_CACHE, ...options.cache });\n const writes: WritePolicy = {\n kind: \"write\",\n maxAttempts: queueOptions.maxAttempts,\n baseDelayMs: queueOptions.retryDelayMs,\n maxDelayMs: queueOptions.maxRetryDelayMs,\n };\n return { transport, queue, cache, baseURL, writes };\n }\n\n /**\n * The customer's context pack, to place in the system prompt before calling the model.\n *\n * Inside a conversation (`conversation_id` or `task_id`), packs are cached: a recent one is\n * returned without a request, an older one is returned at once while a single background\n * request refreshes it, and when a request fails the last good pack is returned instead.\n * A 401 or 403 is not an outage: it drops the cached packs, so revoking a key also stops\n * what the process had already cached from reaching the model.\n *\n * A plain read and a `delta` read of one conversation share the cached pack. The server\n * sends each delta once, and so does the cache, even one a background refresh brought in;\n * `conversation()` and `task()` keep them across turns.\n *\n * Never rejects unless `strict` is set. On failure `text` is empty and `error` is set.\n */\n async context(params: ContextParams, options: ContextOptions = {}): Promise<ContextResult> {\n if (!this.core) return emptyResult(this.disabledReason);\n let request: ContextRequest;\n try {\n request = buildContextRequest(params);\n } catch (error) {\n return this.contextFailure(toNiadraError(error), null);\n }\n\n const timeout = options.timeout ?? (request.view === \"voice\" ? this.timeouts.contextVoice : this.timeouts.context);\n const cache = options.cache === false ? null : this.core.cache;\n const scope = cacheScope(request);\n\n if (!cache || !scope) {\n try {\n const response = await this.fetchContext(this.core, request, timeout, options.signal, options.headers);\n return resultFrom(response, \"network\");\n } catch (error) {\n const failure = toNiadraError(error);\n this.observeAuth(failure, null);\n return this.contextFailure(failure, null);\n }\n }\n\n const key = cacheKey(request);\n const hit = cache.lookup(key);\n if (hit?.freshness === \"fresh\") return resultFrom(delivered(hit.response, cache.take(key)), \"cache\");\n if (hit?.freshness === \"stale\") {\n this.revalidate(this.core, cache, key, scope, request, timeout, options.headers).catch((error: unknown) => {\n this.logger.debug(`background context refresh failed: ${describe(toNiadraError(error))}`);\n });\n return resultFrom(delivered(hit.response, cache.take(key)), \"stale\");\n }\n\n try {\n const pending = this.revalidate(this.core, cache, key, scope, request, timeout, options.headers);\n const { response, source } = await abortable(pending, options.signal);\n return resultFrom(delivered(response, cache.take(key)), source);\n } catch (error) {\n const failure = toNiadraError(error);\n const fallback = cache.lookup(key);\n return this.contextFailure(failure, fallback ? delivered(fallback.response, cache.take(key)) : null);\n }\n }\n\n /**\n * Searches the customer's history by keywords and meaning, with filters by period, channel,\n * topic and kind. The answer includes how often the same kind of issue came back.\n */\n async search(params: SearchRequest, options: RequestOptions = {}): Promise<Result<SearchResponse>> {\n return this.navigate(() => {\n if (!params.query || params.query.length > 2000) {\n throw new NiadraValidationError(\"query must be 1 to 2000 characters\");\n }\n return this.readSpec(\"POST\", \"/v1/history/search\", params, this.timeouts.navigation, options);\n });\n }\n\n /** The customer's history in chronological order, one line per item, paginated by cursor. */\n async timeline(params: TimelineRequest, options: RequestOptions = {}): Promise<Result<TimelineResponse>> {\n return this.navigate(() =>\n this.readSpec(\"POST\", \"/v1/history/timeline\", params, this.timeouts.navigation, options),\n );\n }\n\n /**\n * Opens one history item from `search()` or `timeline()`: summary, request, commitments,\n * outcome and resolution. The literal transcript excerpt only comes back to keys with an\n * elevated scope.\n */\n async open(id: string, params: OpenParams = {}, options: RequestOptions = {}): Promise<Result<OpenedItem>> {\n return this.navigate(() => {\n if (!id) throw new NiadraValidationError(\"open() needs an item id\");\n const path = `/v1/history/items/${encodeURIComponent(id)}`;\n const spec = this.readSpec(\"GET\", path, undefined, this.timeouts.navigation, options);\n spec.query = {\n verification: params.verification,\n conversation_id: params.conversation_id,\n task_id: params.task_id,\n };\n return spec;\n });\n }\n\n /**\n * The derived state of a business object: what its systems of record reported last, `as_of`\n * when, and its open items, under this source's purpose.\n *\n * @example\n * const { data: invoice } = await niadra.objectState(\"invoice:erp:0823\");\n */\n async objectState(object: ObjectRef | string, options: RequestOptions = {}): Promise<Result<ObjectState>> {\n return this.navigate(() => this.readSpec(\"GET\", objectPath(object), undefined, this.timeouts.navigation, options));\n }\n\n /**\n * System events and agent actions about one object, newest first, one line each and never\n * conversation content. Pass `next_cursor` back as `cursor` to go on.\n */\n async objectTimeline(\n object: ObjectRef | string,\n params: ObjectTimelineParams = {},\n options: RequestOptions = {},\n ): Promise<Result<ObjectTimeline>> {\n return this.navigate(() => {\n const limit = params.limit ?? 20;\n if (!Number.isInteger(limit) || limit < 1 || limit > 100) {\n throw new NiadraValidationError(\"limit must be between 1 and 100\");\n }\n const path = `${objectPath(object)}/timeline`;\n const spec = this.readSpec(\"GET\", path, undefined, this.timeouts.navigation, options);\n spec.query = { cursor: params.cursor, limit: String(limit) };\n return spec;\n });\n }\n\n /**\n * The navigation kit as function-calling tools with the customer bound outside the model's\n * reach. Hand `definitions` to any model API and pass its tool calls to `call()`.\n *\n * @example\n * const kit = niadra.tools(handles.phone(\"+5511987654321\"), { conversation_id: \"wa-8812\" });\n * const output = await kit.call(toolCall.function.name, toolCall.function.arguments);\n */\n tools(subject: Handle, binding: ToolBinding = {}): BoundTools {\n const navigator: Navigator = {\n search: (params, voice) => this.search(params, this.voiceBudget(voice)),\n timeline: (params, voice) => this.timeline(params, this.voiceBudget(voice)),\n open: (id, bound, voice) => {\n const scope: OpenParams = {};\n if (bound.verification) scope.verification = bound.verification;\n if (bound.conversation_id) scope.conversation_id = bound.conversation_id;\n if (bound.task_id) scope.task_id = bound.task_id;\n return this.open(id, scope, this.voiceBudget(voice));\n },\n };\n return bindTools(subject, binding, navigator, this.strict);\n }\n\n /**\n * Mints a signed, 15-minute token that binds one customer to a session. Your backend calls\n * this and hands the token to the MCP connection, so tools served over MCP can only ever\n * read that customer. Resolves with `data: null` on failure.\n */\n async subjectToken(params: SubjectTokenRequest, options: RequestOptions = {}): Promise<Result<SubjectToken>> {\n return this.navigate(() => this.readSpec(\"POST\", \"/v1/subject-tokens\", params, this.timeouts.token, options));\n }\n\n /**\n * Records a message, a system event or an agent action. Returns at once with the event's\n * idempotency key, or `null` when the event was dropped: invalid, unserializable, the queue\n * full or the client disabled. Delivery happens in the background; `flush()` waits for it.\n */\n track(event: TrackEvent): string | null {\n return this.enqueue(() => buildEvent(event));\n }\n\n /**\n * Records what an agent did in a system of record, such as a credit or a reschedule.\n * With `closes`, the action also resolves the open item it fulfils.\n */\n action(event: ActionEvent): string | null {\n return this.enqueue(() => buildAction(event));\n }\n\n /**\n * States that several handles belong to the same subject. Sent right away rather than on the\n * next batch, so the next `context()` call already sees the merged profile.\n */\n identify(params: IdentifyParams): Promise<WriteResult> {\n return this.sendNow(() => buildIdentify(params));\n }\n\n /**\n * Raises the verification level of one conversation or task after the customer proved who\n * they are. Sent right away, and drops the conversation's cached packs, because a pack\n * compiled for the old level may be missing what the new level allows.\n */\n verify(params: VerifyParams): Promise<WriteResult> {\n return this.verifyWith(params);\n }\n\n /**\n * Corrects what Niadra derived about a subject: retracts or corrects a fact, resolves an open\n * item, or records how a conversation ended. Sent right away; the server records it as an\n * event, so the correction is audited like any other. A rejected correction resolves with\n * `ok: false`.\n */\n async feedback(params: FeedbackParams): Promise<WriteResult> {\n const core = this.core;\n if (!core) return { ok: false, idempotency_key: null, error: this.disabledError() };\n let key: string | null = null;\n try {\n const request = buildFeedback(params);\n key = request.idempotency_key;\n const response = await core.transport.request<Partial<BatchResponse> | null>({\n method: \"POST\",\n path: \"/v1/feedback\",\n body: request,\n headers: { \"idempotency-key\": key },\n timeoutMs: this.timeouts.write,\n retry: core.writes,\n });\n const [rejected] = response.data?.errors ?? [];\n if (rejected) {\n throw new NiadraValidationError(`${rejected.code}${rejected.detail ? `: ${rejected.detail}` : \"\"}`);\n }\n return { ok: true, idempotency_key: key, error: null };\n } catch (error) {\n return { ok: false, idempotency_key: key, error: this.swallow(error, \"feedback\") };\n }\n }\n\n /**\n * Hands a file to Niadra, such as a call recording, and returns the reference its event\n * carries. Media never travels inside an event: this reserves an upload, sends the bytes\n * straight to storage over a short-lived signed URL, and resolves with `media_ref` and\n * `media_sha256` for the event's `content`.\n *\n * @example\n * const { data } = await niadra.uploadMedia({ data: recording, content_type: \"audio/wav\" });\n * if (data) convo.track({ speaker: \"customer\", content: { type: \"audio\", media_ref: data.media_ref, media_sha256: data.media_sha256 } });\n */\n async uploadMedia(params: UploadParams, options: { signal?: AbortSignal } = {}): Promise<Result<MediaUpload>> {\n const core = this.core;\n if (!core) return { data: null, error: this.disabledError() };\n try {\n const { bytes, request } = await prepareUpload(params);\n const reserved = await core.transport.request<Partial<MediaUploadResponse> | null>({\n method: \"POST\",\n path: \"/v1/media/uploads\",\n body: request,\n timeoutMs: this.timeouts.write,\n retry: core.writes,\n signal: options.signal,\n });\n const media_ref = reserved.data?.media_ref;\n if (typeof media_ref !== \"string\") throw new NiadraError(\"unexpected response from /v1/media/uploads\");\n const url = reserved.data?.upload_url;\n if (url) {\n checkUploadURL(url, core.baseURL);\n await core.transport.upload({\n url,\n body: bytes,\n headers: uploadHeaders(reserved.data?.upload_headers, request.content_type),\n timeoutMs: this.timeouts.upload,\n retry: core.writes,\n signal: options.signal,\n });\n }\n return {\n data: {\n media_ref,\n media_sha256: request.sha256,\n content_type: request.content_type,\n size_bytes: request.size_bytes,\n expires_at: reserved.data?.expires_at ?? null,\n },\n error: null,\n };\n } catch (error) {\n return { data: null, error: this.swallow(error, \"media upload\") };\n }\n }\n\n /** Records a transfer to a human or another agent. Sent right away, so the receiver can read context at once. */\n handoff(params: HandoffParams): Promise<WriteResult> {\n return this.sendNow(() => buildHandoff(params));\n }\n\n /**\n * A helper for one customer conversation: pins the pack across turns, captures turns and\n * emits `conversation.ended` when you call `end()`.\n */\n conversation(params: ConversationParams): Conversation {\n return new Conversation(this, params, {\n endConversation: (id) => this.endScope(buildConversationEnded(id), `conversation:${id}`),\n });\n }\n\n /** A helper for one internal-agent task: binds `task_id` to reads and writes and emits `task.ended`. */\n task(params: TaskParams): Task {\n return new Task(this, params, {\n endTask: (id) => this.endScope(buildTaskEnded(id), `task:${id}`),\n verifyTask: (verify) => this.verifyWith(verify),\n });\n }\n\n /**\n * Sends every queued event and resolves when done. Call it before a serverless function\n * returns, or pass it to `waitUntil()` on edge runtimes. Rejects only with `strict` set.\n */\n async flush(): Promise<void> {\n if (!this.core) return;\n const report = await this.core.queue.flush();\n const [first] = report.errors;\n if (this.strict && first) throw first;\n }\n\n /**\n * Flushes, stops the background timer and releases the exit hook. Events tracked after\n * this are dropped. Call it from your own SIGTERM handler in long-running services.\n */\n async shutdown(): Promise<void> {\n this.unregisterExit();\n if (!this.core) return;\n const report = await this.core.queue.close();\n this.core.cache?.clear();\n const [first] = report.errors;\n if (this.strict && first) throw first;\n }\n\n private async verifyWith(params: Omit<VerifyParams, \"handle\"> & { handle: Handle | undefined }): Promise<WriteResult> {\n const result = await this.sendNow(() => buildVerify(params));\n if (result.ok) {\n if (params.conversation_id) this.forgetScope(`conversation:${params.conversation_id}`);\n if (params.task_id) this.forgetScope(`task:${params.task_id}`);\n }\n return result;\n }\n\n /** Throws under `strict`; otherwise logs what failed, never with content, and returns the error. */\n private swallow(error: unknown, what: string): NiadraError {\n const failure = toNiadraError(error);\n this.observeAuth(failure, null);\n if (this.strict) throw failure;\n this.logger.warn(`${what} failed: ${describe(failure)}`);\n return failure;\n }\n\n private voiceBudget(voice: boolean): RequestOptions {\n return voice ? { timeout: this.timeouts.navigationVoice } : {};\n }\n\n private readSpec(\n method: \"GET\" | \"POST\",\n path: string,\n body: unknown,\n defaultTimeout: number,\n options: RequestOptions,\n ): RequestSpec {\n const spec: RequestSpec = {\n method,\n path,\n timeoutMs: options.timeout ?? defaultTimeout,\n retry: READ_POLICY,\n signal: options.signal,\n headers: options.headers,\n };\n if (body !== undefined) spec.body = body;\n return spec;\n }\n\n private async navigate<T>(build: () => RequestSpec): Promise<Result<T>> {\n if (!this.core) return { data: null, error: this.disabledError() };\n try {\n const response = await this.core.transport.request<T>(build());\n return { data: response.data, error: null };\n } catch (error) {\n const failure = toNiadraError(error);\n this.observeAuth(failure, null);\n if (this.strict) throw failure;\n this.logger.warn(`read failed: ${describe(failure)}`);\n return { data: null, error: failure };\n }\n }\n\n private async fetchContext(\n core: Core,\n request: ContextRequest,\n timeout: number,\n signal: AbortSignal | undefined,\n headers: Record<string, string> | undefined,\n ): Promise<ContextResponse> {\n const response = await core.transport.request<unknown>(\n this.readSpec(\"POST\", \"/v1/context\", request, timeout, { signal, headers }),\n );\n return normalizeContext(response.data);\n }\n\n /**\n * One request for a key, shared by every caller that needs it meanwhile. It sends the\n * cached ETag, so an unchanged pack costs a `not_modified` answer instead of the full text.\n * The caller's signal is deliberately not passed down: other callers may be waiting too.\n */\n private revalidate(\n core: Core,\n cache: ContextCache,\n key: string,\n scope: string,\n request: ContextRequest,\n timeout: number,\n headers: Record<string, string> | undefined,\n ): Promise<Revalidated> {\n return cache.dedupe(key, async () => {\n const cached = cache.lookup(key);\n const generation = cache.generation;\n const body = cached ? { ...request, known_etag: cached.response.etag } : request;\n try {\n const response = await this.fetchContext(core, body, timeout, undefined, headers);\n // A degraded answer never replaces a good pack; the good one is served instead.\n if (response.degraded && !response.not_modified && cached) {\n return { response: cached.response, source: \"fallback\" };\n }\n const merged = response.not_modified && cached ? mergeNotModified(cached.response, response) : response;\n cache.store(key, scope, merged, generation);\n return { response: merged, source: \"network\" };\n } catch (error) {\n this.observeAuth(toNiadraError(error), key);\n throw error;\n }\n });\n }\n\n private contextFailure(error: NiadraError, fallback: ContextResponse | null): ContextResult {\n if (this.strict) throw error;\n if (fallback) {\n this.logger.warn(`context request failed, serving the last good pack: ${describe(error)}`);\n return resultFrom(fallback, \"fallback\", error);\n }\n this.logger.warn(`context unavailable: ${describe(error)}`);\n return emptyResult(error);\n }\n\n /**\n * 401 means the key itself is no longer valid, so every cached pack goes. 403 is specific to\n * what was asked, so only that pack goes.\n */\n private observeAuth(error: NiadraError, key: string | null): void {\n const cache = this.core?.cache;\n if (!cache) return;\n if (error instanceof NiadraAuthenticationError) cache.clear();\n else if (error instanceof NiadraPermissionError && key) cache.delete(key);\n }\n\n private forgetScope(scope: string): void {\n this.core?.cache?.deleteScope(scope);\n }\n\n private disabledError(): NiadraError {\n return this.disabledReason ?? new NiadraConfigError(\"client is disabled\");\n }\n\n private enqueue(build: () => BatchItem): string | null {\n if (!this.core) return null;\n let item: BatchItem;\n try {\n item = build();\n } catch (error) {\n const failure = toNiadraError(error);\n if (this.strict) throw failure;\n this.logger.warn(`event dropped: ${failure.message}`);\n return null;\n }\n const accepted = this.core.queue.push(item);\n return accepted && \"idempotency_key\" in item ? item.idempotency_key : null;\n }\n\n private sendNow(build: () => BatchItem & { idempotency_key: string }): Promise<WriteResult> {\n const core = this.core;\n if (!core) return Promise.resolve({ ok: false, idempotency_key: null, error: this.disabledError() });\n let item: BatchItem & { idempotency_key: string };\n try {\n item = build();\n } catch (error) {\n const failure = toNiadraError(error);\n if (this.strict) return Promise.reject(failure);\n this.logger.warn(`write dropped: ${failure.message}`);\n return Promise.resolve({ ok: false, idempotency_key: null, error: failure });\n }\n return new Promise<WriteResult>((resolve, reject) => {\n const key = item.idempotency_key;\n core.queue.push(item, (error) => {\n if (!error) resolve({ ok: true, idempotency_key: key, error: null });\n else if (this.strict) reject(error);\n else resolve({ ok: false, idempotency_key: key, error });\n });\n core.queue.flushInBackground();\n });\n }\n\n private async endScope(item: BatchItem & { idempotency_key: string }, scope: string): Promise<WriteResult> {\n const result = await this.sendNow(() => item);\n this.forgetScope(scope);\n return result;\n }\n\n private async sendBatch(\n transport: Transport,\n items: BatchItem[],\n maxAttempts: number,\n backoff: { retryDelayMs: number; maxRetryDelayMs: number },\n ): Promise<BatchResponse> {\n try {\n const response = await transport.request<BatchResponse>({\n method: \"POST\",\n path: \"/v1/batch\",\n body: { items },\n timeoutMs: this.timeouts.write,\n retry: { kind: \"write\", maxAttempts, baseDelayMs: backoff.retryDelayMs, maxDelayMs: backoff.maxRetryDelayMs },\n });\n const data = response.data as Partial<BatchResponse> | null;\n return { accepted: data?.accepted ?? items.length, duplicates: data?.duplicates ?? 0, errors: data?.errors ?? [] };\n } catch (error) {\n const failure = toNiadraError(error);\n this.observeAuth(failure, null);\n throw failure;\n }\n }\n}\n\n/**\n * Checks the fields the SDK relies on and fills list and map defaults, so a leaner response\n * from a future server version cannot turn into a crash in the caller's prompt code.\n */\nfunction normalizeContext(data: unknown): ContextResponse {\n if (typeof data !== \"object\" || data === null) throw new NiadraError(\"unexpected response from /v1/context\");\n const body = data as Partial<ContextResponse>;\n if (typeof body.etag !== \"string\" || typeof body.path !== \"string\" || !body.verification) {\n throw new NiadraError(\"unexpected response from /v1/context\");\n }\n return {\n ...body,\n etag: body.etag,\n path: body.path,\n verification: body.verification,\n version: body.version ?? \"\",\n not_modified: body.not_modified ?? false,\n variables: body.variables ?? {},\n coverage: body.coverage ?? [],\n live: body.live ?? [],\n live_complete: body.live_complete ?? true,\n timing: body.timing ?? {},\n withheld: body.withheld ?? 0,\n degraded: body.degraded ?? false,\n };\n}\n\n/** Exactly what the signature covers; a server that names nothing still signs the content type. */\nfunction uploadHeaders(named: Record<string, string> | undefined, contentType: string): Record<string, string> {\n return named && Object.keys(named).length > 0 ? { ...named } : { \"content-type\": contentType };\n}\n\n/** `response` with the deltas the cache handed out for it; as is when the key is not cached. */\nfunction delivered(response: ContextResponse, taken: string | null | undefined): ContextResponse {\n return taken === undefined ? response : { ...response, delta: taken };\n}\n\n/** Lets one caller stop waiting for a shared request without cancelling it for the others. */\nfunction abortable<T>(promise: Promise<T>, signal: AbortSignal | undefined): Promise<T> {\n if (!signal) return promise;\n if (signal.aborted) return Promise.reject(new NiadraAbortError(\"request aborted by the caller\"));\n return new Promise<T>((resolve, reject) => {\n const onAbort = (): void => {\n reject(new NiadraAbortError(\"request aborted by the caller\"));\n };\n signal.addEventListener(\"abort\", onAbort, { once: true });\n promise.then(\n (value) => {\n signal.removeEventListener(\"abort\", onAbort);\n resolve(value);\n },\n (error: unknown) => {\n signal.removeEventListener(\"abort\", onAbort);\n reject(error instanceof Error ? error : new NiadraError(String(error)));\n },\n );\n });\n}\n","/**\n * `wrap()` for OpenAI-compatible clients: the official `openai` package and any client with its\n * `chat.completions.create(body, options)` shape.\n *\n * Each `chat.completions.create` and `chat.completions.parse` call made through the wrapper,\n * streaming or not, gets the conversation's pack as a system message right after the caller's\n * leading system or developer messages, and the suffix (deltas and live turns) as a system\n * message at the end. The pack goes after the caller's instructions because those are the same\n * for every customer: kept first, they stay the cacheable prefix of the prompt. The injection is\n * stamped on the conversation, and the model's answer is recorded as the agent's turn.\n *\n * Nothing the wrapper does can fail the model call: a context that cannot be fetched is left\n * out, and a failure to record the answer is logged, without content, and swallowed.\n */\n\nimport type { ContextResult } from \"./context.js\";\nimport type { Logger } from \"./logger.js\";\n\n/** What `wrap()` needs from a conversation or a task. Both implement it. */\nexport interface WrapSession {\n context(): Promise<ContextResult>;\n markInjected(context?: ContextResult | null): void;\n agent(text: string): string | null;\n readonly logger: Logger;\n}\n\n/** A session, or a function that finds the one the current call belongs to (`null` passes the call through). */\nexport type SessionSource = WrapSession | (() => WrapSession | null | undefined);\n\ntype Method = (...args: unknown[]) => unknown;\ntype Record_ = Record<PropertyKey, unknown>;\n\nconst INSTRUCTION_ROLES = new Set([\"system\", \"developer\"]);\nconst INTERCEPTED = [\"create\", \"parse\"] as const;\n\n/**\n * Returns a proxy of an OpenAI-compatible client that injects the conversation's context and\n * records the model's answers. The client itself is never modified.\n *\n * `.withResponse()` keeps working on intercepted calls and records the answer too;\n * `.asResponse()` returns the raw HTTP response, whose body the SDK cannot read, so nothing is\n * recorded then. Streams are recorded when they end, or when the caller stops reading them.\n *\n * @example\n * const openai = wrap(new OpenAI(), convo);\n * const completion = await openai.chat.completions.create({ model: \"gpt-4.1\", messages });\n */\nexport function wrap<C extends object>(client: C, session: SessionSource): C {\n const resolve = typeof session === \"function\" ? session : (): WrapSession => session;\n const chat = property(client, \"chat\");\n if (!isRecord(chat) || !isRecord(chat.completions)) {\n throw new TypeError(\"wrap() expects an OpenAI-compatible client with chat.completions\");\n }\n const overrides: Record_ = { chat: wrapChat(chat, resolve) };\n // Older clients keep structured outputs under `beta.chat.completions.parse`.\n const beta = property(client, \"beta\");\n const betaChat = isRecord(beta) ? beta.chat : undefined;\n if (isRecord(beta) && isRecord(betaChat) && isRecord(betaChat.completions)) {\n overrides.beta = overlay(beta, { chat: wrapChat(betaChat, resolve) });\n }\n return overlay(client, overrides);\n}\n\n/**\n * Places the pack after the leading system or developer messages and the suffix at the end.\n * Returns a new array; `messages` is left as it was.\n */\nexport function injectContext(context: ContextResult, messages: readonly unknown[]): unknown[] {\n const result = [...messages];\n if (context.text) {\n let position = 0;\n while (position < result.length && INSTRUCTION_ROLES.has(roleOf(result[position]))) position++;\n result.splice(position, 0, { role: \"system\", content: context.text });\n }\n if (context.suffix) result.push({ role: \"system\", content: context.suffix });\n return result;\n}\n\nfunction wrapChat(chat: Record_, resolve: () => WrapSession | null | undefined): Record_ {\n const completions = chat.completions as Record_;\n const overrides: Record_ = {};\n for (const name of INTERCEPTED) {\n const method = completions[name];\n if (typeof method === \"function\") overrides[name] = intercept((method as Method).bind(completions), resolve);\n }\n return overlay(chat, { completions: overlay(completions, overrides) });\n}\n\nfunction intercept(original: Method, resolve: () => WrapSession | null | undefined): Method {\n return (body: unknown, ...rest: unknown[]): unknown => {\n let session: WrapSession | null | undefined;\n try {\n session = resolve();\n } catch {\n session = null;\n }\n if (!session || !isRecord(body)) return original(body, ...rest);\n const answer = new Answer(session, body.stream === true);\n const started = prepare(session, body).then((prepared) => ({ call: original(prepared, ...rest) }));\n return new PendingCall(started, answer);\n };\n}\n\nasync function prepare(session: WrapSession, body: Record_): Promise<Record_> {\n try {\n const context = await session.context();\n if (!Array.isArray(body.messages)) return body;\n const messages = injectContext(context, body.messages);\n // A holdout pack is empty on purpose, and the turn was still built with it.\n if (context.text || context.suffix || context.response?.path === \"holdout\") session.markInjected(context);\n return { ...body, messages };\n } catch (error) {\n session.logger.warn(`could not inject context (${errorName(error)})`);\n return body;\n }\n}\n\n/**\n * The value an intercepted call returns: awaitable like the client's own promise, with its\n * `withResponse()` and `asResponse()`. The call is held in an object so that awaiting `started`\n * does not also resolve the client's promise, which `withResponse()` still needs as it is.\n */\nclass PendingCall implements PromiseLike<unknown> {\n private result: Promise<unknown> | null = null;\n\n constructor(\n private readonly started: Promise<{ call: unknown }>,\n private readonly answer: Answer,\n ) {\n // A caller that only ever uses withResponse() never awaits the other branch; the failure\n // still reaches every caller that does.\n started.catch(() => undefined);\n }\n\n then<A = unknown, B = never>(\n onfulfilled?: ((value: unknown) => A | PromiseLike<A>) | null,\n onrejected?: ((reason: unknown) => B | PromiseLike<B>) | null,\n ): Promise<A | B> {\n return this.value().then(onfulfilled, onrejected);\n }\n\n catch<B = never>(onrejected?: ((reason: unknown) => B | PromiseLike<B>) | null): Promise<unknown> {\n return this.value().catch(onrejected);\n }\n\n finally(onfinally?: (() => void) | null): Promise<unknown> {\n return this.value().finally(onfinally);\n }\n\n async withResponse(): Promise<unknown> {\n const { call } = await this.started;\n const withResponse = property(call, \"withResponse\");\n if (typeof withResponse !== \"function\") throw new TypeError(\"this client's calls have no withResponse()\");\n const settled: unknown = await (withResponse as Method).call(call);\n if (!isRecord(settled)) return settled;\n return { ...settled, data: this.answer.parsed(settled.data) };\n }\n\n async asResponse(): Promise<unknown> {\n const { call } = await this.started;\n const asResponse = property(call, \"asResponse\");\n if (typeof asResponse !== \"function\") throw new TypeError(\"this client's calls have no asResponse()\");\n return (asResponse as Method).call(call);\n }\n\n private value(): Promise<unknown> {\n this.result ??= this.started.then(({ call }) => call).then((value) => this.answer.parsed(value));\n return this.result;\n }\n}\n\n/** The capture of one model call: records its text once, whichever way the caller reads it. */\nclass Answer {\n private recorded = false;\n\n constructor(\n private readonly session: WrapSession,\n private readonly stream: boolean,\n ) {}\n\n /** What to hand back in place of `value`. Never throws. */\n parsed(value: unknown): unknown {\n try {\n if (!this.stream) {\n this.record(messageText(value));\n return value;\n }\n return isAsyncIterable(value)\n ? captureStream(value, (text) => {\n this.record(text);\n })\n : value;\n } catch (error) {\n this.session.logger.warn(`could not capture the model's answer (${errorName(error)})`);\n return value;\n }\n }\n\n private record(text: string | null): void {\n if (this.recorded || !text) return;\n this.recorded = true;\n try {\n this.session.agent(text);\n } catch (error) {\n this.session.logger.warn(`could not record the model's answer (${errorName(error)})`);\n }\n }\n}\n\n/**\n * The stream, with its async iterator replaced by one that collects the first choice's text\n * and hands it over when the stream ends, fails or is abandoned. Everything else, `tee()` and\n * `controller` included, is the stream's own.\n */\nfunction captureStream<T extends AsyncIterable<unknown>>(stream: T, done: (text: string) => void): T {\n const parts: string[] = [];\n let finished = false;\n const finish = (): void => {\n if (finished) return;\n finished = true;\n done(parts.join(\"\"));\n };\n return new Proxy(stream, {\n get(target, prop) {\n if (prop === Symbol.asyncIterator) {\n return (): AsyncIterator<unknown> => {\n const inner = target[Symbol.asyncIterator]();\n return {\n async next() {\n try {\n const step = await inner.next();\n if (step.done) finish();\n else parts.push(deltaText(step.value));\n return step;\n } catch (error) {\n finish();\n throw error;\n }\n },\n async return(value?: unknown) {\n finish();\n return inner.return ? inner.return(value) : { done: true, value };\n },\n };\n };\n }\n const value: unknown = Reflect.get(target, prop, target);\n return typeof value === \"function\" ? (value as Method).bind(target) : value;\n },\n });\n}\n\n/** With `n > 1` the model answers several times; the agent said the first one. */\nfunction firstChoice(value: unknown): Record_ | undefined {\n const choices = property(value, \"choices\");\n if (!Array.isArray(choices)) return undefined;\n return (choices as unknown[]).find(\n (choice): choice is Record_ => isRecord(choice) && (choice.index === undefined || choice.index === 0),\n );\n}\n\nfunction messageText(response: unknown): string | null {\n const content = property(firstChoice(response)?.message, \"content\");\n return typeof content === \"string\" && content ? content : null;\n}\n\nfunction deltaText(chunk: unknown): string {\n const content = property(firstChoice(chunk)?.delta, \"content\");\n return typeof content === \"string\" ? content : \"\";\n}\n\nfunction overlay<T extends object>(target: T, overrides: Record_): T {\n return new Proxy(target, {\n get(obj, prop) {\n if (Object.prototype.hasOwnProperty.call(overrides, prop)) return overrides[prop];\n // Bound to the real object: class methods may touch private fields a proxy does not have.\n const value: unknown = Reflect.get(obj, prop, obj);\n return typeof value === \"function\" ? (value as Method).bind(obj) : value;\n },\n });\n}\n\nfunction property(value: unknown, name: string): unknown {\n return isRecord(value) ? value[name] : undefined;\n}\n\nfunction isRecord(value: unknown): value is Record_ {\n return (typeof value === \"object\" || typeof value === \"function\") && value !== null;\n}\n\nfunction isAsyncIterable(value: unknown): value is AsyncIterable<unknown> {\n return isRecord(value) && typeof value[Symbol.asyncIterator] === \"function\";\n}\n\nfunction roleOf(message: unknown): string {\n const role = property(message, \"role\");\n return typeof role === \"string\" ? role : \"\";\n}\n\nfunction errorName(error: unknown): string {\n return error instanceof Error ? error.name : typeof error;\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/cache.ts","../src/errors.ts","../src/handles.ts","../src/context.ts","../src/ids.ts","../src/types/events.ts","../src/items.ts","../src/session.ts","../src/usage.ts","../src/conversation.ts","../src/exit.ts","../src/media.ts","../src/objects.ts","../src/key.ts","../src/logger.ts","../src/options.ts","../src/queue.ts","../src/task.ts","../src/tools.ts","../src/version.ts","../src/transport.ts","../src/client.ts","../src/wrap.ts"],"names":["limit","count","build","value"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { CacheOptions } from \"./options.js\";\nimport type { ContextResponse } from \"./types/context.js\";\n\n/** How usable a cached pack is at the moment of a lookup. */\nexport type Freshness = \"fresh\" | \"stale\" | \"expired\";\n\ninterface Entry {\n response: ContextResponse;\n /** When the server last confirmed this pack, by sending it or by answering `not_modified`. */\n confirmedAt: number;\n /** The conversation or task the pack belongs to, so ending one drops its packs. */\n scope: string;\n /** Deltas received for this pack that no caller has been given yet. */\n pending: string[];\n}\n\nexport interface Lookup {\n response: ContextResponse;\n freshness: Freshness;\n}\n\n/** What one request for a key settled on: the server's answer, or the good pack it could not replace. */\nexport interface Revalidated {\n response: ContextResponse;\n source: \"network\" | \"fallback\";\n}\n\n/**\n * Packs per conversation, with stale-while-revalidate.\n *\n * Every agent framework rebuilds its prompt on every turn and none of them cache, so without\n * this each turn would cost a network round trip on the hot path. An entry moves through\n * three states as it ages: `fresh` (served as is), `stale` (served at once while one\n * background request refreshes it) and `expired` (only used as a last good value when a\n * request fails). Past `maxStaleMs` it is dropped entirely.\n *\n * Keys hold handle values, so the cache lives in process memory only and is never logged.\n *\n * A delta is what changed since this agent last read the subject, and the server moves that\n * mark as it answers, so a delta it sent once never comes back. Each one is therefore handed\n * out exactly once through `take()`: a delta fetched by a background refresh waits in its\n * entry for the next reader instead of being overwritten or served twice.\n */\nexport class ContextCache {\n private readonly entries = new Map<string, Entry>();\n private readonly inflight = new Map<string, Promise<Revalidated>>();\n private epoch = 0;\n\n constructor(\n private readonly options: CacheOptions,\n private readonly now: () => number = Date.now,\n ) {}\n\n get size(): number {\n return this.entries.size;\n }\n\n /**\n * Bumped by `clear()`. A request started before a purge carries the old epoch, and its\n * answer is not stored: a revoked key must not repopulate the cache on its way out.\n */\n get generation(): number {\n return this.epoch;\n }\n\n lookup(key: string): Lookup | null {\n const entry = this.entries.get(key);\n if (!entry) return null;\n const age = this.now() - entry.confirmedAt;\n if (age > this.options.maxStaleMs) {\n this.entries.delete(key);\n return null;\n }\n // Re-insert so iteration order doubles as least-recently-used order for eviction.\n this.entries.delete(key);\n this.entries.set(key, entry);\n let freshness: Freshness = \"expired\";\n if (age <= this.options.ttlMs) freshness = \"fresh\";\n else if (age <= this.options.ttlMs + this.options.staleWhileRevalidateMs) freshness = \"stale\";\n return { response: entry.response, freshness };\n }\n\n store(key: string, scope: string, response: ContextResponse, generation: number = this.epoch): void {\n if (generation !== this.epoch) return;\n const previous = this.entries.get(key);\n // A new pack already contains every change the deltas pending against the old one carried.\n const pending = previous?.response.etag === response.etag ? [...previous.pending] : [];\n if (response.delta) pending.push(response.delta);\n this.entries.delete(key);\n this.entries.set(key, { response: { ...response, delta: null }, confirmedAt: this.now(), scope, pending });\n while (this.entries.size > this.options.maxEntries) {\n const oldest = this.entries.keys().next();\n if (oldest.done) break;\n this.entries.delete(oldest.value);\n }\n }\n\n /**\n * The deltas pending for `key`, joined, which then count as delivered: `null` when there are\n * none, `undefined` when the key is not cached at all.\n */\n take(key: string): string | null | undefined {\n const entry = this.entries.get(key);\n if (!entry) return undefined;\n const delta = entry.pending.join(\"\\n\\n\") || null;\n entry.pending = [];\n return delta;\n }\n\n delete(key: string): void {\n this.entries.delete(key);\n }\n\n /** Drops every pack of one conversation or task. */\n deleteScope(scope: string): void {\n for (const [key, entry] of this.entries) {\n if (entry.scope === scope) this.entries.delete(key);\n }\n }\n\n clear(): void {\n this.entries.clear();\n this.epoch++;\n }\n\n /**\n * Runs `load` for a key unless a request for the same key is already in flight, in which\n * case every caller shares that one request. This is what keeps a burst of turns in one\n * conversation, or a stale entry read by many callers, down to a single refresh.\n */\n dedupe(key: string, load: () => Promise<Revalidated>): Promise<Revalidated> {\n const running = this.inflight.get(key);\n if (running) return running;\n const started = load().finally(() => {\n this.inflight.delete(key);\n });\n this.inflight.set(key, started);\n return started;\n }\n}\n","import type { Problem } from \"./types/common.js\";\n\n/**\n * Base class of every error the SDK produces. In the default fail-open mode these errors are\n * logged and returned in results rather than thrown; with `strict: true` they are thrown.\n */\nexport class NiadraError extends Error {\n override readonly name: string = \"NiadraError\";\n}\n\n/** The client was built without a usable API key, or with an option the SDK cannot honour. */\nexport class NiadraConfigError extends NiadraError {\n override readonly name = \"NiadraConfigError\";\n}\n\n/** A request failed validation before it left the process. Nothing was sent. */\nexport class NiadraValidationError extends NiadraError {\n override readonly name = \"NiadraValidationError\";\n}\n\n/** The request did not finish within its time budget. */\nexport class NiadraTimeoutError extends NiadraError {\n override readonly name = \"NiadraTimeoutError\";\n\n constructor(readonly timeoutMs: number) {\n super(`request timed out after ${timeoutMs} ms`);\n }\n}\n\n/** The network call failed before an HTTP response arrived (DNS, TLS, reset connection). */\nexport class NiadraConnectionError extends NiadraError {\n override readonly name = \"NiadraConnectionError\";\n}\n\n/** The request was cancelled through the caller's `AbortSignal`. */\nexport class NiadraAbortError extends NiadraError {\n override readonly name = \"NiadraAbortError\";\n}\n\n/**\n * The API answered with an error status. `code` comes from the problem document when the\n * server sent one; `requestId` is what Niadra support needs to find the call.\n */\nexport class NiadraAPIError extends NiadraError {\n override readonly name: string = \"NiadraAPIError\";\n readonly status: number;\n readonly code: string;\n readonly requestId: string | null;\n readonly problem: Problem | null;\n /** How long the server asked callers to wait, from `Retry-After`, when it said so. */\n readonly retryAfterMs: number | null;\n\n constructor(status: number, problem: Problem | null, requestId: string | null, retryAfterMs: number | null = null) {\n const code = problem?.code ?? `http_${status}`;\n const detail = problem?.detail ? `: ${problem.detail}` : \"\";\n super(`${status} ${code}${detail}`);\n this.status = status;\n this.code = code;\n this.problem = problem;\n this.requestId = requestId ?? problem?.request_id ?? null;\n this.retryAfterMs = retryAfterMs;\n }\n}\n\n/** 401: the key is missing, malformed, rotated or revoked. */\nexport class NiadraAuthenticationError extends NiadraAPIError {\n override readonly name = \"NiadraAuthenticationError\";\n}\n\n/** 403: the key is valid but lacks the scope, or its source was cut off. */\nexport class NiadraPermissionError extends NiadraAPIError {\n override readonly name = \"NiadraPermissionError\";\n}\n\n/** 429: over the rate limit. Batches wait `retryAfterMs` before trying again. */\nexport class NiadraRateLimitError extends NiadraAPIError {\n override readonly name = \"NiadraRateLimitError\";\n}\n\n/** Builds the most specific `NiadraAPIError` subclass for a status code. */\nexport function apiErrorFor(\n status: number,\n problem: Problem | null,\n requestId: string | null,\n retryAfterMs: number | null,\n): NiadraAPIError {\n if (status === 401) return new NiadraAuthenticationError(status, problem, requestId, retryAfterMs);\n if (status === 403) return new NiadraPermissionError(status, problem, requestId, retryAfterMs);\n if (status === 429) return new NiadraRateLimitError(status, problem, requestId, retryAfterMs);\n return new NiadraAPIError(status, problem, requestId, retryAfterMs);\n}\n\n/** Wraps anything thrown into a `NiadraError`, keeping the original as `cause`. */\nexport function toNiadraError(error: unknown): NiadraError {\n if (error instanceof NiadraError) return error;\n const message = error instanceof Error ? error.message : String(error);\n return new NiadraError(message, { cause: error });\n}\n","import { NiadraValidationError } from \"./errors.js\";\nimport type { Handle, ObjectRef } from \"./types/common.js\";\nimport type { SubjectKind } from \"./types/vocabulary.js\";\n\ninterface HandleOptions {\n /** Overrides the subject kind the server would infer from the handle type. */\n subjectKind?: SubjectKind;\n}\n\nfunction build(type: Handle[\"type\"], value: string, scope?: string, options?: HandleOptions): Handle {\n const handle: Handle = { type, value };\n if (scope !== undefined) handle.scope = scope;\n if (options?.subjectKind !== undefined) handle.subject_kind = options.subjectKind;\n return handle;\n}\n\n/**\n * Builders for the handle types the API accepts. They only assemble the object; the value is\n * normalized and validated on the server, which is the single source of truth for matching.\n *\n * @example\n * niadra.context({ subject: handles.phone(\"+5511987654321\"), conversation_id: \"wa-8812\" })\n */\nexport const handles = {\n /** A phone number in E.164 form, such as `+5511987654321`. */\n phone: (e164: string, options?: HandleOptions): Handle => build(\"phone_e164\", e164, undefined, options),\n email: (address: string, options?: HandleOptions): Handle => build(\"email\", address, undefined, options),\n /** The WhatsApp id (`wa_id`) the Cloud API reports for a contact. */\n waId: (value: string, options?: HandleOptions): Handle => build(\"wa_id\", value, undefined, options),\n waJid: (value: string, options?: HandleOptions): Handle => build(\"wa_jid\", value, undefined, options),\n waLid: (value: string, options?: HandleOptions): Handle => build(\"wa_lid\", value, undefined, options),\n /** A business-scoped WhatsApp user id; `businessAccount` is the WhatsApp Business account it belongs to. */\n waBsuid: (value: string, businessAccount: string, options?: HandleOptions): Handle =>\n build(\"wa_bsuid\", value, businessAccount, options),\n /** The user id in your own app or site. */\n appUserId: (value: string, options?: HandleOptions): Handle => build(\"app_user_id\", value, undefined, options),\n /** The id of a person or organization in a system of record; `system` names that system, such as `crm`. */\n systemId: (value: string, system: string, options?: HandleOptions): Handle =>\n build(\"system_id\", value, system, options),\n /** An HMAC of a national document number; `country` is its ISO 3166-1 alpha-2 code. */\n govIdHmac: (value: string, country: string, options?: HandleOptions): Handle =>\n build(\"gov_id_hmac\", value, country, options),\n /** An HMAC of a company registry number. Identifies an organization. */\n orgRegistryHmac: (value: string, country: string): Handle =>\n build(\"org_registry_hmac\", value, country, { subjectKind: \"account\" }),\n /** An e-mail domain, such as `acme.com`. Identifies an organization. */\n emailDomain: (domain: string): Handle => build(\"email_domain\", domain, undefined, { subjectKind: \"account\" }),\n /** An anonymous visitor or device id, before the person is known. */\n anonId: (value: string, options?: HandleOptions): Handle => build(\"anon_id\", value, undefined, options),\n} as const;\n\n/**\n * Accepts an `ObjectRef` or the `type:namespace:id` shorthand. The id may itself contain\n * colons (`invoice:erp:2026:0823`); only the first two separate the parts.\n */\nexport function toObjectRef(object: ObjectRef | string): ObjectRef {\n if (typeof object !== \"string\") return object;\n const first = object.indexOf(\":\");\n const second = first < 0 ? -1 : object.indexOf(\":\", first + 1);\n if (first <= 0 || second <= first + 1 || second === object.length - 1) {\n throw new NiadraValidationError(\"object must look like `type:namespace:id`\");\n }\n return { type: object.slice(0, first), namespace: object.slice(first + 1, second), id: object.slice(second + 1) };\n}\n","import { NiadraValidationError } from \"./errors.js\";\nimport type { NiadraError } from \"./errors.js\";\nimport { toObjectRef } from \"./handles.js\";\nimport type { Handle, ObjectRef } from \"./types/common.js\";\nimport type { ContextRequest, ContextResponse, LiveTurn, TargetModel } from \"./types/context.js\";\nimport type { Verification, View } from \"./types/vocabulary.js\";\n\n/** Arguments of `context()`. Pass exactly one of `subject` or `object`. */\nexport interface ContextParams {\n /** The customer, by any handle the server knows. */\n subject?: Handle;\n /** A business object, such as an invoice, when the task is about the object rather than a person. */\n object?: ObjectRef | string;\n /** The account or partner the person acts for. Requires an active link between the two. */\n about?: Handle;\n /** Defaults to `chat`. */\n view?: View;\n /**\n * The level proven in this conversation. The server may answer with a lower effective level\n * when the source's ceiling is lower; see `response.verification`.\n */\n verification?: Verification;\n /** Enables the per-conversation cache and the server's pinning of the pack. */\n conversation_id?: string;\n /** For internal agents: the task plays the role of the conversation. */\n task_id?: string;\n /** What the turn is about, so selection can favour relevant history. Up to 2,000 characters. */\n query?: string;\n /** Ask only for what changed since this source last read the subject. */\n delta?: boolean;\n /** The model that will read the pack, so the server can size it for that model's prompt cache. */\n target?: TargetModel;\n}\n\n/** Per-call options shared by every read method. */\nexport interface RequestOptions {\n /** Overrides the method's default time budget, in milliseconds. */\n timeout?: number | undefined;\n /** Cancels the wait. A request shared with other callers keeps running for them. */\n signal?: AbortSignal | undefined;\n /** Extra headers, such as a W3C `traceparent`. */\n headers?: Record<string, string> | undefined;\n}\n\nexport interface ContextOptions extends RequestOptions {\n /** Pass `false` to skip the per-conversation cache for this call. */\n cache?: boolean | undefined;\n}\n\n/**\n * Where a `context()` result came from.\n *\n * - `network`: a response the server just sent (or confirmed unchanged).\n * - `cache`: a pack younger than the cache TTL; no request was made.\n * - `stale`: an older pack returned at once while a background request refreshes it.\n * - `fallback`: the request failed and this is the last good pack for the conversation.\n * - `none`: nothing was available; `text` is empty and `error` says why.\n */\nexport type ContextSource = \"network\" | \"cache\" | \"stale\" | \"fallback\" | \"none\";\n\n/** What `context()` resolves to. Always usable: on failure `text` is an empty string. */\nexport interface ContextResult {\n /** The pack, ready for the system prompt. Empty when there is nothing to inject. */\n text: string;\n /**\n * The parts that change turn by turn and belong at the end of the prompt, after the\n * conversation: the delta and the live turns from other channels. Empty when there are none.\n */\n suffix: string;\n /** Named values from the pack, for templates that place them individually. */\n variables: Record<string, string>;\n source: ContextSource;\n /** The response this result was built from; `null` when `source` is `none`. */\n response: ContextResponse | null;\n /** What went wrong, when `source` is `fallback` or `none`. */\n error: NiadraError | null;\n}\n\nconst VIEW = /^(voice|chat|brief|full|custom|account|partner|task:[a-z0-9_]{1,40})$/;\nconst MAX_QUERY = 2000;\n\n/** Validates the arguments and builds the wire request, without `known_etag`. */\nexport function buildContextRequest(params: ContextParams): ContextRequest {\n if ((params.subject === undefined) === (params.object === undefined)) {\n throw new NiadraValidationError(\"pass exactly one of `subject` or `object`\");\n }\n if (params.conversation_id && params.task_id) {\n throw new NiadraValidationError(\"pass `conversation_id` or `task_id`, not both\");\n }\n if (params.view !== undefined && !VIEW.test(params.view)) {\n throw new NiadraValidationError(\"unknown view; task views look like `task:billing`\");\n }\n if (params.query !== undefined && params.query.length > MAX_QUERY) {\n throw new NiadraValidationError(`query is longer than ${MAX_QUERY} characters`);\n }\n\n const request: ContextRequest = { view: params.view ?? \"chat\" };\n if (params.subject) request.subject = params.subject;\n if (params.object !== undefined) request.object = toObjectRef(params.object);\n if (params.about) request.about = params.about;\n if (params.verification) request.verification = params.verification;\n if (params.conversation_id) request.conversation_id = params.conversation_id;\n if (params.task_id) request.task_id = params.task_id;\n if (params.query) request.query = params.query;\n if (params.delta) request.delta = true;\n if (params.target) request.target = params.target;\n return request;\n}\n\n/** Packs are only cached inside a conversation or task, the unit the server pins them to. */\nexport function cacheScope(request: ContextRequest): string | null {\n if (request.conversation_id) return `conversation:${request.conversation_id}`;\n if (request.task_id) return `task:${request.task_id}`;\n return null;\n}\n\n/**\n * Every field that changes what the server would compile goes into the key, in a fixed order.\n * `delta` does not: a plain read and a delta read of one conversation get the same pinned\n * bytes, so they share one entry.\n */\nexport function cacheKey(request: ContextRequest): string {\n return JSON.stringify([\n request.subject ?? null,\n request.object ?? null,\n request.about ?? null,\n request.view ?? \"chat\",\n request.verification ?? \"V0\",\n request.conversation_id ?? null,\n request.task_id ?? null,\n request.query ?? null,\n request.target ?? null,\n ]);\n}\n\n/**\n * Applies a `not_modified` answer to the cached pack: the pinned text and its metadata stay,\n * while the parts outside the pin (live turns, delta, coverage, timing) come from the new answer.\n */\nexport function mergeNotModified(cached: ContextResponse, fresh: ContextResponse): ContextResponse {\n return {\n ...fresh,\n not_modified: false,\n text: cached.text ?? null,\n variables: cached.variables,\n version: cached.version,\n etag: cached.etag,\n manifest_hash: cached.manifest_hash ?? null,\n withheld: cached.withheld,\n cache: cached.cache ?? null,\n };\n}\n\nexport function resultFrom(\n response: ContextResponse,\n source: ContextSource,\n error: NiadraError | null = null,\n): ContextResult {\n // A conversation in the control group gets an empty pack on purpose; it is not an error.\n const text = response.path === \"holdout\" ? \"\" : (response.text ?? \"\");\n return { text, suffix: renderSuffix(response), variables: response.variables, source, response, error };\n}\n\nexport function emptyResult(error: NiadraError | null): ContextResult {\n return { text: \"\", suffix: \"\", variables: {}, source: \"none\", response: null, error };\n}\n\n/**\n * Renders the delta and the live turns for the end of the prompt. Kept outside the pinned\n * pack so that the prompt prefix stays byte-identical across turns and the model provider's\n * prompt cache keeps hitting. Returns an empty string when there is nothing to add.\n */\nexport function renderSuffix(response: ContextResponse): string {\n if (response.path === \"holdout\") return \"\";\n return [response.delta ?? \"\", renderLive(response)].filter(Boolean).join(\"\\n\\n\");\n}\n\n/**\n * Renders the live turns (recent turns from other channels that the pack has not absorbed\n * yet) as one tagged block, or an empty string when there are none. `complete=\"false\"` tells\n * the model the list may be missing turns because the server could not read all of them.\n */\nexport function renderLive(response: ContextResponse): string {\n if (response.path === \"holdout\" || response.live.length === 0) return \"\";\n const complete = response.live_complete ? \"\" : ' complete=\"false\"';\n const lines = response.live.map(renderLiveTurn).join(\"\\n\");\n return `<live_turns source=\"niadra\"${complete}>\\n${lines}\\n</live_turns>`;\n}\n\nfunction renderLiveTurn(turn: LiveTurn): string {\n return `[${utcSeconds(turn.at)}] ${turn.channel} · ${turn.speaker}: ${turn.text}`;\n}\n\n/** The same timestamp form in every SDK, whatever precision or offset the server sent. */\nfunction utcSeconds(at: string): string {\n const ms = Date.parse(at);\n return Number.isNaN(ms) ? at : `${new Date(ms).toISOString().slice(0, 19)}Z`;\n}\n","let lastMs = -1;\nlet counter = 0;\n\nfunction randomBytes(length: number): Uint8Array {\n const bytes = new Uint8Array(length);\n const webCrypto = (globalThis as { crypto?: { getRandomValues?: (array: Uint8Array) => Uint8Array } })\n .crypto;\n if (webCrypto?.getRandomValues) {\n webCrypto.getRandomValues(bytes);\n } else {\n // Node 18 hides Web Crypto behind a flag; idempotency keys need uniqueness, not secrecy.\n for (let i = 0; i < length; i++) bytes[i] = Math.floor(Math.random() * 256);\n }\n return bytes;\n}\n\n/**\n * A UUIDv7 (RFC 9562): time-ordered, so keys minted by one process sort in the order the\n * events happened. A 12-bit counter keeps keys monotonic within the same millisecond.\n */\nexport function uuidv7(now: number = Date.now()): string {\n let ms = now;\n if (ms <= lastMs) {\n ms = lastMs;\n counter = (counter + 1) & 0xfff;\n if (counter === 0) ms += 1;\n } else {\n counter = (randomBytes(2)[0] ?? 0) & 0x7f;\n }\n lastMs = ms;\n\n const bytes = randomBytes(16);\n const high = Math.floor(ms / 2 ** 16);\n const low = ms % 2 ** 16;\n bytes[0] = (high >>> 24) & 0xff;\n bytes[1] = (high >>> 16) & 0xff;\n bytes[2] = (high >>> 8) & 0xff;\n bytes[3] = high & 0xff;\n bytes[4] = (low >>> 8) & 0xff;\n bytes[5] = low & 0xff;\n bytes[6] = 0x70 | ((counter >>> 8) & 0x0f);\n bytes[7] = counter & 0xff;\n bytes[8] = 0x80 | ((bytes[8] ?? 0) & 0x3f);\n\n let hex = \"\";\n for (const byte of bytes) hex += byte.toString(16).padStart(2, \"0\");\n return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`;\n}\n","/**\n * The write side: items of `POST /v1/batch`. A batch mixes item types, and one bad item never\n * fails the batch; the server answers 207 with one error per rejected item.\n */\n\nimport type { Handle, ObjectRef, Subject } from \"./common.js\";\nimport type {\n AssertionMethod,\n EventKind,\n Speaker,\n SubjectKind,\n Verification,\n VerifyMethod,\n Visibility,\n} from \"./vocabulary.js\";\n\n/** Longest text the server accepts in `content.text` or `content.transcript`. */\nexport const MAX_EVENT_TEXT = 200_000;\n\n/** Largest batch the server accepts. */\nexport const MAX_BATCH_ITEMS = 500;\n\n/** Largest file `POST /v1/media/uploads` reserves room for: 500 MiB. */\nexport const MAX_MEDIA_BYTES = 500 * 1024 * 1024;\n\nexport interface SpeakerRef {\n role: Speaker;\n /** Agent or attendant id inside the source. */\n id?: string | null;\n}\n\nexport interface Content {\n type?: \"text\" | \"audio\" | \"image\" | \"file\";\n text?: string | null;\n /** Reference returned by `/v1/media/uploads`; the media itself never travels in the event. */\n media_ref?: string | null;\n /** Lowercase hex SHA-256 of the media. */\n media_sha256?: string | null;\n transcript?: string | null;\n /** Speech-to-text confidence between 0 and 1. Low-confidence agent turns are not measured. */\n stt_confidence?: number | null;\n}\n\nexport interface VoiceInfo {\n ani?: string | null;\n dnis?: string | null;\n trunk?: string | null;\n network_attestation?: \"A\" | \"B\" | \"C\" | null;\n answered_at?: string | null;\n ended_at?: string | null;\n end_reason?: string | null;\n recording_ref?: string | null;\n turn_offset_ms?: number | null;\n}\n\n/**\n * The open item an action fulfils. Pass either `item_id`, or `object` together with the\n * canonical `operation`; the server rejects any other combination.\n */\nexport interface Closes {\n item_id?: string | null;\n object?: ObjectRef | null;\n operation?: string | null;\n}\n\nexport interface ActionInfo {\n /** Canonical operation, such as `credit` or `reschedule`. */\n operation: string;\n /** What happened, up to 2,000 characters. */\n result?: string | null;\n purpose?: string | null;\n closes?: Closes | null;\n corrects_action_id?: string | null;\n}\n\n/**\n * Which context the agent's prompt carried and when it went in. Set on the agent's own turns\n * and actions, so measurement can tell a context that arrived after the agent spoke from one\n * it had and did not use.\n */\nexport interface ContextStamp {\n /** The etag of the pack in the prompt; absent when the prompt carried no pack. */\n etag?: string | null;\n injected_at: string;\n}\n\n/**\n * What the model provider reported for the call behind an agent's turn. `wrap()` reads it from every\n * call it sees; without `wrap()`, pass it with the turn: `agent(text, { usage: response })` takes an\n * OpenAI or Anthropic response or a `ModelUsage`.\n */\nexport interface ModelUsage {\n /** Who served the call, lowercase: `openai`, `anthropic`, a router or a cloud. */\n provider: string;\n /** The model the provider says answered, such as `gpt-4.1-2025-04-14`. */\n model: string;\n /** Every input token, cached ones included. */\n prompt_tokens: number;\n /** Input tokens read from the provider's prompt cache. */\n cached_tokens?: number;\n /** Input tokens written to the cache (Anthropic's cache creation). */\n cache_write_tokens?: number;\n}\n\n/** A message, a system event or an agent action, exactly as sent on the wire. */\nexport interface EventItem {\n type: \"event\";\n kind: EventKind;\n idempotency_key: string;\n channel: string;\n conversation_id?: string | null;\n conversation_aliases?: string[];\n task_id?: string | null;\n handles?: Handle[];\n subjects?: Subject[];\n object_refs?: ObjectRef[];\n speaker: SpeakerRef;\n direction?: \"inbound\" | \"outbound\" | null;\n content?: Content | null;\n occurred_at: string;\n visibility?: Visibility;\n verification_hint?: Verification | null;\n /** System events only, such as `invoice.credited`. */\n canonical_type?: string | null;\n /** Structured fields of a system event. */\n fields?: Record<string, unknown>;\n action?: ActionInfo | null;\n corrects_event_id?: string | null;\n voice?: VoiceInfo | null;\n context_stamp?: ContextStamp | null;\n /** The model call behind an `ai_agent` message: tokens and prompt cache. */\n usage?: ModelUsage | null;\n}\n\n/** States that several handles belong to the same subject. */\nexport interface IdentifyItem {\n type: \"identify\";\n idempotency_key: string;\n /** Between 2 and 16 handles. */\n handles: Handle[];\n method: AssertionMethod;\n subject_kind: SubjectKind;\n conversation_id?: string | null;\n occurred_at: string;\n}\n\n/** Raises the verification level of one conversation or task. The server never infers it. */\nexport interface VerifyItem {\n type: \"verify\";\n idempotency_key: string;\n method: VerifyMethod;\n level: Verification;\n conversation_id?: string | null;\n task_id?: string | null;\n handle: Handle;\n valid_until?: string | null;\n occurred_at: string;\n}\n\nexport interface ConversationEndedItem {\n type: \"conversation.ended\";\n idempotency_key: string;\n conversation_id: string;\n occurred_at: string;\n}\n\nexport interface TaskEndedItem {\n type: \"task.ended\";\n idempotency_key: string;\n task_id: string;\n occurred_at: string;\n}\n\n/** A transfer to a human or another agent. */\nexport interface HandoffItem {\n type: \"handoff\";\n idempotency_key: string;\n conversation_id: string;\n target: \"human\" | \"agent\";\n target_source?: string | null;\n reason?: string | null;\n mode: \"warm\" | \"cold\";\n occurred_at: string;\n}\n\n/** Periodic counter the SDK sends so the server can tell a quiet source from a broken one. */\nexport interface HeartbeatItem {\n type: \"heartbeat\";\n window_start: string;\n sent: number;\n}\n\nexport type BatchItem =\n | EventItem\n | IdentifyItem\n | VerifyItem\n | ConversationEndedItem\n | TaskEndedItem\n | HandoffItem\n | HeartbeatItem;\n\nexport interface BatchRequest {\n items: BatchItem[];\n}\n\nexport interface ItemError {\n /** Position of the rejected item in the batch that was sent. */\n index: number;\n code: string;\n detail?: string | null;\n}\n\nexport interface BatchResponse {\n accepted: number;\n duplicates: number;\n errors: ItemError[];\n}\n\n/** Body of `POST /v1/media/uploads`. */\nexport interface MediaUploadRequest {\n content_type: string;\n /** Between 1 byte and 500 MiB. */\n size_bytes: number;\n /** Lowercase hex SHA-256 of the bytes. */\n sha256: string;\n /** Whose media it is. Stored under that person, so erasing them erases it too. */\n subject?: Handle | null;\n}\n\n/** Where to send the bytes: a short-lived signed URL, and the reference events carry afterwards. */\nexport interface MediaUploadResponse {\n media_ref: string;\n upload_url: string;\n /** Send exactly these headers with the bytes; the store refuses anything else. */\n upload_headers?: Record<string, string>;\n expires_at: string;\n}\n\nexport type FeedbackAction = \"retract_fact\" | \"correct_fact\" | \"resolve_open_item\" | \"conversation_outcome\";\n\n/** Body of `POST /v1/feedback`. The server records it as a `feedback.<action>` system event. */\nexport interface FeedbackRequest {\n idempotency_key: string;\n subject: Handle;\n action: FeedbackAction;\n fact_id?: string | null;\n open_item_id?: string | null;\n conversation_id?: string | null;\n /** Up to 2,000 characters. */\n value?: string | null;\n /** Up to 500 characters. */\n reason?: string | null;\n}\n","/**\n * Turns what callers pass to `track()`, `identify()` and friends into batch items, applying the\n * same shape rules the server enforces. Catching a malformed event here means it is dropped\n * with a log line instead of occupying the queue and coming back as a 207 error.\n */\n\nimport { NiadraValidationError } from \"./errors.js\";\nimport { toObjectRef } from \"./handles.js\";\nimport { uuidv7 } from \"./ids.js\";\nimport type { Handle, ObjectRef, Subject } from \"./types/common.js\";\nimport {\n MAX_EVENT_TEXT,\n type ActionInfo,\n type Closes,\n type Content,\n type ContextStamp,\n type ConversationEndedItem,\n type EventItem,\n type FeedbackAction,\n type FeedbackRequest,\n type HandoffItem,\n type IdentifyItem,\n type ModelUsage,\n type SpeakerRef,\n type TaskEndedItem,\n type VerifyItem,\n type VoiceInfo,\n} from \"./types/events.js\";\nimport type {\n AssertionMethod,\n EventKind,\n Speaker,\n SubjectKind,\n Verification,\n VerifyMethod,\n Visibility,\n} from \"./types/vocabulary.js\";\n\n/** An ISO 8601 string or a `Date`. */\nexport type Timestamp = string | Date;\n\n/** Fields shared by everything `track()` records. */\ninterface EventBase {\n /** Where it happened, such as `whatsapp`, `voice`, `app` or `erp`. */\n channel: string;\n /** Provider message id, when there is one; otherwise the SDK mints a UUIDv7. */\n idempotency_key?: string;\n conversation_id?: string | null;\n /** Other ids the same conversation has in other systems. Up to 8. */\n conversation_aliases?: string[];\n task_id?: string | null;\n /** Up to 16. An event needs at least one handle, subject or object. */\n handles?: Handle[];\n /** Up to 8. */\n subjects?: Subject[];\n /** Up to 16. Accepts `type:namespace:id` strings. */\n object_refs?: (ObjectRef | string)[];\n /** Defaults to now. */\n occurred_at?: Timestamp;\n visibility?: Visibility;\n verification_hint?: Verification | null;\n corrects_event_id?: string | null;\n voice?: VoiceInfo | null;\n /**\n * Which context the agent acted on, for the agent's own turns and actions. Conversations and\n * tasks set it from `markInjected()`.\n */\n context_stamp?: ContextStamp | null;\n}\n\n/** An event for `track()`. `kind` defaults to `message`. */\nexport interface TrackEvent extends EventBase {\n kind?: EventKind;\n /** Who produced it. A bare role is shorthand for `{ role }`. */\n speaker: SpeakerRef | Speaker;\n /** Defaults to `inbound` for customer messages and `outbound` for agent messages. */\n direction?: \"inbound\" | \"outbound\" | null;\n content?: Content | null;\n /** Shorthand for `content: { type: \"text\", text }`. Cannot be combined with `content`. */\n text?: string;\n /** Required for `system_event`, such as `invoice.credited`. */\n canonical_type?: string | null;\n fields?: Record<string, unknown>;\n /** Required for `action`, and only valid there. */\n action?: ActionInfo | null;\n /** What the provider reported for the model call behind an `ai_agent` message; only valid there. */\n usage?: ModelUsage | null;\n}\n\n/** An agent action for `action()`: what an agent did in a system of record. */\nexport interface ActionEvent extends EventBase {\n /** Canonical operation, such as `credit` or `reschedule`. */\n operation: string;\n /** What happened, up to 2,000 characters. */\n result?: string | null;\n purpose?: string | null;\n /** The open item this action fulfils, which the server then marks resolved. */\n closes?: Closes | null;\n corrects_action_id?: string | null;\n /** Defaults to `ai_agent`. */\n speaker?: SpeakerRef | Speaker;\n}\n\nexport interface IdentifyParams {\n /** Between 2 and 16 handles that belong to the same subject. */\n handles: Handle[];\n /** Defaults to `explicit_identify`. */\n method?: AssertionMethod;\n /** Defaults to `person`. */\n subject_kind?: SubjectKind;\n conversation_id?: string | null;\n occurred_at?: Timestamp;\n idempotency_key?: string;\n}\n\nexport interface VerifyParams {\n /** The handle whose possession was proven. */\n handle: Handle;\n method: VerifyMethod;\n /** The level reached. It applies to this conversation or task only. */\n level: Verification;\n conversation_id?: string | null;\n task_id?: string | null;\n /** When the proof stops counting. */\n valid_until?: Timestamp | null;\n occurred_at?: Timestamp;\n idempotency_key?: string;\n}\n\nexport interface HandoffParams {\n conversation_id: string;\n target: \"human\" | \"agent\";\n /** The source that takes over, when it is integrated with Niadra. */\n target_source?: string | null;\n reason?: string | null;\n /** `warm` when the receiver gets a briefing. Defaults to `warm`. */\n mode?: \"warm\" | \"cold\";\n occurred_at?: Timestamp;\n idempotency_key?: string;\n}\n\n/** Arguments of `feedback()`: a correction of what Niadra derived about a subject. */\nexport interface FeedbackParams {\n subject: Handle;\n /**\n * `retract_fact` or `correct_fact` (with `fact_id`, and `value` for the right one),\n * `resolve_open_item` (with `open_item_id`) or `conversation_outcome` (with `conversation_id`\n * and `value`).\n */\n action: FeedbackAction;\n fact_id?: string | null;\n open_item_id?: string | null;\n conversation_id?: string | null;\n /** Up to 2,000 characters. */\n value?: string | null;\n /** Why, up to 500 characters. */\n reason?: string | null;\n idempotency_key?: string;\n}\n\nconst FEEDBACK_ACTIONS: readonly FeedbackAction[] = [\n \"retract_fact\",\n \"correct_fact\",\n \"resolve_open_item\",\n \"conversation_outcome\",\n];\n\nconst SHORT = 256;\n\nfunction fail(message: string): never {\n throw new NiadraValidationError(message);\n}\n\nfunction iso(value: Timestamp | undefined): string {\n if (value === undefined) return new Date().toISOString();\n if (value instanceof Date) {\n if (Number.isNaN(value.getTime())) fail(\"invalid Date\");\n return value.toISOString();\n }\n if (Number.isNaN(Date.parse(value))) fail(\"timestamps must be ISO 8601\");\n return value;\n}\n\nfunction short(value: string | null | undefined, field: string): void {\n if (value === undefined || value === null) return;\n if (value.length === 0 || value.length > SHORT) fail(`${field} must be 1 to ${SHORT} characters`);\n}\n\nfunction limit(list: readonly unknown[] | undefined, max: number, field: string): void {\n if (list && list.length > max) fail(`${field} takes at most ${max} entries`);\n}\n\nfunction speakerRef(speaker: SpeakerRef | Speaker): SpeakerRef {\n return typeof speaker === \"string\" ? { role: speaker } : speaker;\n}\n\nfunction checkCloses(closes: Closes | null | undefined): void {\n if (!closes) return;\n const byId = Boolean(closes.item_id);\n const byObject = Boolean(closes.object && closes.operation);\n if (byId === byObject) fail(\"closes takes either item_id, or object and operation\");\n}\n\nfunction checkUsage(usage: ModelUsage): void {\n if (!/^[a-z0-9][a-z0-9_.-]{0,63}$/.test(usage.provider)) fail(\"usage.provider must be lowercase, like `openai`\");\n if (!/^[A-Za-z0-9][A-Za-z0-9_.:/@-]{0,127}$/.test(usage.model)) fail(\"usage.model is not a model name\");\n const counts = [usage.prompt_tokens, usage.cached_tokens ?? 0, usage.cache_write_tokens ?? 0];\n if (!counts.every((n) => Number.isInteger(n) && n >= 0)) fail(\"usage counts are whole numbers from 0\");\n if ((usage.cached_tokens ?? 0) + (usage.cache_write_tokens ?? 0) > usage.prompt_tokens) {\n fail(\"cached and written tokens are part of prompt_tokens\");\n }\n}\n\nfunction checkContent(content: Content | null | undefined): void {\n if (!content) return;\n if ((content.text?.length ?? 0) > MAX_EVENT_TEXT) fail(`content.text is longer than ${MAX_EVENT_TEXT}`);\n if ((content.transcript?.length ?? 0) > MAX_EVENT_TEXT) {\n fail(`content.transcript is longer than ${MAX_EVENT_TEXT}`);\n }\n}\n\n/** Builds the wire event and checks it against the server's shape rules. */\nexport function buildEvent(input: TrackEvent): EventItem {\n if (input.text !== undefined && input.content) fail(\"pass `text` or `content`, not both\");\n const kind: EventKind = input.kind ?? \"message\";\n const speaker = speakerRef(input.speaker);\n const content: Content | null =\n input.text !== undefined ? { type: \"text\", text: input.text } : (input.content ?? null);\n\n short(input.channel, \"channel\");\n checkContent(content);\n limit(input.handles, 16, \"handles\");\n limit(input.subjects, 8, \"subjects\");\n limit(input.object_refs, 16, \"object_refs\");\n limit(input.conversation_aliases, 8, \"conversation_aliases\");\n if (kind === \"action\" && !input.action) fail(\"an action event needs the `action` block\");\n if (kind !== \"action\" && input.action) fail(\"`action` is only valid when kind is `action`\");\n if (kind === \"system_event\" && !input.canonical_type) fail(\"a system event needs `canonical_type`\");\n if (kind === \"message\" && !(content?.text || content?.media_ref || content?.transcript)) {\n fail(\"a message needs text, a transcript or a media reference\");\n }\n if (!hasTarget(input)) fail(\"an event needs at least one handle, subject or object\");\n if (input.action) {\n short(input.action.operation, \"action.operation\");\n if ((input.action.result?.length ?? 0) > 2000) fail(\"action.result is longer than 2000\");\n checkCloses(input.action.closes);\n }\n if (input.usage) {\n if (kind !== \"message\" || speaker.role !== \"ai_agent\") fail(\"`usage` is only valid on a message of the `ai_agent`\");\n checkUsage(input.usage);\n }\n\n const event: EventItem = {\n type: \"event\",\n kind,\n idempotency_key: input.idempotency_key ?? uuidv7(),\n channel: input.channel,\n speaker,\n occurred_at: iso(input.occurred_at),\n };\n if (content) event.content = content;\n const direction = input.direction ?? (kind === \"message\" ? defaultDirection(speaker.role) : undefined);\n if (direction) event.direction = direction;\n if (input.object_refs) event.object_refs = input.object_refs.map(toObjectRef);\n if (input.canonical_type) event.canonical_type = input.canonical_type;\n if (input.fields) event.fields = input.fields;\n if (input.action) event.action = input.action;\n if (input.usage) event.usage = input.usage;\n copyOptional(event, input);\n assertSerializable(event);\n return event;\n}\n\n/** Builds an `action` event: `track()` with `kind: \"action\"` and the action block filled in. */\nexport function buildAction(input: ActionEvent): EventItem {\n const { operation, result, purpose, closes, corrects_action_id, speaker, ...base } = input;\n const action: ActionInfo = { operation };\n if (result !== undefined) action.result = result;\n if (purpose !== undefined) action.purpose = purpose;\n if (closes !== undefined) action.closes = closes;\n if (corrects_action_id !== undefined) action.corrects_action_id = corrects_action_id;\n return buildEvent({ ...base, kind: \"action\", speaker: speaker ?? \"ai_agent\", action });\n}\n\nexport function buildIdentify(input: IdentifyParams): IdentifyItem {\n if (input.handles.length < 2 || input.handles.length > 16) fail(\"identify takes 2 to 16 handles\");\n const item: IdentifyItem = {\n type: \"identify\",\n idempotency_key: input.idempotency_key ?? uuidv7(),\n handles: input.handles,\n method: input.method ?? \"explicit_identify\",\n subject_kind: input.subject_kind ?? \"person\",\n occurred_at: iso(input.occurred_at),\n };\n if (input.conversation_id) item.conversation_id = input.conversation_id;\n return item;\n}\n\nexport function buildVerify(input: Omit<VerifyParams, \"handle\"> & { handle: Handle | undefined }): VerifyItem {\n if (!input.handle) fail(\"verify needs the handle whose possession was proven\");\n if (input.conversation_id && input.task_id) fail(\"pass `conversation_id` or `task_id`, not both\");\n const item: VerifyItem = {\n type: \"verify\",\n idempotency_key: input.idempotency_key ?? uuidv7(),\n method: input.method,\n level: input.level,\n handle: input.handle,\n occurred_at: iso(input.occurred_at),\n };\n if (input.conversation_id) item.conversation_id = input.conversation_id;\n if (input.task_id) item.task_id = input.task_id;\n if (input.valid_until) item.valid_until = iso(input.valid_until);\n return item;\n}\n\nexport function buildHandoff(input: HandoffParams): HandoffItem {\n short(input.conversation_id, \"conversation_id\");\n const item: HandoffItem = {\n type: \"handoff\",\n idempotency_key: input.idempotency_key ?? uuidv7(),\n conversation_id: input.conversation_id,\n target: input.target,\n mode: input.mode ?? \"warm\",\n occurred_at: iso(input.occurred_at),\n };\n if (input.target_source) item.target_source = input.target_source;\n if (input.reason) item.reason = input.reason;\n return item;\n}\n\nexport function buildFeedback(input: FeedbackParams): FeedbackRequest {\n if (!FEEDBACK_ACTIONS.includes(input.action)) fail(`action must be one of ${FEEDBACK_ACTIONS.join(\", \")}`);\n if ((input.value?.length ?? 0) > 2000) fail(\"value is longer than 2000\");\n if ((input.reason?.length ?? 0) > 500) fail(\"reason is longer than 500\");\n const request: FeedbackRequest = {\n idempotency_key: input.idempotency_key ?? uuidv7(),\n subject: input.subject,\n action: input.action,\n };\n if (input.fact_id) request.fact_id = input.fact_id;\n if (input.open_item_id) request.open_item_id = input.open_item_id;\n if (input.conversation_id) request.conversation_id = input.conversation_id;\n if (input.value) request.value = input.value;\n if (input.reason) request.reason = input.reason;\n return request;\n}\n\nexport function buildConversationEnded(conversationId: string): ConversationEndedItem {\n return {\n type: \"conversation.ended\",\n idempotency_key: uuidv7(),\n conversation_id: conversationId,\n occurred_at: iso(undefined),\n };\n}\n\nexport function buildTaskEnded(taskId: string): TaskEndedItem {\n return { type: \"task.ended\", idempotency_key: uuidv7(), task_id: taskId, occurred_at: iso(undefined) };\n}\n\n/** Whether an event names who or what it is about. */\nexport function hasTarget(event: {\n handles?: readonly unknown[] | undefined;\n subjects?: readonly unknown[] | undefined;\n object_refs?: readonly unknown[] | undefined;\n}): boolean {\n return [event.handles, event.subjects, event.object_refs].some((list) => (list?.length ?? 0) > 0);\n}\n\nfunction defaultDirection(role: Speaker): \"inbound\" | \"outbound\" | undefined {\n if (role === \"customer\") return \"inbound\";\n if (role === \"ai_agent\" || role === \"human_agent\") return \"outbound\";\n return undefined;\n}\n\nfunction copyOptional(event: EventItem, input: EventBase): void {\n if (input.conversation_id) event.conversation_id = input.conversation_id;\n if (input.conversation_aliases?.length) event.conversation_aliases = input.conversation_aliases;\n if (input.task_id) event.task_id = input.task_id;\n if (input.handles?.length) event.handles = input.handles;\n if (input.subjects?.length) event.subjects = input.subjects;\n if (input.visibility) event.visibility = input.visibility;\n if (input.verification_hint) event.verification_hint = input.verification_hint;\n if (input.corrects_event_id) event.corrects_event_id = input.corrects_event_id;\n if (input.voice) event.voice = input.voice;\n if (input.context_stamp) {\n const { etag, injected_at } = input.context_stamp;\n event.context_stamp = etag ? { etag, injected_at: iso(injected_at) } : { injected_at: iso(injected_at) };\n }\n}\n\n/** `fields` can hold anything; a value JSON cannot encode would poison the whole batch. */\nfunction assertSerializable(event: EventItem): void {\n try {\n JSON.stringify(event);\n } catch {\n fail(\"event is not JSON-serializable (check `fields` for BigInt or circular values)\");\n }\n}\n","import { renderSuffix } from \"./context.js\";\nimport type { ContextResult } from \"./context.js\";\nimport type { ContextResponse } from \"./types/context.js\";\nimport type { ContextStamp, SpeakerRef } from \"./types/events.js\";\nimport type { Speaker } from \"./types/vocabulary.js\";\n\n/** Bounds the suffix of a very long conversation; the oldest deltas go first. */\nconst MAX_DELTAS = 20;\n\n/** When context first went into the prompt, and when the agent first spoke. */\nexport interface Timings {\n contextInjectedAt: Date | null;\n firstAgentTurnAt: Date | null;\n}\n\n/**\n * What a conversation and a task keep between turns: the deltas received against the pack the\n * server pinned for them, and the stamp of the last context that went into the prompt.\n *\n * The server sends each delta once, relative to what this agent last read, so the deltas are\n * kept, in order, for as long as the pack stays the same. A new pack (after a verification,\n * say) already includes them, and so does the delta that arrives with it: both are dropped.\n */\nexport class SessionState {\n private etag: string | null = null;\n private deltas: string[] = [];\n private stamp: ContextStamp | null = null;\n private firstInjection: Date | null = null;\n private firstAgentTurn: Date | null = null;\n private last: ContextResult | null = null;\n\n /** After the first pack, every read also asks what changed since. */\n get wantsDelta(): boolean {\n return this.etag !== null;\n }\n\n get lastContext(): ContextResult | null {\n return this.last;\n }\n\n get contextStamp(): ContextStamp | null {\n return this.stamp;\n }\n\n get timings(): Timings {\n return { contextInjectedAt: this.firstInjection, firstAgentTurnAt: this.firstAgentTurn };\n }\n\n /** Folds one `context()` result into the session and returns it with every delta since the pin. */\n absorb(result: ContextResult): ContextResult {\n const response = result.response;\n if (result.source === \"none\" || !response) {\n // Nothing is being served, not even the last good pack (a 401 or 403 lands here):\n // deltas mean nothing without the pack they are relative to.\n this.reset();\n } else if (response.etag !== this.etag) {\n this.etag = response.etag;\n this.deltas = [];\n } else if (response.delta && !this.deltas.includes(response.delta)) {\n this.deltas = [...this.deltas, response.delta].slice(-MAX_DELTAS);\n }\n const absorbed = response ? withDeltas(result, response, this.deltas) : result;\n this.last = absorbed;\n return absorbed;\n }\n\n /** Starts over from the next pack the server pins, as after a raised verification level. */\n reset(): void {\n this.etag = null;\n this.deltas = [];\n }\n\n markInjected(context: ContextResult | null | undefined, at: Date): void {\n const etag = (context ?? this.last)?.response?.etag;\n this.firstInjection ??= at;\n this.stamp = etag ? { etag, injected_at: at.toISOString() } : { injected_at: at.toISOString() };\n }\n\n /** Notes an agent turn and returns the stamp it carries, if context went in before it. */\n agentTurn(): ContextStamp | null {\n this.firstAgentTurn ??= new Date();\n return this.stamp;\n }\n\n /** The stamp for an action, which only the AI agent took on the injected context. */\n actionStamp(speaker: SpeakerRef | Speaker | undefined): ContextStamp | null {\n const role = typeof speaker === \"string\" ? speaker : (speaker?.role ?? \"ai_agent\");\n return role === \"ai_agent\" ? this.stamp : null;\n }\n}\n\nfunction withDeltas(result: ContextResult, response: ContextResponse, deltas: string[]): ContextResult {\n const merged = { ...response, delta: deltas.join(\"\\n\\n\") || null };\n return { ...result, response: merged, suffix: renderSuffix(merged) };\n}\n","/**\n * Reads what a model provider reported for one call: every input token, the ones read from the\n * provider's prompt cache and the ones written to it.\n *\n * Two shapes are understood, from the response or its `usage` (plain objects or class instances):\n *\n * - OpenAI chat completions and compatible gateways: `usage.prompt_tokens` (cached tokens included)\n * and `usage.prompt_tokens_details.cached_tokens`; the Responses API's `input_tokens` with\n * `input_tokens_details.cached_tokens` too. Gateways that pass Anthropic's cache fields through\n * (`cache_read_input_tokens`, `cache_creation_input_tokens`) are read as well.\n * - Anthropic messages: `usage.input_tokens` counts only the uncached rest, so the prompt is\n * `input_tokens + cache_read_input_tokens + cache_creation_input_tokens`.\n *\n * Nothing here throws: a response without usage gives `null`.\n */\n\nimport type { ModelUsage } from \"./types/events.js\";\n\ntype Bag = Record<PropertyKey, unknown>;\n\nconst PROVIDER = /^[a-z0-9][a-z0-9_.-]{0,63}$/;\nconst MODEL = /^[A-Za-z0-9][A-Za-z0-9_.:/@-]{0,127}$/;\n\nfunction get(value: unknown, name: string): unknown {\n return (typeof value === \"object\" || typeof value === \"function\") && value !== null\n ? (value as Bag)[name]\n : undefined;\n}\n\nfunction count(value: unknown): number | null {\n return typeof value === \"number\" && Number.isInteger(value) && value >= 0 ? value : null;\n}\n\n/** `prompt_tokens`, `cached_tokens` and `cache_write_tokens` from a provider's usage, or `null`. */\nexport function tokenCounts(\n usage: unknown,\n): Pick<ModelUsage, \"prompt_tokens\" | \"cached_tokens\" | \"cache_write_tokens\"> | null {\n const read = count(get(usage, \"cache_read_input_tokens\")) ?? 0;\n const written = count(get(usage, \"cache_creation_input_tokens\")) ?? 0;\n let prompt = count(get(usage, \"prompt_tokens\"));\n let cached: number;\n if (prompt !== null) {\n const reported = count(get(get(usage, \"prompt_tokens_details\"), \"cached_tokens\"));\n cached = reported !== null && reported > 0 ? reported : read;\n } else {\n const inputs = count(get(usage, \"input_tokens\"));\n if (inputs === null) return null;\n const details = get(usage, \"input_tokens_details\");\n if (details !== undefined && details !== null) {\n // The Responses API counts cached tokens inside `input_tokens`, as chat completions do.\n prompt = inputs;\n cached = count(get(details, \"cached_tokens\")) ?? 0;\n } else {\n prompt = inputs + read + written;\n cached = read;\n }\n }\n // A gateway can report a cache that does not fit its own prompt count; the prompt is at least that.\n return { prompt_tokens: Math.max(prompt, cached + written), cached_tokens: cached, cache_write_tokens: written };\n}\n\n/**\n * Who served the call: the router prefix of `vendor/model` names, else what the name or the usage\n * shape says, else `openai` (the client `wrap()` takes).\n */\nexport function providerOf(model: string, usage?: unknown): string {\n const slash = model.indexOf(\"/\");\n if (slash > 0) return model.slice(0, slash).trim().toLowerCase();\n const name = model.trim().toLowerCase();\n if (name.startsWith(\"claude\") || `.${name}`.includes(\".anthropic.\")) return \"anthropic\";\n if (name.startsWith(\"gemini\")) return \"google\";\n if (get(usage, \"prompt_tokens\") === undefined && get(usage, \"cache_read_input_tokens\") !== undefined) {\n return \"anthropic\";\n }\n return \"openai\";\n}\n\n/**\n * The usage of an OpenAI or Anthropic response (or of its bare `usage`, with `options.model`), for\n * the agent's turn: `convo.agent(text, { usage: modelUsage(response) })`. `null` without usage.\n */\nexport function modelUsage(\n response: unknown,\n options: { provider?: string; model?: string } = {},\n): ModelUsage | null {\n try {\n let usage = get(response, \"usage\");\n if (usage === undefined || usage === null || typeof usage !== \"object\") usage = response;\n const counts = tokenCounts(usage);\n const name = options.model ?? get(response, \"model\");\n if (!counts || typeof name !== \"string\" || !MODEL.test(name)) return null;\n const provider = (options.provider ?? providerOf(name, usage)).toLowerCase();\n if (!PROVIDER.test(provider)) return null;\n return { provider, model: name, ...counts };\n } catch {\n return null;\n }\n}\n\n/** A `ModelUsage` as given, or read from a provider's response; `null` when neither works. */\nexport function asModelUsage(value: unknown): ModelUsage | null {\n if (value === undefined || value === null) return null;\n if (isModelUsage(value)) return value;\n return modelUsage(value);\n}\n\n/** A `ModelUsage` the server accepts as it is; anything else is read like a provider's usage. */\nfunction isModelUsage(value: unknown): value is ModelUsage {\n const provider = get(value, \"provider\");\n const model = get(value, \"model\");\n const prompt = count(get(value, \"prompt_tokens\"));\n const cached = get(value, \"cached_tokens\") === undefined ? 0 : count(get(value, \"cached_tokens\"));\n const written = get(value, \"cache_write_tokens\") === undefined ? 0 : count(get(value, \"cache_write_tokens\"));\n return (\n typeof provider === \"string\" &&\n PROVIDER.test(provider) &&\n typeof model === \"string\" &&\n MODEL.test(model) &&\n prompt !== null &&\n cached !== null &&\n written !== null &&\n cached + written <= prompt\n );\n}\n","import type { Niadra, WriteResult } from \"./client.js\";\nimport type { ContextOptions, ContextParams, ContextResult } from \"./context.js\";\nimport { uuidv7 } from \"./ids.js\";\nimport { hasTarget } from \"./items.js\";\nimport type { ActionEvent, Timestamp, TrackEvent } from \"./items.js\";\nimport type { Logger } from \"./logger.js\";\nimport { SessionState } from \"./session.js\";\nimport type { Timings } from \"./session.js\";\nimport type { BoundTools, ToolBinding } from \"./tools.js\";\nimport type { Handle } from \"./types/common.js\";\nimport type { TargetModel } from \"./types/context.js\";\nimport type { Content, ContextStamp, ModelUsage, VoiceInfo } from \"./types/events.js\";\nimport { asModelUsage } from \"./usage.js\";\nimport type { Speaker, Verification, VerifyMethod, View, Visibility } from \"./types/vocabulary.js\";\n\nexport interface ConversationParams {\n /** The customer on the other side. */\n subject: Handle;\n /** Where the conversation happens, such as `whatsapp` or `voice`. */\n channel: string;\n /** Your id for the thread. A UUIDv7 is minted when omitted. */\n conversation_id?: string;\n /** Defaults to `voice` when the channel is `voice`, otherwise `chat`. */\n view?: View;\n /** The level already proven when the conversation starts. Defaults to `V0`. */\n verification?: Verification;\n /** The account or partner the customer acts for. */\n about?: Handle;\n target?: TargetModel;\n}\n\n/** Optional details of one captured turn. */\nexport interface TurnOptions {\n /** The provider's message id, which makes retries of the same turn harmless. */\n idempotency_key?: string;\n occurred_at?: Timestamp;\n /** The agent or attendant id inside your system. */\n speaker_id?: string;\n visibility?: Visibility;\n /** Marks the text as a speech-to-text transcript with this confidence, between 0 and 1. */\n stt_confidence?: number;\n voice?: VoiceInfo;\n /** Overrides the stamp an agent turn would carry from `markInjected()`. */\n context_stamp?: ContextStamp;\n /**\n * Agent turns only: what the model provider reported for the call behind the answer, as the\n * provider's response (OpenAI or Anthropic) or a `ModelUsage`. `wrap()` passes it for you. A\n * response without usage is left out; the turn is recorded either way.\n */\n usage?: ModelUsage | object | null;\n}\n\nexport type ConversationEvent = Omit<TrackEvent, \"channel\" | \"conversation_id\"> & { channel?: string };\nexport type ConversationAction = Omit<ActionEvent, \"channel\" | \"conversation_id\"> & { channel?: string };\n\nexport interface ConversationHooks {\n endConversation(id: string): Promise<WriteResult>;\n}\n\n/**\n * One customer conversation.\n *\n * The server pins the pack to the conversation: every turn gets the same bytes, so the prompt\n * prefix stays byte-identical and the model provider's prompt cache keeps hitting. After the\n * first pack, each read also asks for the delta, what changed since this agent last looked\n * (a new open item, an action another agent took). The server sends each delta once, so the\n * conversation keeps them, in order, in `suffix`, with the live turns, for the end of the\n * prompt. A successful `verify()` starts over from the pack the server pins for the new level.\n *\n * Call `markInjected()` when the pack goes into the prompt; the agent's later turns and actions\n * carry that moment and the pack's etag as `context_stamp`. `wrap()` does it for you.\n *\n * @example\n * const convo = niadra.conversation({ subject: handles.waId(\"5511987654321\"), channel: \"whatsapp\" });\n * convo.customer(inbound.text, { idempotency_key: inbound.id });\n * const ctx = await convo.context();\n * convo.markInjected(ctx);\n * const reply = await llm(ctx.text, history, ctx.suffix);\n * convo.agent(reply);\n */\nexport class Conversation {\n readonly id: string;\n readonly channel: string;\n readonly subject: Handle;\n private level: Verification;\n private readonly view: View;\n private readonly state = new SessionState();\n private ending: Promise<WriteResult> | null = null;\n\n constructor(\n private readonly client: Niadra,\n private readonly params: ConversationParams,\n private readonly hooks: ConversationHooks,\n ) {\n this.id = params.conversation_id ?? uuidv7();\n this.channel = params.channel;\n this.subject = params.subject;\n this.level = params.verification ?? \"V0\";\n this.view = params.view ?? (params.channel === \"voice\" ? \"voice\" : \"chat\");\n }\n\n /** The level in force for this conversation, raised by a successful `verify()`. */\n get verification(): Verification {\n return this.level;\n }\n\n /**\n * When context first went into the prompt, and when the agent first spoke. Context injected\n * after the agent's first turn is the \"late context\" signal the usage measurement reports.\n */\n get timings(): Timings {\n return this.state.timings;\n }\n\n /** What the agent's next turn and action carry: the last `markInjected()`, or `null`. */\n get contextStamp(): ContextStamp | null {\n return this.state.contextStamp;\n }\n\n /** The last result `context()` returned for this conversation. */\n get lastContext(): ContextResult | null {\n return this.state.lastContext;\n }\n\n /** Where `wrap()` reports what it swallowed: the client's logger. */\n get logger(): Logger {\n return this.client.logger;\n }\n\n /**\n * The pack for this turn: the pinned `text`, and a `suffix` with every delta since the pin\n * and the current live turns. A read with `query` is compiled for that query and never\n * pinned, so it leaves the conversation's deltas alone.\n */\n async context(options: ContextOptions & { query?: string } = {}): Promise<ContextResult> {\n const { query, ...requestOptions } = options;\n const params: ContextParams = {\n subject: this.subject,\n view: this.view,\n verification: this.level,\n conversation_id: this.id,\n ...(this.params.about ? { about: this.params.about } : {}),\n ...(this.params.target ? { target: this.params.target } : {}),\n };\n if (query) return this.client.context({ ...params, query }, requestOptions);\n if (this.state.wantsDelta) params.delta = true;\n return this.state.absorb(await this.client.context(params, requestOptions));\n }\n\n /**\n * Records that `context` (by default the last one this conversation returned) went into the\n * prompt. Call it each time you build the prompt; `timings.contextInjectedAt` keeps the first.\n */\n markInjected(context?: ContextResult | null, at: Date = new Date()): void {\n this.state.markInjected(context, at);\n }\n\n /** Captures what the customer said. */\n customer(text: string, options: TurnOptions = {}): string | null {\n return this.turn(\"customer\", text, options);\n }\n\n /** Captures what the AI agent said, stamped with the context its prompt carried. */\n agent(text: string, options: TurnOptions = {}): string | null {\n const stamp = this.state.agentTurn();\n return this.turn(\"ai_agent\", text, stamp ? { context_stamp: stamp, ...options } : options);\n }\n\n /** Captures what a human attendant said, for example after a handoff. */\n human(text: string, options: TurnOptions = {}): string | null {\n return this.turn(\"human_agent\", text, options);\n }\n\n /** Records any event in this conversation. The customer's handle is attached unless you pass your own. */\n track(event: ConversationEvent): string | null {\n return this.client.track({ ...this.bind(event), ...event, channel: event.channel ?? this.channel });\n }\n\n /** Records an action the agent took during this conversation, stamped like its turns. */\n action(event: ConversationAction): string | null {\n const stamp = this.state.actionStamp(event.speaker);\n return this.client.action({\n ...this.bind(event),\n ...(stamp ? { context_stamp: stamp } : {}),\n ...event,\n channel: event.channel ?? this.channel,\n });\n }\n\n /**\n * Records that the customer proved who they are, and raises the level for later reads.\n * `handle` defaults to the conversation's subject.\n */\n async verify(params: { method: VerifyMethod; level: Verification; handle?: Handle }): Promise<WriteResult> {\n const result = await this.client.verify({\n method: params.method,\n level: params.level,\n handle: params.handle ?? this.subject,\n conversation_id: this.id,\n });\n if (result.ok) {\n this.level = params.level;\n this.state.reset();\n }\n return result;\n }\n\n /** Records a transfer to a human or another agent. */\n handoff(params: {\n target: \"human\" | \"agent\";\n target_source?: string;\n reason?: string;\n mode?: \"warm\" | \"cold\";\n }): Promise<WriteResult> {\n return this.client.handoff({ ...params, conversation_id: this.id });\n }\n\n /**\n * The navigation kit bound to this customer and conversation. The verification level is\n * read at each call, so tools created before a `verify()` pick up the new level.\n */\n tools(): BoundTools {\n const read = (): Verification => this.level;\n const binding: ToolBinding = {\n conversation_id: this.id,\n voice: this.view === \"voice\",\n get verification() {\n return read();\n },\n };\n if (this.params.about) binding.about = this.params.about;\n return this.client.tools(this.subject, binding);\n }\n\n /** Emits `conversation.ended` and drops the conversation's cached packs. Safe to call twice. */\n end(): Promise<WriteResult> {\n this.ending ??= this.hooks.endConversation(this.id);\n return this.ending;\n }\n\n private bind(event: { handles?: Handle[]; subjects?: unknown[]; object_refs?: unknown[] }): {\n conversation_id: string;\n handles?: Handle[];\n } {\n const own = hasTarget(event);\n return own ? { conversation_id: this.id } : { conversation_id: this.id, handles: [this.subject] };\n }\n\n private turn(role: Speaker, text: string, options: TurnOptions): string | null {\n const transcript = options.stt_confidence !== undefined;\n const content: Content = transcript\n ? { type: \"audio\", transcript: text, stt_confidence: options.stt_confidence ?? null }\n : { type: \"text\", text };\n const event: TrackEvent = {\n channel: this.channel,\n conversation_id: this.id,\n handles: [this.subject],\n speaker: options.speaker_id ? { role, id: options.speaker_id } : { role },\n content,\n };\n if (options.idempotency_key) event.idempotency_key = options.idempotency_key;\n if (options.occurred_at) event.occurred_at = options.occurred_at;\n if (options.visibility) event.visibility = options.visibility;\n if (options.voice) event.voice = options.voice;\n if (options.context_stamp) event.context_stamp = options.context_stamp;\n const usage = role === \"ai_agent\" ? asModelUsage(options.usage) : null;\n if (usage) event.usage = usage;\n return this.client.track(event);\n }\n}\n","/**\n * Flushes queued events when a Node process runs out of work.\n *\n * `beforeExit` is the only exit event that allows asynchronous work, and it fires every time\n * the event loop drains, so a flush that finishes simply lets the process exit afterwards.\n * It does not fire on `process.exit()` or on signals: services that stop on SIGTERM should\n * call `shutdown()` in their own handler. The SDK never installs signal handlers, because\n * doing so would replace Node's default behaviour of exiting.\n *\n * Everything here is feature-detected, so edge runtimes without `process` skip it.\n */\n\ninterface Flushable {\n flush(): Promise<unknown>;\n}\n\ninterface NodeLikeProcess {\n on(event: \"beforeExit\", listener: () => void): unknown;\n removeListener(event: \"beforeExit\", listener: () => void): unknown;\n versions?: { node?: string };\n}\n\nconst registered = new Set<WeakRef<Flushable>>();\nlet installedOn: NodeLikeProcess | null = null;\n\nfunction nodeProcess(): NodeLikeProcess | null {\n const candidate = (globalThis as { process?: Partial<NodeLikeProcess> }).process;\n if (!candidate?.versions?.node) return null;\n if (typeof candidate.on !== \"function\" || typeof candidate.removeListener !== \"function\") return null;\n return candidate as NodeLikeProcess;\n}\n\nfunction onBeforeExit(): void {\n for (const ref of registered) {\n const client = ref.deref();\n if (client) {\n // Strict clients reject on a lost batch; unhandled here, that would change the exit code.\n client.flush().catch(() => undefined);\n } else {\n registered.delete(ref);\n }\n }\n}\n\n/**\n * Registers a client for the exit flush and returns the function that unregisters it. Clients\n * are held weakly, so one that is no longer referenced can still be garbage collected.\n */\nexport function registerExitFlush(client: Flushable): () => void {\n const proc = nodeProcess();\n if (!proc || typeof WeakRef === \"undefined\") return () => undefined;\n const ref = new WeakRef(client);\n registered.add(ref);\n if (!installedOn) {\n proc.on(\"beforeExit\", onBeforeExit);\n installedOn = proc;\n }\n return () => {\n registered.delete(ref);\n if (registered.size === 0 && installedOn) {\n installedOn.removeListener(\"beforeExit\", onBeforeExit);\n installedOn = null;\n }\n };\n}\n","import { NiadraValidationError } from \"./errors.js\";\nimport { MAX_MEDIA_BYTES } from \"./types/events.js\";\nimport type { Handle } from \"./types/common.js\";\nimport type { MediaUploadRequest } from \"./types/events.js\";\n\n/** Arguments of `uploadMedia()`. */\nexport interface UploadParams {\n /** The file itself. It is read into memory once, to hash it and send it. */\n data: Uint8Array | ArrayBuffer | Blob;\n /** Such as `audio/wav` or `image/png`. Storage checks it against the signed URL. */\n content_type: string;\n /**\n * Whose file it is, whenever you know. It is then stored under that person, so erasing them\n * erases it, even if no event ever references it.\n */\n subject?: Handle;\n}\n\n/** A file handed to Niadra. Put `media_ref` and `media_sha256` in the event's `content`. */\nexport interface MediaUpload {\n media_ref: string;\n media_sha256: string;\n content_type: string;\n size_bytes: number;\n expires_at: string | null;\n}\n\nexport interface PreparedUpload {\n bytes: Uint8Array<ArrayBuffer>;\n request: MediaUploadRequest;\n}\n\n/** Reads, checks and hashes the file, and builds the body of `POST /v1/media/uploads`. */\nexport async function prepareUpload(params: UploadParams): Promise<PreparedUpload> {\n if (!params.content_type || params.content_type.length > 256) {\n throw new NiadraValidationError(\"content_type must be 1 to 256 characters\");\n }\n const bytes = await readBytes(params.data);\n if (bytes.byteLength === 0 || bytes.byteLength > MAX_MEDIA_BYTES) {\n throw new NiadraValidationError(`media must be 1 byte to ${MAX_MEDIA_BYTES} bytes`);\n }\n const request: MediaUploadRequest = {\n content_type: params.content_type,\n size_bytes: bytes.byteLength,\n sha256: await sha256Hex(bytes),\n };\n if (params.subject) request.subject = params.subject;\n return { bytes, request };\n}\n\n/**\n * The bytes go straight to storage, so the URL must be HTTPS unless the API itself is not:\n * only the local emulator is served over plain HTTP, and anywhere else a downgrade would send\n * the customer's media in the clear.\n */\nexport function checkUploadURL(url: string, baseURL: string): void {\n const protocol = new URL(url).protocol;\n if (protocol === \"https:\" || (protocol === \"http:\" && new URL(baseURL).protocol === \"http:\")) return;\n throw new NiadraValidationError(\"the upload URL is not HTTPS\");\n}\n\nasync function readBytes(data: Uint8Array | ArrayBuffer | Blob): Promise<Uint8Array<ArrayBuffer>> {\n if (data instanceof ArrayBuffer) return new Uint8Array(data);\n if (data instanceof Uint8Array) {\n // A view over a SharedArrayBuffer cannot be a fetch body; only that case pays for a copy.\n return isPlain(data) ? data : new Uint8Array(data);\n }\n return new Uint8Array(await data.arrayBuffer());\n}\n\nfunction isPlain(view: Uint8Array): view is Uint8Array<ArrayBuffer> {\n return view.buffer instanceof ArrayBuffer;\n}\n\nasync function sha256Hex(bytes: Uint8Array<ArrayBuffer>): Promise<string> {\n const subtle = (globalThis as { crypto?: { subtle?: SubtleCrypto } }).crypto?.subtle;\n if (!subtle) throw new NiadraValidationError(\"uploadMedia() needs Web Crypto, which this runtime lacks\");\n const digest = new Uint8Array(await subtle.digest(\"SHA-256\", bytes));\n let hex = \"\";\n for (const byte of digest) hex += byte.toString(16).padStart(2, \"0\");\n return hex;\n}\n","import { NiadraValidationError } from \"./errors.js\";\nimport { toObjectRef } from \"./handles.js\";\nimport type { ObjectRef } from \"./types/common.js\";\n\n/** Paging of `objectTimeline()`. */\nexport interface ObjectTimelineParams {\n /** `next_cursor` from the previous page. */\n cursor?: string;\n /** Between 1 and 100. Defaults to 20. */\n limit?: number;\n}\n\n/**\n * `/v1/objects/{type}/{namespace}/{id}` for an object reference. The segments are system record\n * ids, never personal data, so they may go in the path. A slash cannot: the server's route would\n * split on it, even percent-encoded.\n */\nexport function objectPath(object: ObjectRef | string): string {\n const ref = toObjectRef(object);\n const segments = [ref.type, ref.namespace, ref.id];\n if (segments.some((segment) => !segment || segment.includes(\"/\"))) {\n throw new NiadraValidationError(\"object type, namespace and id must be non-empty and cannot contain a slash\");\n }\n return `/v1/objects/${segments.map(encodeURIComponent).join(\"/\")}`;\n}\n","/** The parts of a source key the SDK needs to find the right endpoint. */\nexport interface ParsedApiKey {\n /** `live` keys reach production spaces, `test` keys reach sandbox spaces. */\n mode: \"live\" | \"test\";\n /** Data region, such as `us-east-2`. */\n region: string;\n /** The space (project and environment) the key belongs to. */\n space: string;\n keyId: string;\n}\n\nconst PREFIX = \"nia_sk_\";\nconst DNS_LABEL = /^[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$/;\nconst KEY_ID = /^[A-Za-z0-9]+$/;\n\n/**\n * Parses `nia_sk_<live|test>_<region>_<space>_<key_id>_<secret>`.\n *\n * Region and space become DNS labels in the base URL, so they are held to lowercase letters,\n * digits and inner hyphens. The secret is everything after the fifth underscore and is never\n * returned. Returns `null` for anything that does not match, rather than guessing.\n */\nexport function parseApiKey(apiKey: string): ParsedApiKey | null {\n if (!apiKey.startsWith(PREFIX)) return null;\n const parts = apiKey.slice(PREFIX.length).split(\"_\");\n if (parts.length < 5) return null;\n const [mode, region, space, keyId] = parts as [string, string, string, string];\n const secret = parts.slice(4).join(\"_\");\n if (mode !== \"live\" && mode !== \"test\") return null;\n if (!DNS_LABEL.test(region) || !DNS_LABEL.test(space)) return null;\n if (!KEY_ID.test(keyId) || secret.length === 0) return null;\n return { mode, region, space, keyId };\n}\n\n/**\n * The stable address of a space: `https://<space>.<region>.api.niadra.com`. It never names a\n * cell; when a space moves between cells, the old cell answers 421 and the SDK retries.\n */\nexport function baseURLFromKey(key: ParsedApiKey): string {\n return `https://${key.space}.${key.region}.api.niadra.com`;\n}\n","/**\n * Where the SDK reports what it swallowed in fail-open mode. Messages carry status codes,\n * error codes and request ids, never handles, message text or other personal data.\n */\nexport interface Logger {\n debug(message: string, ...details: unknown[]): void;\n warn(message: string, ...details: unknown[]): void;\n error(message: string, ...details: unknown[]): void;\n}\n\nconst noop = (): void => undefined;\n\n/** Warnings and errors go to the console; debug output is off unless you pass your own logger. */\nexport const consoleLogger: Logger = {\n debug: noop,\n warn: (message, ...details) => {\n console.warn(`[niadra] ${message}`, ...details);\n },\n error: (message, ...details) => {\n console.error(`[niadra] ${message}`, ...details);\n },\n};\n\nexport const silentLogger: Logger = { debug: noop, warn: noop, error: noop };\n","import type { Logger } from \"./logger.js\";\n\n/**\n * Per-method time budgets in milliseconds. They are the SDK's own and deliberately short:\n * managed agent platforms allow 7 to 10 seconds per turn and self-hosted frameworks allow no\n * limit at all, so a slow memory call must never become a slow agent.\n */\nexport interface Timeouts {\n /** `context()` for every view except `voice`. */\n context: number;\n /** `context()` with `view: \"voice\"`, where the budget is a fraction of a spoken turn. */\n contextVoice: number;\n /** `search()`, `timeline()` and `open()`. */\n navigation: number;\n /** Navigation calls made through a voice conversation or voice-bound tools. */\n navigationVoice: number;\n /**\n * The whole of a write the caller waits for: `identify()`, `verify()`, `handoff()`,\n * `feedback()` and the reservation in `uploadMedia()`, retries included. Also each attempt\n * of a background batch, which never holds a caller.\n */\n write: number;\n /** `subjectToken()`, usually called once when a session starts. */\n token: number;\n /** The whole of sending media bytes to storage in `uploadMedia()`, retries included. */\n upload: number;\n}\n\nexport const DEFAULT_TIMEOUTS: Timeouts = {\n context: 300,\n contextVoice: 150,\n navigation: 600,\n navigationVoice: 300,\n write: 5_000,\n token: 2_000,\n upload: 60_000,\n};\n\n/** How `context()` reuses packs inside a conversation. */\nexport interface CacheOptions {\n /** A pack younger than this is returned without any request. */\n ttlMs: number;\n /**\n * After `ttlMs`, the cached pack is still returned at once for this long while a single\n * background request refreshes it.\n */\n staleWhileRevalidateMs: number;\n /**\n * Oldest pack the SDK will fall back to when a request fails. Older packs are dropped\n * rather than shown to a model as if they were current.\n */\n maxStaleMs: number;\n /** Least recently used packs are evicted past this many conversations. */\n maxEntries: number;\n}\n\nexport const DEFAULT_CACHE: CacheOptions = {\n ttlMs: 10_000,\n staleWhileRevalidateMs: 10 * 60_000,\n maxStaleMs: 30 * 60_000,\n maxEntries: 1_000,\n};\n\n/** How `track()` and the other write methods batch events on their way to `POST /v1/batch`. */\nexport interface QueueOptions {\n /** Send as soon as this many items are waiting. */\n flushAt: number;\n /** Send whatever is waiting at least this often. */\n flushIntervalMs: number;\n /**\n * Send a conversation turn (a message with a `conversation_id`) at most this long after it was\n * queued, with whatever else is waiting. It is what the other agents read in `live`.\n */\n turnFlushIntervalMs: number;\n /** Items per request. The server accepts up to 500. */\n maxBatchSize: number;\n /** Items held in memory before new ones are dropped. Keeps a long outage from exhausting memory. */\n maxQueueSize: number;\n /** Attempts per batch, including the first. 4xx answers other than 408, 421 and 429 are never retried. */\n maxAttempts: number;\n /** First backoff delay; each retry doubles it, with full jitter, up to `maxRetryDelayMs`. */\n retryDelayMs: number;\n maxRetryDelayMs: number;\n}\n\nexport const DEFAULT_QUEUE: QueueOptions = {\n flushAt: 15,\n flushIntervalMs: 1_000,\n turnFlushIntervalMs: 200,\n maxBatchSize: 100,\n maxQueueSize: 10_000,\n maxAttempts: 3,\n retryDelayMs: 250,\n maxRetryDelayMs: 5_000,\n};\n\nexport interface ClientOptions {\n /**\n * A source key, `nia_sk_<live|test>_<region>_<space>_<key_id>_<secret>`. Defaults to the\n * `NIADRA_API_KEY` environment variable where one exists. Without a key the client is a\n * no-op: every method resolves with an empty result and nothing is sent.\n */\n apiKey?: string | undefined;\n /**\n * Overrides the address derived from the key, for the local emulator or a private endpoint.\n * Defaults to `NIADRA_BASE_URL`, then to `https://<space>.<region>.api.niadra.com`.\n */\n baseURL?: string | undefined;\n timeouts?: Partial<Timeouts>;\n /** Pass `false` to send every `context()` call to the server. */\n cache?: Partial<CacheOptions> | false;\n queue?: Partial<QueueOptions>;\n /**\n * Throw errors instead of logging them and resolving with an empty result. Meant for tests\n * and development, where a silent failure hides a broken integration.\n */\n strict?: boolean;\n /** Flush queued events when a Node process is about to exit. Defaults to `true`. */\n flushOnExit?: boolean;\n /** A `fetch` implementation. Defaults to the global one. */\n fetch?: typeof fetch;\n logger?: Logger;\n /** Extra headers sent with every request. */\n defaultHeaders?: Record<string, string>;\n}\n","import { NiadraError, NiadraValidationError, toNiadraError } from \"./errors.js\";\nimport type { Logger } from \"./logger.js\";\nimport type { QueueOptions } from \"./options.js\";\nimport type { BatchItem, BatchResponse, HeartbeatItem } from \"./types/events.js\";\n\n/** Called once per item with `null` when the server accepted it, or the reason it did not. */\nexport type Settle = (error: NiadraError | null) => void;\n\ninterface Pending {\n item: BatchItem;\n settle?: Settle | undefined;\n}\n\nexport interface DrainReport {\n sent: number;\n failed: number;\n errors: NiadraError[];\n}\n\nconst HEARTBEAT_WINDOW_MS = 60_000;\n\n/**\n * A bounded in-memory queue in front of `POST /v1/batch`.\n *\n * Items leave in batches when `flushAt` of them are waiting, `flushIntervalMs` after the first\n * one was queued, or `turnFlushIntervalMs` after the first conversation turn was queued,\n * whichever comes first. Only one batch is in flight at a time, so items reach the server in\n * the order they were queued. A batch that still fails after its retries is dropped and logged:\n * holding it would let one bad outage grow the queue without bound.\n */\nexport class EventQueue {\n private items: Pending[] = [];\n private timer: ReturnType<typeof setTimeout> | null = null;\n private timerDueAt = Number.POSITIVE_INFINITY;\n private tail: Promise<unknown> = Promise.resolve();\n private closed = false;\n private droppedSinceWarning = 0;\n private windowStart: number;\n private sentInWindow = 0;\n\n constructor(\n private readonly send: (items: BatchItem[]) => Promise<BatchResponse>,\n private readonly options: QueueOptions,\n private readonly logger: Logger,\n private readonly now: () => number = Date.now,\n ) {\n this.windowStart = now();\n }\n\n /** Items waiting to be sent, not counting a batch already in flight. */\n get size(): number {\n return this.items.length;\n }\n\n /** Queues one item. Returns `false`, and settles it with an error, when the queue is full or closed. */\n push(item: BatchItem, settle?: Settle): boolean {\n if (this.closed || this.items.length >= this.options.maxQueueSize) {\n this.droppedSinceWarning++;\n if (this.droppedSinceWarning === 1) {\n this.logger.warn(this.closed ? \"client is shut down; dropping events\" : \"event queue is full; dropping events\");\n }\n settle?.(new NiadraError(this.closed ? \"client is shut down\" : \"event queue is full\"));\n return false;\n }\n this.droppedSinceWarning = 0;\n this.items.push({ item, settle });\n if (this.items.length >= this.options.flushAt) {\n this.flushInBackground();\n } else {\n const { flushIntervalMs, turnFlushIntervalMs } = this.options;\n this.schedule(isTurn(item) ? Math.min(turnFlushIntervalMs, flushIntervalMs) : flushIntervalMs);\n }\n return true;\n }\n\n /**\n * Sends everything queued so far and resolves when it is done. Concurrent calls are\n * serialized behind the batch already in flight rather than sending in parallel.\n */\n flush(): Promise<DrainReport> {\n this.cancelTimer();\n const run = this.tail.then(() => this.drain());\n this.tail = run.catch(() => undefined);\n return run;\n }\n\n /**\n * Starts a flush without waiting for it. Item failures are logged and settled inside the\n * drain, so only an unexpected error reaches this catch.\n */\n flushInBackground(): void {\n this.flush().catch((error: unknown) => {\n this.logger.error(`event flush failed: ${toNiadraError(error).message}`);\n });\n }\n\n /** Flushes, then refuses new items. */\n async close(): Promise<DrainReport> {\n const report = await this.flush();\n this.closed = true;\n this.cancelTimer();\n return report;\n }\n\n private async drain(): Promise<DrainReport> {\n const report: DrainReport = { sent: 0, failed: 0, errors: [] };\n while (this.items.length > 0) {\n const batch = this.items.splice(0, this.options.maxBatchSize);\n const heartbeat = this.heartbeat();\n const wire = batch.map((pending) => pending.item);\n if (heartbeat) wire.push(heartbeat);\n await this.sendBatch(batch, wire, report);\n }\n return report;\n }\n\n private async sendBatch(batch: Pending[], wire: BatchItem[], report: DrainReport): Promise<void> {\n let response: BatchResponse;\n try {\n response = await this.send(wire);\n } catch (error) {\n const failure = toNiadraError(error);\n report.failed += batch.length;\n report.errors.push(failure);\n this.logger.warn(`dropped ${batch.length} events after retries: ${failure.message}`);\n for (const pending of batch) pending.settle?.(failure);\n return;\n }\n\n const rejected = new Map<number, NiadraError>();\n for (const itemError of response.errors) {\n const detail = itemError.detail ? `: ${itemError.detail}` : \"\";\n rejected.set(itemError.index, new NiadraValidationError(`${itemError.code}${detail}`));\n }\n if (rejected.size > 0) {\n const codes = [...new Set(response.errors.map((e) => e.code))].join(\", \");\n this.logger.warn(`server rejected ${rejected.size} of ${wire.length} items (${codes})`);\n }\n batch.forEach((pending, index) => {\n const error = rejected.get(index) ?? null;\n if (error) {\n report.failed++;\n report.errors.push(error);\n } else {\n report.sent++;\n this.sentInWindow++;\n }\n pending.settle?.(error);\n });\n }\n\n /**\n * Once a minute, the next batch carries the number of items sent in the previous window.\n * The server uses it to tell a source that went quiet from one whose events are being lost.\n */\n private heartbeat(): HeartbeatItem | null {\n const now = this.now();\n if (now - this.windowStart < HEARTBEAT_WINDOW_MS) return null;\n const item: HeartbeatItem = {\n type: \"heartbeat\",\n window_start: new Date(this.windowStart).toISOString(),\n sent: this.sentInWindow,\n };\n this.windowStart = now;\n this.sentInWindow = 0;\n return item;\n }\n\n /** Sends what is waiting in `delayMs`, unless a send is already due sooner. */\n private schedule(delayMs: number): void {\n const dueAt = this.now() + delayMs;\n if (this.timer !== null && this.timerDueAt <= dueAt) return;\n this.cancelTimer();\n this.timerDueAt = dueAt;\n this.timer = setTimeout(() => {\n this.timer = null;\n this.timerDueAt = Number.POSITIVE_INFINITY;\n this.flushInBackground();\n }, delayMs);\n unref(this.timer);\n }\n\n private cancelTimer(): void {\n if (this.timer === null) return;\n clearTimeout(this.timer);\n this.timer = null;\n this.timerDueAt = Number.POSITIVE_INFINITY;\n }\n}\n\n/** A message of a conversation: what the other agents read in `live` while it goes on. */\nexport function isTurn(item: BatchItem): boolean {\n return item.type === \"event\" && item.kind === \"message\" && Boolean(item.conversation_id);\n}\n\n/** In Node, a pending flush timer must not keep an otherwise finished process alive. */\nfunction unref(timer: unknown): void {\n if (typeof timer === \"object\" && timer !== null && \"unref\" in timer && typeof timer.unref === \"function\") {\n (timer as { unref(): void }).unref();\n }\n}\n","import type { Niadra, WriteResult } from \"./client.js\";\nimport type { ContextOptions, ContextParams, ContextResult } from \"./context.js\";\nimport type { TurnOptions } from \"./conversation.js\";\nimport { uuidv7 } from \"./ids.js\";\nimport { hasTarget } from \"./items.js\";\nimport type { ActionEvent, TrackEvent, VerifyParams } from \"./items.js\";\nimport type { Logger } from \"./logger.js\";\nimport { SessionState } from \"./session.js\";\nimport type { Timings } from \"./session.js\";\nimport type { BoundTools, ToolBinding } from \"./tools.js\";\nimport type { Handle, ObjectRef } from \"./types/common.js\";\nimport type { TargetModel } from \"./types/context.js\";\nimport type { ContextStamp } from \"./types/events.js\";\nimport type { Verification, VerifyMethod, View } from \"./types/vocabulary.js\";\nimport { asModelUsage } from \"./usage.js\";\n\nexport interface TaskParams {\n /** Your id for the task. A UUIDv7 is minted when omitted. */\n task_id?: string;\n /** The internal agent or system doing the work, such as `billing-agent`. */\n channel: string;\n /** The person the task is about. Pass this, `object`, or both. */\n subject?: Handle;\n /** The business object the task is about, as an `ObjectRef` or `type:namespace:id`. */\n object?: ObjectRef | string;\n about?: Handle;\n /** A task view such as `task:billing`. Defaults to `brief`. */\n view?: View;\n verification?: Verification;\n target?: TargetModel;\n}\n\nexport type TaskEvent = Omit<TrackEvent, \"channel\" | \"task_id\"> & { channel?: string };\nexport type TaskAction = Omit<ActionEvent, \"channel\" | \"task_id\"> & { channel?: string };\n\nexport interface TaskHooks {\n endTask(id: string): Promise<WriteResult>;\n /** `verify()` for a task, which may have no subject to default the handle to. */\n verifyTask(params: Omit<VerifyParams, \"handle\"> & { handle: Handle | undefined }): Promise<WriteResult>;\n}\n\n/**\n * One unit of work by an internal agent: a collection run, a ticket triage, a refund. The task\n * plays the role a conversation plays for customer-facing agents: the server pins its pack,\n * deltas arrive and are kept the same way, it scopes the context cache, groups the events for\n * billing and closes with `task.ended`. Without `end()`, the server closes the task after 10\n * minutes of inactivity.\n */\nexport class Task {\n readonly id: string;\n private readonly object: ObjectRef | string | null;\n private level: Verification | undefined;\n private readonly state = new SessionState();\n private ending: Promise<WriteResult> | null = null;\n\n constructor(\n private readonly client: Niadra,\n private readonly params: TaskParams,\n private readonly hooks: TaskHooks,\n ) {\n this.id = params.task_id ?? uuidv7();\n // Kept raw so a malformed shorthand fails open in context() and track() instead of throwing here.\n this.object = params.object ?? null;\n this.level = params.verification;\n }\n\n /** When context first went into the prompt, and when the agent first acted. */\n get timings(): Timings {\n return this.state.timings;\n }\n\n /** What the agent's next turn and action carry: the last `markInjected()`, or `null`. */\n get contextStamp(): ContextStamp | null {\n return this.state.contextStamp;\n }\n\n /** The last result `context()` returned for this task. */\n get lastContext(): ContextResult | null {\n return this.state.lastContext;\n }\n\n /** Where `wrap()` reports what it swallowed: the client's logger. */\n get logger(): Logger {\n return this.client.logger;\n }\n\n /**\n * Context for the task, centered on its object when it has one, otherwise on its subject.\n * Resolves with an empty result, never rejects, unless the client is strict.\n */\n async context(options: ContextOptions & { query?: string } = {}): Promise<ContextResult> {\n const { query, ...requestOptions } = options;\n const target = this.object ? { object: this.object } : this.params.subject ? { subject: this.params.subject } : {};\n const params: ContextParams = {\n ...target,\n view: this.params.view ?? \"brief\",\n task_id: this.id,\n ...(this.params.about ? { about: this.params.about } : {}),\n ...(this.level ? { verification: this.level } : {}),\n ...(this.params.target ? { target: this.params.target } : {}),\n };\n if (query) return this.client.context({ ...params, query }, requestOptions);\n if (this.state.wantsDelta) params.delta = true;\n return this.state.absorb(await this.client.context(params, requestOptions));\n }\n\n /** Records that `context` (by default the last one this task returned) went into the prompt. */\n markInjected(context?: ContextResult | null, at: Date = new Date()): void {\n this.state.markInjected(context, at);\n }\n\n /** Captures what the agent answered, stamped with the context its prompt carried. */\n agent(text: string, options: TurnOptions = {}): string | null {\n const stamp = this.state.agentTurn();\n const event: TaskEvent = {\n ...this.bind({}),\n speaker: options.speaker_id ? { role: \"ai_agent\", id: options.speaker_id } : \"ai_agent\",\n text,\n };\n const context_stamp = options.context_stamp ?? stamp;\n if (context_stamp) event.context_stamp = context_stamp;\n if (options.idempotency_key) event.idempotency_key = options.idempotency_key;\n if (options.occurred_at) event.occurred_at = options.occurred_at;\n if (options.visibility) event.visibility = options.visibility;\n const usage = asModelUsage(options.usage);\n if (usage) event.usage = usage;\n return this.track(event);\n }\n\n /**\n * Records that the person the task is about proved who they are, and reads at the new level\n * from then on. `handle` defaults to the task's subject.\n */\n async verify(params: { method: VerifyMethod; level: Verification; handle?: Handle }): Promise<WriteResult> {\n const handle = params.handle ?? this.params.subject;\n const result = await this.hooks.verifyTask({ method: params.method, level: params.level, handle, task_id: this.id });\n if (result.ok) {\n this.level = params.level;\n this.state.reset();\n }\n return result;\n }\n\n /** Records an event in this task, attaching the task's subject and object unless you pass your own. */\n track(event: TaskEvent): string | null {\n return this.client.track({ ...this.bind(event), ...event, channel: event.channel ?? this.params.channel });\n }\n\n /** Records an action taken in a system of record, such as `credit` on an invoice, stamped like its turns. */\n action(event: TaskAction): string | null {\n const stamp = this.state.actionStamp(event.speaker);\n return this.client.action({\n ...this.bind(event),\n ...(stamp ? { context_stamp: stamp } : {}),\n ...event,\n channel: event.channel ?? this.params.channel,\n });\n }\n\n /**\n * The navigation kit bound to the task's subject, or `null` for a task about an object only.\n * The verification level is read at each call, so tools created before a `verify()` pick up\n * the new level.\n */\n tools(): BoundTools | null {\n const subject = this.params.subject;\n if (!subject) return null;\n const read = (): Verification => this.level ?? \"V0\";\n const binding: ToolBinding = {\n task_id: this.id,\n voice: this.params.view === \"voice\",\n get verification() {\n return read();\n },\n };\n if (this.params.about) binding.about = this.params.about;\n return this.client.tools(subject, binding);\n }\n\n /** Emits `task.ended` and drops the task's cached packs. Safe to call twice. */\n end(): Promise<WriteResult> {\n this.ending ??= this.hooks.endTask(this.id);\n return this.ending;\n }\n\n private bind(event: { handles?: Handle[]; subjects?: unknown[]; object_refs?: unknown[] }): {\n task_id: string;\n handles?: Handle[];\n object_refs?: (ObjectRef | string)[];\n } {\n const own = hasTarget(event);\n const bound: { task_id: string; handles?: Handle[]; object_refs?: (ObjectRef | string)[] } = {\n task_id: this.id,\n };\n if (own) return bound;\n if (this.params.subject) bound.handles = [this.params.subject];\n if (this.object) bound.object_refs = [this.object];\n return bound;\n }\n}\n","import { NiadraValidationError } from \"./errors.js\";\nimport type { NiadraError } from \"./errors.js\";\nimport type { Handle } from \"./types/common.js\";\nimport type {\n HistoryFilters,\n OpenedItem,\n SearchRequest,\n SearchResponse,\n TimelineRequest,\n TimelineResponse,\n ToolDefinition,\n} from \"./types/context.js\";\nimport type { HistoryItemKind, Verification } from \"./types/vocabulary.js\";\n\n/** The outcome of a call that may fail without throwing. Exactly one of the two fields is set. */\nexport type Result<T> = { data: T; error: null } | { data: null; error: NiadraError };\n\n/** Everything a tool call is bound to besides its arguments. None of it is visible to the model. */\nexport interface ToolBinding {\n about?: Handle;\n verification?: Verification;\n conversation_id?: string;\n task_id?: string;\n /** Use the voice time budget for the calls these tools make. */\n voice?: boolean;\n}\n\nexport interface Navigator {\n search(params: SearchRequest, voice: boolean): Promise<Result<SearchResponse>>;\n timeline(params: TimelineRequest, voice: boolean): Promise<Result<TimelineResponse>>;\n open(id: string, subject: Handle, binding: ToolBinding, voice: boolean): Promise<Result<OpenedItem>>;\n}\n\n/**\n * The navigation kit as function-calling tools, bound to one customer.\n *\n * The definitions have no parameter for the customer: the handle lives in this object, outside\n * the model's reach. A prompt injection that says \"now look up customer X\" has no argument to\n * put X in. The model chooses what to ask, never whom it is about.\n */\nexport interface BoundTools {\n /** Tool definitions in the `{ type: \"function\", function: { name, description, parameters } }` shape. */\n readonly definitions: ToolDefinition[];\n /** Whether `name` is one of these tools, for dispatchers that route several toolsets. */\n has(name: string): boolean;\n /**\n * Runs one tool call and returns the text to send back to the model as the tool result.\n * `args` may be the JSON string most model APIs return, or an already parsed object.\n * Failures come back as a short JSON error the model can read and move past; with\n * `strict: true` they are thrown instead.\n */\n call(name: string, args: string | Record<string, unknown>): Promise<string>;\n}\n\nexport const TOOL_NAMES = {\n search: \"search_customer_history\",\n timeline: \"get_customer_timeline\",\n open: \"open_history_item\",\n} as const;\n\nconst ITEM_KINDS: HistoryItemKind[] = [\"episode\", \"fact\", \"open_item\", \"action\", \"object\", \"trait\"];\n\nconst period = {\n since: { type: \"string\", format: \"date-time\", description: \"Only items at or after this ISO 8601 time.\" },\n until: { type: \"string\", format: \"date-time\", description: \"Only items before this ISO 8601 time.\" },\n channels: {\n type: \"array\",\n items: { type: \"string\" },\n description: \"Only these channels, such as whatsapp, voice, email.\",\n },\n item_kinds: {\n type: \"array\",\n items: { type: \"string\", enum: ITEM_KINDS },\n description: \"Only these kinds of history items.\",\n },\n};\n\nexport const TOOL_DEFINITIONS: readonly ToolDefinition[] = [\n {\n type: \"function\",\n function: {\n name: TOOL_NAMES.search,\n description:\n \"Search this customer's past conversations, actions and business objects by meaning and keywords. \" +\n \"Use it when the customer refers to something that happened before and the details are not in the \" +\n \"customer context you already have. Do not use it for facts already listed there. The result also \" +\n \"says how often the same kind of issue came back. To read one result in full, call open_history_item.\",\n parameters: {\n type: \"object\",\n properties: {\n query: { type: \"string\", description: \"What to look for, in the customer's own terms.\" },\n ...period,\n categories: { type: \"array\", items: { type: \"string\" }, description: \"Only these topics.\" },\n outcome: { type: \"string\", description: \"Only items with this outcome, such as resolved.\" },\n },\n required: [\"query\"],\n additionalProperties: false,\n },\n },\n },\n {\n type: \"function\",\n function: {\n name: TOOL_NAMES.timeline,\n description:\n \"List this customer's history, newest first, one line per item. Use it when you need \" +\n \"the sequence of events, for example what happened since a given date. Prefer \" +\n \"search_customer_history when you are looking for something specific.\",\n parameters: {\n type: \"object\",\n properties: {\n ...period,\n limit: { type: \"integer\", minimum: 1, maximum: 100, description: \"How many items. Defaults to 20.\" },\n cursor: { type: \"string\", description: \"The next_cursor of a previous page.\" },\n },\n additionalProperties: false,\n },\n },\n },\n {\n type: \"function\",\n function: {\n name: TOOL_NAMES.open,\n description:\n \"Open one history item returned by search_customer_history or get_customer_timeline: its summary, \" +\n \"what was requested, commitments made by either side, the outcome and the resolution. Only use ids \" +\n \"returned by those tools.\",\n parameters: {\n type: \"object\",\n properties: { id: { type: \"string\", description: \"The item id.\" } },\n required: [\"id\"],\n additionalProperties: false,\n },\n },\n },\n];\n\nfunction parseArgs(args: string | Record<string, unknown>): Record<string, unknown> {\n if (typeof args !== \"string\") return args;\n if (args.trim() === \"\") return {};\n let parsed: unknown;\n try {\n parsed = JSON.parse(args);\n } catch {\n throw new NiadraValidationError(\"tool arguments are not valid JSON\");\n }\n if (typeof parsed !== \"object\" || parsed === null || Array.isArray(parsed)) {\n throw new NiadraValidationError(\"tool arguments must be a JSON object\");\n }\n return parsed as Record<string, unknown>;\n}\n\nfunction str(args: Record<string, unknown>, name: string): string | undefined {\n const value = args[name];\n return typeof value === \"string\" && value.length > 0 ? value : undefined;\n}\n\nfunction strings(args: Record<string, unknown>, name: string): string[] | undefined {\n const value = args[name];\n if (!Array.isArray(value)) return undefined;\n const list = value.filter((entry): entry is string => typeof entry === \"string\");\n return list.length > 0 ? list : undefined;\n}\n\nfunction filtersFrom(args: Record<string, unknown>): HistoryFilters {\n const filters: HistoryFilters = {};\n const since = str(args, \"since\");\n const until = str(args, \"until\");\n const channels = strings(args, \"channels\");\n const categories = strings(args, \"categories\");\n const kinds = strings(args, \"item_kinds\")?.filter((kind): kind is HistoryItemKind =>\n (ITEM_KINDS as string[]).includes(kind),\n );\n const outcome = str(args, \"outcome\");\n if (since) filters.since = since;\n if (until) filters.until = until;\n if (channels) filters.channels = channels;\n if (categories) filters.categories = categories;\n if (kinds?.length) filters.item_kinds = kinds;\n if (outcome) filters.outcome = outcome;\n return filters;\n}\n\n/** Builds the bound toolset. `strict` decides whether failures are thrown or described to the model. */\nexport function bindTools(subject: Handle, binding: ToolBinding, navigator: Navigator, strict: boolean): BoundTools {\n const voice = binding.voice ?? false;\n const names = new Set<string>(Object.values(TOOL_NAMES));\n\n async function run(name: string, args: Record<string, unknown>): Promise<Result<unknown>> {\n switch (name) {\n case TOOL_NAMES.search: {\n const query = str(args, \"query\");\n if (!query) throw new NiadraValidationError(\"search_customer_history needs a query\");\n const request: SearchRequest = { subject, query, filters: filtersFrom(args) };\n applyBinding(request, binding);\n if (binding.task_id) request.task_id = binding.task_id;\n const result = await navigator.search(request, voice);\n return result.error ? result : { data: compactSearch(result.data), error: null };\n }\n case TOOL_NAMES.timeline: {\n const request: TimelineRequest = { subject, filters: filtersFrom(args) };\n applyBinding(request, binding);\n const cursor = str(args, \"cursor\");\n if (cursor) request.cursor = cursor;\n const limit = args.limit;\n if (typeof limit === \"number\" && Number.isInteger(limit)) request.limit = Math.min(100, Math.max(1, limit));\n return navigator.timeline(request, voice);\n }\n case TOOL_NAMES.open: {\n const id = str(args, \"id\");\n if (!id) throw new NiadraValidationError(\"open_history_item needs an id\");\n return navigator.open(id, subject, binding, voice);\n }\n default:\n throw new NiadraValidationError(`unknown tool: ${name}`);\n }\n }\n\n return {\n definitions: TOOL_DEFINITIONS.map((definition) => cloneDefinition(definition)),\n has: (name) => names.has(name),\n async call(name, rawArgs) {\n let result: Result<unknown>;\n try {\n result = await run(name, parseArgs(rawArgs));\n } catch (error) {\n if (strict) throw error;\n return JSON.stringify({ error: \"invalid_call\", detail: (error as Error).message });\n }\n if (result.error) {\n if (strict) throw result.error;\n return JSON.stringify({ error: \"unavailable\", detail: \"customer history is unavailable right now\" });\n }\n return JSON.stringify(result.data);\n },\n };\n}\n\nfunction applyBinding(request: SearchRequest | TimelineRequest, binding: ToolBinding): void {\n if (binding.about) request.about = binding.about;\n if (binding.verification) request.verification = binding.verification;\n if (binding.conversation_id) request.conversation_id = binding.conversation_id;\n}\n\n/** Token accounting is for the caller, not the model; everything else the model can use. */\nfunction compactSearch(response: SearchResponse): Omit<SearchResponse, \"tokens_used\"> {\n const { tokens_used: _, ...rest } = response;\n return rest;\n}\n\nfunction cloneDefinition(definition: ToolDefinition): ToolDefinition {\n return JSON.parse(JSON.stringify(definition)) as ToolDefinition;\n}\n","export const VERSION = \"0.1.1\";\n","import {\n NiadraAPIError,\n NiadraAbortError,\n NiadraConnectionError,\n NiadraError,\n NiadraTimeoutError,\n apiErrorFor,\n} from \"./errors.js\";\nimport type { Problem } from \"./types/common.js\";\nimport { VERSION } from \"./version.js\";\n\n/**\n * When a request may be sent again.\n *\n * Reads run against one deadline for the whole call and are only retried on 421, which means\n * the space just moved to another cell: the answer was not \"no\", it was \"not here\". Writes\n * give each attempt its own timeout and retry anything transient, because every batch item\n * carries an idempotency key and a repeat is harmless. A write someone waits on also carries\n * `totalMs`: every attempt and every wait between them ends by then.\n */\nexport type RetryPolicy =\n | { kind: \"read\"; maxAttempts: number }\n | { kind: \"write\"; maxAttempts: number; baseDelayMs: number; maxDelayMs: number; totalMs?: number };\n\ntype WritePolicy = Extract<RetryPolicy, { kind: \"write\" }>;\n\nexport interface RequestSpec {\n method: \"GET\" | \"POST\";\n path: string;\n query?: Record<string, string | undefined>;\n body?: unknown;\n timeoutMs: number;\n retry: RetryPolicy;\n signal?: AbortSignal | undefined;\n headers?: Record<string, string> | undefined;\n}\n\n/** Bytes for a pre-signed storage URL. The URL is the credential; nothing of the API's goes along. */\nexport interface UploadSpec {\n url: string;\n body: Uint8Array<ArrayBuffer>;\n /** Exactly the headers the signature covers, as the reservation named them. */\n headers: Record<string, string>;\n timeoutMs: number;\n retry: WritePolicy;\n signal?: AbortSignal | undefined;\n}\n\nexport interface TransportResponse<T> {\n status: number;\n data: T;\n requestId: string | null;\n}\n\nexport interface TransportConfig {\n baseURL: string;\n apiKey: string;\n fetch: typeof fetch;\n defaultHeaders: Record<string, string>;\n}\n\nconst RETRYABLE_WRITE_STATUS = new Set([408, 421, 429, 500, 502, 503, 504]);\nconst READ_421_ATTEMPTS = 3;\n\nexport const READ_POLICY: RetryPolicy = { kind: \"read\", maxAttempts: READ_421_ATTEMPTS };\n\nexport class Transport {\n private readonly baseURL: string;\n\n constructor(private readonly config: TransportConfig) {\n this.baseURL = config.baseURL.replace(/\\/+$/, \"\");\n }\n\n async request<T>(spec: RequestSpec): Promise<TransportResponse<T>> {\n return spec.retry.kind === \"read\" ? this.read<T>(spec, spec.retry) : this.write<T>(spec, spec.retry);\n }\n\n private async read<T>(spec: RequestSpec, policy: { maxAttempts: number }): Promise<TransportResponse<T>> {\n const deadline = new Deadline(spec.timeoutMs, spec.signal);\n try {\n for (let attempt = 1; ; attempt++) {\n try {\n return await this.send<T>(spec, deadline);\n } catch (error) {\n // The old cell closes the connection with its 421, so the retry reaches the new one.\n if (isStatus(error, 421) && attempt < policy.maxAttempts && !deadline.expired) continue;\n throw error;\n }\n }\n } finally {\n deadline.clear();\n }\n }\n\n private async write<T>(spec: RequestSpec, policy: WritePolicy): Promise<TransportResponse<T>> {\n return this.retrying(spec.timeoutMs, policy, spec.signal, (deadline) => this.send<T>(spec, deadline));\n }\n\n /**\n * Sends media bytes to the signed URL `POST /v1/media/uploads` returned, with the write retry\n * rules. Only the headers the reservation named go along: the signature covers them (content\n * type, and the digest the store checks the body against), and the key must never reach a\n * host other than the API.\n */\n async upload(spec: UploadSpec): Promise<void> {\n await this.retrying(spec.timeoutMs, spec.retry, spec.signal, (deadline) =>\n this.exchange<unknown>(\n spec.url,\n { method: \"PUT\", headers: spec.headers, body: spec.body, signal: deadline.signal },\n deadline,\n ),\n );\n }\n\n private async retrying<T>(\n timeoutMs: number,\n policy: WritePolicy,\n signal: AbortSignal | undefined,\n attempt: (deadline: Deadline) => Promise<T>,\n ): Promise<T> {\n const end = policy.totalMs === undefined ? Number.POSITIVE_INFINITY : Date.now() + policy.totalMs;\n for (let count = 1; ; count++) {\n const left = end - Date.now();\n if (left <= 0) throw new NiadraTimeoutError(policy.totalMs ?? timeoutMs);\n const deadline = new Deadline(Math.min(timeoutMs, left), signal);\n try {\n return await attempt(deadline);\n } catch (error) {\n if (count >= policy.maxAttempts || !isTransient(error)) throw error;\n const delay = retryDelay(error, count, policy.baseDelayMs, policy.maxDelayMs);\n if (Date.now() + delay >= end) throw error;\n await sleep(delay, signal);\n } finally {\n deadline.clear();\n }\n }\n }\n\n private async send<T>(spec: RequestSpec, deadline: Deadline): Promise<TransportResponse<T>> {\n const headers: Record<string, string> = {\n accept: \"application/json, application/problem+json\",\n authorization: `Bearer ${this.config.apiKey}`,\n \"x-niadra-sdk\": `js/${VERSION}`,\n ...this.config.defaultHeaders,\n ...spec.headers,\n };\n const init: RequestInit = { method: spec.method, headers, signal: deadline.signal };\n if (spec.body !== undefined) {\n headers[\"content-type\"] = \"application/json\";\n init.body = JSON.stringify(spec.body);\n }\n return this.exchange<T>(this.url(spec.path, spec.query), init, deadline);\n }\n\n private async exchange<T>(url: string, init: RequestInit, deadline: Deadline): Promise<TransportResponse<T>> {\n let response: Response;\n try {\n response = await this.config.fetch(url, init);\n } catch (error) {\n throw deadline.explain(error);\n }\n\n const requestId = response.headers.get(\"x-request-id\");\n let payload: unknown;\n try {\n payload = await readBody(response);\n } catch (error) {\n throw deadline.explain(error);\n }\n\n if (!response.ok) {\n throw apiErrorFor(\n response.status,\n asProblem(payload),\n requestId,\n parseRetryAfter(response.headers.get(\"retry-after\")),\n );\n }\n return { status: response.status, data: payload as T, requestId };\n }\n\n private url(path: string, query?: Record<string, string | undefined>): string {\n const url = `${this.baseURL}${path}`;\n if (!query) return url;\n const params = new URLSearchParams();\n for (const [name, value] of Object.entries(query)) {\n if (value !== undefined) params.set(name, value);\n }\n const encoded = params.toString();\n return encoded ? `${url}?${encoded}` : url;\n }\n}\n\n/**\n * One time budget, optionally tied to the caller's own signal. `AbortSignal.any` would do\n * this, but it is missing from Node 18 and several edge runtimes.\n */\nclass Deadline {\n readonly signal: AbortSignal;\n private readonly controller = new AbortController();\n private readonly timer: ReturnType<typeof setTimeout>;\n private readonly detach: () => void;\n private timedOut = false;\n\n constructor(\n private readonly timeoutMs: number,\n private readonly outer?: AbortSignal,\n ) {\n this.signal = this.controller.signal;\n this.timer = setTimeout(() => {\n this.timedOut = true;\n this.controller.abort();\n }, timeoutMs);\n const onAbort = (): void => {\n this.controller.abort();\n };\n if (outer?.aborted) this.controller.abort();\n outer?.addEventListener(\"abort\", onAbort, { once: true });\n this.detach = () => {\n outer?.removeEventListener(\"abort\", onAbort);\n };\n }\n\n get expired(): boolean {\n return this.signal.aborted;\n }\n\n clear(): void {\n clearTimeout(this.timer);\n this.detach();\n }\n\n explain(error: unknown): NiadraError {\n if (this.timedOut) return new NiadraTimeoutError(this.timeoutMs);\n if (this.outer?.aborted) return new NiadraAbortError(\"request aborted by the caller\", { cause: error });\n if (error instanceof NiadraError) return error;\n const message = error instanceof Error ? error.message : String(error);\n return new NiadraConnectionError(`connection failed: ${message}`, { cause: error });\n }\n}\n\nasync function readBody(response: Response): Promise<unknown> {\n const text = await response.text();\n if (text.length === 0) return null;\n const type = response.headers.get(\"content-type\") ?? \"\";\n if (!type.includes(\"json\")) return text;\n try {\n return JSON.parse(text) as unknown;\n } catch {\n return text;\n }\n}\n\nfunction asProblem(payload: unknown): Problem | null {\n if (typeof payload !== \"object\" || payload === null) return null;\n const candidate = payload as Partial<Problem>;\n if (typeof candidate.code !== \"string\" || typeof candidate.status !== \"number\") return null;\n return candidate as Problem;\n}\n\nfunction isStatus(error: unknown, status: number): boolean {\n return error instanceof NiadraAPIError && error.status === status;\n}\n\nfunction isTransient(error: unknown): boolean {\n if (error instanceof NiadraTimeoutError || error instanceof NiadraConnectionError) return true;\n return error instanceof NiadraAPIError && RETRYABLE_WRITE_STATUS.has(error.status);\n}\n\nfunction retryDelay(error: unknown, attempt: number, baseMs: number, maxMs: number): number {\n if (isStatus(error, 421)) return 0;\n if (error instanceof NiadraAPIError && error.retryAfterMs !== null) return Math.min(error.retryAfterMs, maxMs);\n const ceiling = Math.min(maxMs, baseMs * 2 ** (attempt - 1));\n return Math.round(ceiling / 2 + (Math.random() * ceiling) / 2);\n}\n\n/** `Retry-After` is either delay seconds or an HTTP date. */\nexport function parseRetryAfter(header: string | null): number | null {\n if (!header) return null;\n const seconds = Number(header);\n if (Number.isFinite(seconds)) return Math.max(0, seconds * 1000);\n const date = Date.parse(header);\n return Number.isNaN(date) ? null : Math.max(0, date - Date.now());\n}\n\nfunction sleep(ms: number, signal?: AbortSignal): Promise<void> {\n if (ms <= 0) return Promise.resolve();\n return new Promise((resolve, reject) => {\n const timer = setTimeout(() => {\n signal?.removeEventListener(\"abort\", onAbort);\n resolve();\n }, ms);\n const onAbort = (): void => {\n clearTimeout(timer);\n reject(new NiadraAbortError(\"request aborted by the caller\"));\n };\n signal?.addEventListener(\"abort\", onAbort, { once: true });\n });\n}\n","import { ContextCache } from \"./cache.js\";\nimport type { Revalidated } from \"./cache.js\";\nimport {\n buildContextRequest,\n cacheKey,\n cacheScope,\n emptyResult,\n mergeNotModified,\n resultFrom,\n} from \"./context.js\";\nimport type { ContextOptions, ContextParams, ContextResult, RequestOptions } from \"./context.js\";\nimport { Conversation } from \"./conversation.js\";\nimport type { ConversationParams } from \"./conversation.js\";\nimport {\n NiadraAPIError,\n NiadraAbortError,\n NiadraAuthenticationError,\n NiadraConfigError,\n NiadraError,\n NiadraPermissionError,\n NiadraTimeoutError,\n NiadraValidationError,\n toNiadraError,\n} from \"./errors.js\";\nimport { registerExitFlush } from \"./exit.js\";\nimport {\n buildAction,\n buildConversationEnded,\n buildEvent,\n buildFeedback,\n buildHandoff,\n buildIdentify,\n buildTaskEnded,\n buildVerify,\n} from \"./items.js\";\nimport { checkUploadURL, prepareUpload } from \"./media.js\";\nimport type { MediaUpload, UploadParams } from \"./media.js\";\nimport { objectPath } from \"./objects.js\";\nimport type { ObjectTimelineParams } from \"./objects.js\";\nimport type {\n ActionEvent,\n FeedbackParams,\n HandoffParams,\n IdentifyParams,\n TrackEvent,\n VerifyParams,\n} from \"./items.js\";\nimport { baseURLFromKey, parseApiKey } from \"./key.js\";\nimport { consoleLogger } from \"./logger.js\";\nimport type { Logger } from \"./logger.js\";\nimport { DEFAULT_CACHE, DEFAULT_QUEUE, DEFAULT_TIMEOUTS } from \"./options.js\";\nimport type { ClientOptions, Timeouts } from \"./options.js\";\nimport { EventQueue } from \"./queue.js\";\nimport { Task } from \"./task.js\";\nimport type { TaskParams } from \"./task.js\";\nimport { bindTools } from \"./tools.js\";\nimport type { BoundTools, Navigator, Result, ToolBinding } from \"./tools.js\";\nimport { READ_POLICY, Transport } from \"./transport.js\";\nimport type { RequestSpec, RetryPolicy } from \"./transport.js\";\nimport type { Handle, ObjectRef } from \"./types/common.js\";\nimport type {\n ContextRequest,\n ContextResponse,\n ObjectState,\n ObjectTimeline,\n OpenedItem,\n OpenItemRequest,\n SearchRequest,\n SearchResponse,\n TimelineRequest,\n TimelineResponse,\n} from \"./types/context.js\";\nimport type { BatchItem, BatchResponse, MediaUploadResponse } from \"./types/events.js\";\nimport type { SubjectToken, SubjectTokenRequest } from \"./types/tokens.js\";\nimport type { Verification } from \"./types/vocabulary.js\";\n\n/** What `identify()`, `verify()`, `handoff()` and the `end()` helpers resolve to. */\nexport type WriteResult =\n | { ok: true; idempotency_key: string; error: null }\n | { ok: false; idempotency_key: string | null; error: NiadraError };\n\n/** Scope of `open()`: the same verification and conversation the rest of the session uses. */\nexport interface OpenParams {\n verification?: Verification;\n conversation_id?: string;\n /** Kept for callers of 0.1.0; the server never read it on this route, so it is not sent. */\n task_id?: string;\n /**\n * The customer the item must belong to: the server opens it only when it is theirs, and answers\n * 404 otherwise. `tools()` passes the bound customer.\n */\n subject?: Handle;\n}\n\ninterface Core {\n transport: Transport;\n queue: EventQueue;\n cache: ContextCache | null;\n baseURL: string;\n /** How requests sent at once, outside the queue, are retried: like a batch. */\n writes: WritePolicy;\n}\n\ntype WritePolicy = Extract<RetryPolicy, { kind: \"write\" }>;\n\n/**\n * An environment variable, where the runtime has them. Deno without `--allow-env` throws on any\n * read of `process.env`, and a missing permission must not stop the client from being built.\n */\nfunction readEnv(name: string): string | undefined {\n try {\n const env = (globalThis as { process?: { env?: Record<string, string | undefined> } }).process?.env;\n const value = env?.[name];\n return value === \"\" ? undefined : value;\n } catch {\n return undefined;\n }\n}\n\nfunction describe(error: NiadraError): string {\n if (error instanceof NiadraAPIError) {\n return error.requestId ? `${error.message} (request ${error.requestId})` : error.message;\n }\n return `${error.name}: ${error.message}`;\n}\n\n/**\n * The Niadra client.\n *\n * Reads (`context`, `search`, `timeline`, `open`) run on the agent's hot path with short time\n * budgets of their own. Writes (`track` and friends) go through an in-memory queue and never\n * block the caller. By default every method is fail-open: an outage, a timeout or a bad\n * argument is logged and the method resolves with an empty result, so the agent keeps\n * working without memory rather than not working at all. Pass `strict: true` to throw instead.\n *\n * Create one client per process and share it; it holds the queue, the cache and the\n * connection pool.\n *\n * @example\n * const niadra = new Niadra({ apiKey: process.env.NIADRA_API_KEY });\n * const ctx = await niadra.context({ subject: handles.phone(\"+5511987654321\"), conversation_id: \"wa-8812\" });\n */\nexport class Niadra {\n /** `false` when the client was built without a usable key and sends nothing. */\n readonly enabled: boolean;\n private readonly core: Core | null;\n private readonly timeouts: Timeouts;\n private readonly strict: boolean;\n /** Where the client reports what it swallows in fail-open mode. */\n readonly logger: Logger;\n private readonly disabledReason: NiadraConfigError | null;\n private unregisterExit: () => void = () => undefined;\n\n constructor(options: ClientOptions = {}) {\n this.strict = options.strict ?? false;\n this.logger = options.logger ?? consoleLogger;\n this.timeouts = { ...DEFAULT_TIMEOUTS, ...options.timeouts };\n\n const setup = this.setup(options);\n if (setup instanceof NiadraConfigError) {\n if (this.strict) throw setup;\n this.logger.warn(`${setup.message}; the client is disabled and will send nothing`);\n this.core = null;\n this.enabled = false;\n this.disabledReason = setup;\n return;\n }\n\n this.core = setup;\n this.enabled = true;\n this.disabledReason = null;\n if (options.flushOnExit ?? true) this.unregisterExit = registerExitFlush(this);\n }\n\n private setup(options: ClientOptions): Core | NiadraConfigError {\n const apiKey = options.apiKey ?? readEnv(\"NIADRA_API_KEY\");\n if (!apiKey) return new NiadraConfigError(\"no API key: pass `apiKey` or set NIADRA_API_KEY\");\n\n let baseURL = options.baseURL ?? readEnv(\"NIADRA_BASE_URL\");\n if (!baseURL) {\n const parsed = parseApiKey(apiKey);\n if (!parsed) {\n return new NiadraConfigError(\n \"the API key does not look like nia_sk_<live|test>_<region>_<space>_<key_id>_<secret>; pass `baseURL` to use it anyway\",\n );\n }\n baseURL = baseURLFromKey(parsed);\n }\n\n const fetchImpl = options.fetch ?? (typeof fetch === \"function\" ? fetch.bind(globalThis) : undefined);\n if (!fetchImpl) return new NiadraConfigError(\"no fetch implementation: pass `fetch` on this runtime\");\n\n const transport = new Transport({\n baseURL,\n apiKey,\n fetch: fetchImpl,\n defaultHeaders: options.defaultHeaders ?? {},\n });\n const queueOptions = { ...DEFAULT_QUEUE, ...options.queue };\n // One slot of the server's 500-item limit stays free for the heartbeat.\n queueOptions.maxBatchSize = Math.min(queueOptions.maxBatchSize, 499);\n const queue = new EventQueue(\n (items) => this.sendBatch(transport, items, queueOptions.maxAttempts, queueOptions),\n queueOptions,\n this.logger,\n );\n const cache = options.cache === false ? null : new ContextCache({ ...DEFAULT_CACHE, ...options.cache });\n const writes: WritePolicy = {\n kind: \"write\",\n maxAttempts: queueOptions.maxAttempts,\n baseDelayMs: queueOptions.retryDelayMs,\n maxDelayMs: queueOptions.maxRetryDelayMs,\n };\n return { transport, queue, cache, baseURL, writes };\n }\n\n /**\n * The customer's context pack, to place in the system prompt before calling the model.\n *\n * Inside a conversation (`conversation_id` or `task_id`), packs are cached: a recent one is\n * returned without a request, an older one is returned at once while a single background\n * request refreshes it, and when a request fails the last good pack is returned instead.\n * A 401 or 403 is not an outage: it drops the cached packs, so revoking a key also stops\n * what the process had already cached from reaching the model.\n *\n * A plain read and a `delta` read of one conversation share the cached pack. The server\n * sends each delta once, and so does the cache, even one a background refresh brought in;\n * `conversation()` and `task()` keep them across turns.\n *\n * Never rejects unless `strict` is set. On failure `text` is empty and `error` is set.\n */\n async context(params: ContextParams, options: ContextOptions = {}): Promise<ContextResult> {\n if (!this.core) return emptyResult(this.disabledReason);\n let request: ContextRequest;\n try {\n request = buildContextRequest(params);\n } catch (error) {\n return this.contextFailure(toNiadraError(error), null);\n }\n\n const timeout = options.timeout ?? (request.view === \"voice\" ? this.timeouts.contextVoice : this.timeouts.context);\n const cache = options.cache === false ? null : this.core.cache;\n const scope = cacheScope(request);\n\n if (!cache || !scope) {\n try {\n const response = await this.fetchContext(this.core, request, timeout, options.signal, options.headers);\n return resultFrom(response, \"network\");\n } catch (error) {\n const failure = toNiadraError(error);\n this.observeAuth(failure, null);\n return this.contextFailure(failure, null);\n }\n }\n\n const key = cacheKey(request);\n const hit = cache.lookup(key);\n if (hit?.freshness === \"fresh\") return resultFrom(delivered(hit.response, cache.take(key)), \"cache\");\n if (hit?.freshness === \"stale\") {\n this.revalidate(this.core, cache, key, scope, request, timeout, options.headers).catch((error: unknown) => {\n this.logger.debug(`background context refresh failed: ${describe(toNiadraError(error))}`);\n });\n return resultFrom(delivered(hit.response, cache.take(key)), \"stale\");\n }\n\n try {\n const pending = this.revalidate(this.core, cache, key, scope, request, timeout, options.headers);\n const { response, source } = await abortable(pending, options.signal);\n return resultFrom(delivered(response, cache.take(key)), source);\n } catch (error) {\n const failure = toNiadraError(error);\n const fallback = cache.lookup(key);\n return this.contextFailure(failure, fallback ? delivered(fallback.response, cache.take(key)) : null);\n }\n }\n\n /**\n * Searches the customer's history by keywords and meaning, with filters by period, channel,\n * topic and kind. The answer includes how often the same kind of issue came back.\n */\n async search(params: SearchRequest, options: RequestOptions = {}): Promise<Result<SearchResponse>> {\n return this.navigate(() => {\n if (!params.query || params.query.length > 2000) {\n throw new NiadraValidationError(\"query must be 1 to 2000 characters\");\n }\n return this.readSpec(\"POST\", \"/v1/history/search\", params, this.timeouts.navigation, options);\n });\n }\n\n /** The customer's history, newest first, one line per item, paginated by cursor. */\n async timeline(params: TimelineRequest, options: RequestOptions = {}): Promise<Result<TimelineResponse>> {\n return this.navigate(() =>\n this.readSpec(\"POST\", \"/v1/history/timeline\", params, this.timeouts.navigation, options),\n );\n }\n\n /**\n * Opens one history item from `search()` or `timeline()`: summary, request, commitments,\n * outcome and resolution. Sent as `POST /v1/history/open`: the conversation id and `subject` go\n * in the body, never in a URL.\n */\n async open(id: string, params: OpenParams = {}, options: RequestOptions = {}): Promise<Result<OpenedItem>> {\n return this.navigate(() => {\n if (!id) throw new NiadraValidationError(\"open() needs an item id\");\n const body: OpenItemRequest = { item_id: id };\n if (params.subject) body.subject = params.subject;\n if (params.verification) body.verification = params.verification;\n if (params.conversation_id) body.conversation_id = params.conversation_id;\n return this.readSpec(\"POST\", \"/v1/history/open\", body, this.timeouts.navigation, options);\n });\n }\n\n /**\n * The derived state of a business object: what its systems of record reported last, `as_of`\n * when, and its open items, under this source's purpose.\n *\n * @example\n * const { data: invoice } = await niadra.objectState(\"invoice:erp:0823\");\n */\n async objectState(object: ObjectRef | string, options: RequestOptions = {}): Promise<Result<ObjectState>> {\n return this.navigate(() => this.readSpec(\"GET\", objectPath(object), undefined, this.timeouts.navigation, options));\n }\n\n /**\n * System events and agent actions about one object, newest first, one line each and never\n * conversation content. Pass `next_cursor` back as `cursor` to go on.\n */\n async objectTimeline(\n object: ObjectRef | string,\n params: ObjectTimelineParams = {},\n options: RequestOptions = {},\n ): Promise<Result<ObjectTimeline>> {\n return this.navigate(() => {\n const limit = params.limit ?? 20;\n if (!Number.isInteger(limit) || limit < 1 || limit > 100) {\n throw new NiadraValidationError(\"limit must be between 1 and 100\");\n }\n const path = `${objectPath(object)}/timeline`;\n const spec = this.readSpec(\"GET\", path, undefined, this.timeouts.navigation, options);\n spec.query = { cursor: params.cursor, limit: String(limit) };\n return spec;\n });\n }\n\n /**\n * The navigation kit as function-calling tools with the customer bound outside the model's\n * reach. Hand `definitions` to any model API and pass its tool calls to `call()`.\n *\n * @example\n * const kit = niadra.tools(handles.phone(\"+5511987654321\"), { conversation_id: \"wa-8812\" });\n * const output = await kit.call(toolCall.function.name, toolCall.function.arguments);\n */\n tools(subject: Handle, binding: ToolBinding = {}): BoundTools {\n const navigator: Navigator = {\n search: (params, voice) => this.search(params, this.voiceBudget(voice)),\n timeline: (params, voice) => this.timeline(params, this.voiceBudget(voice)),\n open: (id, customer, bound, voice) => {\n // The bound customer goes along, so the server opens only an item of theirs.\n const scope: OpenParams = { subject: customer };\n if (bound.verification) scope.verification = bound.verification;\n if (bound.conversation_id) scope.conversation_id = bound.conversation_id;\n return this.open(id, scope, this.voiceBudget(voice));\n },\n };\n return bindTools(subject, binding, navigator, this.strict);\n }\n\n /**\n * Mints a signed, 15-minute token that binds one customer to a session. Your backend calls\n * this and hands the token to the MCP connection, so tools served over MCP can only ever\n * read that customer. Resolves with `data: null` on failure.\n */\n async subjectToken(params: SubjectTokenRequest, options: RequestOptions = {}): Promise<Result<SubjectToken>> {\n return this.navigate(() => this.readSpec(\"POST\", \"/v1/subject-tokens\", params, this.timeouts.token, options));\n }\n\n /**\n * Records a message, a system event or an agent action. Returns at once with the event's\n * idempotency key, or `null` when the event was dropped: invalid, unserializable, the queue\n * full or the client disabled. Delivery happens in the background; `flush()` waits for it.\n */\n track(event: TrackEvent): string | null {\n return this.enqueue(() => buildEvent(event));\n }\n\n /**\n * Records what an agent did in a system of record, such as a credit or a reschedule.\n * With `closes`, the action also resolves the open item it fulfils.\n */\n action(event: ActionEvent): string | null {\n return this.enqueue(() => buildAction(event));\n }\n\n /**\n * States that several handles belong to the same subject. Sent right away rather than on the\n * next batch, so the next `context()` call already sees the merged profile.\n */\n identify(params: IdentifyParams): Promise<WriteResult> {\n return this.sendNow(() => buildIdentify(params));\n }\n\n /**\n * Raises the verification level of one conversation or task after the customer proved who\n * they are. Sent right away, and drops the conversation's cached packs, because a pack\n * compiled for the old level may be missing what the new level allows.\n */\n verify(params: VerifyParams): Promise<WriteResult> {\n return this.verifyWith(params);\n }\n\n /**\n * Corrects what Niadra derived about a subject: retracts or corrects a fact, resolves an open\n * item, or records how a conversation ended. Sent right away; the server records it as an\n * event, so the correction is audited like any other. A rejected correction resolves with\n * `ok: false`.\n */\n async feedback(params: FeedbackParams): Promise<WriteResult> {\n const core = this.core;\n if (!core) return { ok: false, idempotency_key: null, error: this.disabledError() };\n let key: string | null = null;\n try {\n const request = buildFeedback(params);\n key = request.idempotency_key;\n const response = await core.transport.request<Partial<BatchResponse> | null>({\n method: \"POST\",\n path: \"/v1/feedback\",\n body: request,\n headers: { \"idempotency-key\": key },\n timeoutMs: this.timeouts.write,\n retry: { ...core.writes, totalMs: this.timeouts.write },\n });\n const [rejected] = response.data?.errors ?? [];\n if (rejected) {\n throw new NiadraValidationError(`${rejected.code}${rejected.detail ? `: ${rejected.detail}` : \"\"}`);\n }\n return { ok: true, idempotency_key: key, error: null };\n } catch (error) {\n return { ok: false, idempotency_key: key, error: this.swallow(error, \"feedback\") };\n }\n }\n\n /**\n * Hands a file to Niadra, such as a call recording, and returns the reference its event\n * carries. Media never travels inside an event: this reserves an upload, sends the bytes\n * straight to storage over a short-lived signed URL, and resolves with `media_ref` and\n * `media_sha256` for the event's `content`.\n *\n * @example\n * const { data } = await niadra.uploadMedia({ data: recording, content_type: \"audio/wav\" });\n * if (data) convo.track({ speaker: \"customer\", content: { type: \"audio\", media_ref: data.media_ref, media_sha256: data.media_sha256 } });\n */\n async uploadMedia(params: UploadParams, options: { signal?: AbortSignal } = {}): Promise<Result<MediaUpload>> {\n const core = this.core;\n if (!core) return { data: null, error: this.disabledError() };\n try {\n const { bytes, request } = await prepareUpload(params);\n const reserved = await core.transport.request<Partial<MediaUploadResponse> | null>({\n method: \"POST\",\n path: \"/v1/media/uploads\",\n body: request,\n timeoutMs: this.timeouts.write,\n retry: { ...core.writes, totalMs: this.timeouts.write },\n signal: options.signal,\n });\n const media_ref = reserved.data?.media_ref;\n if (typeof media_ref !== \"string\") throw new NiadraError(\"unexpected response from /v1/media/uploads\");\n const url = reserved.data?.upload_url;\n if (url) {\n checkUploadURL(url, core.baseURL);\n await core.transport.upload({\n url,\n body: bytes,\n headers: uploadHeaders(reserved.data?.upload_headers, request.content_type),\n timeoutMs: this.timeouts.upload,\n retry: { ...core.writes, totalMs: this.timeouts.upload },\n signal: options.signal,\n });\n }\n return {\n data: {\n media_ref,\n media_sha256: request.sha256,\n content_type: request.content_type,\n size_bytes: request.size_bytes,\n expires_at: reserved.data?.expires_at ?? null,\n },\n error: null,\n };\n } catch (error) {\n return { data: null, error: this.swallow(error, \"media upload\") };\n }\n }\n\n /** Records a transfer to a human or another agent. Sent right away, so the receiver can read context at once. */\n handoff(params: HandoffParams): Promise<WriteResult> {\n return this.sendNow(() => buildHandoff(params));\n }\n\n /**\n * A helper for one customer conversation: pins the pack across turns, captures turns and\n * emits `conversation.ended` when you call `end()`.\n */\n conversation(params: ConversationParams): Conversation {\n return new Conversation(this, params, {\n endConversation: (id) => this.endScope(buildConversationEnded(id), `conversation:${id}`),\n });\n }\n\n /** A helper for one internal-agent task: binds `task_id` to reads and writes and emits `task.ended`. */\n task(params: TaskParams): Task {\n return new Task(this, params, {\n endTask: (id) => this.endScope(buildTaskEnded(id), `task:${id}`),\n verifyTask: (verify) => this.verifyWith(verify),\n });\n }\n\n /**\n * Sends every queued event and resolves when done. Call it before a serverless function\n * returns, or pass it to `waitUntil()` on edge runtimes. Rejects only with `strict` set.\n */\n async flush(): Promise<void> {\n if (!this.core) return;\n const report = await this.core.queue.flush();\n const [first] = report.errors;\n if (this.strict && first) throw first;\n }\n\n /**\n * Flushes, stops the background timer and releases the exit hook. Events tracked after\n * this are dropped. Call it from your own SIGTERM handler in long-running services.\n */\n async shutdown(): Promise<void> {\n this.unregisterExit();\n if (!this.core) return;\n const report = await this.core.queue.close();\n this.core.cache?.clear();\n const [first] = report.errors;\n if (this.strict && first) throw first;\n }\n\n private async verifyWith(params: Omit<VerifyParams, \"handle\"> & { handle: Handle | undefined }): Promise<WriteResult> {\n const result = await this.sendNow(() => buildVerify(params));\n if (result.ok) {\n if (params.conversation_id) this.forgetScope(`conversation:${params.conversation_id}`);\n if (params.task_id) this.forgetScope(`task:${params.task_id}`);\n }\n return result;\n }\n\n /** Throws under `strict`; otherwise logs what failed, never with content, and returns the error. */\n private swallow(error: unknown, what: string): NiadraError {\n const failure = toNiadraError(error);\n this.observeAuth(failure, null);\n if (this.strict) throw failure;\n this.logger.warn(`${what} failed: ${describe(failure)}`);\n return failure;\n }\n\n private voiceBudget(voice: boolean): RequestOptions {\n return voice ? { timeout: this.timeouts.navigationVoice } : {};\n }\n\n private readSpec(\n method: \"GET\" | \"POST\",\n path: string,\n body: unknown,\n defaultTimeout: number,\n options: RequestOptions,\n ): RequestSpec {\n const spec: RequestSpec = {\n method,\n path,\n timeoutMs: options.timeout ?? defaultTimeout,\n retry: READ_POLICY,\n signal: options.signal,\n headers: options.headers,\n };\n if (body !== undefined) spec.body = body;\n return spec;\n }\n\n private async navigate<T>(build: () => RequestSpec): Promise<Result<T>> {\n if (!this.core) return { data: null, error: this.disabledError() };\n try {\n const response = await this.core.transport.request<T>(build());\n return { data: response.data, error: null };\n } catch (error) {\n const failure = toNiadraError(error);\n this.observeAuth(failure, null);\n if (this.strict) throw failure;\n this.logger.warn(`read failed: ${describe(failure)}`);\n return { data: null, error: failure };\n }\n }\n\n private async fetchContext(\n core: Core,\n request: ContextRequest,\n timeout: number,\n signal: AbortSignal | undefined,\n headers: Record<string, string> | undefined,\n ): Promise<ContextResponse> {\n const response = await core.transport.request<unknown>(\n this.readSpec(\"POST\", \"/v1/context\", request, timeout, { signal, headers }),\n );\n return normalizeContext(response.data);\n }\n\n /**\n * One request for a key, shared by every caller that needs it meanwhile. It sends the\n * cached ETag, so an unchanged pack costs a `not_modified` answer instead of the full text.\n * The caller's signal is deliberately not passed down: other callers may be waiting too.\n */\n private revalidate(\n core: Core,\n cache: ContextCache,\n key: string,\n scope: string,\n request: ContextRequest,\n timeout: number,\n headers: Record<string, string> | undefined,\n ): Promise<Revalidated> {\n return cache.dedupe(key, async () => {\n const cached = cache.lookup(key);\n const generation = cache.generation;\n const body = cached ? { ...request, known_etag: cached.response.etag } : request;\n try {\n const response = await this.fetchContext(core, body, timeout, undefined, headers);\n // A degraded answer never replaces a good pack; the good one is served instead.\n if (response.degraded && !response.not_modified && cached) {\n return { response: cached.response, source: \"fallback\" };\n }\n const merged = response.not_modified && cached ? mergeNotModified(cached.response, response) : response;\n cache.store(key, scope, merged, generation);\n return { response: merged, source: \"network\" };\n } catch (error) {\n this.observeAuth(toNiadraError(error), key);\n throw error;\n }\n });\n }\n\n private contextFailure(error: NiadraError, fallback: ContextResponse | null): ContextResult {\n if (this.strict) throw error;\n if (fallback) {\n this.logger.warn(`context request failed, serving the last good pack: ${describe(error)}`);\n return resultFrom(fallback, \"fallback\", error);\n }\n this.logger.warn(`context unavailable: ${describe(error)}`);\n return emptyResult(error);\n }\n\n /**\n * 401 means the key itself is no longer valid, so every cached pack goes. 403 is specific to\n * what was asked, so only that pack goes.\n */\n private observeAuth(error: NiadraError, key: string | null): void {\n const cache = this.core?.cache;\n if (!cache) return;\n if (error instanceof NiadraAuthenticationError) cache.clear();\n else if (error instanceof NiadraPermissionError && key) cache.delete(key);\n }\n\n private forgetScope(scope: string): void {\n this.core?.cache?.deleteScope(scope);\n }\n\n private disabledError(): NiadraError {\n return this.disabledReason ?? new NiadraConfigError(\"client is disabled\");\n }\n\n private enqueue(build: () => BatchItem): string | null {\n if (!this.core) return null;\n let item: BatchItem;\n try {\n item = build();\n } catch (error) {\n const failure = toNiadraError(error);\n if (this.strict) throw failure;\n this.logger.warn(`event dropped: ${failure.message}`);\n return null;\n }\n const accepted = this.core.queue.push(item);\n return accepted && \"idempotency_key\" in item ? item.idempotency_key : null;\n }\n\n private sendNow(build: () => BatchItem & { idempotency_key: string }): Promise<WriteResult> {\n const core = this.core;\n if (!core) return Promise.resolve({ ok: false, idempotency_key: null, error: this.disabledError() });\n let item: BatchItem & { idempotency_key: string };\n try {\n item = build();\n } catch (error) {\n const failure = toNiadraError(error);\n if (this.strict) return Promise.reject(failure);\n this.logger.warn(`write dropped: ${failure.message}`);\n return Promise.resolve({ ok: false, idempotency_key: null, error: failure });\n }\n return new Promise<WriteResult>((resolve, reject) => {\n const key = item.idempotency_key;\n let settled = false;\n // The caller waits at most `timeouts.write`. Past it the item stays in the queue, which\n // keeps sending it with its own retries.\n const timer = setTimeout(() => {\n this.logger.warn(`write not confirmed within ${this.timeouts.write} ms; it stays queued`);\n settle(new NiadraTimeoutError(this.timeouts.write));\n }, this.timeouts.write);\n const settle = (error: NiadraError | null): void => {\n if (settled) return;\n settled = true;\n clearTimeout(timer);\n if (!error) resolve({ ok: true, idempotency_key: key, error: null });\n else if (this.strict) reject(error);\n else resolve({ ok: false, idempotency_key: key, error });\n };\n core.queue.push(item, settle);\n core.queue.flushInBackground();\n });\n }\n\n private async endScope(item: BatchItem & { idempotency_key: string }, scope: string): Promise<WriteResult> {\n const result = await this.sendNow(() => item);\n this.forgetScope(scope);\n return result;\n }\n\n private async sendBatch(\n transport: Transport,\n items: BatchItem[],\n maxAttempts: number,\n backoff: { retryDelayMs: number; maxRetryDelayMs: number },\n ): Promise<BatchResponse> {\n try {\n const response = await transport.request<BatchResponse>({\n method: \"POST\",\n path: \"/v1/batch\",\n body: { items },\n timeoutMs: this.timeouts.write,\n retry: { kind: \"write\", maxAttempts, baseDelayMs: backoff.retryDelayMs, maxDelayMs: backoff.maxRetryDelayMs },\n });\n const data = response.data as Partial<BatchResponse> | null;\n return { accepted: data?.accepted ?? items.length, duplicates: data?.duplicates ?? 0, errors: data?.errors ?? [] };\n } catch (error) {\n const failure = toNiadraError(error);\n this.observeAuth(failure, null);\n throw failure;\n }\n }\n}\n\n/**\n * Checks the fields the SDK relies on and fills list and map defaults, so a leaner response\n * from a future server version cannot turn into a crash in the caller's prompt code.\n */\nfunction normalizeContext(data: unknown): ContextResponse {\n if (typeof data !== \"object\" || data === null) throw new NiadraError(\"unexpected response from /v1/context\");\n const body = data as Partial<ContextResponse>;\n if (typeof body.etag !== \"string\" || typeof body.path !== \"string\" || !body.verification) {\n throw new NiadraError(\"unexpected response from /v1/context\");\n }\n return {\n ...body,\n etag: body.etag,\n path: body.path,\n verification: body.verification,\n version: body.version ?? \"\",\n not_modified: body.not_modified ?? false,\n variables: body.variables ?? {},\n coverage: body.coverage ?? [],\n live: body.live ?? [],\n live_complete: body.live_complete ?? true,\n timing: body.timing ?? {},\n withheld: body.withheld ?? 0,\n degraded: body.degraded ?? false,\n };\n}\n\n/** Exactly what the signature covers; a server that names nothing still signs the content type. */\nfunction uploadHeaders(named: Record<string, string> | undefined, contentType: string): Record<string, string> {\n return named && Object.keys(named).length > 0 ? { ...named } : { \"content-type\": contentType };\n}\n\n/** `response` with the deltas the cache handed out for it; as is when the key is not cached. */\nfunction delivered(response: ContextResponse, taken: string | null | undefined): ContextResponse {\n return taken === undefined ? response : { ...response, delta: taken };\n}\n\n/** Lets one caller stop waiting for a shared request without cancelling it for the others. */\nfunction abortable<T>(promise: Promise<T>, signal: AbortSignal | undefined): Promise<T> {\n if (!signal) return promise;\n if (signal.aborted) return Promise.reject(new NiadraAbortError(\"request aborted by the caller\"));\n return new Promise<T>((resolve, reject) => {\n const onAbort = (): void => {\n reject(new NiadraAbortError(\"request aborted by the caller\"));\n };\n signal.addEventListener(\"abort\", onAbort, { once: true });\n promise.then(\n (value) => {\n signal.removeEventListener(\"abort\", onAbort);\n resolve(value);\n },\n (error: unknown) => {\n signal.removeEventListener(\"abort\", onAbort);\n reject(error instanceof Error ? error : new NiadraError(String(error)));\n },\n );\n });\n}\n","/**\n * `wrap()` for OpenAI-compatible clients: the official `openai` package and any client with its\n * `chat.completions.create(body, options)` shape.\n *\n * Each `chat.completions.create` and `chat.completions.parse` call made through the wrapper,\n * streaming or not, gets the conversation's pack as a system message right after the caller's\n * leading system or developer messages, and the suffix (deltas and live turns) as a system\n * message at the end. The pack goes after the caller's instructions because those are the same\n * for every customer: kept first, they stay the cacheable prefix of the prompt. The injection is\n * stamped on the conversation, and the model's answer is recorded as the agent's turn, with the\n * usage the provider reported for the call: the prompt's tokens, the ones read from the provider's\n * prompt cache and the ones written to it (see `modelUsage()`). A stream reports its usage only when\n * the caller asks for it (`stream_options: { include_usage: true }`); the wrapper never changes the\n * request to get it.\n *\n * Nothing the wrapper does can fail the model call: a context that cannot be fetched is left\n * out, and a failure to record the answer is logged, without content, and swallowed.\n */\n\nimport type { ContextResult } from \"./context.js\";\nimport type { Logger } from \"./logger.js\";\nimport type { ModelUsage } from \"./types/events.js\";\nimport { modelUsage } from \"./usage.js\";\n\n/** What `wrap()` needs from a conversation or a task. Both implement it. */\nexport interface WrapSession {\n context(): Promise<ContextResult>;\n markInjected(context?: ContextResult | null): void;\n agent(text: string, options?: { usage?: ModelUsage | null }): string | null;\n readonly logger: Logger;\n}\n\n/** A session, or a function that finds the one the current call belongs to (`null` passes the call through). */\nexport type SessionSource = WrapSession | (() => WrapSession | null | undefined);\n\ntype Method = (...args: unknown[]) => unknown;\ntype Record_ = Record<PropertyKey, unknown>;\n\nconst INSTRUCTION_ROLES = new Set([\"system\", \"developer\"]);\nconst INTERCEPTED = [\"create\", \"parse\"] as const;\n\n/**\n * Returns a proxy of an OpenAI-compatible client that injects the conversation's context and\n * records the model's answers. The client itself is never modified.\n *\n * `.withResponse()` keeps working on intercepted calls and records the answer too;\n * `.asResponse()` returns the raw HTTP response, whose body the SDK cannot read, so nothing is\n * recorded then. Streams are recorded when they end, or when the caller stops reading them.\n *\n * @example\n * const openai = wrap(new OpenAI(), convo);\n * const completion = await openai.chat.completions.create({ model: \"gpt-4.1\", messages });\n */\nexport function wrap<C extends object>(client: C, session: SessionSource): C {\n const resolve = typeof session === \"function\" ? session : (): WrapSession => session;\n const chat = property(client, \"chat\");\n if (!isRecord(chat) || !isRecord(chat.completions)) {\n throw new TypeError(\"wrap() expects an OpenAI-compatible client with chat.completions\");\n }\n const overrides: Record_ = { chat: wrapChat(chat, resolve) };\n // Older clients keep structured outputs under `beta.chat.completions.parse`.\n const beta = property(client, \"beta\");\n const betaChat = isRecord(beta) ? beta.chat : undefined;\n if (isRecord(beta) && isRecord(betaChat) && isRecord(betaChat.completions)) {\n overrides.beta = overlay(beta, { chat: wrapChat(betaChat, resolve) });\n }\n return overlay(client, overrides);\n}\n\n/**\n * Places the pack after the leading system or developer messages and the suffix at the end.\n * Returns a new array; `messages` is left as it was.\n */\nexport function injectContext(context: ContextResult, messages: readonly unknown[]): unknown[] {\n const result = [...messages];\n if (context.text) {\n let position = 0;\n while (position < result.length && INSTRUCTION_ROLES.has(roleOf(result[position]))) position++;\n result.splice(position, 0, { role: \"system\", content: context.text });\n }\n if (context.suffix) result.push({ role: \"system\", content: context.suffix });\n return result;\n}\n\nfunction wrapChat(chat: Record_, resolve: () => WrapSession | null | undefined): Record_ {\n const completions = chat.completions as Record_;\n const overrides: Record_ = {};\n for (const name of INTERCEPTED) {\n const method = completions[name];\n if (typeof method === \"function\") overrides[name] = intercept((method as Method).bind(completions), resolve);\n }\n return overlay(chat, { completions: overlay(completions, overrides) });\n}\n\nfunction intercept(original: Method, resolve: () => WrapSession | null | undefined): Method {\n return (body: unknown, ...rest: unknown[]): unknown => {\n let session: WrapSession | null | undefined;\n try {\n session = resolve();\n } catch {\n session = null;\n }\n if (!session || !isRecord(body)) return original(body, ...rest);\n const answer = new Answer(session, body.stream === true);\n const started = prepare(session, body).then((prepared) => ({ call: original(prepared, ...rest) }));\n return new PendingCall(started, answer);\n };\n}\n\nasync function prepare(session: WrapSession, body: Record_): Promise<Record_> {\n try {\n const context = await session.context();\n if (!Array.isArray(body.messages)) return body;\n const messages = injectContext(context, body.messages);\n // A holdout pack is empty on purpose, and the turn was still built with it.\n if (context.text || context.suffix || context.response?.path === \"holdout\") session.markInjected(context);\n return { ...body, messages };\n } catch (error) {\n session.logger.warn(`could not inject context (${errorName(error)})`);\n return body;\n }\n}\n\n/**\n * The value an intercepted call returns: awaitable like the client's own promise, with its\n * `withResponse()` and `asResponse()`. The call is held in an object so that awaiting `started`\n * does not also resolve the client's promise, which `withResponse()` still needs as it is.\n */\nclass PendingCall implements PromiseLike<unknown> {\n private result: Promise<unknown> | null = null;\n\n constructor(\n private readonly started: Promise<{ call: unknown }>,\n private readonly answer: Answer,\n ) {\n // A caller that only ever uses withResponse() never awaits the other branch; the failure\n // still reaches every caller that does.\n started.catch(() => undefined);\n }\n\n then<A = unknown, B = never>(\n onfulfilled?: ((value: unknown) => A | PromiseLike<A>) | null,\n onrejected?: ((reason: unknown) => B | PromiseLike<B>) | null,\n ): Promise<A | B> {\n return this.value().then(onfulfilled, onrejected);\n }\n\n catch<B = never>(onrejected?: ((reason: unknown) => B | PromiseLike<B>) | null): Promise<unknown> {\n return this.value().catch(onrejected);\n }\n\n finally(onfinally?: (() => void) | null): Promise<unknown> {\n return this.value().finally(onfinally);\n }\n\n async withResponse(): Promise<unknown> {\n const { call } = await this.started;\n const withResponse = property(call, \"withResponse\");\n if (typeof withResponse !== \"function\") throw new TypeError(\"this client's calls have no withResponse()\");\n const settled: unknown = await (withResponse as Method).call(call);\n if (!isRecord(settled)) return settled;\n return { ...settled, data: this.answer.parsed(settled.data) };\n }\n\n async asResponse(): Promise<unknown> {\n const { call } = await this.started;\n const asResponse = property(call, \"asResponse\");\n if (typeof asResponse !== \"function\") throw new TypeError(\"this client's calls have no asResponse()\");\n return (asResponse as Method).call(call);\n }\n\n private value(): Promise<unknown> {\n this.result ??= this.started.then(({ call }) => call).then((value) => this.answer.parsed(value));\n return this.result;\n }\n}\n\n/** The capture of one model call: records its text once, whichever way the caller reads it. */\nclass Answer {\n private recorded = false;\n\n constructor(\n private readonly session: WrapSession,\n private readonly stream: boolean,\n ) {}\n\n /** What to hand back in place of `value`. Never throws. */\n parsed(value: unknown): unknown {\n try {\n if (!this.stream) {\n this.record(messageText(value), modelUsage(value));\n return value;\n }\n return isAsyncIterable(value)\n ? captureStream(value, (text, usage) => {\n this.record(text, usage);\n })\n : value;\n } catch (error) {\n this.session.logger.warn(`could not capture the model's answer (${errorName(error)})`);\n return value;\n }\n }\n\n private record(text: string | null, usage: ModelUsage | null): void {\n if (this.recorded || !text) return;\n this.recorded = true;\n try {\n this.session.agent(text, usage ? { usage } : {});\n } catch (error) {\n this.session.logger.warn(`could not record the model's answer (${errorName(error)})`);\n }\n }\n}\n\n/**\n * The stream, with its async iterator replaced by one that collects the first choice's text\n * and hands it over when the stream ends, fails or is abandoned. Everything else, `tee()` and\n * `controller` included, is the stream's own.\n */\nfunction captureStream<T extends AsyncIterable<unknown>>(\n stream: T,\n done: (text: string, usage: ModelUsage | null) => void,\n): T {\n const parts: string[] = [];\n // The last chunk carries the usage when the caller asked for it.\n let usage: unknown = null;\n let model: string | undefined;\n let finished = false;\n const observe = (chunk: unknown): void => {\n const reported = property(chunk, \"usage\");\n if (isRecord(reported)) usage = reported;\n const name = property(chunk, \"model\");\n if (typeof name === \"string\" && name) model = name;\n };\n const finish = (): void => {\n if (finished) return;\n finished = true;\n done(parts.join(\"\"), usage ? modelUsage(usage, model ? { model } : {}) : null);\n };\n return new Proxy(stream, {\n get(target, prop) {\n if (prop === Symbol.asyncIterator) {\n return (): AsyncIterator<unknown> => {\n const inner = target[Symbol.asyncIterator]();\n return {\n async next() {\n try {\n const step = await inner.next();\n if (step.done) finish();\n else {\n parts.push(deltaText(step.value));\n observe(step.value);\n }\n return step;\n } catch (error) {\n finish();\n throw error;\n }\n },\n async return(value?: unknown) {\n finish();\n return inner.return ? inner.return(value) : { done: true, value };\n },\n };\n };\n }\n const value: unknown = Reflect.get(target, prop, target);\n return typeof value === \"function\" ? (value as Method).bind(target) : value;\n },\n });\n}\n\n/** With `n > 1` the model answers several times; the agent said the first one. */\nfunction firstChoice(value: unknown): Record_ | undefined {\n const choices = property(value, \"choices\");\n if (!Array.isArray(choices)) return undefined;\n return (choices as unknown[]).find(\n (choice): choice is Record_ => isRecord(choice) && (choice.index === undefined || choice.index === 0),\n );\n}\n\nfunction messageText(response: unknown): string | null {\n const content = property(firstChoice(response)?.message, \"content\");\n return typeof content === \"string\" && content ? content : null;\n}\n\nfunction deltaText(chunk: unknown): string {\n const content = property(firstChoice(chunk)?.delta, \"content\");\n return typeof content === \"string\" ? content : \"\";\n}\n\nfunction overlay<T extends object>(target: T, overrides: Record_): T {\n return new Proxy(target, {\n get(obj, prop) {\n if (Object.prototype.hasOwnProperty.call(overrides, prop)) return overrides[prop];\n // Bound to the real object: class methods may touch private fields a proxy does not have.\n const value: unknown = Reflect.get(obj, prop, obj);\n return typeof value === \"function\" ? (value as Method).bind(obj) : value;\n },\n });\n}\n\nfunction property(value: unknown, name: string): unknown {\n return isRecord(value) ? value[name] : undefined;\n}\n\nfunction isRecord(value: unknown): value is Record_ {\n return (typeof value === \"object\" || typeof value === \"function\") && value !== null;\n}\n\nfunction isAsyncIterable(value: unknown): value is AsyncIterable<unknown> {\n return isRecord(value) && typeof value[Symbol.asyncIterator] === \"function\";\n}\n\nfunction roleOf(message: unknown): string {\n const role = property(message, \"role\");\n return typeof role === \"string\" ? role : \"\";\n}\n\nfunction errorName(error: unknown): string {\n return error instanceof Error ? error.name : typeof error;\n}\n"]}
|