@aperture-browser/api-schema 0.0.0-init.0 → 0.0.0-nightly.100.78b4e7ef6edc

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,9 +1,12 @@
1
1
  import * as Data from "effect/Data";
2
2
  import * as Effect from "effect/Effect";
3
+ import "effect/Redacted";
3
4
  import * as Schema from "effect/Schema";
4
- import * as HttpClientError from "effect/unstable/http/HttpClientError";
5
- import * as HttpClientRequest from "effect/unstable/http/HttpClientRequest";
6
- import * as HttpClientResponse from "effect/unstable/http/HttpClientResponse";
5
+ import * as Stream from "effect/Stream";
6
+ import * as HttpClient from "effect/http/HttpClient";
7
+ import * as HttpClientError from "effect/http/HttpClientError";
8
+ import * as HttpClientRequest from "effect/http/HttpClientRequest";
9
+ import * as HttpClientResponse from "effect/http/HttpClientResponse";
7
10
  //#region src/api.gen.ts
8
11
  const Health = Schema.Struct({
9
12
  "status": Schema.Literal("ok").annotate({ "description": "Process health. A successful response currently reports `ok`." }),
@@ -109,7 +112,7 @@ const PageMeta = Schema.Struct({
109
112
  const TenantInput = Schema.Struct({ "displayName": Schema.String.annotate({
110
113
  "description": "Human-readable tenant name. Leading and trailing whitespace is removed and whitespace-only values are rejected.",
111
114
  "examples": ["Example engineering"]
112
- }).check(Schema.isMinLength(1).annotate({ "expected": "a value with a length of at least 1" })).check(Schema.isPattern(/* @__PURE__ */ new RegExp(".*\\S.*")).annotate({ "expected": "a string matching the RegExp .*\\S.*" })) }).annotate({
115
+ }).check(Schema.isMinLength(1).annotate({ "expected": "a value with a length of at least 1" })).check(Schema.isPattern(/* @__PURE__ */ new RegExp(".*\\S.*", "u")).annotate({ "expected": "a string matching the RegExp .*\\S.*" })) }).annotate({
113
116
  "description": "Tenant fields accepted by create and update operations.",
114
117
  "identifier": "TenantInput"
115
118
  });
@@ -118,7 +121,7 @@ const UserInput = Schema.Struct({
118
121
  "description": "Optional normalized login and contact email.",
119
122
  "format": "email"
120
123
  })),
121
- "displayName": Schema.String.check(Schema.isMinLength(1).annotate({ "expected": "a value with a length of at least 1" })).check(Schema.isPattern(/* @__PURE__ */ new RegExp(".*\\S.*")).annotate({ "expected": "a string matching the RegExp .*\\S.*" })),
124
+ "displayName": Schema.String.check(Schema.isMinLength(1).annotate({ "expected": "a value with a length of at least 1" })).check(Schema.isPattern(/* @__PURE__ */ new RegExp(".*\\S.*", "u")).annotate({ "expected": "a string matching the RegExp .*\\S.*" })),
122
125
  "isSystemAdmin": Schema.Boolean.annotate({ "description": "Grants deployment-wide administration independently of tenant memberships." })
123
126
  }).annotate({ "identifier": "UserInput" });
124
127
  const UserInvitation = Schema.Struct({
@@ -139,6 +142,7 @@ const TenantScope = Schema.Literals([
139
142
  "examples": ["sessions:write"],
140
143
  "identifier": "TenantScope"
141
144
  });
145
+ const SensitiveString = Schema.RedactedFromValue(Schema.String).annotate({ "identifier": "SensitiveString" });
142
146
  const SessionStatus = Schema.Literals([
143
147
  "creating",
144
148
  "running",
@@ -151,23 +155,6 @@ const SessionStatus = Schema.Literals([
151
155
  "examples": ["running"],
152
156
  "identifier": "SessionStatus"
153
157
  });
154
- const IceServer = Schema.Struct({
155
- "urls": Schema.Array(Schema.String).annotate({
156
- "description": "STUN or TURN server URLs.",
157
- "examples": [["turn:turn.example.com:3478?transport=udp"]]
158
- }),
159
- "username": Schema.optionalKey(Schema.String.annotate({
160
- "description": "TURN username. Omitted when the server does not require authentication.",
161
- "examples": ["aperture-session"]
162
- })),
163
- "credential": Schema.optionalKey(Schema.String.annotate({
164
- "description": "TURN credential. Treat it as a secret and do not persist it in logs.",
165
- "examples": ["REDACTED"]
166
- }))
167
- }).annotate({
168
- "description": "ICE server configuration supplied to WebRTC consumers.",
169
- "identifier": "IceServer"
170
- });
171
158
  const StringMap = Schema.Record(Schema.String, Schema.String).annotate({
172
159
  "description": "Arbitrary string key-value metadata. Tag-writing operations additionally reject blank keys and blank values.",
173
160
  "examples": [{
@@ -176,43 +163,28 @@ const StringMap = Schema.Record(Schema.String, Schema.String).annotate({
176
163
  }],
177
164
  "identifier": "StringMap"
178
165
  });
179
- const SessionCollaborationCapabilities = Schema.Struct({
180
- "editorToken": Schema.String.annotate({ "examples": ["ape_019f6cf0000070008000000000000010_REDACTED"] }),
181
- "viewerToken": Schema.String.annotate({ "examples": ["apv_019f6cf0000070008000000000000010_REDACTED"] })
182
- }).annotate({
183
- "description": "Owner-visible role-scoped secrets used to build collaboration links.",
184
- "identifier": "SessionCollaborationCapabilities"
166
+ const SessionProxyUpstream = Schema.Struct({ "url": Schema.String.annotate({ "examples": ["socks5://user:xxxxx@proxy.example.com:1080"] }) }).annotate({
167
+ "description": "A named upstream as stored. The secret is never returned and proxy URL passwords are masked.",
168
+ "identifier": "SessionProxyUpstream"
185
169
  });
186
- const SessionProxy = Schema.Struct({
187
- "upstream": Schema.Literals([
188
- "direct",
189
- "proxy",
190
- "tunnel"
191
- ]).annotate({
192
- "description": "Upstream strategy for new connections.",
193
- "examples": ["tunnel"]
170
+ const ProxyRule = Schema.Struct({
171
+ "match": Schema.String.annotate({
172
+ "description": "`host` or `host:port`, where the host is exact, `*.suffix` for subdomains, or `*` for any host. `*` never matches `localhost`, which only a rule naming it routes. Loopback IPs never reach the proxy, so local services are matched as `localhost`.",
173
+ "examples": ["*.example.test"]
194
174
  }),
195
- "url": Schema.optionalKey(Schema.String.annotate({
196
- "description": "Generic upstream proxy URL. Omitted unless `upstream` is `proxy`. The password is masked, so this value cannot be replayed as a write.",
197
- "examples": ["socks5://user:pass@proxy.example.com:1080"]
198
- })),
199
- "tunnel": Schema.optionalKey(Schema.Struct({ "url": Schema.optionalKey(Schema.String.annotate({
200
- "description": "Compound tunnel URL.",
201
- "examples": ["wss+yamux+socks5://tunnel.example.com/t/019f6cf0-0000-7000-8000-000000000010"]
202
- })) }).annotate({ "description": "Tunnel endpoint. Omitted unless `upstream` is `tunnel`. The secret is never returned." })),
203
- "bypass": Schema.optionalKey(Schema.String.annotate({
204
- "description": "Extra `--proxy-bypass-list` entries.",
205
- "examples": ["*.internal.example.com"]
206
- }))
175
+ "via": Schema.String.annotate({
176
+ "description": "`direct` dials from the session host, `refuse` fails the connection, `local` uses the attached local tunnel and fails while none is attached. Anything else names an upstream, or is an inline proxy URL without a secret.",
177
+ "examples": ["operator"]
178
+ })
207
179
  }).annotate({
208
- "description": "Stored session egress proxy assignment. Secrets are write-only — tunnel auth never appears here, and an upstream proxy URL comes back with its password masked.",
209
- "identifier": "SessionProxy"
180
+ "description": "Routes the browser connections its match covers.",
181
+ "identifier": "ProxyRule"
210
182
  });
211
183
  const BrowserConfig = Schema.Struct({
212
184
  "channel": Schema.String.annotate({
213
185
  "description": "Channel returned by `GET /api/browser/channels`.",
214
186
  "examples": ["chromium"]
215
- }).check(Schema.isMinLength(1).annotate({ "expected": "a value with a length of at least 1" })).check(Schema.isPattern(/* @__PURE__ */ new RegExp(".*\\S.*")).annotate({ "expected": "a string matching the RegExp .*\\S.*" })),
187
+ }).check(Schema.isMinLength(1).annotate({ "expected": "a value with a length of at least 1" })).check(Schema.isPattern(/* @__PURE__ */ new RegExp(".*\\S.*", "u")).annotate({ "expected": "a string matching the RegExp .*\\S.*" })),
216
188
  "args": Schema.optionalKey(Schema.Array(Schema.String).annotate({
217
189
  "description": "Additional Chromium command-line arguments. Aperture rejects arguments that conflict with supervisor-owned behavior or deployment policy.",
218
190
  "examples": [["--lang=en-US"]]
@@ -221,16 +193,12 @@ const BrowserConfig = Schema.Struct({
221
193
  "description": "Browser runtime configuration used to create or reopen the session.",
222
194
  "identifier": "BrowserConfig"
223
195
  });
224
- const BrowserStorageEntry = Schema.Struct({
225
- "name": Schema.String,
226
- "value": Schema.String.annotate({ "description": "Browser storage value. Never log this field." })
227
- }).annotate({ "identifier": "BrowserStorageEntry" });
228
196
  const InitialBrowserScrollPosition = Schema.Struct({
229
197
  "x": Schema.Number.check(Schema.isFinite().annotate({ "expected": "a finite number" })),
230
198
  "y": Schema.Number.check(Schema.isFinite().annotate({ "expected": "a finite number" }))
231
199
  }).annotate({ "identifier": "InitialBrowserScrollPosition" });
232
200
  const InitialBrowserElementPathStep = Schema.Struct({
233
- "tag": Schema.String.check(Schema.isPattern(/* @__PURE__ */ new RegExp("^[a-z][a-z0-9-]*$")).annotate({ "expected": "a string matching the RegExp ^[a-z][a-z0-9-]*$" })),
201
+ "tag": Schema.String.check(Schema.isPattern(/* @__PURE__ */ new RegExp("^[a-z][a-z0-9-]*$", "u")).annotate({ "expected": "a string matching the RegExp ^[a-z][a-z0-9-]*$" })),
234
202
  "index": Schema.Number.check(Schema.isInt().annotate({ "expected": "an integer" })).check(Schema.isGreaterThanOrEqualTo(0).annotate({ "expected": "a value greater than or equal to 0" }))
235
203
  }).annotate({ "identifier": "InitialBrowserElementPathStep" });
236
204
  const InitialBrowserControlSelection = Schema.Struct({
@@ -248,7 +216,7 @@ const BrowserCookieSameSite = Schema.Literals([
248
216
  "None"
249
217
  ]).annotate({ "identifier": "BrowserCookieSameSite" });
250
218
  const InitialBrowserCookiePartitionKey = Schema.Struct({
251
- "topLevelSite": Schema.String.annotate({ "format": "uri" }).check(Schema.isPattern(/* @__PURE__ */ new RegExp("^https?:\\/\\/[^/]+$")).annotate({ "expected": "a string matching the RegExp ^https?:\\/\\/[^/]+$" })),
219
+ "topLevelSite": Schema.String.annotate({ "format": "uri" }).check(Schema.isPattern(/* @__PURE__ */ new RegExp("^https?:\\/\\/[^/]+$", "u")).annotate({ "expected": "a string matching the RegExp ^https?:\\/\\/[^/]+$" })),
252
220
  "hasCrossSiteAncestor": Schema.optionalKey(Schema.Boolean)
253
221
  }).annotate({ "identifier": "InitialBrowserCookiePartitionKey" });
254
222
  const InitialIndexedDBKeyPath = Schema.Struct({
@@ -269,62 +237,34 @@ const InitialIndexedDBIndexKeyPath = Schema.Struct({
269
237
  "description": "Index key path. String paths contain one value; array paths contain at least one.",
270
238
  "identifier": "InitialIndexedDBIndexKeyPath"
271
239
  });
272
- const InitialIndexedDBRecord = Schema.Struct({
273
- "key": Schema.String.annotate({ "description": "JSON-encoded structured-clone key." }),
274
- "value": Schema.String.annotate({ "description": "JSON-encoded structured-clone value." })
275
- }).annotate({ "identifier": "InitialIndexedDBRecord" });
276
- const InitialOPFSFile = Schema.Struct({
277
- "path": Schema.String.check(Schema.isMinLength(1).annotate({ "expected": "a value with a length of at least 1" })),
278
- "body": Schema.String.annotate({ "contentEncoding": "base64" })
279
- }).annotate({ "identifier": "InitialOPFSFile" });
280
- const ProxyTunnelConfig = Schema.Struct({
281
- "url": Schema.optionalKey(Schema.String.annotate({
282
- "description": "Compound tunnel URL (`ws+yamux+socks5://` or `wss+yamux+socks5://`).",
283
- "examples": ["wss+yamux+socks5://tunnel.example.com/t/019f6cf0-0000-7000-8000-000000000010"]
284
- })),
285
- "auth": Schema.optionalKey(Schema.String.annotate({
286
- "description": "Per-assignment bearer secret for the tunnel handshake. Write-only; never returned.",
287
- "examples": ["REDACTED"]
288
- }))
289
- }).annotate({
290
- "description": "Tunnel endpoint for the `tunnel` upstream. Minted by the tunnel operator.",
291
- "identifier": "ProxyTunnelConfig"
292
- });
293
240
  const CursorVisibility = Schema.Struct({ "visible": Schema.Boolean.annotate({ "description": "Whether to include the remote cursor in live streams and recordings." }) }).annotate({
294
241
  "description": "Whether the remote browser cursor is composited into session media.",
295
242
  "identifier": "CursorVisibility"
296
243
  });
297
- const Recording = Schema.Struct({
298
- "recordingId": Schema.String.annotate({
299
- "description": "Stable recording identifier retained across target changes.",
300
- "format": "uuid"
301
- }),
302
- "mode": Schema.Literals(["tab", "viewer"]).annotate({ "description": "Tab recordings stay on their specified top-level target; viewer recordings follow a live session client's selected top-level target and cannot be explicitly retargeted." }),
303
- "targetId": Schema.String.annotate({ "description": "Identifier of the top-level target currently recorded." }),
304
- "captureGeneration": Schema.Number.annotate({
305
- "description": "Assignment generation for the current top-level target.",
306
- "format": "int64"
307
- }).check(Schema.isInt().annotate({ "expected": "an integer" })).check(Schema.isGreaterThanOrEqualTo(0).annotate({ "expected": "a value greater than or equal to 0" })),
308
- "status": Schema.Literals([
309
- "starting",
310
- "running",
311
- "stopped",
312
- "failed"
244
+ const ExportSessionStorageStateInput = Schema.Struct({ "origins": Schema.Union([Schema.Literal("open-tabs"), Schema.Array(Schema.String.check(Schema.isMinLength(1).annotate({ "expected": "a value with a length of at least 1" })).check(Schema.isMaxCodePoints(2048).annotate({ "expected": "a string with at most 2048 code points" }))).check(Schema.isMinLength(1).annotate({ "expected": "a value with a length of at least 1" })).check(Schema.isMaxLength(100).annotate({ "expected": "a value with a length of at most 100" }))], { mode: "oneOf" }).annotate({ "description": "Exact origins and/or * patterns, or open-tabs to select current pages and frames." }) }).annotate({
245
+ "examples": [
246
+ { "origins": ["*"] },
247
+ { "origins": ["https://example.com", "https://*.example.org"] },
248
+ { "origins": "open-tabs" }
249
+ ],
250
+ "identifier": "ExportSessionStorageStateInput"
251
+ });
252
+ const RecordingEditError = Schema.Struct({
253
+ "code": Schema.Literals([
254
+ "ffmpeg_unavailable",
255
+ "open_failed",
256
+ "nothing_kept",
257
+ "analysis_failed",
258
+ "plan_failed",
259
+ "render_failed",
260
+ "timeout",
261
+ "cancelled",
262
+ "timeline_failed"
313
263
  ]),
314
- "stopReason": Schema.optionalKey(Schema.String.annotate({ "description": "Lifecycle reason recorded after the recording stops or fails." })),
315
- "relativePath": Schema.String.annotate({
316
- "description": "Path below the session root; absolute host paths are never exposed.",
317
- "examples": ["recordings/recording-550e8400-e29b-41d4-a716-446655440000.webm"]
318
- }),
319
- "startedAt": Schema.String.annotate({ "format": "date-time" }),
320
- "stoppedAt": Schema.optionalKey(Schema.String.annotate({ "format": "date-time" })),
321
- "sizeBytes": Schema.optionalKey(Schema.Number.annotate({ "format": "int64" }).check(Schema.isInt().annotate({ "expected": "an integer" })).check(Schema.isGreaterThanOrEqualTo(0).annotate({ "expected": "a value greater than or equal to 0" }))),
322
- "fps": Schema.Number.check(Schema.isInt().annotate({ "expected": "an integer" })).check(Schema.isGreaterThanOrEqualTo(1).annotate({ "expected": "a value greater than or equal to 1" })),
323
- "bitrateKbps": Schema.Number.check(Schema.isInt().annotate({ "expected": "an integer" })).check(Schema.isGreaterThanOrEqualTo(1).annotate({ "expected": "a value greater than or equal to 1" })),
324
- "codec": Schema.Literals(["vp8", "h264-va"])
264
+ "message": Schema.String
325
265
  }).annotate({
326
- "description": "One logical recording of a top-level target.",
327
- "identifier": "Recording"
266
+ "description": "Why a recording has no edit although one was due or a timeline could not be written. The raw video is published regardless.",
267
+ "identifier": "RecordingEditError"
328
268
  });
329
269
  const CreateSessionRecordingInput = Schema.Struct({
330
270
  "targetId": Schema.String.annotate({ "description": "Identifier of the ready top-level target to record." }).check(Schema.isMinLength(1).annotate({ "expected": "a value with a length of at least 1" })),
@@ -339,7 +279,17 @@ const CreateSessionRecordingInput = Schema.Struct({
339
279
  "codec": Schema.optionalKey(Schema.Literals(["vp8", "h264-va"]).annotate({
340
280
  "description": "Video codec. Omit for the instance default.",
341
281
  "examples": ["vp8"]
342
- }))
282
+ })),
283
+ "capture": Schema.optionalKey(Schema.Literals(["continuous", "bursts"]).annotate({ "description": "With `bursts`, the edited video keeps only the stretches around browser tool calls, from `burst.leadMs` before a call to `burst.tailMs` after it, longer until the screen has stood still for `burst.settleMs` but at most `burst.maxTailMs`, and the recording follows the tab the automation acts on. The raw video is always the whole capture. Defaults to `continuous`. Cannot be combined with `idle`. Needs `recording_ffmpeg_executable` on the instance." })),
284
+ "presentation": Schema.optionalKey(Schema.Boolean.annotate({ "description": "Run browser automation at presentation pace while the recording runs. Needs nothing of the instance." })),
285
+ "idle": Schema.optionalKey(Schema.Literals(["cut", "speed"]).annotate({ "description": "Remove (`cut`) or fast-forward (`speed`) the stretches of a continuous recording in which neither the picture nor the automation changes, in the edited video. Needs `recording_ffmpeg_executable` on the instance." })),
286
+ "ripple": Schema.optionalKey(Schema.Boolean.annotate({ "description": "Mark clicks with a ripple in the edited video. Needs `recording_ffmpeg_executable` on the instance." })),
287
+ "burst": Schema.optionalKey(Schema.Struct({
288
+ "leadMs": Schema.optionalKey(Schema.Number.annotate({ "description": "Kept before a tool call. Defaults to 500." }).check(Schema.isInt().annotate({ "expected": "an integer" })).check(Schema.isGreaterThanOrEqualTo(0).annotate({ "expected": "a value greater than or equal to 0" })).check(Schema.isLessThanOrEqualTo(6e4).annotate({ "expected": "a value less than or equal to 60000" }))),
289
+ "tailMs": Schema.optionalKey(Schema.Number.annotate({ "description": "Kept after a tool call. Defaults to 800." }).check(Schema.isInt().annotate({ "expected": "an integer" })).check(Schema.isGreaterThanOrEqualTo(0).annotate({ "expected": "a value greater than or equal to 0" })).check(Schema.isLessThanOrEqualTo(6e4).annotate({ "expected": "a value less than or equal to 60000" }))),
290
+ "settleMs": Schema.optionalKey(Schema.Number.annotate({ "description": "How long the screen must stand still to count as settled. Defaults to 400." }).check(Schema.isInt().annotate({ "expected": "an integer" })).check(Schema.isGreaterThanOrEqualTo(0).annotate({ "expected": "a value greater than or equal to 0" })).check(Schema.isLessThanOrEqualTo(6e4).annotate({ "expected": "a value less than or equal to 60000" }))),
291
+ "maxTailMs": Schema.optionalKey(Schema.Number.annotate({ "description": "Longest wait for the screen to settle after a call. Defaults to 3000." }).check(Schema.isInt().annotate({ "expected": "an integer" })).check(Schema.isGreaterThanOrEqualTo(0).annotate({ "expected": "a value greater than or equal to 0" })).check(Schema.isLessThanOrEqualTo(6e4).annotate({ "expected": "a value less than or equal to 60000" })))
292
+ }).annotate({ "description": "Burst sizes in milliseconds for `capture` `bursts`; rejected without it. Omitted or zero fields take the defaults. `tailMs` must not exceed `maxTailMs` (default 3000)." }))
343
293
  }).annotate({
344
294
  "description": "Top-level target and optional recording settings.",
345
295
  "identifier": "CreateSessionRecordingInput"
@@ -349,12 +299,13 @@ const RetargetSessionRecordingInput = Schema.Struct({ "targetId": Schema.String.
349
299
  "identifier": "RetargetSessionRecordingInput"
350
300
  });
351
301
  const SessionFile = Schema.Struct({
302
+ "type": Schema.Literal("file"),
352
303
  "name": Schema.String.annotate({
353
304
  "description": "File name without directory components.",
354
305
  "examples": ["screencast-20260801T120000Z.webm"]
355
306
  }),
356
307
  "relativePath": Schema.String.annotate({
357
- "description": "Path below the session root. The first component is `downloads` or `recordings`.",
308
+ "description": "Path below the session files root. Browser downloads are under `downloads/`, recordings under `recordings/`, uploads under `uploads/`, and Playwright MCP output under `outputs/`. Pass it to `browser_file_upload` or to create a signed download URL.",
358
309
  "examples": ["recordings/screencast-20260801T120000Z.webm"]
359
310
  }),
360
311
  "size": Schema.Number.annotate({
@@ -370,11 +321,51 @@ const SessionFile = Schema.Struct({
370
321
  "mimeType": Schema.String.annotate({
371
322
  "description": "Detected media type.",
372
323
  "examples": ["video/webm"]
373
- })
324
+ }),
325
+ "sandboxPath": Schema.optionalKey(Schema.String.annotate({
326
+ "description": "Path of the file inside the session's browser sandbox, under the fixed `/session/files` root, for CDP `DOM.setFileInputFiles`. It is readable by the browser while the session runs. Absent for files of sessions created before session files moved under one root that are still in their old location.",
327
+ "examples": ["/session/files/recordings/screencast-20260801T120000Z.webm"]
328
+ }))
374
329
  }).annotate({
375
330
  "description": "Regular file retained with a browser session.",
376
331
  "identifier": "SessionFile"
377
332
  });
333
+ const SessionDirectory = Schema.Struct({
334
+ "type": Schema.Literal("directory"),
335
+ "name": Schema.String.annotate({
336
+ "description": "Directory name without parent components.",
337
+ "examples": ["invoices"]
338
+ }),
339
+ "relativePath": Schema.String.annotate({
340
+ "description": "Path below the session files root.",
341
+ "examples": ["uploads/invoices"]
342
+ }),
343
+ "modifiedAt": Schema.String.annotate({ "format": "date-time" })
344
+ }).annotate({
345
+ "description": "Directory below the session files root.",
346
+ "identifier": "SessionDirectory"
347
+ });
348
+ const __ClientMultipartFile = Schema.instanceOf(globalThis.Blob, { expected: "File | Blob" });
349
+ const MoveSessionFileInput = Schema.Struct({
350
+ "from": Schema.String.annotate({
351
+ "description": "Current path from a `SessionFileEntry` result.",
352
+ "examples": ["downloads/invoice.pdf"]
353
+ }).check(Schema.isMinLength(1).annotate({ "expected": "a value with a length of at least 1" })),
354
+ "to": Schema.String.annotate({
355
+ "description": "New path below the session files root. Missing directories are created.",
356
+ "examples": ["uploads/invoices/2026-08.pdf"]
357
+ }).check(Schema.isMinLength(1).annotate({ "expected": "a value with a length of at least 1" }))
358
+ }).annotate({
359
+ "description": "Current and new path of a session file.",
360
+ "identifier": "MoveSessionFileInput"
361
+ });
362
+ const CreateSessionDirectoryInput = Schema.Struct({ "relativePath": Schema.String.annotate({
363
+ "description": "Path below the session files root. Missing parents are created.",
364
+ "examples": ["uploads/invoices"]
365
+ }).check(Schema.isMinLength(1).annotate({ "expected": "a value with a length of at least 1" })) }).annotate({
366
+ "description": "Directory to create.",
367
+ "identifier": "CreateSessionDirectoryInput"
368
+ });
378
369
  const SessionFileDownloadURLInput = Schema.Struct({
379
370
  "relativePath": Schema.String.annotate({
380
371
  "description": "Path from a `SessionFile` result.",
@@ -383,7 +374,11 @@ const SessionFileDownloadURLInput = Schema.Struct({
383
374
  "ttlSeconds": Schema.optionalKey(Schema.Number.annotate({
384
375
  "description": "Requested lifetime in seconds. Omit it to use `signed_file_url_ttl`; values above `signed_file_url_max_ttl` are rejected.",
385
376
  "examples": [900]
386
- }).check(Schema.isInt().annotate({ "expected": "an integer" })).check(Schema.isGreaterThanOrEqualTo(1).annotate({ "expected": "a value greater than or equal to 1" })))
377
+ }).check(Schema.isInt().annotate({ "expected": "an integer" })).check(Schema.isGreaterThanOrEqualTo(1).annotate({ "expected": "a value greater than or equal to 1" }))),
378
+ "disposition": Schema.optionalKey(Schema.Literals(["attachment", "inline"]).annotate({
379
+ "description": "How the URL presents the file. `inline` lets browsers display it, for example as an `<img>` source. Either way it is served with its detected `Content-Type`, `X-Content-Type-Options: nosniff`, and byte-range support. Content that can run scripts, such as HTML or SVG, also gets `Content-Security-Policy: sandbox`; images, audio, video, PDFs, and plain text do not, so browser viewers keep working.",
380
+ "default": "attachment"
381
+ }))
387
382
  }).annotate({
388
383
  "description": "Session file path and requested signed URL lifetime.",
389
384
  "identifier": "SessionFileDownloadURLInput"
@@ -400,7 +395,7 @@ const SessionFileDownloadURL = Schema.Struct({
400
395
  "format": "date-time"
401
396
  })
402
397
  }).annotate({
403
- "description": "Signed attachment URL for one session file.",
398
+ "description": "Signed URL for one session file.",
404
399
  "identifier": "SessionFileDownloadURL"
405
400
  });
406
401
  const UpdateSnapshotInput = Schema.Struct({ "description": Schema.optionalKey(Schema.Union([Schema.String, Schema.Null]).annotate({
@@ -410,6 +405,40 @@ const UpdateSnapshotInput = Schema.Struct({ "description": Schema.optionalKey(Sc
410
405
  "description": "Replacement snapshot description.",
411
406
  "identifier": "UpdateSnapshotInput"
412
407
  });
408
+ const LiveSessionErrorBody = Schema.Struct({ "error": Schema.String.annotate({ "examples": ["file exceeds upload limit"] }) }).annotate({
409
+ "description": "Error raised inside a running session. It carries a message but no stable code.",
410
+ "identifier": "LiveSessionErrorBody"
411
+ });
412
+ const SetViewportInput = Schema.Struct({
413
+ "targetId": Schema.String.annotate({ "description": "Identifier of the top-level target to resize." }).check(Schema.isMinLength(1).annotate({ "expected": "a value with a length of at least 1" })),
414
+ "width": Schema.Number.annotate({
415
+ "description": "Logical width in CSS pixels. Widths below 500 are raised to 500.",
416
+ "examples": [1280]
417
+ }).check(Schema.isInt().annotate({ "expected": "an integer" })).check(Schema.isGreaterThanOrEqualTo(1).annotate({ "expected": "a value greater than or equal to 1" })).check(Schema.isLessThanOrEqualTo(16384).annotate({ "expected": "a value less than or equal to 16384" })),
418
+ "height": Schema.Number.annotate({
419
+ "description": "Logical height in CSS pixels.",
420
+ "examples": [720]
421
+ }).check(Schema.isInt().annotate({ "expected": "an integer" })).check(Schema.isGreaterThanOrEqualTo(1).annotate({ "expected": "a value greater than or equal to 1" })).check(Schema.isLessThanOrEqualTo(16384).annotate({ "expected": "a value less than or equal to 16384" })),
422
+ "deviceScaleFactor": Schema.optionalKey(Schema.Number.annotate({
423
+ "description": "Device pixel ratio, rounded to 1/120. Omit or use a non-positive value for 1. The scaled content size may not exceed 16384 pixels.",
424
+ "examples": [1]
425
+ }).check(Schema.isFinite().annotate({ "expected": "a finite number" })))
426
+ }).annotate({
427
+ "description": "Requested logical viewport of one top-level target.",
428
+ "identifier": "SetViewportInput"
429
+ });
430
+ const Viewport = Schema.Struct({
431
+ "width": Schema.Number.check(Schema.isInt().annotate({ "expected": "an integer" })).check(Schema.isGreaterThanOrEqualTo(1).annotate({ "expected": "a value greater than or equal to 1" })),
432
+ "height": Schema.Number.check(Schema.isInt().annotate({ "expected": "an integer" })).check(Schema.isGreaterThanOrEqualTo(1).annotate({ "expected": "a value greater than or equal to 1" })),
433
+ "contentWidth": Schema.Number.check(Schema.isInt().annotate({ "expected": "an integer" })).check(Schema.isGreaterThanOrEqualTo(1).annotate({ "expected": "a value greater than or equal to 1" })),
434
+ "contentHeight": Schema.Number.check(Schema.isInt().annotate({ "expected": "an integer" })).check(Schema.isGreaterThanOrEqualTo(1).annotate({ "expected": "a value greater than or equal to 1" })),
435
+ "canvasWidth": Schema.Number.check(Schema.isInt().annotate({ "expected": "an integer" })).check(Schema.isGreaterThanOrEqualTo(1).annotate({ "expected": "a value greater than or equal to 1" })),
436
+ "canvasHeight": Schema.Number.check(Schema.isInt().annotate({ "expected": "an integer" })).check(Schema.isGreaterThanOrEqualTo(1).annotate({ "expected": "a value greater than or equal to 1" })),
437
+ "deviceScaleFactor": Schema.Number.annotate({ "description": "Effective device pixel ratio." }).check(Schema.isFinite().annotate({ "expected": "a finite number" }))
438
+ }).annotate({
439
+ "description": "Logical size, DPR-scaled content rectangle, and 64x64-bucketed media canvas of a target.",
440
+ "identifier": "Viewport"
441
+ });
413
442
  const Tenant = Schema.Struct({
414
443
  "id": Schema.suspend(() => UUIDv7).annotate({ "description": "Tenant identifier." }),
415
444
  "displayName": Schema.String.annotate({
@@ -520,19 +549,78 @@ const TenantMembership = Schema.Struct({
520
549
  "updatedAt": Schema.String.annotate({ "format": "date-time" })
521
550
  }).annotate({ "identifier": "TenantMembership" });
522
551
  const TenantMembershipInput = Schema.Struct({ "scopes": Schema.Array(TenantScope).check(Schema.isMinLength(1).annotate({ "expected": "a value with a length of at least 1" })).check(Schema.isUnique().annotate({ "expected": "an array with unique items" })) }).annotate({ "identifier": "TenantMembershipInput" });
523
- const SessionMedia = Schema.Struct({
524
- "mode": Schema.Literals(["auto", "cdp"]).annotate({
525
- "description": "Configured media mode. `auto` enables deployment-selected media support; `cdp` exposes Chrome DevTools access only.",
526
- "examples": ["auto"]
552
+ const IceServer = Schema.Struct({
553
+ "urls": Schema.Array(Schema.String).annotate({
554
+ "description": "STUN or TURN server URLs.",
555
+ "examples": [["turn:turn.example.com:3478?transport=udp"]]
527
556
  }),
528
- "webrtcProducer": Schema.Boolean.annotate({
529
- "description": "Whether the compositor WebRTC producer is available for this session.",
530
- "examples": [true]
557
+ "username": Schema.optionalKey(Schema.String.annotate({
558
+ "description": "TURN username. Omitted when the server does not require authentication.",
559
+ "examples": ["aperture-session"]
560
+ })),
561
+ "credential": Schema.optionalKey(Schema.suspend(() => SensitiveString).annotate({
562
+ "description": "TURN credential. Treat it as a secret and do not persist it in logs.",
563
+ "examples": ["REDACTED"]
564
+ }))
565
+ }).annotate({
566
+ "description": "ICE server configuration supplied to WebRTC consumers.",
567
+ "identifier": "IceServer"
568
+ });
569
+ const SessionCollaborationCapabilities = Schema.Struct({
570
+ "editorToken": Schema.suspend(() => SensitiveString).annotate({ "examples": ["ape_019f6cf0000070008000000000000010_REDACTED"] }),
571
+ "viewerToken": Schema.suspend(() => SensitiveString).annotate({ "examples": ["apv_019f6cf0000070008000000000000010_REDACTED"] })
572
+ }).annotate({
573
+ "description": "Owner-visible role-scoped secrets used to build collaboration links.",
574
+ "identifier": "SessionCollaborationCapabilities"
575
+ });
576
+ const SessionThumbnail = Schema.Struct({
577
+ "url": Schema.suspend(() => SensitiveString).annotate({
578
+ "description": "Thumbnail of the tab most recently shown to a live-session client.",
579
+ "format": "uri"
531
580
  }),
532
- "iceServers": Schema.optionalKey(Schema.Array(IceServer).annotate({ "description": "ICE configuration for WebRTC setup. Omitted when WebRTC is unavailable or does not need configured ICE servers." }))
581
+ "targetUrlTemplate": Schema.suspend(() => SensitiveString).annotate({ "description": "Tab thumbnail URL with a literal `{targetId}` placeholder for a top-level target ID." }),
582
+ "expiresAt": Schema.String.annotate({ "format": "date-time" })
533
583
  }).annotate({
534
- "description": "Media capabilities currently available for the session.",
535
- "identifier": "SessionMedia"
584
+ "description": "Signed thumbnail URLs for image elements. They need no other credentials and expire after the\nconfigured signed URL lifetime; every session response returns fresh ones. Present while the\nsession is running, or while suspended when thumbnails were saved.\n",
585
+ "identifier": "SessionThumbnail"
586
+ });
587
+ const BrowserStorageEntry = Schema.Struct({
588
+ "name": Schema.String,
589
+ "value": Schema.suspend(() => SensitiveString).annotate({ "description": "Browser storage value. Never log this field." })
590
+ }).annotate({ "identifier": "BrowserStorageEntry" });
591
+ const InitialIndexedDBRecord = Schema.Struct({
592
+ "key": Schema.suspend(() => SensitiveString).annotate({ "description": "JSON-encoded structured-clone key." }),
593
+ "value": Schema.suspend(() => SensitiveString).annotate({ "description": "JSON-encoded structured-clone value." })
594
+ }).annotate({ "identifier": "InitialIndexedDBRecord" });
595
+ const InitialOPFSFile = Schema.Struct({
596
+ "path": Schema.String.check(Schema.isMinLength(1).annotate({ "expected": "a value with a length of at least 1" })),
597
+ "body": Schema.suspend(() => SensitiveString).annotate({ "contentEncoding": "base64" })
598
+ }).annotate({ "identifier": "InitialOPFSFile" });
599
+ const ProxyUpstream = Schema.Struct({
600
+ "url": Schema.String.annotate({
601
+ "description": "A generic proxy URL (`http`, `https`, `socks`, `socks5`, `socks5h`) or a compound tunnel URL (`ws+yamux+socks5://`, `wss+yamux+socks5://`). Proxy credentials go in the userinfo (`socks5://user:pass@host:1080`) and are sent as Basic `Proxy-Authorization` for `http`/`https` or RFC 1929 username/password for the socks schemes. An omitted port defaults to 1080 (socks), 80 (http) or 443 (https).",
602
+ "examples": ["wss+yamux+socks5://tunnel.example.com/t/019f6cf0-0000-7000-8000-000000000010"]
603
+ }),
604
+ "auth": Schema.optionalKey(Schema.suspend(() => SensitiveString).annotate({
605
+ "description": "Bearer secret for a tunnel URL's handshake. Required for a tunnel URL and invalid for a proxy URL. Write-only; never returned.",
606
+ "examples": ["REDACTED"]
607
+ }))
608
+ }).annotate({
609
+ "description": "A named upstream that proxy rules route through.",
610
+ "identifier": "ProxyUpstream"
611
+ });
612
+ const ProxyTunnelConfig = Schema.Struct({
613
+ "url": Schema.optionalKey(Schema.String.annotate({
614
+ "description": "Compound tunnel URL (`ws+yamux+socks5://` or `wss+yamux+socks5://`).",
615
+ "examples": ["wss+yamux+socks5://tunnel.example.com/t/019f6cf0-0000-7000-8000-000000000010"]
616
+ })),
617
+ "auth": Schema.optionalKey(Schema.suspend(() => SensitiveString).annotate({
618
+ "description": "Bearer secret for the tunnel handshake. Write-only; never returned.",
619
+ "examples": ["REDACTED"]
620
+ }))
621
+ }).annotate({
622
+ "description": "Legacy tunnel endpoint for `upstream` `tunnel`; both fields are required with it. Use a tunnel URL in `upstreams`.",
623
+ "identifier": "ProxyTunnelConfig"
536
624
  });
537
625
  const InitialCacheStorageEntry = Schema.Struct({
538
626
  "url": Schema.String.annotate({ "format": "uri" }),
@@ -540,7 +628,7 @@ const InitialCacheStorageEntry = Schema.Struct({
540
628
  "responseHeaders": StringMap,
541
629
  "responseStatus": Schema.Number.check(Schema.isInt().annotate({ "expected": "an integer" })).check(Schema.isGreaterThanOrEqualTo(100).annotate({ "expected": "a value greater than or equal to 100" })).check(Schema.isLessThanOrEqualTo(599).annotate({ "expected": "a value less than or equal to 599" })),
542
630
  "responseStatusText": Schema.String,
543
- "responseBody": Schema.String.annotate({ "contentEncoding": "base64" })
631
+ "responseBody": Schema.suspend(() => SensitiveString).annotate({ "contentEncoding": "base64" })
544
632
  }).annotate({ "identifier": "InitialCacheStorageEntry" });
545
633
  const ReplaceTagsInput = Schema.Struct({ "tags": Schema.suspend(() => StringMap).annotate({ "description": "Complete tag map. Keys and values must contain non-whitespace characters." }) }).annotate({
546
634
  "description": "Complete replacement tag set. The map may be empty to clear all tags.",
@@ -554,7 +642,7 @@ const PromoteSessionInput = Schema.Struct({
554
642
  "name": Schema.String.annotate({
555
643
  "description": "Tenant-unique snapshot name. Leading and trailing whitespace is removed.",
556
644
  "examples": ["signed-in-base"]
557
- }).check(Schema.isMinLength(1).annotate({ "expected": "a value with a length of at least 1" })).check(Schema.isPattern(/* @__PURE__ */ new RegExp(".*\\S.*")).annotate({ "expected": "a string matching the RegExp .*\\S.*" })),
645
+ }).check(Schema.isMinLength(1).annotate({ "expected": "a value with a length of at least 1" })).check(Schema.isPattern(/* @__PURE__ */ new RegExp(".*\\S.*", "u")).annotate({ "expected": "a string matching the RegExp .*\\S.*" })),
558
646
  "description": Schema.optionalKey(Schema.Union([Schema.String, Schema.Null]).annotate({
559
647
  "description": "Optional snapshot description. `null` creates the snapshot without a description.",
560
648
  "examples": ["Signed-in storefront state for checkout tests"]
@@ -610,12 +698,32 @@ const Snapshot = Schema.Struct({
610
698
  "description": "Reusable retained browser filesystem state. Deletion is soft until the retention deadline.",
611
699
  "identifier": "Snapshot"
612
700
  });
613
- const InitialTargetStorageOrigin = Schema.Struct({
614
- "origin": Schema.String.annotate({ "format": "uri" }).check(Schema.isPattern(/* @__PURE__ */ new RegExp("^https?:\\/\\/[^/]+$")).annotate({ "expected": "a string matching the RegExp ^https?:\\/\\/[^/]+$" })),
615
- "entries": Schema.Array(BrowserStorageEntry)
616
- }).annotate({ "identifier": "InitialTargetStorageOrigin" });
701
+ const SessionProxy = Schema.Struct({
702
+ "upstreams": Schema.Record(Schema.String, SessionProxyUpstream),
703
+ "rules": Schema.Array(ProxyRule),
704
+ "upstream": Schema.Literals([
705
+ "direct",
706
+ "proxy",
707
+ "tunnel"
708
+ ]).annotate({
709
+ "description": "Legacy single-upstream view of `rules`; read `upstreams` and `rules` instead. Exact when the rules are optional leading `direct` rules followed by one final `*` rule via an upstream proxy or tunnel, with no other upstreams, and `direct` when there are no rules. Otherwise it approximates the route of the last `*` rule (`local` reads as `tunnel`, `refuse` as `direct`), or `direct` without one, and `url`, `tunnel` and `bypass` are omitted.",
710
+ "examples": ["tunnel"]
711
+ }),
712
+ "url": Schema.optionalKey(Schema.String.annotate({
713
+ "description": "Legacy upstream proxy URL with its password masked. Only present when `upstream` is exactly `proxy`.",
714
+ "examples": ["socks5://user:xxxxx@proxy.example.com:1080"]
715
+ })),
716
+ "tunnel": Schema.optionalKey(Schema.Struct({ "url": Schema.optionalKey(Schema.String.annotate({ "examples": ["wss+yamux+socks5://tunnel.example.com/t/019f6cf0-0000-7000-8000-000000000010"] })) }).annotate({ "description": "Legacy tunnel endpoint. Only present when `upstream` is exactly `tunnel`. The secret is never returned." })),
717
+ "bypass": Schema.optionalKey(Schema.String.annotate({
718
+ "description": "Legacy `;`-separated matches of the leading `direct` rules. Only present with an exact `proxy` or `tunnel` value.",
719
+ "examples": ["*.internal.example.com"]
720
+ }))
721
+ }).annotate({
722
+ "description": "Stored session egress proxy configuration. Secrets are write-only, so this value cannot be replayed as a write.",
723
+ "identifier": "SessionProxy"
724
+ });
617
725
  const InitialBrowserElementLocator = Schema.Struct({
618
- "tag": Schema.String.check(Schema.isPattern(/* @__PURE__ */ new RegExp("^[a-z][a-z0-9-]*$")).annotate({ "expected": "a string matching the RegExp ^[a-z][a-z0-9-]*$" })),
726
+ "tag": Schema.String.check(Schema.isPattern(/* @__PURE__ */ new RegExp("^[a-z][a-z0-9-]*$", "u")).annotate({ "expected": "a string matching the RegExp ^[a-z][a-z0-9-]*$" })),
619
727
  "id": Schema.optionalKey(Schema.String),
620
728
  "name": Schema.optionalKey(Schema.String),
621
729
  "inputType": Schema.optionalKey(Schema.String),
@@ -629,13 +737,13 @@ const InitialBrowserElementLocator = Schema.Struct({
629
737
  });
630
738
  const InitialBrowserCookie = Schema.Struct({
631
739
  "name": Schema.String.check(Schema.isMinLength(1).annotate({ "expected": "a value with a length of at least 1" })),
632
- "value": Schema.String.annotate({ "description": "Cookie value. Never log this field." }),
740
+ "value": Schema.suspend(() => SensitiveString).annotate({ "description": "Cookie value. Never log this field." }),
633
741
  "domain": Schema.String.annotate({ "examples": [".example.com"] }).check(Schema.isMinLength(1).annotate({ "expected": "a value with a length of at least 1" })),
634
742
  "hostOnly": Schema.optionalKey(Schema.Boolean.annotate({
635
743
  "description": "Scope the cookie to exactly `domain`, without subdomains. `domain` must then be a plain hostname.",
636
744
  "default": false
637
745
  })),
638
- "path": Schema.String.annotate({ "examples": ["/"] }).check(Schema.isPattern(/* @__PURE__ */ new RegExp("^\\/")).annotate({ "expected": "a string matching the RegExp ^\\/" })),
746
+ "path": Schema.String.annotate({ "examples": ["/"] }).check(Schema.isPattern(/* @__PURE__ */ new RegExp("^\\/", "u")).annotate({ "expected": "a string matching the RegExp ^\\/" })),
639
747
  "expires": Schema.optionalKey(Schema.Number.annotate({ "description": "Unix timestamp in seconds. Omit for a session cookie." }).check(Schema.isFinite().annotate({ "expected": "a finite number" })).check(Schema.isGreaterThan(0).annotate({ "expected": "a value greater than 0" }))),
640
748
  "httpOnly": Schema.optionalKey(Schema.Boolean.annotate({ "default": false })),
641
749
  "secure": Schema.optionalKey(Schema.Boolean.annotate({ "default": false })),
@@ -651,53 +759,56 @@ const InitialIndexedDBIndex = Schema.Struct({
651
759
  "unique": Schema.Boolean,
652
760
  "multiEntry": Schema.Boolean
653
761
  }).annotate({ "identifier": "InitialIndexedDBIndex" });
654
- const ProxyConfig = Schema.Struct({
655
- "upstream": Schema.optionalKey(Schema.Literals([
656
- "direct",
657
- "proxy",
658
- "tunnel"
659
- ]).annotate({
660
- "description": "Upstream strategy for new connections. Defaults to `direct`.",
661
- "examples": ["tunnel"]
662
- })),
663
- "url": Schema.optionalKey(Schema.String.annotate({
664
- "description": "Generic upstream proxy URL (`http`, `https`, `socks`, `socks5`, `socks5h`). Required when `upstream` is `proxy`. Credentials go in the userinfo (`socks5://user:pass@host:1080`) and are sent as Basic `Proxy-Authorization` for `http`/`https` or RFC 1929 username/password for the socks schemes. An omitted port defaults to 1080 (socks), 80 (http) or 443 (https).",
665
- "examples": ["socks5://user:pass@proxy.example.com:1080"]
666
- })),
667
- "tunnel": Schema.optionalKey(ProxyTunnelConfig),
668
- "bypass": Schema.optionalKey(Schema.String.annotate({
669
- "description": "Extra `--proxy-bypass-list` entries. Loopback is always bypassed.",
670
- "examples": ["*.internal.example.com"]
671
- }))
762
+ const Recording = Schema.Struct({
763
+ "recordingId": Schema.String.annotate({
764
+ "description": "Stable recording identifier retained across target changes.",
765
+ "format": "uuid"
766
+ }),
767
+ "mode": Schema.Literals(["tab", "viewer"]).annotate({ "description": "Tab recordings stay on their specified top-level target; viewer recordings follow a live session client's selected top-level target and cannot be explicitly retargeted." }),
768
+ "targetId": Schema.String.annotate({ "description": "Identifier of the top-level target currently recorded." }),
769
+ "captureGeneration": Schema.Number.annotate({
770
+ "description": "Assignment generation for the current top-level target.",
771
+ "format": "int64"
772
+ }).check(Schema.isInt().annotate({ "expected": "an integer" })).check(Schema.isGreaterThanOrEqualTo(0).annotate({ "expected": "a value greater than or equal to 0" })),
773
+ "status": Schema.Literals([
774
+ "starting",
775
+ "running",
776
+ "stopped",
777
+ "failed"
778
+ ]),
779
+ "stopReason": Schema.optionalKey(Schema.String.annotate({ "description": "Lifecycle reason recorded after the recording stops or fails." })),
780
+ "relativePath": Schema.String.annotate({
781
+ "description": "Session file path below the session files root; host paths are never exposed.",
782
+ "examples": ["recordings/recording-550e8400-e29b-41d4-a716-446655440000.webm"]
783
+ }),
784
+ "startedAt": Schema.String.annotate({ "format": "date-time" }),
785
+ "stoppedAt": Schema.optionalKey(Schema.String.annotate({ "format": "date-time" })),
786
+ "sizeBytes": Schema.optionalKey(Schema.Number.annotate({ "format": "int64" }).check(Schema.isInt().annotate({ "expected": "an integer" })).check(Schema.isGreaterThanOrEqualTo(0).annotate({ "expected": "a value greater than or equal to 0" }))),
787
+ "fps": Schema.Number.check(Schema.isInt().annotate({ "expected": "an integer" })).check(Schema.isGreaterThanOrEqualTo(1).annotate({ "expected": "a value greater than or equal to 1" })),
788
+ "bitrateKbps": Schema.Number.check(Schema.isInt().annotate({ "expected": "an integer" })).check(Schema.isGreaterThanOrEqualTo(1).annotate({ "expected": "a value greater than or equal to 1" })),
789
+ "codec": Schema.Literals(["vp8", "h264-va"]),
790
+ "editing": Schema.Boolean.annotate({ "description": "Whether the edit a requested stop makes is still running. The raw video is already published; `editedRelativePath`, `timelineRelativePath` and `editError` are filled once this is false." }),
791
+ "editedRelativePath": Schema.optionalKey(Schema.String.annotate({ "description": "The edited H.264 video, published next to the raw one as `<name>.edited.mp4`, once a stop made it." })),
792
+ "timelineRelativePath": Schema.optionalKey(Schema.String.annotate({ "description": "What the recording's automation did and when, in the raw and edited video's time, published as `<name>.timeline.json`." })),
793
+ "editError": Schema.optionalKey(RecordingEditError)
672
794
  }).annotate({
673
- "description": "Session egress proxy assignment. Omitted for direct egress.",
674
- "identifier": "ProxyConfig"
795
+ "description": "One logical recording of a top-level target.",
796
+ "identifier": "Recording"
675
797
  });
676
- const UpdateProxyAssignment = Schema.Struct({
677
- "upstream": Schema.optionalKey(Schema.Literals([
678
- "direct",
679
- "proxy",
680
- "tunnel"
681
- ]).annotate({
682
- "description": "Upstream strategy for new connections. Defaults to `direct`.",
683
- "examples": ["tunnel"]
684
- })),
685
- "url": Schema.optionalKey(Schema.String.annotate({
686
- "description": "Generic upstream proxy URL (`http`, `https`, `socks`, `socks5`, `socks5h`). Required when `upstream` is `proxy`. Credentials go in the userinfo (`socks5://user:pass@host:1080`) and are sent as Basic `Proxy-Authorization` for `http`/`https` or RFC 1929 username/password for the socks schemes. An omitted port defaults to 1080 (socks), 80 (http) or 443 (https).",
687
- "examples": ["socks5://user:pass@proxy.example.com:1080"]
688
- })),
689
- "tunnel": Schema.optionalKey(ProxyTunnelConfig),
690
- "bypass": Schema.optionalKey(Schema.String.annotate({
691
- "description": "Extra `--proxy-bypass-list` entries. Loopback is always bypassed.",
692
- "examples": ["*.internal.example.com"]
693
- })),
694
- "drain": Schema.optionalKey(Schema.Boolean.annotate({
695
- "description": "Reset live tunnel streams instead of letting them drain. New connections use the new assignment either way.",
696
- "examples": [false]
697
- }))
798
+ const SessionFileEntry = Schema.Union([SessionFile, SessionDirectory], { mode: "oneOf" }).annotate({
799
+ "description": "A session file or directory, told apart by `type`.",
800
+ "identifier": "SessionFileEntry"
801
+ });
802
+ const TargetViewport = Schema.Struct({
803
+ "targetId": Schema.String,
804
+ "generation": Schema.Number.annotate({
805
+ "description": "Assignment generation of the target's media output.",
806
+ "format": "int64"
807
+ }).check(Schema.isInt().annotate({ "expected": "an integer" })).check(Schema.isGreaterThanOrEqualTo(0).annotate({ "expected": "a value greater than or equal to 0" })),
808
+ "viewport": Viewport
698
809
  }).annotate({
699
- "description": "Replacement session egress proxy assignment.",
700
- "identifier": "UpdateProxyAssignment"
810
+ "description": "Viewport applied to a top-level target.",
811
+ "identifier": "TargetViewport"
701
812
  });
702
813
  const TenantPage = Schema.Struct({
703
814
  "data": Schema.Array(Tenant),
@@ -782,7 +893,7 @@ const CreateAdminTokenInput = Schema.Union([Schema.Struct({
782
893
  "name": Schema.String.annotate({
783
894
  "description": "Operator-assigned name. Leading and trailing whitespace is removed.",
784
895
  "examples": ["platform admin"]
785
- }).check(Schema.isMinLength(1).annotate({ "expected": "a value with a length of at least 1" })).check(Schema.isPattern(/* @__PURE__ */ new RegExp(".*\\S.*")).annotate({ "expected": "a string matching the RegExp .*\\S.*" })),
896
+ }).check(Schema.isMinLength(1).annotate({ "expected": "a value with a length of at least 1" })).check(Schema.isPattern(/* @__PURE__ */ new RegExp(".*\\S.*", "u")).annotate({ "expected": "a string matching the RegExp .*\\S.*" })),
786
897
  "authorityType": Schema.Literal("system_admin"),
787
898
  "scopes": Schema.Array(Scope).annotate({
788
899
  "description": "Must include `system:admin`.",
@@ -802,7 +913,7 @@ const CreateAdminTokenInput = Schema.Union([Schema.Struct({
802
913
  "name": Schema.String.annotate({
803
914
  "description": "Operator-assigned name. Leading and trailing whitespace is removed.",
804
915
  "examples": ["tenant automation"]
805
- }).check(Schema.isMinLength(1).annotate({ "expected": "a value with a length of at least 1" })).check(Schema.isPattern(/* @__PURE__ */ new RegExp(".*\\S.*")).annotate({ "expected": "a string matching the RegExp .*\\S.*" })),
916
+ }).check(Schema.isMinLength(1).annotate({ "expected": "a value with a length of at least 1" })).check(Schema.isPattern(/* @__PURE__ */ new RegExp(".*\\S.*", "u")).annotate({ "expected": "a string matching the RegExp .*\\S.*" })),
806
917
  "authorityType": Schema.Literal("tenant"),
807
918
  "tenantId": Schema.suspend(() => UUIDv7).annotate({ "description": "Active tenant to bind permanently to the token." }),
808
919
  "scopes": Schema.Array(TenantScope).annotate({
@@ -824,7 +935,7 @@ const CreateTenantTokenInput = Schema.Struct({
824
935
  "name": Schema.String.annotate({
825
936
  "description": "Operator-assigned name. Leading and trailing whitespace is removed.",
826
937
  "examples": ["browser worker"]
827
- }).check(Schema.isMinLength(1).annotate({ "expected": "a value with a length of at least 1" })).check(Schema.isPattern(/* @__PURE__ */ new RegExp(".*\\S.*")).annotate({ "expected": "a string matching the RegExp .*\\S.*" })),
938
+ }).check(Schema.isMinLength(1).annotate({ "expected": "a value with a length of at least 1" })).check(Schema.isPattern(/* @__PURE__ */ new RegExp(".*\\S.*", "u")).annotate({ "expected": "a string matching the RegExp .*\\S.*" })),
828
939
  "scopes": Schema.Array(TenantScope).annotate({
829
940
  "description": "Tenant-compatible scopes. `system:admin` and `tenants:write` are rejected.",
830
941
  "examples": [["sessions:read", "sessions:write"]]
@@ -840,73 +951,70 @@ const CreateTenantTokenInput = Schema.Struct({
840
951
  "description": "Token definition automatically bound to the authenticated tenant.",
841
952
  "identifier": "CreateTenantTokenInput"
842
953
  });
843
- const Session = Schema.Struct({
844
- "id": Schema.suspend(() => UUIDv7).annotate({ "description": "Session identifier." }),
845
- "tenantId": Schema.suspend(() => UUIDv7).annotate({ "description": "Tenant that owns the session." }),
846
- "baseSnapshotName": Schema.optionalKey(Schema.String.annotate({
847
- "description": "Snapshot name used as the session base. Omitted for a blank session.",
848
- "examples": ["signed-in-base"]
849
- })),
850
- "label": Schema.optionalKey(Schema.String.annotate({
851
- "description": "Optional operator-facing session label.",
852
- "examples": ["checkout smoke test"]
853
- })),
854
- "status": SessionStatus,
855
- "browserChannel": Schema.optionalKey(Schema.String.annotate({
856
- "description": "Browser channel used to create and reopen the session.",
857
- "examples": ["chromium"]
858
- })),
859
- "media": SessionMedia,
860
- "createdAt": Schema.String.annotate({
861
- "description": "Time the session record was created.",
862
- "examples": ["2026-07-17T12:00:00Z"],
863
- "format": "date-time"
954
+ const LiveSessionFailure = Schema.Union([Error, LiveSessionErrorBody], { mode: "oneOf" }).annotate({
955
+ "description": "Failure of a live-session route.",
956
+ "identifier": "LiveSessionFailure"
957
+ });
958
+ const SessionMedia = Schema.Struct({
959
+ "mode": Schema.Literals(["auto", "cdp"]).annotate({
960
+ "description": "Configured media mode. `auto` enables deployment-selected media support; `cdp` exposes Chrome DevTools access only.",
961
+ "examples": ["auto"]
864
962
  }),
865
- "startedAt": Schema.optionalKey(Schema.String.annotate({
866
- "description": "Most recent successful browser start time. Omitted before startup succeeds.",
867
- "examples": ["2026-07-17T12:00:03Z"],
868
- "format": "date-time"
869
- })),
870
- "stoppedAt": Schema.optionalKey(Schema.String.annotate({
871
- "description": "Most recent browser stop time. Omitted while no stop has occurred.",
872
- "examples": ["2026-07-17T13:00:00Z"],
873
- "format": "date-time"
874
- })),
875
- "deletedAt": Schema.optionalKey(Schema.Union([Schema.String, Schema.Null]).annotate({
876
- "description": "Soft-deletion time, or `null` for a session that has not been deleted.",
877
- "examples": [null],
878
- "format": "date-time"
879
- })),
880
- "expiresAt": Schema.String.annotate({
881
- "description": "Retention deadline after which the session and its overlay may be purged. This is not token expiry.",
882
- "examples": ["2026-07-24T12:00:00Z"],
883
- "format": "date-time"
963
+ "webrtcProducer": Schema.Boolean.annotate({
964
+ "description": "Whether the compositor WebRTC producer is available for this session.",
965
+ "examples": [true]
884
966
  }),
885
- "lastConnectedAt": Schema.optionalKey(Schema.String.annotate({
886
- "description": "Most recent routed client activity time. Omitted until a client connects.",
887
- "examples": ["2026-07-17T12:30:00Z"],
888
- "format": "date-time"
889
- })),
890
- "suspendedAt": Schema.optionalKey(Schema.String.annotate({
891
- "description": "Most recent suspension time. Omitted unless the session is suspended.",
892
- "examples": ["2026-07-17T13:00:00Z"],
893
- "format": "date-time"
894
- })),
895
- "tags": Schema.optionalKey(Schema.suspend(() => StringMap).annotate({ "description": "Session metadata tags. Omitted when no tags are set." })),
896
- "cdpUrl": Schema.optionalKey(Schema.String.annotate({
897
- "description": "Authenticated Chrome DevTools endpoint. Omitted when the session is not currently routable. Use it with `sessionToken`.",
898
- "examples": ["https://aperture.example.com/cdp/019f6cf0-0000-7000-8000-000000000010"],
899
- "format": "uri"
967
+ "iceServers": Schema.optionalKey(Schema.Array(IceServer).annotate({ "description": "ICE configuration for WebRTC setup. Omitted when WebRTC is unavailable or does not need configured ICE servers." }))
968
+ }).annotate({
969
+ "description": "Media capabilities currently available for the session.",
970
+ "identifier": "SessionMedia"
971
+ });
972
+ const InitialTargetStorageOrigin = Schema.Struct({
973
+ "origin": Schema.String.annotate({ "format": "uri" }).check(Schema.isPattern(/* @__PURE__ */ new RegExp("^https?:\\/\\/[^/]+$", "u")).annotate({ "expected": "a string matching the RegExp ^https?:\\/\\/[^/]+$" })),
974
+ "entries": Schema.Array(BrowserStorageEntry)
975
+ }).annotate({ "identifier": "InitialTargetStorageOrigin" });
976
+ const ProxyConfig = Schema.Struct({
977
+ "upstreams": Schema.optionalKey(Schema.Record(Schema.String, ProxyUpstream).annotate({ "description": "Upstreams by name. Names use lowercase letters, digits and dashes; `direct`, `refuse` and `local` are reserved." })),
978
+ "rules": Schema.optionalKey(Schema.Array(ProxyRule).check(Schema.isMaxLength(256).annotate({ "expected": "a value with a length of at most 256" }))),
979
+ "upstream": Schema.optionalKey(Schema.Literals([
980
+ "direct",
981
+ "proxy",
982
+ "tunnel"
983
+ ]).annotate({
984
+ "description": "Legacy single-upstream shape; use `upstreams` and `rules`. Cannot be combined with them. `proxy` becomes a final `*` rule via `url`, `tunnel` a `tunnel` upstream and a final `*` rule via it, each preceded by `direct` rules for the `bypass` entries. `direct` or omitted means no rules.",
985
+ "examples": ["tunnel"]
900
986
  })),
901
- "sessionToken": Schema.optionalKey(Schema.String.annotate({
902
- "description": "Session access secret returned when live access credentials are available. Rotation invalidates the previous token immediately.",
903
- "examples": ["aps_019f6cf0000070008000000000000010_REDACTED"]
987
+ "url": Schema.optionalKey(Schema.String.annotate({
988
+ "description": "Legacy upstream proxy URL, required with `upstream` `proxy`. Use `upstreams` and `rules`.",
989
+ "examples": ["socks5://user:pass@proxy.example.com:1080"]
904
990
  })),
905
- "collaboration": Schema.optionalKey(SessionCollaborationCapabilities),
906
- "proxy": Schema.optionalKey(SessionProxy)
991
+ "tunnel": Schema.optionalKey(ProxyTunnelConfig),
992
+ "bypass": Schema.optionalKey(Schema.String.annotate({
993
+ "description": "Legacy hosts to send direct, separated by `;` or `,`. Each entry must be a valid rule `match`; a leading `.` means any subdomain. CIDR ranges, `<local>` and scheme prefixes are rejected. Use `upstreams` and `rules`.",
994
+ "examples": ["*.internal.example.com"]
995
+ }))
907
996
  }).annotate({
908
- "description": "Browser session state, retention metadata, tags, and currently available access credentials.",
909
- "identifier": "Session"
997
+ "description": "Session egress proxy configuration. Rules are checked in order and the first match routes the connection; unmatched connections go direct, and unmatched `localhost` stays on the session host. Omitted for direct egress.",
998
+ "identifier": "ProxyConfig"
999
+ });
1000
+ const UpdateProxyConfig = Schema.Struct({
1001
+ "upstreams": Schema.optionalKey(Schema.Record(Schema.String, ProxyUpstream)),
1002
+ "rules": Schema.optionalKey(Schema.Array(ProxyRule).check(Schema.isMaxLength(256).annotate({ "expected": "a value with a length of at most 256" }))),
1003
+ "upstream": Schema.optionalKey(Schema.Literals([
1004
+ "direct",
1005
+ "proxy",
1006
+ "tunnel"
1007
+ ]).annotate({ "description": "Legacy single-upstream shape; use `upstreams` and `rules`." })),
1008
+ "url": Schema.optionalKey(Schema.String.annotate({ "description": "Legacy upstream proxy URL; use `upstreams` and `rules`." })),
1009
+ "tunnel": Schema.optionalKey(ProxyTunnelConfig),
1010
+ "bypass": Schema.optionalKey(Schema.String.annotate({ "description": "Legacy hosts to send direct; use `upstreams` and `rules`." })),
1011
+ "drain": Schema.optionalKey(Schema.Boolean.annotate({
1012
+ "description": "Reset live tunnel streams instead of letting them drain. New connections use the new rules either way.",
1013
+ "examples": [false]
1014
+ }))
1015
+ }).annotate({
1016
+ "description": "Replacement session egress proxy configuration. Fields other than `drain` are as in `ProxyConfig`.",
1017
+ "identifier": "UpdateProxyConfig"
910
1018
  });
911
1019
  const InitialCacheStorageCache = Schema.Struct({
912
1020
  "name": Schema.String,
@@ -925,14 +1033,14 @@ const SnapshotPage = Schema.Struct({
925
1033
  });
926
1034
  const InitialBrowserControlState = Schema.Struct({
927
1035
  "locator": InitialBrowserElementLocator,
928
- "value": Schema.String,
1036
+ "value": SensitiveString,
929
1037
  "checked": Schema.optionalKey(Schema.Boolean),
930
1038
  "selectedIndices": Schema.optionalKey(Schema.Array(Schema.Number.check(Schema.isInt().annotate({ "expected": "an integer" })).check(Schema.isGreaterThanOrEqualTo(0).annotate({ "expected": "a value greater than or equal to 0" })))),
931
1039
  "selection": Schema.optionalKey(InitialBrowserControlSelection)
932
1040
  }).annotate({ "identifier": "InitialBrowserControlState" });
933
1041
  const InitialBrowserContentEditableState = Schema.Struct({
934
1042
  "locator": InitialBrowserElementLocator,
935
- "html": Schema.String
1043
+ "html": SensitiveString
936
1044
  }).annotate({ "identifier": "InitialBrowserContentEditableState" });
937
1045
  const InitialBrowserElementScrollPosition = Schema.Struct({
938
1046
  "locator": InitialBrowserElementLocator,
@@ -968,7 +1076,7 @@ const TokenPage = Schema.Struct({
968
1076
  });
969
1077
  const CreateTokenResponse = Schema.Struct({
970
1078
  "token": Token,
971
- "rawToken": Schema.String.annotate({
1079
+ "rawToken": Schema.suspend(() => SensitiveString).annotate({
972
1080
  "description": "One-time Aperture API bearer token. Store it immediately; later reads return only token metadata.",
973
1081
  "examples": ["apt_019f6cf0000070008000000000000002_REDACTED"]
974
1082
  })
@@ -976,6 +1084,84 @@ const CreateTokenResponse = Schema.Struct({
976
1084
  "description": "Created token metadata and its one-time bearer secret.",
977
1085
  "identifier": "CreateTokenResponse"
978
1086
  });
1087
+ const Session = Schema.Struct({
1088
+ "id": Schema.suspend(() => UUIDv7).annotate({ "description": "Session identifier." }),
1089
+ "tenantId": Schema.suspend(() => UUIDv7).annotate({ "description": "Tenant that owns the session." }),
1090
+ "baseSnapshotName": Schema.optionalKey(Schema.String.annotate({
1091
+ "description": "Snapshot name used as the session base. Omitted for a blank session.",
1092
+ "examples": ["signed-in-base"]
1093
+ })),
1094
+ "label": Schema.optionalKey(Schema.String.annotate({
1095
+ "description": "Optional operator-facing session label.",
1096
+ "examples": ["checkout smoke test"]
1097
+ })),
1098
+ "status": SessionStatus,
1099
+ "browserChannel": Schema.optionalKey(Schema.String.annotate({
1100
+ "description": "Browser channel used to create and reopen the session.",
1101
+ "examples": ["chromium"]
1102
+ })),
1103
+ "media": SessionMedia,
1104
+ "createdAt": Schema.String.annotate({
1105
+ "description": "Time the session record was created.",
1106
+ "examples": ["2026-07-17T12:00:00Z"],
1107
+ "format": "date-time"
1108
+ }),
1109
+ "startedAt": Schema.optionalKey(Schema.String.annotate({
1110
+ "description": "Most recent successful browser start time. Omitted before startup succeeds.",
1111
+ "examples": ["2026-07-17T12:00:03Z"],
1112
+ "format": "date-time"
1113
+ })),
1114
+ "stoppedAt": Schema.optionalKey(Schema.String.annotate({
1115
+ "description": "Most recent browser stop time. Omitted while no stop has occurred.",
1116
+ "examples": ["2026-07-17T13:00:00Z"],
1117
+ "format": "date-time"
1118
+ })),
1119
+ "deletedAt": Schema.optionalKey(Schema.Union([Schema.String, Schema.Null]).annotate({
1120
+ "description": "Soft-deletion time, or `null` for a session that has not been deleted.",
1121
+ "examples": [null],
1122
+ "format": "date-time"
1123
+ })),
1124
+ "expiresAt": Schema.String.annotate({
1125
+ "description": "Retention deadline after which the session and its overlay may be purged. This is not token expiry.",
1126
+ "examples": ["2026-07-24T12:00:00Z"],
1127
+ "format": "date-time"
1128
+ }),
1129
+ "lastConnectedAt": Schema.optionalKey(Schema.String.annotate({
1130
+ "description": "Most recent routed client activity time. Omitted until a client connects.",
1131
+ "examples": ["2026-07-17T12:30:00Z"],
1132
+ "format": "date-time"
1133
+ })),
1134
+ "suspendedAt": Schema.optionalKey(Schema.String.annotate({
1135
+ "description": "Most recent suspension time. Omitted unless the session is suspended.",
1136
+ "examples": ["2026-07-17T13:00:00Z"],
1137
+ "format": "date-time"
1138
+ })),
1139
+ "tags": Schema.optionalKey(Schema.suspend(() => StringMap).annotate({ "description": "Session metadata tags. Omitted when no tags are set." })),
1140
+ "cdpUrl": Schema.optionalKey(Schema.String.annotate({
1141
+ "description": "Authenticated Chrome DevTools endpoint. Omitted when the session is not currently routable. Use it with `sessionToken`.",
1142
+ "examples": ["https://aperture.example.com/cdp/019f6cf0-0000-7000-8000-000000000010"],
1143
+ "format": "uri"
1144
+ })),
1145
+ "sessionToken": Schema.optionalKey(Schema.suspend(() => SensitiveString).annotate({
1146
+ "description": "Session access secret returned when live access credentials are available. Rotation invalidates the previous token immediately.",
1147
+ "examples": ["aps_019f6cf0000070008000000000000010_REDACTED"]
1148
+ })),
1149
+ "collaboration": Schema.optionalKey(SessionCollaborationCapabilities),
1150
+ "thumbnail": Schema.optionalKey(SessionThumbnail),
1151
+ "proxy": Schema.optionalKey(SessionProxy)
1152
+ }).annotate({
1153
+ "description": "Browser session state, retention metadata, tags, and currently available access credentials.",
1154
+ "identifier": "Session"
1155
+ });
1156
+ const InitialBrowserDocumentSelection = Schema.Struct({
1157
+ "anchor": InitialBrowserSelectionEndpoint,
1158
+ "focus": InitialBrowserSelectionEndpoint
1159
+ }).annotate({ "identifier": "InitialBrowserDocumentSelection" });
1160
+ const InitialIndexedDBDatabase = Schema.Struct({
1161
+ "name": Schema.String,
1162
+ "version": Schema.Number.check(Schema.isInt().annotate({ "expected": "an integer" })).check(Schema.isGreaterThanOrEqualTo(1).annotate({ "expected": "a value greater than or equal to 1" })),
1163
+ "objectStores": Schema.Array(InitialIndexedDBObjectStore)
1164
+ }).annotate({ "identifier": "InitialIndexedDBDatabase" });
979
1165
  const SessionPage = Schema.Struct({
980
1166
  "data": Schema.Array(Session),
981
1167
  "meta": PageMeta
@@ -990,7 +1176,7 @@ const CreateSessionResult = Schema.Struct({
990
1176
  "examples": ["https://aperture.example.com/cdp/019f6cf0-0000-7000-8000-000000000010"],
991
1177
  "format": "uri"
992
1178
  }),
993
- "sessionToken": Schema.String.annotate({
1179
+ "sessionToken": Schema.suspend(() => SensitiveString).annotate({
994
1180
  "description": "Initial session access secret. Store it immediately.",
995
1181
  "examples": ["aps_019f6cf0000070008000000000000010_REDACTED"]
996
1182
  })
@@ -1009,7 +1195,7 @@ const SessionMutation = Schema.Struct({
1009
1195
  "examples": ["https://aperture.example.com/cdp/019f6cf0-0000-7000-8000-000000000010"],
1010
1196
  "format": "uri"
1011
1197
  })),
1012
- "sessionToken": Schema.optionalKey(Schema.String.annotate({
1198
+ "sessionToken": Schema.optionalKey(Schema.suspend(() => SensitiveString).annotate({
1013
1199
  "description": "Current raw session access secret. Omitted by operations that do not expose or replace credentials.",
1014
1200
  "examples": ["aps_019f6cf0000070008000000000000010_REDACTED"]
1015
1201
  }))
@@ -1017,19 +1203,10 @@ const SessionMutation = Schema.Struct({
1017
1203
  "description": "Updated session and operation-specific live access credentials when available.",
1018
1204
  "identifier": "SessionMutation"
1019
1205
  });
1020
- const InitialBrowserDocumentSelection = Schema.Struct({
1021
- "anchor": InitialBrowserSelectionEndpoint,
1022
- "focus": InitialBrowserSelectionEndpoint
1023
- }).annotate({ "identifier": "InitialBrowserDocumentSelection" });
1024
- const InitialIndexedDBDatabase = Schema.Struct({
1025
- "name": Schema.String,
1026
- "version": Schema.Number.check(Schema.isInt().annotate({ "expected": "an integer" })).check(Schema.isGreaterThanOrEqualTo(1).annotate({ "expected": "a value greater than or equal to 1" })),
1027
- "objectStores": Schema.Array(InitialIndexedDBObjectStore)
1028
- }).annotate({ "identifier": "InitialIndexedDBDatabase" });
1029
1206
  const InitialBrowserDocumentState = Schema.Struct({
1030
1207
  "version": Schema.Literal(1),
1031
- "windowName": Schema.optionalKey(Schema.String),
1032
- "historyState": Schema.optionalKey(Schema.String.annotate({ "description": "JSON-encoded structured-clone history state." })),
1208
+ "windowName": Schema.optionalKey(SensitiveString),
1209
+ "historyState": Schema.optionalKey(Schema.suspend(() => SensitiveString).annotate({ "description": "JSON-encoded structured-clone history state." })),
1033
1210
  "controls": Schema.Array(InitialBrowserControlState).check(Schema.isMaxLength(1e4).annotate({ "expected": "a value with a length of at most 10000" })),
1034
1211
  "contentEditables": Schema.Array(InitialBrowserContentEditableState).check(Schema.isMaxLength(1e4).annotate({ "expected": "a value with a length of at most 10000" })),
1035
1212
  "scrollPositions": Schema.Array(InitialBrowserElementScrollPosition).check(Schema.isMaxLength(1e4).annotate({ "expected": "a value with a length of at most 10000" })),
@@ -1043,8 +1220,8 @@ const InitialStorageOrigin = Schema.Struct({
1043
1220
  "origin": Schema.String.annotate({
1044
1221
  "examples": ["https://example.com"],
1045
1222
  "format": "uri"
1046
- }).check(Schema.isPattern(/* @__PURE__ */ new RegExp("^https?:\\/\\/[^/]+$")).annotate({ "expected": "a string matching the RegExp ^https?:\\/\\/[^/]+$" })),
1047
- "ancestorOrigins": Schema.optionalKey(Schema.Array(Schema.String.annotate({ "format": "uri" }).check(Schema.isPattern(/* @__PURE__ */ new RegExp("^https?:\\/\\/[^/]+$")).annotate({ "expected": "a string matching the RegExp ^https?:\\/\\/[^/]+$" }))).annotate({ "description": "Top-down HTTP origin chain for partitioned storage. Omitted for a top-level origin." }).check(Schema.isMaxLength(32).annotate({ "expected": "a value with a length of at most 32" }))),
1223
+ }).check(Schema.isPattern(/* @__PURE__ */ new RegExp("^https?:\\/\\/[^/]+$", "u")).annotate({ "expected": "a string matching the RegExp ^https?:\\/\\/[^/]+$" })),
1224
+ "ancestorOrigins": Schema.optionalKey(Schema.Array(Schema.String.annotate({ "format": "uri" }).check(Schema.isPattern(/* @__PURE__ */ new RegExp("^https?:\\/\\/[^/]+$", "u")).annotate({ "expected": "a string matching the RegExp ^https?:\\/\\/[^/]+$" }))).annotate({ "description": "Top-down HTTP origin chain for partitioned storage. Omitted for a top-level origin." }).check(Schema.isMaxLength(32).annotate({ "expected": "a value with a length of at most 32" }))),
1048
1225
  "localStorage": Schema.Array(BrowserStorageEntry),
1049
1226
  "indexedDB": Schema.optionalKey(Schema.Array(InitialIndexedDBDatabase)),
1050
1227
  "cacheStorage": Schema.optionalKey(Schema.Array(InitialCacheStorageCache)),
@@ -1058,7 +1235,7 @@ const InitialBrowserTarget = Schema.Struct({
1058
1235
  "description": "Absolute HTTP or HTTPS URL without embedded credentials.",
1059
1236
  "examples": ["https://example.com/account"],
1060
1237
  "format": "uri"
1061
- }).check(Schema.isPattern(/* @__PURE__ */ new RegExp("^https?:\\/\\/")).annotate({ "expected": "a string matching the RegExp ^https?:\\/\\/" })),
1238
+ }).check(Schema.isPattern(/* @__PURE__ */ new RegExp("^https?:\\/\\/", "u")).annotate({ "expected": "a string matching the RegExp ^https?:\\/\\/" })),
1062
1239
  "sessionStorage": Schema.optionalKey(Schema.Array(InitialTargetStorageOrigin).annotate({ "description": "Per-origin session storage installed in target frames before page scripts execute." })),
1063
1240
  "scroll": Schema.optionalKey(InitialBrowserScrollPosition),
1064
1241
  "documentState": Schema.optionalKey(InitialBrowserDocumentState),
@@ -1133,7 +1310,8 @@ const ListTenantsParams = Schema.Struct({
1133
1310
  "deleted",
1134
1311
  "all"
1135
1312
  ]).annotate({ "default": "active" })),
1136
- "includeDeleted": Schema.optionalKey(Schema.Boolean.annotate({ "default": false }))
1313
+ "includeDeleted": Schema.optionalKey(Schema.Boolean.annotate({ "default": false })),
1314
+ "query": Schema.optionalKey(Schema.String)
1137
1315
  });
1138
1316
  const ListTenants200 = TenantPage;
1139
1317
  const ListTenantsdefault = Error;
@@ -1240,6 +1418,7 @@ const ListSessionsParams = Schema.Struct({
1240
1418
  "cursor": Schema.optionalKey(Schema.String),
1241
1419
  "includeDeleted": Schema.optionalKey(Schema.Boolean.annotate({ "default": false })),
1242
1420
  "status": Schema.optionalKey(SessionStatus),
1421
+ "query": Schema.optionalKey(Schema.String),
1243
1422
  "tagKey": Schema.optionalKey(Schema.Array(Schema.String.check(Schema.isMinLength(1).annotate({ "expected": "a value with a length of at least 1" })))),
1244
1423
  "tagValue": Schema.optionalKey(Schema.Array(Schema.String.check(Schema.isMinLength(1).annotate({ "expected": "a value with a length of at least 1" })))),
1245
1424
  "tagOperator": Schema.optionalKey(Schema.Array(Schema.Literals([
@@ -1273,7 +1452,7 @@ const ReplaceSessionTagsRequestJson = ReplaceTagsInput;
1273
1452
  const ReplaceSessionTags200 = SessionMutation;
1274
1453
  const ReplaceSessionTagsdefault = Error;
1275
1454
  const UpdateSessionProxyParams = Schema.Struct({ "X-Aperture-Tenant-Id": Schema.optionalKey(UUIDv7) });
1276
- const UpdateSessionProxyRequestJson = UpdateProxyAssignment;
1455
+ const UpdateSessionProxyRequestJson = UpdateProxyConfig;
1277
1456
  const UpdateSessionProxy200 = SessionMutation;
1278
1457
  const UpdateSessionProxydefault = Error;
1279
1458
  const SuspendSessionParams = Schema.Struct({ "X-Aperture-Tenant-Id": Schema.optionalKey(UUIDv7) });
@@ -1295,6 +1474,14 @@ const SetSessionCursorParams = Schema.Struct({ "X-Aperture-Tenant-Id": Schema.op
1295
1474
  const SetSessionCursorRequestJson = CursorVisibility;
1296
1475
  const SetSessionCursor200 = CursorVisibility;
1297
1476
  const SetSessionCursordefault = Error;
1477
+ const GetSessionThumbnailParams = Schema.Struct({ "X-Aperture-Tenant-Id": Schema.optionalKey(UUIDv7) });
1478
+ const GetSessionThumbnaildefault = Error;
1479
+ const GetSessionTargetThumbnailParams = Schema.Struct({ "X-Aperture-Tenant-Id": Schema.optionalKey(UUIDv7) });
1480
+ const GetSessionTargetThumbnaildefault = Error;
1481
+ const ExportSessionStorageStateParams = Schema.Struct({ "X-Aperture-Tenant-Id": Schema.optionalKey(UUIDv7) });
1482
+ const ExportSessionStorageStateRequestJson = ExportSessionStorageStateInput;
1483
+ const ExportSessionStorageState200 = InitialBrowserStorageState;
1484
+ const ExportSessionStorageStatedefault = Error;
1298
1485
  const ListSessionRecordingsParams = Schema.Struct({ "X-Aperture-Tenant-Id": Schema.optionalKey(UUIDv7) });
1299
1486
  const ListSessionRecordings200 = Schema.Array(Recording);
1300
1487
  const ListSessionRecordingsdefault = Error;
@@ -1310,8 +1497,32 @@ const RetargetSessionRecordingRequestJson = RetargetSessionRecordingInput;
1310
1497
  const RetargetSessionRecording200 = Recording;
1311
1498
  const RetargetSessionRecordingdefault = Error;
1312
1499
  const StopSessionRecordingParams = Schema.Struct({ "X-Aperture-Tenant-Id": Schema.optionalKey(UUIDv7) });
1313
- const StopSessionRecording200 = SessionFile;
1500
+ const StopSessionRecording200 = Recording;
1314
1501
  const StopSessionRecordingdefault = Error;
1502
+ const ListSessionFilesParams = Schema.Struct({ "X-Aperture-Tenant-Id": Schema.optionalKey(UUIDv7) });
1503
+ const ListSessionFiles200 = Schema.Array(SessionFileEntry);
1504
+ const ListSessionFilesdefault = Error;
1505
+ const UploadSessionFilesParams = Schema.Struct({
1506
+ "X-Aperture-Tenant-Id": Schema.optionalKey(UUIDv7),
1507
+ "directory": Schema.optionalKey(Schema.String.annotate({ "default": "uploads" }))
1508
+ });
1509
+ const UploadSessionFilesRequestFormData = Schema.Struct({ "files": Schema.optionalKey(Schema.Array(__ClientMultipartFile)) });
1510
+ const UploadSessionFiles201 = Schema.Struct({ "files": Schema.Array(SessionFile) }).annotate({ "description": "Files stored by this request, in request order." });
1511
+ const UploadSessionFilesdefault = Error;
1512
+ const DeleteSessionFileParams = Schema.Struct({
1513
+ "X-Aperture-Tenant-Id": Schema.optionalKey(UUIDv7),
1514
+ "relativePath": Schema.String.check(Schema.isMinLength(1).annotate({ "expected": "a value with a length of at least 1" })),
1515
+ "recursive": Schema.optionalKey(Schema.Boolean.annotate({ "default": false }))
1516
+ });
1517
+ const DeleteSessionFiledefault = Error;
1518
+ const MoveSessionFileParams = Schema.Struct({ "X-Aperture-Tenant-Id": Schema.optionalKey(UUIDv7) });
1519
+ const MoveSessionFileRequestJson = MoveSessionFileInput;
1520
+ const MoveSessionFile200 = SessionFileEntry;
1521
+ const MoveSessionFiledefault = Error;
1522
+ const CreateSessionDirectoryParams = Schema.Struct({ "X-Aperture-Tenant-Id": Schema.optionalKey(UUIDv7) });
1523
+ const CreateSessionDirectoryRequestJson = CreateSessionDirectoryInput;
1524
+ const CreateSessionDirectory201 = SessionDirectory;
1525
+ const CreateSessionDirectorydefault = Error;
1315
1526
  const CreateSessionFileDownloadURLParams = Schema.Struct({ "X-Aperture-Tenant-Id": Schema.optionalKey(UUIDv7) });
1316
1527
  const CreateSessionFileDownloadURLRequestJson = SessionFileDownloadURLInput;
1317
1528
  const CreateSessionFileDownloadURL200 = SessionFileDownloadURL;
@@ -1365,6 +1576,14 @@ const ListEventsParams = Schema.Struct({
1365
1576
  });
1366
1577
  const ListEvents200 = EventPage;
1367
1578
  const ListEventsdefault = Error;
1579
+ const UploadLiveSessionFilesParams = Schema.Struct({ "X-Aperture-Tenant-Id": Schema.optionalKey(UUIDv7) });
1580
+ const UploadLiveSessionFilesRequestFormData = Schema.Struct({ "files": Schema.optionalKey(Schema.Array(__ClientMultipartFile)) });
1581
+ const UploadLiveSessionFiles201 = Schema.Struct({ "files": Schema.Array(SessionFile) }).annotate({ "description": "Files stored by this request, in request order." });
1582
+ const UploadLiveSessionFilesdefault = LiveSessionFailure;
1583
+ const SetSessionViewportParams = Schema.Struct({ "X-Aperture-Tenant-Id": Schema.optionalKey(UUIDv7) });
1584
+ const SetSessionViewportRequestJson = SetViewportInput;
1585
+ const SetSessionViewport200 = TargetViewport;
1586
+ const SetSessionViewportdefault = LiveSessionFailure;
1368
1587
  const make = (httpClient, options = {}) => {
1369
1588
  const unexpectedStatus = (response) => Effect.flatMap(Effect.orElseSucceed(response.json, () => "Unexpected status code"), (description) => Effect.fail(new HttpClientError.HttpClientError({ reason: new HttpClientError.StatusCodeError({
1370
1589
  request: response.request,
@@ -1392,6 +1611,9 @@ const make = (httpClient, options = {}) => {
1392
1611
  if (path.split("/").some((segment) => /^(?:\.|%2e){1,2}$/i.test(segment))) return fail("Request paths cannot contain dot segments");
1393
1612
  return Effect.succeed(method(path));
1394
1613
  });
1614
+ const executeStreamRequest = (request) => Effect.suspend(() => options.transformClient ? Effect.flatMap(options.transformClient(httpClient), (client) => HttpClient.filterStatusOk(client).execute(request)) : HttpClient.filterStatusOk(httpClient).execute(request));
1615
+ const decodeBinary = (response) => Effect.map(response.arrayBuffer, (buffer) => new Uint8Array(buffer));
1616
+ const binaryRequest = (request) => executeStreamRequest(request).pipe(Effect.map((response) => response.stream), Stream.unwrap);
1395
1617
  const decodeSuccess = (schema) => (response) => HttpClientResponse.schemaBodyJson(schema)(response);
1396
1618
  return {
1397
1619
  httpClient,
@@ -1411,7 +1633,8 @@ const make = (httpClient, options = {}) => {
1411
1633
  "limit": options?.params?.["limit"],
1412
1634
  "cursor": options?.params?.["cursor"],
1413
1635
  "deleted": options?.params?.["deleted"],
1414
- "includeDeleted": options?.params?.["includeDeleted"]
1636
+ "includeDeleted": options?.params?.["includeDeleted"],
1637
+ "query": options?.params?.["query"]
1415
1638
  }), withResponse(options?.config)(HttpClientResponse.matchStatus({
1416
1639
  "2xx": decodeSuccess(ListTenants200),
1417
1640
  orElse: unexpectedStatus
@@ -1548,6 +1771,7 @@ const make = (httpClient, options = {}) => {
1548
1771
  "cursor": options?.params?.["cursor"],
1549
1772
  "includeDeleted": options?.params?.["includeDeleted"],
1550
1773
  "status": options?.params?.["status"],
1774
+ "query": options?.params?.["query"],
1551
1775
  "tagKey": options?.params?.["tagKey"],
1552
1776
  "tagValue": options?.params?.["tagValue"],
1553
1777
  "tagOperator": options?.params?.["tagOperator"]
@@ -1603,6 +1827,22 @@ const make = (httpClient, options = {}) => {
1603
1827
  "2xx": decodeSuccess(SetSessionCursor200),
1604
1828
  orElse: unexpectedStatus
1605
1829
  }))))),
1830
+ "getSessionThumbnail": (sessionId, options) => __makePathRequest(HttpClientRequest.get, [sessionId], () => "/api/sessions/" + __encodePathParam(sessionId) + "/thumbnail").pipe(Effect.flatMap((request) => request.pipe(HttpClientRequest.setHeaders({ "X-Aperture-Tenant-Id": options?.params?.["X-Aperture-Tenant-Id"] ?? void 0 }), withResponse(options?.config)(HttpClientResponse.matchStatus({
1831
+ "2xx": decodeSuccess(GetSessionThumbnaildefault),
1832
+ "200": decodeBinary,
1833
+ orElse: unexpectedStatus
1834
+ }))))),
1835
+ "getSessionThumbnailStream": (sessionId, options) => Stream.unwrap(__makePathRequest(HttpClientRequest.get, [sessionId], () => "/api/sessions/" + __encodePathParam(sessionId) + "/thumbnail").pipe(Effect.map((request) => request.pipe(HttpClientRequest.setHeaders({ "X-Aperture-Tenant-Id": options?.params?.["X-Aperture-Tenant-Id"] ?? void 0 }), binaryRequest)))),
1836
+ "getSessionTargetThumbnail": (sessionId, targetId, options) => __makePathRequest(HttpClientRequest.get, [sessionId, targetId], () => "/api/sessions/" + __encodePathParam(sessionId) + "/targets/" + __encodePathParam(targetId) + "/thumbnail").pipe(Effect.flatMap((request) => request.pipe(HttpClientRequest.setHeaders({ "X-Aperture-Tenant-Id": options?.params?.["X-Aperture-Tenant-Id"] ?? void 0 }), withResponse(options?.config)(HttpClientResponse.matchStatus({
1837
+ "2xx": decodeSuccess(GetSessionTargetThumbnaildefault),
1838
+ "200": decodeBinary,
1839
+ orElse: unexpectedStatus
1840
+ }))))),
1841
+ "getSessionTargetThumbnailStream": (sessionId, targetId, options) => Stream.unwrap(__makePathRequest(HttpClientRequest.get, [sessionId, targetId], () => "/api/sessions/" + __encodePathParam(sessionId) + "/targets/" + __encodePathParam(targetId) + "/thumbnail").pipe(Effect.map((request) => request.pipe(HttpClientRequest.setHeaders({ "X-Aperture-Tenant-Id": options?.params?.["X-Aperture-Tenant-Id"] ?? void 0 }), binaryRequest)))),
1842
+ "exportSessionStorageState": (sessionId, options) => __makePathRequest(HttpClientRequest.post, [sessionId], () => "/api/sessions/" + __encodePathParam(sessionId) + "/storage-state").pipe(Effect.flatMap((request) => request.pipe(HttpClientRequest.setHeaders({ "X-Aperture-Tenant-Id": options.params?.["X-Aperture-Tenant-Id"] ?? void 0 }), HttpClientRequest.bodyJsonUnsafe(options.payload), withResponse(options.config)(HttpClientResponse.matchStatus({
1843
+ "2xx": decodeSuccess(ExportSessionStorageState200),
1844
+ orElse: unexpectedStatus
1845
+ }))))),
1606
1846
  "listSessionRecordings": (sessionId, options) => __makePathRequest(HttpClientRequest.get, [sessionId], () => "/api/sessions/" + __encodePathParam(sessionId) + "/recordings").pipe(Effect.flatMap((request) => request.pipe(HttpClientRequest.setHeaders({ "X-Aperture-Tenant-Id": options?.params?.["X-Aperture-Tenant-Id"] ?? void 0 }), withResponse(options?.config)(HttpClientResponse.matchStatus({
1607
1847
  "2xx": decodeSuccess(ListSessionRecordings200),
1608
1848
  orElse: unexpectedStatus
@@ -1623,6 +1863,30 @@ const make = (httpClient, options = {}) => {
1623
1863
  "2xx": decodeSuccess(StopSessionRecording200),
1624
1864
  orElse: unexpectedStatus
1625
1865
  }))))),
1866
+ "listSessionFiles": (sessionId, options) => __makePathRequest(HttpClientRequest.get, [sessionId], () => "/api/sessions/" + __encodePathParam(sessionId) + "/files").pipe(Effect.flatMap((request) => request.pipe(HttpClientRequest.setHeaders({ "X-Aperture-Tenant-Id": options?.params?.["X-Aperture-Tenant-Id"] ?? void 0 }), withResponse(options?.config)(HttpClientResponse.matchStatus({
1867
+ "2xx": decodeSuccess(ListSessionFiles200),
1868
+ orElse: unexpectedStatus
1869
+ }))))),
1870
+ "uploadSessionFiles": (sessionId, options) => __makePathRequest(HttpClientRequest.post, [sessionId], () => "/api/sessions/" + __encodePathParam(sessionId) + "/files").pipe(Effect.flatMap((request) => request.pipe(HttpClientRequest.setUrlParams({ "directory": options.params?.["directory"] }), HttpClientRequest.setHeaders({ "X-Aperture-Tenant-Id": options.params?.["X-Aperture-Tenant-Id"] ?? void 0 }), HttpClientRequest.bodyFormDataRecord(options.payload), withResponse(options.config)(HttpClientResponse.matchStatus({
1871
+ "2xx": decodeSuccess(UploadSessionFiles201),
1872
+ orElse: unexpectedStatus
1873
+ }))))),
1874
+ "deleteSessionFile": (sessionId, options) => __makePathRequest(HttpClientRequest.delete, [sessionId], () => "/api/sessions/" + __encodePathParam(sessionId) + "/files").pipe(Effect.flatMap((request) => request.pipe(HttpClientRequest.setUrlParams({
1875
+ "relativePath": options.params["relativePath"],
1876
+ "recursive": options.params["recursive"]
1877
+ }), HttpClientRequest.setHeaders({ "X-Aperture-Tenant-Id": options.params["X-Aperture-Tenant-Id"] ?? void 0 }), withResponse(options.config)(HttpClientResponse.matchStatus({
1878
+ "2xx": decodeSuccess(DeleteSessionFiledefault),
1879
+ "204": () => Effect.void,
1880
+ orElse: unexpectedStatus
1881
+ }))))),
1882
+ "moveSessionFile": (sessionId, options) => __makePathRequest(HttpClientRequest.post, [sessionId], () => "/api/sessions/" + __encodePathParam(sessionId) + "/files/move").pipe(Effect.flatMap((request) => request.pipe(HttpClientRequest.setHeaders({ "X-Aperture-Tenant-Id": options.params?.["X-Aperture-Tenant-Id"] ?? void 0 }), HttpClientRequest.bodyJsonUnsafe(options.payload), withResponse(options.config)(HttpClientResponse.matchStatus({
1883
+ "2xx": decodeSuccess(MoveSessionFile200),
1884
+ orElse: unexpectedStatus
1885
+ }))))),
1886
+ "createSessionDirectory": (sessionId, options) => __makePathRequest(HttpClientRequest.post, [sessionId], () => "/api/sessions/" + __encodePathParam(sessionId) + "/files/directories").pipe(Effect.flatMap((request) => request.pipe(HttpClientRequest.setHeaders({ "X-Aperture-Tenant-Id": options.params?.["X-Aperture-Tenant-Id"] ?? void 0 }), HttpClientRequest.bodyJsonUnsafe(options.payload), withResponse(options.config)(HttpClientResponse.matchStatus({
1887
+ "2xx": decodeSuccess(CreateSessionDirectory201),
1888
+ orElse: unexpectedStatus
1889
+ }))))),
1626
1890
  "createSessionFileDownloadURL": (sessionId, options) => __makePathRequest(HttpClientRequest.post, [sessionId], () => "/api/sessions/" + __encodePathParam(sessionId) + "/files/download-url").pipe(Effect.flatMap((request) => request.pipe(HttpClientRequest.setHeaders({ "X-Aperture-Tenant-Id": options.params?.["X-Aperture-Tenant-Id"] ?? void 0 }), HttpClientRequest.bodyJsonUnsafe(options.payload), withResponse(options.config)(HttpClientResponse.matchStatus({
1627
1891
  "2xx": decodeSuccess(CreateSessionFileDownloadURL200),
1628
1892
  orElse: unexpectedStatus
@@ -1668,7 +1932,15 @@ const make = (httpClient, options = {}) => {
1668
1932
  }), HttpClientRequest.setHeaders({ "X-Aperture-Tenant-Id": options?.params?.["X-Aperture-Tenant-Id"] ?? void 0 }), withResponse(options?.config)(HttpClientResponse.matchStatus({
1669
1933
  "2xx": decodeSuccess(ListEvents200),
1670
1934
  orElse: unexpectedStatus
1671
- })))
1935
+ }))),
1936
+ "uploadLiveSessionFiles": (sessionId, options) => __makePathRequest(HttpClientRequest.post, [sessionId], () => "/sessions/" + __encodePathParam(sessionId) + "/uploads").pipe(Effect.flatMap((request) => request.pipe(HttpClientRequest.setHeaders({ "X-Aperture-Tenant-Id": options.params?.["X-Aperture-Tenant-Id"] ?? void 0 }), HttpClientRequest.bodyFormDataRecord(options.payload), withResponse(options.config)(HttpClientResponse.matchStatus({
1937
+ "2xx": decodeSuccess(UploadLiveSessionFiles201),
1938
+ orElse: unexpectedStatus
1939
+ }))))),
1940
+ "setSessionViewport": (sessionId, options) => __makePathRequest(HttpClientRequest.post, [sessionId], () => "/sessions/" + __encodePathParam(sessionId) + "/browser/viewport").pipe(Effect.flatMap((request) => request.pipe(HttpClientRequest.setHeaders({ "X-Aperture-Tenant-Id": options.params?.["X-Aperture-Tenant-Id"] ?? void 0 }), HttpClientRequest.bodyJsonUnsafe(options.payload), withResponse(options.config)(HttpClientResponse.matchStatus({
1941
+ "2xx": decodeSuccess(SetSessionViewport200),
1942
+ orElse: unexpectedStatus
1943
+ })))))
1672
1944
  };
1673
1945
  };
1674
1946
  var ApertureApiErrorImpl = class extends Data.Error {};
@@ -1679,6 +1951,6 @@ const ApertureApiError = (tag, cause, response) => new ApertureApiErrorImpl({
1679
1951
  request: response.request
1680
1952
  });
1681
1953
  //#endregion
1682
- export { ApertureApiError, AuditEvent, AuditEventPage, AuthMe, AuthorityType, BrowserChannel, BrowserChannels, BrowserConfig, BrowserCookieSameSite, BrowserStorageEntry, CreateAdminToken201, CreateAdminTokenInput, CreateAdminTokenRequestJson, CreateAdminTokendefault, CreateSession201, CreateSessionFileDownloadURL200, CreateSessionFileDownloadURLParams, CreateSessionFileDownloadURLRequestJson, CreateSessionFileDownloadURLdefault, CreateSessionInput, CreateSessionParams, CreateSessionRecording201, CreateSessionRecordingInput, CreateSessionRecordingParams, CreateSessionRecordingRequestJson, CreateSessionRecordingdefault, CreateSessionRequestJson, CreateSessionResult, CreateSessiondefault, CreateTenant201, CreateTenantRequestJson, CreateTenantToken201, CreateTenantTokenInput, CreateTenantTokenRequestJson, CreateTenantTokendefault, CreateTenantdefault, CreateTokenResponse, CreateUser201, CreateUserInvitation201, CreateUserInvitationdefault, CreateUserRequestJson, CreateUserdefault, CursorVisibility, DeleteSession200, DeleteSessionParams, DeleteSessiondefault, DeleteSnapshot200, DeleteSnapshotParams, DeleteSnapshotdefault, DeleteTenant200, DeleteTenantMembershipdefault, DeleteTenantdefault, DisableUser200, DisableUserdefault, Error, ErrorDetail, Event, EventPage, GetCurrentPrincipal200, GetCurrentPrincipalParams, GetCurrentPrincipaldefault, GetHealth200, GetSession200, GetSessionCursor200, GetSessionCursorParams, GetSessionCursordefault, GetSessionParams, GetSessionRecording200, GetSessionRecordingParams, GetSessionRecordingdefault, GetSessiondefault, GetSessionsBulk200, GetSessionsBulkParams, GetSessionsBulkRequestJson, GetSessionsBulkdefault, GetTenant200, GetTenantdefault, GetUser200, GetUserdefault, Health, IceServer, InitialBrowserContentEditableState, InitialBrowserControlSelection, InitialBrowserControlState, InitialBrowserCookie, InitialBrowserCookiePartitionKey, InitialBrowserDocumentSelection, InitialBrowserDocumentState, InitialBrowserElementLocator, InitialBrowserElementPathStep, InitialBrowserElementScrollPosition, InitialBrowserScrollPosition, InitialBrowserSelectionEndpoint, InitialBrowserStorageState, InitialBrowserTarget, InitialCacheStorageCache, InitialCacheStorageEntry, InitialIndexedDBDatabase, InitialIndexedDBIndex, InitialIndexedDBIndexKeyPath, InitialIndexedDBKeyPath, InitialIndexedDBObjectStore, InitialIndexedDBRecord, InitialOPFSFile, InitialStorageOrigin, InitialTargetStorageOrigin, ListAdminTokens200, ListAdminTokensParams, ListAdminTokensdefault, ListAuditEvents200, ListAuditEventsParams, ListAuditEventsdefault, ListBrowserChannels200, ListBrowserChannelsdefault, ListEvents200, ListEventsParams, ListEventsdefault, ListSessionRecordings200, ListSessionRecordingsParams, ListSessionRecordingsdefault, ListSessions200, ListSessionsParams, ListSessionsdefault, ListSnapshots200, ListSnapshotsParams, ListSnapshotsdefault, ListTenantMemberships200, ListTenantMembershipsdefault, ListTenantTokens200, ListTenantTokensParams, ListTenantTokensdefault, ListTenants200, ListTenantsParams, ListTenantsdefault, ListUserMemberships200, ListUserMembershipsdefault, ListUsers200, ListUsersParams, ListUsersdefault, PageMeta, Principal, PrincipalType, PromoteSession200, PromoteSessionInput, PromoteSessionParams, PromoteSessionRequestJson, PromoteSessiondefault, ProxyConfig, ProxyTunnelConfig, Recording, ReopenSession200, ReopenSessionParams, ReopenSessiondefault, ReplaceSessionTags200, ReplaceSessionTagsParams, ReplaceSessionTagsRequestJson, ReplaceSessionTagsdefault, ReplaceSnapshotTags200, ReplaceSnapshotTagsParams, ReplaceSnapshotTagsRequestJson, ReplaceSnapshotTagsdefault, ReplaceTagsInput, ResourceGrant, ResourceMode, ResourceType, RestoreSnapshot200, RestoreSnapshotParams, RestoreSnapshotdefault, RestoreTenant200, RestoreTenantdefault, RestoreUser200, RestoreUserdefault, RetargetSessionRecording200, RetargetSessionRecordingInput, RetargetSessionRecordingParams, RetargetSessionRecordingRequestJson, RetargetSessionRecordingdefault, RevokeAdminTokendefault, RevokeTenantTokendefault, RotateCollaborationCapability200, RotateCollaborationCapabilityParams, RotateCollaborationCapabilitydefault, RotateSessionToken200, RotateSessionTokenParams, RotateSessionTokendefault, Scope, Session, SessionBulkInput, SessionBulkResponse, SessionCollaborationCapabilities, SessionFile, SessionFileDownloadURL, SessionFileDownloadURLInput, SessionMedia, SessionMutation, SessionPage, SessionProxy, SessionStatus, SetSessionCursor200, SetSessionCursorParams, SetSessionCursorRequestJson, SetSessionCursordefault, Snapshot, SnapshotMutation, SnapshotPage, StopSessionRecording200, StopSessionRecordingParams, StopSessionRecordingdefault, StringMap, SuspendSession200, SuspendSessionParams, SuspendSessiondefault, Tenant, TenantInput, TenantMembership, TenantMembershipInput, TenantPage, TenantScope, Token, TokenPage, UUIDv7, UpdateProxyAssignment, UpdateSelectedTenant200, UpdateSelectedTenantRequestJson, UpdateSelectedTenantdefault, UpdateSessionProxy200, UpdateSessionProxyParams, UpdateSessionProxyRequestJson, UpdateSessionProxydefault, UpdateSnapshot200, UpdateSnapshotInput, UpdateSnapshotParams, UpdateSnapshotRequestJson, UpdateSnapshotdefault, UpdateTenant200, UpdateTenantRequestJson, UpdateTenantdefault, UpdateUser200, UpdateUserRequestJson, UpdateUserdefault, UpsertTenantMembership200, UpsertTenantMembershipRequestJson, UpsertTenantMembershipdefault, User, UserInput, UserInvitation, UserPage, make };
1954
+ export { ApertureApiError, AuditEvent, AuditEventPage, AuthMe, AuthorityType, BrowserChannel, BrowserChannels, BrowserConfig, BrowserCookieSameSite, BrowserStorageEntry, CreateAdminToken201, CreateAdminTokenInput, CreateAdminTokenRequestJson, CreateAdminTokendefault, CreateSession201, CreateSessionDirectory201, CreateSessionDirectoryInput, CreateSessionDirectoryParams, CreateSessionDirectoryRequestJson, CreateSessionDirectorydefault, CreateSessionFileDownloadURL200, CreateSessionFileDownloadURLParams, CreateSessionFileDownloadURLRequestJson, CreateSessionFileDownloadURLdefault, CreateSessionInput, CreateSessionParams, CreateSessionRecording201, CreateSessionRecordingInput, CreateSessionRecordingParams, CreateSessionRecordingRequestJson, CreateSessionRecordingdefault, CreateSessionRequestJson, CreateSessionResult, CreateSessiondefault, CreateTenant201, CreateTenantRequestJson, CreateTenantToken201, CreateTenantTokenInput, CreateTenantTokenRequestJson, CreateTenantTokendefault, CreateTenantdefault, CreateTokenResponse, CreateUser201, CreateUserInvitation201, CreateUserInvitationdefault, CreateUserRequestJson, CreateUserdefault, CursorVisibility, DeleteSession200, DeleteSessionFileParams, DeleteSessionFiledefault, DeleteSessionParams, DeleteSessiondefault, DeleteSnapshot200, DeleteSnapshotParams, DeleteSnapshotdefault, DeleteTenant200, DeleteTenantMembershipdefault, DeleteTenantdefault, DisableUser200, DisableUserdefault, Error, ErrorDetail, Event, EventPage, ExportSessionStorageState200, ExportSessionStorageStateInput, ExportSessionStorageStateParams, ExportSessionStorageStateRequestJson, ExportSessionStorageStatedefault, GetCurrentPrincipal200, GetCurrentPrincipalParams, GetCurrentPrincipaldefault, GetHealth200, GetSession200, GetSessionCursor200, GetSessionCursorParams, GetSessionCursordefault, GetSessionParams, GetSessionRecording200, GetSessionRecordingParams, GetSessionRecordingdefault, GetSessionTargetThumbnailParams, GetSessionTargetThumbnaildefault, GetSessionThumbnailParams, GetSessionThumbnaildefault, GetSessiondefault, GetSessionsBulk200, GetSessionsBulkParams, GetSessionsBulkRequestJson, GetSessionsBulkdefault, GetTenant200, GetTenantdefault, GetUser200, GetUserdefault, Health, IceServer, InitialBrowserContentEditableState, InitialBrowserControlSelection, InitialBrowserControlState, InitialBrowserCookie, InitialBrowserCookiePartitionKey, InitialBrowserDocumentSelection, InitialBrowserDocumentState, InitialBrowserElementLocator, InitialBrowserElementPathStep, InitialBrowserElementScrollPosition, InitialBrowserScrollPosition, InitialBrowserSelectionEndpoint, InitialBrowserStorageState, InitialBrowserTarget, InitialCacheStorageCache, InitialCacheStorageEntry, InitialIndexedDBDatabase, InitialIndexedDBIndex, InitialIndexedDBIndexKeyPath, InitialIndexedDBKeyPath, InitialIndexedDBObjectStore, InitialIndexedDBRecord, InitialOPFSFile, InitialStorageOrigin, InitialTargetStorageOrigin, ListAdminTokens200, ListAdminTokensParams, ListAdminTokensdefault, ListAuditEvents200, ListAuditEventsParams, ListAuditEventsdefault, ListBrowserChannels200, ListBrowserChannelsdefault, ListEvents200, ListEventsParams, ListEventsdefault, ListSessionFiles200, ListSessionFilesParams, ListSessionFilesdefault, ListSessionRecordings200, ListSessionRecordingsParams, ListSessionRecordingsdefault, ListSessions200, ListSessionsParams, ListSessionsdefault, ListSnapshots200, ListSnapshotsParams, ListSnapshotsdefault, ListTenantMemberships200, ListTenantMembershipsdefault, ListTenantTokens200, ListTenantTokensParams, ListTenantTokensdefault, ListTenants200, ListTenantsParams, ListTenantsdefault, ListUserMemberships200, ListUserMembershipsdefault, ListUsers200, ListUsersParams, ListUsersdefault, LiveSessionErrorBody, LiveSessionFailure, MoveSessionFile200, MoveSessionFileInput, MoveSessionFileParams, MoveSessionFileRequestJson, MoveSessionFiledefault, PageMeta, Principal, PrincipalType, PromoteSession200, PromoteSessionInput, PromoteSessionParams, PromoteSessionRequestJson, PromoteSessiondefault, ProxyConfig, ProxyRule, ProxyTunnelConfig, ProxyUpstream, Recording, RecordingEditError, ReopenSession200, ReopenSessionParams, ReopenSessiondefault, ReplaceSessionTags200, ReplaceSessionTagsParams, ReplaceSessionTagsRequestJson, ReplaceSessionTagsdefault, ReplaceSnapshotTags200, ReplaceSnapshotTagsParams, ReplaceSnapshotTagsRequestJson, ReplaceSnapshotTagsdefault, ReplaceTagsInput, ResourceGrant, ResourceMode, ResourceType, RestoreSnapshot200, RestoreSnapshotParams, RestoreSnapshotdefault, RestoreTenant200, RestoreTenantdefault, RestoreUser200, RestoreUserdefault, RetargetSessionRecording200, RetargetSessionRecordingInput, RetargetSessionRecordingParams, RetargetSessionRecordingRequestJson, RetargetSessionRecordingdefault, RevokeAdminTokendefault, RevokeTenantTokendefault, RotateCollaborationCapability200, RotateCollaborationCapabilityParams, RotateCollaborationCapabilitydefault, RotateSessionToken200, RotateSessionTokenParams, RotateSessionTokendefault, Scope, SensitiveString, Session, SessionBulkInput, SessionBulkResponse, SessionCollaborationCapabilities, SessionDirectory, SessionFile, SessionFileDownloadURL, SessionFileDownloadURLInput, SessionFileEntry, SessionMedia, SessionMutation, SessionPage, SessionProxy, SessionProxyUpstream, SessionStatus, SessionThumbnail, SetSessionCursor200, SetSessionCursorParams, SetSessionCursorRequestJson, SetSessionCursordefault, SetSessionViewport200, SetSessionViewportParams, SetSessionViewportRequestJson, SetSessionViewportdefault, SetViewportInput, Snapshot, SnapshotMutation, SnapshotPage, StopSessionRecording200, StopSessionRecordingParams, StopSessionRecordingdefault, StringMap, SuspendSession200, SuspendSessionParams, SuspendSessiondefault, TargetViewport, Tenant, TenantInput, TenantMembership, TenantMembershipInput, TenantPage, TenantScope, Token, TokenPage, UUIDv7, UpdateProxyConfig, UpdateSelectedTenant200, UpdateSelectedTenantRequestJson, UpdateSelectedTenantdefault, UpdateSessionProxy200, UpdateSessionProxyParams, UpdateSessionProxyRequestJson, UpdateSessionProxydefault, UpdateSnapshot200, UpdateSnapshotInput, UpdateSnapshotParams, UpdateSnapshotRequestJson, UpdateSnapshotdefault, UpdateTenant200, UpdateTenantRequestJson, UpdateTenantdefault, UpdateUser200, UpdateUserRequestJson, UpdateUserdefault, UploadLiveSessionFiles201, UploadLiveSessionFilesParams, UploadLiveSessionFilesRequestFormData, UploadLiveSessionFilesdefault, UploadSessionFiles201, UploadSessionFilesParams, UploadSessionFilesRequestFormData, UploadSessionFilesdefault, UpsertTenantMembership200, UpsertTenantMembershipRequestJson, UpsertTenantMembershipdefault, User, UserInput, UserInvitation, UserPage, Viewport, __ClientMultipartFile, make };
1683
1955
 
1684
1956
  //# sourceMappingURL=index.js.map