@qoniai/qoni 0.8.0 → 0.9.0
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 +102 -2
- package/README.md +119 -72
- package/README.zh-CN.md +73 -44
- package/dist/index.cjs +355 -58
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +163 -42
- package/dist/index.d.ts +163 -42
- package/dist/index.js +355 -58
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
- package/skills/qoni-sdk/SKILL.md +42 -20
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/signature.ts","../src/auth.ts","../src/types.ts","../src/errors.ts","../src/run-events.ts","../src/generated/interaction-types.ts","../src/scopes.ts","../src/interactions.ts","../src/run-handle.ts","../src/deep-research.ts","../src/do-anything.ts","../src/qoni.ts","../src/genauth.ts","../src/gumem.ts","../src/track.ts","../src/web-search.ts","../src/client.ts"],"sourcesContent":["import { createHmac } from \"node:crypto\";\n\ntype Headers = Record<string, string>;\ntype Params = Record<string, unknown>;\n\nfunction filter(value: unknown): string {\n return String(value).replace(/[\\t\\n\\r\\f]/g, \" \");\n}\n\nfunction canonicalizedHeaders(headers: Headers): string {\n return Object.keys(headers)\n .filter((key) => key.startsWith(\"x-authing-\") || key === \"date\")\n .sort()\n .map((key) => `${key}:${filter(headers[key]).trim()}\\n`)\n .join(\"\");\n}\n\nfunction canonicalizedResource(pathname: string, params: Params): string {\n const keys = Object.keys(params).sort();\n if (!keys.length) return pathname;\n const query = keys.map((key) => {\n const value = params[key];\n return `${key}=${typeof value === \"object\" && value !== null ? JSON.stringify(value) : value}`;\n });\n return `${pathname}?${query.join(\"&\")}`;\n}\n\nexport function buildStringToSign(\n method: string,\n pathname: string,\n headers: Headers,\n params: Params,\n): string {\n return `${method.toUpperCase()}\\n${canonicalizedHeaders(headers)}${canonicalizedResource(\n pathname,\n params,\n )}`;\n}\n\nexport function buildSignature(secretKey: string, stringToSign: string): string {\n return createHmac(\"sha1\", secretKey).update(stringToSign, \"utf8\").digest(\"base64\");\n}\n\nexport function buildAuthorization(accessKey: string, secretKey: string, stringToSign: string): string {\n return `authing ${accessKey}:${buildSignature(secretKey, stringToSign)}`;\n}\n","import { buildAuthorization, buildStringToSign } from \"./signature\";\nimport type { JsonObject } from \"./types\";\n\nexport interface QoniCredentials {\n accessKey: string;\n secretKey: string;\n}\n\nlet lastSigningTimestamp = 0;\n\nfunction nextSigningTimestamp(): number {\n const now = Date.now();\n lastSigningTimestamp = Math.max(now, lastSigningTimestamp + 1);\n return lastSigningTimestamp;\n}\n\nexport function buildSignedHeaders(\n credentials: QoniCredentials,\n method: string,\n pathname: string,\n payload: JsonObject,\n): Record<string, string> {\n const headers: Record<string, string> = {\n \"content-type\": \"application/json\",\n // GenAuth rejects an already-consumed signature. A strictly monotonic\n // timestamp keeps otherwise identical requests unique within a process,\n // including retries or concurrent calls that start in the same millisecond.\n \"x-authing-date\": String(nextSigningTimestamp()),\n \"x-authing-signature-method\": \"HMAC-SHA1\",\n \"x-authing-signature-version\": \"1.0\",\n };\n const stringToSign = buildStringToSign(method, pathname, headers, payload);\n headers.authorization = buildAuthorization(\n credentials.accessKey,\n credentials.secretKey,\n stringToSign,\n );\n return headers;\n}\n","export type JsonPrimitive = string | number | boolean | null;\nexport type JsonValue = JsonPrimitive | JsonObject | JsonValue[];\nexport type JsonObject = Record<string, unknown>;\n\nexport type DelegationMode = \"silent\" | \"interactive\";\nexport type QoniService = \"qoni\" | \"genauth\" | \"gumem\" | \"webagent\";\nexport type QoniHttpMethod = \"GET\" | \"POST\" | \"PATCH\" | \"DELETE\";\n\nexport interface QoniOptions {\n accessKey?: string;\n secretKey?: string;\n host?: string;\n /** Overrides the GenAuth URL returned by runtime-config. Prefer host for normal discovery. */\n genauthHost?: string;\n /** Overrides the GUMem URL returned by runtime-config. Prefer host for normal discovery. */\n gumemHost?: string;\n /** Overrides the WebAgent URL returned by runtime-config. Prefer host for normal discovery. */\n webAgentHost?: string;\n /** @deprecated Use accessKey. */\n accessKeyId?: string;\n /** @deprecated Use secretKey. */\n accessKeySecret?: string;\n /** @deprecated Prefer host runtime discovery for normal Qoni Console gateway access. */\n qoniBaseUrl?: string;\n /** @deprecated Use host for normal Qoni Gateway access. */\n genauthBaseUrl?: string;\n /** @deprecated Use host for normal Qoni Gateway access. */\n gumemBaseUrl?: string;\n /** @deprecated Use host for normal Qoni Gateway access. */\n webAgentBaseUrl?: string;\n fetch?: typeof fetch;\n timeoutMs?: number;\n /**\n * Max automatic reconnect attempts for SSE streams (`events()`) after a\n * dropped connection. Each reconnect resumes from the last seen event id\n * via the `last-event-id` header. Defaults to 5; set 0 to disable.\n */\n sseMaxRetries?: number;\n}\n\nexport interface QoniRuntimeConfig {\n /** Current control-plane wire field. Keep until the server contract migrates. */\n eakBaseUrl?: string;\n genauthBaseUrl?: string;\n gumemBaseUrl?: string;\n webAgentBaseUrl?: string;\n services?: {\n eak?: string | { baseUrl?: string; url?: string; host?: string };\n genauth?: string | { baseUrl?: string; url?: string; host?: string };\n gumem?: string | { baseUrl?: string; url?: string; host?: string };\n webAgent?: string | { baseUrl?: string; url?: string; host?: string };\n webagent?: string | { baseUrl?: string; url?: string; host?: string };\n };\n}\n\nexport interface QoniMeta {\n requestId?: string;\n traceId?: string;\n auditId?: string;\n service?: QoniService;\n [key: string]: unknown;\n}\n\nexport interface QoniResponse<T = unknown> {\n data: T;\n meta: QoniMeta;\n}\n\nexport interface UserRef {\n id: string;\n subject?: string;\n name?: string;\n email?: string;\n avatarUrl?: string;\n [key: string]: unknown;\n}\n\ninterface DelegateTokenBaseInput {\n /** Audit label for this delegation. Defaults to \"sdk\". */\n agent?: string;\n /** Compatibility alias for agent. Supplying conflicting labels is an error. */\n agentKey?: string;\n /** Fine-grained scopes. May be combined with `products`. */\n scopes?: readonly string[];\n /** Per-product authorization sugar — expands to the product's scope set. */\n products?: readonly QoniProductName[];\n /** Integer seconds (60–86400), or a whole-number duration such as \"15m\". */\n expiresIn?: string | number;\n /** Not supported: the delegation service does not enforce a deny policy. */\n deniedScopes?: never;\n idempotencyKey?: string;\n}\n\n/**\n * Product names accepted by `delegateToken({ products })`. Mirrors\n * `QoniProduct` in scopes.ts (duplicated to keep this module import-free).\n */\nexport type QoniProductName = \"doAnything\" | \"webSearch\" | \"deepResearch\" | \"track\";\n\nexport type DelegateTokenSilentInput = DelegateTokenBaseInput & {\n mode?: \"silent\";\n redirectUri?: string;\n state?: string;\n} & (\n | {\n user: UserRef;\n /** Alternative to user.id. A nonempty userId takes precedence. */\n userId?: string;\n }\n | {\n user?: UserRef;\n /** Alternative to user.id. A nonempty userId takes precedence. */\n userId: string;\n }\n);\n\nexport interface DelegateTokenInteractiveInput extends DelegateTokenBaseInput {\n mode: \"interactive\";\n redirectUri: string;\n state: string;\n user?: UserRef;\n /** Alternative to user.id; optional for interactive authorization. */\n userId?: string;\n}\n\nexport type DelegateTokenInput =\n | DelegateTokenSilentInput\n | DelegateTokenInteractiveInput;\n\n/** @deprecated Use DelegateTokenInput. */\nexport type DelegateAgentInput = DelegateTokenInput;\n\nexport interface CompleteDelegateTokenInput {\n grantId: string;\n code: string;\n state: string;\n}\n\n/** @deprecated Use CompleteDelegateTokenInput. */\nexport type CompleteDelegateAgentInput = CompleteDelegateTokenInput;\n\nexport interface DelegateTokenResponse {\n mode: DelegationMode;\n tokenType: \"Bearer\";\n token: string;\n /** @deprecated Use token. */\n delegateAgentToken: string;\n /** @deprecated Use token. */\n delegationToken?: string;\n expiresIn: number;\n grantId: string;\n auditId: string;\n grantedScopes?: string[];\n}\n\nexport type DelegateTokenSilentResponse = DelegateTokenResponse & { mode: \"silent\" };\n\n/** @deprecated Use DelegateTokenResponse. */\nexport type DelegateAgentTokenResponse = DelegateTokenResponse;\n\n/** @deprecated Use DelegateTokenResponse. */\nexport type DelegationTokenResponse = DelegateTokenResponse;\n\nexport interface InteractiveDelegationResponse {\n mode: \"interactive\";\n authorizationUrl: string;\n grantId: string;\n grantState: string;\n state: string;\n requestedScopes?: string[];\n}\n\nexport type DelegateAgentResponse =\n | DelegateTokenResponse\n | InteractiveDelegationResponse;\n\nexport type DelegateTokenResult = DelegateAgentResponse;\n\nexport interface TokenInput {\n /** Delegation/runtime token to authorize the call with. */\n token?: string;\n}\n\nexport type RuntimeTokenInput = TokenInput;\n\nexport interface RawRequestInput extends TokenInput {\n method: QoniHttpMethod;\n path: string;\n query?: JsonObject;\n body?: JsonObject;\n headers?: Record<string, string>;\n}\n\nexport interface RequestPayload {\n signal?: AbortSignal;\n query?: JsonObject;\n body?: JsonObject | BodyInit;\n headers?: Record<string, string>;\n requiredScopes?: readonly string[];\n}\n\nexport interface QoniEvent<T = unknown> {\n id?: string;\n event?: string;\n data: T;\n}\n\nexport type QoniSSEEvent<T = unknown> = QoniEvent<T>;\n\nexport interface QoniTransport {\n qoniJson<T>(\n method: QoniHttpMethod,\n path: string,\n token?: string,\n payload?: RequestPayload,\n ): Promise<QoniResponse<T>>;\n genauthJson<T>(\n method: QoniHttpMethod,\n path: string,\n token?: string,\n payload?: RequestPayload,\n ): Promise<QoniResponse<T>>;\n gumemJson<T>(\n method: QoniHttpMethod,\n path: string,\n token?: string,\n payload?: RequestPayload,\n ): Promise<QoniResponse<T>>;\n gumemSSE<T>(\n path: string,\n token?: string,\n payload?: RequestPayload & { lastEventId?: string; signal?: AbortSignal },\n ): AsyncIterable<QoniEvent<T>>;\n webAgentJson<T>(\n method: QoniHttpMethod,\n path: string,\n token?: string,\n payload?: RequestPayload,\n ): Promise<QoniResponse<T>>;\n /** Binary GET — used for artifact content downloads. */\n webAgentBytes(\n path: string,\n token?: string,\n payload?: RequestPayload,\n ): Promise<{ bytes: Uint8Array; mime: string }>;\n webAgentSSE<T>(\n path: string,\n token?: string,\n payload?: RequestPayload & {\n lastEventId?: string;\n signal?: AbortSignal;\n onReconnect?: (info: { attempt: number; lastEventId?: string; error: unknown }) => void;\n },\n ): AsyncIterable<QoniEvent<T>>;\n}\n\nexport function isJsonObject(value: unknown): value is JsonObject {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n","import { isJsonObject, type JsonObject } from \"./types\";\n\n/**\n * Known `QoniError.code` values. The SDK assigns the `*.*` codes; the `eak.*`\n * codes are backend apiCodes surfaced verbatim. The trailing `(string & {})`\n * keeps `code` assignable from any string (the backend may add new codes)\n * while still giving literal autocomplete and letting you write an exhaustive\n * `switch (err.code)` over the known set.\n */\nexport type QoniErrorCode =\n | \"qoni_error\"\n | \"auth.failed\"\n | \"delegation.required\"\n | \"permission_denied\"\n | \"token.expired\"\n | \"validation.failed\"\n | \"rate_limit.exceeded\"\n | \"upstream.failed\"\n | \"timeout\"\n | \"not_found\"\n | \"conflict\"\n | \"eak.delegation.user_not_bound\"\n | \"eak.delegation.no_allowed_scopes\"\n | \"eak.delegation.scope_not_allowed\"\n | \"eak.genauth.userpool_binding_missing\"\n | \"eak.genauth.userpool_owner_missing\"\n | \"eak.genauth.no_bound_users\"\n | \"eak.token_exchange.upstream_failed\"\n // eslint-disable-next-line @typescript-eslint/ban-types\n | (string & {});\n\nexport interface QoniErrorOptions {\n code?: QoniErrorCode;\n status?: number;\n requestId?: string;\n traceId?: string;\n auditId?: string;\n retryable?: boolean;\n body?: unknown;\n cause?: unknown;\n}\n\nexport class QoniError extends Error {\n readonly code: QoniErrorCode;\n readonly status?: number;\n readonly requestId?: string;\n readonly traceId?: string;\n readonly auditId?: string;\n readonly retryable: boolean;\n readonly body?: unknown;\n\n constructor(message: string, options: QoniErrorOptions = {}) {\n super(message);\n this.name = \"QoniError\";\n this.code = options.code || \"qoni_error\";\n this.status = options.status;\n this.requestId = options.requestId;\n this.traceId = options.traceId;\n this.auditId = options.auditId;\n this.retryable = options.retryable ?? false;\n this.body = options.body;\n if (options.cause !== undefined) {\n (this as Error & { cause?: unknown }).cause = options.cause;\n }\n }\n}\n\nexport class QoniAuthError extends QoniError {\n constructor(message: string, options: QoniErrorOptions = {}) {\n super(message, { code: \"auth.failed\", ...options });\n this.name = \"QoniAuthError\";\n }\n}\n\nexport class QoniDelegationRequiredError extends QoniError {\n constructor(message: string, options: QoniErrorOptions = {}) {\n super(message, { code: \"delegation.required\", ...options });\n this.name = \"QoniDelegationRequiredError\";\n }\n}\n\nexport class QoniPermissionDeniedError extends QoniError {\n constructor(message: string, options: QoniErrorOptions = {}) {\n super(message, { code: \"permission_denied\", ...options });\n this.name = \"QoniPermissionDeniedError\";\n }\n}\n\nexport class QoniTokenExpiredError extends QoniError {\n constructor(message: string, options: QoniErrorOptions = {}) {\n super(message, { code: \"token.expired\", ...options });\n this.name = \"QoniTokenExpiredError\";\n }\n}\n\nexport class QoniValidationError extends QoniError {\n constructor(message: string, options: QoniErrorOptions = {}) {\n super(message, { code: \"validation.failed\", ...options });\n this.name = \"QoniValidationError\";\n }\n}\n\nexport class QoniRateLimitError extends QoniError {\n constructor(message: string, options: QoniErrorOptions = {}) {\n super(message, { code: \"rate_limit.exceeded\", retryable: true, ...options });\n this.name = \"QoniRateLimitError\";\n }\n}\n\nexport class QoniUpstreamError extends QoniError {\n constructor(message: string, options: QoniErrorOptions = {}) {\n super(message, { code: \"upstream.failed\", retryable: true, ...options });\n this.name = \"QoniUpstreamError\";\n }\n}\n\nexport class QoniTimeoutError extends QoniError {\n constructor(message: string, options: QoniErrorOptions = {}) {\n super(message, { code: \"timeout\", retryable: true, ...options });\n this.name = \"QoniTimeoutError\";\n }\n}\n\nexport function errorFromPayload(\n status: number,\n payload: unknown,\n fallbackMessage: string,\n): QoniError {\n const detail = isJsonObject(payload) ? payload.detail : undefined;\n const detailObject = isJsonObject(detail) ? detail : undefined;\n const source = detailObject || (isJsonObject(payload) ? payload : {});\n const code =\n stringField(source, \"code\") ||\n stringField(source, \"apiCode\") ||\n statusCodeToCode(status);\n const rawMessage =\n stringField(source, \"message\") ||\n stringField(source, \"detail\") ||\n fallbackMessage;\n const message = code === \"eak.delegation.no_allowed_scopes\"\n ? \"This AccessKey has no permission scopes. In Qoni Console, open its Permission scope settings, enable the policy needed for this call, then retry.\"\n : appendOnboardingHint(\n appendDeniedScopes(appendUpstreamDescription(rawMessage, source), source),\n code,\n );\n const options: QoniErrorOptions = {\n code,\n status,\n requestId: stringField(payload, \"requestId\") || stringField(source, \"requestId\"),\n traceId: stringField(payload, \"traceId\") || stringField(source, \"traceId\"),\n auditId: stringField(payload, \"auditId\") || stringField(source, \"auditId\"),\n retryable: status === 429 || status >= 500,\n body: payload,\n };\n\n if (isTokenExpired(code, message)) return new QoniTokenExpiredError(message, options);\n if (isDelegationRequired(code)) return new QoniDelegationRequiredError(message, options);\n if (status === 401) return new QoniAuthError(message, options);\n if (status === 403 || isPermissionDenied(code)) {\n return new QoniPermissionDeniedError(message, options);\n }\n if (status === 400 || status === 422) return new QoniValidationError(message, options);\n if (status === 429) return new QoniRateLimitError(message, options);\n if (status >= 500) return new QoniUpstreamError(message, options);\n return new QoniError(message, options);\n}\n\nexport function timeoutError(cause: unknown): QoniTimeoutError {\n return new QoniTimeoutError(\"Qoni request timed out\", { cause });\n}\n\nexport function networkError(cause: unknown): QoniUpstreamError {\n return new QoniUpstreamError(\"Qoni network request failed\", { cause });\n}\n\nfunction stringField(value: unknown, key: string): string | undefined {\n if (!isJsonObject(value)) return undefined;\n const field = (value as JsonObject)[key];\n return typeof field === \"string\" && field ? field : undefined;\n}\n\n// Surface denied/missing scopes inline so they aren't hidden behind a nested\n// `[Array]` in the error object — e.g. `scope_not_delegated` carries\n// `details.deniedScopes`. The caller sees exactly which scope to add.\nfunction appendDeniedScopes(message: string, source: unknown): string {\n const details = isJsonObject(source) ? source.details : undefined;\n const raw =\n (isJsonObject(details) ? details.deniedScopes : undefined) ??\n (isJsonObject(source) ? source.deniedScopes : undefined);\n if (!Array.isArray(raw) || raw.length === 0) return message;\n const scopes = raw.filter((s): s is string => typeof s === \"string\");\n if (scopes.length === 0 || message.includes(scopes[0])) return message;\n return `${message} (scopes not granted: ${scopes.join(\", \")})`;\n}\n\nfunction appendUpstreamDescription(message: string, source: unknown): string {\n const details = isJsonObject(source) ? source.details : undefined;\n const upstream = isJsonObject(details) ? details.upstream : undefined;\n const description =\n stringField(upstream, \"error_description\") ||\n stringField(upstream, \"message\") ||\n stringField(upstream, \"error\");\n if (!description || message.includes(description)) return message;\n return `${message}: ${description}`;\n}\n\n// Common first-run pitfalls get an actionable, one-line hint appended to the\n// error message so integrators aren't left guessing where to look.\nconst ONBOARDING_HINTS: Record<string, string> = {\n \"eak.delegation.user_not_bound\":\n \"Hint: the userId is not in the GenAuth userpool bound to this credential. \" +\n \"Resolve a real user with qoni.resolveAnyBoundUser() (demo/smoke) or qoni.currentUser({ accessToken }).\",\n \"eak.genauth.userpool_binding_missing\":\n \"Hint: bind the Qoni credential to a GenAuth userpool before calling genauth.users.*.\",\n \"eak.delegation.scope_not_allowed\":\n \"Hint: enable the denied scopes in this AccessKey's Permission scope settings in Qoni Console.\",\n};\n\nfunction appendOnboardingHint(message: string, code: string): string {\n const hint = ONBOARDING_HINTS[code];\n if (!hint || message.includes(hint)) return message;\n return `${message} ${hint}`;\n}\n\nfunction statusCodeToCode(status: number): string {\n if (status === 401) return \"auth.failed\";\n if (status === 403) return \"permission_denied\";\n if (status === 404) return \"not_found\";\n if (status === 409) return \"conflict\";\n if (status === 422) return \"validation.failed\";\n if (status === 429) return \"rate_limit.exceeded\";\n if (status >= 500) return \"upstream.failed\";\n return \"qoni_error\";\n}\n\nfunction isPermissionDenied(code: string): boolean {\n return code.includes(\"permission\") || code.includes(\"insufficient_scope\");\n}\n\nfunction isDelegationRequired(code: string): boolean {\n return code.includes(\"interactive_required\") || code.includes(\"delegation.required\");\n}\n\nfunction isTokenExpired(code: string, message: string): boolean {\n return code.includes(\"expired\") || /token expired/i.test(message);\n}\n","import { normalizeInteraction, type Interaction } from \"./interactions\";\nimport { isJsonObject, type QoniEvent, type JsonObject } from \"./types\";\n\n/**\n * Semantic run events — the public event surface for doAnything / webSearch /\n * deepResearch run handles and Track monitor handles. Wire envelopes\n * (`{ type, task_id, session_id, occurred_at, data }`, snake_case payloads,\n * data-URI screenshots) are normalized here; the original wire event stays\n * reachable on `event.raw`.\n */\n/**\n * `QoniEventTypes` — the complete set of `event.type` values, as named\n * constants. This is THE thing a developer matches on. Import it for\n * autocomplete + typo-safety instead of hand-typing strings:\n *\n * import { QoniEventTypes } from \"@qoniai/qoni\";\n * for await (const event of run.events()) {\n * switch (event.type) {\n * case QoniEventTypes.Results: …\n * case QoniEventTypes.Done: …\n * }\n * }\n *\n * The raw wire types (supervisor orchestration, sub-agent execution, protocol\n * markers) are internal: all that churn folds into `QoniEventTypes.Progress`,\n * and only the handful a developer reacts to get a distinct value. The exact\n * wire string is on `event.raw.event` if ever needed.\n */\nexport const QoniEventTypes = {\n // --- Core (any product run can emit these) ---\n /** The agent is working — folds ALL internal steps (actions, plan/subtask, sections, telemetry, take-control, …); `event.data` is a best-effort human-readable line (string). */\n Progress: \"progress\",\n /** The agent produced a user-facing chat message. */\n Message: \"message\",\n /** HITL — a typed interaction needs the user (login / clarification / confirmation / take-control / wait); `event.data` is the full {@link Interaction} object. Act on it via the action methods (`run.interactionHandle(event.data).answer(…)` etc). */\n Interaction: \"interaction\",\n /** A live screenshot frame (opt in with `capture: { screenshots: true }`); image on `event.image`. */\n Screenshot: \"screenshot\",\n /** The browser viewer moved to a new page or needs a fresh attachment. Use `event.data.liveUrl` for the live preview. */\n BrowserLiveUrlChanged: \"browserLiveUrlChanged\",\n /** Terminal — the run finished; outcome + output in `event.data` (cost is on the `RunResult`). */\n Done: \"done\",\n // --- Web Search ---\n /** Web Search results are ready; `event.data` is the count (the list is in `done.output`). */\n ResultsReady: \"resultsReady\",\n // --- Deep Research ---\n /** Deep Research coarse phase changed (brief → gather → synthesize …). */\n Phase: \"phase\",\n /** A Deep Research outline section was completed (stream sections as they finish). */\n SectionReady: \"sectionReady\",\n // --- Track (monitor) ---\n /** A Track monitor was created (e.g. Do Anything handed a recurring request to Track). */\n MonitorCreated: \"monitorCreated\",\n /** A monitor detected a change worth acting on (the Track signal you react to). */\n Triggered: \"triggered\",\n /** A monitor's scheduled check finished (`event.data` is whether it found a change). */\n CheckCompleted: \"checkCompleted\",\n} as const;\n\n/** Every `event.type` value. Derived from {@link QoniEventTypes} — the single source. */\nexport type QoniEventType = (typeof QoniEventTypes)[keyof typeof QoniEventTypes];\n\n/**\n * Categories WIRE_TO_SEMANTIC maps to. Excludes the out-of-band cases the\n * normalizer shapes directly (screenshot / done / interaction / browser live\n * URL change) — those don't\n * go through the generic `shapeData`.\n */\nexport type RunProgressType = Exclude<QoniEventType, \"screenshot\" | \"done\" | \"interaction\" | \"browserLiveUrlChanged\">;\n\n/** A decoded screenshot frame. `bytes` are the raw image bytes. */\nexport interface RunImage {\n bytes: Uint8Array;\n mime: string;\n pageUrl?: string;\n step?: number;\n}\n\ninterface RunEventBase {\n /** The run this event belongs to. */\n runId: string;\n /** ISO 8601 timestamp of when the event occurred. */\n at: string;\n /** The original wire event (escape hatch — shape may evolve with the API). */\n raw: QoniEvent<unknown>;\n}\n\n// `event.data` shape per `event.type`. Simple events: `event.data` IS the value\n// (a string / number / boolean) — no field name to remember, `console.log(event.data)`\n// prints it directly. Rich events: `event.data` is a small object with\n// human-named fields. The full raw wire payload is always on `event.raw`.\n\n/** `message` — an assistant/user chat message. */\nexport interface RunMessageData { text: string; role: string }\n/** `screenshot` — page metadata; the decoded image is on `event.image`. */\nexport interface RunScreenshotData { pageUrl?: string; step?: number }\n/** `browserLiveUrlChanged` — the provider's live viewer URL can rotate as tabs change. */\nexport interface RunBrowserLiveUrlChangedData {\n liveUrl: string;\n supportsLivePump: boolean;\n forceViewerReload: boolean;\n providerSessionId?: string;\n}\n/** `done` — terminal outcome + final output. (Total cost is on the `RunResult`.) */\nexport interface RunDoneData { output?: unknown; succeeded: boolean | null; terminalReason: string }\n\nexport type RunEvent =\n // Core — any product run.\n // `progress` — `event.data` is a human-readable line (string; may be \"\").\n | (RunEventBase & { type: \"progress\"; data: string; isTerminal: false })\n | (RunEventBase & { type: \"message\"; data: RunMessageData; isTerminal: false })\n | (RunEventBase & { type: \"interaction\"; data: Interaction; isTerminal: false })\n | (RunEventBase & { type: \"screenshot\"; data: RunScreenshotData; image: RunImage; isTerminal: false })\n | (RunEventBase & { type: \"browserLiveUrlChanged\"; data: RunBrowserLiveUrlChangedData; isTerminal: false })\n | (RunEventBase & { type: \"done\"; data: RunDoneData; isTerminal: true })\n // Web Search — `event.data` is the count of unique results (number).\n | (RunEventBase & { type: \"resultsReady\"; data: number; isTerminal: false })\n // Deep Research — `event.data` is the phase name / section title (string).\n | (RunEventBase & { type: \"phase\"; data: string; isTerminal: false })\n | (RunEventBase & { type: \"sectionReady\"; data: string; isTerminal: false })\n // Track (monitor) — monitorId / change-summary (string), or \"changed\" (boolean).\n | (RunEventBase & { type: \"monitorCreated\"; data: string; isTerminal: false })\n | (RunEventBase & { type: \"triggered\"; data: string; isTerminal: false })\n | (RunEventBase & { type: \"checkCompleted\"; data: boolean; isTerminal: false });\n\n// ---------------------------------------------------------------------------\n// Per-product event types (分型). Each product's handle is typed to ONLY the\n// events that product emits, so `switch (event.type)` autocompletes just those\n// and a wrong-product case is a compile error. The runtime is the same\n// normalizer; these narrow the public surface per product.\n// ---------------------------------------------------------------------------\n\n/** Events any product run can emit. */\nexport type CoreRunEvent = Extract<\n RunEvent,\n { type: \"progress\" | \"message\" | \"interaction\" | \"screenshot\" | \"browserLiveUrlChanged\" | \"done\" }\n>;\n/** Do Anything — core events only. */\nexport type DoAnythingEvent = CoreRunEvent;\n/** Web Search — core + `resultsReady`. */\nexport type WebSearchEvent = CoreRunEvent | Extract<RunEvent, { type: \"resultsReady\" }>;\n/** Deep Research — core + `phase` / `sectionReady`. */\nexport type DeepResearchEvent =\n | CoreRunEvent\n | Extract<RunEvent, { type: \"phase\" | \"sectionReady\" }>;\n/** Track monitor — core + `monitorCreated` / `triggered` / `checkCompleted`. */\nexport type MonitorEvent =\n | CoreRunEvent\n | Extract<RunEvent, { type: \"monitorCreated\" | \"triggered\" | \"checkCompleted\" }>;\n\nexport function isTerminalRunStatus(status: unknown): boolean {\n return status === \"succeeded\" || status === \"failed\" || status === \"canceled\";\n}\n\n/** Convert a snake_case key to camelCase. Keys without underscores pass through. */\nfunction camelKey(key: string): string {\n return key.replace(/_([a-z0-9])/g, (_, ch: string) => ch.toUpperCase());\n}\n\n/**\n * Recursively camelCase the keys of a wire payload. Values are untouched;\n * arrays are mapped element-wise.\n */\nexport function camelizeKeys(value: unknown): unknown {\n if (Array.isArray(value)) return value.map(camelizeKeys);\n if (!isJsonObject(value)) return value;\n const out: JsonObject = {};\n for (const [key, item] of Object.entries(value)) {\n out[camelKey(key)] = camelizeKeys(item);\n }\n return out;\n}\n\nexport function camelizeRecord(value: unknown): JsonObject {\n const out = camelizeKeys(value);\n return isJsonObject(out) ? out : {};\n}\n\n/** Decode a `data:` URI into bytes + mime. Returns undefined for non-data URLs. */\nexport function decodeDataUri(uri: string): { bytes: Uint8Array; mime: string } | undefined {\n const match = /^data:([^;,]*)?(;base64)?,(.*)$/s.exec(uri);\n if (!match) return undefined;\n const [, mime, isBase64, body] = match;\n const encoded = isBase64 ? body.replace(/\\s/g, \"\") : body;\n if (isBase64 && (\n !/^[A-Za-z0-9+/_-]+={0,2}$/.test(encoded) ||\n encoded.length % 4 === 1 ||\n (encoded.includes(\"=\") && encoded.length % 4 !== 0)\n )) return undefined;\n try {\n const bytes = isBase64\n ? new Uint8Array(Buffer.from(encoded, \"base64\"))\n : new TextEncoder().encode(decodeURIComponent(encoded));\n return bytes.length ? { bytes, mime: mime || \"application/octet-stream\" } : undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction asString(value: unknown): string | undefined {\n return typeof value === \"string\" && value ? value : undefined;\n}\n\nfunction asNumber(value: unknown): number | undefined {\n return typeof value === \"number\" && Number.isFinite(value) ? value : undefined;\n}\n\nfunction decodeScreenshotImage(payload: JsonObject): RunImage | undefined {\n const url = asString(payload.screenshot_url);\n if (!url) return undefined;\n const decoded = decodeDataUri(url);\n if (!decoded) return undefined;\n return {\n ...decoded,\n pageUrl: asString(payload.page_url) ?? asString(payload.url),\n step: asNumber(payload.step) ?? asNumber(payload.step_index),\n };\n}\n\n// Wire types handled out-of-band by the normalizer (not in the table below):\n// stream.heartbeat → null (transport keep-alive, no run event)\n// run.screenshot → \"screenshot\" (or \"progress\" if the image won't decode)\n// run.completed → \"done\" (terminal; sub-runs demote to progress)\n// run.interaction → \"interaction\" (carries the typed Interaction object)\nconst HEARTBEAT = \"stream.heartbeat\";\nconst SCREENSHOT = \"run.screenshot\";\nconst TERMINAL = \"run.completed\";\nconst INTERACTION = \"run.interaction\";\n\n/**\n * Explicit wire-type → curated `event.type` map. Most wire types are internal\n * supervisor orchestration or sub-agent execution detail and deliberately fold\n * into `progress` — that's the product-level \"the agent is working\" signal.\n * Only the handful a developer reacts to get a distinct category. The mapping\n * is EXPLICIT for every catalog entry (coverage-tested in\n * tests/event-catalog.test.ts) so adding a backend event forces a deliberate\n * \"headline or progress?\" decision rather than a silent default. A wire type\n * NOT in the catalog (an unsynced backend addition) still degrades to\n * \"progress\" at runtime so a new server event never breaks a consumer's stream.\n */\nexport const WIRE_TO_SEMANTIC: Readonly<Record<string, RunProgressType>> = {\n // --- Headline events a developer reacts to ---\n \"run.message\": \"message\",\n \"search.results_ready\": \"resultsReady\",\n \"run.phase_changed\": \"phase\", // Deep Research coarse phase\n \"run.section_completed\": \"sectionReady\", // Deep Research section finished\n \"run.monitor_created\": \"monitorCreated\", // Do Anything → Track handoff\n // NB: `run.interaction` is NOT here — it's an out-of-band case in the\n // normalizer (→ \"interaction\", carrying the typed Interaction object), like\n // screenshot/done. The old `run.input_request` / `run.take_control_*` family\n // it replaces is being removed backend-side; while the backend still lists\n // them in the catalog (dual-emit window) they fold to progress below — the\n // SDK no longer has an `inputRequired` surface (clean break).\n\n // --- Internal churn → progress (raw type stays on event.raw.event) ---\n // supervisor lifecycle / planning\n \"run.status_changed\": \"progress\",\n \"run.input_request\": \"progress\", // superseded by run.interaction\n \"run.input_request_resolved\": \"progress\",\n \"run.cost_update\": \"progress\", // cost is surfaced on RunResult, not as an event\n \"run.plan_ready\": \"progress\",\n \"run.plan_finalized\": \"progress\",\n \"run.subtask_started\": \"progress\",\n \"run.subtask_graded\": \"progress\",\n \"run.subtask_status\": \"progress\",\n \"run.todos_updated\": \"progress\",\n // sub-agent execution (actions + browser-agent telemetry)\n \"run.action.started\": \"progress\",\n \"run.action.completed\": \"progress\",\n \"run.action.failed\": \"progress\",\n \"run.action.progress\": \"progress\",\n \"run.action_result\": \"progress\",\n \"run.browser_agent.config_applied\": \"progress\",\n \"run.browser_agent.summary\": \"progress\",\n \"run.browser_agent.vision_decision\": \"progress\",\n \"run.browser_agent.observe\": \"progress\",\n \"run.browser_agent.page_gate\": \"progress\",\n // web search / deep research intermediate progress\n \"search.progress\": \"progress\",\n \"search.summarize_progress\": \"progress\",\n \"search.done\": \"progress\", // run ends on run.completed → \"done\"\n \"run.section_started\": \"progress\",\n \"run.section_failed\": \"progress\",\n \"run.replan_started\": \"progress\",\n \"run.crosscheck_done\": \"progress\",\n \"run.synthesize_progress\": \"progress\",\n // take-control / recording / live-url protocol\n \"run.take_control_pending\": \"progress\",\n \"run.take_control_expired\": \"progress\",\n \"run.user_paused\": \"progress\",\n \"run.user_released\": \"progress\",\n \"run.recording_started\": \"progress\",\n \"run.recording_paused\": \"progress\",\n \"run.recording_finalized\": \"progress\",\n // side-channel\n \"run.feedback_submitted\": \"progress\",\n};\n\n// Track monitor stream uses its own wire vocabulary (NOT the run-event catalog).\n// Handled out-of-band in the normalizer → curated Track event types.\nconst MONITOR_TRIGGERED = \"monitor.triggered\";\nconst MONITOR_LIFECYCLE = \"monitor.lifecycle_changed\";\n\n/** Best-effort human-readable line for a `progress` event (may be \"\"). */\nfunction pickNote(c: JsonObject): string {\n return (\n asString(c.note) ??\n asString(c.summary) ??\n asString(c.lastStepSummary) ??\n asString(c.label) ??\n asString(c.text) ??\n asString(c.kind) ?? // action events: \"click\" / \"input\" / \"navigate\" / …\n asString(c.toPhase) ??\n asString(c.status) ??\n asString(c.to) ??\n asString(c.reason) ??\n \"\"\n );\n}\n\n/**\n * Reshape the camelized wire payload into the fixed per-`event.type` data. This\n * is the whole point of the curated surface: once a consumer matches\n * `event.type`, `event.data` has a known shape. Caller wraps the result with\n * runId / at / raw / isTerminal.\n */\nfunction shapeData(type: RunProgressType, c: JsonObject): RunEvent[\"data\"] {\n switch (type) {\n // Simple events: event.data IS the value.\n case \"progress\":\n return pickNote(c); // a human-readable line (string)\n case \"resultsReady\":\n return asNumber(c.totalUniqueResults) ?? asNumber(c.count) ?? 0; // count\n case \"phase\":\n return asString(c.toPhase) ?? asString(c.phase) ?? \"\"; // phase name\n case \"sectionReady\":\n return asString(c.title) ?? asString(c.sectionTitle) ?? \"\"; // section title\n case \"monitorCreated\":\n return asString(c.monitorId) ?? \"\"; // monitor id\n case \"triggered\":\n return asString(c.summary) ?? asString(c.note) ?? \"\"; // change summary\n case \"checkCompleted\":\n return c.changed === true; // whether a change was found\n // Rich events: event.data is a small object.\n case \"message\":\n return { text: asString(c.text) ?? \"\", role: asString(c.role) ?? \"\" };\n }\n}\n\nexport interface NormalizeRunEventOptions {\n /**\n * The id of the run the stream was opened for. Terminal events of OTHER\n * runs on the same stream (internal sub-runs on a doAnything session) are\n * demoted to `progress` so they never end the caller's iterator. Pass\n * undefined for streams without a single top-level run (Track monitors).\n */\n topRunId?: string;\n}\n\n/**\n * Normalize one wire SSE event into a semantic `RunEvent`.\n *\n * Returns null for frames that carry no run event (heartbeats / comments).\n * The wire type → semantic `type` mapping is explicit (WIRE_TO_SEMANTIC, plus\n * the three out-of-band cases handled here); the original wire event stays on\n * `event.raw` so you can match `event.raw.event` against `QoniEventTypes`.\n */\nexport function normalizeRunEvent(\n wire: QoniEvent<unknown>,\n options: NormalizeRunEventOptions = {},\n): RunEvent | null {\n const envelope = isJsonObject(wire.data) ? wire.data : undefined;\n const wireType = wire.event ?? asString(envelope?.type);\n if (!wireType) return null;\n // Heartbeats are a transport keep-alive, not a run event.\n if (wireType === HEARTBEAT) return null;\n\n const payload = isJsonObject(envelope?.data) ? (envelope.data as JsonObject) : {};\n const taskId = asString(envelope?.task_id);\n const runId = taskId ?? options.topRunId ?? \"\";\n const at =\n asString(envelope?.occurred_at) ??\n asString(payload.occurred_at) ??\n asString(payload.timestamp) ??\n new Date().toISOString();\n const c = camelizeRecord(payload);\n const base = { runId, at, raw: wire };\n const isSubRun = Boolean(options.topRunId && taskId && taskId !== options.topRunId);\n\n if (wireType === SCREENSHOT) {\n const image = decodeScreenshotImage(payload);\n // A screenshot whose image couldn't be inlined (storage hiccup) degrades to\n // progress below — the `screenshot` type guarantees `image`.\n if (image) {\n const sData: RunScreenshotData = {};\n const pageUrl = asString(c.pageUrl) ?? asString(c.url);\n const step = asNumber(c.step) ?? asNumber(c.stepIndex);\n if (pageUrl !== undefined) sData.pageUrl = pageUrl;\n if (step !== undefined) sData.step = step;\n return { ...base, type: \"screenshot\", data: sData, image, isTerminal: false };\n }\n }\n\n if (wireType === \"run.browser_live_url_changed\") {\n const liveUrl = asString(c.liveUrl);\n // A malformed URL-change frame is still available to onWireEvent, but it\n // must not tell a viewer to navigate to an empty URL.\n if (!liveUrl) return null;\n const data: RunBrowserLiveUrlChangedData = {\n liveUrl,\n supportsLivePump: c.supportsLivePump === true,\n forceViewerReload: c.forceViewerReload === true,\n };\n const providerSessionId = asString(c.providerSessionId);\n if (providerSessionId) data.providerSessionId = providerSessionId;\n return { ...base, type: \"browserLiveUrlChanged\", data, isTerminal: false };\n }\n\n // Typed interaction lifecycle (axis B): the whole Interaction object rides\n // in the payload; normalizeInteraction camelizes + narrows it. A payload\n // without a recognized `type` degrades to progress below.\n if (wireType === INTERACTION) {\n const interaction = normalizeInteraction(payload);\n if (interaction) {\n return { ...base, type: \"interaction\", data: interaction, isTerminal: false };\n }\n }\n\n // Single terminal event (sub-run terminals fall through to \"progress\" so they\n // never end the top-level stream).\n if (wireType === TERMINAL && !isSubRun) {\n const dData: RunDoneData = {\n output: c.output,\n succeeded: typeof c.isTaskSuccessful === \"boolean\" ? c.isTaskSuccessful : null,\n terminalReason: asString(c.terminalReason) ?? \"\",\n };\n return { ...base, type: \"done\", data: dData, isTerminal: true };\n }\n\n // Resolve the curated type, then shape `data` to match it. Monitor-stream\n // wire types are their own vocabulary (not the run catalog); everything else\n // comes from WIRE_TO_SEMANTIC, with an unsynced backend addition degrading to\n // \"progress\" (fail-safe). The cast is safe: shapeData returns the data shape\n // that pairs with `type`, but TS can't narrow a dynamically-resolved type.\n let type: RunProgressType;\n if (wireType === MONITOR_TRIGGERED) type = \"triggered\";\n else if (wireType === MONITOR_LIFECYCLE) type = \"checkCompleted\";\n else type = WIRE_TO_SEMANTIC[wireType] ?? \"progress\";\n\n const data = shapeData(type, c);\n // Drop empty `progress` — these are pure internal telemetry (per-step\n // browser-agent observe / page_gate, etc.) that carry no human-readable line,\n // so they'd surface as a content-less tick. Real progress (a note, an action\n // kind, a status) still comes through.\n if (type === \"progress\" && data === \"\") return null;\n\n return { ...base, type, data, isTerminal: false } as RunEvent;\n}\n","// AUTO-GENERATED — do not edit by hand.\n// Source: src/generated/event-catalog.json (vendored from the backend's\n// domain.event.types, catalog v2). Regenerate with `pnpm gen:event-types`\n// after re-syncing the catalog. Drift is guarded by tests/event-catalog.test.ts\n// (SDK side) and the webagent-e2e contract suite (vs the live backend enums).\n//\n// These are the interaction discriminators (run.interaction): the `type`,\n// `status`, and action `kind` enums. The curated Interaction surface\n// (src/interactions.ts) builds its typed union on top of these.\n\n/**\n * The interaction `type` discriminator — the single field a consumer\n * switches on to pick a card / typed handle.\n */\nexport const InteractionTypes = {\n SiteLogin: \"site_login\",\n Clarification: \"clarification\",\n Confirmation: \"confirmation\",\n TakeControl: \"take_control\",\n Wait: \"wait\",\n} as const;\n\nexport type InteractionType = (typeof InteractionTypes)[keyof typeof InteractionTypes];\n\n/** Flat, ordered list of every InteractionType wire value — used by drift tests. */\nexport const INTERACTION_TYPE_VALUES: readonly InteractionType[] =\n Object.values(InteractionTypes);\n\n/**\n * Interaction lifecycle status (backend-authoritative):\n * pending → active → resolved | expired | canceled.\n */\nexport const InteractionStatuses = {\n Pending: \"pending\",\n Active: \"active\",\n Resolved: \"resolved\",\n Expired: \"expired\",\n Canceled: \"canceled\",\n} as const;\n\nexport type InteractionStatus = (typeof InteractionStatuses)[keyof typeof InteractionStatuses];\n\n/** Flat, ordered list of every InteractionStatus wire value — used by drift tests. */\nexport const INTERACTION_STATUS_VALUES: readonly InteractionStatus[] =\n Object.values(InteractionStatuses);\n\n/**\n * Action-contract kinds — what a consumer can do to an interaction.\n * Each maps to a typed method on InteractionHandle.\n */\nexport const ActionKinds = {\n answer: \"answer\",\n skip: \"skip\",\n confirm: \"confirm\",\n reject: \"reject\",\n openLogin: \"open_login\",\n confirmSignedIn: \"confirm_signed_in\",\n connectControl: \"connect_control\",\n refreshControl: \"refresh_control\",\n releaseControl: \"release_control\",\n retry: \"retry\",\n switchProfile: \"switch_profile\",\n} as const;\n\nexport type ActionKind = (typeof ActionKinds)[keyof typeof ActionKinds];\n\n/** Flat, ordered list of every ActionKind wire value — used by drift tests. */\nexport const ACTION_KIND_VALUES: readonly ActionKind[] =\n Object.values(ActionKinds);\n","export const QoniScopes = {\n GUMEM_SESSION_CREATE: \"gumem.session:create\",\n GUMEM_MESSAGE_WRITE: \"gumem.message:write\",\n GUMEM_MEMORY_READ: \"gumem.memory:read\",\n GUMEM_MEMORY_WRITE: \"gumem.memory:write\",\n GUMEM_MEMORY_DELETE: \"gumem.memory:delete\",\n GUMEM_SEARCH_RUN: \"gumem.search:run\",\n GUMEM_ADMIN_MANAGE: \"gumem.admin:manage\",\n GUMEM_RESOURCE_WRITE: \"gumem.resource:write\",\n GUMEM_ACTION_WRITE: \"gumem.action:write\",\n GUMEM_ACTION_READ: \"gumem.action:read\",\n GUMEM_PROFILE_READ: \"gumem.profile:read\",\n\n // WebAgent products: exactly two verbs per product — `read` (observe) and\n // `manage` (anything that changes execution state). See\n // wa/docs/qoni-sdk-public-surface.md §3.\n DO_ANYTHING_READ: \"webagent.do_anything:read\",\n DO_ANYTHING_MANAGE: \"webagent.do_anything:manage\",\n WEB_SEARCH_READ: \"webagent.web_search:read\",\n WEB_SEARCH_MANAGE: \"webagent.web_search:manage\",\n DEEP_RESEARCH_READ: \"webagent.deep_research:read\",\n DEEP_RESEARCH_MANAGE: \"webagent.deep_research:manage\",\n TRACK_READ: \"webagent.track:read\",\n TRACK_MANAGE: \"webagent.track:manage\",\n\n // Interactive site login (`InteractionHandle.openLogin()` on a `site_login`\n // interaction). Not part of any product bundle: the AccessKey policy must\n // allow it, and the delegation must request it explicitly.\n SITE_LOGIN_REQUEST: \"webagent.site_login:request\",\n // Persist that login into the browser profile (`OpenLoginResult.confirm()`).\n SITE_LOGIN_CONFIRM: \"webagent.site_login:confirm\",\n} as const;\n\nexport type QoniScope = (typeof QoniScopes)[keyof typeof QoniScopes];\n\n/** Product names accepted by `delegateToken({ products })`. */\nexport type QoniProduct = \"doAnything\" | \"webSearch\" | \"deepResearch\" | \"track\";\n\n/**\n * Scope sets granted by the `delegateToken({ products })` sugar — each\n * product expands to its full verb pair: `read` + `manage`.\n */\nexport const QoniProductScopes: Record<QoniProduct, readonly QoniScope[]> = {\n doAnything: [\n QoniScopes.DO_ANYTHING_READ,\n QoniScopes.DO_ANYTHING_MANAGE,\n ],\n webSearch: [\n QoniScopes.WEB_SEARCH_READ,\n QoniScopes.WEB_SEARCH_MANAGE,\n ],\n deepResearch: [\n QoniScopes.DEEP_RESEARCH_READ,\n QoniScopes.DEEP_RESEARCH_MANAGE,\n ],\n track: [\n QoniScopes.TRACK_READ,\n QoniScopes.TRACK_MANAGE,\n ],\n} as const;\n\n/** Every scope string the SDK knows about (gumem + webagent). */\nexport const KNOWN_SCOPES: readonly string[] = Object.values(QoniScopes);\n\nexport const QoniScopeBundles = {\n GUMEM_READONLY: [QoniScopes.GUMEM_MEMORY_READ, QoniScopes.GUMEM_PROFILE_READ],\n GUMEM_SESSION_RECALL: [\n QoniScopes.GUMEM_MEMORY_READ,\n QoniScopes.GUMEM_MEMORY_WRITE,\n QoniScopes.GUMEM_MESSAGE_WRITE,\n ],\n GUMEM_WRITE: [\n QoniScopes.GUMEM_SESSION_CREATE,\n QoniScopes.GUMEM_MESSAGE_WRITE,\n QoniScopes.GUMEM_ACTION_WRITE,\n ],\n // One bundle per WebAgent product = [read, manage].\n DO_ANYTHING: [\n QoniScopes.DO_ANYTHING_READ,\n QoniScopes.DO_ANYTHING_MANAGE,\n ],\n WEB_SEARCH: [\n QoniScopes.WEB_SEARCH_READ,\n QoniScopes.WEB_SEARCH_MANAGE,\n ],\n DEEP_RESEARCH: [\n QoniScopes.DEEP_RESEARCH_READ,\n QoniScopes.DEEP_RESEARCH_MANAGE,\n ],\n TRACK: [\n QoniScopes.TRACK_READ,\n QoniScopes.TRACK_MANAGE,\n ],\n} as const;\n","import { QoniValidationError } from \"./errors\";\nimport { camelizeRecord } from \"./run-events\";\nimport {\n ActionKinds,\n type ActionKind,\n type InteractionStatus,\n type InteractionType,\n} from \"./generated/interaction-types\";\nimport { QoniScopes } from \"./scopes\";\nimport { isJsonObject, type JsonObject } from \"./types\";\n\n/**\n * Curated interaction surface (axis B of the interaction model, see\n * webagentbackend/docs/qoni-interaction-model.md §2.3). A single wire event\n * `run.interaction` carries the complete, typed object across its whole\n * lifecycle (created / updated / resolved), discriminated by `type` and driven\n * by a backend-authoritative `status`. This replaces the old `run.input_request`\n * + `run.take_control_*` family — consumers no longer rebuild a state machine\n * from an event sequence.\n *\n * Wire is snake_case; this layer is camelCase. The `actions[]` contract carries\n * each action's endpoint, so the typed methods on {@link InteractionHandle}\n * post to the right route without the consumer hard-coding any path — and a\n * button/method only exists when the backend declared the action (structurally\n * closing off \"dead recovery affordances\").\n */\n\n/** A declared action a consumer can take on an interaction. */\nexport interface Action {\n /** What this action does — maps to a typed method on {@link InteractionHandle}. */\n kind: ActionKind;\n /** Human-readable button label. */\n label: string;\n /** HTTP method to invoke the endpoint with (defaults to POST on the wire). */\n method: string;\n /** Endpoint to invoke (run-relative path); the consumer never hard-codes it. */\n endpoint: string;\n /** JSON schema for the action's input body, when the action needs one. */\n inputSchema?: JsonObject | null;\n}\n\n/** Optional evidence image attached to an interaction. */\nexport interface InteractionEvidence {\n artifactId: string;\n}\n\n// ---- type-specific payloads -----------------------------------------------\n\n/** A site the agent needs the user to sign in to (`site_login`). */\nexport interface InteractionSite {\n siteId: string;\n displayName: string;\n loginUrl: string;\n}\n\nexport interface SiteLoginPayload {\n sites: InteractionSite[];\n /** Set when the login is for a Track monitor (monitor.needs_login reuse). */\n monitorId?: string;\n}\n\nexport interface ClarificationPayload {\n question: string;\n /** Hint for how the answer should be collected (e.g. \"text\", \"choice\"). */\n inputType?: string;\n}\n\nexport interface ConfirmationPayload {\n summary: string;\n}\n\nexport interface TakeControlPayload {\n liveUrl: string;\n surface?: string;\n reason?: string;\n}\n\nexport type WaitKind = \"rate_limit\" | \"external\" | \"sleep\";\n\nexport interface WaitPayload {\n waitKind: WaitKind;\n /** ISO 8601 — when the wait is expected to end. */\n until?: string;\n retryable?: boolean;\n}\n\n/** Maps each interaction `type` to its narrowed payload shape. */\nexport interface InteractionPayloadByType {\n site_login: SiteLoginPayload;\n clarification: ClarificationPayload;\n confirmation: ConfirmationPayload;\n take_control: TakeControlPayload;\n wait: WaitPayload;\n}\n\n/**\n * A typed interaction object. Generic over `type` so the `payload` narrows to\n * the matching shape; the bare `Interaction` (T = InteractionType) is the union\n * a consumer switches on.\n */\nexport interface Interaction<T extends InteractionType = InteractionType> {\n /** Stable identity across the interaction's lifecycle. */\n id: string;\n /** The discriminator — the single field a consumer switches on. */\n type: T;\n /** Backend-authoritative lifecycle status. */\n status: InteractionStatus;\n createdAt: string;\n resolvedAt?: string | null;\n expiresAt?: string | null;\n /** Human-readable title (e.g. \"Agent needs you to sign in\"). */\n title: string;\n /** Detail / question text. */\n prompt?: string | null;\n /** Optional evidence image. */\n evidence?: InteractionEvidence | null;\n /** Declared actions — drives the typed methods + UI buttons. */\n actions: Action[];\n /** Type-specific fields. */\n payload: InteractionPayloadByType[T];\n}\n\nfunction asString(value: unknown): string | undefined {\n return typeof value === \"string\" && value ? value : undefined;\n}\n\nfunction asBool(value: unknown): boolean | undefined {\n return typeof value === \"boolean\" ? value : undefined;\n}\n\nfunction normalizeActions(value: unknown): Action[] {\n if (!Array.isArray(value)) return [];\n const out: Action[] = [];\n for (const item of value) {\n if (!isJsonObject(item)) continue;\n const kind = asString(item.kind);\n if (!kind) continue;\n const action: Action = {\n kind: kind as ActionKind,\n label: asString(item.label) ?? \"\",\n method: asString(item.method) ?? \"POST\",\n endpoint: asString(item.endpoint) ?? \"\",\n };\n if (isJsonObject(item.inputSchema)) action.inputSchema = item.inputSchema;\n out.push(action);\n }\n return out;\n}\n\nfunction normalizeEvidence(c: JsonObject): InteractionEvidence | undefined {\n // Wire is `evidence_artifact_id` (camelized to `evidenceArtifactId`); the\n // curated surface nests it under a small object.\n const artifactId =\n asString(c.evidenceArtifactId) ??\n (isJsonObject(c.evidence) ? asString((c.evidence as JsonObject).artifactId) : undefined);\n return artifactId ? { artifactId } : undefined;\n}\n\nfunction shapePayload(type: InteractionType, c: JsonObject): Interaction[\"payload\"] {\n switch (type) {\n case \"site_login\": {\n const sites: InteractionSite[] = Array.isArray(c.sites)\n ? c.sites.flatMap((raw) => {\n if (!isJsonObject(raw)) return [];\n return [\n {\n siteId: asString(raw.siteId) ?? \"\",\n displayName: asString(raw.displayName) ?? \"\",\n loginUrl: asString(raw.loginUrl) ?? \"\",\n },\n ];\n })\n : [];\n const payload: SiteLoginPayload = { sites };\n const monitorId = asString(c.monitorId);\n if (monitorId) payload.monitorId = monitorId;\n return payload;\n }\n case \"clarification\": {\n const payload: ClarificationPayload = { question: asString(c.question) ?? \"\" };\n const inputType = asString(c.inputType);\n if (inputType) payload.inputType = inputType;\n return payload;\n }\n case \"confirmation\":\n return { summary: asString(c.summary) ?? \"\" };\n case \"take_control\": {\n const payload: TakeControlPayload = { liveUrl: asString(c.liveUrl) ?? \"\" };\n const surface = asString(c.surface);\n const reason = asString(c.reason);\n if (surface) payload.surface = surface;\n if (reason) payload.reason = reason;\n return payload;\n }\n case \"wait\": {\n const payload: WaitPayload = {\n waitKind: (asString(c.waitKind) as WaitKind) ?? \"external\",\n };\n const until = asString(c.until);\n const retryable = asBool(c.retryable);\n if (until) payload.until = until;\n if (retryable !== undefined) payload.retryable = retryable;\n return payload;\n }\n }\n}\n\n/**\n * Normalize a `run.interaction` wire payload into a curated {@link Interaction}.\n * `payload` is the camelized interaction object carried in the event envelope's\n * `data` field. Returns null when the object lacks a recognized `type`.\n */\nexport function normalizeInteraction(payload: unknown): Interaction | null {\n const c = camelizeRecord(payload);\n const type = asString(c.type) as InteractionType | undefined;\n if (!type) return null;\n const interaction: Interaction = {\n id: asString(c.id) ?? \"\",\n type,\n status: (asString(c.status) as InteractionStatus) ?? \"pending\",\n createdAt: asString(c.createdAt) ?? \"\",\n title: asString(c.title) ?? \"\",\n actions: normalizeActions(c.actions),\n payload: shapePayload(type, c),\n };\n const resolvedAt = asString(c.resolvedAt);\n const expiresAt = asString(c.expiresAt);\n const prompt = asString(c.prompt);\n const evidence = normalizeEvidence(c);\n if (resolvedAt) interaction.resolvedAt = resolvedAt;\n if (expiresAt) interaction.expiresAt = expiresAt;\n if (prompt) interaction.prompt = prompt;\n if (evidence) interaction.evidence = evidence;\n return interaction;\n}\n\n/**\n * Posts an interaction action to its declared endpoint. The product namespace\n * supplies this (token + run addressing already bound); the handle below uses\n * it to invoke `action.endpoint` without the consumer touching HTTP.\n */\nexport type InteractionActionPoster = (\n action: Action,\n body: JsonObject | undefined,\n options?: { requiredScopes?: readonly string[] },\n) => Promise<unknown>;\n\n/**\n * Scopes the product token must carry to invoke `action`. `open_login` starts\n * an interactive login session on the profiles route, which the backend guards\n * with `webagent.site_login:request`; every other action resolves the\n * interaction inside the product run and needs the product's manage scope.\n */\nexport function interactionActionScopes(action: Action, productManageScope: string): string[] {\n return action.kind === ActionKinds.openLogin\n ? [QoniScopes.SITE_LOGIN_REQUEST]\n : [productManageScope];\n}\n\n/** Options for {@link InteractionHandle.openLogin}. */\nexport interface OpenLoginOptions {\n /**\n * Site to sign in to — one of `interaction.payload.sites[].siteId`. May be\n * omitted when the interaction lists exactly one site.\n */\n siteId?: string;\n /** Re-login an existing browser profile in place instead of creating one. */\n profileId?: string;\n}\n\n/** Interactive login session started by {@link InteractionHandle.openLogin}. */\nexport interface OpenLoginResult {\n profileId: string;\n siteId: string;\n /** Login browser session the user signs in through. */\n sessionId: string;\n /** Live view URL of the login browser to show to the user. */\n liveUrl: string;\n /** Unmodified response body (escape hatch — shape may evolve with the API). */\n raw: JsonObject;\n /**\n * Persist the login into the profile after the user signs in\n * (`POST /profiles/{profileId}/confirm`). Confirming ends this login\n * session and closes its browser, whatever the outcome:\n *\n * - `active: true` — the login is saved; call\n * {@link InteractionHandle.confirmSignedIn}.\n * - `active: false` with `probeResult: \"no_session\"` — the backend no longer\n * holds the session (it may already have saved the login automatically, or\n * restarted). Call `confirmSignedIn()`: the agent rechecks the site and\n * raises a new `site_login` interaction if it is still signed out.\n * - Rejects with a `QoniError` whose `code` is `no_pending_login` (HTTP 409)\n * when the backend has no pending login for this profile: the session\n * already ended on providers that report it this way, or the profile no\n * longer exists for this user. Handle it like `no_session`: call\n * `confirmSignedIn()`, and the agent asks again if it is still signed out.\n * - `active: false` with any other `probeResult` — the user was not signed\n * in. Start a new session with `openLogin({ siteId, profileId })` and show\n * its new `liveUrl`; the old one no longer works.\n *\n * Requires `QoniScopes.SITE_LOGIN_CONFIRM`.\n */\n confirm(options?: ConfirmLoginOptions): Promise<ConfirmLoginResult>;\n}\n\n/** Options for {@link OpenLoginResult.confirm}. */\nexport interface ConfirmLoginOptions {\n /** Optional human-readable label stored on the profile. */\n displayLabel?: string;\n}\n\n/** Result of {@link OpenLoginResult.confirm}. */\nexport interface ConfirmLoginResult {\n profileId: string;\n /** True only when the profile is now `active` (the login was captured). */\n active: boolean;\n /** Profile state after confirmation: `active`, or `pending_login` when no signed-in session was detected. */\n state: string;\n /** Outcome of the backend's signed-in probe, for example `no_session`. */\n probeResult: string;\n /** Unmodified response body (escape hatch — shape may evolve with the API). */\n raw: JsonObject;\n}\n\n/**\n * Typed wrapper over an {@link Interaction} that exposes one method per\n * action kind. Each method finds the matching declared action and posts to its\n * endpoint; calling a method whose action the backend did NOT declare throws\n * (so \"dead recovery affordances\" are impossible — if you can call it, the\n * backend offered it).\n */\nexport class InteractionHandle<T extends InteractionType = InteractionType> {\n readonly interaction: Interaction<T>;\n\n constructor(\n interaction: Interaction<T>,\n private readonly post: InteractionActionPoster,\n ) {\n this.interaction = interaction;\n }\n\n get id(): string {\n return this.interaction.id;\n }\n get type(): T {\n return this.interaction.type;\n }\n get status(): InteractionStatus {\n return this.interaction.status;\n }\n get actions(): Action[] {\n return this.interaction.actions;\n }\n\n /** Whether the backend declared an action of this kind on the interaction. */\n can(kind: ActionKind): boolean {\n return this.interaction.actions.some((a) => a.kind === kind);\n }\n\n /** Answer a clarification ask. */\n async answer(text: string): Promise<void> {\n await this.invoke(ActionKinds.answer, { response: text });\n }\n /** Skip / dismiss the interaction (proceed without acting on it). */\n async skip(): Promise<void> {\n await this.invoke(ActionKinds.skip);\n }\n /** Confirm a pending confirmation (approve the plan / destructive op). */\n async confirm(): Promise<void> {\n await this.invoke(ActionKinds.confirm);\n }\n /** Reject a pending confirmation. */\n async reject(): Promise<void> {\n await this.invoke(ActionKinds.reject);\n }\n /**\n * Start an interactive login session for a `site_login` interaction. The\n * backend needs the site to sign in to: pass `siteId`, or omit it when the\n * interaction lists exactly one site. Show `liveUrl` to the user; when they\n * finish, call `confirm()` on the result to save the login, and act on its\n * outcome (see {@link OpenLoginResult.confirm}) before {@link confirmSignedIn}.\n * The delegation must include `QoniScopes.SITE_LOGIN_REQUEST` and\n * `QoniScopes.SITE_LOGIN_CONFIRM`; the AccessKey policy must allow both.\n */\n async openLogin(options: OpenLoginOptions = {}): Promise<OpenLoginResult> {\n // Undeclared action first: same contract as every other method.\n this.#declaredAction(ActionKinds.openLogin);\n const body: JsonObject = { site_id: this.#loginSiteId(options.siteId) };\n if (options.profileId !== undefined) {\n if (typeof options.profileId !== \"string\" || !options.profileId) {\n throw new QoniValidationError(\"openLogin profileId must be a non-empty string\");\n }\n body.profile_id = options.profileId;\n }\n const response = await this.invoke(ActionKinds.openLogin, body);\n const raw = isJsonObject(response) ? response : {};\n const fields = camelizeRecord(raw);\n const profileId = asString(fields.profileId) ?? \"\";\n const siteId = asString(fields.siteId) ?? String(body.site_id);\n return {\n profileId,\n siteId,\n sessionId: asString(fields.sessionId) ?? \"\",\n liveUrl: asString(fields.liveUrl) ?? \"\",\n raw,\n confirm: async (confirmOptions: ConfirmLoginOptions = {}) => {\n if (!profileId) {\n throw new QoniValidationError(\"openLogin response did not include a profileId to confirm\");\n }\n const confirmBody: JsonObject = { site_id: siteId };\n if (confirmOptions.displayLabel !== undefined) confirmBody.display_label = confirmOptions.displayLabel;\n // The confirm route is not a declared interaction action; it belongs to\n // the login session openLogin() started, on the same profiles router.\n const response = await this.post(\n {\n kind: ActionKinds.openLogin,\n label: \"Confirm login\",\n method: \"POST\",\n endpoint: `/profiles/${encodeURIComponent(profileId)}/confirm`,\n },\n confirmBody,\n { requiredScopes: [QoniScopes.SITE_LOGIN_CONFIRM] },\n );\n const raw = isJsonObject(response) ? response : {};\n const fields = camelizeRecord(raw);\n const state = asString(fields.state) ?? \"\";\n return {\n profileId: asString(fields.profileId) ?? profileId,\n active: state === \"active\",\n state,\n probeResult: asString(fields.probeResult) ?? \"\",\n raw,\n };\n },\n };\n }\n /** Tell the agent the user has finished signing in. */\n async confirmSignedIn(): Promise<void> {\n await this.invoke(ActionKinds.confirmSignedIn);\n }\n /** Connect to the live browser for a take_control interaction. */\n async connectControl(): Promise<void> {\n await this.invoke(ActionKinds.connectControl);\n }\n /** Refresh the live control surface / live url. */\n async refreshControl(): Promise<void> {\n await this.invoke(ActionKinds.refreshControl);\n }\n /** Hand control back to the agent. */\n async releaseControl(): Promise<void> {\n await this.invoke(ActionKinds.releaseControl);\n }\n /** Retry a wait interaction now. */\n async retry(): Promise<void> {\n await this.invoke(ActionKinds.retry);\n }\n /** Switch the profile a wait/login interaction is bound to. */\n async switchProfile(): Promise<void> {\n await this.invoke(ActionKinds.switchProfile);\n }\n\n /** Resolve the site for `openLogin`: explicit, or the only listed site. */\n #loginSiteId(requested: string | undefined): string {\n const payload = this.interaction.payload as Partial<SiteLoginPayload> | undefined;\n const listed = Array.isArray(payload?.sites)\n ? payload.sites.map((site) => site.siteId).filter((id) => typeof id === \"string\" && id.length > 0)\n : [];\n if (requested !== undefined) {\n if (typeof requested !== \"string\" || !requested) {\n throw new QoniValidationError(\"openLogin siteId must be a non-empty string\");\n }\n if (listed.length > 0 && !listed.includes(requested)) {\n throw new QoniValidationError(\n `openLogin siteId \"${requested}\" is not one of the sites this interaction asks for: ${listed.join(\", \")}`,\n );\n }\n return requested;\n }\n if (listed.length === 1) return listed[0];\n throw new QoniValidationError(\n listed.length === 0\n ? \"openLogin needs a siteId: this interaction does not list the site to sign in to\"\n : `openLogin needs a siteId: choose one of ${listed.join(\", \")}`,\n );\n }\n\n /**\n * Invoke an action by kind with an optional body. `async` so a missing-action\n * error surfaces as a rejected promise (not a synchronous throw), keeping the\n * method contract uniformly promise-based.\n */\n private async invoke(kind: ActionKind, body?: JsonObject): Promise<unknown> {\n return this.post(this.#declaredAction(kind), body);\n }\n\n /** The declared action of `kind`; throws when the backend did not offer it. */\n #declaredAction(kind: ActionKind): Action {\n const action = this.interaction.actions.find((a) => a.kind === kind);\n if (!action) {\n const offered = this.interaction.actions.map((a) => a.kind).join(\", \") || \"none\";\n throw new QoniValidationError(\n `interaction \"${this.interaction.id}\" (${this.interaction.type}) does not offer the ` +\n `\"${kind}\" action — the backend declared: ${offered}. ` +\n \"Only call methods whose action the interaction currently offers.\",\n );\n }\n return action;\n }\n}\n","import { QoniError, QoniTimeoutError } from \"./errors\";\nimport {\n InteractionHandle,\n type Action,\n type Interaction,\n} from \"./interactions\";\nimport {\n isTerminalRunStatus,\n normalizeRunEvent,\n type RunEvent,\n type RunImage,\n} from \"./run-events\";\nimport { isJsonObject, type QoniEvent, type JsonObject } from \"./types\";\n\n/** Opaque reference to a backend browser/context session a run executed in. */\nexport interface SessionRef {\n sessionId: string;\n}\n\n/** Semantic capture switch — controls which media events the stream delivers. */\nexport interface CaptureOptions {\n screenshots?: boolean;\n videoFrames?: boolean;\n}\n\nexport interface RunEventsOptions {\n lastEventId?: string;\n signal?: AbortSignal;\n /**\n * Receives every original SSE frame before semantic normalization/filtering.\n * Use this for audit logs and observability evidence that must retain internal\n * Agent/tool lifecycle payloads. Some frames do not become semantic events.\n */\n onWireEvent?: (event: QoniEvent<unknown>) => void | Promise<void>;\n /** Called whenever the SDK reconnects a dropped SSE stream. */\n onReconnect?: (info: RunReconnectInfo) => void;\n}\n\nexport interface RunReconnectInfo {\n attempt: number;\n lastEventId?: string;\n error: unknown;\n}\n\n/** A refreshed snapshot of a run's state, as returned by `run.status()`. */\nexport interface RunStatus {\n id: string;\n /** pending | running | awaiting_input | succeeded | failed | canceled */\n status: string;\n sessionId?: string;\n output?: unknown;\n /** Full wire run envelope (escape hatch — shape may evolve with the API). */\n raw: JsonObject;\n}\n\n/** A deliverable produced by a run. Content is fetched lazily via `content()`. */\nexport interface Artifact {\n id: string;\n name?: string;\n mime?: string;\n sizeBytes?: number;\n createdAt?: string;\n /** Temporary signed storage URL; refresh after expiry. */\n downloadUrl?: string;\n expiresIn?: number;\n refreshDownloadUrl?(): Promise<string>;\n content(): Promise<Uint8Array>;\n}\n\n/** Settled outcome of `run.wait()`. */\nexport interface RunResult {\n runId: string;\n status: \"succeeded\" | \"failed\" | \"canceled\";\n /** Final answer / output payload (shape is task-specific). */\n output?: unknown;\n /** Deliverables (deepResearch reports etc). Empty array for products without artifacts. */\n artifacts: Artifact[];\n terminalReason?: string;\n isTaskSuccessful?: boolean;\n /** Full wire run envelope (escape hatch — shape may evolve with the API). */\n raw: JsonObject;\n}\n\nexport interface RunWaitOptions {\n /** Client-side wall-clock cap. On elapse, `wait` throws `QoniTimeoutError`; the run keeps executing server-side. */\n timeoutMs?: number;\n signal?: AbortSignal;\n onEvent?: (event: RunEvent) => void | Promise<void>;\n /** Every original SSE frame, including frames filtered from the semantic stream. */\n onWireEvent?: (event: QoniEvent<unknown>) => void | Promise<void>;\n /** Reconnect telemetry for the underlying resumable SSE stream. */\n onReconnect?: (info: RunReconnectInfo) => void;\n /**\n * Fires on `event.type === \"interaction\"` (HITL). The handle exposes typed\n * action methods (`interaction.answer(…)` / `confirmSignedIn()` /\n * `releaseControl()` / …) that post to the action's declared endpoint.\n */\n onInteraction?: (\n interaction: InteractionHandle,\n event: RunEvent,\n ) => void | Promise<void>;\n onScreenshot?: (image: RunImage, index: number) => void | Promise<void>;\n}\n\n/**\n * Product-specific wire operations a `RunHandle` is built on. Each product\n * namespace constructs one of these from its `api.*` escape-hatch methods\n * with the token + run addressing already bound.\n */\nexport interface RunWireOps {\n getDetail(signal?: AbortSignal): Promise<JsonObject>;\n streamEvents(opts: RunEventsOptions): AsyncIterable<QoniEvent<unknown>>;\n /**\n * Invoke an interaction action by posting to its declared endpoint. The\n * Interaction model's `actions[]` carry the endpoint + method, so the SDK\n * never hard-codes a HITL route — it forwards what the backend declared.\n */\n postAction(\n action: Action,\n body: JsonObject | undefined,\n options?: { requiredScopes?: readonly string[] },\n ): Promise<unknown>;\n cancel(reason?: string): Promise<JsonObject>;\n /** Products without artifacts leave this undefined → `result.artifacts` is []. */\n listArtifacts?(signal?: AbortSignal): Promise<Artifact[]>;\n}\n\n// Wire statuses cancel() treats as \"may already be terminal\" — it then\n// refreshes the run and returns the terminal state instead of throwing.\n// Auth / permission / 5xx errors always rethrow.\nconst CANCEL_IDEMPOTENT_STATUSES = new Set([400, 404, 409, 410, 422]);\n\n/**\n * Handle to a single run. Generic over the product's event set (分型): a\n * `RunHandle<DeepResearchEvent>` only ever yields Deep Research events, so\n * `switch (event.type)` autocompletes just that product's events and a\n * wrong-product case is a compile error. The runtime is identical across\n * products; the generic only narrows the public type surface.\n */\nexport class RunHandle<E extends RunEvent = RunEvent> {\n readonly id: string;\n /** Pass back to `run({ session })` to reuse the same backend session. */\n sessionRef?: SessionRef;\n private readonly capture: CaptureOptions;\n\n constructor(\n private readonly ops: RunWireOps,\n init: { id: string; sessionRef?: SessionRef; capture?: CaptureOptions },\n ) {\n this.id = init.id;\n this.sessionRef = init.sessionRef;\n this.capture = init.capture ?? {};\n }\n\n /** Refresh and return the run's current state. */\n async status(): Promise<RunStatus> {\n const detail = await this.ops.getDetail();\n this.#adoptSessionRef(detail);\n return normalizeRunStatus(this.id, detail);\n }\n\n /**\n * Stream semantic events. Ends automatically at the run's terminal event.\n * Reconnects with `Last-Event-ID` catch-up are handled internally.\n */\n async *events(opts: RunEventsOptions = {}): AsyncIterable<E> {\n for await (const wire of this.ops.streamEvents(opts)) {\n await opts.onWireEvent?.(wire);\n const event = normalizeRunEvent(wire, { topRunId: this.id });\n if (!event) continue;\n if (event.type === \"screenshot\" && !this.capture.screenshots) continue;\n if (isVideoFrame(wire) && !this.capture.videoFrames) continue;\n // The normalizer yields the full RunEvent union; this product handle only\n // receives its own subset, so the narrowing cast is sound.\n yield event as E;\n if (event.isTerminal) return;\n }\n }\n\n /** Drive the run to a terminal state and return the settled result. */\n async wait(opts: RunWaitOptions = {}): Promise<RunResult> {\n const { signal, timedOut, dispose } = withTimeout(opts.signal, opts.timeoutMs);\n let lastEventId: string | undefined;\n let eventIdAtLastClose: string | undefined;\n let sawCleanClose = false;\n let terminalDetail: JsonObject | undefined;\n let terminalDoneReason: string | undefined;\n let screenshotIndex = 0;\n\n try {\n settled: for (;;) {\n for await (const event of this.events({\n signal,\n lastEventId,\n onWireEvent: (wire) => waitWithSignal(() => {\n if (wire.id !== undefined) lastEventId = wire.id;\n return opts.onWireEvent?.(wire);\n }, signal),\n onReconnect: opts.onReconnect,\n })) {\n await waitWithSignal(() => opts.onEvent?.(event), signal);\n if (event.type === \"screenshot\") {\n await waitWithSignal(() => opts.onScreenshot?.(event.image, screenshotIndex++), signal);\n } else if (event.type === \"interaction\") {\n await waitWithSignal(() => opts.onInteraction?.(this.interactionHandle(event.data), event), signal);\n }\n if (event.isTerminal) {\n // The `done` event carries terminalReason even when the detail\n // envelope omits it — keep it as a fallback so RunResult isn't\n // missing a reason the stream already delivered.\n if (event.type === \"done\") terminalDoneReason = event.data.terminalReason || undefined;\n break settled;\n }\n }\n // The server closed the stream without a terminal event. If the run\n // detail says terminal we are done; otherwise resume the stream from\n // the last seen event id — but only if the stream made progress since\n // the previous clean close, so a server that keeps closing an idle\n // stream cannot spin us in a tight reconnect loop.\n const detail = await settleRead(() => this.ops.getDetail(signal), signal);\n if (isTerminalRunStatus(normalizeRunStatus(this.id, detail).status)) {\n terminalDetail = detail;\n break;\n }\n if (sawCleanClose && lastEventId === eventIdAtLastClose) {\n throw new QoniError(\n \"run event stream ended before a terminal event while the run is \" +\n `still \"${String(detail.status)}\" — re-attach or poll status()`,\n { code: \"upstream.failed\", retryable: true },\n );\n }\n sawCleanClose = true;\n eventIdAtLastClose = lastEventId;\n }\n\n const detail = terminalDetail ?? await settleRead(() => this.ops.getDetail(signal), signal);\n this.#adoptSessionRef(detail);\n const result = settleRunResult(this.id, detail, [], terminalDoneReason);\n result.artifacts = this.ops.listArtifacts\n ? await settleRead(() => this.ops.listArtifacts!(signal), signal)\n : [];\n return result;\n } catch (err) {\n if (timedOut() && !opts.signal?.aborted) {\n throw new QoniTimeoutError(\n `run.wait timed out after ${opts.timeoutMs} ms — the run keeps executing ` +\n \"server-side; attach() to it again or cancel() it\",\n { cause: err },\n );\n }\n throw err;\n } finally {\n dispose();\n }\n }\n\n /**\n * Wrap an {@link Interaction} (from `event.data` of an `interaction` event)\n * in a typed {@link InteractionHandle} bound to this run. The handle's action\n * methods (`answer` / `confirmSignedIn` / `releaseControl` / …) post to the\n * endpoint the backend declared for that action.\n */\n interactionHandle(interaction: Interaction): InteractionHandle {\n return new InteractionHandle(interaction, (action, body, options) =>\n this.ops.postAction(action, body, options),\n );\n }\n\n /**\n * Cancel the run. Idempotent: cancelling an already-terminal run returns\n * its terminal state instead of throwing.\n */\n async cancel(reason?: string): Promise<RunStatus> {\n try {\n const data = await this.ops.cancel(reason);\n this.#adoptSessionRef(data);\n return normalizeRunStatus(this.id, data);\n } catch (err) {\n if (err instanceof QoniError && CANCEL_IDEMPOTENT_STATUSES.has(err.status ?? 0)) {\n let snapshot: RunStatus;\n try {\n snapshot = await this.status();\n } catch {\n throw err;\n }\n if (isTerminalRunStatus(snapshot.status)) return snapshot;\n }\n throw err;\n }\n }\n\n #adoptSessionRef(detail: JsonObject): void {\n const sessionId = typeof detail.session_id === \"string\" ? detail.session_id : undefined;\n if (sessionId && !this.sessionRef) this.sessionRef = { sessionId };\n }\n}\n\nexport function normalizeRunStatus(id: string, detail: JsonObject): RunStatus {\n return {\n id,\n status: typeof detail.status === \"string\" ? detail.status : inferStatus(detail),\n sessionId: typeof detail.session_id === \"string\" ? detail.session_id : undefined,\n output: runOutput(detail),\n raw: detail,\n };\n}\n\nfunction settleRunResult(\n runId: string,\n detail: JsonObject,\n artifacts: Artifact[],\n fallbackTerminalReason?: string,\n): RunResult {\n const terminalReason =\n (typeof detail.terminal_reason === \"string\" ? detail.terminal_reason : undefined) ??\n fallbackTerminalReason;\n const isTaskSuccessful =\n typeof detail.is_task_successful === \"boolean\" ? detail.is_task_successful : undefined;\n const status = normalizeRunStatus(runId, detail).status;\n if (!isTerminalRunStatus(status)) {\n throw new QoniError(\n \"run detail did not confirm a terminal state — re-attach or poll status()\",\n { code: \"upstream.failed\", retryable: true, body: detail },\n );\n }\n return {\n runId,\n status: status as RunResult[\"status\"],\n output: runOutput(detail),\n artifacts,\n terminalReason,\n isTaskSuccessful,\n raw: detail,\n };\n}\n\n// Product run envelopes name their output differently today (doAnything\n// `output`, deepResearch `result`, webSearch `results`) — one field out.\nfunction runOutput(detail: JsonObject): unknown {\n return detail.output ?? detail.result ?? detail.results;\n}\n\nfunction inferStatus(detail: JsonObject): string {\n const reason = typeof detail.terminal_reason === \"string\" ? detail.terminal_reason : undefined;\n if (reason === \"canceled\") return \"canceled\";\n if (reason === \"failed\" || reason === \"expired\") return \"failed\";\n if (reason === \"done\") return \"succeeded\";\n return \"\";\n}\n\nfunction isVideoFrame(wire: QoniEvent<unknown>): boolean {\n const type = wire.event ?? (isJsonObject(wire.data) ? wire.data.type : undefined);\n return type === \"browser_video_frame\" || type === \"run.browser_video_frame\";\n}\n\n// Combine an optional user signal with an optional wall-clock timeout into one\n// signal (Node 18 has no AbortSignal.any). `timedOut()` reports whether OUR\n// timer fired (vs the user aborting), so the caller can distinguish them.\nexport function withTimeout(\n signal: AbortSignal | undefined,\n timeoutMs: number | undefined,\n): { signal?: AbortSignal; timedOut: () => boolean; dispose: () => void } {\n if (!timeoutMs) return { signal, timedOut: () => false, dispose: () => {} };\n const controller = new AbortController();\n let fired = false;\n const timer = setTimeout(() => {\n fired = true;\n controller.abort();\n }, timeoutMs);\n const onAbort = () => controller.abort(signal?.reason);\n const dispose = () => {\n clearTimeout(timer);\n signal?.removeEventListener(\"abort\", onAbort);\n };\n controller.signal.addEventListener(\"abort\", dispose, { once: true });\n if (signal) {\n if (signal.aborted) onAbort();\n else signal.addEventListener(\"abort\", onAbort, { once: true });\n }\n return { signal: controller.signal, timedOut: () => fired, dispose };\n}\n\n/** Retries after the first failure of a settle read (two retries in total). */\nconst SETTLE_READ_BACKOFF_MS = [250, 1_000] as const;\n\n/**\n * Idempotent reads `wait()` performs after the event stream: run detail and\n * the artifact list. A transient failure here (a dropped connection or a\n * timed-out token exchange, both `retryable`) must not fail a run that\n * already finished, so these reads retry a bounded number of times. Only\n * `retryable` QoniErrors are retried; aborts and `wait()`'s own deadline\n * (both surfaced through `signal`) stop immediately.\n */\nasync function settleRead<T>(read: () => Promise<T>, signal: AbortSignal | undefined): Promise<T> {\n for (let attempt = 0; ; attempt++) {\n try {\n return await waitWithSignal(read, signal);\n } catch (err) {\n const delay = SETTLE_READ_BACKOFF_MS[attempt];\n if (delay === undefined || signal?.aborted || !(err instanceof QoniError) || !err.retryable) throw err;\n await sleepWithSignal(delay, signal);\n }\n }\n}\n\nfunction sleepWithSignal(ms: number, signal: AbortSignal | undefined): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n if (signal?.aborted) {\n reject(signal.reason ?? new DOMException(\"Aborted\", \"AbortError\"));\n return;\n }\n const onAbort = () => {\n clearTimeout(timer);\n reject(signal!.reason ?? new DOMException(\"Aborted\", \"AbortError\"));\n };\n const timer = setTimeout(() => {\n signal?.removeEventListener(\"abort\", onAbort);\n resolve();\n }, ms);\n signal?.addEventListener(\"abort\", onAbort, { once: true });\n });\n}\n\nfunction waitWithSignal<T>(operation: () => T | PromiseLike<T>, signal?: AbortSignal): Promise<T> {\n if (!signal) return Promise.resolve().then(operation);\n return new Promise<T>((resolve, reject) => {\n const onAbort = () => reject(signal.reason ?? new DOMException(\"Aborted\", \"AbortError\"));\n if (signal.aborted) {\n onAbort();\n return;\n }\n signal.addEventListener(\"abort\", onAbort, { once: true });\n Promise.resolve().then(() => {\n signal.throwIfAborted();\n return operation();\n }).then(resolve, reject).finally(() => signal.removeEventListener(\"abort\", onAbort));\n });\n}\n","import { QoniValidationError } from \"./errors\";\nimport {\n RunHandle,\n type Artifact,\n type CaptureOptions,\n type RunWireOps,\n type SessionRef,\n} from \"./run-handle\";\nimport type { DeepResearchEvent } from \"./run-events\";\nimport { interactionActionScopes } from \"./interactions\";\nimport type { RunLimits } from \"./do-anything\";\nimport {\n isJsonObject,\n type QoniEvent,\n type QoniHttpMethod,\n type QoniResponse,\n type QoniTransport,\n type JsonObject,\n type RuntimeTokenInput,\n} from \"./types\";\n\nexport interface DeepResearchRunOptions {\n /** Delegation token — passed once here; the returned handle holds it. */\n token: string;\n /** The research topic. */\n prompt: string;\n capture?: CaptureOptions;\n limits?: RunLimits;\n /**\n * Reuse an existing research session — a follow-up run that inherits the\n * prior run's context. Pass `prior.sessionRef`.\n */\n session?: SessionRef;\n // Product-specific options stay camelCase.\n depth?: \"light\" | \"standard\" | \"deep\";\n outputFormat?: string;\n targetAudience?: string;\n domainWhitelist?: string[];\n domainBlacklist?: string[];\n [key: string]: unknown;\n}\n\nexport interface DeepResearchAttachOptions {\n token: string;\n capture?: CaptureOptions;\n}\n\n/**\n * DeepResearch capability namespace — runs are created with a research\n * `topic`, gated by an optional HITL outline approval, then stream events\n * until a cited report is produced. Mirrors the backend contract at\n * `/api/v1/projects/{tenant}/deep_research/...`.\n */\nexport function createDeepResearchNamespace(transport: QoniTransport) {\n /**\n * Wire-level escape hatch — 1:1 with the backend HTTP contract. Shapes\n * here may evolve with the API and are not covered by the frozen public\n * contract. `followUp` (terminal-run messages) and `feedback` (report\n * rating) live only here.\n */\n const api = {\n run: <T = unknown>(input: RuntimeTokenInput & JsonObject): Promise<QoniResponse<T>> =>\n transport.webAgentJson(\"POST\", \"/deep_research/runs\", input.token, {\n body: normalizeDeepResearchRunInput(omit(input, \"token\")),\n requiredScopes: [\"webagent.deep_research:manage\"],\n }),\n\n get: <T = unknown>(input: RuntimeTokenInput & { runId: string; signal?: AbortSignal }): Promise<QoniResponse<T>> =>\n transport.webAgentJson(\n \"GET\",\n `/deep_research/runs/${encodeURIComponent(input.runId)}`,\n input.token,\n {\n signal: input.signal,\n requiredScopes: [\"webagent.deep_research:read\"],\n },\n ),\n\n events: <T = unknown>(\n input: RuntimeTokenInput & {\n runId: string;\n lastEventId?: string;\n signal?: AbortSignal;\n onReconnect?: (info: { attempt: number; lastEventId?: string; error: unknown }) => void;\n },\n ): AsyncIterable<QoniEvent<T>> =>\n transport.webAgentSSE(\n `/deep_research/runs/${encodeURIComponent(input.runId)}/events`,\n input.token,\n {\n lastEventId: input.lastEventId,\n requiredScopes: [\"webagent.deep_research:read\"],\n signal: input.signal,\n onReconnect: input.onReconnect,\n },\n ),\n\n followUp: <T = unknown>(\n input: RuntimeTokenInput & { runId: string; text: string },\n ): Promise<QoniResponse<T>> =>\n transport.webAgentJson(\n \"POST\",\n `/deep_research/runs/${encodeURIComponent(input.runId)}/messages`,\n input.token,\n {\n body: omit(input, \"token\", \"runId\"),\n requiredScopes: [\"webagent.deep_research:manage\"],\n },\n ),\n\n cancel: <T = unknown>(\n input: RuntimeTokenInput & { runId: string },\n ): Promise<QoniResponse<T>> =>\n transport.webAgentJson(\n \"POST\",\n `/deep_research/runs/${encodeURIComponent(input.runId)}/cancel`,\n input.token,\n {\n body: {},\n requiredScopes: [\"webagent.deep_research:manage\"],\n },\n ),\n\n feedback: <T = unknown>(\n input: RuntimeTokenInput & { runId: string } & JsonObject,\n ): Promise<QoniResponse<T>> =>\n transport.webAgentJson(\n \"POST\",\n `/deep_research/runs/${encodeURIComponent(input.runId)}/feedback`,\n input.token,\n {\n body: renameKeys(omit(input, \"token\", \"runId\"), { feedbackText: \"feedback_text\" }),\n requiredScopes: [\"webagent.deep_research:manage\"],\n },\n ),\n\n listArtifacts: <T = unknown>(\n input: RuntimeTokenInput & { runId: string; signal?: AbortSignal },\n ): Promise<QoniResponse<T>> =>\n transport.webAgentJson(\n \"GET\",\n `/deep_research/runs/${encodeURIComponent(input.runId)}/artifacts`,\n input.token,\n {\n signal: input.signal,\n requiredScopes: [\"webagent.deep_research:read\"],\n },\n ),\n\n getArtifact: <T = unknown>(\n input: RuntimeTokenInput & { runId: string; artifactId: string },\n ): Promise<QoniResponse<T>> =>\n transport.webAgentJson(\n \"GET\",\n `/deep_research/runs/${encodeURIComponent(input.runId)}/artifacts/${encodeURIComponent(input.artifactId)}`,\n input.token,\n {\n requiredScopes: [\"webagent.deep_research:read\"],\n },\n ),\n };\n\n function buildOps(token: string | undefined, runId: string): RunWireOps {\n return {\n getDetail: async (signal) => asRecord((await api.get<unknown>({ token, runId, signal })).data),\n streamEvents: (opts) =>\n api.events({\n token,\n runId,\n lastEventId: opts.lastEventId,\n signal: opts.signal,\n onReconnect: opts.onReconnect,\n }),\n postAction: async (action, body, options) =>\n (\n await transport.webAgentJson(\n (action.method || \"POST\") as QoniHttpMethod,\n action.endpoint,\n token,\n {\n ...(body !== undefined ? { body } : {}),\n requiredScopes: options?.requiredScopes ?? interactionActionScopes(action, \"webagent.deep_research:manage\"),\n },\n )\n ).data,\n cancel: async () => asRecord((await api.cancel<unknown>({ token, runId })).data),\n listArtifacts: async (signal) => {\n const res = await api.listArtifacts<{ items?: unknown }>({ token, runId, signal });\n const items = Array.isArray(res.data?.items) ? res.data.items : [];\n return items.filter(isJsonObject).map((item) => toArtifact(item, token, runId));\n },\n };\n }\n\n function toArtifact(item: JsonObject, token: string | undefined, runId: string): Artifact {\n const id = typeof item.id === \"string\" ? item.id : \"\";\n return {\n id,\n name: typeof item.name === \"string\" && item.name ? item.name : undefined,\n mime: typeof item.mime_type === \"string\" ? item.mime_type : undefined,\n sizeBytes: typeof item.size_bytes === \"number\" ? item.size_bytes : undefined,\n createdAt: typeof item.created_at === \"string\" ? item.created_at : undefined,\n content: async () =>\n (\n await transport.webAgentBytes(\n `/deep_research/runs/${encodeURIComponent(runId)}/artifacts/${encodeURIComponent(id)}`,\n token,\n { requiredScopes: [\"webagent.deep_research:read\"] },\n )\n ).bytes,\n };\n }\n\n return {\n /**\n * Start a research run. Pass `session: prior.sessionRef` to start a\n * follow-up run that inherits the prior run's context.\n */\n run: async (input: DeepResearchRunOptions): Promise<RunHandle<DeepResearchEvent>> => {\n const { token, prompt, capture, limits, session, ...rest } = input;\n if (!prompt) {\n throw new QoniValidationError(\"deepResearch.run requires a prompt\");\n }\n\n const run = await api.run<{ run_id?: string; id?: string }>({\n token,\n topic: prompt,\n ...rest,\n ...(limits?.maxDurationMinutes !== undefined\n ? { maxDurationMinutes: limits.maxDurationMinutes }\n : {}),\n ...(session ? { session_id: session.sessionId } : {}),\n });\n const runId = run.data.run_id || run.data.id;\n if (!runId) {\n throw new QoniValidationError(\"deepResearch run create did not return a run id\");\n }\n return new RunHandle<DeepResearchEvent>(buildOps(token, runId), {\n id: runId,\n sessionRef: session,\n capture,\n });\n },\n\n /** Reconnect to an existing run. Verifies the run exists before returning. */\n attach: async (\n runId: string,\n opts: DeepResearchAttachOptions,\n ): Promise<RunHandle<DeepResearchEvent>> => {\n const handle = new RunHandle<DeepResearchEvent>(buildOps(opts.token, runId), {\n id: runId,\n capture: opts.capture,\n });\n await handle.status();\n return handle;\n },\n\n api,\n };\n}\n\nfunction normalizeDeepResearchRunInput(input: JsonObject): JsonObject {\n return renameKeys(input, {\n outputFormat: \"output_format\",\n targetAudience: \"target_audience\",\n maxDurationMinutes: \"max_duration_minutes\",\n callbackUrl: \"callback_url\",\n domainWhitelist: \"domain_whitelist\",\n domainBlacklist: \"domain_blacklist\",\n });\n}\n\nfunction asRecord(value: unknown): JsonObject {\n return isJsonObject(value) ? value : {};\n}\n\nfunction omit(value: object, ...keys: string[]): JsonObject {\n const skipped = new Set(keys);\n const out: JsonObject = {};\n for (const [key, item] of Object.entries(value)) {\n if (!skipped.has(key) && item !== undefined) out[key] = item;\n }\n return out;\n}\n\nfunction renameKeys(value: JsonObject, mapping: Record<string, string>): JsonObject {\n const out: JsonObject = {};\n for (const [key, item] of Object.entries(value)) {\n const target = mapping[key] || key;\n if (out[target] === undefined) out[target] = item;\n }\n return out;\n}\n","import { QoniValidationError } from \"./errors\";\nimport {\n RunHandle,\n type Artifact,\n type CaptureOptions,\n type RunWireOps,\n type SessionRef,\n} from \"./run-handle\";\nimport type { DoAnythingEvent } from \"./run-events\";\nimport { interactionActionScopes } from \"./interactions\";\nimport {\n isJsonObject,\n type QoniEvent,\n type QoniHttpMethod,\n type QoniResponse,\n type QoniTransport,\n type JsonObject,\n type RuntimeTokenInput,\n} from \"./types\";\n\n/**\n * A structured snapshot of the agent's state at a single step — not just an\n * image. The screenshot is one field (an inline reference/data), alongside the\n * metadata and extracted page state captured at that moment.\n */\nexport interface DoAnythingSnapshot {\n /** When the snapshot was captured (ISO 8601). */\n capturedAt?: string;\n /** Which step of the run this snapshot belongs to. */\n stepIndex?: number;\n /** The page the agent was on. */\n url?: string;\n /** Title of the page, if known. */\n title?: string;\n /** The screenshot image — carried in JSON (base64) and/or by reference. */\n image?: SnapshotImage;\n /** What the agent was doing at this step. */\n action?: SnapshotAction;\n}\n\nexport interface SnapshotImage {\n /** Base64-encoded image bytes (no data: prefix). */\n base64?: string;\n /** MIME type, e.g. \"image/jpeg\". */\n contentType?: string;\n /** Direct URL to the image, when the backend exposes one. */\n url?: string;\n /** Artifact id, when the image is stored as an artifact. */\n artifactId?: string;\n width?: number;\n height?: number;\n}\n\nexport interface SnapshotAction {\n /** \"navigate\" | \"click\" | \"type\" | ... */\n kind?: string;\n /** The element/URL/value the action targeted. */\n target?: string;\n /** Human-readable summary of the action. */\n summary?: string;\n}\n\nexport interface RunLimits {\n maxDurationMinutes?: number;\n}\n\nexport type BrowserbaseRegion =\n | \"us-west-2\"\n | \"us-east-1\"\n | \"eu-central-1\"\n | \"ap-southeast-1\";\n\nexport interface BrowserProxyOptions {\n /** Server-side proxy registry id. Credentials never enter the SDK call. */\n proxyId?: string;\n /** `off` uses datacenter egress; `all` proxies all requests; `scoped` uses admin patterns. */\n mode?: \"off\" | \"all\" | \"scoped\";\n /** Browserbase compute region. This is separate from the proxy's IP geography. */\n region?: BrowserbaseRegion;\n}\n\nexport interface DoAnythingRunOptions {\n /** Delegation token — passed once here; the returned handle holds it. */\n token: string;\n /** Natural-language task for the agent to carry out. */\n prompt: string;\n capture?: CaptureOptions;\n limits?: RunLimits;\n /**\n * Reuse an existing browser session (follow-up run); a new one is created\n * around the run by default. Maps to `session_id` on the wire create body.\n */\n session?: SessionRef;\n // Product-specific options stay camelCase.\n profileId?: string;\n /** Applies when this run creates a new Browserbase session. */\n browserProxy?: BrowserProxyOptions;\n keepAlive?: boolean;\n allowedActions?: string[];\n skills?: string[];\n [key: string]: unknown;\n}\n\nexport interface DoAnythingAttachOptions {\n token: string;\n /**\n * Optional — runs are addressed by `run_id` alone; resolution happens via\n * `GET /do_anything/runs/{run_id}`. Accepted for callers that already hold\n * a `sessionRef`; otherwise it is adopted from the run detail envelope.\n */\n session?: SessionRef;\n capture?: CaptureOptions;\n}\n\n// Options the wire create body has no field for — either platform-decided\n// server-side (model via `llm.default_model`, cost ceiling via the internal\n// budget guard, browser egress via dynconfig) or retired phantom knobs the\n// backend never consumed and now 422s (extra=\"forbid\"). Sending them would\n// be a silent drop or a wire error, so `run()` fails loudly up front\n// (contract §4).\nconst PLATFORM_DECIDED_RUN_OPTIONS = [\n \"model\",\n \"proxyCountryCode\",\n \"callbackUrl\",\n \"workspaceId\",\n \"outputSchema\",\n \"cacheScript\",\n] as const;\n\nconst BROWSERBASE_REGIONS = new Set<BrowserbaseRegion>([\n \"us-west-2\",\n \"us-east-1\",\n \"eu-central-1\",\n \"ap-southeast-1\",\n]);\n\nfunction validateBrowserProxyOptions(value: unknown): void {\n if (value === undefined) return;\n if (!isJsonObject(value)) {\n throw new QoniValidationError(\"browserProxy must be an object\");\n }\n const allowed = new Set([\"proxyId\", \"mode\", \"region\"]);\n const extras = Object.keys(value).filter((key) => !allowed.has(key));\n if (extras.length > 0) {\n throw new QoniValidationError(\n `browserProxy does not accept ${extras.join(\", \")} — credentials stay server-side`,\n );\n }\n if (\n value.proxyId !== undefined &&\n (typeof value.proxyId !== \"string\" ||\n !/^[a-z0-9][a-z0-9._-]{0,63}$/.test(value.proxyId))\n ) {\n throw new QoniValidationError(\"browserProxy.proxyId is invalid\");\n }\n if (\n value.mode !== undefined &&\n ![\"off\", \"all\", \"scoped\"].includes(String(value.mode))\n ) {\n throw new QoniValidationError(\"browserProxy.mode must be off, all, or scoped\");\n }\n if (\n value.region !== undefined &&\n (typeof value.region !== \"string\" ||\n !BROWSERBASE_REGIONS.has(value.region as BrowserbaseRegion))\n ) {\n throw new QoniValidationError(\"browserProxy.region is not supported\");\n }\n}\n\nexport function createDoAnythingNamespace(transport: QoniTransport) {\n /**\n * Wire-level escape hatch — 1:1 with the backend HTTP contract\n * (snake_case fields). Run-scoped methods use the single-ID route family\n * `/do_anything/runs/{run_id}` (qoni-sdk-public-surface.md §12.1); session\n * endpoints stay session-scoped. Shapes here may evolve with the API and\n * are not covered by the frozen public contract.\n */\n const api = {\n createSession: <T = unknown>(input: RuntimeTokenInput & JsonObject): Promise<QoniResponse<T>> =>\n transport.webAgentJson(\"POST\", \"/do_anything/sessions\", input.token, {\n body: omit(input, \"token\"),\n requiredScopes: [\"webagent.do_anything:manage\"],\n }),\n\n /**\n * `POST /do_anything/runs` — one call creates the run. Without\n * `session_id` a fresh session is created around the run; with it the\n * run is a follow-up in that session (409 while the prior run is\n * non-terminal).\n */\n createRun: <T = unknown>(input: RuntimeTokenInput & JsonObject): Promise<QoniResponse<T>> =>\n transport.webAgentJson(\"POST\", \"/do_anything/runs\", input.token, {\n body: normalizeDoAnythingRunInput(omit(input, \"token\")),\n requiredScopes: [\"webagent.do_anything:manage\"],\n }),\n\n getRun: <T = unknown>(\n input: RuntimeTokenInput & { runId: string; signal?: AbortSignal },\n ): Promise<QoniResponse<T>> =>\n transport.webAgentJson(\n \"GET\",\n `/do_anything/runs/${encodeURIComponent(input.runId)}`,\n input.token,\n {\n signal: input.signal,\n requiredScopes: [\"webagent.do_anything:read\"],\n },\n ),\n\n events: async function* <T = unknown>(\n input: RuntimeTokenInput & {\n runId: string;\n lastEventId?: string;\n signal?: AbortSignal;\n /**\n * Forwarded as the `include_screenshots` query flag — set false to\n * skip `run.screenshot` rows in the replay/backfill window.\n */\n includeScreenshots?: boolean;\n /**\n * Drop events for internal sub-runs (planning / grading) and yield only\n * the top-level run's events. Matches on `event.data.task_id`.\n * Default false.\n */\n onlyTopLevel?: boolean;\n onReconnect?: (info: { attempt: number; lastEventId?: string; error: unknown }) => void;\n },\n ): AsyncIterable<QoniEvent<T>> {\n const path = `/do_anything/runs/${encodeURIComponent(input.runId)}/events`;\n const stream = transport.webAgentSSE<T>(path, input.token, {\n lastEventId: input.lastEventId,\n requiredScopes: [\"webagent.do_anything:read\"],\n signal: input.signal,\n onReconnect: input.onReconnect,\n ...(input.includeScreenshots === undefined\n ? {}\n : { query: { include_screenshots: input.includeScreenshots } }),\n });\n for await (const event of stream) {\n if (input.onlyTopLevel) {\n const taskId = envelopeTaskId(event);\n if (taskId && taskId !== input.runId) continue; // skip sub-run events\n }\n yield event;\n }\n },\n\n intervene: <T = unknown>(\n input: RuntimeTokenInput & { runId: string } & JsonObject,\n ): Promise<QoniResponse<T>> =>\n transport.webAgentJson(\n \"POST\",\n `/do_anything/runs/${encodeURIComponent(input.runId)}/intervene`,\n input.token,\n {\n body: normalizeDoAnythingInterveneInput(omit(input, \"token\", \"runId\")),\n requiredScopes: [\"webagent.do_anything:manage\"],\n },\n ),\n\n cancel: <T = unknown>(\n input: RuntimeTokenInput & { runId: string; reason?: string },\n ): Promise<QoniResponse<T>> =>\n transport.webAgentJson(\n \"POST\",\n `/do_anything/runs/${encodeURIComponent(input.runId)}/cancel`,\n input.token,\n {\n body: omit(input, \"token\", \"runId\"),\n requiredScopes: [\"webagent.do_anything:manage\"],\n },\n ),\n\n readArtifacts: <T = DoAnythingSnapshot>(\n input: RuntimeTokenInput & { sessionId: string; artifactId: string },\n ): Promise<QoniResponse<T>> =>\n transport.webAgentJson(\n \"GET\",\n `/do_anything/sessions/${encodeURIComponent(input.sessionId)}/artifacts/${encodeURIComponent(input.artifactId)}`,\n input.token,\n {\n requiredScopes: [\"webagent.do_anything:read\"],\n },\n ),\n\n listArtifacts: <T = { items: JsonObject[] }>(\n input: RuntimeTokenInput & { runId: string; signal?: AbortSignal },\n ): Promise<QoniResponse<T>> => transport.webAgentJson(\n \"GET\", `/do_anything/runs/${encodeURIComponent(input.runId)}/artifacts`, input.token,\n { signal: input.signal, requiredScopes: [\"webagent.do_anything:read\"] },\n ),\n\n artifactDownloadUrl: (\n input: RuntimeTokenInput & { artifactId: string },\n ): Promise<QoniResponse<{ download_url: string; expires_in: number }>> => transport.webAgentJson(\n \"GET\", `/do_anything/artifacts/${encodeURIComponent(input.artifactId)}/download-url`, input.token,\n { requiredScopes: [\"webagent.do_anything:read\"] },\n ),\n\n readRecording: <T = unknown>(\n input: RuntimeTokenInput & { sessionId: string },\n ): Promise<QoniResponse<T>> =>\n transport.webAgentJson(\n \"GET\",\n `/do_anything/sessions/${encodeURIComponent(input.sessionId)}/recording`,\n input.token,\n {\n requiredScopes: [\"webagent.do_anything:read\"],\n },\n ),\n };\n\n /** Durable files for one run; also usable after reconnect without replaying SSE. */\n async function artifacts(input: RuntimeTokenInput & { runId: string; signal?: AbortSignal }): Promise<Artifact[]> {\n const { data } = await api.listArtifacts(input);\n if (!isJsonObject(data) || !Array.isArray(data.items)) {\n throw new QoniValidationError(\"artifact list response requires items\");\n }\n return data.items.map((item) => {\n if (!isJsonObject(item) || typeof item.id !== \"string\" || !item.id) {\n throw new QoniValidationError(\"artifact requires a nonempty id\");\n }\n const id = item.id;\n const artifact: Artifact = {\n id,\n name: typeof item.name === \"string\" ? item.name : undefined,\n mime: typeof item.mime_type === \"string\" ? item.mime_type : undefined,\n sizeBytes: typeof item.size_bytes === \"number\" ? item.size_bytes : undefined,\n createdAt: typeof item.created_at === \"string\" ? item.created_at : undefined,\n downloadUrl: typeof item.download_url === \"string\" ? item.download_url : undefined,\n expiresIn: typeof item.expires_in === \"number\" ? item.expires_in : undefined,\n content: async () => (await transport.webAgentBytes(\n `/do_anything/artifacts/${encodeURIComponent(id)}/blob`, input.token,\n { requiredScopes: [\"webagent.do_anything:read\"] },\n )).bytes,\n refreshDownloadUrl: async () => {\n const { data: link } = await api.artifactDownloadUrl({ token: input.token, artifactId: id });\n artifact.downloadUrl = link.download_url;\n artifact.expiresIn = link.expires_in;\n return link.download_url;\n },\n };\n return artifact;\n });\n }\n\n function buildOps(\n token: string | undefined,\n runId: string,\n capture: CaptureOptions | undefined,\n ): RunWireOps {\n return {\n listArtifacts: (signal) => artifacts({ token, runId, signal }),\n getDetail: async (signal) => asRecord((await api.getRun<unknown>({ token, runId, signal })).data),\n streamEvents: (opts) =>\n api.events({\n token,\n runId,\n lastEventId: opts.lastEventId,\n signal: opts.signal,\n onReconnect: opts.onReconnect,\n // Skip screenshot rows in backfill when the caller did not opt in.\n includeScreenshots: capture?.screenshots ? undefined : false,\n }),\n postAction: async (action, body, options) =>\n (\n await transport.webAgentJson(\n (action.method || \"POST\") as QoniHttpMethod,\n action.endpoint,\n token,\n {\n ...(body !== undefined ? { body } : {}),\n requiredScopes: options?.requiredScopes ?? interactionActionScopes(action, \"webagent.do_anything:manage\"),\n },\n )\n ).data,\n cancel: async (reason) =>\n asRecord(\n (\n await api.cancel<unknown>({\n token,\n runId,\n ...(reason === undefined ? {} : { reason }),\n })\n ).data,\n ),\n };\n }\n\n return {\n /** Start a run. Returns a handle — see `RunHandle` for the run lifecycle. */\n run: async (input: DoAnythingRunOptions): Promise<RunHandle<DoAnythingEvent>> => {\n const { token, prompt, capture, limits, session, ...rest } = input;\n if (!prompt || typeof prompt !== \"string\") {\n throw new QoniValidationError(\"doAnything.run requires a prompt string\");\n }\n validateBrowserProxyOptions(rest.browserProxy);\n\n // Fail loudly on options the wire create body cannot carry — a silent\n // drop would let callers believe a knob took effect when it never\n // reached the backend.\n const unsupported: string[] = PLATFORM_DECIDED_RUN_OPTIONS.filter(\n (key) => rest[key] !== undefined,\n );\n if (unsupported.length > 0) {\n throw new QoniValidationError(\n `doAnything.run does not support ${unsupported.join(\", \")} — the wire create body ` +\n \"has no such field (the platform decides these server-side), so the value would \" +\n \"be silently dropped. Remove it from the call.\",\n );\n }\n\n const created = await api.createRun<{ run_id?: string; id?: string; session_id?: string }>({\n token,\n instructions: prompt,\n ...rest,\n ...(session?.sessionId ? { sessionId: session.sessionId } : {}),\n ...(limits?.maxDurationMinutes !== undefined\n ? { maxDurationMinutes: limits.maxDurationMinutes }\n : {}),\n });\n const runId = created.data.run_id || created.data.id;\n if (!runId) {\n throw new QoniValidationError(\"doAnything run create did not return a run id\");\n }\n const sessionId =\n typeof created.data.session_id === \"string\" && created.data.session_id\n ? created.data.session_id\n : session?.sessionId;\n\n return new RunHandle<DoAnythingEvent>(buildOps(token, runId, capture), {\n id: runId,\n sessionRef: sessionId ? { sessionId } : undefined,\n capture,\n });\n },\n\n /**\n * Reconnect to an existing run by id. Verifies the run exists before\n * returning; `sessionRef` is adopted from the run detail envelope when\n * not supplied.\n */\n attach: async (\n runId: string,\n opts: DoAnythingAttachOptions,\n ): Promise<RunHandle<DoAnythingEvent>> => {\n const sessionId = opts.session?.sessionId;\n const handle = new RunHandle<DoAnythingEvent>(buildOps(opts.token, runId, opts.capture), {\n id: runId,\n sessionRef: sessionId ? { sessionId } : undefined,\n capture: opts.capture,\n });\n await handle.status();\n return handle;\n },\n\n artifacts,\n api,\n };\n}\n\n// camelCase conveniences → the snake_case fields of the wire create body\n// (CreateDoAnythingRunRequest). Keys already in wire shape pass through.\nfunction normalizeDoAnythingRunInput(input: JsonObject): JsonObject {\n const body = renameKeys(input, {\n sessionId: \"session_id\",\n profileId: \"profile_id\",\n keepAlive: \"keep_alive\",\n allowedActions: \"allowed_actions\",\n maxDurationMinutes: \"max_duration_minutes\",\n browserProxy: \"browser_proxy\",\n });\n const browserProxy = body.browser_proxy;\n if (isJsonObject(browserProxy)) {\n body.browser_proxy = renameKeys(browserProxy, { proxyId: \"proxy_id\" });\n }\n return body;\n}\n\nfunction normalizeDoAnythingInterveneInput(input: JsonObject): JsonObject {\n const body = renameKeys(input, { requestId: \"input_request_id\" });\n if (body.input_request_id !== undefined && body.kind === undefined) {\n body.kind = body.response === undefined ? \"skip_input_request\" : \"answer_input_request\";\n }\n return body;\n}\n\n// The run/task id on a WebAgent run event envelope (`event.data.task_id`) —\n// used to tell a top-level run's events from its internal sub-runs.\nfunction envelopeTaskId(event: QoniEvent): string | undefined {\n const env = event.data as { task_id?: unknown } | null | undefined;\n return env && typeof env === \"object\" && typeof env.task_id === \"string\"\n ? env.task_id\n : undefined;\n}\n\nfunction asRecord(value: unknown): JsonObject {\n return isJsonObject(value) ? value : {};\n}\n\nfunction omit(value: object, ...keys: string[]): JsonObject {\n const skipped = new Set(keys);\n const out: JsonObject = {};\n for (const [key, item] of Object.entries(value)) {\n if (!skipped.has(key) && item !== undefined) out[key] = item;\n }\n return out;\n}\n\nfunction renameKeys(value: JsonObject, mapping: Record<string, string>): JsonObject {\n const out: JsonObject = {};\n for (const [key, item] of Object.entries(value)) {\n const target = mapping[key] || key;\n if (out[target] === undefined) out[target] = item;\n }\n return out;\n}\n","import type {\n CompleteDelegateAgentInput,\n CompleteDelegateTokenInput,\n DelegateAgentInput,\n DelegateAgentResponse,\n DelegateTokenInteractiveInput,\n DelegateTokenInput,\n DelegateTokenResponse,\n DelegateTokenSilentResponse,\n DelegateTokenSilentInput,\n QoniResponse,\n QoniTransport,\n InteractiveDelegationResponse,\n} from \"./types\";\n\ntype DelegateToken = {\n (input: DelegateTokenInteractiveInput): Promise<QoniResponse<InteractiveDelegationResponse>>;\n (input: DelegateTokenSilentInput): Promise<QoniResponse<DelegateTokenSilentResponse>>;\n (input: DelegateTokenInput): Promise<QoniResponse<DelegateAgentResponse>>;\n};\ntype CompleteDelegateToken = (\n input: CompleteDelegateTokenInput,\n) => Promise<QoniResponse<DelegateTokenResponse>>;\n\nexport function createQoniNamespace(\n _transport: QoniTransport,\n delegateToken: DelegateToken,\n completeDelegateToken: CompleteDelegateToken,\n) {\n return {\n delegateToken,\n /** @deprecated Use delegateToken. */\n delegateAgent: (input: DelegateAgentInput) => delegateToken(input),\n completeDelegateToken,\n /** @deprecated Use completeDelegateToken. */\n completeDelegateAgent: (input: CompleteDelegateAgentInput) =>\n completeDelegateToken(input),\n };\n}\n","import type {\n QoniResponse, QoniTransport, JsonObject, DelegateTokenInput,\n DelegateTokenSilentInput, DelegateTokenInteractiveInput,\n DelegateTokenSilentResponse, InteractiveDelegationResponse, DelegateAgentResponse,\n} from \"./types\";\nimport { QoniValidationError } from \"./errors\";\n\nexport interface GenAuthAccessTokenInput {\n accessToken: string;\n}\n\nexport interface GenAuthDelegationIntrospectionInput {\n token?: string;\n /** @deprecated Use token. */\n delegateAgentToken?: string;\n}\n\nexport interface GenAuthAdminToken {\n accessToken: string;\n userPoolId: string;\n}\n\nexport type GenAuthAdminTokenProvider = () => Promise<GenAuthAdminToken>;\n\nexport interface GenAuthAdminTokenOverrideInput {\n adminToken?: string;\n userPoolId?: string;\n}\n\nexport type GenAuthUserListInput = GenAuthAdminTokenOverrideInput & {\n page?: number;\n limit?: number;\n options?: JsonObject & { pagination?: JsonObject };\n} & JsonObject;\nexport type GenAuthUserGetInput = GenAuthAdminTokenOverrideInput & { userId: string };\nexport type GenAuthUserGetBatchInput = GenAuthAdminTokenOverrideInput & { userIds: string[] };\nexport type GenAuthUserCreateInput = GenAuthAdminTokenOverrideInput & JsonObject;\nexport type GenAuthUserCreateBatchInput = GenAuthAdminTokenOverrideInput & {\n users?: JsonObject[];\n list?: JsonObject[];\n options?: JsonObject;\n};\nexport type GenAuthUserUpdateInput = GenAuthAdminTokenOverrideInput & { userId: string } & JsonObject;\nexport type GenAuthUserDeleteBatchInput = GenAuthAdminTokenOverrideInput & { userIds: string[] };\n\nexport function createGenAuthNamespace(\n transport: QoniTransport,\n options: {\n adminTokenFor?: GenAuthAdminTokenProvider;\n delegateTokenFor?: (input: DelegateTokenInput) => Promise<QoniResponse<DelegateAgentResponse>>;\n } = {},\n) {\n // The compatibility entry returns the grant itself; root delegateToken keeps\n // the existing QoniResponse envelope, including its transport metadata.\n function delegateAgent(input: DelegateTokenSilentInput): Promise<DelegateTokenSilentResponse>;\n function delegateAgent(input: DelegateTokenInteractiveInput): Promise<InteractiveDelegationResponse>;\n function delegateAgent(input: DelegateTokenInput): Promise<DelegateAgentResponse>;\n async function delegateAgent(input: DelegateTokenInput): Promise<DelegateAgentResponse> {\n if (!options.delegateTokenFor) {\n throw new QoniValidationError(\"GenAuth delegateAgent requires a Qoni delegation provider\");\n }\n return (await options.delegateTokenFor(input)).data;\n }\n return {\n delegateAgent,\n userInfo: <T = unknown>(input: GenAuthAccessTokenInput): Promise<QoniResponse<T>> =>\n transport.genauthJson(\"GET\", \"/oidc/me\", input.accessToken),\n\n jwks: <T = unknown>(): Promise<QoniResponse<T>> =>\n transport.genauthJson(\"GET\", \"/oidc/.well-known/jwks.json\"),\n\n discovery: <T = unknown>(): Promise<QoniResponse<T>> =>\n transport.genauthJson(\"GET\", \"/oidc/.well-known/openid-configuration\"),\n\n introspectDelegationToken: <T = unknown>(\n input: GenAuthDelegationIntrospectionInput,\n ): Promise<QoniResponse<T>> =>\n transport.genauthJson(\"POST\", \"/api/v3/eak/delegations/introspect\", undefined, {\n body: { token: requiredDelegationToken(input) },\n }),\n\n users: {\n list: async <T = unknown>(input: GenAuthUserListInput = {}): Promise<QoniResponse<T>> => {\n const auth = await adminAuthFor(options.adminTokenFor, input);\n return transport.genauthJson(\"POST\", \"/api/v3/list-users\", auth.accessToken, {\n body: listUsersBody(input),\n headers: userPoolHeaders(auth.userPoolId),\n });\n },\n\n get: async <T = unknown>(input: GenAuthUserGetInput): Promise<QoniResponse<T>> => {\n const auth = await adminAuthFor(options.adminTokenFor, input);\n return transport.genauthJson(\"GET\", \"/api/v3/get-user\", auth.accessToken, {\n query: omit(input, \"adminToken\", \"userPoolId\"),\n headers: userPoolHeaders(auth.userPoolId),\n });\n },\n\n getBatch: async <T = unknown>(\n input: GenAuthUserGetBatchInput,\n ): Promise<QoniResponse<T>> => {\n const auth = await adminAuthFor(options.adminTokenFor, input);\n return transport.genauthJson(\"GET\", \"/api/v3/get-user-batch\", auth.accessToken, {\n query: omit(input, \"adminToken\", \"userPoolId\"),\n headers: userPoolHeaders(auth.userPoolId),\n });\n },\n\n create: async <T = unknown>(input: GenAuthUserCreateInput): Promise<QoniResponse<T>> => {\n const auth = await adminAuthFor(options.adminTokenFor, input);\n return transport.genauthJson(\"POST\", \"/api/v3/create-user\", auth.accessToken, {\n body: omit(input, \"adminToken\", \"userPoolId\"),\n headers: userPoolHeaders(auth.userPoolId),\n });\n },\n\n createBatch: async <T = unknown>(\n input: GenAuthUserCreateBatchInput,\n ): Promise<QoniResponse<T>> => {\n const auth = await adminAuthFor(options.adminTokenFor, input);\n return transport.genauthJson(\"POST\", \"/api/v3/create-users-batch\", auth.accessToken, {\n body: createUsersBatchBody(input),\n headers: userPoolHeaders(auth.userPoolId),\n });\n },\n\n update: async <T = unknown>(input: GenAuthUserUpdateInput): Promise<QoniResponse<T>> => {\n const auth = await adminAuthFor(options.adminTokenFor, input);\n return transport.genauthJson(\"POST\", \"/api/v3/update-user\", auth.accessToken, {\n body: omit(input, \"adminToken\", \"userPoolId\"),\n headers: userPoolHeaders(auth.userPoolId),\n });\n },\n\n deleteBatch: async <T = unknown>(\n input: GenAuthUserDeleteBatchInput,\n ): Promise<QoniResponse<T>> => {\n const auth = await adminAuthFor(options.adminTokenFor, input);\n return transport.genauthJson(\"POST\", \"/api/v3/delete-users-batch\", auth.accessToken, {\n body: omit(input, \"adminToken\", \"userPoolId\"),\n headers: userPoolHeaders(auth.userPoolId),\n });\n },\n },\n };\n}\n\nfunction requiredDelegationToken(input: GenAuthDelegationIntrospectionInput): string {\n const token = input.token ?? input.delegateAgentToken;\n if (token?.trim()) return token;\n throw new Error(\"GenAuth delegation introspection requires token\");\n}\n\nasync function adminAuthFor(\n provider: GenAuthAdminTokenProvider | undefined,\n input: GenAuthAdminTokenOverrideInput,\n): Promise<GenAuthAdminToken> {\n if (input.adminToken?.trim()) {\n if (!input.userPoolId?.trim()) {\n throw new Error(\"GenAuth adminToken override requires userPoolId\");\n }\n return { accessToken: input.adminToken, userPoolId: input.userPoolId };\n }\n if (!provider) throw new Error(\"GenAuth user management requires Qoni AK/SK admin token exchange\");\n return provider();\n}\n\nfunction userPoolHeaders(userPoolId: string): Record<string, string> {\n return { \"x-authing-userpool-id\": userPoolId };\n}\n\nfunction omit(value: object, ...keys: string[]): JsonObject {\n const skipped = new Set(keys);\n const out: JsonObject = {};\n for (const [key, item] of Object.entries(value)) {\n if (!skipped.has(key) && item !== undefined) out[key] = item;\n }\n return out;\n}\n\nfunction listUsersBody(input: GenAuthUserListInput): JsonObject {\n const body = omit(input, \"adminToken\", \"userPoolId\", \"page\", \"limit\");\n if (input.page === undefined && input.limit === undefined) return body;\n const options = isJsonObject(body.options) ? { ...body.options } : {};\n const pagination = isJsonObject(options.pagination) ? { ...options.pagination } : {};\n if (input.page !== undefined) pagination.page = input.page;\n if (input.limit !== undefined) pagination.limit = input.limit;\n options.pagination = pagination;\n body.options = options;\n return body;\n}\n\nfunction createUsersBatchBody(input: GenAuthUserCreateBatchInput): JsonObject {\n const body = omit(input, \"adminToken\", \"userPoolId\", \"users\");\n if (input.users && !body.list) body.list = input.users;\n return body;\n}\n\nfunction isJsonObject(value: unknown): value is JsonObject {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n","import type { QoniResponse, QoniTransport, JsonObject, RuntimeTokenInput } from \"./types\";\n\nexport interface GumemCreateSessionInput extends RuntimeTokenInput {\n userId?: string;\n sessionId?: string;\n /** @deprecated Use userId. */\n user_id?: string;\n /** @deprecated Use sessionId. */\n session_id?: string;\n title?: string;\n metadata?: JsonObject;\n}\n\nexport interface GumemAddMessagesInput extends RuntimeTokenInput {\n sessionId: string;\n messages: JsonObject[];\n sync?: boolean;\n userId?: string;\n /** @deprecated Use userId. */\n user_id?: string;\n}\n\nexport interface GumemRecallInput extends RuntimeTokenInput {\n sessionId?: string;\n query?: string;\n details?: boolean;\n recallConfig?: JsonObject;\n metadataFilters?: JsonObject;\n /** @deprecated Use recallConfig. */\n recall_config?: JsonObject;\n /** @deprecated Use metadataFilters. */\n metadata_filters?: JsonObject;\n}\n\nexport interface GumemUploadResourceInput extends RuntimeTokenInput {\n userId?: string;\n sessionId?: string;\n /** @deprecated Use userId. */\n user_id?: string;\n /** @deprecated Use sessionId. */\n session_id?: string;\n file: Blob | File;\n filename?: string;\n contentType?: string;\n}\n\nexport function createGumemNamespace(transport: QoniTransport) {\n return {\n createSession: <T = unknown>(input: GumemCreateSessionInput): Promise<QoniResponse<T>> =>\n transport.gumemJson(\"POST\", \"/api/sessions\", input.token, {\n body: gumemBody(omit(input, \"token\")),\n requiredScopes: [\"gumem.memory:write\"],\n }),\n\n addMessages: <T = unknown>(input: GumemAddMessagesInput): Promise<QoniResponse<T>> =>\n transport.gumemJson(\n \"POST\",\n `/api/sessions/${encodeURIComponent(input.sessionId)}/messages`,\n input.token,\n {\n body: gumemBody(omit(input, \"token\", \"sessionId\")),\n requiredScopes: [\"gumem.memory:write\"],\n },\n ),\n\n recall: <T = unknown>(input: GumemRecallInput): Promise<QoniResponse<T>> =>\n transport.gumemJson(\n \"POST\",\n `/api/sessions/${encodeURIComponent(input.sessionId || \"default\")}/context`,\n input.token,\n {\n query: { query: input.query || \"\", details: input.details ?? false },\n body: gumemBody(omit(input, \"token\", \"sessionId\", \"query\", \"details\")),\n requiredScopes: [\"gumem.memory:read\"],\n },\n ),\n\n uploadResource: <T = unknown>(input: GumemUploadResourceInput): Promise<QoniResponse<T>> => {\n const form = new FormData();\n form.set(\"file\", input.file, input.filename);\n const userId = input.userId ?? input.user_id;\n const sessionId = input.sessionId ?? input.session_id;\n if (userId) form.set(\"user_id\", userId);\n if (sessionId) form.set(\"session_id\", sessionId);\n if (input.contentType) form.set(\"content_type\", input.contentType);\n return transport.gumemJson(\"POST\", \"/api/resources\", input.token, {\n body: form,\n requiredScopes: [\"gumem.memory:write\"],\n });\n },\n\n actions: {\n record: <T = unknown>(input: RuntimeTokenInput & JsonObject): Promise<QoniResponse<T>> =>\n transport.gumemJson(\"POST\", \"/api/user/actions\", input.token, {\n body: omit(input, \"token\"),\n requiredScopes: [\"gumem.action:write\"],\n }),\n\n recall: <T = unknown>(input: RuntimeTokenInput & JsonObject): Promise<QoniResponse<T>> =>\n transport.gumemJson(\"GET\", \"/api/user/actions/query\", input.token, {\n query: omit(input, \"token\"),\n requiredScopes: [\"gumem.action:read\"],\n }),\n\n stream: <T = unknown>(input: RuntimeTokenInput & JsonObject): Promise<QoniResponse<T>> =>\n transport.gumemJson(\"GET\", \"/api/user/actions/stream\", input.token, {\n query: omit(input, \"token\"),\n requiredScopes: [\"gumem.action:read\"],\n }),\n },\n };\n}\n\nfunction omit(value: object, ...keys: string[]): JsonObject {\n const skipped = new Set(keys);\n const out: JsonObject = {};\n for (const [key, item] of Object.entries(value)) {\n if (!skipped.has(key) && item !== undefined) out[key] = item;\n }\n return out;\n}\n\nfunction gumemBody(value: JsonObject): JsonObject {\n return renameKeys(value, {\n userId: \"user_id\",\n sessionId: \"session_id\",\n recallConfig: \"recall_config\",\n metadataFilters: \"metadata_filters\",\n });\n}\n\nfunction renameKeys(value: JsonObject, mapping: Record<string, string>): JsonObject {\n const out: JsonObject = {};\n for (const [key, item] of Object.entries(value)) {\n const target = mapping[key] || key;\n if (out[target] === undefined) out[target] = item;\n }\n return out;\n}\n","import { QoniValidationError } from \"./errors\";\nimport { InteractionHandle, interactionActionScopes, type Interaction } from \"./interactions\";\nimport { camelizeKeys, normalizeRunEvent, type MonitorEvent } from \"./run-events\";\nimport {\n isJsonObject,\n type QoniEvent,\n type QoniHttpMethod,\n type QoniResponse,\n type QoniTransport,\n type JsonObject,\n type RuntimeTokenInput,\n} from \"./types\";\nimport type { Action } from \"./interactions\";\n\nexport interface TrackCreateOptions {\n /** Delegation token — passed once here; the returned handle holds it. */\n token: string;\n /** Natural-language description of what to monitor. */\n prompt: string;\n /** Rest of the monitor definition (url, schedule, …) — camelCase keys. */\n [key: string]: unknown;\n}\n\nexport interface TrackAttachOptions {\n token: string;\n}\n\nexport interface MonitorEventsOptions {\n lastEventId?: string;\n signal?: AbortSignal;\n}\n\nexport interface MonitorRunsOptions {\n limit?: number;\n offset?: number;\n}\n\n/** A monitor's check cadence. */\nexport type MonitorSchedule =\n | { kind: \"cron\"; expr: string; /** IANA time zone for the cron expression. */ tz?: string }\n | { kind: \"interval\"; intervalSeconds: number; tz?: string };\n\n/**\n * Fields to change on a monitor via {@link MonitorHandle.refine}. Pass any\n * subset; at least one is required. The monitor's natural-language `intent`\n * is NOT refinable — it drives URL/schema/DSL generation, so changing it means\n * creating a new monitor.\n */\nexport interface MonitorRefinePatch {\n schedule?: MonitorSchedule;\n targetUrls?: string[];\n extractionSchema?: JsonObject;\n triggerDsl?: JsonObject;\n stopConditionDsl?: JsonObject;\n notifyChannel?: JsonObject | null;\n [key: string]: unknown;\n}\n\ninterface MonitorWireOps {\n get(): Promise<JsonObject>;\n update(input: JsonObject): Promise<JsonObject>;\n runNow(): Promise<JsonObject>;\n streamEvents(opts: MonitorEventsOptions): AsyncIterable<QoniEvent<unknown>>;\n postAction(\n action: Action,\n body: JsonObject | undefined,\n options?: { requiredScopes?: readonly string[] },\n ): Promise<unknown>;\n listRuns(opts: MonitorRunsOptions): Promise<JsonObject>;\n getRun(runId: string): Promise<JsonObject>;\n delete(): Promise<void>;\n}\n\n/**\n * Handle to a Track monitor — a resident resource (unlike a one-shot run).\n * Holds the delegation token and monitor id internally; no method takes a\n * token or an id.\n */\nexport class MonitorHandle {\n readonly id: string;\n\n constructor(private readonly ops: MonitorWireOps, id: string) {\n this.id = id;\n }\n\n /** Refresh and return the monitor (normalized camelCase fields). */\n async get(): Promise<JsonObject> {\n return normalizeMonitorRecord(await this.ops.get());\n }\n\n /**\n * Pause the monitor — stops scheduled ticks until {@link resume}. The\n * monitor stays addressable; this is the way to \"stop monitoring\" without\n * deleting.\n */\n async pause(): Promise<JsonObject> {\n return normalizeMonitorRecord(await this.ops.update({ action: \"pause\" }));\n }\n\n /** Resume a paused monitor. */\n async resume(): Promise<JsonObject> {\n return normalizeMonitorRecord(await this.ops.update({ action: \"resume\" }));\n }\n\n /**\n * Change the monitor definition. Pass any subset of fields (at least one);\n * `schedule` is `{ kind: \"cron\", expr }` or `{ kind: \"interval\", intervalSeconds }`.\n * The backend re-validates the trigger DSL against the schema, so a bad\n * change is rejected, not applied. The natural-language intent is not\n * refinable — create a new monitor to change it.\n */\n async refine(patch: MonitorRefinePatch): Promise<JsonObject> {\n const { schedule, ...rest } = patch;\n const body: JsonObject = snakeifyKeys(rest as JsonObject);\n if (schedule) body.schedule = normalizeSchedule(schedule);\n if (Object.keys(body).length === 0) {\n throw new QoniValidationError(\n \"track refine requires at least one field to change (schedule / targetUrls / \" +\n \"extractionSchema / triggerDsl / stopConditionDsl / notifyChannel)\",\n );\n }\n return normalizeMonitorRecord(await this.ops.update({ action: \"refine\", patch: body }));\n }\n\n /** Trigger an immediate tick outside the schedule. */\n async runNow(): Promise<JsonObject> {\n return normalizeMonitorRecord(await this.ops.runNow());\n }\n\n /**\n * Stream semantic monitor events. Monitors are resident, so the stream has\n * no terminal event — it ends only when closed by the caller or the server.\n */\n async *events(opts: MonitorEventsOptions = {}): AsyncIterable<MonitorEvent> {\n for await (const wire of this.ops.streamEvents(opts)) {\n const event = normalizeRunEvent(wire);\n // The monitor stream only carries core + Track events; the cast narrows\n // the full RunEvent union to that subset.\n if (event) yield event as MonitorEvent;\n }\n }\n\n /**\n * Wrap an {@link Interaction} (from `event.data` of an `interaction` event on\n * the monitor stream — e.g. a `site_login` to unlock a `needs_reauth` park)\n * in a typed {@link InteractionHandle}. The handle's action methods post to\n * the endpoint the backend declared for that action.\n */\n interactionHandle(interaction: Interaction): InteractionHandle {\n return new InteractionHandle(interaction, (action, body, options) =>\n this.ops.postAction(action, body, options),\n );\n }\n\n /**\n * Read-only list of the runs the monitor's ticks produced. Tick runs are\n * owned by the scheduler — to stop monitoring use `pause()` / `delete()`.\n */\n async runs(opts: MonitorRunsOptions = {}): Promise<JsonObject[]> {\n const data = await this.ops.listRuns(opts);\n const items = Array.isArray(data.items) ? data.items : Array.isArray(data.runs) ? data.runs : [];\n return items.filter(isJsonObject).map(normalizeMonitorRun);\n }\n\n /** Read-only detail of a single tick run. */\n async run(runId: string): Promise<JsonObject> {\n return normalizeMonitorRun(await this.ops.getRun(runId));\n }\n\n /** Delete the monitor. */\n async delete(): Promise<void> {\n await this.ops.delete();\n }\n}\n\nexport function createTrackNamespace(transport: QoniTransport) {\n /**\n * Wire-level escape hatch — 1:1 with the backend HTTP contract. Shapes\n * here may evolve with the API and are not covered by the frozen public\n * contract.\n */\n const api = {\n createMonitor: <T = unknown>(input: RuntimeTokenInput & JsonObject): Promise<QoniResponse<T>> =>\n transport.webAgentJson(\"POST\", \"/track/monitors\", input.token, {\n body: omit(input, \"token\"),\n requiredScopes: [\"webagent.track:manage\"],\n }),\n\n getMonitor: <T = unknown>(\n input: RuntimeTokenInput & { monitorId: string },\n ): Promise<QoniResponse<T>> =>\n transport.webAgentJson(\n \"GET\",\n `/track/monitors/${encodeURIComponent(input.monitorId)}`,\n input.token,\n {\n requiredScopes: [\"webagent.track:read\"],\n },\n ),\n\n runNow: <T = unknown>(\n input: RuntimeTokenInput & { monitorId: string },\n ): Promise<QoniResponse<T>> =>\n transport.webAgentJson(\n \"POST\",\n `/track/monitors/${encodeURIComponent(input.monitorId)}/run_now`,\n input.token,\n {\n body: {},\n requiredScopes: [\"webagent.track:manage\"],\n },\n ),\n\n events: <T = unknown>(\n input: RuntimeTokenInput & { monitorId: string; lastEventId?: string; signal?: AbortSignal },\n ): AsyncIterable<QoniEvent<T>> =>\n transport.webAgentSSE(\n `/track/monitors/${encodeURIComponent(input.monitorId)}/events`,\n input.token,\n {\n lastEventId: input.lastEventId,\n requiredScopes: [\"webagent.track:read\"],\n signal: input.signal,\n },\n ),\n\n intervene: <T = unknown>(\n input: RuntimeTokenInput & { monitorId: string } & JsonObject,\n ): Promise<QoniResponse<T>> =>\n transport.webAgentJson(\n \"POST\",\n `/track/monitors/${encodeURIComponent(input.monitorId)}/intervene`,\n input.token,\n {\n body: normalizeTrackInterveneInput(omit(input, \"token\", \"monitorId\")),\n requiredScopes: [\"webagent.track:manage\"],\n },\n ),\n\n listRuns: <T = unknown>(\n input: RuntimeTokenInput & { monitorId: string; limit?: number; offset?: number },\n ): Promise<QoniResponse<T>> =>\n transport.webAgentJson(\n \"GET\",\n `/track/monitors/${encodeURIComponent(input.monitorId)}/runs`,\n input.token,\n {\n query: omit(input, \"token\", \"monitorId\"),\n requiredScopes: [\"webagent.track:read\"],\n },\n ),\n\n getRun: <T = unknown>(\n input: RuntimeTokenInput & { monitorId: string; runId: string },\n ): Promise<QoniResponse<T>> =>\n transport.webAgentJson(\n \"GET\",\n `/track/monitors/${encodeURIComponent(input.monitorId)}/runs/${encodeURIComponent(input.runId)}`,\n input.token,\n {\n requiredScopes: [\"webagent.track:read\"],\n },\n ),\n\n updateMonitor: <T = unknown>(\n input: RuntimeTokenInput & { monitorId: string } & JsonObject,\n ): Promise<QoniResponse<T>> =>\n transport.webAgentJson(\n \"PATCH\",\n `/track/monitors/${encodeURIComponent(input.monitorId)}`,\n input.token,\n {\n body: omit(input, \"token\", \"monitorId\"),\n requiredScopes: [\"webagent.track:manage\"],\n },\n ),\n\n deleteMonitor: <T = unknown>(\n input: RuntimeTokenInput & { monitorId: string },\n ): Promise<QoniResponse<T>> =>\n transport.webAgentJson(\n \"DELETE\",\n `/track/monitors/${encodeURIComponent(input.monitorId)}`,\n input.token,\n {\n // Backend DELETE /track/monitors/{id} requires track:manage\n // (see api/v1/track/monitors.py:delete_monitor).\n requiredScopes: [\"webagent.track:manage\"],\n },\n ),\n };\n\n function buildOps(token: string | undefined, monitorId: string): MonitorWireOps {\n return {\n get: async () => asRecord((await api.getMonitor<unknown>({ token, monitorId })).data),\n update: async (input) =>\n asRecord((await api.updateMonitor<unknown>({ token, monitorId, ...input })).data),\n runNow: async () => asRecord((await api.runNow<unknown>({ token, monitorId })).data),\n streamEvents: (opts) =>\n api.events({ token, monitorId, lastEventId: opts.lastEventId, signal: opts.signal }),\n postAction: async (action, body, options) =>\n (\n await transport.webAgentJson(\n (action.method || \"POST\") as QoniHttpMethod,\n action.endpoint,\n token,\n {\n ...(body !== undefined ? { body } : {}),\n requiredScopes: options?.requiredScopes ?? interactionActionScopes(action, \"webagent.track:manage\"),\n },\n )\n ).data,\n listRuns: async (opts) =>\n asRecord((await api.listRuns<unknown>({ token, monitorId, ...opts })).data),\n getRun: async (runId) =>\n asRecord((await api.getRun<unknown>({ token, monitorId, runId })).data),\n delete: async () => {\n await api.deleteMonitor({ token, monitorId });\n },\n };\n }\n\n return {\n /** Create a monitor. Returns a handle — see `MonitorHandle`. */\n create: async (input: TrackCreateOptions): Promise<MonitorHandle> => {\n const { token, prompt, ...rest } = input;\n if (!prompt || typeof prompt !== \"string\") {\n throw new QoniValidationError(\"track.create requires a prompt string\");\n }\n const body = snakeifyKeys(rest);\n // Same wire shape as refine(): `{ kind: \"interval\", intervalSeconds }`\n // must reach the backend as `interval_seconds`, or it falls back to its\n // default interval.\n if (body.schedule !== undefined) body.schedule = normalizeSchedule(body.schedule);\n const created = await api.createMonitor<{ id?: string; monitor_id?: string }>({\n token,\n intent: prompt,\n ...body,\n });\n const monitorId = created.data.id || created.data.monitor_id;\n if (!monitorId) {\n throw new QoniValidationError(\"track monitor create did not return a monitor id\");\n }\n return new MonitorHandle(buildOps(token, monitorId), monitorId);\n },\n\n /** Reconnect to an existing monitor. Verifies it exists before returning. */\n attach: async (monitorId: string, opts: TrackAttachOptions): Promise<MonitorHandle> => {\n const handle = new MonitorHandle(buildOps(opts.token, monitorId), monitorId);\n await handle.get();\n return handle;\n },\n\n api,\n };\n}\n\n// Tick runs are read-only views — normalize to camelCase and guarantee a\n// uniform `id` regardless of which wire field carried it.\nfunction normalizeMonitorRun(item: JsonObject): JsonObject {\n const normalized = normalizeMonitorRecord(item);\n if (typeof normalized.id !== \"string\" || !normalized.id) {\n const id = normalized.runId ?? normalized.snapshotId;\n if (typeof id === \"string\" && id) normalized.id = id;\n }\n return normalized;\n}\n\nfunction normalizeTrackInterveneInput(input: JsonObject): JsonObject {\n return renameKeys(input, { requestId: \"request_id\" });\n}\n\n// Wire fields whose keys are user-defined (the extraction schema's field names\n// and the values extracted for them). camelCase normalization stops at these\n// keys: `{ source_url: \"string\" }` must read back as `source_url`.\nconst USER_KEYED_FIELDS = new Set([\"extraction_schema\", \"baseline_extracted\", \"extracted\"]);\n// Inside each `diffs[]` entry, these carry extracted values keyed by the user's\n// field names (field_diff before/after) or list items keyed the same way\n// (list_diff added/removed/sample_unchanged). fingerprint_diff carries hashes only.\nconst USER_KEYED_DIFF_FIELDS = new Set([\"before\", \"after\", \"added\", \"removed\", \"sample_unchanged\"]);\n\n/** camelCase a monitor / tick record, leaving user-keyed field contents verbatim. */\nfunction normalizeMonitorRecord(value: JsonObject): JsonObject {\n const out: JsonObject = {};\n for (const [key, item] of Object.entries(value)) {\n if (USER_KEYED_FIELDS.has(key)) out[camelKey(key)] = item;\n else if (key === \"diffs\" && Array.isArray(item)) out.diffs = item.map(normalizeDiff);\n else out[camelKey(key)] = camelizeKeys(item);\n }\n return out;\n}\n\nfunction normalizeDiff(entry: unknown): unknown {\n if (!isJsonObject(entry)) return camelizeKeys(entry);\n const out: JsonObject = {};\n for (const [key, item] of Object.entries(entry)) {\n out[camelKey(key)] = USER_KEYED_DIFF_FIELDS.has(key) ? item : camelizeKeys(item);\n }\n return out;\n}\n\nfunction camelKey(key: string): string {\n return key.replace(/_([a-z0-9])/g, (_, ch: string) => ch.toUpperCase());\n}\n\n/**\n * Normalize a {@link MonitorSchedule} to the backend's wire shape\n * (`{ kind, expr | interval_seconds, tz }`). Only `intervalSeconds` is renamed;\n * every other field (such as `tz`) passes through unchanged. Accepts an already\n * snake_case `interval_seconds`; kinds other than interval/cron pass through for\n * the backend to validate.\n */\nfunction normalizeSchedule(schedule: unknown): unknown {\n if (!isJsonObject(schedule)) return schedule;\n if (schedule.kind === \"interval\") {\n const { intervalSeconds, interval_seconds, ...rest } = schedule;\n const seconds = intervalSeconds ?? interval_seconds;\n if (typeof seconds !== \"number\" || !Number.isFinite(seconds) || seconds <= 0) {\n throw new QoniValidationError(\n 'track interval schedule needs a positive number: { kind: \"interval\", intervalSeconds }',\n );\n }\n return { ...rest, interval_seconds: seconds };\n }\n if (schedule.kind === \"cron\" && (typeof schedule.expr !== \"string\" || !schedule.expr.trim())) {\n throw new QoniValidationError('track cron schedule needs an expression: { kind: \"cron\", expr }');\n }\n return schedule;\n}\n\n/** Shallow camelCase → snake_case for wire bodies; nested values untouched. */\nfunction snakeifyKeys(value: JsonObject): JsonObject {\n const out: JsonObject = {};\n for (const [key, item] of Object.entries(value)) {\n if (item === undefined) continue;\n out[key.replace(/([A-Z])/g, (_, ch: string) => `_${ch.toLowerCase()}`)] = item;\n }\n return out;\n}\n\nfunction asRecord(value: unknown): JsonObject {\n return isJsonObject(value) ? value : {};\n}\n\nfunction omit(value: object, ...keys: string[]): JsonObject {\n const skipped = new Set(keys);\n const out: JsonObject = {};\n for (const [key, item] of Object.entries(value)) {\n if (!skipped.has(key) && item !== undefined) out[key] = item;\n }\n return out;\n}\n\nfunction renameKeys(value: JsonObject, mapping: Record<string, string>): JsonObject {\n const out: JsonObject = {};\n for (const [key, item] of Object.entries(value)) {\n const target = mapping[key] || key;\n if (out[target] === undefined) out[target] = item;\n }\n return out;\n}\n","import { QoniError, QoniValidationError } from \"./errors\";\nimport {\n RunHandle,\n type CaptureOptions,\n type RunWireOps,\n type SessionRef,\n} from \"./run-handle\";\nimport type { WebSearchEvent } from \"./run-events\";\nimport type { RunLimits } from \"./do-anything\";\nimport {\n isJsonObject,\n type QoniEvent,\n type QoniResponse,\n type QoniTransport,\n type JsonObject,\n type RuntimeTokenInput,\n} from \"./types\";\n\nexport interface WebSearchRunOptions {\n /** Delegation token — passed once here; the returned handle holds it. */\n token: string;\n /** What to search for — one query, or several for a multi-query search. */\n prompt: string | string[];\n capture?: CaptureOptions;\n /** Not supported by webSearch yet — passing it throws locally. */\n limits?: RunLimits;\n /** Not supported by webSearch — searches don't run in reusable sessions. */\n session?: SessionRef;\n // Product-specific options stay camelCase.\n maxResultsPerQuery?: number;\n siteWhitelist?: string[];\n siteBlacklist?: string[];\n [key: string]: unknown;\n}\n\nexport interface WebSearchAttachOptions {\n token: string;\n capture?: CaptureOptions;\n}\n\nexport function createWebSearchNamespace(transport: QoniTransport) {\n /**\n * Wire-level escape hatch — 1:1 with the backend HTTP contract. Shapes\n * here may evolve with the API and are not covered by the frozen public\n * contract.\n */\n const api = {\n run: <T = unknown>(input: RuntimeTokenInput & JsonObject): Promise<QoniResponse<T>> =>\n transport.webAgentJson(\"POST\", \"/web_search/runs\", input.token, {\n body: normalizeWebSearchRunInput(omit(input, \"token\")),\n requiredScopes: [\"webagent.web_search:manage\"],\n }),\n\n get: <T = unknown>(input: RuntimeTokenInput & { runId: string; signal?: AbortSignal }): Promise<QoniResponse<T>> =>\n transport.webAgentJson(\n \"GET\",\n `/web_search/runs/${encodeURIComponent(input.runId)}`,\n input.token,\n {\n signal: input.signal,\n requiredScopes: [\"webagent.web_search:read\"],\n },\n ),\n\n events: <T = unknown>(\n input: RuntimeTokenInput & {\n runId: string;\n lastEventId?: string;\n signal?: AbortSignal;\n onReconnect?: (info: { attempt: number; lastEventId?: string; error: unknown }) => void;\n },\n ): AsyncIterable<QoniEvent<T>> =>\n transport.webAgentSSE(\n `/web_search/runs/${encodeURIComponent(input.runId)}/events`,\n input.token,\n {\n lastEventId: input.lastEventId,\n requiredScopes: [\"webagent.web_search:read\"],\n signal: input.signal,\n onReconnect: input.onReconnect,\n },\n ),\n\n cancel: <T = unknown>(\n input: RuntimeTokenInput & { runId: string; reason?: string },\n ): Promise<QoniResponse<T>> =>\n transport.webAgentJson(\n \"POST\",\n `/web_search/runs/${encodeURIComponent(input.runId)}/cancel`,\n input.token,\n {\n body: omit(input, \"token\", \"runId\"),\n requiredScopes: [\"webagent.web_search:manage\"],\n },\n ),\n };\n\n function buildOps(\n token: string | undefined,\n runId: string,\n ): RunWireOps {\n return {\n getDetail: async (signal) => asRecord((await api.get<unknown>({ token, runId, signal })).data),\n streamEvents: (opts) =>\n api.events({\n token,\n runId,\n lastEventId: opts.lastEventId,\n signal: opts.signal,\n onReconnect: opts.onReconnect,\n }),\n postAction: async () => {\n // webSearch runs never emit interactions; failing loudly beats a\n // confusing 404.\n throw new QoniError(\n \"webSearch runs never request interaction — there is no action to invoke\",\n { code: \"validation.failed\" },\n );\n },\n cancel: async (reason) =>\n asRecord(\n (\n await api.cancel<unknown>({\n token,\n runId,\n ...(reason === undefined ? {} : { reason }),\n })\n ).data,\n ),\n };\n }\n\n return {\n /** Start a search run. Returns a handle — see `RunHandle` for the run lifecycle. */\n run: async (input: WebSearchRunOptions): Promise<RunHandle<WebSearchEvent>> => {\n const { token, prompt, capture, limits, session, ...rest } = input;\n if (session) {\n throw new QoniValidationError(\n \"webSearch runs do not execute in reusable sessions — drop the session option\",\n );\n }\n if (limits) {\n throw new QoniValidationError(\n \"webSearch does not support limits yet — drop the limits option\",\n );\n }\n const resolvedQueries = Array.isArray(prompt) ? prompt : prompt ? [prompt] : undefined;\n if (!resolvedQueries || resolvedQueries.length === 0) {\n throw new QoniValidationError(\"webSearch.run requires a prompt\");\n }\n\n const run = await api.run<{ run_id?: string; id?: string }>({\n token,\n queries: resolvedQueries,\n ...rest,\n });\n const runId = run.data.run_id || run.data.id;\n if (!runId) {\n throw new QoniValidationError(\"webSearch run create did not return a run id\");\n }\n return new RunHandle<WebSearchEvent>(buildOps(token, runId), { id: runId, capture });\n },\n\n /** Reconnect to an existing run. Verifies the run exists before returning. */\n attach: async (\n runId: string,\n opts: WebSearchAttachOptions,\n ): Promise<RunHandle<WebSearchEvent>> => {\n const handle = new RunHandle<WebSearchEvent>(buildOps(opts.token, runId), {\n id: runId,\n capture: opts.capture,\n });\n await handle.status();\n return handle;\n },\n\n api,\n };\n}\n\nfunction normalizeWebSearchRunInput(input: JsonObject): JsonObject {\n const body = renameKeys(input, {\n maxResultsPerQuery: \"max_results_per_query\",\n siteWhitelist: \"site_whitelist\",\n siteBlacklist: \"site_blacklist\",\n });\n return body;\n}\n\nfunction asRecord(value: unknown): JsonObject {\n return isJsonObject(value) ? value : {};\n}\n\nfunction omit(value: object, ...keys: string[]): JsonObject {\n const skipped = new Set(keys);\n const out: JsonObject = {};\n for (const [key, item] of Object.entries(value)) {\n if (!skipped.has(key) && item !== undefined) out[key] = item;\n }\n return out;\n}\n\nfunction renameKeys(value: JsonObject, mapping: Record<string, string>): JsonObject {\n const out: JsonObject = {};\n for (const [key, item] of Object.entries(value)) {\n const target = mapping[key] || key;\n if (out[target] === undefined) out[target] = item;\n }\n return out;\n}\n","import { buildSignedHeaders } from \"./auth\";\nimport { createDeepResearchNamespace } from \"./deep-research\";\nimport { createDoAnythingNamespace } from \"./do-anything\";\nimport { createQoniNamespace } from \"./qoni\";\nimport {\n QoniError,\n QoniDelegationRequiredError,\n QoniValidationError,\n errorFromPayload,\n networkError,\n timeoutError,\n} from \"./errors\";\nimport { QoniProductScopes, KNOWN_SCOPES, type QoniProduct } from \"./scopes\";\nimport { createGenAuthNamespace } from \"./genauth\";\nimport { createGumemNamespace } from \"./gumem\";\nimport { createTrackNamespace } from \"./track\";\nimport {\n isJsonObject,\n type CompleteDelegateAgentInput,\n type CompleteDelegateTokenInput,\n type DelegateAgentInput,\n type DelegateAgentResponse,\n type DelegateTokenInteractiveInput,\n type DelegateTokenInput,\n type QoniEvent,\n type QoniHttpMethod,\n type QoniOptions,\n type QoniResponse,\n type QoniRuntimeConfig,\n type QoniService,\n type QoniTransport,\n type DelegateTokenResponse,\n type DelegateTokenSilentResponse,\n type DelegateTokenSilentInput,\n type InteractiveDelegationResponse,\n type JsonObject,\n type RawRequestInput,\n type RequestPayload,\n} from \"./types\";\nimport type { GenAuthAccessTokenInput } from \"./genauth\";\nimport { createWebSearchNamespace } from \"./web-search\";\n\nconst DEFAULT_QONI_HOST = \"https://dashboard.qoni.ai\";\n\nexport class Qoni {\n private readonly fetchImpl: typeof fetch;\n private readonly timeoutMs: number;\n private readonly sseMaxRetries: number;\n private readonly accessKey: string;\n private readonly secretKey: string;\n private readonly host: string;\n private runtimeConfigPromise?: Promise<ResolvedRuntimeConfig>;\n private genAuthAdminTokenCache?: { accessToken: string; userPoolId: string; expiresAt: number };\n\n readonly gumem: ReturnType<typeof createGumemNamespace>;\n readonly genauth: ReturnType<typeof createGenAuthNamespace>;\n readonly qoni: ReturnType<typeof createQoniNamespace>;\n readonly webSearch: ReturnType<typeof createWebSearchNamespace>;\n readonly doAnything: ReturnType<typeof createDoAnythingNamespace>;\n readonly track: ReturnType<typeof createTrackNamespace>;\n readonly deepResearch: ReturnType<typeof createDeepResearchNamespace>;\n\n constructor(private readonly options: QoniOptions) {\n const accessKey = options.accessKey ?? options.accessKeyId;\n const secretKey = options.secretKey ?? options.accessKeySecret;\n const host = options.host ?? options.qoniBaseUrl ?? options.genauthBaseUrl ?? DEFAULT_QONI_HOST;\n if (!accessKey || !secretKey) {\n throw new Error(\"Qoni requires accessKey and secretKey\");\n }\n this.accessKey = accessKey ?? \"\";\n this.secretKey = secretKey ?? \"\";\n this.host = normalizeBaseUrl(host);\n this.fetchImpl = options.fetch ?? fetch;\n this.timeoutMs = options.timeoutMs ?? 30_000;\n this.sseMaxRetries = options.sseMaxRetries ?? 5;\n const transport: QoniTransport = {\n qoniJson: (...args) => this.qoniJson(...args),\n genauthJson: (...args) => this.genauthJson(...args),\n gumemJson: (...args) => this.gumemJson(...args),\n gumemSSE: (...args) => this.gumemSSE(...args),\n webAgentJson: (...args) => this.webAgentJson(...args),\n webAgentBytes: (...args) => this.webAgentBytes(...args),\n webAgentSSE: (...args) => this.webAgentSSE(...args),\n };\n this.genauth = createGenAuthNamespace(transport, {\n adminTokenFor: () => this.genauthAdminTokenFor(),\n delegateTokenFor: (input) => this.delegateToken(input),\n });\n this.qoni = createQoniNamespace(\n transport,\n this.delegateToken.bind(this),\n (input) => this.completeDelegateToken(input),\n );\n this.gumem = createGumemNamespace(transport);\n this.webSearch = createWebSearchNamespace(transport);\n this.doAnything = createDoAnythingNamespace(transport);\n this.track = createTrackNamespace(transport);\n this.deepResearch = createDeepResearchNamespace(transport);\n }\n\n delegateToken(\n input: DelegateTokenInteractiveInput,\n ): Promise<QoniResponse<InteractiveDelegationResponse>>;\n delegateToken(input: DelegateTokenSilentInput): Promise<QoniResponse<DelegateTokenSilentResponse>>;\n delegateToken(input: DelegateTokenInput): Promise<QoniResponse<DelegateAgentResponse>>;\n delegateToken(input: DelegateTokenInput): Promise<QoniResponse<DelegateAgentResponse>> {\n // Scope pre-validation + products expansion happen BEFORE any request, so\n // format mistakes fail locally with the correct form in the message.\n let body: JsonObject;\n try {\n body = normalizeDelegateTokenInput(input);\n } catch (err) {\n return Promise.reject(err);\n }\n return this.signedPost<DelegateAgentResponse>(\n \"/api/v3/eak/delegations\",\n body,\n ).then(normalizeDelegateAgentTokenResponse);\n }\n\n /** @deprecated Use delegateToken. */\n delegateAgent(input: DelegateAgentInput): Promise<QoniResponse<DelegateAgentResponse>> {\n return this.delegateToken(input);\n }\n\n completeDelegateToken(\n input: CompleteDelegateTokenInput,\n ): Promise<QoniResponse<DelegateTokenResponse>> {\n return this.signedPost<DelegateTokenResponse>(\n \"/api/v3/eak/delegations/complete\",\n input,\n ).then(\n normalizeDelegateAgentTokenResponse,\n );\n }\n\n /** @deprecated Use completeDelegateToken. */\n completeDelegateAgent(\n input: CompleteDelegateAgentInput,\n ): Promise<QoniResponse<DelegateTokenResponse>> {\n return this.completeDelegateToken(input);\n }\n\n currentUser<T = unknown>(input: GenAuthAccessTokenInput): Promise<QoniResponse<T>> {\n return this.genauth.userInfo<T>(input);\n }\n\n /**\n * Resolve a real GenAuth user id from the userpool bound to this AK/SK, by\n * listing users and returning the first one. Convenience for demos / smoke\n * tests so `delegateToken` has a valid `userId` without hardcoding one. In\n * application code, resolve the actual logged-in user via `currentUser`\n * instead of picking an arbitrary userpool member.\n */\n async resolveAnyBoundUser(): Promise<string> {\n const res = await this.genauth.users.list<unknown>({ page: 1, limit: 1 });\n const userId = firstBoundUserId(res.data);\n if (!userId) {\n throw new QoniError(\n \"resolveAnyBoundUser: the credential-bound GenAuth userpool returned no users. \" +\n \"Create a user in the userpool, or pass a real userId to delegateToken.\",\n { code: \"eak.genauth.no_bound_users\" },\n );\n }\n return userId;\n }\n\n request<T = unknown>(input: RawRequestInput): Promise<QoniResponse<T>> {\n return this.unstableRequest<T>(input);\n }\n\n unstableRequest<T = unknown>(input: RawRequestInput): Promise<QoniResponse<T>> {\n if (!input.token) {\n const pathname = normalizePath(input.path);\n const signaturePayload =\n input.method === \"GET\" ? (input.query || {}) : (input.body || {});\n const signedHeaders = buildSignedHeaders(\n {\n accessKey: this.accessKey,\n secretKey: this.secretKey,\n },\n input.method,\n pathname,\n signaturePayload,\n );\n return this.baseUrlFor(\"qoni\").then((baseUrl) => this.jsonRequest<T>(baseUrl, pathname, {\n method: input.method,\n query: input.query,\n body: input.body,\n headers: {\n ...nonSignatureHeaders(input.headers),\n ...signedHeaders,\n },\n service: \"qoni\",\n signed: true,\n }));\n }\n return this.baseUrlFor(\"qoni\").then((baseUrl) => this.jsonRequest<T>(baseUrl, input.path, {\n method: input.method,\n token: input.token,\n query: input.query,\n body: input.body,\n headers: input.headers,\n service: \"qoni\",\n }));\n }\n\n private qoniJson<T>(\n method: QoniHttpMethod,\n path: string,\n token?: string,\n payload: RequestPayload = {},\n ): Promise<QoniResponse<T>> {\n return this.baseUrlFor(\"qoni\").then((baseUrl) => this.jsonRequest<T>(baseUrl, path, {\n ...payload,\n method,\n token,\n service: \"qoni\",\n }));\n }\n\n private genauthJson<T>(\n method: QoniHttpMethod,\n path: string,\n token?: string,\n payload: RequestPayload = {},\n ): Promise<QoniResponse<T>> {\n return this.baseUrlFor(\"genauth\").then((baseUrl) => this.jsonRequest<T>(baseUrl, path, {\n ...payload,\n method,\n token,\n service: \"genauth\",\n }));\n }\n\n private async gumemJson<T>(\n method: QoniHttpMethod,\n path: string,\n token?: string,\n payload: RequestPayload = {},\n ): Promise<QoniResponse<T>> {\n const runtimeToken = await this.productTokenFor(\"gumem\", token, payload.requiredScopes);\n const baseUrl = await this.baseUrlFor(\"gumem\");\n return this.jsonRequest<T>(baseUrl, path, {\n ...payload,\n method,\n token: runtimeToken,\n service: \"gumem\",\n });\n }\n\n private async *gumemSSE<T>(\n path: string,\n token?: string,\n payload: RequestPayload & { lastEventId?: string; signal?: AbortSignal } = {},\n ): AsyncIterable<QoniEvent<T>> {\n const runtimeToken = await this.productTokenFor(\"gumem\", token, payload.requiredScopes);\n const baseUrl = await this.baseUrlFor(\"gumem\");\n for await (const event of this.sseRequest<T>(baseUrl, path, {\n ...payload,\n token: runtimeToken,\n service: \"gumem\",\n })) {\n yield event;\n }\n }\n\n private async webAgentJson<T>(\n method: QoniHttpMethod,\n path: string,\n token?: string,\n payload: RequestPayload = {},\n ): Promise<QoniResponse<T>> {\n payload.signal?.throwIfAborted();\n const runtimeToken = await this.productTokenFor(\"webagent\", token, payload.requiredScopes);\n payload.signal?.throwIfAborted();\n const baseUrl = await this.baseUrlFor(\"webagent\");\n return this.jsonRequest<T>(\n baseUrl,\n this.webAgentPath(runtimeToken, path),\n { ...payload, method, token: runtimeToken, service: \"webagent\" },\n );\n }\n\n // Binary GET against the WebAgent API — artifact content downloads. JSON\n // error payloads still map to typed QoniErrors.\n private async webAgentBytes(\n path: string,\n token?: string,\n payload: RequestPayload = {},\n ): Promise<{ bytes: Uint8Array; mime: string }> {\n payload.signal?.throwIfAborted();\n const runtimeToken = await this.productTokenFor(\"webagent\", token, payload.requiredScopes);\n payload.signal?.throwIfAborted();\n const baseUrl = await this.baseUrlFor(\"webagent\");\n return this.fetchWithTimeout(\n urlWithBasePath(baseUrl, this.webAgentPath(runtimeToken, path), payload.query),\n {\n method: \"GET\",\n headers: {\n accept: \"*/*\",\n authorization: `Bearer ${runtimeToken}`,\n ...(payload.headers || {}),\n },\n },\n async (response, signal) => {\n if (!response.ok) {\n throw errorFromPayload(\n response.status,\n await readJson(response, signal),\n `Qoni request failed with HTTP ${response.status}`,\n );\n }\n return {\n bytes: await readBody(response, signal),\n mime: response.headers.get(\"content-type\") || \"application/octet-stream\",\n };\n },\n payload.signal,\n );\n }\n\n private async *webAgentSSE<T>(\n path: string,\n token?: string,\n payload: RequestPayload & {\n lastEventId?: string;\n signal?: AbortSignal;\n onReconnect?: (info: { attempt: number; lastEventId?: string; error: unknown }) => void;\n } = {},\n ): AsyncIterable<QoniEvent<T>> {\n const runtimeToken = await this.productTokenFor(\"webagent\", token, payload.requiredScopes);\n const baseUrl = await this.baseUrlFor(\"webagent\");\n for await (const event of this.sseRequest<T>(\n baseUrl,\n this.webAgentPath(runtimeToken, path),\n {\n ...payload,\n token: runtimeToken,\n service: \"webagent\",\n // Re-resolve the product token before each reconnect (refreshes if the\n // cached one expired); the tenant — and therefore the path — is stable.\n refreshToken: () => this.productTokenFor(\"webagent\", token, payload.requiredScopes),\n },\n )) {\n // WebAgent run streams carry no SSE `event:` line — the wire event type\n // lives in the envelope's `type` field. Surface it as `event.event` so\n // callers can match against QoniEventTypes (e.g. RUN_COMPLETED) instead of\n // reaching into the payload. `data` is left intact (envelope with\n // `type` / `task_id` / `session_id` / `data`).\n yield normalizeWebAgentEvent(event);\n }\n }\n\n private async signedPost<T>(pathname: string, body: object): Promise<QoniResponse<T>> {\n const payload = toRecord(body);\n const headers = buildSignedHeaders(\n {\n accessKey: this.accessKey,\n secretKey: this.secretKey,\n },\n \"POST\",\n pathname,\n payload,\n );\n return this.jsonRequest<T>(await this.baseUrlFor(\"qoni\"), pathname, {\n method: \"POST\",\n body: payload,\n headers,\n service: \"qoni\",\n signed: true,\n });\n }\n\n private async jsonRequest<T>(\n baseUrl: string,\n pathname: string,\n options: RequestPayload & {\n method: QoniHttpMethod;\n token?: string;\n service: QoniService;\n signed?: boolean;\n },\n ): Promise<QoniResponse<T>> {\n const { response, payload } = await this.fetchWithTimeout(\n urlWithBasePath(baseUrl, pathname, options.query),\n {\n method: options.method,\n headers: requestHeaders(options),\n body: requestBody(options.body),\n },\n async (response, signal) => ({ response, payload: await readJson(response, signal) }),\n options.signal,\n );\n if (!response.ok) {\n throw errorFromPayload(\n response.status,\n payload,\n `Qoni request failed with HTTP ${response.status}`,\n );\n }\n const envelopeStatus = errorEnvelopeStatus(payload);\n if (envelopeStatus !== undefined) {\n throw errorFromPayload(\n envelopeStatus,\n payload,\n `Qoni request failed with statusCode ${envelopeStatus}`,\n );\n }\n return normalizeResponse<T>(payload, options.service);\n }\n\n // Reconnecting wrapper: yields events from a fresh connection, and on a\n // dropped stream (network/5xx, not a clean close or a user abort) reconnects\n // with `last-event-id` so the backend replays from where we left off. Each\n // attempt re-issues the GET with the same Bearer product token (no per-call\n // AK/SK signature, so no gateway nonce replay). Caps at `sseMaxRetries`.\n private async *sseRequest<T>(\n baseUrl: string,\n pathname: string,\n options: RequestPayload & {\n token: string;\n service: QoniService;\n lastEventId?: string;\n signal?: AbortSignal;\n // Re-resolved before every (re)connect so a long stream survives product\n // token expiry — the dominant cause of a reconnect failing with 401.\n refreshToken?: () => Promise<string>;\n // Observability: called before each reconnect attempt (not the first).\n onReconnect?: (info: { attempt: number; lastEventId?: string; error: unknown }) => void;\n },\n ): AsyncIterable<QoniEvent<T>> {\n let lastEventId = options.lastEventId;\n let attempt = 0;\n for (;;) {\n const token = options.refreshToken ? await options.refreshToken() : options.token;\n try {\n for await (const event of this.sseConnectOnce<T>(baseUrl, pathname, {\n ...options,\n token,\n lastEventId,\n })) {\n if (event.id) lastEventId = event.id;\n attempt = 0; // a delivered event proves the connection is healthy\n yield event;\n }\n return; // server closed the stream cleanly — the run is over\n } catch (err) {\n if (options.signal?.aborted) throw err; // user abort — never retry\n // 401/403 on a reconnect is usually an expired product token; with a\n // refreshToken the next attempt re-resolves it, so allow the retry.\n const canRetry =\n isRetryableStreamError(err) || (!!options.refreshToken && isAuthError(err));\n if (attempt >= this.sseMaxRetries || !canRetry) throw err;\n attempt++;\n options.onReconnect?.({ attempt, lastEventId, error: err });\n await sleepWithAbort(sseBackoffMs(attempt), options.signal);\n }\n }\n }\n\n private async *sseConnectOnce<T>(\n baseUrl: string,\n pathname: string,\n options: RequestPayload & {\n token: string;\n service: QoniService;\n lastEventId?: string;\n signal?: AbortSignal;\n },\n ): AsyncIterable<QoniEvent<T>> {\n let cleanup: (() => void) | undefined;\n let reader: ReadableStreamDefaultReader<Uint8Array> | undefined;\n const onAbort = () => { void reader?.cancel(options.signal?.reason).catch(() => undefined); };\n const decoder = new TextDecoder();\n let buffer = \"\";\n try {\n const response = await this.fetchWithTimeout(\n urlWithBasePath(baseUrl, pathname, options.query),\n {\n method: \"GET\",\n headers: {\n accept: \"text/event-stream\",\n authorization: `Bearer ${options.token}`,\n ...(options.headers || {}),\n ...(options.lastEventId ? { \"last-event-id\": options.lastEventId } : {}),\n },\n },\n async (response, signal) => {\n if (!response.ok) {\n throw errorFromPayload(\n response.status,\n await readJson(response, signal),\n `Qoni stream failed with HTTP ${response.status}`,\n );\n }\n return response;\n },\n options.signal,\n { streamCleanup: (dispose) => { cleanup = dispose; } },\n );\n if (!response.body) {\n throw errorFromPayload(502, undefined, \"Qoni stream response has no body\");\n }\n\n reader = response.body.getReader();\n options.signal?.addEventListener(\"abort\", onAbort, { once: true });\n while (true) {\n // Belt and braces: even if abort → reader rejection plumbing fails,\n // notice the aborted signal at the next delivered chunk/heartbeat.\n options.signal?.throwIfAborted();\n const { done, value } = await reader.read();\n options.signal?.throwIfAborted();\n if (done) break;\n buffer += decoder.decode(value, { stream: true });\n const chunks = buffer.split(/\\r?\\n\\r?\\n/);\n buffer = chunks.pop() || \"\";\n for (const chunk of chunks) {\n options.signal?.throwIfAborted();\n const event = parseSSEEvent<T>(chunk);\n if (event) yield event;\n }\n }\n const finalEvent = parseSSEEvent<T>(buffer);\n if (finalEvent) yield finalEvent;\n } finally {\n cleanup?.();\n options.signal?.removeEventListener(\"abort\", onAbort);\n // `break`ing out of `for await` runs this block without ever aborting the\n // signal, so the abort path above never fires. Releasing the lock alone\n // leaves the response body open and its socket checked out of the pool —\n // enough leaked SSE streams and every later request to the same origin\n // queues until it times out. Cancel the body first; the lock goes with it.\n void reader?.cancel().catch(() => undefined);\n try {\n reader?.releaseLock();\n } catch {\n // Already released by cancel() — nothing to do.\n }\n }\n }\n\n private async fetchWithTimeout<T>(\n input: URL,\n init: RequestInit,\n consume: (response: Response, signal: AbortSignal) => Promise<T>,\n signal?: AbortSignal,\n opts?: { streamCleanup?: (dispose: () => void) => void },\n ): Promise<T> {\n if (signal?.aborted) throw signal.reason || new DOMException(\"Aborted\", \"AbortError\");\n const controller = new AbortController();\n const resolved = resolveLocalGenauthRequest(input);\n const requestInit = resolved.hostHeader\n ? {\n ...init,\n headers: withHostHeader(init.headers, resolved.hostHeader),\n }\n : init;\n let didTimeout = false;\n const abortFromSignal = () => controller.abort(signal?.reason);\n signal?.addEventListener(\"abort\", abortFromSignal, { once: true });\n const timeout = setTimeout(() => {\n didTimeout = true;\n controller.abort();\n }, this.timeoutMs);\n let response: Response | undefined;\n try {\n response = await new Promise<Response>((resolve, reject) => {\n const onAbort = () => reject(controller.signal.reason);\n controller.signal.addEventListener(\"abort\", onAbort, { once: true });\n Promise.resolve().then(() => {\n controller.signal.throwIfAborted();\n return this.fetchImpl(resolved.url, { ...requestInit, signal: controller.signal });\n }).then((response) => {\n if (controller.signal.aborted) {\n void response.body?.cancel(controller.signal.reason).catch(() => undefined);\n reject(controller.signal.reason);\n } else {\n resolve(response);\n }\n }, reject).finally(() => controller.signal.removeEventListener(\"abort\", onAbort));\n });\n const result = await consume(response, controller.signal);\n controller.signal.throwIfAborted();\n return result;\n } catch (error) {\n void response?.body?.cancel().catch(() => undefined);\n if (signal?.aborted) throw signal.reason;\n if (didTimeout || isConnectTimeoutError(error)) {\n throw timeoutError(error);\n }\n if (isFetchNetworkError(error)) throw networkError(error);\n throw error;\n } finally {\n clearTimeout(timeout);\n const cleanup = () => signal?.removeEventListener(\"abort\", abortFromSignal);\n if (opts?.streamCleanup) opts.streamCleanup(cleanup);\n else cleanup();\n }\n }\n\n private async baseUrlFor(service: QoniService): Promise<string> {\n const explicit = this.explicitBaseUrlFor(service);\n if (explicit) return explicit;\n // AK/SK signatures are scoped to the configured control-plane endpoint.\n // Keep signed Qoni calls on that trusted boundary: following a cross-origin\n // runtime URL can strip Authorization on redirect or disclose credentials.\n // Resolved before the discovery fetch below, so a Qoni call never depends\n // on a document it does not read — otherwise an unavailable runtime-config\n // takes down every Qoni request with it.\n if (service === \"qoni\") return this.host;\n const runtime = await this.runtimeConfig();\n const hostOrigin = originBaseUrl(this.host);\n if (service === \"genauth\") return runtime.genauthBaseUrl ?? hostOrigin;\n if (service === \"gumem\") return runtime.gumemBaseUrl ?? hostOrigin;\n return runtime.webAgentBaseUrl ?? hostOrigin;\n }\n\n private explicitBaseUrlFor(service: QoniService): string | undefined {\n if (service === \"qoni\") {\n const value = this.options.qoniBaseUrl ?? this.options.genauthBaseUrl;\n return value ? normalizeBaseUrl(value) : undefined;\n }\n if (service === \"genauth\" && this.options.genauthBaseUrl) {\n return normalizeBaseUrl(this.options.genauthBaseUrl);\n }\n if (service === \"genauth\") {\n const value = serviceHostOption(this.options, \"genauth\");\n return value ? normalizeBaseUrl(value) : undefined;\n }\n if (service === \"gumem\" && this.options.gumemBaseUrl) {\n return normalizeBaseUrl(this.options.gumemBaseUrl);\n }\n if (service === \"gumem\") {\n const value = serviceHostOption(this.options, \"gumem\");\n return value ? normalizeBaseUrl(value) : undefined;\n }\n if (service === \"webagent\" && this.options.webAgentBaseUrl) {\n return normalizeBaseUrl(this.options.webAgentBaseUrl);\n }\n if (service === \"webagent\") {\n const value = serviceHostOption(this.options, \"webagent\");\n return value ? normalizeBaseUrl(value) : undefined;\n }\n return undefined;\n }\n\n private runtimeConfig(): Promise<ResolvedRuntimeConfig> {\n this.runtimeConfigPromise ??= this.fetchRuntimeConfig();\n return this.runtimeConfigPromise;\n }\n\n private async fetchRuntimeConfig(): Promise<ResolvedRuntimeConfig> {\n const pathname = \"/api/v3/eak/runtime-config\";\n const headers = buildSignedHeaders(\n {\n accessKey: this.accessKey,\n secretKey: this.secretKey,\n },\n \"GET\",\n pathname,\n {},\n );\n const { response, payload } = await this.fetchWithTimeout(\n urlWithBasePath(this.host, pathname),\n {\n method: \"GET\",\n headers: {\n accept: \"application/json\",\n ...headers,\n },\n },\n async (response, signal) => ({ response, payload: await readJson(response, signal) }),\n );\n if (!response.ok) {\n throw errorFromPayload(\n response.status,\n payload,\n `Qoni runtime config request failed with HTTP ${response.status}`,\n );\n }\n return normalizeRuntimeConfig(payload);\n }\n\n private webAgentPath(token: string, path: string): string {\n const normalized = normalizePath(path);\n if (normalized.startsWith(\"/api/v1/projects/\")) return normalized;\n // The tenant is carried by the delegation token (a JWT).\n const tenantId = requiredWebAgentTenantId(token);\n return `/api/v1/projects/${encodeURIComponent(tenantId)}${normalized}`;\n }\n\n private async productTokenFor(\n service: \"gumem\" | \"webagent\",\n token: string | undefined,\n requiredScopes: readonly string[] | undefined,\n ): Promise<string> {\n const runtimeToken = requiredRuntimeToken(token);\n if (!isQoniDelegationToken(runtimeToken)) return runtimeToken;\n\n // Every SDK operation must re-enter GenAuth's policy check. A cached\n // product token can outlive a change to the access key's allowed scopes.\n const scopes = [...(requiredScopes || [])].sort();\n\n const response = await this.signedPost<unknown>(\"/api/v3/eak/token-exchange\", {\n subjectToken: runtimeToken,\n resource: service === \"gumem\" ? \"gumem\" : \"webagent\",\n scopes,\n });\n const payload = response.data;\n const accessToken = readAccessToken(payload);\n if (!accessToken) {\n throw errorFromPayload(\n 502,\n payload,\n \"Qoni product token exchange response did not include an access token\",\n );\n }\n\n return accessToken;\n }\n\n private async genauthAdminTokenFor(): Promise<{ accessToken: string; userPoolId: string }> {\n const cached = this.genAuthAdminTokenCache;\n if (cached && cached.expiresAt > Date.now() + 30_000) {\n return { accessToken: cached.accessToken, userPoolId: cached.userPoolId };\n }\n\n const response = await this.signedPost<unknown>(\"/api/v3/eak/genauth/admin-token\", {});\n const payload = response.data;\n const accessToken = readAccessToken(payload);\n const userPoolId =\n readString(payload, \"userPoolId\") ??\n readString(payload, \"userpoolId\") ??\n readString(payload, \"user_pool_id\");\n if (!accessToken || !userPoolId) {\n throw errorFromPayload(\n 502,\n payload,\n \"Qoni GenAuth admin-token response did not include accessToken and userPoolId\",\n );\n }\n\n this.genAuthAdminTokenCache = {\n accessToken,\n userPoolId,\n expiresAt: Date.now() + Math.max(0, readExpiresIn(payload) ?? 3600) * 1000,\n };\n return { accessToken, userPoolId };\n }\n}\n\ninterface ResolvedRuntimeConfig {\n eakBaseUrl?: string;\n genauthBaseUrl?: string;\n gumemBaseUrl?: string;\n webAgentBaseUrl?: string;\n}\n\nfunction requestHeaders(\n options: RequestPayload & { token?: string; signed?: boolean },\n): Record<string, string> {\n const headers: Record<string, string> = {\n accept: \"application/json\",\n ...(options.headers || {}),\n };\n if (options.token) headers.authorization = `Bearer ${options.token}`;\n if (options.body !== undefined && !isBodyInit(options.body) && !headers[\"content-type\"]) {\n headers[\"content-type\"] = \"application/json\";\n }\n return headers;\n}\n\nfunction nonSignatureHeaders(\n headers: Record<string, string> | undefined,\n): Record<string, string> {\n return Object.fromEntries(\n Object.entries(headers || {}).filter(([key]) => {\n const normalized = key.toLowerCase();\n return (\n normalized !== \"authorization\" &&\n normalized !== \"content-type\" &&\n normalized !== \"date\" &&\n !normalized.startsWith(\"x-authing-\")\n );\n }),\n );\n}\n\nfunction requestBody(body: RequestPayload[\"body\"]): BodyInit | undefined {\n if (body === undefined) return undefined;\n if (isBodyInit(body)) return body;\n return JSON.stringify(body);\n}\n\nfunction isBodyInit(value: unknown): value is BodyInit {\n return (\n typeof value === \"string\" ||\n value instanceof ArrayBuffer ||\n value instanceof Blob ||\n value instanceof FormData ||\n value instanceof URLSearchParams\n );\n}\n\nasync function readBody(response: Response, signal: AbortSignal): Promise<Uint8Array> {\n if (!response.body) {\n signal.throwIfAborted();\n return new Uint8Array();\n }\n const reader = response.body.getReader();\n const onAbort = () => { void reader.cancel(signal.reason).catch(() => undefined); };\n signal.addEventListener(\"abort\", onAbort, { once: true });\n try {\n const chunks: Uint8Array[] = [];\n let size = 0;\n for (;;) {\n signal.throwIfAborted();\n const { done, value } = await reader.read();\n signal.throwIfAborted();\n if (done) break;\n chunks.push(value);\n size += value.byteLength;\n }\n const bytes = new Uint8Array(size);\n let offset = 0;\n for (const chunk of chunks) {\n bytes.set(chunk, offset);\n offset += chunk.byteLength;\n }\n return bytes;\n } finally {\n signal.removeEventListener(\"abort\", onAbort);\n void reader.cancel().catch(() => undefined);\n reader.releaseLock();\n }\n}\n\nasync function readJson(response: Response, signal: AbortSignal): Promise<unknown> {\n const contentType = response.headers.get(\"content-type\")?.toLowerCase() || \"\";\n const body = new TextDecoder().decode(await readBody(response, signal));\n try {\n if (contentType.includes(\"ndjson\") || contentType.includes(\"jsonl\")) {\n if (!body.trim()) return [];\n return body\n .split(/\\r?\\n/)\n .filter((line) => line.trim().length > 0)\n .map((line) => JSON.parse(line));\n }\n return JSON.parse(body);\n } catch {\n return undefined;\n }\n}\n\nfunction normalizeResponse<T>(payload: unknown, _service: QoniService): QoniResponse<T> {\n if (isJsonObject(payload) && (\"data\" in payload || \"meta\" in payload)) {\n return {\n data: (\"data\" in payload ? payload.data : payload) as T,\n meta: {\n ...(isJsonObject(payload.meta) ? payload.meta : {}),\n ...topLevelMeta(payload),\n },\n };\n }\n return { data: payload as T, meta: {} };\n}\n\nfunction topLevelMeta(payload: JsonObject): JsonObject {\n const meta: JsonObject = {};\n for (const key of [\"requestId\", \"traceId\", \"auditId\"]) {\n if (typeof payload[key] === \"string\") meta[key] = payload[key];\n }\n return meta;\n}\n\nfunction urlWithQuery(baseUrl: string, pathname: string, query?: JsonObject): URL {\n const url = new URL(normalizePath(pathname), baseUrl);\n for (const [key, value] of Object.entries(query || {})) {\n if (value !== undefined && value !== null) url.searchParams.set(key, String(value));\n }\n return url;\n}\n\nfunction urlWithBasePath(baseUrl: string, pathname: string, query?: JsonObject): URL {\n const base = new URL(baseUrl);\n const basePath = base.pathname === \"/\" ? \"\" : base.pathname.replace(/\\/+$/, \"\");\n const normalizedPath = normalizePath(pathname);\n const fullPath =\n basePath && (normalizedPath === basePath || normalizedPath.startsWith(`${basePath}/`))\n ? normalizedPath\n : `${basePath}${normalizedPath}`;\n return urlWithQuery(base.origin, fullPath, query);\n}\n\nfunction resolveLocalGenauthRequest(input: URL): { url: URL; hostHeader?: string } {\n const url = new URL(input.toString());\n if (\n process.env.QONI_LOCAL_GENAUTH_REWRITE === \"false\" ||\n url.protocol !== \"http:\" ||\n !url.hostname.endsWith(\".genauth.localhost\")\n ) {\n return { url };\n }\n\n const hostHeader = url.host;\n url.hostname = process.env.QONI_LOCAL_GENAUTH_TARGET_HOST || \"127.0.0.1\";\n return { url, hostHeader };\n}\n\nfunction withHostHeader(headers: HeadersInit | undefined, hostHeader: string): Record<string, string> {\n const out: Record<string, string> = {};\n new Headers(headers).forEach((value, key) => {\n out[key] = value;\n });\n out.Host = hostHeader;\n return out;\n}\n\nfunction normalizePath(path: string): string {\n return path.startsWith(\"/\") ? path : `/${path}`;\n}\n\nfunction normalizeBaseUrl(host: string): string {\n const withProtocol = /^https?:\\/\\//i.test(host) ? host : `https://${host}`;\n return withProtocol.replace(/\\/+$/, \"\");\n}\n\nfunction originBaseUrl(host: string): string {\n return new URL(host).origin;\n}\n\nfunction serviceHostOption(\n options: QoniOptions,\n service: Exclude<QoniService, \"qoni\">,\n): string | undefined {\n if (service === \"genauth\") {\n return options.genauthHost;\n }\n if (service === \"gumem\") {\n return options.gumemHost;\n }\n return options.webAgentHost;\n}\n\nfunction normalizeRuntimeConfig(payload: unknown): ResolvedRuntimeConfig {\n const data = envelopeData(payload);\n if (!isJsonObject(data)) return {};\n const config = data as QoniRuntimeConfig;\n return {\n eakBaseUrl: runtimeServiceUrl(config, \"eak\", \"eakBaseUrl\"),\n genauthBaseUrl: runtimeServiceUrl(config, \"genauth\", \"genauthBaseUrl\"),\n gumemBaseUrl: runtimeServiceUrl(config, \"gumem\", \"gumemBaseUrl\"),\n webAgentBaseUrl:\n runtimeServiceUrl(config, \"webAgent\", \"webAgentBaseUrl\") ??\n runtimeServiceUrl(config, \"webagent\", \"webAgentBaseUrl\"),\n };\n}\n\nfunction envelopeData(payload: unknown): unknown {\n if (isJsonObject(payload) && \"data\" in payload) return payload.data;\n return payload;\n}\n\nfunction runtimeServiceUrl(\n config: QoniRuntimeConfig,\n service: keyof NonNullable<QoniRuntimeConfig[\"services\"]>,\n topLevelKey: keyof QoniRuntimeConfig,\n): string | undefined {\n const topLevel = config[topLevelKey];\n if (typeof topLevel === \"string\" && topLevel.trim()) return normalizeBaseUrl(topLevel);\n const serviceValue = config.services?.[service];\n if (typeof serviceValue === \"string\" && serviceValue.trim()) {\n return normalizeBaseUrl(serviceValue);\n }\n if (isJsonObject(serviceValue)) {\n for (const key of [\"baseUrl\", \"url\", \"host\"] as const) {\n const value = serviceValue[key];\n if (typeof value === \"string\" && value.trim()) return normalizeBaseUrl(value);\n }\n }\n return undefined;\n}\n\nfunction toRecord(value: object): JsonObject {\n const out: JsonObject = {};\n for (const [key, item] of Object.entries(value)) {\n if (item !== undefined) out[key] = item;\n }\n return out;\n}\n\nfunction normalizeDelegateTokenInput(input: DelegateTokenInput): JsonObject {\n const body = toRecord(input);\n if (input.deniedScopes !== undefined) {\n throw new QoniValidationError(\n \"delegateToken: deniedScopes is not supported by the delegation service. \" +\n \"Do not rely on this field to prevent mailbox or browser actions.\",\n );\n }\n if (input.agent !== undefined && input.agentKey !== undefined && input.agent !== input.agentKey) {\n throw new QoniValidationError(\"delegateToken: agent and agentKey must identify the same Agent\");\n }\n if (!body.userId && isJsonObject(input.user) && typeof input.user.id === \"string\") {\n body.userId = input.user.id;\n }\n // Silent delegation acts for a specific end user, so a user id is required.\n // Fail locally with a precise message instead of letting an un-attributed\n // request reach the gateway and come back as a confusing signing/auth error\n // (interactive mode is exempt — the Qoni Console resolves the login during\n // authorization). The TS overloads already enforce this; the guard is for\n // plain-JS callers where types don't apply.\n if (input.mode !== \"interactive\" && !body.userId) {\n throw new QoniValidationError(\n \"delegateToken: silent mode requires a user — pass `user: { id: <genauthUserId> }` \" +\n \"(or the top-level `userId`). Interactive mode (`mode: \\\"interactive\\\"`) \" +\n \"does not need one.\",\n );\n }\n body.agent = input.agent ?? input.agentKey ?? \"sdk\";\n delete body.agentKey;\n if (input.expiresIn !== undefined) body.expiresIn = delegationDurationSeconds(input.expiresIn);\n body.scopes = resolveDelegationScopes(input.scopes, input.products);\n delete body.products;\n return body;\n}\n\nfunction delegationDurationSeconds(value: string | number): number {\n let seconds = value;\n if (typeof value === \"string\") {\n const duration = /^(\\d+)(s|m|h|d)?$/.exec(value);\n const units: Record<string, number> = { s: 1, m: 60, h: 3600, d: 86400 };\n seconds = duration ? Number(duration[1]) * units[duration[2] ?? \"s\"] : NaN;\n }\n if (typeof seconds !== \"number\" || !Number.isInteger(seconds) || seconds < 60 || seconds > 86400) {\n throw new QoniValidationError(\n 'delegateToken: expiresIn must be 60–86400 integer seconds or a whole-number duration such as \"15m\"',\n );\n }\n return seconds;\n}\n\n/**\n * Merge explicit scopes with the `products` sugar expansion, pre-validating\n * scope formats locally so typos fail before any request is made.\n */\nfunction resolveDelegationScopes(\n scopes: readonly string[] | undefined,\n products: readonly string[] | undefined,\n): string[] {\n const resolved = new Set<string>();\n for (const product of products ?? []) {\n const expansion = QoniProductScopes[product as QoniProduct];\n if (!expansion) {\n throw new QoniValidationError(\n `delegateToken: unknown product \"${product}\" — expected one of ` +\n `${Object.keys(QoniProductScopes).join(\", \")}`,\n );\n }\n for (const scope of expansion) resolved.add(scope);\n }\n for (const scope of scopes ?? []) {\n validateScopeFormat(scope);\n resolved.add(scope);\n }\n if (resolved.size === 0) {\n throw new QoniValidationError(\n \"delegateToken requires at least one scope — pass scopes (e.g. \" +\n '[\"webagent.do_anything:manage\"]) and/or products (e.g. [\"doAnything\"])',\n );\n }\n return [...resolved];\n}\n\nfunction validateScopeFormat(scope: string): void {\n if (scope.startsWith(\"mailbox.\") || scope === \"web.search\" || scope === \"web.extract\") {\n throw new QoniValidationError(\n `delegateToken: legacy action scope \"${scope}\" has no enforced mapping in this delegation service. ` +\n \"It will not be expanded into broader product permissions.\",\n );\n }\n if (KNOWN_SCOPES.includes(scope)) return;\n // A known scope minus its service prefix — the most common mistake.\n const prefixed = KNOWN_SCOPES.find((known) => known.endsWith(`.${scope}`) || known === `webagent.${scope}`);\n if (prefixed) {\n throw new QoniValidationError(\n `delegateToken: scope \"${scope}\" is missing its service prefix — write \"${prefixed}\"`,\n );\n }\n // Unknown scopes are allowed if well-formed (the server is the authority on\n // newly added scopes); malformed ones fail locally with the correct form.\n if (!/^[a-z0-9_]+(\\.[a-z0-9_]+)+:[a-z0-9_]+$/.test(scope)) {\n throw new QoniValidationError(\n `delegateToken: malformed scope \"${scope}\" — scopes look like ` +\n '\"<service>.<resource>:<action>\", e.g. \"webagent.do_anything:manage\"',\n );\n }\n}\n\nfunction errorEnvelopeStatus(payload: unknown): number | undefined {\n if (!isJsonObject(payload)) return undefined;\n const statusCode = payload.statusCode;\n if (typeof statusCode !== \"number\" || statusCode < 400) return undefined;\n if (\"data\" in payload && payload.data !== undefined) return undefined;\n return statusCode;\n}\n\nfunction decodeJwtPayload(token: string): JsonObject {\n const [, payload] = token.split(\".\");\n if (!payload) throw new Error(\"token is not a JWT\");\n return JSON.parse(Buffer.from(payload, \"base64url\").toString(\"utf8\")) as JsonObject;\n}\n\nfunction safeDecodeJwtPayload(token: string): JsonObject | undefined {\n try {\n return decodeJwtPayload(token);\n } catch {\n return undefined;\n }\n}\n\nfunction isQoniDelegationToken(token: string): boolean {\n return safeDecodeJwtPayload(token)?.token_type === \"eak_delegation_token\";\n}\n\nfunction readAccessToken(payload: unknown): string | undefined {\n if (!isJsonObject(payload)) return undefined;\n for (const key of [\"accessToken\", \"access_token\", \"token\"]) {\n const token = payload[key];\n if (typeof token === \"string\" && token.trim()) return token;\n }\n return undefined;\n}\n\nfunction readExpiresIn(payload: unknown): number | undefined {\n if (!isJsonObject(payload)) return undefined;\n const expiresIn = payload.expiresIn ?? payload.expires_in;\n if (typeof expiresIn === \"number\" && Number.isFinite(expiresIn)) return expiresIn;\n if (typeof expiresIn === \"string\" && expiresIn.trim()) {\n const parsed = Number(expiresIn);\n return Number.isFinite(parsed) ? parsed : undefined;\n }\n return undefined;\n}\n\nfunction readString(payload: unknown, key: string): string | undefined {\n if (!isJsonObject(payload)) return undefined;\n const value = payload[key];\n return typeof value === \"string\" && value.trim() ? value : undefined;\n}\n\nfunction requiredWebAgentTenantId(token: string): string {\n const payload = decodeJwtPayload(token);\n const productResource = payload.product_resource;\n if (isJsonObject(productResource) && productResource.type === \"webagent_tenant\") {\n const id = productResource.id;\n if (typeof id === \"string\" && id.trim()) return id;\n }\n const resourceBindingTenantId = nestedString(payload, [\n \"resource_bindings\",\n \"webagent\",\n \"tenant_id\",\n ]);\n if (resourceBindingTenantId) return resourceBindingTenantId;\n const tenantId = payload.webagent_tenant_id;\n if (typeof tenantId === \"string\" && tenantId.trim()) return tenantId;\n const projectId = payload.webagent_project_id;\n if (typeof projectId === \"string\" && projectId.trim()) return projectId;\n throw new Error(\"token is missing WebAgent tenant binding\");\n}\n\nfunction nestedString(value: unknown, path: readonly string[]): string | undefined {\n let cursor = value;\n for (const segment of path) {\n if (!isJsonObject(cursor)) return undefined;\n cursor = cursor[segment];\n }\n return typeof cursor === \"string\" && cursor.trim() ? cursor : undefined;\n}\n\n// WebAgent run events arrive as `id: <n>\\ndata: <envelope>` with no SSE\n// `event:` line; the type is the envelope's `type` field. Lift it to\n// `event.event` so callers can match QoniEventTypes. Non-record / typed events\n// pass through unchanged.\nfunction normalizeWebAgentEvent<T>(event: QoniEvent<T>): QoniEvent<T> {\n if (event.event) return event;\n const data = event.data as { type?: unknown } | null | undefined;\n if (data && typeof data === \"object\" && typeof data.type === \"string\") {\n return { ...event, event: data.type };\n }\n return event;\n}\n\n// Retry on connection drops (ECONNRESET, fetch network errors) and transient\n// 5xx / 408 / 429. Never retry on user abort or terminal 4xx (auth / not found).\nfunction isRetryableStreamError(err: unknown): boolean {\n if (err && typeof err === \"object\") {\n const e = err as { name?: string; retryable?: boolean; status?: number };\n if (e.name === \"AbortError\") return false;\n if (e.status === 408) return true;\n if (typeof e.retryable === \"boolean\") return e.retryable;\n if (typeof e.status === \"number\") {\n return e.status >= 500 || e.status === 408 || e.status === 429;\n }\n }\n return true; // unknown / network read error — reconnect\n}\n\n// 401/403 — retryable only when a token refresh is available (the next attempt\n// re-resolves the product token); never retryable on its own.\nfunction isAuthError(err: unknown): boolean {\n const status = (err as { status?: number } | null)?.status;\n return status === 401 || status === 403;\n}\n\nfunction sseBackoffMs(attempt: number): number {\n const base = Math.min(500 * 2 ** (attempt - 1), 10_000);\n return base + Math.floor(Math.random() * 250); // jitter\n}\n\nfunction sleepWithAbort(ms: number, signal?: AbortSignal): Promise<void> {\n return new Promise((resolve, reject) => {\n if (signal?.aborted) {\n reject(new DOMException(\"The operation was aborted\", \"AbortError\"));\n return;\n }\n const timer = setTimeout(() => {\n signal?.removeEventListener(\"abort\", onAbort);\n resolve();\n }, ms);\n const onAbort = (): void => {\n clearTimeout(timer);\n reject(new DOMException(\"The operation was aborted\", \"AbortError\"));\n };\n signal?.addEventListener(\"abort\", onAbort, { once: true });\n });\n}\n\n// Pull the first user id out of a genauth.users.list response, tolerating the\n// various envelope shapes (array, { list }, { users }, { data: [...] }) and id\n// field names the userpool may use.\nfunction firstBoundUserId(data: unknown): string | undefined {\n const arrays = [data, (data as { list?: unknown })?.list, (data as { users?: unknown })?.users,\n (data as { data?: unknown })?.data, (data as { items?: unknown })?.items];\n for (const candidate of arrays) {\n if (Array.isArray(candidate) && candidate.length) {\n const u = candidate[0] as Record<string, unknown>;\n for (const key of [\"userId\", \"id\", \"user_id\", \"sub\", \"username\"]) {\n const v = u?.[key];\n if (typeof v === \"string\" && v) return v;\n }\n }\n }\n return undefined;\n}\n\nfunction parseSSEEvent<T>(chunk: string): QoniEvent<T> | null {\n const lines = chunk.split(/\\r?\\n/);\n let id: string | undefined;\n let event: string | undefined;\n const data: string[] = [];\n for (const line of lines) {\n if (!line || line.startsWith(\":\")) continue;\n const index = line.indexOf(\":\");\n const field = index >= 0 ? line.slice(0, index) : line;\n const value = index >= 0 ? line.slice(index + 1).replace(/^ /, \"\") : \"\";\n if (field === \"id\") id = value;\n if (field === \"event\") event = value;\n if (field === \"data\") data.push(value);\n }\n if (!id && !event && !data.length) return null;\n return { id, event, data: parseEventData<T>(data.join(\"\\n\")) };\n}\n\nfunction parseEventData<T>(raw: string): T {\n if (!raw) return undefined as T;\n try {\n return JSON.parse(raw) as T;\n } catch {\n return raw as T;\n }\n}\n\nfunction requiredRuntimeToken(token: string | undefined): string {\n if (token && token.trim()) return token;\n throw new QoniDelegationRequiredError(\n \"Product capability calls require an explicit token in the token field\",\n );\n}\n\nfunction normalizeDelegateAgentTokenResponse<T extends DelegateAgentResponse>(\n response: QoniResponse<T>,\n): QoniResponse<T> {\n if (!isJsonObject(response.data)) return response;\n const grantState =\n typeof response.data.grantState === \"string\"\n ? response.data.grantState\n : typeof response.data.state === \"string\"\n ? response.data.state\n : typeof response.data.grantId === \"string\"\n ? response.data.grantId\n : undefined;\n if (typeof response.data.authorizationUrl === \"string\" && grantState) {\n return {\n ...response,\n data: {\n ...response.data,\n grantState,\n state: grantState,\n } as T,\n };\n }\n const token =\n typeof response.data.delegateAgentToken === \"string\"\n ? response.data.delegateAgentToken\n : typeof response.data.delegationToken === \"string\"\n ? response.data.delegationToken\n : typeof response.data.token === \"string\"\n ? response.data.token\n : undefined;\n if (!token) return response;\n return {\n ...response,\n data: {\n ...response.data,\n token,\n delegateAgentToken: token,\n } as T,\n };\n}\n\nfunction isConnectTimeoutError(error: unknown): boolean {\n const cause = errorCause(error);\n return (\n errorCode(cause) === \"UND_ERR_CONNECT_TIMEOUT\" ||\n errorName(cause) === \"ConnectTimeoutError\"\n );\n}\n\nfunction isFetchNetworkError(error: unknown): boolean {\n if (!(error instanceof TypeError)) return false;\n const message = error.message.toLowerCase();\n return message.includes(\"fetch failed\") || message.includes(\"network\");\n}\n\nfunction errorCause(error: unknown): unknown {\n return error && typeof error === \"object\" ? (error as { cause?: unknown }).cause : undefined;\n}\n\nfunction errorCode(error: unknown): string | undefined {\n return error && typeof error === \"object\" && typeof (error as { code?: unknown }).code === \"string\"\n ? (error as { code: string }).code\n : undefined;\n}\n\nfunction errorName(error: unknown): string | undefined {\n return error && typeof error === \"object\" && typeof (error as { name?: unknown }).name === \"string\"\n ? (error as { name: string }).name\n : undefined;\n}\n"],"mappings":"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","names":["data","asString","response","raw","fields","detail","omit","asRecord","renameKeys","omit","isJsonObject","omit","renameKeys","omit","asRecord","renameKeys","camelKey","omit","asRecord","renameKeys","response"]}
|
|
1
|
+
{"version":3,"sources":["../src/signature.ts","../src/auth.ts","../src/types.ts","../src/errors.ts","../src/run-events.ts","../src/generated/interaction-types.ts","../src/scopes.ts","../src/interactions.ts","../src/run-handle.ts","../src/deep-research.ts","../src/do-anything.ts","../src/qoni.ts","../src/genauth.ts","../src/gumem.ts","../src/track.ts","../src/web-search.ts","../src/client.ts"],"sourcesContent":["import { createHmac } from \"node:crypto\";\n\ntype Headers = Record<string, string>;\ntype Params = Record<string, unknown>;\n\nfunction filter(value: unknown): string {\n return String(value).replace(/[\\t\\n\\r\\f]/g, \" \");\n}\n\nfunction canonicalizedHeaders(headers: Headers): string {\n return Object.keys(headers)\n .filter((key) => key.startsWith(\"x-authing-\") || key === \"date\")\n .sort()\n .map((key) => `${key}:${filter(headers[key]).trim()}\\n`)\n .join(\"\");\n}\n\nfunction canonicalizedResource(pathname: string, params: Params): string {\n const keys = Object.keys(params).sort();\n if (!keys.length) return pathname;\n const query = keys.map((key) => {\n const value = params[key];\n return `${key}=${typeof value === \"object\" && value !== null ? JSON.stringify(value) : value}`;\n });\n return `${pathname}?${query.join(\"&\")}`;\n}\n\nexport function buildStringToSign(\n method: string,\n pathname: string,\n headers: Headers,\n params: Params,\n): string {\n return `${method.toUpperCase()}\\n${canonicalizedHeaders(headers)}${canonicalizedResource(\n pathname,\n params,\n )}`;\n}\n\nexport function buildSignature(secretKey: string, stringToSign: string): string {\n return createHmac(\"sha1\", secretKey).update(stringToSign, \"utf8\").digest(\"base64\");\n}\n\nexport function buildAuthorization(accessKey: string, secretKey: string, stringToSign: string): string {\n return `authing ${accessKey}:${buildSignature(secretKey, stringToSign)}`;\n}\n","import { buildAuthorization, buildStringToSign } from \"./signature\";\nimport type { JsonObject } from \"./types\";\n\nexport interface QoniCredentials {\n accessKey: string;\n secretKey: string;\n}\n\nlet lastSigningTimestamp = 0;\n\nfunction nextSigningTimestamp(): number {\n const now = Date.now();\n lastSigningTimestamp = Math.max(now, lastSigningTimestamp + 1);\n return lastSigningTimestamp;\n}\n\nexport function buildSignedHeaders(\n credentials: QoniCredentials,\n method: string,\n pathname: string,\n payload: JsonObject,\n): Record<string, string> {\n const headers: Record<string, string> = {\n \"content-type\": \"application/json\",\n // GenAuth rejects an already-consumed signature. A strictly monotonic\n // timestamp keeps otherwise identical requests unique within a process,\n // including retries or concurrent calls that start in the same millisecond.\n \"x-authing-date\": String(nextSigningTimestamp()),\n \"x-authing-signature-method\": \"HMAC-SHA1\",\n \"x-authing-signature-version\": \"1.0\",\n };\n const stringToSign = buildStringToSign(method, pathname, headers, payload);\n headers.authorization = buildAuthorization(\n credentials.accessKey,\n credentials.secretKey,\n stringToSign,\n );\n return headers;\n}\n","export type JsonPrimitive = string | number | boolean | null;\nexport type JsonValue = JsonPrimitive | JsonObject | JsonValue[];\nexport type JsonObject = Record<string, unknown>;\n\nexport type DelegationMode = \"silent\" | \"interactive\";\nexport type QoniService = \"qoni\" | \"genauth\" | \"gumem\" | \"webagent\";\nexport type QoniHttpMethod = \"GET\" | \"POST\" | \"PATCH\" | \"DELETE\";\n\nexport interface QoniOptions {\n accessKey?: string;\n secretKey?: string;\n host?: string;\n /** Overrides the GenAuth URL returned by runtime-config. Prefer host for normal discovery. */\n genauthHost?: string;\n /** Overrides the GUMem URL returned by runtime-config. Prefer host for normal discovery. */\n gumemHost?: string;\n /** Overrides the WebAgent URL returned by runtime-config. Prefer host for normal discovery. */\n webAgentHost?: string;\n /** @deprecated Use accessKey. */\n accessKeyId?: string;\n /** @deprecated Use secretKey. */\n accessKeySecret?: string;\n /** @deprecated Prefer host runtime discovery for normal Qoni Console gateway access. */\n qoniBaseUrl?: string;\n /** @deprecated Use host for normal Qoni Gateway access. */\n genauthBaseUrl?: string;\n /** @deprecated Use host for normal Qoni Gateway access. */\n gumemBaseUrl?: string;\n /** @deprecated Use host for normal Qoni Gateway access. */\n webAgentBaseUrl?: string;\n fetch?: typeof fetch;\n timeoutMs?: number;\n /**\n * Max automatic reconnect attempts for SSE streams (`events()`) after a\n * dropped connection. Each reconnect resumes from the last seen event id\n * via the `last-event-id` header. Defaults to 5; set 0 to disable.\n */\n sseMaxRetries?: number;\n}\n\nexport interface QoniRuntimeConfig {\n /** Current control-plane wire field. Keep until the server contract migrates. */\n eakBaseUrl?: string;\n genauthBaseUrl?: string;\n gumemBaseUrl?: string;\n webAgentBaseUrl?: string;\n services?: {\n eak?: string | { baseUrl?: string; url?: string; host?: string };\n genauth?: string | { baseUrl?: string; url?: string; host?: string };\n gumem?: string | { baseUrl?: string; url?: string; host?: string };\n webAgent?: string | { baseUrl?: string; url?: string; host?: string };\n webagent?: string | { baseUrl?: string; url?: string; host?: string };\n };\n}\n\nexport interface QoniMeta {\n requestId?: string;\n traceId?: string;\n auditId?: string;\n service?: QoniService;\n [key: string]: unknown;\n}\n\nexport interface QoniResponse<T = unknown> {\n data: T;\n meta: QoniMeta;\n}\n\nexport interface UserRef {\n id: string;\n subject?: string;\n name?: string;\n email?: string;\n avatarUrl?: string;\n [key: string]: unknown;\n}\n\ninterface DelegateTokenBaseInput {\n /** Audit label for this delegation. Defaults to \"sdk\". */\n agent?: string;\n /** Compatibility alias for agent. Supplying conflicting labels is an error. */\n agentKey?: string;\n /** Fine-grained scopes. May be combined with `products`. */\n scopes?: readonly string[];\n /** Per-product authorization sugar — expands to the product's scope set. */\n products?: readonly QoniProductName[];\n /** Integer seconds (60–86400), or a whole-number duration such as \"15m\". */\n expiresIn?: string | number;\n /** Not supported: the delegation service does not enforce a deny policy. */\n deniedScopes?: never;\n idempotencyKey?: string;\n}\n\n/**\n * Product names accepted by `delegateToken({ products })`. Mirrors\n * `QoniProduct` in scopes.ts (duplicated to keep this module import-free).\n */\nexport type QoniProductName = \"doAnything\" | \"webSearch\" | \"deepResearch\" | \"track\";\n\nexport type DelegateTokenSilentInput = DelegateTokenBaseInput & {\n mode?: \"silent\";\n redirectUri?: string;\n state?: string;\n} & (\n | {\n user: UserRef;\n /** Alternative to user.id. A nonempty userId takes precedence. */\n userId?: string;\n }\n | {\n user?: UserRef;\n /** Alternative to user.id. A nonempty userId takes precedence. */\n userId: string;\n }\n);\n\nexport interface DelegateTokenInteractiveInput extends DelegateTokenBaseInput {\n mode: \"interactive\";\n redirectUri: string;\n state: string;\n /**\n * @deprecated The authorization page identifies the signed-in user; the\n * delegation service ignores a user sent with an interactive request.\n */\n user?: UserRef;\n /**\n * @deprecated The authorization page identifies the signed-in user; the\n * delegation service ignores a user id sent with an interactive request.\n */\n userId?: string;\n}\n\nexport type DelegateTokenInput =\n | DelegateTokenSilentInput\n | DelegateTokenInteractiveInput;\n\n/** @deprecated Use DelegateTokenInput. */\nexport type DelegateAgentInput = DelegateTokenInput;\n\nexport interface CompleteDelegateTokenInput {\n grantId: string;\n code: string;\n state: string;\n}\n\n/** @deprecated Use CompleteDelegateTokenInput. */\nexport type CompleteDelegateAgentInput = CompleteDelegateTokenInput;\n\nexport interface DelegateTokenResponse {\n mode: DelegationMode;\n tokenType: \"Bearer\";\n token: string;\n /** @deprecated Use token. */\n delegateAgentToken: string;\n /** @deprecated Use token. */\n delegationToken?: string;\n expiresIn: number;\n grantId: string;\n auditId: string;\n /**\n * @deprecated The delegation service does not return the granted scopes.\n * Read them from `qoni.genauth.introspectDelegationToken({ token }).data.scope`.\n */\n grantedScopes?: string[];\n}\n\nexport type DelegateTokenSilentResponse = DelegateTokenResponse & { mode: \"silent\" };\n\n/** @deprecated Use DelegateTokenResponse. */\nexport type DelegateAgentTokenResponse = DelegateTokenResponse;\n\n/** @deprecated Use DelegateTokenResponse. */\nexport type DelegationTokenResponse = DelegateTokenResponse;\n\nexport interface InteractiveDelegationResponse {\n mode: \"interactive\";\n authorizationUrl: string;\n grantId: string;\n grantState: string;\n state: string;\n requestedScopes?: string[];\n}\n\nexport type DelegateAgentResponse =\n | DelegateTokenResponse\n | InteractiveDelegationResponse;\n\nexport type DelegateTokenResult = DelegateAgentResponse;\n\nexport interface TokenInput {\n /** Delegation/runtime token to authorize the call with. */\n token?: string;\n}\n\nexport type RuntimeTokenInput = TokenInput;\n\nexport interface RawRequestInput extends TokenInput {\n method: QoniHttpMethod;\n path: string;\n query?: JsonObject;\n body?: JsonObject;\n headers?: Record<string, string>;\n}\n\nexport interface RequestPayload {\n signal?: AbortSignal;\n query?: JsonObject;\n body?: JsonObject | BodyInit;\n headers?: Record<string, string>;\n requiredScopes?: readonly string[];\n}\n\nexport interface QoniEvent<T = unknown> {\n id?: string;\n event?: string;\n data: T;\n}\n\nexport type QoniSSEEvent<T = unknown> = QoniEvent<T>;\n\nexport interface QoniTransport {\n qoniJson<T>(\n method: QoniHttpMethod,\n path: string,\n token?: string,\n payload?: RequestPayload,\n ): Promise<QoniResponse<T>>;\n genauthJson<T>(\n method: QoniHttpMethod,\n path: string,\n token?: string,\n payload?: RequestPayload,\n ): Promise<QoniResponse<T>>;\n gumemJson<T>(\n method: QoniHttpMethod,\n path: string,\n token?: string,\n payload?: RequestPayload,\n ): Promise<QoniResponse<T>>;\n gumemSSE<T>(\n path: string,\n token?: string,\n payload?: RequestPayload & { lastEventId?: string; signal?: AbortSignal },\n ): AsyncIterable<QoniEvent<T>>;\n webAgentJson<T>(\n method: QoniHttpMethod,\n path: string,\n token?: string,\n payload?: RequestPayload,\n ): Promise<QoniResponse<T>>;\n /** Binary GET — used for artifact content downloads. */\n webAgentBytes(\n path: string,\n token?: string,\n payload?: RequestPayload,\n ): Promise<{ bytes: Uint8Array; mime: string }>;\n webAgentSSE<T>(\n path: string,\n token?: string,\n payload?: RequestPayload & {\n lastEventId?: string;\n signal?: AbortSignal;\n onReconnect?: (info: { attempt: number; lastEventId?: string; error: unknown }) => void;\n },\n ): AsyncIterable<QoniEvent<T>>;\n}\n\nexport function isJsonObject(value: unknown): value is JsonObject {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n","import { isJsonObject, type JsonObject } from \"./types\";\n\n/**\n * Known `QoniError.code` values. The SDK assigns the `*.*` codes; the `eak.*`\n * codes are backend apiCodes surfaced verbatim. The trailing `(string & {})`\n * keeps `code` assignable from any string (the backend may add new codes)\n * while still giving literal autocomplete and letting you write an exhaustive\n * `switch (err.code)` over the known set.\n */\nexport type QoniErrorCode =\n | \"qoni_error\"\n | \"auth.failed\"\n | \"delegation.required\"\n | \"permission_denied\"\n | \"token.expired\"\n | \"validation.failed\"\n | \"rate_limit.exceeded\"\n | \"upstream.failed\"\n | \"timeout\"\n | \"not_found\"\n | \"conflict\"\n | \"eak.delegation.user_not_bound\"\n | \"eak.delegation.no_allowed_scopes\"\n | \"eak.delegation.scope_not_allowed\"\n | \"eak.genauth.userpool_binding_missing\"\n | \"eak.genauth.userpool_owner_missing\"\n | \"eak.genauth.no_bound_users\"\n | \"eak.token_exchange.upstream_failed\"\n // eslint-disable-next-line @typescript-eslint/ban-types\n | (string & {});\n\nexport interface QoniErrorOptions {\n code?: QoniErrorCode;\n status?: number;\n requestId?: string;\n traceId?: string;\n auditId?: string;\n retryable?: boolean;\n body?: unknown;\n cause?: unknown;\n}\n\nexport class QoniError extends Error {\n readonly code: QoniErrorCode;\n readonly status?: number;\n readonly requestId?: string;\n readonly traceId?: string;\n readonly auditId?: string;\n readonly retryable: boolean;\n readonly body?: unknown;\n\n constructor(message: string, options: QoniErrorOptions = {}) {\n super(message);\n this.name = \"QoniError\";\n this.code = options.code || \"qoni_error\";\n this.status = options.status;\n this.requestId = options.requestId;\n this.traceId = options.traceId;\n this.auditId = options.auditId;\n this.retryable = options.retryable ?? false;\n this.body = options.body;\n if (options.cause !== undefined) {\n (this as Error & { cause?: unknown }).cause = options.cause;\n }\n }\n}\n\nexport class QoniAuthError extends QoniError {\n constructor(message: string, options: QoniErrorOptions = {}) {\n super(message, { code: \"auth.failed\", ...options });\n this.name = \"QoniAuthError\";\n }\n}\n\nexport class QoniDelegationRequiredError extends QoniError {\n constructor(message: string, options: QoniErrorOptions = {}) {\n super(message, { code: \"delegation.required\", ...options });\n this.name = \"QoniDelegationRequiredError\";\n }\n}\n\nexport class QoniPermissionDeniedError extends QoniError {\n constructor(message: string, options: QoniErrorOptions = {}) {\n super(message, { code: \"permission_denied\", ...options });\n this.name = \"QoniPermissionDeniedError\";\n }\n}\n\nexport class QoniTokenExpiredError extends QoniError {\n constructor(message: string, options: QoniErrorOptions = {}) {\n super(message, { code: \"token.expired\", ...options });\n this.name = \"QoniTokenExpiredError\";\n }\n}\n\nexport class QoniValidationError extends QoniError {\n constructor(message: string, options: QoniErrorOptions = {}) {\n super(message, { code: \"validation.failed\", ...options });\n this.name = \"QoniValidationError\";\n }\n}\n\nexport class QoniRateLimitError extends QoniError {\n constructor(message: string, options: QoniErrorOptions = {}) {\n super(message, { code: \"rate_limit.exceeded\", retryable: true, ...options });\n this.name = \"QoniRateLimitError\";\n }\n}\n\nexport class QoniUpstreamError extends QoniError {\n constructor(message: string, options: QoniErrorOptions = {}) {\n super(message, { code: \"upstream.failed\", retryable: true, ...options });\n this.name = \"QoniUpstreamError\";\n }\n}\n\nexport class QoniTimeoutError extends QoniError {\n constructor(message: string, options: QoniErrorOptions = {}) {\n super(message, { code: \"timeout\", retryable: true, ...options });\n this.name = \"QoniTimeoutError\";\n }\n}\n\nexport function errorFromPayload(\n status: number,\n payload: unknown,\n fallbackMessage: string,\n): QoniError {\n const detail = isJsonObject(payload) ? payload.detail : undefined;\n const detailObject = isJsonObject(detail) ? detail : undefined;\n const source = detailObject || (isJsonObject(payload) ? payload : {});\n const code =\n stringField(source, \"code\") ||\n stringField(source, \"apiCode\") ||\n statusCodeToCode(status);\n const rawMessage =\n stringField(source, \"message\") ||\n stringField(source, \"detail\") ||\n fallbackMessage;\n const message = code === \"eak.delegation.no_allowed_scopes\"\n ? \"This AccessKey has no permission scopes. In Qoni Console, open its Permission scope settings, enable the policy needed for this call, then retry.\"\n : appendOnboardingHint(\n appendDeniedScopes(appendUpstreamDescription(rawMessage, source), source),\n code,\n );\n const options: QoniErrorOptions = {\n code,\n status,\n requestId: stringField(payload, \"requestId\") || stringField(source, \"requestId\"),\n traceId: stringField(payload, \"traceId\") || stringField(source, \"traceId\"),\n auditId: stringField(payload, \"auditId\") || stringField(source, \"auditId\"),\n retryable: status === 429 || status >= 500,\n body: payload,\n };\n\n if (isTokenExpired(code, message)) return new QoniTokenExpiredError(message, options);\n if (isDelegationRequired(code)) return new QoniDelegationRequiredError(message, options);\n if (status === 401) return new QoniAuthError(message, options);\n if (status === 403 || isPermissionDenied(code)) {\n return new QoniPermissionDeniedError(message, options);\n }\n if (status === 400 || status === 422) return new QoniValidationError(message, options);\n if (status === 429) return new QoniRateLimitError(message, options);\n if (status >= 500) return new QoniUpstreamError(message, options);\n return new QoniError(message, options);\n}\n\nexport function timeoutError(cause: unknown): QoniTimeoutError {\n return new QoniTimeoutError(\"Qoni request timed out\", { cause });\n}\n\nexport function networkError(cause: unknown): QoniUpstreamError {\n return new QoniUpstreamError(\"Qoni network request failed\", { cause });\n}\n\nfunction stringField(value: unknown, key: string): string | undefined {\n if (!isJsonObject(value)) return undefined;\n const field = (value as JsonObject)[key];\n return typeof field === \"string\" && field ? field : undefined;\n}\n\n// Surface denied/missing scopes inline so they aren't hidden behind a nested\n// `[Array]` in the error object — e.g. `scope_not_delegated` carries\n// `details.deniedScopes`. The caller sees exactly which scope to add.\nfunction appendDeniedScopes(message: string, source: unknown): string {\n const details = isJsonObject(source) ? source.details : undefined;\n const raw =\n (isJsonObject(details) ? details.deniedScopes : undefined) ??\n (isJsonObject(source) ? source.deniedScopes : undefined);\n if (!Array.isArray(raw) || raw.length === 0) return message;\n const scopes = raw.filter((s): s is string => typeof s === \"string\");\n if (scopes.length === 0 || message.includes(scopes[0])) return message;\n return `${message} (scopes not granted: ${scopes.join(\", \")})`;\n}\n\nfunction appendUpstreamDescription(message: string, source: unknown): string {\n const details = isJsonObject(source) ? source.details : undefined;\n const upstream = isJsonObject(details) ? details.upstream : undefined;\n const description =\n stringField(upstream, \"error_description\") ||\n stringField(upstream, \"message\") ||\n stringField(upstream, \"error\");\n if (!description || message.includes(description)) return message;\n return `${message}: ${description}`;\n}\n\n// Common first-run pitfalls get an actionable, one-line hint appended to the\n// error message so integrators aren't left guessing where to look.\nconst ONBOARDING_HINTS: Record<string, string> = {\n \"eak.delegation.user_not_bound\":\n \"Hint: the userId is not in the GenAuth userpool bound to this credential. \" +\n \"Resolve a real user with qoni.resolveAnyBoundUser() (demo/smoke) or qoni.currentUser({ accessToken }).\",\n \"eak.genauth.userpool_binding_missing\":\n \"Hint: bind the Qoni credential to a GenAuth userpool before calling genauth.users.*.\",\n \"eak.delegation.scope_not_allowed\":\n \"Hint: enable the denied scopes in this AccessKey's Permission scope settings in Qoni Console.\",\n};\n\nfunction appendOnboardingHint(message: string, code: string): string {\n const hint = ONBOARDING_HINTS[code];\n if (!hint || message.includes(hint)) return message;\n return `${message} ${hint}`;\n}\n\nfunction statusCodeToCode(status: number): string {\n if (status === 401) return \"auth.failed\";\n if (status === 403) return \"permission_denied\";\n if (status === 404) return \"not_found\";\n if (status === 409) return \"conflict\";\n if (status === 422) return \"validation.failed\";\n if (status === 429) return \"rate_limit.exceeded\";\n if (status >= 500) return \"upstream.failed\";\n return \"qoni_error\";\n}\n\nfunction isPermissionDenied(code: string): boolean {\n return code.includes(\"permission\") || code.includes(\"insufficient_scope\");\n}\n\nfunction isDelegationRequired(code: string): boolean {\n return code.includes(\"interactive_required\") || code.includes(\"delegation.required\");\n}\n\nfunction isTokenExpired(code: string, message: string): boolean {\n return code.includes(\"expired\") || /token expired/i.test(message);\n}\n","import { normalizeInteraction, type Interaction } from \"./interactions\";\nimport { isJsonObject, type QoniEvent, type JsonObject } from \"./types\";\n\n/**\n * Semantic run events — the public event surface for doAnything / webSearch /\n * deepResearch run handles and Track monitor handles. Wire envelopes\n * (`{ type, task_id, session_id, occurred_at, data }`, snake_case payloads,\n * data-URI screenshots) are normalized here; the original wire event stays\n * reachable on `event.raw`.\n */\n/**\n * `QoniEventTypes` — the complete set of `event.type` values, as named\n * constants. This is THE thing a developer matches on. Import it for\n * autocomplete + typo-safety instead of hand-typing strings:\n *\n * import { QoniEventTypes } from \"@qoniai/qoni\";\n * for await (const event of run.events()) {\n * switch (event.type) {\n * case QoniEventTypes.Results: …\n * case QoniEventTypes.Done: …\n * }\n * }\n *\n * The raw wire types (supervisor orchestration, sub-agent execution, protocol\n * markers) are internal: all that churn folds into `QoniEventTypes.Progress`,\n * and only the handful a developer reacts to get a distinct value. The exact\n * wire string is on `event.raw.event` if ever needed.\n */\nexport const QoniEventTypes = {\n // --- Core (any product run can emit these) ---\n /** The agent is working — folds ALL internal steps (actions, plan/subtask, sections, telemetry, take-control, …); `event.data` is a best-effort human-readable line (string). */\n Progress: \"progress\",\n /** The agent produced a user-facing chat message. */\n Message: \"message\",\n /** HITL — a typed interaction needs the user (login / clarification / confirmation / take-control / wait); `event.data` is the full {@link Interaction} object. Act on it via the action methods (`run.interactionHandle(event.data).answer(…)` etc). */\n Interaction: \"interaction\",\n /** A live screenshot frame (opt in with `capture: { screenshots: true }`); image on `event.image`. */\n Screenshot: \"screenshot\",\n /** The browser viewer moved to a new page or needs a fresh attachment. Use `event.data.liveUrl` for the live preview. */\n BrowserLiveUrlChanged: \"browserLiveUrlChanged\",\n /** Terminal — the run finished; outcome + output in `event.data` (cost is on the `RunResult`). */\n Done: \"done\",\n // --- Web Search ---\n /** Web Search results are ready; `event.data` is the count (the list is in `done.output`). */\n ResultsReady: \"resultsReady\",\n // --- Deep Research ---\n /** Deep Research coarse phase changed (brief → gather → synthesize …). */\n Phase: \"phase\",\n /** A Deep Research outline section was completed (stream sections as they finish). */\n SectionReady: \"sectionReady\",\n // --- Track (monitor) ---\n /** A Track monitor was created (e.g. Do Anything handed a recurring request to Track). */\n MonitorCreated: \"monitorCreated\",\n /** A monitor detected a change worth acting on (the Track signal you react to). */\n Triggered: \"triggered\",\n /** A monitor's scheduled check finished (`event.data` is whether it found a change). */\n CheckCompleted: \"checkCompleted\",\n} as const;\n\n/** Every `event.type` value. Derived from {@link QoniEventTypes} — the single source. */\nexport type QoniEventType = (typeof QoniEventTypes)[keyof typeof QoniEventTypes];\n\n/**\n * Categories WIRE_TO_SEMANTIC maps to. Excludes the out-of-band cases the\n * normalizer shapes directly (screenshot / done / interaction / browser live\n * URL change) — those don't\n * go through the generic `shapeData`.\n */\nexport type RunProgressType = Exclude<QoniEventType, \"screenshot\" | \"done\" | \"interaction\" | \"browserLiveUrlChanged\">;\n\n/** A decoded screenshot frame. `bytes` are the raw image bytes. */\nexport interface RunImage {\n bytes: Uint8Array;\n mime: string;\n pageUrl?: string;\n step?: number;\n}\n\ninterface RunEventBase {\n /** The run this event belongs to. */\n runId: string;\n /** ISO 8601 timestamp of when the event occurred. */\n at: string;\n /** The original wire event (escape hatch — shape may evolve with the API). */\n raw: QoniEvent<unknown>;\n}\n\n// `event.data` shape per `event.type`. Simple events: `event.data` IS the value\n// (a string / number / boolean) — no field name to remember, `console.log(event.data)`\n// prints it directly. Rich events: `event.data` is a small object with\n// human-named fields. The full raw wire payload is always on `event.raw`.\n\n/** `message` — an assistant/user chat message. */\nexport interface RunMessageData { text: string; role: string }\n/** `screenshot` — page metadata; the decoded image is on `event.image`. */\nexport interface RunScreenshotData { pageUrl?: string; step?: number }\n/** `browserLiveUrlChanged` — the provider's live viewer URL can rotate as tabs change. */\nexport interface RunBrowserLiveUrlChangedData {\n liveUrl: string;\n supportsLivePump: boolean;\n forceViewerReload: boolean;\n providerSessionId?: string;\n}\n/** `done` — terminal outcome + final output. (Total cost is on the `RunResult`.) */\nexport interface RunDoneData { output?: unknown; succeeded: boolean | null; terminalReason: string }\n\nexport type RunEvent =\n // Core — any product run.\n // `progress` — `event.data` is a human-readable line (string; may be \"\").\n | (RunEventBase & { type: \"progress\"; data: string; isTerminal: false })\n | (RunEventBase & { type: \"message\"; data: RunMessageData; isTerminal: false })\n | (RunEventBase & { type: \"interaction\"; data: Interaction; isTerminal: false })\n | (RunEventBase & { type: \"screenshot\"; data: RunScreenshotData; image: RunImage; isTerminal: false })\n | (RunEventBase & { type: \"browserLiveUrlChanged\"; data: RunBrowserLiveUrlChangedData; isTerminal: false })\n | (RunEventBase & { type: \"done\"; data: RunDoneData; isTerminal: true })\n // Web Search — `event.data` is the count of unique results (number).\n | (RunEventBase & { type: \"resultsReady\"; data: number; isTerminal: false })\n // Deep Research — `event.data` is the phase name / section title (string).\n | (RunEventBase & { type: \"phase\"; data: string; isTerminal: false })\n | (RunEventBase & { type: \"sectionReady\"; data: string; isTerminal: false })\n // Track (monitor) — monitorId / change-summary (string), or \"changed\" (boolean).\n | (RunEventBase & { type: \"monitorCreated\"; data: string; isTerminal: false })\n | (RunEventBase & { type: \"triggered\"; data: string; isTerminal: false })\n | (RunEventBase & { type: \"checkCompleted\"; data: boolean; isTerminal: false });\n\n// ---------------------------------------------------------------------------\n// Per-product event types (分型). Each product's handle is typed to ONLY the\n// events that product emits, so `switch (event.type)` autocompletes just those\n// and a wrong-product case is a compile error. The runtime is the same\n// normalizer; these narrow the public surface per product.\n// ---------------------------------------------------------------------------\n\n/** Events any product run can emit. */\nexport type CoreRunEvent = Extract<\n RunEvent,\n { type: \"progress\" | \"message\" | \"interaction\" | \"screenshot\" | \"browserLiveUrlChanged\" | \"done\" }\n>;\n/** Do Anything — core events only. */\nexport type DoAnythingEvent = CoreRunEvent;\n/** Web Search — core + `resultsReady`. */\nexport type WebSearchEvent = CoreRunEvent | Extract<RunEvent, { type: \"resultsReady\" }>;\n/** Deep Research — core + `phase` / `sectionReady`. */\nexport type DeepResearchEvent =\n | CoreRunEvent\n | Extract<RunEvent, { type: \"phase\" | \"sectionReady\" }>;\n/** Track monitor — core + `monitorCreated` / `triggered` / `checkCompleted`. */\nexport type MonitorEvent =\n | CoreRunEvent\n | Extract<RunEvent, { type: \"monitorCreated\" | \"triggered\" | \"checkCompleted\" }>;\n\nexport function isTerminalRunStatus(status: unknown): boolean {\n return status === \"succeeded\" || status === \"failed\" || status === \"canceled\";\n}\n\n/** Convert a snake_case key to camelCase. Keys without underscores pass through. */\nfunction camelKey(key: string): string {\n return key.replace(/_([a-z0-9])/g, (_, ch: string) => ch.toUpperCase());\n}\n\n/**\n * Recursively camelCase the keys of a wire payload. Values are untouched;\n * arrays are mapped element-wise.\n */\nexport function camelizeKeys(value: unknown): unknown {\n if (Array.isArray(value)) return value.map(camelizeKeys);\n if (!isJsonObject(value)) return value;\n const out: JsonObject = {};\n for (const [key, item] of Object.entries(value)) {\n out[camelKey(key)] = camelizeKeys(item);\n }\n return out;\n}\n\nexport function camelizeRecord(value: unknown): JsonObject {\n const out = camelizeKeys(value);\n return isJsonObject(out) ? out : {};\n}\n\n/** Decode a `data:` URI into bytes + mime. Returns undefined for non-data URLs. */\nexport function decodeDataUri(uri: string): { bytes: Uint8Array; mime: string } | undefined {\n const match = /^data:([^;,]*)?(;base64)?,(.*)$/s.exec(uri);\n if (!match) return undefined;\n const [, mime, isBase64, body] = match;\n const encoded = isBase64 ? body.replace(/\\s/g, \"\") : body;\n if (isBase64 && (\n !/^[A-Za-z0-9+/_-]+={0,2}$/.test(encoded) ||\n encoded.length % 4 === 1 ||\n (encoded.includes(\"=\") && encoded.length % 4 !== 0)\n )) return undefined;\n try {\n const bytes = isBase64\n ? new Uint8Array(Buffer.from(encoded, \"base64\"))\n : new TextEncoder().encode(decodeURIComponent(encoded));\n return bytes.length ? { bytes, mime: mime || \"application/octet-stream\" } : undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction asString(value: unknown): string | undefined {\n return typeof value === \"string\" && value ? value : undefined;\n}\n\nfunction asNumber(value: unknown): number | undefined {\n return typeof value === \"number\" && Number.isFinite(value) ? value : undefined;\n}\n\nfunction decodeScreenshotImage(payload: JsonObject): RunImage | undefined {\n const url = asString(payload.screenshot_url);\n if (!url) return undefined;\n const decoded = decodeDataUri(url);\n if (!decoded) return undefined;\n return {\n ...decoded,\n pageUrl: asString(payload.page_url) ?? asString(payload.url),\n step: asNumber(payload.step) ?? asNumber(payload.step_index),\n };\n}\n\n// Wire types handled out-of-band by the normalizer (not in the table below):\n// stream.heartbeat → null (transport keep-alive, no run event)\n// run.screenshot → \"screenshot\" (or \"progress\" if the image won't decode)\n// run.completed → \"done\" (terminal; sub-runs demote to progress)\n// run.interaction → \"interaction\" (carries the typed Interaction object)\nconst HEARTBEAT = \"stream.heartbeat\";\nconst SCREENSHOT = \"run.screenshot\";\nconst TERMINAL = \"run.completed\";\nconst INTERACTION = \"run.interaction\";\n\n/**\n * Explicit wire-type → curated `event.type` map. Most wire types are internal\n * supervisor orchestration or sub-agent execution detail and deliberately fold\n * into `progress` — that's the product-level \"the agent is working\" signal.\n * Only the handful a developer reacts to get a distinct category. The mapping\n * is EXPLICIT for every catalog entry (coverage-tested in\n * tests/event-catalog.test.ts) so adding a backend event forces a deliberate\n * \"headline or progress?\" decision rather than a silent default. A wire type\n * NOT in the catalog (an unsynced backend addition) still degrades to\n * \"progress\" at runtime so a new server event never breaks a consumer's stream.\n */\nexport const WIRE_TO_SEMANTIC: Readonly<Record<string, RunProgressType>> = {\n // --- Headline events a developer reacts to ---\n \"run.message\": \"message\",\n \"search.results_ready\": \"resultsReady\",\n \"run.phase_changed\": \"phase\", // Deep Research coarse phase\n \"run.section_completed\": \"sectionReady\", // Deep Research section finished\n \"run.monitor_created\": \"monitorCreated\", // Do Anything → Track handoff\n // NB: `run.interaction` is NOT here — it's an out-of-band case in the\n // normalizer (→ \"interaction\", carrying the typed Interaction object), like\n // screenshot/done. The old `run.input_request` / `run.take_control_*` family\n // it replaces is being removed backend-side; while the backend still lists\n // them in the catalog (dual-emit window) they fold to progress below — the\n // SDK no longer has an `inputRequired` surface (clean break).\n\n // --- Internal churn → progress (raw type stays on event.raw.event) ---\n // supervisor lifecycle / planning\n \"run.status_changed\": \"progress\",\n \"run.input_request\": \"progress\", // superseded by run.interaction\n \"run.input_request_resolved\": \"progress\",\n \"run.cost_update\": \"progress\", // cost is surfaced on RunResult, not as an event\n \"run.plan_ready\": \"progress\",\n \"run.plan_finalized\": \"progress\",\n \"run.subtask_started\": \"progress\",\n \"run.subtask_graded\": \"progress\",\n \"run.subtask_status\": \"progress\",\n \"run.todos_updated\": \"progress\",\n // sub-agent execution (actions + browser-agent telemetry)\n \"run.action.started\": \"progress\",\n \"run.action.completed\": \"progress\",\n \"run.action.failed\": \"progress\",\n \"run.action.progress\": \"progress\",\n \"run.action_result\": \"progress\",\n \"run.browser_agent.config_applied\": \"progress\",\n \"run.browser_agent.summary\": \"progress\",\n \"run.browser_agent.vision_decision\": \"progress\",\n \"run.browser_agent.observe\": \"progress\",\n \"run.browser_agent.page_gate\": \"progress\",\n // web search / deep research intermediate progress\n \"search.progress\": \"progress\",\n \"search.summarize_progress\": \"progress\",\n \"search.done\": \"progress\", // run ends on run.completed → \"done\"\n \"run.section_started\": \"progress\",\n \"run.section_failed\": \"progress\",\n \"run.replan_started\": \"progress\",\n \"run.crosscheck_done\": \"progress\",\n \"run.synthesize_progress\": \"progress\",\n // take-control / recording / live-url protocol\n \"run.take_control_pending\": \"progress\",\n \"run.take_control_expired\": \"progress\",\n \"run.user_paused\": \"progress\",\n \"run.user_released\": \"progress\",\n \"run.recording_started\": \"progress\",\n \"run.recording_paused\": \"progress\",\n \"run.recording_finalized\": \"progress\",\n // side-channel\n \"run.feedback_submitted\": \"progress\",\n};\n\n// Track monitor stream uses its own wire vocabulary (NOT the run-event catalog).\n// Handled out-of-band in the normalizer → curated Track event types.\nconst MONITOR_TRIGGERED = \"monitor.triggered\";\nconst MONITOR_LIFECYCLE = \"monitor.lifecycle_changed\";\n\n/** Best-effort human-readable line for a `progress` event (may be \"\"). */\nfunction pickNote(c: JsonObject): string {\n return (\n asString(c.note) ??\n asString(c.summary) ??\n asString(c.lastStepSummary) ??\n asString(c.label) ??\n asString(c.text) ??\n asString(c.kind) ?? // action events: \"click\" / \"input\" / \"navigate\" / …\n asString(c.toPhase) ??\n asString(c.status) ??\n asString(c.to) ??\n asString(c.reason) ??\n \"\"\n );\n}\n\n/**\n * Reshape the camelized wire payload into the fixed per-`event.type` data. This\n * is the whole point of the curated surface: once a consumer matches\n * `event.type`, `event.data` has a known shape. Caller wraps the result with\n * runId / at / raw / isTerminal.\n */\nfunction shapeData(type: RunProgressType, c: JsonObject): RunEvent[\"data\"] {\n switch (type) {\n // Simple events: event.data IS the value.\n case \"progress\":\n return pickNote(c); // a human-readable line (string)\n case \"resultsReady\":\n return asNumber(c.totalUniqueResults) ?? asNumber(c.count) ?? 0; // count\n case \"phase\":\n return asString(c.toPhase) ?? asString(c.phase) ?? \"\"; // phase name\n case \"sectionReady\":\n return asString(c.title) ?? asString(c.sectionTitle) ?? \"\"; // section title\n case \"monitorCreated\":\n return asString(c.monitorId) ?? \"\"; // monitor id\n case \"triggered\":\n return asString(c.summary) ?? asString(c.note) ?? \"\"; // change summary\n case \"checkCompleted\":\n return c.changed === true; // whether a change was found\n // Rich events: event.data is a small object.\n case \"message\":\n return { text: asString(c.text) ?? \"\", role: asString(c.role) ?? \"\" };\n }\n}\n\nexport interface NormalizeRunEventOptions {\n /**\n * The id of the run the stream was opened for. Terminal events of OTHER\n * runs on the same stream (internal sub-runs on a doAnything session) are\n * demoted to `progress` so they never end the caller's iterator. Pass\n * undefined for streams without a single top-level run (Track monitors).\n */\n topRunId?: string;\n}\n\n/**\n * Normalize one wire SSE event into a semantic `RunEvent`.\n *\n * Returns null for frames that carry no run event (heartbeats / comments).\n * The wire type → semantic `type` mapping is explicit (WIRE_TO_SEMANTIC, plus\n * the three out-of-band cases handled here); the original wire event stays on\n * `event.raw` so you can match `event.raw.event` against `QoniEventTypes`.\n */\nexport function normalizeRunEvent(\n wire: QoniEvent<unknown>,\n options: NormalizeRunEventOptions = {},\n): RunEvent | null {\n const envelope = isJsonObject(wire.data) ? wire.data : undefined;\n const wireType = wire.event ?? asString(envelope?.type);\n if (!wireType) return null;\n // Heartbeats are a transport keep-alive, not a run event.\n if (wireType === HEARTBEAT) return null;\n\n const payload = isJsonObject(envelope?.data) ? (envelope.data as JsonObject) : {};\n const taskId = asString(envelope?.task_id);\n const runId = taskId ?? options.topRunId ?? \"\";\n const at =\n asString(envelope?.occurred_at) ??\n asString(payload.occurred_at) ??\n asString(payload.timestamp) ??\n new Date().toISOString();\n const c = camelizeRecord(payload);\n const base = { runId, at, raw: wire };\n const isSubRun = Boolean(options.topRunId && taskId && taskId !== options.topRunId);\n\n if (wireType === SCREENSHOT) {\n const image = decodeScreenshotImage(payload);\n // A screenshot whose image couldn't be inlined (storage hiccup) degrades to\n // progress below — the `screenshot` type guarantees `image`.\n if (image) {\n const sData: RunScreenshotData = {};\n const pageUrl = asString(c.pageUrl) ?? asString(c.url);\n const step = asNumber(c.step) ?? asNumber(c.stepIndex);\n if (pageUrl !== undefined) sData.pageUrl = pageUrl;\n if (step !== undefined) sData.step = step;\n return { ...base, type: \"screenshot\", data: sData, image, isTerminal: false };\n }\n }\n\n if (wireType === \"run.browser_live_url_changed\") {\n const liveUrl = asString(c.liveUrl);\n // A malformed URL-change frame is still available to onWireEvent, but it\n // must not tell a viewer to navigate to an empty URL.\n if (!liveUrl) return null;\n const data: RunBrowserLiveUrlChangedData = {\n liveUrl,\n supportsLivePump: c.supportsLivePump === true,\n forceViewerReload: c.forceViewerReload === true,\n };\n const providerSessionId = asString(c.providerSessionId);\n if (providerSessionId) data.providerSessionId = providerSessionId;\n return { ...base, type: \"browserLiveUrlChanged\", data, isTerminal: false };\n }\n\n // Typed interaction lifecycle (axis B): the whole Interaction object rides\n // in the payload; normalizeInteraction camelizes + narrows it. A payload\n // without a recognized `type` degrades to progress below.\n if (wireType === INTERACTION) {\n const interaction = normalizeInteraction(payload);\n if (interaction) {\n return { ...base, type: \"interaction\", data: interaction, isTerminal: false };\n }\n }\n\n // Single terminal event (sub-run terminals fall through to \"progress\" so they\n // never end the top-level stream).\n if (wireType === TERMINAL && !isSubRun) {\n const dData: RunDoneData = {\n output: c.output,\n succeeded: typeof c.isTaskSuccessful === \"boolean\" ? c.isTaskSuccessful : null,\n terminalReason: asString(c.terminalReason) ?? \"\",\n };\n return { ...base, type: \"done\", data: dData, isTerminal: true };\n }\n\n // Resolve the curated type, then shape `data` to match it. Monitor-stream\n // wire types are their own vocabulary (not the run catalog); everything else\n // comes from WIRE_TO_SEMANTIC, with an unsynced backend addition degrading to\n // \"progress\" (fail-safe). The cast is safe: shapeData returns the data shape\n // that pairs with `type`, but TS can't narrow a dynamically-resolved type.\n let type: RunProgressType;\n if (wireType === MONITOR_TRIGGERED) type = \"triggered\";\n else if (wireType === MONITOR_LIFECYCLE) type = \"checkCompleted\";\n else type = WIRE_TO_SEMANTIC[wireType] ?? \"progress\";\n\n const data = shapeData(type, c);\n // Drop empty `progress` — these are pure internal telemetry (per-step\n // browser-agent observe / page_gate, etc.) that carry no human-readable line,\n // so they'd surface as a content-less tick. Real progress (a note, an action\n // kind, a status) still comes through.\n if (type === \"progress\" && data === \"\") return null;\n\n return { ...base, type, data, isTerminal: false } as RunEvent;\n}\n","// AUTO-GENERATED — do not edit by hand.\n// Source: src/generated/event-catalog.json (vendored from the backend's\n// domain.event.types, catalog v2). Regenerate with `pnpm gen:event-types`\n// after re-syncing the catalog. Drift is guarded by tests/event-catalog.test.ts\n// (SDK side) and the webagent-e2e contract suite (vs the live backend enums).\n//\n// These are the interaction discriminators (run.interaction): the `type`,\n// `status`, and action `kind` enums. The curated Interaction surface\n// (src/interactions.ts) builds its typed union on top of these.\n\n/**\n * The interaction `type` discriminator — the single field a consumer\n * switches on to pick a card / typed handle.\n */\nexport const InteractionTypes = {\n SiteLogin: \"site_login\",\n Clarification: \"clarification\",\n Confirmation: \"confirmation\",\n TakeControl: \"take_control\",\n Wait: \"wait\",\n} as const;\n\nexport type InteractionType = (typeof InteractionTypes)[keyof typeof InteractionTypes];\n\n/** Flat, ordered list of every InteractionType wire value — used by drift tests. */\nexport const INTERACTION_TYPE_VALUES: readonly InteractionType[] =\n Object.values(InteractionTypes);\n\n/**\n * Interaction lifecycle status (backend-authoritative):\n * pending → active → resolved | expired | canceled.\n */\nexport const InteractionStatuses = {\n Pending: \"pending\",\n Active: \"active\",\n Resolved: \"resolved\",\n Expired: \"expired\",\n Canceled: \"canceled\",\n} as const;\n\nexport type InteractionStatus = (typeof InteractionStatuses)[keyof typeof InteractionStatuses];\n\n/** Flat, ordered list of every InteractionStatus wire value — used by drift tests. */\nexport const INTERACTION_STATUS_VALUES: readonly InteractionStatus[] =\n Object.values(InteractionStatuses);\n\n/**\n * Action-contract kinds — what a consumer can do to an interaction.\n * Each maps to a typed method on InteractionHandle.\n */\nexport const ActionKinds = {\n answer: \"answer\",\n skip: \"skip\",\n confirm: \"confirm\",\n reject: \"reject\",\n openLogin: \"open_login\",\n confirmSignedIn: \"confirm_signed_in\",\n connectControl: \"connect_control\",\n refreshControl: \"refresh_control\",\n releaseControl: \"release_control\",\n retry: \"retry\",\n switchProfile: \"switch_profile\",\n} as const;\n\nexport type ActionKind = (typeof ActionKinds)[keyof typeof ActionKinds];\n\n/** Flat, ordered list of every ActionKind wire value — used by drift tests. */\nexport const ACTION_KIND_VALUES: readonly ActionKind[] =\n Object.values(ActionKinds);\n","export const QoniScopes = {\n GUMEM_SESSION_CREATE: \"gumem.session:create\",\n GUMEM_MESSAGE_WRITE: \"gumem.message:write\",\n GUMEM_MEMORY_READ: \"gumem.memory:read\",\n GUMEM_MEMORY_WRITE: \"gumem.memory:write\",\n GUMEM_MEMORY_DELETE: \"gumem.memory:delete\",\n GUMEM_SEARCH_RUN: \"gumem.search:run\",\n GUMEM_ADMIN_MANAGE: \"gumem.admin:manage\",\n GUMEM_RESOURCE_WRITE: \"gumem.resource:write\",\n GUMEM_ACTION_WRITE: \"gumem.action:write\",\n GUMEM_ACTION_READ: \"gumem.action:read\",\n GUMEM_PROFILE_READ: \"gumem.profile:read\",\n\n // WebAgent products: exactly two verbs per product — `read` (observe) and\n // `manage` (anything that changes execution state). See\n // wa/docs/qoni-sdk-public-surface.md §3.\n DO_ANYTHING_READ: \"webagent.do_anything:read\",\n DO_ANYTHING_MANAGE: \"webagent.do_anything:manage\",\n WEB_SEARCH_READ: \"webagent.web_search:read\",\n WEB_SEARCH_MANAGE: \"webagent.web_search:manage\",\n DEEP_RESEARCH_READ: \"webagent.deep_research:read\",\n DEEP_RESEARCH_MANAGE: \"webagent.deep_research:manage\",\n TRACK_READ: \"webagent.track:read\",\n TRACK_MANAGE: \"webagent.track:manage\",\n\n // Interactive site login (`InteractionHandle.openLogin()` on a `site_login`\n // interaction). Not part of any product bundle: the AccessKey policy must\n // allow it, and the delegation must request it explicitly.\n SITE_LOGIN_REQUEST: \"webagent.site_login:request\",\n // Persist that login into the browser profile (`InteractionHandle.confirmSignedIn()`\n // after `openLogin()`).\n SITE_LOGIN_CONFIRM: \"webagent.site_login:confirm\",\n\n // The delegating user's own data and the Agent's own mailbox (Personal\n // Agent guide). Not part of any product bundle: request them explicitly;\n // the AccessKey policy must allow them.\n // Read the user's Profile (name, phone, shipping address, card brand + last 4).\n USER_PROFILE_READ: \"user.profile:read\",\n // Write answers back into the user's Profile.\n USER_PROFILE_WRITE: \"user.profile:write\",\n // Use the user's saved payment card once the user approves a payment.\n USER_PAYMENT_USE: \"user.payment:use\",\n // Read mail received by the Agent's own mailbox (for example verification codes).\n AGENT_MAIL_READ: \"agent.mail:read\",\n // Send mail from the Agent's own mailbox.\n AGENT_MAIL_SEND: \"agent.mail:send\",\n} as const;\n\nexport type QoniScope = (typeof QoniScopes)[keyof typeof QoniScopes];\n\n/** Product names accepted by `delegateToken({ products })`. */\nexport type QoniProduct = \"doAnything\" | \"webSearch\" | \"deepResearch\" | \"track\";\n\n/**\n * Scope sets granted by the `delegateToken({ products })` sugar — each\n * product expands to its full verb pair: `read` + `manage`.\n */\nexport const QoniProductScopes: Record<QoniProduct, readonly QoniScope[]> = {\n doAnything: [\n QoniScopes.DO_ANYTHING_READ,\n QoniScopes.DO_ANYTHING_MANAGE,\n ],\n webSearch: [\n QoniScopes.WEB_SEARCH_READ,\n QoniScopes.WEB_SEARCH_MANAGE,\n ],\n deepResearch: [\n QoniScopes.DEEP_RESEARCH_READ,\n QoniScopes.DEEP_RESEARCH_MANAGE,\n ],\n track: [\n QoniScopes.TRACK_READ,\n QoniScopes.TRACK_MANAGE,\n ],\n} as const;\n\n/** Every scope string the SDK knows about (gumem + webagent + user + agent). */\nexport const KNOWN_SCOPES: readonly string[] = Object.values(QoniScopes);\n\nexport const QoniScopeBundles = {\n GUMEM_READONLY: [QoniScopes.GUMEM_MEMORY_READ, QoniScopes.GUMEM_PROFILE_READ],\n GUMEM_SESSION_RECALL: [\n QoniScopes.GUMEM_MEMORY_READ,\n QoniScopes.GUMEM_MEMORY_WRITE,\n QoniScopes.GUMEM_MESSAGE_WRITE,\n ],\n GUMEM_WRITE: [\n QoniScopes.GUMEM_SESSION_CREATE,\n QoniScopes.GUMEM_MESSAGE_WRITE,\n QoniScopes.GUMEM_ACTION_WRITE,\n ],\n // One bundle per WebAgent product = [read, manage].\n DO_ANYTHING: [\n QoniScopes.DO_ANYTHING_READ,\n QoniScopes.DO_ANYTHING_MANAGE,\n ],\n WEB_SEARCH: [\n QoniScopes.WEB_SEARCH_READ,\n QoniScopes.WEB_SEARCH_MANAGE,\n ],\n DEEP_RESEARCH: [\n QoniScopes.DEEP_RESEARCH_READ,\n QoniScopes.DEEP_RESEARCH_MANAGE,\n ],\n TRACK: [\n QoniScopes.TRACK_READ,\n QoniScopes.TRACK_MANAGE,\n ],\n} as const;\n","import { QoniError, QoniValidationError } from \"./errors\";\nimport { camelizeRecord } from \"./run-events\";\nimport {\n ActionKinds,\n type ActionKind,\n type InteractionStatus,\n} from \"./generated/interaction-types\";\nimport { QoniScopes } from \"./scopes\";\nimport { isJsonObject, type JsonObject } from \"./types\";\n\n/**\n * Curated interaction surface (axis B of the interaction model, see\n * webagentbackend/docs/qoni-interaction-model.md §2.3). A single wire event\n * `run.interaction` carries the complete, typed object across its whole\n * lifecycle (created / updated / resolved), discriminated by `type` and driven\n * by a backend-authoritative `status`. This replaces the old `run.input_request`\n * + `run.take_control_*` family — consumers no longer rebuild a state machine\n * from an event sequence.\n *\n * Wire is snake_case; this layer is camelCase. The `actions[]` contract carries\n * each action's endpoint, so the typed methods on {@link InteractionHandle}\n * post to the right route without the consumer hard-coding any path — and a\n * button/method only exists when the backend declared the action (structurally\n * closing off \"dead recovery affordances\").\n */\n\n/**\n * The interaction types a consumer handles. DoAnything asks for the user in\n * five abstract ways — by what the user has to do, never by business — plus\n * the system `wait`:\n *\n * - `site_login`: sign in to a site in the live browser.\n * - `take_control`: operate the browser by hand (captcha, 2FA, …).\n * - `ask_user`: answer a question, shaped by `answerType` / `options`.\n * - `confirmation`: allow or reject an action.\n * - `wait`: the system is waiting (rate limit, external event); no decision.\n *\n * The wire may still say `clarification`; the SDK presents it as `ask_user`.\n */\nexport const InteractionTypes = {\n SiteLogin: \"site_login\",\n TakeControl: \"take_control\",\n AskUser: \"ask_user\",\n Confirmation: \"confirmation\",\n Wait: \"wait\",\n /** @deprecated `clarification` is presented as `ask_user`; use `InteractionTypes.AskUser`. */\n Clarification: \"ask_user\",\n} as const;\n\nexport type InteractionType = \"site_login\" | \"take_control\" | \"ask_user\" | \"confirmation\" | \"wait\";\n\n/** A declared action a consumer can take on an interaction. */\nexport interface Action {\n /** What this action does — maps to a typed method on {@link InteractionHandle}. */\n kind: ActionKind;\n /** Human-readable button label. */\n label: string;\n /** HTTP method to invoke the endpoint with (defaults to POST on the wire). */\n method: string;\n /** Endpoint to invoke (run-relative path); the consumer never hard-codes it. */\n endpoint: string;\n /** JSON schema for the action's input body, when the action needs one. */\n inputSchema?: JsonObject | null;\n}\n\n/** Optional evidence image attached to an interaction. */\nexport interface InteractionEvidence {\n artifactId: string;\n}\n\n// ---- type-specific payloads -----------------------------------------------\n\n/** A site the agent needs the user to sign in to (`site_login`). */\nexport interface InteractionSite {\n siteId: string;\n displayName: string;\n loginUrl: string;\n}\n\nexport interface SiteLoginPayload {\n sites: InteractionSite[];\n /** Set when the login is for a Track monitor (monitor.needs_login reuse). */\n monitorId?: string;\n}\n\n/** How an `ask_user` answer is shaped; decides which control the app renders. */\nexport type AskUserAnswerType = \"text\" | \"number\" | \"boolean\" | \"single_choice\" | \"multiple_choice\";\n\nexport interface AskUserOption {\n /** What `answer()` submits. */\n value: string;\n /** What the user sees. */\n label: string;\n}\n\nexport interface AskUserPayload {\n /** The question to show the user. */\n question: string;\n /** `text` → string, `number` → number, `boolean` → boolean, `single_choice` → one option value, `multiple_choice` → option values. */\n answerType: AskUserAnswerType;\n /** Candidates for `single_choice` / `multiple_choice`. */\n options?: AskUserOption[];\n}\n\n/** An `ask_user` answer; its type follows the payload's `answerType`. */\nexport type AskUserAnswer = string | number | boolean | string[];\n\n/** @deprecated `clarification` is presented as `ask_user`; use {@link AskUserPayload}. */\nexport type ClarificationPayload = AskUserPayload;\n\nexport interface ConfirmationPayload {\n summary: string;\n}\n\nexport interface TakeControlPayload {\n liveUrl: string;\n surface?: string;\n reason?: string;\n}\n\nexport type WaitKind = \"rate_limit\" | \"external\" | \"sleep\";\n\nexport interface WaitPayload {\n waitKind: WaitKind;\n /** ISO 8601 — when the wait is expected to end. */\n until?: string;\n retryable?: boolean;\n}\n\n/** Maps each interaction `type` to its narrowed payload shape. */\nexport interface InteractionPayloadByType {\n site_login: SiteLoginPayload;\n take_control: TakeControlPayload;\n ask_user: AskUserPayload;\n confirmation: ConfirmationPayload;\n wait: WaitPayload;\n}\n\n/** Fields every interaction carries, whatever its type. */\nexport interface InteractionBase {\n /** Stable identity across the interaction's lifecycle. */\n id: string;\n /** Backend-authoritative lifecycle status. */\n status: InteractionStatus;\n createdAt: string;\n resolvedAt?: string | null;\n expiresAt?: string | null;\n /** Human-readable title (e.g. \"Agent needs you to sign in\"). */\n title: string;\n /** Detail / question text. */\n prompt?: string | null;\n /** Optional evidence image. */\n evidence?: InteractionEvidence | null;\n /** Declared actions — drives the typed methods + UI buttons. */\n actions: Action[];\n}\n\n/**\n * A typed interaction object, distributed over `type`: the bare `Interaction`\n * is a union, so `switch (interaction.type)` narrows `payload` in each branch.\n * `Interaction<\"site_login\">` picks one member.\n */\nexport type Interaction<T extends InteractionType = InteractionType> = T extends InteractionType\n ? InteractionBase & {\n /** The discriminator — the single field a consumer switches on. */\n type: T;\n /** Type-specific fields. */\n payload: InteractionPayloadByType[T];\n }\n : never;\n\n/** The interaction union `onInteraction` hands out; same as the bare {@link Interaction}. */\nexport type TypedInteraction = Interaction;\n\nfunction asString(value: unknown): string | undefined {\n return typeof value === \"string\" && value ? value : undefined;\n}\n\nfunction asBool(value: unknown): boolean | undefined {\n return typeof value === \"boolean\" ? value : undefined;\n}\n\nfunction normalizeActions(value: unknown): Action[] {\n if (!Array.isArray(value)) return [];\n const out: Action[] = [];\n for (const item of value) {\n if (!isJsonObject(item)) continue;\n const kind = asString(item.kind);\n if (!kind) continue;\n const action: Action = {\n kind: kind as ActionKind,\n label: asString(item.label) ?? \"\",\n method: asString(item.method) ?? \"POST\",\n endpoint: asString(item.endpoint) ?? \"\",\n };\n if (isJsonObject(item.inputSchema)) action.inputSchema = item.inputSchema;\n out.push(action);\n }\n return out;\n}\n\nfunction normalizeEvidence(c: JsonObject): InteractionEvidence | undefined {\n // Wire is `evidence_artifact_id` (camelized to `evidenceArtifactId`); the\n // curated surface nests it under a small object.\n const artifactId =\n asString(c.evidenceArtifactId) ??\n (isJsonObject(c.evidence) ? asString((c.evidence as JsonObject).artifactId) : undefined);\n return artifactId ? { artifactId } : undefined;\n}\n\nconst ANSWER_TYPES = new Set<AskUserAnswerType>([\n \"text\",\n \"number\",\n \"boolean\",\n \"single_choice\",\n \"multiple_choice\",\n]);\n\n/**\n * Wire `options`: plain strings (today's clarification) or `{ value, label }`\n * objects. Every string is a legal value, including the empty string.\n */\nfunction normalizeOptions(value: unknown): AskUserOption[] {\n if (!Array.isArray(value)) return [];\n return value.flatMap((raw): AskUserOption[] => {\n if (typeof raw === \"string\") return [{ value: raw, label: raw }];\n if (!isJsonObject(raw) || typeof raw.value !== \"string\") return [];\n return [{ value: raw.value, label: typeof raw.label === \"string\" ? raw.label : raw.value }];\n });\n}\n\nfunction isAnswerType(value: string | undefined): value is AskUserAnswerType {\n return value !== undefined && ANSWER_TYPES.has(value as AskUserAnswerType);\n}\n\n/**\n * `ask_user` from either wire shape. A native `ask_user` names its\n * `answer_type`, which is kept as sent. A `clarification` only hints: with\n * options it is a single choice (`input_type: \"choice\"`); without any option it\n * is free text, so the app never renders an empty picker.\n */\nfunction askUserPayload(c: JsonObject): AskUserPayload {\n const options = normalizeOptions(c.options);\n const native = asString(c.answerType);\n const hint = asString(c.inputType);\n let answerType: AskUserAnswerType;\n if (isAnswerType(native)) answerType = native;\n else if (isAnswerType(hint) && hint !== \"single_choice\" && hint !== \"multiple_choice\") answerType = hint;\n else answerType = options.length > 0 ? (hint === \"multiple_choice\" ? \"multiple_choice\" : \"single_choice\") : \"text\";\n const payload: AskUserPayload = { question: asString(c.question) ?? \"\", answerType };\n if (options.length > 0) payload.options = options;\n return payload;\n}\n\n// Fields every interaction object carries; the rest belong to the payload.\nconst BASE_FIELDS = new Set([\n \"id\", \"type\", \"status\", \"createdAt\", \"resolvedAt\", \"expiresAt\", \"title\", \"prompt\",\n \"evidence\", \"evidenceArtifactId\", \"actions\",\n]);\n\nfunction shapePayload(type: string, c: JsonObject): JsonObject {\n switch (type) {\n case \"site_login\": {\n const sites: InteractionSite[] = Array.isArray(c.sites)\n ? c.sites.flatMap((raw) => {\n if (!isJsonObject(raw)) return [];\n return [\n {\n siteId: asString(raw.siteId) ?? \"\",\n displayName: asString(raw.displayName) ?? \"\",\n loginUrl: asString(raw.loginUrl) ?? \"\",\n },\n ];\n })\n : [];\n const payload: SiteLoginPayload = { sites };\n const monitorId = asString(c.monitorId);\n if (monitorId) payload.monitorId = monitorId;\n return { ...payload };\n }\n case \"ask_user\":\n return { ...askUserPayload(c) };\n case \"confirmation\":\n return { summary: asString(c.summary) ?? \"\" };\n case \"take_control\": {\n const payload: TakeControlPayload = { liveUrl: asString(c.liveUrl) ?? \"\" };\n const surface = asString(c.surface);\n const reason = asString(c.reason);\n if (surface) payload.surface = surface;\n if (reason) payload.reason = reason;\n return { ...payload };\n }\n case \"wait\": {\n const payload: WaitPayload = {\n waitKind: (asString(c.waitKind) as WaitKind) ?? \"external\",\n };\n const until = asString(c.until);\n const retryable = asBool(c.retryable);\n if (until) payload.until = until;\n if (retryable !== undefined) payload.retryable = retryable;\n return { ...payload };\n }\n default: {\n // A type outside the five (a newer backend's addition): pass its own\n // fields through untouched rather than inventing a shape for it.\n const payload: JsonObject = {};\n for (const [key, value] of Object.entries(c)) if (!BASE_FIELDS.has(key)) payload[key] = value;\n return payload;\n }\n }\n}\n\n/**\n * Normalize a `run.interaction` wire payload into a curated {@link Interaction}.\n * `payload` is the camelized interaction object carried in the event envelope's\n * `data` field. Returns null when the object lacks a recognized `type`.\n * A wire `clarification` comes out as `ask_user`.\n */\nexport function normalizeInteraction(payload: unknown): Interaction | null {\n const c = camelizeRecord(payload);\n const wireType = asString(c.type);\n if (!wireType) return null;\n const type = wireType === \"clarification\" ? \"ask_user\" : wireType;\n const interaction = {\n id: asString(c.id) ?? \"\",\n type,\n status: (asString(c.status) as InteractionStatus) ?? \"pending\",\n createdAt: asString(c.createdAt) ?? \"\",\n title: asString(c.title) ?? \"\",\n actions: normalizeActions(c.actions),\n payload: shapePayload(type, c),\n } as unknown as Interaction;\n const resolvedAt = asString(c.resolvedAt);\n const expiresAt = asString(c.expiresAt);\n const prompt = asString(c.prompt);\n const evidence = normalizeEvidence(c);\n if (resolvedAt) interaction.resolvedAt = resolvedAt;\n if (expiresAt) interaction.expiresAt = expiresAt;\n if (prompt) interaction.prompt = prompt;\n if (evidence) interaction.evidence = evidence;\n return interaction;\n}\n\nconst SETTLED_INTERACTION_STATUSES = new Set<string>([\"resolved\", \"expired\", \"canceled\"]);\n\n/**\n * The backend settles an interaction with a minimal shell: no actions and the\n * type-specific fields blanked (a resolve is labelled `clarification` with an\n * empty question, or `site_login` with one empty site). It carries no card\n * content of its own.\n */\nfunction isSettlingShell(next: Interaction): boolean {\n if (!SETTLED_INTERACTION_STATUSES.has(next.status) || next.actions.length > 0) return false;\n switch (next.type) {\n case \"ask_user\":\n return next.payload.question === \"\";\n case \"site_login\":\n return next.payload.sites.every((site) => !site.siteId);\n case \"confirmation\":\n return next.payload.summary === \"\";\n default:\n return false;\n }\n}\n\n/**\n * Fold a lifecycle update onto the card already seen for the same `id`. Only a\n * settling shell is folded: it keeps the card's type, payload, title and\n * creation time, and moves `status`, `resolvedAt` and `actions`. Any update\n * with real content — including a settled one, such as an expired take-over\n * with its own reason — replaces the card, so a full card replayed after a\n * shell repairs it.\n */\nexport function foldInteraction(previous: Interaction | undefined, next: Interaction): Interaction {\n if (!previous || previous.id !== next.id || !isSettlingShell(next)) return next;\n const folded = { ...previous, status: next.status, actions: next.actions } as Interaction;\n if (next.resolvedAt) folded.resolvedAt = next.resolvedAt;\n return folded;\n}\n\n/**\n * Posts an interaction action to its declared endpoint. The product namespace\n * supplies this (token + run addressing already bound); the handle below uses\n * it to invoke `action.endpoint` without the consumer touching HTTP.\n */\nexport type InteractionActionPoster = (\n action: Action,\n body: JsonObject | undefined,\n options?: { requiredScopes?: readonly string[] },\n) => Promise<unknown>;\n\n/**\n * Scopes the product token must carry to invoke `action`. `open_login` starts\n * an interactive login session on the profiles route, which the backend guards\n * with `webagent.site_login:request`; every other action resolves the\n * interaction inside the product run and needs the product's manage scope.\n */\nexport function interactionActionScopes(action: Action, productManageScope: string): string[] {\n return action.kind === ActionKinds.openLogin\n ? [QoniScopes.SITE_LOGIN_REQUEST]\n : [productManageScope];\n}\n\n/** Options for {@link InteractionHandle.openLogin}. */\nexport interface OpenLoginOptions {\n /**\n * Site to sign in to — one of `interaction.payload.sites[].siteId`. May be\n * omitted when the interaction lists exactly one site.\n */\n siteId?: string;\n /** Re-login an existing browser profile in place instead of creating one. */\n profileId?: string;\n}\n\n/** Interactive login session started by {@link InteractionHandle.openLogin}. */\nexport interface OpenLoginResult {\n profileId: string;\n siteId: string;\n /** Login browser session the user signs in through. */\n sessionId: string;\n /** Live view URL of the login browser to show to the user. */\n liveUrl: string;\n /** Unmodified response body (escape hatch — shape may evolve with the API). */\n raw: JsonObject;\n /**\n * @deprecated {@link InteractionHandle.confirmSignedIn} saves the login\n * itself; call it once the user has signed in, without `confirm()`.\n *\n * Persist the login into the profile after the user signs in\n * (`POST /profiles/{profileId}/confirm`). Confirming ends this login\n * session and closes its browser, except when the backend could not save\n * it yet (`release_failed`, below):\n *\n * - `active: true` — the login is saved; call\n * {@link InteractionHandle.confirmSignedIn}.\n * - `active: false` with `probeResult: \"no_session\"` — the backend no longer\n * holds the session (it may already have saved the login automatically, or\n * restarted). Call `confirmSignedIn()`: the agent rechecks the site and\n * raises a new `site_login` interaction if it is still signed out.\n * - Rejects with a `QoniError` whose `code` is `no_pending_login` (HTTP 409)\n * when the backend has no pending login for this profile: the session\n * already ended on providers that report it this way, or the profile no\n * longer exists for this user. Handle it like `no_session`: call\n * `confirmSignedIn()`, and the agent asks again if it is still signed out.\n * - `active: false` with `probeResult: \"release_failed\"` — the backend kept\n * the session but could not save it yet; call `confirm()` again.\n * - `active: false` with any other `probeResult` — the user was not signed\n * in. Start a new session with `openLogin({ siteId, profileId })` and show\n * its new `liveUrl`; the old one no longer works.\n * - Throws `QoniValidationError` when a newer `openLogin()` replaced this\n * backend session; confirm the newer result instead.\n *\n * Requires `QoniScopes.SITE_LOGIN_CONFIRM`.\n */\n confirm(options?: ConfirmLoginOptions): Promise<ConfirmLoginResult>;\n}\n\n/** Options for {@link OpenLoginResult.confirm}. */\nexport interface ConfirmLoginOptions {\n /** Optional human-readable label stored on the profile. */\n displayLabel?: string;\n}\n\n/** Result of {@link OpenLoginResult.confirm}. */\nexport interface ConfirmLoginResult {\n profileId: string;\n /** True only when the profile is now `active` (the login was captured). */\n active: boolean;\n /** Profile state after confirmation: `active`, or `pending_login` when no signed-in session was detected. */\n state: string;\n /** Outcome of the backend's signed-in probe, for example `no_session`. */\n probeResult: string;\n /** Unmodified response body (escape hatch — shape may evolve with the API). */\n raw: JsonObject;\n}\n\n/** A login session `openLogin()` opened on one interaction. */\nexport interface LoginSession {\n profileId: string;\n siteId: string;\n /** The backend's login session; reopening may return the same one. */\n sessionId: string;\n /** Latest `openLogin()` call on the interaction that returned it (1, 2, …). */\n call: number;\n /** A newer backend session took over: this one can no longer be saved. */\n replaced?: boolean;\n /** Saved and rechecked: nothing left to do for this session. */\n completed?: boolean;\n /** The save in flight or done; cleared when it fails so a retry saves again. */\n save?: Promise<ConfirmLoginResult>;\n /** `confirmSignedIn()` in flight or done: one save and one recheck per session. */\n done?: Promise<void>;\n}\n\n/** Per interaction: how many `openLogin()` calls were made, and the session of the latest call that succeeded. */\nexport interface LoginSessionSlot {\n calls: number;\n /** `openLogin()` calls still waiting for the backend. */\n inflight: number;\n /** The interaction settled (resolved, expired or canceled): nothing will confirm this login any more. */\n ended?: boolean;\n session?: LoginSession;\n}\n\n/**\n * A login slot may be forgotten only when no `openLogin()` is in flight and\n * its login is done: saved and rechecked, or its interaction already ended.\n */\nexport function loginSlotIdle(slot: LoginSessionSlot): boolean {\n return slot.inflight === 0 && (!slot.session || slot.ended === true || slot.session.completed === true);\n}\n\n/** Note that `interaction` settled, so its login slot can be reclaimed once nothing is in flight. */\nexport function markLoginEnded(store: LoginSessionStore, interaction: Interaction): void {\n if (!SETTLED_INTERACTION_STATUSES.has(interaction.status)) return;\n const slot = store.get(interaction.id);\n if (slot) slot.ended = true;\n}\n\n/** Login sessions by interaction id, shared by the handles one RunHandle / MonitorHandle hands out. */\nexport type LoginSessionStore = Map<string, LoginSessionSlot>;\n\n/** The backend kept the login session but could not save it yet (Browserbase release failed). */\nconst SAVE_RETRY_PROBES = new Set([\"release_failed\"]);\n\nfunction isNoPendingLogin(err: unknown): boolean {\n return err instanceof QoniError && err.status === 409 && err.code === \"no_pending_login\";\n}\n\n/** How many interactions a long-lived handle remembers (cards, login sessions). */\nexport const INTERACTION_MEMORY_LIMIT = 256;\n\n/**\n * Set `key` as the newest entry and, beyond `limit`, drop the oldest entries\n * that `evictable` allows, so caches on long-lived handles (a Track monitor\n * never ends) stay bounded. Entries still in use are never dropped: when none\n * can go, the map grows rather than forgetting work in progress.\n */\nexport function rememberBounded<K, V>(\n map: Map<K, V>,\n key: K,\n value: V,\n limit = INTERACTION_MEMORY_LIMIT,\n evictable: (value: V) => boolean = () => true,\n): void {\n map.delete(key);\n map.set(key, value);\n if (map.size <= limit) return;\n for (const [candidate, entry] of map) {\n if (map.size <= limit) break;\n if (candidate !== key && evictable(entry)) map.delete(candidate);\n }\n}\n\n/** Settled cards can be forgotten first; pending ones may still be folded. */\nexport function interactionSettled(interaction: Interaction): boolean {\n return SETTLED_INTERACTION_STATUSES.has(interaction.status);\n}\n\n/** A control session returned by `connectControl()` / `refreshControl()`. */\nexport interface ControlSession {\n /** Signed URL of the browser the user now controls; show it only to that user. */\n liveUrl: string;\n /** When `liveUrl` stops working; call `refreshControl()` for a new one. */\n expiresAt?: string;\n status?: string;\n /** Unmodified response body (escape hatch — shape may evolve with the API). */\n raw: JsonObject;\n}\n\nfunction controlSession(response: unknown): ControlSession {\n const raw = isJsonObject(response) ? response : {};\n const fields = camelizeRecord(raw);\n const session: ControlSession = { liveUrl: asString(fields.standaloneControlUrl) ?? asString(fields.liveUrl) ?? \"\", raw };\n const expiresAt = asString(fields.controlTokenExpiresAt) ?? asString(fields.expiresAt);\n const status = asString(fields.status);\n if (expiresAt) session.expiresAt = expiresAt;\n if (status) session.status = status;\n return session;\n}\n\nfunction describeOptions(payload: AskUserPayload): string {\n return (payload.options ?? []).map((option) => option.value).join(\", \");\n}\n\n/**\n * Check an answer against the question's answerType. Messages name what would\n * fit, never the rejected value: answers can be personal.\n */\nfunction checkAnswer(payload: AskUserPayload, value: unknown): void {\n const fail = (expected: string): never => {\n throw new QoniValidationError(`answer() for a ${payload.answerType} question expects ${expected}`);\n };\n const values = new Set((payload.options ?? []).map((option) => option.value));\n switch (payload.answerType) {\n case \"text\":\n if (typeof value !== \"string\") fail(\"a string\");\n return;\n case \"number\":\n if (typeof value !== \"number\" || !Number.isFinite(value)) fail(\"a finite number\");\n return;\n case \"boolean\":\n if (typeof value !== \"boolean\") fail(\"a boolean\");\n return;\n case \"single_choice\":\n if (typeof value !== \"string\" || (values.size > 0 && !values.has(value))) {\n fail(`one option value: ${describeOptions(payload)}`);\n }\n return;\n case \"multiple_choice\":\n if (!Array.isArray(value)) fail(`an array of option values: ${describeOptions(payload)}`);\n if ((value as unknown[]).some((item) => typeof item !== \"string\" || (values.size > 0 && !values.has(item)))) {\n fail(`option values only: ${describeOptions(payload)}`);\n }\n return;\n }\n}\n\n/**\n * Typed wrapper over an {@link Interaction} that exposes one method per\n * action kind. Each method finds the matching declared action and posts to its\n * endpoint; calling a method whose action the backend did NOT declare throws\n * (so \"dead recovery affordances\" are impossible — if you can call it, the\n * backend offered it).\n */\nexport class InteractionHandle<T extends InteractionType = InteractionType> {\n readonly interaction: Interaction<T>;\n\n /**\n * @param loginSessions Login sessions opened on interactions, by interaction\n * id. A RunHandle / MonitorHandle shares one store across the handles it\n * hands out, so `confirmSignedIn()` finds the login `openLogin()` opened\n * even on the handle of a later event.\n */\n constructor(\n interaction: Interaction<T>,\n private readonly post: InteractionActionPoster,\n private readonly loginSessions: LoginSessionStore = new Map(),\n ) {\n this.interaction = interaction;\n }\n\n get id(): string {\n return this.interaction.id;\n }\n get type(): T {\n return this.interaction.type as T;\n }\n get status(): InteractionStatus {\n return this.interaction.status;\n }\n get actions(): Action[] {\n return this.interaction.actions;\n }\n\n /** Whether the backend declared an action of this kind on the interaction. */\n can(kind: ActionKind): boolean {\n return this.interaction.actions.some((a) => a.kind === kind);\n }\n\n /**\n * Answer an `ask_user` question. The value follows `payload.answerType`:\n * `text` → string, `number` → number, `boolean` → boolean, `single_choice` →\n * one option `value`, `multiple_choice` → an array of option values. A value\n * that does not fit throws `QoniValidationError` before anything is sent.\n */\n async answer(value: AskUserAnswer): Promise<void> {\n const action = this.#declaredAction(ActionKinds.answer);\n if (this.interaction.type === \"ask_user\") {\n checkAnswer(this.interaction.payload as AskUserPayload, value);\n }\n await this.post(action, { response: value });\n }\n /** Skip / dismiss the interaction (proceed without acting on it). */\n async skip(): Promise<void> {\n await this.invoke(ActionKinds.skip);\n }\n /** Confirm a pending confirmation (approve the plan / destructive op). */\n async confirm(): Promise<void> {\n await this.invoke(ActionKinds.confirm);\n }\n /** Reject a pending confirmation. */\n async reject(): Promise<void> {\n await this.invoke(ActionKinds.reject);\n }\n /**\n * Start an interactive login session for a `site_login` interaction. The\n * backend needs the site to sign in to: pass `siteId`, or omit it when the\n * interaction lists exactly one site. Show `liveUrl` to the user; when they\n * say they are signed in, call {@link confirmSignedIn}, which saves the login\n * and lets the agent continue.\n * The delegation must include `QoniScopes.SITE_LOGIN_REQUEST` and\n * `QoniScopes.SITE_LOGIN_CONFIRM`; the AccessKey policy must allow both.\n */\n async openLogin(options: OpenLoginOptions = {}): Promise<OpenLoginResult> {\n // Undeclared action first: same contract as every other method.\n this.#declaredAction(ActionKinds.openLogin);\n const body: JsonObject = { site_id: this.#loginSiteId(options.siteId) };\n if (options.profileId !== undefined) {\n if (typeof options.profileId !== \"string\" || !options.profileId) {\n throw new QoniValidationError(\"openLogin profileId must be a non-empty string\");\n }\n body.profile_id = options.profileId;\n }\n // Number the call before awaiting: when calls overlap, the latest call that\n // succeeds owns the session, whichever response arrives last.\n const slot = this.#loginSlot();\n const call = ++slot.calls;\n slot.inflight += 1;\n let response: unknown;\n try {\n response = await this.invoke(ActionKinds.openLogin, body);\n } finally {\n slot.inflight -= 1;\n }\n const raw = isJsonObject(response) ? response : {};\n const fields = camelizeRecord(raw);\n const profileId = asString(fields.profileId) ?? \"\";\n const siteId = asString(fields.siteId) ?? String(body.site_id);\n const sessionId = asString(fields.sessionId) ?? \"\";\n const current = slot.session;\n // Reopening can hand back the very same backend session: share its save.\n const reused =\n current !== undefined && sessionId !== \"\" && current.sessionId === sessionId &&\n current.profileId === profileId && current.siteId === siteId;\n const session: LoginSession = reused ? current : { profileId, siteId, sessionId, call };\n if (reused) {\n current.call = Math.max(current.call, call);\n } else if (profileId && (current?.call ?? 0) < call) {\n if (current) current.replaced = true;\n slot.session = session;\n } else {\n session.replaced = true; // an older call answered late: a newer session owns the interaction\n }\n return {\n profileId,\n siteId,\n sessionId,\n liveUrl: asString(fields.liveUrl) ?? \"\",\n raw,\n confirm: async (confirmOptions: ConfirmLoginOptions = {}) => {\n if (!profileId) {\n throw new QoniValidationError(\"openLogin response did not include a profileId to confirm\");\n }\n if (session.replaced) {\n throw new QoniValidationError(\n \"this login session was replaced by a newer openLogin(); confirm the newer one \" +\n \"(or call confirmSignedIn(), which saves the current session)\",\n );\n }\n // Shares the save with confirmSignedIn(): never two saves for one session.\n return this.#saveOnce(session, confirmOptions);\n },\n };\n }\n /**\n * The user finished signing in through the live browser `openLogin()`\n * opened. Saves that login (so later tasks reuse it), then tells the agent\n * to recheck the site and continue. If the user is not signed in after all,\n * the agent raises a new `site_login` interaction.\n *\n * Saving needs `QoniScopes.SITE_LOGIN_CONFIRM` on the delegation; without\n * `openLogin()` on this interaction, only the recheck is sent.\n */\n async confirmSignedIn(): Promise<void> {\n const action = this.#declaredAction(ActionKinds.confirmSignedIn);\n const session = this.loginSessions.get(this.id)?.session;\n if (!session) {\n await this.post(action, undefined);\n return;\n }\n // One save and one recheck per session, however many handles or calls ask.\n session.done ??= this.#saveThenRecheck(session, action).catch((err: unknown) => {\n session.done = undefined; // let a retry run again\n throw err;\n });\n await session.done;\n }\n /**\n * Take over the live browser for a take_control interaction. Resolves to the\n * signed control URL to show the user (`liveUrl`) and when it expires.\n */\n async connectControl(): Promise<ControlSession> {\n return controlSession(await this.invoke(ActionKinds.connectControl));\n }\n /** Get a fresh control URL when the current one expired. */\n async refreshControl(): Promise<ControlSession> {\n return controlSession(await this.invoke(ActionKinds.refreshControl));\n }\n /** Hand control back to the agent. */\n async releaseControl(): Promise<void> {\n await this.invoke(ActionKinds.releaseControl);\n }\n /** Retry a wait interaction now. */\n async retry(): Promise<void> {\n await this.invoke(ActionKinds.retry);\n }\n /** Switch the profile a wait/login interaction is bound to. */\n async switchProfile(): Promise<void> {\n await this.invoke(ActionKinds.switchProfile);\n }\n\n /** `POST /profiles/{profileId}/confirm` — persist the login of `session`. */\n async #confirmLogin(session: LoginSession, options: ConfirmLoginOptions = {}): Promise<ConfirmLoginResult> {\n const confirmBody: JsonObject = { site_id: session.siteId };\n if (options.displayLabel !== undefined) confirmBody.display_label = options.displayLabel;\n // The confirm route is not a declared interaction action; it belongs to\n // the login session openLogin() started, on the same profiles router.\n const response = await this.post(\n {\n kind: ActionKinds.openLogin,\n label: \"Confirm login\",\n method: \"POST\",\n endpoint: `/profiles/${encodeURIComponent(session.profileId)}/confirm`,\n },\n confirmBody,\n { requiredScopes: [QoniScopes.SITE_LOGIN_CONFIRM] },\n );\n const raw = isJsonObject(response) ? response : {};\n const fields = camelizeRecord(raw);\n const state = asString(fields.state) ?? \"\";\n return {\n profileId: asString(fields.profileId) ?? session.profileId,\n active: state === \"active\",\n state,\n probeResult: asString(fields.probeResult) ?? \"\",\n raw,\n };\n }\n\n /** The save for `session`, started once; a failed attempt is forgotten so a retry saves again. */\n #saveOnce(session: LoginSession, options?: ConfirmLoginOptions): Promise<ConfirmLoginResult> {\n session.save ??= this.#confirmLogin(session, options).then(\n (result) => {\n if (SAVE_RETRY_PROBES.has(result.probeResult)) session.save = undefined;\n return result;\n },\n (err: unknown) => {\n // 409 no_pending_login is final: the backend already saved or dropped it.\n if (!isNoPendingLogin(err)) session.save = undefined;\n throw err;\n },\n );\n return session.save;\n }\n\n /**\n * Save the login, then let the agent recheck. A user who is not signed in\n * yet still gets a recheck (the agent asks again), and so does 409\n * `no_pending_login`. A save the backend could not complete (`release_failed`)\n * throws a retryable error instead of telling the agent to go on.\n */\n async #saveThenRecheck(session: LoginSession, action: Action): Promise<void> {\n let result: ConfirmLoginResult | undefined;\n try {\n result = await this.#saveOnce(session);\n } catch (err) {\n if (!isNoPendingLogin(err)) throw err;\n }\n if (result && SAVE_RETRY_PROBES.has(result.probeResult)) {\n throw new QoniError(\n `the login could not be saved yet (probeResult \"${result.probeResult}\"); ` +\n \"the login browser is kept — call confirmSignedIn() again to retry\",\n { code: \"site_login.save_failed\", retryable: true },\n );\n }\n // The user reopened the login while this one was being saved: the newer\n // session is not saved yet, so do not tell the agent to go on.\n if (session.replaced) {\n throw new QoniError(\n \"the login was reopened while it was being saved; call confirmSignedIn() again to save the newer login\",\n { code: \"site_login.session_replaced\", retryable: true },\n );\n }\n await this.post(action, undefined);\n session.completed = true;\n }\n\n #loginSlot(): LoginSessionSlot {\n let slot = this.loginSessions.get(this.id);\n if (!slot) {\n slot = { calls: 0, inflight: 0 };\n rememberBounded(this.loginSessions, this.id, slot, INTERACTION_MEMORY_LIMIT, loginSlotIdle);\n }\n return slot;\n }\n\n /** Resolve the site for `openLogin`: explicit, or the only listed site. */\n #loginSiteId(requested: string | undefined): string {\n const payload = this.interaction.payload as Partial<SiteLoginPayload> | undefined;\n const listed = Array.isArray(payload?.sites)\n ? payload.sites.map((site) => site.siteId).filter((id) => typeof id === \"string\" && id.length > 0)\n : [];\n if (requested !== undefined) {\n if (typeof requested !== \"string\" || !requested) {\n throw new QoniValidationError(\"openLogin siteId must be a non-empty string\");\n }\n if (listed.length > 0 && !listed.includes(requested)) {\n throw new QoniValidationError(\n `openLogin siteId \"${requested}\" is not one of the sites this interaction asks for: ${listed.join(\", \")}`,\n );\n }\n return requested;\n }\n if (listed.length === 1) return listed[0];\n throw new QoniValidationError(\n listed.length === 0\n ? \"openLogin needs a siteId: this interaction does not list the site to sign in to\"\n : `openLogin needs a siteId: choose one of ${listed.join(\", \")}`,\n );\n }\n\n /**\n * Invoke an action by kind with an optional body. `async` so a missing-action\n * error surfaces as a rejected promise (not a synchronous throw), keeping the\n * method contract uniformly promise-based.\n */\n private async invoke(kind: ActionKind, body?: JsonObject): Promise<unknown> {\n return this.post(this.#declaredAction(kind), body);\n }\n\n /** The declared action of `kind`; throws when the backend did not offer it. */\n #declaredAction(kind: ActionKind): Action {\n const action = this.interaction.actions.find((a) => a.kind === kind);\n if (!action) {\n const offered = this.interaction.actions.map((a) => a.kind).join(\", \") || \"none\";\n throw new QoniValidationError(\n `interaction \"${this.interaction.id}\" (${this.interaction.type}) does not offer the ` +\n `\"${kind}\" action — the backend declared: ${offered}. ` +\n \"Only call methods whose action the interaction currently offers.\",\n );\n }\n return action;\n }\n}\n","import { QoniError, QoniTimeoutError } from \"./errors\";\nimport {\n InteractionHandle,\n foldInteraction,\n rememberBounded,\n interactionSettled,\n markLoginEnded,\n INTERACTION_MEMORY_LIMIT,\n type Action,\n type Interaction,\n type LoginSessionStore,\n} from \"./interactions\";\nimport {\n isTerminalRunStatus,\n normalizeRunEvent,\n type RunEvent,\n type RunImage,\n} from \"./run-events\";\nimport { isJsonObject, type QoniEvent, type JsonObject } from \"./types\";\n\n/** Opaque reference to a backend browser/context session a run executed in. */\nexport interface SessionRef {\n sessionId: string;\n}\n\n/** Semantic capture switch — controls which media events the stream delivers. */\nexport interface CaptureOptions {\n screenshots?: boolean;\n videoFrames?: boolean;\n}\n\nexport interface RunEventsOptions {\n lastEventId?: string;\n signal?: AbortSignal;\n /**\n * Receives every original SSE frame before semantic normalization/filtering.\n * Use this for audit logs and observability evidence that must retain internal\n * Agent/tool lifecycle payloads. Some frames do not become semantic events.\n */\n onWireEvent?: (event: QoniEvent<unknown>) => void | Promise<void>;\n /** Called whenever the SDK reconnects a dropped SSE stream. */\n onReconnect?: (info: RunReconnectInfo) => void;\n}\n\nexport interface RunReconnectInfo {\n attempt: number;\n lastEventId?: string;\n error: unknown;\n}\n\n/** A refreshed snapshot of a run's state, as returned by `run.status()`. */\nexport interface RunStatus {\n id: string;\n /** pending | running | awaiting_input | succeeded | failed | canceled */\n status: string;\n sessionId?: string;\n output?: unknown;\n /** Full wire run envelope (escape hatch — shape may evolve with the API). */\n raw: JsonObject;\n}\n\n/** A deliverable produced by a run. Content is fetched lazily via `content()`. */\nexport interface Artifact {\n id: string;\n name?: string;\n mime?: string;\n sizeBytes?: number;\n createdAt?: string;\n /** Temporary signed storage URL; refresh after expiry. */\n downloadUrl?: string;\n expiresIn?: number;\n refreshDownloadUrl?(): Promise<string>;\n content(): Promise<Uint8Array>;\n}\n\n/** Settled outcome of `run.wait()`. */\nexport interface RunResult {\n runId: string;\n status: \"succeeded\" | \"failed\" | \"canceled\";\n /** Final answer / output payload (shape is task-specific). */\n output?: unknown;\n /** Deliverables (deepResearch reports etc). Empty array for products without artifacts. */\n artifacts: Artifact[];\n terminalReason?: string;\n isTaskSuccessful?: boolean;\n /** Full wire run envelope (escape hatch — shape may evolve with the API). */\n raw: JsonObject;\n}\n\nexport interface RunWaitOptions {\n /** Client-side wall-clock cap. On elapse, `wait` throws `QoniTimeoutError`; the run keeps executing server-side. */\n timeoutMs?: number;\n signal?: AbortSignal;\n onEvent?: (event: RunEvent) => void | Promise<void>;\n /** Every original SSE frame, including frames filtered from the semantic stream. */\n onWireEvent?: (event: QoniEvent<unknown>) => void | Promise<void>;\n /** Reconnect telemetry for the underlying resumable SSE stream. */\n onReconnect?: (info: RunReconnectInfo) => void;\n /**\n * Fires on `event.type === \"interaction\"` (HITL). The handle exposes typed\n * action methods (`interaction.answer(…)` / `confirmSignedIn()` /\n * `releaseControl()` / …) that post to the action's declared endpoint.\n */\n onInteraction?: (\n interaction: InteractionHandle,\n event: RunEvent,\n ) => void | Promise<void>;\n onScreenshot?: (image: RunImage, index: number) => void | Promise<void>;\n}\n\n/**\n * Product-specific wire operations a `RunHandle` is built on. Each product\n * namespace constructs one of these from its `api.*` escape-hatch methods\n * with the token + run addressing already bound.\n */\nexport interface RunWireOps {\n getDetail(signal?: AbortSignal): Promise<JsonObject>;\n streamEvents(opts: RunEventsOptions): AsyncIterable<QoniEvent<unknown>>;\n /**\n * Invoke an interaction action by posting to its declared endpoint. The\n * Interaction model's `actions[]` carry the endpoint + method, so the SDK\n * never hard-codes a HITL route — it forwards what the backend declared.\n */\n postAction(\n action: Action,\n body: JsonObject | undefined,\n options?: { requiredScopes?: readonly string[] },\n ): Promise<unknown>;\n cancel(reason?: string): Promise<JsonObject>;\n /** Products without artifacts leave this undefined → `result.artifacts` is []. */\n listArtifacts?(signal?: AbortSignal): Promise<Artifact[]>;\n}\n\n// Wire statuses cancel() treats as \"may already be terminal\" — it then\n// refreshes the run and returns the terminal state instead of throwing.\n// Auth / permission / 5xx errors always rethrow.\nconst CANCEL_IDEMPOTENT_STATUSES = new Set([400, 404, 409, 410, 422]);\n\n/**\n * Handle to a single run. Generic over the product's event set (分型): a\n * `RunHandle<DeepResearchEvent>` only ever yields Deep Research events, so\n * `switch (event.type)` autocompletes just that product's events and a\n * wrong-product case is a compile error. The runtime is identical across\n * products; the generic only narrows the public type surface.\n */\nexport class RunHandle<E extends RunEvent = RunEvent> {\n readonly id: string;\n /** Pass back to `run({ session })` to reuse the same backend session. */\n sessionRef?: SessionRef;\n private readonly capture: CaptureOptions;\n /** Login sessions opened on this run's interactions — see {@link interactionHandle}. */\n readonly #loginSessions: LoginSessionStore = new Map();\n /** Latest card per interaction id, so lifecycle updates fold onto it. */\n readonly #interactions = new Map<string, Interaction>();\n\n constructor(\n private readonly ops: RunWireOps,\n init: { id: string; sessionRef?: SessionRef; capture?: CaptureOptions },\n ) {\n this.id = init.id;\n this.sessionRef = init.sessionRef;\n this.capture = init.capture ?? {};\n }\n\n /** Refresh and return the run's current state. */\n async status(): Promise<RunStatus> {\n const detail = await this.ops.getDetail();\n this.#adoptSessionRef(detail);\n return normalizeRunStatus(this.id, detail);\n }\n\n /**\n * Stream semantic events. Ends automatically at the run's terminal event.\n * Reconnects with `Last-Event-ID` catch-up are handled internally.\n */\n async *events(opts: RunEventsOptions = {}): AsyncIterable<E> {\n for await (const wire of this.ops.streamEvents(opts)) {\n await opts.onWireEvent?.(wire);\n let event = normalizeRunEvent(wire, { topRunId: this.id });\n if (!event) continue;\n if (event.type === \"interaction\") {\n const card = foldInteraction(this.#interactions.get(event.data.id), event.data);\n rememberBounded(this.#interactions, card.id, card, INTERACTION_MEMORY_LIMIT, interactionSettled);\n markLoginEnded(this.#loginSessions, card);\n event = { ...event, data: card };\n }\n if (event.type === \"screenshot\" && !this.capture.screenshots) continue;\n if (isVideoFrame(wire) && !this.capture.videoFrames) continue;\n // The normalizer yields the full RunEvent union; this product handle only\n // receives its own subset, so the narrowing cast is sound.\n yield event as E;\n if (event.isTerminal) return;\n }\n }\n\n /** Drive the run to a terminal state and return the settled result. */\n async wait(opts: RunWaitOptions = {}): Promise<RunResult> {\n const { signal, timedOut, dispose } = withTimeout(opts.signal, opts.timeoutMs);\n let lastEventId: string | undefined;\n let eventIdAtLastClose: string | undefined;\n let sawCleanClose = false;\n let terminalDetail: JsonObject | undefined;\n let terminalDoneReason: string | undefined;\n let screenshotIndex = 0;\n\n try {\n settled: for (;;) {\n for await (const event of this.events({\n signal,\n lastEventId,\n onWireEvent: (wire) => waitWithSignal(() => {\n if (wire.id !== undefined) lastEventId = wire.id;\n return opts.onWireEvent?.(wire);\n }, signal),\n onReconnect: opts.onReconnect,\n })) {\n await waitWithSignal(() => opts.onEvent?.(event), signal);\n if (event.type === \"screenshot\") {\n await waitWithSignal(() => opts.onScreenshot?.(event.image, screenshotIndex++), signal);\n } else if (event.type === \"interaction\") {\n await waitWithSignal(() => opts.onInteraction?.(this.interactionHandle(event.data), event), signal);\n }\n if (event.isTerminal) {\n // The `done` event carries terminalReason even when the detail\n // envelope omits it — keep it as a fallback so RunResult isn't\n // missing a reason the stream already delivered.\n if (event.type === \"done\") terminalDoneReason = event.data.terminalReason || undefined;\n break settled;\n }\n }\n // The server closed the stream without a terminal event. If the run\n // detail says terminal we are done; otherwise resume the stream from\n // the last seen event id — but only if the stream made progress since\n // the previous clean close, so a server that keeps closing an idle\n // stream cannot spin us in a tight reconnect loop.\n const detail = await settleRead(() => this.ops.getDetail(signal), signal);\n if (isTerminalRunStatus(normalizeRunStatus(this.id, detail).status)) {\n terminalDetail = detail;\n break;\n }\n if (sawCleanClose && lastEventId === eventIdAtLastClose) {\n throw new QoniError(\n \"run event stream ended before a terminal event while the run is \" +\n `still \"${String(detail.status)}\" — re-attach or poll status()`,\n { code: \"upstream.failed\", retryable: true },\n );\n }\n sawCleanClose = true;\n eventIdAtLastClose = lastEventId;\n }\n\n const detail = terminalDetail ?? await settleRead(() => this.ops.getDetail(signal), signal);\n this.#adoptSessionRef(detail);\n const result = settleRunResult(this.id, detail, [], terminalDoneReason);\n result.artifacts = this.ops.listArtifacts\n ? await settleRead(() => this.ops.listArtifacts!(signal), signal)\n : [];\n return result;\n } catch (err) {\n if (timedOut() && !opts.signal?.aborted) {\n throw new QoniTimeoutError(\n `run.wait timed out after ${opts.timeoutMs} ms — the run keeps executing ` +\n \"server-side; attach() to it again or cancel() it\",\n { cause: err },\n );\n }\n throw err;\n } finally {\n dispose();\n }\n }\n\n /**\n * Wrap an {@link Interaction} (from `event.data` of an `interaction` event)\n * in a typed {@link InteractionHandle} bound to this run. The handle's action\n * methods (`answer` / `confirmSignedIn` / `releaseControl` / …) post to the\n * endpoint the backend declared for that action. Handles this RunHandle\n * hands out share the login sessions `openLogin()` opens, so\n * `confirmSignedIn()` on the handle of a later event still saves that login.\n * A RunHandle from another `attach()` (or process) does not see them.\n */\n interactionHandle(interaction: Interaction): InteractionHandle {\n return new InteractionHandle(\n interaction,\n (action, body, options) => this.ops.postAction(action, body, options),\n this.#loginSessions,\n );\n }\n\n /**\n * Cancel the run. Idempotent: cancelling an already-terminal run returns\n * its terminal state instead of throwing.\n */\n async cancel(reason?: string): Promise<RunStatus> {\n try {\n const data = await this.ops.cancel(reason);\n this.#adoptSessionRef(data);\n return normalizeRunStatus(this.id, data);\n } catch (err) {\n if (err instanceof QoniError && CANCEL_IDEMPOTENT_STATUSES.has(err.status ?? 0)) {\n let snapshot: RunStatus;\n try {\n snapshot = await this.status();\n } catch {\n throw err;\n }\n if (isTerminalRunStatus(snapshot.status)) return snapshot;\n }\n throw err;\n }\n }\n\n #adoptSessionRef(detail: JsonObject): void {\n const sessionId = typeof detail.session_id === \"string\" ? detail.session_id : undefined;\n if (sessionId && !this.sessionRef) this.sessionRef = { sessionId };\n }\n}\n\nexport function normalizeRunStatus(id: string, detail: JsonObject): RunStatus {\n return {\n id,\n status: typeof detail.status === \"string\" ? detail.status : inferStatus(detail),\n sessionId: typeof detail.session_id === \"string\" ? detail.session_id : undefined,\n output: runOutput(detail),\n raw: detail,\n };\n}\n\nfunction settleRunResult(\n runId: string,\n detail: JsonObject,\n artifacts: Artifact[],\n fallbackTerminalReason?: string,\n): RunResult {\n const terminalReason =\n (typeof detail.terminal_reason === \"string\" ? detail.terminal_reason : undefined) ??\n fallbackTerminalReason;\n const isTaskSuccessful =\n typeof detail.is_task_successful === \"boolean\" ? detail.is_task_successful : undefined;\n const status = normalizeRunStatus(runId, detail).status;\n if (!isTerminalRunStatus(status)) {\n throw new QoniError(\n \"run detail did not confirm a terminal state — re-attach or poll status()\",\n { code: \"upstream.failed\", retryable: true, body: detail },\n );\n }\n return {\n runId,\n status: status as RunResult[\"status\"],\n output: runOutput(detail),\n artifacts,\n terminalReason,\n isTaskSuccessful,\n raw: detail,\n };\n}\n\n// Product run envelopes name their output differently today (doAnything\n// `output`, deepResearch `result`, webSearch `results`) — one field out.\nfunction runOutput(detail: JsonObject): unknown {\n return detail.output ?? detail.result ?? detail.results;\n}\n\nfunction inferStatus(detail: JsonObject): string {\n const reason = typeof detail.terminal_reason === \"string\" ? detail.terminal_reason : undefined;\n if (reason === \"canceled\") return \"canceled\";\n if (reason === \"failed\" || reason === \"expired\") return \"failed\";\n if (reason === \"done\") return \"succeeded\";\n return \"\";\n}\n\nfunction isVideoFrame(wire: QoniEvent<unknown>): boolean {\n const type = wire.event ?? (isJsonObject(wire.data) ? wire.data.type : undefined);\n return type === \"browser_video_frame\" || type === \"run.browser_video_frame\";\n}\n\n// Combine an optional user signal with an optional wall-clock timeout into one\n// signal (Node 18 has no AbortSignal.any). `timedOut()` reports whether OUR\n// timer fired (vs the user aborting), so the caller can distinguish them.\nexport function withTimeout(\n signal: AbortSignal | undefined,\n timeoutMs: number | undefined,\n): { signal?: AbortSignal; timedOut: () => boolean; dispose: () => void } {\n if (!timeoutMs) return { signal, timedOut: () => false, dispose: () => {} };\n const controller = new AbortController();\n let fired = false;\n const timer = setTimeout(() => {\n fired = true;\n controller.abort();\n }, timeoutMs);\n const onAbort = () => controller.abort(signal?.reason);\n const dispose = () => {\n clearTimeout(timer);\n signal?.removeEventListener(\"abort\", onAbort);\n };\n controller.signal.addEventListener(\"abort\", dispose, { once: true });\n if (signal) {\n if (signal.aborted) onAbort();\n else signal.addEventListener(\"abort\", onAbort, { once: true });\n }\n return { signal: controller.signal, timedOut: () => fired, dispose };\n}\n\n/** Retries after the first failure of a settle read (two retries in total). */\nconst SETTLE_READ_BACKOFF_MS = [250, 1_000] as const;\n\n/**\n * Idempotent reads `wait()` performs after the event stream: run detail and\n * the artifact list. A transient failure here (a dropped connection or a\n * timed-out token exchange, both `retryable`) must not fail a run that\n * already finished, so these reads retry a bounded number of times. Only\n * `retryable` QoniErrors are retried; aborts and `wait()`'s own deadline\n * (both surfaced through `signal`) stop immediately.\n */\nasync function settleRead<T>(read: () => Promise<T>, signal: AbortSignal | undefined): Promise<T> {\n for (let attempt = 0; ; attempt++) {\n try {\n return await waitWithSignal(read, signal);\n } catch (err) {\n const delay = SETTLE_READ_BACKOFF_MS[attempt];\n if (delay === undefined || signal?.aborted || !(err instanceof QoniError) || !err.retryable) throw err;\n await sleepWithSignal(delay, signal);\n }\n }\n}\n\nfunction sleepWithSignal(ms: number, signal: AbortSignal | undefined): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n if (signal?.aborted) {\n reject(signal.reason ?? new DOMException(\"Aborted\", \"AbortError\"));\n return;\n }\n const onAbort = () => {\n clearTimeout(timer);\n reject(signal!.reason ?? new DOMException(\"Aborted\", \"AbortError\"));\n };\n const timer = setTimeout(() => {\n signal?.removeEventListener(\"abort\", onAbort);\n resolve();\n }, ms);\n signal?.addEventListener(\"abort\", onAbort, { once: true });\n });\n}\n\nfunction waitWithSignal<T>(operation: () => T | PromiseLike<T>, signal?: AbortSignal): Promise<T> {\n if (!signal) return Promise.resolve().then(operation);\n return new Promise<T>((resolve, reject) => {\n const onAbort = () => reject(signal.reason ?? new DOMException(\"Aborted\", \"AbortError\"));\n if (signal.aborted) {\n onAbort();\n return;\n }\n signal.addEventListener(\"abort\", onAbort, { once: true });\n Promise.resolve().then(() => {\n signal.throwIfAborted();\n return operation();\n }).then(resolve, reject).finally(() => signal.removeEventListener(\"abort\", onAbort));\n });\n}\n","import { QoniValidationError } from \"./errors\";\nimport {\n RunHandle,\n type Artifact,\n type CaptureOptions,\n type RunWireOps,\n type SessionRef,\n} from \"./run-handle\";\nimport type { DeepResearchEvent } from \"./run-events\";\nimport { interactionActionScopes } from \"./interactions\";\nimport type { RunLimits } from \"./do-anything\";\nimport {\n isJsonObject,\n type QoniEvent,\n type QoniHttpMethod,\n type QoniResponse,\n type QoniTransport,\n type JsonObject,\n type RuntimeTokenInput,\n} from \"./types\";\n\nexport interface DeepResearchRunOptions {\n /** Delegation token — passed once here; the returned handle holds it. */\n token: string;\n /** The research topic. */\n prompt: string;\n capture?: CaptureOptions;\n limits?: RunLimits;\n /**\n * Reuse an existing research session — a follow-up run that inherits the\n * prior run's context. Pass `prior.sessionRef`.\n */\n session?: SessionRef;\n // Product-specific options stay camelCase.\n depth?: \"light\" | \"standard\" | \"deep\";\n outputFormat?: string;\n targetAudience?: string;\n domainWhitelist?: string[];\n domainBlacklist?: string[];\n [key: string]: unknown;\n}\n\nexport interface DeepResearchAttachOptions {\n token: string;\n capture?: CaptureOptions;\n}\n\n/**\n * DeepResearch capability namespace — runs are created with a research\n * `topic`, gated by an optional HITL outline approval, then stream events\n * until a cited report is produced. Mirrors the backend contract at\n * `/api/v1/projects/{tenant}/deep_research/...`.\n */\nexport function createDeepResearchNamespace(transport: QoniTransport) {\n /**\n * Wire-level escape hatch — 1:1 with the backend HTTP contract. Shapes\n * here may evolve with the API and are not covered by the frozen public\n * contract. `followUp` (terminal-run messages) and `feedback` (report\n * rating) live only here.\n */\n const api = {\n run: <T = unknown>(input: RuntimeTokenInput & JsonObject): Promise<QoniResponse<T>> =>\n transport.webAgentJson(\"POST\", \"/deep_research/runs\", input.token, {\n body: normalizeDeepResearchRunInput(omit(input, \"token\")),\n requiredScopes: [\"webagent.deep_research:manage\"],\n }),\n\n get: <T = unknown>(input: RuntimeTokenInput & { runId: string; signal?: AbortSignal }): Promise<QoniResponse<T>> =>\n transport.webAgentJson(\n \"GET\",\n `/deep_research/runs/${encodeURIComponent(input.runId)}`,\n input.token,\n {\n signal: input.signal,\n requiredScopes: [\"webagent.deep_research:read\"],\n },\n ),\n\n events: <T = unknown>(\n input: RuntimeTokenInput & {\n runId: string;\n lastEventId?: string;\n signal?: AbortSignal;\n onReconnect?: (info: { attempt: number; lastEventId?: string; error: unknown }) => void;\n },\n ): AsyncIterable<QoniEvent<T>> =>\n transport.webAgentSSE(\n `/deep_research/runs/${encodeURIComponent(input.runId)}/events`,\n input.token,\n {\n lastEventId: input.lastEventId,\n requiredScopes: [\"webagent.deep_research:read\"],\n signal: input.signal,\n onReconnect: input.onReconnect,\n },\n ),\n\n followUp: <T = unknown>(\n input: RuntimeTokenInput & { runId: string; text: string },\n ): Promise<QoniResponse<T>> =>\n transport.webAgentJson(\n \"POST\",\n `/deep_research/runs/${encodeURIComponent(input.runId)}/messages`,\n input.token,\n {\n body: omit(input, \"token\", \"runId\"),\n requiredScopes: [\"webagent.deep_research:manage\"],\n },\n ),\n\n cancel: <T = unknown>(\n input: RuntimeTokenInput & { runId: string },\n ): Promise<QoniResponse<T>> =>\n transport.webAgentJson(\n \"POST\",\n `/deep_research/runs/${encodeURIComponent(input.runId)}/cancel`,\n input.token,\n {\n body: {},\n requiredScopes: [\"webagent.deep_research:manage\"],\n },\n ),\n\n feedback: <T = unknown>(\n input: RuntimeTokenInput & { runId: string } & JsonObject,\n ): Promise<QoniResponse<T>> =>\n transport.webAgentJson(\n \"POST\",\n `/deep_research/runs/${encodeURIComponent(input.runId)}/feedback`,\n input.token,\n {\n body: renameKeys(omit(input, \"token\", \"runId\"), { feedbackText: \"feedback_text\" }),\n requiredScopes: [\"webagent.deep_research:manage\"],\n },\n ),\n\n listArtifacts: <T = unknown>(\n input: RuntimeTokenInput & { runId: string; signal?: AbortSignal },\n ): Promise<QoniResponse<T>> =>\n transport.webAgentJson(\n \"GET\",\n `/deep_research/runs/${encodeURIComponent(input.runId)}/artifacts`,\n input.token,\n {\n signal: input.signal,\n requiredScopes: [\"webagent.deep_research:read\"],\n },\n ),\n\n getArtifact: <T = unknown>(\n input: RuntimeTokenInput & { runId: string; artifactId: string },\n ): Promise<QoniResponse<T>> =>\n transport.webAgentJson(\n \"GET\",\n `/deep_research/runs/${encodeURIComponent(input.runId)}/artifacts/${encodeURIComponent(input.artifactId)}`,\n input.token,\n {\n requiredScopes: [\"webagent.deep_research:read\"],\n },\n ),\n };\n\n function buildOps(token: string | undefined, runId: string): RunWireOps {\n return {\n getDetail: async (signal) => asRecord((await api.get<unknown>({ token, runId, signal })).data),\n streamEvents: (opts) =>\n api.events({\n token,\n runId,\n lastEventId: opts.lastEventId,\n signal: opts.signal,\n onReconnect: opts.onReconnect,\n }),\n postAction: async (action, body, options) =>\n (\n await transport.webAgentJson(\n (action.method || \"POST\") as QoniHttpMethod,\n action.endpoint,\n token,\n {\n ...(body !== undefined ? { body } : {}),\n requiredScopes: options?.requiredScopes ?? interactionActionScopes(action, \"webagent.deep_research:manage\"),\n },\n )\n ).data,\n cancel: async () => asRecord((await api.cancel<unknown>({ token, runId })).data),\n listArtifacts: async (signal) => {\n const res = await api.listArtifacts<{ items?: unknown }>({ token, runId, signal });\n const items = Array.isArray(res.data?.items) ? res.data.items : [];\n return items.filter(isJsonObject).map((item) => toArtifact(item, token, runId));\n },\n };\n }\n\n function toArtifact(item: JsonObject, token: string | undefined, runId: string): Artifact {\n const id = typeof item.id === \"string\" ? item.id : \"\";\n return {\n id,\n name: typeof item.name === \"string\" && item.name ? item.name : undefined,\n mime: typeof item.mime_type === \"string\" ? item.mime_type : undefined,\n sizeBytes: typeof item.size_bytes === \"number\" ? item.size_bytes : undefined,\n createdAt: typeof item.created_at === \"string\" ? item.created_at : undefined,\n content: async () =>\n (\n await transport.webAgentBytes(\n `/deep_research/runs/${encodeURIComponent(runId)}/artifacts/${encodeURIComponent(id)}`,\n token,\n { requiredScopes: [\"webagent.deep_research:read\"] },\n )\n ).bytes,\n };\n }\n\n return {\n /**\n * Start a research run. Pass `session: prior.sessionRef` to start a\n * follow-up run that inherits the prior run's context.\n */\n run: async (input: DeepResearchRunOptions): Promise<RunHandle<DeepResearchEvent>> => {\n const { token, prompt, capture, limits, session, ...rest } = input;\n if (!prompt) {\n throw new QoniValidationError(\"deepResearch.run requires a prompt\");\n }\n\n const run = await api.run<{ run_id?: string; id?: string }>({\n token,\n topic: prompt,\n ...rest,\n ...(limits?.maxDurationMinutes !== undefined\n ? { maxDurationMinutes: limits.maxDurationMinutes }\n : {}),\n ...(session ? { session_id: session.sessionId } : {}),\n });\n const runId = run.data.run_id || run.data.id;\n if (!runId) {\n throw new QoniValidationError(\"deepResearch run create did not return a run id\");\n }\n return new RunHandle<DeepResearchEvent>(buildOps(token, runId), {\n id: runId,\n sessionRef: session,\n capture,\n });\n },\n\n /** Reconnect to an existing run. Verifies the run exists before returning. */\n attach: async (\n runId: string,\n opts: DeepResearchAttachOptions,\n ): Promise<RunHandle<DeepResearchEvent>> => {\n const handle = new RunHandle<DeepResearchEvent>(buildOps(opts.token, runId), {\n id: runId,\n capture: opts.capture,\n });\n await handle.status();\n return handle;\n },\n\n api,\n };\n}\n\nfunction normalizeDeepResearchRunInput(input: JsonObject): JsonObject {\n return renameKeys(input, {\n outputFormat: \"output_format\",\n targetAudience: \"target_audience\",\n maxDurationMinutes: \"max_duration_minutes\",\n callbackUrl: \"callback_url\",\n domainWhitelist: \"domain_whitelist\",\n domainBlacklist: \"domain_blacklist\",\n });\n}\n\nfunction asRecord(value: unknown): JsonObject {\n return isJsonObject(value) ? value : {};\n}\n\nfunction omit(value: object, ...keys: string[]): JsonObject {\n const skipped = new Set(keys);\n const out: JsonObject = {};\n for (const [key, item] of Object.entries(value)) {\n if (!skipped.has(key) && item !== undefined) out[key] = item;\n }\n return out;\n}\n\nfunction renameKeys(value: JsonObject, mapping: Record<string, string>): JsonObject {\n const out: JsonObject = {};\n for (const [key, item] of Object.entries(value)) {\n const target = mapping[key] || key;\n if (out[target] === undefined) out[target] = item;\n }\n return out;\n}\n","import { QoniValidationError } from \"./errors\";\nimport {\n RunHandle,\n type Artifact,\n type CaptureOptions,\n type RunWireOps,\n type SessionRef,\n} from \"./run-handle\";\nimport type { DoAnythingEvent } from \"./run-events\";\nimport { interactionActionScopes } from \"./interactions\";\nimport {\n isJsonObject,\n type QoniEvent,\n type QoniHttpMethod,\n type QoniResponse,\n type QoniTransport,\n type JsonObject,\n type RuntimeTokenInput,\n} from \"./types\";\n\n/**\n * A structured snapshot of the agent's state at a single step — not just an\n * image. The screenshot is one field (an inline reference/data), alongside the\n * metadata and extracted page state captured at that moment.\n */\nexport interface DoAnythingSnapshot {\n /** When the snapshot was captured (ISO 8601). */\n capturedAt?: string;\n /** Which step of the run this snapshot belongs to. */\n stepIndex?: number;\n /** The page the agent was on. */\n url?: string;\n /** Title of the page, if known. */\n title?: string;\n /** The screenshot image — carried in JSON (base64) and/or by reference. */\n image?: SnapshotImage;\n /** What the agent was doing at this step. */\n action?: SnapshotAction;\n}\n\nexport interface SnapshotImage {\n /** Base64-encoded image bytes (no data: prefix). */\n base64?: string;\n /** MIME type, e.g. \"image/jpeg\". */\n contentType?: string;\n /** Direct URL to the image, when the backend exposes one. */\n url?: string;\n /** Artifact id, when the image is stored as an artifact. */\n artifactId?: string;\n width?: number;\n height?: number;\n}\n\nexport interface SnapshotAction {\n /** \"navigate\" | \"click\" | \"type\" | ... */\n kind?: string;\n /** The element/URL/value the action targeted. */\n target?: string;\n /** Human-readable summary of the action. */\n summary?: string;\n}\n\nexport interface RunLimits {\n maxDurationMinutes?: number;\n}\n\nexport type BrowserbaseRegion =\n | \"us-west-2\"\n | \"us-east-1\"\n | \"eu-central-1\"\n | \"ap-southeast-1\";\n\nexport interface BrowserProxyOptions {\n /** Server-side proxy registry id. Credentials never enter the SDK call. */\n proxyId?: string;\n /** `off` uses datacenter egress; `all` proxies all requests; `scoped` uses admin patterns. */\n mode?: \"off\" | \"all\" | \"scoped\";\n /** Browserbase compute region. This is separate from the proxy's IP geography. */\n region?: BrowserbaseRegion;\n}\n\nexport interface DoAnythingRunOptions {\n /** Delegation token — passed once here; the returned handle holds it. */\n token: string;\n /** Natural-language task for the agent to carry out. */\n prompt: string;\n capture?: CaptureOptions;\n limits?: RunLimits;\n /**\n * Reuse an existing browser session (follow-up run); a new one is created\n * around the run by default. Maps to `session_id` on the wire create body.\n */\n session?: SessionRef;\n // Product-specific options stay camelCase.\n profileId?: string;\n /** Applies when this run creates a new Browserbase session. */\n browserProxy?: BrowserProxyOptions;\n keepAlive?: boolean;\n allowedActions?: string[];\n skills?: string[];\n [key: string]: unknown;\n}\n\nexport interface DoAnythingAttachOptions {\n token: string;\n /**\n * Optional — runs are addressed by `run_id` alone; resolution happens via\n * `GET /do_anything/runs/{run_id}`. Accepted for callers that already hold\n * a `sessionRef`; otherwise it is adopted from the run detail envelope.\n */\n session?: SessionRef;\n capture?: CaptureOptions;\n}\n\n// Options the wire create body has no field for — either platform-decided\n// server-side (model via `llm.default_model`, cost ceiling via the internal\n// budget guard, browser egress via dynconfig) or retired phantom knobs the\n// backend never consumed and now 422s (extra=\"forbid\"). Sending them would\n// be a silent drop or a wire error, so `run()` fails loudly up front\n// (contract §4).\nconst PLATFORM_DECIDED_RUN_OPTIONS = [\n \"model\",\n \"proxyCountryCode\",\n \"callbackUrl\",\n \"workspaceId\",\n \"outputSchema\",\n \"cacheScript\",\n] as const;\n\nconst BROWSERBASE_REGIONS = new Set<BrowserbaseRegion>([\n \"us-west-2\",\n \"us-east-1\",\n \"eu-central-1\",\n \"ap-southeast-1\",\n]);\n\nfunction validateBrowserProxyOptions(value: unknown): void {\n if (value === undefined) return;\n if (!isJsonObject(value)) {\n throw new QoniValidationError(\"browserProxy must be an object\");\n }\n const allowed = new Set([\"proxyId\", \"mode\", \"region\"]);\n const extras = Object.keys(value).filter((key) => !allowed.has(key));\n if (extras.length > 0) {\n throw new QoniValidationError(\n `browserProxy does not accept ${extras.join(\", \")} — credentials stay server-side`,\n );\n }\n if (\n value.proxyId !== undefined &&\n (typeof value.proxyId !== \"string\" ||\n !/^[a-z0-9][a-z0-9._-]{0,63}$/.test(value.proxyId))\n ) {\n throw new QoniValidationError(\"browserProxy.proxyId is invalid\");\n }\n if (\n value.mode !== undefined &&\n ![\"off\", \"all\", \"scoped\"].includes(String(value.mode))\n ) {\n throw new QoniValidationError(\"browserProxy.mode must be off, all, or scoped\");\n }\n if (\n value.region !== undefined &&\n (typeof value.region !== \"string\" ||\n !BROWSERBASE_REGIONS.has(value.region as BrowserbaseRegion))\n ) {\n throw new QoniValidationError(\"browserProxy.region is not supported\");\n }\n}\n\nexport function createDoAnythingNamespace(transport: QoniTransport) {\n /**\n * Wire-level escape hatch — 1:1 with the backend HTTP contract\n * (snake_case fields). Run-scoped methods use the single-ID route family\n * `/do_anything/runs/{run_id}` (qoni-sdk-public-surface.md §12.1); session\n * endpoints stay session-scoped. Shapes here may evolve with the API and\n * are not covered by the frozen public contract.\n */\n const api = {\n createSession: <T = unknown>(input: RuntimeTokenInput & JsonObject): Promise<QoniResponse<T>> =>\n transport.webAgentJson(\"POST\", \"/do_anything/sessions\", input.token, {\n body: omit(input, \"token\"),\n requiredScopes: [\"webagent.do_anything:manage\"],\n }),\n\n /**\n * `POST /do_anything/runs` — one call creates the run. Without\n * `session_id` a fresh session is created around the run; with it the\n * run is a follow-up in that session (409 while the prior run is\n * non-terminal).\n */\n createRun: <T = unknown>(input: RuntimeTokenInput & JsonObject): Promise<QoniResponse<T>> =>\n transport.webAgentJson(\"POST\", \"/do_anything/runs\", input.token, {\n body: normalizeDoAnythingRunInput(omit(input, \"token\")),\n requiredScopes: [\"webagent.do_anything:manage\"],\n }),\n\n getRun: <T = unknown>(\n input: RuntimeTokenInput & { runId: string; signal?: AbortSignal },\n ): Promise<QoniResponse<T>> =>\n transport.webAgentJson(\n \"GET\",\n `/do_anything/runs/${encodeURIComponent(input.runId)}`,\n input.token,\n {\n signal: input.signal,\n requiredScopes: [\"webagent.do_anything:read\"],\n },\n ),\n\n events: async function* <T = unknown>(\n input: RuntimeTokenInput & {\n runId: string;\n lastEventId?: string;\n signal?: AbortSignal;\n /**\n * Forwarded as the `include_screenshots` query flag — set false to\n * skip `run.screenshot` rows in the replay/backfill window.\n */\n includeScreenshots?: boolean;\n /**\n * Drop events for internal sub-runs (planning / grading) and yield only\n * the top-level run's events. Matches on `event.data.task_id`.\n * Default false.\n */\n onlyTopLevel?: boolean;\n onReconnect?: (info: { attempt: number; lastEventId?: string; error: unknown }) => void;\n },\n ): AsyncIterable<QoniEvent<T>> {\n const path = `/do_anything/runs/${encodeURIComponent(input.runId)}/events`;\n const stream = transport.webAgentSSE<T>(path, input.token, {\n lastEventId: input.lastEventId,\n requiredScopes: [\"webagent.do_anything:read\"],\n signal: input.signal,\n onReconnect: input.onReconnect,\n ...(input.includeScreenshots === undefined\n ? {}\n : { query: { include_screenshots: input.includeScreenshots } }),\n });\n for await (const event of stream) {\n if (input.onlyTopLevel) {\n const taskId = envelopeTaskId(event);\n if (taskId && taskId !== input.runId) continue; // skip sub-run events\n }\n yield event;\n }\n },\n\n intervene: <T = unknown>(\n input: RuntimeTokenInput & { runId: string } & JsonObject,\n ): Promise<QoniResponse<T>> =>\n transport.webAgentJson(\n \"POST\",\n `/do_anything/runs/${encodeURIComponent(input.runId)}/intervene`,\n input.token,\n {\n body: normalizeDoAnythingInterveneInput(omit(input, \"token\", \"runId\")),\n requiredScopes: [\"webagent.do_anything:manage\"],\n },\n ),\n\n cancel: <T = unknown>(\n input: RuntimeTokenInput & { runId: string; reason?: string },\n ): Promise<QoniResponse<T>> =>\n transport.webAgentJson(\n \"POST\",\n `/do_anything/runs/${encodeURIComponent(input.runId)}/cancel`,\n input.token,\n {\n body: omit(input, \"token\", \"runId\"),\n requiredScopes: [\"webagent.do_anything:manage\"],\n },\n ),\n\n readArtifacts: <T = DoAnythingSnapshot>(\n input: RuntimeTokenInput & { sessionId: string; artifactId: string },\n ): Promise<QoniResponse<T>> =>\n transport.webAgentJson(\n \"GET\",\n `/do_anything/sessions/${encodeURIComponent(input.sessionId)}/artifacts/${encodeURIComponent(input.artifactId)}`,\n input.token,\n {\n requiredScopes: [\"webagent.do_anything:read\"],\n },\n ),\n\n listArtifacts: <T = { items: JsonObject[] }>(\n input: RuntimeTokenInput & { runId: string; signal?: AbortSignal },\n ): Promise<QoniResponse<T>> => transport.webAgentJson(\n \"GET\", `/do_anything/runs/${encodeURIComponent(input.runId)}/artifacts`, input.token,\n { signal: input.signal, requiredScopes: [\"webagent.do_anything:read\"] },\n ),\n\n artifactDownloadUrl: (\n input: RuntimeTokenInput & { artifactId: string },\n ): Promise<QoniResponse<{ download_url: string; expires_in: number }>> => transport.webAgentJson(\n \"GET\", `/do_anything/artifacts/${encodeURIComponent(input.artifactId)}/download-url`, input.token,\n { requiredScopes: [\"webagent.do_anything:read\"] },\n ),\n\n readRecording: <T = unknown>(\n input: RuntimeTokenInput & { sessionId: string },\n ): Promise<QoniResponse<T>> =>\n transport.webAgentJson(\n \"GET\",\n `/do_anything/sessions/${encodeURIComponent(input.sessionId)}/recording`,\n input.token,\n {\n requiredScopes: [\"webagent.do_anything:read\"],\n },\n ),\n };\n\n /** Durable files for one run; also usable after reconnect without replaying SSE. */\n async function artifacts(input: RuntimeTokenInput & { runId: string; signal?: AbortSignal }): Promise<Artifact[]> {\n const { data } = await api.listArtifacts(input);\n if (!isJsonObject(data) || !Array.isArray(data.items)) {\n throw new QoniValidationError(\"artifact list response requires items\");\n }\n return data.items.map((item) => {\n if (!isJsonObject(item) || typeof item.id !== \"string\" || !item.id) {\n throw new QoniValidationError(\"artifact requires a nonempty id\");\n }\n const id = item.id;\n const artifact: Artifact = {\n id,\n name: typeof item.name === \"string\" ? item.name : undefined,\n mime: typeof item.mime_type === \"string\" ? item.mime_type : undefined,\n sizeBytes: typeof item.size_bytes === \"number\" ? item.size_bytes : undefined,\n createdAt: typeof item.created_at === \"string\" ? item.created_at : undefined,\n downloadUrl: typeof item.download_url === \"string\" ? item.download_url : undefined,\n expiresIn: typeof item.expires_in === \"number\" ? item.expires_in : undefined,\n content: async () => (await transport.webAgentBytes(\n `/do_anything/artifacts/${encodeURIComponent(id)}/blob`, input.token,\n { requiredScopes: [\"webagent.do_anything:read\"] },\n )).bytes,\n refreshDownloadUrl: async () => {\n const { data: link } = await api.artifactDownloadUrl({ token: input.token, artifactId: id });\n artifact.downloadUrl = link.download_url;\n artifact.expiresIn = link.expires_in;\n return link.download_url;\n },\n };\n return artifact;\n });\n }\n\n function buildOps(\n token: string | undefined,\n runId: string,\n capture: CaptureOptions | undefined,\n ): RunWireOps {\n return {\n listArtifacts: (signal) => artifacts({ token, runId, signal }),\n getDetail: async (signal) => asRecord((await api.getRun<unknown>({ token, runId, signal })).data),\n streamEvents: (opts) =>\n api.events({\n token,\n runId,\n lastEventId: opts.lastEventId,\n signal: opts.signal,\n onReconnect: opts.onReconnect,\n // Skip screenshot rows in backfill when the caller did not opt in.\n includeScreenshots: capture?.screenshots ? undefined : false,\n }),\n postAction: async (action, body, options) =>\n (\n await transport.webAgentJson(\n (action.method || \"POST\") as QoniHttpMethod,\n action.endpoint,\n token,\n {\n ...(body !== undefined ? { body } : {}),\n requiredScopes: options?.requiredScopes ?? interactionActionScopes(action, \"webagent.do_anything:manage\"),\n },\n )\n ).data,\n cancel: async (reason) =>\n asRecord(\n (\n await api.cancel<unknown>({\n token,\n runId,\n ...(reason === undefined ? {} : { reason }),\n })\n ).data,\n ),\n };\n }\n\n return {\n /** Start a run. Returns a handle — see `RunHandle` for the run lifecycle. */\n run: async (input: DoAnythingRunOptions): Promise<RunHandle<DoAnythingEvent>> => {\n const { token, prompt, capture, limits, session, ...rest } = input;\n if (!prompt || typeof prompt !== \"string\") {\n throw new QoniValidationError(\"doAnything.run requires a prompt string\");\n }\n validateBrowserProxyOptions(rest.browserProxy);\n\n // Fail loudly on options the wire create body cannot carry — a silent\n // drop would let callers believe a knob took effect when it never\n // reached the backend.\n const unsupported: string[] = PLATFORM_DECIDED_RUN_OPTIONS.filter(\n (key) => rest[key] !== undefined,\n );\n if (unsupported.length > 0) {\n throw new QoniValidationError(\n `doAnything.run does not support ${unsupported.join(\", \")} — the wire create body ` +\n \"has no such field (the platform decides these server-side), so the value would \" +\n \"be silently dropped. Remove it from the call.\",\n );\n }\n\n const created = await api.createRun<{ run_id?: string; id?: string; session_id?: string }>({\n token,\n instructions: prompt,\n ...rest,\n ...(session?.sessionId ? { sessionId: session.sessionId } : {}),\n ...(limits?.maxDurationMinutes !== undefined\n ? { maxDurationMinutes: limits.maxDurationMinutes }\n : {}),\n });\n const runId = created.data.run_id || created.data.id;\n if (!runId) {\n throw new QoniValidationError(\"doAnything run create did not return a run id\");\n }\n const sessionId =\n typeof created.data.session_id === \"string\" && created.data.session_id\n ? created.data.session_id\n : session?.sessionId;\n\n return new RunHandle<DoAnythingEvent>(buildOps(token, runId, capture), {\n id: runId,\n sessionRef: sessionId ? { sessionId } : undefined,\n capture,\n });\n },\n\n /**\n * Reconnect to an existing run by id. Verifies the run exists before\n * returning; `sessionRef` is adopted from the run detail envelope when\n * not supplied.\n */\n attach: async (\n runId: string,\n opts: DoAnythingAttachOptions,\n ): Promise<RunHandle<DoAnythingEvent>> => {\n const sessionId = opts.session?.sessionId;\n const handle = new RunHandle<DoAnythingEvent>(buildOps(opts.token, runId, opts.capture), {\n id: runId,\n sessionRef: sessionId ? { sessionId } : undefined,\n capture: opts.capture,\n });\n await handle.status();\n return handle;\n },\n\n artifacts,\n api,\n };\n}\n\n// camelCase conveniences → the snake_case fields of the wire create body\n// (CreateDoAnythingRunRequest). Keys already in wire shape pass through.\nfunction normalizeDoAnythingRunInput(input: JsonObject): JsonObject {\n const body = renameKeys(input, {\n sessionId: \"session_id\",\n profileId: \"profile_id\",\n keepAlive: \"keep_alive\",\n allowedActions: \"allowed_actions\",\n maxDurationMinutes: \"max_duration_minutes\",\n browserProxy: \"browser_proxy\",\n });\n const browserProxy = body.browser_proxy;\n if (isJsonObject(browserProxy)) {\n body.browser_proxy = renameKeys(browserProxy, { proxyId: \"proxy_id\" });\n }\n return body;\n}\n\nfunction normalizeDoAnythingInterveneInput(input: JsonObject): JsonObject {\n const body = renameKeys(input, { requestId: \"input_request_id\" });\n if (body.input_request_id !== undefined && body.kind === undefined) {\n body.kind = body.response === undefined ? \"skip_input_request\" : \"answer_input_request\";\n }\n return body;\n}\n\n// The run/task id on a WebAgent run event envelope (`event.data.task_id`) —\n// used to tell a top-level run's events from its internal sub-runs.\nfunction envelopeTaskId(event: QoniEvent): string | undefined {\n const env = event.data as { task_id?: unknown } | null | undefined;\n return env && typeof env === \"object\" && typeof env.task_id === \"string\"\n ? env.task_id\n : undefined;\n}\n\nfunction asRecord(value: unknown): JsonObject {\n return isJsonObject(value) ? value : {};\n}\n\nfunction omit(value: object, ...keys: string[]): JsonObject {\n const skipped = new Set(keys);\n const out: JsonObject = {};\n for (const [key, item] of Object.entries(value)) {\n if (!skipped.has(key) && item !== undefined) out[key] = item;\n }\n return out;\n}\n\nfunction renameKeys(value: JsonObject, mapping: Record<string, string>): JsonObject {\n const out: JsonObject = {};\n for (const [key, item] of Object.entries(value)) {\n const target = mapping[key] || key;\n if (out[target] === undefined) out[target] = item;\n }\n return out;\n}\n","import type {\n CompleteDelegateAgentInput,\n CompleteDelegateTokenInput,\n DelegateAgentInput,\n DelegateAgentResponse,\n DelegateTokenInteractiveInput,\n DelegateTokenInput,\n DelegateTokenResponse,\n DelegateTokenSilentResponse,\n DelegateTokenSilentInput,\n QoniResponse,\n QoniTransport,\n InteractiveDelegationResponse,\n} from \"./types\";\n\ntype DelegateToken = {\n (input: DelegateTokenInteractiveInput): Promise<QoniResponse<InteractiveDelegationResponse>>;\n (input: DelegateTokenSilentInput): Promise<QoniResponse<DelegateTokenSilentResponse>>;\n (input: DelegateTokenInput): Promise<QoniResponse<DelegateAgentResponse>>;\n};\ntype CompleteDelegateToken = (\n input: CompleteDelegateTokenInput,\n) => Promise<QoniResponse<DelegateTokenResponse>>;\n\nexport function createQoniNamespace(\n _transport: QoniTransport,\n delegateToken: DelegateToken,\n completeDelegateToken: CompleteDelegateToken,\n) {\n return {\n delegateToken,\n /** @deprecated Use delegateToken. */\n delegateAgent: (input: DelegateAgentInput) => delegateToken(input),\n completeDelegateToken,\n /** @deprecated Use completeDelegateToken. */\n completeDelegateAgent: (input: CompleteDelegateAgentInput) =>\n completeDelegateToken(input),\n };\n}\n","import type {\n QoniResponse, QoniTransport, JsonObject, DelegateTokenInput,\n DelegateTokenSilentInput, DelegateTokenInteractiveInput,\n DelegateTokenSilentResponse, InteractiveDelegationResponse, DelegateAgentResponse,\n} from \"./types\";\nimport { QoniValidationError } from \"./errors\";\n\nexport interface GenAuthAccessTokenInput {\n accessToken: string;\n}\n\nexport interface GenAuthDelegationIntrospectionInput {\n token?: string;\n /** @deprecated Use token. */\n delegateAgentToken?: string;\n}\n\nexport interface GenAuthAdminToken {\n accessToken: string;\n userPoolId: string;\n}\n\nexport type GenAuthAdminTokenProvider = () => Promise<GenAuthAdminToken>;\n\nexport interface GenAuthAdminTokenOverrideInput {\n adminToken?: string;\n userPoolId?: string;\n}\n\nexport type GenAuthUserListInput = GenAuthAdminTokenOverrideInput & {\n page?: number;\n limit?: number;\n options?: JsonObject & { pagination?: JsonObject };\n} & JsonObject;\nexport type GenAuthUserGetInput = GenAuthAdminTokenOverrideInput & { userId: string };\nexport type GenAuthUserGetBatchInput = GenAuthAdminTokenOverrideInput & { userIds: string[] };\nexport type GenAuthUserCreateInput = GenAuthAdminTokenOverrideInput & JsonObject;\nexport type GenAuthUserCreateBatchInput = GenAuthAdminTokenOverrideInput & {\n users?: JsonObject[];\n list?: JsonObject[];\n options?: JsonObject;\n};\nexport type GenAuthUserUpdateInput = GenAuthAdminTokenOverrideInput & { userId: string } & JsonObject;\nexport type GenAuthUserDeleteBatchInput = GenAuthAdminTokenOverrideInput & { userIds: string[] };\n\nexport function createGenAuthNamespace(\n transport: QoniTransport,\n options: {\n adminTokenFor?: GenAuthAdminTokenProvider;\n delegateTokenFor?: (input: DelegateTokenInput) => Promise<QoniResponse<DelegateAgentResponse>>;\n } = {},\n) {\n // The compatibility entry returns the grant itself; root delegateToken keeps\n // the existing QoniResponse envelope, including its transport metadata.\n function delegateAgent(input: DelegateTokenSilentInput): Promise<DelegateTokenSilentResponse>;\n function delegateAgent(input: DelegateTokenInteractiveInput): Promise<InteractiveDelegationResponse>;\n function delegateAgent(input: DelegateTokenInput): Promise<DelegateAgentResponse>;\n async function delegateAgent(input: DelegateTokenInput): Promise<DelegateAgentResponse> {\n if (!options.delegateTokenFor) {\n throw new QoniValidationError(\"GenAuth delegateAgent requires a Qoni delegation provider\");\n }\n return (await options.delegateTokenFor(input)).data;\n }\n return {\n delegateAgent,\n userInfo: <T = unknown>(input: GenAuthAccessTokenInput): Promise<QoniResponse<T>> =>\n transport.genauthJson(\"GET\", \"/oidc/me\", input.accessToken),\n\n jwks: <T = unknown>(): Promise<QoniResponse<T>> =>\n transport.genauthJson(\"GET\", \"/oidc/.well-known/jwks.json\"),\n\n discovery: <T = unknown>(): Promise<QoniResponse<T>> =>\n transport.genauthJson(\"GET\", \"/oidc/.well-known/openid-configuration\"),\n\n introspectDelegationToken: <T = unknown>(\n input: GenAuthDelegationIntrospectionInput,\n ): Promise<QoniResponse<T>> =>\n transport.genauthJson(\"POST\", \"/api/v3/eak/delegations/introspect\", undefined, {\n body: { token: requiredDelegationToken(input) },\n }),\n\n users: {\n list: async <T = unknown>(input: GenAuthUserListInput = {}): Promise<QoniResponse<T>> => {\n const auth = await adminAuthFor(options.adminTokenFor, input);\n return transport.genauthJson(\"POST\", \"/api/v3/list-users\", auth.accessToken, {\n body: listUsersBody(input),\n headers: userPoolHeaders(auth.userPoolId),\n });\n },\n\n get: async <T = unknown>(input: GenAuthUserGetInput): Promise<QoniResponse<T>> => {\n const auth = await adminAuthFor(options.adminTokenFor, input);\n return transport.genauthJson(\"GET\", \"/api/v3/get-user\", auth.accessToken, {\n query: omit(input, \"adminToken\", \"userPoolId\"),\n headers: userPoolHeaders(auth.userPoolId),\n });\n },\n\n getBatch: async <T = unknown>(\n input: GenAuthUserGetBatchInput,\n ): Promise<QoniResponse<T>> => {\n const auth = await adminAuthFor(options.adminTokenFor, input);\n return transport.genauthJson(\"GET\", \"/api/v3/get-user-batch\", auth.accessToken, {\n query: omit(input, \"adminToken\", \"userPoolId\"),\n headers: userPoolHeaders(auth.userPoolId),\n });\n },\n\n create: async <T = unknown>(input: GenAuthUserCreateInput): Promise<QoniResponse<T>> => {\n const auth = await adminAuthFor(options.adminTokenFor, input);\n return transport.genauthJson(\"POST\", \"/api/v3/create-user\", auth.accessToken, {\n body: omit(input, \"adminToken\", \"userPoolId\"),\n headers: userPoolHeaders(auth.userPoolId),\n });\n },\n\n createBatch: async <T = unknown>(\n input: GenAuthUserCreateBatchInput,\n ): Promise<QoniResponse<T>> => {\n const auth = await adminAuthFor(options.adminTokenFor, input);\n return transport.genauthJson(\"POST\", \"/api/v3/create-users-batch\", auth.accessToken, {\n body: createUsersBatchBody(input),\n headers: userPoolHeaders(auth.userPoolId),\n });\n },\n\n update: async <T = unknown>(input: GenAuthUserUpdateInput): Promise<QoniResponse<T>> => {\n const auth = await adminAuthFor(options.adminTokenFor, input);\n return transport.genauthJson(\"POST\", \"/api/v3/update-user\", auth.accessToken, {\n body: omit(input, \"adminToken\", \"userPoolId\"),\n headers: userPoolHeaders(auth.userPoolId),\n });\n },\n\n deleteBatch: async <T = unknown>(\n input: GenAuthUserDeleteBatchInput,\n ): Promise<QoniResponse<T>> => {\n const auth = await adminAuthFor(options.adminTokenFor, input);\n return transport.genauthJson(\"POST\", \"/api/v3/delete-users-batch\", auth.accessToken, {\n body: omit(input, \"adminToken\", \"userPoolId\"),\n headers: userPoolHeaders(auth.userPoolId),\n });\n },\n },\n };\n}\n\nfunction requiredDelegationToken(input: GenAuthDelegationIntrospectionInput): string {\n const token = input.token ?? input.delegateAgentToken;\n if (token?.trim()) return token;\n throw new Error(\"GenAuth delegation introspection requires token\");\n}\n\nasync function adminAuthFor(\n provider: GenAuthAdminTokenProvider | undefined,\n input: GenAuthAdminTokenOverrideInput,\n): Promise<GenAuthAdminToken> {\n if (input.adminToken?.trim()) {\n if (!input.userPoolId?.trim()) {\n throw new Error(\"GenAuth adminToken override requires userPoolId\");\n }\n return { accessToken: input.adminToken, userPoolId: input.userPoolId };\n }\n if (!provider) throw new Error(\"GenAuth user management requires Qoni AK/SK admin token exchange\");\n return provider();\n}\n\nfunction userPoolHeaders(userPoolId: string): Record<string, string> {\n return { \"x-authing-userpool-id\": userPoolId };\n}\n\nfunction omit(value: object, ...keys: string[]): JsonObject {\n const skipped = new Set(keys);\n const out: JsonObject = {};\n for (const [key, item] of Object.entries(value)) {\n if (!skipped.has(key) && item !== undefined) out[key] = item;\n }\n return out;\n}\n\nfunction listUsersBody(input: GenAuthUserListInput): JsonObject {\n const body = omit(input, \"adminToken\", \"userPoolId\", \"page\", \"limit\");\n if (input.page === undefined && input.limit === undefined) return body;\n const options = isJsonObject(body.options) ? { ...body.options } : {};\n const pagination = isJsonObject(options.pagination) ? { ...options.pagination } : {};\n if (input.page !== undefined) pagination.page = input.page;\n if (input.limit !== undefined) pagination.limit = input.limit;\n options.pagination = pagination;\n body.options = options;\n return body;\n}\n\nfunction createUsersBatchBody(input: GenAuthUserCreateBatchInput): JsonObject {\n const body = omit(input, \"adminToken\", \"userPoolId\", \"users\");\n if (input.users && !body.list) body.list = input.users;\n return body;\n}\n\nfunction isJsonObject(value: unknown): value is JsonObject {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n","import type { QoniResponse, QoniTransport, JsonObject, RuntimeTokenInput } from \"./types\";\n\nexport interface GumemCreateSessionInput extends RuntimeTokenInput {\n userId?: string;\n sessionId?: string;\n /** @deprecated Use userId. */\n user_id?: string;\n /** @deprecated Use sessionId. */\n session_id?: string;\n title?: string;\n metadata?: JsonObject;\n}\n\nexport interface GumemAddMessagesInput extends RuntimeTokenInput {\n sessionId: string;\n messages: JsonObject[];\n sync?: boolean;\n userId?: string;\n /** @deprecated Use userId. */\n user_id?: string;\n}\n\nexport interface GumemRecallInput extends RuntimeTokenInput {\n sessionId?: string;\n query?: string;\n details?: boolean;\n recallConfig?: JsonObject;\n metadataFilters?: JsonObject;\n /** @deprecated Use recallConfig. */\n recall_config?: JsonObject;\n /** @deprecated Use metadataFilters. */\n metadata_filters?: JsonObject;\n}\n\nexport interface GumemUploadResourceInput extends RuntimeTokenInput {\n userId?: string;\n sessionId?: string;\n /** @deprecated Use userId. */\n user_id?: string;\n /** @deprecated Use sessionId. */\n session_id?: string;\n file: Blob | File;\n filename?: string;\n contentType?: string;\n}\n\nexport function createGumemNamespace(transport: QoniTransport) {\n return {\n createSession: <T = unknown>(input: GumemCreateSessionInput): Promise<QoniResponse<T>> =>\n transport.gumemJson(\"POST\", \"/api/sessions\", input.token, {\n body: gumemBody(omit(input, \"token\")),\n requiredScopes: [\"gumem.memory:write\"],\n }),\n\n addMessages: <T = unknown>(input: GumemAddMessagesInput): Promise<QoniResponse<T>> =>\n transport.gumemJson(\n \"POST\",\n `/api/sessions/${encodeURIComponent(input.sessionId)}/messages`,\n input.token,\n {\n body: gumemBody(omit(input, \"token\", \"sessionId\")),\n requiredScopes: [\"gumem.memory:write\"],\n },\n ),\n\n recall: <T = unknown>(input: GumemRecallInput): Promise<QoniResponse<T>> =>\n transport.gumemJson(\n \"POST\",\n `/api/sessions/${encodeURIComponent(input.sessionId || \"default\")}/context`,\n input.token,\n {\n query: { query: input.query || \"\", details: input.details ?? false },\n body: gumemBody(omit(input, \"token\", \"sessionId\", \"query\", \"details\")),\n requiredScopes: [\"gumem.memory:read\"],\n },\n ),\n\n uploadResource: <T = unknown>(input: GumemUploadResourceInput): Promise<QoniResponse<T>> => {\n const form = new FormData();\n form.set(\"file\", input.file, input.filename);\n const userId = input.userId ?? input.user_id;\n const sessionId = input.sessionId ?? input.session_id;\n if (userId) form.set(\"user_id\", userId);\n if (sessionId) form.set(\"session_id\", sessionId);\n if (input.contentType) form.set(\"content_type\", input.contentType);\n return transport.gumemJson(\"POST\", \"/api/resources\", input.token, {\n body: form,\n requiredScopes: [\"gumem.memory:write\"],\n });\n },\n\n actions: {\n record: <T = unknown>(input: RuntimeTokenInput & JsonObject): Promise<QoniResponse<T>> =>\n transport.gumemJson(\"POST\", \"/api/user/actions\", input.token, {\n body: omit(input, \"token\"),\n requiredScopes: [\"gumem.action:write\"],\n }),\n\n recall: <T = unknown>(input: RuntimeTokenInput & JsonObject): Promise<QoniResponse<T>> =>\n transport.gumemJson(\"GET\", \"/api/user/actions/query\", input.token, {\n query: omit(input, \"token\"),\n requiredScopes: [\"gumem.action:read\"],\n }),\n\n stream: <T = unknown>(input: RuntimeTokenInput & JsonObject): Promise<QoniResponse<T>> =>\n transport.gumemJson(\"GET\", \"/api/user/actions/stream\", input.token, {\n query: omit(input, \"token\"),\n requiredScopes: [\"gumem.action:read\"],\n }),\n },\n };\n}\n\nfunction omit(value: object, ...keys: string[]): JsonObject {\n const skipped = new Set(keys);\n const out: JsonObject = {};\n for (const [key, item] of Object.entries(value)) {\n if (!skipped.has(key) && item !== undefined) out[key] = item;\n }\n return out;\n}\n\nfunction gumemBody(value: JsonObject): JsonObject {\n return renameKeys(value, {\n userId: \"user_id\",\n sessionId: \"session_id\",\n recallConfig: \"recall_config\",\n metadataFilters: \"metadata_filters\",\n });\n}\n\nfunction renameKeys(value: JsonObject, mapping: Record<string, string>): JsonObject {\n const out: JsonObject = {};\n for (const [key, item] of Object.entries(value)) {\n const target = mapping[key] || key;\n if (out[target] === undefined) out[target] = item;\n }\n return out;\n}\n","import { QoniValidationError } from \"./errors\";\nimport {\n InteractionHandle,\n foldInteraction,\n rememberBounded,\n interactionSettled,\n markLoginEnded,\n INTERACTION_MEMORY_LIMIT,\n interactionActionScopes,\n type Interaction,\n type LoginSessionStore,\n} from \"./interactions\";\nimport { camelizeKeys, normalizeRunEvent, type MonitorEvent } from \"./run-events\";\nimport {\n isJsonObject,\n type QoniEvent,\n type QoniHttpMethod,\n type QoniResponse,\n type QoniTransport,\n type JsonObject,\n type RuntimeTokenInput,\n} from \"./types\";\nimport type { Action } from \"./interactions\";\n\nexport interface TrackCreateOptions {\n /** Delegation token — passed once here; the returned handle holds it. */\n token: string;\n /** Natural-language description of what to monitor. */\n prompt: string;\n /** Rest of the monitor definition (url, schedule, …) — camelCase keys. */\n [key: string]: unknown;\n}\n\nexport interface TrackAttachOptions {\n token: string;\n}\n\nexport interface MonitorEventsOptions {\n lastEventId?: string;\n signal?: AbortSignal;\n}\n\nexport interface MonitorRunsOptions {\n limit?: number;\n offset?: number;\n}\n\n/** A monitor's check cadence. */\nexport type MonitorSchedule =\n | { kind: \"cron\"; expr: string; /** IANA time zone for the cron expression. */ tz?: string }\n | { kind: \"interval\"; intervalSeconds: number; tz?: string };\n\n/**\n * Fields to change on a monitor via {@link MonitorHandle.refine}. Pass any\n * subset; at least one is required. The monitor's natural-language `intent`\n * is NOT refinable — it drives URL/schema/DSL generation, so changing it means\n * creating a new monitor.\n */\nexport interface MonitorRefinePatch {\n schedule?: MonitorSchedule;\n targetUrls?: string[];\n extractionSchema?: JsonObject;\n triggerDsl?: JsonObject;\n stopConditionDsl?: JsonObject;\n notifyChannel?: JsonObject | null;\n [key: string]: unknown;\n}\n\ninterface MonitorWireOps {\n get(): Promise<JsonObject>;\n update(input: JsonObject): Promise<JsonObject>;\n runNow(): Promise<JsonObject>;\n streamEvents(opts: MonitorEventsOptions): AsyncIterable<QoniEvent<unknown>>;\n postAction(\n action: Action,\n body: JsonObject | undefined,\n options?: { requiredScopes?: readonly string[] },\n ): Promise<unknown>;\n listRuns(opts: MonitorRunsOptions): Promise<JsonObject>;\n getRun(runId: string): Promise<JsonObject>;\n delete(): Promise<void>;\n}\n\n/**\n * Handle to a Track monitor — a resident resource (unlike a one-shot run).\n * Holds the delegation token and monitor id internally; no method takes a\n * token or an id.\n */\nexport class MonitorHandle {\n readonly id: string;\n /** Login sessions opened on this monitor's interactions — see {@link interactionHandle}. */\n readonly #loginSessions: LoginSessionStore = new Map();\n /** Latest card per interaction id, so settling shells fold onto it. */\n readonly #interactions = new Map<string, Interaction>();\n\n constructor(private readonly ops: MonitorWireOps, id: string) {\n this.id = id;\n }\n\n /** Refresh and return the monitor (normalized camelCase fields). */\n async get(): Promise<JsonObject> {\n return normalizeMonitorRecord(await this.ops.get());\n }\n\n /**\n * Pause the monitor — stops scheduled ticks until {@link resume}. The\n * monitor stays addressable; this is the way to \"stop monitoring\" without\n * deleting.\n */\n async pause(): Promise<JsonObject> {\n return normalizeMonitorRecord(await this.ops.update({ action: \"pause\" }));\n }\n\n /** Resume a paused monitor. */\n async resume(): Promise<JsonObject> {\n return normalizeMonitorRecord(await this.ops.update({ action: \"resume\" }));\n }\n\n /**\n * Change the monitor definition. Pass any subset of fields (at least one);\n * `schedule` is `{ kind: \"cron\", expr }` or `{ kind: \"interval\", intervalSeconds }`.\n * The backend re-validates the trigger DSL against the schema, so a bad\n * change is rejected, not applied. The natural-language intent is not\n * refinable — create a new monitor to change it.\n */\n async refine(patch: MonitorRefinePatch): Promise<JsonObject> {\n const { schedule, ...rest } = patch;\n const body: JsonObject = snakeifyKeys(rest as JsonObject);\n if (schedule) body.schedule = normalizeSchedule(schedule);\n if (Object.keys(body).length === 0) {\n throw new QoniValidationError(\n \"track refine requires at least one field to change (schedule / targetUrls / \" +\n \"extractionSchema / triggerDsl / stopConditionDsl / notifyChannel)\",\n );\n }\n return normalizeMonitorRecord(await this.ops.update({ action: \"refine\", patch: body }));\n }\n\n /** Trigger an immediate tick outside the schedule. */\n async runNow(): Promise<JsonObject> {\n return normalizeMonitorRecord(await this.ops.runNow());\n }\n\n /**\n * Stream semantic monitor events. Monitors are resident, so the stream has\n * no terminal event — it ends only when closed by the caller or the server.\n */\n async *events(opts: MonitorEventsOptions = {}): AsyncIterable<MonitorEvent> {\n for await (const wire of this.ops.streamEvents(opts)) {\n let event = normalizeRunEvent(wire);\n if (event?.type === \"interaction\") {\n const card = foldInteraction(this.#interactions.get(event.data.id), event.data);\n rememberBounded(this.#interactions, card.id, card, INTERACTION_MEMORY_LIMIT, interactionSettled);\n markLoginEnded(this.#loginSessions, card);\n event = { ...event, data: card };\n }\n // The monitor stream only carries core + Track events; the cast narrows\n // the full RunEvent union to that subset.\n if (event) yield event as MonitorEvent;\n }\n }\n\n /**\n * Wrap an {@link Interaction} (from `event.data` of an `interaction` event on\n * the monitor stream — e.g. a `site_login` to unlock a `needs_reauth` park)\n * in a typed {@link InteractionHandle}. The handle's action methods post to\n * the endpoint the backend declared for that action. Handles of one\n * MonitorHandle share the login sessions `openLogin()` opens.\n */\n interactionHandle(interaction: Interaction): InteractionHandle {\n return new InteractionHandle(\n interaction,\n (action, body, options) => this.ops.postAction(action, body, options),\n this.#loginSessions,\n );\n }\n\n /**\n * Read-only list of the runs the monitor's ticks produced. Tick runs are\n * owned by the scheduler — to stop monitoring use `pause()` / `delete()`.\n */\n async runs(opts: MonitorRunsOptions = {}): Promise<JsonObject[]> {\n const data = await this.ops.listRuns(opts);\n const items = Array.isArray(data.items) ? data.items : Array.isArray(data.runs) ? data.runs : [];\n return items.filter(isJsonObject).map(normalizeMonitorRun);\n }\n\n /** Read-only detail of a single tick run. */\n async run(runId: string): Promise<JsonObject> {\n return normalizeMonitorRun(await this.ops.getRun(runId));\n }\n\n /** Delete the monitor. */\n async delete(): Promise<void> {\n await this.ops.delete();\n }\n}\n\nexport function createTrackNamespace(transport: QoniTransport) {\n /**\n * Wire-level escape hatch — 1:1 with the backend HTTP contract. Shapes\n * here may evolve with the API and are not covered by the frozen public\n * contract.\n */\n const api = {\n createMonitor: <T = unknown>(input: RuntimeTokenInput & JsonObject): Promise<QoniResponse<T>> =>\n transport.webAgentJson(\"POST\", \"/track/monitors\", input.token, {\n body: omit(input, \"token\"),\n requiredScopes: [\"webagent.track:manage\"],\n }),\n\n getMonitor: <T = unknown>(\n input: RuntimeTokenInput & { monitorId: string },\n ): Promise<QoniResponse<T>> =>\n transport.webAgentJson(\n \"GET\",\n `/track/monitors/${encodeURIComponent(input.monitorId)}`,\n input.token,\n {\n requiredScopes: [\"webagent.track:read\"],\n },\n ),\n\n runNow: <T = unknown>(\n input: RuntimeTokenInput & { monitorId: string },\n ): Promise<QoniResponse<T>> =>\n transport.webAgentJson(\n \"POST\",\n `/track/monitors/${encodeURIComponent(input.monitorId)}/run_now`,\n input.token,\n {\n body: {},\n requiredScopes: [\"webagent.track:manage\"],\n },\n ),\n\n events: <T = unknown>(\n input: RuntimeTokenInput & { monitorId: string; lastEventId?: string; signal?: AbortSignal },\n ): AsyncIterable<QoniEvent<T>> =>\n transport.webAgentSSE(\n `/track/monitors/${encodeURIComponent(input.monitorId)}/events`,\n input.token,\n {\n lastEventId: input.lastEventId,\n requiredScopes: [\"webagent.track:read\"],\n signal: input.signal,\n },\n ),\n\n intervene: <T = unknown>(\n input: RuntimeTokenInput & { monitorId: string } & JsonObject,\n ): Promise<QoniResponse<T>> =>\n transport.webAgentJson(\n \"POST\",\n `/track/monitors/${encodeURIComponent(input.monitorId)}/intervene`,\n input.token,\n {\n body: normalizeTrackInterveneInput(omit(input, \"token\", \"monitorId\")),\n requiredScopes: [\"webagent.track:manage\"],\n },\n ),\n\n listRuns: <T = unknown>(\n input: RuntimeTokenInput & { monitorId: string; limit?: number; offset?: number },\n ): Promise<QoniResponse<T>> =>\n transport.webAgentJson(\n \"GET\",\n `/track/monitors/${encodeURIComponent(input.monitorId)}/runs`,\n input.token,\n {\n query: omit(input, \"token\", \"monitorId\"),\n requiredScopes: [\"webagent.track:read\"],\n },\n ),\n\n getRun: <T = unknown>(\n input: RuntimeTokenInput & { monitorId: string; runId: string },\n ): Promise<QoniResponse<T>> =>\n transport.webAgentJson(\n \"GET\",\n `/track/monitors/${encodeURIComponent(input.monitorId)}/runs/${encodeURIComponent(input.runId)}`,\n input.token,\n {\n requiredScopes: [\"webagent.track:read\"],\n },\n ),\n\n updateMonitor: <T = unknown>(\n input: RuntimeTokenInput & { monitorId: string } & JsonObject,\n ): Promise<QoniResponse<T>> =>\n transport.webAgentJson(\n \"PATCH\",\n `/track/monitors/${encodeURIComponent(input.monitorId)}`,\n input.token,\n {\n body: omit(input, \"token\", \"monitorId\"),\n requiredScopes: [\"webagent.track:manage\"],\n },\n ),\n\n deleteMonitor: <T = unknown>(\n input: RuntimeTokenInput & { monitorId: string },\n ): Promise<QoniResponse<T>> =>\n transport.webAgentJson(\n \"DELETE\",\n `/track/monitors/${encodeURIComponent(input.monitorId)}`,\n input.token,\n {\n // Backend DELETE /track/monitors/{id} requires track:manage\n // (see api/v1/track/monitors.py:delete_monitor).\n requiredScopes: [\"webagent.track:manage\"],\n },\n ),\n };\n\n function buildOps(token: string | undefined, monitorId: string): MonitorWireOps {\n return {\n get: async () => asRecord((await api.getMonitor<unknown>({ token, monitorId })).data),\n update: async (input) =>\n asRecord((await api.updateMonitor<unknown>({ token, monitorId, ...input })).data),\n runNow: async () => asRecord((await api.runNow<unknown>({ token, monitorId })).data),\n streamEvents: (opts) =>\n api.events({ token, monitorId, lastEventId: opts.lastEventId, signal: opts.signal }),\n postAction: async (action, body, options) =>\n (\n await transport.webAgentJson(\n (action.method || \"POST\") as QoniHttpMethod,\n action.endpoint,\n token,\n {\n ...(body !== undefined ? { body } : {}),\n requiredScopes: options?.requiredScopes ?? interactionActionScopes(action, \"webagent.track:manage\"),\n },\n )\n ).data,\n listRuns: async (opts) =>\n asRecord((await api.listRuns<unknown>({ token, monitorId, ...opts })).data),\n getRun: async (runId) =>\n asRecord((await api.getRun<unknown>({ token, monitorId, runId })).data),\n delete: async () => {\n await api.deleteMonitor({ token, monitorId });\n },\n };\n }\n\n return {\n /** Create a monitor. Returns a handle — see `MonitorHandle`. */\n create: async (input: TrackCreateOptions): Promise<MonitorHandle> => {\n const { token, prompt, ...rest } = input;\n if (!prompt || typeof prompt !== \"string\") {\n throw new QoniValidationError(\"track.create requires a prompt string\");\n }\n const body = snakeifyKeys(rest);\n // Same wire shape as refine(): `{ kind: \"interval\", intervalSeconds }`\n // must reach the backend as `interval_seconds`, or it falls back to its\n // default interval.\n if (body.schedule !== undefined) body.schedule = normalizeSchedule(body.schedule);\n const created = await api.createMonitor<{ id?: string; monitor_id?: string }>({\n token,\n intent: prompt,\n ...body,\n });\n const monitorId = created.data.id || created.data.monitor_id;\n if (!monitorId) {\n throw new QoniValidationError(\"track monitor create did not return a monitor id\");\n }\n return new MonitorHandle(buildOps(token, monitorId), monitorId);\n },\n\n /** Reconnect to an existing monitor. Verifies it exists before returning. */\n attach: async (monitorId: string, opts: TrackAttachOptions): Promise<MonitorHandle> => {\n const handle = new MonitorHandle(buildOps(opts.token, monitorId), monitorId);\n await handle.get();\n return handle;\n },\n\n api,\n };\n}\n\n// Tick runs are read-only views — normalize to camelCase and guarantee a\n// uniform `id` regardless of which wire field carried it.\nfunction normalizeMonitorRun(item: JsonObject): JsonObject {\n const normalized = normalizeMonitorRecord(item);\n if (typeof normalized.id !== \"string\" || !normalized.id) {\n const id = normalized.runId ?? normalized.snapshotId;\n if (typeof id === \"string\" && id) normalized.id = id;\n }\n return normalized;\n}\n\nfunction normalizeTrackInterveneInput(input: JsonObject): JsonObject {\n return renameKeys(input, { requestId: \"request_id\" });\n}\n\n// Wire fields whose keys are user-defined (the extraction schema's field names\n// and the values extracted for them). camelCase normalization stops at these\n// keys: `{ source_url: \"string\" }` must read back as `source_url`.\nconst USER_KEYED_FIELDS = new Set([\"extraction_schema\", \"baseline_extracted\", \"extracted\"]);\n// Inside each `diffs[]` entry, these carry extracted values keyed by the user's\n// field names (field_diff before/after) or list items keyed the same way\n// (list_diff added/removed/sample_unchanged). fingerprint_diff carries hashes only.\nconst USER_KEYED_DIFF_FIELDS = new Set([\"before\", \"after\", \"added\", \"removed\", \"sample_unchanged\"]);\n\n/** camelCase a monitor / tick record, leaving user-keyed field contents verbatim. */\nfunction normalizeMonitorRecord(value: JsonObject): JsonObject {\n const out: JsonObject = {};\n for (const [key, item] of Object.entries(value)) {\n if (USER_KEYED_FIELDS.has(key)) out[camelKey(key)] = item;\n else if (key === \"diffs\" && Array.isArray(item)) out.diffs = item.map(normalizeDiff);\n else out[camelKey(key)] = camelizeKeys(item);\n }\n return out;\n}\n\nfunction normalizeDiff(entry: unknown): unknown {\n if (!isJsonObject(entry)) return camelizeKeys(entry);\n const out: JsonObject = {};\n for (const [key, item] of Object.entries(entry)) {\n out[camelKey(key)] = USER_KEYED_DIFF_FIELDS.has(key) ? item : camelizeKeys(item);\n }\n return out;\n}\n\nfunction camelKey(key: string): string {\n return key.replace(/_([a-z0-9])/g, (_, ch: string) => ch.toUpperCase());\n}\n\n/**\n * Normalize a {@link MonitorSchedule} to the backend's wire shape\n * (`{ kind, expr | interval_seconds, tz }`). Only `intervalSeconds` is renamed;\n * every other field (such as `tz`) passes through unchanged. Accepts an already\n * snake_case `interval_seconds`; kinds other than interval/cron pass through for\n * the backend to validate.\n */\nfunction normalizeSchedule(schedule: unknown): unknown {\n if (!isJsonObject(schedule)) return schedule;\n if (schedule.kind === \"interval\") {\n const { intervalSeconds, interval_seconds, ...rest } = schedule;\n const seconds = intervalSeconds ?? interval_seconds;\n if (typeof seconds !== \"number\" || !Number.isFinite(seconds) || seconds <= 0) {\n throw new QoniValidationError(\n 'track interval schedule needs a positive number: { kind: \"interval\", intervalSeconds }',\n );\n }\n return { ...rest, interval_seconds: seconds };\n }\n if (schedule.kind === \"cron\" && (typeof schedule.expr !== \"string\" || !schedule.expr.trim())) {\n throw new QoniValidationError('track cron schedule needs an expression: { kind: \"cron\", expr }');\n }\n return schedule;\n}\n\n/** Shallow camelCase → snake_case for wire bodies; nested values untouched. */\nfunction snakeifyKeys(value: JsonObject): JsonObject {\n const out: JsonObject = {};\n for (const [key, item] of Object.entries(value)) {\n if (item === undefined) continue;\n out[key.replace(/([A-Z])/g, (_, ch: string) => `_${ch.toLowerCase()}`)] = item;\n }\n return out;\n}\n\nfunction asRecord(value: unknown): JsonObject {\n return isJsonObject(value) ? value : {};\n}\n\nfunction omit(value: object, ...keys: string[]): JsonObject {\n const skipped = new Set(keys);\n const out: JsonObject = {};\n for (const [key, item] of Object.entries(value)) {\n if (!skipped.has(key) && item !== undefined) out[key] = item;\n }\n return out;\n}\n\nfunction renameKeys(value: JsonObject, mapping: Record<string, string>): JsonObject {\n const out: JsonObject = {};\n for (const [key, item] of Object.entries(value)) {\n const target = mapping[key] || key;\n if (out[target] === undefined) out[target] = item;\n }\n return out;\n}\n","import { QoniError, QoniValidationError } from \"./errors\";\nimport {\n RunHandle,\n type CaptureOptions,\n type RunWireOps,\n type SessionRef,\n} from \"./run-handle\";\nimport type { WebSearchEvent } from \"./run-events\";\nimport type { RunLimits } from \"./do-anything\";\nimport {\n isJsonObject,\n type QoniEvent,\n type QoniResponse,\n type QoniTransport,\n type JsonObject,\n type RuntimeTokenInput,\n} from \"./types\";\n\nexport interface WebSearchRunOptions {\n /** Delegation token — passed once here; the returned handle holds it. */\n token: string;\n /** What to search for — one query, or several for a multi-query search. */\n prompt: string | string[];\n capture?: CaptureOptions;\n /** Not supported by webSearch yet — passing it throws locally. */\n limits?: RunLimits;\n /** Not supported by webSearch — searches don't run in reusable sessions. */\n session?: SessionRef;\n // Product-specific options stay camelCase.\n maxResultsPerQuery?: number;\n siteWhitelist?: string[];\n siteBlacklist?: string[];\n [key: string]: unknown;\n}\n\nexport interface WebSearchAttachOptions {\n token: string;\n capture?: CaptureOptions;\n}\n\nexport function createWebSearchNamespace(transport: QoniTransport) {\n /**\n * Wire-level escape hatch — 1:1 with the backend HTTP contract. Shapes\n * here may evolve with the API and are not covered by the frozen public\n * contract.\n */\n const api = {\n run: <T = unknown>(input: RuntimeTokenInput & JsonObject): Promise<QoniResponse<T>> =>\n transport.webAgentJson(\"POST\", \"/web_search/runs\", input.token, {\n body: normalizeWebSearchRunInput(omit(input, \"token\")),\n requiredScopes: [\"webagent.web_search:manage\"],\n }),\n\n get: <T = unknown>(input: RuntimeTokenInput & { runId: string; signal?: AbortSignal }): Promise<QoniResponse<T>> =>\n transport.webAgentJson(\n \"GET\",\n `/web_search/runs/${encodeURIComponent(input.runId)}`,\n input.token,\n {\n signal: input.signal,\n requiredScopes: [\"webagent.web_search:read\"],\n },\n ),\n\n events: <T = unknown>(\n input: RuntimeTokenInput & {\n runId: string;\n lastEventId?: string;\n signal?: AbortSignal;\n onReconnect?: (info: { attempt: number; lastEventId?: string; error: unknown }) => void;\n },\n ): AsyncIterable<QoniEvent<T>> =>\n transport.webAgentSSE(\n `/web_search/runs/${encodeURIComponent(input.runId)}/events`,\n input.token,\n {\n lastEventId: input.lastEventId,\n requiredScopes: [\"webagent.web_search:read\"],\n signal: input.signal,\n onReconnect: input.onReconnect,\n },\n ),\n\n cancel: <T = unknown>(\n input: RuntimeTokenInput & { runId: string; reason?: string },\n ): Promise<QoniResponse<T>> =>\n transport.webAgentJson(\n \"POST\",\n `/web_search/runs/${encodeURIComponent(input.runId)}/cancel`,\n input.token,\n {\n body: omit(input, \"token\", \"runId\"),\n requiredScopes: [\"webagent.web_search:manage\"],\n },\n ),\n };\n\n function buildOps(\n token: string | undefined,\n runId: string,\n ): RunWireOps {\n return {\n getDetail: async (signal) => asRecord((await api.get<unknown>({ token, runId, signal })).data),\n streamEvents: (opts) =>\n api.events({\n token,\n runId,\n lastEventId: opts.lastEventId,\n signal: opts.signal,\n onReconnect: opts.onReconnect,\n }),\n postAction: async () => {\n // webSearch runs never emit interactions; failing loudly beats a\n // confusing 404.\n throw new QoniError(\n \"webSearch runs never request interaction — there is no action to invoke\",\n { code: \"validation.failed\" },\n );\n },\n cancel: async (reason) =>\n asRecord(\n (\n await api.cancel<unknown>({\n token,\n runId,\n ...(reason === undefined ? {} : { reason }),\n })\n ).data,\n ),\n };\n }\n\n return {\n /** Start a search run. Returns a handle — see `RunHandle` for the run lifecycle. */\n run: async (input: WebSearchRunOptions): Promise<RunHandle<WebSearchEvent>> => {\n const { token, prompt, capture, limits, session, ...rest } = input;\n if (session) {\n throw new QoniValidationError(\n \"webSearch runs do not execute in reusable sessions — drop the session option\",\n );\n }\n if (limits) {\n throw new QoniValidationError(\n \"webSearch does not support limits yet — drop the limits option\",\n );\n }\n const resolvedQueries = Array.isArray(prompt) ? prompt : prompt ? [prompt] : undefined;\n if (!resolvedQueries || resolvedQueries.length === 0) {\n throw new QoniValidationError(\"webSearch.run requires a prompt\");\n }\n\n const run = await api.run<{ run_id?: string; id?: string }>({\n token,\n queries: resolvedQueries,\n ...rest,\n });\n const runId = run.data.run_id || run.data.id;\n if (!runId) {\n throw new QoniValidationError(\"webSearch run create did not return a run id\");\n }\n return new RunHandle<WebSearchEvent>(buildOps(token, runId), { id: runId, capture });\n },\n\n /** Reconnect to an existing run. Verifies the run exists before returning. */\n attach: async (\n runId: string,\n opts: WebSearchAttachOptions,\n ): Promise<RunHandle<WebSearchEvent>> => {\n const handle = new RunHandle<WebSearchEvent>(buildOps(opts.token, runId), {\n id: runId,\n capture: opts.capture,\n });\n await handle.status();\n return handle;\n },\n\n api,\n };\n}\n\nfunction normalizeWebSearchRunInput(input: JsonObject): JsonObject {\n const body = renameKeys(input, {\n maxResultsPerQuery: \"max_results_per_query\",\n siteWhitelist: \"site_whitelist\",\n siteBlacklist: \"site_blacklist\",\n });\n return body;\n}\n\nfunction asRecord(value: unknown): JsonObject {\n return isJsonObject(value) ? value : {};\n}\n\nfunction omit(value: object, ...keys: string[]): JsonObject {\n const skipped = new Set(keys);\n const out: JsonObject = {};\n for (const [key, item] of Object.entries(value)) {\n if (!skipped.has(key) && item !== undefined) out[key] = item;\n }\n return out;\n}\n\nfunction renameKeys(value: JsonObject, mapping: Record<string, string>): JsonObject {\n const out: JsonObject = {};\n for (const [key, item] of Object.entries(value)) {\n const target = mapping[key] || key;\n if (out[target] === undefined) out[target] = item;\n }\n return out;\n}\n","import { buildSignedHeaders } from \"./auth\";\nimport { createDeepResearchNamespace } from \"./deep-research\";\nimport { createDoAnythingNamespace } from \"./do-anything\";\nimport { createQoniNamespace } from \"./qoni\";\nimport {\n QoniError,\n QoniDelegationRequiredError,\n QoniValidationError,\n errorFromPayload,\n networkError,\n timeoutError,\n} from \"./errors\";\nimport { QoniProductScopes, KNOWN_SCOPES, type QoniProduct } from \"./scopes\";\nimport { createGenAuthNamespace } from \"./genauth\";\nimport { createGumemNamespace } from \"./gumem\";\nimport { createTrackNamespace } from \"./track\";\nimport {\n isJsonObject,\n type CompleteDelegateAgentInput,\n type CompleteDelegateTokenInput,\n type DelegateAgentInput,\n type DelegateAgentResponse,\n type DelegateTokenInteractiveInput,\n type DelegateTokenInput,\n type QoniEvent,\n type QoniHttpMethod,\n type QoniOptions,\n type QoniResponse,\n type QoniRuntimeConfig,\n type QoniService,\n type QoniTransport,\n type DelegateTokenResponse,\n type DelegateTokenSilentResponse,\n type DelegateTokenSilentInput,\n type InteractiveDelegationResponse,\n type JsonObject,\n type RawRequestInput,\n type RequestPayload,\n} from \"./types\";\nimport type { GenAuthAccessTokenInput } from \"./genauth\";\nimport { createWebSearchNamespace } from \"./web-search\";\n\nconst DEFAULT_QONI_HOST = \"https://dashboard.qoni.ai\";\n\nexport class Qoni {\n private readonly fetchImpl: typeof fetch;\n private readonly timeoutMs: number;\n private readonly sseMaxRetries: number;\n private readonly accessKey: string;\n private readonly secretKey: string;\n private readonly host: string;\n private runtimeConfigPromise?: Promise<ResolvedRuntimeConfig>;\n private genAuthAdminTokenCache?: { accessToken: string; userPoolId: string; expiresAt: number };\n\n readonly gumem: ReturnType<typeof createGumemNamespace>;\n readonly genauth: ReturnType<typeof createGenAuthNamespace>;\n readonly qoni: ReturnType<typeof createQoniNamespace>;\n readonly webSearch: ReturnType<typeof createWebSearchNamespace>;\n readonly doAnything: ReturnType<typeof createDoAnythingNamespace>;\n readonly track: ReturnType<typeof createTrackNamespace>;\n readonly deepResearch: ReturnType<typeof createDeepResearchNamespace>;\n\n constructor(private readonly options: QoniOptions) {\n const accessKey = options.accessKey ?? options.accessKeyId;\n const secretKey = options.secretKey ?? options.accessKeySecret;\n const host = options.host ?? options.qoniBaseUrl ?? options.genauthBaseUrl ?? DEFAULT_QONI_HOST;\n if (!accessKey || !secretKey) {\n throw new Error(\"Qoni requires accessKey and secretKey\");\n }\n this.accessKey = accessKey ?? \"\";\n this.secretKey = secretKey ?? \"\";\n this.host = normalizeBaseUrl(host);\n this.fetchImpl = options.fetch ?? fetch;\n this.timeoutMs = options.timeoutMs ?? 30_000;\n this.sseMaxRetries = options.sseMaxRetries ?? 5;\n const transport: QoniTransport = {\n qoniJson: (...args) => this.qoniJson(...args),\n genauthJson: (...args) => this.genauthJson(...args),\n gumemJson: (...args) => this.gumemJson(...args),\n gumemSSE: (...args) => this.gumemSSE(...args),\n webAgentJson: (...args) => this.webAgentJson(...args),\n webAgentBytes: (...args) => this.webAgentBytes(...args),\n webAgentSSE: (...args) => this.webAgentSSE(...args),\n };\n this.genauth = createGenAuthNamespace(transport, {\n adminTokenFor: () => this.genauthAdminTokenFor(),\n delegateTokenFor: (input) => this.delegateToken(input),\n });\n this.qoni = createQoniNamespace(\n transport,\n this.delegateToken.bind(this),\n (input) => this.completeDelegateToken(input),\n );\n this.gumem = createGumemNamespace(transport);\n this.webSearch = createWebSearchNamespace(transport);\n this.doAnything = createDoAnythingNamespace(transport);\n this.track = createTrackNamespace(transport);\n this.deepResearch = createDeepResearchNamespace(transport);\n }\n\n delegateToken(\n input: DelegateTokenInteractiveInput,\n ): Promise<QoniResponse<InteractiveDelegationResponse>>;\n delegateToken(input: DelegateTokenSilentInput): Promise<QoniResponse<DelegateTokenSilentResponse>>;\n delegateToken(input: DelegateTokenInput): Promise<QoniResponse<DelegateAgentResponse>>;\n delegateToken(input: DelegateTokenInput): Promise<QoniResponse<DelegateAgentResponse>> {\n // Scope pre-validation + products expansion happen BEFORE any request, so\n // format mistakes fail locally with the correct form in the message.\n let body: JsonObject;\n try {\n body = normalizeDelegateTokenInput(input);\n } catch (err) {\n return Promise.reject(err);\n }\n return this.signedPost<DelegateAgentResponse>(\n \"/api/v3/eak/delegations\",\n body,\n ).then(normalizeDelegateAgentTokenResponse);\n }\n\n /** @deprecated Use delegateToken. */\n delegateAgent(input: DelegateAgentInput): Promise<QoniResponse<DelegateAgentResponse>> {\n return this.delegateToken(input);\n }\n\n completeDelegateToken(\n input: CompleteDelegateTokenInput,\n ): Promise<QoniResponse<DelegateTokenResponse>> {\n return this.signedPost<DelegateTokenResponse>(\n \"/api/v3/eak/delegations/complete\",\n input,\n ).then(\n normalizeDelegateAgentTokenResponse,\n );\n }\n\n /** @deprecated Use completeDelegateToken. */\n completeDelegateAgent(\n input: CompleteDelegateAgentInput,\n ): Promise<QoniResponse<DelegateTokenResponse>> {\n return this.completeDelegateToken(input);\n }\n\n currentUser<T = unknown>(input: GenAuthAccessTokenInput): Promise<QoniResponse<T>> {\n return this.genauth.userInfo<T>(input);\n }\n\n /**\n * Resolve a real GenAuth user id from the userpool bound to this AK/SK, by\n * listing users and returning the first one. Convenience for demos / smoke\n * tests so `delegateToken` has a valid `userId` without hardcoding one. In\n * application code, resolve the actual logged-in user via `currentUser`\n * instead of picking an arbitrary userpool member.\n */\n async resolveAnyBoundUser(): Promise<string> {\n const res = await this.genauth.users.list<unknown>({ page: 1, limit: 1 });\n const userId = firstBoundUserId(res.data);\n if (!userId) {\n throw new QoniError(\n \"resolveAnyBoundUser: the credential-bound GenAuth userpool returned no users. \" +\n \"Create a user in the userpool, or pass a real userId to delegateToken.\",\n { code: \"eak.genauth.no_bound_users\" },\n );\n }\n return userId;\n }\n\n request<T = unknown>(input: RawRequestInput): Promise<QoniResponse<T>> {\n return this.unstableRequest<T>(input);\n }\n\n unstableRequest<T = unknown>(input: RawRequestInput): Promise<QoniResponse<T>> {\n if (!input.token) {\n const pathname = normalizePath(input.path);\n const signaturePayload =\n input.method === \"GET\" ? (input.query || {}) : (input.body || {});\n const signedHeaders = buildSignedHeaders(\n {\n accessKey: this.accessKey,\n secretKey: this.secretKey,\n },\n input.method,\n pathname,\n signaturePayload,\n );\n return this.baseUrlFor(\"qoni\").then((baseUrl) => this.jsonRequest<T>(baseUrl, pathname, {\n method: input.method,\n query: input.query,\n body: input.body,\n headers: {\n ...nonSignatureHeaders(input.headers),\n ...signedHeaders,\n },\n service: \"qoni\",\n signed: true,\n }));\n }\n return this.baseUrlFor(\"qoni\").then((baseUrl) => this.jsonRequest<T>(baseUrl, input.path, {\n method: input.method,\n token: input.token,\n query: input.query,\n body: input.body,\n headers: input.headers,\n service: \"qoni\",\n }));\n }\n\n private qoniJson<T>(\n method: QoniHttpMethod,\n path: string,\n token?: string,\n payload: RequestPayload = {},\n ): Promise<QoniResponse<T>> {\n return this.baseUrlFor(\"qoni\").then((baseUrl) => this.jsonRequest<T>(baseUrl, path, {\n ...payload,\n method,\n token,\n service: \"qoni\",\n }));\n }\n\n private genauthJson<T>(\n method: QoniHttpMethod,\n path: string,\n token?: string,\n payload: RequestPayload = {},\n ): Promise<QoniResponse<T>> {\n return this.baseUrlFor(\"genauth\").then((baseUrl) => this.jsonRequest<T>(baseUrl, path, {\n ...payload,\n method,\n token,\n service: \"genauth\",\n }));\n }\n\n private async gumemJson<T>(\n method: QoniHttpMethod,\n path: string,\n token?: string,\n payload: RequestPayload = {},\n ): Promise<QoniResponse<T>> {\n const runtimeToken = await this.productTokenFor(\"gumem\", token, payload.requiredScopes);\n const baseUrl = await this.baseUrlFor(\"gumem\");\n return this.jsonRequest<T>(baseUrl, path, {\n ...payload,\n method,\n token: runtimeToken,\n service: \"gumem\",\n });\n }\n\n private async *gumemSSE<T>(\n path: string,\n token?: string,\n payload: RequestPayload & { lastEventId?: string; signal?: AbortSignal } = {},\n ): AsyncIterable<QoniEvent<T>> {\n const runtimeToken = await this.productTokenFor(\"gumem\", token, payload.requiredScopes);\n const baseUrl = await this.baseUrlFor(\"gumem\");\n for await (const event of this.sseRequest<T>(baseUrl, path, {\n ...payload,\n token: runtimeToken,\n service: \"gumem\",\n })) {\n yield event;\n }\n }\n\n private async webAgentJson<T>(\n method: QoniHttpMethod,\n path: string,\n token?: string,\n payload: RequestPayload = {},\n ): Promise<QoniResponse<T>> {\n payload.signal?.throwIfAborted();\n const runtimeToken = await this.productTokenFor(\"webagent\", token, payload.requiredScopes);\n payload.signal?.throwIfAborted();\n const baseUrl = await this.baseUrlFor(\"webagent\");\n return this.jsonRequest<T>(\n baseUrl,\n this.webAgentPath(runtimeToken, path),\n { ...payload, method, token: runtimeToken, service: \"webagent\" },\n );\n }\n\n // Binary GET against the WebAgent API — artifact content downloads. JSON\n // error payloads still map to typed QoniErrors.\n private async webAgentBytes(\n path: string,\n token?: string,\n payload: RequestPayload = {},\n ): Promise<{ bytes: Uint8Array; mime: string }> {\n payload.signal?.throwIfAborted();\n const runtimeToken = await this.productTokenFor(\"webagent\", token, payload.requiredScopes);\n payload.signal?.throwIfAborted();\n const baseUrl = await this.baseUrlFor(\"webagent\");\n return this.fetchWithTimeout(\n urlWithBasePath(baseUrl, this.webAgentPath(runtimeToken, path), payload.query),\n {\n method: \"GET\",\n headers: {\n accept: \"*/*\",\n authorization: `Bearer ${runtimeToken}`,\n ...(payload.headers || {}),\n },\n },\n async (response, signal) => {\n if (!response.ok) {\n throw errorFromPayload(\n response.status,\n await readJson(response, signal),\n `Qoni request failed with HTTP ${response.status}`,\n );\n }\n return {\n bytes: await readBody(response, signal),\n mime: response.headers.get(\"content-type\") || \"application/octet-stream\",\n };\n },\n payload.signal,\n );\n }\n\n private async *webAgentSSE<T>(\n path: string,\n token?: string,\n payload: RequestPayload & {\n lastEventId?: string;\n signal?: AbortSignal;\n onReconnect?: (info: { attempt: number; lastEventId?: string; error: unknown }) => void;\n } = {},\n ): AsyncIterable<QoniEvent<T>> {\n const runtimeToken = await this.productTokenFor(\"webagent\", token, payload.requiredScopes);\n const baseUrl = await this.baseUrlFor(\"webagent\");\n for await (const event of this.sseRequest<T>(\n baseUrl,\n this.webAgentPath(runtimeToken, path),\n {\n ...payload,\n token: runtimeToken,\n service: \"webagent\",\n // Re-resolve the product token before each reconnect (refreshes if the\n // cached one expired); the tenant — and therefore the path — is stable.\n refreshToken: () => this.productTokenFor(\"webagent\", token, payload.requiredScopes),\n },\n )) {\n // WebAgent run streams carry no SSE `event:` line — the wire event type\n // lives in the envelope's `type` field. Surface it as `event.event` so\n // callers can match against QoniEventTypes (e.g. RUN_COMPLETED) instead of\n // reaching into the payload. `data` is left intact (envelope with\n // `type` / `task_id` / `session_id` / `data`).\n yield normalizeWebAgentEvent(event);\n }\n }\n\n private async signedPost<T>(pathname: string, body: object): Promise<QoniResponse<T>> {\n const payload = toRecord(body);\n const headers = buildSignedHeaders(\n {\n accessKey: this.accessKey,\n secretKey: this.secretKey,\n },\n \"POST\",\n pathname,\n payload,\n );\n return this.jsonRequest<T>(await this.baseUrlFor(\"qoni\"), pathname, {\n method: \"POST\",\n body: payload,\n headers,\n service: \"qoni\",\n signed: true,\n });\n }\n\n private async jsonRequest<T>(\n baseUrl: string,\n pathname: string,\n options: RequestPayload & {\n method: QoniHttpMethod;\n token?: string;\n service: QoniService;\n signed?: boolean;\n },\n ): Promise<QoniResponse<T>> {\n const { response, payload } = await this.fetchWithTimeout(\n urlWithBasePath(baseUrl, pathname, options.query),\n {\n method: options.method,\n headers: requestHeaders(options),\n body: requestBody(options.body),\n },\n async (response, signal) => ({ response, payload: await readJson(response, signal) }),\n options.signal,\n );\n if (!response.ok) {\n throw errorFromPayload(\n response.status,\n payload,\n `Qoni request failed with HTTP ${response.status}`,\n );\n }\n const envelopeStatus = errorEnvelopeStatus(payload);\n if (envelopeStatus !== undefined) {\n throw errorFromPayload(\n envelopeStatus,\n payload,\n `Qoni request failed with statusCode ${envelopeStatus}`,\n );\n }\n return normalizeResponse<T>(payload, options.service);\n }\n\n // Reconnecting wrapper: yields events from a fresh connection, and on a\n // dropped stream (network/5xx, not a clean close or a user abort) reconnects\n // with `last-event-id` so the backend replays from where we left off. Each\n // attempt re-issues the GET with the same Bearer product token (no per-call\n // AK/SK signature, so no gateway nonce replay). Caps at `sseMaxRetries`.\n private async *sseRequest<T>(\n baseUrl: string,\n pathname: string,\n options: RequestPayload & {\n token: string;\n service: QoniService;\n lastEventId?: string;\n signal?: AbortSignal;\n // Re-resolved before every (re)connect so a long stream survives product\n // token expiry — the dominant cause of a reconnect failing with 401.\n refreshToken?: () => Promise<string>;\n // Observability: called before each reconnect attempt (not the first).\n onReconnect?: (info: { attempt: number; lastEventId?: string; error: unknown }) => void;\n },\n ): AsyncIterable<QoniEvent<T>> {\n let lastEventId = options.lastEventId;\n let attempt = 0;\n for (;;) {\n const token = options.refreshToken ? await options.refreshToken() : options.token;\n try {\n for await (const event of this.sseConnectOnce<T>(baseUrl, pathname, {\n ...options,\n token,\n lastEventId,\n })) {\n if (event.id) lastEventId = event.id;\n attempt = 0; // a delivered event proves the connection is healthy\n yield event;\n }\n return; // server closed the stream cleanly — the run is over\n } catch (err) {\n if (options.signal?.aborted) throw err; // user abort — never retry\n // 401/403 on a reconnect is usually an expired product token; with a\n // refreshToken the next attempt re-resolves it, so allow the retry.\n const canRetry =\n isRetryableStreamError(err) || (!!options.refreshToken && isAuthError(err));\n if (attempt >= this.sseMaxRetries || !canRetry) throw err;\n attempt++;\n options.onReconnect?.({ attempt, lastEventId, error: err });\n await sleepWithAbort(sseBackoffMs(attempt), options.signal);\n }\n }\n }\n\n private async *sseConnectOnce<T>(\n baseUrl: string,\n pathname: string,\n options: RequestPayload & {\n token: string;\n service: QoniService;\n lastEventId?: string;\n signal?: AbortSignal;\n },\n ): AsyncIterable<QoniEvent<T>> {\n let cleanup: (() => void) | undefined;\n let reader: ReadableStreamDefaultReader<Uint8Array> | undefined;\n const onAbort = () => { void reader?.cancel(options.signal?.reason).catch(() => undefined); };\n const decoder = new TextDecoder();\n let buffer = \"\";\n try {\n const response = await this.fetchWithTimeout(\n urlWithBasePath(baseUrl, pathname, options.query),\n {\n method: \"GET\",\n headers: {\n accept: \"text/event-stream\",\n authorization: `Bearer ${options.token}`,\n ...(options.headers || {}),\n ...(options.lastEventId ? { \"last-event-id\": options.lastEventId } : {}),\n },\n },\n async (response, signal) => {\n if (!response.ok) {\n throw errorFromPayload(\n response.status,\n await readJson(response, signal),\n `Qoni stream failed with HTTP ${response.status}`,\n );\n }\n return response;\n },\n options.signal,\n { streamCleanup: (dispose) => { cleanup = dispose; } },\n );\n if (!response.body) {\n throw errorFromPayload(502, undefined, \"Qoni stream response has no body\");\n }\n\n reader = response.body.getReader();\n options.signal?.addEventListener(\"abort\", onAbort, { once: true });\n while (true) {\n // Belt and braces: even if abort → reader rejection plumbing fails,\n // notice the aborted signal at the next delivered chunk/heartbeat.\n options.signal?.throwIfAborted();\n const { done, value } = await reader.read();\n options.signal?.throwIfAborted();\n if (done) break;\n buffer += decoder.decode(value, { stream: true });\n const chunks = buffer.split(/\\r?\\n\\r?\\n/);\n buffer = chunks.pop() || \"\";\n for (const chunk of chunks) {\n options.signal?.throwIfAborted();\n const event = parseSSEEvent<T>(chunk);\n if (event) yield event;\n }\n }\n const finalEvent = parseSSEEvent<T>(buffer);\n if (finalEvent) yield finalEvent;\n } finally {\n cleanup?.();\n options.signal?.removeEventListener(\"abort\", onAbort);\n // `break`ing out of `for await` runs this block without ever aborting the\n // signal, so the abort path above never fires. Releasing the lock alone\n // leaves the response body open and its socket checked out of the pool —\n // enough leaked SSE streams and every later request to the same origin\n // queues until it times out. Cancel the body first; the lock goes with it.\n void reader?.cancel().catch(() => undefined);\n try {\n reader?.releaseLock();\n } catch {\n // Already released by cancel() — nothing to do.\n }\n }\n }\n\n private async fetchWithTimeout<T>(\n input: URL,\n init: RequestInit,\n consume: (response: Response, signal: AbortSignal) => Promise<T>,\n signal?: AbortSignal,\n opts?: { streamCleanup?: (dispose: () => void) => void },\n ): Promise<T> {\n if (signal?.aborted) throw signal.reason || new DOMException(\"Aborted\", \"AbortError\");\n const controller = new AbortController();\n const resolved = resolveLocalGenauthRequest(input);\n const requestInit = resolved.hostHeader\n ? {\n ...init,\n headers: withHostHeader(init.headers, resolved.hostHeader),\n }\n : init;\n let didTimeout = false;\n const abortFromSignal = () => controller.abort(signal?.reason);\n signal?.addEventListener(\"abort\", abortFromSignal, { once: true });\n const timeout = setTimeout(() => {\n didTimeout = true;\n controller.abort();\n }, this.timeoutMs);\n let response: Response | undefined;\n try {\n response = await new Promise<Response>((resolve, reject) => {\n const onAbort = () => reject(controller.signal.reason);\n controller.signal.addEventListener(\"abort\", onAbort, { once: true });\n Promise.resolve().then(() => {\n controller.signal.throwIfAborted();\n return this.fetchImpl(resolved.url, { ...requestInit, signal: controller.signal });\n }).then((response) => {\n if (controller.signal.aborted) {\n void response.body?.cancel(controller.signal.reason).catch(() => undefined);\n reject(controller.signal.reason);\n } else {\n resolve(response);\n }\n }, reject).finally(() => controller.signal.removeEventListener(\"abort\", onAbort));\n });\n const result = await consume(response, controller.signal);\n controller.signal.throwIfAborted();\n return result;\n } catch (error) {\n void response?.body?.cancel().catch(() => undefined);\n if (signal?.aborted) throw signal.reason;\n if (didTimeout || isConnectTimeoutError(error)) {\n throw timeoutError(error);\n }\n if (isFetchNetworkError(error)) throw networkError(error);\n throw error;\n } finally {\n clearTimeout(timeout);\n const cleanup = () => signal?.removeEventListener(\"abort\", abortFromSignal);\n if (opts?.streamCleanup) opts.streamCleanup(cleanup);\n else cleanup();\n }\n }\n\n private async baseUrlFor(service: QoniService): Promise<string> {\n const explicit = this.explicitBaseUrlFor(service);\n if (explicit) return explicit;\n // AK/SK signatures are scoped to the configured control-plane endpoint.\n // Keep signed Qoni calls on that trusted boundary: following a cross-origin\n // runtime URL can strip Authorization on redirect or disclose credentials.\n // Resolved before the discovery fetch below, so a Qoni call never depends\n // on a document it does not read — otherwise an unavailable runtime-config\n // takes down every Qoni request with it.\n if (service === \"qoni\") return this.host;\n const runtime = await this.runtimeConfig();\n const hostOrigin = originBaseUrl(this.host);\n if (service === \"genauth\") return runtime.genauthBaseUrl ?? hostOrigin;\n if (service === \"gumem\") return runtime.gumemBaseUrl ?? hostOrigin;\n return runtime.webAgentBaseUrl ?? hostOrigin;\n }\n\n private explicitBaseUrlFor(service: QoniService): string | undefined {\n if (service === \"qoni\") {\n const value = this.options.qoniBaseUrl ?? this.options.genauthBaseUrl;\n return value ? normalizeBaseUrl(value) : undefined;\n }\n if (service === \"genauth\" && this.options.genauthBaseUrl) {\n return normalizeBaseUrl(this.options.genauthBaseUrl);\n }\n if (service === \"genauth\") {\n const value = serviceHostOption(this.options, \"genauth\");\n return value ? normalizeBaseUrl(value) : undefined;\n }\n if (service === \"gumem\" && this.options.gumemBaseUrl) {\n return normalizeBaseUrl(this.options.gumemBaseUrl);\n }\n if (service === \"gumem\") {\n const value = serviceHostOption(this.options, \"gumem\");\n return value ? normalizeBaseUrl(value) : undefined;\n }\n if (service === \"webagent\" && this.options.webAgentBaseUrl) {\n return normalizeBaseUrl(this.options.webAgentBaseUrl);\n }\n if (service === \"webagent\") {\n const value = serviceHostOption(this.options, \"webagent\");\n return value ? normalizeBaseUrl(value) : undefined;\n }\n return undefined;\n }\n\n private runtimeConfig(): Promise<ResolvedRuntimeConfig> {\n this.runtimeConfigPromise ??= this.fetchRuntimeConfig();\n return this.runtimeConfigPromise;\n }\n\n private async fetchRuntimeConfig(): Promise<ResolvedRuntimeConfig> {\n const pathname = \"/api/v3/eak/runtime-config\";\n const headers = buildSignedHeaders(\n {\n accessKey: this.accessKey,\n secretKey: this.secretKey,\n },\n \"GET\",\n pathname,\n {},\n );\n const { response, payload } = await this.fetchWithTimeout(\n urlWithBasePath(this.host, pathname),\n {\n method: \"GET\",\n headers: {\n accept: \"application/json\",\n ...headers,\n },\n },\n async (response, signal) => ({ response, payload: await readJson(response, signal) }),\n );\n if (!response.ok) {\n throw errorFromPayload(\n response.status,\n payload,\n `Qoni runtime config request failed with HTTP ${response.status}`,\n );\n }\n return normalizeRuntimeConfig(payload);\n }\n\n private webAgentPath(token: string, path: string): string {\n const normalized = normalizePath(path);\n if (normalized.startsWith(\"/api/v1/projects/\")) return normalized;\n // The tenant is carried by the delegation token (a JWT).\n const tenantId = requiredWebAgentTenantId(token);\n return `/api/v1/projects/${encodeURIComponent(tenantId)}${normalized}`;\n }\n\n private async productTokenFor(\n service: \"gumem\" | \"webagent\",\n token: string | undefined,\n requiredScopes: readonly string[] | undefined,\n ): Promise<string> {\n const runtimeToken = requiredRuntimeToken(token);\n if (!isQoniDelegationToken(runtimeToken)) return runtimeToken;\n\n // Every SDK operation must re-enter GenAuth's policy check. A cached\n // product token can outlive a change to the access key's allowed scopes.\n const scopes = [...(requiredScopes || [])].sort();\n\n const response = await this.signedPost<unknown>(\"/api/v3/eak/token-exchange\", {\n subjectToken: runtimeToken,\n resource: service === \"gumem\" ? \"gumem\" : \"webagent\",\n scopes,\n });\n const payload = response.data;\n const accessToken = readAccessToken(payload);\n if (!accessToken) {\n throw errorFromPayload(\n 502,\n payload,\n \"Qoni product token exchange response did not include an access token\",\n );\n }\n\n return accessToken;\n }\n\n private async genauthAdminTokenFor(): Promise<{ accessToken: string; userPoolId: string }> {\n const cached = this.genAuthAdminTokenCache;\n if (cached && cached.expiresAt > Date.now() + 30_000) {\n return { accessToken: cached.accessToken, userPoolId: cached.userPoolId };\n }\n\n const response = await this.signedPost<unknown>(\"/api/v3/eak/genauth/admin-token\", {});\n const payload = response.data;\n const accessToken = readAccessToken(payload);\n const userPoolId =\n readString(payload, \"userPoolId\") ??\n readString(payload, \"userpoolId\") ??\n readString(payload, \"user_pool_id\");\n if (!accessToken || !userPoolId) {\n throw errorFromPayload(\n 502,\n payload,\n \"Qoni GenAuth admin-token response did not include accessToken and userPoolId\",\n );\n }\n\n this.genAuthAdminTokenCache = {\n accessToken,\n userPoolId,\n expiresAt: Date.now() + Math.max(0, readExpiresIn(payload) ?? 3600) * 1000,\n };\n return { accessToken, userPoolId };\n }\n}\n\ninterface ResolvedRuntimeConfig {\n eakBaseUrl?: string;\n genauthBaseUrl?: string;\n gumemBaseUrl?: string;\n webAgentBaseUrl?: string;\n}\n\nfunction requestHeaders(\n options: RequestPayload & { token?: string; signed?: boolean },\n): Record<string, string> {\n const headers: Record<string, string> = {\n accept: \"application/json\",\n ...(options.headers || {}),\n };\n if (options.token) headers.authorization = `Bearer ${options.token}`;\n if (options.body !== undefined && !isBodyInit(options.body) && !headers[\"content-type\"]) {\n headers[\"content-type\"] = \"application/json\";\n }\n return headers;\n}\n\nfunction nonSignatureHeaders(\n headers: Record<string, string> | undefined,\n): Record<string, string> {\n return Object.fromEntries(\n Object.entries(headers || {}).filter(([key]) => {\n const normalized = key.toLowerCase();\n return (\n normalized !== \"authorization\" &&\n normalized !== \"content-type\" &&\n normalized !== \"date\" &&\n !normalized.startsWith(\"x-authing-\")\n );\n }),\n );\n}\n\nfunction requestBody(body: RequestPayload[\"body\"]): BodyInit | undefined {\n if (body === undefined) return undefined;\n if (isBodyInit(body)) return body;\n return JSON.stringify(body);\n}\n\nfunction isBodyInit(value: unknown): value is BodyInit {\n return (\n typeof value === \"string\" ||\n value instanceof ArrayBuffer ||\n value instanceof Blob ||\n value instanceof FormData ||\n value instanceof URLSearchParams\n );\n}\n\nasync function readBody(response: Response, signal: AbortSignal): Promise<Uint8Array> {\n if (!response.body) {\n signal.throwIfAborted();\n return new Uint8Array();\n }\n const reader = response.body.getReader();\n const onAbort = () => { void reader.cancel(signal.reason).catch(() => undefined); };\n signal.addEventListener(\"abort\", onAbort, { once: true });\n try {\n const chunks: Uint8Array[] = [];\n let size = 0;\n for (;;) {\n signal.throwIfAborted();\n const { done, value } = await reader.read();\n signal.throwIfAborted();\n if (done) break;\n chunks.push(value);\n size += value.byteLength;\n }\n const bytes = new Uint8Array(size);\n let offset = 0;\n for (const chunk of chunks) {\n bytes.set(chunk, offset);\n offset += chunk.byteLength;\n }\n return bytes;\n } finally {\n signal.removeEventListener(\"abort\", onAbort);\n void reader.cancel().catch(() => undefined);\n reader.releaseLock();\n }\n}\n\nasync function readJson(response: Response, signal: AbortSignal): Promise<unknown> {\n const contentType = response.headers.get(\"content-type\")?.toLowerCase() || \"\";\n const body = new TextDecoder().decode(await readBody(response, signal));\n try {\n if (contentType.includes(\"ndjson\") || contentType.includes(\"jsonl\")) {\n if (!body.trim()) return [];\n return body\n .split(/\\r?\\n/)\n .filter((line) => line.trim().length > 0)\n .map((line) => JSON.parse(line));\n }\n return JSON.parse(body);\n } catch {\n return undefined;\n }\n}\n\nfunction normalizeResponse<T>(payload: unknown, _service: QoniService): QoniResponse<T> {\n if (isJsonObject(payload) && (\"data\" in payload || \"meta\" in payload)) {\n return {\n data: (\"data\" in payload ? payload.data : payload) as T,\n meta: {\n ...(isJsonObject(payload.meta) ? payload.meta : {}),\n ...topLevelMeta(payload),\n },\n };\n }\n return { data: payload as T, meta: {} };\n}\n\nfunction topLevelMeta(payload: JsonObject): JsonObject {\n const meta: JsonObject = {};\n for (const key of [\"requestId\", \"traceId\", \"auditId\"]) {\n if (typeof payload[key] === \"string\") meta[key] = payload[key];\n }\n return meta;\n}\n\nfunction urlWithQuery(baseUrl: string, pathname: string, query?: JsonObject): URL {\n const url = new URL(normalizePath(pathname), baseUrl);\n for (const [key, value] of Object.entries(query || {})) {\n if (value !== undefined && value !== null) url.searchParams.set(key, String(value));\n }\n return url;\n}\n\nfunction urlWithBasePath(baseUrl: string, pathname: string, query?: JsonObject): URL {\n const base = new URL(baseUrl);\n const basePath = base.pathname === \"/\" ? \"\" : base.pathname.replace(/\\/+$/, \"\");\n const normalizedPath = normalizePath(pathname);\n const fullPath =\n basePath && (normalizedPath === basePath || normalizedPath.startsWith(`${basePath}/`))\n ? normalizedPath\n : `${basePath}${normalizedPath}`;\n return urlWithQuery(base.origin, fullPath, query);\n}\n\nfunction resolveLocalGenauthRequest(input: URL): { url: URL; hostHeader?: string } {\n const url = new URL(input.toString());\n if (\n process.env.QONI_LOCAL_GENAUTH_REWRITE === \"false\" ||\n url.protocol !== \"http:\" ||\n !url.hostname.endsWith(\".genauth.localhost\")\n ) {\n return { url };\n }\n\n const hostHeader = url.host;\n url.hostname = process.env.QONI_LOCAL_GENAUTH_TARGET_HOST || \"127.0.0.1\";\n return { url, hostHeader };\n}\n\nfunction withHostHeader(headers: HeadersInit | undefined, hostHeader: string): Record<string, string> {\n const out: Record<string, string> = {};\n new Headers(headers).forEach((value, key) => {\n out[key] = value;\n });\n out.Host = hostHeader;\n return out;\n}\n\nfunction normalizePath(path: string): string {\n return path.startsWith(\"/\") ? path : `/${path}`;\n}\n\nfunction normalizeBaseUrl(host: string): string {\n const withProtocol = /^https?:\\/\\//i.test(host) ? host : `https://${host}`;\n return withProtocol.replace(/\\/+$/, \"\");\n}\n\nfunction originBaseUrl(host: string): string {\n return new URL(host).origin;\n}\n\nfunction serviceHostOption(\n options: QoniOptions,\n service: Exclude<QoniService, \"qoni\">,\n): string | undefined {\n if (service === \"genauth\") {\n return options.genauthHost;\n }\n if (service === \"gumem\") {\n return options.gumemHost;\n }\n return options.webAgentHost;\n}\n\nfunction normalizeRuntimeConfig(payload: unknown): ResolvedRuntimeConfig {\n const data = envelopeData(payload);\n if (!isJsonObject(data)) return {};\n const config = data as QoniRuntimeConfig;\n return {\n eakBaseUrl: runtimeServiceUrl(config, \"eak\", \"eakBaseUrl\"),\n genauthBaseUrl: runtimeServiceUrl(config, \"genauth\", \"genauthBaseUrl\"),\n gumemBaseUrl: runtimeServiceUrl(config, \"gumem\", \"gumemBaseUrl\"),\n webAgentBaseUrl:\n runtimeServiceUrl(config, \"webAgent\", \"webAgentBaseUrl\") ??\n runtimeServiceUrl(config, \"webagent\", \"webAgentBaseUrl\"),\n };\n}\n\nfunction envelopeData(payload: unknown): unknown {\n if (isJsonObject(payload) && \"data\" in payload) return payload.data;\n return payload;\n}\n\nfunction runtimeServiceUrl(\n config: QoniRuntimeConfig,\n service: keyof NonNullable<QoniRuntimeConfig[\"services\"]>,\n topLevelKey: keyof QoniRuntimeConfig,\n): string | undefined {\n const topLevel = config[topLevelKey];\n if (typeof topLevel === \"string\" && topLevel.trim()) return normalizeBaseUrl(topLevel);\n const serviceValue = config.services?.[service];\n if (typeof serviceValue === \"string\" && serviceValue.trim()) {\n return normalizeBaseUrl(serviceValue);\n }\n if (isJsonObject(serviceValue)) {\n for (const key of [\"baseUrl\", \"url\", \"host\"] as const) {\n const value = serviceValue[key];\n if (typeof value === \"string\" && value.trim()) return normalizeBaseUrl(value);\n }\n }\n return undefined;\n}\n\nfunction toRecord(value: object): JsonObject {\n const out: JsonObject = {};\n for (const [key, item] of Object.entries(value)) {\n if (item !== undefined) out[key] = item;\n }\n return out;\n}\n\nfunction normalizeDelegateTokenInput(input: DelegateTokenInput): JsonObject {\n const body = toRecord(input);\n if (input.deniedScopes !== undefined) {\n throw new QoniValidationError(\n \"delegateToken: deniedScopes is not supported by the delegation service. \" +\n \"Do not rely on this field to prevent mailbox or browser actions.\",\n );\n }\n if (input.agent !== undefined && input.agentKey !== undefined && input.agent !== input.agentKey) {\n throw new QoniValidationError(\"delegateToken: agent and agentKey must identify the same Agent\");\n }\n if (!body.userId && isJsonObject(input.user) && typeof input.user.id === \"string\") {\n body.userId = input.user.id;\n }\n // Silent delegation acts for a specific end user, so a user id is required.\n // Fail locally with a precise message instead of letting an un-attributed\n // request reach the gateway and come back as a confusing signing/auth error\n // (interactive mode is exempt — the Qoni Console resolves the login during\n // authorization). The TS overloads already enforce this; the guard is for\n // plain-JS callers where types don't apply.\n if (input.mode !== \"interactive\" && !body.userId) {\n throw new QoniValidationError(\n \"delegateToken: silent mode requires a user — pass `user: { id: <genauthUserId> }` \" +\n \"(or the top-level `userId`). Interactive mode (`mode: \\\"interactive\\\"`) \" +\n \"does not need one.\",\n );\n }\n body.agent = input.agent ?? input.agentKey ?? \"sdk\";\n delete body.agentKey;\n if (input.expiresIn !== undefined) body.expiresIn = delegationDurationSeconds(input.expiresIn);\n body.scopes = resolveDelegationScopes(input.scopes, input.products);\n delete body.products;\n return body;\n}\n\nfunction delegationDurationSeconds(value: string | number): number {\n let seconds = value;\n if (typeof value === \"string\") {\n const duration = /^(\\d+)(s|m|h|d)?$/.exec(value);\n const units: Record<string, number> = { s: 1, m: 60, h: 3600, d: 86400 };\n seconds = duration ? Number(duration[1]) * units[duration[2] ?? \"s\"] : NaN;\n }\n if (typeof seconds !== \"number\" || !Number.isInteger(seconds) || seconds < 60 || seconds > 86400) {\n throw new QoniValidationError(\n 'delegateToken: expiresIn must be 60–86400 integer seconds or a whole-number duration such as \"15m\"',\n );\n }\n return seconds;\n}\n\n/**\n * Merge explicit scopes with the `products` sugar expansion, pre-validating\n * scope formats locally so typos fail before any request is made.\n */\nfunction resolveDelegationScopes(\n scopes: readonly string[] | undefined,\n products: readonly string[] | undefined,\n): string[] {\n const resolved = new Set<string>();\n for (const product of products ?? []) {\n const expansion = QoniProductScopes[product as QoniProduct];\n if (!expansion) {\n throw new QoniValidationError(\n `delegateToken: unknown product \"${product}\" — expected one of ` +\n `${Object.keys(QoniProductScopes).join(\", \")}`,\n );\n }\n for (const scope of expansion) resolved.add(scope);\n }\n for (const scope of scopes ?? []) {\n validateScopeFormat(scope);\n resolved.add(scope);\n }\n if (resolved.size === 0) {\n throw new QoniValidationError(\n \"delegateToken requires at least one scope — pass scopes (e.g. \" +\n '[\"webagent.do_anything:manage\"]) and/or products (e.g. [\"doAnything\"])',\n );\n }\n return [...resolved];\n}\n\nfunction validateScopeFormat(scope: string): void {\n if (scope.startsWith(\"mailbox.\") || scope === \"web.search\" || scope === \"web.extract\") {\n throw new QoniValidationError(\n `delegateToken: legacy action scope \"${scope}\" has no enforced mapping in this delegation service. ` +\n \"It will not be expanded into broader product permissions.\",\n );\n }\n if (KNOWN_SCOPES.includes(scope)) return;\n // A known scope minus its service prefix — the most common mistake. Name\n // every match: \"profile:read\" fits both gumem.profile:read and user.profile:read.\n const prefixed = KNOWN_SCOPES.filter((known) => known.endsWith(`.${scope}`));\n if (prefixed.length > 0) {\n throw new QoniValidationError(\n `delegateToken: scope \"${scope}\" is missing its service prefix — write ` +\n prefixed.map((known) => `\"${known}\"`).join(\" or \"),\n );\n }\n // Unknown scopes are allowed if well-formed (the server is the authority on\n // newly added scopes); malformed ones fail locally with the correct form.\n if (!/^[a-z0-9_]+(\\.[a-z0-9_]+)+:[a-z0-9_]+$/.test(scope)) {\n throw new QoniValidationError(\n `delegateToken: malformed scope \"${scope}\" — scopes look like ` +\n '\"<service>.<resource>:<action>\", e.g. \"webagent.do_anything:manage\"',\n );\n }\n}\n\nfunction errorEnvelopeStatus(payload: unknown): number | undefined {\n if (!isJsonObject(payload)) return undefined;\n const statusCode = payload.statusCode;\n if (typeof statusCode !== \"number\" || statusCode < 400) return undefined;\n if (\"data\" in payload && payload.data !== undefined) return undefined;\n return statusCode;\n}\n\nfunction decodeJwtPayload(token: string): JsonObject {\n const [, payload] = token.split(\".\");\n if (!payload) throw new Error(\"token is not a JWT\");\n return JSON.parse(Buffer.from(payload, \"base64url\").toString(\"utf8\")) as JsonObject;\n}\n\nfunction safeDecodeJwtPayload(token: string): JsonObject | undefined {\n try {\n return decodeJwtPayload(token);\n } catch {\n return undefined;\n }\n}\n\nfunction isQoniDelegationToken(token: string): boolean {\n return safeDecodeJwtPayload(token)?.token_type === \"eak_delegation_token\";\n}\n\nfunction readAccessToken(payload: unknown): string | undefined {\n if (!isJsonObject(payload)) return undefined;\n for (const key of [\"accessToken\", \"access_token\", \"token\"]) {\n const token = payload[key];\n if (typeof token === \"string\" && token.trim()) return token;\n }\n return undefined;\n}\n\nfunction readExpiresIn(payload: unknown): number | undefined {\n if (!isJsonObject(payload)) return undefined;\n const expiresIn = payload.expiresIn ?? payload.expires_in;\n if (typeof expiresIn === \"number\" && Number.isFinite(expiresIn)) return expiresIn;\n if (typeof expiresIn === \"string\" && expiresIn.trim()) {\n const parsed = Number(expiresIn);\n return Number.isFinite(parsed) ? parsed : undefined;\n }\n return undefined;\n}\n\nfunction readString(payload: unknown, key: string): string | undefined {\n if (!isJsonObject(payload)) return undefined;\n const value = payload[key];\n return typeof value === \"string\" && value.trim() ? value : undefined;\n}\n\nfunction requiredWebAgentTenantId(token: string): string {\n const payload = decodeJwtPayload(token);\n const productResource = payload.product_resource;\n if (isJsonObject(productResource) && productResource.type === \"webagent_tenant\") {\n const id = productResource.id;\n if (typeof id === \"string\" && id.trim()) return id;\n }\n const resourceBindingTenantId = nestedString(payload, [\n \"resource_bindings\",\n \"webagent\",\n \"tenant_id\",\n ]);\n if (resourceBindingTenantId) return resourceBindingTenantId;\n const tenantId = payload.webagent_tenant_id;\n if (typeof tenantId === \"string\" && tenantId.trim()) return tenantId;\n const projectId = payload.webagent_project_id;\n if (typeof projectId === \"string\" && projectId.trim()) return projectId;\n throw new Error(\"token is missing WebAgent tenant binding\");\n}\n\nfunction nestedString(value: unknown, path: readonly string[]): string | undefined {\n let cursor = value;\n for (const segment of path) {\n if (!isJsonObject(cursor)) return undefined;\n cursor = cursor[segment];\n }\n return typeof cursor === \"string\" && cursor.trim() ? cursor : undefined;\n}\n\n// WebAgent run events arrive as `id: <n>\\ndata: <envelope>` with no SSE\n// `event:` line; the type is the envelope's `type` field. Lift it to\n// `event.event` so callers can match QoniEventTypes. Non-record / typed events\n// pass through unchanged.\nfunction normalizeWebAgentEvent<T>(event: QoniEvent<T>): QoniEvent<T> {\n if (event.event) return event;\n const data = event.data as { type?: unknown } | null | undefined;\n if (data && typeof data === \"object\" && typeof data.type === \"string\") {\n return { ...event, event: data.type };\n }\n return event;\n}\n\n// Retry on connection drops (ECONNRESET, fetch network errors) and transient\n// 5xx / 408 / 429. Never retry on user abort or terminal 4xx (auth / not found).\nfunction isRetryableStreamError(err: unknown): boolean {\n if (err && typeof err === \"object\") {\n const e = err as { name?: string; retryable?: boolean; status?: number };\n if (e.name === \"AbortError\") return false;\n if (e.status === 408) return true;\n if (typeof e.retryable === \"boolean\") return e.retryable;\n if (typeof e.status === \"number\") {\n return e.status >= 500 || e.status === 408 || e.status === 429;\n }\n }\n return true; // unknown / network read error — reconnect\n}\n\n// 401/403 — retryable only when a token refresh is available (the next attempt\n// re-resolves the product token); never retryable on its own.\nfunction isAuthError(err: unknown): boolean {\n const status = (err as { status?: number } | null)?.status;\n return status === 401 || status === 403;\n}\n\nfunction sseBackoffMs(attempt: number): number {\n const base = Math.min(500 * 2 ** (attempt - 1), 10_000);\n return base + Math.floor(Math.random() * 250); // jitter\n}\n\nfunction sleepWithAbort(ms: number, signal?: AbortSignal): Promise<void> {\n return new Promise((resolve, reject) => {\n if (signal?.aborted) {\n reject(new DOMException(\"The operation was aborted\", \"AbortError\"));\n return;\n }\n const timer = setTimeout(() => {\n signal?.removeEventListener(\"abort\", onAbort);\n resolve();\n }, ms);\n const onAbort = (): void => {\n clearTimeout(timer);\n reject(new DOMException(\"The operation was aborted\", \"AbortError\"));\n };\n signal?.addEventListener(\"abort\", onAbort, { once: true });\n });\n}\n\n// Pull the first user id out of a genauth.users.list response, tolerating the\n// various envelope shapes (array, { list }, { users }, { data: [...] }) and id\n// field names the userpool may use.\nfunction firstBoundUserId(data: unknown): string | undefined {\n const arrays = [data, (data as { list?: unknown })?.list, (data as { users?: unknown })?.users,\n (data as { data?: unknown })?.data, (data as { items?: unknown })?.items];\n for (const candidate of arrays) {\n if (Array.isArray(candidate) && candidate.length) {\n const u = candidate[0] as Record<string, unknown>;\n for (const key of [\"userId\", \"id\", \"user_id\", \"sub\", \"username\"]) {\n const v = u?.[key];\n if (typeof v === \"string\" && v) return v;\n }\n }\n }\n return undefined;\n}\n\nfunction parseSSEEvent<T>(chunk: string): QoniEvent<T> | null {\n const lines = chunk.split(/\\r?\\n/);\n let id: string | undefined;\n let event: string | undefined;\n const data: string[] = [];\n for (const line of lines) {\n if (!line || line.startsWith(\":\")) continue;\n const index = line.indexOf(\":\");\n const field = index >= 0 ? line.slice(0, index) : line;\n const value = index >= 0 ? line.slice(index + 1).replace(/^ /, \"\") : \"\";\n if (field === \"id\") id = value;\n if (field === \"event\") event = value;\n if (field === \"data\") data.push(value);\n }\n if (!id && !event && !data.length) return null;\n return { id, event, data: parseEventData<T>(data.join(\"\\n\")) };\n}\n\nfunction parseEventData<T>(raw: string): T {\n if (!raw) return undefined as T;\n try {\n return JSON.parse(raw) as T;\n } catch {\n return raw as T;\n }\n}\n\nfunction requiredRuntimeToken(token: string | undefined): string {\n if (token && token.trim()) return token;\n throw new QoniDelegationRequiredError(\n \"Product capability calls require an explicit token in the token field\",\n );\n}\n\nfunction normalizeDelegateAgentTokenResponse<T extends DelegateAgentResponse>(\n response: QoniResponse<T>,\n): QoniResponse<T> {\n if (!isJsonObject(response.data)) return response;\n const grantState =\n typeof response.data.grantState === \"string\"\n ? response.data.grantState\n : typeof response.data.state === \"string\"\n ? response.data.state\n : typeof response.data.grantId === \"string\"\n ? response.data.grantId\n : undefined;\n if (typeof response.data.authorizationUrl === \"string\" && grantState) {\n return {\n ...response,\n data: {\n ...response.data,\n grantState,\n state: grantState,\n } as T,\n };\n }\n const token =\n typeof response.data.delegateAgentToken === \"string\"\n ? response.data.delegateAgentToken\n : typeof response.data.delegationToken === \"string\"\n ? response.data.delegationToken\n : typeof response.data.token === \"string\"\n ? response.data.token\n : undefined;\n if (!token) return response;\n return {\n ...response,\n data: {\n ...response.data,\n token,\n delegateAgentToken: token,\n } as T,\n };\n}\n\nfunction isConnectTimeoutError(error: unknown): boolean {\n const cause = errorCause(error);\n return (\n errorCode(cause) === \"UND_ERR_CONNECT_TIMEOUT\" ||\n errorName(cause) === \"ConnectTimeoutError\"\n );\n}\n\nfunction isFetchNetworkError(error: unknown): boolean {\n if (!(error instanceof TypeError)) return false;\n const message = error.message.toLowerCase();\n return message.includes(\"fetch failed\") || message.includes(\"network\");\n}\n\nfunction errorCause(error: unknown): unknown {\n return error && typeof error === \"object\" ? (error as { cause?: unknown }).cause : undefined;\n}\n\nfunction errorCode(error: unknown): string | undefined {\n return error && typeof error === \"object\" && typeof (error as { code?: unknown }).code === \"string\"\n ? (error as { code: string }).code\n : undefined;\n}\n\nfunction errorName(error: unknown): string | undefined {\n return error && typeof error === \"object\" && typeof (error as { name?: unknown }).name === \"string\"\n ? (error as { name: string }).name\n : undefined;\n}\n"],"mappings":"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","names":["data","InteractionTypes","asString","detail","omit","asRecord","renameKeys","omit","isJsonObject","omit","renameKeys","omit","asRecord","renameKeys","camelKey","omit","asRecord","renameKeys","response"]}
|