doc-detective-common 4.24.0 → 4.25.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -34175,7 +34175,7 @@ var schemas_default = {
34175
34175
  record: {
34176
34176
  $schema: "http://json-schema.org/draft-07/schema#",
34177
34177
  title: "record",
34178
- description: "Start recording. Must be followed by a `stopRecord` step. The `browser` engine captures the Chrome viewport (works under concurrency); the `ffmpeg` engine captures the screen and supports any application. Supported extensions: [ '.mp4', '.webm', '.gif' ]",
34178
+ description: "Start recording. Must be followed by a `stopRecord` step. The `browser` engine captures the Chrome viewport (works under concurrency); the `ffmpeg` engine captures the screen and supports any application. On Android/iOS contexts, recording captures the device screen through the device itself \u2014 `engine` doesn't apply. Supported extensions: [ '.mp4', '.webm', '.gif' ]",
34179
34179
  anyOf: [
34180
34180
  {
34181
34181
  title: "Record (simple)",
@@ -34190,7 +34190,7 @@ var schemas_default = {
34190
34190
  type: "object",
34191
34191
  properties: {
34192
34192
  surface: {
34193
- description: "The browser window/tab to record. Omit to record the active tab. The targeted tab stays focused afterward.",
34193
+ description: 'The browser window/tab or app window to record. Omit to record the active surface. The targeted surface stays focused afterward. App surfaces use the object form ({ "app": \u2026 }) and are captured via the `ffmpeg` engine, cropped to the app window by default.',
34194
34194
  anyOf: [
34195
34195
  {
34196
34196
  title: "Surface (by browser engine)",
@@ -34340,6 +34340,72 @@ var schemas_default = {
34340
34340
  ]
34341
34341
  }
34342
34342
  }
34343
+ },
34344
+ {
34345
+ title: "App surface",
34346
+ type: "object",
34347
+ additionalProperties: false,
34348
+ required: [
34349
+ "app"
34350
+ ],
34351
+ properties: {
34352
+ app: {
34353
+ type: "string",
34354
+ minLength: 1,
34355
+ pattern: "\\S",
34356
+ transform: [
34357
+ "trim"
34358
+ ],
34359
+ description: "Name of an app surface opened by `startSurface` (its `name`, or the default derived from the app identifier)."
34360
+ },
34361
+ window: {
34362
+ description: "Which app window to act on. Omit to use the active window. Apps have windows, no tabs.",
34363
+ title: "App window selector",
34364
+ anyOf: [
34365
+ {
34366
+ title: "By index",
34367
+ type: "integer",
34368
+ description: "Index in creation order. Negative counts from the end; `-1` is the newest (e.g. a dialog the app just opened)."
34369
+ },
34370
+ {
34371
+ title: "By name",
34372
+ type: "string",
34373
+ minLength: 1,
34374
+ pattern: "\\S",
34375
+ transform: [
34376
+ "trim"
34377
+ ],
34378
+ description: "Assigned window name. The integer branch is listed first because Ajv validates with coerceTypes \u2014 string-first would coerce integer indexes into name strings."
34379
+ },
34380
+ {
34381
+ title: "By criteria",
34382
+ type: "object",
34383
+ additionalProperties: false,
34384
+ minProperties: 1,
34385
+ properties: {
34386
+ name: {
34387
+ type: "string",
34388
+ minLength: 1,
34389
+ pattern: "\\S",
34390
+ transform: [
34391
+ "trim"
34392
+ ],
34393
+ description: "Assigned window name."
34394
+ },
34395
+ index: {
34396
+ type: "integer",
34397
+ description: "Index in creation order. Negative counts from the end."
34398
+ },
34399
+ title: {
34400
+ type: "string",
34401
+ minLength: 1,
34402
+ description: "Window title to match. Substring, or /regex/."
34403
+ }
34404
+ }
34405
+ }
34406
+ ]
34407
+ }
34408
+ }
34343
34409
  }
34344
34410
  ]
34345
34411
  },
@@ -34405,13 +34471,12 @@ var schemas_default = {
34405
34471
  },
34406
34472
  target: {
34407
34473
  type: "string",
34408
- description: "What the `ffmpeg` engine captures. `display` records the full screen, `window` the active window, `viewport` the browser content area. Ignored by the `browser` engine, which always captures its tab. `window` and `viewport` are best-effort (captured full-screen, then cropped).",
34474
+ description: "What the `ffmpeg` engine captures. `display` records the full screen, `window` the active window, `viewport` the browser content area. Ignored by the `browser` engine, which always captures its tab. `window` and `viewport` are best-effort (captured full-screen, then cropped). If unset, defaults to `window` when the recording's `surface` is an app surface and to `display` otherwise. `viewport` doesn't apply to app surfaces (they have no browser viewport).",
34409
34475
  enum: [
34410
34476
  "display",
34411
34477
  "window",
34412
34478
  "viewport"
34413
- ],
34414
- default: "display"
34479
+ ]
34415
34480
  },
34416
34481
  fps: {
34417
34482
  type: "integer",
@@ -34429,7 +34494,7 @@ var schemas_default = {
34429
34494
  {
34430
34495
  type: "boolean",
34431
34496
  title: "Record (boolean)",
34432
- description: "If `true`, starts recording \u2014 auto-selecting the `browser` engine for a visible Chrome context and the `ffmpeg` engine otherwise. If `false`, doesn't record."
34497
+ description: "If `true`, starts recording \u2014 auto-selecting the `browser` engine for a visible Chrome context, the device screen on Android/iOS contexts, and the `ffmpeg` engine otherwise. If `false`, doesn't record."
34433
34498
  }
34434
34499
  ],
34435
34500
  components: {
@@ -34447,7 +34512,7 @@ var schemas_default = {
34447
34512
  type: "object",
34448
34513
  properties: {
34449
34514
  surface: {
34450
- description: "The browser window/tab to record. Omit to record the active tab. The targeted tab stays focused afterward.",
34515
+ description: 'The browser window/tab or app window to record. Omit to record the active surface. The targeted surface stays focused afterward. App surfaces use the object form ({ "app": \u2026 }) and are captured via the `ffmpeg` engine, cropped to the app window by default.',
34451
34516
  anyOf: [
34452
34517
  {
34453
34518
  title: "Surface (by browser engine)",
@@ -34597,6 +34662,72 @@ var schemas_default = {
34597
34662
  ]
34598
34663
  }
34599
34664
  }
34665
+ },
34666
+ {
34667
+ title: "App surface",
34668
+ type: "object",
34669
+ additionalProperties: false,
34670
+ required: [
34671
+ "app"
34672
+ ],
34673
+ properties: {
34674
+ app: {
34675
+ type: "string",
34676
+ minLength: 1,
34677
+ pattern: "\\S",
34678
+ transform: [
34679
+ "trim"
34680
+ ],
34681
+ description: "Name of an app surface opened by `startSurface` (its `name`, or the default derived from the app identifier)."
34682
+ },
34683
+ window: {
34684
+ description: "Which app window to act on. Omit to use the active window. Apps have windows, no tabs.",
34685
+ title: "App window selector",
34686
+ anyOf: [
34687
+ {
34688
+ title: "By index",
34689
+ type: "integer",
34690
+ description: "Index in creation order. Negative counts from the end; `-1` is the newest (e.g. a dialog the app just opened)."
34691
+ },
34692
+ {
34693
+ title: "By name",
34694
+ type: "string",
34695
+ minLength: 1,
34696
+ pattern: "\\S",
34697
+ transform: [
34698
+ "trim"
34699
+ ],
34700
+ description: "Assigned window name. The integer branch is listed first because Ajv validates with coerceTypes \u2014 string-first would coerce integer indexes into name strings."
34701
+ },
34702
+ {
34703
+ title: "By criteria",
34704
+ type: "object",
34705
+ additionalProperties: false,
34706
+ minProperties: 1,
34707
+ properties: {
34708
+ name: {
34709
+ type: "string",
34710
+ minLength: 1,
34711
+ pattern: "\\S",
34712
+ transform: [
34713
+ "trim"
34714
+ ],
34715
+ description: "Assigned window name."
34716
+ },
34717
+ index: {
34718
+ type: "integer",
34719
+ description: "Index in creation order. Negative counts from the end."
34720
+ },
34721
+ title: {
34722
+ type: "string",
34723
+ minLength: 1,
34724
+ description: "Window title to match. Substring, or /regex/."
34725
+ }
34726
+ }
34727
+ }
34728
+ ]
34729
+ }
34730
+ }
34600
34731
  }
34601
34732
  ]
34602
34733
  },
@@ -34662,13 +34793,12 @@ var schemas_default = {
34662
34793
  },
34663
34794
  target: {
34664
34795
  type: "string",
34665
- description: "What the `ffmpeg` engine captures. `display` records the full screen, `window` the active window, `viewport` the browser content area. Ignored by the `browser` engine, which always captures its tab. `window` and `viewport` are best-effort (captured full-screen, then cropped).",
34796
+ description: "What the `ffmpeg` engine captures. `display` records the full screen, `window` the active window, `viewport` the browser content area. Ignored by the `browser` engine, which always captures its tab. `window` and `viewport` are best-effort (captured full-screen, then cropped). If unset, defaults to `window` when the recording's `surface` is an app surface and to `display` otherwise. `viewport` doesn't apply to app surfaces (they have no browser viewport).",
34666
34797
  enum: [
34667
34798
  "display",
34668
34799
  "window",
34669
34800
  "viewport"
34670
- ],
34671
- default: "display"
34801
+ ]
34672
34802
  },
34673
34803
  fps: {
34674
34804
  type: "integer",
@@ -34714,13 +34844,12 @@ var schemas_default = {
34714
34844
  },
34715
34845
  target: {
34716
34846
  type: "string",
34717
- description: "What the `ffmpeg` engine captures. `display` records the full screen, `window` the active window, `viewport` the browser content area. Ignored by the `browser` engine, which always captures its tab. `window` and `viewport` are best-effort (captured full-screen, then cropped).",
34847
+ description: "What the `ffmpeg` engine captures. `display` records the full screen, `window` the active window, `viewport` the browser content area. Ignored by the `browser` engine, which always captures its tab. `window` and `viewport` are best-effort (captured full-screen, then cropped). If unset, defaults to `window` when the recording's `surface` is an app surface and to `display` otherwise. `viewport` doesn't apply to app surfaces (they have no browser viewport).",
34718
34848
  enum: [
34719
34849
  "display",
34720
34850
  "window",
34721
34851
  "viewport"
34722
- ],
34723
- default: "display"
34852
+ ]
34724
34853
  },
34725
34854
  fps: {
34726
34855
  type: "integer",
@@ -34753,6 +34882,22 @@ var schemas_default = {
34753
34882
  target: "window",
34754
34883
  fps: 60
34755
34884
  }
34885
+ },
34886
+ {
34887
+ path: "notepad.mp4",
34888
+ surface: {
34889
+ app: "notepad"
34890
+ }
34891
+ },
34892
+ {
34893
+ path: "full-screen.mp4",
34894
+ surface: {
34895
+ app: "notepad"
34896
+ },
34897
+ engine: {
34898
+ name: "ffmpeg",
34899
+ target: "display"
34900
+ }
34756
34901
  }
34757
34902
  ]
34758
34903
  }
@@ -78757,7 +78902,7 @@ var schemas_default = {
78757
78902
  record: {
78758
78903
  $schema: "http://json-schema.org/draft-07/schema#",
78759
78904
  title: "record",
78760
- description: "Start recording. Must be followed by a `stopRecord` step. The `browser` engine captures the Chrome viewport (works under concurrency); the `ffmpeg` engine captures the screen and supports any application. Supported extensions: [ '.mp4', '.webm', '.gif' ]",
78905
+ description: "Start recording. Must be followed by a `stopRecord` step. The `browser` engine captures the Chrome viewport (works under concurrency); the `ffmpeg` engine captures the screen and supports any application. On Android/iOS contexts, recording captures the device screen through the device itself \u2014 `engine` doesn't apply. Supported extensions: [ '.mp4', '.webm', '.gif' ]",
78761
78906
  anyOf: [
78762
78907
  {
78763
78908
  title: "Record (simple)",
@@ -78772,7 +78917,7 @@ var schemas_default = {
78772
78917
  type: "object",
78773
78918
  properties: {
78774
78919
  surface: {
78775
- description: "The browser window/tab to record. Omit to record the active tab. The targeted tab stays focused afterward.",
78920
+ description: 'The browser window/tab or app window to record. Omit to record the active surface. The targeted surface stays focused afterward. App surfaces use the object form ({ "app": \u2026 }) and are captured via the `ffmpeg` engine, cropped to the app window by default.',
78776
78921
  anyOf: [
78777
78922
  {
78778
78923
  title: "Surface (by browser engine)",
@@ -78922,6 +79067,72 @@ var schemas_default = {
78922
79067
  ]
78923
79068
  }
78924
79069
  }
79070
+ },
79071
+ {
79072
+ title: "App surface",
79073
+ type: "object",
79074
+ additionalProperties: false,
79075
+ required: [
79076
+ "app"
79077
+ ],
79078
+ properties: {
79079
+ app: {
79080
+ type: "string",
79081
+ minLength: 1,
79082
+ pattern: "\\S",
79083
+ transform: [
79084
+ "trim"
79085
+ ],
79086
+ description: "Name of an app surface opened by `startSurface` (its `name`, or the default derived from the app identifier)."
79087
+ },
79088
+ window: {
79089
+ description: "Which app window to act on. Omit to use the active window. Apps have windows, no tabs.",
79090
+ title: "App window selector",
79091
+ anyOf: [
79092
+ {
79093
+ title: "By index",
79094
+ type: "integer",
79095
+ description: "Index in creation order. Negative counts from the end; `-1` is the newest (e.g. a dialog the app just opened)."
79096
+ },
79097
+ {
79098
+ title: "By name",
79099
+ type: "string",
79100
+ minLength: 1,
79101
+ pattern: "\\S",
79102
+ transform: [
79103
+ "trim"
79104
+ ],
79105
+ description: "Assigned window name. The integer branch is listed first because Ajv validates with coerceTypes \u2014 string-first would coerce integer indexes into name strings."
79106
+ },
79107
+ {
79108
+ title: "By criteria",
79109
+ type: "object",
79110
+ additionalProperties: false,
79111
+ minProperties: 1,
79112
+ properties: {
79113
+ name: {
79114
+ type: "string",
79115
+ minLength: 1,
79116
+ pattern: "\\S",
79117
+ transform: [
79118
+ "trim"
79119
+ ],
79120
+ description: "Assigned window name."
79121
+ },
79122
+ index: {
79123
+ type: "integer",
79124
+ description: "Index in creation order. Negative counts from the end."
79125
+ },
79126
+ title: {
79127
+ type: "string",
79128
+ minLength: 1,
79129
+ description: "Window title to match. Substring, or /regex/."
79130
+ }
79131
+ }
79132
+ }
79133
+ ]
79134
+ }
79135
+ }
78925
79136
  }
78926
79137
  ]
78927
79138
  },
@@ -78987,13 +79198,12 @@ var schemas_default = {
78987
79198
  },
78988
79199
  target: {
78989
79200
  type: "string",
78990
- description: "What the `ffmpeg` engine captures. `display` records the full screen, `window` the active window, `viewport` the browser content area. Ignored by the `browser` engine, which always captures its tab. `window` and `viewport` are best-effort (captured full-screen, then cropped).",
79201
+ description: "What the `ffmpeg` engine captures. `display` records the full screen, `window` the active window, `viewport` the browser content area. Ignored by the `browser` engine, which always captures its tab. `window` and `viewport` are best-effort (captured full-screen, then cropped). If unset, defaults to `window` when the recording's `surface` is an app surface and to `display` otherwise. `viewport` doesn't apply to app surfaces (they have no browser viewport).",
78991
79202
  enum: [
78992
79203
  "display",
78993
79204
  "window",
78994
79205
  "viewport"
78995
- ],
78996
- default: "display"
79206
+ ]
78997
79207
  },
78998
79208
  fps: {
78999
79209
  type: "integer",
@@ -79011,7 +79221,7 @@ var schemas_default = {
79011
79221
  {
79012
79222
  type: "boolean",
79013
79223
  title: "Record (boolean)",
79014
- description: "If `true`, starts recording \u2014 auto-selecting the `browser` engine for a visible Chrome context and the `ffmpeg` engine otherwise. If `false`, doesn't record."
79224
+ description: "If `true`, starts recording \u2014 auto-selecting the `browser` engine for a visible Chrome context, the device screen on Android/iOS contexts, and the `ffmpeg` engine otherwise. If `false`, doesn't record."
79015
79225
  }
79016
79226
  ],
79017
79227
  components: {
@@ -79029,7 +79239,7 @@ var schemas_default = {
79029
79239
  type: "object",
79030
79240
  properties: {
79031
79241
  surface: {
79032
- description: "The browser window/tab to record. Omit to record the active tab. The targeted tab stays focused afterward.",
79242
+ description: 'The browser window/tab or app window to record. Omit to record the active surface. The targeted surface stays focused afterward. App surfaces use the object form ({ "app": \u2026 }) and are captured via the `ffmpeg` engine, cropped to the app window by default.',
79033
79243
  anyOf: [
79034
79244
  {
79035
79245
  title: "Surface (by browser engine)",
@@ -79179,6 +79389,72 @@ var schemas_default = {
79179
79389
  ]
79180
79390
  }
79181
79391
  }
79392
+ },
79393
+ {
79394
+ title: "App surface",
79395
+ type: "object",
79396
+ additionalProperties: false,
79397
+ required: [
79398
+ "app"
79399
+ ],
79400
+ properties: {
79401
+ app: {
79402
+ type: "string",
79403
+ minLength: 1,
79404
+ pattern: "\\S",
79405
+ transform: [
79406
+ "trim"
79407
+ ],
79408
+ description: "Name of an app surface opened by `startSurface` (its `name`, or the default derived from the app identifier)."
79409
+ },
79410
+ window: {
79411
+ description: "Which app window to act on. Omit to use the active window. Apps have windows, no tabs.",
79412
+ title: "App window selector",
79413
+ anyOf: [
79414
+ {
79415
+ title: "By index",
79416
+ type: "integer",
79417
+ description: "Index in creation order. Negative counts from the end; `-1` is the newest (e.g. a dialog the app just opened)."
79418
+ },
79419
+ {
79420
+ title: "By name",
79421
+ type: "string",
79422
+ minLength: 1,
79423
+ pattern: "\\S",
79424
+ transform: [
79425
+ "trim"
79426
+ ],
79427
+ description: "Assigned window name. The integer branch is listed first because Ajv validates with coerceTypes \u2014 string-first would coerce integer indexes into name strings."
79428
+ },
79429
+ {
79430
+ title: "By criteria",
79431
+ type: "object",
79432
+ additionalProperties: false,
79433
+ minProperties: 1,
79434
+ properties: {
79435
+ name: {
79436
+ type: "string",
79437
+ minLength: 1,
79438
+ pattern: "\\S",
79439
+ transform: [
79440
+ "trim"
79441
+ ],
79442
+ description: "Assigned window name."
79443
+ },
79444
+ index: {
79445
+ type: "integer",
79446
+ description: "Index in creation order. Negative counts from the end."
79447
+ },
79448
+ title: {
79449
+ type: "string",
79450
+ minLength: 1,
79451
+ description: "Window title to match. Substring, or /regex/."
79452
+ }
79453
+ }
79454
+ }
79455
+ ]
79456
+ }
79457
+ }
79182
79458
  }
79183
79459
  ]
79184
79460
  },
@@ -79244,13 +79520,12 @@ var schemas_default = {
79244
79520
  },
79245
79521
  target: {
79246
79522
  type: "string",
79247
- description: "What the `ffmpeg` engine captures. `display` records the full screen, `window` the active window, `viewport` the browser content area. Ignored by the `browser` engine, which always captures its tab. `window` and `viewport` are best-effort (captured full-screen, then cropped).",
79523
+ description: "What the `ffmpeg` engine captures. `display` records the full screen, `window` the active window, `viewport` the browser content area. Ignored by the `browser` engine, which always captures its tab. `window` and `viewport` are best-effort (captured full-screen, then cropped). If unset, defaults to `window` when the recording's `surface` is an app surface and to `display` otherwise. `viewport` doesn't apply to app surfaces (they have no browser viewport).",
79248
79524
  enum: [
79249
79525
  "display",
79250
79526
  "window",
79251
79527
  "viewport"
79252
- ],
79253
- default: "display"
79528
+ ]
79254
79529
  },
79255
79530
  fps: {
79256
79531
  type: "integer",
@@ -79296,13 +79571,12 @@ var schemas_default = {
79296
79571
  },
79297
79572
  target: {
79298
79573
  type: "string",
79299
- description: "What the `ffmpeg` engine captures. `display` records the full screen, `window` the active window, `viewport` the browser content area. Ignored by the `browser` engine, which always captures its tab. `window` and `viewport` are best-effort (captured full-screen, then cropped).",
79574
+ description: "What the `ffmpeg` engine captures. `display` records the full screen, `window` the active window, `viewport` the browser content area. Ignored by the `browser` engine, which always captures its tab. `window` and `viewport` are best-effort (captured full-screen, then cropped). If unset, defaults to `window` when the recording's `surface` is an app surface and to `display` otherwise. `viewport` doesn't apply to app surfaces (they have no browser viewport).",
79300
79575
  enum: [
79301
79576
  "display",
79302
79577
  "window",
79303
79578
  "viewport"
79304
- ],
79305
- default: "display"
79579
+ ]
79306
79580
  },
79307
79581
  fps: {
79308
79582
  type: "integer",
@@ -79335,6 +79609,22 @@ var schemas_default = {
79335
79609
  target: "window",
79336
79610
  fps: 60
79337
79611
  }
79612
+ },
79613
+ {
79614
+ path: "notepad.mp4",
79615
+ surface: {
79616
+ app: "notepad"
79617
+ }
79618
+ },
79619
+ {
79620
+ path: "full-screen.mp4",
79621
+ surface: {
79622
+ app: "notepad"
79623
+ },
79624
+ engine: {
79625
+ name: "ffmpeg",
79626
+ target: "display"
79627
+ }
79338
79628
  }
79339
79629
  ]
79340
79630
  }
@@ -104054,7 +104344,7 @@ var schemas_default = {
104054
104344
  record_v3: {
104055
104345
  $schema: "http://json-schema.org/draft-07/schema#",
104056
104346
  title: "record",
104057
- description: "Start recording. Must be followed by a `stopRecord` step. The `browser` engine captures the Chrome viewport (works under concurrency); the `ffmpeg` engine captures the screen and supports any application. Supported extensions: [ '.mp4', '.webm', '.gif' ]",
104347
+ description: "Start recording. Must be followed by a `stopRecord` step. The `browser` engine captures the Chrome viewport (works under concurrency); the `ffmpeg` engine captures the screen and supports any application. On Android/iOS contexts, recording captures the device screen through the device itself \u2014 `engine` doesn't apply. Supported extensions: [ '.mp4', '.webm', '.gif' ]",
104058
104348
  anyOf: [
104059
104349
  {
104060
104350
  title: "Record (simple)",
@@ -104069,7 +104359,7 @@ var schemas_default = {
104069
104359
  type: "object",
104070
104360
  properties: {
104071
104361
  surface: {
104072
- description: "The browser window/tab to record. Omit to record the active tab. The targeted tab stays focused afterward.",
104362
+ description: 'The browser window/tab or app window to record. Omit to record the active surface. The targeted surface stays focused afterward. App surfaces use the object form ({ "app": \u2026 }) and are captured via the `ffmpeg` engine, cropped to the app window by default.',
104073
104363
  anyOf: [
104074
104364
  {
104075
104365
  title: "Surface (by browser engine)",
@@ -104166,14 +104456,85 @@ var schemas_default = {
104166
104456
  }
104167
104457
  ]
104168
104458
  },
104169
- tab: {
104170
- description: "Which tab to act on. Omit to use the active tab. Without `window`, the selector searches every tab in creation order \u2014 including tabs the page opened itself.",
104171
- title: "Window/tab selector",
104459
+ tab: {
104460
+ description: "Which tab to act on. Omit to use the active tab. Without `window`, the selector searches every tab in creation order \u2014 including tabs the page opened itself.",
104461
+ title: "Window/tab selector",
104462
+ anyOf: [
104463
+ {
104464
+ title: "By index",
104465
+ type: "integer",
104466
+ description: "Index in creation order. Negative counts from the end; `-1` is the newest."
104467
+ },
104468
+ {
104469
+ title: "By name",
104470
+ type: "string",
104471
+ minLength: 1,
104472
+ pattern: "\\S",
104473
+ transform: [
104474
+ "trim"
104475
+ ],
104476
+ description: "Name assigned when the window/tab was opened (goTo `newTab`/`newWindow`). The integer branch is listed first because Ajv validates with coerceTypes \u2014 string-first would coerce integer indexes into name strings."
104477
+ },
104478
+ {
104479
+ title: "By criteria",
104480
+ type: "object",
104481
+ additionalProperties: false,
104482
+ minProperties: 1,
104483
+ properties: {
104484
+ name: {
104485
+ type: "string",
104486
+ minLength: 1,
104487
+ pattern: "\\S",
104488
+ transform: [
104489
+ "trim"
104490
+ ],
104491
+ description: "Name assigned when the window/tab was opened."
104492
+ },
104493
+ index: {
104494
+ type: "integer",
104495
+ description: "Index in creation order. Negative counts from the end."
104496
+ },
104497
+ title: {
104498
+ type: "string",
104499
+ minLength: 1,
104500
+ description: "Page title to match. Substring, or /regex/."
104501
+ },
104502
+ url: {
104503
+ type: "string",
104504
+ minLength: 1,
104505
+ description: "Page URL to match. Substring, or /regex/."
104506
+ }
104507
+ }
104508
+ }
104509
+ ]
104510
+ }
104511
+ }
104512
+ },
104513
+ {
104514
+ title: "App surface",
104515
+ type: "object",
104516
+ additionalProperties: false,
104517
+ required: [
104518
+ "app"
104519
+ ],
104520
+ properties: {
104521
+ app: {
104522
+ type: "string",
104523
+ minLength: 1,
104524
+ pattern: "\\S",
104525
+ transform: [
104526
+ "trim"
104527
+ ],
104528
+ description: "Name of an app surface opened by `startSurface` (its `name`, or the default derived from the app identifier)."
104529
+ },
104530
+ window: {
104531
+ description: "Which app window to act on. Omit to use the active window. Apps have windows, no tabs.",
104532
+ title: "App window selector",
104172
104533
  anyOf: [
104173
104534
  {
104174
104535
  title: "By index",
104175
104536
  type: "integer",
104176
- description: "Index in creation order. Negative counts from the end; `-1` is the newest."
104537
+ description: "Index in creation order. Negative counts from the end; `-1` is the newest (e.g. a dialog the app just opened)."
104177
104538
  },
104178
104539
  {
104179
104540
  title: "By name",
@@ -104183,7 +104544,7 @@ var schemas_default = {
104183
104544
  transform: [
104184
104545
  "trim"
104185
104546
  ],
104186
- description: "Name assigned when the window/tab was opened (goTo `newTab`/`newWindow`). The integer branch is listed first because Ajv validates with coerceTypes \u2014 string-first would coerce integer indexes into name strings."
104547
+ description: "Assigned window name. The integer branch is listed first because Ajv validates with coerceTypes \u2014 string-first would coerce integer indexes into name strings."
104187
104548
  },
104188
104549
  {
104189
104550
  title: "By criteria",
@@ -104198,7 +104559,7 @@ var schemas_default = {
104198
104559
  transform: [
104199
104560
  "trim"
104200
104561
  ],
104201
- description: "Name assigned when the window/tab was opened."
104562
+ description: "Assigned window name."
104202
104563
  },
104203
104564
  index: {
104204
104565
  type: "integer",
@@ -104207,12 +104568,7 @@ var schemas_default = {
104207
104568
  title: {
104208
104569
  type: "string",
104209
104570
  minLength: 1,
104210
- description: "Page title to match. Substring, or /regex/."
104211
- },
104212
- url: {
104213
- type: "string",
104214
- minLength: 1,
104215
- description: "Page URL to match. Substring, or /regex/."
104571
+ description: "Window title to match. Substring, or /regex/."
104216
104572
  }
104217
104573
  }
104218
104574
  }
@@ -104284,13 +104640,12 @@ var schemas_default = {
104284
104640
  },
104285
104641
  target: {
104286
104642
  type: "string",
104287
- description: "What the `ffmpeg` engine captures. `display` records the full screen, `window` the active window, `viewport` the browser content area. Ignored by the `browser` engine, which always captures its tab. `window` and `viewport` are best-effort (captured full-screen, then cropped).",
104643
+ description: "What the `ffmpeg` engine captures. `display` records the full screen, `window` the active window, `viewport` the browser content area. Ignored by the `browser` engine, which always captures its tab. `window` and `viewport` are best-effort (captured full-screen, then cropped). If unset, defaults to `window` when the recording's `surface` is an app surface and to `display` otherwise. `viewport` doesn't apply to app surfaces (they have no browser viewport).",
104288
104644
  enum: [
104289
104645
  "display",
104290
104646
  "window",
104291
104647
  "viewport"
104292
- ],
104293
- default: "display"
104648
+ ]
104294
104649
  },
104295
104650
  fps: {
104296
104651
  type: "integer",
@@ -104308,7 +104663,7 @@ var schemas_default = {
104308
104663
  {
104309
104664
  type: "boolean",
104310
104665
  title: "Record (boolean)",
104311
- description: "If `true`, starts recording \u2014 auto-selecting the `browser` engine for a visible Chrome context and the `ffmpeg` engine otherwise. If `false`, doesn't record."
104666
+ description: "If `true`, starts recording \u2014 auto-selecting the `browser` engine for a visible Chrome context, the device screen on Android/iOS contexts, and the `ffmpeg` engine otherwise. If `false`, doesn't record."
104312
104667
  }
104313
104668
  ],
104314
104669
  components: {
@@ -104326,7 +104681,7 @@ var schemas_default = {
104326
104681
  type: "object",
104327
104682
  properties: {
104328
104683
  surface: {
104329
- description: "The browser window/tab to record. Omit to record the active tab. The targeted tab stays focused afterward.",
104684
+ description: 'The browser window/tab or app window to record. Omit to record the active surface. The targeted surface stays focused afterward. App surfaces use the object form ({ "app": \u2026 }) and are captured via the `ffmpeg` engine, cropped to the app window by default.',
104330
104685
  anyOf: [
104331
104686
  {
104332
104687
  title: "Surface (by browser engine)",
@@ -104476,6 +104831,72 @@ var schemas_default = {
104476
104831
  ]
104477
104832
  }
104478
104833
  }
104834
+ },
104835
+ {
104836
+ title: "App surface",
104837
+ type: "object",
104838
+ additionalProperties: false,
104839
+ required: [
104840
+ "app"
104841
+ ],
104842
+ properties: {
104843
+ app: {
104844
+ type: "string",
104845
+ minLength: 1,
104846
+ pattern: "\\S",
104847
+ transform: [
104848
+ "trim"
104849
+ ],
104850
+ description: "Name of an app surface opened by `startSurface` (its `name`, or the default derived from the app identifier)."
104851
+ },
104852
+ window: {
104853
+ description: "Which app window to act on. Omit to use the active window. Apps have windows, no tabs.",
104854
+ title: "App window selector",
104855
+ anyOf: [
104856
+ {
104857
+ title: "By index",
104858
+ type: "integer",
104859
+ description: "Index in creation order. Negative counts from the end; `-1` is the newest (e.g. a dialog the app just opened)."
104860
+ },
104861
+ {
104862
+ title: "By name",
104863
+ type: "string",
104864
+ minLength: 1,
104865
+ pattern: "\\S",
104866
+ transform: [
104867
+ "trim"
104868
+ ],
104869
+ description: "Assigned window name. The integer branch is listed first because Ajv validates with coerceTypes \u2014 string-first would coerce integer indexes into name strings."
104870
+ },
104871
+ {
104872
+ title: "By criteria",
104873
+ type: "object",
104874
+ additionalProperties: false,
104875
+ minProperties: 1,
104876
+ properties: {
104877
+ name: {
104878
+ type: "string",
104879
+ minLength: 1,
104880
+ pattern: "\\S",
104881
+ transform: [
104882
+ "trim"
104883
+ ],
104884
+ description: "Assigned window name."
104885
+ },
104886
+ index: {
104887
+ type: "integer",
104888
+ description: "Index in creation order. Negative counts from the end."
104889
+ },
104890
+ title: {
104891
+ type: "string",
104892
+ minLength: 1,
104893
+ description: "Window title to match. Substring, or /regex/."
104894
+ }
104895
+ }
104896
+ }
104897
+ ]
104898
+ }
104899
+ }
104479
104900
  }
104480
104901
  ]
104481
104902
  },
@@ -104541,13 +104962,12 @@ var schemas_default = {
104541
104962
  },
104542
104963
  target: {
104543
104964
  type: "string",
104544
- description: "What the `ffmpeg` engine captures. `display` records the full screen, `window` the active window, `viewport` the browser content area. Ignored by the `browser` engine, which always captures its tab. `window` and `viewport` are best-effort (captured full-screen, then cropped).",
104965
+ description: "What the `ffmpeg` engine captures. `display` records the full screen, `window` the active window, `viewport` the browser content area. Ignored by the `browser` engine, which always captures its tab. `window` and `viewport` are best-effort (captured full-screen, then cropped). If unset, defaults to `window` when the recording's `surface` is an app surface and to `display` otherwise. `viewport` doesn't apply to app surfaces (they have no browser viewport).",
104545
104966
  enum: [
104546
104967
  "display",
104547
104968
  "window",
104548
104969
  "viewport"
104549
- ],
104550
- default: "display"
104970
+ ]
104551
104971
  },
104552
104972
  fps: {
104553
104973
  type: "integer",
@@ -104593,13 +105013,12 @@ var schemas_default = {
104593
105013
  },
104594
105014
  target: {
104595
105015
  type: "string",
104596
- description: "What the `ffmpeg` engine captures. `display` records the full screen, `window` the active window, `viewport` the browser content area. Ignored by the `browser` engine, which always captures its tab. `window` and `viewport` are best-effort (captured full-screen, then cropped).",
105016
+ description: "What the `ffmpeg` engine captures. `display` records the full screen, `window` the active window, `viewport` the browser content area. Ignored by the `browser` engine, which always captures its tab. `window` and `viewport` are best-effort (captured full-screen, then cropped). If unset, defaults to `window` when the recording's `surface` is an app surface and to `display` otherwise. `viewport` doesn't apply to app surfaces (they have no browser viewport).",
104597
105017
  enum: [
104598
105018
  "display",
104599
105019
  "window",
104600
105020
  "viewport"
104601
- ],
104602
- default: "display"
105021
+ ]
104603
105022
  },
104604
105023
  fps: {
104605
105024
  type: "integer",
@@ -104632,6 +105051,22 @@ var schemas_default = {
104632
105051
  target: "window",
104633
105052
  fps: 60
104634
105053
  }
105054
+ },
105055
+ {
105056
+ path: "notepad.mp4",
105057
+ surface: {
105058
+ app: "notepad"
105059
+ }
105060
+ },
105061
+ {
105062
+ path: "full-screen.mp4",
105063
+ surface: {
105064
+ app: "notepad"
105065
+ },
105066
+ engine: {
105067
+ name: "ffmpeg",
105068
+ target: "display"
105069
+ }
104635
105070
  }
104636
105071
  ]
104637
105072
  },
@@ -136499,7 +136934,7 @@ var schemas_default = {
136499
136934
  record: {
136500
136935
  $schema: "http://json-schema.org/draft-07/schema#",
136501
136936
  title: "record",
136502
- description: "Start recording. Must be followed by a `stopRecord` step. The `browser` engine captures the Chrome viewport (works under concurrency); the `ffmpeg` engine captures the screen and supports any application. Supported extensions: [ '.mp4', '.webm', '.gif' ]",
136937
+ description: "Start recording. Must be followed by a `stopRecord` step. The `browser` engine captures the Chrome viewport (works under concurrency); the `ffmpeg` engine captures the screen and supports any application. On Android/iOS contexts, recording captures the device screen through the device itself \u2014 `engine` doesn't apply. Supported extensions: [ '.mp4', '.webm', '.gif' ]",
136503
136938
  anyOf: [
136504
136939
  {
136505
136940
  title: "Record (simple)",
@@ -136514,7 +136949,7 @@ var schemas_default = {
136514
136949
  type: "object",
136515
136950
  properties: {
136516
136951
  surface: {
136517
- description: "The browser window/tab to record. Omit to record the active tab. The targeted tab stays focused afterward.",
136952
+ description: 'The browser window/tab or app window to record. Omit to record the active surface. The targeted surface stays focused afterward. App surfaces use the object form ({ "app": \u2026 }) and are captured via the `ffmpeg` engine, cropped to the app window by default.',
136518
136953
  anyOf: [
136519
136954
  {
136520
136955
  title: "Surface (by browser engine)",
@@ -136664,6 +137099,72 @@ var schemas_default = {
136664
137099
  ]
136665
137100
  }
136666
137101
  }
137102
+ },
137103
+ {
137104
+ title: "App surface",
137105
+ type: "object",
137106
+ additionalProperties: false,
137107
+ required: [
137108
+ "app"
137109
+ ],
137110
+ properties: {
137111
+ app: {
137112
+ type: "string",
137113
+ minLength: 1,
137114
+ pattern: "\\S",
137115
+ transform: [
137116
+ "trim"
137117
+ ],
137118
+ description: "Name of an app surface opened by `startSurface` (its `name`, or the default derived from the app identifier)."
137119
+ },
137120
+ window: {
137121
+ description: "Which app window to act on. Omit to use the active window. Apps have windows, no tabs.",
137122
+ title: "App window selector",
137123
+ anyOf: [
137124
+ {
137125
+ title: "By index",
137126
+ type: "integer",
137127
+ description: "Index in creation order. Negative counts from the end; `-1` is the newest (e.g. a dialog the app just opened)."
137128
+ },
137129
+ {
137130
+ title: "By name",
137131
+ type: "string",
137132
+ minLength: 1,
137133
+ pattern: "\\S",
137134
+ transform: [
137135
+ "trim"
137136
+ ],
137137
+ description: "Assigned window name. The integer branch is listed first because Ajv validates with coerceTypes \u2014 string-first would coerce integer indexes into name strings."
137138
+ },
137139
+ {
137140
+ title: "By criteria",
137141
+ type: "object",
137142
+ additionalProperties: false,
137143
+ minProperties: 1,
137144
+ properties: {
137145
+ name: {
137146
+ type: "string",
137147
+ minLength: 1,
137148
+ pattern: "\\S",
137149
+ transform: [
137150
+ "trim"
137151
+ ],
137152
+ description: "Assigned window name."
137153
+ },
137154
+ index: {
137155
+ type: "integer",
137156
+ description: "Index in creation order. Negative counts from the end."
137157
+ },
137158
+ title: {
137159
+ type: "string",
137160
+ minLength: 1,
137161
+ description: "Window title to match. Substring, or /regex/."
137162
+ }
137163
+ }
137164
+ }
137165
+ ]
137166
+ }
137167
+ }
136667
137168
  }
136668
137169
  ]
136669
137170
  },
@@ -136729,13 +137230,12 @@ var schemas_default = {
136729
137230
  },
136730
137231
  target: {
136731
137232
  type: "string",
136732
- description: "What the `ffmpeg` engine captures. `display` records the full screen, `window` the active window, `viewport` the browser content area. Ignored by the `browser` engine, which always captures its tab. `window` and `viewport` are best-effort (captured full-screen, then cropped).",
137233
+ description: "What the `ffmpeg` engine captures. `display` records the full screen, `window` the active window, `viewport` the browser content area. Ignored by the `browser` engine, which always captures its tab. `window` and `viewport` are best-effort (captured full-screen, then cropped). If unset, defaults to `window` when the recording's `surface` is an app surface and to `display` otherwise. `viewport` doesn't apply to app surfaces (they have no browser viewport).",
136733
137234
  enum: [
136734
137235
  "display",
136735
137236
  "window",
136736
137237
  "viewport"
136737
- ],
136738
- default: "display"
137238
+ ]
136739
137239
  },
136740
137240
  fps: {
136741
137241
  type: "integer",
@@ -136753,7 +137253,7 @@ var schemas_default = {
136753
137253
  {
136754
137254
  type: "boolean",
136755
137255
  title: "Record (boolean)",
136756
- description: "If `true`, starts recording \u2014 auto-selecting the `browser` engine for a visible Chrome context and the `ffmpeg` engine otherwise. If `false`, doesn't record."
137256
+ description: "If `true`, starts recording \u2014 auto-selecting the `browser` engine for a visible Chrome context, the device screen on Android/iOS contexts, and the `ffmpeg` engine otherwise. If `false`, doesn't record."
136757
137257
  }
136758
137258
  ],
136759
137259
  components: {
@@ -136771,7 +137271,7 @@ var schemas_default = {
136771
137271
  type: "object",
136772
137272
  properties: {
136773
137273
  surface: {
136774
- description: "The browser window/tab to record. Omit to record the active tab. The targeted tab stays focused afterward.",
137274
+ description: 'The browser window/tab or app window to record. Omit to record the active surface. The targeted surface stays focused afterward. App surfaces use the object form ({ "app": \u2026 }) and are captured via the `ffmpeg` engine, cropped to the app window by default.',
136775
137275
  anyOf: [
136776
137276
  {
136777
137277
  title: "Surface (by browser engine)",
@@ -136921,6 +137421,72 @@ var schemas_default = {
136921
137421
  ]
136922
137422
  }
136923
137423
  }
137424
+ },
137425
+ {
137426
+ title: "App surface",
137427
+ type: "object",
137428
+ additionalProperties: false,
137429
+ required: [
137430
+ "app"
137431
+ ],
137432
+ properties: {
137433
+ app: {
137434
+ type: "string",
137435
+ minLength: 1,
137436
+ pattern: "\\S",
137437
+ transform: [
137438
+ "trim"
137439
+ ],
137440
+ description: "Name of an app surface opened by `startSurface` (its `name`, or the default derived from the app identifier)."
137441
+ },
137442
+ window: {
137443
+ description: "Which app window to act on. Omit to use the active window. Apps have windows, no tabs.",
137444
+ title: "App window selector",
137445
+ anyOf: [
137446
+ {
137447
+ title: "By index",
137448
+ type: "integer",
137449
+ description: "Index in creation order. Negative counts from the end; `-1` is the newest (e.g. a dialog the app just opened)."
137450
+ },
137451
+ {
137452
+ title: "By name",
137453
+ type: "string",
137454
+ minLength: 1,
137455
+ pattern: "\\S",
137456
+ transform: [
137457
+ "trim"
137458
+ ],
137459
+ description: "Assigned window name. The integer branch is listed first because Ajv validates with coerceTypes \u2014 string-first would coerce integer indexes into name strings."
137460
+ },
137461
+ {
137462
+ title: "By criteria",
137463
+ type: "object",
137464
+ additionalProperties: false,
137465
+ minProperties: 1,
137466
+ properties: {
137467
+ name: {
137468
+ type: "string",
137469
+ minLength: 1,
137470
+ pattern: "\\S",
137471
+ transform: [
137472
+ "trim"
137473
+ ],
137474
+ description: "Assigned window name."
137475
+ },
137476
+ index: {
137477
+ type: "integer",
137478
+ description: "Index in creation order. Negative counts from the end."
137479
+ },
137480
+ title: {
137481
+ type: "string",
137482
+ minLength: 1,
137483
+ description: "Window title to match. Substring, or /regex/."
137484
+ }
137485
+ }
137486
+ }
137487
+ ]
137488
+ }
137489
+ }
136924
137490
  }
136925
137491
  ]
136926
137492
  },
@@ -136986,13 +137552,12 @@ var schemas_default = {
136986
137552
  },
136987
137553
  target: {
136988
137554
  type: "string",
136989
- description: "What the `ffmpeg` engine captures. `display` records the full screen, `window` the active window, `viewport` the browser content area. Ignored by the `browser` engine, which always captures its tab. `window` and `viewport` are best-effort (captured full-screen, then cropped).",
137555
+ description: "What the `ffmpeg` engine captures. `display` records the full screen, `window` the active window, `viewport` the browser content area. Ignored by the `browser` engine, which always captures its tab. `window` and `viewport` are best-effort (captured full-screen, then cropped). If unset, defaults to `window` when the recording's `surface` is an app surface and to `display` otherwise. `viewport` doesn't apply to app surfaces (they have no browser viewport).",
136990
137556
  enum: [
136991
137557
  "display",
136992
137558
  "window",
136993
137559
  "viewport"
136994
- ],
136995
- default: "display"
137560
+ ]
136996
137561
  },
136997
137562
  fps: {
136998
137563
  type: "integer",
@@ -137038,13 +137603,12 @@ var schemas_default = {
137038
137603
  },
137039
137604
  target: {
137040
137605
  type: "string",
137041
- description: "What the `ffmpeg` engine captures. `display` records the full screen, `window` the active window, `viewport` the browser content area. Ignored by the `browser` engine, which always captures its tab. `window` and `viewport` are best-effort (captured full-screen, then cropped).",
137606
+ description: "What the `ffmpeg` engine captures. `display` records the full screen, `window` the active window, `viewport` the browser content area. Ignored by the `browser` engine, which always captures its tab. `window` and `viewport` are best-effort (captured full-screen, then cropped). If unset, defaults to `window` when the recording's `surface` is an app surface and to `display` otherwise. `viewport` doesn't apply to app surfaces (they have no browser viewport).",
137042
137607
  enum: [
137043
137608
  "display",
137044
137609
  "window",
137045
137610
  "viewport"
137046
- ],
137047
- default: "display"
137611
+ ]
137048
137612
  },
137049
137613
  fps: {
137050
137614
  type: "integer",
@@ -137077,6 +137641,22 @@ var schemas_default = {
137077
137641
  target: "window",
137078
137642
  fps: 60
137079
137643
  }
137644
+ },
137645
+ {
137646
+ path: "notepad.mp4",
137647
+ surface: {
137648
+ app: "notepad"
137649
+ }
137650
+ },
137651
+ {
137652
+ path: "full-screen.mp4",
137653
+ surface: {
137654
+ app: "notepad"
137655
+ },
137656
+ engine: {
137657
+ name: "ffmpeg",
137658
+ target: "display"
137659
+ }
137080
137660
  }
137081
137661
  ]
137082
137662
  }
@@ -181081,7 +181661,7 @@ var schemas_default = {
181081
181661
  record: {
181082
181662
  $schema: "http://json-schema.org/draft-07/schema#",
181083
181663
  title: "record",
181084
- description: "Start recording. Must be followed by a `stopRecord` step. The `browser` engine captures the Chrome viewport (works under concurrency); the `ffmpeg` engine captures the screen and supports any application. Supported extensions: [ '.mp4', '.webm', '.gif' ]",
181664
+ description: "Start recording. Must be followed by a `stopRecord` step. The `browser` engine captures the Chrome viewport (works under concurrency); the `ffmpeg` engine captures the screen and supports any application. On Android/iOS contexts, recording captures the device screen through the device itself \u2014 `engine` doesn't apply. Supported extensions: [ '.mp4', '.webm', '.gif' ]",
181085
181665
  anyOf: [
181086
181666
  {
181087
181667
  title: "Record (simple)",
@@ -181096,7 +181676,7 @@ var schemas_default = {
181096
181676
  type: "object",
181097
181677
  properties: {
181098
181678
  surface: {
181099
- description: "The browser window/tab to record. Omit to record the active tab. The targeted tab stays focused afterward.",
181679
+ description: 'The browser window/tab or app window to record. Omit to record the active surface. The targeted surface stays focused afterward. App surfaces use the object form ({ "app": \u2026 }) and are captured via the `ffmpeg` engine, cropped to the app window by default.',
181100
181680
  anyOf: [
181101
181681
  {
181102
181682
  title: "Surface (by browser engine)",
@@ -181246,6 +181826,72 @@ var schemas_default = {
181246
181826
  ]
181247
181827
  }
181248
181828
  }
181829
+ },
181830
+ {
181831
+ title: "App surface",
181832
+ type: "object",
181833
+ additionalProperties: false,
181834
+ required: [
181835
+ "app"
181836
+ ],
181837
+ properties: {
181838
+ app: {
181839
+ type: "string",
181840
+ minLength: 1,
181841
+ pattern: "\\S",
181842
+ transform: [
181843
+ "trim"
181844
+ ],
181845
+ description: "Name of an app surface opened by `startSurface` (its `name`, or the default derived from the app identifier)."
181846
+ },
181847
+ window: {
181848
+ description: "Which app window to act on. Omit to use the active window. Apps have windows, no tabs.",
181849
+ title: "App window selector",
181850
+ anyOf: [
181851
+ {
181852
+ title: "By index",
181853
+ type: "integer",
181854
+ description: "Index in creation order. Negative counts from the end; `-1` is the newest (e.g. a dialog the app just opened)."
181855
+ },
181856
+ {
181857
+ title: "By name",
181858
+ type: "string",
181859
+ minLength: 1,
181860
+ pattern: "\\S",
181861
+ transform: [
181862
+ "trim"
181863
+ ],
181864
+ description: "Assigned window name. The integer branch is listed first because Ajv validates with coerceTypes \u2014 string-first would coerce integer indexes into name strings."
181865
+ },
181866
+ {
181867
+ title: "By criteria",
181868
+ type: "object",
181869
+ additionalProperties: false,
181870
+ minProperties: 1,
181871
+ properties: {
181872
+ name: {
181873
+ type: "string",
181874
+ minLength: 1,
181875
+ pattern: "\\S",
181876
+ transform: [
181877
+ "trim"
181878
+ ],
181879
+ description: "Assigned window name."
181880
+ },
181881
+ index: {
181882
+ type: "integer",
181883
+ description: "Index in creation order. Negative counts from the end."
181884
+ },
181885
+ title: {
181886
+ type: "string",
181887
+ minLength: 1,
181888
+ description: "Window title to match. Substring, or /regex/."
181889
+ }
181890
+ }
181891
+ }
181892
+ ]
181893
+ }
181894
+ }
181249
181895
  }
181250
181896
  ]
181251
181897
  },
@@ -181311,13 +181957,12 @@ var schemas_default = {
181311
181957
  },
181312
181958
  target: {
181313
181959
  type: "string",
181314
- description: "What the `ffmpeg` engine captures. `display` records the full screen, `window` the active window, `viewport` the browser content area. Ignored by the `browser` engine, which always captures its tab. `window` and `viewport` are best-effort (captured full-screen, then cropped).",
181960
+ description: "What the `ffmpeg` engine captures. `display` records the full screen, `window` the active window, `viewport` the browser content area. Ignored by the `browser` engine, which always captures its tab. `window` and `viewport` are best-effort (captured full-screen, then cropped). If unset, defaults to `window` when the recording's `surface` is an app surface and to `display` otherwise. `viewport` doesn't apply to app surfaces (they have no browser viewport).",
181315
181961
  enum: [
181316
181962
  "display",
181317
181963
  "window",
181318
181964
  "viewport"
181319
- ],
181320
- default: "display"
181965
+ ]
181321
181966
  },
181322
181967
  fps: {
181323
181968
  type: "integer",
@@ -181335,7 +181980,7 @@ var schemas_default = {
181335
181980
  {
181336
181981
  type: "boolean",
181337
181982
  title: "Record (boolean)",
181338
- description: "If `true`, starts recording \u2014 auto-selecting the `browser` engine for a visible Chrome context and the `ffmpeg` engine otherwise. If `false`, doesn't record."
181983
+ description: "If `true`, starts recording \u2014 auto-selecting the `browser` engine for a visible Chrome context, the device screen on Android/iOS contexts, and the `ffmpeg` engine otherwise. If `false`, doesn't record."
181339
181984
  }
181340
181985
  ],
181341
181986
  components: {
@@ -181353,7 +181998,7 @@ var schemas_default = {
181353
181998
  type: "object",
181354
181999
  properties: {
181355
182000
  surface: {
181356
- description: "The browser window/tab to record. Omit to record the active tab. The targeted tab stays focused afterward.",
182001
+ description: 'The browser window/tab or app window to record. Omit to record the active surface. The targeted surface stays focused afterward. App surfaces use the object form ({ "app": \u2026 }) and are captured via the `ffmpeg` engine, cropped to the app window by default.',
181357
182002
  anyOf: [
181358
182003
  {
181359
182004
  title: "Surface (by browser engine)",
@@ -181503,6 +182148,72 @@ var schemas_default = {
181503
182148
  ]
181504
182149
  }
181505
182150
  }
182151
+ },
182152
+ {
182153
+ title: "App surface",
182154
+ type: "object",
182155
+ additionalProperties: false,
182156
+ required: [
182157
+ "app"
182158
+ ],
182159
+ properties: {
182160
+ app: {
182161
+ type: "string",
182162
+ minLength: 1,
182163
+ pattern: "\\S",
182164
+ transform: [
182165
+ "trim"
182166
+ ],
182167
+ description: "Name of an app surface opened by `startSurface` (its `name`, or the default derived from the app identifier)."
182168
+ },
182169
+ window: {
182170
+ description: "Which app window to act on. Omit to use the active window. Apps have windows, no tabs.",
182171
+ title: "App window selector",
182172
+ anyOf: [
182173
+ {
182174
+ title: "By index",
182175
+ type: "integer",
182176
+ description: "Index in creation order. Negative counts from the end; `-1` is the newest (e.g. a dialog the app just opened)."
182177
+ },
182178
+ {
182179
+ title: "By name",
182180
+ type: "string",
182181
+ minLength: 1,
182182
+ pattern: "\\S",
182183
+ transform: [
182184
+ "trim"
182185
+ ],
182186
+ description: "Assigned window name. The integer branch is listed first because Ajv validates with coerceTypes \u2014 string-first would coerce integer indexes into name strings."
182187
+ },
182188
+ {
182189
+ title: "By criteria",
182190
+ type: "object",
182191
+ additionalProperties: false,
182192
+ minProperties: 1,
182193
+ properties: {
182194
+ name: {
182195
+ type: "string",
182196
+ minLength: 1,
182197
+ pattern: "\\S",
182198
+ transform: [
182199
+ "trim"
182200
+ ],
182201
+ description: "Assigned window name."
182202
+ },
182203
+ index: {
182204
+ type: "integer",
182205
+ description: "Index in creation order. Negative counts from the end."
182206
+ },
182207
+ title: {
182208
+ type: "string",
182209
+ minLength: 1,
182210
+ description: "Window title to match. Substring, or /regex/."
182211
+ }
182212
+ }
182213
+ }
182214
+ ]
182215
+ }
182216
+ }
181506
182217
  }
181507
182218
  ]
181508
182219
  },
@@ -181568,13 +182279,12 @@ var schemas_default = {
181568
182279
  },
181569
182280
  target: {
181570
182281
  type: "string",
181571
- description: "What the `ffmpeg` engine captures. `display` records the full screen, `window` the active window, `viewport` the browser content area. Ignored by the `browser` engine, which always captures its tab. `window` and `viewport` are best-effort (captured full-screen, then cropped).",
182282
+ description: "What the `ffmpeg` engine captures. `display` records the full screen, `window` the active window, `viewport` the browser content area. Ignored by the `browser` engine, which always captures its tab. `window` and `viewport` are best-effort (captured full-screen, then cropped). If unset, defaults to `window` when the recording's `surface` is an app surface and to `display` otherwise. `viewport` doesn't apply to app surfaces (they have no browser viewport).",
181572
182283
  enum: [
181573
182284
  "display",
181574
182285
  "window",
181575
182286
  "viewport"
181576
- ],
181577
- default: "display"
182287
+ ]
181578
182288
  },
181579
182289
  fps: {
181580
182290
  type: "integer",
@@ -181620,13 +182330,12 @@ var schemas_default = {
181620
182330
  },
181621
182331
  target: {
181622
182332
  type: "string",
181623
- description: "What the `ffmpeg` engine captures. `display` records the full screen, `window` the active window, `viewport` the browser content area. Ignored by the `browser` engine, which always captures its tab. `window` and `viewport` are best-effort (captured full-screen, then cropped).",
182333
+ description: "What the `ffmpeg` engine captures. `display` records the full screen, `window` the active window, `viewport` the browser content area. Ignored by the `browser` engine, which always captures its tab. `window` and `viewport` are best-effort (captured full-screen, then cropped). If unset, defaults to `window` when the recording's `surface` is an app surface and to `display` otherwise. `viewport` doesn't apply to app surfaces (they have no browser viewport).",
181624
182334
  enum: [
181625
182335
  "display",
181626
182336
  "window",
181627
182337
  "viewport"
181628
- ],
181629
- default: "display"
182338
+ ]
181630
182339
  },
181631
182340
  fps: {
181632
182341
  type: "integer",
@@ -181659,6 +182368,22 @@ var schemas_default = {
181659
182368
  target: "window",
181660
182369
  fps: 60
181661
182370
  }
182371
+ },
182372
+ {
182373
+ path: "notepad.mp4",
182374
+ surface: {
182375
+ app: "notepad"
182376
+ }
182377
+ },
182378
+ {
182379
+ path: "full-screen.mp4",
182380
+ surface: {
182381
+ app: "notepad"
182382
+ },
182383
+ engine: {
182384
+ name: "ffmpeg",
182385
+ target: "display"
182386
+ }
181662
182387
  }
181663
182388
  ]
181664
182389
  }
@@ -227436,7 +228161,7 @@ var schemas_default = {
227436
228161
  record: {
227437
228162
  $schema: "http://json-schema.org/draft-07/schema#",
227438
228163
  title: "record",
227439
- description: "Start recording. Must be followed by a `stopRecord` step. The `browser` engine captures the Chrome viewport (works under concurrency); the `ffmpeg` engine captures the screen and supports any application. Supported extensions: [ '.mp4', '.webm', '.gif' ]",
228164
+ description: "Start recording. Must be followed by a `stopRecord` step. The `browser` engine captures the Chrome viewport (works under concurrency); the `ffmpeg` engine captures the screen and supports any application. On Android/iOS contexts, recording captures the device screen through the device itself \u2014 `engine` doesn't apply. Supported extensions: [ '.mp4', '.webm', '.gif' ]",
227440
228165
  anyOf: [
227441
228166
  {
227442
228167
  title: "Record (simple)",
@@ -227451,7 +228176,7 @@ var schemas_default = {
227451
228176
  type: "object",
227452
228177
  properties: {
227453
228178
  surface: {
227454
- description: "The browser window/tab to record. Omit to record the active tab. The targeted tab stays focused afterward.",
228179
+ description: 'The browser window/tab or app window to record. Omit to record the active surface. The targeted surface stays focused afterward. App surfaces use the object form ({ "app": \u2026 }) and are captured via the `ffmpeg` engine, cropped to the app window by default.',
227455
228180
  anyOf: [
227456
228181
  {
227457
228182
  title: "Surface (by browser engine)",
@@ -227601,6 +228326,72 @@ var schemas_default = {
227601
228326
  ]
227602
228327
  }
227603
228328
  }
228329
+ },
228330
+ {
228331
+ title: "App surface",
228332
+ type: "object",
228333
+ additionalProperties: false,
228334
+ required: [
228335
+ "app"
228336
+ ],
228337
+ properties: {
228338
+ app: {
228339
+ type: "string",
228340
+ minLength: 1,
228341
+ pattern: "\\S",
228342
+ transform: [
228343
+ "trim"
228344
+ ],
228345
+ description: "Name of an app surface opened by `startSurface` (its `name`, or the default derived from the app identifier)."
228346
+ },
228347
+ window: {
228348
+ description: "Which app window to act on. Omit to use the active window. Apps have windows, no tabs.",
228349
+ title: "App window selector",
228350
+ anyOf: [
228351
+ {
228352
+ title: "By index",
228353
+ type: "integer",
228354
+ description: "Index in creation order. Negative counts from the end; `-1` is the newest (e.g. a dialog the app just opened)."
228355
+ },
228356
+ {
228357
+ title: "By name",
228358
+ type: "string",
228359
+ minLength: 1,
228360
+ pattern: "\\S",
228361
+ transform: [
228362
+ "trim"
228363
+ ],
228364
+ description: "Assigned window name. The integer branch is listed first because Ajv validates with coerceTypes \u2014 string-first would coerce integer indexes into name strings."
228365
+ },
228366
+ {
228367
+ title: "By criteria",
228368
+ type: "object",
228369
+ additionalProperties: false,
228370
+ minProperties: 1,
228371
+ properties: {
228372
+ name: {
228373
+ type: "string",
228374
+ minLength: 1,
228375
+ pattern: "\\S",
228376
+ transform: [
228377
+ "trim"
228378
+ ],
228379
+ description: "Assigned window name."
228380
+ },
228381
+ index: {
228382
+ type: "integer",
228383
+ description: "Index in creation order. Negative counts from the end."
228384
+ },
228385
+ title: {
228386
+ type: "string",
228387
+ minLength: 1,
228388
+ description: "Window title to match. Substring, or /regex/."
228389
+ }
228390
+ }
228391
+ }
228392
+ ]
228393
+ }
228394
+ }
227604
228395
  }
227605
228396
  ]
227606
228397
  },
@@ -227666,13 +228457,12 @@ var schemas_default = {
227666
228457
  },
227667
228458
  target: {
227668
228459
  type: "string",
227669
- description: "What the `ffmpeg` engine captures. `display` records the full screen, `window` the active window, `viewport` the browser content area. Ignored by the `browser` engine, which always captures its tab. `window` and `viewport` are best-effort (captured full-screen, then cropped).",
228460
+ description: "What the `ffmpeg` engine captures. `display` records the full screen, `window` the active window, `viewport` the browser content area. Ignored by the `browser` engine, which always captures its tab. `window` and `viewport` are best-effort (captured full-screen, then cropped). If unset, defaults to `window` when the recording's `surface` is an app surface and to `display` otherwise. `viewport` doesn't apply to app surfaces (they have no browser viewport).",
227670
228461
  enum: [
227671
228462
  "display",
227672
228463
  "window",
227673
228464
  "viewport"
227674
- ],
227675
- default: "display"
228465
+ ]
227676
228466
  },
227677
228467
  fps: {
227678
228468
  type: "integer",
@@ -227690,7 +228480,7 @@ var schemas_default = {
227690
228480
  {
227691
228481
  type: "boolean",
227692
228482
  title: "Record (boolean)",
227693
- description: "If `true`, starts recording \u2014 auto-selecting the `browser` engine for a visible Chrome context and the `ffmpeg` engine otherwise. If `false`, doesn't record."
228483
+ description: "If `true`, starts recording \u2014 auto-selecting the `browser` engine for a visible Chrome context, the device screen on Android/iOS contexts, and the `ffmpeg` engine otherwise. If `false`, doesn't record."
227694
228484
  }
227695
228485
  ],
227696
228486
  components: {
@@ -227708,7 +228498,7 @@ var schemas_default = {
227708
228498
  type: "object",
227709
228499
  properties: {
227710
228500
  surface: {
227711
- description: "The browser window/tab to record. Omit to record the active tab. The targeted tab stays focused afterward.",
228501
+ description: 'The browser window/tab or app window to record. Omit to record the active surface. The targeted surface stays focused afterward. App surfaces use the object form ({ "app": \u2026 }) and are captured via the `ffmpeg` engine, cropped to the app window by default.',
227712
228502
  anyOf: [
227713
228503
  {
227714
228504
  title: "Surface (by browser engine)",
@@ -227805,14 +228595,85 @@ var schemas_default = {
227805
228595
  }
227806
228596
  ]
227807
228597
  },
227808
- tab: {
227809
- description: "Which tab to act on. Omit to use the active tab. Without `window`, the selector searches every tab in creation order \u2014 including tabs the page opened itself.",
227810
- title: "Window/tab selector",
228598
+ tab: {
228599
+ description: "Which tab to act on. Omit to use the active tab. Without `window`, the selector searches every tab in creation order \u2014 including tabs the page opened itself.",
228600
+ title: "Window/tab selector",
228601
+ anyOf: [
228602
+ {
228603
+ title: "By index",
228604
+ type: "integer",
228605
+ description: "Index in creation order. Negative counts from the end; `-1` is the newest."
228606
+ },
228607
+ {
228608
+ title: "By name",
228609
+ type: "string",
228610
+ minLength: 1,
228611
+ pattern: "\\S",
228612
+ transform: [
228613
+ "trim"
228614
+ ],
228615
+ description: "Name assigned when the window/tab was opened (goTo `newTab`/`newWindow`). The integer branch is listed first because Ajv validates with coerceTypes \u2014 string-first would coerce integer indexes into name strings."
228616
+ },
228617
+ {
228618
+ title: "By criteria",
228619
+ type: "object",
228620
+ additionalProperties: false,
228621
+ minProperties: 1,
228622
+ properties: {
228623
+ name: {
228624
+ type: "string",
228625
+ minLength: 1,
228626
+ pattern: "\\S",
228627
+ transform: [
228628
+ "trim"
228629
+ ],
228630
+ description: "Name assigned when the window/tab was opened."
228631
+ },
228632
+ index: {
228633
+ type: "integer",
228634
+ description: "Index in creation order. Negative counts from the end."
228635
+ },
228636
+ title: {
228637
+ type: "string",
228638
+ minLength: 1,
228639
+ description: "Page title to match. Substring, or /regex/."
228640
+ },
228641
+ url: {
228642
+ type: "string",
228643
+ minLength: 1,
228644
+ description: "Page URL to match. Substring, or /regex/."
228645
+ }
228646
+ }
228647
+ }
228648
+ ]
228649
+ }
228650
+ }
228651
+ },
228652
+ {
228653
+ title: "App surface",
228654
+ type: "object",
228655
+ additionalProperties: false,
228656
+ required: [
228657
+ "app"
228658
+ ],
228659
+ properties: {
228660
+ app: {
228661
+ type: "string",
228662
+ minLength: 1,
228663
+ pattern: "\\S",
228664
+ transform: [
228665
+ "trim"
228666
+ ],
228667
+ description: "Name of an app surface opened by `startSurface` (its `name`, or the default derived from the app identifier)."
228668
+ },
228669
+ window: {
228670
+ description: "Which app window to act on. Omit to use the active window. Apps have windows, no tabs.",
228671
+ title: "App window selector",
227811
228672
  anyOf: [
227812
228673
  {
227813
228674
  title: "By index",
227814
228675
  type: "integer",
227815
- description: "Index in creation order. Negative counts from the end; `-1` is the newest."
228676
+ description: "Index in creation order. Negative counts from the end; `-1` is the newest (e.g. a dialog the app just opened)."
227816
228677
  },
227817
228678
  {
227818
228679
  title: "By name",
@@ -227822,7 +228683,7 @@ var schemas_default = {
227822
228683
  transform: [
227823
228684
  "trim"
227824
228685
  ],
227825
- description: "Name assigned when the window/tab was opened (goTo `newTab`/`newWindow`). The integer branch is listed first because Ajv validates with coerceTypes \u2014 string-first would coerce integer indexes into name strings."
228686
+ description: "Assigned window name. The integer branch is listed first because Ajv validates with coerceTypes \u2014 string-first would coerce integer indexes into name strings."
227826
228687
  },
227827
228688
  {
227828
228689
  title: "By criteria",
@@ -227837,7 +228698,7 @@ var schemas_default = {
227837
228698
  transform: [
227838
228699
  "trim"
227839
228700
  ],
227840
- description: "Name assigned when the window/tab was opened."
228701
+ description: "Assigned window name."
227841
228702
  },
227842
228703
  index: {
227843
228704
  type: "integer",
@@ -227846,12 +228707,7 @@ var schemas_default = {
227846
228707
  title: {
227847
228708
  type: "string",
227848
228709
  minLength: 1,
227849
- description: "Page title to match. Substring, or /regex/."
227850
- },
227851
- url: {
227852
- type: "string",
227853
- minLength: 1,
227854
- description: "Page URL to match. Substring, or /regex/."
228710
+ description: "Window title to match. Substring, or /regex/."
227855
228711
  }
227856
228712
  }
227857
228713
  }
@@ -227923,13 +228779,12 @@ var schemas_default = {
227923
228779
  },
227924
228780
  target: {
227925
228781
  type: "string",
227926
- description: "What the `ffmpeg` engine captures. `display` records the full screen, `window` the active window, `viewport` the browser content area. Ignored by the `browser` engine, which always captures its tab. `window` and `viewport` are best-effort (captured full-screen, then cropped).",
228782
+ description: "What the `ffmpeg` engine captures. `display` records the full screen, `window` the active window, `viewport` the browser content area. Ignored by the `browser` engine, which always captures its tab. `window` and `viewport` are best-effort (captured full-screen, then cropped). If unset, defaults to `window` when the recording's `surface` is an app surface and to `display` otherwise. `viewport` doesn't apply to app surfaces (they have no browser viewport).",
227927
228783
  enum: [
227928
228784
  "display",
227929
228785
  "window",
227930
228786
  "viewport"
227931
- ],
227932
- default: "display"
228787
+ ]
227933
228788
  },
227934
228789
  fps: {
227935
228790
  type: "integer",
@@ -227975,13 +228830,12 @@ var schemas_default = {
227975
228830
  },
227976
228831
  target: {
227977
228832
  type: "string",
227978
- description: "What the `ffmpeg` engine captures. `display` records the full screen, `window` the active window, `viewport` the browser content area. Ignored by the `browser` engine, which always captures its tab. `window` and `viewport` are best-effort (captured full-screen, then cropped).",
228833
+ description: "What the `ffmpeg` engine captures. `display` records the full screen, `window` the active window, `viewport` the browser content area. Ignored by the `browser` engine, which always captures its tab. `window` and `viewport` are best-effort (captured full-screen, then cropped). If unset, defaults to `window` when the recording's `surface` is an app surface and to `display` otherwise. `viewport` doesn't apply to app surfaces (they have no browser viewport).",
227979
228834
  enum: [
227980
228835
  "display",
227981
228836
  "window",
227982
228837
  "viewport"
227983
- ],
227984
- default: "display"
228838
+ ]
227985
228839
  },
227986
228840
  fps: {
227987
228841
  type: "integer",
@@ -228014,6 +228868,22 @@ var schemas_default = {
228014
228868
  target: "window",
228015
228869
  fps: 60
228016
228870
  }
228871
+ },
228872
+ {
228873
+ path: "notepad.mp4",
228874
+ surface: {
228875
+ app: "notepad"
228876
+ }
228877
+ },
228878
+ {
228879
+ path: "full-screen.mp4",
228880
+ surface: {
228881
+ app: "notepad"
228882
+ },
228883
+ engine: {
228884
+ name: "ffmpeg",
228885
+ target: "display"
228886
+ }
228017
228887
  }
228018
228888
  ]
228019
228889
  }
@@ -271317,7 +272187,7 @@ var schemas_default = {
271317
272187
  record: {
271318
272188
  $schema: "http://json-schema.org/draft-07/schema#",
271319
272189
  title: "record",
271320
- description: "Start recording. Must be followed by a `stopRecord` step. The `browser` engine captures the Chrome viewport (works under concurrency); the `ffmpeg` engine captures the screen and supports any application. Supported extensions: [ '.mp4', '.webm', '.gif' ]",
272190
+ description: "Start recording. Must be followed by a `stopRecord` step. The `browser` engine captures the Chrome viewport (works under concurrency); the `ffmpeg` engine captures the screen and supports any application. On Android/iOS contexts, recording captures the device screen through the device itself \u2014 `engine` doesn't apply. Supported extensions: [ '.mp4', '.webm', '.gif' ]",
271321
272191
  anyOf: [
271322
272192
  {
271323
272193
  title: "Record (simple)",
@@ -271332,7 +272202,7 @@ var schemas_default = {
271332
272202
  type: "object",
271333
272203
  properties: {
271334
272204
  surface: {
271335
- description: "The browser window/tab to record. Omit to record the active tab. The targeted tab stays focused afterward.",
272205
+ description: 'The browser window/tab or app window to record. Omit to record the active surface. The targeted surface stays focused afterward. App surfaces use the object form ({ "app": \u2026 }) and are captured via the `ffmpeg` engine, cropped to the app window by default.',
271336
272206
  anyOf: [
271337
272207
  {
271338
272208
  title: "Surface (by browser engine)",
@@ -271482,6 +272352,72 @@ var schemas_default = {
271482
272352
  ]
271483
272353
  }
271484
272354
  }
272355
+ },
272356
+ {
272357
+ title: "App surface",
272358
+ type: "object",
272359
+ additionalProperties: false,
272360
+ required: [
272361
+ "app"
272362
+ ],
272363
+ properties: {
272364
+ app: {
272365
+ type: "string",
272366
+ minLength: 1,
272367
+ pattern: "\\S",
272368
+ transform: [
272369
+ "trim"
272370
+ ],
272371
+ description: "Name of an app surface opened by `startSurface` (its `name`, or the default derived from the app identifier)."
272372
+ },
272373
+ window: {
272374
+ description: "Which app window to act on. Omit to use the active window. Apps have windows, no tabs.",
272375
+ title: "App window selector",
272376
+ anyOf: [
272377
+ {
272378
+ title: "By index",
272379
+ type: "integer",
272380
+ description: "Index in creation order. Negative counts from the end; `-1` is the newest (e.g. a dialog the app just opened)."
272381
+ },
272382
+ {
272383
+ title: "By name",
272384
+ type: "string",
272385
+ minLength: 1,
272386
+ pattern: "\\S",
272387
+ transform: [
272388
+ "trim"
272389
+ ],
272390
+ description: "Assigned window name. The integer branch is listed first because Ajv validates with coerceTypes \u2014 string-first would coerce integer indexes into name strings."
272391
+ },
272392
+ {
272393
+ title: "By criteria",
272394
+ type: "object",
272395
+ additionalProperties: false,
272396
+ minProperties: 1,
272397
+ properties: {
272398
+ name: {
272399
+ type: "string",
272400
+ minLength: 1,
272401
+ pattern: "\\S",
272402
+ transform: [
272403
+ "trim"
272404
+ ],
272405
+ description: "Assigned window name."
272406
+ },
272407
+ index: {
272408
+ type: "integer",
272409
+ description: "Index in creation order. Negative counts from the end."
272410
+ },
272411
+ title: {
272412
+ type: "string",
272413
+ minLength: 1,
272414
+ description: "Window title to match. Substring, or /regex/."
272415
+ }
272416
+ }
272417
+ }
272418
+ ]
272419
+ }
272420
+ }
271485
272421
  }
271486
272422
  ]
271487
272423
  },
@@ -271547,13 +272483,12 @@ var schemas_default = {
271547
272483
  },
271548
272484
  target: {
271549
272485
  type: "string",
271550
- description: "What the `ffmpeg` engine captures. `display` records the full screen, `window` the active window, `viewport` the browser content area. Ignored by the `browser` engine, which always captures its tab. `window` and `viewport` are best-effort (captured full-screen, then cropped).",
272486
+ description: "What the `ffmpeg` engine captures. `display` records the full screen, `window` the active window, `viewport` the browser content area. Ignored by the `browser` engine, which always captures its tab. `window` and `viewport` are best-effort (captured full-screen, then cropped). If unset, defaults to `window` when the recording's `surface` is an app surface and to `display` otherwise. `viewport` doesn't apply to app surfaces (they have no browser viewport).",
271551
272487
  enum: [
271552
272488
  "display",
271553
272489
  "window",
271554
272490
  "viewport"
271555
- ],
271556
- default: "display"
272491
+ ]
271557
272492
  },
271558
272493
  fps: {
271559
272494
  type: "integer",
@@ -271571,7 +272506,7 @@ var schemas_default = {
271571
272506
  {
271572
272507
  type: "boolean",
271573
272508
  title: "Record (boolean)",
271574
- description: "If `true`, starts recording \u2014 auto-selecting the `browser` engine for a visible Chrome context and the `ffmpeg` engine otherwise. If `false`, doesn't record."
272509
+ description: "If `true`, starts recording \u2014 auto-selecting the `browser` engine for a visible Chrome context, the device screen on Android/iOS contexts, and the `ffmpeg` engine otherwise. If `false`, doesn't record."
271575
272510
  }
271576
272511
  ],
271577
272512
  components: {
@@ -271589,7 +272524,7 @@ var schemas_default = {
271589
272524
  type: "object",
271590
272525
  properties: {
271591
272526
  surface: {
271592
- description: "The browser window/tab to record. Omit to record the active tab. The targeted tab stays focused afterward.",
272527
+ description: 'The browser window/tab or app window to record. Omit to record the active surface. The targeted surface stays focused afterward. App surfaces use the object form ({ "app": \u2026 }) and are captured via the `ffmpeg` engine, cropped to the app window by default.',
271593
272528
  anyOf: [
271594
272529
  {
271595
272530
  title: "Surface (by browser engine)",
@@ -271739,6 +272674,72 @@ var schemas_default = {
271739
272674
  ]
271740
272675
  }
271741
272676
  }
272677
+ },
272678
+ {
272679
+ title: "App surface",
272680
+ type: "object",
272681
+ additionalProperties: false,
272682
+ required: [
272683
+ "app"
272684
+ ],
272685
+ properties: {
272686
+ app: {
272687
+ type: "string",
272688
+ minLength: 1,
272689
+ pattern: "\\S",
272690
+ transform: [
272691
+ "trim"
272692
+ ],
272693
+ description: "Name of an app surface opened by `startSurface` (its `name`, or the default derived from the app identifier)."
272694
+ },
272695
+ window: {
272696
+ description: "Which app window to act on. Omit to use the active window. Apps have windows, no tabs.",
272697
+ title: "App window selector",
272698
+ anyOf: [
272699
+ {
272700
+ title: "By index",
272701
+ type: "integer",
272702
+ description: "Index in creation order. Negative counts from the end; `-1` is the newest (e.g. a dialog the app just opened)."
272703
+ },
272704
+ {
272705
+ title: "By name",
272706
+ type: "string",
272707
+ minLength: 1,
272708
+ pattern: "\\S",
272709
+ transform: [
272710
+ "trim"
272711
+ ],
272712
+ description: "Assigned window name. The integer branch is listed first because Ajv validates with coerceTypes \u2014 string-first would coerce integer indexes into name strings."
272713
+ },
272714
+ {
272715
+ title: "By criteria",
272716
+ type: "object",
272717
+ additionalProperties: false,
272718
+ minProperties: 1,
272719
+ properties: {
272720
+ name: {
272721
+ type: "string",
272722
+ minLength: 1,
272723
+ pattern: "\\S",
272724
+ transform: [
272725
+ "trim"
272726
+ ],
272727
+ description: "Assigned window name."
272728
+ },
272729
+ index: {
272730
+ type: "integer",
272731
+ description: "Index in creation order. Negative counts from the end."
272732
+ },
272733
+ title: {
272734
+ type: "string",
272735
+ minLength: 1,
272736
+ description: "Window title to match. Substring, or /regex/."
272737
+ }
272738
+ }
272739
+ }
272740
+ ]
272741
+ }
272742
+ }
271742
272743
  }
271743
272744
  ]
271744
272745
  },
@@ -271804,13 +272805,12 @@ var schemas_default = {
271804
272805
  },
271805
272806
  target: {
271806
272807
  type: "string",
271807
- description: "What the `ffmpeg` engine captures. `display` records the full screen, `window` the active window, `viewport` the browser content area. Ignored by the `browser` engine, which always captures its tab. `window` and `viewport` are best-effort (captured full-screen, then cropped).",
272808
+ description: "What the `ffmpeg` engine captures. `display` records the full screen, `window` the active window, `viewport` the browser content area. Ignored by the `browser` engine, which always captures its tab. `window` and `viewport` are best-effort (captured full-screen, then cropped). If unset, defaults to `window` when the recording's `surface` is an app surface and to `display` otherwise. `viewport` doesn't apply to app surfaces (they have no browser viewport).",
271808
272809
  enum: [
271809
272810
  "display",
271810
272811
  "window",
271811
272812
  "viewport"
271812
- ],
271813
- default: "display"
272813
+ ]
271814
272814
  },
271815
272815
  fps: {
271816
272816
  type: "integer",
@@ -271856,13 +272856,12 @@ var schemas_default = {
271856
272856
  },
271857
272857
  target: {
271858
272858
  type: "string",
271859
- description: "What the `ffmpeg` engine captures. `display` records the full screen, `window` the active window, `viewport` the browser content area. Ignored by the `browser` engine, which always captures its tab. `window` and `viewport` are best-effort (captured full-screen, then cropped).",
272859
+ description: "What the `ffmpeg` engine captures. `display` records the full screen, `window` the active window, `viewport` the browser content area. Ignored by the `browser` engine, which always captures its tab. `window` and `viewport` are best-effort (captured full-screen, then cropped). If unset, defaults to `window` when the recording's `surface` is an app surface and to `display` otherwise. `viewport` doesn't apply to app surfaces (they have no browser viewport).",
271860
272860
  enum: [
271861
272861
  "display",
271862
272862
  "window",
271863
272863
  "viewport"
271864
- ],
271865
- default: "display"
272864
+ ]
271866
272865
  },
271867
272866
  fps: {
271868
272867
  type: "integer",
@@ -271895,6 +272894,22 @@ var schemas_default = {
271895
272894
  target: "window",
271896
272895
  fps: 60
271897
272896
  }
272897
+ },
272898
+ {
272899
+ path: "notepad.mp4",
272900
+ surface: {
272901
+ app: "notepad"
272902
+ }
272903
+ },
272904
+ {
272905
+ path: "full-screen.mp4",
272906
+ surface: {
272907
+ app: "notepad"
272908
+ },
272909
+ engine: {
272910
+ name: "ffmpeg",
272911
+ target: "display"
272912
+ }
271898
272913
  }
271899
272914
  ]
271900
272915
  }
@@ -318159,7 +319174,7 @@ var schemas_default = {
318159
319174
  record: {
318160
319175
  $schema: "http://json-schema.org/draft-07/schema#",
318161
319176
  title: "record",
318162
- description: "Start recording. Must be followed by a `stopRecord` step. The `browser` engine captures the Chrome viewport (works under concurrency); the `ffmpeg` engine captures the screen and supports any application. Supported extensions: [ '.mp4', '.webm', '.gif' ]",
319177
+ description: "Start recording. Must be followed by a `stopRecord` step. The `browser` engine captures the Chrome viewport (works under concurrency); the `ffmpeg` engine captures the screen and supports any application. On Android/iOS contexts, recording captures the device screen through the device itself \u2014 `engine` doesn't apply. Supported extensions: [ '.mp4', '.webm', '.gif' ]",
318163
319178
  anyOf: [
318164
319179
  {
318165
319180
  title: "Record (simple)",
@@ -318174,7 +319189,7 @@ var schemas_default = {
318174
319189
  type: "object",
318175
319190
  properties: {
318176
319191
  surface: {
318177
- description: "The browser window/tab to record. Omit to record the active tab. The targeted tab stays focused afterward.",
319192
+ description: 'The browser window/tab or app window to record. Omit to record the active surface. The targeted surface stays focused afterward. App surfaces use the object form ({ "app": \u2026 }) and are captured via the `ffmpeg` engine, cropped to the app window by default.',
318178
319193
  anyOf: [
318179
319194
  {
318180
319195
  title: "Surface (by browser engine)",
@@ -318271,14 +319286,85 @@ var schemas_default = {
318271
319286
  }
318272
319287
  ]
318273
319288
  },
318274
- tab: {
318275
- description: "Which tab to act on. Omit to use the active tab. Without `window`, the selector searches every tab in creation order \u2014 including tabs the page opened itself.",
318276
- title: "Window/tab selector",
319289
+ tab: {
319290
+ description: "Which tab to act on. Omit to use the active tab. Without `window`, the selector searches every tab in creation order \u2014 including tabs the page opened itself.",
319291
+ title: "Window/tab selector",
319292
+ anyOf: [
319293
+ {
319294
+ title: "By index",
319295
+ type: "integer",
319296
+ description: "Index in creation order. Negative counts from the end; `-1` is the newest."
319297
+ },
319298
+ {
319299
+ title: "By name",
319300
+ type: "string",
319301
+ minLength: 1,
319302
+ pattern: "\\S",
319303
+ transform: [
319304
+ "trim"
319305
+ ],
319306
+ description: "Name assigned when the window/tab was opened (goTo `newTab`/`newWindow`). The integer branch is listed first because Ajv validates with coerceTypes \u2014 string-first would coerce integer indexes into name strings."
319307
+ },
319308
+ {
319309
+ title: "By criteria",
319310
+ type: "object",
319311
+ additionalProperties: false,
319312
+ minProperties: 1,
319313
+ properties: {
319314
+ name: {
319315
+ type: "string",
319316
+ minLength: 1,
319317
+ pattern: "\\S",
319318
+ transform: [
319319
+ "trim"
319320
+ ],
319321
+ description: "Name assigned when the window/tab was opened."
319322
+ },
319323
+ index: {
319324
+ type: "integer",
319325
+ description: "Index in creation order. Negative counts from the end."
319326
+ },
319327
+ title: {
319328
+ type: "string",
319329
+ minLength: 1,
319330
+ description: "Page title to match. Substring, or /regex/."
319331
+ },
319332
+ url: {
319333
+ type: "string",
319334
+ minLength: 1,
319335
+ description: "Page URL to match. Substring, or /regex/."
319336
+ }
319337
+ }
319338
+ }
319339
+ ]
319340
+ }
319341
+ }
319342
+ },
319343
+ {
319344
+ title: "App surface",
319345
+ type: "object",
319346
+ additionalProperties: false,
319347
+ required: [
319348
+ "app"
319349
+ ],
319350
+ properties: {
319351
+ app: {
319352
+ type: "string",
319353
+ minLength: 1,
319354
+ pattern: "\\S",
319355
+ transform: [
319356
+ "trim"
319357
+ ],
319358
+ description: "Name of an app surface opened by `startSurface` (its `name`, or the default derived from the app identifier)."
319359
+ },
319360
+ window: {
319361
+ description: "Which app window to act on. Omit to use the active window. Apps have windows, no tabs.",
319362
+ title: "App window selector",
318277
319363
  anyOf: [
318278
319364
  {
318279
319365
  title: "By index",
318280
319366
  type: "integer",
318281
- description: "Index in creation order. Negative counts from the end; `-1` is the newest."
319367
+ description: "Index in creation order. Negative counts from the end; `-1` is the newest (e.g. a dialog the app just opened)."
318282
319368
  },
318283
319369
  {
318284
319370
  title: "By name",
@@ -318288,7 +319374,7 @@ var schemas_default = {
318288
319374
  transform: [
318289
319375
  "trim"
318290
319376
  ],
318291
- description: "Name assigned when the window/tab was opened (goTo `newTab`/`newWindow`). The integer branch is listed first because Ajv validates with coerceTypes \u2014 string-first would coerce integer indexes into name strings."
319377
+ description: "Assigned window name. The integer branch is listed first because Ajv validates with coerceTypes \u2014 string-first would coerce integer indexes into name strings."
318292
319378
  },
318293
319379
  {
318294
319380
  title: "By criteria",
@@ -318303,7 +319389,7 @@ var schemas_default = {
318303
319389
  transform: [
318304
319390
  "trim"
318305
319391
  ],
318306
- description: "Name assigned when the window/tab was opened."
319392
+ description: "Assigned window name."
318307
319393
  },
318308
319394
  index: {
318309
319395
  type: "integer",
@@ -318312,12 +319398,7 @@ var schemas_default = {
318312
319398
  title: {
318313
319399
  type: "string",
318314
319400
  minLength: 1,
318315
- description: "Page title to match. Substring, or /regex/."
318316
- },
318317
- url: {
318318
- type: "string",
318319
- minLength: 1,
318320
- description: "Page URL to match. Substring, or /regex/."
319401
+ description: "Window title to match. Substring, or /regex/."
318321
319402
  }
318322
319403
  }
318323
319404
  }
@@ -318389,13 +319470,12 @@ var schemas_default = {
318389
319470
  },
318390
319471
  target: {
318391
319472
  type: "string",
318392
- description: "What the `ffmpeg` engine captures. `display` records the full screen, `window` the active window, `viewport` the browser content area. Ignored by the `browser` engine, which always captures its tab. `window` and `viewport` are best-effort (captured full-screen, then cropped).",
319473
+ description: "What the `ffmpeg` engine captures. `display` records the full screen, `window` the active window, `viewport` the browser content area. Ignored by the `browser` engine, which always captures its tab. `window` and `viewport` are best-effort (captured full-screen, then cropped). If unset, defaults to `window` when the recording's `surface` is an app surface and to `display` otherwise. `viewport` doesn't apply to app surfaces (they have no browser viewport).",
318393
319474
  enum: [
318394
319475
  "display",
318395
319476
  "window",
318396
319477
  "viewport"
318397
- ],
318398
- default: "display"
319478
+ ]
318399
319479
  },
318400
319480
  fps: {
318401
319481
  type: "integer",
@@ -318413,7 +319493,7 @@ var schemas_default = {
318413
319493
  {
318414
319494
  type: "boolean",
318415
319495
  title: "Record (boolean)",
318416
- description: "If `true`, starts recording \u2014 auto-selecting the `browser` engine for a visible Chrome context and the `ffmpeg` engine otherwise. If `false`, doesn't record."
319496
+ description: "If `true`, starts recording \u2014 auto-selecting the `browser` engine for a visible Chrome context, the device screen on Android/iOS contexts, and the `ffmpeg` engine otherwise. If `false`, doesn't record."
318417
319497
  }
318418
319498
  ],
318419
319499
  components: {
@@ -318431,7 +319511,7 @@ var schemas_default = {
318431
319511
  type: "object",
318432
319512
  properties: {
318433
319513
  surface: {
318434
- description: "The browser window/tab to record. Omit to record the active tab. The targeted tab stays focused afterward.",
319514
+ description: 'The browser window/tab or app window to record. Omit to record the active surface. The targeted surface stays focused afterward. App surfaces use the object form ({ "app": \u2026 }) and are captured via the `ffmpeg` engine, cropped to the app window by default.',
318435
319515
  anyOf: [
318436
319516
  {
318437
319517
  title: "Surface (by browser engine)",
@@ -318581,6 +319661,72 @@ var schemas_default = {
318581
319661
  ]
318582
319662
  }
318583
319663
  }
319664
+ },
319665
+ {
319666
+ title: "App surface",
319667
+ type: "object",
319668
+ additionalProperties: false,
319669
+ required: [
319670
+ "app"
319671
+ ],
319672
+ properties: {
319673
+ app: {
319674
+ type: "string",
319675
+ minLength: 1,
319676
+ pattern: "\\S",
319677
+ transform: [
319678
+ "trim"
319679
+ ],
319680
+ description: "Name of an app surface opened by `startSurface` (its `name`, or the default derived from the app identifier)."
319681
+ },
319682
+ window: {
319683
+ description: "Which app window to act on. Omit to use the active window. Apps have windows, no tabs.",
319684
+ title: "App window selector",
319685
+ anyOf: [
319686
+ {
319687
+ title: "By index",
319688
+ type: "integer",
319689
+ description: "Index in creation order. Negative counts from the end; `-1` is the newest (e.g. a dialog the app just opened)."
319690
+ },
319691
+ {
319692
+ title: "By name",
319693
+ type: "string",
319694
+ minLength: 1,
319695
+ pattern: "\\S",
319696
+ transform: [
319697
+ "trim"
319698
+ ],
319699
+ description: "Assigned window name. The integer branch is listed first because Ajv validates with coerceTypes \u2014 string-first would coerce integer indexes into name strings."
319700
+ },
319701
+ {
319702
+ title: "By criteria",
319703
+ type: "object",
319704
+ additionalProperties: false,
319705
+ minProperties: 1,
319706
+ properties: {
319707
+ name: {
319708
+ type: "string",
319709
+ minLength: 1,
319710
+ pattern: "\\S",
319711
+ transform: [
319712
+ "trim"
319713
+ ],
319714
+ description: "Assigned window name."
319715
+ },
319716
+ index: {
319717
+ type: "integer",
319718
+ description: "Index in creation order. Negative counts from the end."
319719
+ },
319720
+ title: {
319721
+ type: "string",
319722
+ minLength: 1,
319723
+ description: "Window title to match. Substring, or /regex/."
319724
+ }
319725
+ }
319726
+ }
319727
+ ]
319728
+ }
319729
+ }
318584
319730
  }
318585
319731
  ]
318586
319732
  },
@@ -318646,13 +319792,12 @@ var schemas_default = {
318646
319792
  },
318647
319793
  target: {
318648
319794
  type: "string",
318649
- description: "What the `ffmpeg` engine captures. `display` records the full screen, `window` the active window, `viewport` the browser content area. Ignored by the `browser` engine, which always captures its tab. `window` and `viewport` are best-effort (captured full-screen, then cropped).",
319795
+ description: "What the `ffmpeg` engine captures. `display` records the full screen, `window` the active window, `viewport` the browser content area. Ignored by the `browser` engine, which always captures its tab. `window` and `viewport` are best-effort (captured full-screen, then cropped). If unset, defaults to `window` when the recording's `surface` is an app surface and to `display` otherwise. `viewport` doesn't apply to app surfaces (they have no browser viewport).",
318650
319796
  enum: [
318651
319797
  "display",
318652
319798
  "window",
318653
319799
  "viewport"
318654
- ],
318655
- default: "display"
319800
+ ]
318656
319801
  },
318657
319802
  fps: {
318658
319803
  type: "integer",
@@ -318698,13 +319843,12 @@ var schemas_default = {
318698
319843
  },
318699
319844
  target: {
318700
319845
  type: "string",
318701
- description: "What the `ffmpeg` engine captures. `display` records the full screen, `window` the active window, `viewport` the browser content area. Ignored by the `browser` engine, which always captures its tab. `window` and `viewport` are best-effort (captured full-screen, then cropped).",
319846
+ description: "What the `ffmpeg` engine captures. `display` records the full screen, `window` the active window, `viewport` the browser content area. Ignored by the `browser` engine, which always captures its tab. `window` and `viewport` are best-effort (captured full-screen, then cropped). If unset, defaults to `window` when the recording's `surface` is an app surface and to `display` otherwise. `viewport` doesn't apply to app surfaces (they have no browser viewport).",
318702
319847
  enum: [
318703
319848
  "display",
318704
319849
  "window",
318705
319850
  "viewport"
318706
- ],
318707
- default: "display"
319851
+ ]
318708
319852
  },
318709
319853
  fps: {
318710
319854
  type: "integer",
@@ -318737,6 +319881,22 @@ var schemas_default = {
318737
319881
  target: "window",
318738
319882
  fps: 60
318739
319883
  }
319884
+ },
319885
+ {
319886
+ path: "notepad.mp4",
319887
+ surface: {
319888
+ app: "notepad"
319889
+ }
319890
+ },
319891
+ {
319892
+ path: "full-screen.mp4",
319893
+ surface: {
319894
+ app: "notepad"
319895
+ },
319896
+ engine: {
319897
+ name: "ffmpeg",
319898
+ target: "display"
319899
+ }
318740
319900
  }
318741
319901
  ]
318742
319902
  }
@@ -362040,7 +363200,7 @@ var schemas_default = {
362040
363200
  record: {
362041
363201
  $schema: "http://json-schema.org/draft-07/schema#",
362042
363202
  title: "record",
362043
- description: "Start recording. Must be followed by a `stopRecord` step. The `browser` engine captures the Chrome viewport (works under concurrency); the `ffmpeg` engine captures the screen and supports any application. Supported extensions: [ '.mp4', '.webm', '.gif' ]",
363203
+ description: "Start recording. Must be followed by a `stopRecord` step. The `browser` engine captures the Chrome viewport (works under concurrency); the `ffmpeg` engine captures the screen and supports any application. On Android/iOS contexts, recording captures the device screen through the device itself \u2014 `engine` doesn't apply. Supported extensions: [ '.mp4', '.webm', '.gif' ]",
362044
363204
  anyOf: [
362045
363205
  {
362046
363206
  title: "Record (simple)",
@@ -362055,7 +363215,7 @@ var schemas_default = {
362055
363215
  type: "object",
362056
363216
  properties: {
362057
363217
  surface: {
362058
- description: "The browser window/tab to record. Omit to record the active tab. The targeted tab stays focused afterward.",
363218
+ description: 'The browser window/tab or app window to record. Omit to record the active surface. The targeted surface stays focused afterward. App surfaces use the object form ({ "app": \u2026 }) and are captured via the `ffmpeg` engine, cropped to the app window by default.',
362059
363219
  anyOf: [
362060
363220
  {
362061
363221
  title: "Surface (by browser engine)",
@@ -362205,6 +363365,72 @@ var schemas_default = {
362205
363365
  ]
362206
363366
  }
362207
363367
  }
363368
+ },
363369
+ {
363370
+ title: "App surface",
363371
+ type: "object",
363372
+ additionalProperties: false,
363373
+ required: [
363374
+ "app"
363375
+ ],
363376
+ properties: {
363377
+ app: {
363378
+ type: "string",
363379
+ minLength: 1,
363380
+ pattern: "\\S",
363381
+ transform: [
363382
+ "trim"
363383
+ ],
363384
+ description: "Name of an app surface opened by `startSurface` (its `name`, or the default derived from the app identifier)."
363385
+ },
363386
+ window: {
363387
+ description: "Which app window to act on. Omit to use the active window. Apps have windows, no tabs.",
363388
+ title: "App window selector",
363389
+ anyOf: [
363390
+ {
363391
+ title: "By index",
363392
+ type: "integer",
363393
+ description: "Index in creation order. Negative counts from the end; `-1` is the newest (e.g. a dialog the app just opened)."
363394
+ },
363395
+ {
363396
+ title: "By name",
363397
+ type: "string",
363398
+ minLength: 1,
363399
+ pattern: "\\S",
363400
+ transform: [
363401
+ "trim"
363402
+ ],
363403
+ description: "Assigned window name. The integer branch is listed first because Ajv validates with coerceTypes \u2014 string-first would coerce integer indexes into name strings."
363404
+ },
363405
+ {
363406
+ title: "By criteria",
363407
+ type: "object",
363408
+ additionalProperties: false,
363409
+ minProperties: 1,
363410
+ properties: {
363411
+ name: {
363412
+ type: "string",
363413
+ minLength: 1,
363414
+ pattern: "\\S",
363415
+ transform: [
363416
+ "trim"
363417
+ ],
363418
+ description: "Assigned window name."
363419
+ },
363420
+ index: {
363421
+ type: "integer",
363422
+ description: "Index in creation order. Negative counts from the end."
363423
+ },
363424
+ title: {
363425
+ type: "string",
363426
+ minLength: 1,
363427
+ description: "Window title to match. Substring, or /regex/."
363428
+ }
363429
+ }
363430
+ }
363431
+ ]
363432
+ }
363433
+ }
362208
363434
  }
362209
363435
  ]
362210
363436
  },
@@ -362270,13 +363496,12 @@ var schemas_default = {
362270
363496
  },
362271
363497
  target: {
362272
363498
  type: "string",
362273
- description: "What the `ffmpeg` engine captures. `display` records the full screen, `window` the active window, `viewport` the browser content area. Ignored by the `browser` engine, which always captures its tab. `window` and `viewport` are best-effort (captured full-screen, then cropped).",
363499
+ description: "What the `ffmpeg` engine captures. `display` records the full screen, `window` the active window, `viewport` the browser content area. Ignored by the `browser` engine, which always captures its tab. `window` and `viewport` are best-effort (captured full-screen, then cropped). If unset, defaults to `window` when the recording's `surface` is an app surface and to `display` otherwise. `viewport` doesn't apply to app surfaces (they have no browser viewport).",
362274
363500
  enum: [
362275
363501
  "display",
362276
363502
  "window",
362277
363503
  "viewport"
362278
- ],
362279
- default: "display"
363504
+ ]
362280
363505
  },
362281
363506
  fps: {
362282
363507
  type: "integer",
@@ -362294,7 +363519,7 @@ var schemas_default = {
362294
363519
  {
362295
363520
  type: "boolean",
362296
363521
  title: "Record (boolean)",
362297
- description: "If `true`, starts recording \u2014 auto-selecting the `browser` engine for a visible Chrome context and the `ffmpeg` engine otherwise. If `false`, doesn't record."
363522
+ description: "If `true`, starts recording \u2014 auto-selecting the `browser` engine for a visible Chrome context, the device screen on Android/iOS contexts, and the `ffmpeg` engine otherwise. If `false`, doesn't record."
362298
363523
  }
362299
363524
  ],
362300
363525
  components: {
@@ -362312,7 +363537,7 @@ var schemas_default = {
362312
363537
  type: "object",
362313
363538
  properties: {
362314
363539
  surface: {
362315
- description: "The browser window/tab to record. Omit to record the active tab. The targeted tab stays focused afterward.",
363540
+ description: 'The browser window/tab or app window to record. Omit to record the active surface. The targeted surface stays focused afterward. App surfaces use the object form ({ "app": \u2026 }) and are captured via the `ffmpeg` engine, cropped to the app window by default.',
362316
363541
  anyOf: [
362317
363542
  {
362318
363543
  title: "Surface (by browser engine)",
@@ -362462,6 +363687,72 @@ var schemas_default = {
362462
363687
  ]
362463
363688
  }
362464
363689
  }
363690
+ },
363691
+ {
363692
+ title: "App surface",
363693
+ type: "object",
363694
+ additionalProperties: false,
363695
+ required: [
363696
+ "app"
363697
+ ],
363698
+ properties: {
363699
+ app: {
363700
+ type: "string",
363701
+ minLength: 1,
363702
+ pattern: "\\S",
363703
+ transform: [
363704
+ "trim"
363705
+ ],
363706
+ description: "Name of an app surface opened by `startSurface` (its `name`, or the default derived from the app identifier)."
363707
+ },
363708
+ window: {
363709
+ description: "Which app window to act on. Omit to use the active window. Apps have windows, no tabs.",
363710
+ title: "App window selector",
363711
+ anyOf: [
363712
+ {
363713
+ title: "By index",
363714
+ type: "integer",
363715
+ description: "Index in creation order. Negative counts from the end; `-1` is the newest (e.g. a dialog the app just opened)."
363716
+ },
363717
+ {
363718
+ title: "By name",
363719
+ type: "string",
363720
+ minLength: 1,
363721
+ pattern: "\\S",
363722
+ transform: [
363723
+ "trim"
363724
+ ],
363725
+ description: "Assigned window name. The integer branch is listed first because Ajv validates with coerceTypes \u2014 string-first would coerce integer indexes into name strings."
363726
+ },
363727
+ {
363728
+ title: "By criteria",
363729
+ type: "object",
363730
+ additionalProperties: false,
363731
+ minProperties: 1,
363732
+ properties: {
363733
+ name: {
363734
+ type: "string",
363735
+ minLength: 1,
363736
+ pattern: "\\S",
363737
+ transform: [
363738
+ "trim"
363739
+ ],
363740
+ description: "Assigned window name."
363741
+ },
363742
+ index: {
363743
+ type: "integer",
363744
+ description: "Index in creation order. Negative counts from the end."
363745
+ },
363746
+ title: {
363747
+ type: "string",
363748
+ minLength: 1,
363749
+ description: "Window title to match. Substring, or /regex/."
363750
+ }
363751
+ }
363752
+ }
363753
+ ]
363754
+ }
363755
+ }
362465
363756
  }
362466
363757
  ]
362467
363758
  },
@@ -362527,13 +363818,12 @@ var schemas_default = {
362527
363818
  },
362528
363819
  target: {
362529
363820
  type: "string",
362530
- description: "What the `ffmpeg` engine captures. `display` records the full screen, `window` the active window, `viewport` the browser content area. Ignored by the `browser` engine, which always captures its tab. `window` and `viewport` are best-effort (captured full-screen, then cropped).",
363821
+ description: "What the `ffmpeg` engine captures. `display` records the full screen, `window` the active window, `viewport` the browser content area. Ignored by the `browser` engine, which always captures its tab. `window` and `viewport` are best-effort (captured full-screen, then cropped). If unset, defaults to `window` when the recording's `surface` is an app surface and to `display` otherwise. `viewport` doesn't apply to app surfaces (they have no browser viewport).",
362531
363822
  enum: [
362532
363823
  "display",
362533
363824
  "window",
362534
363825
  "viewport"
362535
- ],
362536
- default: "display"
363826
+ ]
362537
363827
  },
362538
363828
  fps: {
362539
363829
  type: "integer",
@@ -362579,13 +363869,12 @@ var schemas_default = {
362579
363869
  },
362580
363870
  target: {
362581
363871
  type: "string",
362582
- description: "What the `ffmpeg` engine captures. `display` records the full screen, `window` the active window, `viewport` the browser content area. Ignored by the `browser` engine, which always captures its tab. `window` and `viewport` are best-effort (captured full-screen, then cropped).",
363872
+ description: "What the `ffmpeg` engine captures. `display` records the full screen, `window` the active window, `viewport` the browser content area. Ignored by the `browser` engine, which always captures its tab. `window` and `viewport` are best-effort (captured full-screen, then cropped). If unset, defaults to `window` when the recording's `surface` is an app surface and to `display` otherwise. `viewport` doesn't apply to app surfaces (they have no browser viewport).",
362583
363873
  enum: [
362584
363874
  "display",
362585
363875
  "window",
362586
363876
  "viewport"
362587
- ],
362588
- default: "display"
363877
+ ]
362589
363878
  },
362590
363879
  fps: {
362591
363880
  type: "integer",
@@ -362618,6 +363907,22 @@ var schemas_default = {
362618
363907
  target: "window",
362619
363908
  fps: 60
362620
363909
  }
363910
+ },
363911
+ {
363912
+ path: "notepad.mp4",
363913
+ surface: {
363914
+ app: "notepad"
363915
+ }
363916
+ },
363917
+ {
363918
+ path: "full-screen.mp4",
363919
+ surface: {
363920
+ app: "notepad"
363921
+ },
363922
+ engine: {
363923
+ name: "ffmpeg",
363924
+ target: "display"
363925
+ }
362621
363926
  }
362622
363927
  ]
362623
363928
  }
@@ -412095,7 +413400,7 @@ var schemas_default = {
412095
413400
  record: {
412096
413401
  $schema: "http://json-schema.org/draft-07/schema#",
412097
413402
  title: "record",
412098
- description: "Start recording. Must be followed by a `stopRecord` step. The `browser` engine captures the Chrome viewport (works under concurrency); the `ffmpeg` engine captures the screen and supports any application. Supported extensions: [ '.mp4', '.webm', '.gif' ]",
413403
+ description: "Start recording. Must be followed by a `stopRecord` step. The `browser` engine captures the Chrome viewport (works under concurrency); the `ffmpeg` engine captures the screen and supports any application. On Android/iOS contexts, recording captures the device screen through the device itself \u2014 `engine` doesn't apply. Supported extensions: [ '.mp4', '.webm', '.gif' ]",
412099
413404
  anyOf: [
412100
413405
  {
412101
413406
  title: "Record (simple)",
@@ -412110,7 +413415,7 @@ var schemas_default = {
412110
413415
  type: "object",
412111
413416
  properties: {
412112
413417
  surface: {
412113
- description: "The browser window/tab to record. Omit to record the active tab. The targeted tab stays focused afterward.",
413418
+ description: 'The browser window/tab or app window to record. Omit to record the active surface. The targeted surface stays focused afterward. App surfaces use the object form ({ "app": \u2026 }) and are captured via the `ffmpeg` engine, cropped to the app window by default.',
412114
413419
  anyOf: [
412115
413420
  {
412116
413421
  title: "Surface (by browser engine)",
@@ -412260,6 +413565,72 @@ var schemas_default = {
412260
413565
  ]
412261
413566
  }
412262
413567
  }
413568
+ },
413569
+ {
413570
+ title: "App surface",
413571
+ type: "object",
413572
+ additionalProperties: false,
413573
+ required: [
413574
+ "app"
413575
+ ],
413576
+ properties: {
413577
+ app: {
413578
+ type: "string",
413579
+ minLength: 1,
413580
+ pattern: "\\S",
413581
+ transform: [
413582
+ "trim"
413583
+ ],
413584
+ description: "Name of an app surface opened by `startSurface` (its `name`, or the default derived from the app identifier)."
413585
+ },
413586
+ window: {
413587
+ description: "Which app window to act on. Omit to use the active window. Apps have windows, no tabs.",
413588
+ title: "App window selector",
413589
+ anyOf: [
413590
+ {
413591
+ title: "By index",
413592
+ type: "integer",
413593
+ description: "Index in creation order. Negative counts from the end; `-1` is the newest (e.g. a dialog the app just opened)."
413594
+ },
413595
+ {
413596
+ title: "By name",
413597
+ type: "string",
413598
+ minLength: 1,
413599
+ pattern: "\\S",
413600
+ transform: [
413601
+ "trim"
413602
+ ],
413603
+ description: "Assigned window name. The integer branch is listed first because Ajv validates with coerceTypes \u2014 string-first would coerce integer indexes into name strings."
413604
+ },
413605
+ {
413606
+ title: "By criteria",
413607
+ type: "object",
413608
+ additionalProperties: false,
413609
+ minProperties: 1,
413610
+ properties: {
413611
+ name: {
413612
+ type: "string",
413613
+ minLength: 1,
413614
+ pattern: "\\S",
413615
+ transform: [
413616
+ "trim"
413617
+ ],
413618
+ description: "Assigned window name."
413619
+ },
413620
+ index: {
413621
+ type: "integer",
413622
+ description: "Index in creation order. Negative counts from the end."
413623
+ },
413624
+ title: {
413625
+ type: "string",
413626
+ minLength: 1,
413627
+ description: "Window title to match. Substring, or /regex/."
413628
+ }
413629
+ }
413630
+ }
413631
+ ]
413632
+ }
413633
+ }
412263
413634
  }
412264
413635
  ]
412265
413636
  },
@@ -412325,13 +413696,12 @@ var schemas_default = {
412325
413696
  },
412326
413697
  target: {
412327
413698
  type: "string",
412328
- description: "What the `ffmpeg` engine captures. `display` records the full screen, `window` the active window, `viewport` the browser content area. Ignored by the `browser` engine, which always captures its tab. `window` and `viewport` are best-effort (captured full-screen, then cropped).",
413699
+ description: "What the `ffmpeg` engine captures. `display` records the full screen, `window` the active window, `viewport` the browser content area. Ignored by the `browser` engine, which always captures its tab. `window` and `viewport` are best-effort (captured full-screen, then cropped). If unset, defaults to `window` when the recording's `surface` is an app surface and to `display` otherwise. `viewport` doesn't apply to app surfaces (they have no browser viewport).",
412329
413700
  enum: [
412330
413701
  "display",
412331
413702
  "window",
412332
413703
  "viewport"
412333
- ],
412334
- default: "display"
413704
+ ]
412335
413705
  },
412336
413706
  fps: {
412337
413707
  type: "integer",
@@ -412349,7 +413719,7 @@ var schemas_default = {
412349
413719
  {
412350
413720
  type: "boolean",
412351
413721
  title: "Record (boolean)",
412352
- description: "If `true`, starts recording \u2014 auto-selecting the `browser` engine for a visible Chrome context and the `ffmpeg` engine otherwise. If `false`, doesn't record."
413722
+ description: "If `true`, starts recording \u2014 auto-selecting the `browser` engine for a visible Chrome context, the device screen on Android/iOS contexts, and the `ffmpeg` engine otherwise. If `false`, doesn't record."
412353
413723
  }
412354
413724
  ],
412355
413725
  components: {
@@ -412367,7 +413737,7 @@ var schemas_default = {
412367
413737
  type: "object",
412368
413738
  properties: {
412369
413739
  surface: {
412370
- description: "The browser window/tab to record. Omit to record the active tab. The targeted tab stays focused afterward.",
413740
+ description: 'The browser window/tab or app window to record. Omit to record the active surface. The targeted surface stays focused afterward. App surfaces use the object form ({ "app": \u2026 }) and are captured via the `ffmpeg` engine, cropped to the app window by default.',
412371
413741
  anyOf: [
412372
413742
  {
412373
413743
  title: "Surface (by browser engine)",
@@ -412517,6 +413887,72 @@ var schemas_default = {
412517
413887
  ]
412518
413888
  }
412519
413889
  }
413890
+ },
413891
+ {
413892
+ title: "App surface",
413893
+ type: "object",
413894
+ additionalProperties: false,
413895
+ required: [
413896
+ "app"
413897
+ ],
413898
+ properties: {
413899
+ app: {
413900
+ type: "string",
413901
+ minLength: 1,
413902
+ pattern: "\\S",
413903
+ transform: [
413904
+ "trim"
413905
+ ],
413906
+ description: "Name of an app surface opened by `startSurface` (its `name`, or the default derived from the app identifier)."
413907
+ },
413908
+ window: {
413909
+ description: "Which app window to act on. Omit to use the active window. Apps have windows, no tabs.",
413910
+ title: "App window selector",
413911
+ anyOf: [
413912
+ {
413913
+ title: "By index",
413914
+ type: "integer",
413915
+ description: "Index in creation order. Negative counts from the end; `-1` is the newest (e.g. a dialog the app just opened)."
413916
+ },
413917
+ {
413918
+ title: "By name",
413919
+ type: "string",
413920
+ minLength: 1,
413921
+ pattern: "\\S",
413922
+ transform: [
413923
+ "trim"
413924
+ ],
413925
+ description: "Assigned window name. The integer branch is listed first because Ajv validates with coerceTypes \u2014 string-first would coerce integer indexes into name strings."
413926
+ },
413927
+ {
413928
+ title: "By criteria",
413929
+ type: "object",
413930
+ additionalProperties: false,
413931
+ minProperties: 1,
413932
+ properties: {
413933
+ name: {
413934
+ type: "string",
413935
+ minLength: 1,
413936
+ pattern: "\\S",
413937
+ transform: [
413938
+ "trim"
413939
+ ],
413940
+ description: "Assigned window name."
413941
+ },
413942
+ index: {
413943
+ type: "integer",
413944
+ description: "Index in creation order. Negative counts from the end."
413945
+ },
413946
+ title: {
413947
+ type: "string",
413948
+ minLength: 1,
413949
+ description: "Window title to match. Substring, or /regex/."
413950
+ }
413951
+ }
413952
+ }
413953
+ ]
413954
+ }
413955
+ }
412520
413956
  }
412521
413957
  ]
412522
413958
  },
@@ -412582,13 +414018,12 @@ var schemas_default = {
412582
414018
  },
412583
414019
  target: {
412584
414020
  type: "string",
412585
- description: "What the `ffmpeg` engine captures. `display` records the full screen, `window` the active window, `viewport` the browser content area. Ignored by the `browser` engine, which always captures its tab. `window` and `viewport` are best-effort (captured full-screen, then cropped).",
414021
+ description: "What the `ffmpeg` engine captures. `display` records the full screen, `window` the active window, `viewport` the browser content area. Ignored by the `browser` engine, which always captures its tab. `window` and `viewport` are best-effort (captured full-screen, then cropped). If unset, defaults to `window` when the recording's `surface` is an app surface and to `display` otherwise. `viewport` doesn't apply to app surfaces (they have no browser viewport).",
412586
414022
  enum: [
412587
414023
  "display",
412588
414024
  "window",
412589
414025
  "viewport"
412590
- ],
412591
- default: "display"
414026
+ ]
412592
414027
  },
412593
414028
  fps: {
412594
414029
  type: "integer",
@@ -412634,13 +414069,12 @@ var schemas_default = {
412634
414069
  },
412635
414070
  target: {
412636
414071
  type: "string",
412637
- description: "What the `ffmpeg` engine captures. `display` records the full screen, `window` the active window, `viewport` the browser content area. Ignored by the `browser` engine, which always captures its tab. `window` and `viewport` are best-effort (captured full-screen, then cropped).",
414072
+ description: "What the `ffmpeg` engine captures. `display` records the full screen, `window` the active window, `viewport` the browser content area. Ignored by the `browser` engine, which always captures its tab. `window` and `viewport` are best-effort (captured full-screen, then cropped). If unset, defaults to `window` when the recording's `surface` is an app surface and to `display` otherwise. `viewport` doesn't apply to app surfaces (they have no browser viewport).",
412638
414073
  enum: [
412639
414074
  "display",
412640
414075
  "window",
412641
414076
  "viewport"
412642
- ],
412643
- default: "display"
414077
+ ]
412644
414078
  },
412645
414079
  fps: {
412646
414080
  type: "integer",
@@ -412673,6 +414107,22 @@ var schemas_default = {
412673
414107
  target: "window",
412674
414108
  fps: 60
412675
414109
  }
414110
+ },
414111
+ {
414112
+ path: "notepad.mp4",
414113
+ surface: {
414114
+ app: "notepad"
414115
+ }
414116
+ },
414117
+ {
414118
+ path: "full-screen.mp4",
414119
+ surface: {
414120
+ app: "notepad"
414121
+ },
414122
+ engine: {
414123
+ name: "ffmpeg",
414124
+ target: "display"
414125
+ }
412676
414126
  }
412677
414127
  ]
412678
414128
  }
@@ -455976,7 +457426,7 @@ var schemas_default = {
455976
457426
  record: {
455977
457427
  $schema: "http://json-schema.org/draft-07/schema#",
455978
457428
  title: "record",
455979
- description: "Start recording. Must be followed by a `stopRecord` step. The `browser` engine captures the Chrome viewport (works under concurrency); the `ffmpeg` engine captures the screen and supports any application. Supported extensions: [ '.mp4', '.webm', '.gif' ]",
457429
+ description: "Start recording. Must be followed by a `stopRecord` step. The `browser` engine captures the Chrome viewport (works under concurrency); the `ffmpeg` engine captures the screen and supports any application. On Android/iOS contexts, recording captures the device screen through the device itself \u2014 `engine` doesn't apply. Supported extensions: [ '.mp4', '.webm', '.gif' ]",
455980
457430
  anyOf: [
455981
457431
  {
455982
457432
  title: "Record (simple)",
@@ -455991,7 +457441,7 @@ var schemas_default = {
455991
457441
  type: "object",
455992
457442
  properties: {
455993
457443
  surface: {
455994
- description: "The browser window/tab to record. Omit to record the active tab. The targeted tab stays focused afterward.",
457444
+ description: 'The browser window/tab or app window to record. Omit to record the active surface. The targeted surface stays focused afterward. App surfaces use the object form ({ "app": \u2026 }) and are captured via the `ffmpeg` engine, cropped to the app window by default.',
455995
457445
  anyOf: [
455996
457446
  {
455997
457447
  title: "Surface (by browser engine)",
@@ -456141,6 +457591,72 @@ var schemas_default = {
456141
457591
  ]
456142
457592
  }
456143
457593
  }
457594
+ },
457595
+ {
457596
+ title: "App surface",
457597
+ type: "object",
457598
+ additionalProperties: false,
457599
+ required: [
457600
+ "app"
457601
+ ],
457602
+ properties: {
457603
+ app: {
457604
+ type: "string",
457605
+ minLength: 1,
457606
+ pattern: "\\S",
457607
+ transform: [
457608
+ "trim"
457609
+ ],
457610
+ description: "Name of an app surface opened by `startSurface` (its `name`, or the default derived from the app identifier)."
457611
+ },
457612
+ window: {
457613
+ description: "Which app window to act on. Omit to use the active window. Apps have windows, no tabs.",
457614
+ title: "App window selector",
457615
+ anyOf: [
457616
+ {
457617
+ title: "By index",
457618
+ type: "integer",
457619
+ description: "Index in creation order. Negative counts from the end; `-1` is the newest (e.g. a dialog the app just opened)."
457620
+ },
457621
+ {
457622
+ title: "By name",
457623
+ type: "string",
457624
+ minLength: 1,
457625
+ pattern: "\\S",
457626
+ transform: [
457627
+ "trim"
457628
+ ],
457629
+ description: "Assigned window name. The integer branch is listed first because Ajv validates with coerceTypes \u2014 string-first would coerce integer indexes into name strings."
457630
+ },
457631
+ {
457632
+ title: "By criteria",
457633
+ type: "object",
457634
+ additionalProperties: false,
457635
+ minProperties: 1,
457636
+ properties: {
457637
+ name: {
457638
+ type: "string",
457639
+ minLength: 1,
457640
+ pattern: "\\S",
457641
+ transform: [
457642
+ "trim"
457643
+ ],
457644
+ description: "Assigned window name."
457645
+ },
457646
+ index: {
457647
+ type: "integer",
457648
+ description: "Index in creation order. Negative counts from the end."
457649
+ },
457650
+ title: {
457651
+ type: "string",
457652
+ minLength: 1,
457653
+ description: "Window title to match. Substring, or /regex/."
457654
+ }
457655
+ }
457656
+ }
457657
+ ]
457658
+ }
457659
+ }
456144
457660
  }
456145
457661
  ]
456146
457662
  },
@@ -456206,13 +457722,12 @@ var schemas_default = {
456206
457722
  },
456207
457723
  target: {
456208
457724
  type: "string",
456209
- description: "What the `ffmpeg` engine captures. `display` records the full screen, `window` the active window, `viewport` the browser content area. Ignored by the `browser` engine, which always captures its tab. `window` and `viewport` are best-effort (captured full-screen, then cropped).",
457725
+ description: "What the `ffmpeg` engine captures. `display` records the full screen, `window` the active window, `viewport` the browser content area. Ignored by the `browser` engine, which always captures its tab. `window` and `viewport` are best-effort (captured full-screen, then cropped). If unset, defaults to `window` when the recording's `surface` is an app surface and to `display` otherwise. `viewport` doesn't apply to app surfaces (they have no browser viewport).",
456210
457726
  enum: [
456211
457727
  "display",
456212
457728
  "window",
456213
457729
  "viewport"
456214
- ],
456215
- default: "display"
457730
+ ]
456216
457731
  },
456217
457732
  fps: {
456218
457733
  type: "integer",
@@ -456230,7 +457745,7 @@ var schemas_default = {
456230
457745
  {
456231
457746
  type: "boolean",
456232
457747
  title: "Record (boolean)",
456233
- description: "If `true`, starts recording \u2014 auto-selecting the `browser` engine for a visible Chrome context and the `ffmpeg` engine otherwise. If `false`, doesn't record."
457748
+ description: "If `true`, starts recording \u2014 auto-selecting the `browser` engine for a visible Chrome context, the device screen on Android/iOS contexts, and the `ffmpeg` engine otherwise. If `false`, doesn't record."
456234
457749
  }
456235
457750
  ],
456236
457751
  components: {
@@ -456248,7 +457763,7 @@ var schemas_default = {
456248
457763
  type: "object",
456249
457764
  properties: {
456250
457765
  surface: {
456251
- description: "The browser window/tab to record. Omit to record the active tab. The targeted tab stays focused afterward.",
457766
+ description: 'The browser window/tab or app window to record. Omit to record the active surface. The targeted surface stays focused afterward. App surfaces use the object form ({ "app": \u2026 }) and are captured via the `ffmpeg` engine, cropped to the app window by default.',
456252
457767
  anyOf: [
456253
457768
  {
456254
457769
  title: "Surface (by browser engine)",
@@ -456345,14 +457860,85 @@ var schemas_default = {
456345
457860
  }
456346
457861
  ]
456347
457862
  },
456348
- tab: {
456349
- description: "Which tab to act on. Omit to use the active tab. Without `window`, the selector searches every tab in creation order \u2014 including tabs the page opened itself.",
456350
- title: "Window/tab selector",
457863
+ tab: {
457864
+ description: "Which tab to act on. Omit to use the active tab. Without `window`, the selector searches every tab in creation order \u2014 including tabs the page opened itself.",
457865
+ title: "Window/tab selector",
457866
+ anyOf: [
457867
+ {
457868
+ title: "By index",
457869
+ type: "integer",
457870
+ description: "Index in creation order. Negative counts from the end; `-1` is the newest."
457871
+ },
457872
+ {
457873
+ title: "By name",
457874
+ type: "string",
457875
+ minLength: 1,
457876
+ pattern: "\\S",
457877
+ transform: [
457878
+ "trim"
457879
+ ],
457880
+ description: "Name assigned when the window/tab was opened (goTo `newTab`/`newWindow`). The integer branch is listed first because Ajv validates with coerceTypes \u2014 string-first would coerce integer indexes into name strings."
457881
+ },
457882
+ {
457883
+ title: "By criteria",
457884
+ type: "object",
457885
+ additionalProperties: false,
457886
+ minProperties: 1,
457887
+ properties: {
457888
+ name: {
457889
+ type: "string",
457890
+ minLength: 1,
457891
+ pattern: "\\S",
457892
+ transform: [
457893
+ "trim"
457894
+ ],
457895
+ description: "Name assigned when the window/tab was opened."
457896
+ },
457897
+ index: {
457898
+ type: "integer",
457899
+ description: "Index in creation order. Negative counts from the end."
457900
+ },
457901
+ title: {
457902
+ type: "string",
457903
+ minLength: 1,
457904
+ description: "Page title to match. Substring, or /regex/."
457905
+ },
457906
+ url: {
457907
+ type: "string",
457908
+ minLength: 1,
457909
+ description: "Page URL to match. Substring, or /regex/."
457910
+ }
457911
+ }
457912
+ }
457913
+ ]
457914
+ }
457915
+ }
457916
+ },
457917
+ {
457918
+ title: "App surface",
457919
+ type: "object",
457920
+ additionalProperties: false,
457921
+ required: [
457922
+ "app"
457923
+ ],
457924
+ properties: {
457925
+ app: {
457926
+ type: "string",
457927
+ minLength: 1,
457928
+ pattern: "\\S",
457929
+ transform: [
457930
+ "trim"
457931
+ ],
457932
+ description: "Name of an app surface opened by `startSurface` (its `name`, or the default derived from the app identifier)."
457933
+ },
457934
+ window: {
457935
+ description: "Which app window to act on. Omit to use the active window. Apps have windows, no tabs.",
457936
+ title: "App window selector",
456351
457937
  anyOf: [
456352
457938
  {
456353
457939
  title: "By index",
456354
457940
  type: "integer",
456355
- description: "Index in creation order. Negative counts from the end; `-1` is the newest."
457941
+ description: "Index in creation order. Negative counts from the end; `-1` is the newest (e.g. a dialog the app just opened)."
456356
457942
  },
456357
457943
  {
456358
457944
  title: "By name",
@@ -456362,7 +457948,7 @@ var schemas_default = {
456362
457948
  transform: [
456363
457949
  "trim"
456364
457950
  ],
456365
- description: "Name assigned when the window/tab was opened (goTo `newTab`/`newWindow`). The integer branch is listed first because Ajv validates with coerceTypes \u2014 string-first would coerce integer indexes into name strings."
457951
+ description: "Assigned window name. The integer branch is listed first because Ajv validates with coerceTypes \u2014 string-first would coerce integer indexes into name strings."
456366
457952
  },
456367
457953
  {
456368
457954
  title: "By criteria",
@@ -456377,7 +457963,7 @@ var schemas_default = {
456377
457963
  transform: [
456378
457964
  "trim"
456379
457965
  ],
456380
- description: "Name assigned when the window/tab was opened."
457966
+ description: "Assigned window name."
456381
457967
  },
456382
457968
  index: {
456383
457969
  type: "integer",
@@ -456386,12 +457972,7 @@ var schemas_default = {
456386
457972
  title: {
456387
457973
  type: "string",
456388
457974
  minLength: 1,
456389
- description: "Page title to match. Substring, or /regex/."
456390
- },
456391
- url: {
456392
- type: "string",
456393
- minLength: 1,
456394
- description: "Page URL to match. Substring, or /regex/."
457975
+ description: "Window title to match. Substring, or /regex/."
456395
457976
  }
456396
457977
  }
456397
457978
  }
@@ -456463,13 +458044,12 @@ var schemas_default = {
456463
458044
  },
456464
458045
  target: {
456465
458046
  type: "string",
456466
- description: "What the `ffmpeg` engine captures. `display` records the full screen, `window` the active window, `viewport` the browser content area. Ignored by the `browser` engine, which always captures its tab. `window` and `viewport` are best-effort (captured full-screen, then cropped).",
458047
+ description: "What the `ffmpeg` engine captures. `display` records the full screen, `window` the active window, `viewport` the browser content area. Ignored by the `browser` engine, which always captures its tab. `window` and `viewport` are best-effort (captured full-screen, then cropped). If unset, defaults to `window` when the recording's `surface` is an app surface and to `display` otherwise. `viewport` doesn't apply to app surfaces (they have no browser viewport).",
456467
458048
  enum: [
456468
458049
  "display",
456469
458050
  "window",
456470
458051
  "viewport"
456471
- ],
456472
- default: "display"
458052
+ ]
456473
458053
  },
456474
458054
  fps: {
456475
458055
  type: "integer",
@@ -456515,13 +458095,12 @@ var schemas_default = {
456515
458095
  },
456516
458096
  target: {
456517
458097
  type: "string",
456518
- description: "What the `ffmpeg` engine captures. `display` records the full screen, `window` the active window, `viewport` the browser content area. Ignored by the `browser` engine, which always captures its tab. `window` and `viewport` are best-effort (captured full-screen, then cropped).",
458098
+ description: "What the `ffmpeg` engine captures. `display` records the full screen, `window` the active window, `viewport` the browser content area. Ignored by the `browser` engine, which always captures its tab. `window` and `viewport` are best-effort (captured full-screen, then cropped). If unset, defaults to `window` when the recording's `surface` is an app surface and to `display` otherwise. `viewport` doesn't apply to app surfaces (they have no browser viewport).",
456519
458099
  enum: [
456520
458100
  "display",
456521
458101
  "window",
456522
458102
  "viewport"
456523
- ],
456524
- default: "display"
458103
+ ]
456525
458104
  },
456526
458105
  fps: {
456527
458106
  type: "integer",
@@ -456554,6 +458133,22 @@ var schemas_default = {
456554
458133
  target: "window",
456555
458134
  fps: 60
456556
458135
  }
458136
+ },
458137
+ {
458138
+ path: "notepad.mp4",
458139
+ surface: {
458140
+ app: "notepad"
458141
+ }
458142
+ },
458143
+ {
458144
+ path: "full-screen.mp4",
458145
+ surface: {
458146
+ app: "notepad"
458147
+ },
458148
+ engine: {
458149
+ name: "ffmpeg",
458150
+ target: "display"
458151
+ }
456557
458152
  }
456558
458153
  ]
456559
458154
  }
@@ -500743,7 +502338,7 @@ var schemas_default = {
500743
502338
  record: {
500744
502339
  $schema: "http://json-schema.org/draft-07/schema#",
500745
502340
  title: "record",
500746
- description: "Start recording. Must be followed by a `stopRecord` step. The `browser` engine captures the Chrome viewport (works under concurrency); the `ffmpeg` engine captures the screen and supports any application. Supported extensions: [ '.mp4', '.webm', '.gif' ]",
502341
+ description: "Start recording. Must be followed by a `stopRecord` step. The `browser` engine captures the Chrome viewport (works under concurrency); the `ffmpeg` engine captures the screen and supports any application. On Android/iOS contexts, recording captures the device screen through the device itself \u2014 `engine` doesn't apply. Supported extensions: [ '.mp4', '.webm', '.gif' ]",
500747
502342
  anyOf: [
500748
502343
  {
500749
502344
  title: "Record (simple)",
@@ -500758,7 +502353,7 @@ var schemas_default = {
500758
502353
  type: "object",
500759
502354
  properties: {
500760
502355
  surface: {
500761
- description: "The browser window/tab to record. Omit to record the active tab. The targeted tab stays focused afterward.",
502356
+ description: 'The browser window/tab or app window to record. Omit to record the active surface. The targeted surface stays focused afterward. App surfaces use the object form ({ "app": \u2026 }) and are captured via the `ffmpeg` engine, cropped to the app window by default.',
500762
502357
  anyOf: [
500763
502358
  {
500764
502359
  title: "Surface (by browser engine)",
@@ -500908,6 +502503,72 @@ var schemas_default = {
500908
502503
  ]
500909
502504
  }
500910
502505
  }
502506
+ },
502507
+ {
502508
+ title: "App surface",
502509
+ type: "object",
502510
+ additionalProperties: false,
502511
+ required: [
502512
+ "app"
502513
+ ],
502514
+ properties: {
502515
+ app: {
502516
+ type: "string",
502517
+ minLength: 1,
502518
+ pattern: "\\S",
502519
+ transform: [
502520
+ "trim"
502521
+ ],
502522
+ description: "Name of an app surface opened by `startSurface` (its `name`, or the default derived from the app identifier)."
502523
+ },
502524
+ window: {
502525
+ description: "Which app window to act on. Omit to use the active window. Apps have windows, no tabs.",
502526
+ title: "App window selector",
502527
+ anyOf: [
502528
+ {
502529
+ title: "By index",
502530
+ type: "integer",
502531
+ description: "Index in creation order. Negative counts from the end; `-1` is the newest (e.g. a dialog the app just opened)."
502532
+ },
502533
+ {
502534
+ title: "By name",
502535
+ type: "string",
502536
+ minLength: 1,
502537
+ pattern: "\\S",
502538
+ transform: [
502539
+ "trim"
502540
+ ],
502541
+ description: "Assigned window name. The integer branch is listed first because Ajv validates with coerceTypes \u2014 string-first would coerce integer indexes into name strings."
502542
+ },
502543
+ {
502544
+ title: "By criteria",
502545
+ type: "object",
502546
+ additionalProperties: false,
502547
+ minProperties: 1,
502548
+ properties: {
502549
+ name: {
502550
+ type: "string",
502551
+ minLength: 1,
502552
+ pattern: "\\S",
502553
+ transform: [
502554
+ "trim"
502555
+ ],
502556
+ description: "Assigned window name."
502557
+ },
502558
+ index: {
502559
+ type: "integer",
502560
+ description: "Index in creation order. Negative counts from the end."
502561
+ },
502562
+ title: {
502563
+ type: "string",
502564
+ minLength: 1,
502565
+ description: "Window title to match. Substring, or /regex/."
502566
+ }
502567
+ }
502568
+ }
502569
+ ]
502570
+ }
502571
+ }
500911
502572
  }
500912
502573
  ]
500913
502574
  },
@@ -500973,13 +502634,12 @@ var schemas_default = {
500973
502634
  },
500974
502635
  target: {
500975
502636
  type: "string",
500976
- description: "What the `ffmpeg` engine captures. `display` records the full screen, `window` the active window, `viewport` the browser content area. Ignored by the `browser` engine, which always captures its tab. `window` and `viewport` are best-effort (captured full-screen, then cropped).",
502637
+ description: "What the `ffmpeg` engine captures. `display` records the full screen, `window` the active window, `viewport` the browser content area. Ignored by the `browser` engine, which always captures its tab. `window` and `viewport` are best-effort (captured full-screen, then cropped). If unset, defaults to `window` when the recording's `surface` is an app surface and to `display` otherwise. `viewport` doesn't apply to app surfaces (they have no browser viewport).",
500977
502638
  enum: [
500978
502639
  "display",
500979
502640
  "window",
500980
502641
  "viewport"
500981
- ],
500982
- default: "display"
502642
+ ]
500983
502643
  },
500984
502644
  fps: {
500985
502645
  type: "integer",
@@ -500997,7 +502657,7 @@ var schemas_default = {
500997
502657
  {
500998
502658
  type: "boolean",
500999
502659
  title: "Record (boolean)",
501000
- description: "If `true`, starts recording \u2014 auto-selecting the `browser` engine for a visible Chrome context and the `ffmpeg` engine otherwise. If `false`, doesn't record."
502660
+ description: "If `true`, starts recording \u2014 auto-selecting the `browser` engine for a visible Chrome context, the device screen on Android/iOS contexts, and the `ffmpeg` engine otherwise. If `false`, doesn't record."
501001
502661
  }
501002
502662
  ],
501003
502663
  components: {
@@ -501015,7 +502675,7 @@ var schemas_default = {
501015
502675
  type: "object",
501016
502676
  properties: {
501017
502677
  surface: {
501018
- description: "The browser window/tab to record. Omit to record the active tab. The targeted tab stays focused afterward.",
502678
+ description: 'The browser window/tab or app window to record. Omit to record the active surface. The targeted surface stays focused afterward. App surfaces use the object form ({ "app": \u2026 }) and are captured via the `ffmpeg` engine, cropped to the app window by default.',
501019
502679
  anyOf: [
501020
502680
  {
501021
502681
  title: "Surface (by browser engine)",
@@ -501165,6 +502825,72 @@ var schemas_default = {
501165
502825
  ]
501166
502826
  }
501167
502827
  }
502828
+ },
502829
+ {
502830
+ title: "App surface",
502831
+ type: "object",
502832
+ additionalProperties: false,
502833
+ required: [
502834
+ "app"
502835
+ ],
502836
+ properties: {
502837
+ app: {
502838
+ type: "string",
502839
+ minLength: 1,
502840
+ pattern: "\\S",
502841
+ transform: [
502842
+ "trim"
502843
+ ],
502844
+ description: "Name of an app surface opened by `startSurface` (its `name`, or the default derived from the app identifier)."
502845
+ },
502846
+ window: {
502847
+ description: "Which app window to act on. Omit to use the active window. Apps have windows, no tabs.",
502848
+ title: "App window selector",
502849
+ anyOf: [
502850
+ {
502851
+ title: "By index",
502852
+ type: "integer",
502853
+ description: "Index in creation order. Negative counts from the end; `-1` is the newest (e.g. a dialog the app just opened)."
502854
+ },
502855
+ {
502856
+ title: "By name",
502857
+ type: "string",
502858
+ minLength: 1,
502859
+ pattern: "\\S",
502860
+ transform: [
502861
+ "trim"
502862
+ ],
502863
+ description: "Assigned window name. The integer branch is listed first because Ajv validates with coerceTypes \u2014 string-first would coerce integer indexes into name strings."
502864
+ },
502865
+ {
502866
+ title: "By criteria",
502867
+ type: "object",
502868
+ additionalProperties: false,
502869
+ minProperties: 1,
502870
+ properties: {
502871
+ name: {
502872
+ type: "string",
502873
+ minLength: 1,
502874
+ pattern: "\\S",
502875
+ transform: [
502876
+ "trim"
502877
+ ],
502878
+ description: "Assigned window name."
502879
+ },
502880
+ index: {
502881
+ type: "integer",
502882
+ description: "Index in creation order. Negative counts from the end."
502883
+ },
502884
+ title: {
502885
+ type: "string",
502886
+ minLength: 1,
502887
+ description: "Window title to match. Substring, or /regex/."
502888
+ }
502889
+ }
502890
+ }
502891
+ ]
502892
+ }
502893
+ }
501168
502894
  }
501169
502895
  ]
501170
502896
  },
@@ -501230,13 +502956,12 @@ var schemas_default = {
501230
502956
  },
501231
502957
  target: {
501232
502958
  type: "string",
501233
- description: "What the `ffmpeg` engine captures. `display` records the full screen, `window` the active window, `viewport` the browser content area. Ignored by the `browser` engine, which always captures its tab. `window` and `viewport` are best-effort (captured full-screen, then cropped).",
502959
+ description: "What the `ffmpeg` engine captures. `display` records the full screen, `window` the active window, `viewport` the browser content area. Ignored by the `browser` engine, which always captures its tab. `window` and `viewport` are best-effort (captured full-screen, then cropped). If unset, defaults to `window` when the recording's `surface` is an app surface and to `display` otherwise. `viewport` doesn't apply to app surfaces (they have no browser viewport).",
501234
502960
  enum: [
501235
502961
  "display",
501236
502962
  "window",
501237
502963
  "viewport"
501238
- ],
501239
- default: "display"
502964
+ ]
501240
502965
  },
501241
502966
  fps: {
501242
502967
  type: "integer",
@@ -501282,13 +503007,12 @@ var schemas_default = {
501282
503007
  },
501283
503008
  target: {
501284
503009
  type: "string",
501285
- description: "What the `ffmpeg` engine captures. `display` records the full screen, `window` the active window, `viewport` the browser content area. Ignored by the `browser` engine, which always captures its tab. `window` and `viewport` are best-effort (captured full-screen, then cropped).",
503010
+ description: "What the `ffmpeg` engine captures. `display` records the full screen, `window` the active window, `viewport` the browser content area. Ignored by the `browser` engine, which always captures its tab. `window` and `viewport` are best-effort (captured full-screen, then cropped). If unset, defaults to `window` when the recording's `surface` is an app surface and to `display` otherwise. `viewport` doesn't apply to app surfaces (they have no browser viewport).",
501286
503011
  enum: [
501287
503012
  "display",
501288
503013
  "window",
501289
503014
  "viewport"
501290
- ],
501291
- default: "display"
503015
+ ]
501292
503016
  },
501293
503017
  fps: {
501294
503018
  type: "integer",
@@ -501321,6 +503045,22 @@ var schemas_default = {
501321
503045
  target: "window",
501322
503046
  fps: 60
501323
503047
  }
503048
+ },
503049
+ {
503050
+ path: "notepad.mp4",
503051
+ surface: {
503052
+ app: "notepad"
503053
+ }
503054
+ },
503055
+ {
503056
+ path: "full-screen.mp4",
503057
+ surface: {
503058
+ app: "notepad"
503059
+ },
503060
+ engine: {
503061
+ name: "ffmpeg",
503062
+ target: "display"
503063
+ }
501324
503064
  }
501325
503065
  ]
501326
503066
  }
@@ -547965,7 +549705,7 @@ var schemas_default = {
547965
549705
  record: {
547966
549706
  $schema: "http://json-schema.org/draft-07/schema#",
547967
549707
  title: "record",
547968
- description: "Start recording. Must be followed by a `stopRecord` step. The `browser` engine captures the Chrome viewport (works under concurrency); the `ffmpeg` engine captures the screen and supports any application. Supported extensions: [ '.mp4', '.webm', '.gif' ]",
549708
+ description: "Start recording. Must be followed by a `stopRecord` step. The `browser` engine captures the Chrome viewport (works under concurrency); the `ffmpeg` engine captures the screen and supports any application. On Android/iOS contexts, recording captures the device screen through the device itself \u2014 `engine` doesn't apply. Supported extensions: [ '.mp4', '.webm', '.gif' ]",
547969
549709
  anyOf: [
547970
549710
  {
547971
549711
  title: "Record (simple)",
@@ -547980,7 +549720,7 @@ var schemas_default = {
547980
549720
  type: "object",
547981
549721
  properties: {
547982
549722
  surface: {
547983
- description: "The browser window/tab to record. Omit to record the active tab. The targeted tab stays focused afterward.",
549723
+ description: 'The browser window/tab or app window to record. Omit to record the active surface. The targeted surface stays focused afterward. App surfaces use the object form ({ "app": \u2026 }) and are captured via the `ffmpeg` engine, cropped to the app window by default.',
547984
549724
  anyOf: [
547985
549725
  {
547986
549726
  title: "Surface (by browser engine)",
@@ -548077,14 +549817,85 @@ var schemas_default = {
548077
549817
  }
548078
549818
  ]
548079
549819
  },
548080
- tab: {
548081
- description: "Which tab to act on. Omit to use the active tab. Without `window`, the selector searches every tab in creation order \u2014 including tabs the page opened itself.",
548082
- title: "Window/tab selector",
549820
+ tab: {
549821
+ description: "Which tab to act on. Omit to use the active tab. Without `window`, the selector searches every tab in creation order \u2014 including tabs the page opened itself.",
549822
+ title: "Window/tab selector",
549823
+ anyOf: [
549824
+ {
549825
+ title: "By index",
549826
+ type: "integer",
549827
+ description: "Index in creation order. Negative counts from the end; `-1` is the newest."
549828
+ },
549829
+ {
549830
+ title: "By name",
549831
+ type: "string",
549832
+ minLength: 1,
549833
+ pattern: "\\S",
549834
+ transform: [
549835
+ "trim"
549836
+ ],
549837
+ description: "Name assigned when the window/tab was opened (goTo `newTab`/`newWindow`). The integer branch is listed first because Ajv validates with coerceTypes \u2014 string-first would coerce integer indexes into name strings."
549838
+ },
549839
+ {
549840
+ title: "By criteria",
549841
+ type: "object",
549842
+ additionalProperties: false,
549843
+ minProperties: 1,
549844
+ properties: {
549845
+ name: {
549846
+ type: "string",
549847
+ minLength: 1,
549848
+ pattern: "\\S",
549849
+ transform: [
549850
+ "trim"
549851
+ ],
549852
+ description: "Name assigned when the window/tab was opened."
549853
+ },
549854
+ index: {
549855
+ type: "integer",
549856
+ description: "Index in creation order. Negative counts from the end."
549857
+ },
549858
+ title: {
549859
+ type: "string",
549860
+ minLength: 1,
549861
+ description: "Page title to match. Substring, or /regex/."
549862
+ },
549863
+ url: {
549864
+ type: "string",
549865
+ minLength: 1,
549866
+ description: "Page URL to match. Substring, or /regex/."
549867
+ }
549868
+ }
549869
+ }
549870
+ ]
549871
+ }
549872
+ }
549873
+ },
549874
+ {
549875
+ title: "App surface",
549876
+ type: "object",
549877
+ additionalProperties: false,
549878
+ required: [
549879
+ "app"
549880
+ ],
549881
+ properties: {
549882
+ app: {
549883
+ type: "string",
549884
+ minLength: 1,
549885
+ pattern: "\\S",
549886
+ transform: [
549887
+ "trim"
549888
+ ],
549889
+ description: "Name of an app surface opened by `startSurface` (its `name`, or the default derived from the app identifier)."
549890
+ },
549891
+ window: {
549892
+ description: "Which app window to act on. Omit to use the active window. Apps have windows, no tabs.",
549893
+ title: "App window selector",
548083
549894
  anyOf: [
548084
549895
  {
548085
549896
  title: "By index",
548086
549897
  type: "integer",
548087
- description: "Index in creation order. Negative counts from the end; `-1` is the newest."
549898
+ description: "Index in creation order. Negative counts from the end; `-1` is the newest (e.g. a dialog the app just opened)."
548088
549899
  },
548089
549900
  {
548090
549901
  title: "By name",
@@ -548094,7 +549905,7 @@ var schemas_default = {
548094
549905
  transform: [
548095
549906
  "trim"
548096
549907
  ],
548097
- description: "Name assigned when the window/tab was opened (goTo `newTab`/`newWindow`). The integer branch is listed first because Ajv validates with coerceTypes \u2014 string-first would coerce integer indexes into name strings."
549908
+ description: "Assigned window name. The integer branch is listed first because Ajv validates with coerceTypes \u2014 string-first would coerce integer indexes into name strings."
548098
549909
  },
548099
549910
  {
548100
549911
  title: "By criteria",
@@ -548109,7 +549920,7 @@ var schemas_default = {
548109
549920
  transform: [
548110
549921
  "trim"
548111
549922
  ],
548112
- description: "Name assigned when the window/tab was opened."
549923
+ description: "Assigned window name."
548113
549924
  },
548114
549925
  index: {
548115
549926
  type: "integer",
@@ -548118,12 +549929,7 @@ var schemas_default = {
548118
549929
  title: {
548119
549930
  type: "string",
548120
549931
  minLength: 1,
548121
- description: "Page title to match. Substring, or /regex/."
548122
- },
548123
- url: {
548124
- type: "string",
548125
- minLength: 1,
548126
- description: "Page URL to match. Substring, or /regex/."
549932
+ description: "Window title to match. Substring, or /regex/."
548127
549933
  }
548128
549934
  }
548129
549935
  }
@@ -548195,13 +550001,12 @@ var schemas_default = {
548195
550001
  },
548196
550002
  target: {
548197
550003
  type: "string",
548198
- description: "What the `ffmpeg` engine captures. `display` records the full screen, `window` the active window, `viewport` the browser content area. Ignored by the `browser` engine, which always captures its tab. `window` and `viewport` are best-effort (captured full-screen, then cropped).",
550004
+ description: "What the `ffmpeg` engine captures. `display` records the full screen, `window` the active window, `viewport` the browser content area. Ignored by the `browser` engine, which always captures its tab. `window` and `viewport` are best-effort (captured full-screen, then cropped). If unset, defaults to `window` when the recording's `surface` is an app surface and to `display` otherwise. `viewport` doesn't apply to app surfaces (they have no browser viewport).",
548199
550005
  enum: [
548200
550006
  "display",
548201
550007
  "window",
548202
550008
  "viewport"
548203
- ],
548204
- default: "display"
550009
+ ]
548205
550010
  },
548206
550011
  fps: {
548207
550012
  type: "integer",
@@ -548219,7 +550024,7 @@ var schemas_default = {
548219
550024
  {
548220
550025
  type: "boolean",
548221
550026
  title: "Record (boolean)",
548222
- description: "If `true`, starts recording \u2014 auto-selecting the `browser` engine for a visible Chrome context and the `ffmpeg` engine otherwise. If `false`, doesn't record."
550027
+ description: "If `true`, starts recording \u2014 auto-selecting the `browser` engine for a visible Chrome context, the device screen on Android/iOS contexts, and the `ffmpeg` engine otherwise. If `false`, doesn't record."
548223
550028
  }
548224
550029
  ],
548225
550030
  components: {
@@ -548237,7 +550042,7 @@ var schemas_default = {
548237
550042
  type: "object",
548238
550043
  properties: {
548239
550044
  surface: {
548240
- description: "The browser window/tab to record. Omit to record the active tab. The targeted tab stays focused afterward.",
550045
+ description: 'The browser window/tab or app window to record. Omit to record the active surface. The targeted surface stays focused afterward. App surfaces use the object form ({ "app": \u2026 }) and are captured via the `ffmpeg` engine, cropped to the app window by default.',
548241
550046
  anyOf: [
548242
550047
  {
548243
550048
  title: "Surface (by browser engine)",
@@ -548387,6 +550192,72 @@ var schemas_default = {
548387
550192
  ]
548388
550193
  }
548389
550194
  }
550195
+ },
550196
+ {
550197
+ title: "App surface",
550198
+ type: "object",
550199
+ additionalProperties: false,
550200
+ required: [
550201
+ "app"
550202
+ ],
550203
+ properties: {
550204
+ app: {
550205
+ type: "string",
550206
+ minLength: 1,
550207
+ pattern: "\\S",
550208
+ transform: [
550209
+ "trim"
550210
+ ],
550211
+ description: "Name of an app surface opened by `startSurface` (its `name`, or the default derived from the app identifier)."
550212
+ },
550213
+ window: {
550214
+ description: "Which app window to act on. Omit to use the active window. Apps have windows, no tabs.",
550215
+ title: "App window selector",
550216
+ anyOf: [
550217
+ {
550218
+ title: "By index",
550219
+ type: "integer",
550220
+ description: "Index in creation order. Negative counts from the end; `-1` is the newest (e.g. a dialog the app just opened)."
550221
+ },
550222
+ {
550223
+ title: "By name",
550224
+ type: "string",
550225
+ minLength: 1,
550226
+ pattern: "\\S",
550227
+ transform: [
550228
+ "trim"
550229
+ ],
550230
+ description: "Assigned window name. The integer branch is listed first because Ajv validates with coerceTypes \u2014 string-first would coerce integer indexes into name strings."
550231
+ },
550232
+ {
550233
+ title: "By criteria",
550234
+ type: "object",
550235
+ additionalProperties: false,
550236
+ minProperties: 1,
550237
+ properties: {
550238
+ name: {
550239
+ type: "string",
550240
+ minLength: 1,
550241
+ pattern: "\\S",
550242
+ transform: [
550243
+ "trim"
550244
+ ],
550245
+ description: "Assigned window name."
550246
+ },
550247
+ index: {
550248
+ type: "integer",
550249
+ description: "Index in creation order. Negative counts from the end."
550250
+ },
550251
+ title: {
550252
+ type: "string",
550253
+ minLength: 1,
550254
+ description: "Window title to match. Substring, or /regex/."
550255
+ }
550256
+ }
550257
+ }
550258
+ ]
550259
+ }
550260
+ }
548390
550261
  }
548391
550262
  ]
548392
550263
  },
@@ -548452,13 +550323,12 @@ var schemas_default = {
548452
550323
  },
548453
550324
  target: {
548454
550325
  type: "string",
548455
- description: "What the `ffmpeg` engine captures. `display` records the full screen, `window` the active window, `viewport` the browser content area. Ignored by the `browser` engine, which always captures its tab. `window` and `viewport` are best-effort (captured full-screen, then cropped).",
550326
+ description: "What the `ffmpeg` engine captures. `display` records the full screen, `window` the active window, `viewport` the browser content area. Ignored by the `browser` engine, which always captures its tab. `window` and `viewport` are best-effort (captured full-screen, then cropped). If unset, defaults to `window` when the recording's `surface` is an app surface and to `display` otherwise. `viewport` doesn't apply to app surfaces (they have no browser viewport).",
548456
550327
  enum: [
548457
550328
  "display",
548458
550329
  "window",
548459
550330
  "viewport"
548460
- ],
548461
- default: "display"
550331
+ ]
548462
550332
  },
548463
550333
  fps: {
548464
550334
  type: "integer",
@@ -548504,13 +550374,12 @@ var schemas_default = {
548504
550374
  },
548505
550375
  target: {
548506
550376
  type: "string",
548507
- description: "What the `ffmpeg` engine captures. `display` records the full screen, `window` the active window, `viewport` the browser content area. Ignored by the `browser` engine, which always captures its tab. `window` and `viewport` are best-effort (captured full-screen, then cropped).",
550377
+ description: "What the `ffmpeg` engine captures. `display` records the full screen, `window` the active window, `viewport` the browser content area. Ignored by the `browser` engine, which always captures its tab. `window` and `viewport` are best-effort (captured full-screen, then cropped). If unset, defaults to `window` when the recording's `surface` is an app surface and to `display` otherwise. `viewport` doesn't apply to app surfaces (they have no browser viewport).",
548508
550378
  enum: [
548509
550379
  "display",
548510
550380
  "window",
548511
550381
  "viewport"
548512
- ],
548513
- default: "display"
550382
+ ]
548514
550383
  },
548515
550384
  fps: {
548516
550385
  type: "integer",
@@ -548543,6 +550412,22 @@ var schemas_default = {
548543
550412
  target: "window",
548544
550413
  fps: 60
548545
550414
  }
550415
+ },
550416
+ {
550417
+ path: "notepad.mp4",
550418
+ surface: {
550419
+ app: "notepad"
550420
+ }
550421
+ },
550422
+ {
550423
+ path: "full-screen.mp4",
550424
+ surface: {
550425
+ app: "notepad"
550426
+ },
550427
+ engine: {
550428
+ name: "ffmpeg",
550429
+ target: "display"
550430
+ }
548546
550431
  }
548547
550432
  ]
548548
550433
  }
@@ -591846,7 +593731,7 @@ var schemas_default = {
591846
593731
  record: {
591847
593732
  $schema: "http://json-schema.org/draft-07/schema#",
591848
593733
  title: "record",
591849
- description: "Start recording. Must be followed by a `stopRecord` step. The `browser` engine captures the Chrome viewport (works under concurrency); the `ffmpeg` engine captures the screen and supports any application. Supported extensions: [ '.mp4', '.webm', '.gif' ]",
593734
+ description: "Start recording. Must be followed by a `stopRecord` step. The `browser` engine captures the Chrome viewport (works under concurrency); the `ffmpeg` engine captures the screen and supports any application. On Android/iOS contexts, recording captures the device screen through the device itself \u2014 `engine` doesn't apply. Supported extensions: [ '.mp4', '.webm', '.gif' ]",
591850
593735
  anyOf: [
591851
593736
  {
591852
593737
  title: "Record (simple)",
@@ -591861,7 +593746,7 @@ var schemas_default = {
591861
593746
  type: "object",
591862
593747
  properties: {
591863
593748
  surface: {
591864
- description: "The browser window/tab to record. Omit to record the active tab. The targeted tab stays focused afterward.",
593749
+ description: 'The browser window/tab or app window to record. Omit to record the active surface. The targeted surface stays focused afterward. App surfaces use the object form ({ "app": \u2026 }) and are captured via the `ffmpeg` engine, cropped to the app window by default.',
591865
593750
  anyOf: [
591866
593751
  {
591867
593752
  title: "Surface (by browser engine)",
@@ -592011,6 +593896,72 @@ var schemas_default = {
592011
593896
  ]
592012
593897
  }
592013
593898
  }
593899
+ },
593900
+ {
593901
+ title: "App surface",
593902
+ type: "object",
593903
+ additionalProperties: false,
593904
+ required: [
593905
+ "app"
593906
+ ],
593907
+ properties: {
593908
+ app: {
593909
+ type: "string",
593910
+ minLength: 1,
593911
+ pattern: "\\S",
593912
+ transform: [
593913
+ "trim"
593914
+ ],
593915
+ description: "Name of an app surface opened by `startSurface` (its `name`, or the default derived from the app identifier)."
593916
+ },
593917
+ window: {
593918
+ description: "Which app window to act on. Omit to use the active window. Apps have windows, no tabs.",
593919
+ title: "App window selector",
593920
+ anyOf: [
593921
+ {
593922
+ title: "By index",
593923
+ type: "integer",
593924
+ description: "Index in creation order. Negative counts from the end; `-1` is the newest (e.g. a dialog the app just opened)."
593925
+ },
593926
+ {
593927
+ title: "By name",
593928
+ type: "string",
593929
+ minLength: 1,
593930
+ pattern: "\\S",
593931
+ transform: [
593932
+ "trim"
593933
+ ],
593934
+ description: "Assigned window name. The integer branch is listed first because Ajv validates with coerceTypes \u2014 string-first would coerce integer indexes into name strings."
593935
+ },
593936
+ {
593937
+ title: "By criteria",
593938
+ type: "object",
593939
+ additionalProperties: false,
593940
+ minProperties: 1,
593941
+ properties: {
593942
+ name: {
593943
+ type: "string",
593944
+ minLength: 1,
593945
+ pattern: "\\S",
593946
+ transform: [
593947
+ "trim"
593948
+ ],
593949
+ description: "Assigned window name."
593950
+ },
593951
+ index: {
593952
+ type: "integer",
593953
+ description: "Index in creation order. Negative counts from the end."
593954
+ },
593955
+ title: {
593956
+ type: "string",
593957
+ minLength: 1,
593958
+ description: "Window title to match. Substring, or /regex/."
593959
+ }
593960
+ }
593961
+ }
593962
+ ]
593963
+ }
593964
+ }
592014
593965
  }
592015
593966
  ]
592016
593967
  },
@@ -592076,13 +594027,12 @@ var schemas_default = {
592076
594027
  },
592077
594028
  target: {
592078
594029
  type: "string",
592079
- description: "What the `ffmpeg` engine captures. `display` records the full screen, `window` the active window, `viewport` the browser content area. Ignored by the `browser` engine, which always captures its tab. `window` and `viewport` are best-effort (captured full-screen, then cropped).",
594030
+ description: "What the `ffmpeg` engine captures. `display` records the full screen, `window` the active window, `viewport` the browser content area. Ignored by the `browser` engine, which always captures its tab. `window` and `viewport` are best-effort (captured full-screen, then cropped). If unset, defaults to `window` when the recording's `surface` is an app surface and to `display` otherwise. `viewport` doesn't apply to app surfaces (they have no browser viewport).",
592080
594031
  enum: [
592081
594032
  "display",
592082
594033
  "window",
592083
594034
  "viewport"
592084
- ],
592085
- default: "display"
594035
+ ]
592086
594036
  },
592087
594037
  fps: {
592088
594038
  type: "integer",
@@ -592100,7 +594050,7 @@ var schemas_default = {
592100
594050
  {
592101
594051
  type: "boolean",
592102
594052
  title: "Record (boolean)",
592103
- description: "If `true`, starts recording \u2014 auto-selecting the `browser` engine for a visible Chrome context and the `ffmpeg` engine otherwise. If `false`, doesn't record."
594053
+ description: "If `true`, starts recording \u2014 auto-selecting the `browser` engine for a visible Chrome context, the device screen on Android/iOS contexts, and the `ffmpeg` engine otherwise. If `false`, doesn't record."
592104
594054
  }
592105
594055
  ],
592106
594056
  components: {
@@ -592118,7 +594068,7 @@ var schemas_default = {
592118
594068
  type: "object",
592119
594069
  properties: {
592120
594070
  surface: {
592121
- description: "The browser window/tab to record. Omit to record the active tab. The targeted tab stays focused afterward.",
594071
+ description: 'The browser window/tab or app window to record. Omit to record the active surface. The targeted surface stays focused afterward. App surfaces use the object form ({ "app": \u2026 }) and are captured via the `ffmpeg` engine, cropped to the app window by default.',
592122
594072
  anyOf: [
592123
594073
  {
592124
594074
  title: "Surface (by browser engine)",
@@ -592268,6 +594218,72 @@ var schemas_default = {
592268
594218
  ]
592269
594219
  }
592270
594220
  }
594221
+ },
594222
+ {
594223
+ title: "App surface",
594224
+ type: "object",
594225
+ additionalProperties: false,
594226
+ required: [
594227
+ "app"
594228
+ ],
594229
+ properties: {
594230
+ app: {
594231
+ type: "string",
594232
+ minLength: 1,
594233
+ pattern: "\\S",
594234
+ transform: [
594235
+ "trim"
594236
+ ],
594237
+ description: "Name of an app surface opened by `startSurface` (its `name`, or the default derived from the app identifier)."
594238
+ },
594239
+ window: {
594240
+ description: "Which app window to act on. Omit to use the active window. Apps have windows, no tabs.",
594241
+ title: "App window selector",
594242
+ anyOf: [
594243
+ {
594244
+ title: "By index",
594245
+ type: "integer",
594246
+ description: "Index in creation order. Negative counts from the end; `-1` is the newest (e.g. a dialog the app just opened)."
594247
+ },
594248
+ {
594249
+ title: "By name",
594250
+ type: "string",
594251
+ minLength: 1,
594252
+ pattern: "\\S",
594253
+ transform: [
594254
+ "trim"
594255
+ ],
594256
+ description: "Assigned window name. The integer branch is listed first because Ajv validates with coerceTypes \u2014 string-first would coerce integer indexes into name strings."
594257
+ },
594258
+ {
594259
+ title: "By criteria",
594260
+ type: "object",
594261
+ additionalProperties: false,
594262
+ minProperties: 1,
594263
+ properties: {
594264
+ name: {
594265
+ type: "string",
594266
+ minLength: 1,
594267
+ pattern: "\\S",
594268
+ transform: [
594269
+ "trim"
594270
+ ],
594271
+ description: "Assigned window name."
594272
+ },
594273
+ index: {
594274
+ type: "integer",
594275
+ description: "Index in creation order. Negative counts from the end."
594276
+ },
594277
+ title: {
594278
+ type: "string",
594279
+ minLength: 1,
594280
+ description: "Window title to match. Substring, or /regex/."
594281
+ }
594282
+ }
594283
+ }
594284
+ ]
594285
+ }
594286
+ }
592271
594287
  }
592272
594288
  ]
592273
594289
  },
@@ -592333,13 +594349,12 @@ var schemas_default = {
592333
594349
  },
592334
594350
  target: {
592335
594351
  type: "string",
592336
- description: "What the `ffmpeg` engine captures. `display` records the full screen, `window` the active window, `viewport` the browser content area. Ignored by the `browser` engine, which always captures its tab. `window` and `viewport` are best-effort (captured full-screen, then cropped).",
594352
+ description: "What the `ffmpeg` engine captures. `display` records the full screen, `window` the active window, `viewport` the browser content area. Ignored by the `browser` engine, which always captures its tab. `window` and `viewport` are best-effort (captured full-screen, then cropped). If unset, defaults to `window` when the recording's `surface` is an app surface and to `display` otherwise. `viewport` doesn't apply to app surfaces (they have no browser viewport).",
592337
594353
  enum: [
592338
594354
  "display",
592339
594355
  "window",
592340
594356
  "viewport"
592341
- ],
592342
- default: "display"
594357
+ ]
592343
594358
  },
592344
594359
  fps: {
592345
594360
  type: "integer",
@@ -592385,13 +594400,12 @@ var schemas_default = {
592385
594400
  },
592386
594401
  target: {
592387
594402
  type: "string",
592388
- description: "What the `ffmpeg` engine captures. `display` records the full screen, `window` the active window, `viewport` the browser content area. Ignored by the `browser` engine, which always captures its tab. `window` and `viewport` are best-effort (captured full-screen, then cropped).",
594403
+ description: "What the `ffmpeg` engine captures. `display` records the full screen, `window` the active window, `viewport` the browser content area. Ignored by the `browser` engine, which always captures its tab. `window` and `viewport` are best-effort (captured full-screen, then cropped). If unset, defaults to `window` when the recording's `surface` is an app surface and to `display` otherwise. `viewport` doesn't apply to app surfaces (they have no browser viewport).",
592389
594404
  enum: [
592390
594405
  "display",
592391
594406
  "window",
592392
594407
  "viewport"
592393
- ],
592394
- default: "display"
594408
+ ]
592395
594409
  },
592396
594410
  fps: {
592397
594411
  type: "integer",
@@ -592424,6 +594438,22 @@ var schemas_default = {
592424
594438
  target: "window",
592425
594439
  fps: 60
592426
594440
  }
594441
+ },
594442
+ {
594443
+ path: "notepad.mp4",
594444
+ surface: {
594445
+ app: "notepad"
594446
+ }
594447
+ },
594448
+ {
594449
+ path: "full-screen.mp4",
594450
+ surface: {
594451
+ app: "notepad"
594452
+ },
594453
+ engine: {
594454
+ name: "ffmpeg",
594455
+ target: "display"
594456
+ }
592427
594457
  }
592428
594458
  ]
592429
594459
  }