@opengeni/sdk 0.44.6 → 0.46.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/sse.ts","../src/stream.ts","../src/workspace-control-stream.ts","../src/types.ts","../src/client.ts","../src/transcription.ts"],"sourcesContent":["/**\n * Minimal incremental Server-Sent Events parser over a byte stream.\n *\n * Implements the parts of the SSE wire format OpenGeni uses: `id`, `event`,\n * and `data` fields, multi-line data, comment lines, and both LF and CRLF\n * line endings. Messages without any `data` (comments, id-only blocks) are\n * not emitted.\n */\nexport type SseMessage = {\n id?: string;\n event?: string;\n data: string;\n};\n\nexport async function* parseSseStream(\n stream: ReadableStream<Uint8Array>,\n): AsyncGenerator<SseMessage, void, void> {\n const reader = stream.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n let id: string | undefined;\n let event: string | undefined;\n let dataLines: string[] | null = null;\n\n const dispatch = (): SseMessage | null => {\n const message =\n dataLines === null\n ? null\n : {\n ...(id !== undefined ? { id } : {}),\n ...(event !== undefined ? { event } : {}),\n data: dataLines.join(\"\\n\"),\n };\n id = undefined;\n event = undefined;\n dataLines = null;\n return message;\n };\n\n const handleLine = (line: string): SseMessage | null => {\n if (line === \"\") {\n return dispatch();\n }\n if (line.startsWith(\":\")) {\n return null;\n }\n const colon = line.indexOf(\":\");\n const field = colon === -1 ? line : line.slice(0, colon);\n let value = colon === -1 ? \"\" : line.slice(colon + 1);\n if (value.startsWith(\" \")) {\n value = value.slice(1);\n }\n if (field === \"data\") {\n (dataLines ??= []).push(value);\n } else if (field === \"event\") {\n event = value;\n } else if (field === \"id\") {\n id = value;\n }\n // Other fields (e.g. `retry`) are ignored; reconnect pacing is the\n // streaming layer's concern.\n return null;\n };\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n break;\n }\n buffer += decoder.decode(value, { stream: true });\n let newline = buffer.indexOf(\"\\n\");\n while (newline !== -1) {\n let line = buffer.slice(0, newline);\n buffer = buffer.slice(newline + 1);\n if (line.endsWith(\"\\r\")) {\n line = line.slice(0, -1);\n }\n const message = handleLine(line);\n if (message) {\n yield message;\n }\n newline = buffer.indexOf(\"\\n\");\n }\n }\n // Per the SSE spec, a block is only dispatched on a blank line. Anything\n // still pending at end-of-stream came from a truncated connection and is\n // discarded — the streaming layer replays from its cursor on reconnect.\n } finally {\n await reader.cancel().catch(() => {});\n reader.releaseLock();\n }\n}\n","import { isAbortError, isRetryableStreamError, OpenGeniStreamError } from \"./errors\";\nimport { parseSseStream } from \"./sse\";\nimport type { SessionEvent } from \"./types\";\n\n/**\n * Transport boundary for the streaming core. The client implements it with\n * `fetch`; unit tests script it directly.\n */\nexport type SessionEventStreamTransport = {\n /** Open the SSE stream, replaying durable events after `after` first. */\n openStream: (\n after: number,\n signal: AbortSignal | undefined,\n ) => Promise<ReadableStream<Uint8Array>>;\n /** Replay durable events by sequence (`GET .../events?after=&limit=`). */\n listEvents: (after: number, limit: number) => Promise<SessionEvent[]>;\n};\n\nexport type StreamConnectionState = \"connecting\" | \"live\" | \"reconnecting\";\n\nexport type StreamSessionEventsOptions = {\n /** Resume after this sequence number (exclusive). Defaults to 0 (full replay). */\n after?: number;\n /** Aborting ends the stream gracefully (the generator returns). */\n signal?: AbortSignal;\n /** Reconnect on transient drops. Defaults to true. */\n reconnect?: boolean;\n /** Initial reconnect backoff. Defaults to 500ms. */\n reconnectDelayMs?: number;\n /** Backoff ceiling. Defaults to 10s. */\n maxReconnectDelayMs?: number;\n /**\n * Give up after this many consecutive failed reconnect attempts (i.e. N\n * reconnects = N+1 total open-stream calls). Defaults to unlimited.\n */\n maxReconnectAttempts?: number;\n /** Await authoritative client reconciliation before exposing `live`. */\n beforeLive?: (() => void | Promise<void>) | undefined;\n onStateChange?: (state: StreamConnectionState) => void;\n};\n\n/**\n * Stream a session's events with exactly-once, in-order delivery.\n *\n * Guarantees, anchored on the per-session contiguous `sequence`:\n * - **No duplicates**: events at or below the cursor are dropped, so server\n * replay overlap and reconnect overlap never re-yield.\n * - **No gaps**: each reconnect resumes from the last seen sequence, and a\n * gap observed inside one connection is backfilled from the durable replay\n * endpoint before the newer event is yielded (events are durable before\n * they are published live, so the backfill always finds them).\n * - **Ordered**: sequences are yielded strictly ascending.\n *\n * The generator ends when `signal` aborts, when the server closes and\n * `reconnect` is false, or with an error for non-retryable failures.\n */\nexport async function* streamSessionEvents(\n transport: SessionEventStreamTransport,\n options: StreamSessionEventsOptions = {},\n): AsyncGenerator<SessionEvent, void, void> {\n const signal = options.signal;\n const reconnect = options.reconnect ?? true;\n const baseDelayMs = options.reconnectDelayMs ?? 500;\n const maxDelayMs = options.maxReconnectDelayMs ?? 10_000;\n const maxAttempts = options.maxReconnectAttempts ?? Number.POSITIVE_INFINITY;\n let cursor = options.after ?? 0;\n let failedAttempts = 0;\n let delayMs = baseDelayMs;\n let everConnected = false;\n\n while (true) {\n if (signal?.aborted) break;\n options.onStateChange?.(everConnected || failedAttempts > 0 ? \"reconnecting\" : \"connecting\");\n const cursorAtOpen = cursor;\n try {\n const body = await transport.openStream(cursor, signal);\n everConnected = true;\n failedAttempts = 0;\n delayMs = baseDelayMs;\n await options.beforeLive?.();\n options.onStateChange?.(\"live\");\n for await (const message of parseSseStream(body)) {\n // Re-check after every yield resumption: an abort from the consumer\n // must not let already-buffered events keep flowing.\n if (signal?.aborted) {\n return;\n }\n const event = parseSessionEvent(message.data);\n if (!event || event.sequence <= cursor) {\n continue;\n }\n if (event.sequence > cursor + 1) {\n for await (const missed of backfillEvents(transport, cursor, event.sequence - 1)) {\n cursor = missed.sequence;\n yield missed;\n if (signal?.aborted) {\n return;\n }\n }\n }\n cursor = event.sequence;\n yield event;\n }\n if (!reconnect) {\n return;\n }\n // Clean server close: reconnect immediately when the connection made\n // progress (servers legitimately cycle long SSE connections); pace\n // empty closes so a misbehaving server is not hammered in a hot loop.\n if (cursor === cursorAtOpen) {\n await sleep(baseDelayMs, signal);\n }\n continue;\n } catch (error) {\n if (signal?.aborted || isAbortError(error)) {\n return;\n }\n if (!reconnect || !isRetryableStreamError(error)) {\n throw error;\n }\n failedAttempts += 1;\n if (failedAttempts > maxAttempts) {\n throw new OpenGeniStreamError(\n `event stream gave up after ${maxAttempts} consecutive failed reconnect attempts: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n await sleep(delayMs, signal);\n delayMs = Math.min(Math.max(delayMs * 2, baseDelayMs), maxDelayMs);\n }\n}\n\n/**\n * Yield the durable events with `fromExclusive < sequence <= toInclusive`,\n * in order. Sequences are contiguous, so every one of them must exist in the\n * replay endpoint; if any is missing the function throws instead of skipping\n * it — continuing would silently break the gap-free delivery guarantee.\n */\nasync function* backfillEvents(\n transport: SessionEventStreamTransport,\n fromExclusive: number,\n toInclusive: number,\n): AsyncGenerator<SessionEvent, void, void> {\n let cursor = fromExclusive;\n while (cursor < toInclusive) {\n const page = await transport.listEvents(cursor, Math.min(500, toInclusive - cursor));\n const advancing = page\n .filter((event) => event.sequence > cursor && event.sequence <= toInclusive)\n .sort((a, b) => a.sequence - b.sequence);\n if (advancing.length === 0) {\n throw new OpenGeniStreamError(\n `event replay backfill stalled: expected sequences ${cursor + 1}..${toInclusive} but the replay endpoint returned none of them`,\n );\n }\n for (const event of advancing) {\n if (event.sequence !== cursor + 1) {\n throw new OpenGeniStreamError(\n `event replay backfill is missing sequence ${cursor + 1} (replay endpoint skipped to ${event.sequence}); refusing to deliver with a gap`,\n );\n }\n cursor = event.sequence;\n yield event;\n }\n }\n}\n\nfunction parseSessionEvent(data: string): SessionEvent | null {\n let parsed: unknown;\n try {\n parsed = JSON.parse(data);\n } catch {\n return null;\n }\n if (\n typeof parsed !== \"object\" ||\n parsed === null ||\n typeof (parsed as { sequence?: unknown }).sequence !== \"number\" ||\n typeof (parsed as { type?: unknown }).type !== \"string\" ||\n typeof (parsed as { id?: unknown }).id !== \"string\"\n ) {\n return null;\n }\n return parsed as SessionEvent;\n}\n\nasync function sleep(delayMs: number, signal: AbortSignal | undefined): Promise<void> {\n if (signal?.aborted || delayMs <= 0) {\n return;\n }\n await new Promise<void>((resolve) => {\n const timer = setTimeout(done, delayMs);\n function done(): void {\n clearTimeout(timer);\n signal?.removeEventListener(\"abort\", done);\n resolve();\n }\n signal?.addEventListener(\"abort\", done, { once: true });\n });\n}\n","import { isAbortError, isRetryableStreamError, OpenGeniStreamError } from \"./errors\";\nimport { parseSseStream } from \"./sse\";\nimport type { StreamSessionEventsOptions } from \"./stream\";\nimport type { WorkspaceControlEvent } from \"./types\";\n\nexport type WorkspaceControlStreamTransport = {\n /** The server replays every durable event after the cursor before going live. */\n openStream: (\n after: number,\n signal: AbortSignal | undefined,\n ) => Promise<ReadableStream<Uint8Array>>;\n};\n\n/**\n * Reconnecting workspace invalidation stream. Control revisions are monotonic\n * but can begin above one after the one-way migration, so unlike conversation\n * events this stream intentionally permits sparse sequence values.\n */\nexport async function* streamWorkspaceControlEvents(\n transport: WorkspaceControlStreamTransport,\n options: StreamSessionEventsOptions = {},\n): AsyncGenerator<WorkspaceControlEvent, void, void> {\n const signal = options.signal;\n const reconnect = options.reconnect ?? true;\n const baseDelayMs = options.reconnectDelayMs ?? 500;\n const maxDelayMs = options.maxReconnectDelayMs ?? 10_000;\n const maxAttempts = options.maxReconnectAttempts ?? Number.POSITIVE_INFINITY;\n let cursor = options.after ?? 0;\n let failures = 0;\n let delayMs = baseDelayMs;\n let everConnected = false;\n\n for (;;) {\n if (signal?.aborted) return;\n options.onStateChange?.(everConnected || failures > 0 ? \"reconnecting\" : \"connecting\");\n const cursorAtOpen = cursor;\n try {\n const body = await transport.openStream(cursor, signal);\n everConnected = true;\n failures = 0;\n delayMs = baseDelayMs;\n await options.beforeLive?.();\n options.onStateChange?.(\"live\");\n for await (const message of parseSseStream(body)) {\n if (signal?.aborted) return;\n const event = parseWorkspaceControlEvent(message.data);\n if (!event || event.sequence <= cursor) continue;\n cursor = event.sequence;\n yield event;\n }\n if (!reconnect) return;\n if (cursor === cursorAtOpen) await sleep(baseDelayMs, signal);\n continue;\n } catch (error) {\n if (signal?.aborted || isAbortError(error)) return;\n if (!reconnect || !isRetryableStreamError(error)) throw error;\n failures += 1;\n if (failures > maxAttempts) {\n throw new OpenGeniStreamError(\n `workspace control stream gave up after ${maxAttempts} reconnect attempts: ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n }\n }\n await sleep(delayMs, signal);\n delayMs = Math.min(Math.max(delayMs * 2, baseDelayMs), maxDelayMs);\n }\n}\n\nfunction parseWorkspaceControlEvent(data: string): WorkspaceControlEvent | null {\n let value: unknown;\n try {\n value = JSON.parse(data);\n } catch {\n return null;\n }\n if (\n typeof value !== \"object\" ||\n value === null ||\n (value as { type?: unknown }).type !== \"workspace.control.changed\" ||\n typeof (value as { id?: unknown }).id !== \"string\" ||\n typeof (value as { sequence?: unknown }).sequence !== \"number\"\n ) {\n return null;\n }\n return value as WorkspaceControlEvent;\n}\n\nasync function sleep(delayMs: number, signal: AbortSignal | undefined): Promise<void> {\n if (signal?.aborted || delayMs <= 0) return;\n await new Promise<void>((resolve) => {\n const timer = setTimeout(done, delayMs);\n function done() {\n clearTimeout(timer);\n signal?.removeEventListener(\"abort\", done);\n resolve();\n }\n signal?.addEventListener(\"abort\", done, { once: true });\n });\n}\n","import type { WorkspaceTranscriptionPolicy } from \"./transcription\";\n\n// Hand-written mirrors of the public wire shapes in `@opengeni/contracts`.\n// The SDK keeps zero runtime dependencies so it stays framework-agnostic and\n// publishable on its own; `test/contract-parity.test.ts` pins these types to\n// the contracts package so drift fails the gate instead of shipping.\n\nexport type CodexRealtimeWebrtcVersion = \"v3\";\nexport type CodexRealtimeVoice =\n | \"juniper\"\n | \"maple\"\n | \"spruce\"\n | \"ember\"\n | \"vale\"\n | \"breeze\"\n | \"arbor\"\n | \"sol\"\n | \"cove\";\n\nexport type CodexRealtimeWebrtcRequest = {\n realtimeId: string;\n operationId: string;\n browserInstanceId: string;\n ownerKey: string;\n expectedVersion: number;\n expectedConnectionEpoch: number;\n rotate: boolean;\n browserActivation?: \"required\" | undefined;\n sdp: string;\n version: CodexRealtimeWebrtcVersion;\n instructions?: string | undefined;\n voice?: CodexRealtimeVoice | undefined;\n};\n\nexport type CodexRealtimeWebrtcResponse = {\n sdp: string;\n version: CodexRealtimeWebrtcVersion;\n model: \"gpt-live-1-boulder-alpha\";\n connectionId: string;\n connectionEpoch: number;\n startupFenceSequence: number;\n modeVersion: number;\n replay: boolean;\n};\n\nexport type GatewayRealtimeConnectRequest = {\n realtimeId: string;\n operationId: string;\n browserInstanceId: string;\n ownerKey: string;\n expectedVersion: number;\n expectedConnectionEpoch: number;\n rotate: boolean;\n};\n\nexport type GatewayRealtimeInitialItem = {\n role: \"user\" | \"developer\" | \"assistant\";\n text: string;\n};\n\nexport type GatewayRealtimeConnectResponse = {\n token: string;\n url: string;\n upstreamModelId: string;\n expiresAt: number | null;\n connectionId: string;\n connectionEpoch: number;\n startupFenceSequence: number;\n modeVersion: number;\n initialItems: GatewayRealtimeInitialItem[];\n instructions: string;\n replay: false;\n};\n\nexport type ActivateCodexRealtimeConnectionRequest = {\n operationId: string;\n browserInstanceId: string;\n ownerKey: string;\n connectionEpoch: number;\n expectedVersion: number;\n expectedConnectionEpoch: number;\n};\n\nexport type SessionRealtimeLedgerDirection = \"provider_in\" | \"provider_out\";\nexport type SessionRealtimeLedgerKind =\n | \"user_transcript\"\n | \"assistant_transcript\"\n | \"delegation_call\"\n | \"delegation_progress\"\n | \"delegation_result\"\n | \"interruption\"\n | \"session_update\"\n | \"error\";\n\nexport type SessionRealtimeLedgerEntry = {\n id: string;\n realtimeId: string;\n operationId: string;\n connectionEpoch: number;\n sequence: number;\n direction: SessionRealtimeLedgerDirection;\n kind: SessionRealtimeLedgerKind;\n role: \"user\" | \"assistant\" | null;\n providerEventId: string | null;\n delegationItemId: string | null;\n sourceUpdateId: string | null;\n historyItemId: string | null;\n turnId: string | null;\n text: string | null;\n payload: Record<string, unknown>;\n clientAckedAt: string | null;\n providerAckedAt: string | null;\n createdAt: string;\n updatedAt: string;\n};\n\nexport type SessionRealtimeInboundEntry = {\n operationId: string;\n kind: Exclude<\n SessionRealtimeLedgerKind,\n \"delegation_progress\" | \"delegation_result\" | \"session_update\"\n >;\n role?: \"user\" | \"assistant\" | null | undefined;\n providerEventId?: string | null | undefined;\n delegationItemId?: string | null | undefined;\n text?: string | null | undefined;\n payload?: Record<string, unknown> | undefined;\n};\n\nexport type SyncSessionRealtimeLedgerRequest = {\n browserInstanceId: string;\n ownerKey: string;\n expectedVersion: number;\n connectionId: string;\n connectionEpoch: number;\n entries?: SessionRealtimeInboundEntry[] | undefined;\n clientAckThroughSequence?: number | null | undefined;\n providerAckSequences?: number[] | undefined;\n providerStarted?:\n | { providerSessionId: string; providerEventId?: string | null | undefined }\n | undefined;\n};\n\nexport type SyncSessionRealtimeLedgerResponse = {\n accepted: Array<{ entry: SessionRealtimeLedgerEntry; replay: boolean }>;\n outbound: SessionRealtimeLedgerEntry[];\n};\n\nexport type SessionRealtimeModel =\n | \"gpt-live-1-boulder-alpha\"\n | \"opengeni-gateway/openai/gpt-realtime-2.1\"\n | \"opengeni-gateway/openai/gpt-realtime-mini\"\n | \"opengeni-gateway/xai/grok-voice-think-fast-2.0\"\n | \"workspace-gateway/openai/gpt-realtime-2.1\"\n | \"workspace-gateway/openai/gpt-realtime-mini\"\n | \"workspace-gateway/xai/grok-voice-think-fast-2.0\";\n\nexport type WorkspaceRealtimeModelCatalogItem = {\n id: SessionRealtimeModel;\n label: string;\n provider: \"OpenGeni\" | \"Connected Codex\" | \"Your Gateway\";\n description: string;\n available: boolean;\n unavailableReason: string | null;\n recommended: boolean;\n};\n\nexport type WorkspaceRealtimeModelCatalogResponse = {\n models: WorkspaceRealtimeModelCatalogItem[];\n};\nexport type SessionRealtimeState = \"active\" | \"ended\";\nexport type SessionRealtimeEndReason = \"user_stop\" | \"browser_unload\" | \"lease_expired\";\n\nexport type SessionRealtimeMode = {\n id: string;\n sessionId: string;\n operationId: string;\n browserInstanceId: string;\n model: SessionRealtimeModel;\n state: SessionRealtimeState;\n version: number;\n connectionEpoch: number;\n leaseExpiresAt: string;\n lastHeartbeatAt: string;\n startedAt: string;\n endedAt: string | null;\n endReason: SessionRealtimeEndReason | null;\n};\n\nexport type BeginSessionRealtimeRequest = {\n operationId: string;\n browserInstanceId: string;\n ownerKey: string;\n model: SessionRealtimeModel;\n};\n\nexport type RenewSessionRealtimeRequest = {\n browserInstanceId: string;\n ownerKey: string;\n expectedVersion: number;\n};\n\nexport type EndSessionRealtimeRequest = RenewSessionRealtimeRequest & {\n reason: Extract<SessionRealtimeEndReason, \"user_stop\" | \"browser_unload\">;\n};\n\nexport type SessionRealtimeMutationResponse = {\n mode: SessionRealtimeMode;\n replay: boolean;\n};\n\nexport type SessionStatus =\n | \"queued\"\n | \"running\"\n | \"idle\"\n | \"requires_action\"\n | \"recovering\"\n | \"waiting_capacity\"\n | \"failed\"\n | \"cancelled\";\n\n// Mirror of `@opengeni/contracts` SandboxBackend (11 values; every member is\n// additive at the end). 3-way enum parity is pinned by\n// `test/contract-parity.test.ts`.\nexport type SandboxBackend =\n | \"docker\"\n | \"modal\"\n | \"local\"\n | \"none\"\n | \"daytona\"\n | \"runloop\"\n | \"e2b\"\n | \"blaxel\"\n | \"cloudflare\"\n | \"vercel\"\n | \"selfhosted\";\n\n// Mirror of `@opengeni/contracts` SandboxOs. Only \"linux\" is reachable in v1.\nexport type SandboxOs = \"linux\" | \"macos\" | \"windows\";\n\n// Mirror of `@opengeni/contracts` SandboxCapabilityName.\nexport type SandboxCapabilityName =\n | \"FileSystem\"\n | \"Terminal\"\n | \"Git\"\n | \"DesktopStream\"\n | \"Recording\";\n\n// Mirror of `@opengeni/contracts` CapabilityUnavailableReason.\nexport type CapabilityUnavailableReason =\n | \"backend_unsupported\"\n | \"os_unsupported\"\n | \"not_provisioned\"\n | \"disabled_by_policy\"\n | \"lease_cold\"\n | \"tier_headless\"\n // selfhosted (bring-your-own-compute) negotiation states:\n | \"agent_offline\"\n | \"agent_reconnecting\"\n | \"consent_required\"\n | \"display_unavailable\";\n\n// Mirror of `@opengeni/contracts` SessionCapabilities (the negotiated handshake\n// document). The descriptor table itself is NOT mirrored — it lives in\n// contracts (P0.1) and is consumed by the SDK config in a later PR.\nexport type SessionCapabilities = {\n sessionId: string;\n backend: SandboxBackend;\n os: SandboxOs;\n liveness: \"cold\" | \"warming\" | \"warm\" | \"draining\";\n leaseEpoch: number;\n workspaceGeneration: number | null;\n archiveGeneration: number | null;\n archiveComplete: boolean;\n viewerHeartbeatIntervalMs: number;\n FileSystem: {\n available: boolean;\n readOnly: boolean;\n root: string;\n pathSep: \"/\" | \"\\\\\";\n treeMode: \"lazy\" | \"snapshot\";\n reason: CapabilityUnavailableReason | null;\n };\n Terminal: {\n transport: \"sse-events\" | \"pty-ws\" | null;\n ptyCapable: boolean;\n shell: string;\n url: string | null;\n token: string | null;\n reason: CapabilityUnavailableReason | null;\n };\n Git: {\n available: boolean;\n repos: string[];\n reason: CapabilityUnavailableReason | null;\n };\n DesktopStream: {\n // \"relay-frames\" + \"frames\": the selfhosted framebuffer stream — PNG-per-frame\n // protobuf datagrams over the relay, painted by a canvas client (NOT RFB).\n transport: \"vnc-ws\" | \"rdp-ws\" | \"webrtc\" | \"relay-frames\" | null;\n client: \"novnc\" | \"web-rdp\" | \"frames\" | null;\n mode: \"read-only\" | \"interactive\";\n url: string | null;\n token: string | null;\n expiresAt: string | null;\n resolution: [number, number];\n unredacted: boolean;\n requiresAcknowledgment: boolean;\n acknowledged: boolean;\n // Shared-exposure disclosure (addendum E.1): `shared` when the group has >1\n // session; `sharedSessionIds` lists the OTHER sessions' ids ONLY (never their\n // conversation/metadata).\n shared: boolean;\n sharedSessionIds: string[];\n reason: CapabilityUnavailableReason | null;\n };\n Recording: {\n available: boolean;\n modes: (\"manual\" | \"on-turn\" | \"on-verify\")[];\n codecs: (\"h264-mp4\" | \"vp9-webm\")[];\n reason: CapabilityUnavailableReason | null;\n };\n ComputerUse: {\n available: boolean;\n readOnly: boolean;\n reason: CapabilityUnavailableReason | null;\n };\n negotiatedAt: string;\n};\n\n// Convenience aliases for the per-surface cells of `SessionCapabilities`, so the\n// client hooks/components can take a single cell without restating the inline\n// shape. These are exact structural views of the cells above.\nexport type FileSystemCapability = SessionCapabilities[\"FileSystem\"];\nexport type TerminalCapability = SessionCapabilities[\"Terminal\"];\nexport type GitCapability = SessionCapabilities[\"Git\"];\nexport type DesktopStreamCapability = SessionCapabilities[\"DesktopStream\"];\nexport type RecordingCapability = SessionCapabilities[\"Recording\"];\nexport type ComputerUseCapability = SessionCapabilities[\"ComputerUse\"];\n\n// ── Stream-surfacing client surface (Phase 5) ───────────────────────────────\n// Mirrors of the contracts viewer-attach / acknowledge / heartbeat shapes that\n// the capability-gated client (`@opengeni/react`) drives. The desktop pixel\n// plane rides Channel B (direct-to-provider noVNC); the structured terminal/\n// files/git surfaces ride Channel A (the existing event spine + the synchronous\n// fs/git/terminal point queries above). These are TYPES only (the SDK keeps zero\n// runtime deps); the contract-parity test pins them.\n\n// Mirror of `@opengeni/contracts` StreamUrlRotatedPayload — the Channel-A event\n// the client folds in to hot-swap its noVNC socket on a box rollover, fenced on\n// leaseEpoch.\nexport type StreamUrlRotatedPayload = {\n url: string;\n token: string | null;\n expiresAt: string | null;\n leaseEpoch: number;\n transport: \"vnc-ws\";\n viewerId: string | null;\n};\nexport type StreamOpenedPayload = {\n viewerId: string;\n shared: boolean;\n viewerCount: number;\n};\nexport type StreamClosedPayload = {\n viewerId: string;\n reason: \"client-disconnect\" | \"reaped\" | \"revoked\" | \"box-rollover\";\n viewerCount: number;\n};\nexport type StreamRevokedPayload = {\n viewerId: string | null;\n reason: \"grant-revoked\" | \"session-failed\" | \"admin\";\n};\n\n// Mirror of `@opengeni/contracts` AttachViewerRequest. Omitting `viewerId` mints\n// a fresh holder id (returned on the response, carried through heartbeat/detach).\n// `desktop:true` opts into the un-redacted pixel plane (the consent-gated noVNC\n// stream); a terminal/files-only warm attach omits it (defaults false) so it\n// warms the box + mints the pty-ws terminal cell WITHOUT tripping the consent 409.\nexport type AttachViewerRequest = {\n viewerId?: string | undefined;\n desktop?: boolean | undefined;\n};\n\n// Mirror of `@opengeni/contracts` ViewerHolder + the P4.2 desktop-stream fields\n// the POST /viewers handler folds in when the pixel plane is minted in-process.\nexport type ViewerHolder = {\n viewerId: string;\n sandboxGroupId: string;\n liveness: \"cold\" | \"warming\" | \"warm\" | \"draining\";\n leaseEpoch: number;\n workspaceGeneration: number | null;\n archiveGeneration: number | null;\n archiveComplete: boolean;\n viewerHeartbeatIntervalMs: number;\n dataPlaneUrl: string | null;\n};\nexport type AttachViewerResponse = ViewerHolder & {\n // The scoped desktop-stream address minted for THIS holder (P4.2). Null when\n // the deployment is headless / desktop is disabled / the mint degraded —\n // the client then falls back to the Channel-A surfaces only.\n streamToken: string | null;\n streamExpiresAt: string | null;\n resolution: [number, number] | null;\n transport: \"vnc-ws\" | null;\n client: \"novnc\" | null;\n // The scoped ttyd PTY-over-websocket address minted for THIS holder — the REAL\n // interactive terminal, symmetric with the desktop pixel plane (same Modal\n // tunnel, same scoped stream token). Populated on a warm box; null when the\n // terminal mint degraded (headless / no secret / tunnel failure), in which case\n // the client falls back to the Channel-A read-only command-output firehose.\n // `terminalTransport` is \"pty-ws\" iff a live `terminalUrl` was minted.\n terminalUrl: string | null;\n terminalToken: string | null;\n terminalTransport: \"pty-ws\" | null;\n};\n\n// Mirror of `@opengeni/contracts` AcknowledgeStreamRequest/Response — the\n// un-redacted-pixel + shared-exposure consent gate (P3.2).\nexport type AcknowledgeStreamRequest = {\n acknowledgeUnredacted?: boolean | undefined;\n acknowledgeShared?: boolean | undefined;\n};\nexport type AcknowledgeStreamResponse = {\n acknowledged: boolean;\n acknowledgedShared: boolean;\n};\n\n// Mirror of `@opengeni/contracts` ViewerHeartbeatRequest/Response — the\n// Channel-A viewer-liveness ping, epoch-fenced (a stale-epoch beat → alive:false\n// → the client re-attaches).\nexport type ViewerHeartbeatRequest = { leaseEpoch: number };\nexport type ViewerHeartbeatResponse = { alive: boolean };\n\nexport type ReasoningEffort = \"none\" | \"minimal\" | \"low\" | \"medium\" | \"high\" | \"xhigh\" | \"max\";\nexport type LatencyMode = \"standard\" | \"priority\" | \"fast\";\nexport type GitCredentialProvider = \"github\" | \"gitlab\" | \"azure_devops\";\nexport type GitCredentialBindingId = string;\nexport type GitRepositoryAccess = \"read\" | \"write\";\n\nexport type RepositoryResourceRef = {\n kind: \"repository\";\n uri: string;\n ref: string;\n /**\n * Optional workspace-relative override. When omitted, OpenGeni persists\n * `repos/<encoded-host>/<owner>/<repo>` so equal names on different Git\n * providers do not collide. Explicit paths are portable, traversal-free, and\n * collision-checked case-insensitively before sandbox execution.\n */\n mountPath?: string | undefined;\n subpath?: string | undefined;\n provider?: GitCredentialProvider | undefined;\n credentialBindingId?: GitCredentialBindingId | undefined;\n access?: GitRepositoryAccess | undefined;\n repositoryId?: number | string | undefined;\n installationId?: number | string | undefined;\n projectId?: number | string | undefined;\n connectionId?: string | undefined;\n githubInstallationId?: number | undefined;\n githubRepositoryId?: number | undefined;\n};\n\n/** Value mirror of `@opengeni/contracts`; parity-tested without adding an SDK runtime dependency. */\nexport const DEFAULT_FILE_RESOURCE_MOUNT_ROOT = \".opengeni/files\" as const;\n\nexport type FileResourceRef = {\n kind: \"file\";\n fileId: string;\n /** Optional workspace-relative override; defaults to `.opengeni/files/<file-id>`. */\n mountPath?: string | undefined;\n};\n\nexport type ResourceRef = RepositoryResourceRef | FileResourceRef;\n\nexport type ToolRef = {\n kind: \"mcp\";\n id: string;\n optional?: boolean | undefined;\n};\n\nexport type SessionToolPolicy = {\n mode: \"workspace_default\" | \"explicit\" | \"inherited\";\n inheritedFromSessionId: string | null;\n};\n\nexport type UpdateSessionToolPolicyRequest =\n | {\n mode: \"workspace_default\";\n expectedVersion: number;\n }\n | {\n mode: \"explicit\";\n tools: ToolRef[];\n firstPartyMcpTools: FirstPartyMcpToolName[];\n expectedVersion: number;\n };\n\nexport type SessionEffectiveToolPolicy = {\n mode: SessionToolPolicy[\"mode\"];\n inheritedFromSessionId: string | null;\n selectedIds: string[];\n effectiveIds: string[];\n mandatoryIds: string[];\n lazyRouter: {\n state: \"required\" | \"disabled\";\n deferredIds: string[];\n };\n configuredIds: string[];\n droppedIds: string[];\n counts: {\n selected: number;\n effective: number;\n mandatory: number;\n deferred: number;\n configured: number;\n dropped: number;\n };\n idsTruncated: boolean;\n};\n\nexport type GoalSpec = {\n text: string;\n successCriteria?: string | undefined;\n maxAutoContinuations?: number | undefined;\n};\n\nexport type SessionMcpServerInput = {\n id: string;\n name?: string | undefined;\n url: string;\n allowedTools?: string[] | undefined;\n timeoutMs?: number | undefined;\n cacheToolsList?: boolean | undefined;\n /** Require human approval for every tool, or only the listed unprefixed tool names. */\n requireApproval?: boolean | string[] | undefined;\n headers?: Record<string, string> | undefined;\n connectionRef?: McpServerConnectionRef | undefined;\n};\n\nexport type SessionMcpCredentialUpdateInput = {\n id: string;\n headers: Record<string, string>;\n};\n\nexport type SessionMcpApprovalPolicy = boolean | string[];\n\nexport type SessionMcpServerMetadata = {\n id: string;\n name: string | null;\n url: string;\n headerNames: string[];\n credentialVersion: number;\n requireApproval: SessionMcpApprovalPolicy;\n connectionRef: McpServerConnectionRef | null;\n};\n\nexport type UpdateSessionMcpApprovalPolicyRequest = {\n requireApproval: SessionMcpApprovalPolicy;\n};\n\nexport type UpdateSessionMcpApprovalPolicyResponse = {\n server: SessionMcpServerMetadata;\n effectiveFrom: \"next_attempt\";\n};\n\nexport type ConnectionKind = \"oauth2\" | \"api_key\" | \"app_install\" | \"delegated\";\nexport type ConnectionStatus = \"active\" | \"needs_reauth\" | \"revoked\" | \"error\";\n\nexport type McpServerConnectionRef = {\n connectionId?: string | undefined;\n provider?: string | undefined;\n providerDomain: string;\n kind?: ConnectionKind | undefined;\n scopes?: string[] | undefined;\n resource?: string | undefined;\n selectedResources?:\n | Array<{\n id: string;\n kind: \"repository\";\n }>\n | undefined;\n subjectScope?: \"workspace\" | \"subject\" | undefined;\n};\n\nexport type McpPersonalConnectionDelegation = {\n serverId: string;\n connectionId: string;\n ownerSubjectId: string;\n providerDomain: string;\n kind?: ConnectionKind | undefined;\n};\n\nexport type McpPersonalConnectionSummary = Pick<\n McpPersonalConnectionDelegation,\n \"serverId\" | \"providerDomain\"\n>;\n\nexport type ConnectionMetadata = {\n id: string;\n accountId: string;\n workspaceId: string;\n subjectId: string | null;\n providerDomain: string;\n kind: ConnectionKind;\n status: ConnectionStatus;\n grantedScopes: string[];\n expiresAt: string | null;\n lastRefreshAt: string | null;\n lastUsedAt: string | null;\n lastError: string | null;\n version: number;\n verifiedInstallAt?: string | null;\n verifiedInstallVersion?: number | null;\n metadata: Record<string, unknown>;\n createdBySubjectId: string | null;\n updatedBySubjectId: string | null;\n createdAt: string;\n updatedAt: string;\n};\n\nexport type CreateConnectionRequest = {\n providerDomain: string;\n kind: ConnectionKind;\n ownership?: ConnectionOwnership | undefined;\n /** @deprecated use ownership */\n subjectId?: string | null | undefined;\n credential: Record<string, unknown>;\n grantedScopes?: string[] | undefined;\n expiresAt?: string | null | undefined;\n metadata?: Record<string, unknown> | undefined;\n};\n\nexport type OpenGeniSlackBotInstallRequest = {\n /** Existing OpenGeni Slack bot connection to reinstall in place. */\n connectionId?: string | undefined;\n};\n\nexport type OpenGeniSlackBotInstallStart = {\n authorizationUrl: string;\n expiresAt: string;\n};\n\nexport type GoogleDriveTargetScope = \"user\" | \"workspace\" | \"organization\";\nexport type ConnectorDocumentDestinationAuthority = \"organization\" | \"workspace\" | \"personal\";\nexport type ConnectorDocumentDestinationSelection = {\n authorityKind: ConnectorDocumentDestinationAuthority;\n collectionId: string | null;\n};\nexport type ConnectorDocumentDestination = ConnectorDocumentDestinationSelection & {\n authorityAccountId: string;\n authorityWorkspaceId: string | null;\n authoritySubjectId: string | null;\n};\nexport type GoogleDriveSyncCadence = \"manual\" | \"hourly\" | \"daily\";\nexport type GoogleDriveReadPolicy = \"allow\" | \"ask\" | \"block\";\nexport type GoogleDriveConnectionLifecycleState =\n | \"active\"\n | \"paused\"\n | \"token_revoked\"\n | \"app_removed\"\n | \"disconnected\"\n | \"reconnect_required\"\n | \"reconsent_required\";\n\nexport type GoogleDriveConnectionLifecycle =\n | {\n state: Exclude<GoogleDriveConnectionLifecycleState, \"app_removed\">;\n recoverable: true;\n observedAt: string;\n }\n | { state: \"app_removed\"; recoverable: false; observedAt: string };\n\nexport type GoogleDriveSelectedSource = {\n id: string;\n name: string;\n mimeType: string;\n driveId: string | null;\n destination?: ConnectorDocumentDestination | undefined;\n /** @deprecated Missing destinations resolve to the current workspace boundary. */\n targetScope?: GoogleDriveTargetScope | undefined;\n syncCadence: GoogleDriveSyncCadence;\n readPolicy: GoogleDriveReadPolicy;\n selectedAt: string;\n};\n\nexport type GoogleDriveConnectionMetadata = {\n credentialRole: \"google_drive_metadata\";\n credentialLabel: \"Google Drive metadata browser\";\n googlePermissionId: string;\n googleEmail: string;\n googleDisplayName: string | null;\n verifiedAt: string;\n accessMode: \"metadata_readonly\" | \"readonly\";\n lifecycle?: GoogleDriveConnectionLifecycle | undefined;\n documentDestination?: ConnectorDocumentDestination | undefined;\n selectedSources?: GoogleDriveSelectedSource[] | undefined;\n /** @deprecated Read selectedSources; retained while existing connections migrate. */\n selectedSource?: GoogleDriveSelectedSource | null | undefined;\n [key: string]: unknown;\n};\n\nexport type GoogleDriveOAuthStartRequest = {\n connectionId?: string | undefined;\n};\n\nexport type GoogleDriveOAuthStartResponse = {\n authorizationUrl: string;\n expiresAt: string;\n};\n\nexport type GoogleDriveLifecycleActionRequest = {\n action: \"pause\" | \"resume\";\n expectedVersion: number;\n};\n\nexport type GoogleDriveDisconnectRequest = {\n expectedVersion: number;\n idempotencyKey: string;\n};\n\nexport type GoogleDriveBrowseItem = {\n id: string;\n name: string;\n mimeType: string;\n kind: \"folder\" | \"file\";\n driveId: string | null;\n modifiedTime: string | null;\n size: string | null;\n webViewLink: string | null;\n};\n\nexport type GoogleDriveBrowseResponse = {\n connection: ConnectionMetadata;\n parentId: string;\n current: GoogleDriveBrowseItem | null;\n items: GoogleDriveBrowseItem[];\n nextPageToken: string | null;\n incompleteSearch: boolean;\n};\n\nexport type SaveGoogleDriveSourceRequest = {\n sources: Array<Pick<GoogleDriveBrowseItem, \"id\" | \"name\" | \"mimeType\" | \"driveId\">>;\n destination?: ConnectorDocumentDestinationSelection | undefined;\n /** @deprecated Legacy requests resolve to workspace authority. */\n targetScope?: GoogleDriveTargetScope | undefined;\n syncCadence: GoogleDriveSyncCadence;\n readPolicy: GoogleDriveReadPolicy;\n};\n\nexport type UpdateConnectionRequest = {\n providerDomain?: string | undefined;\n subjectId?: string | null | undefined;\n kind?: ConnectionKind | undefined;\n status?: ConnectionStatus | undefined;\n credential?: Record<string, unknown> | undefined;\n grantedScopes?: string[] | undefined;\n expiresAt?: string | null | undefined;\n metadata?: Record<string, unknown> | undefined;\n};\n\nexport type ConnectionResponse = {\n connection: ConnectionMetadata;\n};\n\nexport type ListConnectionsResponse = {\n connections: ConnectionMetadata[];\n};\n\nexport type ConnectionOwnership = \"workspace\" | \"personal\";\n\nexport type OAuthStartRequest = {\n providerDomain?: string | undefined;\n mcpUrl?: string | undefined;\n resource?: string | undefined;\n requestedScopes?: string[] | undefined;\n returnPath?: string | undefined;\n connectionId?: string | undefined;\n ownership?: ConnectionOwnership | undefined;\n oauthClient?:\n | {\n clientId: string;\n clientSecret?: string | undefined;\n tokenEndpointAuthMethod?: \"none\" | \"client_secret_post\" | \"client_secret_basic\" | undefined;\n }\n | undefined;\n};\n\nexport type OAuthStartResponse = {\n state: string;\n authorizationUrl: string | null;\n expiresAt: string;\n};\n\nexport type SocialProvider =\n | \"x\"\n | \"reddit\"\n | \"linkedin\"\n | \"instagram\"\n | \"facebook\"\n | \"tiktok\"\n | \"youtube\"\n | \"custom\";\n\nexport type SocialConnectionStatus = \"connected\" | \"needs_reauth\" | \"disabled\";\n\nexport type SocialConnection = {\n id: string;\n accountId: string;\n workspaceId: string;\n provider: SocialProvider;\n accountHandle: string;\n accountName: string | null;\n externalAccountId: string | null;\n ownership: \"workspace\" | \"personal\";\n status: SocialConnectionStatus;\n scopes: string[];\n credentialRef: string | null;\n tokenMetadata: Record<string, unknown>;\n metadata: Record<string, unknown>;\n createdAt: string;\n updatedAt: string;\n};\n\nexport type SocialOAuthStartRequest = {\n provider: \"x\" | \"reddit\";\n ownership?: \"workspace\" | \"personal\" | undefined;\n scopes?: string[] | undefined;\n returnPath?: string | undefined;\n};\n\n/** The immutable principal whose authority accepted a session or turn. */\nexport type TurnInitiator = {\n kind: \"subject\" | \"service\";\n subjectId: string;\n /** Display-only snapshot; never an authorization input. */\n label?: string | undefined;\n};\n\n/** A trusted embedding host's causal machine/service principal. */\nexport type ServiceTurnInitiator = TurnInitiator & { kind: \"service\" };\n\nexport type TurnInitiatorContext = Record<string, unknown>;\n\n/** Bounded host provenance; OpenGeni-owned lineage keys are reserved. */\nexport type ServiceTurnInitiatorContext = TurnInitiatorContext;\n\nexport type IntegrationClientMetadata = {\n client_id: string;\n client_name: \"OpenGeni\";\n redirect_uris: string[];\n token_endpoint_auth_method: \"none\";\n grant_types: Array<\"authorization_code\" | \"refresh_token\">;\n response_types: [\"code\"];\n};\n\nexport type Session = {\n id: string;\n workspaceId: string;\n accountId: string;\n status: SessionStatus;\n initialMessage: string;\n title: string | null;\n titleSource: \"user\" | \"agent\" | null;\n // Per-session agent persona/system instructions supplied at create; null when\n // the session carried none. Org-visible metadata, never a timeline event.\n instructions: string | null;\n /** Immutable normalized prompt-policy role; distinct from membership roles. */\n policyRole: string | null;\n resources: ResourceRef[];\n skills: SessionSkill[];\n tools: ToolRef[];\n toolPolicy: SessionToolPolicy;\n toolPolicyVersion: number;\n effectiveToolPolicy?: SessionEffectiveToolPolicy | undefined;\n metadata: Record<string, unknown>;\n /** Frozen creator fact; later turns carry their own independent initiator. */\n createdBy: TurnInitiator;\n createdByContext: Record<string, unknown>;\n model: string;\n sandboxBackend: SandboxBackend;\n sandboxOs: SandboxOs;\n sandboxGroupId: string;\n activeSandboxId: string | null;\n activeEpoch: number;\n /** Explicit connected-machine project root; null uses the agent launch root. */\n workingDir: string | null;\n variableSetId: string | null;\n /** @deprecated use variableSetId */\n environmentId: string | null;\n // The rig + frozen rig version this session rides (M3). Both null for a\n // rig-less session. Frozen at create; a later rig promote never moves them.\n rigId: string | null;\n rigVersionId: string | null;\n firstPartyMcpPermissions: string[] | null;\n firstPartyMcpTools: FirstPartyMcpToolName[];\n mcpServers: SessionMcpServerMetadata[];\n parentSessionId: string | null;\n /** Immutable server-authored nested-agent lineage and policy snapshot. */\n rootSessionId: string;\n nestedAgentDepth: number;\n maxNestedAgentDepthOverride: number | null;\n effectiveMaxNestedAgentDepth: number;\n nestedAgentDepthPolicySource: \"session\" | \"workspace\" | \"deployment\" | \"default\";\n nestedAgentDepthPolicySessionId: string | null;\n createIdempotencyKey: string | null;\n temporalWorkflowId: string | null;\n activeTurnId: string | null;\n queueVersion: number;\n queueHeadPosition: number;\n queueTailPosition: number;\n effectiveControl: EffectiveSessionControl;\n lastSequence: number;\n /** Multi-account Codex (P1): the account this session is pinned to (null ⇒ follow workspace active). */\n codexPinnedCredentialId?: string | null;\n /** Multi-account Codex (P1): the account the most recent turn ran on (the \"Running on:\" indicator). */\n codexLastCredentialId?: string | null;\n /**\n * Frozen at create. `remote_v2` ⇒ Codex remote compaction + Codex-only model\n * admission; `portable` ⇒ plaintext compaction and free provider switching.\n */\n codexCompactionMode: \"remote_v2\" | \"portable\";\n /** Personal (authenticated subject) workspace pin state, never workspace-global. */\n pinned?: boolean;\n /** Stable pin ordering key; null when this subject has not pinned the session. */\n pinnedAt?: string | null;\n /** Optimistic pin-state revision; zero represents an absent pin relation. */\n pinVersion?: number;\n /** Server-authoritative descendant counts populated by session-list reads. */\n treeStats?:\n | {\n directChildren: number;\n totalDescendants: number;\n runningDescendants: number;\n queuedDescendants: number;\n attentionDescendants: number;\n pausedDescendants: number;\n failedDescendants: number;\n /** Counts are lower bounds rather than exact totals when true. */\n truncated: boolean;\n }\n | undefined;\n createdAt: string;\n updatedAt: string;\n};\n\n/** Additive receipt returned by POST /sessions. */\nexport type CreateSessionResponse = Session & {\n initialTurnId: string | null;\n};\n\nexport type SessionSummary = Session;\n\n/** Canonical session-list page; pinned rows are excluded from ordinary pages. */\nexport type SessionListResponse = {\n pinned: Session[];\n /** True when the server omitted older pins from its bounded pinned section. */\n pinnedTruncated?: boolean;\n sessions: Session[];\n nextCursor: string | null;\n};\n\nexport type UpdateSessionPinRequest = {\n pinned: boolean;\n expectedVersion?: number;\n};\n\nexport type LineageNode = {\n session: SessionSummary;\n children: LineageNode[];\n};\n\nexport type SessionLineageResponse = {\n ancestors: SessionSummary[];\n children: LineageNode[];\n truncated: boolean;\n};\n\nexport type SessionTurnStatus =\n | \"queued\"\n | \"running\"\n | \"requires_action\"\n | \"recovering\"\n | \"waiting_capacity\"\n | \"completed\"\n | \"failed\"\n | \"cancelled\"\n | \"superseded\"\n | \"withdrawn_for_edit\";\n\nexport type SessionTurnSource =\n | \"user\"\n | \"scheduled_task\"\n | \"api\"\n | \"goal\"\n | \"system\"\n | \"compaction\";\n\nexport type SessionTurn = {\n id: string;\n workspaceId: string;\n sessionId: string;\n triggerEventId: string;\n temporalWorkflowId: string;\n status: SessionTurnStatus;\n source: SessionTurnSource;\n position: number;\n prompt: string;\n resources: ResourceRef[];\n tools: ToolRef[];\n toolsProvided?: boolean | undefined;\n model: string;\n reasoningEffort: ReasoningEffort;\n latencyMode: LatencyMode;\n sandboxBackend: SandboxBackend;\n sandboxOs: SandboxOs | null;\n metadata: Record<string, unknown>;\n version: number;\n executionGeneration: number;\n activeAttemptId: string | null;\n lineage: Record<string, unknown>;\n initiator: TurnInitiator;\n initiatorContext: Record<string, unknown>;\n personalConnections?: McpPersonalConnectionSummary[] | undefined;\n cancelledBy?: string | null;\n cancelReason?: string | null;\n startedAt: string | null;\n finishedAt: string | null;\n createdAt: string;\n updatedAt: string;\n};\n\nexport type HumanInputQuestionKind = \"text\" | \"single_select\" | \"multi_select\";\n\nexport type HumanInputOption = {\n id: string;\n label: string;\n description?: string | null | undefined;\n};\n\nexport type HumanInputQuestion = {\n id: string;\n kind: HumanInputQuestionKind;\n prompt: string;\n label?: string | null | undefined;\n helpText?: string | null | undefined;\n options: HumanInputOption[];\n required: boolean;\n allowOther: boolean;\n validation?:\n | {\n minSelections?: number | null | undefined;\n maxSelections?: number | null | undefined;\n }\n | null\n | undefined;\n};\n\nexport type HumanInputAnswer = {\n questionId: string;\n values: string[];\n other?: string | null | undefined;\n};\n\nexport type HumanInputResponse =\n | { outcome: \"answered\"; answers: HumanInputAnswer[] }\n | { outcome: \"skipped\" | \"expired\" | \"cancelled\" };\n\nexport type SubmitHumanInputResponseRequest =\n | { outcome: \"answered\"; answers: HumanInputAnswer[] }\n | { outcome: \"skipped\" };\n\nexport type SessionHumanInputRequest = {\n id: string;\n workspaceId: string;\n sessionId: string;\n turnId: string;\n turnGeneration: number;\n creationAttemptId: string;\n toolCallId: string;\n status: \"pending\" | \"answered\" | \"skipped\" | \"expired\" | \"cancelled\";\n questions: HumanInputQuestion[];\n allowSkip: boolean;\n response: HumanInputResponse | null;\n respondedBy: string | null;\n respondedAt: string | null;\n expiresAt: string | null;\n createdAt: string;\n updatedAt: string;\n};\n\nexport const SESSION_EVENT_TYPES = [\n \"session.created\",\n // Defensive bounded projection for malformed/legacy oversized envelopes.\n \"session.event.envelope_omitted\",\n \"session.status.changed\",\n \"session.realtime.started\",\n \"session.realtime.ended\",\n \"session.requiresAction\",\n \"session.humanInput.requested\",\n \"session.context.compaction.requested\",\n \"session.context.compaction.started\",\n \"session.context.compacted\",\n \"session.context.compaction.skipped\",\n \"session.context.cleared\",\n \"user.message\",\n \"user.pause\",\n \"user.approvalDecision\",\n \"user.humanInputResponse\",\n \"turn.queued\",\n \"turn.started\",\n \"turn.completed\",\n \"turn.failed\",\n \"turn.cancelled\",\n \"turn.superseded\",\n \"turn.recovery.requested\",\n \"turn.capacity_waiting\",\n \"agent.message.delta\",\n \"agent.message.completed\",\n \"agent.reasoning.delta\",\n \"agent.toolCall.created\",\n \"agent.toolCall.output\",\n \"agent.model.request\",\n \"agent.model.usage\",\n \"tool.auth_needed\",\n \"credential.auth_needed\",\n \"agent.updated\",\n \"rig.setup.started\",\n \"rig.setup.completed\",\n \"rig.setup.skipped\",\n \"rig.setup.failed\",\n \"sandbox.operation.started\",\n \"sandbox.operation.completed\",\n \"sandbox.operation.failed\",\n \"sandbox.command.output.delta\",\n \"artifact.created\",\n \"goal.set\",\n \"goal.updated\",\n \"goal.completed\",\n \"goal.paused\",\n \"goal.resumed\",\n \"goal.cleared\",\n \"goal.continuation\",\n \"system.update.pending\",\n \"system.update.delivered\",\n \"system.update.superseded\",\n \"system.update.cancelled\",\n \"system.update.settled\",\n \"session.control.paused\",\n \"session.control.resumed\",\n \"session.control.steer_requested\",\n \"workspace.inference.paused\",\n \"workspace.inference.resumed\",\n \"session.queue.changed\",\n \"session.queue.prompt.cancelled\",\n \"session.queue.history\",\n \"turn.event.rejected_late\",\n \"memory.saved\",\n \"memory.corrected\",\n // Channel-B desktop pixel-plane signals (mirror of contracts SessionEventType;\n // the contract-parity test asserts sorted equality).\n \"stream.url.rotated\",\n \"stream.opened\",\n \"stream.closed\",\n \"stream.revoked\",\n // Channel-B recording signals (P4.3 — \"agent films itself proving the fix\").\n \"recording.started\",\n \"recording.available\",\n \"recording.failed\",\n // Channel-A structured-service notifications (P4.4; mirror of contracts\n // SessionEventType — the contract-parity test asserts sorted equality).\n \"fs.changed\",\n \"git.changed\",\n \"terminal.pty.started\",\n \"terminal.pty.output.delta\",\n \"terminal.pty.exited\",\n \"session.title_set\",\n \"session.mcp.approval_policy.updated\",\n \"session.tool_policy.updated\",\n // Multi-account Codex (P1): the session's inference account changed.\n \"codex.account.switched\",\n // credential allocator metadata-only per-turn credential selection audit.\n \"codex.credential.selected\",\n // Bounded, identity-free deterministic shadow/replay decision.\n \"codex.fleet.decision\",\n // credential allocator durable zero-capacity wait lifecycle. These are system/runtime\n // events, never synthetic user messages.\n \"codex.capacity.waiting\",\n \"codex.capacity.resumed\",\n \"codex.capacity.superseded\",\n // Sandbox durability observability (mirror of contracts SessionEventType):\n // box lifecycle + manifest-env drift, attributable from the DB alone.\n \"sandbox.box.created\",\n \"sandbox.box.lost\",\n \"sandbox.box.terminated\",\n \"sandbox.box.snapshot\",\n \"sandbox.env.drift\",\n // Active-sandbox pointer reconcile (issue #341; announce-only; mirror of contracts\n // SessionEventType — the contract-parity test asserts sorted equality).\n \"session.route.reconciled\",\n // Workbench v2 turn-end workspace capture (announce-only; mirror of contracts\n // SessionEventType — the contract-parity test asserts sorted equality).\n \"workspace.revision.captured\",\n \"workspace.revision.degraded\",\n // Connected Machine op-outcome observability (announce-only, quiet; mirror of\n // contracts SessionEventType — the contract-parity test asserts sorted equality).\n \"machine.op.failed\",\n \"machine.op.recovered\",\n // Connected Machine link-plane observability (announce-only, quiet; mirror of\n // contracts SessionEventType — the contract-parity test asserts sorted equality).\n \"machine.link.lost\",\n \"machine.link.restored\",\n \"machine.runner.restarted\",\n] as const;\n\nexport type KnownSessionEventType = (typeof SESSION_EVENT_TYPES)[number];\n\n/**\n * Event types the SDK knows about today, kept open so a newer OpenGeni server\n * can introduce event types without breaking older SDK consumers.\n */\nexport type SessionEventType = KnownSessionEventType | (string & {});\n\nexport type SessionEvent = {\n id: string;\n workspaceId: string;\n sessionId: string;\n /** Per-session sequence number: positive, contiguous, strictly increasing. */\n sequence: number;\n type: SessionEventType;\n payload: unknown;\n occurredAt: string;\n clientEventId?: string | null | undefined;\n turnId?: string | null | undefined;\n turnGeneration?: number | null | undefined;\n turnAttemptId?: string | null | undefined;\n turnAssociation?: \"current\" | \"late_rejected\" | \"duplicate\" | null | undefined;\n duplicateOfEventId?: string | null | undefined;\n duplicateReason?: string | null | undefined;\n};\n\nexport type SessionEventSemanticClass =\n | \"control\"\n | \"terminal\"\n | \"failure\"\n | \"checkpoint\"\n | \"tool_receipt\"\n | \"provider_account\";\nexport type SessionEventLatestClass = SessionEventSemanticClass | \"receipt\";\nexport type SessionEventPayloadMode = \"none\" | \"summary\" | \"full\";\nexport type SessionEventReadMode = \"monitoring\" | \"forensic\";\nexport type SessionEventReadDirection = \"after\" | \"before\";\nexport type SessionEventResultMode = \"events\" | \"compact\";\n\ntype SessionEventListCommonOptions = {\n after?: number;\n before?: number;\n limit?: number;\n compact?: boolean;\n mode?: SessionEventReadMode;\n direction?: SessionEventReadDirection;\n payloadMode?: SessionEventPayloadMode;\n resultMode?: \"events\";\n};\n\nexport type SessionEventListOptions = SessionEventListCommonOptions &\n (\n | {\n latest?: never;\n includeTypes?: SessionEventType[];\n excludeTypes?: SessionEventType[];\n includeClasses?: SessionEventSemanticClass[];\n excludeClasses?: SessionEventSemanticClass[];\n }\n | {\n /** Exclusive lookup for the newest event in exactly this semantic class. */\n latest: SessionEventLatestClass;\n includeTypes?: never;\n excludeTypes?: never;\n includeClasses?: never;\n excludeClasses?: never;\n }\n );\n\nexport type SessionEventCompactResult = {\n version: 1;\n semanticClass: SessionEventSemanticClass;\n source: {\n id: string;\n type: SessionEventType;\n sequence: number;\n occurredAt: string;\n turnId: string | null;\n turnGeneration: number | null;\n turnAttemptId: string | null;\n turnAssociation: SessionEvent[\"turnAssociation\"];\n };\n id: string;\n type: SessionEventType;\n sequence: number;\n occurredAt: string;\n turnId: string | null;\n turnGeneration: number | null;\n turnAttemptId: string | null;\n turnAssociation: SessionEvent[\"turnAssociation\"];\n coveredSequence: { first: number; last: number };\n status:\n | \"completed\"\n | \"failed\"\n | \"cancelled\"\n | \"superseded\"\n | \"checkpoint\"\n | \"receipt\"\n | \"unknown\";\n text: string | null;\n output: unknown;\n result: unknown;\n failure: {\n error: string | null;\n code: string | null;\n retryable: boolean | null;\n recovery: string | null;\n } | null;\n checkpoint: unknown;\n receipt: unknown;\n truncation: {\n truncated: boolean;\n fields: string[];\n originalBytes: number | null;\n deliveredBytes: number;\n };\n};\n\nexport type SessionEventCompactResultOptions = {\n latest: SessionEventLatestClass;\n resultMode: \"compact\";\n mode?: SessionEventReadMode;\n payloadMode?: SessionEventPayloadMode;\n};\n\nexport type SessionEventPage = {\n events: SessionEvent[];\n mode: SessionEventReadMode;\n payloadMode: SessionEventPayloadMode;\n direction: SessionEventReadDirection;\n bytes: number;\n maxBytes: number;\n truncated: boolean;\n hasMore: boolean;\n truncatedBy: \"count\" | \"bytes\" | \"http_bytes\" | null;\n coveredSequence: { first: number; last: number } | null;\n nextAfter: number | null;\n nextBefore: number | null;\n forensicExact: boolean;\n};\n\nexport type ToolAuthNeededPayload = {\n serverId: string;\n toolName?: string | null | undefined;\n providerDomain: string;\n provider?: string | undefined;\n connectionId?: string | null | undefined;\n reason:\n | \"missing_connection\"\n | \"expired\"\n | \"insufficient_scope\"\n | \"refresh_failed\"\n | \"personal_authority_unavailable\"\n | \"unsupported_auth\"\n | \"resource_scope_unavailable\";\n scopes?: string[] | undefined;\n resource?: string | undefined;\n selectedResources?: Array<{ id: string; kind: \"repository\" }> | undefined;\n authorizationUrl?: string | undefined;\n subjectId?: string | null | undefined;\n};\n\n// Payload shapes for the high-traffic event types. `SessionEvent.payload` is\n// `unknown` on the wire; these are the documented shapes producers emit today.\nexport type AgentTextDeltaPayload = { text: string };\nexport type AgentMessageCompletedPayload = { text: string };\nexport type AgentToolCallCreatedPayload = {\n id: string | null;\n name: string;\n arguments: unknown;\n raw?: unknown | undefined;\n};\nexport type AgentToolCallOutputPayload = { id: string | null; output: unknown };\nexport type SessionStatusChangedPayload = { status: SessionStatus };\n\n// Adaptive-fleet shadow event. This is the typed, identity-free view\n// consumed by UI/manager tooling; the durable replay record also contains the\n// complete normalized policy/input needed for offline deterministic replay.\nexport type CodexFleetConfidence = \"unknown\" | \"low\" | \"medium\" | \"high\";\nexport type CodexFleetCacheState = \"unknown\" | \"healthy\" | \"collapsed\";\nexport type CodexFleetShadowComparison =\n | \"match\"\n | \"different_candidate\"\n | \"different_outcome\"\n | \"not_comparable_truncated\";\nexport type CodexFleetDecisionScore = {\n candidateKey: string;\n eligible: boolean;\n rejectionReason:\n | \"allocator_disabled\"\n | \"unavailable\"\n | \"cooling\"\n | \"quota_ceiling\"\n | \"overlay_isolation\"\n | null;\n quotaPressure: number;\n leasePressure: number;\n observedBurnPressure: number;\n inferredBurnPressure: number;\n runwayPressure: number;\n uncertaintyPressure: number;\n cacheAffinityBenefit: number;\n cacheState: CodexFleetCacheState;\n overlayPreferenceBenefit: number;\n total: number;\n confidence: CodexFleetConfidence;\n};\nexport type CodexFleetDecisionEventPayload = {\n schemaVersion: 1;\n mode: \"shadow\";\n actual: {\n outcome: \"selected\" | \"waiting\" | \"none\";\n candidateKey: string | null;\n reason: \"lease_reused\" | \"pin\" | \"rotation\" | \"active\" | \"all_capped\" | \"none\";\n };\n comparison: CodexFleetShadowComparison;\n replay: {\n schemaVersion: 1;\n policyVersion: \"adaptive-shadow-v1\";\n mode: \"shadow\";\n input: { candidates: Array<{ key: string }> } & Record<string, unknown>;\n truncatedCandidateCount: number;\n inputFingerprint: string;\n decisionFingerprint: string;\n decision: {\n outcome: \"selected\" | \"paced\" | \"none\";\n selectedCandidateKey: string | null;\n reason:\n | \"fenced_in_flight\"\n | \"fenced_candidate_missing\"\n | \"admission_paced\"\n | \"no_eligible_candidate\"\n | \"overlay_isolated_empty\"\n | \"best_score\"\n | \"affinity_best\"\n | \"hysteresis_hold\";\n admission: {\n outcome: \"admit\" | \"pace\";\n reason:\n | \"fenced_in_flight\"\n | \"pacing_disabled\"\n | \"capacity_unknown\"\n | \"capacity_available\"\n | \"work_conserving_borrow\"\n | \"manager_priority\"\n | \"standard_starvation_bound\"\n | \"capacity_saturated\"\n | \"emergency_fuse\";\n borrowedIdleCapacity: boolean;\n };\n borrowedOverlayCapacity: boolean;\n strandedEligibleCount: number;\n confidence: CodexFleetConfidence;\n scores: CodexFleetDecisionScore[];\n };\n } & Record<string, unknown>;\n};\n\n// Recording payloads (P4.3 — plain TS mirror of the contracts Zod schemas; the\n// SDK is zero-runtime-dep so these are TYPES, not Zod, F15). The contract-parity\n// test asserts the event-type literals; these shapes document the wire payloads.\nexport type RecordingMode = \"manual\" | \"on-turn\" | \"on-verify\";\nexport type RecordingCodec = \"h264-mp4\" | \"vp9-webm\";\nexport type RecordingContentType = \"video/mp4\" | \"video/webm\";\nexport type RecordingFailedReason =\n | \"ffmpeg-error\"\n | \"box-death\"\n | \"box-rollover\"\n | \"upload-failed\"\n | \"max-bytes-exceeded\"\n | \"display-unavailable\";\n\nexport type RecordingStartedPayload = {\n recordingId: string;\n turnId: string | null;\n mode: RecordingMode;\n codec: RecordingCodec;\n dimensions: [number, number];\n framerate: number;\n startedAt: string;\n reason?: string | null | undefined;\n};\nexport type RecordingAvailablePayload = {\n recordingId: string;\n turnId: string | null;\n codec: RecordingCodec;\n contentType: RecordingContentType;\n storageKey: string;\n durationSeconds: number | null;\n sizeBytes: number;\n dimensions: [number, number];\n};\nexport type RecordingFailedPayload = {\n recordingId: string;\n turnId: string | null;\n reason: RecordingFailedReason;\n detail?: string | null | undefined;\n};\n\n// ── Channel-A structured services (P4.4) — hand-written wire mirrors ─────────\n\n// A1 notification payloads.\nexport type SandboxCommandOutputDeltaPayload = {\n stream: \"stdout\" | \"stderr\";\n chunk: string;\n commandId?: string | undefined;\n seq?: number | undefined;\n};\nexport type FsChangeKind = \"created\" | \"modified\" | \"deleted\" | \"renamed\";\nexport type FsChangedPayload = {\n changes: {\n path: string;\n kind: FsChangeKind;\n isDir: boolean;\n sizeBytes: number | null;\n oldPath?: string | undefined;\n }[];\n source: \"write\" | \"watch\" | \"agent\";\n revision: number;\n leaseEpoch: number;\n};\nexport type GitChangedPayload = {\n head: string | null;\n dirty: boolean;\n ahead: number;\n behind: number;\n changedFileCount: number;\n reason: \"commit\" | \"checkout\" | \"stage\" | \"worktree\" | \"fetch\" | \"unknown\";\n revision: number;\n leaseEpoch: number;\n};\nexport type TerminalPtyStartedPayload = {\n ptyId: string;\n cols: number;\n rows: number;\n shell: string;\n cwd: string;\n};\nexport type TerminalPtyOutputDeltaPayload = {\n ptyId: string;\n stream: \"stdout\" | \"stderr\";\n chunk: string;\n seq: number;\n};\nexport type TerminalPtyExitedPayload = {\n ptyId: string;\n exitCode: number | null;\n reason: \"exit\" | \"killed\" | \"owner_gone\" | \"timeout\" | \"lost\";\n};\n\n// A2 FileSystem request/response.\nexport type FsNodeType = \"file\" | \"dir\" | \"symlink\" | \"other\";\nexport type FsTreeNode = {\n name: string;\n path: string;\n type: FsNodeType;\n sizeBytes: number | null;\n mtimeMs: number | null;\n mode: number | null;\n children?: FsTreeNode[] | undefined;\n truncated: boolean;\n};\nexport type FsEncoding = \"utf8\" | \"base64\";\nexport type FsListRequest = {\n path?: string;\n depth?: number;\n maxEntries?: number;\n includeHidden?: boolean;\n};\nexport type FsListResponse = {\n root: FsTreeNode;\n revision: number;\n truncated: boolean;\n};\nexport type FsReadRequest = {\n path: string;\n encoding?: FsEncoding;\n maxBytes?: number;\n};\nexport type FsReadResponse = {\n path: string;\n encoding: FsEncoding;\n content: string;\n sizeBytes: number;\n truncated: boolean;\n isBinary: boolean;\n revision: number;\n};\nexport type FsWriteRequest = {\n path: string;\n encoding?: FsEncoding;\n content: string;\n overwrite?: boolean;\n createParents?: boolean;\n};\nexport type FsWriteResponse = {\n path: string;\n sizeBytes: number;\n revision: number;\n};\nexport type FsDeleteRequest = { path: string; recursive?: boolean };\nexport type FsDeleteResponse = { revision: number };\nexport type FsMoveRequest = {\n path: string;\n newPath: string;\n overwrite?: boolean;\n createParents?: boolean;\n};\nexport type FsMoveResponse = {\n path: string;\n newPath: string;\n revision: number;\n};\nexport type FsMkdirRequest = { path: string; recursive?: boolean };\nexport type FsMkdirResponse = { path: string; revision: number };\n\n// A2 Git request/response (the Pierre-diff feed).\nexport type GitFileStatusCode =\n | \"added\"\n | \"modified\"\n | \"deleted\"\n | \"renamed\"\n | \"copied\"\n | \"untracked\"\n | \"ignored\"\n | \"conflicted\"\n | \"typechange\";\nexport type GitFileStatus = {\n path: string;\n oldPath: string | null;\n index: GitFileStatusCode | null;\n worktree: GitFileStatusCode | null;\n isConflicted: boolean;\n};\nexport type GitStatusRequest = { path?: string };\nexport type GitStatusResponse = {\n isRepo: boolean;\n head: string | null;\n detached: boolean;\n upstream: string | null;\n ahead: number;\n behind: number;\n files: GitFileStatus[];\n revision: number;\n};\nexport type GitDiffLineType = \"context\" | \"add\" | \"del\" | \"meta\";\nexport type GitDiffLine = {\n type: GitDiffLineType;\n oldNo: number | null;\n newNo: number | null;\n text: string;\n};\nexport type GitDiffHunk = {\n oldStart: number;\n oldLines: number;\n newStart: number;\n newLines: number;\n header: string;\n lines: GitDiffLine[];\n};\nexport type GitFileDiff = {\n path: string;\n oldPath: string | null;\n status: GitFileStatusCode;\n isBinary: boolean;\n isImage: boolean;\n additions: number;\n deletions: number;\n hunks: GitDiffHunk[];\n truncated: boolean;\n};\nexport type GitDiffRequest = {\n path?: string;\n staged?: boolean;\n includeUntracked?: boolean;\n fromRef?: string;\n toRef?: string;\n pathspec?: string[];\n contextLines?: number;\n maxBytesPerFile?: number;\n};\nexport type GitDiffResponse = { files: GitFileDiff[]; revision: number };\nexport type GitLogRequest = {\n path?: string;\n ref?: string;\n maxCount?: number;\n skip?: number;\n pathspec?: string[];\n};\nexport type GitCommit = {\n sha: string;\n shortSha: string;\n parents: string[];\n author: { name: string; email: string; timestamp: number };\n committer: { name: string; email: string; timestamp: number };\n subject: string;\n body: string;\n refs: string[];\n};\nexport type GitLogResponse = { commits: GitCommit[]; hasMore: boolean };\nexport type GitShowRequest = {\n path?: string;\n ref: string;\n filePath?: string;\n encoding?: FsEncoding;\n maxBytesPerFile?: number;\n};\nexport type GitShowResponse = {\n commit: GitCommit | null;\n files: GitFileDiff[];\n blob: {\n content: string;\n encoding: FsEncoding;\n sizeBytes: number;\n truncated: boolean;\n } | null;\n revision: number;\n};\n\n// Workbench v2 turn-end capture (mirror of `@opengeni/contracts` WorkspaceCapture*\n// + the M2 read-API response shapes). Reuses FsTreeNode /\n// GitFileStatus / GitFileDiff / GitFileStatusCode / FsEncoding above.\nexport type WorkspaceCaptureFile = {\n path: string;\n status: GitFileStatusCode;\n hash: string | null;\n baseHash: string | null;\n contentRef: string | null;\n sizeBytes: number;\n isBinary: boolean;\n tooLarge: boolean;\n deleted: boolean;\n};\nexport type WorkspaceCaptureRepo = {\n root: string;\n head: string | null;\n detached: boolean;\n upstream: string | null;\n ahead: number;\n behind: number;\n status: GitFileStatus[];\n diff: GitFileDiff[];\n};\nexport type WorkspaceCaptureDegradedReason =\n | \"repository_discovery_command_failed\"\n | \"repository_discovery_timed_out\"\n | \"repository_discovery_result_limit_exceeded\"\n | \"repository_read_unavailable\";\nexport type WorkspaceCaptureStats = {\n repoCount: number;\n fileCount: number;\n additions: number;\n deletions: number;\n totalBytes: number;\n tooLargeCount: number;\n binaryCount: number;\n treeEntryCount: number;\n treeTruncated: boolean;\n durationMs: number;\n fingerprint?: string;\n};\nexport type WorkspaceCaptureManifest = {\n version: 1;\n revision: number;\n capturedAt: string;\n turnId: string | null;\n leaseEpoch: number;\n treeIndex: FsTreeNode;\n treeTruncated: boolean;\n repos: WorkspaceCaptureRepo[];\n files: WorkspaceCaptureFile[];\n stats: WorkspaceCaptureStats;\n};\nexport type WorkspaceRevisionCapturedPayload = {\n revision: number;\n turnId: string | null;\n capturedAt: string;\n leaseEpoch: number;\n stats: WorkspaceCaptureStats;\n};\nexport type WorkspaceRevisionDegradedPayload = {\n revision: number;\n turnId: string | null;\n capturedAt: string;\n leaseEpoch: number;\n reason: WorkspaceCaptureDegradedReason;\n};\nexport type WorkspaceCaptureSignedUrl = { url: string; expiresAt: string };\n// GET …/workspace/capture. Exactly one of manifest/manifestUrl is non-null.\nexport type GetWorkspaceCaptureResponse =\n | {\n available: false;\n degradedReason?: WorkspaceCaptureDegradedReason | null;\n revision?: number | null;\n capturedAt?: string | null;\n turnId?: string | null;\n leaseEpoch?: number | null;\n }\n | {\n available: true;\n revision: number;\n capturedAt: string;\n turnId: string | null;\n leaseEpoch: number;\n sizeBytes: number;\n stats: WorkspaceCaptureStats;\n manifest: WorkspaceCaptureManifest | null;\n manifestUrl: WorkspaceCaptureSignedUrl | null;\n };\n// GET …/workspace/capture/file. content inline (≤256KB) OR contentUrl OR marker\n// only (tooLarge / missing blob).\nexport type GetWorkspaceCaptureFileResponse = {\n path: string;\n revision: number;\n status: GitFileStatusCode;\n hash: string | null;\n baseHash: string | null;\n sizeBytes: number;\n isBinary: boolean;\n tooLarge: boolean;\n encoding: FsEncoding | null;\n content: string | null;\n contentUrl: WorkspaceCaptureSignedUrl | null;\n};\n\n// A2 Terminal exec + PTY.\nexport type TerminalExecRequest = {\n command: string;\n cwd?: string;\n timeoutMs?: number;\n emitStream?: boolean;\n};\nexport type TerminalExecResponse = {\n stdout: string;\n stderr: string;\n exitCode: number;\n running: false;\n wallTimeSeconds: number;\n};\nexport type PtyOpenRequest = {\n cols?: number;\n rows?: number;\n cwd?: string;\n shell?: string;\n};\nexport type PtyOpenResponse = {\n ptyId: string;\n streamVia: \"sse-events\";\n supportsInput: boolean;\n};\nexport type PtyWriteRequest = { ptyId: string; data: string };\nexport type PtyResizeRequest = { ptyId: string; cols: number; rows: number };\nexport type PtyCloseRequest = { ptyId: string };\n\nexport type SessionStructuredCapabilities = {\n FileSystem: { available: boolean; readOnly: boolean; root: string };\n Terminal: { events: boolean; exec: boolean; pty: { available: boolean } };\n Git: { available: boolean; repos: string[] };\n};\n\nexport type ScheduledTaskStatus = \"active\" | \"paused\";\n\nexport type ScheduledTaskRunMode = \"new_session_per_run\" | \"reusable_session\";\n\nexport type ScheduledTaskOverlapPolicy = \"allow_concurrent\" | \"skip\" | \"buffer_one\";\n\nexport type ScheduledTaskDayOfWeek =\n | \"SUNDAY\"\n | \"MONDAY\"\n | \"TUESDAY\"\n | \"WEDNESDAY\"\n | \"THURSDAY\"\n | \"FRIDAY\"\n | \"SATURDAY\";\n\nexport type ScheduledTaskScheduleSpec =\n | { type: \"once\"; runAt: string; timeZone: string }\n | {\n type: \"interval\";\n everySeconds: number;\n startAt?: string | undefined;\n endAt?: string | undefined;\n }\n | {\n type: \"calendar\";\n timeZone: string;\n hour: number;\n minute: number;\n daysOfWeek?: ScheduledTaskDayOfWeek[] | undefined;\n };\n\nexport type ScheduledTaskAgentConfig = {\n prompt: string;\n resources: ResourceRef[];\n tools: ToolRef[];\n metadata: Record<string, unknown>;\n slackBotConnectionId?: string | undefined;\n model?: string | undefined;\n reasoningEffort?: ReasoningEffort | undefined;\n sandboxBackend?: SandboxBackend | undefined;\n goal?: GoalSpec | undefined;\n maxNestedAgentDepth?: number | undefined;\n};\n\nexport type ScheduledTask = {\n id: string;\n accountId: string;\n workspaceId: string;\n name: string;\n status: ScheduledTaskStatus;\n schedule: ScheduledTaskScheduleSpec;\n temporalScheduleId: string;\n runMode: ScheduledTaskRunMode;\n overlapPolicy: ScheduledTaskOverlapPolicy;\n agentConfig: ScheduledTaskAgentConfig;\n createdBy?: TurnInitiator | undefined;\n createdByContext?: TurnInitiatorContext | undefined;\n personalConnections?: McpPersonalConnectionSummary[] | undefined;\n reusableSessionId: string | null;\n variableSetId: string | null;\n /** @deprecated use variableSetId */\n environmentId: string | null;\n // The rig each run binds to (M3); active version resolved per fire. Null ⇒ rig-less.\n rigId: string | null;\n metadata: Record<string, unknown>;\n createdAt: string;\n updatedAt: string;\n};\n\nexport type CreateSessionRequest = {\n // Optional UUID preallocated by an embedding host so it can durably link its\n // projection before OpenGeni admits the initial turn. Replays must retain the\n // same UUID and idempotency key.\n requestedSessionId?: string | undefined;\n initialMessage?: string | undefined;\n /** Create an idle session shell so realtime voice can be the first interaction. */\n startMode?: \"realtime\" | undefined;\n /** System instructions scoped to the initial turn; never visible timeline text. */\n turnInstructions?: string | undefined;\n // Per-session agent persona/system instructions (org-visible metadata, not a\n // secret). Delivered system-level, composed AFTER the per-workspace persona —\n // how a host supplies per-agent-type prompts without leaking them into the\n // user-visible timeline. Trimmed, non-empty, max 32768 chars.\n instructions?: string | undefined;\n /** Immutable normalized prompt-policy role; distinct from membership roles. */\n policyRole?: string | undefined;\n resources?: ResourceRef[] | undefined;\n /** Inline skills fixed onto this session; omitted children inherit them. */\n skills?: SessionSkill[] | undefined;\n tools?: ToolRef[] | undefined;\n metadata?: Record<string, unknown> | undefined;\n model?: string | undefined;\n reasoningEffort?: ReasoningEffort | undefined;\n latencyMode?: LatencyMode | undefined;\n sandboxBackend?: SandboxBackend | undefined;\n // The enrolled machine (a sandbox id) to run this session on; seeds the\n // active-sandbox pointer at creation so the first turn lands on it.\n targetSandboxId?: string | undefined;\n // Host working directory for a connected-machine target (the agent runs here;\n // default = the machine's launch dir). Ignored for managed sandboxes.\n workingDir?: string | undefined;\n variableSetId?: string | undefined;\n /** @deprecated use variableSetId */\n environmentId?: string | undefined;\n // The rig to bind this session to (M3). Its active version is frozen onto the\n // session at create. Omitted ⇒ the workspace default rig when set, else rig-less.\n rigId?: string | undefined;\n goal?: GoalSpec | undefined;\n clientEventId?: string | undefined;\n // Workspace-scoped CREATE idempotency key: forward a STABLE value to make a\n // double-submit/retry of the same logical create collapse to one session.\n // Distinct from the per-call clientEventId.\n idempotencyKey?: string | undefined;\n // Exact actor-private pre-session draft revision represented by this create.\n // The server consumes only this revision after durable initialization.\n expectedNewSessionDraftRevision?: number | undefined;\n maxNestedAgentDepth?: number | undefined;\n firstPartyMcpPermissions?: string[] | undefined;\n firstPartyMcpTools?: FirstPartyMcpToolName[] | undefined;\n mcpServers?: SessionMcpServerInput[] | undefined;\n // Shared-sandbox placement (mirror of `@opengeni/contracts` CreateSessionRequest.sandbox,\n // addendum 05 §D.1). Three-way union; OMITTED ⇒ the context-dependent server default\n // (from inside a session → \"shared\" with the creator's box, top-level → \"new\").\n // - \"shared\": join the CREATOR's box (requires a parent session; top-level → 422).\n // - \"new\": mint a fresh singleton box (group ≡ the new session's id).\n // - {groupId}: join a SPECIFIC sibling group in THIS workspace (manager fan-out).\n sandbox?: \"shared\" | \"new\" | { groupId: string } | undefined;\n};\n\n// --- Access, workspaces, API keys -------------------------------------------\n\nexport const KNOWN_PERMISSIONS = [\n \"account:read\",\n \"account:admin\",\n \"members:manage\",\n \"workspace:create\",\n \"billing:read\",\n \"billing:manage\",\n \"workspace:read\",\n \"workspace:admin\",\n \"sessions:create\",\n \"sessions:read\",\n \"sessions:control\",\n // sandbox workspace (mirror of @opengeni/contracts Permission). stream:view is\n // strictly broader than sessions:read (un-redacted pixels); stream:control is\n // the never-granted-v1 raw-input plane; stream:acknowledge is the secret-leak\n // consent gate.\n \"stream:view\",\n \"stream:control\",\n \"stream:acknowledge\",\n \"files:upload\",\n \"files:read\",\n \"files:write\",\n \"terminal:attach\",\n \"documents:manage\",\n \"documents:search\",\n \"scheduled_tasks:manage\",\n \"scheduled_tasks:run\",\n \"github:manage\",\n \"github:use\",\n \"api_keys:manage\",\n \"connections:read\",\n \"connections:write\",\n \"environments:manage\",\n \"environments:use\",\n \"variable-sets:manage\",\n \"variable-sets:use\",\n \"mcp_servers:attach\",\n \"toolspace:call\",\n \"goals:manage\",\n \"enrollments:read\",\n \"enrollments:manage\",\n \"rigs:use\",\n \"rigs:manage\",\n \"artifacts:read\",\n \"artifacts:publish\",\n] as const;\n\nexport type KnownPermission = (typeof KNOWN_PERMISSIONS)[number];\n\n/**\n * Permissions the SDK knows about today, kept open so a newer OpenGeni server\n * can introduce permissions without breaking older SDK consumers.\n */\nexport type Permission = KnownPermission | (string & {});\n\nexport type FirstPartyMcpToolName =\n | \"set_session_title\"\n | \"goal_set\"\n | \"goal_update\"\n | \"goal_complete\"\n | \"goal_pause\"\n | \"memory_search\"\n | \"memory_save\"\n | \"memory_correct\"\n | \"preference_registry_summary\"\n | \"preference_registry_get\"\n | \"sandboxes_list\"\n | \"sandbox_attach\"\n | \"sandbox_swap\"\n | \"run_on\"\n | \"sandbox_provision\"\n | \"rig_list\"\n | \"rig_get\"\n | \"rig_propose_change\"\n | \"rig_verify\"\n | \"rig_promote\"\n | \"sessions_list\"\n | \"session_get\"\n | \"session_events\"\n | \"session_create\"\n | \"session_send_message\"\n | \"session_pause\"\n | \"session_resume\"\n | \"session_steer\"\n | \"set_other_session_title\"\n | \"variable_set_list\"\n | \"environment_list\"\n | \"variable_set_set_variable\"\n | \"environment_set_variable\"\n | \"github_connect_link\"\n | \"github_repositories_list\"\n | \"social_connections_list\"\n | \"social_posts_recent\"\n | \"social_daily_analysis_context\"\n | \"social_search_live\"\n | \"social_mentions_live\"\n | \"social_thread_fetch\"\n | \"social_posts_sync\"\n | \"social_post_reply\"\n | \"scheduled_tasks_list\"\n | \"scheduled_tasks_get\"\n | \"scheduled_tasks_create\"\n | \"scheduled_tasks_update\"\n | \"scheduled_tasks_pause\"\n | \"scheduled_tasks_resume\"\n | \"scheduled_tasks_trigger\"\n | \"scheduled_tasks_delete\"\n | \"scheduled_task_runs_list\"\n | \"slack_bot_list_channels\"\n | \"slack_bot_channel_history\"\n | \"slack_bot_thread_replies\"\n | \"slack_bot_list_users\"\n | \"slack_bot_list_files\"\n | \"slack_bot_file_info\"\n | \"slack_bot_file_content\"\n | \"slack_bot_post_message\"\n | \"slack_bot_delete_message\"\n | \"artifacts_list\"\n | \"artifacts_get_source\"\n | \"artifacts_create\"\n | \"artifacts_publish\"\n | \"artifacts_rollback\";\n\nexport type ProductAccessMode = \"local\" | \"configured\" | \"managed\";\n\nexport type ModelCapabilitySupportV1 = \"supported\" | \"unsupported\" | \"unknown\";\n\nexport type ModelCapabilityStateV1 = {\n upstream: ModelCapabilitySupportV1;\n runnable: boolean;\n};\n\nexport type ModelCapabilitiesV1 = {\n reasoning: ModelCapabilityStateV1 & {\n efforts: ReasoningEffort[];\n defaultEffort: ReasoningEffort | null;\n required: boolean;\n };\n functionCalling: ModelCapabilityStateV1;\n structuredOutput: ModelCapabilityStateV1;\n hostedTools: {\n webSearch: ModelCapabilityStateV1;\n xSearch: ModelCapabilityStateV1;\n codeExecution: ModelCapabilityStateV1;\n };\n inputModalities: Array<\"text\" | \"image\" | \"audio\">;\n inputFileMediaTypes?: string[] | undefined;\n outputModalities: Array<\"text\" | \"image\" | \"audio\">;\n transports: {\n sse: ModelCapabilityStateV1;\n responsesWebSocket: ModelCapabilityStateV1;\n realtimeAudio: ModelCapabilityStateV1;\n };\n promptCaching?:\n | (ModelCapabilityStateV1 & {\n mode: \"implicit\" | \"automatic\" | \"none\";\n })\n | undefined;\n latencyModes: Array<{\n id: \"standard\" | \"priority\" | \"fast\";\n upstream: ModelCapabilitySupportV1;\n runnable: boolean;\n billingMultiplierBps?: number | undefined;\n }>;\n};\n\nexport type ModelCredentialSourceV1 =\n | { kind: \"deployment\"; mechanism: \"api_key\" | \"azure_ad_bearer\" }\n | { kind: \"connected_subscription\"; provider: \"codex\" }\n | { kind: \"workspace_connection\"; mechanism: \"api_key\" };\n\nexport type ModelBillingAttributionV1 = {\n upstreamPayer: \"deployment\" | \"workspace\" | \"connected_subscription\";\n metering: \"opengeni_credits\" | \"external\";\n};\n\nexport type ModelPricingV1 = {\n inputMicrosPerMillionTokens: number;\n cachedInputMicrosPerMillionTokens?: number | undefined;\n outputMicrosPerMillionTokens: number;\n marginBps?: number | undefined;\n};\n\nexport type ModelPricingScheduleV1 = {\n default: ModelPricingV1;\n inputTokenTiers?:\n | Array<{\n minimumInputTokens: number;\n pricing: ModelPricingV1;\n }>\n | undefined;\n};\n\n/**\n * One model a client may select at send time, plus the provider that serves it.\n * The wire API (`responses` | `chat`) lets a client reason about provider\n * capabilities; the provider id/label drive a picker's grouping. Mirrors the\n * `ClientModel` shape projected into `ClientConfig` by the server.\n */\nexport type ClientModel = {\n id: string;\n label: string;\n /** Optional curated compact label for dense UI (e.g. mobile composer). */\n shortLabel?: string | undefined;\n /** Provider id (e.g. `openai`, `azure`, or a registry provider id). */\n provider: string;\n providerLabel: string;\n api: \"responses\" | \"chat\";\n source?: \"opengeni\" | \"codex\" | \"workspace_gateway\" | undefined;\n contextWindowTokens?: number | undefined;\n schemaVersion?: 1 | undefined;\n aliases?: string[] | undefined;\n deployment?:\n | {\n upstreamModelId: string;\n wireApi: \"responses\" | \"chat\";\n }\n | undefined;\n executionLimits?:\n | {\n contextWindowTokens: number | null;\n effectiveContextWindowTokens: number | null;\n autoCompactTokenLimit: number | null;\n toolOutputTruncationTokens: number | null;\n }\n | undefined;\n credentialSource?: ModelCredentialSourceV1 | undefined;\n billing?: ModelBillingAttributionV1 | undefined;\n capabilities?: ModelCapabilitiesV1 | undefined;\n pricing?: ModelPricingScheduleV1 | undefined;\n definitionVersion?: string | undefined;\n};\n\nexport type ModelAvailabilityV1 = {\n status: \"available\" | \"unavailable\" | \"degraded\" | \"unknown\";\n selectable: boolean;\n reason:\n | \"missing_credential\"\n | \"needs_reauth\"\n | \"credential_not_ready\"\n | \"not_entitled\"\n | \"provider_unhealthy\"\n | \"policy_blocked\"\n | \"unsupported\"\n | null;\n checkedAt: string | null;\n};\n\nexport type ModelCredentialReadinessV1 = {\n status: \"ready\" | \"not_ready\" | \"error\";\n reason:\n | \"missing_credential\"\n | \"needs_reauth\"\n | \"prerequisites_missing\"\n | \"resolver_error\"\n | \"observation_stale\"\n | null;\n basis: \"configuration\" | \"connection\" | \"resolver\";\n checkedAt: string | null;\n};\n\nexport type WorkspaceModelCatalogModel = ClientModel & {\n credentialReadiness: ModelCredentialReadinessV1;\n availability: ModelAvailabilityV1;\n};\n\nexport type WorkspaceModelCatalogResponse = {\n models: WorkspaceModelCatalogModel[];\n};\n\n/**\n * Connection state of a workspace's Codex (ChatGPT) subscription, returned by\n * `GET /v1/workspaces/:id/codex/status`. `models` are the codex models the\n * workspace can select (projected as ClientModel under their own \"no credits\"\n * provider group), present only while connected.\n */\nexport type CodexConnectionStatus = {\n connected: boolean;\n plan?: string | null;\n valid?: boolean;\n expiresAt?: string | null;\n lastError?: string | null;\n models?: ClientModel[];\n /** The account a session runs on when unpinned (label for the in-session indicator). */\n activeAccount?: {\n id: string;\n label?: string | null;\n chatgptAccountId?: string | null;\n } | null;\n /** How many Codex accounts the workspace has connected. */\n accountCount?: number;\n};\n\n/**\n * One normalized Codex usage window (5h or weekly), camelCase end-to-end (the\n * route normalizes server-side; the web layer never re-hand-types snake_case).\n * `percent` is authoritative; used/limit/remaining are a synthesized 0–100 scale\n * (limit = 100) because the provider gives only a percentage. `remaining =\n * 100 - percent` is the P3 rotation key. Identify the window by `limitWindowSeconds`\n * (18000 ⇒ 5h, 604800 ⇒ weekly), never by position.\n */\nexport type CodexUsageWindow = {\n used: number;\n limit: number;\n remaining: number;\n percent: number;\n resetAt: string | null;\n resetAfterSeconds: number | null;\n limitWindowSeconds: number;\n};\n\n/** The normalized usage payload for one account — the P2/P3 contract. */\nexport type CodexUsagePayload = {\n status: \"ok\" | \"limit_reached\" | \"error\" | \"no-data\";\n planType: string | null;\n fiveHour: CodexUsageWindow | null;\n weekly: CodexUsageWindow | null;\n limitReached: boolean;\n fetchedAt: string;\n /** Authoritative count-only summary from /wham/usage; never synthesized rows. */\n rateLimitResetCredits?: { availableCount: number; credits: null } | null;\n /** Present only on an auth/refresh failure path. */\n reason?: \"needs_relogin\";\n additionalLimits?: Array<{\n limitName: string;\n meteredFeature: string;\n fiveHour: CodexUsageWindow | null;\n weekly: CodexUsageWindow | null;\n }>;\n credits?: {\n hasCredits: boolean;\n unlimited: boolean;\n overageLimitReached: boolean;\n balance: string;\n };\n};\n\n/** One connected Codex (ChatGPT) account in a workspace (multi-account P1). Metadata only. */\nexport type CodexAccount = {\n id: string;\n chatgptAccountId?: string | null;\n label?: string | null;\n email?: string | null;\n plan?: string | null;\n status: \"active\" | \"needs_relogin\" | \"error\";\n active: boolean;\n expiresAt?: string | null;\n lastRefreshAt?: string | null;\n lastError?: string | null;\n // P2 CACHED usage (built from the persisted columns; renders bars off\n // listCodexAccounts with no second call). null until the first live refresh.\n fiveHour?: CodexUsageWindow | null;\n weekly?: CodexUsageWindow | null;\n usageCheckedAt?: string | null;\n // P3 rotation cooldown: ISO timestamp until which this account is cooling-down\n // (rotated-off after a usage cap). null/absent ⇒ not cooling.\n exhaustedUntil?: string | null;\n /** Controls only NEW automatic allocations. */\n allocatorEnabled: boolean;\n /** Independent OCC sequence; credential/token `version` is never exposed. */\n allocatorVersion: number;\n allocatorUpdatedAt?: string | null;\n /** Cached authoritative summary count, never detailed redemption authority. */\n resetCreditAvailableCount?: number | null;\n resetCreditsCheckedAt?: string | null;\n /** True when this exact credential is the workspace's independent Apps credential. */\n appsDesignated: boolean;\n /** True only for the scoped managed human who connected it. */\n canEnableApps: boolean;\n};\n\nexport type CodexResetCredit = {\n id: string;\n resetType: \"codexRateLimits\" | \"unknown\";\n status: \"available\" | \"redeeming\" | \"redeemed\" | \"unknown\";\n /** Unix seconds from the provider contract. */\n grantedAt: number;\n /** Unix seconds, or null when the provider reports no expiry. */\n expiresAt: number | null;\n title: string | null;\n description: string | null;\n /** True only for fresh, complete, owning-human provider detail. */\n actionable: boolean;\n};\n\n/** Owning-human recovery metadata. It contains no token, browser-session hash, or provider key. */\nexport type CodexResetRedemptionRecovery = {\n attemptId: string;\n creditId: string;\n status: \"provider_started\" | \"completed\";\n outcome: \"reset\" | \"nothingToReset\" | \"noCredit\" | \"alreadyRedeemed\" | null;\n providerStartedAt: string | null;\n completedAt: string | null;\n createdAt: string;\n updatedAt: string;\n};\n\nexport type CodexAccountOverview = {\n accountId: string;\n usage: {\n source: \"provider\" | \"cache\" | \"none\";\n fetchedAt: string | null;\n stale: boolean;\n error: string | null;\n value: CodexUsagePayload | null;\n };\n resetCredits: {\n source: \"provider\" | \"cache\" | \"none\";\n fetchedAt: string | null;\n stale: boolean;\n error: string | null;\n detailState: \"detailed\" | \"count_only\" | \"capped\" | \"unsupported\" | \"unknown\" | \"error\";\n detailsComplete: boolean;\n availableCount: number | null;\n credits: CodexResetCredit[];\n };\n canRedeem: boolean;\n /** Owning managed-cookie human may replay durable completion without a healthy provider token. */\n canResumeRedemption: boolean;\n /** Durable owner-scoped ambiguity/completion discovery; never redemption authority for agents. */\n redemptions: CodexResetRedemptionRecovery[];\n};\n\n/** Independently settled live overview keyed by workspace credential id. */\nexport type CodexOverviewResponse = {\n accounts: Record<string, CodexAccountOverview>;\n};\n\nexport type CodexAllocatorUpdate = {\n allocatorEnabled: boolean;\n allocatorVersion: number;\n allocatorUpdatedAt: string | null;\n changed: boolean;\n};\n\n/** Per-workspace Codex rotation/active settings. New servers return `sharded`. */\nexport type CodexRotationSettings = {\n rotationEnabled: boolean;\n rotationStrategy: \"sharded\" | \"most_remaining\" | \"round_robin\" | \"drain_then_next\";\n activeCredentialId: string | null;\n};\n\n/** GET /codex/accounts — the accounts list + the workspace active pointer + settings. */\nexport type CodexAccountsResponse = {\n accounts: CodexAccount[];\n activeAccountId: string | null;\n /** Added by Apps-aware servers; absent on older same-major deployments. */\n apps?: {\n available: boolean;\n credentialId: string | null;\n version: number;\n designatedAt: string | null;\n canDisable: boolean;\n };\n settings: CodexRotationSettings;\n};\n\nexport type CodexAppsUpdate = {\n credentialId: string | null;\n version: number;\n designatedAt: string | null;\n changed: boolean;\n};\n\n/** Payload of a `codex.account.switched` session event. */\nexport type CodexAccountSwitchedPayload = {\n fromAccountId: string | null;\n toAccountId: string;\n reason: \"manual\" | \"exhausted\" | \"rotation\";\n};\n\n/** Device-code start: show `userCode` at `verificationUri`, then poll with `state`. */\nexport type CodexConnectStart = {\n userCode: string;\n verificationUri: string;\n intervalSeconds: number;\n state: string;\n};\n\n/** Poll result: keep polling on `pending`, restart on `expired`, done on `connected`. */\nexport type CodexConnectPoll =\n | { status: \"pending\" }\n | { status: \"expired\" }\n | {\n status: \"connected\";\n plan?: string | null;\n accountId?: string;\n isActive?: boolean;\n };\n\n/** Remaining usage/limits for one account. `usage` is the normalized P2 payload. */\nexport type CodexUsage = {\n status: \"ok\" | \"limit_reached\" | \"error\" | \"no-data\";\n usage: CodexUsagePayload | null;\n};\n\n/** Batched live-refresh response, keyed by credential id; each entry independently statused. */\nexport type CodexUsageMap = Record<string, CodexUsage>;\n\n/**\n * How a deployment expects clients to authenticate to it, surfaced so a UI can\n * wire up the right header/cookie without prior knowledge of the host setup.\n * Discriminated on `mode`; `none` is the back-compat default.\n */\nexport type ClientAuthConfig =\n | { mode: \"none\" }\n | { mode: \"deploymentKey\"; headerName: \"x-opengeni-access-key\" }\n | { mode: \"configuredToken\"; headerName: \"authorization\"; scheme: \"bearer\" }\n | { mode: \"managedSession\"; session: \"cookie\" };\n\n// Kept value-identical to @opengeni/contracts and pinned by the SDK contract\n// parity suite. The SDK has no runtime dependency on the Zod contracts package.\nexport const OPENGENI_API_CONTRACT_REVISION = \"2026-07-workspace-artifacts-v1\" as const;\nexport const OPENGENI_API_CONTRACT_HEADER = \"x-opengeni-api-contract\" as const;\n/** Bounded request/response identifier shared by browser, ingress, and API diagnostics. */\nexport const OPENGENI_CORRELATION_HEADER = \"x-opengeni-correlation-id\" as const;\n\n/**\n * Public, unauthenticated-by-default client bootstrap config returned by\n * `GET /v1/config/client`: which models + reasoning efforts are exposed, the\n * MCP servers and file-upload limits a composer should offer, and how the\n * deployment expects the client to authenticate. `allowedModels` is kept for\n * back-compat; `models` carries the richer provider-grouped list for a picker.\n */\nexport type ClientConfig = {\n deploymentRevision: string;\n apiContractRevision: typeof OPENGENI_API_CONTRACT_REVISION;\n serverVersion?: string | undefined;\n defaultModel: string;\n allowedModels: string[];\n models: ClientModel[];\n defaultReasoningEffort: ReasoningEffort;\n allowedReasoningEfforts: ReasoningEffort[];\n mcpServers: { id: string; name: string }[];\n fileUploads: { enabled: boolean; maxSizeBytes: number };\n /** Native browser microphone capture + server-side transcription capability. */\n voiceInput?: ClientVoiceInputConfig | undefined;\n productAccessMode: ProductAccessMode;\n auth: ClientAuthConfig;\n analytics: {\n consentRequired: boolean;\n providers: {\n reo?: { clientId: string } | undefined;\n posthog?: { projectKey: string; host: string } | undefined;\n ga4?: { measurementId: string } | undefined;\n };\n };\n // Server-wide hint: does this deployment support Channel-A structured services\n // at all (P4.4). Per-session availability is negotiated on /stream-capabilities;\n // this is the coarse on/off the client uses to decide whether to even attempt\n // the fs/git/terminal panels.\n structuredServices: {\n fileSystem: boolean;\n git: boolean;\n terminalEvents: boolean;\n };\n};\n\n/** Client-safe voice-input capability projection. */\nexport type ClientVoiceInputConfig = {\n available: boolean;\n maxDurationSeconds: number;\n maxSizeBytes: number;\n acceptedMimeTypes: string[];\n resumable?: ClientResumableVoiceInputConfig | undefined;\n};\n\nexport type ClientResumableVoiceInputConfig = {\n maxDurationSeconds: number;\n maxSizeBytes: number;\n maxChunkSizeBytes: number;\n providerSegmentSeconds: number;\n};\n\nexport type TranscriptionRecordingErrorCode =\n | \"permission_denied\"\n | \"not_supported\"\n | \"network\"\n | \"provider\"\n | \"policy_blocked\"\n | \"timeout\"\n | \"cancelled\"\n | \"unavailable\"\n | \"too_large\"\n | \"invalid_audio\"\n | \"unknown\";\n\nexport type TranscriptionRecordingState =\n | \"uploading\"\n | \"segmenting\"\n | \"ready\"\n | \"transcribing\"\n | \"complete\"\n | \"failed\"\n | \"discarded\";\n\nexport type TranscriptionRecordingSegmentState =\n | \"preparing\"\n | \"pending\"\n | \"transcribing\"\n | \"complete\"\n | \"failed\";\n\nexport type TranscriptionRecordingSegment = {\n segmentNumber: number;\n state: TranscriptionRecordingSegmentState;\n startMilliseconds: number;\n durationMilliseconds: number;\n byteLength: number;\n errorCode: TranscriptionRecordingErrorCode | null;\n retryable: boolean;\n};\n\nexport type TranscriptionRecording = {\n id: string;\n workspaceId: string;\n mimeType: string;\n state: TranscriptionRecordingState;\n nextChunkNumber: number;\n chunkCount: number;\n totalBytes: number;\n totalDurationMilliseconds: number;\n segmentCount: number;\n completedSegmentCount: number;\n transcriptText: string | null;\n languages: string[];\n errorCode: TranscriptionRecordingErrorCode | null;\n retryable: boolean;\n objectsCleaned: boolean;\n createdAt: string;\n updatedAt: string;\n expiresAt: string;\n};\n\nexport type TranscriptionRecordingResponse = {\n recording: TranscriptionRecording;\n segments: TranscriptionRecordingSegment[];\n retryAfterMilliseconds?: number;\n};\n\nexport type TranscriptionRecordingListResponse = {\n recordings: TranscriptionRecording[];\n};\n\nexport type TranscriptionRecordingChunk = {\n chunkNumber: number;\n byteLength: number;\n sha256: string;\n startMilliseconds: number;\n durationMilliseconds: number;\n deduplicated: boolean;\n};\n\nexport type UploadTranscriptionRecordingChunkResponse = {\n recording: TranscriptionRecording;\n chunk: TranscriptionRecordingChunk;\n};\n\n/** Response from POST /v1/workspaces/:workspaceId/transcriptions. */\nexport type TranscribeAudioResponse = {\n text: string;\n languages: string[];\n};\n\nexport type AccountRole = \"owner\" | \"admin\" | \"member\";\n\nexport type AccessPrincipalKind =\n | \"human_session\"\n | \"agent_attempt\"\n | \"service\"\n | \"api_key\"\n | \"configured_key\";\n\nexport type AccountGrant = {\n accountId: string;\n subjectId: string;\n subjectLabel?: string | undefined;\n role?: AccountRole | undefined;\n permissions: Permission[];\n metadata?: Record<string, unknown> | undefined;\n};\n\nexport type AccessGrant = {\n workspaceId: string;\n accountId: string;\n subjectId: string;\n subjectLabel?: string | undefined;\n permissions: Permission[];\n principalKind?: AccessPrincipalKind | undefined;\n metadata?: Record<string, unknown> | undefined;\n serviceInitiator?: ServiceTurnInitiator | undefined;\n serviceInitiatorContext?: ServiceTurnInitiatorContext | undefined;\n};\n\nexport type AccessContext = {\n mode: ProductAccessMode;\n subjectId: string;\n subjectLabel?: string | undefined;\n accountGrants: AccountGrant[];\n workspaceGrants: AccessGrant[];\n defaultAccountId: string | null;\n defaultWorkspaceId: string | null;\n};\n\nexport type Workspace = {\n id: string;\n accountId: string;\n name: string;\n slug: string | null;\n externalSource: string | null;\n externalId: string | null;\n agentInstructions: string | null;\n settings: Record<string, unknown>;\n inferenceControl: {\n state: \"active\" | \"paused\";\n revision: number;\n reason: string | null;\n changedBy: string | null;\n changedAt: string | null;\n };\n defaultRigId?: string | null;\n createdAt: string;\n updatedAt: string;\n};\n\nexport type WorkspaceSettings = {\n memoryEnabled?: boolean | undefined;\n voiceInput?: WorkspaceVoiceInputSettings | undefined;\n transcription?: WorkspaceTranscriptionPolicy | undefined;\n maxNestedAgentDepth?: number | null | undefined;\n /** Default for new Codex sessions; absent ⇒ remote_v2. */\n codexCompactionDefault?: \"remote_v2\" | \"portable\" | undefined;\n slackReactionSummon?: WorkspaceSlackReactionSummonSettings | undefined;\n [key: string]: unknown;\n};\n\nexport type WorkspaceSlackReactionSummonSettings = {\n enabled: boolean;\n emoji: string;\n channelPolicy: { mode: \"bot_member\" } | { mode: \"allowlist\"; channelIds: string[] };\n};\n\nexport type SlackReactionChannel = {\n id: string;\n name: string | null;\n isPrivate: boolean;\n};\n\nexport type SlackReactionChannelListResponse = {\n channels: SlackReactionChannel[];\n nextCursor: string | null;\n};\n\nexport type WorkspaceVoiceInputSettings = {\n enabled: boolean;\n};\n\nexport type UpdateWorkspaceSettingsRequest = {\n memoryEnabled?: boolean | undefined;\n voiceInput?: WorkspaceVoiceInputSettings | undefined;\n transcription?: WorkspaceTranscriptionPolicy | undefined;\n maxNestedAgentDepth?: number | null | undefined;\n codexCompactionDefault?: \"remote_v2\" | \"portable\" | undefined;\n slackReactionSummon?: WorkspaceSlackReactionSummonSettings | undefined;\n [key: string]: unknown;\n};\n\nexport type SetWorkspaceDefaultRigRequest = {\n rigId: string | null;\n};\n\nexport type CreateWorkspaceRequest = {\n accountId?: string | undefined;\n name: string;\n slug?: string | undefined;\n externalSource?: string | undefined;\n externalId?: string | undefined;\n agentInstructions?: string | null | undefined;\n};\n\nexport type UpdateWorkspaceRequest = {\n name?: string | undefined;\n slug?: string | null | undefined;\n agentInstructions?: string | null | undefined;\n};\n\nexport type ApiKey = {\n id: string;\n accountId: string;\n workspaceId: string | null;\n name: string;\n prefix: string;\n permissions: Permission[];\n expiresAt: string | null;\n revokedAt: string | null;\n lastUsedAt: string | null;\n createdAt: string;\n updatedAt: string;\n};\n\nexport type CreateApiKeyRequest = {\n name: string;\n permissions: Permission[];\n expiresAt?: string | undefined;\n};\n\nexport type CreateApiKeyResponse = {\n apiKey: ApiKey;\n /** The full secret token — shown once at creation, never returned again. */\n token: string;\n};\n\nexport type ListApiKeysResponse = {\n apiKeys: ApiKey[];\n};\n\n// A person (or API key) with access to a workspace. `subjectId` is\n// `user:<betterAuthUserId>` or `api_key:<id>`; the People surface lists the\n// `user:` subjects (api_key subjects belong to the API keys section).\nexport type WorkspaceMember = {\n subjectId: string;\n subjectLabel: string | null;\n role: string;\n permissions: Permission[];\n createdAt: string;\n};\n\nexport type ListWorkspaceMembersResponse = {\n members: WorkspaceMember[];\n};\n\nexport type AddWorkspaceMemberRequest = {\n email: string;\n role?: string | undefined;\n permissions: Permission[];\n};\n\nexport type UpdateWorkspaceMemberRequest = {\n role?: string | undefined;\n permissions: Permission[];\n};\n\n// --- Goals -------------------------------------------------------------------\n\nexport type SessionGoalStatus = \"active\" | \"paused\" | \"completed\";\n\nexport type SessionGoalCreatedBy = \"api\" | \"agent\" | \"scheduled_task\";\n\nexport type SessionGoalContinuationState =\n | \"inactive\"\n | \"scheduled\"\n | \"running\"\n | \"blocked\"\n | \"invariant_broken\";\n\nexport type SessionGoalContinuationReason =\n | \"goal_inactive\"\n | \"wake_pending\"\n | \"continuation_pending\"\n | \"human_work_pending\"\n | \"goal_turn_running\"\n | \"human_turn_running\"\n | \"workstream_paused\"\n | \"approval_required\"\n | \"provider_backpressure\"\n | \"session_cancelled\"\n | \"system_work_pending\"\n | \"missing_obligation\";\n\nexport type SessionGoalContinuation = {\n state: SessionGoalContinuationState;\n reason: SessionGoalContinuationReason;\n wakeRevision: number;\n observedRevision: number;\n nextAttemptAt: string | null;\n lastError: string | null;\n};\n\nexport type SessionGoal = {\n id: string;\n accountId: string;\n workspaceId: string;\n sessionId: string;\n status: SessionGoalStatus;\n text: string;\n successCriteria: string | null;\n evidence: string | null;\n rationale: string | null;\n pausedReason: string | null;\n createdBy: SessionGoalCreatedBy;\n version: number;\n autoContinuations: number;\n noProgressStreak: number;\n maxAutoContinuations: number | null;\n metadata: Record<string, unknown>;\n /** Optional for source compatibility; the API always supplies this projection. */\n continuation?: SessionGoalContinuation | undefined;\n createdAt: string;\n updatedAt: string;\n};\n\nexport type UpdateSessionGoalRequest = {\n status: \"paused\" | \"active\";\n rationale?: string | undefined;\n};\n\nexport type UpdateSessionRequest = {\n title: string;\n};\n\n// --- Operator context controls (/clear, /compact) ----------------------------\n\n/** Outcome of a manual /compact trigger. */\nexport type CompactSessionContextResult = {\n /** pending waits for the current safe boundary; completed ran while idle. */\n status: \"pending\" | \"completed\" | \"noop\";\n message: string;\n};\n\n// --- Turn queue --------------------------------------------------------------\n\nexport type EffectiveControlBlocker = {\n kind: \"session\" | \"workspace\";\n sessionId?: string | undefined;\n displayName: string;\n actor: string | null;\n reason: string | null;\n changedAt: string | null;\n revision: number;\n};\n\nexport type EffectiveControlResumeOption = {\n scope: \"selected\" | \"session\" | \"workspace\";\n targetId?: string | undefined;\n selectedStateAfter: \"active\" | \"paused\";\n remainingPrimaryBlocker?: EffectiveControlBlocker | undefined;\n impactCopy: string;\n};\n\nexport type EffectiveSessionControl = {\n state: \"active\" | \"paused\";\n controlVersion: number;\n controlEtag: string;\n directState: \"active\" | \"paused\";\n primaryBlocker: EffectiveControlBlocker | null;\n additionalBlockerCount: number;\n blockers: EffectiveControlBlocker[];\n resumeOptions: EffectiveControlResumeOption[];\n override: { rootSessionId: string; revision: number } | null;\n settlement: {\n state: \"stopping\";\n attemptCount: number;\n interruptionPendingCount: number;\n quiescencePendingCount: number;\n } | null;\n};\n\nexport type SessionCommandReceipt = {\n id: string;\n action: string;\n operationKey: string;\n targetSessionId: string | null;\n targetTurnId: string | null;\n appliedControlRevision: number | null;\n appliedQueueVersion: number | null;\n appliedTurnVersion: number | null;\n appliedDraftRevision: number | null;\n createdAt: string;\n};\n\nexport type ComposerDraft = {\n revision: number;\n text: string;\n resources: ResourceRef[];\n model: string;\n reasoningEffort: ReasoningEffort;\n latencyMode?: LatencyMode | undefined;\n sourceTurnId: string | null;\n sourceTurnVersion: number | null;\n updatedAt: string | null;\n};\n\nexport type NewSessionDraftOptions = {\n sandboxBackend?: SandboxBackend | undefined;\n targetSandboxId?: string | undefined;\n workingDir?: string | undefined;\n variableSetId?: string | undefined;\n rigId?: string | undefined;\n goal?: GoalSpec | undefined;\n firstPartyMcpPermissions?: Permission[] | undefined;\n firstPartyMcpTools?: FirstPartyMcpToolName[] | undefined;\n};\n\nexport type NewSessionDraft = {\n revision: number;\n text: string;\n resources: ResourceRef[];\n tools: ToolRef[];\n /** False inherits the workspace-default MCP policy; true preserves an explicit array. */\n toolsProvided: boolean;\n model: string;\n reasoningEffort: ReasoningEffort;\n latencyMode?: LatencyMode | undefined;\n options: NewSessionDraftOptions;\n updatedAt: string | null;\n};\n\nexport type SessionQueueSnapshot = {\n version: number;\n effectiveControl: EffectiveSessionControl;\n /** Secret-safe personal MCP summaries frozen on the exact active turn. */\n activePersonalConnections: McpPersonalConnectionSummary[];\n /** The latest interrupted attempt has not yet durably proved physical quiescence. */\n stoppingPreviousAttempt: boolean;\n items: SessionTurn[];\n /** Canonical pending machine inputs. Events only invalidate this snapshot. */\n pendingInputs: SessionPendingInputPreview[];\n /** Exact next bounded input batch that will join an already-waiting prompt. */\n pendingInputAttachment: {\n turnId: string;\n inputIds: string[];\n } | null;\n};\n\nexport type SessionPendingInputPreview = Pick<\n SessionSystemUpdate,\n \"id\" | \"sessionId\" | \"kind\" | \"classification\" | \"sourceId\" | \"summary\" | \"createdAt\"\n>;\n\nexport type SystemUpdateClassification = \"success\" | \"failure\" | \"action_required\" | \"info\";\n\nexport type SessionSystemUpdateKind =\n | \"scheduled_occurrence\"\n | \"goal_continuation\"\n | \"agent_message\"\n | \"agent_steer_instruction\"\n | \"child_terminal_result\";\n\nexport type SessionSystemUpdateState =\n | \"pending\"\n | \"delivered\"\n | \"cancelled\"\n | \"superseded\"\n | \"failed\";\n\nexport type SessionSystemUpdate = {\n id: string;\n sessionId: string;\n kind: SessionSystemUpdateKind;\n classification: SystemUpdateClassification;\n sourceId: string;\n dedupeKey: string;\n summary: string;\n payload: Record<string, unknown>;\n lineage: Record<string, unknown>;\n state: SessionSystemUpdateState;\n deliveredTurnId: string | null;\n deliveredHistoryItemId: string | null;\n deliveredAt: string | null;\n createdAt: string;\n};\n\nexport type SessionControlResponse = {\n receipt: SessionCommandReceipt;\n effectiveControl: EffectiveSessionControl;\n interruptionCount: number;\n wakeCount: number;\n cancelledSessionCount: number;\n cancelledTurnCount: number;\n};\n\nexport type WorkspaceInferenceControlResponse = {\n receipt: SessionCommandReceipt;\n state: \"active\" | \"paused\";\n revision: number;\n interruptionCount: number;\n wakeCount: number;\n};\n\nexport type WorkspaceControlEvent = {\n id: string;\n workspaceId: string;\n /** Same monotonic value as revision; named sequence for SSE resume cursors. */\n sequence: number;\n revision: number;\n type: \"workspace.control.changed\";\n scope: \"workspace\" | \"session\";\n rootSessionId: string | null;\n action: \"pause\" | \"resume\";\n automatic: boolean;\n reason: string | null;\n actor: string;\n occurredAt: string;\n truncation?: {\n truncated: true;\n surface:\n | \"durable_control\"\n | \"database_guard\"\n | \"http_projection\"\n | \"nats_legacy_guard\"\n | \"sse_legacy_guard\";\n deliveredBytes: number;\n fields: Array<{\n field: \"reason\" | \"actor\";\n originalBytes: number;\n deliveredBytes: number;\n omittedBytes: number;\n }>;\n fullEvidence: {\n available: false;\n reason: \"not_retained\";\n };\n } | null;\n};\n\nexport type SessionQueueMutationResponse = {\n receipt: SessionCommandReceipt;\n snapshot: SessionQueueSnapshot;\n draft?: ComposerDraft;\n};\n\nexport type MoveSessionQueueItemRequest = {\n clientEventId: string;\n expectedQueueVersion: number;\n beforeTurnId: string | null;\n};\n\nexport type EditSessionQueueItemRequest = {\n clientEventId: string;\n expectedTurnVersion: number;\n expectedDraftRevision: number;\n replaceDraft: boolean;\n};\n\nexport type SteerSessionQueueItemRequest = {\n clientEventId: string;\n expectedTurnVersion: number;\n controlEtag?: string;\n};\n\nexport type DeleteSessionQueueItemRequest = {\n clientEventId: string;\n expectedTurnVersion: number;\n reason?: string;\n};\n\nexport type SaveComposerDraftRequest = Omit<\n ComposerDraft,\n \"revision\" | \"sourceTurnId\" | \"sourceTurnVersion\" | \"updatedAt\"\n> & { expectedRevision: number };\n\nexport type SaveNewSessionDraftRequest = Omit<NewSessionDraft, \"revision\" | \"updatedAt\"> & {\n expectedRevision: number;\n};\n\n// --- Scheduled tasks: requests + runs ----------------------------------------\n\n/** Input shape for agent config on create/update (server applies defaults). */\nexport type ScheduledTaskAgentConfigInput = {\n prompt: string;\n resources?: ResourceRef[] | undefined;\n tools?: ToolRef[] | undefined;\n metadata?: Record<string, unknown> | undefined;\n slackBotConnectionId?: string | undefined;\n model?: string | undefined;\n reasoningEffort?: ReasoningEffort | undefined;\n sandboxBackend?: SandboxBackend | undefined;\n goal?: GoalSpec | undefined;\n maxNestedAgentDepth?: number | undefined;\n};\n\nexport type CreateScheduledTaskRequest = {\n name: string;\n schedule: ScheduledTaskScheduleSpec;\n runMode?: ScheduledTaskRunMode | undefined;\n overlapPolicy?: ScheduledTaskOverlapPolicy | undefined;\n agentConfig: ScheduledTaskAgentConfigInput;\n status?: ScheduledTaskStatus | undefined;\n variableSetId?: string | null | undefined;\n /** @deprecated use variableSetId */\n environmentId?: string | null | undefined;\n // The rig each run binds to (M3); active version resolved per fire.\n rigId?: string | null | undefined;\n metadata?: Record<string, unknown> | undefined;\n};\n\nexport type UpdateScheduledTaskRequest = {\n name?: string | undefined;\n schedule?: ScheduledTaskScheduleSpec | undefined;\n runMode?: ScheduledTaskRunMode | undefined;\n overlapPolicy?: ScheduledTaskOverlapPolicy | undefined;\n agentConfig?: ScheduledTaskAgentConfigInput | undefined;\n status?: ScheduledTaskStatus | undefined;\n variableSetId?: string | null | undefined;\n /** @deprecated use variableSetId */\n environmentId?: string | null | undefined;\n // The rig each run binds to (M3); active version resolved per fire.\n rigId?: string | null | undefined;\n metadata?: Record<string, unknown> | undefined;\n};\n\nexport type ScheduledTaskRunStatus = \"queued\" | \"dispatched\" | \"failed\";\n\nexport type ScheduledTaskTriggerType = \"scheduled\" | \"manual\";\n\nexport type ScheduledTaskRun = {\n id: string;\n accountId: string;\n workspaceId: string;\n taskId: string;\n status: ScheduledTaskRunStatus;\n triggerType: ScheduledTaskTriggerType;\n scheduledAt: string | null;\n firedAt: string;\n sessionId: string | null;\n triggerEventId: string | null;\n error: string | null;\n createdAt: string;\n updatedAt: string;\n};\n\n// --- VariableSets -------------------------------------------------------------\n\n/**\n * Variable values are write-only by design: the API never returns a value, so\n * reads expose name + version metadata only. Values are decrypted exclusively\n * inside the worker at sandbox materialization time.\n */\nexport type VariableSetVariableMetadata = {\n name: string;\n version: number;\n createdAt: string;\n updatedAt: string;\n};\n\nexport type VariableSet = {\n id: string;\n accountId: string;\n workspaceId: string;\n name: string;\n description: string | null;\n variables: VariableSetVariableMetadata[];\n createdAt: string;\n updatedAt: string;\n};\n\n/** @deprecated use VariableSetVariableMetadata */\nexport type WorkspaceEnvironmentVariableMetadata = VariableSetVariableMetadata;\n\n/** @deprecated use VariableSet */\nexport type WorkspaceEnvironment = VariableSet;\n\nexport type CreateVariableSetRequest = {\n name: string;\n description?: string | undefined;\n /** Initial variables. Values are write-only: they never come back on reads. */\n variables?: { name: string; value: string }[] | undefined;\n};\n\n/** @deprecated use CreateVariableSetRequest */\nexport type CreateWorkspaceEnvironmentRequest = CreateVariableSetRequest;\n\nexport type UpdateVariableSetRequest = {\n name?: string | undefined;\n description?: string | null | undefined;\n};\n\n/** @deprecated use UpdateVariableSetRequest */\nexport type UpdateWorkspaceEnvironmentRequest = UpdateVariableSetRequest;\n\nexport type SetVariableSetVariableRequest = {\n value: string;\n};\n\n/** @deprecated use SetVariableSetVariableRequest */\nexport type SetWorkspaceEnvironmentVariableRequest = SetVariableSetVariableRequest;\n\n// --- Rigs ---------------------------------------------------------------------\n// Workspace-scoped, versioned sandbox machine definitions. Versions are\n// append-only and content-immutable; exactly one is active per rig.\n\nexport type RigCheck = {\n name: string;\n command: string;\n};\n\nexport type RigVersion = {\n id: string;\n rigId: string;\n version: number;\n image: string | null;\n setupScript: string | null;\n checks: RigCheck[];\n credentialHooks: string[];\n defaultVariableSetIds: string[];\n changelog: string | null;\n createdBy: string | null;\n active: boolean;\n createdAt: string;\n};\n\nexport type RigVerificationHealth = {\n checkHealth: \"passing\" | \"failing\" | \"unknown\";\n lastVerifiedAt: string | null;\n};\n\nexport type Rig = {\n id: string;\n accountId: string;\n workspaceId: string;\n name: string;\n description: string | null;\n createdBy: string | null;\n activeVersion: RigVersion | null;\n activeVersionHealth?: RigVerificationHealth | null;\n versionCount: number;\n createdAt: string;\n updatedAt: string;\n};\n\nexport type RigChangeKind = \"setup_append\" | \"definition_edit\";\n\nexport type RigChangeStatus = \"proposed\" | \"verifying\" | \"merged\" | \"rejected\" | \"failed\";\n\nexport type RigCheckResult = {\n name: string;\n command: string;\n exitCode: number | null;\n output?: string | undefined;\n};\n\nexport type RigChangeVerification = {\n startedAt?: string | undefined;\n finishedAt?: string | undefined;\n log?: string | undefined;\n checkResults?: RigCheckResult[] | undefined;\n [key: string]: unknown;\n};\n\nexport type RigChange = {\n id: string;\n rigId: string;\n baseVersionId: string | null;\n kind: RigChangeKind;\n payload: Record<string, unknown>;\n status: RigChangeStatus;\n proposedBy: string | null;\n verification: RigChangeVerification | null;\n resultVersionId: string | null;\n createdAt: string;\n updatedAt: string;\n};\n\nexport type CreateRigRequest = {\n name: string;\n description?: string | undefined;\n image?: string | undefined;\n setupScript?: string | undefined;\n checks?: RigCheck[] | undefined;\n credentialHooks?: string[] | undefined;\n defaultVariableSetIds?: string[] | undefined;\n};\n\nexport type UpdateRigRequest = {\n name?: string | undefined;\n description?: string | null | undefined;\n};\n\nexport type RigSetupAppendPayload = {\n command: string;\n note?: string | undefined;\n};\n\nexport type RigDefinitionEditPayload = {\n image?: string | null | undefined;\n setupScript?: string | null | undefined;\n checks?: RigCheck[] | undefined;\n credentialHooks?: string[] | undefined;\n defaultVariableSetIds?: string[] | undefined;\n changelog?: string | null | undefined;\n};\n\nexport type ProposeRigChangeRequest =\n | { kind: \"setup_append\"; payload: RigSetupAppendPayload }\n | { kind: \"definition_edit\"; payload: RigDefinitionEditPayload };\n\n// --- Files ---------------------------------------------------------------------\n\nexport type FileStatus = \"pending_upload\" | \"ready\" | \"failed\" | \"expired\" | \"deleted\";\n\nexport type FileAsset = {\n id: string;\n workspaceId: string;\n status: FileStatus;\n filename: string;\n safeFilename: string;\n contentType: string;\n sizeBytes: number;\n sha256: string | null;\n bucket: string;\n objectKey: string;\n createdAt: string;\n updatedAt: string;\n};\n\n/** Mirrors the closed, provider-neutral retained-output contract. */\nexport const RETAINED_OUTPUT_DEFAULT_PAGE_BYTES = 256 * 1024;\nexport const RETAINED_OUTPUT_MAX_PAGE_BYTES = 1024 * 1024;\n\nexport type RetainedOutputKind =\n | \"tool_result\"\n | \"assistant_completion\"\n | \"internal_update\"\n | \"event_media\"\n | \"file\";\n\nexport type RetainedOutputUnavailableReason =\n | \"not_retained\"\n | \"pending\"\n | \"failed\"\n | \"expired\"\n | \"deleted\"\n | \"missing_storage\"\n | \"storage_write_failed\"\n | \"unsupported\";\n\nexport type RetainedArtifactReference = {\n available: true;\n artifactId: string;\n kind: RetainedOutputKind;\n contentType: string;\n originalBytes: number;\n sha256: string;\n retainedAt: string;\n retention: { policy: \"workspace_file\"; expiresAt: null };\n retrieval: {\n method: \"GET\";\n path: string;\n acceptRanges: \"bytes\";\n maxRangeBytes: number;\n };\n};\n\nexport type RetainedArtifactUnavailable = {\n available: false;\n artifactId: string;\n reason: RetainedOutputUnavailableReason;\n};\n\nexport type RetainedArtifactMetadata = RetainedArtifactReference | RetainedArtifactUnavailable;\n\nexport type RetainedArtifactContentOptions = {\n /** One RFC-style bytes range, for example `bytes=1048576-2097151`. */\n range?: string | undefined;\n signal?: AbortSignal | undefined;\n};\n\nexport type RetainedArtifactContent = {\n bytes: Uint8Array;\n status: 200 | 206;\n contentType: string;\n contentLength: number;\n contentRange: string | null;\n acceptRanges: \"bytes\";\n};\n\nexport type CreateFileUploadRequest = {\n filename: string;\n contentType: string;\n sizeBytes: number;\n sha256?: string | undefined;\n};\n\nexport type CreateFileUploadResponse = {\n fileId: string;\n uploadId: string;\n /** Pre-signed PUT URL for the file bytes (direct to object storage). */\n putUrl: string;\n /** Headers that MUST be sent with the PUT for the signature to validate. */\n requiredHeaders: Record<string, string>;\n expiresAt: string;\n maxSizeBytes: number;\n};\n\nexport type CompleteFileUploadResponse = {\n file: FileAsset;\n};\n\nexport type FileDownloadUrlResponse = {\n url: string;\n expiresAt: string;\n};\n\n/** Bytes accepted by the `uploadFile` helper. */\nexport type FileUploadData = Blob | ArrayBuffer | Uint8Array | string;\n\nexport type UploadFileInput = {\n filename: string;\n contentType: string;\n data: FileUploadData;\n sha256?: string | undefined;\n};\n\n// --- Documents -------------------------------------------------------------------\n\nexport type DocumentStatus = \"queued\" | \"indexing\" | \"ready\" | \"failed\";\nexport type KnowledgeSourceKind =\n | \"manual_upload\"\n | \"meeting_transcript\"\n | \"repository\"\n | \"email\"\n | \"chat\"\n | \"document\"\n | \"web\"\n | \"other\";\nexport type DocumentSearchMode = \"hybrid\" | \"vector\" | \"keyword\";\n\nexport type DocumentAuthorityKind = \"organization\" | \"workspace\" | \"personal\";\n\nexport type DocumentVisibility = \"workspace\" | \"private\";\n\nexport type DocumentCurationStatus = \"none\" | \"pending\" | \"suggested\" | \"auto_filed\" | \"failed\";\n\nexport type DocumentCuration = {\n suggestedBaseId: string | null;\n suggestedBaseName: string | null;\n confidence: number;\n reason: string | null;\n originalTitle: string | null;\n model: string | null;\n};\n\nexport type DocumentBase = {\n id: string;\n workspaceId: string;\n name: string;\n description: string | null;\n createdAt: string;\n updatedAt: string;\n};\n\nexport type Document = {\n id: string;\n workspaceId: string;\n baseId: string;\n fileId: string;\n status: DocumentStatus;\n title: string;\n parser: string;\n chunkCount: number;\n error: string | null;\n sourceKind: KnowledgeSourceKind;\n sourceUri: string | null;\n sourceExternalId: string | null;\n sourceTitle: string | null;\n sourceAuthor: string | null;\n sourceCreatedAt: string | null;\n sourceUpdatedAt: string | null;\n sourceVersion: string | null;\n aclTags: string[];\n authorityKind: DocumentAuthorityKind;\n authorityWorkspaceId: string | null;\n authoritySubjectId: string | null;\n visibility: DocumentVisibility;\n createdBy: string | null;\n agentAccess: boolean;\n summary: string | null;\n topics: string[];\n curationStatus: DocumentCurationStatus;\n curation: DocumentCuration | null;\n createdAt: string;\n updatedAt: string;\n};\n\nexport type DocumentSearchResult = {\n chunkId: string;\n workspaceId: string;\n documentId: string;\n baseId: string;\n fileId: string;\n title: string;\n text: string;\n score: number;\n matchType: DocumentSearchMode;\n vectorScore: number | null;\n keywordScore: number | null;\n chunkIndex: number;\n metadata: Record<string, unknown>;\n sourceKind: KnowledgeSourceKind;\n sourceUri: string | null;\n sourceExternalId: string | null;\n sourceTitle: string | null;\n sourceAuthor: string | null;\n sourceCreatedAt: string | null;\n sourceUpdatedAt: string | null;\n sourceVersion: string | null;\n aclTags: string[];\n authorityKind: DocumentAuthorityKind;\n authorityWorkspaceId: string | null;\n authoritySubjectId: string | null;\n};\n\nexport type CreateDocumentBaseRequest = {\n name: string;\n description?: string | undefined;\n};\n\nexport type AddDocumentRequest = {\n fileId: string;\n title?: string | undefined;\n sourceKind?: KnowledgeSourceKind | undefined;\n sourceUri?: string | undefined;\n sourceExternalId?: string | undefined;\n sourceTitle?: string | undefined;\n sourceAuthor?: string | undefined;\n sourceCreatedAt?: string | undefined;\n sourceUpdatedAt?: string | undefined;\n sourceVersion?: string | undefined;\n aclTags?: string[] | undefined;\n authorityKind?: DocumentAuthorityKind | undefined;\n visibility?: DocumentVisibility | undefined;\n agentAccess?: boolean | undefined;\n};\n\nexport type CreateKnowledgeDropRequest = {\n text?: string | undefined;\n fileId?: string | undefined;\n filename?: string | undefined;\n title?: string | undefined;\n authorityKind?: DocumentAuthorityKind | undefined;\n visibility?: DocumentVisibility | undefined;\n agentAccess?: boolean | undefined;\n};\n\nexport type MoveDocumentRequest = {\n targetBaseId?: string | undefined;\n};\n\nexport type DocumentSearchRequest = {\n query: string;\n baseIds?: string[] | undefined;\n mode?: DocumentSearchMode | undefined;\n sourceKinds?: KnowledgeSourceKind[] | undefined;\n aclTags?: string[] | undefined;\n limit?: number | undefined;\n};\n\nexport type DocumentSearchResponse = {\n results: DocumentSearchResult[];\n};\n\nexport type KnowledgeMemoryStatus =\n | \"proposed\"\n | \"approved\"\n | \"rejected\"\n | \"active\"\n | \"superseded\"\n | \"archived\";\nexport type KnowledgeMemoryKind =\n | \"semantic\"\n | \"episodic\"\n | \"procedural\"\n | \"decision\"\n | \"preference\";\n\nexport type KnowledgeSourceRef = {\n kind: \"document_chunk\" | \"document\" | \"session_event\" | \"memory\" | \"external\";\n id: string;\n uri?: string | undefined;\n title?: string | undefined;\n metadata?: Record<string, unknown> | undefined;\n};\n\nexport type KnowledgeMemory = {\n id: string;\n workspaceId: string;\n status: KnowledgeMemoryStatus;\n kind: KnowledgeMemoryKind;\n scope: string;\n text: string;\n sourceRefs: KnowledgeSourceRef[];\n confidence: number;\n metadata: Record<string, unknown>;\n createdBySessionId: string | null;\n reviewedBy: string | null;\n reviewedAt: string | null;\n pinned: boolean;\n usageCount: number;\n lastUsedAt: string | null;\n supersedesId: string | null;\n supersededById: string | null;\n validFrom: string;\n validUntil: string | null;\n createdAt: string;\n updatedAt: string;\n};\n\nexport type CreateKnowledgeMemoryRequest = {\n status?: KnowledgeMemoryStatus | undefined;\n kind?: KnowledgeMemoryKind | undefined;\n scope?: string | undefined;\n text: string;\n sourceRefs?: KnowledgeSourceRef[] | undefined;\n confidence?: number | undefined;\n metadata?: Record<string, unknown> | undefined;\n createdBySessionId?: string | undefined;\n pinned?: boolean | undefined;\n replacesId?: string | undefined;\n};\n\nexport type UpdateKnowledgeMemoryRequest = {\n status?: KnowledgeMemoryStatus | undefined;\n kind?: KnowledgeMemoryKind | undefined;\n scope?: string | undefined;\n text?: string | undefined;\n sourceRefs?: KnowledgeSourceRef[] | undefined;\n confidence?: number | undefined;\n metadata?: Record<string, unknown> | undefined;\n reviewedBy?: string | undefined;\n pinned?: boolean | undefined;\n};\n\nexport type KnowledgeMemorySearchRequest = {\n query?: string | undefined;\n status?: KnowledgeMemoryStatus | undefined;\n kind?: KnowledgeMemoryKind | undefined;\n scope?: string | undefined;\n limit?: number | undefined;\n};\n\nexport type WorkspaceMemorySearchMode = \"hybrid\" | \"vector\" | \"keyword\";\n\nexport type WorkspaceMemorySearchRequest = {\n query: string;\n kind?: KnowledgeMemoryKind | undefined;\n limit?: number | undefined;\n mode?: WorkspaceMemorySearchMode | undefined;\n};\n\nexport type WorkspaceMemorySearchResult = {\n memory: KnowledgeMemory;\n score: number;\n matchType: WorkspaceMemorySearchMode;\n vectorScore: number | null;\n keywordScore: number | null;\n};\n\nexport type WorkspaceMemorySearchResponse = {\n results: WorkspaceMemorySearchResult[];\n};\n\n// --- Capability packs ---------------------------------------------------------\n\nexport type CapabilityPackConnectorAuthModel =\n | \"oauth2_authorization_code_pkce\"\n | \"oauth2_authorization_code\"\n | \"api_key\"\n | \"credential_ref\";\n\nexport type CapabilityPackConnector = {\n id: string;\n name: string;\n category: string;\n authModel: CapabilityPackConnectorAuthModel;\n providers: string[];\n scopes: string[];\n required: boolean;\n metadata: Record<string, unknown>;\n};\n\nexport type CapabilityPackKnowledge = {\n type: \"document_base\";\n id: string;\n name: string;\n description: string | null;\n required: boolean;\n};\n\nexport type CapabilityPackScheduledTaskTemplate = {\n id: string;\n name: string;\n description: string;\n defaultSchedule: ScheduledTaskScheduleSpec;\n defaultRunMode: ScheduledTaskRunMode;\n defaultOverlapPolicy: ScheduledTaskOverlapPolicy;\n prompt?: string | undefined;\n};\n\nexport type CapabilityPackSkillFile = {\n path: string;\n content: string;\n};\n\nexport type CapabilityPackSkill = {\n name: string;\n description?: string | undefined;\n files: CapabilityPackSkillFile[];\n};\n\nexport type SessionSkill = CapabilityPackSkill;\n\nexport type CapabilityPackVariableSetSpec = {\n description: string;\n requiredVariables: string[];\n required: boolean;\n};\n\nexport type CapabilityPack = {\n id: string;\n name: string;\n description: string;\n role: string;\n category: string;\n version: string;\n sandboxImage?: string | undefined;\n sandboxProviderImages?:\n | {\n modal?: { imageId: string } | undefined;\n }\n | undefined;\n skills: CapabilityPackSkill[];\n tools: ToolRef[];\n connectors: CapabilityPackConnector[];\n knowledge: CapabilityPackKnowledge[];\n scheduledTaskTemplates: CapabilityPackScheduledTaskTemplate[];\n variableSet?: CapabilityPackVariableSetSpec | undefined;\n metadata: Record<string, unknown>;\n};\n\n/** Input shape for registering a pack manifest (server applies defaults). */\nexport type RegisterCapabilityPackRequest = {\n id: string;\n name: string;\n description: string;\n role: string;\n category: string;\n version: string;\n sandboxImage?: string | undefined;\n sandboxProviderImages?:\n | {\n modal?: { imageId: string } | undefined;\n }\n | undefined;\n skills?:\n | {\n name: string;\n description?: string | undefined;\n files: CapabilityPackSkillFile[];\n }[]\n | undefined;\n tools?: ToolRef[] | undefined;\n connectors?:\n | {\n id: string;\n name: string;\n category: string;\n authModel: CapabilityPackConnectorAuthModel;\n providers?: string[] | undefined;\n scopes?: string[] | undefined;\n required?: boolean | undefined;\n metadata?: Record<string, unknown> | undefined;\n }[]\n | undefined;\n knowledge?:\n | {\n type: \"document_base\";\n id: string;\n name: string;\n description?: string | null | undefined;\n required?: boolean | undefined;\n }[]\n | undefined;\n scheduledTaskTemplates?:\n | {\n id: string;\n name: string;\n description: string;\n defaultSchedule: ScheduledTaskScheduleSpec;\n defaultRunMode?: ScheduledTaskRunMode | undefined;\n defaultOverlapPolicy?: ScheduledTaskOverlapPolicy | undefined;\n prompt?: string | undefined;\n }[]\n | undefined;\n variableSet?:\n | {\n description: string;\n requiredVariables?: string[] | undefined;\n required?: boolean | undefined;\n }\n | undefined;\n metadata?: Record<string, unknown> | undefined;\n};\n\nexport type WorkspaceRegisteredPack = {\n accountId: string;\n workspaceId: string;\n pack: CapabilityPack;\n createdAt: string;\n updatedAt: string;\n};\n\nexport type PackInstallationStatus = \"active\" | \"disabled\";\n\nexport type PackInstallation = {\n id: string;\n accountId: string;\n workspaceId: string;\n packId: string;\n status: PackInstallationStatus;\n metadata: Record<string, unknown>;\n enabledAt: string;\n updatedAt: string;\n};\n\nexport type EnablePackRequest = {\n variableSetId?: string | undefined;\n /** @deprecated use variableSetId */\n environmentId?: string | undefined;\n metadata?: Record<string, unknown> | undefined;\n};\n\nexport type ListPacksResponse = {\n packs: CapabilityPack[];\n installations: PackInstallation[];\n};\n\nexport type GetPackResponse = {\n pack: CapabilityPack;\n installation: PackInstallation | null;\n};\n\n// --- Capabilities ---------------------------------------------------------------\n\nexport type CapabilityKind = \"pack\" | \"mcp\" | \"api\" | \"skill\" | \"plugin\";\n\nexport type CapabilitySource =\n | \"built_in\"\n | \"library\"\n | \"configured\"\n | \"public_registry\"\n | \"registry\"\n | \"manual\";\n\nexport type CapabilityInstallationStatus = \"active\" | \"disabled\";\n\nexport type CapabilityCatalogAuthKind = \"oauth2\" | \"api_key\" | \"none\" | \"unknown\";\n\nexport type CapabilityCatalogTier = \"verified\" | \"community\";\n\nexport type CapabilityRuntime = {\n available: boolean;\n mcpServerId?: string | undefined;\n transport?: string | undefined;\n notes: string | null;\n /** Secret-safe server-derived registry exposure state. */\n catalogTrust?:\n | {\n state: \"trusted\" | \"legacy_active\" | \"unverified\";\n reason:\n | \"trusted_source\"\n | \"verified_probe\"\n | \"active_installation_compatibility\"\n | \"missing_verification\";\n }\n | undefined;\n};\n\nexport type CapabilityCatalogItem = {\n id: string;\n accountId?: string | undefined;\n workspaceId?: string | undefined;\n kind: CapabilityKind;\n source: CapabilitySource;\n name: string;\n description: string | null;\n category: string;\n tags: string[];\n homepageUrl: string | null;\n endpointUrl: string | null;\n installUrl: string | null;\n authModel: string | null;\n providerDomain: string | null;\n surfaceType: string | null;\n transport: string | null;\n mcpUrl: string | null;\n authKind: CapabilityCatalogAuthKind | null;\n credentialFacts: Record<string, unknown>[];\n tier: CapabilityCatalogTier | null;\n provenance: string | null;\n logoAssetPath: string | null;\n importBatchId: string | null;\n stale: boolean;\n staleAt: string | null;\n tools: ToolRef[];\n runtime: CapabilityRuntime;\n enabled: boolean;\n enabledReason: string | null;\n /** The connection backing this enabled installation, or null when none is involved. */\n connectionRef: {\n connectionId?: string | undefined;\n providerDomain: string;\n kind: string;\n subjectScope?: \"subject\" | \"workspace\" | undefined;\n } | null;\n metadata: Record<string, unknown>;\n createdAt?: string | undefined;\n updatedAt?: string | undefined;\n};\n\nexport type CapabilityInstallation = {\n id: string;\n accountId: string;\n workspaceId: string;\n capabilityId: string;\n kind: CapabilityKind;\n status: CapabilityInstallationStatus;\n config: Record<string, unknown>;\n metadata: Record<string, unknown>;\n enabledAt: string;\n updatedAt: string;\n};\n\nexport type CapabilityCatalogResponse = {\n items: CapabilityCatalogItem[];\n installations: CapabilityInstallation[];\n};\n\nexport type CreateCapabilityCatalogItemRequest = {\n id?: string | undefined;\n kind: Exclude<CapabilityKind, \"pack\">;\n source?: CapabilitySource | undefined;\n name: string;\n description?: string | undefined;\n category?: string | undefined;\n tags?: string[] | undefined;\n homepageUrl?: string | undefined;\n endpointUrl?: string | undefined;\n installUrl?: string | undefined;\n authModel?: string | undefined;\n metadata?: Record<string, unknown> | undefined;\n};\n\nexport type EnableCapabilityRequest = {\n config?: Record<string, unknown> | undefined;\n metadata?: Record<string, unknown> | undefined;\n connectionRef?: McpServerConnectionRef | undefined;\n /**\n * Credential headers for remote MCP capabilities. Write-only: encrypted at\n * rest, injected only into the runtime MCP client, never returned by the\n * API (responses expose header names only).\n */\n headers?: Record<string, string> | undefined;\n /**\n * Initial variableSet attachment for kind=pack capabilities — mirrors the\n * dedicated POST /packs/:id/enable body. Required to enable an\n * variableSet.required pack through this unified path; ignored otherwise.\n */\n variableSetId?: string | undefined;\n /** @deprecated use variableSetId */\n environmentId?: string | undefined;\n};\n\nexport type DiscoverMcpCapabilitiesResponse = {\n items: CapabilityCatalogItem[];\n source: \"official_mcp_registry\";\n sourceUrl: string;\n};\n\n// --- GitHub ---------------------------------------------------------------------\n\nexport type GitHubRepository = {\n id: number;\n installationId: number;\n fullName: string;\n name: string;\n private: boolean;\n htmlUrl: string;\n cloneUrl: string;\n defaultBranch: string;\n accountLogin: string;\n accountType: string | null;\n};\n\nexport type GitHubRepositoryScope = \"all\" | \"selected\";\n\nexport type GitHubBindingStatus = \"disabled\" | \"unbound\" | \"bound\";\n\nexport type GitHubAppSetupMode = \"platform\" | \"operator\";\n\nexport type GitHubInstallationLifecycle = \"active\" | \"suspended\" | \"deleted\" | \"unverified\";\n\nexport type GitHubInstallationBinding = {\n installationId: number;\n githubAccountId: number | null;\n accountLogin: string | null;\n accountType: string | null;\n lifecycle: GitHubInstallationLifecycle;\n repositoryScope: GitHubRepositoryScope;\n repositoryCount: number;\n /** OpenGeni-owned entry point for changing the installation's repository allowlist. */\n configureUrl: string | null;\n createdAt: string;\n updatedAt: string;\n};\n\nexport type GitHubAppInfo = {\n configured: boolean;\n /** Truthful workspace binding state; server App credentials alone are not a binding. */\n status: GitHubBindingStatus;\n /** Platform deployments expose installation only; operator deployments may create an App. */\n setupMode: GitHubAppSetupMode;\n appId: string | null;\n clientId: string | null;\n appSlug: string | null;\n /** Fresh OAuth-first existing-installation discovery and install entry point. */\n installUrl: string | null;\n /** Compatibility alias for installUrl. */\n linkUrl: string | null;\n /** Installation bindings owned independently by this workspace. */\n installations: GitHubInstallationBinding[];\n /** Setting names still missing when `configured` is false. */\n missing: string[];\n};\n\nexport type GitHubRepositoriesResponse = {\n repositories: GitHubRepository[];\n};\n\nexport type CreateGitHubAppManifestRequest = {\n appName?: string | undefined;\n organization?: string | undefined;\n public?: boolean | undefined;\n includeCiPermissions?: boolean | undefined;\n};\n\nexport type CreateGitHubAppManifestResponse = {\n /** GitHub URL to POST the manifest to (personal or organization flow). */\n actionUrl: string;\n state: string;\n manifest: Record<string, unknown>;\n};\n\n// --- Billing --------------------------------------------------------------------\n\nexport type BillingMode = \"disabled\" | \"stripe\";\n\nexport type EntitlementsMode = \"none\" | \"static\" | \"managed\";\n\nexport type BillingBalance = {\n accountId: string;\n balanceMicros: number;\n currency: \"usd\";\n updatedAt: string;\n};\n\nexport const KNOWN_USAGE_EVENT_TYPES = [\n \"agent_run.created\",\n \"agent_run.completed\",\n \"model.tokens\",\n \"model.cost\",\n \"file.uploaded\",\n \"file.deleted\",\n \"document.indexed\",\n \"scheduled_task.fired\",\n \"api_key.request\",\n // sandbox warm-time metering (P2.1) — mirrors contracts UsageEventType.\n \"sandbox.warm_seconds\",\n \"sandbox.warm_cost\",\n] as const;\n\nexport type KnownUsageEventType = (typeof KNOWN_USAGE_EVENT_TYPES)[number];\n\nexport type UsageEventType = KnownUsageEventType | (string & {});\n\nexport type UsageEvent = {\n id: string;\n workspaceId: string;\n accountId: string;\n subjectId: string | null;\n eventType: UsageEventType;\n quantity: number;\n unit: string;\n sourceResourceType: string | null;\n sourceResourceId: string | null;\n idempotencyKey: string;\n occurredAt: string;\n recordedAt: string;\n exportedToBillingAt: string | null;\n billingProviderEventId: string | null;\n};\n\nexport type EntitlementValue = boolean | string | number | string[];\n\nexport type Entitlements = Record<string, EntitlementValue>;\n\nexport type BillingSummary = {\n mode: BillingMode;\n balance: BillingBalance;\n};\n\nexport type BillingUsageResponse = {\n balance: BillingBalance;\n usage: UsageEvent[];\n};\n\nexport type InsightsRange = \"today\" | \"week\" | \"month\" | \"ytd\";\n\nexport type InsightsBillingPath = \"opengeni_credits\" | \"external\";\n\nexport type InsightsModelUsageRow = {\n id: string;\n model: string;\n provider: string;\n billing: InsightsBillingPath;\n calls: number;\n inputTokens: number;\n outputTokens: number;\n cachedTokens: number;\n cacheWriteTokens: number;\n reasoningTokens: number;\n creditUsd: number;\n};\n\nexport type InsightsSeriesPoint = {\n label: string;\n modelCostUsd: number;\n warmSeconds: number;\n inputTokens: number;\n cachedTokens: number;\n cacheHitPct: number;\n calls: number;\n};\n\nexport type InsightsDepthBucket = {\n depth: number;\n sessions: number;\n};\n\nexport type InsightsModelFacet = {\n provider: string;\n model: string;\n};\n\nexport type InsightsSpendDriver = {\n id: string;\n groupBy: \"root_session\" | \"schedule\";\n label: string;\n creditUsd: number;\n tokens: number;\n cacheHitPct: number;\n pctOfCreditUsd: number;\n deltaUsdVsPrior: number;\n};\n\nexport type InsightsWarmGroupRow = {\n id: string;\n groupId: string;\n label: string;\n backend: string | null;\n warmSeconds: number;\n sessionsAttached: number;\n};\n\nexport type InsightsLiveWarmLease = {\n id: string;\n groupId: string;\n backend: string;\n turnHolders: number;\n viewerHolders: number;\n warmForLabel: string;\n warmSeconds: number;\n};\n\nexport type InsightsFloorSession = {\n id: string;\n title: string;\n state: \"running\" | \"paused\" | \"failed\" | \"idle\" | \"compacting\" | \"waiting\";\n depth: number;\n model: string | null;\n provider: string | null;\n ageLabel: string;\n cacheHitPct: number | null;\n route: string | null;\n};\n\nexport type InsightsScheduleRow = {\n id: string;\n name: string;\n fires: number;\n creditUsd: number | null;\n tokens: number | null;\n cacheHitPct: number | null;\n billing: InsightsBillingPath | null;\n};\n\nexport type WorkspaceInsightsSnapshot = {\n range: InsightsRange;\n rangeLabel: string;\n priorLabel: string;\n seriesLabel: string;\n cacheSeriesLabel: string;\n timezone: \"UTC\";\n models: InsightsModelUsageRow[];\n facets: InsightsModelFacet[];\n series: InsightsSeriesPoint[];\n depth: InsightsDepthBucket[];\n drivers: InsightsSpendDriver[];\n schedules: InsightsScheduleRow[];\n warmSeconds: number;\n priorWarmSeconds: number;\n warmGroups: InsightsWarmGroupRow[];\n liveWarm: InsightsLiveWarmLease[];\n floor: InsightsFloorSession[];\n selfhostedEnabled: boolean;\n machinesOnline: number;\n workspaceCreditUsd: number;\n priorWorkspaceCreditUsd: number;\n creditUsd: number;\n priorCreditUsd: number;\n priorInputTokens: number;\n priorCacheHitPct: number;\n priorCalls: number;\n goalsActive: number;\n goalsCompleted: number;\n sessionsTouched: number;\n rootSessions: number;\n deepestDepth: number;\n deepestSessionTitle: string;\n avgDepth: number;\n warmIdleNow: number;\n billableTokensUsed: number;\n billableTokenCap: number | null;\n agentRunsUsed: number;\n agentRunCap: number | null;\n modelFilterActive: boolean;\n};\n\nexport type WorkspaceInsightsResponse = {\n snapshot: WorkspaceInsightsSnapshot;\n};\n\nexport type BillingEntitlementsResponse = {\n accountId: string;\n mode: EntitlementsMode;\n entitlements: Entitlements;\n};\n\nexport type CreateCheckoutRequest = {\n accountId?: string | undefined;\n /** USD amount with cent precision (server enforces min/max). */\n amountUsd: number;\n successUrl?: string | undefined;\n cancelUrl?: string | undefined;\n};\n\nexport type CreateCheckoutResponse = {\n checkoutSessionId: string;\n url: string;\n};\n\nexport type UserMessageEventInput = {\n type: \"user.message\";\n clientEventId?: string | undefined;\n payload: {\n text: string;\n turnInstructions?: string | undefined;\n resources?: ResourceRef[] | undefined;\n model?: string | undefined;\n reasoningEffort?: ReasoningEffort | undefined;\n latencyMode?: LatencyMode | undefined;\n mcpCredentialUpdates?: SessionMcpCredentialUpdateInput[] | undefined;\n };\n};\n\nexport type UserApprovalDecisionEventInput = {\n type: \"user.approvalDecision\";\n clientEventId?: string | undefined;\n payload: {\n approvalId: string;\n decision: \"approve\" | \"reject\";\n message?: string | undefined;\n };\n};\n\nexport type UserHumanInputResponseEventInput = {\n type: \"user.humanInputResponse\";\n clientEventId?: string | undefined;\n payload: {\n requestId: string;\n response: SubmitHumanInputResponseRequest;\n };\n};\n\n/** Control/user events a client may POST to a session's event log. */\nexport type ClientSessionEventInput =\n | UserMessageEventInput\n | UserApprovalDecisionEventInput\n | UserHumanInputResponseEventInput;\n\n// ── Bring-your-own-compute: Machines dashboard + per-machine metrics (M10) ────\n// Hand-written mirrors of the `@opengeni/contracts` MetricSample / MachineView /\n// MachinesResponse / MachineMetricsSeriesResponse (pinned by contract-parity).\n// M9 imports THESE so the dashboard UI never drifts from the API.\n\n/** A point-in-time machine metrics sample. `gpuUtilPct`/`gpuMemBytes` are null\n * when no GPU was present (not-reported, never a real zero); the bytes/load are\n * numbers; `sampledAt` is an ISO-8601 instant. */\nexport type MetricSample = {\n cpuPct: number;\n load1: number;\n load5: number;\n load15: number;\n memUsedBytes: number;\n memTotalBytes: number;\n diskUsedBytes: number;\n diskTotalBytes: number;\n gpuUtilPct: number | null;\n gpuMemBytes: number | null;\n runQueue: number;\n sampledAt: string;\n};\n\n/** The derived dashboard state of a machine (M3 liveness + consent/display\n * reasons + the in-flight device-flow). */\nexport type MachineState =\n | \"online\"\n | \"reconnecting\"\n | \"offline\"\n | \"consent_required\"\n | \"display_unavailable\"\n | \"enrolling\";\n\nexport type MachineKind = \"modal\" | \"selfhosted\";\n\n/** A machine as the Machines dashboard renders it (an enrolled selfhosted machine\n * or the session's synthetic Modal group box, `isSessionGroup: true`). */\nexport type MachineView = {\n sandboxId: string;\n enrollmentId: string | null;\n name: string;\n kind: MachineKind;\n state: MachineState;\n active: boolean;\n isSessionGroup: boolean;\n workspaceGeneration: number | null;\n archiveGeneration: number | null;\n archiveComplete: boolean;\n os: string;\n arch: string;\n hasDisplay: boolean;\n /** Non-null only when a display exists but capture is blocked (macOS Screen\n * Recording / TCC not granted) — the UI can surface \"display: capture not\n * granted\". null == capture permitted OR headless. */\n desktopUnavailableReason?: string | null | undefined;\n allowScreenControl: boolean;\n sharedSessionCount: number;\n lastSeenAt: string | null;\n metrics: MetricSample | null;\n};\n\n/** GET /v1/workspaces/:ws/machines — the dashboard list + the active-sandbox\n * pointer (null activeSandboxId == the session's own group box is active). */\nexport type MachinesResponse = {\n activeSandboxId: string | null;\n activeEpoch: number;\n machines: MachineView[];\n};\n\n/** GET /v1/workspaces/:ws/machines/:enrollmentId/metrics/series — the downsampled\n * (~1/min) history the dashboard time-range reads. */\nexport type MachineMetricsSeriesResponse = {\n samples: MetricSample[];\n};\n\n/** POST /v1/workspaces/:ws/sessions/:sessionId/active-sandbox — swap a session's\n * active sandbox. `target` is a `MachineView.sandboxId`, or \"session\"/\"default\"\n * to swap back to the session's own group box. */\nexport type SwapActiveSandboxRequest = {\n target: string;\n};\n\n/** The swap outcome (mirrors the server `FleetSwapResult`). `swapped` is true on a\n * successful repoint OR a no-op (already there); `reason` carries the failure\n * detail (unowned/offline target, or a lost epoch fence) when false. */\nexport type SwapActiveSandboxResponse = {\n swapped: boolean;\n activeSandboxId: string | null;\n activeEpoch: number;\n reason?: string;\n // Typed rejection discriminant (issue #341); present only when swapped is false.\n // Mirror of the `@opengeni/contracts` SwapActiveSandboxResponse.code enum.\n code?:\n | \"stale_pointer\"\n | \"offline_enrollment\"\n | \"unsupported_backend_context\"\n | \"transient_establishment\"\n | \"concurrent_swap\"\n | \"recovery_in_progress\"\n | \"recovery_degraded\"\n | \"recovery_unrecoverable\";\n};\n\n// ── Self-hosted enrollment UX (design 11) ────────────────────────────────────\n// Hand-written mirrors of the `@opengeni/contracts` enrollment-UX request/response\n// shapes (the SDK keeps zero runtime deps). The click-Grant approve-page\n// lookup/deny + the headless enroll-token mint/exchange.\n\n/** Mirror of `@opengeni/contracts` EnrollmentOs. */\nexport type EnrollmentOs = \"linux\" | \"macos\" | \"windows\";\n\n/** POST /v1/enrollments/device/lookup body. */\nexport type DeviceEnrollmentLookupRequest = {\n userCode: string;\n};\n\n/** The presentational machine details the consent screen renders. */\nexport type DeviceEnrollmentLookupMachine = {\n machineName: string | null;\n os: EnrollmentOs;\n arch: string;\n canOfferDisplay: boolean;\n requestsScreenControl: boolean;\n};\n\n/** POST /v1/enrollments/device/lookup response (no secrets, no device_code). */\nexport type DeviceEnrollmentLookupResponse = {\n workspaceId: string;\n userCode: string;\n machine: DeviceEnrollmentLookupMachine;\n expiresAt: string;\n};\n\n/** POST /v1/workspaces/:ws/enrollments/device/approve body. */\nexport type DeviceEnrollmentApproveRequest = {\n userCode: string;\n allowScreenControl?: boolean;\n};\n\n/** POST /v1/workspaces/:ws/enrollments/device/approve response. */\nexport type DeviceEnrollmentApproveResponse = {\n approved: boolean;\n enrollmentId: string;\n sandboxId: string;\n allowScreenControl: boolean;\n};\n\n/** POST /v1/workspaces/:ws/enrollments/device/deny body. */\nexport type DeviceEnrollmentDenyRequest = {\n userCode: string;\n};\n\n/** POST /v1/workspaces/:ws/enrollments/device/deny response. */\nexport type DeviceEnrollmentDenyResponse = {\n denied: boolean;\n};\n\n/** POST /v1/workspaces/:ws/enrollments/token body. */\nexport type MintEnrollTokenRequest = {\n allowScreenControl?: boolean;\n};\n\n/** POST /v1/workspaces/:ws/enrollments/token response. The `token` is SECRET. */\nexport type MintEnrollTokenResponse = {\n token: string;\n expiresAt: string;\n expiresInSeconds: number;\n};\n\n/** The credential payload the headless exchange returns (a subset of the agent's\n * EnrollmentCredentials — IDENTICAL to the device-flow poll authorized branch). */\nexport type EnrollmentCredentials = {\n agentId: string;\n workspaceId: string;\n bearer: string;\n subjectPrefix: string;\n natsUrls: string[];\n relayUrl: string;\n relayToken: string;\n natsAccountCreds: string;\n updatePublicKey: string;\n consentedWholeMachine: boolean;\n consentedScreenControl: boolean;\n};\n\n/** POST /v1/enrollments/token/exchange body (the headless / fleet enroll path). */\nexport type EnrollTokenExchangeRequest = {\n token: string;\n publicKey: string;\n os?: EnrollmentOs;\n arch?: string;\n machineName?: string;\n exposure?: \"whole-machine\";\n canOfferDisplay?: boolean;\n requestsScreenControl?: boolean;\n};\n\n/** POST /v1/enrollments/token/exchange response (wraps the credential shape). */\nexport type EnrollTokenExchangeResponse = {\n credentials: EnrollmentCredentials;\n};\n","import {\n OpenGeniApiContractMismatchError,\n OpenGeniApiError,\n OpenGeniSessionListCursorError,\n} from \"./errors\";\nimport {\n streamSessionEvents,\n type SessionEventStreamTransport,\n type StreamSessionEventsOptions,\n} from \"./stream\";\nimport {\n streamWorkspaceControlEvents,\n type WorkspaceControlStreamTransport,\n} from \"./workspace-control-stream\";\nimport type {\n AccessContext,\n ActivateCodexRealtimeConnectionRequest,\n AddWorkspaceMemberRequest,\n ApiKey,\n BillingEntitlementsResponse,\n CodexAccount,\n CodexAccountsResponse,\n CodexAppsUpdate,\n CodexRotationSettings,\n CodexOverviewResponse,\n CodexAllocatorUpdate,\n CodexConnectionStatus,\n CodexRealtimeWebrtcRequest,\n CodexRealtimeWebrtcResponse,\n GatewayRealtimeConnectRequest,\n GatewayRealtimeConnectResponse,\n CodexConnectPoll,\n CodexConnectStart,\n CodexUsage,\n CodexUsageMap,\n BillingSummary,\n BillingUsageResponse,\n InsightsRange,\n WorkspaceInsightsResponse,\n BeginSessionRealtimeRequest,\n CapabilityCatalogItem,\n CapabilityCatalogResponse,\n CapabilityInstallation,\n AddDocumentRequest,\n CreateKnowledgeDropRequest,\n MoveDocumentRequest,\n ClientConfig,\n WorkspaceModelCatalogResponse,\n WorkspaceRealtimeModelCatalogResponse,\n ClientSessionEventInput,\n CompactSessionContextResult,\n CompleteFileUploadResponse,\n ConnectionMetadata,\n CreateApiKeyRequest,\n CreateApiKeyResponse,\n CreateCapabilityCatalogItemRequest,\n CreateCheckoutRequest,\n CreateCheckoutResponse,\n OpenGeniSlackBotInstallRequest,\n OpenGeniSlackBotInstallStart,\n SlackReactionChannelListResponse,\n CreateConnectionRequest,\n CreateDocumentBaseRequest,\n CreateFileUploadRequest,\n CreateFileUploadResponse,\n CreateGitHubAppManifestRequest,\n CreateGitHubAppManifestResponse,\n CreateKnowledgeMemoryRequest,\n CreateScheduledTaskRequest,\n CreateSessionRequest,\n CreateSessionResponse,\n CreateVariableSetRequest,\n CreateRigRequest,\n CreateWorkspaceRequest,\n // Enrollment UX (design 11): the click-Grant approve-page lookup/deny + headless\n // enroll-token mint.\n DeviceEnrollmentApproveResponse,\n DeviceEnrollmentDenyResponse,\n DeviceEnrollmentLookupResponse,\n MintEnrollTokenResponse,\n EndSessionRealtimeRequest,\n DiscoverMcpCapabilitiesResponse,\n Document,\n DocumentBase,\n DocumentSearchRequest,\n DocumentSearchResponse,\n EnableCapabilityRequest,\n EnablePackRequest,\n FileAsset,\n FileDownloadUrlResponse,\n GetPackResponse,\n GitHubAppInfo,\n GitHubRepositoriesResponse,\n GoogleDriveDisconnectRequest,\n GoogleDriveLifecycleActionRequest,\n KnowledgeMemory,\n KnowledgeMemorySearchRequest,\n ListApiKeysResponse,\n ListPacksResponse,\n // Bring-your-own-compute: the Machines dashboard + per-machine metrics (M10).\n MachinesResponse,\n MetricSample,\n MachineMetricsSeriesResponse,\n // Bring-your-own-compute: the user-authenticated active-sandbox swap (M7).\n SwapActiveSandboxRequest,\n SwapActiveSandboxResponse,\n ListWorkspaceMembersResponse,\n PackInstallation,\n LatencyMode,\n ReasoningEffort,\n RetainedArtifactContent,\n RetainedArtifactContentOptions,\n RetainedArtifactMetadata,\n RegisterCapabilityPackRequest,\n ResourceRef,\n ScheduledTask,\n ScheduledTaskRun,\n Session,\n SessionListResponse,\n UpdateSessionPinRequest,\n SessionEvent,\n SessionEventCompactResult,\n SessionEventCompactResultOptions,\n SessionEventListOptions,\n SessionEventPage,\n SessionGoal,\n SessionHumanInputRequest,\n SessionLineageResponse,\n SessionRealtimeMutationResponse,\n SyncSessionRealtimeLedgerRequest,\n SyncSessionRealtimeLedgerResponse,\n RenewSessionRealtimeRequest,\n SessionMcpCredentialUpdateInput,\n UpdateSessionMcpApprovalPolicyRequest,\n UpdateSessionMcpApprovalPolicyResponse,\n SessionQueueSnapshot,\n SessionQueueMutationResponse,\n ComposerDraft,\n DeleteSessionQueueItemRequest,\n EditSessionQueueItemRequest,\n MoveSessionQueueItemRequest,\n NewSessionDraft,\n SaveComposerDraftRequest,\n SaveNewSessionDraftRequest,\n SteerSessionQueueItemRequest,\n SessionControlResponse,\n WorkspaceInferenceControlResponse,\n WorkspaceControlEvent,\n SessionTurn,\n SubmitHumanInputResponseRequest,\n // Stream surfacing (Phase 5): capability negotiation + viewer lifecycle + config.\n SessionCapabilities,\n AttachViewerRequest,\n AttachViewerResponse,\n AcknowledgeStreamRequest,\n AcknowledgeStreamResponse,\n ViewerHeartbeatRequest,\n ViewerHeartbeatResponse,\n // Channel-A structured services (P4.4).\n FsListRequest,\n FsListResponse,\n FsReadRequest,\n FsReadResponse,\n FsWriteRequest,\n FsWriteResponse,\n FsDeleteRequest,\n FsDeleteResponse,\n FsMoveRequest,\n FsMoveResponse,\n FsMkdirRequest,\n FsMkdirResponse,\n GitStatusRequest,\n GitStatusResponse,\n GitDiffRequest,\n GitDiffResponse,\n GitLogRequest,\n GitLogResponse,\n GitShowRequest,\n GitShowResponse,\n // Workbench v2 turn-end capture reads (M2).\n GetWorkspaceCaptureResponse,\n GetWorkspaceCaptureFileResponse,\n TerminalExecRequest,\n TerminalExecResponse,\n PtyOpenRequest,\n PtyOpenResponse,\n PtyWriteRequest,\n PtyResizeRequest,\n PtyCloseRequest,\n ToolRef,\n TranscribeAudioResponse,\n TranscriptionRecordingListResponse,\n TranscriptionRecordingResponse,\n UploadTranscriptionRecordingChunkResponse,\n UpdateConnectionRequest,\n UpdateKnowledgeMemoryRequest,\n UpdateScheduledTaskRequest,\n UpdateSessionGoalRequest,\n UpdateSessionRequest,\n UpdateSessionToolPolicyRequest,\n UpdateVariableSetRequest,\n UpdateRigRequest,\n UpdateWorkspaceMemberRequest,\n UpdateWorkspaceRequest,\n UpdateWorkspaceSettingsRequest,\n SetWorkspaceDefaultRigRequest,\n UploadFileInput,\n VariableSet,\n VariableSetVariableMetadata,\n Rig,\n RigVersion,\n RigChange,\n ProposeRigChangeRequest,\n WorkspaceMember,\n WorkspaceMemorySearchRequest,\n WorkspaceMemorySearchResponse,\n WorkspaceRegisteredPack,\n Workspace,\n ListConnectionsResponse,\n ConnectionResponse,\n OAuthStartRequest,\n OAuthStartResponse,\n SocialConnection,\n SocialOAuthStartRequest,\n} from \"./types\";\nimport type {\n ActivateWorkspaceInstructionPolicyRequest,\n CreateWorkspaceInstructionPolicyDraftRequest,\n CreateWorkspaceInstructionPolicyOnboardingProposalRequest,\n ImportLegacyWorkspaceInstructionPolicyDraftRequest,\n RollbackWorkspaceInstructionPolicyRequest,\n WorkspaceInstructionPolicyActivationResponse,\n WorkspaceInstructionPolicyDiffRequest,\n WorkspaceInstructionPolicyDiffResponse,\n WorkspaceInstructionPolicyListOptions,\n WorkspaceInstructionPolicyListResponse,\n WorkspaceInstructionPolicyOnboardingProposal,\n WorkspaceInstructionPolicyOnboardingProposalListOptions,\n WorkspaceInstructionPolicyOnboardingProposalListResponse,\n WorkspaceInstructionPolicyRevision,\n} from \"./workspace-instruction-policies\";\nimport type {\n WorkspaceStateExportResponse,\n WorkspaceStateGetOptions,\n WorkspaceStateResponse,\n} from \"./workspace-state\";\nimport type {\n ActivatePreferenceRegistryRevisionRequest,\n ChangePreferenceRegistryScopeRequest,\n CorrectPreferenceRegistryRequest,\n CreatePreferenceRegistryProposalRequest,\n DeactivatePreferenceRegistryRequest,\n PreferenceRegistryDetailResponse,\n PreferenceRegistryFullContent,\n PreferenceRegistryListOptions,\n PreferenceRegistryListResponse,\n PreferenceRegistryMutationResponse,\n PreferenceRegistryRecord,\n PreferenceRegistrySnapshot,\n RejectPreferenceRegistryProposalRequest,\n SupersedePreferenceRegistryRequest,\n} from \"./preference-registry\";\nimport {\n OPENGENI_API_CONTRACT_HEADER,\n OPENGENI_API_CONTRACT_REVISION,\n OPENGENI_CORRELATION_HEADER,\n RETAINED_OUTPUT_MAX_PAGE_BYTES,\n} from \"./types\";\n\nfunction sessionListQuery(options: {\n limit?: number;\n parentSessionId?: string | null;\n}): Record<string, string> {\n const { limit, parentSessionId } = options;\n return {\n ...(limit === undefined ? {} : { limit: String(limit) }),\n ...(parentSessionId === undefined ? {} : { parentSessionId: parentSessionId ?? \"null\" }),\n };\n}\n\nexport type FetchLike = (input: string | URL | Request, init?: RequestInit) => Promise<Response>;\n\nexport type WorkspaceControlEventPage = {\n events: WorkspaceControlEvent[];\n bytes: number;\n truncated: boolean;\n nextAfter: number | null;\n};\n\nexport type OpenGeniClientOptions = {\n /** Base URL of the OpenGeni API, e.g. `https://api.example.com`. */\n baseUrl: string;\n /** OpenGeni API key, sent as `Authorization: Bearer <apiKey>`. */\n apiKey?: string;\n /** Extra headers (static or computed per request) merged into every call. */\n headers?: Record<string, string> | (() => Record<string, string>);\n /** Custom fetch implementation. Defaults to the global `fetch`. */\n fetch?: FetchLike;\n};\n\n/** Per-request cancellation for operations whose caller owns an AbortSignal. */\nexport type OpenGeniRequestOptions = {\n signal?: AbortSignal | undefined;\n};\n\nexport type SendMessageInput = {\n text: string;\n /** System instructions scoped to this exact turn; never visible timeline text. */\n turnInstructions?: string;\n resources?: ResourceRef[];\n tools?: ToolRef[];\n model?: string;\n reasoningEffort?: ReasoningEffort;\n latencyMode?: LatencyMode;\n clientEventId?: string;\n controlEtag?: string;\n expectedDraftRevision?: number;\n mcpCredentialUpdates?: SessionMcpCredentialUpdateInput[];\n};\n\nexport type SteerMessageResult = {\n /** The accepted `user.message` event. */\n accepted: SessionEvent;\n /** The exact turn created for this message in the same server transaction. */\n turn: SessionTurn;\n};\n\nexport type TranscribeAudioInput = {\n audio: Blob | File | Uint8Array;\n mimeType: string;\n durationSeconds?: number | undefined;\n signal?: AbortSignal | undefined;\n};\n\nexport type CreateTranscriptionRecordingInput = {\n recordingId: string;\n mimeType: string;\n signal?: AbortSignal | undefined;\n};\n\nexport type UploadTranscriptionRecordingChunkInput = {\n audio: Blob | File | Uint8Array;\n mimeType: string;\n sha256: string;\n startMilliseconds: number;\n durationMilliseconds: number;\n signal?: AbortSignal | undefined;\n};\n\nexport type FinalizeTranscriptionRecordingInput = {\n chunkCount: number;\n totalBytes: number;\n totalDurationMilliseconds: number;\n signal?: AbortSignal | undefined;\n};\n\n/**\n * Typed client for the OpenGeni public API. Framework-agnostic: only needs\n * WHATWG `fetch` + streams, so it runs in Node 18+, Bun, Deno, browsers, and\n * edge runtimes.\n */\nexport class OpenGeniClient {\n private readonly baseUrl: string;\n private readonly options: OpenGeniClientOptions;\n private readonly fetchImpl: FetchLike;\n\n constructor(options: OpenGeniClientOptions) {\n this.baseUrl = options.baseUrl.replace(/\\/+$/, \"\");\n this.options = options;\n // Bind lazily so variable sets that polyfill fetch after module load work.\n this.fetchImpl = options.fetch ?? ((input, init) => fetch(input, init));\n }\n\n // --- Session lifecycle ---------------------------------------------------\n\n /** Make one finalization attempt for a recording; callers may retry retained audio. */\n async transcribeAudio(\n workspaceId: string,\n input: TranscribeAudioInput,\n ): Promise<TranscribeAudioResponse> {\n const correlationId = crypto.randomUUID();\n const form = new FormData();\n const filename = filenameForAudioMimeType(input.mimeType);\n const audio =\n input.audio instanceof File\n ? input.audio\n : input.audio instanceof Uint8Array\n ? new File([Uint8Array.from(input.audio)], filename, { type: input.mimeType })\n : new File([input.audio], filename, { type: input.mimeType || input.audio.type });\n form.append(\"audio\", audio, filename);\n form.append(\"mimeType\", input.mimeType);\n if (input.durationSeconds !== undefined) {\n form.append(\"durationSeconds\", String(input.durationSeconds));\n }\n let response: Response;\n try {\n response = await this.fetchImpl(this.url(`/v1/workspaces/${workspaceId}/transcriptions`), {\n method: \"POST\",\n headers: { ...this.headers(correlationId), Accept: \"application/json\" },\n body: form,\n ...(input.signal ? { signal: input.signal } : {}),\n });\n } catch (error) {\n if (input.signal?.aborted) throw error;\n throw mutationTransportError(correlationId);\n }\n assertApiContractResponse(response);\n if (!response.ok) throw await apiErrorFromResponse(response, { method: \"POST\", correlationId });\n await assertJsonResponse(response, { method: \"POST\", correlationId });\n let body: unknown;\n try {\n body = await response.json();\n } catch {\n throw new OpenGeniApiError(response.status, \"Invalid transcription response.\", {\n code: \"invalid_response\",\n mutation: true,\n correlationId,\n });\n }\n if (!isTranscribeAudioResponse(body)) {\n throw new OpenGeniApiError(response.status, \"Invalid transcription response.\", {\n code: \"invalid_response\",\n mutation: true,\n correlationId,\n });\n }\n return body;\n }\n\n async createTranscriptionRecording(\n workspaceId: string,\n input: CreateTranscriptionRecordingInput,\n ): Promise<TranscriptionRecordingResponse> {\n return transcriptionRecordingResponse(\n await this.requestJson<unknown>(\n \"POST\",\n `/v1/workspaces/${workspaceId}/transcription-recordings`,\n { recordingId: input.recordingId, mimeType: input.mimeType },\n {},\n input.signal ? { signal: input.signal } : {},\n ),\n );\n }\n\n async getTranscriptionRecording(\n workspaceId: string,\n recordingId: string,\n options: { signal?: AbortSignal | undefined } = {},\n ): Promise<TranscriptionRecordingResponse> {\n return transcriptionRecordingResponse(\n await this.requestJson<unknown>(\n \"GET\",\n `/v1/workspaces/${workspaceId}/transcription-recordings/${recordingId}`,\n undefined,\n {},\n options.signal ? { signal: options.signal } : {},\n ),\n );\n }\n\n async listTranscriptionRecordings(\n workspaceId: string,\n options: { signal?: AbortSignal | undefined } = {},\n ): Promise<TranscriptionRecordingListResponse> {\n const body = await this.requestJson<unknown>(\n \"GET\",\n `/v1/workspaces/${workspaceId}/transcription-recordings`,\n undefined,\n {},\n options.signal ? { signal: options.signal } : {},\n );\n if (!isTranscriptionRecordingListResponse(body)) {\n throw new OpenGeniApiError(502, \"Invalid transcription recording list response.\", {\n code: \"invalid_response\",\n });\n }\n return body;\n }\n\n async uploadTranscriptionRecordingChunk(\n workspaceId: string,\n recordingId: string,\n chunkNumber: number,\n input: UploadTranscriptionRecordingChunkInput,\n ): Promise<UploadTranscriptionRecordingChunkResponse> {\n const correlationId = crypto.randomUUID();\n let response: Response;\n try {\n response = await this.fetchImpl(\n this.url(\n `/v1/workspaces/${workspaceId}/transcription-recordings/${recordingId}/chunks/${chunkNumber}`,\n ),\n {\n method: \"PUT\",\n headers: {\n ...this.headers(correlationId),\n Accept: \"application/json\",\n \"Content-Type\": input.mimeType,\n \"x-opengeni-chunk-sha256\": input.sha256,\n \"x-opengeni-chunk-start-milliseconds\": String(input.startMilliseconds),\n \"x-opengeni-chunk-duration-milliseconds\": String(input.durationMilliseconds),\n },\n body: input.audio instanceof Uint8Array ? Uint8Array.from(input.audio) : input.audio,\n ...(input.signal ? { signal: input.signal } : {}),\n },\n );\n } catch (error) {\n if (input.signal?.aborted) throw error;\n throw mutationTransportError(correlationId);\n }\n assertApiContractResponse(response);\n if (!response.ok) throw await apiErrorFromResponse(response, { method: \"PUT\", correlationId });\n await assertJsonResponse(response, { method: \"PUT\", correlationId });\n const body = await response.json().catch(() => null);\n if (!isUploadTranscriptionRecordingChunkResponse(body)) {\n throw new OpenGeniApiError(response.status, \"Invalid transcription chunk response.\", {\n code: \"invalid_response\",\n mutation: true,\n correlationId,\n });\n }\n return body;\n }\n\n async finalizeTranscriptionRecording(\n workspaceId: string,\n recordingId: string,\n input: FinalizeTranscriptionRecordingInput,\n ): Promise<TranscriptionRecordingResponse> {\n return transcriptionRecordingResponse(\n await this.requestJson<unknown>(\n \"POST\",\n `/v1/workspaces/${workspaceId}/transcription-recordings/${recordingId}/finalize`,\n {\n chunkCount: input.chunkCount,\n totalBytes: input.totalBytes,\n totalDurationMilliseconds: input.totalDurationMilliseconds,\n },\n {},\n input.signal ? { signal: input.signal } : {},\n ),\n );\n }\n\n async processNextTranscriptionRecordingSegment(\n workspaceId: string,\n recordingId: string,\n options: { signal?: AbortSignal | undefined } = {},\n ): Promise<TranscriptionRecordingResponse> {\n return transcriptionRecordingResponse(\n await this.requestJson<unknown>(\n \"POST\",\n `/v1/workspaces/${workspaceId}/transcription-recordings/${recordingId}/process-next`,\n {},\n {},\n options.signal ? { signal: options.signal } : {},\n ),\n );\n }\n\n async discardTranscriptionRecording(\n workspaceId: string,\n recordingId: string,\n options: { signal?: AbortSignal | undefined } = {},\n ): Promise<TranscriptionRecordingResponse> {\n return transcriptionRecordingResponse(\n await this.requestJson<unknown>(\n \"DELETE\",\n `/v1/workspaces/${workspaceId}/transcription-recordings/${recordingId}`,\n undefined,\n {},\n options.signal ? { signal: options.signal } : {},\n ),\n );\n }\n\n async createSession(\n workspaceId: string,\n request: CreateSessionRequest,\n ): Promise<CreateSessionResponse> {\n return await this.requestJson<CreateSessionResponse>(\n \"POST\",\n `/v1/workspaces/${workspaceId}/sessions`,\n request,\n );\n }\n\n async getNewSessionDraft(workspaceId: string): Promise<NewSessionDraft> {\n return await this.requestJson<NewSessionDraft>(\n \"GET\",\n `/v1/workspaces/${workspaceId}/new-session-draft`,\n );\n }\n\n async saveNewSessionDraft(\n workspaceId: string,\n request: SaveNewSessionDraftRequest,\n ): Promise<NewSessionDraft> {\n return await this.requestJson<NewSessionDraft>(\n \"PUT\",\n `/v1/workspaces/${workspaceId}/new-session-draft`,\n request,\n );\n }\n\n async getSession(workspaceId: string, sessionId: string): Promise<Session> {\n return await this.requestJson<Session>(\n \"GET\",\n `/v1/workspaces/${workspaceId}/sessions/${sessionId}`,\n );\n }\n\n async updateSession(\n workspaceId: string,\n sessionId: string,\n request: UpdateSessionRequest,\n ): Promise<Session> {\n return await this.requestJson<Session>(\n \"PATCH\",\n `/v1/workspaces/${workspaceId}/sessions/${sessionId}`,\n request,\n );\n }\n\n /** Replace the durable tool policy or explicitly adopt workspace defaults. */\n async updateSessionToolPolicy(\n workspaceId: string,\n sessionId: string,\n request: UpdateSessionToolPolicyRequest,\n ): Promise<Session> {\n return await this.requestJson<Session>(\n \"PUT\",\n `/v1/workspaces/${workspaceId}/sessions/${sessionId}/tool-policy`,\n request,\n );\n }\n\n /**\n * Replace one attached MCP server's approval policy. The change is captured\n * by the next claimed attempt; already-claimed work keeps its immutable\n * policy snapshot.\n */\n async updateSessionMcpApprovalPolicy(\n workspaceId: string,\n sessionId: string,\n serverId: string,\n request: UpdateSessionMcpApprovalPolicyRequest,\n ): Promise<UpdateSessionMcpApprovalPolicyResponse> {\n return await this.requestJson<UpdateSessionMcpApprovalPolicyResponse>(\n \"PATCH\",\n `/v1/workspaces/${workspaceId}/sessions/${sessionId}/mcp-servers/${encodeURIComponent(serverId)}/approval-policy`,\n request,\n );\n }\n\n async listSessions(\n workspaceId: string,\n options: {\n limit?: number;\n parentSessionId?: string | null;\n search?: string;\n } = {},\n ): Promise<Session[]> {\n // Search was added with the pin-aware page endpoint. An older API silently\n // ignores unknown query parameters on the historical array endpoint, which\n // would turn a search into a plausible-looking unfiltered result. Route\n // searches through listSessionPage so its rolling-version shape check can\n // fail explicitly on an older server; retain the array endpoint for every\n // pre-existing call shape.\n if (options.search?.trim()) {\n const page = await this.listSessionPage(workspaceId, options);\n return [...page.pinned, ...page.sessions];\n }\n return await this.requestJson<Session[]>(\n \"GET\",\n `/v1/workspaces/${workspaceId}/sessions`,\n undefined,\n sessionListQuery(options),\n );\n }\n\n /** Pin-aware ordinary-session page with a stable keyset cursor. */\n async listSessionPage(\n workspaceId: string,\n options: {\n limit?: number;\n parentSessionId?: string | null;\n cursor?: string;\n search?: string;\n /** Return only the complete personal pinned projection. */\n pinsOnly?: boolean;\n } = {},\n ): Promise<SessionListResponse> {\n const search = options.search?.trim();\n let response: SessionListResponse | Session[];\n try {\n response = await this.requestJson<SessionListResponse | Session[]>(\n \"GET\",\n `/v1/workspaces/${workspaceId}/sessions`,\n undefined,\n {\n view: \"page\",\n ...sessionListQuery(options),\n ...(options.cursor !== undefined ? { cursor: options.cursor } : {}),\n ...(search ? { search } : {}),\n ...(options.pinsOnly ? { pinsOnly: \"true\" } : {}),\n },\n );\n } catch (error) {\n if (error instanceof OpenGeniApiError && error.status === 410) {\n throw new OpenGeniSessionListCursorError(error.status, error.body, {\n ...(error.code ? { code: error.code } : {}),\n retryable: error.retryable,\n ...(error.correlationId ? { correlationId: error.correlationId } : {}),\n outcomeUnknown: error.outcomeUnknown,\n displayMessage: \"The session list changed — refresh and try again.\",\n });\n }\n throw error;\n }\n if (Array.isArray(response)) {\n // Rolling/same-major compatibility: an older API ignores `view=page` and\n // returns the historical array. That is an honest one-page projection;\n // never pretend it honored a cursor supplied directly by a caller.\n if (options.cursor) {\n throw new Error(\"The connected OpenGeni API does not support stable session-page cursors\");\n }\n // Older APIs ignore unknown query parameters. Treating their unfiltered\n // array as a successful search would be worse than an explicit rolling-\n // upgrade error (and client-side filtering cannot recover matches beyond\n // the old endpoint's bounded first page).\n if (search) {\n throw new Error(\"The connected OpenGeni API does not support session search\");\n }\n if (options.pinsOnly) {\n throw new Error(\"The connected OpenGeni API does not support pins-only session lists\");\n }\n return { pinned: [], sessions: response, nextCursor: null };\n }\n return response;\n }\n\n /** Set this authenticated member's personal workspace pin for a session. */\n async updateSessionPin(\n workspaceId: string,\n sessionId: string,\n request: UpdateSessionPinRequest,\n ): Promise<Session> {\n return await this.requestJson<Session>(\n \"PUT\",\n `/v1/workspaces/${workspaceId}/sessions/${sessionId}/pin`,\n request,\n );\n }\n\n async getSessionLineage(workspaceId: string, sessionId: string): Promise<SessionLineageResponse> {\n return await this.requestJson<SessionLineageResponse>(\n \"GET\",\n `/v1/workspaces/${workspaceId}/sessions/${sessionId}/lineage`,\n );\n }\n\n /** Negotiate one server-mediated connected-Codex GPT-Live V3 WebRTC call. */\n async negotiateCodexRealtimeWebrtc(\n workspaceId: string,\n sessionId: string,\n request: CodexRealtimeWebrtcRequest,\n options: { signal?: AbortSignal | undefined } = {},\n ): Promise<CodexRealtimeWebrtcResponse> {\n return await this.requestJson<CodexRealtimeWebrtcResponse>(\n \"POST\",\n `/v1/workspaces/${workspaceId}/sessions/${sessionId}/realtime/webrtc`,\n request,\n {},\n { signal: options.signal },\n );\n }\n\n /** Mint a short-lived browser token for one AI Gateway realtime connection. */\n async negotiateGatewayRealtime(\n workspaceId: string,\n sessionId: string,\n request: GatewayRealtimeConnectRequest,\n options: { signal?: AbortSignal | undefined } = {},\n ): Promise<GatewayRealtimeConnectResponse> {\n return await this.requestJson<GatewayRealtimeConnectResponse>(\n \"POST\",\n `/v1/workspaces/${workspaceId}/sessions/${sessionId}/realtime/gateway`,\n request,\n {},\n { signal: options.signal },\n );\n }\n\n /** Promote a negotiated connection only after its browser data channel is ready. */\n async activateCodexRealtimeConnection(\n workspaceId: string,\n sessionId: string,\n realtimeId: string,\n connectionId: string,\n request: ActivateCodexRealtimeConnectionRequest,\n options: { signal?: AbortSignal | undefined } = {},\n ): Promise<SessionRealtimeMutationResponse> {\n return await this.requestJson<SessionRealtimeMutationResponse>(\n \"POST\",\n `/v1/workspaces/${workspaceId}/sessions/${sessionId}/realtime/${realtimeId}/connections/${connectionId}/activate`,\n request,\n {},\n { signal: options.signal },\n );\n }\n\n /** Atomically enter realtime mode for this ordinary session. */\n async beginSessionRealtime(\n workspaceId: string,\n sessionId: string,\n request: BeginSessionRealtimeRequest,\n ): Promise<SessionRealtimeMutationResponse> {\n return await this.requestJson<SessionRealtimeMutationResponse>(\n \"POST\",\n `/v1/workspaces/${workspaceId}/sessions/${sessionId}/realtime`,\n request,\n );\n }\n\n /** Renew the exact authenticated browser owner's realtime lease. */\n async heartbeatSessionRealtime(\n workspaceId: string,\n sessionId: string,\n realtimeId: string,\n request: RenewSessionRealtimeRequest,\n ): Promise<SessionRealtimeMutationResponse> {\n return await this.requestJson<SessionRealtimeMutationResponse>(\n \"PATCH\",\n `/v1/workspaces/${workspaceId}/sessions/${sessionId}/realtime/${realtimeId}/heartbeat`,\n request,\n );\n }\n\n /** Persist finalized V3 events, acknowledge delivery, and replay pending outbound context. */\n async syncSessionRealtimeLedger(\n workspaceId: string,\n sessionId: string,\n realtimeId: string,\n request: SyncSessionRealtimeLedgerRequest,\n ): Promise<SyncSessionRealtimeLedgerResponse> {\n return await this.requestJson<SyncSessionRealtimeLedgerResponse>(\n \"POST\",\n `/v1/workspaces/${workspaceId}/sessions/${sessionId}/realtime/${realtimeId}/sync`,\n request,\n );\n }\n\n /** End realtime mode and restore ordinary text workflow admission. */\n async endSessionRealtime(\n workspaceId: string,\n sessionId: string,\n realtimeId: string,\n request: EndSessionRealtimeRequest,\n ): Promise<SessionRealtimeMutationResponse> {\n return await this.requestJson<SessionRealtimeMutationResponse>(\n \"DELETE\",\n `/v1/workspaces/${workspaceId}/sessions/${sessionId}/realtime/${realtimeId}`,\n request,\n );\n }\n\n async listTurns(\n workspaceId: string,\n sessionId: string,\n options: { limit?: number; latestStarted?: boolean } = {},\n ): Promise<SessionTurn[]> {\n return await this.requestJson<SessionTurn[]>(\n \"GET\",\n `/v1/workspaces/${workspaceId}/sessions/${sessionId}/turns`,\n undefined,\n {\n ...(options.limit !== undefined ? { limit: String(options.limit) } : {}),\n ...(options.latestStarted ? { latestStarted: \"1\" } : {}),\n },\n );\n }\n\n /** Newest turn that durably emitted `turn.started`, or null before any admission. */\n async getLatestStartedTurn(workspaceId: string, sessionId: string): Promise<SessionTurn | null> {\n const turns = await this.listTurns(workspaceId, sessionId, { latestStarted: true });\n return turns[0] ?? null;\n }\n\n // --- Bring-your-own-compute: Machines dashboard + metrics (M10) ------------\n\n /**\n * List the workspace's machines (the Machines dashboard). Each enrolled\n * selfhosted machine carries its derived state + latest metrics +\n * sharedSessionCount. Pass `sessionId` for an in-session view, which adds the\n * session's synthetic Modal group box + the active-sandbox pointer.\n */\n async listMachines(\n workspaceId: string,\n options: { sessionId?: string; signal?: AbortSignal } = {},\n ): Promise<MachinesResponse> {\n return await this.requestJson<MachinesResponse>(\n \"GET\",\n `/v1/workspaces/${workspaceId}/machines`,\n undefined,\n {\n ...(options.sessionId !== undefined ? { sessionId: options.sessionId } : {}),\n },\n { signal: options.signal },\n );\n }\n\n /**\n * Read the downsampled (~1/min) metrics series for ONE machine over a time\n * window (default 1h). The samples are oldest-first (a left-to-right chart).\n */\n async machineMetricsSeries(\n workspaceId: string,\n enrollmentId: string,\n options: { window?: \"15m\" | \"1h\" | \"6h\" | \"24h\" } = {},\n ): Promise<MetricSample[]> {\n const response = await this.requestJson<MachineMetricsSeriesResponse>(\n \"GET\",\n `/v1/workspaces/${workspaceId}/machines/${enrollmentId}/metrics/series`,\n undefined,\n { ...(options.window !== undefined ? { window: options.window } : {}) },\n );\n return response.samples;\n }\n\n // --- Self-hosted enrollment UX (design 11) --------------------------------\n\n /**\n * Resolve a pending device-enrollment flow by its user_code for the click-Grant\n * approve page (EnrollmentConsent). NO workspace in the path — the server\n * resolves the workspace from the (globally-unique-among-pending) code, then\n * authorizes the caller against it (enrollments:read). Rejects (404) when the\n * code is unknown/expired OR the caller lacks the grant — the two are\n * indistinguishable by design (no cross-workspace disclosure). Does not consume\n * the request.\n */\n async lookupDeviceEnrollment(userCode: string): Promise<DeviceEnrollmentLookupResponse> {\n return await this.requestJson<DeviceEnrollmentLookupResponse>(\n \"POST\",\n \"/v1/enrollments/device/lookup\",\n { userCode },\n );\n }\n\n /**\n * Approve a pending device-enrollment flow (the LOUD consent step). `allowScreenControl`\n * is the authoritative screen-control consent (whole-machine is mandatory/implicit).\n * Lands an enrollment + a selfhosted sandbox and unblocks the agent's poll.\n */\n async approveDeviceEnrollment(\n workspaceId: string,\n request: { userCode: string; allowScreenControl?: boolean },\n ): Promise<DeviceEnrollmentApproveResponse> {\n return await this.requestJson<DeviceEnrollmentApproveResponse>(\n \"POST\",\n `/v1/workspaces/${workspaceId}/enrollments/device/approve`,\n {\n userCode: request.userCode,\n allowScreenControl: request.allowScreenControl ?? false,\n },\n );\n }\n\n /** Deny a pending device-enrollment flow (the explicit \"no\" at the approve page). */\n async denyDeviceEnrollment(\n workspaceId: string,\n request: { userCode: string },\n ): Promise<DeviceEnrollmentDenyResponse> {\n return await this.requestJson<DeviceEnrollmentDenyResponse>(\n \"POST\",\n `/v1/workspaces/${workspaceId}/enrollments/device/deny`,\n { userCode: request.userCode },\n );\n }\n\n /**\n * Mint a short-TTL headless enroll token (the `oget_` token) for the fleet /\n * non-interactive enroll path. The returned `token` is SECRET — surface it once\n * with a copy-now warning; it cannot be re-read. `allowScreenControl` bakes the\n * screen-control consent into the token.\n */\n async mintEnrollToken(\n workspaceId: string,\n request: { allowScreenControl?: boolean } = {},\n ): Promise<MintEnrollTokenResponse> {\n return await this.requestJson<MintEnrollTokenResponse>(\n \"POST\",\n `/v1/workspaces/${workspaceId}/enrollments/token`,\n { allowScreenControl: request.allowScreenControl ?? false },\n );\n }\n\n /**\n * Swap a session's active sandbox (the user-authenticated equivalent of the\n * M7 `sandbox_swap` MCP tool). `target` is a `MachineView.sandboxId` from\n * `listMachines`, or \"session\"/\"default\" to swap back to the session's own\n * group box. Validation (ownership/liveness/epoch fence) is server-side; the\n * result echoes the resulting pointer (`swapped: false` + `reason` on a\n * rejected target or a lost epoch fence).\n */\n async swapActiveSandbox(\n workspaceId: string,\n sessionId: string,\n request: SwapActiveSandboxRequest,\n ): Promise<SwapActiveSandboxResponse> {\n return await this.requestJson<SwapActiveSandboxResponse>(\n \"POST\",\n `/v1/workspaces/${workspaceId}/sessions/${sessionId}/active-sandbox`,\n request,\n );\n }\n\n // --- Scheduled tasks -------------------------------------------------------\n\n async listScheduledTasks(\n workspaceId: string,\n options: { limit?: number } = {},\n ): Promise<ScheduledTask[]> {\n return await this.requestJson<ScheduledTask[]>(\n \"GET\",\n `/v1/workspaces/${workspaceId}/scheduled-tasks`,\n undefined,\n {\n ...(options.limit !== undefined ? { limit: String(options.limit) } : {}),\n },\n );\n }\n\n async getScheduledTask(workspaceId: string, taskId: string): Promise<ScheduledTask> {\n return await this.requestJson<ScheduledTask>(\n \"GET\",\n `/v1/workspaces/${workspaceId}/scheduled-tasks/${taskId}`,\n );\n }\n\n // --- Events: replay, send, stream ----------------------------------------\n\n /**\n * Return the events from one bounded page. With no cursor, this uses the safe\n * semantic monitoring tail; pass explicit forensic options and a cursor for\n * retained audit replay. Use `listEventPage` when projection, coverage, or\n * resume-cursor facts are required.\n */\n async listEvents(\n workspaceId: string,\n sessionId: string,\n options: SessionEventListOptions = {},\n ): Promise<SessionEvent[]> {\n return (await this.listEventPage(workspaceId, sessionId, options)).events;\n }\n\n /** Bounded durable/monitoring page plus exact projection and cursor facts. */\n async listEventPage(\n workspaceId: string,\n sessionId: string,\n options: SessionEventCompactResultOptions,\n ): Promise<SessionEventCompactResult | null>;\n async listEventPage(\n workspaceId: string,\n sessionId: string,\n options?: SessionEventListOptions,\n ): Promise<SessionEventPage>;\n async listEventPage(\n workspaceId: string,\n sessionId: string,\n options: SessionEventListOptions | SessionEventCompactResultOptions = {},\n ): Promise<SessionEventPage | SessionEventCompactResult | null> {\n if (\n options.latest &&\n [\"includeTypes\", \"excludeTypes\", \"includeClasses\", \"excludeClasses\"].some((name) =>\n Object.prototype.hasOwnProperty.call(options, name),\n )\n ) {\n throw new TypeError(\"latest cannot be combined with event filters\");\n }\n if (options.resultMode === \"compact\" && !options.latest) {\n throw new TypeError(\"resultMode=compact requires latest\");\n }\n const listOptions: SessionEventListOptions | null =\n options.resultMode === \"compact\" ? null : options;\n const correlationId = crypto.randomUUID();\n const response = await this.fetchImpl(\n this.url(`/v1/workspaces/${workspaceId}/sessions/${sessionId}/events`, {\n ...(listOptions?.after !== undefined ? { after: String(listOptions.after) } : {}),\n ...(listOptions?.before !== undefined ? { before: String(listOptions.before) } : {}),\n ...(listOptions?.limit !== undefined ? { limit: String(listOptions.limit) } : {}),\n ...(listOptions?.compact ? { compact: \"1\" } : {}),\n ...(options.mode ? { mode: options.mode } : {}),\n ...(listOptions?.direction ? { direction: listOptions.direction } : {}),\n ...(options.payloadMode ? { payloadMode: options.payloadMode } : {}),\n ...(options.resultMode ? { resultMode: options.resultMode } : {}),\n ...(listOptions?.includeTypes?.length\n ? { includeTypes: listOptions.includeTypes.join(\",\") }\n : {}),\n ...(listOptions?.excludeTypes?.length\n ? { excludeTypes: listOptions.excludeTypes.join(\",\") }\n : {}),\n ...(listOptions?.includeClasses?.length\n ? { includeClasses: listOptions.includeClasses.join(\",\") }\n : {}),\n ...(listOptions?.excludeClasses?.length\n ? { excludeClasses: listOptions.excludeClasses.join(\",\") }\n : {}),\n ...(options.latest ? { latest: options.latest } : {}),\n }),\n {\n method: \"GET\",\n headers: { ...this.headers(correlationId), Accept: \"application/json\" },\n },\n );\n assertApiContractResponse(response);\n if (!response.ok) {\n throw await apiErrorFromResponse(response, {\n method: \"GET\",\n correlationId,\n });\n }\n await assertJsonResponse(response, { method: \"GET\", correlationId });\n const body = await response.json();\n if (options.resultMode === \"compact\") {\n return body as SessionEventCompactResult;\n }\n const events = body as SessionEvent[];\n const integerHeader = (name: string): number | null => {\n const raw = response.headers.get(name);\n if (raw === null) return null;\n const value = Number(raw);\n return Number.isSafeInteger(value) && value >= 0 ? value : null;\n };\n const mode =\n response.headers.get(\"X-OpenGeni-Event-Mode\") === \"forensic\" ? \"forensic\" : \"monitoring\";\n const direction =\n response.headers.get(\"X-OpenGeni-Event-Direction\") === \"after\" ? \"after\" : \"before\";\n const payloadHeader = response.headers.get(\"X-OpenGeni-Payload-Mode\");\n const payloadMode =\n payloadHeader === \"none\" || payloadHeader === \"full\" ? payloadHeader : \"summary\";\n const first = integerHeader(\"X-OpenGeni-Covered-First\");\n const last = integerHeader(\"X-OpenGeni-Covered-Last\");\n const bytes =\n integerHeader(\"X-OpenGeni-Page-Bytes\") ??\n new TextEncoder().encode(JSON.stringify(events)).byteLength;\n const maxBytes = integerHeader(\"X-OpenGeni-Page-Max-Bytes\") ?? 1024 * 1024;\n const truncatedByHeader = response.headers.get(\"X-OpenGeni-Truncated-By\");\n const truncatedBy =\n truncatedByHeader === \"count\" ||\n truncatedByHeader === \"bytes\" ||\n truncatedByHeader === \"http_bytes\"\n ? truncatedByHeader\n : null;\n return {\n events,\n mode,\n payloadMode,\n direction,\n bytes,\n maxBytes,\n truncated: response.headers.get(\"X-OpenGeni-Page-Truncated\") === \"true\",\n hasMore: response.headers.get(\"X-OpenGeni-Has-More\") === \"true\",\n truncatedBy,\n coveredSequence: first === null || last === null ? null : { first, last },\n nextAfter: integerHeader(\"X-OpenGeni-Next-After\"),\n nextBefore: integerHeader(\"X-OpenGeni-Next-Before\"),\n forensicExact: response.headers.get(\"X-OpenGeni-Forensic-Exact\") === \"true\",\n };\n }\n\n /**\n * Fetch the authoritative newest-sequence semantic result directly. This is\n * the callback-loss recovery path: it reads one compact durable result and\n * never creates a model turn. `latest: \"receipt\"` aliases `tool_receipt`;\n * turn generation remains scoped retry metadata.\n */\n async getLatestEventResult(\n workspaceId: string,\n sessionId: string,\n options: Omit<SessionEventCompactResultOptions, \"resultMode\"> = {\n latest: \"terminal\",\n },\n ): Promise<SessionEventCompactResult | null> {\n return await this.listEventPage(workspaceId, sessionId, {\n ...options,\n resultMode: \"compact\",\n });\n }\n\n /** POST a user/control event to the session. Returns the accepted event. */\n async sendEvent(\n workspaceId: string,\n sessionId: string,\n event: ClientSessionEventInput,\n ): Promise<SessionEvent> {\n return await this.requestJson<SessionEvent>(\n \"POST\",\n `/v1/workspaces/${workspaceId}/sessions/${sessionId}/events`,\n event,\n );\n }\n\n async sendMessage(\n workspaceId: string,\n sessionId: string,\n message: string | SendMessageInput,\n ): Promise<SessionEvent> {\n const input = typeof message === \"string\" ? { text: message } : message;\n const { clientEventId, ...payload } = input;\n return await this.sendEvent(workspaceId, sessionId, {\n type: \"user.message\",\n ...(clientEventId !== undefined ? { clientEventId } : {}),\n payload,\n });\n }\n\n async pauseSession(\n workspaceId: string,\n sessionId: string,\n options: {\n reason?: string;\n clientEventId?: string;\n expectedControlEtag?: string;\n } = {},\n ): Promise<SessionControlResponse> {\n return await this.controlSession(workspaceId, sessionId, {\n action: \"pause\",\n clientEventId: options.clientEventId ?? crypto.randomUUID(),\n ...(options.reason ? { reason: options.reason } : {}),\n ...(options.expectedControlEtag ? { expectedControlEtag: options.expectedControlEtag } : {}),\n });\n }\n\n async sendApprovalDecision(\n workspaceId: string,\n sessionId: string,\n decision: {\n approvalId: string;\n decision: \"approve\" | \"reject\";\n message?: string;\n clientEventId?: string;\n },\n ): Promise<SessionEvent> {\n const { clientEventId, ...payload } = decision;\n return await this.sendEvent(workspaceId, sessionId, {\n type: \"user.approvalDecision\",\n ...(clientEventId !== undefined ? { clientEventId } : {}),\n payload,\n });\n }\n\n async listHumanInputRequests(\n workspaceId: string,\n sessionId: string,\n options: {\n status?: SessionHumanInputRequest[\"status\"];\n } = {},\n ): Promise<SessionHumanInputRequest[]> {\n const result = await this.requestJson<{\n requests: SessionHumanInputRequest[];\n }>(\n \"GET\",\n `/v1/workspaces/${workspaceId}/sessions/${sessionId}/human-input-requests`,\n undefined,\n options.status ? { status: options.status } : undefined,\n );\n return result.requests;\n }\n\n async getHumanInputRequest(\n workspaceId: string,\n sessionId: string,\n requestId: string,\n ): Promise<SessionHumanInputRequest> {\n return await this.requestJson<SessionHumanInputRequest>(\n \"GET\",\n `/v1/workspaces/${workspaceId}/sessions/${sessionId}/human-input-requests/${requestId}`,\n );\n }\n\n async submitHumanInputResponse(\n workspaceId: string,\n sessionId: string,\n requestId: string,\n response: SubmitHumanInputResponseRequest,\n options: { clientEventId?: string } = {},\n ): Promise<SessionEvent> {\n return await this.sendEvent(workspaceId, sessionId, {\n type: \"user.humanInputResponse\",\n ...(options.clientEventId ? { clientEventId: options.clientEventId } : {}),\n payload: { requestId, response },\n });\n }\n\n /**\n * Live-stream a session's events with automatic reconnect, resume from the\n * last seen sequence, gap backfill, and duplicate suppression. See\n * {@link streamSessionEvents} for the delivery guarantees.\n */\n streamEvents(\n workspaceId: string,\n sessionId: string,\n options: StreamSessionEventsOptions = {},\n ): AsyncGenerator<SessionEvent, void, void> {\n return streamSessionEvents(this.eventStreamTransport(workspaceId, sessionId), options);\n }\n\n /** The transport `streamEvents` runs on; useful for custom streaming layers. */\n eventStreamTransport(workspaceId: string, sessionId: string): SessionEventStreamTransport {\n return {\n openStream: async (after, signal) =>\n await this.openEventStream(workspaceId, sessionId, {\n after,\n ...(signal ? { signal } : {}),\n }),\n listEvents: async (after, limit) =>\n await this.listEvents(workspaceId, sessionId, { after, limit }),\n };\n }\n\n /** Open one raw SSE connection (no reconnect). Most callers want `streamEvents`. */\n async openEventStream(\n workspaceId: string,\n sessionId: string,\n options: { after?: number; signal?: AbortSignal } = {},\n ): Promise<ReadableStream<Uint8Array>> {\n const url = this.url(`/v1/workspaces/${workspaceId}/sessions/${sessionId}/events/stream`, {\n after: String(options.after ?? 0),\n });\n const correlationId = crypto.randomUUID();\n const response = await this.fetchImpl(url, {\n method: \"GET\",\n headers: { ...this.headers(correlationId), Accept: \"text/event-stream\" },\n ...(options.signal ? { signal: options.signal } : {}),\n });\n assertApiContractResponse(response);\n if (!response.ok) {\n throw await apiErrorFromResponse(response, {\n method: \"GET\",\n correlationId,\n });\n }\n if (!response.body) {\n throw new OpenGeniApiError(response.status, \"SSE response did not include a readable body\");\n }\n return response.body;\n }\n\n // --- Turn queue ------------------------------------------------------------\n\n async getQueue(workspaceId: string, sessionId: string): Promise<SessionQueueSnapshot> {\n return await this.requestJson<SessionQueueSnapshot>(\n \"GET\",\n `/v1/workspaces/${workspaceId}/sessions/${sessionId}/queue`,\n );\n }\n\n async moveQueueItem(\n workspaceId: string,\n sessionId: string,\n turnId: string,\n request: MoveSessionQueueItemRequest,\n ): Promise<SessionQueueMutationResponse> {\n return await this.requestJson<SessionQueueMutationResponse>(\n \"POST\",\n `/v1/workspaces/${workspaceId}/sessions/${sessionId}/queue/${turnId}/move`,\n request,\n );\n }\n\n async editQueueItem(\n workspaceId: string,\n sessionId: string,\n turnId: string,\n request: EditSessionQueueItemRequest,\n ): Promise<SessionQueueMutationResponse> {\n return await this.requestJson<SessionQueueMutationResponse>(\n \"POST\",\n `/v1/workspaces/${workspaceId}/sessions/${sessionId}/queue/${turnId}/edit`,\n request,\n );\n }\n\n async steerQueueItem(\n workspaceId: string,\n sessionId: string,\n turnId: string,\n request: SteerSessionQueueItemRequest,\n ): Promise<SessionQueueMutationResponse> {\n return await this.requestJson<SessionQueueMutationResponse>(\n \"POST\",\n `/v1/workspaces/${workspaceId}/sessions/${sessionId}/queue/${turnId}/steer`,\n request,\n );\n }\n\n async deleteQueueItem(\n workspaceId: string,\n sessionId: string,\n turnId: string,\n request: DeleteSessionQueueItemRequest,\n ): Promise<SessionQueueMutationResponse> {\n return await this.requestJson<SessionQueueMutationResponse>(\n \"POST\",\n `/v1/workspaces/${workspaceId}/sessions/${sessionId}/queue/${turnId}/delete`,\n request,\n );\n }\n\n async getComposerDraft(workspaceId: string, sessionId: string): Promise<ComposerDraft> {\n return await this.requestJson<ComposerDraft>(\n \"GET\",\n `/v1/workspaces/${workspaceId}/sessions/${sessionId}/composer-draft`,\n );\n }\n\n async saveComposerDraft(\n workspaceId: string,\n sessionId: string,\n request: SaveComposerDraftRequest,\n ): Promise<ComposerDraft> {\n return await this.requestJson<ComposerDraft>(\n \"PUT\",\n `/v1/workspaces/${workspaceId}/sessions/${sessionId}/composer-draft`,\n request,\n );\n }\n\n async controlSession(\n workspaceId: string,\n sessionId: string,\n request: {\n action: \"pause\" | \"resume\" | \"cancel\";\n reason?: string;\n clientEventId: string;\n expectedControlEtag?: string;\n },\n ): Promise<SessionControlResponse> {\n return await this.requestJson<SessionControlResponse>(\n \"POST\",\n `/v1/workspaces/${workspaceId}/sessions/${sessionId}/control`,\n request,\n );\n }\n\n async resumeSession(\n workspaceId: string,\n sessionId: string,\n options: {\n reason?: string;\n clientEventId?: string;\n expectedControlEtag?: string;\n } = {},\n ): Promise<SessionControlResponse> {\n return await this.controlSession(workspaceId, sessionId, {\n action: \"resume\",\n clientEventId: options.clientEventId ?? crypto.randomUUID(),\n ...(options.reason ? { reason: options.reason } : {}),\n ...(options.expectedControlEtag ? { expectedControlEtag: options.expectedControlEtag } : {}),\n });\n }\n\n /**\n * Terminally cancel a session subtree. Unlike pause, cancellation drains\n * queued work and permanently fences new prompts for the session and every\n * descendant.\n */\n async cancelSession(\n workspaceId: string,\n sessionId: string,\n options: { reason?: string; clientEventId?: string; expectedControlEtag?: string } = {},\n ): Promise<SessionControlResponse> {\n return await this.controlSession(workspaceId, sessionId, {\n action: \"cancel\",\n clientEventId: options.clientEventId ?? crypto.randomUUID(),\n ...(options.reason ? { reason: options.reason } : {}),\n ...(options.expectedControlEtag ? { expectedControlEtag: options.expectedControlEtag } : {}),\n });\n }\n\n async setWorkspaceInferenceState(\n workspaceId: string,\n request: {\n action: \"pause\" | \"resume\";\n reason?: string;\n clientEventId: string;\n expectedRevision?: number;\n },\n ): Promise<WorkspaceInferenceControlResponse> {\n return await this.requestJson<WorkspaceInferenceControlResponse>(\n \"POST\",\n `/v1/workspaces/${workspaceId}/inference-control`,\n request,\n );\n }\n\n async listWorkspaceControlEvents(\n workspaceId: string,\n options: { after?: number; limit?: number } = {},\n ): Promise<WorkspaceControlEvent[]> {\n return (await this.listWorkspaceControlEventPage(workspaceId, options)).events;\n }\n\n /** Count/byte-bounded page plus an explicit continuation cursor. */\n async listWorkspaceControlEventPage(\n workspaceId: string,\n options: { after?: number; limit?: number } = {},\n ): Promise<WorkspaceControlEventPage> {\n const correlationId = crypto.randomUUID();\n const response = await this.fetchImpl(\n this.url(`/v1/workspaces/${workspaceId}/control-events`, {\n ...(options.after !== undefined ? { after: String(options.after) } : {}),\n ...(options.limit !== undefined ? { limit: String(options.limit) } : {}),\n }),\n {\n method: \"GET\",\n headers: { ...this.headers(correlationId), Accept: \"application/json\" },\n },\n );\n assertApiContractResponse(response);\n if (!response.ok) {\n throw await apiErrorFromResponse(response, {\n method: \"GET\",\n correlationId,\n });\n }\n await assertJsonResponse(response, { method: \"GET\", correlationId });\n const events = (await response.json()) as WorkspaceControlEvent[];\n const bytesHeader = response.headers.get(\"X-OpenGeni-Page-Bytes\");\n const nextHeader = response.headers.get(\"X-OpenGeni-Next-After\");\n const parsedBytes = bytesHeader === null ? Number.NaN : Number(bytesHeader);\n const parsedNext = nextHeader === null ? null : Number(nextHeader);\n return {\n events,\n bytes:\n Number.isSafeInteger(parsedBytes) && parsedBytes >= 0\n ? parsedBytes\n : new TextEncoder().encode(JSON.stringify(events)).byteLength,\n truncated: response.headers.get(\"X-OpenGeni-Page-Truncated\") === \"true\",\n nextAfter:\n parsedNext !== null && Number.isSafeInteger(parsedNext) && parsedNext >= 0\n ? parsedNext\n : null,\n };\n }\n\n streamWorkspaceControlEvents(\n workspaceId: string,\n options: StreamSessionEventsOptions = {},\n ): AsyncGenerator<WorkspaceControlEvent, void, void> {\n return streamWorkspaceControlEvents(this.workspaceControlStreamTransport(workspaceId), options);\n }\n\n workspaceControlStreamTransport(workspaceId: string): WorkspaceControlStreamTransport {\n return {\n openStream: async (after, signal) =>\n await this.openWorkspaceControlEventStream(workspaceId, {\n after,\n ...(signal ? { signal } : {}),\n }),\n };\n }\n\n async openWorkspaceControlEventStream(\n workspaceId: string,\n options: { after?: number; signal?: AbortSignal } = {},\n ): Promise<ReadableStream<Uint8Array>> {\n const correlationId = crypto.randomUUID();\n const response = await this.fetchImpl(\n this.url(`/v1/workspaces/${workspaceId}/control-events/stream`, {\n after: String(options.after ?? 0),\n }),\n {\n method: \"GET\",\n headers: {\n ...this.headers(correlationId),\n Accept: \"text/event-stream\",\n },\n ...(options.signal ? { signal: options.signal } : {}),\n },\n );\n assertApiContractResponse(response);\n if (!response.ok) {\n throw await apiErrorFromResponse(response, {\n method: \"GET\",\n correlationId,\n });\n }\n if (!response.body) {\n throw new OpenGeniApiError(response.status, \"SSE response did not include a readable body\");\n }\n return response.body;\n }\n\n /**\n * Steer: atomically put this prompt at the head and supersede the current\n * inference. The client performs one request and renders server order.\n */\n async steerMessage(\n workspaceId: string,\n sessionId: string,\n message: string | SendMessageInput,\n ): Promise<SteerMessageResult> {\n const input = typeof message === \"string\" ? { text: message } : message;\n return await this.requestJson<SteerMessageResult>(\n \"POST\",\n `/v1/workspaces/${workspaceId}/sessions/${sessionId}/steer`,\n input,\n );\n }\n\n // --- Goals -------------------------------------------------------------------\n\n /** The session's goal. 404s when the session never had one. */\n async getGoal(workspaceId: string, sessionId: string): Promise<SessionGoal> {\n return await this.requestJson<SessionGoal>(\n \"GET\",\n `/v1/workspaces/${workspaceId}/sessions/${sessionId}/goal`,\n );\n }\n\n async updateGoal(\n workspaceId: string,\n sessionId: string,\n request: UpdateSessionGoalRequest,\n ): Promise<SessionGoal> {\n return await this.requestJson<SessionGoal>(\n \"PATCH\",\n `/v1/workspaces/${workspaceId}/sessions/${sessionId}/goal`,\n request,\n );\n }\n\n async deleteGoal(workspaceId: string, sessionId: string): Promise<void> {\n await this.requestVoid(\"DELETE\", `/v1/workspaces/${workspaceId}/sessions/${sessionId}/goal`);\n }\n\n /** Pause the goal loop: the session stops self-continuing until resumed. */\n async pauseGoal(\n workspaceId: string,\n sessionId: string,\n options: { rationale?: string } = {},\n ): Promise<SessionGoal> {\n return await this.updateGoal(workspaceId, sessionId, {\n status: \"paused\",\n ...(options.rationale !== undefined ? { rationale: options.rationale } : {}),\n });\n }\n\n /** Resume a paused goal: resets counters and re-arms the continuation loop. */\n async resumeGoal(workspaceId: string, sessionId: string): Promise<SessionGoal> {\n return await this.updateGoal(workspaceId, sessionId, { status: \"active\" });\n }\n\n // --- Operator context controls (/clear, /compact) ---------------------------\n\n /**\n * Clear the session's conversation context. Destructive and audit-preserving:\n * the server supersedes (never deletes) the live history and emits a\n * `session.context.cleared` event. Refused (409) while a turn is in flight or\n * awaiting action. `confirm:true` is sent so an accidental call cannot wipe\n * context — the destructive intent is explicit on the wire.\n */\n async clearSessionContext(workspaceId: string, sessionId: string): Promise<void> {\n await this.requestVoid(\n \"POST\",\n `/v1/workspaces/${workspaceId}/sessions/${sessionId}/context/clear`,\n { confirm: true },\n );\n }\n\n /** Request one durable portable compaction at the next safe model boundary. */\n async compactSessionContext(\n workspaceId: string,\n sessionId: string,\n ): Promise<CompactSessionContextResult> {\n return await this.requestJson<CompactSessionContextResult>(\n \"POST\",\n `/v1/workspaces/${workspaceId}/sessions/${sessionId}/context/compact`,\n {},\n );\n }\n\n // --- Channel-A structured services (P4.4) ------------------------------------\n // FileSystem (Pierre tree), Git (Pierre diff), Terminal (exec + PTY). Each is a\n // synchronous API-direct point query; the fs.changed/git.changed/terminal.pty.*\n // notifications + the PTY output stream arrive on the existing event SSE.\n\n /** FileSystem: list a directory tree (feeds the Pierre file tree). */\n async fsList(\n workspaceId: string,\n sessionId: string,\n request: FsListRequest = {},\n options: OpenGeniRequestOptions = {},\n ): Promise<FsListResponse> {\n return await this.requestJson<FsListResponse>(\n \"POST\",\n `/v1/workspaces/${workspaceId}/sessions/${sessionId}/fs/list`,\n request,\n {},\n options,\n );\n }\n\n /** FileSystem: read a file (text or base64; binary-safe, size-capped). */\n async fsRead(\n workspaceId: string,\n sessionId: string,\n request: FsReadRequest,\n options: OpenGeniRequestOptions = {},\n ): Promise<FsReadResponse> {\n return await this.requestJson<FsReadResponse>(\n \"POST\",\n `/v1/workspaces/${workspaceId}/sessions/${sessionId}/fs/read`,\n request,\n {},\n options,\n );\n }\n\n /** FileSystem: write a file (last-writer-wins; emits fs.changed). */\n async fsWrite(\n workspaceId: string,\n sessionId: string,\n request: FsWriteRequest,\n ): Promise<FsWriteResponse> {\n return await this.requestJson<FsWriteResponse>(\n \"POST\",\n `/v1/workspaces/${workspaceId}/sessions/${sessionId}/fs/write`,\n request,\n );\n }\n\n /** FileSystem: delete a path (emits fs.changed). */\n async fsDelete(\n workspaceId: string,\n sessionId: string,\n request: FsDeleteRequest,\n ): Promise<FsDeleteResponse> {\n return await this.requestJson<FsDeleteResponse>(\n \"POST\",\n `/v1/workspaces/${workspaceId}/sessions/${sessionId}/fs/delete`,\n request,\n );\n }\n\n /** FileSystem: move/rename a path (emits fs.changed; 409 if destination exists and overwrite is false). */\n async fsMove(\n workspaceId: string,\n sessionId: string,\n request: FsMoveRequest,\n ): Promise<FsMoveResponse> {\n return await this.requestJson<FsMoveResponse>(\n \"POST\",\n `/v1/workspaces/${workspaceId}/sessions/${sessionId}/fs/move`,\n request,\n );\n }\n\n /** FileSystem: create a directory (emits fs.changed; recursive defaults to true). */\n async fsMkdir(\n workspaceId: string,\n sessionId: string,\n request: FsMkdirRequest,\n ): Promise<FsMkdirResponse> {\n return await this.requestJson<FsMkdirResponse>(\n \"POST\",\n `/v1/workspaces/${workspaceId}/sessions/${sessionId}/fs/mkdir`,\n request,\n );\n }\n\n /** Git: working-tree/index status (the Pierre file-status feed). */\n async gitStatus(\n workspaceId: string,\n sessionId: string,\n request: GitStatusRequest = {},\n options: OpenGeniRequestOptions = {},\n ): Promise<GitStatusResponse> {\n return await this.requestJson<GitStatusResponse>(\n \"POST\",\n `/v1/workspaces/${workspaceId}/sessions/${sessionId}/git/status`,\n request,\n {},\n options,\n );\n }\n\n /** Git: structured diff hunks (the Pierre diff feed). */\n async gitDiff(\n workspaceId: string,\n sessionId: string,\n request: GitDiffRequest = {},\n options: OpenGeniRequestOptions = {},\n ): Promise<GitDiffResponse> {\n return await this.requestJson<GitDiffResponse>(\n \"POST\",\n `/v1/workspaces/${workspaceId}/sessions/${sessionId}/git/diff`,\n request,\n {},\n options,\n );\n }\n\n /** Git: commit log. */\n async gitLog(\n workspaceId: string,\n sessionId: string,\n request: GitLogRequest = {},\n ): Promise<GitLogResponse> {\n return await this.requestJson<GitLogResponse>(\n \"POST\",\n `/v1/workspaces/${workspaceId}/sessions/${sessionId}/git/log`,\n request,\n );\n }\n\n /** Git: show a commit (diff vs first parent) or fetch a raw blob at a ref. */\n async gitShow(\n workspaceId: string,\n sessionId: string,\n request: GitShowRequest,\n ): Promise<GitShowResponse> {\n return await this.requestJson<GitShowResponse>(\n \"POST\",\n `/v1/workspaces/${workspaceId}/sessions/${sessionId}/git/show`,\n request,\n );\n }\n\n /** Workspace capture: the latest turn-end snapshot of the session's workspace\n * (tree + per-repo diff + file after-image refs), served from durable storage\n * WITHOUT warming a machine — the workbench cold-paint source. Returns\n * `{available:false}` when no capture exists yet (fall back to the live path). */\n async getWorkspaceCapture(\n workspaceId: string,\n sessionId: string,\n options: OpenGeniRequestOptions = {},\n ): Promise<GetWorkspaceCaptureResponse> {\n return await this.requestJson<GetWorkspaceCaptureResponse>(\n \"GET\",\n `/v1/workspaces/${workspaceId}/sessions/${sessionId}/workspace/capture`,\n undefined,\n {},\n options,\n );\n }\n\n /** Workspace capture: a single file's after-image from the capture (revision\n * pins a specific one; omitted → latest). Content is inline for small files,\n * else a short-TTL signed URL; a tooLarge file returns metadata only. */\n async getWorkspaceCaptureFile(\n workspaceId: string,\n sessionId: string,\n path: string,\n revision?: number,\n options: OpenGeniRequestOptions = {},\n ): Promise<GetWorkspaceCaptureFileResponse> {\n const query: Record<string, string> = { path };\n if (revision !== undefined) query.revision = String(revision);\n return await this.requestJson<GetWorkspaceCaptureFileResponse>(\n \"GET\",\n `/v1/workspaces/${workspaceId}/sessions/${sessionId}/workspace/capture/file`,\n undefined,\n query,\n options,\n );\n }\n\n /** Terminal: run a bounded command, returning buffered stdout/stderr inline. */\n async terminalExec(\n workspaceId: string,\n sessionId: string,\n request: TerminalExecRequest,\n ): Promise<TerminalExecResponse> {\n return await this.requestJson<TerminalExecResponse>(\n \"POST\",\n `/v1/workspaces/${workspaceId}/sessions/${sessionId}/terminal/exec`,\n request,\n );\n }\n\n /** Terminal: open an interactive PTY. Output streams on the event SSE as\n * terminal.pty.output.delta; drive it with terminalPtyWrite. */\n async terminalPtyOpen(\n workspaceId: string,\n sessionId: string,\n request: PtyOpenRequest = {},\n ): Promise<PtyOpenResponse> {\n return await this.requestJson<PtyOpenResponse>(\n \"POST\",\n `/v1/workspaces/${workspaceId}/sessions/${sessionId}/terminal/pty`,\n request,\n );\n }\n\n /** Terminal: send stdin to an open PTY (output rides A1). */\n async terminalPtyWrite(\n workspaceId: string,\n sessionId: string,\n request: PtyWriteRequest,\n ): Promise<void> {\n await this.requestVoid(\n \"POST\",\n `/v1/workspaces/${workspaceId}/sessions/${sessionId}/terminal/pty/write`,\n request,\n );\n }\n\n /** Terminal: resize an open PTY. */\n async terminalPtyResize(\n workspaceId: string,\n sessionId: string,\n request: PtyResizeRequest,\n ): Promise<void> {\n await this.requestVoid(\n \"POST\",\n `/v1/workspaces/${workspaceId}/sessions/${sessionId}/terminal/pty/resize`,\n request,\n );\n }\n\n /** Terminal: close an open PTY (idempotent). */\n async terminalPtyClose(\n workspaceId: string,\n sessionId: string,\n request: PtyCloseRequest,\n ): Promise<void> {\n await this.requestVoid(\n \"POST\",\n `/v1/workspaces/${workspaceId}/sessions/${sessionId}/terminal/pty/close`,\n request,\n );\n }\n\n // --- Stream surfacing: capability negotiation + viewer lifecycle (Phase 5) ---\n // The capability doc is the single source of UI truth (degradation is always a\n // value, never a crash). The desktop pixel plane (Channel B) is gated behind an\n // un-redacted-acknowledgment + a viewer holder; the structured terminal/files/\n // git surfaces (Channel A) ride the methods above and the event SSE.\n\n /** Read the negotiated capability doc for a session WITHOUT acquiring a viewer\n * holder (no warm, no spawn). Drives capability-gated rendering: which\n * surfaces mount, the per-surface unavailability reasons, and the lease\n * liveness the client polls on while `cold`/`warming`. The desktop URL/token\n * are minted in-process only when the box is warm AND the principal has\n * acknowledged the un-redacted plane. */\n async getStreamCapabilities(\n workspaceId: string,\n sessionId: string,\n options: OpenGeniRequestOptions = {},\n ): Promise<SessionCapabilities> {\n return await this.requestJson<SessionCapabilities>(\n \"GET\",\n `/v1/workspaces/${workspaceId}/sessions/${sessionId}/stream-capabilities`,\n undefined,\n {},\n options,\n );\n }\n\n /** Record the calling principal's acknowledgment of the un-redacted desktop\n * pixel plane (and, when the box is shared, the shared-exposure disclosure).\n * The desktop viewer-attach path returns 409 until this is recorded. */\n async acknowledgeStream(\n workspaceId: string,\n sessionId: string,\n request: AcknowledgeStreamRequest = {},\n ): Promise<AcknowledgeStreamResponse> {\n return await this.requestJson<AcknowledgeStreamResponse>(\n \"POST\",\n `/v1/workspaces/${workspaceId}/sessions/${sessionId}/stream-capabilities/acknowledge`,\n request,\n );\n }\n\n /** Attach a viewer holder (refcounted liveness — keeps the box warm while\n * watched/used), spinning the box up in-process when cold, and mint the scoped\n * direct-to-provider URLs for the requested plane(s). `request.desktop:true`\n * opts into the un-redacted pixel plane and mints the noVNC URL — that plane\n * alone throws `OpenGeniApiError(409)` when the un-redacted/shared\n * acknowledgment is missing (the consent gate). A terminal-only attach\n * (`desktop` omitted/false) warms the box + mints the pty-ws terminal cell with\n * NO consent gate. An omitted `viewerId` mints a fresh one. */\n async attachViewer(\n workspaceId: string,\n sessionId: string,\n request: AttachViewerRequest = {},\n ): Promise<AttachViewerResponse> {\n return await this.requestJson<AttachViewerResponse>(\n \"POST\",\n `/v1/workspaces/${workspaceId}/sessions/${sessionId}/viewers`,\n request,\n );\n }\n\n /** Heartbeat a viewer holder (Channel-A app-level liveness). A closed laptop\n * stops sending these → the reaper drops the holder within ~90s. Echoes\n * `leaseEpoch` so a superseded epoch is rejected (`alive:false` → re-attach). */\n async heartbeatViewer(\n workspaceId: string,\n sessionId: string,\n viewerId: string,\n request: ViewerHeartbeatRequest,\n ): Promise<ViewerHeartbeatResponse> {\n return await this.requestJson<ViewerHeartbeatResponse>(\n \"POST\",\n `/v1/workspaces/${workspaceId}/sessions/${sessionId}/viewers/${viewerId}/heartbeat`,\n request,\n );\n }\n\n /** Detach a viewer (delete this holder; idempotent delete-my-row). */\n async detachViewer(workspaceId: string, sessionId: string, viewerId: string): Promise<void> {\n await this.requestVoid(\n \"DELETE\",\n `/v1/workspaces/${workspaceId}/sessions/${sessionId}/viewers/${viewerId}`,\n );\n }\n\n // --- Access + workspaces -----------------------------------------------------\n\n /**\n * The deployment's public client bootstrap config: the host-exposed models\n * (provider-grouped in `models`, flat in `allowedModels` for back-compat),\n * reasoning efforts, MCP servers, file-upload limits, and how the client is\n * expected to authenticate. Drives a composer's model picker without prior\n * knowledge of the host setup; safe to call before any auth is established.\n */\n async getClientConfig(): Promise<ClientConfig> {\n const config = await this.requestJson<ClientConfig>(\"GET\", \"/v1/config/client\");\n if (config.apiContractRevision !== OPENGENI_API_CONTRACT_REVISION) {\n throw new OpenGeniApiContractMismatchError(\n OPENGENI_API_CONTRACT_REVISION,\n String(config.apiContractRevision || \"(missing)\"),\n );\n }\n return config;\n }\n\n /** Authenticated model definitions plus workspace-specific selectability. */\n async getWorkspaceModelCatalog(workspaceId: string): Promise<WorkspaceModelCatalogResponse> {\n return await this.requestJson<WorkspaceModelCatalogResponse>(\n \"GET\",\n `/v1/workspaces/${workspaceId}/model-catalog`,\n );\n }\n\n /** Authenticated realtime voice models and credential readiness. */\n async getWorkspaceRealtimeModelCatalog(\n workspaceId: string,\n ): Promise<WorkspaceRealtimeModelCatalogResponse> {\n return await this.requestJson<WorkspaceRealtimeModelCatalogResponse>(\n \"GET\",\n `/v1/workspaces/${workspaceId}/realtime-model-catalog`,\n );\n }\n\n /** The caller's access context: subject, account + workspace grants, defaults. */\n async getAccessContext(): Promise<AccessContext> {\n return await this.requestJson<AccessContext>(\"GET\", \"/v1/access/me\");\n }\n\n async listWorkspaces(): Promise<Workspace[]> {\n return await this.requestJson<Workspace[]>(\"GET\", \"/v1/workspaces\");\n }\n\n async createWorkspace(request: CreateWorkspaceRequest): Promise<Workspace> {\n return await this.requestJson<Workspace>(\"POST\", \"/v1/workspaces\", request);\n }\n\n async getWorkspace(workspaceId: string): Promise<Workspace> {\n return await this.requestJson<Workspace>(\"GET\", `/v1/workspaces/${workspaceId}`);\n }\n\n /** Read-time, secret-safe inventory of policy heads and visible workspace knowledge. */\n async getWorkspaceState(\n workspaceId: string,\n options: WorkspaceStateGetOptions = {},\n ): Promise<WorkspaceStateResponse> {\n const params = new URLSearchParams();\n if (options.attemptId) params.set(\"attemptId\", options.attemptId);\n const query = params.size > 0 ? `?${params.toString()}` : \"\";\n return await this.requestJson<WorkspaceStateResponse>(\n \"GET\",\n `/v1/workspaces/${workspaceId}/workspace-state${query}`,\n );\n }\n\n /** Download the canonical, explicitly sanitized Workspace State export. */\n async exportWorkspaceState(\n workspaceId: string,\n options: WorkspaceStateGetOptions = {},\n ): Promise<WorkspaceStateExportResponse> {\n const params = new URLSearchParams();\n if (options.attemptId) params.set(\"attemptId\", options.attemptId);\n const query = params.size > 0 ? `?${params.toString()}` : \"\";\n return await this.requestJson<WorkspaceStateExportResponse>(\n \"GET\",\n `/v1/workspaces/${workspaceId}/workspace-state/export${query}`,\n );\n }\n\n async updateWorkspace(workspaceId: string, request: UpdateWorkspaceRequest): Promise<Workspace> {\n return await this.requestJson<Workspace>(\"PATCH\", `/v1/workspaces/${workspaceId}`, request);\n }\n\n /** Inspect immutable instruction-policy history, active heads, and activation audit evidence. */\n async listWorkspaceInstructionPolicies(\n workspaceId: string,\n options: WorkspaceInstructionPolicyListOptions = {},\n ): Promise<WorkspaceInstructionPolicyListResponse> {\n const params = new URLSearchParams();\n if (options.kind !== undefined) params.set(\"kind\", options.kind);\n if (options.scope !== undefined) params.set(\"scope\", options.scope);\n if (options.roleKey !== undefined) params.set(\"roleKey\", options.roleKey);\n if (options.afterRevision !== undefined) {\n params.set(\"afterRevision\", String(options.afterRevision));\n }\n if (options.limit !== undefined) params.set(\"limit\", String(options.limit));\n const query = params.toString();\n return await this.requestJson<WorkspaceInstructionPolicyListResponse>(\n \"GET\",\n `/v1/workspaces/${workspaceId}/instruction-policies${query ? `?${query}` : \"\"}`,\n );\n }\n\n async getWorkspaceInstructionPolicyRevision(\n workspaceId: string,\n revisionId: string,\n ): Promise<WorkspaceInstructionPolicyRevision> {\n return await this.requestJson<WorkspaceInstructionPolicyRevision>(\n \"GET\",\n `/v1/workspaces/${workspaceId}/instruction-policies/${encodeURIComponent(revisionId)}`,\n );\n }\n\n async createWorkspaceInstructionPolicyDraft(\n workspaceId: string,\n request: CreateWorkspaceInstructionPolicyDraftRequest,\n ): Promise<WorkspaceInstructionPolicyRevision> {\n return await this.requestJson<WorkspaceInstructionPolicyRevision>(\n \"POST\",\n `/v1/workspaces/${workspaceId}/instruction-policies/drafts`,\n request,\n );\n }\n\n /** List the newest immutable onboarding proposals and their inactive policy drafts. */\n async listWorkspaceInstructionPolicyOnboardingProposals(\n workspaceId: string,\n options: WorkspaceInstructionPolicyOnboardingProposalListOptions = {},\n ): Promise<WorkspaceInstructionPolicyOnboardingProposalListResponse> {\n const params = new URLSearchParams();\n if (options.limit !== undefined) params.set(\"limit\", String(options.limit));\n const query = params.toString();\n return await this.requestJson<WorkspaceInstructionPolicyOnboardingProposalListResponse>(\n \"GET\",\n `/v1/workspaces/${workspaceId}/instruction-policies/onboarding-proposals${query ? `?${query}` : \"\"}`,\n );\n }\n\n /** Create one draft-only proposal against an exact active-policy baseline. */\n async createWorkspaceInstructionPolicyOnboardingProposal(\n workspaceId: string,\n request: CreateWorkspaceInstructionPolicyOnboardingProposalRequest,\n ): Promise<WorkspaceInstructionPolicyOnboardingProposal> {\n return await this.requestJson<WorkspaceInstructionPolicyOnboardingProposal>(\n \"POST\",\n `/v1/workspaces/${workspaceId}/instruction-policies/onboarding-proposals`,\n request,\n );\n }\n\n /** Import the stored legacy workspace override as an inactive charter draft. */\n async importLegacyWorkspaceInstructionPolicyDraft(\n workspaceId: string,\n request: ImportLegacyWorkspaceInstructionPolicyDraftRequest = {},\n ): Promise<WorkspaceInstructionPolicyRevision> {\n return await this.requestJson<WorkspaceInstructionPolicyRevision>(\n \"POST\",\n `/v1/workspaces/${workspaceId}/instruction-policies/import-legacy`,\n request,\n );\n }\n\n async diffWorkspaceInstructionPolicyRevisions(\n workspaceId: string,\n request: WorkspaceInstructionPolicyDiffRequest,\n ): Promise<WorkspaceInstructionPolicyDiffResponse> {\n const params = new URLSearchParams({\n fromRevisionId: request.fromRevisionId,\n toRevisionId: request.toRevisionId,\n });\n return await this.requestJson<WorkspaceInstructionPolicyDiffResponse>(\n \"GET\",\n `/v1/workspaces/${workspaceId}/instruction-policies/diff?${params}`,\n );\n }\n\n async activateWorkspaceInstructionPolicyRevision(\n workspaceId: string,\n revisionId: string,\n request: ActivateWorkspaceInstructionPolicyRequest,\n ): Promise<WorkspaceInstructionPolicyActivationResponse> {\n return await this.requestJson<WorkspaceInstructionPolicyActivationResponse>(\n \"POST\",\n `/v1/workspaces/${workspaceId}/instruction-policies/${encodeURIComponent(revisionId)}/activate`,\n request,\n );\n }\n\n async rollbackWorkspaceInstructionPolicyRevision(\n workspaceId: string,\n request: RollbackWorkspaceInstructionPolicyRequest,\n ): Promise<WorkspaceInstructionPolicyActivationResponse> {\n return await this.requestJson<WorkspaceInstructionPolicyActivationResponse>(\n \"POST\",\n `/v1/workspaces/${workspaceId}/instruction-policies/rollback`,\n request,\n );\n }\n\n async listPreferenceRegistry(\n workspaceId: string,\n options: PreferenceRegistryListOptions = {},\n ): Promise<PreferenceRegistryListResponse> {\n const params = new URLSearchParams();\n if (options.scope) params.set(\"scope\", options.scope);\n if (options.status) params.set(\"status\", options.status);\n if (options.limit !== undefined) params.set(\"limit\", String(options.limit));\n const query = params.toString();\n return await this.requestJson<PreferenceRegistryListResponse>(\n \"GET\",\n `/v1/workspaces/${workspaceId}/preferences${query ? `?${query}` : \"\"}`,\n );\n }\n\n async getPreferenceRegistry(\n workspaceId: string,\n preferenceId: string,\n ): Promise<PreferenceRegistryDetailResponse> {\n return await this.requestJson<PreferenceRegistryDetailResponse>(\n \"GET\",\n `/v1/workspaces/${workspaceId}/preferences/${encodeURIComponent(preferenceId)}`,\n );\n }\n\n async createPreferenceRegistryProposal(\n workspaceId: string,\n request: CreatePreferenceRegistryProposalRequest,\n ): Promise<PreferenceRegistryRecord> {\n return await this.requestJson<PreferenceRegistryRecord>(\n \"POST\",\n `/v1/workspaces/${workspaceId}/preferences/proposals`,\n request,\n );\n }\n\n async activatePreferenceRegistryRevision(\n workspaceId: string,\n preferenceId: string,\n request: ActivatePreferenceRegistryRevisionRequest,\n ): Promise<PreferenceRegistryMutationResponse> {\n return await this.requestJson<PreferenceRegistryMutationResponse>(\n \"POST\",\n `/v1/workspaces/${workspaceId}/preferences/${encodeURIComponent(preferenceId)}/activate`,\n request,\n );\n }\n\n async correctPreferenceRegistry(\n workspaceId: string,\n preferenceId: string,\n request: CorrectPreferenceRegistryRequest,\n ): Promise<PreferenceRegistryMutationResponse> {\n return await this.requestJson<PreferenceRegistryMutationResponse>(\n \"POST\",\n `/v1/workspaces/${workspaceId}/preferences/${encodeURIComponent(preferenceId)}/correct`,\n request,\n );\n }\n\n async changePreferenceRegistryScope(\n workspaceId: string,\n preferenceId: string,\n request: ChangePreferenceRegistryScopeRequest,\n ): Promise<PreferenceRegistryMutationResponse> {\n return await this.requestJson<PreferenceRegistryMutationResponse>(\n \"POST\",\n `/v1/workspaces/${workspaceId}/preferences/${encodeURIComponent(preferenceId)}/scope`,\n request,\n );\n }\n\n async deactivatePreferenceRegistry(\n workspaceId: string,\n preferenceId: string,\n request: DeactivatePreferenceRegistryRequest,\n ): Promise<PreferenceRegistryMutationResponse> {\n return await this.requestJson<PreferenceRegistryMutationResponse>(\n \"POST\",\n `/v1/workspaces/${workspaceId}/preferences/${encodeURIComponent(preferenceId)}/deactivate`,\n request,\n );\n }\n\n async supersedePreferenceRegistry(\n workspaceId: string,\n preferenceId: string,\n request: SupersedePreferenceRegistryRequest,\n ): Promise<PreferenceRegistryMutationResponse> {\n return await this.requestJson<PreferenceRegistryMutationResponse>(\n \"POST\",\n `/v1/workspaces/${workspaceId}/preferences/${encodeURIComponent(preferenceId)}/supersede`,\n request,\n );\n }\n\n async rejectPreferenceRegistryProposal(\n workspaceId: string,\n preferenceId: string,\n request: RejectPreferenceRegistryProposalRequest,\n ): Promise<PreferenceRegistryMutationResponse> {\n return await this.requestJson<PreferenceRegistryMutationResponse>(\n \"POST\",\n `/v1/workspaces/${workspaceId}/preferences/${encodeURIComponent(preferenceId)}/reject`,\n request,\n );\n }\n\n async getPreferenceRegistrySummary(workspaceId: string): Promise<PreferenceRegistrySnapshot> {\n return await this.requestJson<PreferenceRegistrySnapshot>(\n \"GET\",\n `/v1/workspaces/${workspaceId}/preferences/summary`,\n );\n }\n\n async getPreferenceRegistryFullContent(\n workspaceId: string,\n retrievalHandle: string,\n ): Promise<PreferenceRegistryFullContent> {\n return await this.requestJson<PreferenceRegistryFullContent>(\n \"POST\",\n `/v1/workspaces/${workspaceId}/preferences/full-content`,\n { retrievalHandle },\n );\n }\n\n /**\n * Delete a workspace and everything in it. Refused (409) for the account's\n * only workspace and while it still has a running session. Irreversible.\n */\n async deleteWorkspace(workspaceId: string): Promise<void> {\n await this.requestVoid(\"DELETE\", `/v1/workspaces/${workspaceId}`);\n }\n\n // --- Members (\"People with access\") -------------------------------------------\n\n /** The workspace's members (user + api_key subjects). */\n async listWorkspaceMembers(workspaceId: string): Promise<WorkspaceMember[]> {\n const response = await this.requestJson<ListWorkspaceMembersResponse>(\n \"GET\",\n `/v1/workspaces/${workspaceId}/members`,\n );\n return response.members;\n }\n\n /**\n * Add an already-registered user by email. 404s when no user with that email\n * exists (email invites for unknown users are deferred).\n */\n async addWorkspaceMember(\n workspaceId: string,\n request: AddWorkspaceMemberRequest,\n ): Promise<WorkspaceMember> {\n return await this.requestJson<WorkspaceMember>(\n \"POST\",\n `/v1/workspaces/${workspaceId}/members`,\n request,\n );\n }\n\n async updateWorkspaceMember(\n workspaceId: string,\n subjectId: string,\n request: UpdateWorkspaceMemberRequest,\n ): Promise<WorkspaceMember> {\n return await this.requestJson<WorkspaceMember>(\n \"PATCH\",\n `/v1/workspaces/${workspaceId}/members/${encodeURIComponent(subjectId)}`,\n request,\n );\n }\n\n /**\n * Remove a member. Refused (409) for your own membership and for the last\n * member who can still manage the workspace.\n */\n async removeWorkspaceMember(workspaceId: string, subjectId: string): Promise<void> {\n await this.requestVoid(\n \"DELETE\",\n `/v1/workspaces/${workspaceId}/members/${encodeURIComponent(subjectId)}`,\n );\n }\n\n // --- Scheduled tasks (write + runs) -------------------------------------------\n\n async createScheduledTask(\n workspaceId: string,\n request: CreateScheduledTaskRequest,\n ): Promise<ScheduledTask> {\n return await this.requestJson<ScheduledTask>(\n \"POST\",\n `/v1/workspaces/${workspaceId}/scheduled-tasks`,\n request,\n );\n }\n\n async updateScheduledTask(\n workspaceId: string,\n taskId: string,\n request: UpdateScheduledTaskRequest,\n ): Promise<ScheduledTask> {\n return await this.requestJson<ScheduledTask>(\n \"PATCH\",\n `/v1/workspaces/${workspaceId}/scheduled-tasks/${taskId}`,\n request,\n );\n }\n\n async pauseScheduledTask(workspaceId: string, taskId: string): Promise<ScheduledTask> {\n return await this.requestJson<ScheduledTask>(\n \"POST\",\n `/v1/workspaces/${workspaceId}/scheduled-tasks/${taskId}/pause`,\n );\n }\n\n async resumeScheduledTask(workspaceId: string, taskId: string): Promise<ScheduledTask> {\n return await this.requestJson<ScheduledTask>(\n \"POST\",\n `/v1/workspaces/${workspaceId}/scheduled-tasks/${taskId}/resume`,\n );\n }\n\n /**\n * Fire the task immediately (manual trigger), independent of its schedule.\n * Pass a stable `triggerId` to make a retried trigger idempotent — the same\n * token charges once and starts one run. Omit it and each call is distinct.\n */\n async triggerScheduledTask(\n workspaceId: string,\n taskId: string,\n options: { triggerId?: string } = {},\n ): Promise<ScheduledTask> {\n return await this.requestJson<ScheduledTask>(\n \"POST\",\n `/v1/workspaces/${workspaceId}/scheduled-tasks/${taskId}/trigger`,\n options.triggerId ? { triggerId: options.triggerId } : undefined,\n );\n }\n\n async deleteScheduledTask(workspaceId: string, taskId: string): Promise<void> {\n await this.requestJson<unknown>(\n \"DELETE\",\n `/v1/workspaces/${workspaceId}/scheduled-tasks/${taskId}`,\n );\n }\n\n async listScheduledTaskRuns(\n workspaceId: string,\n taskId: string,\n options: { limit?: number } = {},\n ): Promise<ScheduledTaskRun[]> {\n return await this.requestJson<ScheduledTaskRun[]>(\n \"GET\",\n `/v1/workspaces/${workspaceId}/scheduled-tasks/${taskId}/runs`,\n undefined,\n {\n ...(options.limit !== undefined ? { limit: String(options.limit) } : {}),\n },\n );\n }\n\n // --- VariableSets --------------------------------------------------------------\n // Variable values are write-only: reads return name/version metadata only.\n\n async listVariableSets(workspaceId: string): Promise<VariableSet[]> {\n return await this.requestJson<VariableSet[]>(\n \"GET\",\n `/v1/workspaces/${workspaceId}/variable-sets`,\n );\n }\n\n async createVariableSet(\n workspaceId: string,\n request: CreateVariableSetRequest,\n ): Promise<VariableSet> {\n return await this.requestJson<VariableSet>(\n \"POST\",\n `/v1/workspaces/${workspaceId}/variable-sets`,\n request,\n );\n }\n\n async getVariableSet(workspaceId: string, variableSetId: string): Promise<VariableSet> {\n return await this.requestJson<VariableSet>(\n \"GET\",\n `/v1/workspaces/${workspaceId}/variable-sets/${variableSetId}`,\n );\n }\n\n async updateVariableSet(\n workspaceId: string,\n variableSetId: string,\n request: UpdateVariableSetRequest,\n ): Promise<VariableSet> {\n return await this.requestJson<VariableSet>(\n \"PATCH\",\n `/v1/workspaces/${workspaceId}/variable-sets/${variableSetId}`,\n request,\n );\n }\n\n async deleteVariableSet(workspaceId: string, variableSetId: string): Promise<void> {\n await this.requestJson<unknown>(\n \"DELETE\",\n `/v1/workspaces/${workspaceId}/variable-sets/${variableSetId}`,\n );\n }\n\n /** Create or rotate a variable. The value never comes back on any read. */\n async setVariableSetVariable(\n workspaceId: string,\n variableSetId: string,\n name: string,\n value: string,\n ): Promise<VariableSetVariableMetadata> {\n return await this.requestJson<VariableSetVariableMetadata>(\n \"PUT\",\n `/v1/workspaces/${workspaceId}/variable-sets/${variableSetId}/variables/${encodeURIComponent(name)}`,\n { value },\n );\n }\n\n async deleteVariableSetVariable(\n workspaceId: string,\n variableSetId: string,\n name: string,\n ): Promise<void> {\n await this.requestJson<unknown>(\n \"DELETE\",\n `/v1/workspaces/${workspaceId}/variable-sets/${variableSetId}/variables/${encodeURIComponent(name)}`,\n );\n }\n\n // --- Rigs ------------------------------------------------------------------\n // Workspace-scoped, versioned sandbox machine definitions. rigs:use gates read\n // + proposeRigChange; rigs:manage gates create / update / delete / activate.\n\n async listRigs(workspaceId: string): Promise<Rig[]> {\n return await this.requestJson<Rig[]>(\"GET\", `/v1/workspaces/${workspaceId}/rigs`);\n }\n\n async createRig(workspaceId: string, request: CreateRigRequest): Promise<Rig> {\n return await this.requestJson<Rig>(\"POST\", `/v1/workspaces/${workspaceId}/rigs`, request);\n }\n\n async getRig(workspaceId: string, rigId: string): Promise<Rig> {\n return await this.requestJson<Rig>(\"GET\", `/v1/workspaces/${workspaceId}/rigs/${rigId}`);\n }\n\n async updateRig(workspaceId: string, rigId: string, request: UpdateRigRequest): Promise<Rig> {\n return await this.requestJson<Rig>(\n \"PATCH\",\n `/v1/workspaces/${workspaceId}/rigs/${rigId}`,\n request,\n );\n }\n\n async deleteRig(workspaceId: string, rigId: string): Promise<void> {\n await this.requestJson<unknown>(\"DELETE\", `/v1/workspaces/${workspaceId}/rigs/${rigId}`);\n }\n\n async listRigVersions(workspaceId: string, rigId: string): Promise<RigVersion[]> {\n return await this.requestJson<RigVersion[]>(\n \"GET\",\n `/v1/workspaces/${workspaceId}/rigs/${rigId}/versions`,\n );\n }\n\n /** Roll the active version to an existing one (rollback / promote-activate). */\n async activateRigVersion(\n workspaceId: string,\n rigId: string,\n versionId: string,\n ): Promise<RigVersion> {\n return await this.requestJson<RigVersion>(\n \"POST\",\n `/v1/workspaces/${workspaceId}/rigs/${rigId}/versions/${versionId}/activate`,\n );\n }\n\n async listRigChanges(workspaceId: string, rigId: string): Promise<RigChange[]> {\n return await this.requestJson<RigChange[]>(\n \"GET\",\n `/v1/workspaces/${workspaceId}/rigs/${rigId}/changes`,\n );\n }\n\n /** Propose a change against the rig's active version (rigs:use). */\n async proposeRigChange(\n workspaceId: string,\n rigId: string,\n request: ProposeRigChangeRequest,\n ): Promise<RigChange> {\n return await this.requestJson<RigChange>(\n \"POST\",\n `/v1/workspaces/${workspaceId}/rigs/${rigId}/changes`,\n request,\n );\n }\n\n async getRigChange(workspaceId: string, rigId: string, changeId: string): Promise<RigChange> {\n return await this.requestJson<RigChange>(\n \"GET\",\n `/v1/workspaces/${workspaceId}/rigs/${rigId}/changes/${changeId}`,\n );\n }\n\n /**\n * Re-run verification for a change (rigs:use). Verification is asynchronous:\n * this returns the change immediately with status `verifying`; poll\n * `getRigChange`/`listRigChanges` for the terminal outcome + logs.\n */\n async verifyRigChange(workspaceId: string, rigId: string, changeId: string): Promise<RigChange> {\n return await this.requestJson<RigChange>(\n \"POST\",\n `/v1/workspaces/${workspaceId}/rigs/${rigId}/changes/${changeId}/verify`,\n );\n }\n\n /**\n * Promote a verified `definition_edit` change into a new active rig version\n * (rigs:manage). Only valid once the change's verification passed; returns the\n * newly minted version.\n */\n async promoteRigChange(\n workspaceId: string,\n rigId: string,\n changeId: string,\n ): Promise<RigVersion> {\n return await this.requestJson<RigVersion>(\n \"POST\",\n `/v1/workspaces/${workspaceId}/rigs/${rigId}/changes/${changeId}/promote`,\n );\n }\n\n /**\n * Re-run the active version's checks in a clean throwaway sandbox (rigs:use).\n * Asynchronous — returns the version id being verified; the outcome lands on\n * the version's audit trail.\n */\n async verifyRig(workspaceId: string, rigId: string): Promise<{ ok: boolean; versionId: string }> {\n return await this.requestJson<{ ok: boolean; versionId: string }>(\n \"POST\",\n `/v1/workspaces/${workspaceId}/rigs/${rigId}/verify`,\n );\n }\n\n /** @deprecated use listVariableSets */\n async listEnvironments(workspaceId: string): Promise<VariableSet[]> {\n return await this.listVariableSets(workspaceId);\n }\n\n /** @deprecated use createVariableSet */\n async createEnvironment(\n workspaceId: string,\n request: CreateVariableSetRequest,\n ): Promise<VariableSet> {\n return await this.createVariableSet(workspaceId, request);\n }\n\n /** @deprecated use getVariableSet */\n async getEnvironment(workspaceId: string, environmentId: string): Promise<VariableSet> {\n return await this.getVariableSet(workspaceId, environmentId);\n }\n\n /** @deprecated use updateVariableSet */\n async updateEnvironment(\n workspaceId: string,\n environmentId: string,\n request: UpdateVariableSetRequest,\n ): Promise<VariableSet> {\n return await this.updateVariableSet(workspaceId, environmentId, request);\n }\n\n /** @deprecated use deleteVariableSet */\n async deleteEnvironment(workspaceId: string, environmentId: string): Promise<void> {\n await this.deleteVariableSet(workspaceId, environmentId);\n }\n\n /** @deprecated use setVariableSetVariable */\n async setEnvironmentVariable(\n workspaceId: string,\n environmentId: string,\n name: string,\n value: string,\n ): Promise<VariableSetVariableMetadata> {\n return await this.setVariableSetVariable(workspaceId, environmentId, name, value);\n }\n\n /** @deprecated use deleteVariableSetVariable */\n async deleteEnvironmentVariable(\n workspaceId: string,\n environmentId: string,\n name: string,\n ): Promise<void> {\n await this.deleteVariableSetVariable(workspaceId, environmentId, name);\n }\n\n // --- Files -----------------------------------------------------------------------\n\n /** Step 1 of the upload flow: returns the pre-signed PUT target. */\n async beginFileUpload(\n workspaceId: string,\n request: CreateFileUploadRequest,\n ): Promise<CreateFileUploadResponse> {\n return await this.requestJson<CreateFileUploadResponse>(\n \"POST\",\n `/v1/workspaces/${workspaceId}/files/uploads`,\n request,\n );\n }\n\n /** Step 3 of the upload flow: server verifies the object and marks it ready. */\n async completeFileUpload(workspaceId: string, uploadId: string): Promise<FileAsset> {\n const response = await this.requestJson<CompleteFileUploadResponse>(\n \"POST\",\n `/v1/workspaces/${workspaceId}/files/uploads/${uploadId}/complete`,\n );\n return response.file;\n }\n\n /**\n * The whole upload flow as one call: begin -> PUT the bytes to the signed\n * URL (with its required headers; no API auth is sent to object storage)\n * -> complete. Returns the ready `FileAsset`.\n */\n async uploadFile(workspaceId: string, input: UploadFileInput): Promise<FileAsset> {\n // Snapshot mutable inputs before hashing so the digest always describes the\n // exact bytes later sent to object storage. Copy Uint8Array views into a\n // Blob so byte offsets/shared buffers can't leak surrounding bytes.\n const body: Blob | ArrayBuffer | string =\n input.data instanceof Uint8Array\n ? new Blob([input.data.slice()])\n : input.data instanceof ArrayBuffer\n ? input.data.slice(0)\n : input.data;\n const sizeBytes =\n typeof body === \"string\"\n ? new TextEncoder().encode(body).byteLength\n : body instanceof Blob\n ? body.size\n : body.byteLength;\n const sha256 = input.sha256 ?? (await sha256ForUpload(body));\n const upload = await this.beginFileUpload(workspaceId, {\n filename: input.filename,\n contentType: input.contentType,\n sizeBytes,\n sha256,\n });\n const putResponse = await this.fetchImpl(upload.putUrl, {\n method: \"PUT\",\n // Signed object-storage URLs carry their own short-lived authority.\n // Browser cookies and HTTP auth must never accompany this cross-origin\n // request: credentialed fetches are incompatible with wildcard CORS and\n // can leak ambient credentials to a caller-selected storage endpoint.\n credentials: \"omit\",\n // The backend's requiredHeaders already carry the canonical lowercase\n // `content-type` for every storage backend (Azure/S3/GCS). Do NOT also set\n // a `Content-Type` key here: WHATWG Headers treats the two casings as the\n // same header and comma-joins their values (e.g. \"text/plain, text/plain\"),\n // which the object store persists verbatim and COMPLETE then rejects (422),\n // and which breaks S3's presigned-URL signature.\n headers: { ...upload.requiredHeaders },\n body,\n });\n if (!putResponse.ok) {\n throw await apiErrorFromResponse(putResponse, { method: \"PUT\" });\n }\n return await this.completeFileUpload(workspaceId, upload.uploadId);\n }\n\n async getFile(workspaceId: string, fileId: string): Promise<FileAsset> {\n return await this.requestJson<FileAsset>(\n \"GET\",\n `/v1/workspaces/${workspaceId}/files/${fileId}`,\n );\n }\n\n /** Read provider-neutral retained evidence metadata; never returns a storage location. */\n async getRetainedArtifact(\n workspaceId: string,\n artifactId: string,\n ): Promise<RetainedArtifactMetadata> {\n return await this.requestJson<RetainedArtifactMetadata>(\n \"GET\",\n `/v1/workspaces/${workspaceId}/artifacts/${artifactId}`,\n );\n }\n\n /**\n * Read at most one authenticated retained-evidence range from the API. This\n * deliberately does not use the ordinary signed file-download URL.\n */\n async getRetainedArtifactContent(\n workspaceId: string,\n artifactId: string,\n options: RetainedArtifactContentOptions = {},\n ): Promise<RetainedArtifactContent> {\n if (options.range && (options.range.length > 128 || /[^\\x20-\\x7e]/.test(options.range))) {\n throw new RangeError(\"retained artifact range must be at most 128 printable ASCII bytes\");\n }\n const correlationId = crypto.randomUUID();\n const response = await this.fetchImpl(\n this.url(`/v1/workspaces/${workspaceId}/artifacts/${artifactId}/content`),\n {\n method: \"GET\",\n headers: {\n ...this.headers(correlationId),\n Accept: \"application/octet-stream\",\n ...(options.range ? { Range: options.range } : {}),\n },\n ...(options.signal ? { signal: options.signal } : {}),\n },\n );\n try {\n assertApiContractResponse(response);\n } catch (error) {\n await cancelResponseBody(response, \"retained artifact API contract mismatch\");\n throw error;\n }\n if (!response.ok) {\n throw await apiErrorFromResponse(response, {\n method: \"GET\",\n correlationId,\n });\n }\n if (response.status !== 200 && response.status !== 206) {\n await cancelResponseBody(response, \"unexpected retained artifact response status\");\n throw new OpenGeniApiError(response.status, \"unexpected retained artifact response status\");\n }\n if (response.headers.get(\"accept-ranges\") !== \"bytes\") {\n await cancelResponseBody(response, \"retained artifact response omitted byte-range support\");\n throw new OpenGeniApiError(502, \"retained artifact response omitted byte-range support\");\n }\n let declaredLength: number | null;\n try {\n declaredLength = parseBoundedContentLength(response.headers.get(\"content-length\"));\n } catch (error) {\n await cancelResponseBody(response, \"invalid retained artifact content-length\");\n throw error;\n }\n const bytes = await readBoundedResponseBytes(\n response,\n RETAINED_OUTPUT_MAX_PAGE_BYTES,\n declaredLength,\n );\n return {\n bytes,\n status: response.status,\n contentType: response.headers.get(\"content-type\") ?? \"application/octet-stream\",\n contentLength: bytes.byteLength,\n contentRange: response.headers.get(\"content-range\"),\n acceptRanges: \"bytes\",\n };\n }\n\n /** Mint a short-lived signed download URL for a ready file. */\n async createFileDownloadUrl(\n workspaceId: string,\n fileId: string,\n ): Promise<FileDownloadUrlResponse> {\n return await this.requestJson<FileDownloadUrlResponse>(\n \"POST\",\n `/v1/workspaces/${workspaceId}/files/${fileId}/download-url`,\n );\n }\n\n // --- Documents ----------------------------------------------------------------------\n\n async createDocumentBase(\n workspaceId: string,\n request: CreateDocumentBaseRequest,\n ): Promise<DocumentBase> {\n return await this.requestJson<DocumentBase>(\n \"POST\",\n `/v1/workspaces/${workspaceId}/document-bases`,\n request,\n );\n }\n\n async listDocumentBases(workspaceId: string): Promise<DocumentBase[]> {\n return await this.requestJson<DocumentBase[]>(\n \"GET\",\n `/v1/workspaces/${workspaceId}/document-bases`,\n );\n }\n\n async getDocumentBase(workspaceId: string, baseId: string): Promise<DocumentBase> {\n return await this.requestJson<DocumentBase>(\n \"GET\",\n `/v1/workspaces/${workspaceId}/document-bases/${baseId}`,\n );\n }\n\n /** Index an uploaded file into the base. The file must be `ready`. */\n async addDocument(\n workspaceId: string,\n baseId: string,\n request: AddDocumentRequest,\n ): Promise<Document> {\n return await this.requestJson<Document>(\n \"POST\",\n `/v1/workspaces/${workspaceId}/document-bases/${baseId}/documents`,\n request,\n );\n }\n\n async listDocuments(workspaceId: string, baseId: string): Promise<Document[]> {\n return await this.requestJson<Document[]>(\n \"GET\",\n `/v1/workspaces/${workspaceId}/document-bases/${baseId}/documents`,\n );\n }\n\n /**\n * Drop raw text or an already-uploaded file into the workspace's Default\n * base. When curation is enabled, it may name, summarize, categorize, and\n * (confidence permitting) file the document into the best-matching base;\n * provider=none leaves caller metadata and Default placement unchanged.\n */\n async createKnowledgeDrop(\n workspaceId: string,\n request: CreateKnowledgeDropRequest,\n ): Promise<Document> {\n return await this.requestJson<Document>(\n \"POST\",\n `/v1/workspaces/${workspaceId}/knowledge/drops`,\n request,\n );\n }\n\n /**\n * Move a document (and its indexed chunks) to another base. With no\n * targetBaseId, applies the document's stored curation suggestion.\n */\n async moveDocument(\n workspaceId: string,\n documentId: string,\n request: MoveDocumentRequest = {},\n ): Promise<Document> {\n return await this.requestJson<Document>(\n \"POST\",\n `/v1/workspaces/${workspaceId}/documents/${documentId}/move`,\n request,\n );\n }\n\n /** Retry indexing for a failed document. */\n async reindexDocument(\n workspaceId: string,\n baseId: string,\n documentId: string,\n ): Promise<Document> {\n return await this.requestJson<Document>(\n \"POST\",\n `/v1/workspaces/${workspaceId}/document-bases/${baseId}/documents/${documentId}/reindex`,\n );\n }\n\n /**\n * Delete a document from a base. Removes the document row and its indexed\n * chunks while leaving the uploaded file asset available for other uses.\n */\n async deleteDocument(workspaceId: string, baseId: string, documentId: string): Promise<void> {\n await this.requestVoid(\n \"DELETE\",\n `/v1/workspaces/${workspaceId}/document-bases/${baseId}/documents/${documentId}`,\n );\n }\n\n async searchDocuments(\n workspaceId: string,\n baseId: string,\n request: Omit<DocumentSearchRequest, \"baseIds\">,\n ): Promise<DocumentSearchResponse> {\n return await this.requestJson<DocumentSearchResponse>(\n \"POST\",\n `/v1/workspaces/${workspaceId}/document-bases/${baseId}/search`,\n request,\n );\n }\n\n async searchKnowledge(\n workspaceId: string,\n request: DocumentSearchRequest,\n ): Promise<DocumentSearchResponse> {\n return await this.requestJson<DocumentSearchResponse>(\n \"POST\",\n `/v1/workspaces/${workspaceId}/knowledge/search`,\n request,\n );\n }\n\n async listKnowledgeMemories(\n workspaceId: string,\n request: KnowledgeMemorySearchRequest = {},\n ): Promise<KnowledgeMemory[]> {\n const params = new URLSearchParams();\n if (request.query) params.set(\"query\", request.query);\n if (request.status) params.set(\"status\", request.status);\n if (request.kind) params.set(\"kind\", request.kind);\n if (request.scope) params.set(\"scope\", request.scope);\n if (request.limit) params.set(\"limit\", String(request.limit));\n const query = params.toString();\n return await this.requestJson<KnowledgeMemory[]>(\n \"GET\",\n `/v1/workspaces/${workspaceId}/knowledge/memories${query ? `?${query}` : \"\"}`,\n );\n }\n\n async getKnowledgeMemory(workspaceId: string, memoryId: string): Promise<KnowledgeMemory> {\n return await this.requestJson<KnowledgeMemory>(\n \"GET\",\n `/v1/workspaces/${workspaceId}/knowledge/memories/${memoryId}`,\n );\n }\n\n async createKnowledgeMemory(\n workspaceId: string,\n request: CreateKnowledgeMemoryRequest,\n ): Promise<KnowledgeMemory> {\n return await this.requestJson<KnowledgeMemory>(\n \"POST\",\n `/v1/workspaces/${workspaceId}/knowledge/memories`,\n request,\n );\n }\n\n async updateKnowledgeMemory(\n workspaceId: string,\n memoryId: string,\n request: UpdateKnowledgeMemoryRequest,\n ): Promise<KnowledgeMemory> {\n return await this.requestJson<KnowledgeMemory>(\n \"PATCH\",\n `/v1/workspaces/${workspaceId}/knowledge/memories/${memoryId}`,\n request,\n );\n }\n\n /** Hybrid (semantic + keyword) search over the workspace's agent-visible memory. */\n async searchWorkspaceMemories(\n workspaceId: string,\n request: WorkspaceMemorySearchRequest,\n ): Promise<WorkspaceMemorySearchResponse> {\n return await this.requestJson<WorkspaceMemorySearchResponse>(\n \"POST\",\n `/v1/workspaces/${workspaceId}/knowledge/memories/search`,\n request,\n );\n }\n\n /** Deep-merge a settings patch into the workspace (preserves unknown keys). */\n async updateWorkspaceSettings(\n workspaceId: string,\n request: UpdateWorkspaceSettingsRequest,\n ): Promise<Workspace> {\n return await this.requestJson<Workspace>(\n \"PATCH\",\n `/v1/workspaces/${workspaceId}/settings`,\n request,\n );\n }\n\n async setWorkspaceDefaultRig(\n workspaceId: string,\n request: SetWorkspaceDefaultRigRequest,\n ): Promise<Workspace> {\n return await this.requestJson<Workspace>(\n \"PUT\",\n `/v1/workspaces/${workspaceId}/default-rig`,\n request,\n );\n }\n\n // --- Capability packs ------------------------------------------------------------------\n\n /** Built-in + registered packs, with the workspace's installations. */\n async listPacks(workspaceId: string): Promise<ListPacksResponse> {\n return await this.requestJson<ListPacksResponse>(\"GET\", `/v1/workspaces/${workspaceId}/packs`);\n }\n\n /** Register (or replace) a workspace-scoped pack from a manifest. */\n async registerPack(\n workspaceId: string,\n manifest: RegisterCapabilityPackRequest,\n ): Promise<WorkspaceRegisteredPack> {\n return await this.requestJson<WorkspaceRegisteredPack>(\n \"POST\",\n `/v1/workspaces/${workspaceId}/packs`,\n manifest,\n );\n }\n\n async getPack(workspaceId: string, packId: string): Promise<GetPackResponse> {\n return await this.requestJson<GetPackResponse>(\n \"GET\",\n `/v1/workspaces/${workspaceId}/packs/${encodeURIComponent(packId)}`,\n );\n }\n\n async enablePack(\n workspaceId: string,\n packId: string,\n request: EnablePackRequest = {},\n ): Promise<PackInstallation> {\n return await this.requestJson<PackInstallation>(\n \"POST\",\n `/v1/workspaces/${workspaceId}/packs/${encodeURIComponent(packId)}/enable`,\n request,\n );\n }\n\n /** Unregister a workspace-scoped pack (built-in packs cannot be deleted). */\n async deletePack(workspaceId: string, packId: string): Promise<void> {\n await this.requestVoid(\n \"DELETE\",\n `/v1/workspaces/${workspaceId}/packs/${encodeURIComponent(packId)}`,\n );\n }\n\n async listPackInstallations(workspaceId: string): Promise<PackInstallation[]> {\n return await this.requestJson<PackInstallation[]>(\n \"GET\",\n `/v1/workspaces/${workspaceId}/packs/installations`,\n );\n }\n\n // --- Capabilities -------------------------------------------------------------------------\n\n async listCapabilities(workspaceId: string): Promise<CapabilityCatalogResponse> {\n return await this.requestJson<CapabilityCatalogResponse>(\n \"GET\",\n `/v1/workspaces/${workspaceId}/capabilities`,\n );\n }\n\n /** Add a manual capability catalog item (e.g. a remote MCP server). */\n async createCapability(\n workspaceId: string,\n request: CreateCapabilityCatalogItemRequest,\n ): Promise<CapabilityCatalogItem> {\n return await this.requestJson<CapabilityCatalogItem>(\n \"POST\",\n `/v1/workspaces/${workspaceId}/capabilities`,\n request,\n );\n }\n\n async enableCapability(\n workspaceId: string,\n capabilityId: string,\n request: EnableCapabilityRequest = {},\n ): Promise<CapabilityInstallation> {\n return await this.requestJson<CapabilityInstallation>(\n \"POST\",\n `/v1/workspaces/${workspaceId}/capabilities/${encodeURIComponent(capabilityId)}/enable`,\n request,\n );\n }\n\n async disableCapability(\n workspaceId: string,\n capabilityId: string,\n ): Promise<CapabilityInstallation> {\n return await this.requestJson<CapabilityInstallation>(\n \"POST\",\n `/v1/workspaces/${workspaceId}/capabilities/${encodeURIComponent(capabilityId)}/disable`,\n );\n }\n\n /** Search the official MCP registry for installable capabilities. */\n async discoverMcpCapabilities(\n workspaceId: string,\n options: { query?: string; limit?: number } = {},\n ): Promise<DiscoverMcpCapabilitiesResponse> {\n return await this.requestJson<DiscoverMcpCapabilitiesResponse>(\n \"GET\",\n `/v1/workspaces/${workspaceId}/capabilities/discovery/mcp-registry`,\n undefined,\n {\n ...(options.query !== undefined ? { query: options.query } : {}),\n ...(options.limit !== undefined ? { limit: String(options.limit) } : {}),\n },\n );\n }\n\n // --- Connections -------------------------------------------------------------------------------\n\n async listConnections(workspaceId: string): Promise<ConnectionMetadata[]> {\n const response = await this.requestJson<ListConnectionsResponse>(\n \"GET\",\n `/v1/workspaces/${workspaceId}/connections`,\n );\n return response.connections;\n }\n\n async createConnection(\n workspaceId: string,\n request: CreateConnectionRequest,\n ): Promise<ConnectionMetadata> {\n const response = await this.requestJson<ConnectionResponse>(\n \"POST\",\n `/v1/workspaces/${workspaceId}/connections`,\n request,\n );\n return response.connection;\n }\n\n /** Start the public Slack installation flow for the workspace-shared OpenGeni bot. */\n async startOpenGeniSlackBotInstall(\n workspaceId: string,\n request: OpenGeniSlackBotInstallRequest = {},\n ): Promise<OpenGeniSlackBotInstallStart> {\n return await this.requestJson<OpenGeniSlackBotInstallStart>(\n \"POST\",\n `/v1/workspaces/${workspaceId}/connections/slack-bot/install`,\n request,\n );\n }\n\n async listOpenGeniSlackReactionChannels(\n workspaceId: string,\n connectionId: string,\n cursor?: string,\n ): Promise<SlackReactionChannelListResponse> {\n const query = new URLSearchParams({ connectionId });\n if (cursor) query.set(\"cursor\", cursor);\n return await this.requestJson<SlackReactionChannelListResponse>(\n \"GET\",\n `/v1/workspaces/${workspaceId}/integrations/slack/reaction-channels?${query}`,\n );\n }\n\n async updateConnection(\n workspaceId: string,\n connectionId: string,\n request: UpdateConnectionRequest,\n ): Promise<ConnectionMetadata> {\n const response = await this.requestJson<ConnectionResponse>(\n \"PATCH\",\n `/v1/workspaces/${workspaceId}/connections/${connectionId}`,\n request,\n );\n return response.connection;\n }\n\n async deleteConnection(workspaceId: string, connectionId: string): Promise<ConnectionMetadata> {\n const response = await this.requestJson<ConnectionResponse>(\n \"DELETE\",\n `/v1/workspaces/${workspaceId}/connections/${connectionId}`,\n );\n return response.connection;\n }\n\n async disconnectGoogleDriveConnection(\n workspaceId: string,\n connectionId: string,\n request: GoogleDriveDisconnectRequest,\n ): Promise<ConnectionMetadata> {\n const response = await this.requestJson<ConnectionResponse>(\n \"DELETE\",\n `/v1/workspaces/${workspaceId}/connections/${connectionId}`,\n request,\n );\n return response.connection;\n }\n\n async transitionGoogleDriveLifecycle(\n workspaceId: string,\n connectionId: string,\n request: GoogleDriveLifecycleActionRequest,\n ): Promise<ConnectionMetadata> {\n const response = await this.requestJson<ConnectionResponse>(\n \"PATCH\",\n `/v1/workspaces/${workspaceId}/connections/google-drive/${connectionId}/lifecycle`,\n request,\n );\n return response.connection;\n }\n\n /** Start an OAuth connection flow; redirect the user to the returned `authorizationUrl`. */\n async startConnectionOAuth(\n workspaceId: string,\n request: OAuthStartRequest,\n options: OpenGeniRequestOptions = {},\n ): Promise<OAuthStartResponse> {\n return await this.requestJson<OAuthStartResponse>(\n \"POST\",\n `/v1/workspaces/${workspaceId}/connections/oauth/start`,\n request,\n {},\n options,\n );\n }\n\n /**\n * Start a first-party social OAuth flow (X / Reddit); redirect the user to\n * the returned `authorizationUrl`. The completed connection lands in\n * `listSocialConnections`.\n */\n async startSocialOAuth(\n workspaceId: string,\n request: SocialOAuthStartRequest,\n ): Promise<OAuthStartResponse> {\n return await this.requestJson<OAuthStartResponse>(\n \"POST\",\n `/v1/workspaces/${workspaceId}/social/oauth/start`,\n request,\n );\n }\n\n /** Connected social accounts (X / Reddit / pushed custom providers). */\n async listSocialConnections(workspaceId: string): Promise<SocialConnection[]> {\n return await this.requestJson<SocialConnection[]>(\n \"GET\",\n `/v1/workspaces/${workspaceId}/social/connections`,\n );\n }\n\n /** Drop the stored social OAuth credential and disable the connection. */\n async disconnectSocialConnection(\n workspaceId: string,\n connectionId: string,\n ): Promise<SocialConnection> {\n return await this.requestJson<SocialConnection>(\n \"DELETE\",\n `/v1/workspaces/${workspaceId}/social/connections/${connectionId}`,\n );\n }\n\n /** Public, immutably-cached URL for a catalog item's logo, or null when the item has none. */\n catalogAssetUrl(logoAssetPath: string | null): string | null {\n return logoAssetPath ? `${this.baseUrl}/v1/${logoAssetPath}` : null;\n }\n\n // --- GitHub ----------------------------------------------------------------------------------\n\n /** GitHub App server configuration plus truthful workspace binding status. */\n async getGitHubApp(workspaceId: string): Promise<GitHubAppInfo> {\n return await this.requestJson<GitHubAppInfo>(\"GET\", `/v1/workspaces/${workspaceId}/github/app`);\n }\n\n /** Build the GitHub owner-consent entry URL for fresh workspace-bound state. */\n githubConnectUrl(workspaceId: string, state: string): string {\n return this.url(`/v1/workspaces/${workspaceId}/github/connect`, { state });\n }\n\n async listGitHubRepositories(workspaceId: string): Promise<GitHubRepositoriesResponse> {\n return await this.requestJson<GitHubRepositoriesResponse>(\n \"GET\",\n `/v1/workspaces/${workspaceId}/github/repositories`,\n );\n }\n\n /** Re-sync the installation's repository list from GitHub. */\n async syncGitHubRepositories(workspaceId: string): Promise<GitHubRepositoriesResponse> {\n return await this.requestJson<GitHubRepositoriesResponse>(\n \"POST\",\n `/v1/workspaces/${workspaceId}/github/repositories/sync`,\n );\n }\n\n /** Remove one workspace binding without uninstalling the GitHub App itself. */\n async unlinkGitHubInstallation(workspaceId: string, installationId: number): Promise<void> {\n await this.requestVoid(\n \"DELETE\",\n `/v1/workspaces/${workspaceId}/github/installations/${installationId}`,\n );\n }\n\n /** Build a GitHub App manifest + the GitHub URL to submit it to. */\n async createGitHubAppManifest(\n workspaceId: string,\n request: CreateGitHubAppManifestRequest = {},\n ): Promise<CreateGitHubAppManifestResponse> {\n return await this.requestJson<CreateGitHubAppManifestResponse>(\n \"POST\",\n `/v1/workspaces/${workspaceId}/github/app-manifest`,\n request,\n );\n }\n\n // --- API keys ----------------------------------------------------------------------------------\n\n async listApiKeys(workspaceId: string): Promise<ApiKey[]> {\n const response = await this.requestJson<ListApiKeysResponse>(\n \"GET\",\n `/v1/workspaces/${workspaceId}/api-keys`,\n );\n return response.apiKeys;\n }\n\n /** The returned `token` is shown once; only its prefix is stored. */\n async createApiKey(\n workspaceId: string,\n request: CreateApiKeyRequest,\n ): Promise<CreateApiKeyResponse> {\n return await this.requestJson<CreateApiKeyResponse>(\n \"POST\",\n `/v1/workspaces/${workspaceId}/api-keys`,\n request,\n );\n }\n\n /** Revoke an API key. Returns the revoked key. */\n async deleteApiKey(workspaceId: string, apiKeyId: string): Promise<ApiKey> {\n return await this.requestJson<ApiKey>(\n \"DELETE\",\n `/v1/workspaces/${workspaceId}/api-keys/${apiKeyId}`,\n );\n }\n\n // --- Billing (account-scoped) --------------------------------------------------------------------\n\n async getBilling(options: { accountId?: string } = {}): Promise<BillingSummary> {\n return await this.requestJson<BillingSummary>(\"GET\", \"/v1/billing\", undefined, {\n ...(options.accountId !== undefined ? { accountId: options.accountId } : {}),\n });\n }\n\n async getBillingUsage(\n options: { accountId?: string; workspaceId?: string } = {},\n ): Promise<BillingUsageResponse> {\n return await this.requestJson<BillingUsageResponse>(\"GET\", \"/v1/billing/usage\", undefined, {\n ...(options.accountId !== undefined ? { accountId: options.accountId } : {}),\n ...(options.workspaceId !== undefined ? { workspaceId: options.workspaceId } : {}),\n });\n }\n\n async getWorkspaceInsights(\n workspaceId: string,\n options: {\n range?: InsightsRange;\n provider?: string;\n model?: string;\n } = {},\n ): Promise<WorkspaceInsightsResponse> {\n return await this.requestJson<WorkspaceInsightsResponse>(\n \"GET\",\n `/v1/workspaces/${workspaceId}/insights`,\n undefined,\n {\n range: options.range ?? \"week\",\n ...(options.provider !== undefined ? { provider: options.provider } : {}),\n ...(options.model !== undefined ? { model: options.model } : {}),\n },\n );\n }\n\n async getBillingEntitlements(\n options: { accountId?: string } = {},\n ): Promise<BillingEntitlementsResponse> {\n return await this.requestJson<BillingEntitlementsResponse>(\n \"GET\",\n \"/v1/billing/entitlements\",\n undefined,\n {\n ...(options.accountId !== undefined ? { accountId: options.accountId } : {}),\n },\n );\n }\n\n /** Start a Stripe checkout for prepaid credits. */\n async createBillingCheckout(request: CreateCheckoutRequest): Promise<CreateCheckoutResponse> {\n return await this.requestJson<CreateCheckoutResponse>(\"POST\", \"/v1/billing/checkout\", request);\n }\n\n // --- Internals -------------------------------------------------------------\n\n private headers(correlationId?: string): Record<string, string> {\n const extra =\n typeof this.options.headers === \"function\" ? this.options.headers() : this.options.headers;\n return {\n ...(this.options.apiKey ? { Authorization: `Bearer ${this.options.apiKey}` } : {}),\n ...extra,\n [OPENGENI_API_CONTRACT_HEADER]: OPENGENI_API_CONTRACT_REVISION,\n ...(correlationId ? { [OPENGENI_CORRELATION_HEADER]: correlationId } : {}),\n };\n }\n\n private url(path: string, query: Record<string, string> = {}): string {\n const params = new URLSearchParams(query).toString();\n return `${this.baseUrl}${path}${params ? `?${params}` : \"\"}`;\n }\n\n // --- Codex (ChatGPT) subscription (workspace-scoped) --------------------------------------------\n\n /** Connection state + the codex models the workspace may select (empty until connected). */\n async codexStatus(workspaceId: string): Promise<CodexConnectionStatus> {\n return await this.requestJson<CodexConnectionStatus>(\n \"GET\",\n `/v1/workspaces/${workspaceId}/codex/status`,\n );\n }\n\n /** Begin device-code login: show `userCode` at `verificationUri`, then poll with `state`. */\n async codexConnectStart(workspaceId: string): Promise<CodexConnectStart> {\n return await this.requestJson<CodexConnectStart>(\n \"POST\",\n `/v1/workspaces/${workspaceId}/codex/connect/start`,\n );\n }\n\n /** Poll device-code authorization with the `state` from {@link codexConnectStart}. */\n async codexConnectPoll(workspaceId: string, state: string): Promise<CodexConnectPoll> {\n return await this.requestJson<CodexConnectPoll>(\n \"POST\",\n `/v1/workspaces/${workspaceId}/codex/connect/poll`,\n { state },\n );\n }\n\n /** Remaining usage / limits for the connected (ACTIVE) subscription. Back-compat. */\n async codexUsage(workspaceId: string): Promise<CodexUsage> {\n return await this.requestJson<CodexUsage>(\"GET\", `/v1/workspaces/${workspaceId}/codex/usage`);\n }\n\n /** Live per-account usage read (refreshes THIS account's bearer; writes the cache). */\n async codexAccountUsage(workspaceId: string, accountId: string): Promise<CodexUsage> {\n return await this.requestJson<CodexUsage>(\n \"GET\",\n `/v1/workspaces/${workspaceId}/codex/accounts/${accountId}/usage`,\n );\n }\n\n /** Batched live refresh across every connected account, keyed by credential id. */\n async refreshCodexUsage(workspaceId: string): Promise<{ usage: CodexUsageMap }> {\n return await this.requestJson<{ usage: CodexUsageMap }>(\n \"POST\",\n `/v1/workspaces/${workspaceId}/codex/usage/refresh`,\n );\n }\n\n /** Live independently-settled quota + reset-credit overview for every account. */\n async codexOverview(workspaceId: string): Promise<CodexOverviewResponse> {\n return await this.requestJson<CodexOverviewResponse>(\n \"GET\",\n `/v1/workspaces/${workspaceId}/codex/overview`,\n );\n }\n\n /** Disconnect ALL accounts (legacy workspace-wide). Prefer `disconnectCodexAccount`. */\n async codexDisconnect(workspaceId: string): Promise<{ disconnected: boolean }> {\n return await this.requestJson<{ disconnected: boolean }>(\n \"DELETE\",\n `/v1/workspaces/${workspaceId}/codex`,\n );\n }\n\n /** List every connected Codex account + the workspace active pointer + settings. */\n async listCodexAccounts(workspaceId: string): Promise<CodexAccountsResponse> {\n return await this.requestJson<CodexAccountsResponse>(\n \"GET\",\n `/v1/workspaces/${workspaceId}/codex/accounts`,\n );\n }\n\n /** Switch the workspace ACTIVE Codex account (the one unpinned sessions use). */\n async activateCodexAccount(\n workspaceId: string,\n accountId: string,\n ): Promise<{ activated: boolean; accountId: string }> {\n return await this.requestJson<{ activated: boolean; accountId: string }>(\n \"POST\",\n `/v1/workspaces/${workspaceId}/codex/accounts/${accountId}/activate`,\n );\n }\n\n /** Designate one owner-connected subscription for Apps only. */\n async designateCodexAppsAccount(\n workspaceId: string,\n accountId: string,\n expectedVersion: number,\n ): Promise<CodexAppsUpdate> {\n return await this.requestJson<CodexAppsUpdate>(\n \"POST\",\n `/v1/workspaces/${workspaceId}/codex/apps`,\n { accountId, expectedVersion },\n );\n }\n\n /** Clear the Apps credential without changing any inference selection. */\n async clearCodexAppsAccount(\n workspaceId: string,\n expectedVersion: number,\n ): Promise<CodexAppsUpdate> {\n return await this.requestJson<CodexAppsUpdate>(\n \"DELETE\",\n `/v1/workspaces/${workspaceId}/codex/apps`,\n { expectedVersion },\n );\n }\n\n /** Enable or disable Codex auto-rotation. Returns the effective settings. */\n async setCodexRotationSettings(\n workspaceId: string,\n patch: {\n rotationEnabled?: boolean;\n /** @deprecated Rotation now has one effective sharded strategy. */\n rotationStrategy?: CodexRotationSettings[\"rotationStrategy\"];\n },\n ): Promise<CodexRotationSettings> {\n return await this.requestJson<CodexRotationSettings>(\n \"PATCH\",\n `/v1/workspaces/${workspaceId}/codex/settings`,\n patch,\n );\n }\n\n /** Toggle only NEW automatic allocations under independent allocator OCC. */\n async setCodexAccountAllocator(\n workspaceId: string,\n accountId: string,\n input: { enabled: boolean; expectedVersion: number },\n ): Promise<CodexAllocatorUpdate> {\n return await this.requestJson<CodexAllocatorUpdate>(\n \"PATCH\",\n `/v1/workspaces/${workspaceId}/codex/accounts/${accountId}/allocator`,\n input,\n );\n }\n\n /** Disconnect ONE Codex account by id (re-picks active when the removed one was active). */\n async disconnectCodexAccount(\n workspaceId: string,\n accountId: string,\n ): Promise<{ disconnected: boolean; newActiveId: string | null }> {\n return await this.requestJson<{\n disconnected: boolean;\n newActiveId: string | null;\n }>(\"DELETE\", `/v1/workspaces/${workspaceId}/codex/accounts/${accountId}`);\n }\n\n /** Rename a Codex account (label only in P1). */\n async renameCodexAccount(\n workspaceId: string,\n accountId: string,\n label: string | null,\n ): Promise<CodexAccount> {\n return await this.requestJson<CodexAccount>(\n \"PATCH\",\n `/v1/workspaces/${workspaceId}/codex/accounts/${accountId}`,\n { label },\n );\n }\n\n /** Pin (or unpin via \"auto\") a session's Codex account. Applies on the next turn. */\n async pinSessionCodexAccount(\n workspaceId: string,\n sessionId: string,\n target: string,\n ): Promise<{ pinned: string }> {\n return await this.requestJson<{ pinned: string }>(\n \"POST\",\n `/v1/workspaces/${workspaceId}/sessions/${sessionId}/codex-account`,\n { target },\n );\n }\n\n protected async requestJson<T>(\n method: string,\n path: string,\n body?: unknown,\n query: Record<string, string> = {},\n options: OpenGeniRequestOptions = {},\n ): Promise<T> {\n const correlationId = crypto.randomUUID();\n let response: Response;\n try {\n response = await this.fetchImpl(this.url(path, query), {\n method,\n headers: {\n ...this.headers(correlationId),\n Accept: \"application/json\",\n ...(body !== undefined ? { \"Content-Type\": \"application/json\" } : {}),\n },\n ...(body !== undefined ? { body: JSON.stringify(body) } : {}),\n ...(options.signal ? { signal: options.signal } : {}),\n });\n } catch (error) {\n if (isMutationMethod(method)) {\n throw mutationTransportError(correlationId);\n }\n throw error;\n }\n assertApiContractResponse(response);\n if (!response.ok) {\n throw await apiErrorFromResponse(response, { method, correlationId });\n }\n await assertJsonResponse(response, { method, correlationId });\n try {\n return (await response.json()) as T;\n } catch (error) {\n if (isMutationMethod(method)) {\n throw mutationTransportError(correlationId);\n }\n throw error;\n }\n }\n\n /** Like `requestJson` for endpoints that respond with no body (204). */\n private async requestVoid(method: string, path: string, body?: unknown): Promise<void> {\n const correlationId = crypto.randomUUID();\n let response: Response;\n try {\n response = await this.fetchImpl(this.url(path), {\n method,\n headers: {\n ...this.headers(correlationId),\n Accept: \"application/json\",\n ...(body !== undefined ? { \"Content-Type\": \"application/json\" } : {}),\n },\n ...(body !== undefined ? { body: JSON.stringify(body) } : {}),\n });\n } catch (error) {\n if (isMutationMethod(method)) {\n throw mutationTransportError(correlationId);\n }\n throw error;\n }\n assertApiContractResponse(response);\n if (!response.ok) {\n throw await apiErrorFromResponse(response, { method, correlationId });\n }\n }\n}\n\nfunction assertApiContractResponse(response: Response): void {\n const actual = response.headers.get(OPENGENI_API_CONTRACT_HEADER);\n if (actual && actual !== OPENGENI_API_CONTRACT_REVISION) {\n throw new OpenGeniApiContractMismatchError(OPENGENI_API_CONTRACT_REVISION, actual);\n }\n}\n\nfunction isTranscribeAudioResponse(value: unknown): value is TranscribeAudioResponse {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return false;\n const record = value as Record<string, unknown>;\n return (\n typeof record.text === \"string\" &&\n Array.isArray(record.languages) &&\n record.languages.every((language) => typeof language === \"string\")\n );\n}\n\nfunction isUploadTranscriptionRecordingChunkResponse(\n value: unknown,\n): value is UploadTranscriptionRecordingChunkResponse {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return false;\n const record = value as Record<string, unknown>;\n if (!isTranscriptionRecordingResponse({ recording: record.recording, segments: [] })) {\n return false;\n }\n if (!record.chunk || typeof record.chunk !== \"object\" || Array.isArray(record.chunk)) {\n return false;\n }\n const chunk = record.chunk as Record<string, unknown>;\n return (\n typeof chunk.chunkNumber === \"number\" &&\n typeof chunk.byteLength === \"number\" &&\n typeof chunk.sha256 === \"string\" &&\n typeof chunk.startMilliseconds === \"number\" &&\n typeof chunk.durationMilliseconds === \"number\" &&\n typeof chunk.deduplicated === \"boolean\"\n );\n}\n\nfunction isTranscriptionRecordingResponse(value: unknown): value is TranscriptionRecordingResponse {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return false;\n const response = value as Record<string, unknown>;\n if (\n !response.recording ||\n typeof response.recording !== \"object\" ||\n Array.isArray(response.recording)\n ) {\n return false;\n }\n const recording = response.recording as Record<string, unknown>;\n return (\n typeof recording.id === \"string\" &&\n typeof recording.workspaceId === \"string\" &&\n typeof recording.mimeType === \"string\" &&\n typeof recording.state === \"string\" &&\n typeof recording.nextChunkNumber === \"number\" &&\n typeof recording.chunkCount === \"number\" &&\n typeof recording.totalBytes === \"number\" &&\n typeof recording.totalDurationMilliseconds === \"number\" &&\n typeof recording.segmentCount === \"number\" &&\n typeof recording.completedSegmentCount === \"number\" &&\n (recording.transcriptText === null || typeof recording.transcriptText === \"string\") &&\n Array.isArray(recording.languages) &&\n (recording.errorCode === null || typeof recording.errorCode === \"string\") &&\n typeof recording.retryable === \"boolean\" &&\n typeof recording.objectsCleaned === \"boolean\" &&\n typeof recording.createdAt === \"string\" &&\n typeof recording.updatedAt === \"string\" &&\n typeof recording.expiresAt === \"string\" &&\n (response.retryAfterMilliseconds === undefined ||\n (typeof response.retryAfterMilliseconds === \"number\" &&\n Number.isInteger(response.retryAfterMilliseconds) &&\n response.retryAfterMilliseconds > 0 &&\n response.retryAfterMilliseconds <= 60_000)) &&\n Array.isArray(response.segments)\n );\n}\n\nfunction transcriptionRecordingResponse(value: unknown): TranscriptionRecordingResponse {\n if (isTranscriptionRecordingResponse(value)) return value;\n throw new OpenGeniApiError(502, \"Invalid transcription recording response.\", {\n code: \"invalid_response\",\n });\n}\n\nfunction isTranscriptionRecordingListResponse(\n value: unknown,\n): value is TranscriptionRecordingListResponse {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return false;\n const recordings = (value as Record<string, unknown>).recordings;\n return (\n Array.isArray(recordings) &&\n recordings.length <= 50 &&\n recordings.every((recording) => isTranscriptionRecordingResponse({ recording, segments: [] }))\n );\n}\n\nfunction filenameForAudioMimeType(mimeType: string): string {\n const bare = mimeType.trim().toLowerCase().split(\";\")[0] ?? \"audio/webm\";\n switch (bare) {\n case \"audio/mp4\":\n case \"audio/m4a\":\n return \"audio.mp4\";\n case \"audio/ogg\":\n return \"audio.ogg\";\n case \"audio/mpeg\":\n case \"audio/mp3\":\n return \"audio.mp3\";\n case \"audio/wav\":\n case \"audio/x-wav\":\n return \"audio.wav\";\n case \"audio/webm\":\n default:\n return \"audio.webm\";\n }\n}\n\nconst API_ERROR_MAX_BYTES = 16 * 1024;\n\ntype ApiErrorRequestContext = {\n method: string;\n correlationId?: string | undefined;\n};\n\nasync function apiErrorFromResponse(\n response: Response,\n context: ApiErrorRequestContext,\n): Promise<OpenGeniApiError> {\n return new OpenGeniApiError(response.status, await readBoundedJsonErrorBody(response), {\n correlationId: response.headers.get(OPENGENI_CORRELATION_HEADER) ?? context.correlationId,\n mutation: isMutationMethod(context.method),\n });\n}\n\nasync function assertJsonResponse(\n response: Response,\n context: ApiErrorRequestContext,\n): Promise<void> {\n if (isJsonContentType(response.headers.get(\"content-type\"))) return;\n await cancelResponseBody(response, \"unexpected non-JSON API response\");\n throw new OpenGeniApiError(502, \"\", {\n code: \"upstream_unavailable\",\n retryable: true,\n correlationId: response.headers.get(OPENGENI_CORRELATION_HEADER) ?? context.correlationId,\n outcomeUnknown: isMutationMethod(context.method),\n displayMessage: \"OpenGeni is temporarily unavailable — retry.\",\n });\n}\n\nasync function readBoundedJsonErrorBody(response: Response): Promise<string> {\n if (!isJsonContentType(response.headers.get(\"content-type\"))) {\n await cancelResponseBody(response, \"discarding API error body\");\n return \"\";\n }\n if (Number(response.headers.get(\"content-length\")) > API_ERROR_MAX_BYTES) {\n await cancelResponseBody(response, \"discarding API error body\");\n return \"\";\n }\n try {\n return new TextDecoder().decode(\n await readBoundedResponseBytes(response, API_ERROR_MAX_BYTES, null),\n );\n } catch {\n return \"\";\n }\n}\n\nfunction isJsonContentType(value: string | null): boolean {\n return /^(application\\/json|[^;]+\\+json)\\s*(;|$)/i.test(value ?? \"\");\n}\n\nfunction isMutationMethod(method: string): boolean {\n return method !== \"GET\" && method !== \"HEAD\" && method !== \"OPTIONS\";\n}\n\nfunction mutationTransportError(correlationId: string): OpenGeniApiError {\n return new OpenGeniApiError(0, \"\", {\n code: \"network_error\",\n retryable: true,\n correlationId,\n outcomeUnknown: true,\n mutation: true,\n displayMessage: \"OpenGeni could not confirm the request — reconcile before retrying.\",\n });\n}\n\nasync function sha256ForUpload(body: Blob | ArrayBuffer | string): Promise<string> {\n const bytes =\n typeof body === \"string\"\n ? new TextEncoder().encode(body)\n : body instanceof Blob\n ? new Uint8Array(await body.arrayBuffer())\n : new Uint8Array(body);\n const digest = await globalThis.crypto.subtle.digest(\"SHA-256\", bytes);\n return [...new Uint8Array(digest)].map((byte) => byte.toString(16).padStart(2, \"0\")).join(\"\");\n}\n\nasync function cancelResponseBody(response: Response, reason: string): Promise<void> {\n await response.body?.cancel(reason).catch(() => undefined);\n}\n\nfunction parseBoundedContentLength(value: string | null): number | null {\n if (value === null) return null;\n if (!/^\\d+$/.test(value)) {\n throw new OpenGeniApiError(502, \"invalid retained artifact content-length\");\n }\n const length = Number(value);\n if (!Number.isSafeInteger(length) || length > RETAINED_OUTPUT_MAX_PAGE_BYTES) {\n throw new OpenGeniApiError(502, \"retained artifact response exceeds the SDK byte limit\");\n }\n return length;\n}\n\nasync function readBoundedResponseBytes(\n response: Response,\n maxBytes: number,\n expectedBytes: number | null,\n): Promise<Uint8Array> {\n if (!response.body) {\n if (expectedBytes !== null && expectedBytes !== 0) {\n throw new OpenGeniApiError(502, \"retained artifact response length mismatch\");\n }\n return new Uint8Array();\n }\n const reader = response.body.getReader();\n const chunks: Uint8Array[] = [];\n let totalBytes = 0;\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n totalBytes += value.byteLength;\n if (totalBytes > maxBytes) {\n await reader\n .cancel(\"retained artifact response exceeded the SDK byte limit\")\n .catch(() => undefined);\n throw new OpenGeniApiError(502, \"retained artifact response exceeds the SDK byte limit\");\n }\n chunks.push(value);\n }\n } finally {\n reader.releaseLock();\n }\n if (expectedBytes !== null && totalBytes !== expectedBytes) {\n throw new OpenGeniApiError(502, \"retained artifact response length mismatch\");\n }\n const bytes = new Uint8Array(totalBytes);\n let offset = 0;\n for (const chunk of chunks) {\n bytes.set(chunk, offset);\n offset += chunk.byteLength;\n }\n return bytes;\n}\n","/**\n * Framework- and transport-agnostic speech-to-text capability contract.\n *\n * Audio transport, microphone access, credentials, and provider SDKs belong to\n * host-supplied adapters. This module deliberately contains no browser globals\n * and no provider implementation.\n */\n\nimport type { WorkspaceVoiceInputSettings } from \"./types\";\n\nexport type TranscriptionCredentialMode = \"managed\" | \"byok\";\n\nexport type WorkspaceTranscriptionTarget = {\n provider: string;\n model: string | null;\n credentialMode: TranscriptionCredentialMode;\n /** Workspace-scoped connection reference. This is never a secret. */\n credentialConnectionId: string | null;\n region: string | null;\n};\n\nexport type WorkspaceTranscriptionPolicy = {\n enabled: boolean;\n /** Exact admin-accepted policy identity; required whenever enabled. */\n acceptanceId: string | null;\n primary: WorkspaceTranscriptionTarget | null;\n /** Explicit language preference. Required when automatic detection is not accepted. */\n language: string | null;\n /** Whether the accepted adapter may automatically detect the spoken language. */\n autoDetectLanguage: boolean;\n /** Whether the accepted adapter may identify distinct speakers. */\n diarization: {\n enabled: boolean;\n maxSpeakers: number | null;\n };\n retention: {\n mode: \"none\" | \"provider-policy\";\n maxDays: number | null;\n };\n privacy: {\n allowProviderLogging: boolean;\n allowProviderTraining: boolean;\n };\n fallback: {\n mode: \"disabled\" | \"explicit\";\n targets: WorkspaceTranscriptionTarget[];\n };\n cost: {\n currency: \"USD\";\n maxPerHour: number | null;\n maxPerMonth: number | null;\n };\n};\n\nexport const DEFAULT_WORKSPACE_TRANSCRIPTION_POLICY: WorkspaceTranscriptionPolicy = {\n enabled: false,\n acceptanceId: null,\n primary: null,\n language: null,\n autoDetectLanguage: false,\n diarization: { enabled: false, maxSpeakers: null },\n retention: { mode: \"none\", maxDays: null },\n privacy: { allowProviderLogging: false, allowProviderTraining: false },\n fallback: { mode: \"disabled\", targets: [] },\n cost: { currency: \"USD\", maxPerHour: null, maxPerMonth: null },\n};\n\nexport type TranscriptionAdapterDescriptor = {\n provider: string;\n model: string | null;\n credentialMode: TranscriptionCredentialMode;\n region: string | null;\n};\n\nexport type TranscriptionTargetSelection =\n | { kind: \"primary\" }\n | { kind: \"fallback\"; index: number };\n\nexport type TranscriptionPolicyBlockReason =\n | \"disabled\"\n | \"unaccepted\"\n | \"target_missing\"\n | \"fallback_disabled\"\n | \"fallback_unaccepted\"\n | \"provider_mismatch\"\n | \"model_mismatch\"\n | \"credential_mode_mismatch\"\n | \"region_mismatch\";\n\nexport type TranscriptionAuthorization =\n | {\n authorized: true;\n acceptanceId: string;\n target: WorkspaceTranscriptionTarget;\n selection: TranscriptionTargetSelection;\n }\n | { authorized: false; reason: TranscriptionPolicyBlockReason };\n\nexport type TranscriptionLifecycleStatus =\n | \"idle\"\n | \"requesting-permission\"\n | \"listening\"\n | \"reconnecting\"\n | \"cancelling\"\n | \"closed\"\n | \"error\";\n\nexport type TranscriptionErrorCode =\n | \"permission_denied\"\n | \"not_supported\"\n | \"network\"\n | \"provider\"\n | \"policy_blocked\"\n | \"timeout\"\n | \"cancelled\"\n | \"unavailable\"\n | \"too_large\"\n | \"invalid_audio\"\n | \"unknown\";\n\n/** Native browser voice input defaults to the configured deployment capability. */\nexport function resolveWorkspaceVoiceInputEnabled(settings: unknown): boolean | null {\n if (!isRecord(settings)) return null;\n const voiceInput = settings.voiceInput;\n if (isRecord(voiceInput) && typeof voiceInput.enabled === \"boolean\") {\n return (voiceInput as WorkspaceVoiceInputSettings).enabled;\n }\n const legacy = settings.transcription;\n return isRecord(legacy) && typeof legacy.enabled === \"boolean\" ? legacy.enabled : null;\n}\n\nexport type TranscriptionTimeSpan = {\n startMilliseconds: number;\n endMilliseconds: number;\n};\n\nexport type TranscriptionSpeaker = {\n /** Provider-neutral identity stable within the local transcription session. */\n id: string;\n label?: string | undefined;\n};\n\nexport type TranscriptionWord = {\n text: string;\n span: TranscriptionTimeSpan;\n confidence?: number | undefined;\n speaker?: TranscriptionSpeaker | undefined;\n};\n\n/** Optional result detail; adapters omit fields their provider cannot supply. */\nexport type TranscriptionResultMetadata = {\n detectedLanguage?: string | undefined;\n span?: TranscriptionTimeSpan | undefined;\n confidence?: number | undefined;\n speaker?: TranscriptionSpeaker | undefined;\n words?: TranscriptionWord[] | undefined;\n};\n\nexport type TranscriptionDiagnostic = {\n operation: \"start\" | \"session\" | \"cancel\" | \"close\";\n code: TranscriptionErrorCode;\n /** Diagnostic-only detail. React sanitizes and bounds this before forwarding it. */\n detail: string;\n};\n\ntype TranscriptionEventBase = {\n /** Stable across reconnects and explicitly accepted fallback attempts. */\n localSessionId: string;\n /** Adapter-monotonic across the entire local session, including replay. */\n sequence: number;\n occurredAt: string;\n};\n\nexport type TranscriptionEvent =\n | (TranscriptionEventBase & { type: \"permission.requested\" })\n | (TranscriptionEventBase & {\n type: \"session.opened\";\n providerSessionId: string;\n })\n | (TranscriptionEventBase & {\n type: \"transcript.partial\";\n segmentId: string;\n text: string;\n metadata?: TranscriptionResultMetadata | undefined;\n })\n | (TranscriptionEventBase & {\n type: \"transcript.final\";\n segmentId: string;\n text: string;\n /** Stable provider/coordinator acceptance identity used for dedupe. */\n providerAcceptanceId: string;\n metadata?: TranscriptionResultMetadata | undefined;\n })\n | (TranscriptionEventBase & {\n type: \"usage\";\n audioMilliseconds: number;\n costUsd: number | null;\n })\n | (TranscriptionEventBase & {\n type: \"session.reconnecting\";\n attempt: number;\n reason: string;\n })\n | (TranscriptionEventBase & {\n type: \"session.error\";\n code: TranscriptionErrorCode;\n recoverable: boolean;\n })\n | (TranscriptionEventBase & {\n type: \"session.closed\";\n reason: \"completed\" | \"cancelled\" | \"error\" | \"replaced\";\n });\n\nexport type TranscriptionSessionRequest = {\n localSessionId: string;\n policyAcceptanceId: string;\n selection: TranscriptionTargetSelection;\n target: WorkspaceTranscriptionTarget;\n language: string | null;\n autoDetectLanguage: boolean;\n diarization: WorkspaceTranscriptionPolicy[\"diarization\"];\n retention: WorkspaceTranscriptionPolicy[\"retention\"];\n privacy: WorkspaceTranscriptionPolicy[\"privacy\"];\n cost: WorkspaceTranscriptionPolicy[\"cost\"];\n /** A replacement/reconnect adapter must emit events above this floor. */\n sequenceFloor: number;\n};\n\nexport type TranscriptionEventListener = (event: TranscriptionEvent) => void;\n\nexport type TranscriptionAdapterStartContext = {\n /** Aborted on local cancellation, policy replacement, timeout, or unmount. */\n signal: AbortSignal;\n /** Non-UI observability seam; callers receive only bounded, redacted detail. */\n reportDiagnostic: (diagnostic: TranscriptionDiagnostic) => void;\n};\n\nexport type TranscriptionSession = {\n readonly localSessionId: string;\n cancel(reason?: string): Promise<void>;\n close(): Promise<void>;\n};\n\nexport type TranscriptionAdapter = {\n readonly descriptor: TranscriptionAdapterDescriptor;\n start(\n request: TranscriptionSessionRequest,\n listener: TranscriptionEventListener,\n context: TranscriptionAdapterStartContext,\n ): Promise<TranscriptionSession>;\n};\n\n/** Invalid or absent settings always resolve to the fail-closed default. */\nexport function resolveWorkspaceTranscriptionPolicy(\n settings: unknown,\n): WorkspaceTranscriptionPolicy {\n if (!isRecord(settings)) return cloneDefaultPolicy();\n const candidate = settings.transcription;\n if (!isWorkspaceTranscriptionPolicy(candidate)) return cloneDefaultPolicy();\n return {\n ...candidate,\n primary: candidate.primary ? normalizeTarget(candidate.primary) : null,\n language: candidate.language?.trim() ?? null,\n diarization: { ...candidate.diarization },\n retention: { ...candidate.retention },\n privacy: { ...candidate.privacy },\n fallback: {\n mode: candidate.fallback.mode,\n targets: candidate.fallback.targets.map(normalizeTarget),\n },\n cost: { ...candidate.cost },\n };\n}\n\n/**\n * Speech authorization is intentionally independent from turn model policy.\n * Every selected adapter must match one exact admin-accepted target.\n */\nexport function authorizeTranscriptionAdapter(\n policy: WorkspaceTranscriptionPolicy,\n descriptor: TranscriptionAdapterDescriptor,\n selection: TranscriptionTargetSelection = { kind: \"primary\" },\n): TranscriptionAuthorization {\n if (!isWorkspaceTranscriptionPolicy(policy)) {\n return { authorized: false, reason: \"unaccepted\" };\n }\n if (!policy.enabled) return { authorized: false, reason: \"disabled\" };\n if (!policy.acceptanceId) return { authorized: false, reason: \"unaccepted\" };\n let target: WorkspaceTranscriptionTarget | null | undefined;\n if (selection.kind === \"primary\") {\n target = policy.primary;\n } else {\n if (policy.fallback.mode !== \"explicit\") {\n return { authorized: false, reason: \"fallback_disabled\" };\n }\n target = policy.fallback.targets[selection.index];\n if (!target) return { authorized: false, reason: \"fallback_unaccepted\" };\n }\n if (!target) return { authorized: false, reason: \"target_missing\" };\n const acceptedTarget = normalizeTarget(target);\n if (acceptedTarget.provider !== descriptor.provider) {\n return { authorized: false, reason: \"provider_mismatch\" };\n }\n if (acceptedTarget.model !== descriptor.model) {\n return { authorized: false, reason: \"model_mismatch\" };\n }\n if (acceptedTarget.credentialMode !== descriptor.credentialMode) {\n return { authorized: false, reason: \"credential_mode_mismatch\" };\n }\n if (acceptedTarget.region !== descriptor.region) {\n return { authorized: false, reason: \"region_mismatch\" };\n }\n return {\n authorized: true,\n acceptanceId: policy.acceptanceId,\n target: acceptedTarget,\n selection,\n };\n}\n\nexport function createTranscriptionSessionRequest(input: {\n policy: WorkspaceTranscriptionPolicy;\n adapter: TranscriptionAdapter;\n localSessionId: string;\n selection?: TranscriptionTargetSelection | undefined;\n sequenceFloor?: number | undefined;\n}): TranscriptionSessionRequest | null {\n const sequenceFloor = input.sequenceFloor ?? 0;\n if (!Number.isSafeInteger(sequenceFloor) || sequenceFloor < 0) return null;\n const authorization = authorizeTranscriptionAdapter(\n input.policy,\n input.adapter.descriptor,\n input.selection,\n );\n if (!authorization.authorized) return null;\n return {\n localSessionId: input.localSessionId,\n policyAcceptanceId: authorization.acceptanceId,\n selection: authorization.selection,\n target: { ...authorization.target },\n language: input.policy.language?.trim() ?? null,\n autoDetectLanguage: input.policy.autoDetectLanguage,\n diarization: { ...input.policy.diarization },\n retention: { ...input.policy.retention },\n privacy: { ...input.policy.privacy },\n cost: { ...input.policy.cost },\n sequenceFloor,\n };\n}\n\nfunction cloneDefaultPolicy(): WorkspaceTranscriptionPolicy {\n return {\n ...DEFAULT_WORKSPACE_TRANSCRIPTION_POLICY,\n diarization: { ...DEFAULT_WORKSPACE_TRANSCRIPTION_POLICY.diarization },\n retention: { ...DEFAULT_WORKSPACE_TRANSCRIPTION_POLICY.retention },\n privacy: { ...DEFAULT_WORKSPACE_TRANSCRIPTION_POLICY.privacy },\n fallback: { mode: \"disabled\", targets: [] },\n cost: { ...DEFAULT_WORKSPACE_TRANSCRIPTION_POLICY.cost },\n };\n}\n\nfunction isWorkspaceTranscriptionPolicy(value: unknown): value is WorkspaceTranscriptionPolicy {\n if (!isRecord(value) || typeof value.enabled !== \"boolean\") return false;\n if (\n !hasOnlyKeys(value, [\n \"enabled\",\n \"acceptanceId\",\n \"primary\",\n \"language\",\n \"autoDetectLanguage\",\n \"diarization\",\n \"retention\",\n \"privacy\",\n \"fallback\",\n \"cost\",\n ])\n ) {\n return false;\n }\n if (!(value.acceptanceId === null || isUuid(value.acceptanceId))) return false;\n if (!(value.primary === null || isTarget(value.primary))) return false;\n if (!(value.language === null || isBoundedString(value.language, 64))) return false;\n if (typeof value.autoDetectLanguage !== \"boolean\") return false;\n if (\n !isRecord(value.diarization) ||\n !hasOnlyKeys(value.diarization, [\"enabled\", \"maxSpeakers\"]) ||\n typeof value.diarization.enabled !== \"boolean\" ||\n !(\n value.diarization.maxSpeakers === null ||\n (isBoundedInteger(value.diarization.maxSpeakers, 100) && value.diarization.maxSpeakers >= 2)\n )\n ) {\n return false;\n }\n if (!value.diarization.enabled && value.diarization.maxSpeakers !== null) return false;\n if (!isRecord(value.retention) || !hasOnlyKeys(value.retention, [\"mode\", \"maxDays\"])) {\n return false;\n }\n if (value.retention.mode !== \"none\" && value.retention.mode !== \"provider-policy\") return false;\n if (!(value.retention.maxDays === null || isBoundedInteger(value.retention.maxDays, 3650))) {\n return false;\n }\n if (\n !isRecord(value.privacy) ||\n !hasOnlyKeys(value.privacy, [\"allowProviderLogging\", \"allowProviderTraining\"]) ||\n typeof value.privacy.allowProviderLogging !== \"boolean\" ||\n typeof value.privacy.allowProviderTraining !== \"boolean\"\n ) {\n return false;\n }\n if (!isRecord(value.fallback) || !hasOnlyKeys(value.fallback, [\"mode\", \"targets\"])) {\n return false;\n }\n if (value.fallback.mode !== \"disabled\" && value.fallback.mode !== \"explicit\") return false;\n if (\n !Array.isArray(value.fallback.targets) ||\n value.fallback.targets.length > 8 ||\n !value.fallback.targets.every(isTarget)\n ) {\n return false;\n }\n if (value.fallback.mode === \"disabled\" && value.fallback.targets.length !== 0) return false;\n if (value.fallback.mode === \"explicit\" && value.fallback.targets.length === 0) return false;\n if (\n !isRecord(value.cost) ||\n !hasOnlyKeys(value.cost, [\"currency\", \"maxPerHour\", \"maxPerMonth\"]) ||\n value.cost.currency !== \"USD\"\n ) {\n return false;\n }\n if (!isNullableBoundedNumber(value.cost.maxPerHour, 10_000)) return false;\n if (!isNullableBoundedNumber(value.cost.maxPerMonth, 1_000_000)) return false;\n if (value.enabled && (!value.acceptanceId || !value.primary)) return false;\n if (value.enabled && !value.autoDetectLanguage && value.language === null) return false;\n if (value.autoDetectLanguage && value.language !== null) return false;\n const targets = [value.primary, ...value.fallback.targets].filter(\n (target): target is WorkspaceTranscriptionTarget => target !== null,\n );\n if (new Set(targets.map(targetKey)).size !== targets.length) return false;\n return true;\n}\n\nfunction targetKey(target: WorkspaceTranscriptionTarget): string {\n return [\n target.provider.trim(),\n target.model?.trim() ?? \"\",\n target.credentialMode,\n target.credentialConnectionId ?? \"\",\n target.region?.trim() ?? \"\",\n ].join(\"\\u0000\");\n}\n\nfunction isTarget(value: unknown): value is WorkspaceTranscriptionTarget {\n if (!isRecord(value)) return false;\n if (\n !hasOnlyKeys(value, [\"provider\", \"model\", \"credentialMode\", \"credentialConnectionId\", \"region\"])\n ) {\n return false;\n }\n if (!isBoundedString(value.provider, 128)) return false;\n if (!(value.model === null || isBoundedString(value.model, 256))) return false;\n if (value.credentialMode !== \"managed\" && value.credentialMode !== \"byok\") return false;\n if (value.provider.trim() === \"azure-speech\" && value.credentialMode !== \"byok\") return false;\n if (!(value.credentialConnectionId === null || isUuid(value.credentialConnectionId))) {\n return false;\n }\n if (!(value.region === null || isBoundedString(value.region, 128))) return false;\n if (value.credentialMode === \"byok\" && value.credentialConnectionId === null) return false;\n if (value.credentialMode === \"managed\" && value.credentialConnectionId !== null) return false;\n return true;\n}\n\nfunction normalizeTarget(target: WorkspaceTranscriptionTarget): WorkspaceTranscriptionTarget {\n return {\n provider: target.provider.trim(),\n model: target.model?.trim() ?? null,\n credentialMode: target.credentialMode,\n credentialConnectionId: target.credentialConnectionId,\n region: target.region?.trim() ?? null,\n };\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\nfunction hasOnlyKeys(value: Record<string, unknown>, keys: readonly string[]): boolean {\n const accepted = new Set(keys);\n return Object.keys(value).every((key) => accepted.has(key));\n}\n\nfunction isBoundedString(value: unknown, maximum: number): value is string {\n return typeof value === \"string\" && value.trim().length > 0 && value.length <= maximum;\n}\n\nfunction isUuid(value: unknown): value is string {\n return (\n typeof value === \"string\" &&\n /^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(value)\n );\n}\n\nfunction isBoundedInteger(value: unknown, maximum: number): value is number {\n return Number.isInteger(value) && (value as number) >= 0 && (value as number) <= maximum;\n}\n\nfunction isNullableBoundedNumber(value: unknown, maximum: number): boolean {\n return (\n value === null ||\n (typeof value === \"number\" && Number.isFinite(value) && value >= 0 && value <= maximum)\n );\n}\n"],"mappings":"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","names":["sleep"]}