@opengeni/sdk 0.48.0 → 0.57.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 (122) hide show
  1. package/README.md +147 -1
  2. package/dist/artifact-client.d.ts +20 -2
  3. package/dist/artifacts.d.ts +4 -0
  4. package/dist/artifacts.js +11 -0
  5. package/dist/artifacts.js.map +1 -0
  6. package/dist/{chunk-V5F253OG.js → chunk-GU6JF75T.js} +6 -3
  7. package/dist/chunk-GU6JF75T.js.map +1 -0
  8. package/dist/chunk-HJ3HHUT5.js +222 -0
  9. package/dist/chunk-HJ3HHUT5.js.map +1 -0
  10. package/dist/{chunk-KIHGPM7H.js → chunk-JDLDDRNE.js} +20 -14
  11. package/dist/chunk-JDLDDRNE.js.map +1 -0
  12. package/dist/chunk-JRPFWI6T.js +128 -0
  13. package/dist/chunk-JRPFWI6T.js.map +1 -0
  14. package/dist/{chunk-MBGBLVUV.js → chunk-PKQ377ED.js} +1725 -555
  15. package/dist/chunk-PKQ377ED.js.map +1 -0
  16. package/dist/chunk-ST5DDKJP.js +987 -0
  17. package/dist/chunk-ST5DDKJP.js.map +1 -0
  18. package/dist/chunk-VWE2QIVO.js +1162 -0
  19. package/dist/chunk-VWE2QIVO.js.map +1 -0
  20. package/dist/chunk-VYCTL62C.js +230 -0
  21. package/dist/chunk-VYCTL62C.js.map +1 -0
  22. package/dist/{chunk-DXDL7EEW.js → chunk-YKZME56C.js} +197 -113
  23. package/dist/chunk-YKZME56C.js.map +1 -0
  24. package/dist/client.d.ts +240 -16
  25. package/dist/codex-realtime-controller.d.ts +9 -6
  26. package/dist/codex-realtime-controller.js +2 -2
  27. package/dist/codex-realtime-lifecycle.d.ts +1 -1
  28. package/dist/codex-realtime-v3.d.ts +3 -3
  29. package/dist/codex-realtime.d.ts +1 -1
  30. package/dist/company-profile.d.ts +100 -0
  31. package/dist/core.d.ts +5 -5
  32. package/dist/core.js +10 -5
  33. package/dist/desktop.d.ts +9 -1
  34. package/dist/editable-artifact-resources.d.ts +96 -0
  35. package/dist/editable-artifacts/browser-session.d.ts +35 -0
  36. package/dist/editable-artifacts/controller.d.ts +60 -0
  37. package/dist/editable-artifacts/errors.d.ts +23 -0
  38. package/dist/editable-artifacts/http-live-transport.d.ts +46 -0
  39. package/dist/editable-artifacts/index.d.ts +19 -0
  40. package/dist/editable-artifacts/pool.d.ts +15 -0
  41. package/dist/editable-artifacts/session.d.ts +96 -0
  42. package/dist/editable-artifacts/storage.d.ts +72 -0
  43. package/dist/editable-artifacts/types.d.ts +416 -0
  44. package/dist/editable-artifacts/worker/browser-client.d.ts +80 -0
  45. package/dist/editable-artifacts/worker/browser-entry.d.ts +6 -0
  46. package/dist/editable-artifacts/worker/kernel-adapter.d.ts +45 -0
  47. package/dist/editable-artifacts/worker/rpc-protocol.d.ts +92 -0
  48. package/dist/editable-artifacts/worker/runtime.d.ts +66 -0
  49. package/dist/editable-artifacts/worker/wire-codec.d.ts +52 -0
  50. package/dist/editable-artifacts-worker.d.ts +8 -0
  51. package/dist/editable-artifacts-worker.js +1708 -0
  52. package/dist/editable-artifacts-worker.js.map +1 -0
  53. package/dist/editable-artifacts.d.ts +6 -0
  54. package/dist/editable-artifacts.js +5954 -0
  55. package/dist/editable-artifacts.js.map +1 -0
  56. package/dist/gateway-realtime-transport.d.ts +2 -1
  57. package/dist/gateway-realtime-transport.js +5 -3
  58. package/dist/index.d.ts +45 -35
  59. package/dist/index.js +134 -64
  60. package/dist/index.js.map +1 -1
  61. package/dist/interaction-revision-stream.d.ts +11 -0
  62. package/dist/interaction.d.ts +1484 -0
  63. package/dist/interaction.js +81 -0
  64. package/dist/interaction.js.map +1 -0
  65. package/dist/memory-slack-client.d.ts +13 -0
  66. package/dist/memory-slack-delivery.d.ts +99 -0
  67. package/dist/memory-slack.d.ts +4 -0
  68. package/dist/memory-slack.js +44 -0
  69. package/dist/memory-slack.js.map +1 -0
  70. package/dist/proxy.d.ts +3 -3
  71. package/dist/realtime.d.ts +14 -14
  72. package/dist/realtime.js +11 -7
  73. package/dist/realtime.js.map +1 -1
  74. package/dist/retained-artifacts.d.ts +12 -0
  75. package/dist/stream.d.ts +1 -1
  76. package/dist/terminal.d.ts +1 -1
  77. package/dist/types.d.ts +1347 -34
  78. package/dist/workspace-control-stream.d.ts +2 -2
  79. package/dist/workspace-live-stream.d.ts +14 -0
  80. package/dist/workspace-state.d.ts +1 -1
  81. package/package.json +29 -3
  82. package/src/artifact-client.ts +129 -0
  83. package/src/artifacts.ts +17 -0
  84. package/src/client.ts +3022 -910
  85. package/src/codex-realtime-controller.ts +25 -7
  86. package/src/codex-realtime-lifecycle.ts +1 -0
  87. package/src/company-profile.ts +92 -0
  88. package/src/desktop.ts +11 -1
  89. package/src/editable-artifact-resources.ts +119 -0
  90. package/src/editable-artifacts/browser-session.ts +176 -0
  91. package/src/editable-artifacts/controller.ts +2632 -0
  92. package/src/editable-artifacts/errors.ts +52 -0
  93. package/src/editable-artifacts/http-live-transport.ts +1449 -0
  94. package/src/editable-artifacts/index.ts +175 -0
  95. package/src/editable-artifacts/pool.ts +81 -0
  96. package/src/editable-artifacts/session.ts +778 -0
  97. package/src/editable-artifacts/storage.ts +1718 -0
  98. package/src/editable-artifacts/types.ts +499 -0
  99. package/src/editable-artifacts/worker/browser-client.ts +1167 -0
  100. package/src/editable-artifacts/worker/browser-entry.ts +57 -0
  101. package/src/editable-artifacts/worker/kernel-adapter.ts +1039 -0
  102. package/src/editable-artifacts/worker/rpc-protocol.ts +622 -0
  103. package/src/editable-artifacts/worker/runtime.ts +1204 -0
  104. package/src/editable-artifacts/worker/wire-codec.ts +852 -0
  105. package/src/editable-artifacts-worker.ts +8 -0
  106. package/src/editable-artifacts.ts +6 -0
  107. package/src/errors.ts +16 -2
  108. package/src/gateway-realtime-transport.ts +252 -109
  109. package/src/index.ts +215 -1
  110. package/src/interaction-revision-stream.ts +117 -0
  111. package/src/interaction.ts +2874 -0
  112. package/src/memory-slack-client.ts +71 -0
  113. package/src/memory-slack-delivery.ts +128 -0
  114. package/src/memory-slack.ts +19 -0
  115. package/src/realtime.ts +14 -4
  116. package/src/retained-artifacts.ts +326 -0
  117. package/src/types.ts +1636 -52
  118. package/src/workspace-live-stream.ts +137 -0
  119. package/dist/chunk-DXDL7EEW.js.map +0 -1
  120. package/dist/chunk-KIHGPM7H.js.map +0 -1
  121. package/dist/chunk-MBGBLVUV.js.map +0 -1
  122. package/dist/chunk-V5F253OG.js.map +0 -1
@@ -0,0 +1,987 @@
1
+ // src/interaction.ts
2
+ var INTERACTION_PROTOCOL_VERSION = 1;
3
+ var BROWSER_CONTROL_WEBSOCKET_PROTOCOL = "opengeni.browser.v1";
4
+ var COMPUTER_CONTROL_WEBSOCKET_PROTOCOL = "opengeni.computer.v1";
5
+ var BROWSER_CONTROL_WEBSOCKET_BEARER_PREFIX = "opengeni.auth.";
6
+ var BROWSER_CONTROL_MAX_FRAME_HEADER_BYTES = 64 * 1024;
7
+ var BROWSER_FRAME_MAX_BYTES = 24 * 1024 * 1024;
8
+ var BROWSER_FRAME_MAX_DIMENSION = 32768;
9
+ var BROWSER_FRAME_MAX_PIXELS = 1e8;
10
+ var OpenGeniInteractionClient = class {
11
+ attachedBrowsers;
12
+ authRuns;
13
+ browsers;
14
+ computers;
15
+ identities;
16
+ interventions;
17
+ networkRoutes;
18
+ siteAuthConnections;
19
+ constructor(transport) {
20
+ this.attachedBrowsers = new AttachedBrowserDeviceCollection(transport);
21
+ this.authRuns = new AuthRunCollection(transport);
22
+ this.browsers = new BrowserSessionCollection(transport);
23
+ this.computers = new ComputerSessionCollection(transport);
24
+ this.identities = new BrowserIdentityCollection(transport);
25
+ this.interventions = new InteractionInterventionCollection(transport);
26
+ this.networkRoutes = new NetworkRouteCollection(transport);
27
+ this.siteAuthConnections = new SiteAuthConnectionCollection(transport);
28
+ }
29
+ };
30
+ var NetworkRouteCollection = class {
31
+ constructor(transport) {
32
+ this.transport = transport;
33
+ }
34
+ async list(workspaceId, options = {}) {
35
+ return await this.transport.listNetworkRoutes(workspaceId, options);
36
+ }
37
+ route(workspaceId, networkRouteId) {
38
+ return new NetworkRouteResource(this.transport, workspaceId, networkRouteId);
39
+ }
40
+ async create(workspaceId, request, options = {}) {
41
+ const response = await this.transport.createNetworkRoute(workspaceId, request, options);
42
+ return this.route(workspaceId, response.route.id);
43
+ }
44
+ };
45
+ var NetworkRouteResource = class {
46
+ constructor(transport, workspaceId, id) {
47
+ this.transport = transport;
48
+ this.workspaceId = workspaceId;
49
+ this.id = id;
50
+ }
51
+ async get(options = {}) {
52
+ return await this.transport.getNetworkRoute(this.workspaceId, this.id, options);
53
+ }
54
+ async update(request, options = {}) {
55
+ return await this.transport.updateNetworkRoute(this.workspaceId, this.id, request, options);
56
+ }
57
+ };
58
+ var SiteAuthConnectionCollection = class {
59
+ constructor(transport) {
60
+ this.transport = transport;
61
+ }
62
+ async list(workspaceId, options = {}) {
63
+ return await this.transport.listSiteAuthConnections(workspaceId, options);
64
+ }
65
+ connection(workspaceId, connectionId) {
66
+ return new SiteAuthConnectionResource(this.transport, workspaceId, connectionId);
67
+ }
68
+ async create(workspaceId, request, options = {}) {
69
+ const response = await this.transport.createSiteAuthConnection(workspaceId, request, options);
70
+ return this.connection(workspaceId, response.connection.id);
71
+ }
72
+ };
73
+ var SiteAuthConnectionResource = class {
74
+ constructor(transport, workspaceId, id) {
75
+ this.transport = transport;
76
+ this.workspaceId = workspaceId;
77
+ this.id = id;
78
+ }
79
+ async get(options = {}) {
80
+ return await this.transport.getSiteAuthConnection(this.workspaceId, this.id, options);
81
+ }
82
+ async update(request, options = {}) {
83
+ return await this.transport.updateSiteAuthConnection(
84
+ this.workspaceId,
85
+ this.id,
86
+ request,
87
+ options
88
+ );
89
+ }
90
+ };
91
+ var AuthRunCollection = class {
92
+ constructor(transport) {
93
+ this.transport = transport;
94
+ }
95
+ async list(workspaceId, options = {}) {
96
+ return await this.transport.listAuthRuns(workspaceId, options);
97
+ }
98
+ async get(workspaceId, authRunId, options = {}) {
99
+ return await this.transport.getAuthRun(workspaceId, authRunId, options);
100
+ }
101
+ run(workspaceId, browserSessionId, authRunId) {
102
+ return new AuthRunResource(this.transport, workspaceId, browserSessionId, authRunId);
103
+ }
104
+ };
105
+ var BrowserAuthRunCollection = class {
106
+ constructor(transport, workspaceId, browserSessionId) {
107
+ this.transport = transport;
108
+ this.workspaceId = workspaceId;
109
+ this.browserSessionId = browserSessionId;
110
+ }
111
+ async list(options = {}) {
112
+ return await this.transport.listAuthRuns(this.workspaceId, {
113
+ ...options,
114
+ browserSessionId: this.browserSessionId
115
+ });
116
+ }
117
+ run(authRunId) {
118
+ return new AuthRunResource(this.transport, this.workspaceId, this.browserSessionId, authRunId);
119
+ }
120
+ async start(request, options = {}) {
121
+ const response = await this.transport.startBrowserAuthRun(
122
+ this.workspaceId,
123
+ this.browserSessionId,
124
+ request,
125
+ options
126
+ );
127
+ return this.run(response.run.id);
128
+ }
129
+ };
130
+ var AuthRunResource = class {
131
+ constructor(transport, workspaceId, browserSessionId, id) {
132
+ this.transport = transport;
133
+ this.workspaceId = workspaceId;
134
+ this.browserSessionId = browserSessionId;
135
+ this.id = id;
136
+ }
137
+ async get(options = {}) {
138
+ const run = await this.transport.getAuthRun(this.workspaceId, this.id, options);
139
+ if (run.browserSessionId !== this.browserSessionId) {
140
+ throw new Error("AuthRun belongs to another BrowserSession");
141
+ }
142
+ return run;
143
+ }
144
+ async report(request, options = {}) {
145
+ return await this.transport.reportBrowserAuthRun(
146
+ this.workspaceId,
147
+ this.browserSessionId,
148
+ this.id,
149
+ request,
150
+ options
151
+ );
152
+ }
153
+ async protectedFill(request, options = {}) {
154
+ return await this.transport.protectedBrowserAuthFill(
155
+ this.workspaceId,
156
+ this.browserSessionId,
157
+ this.id,
158
+ request,
159
+ options
160
+ );
161
+ }
162
+ async advanceExternal(request, options = {}) {
163
+ return await this.transport.advanceExternalBrowserAuthRun(
164
+ this.workspaceId,
165
+ this.browserSessionId,
166
+ this.id,
167
+ request,
168
+ options
169
+ );
170
+ }
171
+ /** Human-session helper. Hosted provider URLs never appear in model tools. */
172
+ async openExternalFlow(request, options = {}) {
173
+ return await this.transport.openExternalBrowserAuthFlow(
174
+ this.workspaceId,
175
+ this.browserSessionId,
176
+ this.id,
177
+ request,
178
+ options
179
+ );
180
+ }
181
+ async verify(request, options = {}) {
182
+ return await this.transport.verifyBrowserAuthRun(
183
+ this.workspaceId,
184
+ this.browserSessionId,
185
+ this.id,
186
+ request,
187
+ options
188
+ );
189
+ }
190
+ };
191
+ var InteractionInterventionCollection = class {
192
+ constructor(transport) {
193
+ this.transport = transport;
194
+ }
195
+ async list(workspaceId, options = {}) {
196
+ return await this.transport.listInteractionInterventions(workspaceId, options);
197
+ }
198
+ intervention(workspaceId, interventionId) {
199
+ return new InteractionInterventionResource(this.transport, workspaceId, interventionId);
200
+ }
201
+ async create(workspaceId, request, options = {}) {
202
+ const response = await this.transport.createInteractionIntervention(
203
+ workspaceId,
204
+ request,
205
+ options
206
+ );
207
+ return this.intervention(workspaceId, response.intervention.id);
208
+ }
209
+ };
210
+ var InteractionInterventionResource = class {
211
+ constructor(transport, workspaceId, id) {
212
+ this.transport = transport;
213
+ this.workspaceId = workspaceId;
214
+ this.id = id;
215
+ }
216
+ async get(options = {}) {
217
+ return await this.transport.getInteractionIntervention(this.workspaceId, this.id, options);
218
+ }
219
+ async resolve(request, options = {}) {
220
+ return await this.transport.resolveInteractionIntervention(
221
+ this.workspaceId,
222
+ this.id,
223
+ request,
224
+ options
225
+ );
226
+ }
227
+ };
228
+ var AttachedBrowserDeviceCollection = class {
229
+ constructor(transport) {
230
+ this.transport = transport;
231
+ }
232
+ async list(workspaceId, options = {}) {
233
+ return await this.transport.listAttachedBrowsers(workspaceId, options);
234
+ }
235
+ device(workspaceId, deviceId) {
236
+ return new AttachedBrowserDeviceResource(this.transport, workspaceId, deviceId);
237
+ }
238
+ };
239
+ var AttachedBrowserDeviceResource = class {
240
+ constructor(transport, workspaceId, id) {
241
+ this.transport = transport;
242
+ this.workspaceId = workspaceId;
243
+ this.id = id;
244
+ }
245
+ async get(options = {}) {
246
+ return await this.transport.getAttachedBrowser(this.workspaceId, this.id, options);
247
+ }
248
+ };
249
+ var BrowserIdentityCollection = class {
250
+ constructor(transport) {
251
+ this.transport = transport;
252
+ }
253
+ async list(workspaceId, options = {}) {
254
+ return await this.transport.listBrowserIdentities(workspaceId, options);
255
+ }
256
+ identity(workspaceId, identityId) {
257
+ return new BrowserIdentityResource(this.transport, workspaceId, identityId);
258
+ }
259
+ async create(workspaceId, request, options = {}) {
260
+ const response = await this.transport.createBrowserIdentity(workspaceId, request, options);
261
+ return this.identity(workspaceId, response.identity.id);
262
+ }
263
+ };
264
+ var BrowserIdentityResource = class {
265
+ constructor(transport, workspaceId, id) {
266
+ this.transport = transport;
267
+ this.workspaceId = workspaceId;
268
+ this.id = id;
269
+ }
270
+ async get(options = {}) {
271
+ return await this.transport.getBrowserIdentity(this.workspaceId, this.id, options);
272
+ }
273
+ async revisions(options = {}) {
274
+ return await this.transport.listBrowserRevisions(this.workspaceId, this.id, options);
275
+ }
276
+ async update(request, options = {}) {
277
+ return await this.transport.updateBrowserIdentity(this.workspaceId, this.id, request, options);
278
+ }
279
+ };
280
+ var BrowserSessionCollection = class {
281
+ constructor(transport) {
282
+ this.transport = transport;
283
+ }
284
+ async list(workspaceId, options = {}) {
285
+ return await this.transport.listBrowserSessions(workspaceId, options);
286
+ }
287
+ session(workspaceId, browserSessionId) {
288
+ return new BrowserSessionResource(this.transport, workspaceId, browserSessionId);
289
+ }
290
+ async open(workspaceId, request, options = {}) {
291
+ const response = await this.transport.createBrowserSession(workspaceId, request, options);
292
+ return this.session(workspaceId, response.session.id);
293
+ }
294
+ async currentOrOpen(options) {
295
+ const requestOptions = options.signal ? { signal: options.signal } : {};
296
+ const listed = await this.list(options.workspaceId, requestOptions);
297
+ const current = newestRelevantBrowser(listed.sessions, options.associationSessionId);
298
+ if (current) {
299
+ const resource = this.session(options.workspaceId, current.id);
300
+ if (current.lifecycle === "suspended") {
301
+ await resource.resume(
302
+ { operationId: options.operationId ?? crypto.randomUUID() },
303
+ requestOptions
304
+ );
305
+ }
306
+ return resource;
307
+ }
308
+ return await this.open(
309
+ options.workspaceId,
310
+ {
311
+ operationId: options.operationId ?? crypto.randomUUID(),
312
+ sessionId: options.associationSessionId,
313
+ ...options.name !== void 0 ? { name: options.name } : {},
314
+ ...options.initialUrl !== void 0 ? { initialUrl: options.initialUrl } : {},
315
+ ...options.headless !== void 0 ? { headless: options.headless } : {},
316
+ ...options.placement !== void 0 ? { placement: options.placement } : {},
317
+ ...options.identityId !== void 0 ? { identityId: options.identityId } : {},
318
+ ...options.baseRevisionId !== void 0 ? { baseRevisionId: options.baseRevisionId } : {},
319
+ ...options.networkRouteId !== void 0 ? { networkRouteId: options.networkRouteId } : {},
320
+ ...options.linkedComputerSessionId !== void 0 ? { linkedComputerSessionId: options.linkedComputerSessionId } : {}
321
+ },
322
+ requestOptions
323
+ );
324
+ }
325
+ };
326
+ var BrowserSessionResource = class {
327
+ constructor(transport, workspaceId, id) {
328
+ this.transport = transport;
329
+ this.workspaceId = workspaceId;
330
+ this.id = id;
331
+ this.auth = new BrowserAuthRunCollection(transport, workspaceId, id);
332
+ this.clipboard = new BrowserClipboardResource(transport, workspaceId, id);
333
+ this.downloads = new BrowserDownloadCollection(transport, workspaceId, id);
334
+ this.tabs = new BrowserTargetCollection(transport, workspaceId, id);
335
+ this.targets = this.tabs;
336
+ }
337
+ auth;
338
+ clipboard;
339
+ downloads;
340
+ tabs;
341
+ /** Alias for hosts that prefer the protocol term. */
342
+ targets;
343
+ async get(options = {}) {
344
+ return await this.transport.getBrowserSession(this.workspaceId, this.id, options);
345
+ }
346
+ async observe(targetId, options = {}) {
347
+ return await this.transport.observeBrowserTarget(this.workspaceId, this.id, targetId, options);
348
+ }
349
+ async act(request, options = {}) {
350
+ return await this.transport.actInBrowser(this.workspaceId, this.id, request, options);
351
+ }
352
+ async receipt(operationId, options = {}) {
353
+ return await this.transport.getBrowserActionReceipt(
354
+ this.workspaceId,
355
+ this.id,
356
+ operationId,
357
+ options
358
+ );
359
+ }
360
+ async diagnostics(targetId, options = {}) {
361
+ return await this.transport.listBrowserDiagnostics(
362
+ this.workspaceId,
363
+ this.id,
364
+ targetId,
365
+ options
366
+ );
367
+ }
368
+ async attach(request, options = {}) {
369
+ return await this.transport.attachBrowserSession(this.workspaceId, this.id, request, options);
370
+ }
371
+ async heartbeat(options = {}) {
372
+ return await this.transport.heartbeatBrowserSession(this.workspaceId, this.id, options);
373
+ }
374
+ async publishRevision(request, options = {}) {
375
+ return await this.transport.publishBrowserRevision(this.workspaceId, this.id, request, options);
376
+ }
377
+ async suspend(request = {
378
+ operationId: crypto.randomUUID()
379
+ }, options = {}) {
380
+ return await this.transport.suspendBrowserSession(this.workspaceId, this.id, request, options);
381
+ }
382
+ async resume(request = {
383
+ operationId: crypto.randomUUID()
384
+ }, options = {}) {
385
+ return await this.transport.resumeBrowserSession(this.workspaceId, this.id, request, options);
386
+ }
387
+ async end(request = {
388
+ operationId: crypto.randomUUID()
389
+ }, options = {}) {
390
+ return await this.transport.endBrowserSession(this.workspaceId, this.id, request, options);
391
+ }
392
+ };
393
+ var BrowserClipboardResource = class {
394
+ constructor(transport, workspaceId, browserSessionId) {
395
+ this.transport = transport;
396
+ this.workspaceId = workspaceId;
397
+ this.browserSessionId = browserSessionId;
398
+ }
399
+ async read(options = {}) {
400
+ const clipboard = await this.transport.readBrowserClipboard(
401
+ this.workspaceId,
402
+ this.browserSessionId,
403
+ options
404
+ );
405
+ if (clipboard.browserSessionId !== this.browserSessionId) {
406
+ throw new Error("Browser clipboard belongs to another BrowserSession");
407
+ }
408
+ return clipboard;
409
+ }
410
+ };
411
+ var BrowserDownloadCollection = class {
412
+ constructor(transport, workspaceId, browserSessionId) {
413
+ this.transport = transport;
414
+ this.workspaceId = workspaceId;
415
+ this.browserSessionId = browserSessionId;
416
+ }
417
+ async list(options = {}) {
418
+ return await this.transport.listBrowserDownloads(
419
+ this.workspaceId,
420
+ this.browserSessionId,
421
+ options
422
+ );
423
+ }
424
+ download(downloadId) {
425
+ return new BrowserDownloadResource(
426
+ this.transport,
427
+ this.workspaceId,
428
+ this.browserSessionId,
429
+ downloadId
430
+ );
431
+ }
432
+ };
433
+ var BrowserDownloadResource = class {
434
+ constructor(transport, workspaceId, browserSessionId, id) {
435
+ this.transport = transport;
436
+ this.workspaceId = workspaceId;
437
+ this.browserSessionId = browserSessionId;
438
+ this.id = id;
439
+ }
440
+ async get(options = {}) {
441
+ const download = await this.transport.getBrowserDownload(
442
+ this.workspaceId,
443
+ this.browserSessionId,
444
+ this.id,
445
+ options
446
+ );
447
+ if (download.browserSessionId !== this.browserSessionId) {
448
+ throw new Error("BrowserDownload belongs to another BrowserSession");
449
+ }
450
+ return download;
451
+ }
452
+ /** Publish this exact private browser download into the source session's
453
+ * workspace. Pass an operationId when the caller needs retry identity across
454
+ * process boundaries; otherwise one is generated for this call. */
455
+ async saveToWorkspace(destinationPath, options = {}) {
456
+ const { operationId = crypto.randomUUID(), overwrite = false, ...requestOptions } = options;
457
+ const response = await this.transport.saveBrowserDownload(
458
+ this.workspaceId,
459
+ this.browserSessionId,
460
+ this.id,
461
+ { operationId, destinationPath, overwrite },
462
+ requestOptions
463
+ );
464
+ if (response.download.id !== this.id || response.download.browserSessionId !== this.browserSessionId) {
465
+ throw new Error("BrowserDownload save returned another resource");
466
+ }
467
+ return response;
468
+ }
469
+ };
470
+ var BrowserTargetCollection = class {
471
+ constructor(transport, workspaceId, browserSessionId) {
472
+ this.transport = transport;
473
+ this.workspaceId = workspaceId;
474
+ this.browserSessionId = browserSessionId;
475
+ }
476
+ async list(options = {}) {
477
+ return await this.transport.listBrowserTargets(
478
+ this.workspaceId,
479
+ this.browserSessionId,
480
+ options
481
+ );
482
+ }
483
+ async open(url, options = {}) {
484
+ return await this.transport.openBrowserTarget(
485
+ this.workspaceId,
486
+ this.browserSessionId,
487
+ url === void 0 ? {} : { url },
488
+ options
489
+ );
490
+ }
491
+ async select(targetId, options = {}) {
492
+ return await this.transport.selectBrowserTarget(
493
+ this.workspaceId,
494
+ this.browserSessionId,
495
+ targetId,
496
+ options
497
+ );
498
+ }
499
+ async close(targetId, options = {}) {
500
+ return await this.transport.closeBrowserTarget(
501
+ this.workspaceId,
502
+ this.browserSessionId,
503
+ targetId,
504
+ options
505
+ );
506
+ }
507
+ };
508
+ var ComputerSessionCollection = class {
509
+ constructor(transport) {
510
+ this.transport = transport;
511
+ }
512
+ async list(workspaceId, options = {}) {
513
+ return await this.transport.listComputerSessions(workspaceId, options);
514
+ }
515
+ session(workspaceId, computerSessionId) {
516
+ return new ComputerSessionResource(this.transport, workspaceId, computerSessionId);
517
+ }
518
+ async open(workspaceId, request, options = {}) {
519
+ const response = await this.transport.createComputerSession(workspaceId, request, options);
520
+ return this.session(workspaceId, response.session.id);
521
+ }
522
+ async currentOrOpen(options) {
523
+ const requestOptions = options.signal ? { signal: options.signal } : {};
524
+ const listed = await this.list(options.workspaceId, requestOptions);
525
+ const current = newestRelevantComputer(listed.sessions, options.associationSessionId);
526
+ if (current) {
527
+ return this.session(options.workspaceId, current.id);
528
+ }
529
+ return await this.open(
530
+ options.workspaceId,
531
+ {
532
+ operationId: options.operationId ?? crypto.randomUUID(),
533
+ sessionId: options.associationSessionId,
534
+ ...options.name !== void 0 ? { name: options.name } : {},
535
+ ...options.placement !== void 0 ? { placement: options.placement } : {}
536
+ },
537
+ requestOptions
538
+ );
539
+ }
540
+ };
541
+ var ComputerSessionResource = class {
542
+ constructor(transport, workspaceId, id) {
543
+ this.transport = transport;
544
+ this.workspaceId = workspaceId;
545
+ this.id = id;
546
+ this.targets = new ComputerTargetCollection(transport, workspaceId, id);
547
+ this.apps = this.targets;
548
+ this.clipboard = new ComputerClipboardResource(transport, workspaceId, id);
549
+ }
550
+ targets;
551
+ /** Native application/window targets are also the public app collection. */
552
+ apps;
553
+ clipboard;
554
+ async get(options = {}) {
555
+ return await this.transport.getComputerSession(this.workspaceId, this.id, options);
556
+ }
557
+ async observe(targetId, options = {}) {
558
+ return await this.transport.observeComputerTarget(this.workspaceId, this.id, targetId, options);
559
+ }
560
+ async act(request, options = {}) {
561
+ return await this.transport.actInComputer(this.workspaceId, this.id, request, options);
562
+ }
563
+ async receipt(operationId, options = {}) {
564
+ return await this.transport.getComputerActionReceipt(
565
+ this.workspaceId,
566
+ this.id,
567
+ operationId,
568
+ options
569
+ );
570
+ }
571
+ async attach(request, options = {}) {
572
+ return await this.transport.attachComputerSession(this.workspaceId, this.id, request, options);
573
+ }
574
+ async heartbeat(options = {}) {
575
+ return await this.transport.heartbeatComputerSession(this.workspaceId, this.id, options);
576
+ }
577
+ async end(request = { operationId: crypto.randomUUID() }, options = {}) {
578
+ return await this.transport.endComputerSession(this.workspaceId, this.id, request, options);
579
+ }
580
+ };
581
+ var ComputerClipboardResource = class {
582
+ constructor(transport, workspaceId, computerSessionId) {
583
+ this.transport = transport;
584
+ this.workspaceId = workspaceId;
585
+ this.computerSessionId = computerSessionId;
586
+ }
587
+ async read(options = {}) {
588
+ const clipboard = await this.transport.readComputerClipboard(
589
+ this.workspaceId,
590
+ this.computerSessionId,
591
+ options
592
+ );
593
+ if (clipboard.computerSessionId !== this.computerSessionId) {
594
+ throw new Error("Computer clipboard belongs to another ComputerSession");
595
+ }
596
+ return clipboard;
597
+ }
598
+ };
599
+ var ComputerTargetCollection = class {
600
+ constructor(transport, workspaceId, computerSessionId) {
601
+ this.transport = transport;
602
+ this.workspaceId = workspaceId;
603
+ this.computerSessionId = computerSessionId;
604
+ }
605
+ async list(options = {}) {
606
+ return await this.transport.listComputerTargets(
607
+ this.workspaceId,
608
+ this.computerSessionId,
609
+ options
610
+ );
611
+ }
612
+ };
613
+ function browserFrameSocketUrl(attachment, options = {}) {
614
+ if (attachment.stream.kind !== "direct_websocket") {
615
+ throw new Error("relay browser attachments are opened through the relay protocol");
616
+ }
617
+ const url = new URL(attachment.stream.url);
618
+ if (url.protocol === "http:") url.protocol = "ws:";
619
+ else if (url.protocol === "https:") url.protocol = "wss:";
620
+ else if (url.protocol !== "ws:" && url.protocol !== "wss:") {
621
+ throw new Error("browser frame attachment did not contain an HTTP or WebSocket URL");
622
+ }
623
+ if (options.format !== void 0) url.searchParams.set("format", options.format);
624
+ setBoundedIntegerQuery(url, "quality", options.quality, 1, 100);
625
+ setBoundedIntegerQuery(url, "maxWidth", options.maxWidth, 1, 4096);
626
+ setBoundedIntegerQuery(url, "maxHeight", options.maxHeight, 1, 4096);
627
+ setBoundedIntegerQuery(url, "everyNthFrame", options.everyNthFrame, 1, 60);
628
+ return url.toString();
629
+ }
630
+ function computerFrameSocketUrl(attachment, options = {}) {
631
+ if (attachment.stream.kind !== "direct_websocket") {
632
+ throw new Error("relay computer attachments are opened through the relay protocol");
633
+ }
634
+ const url = new URL(attachment.stream.url);
635
+ if (url.protocol === "http:") url.protocol = "ws:";
636
+ else if (url.protocol === "https:") url.protocol = "wss:";
637
+ else if (url.protocol !== "ws:" && url.protocol !== "wss:") {
638
+ throw new Error("computer frame attachment did not contain an HTTP or WebSocket URL");
639
+ }
640
+ if (options.format !== void 0) url.searchParams.set("format", options.format);
641
+ setBoundedIntegerQuery(url, "quality", options.quality, 1, 100);
642
+ setBoundedIntegerQuery(url, "maxWidth", options.maxWidth, 1, 4096);
643
+ setBoundedIntegerQuery(url, "maxHeight", options.maxHeight, 1, 4096);
644
+ setBoundedIntegerQuery(url, "everyNthFrame", options.everyNthFrame, 1, 60);
645
+ return url.toString();
646
+ }
647
+ function decodeBrowserFrameMessage(message) {
648
+ const bytes = message instanceof Uint8Array ? message : new Uint8Array(message);
649
+ if (bytes.byteLength < 5 || bytes.byteLength > 4 + BROWSER_CONTROL_MAX_FRAME_HEADER_BYTES + BROWSER_FRAME_MAX_BYTES) {
650
+ throw new Error("browser frame message is truncated or too large");
651
+ }
652
+ const metadataLength = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength).getUint32(
653
+ 0,
654
+ false
655
+ );
656
+ if (metadataLength < 1 || metadataLength > BROWSER_CONTROL_MAX_FRAME_HEADER_BYTES || metadataLength + 4 >= bytes.byteLength) {
657
+ throw new Error("browser frame metadata length is invalid");
658
+ }
659
+ let value;
660
+ try {
661
+ value = JSON.parse(
662
+ new TextDecoder("utf-8", { fatal: true }).decode(bytes.subarray(4, 4 + metadataLength))
663
+ );
664
+ } catch {
665
+ throw new Error("browser frame metadata is invalid JSON");
666
+ }
667
+ const metadata = parseBrowserFrameMetadata(value);
668
+ const data = bytes.slice(4 + metadataLength);
669
+ if (data.byteLength < 1 || data.byteLength > BROWSER_FRAME_MAX_BYTES) {
670
+ throw new Error("browser frame image is empty or too large");
671
+ }
672
+ const dimensions = imageDimensions(data, metadata.mediaType);
673
+ if (dimensions.width !== metadata.width || dimensions.height !== metadata.height) {
674
+ throw new Error("browser frame image dimensions do not match metadata");
675
+ }
676
+ return { ...metadata, data };
677
+ }
678
+ async function decodeComputerFrameMessage(message) {
679
+ const bytes = message instanceof Uint8Array ? message : new Uint8Array(message);
680
+ if (bytes.byteLength < 5 || bytes.byteLength > 4 + BROWSER_CONTROL_MAX_FRAME_HEADER_BYTES + BROWSER_FRAME_MAX_BYTES) {
681
+ throw new Error("computer frame message is truncated or too large");
682
+ }
683
+ const metadataLength = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength).getUint32(
684
+ 0,
685
+ false
686
+ );
687
+ if (metadataLength < 1 || metadataLength > BROWSER_CONTROL_MAX_FRAME_HEADER_BYTES || metadataLength + 4 >= bytes.byteLength) {
688
+ throw new Error("computer frame metadata length is invalid");
689
+ }
690
+ let value;
691
+ try {
692
+ value = JSON.parse(
693
+ new TextDecoder("utf-8", { fatal: true }).decode(bytes.subarray(4, 4 + metadataLength))
694
+ );
695
+ } catch {
696
+ throw new Error("computer frame metadata is invalid JSON");
697
+ }
698
+ const metadata = parseComputerFrameMetadata(value);
699
+ const data = bytes.slice(4 + metadataLength);
700
+ if (data.byteLength < 1 || data.byteLength > BROWSER_FRAME_MAX_BYTES) {
701
+ throw new Error("computer frame image is empty or too large");
702
+ }
703
+ const dimensions = imageDimensions(data, metadata.mediaType);
704
+ if (dimensions.width !== metadata.width || dimensions.height !== metadata.height) {
705
+ throw new Error("computer frame image dimensions do not match metadata");
706
+ }
707
+ if (await sha256Hex(data) !== metadata.sha256) {
708
+ throw new Error("computer frame digest does not match image");
709
+ }
710
+ return { ...metadata, data };
711
+ }
712
+ function parseBrowserFrameMetadata(value) {
713
+ if (!isRecord(value)) throw new Error("browser frame metadata is invalid");
714
+ const allowed = /* @__PURE__ */ new Set([
715
+ "frameId",
716
+ "browserSessionId",
717
+ "controllerGeneration",
718
+ "targetId",
719
+ "targetGeneration",
720
+ "documentGeneration",
721
+ "sequence",
722
+ "mediaType",
723
+ "width",
724
+ "height",
725
+ "deviceScaleFactor",
726
+ "scrollX",
727
+ "scrollY",
728
+ "capturedAt"
729
+ ]);
730
+ if (Object.keys(value).some((key) => !allowed.has(key))) {
731
+ throw new Error("browser frame metadata contains unknown fields");
732
+ }
733
+ const strings = [
734
+ "frameId",
735
+ "browserSessionId",
736
+ "controllerGeneration",
737
+ "targetId",
738
+ "targetGeneration",
739
+ "documentGeneration",
740
+ "mediaType",
741
+ "capturedAt"
742
+ ];
743
+ for (const key of strings) {
744
+ const item = value[key];
745
+ const max = key === "targetId" ? 512 : key === "capturedAt" ? 128 : 256;
746
+ if (typeof item !== "string" || item.length < 1 || utf8Bytes(item) > max) {
747
+ throw new Error("browser frame metadata is invalid");
748
+ }
749
+ }
750
+ const numbers = [
751
+ "sequence",
752
+ "width",
753
+ "height",
754
+ "deviceScaleFactor",
755
+ "scrollX",
756
+ "scrollY"
757
+ ];
758
+ for (const key of numbers) {
759
+ if (typeof value[key] !== "number" || !Number.isFinite(value[key])) {
760
+ throw new Error("browser frame metadata is invalid");
761
+ }
762
+ }
763
+ const metadata = value;
764
+ if (!Number.isSafeInteger(metadata.sequence) || metadata.sequence < 0 || !Number.isSafeInteger(metadata.width) || !Number.isSafeInteger(metadata.height)) {
765
+ throw new Error("browser frame metadata integers are invalid");
766
+ }
767
+ assertImageDimensions(metadata.width, metadata.height);
768
+ if (metadata.deviceScaleFactor <= 0 || metadata.deviceScaleFactor > 16 || Math.abs(metadata.scrollX) > 1e9 || Math.abs(metadata.scrollY) > 1e9) {
769
+ throw new Error("browser frame geometry metadata is invalid");
770
+ }
771
+ if (metadata.mediaType !== "image/jpeg" && metadata.mediaType !== "image/png") {
772
+ throw new Error("browser frame media type is invalid");
773
+ }
774
+ if (!isUuid(metadata.browserSessionId)) throw new Error("browser frame session id is invalid");
775
+ if (!/^[A-Za-z0-9][A-Za-z0-9._:-]*$/u.test(metadata.controllerGeneration)) {
776
+ throw new Error("browser frame controller generation is invalid");
777
+ }
778
+ if (!Number.isFinite(new Date(metadata.capturedAt).valueOf())) {
779
+ throw new Error("browser frame timestamp is invalid");
780
+ }
781
+ return metadata;
782
+ }
783
+ function parseComputerFrameMetadata(value) {
784
+ if (!isRecord(value)) throw new Error("computer frame metadata is invalid");
785
+ const allowed = /* @__PURE__ */ new Set([
786
+ "frameId",
787
+ "computerSessionId",
788
+ "controllerGeneration",
789
+ "targetId",
790
+ "targetGeneration",
791
+ "sequence",
792
+ "mediaType",
793
+ "width",
794
+ "height",
795
+ "capturedAt",
796
+ "sha256"
797
+ ]);
798
+ if (Object.keys(value).some((key) => !allowed.has(key))) {
799
+ throw new Error("computer frame metadata contains unknown fields");
800
+ }
801
+ const strings = [
802
+ "frameId",
803
+ "computerSessionId",
804
+ "controllerGeneration",
805
+ "targetId",
806
+ "targetGeneration",
807
+ "mediaType",
808
+ "capturedAt",
809
+ "sha256"
810
+ ];
811
+ for (const key of strings) {
812
+ const item = value[key];
813
+ const max = key === "targetId" ? 512 : key === "capturedAt" ? 128 : 256;
814
+ if (typeof item !== "string" || item.length < 1 || utf8Bytes(item) > max) {
815
+ throw new Error("computer frame metadata is invalid");
816
+ }
817
+ }
818
+ const metadata = value;
819
+ if (!Number.isSafeInteger(metadata.sequence) || metadata.sequence < 0 || !Number.isSafeInteger(metadata.width) || !Number.isSafeInteger(metadata.height)) {
820
+ throw new Error("computer frame metadata integers are invalid");
821
+ }
822
+ assertImageDimensions(metadata.width, metadata.height);
823
+ if (metadata.mediaType !== "image/jpeg" && metadata.mediaType !== "image/png") {
824
+ throw new Error("computer frame media type is invalid");
825
+ }
826
+ if (!isUuid(metadata.computerSessionId)) {
827
+ throw new Error("computer frame session id is invalid");
828
+ }
829
+ if (!/^[A-Za-z0-9][A-Za-z0-9._:-]*$/u.test(metadata.controllerGeneration)) {
830
+ throw new Error("computer frame controller generation is invalid");
831
+ }
832
+ if (!Number.isFinite(new Date(metadata.capturedAt).valueOf())) {
833
+ throw new Error("computer frame timestamp is invalid");
834
+ }
835
+ if (!/^[0-9a-f]{64}$/u.test(metadata.sha256)) {
836
+ throw new Error("computer frame digest is invalid");
837
+ }
838
+ return metadata;
839
+ }
840
+ function newestRelevantBrowser(sessions, associationSessionId) {
841
+ const live = sessions.filter(
842
+ (session) => !["ending", "ended", "failed", "lost"].includes(session.lifecycle) && session.associations.some((association) => association.sessionId === associationSessionId)
843
+ );
844
+ live.sort(
845
+ (left, right) => browserRelevance(right, associationSessionId) - browserRelevance(left, associationSessionId)
846
+ );
847
+ return live[0] ?? null;
848
+ }
849
+ function newestRelevantComputer(sessions, associationSessionId) {
850
+ const live = sessions.filter(
851
+ (session) => ["starting", "active", "restoring"].includes(session.lifecycle) && session.associations.some((association) => association.sessionId === associationSessionId)
852
+ );
853
+ live.sort(
854
+ (left, right) => computerRelevance(right, associationSessionId) - computerRelevance(left, associationSessionId)
855
+ );
856
+ return live[0] ?? null;
857
+ }
858
+ function browserRelevance(session, associationSessionId) {
859
+ const association = session.associations.filter((item) => item.sessionId === associationSessionId).map((item) => Date.parse(item.lastUsedAt)).filter(Number.isFinite).reduce((best, timestamp) => Math.max(best, timestamp), 0);
860
+ const used = Date.parse(session.lastUsedAt);
861
+ return Math.max(association, Number.isFinite(used) ? used : 0);
862
+ }
863
+ function computerRelevance(session, associationSessionId) {
864
+ const association = session.associations.filter((item) => item.sessionId === associationSessionId).map((item) => Date.parse(item.lastUsedAt)).filter(Number.isFinite).reduce((best, timestamp) => Math.max(best, timestamp), 0);
865
+ const used = Date.parse(session.lastUsedAt);
866
+ return Math.max(association, Number.isFinite(used) ? used : 0);
867
+ }
868
+ function setBoundedIntegerQuery(url, name, value, min, max) {
869
+ if (value === void 0) return;
870
+ if (!Number.isSafeInteger(value) || value < min || value > max) {
871
+ throw new Error(`browser frame ${name} must be an integer between ${min} and ${max}`);
872
+ }
873
+ url.searchParams.set(name, String(value));
874
+ }
875
+ function imageDimensions(data, mediaType) {
876
+ const dimensions = mediaType === "image/png" ? pngDimensions(data) : jpegDimensions(data);
877
+ assertImageDimensions(dimensions.width, dimensions.height);
878
+ return dimensions;
879
+ }
880
+ function assertImageDimensions(width, height) {
881
+ if (!Number.isSafeInteger(width) || !Number.isSafeInteger(height) || width < 1 || height < 1 || width > BROWSER_FRAME_MAX_DIMENSION || height > BROWSER_FRAME_MAX_DIMENSION || width * height > BROWSER_FRAME_MAX_PIXELS) {
882
+ throw new Error("browser image dimensions exceed their bounded envelope");
883
+ }
884
+ }
885
+ function pngDimensions(data) {
886
+ const signature = [137, 80, 78, 71, 13, 10, 26, 10];
887
+ if (data.byteLength < 24 || !signature.every((byte, index) => data[index] === byte) || String.fromCharCode(...data.slice(12, 16)) !== "IHDR") {
888
+ throw new Error("browser returned an invalid PNG image");
889
+ }
890
+ const view = new DataView(data.buffer, data.byteOffset, data.byteLength);
891
+ return { width: view.getUint32(16), height: view.getUint32(20) };
892
+ }
893
+ function jpegDimensions(data) {
894
+ if (data.byteLength < 4 || data[0] !== 255 || data[1] !== 216) {
895
+ throw new Error("browser returned an invalid JPEG image");
896
+ }
897
+ let offset = 2;
898
+ while (offset + 3 < data.byteLength) {
899
+ if (data[offset] !== 255) {
900
+ offset += 1;
901
+ continue;
902
+ }
903
+ let marker = data[offset + 1];
904
+ while (marker === 255) {
905
+ offset += 1;
906
+ marker = data[offset + 1];
907
+ }
908
+ if (marker === 216 || marker === 217 || marker === 1 || marker >= 208 && marker <= 215) {
909
+ offset += 2;
910
+ continue;
911
+ }
912
+ if (offset + 3 >= data.byteLength) break;
913
+ const length = data[offset + 2] << 8 | data[offset + 3];
914
+ if (length < 2 || offset + 2 + length > data.byteLength) break;
915
+ if (isJpegStartOfFrame(marker)) {
916
+ if (length < 7 || offset + 8 >= data.byteLength) break;
917
+ return {
918
+ height: data[offset + 5] << 8 | data[offset + 6],
919
+ width: data[offset + 7] << 8 | data[offset + 8]
920
+ };
921
+ }
922
+ offset += 2 + length;
923
+ }
924
+ throw new Error("browser returned a JPEG without dimensions");
925
+ }
926
+ function isJpegStartOfFrame(marker) {
927
+ return marker >= 192 && marker <= 195 || marker >= 197 && marker <= 199 || marker >= 201 && marker <= 203 || marker >= 205 && marker <= 207;
928
+ }
929
+ function utf8Bytes(value) {
930
+ return new TextEncoder().encode(value).byteLength;
931
+ }
932
+ async function sha256Hex(value) {
933
+ const subtle = globalThis.crypto?.subtle;
934
+ if (!subtle) throw new Error("computer frame digest verification is unavailable");
935
+ const copy = new Uint8Array(value.byteLength);
936
+ copy.set(value);
937
+ const digest = new Uint8Array(await subtle.digest("SHA-256", copy));
938
+ return [...digest].map((byte) => byte.toString(16).padStart(2, "0")).join("");
939
+ }
940
+ function isUuid(value) {
941
+ 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);
942
+ }
943
+ function isRecord(value) {
944
+ return typeof value === "object" && value !== null && !Array.isArray(value);
945
+ }
946
+
947
+ export {
948
+ INTERACTION_PROTOCOL_VERSION,
949
+ BROWSER_CONTROL_WEBSOCKET_PROTOCOL,
950
+ COMPUTER_CONTROL_WEBSOCKET_PROTOCOL,
951
+ BROWSER_CONTROL_WEBSOCKET_BEARER_PREFIX,
952
+ BROWSER_CONTROL_MAX_FRAME_HEADER_BYTES,
953
+ BROWSER_FRAME_MAX_BYTES,
954
+ BROWSER_FRAME_MAX_DIMENSION,
955
+ BROWSER_FRAME_MAX_PIXELS,
956
+ OpenGeniInteractionClient,
957
+ NetworkRouteCollection,
958
+ NetworkRouteResource,
959
+ SiteAuthConnectionCollection,
960
+ SiteAuthConnectionResource,
961
+ AuthRunCollection,
962
+ BrowserAuthRunCollection,
963
+ AuthRunResource,
964
+ InteractionInterventionCollection,
965
+ InteractionInterventionResource,
966
+ AttachedBrowserDeviceCollection,
967
+ AttachedBrowserDeviceResource,
968
+ BrowserIdentityCollection,
969
+ BrowserIdentityResource,
970
+ BrowserSessionCollection,
971
+ BrowserSessionResource,
972
+ BrowserClipboardResource,
973
+ BrowserDownloadCollection,
974
+ BrowserDownloadResource,
975
+ BrowserTargetCollection,
976
+ ComputerSessionCollection,
977
+ ComputerSessionResource,
978
+ ComputerClipboardResource,
979
+ ComputerTargetCollection,
980
+ browserFrameSocketUrl,
981
+ computerFrameSocketUrl,
982
+ decodeBrowserFrameMessage,
983
+ decodeComputerFrameMessage,
984
+ parseBrowserFrameMetadata,
985
+ parseComputerFrameMetadata
986
+ };
987
+ //# sourceMappingURL=chunk-ST5DDKJP.js.map