@opengeni/react 0.52.1 → 1.0.1

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 (132) hide show
  1. package/README.md +51 -1
  2. package/dist/artifacts.d.ts +1 -1
  3. package/dist/artifacts.js +43 -14
  4. package/dist/artifacts.js.map +1 -1
  5. package/dist/{chunk-ROIRTM37.js → chunk-5UQPNLIO.js} +6 -6
  6. package/dist/{chunk-JR3QFY6B.js → chunk-6KLX2RH5.js} +49 -2
  7. package/dist/chunk-6KLX2RH5.js.map +1 -0
  8. package/dist/{chunk-FWS3KC3Z.js → chunk-B6WPZSTT.js} +104 -104
  9. package/dist/{chunk-FWS3KC3Z.js.map → chunk-B6WPZSTT.js.map} +1 -1
  10. package/dist/{chunk-HDBG7XGO.js → chunk-C5ZPSSS5.js} +50 -1
  11. package/dist/chunk-C5ZPSSS5.js.map +1 -0
  12. package/dist/{chunk-X4S56Y2H.js → chunk-HA46CYQK.js} +135 -11
  13. package/dist/chunk-HA46CYQK.js.map +1 -0
  14. package/dist/{chunk-724BW4TW.js → chunk-IGC6A2ZI.js} +2 -2
  15. package/dist/chunk-LLOLUHVG.js +5937 -0
  16. package/dist/chunk-LLOLUHVG.js.map +1 -0
  17. package/dist/{chunk-WYA65Y3F.js → chunk-MKPIAGVL.js} +13 -3
  18. package/dist/chunk-MKPIAGVL.js.map +1 -0
  19. package/dist/chunk-R3AZOAB5.js +933 -0
  20. package/dist/chunk-R3AZOAB5.js.map +1 -0
  21. package/dist/{chunk-23EJ676W.js → chunk-XBZWOM2K.js} +9 -4
  22. package/dist/chunk-XBZWOM2K.js.map +1 -0
  23. package/dist/{chunk-JAGDUCZQ.js → chunk-Y7OEDUJ5.js} +17 -13
  24. package/dist/chunk-Y7OEDUJ5.js.map +1 -0
  25. package/dist/client.d.ts +6 -4
  26. package/dist/components/artifacts/index.d.ts +1 -0
  27. package/dist/components/artifacts/published-html-artifact-frame.d.ts +14 -0
  28. package/dist/components/browser-input.d.ts +7 -0
  29. package/dist/components/browser-viewer.d.ts +5 -4
  30. package/dist/components/computer-viewer.d.ts +2 -1
  31. package/dist/components/desktop-viewer.d.ts +26 -2
  32. package/dist/components/interaction-intervention-banner.d.ts +11 -0
  33. package/dist/components/sandbox-terminal.d.ts +4 -1
  34. package/dist/components/sandbox-workspace.d.ts +3 -0
  35. package/dist/composer.js +6 -6
  36. package/dist/hooks/use-auth-runs.d.ts +32 -0
  37. package/dist/hooks/use-browser-downloads.d.ts +25 -0
  38. package/dist/hooks/use-browser-identities.d.ts +5 -1
  39. package/dist/hooks/use-browser-session.d.ts +2 -1
  40. package/dist/hooks/use-browser-sessions.d.ts +1 -1
  41. package/dist/hooks/use-channels.d.ts +26 -0
  42. package/dist/hooks/use-computer-frame-stream.d.ts +1 -1
  43. package/dist/hooks/use-computer-session.d.ts +2 -1
  44. package/dist/hooks/use-computer-sessions.d.ts +1 -1
  45. package/dist/hooks/use-desktop-stream.d.ts +4 -0
  46. package/dist/hooks/use-interaction-interventions.d.ts +27 -0
  47. package/dist/hooks/use-interaction-invalidation.d.ts +19 -0
  48. package/dist/hooks/use-network-routes.d.ts +25 -0
  49. package/dist/hooks/use-site-auth-connections.d.ts +25 -0
  50. package/dist/hooks/use-supergrok-accounts.d.ts +26 -0
  51. package/dist/hooks/use-terminal-stream.d.ts +3 -0
  52. package/dist/index.d.ts +4 -0
  53. package/dist/index.js +1220 -1545
  54. package/dist/index.js.map +1 -1
  55. package/dist/interaction.d.ts +13 -3
  56. package/dist/interaction.js +520 -6
  57. package/dist/interaction.js.map +1 -1
  58. package/dist/interactive-workbench-viewers-TOHBXJEE.js +15 -0
  59. package/dist/lib/host-platform.d.ts +5 -0
  60. package/dist/lib/relay-wire.d.ts +20 -1
  61. package/dist/machines.js +3 -3
  62. package/dist/model-policy.d.ts +1 -1
  63. package/dist/model-policy.js +1 -1
  64. package/dist/provider.d.ts +3 -2
  65. package/dist/realtime/realtime-control.d.ts +6 -2
  66. package/dist/realtime.js +138 -24
  67. package/dist/realtime.js.map +1 -1
  68. package/dist/session-context.d.ts +10 -2
  69. package/dist/session-ui.js +3 -3
  70. package/dist/session.js +11 -11
  71. package/dist/timeline/types.d.ts +5 -0
  72. package/package.json +2 -2
  73. package/src/artifacts.ts +3 -0
  74. package/src/client.ts +73 -3
  75. package/src/components/artifacts/index.ts +5 -0
  76. package/src/components/artifacts/published-html-artifact-frame.tsx +38 -0
  77. package/src/components/browser-input.ts +65 -0
  78. package/src/components/browser-viewer.tsx +1287 -177
  79. package/src/components/computer-viewer.tsx +611 -114
  80. package/src/components/desktop-viewer.tsx +114 -1
  81. package/src/components/interaction-intervention-banner.tsx +99 -0
  82. package/src/components/machines/machine-detail.tsx +1 -1
  83. package/src/components/model-policy-picker.tsx +15 -0
  84. package/src/components/sandbox-terminal.tsx +24 -7
  85. package/src/components/sandbox-workspace.tsx +42 -4
  86. package/src/components/workspace-dock.tsx +59 -5
  87. package/src/hooks/use-attached-browsers.ts +13 -11
  88. package/src/hooks/use-auth-runs.ts +278 -0
  89. package/src/hooks/use-browser-downloads.ts +218 -0
  90. package/src/hooks/use-browser-frame-stream.ts +168 -59
  91. package/src/hooks/use-browser-identities.ts +47 -6
  92. package/src/hooks/use-browser-session.ts +94 -27
  93. package/src/hooks/use-browser-sessions.ts +19 -14
  94. package/src/hooks/use-channels.ts +99 -0
  95. package/src/hooks/use-computer-frame-stream.ts +184 -61
  96. package/src/hooks/use-computer-session.ts +22 -2
  97. package/src/hooks/use-computer-sessions.ts +19 -13
  98. package/src/hooks/use-desktop-stream.ts +39 -7
  99. package/src/hooks/use-interaction-interventions.ts +242 -0
  100. package/src/hooks/use-interaction-invalidation.ts +66 -0
  101. package/src/hooks/use-machine-chip.ts +13 -3
  102. package/src/hooks/use-network-routes.ts +214 -0
  103. package/src/hooks/use-site-auth-connections.ts +226 -0
  104. package/src/hooks/use-supergrok-accounts.ts +81 -0
  105. package/src/hooks/use-terminal-stream.ts +288 -55
  106. package/src/index.ts +8 -0
  107. package/src/interaction.ts +30 -0
  108. package/src/lib/host-platform.ts +10 -0
  109. package/src/lib/relay-wire.ts +43 -4
  110. package/src/lib/terminal-capability.ts +1 -1
  111. package/src/model-policy.ts +19 -4
  112. package/src/provider.tsx +133 -1
  113. package/src/realtime/realtime-control.tsx +181 -26
  114. package/src/session-context.ts +66 -1
  115. package/src/timeline/activity-rail.tsx +6 -0
  116. package/src/timeline/projection.ts +58 -0
  117. package/src/timeline/types.ts +2 -0
  118. package/styles/compiled.css +64 -6
  119. package/dist/chunk-23EJ676W.js.map +0 -1
  120. package/dist/chunk-6BBWWOOU.js +0 -82
  121. package/dist/chunk-6BBWWOOU.js.map +0 -1
  122. package/dist/chunk-7I2KB3OK.js +0 -3895
  123. package/dist/chunk-7I2KB3OK.js.map +0 -1
  124. package/dist/chunk-HDBG7XGO.js.map +0 -1
  125. package/dist/chunk-JAGDUCZQ.js.map +0 -1
  126. package/dist/chunk-JR3QFY6B.js.map +0 -1
  127. package/dist/chunk-WYA65Y3F.js.map +0 -1
  128. package/dist/chunk-X4S56Y2H.js.map +0 -1
  129. package/dist/interactive-workbench-viewers-KHNOHWQE.js +0 -13
  130. /package/dist/{chunk-ROIRTM37.js.map → chunk-5UQPNLIO.js.map} +0 -0
  131. /package/dist/{chunk-724BW4TW.js.map → chunk-IGC6A2ZI.js.map} +0 -0
  132. /package/dist/{interactive-workbench-viewers-KHNOHWQE.js.map → interactive-workbench-viewers-TOHBXJEE.js.map} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/hooks/use-browser-frame-stream.ts","../src/hooks/use-attached-browsers.ts","../src/hooks/use-interaction-invalidation.ts","../src/hooks/use-browser-identities.ts","../src/hooks/use-browser-downloads.ts","../src/hooks/use-browser-session.ts","../src/hooks/use-browser-sessions.ts","../src/hooks/use-interaction-interventions.ts","../src/components/browser-viewer.tsx","../src/components/browser-input.ts","../src/components/interaction-intervention-banner.tsx","../src/hooks/use-computer-frame-stream.ts","../src/hooks/use-computer-session.ts","../src/hooks/use-computer-sessions.ts","../src/components/computer-viewer.tsx"],"sourcesContent":["import {\n browserFrameSocketUrl,\n decodeBrowserFrameMessage,\n type BrowserFrame,\n type BrowserFrameStreamOptions,\n type BrowserSessionAttachment,\n} from \"@opengeni/sdk/interaction\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport {\n type EmbeddedBrowserInteractionClientOverride,\n useEmbeddedBrowserInteraction,\n} from \"../session-context\";\nimport {\n decodeStreamFrame,\n decodeStreamOpenAck,\n encodeStreamClose,\n encodeStreamOpen,\n STREAM_CLOSE_REASON_NORMAL,\n STREAM_KIND_BROWSER,\n STREAM_ROLE_CLIENT,\n} from \"../lib/relay-wire\";\n\nexport type BrowserFrameConnectionState =\n | \"idle\"\n | \"attaching\"\n | \"connecting\"\n | \"live\"\n | \"reconnecting\"\n | \"error\";\n\nexport type BrowserFrameWebSocket = Pick<\n WebSocket,\n \"binaryType\" | \"readyState\" | \"close\" | \"addEventListener\" | \"removeEventListener\"\n> & { send(data: ArrayBuffer): void };\n\nexport type BrowserFrameWebSocketFactory = (\n url: string,\n protocols: string[],\n) => BrowserFrameWebSocket;\n\nconst RELAY_TAG_OPEN = 1;\nconst RELAY_TAG_OPEN_ACK = 2;\nconst RELAY_TAG_FRAME = 3;\nconst RELAY_TAG_CLOSE = 4;\nconst MAX_AUTOMATIC_RECONNECTS_WITHOUT_A_FRAME = 2;\n\nexport type UseBrowserFrameStreamOptions = EmbeddedBrowserInteractionClientOverride & {\n browserSessionId: string | null;\n targetId: string | null;\n enabled?: boolean | undefined;\n stream?: BrowserFrameStreamOptions | undefined;\n webSocketFactory?: BrowserFrameWebSocketFactory | undefined;\n};\n\nexport type UseBrowserFrameStreamResult = {\n state: BrowserFrameConnectionState;\n frame: BrowserFrame | null;\n attachment: Pick<\n BrowserSessionAttachment,\n \"browserSessionId\" | \"controllerGeneration\" | \"targetId\" | \"expiresAt\"\n > | null;\n error: Error | null;\n reconnect: () => void;\n};\n\n/**\n * Reconnecting, latest-only BrowserSession media attachment. Direct placement\n * grants travel as a WebSocket subprotocol; connected-machine grants stay in the\n * relay's first authenticated binary message. Neither transport puts a grant in\n * a URL, event, log, or separately exposed React state.\n */\nexport function useBrowserFrameStream(\n options: UseBrowserFrameStreamOptions,\n): UseBrowserFrameStreamResult {\n const { client, workspaceId } = useEmbeddedBrowserInteraction(options);\n const enabled = options.enabled ?? true;\n const [nonce, setNonce] = useState(0);\n const [result, setResult] = useState<Omit<UseBrowserFrameStreamResult, \"reconnect\">>({\n state: \"idle\",\n frame: null,\n attachment: null,\n error: null,\n });\n const latestRef = useRef<{ key: string; sequence: number }>({\n key: \"\",\n sequence: -1,\n });\n const factoryRef = useRef(options.webSocketFactory);\n const streamRef = useRef(options.stream);\n factoryRef.current = options.webSocketFactory;\n streamRef.current = options.stream;\n\n const reconnect = useCallback(() => setNonce((value) => value + 1), []);\n\n useEffect(() => {\n const browserSessionId = options.browserSessionId;\n const targetId = options.targetId;\n if (!enabled || !browserSessionId || !targetId || typeof window === \"undefined\") {\n setResult({ state: \"idle\", frame: null, attachment: null, error: null });\n return;\n }\n\n // Never render or target input against a frame from the previously selected\n // resource while its replacement attachment is negotiating.\n latestRef.current = { key: \"\", sequence: -1 };\n setResult({\n state: \"attaching\",\n frame: null,\n attachment: null,\n error: null,\n });\n\n let disposed = false;\n let socket: BrowserFrameWebSocket | null = null;\n let socketHandlers: {\n open: () => void;\n message: (event: MessageEvent) => void;\n error: () => void;\n close: () => void;\n } | null = null;\n let reconnectTimer: ReturnType<typeof setTimeout> | null = null;\n let expiryTimer: ReturnType<typeof setTimeout> | null = null;\n let failures = 0;\n let controllerGeneration: string | null = null;\n let activeAttachment: BrowserSessionAttachment | null = null;\n let activeStream: BrowserSessionAttachment[\"stream\"] | null = null;\n let attachmentExpiresAt = 0;\n let lastRelaySequence: string | null = null;\n let relayAccepted = false;\n let pendingFrame: { bytes: Uint8Array; source: BrowserFrameWebSocket } | null = null;\n let decodingFrame = false;\n const attachmentAbort = new AbortController();\n\n const clearSocket = (terminateProducer = false) => {\n if (!socket) return;\n const current = socket;\n const handlers = socketHandlers;\n if (terminateProducer && activeStream?.kind === \"relay\" && socket.readyState === 1) {\n try {\n socket.send(\n relayDatagram(\n RELAY_TAG_CLOSE,\n encodeStreamClose({\n channelId: activeStream.channel.channelId,\n reason: STREAM_CLOSE_REASON_NORMAL,\n message: \"viewer detached\",\n }),\n ),\n );\n } catch {\n // OPEN can race a transport close. Local teardown must still finish.\n }\n }\n if (handlers) {\n current.removeEventListener(\"open\", handlers.open);\n current.removeEventListener(\"message\", handlers.message);\n current.removeEventListener(\"error\", handlers.error);\n current.removeEventListener(\"close\", handlers.close);\n }\n if (current.readyState === 0 || current.readyState === 1) {\n current.close(1000, \"viewer detached\");\n }\n socket = null;\n socketHandlers = null;\n pendingFrame = null;\n };\n\n const scheduleReconnect = () => {\n if (disposed || reconnectTimer) return;\n if (failures >= MAX_AUTOMATIC_RECONNECTS_WITHOUT_A_FRAME) return;\n const delay = Math.min(5_000, 250 * 2 ** Math.min(failures, 5));\n failures += 1;\n setResult((current) => ({ ...current, state: \"reconnecting\" }));\n reconnectTimer = setTimeout(() => {\n reconnectTimer = null;\n connectSocket();\n }, delay);\n };\n\n const fail = (cause: unknown, reconnectAutomatically = true) => {\n if (disposed) return;\n const error = cause instanceof Error ? cause : new Error(String(cause));\n setResult((current) => ({ ...current, state: \"error\", error }));\n clearSocket();\n if (reconnectAutomatically) scheduleReconnect();\n };\n\n const onOpen = (source: BrowserFrameWebSocket) => {\n if (disposed || source !== socket) return;\n if (activeStream?.kind === \"relay\") {\n const body = encodeStreamOpen({\n channel: {\n ...activeStream.channel,\n kind: STREAM_KIND_BROWSER,\n },\n token: activeStream.token,\n role: STREAM_ROLE_CLIENT,\n resumeFromSeq:\n lastRelaySequence === null ? \"0\" : (BigInt(lastRelaySequence) + 1n).toString(),\n });\n try {\n source.send(relayDatagram(RELAY_TAG_OPEN, body));\n } catch (error) {\n fail(error);\n }\n return;\n }\n setResult((current) => ({ ...current, state: \"live\", error: null }));\n };\n\n const drainLatestFrame = async () => {\n if (decodingFrame) return;\n decodingFrame = true;\n try {\n while (pendingFrame) {\n if (disposed) break;\n const pending = pendingFrame;\n pendingFrame = null;\n const { bytes, source } = pending;\n const frame = decodeBrowserFrameMessage(bytes);\n if (disposed || source !== socket) continue;\n if (frame.browserSessionId !== browserSessionId || frame.targetId !== targetId) {\n throw new Error(\"browser frame belongs to another resource\");\n }\n if (!controllerGeneration || frame.controllerGeneration !== controllerGeneration) {\n throw new Error(\"browser frame belongs to a stale controller\");\n }\n const key = `${browserSessionId}:${targetId}:${frame.controllerGeneration}:${frame.targetGeneration}:${frame.documentGeneration}`;\n if (latestRef.current.key === key && frame.sequence <= latestRef.current.sequence)\n continue;\n latestRef.current = { key, sequence: frame.sequence };\n failures = 0;\n setResult((current) => ({\n ...current,\n state: \"live\",\n frame,\n error: null,\n }));\n }\n } catch (cause) {\n fail(cause);\n } finally {\n decodingFrame = false;\n if (!disposed && pendingFrame) void drainLatestFrame();\n }\n };\n\n const onMessage = (source: BrowserFrameWebSocket, event: MessageEvent) => {\n void (async () => {\n try {\n const bytes = await messageBytes(event.data);\n if (disposed || source !== socket) return;\n let frameBytes = bytes;\n if (activeStream?.kind === \"relay\") {\n if (bytes.length < 1) throw new Error(\"browser relay returned an empty message\");\n const tag = bytes[0];\n const body = bytes.subarray(1);\n if (tag === RELAY_TAG_OPEN_ACK) {\n const ack = decodeStreamOpenAck(body);\n if (!ack.accepted) {\n activeAttachment = null;\n activeStream = null;\n attachmentExpiresAt = 0;\n throw new Error(ack.error?.message ?? \"browser stream was rejected by the relay\");\n }\n relayAccepted = true;\n return;\n }\n if (tag === RELAY_TAG_CLOSE) {\n activeAttachment = null;\n activeStream = null;\n attachmentExpiresAt = 0;\n lastRelaySequence = null;\n relayAccepted = false;\n fail(new Error(\"Browser frame source ended.\"), false);\n return;\n }\n if (tag !== RELAY_TAG_FRAME || !relayAccepted) return;\n const relayFrame = decodeStreamFrame(body);\n lastRelaySequence = relayFrame.seq;\n frameBytes = relayFrame.data;\n }\n pendingFrame = { bytes: frameBytes, source };\n void drainLatestFrame();\n } catch (cause) {\n fail(cause);\n }\n })();\n };\n\n const onError = (source: BrowserFrameWebSocket) => {\n if (source !== socket) return;\n fail(new Error(\"Browser view lost connection.\"));\n };\n\n const onClose = (source: BrowserFrameWebSocket) => {\n if (disposed || source !== socket) return;\n clearSocket();\n scheduleReconnect();\n };\n\n const connectSocket = () => {\n if (disposed) return;\n clearSocket();\n if (!activeAttachment || !activeStream || attachmentExpiresAt <= Date.now() + 1_000) {\n void attach();\n return;\n }\n relayAccepted = false;\n setResult((current) => ({\n ...current,\n state: \"connecting\",\n error: null,\n }));\n const createSocket =\n factoryRef.current ?? ((url: string, protocols: string[]) => new WebSocket(url, protocols));\n const openedSocket = createSocket(\n activeStream.kind === \"relay\"\n ? activeStream.url\n : browserFrameSocketUrl(activeAttachment, streamRef.current),\n activeStream.kind === \"direct_websocket\" ? [...activeStream.protocols] : [],\n );\n socket = openedSocket;\n socketHandlers = {\n open: () => onOpen(openedSocket),\n message: (event) => onMessage(openedSocket, event),\n error: () => onError(openedSocket),\n close: () => onClose(openedSocket),\n };\n openedSocket.binaryType = \"arraybuffer\";\n openedSocket.addEventListener(\"open\", socketHandlers.open);\n openedSocket.addEventListener(\"message\", socketHandlers.message);\n openedSocket.addEventListener(\"error\", socketHandlers.error);\n openedSocket.addEventListener(\"close\", socketHandlers.close);\n };\n\n const attach = async () => {\n if (disposed) return;\n clearSocket();\n if (expiryTimer) clearTimeout(expiryTimer);\n setResult((current) => ({\n ...current,\n state: current.attachment ? \"reconnecting\" : \"attaching\",\n error: null,\n }));\n try {\n const attachment = await client.attachBrowserSession(\n workspaceId,\n browserSessionId,\n {\n targetId,\n expiresInSeconds: 120,\n ...(streamRef.current ? { stream: streamRef.current } : {}),\n },\n { signal: attachmentAbort.signal },\n );\n if (disposed) return;\n if (attachment.browserSessionId !== browserSessionId || attachment.targetId !== targetId) {\n throw new Error(\"browser attachment does not match the requested resource\");\n }\n controllerGeneration = attachment.controllerGeneration;\n activeAttachment = attachment;\n activeStream = attachment.stream;\n attachmentExpiresAt = Date.parse(attachment.expiresAt);\n lastRelaySequence = null;\n relayAccepted = false;\n setResult((current) => ({\n ...current,\n state: \"connecting\",\n attachment: {\n browserSessionId: attachment.browserSessionId,\n controllerGeneration: attachment.controllerGeneration,\n targetId: attachment.targetId,\n expiresAt: attachment.expiresAt,\n },\n error: null,\n }));\n const refreshIn = Number.isFinite(attachmentExpiresAt)\n ? Math.max(1_000, attachmentExpiresAt - Date.now() - 5_000)\n : 60_000;\n expiryTimer = setTimeout(() => {\n if (disposed) return;\n clearSocket(true);\n activeAttachment = null;\n activeStream = null;\n attachmentExpiresAt = 0;\n void attach();\n }, refreshIn);\n connectSocket();\n } catch (cause) {\n if (attachmentAbort.signal.aborted || disposed) return;\n fail(cause);\n }\n };\n\n void attach();\n return () => {\n disposed = true;\n attachmentAbort.abort();\n if (reconnectTimer) clearTimeout(reconnectTimer);\n if (expiryTimer) clearTimeout(expiryTimer);\n clearSocket(true);\n };\n }, [client, enabled, nonce, options.browserSessionId, options.targetId, workspaceId]);\n\n return { ...result, reconnect };\n}\n\nfunction relayDatagram(tag: number, body: Uint8Array): ArrayBuffer {\n const message = new Uint8Array(body.length + 1);\n message[0] = tag;\n message.set(body, 1);\n return message.buffer as ArrayBuffer;\n}\n\nasync function messageBytes(value: unknown): Promise<Uint8Array> {\n if (value instanceof ArrayBuffer) return new Uint8Array(value);\n if (ArrayBuffer.isView(value)) {\n return new Uint8Array(value.buffer, value.byteOffset, value.byteLength).slice();\n }\n if (typeof Blob !== \"undefined\" && value instanceof Blob) {\n return new Uint8Array(await value.arrayBuffer());\n }\n throw new Error(\"browser frame stream returned a non-binary message\");\n}\n","import type { AttachedBrowserDevice } from \"@opengeni/sdk/interaction\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport type { EmbeddedBrowserInteractionClientLike } from \"../client\";\nimport {\n type EmbeddedBrowserInteractionClientOverride,\n useEmbeddedBrowserInteraction,\n} from \"../session-context\";\nimport { useInteractionInvalidation } from \"./use-interaction-invalidation\";\n\nexport type UseAttachedBrowsersOptions = EmbeddedBrowserInteractionClientOverride & {\n enabled?: boolean | undefined;\n includeDisconnected?: boolean | undefined;\n pollIntervalMs?: number | undefined;\n};\n\nexport type UseAttachedBrowsersResult = {\n revision: number;\n devices: AttachedBrowserDevice[];\n loading: boolean;\n refreshing: boolean;\n error: Error | null;\n refresh: () => Promise<void>;\n};\n\n/** Workspace-wide inventory of Chrome profiles currently connected through an\n * enrolled OpenGeni machine. BrowserSessions remain the execution authority. */\nexport function useAttachedBrowsers(\n options: UseAttachedBrowsersOptions = {},\n): UseAttachedBrowsersResult {\n const { client, workspaceId, workspaceInteractionEvent, workspaceInteractionConnectionState } =\n useEmbeddedBrowserInteraction(options);\n const enabled = options.enabled ?? true;\n const includeDisconnected = options.includeDisconnected ?? false;\n const [state, setState] = useState(() => emptyState(workspaceId, enabled));\n const requestRef = useRef<{ id: number; controller: AbortController | null }>({\n id: 0,\n controller: null,\n });\n const mountedRef = useRef(true);\n const visible = state.workspaceId === workspaceId ? state : emptyState(workspaceId, enabled);\n\n const cancelLoad = useCallback(() => {\n const id = requestRef.current.id + 1;\n requestRef.current.controller?.abort();\n requestRef.current = { id, controller: null };\n }, []);\n\n const load = useCallback(\n async (foreground: boolean): Promise<void> => {\n if (!enabled) return;\n const id = requestRef.current.id + 1;\n requestRef.current.controller?.abort();\n const controller = new AbortController();\n requestRef.current = { id, controller };\n setState((current) => ({\n ...(current.workspaceId === workspaceId ? current : emptyState(workspaceId, true)),\n loading: foreground,\n refreshing: !foreground,\n error: foreground || current.workspaceId !== workspaceId ? null : current.error,\n }));\n try {\n const response = await client.listAttachedBrowsers(workspaceId, {\n includeDisconnected,\n signal: controller.signal,\n });\n if (!mountedRef.current || requestRef.current.id !== id) return;\n setState({\n workspaceId,\n revision: response.revision,\n devices: sortDevices(response.devices),\n loading: false,\n refreshing: false,\n error: null,\n });\n } catch (cause) {\n if (controller.signal.aborted || !mountedRef.current || requestRef.current.id !== id)\n return;\n setState((current) => ({\n ...(current.workspaceId === workspaceId ? current : emptyState(workspaceId, true)),\n loading: false,\n refreshing: false,\n error: cause instanceof Error ? cause : new Error(String(cause)),\n }));\n } finally {\n if (requestRef.current.id === id) requestRef.current = { id, controller: null };\n }\n },\n [client, enabled, includeDisconnected, workspaceId],\n );\n\n const refresh = useCallback(async () => await load(false), [load]);\n\n useEffect(() => {\n mountedRef.current = true;\n if (!enabled) {\n cancelLoad();\n setState(emptyState(workspaceId, false));\n return;\n }\n void load(true);\n return () => {\n mountedRef.current = false;\n cancelLoad();\n };\n }, [cancelLoad, enabled, load, workspaceId]);\n\n useInteractionInvalidation({\n workspaceId,\n key: `${workspaceId}:${includeDisconnected}`,\n enabled,\n event: workspaceInteractionEvent,\n connectionState: workspaceInteractionConnectionState,\n knownRevision: visible.revision,\n refresh,\n fallbackPollIntervalMs: options.pollIntervalMs,\n });\n\n return {\n revision: visible.revision,\n devices: visible.devices,\n loading: visible.loading,\n refreshing: visible.refreshing,\n error: visible.error,\n refresh,\n };\n}\n\nfunction emptyState(workspaceId: string, loading: boolean) {\n return {\n workspaceId,\n revision: 0,\n devices: [] as AttachedBrowserDevice[],\n loading,\n refreshing: false,\n error: null as Error | null,\n };\n}\n\nfunction sortDevices(devices: readonly AttachedBrowserDevice[]): AttachedBrowserDevice[] {\n return [...devices].sort(\n (left, right) =>\n Number(right.state === \"connected\") - Number(left.state === \"connected\") ||\n timestamp(right.lastSeenAt) - timestamp(left.lastSeenAt) ||\n left.name.localeCompare(right.name),\n );\n}\n\nfunction timestamp(value: string): number {\n const parsed = Date.parse(value);\n return Number.isFinite(parsed) ? parsed : 0;\n}\n\n/** Exported for narrow proxy implementations and tests. */\nexport type AttachedBrowsersClient = EmbeddedBrowserInteractionClientLike;\n","import type { StreamConnectionState, WorkspaceInteractionRevisionEvent } from \"@opengeni/sdk\";\nimport { useEffect, useRef } from \"react\";\nimport { usePageLiveActivity } from \"./internal\";\n\nexport type InteractionInvalidationOptions = {\n workspaceId: string;\n /** Distinguishes filtered projections of the same workspace catalog. */\n key: string;\n enabled: boolean;\n event: WorkspaceInteractionRevisionEvent | null;\n connectionState: StreamConnectionState | \"idle\" | \"error\";\n /** Catalog responses carry the workspace revision; live-state lists do not. */\n knownRevision?: number | undefined;\n refresh: () => Promise<void>;\n fallbackPollIntervalMs?: number | undefined;\n};\n\n/**\n * Refetch authoritative lists on the shared latest-revision stream. Poll only\n * while that stream is unavailable, preserving standalone-hook degradation\n * without multiplying healthy-provider traffic.\n */\nexport function useInteractionInvalidation(options: InteractionInvalidationOptions): void {\n const {\n workspaceId,\n key,\n enabled,\n event,\n connectionState,\n knownRevision,\n refresh,\n fallbackPollIntervalMs,\n } = options;\n const pageLive = usePageLiveActivity();\n const lastUnversionedEvent = useRef<{ key: string; sequence: number }>({\n key,\n sequence: 0,\n });\n const eventSequence = event?.workspaceId === workspaceId ? event.sequence : 0;\n\n useEffect(() => {\n if (!enabled || eventSequence <= 0) return;\n if (knownRevision !== undefined) {\n if (eventSequence > knownRevision) void refresh();\n return;\n }\n if (lastUnversionedEvent.current.key !== key) {\n lastUnversionedEvent.current = { key, sequence: 0 };\n }\n if (eventSequence <= lastUnversionedEvent.current.sequence) return;\n lastUnversionedEvent.current = { key, sequence: eventSequence };\n void refresh();\n }, [enabled, eventSequence, key, knownRevision, refresh]);\n\n useEffect(() => {\n if (!enabled || !pageLive || connectionState === \"live\") return;\n const interval = boundedPollInterval(fallbackPollIntervalMs ?? 3_000);\n const timer = setInterval(() => void refresh(), interval);\n return () => clearInterval(timer);\n }, [connectionState, enabled, fallbackPollIntervalMs, pageLive, refresh]);\n}\n\nfunction boundedPollInterval(value: number): number {\n if (!Number.isFinite(value)) return 3_000;\n return Math.min(60_000, Math.max(1_000, Math.floor(value)));\n}\n","import type {\n BrowserIdentity,\n BrowserIdentityMutationResponse,\n BrowserRevisionListResponse,\n CreateBrowserIdentityRequest,\n PublishBrowserRevisionRequest,\n PublishBrowserRevisionResponse,\n UpdateBrowserIdentityRequest,\n} from \"@opengeni/sdk/interaction\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport type { EmbeddedBrowserInteractionClientLike } from \"../client\";\nimport {\n type EmbeddedBrowserInteractionClientOverride,\n useEmbeddedBrowserInteraction,\n} from \"../session-context\";\nimport { useInteractionInvalidation } from \"./use-interaction-invalidation\";\n\nexport type UseBrowserIdentitiesOptions = EmbeddedBrowserInteractionClientOverride & {\n enabled?: boolean | undefined;\n includeArchived?: boolean | undefined;\n};\n\nexport type UseBrowserIdentitiesResult = {\n revision: number;\n identities: BrowserIdentity[];\n loading: boolean;\n refreshing: boolean;\n mutating: boolean;\n error: Error | null;\n refresh: () => Promise<void>;\n create: (\n request: Omit<CreateBrowserIdentityRequest, \"operationId\"> & {\n operationId?: string;\n },\n ) => Promise<BrowserIdentityMutationResponse>;\n update: (\n identityId: string,\n request: Omit<UpdateBrowserIdentityRequest, \"operationId\"> & { operationId?: string },\n ) => Promise<BrowserIdentityMutationResponse>;\n revisions: (identityId: string) => Promise<BrowserRevisionListResponse>;\n publish: (\n browserSessionId: string,\n request: Omit<PublishBrowserRevisionRequest, \"operationId\"> & {\n operationId?: string;\n },\n ) => Promise<PublishBrowserRevisionResponse>;\n};\n\n/** Workspace browser-profile library and explicit immutable-version mutations. */\nexport function useBrowserIdentities(\n options: UseBrowserIdentitiesOptions = {},\n): UseBrowserIdentitiesResult {\n const { client, workspaceId, workspaceInteractionEvent, workspaceInteractionConnectionState } =\n useEmbeddedBrowserInteraction(options);\n const enabled = options.enabled ?? true;\n const includeArchived = options.includeArchived ?? false;\n const [state, setState] = useState(() => emptyState(workspaceId, enabled));\n const [mutationCount, setMutationCount] = useState(0);\n const requestRef = useRef<{ id: number; controller: AbortController | null }>({\n id: 0,\n controller: null,\n });\n const mountedRef = useRef(true);\n const visibleState = state.workspaceId === workspaceId ? state : emptyState(workspaceId, enabled);\n\n const cancelLoad = useCallback(() => {\n const id = requestRef.current.id + 1;\n requestRef.current.controller?.abort();\n requestRef.current = { id, controller: null };\n }, []);\n\n const load = useCallback(\n async (foreground: boolean): Promise<void> => {\n if (!enabled) return;\n const id = requestRef.current.id + 1;\n requestRef.current.controller?.abort();\n const controller = new AbortController();\n requestRef.current = { id, controller };\n setState((current) => ({\n ...(current.workspaceId === workspaceId ? current : emptyState(workspaceId, true)),\n loading: foreground,\n refreshing: !foreground,\n error: foreground || current.workspaceId !== workspaceId ? null : current.error,\n }));\n try {\n const response = await client.listBrowserIdentities(workspaceId, {\n includeArchived,\n signal: controller.signal,\n });\n if (!mountedRef.current || requestRef.current.id !== id) return;\n setState({\n workspaceId,\n revision: response.revision,\n identities: sortIdentities(response.identities),\n loading: false,\n refreshing: false,\n error: null,\n });\n } catch (cause) {\n if (controller.signal.aborted || !mountedRef.current || requestRef.current.id !== id)\n return;\n setState((current) => ({\n ...(current.workspaceId === workspaceId ? current : emptyState(workspaceId, true)),\n loading: false,\n refreshing: false,\n error: cause instanceof Error ? cause : new Error(String(cause)),\n }));\n } finally {\n if (requestRef.current.id === id) requestRef.current = { id, controller: null };\n }\n },\n [client, enabled, includeArchived, workspaceId],\n );\n\n const refresh = useCallback(async () => await load(false), [load]);\n\n useEffect(() => {\n mountedRef.current = true;\n if (!enabled) {\n cancelLoad();\n setState(emptyState(workspaceId, false));\n return;\n }\n void load(true);\n return () => {\n mountedRef.current = false;\n cancelLoad();\n };\n }, [cancelLoad, enabled, load, workspaceId]);\n\n useInteractionInvalidation({\n workspaceId,\n key: workspaceId,\n enabled,\n event: workspaceInteractionEvent,\n connectionState: workspaceInteractionConnectionState,\n knownRevision: visibleState.revision,\n refresh,\n });\n\n const mutate = useCallback(async <T>(operation: () => Promise<T>): Promise<T> => {\n setMutationCount((count) => count + 1);\n try {\n return await operation();\n } finally {\n if (mountedRef.current) setMutationCount((count) => Math.max(0, count - 1));\n }\n }, []);\n\n const create = useCallback(\n async (\n request: Omit<CreateBrowserIdentityRequest, \"operationId\"> & {\n operationId?: string;\n },\n ): Promise<BrowserIdentityMutationResponse> =>\n await mutate(async () => {\n const response = await client.createBrowserIdentity(workspaceId, {\n ...request,\n operationId: request.operationId ?? crypto.randomUUID(),\n });\n setState((current) => mergeIdentity(current, workspaceId, response.identity));\n return response;\n }),\n [client, mutate, workspaceId],\n );\n\n const revisions = useCallback(\n async (identityId: string): Promise<BrowserRevisionListResponse> =>\n await client.listBrowserRevisions(workspaceId, identityId),\n [client, workspaceId],\n );\n\n const update = useCallback(\n async (\n identityId: string,\n request: Omit<UpdateBrowserIdentityRequest, \"operationId\"> & { operationId?: string },\n ): Promise<BrowserIdentityMutationResponse> =>\n await mutate(async () => {\n const response = await client.updateBrowserIdentity(workspaceId, identityId, {\n ...request,\n operationId: request.operationId ?? crypto.randomUUID(),\n });\n setState((current) =>\n mergeIdentity(current, workspaceId, response.identity, includeArchived),\n );\n return response;\n }),\n [client, includeArchived, mutate, workspaceId],\n );\n\n const publish = useCallback(\n async (\n browserSessionId: string,\n request: Omit<PublishBrowserRevisionRequest, \"operationId\"> & {\n operationId?: string;\n },\n ): Promise<PublishBrowserRevisionResponse> =>\n await mutate(async () => {\n const response = await client.publishBrowserRevision(workspaceId, browserSessionId, {\n ...request,\n operationId: request.operationId ?? crypto.randomUUID(),\n });\n setState((current) => mergeIdentity(current, workspaceId, response.identity));\n return response;\n }),\n [client, mutate, workspaceId],\n );\n\n return {\n revision: visibleState.revision,\n identities: visibleState.identities,\n loading: visibleState.loading,\n refreshing: visibleState.refreshing,\n mutating: mutationCount > 0,\n error: visibleState.error,\n refresh,\n create,\n update,\n revisions,\n publish,\n };\n}\n\nfunction emptyState(workspaceId: string, loading: boolean) {\n return {\n workspaceId,\n revision: 0,\n identities: [] as BrowserIdentity[],\n loading,\n refreshing: false,\n error: null as Error | null,\n };\n}\n\nfunction sortIdentities(identities: readonly BrowserIdentity[]): BrowserIdentity[] {\n return [...identities].sort(\n (left, right) =>\n timestamp(right.updatedAt) - timestamp(left.updatedAt) || left.name.localeCompare(right.name),\n );\n}\n\nfunction timestamp(value: string): number {\n const parsed = Date.parse(value);\n return Number.isFinite(parsed) ? parsed : 0;\n}\n\nfunction mergeIdentity(\n current: ReturnType<typeof emptyState>,\n workspaceId: string,\n identity: BrowserIdentity,\n includeArchived = false,\n): ReturnType<typeof emptyState> {\n if (current.workspaceId !== workspaceId) return current;\n return {\n ...current,\n identities: sortIdentities(\n identity.status === \"archived\" && !includeArchived\n ? current.identities.filter((candidate) => candidate.id !== identity.id)\n : [...current.identities.filter((candidate) => candidate.id !== identity.id), identity],\n ),\n error: null,\n };\n}\n\n/** Exported for narrow proxy implementations and tests. */\nexport type BrowserIdentitiesClient = EmbeddedBrowserInteractionClientLike;\n","import type { BrowserDownload, BrowserDownloadSaveResponse } from \"@opengeni/sdk/interaction\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport type { EmbeddedBrowserInteractionClientLike } from \"../client\";\nimport {\n type EmbeddedBrowserInteractionClientOverride,\n useEmbeddedBrowserInteraction,\n} from \"../session-context\";\nimport { usePageLiveActivity } from \"./internal\";\n\nexport type UseBrowserDownloadsOptions = EmbeddedBrowserInteractionClientOverride & {\n browserSessionId: string | null;\n enabled?: boolean | undefined;\n pollIntervalMs?: number | undefined;\n};\n\nexport type BrowserDownloadSaveOptions = {\n operationId?: string | undefined;\n overwrite?: boolean | undefined;\n};\n\nexport type UseBrowserDownloadsResult = {\n downloads: BrowserDownload[];\n loading: boolean;\n refreshing: boolean;\n savingDownloadIds: string[];\n error: Error | null;\n refresh: () => Promise<void>;\n saveToWorkspace: (\n downloadId: string,\n destinationPath: string,\n options?: BrowserDownloadSaveOptions,\n ) => Promise<BrowserDownloadSaveResponse>;\n};\n\n/** Exact browser-produced files for one BrowserSession. Bytes remain private\n * until `saveToWorkspace` performs the canonical workspace mutation. */\nexport function useBrowserDownloads(\n options: UseBrowserDownloadsOptions,\n): UseBrowserDownloadsResult {\n const { client, workspaceId } = useEmbeddedBrowserInteraction(options);\n const browserSessionId = options.browserSessionId;\n const enabled = (options.enabled ?? true) && browserSessionId !== null;\n const pageLive = usePageLiveActivity();\n const pollIntervalMs = Math.max(750, options.pollIntervalMs ?? 2_000);\n const scope = browserSessionId ?? \"none\";\n const [state, setState] = useState(() => emptyState(scope, enabled));\n const [saving, setSaving] = useState<Record<string, number>>({});\n const visible = state.scope === scope ? state : emptyState(scope, enabled);\n const requestRef = useRef<{ id: number; controller: AbortController | null }>({\n id: 0,\n controller: null,\n });\n const mountedRef = useRef(true);\n const retryOperationsRef = useRef(new Map<string, string>());\n\n const cancelLoad = useCallback(() => {\n requestRef.current.controller?.abort();\n requestRef.current = { id: requestRef.current.id + 1, controller: null };\n }, []);\n\n const load = useCallback(\n async (foreground: boolean): Promise<void> => {\n if (!enabled || !browserSessionId) return;\n const id = requestRef.current.id + 1;\n requestRef.current.controller?.abort();\n const controller = new AbortController();\n requestRef.current = { id, controller };\n setState((current) => ({\n ...(current.scope === scope ? current : emptyState(scope, true)),\n loading: foreground,\n refreshing: !foreground,\n error: foreground || current.scope !== scope ? null : current.error,\n }));\n try {\n const response = await client.listBrowserDownloads(workspaceId, browserSessionId, {\n signal: controller.signal,\n });\n if (!mountedRef.current || requestRef.current.id !== id) return;\n setState({\n scope,\n downloads: sortDownloads(response.downloads),\n loading: false,\n refreshing: false,\n error: null,\n });\n } catch (cause) {\n if (controller.signal.aborted || !mountedRef.current || requestRef.current.id !== id)\n return;\n setState((current) => ({\n ...(current.scope === scope ? current : emptyState(scope, true)),\n loading: false,\n refreshing: false,\n error: asError(cause),\n }));\n } finally {\n if (requestRef.current.id === id) requestRef.current = { id, controller: null };\n }\n },\n [browserSessionId, client, enabled, scope, workspaceId],\n );\n\n const refresh = useCallback(async () => await load(false), [load]);\n\n useEffect(() => {\n retryOperationsRef.current.clear();\n setSaving({});\n }, [scope]);\n\n useEffect(() => {\n mountedRef.current = true;\n if (!enabled) {\n cancelLoad();\n setState(emptyState(scope, false));\n return () => {\n mountedRef.current = false;\n cancelLoad();\n };\n }\n void load(true);\n return () => {\n mountedRef.current = false;\n cancelLoad();\n };\n }, [cancelLoad, enabled, load, scope]);\n\n useEffect(() => {\n if (!enabled || !pageLive || Object.keys(saving).length > 0) return;\n const timer = setInterval(() => {\n if (!requestRef.current.controller) void refresh();\n }, pollIntervalMs);\n return () => clearInterval(timer);\n }, [enabled, pageLive, pollIntervalMs, refresh, saving]);\n\n const saveToWorkspace = useCallback(\n async (\n downloadId: string,\n destinationPath: string,\n saveOptions: BrowserDownloadSaveOptions = {},\n ): Promise<BrowserDownloadSaveResponse> => {\n if (!browserSessionId) throw new Error(\"No BrowserSession is selected.\");\n const overwrite = saveOptions.overwrite ?? false;\n const attemptKey = `${browserSessionId}\\u0000${downloadId}\\u0000${destinationPath}\\u0000${overwrite}`;\n const operationId =\n saveOptions.operationId ??\n retryOperationsRef.current.get(attemptKey) ??\n crypto.randomUUID();\n retryOperationsRef.current.set(attemptKey, operationId);\n setSaving((current) => ({ ...current, [downloadId]: (current[downloadId] ?? 0) + 1 }));\n try {\n const response = await client.saveBrowserDownload(\n workspaceId,\n browserSessionId,\n downloadId,\n { operationId, destinationPath, overwrite },\n );\n retryOperationsRef.current.delete(attemptKey);\n if (mountedRef.current) {\n setState((current) =>\n current.scope === scope\n ? {\n ...current,\n downloads: sortDownloads([\n ...current.downloads.filter((download) => download.id !== response.download.id),\n response.download,\n ]),\n error: null,\n }\n : current,\n );\n }\n return response;\n } finally {\n if (mountedRef.current) {\n setSaving((current) => {\n const count = (current[downloadId] ?? 1) - 1;\n if (count > 0) return { ...current, [downloadId]: count };\n const { [downloadId]: _removed, ...rest } = current;\n return rest;\n });\n }\n }\n },\n [browserSessionId, client, scope, workspaceId],\n );\n\n return {\n downloads: visible.downloads,\n loading: visible.loading,\n refreshing: visible.refreshing,\n savingDownloadIds: Object.keys(saving),\n error: visible.error,\n refresh,\n saveToWorkspace,\n };\n}\n\nfunction emptyState(scope: string, loading: boolean) {\n return {\n scope,\n downloads: [] as BrowserDownload[],\n loading,\n refreshing: false,\n error: null as Error | null,\n };\n}\n\nfunction sortDownloads(downloads: readonly BrowserDownload[]): BrowserDownload[] {\n return [...downloads].sort(\n (left, right) =>\n right.startedAt.localeCompare(left.startedAt) || left.id.localeCompare(right.id),\n );\n}\n\nfunction asError(cause: unknown): Error {\n return cause instanceof Error ? cause : new Error(String(cause));\n}\n\nexport type BrowserDownloadsClient = EmbeddedBrowserInteractionClientLike;\n","import type {\n BrowserAction,\n BrowserActionBatch,\n BrowserActionReceipt,\n BrowserClipboard,\n BrowserDiagnosticBatch,\n BrowserDiagnosticsOptions,\n BrowserFrame,\n BrowserObservation,\n BrowserSession,\n BrowserTarget,\n} from \"@opengeni/sdk/interaction\";\nimport { OpenGeniApiError } from \"@opengeni/sdk\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport {\n type EmbeddedBrowserInteractionClientOverride,\n useEmbeddedBrowserInteraction,\n} from \"../session-context\";\nimport { usePageLiveActivity } from \"./internal\";\n\nexport type UseBrowserSessionOptions = EmbeddedBrowserInteractionClientOverride & {\n browserSessionId: string | null;\n enabled?: boolean | undefined;\n pollIntervalMs?: number | undefined;\n};\n\nexport type UseBrowserSessionResult = {\n session: BrowserSession | null;\n targets: BrowserTarget[];\n selectedTarget: BrowserTarget | null;\n observation: BrowserObservation | null;\n loading: boolean;\n mutating: boolean;\n error: Error | null;\n refresh: () => Promise<void>;\n selectTarget: (targetId: string) => Promise<BrowserTarget>;\n openTarget: (url?: string) => Promise<BrowserTarget>;\n closeTarget: (targetId: string) => Promise<void>;\n act: (\n action: BrowserAction | BrowserActionBatch,\n operationId?: string,\n ) => Promise<BrowserActionReceipt>;\n /** Dispatch input against the exact image a human saw. Stale images fail at\n * the controller fence instead of targeting a newer page. */\n actFromFrame: (\n action: BrowserAction | BrowserActionBatch,\n frame: BrowserFrame,\n operationId?: string,\n ) => Promise<BrowserActionReceipt>;\n readClipboard: () => Promise<BrowserClipboard>;\n diagnostics: (options?: BrowserDiagnosticsOptions) => Promise<BrowserDiagnosticBatch>;\n};\n\n/** Selected BrowserSession control state. All human actions use the same\n * generation-fenced controller operation stream as agent actions. */\nexport function useBrowserSession(options: UseBrowserSessionOptions): UseBrowserSessionResult {\n const { client, workspaceId } = useEmbeddedBrowserInteraction(options);\n const browserSessionId = options.browserSessionId;\n const enabled = (options.enabled ?? true) && browserSessionId !== null;\n const pageLive = usePageLiveActivity();\n const pollIntervalMs = Math.max(750, options.pollIntervalMs ?? 2_000);\n const [state, setState] = useState<{\n browserSessionId: string | null;\n session: BrowserSession | null;\n targets: BrowserTarget[];\n selectedTargetId: string | null;\n observation: BrowserObservation | null;\n loading: boolean;\n mutating: boolean;\n error: Error | null;\n }>(() => emptyState(browserSessionId, enabled));\n const visible =\n state.browserSessionId === browserSessionId ? state : emptyState(browserSessionId, enabled);\n const selectedTargetIdRef = useRef<string | null>(visible.selectedTargetId);\n selectedTargetIdRef.current = visible.selectedTargetId;\n const observationRef = useRef<{\n browserSessionId: string | null;\n observation: BrowserObservation | null;\n }>({ browserSessionId, observation: visible.observation });\n if (observationRef.current.browserSessionId !== browserSessionId) {\n observationRef.current = {\n browserSessionId,\n observation: visible.observation,\n };\n } else {\n observationRef.current.observation = visible.observation;\n }\n const requestRef = useRef<{ id: number; controller: AbortController | null }>({\n id: 0,\n controller: null,\n });\n const mutationRef = useRef<{\n browserSessionId: string | null;\n count: number;\n }>({\n browserSessionId,\n count: 0,\n });\n const mountedRef = useRef(true);\n\n const invalidateRefresh = useCallback(() => {\n const id = requestRef.current.id + 1;\n requestRef.current.controller?.abort();\n requestRef.current = { id, controller: null };\n }, []);\n\n const refresh = useCallback(async (): Promise<void> => {\n if (!enabled || !browserSessionId) return;\n const id = requestRef.current.id + 1;\n requestRef.current.controller?.abort();\n const controller = new AbortController();\n requestRef.current = { id, controller };\n try {\n const [session, targetResponse] = await Promise.all([\n client.getBrowserSession(workspaceId, browserSessionId, {\n signal: controller.signal,\n }),\n client.listBrowserTargets(workspaceId, browserSessionId, {\n signal: controller.signal,\n }),\n ]);\n if (!mountedRef.current || requestRef.current.id !== id) return;\n const selected = chooseTarget(targetResponse.targets, selectedTargetIdRef.current);\n selectedTargetIdRef.current = selected?.id ?? null;\n observationRef.current = { browserSessionId, observation: null };\n setState((current) =>\n current.browserSessionId === browserSessionId\n ? {\n ...current,\n session,\n targets: targetResponse.targets,\n selectedTargetId: selected?.id ?? null,\n observation: null,\n loading: false,\n error: null,\n }\n : current,\n );\n if (!selected) return;\n try {\n const observation = await client.observeBrowserTarget(\n workspaceId,\n browserSessionId,\n selected.id,\n { signal: controller.signal },\n );\n if (!mountedRef.current || requestRef.current.id !== id) return;\n observationRef.current = { browserSessionId, observation };\n setState((current) =>\n current.browserSessionId === browserSessionId &&\n current.selectedTargetId === observation.target.id\n ? { ...current, observation }\n : current,\n );\n } catch (cause) {\n if (controller.signal.aborted || !mountedRef.current || requestRef.current.id !== id)\n return;\n // Target inventory and the media plane remain authoritative for the\n // human-facing browser. A failed semantic snapshot must not blank or\n // disable an otherwise live visual browser.\n void cause;\n }\n } catch (cause) {\n if (controller.signal.aborted || !mountedRef.current || requestRef.current.id !== id) return;\n setState((current) =>\n current.browserSessionId === browserSessionId\n ? {\n ...current,\n loading: false,\n error: cause instanceof Error ? cause : new Error(String(cause)),\n }\n : current,\n );\n } finally {\n if (requestRef.current.id === id) {\n requestRef.current = { id, controller: null };\n }\n }\n }, [browserSessionId, client, enabled, workspaceId]);\n\n useEffect(() => {\n mountedRef.current = true;\n if (!enabled) {\n invalidateRefresh();\n setState(emptyState(browserSessionId, false));\n return;\n }\n setState((current) =>\n current.browserSessionId === browserSessionId\n ? { ...current, loading: true }\n : emptyState(browserSessionId, true),\n );\n void refresh();\n return () => {\n mountedRef.current = false;\n invalidateRefresh();\n };\n }, [browserSessionId, enabled, invalidateRefresh, refresh]);\n\n useEffect(() => {\n if (!enabled || !pageLive || visible.mutating) return;\n const timer = setInterval(() => {\n if (!requestRef.current.controller) void refresh();\n }, pollIntervalMs);\n return () => clearInterval(timer);\n }, [enabled, pageLive, pollIntervalMs, refresh, visible.mutating]);\n\n useEffect(() => {\n if (!enabled || !browserSessionId || !pageLive) return;\n let disposed = false;\n const heartbeat = () => {\n void client.heartbeatBrowserSession(workspaceId, browserSessionId).catch(() => {\n if (!disposed) void refresh();\n });\n };\n const timer = setInterval(heartbeat, 30_000);\n return () => {\n disposed = true;\n clearInterval(timer);\n };\n }, [browserSessionId, client, enabled, pageLive, refresh, workspaceId]);\n\n const runMutation = useCallback(\n async <T>(scopeBrowserSessionId: string, operation: () => Promise<T>): Promise<T> => {\n invalidateRefresh();\n if (mutationRef.current.browserSessionId !== scopeBrowserSessionId) {\n mutationRef.current = {\n browserSessionId: scopeBrowserSessionId,\n count: 0,\n };\n }\n mutationRef.current.count += 1;\n setState((current) =>\n current.browserSessionId === scopeBrowserSessionId\n ? { ...current, mutating: true, error: null }\n : current,\n );\n try {\n return await operation();\n } catch (cause) {\n const error = cause instanceof Error ? cause : new Error(String(cause));\n setState((current) =>\n current.browserSessionId === scopeBrowserSessionId ? { ...current, error } : current,\n );\n throw error;\n } finally {\n if (mutationRef.current.browserSessionId === scopeBrowserSessionId) {\n mutationRef.current.count = Math.max(0, mutationRef.current.count - 1);\n const mutating = mutationRef.current.count > 0;\n setState((current) =>\n current.browserSessionId === scopeBrowserSessionId ? { ...current, mutating } : current,\n );\n }\n }\n },\n [invalidateRefresh],\n );\n\n const selectTarget = useCallback(\n async (targetId: string): Promise<BrowserTarget> => {\n if (!browserSessionId) throw new Error(\"No BrowserSession is selected.\");\n return await runMutation(browserSessionId, async () => {\n let targets = visible.targets;\n let target: BrowserTarget;\n let observation: BrowserObservation;\n try {\n observation = await client.selectBrowserTarget(workspaceId, browserSessionId, targetId);\n target = observation.target;\n } catch (cause) {\n if (!isMissingBrowserTarget(cause)) throw cause;\n // A physical/attached tab may disappear between inventory and click.\n // Reconcile once from the authoritative controller inventory and move\n // to its live selected/first page instead of leaving a dead tab ID in\n // React state. Session-level 404s are deliberately not swallowed.\n const response = await client.listBrowserTargets(workspaceId, browserSessionId);\n targets = response.targets;\n const fallback = chooseTarget(targets, null);\n if (!fallback) {\n selectedTargetIdRef.current = null;\n observationRef.current = { browserSessionId, observation: null };\n setState((current) =>\n current.browserSessionId === browserSessionId\n ? {\n ...current,\n targets,\n selectedTargetId: null,\n observation: null,\n }\n : current,\n );\n throw cause;\n }\n observation = await client.selectBrowserTarget(\n workspaceId,\n browserSessionId,\n fallback.id,\n );\n target = observation.target;\n }\n selectedTargetIdRef.current = target.id;\n observationRef.current = { browserSessionId, observation };\n setState((current) =>\n current.browserSessionId === browserSessionId\n ? {\n ...current,\n targets: targets.map((candidate) => ({\n ...candidate,\n selected: candidate.id === target.id,\n })),\n selectedTargetId: target.id,\n observation,\n }\n : current,\n );\n return target;\n });\n },\n [browserSessionId, client, runMutation, visible.targets, workspaceId],\n );\n\n const openTarget = useCallback(\n async (url?: string): Promise<BrowserTarget> => {\n if (!browserSessionId) throw new Error(\"No BrowserSession is selected.\");\n return await runMutation(browserSessionId, async () => {\n const observation = await client.openBrowserTarget(\n workspaceId,\n browserSessionId,\n url === undefined ? {} : { url },\n );\n const target = observation.target;\n selectedTargetIdRef.current = target.id;\n observationRef.current = { browserSessionId, observation };\n setState((current) =>\n current.browserSessionId === browserSessionId\n ? {\n ...current,\n targets: [\n ...current.targets.map((candidate) => ({\n ...candidate,\n selected: false,\n })),\n target,\n ],\n selectedTargetId: target.id,\n observation,\n }\n : current,\n );\n return target;\n });\n },\n [browserSessionId, client, runMutation, workspaceId],\n );\n\n const closeTarget = useCallback(\n async (targetId: string): Promise<void> => {\n if (!browserSessionId) throw new Error(\"No BrowserSession is selected.\");\n await runMutation(browserSessionId, async () => {\n const response = await client.closeBrowserTarget(workspaceId, browserSessionId, targetId);\n const selected = chooseTarget(response.targets, null);\n const observation = selected\n ? await client.observeBrowserTarget(workspaceId, browserSessionId, selected.id)\n : null;\n selectedTargetIdRef.current = selected?.id ?? null;\n observationRef.current = { browserSessionId, observation };\n setState((current) =>\n current.browserSessionId === browserSessionId\n ? {\n ...current,\n targets: response.targets,\n selectedTargetId: selected?.id ?? null,\n observation,\n }\n : current,\n );\n });\n },\n [browserSessionId, client, runMutation, workspaceId],\n );\n\n const dispatchAction = useCallback(\n async (\n action: BrowserAction | BrowserActionBatch,\n operationId: string,\n frame: BrowserFrame | null,\n ): Promise<BrowserActionReceipt> => {\n if (!browserSessionId) throw new Error(\"No BrowserSession is selected.\");\n if (frame && frame.browserSessionId !== browserSessionId) {\n throw new Error(\"The displayed browser frame belongs to another BrowserSession.\");\n }\n const currentObservation =\n observationRef.current.browserSessionId === browserSessionId\n ? observationRef.current.observation\n : null;\n const fence = frame\n ? {\n targetId: frame.targetId,\n expectedTargetGeneration: frame.targetGeneration,\n expectedDocumentGeneration: frame.documentGeneration,\n expectedFrameId: frame.frameId,\n }\n : currentObservation\n ? {\n targetId: currentObservation.target.id,\n expectedTargetGeneration: currentObservation.target.targetGeneration,\n expectedDocumentGeneration: currentObservation.target.documentGeneration,\n expectedFrameId: currentObservation.frameId,\n }\n : null;\n if (!fence) {\n throw new Error(\"The browser page is not ready for input.\");\n }\n try {\n const receipt = await client.actInBrowser(workspaceId, browserSessionId, {\n operationId,\n ...fence,\n observationMode: \"none\",\n action,\n });\n if (receipt.observation) {\n observationRef.current = {\n browserSessionId,\n observation: receipt.observation,\n };\n setState((current) =>\n current.browserSessionId === browserSessionId\n ? {\n ...current,\n observation: receipt.observation,\n targets: replaceTarget(current.targets, receipt.observation!.target),\n }\n : current,\n );\n }\n return receipt;\n } catch (cause) {\n const error = cause instanceof Error ? cause : new Error(String(cause));\n setState((current) =>\n current.browserSessionId === browserSessionId ? { ...current, error } : current,\n );\n throw error;\n }\n },\n [browserSessionId, client, workspaceId],\n );\n\n const act = useCallback(\n async (\n action: BrowserAction | BrowserActionBatch,\n operationId: string = crypto.randomUUID(),\n ): Promise<BrowserActionReceipt> => await dispatchAction(action, operationId, null),\n [dispatchAction],\n );\n\n const actFromFrame = useCallback(\n async (\n action: BrowserAction | BrowserActionBatch,\n frame: BrowserFrame,\n operationId: string = crypto.randomUUID(),\n ): Promise<BrowserActionReceipt> => await dispatchAction(action, operationId, frame),\n [dispatchAction],\n );\n\n const diagnostics = useCallback(\n async (diagnosticOptions: BrowserDiagnosticsOptions = {}): Promise<BrowserDiagnosticBatch> => {\n const targetId = selectedTargetIdRef.current;\n if (!browserSessionId || !targetId) {\n throw new Error(\"No browser tab is selected.\");\n }\n return await client.listBrowserDiagnostics(\n workspaceId,\n browserSessionId,\n targetId,\n diagnosticOptions,\n );\n },\n [browserSessionId, client, workspaceId],\n );\n\n const readClipboard = useCallback(async (): Promise<BrowserClipboard> => {\n if (!browserSessionId) throw new Error(\"No BrowserSession is selected.\");\n const clipboard = await client.readBrowserClipboard(workspaceId, browserSessionId);\n if (clipboard.browserSessionId !== browserSessionId) {\n throw new Error(\"Browser clipboard belongs to another BrowserSession.\");\n }\n return clipboard;\n }, [browserSessionId, client, workspaceId]);\n\n return {\n session: visible.session,\n targets: visible.targets,\n selectedTarget:\n visible.targets.find((target) => target.id === visible.selectedTargetId) ?? null,\n observation: visible.observation,\n loading: visible.loading,\n mutating: visible.mutating,\n error: visible.error,\n refresh,\n selectTarget,\n openTarget,\n closeTarget,\n act,\n actFromFrame,\n readClipboard,\n diagnostics,\n };\n}\n\nfunction emptyState(browserSessionId: string | null, loading: boolean) {\n return {\n browserSessionId,\n session: null as BrowserSession | null,\n targets: [] as BrowserTarget[],\n selectedTargetId: null as string | null,\n observation: null as BrowserObservation | null,\n loading,\n mutating: false,\n error: null as Error | null,\n };\n}\n\nfunction chooseTarget(\n targets: readonly BrowserTarget[],\n preferredId: string | null,\n): BrowserTarget | null {\n return (\n targets.find((target) => target.id === preferredId) ??\n targets.find((target) => target.selected && target.kind === \"page\") ??\n targets.find((target) => target.kind === \"page\") ??\n targets[0] ??\n null\n );\n}\n\nfunction replaceTarget(targets: readonly BrowserTarget[], target: BrowserTarget): BrowserTarget[] {\n const next = targets.filter((candidate) => candidate.id !== target.id);\n next.push(target);\n return next.sort((left, right) => left.createdAt.localeCompare(right.createdAt));\n}\n\nfunction isMissingBrowserTarget(error: unknown): boolean {\n return error instanceof OpenGeniApiError && error.code === \"target_not_found\";\n}\n","import type {\n BrowserSession,\n BrowserSessionMutationResponse,\n CreateBrowserSessionRequest,\n} from \"@opengeni/sdk/interaction\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport type { EmbeddedBrowserInteractionClientLike } from \"../client\";\nimport {\n type EmbeddedBrowserInteractionClientOverride,\n useEmbeddedBrowserInteraction,\n} from \"../session-context\";\nimport { useInteractionInvalidation } from \"./use-interaction-invalidation\";\n\nexport type UseBrowserSessionsOptions = EmbeddedBrowserInteractionClientOverride & {\n /** Current agent/session relevance. Workspace peers remain in `sessions`. */\n sessionId?: string | undefined;\n enabled?: boolean | undefined;\n /** Polling fallback used only while the workspace invalidation stream is unavailable. */\n pollIntervalMs?: number | undefined;\n};\n\nexport type UseBrowserSessionsResult = {\n revision: number;\n sessions: BrowserSession[];\n relevantSessions: BrowserSession[];\n loading: boolean;\n refreshing: boolean;\n error: Error | null;\n refresh: () => Promise<void>;\n create: (\n request: Omit<CreateBrowserSessionRequest, \"operationId\"> & {\n operationId?: string;\n },\n ) => Promise<BrowserSessionMutationResponse>;\n suspend: (\n browserSessionId: string,\n operationId?: string,\n ) => Promise<BrowserSessionMutationResponse>;\n resume: (\n browserSessionId: string,\n operationId?: string,\n ) => Promise<BrowserSessionMutationResponse>;\n end: (browserSessionId: string, operationId?: string) => Promise<BrowserSessionMutationResponse>;\n};\n\n/**\n * Workspace-wide BrowserSession registry. Associations rank relevance but never\n * hide peer resources; no explicit share ceremony or per-view ownership exists.\n */\nexport function useBrowserSessions(\n options: UseBrowserSessionsOptions = {},\n): UseBrowserSessionsResult {\n const {\n client,\n workspaceId,\n registerSessionReconciler,\n workspaceInteractionEvent,\n workspaceInteractionConnectionState,\n } = useEmbeddedBrowserInteraction(options);\n const enabled = options.enabled ?? true;\n const [state, setState] = useState<{\n workspaceId: string;\n revision: number;\n sessions: BrowserSession[];\n loading: boolean;\n refreshing: boolean;\n error: Error | null;\n }>(() => emptyState(workspaceId, enabled));\n const requestRef = useRef<{ id: number; controller: AbortController | null }>({\n id: 0,\n controller: null,\n });\n const mountedRef = useRef(true);\n\n const visibleState = state.workspaceId === workspaceId ? state : emptyState(workspaceId, enabled);\n\n const cancelLoad = useCallback(() => {\n const id = requestRef.current.id + 1;\n requestRef.current.controller?.abort();\n requestRef.current = { id, controller: null };\n }, []);\n\n const load = useCallback(\n async (foreground: boolean): Promise<void> => {\n if (!enabled) return;\n const id = requestRef.current.id + 1;\n requestRef.current.controller?.abort();\n const controller = new AbortController();\n requestRef.current = { id, controller };\n setState((current) => ({\n ...(current.workspaceId === workspaceId ? current : emptyState(workspaceId, true)),\n loading: foreground,\n refreshing: !foreground,\n error: foreground || current.workspaceId !== workspaceId ? null : current.error,\n }));\n try {\n const response = await client.listBrowserSessions(workspaceId, {\n signal: controller.signal,\n });\n if (!mountedRef.current || requestRef.current.id !== id) return;\n setState({\n workspaceId,\n revision: response.revision,\n sessions: sortBrowserSessions(response.sessions),\n loading: false,\n refreshing: false,\n error: null,\n });\n } catch (cause) {\n if (controller.signal.aborted || !mountedRef.current || requestRef.current.id !== id)\n return;\n const error = cause instanceof Error ? cause : new Error(String(cause));\n setState((current) => ({\n ...(current.workspaceId === workspaceId ? current : emptyState(workspaceId, true)),\n loading: false,\n refreshing: false,\n error,\n }));\n } finally {\n if (requestRef.current.id === id) {\n requestRef.current = { id, controller: null };\n }\n }\n },\n [client, enabled, workspaceId],\n );\n\n const refresh = useCallback(async () => await load(false), [load]);\n\n useEffect(() => {\n mountedRef.current = true;\n if (!enabled) {\n cancelLoad();\n setState(emptyState(workspaceId, false));\n return;\n }\n void load(true);\n return () => {\n mountedRef.current = false;\n cancelLoad();\n };\n }, [cancelLoad, enabled, load, workspaceId]);\n\n useInteractionInvalidation({\n workspaceId,\n key: workspaceId,\n enabled,\n event: workspaceInteractionEvent,\n connectionState: workspaceInteractionConnectionState,\n knownRevision: visibleState.revision,\n refresh,\n fallbackPollIntervalMs: options.pollIntervalMs,\n });\n\n useEffect(() => {\n if (!enabled || !options.sessionId) return;\n return registerSessionReconciler(options.sessionId, `browser-sessions:${workspaceId}`, refresh);\n }, [enabled, options.sessionId, refresh, registerSessionReconciler, workspaceId]);\n\n const create = useCallback(\n async (\n request: Omit<CreateBrowserSessionRequest, \"operationId\"> & {\n operationId?: string;\n },\n ): Promise<BrowserSessionMutationResponse> => {\n const response = await client.createBrowserSession(workspaceId, {\n ...request,\n operationId: request.operationId ?? crypto.randomUUID(),\n });\n setState((current) => mergeSession(current, workspaceId, response.session));\n return response;\n },\n [client, workspaceId],\n );\n\n const end = useCallback(\n async (\n browserSessionId: string,\n operationId: string = crypto.randomUUID(),\n ): Promise<BrowserSessionMutationResponse> => {\n const response = await client.endBrowserSession(workspaceId, browserSessionId, {\n operationId,\n });\n setState((current) => mergeSession(current, workspaceId, response.session));\n return response;\n },\n [client, workspaceId],\n );\n\n const suspend = useCallback(\n async (\n browserSessionId: string,\n operationId: string = crypto.randomUUID(),\n ): Promise<BrowserSessionMutationResponse> => {\n const response = await client.suspendBrowserSession(workspaceId, browserSessionId, {\n operationId,\n });\n setState((current) => mergeSession(current, workspaceId, response.session));\n return response;\n },\n [client, workspaceId],\n );\n\n const resume = useCallback(\n async (\n browserSessionId: string,\n operationId: string = crypto.randomUUID(),\n ): Promise<BrowserSessionMutationResponse> => {\n const response = await client.resumeBrowserSession(workspaceId, browserSessionId, {\n operationId,\n });\n setState((current) => mergeSession(current, workspaceId, response.session));\n return response;\n },\n [client, workspaceId],\n );\n\n const relevantSessions = useMemo(\n () =>\n options.sessionId\n ? visibleState.sessions.filter((session) =>\n session.associations.some((association) => association.sessionId === options.sessionId),\n )\n : [],\n [options.sessionId, visibleState.sessions],\n );\n\n return {\n revision: visibleState.revision,\n sessions: visibleState.sessions,\n relevantSessions,\n loading: visibleState.loading,\n refreshing: visibleState.refreshing,\n error: visibleState.error,\n refresh,\n create,\n suspend,\n resume,\n end,\n };\n}\n\nfunction emptyState(workspaceId: string, loading: boolean) {\n return {\n workspaceId,\n revision: 0,\n sessions: [] as BrowserSession[],\n loading,\n refreshing: false,\n error: null as Error | null,\n };\n}\n\nfunction sortBrowserSessions(sessions: readonly BrowserSession[]): BrowserSession[] {\n return [...sessions].sort((left, right) => {\n const live = Number(isLiveBrowser(right)) - Number(isLiveBrowser(left));\n return (\n live ||\n timestamp(right.lastUsedAt) - timestamp(left.lastUsedAt) ||\n left.id.localeCompare(right.id)\n );\n });\n}\n\nfunction isLiveBrowser(session: BrowserSession): boolean {\n return ![\"ending\", \"ended\", \"failed\", \"lost\"].includes(session.lifecycle);\n}\n\nfunction timestamp(value: string): number {\n const parsed = Date.parse(value);\n return Number.isFinite(parsed) ? parsed : 0;\n}\n\nfunction mergeSession(\n current: ReturnType<typeof emptyState>,\n workspaceId: string,\n session: BrowserSession,\n): ReturnType<typeof emptyState> {\n if (current.workspaceId !== workspaceId) return current;\n const sessions = current.sessions.filter((candidate) => candidate.id !== session.id);\n sessions.push(session);\n return { ...current, sessions: sortBrowserSessions(sessions), error: null };\n}\n\n/** Exported for narrow proxy implementations and tests. */\nexport type BrowserSessionsClient = EmbeddedBrowserInteractionClientLike;\n","import type {\n CreateInteractionInterventionRequest,\n InteractionIntervention,\n InteractionInterventionMutationResponse,\n ResolveInteractionInterventionRequest,\n} from \"@opengeni/sdk/interaction\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport type { EmbeddedInterventionClientLike } from \"../client\";\nimport {\n type EmbeddedInterventionClientOverride,\n useEmbeddedInterventions,\n} from \"../session-context\";\nimport { useInteractionInvalidation } from \"./use-interaction-invalidation\";\n\nexport type UseInteractionInterventionsOptions = EmbeddedInterventionClientOverride & {\n enabled?: boolean | undefined;\n resourceKind?: \"browser_session\" | \"computer_session\" | undefined;\n resourceId?: string | null | undefined;\n includeSettled?: boolean | undefined;\n pollIntervalMs?: number | undefined;\n};\n\nexport type UseInteractionInterventionsResult = {\n interventions: InteractionIntervention[];\n loading: boolean;\n refreshing: boolean;\n mutating: boolean;\n error: Error | null;\n refresh: () => Promise<void>;\n create: (\n request: Omit<CreateInteractionInterventionRequest, \"operationId\"> & {\n operationId?: string;\n },\n ) => Promise<InteractionInterventionMutationResponse>;\n resolve: (\n interventionId: string,\n request: Omit<ResolveInteractionInterventionRequest, \"operationId\"> & {\n operationId?: string;\n },\n ) => Promise<InteractionInterventionMutationResponse>;\n};\n\n/** Human-action bridge shared by Browser and Computer surfaces. */\nexport function useInteractionInterventions(\n options: UseInteractionInterventionsOptions = {},\n): UseInteractionInterventionsResult {\n const { client, workspaceId, workspaceInteractionEvent, workspaceInteractionConnectionState } =\n useEmbeddedInterventions(options);\n const enabled = (options.enabled ?? true) && options.resourceId !== null;\n const resourceKind = options.resourceKind;\n const resourceId = options.resourceId ?? undefined;\n const includeSettled = options.includeSettled ?? false;\n const key = `${workspaceId}:${resourceKind ?? \"*\"}:${resourceId ?? \"*\"}:${includeSettled}`;\n const [state, setState] = useState(() => emptyState(key, enabled));\n const [mutationCount, setMutationCount] = useState(0);\n const requestRef = useRef<{ id: number; controller: AbortController | null }>({\n id: 0,\n controller: null,\n });\n const mountedRef = useRef(true);\n const visible = state.key === key ? state : emptyState(key, enabled);\n\n const cancelLoad = useCallback(() => {\n requestRef.current.controller?.abort();\n requestRef.current = { id: requestRef.current.id + 1, controller: null };\n }, []);\n\n const load = useCallback(\n async (foreground: boolean, replace = true): Promise<void> => {\n if (!enabled) return;\n if (requestRef.current.controller && !replace) return;\n const id = requestRef.current.id + 1;\n requestRef.current.controller?.abort();\n const controller = new AbortController();\n requestRef.current = { id, controller };\n if (foreground || replace) {\n setState((current) => ({\n ...(current.key === key ? current : emptyState(key, true)),\n loading: foreground,\n refreshing: !foreground,\n error: foreground ? null : current.error,\n }));\n }\n try {\n const response = await client.listInteractionInterventions(workspaceId, {\n ...(resourceKind ? { resourceKind } : {}),\n ...(resourceId ? { resourceId } : {}),\n includeSettled,\n signal: controller.signal,\n });\n if (!mountedRef.current || requestRef.current.id !== id) return;\n setState({\n key,\n interventions: sortInterventions(response.interventions),\n loading: false,\n refreshing: false,\n error: null,\n });\n } catch (cause) {\n if (controller.signal.aborted || !mountedRef.current || requestRef.current.id !== id)\n return;\n setState((current) => ({\n ...(current.key === key ? current : emptyState(key, true)),\n loading: false,\n refreshing: false,\n error: asError(cause),\n }));\n } finally {\n if (requestRef.current.id === id) requestRef.current = { id, controller: null };\n }\n },\n [client, enabled, includeSettled, key, resourceId, resourceKind, workspaceId],\n );\n\n const refresh = useCallback(async () => await load(false, true), [load]);\n\n useEffect(() => {\n mountedRef.current = true;\n if (!enabled) {\n cancelLoad();\n setState(emptyState(key, false));\n return;\n }\n void load(true);\n return () => {\n mountedRef.current = false;\n cancelLoad();\n };\n }, [cancelLoad, enabled, key, load]);\n\n useInteractionInvalidation({\n workspaceId,\n key,\n enabled,\n event: workspaceInteractionEvent,\n connectionState: workspaceInteractionConnectionState,\n refresh,\n fallbackPollIntervalMs: options.pollIntervalMs ?? 2_000,\n });\n\n const mutate = useCallback(async <T>(operation: () => Promise<T>): Promise<T> => {\n setMutationCount((count) => count + 1);\n try {\n return await operation();\n } finally {\n if (mountedRef.current) setMutationCount((count) => Math.max(0, count - 1));\n }\n }, []);\n\n const merge = useCallback(\n (intervention: InteractionIntervention) => {\n setState((current) => {\n if (current.key !== key) return current;\n const interventions = current.interventions.filter(\n (candidate) => candidate.id !== intervention.id,\n );\n const matches =\n (!resourceKind || intervention.resourceKind === resourceKind) &&\n (!resourceId || intervention.resourceId === resourceId);\n if (matches && (includeSettled || intervention.status === \"open\")) {\n interventions.push(intervention);\n }\n return {\n ...current,\n interventions: sortInterventions(interventions),\n error: null,\n };\n });\n },\n [includeSettled, key, resourceId, resourceKind],\n );\n\n const create = useCallback(\n async (\n request: Omit<CreateInteractionInterventionRequest, \"operationId\"> & {\n operationId?: string;\n },\n ): Promise<InteractionInterventionMutationResponse> =>\n await mutate(async () => {\n const response = await client.createInteractionIntervention(workspaceId, {\n ...request,\n operationId: request.operationId ?? crypto.randomUUID(),\n });\n merge(response.intervention);\n return response;\n }),\n [client, merge, mutate, workspaceId],\n );\n\n const resolve = useCallback(\n async (\n interventionId: string,\n request: Omit<ResolveInteractionInterventionRequest, \"operationId\"> & {\n operationId?: string;\n },\n ): Promise<InteractionInterventionMutationResponse> =>\n await mutate(async () => {\n const response = await client.resolveInteractionIntervention(workspaceId, interventionId, {\n ...request,\n operationId: request.operationId ?? crypto.randomUUID(),\n });\n merge(response.intervention);\n return response;\n }),\n [client, merge, mutate, workspaceId],\n );\n\n return {\n interventions: visible.interventions,\n loading: visible.loading,\n refreshing: visible.refreshing,\n mutating: mutationCount > 0,\n error: visible.error,\n refresh,\n create,\n resolve,\n };\n}\n\nfunction emptyState(key: string, loading: boolean) {\n return {\n key,\n interventions: [] as InteractionIntervention[],\n loading,\n refreshing: false,\n error: null as Error | null,\n };\n}\n\nfunction sortInterventions(\n interventions: readonly InteractionIntervention[],\n): InteractionIntervention[] {\n return [...interventions].sort(\n (left, right) => Date.parse(right.updatedAt) - Date.parse(left.updatedAt),\n );\n}\n\nfunction asError(cause: unknown): Error {\n return cause instanceof Error ? cause : new Error(String(cause));\n}\n\nexport type InteractionInterventionsClient = EmbeddedInterventionClientLike;\n","import type {\n AttachedBrowserDevice,\n BrowserAction,\n BrowserActionReceipt,\n BrowserDiagnosticBatch,\n BrowserDownload,\n BrowserDownloadSaveResponse,\n BrowserFrame,\n BrowserIdentity,\n BrowserObservation,\n BrowserRevision,\n BrowserSession,\n BrowserTarget,\n ComputerSession,\n InteractionPlacement,\n InteractionIntervention,\n InteractionSemanticNode,\n} from \"@opengeni/sdk/interaction\";\nimport {\n BugIcon,\n ArchiveIcon,\n CheckIcon,\n ChevronDownIcon,\n CircleAlertIcon,\n DownloadIcon,\n FileCheck2Icon,\n Globe2Icon,\n LoaderCircleIcon,\n MonitorIcon,\n PlusIcon,\n RefreshCwIcon,\n RotateCcwIcon,\n SaveIcon,\n UserRoundIcon,\n XIcon,\n ZapIcon,\n} from \"lucide-react\";\nimport {\n type FormEvent,\n type ClipboardEvent,\n type CompositionEvent,\n type KeyboardEvent,\n type MouseEvent,\n type PointerEvent,\n type ReactNode,\n type WheelEvent,\n useCallback,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport {\n useBrowserFrameStream,\n type BrowserFrameWebSocketFactory,\n} from \"../hooks/use-browser-frame-stream\";\nimport { useAttachedBrowsers } from \"../hooks/use-attached-browsers\";\nimport { useBrowserIdentities } from \"../hooks/use-browser-identities\";\nimport { useBrowserDownloads } from \"../hooks/use-browser-downloads\";\nimport { useBrowserSession } from \"../hooks/use-browser-session\";\nimport { useBrowserSessions } from \"../hooks/use-browser-sessions\";\nimport { useInteractionInterventions } from \"../hooks/use-interaction-interventions\";\nimport { cn } from \"../lib/cn\";\nimport { copyTextToClipboard } from \"../lib/clipboard\";\nimport { formatBytes } from \"../lib/format\";\nimport type { EmbeddedBrowserInteractionClientOverride } from \"../session-context\";\nimport { browserKey, HUMAN_BROWSER_HOME_URL, normalizeBrowserAddress } from \"./browser-input\";\nimport { InteractionInterventionBanner } from \"./interaction-intervention-banner\";\n\nexport type BrowserViewerNotification = {\n kind: \"error\" | \"info\";\n message: string;\n};\n\nexport type BrowserViewerProps = EmbeddedBrowserInteractionClientOverride & {\n /** The selected OpenGeni agent/session. Peer BrowserSessions stay discoverable. */\n sessionId: string;\n enabled?: boolean | undefined;\n className?: string | undefined;\n onNotify?: ((notification: BrowserViewerNotification) => void) | undefined;\n /** Tests/demos only. Production uses the browser's native WebSocket. */\n webSocketFactory?: BrowserFrameWebSocketFactory | undefined;\n renderEmpty?: ((create: () => void, creating: boolean) => ReactNode) | undefined;\n /** Optional host capability for placing a human-created headed browser inside\n * an exact ComputerSession. Browser-only embedders still create a headed\n * browser; they simply omit the linked desktop resource. */\n createLinkedComputer?:\n | ((\n name: string,\n placement?: InteractionPlacement,\n ) => Promise<Pick<ComputerSession, \"id\" | \"placement\">>)\n | undefined;\n /** Navigate to the exact linked ComputerSession; never a lookalike desktop. */\n onOpenComputer?: ((computerSessionId: string) => void) | undefined;\n};\n\ntype BrowserSelection = { sessionId: string; pinned: boolean } | null;\ntype BrowserLaunchChoice =\n | { kind: \"clean\" }\n | { kind: \"profile\"; identityId: string }\n | { kind: \"attached\"; device: AttachedBrowserDevice };\ntype PointerStart = {\n x: number;\n y: number;\n pointerId: number;\n frame: BrowserFrame;\n};\ntype BrowserResumeAttempt = {\n operationId: string;\n running: boolean;\n terminal: boolean;\n error: Error | null;\n};\ntype BrowserDiagnosticsView = {\n browserSessionId: string;\n targetId: string;\n loading: boolean;\n batch: BrowserDiagnosticBatch | null;\n error: Error | null;\n};\n\n/**\n * Complete browser-native session surface: workspace discovery, agent relevance,\n * browser/tab switching, live frames, semantic fallback, direct human input,\n * address navigation, diagnostics, and reconnect. Closing it never closes the browser.\n */\nexport function BrowserViewer({\n sessionId,\n enabled = true,\n className,\n onNotify,\n webSocketFactory,\n renderEmpty,\n createLinkedComputer,\n onOpenComputer,\n ...override\n}: BrowserViewerProps) {\n const registry = useBrowserSessions({ ...override, sessionId, enabled });\n const attached = useAttachedBrowsers({ ...override, enabled });\n const profiles = useBrowserIdentities({ ...override, enabled, includeArchived: true });\n const activeProfiles = useMemo(\n () => profiles.identities.filter((identity) => identity.status === \"active\"),\n [profiles.identities],\n );\n const createRegistryBrowser = registry.create;\n const loadProfileRevisions = profiles.revisions;\n const liveSessions = useMemo(\n () => registry.sessions.filter((session) => isLiveBrowser(session)),\n [registry.sessions],\n );\n const relevant = useMemo(\n () => registry.relevantSessions.filter((session) => isLiveBrowser(session)),\n [registry.relevantSessions],\n );\n const [selection, setSelection] = useState<BrowserSelection>(null);\n const interventions = useInteractionInterventions({\n ...override,\n enabled,\n resourceKind: \"browser_session\",\n });\n const [creating, setCreating] = useState(false);\n const [savingProfile, setSavingProfile] = useState(false);\n const [baseRevisionOrdinal, setBaseRevisionOrdinal] = useState<number | null>(null);\n const [profileHistory, setProfileHistory] = useState<{\n identityId: string;\n loading: boolean;\n revisions: BrowserRevision[];\n } | null>(null);\n const [resumeAttempt, setResumeAttempt] = useState<{\n sessionId: string;\n attempt: BrowserResumeAttempt;\n } | null>(null);\n const resumeAttemptsRef = useRef(new Map<string, BrowserResumeAttempt>());\n const previousSessionIdRef = useRef(sessionId);\n const seenInterventionIdsRef = useRef(new Set<string>());\n const diagnosticRequestRef = useRef(0);\n const [diagnosticsView, setDiagnosticsView] = useState<BrowserDiagnosticsView | null>(null);\n\n const notifyError = useCallback(\n (cause: unknown, fallback: string) => {\n const message = cause instanceof Error ? cause.message : fallback;\n onNotify?.({ kind: \"error\", message });\n },\n [onNotify],\n );\n\n useEffect(() => {\n if (previousSessionIdRef.current !== sessionId) {\n previousSessionIdRef.current = sessionId;\n setSelection(null);\n }\n }, [sessionId]);\n\n useEffect(() => {\n const selectedStillLive = liveSessions.some((session) => session.id === selection?.sessionId);\n // A manually selected workspace browser stays selected, but an unrelated\n // browser must never become the implicit browser for this agent. That made\n // a Modal session appear to own a connected Mac browser.\n if (selection?.pinned && selectedStillLive) return;\n const preferred = relevant[0] ?? null;\n if (!preferred) {\n if (selection) setSelection(null);\n return;\n }\n if (!selectedStillLive || !selection?.pinned) {\n if (selection?.sessionId !== preferred.id || selection.pinned) {\n setSelection({ sessionId: preferred.id, pinned: false });\n }\n }\n }, [liveSessions, relevant, selection]);\n\n const selectedRegistrySession = useMemo(\n () => liveSessions.find((session) => session.id === selection?.sessionId) ?? null,\n [liveSessions, selection?.sessionId],\n );\n const interventionCounts = useMemo(\n () => countInterventions(interventions.interventions),\n [interventions.interventions],\n );\n const selectedInterventions = useMemo(\n () =>\n interventions.interventions.filter(\n (intervention) => intervention.resourceId === selection?.sessionId,\n ),\n [interventions.interventions, selection?.sessionId],\n );\n const controllerReady = selectedRegistrySession?.lifecycle === \"active\";\n const resumeSession = registry.resume;\n\n const wakeBrowser = useCallback(\n async (session: BrowserSession, retry = false): Promise<void> => {\n const current = resumeAttemptsRef.current.get(session.id);\n if (current?.running || (!retry && current)) return;\n const operationId = current && !current.terminal ? current.operationId : crypto.randomUUID();\n const attempt: BrowserResumeAttempt = {\n operationId,\n running: true,\n terminal: false,\n error: null,\n };\n resumeAttemptsRef.current.set(session.id, attempt);\n setResumeAttempt({ sessionId: session.id, attempt });\n try {\n const response = await resumeSession(session.id, operationId);\n if (response.operation.state !== \"completed\") {\n throw Object.assign(\n new Error(response.operation.error?.message ?? \"Browser could not reopen.\"),\n { terminal: true },\n );\n }\n resumeAttemptsRef.current.delete(session.id);\n setResumeAttempt((visible) => (visible?.sessionId === session.id ? null : visible));\n } catch (cause) {\n const error = cause instanceof Error ? cause : new Error(String(cause));\n const failed: BrowserResumeAttempt = {\n operationId,\n running: false,\n terminal:\n typeof cause === \"object\" && cause !== null && \"terminal\" in cause\n ? cause.terminal === true\n : false,\n error,\n };\n resumeAttemptsRef.current.set(session.id, failed);\n setResumeAttempt({ sessionId: session.id, attempt: failed });\n notifyError(error, \"Could not reopen this browser.\");\n }\n },\n [notifyError, resumeSession],\n );\n\n useEffect(() => {\n if (!selectedRegistrySession) return;\n if (selectedRegistrySession.lifecycle === \"active\") {\n resumeAttemptsRef.current.delete(selectedRegistrySession.id);\n setResumeAttempt((visible) =>\n visible?.sessionId === selectedRegistrySession.id ? null : visible,\n );\n return;\n }\n if (selectedRegistrySession.lifecycle === \"suspended\") {\n void wakeBrowser(selectedRegistrySession);\n }\n }, [selectedRegistrySession, wakeBrowser]);\n\n const browser = useBrowserSession({\n ...override,\n browserSessionId: selection?.sessionId ?? null,\n enabled: enabled && selection !== null && controllerReady,\n });\n const downloads = useBrowserDownloads({\n ...override,\n browserSessionId: selection?.sessionId ?? null,\n enabled:\n enabled &&\n diagnosticsView !== null &&\n controllerReady &&\n browser.session?.capabilities.downloads === true,\n });\n const loadBrowserDiagnostics = browser.diagnostics;\n\n useEffect(() => {\n for (const intervention of interventions.interventions) {\n if (seenInterventionIdsRef.current.has(intervention.id)) continue;\n seenInterventionIdsRef.current.add(intervention.id);\n onNotify?.({\n kind: \"info\",\n message: `${interventionTitle(intervention)}: ${intervention.reason}`,\n });\n }\n }, [interventions.interventions, onNotify]);\n\n const resolveIntervention = useCallback(\n (intervention: InteractionIntervention, outcome: \"completed\" | \"dismissed\") => {\n void interventions\n .resolve(intervention.id, {\n expectedVersion: intervention.version,\n outcome,\n })\n .then(() => {\n onNotify?.({\n kind: \"info\",\n message:\n outcome === \"completed\" ? \"Agent notified. Continuing work.\" : \"Request cancelled.\",\n });\n })\n .catch((cause) => notifyError(cause, \"Could not update the browser request.\"));\n },\n [interventions, notifyError, onNotify],\n );\n const frames = useBrowserFrameStream({\n ...override,\n browserSessionId: selection?.sessionId ?? null,\n targetId: browser.selectedTarget?.id ?? null,\n enabled:\n enabled &&\n selection !== null &&\n controllerReady &&\n browser.selectedTarget !== null &&\n browser.session?.capabilities.liveFrames === true,\n stream: { format: \"jpeg\", quality: 76, maxWidth: 1_920, maxHeight: 1_200 },\n ...(webSocketFactory ? { webSocketFactory } : {}),\n });\n const displayedFrame = frameMatchesSelectedTarget(\n frames.frame,\n browser.session,\n browser.selectedTarget,\n )\n ? frames.frame\n : null;\n const supportsLiveFrames = browser.session?.capabilities.liveFrames === true;\n const displayConnectionState = supportsLiveFrames\n ? frames.state === \"live\" && !displayedFrame\n ? \"connecting\"\n : frames.state\n : \"semantic\";\n const selectedProfile = useMemo(\n () =>\n profiles.identities.find(\n (identity) =>\n identity.id === (browser.session?.identityId ?? selectedRegistrySession?.identityId),\n ) ?? null,\n [browser.session?.identityId, profiles.identities, selectedRegistrySession?.identityId],\n );\n\n useEffect(() => {\n diagnosticRequestRef.current += 1;\n setDiagnosticsView(null);\n }, [browser.session?.id, browser.selectedTarget?.id]);\n\n const loadDiagnostics = useCallback(() => {\n const browserSessionId = browser.session?.id;\n const targetId = browser.selectedTarget?.id;\n if (!browserSessionId || !targetId) return;\n const requestId = diagnosticRequestRef.current + 1;\n diagnosticRequestRef.current = requestId;\n setDiagnosticsView((current) => ({\n browserSessionId,\n targetId,\n loading: true,\n batch:\n current?.browserSessionId === browserSessionId && current.targetId === targetId\n ? current.batch\n : null,\n error: null,\n }));\n void loadBrowserDiagnostics({ limit: 100 })\n .then((batch) => {\n if (diagnosticRequestRef.current !== requestId) return;\n setDiagnosticsView({ browserSessionId, targetId, loading: false, batch, error: null });\n })\n .catch((cause) => {\n if (diagnosticRequestRef.current !== requestId) return;\n setDiagnosticsView({\n browserSessionId,\n targetId,\n loading: false,\n batch: null,\n error: cause instanceof Error ? cause : new Error(String(cause)),\n });\n });\n }, [browser.selectedTarget?.id, browser.session?.id, loadBrowserDiagnostics]);\n\n const closeDiagnostics = useCallback(() => {\n diagnosticRequestRef.current += 1;\n setDiagnosticsView(null);\n }, []);\n\n const refreshDiagnostics = useCallback(() => {\n loadDiagnostics();\n if (browser.session?.capabilities.downloads) void downloads.refresh();\n }, [browser.session?.capabilities.downloads, downloads, loadDiagnostics]);\n\n const saveDownload = useCallback(\n async (\n downloadId: string,\n destinationPath: string,\n overwrite: boolean,\n ): Promise<BrowserDownloadSaveResponse> => {\n const response = await downloads.saveToWorkspace(downloadId, destinationPath, { overwrite });\n onNotify?.({\n kind: \"info\",\n message: `${response.download.filename} saved to ${response.destinationPath}.`,\n });\n return response;\n },\n [downloads, onNotify],\n );\n\n useEffect(() => {\n const identityId = browser.session?.identityId ?? selectedRegistrySession?.identityId;\n const revisionId = browser.session?.baseRevisionId ?? selectedRegistrySession?.baseRevisionId;\n if (!identityId) {\n setBaseRevisionOrdinal(null);\n setProfileHistory(null);\n return;\n }\n let disposed = false;\n setBaseRevisionOrdinal(null);\n setProfileHistory({ identityId, loading: true, revisions: [] });\n void loadProfileRevisions(identityId)\n .then((response) => {\n if (!disposed) {\n setBaseRevisionOrdinal(\n revisionId\n ? (response.revisions.find((revision) => revision.id === revisionId)?.ordinal ?? null)\n : null,\n );\n setProfileHistory({ identityId, loading: false, revisions: response.revisions });\n }\n })\n .catch(() => {\n if (!disposed) setProfileHistory({ identityId, loading: false, revisions: [] });\n });\n return () => {\n disposed = true;\n };\n }, [\n browser.session?.baseRevisionId,\n browser.session?.identityId,\n loadProfileRevisions,\n selectedRegistrySession?.baseRevisionId,\n selectedRegistrySession?.identityId,\n ]);\n\n const createBrowser = useCallback(\n (choice: BrowserLaunchChoice = { kind: \"clean\" }) => {\n if (creating) return;\n const identity =\n choice.kind === \"profile\"\n ? activeProfiles.find((candidate) => candidate.id === choice.identityId)\n : null;\n const device = choice.kind === \"attached\" ? choice.device : null;\n const browserName =\n device?.profileLabel ?? device?.name ?? (identity ? `${identity.name} browser` : \"Browser\");\n setCreating(true);\n void (async () => {\n let linkedComputer: Pick<ComputerSession, \"id\" | \"placement\"> | null = null;\n let computerViewUnavailable = false;\n if (createLinkedComputer) {\n try {\n linkedComputer = await createLinkedComputer(\n `${browserName} computer`,\n device ? { kind: \"attached_device\", deviceId: device.id } : undefined,\n );\n } catch {\n // Browser control is independently useful on locked/headless placements.\n // A linked ComputerSession is an optional visual enhancement and must not\n // prevent the canonical BrowserSession from starting.\n computerViewUnavailable = true;\n }\n }\n const response = await createRegistryBrowser({\n sessionId,\n name: browserName,\n // Human-created browsers are always ordinary visual Chromium/Chrome.\n // Lightpanda remains an agent-only optimization requested explicitly\n // through browser_open; if an agent creates one it is still visible in\n // the shared BrowserSession switcher.\n headless: false,\n initialUrl: HUMAN_BROWSER_HOME_URL,\n ...(device\n ? {\n placement: {\n kind: \"attached_device\" as const,\n deviceId: device.id,\n },\n }\n : {}),\n ...(linkedComputer\n ? {\n linkedComputerSessionId: linkedComputer.id,\n placement: linkedComputer.placement,\n }\n : {}),\n ...(identity ? { identityId: identity.id } : {}),\n });\n setSelection({ sessionId: response.session.id, pinned: true });\n if (computerViewUnavailable) {\n onNotify?.({\n kind: \"info\",\n message: \"Browser opened. Computer view is unavailable on this placement.\",\n });\n }\n })()\n .catch((cause) => notifyError(cause, \"Could not open a browser.\"))\n .finally(() => setCreating(false));\n },\n [\n createLinkedComputer,\n createRegistryBrowser,\n creating,\n notifyError,\n onNotify,\n activeProfiles,\n sessionId,\n ],\n );\n\n const saveProfileVersion = useCallback(\n async (newProfileName?: string): Promise<boolean> => {\n const session = browser.session;\n if (!session || savingProfile || !session.capabilities.identityPublication) return false;\n setSavingProfile(true);\n try {\n let identity = selectedProfile;\n if (!identity) {\n const name = newProfileName?.trim() ?? \"\";\n if (!name) return false;\n // First-save is intentionally two-phase: the named identity exists\n // before its first immutable revision. If capture/upload failed after\n // that create, retry into the same empty identity instead of turning\n // the recoverable draft into a permanent name conflict.\n identity =\n profiles.identities.find(\n (candidate) =>\n candidate.status === \"active\" &&\n candidate.revisionCount === 0 &&\n candidate.name.localeCompare(name, undefined, { sensitivity: \"base\" }) === 0,\n ) ?? (await profiles.create({ name })).identity;\n }\n const response = await profiles.publish(session.id, {\n identityId: identity.id,\n expectedHeadGeneration: identity.headGeneration,\n advanceDefault: true,\n });\n setBaseRevisionOrdinal(response.revision.ordinal);\n setProfileHistory((current) => ({\n identityId: response.identity.id,\n loading: false,\n revisions:\n current?.identityId === response.identity.id\n ? [\n ...current.revisions.filter((revision) => revision.id !== response.revision.id),\n response.revision,\n ]\n : [response.revision],\n }));\n await Promise.all([browser.refresh(), registry.refresh()]);\n onNotify?.({\n kind: \"info\",\n message:\n response.outcome === \"saved_as_default\"\n ? `${response.identity.name} version ${response.revision.ordinal} saved for future browsers.`\n : `${response.identity.name} version ${response.revision.ordinal} saved. Another version remains the default.`,\n });\n return true;\n } catch (cause) {\n notifyError(cause, \"Could not save this browser profile.\");\n return false;\n } finally {\n setSavingProfile(false);\n }\n },\n [browser, notifyError, onNotify, profiles, registry, savingProfile, selectedProfile],\n );\n\n const updateProfile = useCallback(\n async (\n identity: BrowserIdentity,\n update: { name?: string; status?: \"active\" | \"archived\"; defaultRevisionId?: string },\n ): Promise<boolean> => {\n if (savingProfile) return false;\n setSavingProfile(true);\n try {\n const response = await profiles.update(identity.id, {\n expectedVersion: identity.version,\n ...update,\n });\n if (update.defaultRevisionId) {\n const ordinal = profileHistory?.revisions.find(\n (revision) => revision.id === update.defaultRevisionId,\n )?.ordinal;\n onNotify?.({\n kind: \"info\",\n message: `${response.identity.name}${ordinal ? ` version ${ordinal}` : \"\"} will open by default in future browsers.`,\n });\n } else if (update.status === \"archived\") {\n onNotify?.({\n kind: \"info\",\n message: `${response.identity.name} hidden from new browsers. Existing browsers are unchanged.`,\n });\n } else if (update.status === \"active\") {\n onNotify?.({ kind: \"info\", message: `${response.identity.name} restored.` });\n }\n return true;\n } catch (cause) {\n notifyError(cause, \"Could not update this browser profile.\");\n await profiles.refresh().catch(() => undefined);\n return false;\n } finally {\n setSavingProfile(false);\n }\n },\n [notifyError, onNotify, profileHistory?.revisions, profiles, savingProfile],\n );\n\n if (!enabled) return null;\n if (registry.loading && liveSessions.length === 0) {\n return (\n <BrowserNotice\n icon={<LoaderCircleIcon className=\"animate-spin\" />}\n text=\"Finding browsers…\"\n {...(className ? { className } : {})}\n />\n );\n }\n if (liveSessions.length === 0) {\n if (renderEmpty) return <>{renderEmpty(() => createBrowser(), creating)}</>;\n return (\n <div\n className={cn(\"flex h-full min-h-0 items-center justify-center bg-og-bg p-6\", className)}\n >\n <div className=\"max-w-sm text-center\">\n <span className=\"mx-auto grid size-10 place-items-center rounded-og-md border border-og-border bg-og-surface-1 text-og-muted\">\n <Globe2Icon className=\"size-4.5\" />\n </span>\n <p className=\"mt-3 text-og-menu font-medium text-og-fg\">No browser open</p>\n <p className=\"mt-1 text-og-control leading-5 text-og-muted\">\n A browser appears here when this agent—or another agent in the workspace—opens one.\n </p>\n <BrowserLaunchMenu\n attachedDevices={attached.devices}\n identities={profiles.identities}\n creating={creating}\n mutatingProfile={savingProfile}\n onCreate={createBrowser}\n onRestore={(identity) => updateProfile(identity, { status: \"active\" })}\n prominent\n />\n {registry.error ? (\n <p className=\"mt-3 text-og-control text-og-status-error\">{registry.error.message}</p>\n ) : null}\n </div>\n </div>\n );\n }\n\n return (\n <div\n className={cn(\"relative flex h-full min-h-0 flex-col overflow-hidden bg-og-bg\", className)}\n >\n <BrowserToolbar\n sessions={liveSessions}\n relevantSessionIds={new Set(relevant.map((session) => session.id))}\n selectedSessionId={selection?.sessionId ?? null}\n identities={profiles.identities}\n attachedDevices={attached.devices}\n selectedProfile={selectedProfile}\n baseRevisionOrdinal={baseRevisionOrdinal}\n profileHistory={profileHistory}\n creating={creating}\n savingProfile={savingProfile}\n refreshing={registry.refreshing || attached.refreshing}\n interventionCounts={interventionCounts}\n onSelect={(browserSessionId) => setSelection({ sessionId: browserSessionId, pinned: true })}\n onFollow={() => {\n const preferred = relevant[0];\n if (preferred) setSelection({ sessionId: preferred.id, pinned: false });\n }}\n onCreate={createBrowser}\n onSaveProfile={saveProfileVersion}\n onUpdateProfile={updateProfile}\n onRefresh={() => void Promise.all([registry.refresh(), attached.refresh()])}\n />\n <InteractionInterventionBanner\n interventions={selectedInterventions}\n activeTargetId={browser.selectedTarget?.id ?? null}\n mutating={interventions.mutating}\n onOpen={(intervention) =>\n void browser\n .selectTarget(intervention.targetId)\n .catch((cause) => notifyError(cause, \"Could not open the requested browser tab.\"))\n }\n onResolve={resolveIntervention}\n />\n {!selectedRegistrySession ? (\n <BrowserUnselectedPanel\n peerCount={liveSessions.length}\n creating={creating}\n onCreate={() => createBrowser()}\n />\n ) : !controllerReady ? (\n <BrowserLifecyclePanel\n session={selectedRegistrySession}\n attempt={\n resumeAttempt?.sessionId === selectedRegistrySession.id ? resumeAttempt.attempt : null\n }\n onResume={() => void wakeBrowser(selectedRegistrySession, true)}\n />\n ) : (\n <>\n <BrowserTabs\n targets={browser.targets}\n selectedTargetId={browser.selectedTarget?.id ?? null}\n mutating={savingProfile}\n tabControl={browser.session?.capabilities.tabs === true}\n onSelect={(targetId) =>\n void browser\n .selectTarget(targetId)\n .catch((cause) => notifyError(cause, \"Could not switch tabs.\"))\n }\n onClose={(targetId) =>\n void browser\n .closeTarget(targetId)\n .catch((cause) => notifyError(cause, \"Could not close the tab.\"))\n }\n onOpen={() =>\n void browser\n .openTarget(HUMAN_BROWSER_HOME_URL)\n .catch((cause) => notifyError(cause, \"Could not open a tab.\"))\n }\n />\n <BrowserAddressBar\n target={browser.selectedTarget}\n loading={browser.loading || browser.mutating || savingProfile}\n onNavigate={(url) =>\n void browser\n .act({ type: \"navigate\", url })\n .catch((cause) => notifyError(cause, \"Could not navigate.\"))\n }\n onReload={() => {\n const url = browser.selectedTarget?.url;\n if (url)\n void browser\n .act({ type: \"navigate\", url })\n .catch((cause) => notifyError(cause, \"Could not reload.\"));\n }}\n />\n <BrowserViewport\n frame={displayedFrame}\n connectionState={displayConnectionState}\n supportsLiveFrames={supportsLiveFrames}\n connectionError={frames.error}\n observation={browser.observation}\n mutating={browser.mutating || savingProfile}\n activityLabel={savingProfile ? \"Saving browser version…\" : undefined}\n clipboardEnabled={browser.session?.capabilities.clipboard === true}\n onAction={async (action, frame) => {\n const receipt = frame\n ? await browser.actFromFrame(action, frame)\n : await browser.act(action);\n if (receipt.state !== \"completed\") {\n throw new Error(receipt.error?.message ?? \"Browser input did not complete.\");\n }\n return receipt;\n }}\n onReadClipboard={browser.readClipboard}\n onReconnect={frames.reconnect}\n onError={(cause) => notifyError(cause, \"Browser input failed.\")}\n />\n <BrowserStatusBar\n session={browser.session}\n profile={selectedProfile}\n target={browser.selectedTarget}\n observation={browser.observation}\n connectionState={displayConnectionState}\n refreshing={registry.refreshing}\n diagnosticsOpen={diagnosticsView !== null}\n onOpenComputer={\n browser.session?.linkedComputerSessionId && onOpenComputer\n ? () => {\n const computerSessionId = browser.session?.linkedComputerSessionId;\n if (computerSessionId) onOpenComputer(computerSessionId);\n }\n : undefined\n }\n onDiagnostics={diagnosticsView ? closeDiagnostics : loadDiagnostics}\n />\n </>\n )}\n {diagnosticsView ? (\n <BrowserDiagnosticsDrawer\n session={browser.session}\n profile={selectedProfile}\n target={browser.selectedTarget}\n observation={browser.observation}\n baseRevisionOrdinal={baseRevisionOrdinal}\n state={diagnosticsView}\n downloads={downloads.downloads}\n downloadsEnabled={browser.session?.capabilities.downloads === true}\n downloadsLoading={downloads.loading}\n downloadsRefreshing={downloads.refreshing}\n downloadsError={downloads.error}\n savingDownloadIds={downloads.savingDownloadIds}\n onSaveDownload={saveDownload}\n onRefreshDownloads={() => void downloads.refresh()}\n onRefresh={refreshDiagnostics}\n onClose={closeDiagnostics}\n />\n ) : null}\n </div>\n );\n}\n\nfunction BrowserLifecyclePanel(props: {\n session: BrowserSession;\n attempt: BrowserResumeAttempt | null;\n onResume: () => void;\n}) {\n const failed = props.attempt?.error ?? null;\n const label = failed\n ? \"Browser could not reopen\"\n : props.session.lifecycle === \"suspending\"\n ? \"Saving browser state…\"\n : props.session.lifecycle === \"restoring\" || props.attempt?.running\n ? \"Opening browser…\"\n : props.session.lifecycle === \"starting\"\n ? \"Starting browser…\"\n : \"Browser is sleeping\";\n const detail = failed\n ? failed.message\n : props.session.lifecycle === \"suspended\"\n ? \"Its private state is saved. Opening it creates a fresh, isolated browser process.\"\n : \"The browser will reconnect here when it is ready.\";\n return (\n <div className=\"grid min-h-0 flex-1 place-items-center bg-og-bg p-6 text-center\">\n <div className=\"max-w-sm\">\n <span className=\"mx-auto grid size-10 place-items-center rounded-og-md border border-og-border bg-og-surface-1 text-og-muted\">\n {failed ? (\n <CircleAlertIcon className=\"size-4.5 text-og-status-error\" />\n ) : (\n <LoaderCircleIcon className=\"size-4.5 animate-spin\" />\n )}\n </span>\n <p className=\"mt-3 text-og-menu font-medium text-og-fg\">{label}</p>\n <p className=\"mt-1 text-og-control leading-5 text-og-muted\">{detail}</p>\n {failed || (props.session.lifecycle === \"suspended\" && !props.attempt?.running) ? (\n <button\n type=\"button\"\n onClick={props.onResume}\n className=\"mt-4 inline-flex h-8 items-center rounded-og-sm border border-og-border bg-og-surface-1 px-3 text-og-control font-medium text-og-fg transition hover:bg-og-surface-2\"\n >\n Open browser\n </button>\n ) : null}\n </div>\n </div>\n );\n}\n\nfunction BrowserToolbar(props: {\n sessions: BrowserSession[];\n relevantSessionIds: Set<string>;\n selectedSessionId: string | null;\n attachedDevices: AttachedBrowserDevice[];\n identities: BrowserIdentity[];\n selectedProfile: BrowserIdentity | null;\n baseRevisionOrdinal: number | null;\n profileHistory: { identityId: string; loading: boolean; revisions: BrowserRevision[] } | null;\n creating: boolean;\n savingProfile: boolean;\n refreshing: boolean;\n interventionCounts: Map<string, number>;\n onSelect: (id: string) => void;\n onFollow: () => void;\n onCreate: (choice?: BrowserLaunchChoice) => void;\n onSaveProfile: (newProfileName?: string) => Promise<boolean>;\n onUpdateProfile: (\n identity: BrowserIdentity,\n update: { name?: string; status?: \"active\" | \"archived\"; defaultRevisionId?: string },\n ) => Promise<boolean>;\n onRefresh: () => void;\n}) {\n const detailsRef = useRef<HTMLDetailsElement | null>(null);\n const selected = props.sessions.find((session) => session.id === props.selectedSessionId);\n const current = props.sessions.filter((session) => props.relevantSessionIds.has(session.id));\n const others = props.sessions.filter((session) => !props.relevantSessionIds.has(session.id));\n const choose = (id: string) => {\n props.onSelect(id);\n detailsRef.current?.removeAttribute(\"open\");\n };\n return (\n <div className=\"flex h-10 shrink-0 items-center gap-1.5 border-b border-og-border bg-og-surface-0 px-2\">\n <details ref={detailsRef} className=\"relative min-w-0\">\n <summary className=\"flex h-7 max-w-52 cursor-pointer list-none items-center gap-2 rounded-og-sm px-2 text-og-control text-og-fg transition hover:bg-og-surface-2 [&::-webkit-details-marker]:hidden\">\n <Globe2Icon className=\"size-3.5 shrink-0 text-og-muted\" />\n <span className=\"truncate font-medium\">{selected?.name ?? \"Browser\"}</span>\n {(props.interventionCounts.get(selected?.id ?? \"\") ?? 0) > 0 ? (\n <span className=\"size-1.5 shrink-0 rounded-full bg-og-status-waiting\" />\n ) : null}\n <ChevronDownIcon className=\"size-3 shrink-0 text-og-subtle\" />\n </summary>\n <div className=\"absolute left-0 top-8 z-30 w-72 overflow-hidden rounded-og-md border border-og-border bg-og-surface-1 p-1 shadow-xl\">\n <BrowserSessionGroup\n label=\"Current agent\"\n sessions={current}\n identities={props.identities}\n selectedId={props.selectedSessionId}\n interventionCounts={props.interventionCounts}\n onSelect={choose}\n />\n <BrowserSessionGroup\n label=\"Workspace browsers\"\n sessions={others}\n identities={props.identities}\n selectedId={props.selectedSessionId}\n interventionCounts={props.interventionCounts}\n onSelect={choose}\n />\n <div className=\"mt-1 flex gap-1 border-t border-og-border pt-1\">\n {current.length > 0 ? (\n <MenuButton onClick={props.onFollow}>Follow agent</MenuButton>\n ) : null}\n <MenuButton onClick={() => props.onCreate()} disabled={props.creating}>\n <PlusIcon className=\"size-3.5\" /> New browser\n </MenuButton>\n </div>\n </div>\n </details>\n <span className=\"min-w-0 flex-1 truncate text-og-xs text-og-subtle\">\n {placementLabel(selected)}\n </span>\n <BrowserProfileMenu\n session={selected ?? null}\n identity={props.selectedProfile}\n baseRevisionOrdinal={props.baseRevisionOrdinal}\n history={props.profileHistory}\n saving={props.savingProfile}\n onSave={props.onSaveProfile}\n onUpdate={props.onUpdateProfile}\n />\n <button\n type=\"button\"\n onClick={props.onRefresh}\n className=\"grid size-7 place-items-center rounded-og-sm text-og-muted transition hover:bg-og-surface-2 hover:text-og-fg\"\n aria-label=\"Refresh browsers\"\n >\n <RefreshCwIcon className={cn(\"size-3.5\", props.refreshing && \"animate-spin\")} />\n </button>\n <BrowserLaunchMenu\n attachedDevices={props.attachedDevices}\n identities={props.identities}\n creating={props.creating}\n mutatingProfile={props.savingProfile}\n onCreate={props.onCreate}\n onRestore={(identity) => props.onUpdateProfile(identity, { status: \"active\" })}\n />\n </div>\n );\n}\n\nfunction BrowserUnselectedPanel(props: {\n peerCount: number;\n creating: boolean;\n onCreate: () => void;\n}) {\n return (\n <div className=\"grid min-h-0 flex-1 place-items-center bg-og-bg p-6 text-center\">\n <div className=\"max-w-sm\">\n <span className=\"mx-auto grid size-10 place-items-center rounded-og-md border border-og-border bg-og-surface-1 text-og-muted\">\n <Globe2Icon className=\"size-4.5\" />\n </span>\n <p className=\"mt-3 text-og-menu font-medium text-og-fg\">No browser for this agent</p>\n <p className=\"mt-1 text-og-control leading-5 text-og-muted\">\n {props.peerCount === 1\n ? \"One workspace browser is available from the browser menu.\"\n : `${props.peerCount} workspace browsers are available from the browser menu.`}\n </p>\n <button\n type=\"button\"\n disabled={props.creating}\n onClick={props.onCreate}\n className=\"mt-4 inline-flex h-8 items-center gap-1.5 rounded-og-sm border border-og-border bg-og-surface-1 px-3 text-og-control font-medium text-og-fg transition hover:bg-og-surface-2 disabled:cursor-not-allowed disabled:opacity-50\"\n >\n <PlusIcon className=\"size-3.5\" />\n {props.creating ? \"Opening…\" : \"New browser\"}\n </button>\n </div>\n </div>\n );\n}\n\nfunction BrowserSessionGroup(props: {\n label: string;\n sessions: BrowserSession[];\n identities: BrowserIdentity[];\n selectedId: string | null;\n interventionCounts: Map<string, number>;\n onSelect: (id: string) => void;\n}) {\n if (props.sessions.length === 0) return null;\n return (\n <div className=\"py-1\">\n <p className=\"px-2 pb-1 text-[10px] font-medium uppercase tracking-[0.12em] text-og-subtle\">\n {props.label}\n </p>\n {props.sessions.map((session) => {\n const identity = props.identities.find((candidate) => candidate.id === session.identityId);\n const interventionCount = props.interventionCounts.get(session.id) ?? 0;\n return (\n <button\n key={session.id}\n type=\"button\"\n onClick={() => props.onSelect(session.id)}\n className={cn(\n \"flex w-full items-center gap-2 rounded-og-sm px-2 py-1.5 text-left transition hover:bg-og-surface-2\",\n session.id === props.selectedId && \"bg-og-surface-2\",\n )}\n >\n <span\n className={cn(\n \"size-1.5 rounded-full\",\n session.lifecycle === \"active\" ? \"bg-og-status-running\" : \"bg-og-muted\",\n )}\n />\n <span className=\"min-w-0 flex-1\">\n <span className=\"block truncate text-og-control text-og-fg\">{session.name}</span>\n <span className=\"block truncate text-og-xs text-og-subtle\">\n {identity ? `${identity.name} · ` : \"\"}\n {placementLabel(session)}\n </span>\n </span>\n {interventionCount > 0 ? (\n <span className=\"rounded-full bg-og-status-waiting/12 px-1.5 py-0.5 text-[10px] font-medium text-og-status-waiting\">\n {interventionCount}\n </span>\n ) : null}\n </button>\n );\n })}\n </div>\n );\n}\n\nfunction BrowserLaunchMenu(props: {\n attachedDevices: AttachedBrowserDevice[];\n identities: BrowserIdentity[];\n creating: boolean;\n mutatingProfile: boolean;\n onCreate: (choice?: BrowserLaunchChoice) => void;\n onRestore: (identity: BrowserIdentity) => Promise<boolean>;\n prominent?: boolean;\n}) {\n const detailsRef = useRef<HTMLDetailsElement | null>(null);\n const choose = (choice?: BrowserLaunchChoice) => {\n detailsRef.current?.removeAttribute(\"open\");\n props.onCreate(choice);\n };\n const restore = async (identity: BrowserIdentity) => {\n if (await props.onRestore(identity)) detailsRef.current?.removeAttribute(\"open\");\n };\n const busy = props.creating || props.mutatingProfile;\n const activeIdentities = props.identities.filter((identity) => identity.status === \"active\");\n const archivedIdentities = props.identities.filter((identity) => identity.status === \"archived\");\n return (\n <details ref={detailsRef} className={cn(\"relative\", props.prominent && \"mt-4 inline-block\")}>\n <summary\n onClick={(event) => {\n if (busy) event.preventDefault();\n }}\n className={cn(\n \"cursor-pointer list-none items-center justify-center gap-1.5 text-og-muted transition hover:bg-og-surface-2 hover:text-og-fg [&::-webkit-details-marker]:hidden\",\n props.prominent\n ? \"inline-flex h-8 rounded-og-sm border border-og-border bg-og-surface-1 px-3 text-og-control font-medium text-og-fg\"\n : \"grid size-7 place-items-center rounded-og-sm\",\n busy && \"pointer-events-none opacity-50\",\n )}\n aria-label=\"New browser\"\n >\n {busy ? (\n <LoaderCircleIcon className=\"size-3.5 animate-spin\" />\n ) : (\n <PlusIcon className=\"size-3.5\" />\n )}\n {props.prominent ? \"New browser\" : null}\n {props.prominent ? <ChevronDownIcon className=\"size-3\" /> : null}\n </summary>\n <div\n className={cn(\n \"absolute z-40 w-72 overflow-hidden rounded-og-md border border-og-border bg-og-surface-1 p-1 text-left shadow-xl\",\n props.prominent ? \"left-1/2 top-10 -translate-x-1/2\" : \"right-0 top-8\",\n )}\n >\n {props.attachedDevices.length > 0 ? (\n <div className=\"pb-1\">\n <p className=\"px-2 pb-1 pt-1 text-[10px] font-medium uppercase tracking-[0.12em] text-og-subtle\">\n Connected Chrome\n </p>\n {props.attachedDevices.map((device) => (\n <button\n key={device.id}\n type=\"button\"\n onClick={() => choose({ kind: \"attached\", device })}\n className=\"flex w-full items-center gap-2 rounded-og-sm px-2 py-2 text-left transition hover:bg-og-surface-2\"\n >\n <MonitorIcon className=\"size-3.5 shrink-0 text-og-muted\" />\n <span className=\"min-w-0 flex-1\">\n <span className=\"block truncate text-og-control text-og-fg\">\n {device.profileLabel ?? device.name}\n </span>\n <span className=\"block truncate text-og-xs text-og-subtle\">\n {device.browserName} · {device.tabCount} open{\" \"}\n {device.tabCount === 1 ? \"tab\" : \"tabs\"}\n </span>\n </span>\n <span className=\"size-1.5 shrink-0 rounded-full bg-og-status-running\" />\n </button>\n ))}\n </div>\n ) : null}\n <p\n className={cn(\n \"px-2 pb-1 pt-1 text-[10px] font-medium uppercase tracking-[0.12em] text-og-subtle\",\n props.attachedDevices.length > 0 && \"border-t border-og-border\",\n )}\n >\n Open isolated browser\n </p>\n <button\n type=\"button\"\n onClick={() => choose({ kind: \"clean\" })}\n className=\"flex w-full items-center gap-2 rounded-og-sm px-2 py-2 text-left transition hover:bg-og-surface-2\"\n >\n <Globe2Icon className=\"size-3.5 text-og-muted\" />\n <span>\n <span className=\"block text-og-control text-og-fg\">Fresh browser</span>\n <span className=\"block text-og-xs text-og-subtle\">Visual browser · no saved state</span>\n </span>\n </button>\n {activeIdentities.length > 0 ? (\n <div className=\"mt-1 border-t border-og-border pt-1\">\n {activeIdentities.map((identity) => (\n <button\n key={identity.id}\n type=\"button\"\n onClick={() => choose({ kind: \"profile\", identityId: identity.id })}\n className=\"flex w-full items-center gap-2 rounded-og-sm px-2 py-2 text-left transition hover:bg-og-surface-2\"\n >\n <UserRoundIcon className=\"size-3.5 text-og-muted\" />\n <span className=\"min-w-0\">\n <span className=\"block truncate text-og-control text-og-fg\">{identity.name}</span>\n <span className=\"block text-og-xs text-og-subtle\">\n {identity.defaultRevisionId\n ? `${identity.revisionCount} saved version${identity.revisionCount === 1 ? \"\" : \"s\"}`\n : \"Ready for first sign-in\"}\n </span>\n </span>\n </button>\n ))}\n </div>\n ) : null}\n {archivedIdentities.length > 0 ? (\n <details className=\"mt-1 border-t border-og-border pt-1\">\n <summary className=\"flex cursor-pointer list-none items-center gap-1.5 rounded-og-sm px-2 py-1.5 text-og-xs text-og-subtle transition hover:bg-og-surface-2 hover:text-og-fg [&::-webkit-details-marker]:hidden\">\n <ArchiveIcon className=\"size-3\" /> Hidden profiles · {archivedIdentities.length}\n <ChevronDownIcon className=\"ml-auto size-3\" />\n </summary>\n {archivedIdentities.map((identity) => (\n <button\n key={identity.id}\n type=\"button\"\n disabled={busy}\n onClick={() => void restore(identity)}\n className=\"flex w-full items-center gap-2 rounded-og-sm px-2 py-2 text-left transition hover:bg-og-surface-2 disabled:opacity-50\"\n >\n <RotateCcwIcon className=\"size-3.5 text-og-muted\" />\n <span className=\"min-w-0 flex-1 truncate text-og-control text-og-fg\">\n Restore {identity.name}\n </span>\n </button>\n ))}\n </details>\n ) : null}\n </div>\n </details>\n );\n}\n\nfunction BrowserProfileMenu(props: {\n session: BrowserSession | null;\n identity: BrowserIdentity | null;\n baseRevisionOrdinal: number | null;\n history: { identityId: string; loading: boolean; revisions: BrowserRevision[] } | null;\n saving: boolean;\n onSave: (newProfileName?: string) => Promise<boolean>;\n onUpdate: (\n identity: BrowserIdentity,\n update: { name?: string; status?: \"active\" | \"archived\"; defaultRevisionId?: string },\n ) => Promise<boolean>;\n}) {\n const detailsRef = useRef<HTMLDetailsElement | null>(null);\n const nameInputId = useId();\n const [name, setName] = useState(\"\");\n const attached = props.session?.placement.kind === \"attached_device\";\n const canSave =\n (props.session?.capabilities.identityPublication ?? false) &&\n props.identity?.status !== \"archived\";\n const revisions =\n props.identity && props.history?.identityId === props.identity.id\n ? [...props.history.revisions].sort((left, right) => right.ordinal - left.ordinal)\n : [];\n const save = async (newProfileName?: string) => {\n if (await props.onSave(newProfileName)) {\n setName(\"\");\n detailsRef.current?.removeAttribute(\"open\");\n }\n };\n const versionLabel = attached\n ? \"live\"\n : props.identity\n ? props.baseRevisionOrdinal\n ? `v${props.baseRevisionOrdinal}`\n : props.session?.baseRevisionId\n ? \"saved\"\n : \"unsaved\"\n : \"temporary\";\n return (\n <details ref={detailsRef} className=\"relative min-w-0\">\n <summary className=\"flex h-7 max-w-40 cursor-pointer list-none items-center gap-1.5 rounded-og-sm px-2 text-og-xs text-og-muted transition hover:bg-og-surface-2 hover:text-og-fg [&::-webkit-details-marker]:hidden\">\n {props.saving ? (\n <LoaderCircleIcon className=\"size-3 animate-spin\" />\n ) : attached ? (\n <MonitorIcon className=\"size-3\" />\n ) : (\n <UserRoundIcon className=\"size-3\" />\n )}\n <span className=\"truncate\">\n {attached ? props.session?.name : (props.identity?.name ?? \"Temporary\")}\n </span>\n {attached || props.identity ? (\n <span className=\"shrink-0 text-og-subtle\">· {versionLabel}</span>\n ) : null}\n <ChevronDownIcon className=\"size-3 shrink-0 text-og-subtle\" />\n </summary>\n <div className=\"absolute right-0 top-8 z-40 w-72 rounded-og-md border border-og-border bg-og-surface-1 p-3 shadow-xl\">\n <div className=\"flex items-start gap-2\">\n <span className=\"grid size-7 shrink-0 place-items-center rounded-og-sm bg-og-surface-2 text-og-muted\">\n {attached ? (\n <MonitorIcon className=\"size-3.5\" />\n ) : (\n <UserRoundIcon className=\"size-3.5\" />\n )}\n </span>\n <div className=\"min-w-0\">\n <p className=\"truncate text-og-control font-medium text-og-fg\">\n {attached ? props.session?.name : (props.identity?.name ?? \"Temporary browser\")}\n </p>\n <p className=\"mt-0.5 text-og-xs leading-4 text-og-subtle\">\n {attached\n ? \"This session drives the existing Chrome profile and its current login state.\"\n : props.identity?.status === \"archived\"\n ? \"Hidden from new browsers. This already-open browser is unchanged.\"\n : props.identity\n ? props.baseRevisionOrdinal\n ? `Started from version ${props.baseRevisionOrdinal}.`\n : \"Not saved yet.\"\n : \"This browser is not reusable yet.\"}\n </p>\n </div>\n </div>\n {props.identity && revisions.length > 0 ? (\n <div className=\"mt-3 border-t border-og-border pt-2\">\n <p className=\"px-1 text-[10px] font-medium uppercase tracking-[0.12em] text-og-subtle\">\n Saved versions\n </p>\n <div className=\"mt-1 max-h-40 overflow-y-auto\">\n {revisions.map((revision) => {\n const isDefault = revision.id === props.identity?.defaultRevisionId;\n const isCurrent = revision.ordinal === props.baseRevisionOrdinal;\n return (\n <button\n key={revision.id}\n type=\"button\"\n disabled={isDefault || props.saving || props.identity?.status === \"archived\"}\n onClick={() =>\n void props.onUpdate(props.identity!, { defaultRevisionId: revision.id })\n }\n className=\"flex w-full items-center gap-2 rounded-og-sm px-2 py-1.5 text-left transition hover:bg-og-surface-2 disabled:cursor-default disabled:opacity-70\"\n >\n <span className=\"grid size-4 place-items-center text-og-muted\">\n {isDefault ? <CheckIcon className=\"size-3.5 text-og-status-running\" /> : null}\n </span>\n <span className=\"min-w-0 flex-1 text-og-control text-og-fg\">\n Version {revision.ordinal}\n </span>\n <span className=\"text-[10px] text-og-subtle\">\n {isCurrent && isDefault\n ? \"current · default\"\n : isDefault\n ? \"default\"\n : isCurrent\n ? \"current · Use by default\"\n : \"Use by default\"}\n </span>\n </button>\n );\n })}\n </div>\n <p className=\"mt-1 px-2 text-[10px] leading-4 text-og-subtle\">\n Changing the default affects only browsers opened later.\n </p>\n </div>\n ) : props.identity &&\n props.history?.identityId === props.identity.id &&\n props.history.loading ? (\n <p className=\"mt-3 flex items-center gap-1.5 border-t border-og-border px-2 pt-2 text-og-xs text-og-subtle\">\n <LoaderCircleIcon className=\"size-3 animate-spin\" /> Loading saved versions…\n </p>\n ) : null}\n {canSave ? (\n props.identity ? (\n <button\n type=\"button\"\n onClick={() => void save()}\n disabled={props.saving}\n className=\"mt-3 flex h-8 w-full items-center justify-center gap-1.5 rounded-og-sm border border-og-border bg-og-surface-2 px-3 text-og-control font-medium text-og-fg transition hover:bg-og-surface-3 disabled:opacity-50\"\n >\n {props.saving ? (\n <LoaderCircleIcon className=\"size-3.5 animate-spin\" />\n ) : (\n <SaveIcon className=\"size-3.5\" />\n )}\n {props.saving ? \"Saving browser version…\" : \"Save new version\"}\n </button>\n ) : (\n <form\n className=\"mt-3\"\n onSubmit={(event) => {\n event.preventDefault();\n if (name.trim()) void save(name);\n }}\n >\n <label className=\"text-og-xs font-medium text-og-muted\" htmlFor={nameInputId}>\n Profile name\n </label>\n <div className=\"mt-1 flex gap-1.5\">\n <input\n id={nameInputId}\n value={name}\n onInput={(event) => setName(event.currentTarget.value)}\n maxLength={200}\n placeholder=\"Work\"\n className=\"h-8 min-w-0 flex-1 rounded-og-sm border border-og-border bg-og-bg px-2 text-og-control text-og-fg placeholder:text-og-subtle focus:border-og-accent focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-og-accent\"\n />\n <button\n type=\"submit\"\n disabled={!name.trim() || props.saving}\n className=\"inline-flex h-8 items-center gap-1 rounded-og-sm bg-og-accent px-2.5 text-og-control font-medium text-white transition hover:opacity-90 disabled:opacity-40\"\n >\n {props.saving ? (\n <LoaderCircleIcon className=\"size-3.5 animate-spin\" />\n ) : (\n <SaveIcon className=\"size-3.5\" />\n )}\n Save\n </button>\n </div>\n </form>\n )\n ) : (\n <p className=\"mt-3 rounded-og-sm bg-og-surface-2 px-2.5 py-2 text-og-xs text-og-subtle\">\n {attached\n ? \"Chrome keeps this profile's state directly; OpenGeni does not copy it automatically.\"\n : props.identity?.status === \"archived\"\n ? \"Restore this profile before saving another version.\"\n : \"This browser cannot save reusable profile state.\"}\n </p>\n )}\n {!attached && props.identity ? (\n <button\n type=\"button\"\n disabled={props.saving}\n onClick={() =>\n void props.onUpdate(props.identity!, {\n status: props.identity!.status === \"active\" ? \"archived\" : \"active\",\n })\n }\n className=\"mt-2 flex h-8 w-full items-center justify-center gap-1.5 rounded-og-sm px-3 text-og-control text-og-muted transition hover:bg-og-surface-2 hover:text-og-fg disabled:opacity-50\"\n >\n {props.identity.status === \"active\" ? (\n <ArchiveIcon className=\"size-3.5\" />\n ) : (\n <RotateCcwIcon className=\"size-3.5\" />\n )}\n {props.identity.status === \"active\" ? \"Hide from new browsers\" : \"Restore profile\"}\n </button>\n ) : null}\n {canSave ? (\n <p className=\"mt-2 text-[10px] leading-4 text-og-subtle\">\n Saving briefly restarts this browser. Other open browsers are unchanged.\n </p>\n ) : null}\n </div>\n </details>\n );\n}\n\nfunction MenuButton(props: { children: ReactNode; onClick: () => void; disabled?: boolean }) {\n return (\n <button\n type=\"button\"\n onClick={props.onClick}\n disabled={props.disabled}\n className=\"flex h-7 flex-1 items-center justify-center gap-1 rounded-og-sm px-2 text-og-control text-og-muted transition hover:bg-og-surface-2 hover:text-og-fg disabled:opacity-50\"\n >\n {props.children}\n </button>\n );\n}\n\nfunction BrowserTabs(props: {\n targets: BrowserTarget[];\n selectedTargetId: string | null;\n mutating: boolean;\n tabControl: boolean;\n onSelect: (id: string) => void;\n onClose: (id: string) => void;\n onOpen: () => void;\n}) {\n const pages = props.targets.filter((target) => target.kind === \"page\" || target.kind === \"popup\");\n return (\n <div className=\"flex h-9 shrink-0 items-end gap-px overflow-x-auto border-b border-og-border bg-og-surface-0 px-1 pt-1\">\n {pages.map((target) => (\n <div\n key={target.id}\n className={cn(\n \"group flex h-8 min-w-24 max-w-48 items-center rounded-t-og-sm border border-b-0 border-transparent px-2\",\n target.id === props.selectedTargetId\n ? \"border-og-border bg-og-bg text-og-fg\"\n : \"text-og-muted hover:bg-og-surface-1\",\n )}\n >\n <button\n type=\"button\"\n onClick={() => props.onSelect(target.id)}\n className=\"min-w-0 flex-1 truncate text-left text-og-control\"\n >\n {target.title || shortUrl(target.url)}\n </button>\n {props.tabControl ? (\n <button\n type=\"button\"\n onClick={() => props.onClose(target.id)}\n disabled={props.mutating}\n className=\"ml-1 grid size-4 shrink-0 place-items-center rounded opacity-0 transition hover:bg-og-surface-3 group-hover:opacity-100 focus:opacity-100 disabled:opacity-30\"\n aria-label={`Close ${target.title || \"tab\"}`}\n >\n <XIcon className=\"size-3\" />\n </button>\n ) : null}\n </div>\n ))}\n {props.tabControl ? (\n <button\n type=\"button\"\n onClick={props.onOpen}\n disabled={props.mutating}\n className=\"mb-1 grid size-6 shrink-0 place-items-center rounded-og-sm text-og-muted transition hover:bg-og-surface-2 hover:text-og-fg disabled:opacity-40\"\n aria-label=\"New tab\"\n >\n <PlusIcon className=\"size-3.5\" />\n </button>\n ) : null}\n </div>\n );\n}\n\nfunction BrowserAddressBar(props: {\n target: BrowserTarget | null;\n loading: boolean;\n onNavigate: (url: string) => void;\n onReload: () => void;\n}) {\n const [draft, setDraft] = useState(props.target?.url ?? \"\");\n const focusedRef = useRef(false);\n useEffect(() => {\n if (!focusedRef.current) setDraft(props.target?.url ?? \"\");\n }, [props.target?.id, props.target?.url]);\n const submit = (event: FormEvent) => {\n event.preventDefault();\n const normalized = normalizeBrowserAddress(draft);\n if (normalized) props.onNavigate(normalized);\n };\n return (\n <form\n onSubmit={submit}\n className=\"flex h-10 shrink-0 items-center gap-1.5 border-b border-og-border bg-og-bg px-2\"\n >\n <button\n type=\"button\"\n onClick={props.onReload}\n disabled={!props.target || props.loading}\n className=\"grid size-7 place-items-center rounded-og-sm text-og-muted transition hover:bg-og-surface-2 hover:text-og-fg disabled:opacity-35\"\n aria-label=\"Reload\"\n >\n <RefreshCwIcon className={cn(\"size-3.5\", props.loading && \"animate-spin\")} />\n </button>\n <div className=\"flex h-7 min-w-0 flex-1 items-center gap-2 rounded-og-sm border border-og-border bg-og-surface-0 px-2 focus-within:border-og-accent/60\">\n <Globe2Icon className=\"size-3 shrink-0 text-og-subtle\" />\n <input\n value={draft}\n onChange={(event) => setDraft(event.target.value)}\n onFocus={() => {\n focusedRef.current = true;\n }}\n onBlur={() => {\n focusedRef.current = false;\n }}\n onKeyDown={(event) => {\n if (event.key !== \"Enter\") return;\n event.preventDefault();\n const normalized = normalizeBrowserAddress(draft);\n if (normalized) props.onNavigate(normalized);\n }}\n disabled={!props.target}\n className=\"min-w-0 flex-1 bg-transparent text-og-control text-og-fg placeholder:text-og-subtle focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-og-accent disabled:opacity-50\"\n aria-label=\"Address\"\n spellCheck={false}\n placeholder=\"Search or enter address\"\n />\n </div>\n </form>\n );\n}\n\nfunction BrowserViewport(props: {\n frame: BrowserFrame | null;\n connectionState: string;\n supportsLiveFrames: boolean;\n connectionError: Error | null;\n observation: ReturnType<typeof useBrowserSession>[\"observation\"];\n mutating: boolean;\n clipboardEnabled: boolean;\n activityLabel?: string | undefined;\n onAction: (action: BrowserAction, frame: BrowserFrame | null) => Promise<BrowserActionReceipt>;\n onReadClipboard: () => Promise<{ text: string }>;\n onReconnect: () => void;\n onError: (cause: unknown) => void;\n}) {\n const canvasRef = useRef<HTMLCanvasElement | null>(null);\n const inputRef = useRef<HTMLTextAreaElement | null>(null);\n const composingRef = useRef(false);\n const pointerStartRef = useRef<PointerStart | null>(null);\n const lastClickRef = useRef<{\n at: number;\n x: number;\n y: number;\n frame: BrowserFrame;\n } | null>(null);\n const wheelRef = useRef<{\n x: number;\n y: number;\n deltaX: number;\n deltaY: number;\n frame: BrowserFrame;\n timer: ReturnType<typeof setTimeout> | null;\n } | null>(null);\n const pendingTextRef = useRef<{\n text: string;\n frame: BrowserFrame | null;\n timer: ReturnType<typeof setTimeout>;\n } | null>(null);\n const actionRef = useRef(props.onAction);\n const readClipboardRef = useRef(props.onReadClipboard);\n const errorRef = useRef(props.onError);\n const actionTailRef = useRef<Promise<void>>(Promise.resolve());\n const queuedFrameRef = useRef<BrowserFrame | null>(null);\n const decodingFrameRef = useRef(false);\n const mountedRef = useRef(true);\n actionRef.current = props.onAction;\n readClipboardRef.current = props.onReadClipboard;\n errorRef.current = props.onError;\n\n const paintQueuedFrames = useCallback(() => {\n if (decodingFrameRef.current) return;\n decodingFrameRef.current = true;\n void (async () => {\n try {\n while (mountedRef.current) {\n const frame = queuedFrameRef.current;\n queuedFrameRef.current = null;\n if (!frame) break;\n\n let objectUrl: string | null = null;\n try {\n const blob = new Blob([frame.data.slice().buffer], {\n type: frame.mediaType,\n });\n if (typeof createImageBitmap === \"function\") {\n const bitmap = await createImageBitmap(blob);\n try {\n const canvas = canvasRef.current;\n if (mountedRef.current && canvas) {\n paintCanvas(canvas, bitmap, frame.width, frame.height);\n }\n } finally {\n bitmap.close();\n }\n continue;\n }\n objectUrl = URL.createObjectURL(blob);\n const image = await loadImage(objectUrl);\n const canvas = canvasRef.current;\n if (mountedRef.current && canvas) {\n paintCanvas(canvas, image, frame.width, frame.height);\n }\n } catch (cause) {\n if (mountedRef.current) errorRef.current(cause);\n } finally {\n if (objectUrl) URL.revokeObjectURL(objectUrl);\n }\n }\n } finally {\n decodingFrameRef.current = false;\n if (mountedRef.current && queuedFrameRef.current) paintQueuedFrames();\n }\n })();\n }, []);\n\n useEffect(() => {\n mountedRef.current = true;\n return () => {\n mountedRef.current = false;\n queuedFrameRef.current = null;\n };\n }, []);\n\n useEffect(() => {\n if (!props.frame) return;\n queuedFrameRef.current = props.frame;\n paintQueuedFrames();\n }, [paintQueuedFrames, props.frame]);\n\n useEffect(\n () => () => {\n if (wheelRef.current?.timer) clearTimeout(wheelRef.current.timer);\n if (pendingTextRef.current?.timer) clearTimeout(pendingTextRef.current.timer);\n },\n [],\n );\n\n const enqueue = useCallback(\n (\n action: BrowserAction,\n frame: BrowserFrame | null,\n after?: (receipt: BrowserActionReceipt) => Promise<void>,\n ) => {\n actionTailRef.current = actionTailRef.current\n .catch(() => undefined)\n .then(async () => {\n const receipt = await actionRef.current(action, frame);\n await after?.(receipt);\n })\n .catch((cause) => errorRef.current(cause));\n },\n [],\n );\n\n const point = useCallback(\n (frame: BrowserFrame, clientX: number, clientY: number) =>\n browserPoint(canvasRef.current, frame, clientX, clientY),\n [],\n );\n\n const flushPendingText = useCallback(() => {\n const pending = pendingTextRef.current;\n if (!pending) return;\n clearTimeout(pending.timer);\n pendingTextRef.current = null;\n enqueue({ type: \"type\", text: pending.text }, pending.frame);\n }, [enqueue]);\n\n const flushPendingClick = useCallback(() => {\n lastClickRef.current = null;\n }, []);\n\n const pointerDown = (event: PointerEvent<HTMLCanvasElement>) => {\n if (!props.frame || event.button !== 0) return;\n // Keep the hidden keyboard sink focused after the browser performs the\n // pointerdown default action for the canvas. Without preventing that\n // default, Chrome immediately moves focus back to the document and all\n // subsequent typing/paste is silently lost.\n event.preventDefault();\n flushPendingText();\n pointerStartRef.current = {\n x: event.clientX,\n y: event.clientY,\n pointerId: event.pointerId,\n frame: props.frame,\n };\n event.currentTarget.setPointerCapture?.(event.pointerId);\n inputRef.current?.focus({ preventScroll: true });\n };\n\n const pointerUp = (event: PointerEvent<HTMLCanvasElement>) => {\n const start = pointerStartRef.current;\n pointerStartRef.current = null;\n if (!start || start.pointerId !== event.pointerId) return;\n const from = point(start.frame, start.x, start.y);\n const to = point(start.frame, event.clientX, event.clientY);\n if (!from || !to) return;\n if (Math.hypot(event.clientX - start.x, event.clientY - start.y) > 5) {\n flushPendingClick();\n enqueue(\n {\n type: \"pointer\",\n action: \"drag\",\n x: from.x,\n y: from.y,\n endX: to.x,\n endY: to.y,\n },\n start.frame,\n );\n return;\n }\n const now = Date.now();\n const previous = lastClickRef.current;\n if (\n previous &&\n now - previous.at < 280 &&\n Math.hypot(previous.x - to.x, previous.y - to.y) < 6 &&\n sameFrameFence(previous.frame, start.frame)\n ) {\n lastClickRef.current = null;\n // The first click was already dispatched immediately. Tell CDP this is\n // the continuation (clickCount=2), so the page receives a true dblclick\n // without making every ordinary click wait for the double-click window.\n enqueue({ type: \"pointer\", action: \"click\", clickCount: 2, x: to.x, y: to.y }, start.frame);\n return;\n }\n lastClickRef.current = { at: now, x: to.x, y: to.y, frame: start.frame };\n enqueue({ type: \"pointer\", action: \"click\", x: to.x, y: to.y }, start.frame);\n };\n\n const contextMenu = (event: MouseEvent<HTMLCanvasElement>) => {\n event.preventDefault();\n const frame = props.frame;\n if (!frame) return;\n flushPendingText();\n flushPendingClick();\n const at = point(frame, event.clientX, event.clientY);\n if (at) enqueue({ type: \"pointer\", action: \"click\", x: at.x, y: at.y, button: \"right\" }, frame);\n };\n\n const wheel = (event: WheelEvent<HTMLCanvasElement>) => {\n const frame = props.frame;\n if (!frame) return;\n const at = point(frame, event.clientX, event.clientY);\n if (!at) return;\n flushPendingText();\n flushPendingClick();\n event.preventDefault();\n const pending = wheelRef.current;\n if (pending?.timer) clearTimeout(pending.timer);\n wheelRef.current = {\n x: at.x,\n y: at.y,\n deltaX: (pending && sameFrameFence(pending.frame, frame) ? pending.deltaX : 0) + event.deltaX,\n deltaY: (pending && sameFrameFence(pending.frame, frame) ? pending.deltaY : 0) + event.deltaY,\n frame,\n timer: setTimeout(() => {\n const batch = wheelRef.current;\n wheelRef.current = null;\n if (batch)\n enqueue(\n {\n type: \"pointer\",\n action: \"scroll\",\n x: batch.x,\n y: batch.y,\n deltaX: batch.deltaX,\n deltaY: batch.deltaY,\n },\n batch.frame,\n );\n }, 45),\n };\n };\n\n const keyDown = (event: KeyboardEvent<HTMLTextAreaElement>) => {\n const command = event.metaKey || event.ctrlKey;\n if (\n props.clipboardEnabled &&\n command &&\n !event.altKey &&\n [\"c\", \"v\"].includes(event.key.toLowerCase())\n ) {\n flushPendingText();\n return;\n }\n const key = browserKey(event);\n if (!key) return;\n event.preventDefault();\n flushPendingText();\n flushPendingClick();\n enqueue({ type: \"press\", key }, props.frame);\n };\n\n const copy = (event: ClipboardEvent<HTMLTextAreaElement>) => {\n if (!props.clipboardEnabled) return;\n event.preventDefault();\n flushPendingText();\n flushPendingClick();\n enqueue({ type: \"clipboard\", operation: \"copy\" }, props.frame, async () => {\n const clipboard = await readClipboardRef.current();\n if (clipboard.text.length === 0) return;\n if (!(await copyTextToClipboard(clipboard.text))) {\n throw new Error(\"Browser text could not be copied to the local clipboard\");\n }\n });\n };\n\n const paste = (event: ClipboardEvent<HTMLTextAreaElement>) => {\n if (!props.clipboardEnabled) return;\n event.preventDefault();\n flushPendingText();\n flushPendingClick();\n enqueue(\n {\n type: \"clipboard\",\n operation: \"paste\",\n text: event.clipboardData.getData(\"text/plain\"),\n },\n props.frame,\n );\n };\n\n const input = (value: string, nativeComposing = false) => {\n if (composingRef.current || nativeComposing) return;\n if (!value) return;\n flushPendingClick();\n const pending = pendingTextRef.current;\n if (pending && sameOptionalBrowserFrame(pending.frame, props.frame)) {\n clearTimeout(pending.timer);\n pending.text += value;\n pending.timer = setTimeout(flushPendingText, 16);\n } else {\n flushPendingText();\n pendingTextRef.current = {\n text: value,\n frame: props.frame,\n timer: setTimeout(flushPendingText, 16),\n };\n }\n if (inputRef.current) inputRef.current.value = \"\";\n };\n\n const compositionStart = () => {\n composingRef.current = true;\n };\n\n const compositionEnd = (event: CompositionEvent<HTMLTextAreaElement>) => {\n composingRef.current = false;\n input(event.currentTarget.value || event.data);\n };\n\n const showCanvas = props.frame !== null;\n return (\n <div className=\"relative min-h-0 flex-1 overflow-hidden bg-black\">\n <canvas\n ref={canvasRef}\n className={cn(\n \"absolute inset-0 m-auto max-h-full max-w-full touch-none focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-og-accent\",\n !showCanvas && \"invisible\",\n )}\n onPointerDown={pointerDown}\n onPointerUp={pointerUp}\n onPointerCancel={() => {\n pointerStartRef.current = null;\n }}\n onContextMenu={contextMenu}\n onWheel={wheel}\n aria-label=\"Interactive browser page\"\n />\n <textarea\n ref={inputRef}\n defaultValue=\"\"\n onInput={(event) =>\n input(event.currentTarget.value, (event.nativeEvent as InputEvent).isComposing)\n }\n onCompositionStart={compositionStart}\n onCompositionEnd={compositionEnd}\n onKeyDown={keyDown}\n onCopy={copy}\n onPaste={paste}\n className=\"pointer-events-none absolute left-1/2 top-1/2 size-px resize-none overflow-hidden opacity-0\"\n aria-label=\"Browser keyboard input\"\n autoCapitalize=\"off\"\n autoCorrect=\"off\"\n spellCheck={false}\n />\n {!showCanvas ? (\n <SemanticBrowserFallback\n observation={props.observation}\n connectionState={props.connectionState}\n supportsLiveFrames={props.supportsLiveFrames}\n error={props.connectionError}\n onAction={(action) => enqueue(action, null)}\n onReconnect={props.onReconnect}\n />\n ) : null}\n {props.mutating ? (\n <div className=\"pointer-events-none absolute right-3 top-3 flex items-center gap-1.5 rounded-full border border-white/10 bg-black/65 px-2.5 py-1 text-[11px] text-white/80 backdrop-blur\">\n <LoaderCircleIcon className=\"size-3 animate-spin\" /> {props.activityLabel ?? \"Acting\"}\n </div>\n ) : null}\n </div>\n );\n}\n\nfunction SemanticBrowserFallback(props: {\n observation: ReturnType<typeof useBrowserSession>[\"observation\"];\n connectionState: string;\n supportsLiveFrames: boolean;\n error: Error | null;\n onAction: (action: BrowserAction) => void;\n onReconnect: () => void;\n}) {\n const nodes = semanticNodes(\n props.observation?.semantic?.kind === \"snapshot\" ? props.observation.semantic.roots : [],\n );\n const interactive = nodes.filter((node) => node.actions.includes(\"click\")).slice(0, 8);\n return (\n <div className=\"absolute inset-0 grid place-items-center bg-og-bg p-6\">\n <div className=\"w-full max-w-md rounded-og-lg border border-og-border bg-og-surface-0 p-4 shadow-lg\">\n <div className=\"flex items-center gap-2\">\n {props.error ? (\n <CircleAlertIcon className=\"size-4 text-og-status-error\" />\n ) : !props.supportsLiveFrames ? (\n <ZapIcon className=\"size-4 text-og-muted\" />\n ) : (\n <LoaderCircleIcon className=\"size-4 animate-spin text-og-muted\" />\n )}\n <p className=\"text-og-menu font-medium text-og-fg\">\n {props.error\n ? \"Live view disconnected\"\n : props.supportsLiveFrames\n ? browserConnectionLabel(props.connectionState)\n : \"Semantic browser\"}\n </p>\n </div>\n {interactive.length > 0 ? (\n <div className=\"mt-3 border-t border-og-border pt-3\">\n <p className=\"mb-2 text-og-xs text-og-subtle\">\n {props.supportsLiveFrames\n ? \"Page controls remain available\"\n : \"Available page controls\"}\n </p>\n <div className=\"flex flex-wrap gap-1.5\">\n {interactive.map((node) => (\n <button\n key={node.ref}\n type=\"button\"\n onClick={() =>\n props.onAction({\n type: \"click\",\n locator: { kind: \"ref\", ref: node.ref },\n })\n }\n className=\"rounded-og-sm border border-og-border bg-og-surface-1 px-2 py-1 text-og-control text-og-fg transition hover:bg-og-surface-2\"\n >\n {node.name || node.role}\n </button>\n ))}\n </div>\n </div>\n ) : null}\n {props.error && props.supportsLiveFrames ? (\n <button\n type=\"button\"\n onClick={props.onReconnect}\n className=\"mt-3 text-og-control font-medium text-og-accent hover:underline\"\n >\n Reconnect\n </button>\n ) : null}\n </div>\n </div>\n );\n}\n\nfunction BrowserStatusBar(props: {\n session: BrowserSession | null;\n profile: BrowserIdentity | null;\n target: BrowserTarget | null;\n observation: ReturnType<typeof useBrowserSession>[\"observation\"];\n connectionState: string;\n refreshing: boolean;\n diagnosticsOpen: boolean;\n onOpenComputer?: (() => void) | undefined;\n onDiagnostics: () => void;\n}) {\n const errors =\n (props.observation?.diagnostics.consoleErrorCount ?? 0) +\n (props.observation?.diagnostics.pageErrorCount ?? 0);\n const failed = props.observation?.diagnostics.failedRequestCount ?? 0;\n return (\n <div className=\"flex h-7 shrink-0 items-center gap-2 border-t border-og-border bg-og-surface-0 px-2 text-og-xs text-og-subtle\">\n <span\n className={cn(\n \"size-1.5 rounded-full\",\n props.connectionState === \"live\" || props.connectionState === \"semantic\"\n ? \"bg-og-status-running\"\n : \"bg-og-muted\",\n )}\n />\n <span>\n {props.connectionState === \"live\"\n ? \"Live\"\n : props.connectionState === \"semantic\"\n ? \"Semantic\"\n : browserConnectionLabel(props.connectionState)}\n </span>\n <span>{props.profile?.name ?? \"Temporary browser\"}</span>\n <span className=\"min-w-0 flex-1 truncate\">{props.target?.title}</span>\n {props.refreshing ? <LoaderCircleIcon className=\"size-3 animate-spin\" /> : null}\n {props.onOpenComputer ? (\n <button\n type=\"button\"\n onClick={props.onOpenComputer}\n className=\"flex items-center gap-1 rounded px-1.5 py-0.5 transition hover:bg-og-surface-2 hover:text-og-fg\"\n aria-label=\"Open this browser window in Computer\"\n >\n <MonitorIcon className=\"size-3\" />\n Computer\n </button>\n ) : null}\n <button\n type=\"button\"\n onClick={props.onDiagnostics}\n aria-expanded={props.diagnosticsOpen}\n aria-controls=\"browser-diagnostics-drawer\"\n className={cn(\n \"flex items-center gap-1 rounded px-1.5 py-0.5 transition hover:bg-og-surface-2 hover:text-og-fg\",\n props.diagnosticsOpen && \"bg-og-surface-2 text-og-fg\",\n )}\n >\n <BugIcon className=\"size-3\" />\n {errors + failed > 0 ? errors + failed : \"Debug\"}\n </button>\n </div>\n );\n}\n\nfunction BrowserDiagnosticsDrawer(props: {\n session: BrowserSession | null;\n profile: BrowserIdentity | null;\n target: BrowserTarget | null;\n observation: BrowserObservation | null;\n baseRevisionOrdinal: number | null;\n state: BrowserDiagnosticsView;\n downloads: BrowserDownload[];\n downloadsEnabled: boolean;\n downloadsLoading: boolean;\n downloadsRefreshing: boolean;\n downloadsError: Error | null;\n savingDownloadIds: string[];\n onSaveDownload: (\n downloadId: string,\n destinationPath: string,\n overwrite: boolean,\n ) => Promise<BrowserDownloadSaveResponse>;\n onRefreshDownloads: () => void;\n onRefresh: () => void;\n onClose: () => void;\n}) {\n const session = props.session;\n const diagnostics = props.observation?.diagnostics;\n const semanticMode = props.observation?.semantic\n ? \"Semantic page structure available\"\n : props.observation?.screenshot\n ? \"Visual fallback in use\"\n : \"Waiting for page observation\";\n return (\n <aside\n id=\"browser-diagnostics-drawer\"\n role=\"region\"\n aria-label=\"Browser diagnostics\"\n className=\"absolute bottom-7 right-0 top-10 z-40 flex w-full max-w-md flex-col border-l border-og-border bg-og-surface-0 shadow-2xl\"\n >\n <div className=\"flex h-11 shrink-0 items-center gap-2 border-b border-og-border px-3\">\n <BugIcon className=\"size-4 text-og-muted\" />\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-og-control font-semibold text-og-fg\">Browser diagnostics</p>\n <p className=\"truncate text-og-xs text-og-subtle\">\n {props.target?.title || shortUrl(props.target?.url ?? \"\") || \"Current tab\"}\n </p>\n </div>\n <button\n type=\"button\"\n onClick={props.onRefresh}\n disabled={props.state.loading}\n className=\"grid size-7 place-items-center rounded-og-sm text-og-muted transition hover:bg-og-surface-2 hover:text-og-fg disabled:opacity-40\"\n aria-label=\"Refresh browser diagnostics\"\n >\n <RefreshCwIcon className={cn(\"size-3.5\", props.state.loading && \"animate-spin\")} />\n </button>\n <button\n type=\"button\"\n onClick={props.onClose}\n className=\"grid size-7 place-items-center rounded-og-sm text-og-muted transition hover:bg-og-surface-2 hover:text-og-fg\"\n aria-label=\"Close browser diagnostics\"\n >\n <XIcon className=\"size-3.5\" />\n </button>\n </div>\n\n <div className=\"min-h-0 flex-1 overflow-y-auto\">\n <section className=\"border-b border-og-border p-3\" aria-labelledby=\"browser-runtime-title\">\n <h3\n id=\"browser-runtime-title\"\n className=\"text-[10px] font-semibold uppercase tracking-[0.14em] text-og-subtle\"\n >\n Runtime\n </h3>\n <dl className=\"mt-2 grid grid-cols-[7rem_minmax(0,1fr)] gap-x-3 gap-y-1.5 text-og-xs\">\n <DiagnosticFact label=\"Engine\" value={browserEngineLabel(session)} />\n <DiagnosticFact label=\"Driver\" value={session?.driverId ?? \"Unavailable\"} />\n <DiagnosticFact label=\"Placement\" value={placementLabel(session ?? undefined)} />\n <DiagnosticFact\n label=\"Profile\"\n value={\n props.profile\n ? `${props.profile.name}${props.baseRevisionOrdinal ? ` · v${props.baseRevisionOrdinal}` : \"\"}`\n : \"Temporary\"\n }\n />\n <DiagnosticFact\n label=\"Controller\"\n value={shortGeneration(session?.controller?.controllerGeneration)}\n />\n <DiagnosticFact\n label=\"Network\"\n value={session?.networkRouteId ? \"Custom route\" : \"Placement default\"}\n />\n <DiagnosticFact label=\"Observation\" value={semanticMode} />\n </dl>\n </section>\n\n <section className=\"border-b border-og-border p-3\" aria-labelledby=\"browser-page-title\">\n <h3\n id=\"browser-page-title\"\n className=\"text-[10px] font-semibold uppercase tracking-[0.14em] text-og-subtle\"\n >\n Current page\n </h3>\n <dl className=\"mt-2 grid grid-cols-2 gap-2\">\n <DiagnosticCount label=\"Console errors\" value={diagnostics?.consoleErrorCount ?? 0} />\n <DiagnosticCount label=\"Page errors\" value={diagnostics?.pageErrorCount ?? 0} />\n <DiagnosticCount label=\"Failed requests\" value={diagnostics?.failedRequestCount ?? 0} />\n <DiagnosticCount label=\"Downloads\" value={diagnostics?.downloadCount ?? 0} />\n </dl>\n {session?.failureCode ? (\n <p className=\"mt-2 rounded-og-sm border border-og-status-error/30 bg-og-status-error/5 px-2.5 py-2 text-og-xs text-og-status-error\">\n Browser state: {session.failureCode}\n </p>\n ) : null}\n </section>\n\n {props.downloadsEnabled ? (\n <BrowserDownloadsPanel\n downloads={props.downloads}\n loading={props.downloadsLoading}\n refreshing={props.downloadsRefreshing}\n error={props.downloadsError}\n savingDownloadIds={props.savingDownloadIds}\n onSave={props.onSaveDownload}\n onRefresh={props.onRefreshDownloads}\n />\n ) : null}\n\n <section className=\"p-3\" aria-labelledby=\"browser-events-title\">\n <div className=\"flex items-center justify-between gap-2\">\n <h3\n id=\"browser-events-title\"\n className=\"text-[10px] font-semibold uppercase tracking-[0.14em] text-og-subtle\"\n >\n Recent events\n </h3>\n {props.state.batch?.truncated ? (\n <span className=\"text-[10px] text-og-subtle\">Newest 100</span>\n ) : null}\n </div>\n {props.state.loading && !props.state.batch ? (\n <div className=\"flex items-center gap-2 py-6 text-og-control text-og-muted\">\n <LoaderCircleIcon className=\"size-3.5 animate-spin\" /> Loading diagnostics…\n </div>\n ) : props.state.error ? (\n <div className=\"py-5\">\n <p className=\"text-og-control text-og-status-error\">{props.state.error.message}</p>\n <button\n type=\"button\"\n onClick={props.onRefresh}\n className=\"mt-2 text-og-control font-medium text-og-accent hover:underline\"\n >\n Try again\n </button>\n </div>\n ) : props.state.batch?.entries.length ? (\n <ol className=\"mt-2 space-y-2\">\n {props.state.batch.entries.map((entry) => (\n <li\n key={entry.sequence}\n className=\"rounded-og-sm border border-og-border bg-og-bg p-2.5\"\n >\n <div className=\"flex items-center gap-2 text-[10px] text-og-subtle\">\n <span\n className={cn(\n \"font-semibold uppercase tracking-wide\",\n diagnosticTone(entry.level),\n )}\n >\n {diagnosticKindLabel(entry.kind)}\n </span>\n <span className=\"ml-auto\">{formatDiagnosticTime(entry.occurredAt)}</span>\n </div>\n <p className=\"mt-1 whitespace-pre-wrap break-words text-og-xs leading-5 text-og-fg\">\n {entry.message}\n </p>\n {entry.url || entry.filename || entry.method || entry.status ? (\n <p className=\"mt-1 truncate font-og-mono text-[10px] text-og-subtle\">\n {[entry.method, entry.status, entry.filename, entry.url]\n .filter((value) => value !== null)\n .join(\" · \")}\n </p>\n ) : null}\n </li>\n ))}\n </ol>\n ) : (\n <p className=\"py-6 text-og-control text-og-muted\">No diagnostics for this tab.</p>\n )}\n </section>\n </div>\n </aside>\n );\n}\n\nfunction BrowserDownloadsPanel(props: {\n downloads: BrowserDownload[];\n loading: boolean;\n refreshing: boolean;\n error: Error | null;\n savingDownloadIds: string[];\n onSave: (\n downloadId: string,\n destinationPath: string,\n overwrite: boolean,\n ) => Promise<BrowserDownloadSaveResponse>;\n onRefresh: () => void;\n}) {\n const [paths, setPaths] = useState<Record<string, string>>({});\n const [overwrite, setOverwrite] = useState<Record<string, boolean>>({});\n const [savedPaths, setSavedPaths] = useState<Record<string, string>>({});\n const [errors, setErrors] = useState<Record<string, string>>({});\n const saving = useMemo(() => new Set(props.savingDownloadIds), [props.savingDownloadIds]);\n\n const save = (download: BrowserDownload) => {\n const destinationPath = (paths[download.id] ?? defaultDownloadDestination(download)).trim();\n if (!destinationPath || saving.has(download.id)) return;\n setErrors((current) => ({ ...current, [download.id]: \"\" }));\n void props\n .onSave(download.id, destinationPath, overwrite[download.id] ?? false)\n .then((response) => {\n setSavedPaths((current) => ({ ...current, [download.id]: response.destinationPath }));\n })\n .catch((cause) => {\n setErrors((current) => ({\n ...current,\n [download.id]: cause instanceof Error ? cause.message : \"Could not save this download.\",\n }));\n });\n };\n\n return (\n <section className=\"border-b border-og-border p-3\" aria-labelledby=\"browser-downloads-title\">\n <div className=\"flex items-center gap-2\">\n <DownloadIcon className=\"size-3.5 text-og-muted\" />\n <h3\n id=\"browser-downloads-title\"\n className=\"text-[10px] font-semibold uppercase tracking-[0.14em] text-og-subtle\"\n >\n Downloads\n </h3>\n {props.refreshing ? (\n <LoaderCircleIcon className=\"ml-auto size-3 animate-spin text-og-muted\" />\n ) : null}\n </div>\n\n {props.loading ? (\n <div className=\"flex items-center gap-2 py-5 text-og-control text-og-muted\">\n <LoaderCircleIcon className=\"size-3.5 animate-spin\" /> Loading downloads…\n </div>\n ) : props.error ? (\n <div className=\"py-4\">\n <p className=\"text-og-control text-og-status-error\">{props.error.message}</p>\n <button\n type=\"button\"\n onClick={props.onRefresh}\n className=\"mt-2 text-og-control font-medium text-og-accent hover:underline\"\n >\n Try again\n </button>\n </div>\n ) : props.downloads.length === 0 ? (\n <p className=\"py-4 text-og-control text-og-muted\">No files downloaded yet.</p>\n ) : (\n <ol className=\"mt-2 space-y-2\">\n {props.downloads.map((download) => {\n const destinationPath = paths[download.id] ?? defaultDownloadDestination(download);\n const isSaving = saving.has(download.id);\n const isSaved = savedPaths[download.id] === destinationPath;\n return (\n <li\n key={download.id}\n className=\"rounded-og-sm border border-og-border bg-og-bg p-2.5\"\n >\n <div className=\"flex min-w-0 items-start gap-2\">\n <span className=\"mt-0.5 grid size-6 shrink-0 place-items-center rounded bg-og-surface-2 text-og-muted\">\n {isSaved ? (\n <FileCheck2Icon className=\"size-3.5 text-og-status-success\" />\n ) : (\n <DownloadIcon className=\"size-3.5\" />\n )}\n </span>\n <div className=\"min-w-0 flex-1\">\n <p\n className=\"truncate text-og-xs font-medium text-og-fg\"\n title={download.filename}\n >\n {download.filename}\n </p>\n <p className=\"mt-0.5 text-[10px] text-og-subtle\">\n {downloadStatusLabel(download)}\n </p>\n </div>\n </div>\n\n {download.status === \"completed\" ? (\n <div className=\"mt-2\">\n <div className=\"flex gap-1.5\">\n <input\n type=\"text\"\n value={destinationPath}\n onInput={(event) => {\n const value = event.currentTarget.value;\n setPaths((current) => ({ ...current, [download.id]: value }));\n setErrors((current) => ({ ...current, [download.id]: \"\" }));\n }}\n onKeyDown={(event) => {\n if (event.key === \"Enter\") save(download);\n }}\n disabled={isSaving}\n aria-label={`Workspace path for ${download.filename}`}\n className=\"h-7 min-w-0 flex-1 rounded-og-sm border border-og-border bg-og-surface-0 px-2 font-og-mono text-[10px] text-og-fg transition focus:border-og-accent focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-og-accent disabled:opacity-50\"\n />\n <button\n type=\"button\"\n onClick={() => save(download)}\n disabled={\n isSaving ||\n !destinationPath.trim() ||\n (isSaved && !overwrite[download.id])\n }\n className=\"inline-flex h-7 shrink-0 items-center gap-1 rounded-og-sm border border-og-border bg-og-surface-1 px-2 text-[10px] font-medium text-og-fg transition hover:bg-og-surface-2 disabled:opacity-40\"\n >\n {isSaving ? (\n <LoaderCircleIcon className=\"size-3 animate-spin\" />\n ) : (\n <SaveIcon className=\"size-3\" />\n )}\n {isSaving\n ? \"Saving\"\n : isSaved\n ? \"Saved\"\n : overwrite[download.id]\n ? \"Replace\"\n : \"Save\"}\n </button>\n </div>\n <label className=\"mt-1.5 flex w-fit items-center gap-1.5 text-[10px] text-og-subtle\">\n <input\n type=\"checkbox\"\n checked={overwrite[download.id] ?? false}\n onChange={(event) => {\n setOverwrite((current) => ({\n ...current,\n [download.id]: event.currentTarget.checked,\n }));\n setErrors((current) => ({ ...current, [download.id]: \"\" }));\n }}\n disabled={isSaving}\n className=\"size-3 accent-og-accent\"\n />\n Replace an existing workspace file\n </label>\n {errors[download.id] ? (\n <p className=\"mt-1.5 break-words text-[10px] text-og-status-error\">\n {errors[download.id]}\n </p>\n ) : null}\n </div>\n ) : null}\n </li>\n );\n })}\n </ol>\n )}\n </section>\n );\n}\n\nfunction downloadStatusLabel(download: BrowserDownload): string {\n if (download.status === \"completed\") return formatBytes(download.receivedBytes);\n if (download.status === \"in_progress\") {\n const received = formatBytes(download.receivedBytes);\n return download.totalBytes === null\n ? `Downloading · ${received}`\n : `Downloading · ${received} of ${formatBytes(download.totalBytes)}`;\n }\n if (download.status === \"cancelled\") return \"Cancelled\";\n if (download.status === \"unavailable\") return \"No longer available\";\n return \"Download failed\";\n}\n\nfunction defaultDownloadDestination(download: BrowserDownload): string {\n const leaf = download.filename.split(/[\\\\/]/u).at(-1)?.trim() ?? \"\";\n const portable = leaf\n .normalize(\"NFC\")\n .replace(/[<>:\"|?*\\u0000-\\u001f\\u007f]/gu, \"-\")\n .replace(/[ .]+$/u, \"\");\n if (portable.length === 0 || /^(?:con|prn|aux|nul|com[1-9]|lpt[1-9])(?:\\.|$)/iu.test(portable)) {\n return `download-${download.id.slice(0, 8)}`;\n }\n return portable;\n}\n\nfunction DiagnosticFact(props: { label: string; value: string }) {\n return (\n <>\n <dt className=\"text-og-subtle\">{props.label}</dt>\n <dd className=\"min-w-0 truncate text-og-fg\" title={props.value}>\n {props.value}\n </dd>\n </>\n );\n}\n\nfunction DiagnosticCount(props: { label: string; value: number }) {\n return (\n <div className=\"rounded-og-sm border border-og-border bg-og-bg px-2.5 py-2\">\n <dt className=\"text-[10px] text-og-subtle\">{props.label}</dt>\n <dd\n className={cn(\n \"mt-0.5 text-og-sm font-semibold\",\n props.value ? \"text-og-fg\" : \"text-og-muted\",\n )}\n >\n {props.value}\n </dd>\n </div>\n );\n}\n\nfunction browserEngineLabel(session: BrowserSession | null): string {\n if (!session) return \"Unavailable\";\n const version = session.engineVersion ? ` ${session.engineVersion}` : \"\";\n return `${session.engine}${version} · ${session.headless ? \"headless\" : \"headed\"}`;\n}\n\nfunction shortGeneration(value: string | null | undefined): string {\n if (!value) return \"Unavailable\";\n return value.length > 16 ? `${value.slice(0, 8)}…${value.slice(-6)}` : value;\n}\n\nfunction diagnosticKindLabel(kind: BrowserDiagnosticBatch[\"entries\"][number][\"kind\"]): string {\n switch (kind) {\n case \"console\":\n return \"Console\";\n case \"page_error\":\n return \"Page error\";\n case \"failed_request\":\n return \"Request\";\n case \"download\":\n return \"Download\";\n }\n}\n\nfunction diagnosticTone(level: BrowserDiagnosticBatch[\"entries\"][number][\"level\"]): string {\n if (level === \"error\") return \"text-og-status-error\";\n if (level === \"warning\") return \"text-og-status-waiting\";\n return \"text-og-muted\";\n}\n\nfunction formatDiagnosticTime(value: string): string {\n const date = new Date(value);\n return Number.isNaN(date.getTime())\n ? \"\"\n : date.toLocaleTimeString([], { hour: \"2-digit\", minute: \"2-digit\", second: \"2-digit\" });\n}\n\nfunction BrowserNotice(props: { icon: ReactNode; text: string; className?: string }) {\n return (\n <div\n className={cn(\n \"grid h-full place-items-center bg-og-bg text-og-control text-og-muted\",\n props.className,\n )}\n >\n <div className=\"flex items-center gap-2\">\n {props.icon}\n {props.text}\n </div>\n </div>\n );\n}\n\nfunction paintCanvas(\n canvas: HTMLCanvasElement,\n image: CanvasImageSource,\n width: number,\n height: number,\n): void {\n canvas.width = width;\n canvas.height = height;\n const context = canvas.getContext(\"2d\", { alpha: false });\n if (!context) throw new Error(\"Browser canvas is unavailable.\");\n context.drawImage(image, 0, 0, width, height);\n}\n\nfunction loadImage(url: string): Promise<HTMLImageElement> {\n return new Promise((resolve, reject) => {\n const image = new Image();\n image.onload = () => resolve(image);\n image.onerror = () => reject(new Error(\"Browser frame image could not be decoded.\"));\n image.src = url;\n });\n}\n\nfunction browserPoint(\n canvas: HTMLCanvasElement | null,\n frame: BrowserFrame | null,\n clientX: number,\n clientY: number,\n): { x: number; y: number } | null {\n if (!canvas || !frame) return null;\n const rect = canvas.getBoundingClientRect();\n if (rect.width <= 0 || rect.height <= 0) return null;\n const pixelX = ((clientX - rect.left) / rect.width) * frame.width;\n const pixelY = ((clientY - rect.top) / rect.height) * frame.height;\n return {\n x: Math.max(0, pixelX / frame.deviceScaleFactor),\n y: Math.max(0, pixelY / frame.deviceScaleFactor),\n };\n}\n\nfunction semanticNodes(roots: readonly InteractionSemanticNode[]): InteractionSemanticNode[] {\n const result: InteractionSemanticNode[] = [];\n const stack = [...roots].reverse();\n while (stack.length > 0) {\n const node = stack.pop()!;\n result.push(node);\n if (node.children) stack.push(...[...node.children].reverse());\n }\n return result;\n}\n\nfunction frameMatchesSelectedTarget(\n frame: BrowserFrame | null,\n session: BrowserSession | null,\n target: BrowserTarget | null,\n): frame is BrowserFrame {\n // The stream hook already validates the frame against the authenticated\n // attachment's controller generation. The separately-polled BrowserSession\n // can briefly carry the previous generation while an attachment is issued;\n // comparing against it here discarded valid frames and left the viewer on\n // \"Connecting\" indefinitely.\n return Boolean(\n frame &&\n session &&\n target &&\n frame.browserSessionId === session.id &&\n frame.targetId === target.id &&\n frame.targetGeneration === target.targetGeneration &&\n frame.documentGeneration === target.documentGeneration,\n );\n}\n\nfunction sameFrameFence(left: BrowserFrame, right: BrowserFrame): boolean {\n return (\n left.browserSessionId === right.browserSessionId &&\n left.controllerGeneration === right.controllerGeneration &&\n left.targetId === right.targetId &&\n left.targetGeneration === right.targetGeneration &&\n left.documentGeneration === right.documentGeneration &&\n left.frameId === right.frameId\n );\n}\n\nfunction sameOptionalBrowserFrame(left: BrowserFrame | null, right: BrowserFrame | null): boolean {\n return left === null || right === null ? left === right : sameFrameFence(left, right);\n}\n\nfunction isLiveBrowser(session: BrowserSession): boolean {\n return ![\"ending\", \"ended\", \"failed\", \"lost\"].includes(session.lifecycle);\n}\n\nfunction countInterventions(\n interventions: readonly InteractionIntervention[],\n): Map<string, number> {\n const counts = new Map<string, number>();\n for (const intervention of interventions) {\n counts.set(intervention.resourceId, (counts.get(intervention.resourceId) ?? 0) + 1);\n }\n return counts;\n}\n\nfunction interventionTitle(intervention: InteractionIntervention): string {\n switch (intervention.kind) {\n case \"manual_login\":\n return \"Sign in needed\";\n case \"mfa\":\n return \"Verification needed\";\n case \"external_action\":\n case \"confirmation\":\n return \"Action needed\";\n case \"other\":\n return \"Browser needs your help\";\n }\n}\n\nfunction placementLabel(session: BrowserSession | undefined): string {\n if (!session) return \"\";\n switch (session.placement.kind) {\n case \"sandbox_group\":\n return \"Agent sandbox\";\n case \"connected_machine\":\n return \"Connected machine\";\n case \"attached_device\":\n return \"Your browser\";\n case \"external_provider\":\n return \"Cloud browser\";\n }\n}\n\nfunction browserConnectionLabel(state: string): string {\n switch (state) {\n case \"attaching\":\n return \"Opening browser…\";\n case \"connecting\":\n return \"Connecting…\";\n case \"reconnecting\":\n return \"Reconnecting…\";\n case \"error\":\n return \"Disconnected\";\n case \"semantic\":\n return \"Semantic\";\n default:\n return \"Waiting for browser…\";\n }\n}\n\nfunction shortUrl(value: string): string {\n try {\n return new URL(value).hostname || value;\n } catch {\n return value;\n }\n}\n","import type { KeyboardEvent } from \"react\";\nimport { interactionHostPlatform, type InteractionHostPlatform } from \"../lib/host-platform\";\n\nexport const HUMAN_BROWSER_HOME_URL = \"https://www.google.com/\";\nconst HUMAN_BROWSER_SEARCH_URL = \"https://www.google.com/search?q=\";\n\n/** Apply browser-style omnibox behavior: navigate hosts, search ordinary text. */\nexport function normalizeBrowserAddress(value: string): string | null {\n const trimmed = value.trim();\n if (!trimmed) return null;\n\n if (/^(?:https?|about):/iu.test(trimmed)) {\n try {\n const url = new URL(trimmed);\n return [\"http:\", \"https:\", \"about:\"].includes(url.protocol) ? url.href : null;\n } catch {\n return `${HUMAN_BROWSER_SEARCH_URL}${encodeURIComponent(trimmed)}`;\n }\n }\n\n const isLocal = /^(?:localhost|127(?:\\.\\d{1,3}){3}|\\[::1\\])(?::\\d+)?(?:[/?#]|$)/iu.test(trimmed);\n const looksLikeHost =\n !/\\s/u.test(trimmed) &&\n (isLocal || /^(?:[^./\\s]+\\.)+[^./\\s]+(?::\\d+)?(?:[/?#]|$)/u.test(trimmed));\n if (!looksLikeHost) return `${HUMAN_BROWSER_SEARCH_URL}${encodeURIComponent(trimmed)}`;\n\n try {\n return new URL(`${isLocal ? \"http\" : \"https\"}://${trimmed}`).href;\n } catch {\n return `${HUMAN_BROWSER_SEARCH_URL}${encodeURIComponent(trimmed)}`;\n }\n}\n\n/** Translate executable keyboard chords for the BrowserSession action API. */\nexport function browserKey(\n event: Pick<\n KeyboardEvent<HTMLTextAreaElement>,\n \"altKey\" | \"ctrlKey\" | \"key\" | \"metaKey\" | \"shiftKey\"\n >,\n hostPlatform: InteractionHostPlatform = interactionHostPlatform(),\n): string | null {\n // Modifier keydowns precede the actual chord key. They are not executable\n // browser actions by themselves (for example Meta+Meta is invalid CDP input).\n if ([\"Alt\", \"AltGraph\", \"Control\", \"Meta\", \"Shift\"].includes(event.key)) return null;\n const special = new Set([\n \"Enter\",\n \"Tab\",\n \"Escape\",\n \"Backspace\",\n \"Delete\",\n \"ArrowUp\",\n \"ArrowDown\",\n \"ArrowLeft\",\n \"ArrowRight\",\n ]);\n const modified = event.altKey || event.ctrlKey || event.metaKey;\n if (!modified && !special.has(event.key)) return null;\n const parts: string[] = [];\n if (event.ctrlKey) parts.push(hostPlatform === \"mac\" ? \"Control\" : \"Mod\");\n if (event.altKey) parts.push(\"Alt\");\n if (event.metaKey) parts.push(hostPlatform === \"mac\" ? \"Mod\" : \"Meta\");\n if (event.shiftKey) parts.push(\"Shift\");\n parts.push(event.key === \" \" ? \"Space\" : event.key);\n return parts.join(\"+\");\n}\n","import type { InteractionIntervention } from \"@opengeni/sdk/interaction\";\nimport { CheckIcon, CircleAlertIcon, LoaderCircleIcon, XIcon } from \"lucide-react\";\nimport { cn } from \"../lib/cn\";\n\nexport type InteractionInterventionBannerProps = {\n interventions: InteractionIntervention[];\n activeTargetId?: string | null | undefined;\n mutating?: boolean | undefined;\n className?: string | undefined;\n onOpen?: ((intervention: InteractionIntervention) => void) | undefined;\n onResolve: (intervention: InteractionIntervention, outcome: \"completed\" | \"dismissed\") => void;\n};\n\n/** Compact durable human-action prompt shared by Browser and Computer viewers. */\nexport function InteractionInterventionBanner({\n interventions,\n activeTargetId,\n mutating = false,\n className,\n onOpen,\n onResolve,\n}: InteractionInterventionBannerProps) {\n const intervention = interventions[0];\n if (!intervention) return null;\n const targetOpen = activeTargetId === undefined || activeTargetId === intervention.targetId;\n return (\n <div\n className={cn(\n \"flex shrink-0 items-center gap-2 border-b border-og-status-waiting/25 bg-og-status-waiting/[0.07] px-3 py-2\",\n className,\n )}\n role=\"status\"\n >\n <span className=\"grid size-7 shrink-0 place-items-center rounded-og-sm bg-og-status-waiting/10 text-og-status-waiting\">\n <CircleAlertIcon className=\"size-3.5\" />\n </span>\n <span className=\"min-w-0 flex-1\">\n <span className=\"flex items-center gap-1.5 text-og-control font-medium text-og-fg\">\n {interventionTitle(intervention.kind)}\n {interventions.length > 1 ? (\n <span className=\"rounded-full bg-og-surface-2 px-1.5 py-0.5 text-[10px] font-normal text-og-muted\">\n +{interventions.length - 1}\n </span>\n ) : null}\n </span>\n <span className=\"block truncate text-og-xs text-og-muted\">{intervention.reason}</span>\n </span>\n {!targetOpen && onOpen ? (\n <button\n type=\"button\"\n onClick={() => onOpen(intervention)}\n disabled={mutating}\n className=\"h-7 shrink-0 rounded-og-sm border border-og-border bg-og-surface-1 px-2.5 text-og-control font-medium text-og-fg transition hover:bg-og-surface-2 disabled:opacity-50\"\n >\n Open\n </button>\n ) : (\n <button\n type=\"button\"\n onClick={() => onResolve(intervention, \"completed\")}\n disabled={mutating}\n className=\"inline-flex h-7 shrink-0 items-center gap-1 rounded-og-sm bg-og-accent px-2.5 text-og-control font-medium text-og-accent-fg transition hover:brightness-105 disabled:opacity-50\"\n >\n {mutating ? (\n <LoaderCircleIcon className=\"size-3 animate-spin\" />\n ) : (\n <CheckIcon className=\"size-3\" />\n )}\n Done\n </button>\n )}\n <button\n type=\"button\"\n onClick={() => onResolve(intervention, \"dismissed\")}\n disabled={mutating}\n className=\"grid size-7 shrink-0 place-items-center rounded-og-sm text-og-muted transition hover:bg-og-surface-2 hover:text-og-fg disabled:opacity-50\"\n aria-label=\"Cancel request\"\n title=\"Cancel request\"\n >\n <XIcon className=\"size-3.5\" />\n </button>\n </div>\n );\n}\n\nfunction interventionTitle(kind: InteractionIntervention[\"kind\"]): string {\n switch (kind) {\n case \"manual_login\":\n return \"Sign in needed\";\n case \"mfa\":\n return \"Verification needed\";\n case \"external_action\":\n return \"Action needed\";\n case \"confirmation\":\n return \"Confirmation needed\";\n case \"other\":\n return \"Agent needs your help\";\n }\n}\n","import {\n computerFrameSocketUrl,\n decodeComputerFrameMessage,\n type ComputerFrame,\n type ComputerFrameStreamOptions,\n type ComputerSessionAttachment,\n} from \"@opengeni/sdk/interaction\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport {\n decodeStreamFrame,\n decodeStreamOpenAck,\n encodeStreamClose,\n encodeStreamOpen,\n STREAM_CLOSE_REASON_NORMAL,\n STREAM_KIND_COMPUTER,\n STREAM_ROLE_CLIENT,\n} from \"../lib/relay-wire\";\nimport {\n type EmbeddedComputerInteractionClientOverride,\n useEmbeddedComputerInteraction,\n} from \"../session-context\";\n\nexport type ComputerFrameConnectionState =\n | \"idle\"\n | \"attaching\"\n | \"connecting\"\n | \"live\"\n | \"reconnecting\"\n | \"error\";\n\nexport type ComputerFrameWebSocket = Pick<\n WebSocket,\n \"binaryType\" | \"readyState\" | \"close\" | \"addEventListener\" | \"removeEventListener\"\n> & { send(data: ArrayBuffer): void };\n\nexport type ComputerFrameWebSocketFactory = (\n url: string,\n protocols: string[],\n) => ComputerFrameWebSocket;\n\nconst RELAY_TAG_OPEN = 1;\nconst RELAY_TAG_OPEN_ACK = 2;\nconst RELAY_TAG_FRAME = 3;\nconst RELAY_TAG_CLOSE = 4;\nconst MAX_AUTOMATIC_RECONNECTS_WITHOUT_A_FRAME = 2;\n\nexport type UseComputerFrameStreamOptions = EmbeddedComputerInteractionClientOverride & {\n computerSessionId: string | null;\n targetId: string | null;\n enabled?: boolean | undefined;\n stream?: ComputerFrameStreamOptions | undefined;\n webSocketFactory?: ComputerFrameWebSocketFactory | undefined;\n};\n\nexport type UseComputerFrameStreamResult = {\n state: ComputerFrameConnectionState;\n frame: ComputerFrame | null;\n attachment: Pick<\n ComputerSessionAttachment,\n \"computerSessionId\" | \"controllerGeneration\" | \"targetId\" | \"stream\" | \"expiresAt\"\n > | null;\n error: Error | null;\n reconnect: () => void;\n};\n\n/** Reconnecting, latest-only ComputerSession media attachment. Grants remain in\n * WebSocket subprotocols or the relay's authenticated first binary message. */\nexport function useComputerFrameStream(\n options: UseComputerFrameStreamOptions,\n): UseComputerFrameStreamResult {\n const { client, workspaceId } = useEmbeddedComputerInteraction(options);\n const enabled = options.enabled ?? true;\n const [nonce, setNonce] = useState(0);\n const [result, setResult] = useState<Omit<UseComputerFrameStreamResult, \"reconnect\">>({\n state: \"idle\",\n frame: null,\n attachment: null,\n error: null,\n });\n const latestRef = useRef<{ key: string; sequence: number }>({\n key: \"\",\n sequence: -1,\n });\n const factoryRef = useRef(options.webSocketFactory);\n const streamRef = useRef(options.stream);\n factoryRef.current = options.webSocketFactory;\n streamRef.current = options.stream;\n\n const reconnect = useCallback(() => setNonce((value) => value + 1), []);\n\n useEffect(() => {\n const computerSessionId = options.computerSessionId;\n const targetId = options.targetId;\n if (!enabled || !computerSessionId || !targetId || typeof window === \"undefined\") {\n setResult({ state: \"idle\", frame: null, attachment: null, error: null });\n return;\n }\n\n latestRef.current = { key: \"\", sequence: -1 };\n setResult({\n state: \"attaching\",\n frame: null,\n attachment: null,\n error: null,\n });\n\n let disposed = false;\n let socket: ComputerFrameWebSocket | null = null;\n let socketHandlers: {\n open: () => void;\n message: (event: MessageEvent) => void;\n error: () => void;\n close: () => void;\n } | null = null;\n let reconnectTimer: ReturnType<typeof setTimeout> | null = null;\n let expiryTimer: ReturnType<typeof setTimeout> | null = null;\n let failures = 0;\n let controllerGeneration: string | null = null;\n let activeAttachment: ComputerSessionAttachment | null = null;\n let activeStream: ComputerSessionAttachment[\"stream\"] | null = null;\n let attachmentExpiresAt = 0;\n let lastRelaySequence: string | null = null;\n let relayAccepted = false;\n let pendingFrame: { bytes: Uint8Array; source: ComputerFrameWebSocket } | null = null;\n let decodingFrame = false;\n const attachmentAbort = new AbortController();\n\n const clearSocket = (terminateProducer = false) => {\n if (!socket) return;\n const current = socket;\n const handlers = socketHandlers;\n if (terminateProducer && activeStream?.kind === \"relay\" && socket.readyState === 1) {\n try {\n socket.send(\n relayDatagram(\n RELAY_TAG_CLOSE,\n encodeStreamClose({\n channelId: activeStream.channel.channelId,\n reason: STREAM_CLOSE_REASON_NORMAL,\n message: \"viewer detached\",\n }),\n ),\n );\n } catch {\n // OPEN can race a transport close. Local teardown must still finish.\n }\n }\n if (handlers) {\n current.removeEventListener(\"open\", handlers.open);\n current.removeEventListener(\"message\", handlers.message);\n current.removeEventListener(\"error\", handlers.error);\n current.removeEventListener(\"close\", handlers.close);\n }\n if (current.readyState === 0 || current.readyState === 1) {\n current.close(1000, \"viewer detached\");\n }\n socket = null;\n socketHandlers = null;\n pendingFrame = null;\n };\n\n const scheduleReconnect = () => {\n if (disposed || reconnectTimer) return;\n if (failures >= MAX_AUTOMATIC_RECONNECTS_WITHOUT_A_FRAME) return;\n const delay = Math.min(5_000, 250 * 2 ** Math.min(failures, 5));\n failures += 1;\n setResult((current) => ({ ...current, state: \"reconnecting\" }));\n reconnectTimer = setTimeout(() => {\n reconnectTimer = null;\n connectSocket();\n }, delay);\n };\n\n const fail = (cause: unknown, reconnectAutomatically = true) => {\n if (disposed) return;\n const error = cause instanceof Error ? cause : new Error(String(cause));\n setResult((current) => ({ ...current, state: \"error\", error }));\n clearSocket();\n if (reconnectAutomatically) scheduleReconnect();\n };\n\n const onOpen = (source: ComputerFrameWebSocket) => {\n if (disposed || source !== socket) return;\n if (activeStream?.kind === \"relay\") {\n const body = encodeStreamOpen({\n channel: { ...activeStream.channel, kind: STREAM_KIND_COMPUTER },\n token: activeStream.token,\n role: STREAM_ROLE_CLIENT,\n resumeFromSeq:\n lastRelaySequence === null ? \"0\" : (BigInt(lastRelaySequence) + 1n).toString(),\n });\n try {\n source.send(relayDatagram(RELAY_TAG_OPEN, body));\n } catch (error) {\n fail(error);\n }\n return;\n }\n setResult((current) => ({ ...current, state: \"live\", error: null }));\n };\n\n const drainLatestFrame = async () => {\n if (decodingFrame) return;\n decodingFrame = true;\n try {\n while (pendingFrame) {\n if (disposed) break;\n const pending = pendingFrame;\n pendingFrame = null;\n const { bytes, source } = pending;\n const frame = await decodeComputerFrameMessage(bytes);\n if (disposed || source !== socket) continue;\n if (frame.computerSessionId !== computerSessionId || frame.targetId !== targetId) {\n throw new Error(\"computer frame belongs to another resource\");\n }\n if (!controllerGeneration || frame.controllerGeneration !== controllerGeneration) {\n throw new Error(\"computer frame belongs to a stale controller\");\n }\n const key = `${computerSessionId}:${targetId}:${frame.controllerGeneration}:${frame.targetGeneration}`;\n if (latestRef.current.key === key && frame.sequence <= latestRef.current.sequence)\n continue;\n latestRef.current = { key, sequence: frame.sequence };\n // A real decoded frame—not merely a socket handshake—is the recovery\n // boundary. Resetting on `open` caused a dead producer to reconnect\n // forever and continuously spawn fresh relay/SCK work.\n failures = 0;\n setResult((current) => ({\n ...current,\n state: \"live\",\n frame,\n error: null,\n }));\n }\n } catch (cause) {\n fail(cause);\n } finally {\n decodingFrame = false;\n if (!disposed && pendingFrame) void drainLatestFrame();\n }\n };\n\n const onMessage = (source: ComputerFrameWebSocket, event: MessageEvent) => {\n void (async () => {\n try {\n const bytes = await messageBytes(event.data);\n if (disposed || source !== socket) return;\n let frameBytes = bytes;\n if (activeStream?.kind === \"relay\") {\n if (bytes.length < 1) throw new Error(\"computer relay returned an empty message\");\n const tag = bytes[0];\n const body = bytes.subarray(1);\n if (tag === RELAY_TAG_OPEN_ACK) {\n const ack = decodeStreamOpenAck(body);\n if (!ack.accepted) {\n activeAttachment = null;\n activeStream = null;\n attachmentExpiresAt = 0;\n throw new Error(ack.error?.message ?? \"computer stream was rejected by the relay\");\n }\n relayAccepted = true;\n return;\n }\n if (tag === RELAY_TAG_CLOSE) {\n // A relay close is terminal for this producer/channel. Reusing\n // the same attachment only reconnects to a dead channel forever;\n // invalidate it so the retry mints a fresh producer.\n activeAttachment = null;\n activeStream = null;\n attachmentExpiresAt = 0;\n lastRelaySequence = null;\n relayAccepted = false;\n fail(new Error(\"Computer frame source ended.\"), false);\n return;\n }\n if (tag !== RELAY_TAG_FRAME || !relayAccepted) return;\n const relayFrame = decodeStreamFrame(body);\n lastRelaySequence = relayFrame.seq;\n frameBytes = relayFrame.data;\n }\n // Digest verification can take longer than an inter-frame interval on\n // low-power clients. Keep exactly one pending encoded frame and replace\n // it with newer input while a decode is in flight; never build latency.\n pendingFrame = { bytes: frameBytes, source };\n void drainLatestFrame();\n } catch (cause) {\n fail(cause);\n }\n })();\n };\n\n const onError = (source: ComputerFrameWebSocket) => {\n if (source !== socket) return;\n fail(new Error(\"Computer view lost connection.\"));\n };\n\n const onClose = (source: ComputerFrameWebSocket) => {\n if (disposed || source !== socket) return;\n clearSocket();\n scheduleReconnect();\n };\n\n const connectSocket = () => {\n if (disposed) return;\n clearSocket();\n if (!activeAttachment || !activeStream || attachmentExpiresAt <= Date.now() + 1_000) {\n void attach();\n return;\n }\n if (activeStream.kind === \"direct_rfb\") {\n setResult((current) => ({ ...current, state: \"live\", error: null }));\n return;\n }\n relayAccepted = false;\n setResult((current) => ({\n ...current,\n state: \"connecting\",\n error: null,\n }));\n const createSocket =\n factoryRef.current ?? ((url: string, protocols: string[]) => new WebSocket(url, protocols));\n const openedSocket = createSocket(\n activeStream.kind === \"relay\"\n ? activeStream.url\n : computerFrameSocketUrl(activeAttachment, streamRef.current),\n activeStream.kind === \"direct_websocket\" ? [...activeStream.protocols] : [],\n );\n socket = openedSocket;\n socketHandlers = {\n open: () => onOpen(openedSocket),\n message: (event) => onMessage(openedSocket, event),\n error: () => onError(openedSocket),\n close: () => onClose(openedSocket),\n };\n openedSocket.binaryType = \"arraybuffer\";\n openedSocket.addEventListener(\"open\", socketHandlers.open);\n openedSocket.addEventListener(\"message\", socketHandlers.message);\n openedSocket.addEventListener(\"error\", socketHandlers.error);\n openedSocket.addEventListener(\"close\", socketHandlers.close);\n };\n\n const attach = async () => {\n if (disposed) return;\n clearSocket();\n if (expiryTimer) clearTimeout(expiryTimer);\n setResult((current) => ({\n ...current,\n state: current.attachment ? \"reconnecting\" : \"attaching\",\n error: null,\n }));\n try {\n const attachment = await client.attachComputerSession(\n workspaceId,\n computerSessionId,\n {\n targetId,\n expiresInSeconds: 120,\n ...(streamRef.current ? { stream: streamRef.current } : {}),\n },\n { signal: attachmentAbort.signal },\n );\n if (disposed) return;\n if (\n attachment.computerSessionId !== computerSessionId ||\n attachment.targetId !== targetId\n ) {\n throw new Error(\"computer attachment does not match the requested resource\");\n }\n controllerGeneration = attachment.controllerGeneration;\n activeAttachment = attachment;\n activeStream = attachment.stream;\n attachmentExpiresAt = Date.parse(attachment.expiresAt);\n lastRelaySequence = null;\n relayAccepted = false;\n setResult((current) => ({\n ...current,\n state: \"connecting\",\n attachment: {\n computerSessionId: attachment.computerSessionId,\n controllerGeneration: attachment.controllerGeneration,\n targetId: attachment.targetId,\n stream: attachment.stream,\n expiresAt: attachment.expiresAt,\n },\n error: null,\n }));\n const refreshIn = Number.isFinite(attachmentExpiresAt)\n ? Math.max(1_000, attachmentExpiresAt - Date.now() - 5_000)\n : 60_000;\n expiryTimer = setTimeout(() => {\n if (disposed) return;\n clearSocket(true);\n activeAttachment = null;\n activeStream = null;\n attachmentExpiresAt = 0;\n void attach();\n }, refreshIn);\n connectSocket();\n } catch (cause) {\n if (attachmentAbort.signal.aborted || disposed) return;\n fail(cause);\n }\n };\n\n void attach();\n return () => {\n disposed = true;\n pendingFrame = null;\n attachmentAbort.abort();\n if (reconnectTimer) clearTimeout(reconnectTimer);\n if (expiryTimer) clearTimeout(expiryTimer);\n clearSocket(true);\n };\n }, [client, enabled, nonce, options.computerSessionId, options.targetId, workspaceId]);\n\n return { ...result, reconnect };\n}\n\nfunction relayDatagram(tag: number, body: Uint8Array): ArrayBuffer {\n const message = new Uint8Array(body.length + 1);\n message[0] = tag;\n message.set(body, 1);\n return message.buffer as ArrayBuffer;\n}\n\nasync function messageBytes(value: unknown): Promise<Uint8Array> {\n if (value instanceof ArrayBuffer) return new Uint8Array(value);\n if (ArrayBuffer.isView(value)) {\n return new Uint8Array(value.buffer, value.byteOffset, value.byteLength).slice();\n }\n if (typeof Blob !== \"undefined\" && value instanceof Blob) {\n return new Uint8Array(await value.arrayBuffer());\n }\n throw new Error(\"computer frame stream returned a non-binary message\");\n}\n","import type {\n ComputerAction,\n ComputerActionReceipt,\n ComputerClipboard,\n ComputerFrame,\n ComputerObservation,\n ComputerSession,\n ComputerTarget,\n} from \"@opengeni/sdk/interaction\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport {\n type EmbeddedComputerInteractionClientOverride,\n useEmbeddedComputerInteraction,\n} from \"../session-context\";\nimport { usePageLiveActivity } from \"./internal\";\n\nexport type UseComputerSessionOptions = EmbeddedComputerInteractionClientOverride & {\n computerSessionId: string | null;\n enabled?: boolean | undefined;\n pollIntervalMs?: number | undefined;\n};\n\nexport type UseComputerSessionResult = {\n session: ComputerSession | null;\n targets: ComputerTarget[];\n selectedTarget: ComputerTarget | null;\n observation: ComputerObservation | null;\n loading: boolean;\n mutating: boolean;\n error: Error | null;\n refresh: () => Promise<void>;\n readClipboard: () => Promise<ComputerClipboard>;\n /** Changes only this viewer's target cursor; it never takes ownership or\n * foregrounds an application. */\n selectTarget: (targetId: string) => Promise<ComputerTarget>;\n act: (action: ComputerAction, operationId?: string) => Promise<ComputerActionReceipt>;\n /** Dispatch pointer input against the exact displayed frame. */\n actFromFrame: (\n action: Extract<ComputerAction, { type: \"pointer\" }>,\n frame: ComputerFrame,\n operationId?: string,\n ) => Promise<ComputerActionReceipt>;\n};\n\n/** Selected ComputerSession state. Semantic and pixel input share the same\n * generation-fenced controller operation stream used by agents. */\nexport function useComputerSession(options: UseComputerSessionOptions): UseComputerSessionResult {\n const { client, workspaceId } = useEmbeddedComputerInteraction(options);\n const computerSessionId = options.computerSessionId;\n const enabled = (options.enabled ?? true) && computerSessionId !== null;\n const pageLive = usePageLiveActivity();\n const pollIntervalMs = Math.max(750, options.pollIntervalMs ?? 2_000);\n const [state, setState] = useState<ComputerControlState>(() =>\n emptyState(computerSessionId, enabled),\n );\n const visible =\n state.computerSessionId === computerSessionId ? state : emptyState(computerSessionId, enabled);\n const selectedTargetIdRef = useRef<string | null>(visible.selectedTargetId);\n selectedTargetIdRef.current = visible.selectedTargetId;\n const targetsRef = useRef<{\n computerSessionId: string | null;\n targets: ComputerTarget[];\n }>({\n computerSessionId,\n targets: visible.targets,\n });\n const observationRef = useRef<{\n computerSessionId: string | null;\n observation: ComputerObservation | null;\n }>({ computerSessionId, observation: visible.observation });\n if (targetsRef.current.computerSessionId !== computerSessionId) {\n targetsRef.current = { computerSessionId, targets: visible.targets };\n observationRef.current = {\n computerSessionId,\n observation: visible.observation,\n };\n } else {\n targetsRef.current.targets = visible.targets;\n observationRef.current.observation = visible.observation;\n }\n const requestRef = useRef<{ id: number; controller: AbortController | null }>({\n id: 0,\n controller: null,\n });\n const mutationRef = useRef<{\n computerSessionId: string | null;\n count: number;\n }>({\n computerSessionId,\n count: 0,\n });\n const mountedRef = useRef(true);\n\n const invalidateRefresh = useCallback(() => {\n const id = requestRef.current.id + 1;\n requestRef.current.controller?.abort();\n requestRef.current = { id, controller: null };\n }, []);\n\n const refresh = useCallback(async (): Promise<void> => {\n if (!enabled || !computerSessionId) return;\n const id = requestRef.current.id + 1;\n requestRef.current.controller?.abort();\n const controller = new AbortController();\n requestRef.current = { id, controller };\n try {\n const [session, targetResponse] = await Promise.all([\n client.getComputerSession(workspaceId, computerSessionId, {\n signal: controller.signal,\n }),\n client.listComputerTargets(workspaceId, computerSessionId, {\n signal: controller.signal,\n }),\n ]);\n if (!mountedRef.current || requestRef.current.id !== id) return;\n const targets = sortComputerTargets(targetResponse.targets);\n const selected = chooseTarget(targets, selectedTargetIdRef.current, session.platform);\n const observation = selected\n ? await client.observeComputerTarget(workspaceId, computerSessionId, selected.id, {\n signal: controller.signal,\n })\n : null;\n if (!mountedRef.current || requestRef.current.id !== id) return;\n selectedTargetIdRef.current = selected?.id ?? null;\n targetsRef.current = { computerSessionId, targets };\n observationRef.current = { computerSessionId, observation };\n setState((current) =>\n current.computerSessionId === computerSessionId\n ? {\n ...current,\n session,\n targets,\n selectedTargetId: selected?.id ?? null,\n observation,\n loading: false,\n error: null,\n }\n : current,\n );\n } catch (cause) {\n if (controller.signal.aborted || !mountedRef.current || requestRef.current.id !== id) return;\n setState((current) =>\n current.computerSessionId === computerSessionId\n ? {\n ...current,\n loading: false,\n error: cause instanceof Error ? cause : new Error(String(cause)),\n }\n : current,\n );\n } finally {\n if (requestRef.current.id === id) requestRef.current = { id, controller: null };\n }\n }, [client, computerSessionId, enabled, workspaceId]);\n\n useEffect(() => {\n mountedRef.current = true;\n if (!enabled) {\n invalidateRefresh();\n setState(emptyState(computerSessionId, false));\n return;\n }\n setState((current) =>\n current.computerSessionId === computerSessionId\n ? { ...current, loading: true }\n : emptyState(computerSessionId, true),\n );\n void refresh();\n return () => {\n mountedRef.current = false;\n invalidateRefresh();\n };\n }, [computerSessionId, enabled, invalidateRefresh, refresh]);\n\n useEffect(() => {\n if (!enabled || !pageLive || visible.mutating) return;\n const timer = setInterval(() => {\n if (!requestRef.current.controller) void refresh();\n }, pollIntervalMs);\n return () => clearInterval(timer);\n }, [enabled, pageLive, pollIntervalMs, refresh, visible.mutating]);\n\n useEffect(() => {\n if (!enabled || !computerSessionId || !pageLive) return;\n let disposed = false;\n const timer = setInterval(() => {\n void client.heartbeatComputerSession(workspaceId, computerSessionId).catch(() => {\n if (!disposed) void refresh();\n });\n }, 30_000);\n return () => {\n disposed = true;\n clearInterval(timer);\n };\n }, [client, computerSessionId, enabled, pageLive, refresh, workspaceId]);\n\n const runMutation = useCallback(\n async <T>(scopeComputerSessionId: string, operation: () => Promise<T>): Promise<T> => {\n invalidateRefresh();\n if (mutationRef.current.computerSessionId !== scopeComputerSessionId) {\n mutationRef.current = {\n computerSessionId: scopeComputerSessionId,\n count: 0,\n };\n }\n mutationRef.current.count += 1;\n setState((current) =>\n current.computerSessionId === scopeComputerSessionId\n ? { ...current, mutating: true, error: null }\n : current,\n );\n try {\n return await operation();\n } catch (cause) {\n const error = cause instanceof Error ? cause : new Error(String(cause));\n setState((current) =>\n current.computerSessionId === scopeComputerSessionId ? { ...current, error } : current,\n );\n throw error;\n } finally {\n if (mutationRef.current.computerSessionId === scopeComputerSessionId) {\n mutationRef.current.count = Math.max(0, mutationRef.current.count - 1);\n const mutating = mutationRef.current.count > 0;\n setState((current) =>\n current.computerSessionId === scopeComputerSessionId\n ? { ...current, mutating }\n : current,\n );\n }\n }\n },\n [invalidateRefresh],\n );\n\n const selectTarget = useCallback(\n async (targetId: string): Promise<ComputerTarget> => {\n if (!computerSessionId) throw new Error(\"No ComputerSession is selected.\");\n const target = targetsRef.current.targets.find((candidate) => candidate.id === targetId);\n if (!target) throw new Error(\"The selected computer target is no longer available.\");\n invalidateRefresh();\n selectedTargetIdRef.current = target.id;\n observationRef.current = { computerSessionId, observation: null };\n setState((current) =>\n current.computerSessionId === computerSessionId\n ? {\n ...current,\n selectedTargetId: target.id,\n observation: null,\n loading: true,\n error: null,\n }\n : current,\n );\n try {\n const observation = await client.observeComputerTarget(\n workspaceId,\n computerSessionId,\n target.id,\n );\n if (selectedTargetIdRef.current !== target.id) return target;\n observationRef.current = { computerSessionId, observation };\n setState((current) =>\n current.computerSessionId === computerSessionId && current.selectedTargetId === target.id\n ? { ...current, observation, loading: false, error: null }\n : current,\n );\n return observation.target;\n } catch (cause) {\n const error = cause instanceof Error ? cause : new Error(String(cause));\n setState((current) =>\n current.computerSessionId === computerSessionId && current.selectedTargetId === target.id\n ? { ...current, loading: false, error }\n : current,\n );\n throw error;\n }\n },\n [client, computerSessionId, invalidateRefresh, workspaceId],\n );\n\n const dispatchAction = useCallback(\n async (\n action: ComputerAction,\n operationId: string,\n frame: ComputerFrame | null,\n ): Promise<ComputerActionReceipt> => {\n if (!computerSessionId) throw new Error(\"No ComputerSession is selected.\");\n if (frame && frame.computerSessionId !== computerSessionId) {\n throw new Error(\"The displayed computer frame belongs to another ComputerSession.\");\n }\n const currentObservation =\n observationRef.current.computerSessionId === computerSessionId\n ? observationRef.current.observation\n : null;\n const focusTarget =\n action.type === \"focus\"\n ? (targetsRef.current.targets.find((candidate) => candidate.id === action.targetId) ??\n null)\n : null;\n const frameTarget = frame\n ? (targetsRef.current.targets.find((candidate) => candidate.id === frame.targetId) ??\n (currentObservation?.target.id === frame.targetId ? currentObservation.target : null))\n : null;\n const target = frameTarget ?? focusTarget ?? currentObservation?.target ?? null;\n if (!target) throw new Error(\"The computer target is not ready for input.\");\n if (frame && frame.targetId !== selectedTargetIdRef.current) {\n throw new Error(\"The displayed computer frame is no longer selected.\");\n }\n if (action.type === \"pointer\") {\n const expectedFrameId = frame?.frameId ?? currentObservation?.frameId ?? null;\n if (!expectedFrameId || action.frameId !== expectedFrameId) {\n throw new Error(\"Pointer input must reference the exact displayed computer frame.\");\n }\n }\n if (action.type === \"semantic\" && !currentObservation) {\n throw new Error(\"The computer accessibility tree is not ready for input.\");\n }\n\n return await runMutation(computerSessionId, async () => {\n const receipt = await client.actInComputer(workspaceId, computerSessionId, {\n operationId,\n targetId: target.id,\n expectedTargetGeneration: frame?.targetGeneration ?? target.targetGeneration,\n expectedObservationId:\n action.type === \"pointer\" ? null : (currentObservation?.observationId ?? null),\n expectedFrameId: action.type === \"pointer\" ? action.frameId : null,\n action,\n });\n if (receipt.observation) {\n const observation = receipt.observation;\n observationRef.current = { computerSessionId, observation };\n selectedTargetIdRef.current = observation.target.id;\n setState((current) =>\n current.computerSessionId === computerSessionId\n ? {\n ...current,\n observation,\n selectedTargetId: observation.target.id,\n targets: replaceTarget(current.targets, observation.target),\n }\n : current,\n );\n } else {\n void refresh();\n }\n return receipt;\n });\n },\n [client, computerSessionId, refresh, runMutation, workspaceId],\n );\n\n const act = useCallback(\n async (\n action: ComputerAction,\n operationId: string = crypto.randomUUID(),\n ): Promise<ComputerActionReceipt> => await dispatchAction(action, operationId, null),\n [dispatchAction],\n );\n\n const actFromFrame = useCallback(\n async (\n action: Extract<ComputerAction, { type: \"pointer\" }>,\n frame: ComputerFrame,\n operationId: string = crypto.randomUUID(),\n ): Promise<ComputerActionReceipt> => await dispatchAction(action, operationId, frame),\n [dispatchAction],\n );\n\n const readClipboard = useCallback(async (): Promise<ComputerClipboard> => {\n if (!computerSessionId) throw new Error(\"No ComputerSession is selected.\");\n return await client.readComputerClipboard(workspaceId, computerSessionId);\n }, [client, computerSessionId, workspaceId]);\n\n return {\n session: visible.session,\n targets: visible.targets,\n selectedTarget:\n visible.targets.find((target) => target.id === visible.selectedTargetId) ?? null,\n observation: visible.observation,\n loading: visible.loading,\n mutating: visible.mutating,\n error: visible.error,\n refresh,\n readClipboard,\n selectTarget,\n act,\n actFromFrame,\n };\n}\n\ntype ComputerControlState = {\n computerSessionId: string | null;\n session: ComputerSession | null;\n targets: ComputerTarget[];\n selectedTargetId: string | null;\n observation: ComputerObservation | null;\n loading: boolean;\n mutating: boolean;\n error: Error | null;\n};\n\nfunction emptyState(computerSessionId: string | null, loading: boolean): ComputerControlState {\n return {\n computerSessionId,\n session: null,\n targets: [],\n selectedTargetId: null,\n observation: null,\n loading,\n mutating: false,\n error: null,\n };\n}\n\nfunction chooseTarget(\n targets: readonly ComputerTarget[],\n preferredId: string | null,\n platform: ComputerSession[\"platform\"],\n): ComputerTarget | null {\n const preferred = targets.find((target) => target.id === preferredId);\n if (preferred) return preferred;\n if (platform === \"linux\") {\n return (\n targets.find((target) => target.focused && target.kind === \"screen\") ??\n targets.find((target) => target.kind === \"screen\") ??\n targets.find((target) => target.focused && target.kind === \"window\") ??\n targets.find((target) => target.kind === \"window\") ??\n targets[0] ??\n null\n );\n }\n return (\n targets.find((target) => target.focused && target.kind === \"window\") ??\n targets.find((target) => target.kind === \"window\") ??\n targets.find((target) => target.focused && target.kind === \"app\") ??\n targets.find((target) => target.kind === \"app\") ??\n targets.find((target) => target.kind === \"screen\") ??\n targets[0] ??\n null\n );\n}\n\nfunction sortComputerTargets(targets: readonly ComputerTarget[]): ComputerTarget[] {\n const rank = { window: 0, app: 1, screen: 2 } as const;\n return [...targets].sort(\n (left, right) =>\n Number(right.focused) - Number(left.focused) ||\n rank[left.kind] - rank[right.kind] ||\n left.title.localeCompare(right.title) ||\n left.id.localeCompare(right.id),\n );\n}\n\nfunction replaceTarget(\n targets: readonly ComputerTarget[],\n target: ComputerTarget,\n): ComputerTarget[] {\n return sortComputerTargets([\n ...targets.filter((candidate) => candidate.id !== target.id),\n target,\n ]);\n}\n","import type {\n ComputerSession,\n ComputerSessionMutationResponse,\n CreateComputerSessionRequest,\n} from \"@opengeni/sdk/interaction\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport type { EmbeddedComputerInteractionClientLike } from \"../client\";\nimport {\n type EmbeddedComputerInteractionClientOverride,\n useEmbeddedComputerInteraction,\n} from \"../session-context\";\nimport { useInteractionInvalidation } from \"./use-interaction-invalidation\";\n\nexport type UseComputerSessionsOptions = EmbeddedComputerInteractionClientOverride & {\n /** Current agent/session relevance. Workspace peers remain in `sessions`. */\n sessionId?: string | undefined;\n enabled?: boolean | undefined;\n /** Polling fallback used only while the workspace invalidation stream is unavailable. */\n pollIntervalMs?: number | undefined;\n};\n\nexport type UseComputerSessionsResult = {\n revision: number;\n sessions: ComputerSession[];\n relevantSessions: ComputerSession[];\n loading: boolean;\n refreshing: boolean;\n error: Error | null;\n refresh: () => Promise<void>;\n create: (\n request: Omit<CreateComputerSessionRequest, \"operationId\"> & {\n operationId?: string;\n },\n ) => Promise<ComputerSessionMutationResponse>;\n end: (\n computerSessionId: string,\n operationId?: string,\n ) => Promise<ComputerSessionMutationResponse>;\n};\n\n/** Workspace-wide ComputerSession registry. Associations rank relevance but\n * never hide peer resources or create an ownership boundary. */\nexport function useComputerSessions(\n options: UseComputerSessionsOptions = {},\n): UseComputerSessionsResult {\n const {\n client,\n workspaceId,\n registerSessionReconciler,\n workspaceInteractionEvent,\n workspaceInteractionConnectionState,\n } = useEmbeddedComputerInteraction(options);\n const enabled = options.enabled ?? true;\n const [state, setState] = useState<ComputerRegistryState>(() => emptyState(workspaceId, enabled));\n const requestRef = useRef<{ id: number; controller: AbortController | null }>({\n id: 0,\n controller: null,\n });\n const mountedRef = useRef(true);\n const visible = state.workspaceId === workspaceId ? state : emptyState(workspaceId, enabled);\n\n const cancelLoad = useCallback(() => {\n const id = requestRef.current.id + 1;\n requestRef.current.controller?.abort();\n requestRef.current = { id, controller: null };\n }, []);\n\n const load = useCallback(\n async (foreground: boolean): Promise<void> => {\n if (!enabled) return;\n const id = requestRef.current.id + 1;\n requestRef.current.controller?.abort();\n const controller = new AbortController();\n requestRef.current = { id, controller };\n setState((current) => ({\n ...(current.workspaceId === workspaceId ? current : emptyState(workspaceId, true)),\n loading: foreground,\n refreshing: !foreground,\n error: foreground || current.workspaceId !== workspaceId ? null : current.error,\n }));\n try {\n const response = await client.listComputerSessions(workspaceId, {\n signal: controller.signal,\n });\n if (!mountedRef.current || requestRef.current.id !== id) return;\n setState({\n workspaceId,\n revision: response.revision,\n sessions: sortComputerSessions(response.sessions),\n loading: false,\n refreshing: false,\n error: null,\n });\n } catch (cause) {\n if (controller.signal.aborted || !mountedRef.current || requestRef.current.id !== id)\n return;\n setState((current) => ({\n ...(current.workspaceId === workspaceId ? current : emptyState(workspaceId, true)),\n loading: false,\n refreshing: false,\n error: cause instanceof Error ? cause : new Error(String(cause)),\n }));\n } finally {\n if (requestRef.current.id === id) requestRef.current = { id, controller: null };\n }\n },\n [client, enabled, workspaceId],\n );\n\n const refresh = useCallback(async () => await load(false), [load]);\n\n useEffect(() => {\n mountedRef.current = true;\n if (!enabled) {\n cancelLoad();\n setState(emptyState(workspaceId, false));\n return;\n }\n void load(true);\n return () => {\n mountedRef.current = false;\n cancelLoad();\n };\n }, [cancelLoad, enabled, load, workspaceId]);\n\n useInteractionInvalidation({\n workspaceId,\n key: workspaceId,\n enabled,\n event: workspaceInteractionEvent,\n connectionState: workspaceInteractionConnectionState,\n knownRevision: visible.revision,\n refresh,\n fallbackPollIntervalMs: options.pollIntervalMs,\n });\n\n useEffect(() => {\n if (!enabled || !options.sessionId) return;\n return registerSessionReconciler(\n options.sessionId,\n `computer-sessions:${workspaceId}`,\n refresh,\n );\n }, [enabled, options.sessionId, refresh, registerSessionReconciler, workspaceId]);\n\n const create = useCallback(\n async (\n request: Omit<CreateComputerSessionRequest, \"operationId\"> & {\n operationId?: string;\n },\n ): Promise<ComputerSessionMutationResponse> => {\n const response = await client.createComputerSession(workspaceId, {\n ...request,\n operationId: request.operationId ?? crypto.randomUUID(),\n });\n setState((current) => mergeSession(current, workspaceId, response.session));\n return response;\n },\n [client, workspaceId],\n );\n\n const end = useCallback(\n async (\n computerSessionId: string,\n operationId: string = crypto.randomUUID(),\n ): Promise<ComputerSessionMutationResponse> => {\n const response = await client.endComputerSession(workspaceId, computerSessionId, {\n operationId,\n });\n setState((current) => mergeSession(current, workspaceId, response.session));\n return response;\n },\n [client, workspaceId],\n );\n\n const relevantSessions = useMemo(\n () =>\n options.sessionId\n ? visible.sessions.filter((session) =>\n session.associations.some((association) => association.sessionId === options.sessionId),\n )\n : [],\n [options.sessionId, visible.sessions],\n );\n\n return {\n revision: visible.revision,\n sessions: visible.sessions,\n relevantSessions,\n loading: visible.loading,\n refreshing: visible.refreshing,\n error: visible.error,\n refresh,\n create,\n end,\n };\n}\n\ntype ComputerRegistryState = {\n workspaceId: string;\n revision: number;\n sessions: ComputerSession[];\n loading: boolean;\n refreshing: boolean;\n error: Error | null;\n};\n\nfunction emptyState(workspaceId: string, loading: boolean): ComputerRegistryState {\n return {\n workspaceId,\n revision: 0,\n sessions: [],\n loading,\n refreshing: false,\n error: null,\n };\n}\n\nfunction sortComputerSessions(sessions: readonly ComputerSession[]): ComputerSession[] {\n return [...sessions].sort((left, right) => {\n const live = Number(isLiveComputer(right)) - Number(isLiveComputer(left));\n return (\n live ||\n timestamp(right.lastUsedAt) - timestamp(left.lastUsedAt) ||\n left.id.localeCompare(right.id)\n );\n });\n}\n\nfunction isLiveComputer(session: ComputerSession): boolean {\n return ![\"ending\", \"ended\", \"failed\", \"lost\"].includes(session.lifecycle);\n}\n\nfunction timestamp(value: string): number {\n const parsed = Date.parse(value);\n return Number.isFinite(parsed) ? parsed : 0;\n}\n\nfunction mergeSession(\n current: ComputerRegistryState,\n workspaceId: string,\n session: ComputerSession,\n): ComputerRegistryState {\n if (current.workspaceId !== workspaceId) return current;\n const sessions = current.sessions.filter((candidate) => candidate.id !== session.id);\n sessions.push(session);\n return { ...current, sessions: sortComputerSessions(sessions), error: null };\n}\n\n/** Exported for narrow proxy implementations and tests. */\nexport type ComputerSessionsClient = EmbeddedComputerInteractionClientLike;\n","import type {\n ComputerAction,\n ComputerClipboard,\n ComputerFrame,\n ComputerObservation,\n ComputerSession,\n ComputerTarget,\n InteractionIntervention,\n InteractionSemanticNode,\n} from \"@opengeni/sdk/interaction\";\nimport type { DesktopStreamCapability } from \"@opengeni/sdk\";\nimport {\n ChevronDownIcon,\n CircleAlertIcon,\n KeyboardIcon,\n LoaderCircleIcon,\n LockKeyholeIcon,\n MonitorIcon,\n MousePointer2Icon,\n PanelsTopLeftIcon,\n PlusIcon,\n RefreshCwIcon,\n RotateCcwIcon,\n} from \"lucide-react\";\nimport {\n type ClipboardEvent,\n type KeyboardEvent,\n type MouseEvent,\n type PointerEvent,\n type ReactNode,\n type WheelEvent,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport {\n type ComputerFrameWebSocketFactory,\n useComputerFrameStream,\n} from \"../hooks/use-computer-frame-stream\";\nimport { useComputerSession } from \"../hooks/use-computer-session\";\nimport { useComputerSessions } from \"../hooks/use-computer-sessions\";\nimport { useInteractionInterventions } from \"../hooks/use-interaction-interventions\";\nimport { cn } from \"../lib/cn\";\nimport { copyTextToClipboard } from \"../lib/clipboard\";\nimport type { EmbeddedComputerInteractionClientOverride } from \"../session-context\";\nimport { InteractionInterventionBanner } from \"./interaction-intervention-banner\";\nimport { DesktopViewer } from \"./desktop-viewer\";\n\nexport type ComputerViewerNotification = { kind: \"error\" | \"info\"; message: string };\n\nexport type ComputerViewerProps = EmbeddedComputerInteractionClientOverride & {\n /** Selected OpenGeni agent/session. Peer ComputerSessions remain visible. */\n sessionId: string;\n enabled?: boolean | undefined;\n className?: string | undefined;\n onNotify?: ((notification: ComputerViewerNotification) => void) | undefined;\n /** Tests/demos only. Production uses the browser's native WebSocket. */\n webSocketFactory?: ComputerFrameWebSocketFactory | undefined;\n renderEmpty?: ((create: () => void, creating: boolean) => ReactNode) | undefined;\n /** Host navigation request for one exact ComputerSession. */\n requestedComputerSessionId?: string | null | undefined;\n requestedComputerRequestId?: string | number | null | undefined;\n};\n\ntype ComputerSelection = { sessionId: string; pinned: boolean } | null;\ntype PointerStart = { x: number; y: number; pointerId: number; frame: ComputerFrame };\n\n/** Full ComputerSession surface: workspace discovery, peer switching, app/window/\n * screen navigation, semantic controls, exact-frame input, and live media. */\nexport function ComputerViewer({\n sessionId,\n enabled = true,\n className,\n onNotify,\n webSocketFactory,\n renderEmpty,\n requestedComputerSessionId,\n requestedComputerRequestId,\n ...override\n}: ComputerViewerProps) {\n const registry = useComputerSessions({ ...override, sessionId, enabled });\n const createSession = registry.create;\n const refreshRegistry = registry.refresh;\n const liveRelevant = useMemo(\n () => registry.relevantSessions.filter((session) => isLiveComputer(session)),\n [registry.relevantSessions],\n );\n const recentRelevantFailure = useMemo(\n () =>\n liveRelevant.length === 0\n ? (registry.relevantSessions.find((session) =>\n [\"failed\", \"lost\"].includes(session.lifecycle),\n ) ?? null)\n : null,\n [liveRelevant.length, registry.relevantSessions],\n );\n const liveSessions = useMemo(() => {\n const sessions = registry.sessions.filter((session) => isLiveComputer(session));\n return recentRelevantFailure ? [...sessions, recentRelevantFailure] : sessions;\n }, [recentRelevantFailure, registry.sessions]);\n const relevant = useMemo(\n () =>\n liveRelevant.length > 0 ? liveRelevant : recentRelevantFailure ? [recentRelevantFailure] : [],\n [liveRelevant, recentRelevantFailure],\n );\n const [selection, setSelection] = useState<ComputerSelection>(null);\n const interventions = useInteractionInterventions({\n ...override,\n enabled,\n resourceKind: \"computer_session\",\n });\n const [creating, setCreating] = useState(false);\n const [showControls, setShowControls] = useState(false);\n const previousSessionIdRef = useRef(sessionId);\n const handledRequestRef = useRef<string | null>(null);\n const seenInterventionIdsRef = useRef(new Set<string>());\n\n const notifyError = useCallback(\n (cause: unknown, fallback: string) => {\n onNotify?.({\n kind: \"error\",\n message: cause instanceof Error ? cause.message : fallback,\n });\n },\n [onNotify],\n );\n\n useEffect(() => {\n if (previousSessionIdRef.current === sessionId) return;\n previousSessionIdRef.current = sessionId;\n handledRequestRef.current = null;\n setSelection(null);\n }, [sessionId]);\n\n useEffect(() => {\n const requested = requestedComputerSessionId\n ? (liveSessions.find((session) => session.id === requestedComputerSessionId) ?? null)\n : null;\n const requestKey = requested\n ? `${requestedComputerRequestId ?? \"default\"}:${requested.id}`\n : null;\n if (requested && requestKey && handledRequestRef.current !== requestKey) {\n handledRequestRef.current = requestKey;\n setSelection({ sessionId: requested.id, pinned: true });\n return;\n }\n\n const selectedStillLive = liveSessions.some((session) => session.id === selection?.sessionId);\n // Peer computers remain one click away, but never become the implicit\n // computer for another agent. Otherwise opening a sandbox's Computer tab\n // can silently select—and send input to—a connected user's Mac.\n if (selection?.pinned && selectedStillLive) return;\n const preferred = relevant[0] ?? null;\n if (!preferred) {\n if (selection) setSelection(null);\n return;\n }\n if (!selectedStillLive || !selection?.pinned) {\n if (selection?.sessionId !== preferred.id || selection.pinned) {\n setSelection({ sessionId: preferred.id, pinned: false });\n }\n }\n }, [liveSessions, relevant, requestedComputerRequestId, requestedComputerSessionId, selection]);\n\n const selectedRegistrySession = useMemo(\n () => liveSessions.find((session) => session.id === selection?.sessionId) ?? null,\n [liveSessions, selection?.sessionId],\n );\n const interventionCounts = useMemo(\n () => countInterventions(interventions.interventions),\n [interventions.interventions],\n );\n const selectedInterventions = useMemo(\n () =>\n interventions.interventions.filter(\n (intervention) => intervention.resourceId === selection?.sessionId,\n ),\n [interventions.interventions, selection?.sessionId],\n );\n const controllerReady = selectedRegistrySession?.lifecycle === \"active\";\n const computer = useComputerSession({\n ...override,\n computerSessionId: selection?.sessionId ?? null,\n enabled: enabled && selection !== null && controllerReady,\n });\n const act = computer.act;\n const actFromFrame = computer.actFromFrame;\n const refreshComputer = computer.refresh;\n const frames = useComputerFrameStream({\n ...override,\n computerSessionId: selection?.sessionId ?? null,\n targetId: computer.selectedTarget?.id ?? null,\n enabled: enabled && selection !== null && controllerReady && computer.selectedTarget !== null,\n stream: {\n format: \"jpeg\",\n quality: 78,\n maxWidth: 1_920,\n maxHeight: 1_200,\n everyNthFrame: 1,\n },\n ...(webSocketFactory ? { webSocketFactory } : {}),\n });\n const displayedFrame =\n frames.frame &&\n frames.frame.computerSessionId === selection?.sessionId &&\n frames.frame.targetId === computer.selectedTarget?.id\n ? frames.frame\n : null;\n const rfbStream =\n frames.attachment?.stream.kind === \"direct_rfb\" ? frames.attachment.stream : null;\n const rfbCapability = useMemo<DesktopStreamCapability | null>(() => {\n if (!rfbStream || !frames.attachment) return null;\n const bounds = computer.selectedTarget?.bounds;\n return {\n transport: \"vnc-ws\",\n client: \"novnc\",\n mode: \"interactive\",\n url: rfbStream.url,\n token: null,\n expiresAt: frames.attachment.expiresAt,\n resolution: [bounds?.width ?? 1_440, bounds?.height ?? 900],\n unredacted: true,\n requiresAcknowledgment: false,\n acknowledged: true,\n shared: false,\n sharedSessionIds: [],\n reason: null,\n };\n }, [computer.selectedTarget?.bounds, frames.attachment, rfbStream]);\n const machineLocked = selectedRegistrySession?.failureCode === \"machine_locked\";\n const currentIds = useMemo(() => new Set(relevant.map((session) => session.id)), [relevant]);\n\n useEffect(() => {\n for (const intervention of interventions.interventions) {\n if (seenInterventionIdsRef.current.has(intervention.id)) continue;\n seenInterventionIdsRef.current.add(intervention.id);\n onNotify?.({\n kind: \"info\",\n message: `${interventionTitle(intervention)}: ${intervention.reason}`,\n });\n }\n }, [interventions.interventions, onNotify]);\n\n const resolveIntervention = useCallback(\n (intervention: InteractionIntervention, outcome: \"completed\" | \"dismissed\") => {\n void interventions\n .resolve(intervention.id, {\n expectedVersion: intervention.version,\n outcome,\n })\n .then(() => {\n onNotify?.({\n kind: \"info\",\n message:\n outcome === \"completed\" ? \"Agent notified. Continuing work.\" : \"Request cancelled.\",\n });\n })\n .catch((cause) => notifyError(cause, \"Could not update the computer request.\"));\n },\n [interventions, notifyError, onNotify],\n );\n\n const createComputer = useCallback(() => {\n if (creating) return;\n setCreating(true);\n void createSession({ sessionId, name: \"Computer\" })\n .then((response) => {\n setSelection({ sessionId: response.session.id, pinned: false });\n })\n .catch((cause) => notifyError(cause, \"Could not open a computer.\"))\n .finally(() => setCreating(false));\n }, [createSession, creating, notifyError, sessionId]);\n\n const perform = useCallback(\n async (action: ComputerAction, frame: ComputerFrame | null): Promise<void> => {\n if (action.type === \"pointer\") {\n if (!frame) throw new Error(\"Computer view is not ready for pointer input.\");\n await actFromFrame(action, frame);\n } else {\n await act(action);\n }\n },\n [act, actFromFrame],\n );\n\n const copyFromRfb = useCallback(\n (event: ClipboardEvent<HTMLDivElement>) => {\n if (!rfbStream || computer.session?.capabilities?.clipboard !== true) return;\n event.preventDefault();\n event.stopPropagation();\n void perform({ type: \"clipboard\", operation: \"copy\" }, null)\n .then(() => computer.readClipboard())\n .then(async (clipboard) => {\n if (clipboard.text && !(await copyTextToClipboard(clipboard.text))) {\n throw new Error(\"Computer text could not be copied to the local clipboard\");\n }\n })\n .catch((cause) => notifyError(cause, \"Could not copy from the computer.\"));\n },\n [computer, notifyError, perform, rfbStream],\n );\n\n const pasteIntoRfb = useCallback(\n (text: string): boolean => {\n if (!rfbStream || computer.session?.capabilities?.clipboard !== true) return false;\n // Keep paste on the canonical ComputerSession action path. RFB\n // ClientCutText synchronization varies by server and can acknowledge a\n // local paste without ever updating the remote graphical seat. These two\n // awaited actions run against the exact selected ComputerSession/target.\n // Read-after-write is the causal readiness barrier on X11: clipboard\n // ownership is asynchronous, so a successful write response alone does\n // not prove that the graphical seat can already serve the selection.\n void (async () => {\n await perform({ type: \"clipboard\", operation: \"write\", text }, null);\n assertExactComputerClipboard(await computer.readClipboard(), text);\n await perform({ type: \"clipboard\", operation: \"paste\" }, null);\n })().catch((cause) => notifyError(cause, \"Could not paste into the computer.\"));\n return true;\n },\n [computer, notifyError, perform, rfbStream],\n );\n\n if (!enabled) return null;\n if (registry.loading && liveSessions.length === 0) {\n return (\n <ComputerNotice\n icon={<LoaderCircleIcon className=\"size-4 animate-spin\" />}\n text=\"Finding workspace computers…\"\n {...(className ? { className } : {})}\n />\n );\n }\n if (liveSessions.length === 0) {\n if (renderEmpty) return renderEmpty(createComputer, creating);\n return (\n <div className={cn(\"grid h-full place-items-center bg-og-bg p-6\", className)}>\n <div className=\"max-w-sm text-center\">\n <span className=\"mx-auto grid size-10 place-items-center rounded-og-lg border border-og-border bg-og-surface-1 text-og-muted\">\n <MonitorIcon className=\"size-5\" />\n </span>\n <p className=\"mt-3 text-og-menu font-medium text-og-fg\">No computer open</p>\n <p className=\"mt-1 text-og-control leading-5 text-og-muted\">\n Open this agent&apos;s desktop, or switch to any computer another workspace agent uses.\n </p>\n <button\n type=\"button\"\n onClick={createComputer}\n disabled={creating}\n className=\"mt-4 inline-flex h-8 items-center gap-1.5 rounded-og-sm bg-og-accent-deep px-3 text-og-control font-medium text-og-accent-fg transition hover:brightness-110 disabled:opacity-50\"\n >\n {creating ? (\n <LoaderCircleIcon className=\"size-3.5 animate-spin\" />\n ) : (\n <PlusIcon className=\"size-3.5\" />\n )}\n Open computer\n </button>\n {registry.error ? (\n <p className=\"mt-3 text-og-control text-og-status-error\">{registry.error.message}</p>\n ) : null}\n </div>\n </div>\n );\n }\n\n return (\n <div className={cn(\"flex h-full min-h-0 flex-col overflow-hidden bg-og-bg\", className)}>\n <ComputerToolbar\n sessions={liveSessions}\n relevantSessionIds={currentIds}\n selectedSessionId={selection?.sessionId ?? null}\n creating={creating}\n refreshing={registry.refreshing}\n interventionCounts={interventionCounts}\n onSelect={(computerSessionId) =>\n setSelection({ sessionId: computerSessionId, pinned: true })\n }\n onFollow={() => {\n if (relevant[0]) setSelection({ sessionId: relevant[0].id, pinned: false });\n }}\n onCreate={createComputer}\n onRefresh={() => void Promise.all([refreshRegistry(), refreshComputer()])}\n />\n <InteractionInterventionBanner\n interventions={selectedInterventions}\n activeTargetId={computer.selectedTarget?.id ?? null}\n mutating={interventions.mutating}\n onOpen={(intervention) =>\n void computer\n .selectTarget(intervention.targetId)\n .catch((cause) => notifyError(cause, \"Could not open the requested computer view.\"))\n }\n onResolve={resolveIntervention}\n />\n {!selectedRegistrySession ? (\n <ComputerUnselectedPanel\n peerCount={liveSessions.length}\n creating={creating}\n onCreate={createComputer}\n />\n ) : !controllerReady ? (\n <ComputerLifecyclePanel\n session={selectedRegistrySession}\n creating={creating}\n onRefresh={registry.refresh}\n onRetry={createComputer}\n />\n ) : (\n <>\n <ComputerTargetRail\n targets={computer.targets}\n selectedTargetId={computer.selectedTarget?.id ?? null}\n loading={computer.loading}\n onSelect={(targetId) =>\n void computer\n .selectTarget(targetId)\n .catch((cause) => notifyError(cause, \"Could not switch computer views.\"))\n }\n />\n <div className=\"flex min-h-0 flex-1\">\n {rfbStream ? (\n <div className=\"relative min-h-0 flex-1 bg-black\" onCopyCapture={copyFromRfb}>\n <DesktopViewer\n capability={rfbCapability}\n interactive\n showControlToggle={false}\n webSocketProtocols={rfbStream.protocols}\n onPasteText={pasteIntoRfb}\n targetPlatform={computer.session?.platform ?? null}\n className=\"h-full\"\n />\n </div>\n ) : (\n <ComputerViewport\n frame={machineLocked ? null : displayedFrame}\n observation={computer.observation}\n target={computer.selectedTarget}\n machineLocked={machineLocked}\n connectionState={frames.state}\n connectionError={frames.error ?? computer.error}\n mutating={computer.mutating}\n backgroundActions={computer.session?.capabilities?.backgroundActions === true}\n clipboardEnabled={computer.session?.capabilities?.clipboard === true}\n onAction={perform}\n onReadClipboard={computer.readClipboard}\n onReconnect={frames.reconnect}\n onError={(cause) => notifyError(cause, \"Computer input failed.\")}\n />\n )}\n {showControls ? (\n <ComputerSemanticPanel\n observation={computer.observation}\n mutating={computer.mutating}\n onAction={(action) =>\n void perform(action, null).catch((cause) =>\n notifyError(cause, \"Computer action failed.\"),\n )\n }\n />\n ) : null}\n </div>\n <ComputerStatusBar\n session={computer.session}\n target={computer.selectedTarget}\n connectionState={frames.state}\n refreshing={registry.refreshing}\n showControls={showControls}\n controlCount={semanticNodes(computer.observation).length}\n onToggleControls={() => setShowControls((current) => !current)}\n />\n </>\n )}\n </div>\n );\n}\n\nfunction ComputerUnselectedPanel(props: {\n peerCount: number;\n creating: boolean;\n onCreate: () => void;\n}) {\n return (\n <div className=\"grid min-h-0 flex-1 place-items-center bg-og-bg p-6 text-center\">\n <div className=\"max-w-sm\">\n <span className=\"mx-auto grid size-10 place-items-center rounded-og-md border border-og-border bg-og-surface-1 text-og-muted\">\n <MonitorIcon className=\"size-4.5\" />\n </span>\n <p className=\"mt-3 text-og-menu font-medium text-og-fg\">No computer for this agent</p>\n <p className=\"mt-1 text-og-control leading-5 text-og-muted\">\n {props.peerCount === 1\n ? \"One workspace computer is available from the computer menu.\"\n : `${props.peerCount} workspace computers are available from the computer menu.`}\n </p>\n <button\n type=\"button\"\n disabled={props.creating}\n onClick={props.onCreate}\n className=\"mt-4 inline-flex h-8 items-center gap-1.5 rounded-og-sm border border-og-border bg-og-surface-1 px-3 text-og-control font-medium text-og-fg transition hover:bg-og-surface-2 disabled:cursor-not-allowed disabled:opacity-50\"\n >\n {props.creating ? (\n <LoaderCircleIcon className=\"size-3.5 animate-spin\" />\n ) : (\n <PlusIcon className=\"size-3.5\" />\n )}\n {props.creating ? \"Opening…\" : \"New computer\"}\n </button>\n </div>\n </div>\n );\n}\n\nfunction ComputerToolbar(props: {\n sessions: ComputerSession[];\n relevantSessionIds: Set<string>;\n selectedSessionId: string | null;\n creating: boolean;\n refreshing: boolean;\n interventionCounts: Map<string, number>;\n onSelect: (id: string) => void;\n onFollow: () => void;\n onCreate: () => void;\n onRefresh: () => void;\n}) {\n const detailsRef = useRef<HTMLDetailsElement | null>(null);\n const selected = props.sessions.find((session) => session.id === props.selectedSessionId);\n const current = props.sessions.filter((session) => props.relevantSessionIds.has(session.id));\n const others = props.sessions.filter((session) => !props.relevantSessionIds.has(session.id));\n const choose = (id: string) => {\n props.onSelect(id);\n detailsRef.current?.removeAttribute(\"open\");\n };\n return (\n <div className=\"flex h-10 shrink-0 items-center gap-1.5 border-b border-og-border bg-og-surface-0 px-2\">\n <details ref={detailsRef} className=\"relative min-w-0\">\n <summary className=\"flex h-7 max-w-52 cursor-pointer list-none items-center gap-2 rounded-og-sm px-2 text-og-control text-og-fg transition hover:bg-og-surface-2 [&::-webkit-details-marker]:hidden\">\n <MonitorIcon className=\"size-3.5 shrink-0 text-og-muted\" />\n <span className=\"truncate font-medium\">{selected?.name ?? \"Computer\"}</span>\n {(props.interventionCounts.get(selected?.id ?? \"\") ?? 0) > 0 ? (\n <span className=\"size-1.5 shrink-0 rounded-full bg-og-status-waiting\" />\n ) : null}\n <ChevronDownIcon className=\"size-3 shrink-0 text-og-subtle\" />\n </summary>\n <div className=\"absolute left-0 top-8 z-30 w-72 overflow-hidden rounded-og-md border border-og-border bg-og-surface-1 p-1 shadow-xl\">\n <ComputerSessionGroup\n label=\"Current agent\"\n sessions={current}\n selectedId={props.selectedSessionId}\n interventionCounts={props.interventionCounts}\n onSelect={choose}\n />\n <ComputerSessionGroup\n label=\"Other agents\"\n sessions={others}\n selectedId={props.selectedSessionId}\n interventionCounts={props.interventionCounts}\n onSelect={choose}\n />\n <div className=\"mt-1 flex gap-1 border-t border-og-border pt-1\">\n {current.length > 0 ? (\n <MenuButton onClick={props.onFollow}>Follow agent</MenuButton>\n ) : null}\n <MenuButton onClick={props.onCreate} disabled={props.creating}>\n <PlusIcon className=\"size-3.5\" /> New computer\n </MenuButton>\n </div>\n </div>\n </details>\n <span className=\"min-w-0 flex-1 truncate text-og-xs text-og-subtle\">\n {selected ? `${platformLabel(selected)} · ${placementLabel(selected)}` : \"\"}\n </span>\n <button\n type=\"button\"\n onClick={props.onRefresh}\n className=\"grid size-7 place-items-center rounded-og-sm text-og-muted transition hover:bg-og-surface-2 hover:text-og-fg\"\n aria-label=\"Refresh computers\"\n >\n <RefreshCwIcon className={cn(\"size-3.5\", props.refreshing && \"animate-spin\")} />\n </button>\n <button\n type=\"button\"\n onClick={props.onCreate}\n disabled={props.creating}\n className=\"grid size-7 place-items-center rounded-og-sm text-og-muted transition hover:bg-og-surface-2 hover:text-og-fg disabled:opacity-40\"\n aria-label=\"Open a new computer\"\n >\n {props.creating ? (\n <LoaderCircleIcon className=\"size-3.5 animate-spin\" />\n ) : (\n <PlusIcon className=\"size-3.5\" />\n )}\n </button>\n </div>\n );\n}\n\nfunction ComputerSessionGroup(props: {\n label: string;\n sessions: ComputerSession[];\n selectedId: string | null;\n interventionCounts: Map<string, number>;\n onSelect: (id: string) => void;\n}) {\n if (props.sessions.length === 0) return null;\n return (\n <div className=\"py-1\">\n <p className=\"px-2 pb-1 text-[10px] font-medium uppercase tracking-[0.12em] text-og-subtle\">\n {props.label}\n </p>\n {props.sessions.map((session) => {\n const interventionCount = props.interventionCounts.get(session.id) ?? 0;\n return (\n <button\n key={session.id}\n type=\"button\"\n onClick={() => props.onSelect(session.id)}\n className={cn(\n \"flex w-full items-center gap-2 rounded-og-sm px-2 py-1.5 text-left transition hover:bg-og-surface-2\",\n session.id === props.selectedId && \"bg-og-surface-2\",\n )}\n >\n <span\n className={cn(\n \"size-1.5 rounded-full\",\n session.lifecycle === \"active\" ? \"bg-og-status-running\" : \"bg-og-muted\",\n )}\n />\n <span className=\"min-w-0 flex-1\">\n <span className=\"block truncate text-og-control text-og-fg\">{session.name}</span>\n <span className=\"block truncate text-og-xs text-og-subtle\">\n {platformLabel(session)} · {placementLabel(session)}\n </span>\n </span>\n {interventionCount > 0 ? (\n <span className=\"rounded-full bg-og-status-waiting/10 px-1.5 py-0.5 text-[10px] font-medium text-og-status-waiting\">\n {interventionCount}\n </span>\n ) : null}\n </button>\n );\n })}\n </div>\n );\n}\n\nfunction MenuButton(props: { children: ReactNode; onClick: () => void; disabled?: boolean }) {\n return (\n <button\n type=\"button\"\n onClick={props.onClick}\n disabled={props.disabled}\n className=\"flex h-7 flex-1 items-center justify-center gap-1 rounded-og-sm px-2 text-og-control text-og-muted transition hover:bg-og-surface-2 hover:text-og-fg disabled:opacity-50\"\n >\n {props.children}\n </button>\n );\n}\n\nfunction ComputerTargetRail(props: {\n targets: ComputerTarget[];\n selectedTargetId: string | null;\n loading: boolean;\n onSelect: (id: string) => void;\n}) {\n const visualTargets = props.targets.filter(isRenderableComputerView);\n return (\n <div\n className=\"flex h-10 shrink-0 items-center gap-1 overflow-x-auto border-b border-og-border bg-og-surface-0 px-2\"\n aria-label=\"Computer views\"\n >\n {visualTargets.map((target) => (\n <button\n key={target.id}\n type=\"button\"\n onClick={() => props.onSelect(target.id)}\n className={cn(\n \"flex h-7 max-w-56 shrink-0 items-center gap-1.5 rounded-og-sm border px-2 text-og-control transition\",\n target.id === props.selectedTargetId\n ? \"border-og-border-strong bg-og-surface-2 text-og-fg\"\n : \"border-transparent text-og-muted hover:bg-og-surface-1 hover:text-og-fg\",\n )}\n aria-pressed={target.id === props.selectedTargetId}\n >\n {target.kind === \"screen\" ? (\n <MonitorIcon className=\"size-3.5 shrink-0\" />\n ) : (\n <PanelsTopLeftIcon className=\"size-3.5 shrink-0\" />\n )}\n <span className=\"truncate\">{target.title || target.applicationId || target.kind}</span>\n {target.focused ? (\n <span\n className=\"size-1.5 shrink-0 rounded-full bg-og-status-running\"\n aria-label=\"Focused\"\n />\n ) : null}\n </button>\n ))}\n {props.loading ? (\n <LoaderCircleIcon className=\"ml-1 size-3.5 animate-spin text-og-muted\" />\n ) : null}\n {!props.loading && visualTargets.length === 0 ? (\n <span className=\"text-og-xs text-og-subtle\">Waiting for apps and screens…</span>\n ) : null}\n </div>\n );\n}\n\nfunction isRenderableComputerView(target: ComputerTarget): boolean {\n if (target.kind === \"screen\") return true;\n if (target.kind !== \"window\" || !target.bounds) return false;\n // AX exposes applications and tiny utility/menu windows as valid semantic\n // targets. Keep those available to tools, but do not present them as visual\n // desktop tabs when they cannot form a useful live view.\n return target.bounds.width >= 160 && target.bounds.height >= 90;\n}\n\nfunction ComputerLifecyclePanel(props: {\n session: ComputerSession;\n creating: boolean;\n onRefresh: () => Promise<void>;\n onRetry: () => void;\n}) {\n const failed = [\"failed\", \"lost\", \"repair_required\"].includes(props.session.lifecycle);\n const retryCreatesSession = [\"failed\", \"lost\"].includes(props.session.lifecycle);\n return (\n <div className=\"grid min-h-0 flex-1 place-items-center bg-og-bg p-6\">\n <div className=\"max-w-sm text-center\">\n {failed ? (\n <CircleAlertIcon className=\"mx-auto size-5 text-og-status-error\" />\n ) : (\n <LoaderCircleIcon className=\"mx-auto size-5 animate-spin text-og-muted\" />\n )}\n <p className=\"mt-3 text-og-menu font-medium text-og-fg\">\n {failed ? \"Computer needs attention\" : lifecycleLabel(props.session.lifecycle)}\n </p>\n <p className=\"mt-1 text-og-control leading-5 text-og-muted\">\n {computerFailureMessage(props.session) ??\n \"The computer is being prepared on its placement. It will appear here when ready.\"}\n </p>\n {failed ? (\n <button\n type=\"button\"\n onClick={() => (retryCreatesSession ? props.onRetry() : void props.onRefresh())}\n disabled={props.creating}\n className=\"mt-4 inline-flex h-8 items-center gap-1.5 rounded-og-sm border border-og-border bg-og-surface-1 px-3 text-og-control font-medium text-og-fg transition hover:bg-og-surface-2\"\n >\n {props.creating ? (\n <LoaderCircleIcon className=\"size-3.5 animate-spin\" />\n ) : (\n <RotateCcwIcon className=\"size-3.5\" />\n )}\n {retryCreatesSession ? \"Try again\" : \"Check again\"}\n </button>\n ) : null}\n </div>\n </div>\n );\n}\n\nfunction ComputerViewport(props: {\n frame: ComputerFrame | null;\n observation: ComputerObservation | null;\n target: ComputerTarget | null;\n machineLocked: boolean;\n connectionState: string;\n connectionError: Error | null;\n mutating: boolean;\n backgroundActions: boolean;\n clipboardEnabled: boolean;\n onAction: (action: ComputerAction, frame: ComputerFrame | null) => Promise<void>;\n onReadClipboard: () => Promise<ComputerClipboard>;\n onReconnect: () => void;\n onError: (cause: unknown) => void;\n}) {\n const canvasRef = useRef<HTMLCanvasElement | null>(null);\n const inputRef = useRef<HTMLTextAreaElement | null>(null);\n const pointerStartRef = useRef<PointerStart | null>(null);\n const clickTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const lastClickRef = useRef<{\n at: number;\n x: number;\n y: number;\n frame: ComputerFrame;\n } | null>(null);\n const wheelRef = useRef<{\n x: number;\n y: number;\n deltaX: number;\n deltaY: number;\n frame: ComputerFrame;\n timer: ReturnType<typeof setTimeout> | null;\n } | null>(null);\n const pendingTextRef = useRef<{\n text: string;\n timer: ReturnType<typeof setTimeout>;\n } | null>(null);\n const actionRef = useRef(props.onAction);\n const readClipboardRef = useRef(props.onReadClipboard);\n const errorRef = useRef(props.onError);\n const actionTailRef = useRef<Promise<void>>(Promise.resolve());\n const queuedFrameRef = useRef<ComputerFrame | null>(null);\n const decodingFrameRef = useRef(false);\n const mountedRef = useRef(true);\n actionRef.current = props.onAction;\n readClipboardRef.current = props.onReadClipboard;\n errorRef.current = props.onError;\n const rawInputEnabled =\n !props.backgroundActions || props.target?.kind === \"screen\" || props.target?.focused === true;\n\n const paintQueuedFrames = useCallback(() => {\n if (decodingFrameRef.current) return;\n decodingFrameRef.current = true;\n void (async () => {\n try {\n while (mountedRef.current) {\n const frame = queuedFrameRef.current;\n queuedFrameRef.current = null;\n if (!frame) break;\n let objectUrl: string | null = null;\n try {\n const blob = new Blob([frame.data.slice().buffer], { type: frame.mediaType });\n if (typeof createImageBitmap === \"function\") {\n const bitmap = await createImageBitmap(blob);\n try {\n const canvas = canvasRef.current;\n if (mountedRef.current && canvas) {\n paintCanvas(canvas, bitmap, frame.width, frame.height);\n }\n } finally {\n bitmap.close();\n }\n continue;\n }\n objectUrl = URL.createObjectURL(blob);\n const image = await loadImage(objectUrl);\n const canvas = canvasRef.current;\n if (mountedRef.current && canvas) {\n paintCanvas(canvas, image, frame.width, frame.height);\n }\n } catch (cause) {\n if (mountedRef.current) errorRef.current(cause);\n } finally {\n if (objectUrl) URL.revokeObjectURL(objectUrl);\n }\n }\n } finally {\n decodingFrameRef.current = false;\n if (mountedRef.current && queuedFrameRef.current) paintQueuedFrames();\n }\n })();\n }, []);\n\n useEffect(() => {\n mountedRef.current = true;\n return () => {\n mountedRef.current = false;\n queuedFrameRef.current = null;\n };\n }, []);\n\n useEffect(() => {\n if (!props.frame) return;\n queuedFrameRef.current = props.frame;\n paintQueuedFrames();\n }, [paintQueuedFrames, props.frame]);\n\n useEffect(\n () => () => {\n if (clickTimerRef.current) clearTimeout(clickTimerRef.current);\n if (wheelRef.current?.timer) clearTimeout(wheelRef.current.timer);\n if (pendingTextRef.current?.timer) clearTimeout(pendingTextRef.current.timer);\n },\n [],\n );\n\n const enqueue = useCallback(\n (action: ComputerAction, frame: ComputerFrame | null, after?: () => Promise<void>) => {\n actionTailRef.current = actionTailRef.current\n .catch(() => undefined)\n .then(async () => {\n await actionRef.current(action, frame);\n await after?.();\n })\n .catch((cause) => errorRef.current(cause));\n },\n [],\n );\n\n const point = useCallback(\n (frame: ComputerFrame, clientX: number, clientY: number) =>\n computerPoint(canvasRef.current, frame, clientX, clientY),\n [],\n );\n\n const flushPendingText = useCallback(() => {\n const pending = pendingTextRef.current;\n if (!pending) return;\n clearTimeout(pending.timer);\n pendingTextRef.current = null;\n enqueue({ type: \"keyboard\", action: \"type\", value: pending.text }, null);\n }, [enqueue]);\n\n const flushPendingClick = useCallback(() => {\n const pending = lastClickRef.current;\n if (!pending) return;\n if (clickTimerRef.current) clearTimeout(clickTimerRef.current);\n clickTimerRef.current = null;\n lastClickRef.current = null;\n enqueue(\n {\n type: \"pointer\",\n frameId: pending.frame.frameId,\n action: \"click\",\n x: pending.x,\n y: pending.y,\n },\n pending.frame,\n );\n }, [enqueue]);\n\n const pointerDown = (event: PointerEvent<HTMLCanvasElement>) => {\n if (!props.frame || props.mutating || !rawInputEnabled || event.button !== 0) return;\n flushPendingText();\n pointerStartRef.current = {\n x: event.clientX,\n y: event.clientY,\n pointerId: event.pointerId,\n frame: props.frame,\n };\n event.currentTarget.setPointerCapture?.(event.pointerId);\n inputRef.current?.focus({ preventScroll: true });\n };\n\n const pointerUp = (event: PointerEvent<HTMLCanvasElement>) => {\n if (!rawInputEnabled) return;\n const start = pointerStartRef.current;\n pointerStartRef.current = null;\n if (!start || start.pointerId !== event.pointerId) return;\n const from = point(start.frame, start.x, start.y);\n const to = point(start.frame, event.clientX, event.clientY);\n if (!from || !to) return;\n if (Math.hypot(event.clientX - start.x, event.clientY - start.y) > 5) {\n flushPendingClick();\n enqueue(\n {\n type: \"pointer\",\n frameId: start.frame.frameId,\n action: \"drag\",\n x: from.x,\n y: from.y,\n endX: to.x,\n endY: to.y,\n },\n start.frame,\n );\n return;\n }\n const now = Date.now();\n const previous = lastClickRef.current;\n if (\n previous &&\n now - previous.at < 280 &&\n Math.hypot(previous.x - to.x, previous.y - to.y) < 6 &&\n sameFrameFence(previous.frame, start.frame)\n ) {\n if (clickTimerRef.current) clearTimeout(clickTimerRef.current);\n clickTimerRef.current = null;\n lastClickRef.current = null;\n enqueue(\n {\n type: \"pointer\",\n frameId: start.frame.frameId,\n action: \"double_click\",\n x: to.x,\n y: to.y,\n },\n start.frame,\n );\n return;\n }\n lastClickRef.current = { at: now, x: to.x, y: to.y, frame: start.frame };\n clickTimerRef.current = setTimeout(() => {\n clickTimerRef.current = null;\n lastClickRef.current = null;\n enqueue(\n {\n type: \"pointer\",\n frameId: start.frame.frameId,\n action: \"click\",\n x: to.x,\n y: to.y,\n },\n start.frame,\n );\n }, 280);\n };\n\n const contextMenu = (event: MouseEvent<HTMLCanvasElement>) => {\n event.preventDefault();\n if (!rawInputEnabled) return;\n const frame = props.frame;\n if (!frame) return;\n flushPendingText();\n flushPendingClick();\n const at = point(frame, event.clientX, event.clientY);\n if (at) {\n enqueue(\n {\n type: \"pointer\",\n frameId: frame.frameId,\n action: \"click\",\n x: at.x,\n y: at.y,\n button: \"right\",\n },\n frame,\n );\n }\n };\n\n const wheel = (event: WheelEvent<HTMLCanvasElement>) => {\n if (!rawInputEnabled) return;\n const frame = props.frame;\n if (!frame) return;\n const at = point(frame, event.clientX, event.clientY);\n if (!at) return;\n flushPendingText();\n flushPendingClick();\n event.preventDefault();\n const pending = wheelRef.current;\n if (pending?.timer) clearTimeout(pending.timer);\n wheelRef.current = {\n x: at.x,\n y: at.y,\n deltaX: (pending && sameFrameFence(pending.frame, frame) ? pending.deltaX : 0) + event.deltaX,\n deltaY: (pending && sameFrameFence(pending.frame, frame) ? pending.deltaY : 0) + event.deltaY,\n frame,\n timer: setTimeout(() => {\n const batch = wheelRef.current;\n wheelRef.current = null;\n if (batch) {\n enqueue(\n {\n type: \"pointer\",\n frameId: batch.frame.frameId,\n action: \"scroll\",\n x: batch.x,\n y: batch.y,\n deltaX: batch.deltaX,\n deltaY: batch.deltaY,\n },\n batch.frame,\n );\n }\n }, 45),\n };\n };\n\n const keyDown = (event: KeyboardEvent<HTMLTextAreaElement>) => {\n if (!rawInputEnabled) return;\n const command = event.metaKey || event.ctrlKey;\n if (\n props.clipboardEnabled &&\n command &&\n !event.altKey &&\n [\"c\", \"v\"].includes(event.key.toLowerCase())\n ) {\n flushPendingText();\n return;\n }\n const key = computerKey(event);\n if (!key) return;\n event.preventDefault();\n flushPendingText();\n flushPendingClick();\n enqueue({ type: \"keyboard\", action: \"press\", value: key }, null);\n };\n\n const copy = (event: ClipboardEvent<HTMLTextAreaElement>) => {\n if (!props.clipboardEnabled || !rawInputEnabled) return;\n event.preventDefault();\n flushPendingText();\n flushPendingClick();\n enqueue({ type: \"clipboard\", operation: \"copy\" }, null, async () => {\n const clipboard = await readClipboardRef.current();\n if (!clipboard.text) return;\n if (!(await copyTextToClipboard(clipboard.text))) {\n throw new Error(\"Computer text could not be copied to the local clipboard\");\n }\n });\n };\n\n const paste = (event: ClipboardEvent<HTMLTextAreaElement>) => {\n if (!props.clipboardEnabled || !rawInputEnabled) return;\n event.preventDefault();\n flushPendingText();\n flushPendingClick();\n const text = event.clipboardData.getData(\"text/plain\");\n enqueue({ type: \"clipboard\", operation: \"write\", text }, null, async () => {\n assertExactComputerClipboard(await readClipboardRef.current(), text);\n await actionRef.current({ type: \"clipboard\", operation: \"paste\" }, null);\n });\n };\n\n const input = (value: string) => {\n if (!value || !rawInputEnabled) return;\n flushPendingClick();\n const pending = pendingTextRef.current;\n if (pending) {\n clearTimeout(pending.timer);\n pending.text += value;\n pending.timer = setTimeout(flushPendingText, 16);\n } else {\n pendingTextRef.current = {\n text: value,\n timer: setTimeout(flushPendingText, 16),\n };\n }\n if (inputRef.current) inputRef.current.value = \"\";\n };\n\n const showCanvas = props.frame !== null && !props.machineLocked;\n return (\n <div className=\"relative min-h-0 flex-1 overflow-hidden bg-black\">\n <canvas\n ref={canvasRef}\n className={cn(\n \"absolute inset-0 m-auto max-h-full max-w-full touch-none focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-og-accent\",\n !showCanvas && \"invisible\",\n !rawInputEnabled && \"cursor-default\",\n )}\n onPointerDown={pointerDown}\n onPointerUp={pointerUp}\n onPointerCancel={() => {\n pointerStartRef.current = null;\n }}\n onContextMenu={contextMenu}\n onWheel={wheel}\n aria-label={`Interactive ${props.target?.kind ?? \"computer\"} view`}\n />\n <textarea\n ref={inputRef}\n defaultValue=\"\"\n onInput={(event) => input(event.currentTarget.value)}\n onKeyDown={keyDown}\n onCopy={copy}\n onPaste={paste}\n className=\"pointer-events-none absolute left-1/2 top-1/2 size-px resize-none overflow-hidden opacity-0\"\n aria-label=\"Computer keyboard input\"\n autoCapitalize=\"off\"\n autoCorrect=\"off\"\n spellCheck={false}\n disabled={!rawInputEnabled}\n />\n {!showCanvas ? (\n <ComputerViewportFallback\n observation={props.observation}\n machineLocked={props.machineLocked}\n connectionState={props.connectionState}\n error={props.connectionError}\n onAction={(action) => enqueue(action, null)}\n onReconnect={props.onReconnect}\n />\n ) : null}\n {props.mutating ? (\n <div className=\"pointer-events-none absolute right-3 top-3 flex items-center gap-1.5 rounded-full border border-white/10 bg-black/65 px-2.5 py-1 text-[11px] text-white/80 backdrop-blur\">\n <LoaderCircleIcon className=\"size-3 animate-spin\" /> Acting\n </div>\n ) : null}\n {showCanvas && !rawInputEnabled ? (\n <div className=\"absolute bottom-3 left-1/2 flex -translate-x-1/2 items-center gap-2 rounded-full border border-white/10 bg-black/70 py-1 pl-3 pr-1 text-[11px] text-white/80 backdrop-blur\">\n <span>Background view · use native controls</span>\n {props.target ? (\n <button\n type=\"button\"\n disabled={props.mutating}\n onClick={() => enqueue({ type: \"focus\", targetId: props.target!.id }, null)}\n className=\"rounded-full bg-white/10 px-2 py-0.5 font-medium text-white transition hover:bg-white/20 disabled:opacity-50\"\n >\n Control directly\n </button>\n ) : null}\n </div>\n ) : null}\n </div>\n );\n}\n\nfunction assertExactComputerClipboard(clipboard: ComputerClipboard, expected: string): void {\n if (clipboard.truncated || clipboard.text !== expected) {\n throw new Error(\"Computer clipboard did not accept the exact pasted text\");\n }\n}\n\nfunction ComputerViewportFallback(props: {\n observation: ComputerObservation | null;\n machineLocked: boolean;\n connectionState: string;\n error: Error | null;\n onAction: (action: ComputerAction) => void;\n onReconnect: () => void;\n}) {\n if (props.machineLocked) {\n return (\n <div className=\"absolute inset-0 grid place-items-center bg-og-bg p-6\">\n <div className=\"max-w-sm text-center\">\n <LockKeyholeIcon className=\"mx-auto size-6 text-og-muted\" />\n <p className=\"mt-3 text-og-menu font-medium text-og-fg\">Machine locked</p>\n <p className=\"mt-1 text-og-control leading-5 text-og-muted\">\n Live frames and input stay private until someone unlocks the machine.\n </p>\n </div>\n </div>\n );\n }\n const interactive = semanticNodes(props.observation)\n .filter((node) => semanticAction(node) !== null)\n .slice(0, 10);\n return (\n <div className=\"absolute inset-0 grid place-items-center bg-og-bg p-6\">\n <div className=\"w-full max-w-md rounded-og-lg border border-og-border bg-og-surface-0 p-4 shadow-lg\">\n <div className=\"flex items-center gap-2\">\n {props.error ? (\n <CircleAlertIcon className=\"size-4 text-og-status-error\" />\n ) : (\n <LoaderCircleIcon className=\"size-4 animate-spin text-og-muted\" />\n )}\n <p className=\"text-og-menu font-medium text-og-fg\">\n {props.error\n ? \"Live view disconnected\"\n : computerConnectionLabel(props.connectionState)}\n </p>\n </div>\n {interactive.length > 0 ? (\n <div className=\"mt-3 border-t border-og-border pt-3\">\n <p className=\"mb-2 text-og-xs text-og-subtle\">Native controls remain available</p>\n <div className=\"flex flex-wrap gap-1.5\">\n {interactive.map((node) => (\n <button\n key={node.ref}\n type=\"button\"\n onClick={() => {\n const action = semanticAction(node);\n if (action) props.onAction(action);\n }}\n className=\"rounded-og-sm border border-og-border bg-og-surface-1 px-2 py-1 text-og-control text-og-fg transition hover:bg-og-surface-2\"\n >\n {node.name || node.role}\n </button>\n ))}\n </div>\n </div>\n ) : null}\n {props.error ? (\n <button\n type=\"button\"\n onClick={props.onReconnect}\n className=\"mt-3 text-og-control font-medium text-og-accent hover:underline\"\n >\n Reconnect\n </button>\n ) : null}\n </div>\n </div>\n );\n}\n\nfunction ComputerSemanticPanel(props: {\n observation: ComputerObservation | null;\n mutating: boolean;\n onAction: (action: ComputerAction) => void;\n}) {\n const nodes = semanticNodes(props.observation).slice(0, 100);\n return (\n <aside className=\"w-64 shrink-0 overflow-y-auto border-l border-og-border bg-og-surface-0 p-2\">\n <div className=\"mb-2 flex items-center gap-1.5 px-1 text-og-xs font-medium uppercase tracking-[0.1em] text-og-subtle\">\n <KeyboardIcon className=\"size-3\" /> Native controls\n </div>\n {nodes.length === 0 ? (\n <p className=\"px-1 py-2 text-og-control leading-5 text-og-muted\">\n This view has no accessibility controls. Use the live image instead.\n </p>\n ) : (\n <div className=\"space-y-0.5\">\n {nodes.map((node) => (\n <ComputerSemanticControl\n key={node.ref}\n node={node}\n mutating={props.mutating}\n onAction={props.onAction}\n />\n ))}\n </div>\n )}\n </aside>\n );\n}\n\nfunction ComputerSemanticControl(props: {\n node: InteractionSemanticNode;\n mutating: boolean;\n onAction: (action: ComputerAction) => void;\n}) {\n const { node } = props;\n const editable = node.actions.includes(\"set_value\");\n const action = semanticAction(node);\n const observedValue = semanticValue(node) ?? \"\";\n const [value, setValue] = useState(() => observedValue);\n\n useEffect(() => {\n setValue(observedValue);\n }, [node.ref, observedValue]);\n\n if (editable) {\n return (\n <form\n className=\"rounded-og-sm px-2 py-1.5 hover:bg-og-surface-2\"\n onSubmit={(event) => {\n event.preventDefault();\n props.onAction({\n type: \"semantic\",\n locator: { kind: \"ref\", ref: node.ref },\n action: \"set_value\",\n value,\n });\n }}\n >\n <label className=\"block truncate text-[10px] uppercase text-og-subtle\">\n {node.name || node.identifier || node.role}\n </label>\n <div className=\"mt-1 flex gap-1\">\n <input\n value={value}\n disabled={props.mutating}\n onChange={(event) => setValue(event.currentTarget.value)}\n className=\"min-w-0 flex-1 rounded-og-sm border border-og-border bg-og-surface-1 px-1.5 py-1 text-og-control text-og-fg outline-hidden focus:border-og-accent\"\n aria-label={`Set ${node.name || node.identifier || node.role}`}\n />\n <button\n type=\"submit\"\n disabled={props.mutating}\n className=\"rounded-og-sm border border-og-border bg-og-surface-1 px-2 text-og-control font-medium text-og-fg transition hover:bg-og-surface-2 disabled:opacity-50\"\n >\n Set\n </button>\n </div>\n </form>\n );\n }\n\n return (\n <button\n type=\"button\"\n disabled={!action || props.mutating}\n onClick={() => {\n if (action) props.onAction(action);\n }}\n className=\"flex w-full items-start gap-2 rounded-og-sm px-2 py-1.5 text-left transition hover:bg-og-surface-2 disabled:cursor-default disabled:hover:bg-transparent\"\n >\n <span className=\"mt-0.5 text-[10px] uppercase text-og-subtle\">{node.role}</span>\n <span className=\"min-w-0 flex-1 truncate text-og-control text-og-fg\">\n {node.name || semanticValue(node) || node.identifier || \"Unnamed control\"}\n </span>\n </button>\n );\n}\n\nfunction ComputerStatusBar(props: {\n session: ComputerSession | null;\n target: ComputerTarget | null;\n connectionState: string;\n refreshing: boolean;\n showControls: boolean;\n controlCount: number;\n onToggleControls: () => void;\n}) {\n const screen = props.target?.kind === \"screen\";\n return (\n <div className=\"flex h-8 shrink-0 items-center gap-2 border-t border-og-border bg-og-surface-0 px-2 text-og-xs text-og-subtle\">\n <span\n className={cn(\n \"size-1.5 rounded-full\",\n props.connectionState === \"live\" ? \"bg-og-status-running\" : \"bg-og-muted\",\n )}\n />\n <span>\n {props.connectionState === \"live\" ? \"Live\" : computerConnectionLabel(props.connectionState)}\n </span>\n <span className=\"min-w-0 flex-1 truncate\">\n {screen\n ? \"Full screen · input may move pointer and focus\"\n : props.session?.capabilities?.backgroundActions\n ? \"Window · semantic controls stay in the background\"\n : (props.target?.kind ?? \"Computer\")}\n </span>\n {screen ? <MousePointer2Icon className=\"size-3\" aria-hidden /> : null}\n {props.refreshing ? <LoaderCircleIcon className=\"size-3 animate-spin\" /> : null}\n <button\n type=\"button\"\n onClick={props.onToggleControls}\n aria-pressed={props.showControls}\n className={cn(\n \"rounded px-1.5 py-0.5 transition hover:bg-og-surface-2 hover:text-og-fg\",\n props.showControls && \"bg-og-surface-2 text-og-fg\",\n )}\n >\n Controls {props.controlCount}\n </button>\n </div>\n );\n}\n\nfunction ComputerNotice(props: { icon: ReactNode; text: string; className?: string }) {\n return (\n <div\n className={cn(\n \"grid h-full place-items-center bg-og-bg text-og-control text-og-muted\",\n props.className,\n )}\n >\n <div className=\"flex items-center gap-2\">\n {props.icon}\n {props.text}\n </div>\n </div>\n );\n}\n\nfunction semanticNodes(observation: ComputerObservation | null): InteractionSemanticNode[] {\n if (observation?.semantic?.kind !== \"snapshot\") return [];\n const result: InteractionSemanticNode[] = [];\n const visit = (node: InteractionSemanticNode) => {\n result.push(node);\n node.children?.forEach(visit);\n };\n observation.semantic.roots.forEach(visit);\n return result;\n}\n\nfunction semanticAction(node: InteractionSemanticNode): ComputerAction | null {\n const invoke = [\"invoke\", \"press\", \"click\"].some((action) => node.actions.includes(action));\n if (invoke) {\n return {\n type: \"semantic\",\n locator: { kind: \"ref\", ref: node.ref },\n action: \"invoke\",\n };\n }\n // A row in the background-native controls panel must never become an\n // implicit foregrounding gesture. Focus remains available through the typed\n // SDK/tool action when the caller explicitly intends to take the shared seat.\n return null;\n}\n\nfunction semanticValue(node: InteractionSemanticNode): string | null {\n return typeof node.value === \"string\" ? node.value : null;\n}\n\nfunction paintCanvas(\n canvas: HTMLCanvasElement,\n image: CanvasImageSource,\n width: number,\n height: number,\n): void {\n canvas.width = width;\n canvas.height = height;\n const context = canvas.getContext(\"2d\", { alpha: false });\n if (!context) throw new Error(\"Computer canvas is unavailable.\");\n context.drawImage(image, 0, 0, width, height);\n}\n\nfunction loadImage(url: string): Promise<HTMLImageElement> {\n return new Promise((resolve, reject) => {\n const image = new Image();\n image.onload = () => resolve(image);\n image.onerror = () => reject(new Error(\"Computer frame image could not be decoded.\"));\n image.src = url;\n });\n}\n\nfunction computerPoint(\n canvas: HTMLCanvasElement | null,\n frame: ComputerFrame,\n clientX: number,\n clientY: number,\n): { x: number; y: number } | null {\n if (!canvas) return null;\n const rect = canvas.getBoundingClientRect();\n if (rect.width <= 0 || rect.height <= 0) return null;\n return {\n x: Math.max(0, Math.min(frame.width - 1, ((clientX - rect.left) / rect.width) * frame.width)),\n y: Math.max(0, Math.min(frame.height - 1, ((clientY - rect.top) / rect.height) * frame.height)),\n };\n}\n\nexport function computerKey(\n event: Pick<\n KeyboardEvent<HTMLTextAreaElement>,\n \"altKey\" | \"ctrlKey\" | \"key\" | \"metaKey\" | \"shiftKey\"\n >,\n): string | null {\n if ([\"Alt\", \"AltGraph\", \"Control\", \"Meta\", \"Shift\"].includes(event.key)) return null;\n const special = new Set([\n \"Enter\",\n \"Tab\",\n \"Escape\",\n \"Backspace\",\n \"Delete\",\n \"ArrowUp\",\n \"ArrowDown\",\n \"ArrowLeft\",\n \"ArrowRight\",\n \"Home\",\n \"End\",\n \"PageUp\",\n \"PageDown\",\n ]);\n const modified = event.altKey || event.ctrlKey || event.metaKey;\n if (!modified && !special.has(event.key)) return null;\n const parts: string[] = [];\n if (event.ctrlKey) parts.push(\"Control\");\n if (event.altKey) parts.push(\"Alt\");\n if (event.metaKey) parts.push(\"Meta\");\n if (event.shiftKey) parts.push(\"Shift\");\n parts.push(event.key === \" \" ? \"Space\" : event.key);\n return parts.join(\"+\");\n}\n\nfunction sameFrameFence(left: ComputerFrame, right: ComputerFrame): boolean {\n return (\n left.frameId === right.frameId &&\n left.computerSessionId === right.computerSessionId &&\n left.targetId === right.targetId &&\n left.targetGeneration === right.targetGeneration\n );\n}\n\nfunction isLiveComputer(session: ComputerSession): boolean {\n return ![\"ending\", \"ended\", \"failed\", \"lost\"].includes(session.lifecycle);\n}\n\nfunction computerFailureMessage(session: ComputerSession): string | null {\n switch (session.failureCode) {\n case \"machine_locked\":\n return \"Unlock the connected Mac, then try again.\";\n case \"controller_heartbeat_expired\":\n return \"The computer connection was lost. Try opening it again.\";\n case null:\n return null;\n default:\n return \"The computer could not be opened. Try again.\";\n }\n}\n\nfunction countInterventions(\n interventions: readonly InteractionIntervention[],\n): Map<string, number> {\n const counts = new Map<string, number>();\n for (const intervention of interventions) {\n counts.set(intervention.resourceId, (counts.get(intervention.resourceId) ?? 0) + 1);\n }\n return counts;\n}\n\nfunction interventionTitle(intervention: InteractionIntervention): string {\n switch (intervention.kind) {\n case \"manual_login\":\n return \"Sign in needed\";\n case \"mfa\":\n return \"Verification needed\";\n case \"external_action\":\n case \"confirmation\":\n return \"Action needed\";\n case \"other\":\n return \"Computer needs your help\";\n }\n}\n\nfunction platformLabel(session: ComputerSession): string {\n switch (session.platform) {\n case \"macos\":\n return \"Mac\";\n case \"linux\":\n return \"Linux\";\n case \"windows\":\n return \"Windows\";\n default:\n return \"Computer\";\n }\n}\n\nfunction placementLabel(session: ComputerSession): string {\n switch (session.placement.kind) {\n case \"sandbox_group\":\n return \"Agent sandbox\";\n case \"connected_machine\":\n return \"Connected machine\";\n case \"attached_device\":\n return \"Your machine\";\n case \"external_provider\":\n return \"Cloud computer\";\n }\n}\n\nfunction lifecycleLabel(lifecycle: ComputerSession[\"lifecycle\"]): string {\n switch (lifecycle) {\n case \"starting\":\n return \"Opening computer…\";\n case \"suspending\":\n return \"Pausing computer…\";\n case \"suspended\":\n return \"Computer paused\";\n case \"restoring\":\n return \"Restoring computer…\";\n case \"ending\":\n return \"Closing computer…\";\n default:\n return \"Connecting to computer…\";\n }\n}\n\nfunction computerConnectionLabel(state: string): string {\n switch (state) {\n case \"attaching\":\n return \"Opening computer view…\";\n case \"connecting\":\n return \"Connecting…\";\n case \"reconnecting\":\n return \"Reconnecting…\";\n case \"error\":\n return \"Disconnected\";\n default:\n return \"Waiting for computer…\";\n }\n}\n"],"mappings":"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","names":["useCallback","useEffect","useRef","useState","useEffect","useRef","useRef","useEffect","useState","useRef","useCallback","useEffect","useCallback","useEffect","useRef","useState","useState","emptyState","useRef","useCallback","useEffect","timestamp","useCallback","useEffect","useRef","useState","useState","emptyState","useRef","useCallback","useEffect","useCallback","useEffect","useRef","useState","useState","emptyState","useRef","useCallback","useEffect","useCallback","useEffect","useRef","useState","useState","emptyState","useRef","useCallback","useEffect","timestamp","useCallback","useEffect","useRef","useState","useState","emptyState","useRef","useCallback","asError","useEffect","CheckIcon","CircleAlertIcon","LoaderCircleIcon","XIcon","useCallback","useEffect","useMemo","useRef","useState","jsx","jsxs","useMemo","isLiveBrowser","useState","useRef","useCallback","useEffect","interventionTitle","LoaderCircleIcon","CircleAlertIcon","CheckIcon","XIcon","canvas","useCallback","useEffect","useRef","useState","RELAY_TAG_OPEN","RELAY_TAG_OPEN_ACK","RELAY_TAG_FRAME","RELAY_TAG_CLOSE","MAX_AUTOMATIC_RECONNECTS_WITHOUT_A_FRAME","useState","useRef","useCallback","useEffect","relayDatagram","messageBytes","useCallback","useEffect","useRef","useState","useState","emptyState","useRef","useCallback","chooseTarget","useEffect","replaceTarget","useCallback","useEffect","useMemo","useRef","useState","useState","emptyState","useRef","useCallback","useEffect","mergeSession","useMemo","timestamp","ChevronDownIcon","CircleAlertIcon","LoaderCircleIcon","MonitorIcon","PlusIcon","RefreshCwIcon","RotateCcwIcon","useCallback","useEffect","useMemo","useRef","useState","Fragment","jsx","jsxs","useMemo","isLiveComputer","useState","useRef","useCallback","useEffect","countInterventions","interventionTitle","LoaderCircleIcon","MonitorIcon","PlusIcon","semanticNodes","ChevronDownIcon","MenuButton","placementLabel","RefreshCwIcon","CircleAlertIcon","RotateCcwIcon","canvas","paintCanvas","loadImage","sameFrameFence"]}