@opengeni/sdk 3.3.2 → 3.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (299) hide show
  1. package/README.md +1007 -72
  2. package/dist/adapters/express.d.ts +31 -0
  3. package/dist/adapters/express.js +87 -0
  4. package/dist/adapters/express.js.map +1 -0
  5. package/dist/adapters/hono.d.ts +16 -0
  6. package/dist/adapters/hono.js +8 -0
  7. package/dist/adapters/hono.js.map +1 -0
  8. package/dist/adapters/next.d.ts +29 -0
  9. package/dist/adapters/next.js +22 -0
  10. package/dist/adapters/next.js.map +1 -0
  11. package/dist/allowance-refusal.d.ts +2 -0
  12. package/dist/allowance-refusal.js +50 -0
  13. package/dist/allowance-refusal.js.map +1 -0
  14. package/dist/app-links.d.ts +42 -0
  15. package/dist/app-links.js +66 -0
  16. package/dist/app-links.js.map +1 -0
  17. package/dist/artifact-catalog.d.ts +40 -0
  18. package/dist/artifact-client.d.ts +20 -8
  19. package/dist/artifacts.d.ts +1 -1
  20. package/dist/artifacts.js +8 -6
  21. package/dist/automations.js +8 -2
  22. package/dist/automations.js.map +1 -1
  23. package/dist/azure-live-transport.d.ts +32 -0
  24. package/dist/browser.d.ts +7 -2
  25. package/dist/browser.js +27 -5
  26. package/dist/chat/fold.d.ts +75 -0
  27. package/dist/chat/handler.d.ts +41 -0
  28. package/dist/chat/http.d.ts +67 -0
  29. package/dist/chat/ids.d.ts +34 -0
  30. package/dist/chat/index.d.ts +9 -0
  31. package/dist/chat/index.js +1369 -0
  32. package/dist/chat/index.js.map +1 -0
  33. package/dist/chat/openai.d.ts +30 -0
  34. package/dist/chat/opengeni.d.ts +129 -0
  35. package/dist/chat/types.d.ts +207 -0
  36. package/dist/chat/vercel.d.ts +49 -0
  37. package/dist/chats.d.ts +8 -0
  38. package/dist/chunk-4AHR4KGA.js +301 -0
  39. package/dist/chunk-4AHR4KGA.js.map +1 -0
  40. package/dist/chunk-6GYGMLX4.js +332 -0
  41. package/dist/chunk-6GYGMLX4.js.map +1 -0
  42. package/dist/chunk-7EWT3PV6.js +368 -0
  43. package/dist/chunk-7EWT3PV6.js.map +1 -0
  44. package/dist/chunk-FTWVVPR6.js +1665 -0
  45. package/dist/chunk-FTWVVPR6.js.map +1 -0
  46. package/dist/{chunk-VYCTL62C.js → chunk-GZQSWAKD.js} +1 -1
  47. package/dist/chunk-GZQSWAKD.js.map +1 -0
  48. package/dist/chunk-KGEABAID.js +71 -0
  49. package/dist/chunk-KGEABAID.js.map +1 -0
  50. package/dist/{chunk-YKZME56C.js → chunk-KWADQ227.js} +3 -3
  51. package/dist/{chunk-YKZME56C.js.map → chunk-KWADQ227.js.map} +1 -1
  52. package/dist/{chunk-JUS2UYRP.js → chunk-NCU5OAN7.js} +27 -2
  53. package/dist/chunk-NCU5OAN7.js.map +1 -0
  54. package/dist/{chunk-YXQX7RQT.js → chunk-OI5YLASH.js} +73 -2
  55. package/dist/chunk-OI5YLASH.js.map +1 -0
  56. package/dist/chunk-OV3POE62.js +359 -0
  57. package/dist/chunk-OV3POE62.js.map +1 -0
  58. package/dist/chunk-P7UWKORG.js +561 -0
  59. package/dist/chunk-P7UWKORG.js.map +1 -0
  60. package/dist/chunk-QGEIL4TR.js +195 -0
  61. package/dist/chunk-QGEIL4TR.js.map +1 -0
  62. package/dist/{chunk-TRNI7KEO.js → chunk-S2NLS3ES.js} +3669 -1281
  63. package/dist/chunk-S2NLS3ES.js.map +1 -0
  64. package/dist/chunk-UM4ZXXJR.js +9 -0
  65. package/dist/chunk-UM4ZXXJR.js.map +1 -0
  66. package/dist/{chunk-QT3KFVDP.js → chunk-UME3X7CP.js} +28 -32
  67. package/dist/chunk-UME3X7CP.js.map +1 -0
  68. package/dist/chunk-VT4YM4XQ.js +210 -0
  69. package/dist/chunk-VT4YM4XQ.js.map +1 -0
  70. package/dist/chunk-WSYYXONG.js +1602 -0
  71. package/dist/chunk-WSYYXONG.js.map +1 -0
  72. package/dist/{chunk-C2H7HBNP.js → chunk-WVCJRSGJ.js} +119 -14
  73. package/dist/chunk-WVCJRSGJ.js.map +1 -0
  74. package/dist/chunk-X5ITQVXE.js +15 -0
  75. package/dist/chunk-X5ITQVXE.js.map +1 -0
  76. package/dist/chunk-XA7HVIHI.js +126 -0
  77. package/dist/chunk-XA7HVIHI.js.map +1 -0
  78. package/dist/{chunk-KKRO2VCP.js → chunk-YJCHB7R3.js} +60 -12
  79. package/dist/chunk-YJCHB7R3.js.map +1 -0
  80. package/dist/chunk-YKIHNLWD.js +153 -0
  81. package/dist/chunk-YKIHNLWD.js.map +1 -0
  82. package/dist/chunk-ZDUBPV33.js +277 -0
  83. package/dist/chunk-ZDUBPV33.js.map +1 -0
  84. package/dist/client.d.ts +1068 -118
  85. package/dist/codex-realtime-controller.d.ts +13 -0
  86. package/dist/codex-realtime-controller.js +4 -2
  87. package/dist/codex-realtime-v3-wire.d.ts +3 -2
  88. package/dist/codex-realtime.d.ts +5 -1
  89. package/dist/company-brain.d.ts +1 -11
  90. package/dist/core.d.ts +7 -2
  91. package/dist/core.js +25 -6
  92. package/dist/deprecation.d.ts +47 -0
  93. package/dist/document-authority-client.d.ts +24 -2
  94. package/dist/document-authority.js +7 -5
  95. package/dist/editable-artifacts/index.d.ts +1 -1
  96. package/dist/editable-artifacts/types.d.ts +12 -2
  97. package/dist/editable-artifacts.js +19 -3
  98. package/dist/editable-artifacts.js.map +1 -1
  99. package/dist/embedding-client.d.ts +129 -0
  100. package/dist/errors.d.ts +76 -1
  101. package/dist/external-vault-receiver.d.ts +203 -0
  102. package/dist/external-vault-receiver.js +564 -0
  103. package/dist/external-vault-receiver.js.map +1 -0
  104. package/dist/feedback.d.ts +23 -0
  105. package/dist/gateway-realtime-transport.js +1 -1
  106. package/dist/github-repositories.d.ts +10 -0
  107. package/dist/github-repositories.js +36 -0
  108. package/dist/github-repositories.js.map +1 -0
  109. package/dist/index.d.ts +62 -11
  110. package/dist/index.js +557 -338
  111. package/dist/index.js.map +1 -1
  112. package/dist/insights-usage.d.ts +33 -0
  113. package/dist/insights-usage.js +7 -0
  114. package/dist/insights-usage.js.map +1 -0
  115. package/dist/interaction.d.ts +165 -71
  116. package/dist/interaction.js +2 -2
  117. package/dist/knowledge.d.ts +7 -0
  118. package/dist/knowledge.js +20 -0
  119. package/dist/knowledge.js.map +1 -0
  120. package/dist/known-tools.d.ts +4 -0
  121. package/dist/message-links.d.ts +68 -0
  122. package/dist/model-context.d.ts +68 -0
  123. package/dist/model-display.d.ts +2 -0
  124. package/dist/model-display.js +17 -0
  125. package/dist/model-display.js.map +1 -0
  126. package/dist/model-picker-order.d.ts +1 -0
  127. package/dist/model-picker-order.js +10 -0
  128. package/dist/model-picker-order.js.map +1 -0
  129. package/dist/organization-integration-policy.d.ts +26 -0
  130. package/dist/organization-integration-policy.js +26 -0
  131. package/dist/organization-integration-policy.js.map +1 -0
  132. package/dist/pr-review-client.d.ts +1 -1
  133. package/dist/pr-review.d.ts +1 -1
  134. package/dist/pr-review.js.map +1 -1
  135. package/dist/preference-registry.d.ts +1 -1
  136. package/dist/prepared-mcp-setup.d.ts +5 -0
  137. package/dist/proxy.d.ts +13 -11
  138. package/dist/realtime.d.ts +1 -1
  139. package/dist/realtime.js +253 -7
  140. package/dist/realtime.js.map +1 -1
  141. package/dist/session-history-import.d.ts +22 -0
  142. package/dist/session-history-import.js +36 -0
  143. package/dist/session-history-import.js.map +1 -0
  144. package/dist/session-list-entries.d.ts +1 -0
  145. package/dist/session-list-entries.js +7 -0
  146. package/dist/session-list-entries.js.map +1 -0
  147. package/dist/session-message-search.d.ts +53 -0
  148. package/dist/session-proxy-client.d.ts +28 -0
  149. package/dist/session-proxy.d.ts +334 -0
  150. package/dist/session-proxy.js +24 -0
  151. package/dist/session-proxy.js.map +1 -0
  152. package/dist/session-titles.d.ts +2 -28
  153. package/dist/session-usage-limits.d.ts +10 -0
  154. package/dist/session-usage-limits.js +43 -0
  155. package/dist/session-usage-limits.js.map +1 -0
  156. package/dist/shared-catalog-loader.d.ts +34 -0
  157. package/dist/site-ai.d.ts +35 -0
  158. package/dist/site-bridge-host.d.ts +112 -0
  159. package/dist/site-bridge-host.js +286 -0
  160. package/dist/site-bridge-host.js.map +1 -0
  161. package/dist/site-browser-entry.d.ts +1 -0
  162. package/dist/site-browser-runtime.gen.d.ts +1 -0
  163. package/dist/site-data.d.ts +178 -0
  164. package/dist/site-document.d.ts +5 -0
  165. package/dist/site-document.js +20 -0
  166. package/dist/site-document.js.map +1 -0
  167. package/dist/site-document.test.d.ts +1 -0
  168. package/dist/site-http.d.ts +17 -0
  169. package/dist/site-sql.d.ts +31 -0
  170. package/dist/site-tool-bridge.d.ts +57 -0
  171. package/dist/site.d.ts +186 -0
  172. package/dist/site.js +63 -0
  173. package/dist/site.js.map +1 -0
  174. package/dist/skills.d.ts +75 -0
  175. package/dist/sse.d.ts +1 -1
  176. package/dist/stream.d.ts +2 -0
  177. package/dist/tenant-workspaces.d.ts +47 -0
  178. package/dist/tenant-workspaces.js +8 -0
  179. package/dist/tenant-workspaces.js.map +1 -0
  180. package/dist/tool-auth.d.ts +87 -0
  181. package/dist/tool-auth.js +23 -0
  182. package/dist/tool-auth.js.map +1 -0
  183. package/dist/tool-display-metadata.d.ts +3 -0
  184. package/dist/tools-37DCTCNZ.js +12 -0
  185. package/dist/tools-37DCTCNZ.js.map +1 -0
  186. package/dist/tools.d.ts +81 -0
  187. package/dist/transcription.d.ts +1 -1
  188. package/dist/types.d.ts +2807 -583
  189. package/dist/usage-allowances.d.ts +36 -0
  190. package/dist/usage-allowances.js +80 -0
  191. package/dist/usage-allowances.js.map +1 -0
  192. package/dist/vault-types.d.ts +324 -0
  193. package/dist/vaults-api.d.ts +65 -0
  194. package/dist/workspace-artifacts.d.ts +47 -5
  195. package/dist/workspace-instruction-policies.d.ts +2 -2
  196. package/dist/workspace-integrations.d.ts +74 -0
  197. package/dist/workspace-integrations.js +67 -0
  198. package/dist/workspace-integrations.js.map +1 -0
  199. package/dist/workspace-state.d.ts +8 -71
  200. package/package.json +103 -5
  201. package/src/adapters/express.ts +136 -0
  202. package/src/adapters/hono.ts +18 -0
  203. package/src/adapters/next.ts +42 -0
  204. package/src/allowance-refusal.ts +5 -0
  205. package/src/app-links.ts +117 -0
  206. package/src/artifact-catalog.ts +51 -0
  207. package/src/artifact-client.ts +40 -49
  208. package/src/artifacts.ts +1 -0
  209. package/src/automations-client.ts +8 -2
  210. package/src/azure-live-transport.ts +286 -0
  211. package/src/browser.ts +37 -0
  212. package/src/chat/fold.ts +431 -0
  213. package/src/chat/handler.ts +240 -0
  214. package/src/chat/http.ts +257 -0
  215. package/src/chat/ids.ts +85 -0
  216. package/src/chat/index.ts +88 -0
  217. package/src/chat/openai.ts +439 -0
  218. package/src/chat/opengeni.ts +737 -0
  219. package/src/chat/types.ts +219 -0
  220. package/src/chat/vercel.ts +204 -0
  221. package/src/chats.ts +16 -0
  222. package/src/client.ts +5697 -1833
  223. package/src/codex-realtime-controller.ts +163 -8
  224. package/src/codex-realtime-v3-wire.ts +4 -3
  225. package/src/codex-realtime-v3.ts +12 -3
  226. package/src/codex-realtime.ts +11 -3
  227. package/src/company-brain.ts +0 -40
  228. package/src/core.ts +20 -0
  229. package/src/deprecation.ts +149 -0
  230. package/src/document-authority-client.ts +104 -1
  231. package/src/editable-artifacts/controller.ts +36 -2
  232. package/src/editable-artifacts/index.ts +1 -0
  233. package/src/editable-artifacts/types.ts +29 -16
  234. package/src/embedding-client.ts +519 -0
  235. package/src/errors.ts +303 -4
  236. package/src/external-vault-receiver.ts +914 -0
  237. package/src/feedback.ts +20 -0
  238. package/src/gateway-realtime-transport.ts +3 -3
  239. package/src/github-repositories.ts +60 -0
  240. package/src/index.ts +603 -65
  241. package/src/insights-usage.ts +64 -0
  242. package/src/interaction.ts +315 -93
  243. package/src/knowledge.ts +72 -0
  244. package/src/known-tools.ts +279 -0
  245. package/src/message-links.ts +178 -0
  246. package/src/model-context.ts +113 -0
  247. package/src/model-display.ts +11 -0
  248. package/src/model-picker-order.ts +6 -0
  249. package/src/organization-integration-policy.ts +54 -0
  250. package/src/pr-review-client.ts +1 -1
  251. package/src/pr-review.ts +1 -1
  252. package/src/preference-registry.ts +2 -0
  253. package/src/prepared-mcp-setup.ts +123 -0
  254. package/src/proxy.ts +23 -12
  255. package/src/realtime.ts +15 -6
  256. package/src/session-history-import.ts +84 -0
  257. package/src/session-list-entries.ts +1 -0
  258. package/src/session-message-search.ts +47 -0
  259. package/src/session-proxy-client.ts +68 -0
  260. package/src/session-proxy.ts +2098 -0
  261. package/src/session-titles.ts +8 -82
  262. package/src/session-usage-limits.ts +71 -0
  263. package/src/shared-catalog-loader.ts +169 -0
  264. package/src/site-ai.ts +284 -0
  265. package/src/site-bridge-host.ts +422 -0
  266. package/src/site-browser-entry.ts +6 -0
  267. package/src/site-browser-runtime.gen.ts +2 -0
  268. package/src/site-data.ts +372 -0
  269. package/src/site-document.test.ts +64 -0
  270. package/src/site-document.ts +18 -0
  271. package/src/site-http.ts +171 -0
  272. package/src/site-sql.ts +153 -0
  273. package/src/site-tool-bridge.ts +401 -0
  274. package/src/site.ts +878 -0
  275. package/src/skills.ts +69 -0
  276. package/src/sse.ts +9 -3
  277. package/src/stream.ts +33 -10
  278. package/src/tenant-workspaces.ts +148 -0
  279. package/src/tool-auth.ts +301 -0
  280. package/src/tool-display-metadata.ts +27 -0
  281. package/src/tools.ts +452 -0
  282. package/src/transcription.ts +3 -0
  283. package/src/types.ts +3170 -582
  284. package/src/usage-allowances.ts +189 -0
  285. package/src/vault-types.ts +379 -0
  286. package/src/vaults-api.ts +339 -0
  287. package/src/workspace-artifacts.ts +55 -6
  288. package/src/workspace-instruction-policies.ts +2 -1
  289. package/src/workspace-integrations.ts +402 -0
  290. package/src/workspace-state.ts +8 -82
  291. package/dist/chunk-C2H7HBNP.js.map +0 -1
  292. package/dist/chunk-C4DJPZRU.js +0 -119
  293. package/dist/chunk-C4DJPZRU.js.map +0 -1
  294. package/dist/chunk-JUS2UYRP.js.map +0 -1
  295. package/dist/chunk-KKRO2VCP.js.map +0 -1
  296. package/dist/chunk-QT3KFVDP.js.map +0 -1
  297. package/dist/chunk-TRNI7KEO.js.map +0 -1
  298. package/dist/chunk-VYCTL62C.js.map +0 -1
  299. package/dist/chunk-YXQX7RQT.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/chat/ids.ts","../src/tenant-workspaces.ts"],"sourcesContent":["/**\n * Deterministic chat identities. A conversation id maps to exactly one\n * session id per workspace, so any process can address the same session\n * without storing a mapping, and a double-submitted create collapses through\n * the idempotency key. The optional legacy label argument is retained only to\n * reproduce historical addresses. New chat calls do not use it: authorization\n * is independent of addressing, so collaborators can share a conversation.\n */\n\n/** The end-user label a conversation is namespaced to: the product `source` plus the opaque user id. */\nexport type ChatUserLabel = { source: string; id: string };\n\n/** Fixed RFC 4122 namespace for chat session ids. Never change it. */\nexport const CHAT_SESSION_NAMESPACE = \"7c1e6d3a-5b2f-4e8a-9d4c-0f3b6a8e2c17\";\n\nconst UUID_PATTERN = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\n\n/** RFC 4122 version 5 (SHA-1) UUID of `name` inside `namespace`. */\nexport async function uuidV5(name: string, namespace: string): Promise<string> {\n const namespaceBytes = parseUuid(namespace);\n const nameBytes = new TextEncoder().encode(name);\n const input = new Uint8Array(namespaceBytes.length + nameBytes.length);\n input.set(namespaceBytes, 0);\n input.set(nameBytes, namespaceBytes.length);\n const digest = new Uint8Array(await crypto.subtle.digest(\"SHA-1\", input)).slice(0, 16);\n digest[6] = ((digest[6] ?? 0) & 0x0f) | 0x50;\n digest[8] = ((digest[8] ?? 0) & 0x3f) | 0x80;\n return formatUuid(digest);\n}\n\n/**\n * The session id of `conversation` in `workspaceId`: RFC 4122 v5 of the JSON\n * tuple `[workspaceId, conversation]`, or `[workspaceId, source, id, conversation]`\n * when the conversation belongs to an end user. JSON encoding keeps the tuple\n * unambiguous: an id containing `:` or any other delimiter can never make two\n * different (user, conversation) pairs share a session.\n */\nexport async function chatSessionId(\n workspaceId: string,\n conversation: string,\n user?: ChatUserLabel | undefined,\n): Promise<string> {\n return await uuidV5(chatIdentityName(workspaceId, conversation, user), CHAT_SESSION_NAMESPACE);\n}\n\n/** The exact v5 name behind {@link chatSessionId}; exported for tests and audits. */\nexport function chatIdentityName(\n workspaceId: string,\n conversation: string,\n user?: ChatUserLabel | undefined,\n): string {\n return JSON.stringify(\n user ? [workspaceId, user.source, user.id, conversation] : [workspaceId, conversation],\n );\n}\n\n/**\n * The create idempotency key for a chat session: `chat:<sessionId>`. The\n * session id already encodes the workspace, user label, and conversation as an\n * unambiguous tuple, so the key inherits that and stays bounded.\n */\nexport function chatIdempotencyKey(sessionId: string): string {\n return `chat:${sessionId}`;\n}\n\nexport function isUuid(value: string): boolean {\n return UUID_PATTERN.test(value);\n}\n\nfunction parseUuid(value: string): Uint8Array {\n if (!UUID_PATTERN.test(value)) {\n throw new TypeError(`Invalid UUID namespace: ${value}`);\n }\n const hex = value.replace(/-/g, \"\");\n const bytes = new Uint8Array(16);\n for (let index = 0; index < 16; index += 1) {\n bytes[index] = Number.parseInt(hex.slice(index * 2, index * 2 + 2), 16);\n }\n return bytes;\n}\n\nfunction formatUuid(bytes: Uint8Array): string {\n const hex = Array.from(bytes, (byte) => byte.toString(16).padStart(2, \"0\")).join(\"\");\n return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20, 32)}`;\n}\n","import type { OpenGeniEmbeddingClient } from \"./embedding-client\";\nimport type { Permission } from \"./types\";\nimport { OpenGeniApiError } from \"./errors\";\nimport { uuidV5 } from \"./chat/ids\";\n\nconst ISOLATION_NAMESPACE = \"fc398712-b4db-5b0b-8842-57cb4f2a65f9\";\n/**\n * Conversation-only member permissions. The API grants exactly this set when\n * an organization key first acts as a user on a workspace (keep equal to\n * `EXTERNAL_FIRST_USE_MEMBER_PERMISSIONS` in `packages/core/src/access`).\n */\nconst CONVERSATION_PERMISSIONS = [\n \"workspace:read\",\n \"sessions:create\",\n \"sessions:read\",\n \"sessions:control\",\n \"files:upload\",\n \"files:read\",\n \"mcp_servers:attach\",\n] as const;\n\nexport type WorkspaceIdTarget = {\n /**\n * Your tenant id. With user isolation and no tenant, the user gets one\n * workspace of their own, independent of any tenant.\n */\n tenant?: string | undefined;\n user?: string | undefined;\n /** External user identity source; defaults to the resolver's source. */\n source?: string | undefined;\n};\n\nexport type WorkspaceIdOptions = {\n /**\n * `tenant`: one workspace per tenant. `user`: a separate workspace for the\n * user (per tenant when a tenant is given, otherwise one per user).\n */\n isolation: \"tenant\" | \"user\";\n};\n\nexport type WorkspaceIdResolverOptions = {\n /** The organization id, or a lazy lookup (for example derived from the API key). */\n organizationId: string | (() => Promise<string>);\n source: string;\n /** Workspace display name; receives the tenant id, or the user id for a per-user workspace. */\n workspaceName?: ((tenant: string) => string) | undefined;\n /**\n * Per-user workspaces only (user isolation): permissions for the one member\n * this resolver adds explicitly, its owner. Replaces the defaults: workspace\n * read, session create/read/control (including sending messages), file\n * upload/read, and attaching the host's per-session MCP servers. No admin\n * permissions are granted by default. Tenant workspaces rely on the API,\n * which adds a missing member with those defaults on their first request.\n * Existing grants are never changed here; change them with\n * `updateExternalWorkspaceMember`. The organization API key must also allow\n * the selected permissions.\n */\n memberPermissions?: readonly Permission[] | undefined;\n};\n\n/**\n * Server-only workspace resolution using external workspace provisioning.\n * Workspaces are created on first use and cached. A tenant workspace's members\n * are added by the API on their first `asUser` request (the organization key\n * needs `members:manage`). A per-user workspace stays single-user: the API\n * never auto-admits anyone there, and this resolver adds its owner with a\n * stable onboarding key, so retries never restore a revoked grant.\n */\nexport function createWorkspaceIdResolver(\n client: Pick<OpenGeniEmbeddingClient, \"ensureWorkspace\" | \"addExternalWorkspaceMember\">,\n options: WorkspaceIdResolverOptions,\n): (target: WorkspaceIdTarget, resolution: WorkspaceIdOptions) => Promise<string> {\n const memberPermissions = [...(options.memberPermissions ?? CONVERSATION_PERMISSIONS)];\n const cache = new Map<string, Promise<string>>();\n const organizationId = async () =>\n typeof options.organizationId === \"function\"\n ? await options.organizationId()\n : options.organizationId;\n return async (target, resolution) => {\n const isolated = resolution.isolation === \"user\";\n if (!isolated && !target.tenant) throw new TypeError(\"workspaceIdFor requires a tenant.\");\n if (isolated && !target.user) {\n throw new TypeError(\"User isolation requires an authenticated product user.\");\n }\n const source = target.source ?? options.source;\n // A per-user workspace without a tenant has its own key shape, so it can\n // never alias a tenant-scoped isolated workspace.\n const key = target.tenant\n ? JSON.stringify([\n resolution.isolation,\n options.source,\n source,\n target.tenant,\n isolated ? target.user : null,\n ])\n : JSON.stringify([\"user\", options.source, source, target.user]);\n let pending = cache.get(key);\n if (!pending) {\n pending = (async () => {\n const productSource = options.source.trim();\n const isolatedSource = `opengeni-sdk:user-isolation:${await uuidV5(productSource, ISOLATION_NAMESPACE)}`;\n const label = target.tenant ?? target.user!;\n const { workspace } = await client.ensureWorkspace({\n accountId: await organizationId(),\n externalSource: isolated\n ? isolatedSource === productSource\n ? `${isolatedSource}:user`\n : isolatedSource\n : options.source,\n externalId: isolated ? await uuidV5(key, ISOLATION_NAMESPACE) : target.tenant!,\n name: options.workspaceName?.(label) ?? label,\n });\n if (isolated) {\n try {\n await client.addExternalWorkspaceMember(workspace.id, {\n identity: { source, externalId: target.user! },\n permissions: [...memberPermissions],\n operationId: await uuidV5(\n JSON.stringify([\"member\", workspace.id, source, target.user]),\n ISOLATION_NAMESPACE,\n ),\n });\n } catch (error) {\n // Defaults/custom permissions may have changed since this stable\n // onboarding key committed, or the grant may have been cancelled.\n // A definitive conflict must never mint a new key or update access.\n // Return only the address: every asUser operation still checks the\n // live membership, including reduced or withdrawn permissions.\n if (\n !(error instanceof OpenGeniApiError) ||\n error.status !== 409 ||\n error.code !== \"conflict\" ||\n error.outcomeUnknown\n )\n throw error;\n }\n }\n return workspace.id;\n })();\n pending.catch(() => {\n if (cache.get(key) === pending) cache.delete(key);\n });\n if (cache.size >= 1_000) cache.delete(cache.keys().next().value!);\n cache.set(key, pending);\n }\n return await pending;\n };\n}\n"],"mappings":"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","names":[]}
@@ -1,6 +1,12 @@
1
1
  import {
2
2
  OpenGeniApiError
3
- } from "./chunk-C4DJPZRU.js";
3
+ } from "./chunk-7EWT3PV6.js";
4
+
5
+ // ../contracts/src/browser-storage.ts
6
+ var EPHEMERAL_CHROMIUM_DRIVER_ID = "opengeni.cdp.ephemeral-context.v1";
7
+ function browserSessionStorageMode(session) {
8
+ return session.driverId === EPHEMERAL_CHROMIUM_DRIVER_ID ? "ephemeral_context" : "private_profile";
9
+ }
4
10
 
5
11
  // src/interaction.ts
6
12
  var INTERACTION_PROTOCOL_VERSION = 1;
@@ -194,15 +200,6 @@ var AuthRunResource = class {
194
200
  options
195
201
  );
196
202
  }
197
- async protectedFill(request, options = {}) {
198
- return await this.transport.protectedBrowserAuthFill(
199
- this.workspaceId,
200
- this.browserSessionId,
201
- this.id,
202
- request,
203
- options
204
- );
205
- }
206
203
  async advanceExternal(request, options = {}) {
207
204
  return await this.transport.advanceExternalBrowserAuthRun(
208
205
  this.workspaceId,
@@ -338,7 +335,12 @@ var BrowserSessionCollection = class {
338
335
  async currentOrOpen(options) {
339
336
  const requestOptions = options.signal ? { signal: options.signal } : {};
340
337
  const listed = await this.list(options.workspaceId, requestOptions);
341
- const current = newestRelevantBrowser(listed.sessions, options.associationSessionId);
338
+ const current = newestRelevantBrowser(
339
+ listed.sessions.filter(
340
+ (session) => browserSessionStorageMode(session) === (options.storageMode ?? "private_profile")
341
+ ),
342
+ options.associationSessionId
343
+ );
342
344
  if (current) {
343
345
  const resource = this.session(options.workspaceId, current.id);
344
346
  if (current.lifecycle === "suspended") {
@@ -357,6 +359,7 @@ var BrowserSessionCollection = class {
357
359
  ...options.name !== void 0 ? { name: options.name } : {},
358
360
  ...options.initialUrl !== void 0 ? { initialUrl: options.initialUrl } : {},
359
361
  ...options.headless !== void 0 ? { headless: options.headless } : {},
362
+ ...options.storageMode !== void 0 ? { storageMode: options.storageMode } : {},
360
363
  ...options.placement !== void 0 ? { placement: options.placement } : {},
361
364
  ...options.identityId !== void 0 ? { identityId: options.identityId } : {},
362
365
  ...options.baseRevisionId !== void 0 ? { baseRevisionId: options.baseRevisionId } : {},
@@ -390,6 +393,30 @@ var BrowserSessionResource = class {
390
393
  async observe(targetId, options = {}) {
391
394
  return await this.transport.observeBrowserTarget(this.workspaceId, this.id, targetId, options);
392
395
  }
396
+ async targetState(targetId, options = {}) {
397
+ return await this.transport.getBrowserTargetState(this.workspaceId, this.id, targetId, options);
398
+ }
399
+ async readDom(targetId, request, options = {}) {
400
+ return await this.transport.readBrowserDom(
401
+ this.workspaceId,
402
+ this.id,
403
+ targetId,
404
+ request,
405
+ options
406
+ );
407
+ }
408
+ async capture(targetId, options = {}, captureOptions = {}) {
409
+ return await this.transport.captureBrowserTarget(
410
+ this.workspaceId,
411
+ this.id,
412
+ targetId,
413
+ options,
414
+ captureOptions
415
+ );
416
+ }
417
+ async screenshot(targetId, captureOptions = {}, options = {}) {
418
+ return await this.capture(targetId, options, captureOptions);
419
+ }
393
420
  async act(request, options = {}) {
394
421
  return await this.transport.actInBrowser(this.workspaceId, this.id, request, options);
395
422
  }
@@ -604,9 +631,24 @@ var ComputerSessionResource = class {
604
631
  async capture(targetId, options = {}) {
605
632
  return await this.transport.captureComputerTarget(this.workspaceId, this.id, targetId, options);
606
633
  }
634
+ async callNativeTool(request, options = {}) {
635
+ if (!this.transport.callNativeComputerTool)
636
+ throw new Error("Native CUA tools require a current interaction transport");
637
+ return await this.transport.callNativeComputerTool(this.workspaceId, this.id, request, options);
638
+ }
607
639
  async act(request, options = {}) {
608
640
  return await this.transport.actInComputer(this.workspaceId, this.id, request, options);
609
641
  }
642
+ async nativeReceipt(operationId, options = {}) {
643
+ if (!this.transport.getNativeComputerToolReceipt)
644
+ throw new Error("Native CUA receipts require a current interaction transport");
645
+ return await this.transport.getNativeComputerToolReceipt(
646
+ this.workspaceId,
647
+ this.id,
648
+ operationId,
649
+ options
650
+ );
651
+ }
610
652
  async receipt(operationId, options = {}) {
611
653
  return await this.transport.getComputerActionReceipt(
612
654
  this.workspaceId,
@@ -618,6 +660,12 @@ var ComputerSessionResource = class {
618
660
  async attach(request, options = {}) {
619
661
  return await this.transport.attachComputerSession(this.workspaceId, this.id, request, options);
620
662
  }
663
+ async inputPosture(options = {}) {
664
+ if (!this.transport.getComputerInputPosture) {
665
+ throw new Error("Computer input posture requires a current interaction transport.");
666
+ }
667
+ return await this.transport.getComputerInputPosture(this.workspaceId, this.id, options);
668
+ }
621
669
  async heartbeat(options = {}) {
622
670
  return await this.transport.heartbeatComputerSession(this.workspaceId, this.id, options);
623
671
  }
@@ -1060,4 +1108,4 @@ export {
1060
1108
  parseComputerFrameMetadata,
1061
1109
  decodeComputerFrameMetadataHeader
1062
1110
  };
1063
- //# sourceMappingURL=chunk-KKRO2VCP.js.map
1111
+ //# sourceMappingURL=chunk-YJCHB7R3.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../contracts/src/browser-storage.ts","../src/interaction.ts"],"sourcesContent":["/** Persisted discriminator; null identity alone never implies ephemeral storage. */\nexport const EPHEMERAL_CHROMIUM_DRIVER_ID = \"opengeni.cdp.ephemeral-context.v1\" as const;\n\nexport function browserSessionStorageMode(session: {\n driverId: string;\n}): \"private_profile\" | \"ephemeral_context\" {\n return session.driverId === EPHEMERAL_CHROMIUM_DRIVER_ID\n ? \"ephemeral_context\"\n : \"private_profile\";\n}\n","import type { ComputerNativeCallRequest, ComputerNativeReceipt } from \"@opengeni/contracts\";\nexport type {\n ComputerNativeCallRequest,\n ComputerNativeReceipt,\n ComputerOperationReceipt,\n} from \"@opengeni/contracts\";\nimport type { InteractionSessionListOptions, OpenGeniRequestOptions } from \"./client\";\nimport { browserSessionStorageMode } from \"@opengeni/contracts/browser-storage\";\nimport type {\n BrowserDomReadRequest,\n BrowserDomReadResponse,\n BrowserTargetState,\n} from \"@opengeni/contracts\";\nexport type {\n BrowserDomReadRequest,\n BrowserDomReadResponse,\n BrowserDomSafeAttribute,\n BrowserTargetState,\n} from \"@opengeni/contracts\";\nimport { OpenGeniApiError } from \"./errors\";\nimport type { RetainedArtifactReference } from \"./types\";\n\n/** Public Browser/Computer protocol version. Driver and provider details stay private. */\nexport const INTERACTION_PROTOCOL_VERSION = 1 as const;\nexport const BROWSER_CONTROL_WEBSOCKET_PROTOCOL = \"opengeni.browser.v1\" as const;\nexport const COMPUTER_CONTROL_WEBSOCKET_PROTOCOL = \"opengeni.computer.v1\" as const;\nexport const BROWSER_CONTROL_WEBSOCKET_BEARER_PREFIX = \"opengeni.auth.\" as const;\nexport const BROWSER_CONTROL_MAX_FRAME_HEADER_BYTES = 64 * 1024;\nexport const BROWSER_FRAME_MAX_BYTES = 24 * 1024 * 1024;\nexport const BROWSER_FRAME_MAX_DIMENSION = 32_768;\nexport const BROWSER_FRAME_MAX_PIXELS = 100_000_000;\n\n/** Latest-wins invalidation cursor for workspace Browser/Computer resources. */\nexport type WorkspaceInteractionRevisionEvent = {\n workspaceId: string;\n sequence: number;\n revision: number;\n type: \"workspace.interaction.changed\";\n occurredAt: string;\n};\n\nexport type InteractionJsonValue =\n | null\n | string\n | number\n | boolean\n | InteractionJsonValue[]\n | { [key: string]: InteractionJsonValue };\n\nexport type InteractionControlFailureCode =\n | \"unknown\"\n | \"unsupported\"\n | \"os\"\n | \"not_found\"\n | \"consent_required\"\n | \"timeout\"\n | \"draining\"\n | \"protocol\"\n | \"stream\"\n | \"agent_offline\"\n | \"fenced\"\n | \"payload_too_large\";\n\nexport type InteractionControlFailure = {\n layer: \"connected_machine\";\n surface: \"browser\" | \"computer\";\n code: InteractionControlFailureCode;\n retryable: boolean;\n outcomeUnknown: boolean;\n requestId: string | undefined;\n controlRequestId: string | undefined;\n message: string;\n};\n\n/** Decodes the bounded typed control-failure details emitted by Opengeni. Raw\n * provider/OS detail is intentionally absent; both correlation ids are opaque. */\nexport function interactionControlFailureFromError(\n error: unknown,\n): InteractionControlFailure | null {\n if (!(error instanceof OpenGeniApiError)) return null;\n const details = error.details;\n if (!details || details.interactionLayer !== \"connected_machine\") return null;\n const surface = details.interactionSurface;\n const code = details.controlFailureCode;\n if ((surface !== \"browser\" && surface !== \"computer\") || !isControlFailureCode(code)) {\n return null;\n }\n const controlRequestId = boundedOpaqueCorrelation(details.controlRequestId);\n return {\n layer: \"connected_machine\",\n surface,\n code,\n retryable: error.retryable,\n outcomeUnknown: error.outcomeUnknown,\n requestId: error.correlationId,\n controlRequestId,\n message: error.message,\n };\n}\n\nfunction isControlFailureCode(value: unknown): value is InteractionControlFailureCode {\n return (\n typeof value === \"string\" &&\n [\n \"unknown\",\n \"unsupported\",\n \"os\",\n \"not_found\",\n \"consent_required\",\n \"timeout\",\n \"draining\",\n \"protocol\",\n \"stream\",\n \"agent_offline\",\n \"fenced\",\n \"payload_too_large\",\n ].includes(value)\n );\n}\n\nfunction boundedOpaqueCorrelation(value: unknown): string | undefined {\n return typeof value === \"string\" && value.length <= 128 && /^[A-Za-z0-9._:-]+$/u.test(value)\n ? value\n : undefined;\n}\n\nexport type InteractionPlacement =\n | { kind: \"sandbox_group\"; sandboxGroupId: string }\n | { kind: \"connected_machine\"; sandboxId: string }\n | { kind: \"attached_device\"; deviceId: string }\n | { kind: \"external_provider\"; providerId: string; placementId: string };\n\nexport type AttachedBrowserDeviceCapabilities = {\n tabInventory: boolean;\n debuggerAttachment: boolean;\n semanticObservation: boolean;\n screenshots: boolean;\n liveFrames: boolean;\n humanInput: boolean;\n diagnostics: boolean;\n rawCdp: boolean;\n linkedComputer: boolean;\n};\n\n/** One live browser-profile endpoint on an enrolled machine. Saved, reusable\n * login state is represented separately by BrowserIdentity. */\nexport type AttachedBrowserDevice = {\n id: string;\n accountId: string;\n workspaceId: string;\n enrollmentId: string;\n name: string;\n profileLabel: string | null;\n browserName: string;\n browserVersion: string;\n extensionVersion: string;\n platform: \"linux\" | \"macos\" | \"windows\";\n architecture: \"x64\" | \"arm64\";\n state: \"connected\" | \"disconnected\";\n connectionGeneration: string;\n inventoryRevision: number;\n tabCount: number;\n capabilities: AttachedBrowserDeviceCapabilities;\n lastSeenAt: string;\n disconnectedAt: string | null;\n createdAt: string;\n updatedAt: string;\n};\n\nexport type AttachedBrowserBridge = {\n enrollmentId: string;\n state: \"online\" | \"offline\";\n bridgeGeneration: string;\n inventoryRevision: number;\n connectedProfileCount: number;\n lastSeenAt: string;\n};\n\nexport type AttachedBrowserDeviceListResponse = {\n revision: number;\n bridges: AttachedBrowserBridge[];\n devices: AttachedBrowserDevice[];\n};\n\nexport type InteractionControllerBinding = {\n controllerId: string;\n controllerGeneration: string;\n placementInstanceId: string;\n};\n\nexport type InteractionAssociation = {\n sessionId: string;\n turnId: string | null;\n attemptId: string | null;\n relationship: \"created\" | \"using\" | \"observing\" | \"related\";\n actorSubjectId: string;\n lastUsedAt: string;\n};\n\nexport type InteractionLifecycle =\n | \"starting\"\n | \"active\"\n | \"suspending\"\n | \"suspended\"\n | \"restoring\"\n | \"repair_required\"\n | \"lost\"\n | \"ending\"\n | \"ended\"\n | \"failed\";\n\nexport type BrowserSessionCapabilities = {\n semanticObservation: boolean;\n screenshots: boolean;\n liveFrames: boolean;\n humanInput: boolean;\n tabs: boolean;\n downloads: boolean;\n uploads: boolean;\n clipboard: boolean;\n permissions: boolean;\n diagnostics: boolean;\n rawCdp: boolean;\n linkedComputer: boolean;\n privateCheckpoint: boolean;\n identityPublication: boolean;\n parallelTargets: boolean;\n};\n\nexport type BrowserSession = {\n id: string;\n accountId: string;\n workspaceId: string;\n name: string;\n lifecycle: InteractionLifecycle;\n placement: InteractionPlacement;\n controller: InteractionControllerBinding | null;\n driverId: string;\n engine: \"chromium\" | \"chrome\" | \"firefox\" | \"webkit\" | \"lightpanda\" | \"external\";\n engineVersion: string | null;\n headless: boolean;\n identityId: string | null;\n baseRevisionId: string | null;\n networkRouteId: string | null;\n linkedComputerSessionId: string | null;\n capabilities: BrowserSessionCapabilities;\n associations: InteractionAssociation[];\n createdBySubjectId: string;\n createdAt: string;\n lastUsedAt: string;\n failureCode: string | null;\n};\n\nexport type BrowserClipboard = {\n browserSessionId: string;\n controllerGeneration: string;\n revision: number;\n text: string;\n source: \"empty\" | \"write\" | \"clear\" | \"copy\" | \"paste\";\n sourceTargetId: string | null;\n updatedAt: string | null;\n};\n\nexport type InteractionCredentialAuthorityRef = {\n connectionId: string;\n connectionSubjectId: string | null;\n providerDomain: string;\n};\n\nexport type NetworkRouteConfiguration =\n | { kind: \"direct\" }\n | {\n kind: \"proxy\";\n protocol: \"http\" | \"https\" | \"socks5\";\n host: string;\n port: number;\n credential: InteractionCredentialAuthorityRef | null;\n }\n | {\n kind: \"managed\";\n providerId: string;\n routeId: string;\n egressClass: \"datacenter\" | \"residential\" | \"isp\";\n region: string | null;\n credential: InteractionCredentialAuthorityRef | null;\n }\n | { kind: \"tunnel\"; placement: InteractionPlacement; tunnelId: string };\n\nexport type NetworkRouteConsistency = {\n dns: \"placement\" | \"proxy\" | \"provider\";\n expectedPublicIp: string | null;\n expectedRegion: string | null;\n locale: string | null;\n timezone: string | null;\n geolocation: {\n latitude: number;\n longitude: number;\n accuracyMeters: number;\n } | null;\n webRtc: \"default\" | \"disable_non_proxied_udp\" | \"proxy_only\";\n stability: \"session\" | \"sticky\" | \"persistent\";\n};\n\nexport type NetworkRoute = {\n id: string;\n accountId: string;\n workspaceId: string;\n name: string;\n status: \"active\" | \"archived\";\n configuration: NetworkRouteConfiguration;\n consistency: NetworkRouteConsistency;\n version: number;\n createdBySubjectId: string;\n createdAt: string;\n updatedAt: string;\n};\n\nexport type NetworkRouteListResponse = { revision: number; routes: NetworkRoute[] };\nexport type CreateNetworkRouteRequest = {\n operationId: string;\n name: string;\n configuration: NetworkRouteConfiguration;\n consistency: NetworkRouteConsistency;\n};\nexport type UpdateNetworkRouteRequest = {\n operationId: string;\n expectedVersion: number;\n name?: string | undefined;\n status?: \"active\" | \"archived\" | undefined;\n configuration?: NetworkRouteConfiguration | undefined;\n consistency?: NetworkRouteConsistency | undefined;\n};\nexport type NetworkRouteMutationResponse = {\n route: NetworkRoute;\n operationId: string;\n replayed: boolean;\n};\n\nexport type SiteAuthAuthority = {\n id: string;\n kind: \"external_provider\";\n label: string;\n adapterId: string;\n connectionId: string;\n credential: InteractionCredentialAuthorityRef | null;\n};\n\nexport type SiteAuthMethod = {\n id: string;\n kind: \"password\" | \"sso\" | \"magic_link\" | \"passkey\" | \"external\";\n label: string;\n authorityIds: string[];\n};\n\nexport type SiteAuthHealthPolicy = {\n mode: \"on_use\" | \"maintained\";\n intervalSeconds: number | null;\n automaticRepair: boolean;\n};\n\nexport type SiteAuthConnectionConfiguration = {\n name: string;\n accountLabel: string;\n origins: string[];\n loginUrl: string | null;\n verificationUrlPrefixes: string[];\n authorities: SiteAuthAuthority[];\n methods: SiteAuthMethod[];\n preferredIdentityId: string | null;\n preferredPlacement: InteractionPlacement | null;\n preferredNetworkRouteId: string | null;\n healthPolicy: SiteAuthHealthPolicy;\n};\n\nexport type SiteAuthConnection = SiteAuthConnectionConfiguration & {\n id: string;\n accountId: string;\n workspaceId: string;\n status: \"active\" | \"archived\";\n verificationState: \"unknown\" | \"verified\" | \"needs_repair\" | \"failed\";\n lastVerifiedAt: string | null;\n lastVerifiedUrl: string | null;\n lastCheckedAt: string | null;\n nextCheckAt: string | null;\n maintenance: {\n action: \"health_check\" | \"repair\";\n sessionId: string | null;\n dueAt: string;\n startedAt: string | null;\n } | null;\n repairCode: string | null;\n version: number;\n createdBySubjectId: string;\n createdAt: string;\n updatedAt: string;\n};\n\nexport type SiteAuthConnectionListResponse = {\n revision: number;\n connections: SiteAuthConnection[];\n};\nexport type CreateSiteAuthConnectionRequest = SiteAuthConnectionConfiguration & {\n operationId: string;\n};\nexport type UpdateSiteAuthConnectionRequest = Partial<SiteAuthConnectionConfiguration> & {\n operationId: string;\n expectedVersion: number;\n status?: \"active\" | \"archived\" | undefined;\n};\nexport type SiteAuthConnectionMutationResponse = {\n connection: SiteAuthConnection;\n operationId: string;\n replayed: boolean;\n};\n\nexport type AuthRun = {\n id: string;\n accountId: string;\n workspaceId: string;\n siteAuthConnectionId: string;\n browserSessionId: string;\n targetId: string;\n controllerGeneration: string;\n targetGeneration: string;\n documentGeneration: string | null;\n purpose: \"authenticate\" | \"health_check\" | \"repair\";\n methodId: string | null;\n authorityId: string | null;\n state:\n | \"discovering\"\n | \"awaiting_choice\"\n | \"awaiting_external_action\"\n | \"working\"\n | \"verified\"\n | \"failed\"\n | \"cancelled\";\n choices: Array<{ id: string; label: string; methodId: string }>;\n externalAction: {\n kind: \"push\" | \"security_key\" | \"passkey\" | \"device\" | \"human\" | \"other\";\n label: string;\n expiresAt: string | null;\n } | null;\n interventionId: string | null;\n verifiedUrl: string | null;\n failureCode: string | null;\n version: number;\n operationId: string;\n createdBySubjectId: string;\n createdAt: string;\n updatedAt: string;\n settledAt: string | null;\n};\n\nexport type AuthRunListResponse = { runs: AuthRun[] };\nexport type AuthRunMutationResponse = { run: AuthRun; operationId: string; replayed: boolean };\nexport type StartAuthRunRequest = {\n operationId: string;\n siteAuthConnectionId: string;\n targetId: string;\n expectedTargetGeneration: string;\n expectedDocumentGeneration: string | null;\n purpose?: \"authenticate\" | \"health_check\" | \"repair\" | undefined;\n methodId?: string | undefined;\n authorityId?: string | undefined;\n};\nexport type ReportAuthRunRequest = {\n operationId: string;\n expectedVersion: number;\n methodId?: string | undefined;\n authorityId?: string | undefined;\n state: \"awaiting_choice\" | \"awaiting_external_action\" | \"working\" | \"failed\" | \"cancelled\";\n choices?: AuthRun[\"choices\"] | undefined;\n externalAction?: AuthRun[\"externalAction\"] | undefined;\n failureCode?: string | null | undefined;\n};\nexport type ExternalAuthRunRequest = {\n operationId: string;\n expectedVersion: number;\n action: \"start\" | \"poll\";\n};\nexport type ExternalAuthRunResponse = {\n run: AuthRun;\n status: \"working\" | \"needs_human\" | \"ready_to_verify\" | \"failed\";\n operationId: string;\n replayed: boolean;\n};\nexport type ExternalAuthInteractiveRequest = {\n operationId: string;\n expectedVersion: number;\n};\nexport type ExternalAuthInteractiveResponse = {\n authRunId: string;\n url: string;\n expiresAt: string | null;\n};\nexport type VerifyAuthRunRequest = { operationId: string; expectedVersion: number };\n\nexport type InteractionIntervention = {\n id: string;\n accountId: string;\n workspaceId: string;\n resourceKind: \"browser_session\" | \"computer_session\";\n resourceId: string;\n targetId: string;\n controllerGeneration: string;\n targetGeneration: string;\n documentGeneration: string | null;\n kind: \"manual_login\" | \"mfa\" | \"external_action\" | \"confirmation\" | \"other\";\n reason: string;\n status: \"open\" | \"completed\" | \"dismissed\" | \"expired\" | \"cancelled\";\n authRunId: string | null;\n originatingSessionId: string;\n originatingTurnId: string | null;\n originatingAttemptId: string | null;\n originatingToolOperationId: string | null;\n responseActorSubjectId: string | null;\n version: number;\n operationId: string;\n expiresAt: string;\n createdAt: string;\n updatedAt: string;\n settledAt: string | null;\n};\nexport type InteractionInterventionListResponse = {\n interventions: InteractionIntervention[];\n};\nexport type CreateInteractionInterventionRequest = {\n operationId: string;\n resourceKind: \"browser_session\" | \"computer_session\";\n resourceId: string;\n targetId: string;\n expectedControllerGeneration: string;\n expectedTargetGeneration: string;\n expectedDocumentGeneration: string | null;\n kind: InteractionIntervention[\"kind\"];\n reason: string;\n authRunId?: string | undefined;\n expiresInSeconds?: number | undefined;\n};\nexport type ResolveInteractionInterventionRequest = {\n operationId: string;\n expectedVersion: number;\n outcome: \"completed\" | \"dismissed\";\n};\nexport type InteractionInterventionMutationResponse = {\n intervention: InteractionIntervention;\n operationId: string;\n replayed: boolean;\n};\n\nexport type BrowserIdentityStatus = \"active\" | \"archived\";\nexport type BrowserRevisionComponentKind =\n | \"chromium_profile\"\n | \"normalized_web_state\"\n | \"provider_snapshot\";\nexport type BrowserRevisionPortability = \"portable\" | \"provider_bound\" | \"placement_bound\";\n\nexport type BrowserRevisionMaterialization = {\n portability: BrowserRevisionPortability;\n reason: string | null;\n platform: \"linux\" | \"macos\" | \"windows\" | null;\n architecture: \"x64\" | \"arm64\" | null;\n engine: \"chromium\" | \"chrome\" | \"firefox\" | \"webkit\" | \"lightpanda\" | \"external\";\n engineVersion: string | null;\n driverId: string;\n driverSchemaVersion: number;\n profileCrypto: \"chromium_basic\" | \"chromium_mock_keychain\" | \"platform_bound\";\n providerId: string | null;\n placement: InteractionPlacement | null;\n};\n\nexport type BrowserRevisionComponent = {\n id: string;\n kind: BrowserRevisionComponentKind;\n format: string;\n artifactDigest: string;\n sizeBytes: number;\n materialization: BrowserRevisionMaterialization;\n};\n\nexport type BrowserRevision = {\n id: string;\n accountId: string;\n workspaceId: string;\n identityId: string;\n parentRevisionId: string | null;\n ordinal: number;\n sourceBrowserSessionId: string;\n manifestDigest: string;\n components: BrowserRevisionComponent[];\n createdBySubjectId: string;\n createdAt: string;\n};\n\nexport type BrowserIdentity = {\n id: string;\n accountId: string;\n workspaceId: string;\n name: string;\n status: BrowserIdentityStatus;\n version: number;\n defaultRevisionId: string | null;\n headGeneration: number;\n revisionCount: number;\n createdBySubjectId: string;\n createdAt: string;\n updatedAt: string;\n};\n\nexport type BrowserIdentityListResponse = {\n revision: number;\n identities: BrowserIdentity[];\n};\n\nexport type BrowserRevisionListResponse = {\n identity: BrowserIdentity;\n revisions: BrowserRevision[];\n};\n\nexport type CreateBrowserIdentityRequest = {\n operationId: string;\n name: string;\n};\n\nexport type UpdateBrowserIdentityRequest = {\n operationId: string;\n expectedVersion: number;\n name?: string | undefined;\n status?: BrowserIdentityStatus | undefined;\n defaultRevisionId?: string | undefined;\n};\n\nexport type BrowserIdentityMutationResponse = {\n identity: BrowserIdentity;\n operationId: string;\n replayed: boolean;\n};\n\nexport type PublishBrowserRevisionRequest = {\n operationId: string;\n identityId: string;\n expectedHeadGeneration: number;\n advanceDefault?: boolean | undefined;\n};\n\nexport type PublishBrowserRevisionResponse = {\n identity: BrowserIdentity;\n revision: BrowserRevision;\n outcome: \"saved_as_default\" | \"saved_not_default\";\n replayed: boolean;\n};\n\nexport type BrowserTarget = {\n id: string;\n browserSessionId: string;\n controllerGeneration: string;\n targetGeneration: string;\n documentGeneration: string | null;\n kind: \"page\" | \"popup\" | \"background_page\" | \"worker\";\n title: string;\n url: string;\n selected: boolean;\n attached: boolean;\n createdAt: string;\n};\n\nexport type BrowserDownloadStatus =\n | \"in_progress\"\n | \"completed\"\n | \"cancelled\"\n | \"failed\"\n | \"unavailable\";\n\n/** One browser-produced file. Its bytes remain private to the exact browser\n * controller until an explicit save publishes them into the workspace. */\nexport type BrowserDownload = {\n id: string;\n browserSessionId: string;\n controllerGeneration: string;\n targetId: string | null;\n filename: string;\n status: BrowserDownloadStatus;\n receivedBytes: number;\n totalBytes: number | null;\n sha256: string | null;\n version: number;\n startedAt: string;\n settledAt: string | null;\n failureCode: string | null;\n};\n\nexport type BrowserDownloadListResponse = {\n browserSessionId: string;\n controllerGeneration: string;\n downloads: BrowserDownload[];\n};\n\nexport type BrowserDownloadSaveRequest = {\n operationId: string;\n destinationPath: string;\n overwrite?: boolean | undefined;\n};\n\nexport type BrowserDownloadSaveResponse = {\n download: BrowserDownload;\n destinationPath: string;\n fileId: string;\n operationId: string;\n replayed: boolean;\n};\n\nexport type InteractionRect = {\n x: number;\n y: number;\n width: number;\n height: number;\n};\n\nexport type InteractionRedactedValue = {\n redacted: true;\n reason: \"password\" | \"payment\" | \"private\" | \"policy\";\n};\n\nexport type InteractionSemanticNode = {\n ref: string;\n role: string;\n identifier?: string | undefined;\n name?: string | undefined;\n description?: string | undefined;\n value?: string | InteractionRedactedValue | undefined;\n states: string[];\n bounds?: InteractionRect | undefined;\n actions: string[];\n children?: InteractionSemanticNode[] | undefined;\n native?: { platform: \"dom\" | \"mac_ax\" | \"at_spi\" | \"uia\"; data: unknown } | undefined;\n};\n\nexport type InteractionSemanticSnapshot = {\n kind: \"snapshot\";\n roots: InteractionSemanticNode[];\n nodeCount: number;\n};\n\nexport type InteractionSemanticDiff = {\n kind: \"diff\";\n baseObservationId: string;\n removedRefs: string[];\n changed: InteractionSemanticNode[];\n};\n\nexport type InteractionDiagnosticSummary = {\n consoleErrorCount: number;\n failedRequestCount: number;\n downloadCount: number;\n pageErrorCount: number;\n};\n\nexport type BrowserDialog = {\n type: \"alert\" | \"confirm\" | \"prompt\" | \"beforeunload\";\n message: string;\n defaultPrompt: string;\n openedAt: string;\n};\n\nexport type BrowserObservation = {\n protocolVersion: typeof INTERACTION_PROTOCOL_VERSION;\n observationId: string;\n browserSessionId: string;\n target: BrowserTarget;\n frameId: string | null;\n semantic: InteractionSemanticSnapshot | InteractionSemanticDiff | null;\n screenshot: RetainedArtifactReference | null;\n viewport?:\n | {\n width: number;\n height: number;\n visualWidth: number;\n visualHeight: number;\n deviceScaleFactor: number;\n maxTouchPoints: number;\n }\n | null\n | undefined;\n focusedRef: string | null;\n changedRegions: InteractionRect[];\n diagnostics: InteractionDiagnosticSummary;\n dialog: BrowserDialog | null;\n observedAt: string;\n};\n\nexport type BrowserDiagnosticKind = \"console\" | \"page_error\" | \"failed_request\" | \"download\";\n\nexport type BrowserDiagnosticEntry = {\n sequence: number;\n kind: BrowserDiagnosticKind;\n level: \"debug\" | \"info\" | \"warning\" | \"error\" | null;\n message: string;\n url: string | null;\n method: string | null;\n status: number | null;\n filename: string | null;\n occurredAt: string;\n};\n\nexport type BrowserDiagnosticBatch = {\n browserSessionId: string;\n controllerGeneration: string;\n targetId: string;\n targetGeneration: string;\n entries: BrowserDiagnosticEntry[];\n cursor: number;\n truncated: boolean;\n};\n\nexport type BrowserLocator =\n | { kind: \"ref\"; ref: string }\n | {\n kind: \"role\";\n role: string;\n name?: string | undefined;\n exact?: boolean | undefined;\n }\n | { kind: \"label\"; text: string }\n | { kind: \"text\"; text: string }\n | { kind: \"placeholder\"; text: string }\n | { kind: \"test_id\"; value: string }\n | { kind: \"css\"; selector: string };\n\nexport type BrowserPermission =\n | \"geolocation\"\n | \"notifications\"\n | \"camera\"\n | \"microphone\"\n | \"midi\"\n | \"midi_sysex\"\n | \"sensors\"\n | \"idle_detection\"\n | \"local_fonts\"\n | \"window_management\";\n\nexport type BrowserPermissionSetting = \"granted\" | \"denied\" | \"prompt\";\n\nexport type BrowserAction =\n | { type: \"navigate\"; url: string }\n | { type: \"history\"; direction: \"back\" | \"forward\" }\n | { type: \"activate\" }\n | {\n type: \"viewport\";\n width: number;\n height: number;\n mobile: boolean;\n deviceScaleFactor?: number | undefined;\n }\n | {\n type: \"click\";\n locator: BrowserLocator;\n button?: \"left\" | \"right\" | \"middle\" | undefined;\n }\n | { type: \"double_click\"; locator: BrowserLocator }\n | { type: \"hover\"; locator: BrowserLocator }\n | { type: \"fill\"; locator: BrowserLocator; value: string }\n | {\n type: \"type\";\n locator?: BrowserLocator | undefined;\n text: string;\n /** `keys` sends one key press per character (split one-time-code boxes). */\n mode?: \"insert\" | \"keys\" | undefined;\n }\n | { type: \"press\"; locator?: BrowserLocator | undefined; key: string }\n | { type: \"select\"; locator: BrowserLocator; values: string[] }\n | { type: \"check\"; locator: BrowserLocator; checked: boolean }\n | {\n type: \"scroll\";\n locator?: BrowserLocator | undefined;\n deltaX: number;\n deltaY: number;\n }\n | { type: \"drag\"; from: BrowserLocator; to: BrowserLocator }\n | {\n type: \"pointer\";\n action: \"click\" | \"double_click\" | \"move\" | \"scroll\" | \"drag\";\n x: number;\n y: number;\n endX?: number | undefined;\n endY?: number | undefined;\n deltaX?: number | undefined;\n deltaY?: number | undefined;\n button?: \"left\" | \"right\" | \"middle\" | undefined;\n clickCount?: 1 | 2 | undefined;\n }\n | {\n type: \"handle_dialog\";\n response: \"accept\" | \"dismiss\";\n promptText?: string | undefined;\n }\n | { type: \"upload\"; locator: BrowserLocator; workspaceFileIds: string[] }\n | {\n type: \"clipboard\";\n operation: \"write\" | \"clear\" | \"copy\" | \"paste\";\n text?: string | undefined;\n locator?: BrowserLocator | undefined;\n content?: \"selection\" | \"value\" | \"text\" | undefined;\n }\n | {\n type: \"permission\";\n permission: BrowserPermission;\n setting: BrowserPermissionSetting;\n }\n | {\n type: \"wait\";\n condition: \"load\" | \"network_idle\" | \"visible\" | \"hidden\";\n locator?: BrowserLocator | undefined;\n timeoutMs?: number | undefined;\n };\n\nexport type BrowserActionBatch = {\n type: \"batch\";\n actions: BrowserAction[];\n fenceEachAction?: true | undefined;\n};\n\nexport type InteractionError = {\n code:\n | \"resource_not_found\"\n | \"resource_unavailable\"\n | \"controller_stale\"\n | \"target_not_found\"\n | \"target_stale\"\n | \"observation_stale\"\n | \"document_stale\"\n | \"frame_stale\"\n | \"locator_not_found\"\n | \"locator_ambiguous\"\n | \"unsupported\"\n | \"permission_denied\"\n | \"machine_locked\"\n | \"attempt_stale\"\n | \"operation_conflict\"\n | \"outcome_unknown\"\n | \"invalid_action\"\n | \"timeout\"\n | \"tab_not_responding\"\n | \"tab_crashed\"\n | \"controller_lost\"\n | \"driver_failed\";\n message: string;\n retryable: boolean;\n details?: Record<string, InteractionJsonValue> | undefined;\n};\n\nexport type InteractionOperationState =\n | \"prepared\"\n | \"dispatched\"\n | \"completed\"\n | \"failed\"\n | \"outcome_unknown\";\n\nexport type InteractionLifecycleOperationReceipt = {\n operationId: string;\n resourceKind: \"browser_session\" | \"computer_session\";\n resourceId: string;\n kind: \"create\" | \"resume\" | \"suspend\" | \"end\" | \"publish\";\n state: InteractionOperationState;\n replayed: boolean;\n error: InteractionError | null;\n createdAt: string;\n dispatchedAt: string | null;\n settledAt: string | null;\n};\n\nexport type CreateBrowserSessionRequest = {\n operationId: string;\n sessionId: string;\n name?: string | undefined;\n initialUrl?: string | undefined;\n headless?: boolean | undefined;\n storageMode?: \"private_profile\" | \"ephemeral_context\" | undefined;\n engine?: \"chromium\" | \"lightpanda\" | undefined;\n placement?: InteractionPlacement | undefined;\n identityId?: string | undefined;\n baseRevisionId?: string | undefined;\n networkRouteId?: string | undefined;\n linkedComputerSessionId?: string | undefined;\n};\n\nexport type BrowserSessionListResponse = {\n revision: number;\n sessions: BrowserSession[];\n};\n\nexport type BrowserSessionMutationResponse = {\n session: BrowserSession;\n operation: InteractionLifecycleOperationReceipt;\n /** Present only on a create that launched the browser in this request. */\n initialView?: { targets: BrowserTarget[]; observation: BrowserObservation } | undefined;\n};\n\nexport type BrowserSessionLifecycleRequest = { operationId: string };\n\n/** Why a browser's preserved working copy cannot be adopted as it is. */\nexport type BrowserWorkingCopyRefusal =\n | \"unsupported_platform\"\n | \"unsupported_browser\"\n | \"browser_running\"\n | \"working_copy_invalid\"\n | \"receipt_not_adoptable\"\n | \"authority_changed\"\n | \"process_state_unknown\"\n | \"adoption_not_needed\"\n | \"adoption_unresolved\";\n\n/** One adoption of a copied working directory, as its controller recorded it. */\nexport type BrowserWorkingCopyAdoption = {\n operationId: string;\n browserSessionId: string;\n controllerGeneration: string;\n manifestDigest: string;\n phase:\n | \"intent\"\n | \"copied\"\n | \"receipt\"\n | \"source_preserved\"\n | \"adopted\"\n | \"interrupted\"\n | \"failed\"\n | \"collision\"\n | \"reverting\"\n | \"reverted\";\n failureCode: string | null;\n retainedDirectories: string[];\n createdAt: string;\n updatedAt: string;\n};\n\n/** Evidence about a browser's preserved working copy after its controller lost\n * it. Freshness is never machine-proven. */\nexport type BrowserWorkingCopyInspection = {\n browserSessionId: string;\n controllerGeneration: string;\n adoptable: boolean;\n refusal: BrowserWorkingCopyRefusal | null;\n explanation: string;\n /** `excluded` lists the controller-owned derived entries left out of the\n * copy (journal shared-memory indexes and the per-launch launcher folder). */\n manifest: { digest: string; entries: number; bytes: number; excluded: string[] } | null;\n platformSupported: boolean;\n profileIdentityMatches: boolean;\n profileInUse: boolean | null;\n receipt: {\n operationId: string;\n intent: \"launch\" | \"suspend\" | \"retire\" | \"adopt\";\n state: string;\n directoryLaunchAllowed: boolean;\n authorityMatches: boolean;\n launchedFromCheckpoint: boolean;\n adoption: { operationId: string; manifestDigest: string } | null;\n } | null;\n freshness: { status: \"unknown\"; latestCheckpointAt: string | null };\n activeAdoption: BrowserWorkingCopyAdoption | null;\n};\n\nexport type BrowserWorkingCopyAdoptionRequest = { operationId: string; manifestDigest: string };\n\nexport type BrowserWorkingCopyAdoptionResponse = {\n inFlight: boolean;\n adoption: BrowserWorkingCopyAdoption | null;\n explanation: string;\n};\n\nexport type BrowserOpenTargetRequest = { url?: string | undefined };\n\nexport type BrowserTargetListResponse = {\n browserSessionId: string;\n controllerGeneration: string;\n targets: BrowserTarget[];\n};\n\nexport type InteractionFrameStreamAttachment<RelayKind extends 3 | 4 = 3 | 4> =\n | { kind: \"direct_websocket\"; url: string; protocols: string[] }\n | {\n kind: \"relay\";\n url: string;\n token: string;\n channel: {\n channelId: string;\n workspaceId: string;\n agentId: string;\n kind: RelayKind;\n port: number;\n };\n };\n\nexport type ComputerFrameStreamAttachment =\n | InteractionFrameStreamAttachment<4>\n | { kind: \"direct_rfb\"; url: string; protocols: string[]; inputAllowed: boolean };\n\nexport type BrowserSessionAttachment = {\n browserSessionId: string;\n controllerGeneration: string;\n targetId: string;\n stream: InteractionFrameStreamAttachment<3>;\n /** Negotiated from this attachment’s live controller, absent on older helpers. */\n fencedInputBatches?: true | undefined;\n focusedInputObservations?: true | undefined;\n expiresAt: string;\n};\n\nexport type BrowserSessionAttachmentRequest = {\n targetId: string;\n expiresInSeconds?: number | undefined;\n stream?: BrowserFrameStreamOptions | undefined;\n};\n\nexport type BrowserActionRequest = {\n operationId: string;\n targetId: string;\n /** Omit the three fences to act on the target's current state; the API reads\n * them from the live controller in the same request. */\n expectedTargetGeneration?: string | undefined;\n expectedDocumentGeneration?: string | null | undefined;\n expectedFrameId?: string | null | undefined;\n /** `input` is negotiated by focusedInputObservations on a live attachment.\n * It returns optional native-select metadata after a pointer click, and null\n * for ordinary input. Use full for agent observations. */\n observationMode?: \"full\" | \"none\" | \"input\" | undefined;\n action: BrowserAction | BrowserActionBatch;\n};\n\nexport type BrowserActionReceipt = {\n protocolVersion: typeof INTERACTION_PROTOCOL_VERSION;\n operationId: string;\n browserSessionId: string;\n controllerGeneration: string;\n targetId: string;\n state: InteractionOperationState;\n dispatchedAt: string | null;\n settledAt: string | null;\n observation: BrowserObservation | null;\n error: InteractionError | null;\n /** Elements the action's locators resolved to, in dispatch order. */\n targets?: BrowserActionResolvedTarget[] | undefined;\n};\n\nexport type BrowserActionResolvedTarget = {\n actionIndex: number;\n ref: string | null;\n role: string;\n name: string | null;\n /** Nearest dialog, landmark, menu or toolbar around the element. */\n container: { role: string; name: string | null } | null;\n};\n\nexport type BrowserSessionHeartbeatResponse = {\n browserSessionId: string;\n controllerGeneration: string;\n alive: true;\n};\n\nexport type ComputerSessionCapabilities = {\n semanticObservation: boolean;\n appDiscovery: boolean;\n appLaunch: boolean;\n windowCapture: boolean;\n screenCapture: boolean;\n semanticActions: boolean;\n pointerInput: boolean;\n /** Causal count-2 input requires its exact confirmed first operation. Absent means unsupported. */\n pointerClickContinuation?: boolean | undefined;\n keyboardInput: boolean;\n clipboard: boolean;\n backgroundActions: boolean;\n /** Raw window input stays in the background. Absent means foreground-only. */\n backgroundInput?: boolean | undefined;\n parallelApps: boolean;\n};\n\nexport type ComputerClipboard = {\n computerSessionId: string;\n controllerGeneration: string;\n text: string | null;\n truncated: boolean;\n observedAt: string;\n};\n\nexport type ComputerSession = {\n id: string;\n accountId: string;\n workspaceId: string;\n name: string;\n lifecycle: InteractionLifecycle;\n placement: InteractionPlacement;\n controller: InteractionControllerBinding | null;\n platform: \"linux\" | \"macos\" | \"windows\" | null;\n adapter: string | null;\n seatId: string | null;\n displayId: string | null;\n capabilities: ComputerSessionCapabilities | null;\n associations: InteractionAssociation[];\n createdBySubjectId: string;\n createdAt: string;\n lastUsedAt: string;\n failureCode: string | null;\n};\n\nexport type ComputerTarget = {\n id: string;\n computerSessionId: string;\n controllerGeneration: string;\n targetGeneration: string;\n kind: \"app\" | \"window\" | \"screen\";\n applicationId: string | null;\n processId: number | null;\n title: string;\n bounds: InteractionRect | null;\n focused: boolean;\n};\n\nexport type ComputerObservation = {\n protocolVersion: typeof INTERACTION_PROTOCOL_VERSION;\n observationId: string;\n computerSessionId: string;\n target: ComputerTarget;\n frameId: string | null;\n semantic: InteractionSemanticSnapshot | InteractionSemanticDiff | null;\n screenshot: RetainedArtifactReference | null;\n focusedRef: string | null;\n changedRegions: InteractionRect[];\n observedAt: string;\n};\n\nexport type ComputerLocator =\n | { kind: \"ref\"; ref: string }\n | {\n kind: \"role\";\n role: string;\n name?: string | undefined;\n exact?: boolean | undefined;\n }\n | { kind: \"label\"; text: string; exact?: boolean | undefined }\n | { kind: \"text\"; text: string; exact?: boolean | undefined }\n | { kind: \"identifier\"; value: string };\n\nexport type ComputerAction =\n | {\n type: \"semantic\";\n locator: ComputerLocator;\n action:\n | \"invoke\"\n | \"focus\"\n | \"set_value\"\n | \"increment\"\n | \"decrement\"\n | \"select\"\n | \"deselect\"\n | \"expand\"\n | \"collapse\"\n | \"show_menu\"\n | \"scroll_into_view\";\n value?: string | number | boolean | undefined;\n }\n | {\n type: \"pointer\";\n frameId: string;\n action: \"click\" | \"double_click\" | \"move\" | \"scroll\" | \"drag\";\n x: number;\n y: number;\n endX?: number | undefined;\n endY?: number | undefined;\n deltaX?: number | undefined;\n deltaY?: number | undefined;\n button?: \"left\" | \"right\" | \"middle\" | undefined;\n /** Click only; 2 delivers one second click pair after a completed first click. */\n clickCount?: 1 | 2 | undefined;\n continuationOfOperationId?: string | undefined;\n }\n | { type: \"keyboard\"; action: \"type\" | \"press\"; value: string }\n | {\n type: \"clipboard\";\n operation: \"write\" | \"clear\" | \"copy\" | \"paste\";\n text?: string | undefined;\n }\n | { type: \"focus\"; targetId: string }\n | { type: \"launch\"; applicationId: string };\n\nexport type CreateComputerSessionRequest = {\n operationId: string;\n sessionId: string;\n name?: string | undefined;\n placement?: InteractionPlacement | undefined;\n};\n\nexport type ComputerSessionListResponse = {\n revision: number;\n sessions: ComputerSession[];\n};\n\nexport type ComputerSessionMutationResponse = {\n session: ComputerSession;\n operation: InteractionLifecycleOperationReceipt;\n};\n\nexport type ComputerSessionLifecycleRequest = { operationId: string };\n\nexport type ComputerTargetListResponse = {\n computerSessionId: string;\n controllerGeneration: string;\n targets: ComputerTarget[];\n};\n\nexport type InteractionFrameStreamOptions = {\n format?: \"jpeg\" | \"png\" | undefined;\n quality?: number | undefined;\n maxWidth?: number | undefined;\n maxHeight?: number | undefined;\n everyNthFrame?: number | undefined;\n};\n\nexport type ComputerFrameStreamOptions = InteractionFrameStreamOptions;\n\nexport type ComputerSessionAttachment = {\n computerSessionId: string;\n controllerGeneration: string;\n targetId: string;\n /** Viewer posture when attached; actions still reauthorize the live source. */\n inputAllowed?: boolean | undefined;\n stream: ComputerFrameStreamAttachment;\n expiresAt: string;\n};\n\n/** Caller-specific hint only; every action still requires live authorization. */\nexport type ComputerSessionInputPosture = {\n computerSessionId: string;\n controllerGeneration: string;\n inputAllowed: boolean;\n};\n\nexport type ComputerSessionAttachmentRequest = {\n targetId: string;\n expiresInSeconds?: number | undefined;\n stream?: ComputerFrameStreamOptions | undefined;\n};\n\nexport type ComputerActionRequest = {\n operationId: string;\n targetId: string;\n expectedTargetGeneration: string;\n expectedObservationId: string | null;\n expectedFrameId: string | null;\n action: ComputerAction;\n};\n\nexport type ComputerActionReceipt = {\n protocolVersion: typeof INTERACTION_PROTOCOL_VERSION;\n operationId: string;\n computerSessionId: string;\n controllerGeneration: string;\n targetId: string;\n state: InteractionOperationState;\n dispatchedAt: string | null;\n settledAt: string | null;\n observation: ComputerObservation | null;\n error: InteractionError | null;\n};\n\nexport type ComputerSessionHeartbeatResponse = {\n computerSessionId: string;\n controllerGeneration: string;\n alive: true;\n};\n\nexport type BrowserDiagnosticsOptions = {\n kinds?: BrowserDiagnosticKind[] | undefined;\n after?: number | undefined;\n limit?: number | undefined;\n signal?: AbortSignal | undefined;\n};\n\n/** The exact HTTP surface needed by the framework-free interaction client. */\nexport interface InteractionTransport {\n listNetworkRoutes(\n workspaceId: string,\n options?: NetworkRouteListOptions,\n ): Promise<NetworkRouteListResponse>;\n getNetworkRoute(\n workspaceId: string,\n networkRouteId: string,\n options?: OpenGeniRequestOptions,\n ): Promise<NetworkRoute>;\n createNetworkRoute(\n workspaceId: string,\n request: CreateNetworkRouteRequest,\n options?: OpenGeniRequestOptions,\n ): Promise<NetworkRouteMutationResponse>;\n updateNetworkRoute(\n workspaceId: string,\n networkRouteId: string,\n request: UpdateNetworkRouteRequest,\n options?: OpenGeniRequestOptions,\n ): Promise<NetworkRouteMutationResponse>;\n listSiteAuthConnections(\n workspaceId: string,\n options?: SiteAuthConnectionListOptions,\n ): Promise<SiteAuthConnectionListResponse>;\n getSiteAuthConnection(\n workspaceId: string,\n siteAuthConnectionId: string,\n options?: OpenGeniRequestOptions,\n ): Promise<SiteAuthConnection>;\n createSiteAuthConnection(\n workspaceId: string,\n request: CreateSiteAuthConnectionRequest,\n options?: OpenGeniRequestOptions,\n ): Promise<SiteAuthConnectionMutationResponse>;\n updateSiteAuthConnection(\n workspaceId: string,\n siteAuthConnectionId: string,\n request: UpdateSiteAuthConnectionRequest,\n options?: OpenGeniRequestOptions,\n ): Promise<SiteAuthConnectionMutationResponse>;\n listAuthRuns(workspaceId: string, options?: AuthRunListOptions): Promise<AuthRunListResponse>;\n getAuthRun(\n workspaceId: string,\n authRunId: string,\n options?: OpenGeniRequestOptions,\n ): Promise<AuthRun>;\n startBrowserAuthRun(\n workspaceId: string,\n browserSessionId: string,\n request: StartAuthRunRequest,\n options?: OpenGeniRequestOptions,\n ): Promise<AuthRunMutationResponse>;\n reportBrowserAuthRun(\n workspaceId: string,\n browserSessionId: string,\n authRunId: string,\n request: ReportAuthRunRequest,\n options?: OpenGeniRequestOptions,\n ): Promise<AuthRunMutationResponse>;\n advanceExternalBrowserAuthRun(\n workspaceId: string,\n browserSessionId: string,\n authRunId: string,\n request: ExternalAuthRunRequest,\n options?: OpenGeniRequestOptions,\n ): Promise<ExternalAuthRunResponse>;\n openExternalBrowserAuthFlow(\n workspaceId: string,\n browserSessionId: string,\n authRunId: string,\n request: ExternalAuthInteractiveRequest,\n options?: OpenGeniRequestOptions,\n ): Promise<ExternalAuthInteractiveResponse>;\n verifyBrowserAuthRun(\n workspaceId: string,\n browserSessionId: string,\n authRunId: string,\n request: VerifyAuthRunRequest,\n options?: OpenGeniRequestOptions,\n ): Promise<AuthRunMutationResponse>;\n listInteractionInterventions(\n workspaceId: string,\n options?: InteractionInterventionListOptions,\n ): Promise<InteractionInterventionListResponse>;\n getInteractionIntervention(\n workspaceId: string,\n interventionId: string,\n options?: OpenGeniRequestOptions,\n ): Promise<InteractionIntervention>;\n createInteractionIntervention(\n workspaceId: string,\n request: CreateInteractionInterventionRequest,\n options?: OpenGeniRequestOptions,\n ): Promise<InteractionInterventionMutationResponse>;\n resolveInteractionIntervention(\n workspaceId: string,\n interventionId: string,\n request: ResolveInteractionInterventionRequest,\n options?: OpenGeniRequestOptions,\n ): Promise<InteractionInterventionMutationResponse>;\n listAttachedBrowsers(\n workspaceId: string,\n options?: AttachedBrowserDeviceListOptions,\n ): Promise<AttachedBrowserDeviceListResponse>;\n getAttachedBrowser(\n workspaceId: string,\n deviceId: string,\n options?: OpenGeniRequestOptions,\n ): Promise<AttachedBrowserDevice>;\n listBrowserIdentities(\n workspaceId: string,\n options?: BrowserIdentityListOptions,\n ): Promise<BrowserIdentityListResponse>;\n getBrowserIdentity(\n workspaceId: string,\n identityId: string,\n options?: OpenGeniRequestOptions,\n ): Promise<BrowserIdentity>;\n createBrowserIdentity(\n workspaceId: string,\n request: CreateBrowserIdentityRequest,\n options?: OpenGeniRequestOptions,\n ): Promise<BrowserIdentityMutationResponse>;\n updateBrowserIdentity(\n workspaceId: string,\n identityId: string,\n request: UpdateBrowserIdentityRequest,\n options?: OpenGeniRequestOptions,\n ): Promise<BrowserIdentityMutationResponse>;\n listBrowserRevisions(\n workspaceId: string,\n identityId: string,\n options?: OpenGeniRequestOptions,\n ): Promise<BrowserRevisionListResponse>;\n listBrowserSessions(\n workspaceId: string,\n options?: OpenGeniRequestOptions | InteractionSessionListOptions,\n ): Promise<BrowserSessionListResponse>;\n getBrowserSession(\n workspaceId: string,\n browserSessionId: string,\n options?: OpenGeniRequestOptions,\n ): Promise<BrowserSession>;\n readBrowserClipboard(\n workspaceId: string,\n browserSessionId: string,\n options?: OpenGeniRequestOptions,\n ): Promise<BrowserClipboard>;\n listBrowserDownloads(\n workspaceId: string,\n browserSessionId: string,\n options?: OpenGeniRequestOptions,\n ): Promise<BrowserDownloadListResponse>;\n getBrowserDownload(\n workspaceId: string,\n browserSessionId: string,\n downloadId: string,\n options?: OpenGeniRequestOptions,\n ): Promise<BrowserDownload>;\n saveBrowserDownload(\n workspaceId: string,\n browserSessionId: string,\n downloadId: string,\n request: BrowserDownloadSaveRequest,\n options?: OpenGeniRequestOptions,\n ): Promise<BrowserDownloadSaveResponse>;\n createBrowserSession(\n workspaceId: string,\n request: CreateBrowserSessionRequest,\n options?: OpenGeniRequestOptions,\n ): Promise<BrowserSessionMutationResponse>;\n listBrowserTargets(\n workspaceId: string,\n browserSessionId: string,\n options?: OpenGeniRequestOptions,\n ): Promise<BrowserTargetListResponse>;\n openBrowserTarget(\n workspaceId: string,\n browserSessionId: string,\n request?: BrowserOpenTargetRequest,\n options?: OpenGeniRequestOptions,\n ): Promise<BrowserObservation>;\n /** Optional for custom transports predating metadata-only tab opening. */\n openBrowserTargetWithInventory?(\n workspaceId: string,\n browserSessionId: string,\n request?: BrowserOpenTargetRequest,\n options?: OpenGeniRequestOptions,\n ): Promise<BrowserTargetListResponse>;\n selectBrowserTarget(\n workspaceId: string,\n browserSessionId: string,\n targetId: string,\n options?: OpenGeniRequestOptions,\n ): Promise<BrowserObservation>;\n closeBrowserTarget(\n workspaceId: string,\n browserSessionId: string,\n targetId: string,\n options?: OpenGeniRequestOptions,\n ): Promise<BrowserTargetListResponse>;\n observeBrowserTarget(\n workspaceId: string,\n browserSessionId: string,\n targetId: string,\n options?: OpenGeniRequestOptions,\n ): Promise<BrowserObservation>;\n getBrowserTargetState(\n workspaceId: string,\n browserSessionId: string,\n targetId: string,\n options?: OpenGeniRequestOptions,\n ): Promise<BrowserTargetState>;\n readBrowserDom(\n workspaceId: string,\n browserSessionId: string,\n targetId: string,\n request: BrowserDomReadRequest,\n options?: OpenGeniRequestOptions,\n ): Promise<BrowserDomReadResponse>;\n captureBrowserTarget(\n workspaceId: string,\n browserSessionId: string,\n targetId: string,\n options?: OpenGeniRequestOptions,\n captureOptions?: BrowserScreenshotOptions,\n ): Promise<BrowserFrame>;\n actInBrowser(\n workspaceId: string,\n browserSessionId: string,\n request: BrowserActionRequest,\n options?: OpenGeniRequestOptions,\n ): Promise<BrowserActionReceipt>;\n getBrowserActionReceipt(\n workspaceId: string,\n browserSessionId: string,\n operationId: string,\n options?: OpenGeniRequestOptions,\n ): Promise<BrowserActionReceipt>;\n listBrowserDiagnostics(\n workspaceId: string,\n browserSessionId: string,\n targetId: string,\n options?: BrowserDiagnosticsOptions,\n ): Promise<BrowserDiagnosticBatch>;\n attachBrowserSession(\n workspaceId: string,\n browserSessionId: string,\n request: BrowserSessionAttachmentRequest,\n options?: OpenGeniRequestOptions,\n ): Promise<BrowserSessionAttachment>;\n heartbeatBrowserSession(\n workspaceId: string,\n browserSessionId: string,\n options?: OpenGeniRequestOptions,\n ): Promise<BrowserSessionHeartbeatResponse>;\n publishBrowserRevision(\n workspaceId: string,\n browserSessionId: string,\n request: PublishBrowserRevisionRequest,\n options?: OpenGeniRequestOptions,\n ): Promise<PublishBrowserRevisionResponse>;\n suspendBrowserSession(\n workspaceId: string,\n browserSessionId: string,\n request: BrowserSessionLifecycleRequest,\n options?: OpenGeniRequestOptions,\n ): Promise<BrowserSessionMutationResponse>;\n resumeBrowserSession(\n workspaceId: string,\n browserSessionId: string,\n request: BrowserSessionLifecycleRequest,\n options?: OpenGeniRequestOptions,\n ): Promise<BrowserSessionMutationResponse>;\n endBrowserSession(\n workspaceId: string,\n browserSessionId: string,\n request: BrowserSessionLifecycleRequest,\n options?: OpenGeniRequestOptions,\n ): Promise<BrowserSessionMutationResponse>;\n listComputerSessions(\n workspaceId: string,\n options?: OpenGeniRequestOptions | InteractionSessionListOptions,\n ): Promise<ComputerSessionListResponse>;\n getComputerSession(\n workspaceId: string,\n computerSessionId: string,\n options?: OpenGeniRequestOptions,\n ): Promise<ComputerSession>;\n getComputerInputPosture?(\n workspaceId: string,\n computerSessionId: string,\n options?: OpenGeniRequestOptions,\n ): Promise<ComputerSessionInputPosture>;\n readComputerClipboard(\n workspaceId: string,\n computerSessionId: string,\n options?: OpenGeniRequestOptions,\n ): Promise<ComputerClipboard>;\n createComputerSession(\n workspaceId: string,\n request: CreateComputerSessionRequest,\n options?: OpenGeniRequestOptions,\n ): Promise<ComputerSessionMutationResponse>;\n listComputerTargets(\n workspaceId: string,\n computerSessionId: string,\n options?: OpenGeniRequestOptions,\n ): Promise<ComputerTargetListResponse>;\n observeComputerTarget(\n workspaceId: string,\n computerSessionId: string,\n targetId: string,\n options?: OpenGeniRequestOptions,\n ): Promise<ComputerObservation>;\n captureComputerTarget(\n workspaceId: string,\n computerSessionId: string,\n targetId: string,\n options?: OpenGeniRequestOptions,\n ): Promise<ComputerFrame>;\n callNativeComputerTool?(\n workspaceId: string,\n computerSessionId: string,\n request: ComputerNativeCallRequest,\n options?: OpenGeniRequestOptions,\n ): Promise<ComputerNativeReceipt>;\n actInComputer(\n workspaceId: string,\n computerSessionId: string,\n request: ComputerActionRequest,\n options?: OpenGeniRequestOptions,\n ): Promise<ComputerActionReceipt>;\n getNativeComputerToolReceipt?(\n workspaceId: string,\n computerSessionId: string,\n operationId: string,\n options?: OpenGeniRequestOptions,\n ): Promise<ComputerNativeReceipt>;\n getComputerActionReceipt(\n workspaceId: string,\n computerSessionId: string,\n operationId: string,\n options?: OpenGeniRequestOptions,\n ): Promise<ComputerActionReceipt>;\n attachComputerSession(\n workspaceId: string,\n computerSessionId: string,\n request: ComputerSessionAttachmentRequest,\n options?: OpenGeniRequestOptions,\n ): Promise<ComputerSessionAttachment>;\n heartbeatComputerSession(\n workspaceId: string,\n computerSessionId: string,\n options?: OpenGeniRequestOptions,\n ): Promise<ComputerSessionHeartbeatResponse>;\n endComputerSession(\n workspaceId: string,\n computerSessionId: string,\n request: ComputerSessionLifecycleRequest,\n options?: OpenGeniRequestOptions,\n ): Promise<ComputerSessionMutationResponse>;\n}\n\n/** @deprecated Use InteractionTransport. */\nexport type BrowserInteractionTransport = InteractionTransport;\n\nexport type BrowserIdentityListOptions = OpenGeniRequestOptions & {\n includeArchived?: boolean | undefined;\n};\n\nexport type NetworkRouteListOptions = OpenGeniRequestOptions & {\n includeArchived?: boolean | undefined;\n};\n\nexport type SiteAuthConnectionListOptions = OpenGeniRequestOptions & {\n includeArchived?: boolean | undefined;\n};\n\nexport type AuthRunListOptions = OpenGeniRequestOptions & {\n browserSessionId?: string | undefined;\n siteAuthConnectionId?: string | undefined;\n includeSettled?: boolean | undefined;\n};\n\nexport type InteractionInterventionListOptions = OpenGeniRequestOptions & {\n resourceKind?: \"browser_session\" | \"computer_session\" | undefined;\n resourceId?: string | undefined;\n includeSettled?: boolean | undefined;\n};\n\nexport type AttachedBrowserDeviceListOptions = OpenGeniRequestOptions & {\n includeDisconnected?: boolean | undefined;\n};\n\nexport type BrowserDownloadSaveOptions = OpenGeniRequestOptions & {\n operationId?: string | undefined;\n overwrite?: boolean | undefined;\n};\n\nexport type CurrentOrOpenBrowserOptions = {\n workspaceId: string;\n associationSessionId: string;\n operationId?: string | undefined;\n name?: string | undefined;\n initialUrl?: string | undefined;\n headless?: boolean | undefined;\n storageMode?: \"private_profile\" | \"ephemeral_context\" | undefined;\n placement?: InteractionPlacement | undefined;\n identityId?: string | undefined;\n baseRevisionId?: string | undefined;\n networkRouteId?: string | undefined;\n linkedComputerSessionId?: string | undefined;\n signal?: AbortSignal | undefined;\n};\n\nexport type CurrentOrOpenComputerOptions = {\n workspaceId: string;\n associationSessionId: string;\n operationId?: string | undefined;\n name?: string | undefined;\n placement?: InteractionPlacement | undefined;\n signal?: AbortSignal | undefined;\n};\n\n/** Framework-free resource facade over the public interaction HTTP API. */\nexport class OpenGeniInteractionClient {\n readonly attachedBrowsers: AttachedBrowserDeviceCollection;\n readonly authRuns: AuthRunCollection;\n readonly browsers: BrowserSessionCollection;\n readonly computers: ComputerSessionCollection;\n readonly identities: BrowserIdentityCollection;\n readonly interventions: InteractionInterventionCollection;\n readonly networkRoutes: NetworkRouteCollection;\n readonly siteAuthConnections: SiteAuthConnectionCollection;\n\n constructor(transport: BrowserInteractionTransport) {\n this.attachedBrowsers = new AttachedBrowserDeviceCollection(transport);\n this.authRuns = new AuthRunCollection(transport);\n this.browsers = new BrowserSessionCollection(transport);\n this.computers = new ComputerSessionCollection(transport);\n this.identities = new BrowserIdentityCollection(transport);\n this.interventions = new InteractionInterventionCollection(transport);\n this.networkRoutes = new NetworkRouteCollection(transport);\n this.siteAuthConnections = new SiteAuthConnectionCollection(transport);\n }\n}\n\nexport class NetworkRouteCollection {\n constructor(private readonly transport: BrowserInteractionTransport) {}\n\n async list(\n workspaceId: string,\n options: NetworkRouteListOptions = {},\n ): Promise<NetworkRouteListResponse> {\n return await this.transport.listNetworkRoutes(workspaceId, options);\n }\n\n route(workspaceId: string, networkRouteId: string): NetworkRouteResource {\n return new NetworkRouteResource(this.transport, workspaceId, networkRouteId);\n }\n\n async create(\n workspaceId: string,\n request: CreateNetworkRouteRequest,\n options: OpenGeniRequestOptions = {},\n ): Promise<NetworkRouteResource> {\n const response = await this.transport.createNetworkRoute(workspaceId, request, options);\n return this.route(workspaceId, response.route.id);\n }\n}\n\nexport class NetworkRouteResource {\n constructor(\n private readonly transport: BrowserInteractionTransport,\n readonly workspaceId: string,\n readonly id: string,\n ) {}\n\n async get(options: OpenGeniRequestOptions = {}): Promise<NetworkRoute> {\n return await this.transport.getNetworkRoute(this.workspaceId, this.id, options);\n }\n\n async update(\n request: UpdateNetworkRouteRequest,\n options: OpenGeniRequestOptions = {},\n ): Promise<NetworkRouteMutationResponse> {\n return await this.transport.updateNetworkRoute(this.workspaceId, this.id, request, options);\n }\n}\n\nexport class SiteAuthConnectionCollection {\n constructor(private readonly transport: BrowserInteractionTransport) {}\n\n async list(\n workspaceId: string,\n options: SiteAuthConnectionListOptions = {},\n ): Promise<SiteAuthConnectionListResponse> {\n return await this.transport.listSiteAuthConnections(workspaceId, options);\n }\n\n connection(workspaceId: string, connectionId: string): SiteAuthConnectionResource {\n return new SiteAuthConnectionResource(this.transport, workspaceId, connectionId);\n }\n\n async create(\n workspaceId: string,\n request: CreateSiteAuthConnectionRequest,\n options: OpenGeniRequestOptions = {},\n ): Promise<SiteAuthConnectionResource> {\n const response = await this.transport.createSiteAuthConnection(workspaceId, request, options);\n return this.connection(workspaceId, response.connection.id);\n }\n}\n\nexport class SiteAuthConnectionResource {\n constructor(\n private readonly transport: BrowserInteractionTransport,\n readonly workspaceId: string,\n readonly id: string,\n ) {}\n\n async get(options: OpenGeniRequestOptions = {}): Promise<SiteAuthConnection> {\n return await this.transport.getSiteAuthConnection(this.workspaceId, this.id, options);\n }\n\n async update(\n request: UpdateSiteAuthConnectionRequest,\n options: OpenGeniRequestOptions = {},\n ): Promise<SiteAuthConnectionMutationResponse> {\n return await this.transport.updateSiteAuthConnection(\n this.workspaceId,\n this.id,\n request,\n options,\n );\n }\n}\n\nexport class AuthRunCollection {\n constructor(private readonly transport: BrowserInteractionTransport) {}\n\n async list(workspaceId: string, options: AuthRunListOptions = {}): Promise<AuthRunListResponse> {\n return await this.transport.listAuthRuns(workspaceId, options);\n }\n\n async get(\n workspaceId: string,\n authRunId: string,\n options: OpenGeniRequestOptions = {},\n ): Promise<AuthRun> {\n return await this.transport.getAuthRun(workspaceId, authRunId, options);\n }\n\n run(workspaceId: string, browserSessionId: string, authRunId: string): AuthRunResource {\n return new AuthRunResource(this.transport, workspaceId, browserSessionId, authRunId);\n }\n}\n\nexport class BrowserAuthRunCollection {\n constructor(\n private readonly transport: BrowserInteractionTransport,\n readonly workspaceId: string,\n readonly browserSessionId: string,\n ) {}\n\n async list(\n options: Omit<AuthRunListOptions, \"browserSessionId\"> = {},\n ): Promise<AuthRunListResponse> {\n return await this.transport.listAuthRuns(this.workspaceId, {\n ...options,\n browserSessionId: this.browserSessionId,\n });\n }\n\n run(authRunId: string): AuthRunResource {\n return new AuthRunResource(this.transport, this.workspaceId, this.browserSessionId, authRunId);\n }\n\n async start(\n request: StartAuthRunRequest,\n options: OpenGeniRequestOptions = {},\n ): Promise<AuthRunResource> {\n const response = await this.transport.startBrowserAuthRun(\n this.workspaceId,\n this.browserSessionId,\n request,\n options,\n );\n return this.run(response.run.id);\n }\n}\n\nexport class AuthRunResource {\n constructor(\n private readonly transport: BrowserInteractionTransport,\n readonly workspaceId: string,\n readonly browserSessionId: string,\n readonly id: string,\n ) {}\n\n async get(options: OpenGeniRequestOptions = {}): Promise<AuthRun> {\n const run = await this.transport.getAuthRun(this.workspaceId, this.id, options);\n if (run.browserSessionId !== this.browserSessionId) {\n throw new Error(\"AuthRun belongs to another BrowserSession\");\n }\n return run;\n }\n\n async report(\n request: ReportAuthRunRequest,\n options: OpenGeniRequestOptions = {},\n ): Promise<AuthRunMutationResponse> {\n return await this.transport.reportBrowserAuthRun(\n this.workspaceId,\n this.browserSessionId,\n this.id,\n request,\n options,\n );\n }\n\n async advanceExternal(\n request: ExternalAuthRunRequest,\n options: OpenGeniRequestOptions = {},\n ): Promise<ExternalAuthRunResponse> {\n return await this.transport.advanceExternalBrowserAuthRun(\n this.workspaceId,\n this.browserSessionId,\n this.id,\n request,\n options,\n );\n }\n\n /** Human-session helper. Hosted provider URLs never appear in model tools. */\n async openExternalFlow(\n request: ExternalAuthInteractiveRequest,\n options: OpenGeniRequestOptions = {},\n ): Promise<ExternalAuthInteractiveResponse> {\n return await this.transport.openExternalBrowserAuthFlow(\n this.workspaceId,\n this.browserSessionId,\n this.id,\n request,\n options,\n );\n }\n\n async verify(\n request: VerifyAuthRunRequest,\n options: OpenGeniRequestOptions = {},\n ): Promise<AuthRunMutationResponse> {\n return await this.transport.verifyBrowserAuthRun(\n this.workspaceId,\n this.browserSessionId,\n this.id,\n request,\n options,\n );\n }\n}\n\nexport class InteractionInterventionCollection {\n constructor(private readonly transport: BrowserInteractionTransport) {}\n\n async list(\n workspaceId: string,\n options: InteractionInterventionListOptions = {},\n ): Promise<InteractionInterventionListResponse> {\n return await this.transport.listInteractionInterventions(workspaceId, options);\n }\n\n intervention(workspaceId: string, interventionId: string): InteractionInterventionResource {\n return new InteractionInterventionResource(this.transport, workspaceId, interventionId);\n }\n\n async create(\n workspaceId: string,\n request: CreateInteractionInterventionRequest,\n options: OpenGeniRequestOptions = {},\n ): Promise<InteractionInterventionResource> {\n const response = await this.transport.createInteractionIntervention(\n workspaceId,\n request,\n options,\n );\n return this.intervention(workspaceId, response.intervention.id);\n }\n}\n\nexport class InteractionInterventionResource {\n constructor(\n private readonly transport: BrowserInteractionTransport,\n readonly workspaceId: string,\n readonly id: string,\n ) {}\n\n async get(options: OpenGeniRequestOptions = {}): Promise<InteractionIntervention> {\n return await this.transport.getInteractionIntervention(this.workspaceId, this.id, options);\n }\n\n async resolve(\n request: ResolveInteractionInterventionRequest,\n options: OpenGeniRequestOptions = {},\n ): Promise<InteractionInterventionMutationResponse> {\n return await this.transport.resolveInteractionIntervention(\n this.workspaceId,\n this.id,\n request,\n options,\n );\n }\n}\n\nexport class AttachedBrowserDeviceCollection {\n constructor(private readonly transport: BrowserInteractionTransport) {}\n\n async list(\n workspaceId: string,\n options: AttachedBrowserDeviceListOptions = {},\n ): Promise<AttachedBrowserDeviceListResponse> {\n return await this.transport.listAttachedBrowsers(workspaceId, options);\n }\n\n device(workspaceId: string, deviceId: string): AttachedBrowserDeviceResource {\n return new AttachedBrowserDeviceResource(this.transport, workspaceId, deviceId);\n }\n}\n\nexport class AttachedBrowserDeviceResource {\n constructor(\n private readonly transport: BrowserInteractionTransport,\n readonly workspaceId: string,\n readonly id: string,\n ) {}\n\n async get(options: OpenGeniRequestOptions = {}): Promise<AttachedBrowserDevice> {\n return await this.transport.getAttachedBrowser(this.workspaceId, this.id, options);\n }\n}\n\nexport class BrowserIdentityCollection {\n constructor(private readonly transport: BrowserInteractionTransport) {}\n\n async list(\n workspaceId: string,\n options: BrowserIdentityListOptions = {},\n ): Promise<BrowserIdentityListResponse> {\n return await this.transport.listBrowserIdentities(workspaceId, options);\n }\n\n identity(workspaceId: string, identityId: string): BrowserIdentityResource {\n return new BrowserIdentityResource(this.transport, workspaceId, identityId);\n }\n\n async create(\n workspaceId: string,\n request: CreateBrowserIdentityRequest,\n options: OpenGeniRequestOptions = {},\n ): Promise<BrowserIdentityResource> {\n const response = await this.transport.createBrowserIdentity(workspaceId, request, options);\n return this.identity(workspaceId, response.identity.id);\n }\n}\n\nexport class BrowserIdentityResource {\n constructor(\n private readonly transport: BrowserInteractionTransport,\n readonly workspaceId: string,\n readonly id: string,\n ) {}\n\n async get(options: OpenGeniRequestOptions = {}): Promise<BrowserIdentity> {\n return await this.transport.getBrowserIdentity(this.workspaceId, this.id, options);\n }\n\n async revisions(options: OpenGeniRequestOptions = {}): Promise<BrowserRevisionListResponse> {\n return await this.transport.listBrowserRevisions(this.workspaceId, this.id, options);\n }\n\n async update(\n request: UpdateBrowserIdentityRequest,\n options: OpenGeniRequestOptions = {},\n ): Promise<BrowserIdentityMutationResponse> {\n return await this.transport.updateBrowserIdentity(this.workspaceId, this.id, request, options);\n }\n}\n\nexport class BrowserSessionCollection {\n constructor(private readonly transport: BrowserInteractionTransport) {}\n\n async list(\n workspaceId: string,\n options: OpenGeniRequestOptions | InteractionSessionListOptions = {},\n ): Promise<BrowserSessionListResponse> {\n return await this.transport.listBrowserSessions(workspaceId, options);\n }\n\n session(workspaceId: string, browserSessionId: string): BrowserSessionResource {\n return new BrowserSessionResource(this.transport, workspaceId, browserSessionId);\n }\n\n async open(\n workspaceId: string,\n request: CreateBrowserSessionRequest,\n options: OpenGeniRequestOptions = {},\n ): Promise<BrowserSessionResource> {\n const response = await this.transport.createBrowserSession(workspaceId, request, options);\n return this.session(workspaceId, response.session.id);\n }\n\n async currentOrOpen(options: CurrentOrOpenBrowserOptions): Promise<BrowserSessionResource> {\n const requestOptions = options.signal ? { signal: options.signal } : {};\n const listed = await this.list(options.workspaceId, requestOptions);\n const current = newestRelevantBrowser(\n listed.sessions.filter(\n (session) =>\n browserSessionStorageMode(session) === (options.storageMode ?? \"private_profile\"),\n ),\n options.associationSessionId,\n );\n if (current) {\n const resource = this.session(options.workspaceId, current.id);\n if (current.lifecycle === \"suspended\") {\n await resource.resume(\n { operationId: options.operationId ?? crypto.randomUUID() },\n requestOptions,\n );\n }\n return resource;\n }\n return await this.open(\n options.workspaceId,\n {\n operationId: options.operationId ?? crypto.randomUUID(),\n sessionId: options.associationSessionId,\n ...(options.name !== undefined ? { name: options.name } : {}),\n ...(options.initialUrl !== undefined ? { initialUrl: options.initialUrl } : {}),\n ...(options.headless !== undefined ? { headless: options.headless } : {}),\n ...(options.storageMode !== undefined ? { storageMode: options.storageMode } : {}),\n ...(options.placement !== undefined ? { placement: options.placement } : {}),\n ...(options.identityId !== undefined ? { identityId: options.identityId } : {}),\n ...(options.baseRevisionId !== undefined ? { baseRevisionId: options.baseRevisionId } : {}),\n ...(options.networkRouteId !== undefined ? { networkRouteId: options.networkRouteId } : {}),\n ...(options.linkedComputerSessionId !== undefined\n ? { linkedComputerSessionId: options.linkedComputerSessionId }\n : {}),\n },\n requestOptions,\n );\n }\n}\n\nexport class BrowserSessionResource {\n readonly auth: BrowserAuthRunCollection;\n readonly clipboard: BrowserClipboardResource;\n readonly downloads: BrowserDownloadCollection;\n readonly tabs: BrowserTargetCollection;\n /** Alias for hosts that prefer the protocol term. */\n readonly targets: BrowserTargetCollection;\n\n constructor(\n private readonly transport: BrowserInteractionTransport,\n readonly workspaceId: string,\n readonly id: string,\n ) {\n this.auth = new BrowserAuthRunCollection(transport, workspaceId, id);\n this.clipboard = new BrowserClipboardResource(transport, workspaceId, id);\n this.downloads = new BrowserDownloadCollection(transport, workspaceId, id);\n this.tabs = new BrowserTargetCollection(transport, workspaceId, id);\n this.targets = this.tabs;\n }\n\n async get(options: OpenGeniRequestOptions = {}): Promise<BrowserSession> {\n return await this.transport.getBrowserSession(this.workspaceId, this.id, options);\n }\n\n async observe(\n targetId: string,\n options: OpenGeniRequestOptions = {},\n ): Promise<BrowserObservation> {\n return await this.transport.observeBrowserTarget(this.workspaceId, this.id, targetId, options);\n }\n\n async targetState(\n targetId: string,\n options: OpenGeniRequestOptions = {},\n ): Promise<BrowserTargetState> {\n return await this.transport.getBrowserTargetState(this.workspaceId, this.id, targetId, options);\n }\n\n async readDom(\n targetId: string,\n request: BrowserDomReadRequest,\n options: OpenGeniRequestOptions = {},\n ): Promise<BrowserDomReadResponse> {\n return await this.transport.readBrowserDom(\n this.workspaceId,\n this.id,\n targetId,\n request,\n options,\n );\n }\n\n async capture(\n targetId: string,\n options: OpenGeniRequestOptions = {},\n captureOptions: BrowserScreenshotOptions = {},\n ): Promise<BrowserFrame> {\n return await this.transport.captureBrowserTarget(\n this.workspaceId,\n this.id,\n targetId,\n options,\n captureOptions,\n );\n }\n\n async screenshot(\n targetId: string,\n captureOptions: BrowserScreenshotOptions = {},\n options: OpenGeniRequestOptions = {},\n ): Promise<BrowserFrame> {\n return await this.capture(targetId, options, captureOptions);\n }\n\n async act(\n request: BrowserActionRequest,\n options: OpenGeniRequestOptions = {},\n ): Promise<BrowserActionReceipt> {\n return await this.transport.actInBrowser(this.workspaceId, this.id, request, options);\n }\n\n async receipt(\n operationId: string,\n options: OpenGeniRequestOptions = {},\n ): Promise<BrowserActionReceipt> {\n return await this.transport.getBrowserActionReceipt(\n this.workspaceId,\n this.id,\n operationId,\n options,\n );\n }\n\n async diagnostics(\n targetId: string,\n options: BrowserDiagnosticsOptions = {},\n ): Promise<BrowserDiagnosticBatch> {\n return await this.transport.listBrowserDiagnostics(\n this.workspaceId,\n this.id,\n targetId,\n options,\n );\n }\n\n async attach(\n request: BrowserSessionAttachmentRequest,\n options: OpenGeniRequestOptions = {},\n ): Promise<BrowserSessionAttachment> {\n return await this.transport.attachBrowserSession(this.workspaceId, this.id, request, options);\n }\n\n async heartbeat(options: OpenGeniRequestOptions = {}): Promise<BrowserSessionHeartbeatResponse> {\n return await this.transport.heartbeatBrowserSession(this.workspaceId, this.id, options);\n }\n\n async publishRevision(\n request: PublishBrowserRevisionRequest,\n options: OpenGeniRequestOptions = {},\n ): Promise<PublishBrowserRevisionResponse> {\n return await this.transport.publishBrowserRevision(this.workspaceId, this.id, request, options);\n }\n\n async suspend(\n request: BrowserSessionLifecycleRequest = {\n operationId: crypto.randomUUID(),\n },\n options: OpenGeniRequestOptions = {},\n ): Promise<BrowserSessionMutationResponse> {\n return await this.transport.suspendBrowserSession(this.workspaceId, this.id, request, options);\n }\n\n async resume(\n request: BrowserSessionLifecycleRequest = {\n operationId: crypto.randomUUID(),\n },\n options: OpenGeniRequestOptions = {},\n ): Promise<BrowserSessionMutationResponse> {\n return await this.transport.resumeBrowserSession(this.workspaceId, this.id, request, options);\n }\n\n async end(\n request: BrowserSessionLifecycleRequest = {\n operationId: crypto.randomUUID(),\n },\n options: OpenGeniRequestOptions = {},\n ): Promise<BrowserSessionMutationResponse> {\n return await this.transport.endBrowserSession(this.workspaceId, this.id, request, options);\n }\n}\n\nexport class BrowserClipboardResource {\n constructor(\n private readonly transport: BrowserInteractionTransport,\n readonly workspaceId: string,\n readonly browserSessionId: string,\n ) {}\n\n async read(options: OpenGeniRequestOptions = {}): Promise<BrowserClipboard> {\n const clipboard = await this.transport.readBrowserClipboard(\n this.workspaceId,\n this.browserSessionId,\n options,\n );\n if (clipboard.browserSessionId !== this.browserSessionId) {\n throw new Error(\"Browser clipboard belongs to another BrowserSession\");\n }\n return clipboard;\n }\n}\n\nexport class BrowserDownloadCollection {\n constructor(\n private readonly transport: BrowserInteractionTransport,\n readonly workspaceId: string,\n readonly browserSessionId: string,\n ) {}\n\n async list(options: OpenGeniRequestOptions = {}): Promise<BrowserDownloadListResponse> {\n return await this.transport.listBrowserDownloads(\n this.workspaceId,\n this.browserSessionId,\n options,\n );\n }\n\n download(downloadId: string): BrowserDownloadResource {\n return new BrowserDownloadResource(\n this.transport,\n this.workspaceId,\n this.browserSessionId,\n downloadId,\n );\n }\n}\n\nexport class BrowserDownloadResource {\n constructor(\n private readonly transport: BrowserInteractionTransport,\n readonly workspaceId: string,\n readonly browserSessionId: string,\n readonly id: string,\n ) {}\n\n async get(options: OpenGeniRequestOptions = {}): Promise<BrowserDownload> {\n const download = await this.transport.getBrowserDownload(\n this.workspaceId,\n this.browserSessionId,\n this.id,\n options,\n );\n if (download.browserSessionId !== this.browserSessionId) {\n throw new Error(\"BrowserDownload belongs to another BrowserSession\");\n }\n return download;\n }\n\n /** Publish this exact private browser download into the source session's\n * workspace. Pass an operationId when the caller needs retry identity across\n * process boundaries; otherwise one is generated for this call. */\n async saveToWorkspace(\n destinationPath: string,\n options: BrowserDownloadSaveOptions = {},\n ): Promise<BrowserDownloadSaveResponse> {\n const { operationId = crypto.randomUUID(), overwrite = false, ...requestOptions } = options;\n const response = await this.transport.saveBrowserDownload(\n this.workspaceId,\n this.browserSessionId,\n this.id,\n { operationId, destinationPath, overwrite },\n requestOptions,\n );\n if (\n response.download.id !== this.id ||\n response.download.browserSessionId !== this.browserSessionId\n ) {\n throw new Error(\"BrowserDownload save returned another resource\");\n }\n return response;\n }\n}\n\nexport class BrowserTargetCollection {\n constructor(\n private readonly transport: BrowserInteractionTransport,\n private readonly workspaceId: string,\n private readonly browserSessionId: string,\n ) {}\n\n async list(options: OpenGeniRequestOptions = {}): Promise<BrowserTargetListResponse> {\n return await this.transport.listBrowserTargets(\n this.workspaceId,\n this.browserSessionId,\n options,\n );\n }\n\n async open(url?: string, options: OpenGeniRequestOptions = {}): Promise<BrowserObservation> {\n return await this.transport.openBrowserTarget(\n this.workspaceId,\n this.browserSessionId,\n url === undefined ? {} : { url },\n options,\n );\n }\n\n async select(\n targetId: string,\n options: OpenGeniRequestOptions = {},\n ): Promise<BrowserObservation> {\n return await this.transport.selectBrowserTarget(\n this.workspaceId,\n this.browserSessionId,\n targetId,\n options,\n );\n }\n\n async close(\n targetId: string,\n options: OpenGeniRequestOptions = {},\n ): Promise<BrowserTargetListResponse> {\n return await this.transport.closeBrowserTarget(\n this.workspaceId,\n this.browserSessionId,\n targetId,\n options,\n );\n }\n}\n\nexport class ComputerSessionCollection {\n constructor(private readonly transport: BrowserInteractionTransport) {}\n\n async list(\n workspaceId: string,\n options: OpenGeniRequestOptions | InteractionSessionListOptions = {},\n ): Promise<ComputerSessionListResponse> {\n return await this.transport.listComputerSessions(workspaceId, options);\n }\n\n session(workspaceId: string, computerSessionId: string): ComputerSessionResource {\n return new ComputerSessionResource(this.transport, workspaceId, computerSessionId);\n }\n\n async open(\n workspaceId: string,\n request: CreateComputerSessionRequest,\n options: OpenGeniRequestOptions = {},\n ): Promise<ComputerSessionResource> {\n const response = await this.transport.createComputerSession(workspaceId, request, options);\n return this.session(workspaceId, response.session.id);\n }\n\n async currentOrOpen(options: CurrentOrOpenComputerOptions): Promise<ComputerSessionResource> {\n const requestOptions = options.signal ? { signal: options.signal } : {};\n const listed = await this.list(options.workspaceId, requestOptions);\n const current = newestRelevantComputer(listed.sessions, options.associationSessionId);\n if (current) {\n return this.session(options.workspaceId, current.id);\n }\n return await this.open(\n options.workspaceId,\n {\n operationId: options.operationId ?? crypto.randomUUID(),\n sessionId: options.associationSessionId,\n ...(options.name !== undefined ? { name: options.name } : {}),\n ...(options.placement !== undefined ? { placement: options.placement } : {}),\n },\n requestOptions,\n );\n }\n}\n\nexport class ComputerSessionResource {\n readonly targets: ComputerTargetCollection;\n /** Native application/window targets are also the public app collection. */\n readonly apps: ComputerTargetCollection;\n readonly clipboard: ComputerClipboardResource;\n\n constructor(\n private readonly transport: BrowserInteractionTransport,\n readonly workspaceId: string,\n readonly id: string,\n ) {\n this.targets = new ComputerTargetCollection(transport, workspaceId, id);\n this.apps = this.targets;\n this.clipboard = new ComputerClipboardResource(transport, workspaceId, id);\n }\n\n async get(options: OpenGeniRequestOptions = {}): Promise<ComputerSession> {\n return await this.transport.getComputerSession(this.workspaceId, this.id, options);\n }\n\n async observe(\n targetId: string,\n options: OpenGeniRequestOptions = {},\n ): Promise<ComputerObservation> {\n return await this.transport.observeComputerTarget(this.workspaceId, this.id, targetId, options);\n }\n\n async capture(targetId: string, options: OpenGeniRequestOptions = {}): Promise<ComputerFrame> {\n return await this.transport.captureComputerTarget(this.workspaceId, this.id, targetId, options);\n }\n\n async callNativeTool(\n request: ComputerNativeCallRequest,\n options: OpenGeniRequestOptions = {},\n ): Promise<ComputerNativeReceipt> {\n if (!this.transport.callNativeComputerTool)\n throw new Error(\"Native CUA tools require a current interaction transport\");\n return await this.transport.callNativeComputerTool(this.workspaceId, this.id, request, options);\n }\n\n async act(\n request: ComputerActionRequest,\n options: OpenGeniRequestOptions = {},\n ): Promise<ComputerActionReceipt> {\n return await this.transport.actInComputer(this.workspaceId, this.id, request, options);\n }\n\n async nativeReceipt(\n operationId: string,\n options: OpenGeniRequestOptions = {},\n ): Promise<ComputerNativeReceipt> {\n if (!this.transport.getNativeComputerToolReceipt)\n throw new Error(\"Native CUA receipts require a current interaction transport\");\n return await this.transport.getNativeComputerToolReceipt(\n this.workspaceId,\n this.id,\n operationId,\n options,\n );\n }\n\n async receipt(\n operationId: string,\n options: OpenGeniRequestOptions = {},\n ): Promise<ComputerActionReceipt> {\n return await this.transport.getComputerActionReceipt(\n this.workspaceId,\n this.id,\n operationId,\n options,\n );\n }\n\n async attach(\n request: ComputerSessionAttachmentRequest,\n options: OpenGeniRequestOptions = {},\n ): Promise<ComputerSessionAttachment> {\n return await this.transport.attachComputerSession(this.workspaceId, this.id, request, options);\n }\n\n async inputPosture(options: OpenGeniRequestOptions = {}): Promise<ComputerSessionInputPosture> {\n if (!this.transport.getComputerInputPosture) {\n throw new Error(\"Computer input posture requires a current interaction transport.\");\n }\n return await this.transport.getComputerInputPosture(this.workspaceId, this.id, options);\n }\n\n async heartbeat(options: OpenGeniRequestOptions = {}): Promise<ComputerSessionHeartbeatResponse> {\n return await this.transport.heartbeatComputerSession(this.workspaceId, this.id, options);\n }\n\n async end(\n request: ComputerSessionLifecycleRequest = { operationId: crypto.randomUUID() },\n options: OpenGeniRequestOptions = {},\n ): Promise<ComputerSessionMutationResponse> {\n return await this.transport.endComputerSession(this.workspaceId, this.id, request, options);\n }\n}\n\nexport class ComputerClipboardResource {\n constructor(\n private readonly transport: BrowserInteractionTransport,\n readonly workspaceId: string,\n readonly computerSessionId: string,\n ) {}\n\n async read(options: OpenGeniRequestOptions = {}): Promise<ComputerClipboard> {\n const clipboard = await this.transport.readComputerClipboard(\n this.workspaceId,\n this.computerSessionId,\n options,\n );\n if (clipboard.computerSessionId !== this.computerSessionId) {\n throw new Error(\"Computer clipboard belongs to another ComputerSession\");\n }\n return clipboard;\n }\n}\n\nexport class ComputerTargetCollection {\n constructor(\n private readonly transport: BrowserInteractionTransport,\n private readonly workspaceId: string,\n private readonly computerSessionId: string,\n ) {}\n\n async list(options: OpenGeniRequestOptions = {}): Promise<ComputerTargetListResponse> {\n return await this.transport.listComputerTargets(\n this.workspaceId,\n this.computerSessionId,\n options,\n );\n }\n}\n\nexport type BrowserFrameMetadata = {\n frameId: string;\n browserSessionId: string;\n controllerGeneration: string;\n targetId: string;\n targetGeneration: string;\n documentGeneration: string;\n sequence: number;\n mediaType: \"image/jpeg\" | \"image/png\";\n width: number;\n height: number;\n deviceScaleFactor: number;\n scrollX: number;\n scrollY: number;\n capturedAt: string;\n};\n\nexport type BrowserFrame = BrowserFrameMetadata & { data: Uint8Array };\n\nexport type BrowserScreenshotOptions = {\n /** Capture the document content instead of the visible viewport. */\n fullPage?: boolean;\n format?: \"jpeg\" | \"png\";\n /** JPEG quality, from 1 to 100. Ignored for PNG. */\n quality?: number;\n};\n\nexport type ComputerFrameMetadata = {\n frameId: string;\n computerSessionId: string;\n controllerGeneration: string;\n targetId: string;\n targetGeneration: string;\n sequence: number;\n mediaType: \"image/jpeg\" | \"image/png\";\n width: number;\n height: number;\n capturedAt: string;\n sha256: string;\n};\n\nexport type ComputerFrame = ComputerFrameMetadata & { data: Uint8Array };\n\nexport type BrowserFrameStreamOptions = InteractionFrameStreamOptions;\n\n/** Convert a short-lived HTTP attachment URL into its browser WebSocket URL. */\nexport function browserFrameSocketUrl(\n attachment: BrowserSessionAttachment,\n options: BrowserFrameStreamOptions = {},\n): string {\n if (attachment.stream.kind !== \"direct_websocket\") {\n throw new Error(\"relay browser attachments are opened through the relay protocol\");\n }\n const url = new URL(attachment.stream.url);\n if (url.protocol === \"http:\") url.protocol = \"ws:\";\n else if (url.protocol === \"https:\") url.protocol = \"wss:\";\n else if (url.protocol !== \"ws:\" && url.protocol !== \"wss:\") {\n throw new Error(\"browser frame attachment did not contain an HTTP or WebSocket URL\");\n }\n upgradeMixedContentWebSocket(url);\n if (options.format !== undefined) url.searchParams.set(\"format\", options.format);\n setBoundedIntegerQuery(url, \"quality\", options.quality, 1, 100);\n setBoundedIntegerQuery(url, \"maxWidth\", options.maxWidth, 1, 4_096);\n setBoundedIntegerQuery(url, \"maxHeight\", options.maxHeight, 1, 4_096);\n setBoundedIntegerQuery(url, \"everyNthFrame\", options.everyNthFrame, 1, 60);\n return url.toString();\n}\n\n/** Convert a direct ComputerSession attachment into its WebSocket URL. */\nexport function computerFrameSocketUrl(\n attachment: ComputerSessionAttachment,\n options: ComputerFrameStreamOptions = {},\n): string {\n if (attachment.stream.kind !== \"direct_websocket\") {\n throw new Error(\"relay computer attachments are opened through the relay protocol\");\n }\n const url = new URL(attachment.stream.url);\n if (url.protocol === \"http:\") url.protocol = \"ws:\";\n else if (url.protocol === \"https:\") url.protocol = \"wss:\";\n else if (url.protocol !== \"ws:\" && url.protocol !== \"wss:\") {\n throw new Error(\"computer frame attachment did not contain an HTTP or WebSocket URL\");\n }\n upgradeMixedContentWebSocket(url);\n if (options.format !== undefined) url.searchParams.set(\"format\", options.format);\n setBoundedIntegerQuery(url, \"quality\", options.quality, 1, 100);\n setBoundedIntegerQuery(url, \"maxWidth\", options.maxWidth, 1, 4_096);\n setBoundedIntegerQuery(url, \"maxHeight\", options.maxHeight, 1, 4_096);\n setBoundedIntegerQuery(url, \"everyNthFrame\", options.everyNthFrame, 1, 60);\n return url.toString();\n}\n\n/** Decode one bounded binary frame message from the placement controller. */\nexport function decodeBrowserFrameMessage(message: ArrayBuffer | Uint8Array): BrowserFrame {\n const bytes = message instanceof Uint8Array ? message : new Uint8Array(message);\n if (\n bytes.byteLength < 5 ||\n bytes.byteLength > 4 + BROWSER_CONTROL_MAX_FRAME_HEADER_BYTES + BROWSER_FRAME_MAX_BYTES\n ) {\n throw new Error(\"browser frame message is truncated or too large\");\n }\n const metadataLength = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength).getUint32(\n 0,\n false,\n );\n if (\n metadataLength < 1 ||\n metadataLength > BROWSER_CONTROL_MAX_FRAME_HEADER_BYTES ||\n metadataLength + 4 >= bytes.byteLength\n ) {\n throw new Error(\"browser frame metadata length is invalid\");\n }\n let value: unknown;\n try {\n value = JSON.parse(\n new TextDecoder(\"utf-8\", { fatal: true }).decode(bytes.subarray(4, 4 + metadataLength)),\n );\n } catch {\n throw new Error(\"browser frame metadata is invalid JSON\");\n }\n const metadata = parseBrowserFrameMetadata(value);\n const data = bytes.slice(4 + metadataLength);\n if (data.byteLength < 1 || data.byteLength > BROWSER_FRAME_MAX_BYTES) {\n throw new Error(\"browser frame image is empty or too large\");\n }\n const dimensions = imageDimensions(data, metadata.mediaType);\n if (dimensions.width !== metadata.width || dimensions.height !== metadata.height) {\n throw new Error(\"browser frame image dimensions do not match metadata\");\n }\n return { ...metadata, data };\n}\n\n/** Decode and authenticate one bounded ComputerSession frame. Computer frames\n * carry a content digest because native capture adapters may cross process and\n * relay boundaries before reaching the SDK. */\nexport async function decodeComputerFrameMessage(\n message: ArrayBuffer | Uint8Array,\n): Promise<ComputerFrame> {\n const bytes = message instanceof Uint8Array ? message : new Uint8Array(message);\n if (\n bytes.byteLength < 5 ||\n bytes.byteLength > 4 + BROWSER_CONTROL_MAX_FRAME_HEADER_BYTES + BROWSER_FRAME_MAX_BYTES\n ) {\n throw new Error(\"computer frame message is truncated or too large\");\n }\n const metadataLength = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength).getUint32(\n 0,\n false,\n );\n if (\n metadataLength < 1 ||\n metadataLength > BROWSER_CONTROL_MAX_FRAME_HEADER_BYTES ||\n metadataLength + 4 >= bytes.byteLength\n ) {\n throw new Error(\"computer frame metadata length is invalid\");\n }\n let value: unknown;\n try {\n value = JSON.parse(\n new TextDecoder(\"utf-8\", { fatal: true }).decode(bytes.subarray(4, 4 + metadataLength)),\n );\n } catch {\n throw new Error(\"computer frame metadata is invalid JSON\");\n }\n const metadata = parseComputerFrameMetadata(value);\n const data = bytes.slice(4 + metadataLength);\n if (data.byteLength < 1 || data.byteLength > BROWSER_FRAME_MAX_BYTES) {\n throw new Error(\"computer frame image is empty or too large\");\n }\n const dimensions = imageDimensions(data, metadata.mediaType);\n if (dimensions.width !== metadata.width || dimensions.height !== metadata.height) {\n throw new Error(\"computer frame image dimensions do not match metadata\");\n }\n if ((await sha256Hex(data)) !== metadata.sha256) {\n throw new Error(\"computer frame digest does not match image\");\n }\n return { ...metadata, data };\n}\n\nexport function parseBrowserFrameMetadata(value: unknown): BrowserFrameMetadata {\n if (!isRecord(value)) throw new Error(\"browser frame metadata is invalid\");\n const allowed = new Set([\n \"frameId\",\n \"browserSessionId\",\n \"controllerGeneration\",\n \"targetId\",\n \"targetGeneration\",\n \"documentGeneration\",\n \"sequence\",\n \"mediaType\",\n \"width\",\n \"height\",\n \"deviceScaleFactor\",\n \"scrollX\",\n \"scrollY\",\n \"capturedAt\",\n ]);\n if (Object.keys(value).some((key) => !allowed.has(key))) {\n throw new Error(\"browser frame metadata contains unknown fields\");\n }\n const strings = [\n \"frameId\",\n \"browserSessionId\",\n \"controllerGeneration\",\n \"targetId\",\n \"targetGeneration\",\n \"documentGeneration\",\n \"mediaType\",\n \"capturedAt\",\n ] as const;\n for (const key of strings) {\n const item = value[key];\n const max = key === \"targetId\" ? 512 : key === \"capturedAt\" ? 128 : 256;\n if (typeof item !== \"string\" || item.length < 1 || utf8Bytes(item) > max) {\n throw new Error(\"browser frame metadata is invalid\");\n }\n }\n const numbers = [\n \"sequence\",\n \"width\",\n \"height\",\n \"deviceScaleFactor\",\n \"scrollX\",\n \"scrollY\",\n ] as const;\n for (const key of numbers) {\n if (typeof value[key] !== \"number\" || !Number.isFinite(value[key])) {\n throw new Error(\"browser frame metadata is invalid\");\n }\n }\n const metadata = value as unknown as BrowserFrameMetadata;\n if (\n !Number.isSafeInteger(metadata.sequence) ||\n metadata.sequence < 0 ||\n !Number.isSafeInteger(metadata.width) ||\n !Number.isSafeInteger(metadata.height)\n ) {\n throw new Error(\"browser frame metadata integers are invalid\");\n }\n assertImageDimensions(metadata.width, metadata.height);\n if (\n metadata.deviceScaleFactor <= 0 ||\n metadata.deviceScaleFactor > 16 ||\n Math.abs(metadata.scrollX) > 1_000_000_000 ||\n Math.abs(metadata.scrollY) > 1_000_000_000\n ) {\n throw new Error(\"browser frame geometry metadata is invalid\");\n }\n if (metadata.mediaType !== \"image/jpeg\" && metadata.mediaType !== \"image/png\") {\n throw new Error(\"browser frame media type is invalid\");\n }\n if (!isUuid(metadata.browserSessionId)) throw new Error(\"browser frame session id is invalid\");\n if (!/^[A-Za-z0-9][A-Za-z0-9._:-]*$/u.test(metadata.controllerGeneration)) {\n throw new Error(\"browser frame controller generation is invalid\");\n }\n if (!Number.isFinite(new Date(metadata.capturedAt).valueOf())) {\n throw new Error(\"browser frame timestamp is invalid\");\n }\n return metadata;\n}\n\nexport function parseComputerFrameMetadata(value: unknown): ComputerFrameMetadata {\n if (!isRecord(value)) throw new Error(\"computer frame metadata is invalid\");\n const allowed = new Set([\n \"frameId\",\n \"computerSessionId\",\n \"controllerGeneration\",\n \"targetId\",\n \"targetGeneration\",\n \"sequence\",\n \"mediaType\",\n \"width\",\n \"height\",\n \"capturedAt\",\n \"sha256\",\n ]);\n if (Object.keys(value).some((key) => !allowed.has(key))) {\n throw new Error(\"computer frame metadata contains unknown fields\");\n }\n const strings = [\n \"frameId\",\n \"computerSessionId\",\n \"controllerGeneration\",\n \"targetId\",\n \"targetGeneration\",\n \"mediaType\",\n \"capturedAt\",\n \"sha256\",\n ] as const;\n for (const key of strings) {\n const item = value[key];\n const max = key === \"targetId\" ? 512 : key === \"capturedAt\" ? 128 : 256;\n if (typeof item !== \"string\" || item.length < 1 || utf8Bytes(item) > max) {\n throw new Error(\"computer frame metadata is invalid\");\n }\n }\n const metadata = value as unknown as ComputerFrameMetadata;\n if (\n !Number.isSafeInteger(metadata.sequence) ||\n metadata.sequence < 0 ||\n !Number.isSafeInteger(metadata.width) ||\n !Number.isSafeInteger(metadata.height)\n ) {\n throw new Error(\"computer frame metadata integers are invalid\");\n }\n assertImageDimensions(metadata.width, metadata.height);\n if (metadata.mediaType !== \"image/jpeg\" && metadata.mediaType !== \"image/png\") {\n throw new Error(\"computer frame media type is invalid\");\n }\n if (!isUuid(metadata.computerSessionId)) {\n throw new Error(\"computer frame session id is invalid\");\n }\n if (!/^[A-Za-z0-9][A-Za-z0-9._:-]*$/u.test(metadata.controllerGeneration)) {\n throw new Error(\"computer frame controller generation is invalid\");\n }\n if (!Number.isFinite(new Date(metadata.capturedAt).valueOf())) {\n throw new Error(\"computer frame timestamp is invalid\");\n }\n if (!/^[0-9a-f]{64}$/u.test(metadata.sha256)) {\n throw new Error(\"computer frame digest is invalid\");\n }\n return metadata;\n}\n\nexport function decodeComputerFrameMetadataHeader(value: string): ComputerFrameMetadata {\n if (!value || value.length > 32 * 1024 || !/^[A-Za-z0-9_-]+$/u.test(value)) {\n throw new Error(\"computer frame metadata header is invalid\");\n }\n const normalized = value.replace(/-/gu, \"+\").replace(/_/gu, \"/\");\n const padded = normalized.padEnd(Math.ceil(normalized.length / 4) * 4, \"=\");\n let decoded: string;\n try {\n decoded = atob(padded);\n } catch {\n throw new Error(\"computer frame metadata header is invalid\");\n }\n const bytes = Uint8Array.from(decoded, (character) => character.charCodeAt(0));\n let metadata: unknown;\n try {\n metadata = JSON.parse(new TextDecoder(\"utf-8\", { fatal: true }).decode(bytes));\n } catch {\n throw new Error(\"computer frame metadata header is invalid\");\n }\n return parseComputerFrameMetadata(metadata);\n}\n\nfunction newestRelevantBrowser(\n sessions: readonly BrowserSession[],\n associationSessionId: string,\n): BrowserSession | null {\n const live = sessions.filter(\n (session) =>\n ![\"ending\", \"ended\", \"failed\", \"lost\"].includes(session.lifecycle) &&\n session.associations.some((association) => association.sessionId === associationSessionId),\n );\n live.sort(\n (left, right) =>\n browserRelevance(right, associationSessionId) - browserRelevance(left, associationSessionId),\n );\n return live[0] ?? null;\n}\n\nfunction newestRelevantComputer(\n sessions: readonly ComputerSession[],\n associationSessionId: string,\n): ComputerSession | null {\n const live = sessions.filter(\n (session) =>\n [\"starting\", \"active\", \"restoring\"].includes(session.lifecycle) &&\n session.associations.some((association) => association.sessionId === associationSessionId),\n );\n live.sort(\n (left, right) =>\n computerRelevance(right, associationSessionId) -\n computerRelevance(left, associationSessionId),\n );\n return live[0] ?? null;\n}\n\nfunction browserRelevance(session: BrowserSession, associationSessionId: string): number {\n const association = session.associations\n .filter((item) => item.sessionId === associationSessionId)\n .map((item) => Date.parse(item.lastUsedAt))\n .filter(Number.isFinite)\n .reduce((best, timestamp) => Math.max(best, timestamp), 0);\n const used = Date.parse(session.lastUsedAt);\n return Math.max(association, Number.isFinite(used) ? used : 0);\n}\n\nfunction computerRelevance(session: ComputerSession, associationSessionId: string): number {\n const association = session.associations\n .filter((item) => item.sessionId === associationSessionId)\n .map((item) => Date.parse(item.lastUsedAt))\n .filter(Number.isFinite)\n .reduce((best, timestamp) => Math.max(best, timestamp), 0);\n const used = Date.parse(session.lastUsedAt);\n return Math.max(association, Number.isFinite(used) ? used : 0);\n}\n\nfunction upgradeMixedContentWebSocket(url: URL): void {\n const protocol = (globalThis as { location?: { protocol?: string } }).location?.protocol;\n if (protocol === \"https:\" && url.protocol === \"ws:\") url.protocol = \"wss:\";\n}\n\nfunction setBoundedIntegerQuery(\n url: URL,\n name: string,\n value: number | undefined,\n min: number,\n max: number,\n): void {\n if (value === undefined) return;\n if (!Number.isSafeInteger(value) || value < min || value > max) {\n throw new Error(`browser frame ${name} must be an integer between ${min} and ${max}`);\n }\n url.searchParams.set(name, String(value));\n}\n\nfunction imageDimensions(\n data: Uint8Array,\n mediaType: BrowserFrameMetadata[\"mediaType\"],\n): { width: number; height: number } {\n const dimensions = mediaType === \"image/png\" ? pngDimensions(data) : jpegDimensions(data);\n assertImageDimensions(dimensions.width, dimensions.height);\n return dimensions;\n}\n\nfunction assertImageDimensions(width: number, height: number): void {\n if (\n !Number.isSafeInteger(width) ||\n !Number.isSafeInteger(height) ||\n width < 1 ||\n height < 1 ||\n width > BROWSER_FRAME_MAX_DIMENSION ||\n height > BROWSER_FRAME_MAX_DIMENSION ||\n width * height > BROWSER_FRAME_MAX_PIXELS\n ) {\n throw new Error(\"browser image dimensions exceed their bounded envelope\");\n }\n}\n\nfunction pngDimensions(data: Uint8Array): { width: number; height: number } {\n const signature = [137, 80, 78, 71, 13, 10, 26, 10];\n if (\n data.byteLength < 24 ||\n !signature.every((byte, index) => data[index] === byte) ||\n String.fromCharCode(...data.slice(12, 16)) !== \"IHDR\"\n ) {\n throw new Error(\"browser returned an invalid PNG image\");\n }\n const view = new DataView(data.buffer, data.byteOffset, data.byteLength);\n return { width: view.getUint32(16), height: view.getUint32(20) };\n}\n\nfunction jpegDimensions(data: Uint8Array): { width: number; height: number } {\n if (data.byteLength < 4 || data[0] !== 0xff || data[1] !== 0xd8) {\n throw new Error(\"browser returned an invalid JPEG image\");\n }\n let offset = 2;\n while (offset + 3 < data.byteLength) {\n if (data[offset] !== 0xff) {\n offset += 1;\n continue;\n }\n let marker = data[offset + 1]!;\n while (marker === 0xff) {\n offset += 1;\n marker = data[offset + 1]!;\n }\n if (\n marker === 0xd8 ||\n marker === 0xd9 ||\n marker === 0x01 ||\n (marker >= 0xd0 && marker <= 0xd7)\n ) {\n offset += 2;\n continue;\n }\n if (offset + 3 >= data.byteLength) break;\n const length = (data[offset + 2]! << 8) | data[offset + 3]!;\n if (length < 2 || offset + 2 + length > data.byteLength) break;\n if (isJpegStartOfFrame(marker)) {\n if (length < 7 || offset + 8 >= data.byteLength) break;\n return {\n height: (data[offset + 5]! << 8) | data[offset + 6]!,\n width: (data[offset + 7]! << 8) | data[offset + 8]!,\n };\n }\n offset += 2 + length;\n }\n throw new Error(\"browser returned a JPEG without dimensions\");\n}\n\nfunction isJpegStartOfFrame(marker: number): boolean {\n return (\n (marker >= 0xc0 && marker <= 0xc3) ||\n (marker >= 0xc5 && marker <= 0xc7) ||\n (marker >= 0xc9 && marker <= 0xcb) ||\n (marker >= 0xcd && marker <= 0xcf)\n );\n}\n\nfunction utf8Bytes(value: string): number {\n return new TextEncoder().encode(value).byteLength;\n}\n\nasync function sha256Hex(value: Uint8Array): Promise<string> {\n const subtle = globalThis.crypto?.subtle;\n if (!subtle) throw new Error(\"computer frame digest verification is unavailable\");\n const copy = new Uint8Array(value.byteLength);\n copy.set(value);\n const digest = new Uint8Array(await subtle.digest(\"SHA-256\", copy));\n return [...digest].map((byte) => byte.toString(16).padStart(2, \"0\")).join(\"\");\n}\n\nfunction isUuid(value: string): boolean {\n return /^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/iu.test(value);\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,153 @@
1
+ // ../contracts/src/model-display.ts
2
+ function modelLogoUrl(input) {
3
+ const value = typeof input === "string" ? void 0 : input.logoUrl;
4
+ if (!value || value.length > 2048 || value !== value.trim()) return null;
5
+ try {
6
+ const url = new URL(value);
7
+ return url.protocol === "https:" && !url.username && !url.password ? value : null;
8
+ } catch {
9
+ return null;
10
+ }
11
+ }
12
+ var WORDS = {
13
+ gpt: "GPT",
14
+ chatgpt: "ChatGPT",
15
+ claude: "Claude",
16
+ grok: "Grok",
17
+ gemini: "Gemini",
18
+ gemma: "Gemma",
19
+ llama: "Llama",
20
+ deepseek: "DeepSeek",
21
+ qwen: "Qwen",
22
+ glm: "GLM",
23
+ kimi: "Kimi",
24
+ mistral: "Mistral",
25
+ codestral: "Codestral",
26
+ devstral: "Devstral",
27
+ magistral: "Magistral",
28
+ nemotron: "Nemotron",
29
+ oss: "OSS",
30
+ // Region-pinned gateway routes (Opper `aws/claude-sonnet-4-6-eu`).
31
+ eu: "EU"
32
+ };
33
+ function modelSlug(value) {
34
+ const last = value.split("/").filter(Boolean).at(-1) ?? value;
35
+ return last.replace(/:[^:]*$/, "") || last;
36
+ }
37
+ function upstreamOf(input) {
38
+ return input.upstreamModelId?.trim() || input.deployment?.upstreamModelId?.trim() || null;
39
+ }
40
+ function titleToken(token, index) {
41
+ const lower = token.toLowerCase();
42
+ const word = WORDS[lower];
43
+ if (word) return word;
44
+ if (index === 0 && /^o\d+$/.test(lower)) return lower;
45
+ if (/^\d+(?:\.\d+)?[bkmt]$/.test(lower) || /^[a-z]\d+[a-z\d]*$/.test(lower)) {
46
+ return lower.toUpperCase();
47
+ }
48
+ if (/^\d/.test(token)) return lower;
49
+ return lower.charAt(0).toUpperCase() + lower.slice(1);
50
+ }
51
+ function humanizeModelSlug(value) {
52
+ const slug = modelSlug(value.trim()).replace(/[-_](?:\d{8}|\d{4}-\d{2}-\d{2})$/, "").replace(/[-_]latest$/i, "");
53
+ const raw = slug.split(/[-_\s]+/).filter(Boolean);
54
+ if (raw.length === 0) return value.trim() || value;
55
+ const tokens = [];
56
+ for (const token of raw) {
57
+ const previous = tokens.at(-1);
58
+ if (previous !== void 0 && /^\d{1,2}$/.test(token) && /^\d{1,2}$/.test(previous)) {
59
+ tokens[tokens.length - 1] = `${previous}.${token}`;
60
+ continue;
61
+ }
62
+ tokens.push(token);
63
+ }
64
+ const words = tokens.map(titleToken);
65
+ if (words[0] === "GPT" && words.length > 1 && /^\d/.test(words[1])) {
66
+ return [`GPT-${words[1]}`, ...words.slice(2)].join(" ");
67
+ }
68
+ return words.join(" ");
69
+ }
70
+ function isRawModelLabel(label, ids = []) {
71
+ const text = label.trim();
72
+ if (!text) return true;
73
+ return ids.some((id) => {
74
+ if (!id) return false;
75
+ const segments = id.trim().split("/").filter(Boolean);
76
+ return segments.some((_, index) => {
77
+ const tail = segments.slice(index).join("/");
78
+ return tail === text || modelSlug(tail) === text;
79
+ });
80
+ });
81
+ }
82
+ function modelDisplayName(input) {
83
+ if (typeof input === "string") {
84
+ return input.trim() && !/\s/.test(input.trim()) ? withoutClaudeFamilyPrefix(humanizeModelSlug(input)) : input;
85
+ }
86
+ const upstream = upstreamOf(input);
87
+ const label = input.label?.trim();
88
+ if (label && !isRawModelLabel(label, [input.id, upstream])) {
89
+ return withoutClaudeFamilyPrefix(label);
90
+ }
91
+ return withoutClaudeFamilyPrefix(humanizeModelSlug(upstream ?? label ?? input.id));
92
+ }
93
+ function withoutClaudeFamilyPrefix(name) {
94
+ return name.replace(/^Claude\s+(?=(?:Opus|Sonnet|Haiku)\b)/, "");
95
+ }
96
+ var VENDOR_PATTERNS = [
97
+ ["anthropic", /^claude\b/],
98
+ ["openai", /^(?:gpt|chatgpt|o\d+|codex|dall-e|sora|text-embedding|whisper)\b/],
99
+ ["xai", /^grok\b/],
100
+ ["google", /^(?:gemini|gemma)\b/],
101
+ ["meta", /^llama\b/],
102
+ ["mistral", /^(?:mistral|codestral|devstral|magistral|ministral|pixtral)\b/],
103
+ ["deepseek", /^deepseek\b/],
104
+ ["moonshot", /^(?:kimi|moonshot)\b/],
105
+ ["qwen", /^(?:qwen|qwq)\b/],
106
+ ["zhipu", /^glm\b/],
107
+ ["nvidia", /^nemotron\b/]
108
+ ];
109
+ var VENDOR_SEGMENTS = {
110
+ anthropic: "anthropic",
111
+ openai: "openai",
112
+ "x-ai": "xai",
113
+ xai: "xai",
114
+ google: "google",
115
+ "meta-llama": "meta",
116
+ mistralai: "mistral",
117
+ deepseek: "deepseek",
118
+ moonshotai: "moonshot",
119
+ qwen: "qwen",
120
+ "z-ai": "zhipu",
121
+ nvidia: "nvidia"
122
+ };
123
+ function vendorFromSlug(slug) {
124
+ for (const [vendor, pattern] of VENDOR_PATTERNS) if (pattern.test(slug)) return vendor;
125
+ return null;
126
+ }
127
+ function modelVendor(input) {
128
+ const ids = typeof input === "string" ? [input] : [upstreamOf(input), input.id];
129
+ for (const id of ids) {
130
+ if (!id) continue;
131
+ const lower = id.trim().toLowerCase();
132
+ if (lower.startsWith("codex/")) return "openai";
133
+ if (lower.startsWith("supergrok/")) return "xai";
134
+ const vendor = vendorFromSlug(modelSlug(lower));
135
+ if (vendor) return vendor;
136
+ const segment = lower.split("/").filter(Boolean).at(-2);
137
+ if (segment && Object.hasOwn(VENDOR_SEGMENTS, segment)) return VENDOR_SEGMENTS[segment];
138
+ }
139
+ if (typeof input !== "string" && input.label) {
140
+ return vendorFromSlug(input.label.trim().toLowerCase().replace(/\s+/g, "-"));
141
+ }
142
+ return null;
143
+ }
144
+
145
+ export {
146
+ modelLogoUrl,
147
+ modelSlug,
148
+ humanizeModelSlug,
149
+ isRawModelLabel,
150
+ modelDisplayName,
151
+ modelVendor
152
+ };
153
+ //# sourceMappingURL=chunk-YKIHNLWD.js.map