@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.
Files changed (46) hide show
  1. package/README.md +12 -0
  2. package/dist/adapters/next.js +2 -2
  3. package/dist/artifacts.js +5 -5
  4. package/dist/browser.js +3 -3
  5. package/dist/chat/index.js +15 -9
  6. package/dist/chat/index.js.map +1 -1
  7. package/dist/{chunk-BVIIRSJY.js → chunk-6SWFOZUP.js} +3 -3
  8. package/dist/{chunk-LEBDXYMA.js → chunk-7A5ZDWQH.js} +2 -2
  9. package/dist/{chunk-GYM54GKM.js → chunk-DTIMLEPB.js} +1 -1
  10. package/dist/chunk-DTIMLEPB.js.map +1 -0
  11. package/dist/{chunk-CA2T7QT4.js → chunk-HORQJBLP.js} +2 -2
  12. package/dist/{chunk-NC57YMUO.js → chunk-IJWKWFSF.js} +1 -1
  13. package/dist/chunk-IJWKWFSF.js.map +1 -0
  14. package/dist/{chunk-ZNC44QEX.js → chunk-JOI7XCG6.js} +45 -14
  15. package/dist/chunk-JOI7XCG6.js.map +1 -0
  16. package/dist/{chunk-D534PIXF.js → chunk-MAFL52JD.js} +2 -2
  17. package/dist/{chunk-FYQAMXDW.js → chunk-OLLQBZAE.js} +111 -5
  18. package/dist/chunk-OLLQBZAE.js.map +1 -0
  19. package/dist/{chunk-MXV5O25O.js → chunk-W72BOLRJ.js} +2 -2
  20. package/dist/codex-realtime-controller.js +1 -1
  21. package/dist/core.js +4 -4
  22. package/dist/document-authority.js +4 -4
  23. package/dist/editable-artifacts.js +1 -1
  24. package/dist/index.js +9 -9
  25. package/dist/interaction.d.ts +5 -0
  26. package/dist/interaction.js +1 -1
  27. package/dist/realtime.js +1 -1
  28. package/dist/session-proxy.d.ts +29 -6
  29. package/dist/session-proxy.js +2 -2
  30. package/dist/site.js +4 -4
  31. package/dist/types.d.ts +17 -0
  32. package/package.json +3 -3
  33. package/src/chat/opengeni.ts +14 -3
  34. package/src/codex-realtime-controller.ts +65 -14
  35. package/src/interaction.ts +5 -0
  36. package/src/session-proxy.ts +189 -9
  37. package/src/types.ts +15 -0
  38. package/dist/chunk-FYQAMXDW.js.map +0 -1
  39. package/dist/chunk-GYM54GKM.js.map +0 -1
  40. package/dist/chunk-NC57YMUO.js.map +0 -1
  41. package/dist/chunk-ZNC44QEX.js.map +0 -1
  42. /package/dist/{chunk-BVIIRSJY.js.map → chunk-6SWFOZUP.js.map} +0 -0
  43. /package/dist/{chunk-LEBDXYMA.js.map → chunk-7A5ZDWQH.js.map} +0 -0
  44. /package/dist/{chunk-CA2T7QT4.js.map → chunk-HORQJBLP.js.map} +0 -0
  45. /package/dist/{chunk-D534PIXF.js.map → chunk-MAFL52JD.js.map} +0 -0
  46. /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-BVIIRSJY.js";
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-CA2T7QT4.js.map
150
+ //# sourceMappingURL=chunk-HORQJBLP.js.map
@@ -1102,4 +1102,4 @@ export {
1102
1102
  parseComputerFrameMetadata,
1103
1103
  decodeComputerFrameMetadataHeader
1104
1104
  };
1105
- //# sourceMappingURL=chunk-NC57YMUO.js.map
1105
+ //# sourceMappingURL=chunk-IJWKWFSF.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
- let message = null;
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", refusal.message, false),
1845
- error: refusal.message,
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
- return error instanceof Error ? error.message : "Codex realtime browser controller failed";
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-ZNC44QEX.js.map
2382
+ //# sourceMappingURL=chunk-JOI7XCG6.js.map