@opengeni/sdk 1.4.0 → 1.4.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +12 -0
- package/dist/adapters/next.js +2 -2
- package/dist/artifacts.js +5 -5
- package/dist/browser.js +3 -3
- package/dist/chat/index.js +15 -9
- package/dist/chat/index.js.map +1 -1
- package/dist/{chunk-BVIIRSJY.js → chunk-6SWFOZUP.js} +3 -3
- package/dist/{chunk-LEBDXYMA.js → chunk-7A5ZDWQH.js} +2 -2
- package/dist/{chunk-GYM54GKM.js → chunk-DTIMLEPB.js} +1 -1
- package/dist/chunk-DTIMLEPB.js.map +1 -0
- package/dist/{chunk-CA2T7QT4.js → chunk-HORQJBLP.js} +2 -2
- package/dist/{chunk-NC57YMUO.js → chunk-IJWKWFSF.js} +1 -1
- package/dist/chunk-IJWKWFSF.js.map +1 -0
- package/dist/{chunk-ZNC44QEX.js → chunk-JOI7XCG6.js} +45 -14
- package/dist/chunk-JOI7XCG6.js.map +1 -0
- package/dist/{chunk-D534PIXF.js → chunk-MAFL52JD.js} +2 -2
- package/dist/{chunk-FYQAMXDW.js → chunk-OLLQBZAE.js} +111 -5
- package/dist/chunk-OLLQBZAE.js.map +1 -0
- package/dist/{chunk-MXV5O25O.js → chunk-W72BOLRJ.js} +2 -2
- package/dist/codex-realtime-controller.js +1 -1
- package/dist/core.js +4 -4
- package/dist/document-authority.js +4 -4
- package/dist/editable-artifacts.js +1 -1
- package/dist/index.js +9 -9
- package/dist/interaction.d.ts +5 -0
- package/dist/interaction.js +1 -1
- package/dist/realtime.js +1 -1
- package/dist/session-proxy.d.ts +29 -6
- package/dist/session-proxy.js +2 -2
- package/dist/site.js +4 -4
- package/dist/types.d.ts +17 -0
- package/package.json +3 -3
- package/src/chat/opengeni.ts +14 -3
- package/src/codex-realtime-controller.ts +65 -14
- package/src/interaction.ts +5 -0
- package/src/session-proxy.ts +189 -9
- package/src/types.ts +15 -0
- package/dist/chunk-FYQAMXDW.js.map +0 -1
- package/dist/chunk-GYM54GKM.js.map +0 -1
- package/dist/chunk-NC57YMUO.js.map +0 -1
- package/dist/chunk-ZNC44QEX.js.map +0 -1
- /package/dist/{chunk-BVIIRSJY.js.map → chunk-6SWFOZUP.js.map} +0 -0
- /package/dist/{chunk-LEBDXYMA.js.map → chunk-7A5ZDWQH.js.map} +0 -0
- /package/dist/{chunk-CA2T7QT4.js.map → chunk-HORQJBLP.js.map} +0 -0
- /package/dist/{chunk-D534PIXF.js.map → chunk-MAFL52JD.js.map} +0 -0
- /package/dist/{chunk-MXV5O25O.js.map → chunk-W72BOLRJ.js.map} +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
OpenGeniClient
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-6SWFOZUP.js";
|
|
4
4
|
|
|
5
5
|
// src/document-authority-client.ts
|
|
6
6
|
var OpenGeniDocumentAuthorityClient = class extends OpenGeniClient {
|
|
@@ -147,4 +147,4 @@ var OpenGeniDocumentAuthorityClient = class extends OpenGeniClient {
|
|
|
147
147
|
export {
|
|
148
148
|
OpenGeniDocumentAuthorityClient
|
|
149
149
|
};
|
|
150
|
-
//# sourceMappingURL=chunk-
|
|
150
|
+
//# sourceMappingURL=chunk-HORQJBLP.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../contracts/src/browser-storage.ts","../src/interaction.ts"],"sourcesContent":["/** Persisted discriminator; null identity alone never implies ephemeral storage. */\nexport const EPHEMERAL_CHROMIUM_DRIVER_ID = \"opengeni.cdp.ephemeral-context.v1\" as const;\n\nexport function browserSessionStorageMode(session: {\n driverId: string;\n}): \"private_profile\" | \"ephemeral_context\" {\n return session.driverId === EPHEMERAL_CHROMIUM_DRIVER_ID\n ? \"ephemeral_context\"\n : \"private_profile\";\n}\n","import type { OpenGeniRequestOptions } from \"./client\";\nimport { browserSessionStorageMode } from \"@opengeni/contracts/browser-storage\";\nimport type {\n BrowserDomReadRequest,\n BrowserDomReadResponse,\n BrowserTargetState,\n} from \"@opengeni/contracts\";\nexport type {\n BrowserDomReadRequest,\n BrowserDomReadResponse,\n BrowserDomSafeAttribute,\n BrowserTargetState,\n} from \"@opengeni/contracts\";\nimport { OpenGeniApiError } from \"./errors\";\nimport type { RetainedArtifactReference } from \"./types\";\n\n/** Public Browser/Computer protocol version. Driver and provider details stay private. */\nexport const INTERACTION_PROTOCOL_VERSION = 1 as const;\nexport const BROWSER_CONTROL_WEBSOCKET_PROTOCOL = \"opengeni.browser.v1\" as const;\nexport const COMPUTER_CONTROL_WEBSOCKET_PROTOCOL = \"opengeni.computer.v1\" as const;\nexport const BROWSER_CONTROL_WEBSOCKET_BEARER_PREFIX = \"opengeni.auth.\" as const;\nexport const BROWSER_CONTROL_MAX_FRAME_HEADER_BYTES = 64 * 1024;\nexport const BROWSER_FRAME_MAX_BYTES = 24 * 1024 * 1024;\nexport const BROWSER_FRAME_MAX_DIMENSION = 32_768;\nexport const BROWSER_FRAME_MAX_PIXELS = 100_000_000;\n\n/** Latest-wins invalidation cursor for workspace Browser/Computer resources. */\nexport type WorkspaceInteractionRevisionEvent = {\n workspaceId: string;\n sequence: number;\n revision: number;\n type: \"workspace.interaction.changed\";\n occurredAt: string;\n};\n\nexport type InteractionJsonValue =\n | null\n | string\n | number\n | boolean\n | InteractionJsonValue[]\n | { [key: string]: InteractionJsonValue };\n\nexport type InteractionControlFailureCode =\n | \"unknown\"\n | \"unsupported\"\n | \"os\"\n | \"not_found\"\n | \"consent_required\"\n | \"timeout\"\n | \"draining\"\n | \"protocol\"\n | \"stream\"\n | \"agent_offline\"\n | \"fenced\"\n | \"payload_too_large\";\n\nexport type InteractionControlFailure = {\n layer: \"connected_machine\";\n surface: \"browser\" | \"computer\";\n code: InteractionControlFailureCode;\n retryable: boolean;\n outcomeUnknown: boolean;\n requestId: string | undefined;\n controlRequestId: string | undefined;\n message: string;\n};\n\n/** Decodes the bounded typed control-failure details emitted by OpenGeni. Raw\n * provider/OS detail is intentionally absent; both correlation ids are opaque. */\nexport function interactionControlFailureFromError(\n error: unknown,\n): InteractionControlFailure | null {\n if (!(error instanceof OpenGeniApiError)) return null;\n const details = error.details;\n if (!details || details.interactionLayer !== \"connected_machine\") return null;\n const surface = details.interactionSurface;\n const code = details.controlFailureCode;\n if ((surface !== \"browser\" && surface !== \"computer\") || !isControlFailureCode(code)) {\n return null;\n }\n const controlRequestId = boundedOpaqueCorrelation(details.controlRequestId);\n return {\n layer: \"connected_machine\",\n surface,\n code,\n retryable: error.retryable,\n outcomeUnknown: error.outcomeUnknown,\n requestId: error.correlationId,\n controlRequestId,\n message: error.message,\n };\n}\n\nfunction isControlFailureCode(value: unknown): value is InteractionControlFailureCode {\n return (\n typeof value === \"string\" &&\n [\n \"unknown\",\n \"unsupported\",\n \"os\",\n \"not_found\",\n \"consent_required\",\n \"timeout\",\n \"draining\",\n \"protocol\",\n \"stream\",\n \"agent_offline\",\n \"fenced\",\n \"payload_too_large\",\n ].includes(value)\n );\n}\n\nfunction boundedOpaqueCorrelation(value: unknown): string | undefined {\n return typeof value === \"string\" && value.length <= 128 && /^[A-Za-z0-9._:-]+$/u.test(value)\n ? value\n : undefined;\n}\n\nexport type InteractionPlacement =\n | { kind: \"sandbox_group\"; sandboxGroupId: string }\n | { kind: \"connected_machine\"; sandboxId: string }\n | { kind: \"attached_device\"; deviceId: string }\n | { kind: \"external_provider\"; providerId: string; placementId: string };\n\nexport type AttachedBrowserDeviceCapabilities = {\n tabInventory: boolean;\n debuggerAttachment: boolean;\n semanticObservation: boolean;\n screenshots: boolean;\n liveFrames: boolean;\n humanInput: boolean;\n diagnostics: boolean;\n rawCdp: boolean;\n linkedComputer: boolean;\n};\n\n/** One live browser-profile endpoint on an enrolled machine. Saved, reusable\n * login state is represented separately by BrowserIdentity. */\nexport type AttachedBrowserDevice = {\n id: string;\n accountId: string;\n workspaceId: string;\n enrollmentId: string;\n name: string;\n profileLabel: string | null;\n browserName: string;\n browserVersion: string;\n extensionVersion: string;\n platform: \"linux\" | \"macos\" | \"windows\";\n architecture: \"x64\" | \"arm64\";\n state: \"connected\" | \"disconnected\";\n connectionGeneration: string;\n inventoryRevision: number;\n tabCount: number;\n capabilities: AttachedBrowserDeviceCapabilities;\n lastSeenAt: string;\n disconnectedAt: string | null;\n createdAt: string;\n updatedAt: string;\n};\n\nexport type AttachedBrowserBridge = {\n enrollmentId: string;\n state: \"online\" | \"offline\";\n bridgeGeneration: string;\n inventoryRevision: number;\n connectedProfileCount: number;\n lastSeenAt: string;\n};\n\nexport type AttachedBrowserDeviceListResponse = {\n revision: number;\n bridges: AttachedBrowserBridge[];\n devices: AttachedBrowserDevice[];\n};\n\nexport type InteractionControllerBinding = {\n controllerId: string;\n controllerGeneration: string;\n placementInstanceId: string;\n};\n\nexport type InteractionAssociation = {\n sessionId: string;\n turnId: string | null;\n attemptId: string | null;\n relationship: \"created\" | \"using\" | \"observing\" | \"related\";\n actorSubjectId: string;\n lastUsedAt: string;\n};\n\nexport type InteractionLifecycle =\n | \"starting\"\n | \"active\"\n | \"suspending\"\n | \"suspended\"\n | \"restoring\"\n | \"repair_required\"\n | \"lost\"\n | \"ending\"\n | \"ended\"\n | \"failed\";\n\nexport type BrowserSessionCapabilities = {\n semanticObservation: boolean;\n screenshots: boolean;\n liveFrames: boolean;\n humanInput: boolean;\n tabs: boolean;\n downloads: boolean;\n uploads: boolean;\n clipboard: boolean;\n permissions: boolean;\n diagnostics: boolean;\n rawCdp: boolean;\n linkedComputer: boolean;\n privateCheckpoint: boolean;\n identityPublication: boolean;\n parallelTargets: boolean;\n};\n\nexport type BrowserSession = {\n id: string;\n accountId: string;\n workspaceId: string;\n name: string;\n lifecycle: InteractionLifecycle;\n placement: InteractionPlacement;\n controller: InteractionControllerBinding | null;\n driverId: string;\n engine: \"chromium\" | \"chrome\" | \"firefox\" | \"webkit\" | \"lightpanda\" | \"external\";\n engineVersion: string | null;\n headless: boolean;\n identityId: string | null;\n baseRevisionId: string | null;\n networkRouteId: string | null;\n linkedComputerSessionId: string | null;\n capabilities: BrowserSessionCapabilities;\n associations: InteractionAssociation[];\n createdBySubjectId: string;\n createdAt: string;\n lastUsedAt: string;\n failureCode: string | null;\n};\n\nexport type BrowserClipboard = {\n browserSessionId: string;\n controllerGeneration: string;\n revision: number;\n text: string;\n source: \"empty\" | \"write\" | \"clear\" | \"copy\" | \"paste\";\n sourceTargetId: string | null;\n updatedAt: string | null;\n};\n\nexport type InteractionCredentialAuthorityRef = {\n connectionId: string;\n connectionSubjectId: string | null;\n providerDomain: string;\n};\n\nexport type NetworkRouteConfiguration =\n | { kind: \"direct\" }\n | {\n kind: \"proxy\";\n protocol: \"http\" | \"https\" | \"socks5\";\n host: string;\n port: number;\n credential: InteractionCredentialAuthorityRef | null;\n }\n | {\n kind: \"managed\";\n providerId: string;\n routeId: string;\n egressClass: \"datacenter\" | \"residential\" | \"isp\";\n region: string | null;\n credential: InteractionCredentialAuthorityRef | null;\n }\n | { kind: \"tunnel\"; placement: InteractionPlacement; tunnelId: string };\n\nexport type NetworkRouteConsistency = {\n dns: \"placement\" | \"proxy\" | \"provider\";\n expectedPublicIp: string | null;\n expectedRegion: string | null;\n locale: string | null;\n timezone: string | null;\n geolocation: {\n latitude: number;\n longitude: number;\n accuracyMeters: number;\n } | null;\n webRtc: \"default\" | \"disable_non_proxied_udp\" | \"proxy_only\";\n stability: \"session\" | \"sticky\" | \"persistent\";\n};\n\nexport type NetworkRoute = {\n id: string;\n accountId: string;\n workspaceId: string;\n name: string;\n status: \"active\" | \"archived\";\n configuration: NetworkRouteConfiguration;\n consistency: NetworkRouteConsistency;\n version: number;\n createdBySubjectId: string;\n createdAt: string;\n updatedAt: string;\n};\n\nexport type NetworkRouteListResponse = { revision: number; routes: NetworkRoute[] };\nexport type CreateNetworkRouteRequest = {\n operationId: string;\n name: string;\n configuration: NetworkRouteConfiguration;\n consistency: NetworkRouteConsistency;\n};\nexport type UpdateNetworkRouteRequest = {\n operationId: string;\n expectedVersion: number;\n name?: string | undefined;\n status?: \"active\" | \"archived\" | undefined;\n configuration?: NetworkRouteConfiguration | undefined;\n consistency?: NetworkRouteConsistency | undefined;\n};\nexport type NetworkRouteMutationResponse = {\n route: NetworkRoute;\n operationId: string;\n replayed: boolean;\n};\n\nexport type SiteAuthFieldPurpose = \"identifier\" | \"password\" | \"secret\" | \"totp\";\nexport type SiteAuthAuthority =\n | {\n id: string;\n kind: \"connection_fields\";\n label: string;\n credential: InteractionCredentialAuthorityRef;\n fields: Array<{\n id: string;\n purpose: SiteAuthFieldPurpose;\n credentialKey: string;\n digits?: number | undefined;\n periodSeconds?: number | undefined;\n algorithm?: \"sha1\" | \"sha256\" | \"sha512\" | undefined;\n }>;\n }\n | {\n id: string;\n kind: \"human\";\n label: string;\n fields: Array<{ id: string; purpose: SiteAuthFieldPurpose }>;\n }\n | {\n id: string;\n kind: \"external_provider\";\n label: string;\n adapterId: string;\n connectionId: string;\n credential: InteractionCredentialAuthorityRef | null;\n };\n\nexport type SiteAuthMethod = {\n id: string;\n kind: \"password\" | \"sso\" | \"magic_link\" | \"passkey\" | \"external\";\n label: string;\n authorityIds: string[];\n};\n\nexport type SiteAuthHealthPolicy = {\n mode: \"on_use\" | \"maintained\";\n intervalSeconds: number | null;\n automaticRepair: boolean;\n};\n\nexport type SiteAuthConnectionConfiguration = {\n name: string;\n accountLabel: string;\n origins: string[];\n loginUrl: string | null;\n verificationUrlPrefixes: string[];\n authorities: SiteAuthAuthority[];\n methods: SiteAuthMethod[];\n preferredIdentityId: string | null;\n preferredPlacement: InteractionPlacement | null;\n preferredNetworkRouteId: string | null;\n healthPolicy: SiteAuthHealthPolicy;\n};\n\nexport type SiteAuthConnection = SiteAuthConnectionConfiguration & {\n id: string;\n accountId: string;\n workspaceId: string;\n status: \"active\" | \"archived\";\n verificationState: \"unknown\" | \"verified\" | \"needs_repair\" | \"failed\";\n lastVerifiedAt: string | null;\n lastVerifiedUrl: string | null;\n lastCheckedAt: string | null;\n nextCheckAt: string | null;\n maintenance: {\n action: \"health_check\" | \"repair\";\n sessionId: string | null;\n dueAt: string;\n startedAt: string | null;\n } | null;\n repairCode: string | null;\n version: number;\n createdBySubjectId: string;\n createdAt: string;\n updatedAt: string;\n};\n\nexport type SiteAuthConnectionListResponse = {\n revision: number;\n connections: SiteAuthConnection[];\n};\nexport type CreateSiteAuthConnectionRequest = SiteAuthConnectionConfiguration & {\n operationId: string;\n};\nexport type UpdateSiteAuthConnectionRequest = Partial<SiteAuthConnectionConfiguration> & {\n operationId: string;\n expectedVersion: number;\n status?: \"active\" | \"archived\" | undefined;\n};\nexport type SiteAuthConnectionMutationResponse = {\n connection: SiteAuthConnection;\n operationId: string;\n replayed: boolean;\n};\n\nexport type AuthRun = {\n id: string;\n accountId: string;\n workspaceId: string;\n siteAuthConnectionId: string;\n browserSessionId: string;\n targetId: string;\n controllerGeneration: string;\n targetGeneration: string;\n documentGeneration: string | null;\n purpose: \"authenticate\" | \"health_check\" | \"repair\";\n methodId: string | null;\n authorityId: string | null;\n state:\n | \"discovering\"\n | \"awaiting_choice\"\n | \"awaiting_secret\"\n | \"awaiting_external_action\"\n | \"working\"\n | \"verified\"\n | \"failed\"\n | \"cancelled\";\n choices: Array<{ id: string; label: string; methodId: string }>;\n pendingFields: Array<{ id: string; label: string; purpose: SiteAuthFieldPurpose }>;\n externalAction: {\n kind: \"push\" | \"security_key\" | \"passkey\" | \"device\" | \"human\" | \"other\";\n label: string;\n expiresAt: string | null;\n } | null;\n interventionId: string | null;\n verifiedUrl: string | null;\n failureCode: string | null;\n version: number;\n operationId: string;\n createdBySubjectId: string;\n createdAt: string;\n updatedAt: string;\n settledAt: string | null;\n};\n\nexport type AuthRunListResponse = { runs: AuthRun[] };\nexport type AuthRunMutationResponse = { run: AuthRun; operationId: string; replayed: boolean };\nexport type StartAuthRunRequest = {\n operationId: string;\n siteAuthConnectionId: string;\n targetId: string;\n expectedTargetGeneration: string;\n expectedDocumentGeneration: string | null;\n purpose?: \"authenticate\" | \"health_check\" | \"repair\" | undefined;\n methodId?: string | undefined;\n authorityId?: string | undefined;\n};\nexport type ReportAuthRunRequest = {\n operationId: string;\n expectedVersion: number;\n methodId?: string | undefined;\n authorityId?: string | undefined;\n state:\n | \"awaiting_choice\"\n | \"awaiting_secret\"\n | \"awaiting_external_action\"\n | \"working\"\n | \"failed\"\n | \"cancelled\";\n choices?: AuthRun[\"choices\"] | undefined;\n pendingFields?: AuthRun[\"pendingFields\"] | undefined;\n externalAction?: AuthRun[\"externalAction\"] | undefined;\n failureCode?: string | null | undefined;\n};\nexport type ProtectedAuthFillRequest = {\n operationId: string;\n expectedVersion: number;\n expectedTargetGeneration: string;\n expectedDocumentGeneration: string | null;\n expectedFrameId: string | null;\n authorityId: string;\n fields: Array<{ fieldId: string; locator: BrowserLocator }>;\n submit:\n | { type: \"none\" }\n | { type: \"click\"; locator: BrowserLocator }\n | { type: \"press\"; key: string; locator?: BrowserLocator | undefined };\n};\nexport type ProtectedAuthFillResponse = {\n run: AuthRun;\n status: \"submitted\" | \"working\" | \"needs_human\" | \"stale\" | \"failed\";\n operationId: string;\n replayed: boolean;\n};\nexport type ExternalAuthRunRequest = {\n operationId: string;\n expectedVersion: number;\n action: \"start\" | \"poll\";\n};\nexport type ExternalAuthRunResponse = {\n run: AuthRun;\n status: \"working\" | \"needs_human\" | \"ready_to_verify\" | \"failed\";\n operationId: string;\n replayed: boolean;\n};\nexport type ExternalAuthInteractiveRequest = {\n operationId: string;\n expectedVersion: number;\n};\nexport type ExternalAuthInteractiveResponse = {\n authRunId: string;\n url: string;\n expiresAt: string | null;\n};\nexport type VerifyAuthRunRequest = { operationId: string; expectedVersion: number };\n\nexport type InteractionIntervention = {\n id: string;\n accountId: string;\n workspaceId: string;\n resourceKind: \"browser_session\" | \"computer_session\";\n resourceId: string;\n targetId: string;\n controllerGeneration: string;\n targetGeneration: string;\n documentGeneration: string | null;\n kind: \"manual_login\" | \"mfa\" | \"external_action\" | \"confirmation\" | \"other\";\n reason: string;\n status: \"open\" | \"completed\" | \"dismissed\" | \"expired\" | \"cancelled\";\n authRunId: string | null;\n originatingSessionId: string;\n originatingTurnId: string | null;\n originatingAttemptId: string | null;\n originatingToolOperationId: string | null;\n responseActorSubjectId: string | null;\n version: number;\n operationId: string;\n expiresAt: string;\n createdAt: string;\n updatedAt: string;\n settledAt: string | null;\n};\nexport type InteractionInterventionListResponse = {\n interventions: InteractionIntervention[];\n};\nexport type CreateInteractionInterventionRequest = {\n operationId: string;\n resourceKind: \"browser_session\" | \"computer_session\";\n resourceId: string;\n targetId: string;\n expectedControllerGeneration: string;\n expectedTargetGeneration: string;\n expectedDocumentGeneration: string | null;\n kind: InteractionIntervention[\"kind\"];\n reason: string;\n authRunId?: string | undefined;\n expiresInSeconds?: number | undefined;\n};\nexport type ResolveInteractionInterventionRequest = {\n operationId: string;\n expectedVersion: number;\n outcome: \"completed\" | \"dismissed\";\n};\nexport type InteractionInterventionMutationResponse = {\n intervention: InteractionIntervention;\n operationId: string;\n replayed: boolean;\n};\n\nexport type BrowserIdentityStatus = \"active\" | \"archived\";\nexport type BrowserRevisionComponentKind =\n | \"chromium_profile\"\n | \"normalized_web_state\"\n | \"provider_snapshot\";\nexport type BrowserRevisionPortability = \"portable\" | \"provider_bound\" | \"placement_bound\";\n\nexport type BrowserRevisionMaterialization = {\n portability: BrowserRevisionPortability;\n reason: string | null;\n platform: \"linux\" | \"macos\" | \"windows\" | null;\n architecture: \"x64\" | \"arm64\" | null;\n engine: \"chromium\" | \"chrome\" | \"firefox\" | \"webkit\" | \"lightpanda\" | \"external\";\n engineVersion: string | null;\n driverId: string;\n driverSchemaVersion: number;\n profileCrypto: \"chromium_basic\" | \"chromium_mock_keychain\" | \"platform_bound\";\n providerId: string | null;\n placement: InteractionPlacement | null;\n};\n\nexport type BrowserRevisionComponent = {\n id: string;\n kind: BrowserRevisionComponentKind;\n format: string;\n artifactDigest: string;\n sizeBytes: number;\n materialization: BrowserRevisionMaterialization;\n};\n\nexport type BrowserRevision = {\n id: string;\n accountId: string;\n workspaceId: string;\n identityId: string;\n parentRevisionId: string | null;\n ordinal: number;\n sourceBrowserSessionId: string;\n manifestDigest: string;\n components: BrowserRevisionComponent[];\n createdBySubjectId: string;\n createdAt: string;\n};\n\nexport type BrowserIdentity = {\n id: string;\n accountId: string;\n workspaceId: string;\n name: string;\n status: BrowserIdentityStatus;\n version: number;\n defaultRevisionId: string | null;\n headGeneration: number;\n revisionCount: number;\n createdBySubjectId: string;\n createdAt: string;\n updatedAt: string;\n};\n\nexport type BrowserIdentityListResponse = {\n revision: number;\n identities: BrowserIdentity[];\n};\n\nexport type BrowserRevisionListResponse = {\n identity: BrowserIdentity;\n revisions: BrowserRevision[];\n};\n\nexport type CreateBrowserIdentityRequest = {\n operationId: string;\n name: string;\n};\n\nexport type UpdateBrowserIdentityRequest = {\n operationId: string;\n expectedVersion: number;\n name?: string | undefined;\n status?: BrowserIdentityStatus | undefined;\n defaultRevisionId?: string | undefined;\n};\n\nexport type BrowserIdentityMutationResponse = {\n identity: BrowserIdentity;\n operationId: string;\n replayed: boolean;\n};\n\nexport type PublishBrowserRevisionRequest = {\n operationId: string;\n identityId: string;\n expectedHeadGeneration: number;\n advanceDefault?: boolean | undefined;\n};\n\nexport type PublishBrowserRevisionResponse = {\n identity: BrowserIdentity;\n revision: BrowserRevision;\n outcome: \"saved_as_default\" | \"saved_not_default\";\n replayed: boolean;\n};\n\nexport type BrowserTarget = {\n id: string;\n browserSessionId: string;\n controllerGeneration: string;\n targetGeneration: string;\n documentGeneration: string | null;\n kind: \"page\" | \"popup\" | \"background_page\" | \"worker\";\n title: string;\n url: string;\n selected: boolean;\n attached: boolean;\n createdAt: string;\n};\n\nexport type BrowserDownloadStatus =\n | \"in_progress\"\n | \"completed\"\n | \"cancelled\"\n | \"failed\"\n | \"unavailable\";\n\n/** One browser-produced file. Its bytes remain private to the exact browser\n * controller until an explicit save publishes them into the workspace. */\nexport type BrowserDownload = {\n id: string;\n browserSessionId: string;\n controllerGeneration: string;\n targetId: string | null;\n filename: string;\n status: BrowserDownloadStatus;\n receivedBytes: number;\n totalBytes: number | null;\n sha256: string | null;\n version: number;\n startedAt: string;\n settledAt: string | null;\n failureCode: string | null;\n};\n\nexport type BrowserDownloadListResponse = {\n browserSessionId: string;\n controllerGeneration: string;\n downloads: BrowserDownload[];\n};\n\nexport type BrowserDownloadSaveRequest = {\n operationId: string;\n destinationPath: string;\n overwrite?: boolean | undefined;\n};\n\nexport type BrowserDownloadSaveResponse = {\n download: BrowserDownload;\n destinationPath: string;\n fileId: string;\n operationId: string;\n replayed: boolean;\n};\n\nexport type InteractionRect = {\n x: number;\n y: number;\n width: number;\n height: number;\n};\n\nexport type InteractionRedactedValue = {\n redacted: true;\n reason: \"password\" | \"payment\" | \"private\" | \"policy\";\n};\n\nexport type InteractionSemanticNode = {\n ref: string;\n role: string;\n identifier?: string | undefined;\n name?: string | undefined;\n description?: string | undefined;\n value?: string | InteractionRedactedValue | undefined;\n states: string[];\n bounds?: InteractionRect | undefined;\n actions: string[];\n children?: InteractionSemanticNode[] | undefined;\n native?: { platform: \"dom\" | \"mac_ax\" | \"at_spi\" | \"uia\"; data: unknown } | undefined;\n};\n\nexport type InteractionSemanticSnapshot = {\n kind: \"snapshot\";\n roots: InteractionSemanticNode[];\n nodeCount: number;\n};\n\nexport type InteractionSemanticDiff = {\n kind: \"diff\";\n baseObservationId: string;\n removedRefs: string[];\n changed: InteractionSemanticNode[];\n};\n\nexport type InteractionDiagnosticSummary = {\n consoleErrorCount: number;\n failedRequestCount: number;\n downloadCount: number;\n pageErrorCount: number;\n};\n\nexport type BrowserDialog = {\n type: \"alert\" | \"confirm\" | \"prompt\" | \"beforeunload\";\n message: string;\n defaultPrompt: string;\n openedAt: string;\n};\n\nexport type BrowserObservation = {\n protocolVersion: typeof INTERACTION_PROTOCOL_VERSION;\n observationId: string;\n browserSessionId: string;\n target: BrowserTarget;\n frameId: string | null;\n semantic: InteractionSemanticSnapshot | InteractionSemanticDiff | null;\n screenshot: RetainedArtifactReference | null;\n viewport?:\n | {\n width: number;\n height: number;\n visualWidth: number;\n visualHeight: number;\n deviceScaleFactor: number;\n maxTouchPoints: number;\n }\n | null\n | undefined;\n focusedRef: string | null;\n changedRegions: InteractionRect[];\n diagnostics: InteractionDiagnosticSummary;\n dialog: BrowserDialog | null;\n observedAt: string;\n};\n\nexport type BrowserDiagnosticKind = \"console\" | \"page_error\" | \"failed_request\" | \"download\";\n\nexport type BrowserDiagnosticEntry = {\n sequence: number;\n kind: BrowserDiagnosticKind;\n level: \"debug\" | \"info\" | \"warning\" | \"error\" | null;\n message: string;\n url: string | null;\n method: string | null;\n status: number | null;\n filename: string | null;\n occurredAt: string;\n};\n\nexport type BrowserDiagnosticBatch = {\n browserSessionId: string;\n controllerGeneration: string;\n targetId: string;\n targetGeneration: string;\n entries: BrowserDiagnosticEntry[];\n cursor: number;\n truncated: boolean;\n};\n\nexport type BrowserLocator =\n | { kind: \"ref\"; ref: string }\n | {\n kind: \"role\";\n role: string;\n name?: string | undefined;\n exact?: boolean | undefined;\n }\n | { kind: \"label\"; text: string }\n | { kind: \"text\"; text: string }\n | { kind: \"placeholder\"; text: string }\n | { kind: \"test_id\"; value: string }\n | { kind: \"css\"; selector: string };\n\nexport type BrowserPermission =\n | \"geolocation\"\n | \"notifications\"\n | \"camera\"\n | \"microphone\"\n | \"midi\"\n | \"midi_sysex\"\n | \"sensors\"\n | \"idle_detection\"\n | \"local_fonts\"\n | \"window_management\";\n\nexport type BrowserPermissionSetting = \"granted\" | \"denied\" | \"prompt\";\n\nexport type BrowserAction =\n | { type: \"navigate\"; url: string }\n | { type: \"history\"; direction: \"back\" | \"forward\" }\n | { type: \"activate\" }\n | {\n type: \"viewport\";\n width: number;\n height: number;\n mobile: boolean;\n deviceScaleFactor?: number | undefined;\n }\n | {\n type: \"click\";\n locator: BrowserLocator;\n button?: \"left\" | \"right\" | \"middle\" | undefined;\n }\n | { type: \"double_click\"; locator: BrowserLocator }\n | { type: \"hover\"; locator: BrowserLocator }\n | { type: \"fill\"; locator: BrowserLocator; value: string }\n | { type: \"type\"; locator?: BrowserLocator | undefined; text: string }\n | { type: \"press\"; locator?: BrowserLocator | undefined; key: string }\n | { type: \"select\"; locator: BrowserLocator; values: string[] }\n | { type: \"check\"; locator: BrowserLocator; checked: boolean }\n | {\n type: \"scroll\";\n locator?: BrowserLocator | undefined;\n deltaX: number;\n deltaY: number;\n }\n | { type: \"drag\"; from: BrowserLocator; to: BrowserLocator }\n | {\n type: \"pointer\";\n action: \"click\" | \"double_click\" | \"move\" | \"scroll\" | \"drag\";\n x: number;\n y: number;\n endX?: number | undefined;\n endY?: number | undefined;\n deltaX?: number | undefined;\n deltaY?: number | undefined;\n button?: \"left\" | \"right\" | \"middle\" | undefined;\n clickCount?: 1 | 2 | undefined;\n }\n | {\n type: \"handle_dialog\";\n response: \"accept\" | \"dismiss\";\n promptText?: string | undefined;\n }\n | { type: \"upload\"; locator: BrowserLocator; workspaceFileIds: string[] }\n | {\n type: \"clipboard\";\n operation: \"write\" | \"clear\" | \"copy\" | \"paste\";\n text?: string | undefined;\n locator?: BrowserLocator | undefined;\n content?: \"selection\" | \"value\" | \"text\" | undefined;\n }\n | {\n type: \"permission\";\n permission: BrowserPermission;\n setting: BrowserPermissionSetting;\n }\n | {\n type: \"wait\";\n condition: \"load\" | \"network_idle\" | \"visible\" | \"hidden\";\n locator?: BrowserLocator | undefined;\n timeoutMs?: number | undefined;\n };\n\nexport type BrowserActionBatch = {\n type: \"batch\";\n actions: BrowserAction[];\n fenceEachAction?: true | undefined;\n};\n\nexport type InteractionError = {\n code:\n | \"resource_not_found\"\n | \"resource_unavailable\"\n | \"controller_stale\"\n | \"target_not_found\"\n | \"target_stale\"\n | \"observation_stale\"\n | \"document_stale\"\n | \"frame_stale\"\n | \"locator_not_found\"\n | \"locator_ambiguous\"\n | \"unsupported\"\n | \"permission_denied\"\n | \"machine_locked\"\n | \"attempt_stale\"\n | \"operation_conflict\"\n | \"outcome_unknown\"\n | \"invalid_action\"\n | \"timeout\"\n | \"controller_lost\"\n | \"driver_failed\";\n message: string;\n retryable: boolean;\n details?: Record<string, InteractionJsonValue> | undefined;\n};\n\nexport type InteractionOperationState =\n | \"prepared\"\n | \"dispatched\"\n | \"completed\"\n | \"failed\"\n | \"outcome_unknown\";\n\nexport type InteractionLifecycleOperationReceipt = {\n operationId: string;\n resourceKind: \"browser_session\" | \"computer_session\";\n resourceId: string;\n kind: \"create\" | \"resume\" | \"suspend\" | \"end\" | \"publish\";\n state: InteractionOperationState;\n replayed: boolean;\n error: InteractionError | null;\n createdAt: string;\n dispatchedAt: string | null;\n settledAt: string | null;\n};\n\nexport type CreateBrowserSessionRequest = {\n operationId: string;\n sessionId: string;\n name?: string | undefined;\n initialUrl?: string | undefined;\n headless?: boolean | undefined;\n storageMode?: \"private_profile\" | \"ephemeral_context\" | undefined;\n engine?: \"chromium\" | \"lightpanda\" | undefined;\n placement?: InteractionPlacement | undefined;\n identityId?: string | undefined;\n baseRevisionId?: string | undefined;\n networkRouteId?: string | undefined;\n linkedComputerSessionId?: string | undefined;\n};\n\nexport type BrowserSessionListResponse = {\n revision: number;\n sessions: BrowserSession[];\n};\n\nexport type BrowserSessionMutationResponse = {\n session: BrowserSession;\n operation: InteractionLifecycleOperationReceipt;\n};\n\nexport type BrowserSessionLifecycleRequest = { operationId: string };\nexport type BrowserOpenTargetRequest = { url?: string | undefined };\n\nexport type BrowserTargetListResponse = {\n browserSessionId: string;\n controllerGeneration: string;\n targets: BrowserTarget[];\n};\n\nexport type InteractionFrameStreamAttachment<RelayKind extends 3 | 4 = 3 | 4> =\n | { kind: \"direct_websocket\"; url: string; protocols: string[] }\n | {\n kind: \"relay\";\n url: string;\n token: string;\n channel: {\n channelId: string;\n workspaceId: string;\n agentId: string;\n kind: RelayKind;\n port: number;\n };\n };\n\nexport type ComputerFrameStreamAttachment =\n | InteractionFrameStreamAttachment<4>\n | { kind: \"direct_rfb\"; url: string; protocols: string[]; inputAllowed: boolean };\n\nexport type BrowserSessionAttachment = {\n browserSessionId: string;\n controllerGeneration: string;\n targetId: string;\n stream: InteractionFrameStreamAttachment<3>;\n /** Negotiated from this attachment’s live controller, absent on older helpers. */\n fencedInputBatches?: true | undefined;\n focusedInputObservations?: true | undefined;\n expiresAt: string;\n};\n\nexport type BrowserSessionAttachmentRequest = {\n targetId: string;\n expiresInSeconds?: number | undefined;\n stream?: BrowserFrameStreamOptions | undefined;\n};\n\nexport type BrowserActionRequest = {\n operationId: string;\n targetId: string;\n expectedTargetGeneration: string;\n expectedDocumentGeneration: string | null;\n expectedFrameId: string | null;\n /** `input` is negotiated by focusedInputObservations on a live attachment.\n * It returns optional native-select metadata after a pointer click, and null\n * for ordinary input. Use full for agent observations. */\n observationMode?: \"full\" | \"none\" | \"input\" | undefined;\n action: BrowserAction | BrowserActionBatch;\n};\n\nexport type BrowserActionReceipt = {\n protocolVersion: typeof INTERACTION_PROTOCOL_VERSION;\n operationId: string;\n browserSessionId: string;\n controllerGeneration: string;\n targetId: string;\n state: InteractionOperationState;\n dispatchedAt: string | null;\n settledAt: string | null;\n observation: BrowserObservation | null;\n error: InteractionError | null;\n};\n\nexport type BrowserSessionHeartbeatResponse = {\n browserSessionId: string;\n controllerGeneration: string;\n alive: true;\n};\n\nexport type ComputerSessionCapabilities = {\n semanticObservation: boolean;\n appDiscovery: boolean;\n appLaunch: boolean;\n windowCapture: boolean;\n screenCapture: boolean;\n semanticActions: boolean;\n pointerInput: boolean;\n /** Causal count-2 input requires its exact confirmed first operation. Absent means unsupported. */\n pointerClickContinuation?: boolean | undefined;\n keyboardInput: boolean;\n clipboard: boolean;\n backgroundActions: boolean;\n /** Raw window input stays in the background. Absent means foreground-only. */\n backgroundInput?: boolean | undefined;\n parallelApps: boolean;\n};\n\nexport type ComputerClipboard = {\n computerSessionId: string;\n controllerGeneration: string;\n text: string | null;\n truncated: boolean;\n observedAt: string;\n};\n\nexport type ComputerSession = {\n id: string;\n accountId: string;\n workspaceId: string;\n name: string;\n lifecycle: InteractionLifecycle;\n placement: InteractionPlacement;\n controller: InteractionControllerBinding | null;\n platform: \"linux\" | \"macos\" | \"windows\" | null;\n adapter: string | null;\n seatId: string | null;\n displayId: string | null;\n capabilities: ComputerSessionCapabilities | null;\n associations: InteractionAssociation[];\n createdBySubjectId: string;\n createdAt: string;\n lastUsedAt: string;\n failureCode: string | null;\n};\n\nexport type ComputerTarget = {\n id: string;\n computerSessionId: string;\n controllerGeneration: string;\n targetGeneration: string;\n kind: \"app\" | \"window\" | \"screen\";\n applicationId: string | null;\n processId: number | null;\n title: string;\n bounds: InteractionRect | null;\n focused: boolean;\n};\n\nexport type ComputerObservation = {\n protocolVersion: typeof INTERACTION_PROTOCOL_VERSION;\n observationId: string;\n computerSessionId: string;\n target: ComputerTarget;\n frameId: string | null;\n semantic: InteractionSemanticSnapshot | InteractionSemanticDiff | null;\n screenshot: RetainedArtifactReference | null;\n focusedRef: string | null;\n changedRegions: InteractionRect[];\n observedAt: string;\n};\n\nexport type ComputerLocator =\n | { kind: \"ref\"; ref: string }\n | {\n kind: \"role\";\n role: string;\n name?: string | undefined;\n exact?: boolean | undefined;\n }\n | { kind: \"label\"; text: string; exact?: boolean | undefined }\n | { kind: \"text\"; text: string; exact?: boolean | undefined }\n | { kind: \"identifier\"; value: string };\n\nexport type ComputerAction =\n | {\n type: \"semantic\";\n locator: ComputerLocator;\n action:\n | \"invoke\"\n | \"focus\"\n | \"set_value\"\n | \"increment\"\n | \"decrement\"\n | \"select\"\n | \"deselect\"\n | \"expand\"\n | \"collapse\"\n | \"show_menu\"\n | \"scroll_into_view\";\n value?: string | number | boolean | undefined;\n }\n | {\n type: \"pointer\";\n frameId: string;\n action: \"click\" | \"double_click\" | \"move\" | \"scroll\" | \"drag\";\n x: number;\n y: number;\n endX?: number | undefined;\n endY?: number | undefined;\n deltaX?: number | undefined;\n deltaY?: number | undefined;\n button?: \"left\" | \"right\" | \"middle\" | undefined;\n /** Click only; 2 delivers one second click pair after a completed first click. */\n clickCount?: 1 | 2 | undefined;\n continuationOfOperationId?: string | undefined;\n }\n | { type: \"keyboard\"; action: \"type\" | \"press\"; value: string }\n | {\n type: \"clipboard\";\n operation: \"write\" | \"clear\" | \"copy\" | \"paste\";\n text?: string | undefined;\n }\n | { type: \"focus\"; targetId: string }\n | { type: \"launch\"; applicationId: string };\n\nexport type CreateComputerSessionRequest = {\n operationId: string;\n sessionId: string;\n name?: string | undefined;\n placement?: InteractionPlacement | undefined;\n};\n\nexport type ComputerSessionListResponse = {\n revision: number;\n sessions: ComputerSession[];\n};\n\nexport type ComputerSessionMutationResponse = {\n session: ComputerSession;\n operation: InteractionLifecycleOperationReceipt;\n};\n\nexport type ComputerSessionLifecycleRequest = { operationId: string };\n\nexport type ComputerTargetListResponse = {\n computerSessionId: string;\n controllerGeneration: string;\n targets: ComputerTarget[];\n};\n\nexport type InteractionFrameStreamOptions = {\n format?: \"jpeg\" | \"png\" | undefined;\n quality?: number | undefined;\n maxWidth?: number | undefined;\n maxHeight?: number | undefined;\n everyNthFrame?: number | undefined;\n};\n\nexport type ComputerFrameStreamOptions = InteractionFrameStreamOptions;\n\nexport type ComputerSessionAttachment = {\n computerSessionId: string;\n controllerGeneration: string;\n targetId: string;\n /** Viewer posture when attached; actions still reauthorize the live source. */\n inputAllowed?: boolean | undefined;\n stream: ComputerFrameStreamAttachment;\n expiresAt: string;\n};\n\n/** Caller-specific hint only; every action still requires live authorization. */\nexport type ComputerSessionInputPosture = {\n computerSessionId: string;\n controllerGeneration: string;\n inputAllowed: boolean;\n};\n\nexport type ComputerSessionAttachmentRequest = {\n targetId: string;\n expiresInSeconds?: number | undefined;\n stream?: ComputerFrameStreamOptions | undefined;\n};\n\nexport type ComputerActionRequest = {\n operationId: string;\n targetId: string;\n expectedTargetGeneration: string;\n expectedObservationId: string | null;\n expectedFrameId: string | null;\n action: ComputerAction;\n};\n\nexport type ComputerActionReceipt = {\n protocolVersion: typeof INTERACTION_PROTOCOL_VERSION;\n operationId: string;\n computerSessionId: string;\n controllerGeneration: string;\n targetId: string;\n state: InteractionOperationState;\n dispatchedAt: string | null;\n settledAt: string | null;\n observation: ComputerObservation | null;\n error: InteractionError | null;\n};\n\nexport type ComputerSessionHeartbeatResponse = {\n computerSessionId: string;\n controllerGeneration: string;\n alive: true;\n};\n\nexport type BrowserDiagnosticsOptions = {\n kinds?: BrowserDiagnosticKind[] | undefined;\n after?: number | undefined;\n limit?: number | undefined;\n signal?: AbortSignal | undefined;\n};\n\n/** The exact HTTP surface needed by the framework-free interaction client. */\nexport interface InteractionTransport {\n listNetworkRoutes(\n workspaceId: string,\n options?: NetworkRouteListOptions,\n ): Promise<NetworkRouteListResponse>;\n getNetworkRoute(\n workspaceId: string,\n networkRouteId: string,\n options?: OpenGeniRequestOptions,\n ): Promise<NetworkRoute>;\n createNetworkRoute(\n workspaceId: string,\n request: CreateNetworkRouteRequest,\n options?: OpenGeniRequestOptions,\n ): Promise<NetworkRouteMutationResponse>;\n updateNetworkRoute(\n workspaceId: string,\n networkRouteId: string,\n request: UpdateNetworkRouteRequest,\n options?: OpenGeniRequestOptions,\n ): Promise<NetworkRouteMutationResponse>;\n listSiteAuthConnections(\n workspaceId: string,\n options?: SiteAuthConnectionListOptions,\n ): Promise<SiteAuthConnectionListResponse>;\n getSiteAuthConnection(\n workspaceId: string,\n siteAuthConnectionId: string,\n options?: OpenGeniRequestOptions,\n ): Promise<SiteAuthConnection>;\n createSiteAuthConnection(\n workspaceId: string,\n request: CreateSiteAuthConnectionRequest,\n options?: OpenGeniRequestOptions,\n ): Promise<SiteAuthConnectionMutationResponse>;\n updateSiteAuthConnection(\n workspaceId: string,\n siteAuthConnectionId: string,\n request: UpdateSiteAuthConnectionRequest,\n options?: OpenGeniRequestOptions,\n ): Promise<SiteAuthConnectionMutationResponse>;\n listAuthRuns(workspaceId: string, options?: AuthRunListOptions): Promise<AuthRunListResponse>;\n getAuthRun(\n workspaceId: string,\n authRunId: string,\n options?: OpenGeniRequestOptions,\n ): Promise<AuthRun>;\n startBrowserAuthRun(\n workspaceId: string,\n browserSessionId: string,\n request: StartAuthRunRequest,\n options?: OpenGeniRequestOptions,\n ): Promise<AuthRunMutationResponse>;\n reportBrowserAuthRun(\n workspaceId: string,\n browserSessionId: string,\n authRunId: string,\n request: ReportAuthRunRequest,\n options?: OpenGeniRequestOptions,\n ): Promise<AuthRunMutationResponse>;\n protectedBrowserAuthFill(\n workspaceId: string,\n browserSessionId: string,\n authRunId: string,\n request: ProtectedAuthFillRequest,\n options?: OpenGeniRequestOptions,\n ): Promise<ProtectedAuthFillResponse>;\n advanceExternalBrowserAuthRun(\n workspaceId: string,\n browserSessionId: string,\n authRunId: string,\n request: ExternalAuthRunRequest,\n options?: OpenGeniRequestOptions,\n ): Promise<ExternalAuthRunResponse>;\n openExternalBrowserAuthFlow(\n workspaceId: string,\n browserSessionId: string,\n authRunId: string,\n request: ExternalAuthInteractiveRequest,\n options?: OpenGeniRequestOptions,\n ): Promise<ExternalAuthInteractiveResponse>;\n verifyBrowserAuthRun(\n workspaceId: string,\n browserSessionId: string,\n authRunId: string,\n request: VerifyAuthRunRequest,\n options?: OpenGeniRequestOptions,\n ): Promise<AuthRunMutationResponse>;\n listInteractionInterventions(\n workspaceId: string,\n options?: InteractionInterventionListOptions,\n ): Promise<InteractionInterventionListResponse>;\n getInteractionIntervention(\n workspaceId: string,\n interventionId: string,\n options?: OpenGeniRequestOptions,\n ): Promise<InteractionIntervention>;\n createInteractionIntervention(\n workspaceId: string,\n request: CreateInteractionInterventionRequest,\n options?: OpenGeniRequestOptions,\n ): Promise<InteractionInterventionMutationResponse>;\n resolveInteractionIntervention(\n workspaceId: string,\n interventionId: string,\n request: ResolveInteractionInterventionRequest,\n options?: OpenGeniRequestOptions,\n ): Promise<InteractionInterventionMutationResponse>;\n listAttachedBrowsers(\n workspaceId: string,\n options?: AttachedBrowserDeviceListOptions,\n ): Promise<AttachedBrowserDeviceListResponse>;\n getAttachedBrowser(\n workspaceId: string,\n deviceId: string,\n options?: OpenGeniRequestOptions,\n ): Promise<AttachedBrowserDevice>;\n listBrowserIdentities(\n workspaceId: string,\n options?: BrowserIdentityListOptions,\n ): Promise<BrowserIdentityListResponse>;\n getBrowserIdentity(\n workspaceId: string,\n identityId: string,\n options?: OpenGeniRequestOptions,\n ): Promise<BrowserIdentity>;\n createBrowserIdentity(\n workspaceId: string,\n request: CreateBrowserIdentityRequest,\n options?: OpenGeniRequestOptions,\n ): Promise<BrowserIdentityMutationResponse>;\n updateBrowserIdentity(\n workspaceId: string,\n identityId: string,\n request: UpdateBrowserIdentityRequest,\n options?: OpenGeniRequestOptions,\n ): Promise<BrowserIdentityMutationResponse>;\n listBrowserRevisions(\n workspaceId: string,\n identityId: string,\n options?: OpenGeniRequestOptions,\n ): Promise<BrowserRevisionListResponse>;\n listBrowserSessions(\n workspaceId: string,\n options?: OpenGeniRequestOptions,\n ): Promise<BrowserSessionListResponse>;\n getBrowserSession(\n workspaceId: string,\n browserSessionId: string,\n options?: OpenGeniRequestOptions,\n ): Promise<BrowserSession>;\n readBrowserClipboard(\n workspaceId: string,\n browserSessionId: string,\n options?: OpenGeniRequestOptions,\n ): Promise<BrowserClipboard>;\n listBrowserDownloads(\n workspaceId: string,\n browserSessionId: string,\n options?: OpenGeniRequestOptions,\n ): Promise<BrowserDownloadListResponse>;\n getBrowserDownload(\n workspaceId: string,\n browserSessionId: string,\n downloadId: string,\n options?: OpenGeniRequestOptions,\n ): Promise<BrowserDownload>;\n saveBrowserDownload(\n workspaceId: string,\n browserSessionId: string,\n downloadId: string,\n request: BrowserDownloadSaveRequest,\n options?: OpenGeniRequestOptions,\n ): Promise<BrowserDownloadSaveResponse>;\n createBrowserSession(\n workspaceId: string,\n request: CreateBrowserSessionRequest,\n options?: OpenGeniRequestOptions,\n ): Promise<BrowserSessionMutationResponse>;\n listBrowserTargets(\n workspaceId: string,\n browserSessionId: string,\n options?: OpenGeniRequestOptions,\n ): Promise<BrowserTargetListResponse>;\n openBrowserTarget(\n workspaceId: string,\n browserSessionId: string,\n request?: BrowserOpenTargetRequest,\n options?: OpenGeniRequestOptions,\n ): Promise<BrowserObservation>;\n selectBrowserTarget(\n workspaceId: string,\n browserSessionId: string,\n targetId: string,\n options?: OpenGeniRequestOptions,\n ): Promise<BrowserObservation>;\n closeBrowserTarget(\n workspaceId: string,\n browserSessionId: string,\n targetId: string,\n options?: OpenGeniRequestOptions,\n ): Promise<BrowserTargetListResponse>;\n observeBrowserTarget(\n workspaceId: string,\n browserSessionId: string,\n targetId: string,\n options?: OpenGeniRequestOptions,\n ): Promise<BrowserObservation>;\n getBrowserTargetState(\n workspaceId: string,\n browserSessionId: string,\n targetId: string,\n options?: OpenGeniRequestOptions,\n ): Promise<BrowserTargetState>;\n readBrowserDom(\n workspaceId: string,\n browserSessionId: string,\n targetId: string,\n request: BrowserDomReadRequest,\n options?: OpenGeniRequestOptions,\n ): Promise<BrowserDomReadResponse>;\n captureBrowserTarget(\n workspaceId: string,\n browserSessionId: string,\n targetId: string,\n options?: OpenGeniRequestOptions,\n captureOptions?: BrowserScreenshotOptions,\n ): Promise<BrowserFrame>;\n actInBrowser(\n workspaceId: string,\n browserSessionId: string,\n request: BrowserActionRequest,\n options?: OpenGeniRequestOptions,\n ): Promise<BrowserActionReceipt>;\n getBrowserActionReceipt(\n workspaceId: string,\n browserSessionId: string,\n operationId: string,\n options?: OpenGeniRequestOptions,\n ): Promise<BrowserActionReceipt>;\n listBrowserDiagnostics(\n workspaceId: string,\n browserSessionId: string,\n targetId: string,\n options?: BrowserDiagnosticsOptions,\n ): Promise<BrowserDiagnosticBatch>;\n attachBrowserSession(\n workspaceId: string,\n browserSessionId: string,\n request: BrowserSessionAttachmentRequest,\n options?: OpenGeniRequestOptions,\n ): Promise<BrowserSessionAttachment>;\n heartbeatBrowserSession(\n workspaceId: string,\n browserSessionId: string,\n options?: OpenGeniRequestOptions,\n ): Promise<BrowserSessionHeartbeatResponse>;\n publishBrowserRevision(\n workspaceId: string,\n browserSessionId: string,\n request: PublishBrowserRevisionRequest,\n options?: OpenGeniRequestOptions,\n ): Promise<PublishBrowserRevisionResponse>;\n suspendBrowserSession(\n workspaceId: string,\n browserSessionId: string,\n request: BrowserSessionLifecycleRequest,\n options?: OpenGeniRequestOptions,\n ): Promise<BrowserSessionMutationResponse>;\n resumeBrowserSession(\n workspaceId: string,\n browserSessionId: string,\n request: BrowserSessionLifecycleRequest,\n options?: OpenGeniRequestOptions,\n ): Promise<BrowserSessionMutationResponse>;\n endBrowserSession(\n workspaceId: string,\n browserSessionId: string,\n request: BrowserSessionLifecycleRequest,\n options?: OpenGeniRequestOptions,\n ): Promise<BrowserSessionMutationResponse>;\n listComputerSessions(\n workspaceId: string,\n options?: OpenGeniRequestOptions,\n ): Promise<ComputerSessionListResponse>;\n getComputerSession(\n workspaceId: string,\n computerSessionId: string,\n options?: OpenGeniRequestOptions,\n ): Promise<ComputerSession>;\n getComputerInputPosture?(\n workspaceId: string,\n computerSessionId: string,\n options?: OpenGeniRequestOptions,\n ): Promise<ComputerSessionInputPosture>;\n readComputerClipboard(\n workspaceId: string,\n computerSessionId: string,\n options?: OpenGeniRequestOptions,\n ): Promise<ComputerClipboard>;\n createComputerSession(\n workspaceId: string,\n request: CreateComputerSessionRequest,\n options?: OpenGeniRequestOptions,\n ): Promise<ComputerSessionMutationResponse>;\n listComputerTargets(\n workspaceId: string,\n computerSessionId: string,\n options?: OpenGeniRequestOptions,\n ): Promise<ComputerTargetListResponse>;\n observeComputerTarget(\n workspaceId: string,\n computerSessionId: string,\n targetId: string,\n options?: OpenGeniRequestOptions,\n ): Promise<ComputerObservation>;\n captureComputerTarget(\n workspaceId: string,\n computerSessionId: string,\n targetId: string,\n options?: OpenGeniRequestOptions,\n ): Promise<ComputerFrame>;\n actInComputer(\n workspaceId: string,\n computerSessionId: string,\n request: ComputerActionRequest,\n options?: OpenGeniRequestOptions,\n ): Promise<ComputerActionReceipt>;\n getComputerActionReceipt(\n workspaceId: string,\n computerSessionId: string,\n operationId: string,\n options?: OpenGeniRequestOptions,\n ): Promise<ComputerActionReceipt>;\n attachComputerSession(\n workspaceId: string,\n computerSessionId: string,\n request: ComputerSessionAttachmentRequest,\n options?: OpenGeniRequestOptions,\n ): Promise<ComputerSessionAttachment>;\n heartbeatComputerSession(\n workspaceId: string,\n computerSessionId: string,\n options?: OpenGeniRequestOptions,\n ): Promise<ComputerSessionHeartbeatResponse>;\n endComputerSession(\n workspaceId: string,\n computerSessionId: string,\n request: ComputerSessionLifecycleRequest,\n options?: OpenGeniRequestOptions,\n ): Promise<ComputerSessionMutationResponse>;\n}\n\n/** @deprecated Use InteractionTransport. */\nexport type BrowserInteractionTransport = InteractionTransport;\n\nexport type BrowserIdentityListOptions = OpenGeniRequestOptions & {\n includeArchived?: boolean | undefined;\n};\n\nexport type NetworkRouteListOptions = OpenGeniRequestOptions & {\n includeArchived?: boolean | undefined;\n};\n\nexport type SiteAuthConnectionListOptions = OpenGeniRequestOptions & {\n includeArchived?: boolean | undefined;\n};\n\nexport type AuthRunListOptions = OpenGeniRequestOptions & {\n browserSessionId?: string | undefined;\n siteAuthConnectionId?: string | undefined;\n includeSettled?: boolean | undefined;\n};\n\nexport type InteractionInterventionListOptions = OpenGeniRequestOptions & {\n resourceKind?: \"browser_session\" | \"computer_session\" | undefined;\n resourceId?: string | undefined;\n includeSettled?: boolean | undefined;\n};\n\nexport type AttachedBrowserDeviceListOptions = OpenGeniRequestOptions & {\n includeDisconnected?: boolean | undefined;\n};\n\nexport type BrowserDownloadSaveOptions = OpenGeniRequestOptions & {\n operationId?: string | undefined;\n overwrite?: boolean | undefined;\n};\n\nexport type CurrentOrOpenBrowserOptions = {\n workspaceId: string;\n associationSessionId: string;\n operationId?: string | undefined;\n name?: string | undefined;\n initialUrl?: string | undefined;\n headless?: boolean | undefined;\n storageMode?: \"private_profile\" | \"ephemeral_context\" | undefined;\n placement?: InteractionPlacement | undefined;\n identityId?: string | undefined;\n baseRevisionId?: string | undefined;\n networkRouteId?: string | undefined;\n linkedComputerSessionId?: string | undefined;\n signal?: AbortSignal | undefined;\n};\n\nexport type CurrentOrOpenComputerOptions = {\n workspaceId: string;\n associationSessionId: string;\n operationId?: string | undefined;\n name?: string | undefined;\n placement?: InteractionPlacement | undefined;\n signal?: AbortSignal | undefined;\n};\n\n/** Framework-free resource facade over the public interaction HTTP API. */\nexport class OpenGeniInteractionClient {\n readonly attachedBrowsers: AttachedBrowserDeviceCollection;\n readonly authRuns: AuthRunCollection;\n readonly browsers: BrowserSessionCollection;\n readonly computers: ComputerSessionCollection;\n readonly identities: BrowserIdentityCollection;\n readonly interventions: InteractionInterventionCollection;\n readonly networkRoutes: NetworkRouteCollection;\n readonly siteAuthConnections: SiteAuthConnectionCollection;\n\n constructor(transport: BrowserInteractionTransport) {\n this.attachedBrowsers = new AttachedBrowserDeviceCollection(transport);\n this.authRuns = new AuthRunCollection(transport);\n this.browsers = new BrowserSessionCollection(transport);\n this.computers = new ComputerSessionCollection(transport);\n this.identities = new BrowserIdentityCollection(transport);\n this.interventions = new InteractionInterventionCollection(transport);\n this.networkRoutes = new NetworkRouteCollection(transport);\n this.siteAuthConnections = new SiteAuthConnectionCollection(transport);\n }\n}\n\nexport class NetworkRouteCollection {\n constructor(private readonly transport: BrowserInteractionTransport) {}\n\n async list(\n workspaceId: string,\n options: NetworkRouteListOptions = {},\n ): Promise<NetworkRouteListResponse> {\n return await this.transport.listNetworkRoutes(workspaceId, options);\n }\n\n route(workspaceId: string, networkRouteId: string): NetworkRouteResource {\n return new NetworkRouteResource(this.transport, workspaceId, networkRouteId);\n }\n\n async create(\n workspaceId: string,\n request: CreateNetworkRouteRequest,\n options: OpenGeniRequestOptions = {},\n ): Promise<NetworkRouteResource> {\n const response = await this.transport.createNetworkRoute(workspaceId, request, options);\n return this.route(workspaceId, response.route.id);\n }\n}\n\nexport class NetworkRouteResource {\n constructor(\n private readonly transport: BrowserInteractionTransport,\n readonly workspaceId: string,\n readonly id: string,\n ) {}\n\n async get(options: OpenGeniRequestOptions = {}): Promise<NetworkRoute> {\n return await this.transport.getNetworkRoute(this.workspaceId, this.id, options);\n }\n\n async update(\n request: UpdateNetworkRouteRequest,\n options: OpenGeniRequestOptions = {},\n ): Promise<NetworkRouteMutationResponse> {\n return await this.transport.updateNetworkRoute(this.workspaceId, this.id, request, options);\n }\n}\n\nexport class SiteAuthConnectionCollection {\n constructor(private readonly transport: BrowserInteractionTransport) {}\n\n async list(\n workspaceId: string,\n options: SiteAuthConnectionListOptions = {},\n ): Promise<SiteAuthConnectionListResponse> {\n return await this.transport.listSiteAuthConnections(workspaceId, options);\n }\n\n connection(workspaceId: string, connectionId: string): SiteAuthConnectionResource {\n return new SiteAuthConnectionResource(this.transport, workspaceId, connectionId);\n }\n\n async create(\n workspaceId: string,\n request: CreateSiteAuthConnectionRequest,\n options: OpenGeniRequestOptions = {},\n ): Promise<SiteAuthConnectionResource> {\n const response = await this.transport.createSiteAuthConnection(workspaceId, request, options);\n return this.connection(workspaceId, response.connection.id);\n }\n}\n\nexport class SiteAuthConnectionResource {\n constructor(\n private readonly transport: BrowserInteractionTransport,\n readonly workspaceId: string,\n readonly id: string,\n ) {}\n\n async get(options: OpenGeniRequestOptions = {}): Promise<SiteAuthConnection> {\n return await this.transport.getSiteAuthConnection(this.workspaceId, this.id, options);\n }\n\n async update(\n request: UpdateSiteAuthConnectionRequest,\n options: OpenGeniRequestOptions = {},\n ): Promise<SiteAuthConnectionMutationResponse> {\n return await this.transport.updateSiteAuthConnection(\n this.workspaceId,\n this.id,\n request,\n options,\n );\n }\n}\n\nexport class AuthRunCollection {\n constructor(private readonly transport: BrowserInteractionTransport) {}\n\n async list(workspaceId: string, options: AuthRunListOptions = {}): Promise<AuthRunListResponse> {\n return await this.transport.listAuthRuns(workspaceId, options);\n }\n\n async get(\n workspaceId: string,\n authRunId: string,\n options: OpenGeniRequestOptions = {},\n ): Promise<AuthRun> {\n return await this.transport.getAuthRun(workspaceId, authRunId, options);\n }\n\n run(workspaceId: string, browserSessionId: string, authRunId: string): AuthRunResource {\n return new AuthRunResource(this.transport, workspaceId, browserSessionId, authRunId);\n }\n}\n\nexport class BrowserAuthRunCollection {\n constructor(\n private readonly transport: BrowserInteractionTransport,\n readonly workspaceId: string,\n readonly browserSessionId: string,\n ) {}\n\n async list(\n options: Omit<AuthRunListOptions, \"browserSessionId\"> = {},\n ): Promise<AuthRunListResponse> {\n return await this.transport.listAuthRuns(this.workspaceId, {\n ...options,\n browserSessionId: this.browserSessionId,\n });\n }\n\n run(authRunId: string): AuthRunResource {\n return new AuthRunResource(this.transport, this.workspaceId, this.browserSessionId, authRunId);\n }\n\n async start(\n request: StartAuthRunRequest,\n options: OpenGeniRequestOptions = {},\n ): Promise<AuthRunResource> {\n const response = await this.transport.startBrowserAuthRun(\n this.workspaceId,\n this.browserSessionId,\n request,\n options,\n );\n return this.run(response.run.id);\n }\n}\n\nexport class AuthRunResource {\n constructor(\n private readonly transport: BrowserInteractionTransport,\n readonly workspaceId: string,\n readonly browserSessionId: string,\n readonly id: string,\n ) {}\n\n async get(options: OpenGeniRequestOptions = {}): Promise<AuthRun> {\n const run = await this.transport.getAuthRun(this.workspaceId, this.id, options);\n if (run.browserSessionId !== this.browserSessionId) {\n throw new Error(\"AuthRun belongs to another BrowserSession\");\n }\n return run;\n }\n\n async report(\n request: ReportAuthRunRequest,\n options: OpenGeniRequestOptions = {},\n ): Promise<AuthRunMutationResponse> {\n return await this.transport.reportBrowserAuthRun(\n this.workspaceId,\n this.browserSessionId,\n this.id,\n request,\n options,\n );\n }\n\n async protectedFill(\n request: ProtectedAuthFillRequest,\n options: OpenGeniRequestOptions = {},\n ): Promise<ProtectedAuthFillResponse> {\n return await this.transport.protectedBrowserAuthFill(\n this.workspaceId,\n this.browserSessionId,\n this.id,\n request,\n options,\n );\n }\n\n async advanceExternal(\n request: ExternalAuthRunRequest,\n options: OpenGeniRequestOptions = {},\n ): Promise<ExternalAuthRunResponse> {\n return await this.transport.advanceExternalBrowserAuthRun(\n this.workspaceId,\n this.browserSessionId,\n this.id,\n request,\n options,\n );\n }\n\n /** Human-session helper. Hosted provider URLs never appear in model tools. */\n async openExternalFlow(\n request: ExternalAuthInteractiveRequest,\n options: OpenGeniRequestOptions = {},\n ): Promise<ExternalAuthInteractiveResponse> {\n return await this.transport.openExternalBrowserAuthFlow(\n this.workspaceId,\n this.browserSessionId,\n this.id,\n request,\n options,\n );\n }\n\n async verify(\n request: VerifyAuthRunRequest,\n options: OpenGeniRequestOptions = {},\n ): Promise<AuthRunMutationResponse> {\n return await this.transport.verifyBrowserAuthRun(\n this.workspaceId,\n this.browserSessionId,\n this.id,\n request,\n options,\n );\n }\n}\n\nexport class InteractionInterventionCollection {\n constructor(private readonly transport: BrowserInteractionTransport) {}\n\n async list(\n workspaceId: string,\n options: InteractionInterventionListOptions = {},\n ): Promise<InteractionInterventionListResponse> {\n return await this.transport.listInteractionInterventions(workspaceId, options);\n }\n\n intervention(workspaceId: string, interventionId: string): InteractionInterventionResource {\n return new InteractionInterventionResource(this.transport, workspaceId, interventionId);\n }\n\n async create(\n workspaceId: string,\n request: CreateInteractionInterventionRequest,\n options: OpenGeniRequestOptions = {},\n ): Promise<InteractionInterventionResource> {\n const response = await this.transport.createInteractionIntervention(\n workspaceId,\n request,\n options,\n );\n return this.intervention(workspaceId, response.intervention.id);\n }\n}\n\nexport class InteractionInterventionResource {\n constructor(\n private readonly transport: BrowserInteractionTransport,\n readonly workspaceId: string,\n readonly id: string,\n ) {}\n\n async get(options: OpenGeniRequestOptions = {}): Promise<InteractionIntervention> {\n return await this.transport.getInteractionIntervention(this.workspaceId, this.id, options);\n }\n\n async resolve(\n request: ResolveInteractionInterventionRequest,\n options: OpenGeniRequestOptions = {},\n ): Promise<InteractionInterventionMutationResponse> {\n return await this.transport.resolveInteractionIntervention(\n this.workspaceId,\n this.id,\n request,\n options,\n );\n }\n}\n\nexport class AttachedBrowserDeviceCollection {\n constructor(private readonly transport: BrowserInteractionTransport) {}\n\n async list(\n workspaceId: string,\n options: AttachedBrowserDeviceListOptions = {},\n ): Promise<AttachedBrowserDeviceListResponse> {\n return await this.transport.listAttachedBrowsers(workspaceId, options);\n }\n\n device(workspaceId: string, deviceId: string): AttachedBrowserDeviceResource {\n return new AttachedBrowserDeviceResource(this.transport, workspaceId, deviceId);\n }\n}\n\nexport class AttachedBrowserDeviceResource {\n constructor(\n private readonly transport: BrowserInteractionTransport,\n readonly workspaceId: string,\n readonly id: string,\n ) {}\n\n async get(options: OpenGeniRequestOptions = {}): Promise<AttachedBrowserDevice> {\n return await this.transport.getAttachedBrowser(this.workspaceId, this.id, options);\n }\n}\n\nexport class BrowserIdentityCollection {\n constructor(private readonly transport: BrowserInteractionTransport) {}\n\n async list(\n workspaceId: string,\n options: BrowserIdentityListOptions = {},\n ): Promise<BrowserIdentityListResponse> {\n return await this.transport.listBrowserIdentities(workspaceId, options);\n }\n\n identity(workspaceId: string, identityId: string): BrowserIdentityResource {\n return new BrowserIdentityResource(this.transport, workspaceId, identityId);\n }\n\n async create(\n workspaceId: string,\n request: CreateBrowserIdentityRequest,\n options: OpenGeniRequestOptions = {},\n ): Promise<BrowserIdentityResource> {\n const response = await this.transport.createBrowserIdentity(workspaceId, request, options);\n return this.identity(workspaceId, response.identity.id);\n }\n}\n\nexport class BrowserIdentityResource {\n constructor(\n private readonly transport: BrowserInteractionTransport,\n readonly workspaceId: string,\n readonly id: string,\n ) {}\n\n async get(options: OpenGeniRequestOptions = {}): Promise<BrowserIdentity> {\n return await this.transport.getBrowserIdentity(this.workspaceId, this.id, options);\n }\n\n async revisions(options: OpenGeniRequestOptions = {}): Promise<BrowserRevisionListResponse> {\n return await this.transport.listBrowserRevisions(this.workspaceId, this.id, options);\n }\n\n async update(\n request: UpdateBrowserIdentityRequest,\n options: OpenGeniRequestOptions = {},\n ): Promise<BrowserIdentityMutationResponse> {\n return await this.transport.updateBrowserIdentity(this.workspaceId, this.id, request, options);\n }\n}\n\nexport class BrowserSessionCollection {\n constructor(private readonly transport: BrowserInteractionTransport) {}\n\n async list(\n workspaceId: string,\n options: OpenGeniRequestOptions = {},\n ): Promise<BrowserSessionListResponse> {\n return await this.transport.listBrowserSessions(workspaceId, options);\n }\n\n session(workspaceId: string, browserSessionId: string): BrowserSessionResource {\n return new BrowserSessionResource(this.transport, workspaceId, browserSessionId);\n }\n\n async open(\n workspaceId: string,\n request: CreateBrowserSessionRequest,\n options: OpenGeniRequestOptions = {},\n ): Promise<BrowserSessionResource> {\n const response = await this.transport.createBrowserSession(workspaceId, request, options);\n return this.session(workspaceId, response.session.id);\n }\n\n async currentOrOpen(options: CurrentOrOpenBrowserOptions): Promise<BrowserSessionResource> {\n const requestOptions = options.signal ? { signal: options.signal } : {};\n const listed = await this.list(options.workspaceId, requestOptions);\n const current = newestRelevantBrowser(\n listed.sessions.filter(\n (session) =>\n browserSessionStorageMode(session) === (options.storageMode ?? \"private_profile\"),\n ),\n options.associationSessionId,\n );\n if (current) {\n const resource = this.session(options.workspaceId, current.id);\n if (current.lifecycle === \"suspended\") {\n await resource.resume(\n { operationId: options.operationId ?? crypto.randomUUID() },\n requestOptions,\n );\n }\n return resource;\n }\n return await this.open(\n options.workspaceId,\n {\n operationId: options.operationId ?? crypto.randomUUID(),\n sessionId: options.associationSessionId,\n ...(options.name !== undefined ? { name: options.name } : {}),\n ...(options.initialUrl !== undefined ? { initialUrl: options.initialUrl } : {}),\n ...(options.headless !== undefined ? { headless: options.headless } : {}),\n ...(options.storageMode !== undefined ? { storageMode: options.storageMode } : {}),\n ...(options.placement !== undefined ? { placement: options.placement } : {}),\n ...(options.identityId !== undefined ? { identityId: options.identityId } : {}),\n ...(options.baseRevisionId !== undefined ? { baseRevisionId: options.baseRevisionId } : {}),\n ...(options.networkRouteId !== undefined ? { networkRouteId: options.networkRouteId } : {}),\n ...(options.linkedComputerSessionId !== undefined\n ? { linkedComputerSessionId: options.linkedComputerSessionId }\n : {}),\n },\n requestOptions,\n );\n }\n}\n\nexport class BrowserSessionResource {\n readonly auth: BrowserAuthRunCollection;\n readonly clipboard: BrowserClipboardResource;\n readonly downloads: BrowserDownloadCollection;\n readonly tabs: BrowserTargetCollection;\n /** Alias for hosts that prefer the protocol term. */\n readonly targets: BrowserTargetCollection;\n\n constructor(\n private readonly transport: BrowserInteractionTransport,\n readonly workspaceId: string,\n readonly id: string,\n ) {\n this.auth = new BrowserAuthRunCollection(transport, workspaceId, id);\n this.clipboard = new BrowserClipboardResource(transport, workspaceId, id);\n this.downloads = new BrowserDownloadCollection(transport, workspaceId, id);\n this.tabs = new BrowserTargetCollection(transport, workspaceId, id);\n this.targets = this.tabs;\n }\n\n async get(options: OpenGeniRequestOptions = {}): Promise<BrowserSession> {\n return await this.transport.getBrowserSession(this.workspaceId, this.id, options);\n }\n\n async observe(\n targetId: string,\n options: OpenGeniRequestOptions = {},\n ): Promise<BrowserObservation> {\n return await this.transport.observeBrowserTarget(this.workspaceId, this.id, targetId, options);\n }\n\n async targetState(\n targetId: string,\n options: OpenGeniRequestOptions = {},\n ): Promise<BrowserTargetState> {\n return await this.transport.getBrowserTargetState(this.workspaceId, this.id, targetId, options);\n }\n\n async readDom(\n targetId: string,\n request: BrowserDomReadRequest,\n options: OpenGeniRequestOptions = {},\n ): Promise<BrowserDomReadResponse> {\n return await this.transport.readBrowserDom(\n this.workspaceId,\n this.id,\n targetId,\n request,\n options,\n );\n }\n\n async capture(\n targetId: string,\n options: OpenGeniRequestOptions = {},\n captureOptions: BrowserScreenshotOptions = {},\n ): Promise<BrowserFrame> {\n return await this.transport.captureBrowserTarget(\n this.workspaceId,\n this.id,\n targetId,\n options,\n captureOptions,\n );\n }\n\n async screenshot(\n targetId: string,\n captureOptions: BrowserScreenshotOptions = {},\n options: OpenGeniRequestOptions = {},\n ): Promise<BrowserFrame> {\n return await this.capture(targetId, options, captureOptions);\n }\n\n async act(\n request: BrowserActionRequest,\n options: OpenGeniRequestOptions = {},\n ): Promise<BrowserActionReceipt> {\n return await this.transport.actInBrowser(this.workspaceId, this.id, request, options);\n }\n\n async receipt(\n operationId: string,\n options: OpenGeniRequestOptions = {},\n ): Promise<BrowserActionReceipt> {\n return await this.transport.getBrowserActionReceipt(\n this.workspaceId,\n this.id,\n operationId,\n options,\n );\n }\n\n async diagnostics(\n targetId: string,\n options: BrowserDiagnosticsOptions = {},\n ): Promise<BrowserDiagnosticBatch> {\n return await this.transport.listBrowserDiagnostics(\n this.workspaceId,\n this.id,\n targetId,\n options,\n );\n }\n\n async attach(\n request: BrowserSessionAttachmentRequest,\n options: OpenGeniRequestOptions = {},\n ): Promise<BrowserSessionAttachment> {\n return await this.transport.attachBrowserSession(this.workspaceId, this.id, request, options);\n }\n\n async heartbeat(options: OpenGeniRequestOptions = {}): Promise<BrowserSessionHeartbeatResponse> {\n return await this.transport.heartbeatBrowserSession(this.workspaceId, this.id, options);\n }\n\n async publishRevision(\n request: PublishBrowserRevisionRequest,\n options: OpenGeniRequestOptions = {},\n ): Promise<PublishBrowserRevisionResponse> {\n return await this.transport.publishBrowserRevision(this.workspaceId, this.id, request, options);\n }\n\n async suspend(\n request: BrowserSessionLifecycleRequest = {\n operationId: crypto.randomUUID(),\n },\n options: OpenGeniRequestOptions = {},\n ): Promise<BrowserSessionMutationResponse> {\n return await this.transport.suspendBrowserSession(this.workspaceId, this.id, request, options);\n }\n\n async resume(\n request: BrowserSessionLifecycleRequest = {\n operationId: crypto.randomUUID(),\n },\n options: OpenGeniRequestOptions = {},\n ): Promise<BrowserSessionMutationResponse> {\n return await this.transport.resumeBrowserSession(this.workspaceId, this.id, request, options);\n }\n\n async end(\n request: BrowserSessionLifecycleRequest = {\n operationId: crypto.randomUUID(),\n },\n options: OpenGeniRequestOptions = {},\n ): Promise<BrowserSessionMutationResponse> {\n return await this.transport.endBrowserSession(this.workspaceId, this.id, request, options);\n }\n}\n\nexport class BrowserClipboardResource {\n constructor(\n private readonly transport: BrowserInteractionTransport,\n readonly workspaceId: string,\n readonly browserSessionId: string,\n ) {}\n\n async read(options: OpenGeniRequestOptions = {}): Promise<BrowserClipboard> {\n const clipboard = await this.transport.readBrowserClipboard(\n this.workspaceId,\n this.browserSessionId,\n options,\n );\n if (clipboard.browserSessionId !== this.browserSessionId) {\n throw new Error(\"Browser clipboard belongs to another BrowserSession\");\n }\n return clipboard;\n }\n}\n\nexport class BrowserDownloadCollection {\n constructor(\n private readonly transport: BrowserInteractionTransport,\n readonly workspaceId: string,\n readonly browserSessionId: string,\n ) {}\n\n async list(options: OpenGeniRequestOptions = {}): Promise<BrowserDownloadListResponse> {\n return await this.transport.listBrowserDownloads(\n this.workspaceId,\n this.browserSessionId,\n options,\n );\n }\n\n download(downloadId: string): BrowserDownloadResource {\n return new BrowserDownloadResource(\n this.transport,\n this.workspaceId,\n this.browserSessionId,\n downloadId,\n );\n }\n}\n\nexport class BrowserDownloadResource {\n constructor(\n private readonly transport: BrowserInteractionTransport,\n readonly workspaceId: string,\n readonly browserSessionId: string,\n readonly id: string,\n ) {}\n\n async get(options: OpenGeniRequestOptions = {}): Promise<BrowserDownload> {\n const download = await this.transport.getBrowserDownload(\n this.workspaceId,\n this.browserSessionId,\n this.id,\n options,\n );\n if (download.browserSessionId !== this.browserSessionId) {\n throw new Error(\"BrowserDownload belongs to another BrowserSession\");\n }\n return download;\n }\n\n /** Publish this exact private browser download into the source session's\n * workspace. Pass an operationId when the caller needs retry identity across\n * process boundaries; otherwise one is generated for this call. */\n async saveToWorkspace(\n destinationPath: string,\n options: BrowserDownloadSaveOptions = {},\n ): Promise<BrowserDownloadSaveResponse> {\n const { operationId = crypto.randomUUID(), overwrite = false, ...requestOptions } = options;\n const response = await this.transport.saveBrowserDownload(\n this.workspaceId,\n this.browserSessionId,\n this.id,\n { operationId, destinationPath, overwrite },\n requestOptions,\n );\n if (\n response.download.id !== this.id ||\n response.download.browserSessionId !== this.browserSessionId\n ) {\n throw new Error(\"BrowserDownload save returned another resource\");\n }\n return response;\n }\n}\n\nexport class BrowserTargetCollection {\n constructor(\n private readonly transport: BrowserInteractionTransport,\n private readonly workspaceId: string,\n private readonly browserSessionId: string,\n ) {}\n\n async list(options: OpenGeniRequestOptions = {}): Promise<BrowserTargetListResponse> {\n return await this.transport.listBrowserTargets(\n this.workspaceId,\n this.browserSessionId,\n options,\n );\n }\n\n async open(url?: string, options: OpenGeniRequestOptions = {}): Promise<BrowserObservation> {\n return await this.transport.openBrowserTarget(\n this.workspaceId,\n this.browserSessionId,\n url === undefined ? {} : { url },\n options,\n );\n }\n\n async select(\n targetId: string,\n options: OpenGeniRequestOptions = {},\n ): Promise<BrowserObservation> {\n return await this.transport.selectBrowserTarget(\n this.workspaceId,\n this.browserSessionId,\n targetId,\n options,\n );\n }\n\n async close(\n targetId: string,\n options: OpenGeniRequestOptions = {},\n ): Promise<BrowserTargetListResponse> {\n return await this.transport.closeBrowserTarget(\n this.workspaceId,\n this.browserSessionId,\n targetId,\n options,\n );\n }\n}\n\nexport class ComputerSessionCollection {\n constructor(private readonly transport: BrowserInteractionTransport) {}\n\n async list(\n workspaceId: string,\n options: OpenGeniRequestOptions = {},\n ): Promise<ComputerSessionListResponse> {\n return await this.transport.listComputerSessions(workspaceId, options);\n }\n\n session(workspaceId: string, computerSessionId: string): ComputerSessionResource {\n return new ComputerSessionResource(this.transport, workspaceId, computerSessionId);\n }\n\n async open(\n workspaceId: string,\n request: CreateComputerSessionRequest,\n options: OpenGeniRequestOptions = {},\n ): Promise<ComputerSessionResource> {\n const response = await this.transport.createComputerSession(workspaceId, request, options);\n return this.session(workspaceId, response.session.id);\n }\n\n async currentOrOpen(options: CurrentOrOpenComputerOptions): Promise<ComputerSessionResource> {\n const requestOptions = options.signal ? { signal: options.signal } : {};\n const listed = await this.list(options.workspaceId, requestOptions);\n const current = newestRelevantComputer(listed.sessions, options.associationSessionId);\n if (current) {\n return this.session(options.workspaceId, current.id);\n }\n return await this.open(\n options.workspaceId,\n {\n operationId: options.operationId ?? crypto.randomUUID(),\n sessionId: options.associationSessionId,\n ...(options.name !== undefined ? { name: options.name } : {}),\n ...(options.placement !== undefined ? { placement: options.placement } : {}),\n },\n requestOptions,\n );\n }\n}\n\nexport class ComputerSessionResource {\n readonly targets: ComputerTargetCollection;\n /** Native application/window targets are also the public app collection. */\n readonly apps: ComputerTargetCollection;\n readonly clipboard: ComputerClipboardResource;\n\n constructor(\n private readonly transport: BrowserInteractionTransport,\n readonly workspaceId: string,\n readonly id: string,\n ) {\n this.targets = new ComputerTargetCollection(transport, workspaceId, id);\n this.apps = this.targets;\n this.clipboard = new ComputerClipboardResource(transport, workspaceId, id);\n }\n\n async get(options: OpenGeniRequestOptions = {}): Promise<ComputerSession> {\n return await this.transport.getComputerSession(this.workspaceId, this.id, options);\n }\n\n async observe(\n targetId: string,\n options: OpenGeniRequestOptions = {},\n ): Promise<ComputerObservation> {\n return await this.transport.observeComputerTarget(this.workspaceId, this.id, targetId, options);\n }\n\n async capture(targetId: string, options: OpenGeniRequestOptions = {}): Promise<ComputerFrame> {\n return await this.transport.captureComputerTarget(this.workspaceId, this.id, targetId, options);\n }\n\n async act(\n request: ComputerActionRequest,\n options: OpenGeniRequestOptions = {},\n ): Promise<ComputerActionReceipt> {\n return await this.transport.actInComputer(this.workspaceId, this.id, request, options);\n }\n\n async receipt(\n operationId: string,\n options: OpenGeniRequestOptions = {},\n ): Promise<ComputerActionReceipt> {\n return await this.transport.getComputerActionReceipt(\n this.workspaceId,\n this.id,\n operationId,\n options,\n );\n }\n\n async attach(\n request: ComputerSessionAttachmentRequest,\n options: OpenGeniRequestOptions = {},\n ): Promise<ComputerSessionAttachment> {\n return await this.transport.attachComputerSession(this.workspaceId, this.id, request, options);\n }\n\n async inputPosture(options: OpenGeniRequestOptions = {}): Promise<ComputerSessionInputPosture> {\n if (!this.transport.getComputerInputPosture) {\n throw new Error(\"Computer input posture requires a current interaction transport.\");\n }\n return await this.transport.getComputerInputPosture(this.workspaceId, this.id, options);\n }\n\n async heartbeat(options: OpenGeniRequestOptions = {}): Promise<ComputerSessionHeartbeatResponse> {\n return await this.transport.heartbeatComputerSession(this.workspaceId, this.id, options);\n }\n\n async end(\n request: ComputerSessionLifecycleRequest = { operationId: crypto.randomUUID() },\n options: OpenGeniRequestOptions = {},\n ): Promise<ComputerSessionMutationResponse> {\n return await this.transport.endComputerSession(this.workspaceId, this.id, request, options);\n }\n}\n\nexport class ComputerClipboardResource {\n constructor(\n private readonly transport: BrowserInteractionTransport,\n readonly workspaceId: string,\n readonly computerSessionId: string,\n ) {}\n\n async read(options: OpenGeniRequestOptions = {}): Promise<ComputerClipboard> {\n const clipboard = await this.transport.readComputerClipboard(\n this.workspaceId,\n this.computerSessionId,\n options,\n );\n if (clipboard.computerSessionId !== this.computerSessionId) {\n throw new Error(\"Computer clipboard belongs to another ComputerSession\");\n }\n return clipboard;\n }\n}\n\nexport class ComputerTargetCollection {\n constructor(\n private readonly transport: BrowserInteractionTransport,\n private readonly workspaceId: string,\n private readonly computerSessionId: string,\n ) {}\n\n async list(options: OpenGeniRequestOptions = {}): Promise<ComputerTargetListResponse> {\n return await this.transport.listComputerTargets(\n this.workspaceId,\n this.computerSessionId,\n options,\n );\n }\n}\n\nexport type BrowserFrameMetadata = {\n frameId: string;\n browserSessionId: string;\n controllerGeneration: string;\n targetId: string;\n targetGeneration: string;\n documentGeneration: string;\n sequence: number;\n mediaType: \"image/jpeg\" | \"image/png\";\n width: number;\n height: number;\n deviceScaleFactor: number;\n scrollX: number;\n scrollY: number;\n capturedAt: string;\n};\n\nexport type BrowserFrame = BrowserFrameMetadata & { data: Uint8Array };\n\nexport type BrowserScreenshotOptions = {\n /** Capture the document content instead of the visible viewport. */\n fullPage?: boolean;\n format?: \"jpeg\" | \"png\";\n /** JPEG quality, from 1 to 100. Ignored for PNG. */\n quality?: number;\n};\n\nexport type ComputerFrameMetadata = {\n frameId: string;\n computerSessionId: string;\n controllerGeneration: string;\n targetId: string;\n targetGeneration: string;\n sequence: number;\n mediaType: \"image/jpeg\" | \"image/png\";\n width: number;\n height: number;\n capturedAt: string;\n sha256: string;\n};\n\nexport type ComputerFrame = ComputerFrameMetadata & { data: Uint8Array };\n\nexport type BrowserFrameStreamOptions = InteractionFrameStreamOptions;\n\n/** Convert a short-lived HTTP attachment URL into its browser WebSocket URL. */\nexport function browserFrameSocketUrl(\n attachment: BrowserSessionAttachment,\n options: BrowserFrameStreamOptions = {},\n): string {\n if (attachment.stream.kind !== \"direct_websocket\") {\n throw new Error(\"relay browser attachments are opened through the relay protocol\");\n }\n const url = new URL(attachment.stream.url);\n if (url.protocol === \"http:\") url.protocol = \"ws:\";\n else if (url.protocol === \"https:\") url.protocol = \"wss:\";\n else if (url.protocol !== \"ws:\" && url.protocol !== \"wss:\") {\n throw new Error(\"browser frame attachment did not contain an HTTP or WebSocket URL\");\n }\n upgradeMixedContentWebSocket(url);\n if (options.format !== undefined) url.searchParams.set(\"format\", options.format);\n setBoundedIntegerQuery(url, \"quality\", options.quality, 1, 100);\n setBoundedIntegerQuery(url, \"maxWidth\", options.maxWidth, 1, 4_096);\n setBoundedIntegerQuery(url, \"maxHeight\", options.maxHeight, 1, 4_096);\n setBoundedIntegerQuery(url, \"everyNthFrame\", options.everyNthFrame, 1, 60);\n return url.toString();\n}\n\n/** Convert a direct ComputerSession attachment into its WebSocket URL. */\nexport function computerFrameSocketUrl(\n attachment: ComputerSessionAttachment,\n options: ComputerFrameStreamOptions = {},\n): string {\n if (attachment.stream.kind !== \"direct_websocket\") {\n throw new Error(\"relay computer attachments are opened through the relay protocol\");\n }\n const url = new URL(attachment.stream.url);\n if (url.protocol === \"http:\") url.protocol = \"ws:\";\n else if (url.protocol === \"https:\") url.protocol = \"wss:\";\n else if (url.protocol !== \"ws:\" && url.protocol !== \"wss:\") {\n throw new Error(\"computer frame attachment did not contain an HTTP or WebSocket URL\");\n }\n upgradeMixedContentWebSocket(url);\n if (options.format !== undefined) url.searchParams.set(\"format\", options.format);\n setBoundedIntegerQuery(url, \"quality\", options.quality, 1, 100);\n setBoundedIntegerQuery(url, \"maxWidth\", options.maxWidth, 1, 4_096);\n setBoundedIntegerQuery(url, \"maxHeight\", options.maxHeight, 1, 4_096);\n setBoundedIntegerQuery(url, \"everyNthFrame\", options.everyNthFrame, 1, 60);\n return url.toString();\n}\n\n/** Decode one bounded binary frame message from the placement controller. */\nexport function decodeBrowserFrameMessage(message: ArrayBuffer | Uint8Array): BrowserFrame {\n const bytes = message instanceof Uint8Array ? message : new Uint8Array(message);\n if (\n bytes.byteLength < 5 ||\n bytes.byteLength > 4 + BROWSER_CONTROL_MAX_FRAME_HEADER_BYTES + BROWSER_FRAME_MAX_BYTES\n ) {\n throw new Error(\"browser frame message is truncated or too large\");\n }\n const metadataLength = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength).getUint32(\n 0,\n false,\n );\n if (\n metadataLength < 1 ||\n metadataLength > BROWSER_CONTROL_MAX_FRAME_HEADER_BYTES ||\n metadataLength + 4 >= bytes.byteLength\n ) {\n throw new Error(\"browser frame metadata length is invalid\");\n }\n let value: unknown;\n try {\n value = JSON.parse(\n new TextDecoder(\"utf-8\", { fatal: true }).decode(bytes.subarray(4, 4 + metadataLength)),\n );\n } catch {\n throw new Error(\"browser frame metadata is invalid JSON\");\n }\n const metadata = parseBrowserFrameMetadata(value);\n const data = bytes.slice(4 + metadataLength);\n if (data.byteLength < 1 || data.byteLength > BROWSER_FRAME_MAX_BYTES) {\n throw new Error(\"browser frame image is empty or too large\");\n }\n const dimensions = imageDimensions(data, metadata.mediaType);\n if (dimensions.width !== metadata.width || dimensions.height !== metadata.height) {\n throw new Error(\"browser frame image dimensions do not match metadata\");\n }\n return { ...metadata, data };\n}\n\n/** Decode and authenticate one bounded ComputerSession frame. Computer frames\n * carry a content digest because native capture adapters may cross process and\n * relay boundaries before reaching the SDK. */\nexport async function decodeComputerFrameMessage(\n message: ArrayBuffer | Uint8Array,\n): Promise<ComputerFrame> {\n const bytes = message instanceof Uint8Array ? message : new Uint8Array(message);\n if (\n bytes.byteLength < 5 ||\n bytes.byteLength > 4 + BROWSER_CONTROL_MAX_FRAME_HEADER_BYTES + BROWSER_FRAME_MAX_BYTES\n ) {\n throw new Error(\"computer frame message is truncated or too large\");\n }\n const metadataLength = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength).getUint32(\n 0,\n false,\n );\n if (\n metadataLength < 1 ||\n metadataLength > BROWSER_CONTROL_MAX_FRAME_HEADER_BYTES ||\n metadataLength + 4 >= bytes.byteLength\n ) {\n throw new Error(\"computer frame metadata length is invalid\");\n }\n let value: unknown;\n try {\n value = JSON.parse(\n new TextDecoder(\"utf-8\", { fatal: true }).decode(bytes.subarray(4, 4 + metadataLength)),\n );\n } catch {\n throw new Error(\"computer frame metadata is invalid JSON\");\n }\n const metadata = parseComputerFrameMetadata(value);\n const data = bytes.slice(4 + metadataLength);\n if (data.byteLength < 1 || data.byteLength > BROWSER_FRAME_MAX_BYTES) {\n throw new Error(\"computer frame image is empty or too large\");\n }\n const dimensions = imageDimensions(data, metadata.mediaType);\n if (dimensions.width !== metadata.width || dimensions.height !== metadata.height) {\n throw new Error(\"computer frame image dimensions do not match metadata\");\n }\n if ((await sha256Hex(data)) !== metadata.sha256) {\n throw new Error(\"computer frame digest does not match image\");\n }\n return { ...metadata, data };\n}\n\nexport function parseBrowserFrameMetadata(value: unknown): BrowserFrameMetadata {\n if (!isRecord(value)) throw new Error(\"browser frame metadata is invalid\");\n const allowed = new Set([\n \"frameId\",\n \"browserSessionId\",\n \"controllerGeneration\",\n \"targetId\",\n \"targetGeneration\",\n \"documentGeneration\",\n \"sequence\",\n \"mediaType\",\n \"width\",\n \"height\",\n \"deviceScaleFactor\",\n \"scrollX\",\n \"scrollY\",\n \"capturedAt\",\n ]);\n if (Object.keys(value).some((key) => !allowed.has(key))) {\n throw new Error(\"browser frame metadata contains unknown fields\");\n }\n const strings = [\n \"frameId\",\n \"browserSessionId\",\n \"controllerGeneration\",\n \"targetId\",\n \"targetGeneration\",\n \"documentGeneration\",\n \"mediaType\",\n \"capturedAt\",\n ] as const;\n for (const key of strings) {\n const item = value[key];\n const max = key === \"targetId\" ? 512 : key === \"capturedAt\" ? 128 : 256;\n if (typeof item !== \"string\" || item.length < 1 || utf8Bytes(item) > max) {\n throw new Error(\"browser frame metadata is invalid\");\n }\n }\n const numbers = [\n \"sequence\",\n \"width\",\n \"height\",\n \"deviceScaleFactor\",\n \"scrollX\",\n \"scrollY\",\n ] as const;\n for (const key of numbers) {\n if (typeof value[key] !== \"number\" || !Number.isFinite(value[key])) {\n throw new Error(\"browser frame metadata is invalid\");\n }\n }\n const metadata = value as unknown as BrowserFrameMetadata;\n if (\n !Number.isSafeInteger(metadata.sequence) ||\n metadata.sequence < 0 ||\n !Number.isSafeInteger(metadata.width) ||\n !Number.isSafeInteger(metadata.height)\n ) {\n throw new Error(\"browser frame metadata integers are invalid\");\n }\n assertImageDimensions(metadata.width, metadata.height);\n if (\n metadata.deviceScaleFactor <= 0 ||\n metadata.deviceScaleFactor > 16 ||\n Math.abs(metadata.scrollX) > 1_000_000_000 ||\n Math.abs(metadata.scrollY) > 1_000_000_000\n ) {\n throw new Error(\"browser frame geometry metadata is invalid\");\n }\n if (metadata.mediaType !== \"image/jpeg\" && metadata.mediaType !== \"image/png\") {\n throw new Error(\"browser frame media type is invalid\");\n }\n if (!isUuid(metadata.browserSessionId)) throw new Error(\"browser frame session id is invalid\");\n if (!/^[A-Za-z0-9][A-Za-z0-9._:-]*$/u.test(metadata.controllerGeneration)) {\n throw new Error(\"browser frame controller generation is invalid\");\n }\n if (!Number.isFinite(new Date(metadata.capturedAt).valueOf())) {\n throw new Error(\"browser frame timestamp is invalid\");\n }\n return metadata;\n}\n\nexport function parseComputerFrameMetadata(value: unknown): ComputerFrameMetadata {\n if (!isRecord(value)) throw new Error(\"computer frame metadata is invalid\");\n const allowed = new Set([\n \"frameId\",\n \"computerSessionId\",\n \"controllerGeneration\",\n \"targetId\",\n \"targetGeneration\",\n \"sequence\",\n \"mediaType\",\n \"width\",\n \"height\",\n \"capturedAt\",\n \"sha256\",\n ]);\n if (Object.keys(value).some((key) => !allowed.has(key))) {\n throw new Error(\"computer frame metadata contains unknown fields\");\n }\n const strings = [\n \"frameId\",\n \"computerSessionId\",\n \"controllerGeneration\",\n \"targetId\",\n \"targetGeneration\",\n \"mediaType\",\n \"capturedAt\",\n \"sha256\",\n ] as const;\n for (const key of strings) {\n const item = value[key];\n const max = key === \"targetId\" ? 512 : key === \"capturedAt\" ? 128 : 256;\n if (typeof item !== \"string\" || item.length < 1 || utf8Bytes(item) > max) {\n throw new Error(\"computer frame metadata is invalid\");\n }\n }\n const metadata = value as unknown as ComputerFrameMetadata;\n if (\n !Number.isSafeInteger(metadata.sequence) ||\n metadata.sequence < 0 ||\n !Number.isSafeInteger(metadata.width) ||\n !Number.isSafeInteger(metadata.height)\n ) {\n throw new Error(\"computer frame metadata integers are invalid\");\n }\n assertImageDimensions(metadata.width, metadata.height);\n if (metadata.mediaType !== \"image/jpeg\" && metadata.mediaType !== \"image/png\") {\n throw new Error(\"computer frame media type is invalid\");\n }\n if (!isUuid(metadata.computerSessionId)) {\n throw new Error(\"computer frame session id is invalid\");\n }\n if (!/^[A-Za-z0-9][A-Za-z0-9._:-]*$/u.test(metadata.controllerGeneration)) {\n throw new Error(\"computer frame controller generation is invalid\");\n }\n if (!Number.isFinite(new Date(metadata.capturedAt).valueOf())) {\n throw new Error(\"computer frame timestamp is invalid\");\n }\n if (!/^[0-9a-f]{64}$/u.test(metadata.sha256)) {\n throw new Error(\"computer frame digest is invalid\");\n }\n return metadata;\n}\n\nexport function decodeComputerFrameMetadataHeader(value: string): ComputerFrameMetadata {\n if (!value || value.length > 32 * 1024 || !/^[A-Za-z0-9_-]+$/u.test(value)) {\n throw new Error(\"computer frame metadata header is invalid\");\n }\n const normalized = value.replace(/-/gu, \"+\").replace(/_/gu, \"/\");\n const padded = normalized.padEnd(Math.ceil(normalized.length / 4) * 4, \"=\");\n let decoded: string;\n try {\n decoded = atob(padded);\n } catch {\n throw new Error(\"computer frame metadata header is invalid\");\n }\n const bytes = Uint8Array.from(decoded, (character) => character.charCodeAt(0));\n let metadata: unknown;\n try {\n metadata = JSON.parse(new TextDecoder(\"utf-8\", { fatal: true }).decode(bytes));\n } catch {\n throw new Error(\"computer frame metadata header is invalid\");\n }\n return parseComputerFrameMetadata(metadata);\n}\n\nfunction newestRelevantBrowser(\n sessions: readonly BrowserSession[],\n associationSessionId: string,\n): BrowserSession | null {\n const live = sessions.filter(\n (session) =>\n ![\"ending\", \"ended\", \"failed\", \"lost\"].includes(session.lifecycle) &&\n session.associations.some((association) => association.sessionId === associationSessionId),\n );\n live.sort(\n (left, right) =>\n browserRelevance(right, associationSessionId) - browserRelevance(left, associationSessionId),\n );\n return live[0] ?? null;\n}\n\nfunction newestRelevantComputer(\n sessions: readonly ComputerSession[],\n associationSessionId: string,\n): ComputerSession | null {\n const live = sessions.filter(\n (session) =>\n [\"starting\", \"active\", \"restoring\"].includes(session.lifecycle) &&\n session.associations.some((association) => association.sessionId === associationSessionId),\n );\n live.sort(\n (left, right) =>\n computerRelevance(right, associationSessionId) -\n computerRelevance(left, associationSessionId),\n );\n return live[0] ?? null;\n}\n\nfunction browserRelevance(session: BrowserSession, associationSessionId: string): number {\n const association = session.associations\n .filter((item) => item.sessionId === associationSessionId)\n .map((item) => Date.parse(item.lastUsedAt))\n .filter(Number.isFinite)\n .reduce((best, timestamp) => Math.max(best, timestamp), 0);\n const used = Date.parse(session.lastUsedAt);\n return Math.max(association, Number.isFinite(used) ? used : 0);\n}\n\nfunction computerRelevance(session: ComputerSession, associationSessionId: string): number {\n const association = session.associations\n .filter((item) => item.sessionId === associationSessionId)\n .map((item) => Date.parse(item.lastUsedAt))\n .filter(Number.isFinite)\n .reduce((best, timestamp) => Math.max(best, timestamp), 0);\n const used = Date.parse(session.lastUsedAt);\n return Math.max(association, Number.isFinite(used) ? used : 0);\n}\n\nfunction upgradeMixedContentWebSocket(url: URL): void {\n const protocol = (globalThis as { location?: { protocol?: string } }).location?.protocol;\n if (protocol === \"https:\" && url.protocol === \"ws:\") url.protocol = \"wss:\";\n}\n\nfunction setBoundedIntegerQuery(\n url: URL,\n name: string,\n value: number | undefined,\n min: number,\n max: number,\n): void {\n if (value === undefined) return;\n if (!Number.isSafeInteger(value) || value < min || value > max) {\n throw new Error(`browser frame ${name} must be an integer between ${min} and ${max}`);\n }\n url.searchParams.set(name, String(value));\n}\n\nfunction imageDimensions(\n data: Uint8Array,\n mediaType: BrowserFrameMetadata[\"mediaType\"],\n): { width: number; height: number } {\n const dimensions = mediaType === \"image/png\" ? pngDimensions(data) : jpegDimensions(data);\n assertImageDimensions(dimensions.width, dimensions.height);\n return dimensions;\n}\n\nfunction assertImageDimensions(width: number, height: number): void {\n if (\n !Number.isSafeInteger(width) ||\n !Number.isSafeInteger(height) ||\n width < 1 ||\n height < 1 ||\n width > BROWSER_FRAME_MAX_DIMENSION ||\n height > BROWSER_FRAME_MAX_DIMENSION ||\n width * height > BROWSER_FRAME_MAX_PIXELS\n ) {\n throw new Error(\"browser image dimensions exceed their bounded envelope\");\n }\n}\n\nfunction pngDimensions(data: Uint8Array): { width: number; height: number } {\n const signature = [137, 80, 78, 71, 13, 10, 26, 10];\n if (\n data.byteLength < 24 ||\n !signature.every((byte, index) => data[index] === byte) ||\n String.fromCharCode(...data.slice(12, 16)) !== \"IHDR\"\n ) {\n throw new Error(\"browser returned an invalid PNG image\");\n }\n const view = new DataView(data.buffer, data.byteOffset, data.byteLength);\n return { width: view.getUint32(16), height: view.getUint32(20) };\n}\n\nfunction jpegDimensions(data: Uint8Array): { width: number; height: number } {\n if (data.byteLength < 4 || data[0] !== 0xff || data[1] !== 0xd8) {\n throw new Error(\"browser returned an invalid JPEG image\");\n }\n let offset = 2;\n while (offset + 3 < data.byteLength) {\n if (data[offset] !== 0xff) {\n offset += 1;\n continue;\n }\n let marker = data[offset + 1]!;\n while (marker === 0xff) {\n offset += 1;\n marker = data[offset + 1]!;\n }\n if (\n marker === 0xd8 ||\n marker === 0xd9 ||\n marker === 0x01 ||\n (marker >= 0xd0 && marker <= 0xd7)\n ) {\n offset += 2;\n continue;\n }\n if (offset + 3 >= data.byteLength) break;\n const length = (data[offset + 2]! << 8) | data[offset + 3]!;\n if (length < 2 || offset + 2 + length > data.byteLength) break;\n if (isJpegStartOfFrame(marker)) {\n if (length < 7 || offset + 8 >= data.byteLength) break;\n return {\n height: (data[offset + 5]! << 8) | data[offset + 6]!,\n width: (data[offset + 7]! << 8) | data[offset + 8]!,\n };\n }\n offset += 2 + length;\n }\n throw new Error(\"browser returned a JPEG without dimensions\");\n}\n\nfunction isJpegStartOfFrame(marker: number): boolean {\n return (\n (marker >= 0xc0 && marker <= 0xc3) ||\n (marker >= 0xc5 && marker <= 0xc7) ||\n (marker >= 0xc9 && marker <= 0xcb) ||\n (marker >= 0xcd && marker <= 0xcf)\n );\n}\n\nfunction utf8Bytes(value: string): number {\n return new TextEncoder().encode(value).byteLength;\n}\n\nasync function sha256Hex(value: Uint8Array): Promise<string> {\n const subtle = globalThis.crypto?.subtle;\n if (!subtle) throw new Error(\"computer frame digest verification is unavailable\");\n const copy = new Uint8Array(value.byteLength);\n copy.set(value);\n const digest = new Uint8Array(await subtle.digest(\"SHA-256\", copy));\n return [...digest].map((byte) => byte.toString(16).padStart(2, \"0\")).join(\"\");\n}\n\nfunction isUuid(value: string): boolean {\n return /^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/iu.test(value);\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1107,14 +1107,7 @@ var REALTIME_REFUSAL_CODES = /* @__PURE__ */ new Set([
|
|
|
1107
1107
|
function codexRealtimeRefusal(error) {
|
|
1108
1108
|
if (!(error instanceof OpenGeniApiError) || !error.code) return null;
|
|
1109
1109
|
if (!REALTIME_REFUSAL_CODES.has(error.code)) return null;
|
|
1110
|
-
|
|
1111
|
-
try {
|
|
1112
|
-
const body = JSON.parse(error.body);
|
|
1113
|
-
const nested = body.error && typeof body.error === "object" ? body.error : body;
|
|
1114
|
-
message = typeof nested.message === "string" && nested.message ? nested.message : null;
|
|
1115
|
-
} catch {
|
|
1116
|
-
message = null;
|
|
1117
|
-
}
|
|
1110
|
+
const message = apiErrorMessage(error);
|
|
1118
1111
|
return {
|
|
1119
1112
|
code: error.code,
|
|
1120
1113
|
message: message ?? (error.code === "insufficient_credits" ? "Live voice needs Opengeni credits. Add credits to continue." : "Live voice is unavailable right now.")
|
|
@@ -1197,6 +1190,7 @@ function createCodexRealtimeController(options) {
|
|
|
1197
1190
|
let generation = 0;
|
|
1198
1191
|
let reconnectAttempt = 0;
|
|
1199
1192
|
let recoveryTerminal = false;
|
|
1193
|
+
let connectedInMode = false;
|
|
1200
1194
|
let mutationTail = Promise.resolve();
|
|
1201
1195
|
let connectionTask = null;
|
|
1202
1196
|
const acceptedDelegationItemIds = new Set(
|
|
@@ -1449,6 +1443,10 @@ function createCodexRealtimeController(options) {
|
|
|
1449
1443
|
if (closed || stopping || isAbortError(error)) return;
|
|
1450
1444
|
const message = safeError2(error);
|
|
1451
1445
|
if (error instanceof CodexRealtimeMicrophoneError) {
|
|
1446
|
+
if (error.code !== "track_ended" && !connectedInMode) {
|
|
1447
|
+
await endAfterFailure(microphoneFailureMessage(error), null);
|
|
1448
|
+
return;
|
|
1449
|
+
}
|
|
1452
1450
|
if (error.code === "track_ended" && state.mode?.state === "active") {
|
|
1453
1451
|
reconnectAttempt += 1;
|
|
1454
1452
|
publish({
|
|
@@ -1490,6 +1488,9 @@ function createCodexRealtimeController(options) {
|
|
|
1490
1488
|
return;
|
|
1491
1489
|
}
|
|
1492
1490
|
}
|
|
1491
|
+
} else if (error instanceof OpenGeniApiError && !error.retryable && !connectedInMode) {
|
|
1492
|
+
await endAfterFailure(message, null);
|
|
1493
|
+
return;
|
|
1493
1494
|
} else if (error instanceof OpenGeniApiError && !error.retryable) {
|
|
1494
1495
|
stopTimers();
|
|
1495
1496
|
if (!active) releaseMicrophone();
|
|
@@ -1730,6 +1731,7 @@ function createCodexRealtimeController(options) {
|
|
|
1730
1731
|
onFatal: (fatal) => onBridgeFatal(targetGeneration, bridge, fatal)
|
|
1731
1732
|
});
|
|
1732
1733
|
active = { generation: targetGeneration, transport: connected, bridge };
|
|
1734
|
+
connectedInMode = true;
|
|
1733
1735
|
connected.setOutputMuted(state.outputMuted);
|
|
1734
1736
|
recoveryTerminal = false;
|
|
1735
1737
|
pendingAbort = null;
|
|
@@ -1827,7 +1829,8 @@ function createCodexRealtimeController(options) {
|
|
|
1827
1829
|
stopInstruction = null;
|
|
1828
1830
|
if (instruction && !stopping && !closed) await endForRefusal(instruction);
|
|
1829
1831
|
};
|
|
1830
|
-
const endForRefusal = async (refusal) =>
|
|
1832
|
+
const endForRefusal = async (refusal) => await endAfterFailure(refusal.message, refusal);
|
|
1833
|
+
const endAfterFailure = async (message, refusal) => {
|
|
1831
1834
|
try {
|
|
1832
1835
|
await controller.stop();
|
|
1833
1836
|
} catch {
|
|
@@ -1841,8 +1844,8 @@ function createCodexRealtimeController(options) {
|
|
|
1841
1844
|
realtimeId: null,
|
|
1842
1845
|
mode: null,
|
|
1843
1846
|
bridge: null,
|
|
1844
|
-
diagnostic: diagnostic("terminal_stop",
|
|
1845
|
-
error:
|
|
1847
|
+
diagnostic: diagnostic("terminal_stop", message, false),
|
|
1848
|
+
error: message,
|
|
1846
1849
|
refusal
|
|
1847
1850
|
});
|
|
1848
1851
|
};
|
|
@@ -1893,6 +1896,7 @@ function createCodexRealtimeController(options) {
|
|
|
1893
1896
|
closed = false;
|
|
1894
1897
|
stopping = false;
|
|
1895
1898
|
recoveryTerminal = false;
|
|
1899
|
+
connectedInMode = false;
|
|
1896
1900
|
const record2 = {
|
|
1897
1901
|
version: OWNER_RECORD_VERSION,
|
|
1898
1902
|
workspaceId: options.workspaceId,
|
|
@@ -1931,6 +1935,7 @@ function createCodexRealtimeController(options) {
|
|
|
1931
1935
|
if (recoveryTerminal && state.mode?.state === "active") return;
|
|
1932
1936
|
const record3 = readOwnerRecord(storage, storageKey, options);
|
|
1933
1937
|
if (!record3) {
|
|
1938
|
+
if (state.status === "error" && !state.mode) return;
|
|
1934
1939
|
transitionEnded();
|
|
1935
1940
|
return;
|
|
1936
1941
|
}
|
|
@@ -1951,7 +1956,7 @@ function createCodexRealtimeController(options) {
|
|
|
1951
1956
|
if (lifecycle.state === "ended") {
|
|
1952
1957
|
const record3 = readOwnerRecord(storage, storageKey, options);
|
|
1953
1958
|
if (record3 && record3.operationId !== lifecycle.operationId) {
|
|
1954
|
-
if (connectionTask || state.status === "active") return;
|
|
1959
|
+
if (connectionTask || state.status === "active" || state.status === "starting") return;
|
|
1955
1960
|
closed = false;
|
|
1956
1961
|
stopping = false;
|
|
1957
1962
|
owner = record3;
|
|
@@ -1964,6 +1969,7 @@ function createCodexRealtimeController(options) {
|
|
|
1964
1969
|
await connectionTask;
|
|
1965
1970
|
return;
|
|
1966
1971
|
}
|
|
1972
|
+
if (state.status === "error" && !state.mode) return;
|
|
1967
1973
|
if (state.realtimeId === null || lifecycle.realtimeId === state.realtimeId) {
|
|
1968
1974
|
transitionEnded(`Realtime ended: ${lifecycle.reason}`);
|
|
1969
1975
|
}
|
|
@@ -2317,8 +2323,33 @@ function stringValue2(value) {
|
|
|
2317
2323
|
function isAbortError(error) {
|
|
2318
2324
|
return error instanceof Error && error.name === "AbortError";
|
|
2319
2325
|
}
|
|
2326
|
+
function microphoneFailureMessage(error) {
|
|
2327
|
+
switch (error.code) {
|
|
2328
|
+
case "permission_denied":
|
|
2329
|
+
return "Microphone access is blocked. Allow it in site settings, then try again.";
|
|
2330
|
+
case "device_not_found":
|
|
2331
|
+
return "No microphone was found. Connect one, then try again.";
|
|
2332
|
+
case "device_unavailable":
|
|
2333
|
+
return "Your microphone is busy or unavailable. Close other apps using it, then try again.";
|
|
2334
|
+
default:
|
|
2335
|
+
return /timed out/i.test(error.message) ? "Microphone access wasn't granted in time. Allow it when your browser asks, then try again." : "The microphone could not start. Try again.";
|
|
2336
|
+
}
|
|
2337
|
+
}
|
|
2338
|
+
function apiErrorMessage(error) {
|
|
2339
|
+
try {
|
|
2340
|
+
const body = JSON.parse(error.body);
|
|
2341
|
+
const nested = body.error && typeof body.error === "object" ? body.error : body;
|
|
2342
|
+
return typeof nested.message === "string" && nested.message ? nested.message : null;
|
|
2343
|
+
} catch {
|
|
2344
|
+
return null;
|
|
2345
|
+
}
|
|
2346
|
+
}
|
|
2320
2347
|
function safeError2(error) {
|
|
2321
|
-
|
|
2348
|
+
if (error instanceof OpenGeniApiError) {
|
|
2349
|
+
const message = apiErrorMessage(error);
|
|
2350
|
+
if (message) return /[.!?]$/.test(message) ? message : `${message}.`;
|
|
2351
|
+
}
|
|
2352
|
+
return error instanceof Error ? error.message : "Live voice failed in this browser.";
|
|
2322
2353
|
}
|
|
2323
2354
|
|
|
2324
2355
|
export {
|
|
@@ -2348,4 +2379,4 @@ export {
|
|
|
2348
2379
|
hasStoredSessionRealtimeOwnerProof,
|
|
2349
2380
|
createCodexRealtimeController
|
|
2350
2381
|
};
|
|
2351
|
-
//# sourceMappingURL=chunk-
|
|
2382
|
+
//# sourceMappingURL=chunk-JOI7XCG6.js.map
|