@qoniai/qoni 0.4.0 → 0.4.2
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 +61 -4
- package/README.md +28 -14
- package/README.zh-CN.md +21 -14
- package/dist/index.cjs +208 -110
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +9 -4
- package/dist/index.d.ts +9 -4
- package/dist/index.js +208 -109
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/skills/qoni-sdk/SKILL.md +6 -6
- package/skills/qoni-sdk/agents/openai.yaml +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/signature.ts","../src/auth.ts","../src/scopes.ts","../src/types.ts","../src/errors.ts","../src/run-events.ts","../src/generated/interaction-types.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 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} 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","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 /** 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 expiresIn?: string | number;\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 /** @deprecated Use user. */\n userId?: string;\n }\n | {\n user?: UserRef;\n /** @deprecated Use user. */\n userId: string;\n }\n);\n\nexport interface DelegateTokenInteractiveInput extends DelegateTokenBaseInput {\n mode: \"interactive\";\n redirectUri: string;\n state: string;\n user?: UserRef;\n /** @deprecated Use user. */\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 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 { KNOWN_SCOPES } from \"./scopes\";\nimport { 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.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 = 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 // Server permission errors pass through with the known scope set appended\n // so callers can see what a valid grant looks like without leaving the\n // stack trace.\n return new QoniPermissionDeniedError(appendKnownScopes(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};\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 appendKnownScopes(message: string): string {\n if (message.includes(\"Known scopes:\")) return message;\n return `${message} (Known scopes: ${KNOWN_SCOPES.join(\", \")})`;\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 /** 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) — those don't\n * go through the generic `shapeData`.\n */\nexport type RunProgressType = Exclude<QoniEventType, \"screenshot\" | \"done\" | \"interaction\">;\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/** `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: \"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\" | \"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 bytes = isBase64\n ? new Uint8Array(Buffer.from(body, \"base64\"))\n : new TextEncoder().encode(decodeURIComponent(body));\n return { bytes, mime: mime || \"application/octet-stream\" };\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 \"run.browser_live_url_changed\": \"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 // 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","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 { 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) => Promise<void>;\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 answer(text: string): Promise<void> {\n return this.invoke(ActionKinds.answer, { response: text });\n }\n /** Skip / dismiss the interaction (proceed without acting on it). */\n skip(): Promise<void> {\n return this.invoke(ActionKinds.skip);\n }\n /** Confirm a pending confirmation (approve the plan / destructive op). */\n confirm(): Promise<void> {\n return this.invoke(ActionKinds.confirm);\n }\n /** Reject a pending confirmation. */\n reject(): Promise<void> {\n return this.invoke(ActionKinds.reject);\n }\n /** Open the login surface for a site_login interaction. */\n openLogin(): Promise<void> {\n return this.invoke(ActionKinds.openLogin);\n }\n /** Tell the agent the user has finished signing in. */\n confirmSignedIn(): Promise<void> {\n return this.invoke(ActionKinds.confirmSignedIn);\n }\n /** Connect to the live browser for a take_control interaction. */\n connectControl(): Promise<void> {\n return this.invoke(ActionKinds.connectControl);\n }\n /** Refresh the live control surface / live url. */\n refreshControl(): Promise<void> {\n return this.invoke(ActionKinds.refreshControl);\n }\n /** Hand control back to the agent. */\n releaseControl(): Promise<void> {\n return this.invoke(ActionKinds.releaseControl);\n }\n /** Retry a wait interaction now. */\n retry(): Promise<void> {\n return this.invoke(ActionKinds.retry);\n }\n /** Switch the profile a wait/login interaction is bound to. */\n switchProfile(): Promise<void> {\n return this.invoke(ActionKinds.switchProfile);\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<void> {\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 await this.post(action, body);\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 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(): 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(action: Action, body: JsonObject | undefined): Promise<void>;\n cancel(reason?: string): Promise<JsonObject>;\n /** Products without artifacts leave this undefined → `result.artifacts` is []. */\n listArtifacts?(): 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 } = withTimeout(opts.signal, opts.timeoutMs);\n let lastEventId: string | undefined;\n let eventIdAtLastClose: string | undefined;\n let sawCleanClose = false;\n let terminalPayload: 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: opts.onWireEvent,\n onReconnect: opts.onReconnect,\n })) {\n if (event.raw.id) lastEventId = event.raw.id;\n await opts.onEvent?.(event);\n if (event.type === \"screenshot\") {\n await opts.onScreenshot?.(event.image, screenshotIndex++);\n } else if (event.type === \"interaction\") {\n await opts.onInteraction?.(this.interactionHandle(event.data), event);\n }\n if (event.isTerminal) {\n // Fallback only (used if the canonical getDetail() read below\n // fails): the raw wire envelope, not the trimmed `done` data.\n terminalPayload = isJsonObject(event.raw.data)\n ? (event.raw.data as JsonObject)\n : undefined;\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 this.ops.getDetail();\n if (isTerminalRunStatus(detail.status)) break;\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 } 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 }\n\n // Settle from the run-detail envelope (canonical shape: costs, tokens,\n // step counts) — the terminal event payload is leaner and only used as\n // a fallback if the detail read fails right after completion.\n let detail: JsonObject;\n try {\n detail = await this.ops.getDetail();\n } catch (err) {\n if (!terminalPayload) throw err;\n detail = terminalPayload;\n }\n this.#adoptSessionRef(detail);\n const artifacts = this.ops.listArtifacts ? await this.ops.listArtifacts() : [];\n return settleRunResult(this.id, detail, artifacts, terminalDoneReason);\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) =>\n this.ops.postAction(action, body),\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 let status: RunResult[\"status\"];\n if (isTerminalRunStatus(detail.status)) {\n status = detail.status as RunResult[\"status\"];\n } else if (terminalReason === \"canceled\") {\n status = \"canceled\";\n } else if (\n terminalReason === \"failed\" ||\n terminalReason === \"expired\" ||\n isTaskSuccessful === false\n ) {\n status = \"failed\";\n } else {\n status = \"succeeded\";\n }\n return {\n runId,\n 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 } {\n if (!timeoutMs) return { signal, timedOut: () => false };\n const controller = new AbortController();\n let fired = false;\n const timer = setTimeout(() => {\n fired = true;\n controller.abort();\n }, timeoutMs);\n controller.signal.addEventListener(\"abort\", () => clearTimeout(timer), { once: true });\n if (signal) {\n if (signal.aborted) controller.abort();\n else signal.addEventListener(\"abort\", () => controller.abort(), { once: true });\n }\n return { signal: controller.signal, timedOut: () => fired };\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 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 }): Promise<QoniResponse<T>> =>\n transport.webAgentJson(\n \"GET\",\n `/deep_research/runs/${encodeURIComponent(input.runId)}`,\n input.token,\n {\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 },\n ): Promise<QoniResponse<T>> =>\n transport.webAgentJson(\n \"GET\",\n `/deep_research/runs/${encodeURIComponent(input.runId)}/artifacts`,\n input.token,\n {\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 () => asRecord((await api.get<unknown>({ token, runId })).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) => {\n await transport.webAgentJson(\n (action.method || \"POST\") as QoniHttpMethod,\n action.endpoint,\n token,\n {\n ...(body !== undefined ? { body } : {}),\n requiredScopes: [\"webagent.deep_research:manage\"],\n },\n );\n },\n cancel: async () => asRecord((await api.cancel<unknown>({ token, runId })).data),\n listArtifacts: async () => {\n const res = await api.listArtifacts<{ items?: unknown }>({ token, runId });\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 CaptureOptions,\n type RunWireOps,\n type SessionRef,\n} from \"./run-handle\";\nimport type { DoAnythingEvent } 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\";\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 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 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\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 },\n ): Promise<QoniResponse<T>> =>\n transport.webAgentJson(\n \"GET\",\n `/do_anything/runs/${encodeURIComponent(input.runId)}`,\n input.token,\n {\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 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 function buildOps(\n token: string | undefined,\n runId: string,\n capture: CaptureOptions | undefined,\n ): RunWireOps {\n return {\n getDetail: async () => asRecord((await api.getRun<unknown>({ token, runId })).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) => {\n await transport.webAgentJson(\n (action.method || \"POST\") as QoniHttpMethod,\n action.endpoint,\n token,\n {\n ...(body !== undefined ? { body } : {}),\n requiredScopes: [\"webagent.do_anything:manage\"],\n },\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 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\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 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 });\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 { QoniResponse, QoniTransport, JsonObject } from \"./types\";\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: { adminTokenFor?: GenAuthAdminTokenProvider } = {},\n) {\n return {\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, type Interaction } from \"./interactions\";\nimport { camelizeRecord, 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 }\n | { kind: \"interval\"; intervalSeconds: number };\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(action: Action, body: JsonObject | undefined): Promise<void>;\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 camelizeRecord(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 camelizeRecord(await this.ops.update({ action: \"pause\" }));\n }\n\n /** Resume a paused monitor. */\n async resume(): Promise<JsonObject> {\n return camelizeRecord(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 camelizeRecord(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 camelizeRecord(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) =>\n this.ops.postAction(action, body),\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) => {\n await transport.webAgentJson(\n (action.method || \"POST\") as QoniHttpMethod,\n action.endpoint,\n token,\n {\n ...(body !== undefined ? { body } : {}),\n requiredScopes: [\"webagent.track:manage\"],\n },\n );\n },\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 created = await api.createMonitor<{ id?: string; monitor_id?: string }>({\n token,\n intent: prompt,\n ...snakeifyKeys(rest),\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 = camelizeRecord(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/** Normalize a {@link MonitorSchedule} to the backend's wire shape. */\nfunction normalizeSchedule(schedule: MonitorSchedule): JsonObject {\n if (schedule.kind === \"interval\") {\n return { kind: \"interval\", interval_seconds: schedule.intervalSeconds };\n }\n return { kind: \"cron\", expr: schedule.expr };\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 }): Promise<QoniResponse<T>> =>\n transport.webAgentJson(\n \"GET\",\n `/web_search/runs/${encodeURIComponent(input.runId)}`,\n input.token,\n {\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 () => asRecord((await api.get<unknown>({ token, runId })).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://anima.eazo.ai/dashboard\";\n\nexport class QoniAgentKit {\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 readonly productTokenCache = new Map<string, { token: string; expiresAt: number }>();\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 });\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 const runtimeToken = await this.productTokenFor(\"webagent\", token, payload.requiredScopes);\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 const runtimeToken = await this.productTokenFor(\"webagent\", token, payload.requiredScopes);\n const baseUrl = await this.baseUrlFor(\"webagent\");\n const response = await 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 );\n if (!response.ok) {\n throw errorFromPayload(\n response.status,\n await readJson(response),\n `Qoni request failed with HTTP ${response.status}`,\n );\n }\n const buffer = await response.arrayBuffer();\n return {\n bytes: new Uint8Array(buffer),\n mime: response.headers.get(\"content-type\") || \"application/octet-stream\",\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 = 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 );\n const payload = await readJson(response);\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 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 options.signal,\n { streamBody: true },\n );\n if (!response.ok) {\n throw errorFromPayload(\n response.status,\n await readJson(response),\n `Qoni stream failed with HTTP ${response.status}`,\n );\n }\n if (!response.body) {\n throw errorFromPayload(502, undefined, \"Qoni stream response has no body\");\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n try {\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 if (options.signal?.aborted) {\n await reader.cancel().catch(() => undefined);\n throw options.signal.reason || new DOMException(\"Aborted\", \"AbortError\");\n }\n const { done, value } = await reader.read();\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 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 reader.releaseLock();\n }\n }\n\n private async fetchWithTimeout(\n input: URL,\n init: RequestInit,\n signal?: AbortSignal,\n opts?: { streamBody?: boolean },\n ): Promise<Response> {\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 try {\n return await this.fetchImpl(resolved.url, { ...requestInit, signal: controller.signal });\n } catch (error) {\n if ((isAbortError(error) && didTimeout) || isConnectTimeoutError(error)) {\n throw timeoutError(error);\n }\n if (isFetchNetworkError(error)) throw networkError(error);\n throw error;\n } finally {\n clearTimeout(timeout);\n // For one-shot requests the body is consumed before we return, so the\n // user-signal → request-controller link can be dropped here. For SSE the\n // body outlives this call — keep the link so a later abort still kills\n // the stream (the listener is once:true and the controller is per-call,\n // so nothing accumulates beyond the connection's lifetime).\n if (!opts?.streamBody) signal?.removeEventListener(\"abort\", abortFromSignal);\n }\n }\n\n private async baseUrlFor(service: QoniService): Promise<string> {\n const explicit = this.explicitBaseUrlFor(service);\n if (explicit) return explicit;\n const runtime = await this.runtimeConfig();\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 if (service === \"qoni\") return this.host;\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 = await this.fetchWithTimeout(\n urlWithBasePath(this.host, pathname),\n {\n method: \"GET\",\n headers: {\n accept: \"application/json\",\n ...headers,\n },\n },\n );\n const payload = await readJson(response);\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 const scopes = [...(requiredScopes || [])].sort();\n const cacheKey = [service, runtimeToken, scopes.join(\" \")].join(\":\");\n const cached = this.productTokenCache.get(cacheKey);\n if (cached && cached.expiresAt > Date.now() + 30_000) return cached.token;\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 this.productTokenCache.set(cacheKey, {\n token: accessToken,\n expiresAt: Date.now() + Math.max(0, readExpiresIn(payload) ?? 3600) * 1000,\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\nexport { QoniAgentKit as Qoni };\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 readJson(response: Response): Promise<unknown> {\n const contentType = response.headers.get(\"content-type\")?.toLowerCase() || \"\";\n if (contentType.includes(\"ndjson\") || contentType.includes(\"jsonl\")) {\n const body = await response.text();\n if (!body.trim()) return [];\n try {\n return body\n .split(/\\r?\\n/)\n .filter((line) => line.trim().length > 0)\n .map((line) => JSON.parse(line));\n } catch {\n return undefined;\n }\n }\n return response.json().catch(() => undefined);\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 (!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 deprecated top-level `userId`). Interactive mode (`mode: \\\"interactive\\\"`) \" +\n \"does not need one.\",\n );\n }\n body.agent = input.agent ?? \"sdk\";\n body.scopes = resolveDelegationScopes(input.scopes, input.products);\n delete body.products;\n return body;\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 (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 (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 isAbortError(error: unknown): boolean {\n return error instanceof DOMException && error.name === \"AbortError\";\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":["asString","detail","omit","asRecord","renameKeys","omit","isJsonObject","omit","renameKeys","omit","asRecord","renameKeys","omit","asRecord","renameKeys"]}
|
|
1
|
+
{"version":3,"sources":["../src/signature.ts","../src/auth.ts","../src/scopes.ts","../src/types.ts","../src/errors.ts","../src/run-events.ts","../src/generated/interaction-types.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 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} 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","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 /** 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 expiresIn?: string | number;\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 /** @deprecated Use user. */\n userId?: string;\n }\n | {\n user?: UserRef;\n /** @deprecated Use user. */\n userId: string;\n }\n);\n\nexport interface DelegateTokenInteractiveInput extends DelegateTokenBaseInput {\n mode: \"interactive\";\n redirectUri: string;\n state: string;\n user?: UserRef;\n /** @deprecated Use user. */\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 { KNOWN_SCOPES } from \"./scopes\";\nimport { 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.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 = 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 // Server permission errors pass through with the known scope set appended\n // so callers can see what a valid grant looks like without leaving the\n // stack trace.\n return new QoniPermissionDeniedError(appendKnownScopes(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};\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 appendKnownScopes(message: string): string {\n if (message.includes(\"Known scopes:\")) return message;\n return `${message} (Known scopes: ${KNOWN_SCOPES.join(\", \")})`;\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 /** 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) — those don't\n * go through the generic `shapeData`.\n */\nexport type RunProgressType = Exclude<QoniEventType, \"screenshot\" | \"done\" | \"interaction\">;\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/** `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: \"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\" | \"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 bytes = isBase64\n ? new Uint8Array(Buffer.from(body, \"base64\"))\n : new TextEncoder().encode(decodeURIComponent(body));\n return { bytes, mime: mime || \"application/octet-stream\" };\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 \"run.browser_live_url_changed\": \"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 // 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","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 { 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) => Promise<void>;\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 answer(text: string): Promise<void> {\n return this.invoke(ActionKinds.answer, { response: text });\n }\n /** Skip / dismiss the interaction (proceed without acting on it). */\n skip(): Promise<void> {\n return this.invoke(ActionKinds.skip);\n }\n /** Confirm a pending confirmation (approve the plan / destructive op). */\n confirm(): Promise<void> {\n return this.invoke(ActionKinds.confirm);\n }\n /** Reject a pending confirmation. */\n reject(): Promise<void> {\n return this.invoke(ActionKinds.reject);\n }\n /** Open the login surface for a site_login interaction. */\n openLogin(): Promise<void> {\n return this.invoke(ActionKinds.openLogin);\n }\n /** Tell the agent the user has finished signing in. */\n confirmSignedIn(): Promise<void> {\n return this.invoke(ActionKinds.confirmSignedIn);\n }\n /** Connect to the live browser for a take_control interaction. */\n connectControl(): Promise<void> {\n return this.invoke(ActionKinds.connectControl);\n }\n /** Refresh the live control surface / live url. */\n refreshControl(): Promise<void> {\n return this.invoke(ActionKinds.refreshControl);\n }\n /** Hand control back to the agent. */\n releaseControl(): Promise<void> {\n return this.invoke(ActionKinds.releaseControl);\n }\n /** Retry a wait interaction now. */\n retry(): Promise<void> {\n return this.invoke(ActionKinds.retry);\n }\n /** Switch the profile a wait/login interaction is bound to. */\n switchProfile(): Promise<void> {\n return this.invoke(ActionKinds.switchProfile);\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<void> {\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 await this.post(action, body);\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 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(action: Action, body: JsonObject | undefined): Promise<void>;\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 waitWithSignal(() => 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 waitWithSignal(() => 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 waitWithSignal(() => 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) =>\n this.ops.postAction(action, body),\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\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 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) => {\n await transport.webAgentJson(\n (action.method || \"POST\") as QoniHttpMethod,\n action.endpoint,\n token,\n {\n ...(body !== undefined ? { body } : {}),\n requiredScopes: [\"webagent.deep_research:manage\"],\n },\n );\n },\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 CaptureOptions,\n type RunWireOps,\n type SessionRef,\n} from \"./run-handle\";\nimport type { DoAnythingEvent } 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\";\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 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 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\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 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 function buildOps(\n token: string | undefined,\n runId: string,\n capture: CaptureOptions | undefined,\n ): RunWireOps {\n return {\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) => {\n await transport.webAgentJson(\n (action.method || \"POST\") as QoniHttpMethod,\n action.endpoint,\n token,\n {\n ...(body !== undefined ? { body } : {}),\n requiredScopes: [\"webagent.do_anything:manage\"],\n },\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 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\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 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 });\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 { QoniResponse, QoniTransport, JsonObject } from \"./types\";\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: { adminTokenFor?: GenAuthAdminTokenProvider } = {},\n) {\n return {\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, type Interaction } from \"./interactions\";\nimport { camelizeRecord, 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 }\n | { kind: \"interval\"; intervalSeconds: number };\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(action: Action, body: JsonObject | undefined): Promise<void>;\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 camelizeRecord(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 camelizeRecord(await this.ops.update({ action: \"pause\" }));\n }\n\n /** Resume a paused monitor. */\n async resume(): Promise<JsonObject> {\n return camelizeRecord(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 camelizeRecord(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 camelizeRecord(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) =>\n this.ops.postAction(action, body),\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) => {\n await transport.webAgentJson(\n (action.method || \"POST\") as QoniHttpMethod,\n action.endpoint,\n token,\n {\n ...(body !== undefined ? { body } : {}),\n requiredScopes: [\"webagent.track:manage\"],\n },\n );\n },\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 created = await api.createMonitor<{ id?: string; monitor_id?: string }>({\n token,\n intent: prompt,\n ...snakeifyKeys(rest),\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 = camelizeRecord(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/** Normalize a {@link MonitorSchedule} to the backend's wire shape. */\nfunction normalizeSchedule(schedule: MonitorSchedule): JsonObject {\n if (schedule.kind === \"interval\") {\n return { kind: \"interval\", interval_seconds: schedule.intervalSeconds };\n }\n return { kind: \"cron\", expr: schedule.expr };\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 readonly productTokenCache = new Map<string, { token: string; expiresAt: number }>();\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 });\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 const scopes = [...(requiredScopes || [])].sort();\n const cacheKey = [service, runtimeToken, scopes.join(\" \")].join(\":\");\n const cached = this.productTokenCache.get(cacheKey);\n if (cached && cached.expiresAt > Date.now() + 30_000) return cached.token;\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 this.productTokenCache.set(cacheKey, {\n token: accessToken,\n expiresAt: Date.now() + Math.max(0, readExpiresIn(payload) ?? 3600) * 1000,\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 (!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 deprecated top-level `userId`). Interactive mode (`mode: \\\"interactive\\\"`) \" +\n \"does not need one.\",\n );\n }\n body.agent = input.agent ?? \"sdk\";\n body.scopes = resolveDelegationScopes(input.scopes, input.products);\n delete body.products;\n return body;\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 (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":["asString","detail","omit","asRecord","renameKeys","omit","isJsonObject","omit","renameKeys","omit","asRecord","renameKeys","omit","asRecord","renameKeys","response"]}
|