doc-detective 4.21.0 → 4.22.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. package/dist/common/src/schemas/schemas.json +264 -264
  2. package/dist/common/src/types/generated/config_v3.d.ts +4 -4
  3. package/dist/common/src/types/generated/context_v3.d.ts +4 -4
  4. package/dist/common/src/types/generated/report_v3.d.ts +4 -4
  5. package/dist/common/src/types/generated/resolvedTests_v3.d.ts +8 -8
  6. package/dist/common/src/types/generated/spec_v3.d.ts +4 -4
  7. package/dist/common/src/types/generated/startSurface_v3.d.ts +7 -7
  8. package/dist/common/src/types/generated/step_v3.d.ts +7 -7
  9. package/dist/common/src/types/generated/test_v3.d.ts +18 -18
  10. package/dist/core/tests/androidEmulator.d.ts +2 -12
  11. package/dist/core/tests/androidEmulator.d.ts.map +1 -1
  12. package/dist/core/tests/androidEmulator.js +5 -17
  13. package/dist/core/tests/androidEmulator.js.map +1 -1
  14. package/dist/core/tests/appSurface.d.ts +35 -1
  15. package/dist/core/tests/appSurface.d.ts.map +1 -1
  16. package/dist/core/tests/appSurface.js +162 -20
  17. package/dist/core/tests/appSurface.js.map +1 -1
  18. package/dist/core/tests/iosSimulator.d.ts +89 -0
  19. package/dist/core/tests/iosSimulator.d.ts.map +1 -0
  20. package/dist/core/tests/iosSimulator.js +453 -0
  21. package/dist/core/tests/iosSimulator.js.map +1 -0
  22. package/dist/core/tests/mobileDevice.d.ts +15 -0
  23. package/dist/core/tests/mobileDevice.d.ts.map +1 -0
  24. package/dist/core/tests/mobileDevice.js +24 -0
  25. package/dist/core/tests/mobileDevice.js.map +1 -0
  26. package/dist/core/tests/mobilePlatform.d.ts +1 -2
  27. package/dist/core/tests/mobilePlatform.d.ts.map +1 -1
  28. package/dist/core/tests/mobilePlatform.js +15 -14
  29. package/dist/core/tests/mobilePlatform.js.map +1 -1
  30. package/dist/core/tests.d.ts.map +1 -1
  31. package/dist/core/tests.js +152 -45
  32. package/dist/core/tests.js.map +1 -1
  33. package/dist/index.cjs +845 -331
  34. package/dist/runtime/heavyDeps.d.ts +1 -1
  35. package/dist/runtime/heavyDeps.d.ts.map +1 -1
  36. package/dist/runtime/heavyDeps.js +1 -0
  37. package/dist/runtime/heavyDeps.js.map +1 -1
  38. package/dist/runtime/installCommand.d.ts +1 -1
  39. package/dist/runtime/installCommand.d.ts.map +1 -1
  40. package/dist/runtime/installCommand.js +21 -4
  41. package/dist/runtime/installCommand.js.map +1 -1
  42. package/dist/runtime/iosInstaller.d.ts +23 -0
  43. package/dist/runtime/iosInstaller.d.ts.map +1 -0
  44. package/dist/runtime/iosInstaller.js +104 -0
  45. package/dist/runtime/iosInstaller.js.map +1 -0
  46. package/package.json +2 -1
package/dist/index.cjs CHANGED
@@ -2834,7 +2834,7 @@ var init_schemas = __esm({
2834
2834
  ]
2835
2835
  },
2836
2836
  device: {
2837
- description: "Default device for a mobile (`android`/`ios`) context. A string references a device by name; an object refines it. The `platform` is implied by the context, so it is not required here. When the named device doesn't already exist, Doc Detective creates it with defaults (see `deviceType`/`osVersion`), provided the toolchain is installed (`doc-detective install android`). Same shape as `startSurface.device`.",
2837
+ description: "Default device for a mobile (`android`/`ios`) context. A string references a device by name; an object refines it. The `platform` is implied by the context, so it is not required here. When the named device doesn't already exist, Doc Detective creates it with defaults (see `deviceType`/`osVersion`), provided the toolchain is installed (`doc-detective install android` or `doc-detective install ios`). Same shape as `startSurface.device`.",
2838
2838
  examples: [
2839
2839
  "pixel7",
2840
2840
  {
@@ -2873,7 +2873,7 @@ var init_schemas = __esm({
2873
2873
  transform: [
2874
2874
  "trim"
2875
2875
  ],
2876
- description: "Device name and registry identity \u2014 the same name resolves to the same device. Reference form: names an existing AVD (Android) / simulator (iOS) to reuse. If no device by this name exists, Doc Detective creates one under this name using `deviceType`/`osVersion` (or their defaults), provided the toolchain and a matching system image are installed (`doc-detective install android`)."
2876
+ description: "Device name and registry identity \u2014 the same name resolves to the same device. Reference form: names an existing AVD (Android) / simulator (iOS) to reuse. If no device by this name exists, Doc Detective creates one under this name using `deviceType`/`osVersion` (or their defaults), provided the toolchain is installed (`doc-detective install android` or `doc-detective install ios`)."
2877
2877
  },
2878
2878
  deviceType: {
2879
2879
  type: "string",
@@ -2886,11 +2886,11 @@ var init_schemas = __esm({
2886
2886
  osVersion: {
2887
2887
  type: "string",
2888
2888
  minLength: 1,
2889
- description: "Platform version used when creating a device; must match an installed system image (install more with `doc-detective install android`). Ignored when `name` already matches an existing device. Default: the newest installed version."
2889
+ description: "Platform version used when creating a device; must match an installed image/runtime for the target platform (install more with `doc-detective install android` or `doc-detective install ios`). Ignored when `name` already matches an existing device. Default: the newest installed version."
2890
2890
  },
2891
2891
  headless: {
2892
2892
  type: "boolean",
2893
- description: "Run the Android emulator without a window. Ignored where not applicable."
2893
+ description: "Run the Android emulator without a window. No-op on iOS (simulators boot without the Simulator UI on CI) and ignored where not applicable."
2894
2894
  },
2895
2895
  orientation: {
2896
2896
  type: "string",
@@ -38839,7 +38839,7 @@ var init_schemas = __esm({
38839
38839
  startSurface: {
38840
38840
  $schema: "http://json-schema.org/draft-07/schema#",
38841
38841
  title: "startSurface",
38842
- description: "Open (provision) a surface and register it by name so later steps can target it with `surface`. Phases A1\u2013A2 ship the desktop native app branch: launch a Windows or macOS application by executable path, `.app` path, bundle ID, or UWP AppUserModelID. macOS additionally requires the Accessibility permission for the process that runs Doc Detective (System Settings \u2192 Privacy & Security \u2192 Accessibility); without it the context lands as SKIPPED with a walkthrough. Phase A3 adds Android apps on a managed emulator via the `device`, `install`, and `activity` fields (iOS lands in A4). Browser/process branches and the parallel array form arrive with multi-surface Phase 6. See docs/design/native-app-surfaces.md.",
38842
+ description: "Open (provision) a surface and register it by name so later steps can target it with `surface`. Phases A1\u2013A2 ship the desktop native app branch: launch a Windows or macOS application by executable path, `.app` path, bundle ID, or UWP AppUserModelID. macOS additionally requires the Accessibility permission for the process that runs Doc Detective (System Settings \u2192 Privacy & Security \u2192 Accessibility); without it the context lands as SKIPPED with a walkthrough. Phase A3 adds Android apps on a managed emulator, and phase A4 adds iOS app surfaces on macOS via XCUITest/simctl. Browser/process branches and the parallel array form arrive with multi-surface Phase 6. See docs/design/native-app-surfaces.md.",
38843
38843
  components: {
38844
38844
  schemas: {
38845
38845
  appDescriptor: {
@@ -38891,15 +38891,15 @@ var init_schemas = __esm({
38891
38891
  install: {
38892
38892
  type: "string",
38893
38893
  minLength: 1,
38894
- description: "Path to an installable artifact (`.apk`/`.app`/`.ipa`) to install on the device before launch. Lands with the Android phase (A3); on other platforms it is validated but not yet honored."
38894
+ description: "Path to an installable artifact (`.apk`/`.app`/`.ipa`) to install on the device before launch. Supported on Android and iOS app surfaces."
38895
38895
  },
38896
38896
  activity: {
38897
38897
  type: "string",
38898
38898
  minLength: 1,
38899
- description: "Android main activity override (defaults to the package's launcher activity). Lands with the Android phase (A3)."
38899
+ description: "Android main activity override (defaults to the package's launcher activity). Android-only."
38900
38900
  },
38901
38901
  device: {
38902
- description: "Device the app runs on. Omit for a host desktop app, or (in a mobile context) to use the context's default device. A string references a device by name; an object refines it. Lands with the Android phase (A3).",
38902
+ description: "Device the app runs on. Omit for a host desktop app, or (in a mobile context) to use the context's default device. A string references a device by name; an object refines it. Supported on Android and iOS mobile targets.",
38903
38903
  anyOf: [
38904
38904
  {
38905
38905
  type: "string",
@@ -38932,7 +38932,7 @@ var init_schemas = __esm({
38932
38932
  transform: [
38933
38933
  "trim"
38934
38934
  ],
38935
- description: "Device name and registry identity \u2014 the same name resolves to the same device. Reference form: names an existing AVD (Android) / simulator (iOS) to reuse. If no device by this name exists, Doc Detective creates one under this name using `deviceType`/`osVersion` (or their defaults), provided the toolchain and a matching system image are installed (`doc-detective install android`)."
38935
+ description: "Device name and registry identity \u2014 the same name resolves to the same device. Reference form: names an existing AVD (Android) / simulator (iOS) to reuse. If no device by this name exists, Doc Detective creates one under this name using `deviceType`/`osVersion` (or their defaults), provided the toolchain is installed (`doc-detective install android` or `doc-detective install ios`)."
38936
38936
  },
38937
38937
  deviceType: {
38938
38938
  type: "string",
@@ -38945,11 +38945,11 @@ var init_schemas = __esm({
38945
38945
  osVersion: {
38946
38946
  type: "string",
38947
38947
  minLength: 1,
38948
- description: "Platform version used when creating a device; must match an installed system image (install more with `doc-detective install android`). Ignored when `name` already matches an existing device. Default: the newest installed version."
38948
+ description: "Platform version used when creating a device; must match an installed image/runtime for the target platform (install more with `doc-detective install android` or `doc-detective install ios`). Ignored when `name` already matches an existing device. Default: the newest installed version."
38949
38949
  },
38950
38950
  headless: {
38951
38951
  type: "boolean",
38952
- description: "Run the Android emulator without a window. Ignored where not applicable."
38952
+ description: "Run the Android emulator without a window. No-op on iOS (simulators boot without the Simulator UI on CI) and ignored where not applicable."
38953
38953
  },
38954
38954
  orientation: {
38955
38955
  type: "string",
@@ -39121,7 +39121,7 @@ var init_schemas = __esm({
39121
39121
  transform: [
39122
39122
  "trim"
39123
39123
  ],
39124
- description: "Device name and registry identity \u2014 the same name resolves to the same device. Reference form: names an existing AVD (Android) / simulator (iOS) to reuse. If no device by this name exists, Doc Detective creates one under this name using `deviceType`/`osVersion` (or their defaults), provided the toolchain and a matching system image are installed (`doc-detective install android`)."
39124
+ description: "Device name and registry identity \u2014 the same name resolves to the same device. Reference form: names an existing AVD (Android) / simulator (iOS) to reuse. If no device by this name exists, Doc Detective creates one under this name using `deviceType`/`osVersion` (or their defaults), provided the toolchain is installed (`doc-detective install android` or `doc-detective install ios`)."
39125
39125
  },
39126
39126
  deviceType: {
39127
39127
  type: "string",
@@ -39134,11 +39134,11 @@ var init_schemas = __esm({
39134
39134
  osVersion: {
39135
39135
  type: "string",
39136
39136
  minLength: 1,
39137
- description: "Platform version used when creating a device; must match an installed system image (install more with `doc-detective install android`). Ignored when `name` already matches an existing device. Default: the newest installed version."
39137
+ description: "Platform version used when creating a device; must match an installed image/runtime for the target platform (install more with `doc-detective install android` or `doc-detective install ios`). Ignored when `name` already matches an existing device. Default: the newest installed version."
39138
39138
  },
39139
39139
  headless: {
39140
39140
  type: "boolean",
39141
- description: "Run the Android emulator without a window. Ignored where not applicable."
39141
+ description: "Run the Android emulator without a window. No-op on iOS (simulators boot without the Simulator UI on CI) and ignored where not applicable."
39142
39142
  },
39143
39143
  orientation: {
39144
39144
  type: "string",
@@ -39237,15 +39237,15 @@ var init_schemas = __esm({
39237
39237
  install: {
39238
39238
  type: "string",
39239
39239
  minLength: 1,
39240
- description: "Path to an installable artifact (`.apk`/`.app`/`.ipa`) to install on the device before launch. Lands with the Android phase (A3); on other platforms it is validated but not yet honored."
39240
+ description: "Path to an installable artifact (`.apk`/`.app`/`.ipa`) to install on the device before launch. Supported on Android and iOS app surfaces."
39241
39241
  },
39242
39242
  activity: {
39243
39243
  type: "string",
39244
39244
  minLength: 1,
39245
- description: "Android main activity override (defaults to the package's launcher activity). Lands with the Android phase (A3)."
39245
+ description: "Android main activity override (defaults to the package's launcher activity). Android-only."
39246
39246
  },
39247
39247
  device: {
39248
- description: "Device the app runs on. Omit for a host desktop app, or (in a mobile context) to use the context's default device. A string references a device by name; an object refines it. Lands with the Android phase (A3).",
39248
+ description: "Device the app runs on. Omit for a host desktop app, or (in a mobile context) to use the context's default device. A string references a device by name; an object refines it. Supported on Android and iOS mobile targets.",
39249
39249
  anyOf: [
39250
39250
  {
39251
39251
  type: "string",
@@ -39278,7 +39278,7 @@ var init_schemas = __esm({
39278
39278
  transform: [
39279
39279
  "trim"
39280
39280
  ],
39281
- description: "Device name and registry identity \u2014 the same name resolves to the same device. Reference form: names an existing AVD (Android) / simulator (iOS) to reuse. If no device by this name exists, Doc Detective creates one under this name using `deviceType`/`osVersion` (or their defaults), provided the toolchain and a matching system image are installed (`doc-detective install android`)."
39281
+ description: "Device name and registry identity \u2014 the same name resolves to the same device. Reference form: names an existing AVD (Android) / simulator (iOS) to reuse. If no device by this name exists, Doc Detective creates one under this name using `deviceType`/`osVersion` (or their defaults), provided the toolchain is installed (`doc-detective install android` or `doc-detective install ios`)."
39282
39282
  },
39283
39283
  deviceType: {
39284
39284
  type: "string",
@@ -39291,11 +39291,11 @@ var init_schemas = __esm({
39291
39291
  osVersion: {
39292
39292
  type: "string",
39293
39293
  minLength: 1,
39294
- description: "Platform version used when creating a device; must match an installed system image (install more with `doc-detective install android`). Ignored when `name` already matches an existing device. Default: the newest installed version."
39294
+ description: "Platform version used when creating a device; must match an installed image/runtime for the target platform (install more with `doc-detective install android` or `doc-detective install ios`). Ignored when `name` already matches an existing device. Default: the newest installed version."
39295
39295
  },
39296
39296
  headless: {
39297
39297
  type: "boolean",
39298
- description: "Run the Android emulator without a window. Ignored where not applicable."
39298
+ description: "Run the Android emulator without a window. No-op on iOS (simulators boot without the Simulator UI on CI) and ignored where not applicable."
39299
39299
  },
39300
39300
  orientation: {
39301
39301
  type: "string",
@@ -81030,7 +81030,7 @@ var init_schemas = __esm({
81030
81030
  startSurface: {
81031
81031
  $schema: "http://json-schema.org/draft-07/schema#",
81032
81032
  title: "startSurface",
81033
- description: "Open (provision) a surface and register it by name so later steps can target it with `surface`. Phases A1\u2013A2 ship the desktop native app branch: launch a Windows or macOS application by executable path, `.app` path, bundle ID, or UWP AppUserModelID. macOS additionally requires the Accessibility permission for the process that runs Doc Detective (System Settings \u2192 Privacy & Security \u2192 Accessibility); without it the context lands as SKIPPED with a walkthrough. Phase A3 adds Android apps on a managed emulator via the `device`, `install`, and `activity` fields (iOS lands in A4). Browser/process branches and the parallel array form arrive with multi-surface Phase 6. See docs/design/native-app-surfaces.md.",
81033
+ description: "Open (provision) a surface and register it by name so later steps can target it with `surface`. Phases A1\u2013A2 ship the desktop native app branch: launch a Windows or macOS application by executable path, `.app` path, bundle ID, or UWP AppUserModelID. macOS additionally requires the Accessibility permission for the process that runs Doc Detective (System Settings \u2192 Privacy & Security \u2192 Accessibility); without it the context lands as SKIPPED with a walkthrough. Phase A3 adds Android apps on a managed emulator, and phase A4 adds iOS app surfaces on macOS via XCUITest/simctl. Browser/process branches and the parallel array form arrive with multi-surface Phase 6. See docs/design/native-app-surfaces.md.",
81034
81034
  components: {
81035
81035
  schemas: {
81036
81036
  appDescriptor: {
@@ -81082,15 +81082,15 @@ var init_schemas = __esm({
81082
81082
  install: {
81083
81083
  type: "string",
81084
81084
  minLength: 1,
81085
- description: "Path to an installable artifact (`.apk`/`.app`/`.ipa`) to install on the device before launch. Lands with the Android phase (A3); on other platforms it is validated but not yet honored."
81085
+ description: "Path to an installable artifact (`.apk`/`.app`/`.ipa`) to install on the device before launch. Supported on Android and iOS app surfaces."
81086
81086
  },
81087
81087
  activity: {
81088
81088
  type: "string",
81089
81089
  minLength: 1,
81090
- description: "Android main activity override (defaults to the package's launcher activity). Lands with the Android phase (A3)."
81090
+ description: "Android main activity override (defaults to the package's launcher activity). Android-only."
81091
81091
  },
81092
81092
  device: {
81093
- description: "Device the app runs on. Omit for a host desktop app, or (in a mobile context) to use the context's default device. A string references a device by name; an object refines it. Lands with the Android phase (A3).",
81093
+ description: "Device the app runs on. Omit for a host desktop app, or (in a mobile context) to use the context's default device. A string references a device by name; an object refines it. Supported on Android and iOS mobile targets.",
81094
81094
  anyOf: [
81095
81095
  {
81096
81096
  type: "string",
@@ -81123,7 +81123,7 @@ var init_schemas = __esm({
81123
81123
  transform: [
81124
81124
  "trim"
81125
81125
  ],
81126
- description: "Device name and registry identity \u2014 the same name resolves to the same device. Reference form: names an existing AVD (Android) / simulator (iOS) to reuse. If no device by this name exists, Doc Detective creates one under this name using `deviceType`/`osVersion` (or their defaults), provided the toolchain and a matching system image are installed (`doc-detective install android`)."
81126
+ description: "Device name and registry identity \u2014 the same name resolves to the same device. Reference form: names an existing AVD (Android) / simulator (iOS) to reuse. If no device by this name exists, Doc Detective creates one under this name using `deviceType`/`osVersion` (or their defaults), provided the toolchain is installed (`doc-detective install android` or `doc-detective install ios`)."
81127
81127
  },
81128
81128
  deviceType: {
81129
81129
  type: "string",
@@ -81136,11 +81136,11 @@ var init_schemas = __esm({
81136
81136
  osVersion: {
81137
81137
  type: "string",
81138
81138
  minLength: 1,
81139
- description: "Platform version used when creating a device; must match an installed system image (install more with `doc-detective install android`). Ignored when `name` already matches an existing device. Default: the newest installed version."
81139
+ description: "Platform version used when creating a device; must match an installed image/runtime for the target platform (install more with `doc-detective install android` or `doc-detective install ios`). Ignored when `name` already matches an existing device. Default: the newest installed version."
81140
81140
  },
81141
81141
  headless: {
81142
81142
  type: "boolean",
81143
- description: "Run the Android emulator without a window. Ignored where not applicable."
81143
+ description: "Run the Android emulator without a window. No-op on iOS (simulators boot without the Simulator UI on CI) and ignored where not applicable."
81144
81144
  },
81145
81145
  orientation: {
81146
81146
  type: "string",
@@ -81312,7 +81312,7 @@ var init_schemas = __esm({
81312
81312
  transform: [
81313
81313
  "trim"
81314
81314
  ],
81315
- description: "Device name and registry identity \u2014 the same name resolves to the same device. Reference form: names an existing AVD (Android) / simulator (iOS) to reuse. If no device by this name exists, Doc Detective creates one under this name using `deviceType`/`osVersion` (or their defaults), provided the toolchain and a matching system image are installed (`doc-detective install android`)."
81315
+ description: "Device name and registry identity \u2014 the same name resolves to the same device. Reference form: names an existing AVD (Android) / simulator (iOS) to reuse. If no device by this name exists, Doc Detective creates one under this name using `deviceType`/`osVersion` (or their defaults), provided the toolchain is installed (`doc-detective install android` or `doc-detective install ios`)."
81316
81316
  },
81317
81317
  deviceType: {
81318
81318
  type: "string",
@@ -81325,11 +81325,11 @@ var init_schemas = __esm({
81325
81325
  osVersion: {
81326
81326
  type: "string",
81327
81327
  minLength: 1,
81328
- description: "Platform version used when creating a device; must match an installed system image (install more with `doc-detective install android`). Ignored when `name` already matches an existing device. Default: the newest installed version."
81328
+ description: "Platform version used when creating a device; must match an installed image/runtime for the target platform (install more with `doc-detective install android` or `doc-detective install ios`). Ignored when `name` already matches an existing device. Default: the newest installed version."
81329
81329
  },
81330
81330
  headless: {
81331
81331
  type: "boolean",
81332
- description: "Run the Android emulator without a window. Ignored where not applicable."
81332
+ description: "Run the Android emulator without a window. No-op on iOS (simulators boot without the Simulator UI on CI) and ignored where not applicable."
81333
81333
  },
81334
81334
  orientation: {
81335
81335
  type: "string",
@@ -81428,15 +81428,15 @@ var init_schemas = __esm({
81428
81428
  install: {
81429
81429
  type: "string",
81430
81430
  minLength: 1,
81431
- description: "Path to an installable artifact (`.apk`/`.app`/`.ipa`) to install on the device before launch. Lands with the Android phase (A3); on other platforms it is validated but not yet honored."
81431
+ description: "Path to an installable artifact (`.apk`/`.app`/`.ipa`) to install on the device before launch. Supported on Android and iOS app surfaces."
81432
81432
  },
81433
81433
  activity: {
81434
81434
  type: "string",
81435
81435
  minLength: 1,
81436
- description: "Android main activity override (defaults to the package's launcher activity). Lands with the Android phase (A3)."
81436
+ description: "Android main activity override (defaults to the package's launcher activity). Android-only."
81437
81437
  },
81438
81438
  device: {
81439
- description: "Device the app runs on. Omit for a host desktop app, or (in a mobile context) to use the context's default device. A string references a device by name; an object refines it. Lands with the Android phase (A3).",
81439
+ description: "Device the app runs on. Omit for a host desktop app, or (in a mobile context) to use the context's default device. A string references a device by name; an object refines it. Supported on Android and iOS mobile targets.",
81440
81440
  anyOf: [
81441
81441
  {
81442
81442
  type: "string",
@@ -81469,7 +81469,7 @@ var init_schemas = __esm({
81469
81469
  transform: [
81470
81470
  "trim"
81471
81471
  ],
81472
- description: "Device name and registry identity \u2014 the same name resolves to the same device. Reference form: names an existing AVD (Android) / simulator (iOS) to reuse. If no device by this name exists, Doc Detective creates one under this name using `deviceType`/`osVersion` (or their defaults), provided the toolchain and a matching system image are installed (`doc-detective install android`)."
81472
+ description: "Device name and registry identity \u2014 the same name resolves to the same device. Reference form: names an existing AVD (Android) / simulator (iOS) to reuse. If no device by this name exists, Doc Detective creates one under this name using `deviceType`/`osVersion` (or their defaults), provided the toolchain is installed (`doc-detective install android` or `doc-detective install ios`)."
81473
81473
  },
81474
81474
  deviceType: {
81475
81475
  type: "string",
@@ -81482,11 +81482,11 @@ var init_schemas = __esm({
81482
81482
  osVersion: {
81483
81483
  type: "string",
81484
81484
  minLength: 1,
81485
- description: "Platform version used when creating a device; must match an installed system image (install more with `doc-detective install android`). Ignored when `name` already matches an existing device. Default: the newest installed version."
81485
+ description: "Platform version used when creating a device; must match an installed image/runtime for the target platform (install more with `doc-detective install android` or `doc-detective install ios`). Ignored when `name` already matches an existing device. Default: the newest installed version."
81486
81486
  },
81487
81487
  headless: {
81488
81488
  type: "boolean",
81489
- description: "Run the Android emulator without a window. Ignored where not applicable."
81489
+ description: "Run the Android emulator without a window. No-op on iOS (simulators boot without the Simulator UI on CI) and ignored where not applicable."
81490
81490
  },
81491
81491
  orientation: {
81492
81492
  type: "string",
@@ -87405,7 +87405,7 @@ var init_schemas = __esm({
87405
87405
  ]
87406
87406
  },
87407
87407
  device: {
87408
- description: "Default device for a mobile (`android`/`ios`) context. A string references a device by name; an object refines it. The `platform` is implied by the context, so it is not required here. When the named device doesn't already exist, Doc Detective creates it with defaults (see `deviceType`/`osVersion`), provided the toolchain is installed (`doc-detective install android`). Same shape as `startSurface.device`.",
87408
+ description: "Default device for a mobile (`android`/`ios`) context. A string references a device by name; an object refines it. The `platform` is implied by the context, so it is not required here. When the named device doesn't already exist, Doc Detective creates it with defaults (see `deviceType`/`osVersion`), provided the toolchain is installed (`doc-detective install android` or `doc-detective install ios`). Same shape as `startSurface.device`.",
87409
87409
  examples: [
87410
87410
  "pixel7",
87411
87411
  {
@@ -87444,7 +87444,7 @@ var init_schemas = __esm({
87444
87444
  transform: [
87445
87445
  "trim"
87446
87446
  ],
87447
- description: "Device name and registry identity \u2014 the same name resolves to the same device. Reference form: names an existing AVD (Android) / simulator (iOS) to reuse. If no device by this name exists, Doc Detective creates one under this name using `deviceType`/`osVersion` (or their defaults), provided the toolchain and a matching system image are installed (`doc-detective install android`)."
87447
+ description: "Device name and registry identity \u2014 the same name resolves to the same device. Reference form: names an existing AVD (Android) / simulator (iOS) to reuse. If no device by this name exists, Doc Detective creates one under this name using `deviceType`/`osVersion` (or their defaults), provided the toolchain is installed (`doc-detective install android` or `doc-detective install ios`)."
87448
87448
  },
87449
87449
  deviceType: {
87450
87450
  type: "string",
@@ -87457,11 +87457,11 @@ var init_schemas = __esm({
87457
87457
  osVersion: {
87458
87458
  type: "string",
87459
87459
  minLength: 1,
87460
- description: "Platform version used when creating a device; must match an installed system image (install more with `doc-detective install android`). Ignored when `name` already matches an existing device. Default: the newest installed version."
87460
+ description: "Platform version used when creating a device; must match an installed image/runtime for the target platform (install more with `doc-detective install android` or `doc-detective install ios`). Ignored when `name` already matches an existing device. Default: the newest installed version."
87461
87461
  },
87462
87462
  headless: {
87463
87463
  type: "boolean",
87464
- description: "Run the Android emulator without a window. Ignored where not applicable."
87464
+ description: "Run the Android emulator without a window. No-op on iOS (simulators boot without the Simulator UI on CI) and ignored where not applicable."
87465
87465
  },
87466
87466
  orientation: {
87467
87467
  type: "string",
@@ -100296,7 +100296,7 @@ var init_schemas = __esm({
100296
100296
  ]
100297
100297
  },
100298
100298
  device: {
100299
- description: "Default device for a mobile (`android`/`ios`) context. A string references a device by name; an object refines it. The `platform` is implied by the context, so it is not required here. When the named device doesn't already exist, Doc Detective creates it with defaults (see `deviceType`/`osVersion`), provided the toolchain is installed (`doc-detective install android`). Same shape as `startSurface.device`.",
100299
+ description: "Default device for a mobile (`android`/`ios`) context. A string references a device by name; an object refines it. The `platform` is implied by the context, so it is not required here. When the named device doesn't already exist, Doc Detective creates it with defaults (see `deviceType`/`osVersion`), provided the toolchain is installed (`doc-detective install android` or `doc-detective install ios`). Same shape as `startSurface.device`.",
100300
100300
  examples: [
100301
100301
  "pixel7",
100302
100302
  {
@@ -100335,7 +100335,7 @@ var init_schemas = __esm({
100335
100335
  transform: [
100336
100336
  "trim"
100337
100337
  ],
100338
- description: "Device name and registry identity \u2014 the same name resolves to the same device. Reference form: names an existing AVD (Android) / simulator (iOS) to reuse. If no device by this name exists, Doc Detective creates one under this name using `deviceType`/`osVersion` (or their defaults), provided the toolchain and a matching system image are installed (`doc-detective install android`)."
100338
+ description: "Device name and registry identity \u2014 the same name resolves to the same device. Reference form: names an existing AVD (Android) / simulator (iOS) to reuse. If no device by this name exists, Doc Detective creates one under this name using `deviceType`/`osVersion` (or their defaults), provided the toolchain is installed (`doc-detective install android` or `doc-detective install ios`)."
100339
100339
  },
100340
100340
  deviceType: {
100341
100341
  type: "string",
@@ -100348,11 +100348,11 @@ var init_schemas = __esm({
100348
100348
  osVersion: {
100349
100349
  type: "string",
100350
100350
  minLength: 1,
100351
- description: "Platform version used when creating a device; must match an installed system image (install more with `doc-detective install android`). Ignored when `name` already matches an existing device. Default: the newest installed version."
100351
+ description: "Platform version used when creating a device; must match an installed image/runtime for the target platform (install more with `doc-detective install android` or `doc-detective install ios`). Ignored when `name` already matches an existing device. Default: the newest installed version."
100352
100352
  },
100353
100353
  headless: {
100354
100354
  type: "boolean",
100355
- description: "Run the Android emulator without a window. Ignored where not applicable."
100355
+ description: "Run the Android emulator without a window. No-op on iOS (simulators boot without the Simulator UI on CI) and ignored where not applicable."
100356
100356
  },
100357
100357
  orientation: {
100358
100358
  type: "string",
@@ -136301,7 +136301,7 @@ var init_schemas = __esm({
136301
136301
  startSurface: {
136302
136302
  $schema: "http://json-schema.org/draft-07/schema#",
136303
136303
  title: "startSurface",
136304
- description: "Open (provision) a surface and register it by name so later steps can target it with `surface`. Phases A1\u2013A2 ship the desktop native app branch: launch a Windows or macOS application by executable path, `.app` path, bundle ID, or UWP AppUserModelID. macOS additionally requires the Accessibility permission for the process that runs Doc Detective (System Settings \u2192 Privacy & Security \u2192 Accessibility); without it the context lands as SKIPPED with a walkthrough. Phase A3 adds Android apps on a managed emulator via the `device`, `install`, and `activity` fields (iOS lands in A4). Browser/process branches and the parallel array form arrive with multi-surface Phase 6. See docs/design/native-app-surfaces.md.",
136304
+ description: "Open (provision) a surface and register it by name so later steps can target it with `surface`. Phases A1\u2013A2 ship the desktop native app branch: launch a Windows or macOS application by executable path, `.app` path, bundle ID, or UWP AppUserModelID. macOS additionally requires the Accessibility permission for the process that runs Doc Detective (System Settings \u2192 Privacy & Security \u2192 Accessibility); without it the context lands as SKIPPED with a walkthrough. Phase A3 adds Android apps on a managed emulator, and phase A4 adds iOS app surfaces on macOS via XCUITest/simctl. Browser/process branches and the parallel array form arrive with multi-surface Phase 6. See docs/design/native-app-surfaces.md.",
136305
136305
  components: {
136306
136306
  schemas: {
136307
136307
  appDescriptor: {
@@ -136353,15 +136353,15 @@ var init_schemas = __esm({
136353
136353
  install: {
136354
136354
  type: "string",
136355
136355
  minLength: 1,
136356
- description: "Path to an installable artifact (`.apk`/`.app`/`.ipa`) to install on the device before launch. Lands with the Android phase (A3); on other platforms it is validated but not yet honored."
136356
+ description: "Path to an installable artifact (`.apk`/`.app`/`.ipa`) to install on the device before launch. Supported on Android and iOS app surfaces."
136357
136357
  },
136358
136358
  activity: {
136359
136359
  type: "string",
136360
136360
  minLength: 1,
136361
- description: "Android main activity override (defaults to the package's launcher activity). Lands with the Android phase (A3)."
136361
+ description: "Android main activity override (defaults to the package's launcher activity). Android-only."
136362
136362
  },
136363
136363
  device: {
136364
- description: "Device the app runs on. Omit for a host desktop app, or (in a mobile context) to use the context's default device. A string references a device by name; an object refines it. Lands with the Android phase (A3).",
136364
+ description: "Device the app runs on. Omit for a host desktop app, or (in a mobile context) to use the context's default device. A string references a device by name; an object refines it. Supported on Android and iOS mobile targets.",
136365
136365
  anyOf: [
136366
136366
  {
136367
136367
  type: "string",
@@ -136394,7 +136394,7 @@ var init_schemas = __esm({
136394
136394
  transform: [
136395
136395
  "trim"
136396
136396
  ],
136397
- description: "Device name and registry identity \u2014 the same name resolves to the same device. Reference form: names an existing AVD (Android) / simulator (iOS) to reuse. If no device by this name exists, Doc Detective creates one under this name using `deviceType`/`osVersion` (or their defaults), provided the toolchain and a matching system image are installed (`doc-detective install android`)."
136397
+ description: "Device name and registry identity \u2014 the same name resolves to the same device. Reference form: names an existing AVD (Android) / simulator (iOS) to reuse. If no device by this name exists, Doc Detective creates one under this name using `deviceType`/`osVersion` (or their defaults), provided the toolchain is installed (`doc-detective install android` or `doc-detective install ios`)."
136398
136398
  },
136399
136399
  deviceType: {
136400
136400
  type: "string",
@@ -136407,11 +136407,11 @@ var init_schemas = __esm({
136407
136407
  osVersion: {
136408
136408
  type: "string",
136409
136409
  minLength: 1,
136410
- description: "Platform version used when creating a device; must match an installed system image (install more with `doc-detective install android`). Ignored when `name` already matches an existing device. Default: the newest installed version."
136410
+ description: "Platform version used when creating a device; must match an installed image/runtime for the target platform (install more with `doc-detective install android` or `doc-detective install ios`). Ignored when `name` already matches an existing device. Default: the newest installed version."
136411
136411
  },
136412
136412
  headless: {
136413
136413
  type: "boolean",
136414
- description: "Run the Android emulator without a window. Ignored where not applicable."
136414
+ description: "Run the Android emulator without a window. No-op on iOS (simulators boot without the Simulator UI on CI) and ignored where not applicable."
136415
136415
  },
136416
136416
  orientation: {
136417
136417
  type: "string",
@@ -136583,7 +136583,7 @@ var init_schemas = __esm({
136583
136583
  transform: [
136584
136584
  "trim"
136585
136585
  ],
136586
- description: "Device name and registry identity \u2014 the same name resolves to the same device. Reference form: names an existing AVD (Android) / simulator (iOS) to reuse. If no device by this name exists, Doc Detective creates one under this name using `deviceType`/`osVersion` (or their defaults), provided the toolchain and a matching system image are installed (`doc-detective install android`)."
136586
+ description: "Device name and registry identity \u2014 the same name resolves to the same device. Reference form: names an existing AVD (Android) / simulator (iOS) to reuse. If no device by this name exists, Doc Detective creates one under this name using `deviceType`/`osVersion` (or their defaults), provided the toolchain is installed (`doc-detective install android` or `doc-detective install ios`)."
136587
136587
  },
136588
136588
  deviceType: {
136589
136589
  type: "string",
@@ -136596,11 +136596,11 @@ var init_schemas = __esm({
136596
136596
  osVersion: {
136597
136597
  type: "string",
136598
136598
  minLength: 1,
136599
- description: "Platform version used when creating a device; must match an installed system image (install more with `doc-detective install android`). Ignored when `name` already matches an existing device. Default: the newest installed version."
136599
+ description: "Platform version used when creating a device; must match an installed image/runtime for the target platform (install more with `doc-detective install android` or `doc-detective install ios`). Ignored when `name` already matches an existing device. Default: the newest installed version."
136600
136600
  },
136601
136601
  headless: {
136602
136602
  type: "boolean",
136603
- description: "Run the Android emulator without a window. Ignored where not applicable."
136603
+ description: "Run the Android emulator without a window. No-op on iOS (simulators boot without the Simulator UI on CI) and ignored where not applicable."
136604
136604
  },
136605
136605
  orientation: {
136606
136606
  type: "string",
@@ -136699,15 +136699,15 @@ var init_schemas = __esm({
136699
136699
  install: {
136700
136700
  type: "string",
136701
136701
  minLength: 1,
136702
- description: "Path to an installable artifact (`.apk`/`.app`/`.ipa`) to install on the device before launch. Lands with the Android phase (A3); on other platforms it is validated but not yet honored."
136702
+ description: "Path to an installable artifact (`.apk`/`.app`/`.ipa`) to install on the device before launch. Supported on Android and iOS app surfaces."
136703
136703
  },
136704
136704
  activity: {
136705
136705
  type: "string",
136706
136706
  minLength: 1,
136707
- description: "Android main activity override (defaults to the package's launcher activity). Lands with the Android phase (A3)."
136707
+ description: "Android main activity override (defaults to the package's launcher activity). Android-only."
136708
136708
  },
136709
136709
  device: {
136710
- description: "Device the app runs on. Omit for a host desktop app, or (in a mobile context) to use the context's default device. A string references a device by name; an object refines it. Lands with the Android phase (A3).",
136710
+ description: "Device the app runs on. Omit for a host desktop app, or (in a mobile context) to use the context's default device. A string references a device by name; an object refines it. Supported on Android and iOS mobile targets.",
136711
136711
  anyOf: [
136712
136712
  {
136713
136713
  type: "string",
@@ -136740,7 +136740,7 @@ var init_schemas = __esm({
136740
136740
  transform: [
136741
136741
  "trim"
136742
136742
  ],
136743
- description: "Device name and registry identity \u2014 the same name resolves to the same device. Reference form: names an existing AVD (Android) / simulator (iOS) to reuse. If no device by this name exists, Doc Detective creates one under this name using `deviceType`/`osVersion` (or their defaults), provided the toolchain and a matching system image are installed (`doc-detective install android`)."
136743
+ description: "Device name and registry identity \u2014 the same name resolves to the same device. Reference form: names an existing AVD (Android) / simulator (iOS) to reuse. If no device by this name exists, Doc Detective creates one under this name using `deviceType`/`osVersion` (or their defaults), provided the toolchain is installed (`doc-detective install android` or `doc-detective install ios`)."
136744
136744
  },
136745
136745
  deviceType: {
136746
136746
  type: "string",
@@ -136753,11 +136753,11 @@ var init_schemas = __esm({
136753
136753
  osVersion: {
136754
136754
  type: "string",
136755
136755
  minLength: 1,
136756
- description: "Platform version used when creating a device; must match an installed system image (install more with `doc-detective install android`). Ignored when `name` already matches an existing device. Default: the newest installed version."
136756
+ description: "Platform version used when creating a device; must match an installed image/runtime for the target platform (install more with `doc-detective install android` or `doc-detective install ios`). Ignored when `name` already matches an existing device. Default: the newest installed version."
136757
136757
  },
136758
136758
  headless: {
136759
136759
  type: "boolean",
136760
- description: "Run the Android emulator without a window. Ignored where not applicable."
136760
+ description: "Run the Android emulator without a window. No-op on iOS (simulators boot without the Simulator UI on CI) and ignored where not applicable."
136761
136761
  },
136762
136762
  orientation: {
136763
136763
  type: "string",
@@ -178492,7 +178492,7 @@ var init_schemas = __esm({
178492
178492
  startSurface: {
178493
178493
  $schema: "http://json-schema.org/draft-07/schema#",
178494
178494
  title: "startSurface",
178495
- description: "Open (provision) a surface and register it by name so later steps can target it with `surface`. Phases A1\u2013A2 ship the desktop native app branch: launch a Windows or macOS application by executable path, `.app` path, bundle ID, or UWP AppUserModelID. macOS additionally requires the Accessibility permission for the process that runs Doc Detective (System Settings \u2192 Privacy & Security \u2192 Accessibility); without it the context lands as SKIPPED with a walkthrough. Phase A3 adds Android apps on a managed emulator via the `device`, `install`, and `activity` fields (iOS lands in A4). Browser/process branches and the parallel array form arrive with multi-surface Phase 6. See docs/design/native-app-surfaces.md.",
178495
+ description: "Open (provision) a surface and register it by name so later steps can target it with `surface`. Phases A1\u2013A2 ship the desktop native app branch: launch a Windows or macOS application by executable path, `.app` path, bundle ID, or UWP AppUserModelID. macOS additionally requires the Accessibility permission for the process that runs Doc Detective (System Settings \u2192 Privacy & Security \u2192 Accessibility); without it the context lands as SKIPPED with a walkthrough. Phase A3 adds Android apps on a managed emulator, and phase A4 adds iOS app surfaces on macOS via XCUITest/simctl. Browser/process branches and the parallel array form arrive with multi-surface Phase 6. See docs/design/native-app-surfaces.md.",
178496
178496
  components: {
178497
178497
  schemas: {
178498
178498
  appDescriptor: {
@@ -178544,15 +178544,15 @@ var init_schemas = __esm({
178544
178544
  install: {
178545
178545
  type: "string",
178546
178546
  minLength: 1,
178547
- description: "Path to an installable artifact (`.apk`/`.app`/`.ipa`) to install on the device before launch. Lands with the Android phase (A3); on other platforms it is validated but not yet honored."
178547
+ description: "Path to an installable artifact (`.apk`/`.app`/`.ipa`) to install on the device before launch. Supported on Android and iOS app surfaces."
178548
178548
  },
178549
178549
  activity: {
178550
178550
  type: "string",
178551
178551
  minLength: 1,
178552
- description: "Android main activity override (defaults to the package's launcher activity). Lands with the Android phase (A3)."
178552
+ description: "Android main activity override (defaults to the package's launcher activity). Android-only."
178553
178553
  },
178554
178554
  device: {
178555
- description: "Device the app runs on. Omit for a host desktop app, or (in a mobile context) to use the context's default device. A string references a device by name; an object refines it. Lands with the Android phase (A3).",
178555
+ description: "Device the app runs on. Omit for a host desktop app, or (in a mobile context) to use the context's default device. A string references a device by name; an object refines it. Supported on Android and iOS mobile targets.",
178556
178556
  anyOf: [
178557
178557
  {
178558
178558
  type: "string",
@@ -178585,7 +178585,7 @@ var init_schemas = __esm({
178585
178585
  transform: [
178586
178586
  "trim"
178587
178587
  ],
178588
- description: "Device name and registry identity \u2014 the same name resolves to the same device. Reference form: names an existing AVD (Android) / simulator (iOS) to reuse. If no device by this name exists, Doc Detective creates one under this name using `deviceType`/`osVersion` (or their defaults), provided the toolchain and a matching system image are installed (`doc-detective install android`)."
178588
+ description: "Device name and registry identity \u2014 the same name resolves to the same device. Reference form: names an existing AVD (Android) / simulator (iOS) to reuse. If no device by this name exists, Doc Detective creates one under this name using `deviceType`/`osVersion` (or their defaults), provided the toolchain is installed (`doc-detective install android` or `doc-detective install ios`)."
178589
178589
  },
178590
178590
  deviceType: {
178591
178591
  type: "string",
@@ -178598,11 +178598,11 @@ var init_schemas = __esm({
178598
178598
  osVersion: {
178599
178599
  type: "string",
178600
178600
  minLength: 1,
178601
- description: "Platform version used when creating a device; must match an installed system image (install more with `doc-detective install android`). Ignored when `name` already matches an existing device. Default: the newest installed version."
178601
+ description: "Platform version used when creating a device; must match an installed image/runtime for the target platform (install more with `doc-detective install android` or `doc-detective install ios`). Ignored when `name` already matches an existing device. Default: the newest installed version."
178602
178602
  },
178603
178603
  headless: {
178604
178604
  type: "boolean",
178605
- description: "Run the Android emulator without a window. Ignored where not applicable."
178605
+ description: "Run the Android emulator without a window. No-op on iOS (simulators boot without the Simulator UI on CI) and ignored where not applicable."
178606
178606
  },
178607
178607
  orientation: {
178608
178608
  type: "string",
@@ -178774,7 +178774,7 @@ var init_schemas = __esm({
178774
178774
  transform: [
178775
178775
  "trim"
178776
178776
  ],
178777
- description: "Device name and registry identity \u2014 the same name resolves to the same device. Reference form: names an existing AVD (Android) / simulator (iOS) to reuse. If no device by this name exists, Doc Detective creates one under this name using `deviceType`/`osVersion` (or their defaults), provided the toolchain and a matching system image are installed (`doc-detective install android`)."
178777
+ description: "Device name and registry identity \u2014 the same name resolves to the same device. Reference form: names an existing AVD (Android) / simulator (iOS) to reuse. If no device by this name exists, Doc Detective creates one under this name using `deviceType`/`osVersion` (or their defaults), provided the toolchain is installed (`doc-detective install android` or `doc-detective install ios`)."
178778
178778
  },
178779
178779
  deviceType: {
178780
178780
  type: "string",
@@ -178787,11 +178787,11 @@ var init_schemas = __esm({
178787
178787
  osVersion: {
178788
178788
  type: "string",
178789
178789
  minLength: 1,
178790
- description: "Platform version used when creating a device; must match an installed system image (install more with `doc-detective install android`). Ignored when `name` already matches an existing device. Default: the newest installed version."
178790
+ description: "Platform version used when creating a device; must match an installed image/runtime for the target platform (install more with `doc-detective install android` or `doc-detective install ios`). Ignored when `name` already matches an existing device. Default: the newest installed version."
178791
178791
  },
178792
178792
  headless: {
178793
178793
  type: "boolean",
178794
- description: "Run the Android emulator without a window. Ignored where not applicable."
178794
+ description: "Run the Android emulator without a window. No-op on iOS (simulators boot without the Simulator UI on CI) and ignored where not applicable."
178795
178795
  },
178796
178796
  orientation: {
178797
178797
  type: "string",
@@ -178890,15 +178890,15 @@ var init_schemas = __esm({
178890
178890
  install: {
178891
178891
  type: "string",
178892
178892
  minLength: 1,
178893
- description: "Path to an installable artifact (`.apk`/`.app`/`.ipa`) to install on the device before launch. Lands with the Android phase (A3); on other platforms it is validated but not yet honored."
178893
+ description: "Path to an installable artifact (`.apk`/`.app`/`.ipa`) to install on the device before launch. Supported on Android and iOS app surfaces."
178894
178894
  },
178895
178895
  activity: {
178896
178896
  type: "string",
178897
178897
  minLength: 1,
178898
- description: "Android main activity override (defaults to the package's launcher activity). Lands with the Android phase (A3)."
178898
+ description: "Android main activity override (defaults to the package's launcher activity). Android-only."
178899
178899
  },
178900
178900
  device: {
178901
- description: "Device the app runs on. Omit for a host desktop app, or (in a mobile context) to use the context's default device. A string references a device by name; an object refines it. Lands with the Android phase (A3).",
178901
+ description: "Device the app runs on. Omit for a host desktop app, or (in a mobile context) to use the context's default device. A string references a device by name; an object refines it. Supported on Android and iOS mobile targets.",
178902
178902
  anyOf: [
178903
178903
  {
178904
178904
  type: "string",
@@ -178931,7 +178931,7 @@ var init_schemas = __esm({
178931
178931
  transform: [
178932
178932
  "trim"
178933
178933
  ],
178934
- description: "Device name and registry identity \u2014 the same name resolves to the same device. Reference form: names an existing AVD (Android) / simulator (iOS) to reuse. If no device by this name exists, Doc Detective creates one under this name using `deviceType`/`osVersion` (or their defaults), provided the toolchain and a matching system image are installed (`doc-detective install android`)."
178934
+ description: "Device name and registry identity \u2014 the same name resolves to the same device. Reference form: names an existing AVD (Android) / simulator (iOS) to reuse. If no device by this name exists, Doc Detective creates one under this name using `deviceType`/`osVersion` (or their defaults), provided the toolchain is installed (`doc-detective install android` or `doc-detective install ios`)."
178935
178935
  },
178936
178936
  deviceType: {
178937
178937
  type: "string",
@@ -178944,11 +178944,11 @@ var init_schemas = __esm({
178944
178944
  osVersion: {
178945
178945
  type: "string",
178946
178946
  minLength: 1,
178947
- description: "Platform version used when creating a device; must match an installed system image (install more with `doc-detective install android`). Ignored when `name` already matches an existing device. Default: the newest installed version."
178947
+ description: "Platform version used when creating a device; must match an installed image/runtime for the target platform (install more with `doc-detective install android` or `doc-detective install ios`). Ignored when `name` already matches an existing device. Default: the newest installed version."
178948
178948
  },
178949
178949
  headless: {
178950
178950
  type: "boolean",
178951
- description: "Run the Android emulator without a window. Ignored where not applicable."
178951
+ description: "Run the Android emulator without a window. No-op on iOS (simulators boot without the Simulator UI on CI) and ignored where not applicable."
178952
178952
  },
178953
178953
  orientation: {
178954
178954
  type: "string",
@@ -184929,7 +184929,7 @@ var init_schemas = __esm({
184929
184929
  ]
184930
184930
  },
184931
184931
  device: {
184932
- description: "Default device for a mobile (`android`/`ios`) context. A string references a device by name; an object refines it. The `platform` is implied by the context, so it is not required here. When the named device doesn't already exist, Doc Detective creates it with defaults (see `deviceType`/`osVersion`), provided the toolchain is installed (`doc-detective install android`). Same shape as `startSurface.device`.",
184932
+ description: "Default device for a mobile (`android`/`ios`) context. A string references a device by name; an object refines it. The `platform` is implied by the context, so it is not required here. When the named device doesn't already exist, Doc Detective creates it with defaults (see `deviceType`/`osVersion`), provided the toolchain is installed (`doc-detective install android` or `doc-detective install ios`). Same shape as `startSurface.device`.",
184933
184933
  examples: [
184934
184934
  "pixel7",
184935
184935
  {
@@ -184968,7 +184968,7 @@ var init_schemas = __esm({
184968
184968
  transform: [
184969
184969
  "trim"
184970
184970
  ],
184971
- description: "Device name and registry identity \u2014 the same name resolves to the same device. Reference form: names an existing AVD (Android) / simulator (iOS) to reuse. If no device by this name exists, Doc Detective creates one under this name using `deviceType`/`osVersion` (or their defaults), provided the toolchain and a matching system image are installed (`doc-detective install android`)."
184971
+ description: "Device name and registry identity \u2014 the same name resolves to the same device. Reference form: names an existing AVD (Android) / simulator (iOS) to reuse. If no device by this name exists, Doc Detective creates one under this name using `deviceType`/`osVersion` (or their defaults), provided the toolchain is installed (`doc-detective install android` or `doc-detective install ios`)."
184972
184972
  },
184973
184973
  deviceType: {
184974
184974
  type: "string",
@@ -184981,11 +184981,11 @@ var init_schemas = __esm({
184981
184981
  osVersion: {
184982
184982
  type: "string",
184983
184983
  minLength: 1,
184984
- description: "Platform version used when creating a device; must match an installed system image (install more with `doc-detective install android`). Ignored when `name` already matches an existing device. Default: the newest installed version."
184984
+ description: "Platform version used when creating a device; must match an installed image/runtime for the target platform (install more with `doc-detective install android` or `doc-detective install ios`). Ignored when `name` already matches an existing device. Default: the newest installed version."
184985
184985
  },
184986
184986
  headless: {
184987
184987
  type: "boolean",
184988
- description: "Run the Android emulator without a window. Ignored where not applicable."
184988
+ description: "Run the Android emulator without a window. No-op on iOS (simulators boot without the Simulator UI on CI) and ignored where not applicable."
184989
184989
  },
184990
184990
  orientation: {
184991
184991
  type: "string",
@@ -185771,7 +185771,7 @@ var init_schemas = __esm({
185771
185771
  ]
185772
185772
  },
185773
185773
  device: {
185774
- description: "Default device for a mobile (`android`/`ios`) context. A string references a device by name; an object refines it. The `platform` is implied by the context, so it is not required here. When the named device doesn't already exist, Doc Detective creates it with defaults (see `deviceType`/`osVersion`), provided the toolchain is installed (`doc-detective install android`). Same shape as `startSurface.device`.",
185774
+ description: "Default device for a mobile (`android`/`ios`) context. A string references a device by name; an object refines it. The `platform` is implied by the context, so it is not required here. When the named device doesn't already exist, Doc Detective creates it with defaults (see `deviceType`/`osVersion`), provided the toolchain is installed (`doc-detective install android` or `doc-detective install ios`). Same shape as `startSurface.device`.",
185775
185775
  examples: [
185776
185776
  "pixel7",
185777
185777
  {
@@ -185810,7 +185810,7 @@ var init_schemas = __esm({
185810
185810
  transform: [
185811
185811
  "trim"
185812
185812
  ],
185813
- description: "Device name and registry identity \u2014 the same name resolves to the same device. Reference form: names an existing AVD (Android) / simulator (iOS) to reuse. If no device by this name exists, Doc Detective creates one under this name using `deviceType`/`osVersion` (or their defaults), provided the toolchain and a matching system image are installed (`doc-detective install android`)."
185813
+ description: "Device name and registry identity \u2014 the same name resolves to the same device. Reference form: names an existing AVD (Android) / simulator (iOS) to reuse. If no device by this name exists, Doc Detective creates one under this name using `deviceType`/`osVersion` (or their defaults), provided the toolchain is installed (`doc-detective install android` or `doc-detective install ios`)."
185814
185814
  },
185815
185815
  deviceType: {
185816
185816
  type: "string",
@@ -185823,11 +185823,11 @@ var init_schemas = __esm({
185823
185823
  osVersion: {
185824
185824
  type: "string",
185825
185825
  minLength: 1,
185826
- description: "Platform version used when creating a device; must match an installed system image (install more with `doc-detective install android`). Ignored when `name` already matches an existing device. Default: the newest installed version."
185826
+ description: "Platform version used when creating a device; must match an installed image/runtime for the target platform (install more with `doc-detective install android` or `doc-detective install ios`). Ignored when `name` already matches an existing device. Default: the newest installed version."
185827
185827
  },
185828
185828
  headless: {
185829
185829
  type: "boolean",
185830
- description: "Run the Android emulator without a window. Ignored where not applicable."
185830
+ description: "Run the Android emulator without a window. No-op on iOS (simulators boot without the Simulator UI on CI) and ignored where not applicable."
185831
185831
  },
185832
185832
  orientation: {
185833
185833
  type: "string",
@@ -222416,7 +222416,7 @@ var init_schemas = __esm({
222416
222416
  startSurface: {
222417
222417
  $schema: "http://json-schema.org/draft-07/schema#",
222418
222418
  title: "startSurface",
222419
- description: "Open (provision) a surface and register it by name so later steps can target it with `surface`. Phases A1\u2013A2 ship the desktop native app branch: launch a Windows or macOS application by executable path, `.app` path, bundle ID, or UWP AppUserModelID. macOS additionally requires the Accessibility permission for the process that runs Doc Detective (System Settings \u2192 Privacy & Security \u2192 Accessibility); without it the context lands as SKIPPED with a walkthrough. Phase A3 adds Android apps on a managed emulator via the `device`, `install`, and `activity` fields (iOS lands in A4). Browser/process branches and the parallel array form arrive with multi-surface Phase 6. See docs/design/native-app-surfaces.md.",
222419
+ description: "Open (provision) a surface and register it by name so later steps can target it with `surface`. Phases A1\u2013A2 ship the desktop native app branch: launch a Windows or macOS application by executable path, `.app` path, bundle ID, or UWP AppUserModelID. macOS additionally requires the Accessibility permission for the process that runs Doc Detective (System Settings \u2192 Privacy & Security \u2192 Accessibility); without it the context lands as SKIPPED with a walkthrough. Phase A3 adds Android apps on a managed emulator, and phase A4 adds iOS app surfaces on macOS via XCUITest/simctl. Browser/process branches and the parallel array form arrive with multi-surface Phase 6. See docs/design/native-app-surfaces.md.",
222420
222420
  components: {
222421
222421
  schemas: {
222422
222422
  appDescriptor: {
@@ -222468,15 +222468,15 @@ var init_schemas = __esm({
222468
222468
  install: {
222469
222469
  type: "string",
222470
222470
  minLength: 1,
222471
- description: "Path to an installable artifact (`.apk`/`.app`/`.ipa`) to install on the device before launch. Lands with the Android phase (A3); on other platforms it is validated but not yet honored."
222471
+ description: "Path to an installable artifact (`.apk`/`.app`/`.ipa`) to install on the device before launch. Supported on Android and iOS app surfaces."
222472
222472
  },
222473
222473
  activity: {
222474
222474
  type: "string",
222475
222475
  minLength: 1,
222476
- description: "Android main activity override (defaults to the package's launcher activity). Lands with the Android phase (A3)."
222476
+ description: "Android main activity override (defaults to the package's launcher activity). Android-only."
222477
222477
  },
222478
222478
  device: {
222479
- description: "Device the app runs on. Omit for a host desktop app, or (in a mobile context) to use the context's default device. A string references a device by name; an object refines it. Lands with the Android phase (A3).",
222479
+ description: "Device the app runs on. Omit for a host desktop app, or (in a mobile context) to use the context's default device. A string references a device by name; an object refines it. Supported on Android and iOS mobile targets.",
222480
222480
  anyOf: [
222481
222481
  {
222482
222482
  type: "string",
@@ -222509,7 +222509,7 @@ var init_schemas = __esm({
222509
222509
  transform: [
222510
222510
  "trim"
222511
222511
  ],
222512
- description: "Device name and registry identity \u2014 the same name resolves to the same device. Reference form: names an existing AVD (Android) / simulator (iOS) to reuse. If no device by this name exists, Doc Detective creates one under this name using `deviceType`/`osVersion` (or their defaults), provided the toolchain and a matching system image are installed (`doc-detective install android`)."
222512
+ description: "Device name and registry identity \u2014 the same name resolves to the same device. Reference form: names an existing AVD (Android) / simulator (iOS) to reuse. If no device by this name exists, Doc Detective creates one under this name using `deviceType`/`osVersion` (or their defaults), provided the toolchain is installed (`doc-detective install android` or `doc-detective install ios`)."
222513
222513
  },
222514
222514
  deviceType: {
222515
222515
  type: "string",
@@ -222522,11 +222522,11 @@ var init_schemas = __esm({
222522
222522
  osVersion: {
222523
222523
  type: "string",
222524
222524
  minLength: 1,
222525
- description: "Platform version used when creating a device; must match an installed system image (install more with `doc-detective install android`). Ignored when `name` already matches an existing device. Default: the newest installed version."
222525
+ description: "Platform version used when creating a device; must match an installed image/runtime for the target platform (install more with `doc-detective install android` or `doc-detective install ios`). Ignored when `name` already matches an existing device. Default: the newest installed version."
222526
222526
  },
222527
222527
  headless: {
222528
222528
  type: "boolean",
222529
- description: "Run the Android emulator without a window. Ignored where not applicable."
222529
+ description: "Run the Android emulator without a window. No-op on iOS (simulators boot without the Simulator UI on CI) and ignored where not applicable."
222530
222530
  },
222531
222531
  orientation: {
222532
222532
  type: "string",
@@ -222698,7 +222698,7 @@ var init_schemas = __esm({
222698
222698
  transform: [
222699
222699
  "trim"
222700
222700
  ],
222701
- description: "Device name and registry identity \u2014 the same name resolves to the same device. Reference form: names an existing AVD (Android) / simulator (iOS) to reuse. If no device by this name exists, Doc Detective creates one under this name using `deviceType`/`osVersion` (or their defaults), provided the toolchain and a matching system image are installed (`doc-detective install android`)."
222701
+ description: "Device name and registry identity \u2014 the same name resolves to the same device. Reference form: names an existing AVD (Android) / simulator (iOS) to reuse. If no device by this name exists, Doc Detective creates one under this name using `deviceType`/`osVersion` (or their defaults), provided the toolchain is installed (`doc-detective install android` or `doc-detective install ios`)."
222702
222702
  },
222703
222703
  deviceType: {
222704
222704
  type: "string",
@@ -222711,11 +222711,11 @@ var init_schemas = __esm({
222711
222711
  osVersion: {
222712
222712
  type: "string",
222713
222713
  minLength: 1,
222714
- description: "Platform version used when creating a device; must match an installed system image (install more with `doc-detective install android`). Ignored when `name` already matches an existing device. Default: the newest installed version."
222714
+ description: "Platform version used when creating a device; must match an installed image/runtime for the target platform (install more with `doc-detective install android` or `doc-detective install ios`). Ignored when `name` already matches an existing device. Default: the newest installed version."
222715
222715
  },
222716
222716
  headless: {
222717
222717
  type: "boolean",
222718
- description: "Run the Android emulator without a window. Ignored where not applicable."
222718
+ description: "Run the Android emulator without a window. No-op on iOS (simulators boot without the Simulator UI on CI) and ignored where not applicable."
222719
222719
  },
222720
222720
  orientation: {
222721
222721
  type: "string",
@@ -222814,15 +222814,15 @@ var init_schemas = __esm({
222814
222814
  install: {
222815
222815
  type: "string",
222816
222816
  minLength: 1,
222817
- description: "Path to an installable artifact (`.apk`/`.app`/`.ipa`) to install on the device before launch. Lands with the Android phase (A3); on other platforms it is validated but not yet honored."
222817
+ description: "Path to an installable artifact (`.apk`/`.app`/`.ipa`) to install on the device before launch. Supported on Android and iOS app surfaces."
222818
222818
  },
222819
222819
  activity: {
222820
222820
  type: "string",
222821
222821
  minLength: 1,
222822
- description: "Android main activity override (defaults to the package's launcher activity). Lands with the Android phase (A3)."
222822
+ description: "Android main activity override (defaults to the package's launcher activity). Android-only."
222823
222823
  },
222824
222824
  device: {
222825
- description: "Device the app runs on. Omit for a host desktop app, or (in a mobile context) to use the context's default device. A string references a device by name; an object refines it. Lands with the Android phase (A3).",
222825
+ description: "Device the app runs on. Omit for a host desktop app, or (in a mobile context) to use the context's default device. A string references a device by name; an object refines it. Supported on Android and iOS mobile targets.",
222826
222826
  anyOf: [
222827
222827
  {
222828
222828
  type: "string",
@@ -222855,7 +222855,7 @@ var init_schemas = __esm({
222855
222855
  transform: [
222856
222856
  "trim"
222857
222857
  ],
222858
- description: "Device name and registry identity \u2014 the same name resolves to the same device. Reference form: names an existing AVD (Android) / simulator (iOS) to reuse. If no device by this name exists, Doc Detective creates one under this name using `deviceType`/`osVersion` (or their defaults), provided the toolchain and a matching system image are installed (`doc-detective install android`)."
222858
+ description: "Device name and registry identity \u2014 the same name resolves to the same device. Reference form: names an existing AVD (Android) / simulator (iOS) to reuse. If no device by this name exists, Doc Detective creates one under this name using `deviceType`/`osVersion` (or their defaults), provided the toolchain is installed (`doc-detective install android` or `doc-detective install ios`)."
222859
222859
  },
222860
222860
  deviceType: {
222861
222861
  type: "string",
@@ -222868,11 +222868,11 @@ var init_schemas = __esm({
222868
222868
  osVersion: {
222869
222869
  type: "string",
222870
222870
  minLength: 1,
222871
- description: "Platform version used when creating a device; must match an installed system image (install more with `doc-detective install android`). Ignored when `name` already matches an existing device. Default: the newest installed version."
222871
+ description: "Platform version used when creating a device; must match an installed image/runtime for the target platform (install more with `doc-detective install android` or `doc-detective install ios`). Ignored when `name` already matches an existing device. Default: the newest installed version."
222872
222872
  },
222873
222873
  headless: {
222874
222874
  type: "boolean",
222875
- description: "Run the Android emulator without a window. Ignored where not applicable."
222875
+ description: "Run the Android emulator without a window. No-op on iOS (simulators boot without the Simulator UI on CI) and ignored where not applicable."
222876
222876
  },
222877
222877
  orientation: {
222878
222878
  type: "string",
@@ -263906,7 +263906,7 @@ var init_schemas = __esm({
263906
263906
  startSurface: {
263907
263907
  $schema: "http://json-schema.org/draft-07/schema#",
263908
263908
  title: "startSurface",
263909
- description: "Open (provision) a surface and register it by name so later steps can target it with `surface`. Phases A1\u2013A2 ship the desktop native app branch: launch a Windows or macOS application by executable path, `.app` path, bundle ID, or UWP AppUserModelID. macOS additionally requires the Accessibility permission for the process that runs Doc Detective (System Settings \u2192 Privacy & Security \u2192 Accessibility); without it the context lands as SKIPPED with a walkthrough. Phase A3 adds Android apps on a managed emulator via the `device`, `install`, and `activity` fields (iOS lands in A4). Browser/process branches and the parallel array form arrive with multi-surface Phase 6. See docs/design/native-app-surfaces.md.",
263909
+ description: "Open (provision) a surface and register it by name so later steps can target it with `surface`. Phases A1\u2013A2 ship the desktop native app branch: launch a Windows or macOS application by executable path, `.app` path, bundle ID, or UWP AppUserModelID. macOS additionally requires the Accessibility permission for the process that runs Doc Detective (System Settings \u2192 Privacy & Security \u2192 Accessibility); without it the context lands as SKIPPED with a walkthrough. Phase A3 adds Android apps on a managed emulator, and phase A4 adds iOS app surfaces on macOS via XCUITest/simctl. Browser/process branches and the parallel array form arrive with multi-surface Phase 6. See docs/design/native-app-surfaces.md.",
263910
263910
  components: {
263911
263911
  schemas: {
263912
263912
  appDescriptor: {
@@ -263958,15 +263958,15 @@ var init_schemas = __esm({
263958
263958
  install: {
263959
263959
  type: "string",
263960
263960
  minLength: 1,
263961
- description: "Path to an installable artifact (`.apk`/`.app`/`.ipa`) to install on the device before launch. Lands with the Android phase (A3); on other platforms it is validated but not yet honored."
263961
+ description: "Path to an installable artifact (`.apk`/`.app`/`.ipa`) to install on the device before launch. Supported on Android and iOS app surfaces."
263962
263962
  },
263963
263963
  activity: {
263964
263964
  type: "string",
263965
263965
  minLength: 1,
263966
- description: "Android main activity override (defaults to the package's launcher activity). Lands with the Android phase (A3)."
263966
+ description: "Android main activity override (defaults to the package's launcher activity). Android-only."
263967
263967
  },
263968
263968
  device: {
263969
- description: "Device the app runs on. Omit for a host desktop app, or (in a mobile context) to use the context's default device. A string references a device by name; an object refines it. Lands with the Android phase (A3).",
263969
+ description: "Device the app runs on. Omit for a host desktop app, or (in a mobile context) to use the context's default device. A string references a device by name; an object refines it. Supported on Android and iOS mobile targets.",
263970
263970
  anyOf: [
263971
263971
  {
263972
263972
  type: "string",
@@ -263999,7 +263999,7 @@ var init_schemas = __esm({
263999
263999
  transform: [
264000
264000
  "trim"
264001
264001
  ],
264002
- description: "Device name and registry identity \u2014 the same name resolves to the same device. Reference form: names an existing AVD (Android) / simulator (iOS) to reuse. If no device by this name exists, Doc Detective creates one under this name using `deviceType`/`osVersion` (or their defaults), provided the toolchain and a matching system image are installed (`doc-detective install android`)."
264002
+ description: "Device name and registry identity \u2014 the same name resolves to the same device. Reference form: names an existing AVD (Android) / simulator (iOS) to reuse. If no device by this name exists, Doc Detective creates one under this name using `deviceType`/`osVersion` (or their defaults), provided the toolchain is installed (`doc-detective install android` or `doc-detective install ios`)."
264003
264003
  },
264004
264004
  deviceType: {
264005
264005
  type: "string",
@@ -264012,11 +264012,11 @@ var init_schemas = __esm({
264012
264012
  osVersion: {
264013
264013
  type: "string",
264014
264014
  minLength: 1,
264015
- description: "Platform version used when creating a device; must match an installed system image (install more with `doc-detective install android`). Ignored when `name` already matches an existing device. Default: the newest installed version."
264015
+ description: "Platform version used when creating a device; must match an installed image/runtime for the target platform (install more with `doc-detective install android` or `doc-detective install ios`). Ignored when `name` already matches an existing device. Default: the newest installed version."
264016
264016
  },
264017
264017
  headless: {
264018
264018
  type: "boolean",
264019
- description: "Run the Android emulator without a window. Ignored where not applicable."
264019
+ description: "Run the Android emulator without a window. No-op on iOS (simulators boot without the Simulator UI on CI) and ignored where not applicable."
264020
264020
  },
264021
264021
  orientation: {
264022
264022
  type: "string",
@@ -264188,7 +264188,7 @@ var init_schemas = __esm({
264188
264188
  transform: [
264189
264189
  "trim"
264190
264190
  ],
264191
- description: "Device name and registry identity \u2014 the same name resolves to the same device. Reference form: names an existing AVD (Android) / simulator (iOS) to reuse. If no device by this name exists, Doc Detective creates one under this name using `deviceType`/`osVersion` (or their defaults), provided the toolchain and a matching system image are installed (`doc-detective install android`)."
264191
+ description: "Device name and registry identity \u2014 the same name resolves to the same device. Reference form: names an existing AVD (Android) / simulator (iOS) to reuse. If no device by this name exists, Doc Detective creates one under this name using `deviceType`/`osVersion` (or their defaults), provided the toolchain is installed (`doc-detective install android` or `doc-detective install ios`)."
264192
264192
  },
264193
264193
  deviceType: {
264194
264194
  type: "string",
@@ -264201,11 +264201,11 @@ var init_schemas = __esm({
264201
264201
  osVersion: {
264202
264202
  type: "string",
264203
264203
  minLength: 1,
264204
- description: "Platform version used when creating a device; must match an installed system image (install more with `doc-detective install android`). Ignored when `name` already matches an existing device. Default: the newest installed version."
264204
+ description: "Platform version used when creating a device; must match an installed image/runtime for the target platform (install more with `doc-detective install android` or `doc-detective install ios`). Ignored when `name` already matches an existing device. Default: the newest installed version."
264205
264205
  },
264206
264206
  headless: {
264207
264207
  type: "boolean",
264208
- description: "Run the Android emulator without a window. Ignored where not applicable."
264208
+ description: "Run the Android emulator without a window. No-op on iOS (simulators boot without the Simulator UI on CI) and ignored where not applicable."
264209
264209
  },
264210
264210
  orientation: {
264211
264211
  type: "string",
@@ -264304,15 +264304,15 @@ var init_schemas = __esm({
264304
264304
  install: {
264305
264305
  type: "string",
264306
264306
  minLength: 1,
264307
- description: "Path to an installable artifact (`.apk`/`.app`/`.ipa`) to install on the device before launch. Lands with the Android phase (A3); on other platforms it is validated but not yet honored."
264307
+ description: "Path to an installable artifact (`.apk`/`.app`/`.ipa`) to install on the device before launch. Supported on Android and iOS app surfaces."
264308
264308
  },
264309
264309
  activity: {
264310
264310
  type: "string",
264311
264311
  minLength: 1,
264312
- description: "Android main activity override (defaults to the package's launcher activity). Lands with the Android phase (A3)."
264312
+ description: "Android main activity override (defaults to the package's launcher activity). Android-only."
264313
264313
  },
264314
264314
  device: {
264315
- description: "Device the app runs on. Omit for a host desktop app, or (in a mobile context) to use the context's default device. A string references a device by name; an object refines it. Lands with the Android phase (A3).",
264315
+ description: "Device the app runs on. Omit for a host desktop app, or (in a mobile context) to use the context's default device. A string references a device by name; an object refines it. Supported on Android and iOS mobile targets.",
264316
264316
  anyOf: [
264317
264317
  {
264318
264318
  type: "string",
@@ -264345,7 +264345,7 @@ var init_schemas = __esm({
264345
264345
  transform: [
264346
264346
  "trim"
264347
264347
  ],
264348
- description: "Device name and registry identity \u2014 the same name resolves to the same device. Reference form: names an existing AVD (Android) / simulator (iOS) to reuse. If no device by this name exists, Doc Detective creates one under this name using `deviceType`/`osVersion` (or their defaults), provided the toolchain and a matching system image are installed (`doc-detective install android`)."
264348
+ description: "Device name and registry identity \u2014 the same name resolves to the same device. Reference form: names an existing AVD (Android) / simulator (iOS) to reuse. If no device by this name exists, Doc Detective creates one under this name using `deviceType`/`osVersion` (or their defaults), provided the toolchain is installed (`doc-detective install android` or `doc-detective install ios`)."
264349
264349
  },
264350
264350
  deviceType: {
264351
264351
  type: "string",
@@ -264358,11 +264358,11 @@ var init_schemas = __esm({
264358
264358
  osVersion: {
264359
264359
  type: "string",
264360
264360
  minLength: 1,
264361
- description: "Platform version used when creating a device; must match an installed system image (install more with `doc-detective install android`). Ignored when `name` already matches an existing device. Default: the newest installed version."
264361
+ description: "Platform version used when creating a device; must match an installed image/runtime for the target platform (install more with `doc-detective install android` or `doc-detective install ios`). Ignored when `name` already matches an existing device. Default: the newest installed version."
264362
264362
  },
264363
264363
  headless: {
264364
264364
  type: "boolean",
264365
- description: "Run the Android emulator without a window. Ignored where not applicable."
264365
+ description: "Run the Android emulator without a window. No-op on iOS (simulators boot without the Simulator UI on CI) and ignored where not applicable."
264366
264366
  },
264367
264367
  orientation: {
264368
264368
  type: "string",
@@ -270830,7 +270830,7 @@ var init_schemas = __esm({
270830
270830
  ]
270831
270831
  },
270832
270832
  device: {
270833
- description: "Default device for a mobile (`android`/`ios`) context. A string references a device by name; an object refines it. The `platform` is implied by the context, so it is not required here. When the named device doesn't already exist, Doc Detective creates it with defaults (see `deviceType`/`osVersion`), provided the toolchain is installed (`doc-detective install android`). Same shape as `startSurface.device`.",
270833
+ description: "Default device for a mobile (`android`/`ios`) context. A string references a device by name; an object refines it. The `platform` is implied by the context, so it is not required here. When the named device doesn't already exist, Doc Detective creates it with defaults (see `deviceType`/`osVersion`), provided the toolchain is installed (`doc-detective install android` or `doc-detective install ios`). Same shape as `startSurface.device`.",
270834
270834
  examples: [
270835
270835
  "pixel7",
270836
270836
  {
@@ -270869,7 +270869,7 @@ var init_schemas = __esm({
270869
270869
  transform: [
270870
270870
  "trim"
270871
270871
  ],
270872
- description: "Device name and registry identity \u2014 the same name resolves to the same device. Reference form: names an existing AVD (Android) / simulator (iOS) to reuse. If no device by this name exists, Doc Detective creates one under this name using `deviceType`/`osVersion` (or their defaults), provided the toolchain and a matching system image are installed (`doc-detective install android`)."
270872
+ description: "Device name and registry identity \u2014 the same name resolves to the same device. Reference form: names an existing AVD (Android) / simulator (iOS) to reuse. If no device by this name exists, Doc Detective creates one under this name using `deviceType`/`osVersion` (or their defaults), provided the toolchain is installed (`doc-detective install android` or `doc-detective install ios`)."
270873
270873
  },
270874
270874
  deviceType: {
270875
270875
  type: "string",
@@ -270882,11 +270882,11 @@ var init_schemas = __esm({
270882
270882
  osVersion: {
270883
270883
  type: "string",
270884
270884
  minLength: 1,
270885
- description: "Platform version used when creating a device; must match an installed system image (install more with `doc-detective install android`). Ignored when `name` already matches an existing device. Default: the newest installed version."
270885
+ description: "Platform version used when creating a device; must match an installed image/runtime for the target platform (install more with `doc-detective install android` or `doc-detective install ios`). Ignored when `name` already matches an existing device. Default: the newest installed version."
270886
270886
  },
270887
270887
  headless: {
270888
270888
  type: "boolean",
270889
- description: "Run the Android emulator without a window. Ignored where not applicable."
270889
+ description: "Run the Android emulator without a window. No-op on iOS (simulators boot without the Simulator UI on CI) and ignored where not applicable."
270890
270890
  },
270891
270891
  orientation: {
270892
270892
  type: "string",
@@ -271672,7 +271672,7 @@ var init_schemas = __esm({
271672
271672
  ]
271673
271673
  },
271674
271674
  device: {
271675
- description: "Default device for a mobile (`android`/`ios`) context. A string references a device by name; an object refines it. The `platform` is implied by the context, so it is not required here. When the named device doesn't already exist, Doc Detective creates it with defaults (see `deviceType`/`osVersion`), provided the toolchain is installed (`doc-detective install android`). Same shape as `startSurface.device`.",
271675
+ description: "Default device for a mobile (`android`/`ios`) context. A string references a device by name; an object refines it. The `platform` is implied by the context, so it is not required here. When the named device doesn't already exist, Doc Detective creates it with defaults (see `deviceType`/`osVersion`), provided the toolchain is installed (`doc-detective install android` or `doc-detective install ios`). Same shape as `startSurface.device`.",
271676
271676
  examples: [
271677
271677
  "pixel7",
271678
271678
  {
@@ -271711,7 +271711,7 @@ var init_schemas = __esm({
271711
271711
  transform: [
271712
271712
  "trim"
271713
271713
  ],
271714
- description: "Device name and registry identity \u2014 the same name resolves to the same device. Reference form: names an existing AVD (Android) / simulator (iOS) to reuse. If no device by this name exists, Doc Detective creates one under this name using `deviceType`/`osVersion` (or their defaults), provided the toolchain and a matching system image are installed (`doc-detective install android`)."
271714
+ description: "Device name and registry identity \u2014 the same name resolves to the same device. Reference form: names an existing AVD (Android) / simulator (iOS) to reuse. If no device by this name exists, Doc Detective creates one under this name using `deviceType`/`osVersion` (or their defaults), provided the toolchain is installed (`doc-detective install android` or `doc-detective install ios`)."
271715
271715
  },
271716
271716
  deviceType: {
271717
271717
  type: "string",
@@ -271724,11 +271724,11 @@ var init_schemas = __esm({
271724
271724
  osVersion: {
271725
271725
  type: "string",
271726
271726
  minLength: 1,
271727
- description: "Platform version used when creating a device; must match an installed system image (install more with `doc-detective install android`). Ignored when `name` already matches an existing device. Default: the newest installed version."
271727
+ description: "Platform version used when creating a device; must match an installed image/runtime for the target platform (install more with `doc-detective install android` or `doc-detective install ios`). Ignored when `name` already matches an existing device. Default: the newest installed version."
271728
271728
  },
271729
271729
  headless: {
271730
271730
  type: "boolean",
271731
- description: "Run the Android emulator without a window. Ignored where not applicable."
271731
+ description: "Run the Android emulator without a window. No-op on iOS (simulators boot without the Simulator UI on CI) and ignored where not applicable."
271732
271732
  },
271733
271733
  orientation: {
271734
271734
  type: "string",
@@ -308317,7 +308317,7 @@ var init_schemas = __esm({
308317
308317
  startSurface: {
308318
308318
  $schema: "http://json-schema.org/draft-07/schema#",
308319
308319
  title: "startSurface",
308320
- description: "Open (provision) a surface and register it by name so later steps can target it with `surface`. Phases A1\u2013A2 ship the desktop native app branch: launch a Windows or macOS application by executable path, `.app` path, bundle ID, or UWP AppUserModelID. macOS additionally requires the Accessibility permission for the process that runs Doc Detective (System Settings \u2192 Privacy & Security \u2192 Accessibility); without it the context lands as SKIPPED with a walkthrough. Phase A3 adds Android apps on a managed emulator via the `device`, `install`, and `activity` fields (iOS lands in A4). Browser/process branches and the parallel array form arrive with multi-surface Phase 6. See docs/design/native-app-surfaces.md.",
308320
+ description: "Open (provision) a surface and register it by name so later steps can target it with `surface`. Phases A1\u2013A2 ship the desktop native app branch: launch a Windows or macOS application by executable path, `.app` path, bundle ID, or UWP AppUserModelID. macOS additionally requires the Accessibility permission for the process that runs Doc Detective (System Settings \u2192 Privacy & Security \u2192 Accessibility); without it the context lands as SKIPPED with a walkthrough. Phase A3 adds Android apps on a managed emulator, and phase A4 adds iOS app surfaces on macOS via XCUITest/simctl. Browser/process branches and the parallel array form arrive with multi-surface Phase 6. See docs/design/native-app-surfaces.md.",
308321
308321
  components: {
308322
308322
  schemas: {
308323
308323
  appDescriptor: {
@@ -308369,15 +308369,15 @@ var init_schemas = __esm({
308369
308369
  install: {
308370
308370
  type: "string",
308371
308371
  minLength: 1,
308372
- description: "Path to an installable artifact (`.apk`/`.app`/`.ipa`) to install on the device before launch. Lands with the Android phase (A3); on other platforms it is validated but not yet honored."
308372
+ description: "Path to an installable artifact (`.apk`/`.app`/`.ipa`) to install on the device before launch. Supported on Android and iOS app surfaces."
308373
308373
  },
308374
308374
  activity: {
308375
308375
  type: "string",
308376
308376
  minLength: 1,
308377
- description: "Android main activity override (defaults to the package's launcher activity). Lands with the Android phase (A3)."
308377
+ description: "Android main activity override (defaults to the package's launcher activity). Android-only."
308378
308378
  },
308379
308379
  device: {
308380
- description: "Device the app runs on. Omit for a host desktop app, or (in a mobile context) to use the context's default device. A string references a device by name; an object refines it. Lands with the Android phase (A3).",
308380
+ description: "Device the app runs on. Omit for a host desktop app, or (in a mobile context) to use the context's default device. A string references a device by name; an object refines it. Supported on Android and iOS mobile targets.",
308381
308381
  anyOf: [
308382
308382
  {
308383
308383
  type: "string",
@@ -308410,7 +308410,7 @@ var init_schemas = __esm({
308410
308410
  transform: [
308411
308411
  "trim"
308412
308412
  ],
308413
- description: "Device name and registry identity \u2014 the same name resolves to the same device. Reference form: names an existing AVD (Android) / simulator (iOS) to reuse. If no device by this name exists, Doc Detective creates one under this name using `deviceType`/`osVersion` (or their defaults), provided the toolchain and a matching system image are installed (`doc-detective install android`)."
308413
+ description: "Device name and registry identity \u2014 the same name resolves to the same device. Reference form: names an existing AVD (Android) / simulator (iOS) to reuse. If no device by this name exists, Doc Detective creates one under this name using `deviceType`/`osVersion` (or their defaults), provided the toolchain is installed (`doc-detective install android` or `doc-detective install ios`)."
308414
308414
  },
308415
308415
  deviceType: {
308416
308416
  type: "string",
@@ -308423,11 +308423,11 @@ var init_schemas = __esm({
308423
308423
  osVersion: {
308424
308424
  type: "string",
308425
308425
  minLength: 1,
308426
- description: "Platform version used when creating a device; must match an installed system image (install more with `doc-detective install android`). Ignored when `name` already matches an existing device. Default: the newest installed version."
308426
+ description: "Platform version used when creating a device; must match an installed image/runtime for the target platform (install more with `doc-detective install android` or `doc-detective install ios`). Ignored when `name` already matches an existing device. Default: the newest installed version."
308427
308427
  },
308428
308428
  headless: {
308429
308429
  type: "boolean",
308430
- description: "Run the Android emulator without a window. Ignored where not applicable."
308430
+ description: "Run the Android emulator without a window. No-op on iOS (simulators boot without the Simulator UI on CI) and ignored where not applicable."
308431
308431
  },
308432
308432
  orientation: {
308433
308433
  type: "string",
@@ -308599,7 +308599,7 @@ var init_schemas = __esm({
308599
308599
  transform: [
308600
308600
  "trim"
308601
308601
  ],
308602
- description: "Device name and registry identity \u2014 the same name resolves to the same device. Reference form: names an existing AVD (Android) / simulator (iOS) to reuse. If no device by this name exists, Doc Detective creates one under this name using `deviceType`/`osVersion` (or their defaults), provided the toolchain and a matching system image are installed (`doc-detective install android`)."
308602
+ description: "Device name and registry identity \u2014 the same name resolves to the same device. Reference form: names an existing AVD (Android) / simulator (iOS) to reuse. If no device by this name exists, Doc Detective creates one under this name using `deviceType`/`osVersion` (or their defaults), provided the toolchain is installed (`doc-detective install android` or `doc-detective install ios`)."
308603
308603
  },
308604
308604
  deviceType: {
308605
308605
  type: "string",
@@ -308612,11 +308612,11 @@ var init_schemas = __esm({
308612
308612
  osVersion: {
308613
308613
  type: "string",
308614
308614
  minLength: 1,
308615
- description: "Platform version used when creating a device; must match an installed system image (install more with `doc-detective install android`). Ignored when `name` already matches an existing device. Default: the newest installed version."
308615
+ description: "Platform version used when creating a device; must match an installed image/runtime for the target platform (install more with `doc-detective install android` or `doc-detective install ios`). Ignored when `name` already matches an existing device. Default: the newest installed version."
308616
308616
  },
308617
308617
  headless: {
308618
308618
  type: "boolean",
308619
- description: "Run the Android emulator without a window. Ignored where not applicable."
308619
+ description: "Run the Android emulator without a window. No-op on iOS (simulators boot without the Simulator UI on CI) and ignored where not applicable."
308620
308620
  },
308621
308621
  orientation: {
308622
308622
  type: "string",
@@ -308715,15 +308715,15 @@ var init_schemas = __esm({
308715
308715
  install: {
308716
308716
  type: "string",
308717
308717
  minLength: 1,
308718
- description: "Path to an installable artifact (`.apk`/`.app`/`.ipa`) to install on the device before launch. Lands with the Android phase (A3); on other platforms it is validated but not yet honored."
308718
+ description: "Path to an installable artifact (`.apk`/`.app`/`.ipa`) to install on the device before launch. Supported on Android and iOS app surfaces."
308719
308719
  },
308720
308720
  activity: {
308721
308721
  type: "string",
308722
308722
  minLength: 1,
308723
- description: "Android main activity override (defaults to the package's launcher activity). Lands with the Android phase (A3)."
308723
+ description: "Android main activity override (defaults to the package's launcher activity). Android-only."
308724
308724
  },
308725
308725
  device: {
308726
- description: "Device the app runs on. Omit for a host desktop app, or (in a mobile context) to use the context's default device. A string references a device by name; an object refines it. Lands with the Android phase (A3).",
308726
+ description: "Device the app runs on. Omit for a host desktop app, or (in a mobile context) to use the context's default device. A string references a device by name; an object refines it. Supported on Android and iOS mobile targets.",
308727
308727
  anyOf: [
308728
308728
  {
308729
308729
  type: "string",
@@ -308756,7 +308756,7 @@ var init_schemas = __esm({
308756
308756
  transform: [
308757
308757
  "trim"
308758
308758
  ],
308759
- description: "Device name and registry identity \u2014 the same name resolves to the same device. Reference form: names an existing AVD (Android) / simulator (iOS) to reuse. If no device by this name exists, Doc Detective creates one under this name using `deviceType`/`osVersion` (or their defaults), provided the toolchain and a matching system image are installed (`doc-detective install android`)."
308759
+ description: "Device name and registry identity \u2014 the same name resolves to the same device. Reference form: names an existing AVD (Android) / simulator (iOS) to reuse. If no device by this name exists, Doc Detective creates one under this name using `deviceType`/`osVersion` (or their defaults), provided the toolchain is installed (`doc-detective install android` or `doc-detective install ios`)."
308760
308760
  },
308761
308761
  deviceType: {
308762
308762
  type: "string",
@@ -308769,11 +308769,11 @@ var init_schemas = __esm({
308769
308769
  osVersion: {
308770
308770
  type: "string",
308771
308771
  minLength: 1,
308772
- description: "Platform version used when creating a device; must match an installed system image (install more with `doc-detective install android`). Ignored when `name` already matches an existing device. Default: the newest installed version."
308772
+ description: "Platform version used when creating a device; must match an installed image/runtime for the target platform (install more with `doc-detective install android` or `doc-detective install ios`). Ignored when `name` already matches an existing device. Default: the newest installed version."
308773
308773
  },
308774
308774
  headless: {
308775
308775
  type: "boolean",
308776
- description: "Run the Android emulator without a window. Ignored where not applicable."
308776
+ description: "Run the Android emulator without a window. No-op on iOS (simulators boot without the Simulator UI on CI) and ignored where not applicable."
308777
308777
  },
308778
308778
  orientation: {
308779
308779
  type: "string",
@@ -349807,7 +349807,7 @@ var init_schemas = __esm({
349807
349807
  startSurface: {
349808
349808
  $schema: "http://json-schema.org/draft-07/schema#",
349809
349809
  title: "startSurface",
349810
- description: "Open (provision) a surface and register it by name so later steps can target it with `surface`. Phases A1\u2013A2 ship the desktop native app branch: launch a Windows or macOS application by executable path, `.app` path, bundle ID, or UWP AppUserModelID. macOS additionally requires the Accessibility permission for the process that runs Doc Detective (System Settings \u2192 Privacy & Security \u2192 Accessibility); without it the context lands as SKIPPED with a walkthrough. Phase A3 adds Android apps on a managed emulator via the `device`, `install`, and `activity` fields (iOS lands in A4). Browser/process branches and the parallel array form arrive with multi-surface Phase 6. See docs/design/native-app-surfaces.md.",
349810
+ description: "Open (provision) a surface and register it by name so later steps can target it with `surface`. Phases A1\u2013A2 ship the desktop native app branch: launch a Windows or macOS application by executable path, `.app` path, bundle ID, or UWP AppUserModelID. macOS additionally requires the Accessibility permission for the process that runs Doc Detective (System Settings \u2192 Privacy & Security \u2192 Accessibility); without it the context lands as SKIPPED with a walkthrough. Phase A3 adds Android apps on a managed emulator, and phase A4 adds iOS app surfaces on macOS via XCUITest/simctl. Browser/process branches and the parallel array form arrive with multi-surface Phase 6. See docs/design/native-app-surfaces.md.",
349811
349811
  components: {
349812
349812
  schemas: {
349813
349813
  appDescriptor: {
@@ -349859,15 +349859,15 @@ var init_schemas = __esm({
349859
349859
  install: {
349860
349860
  type: "string",
349861
349861
  minLength: 1,
349862
- description: "Path to an installable artifact (`.apk`/`.app`/`.ipa`) to install on the device before launch. Lands with the Android phase (A3); on other platforms it is validated but not yet honored."
349862
+ description: "Path to an installable artifact (`.apk`/`.app`/`.ipa`) to install on the device before launch. Supported on Android and iOS app surfaces."
349863
349863
  },
349864
349864
  activity: {
349865
349865
  type: "string",
349866
349866
  minLength: 1,
349867
- description: "Android main activity override (defaults to the package's launcher activity). Lands with the Android phase (A3)."
349867
+ description: "Android main activity override (defaults to the package's launcher activity). Android-only."
349868
349868
  },
349869
349869
  device: {
349870
- description: "Device the app runs on. Omit for a host desktop app, or (in a mobile context) to use the context's default device. A string references a device by name; an object refines it. Lands with the Android phase (A3).",
349870
+ description: "Device the app runs on. Omit for a host desktop app, or (in a mobile context) to use the context's default device. A string references a device by name; an object refines it. Supported on Android and iOS mobile targets.",
349871
349871
  anyOf: [
349872
349872
  {
349873
349873
  type: "string",
@@ -349900,7 +349900,7 @@ var init_schemas = __esm({
349900
349900
  transform: [
349901
349901
  "trim"
349902
349902
  ],
349903
- description: "Device name and registry identity \u2014 the same name resolves to the same device. Reference form: names an existing AVD (Android) / simulator (iOS) to reuse. If no device by this name exists, Doc Detective creates one under this name using `deviceType`/`osVersion` (or their defaults), provided the toolchain and a matching system image are installed (`doc-detective install android`)."
349903
+ description: "Device name and registry identity \u2014 the same name resolves to the same device. Reference form: names an existing AVD (Android) / simulator (iOS) to reuse. If no device by this name exists, Doc Detective creates one under this name using `deviceType`/`osVersion` (or their defaults), provided the toolchain is installed (`doc-detective install android` or `doc-detective install ios`)."
349904
349904
  },
349905
349905
  deviceType: {
349906
349906
  type: "string",
@@ -349913,11 +349913,11 @@ var init_schemas = __esm({
349913
349913
  osVersion: {
349914
349914
  type: "string",
349915
349915
  minLength: 1,
349916
- description: "Platform version used when creating a device; must match an installed system image (install more with `doc-detective install android`). Ignored when `name` already matches an existing device. Default: the newest installed version."
349916
+ description: "Platform version used when creating a device; must match an installed image/runtime for the target platform (install more with `doc-detective install android` or `doc-detective install ios`). Ignored when `name` already matches an existing device. Default: the newest installed version."
349917
349917
  },
349918
349918
  headless: {
349919
349919
  type: "boolean",
349920
- description: "Run the Android emulator without a window. Ignored where not applicable."
349920
+ description: "Run the Android emulator without a window. No-op on iOS (simulators boot without the Simulator UI on CI) and ignored where not applicable."
349921
349921
  },
349922
349922
  orientation: {
349923
349923
  type: "string",
@@ -350089,7 +350089,7 @@ var init_schemas = __esm({
350089
350089
  transform: [
350090
350090
  "trim"
350091
350091
  ],
350092
- description: "Device name and registry identity \u2014 the same name resolves to the same device. Reference form: names an existing AVD (Android) / simulator (iOS) to reuse. If no device by this name exists, Doc Detective creates one under this name using `deviceType`/`osVersion` (or their defaults), provided the toolchain and a matching system image are installed (`doc-detective install android`)."
350092
+ description: "Device name and registry identity \u2014 the same name resolves to the same device. Reference form: names an existing AVD (Android) / simulator (iOS) to reuse. If no device by this name exists, Doc Detective creates one under this name using `deviceType`/`osVersion` (or their defaults), provided the toolchain is installed (`doc-detective install android` or `doc-detective install ios`)."
350093
350093
  },
350094
350094
  deviceType: {
350095
350095
  type: "string",
@@ -350102,11 +350102,11 @@ var init_schemas = __esm({
350102
350102
  osVersion: {
350103
350103
  type: "string",
350104
350104
  minLength: 1,
350105
- description: "Platform version used when creating a device; must match an installed system image (install more with `doc-detective install android`). Ignored when `name` already matches an existing device. Default: the newest installed version."
350105
+ description: "Platform version used when creating a device; must match an installed image/runtime for the target platform (install more with `doc-detective install android` or `doc-detective install ios`). Ignored when `name` already matches an existing device. Default: the newest installed version."
350106
350106
  },
350107
350107
  headless: {
350108
350108
  type: "boolean",
350109
- description: "Run the Android emulator without a window. Ignored where not applicable."
350109
+ description: "Run the Android emulator without a window. No-op on iOS (simulators boot without the Simulator UI on CI) and ignored where not applicable."
350110
350110
  },
350111
350111
  orientation: {
350112
350112
  type: "string",
@@ -350205,15 +350205,15 @@ var init_schemas = __esm({
350205
350205
  install: {
350206
350206
  type: "string",
350207
350207
  minLength: 1,
350208
- description: "Path to an installable artifact (`.apk`/`.app`/`.ipa`) to install on the device before launch. Lands with the Android phase (A3); on other platforms it is validated but not yet honored."
350208
+ description: "Path to an installable artifact (`.apk`/`.app`/`.ipa`) to install on the device before launch. Supported on Android and iOS app surfaces."
350209
350209
  },
350210
350210
  activity: {
350211
350211
  type: "string",
350212
350212
  minLength: 1,
350213
- description: "Android main activity override (defaults to the package's launcher activity). Lands with the Android phase (A3)."
350213
+ description: "Android main activity override (defaults to the package's launcher activity). Android-only."
350214
350214
  },
350215
350215
  device: {
350216
- description: "Device the app runs on. Omit for a host desktop app, or (in a mobile context) to use the context's default device. A string references a device by name; an object refines it. Lands with the Android phase (A3).",
350216
+ description: "Device the app runs on. Omit for a host desktop app, or (in a mobile context) to use the context's default device. A string references a device by name; an object refines it. Supported on Android and iOS mobile targets.",
350217
350217
  anyOf: [
350218
350218
  {
350219
350219
  type: "string",
@@ -350246,7 +350246,7 @@ var init_schemas = __esm({
350246
350246
  transform: [
350247
350247
  "trim"
350248
350248
  ],
350249
- description: "Device name and registry identity \u2014 the same name resolves to the same device. Reference form: names an existing AVD (Android) / simulator (iOS) to reuse. If no device by this name exists, Doc Detective creates one under this name using `deviceType`/`osVersion` (or their defaults), provided the toolchain and a matching system image are installed (`doc-detective install android`)."
350249
+ description: "Device name and registry identity \u2014 the same name resolves to the same device. Reference form: names an existing AVD (Android) / simulator (iOS) to reuse. If no device by this name exists, Doc Detective creates one under this name using `deviceType`/`osVersion` (or their defaults), provided the toolchain is installed (`doc-detective install android` or `doc-detective install ios`)."
350250
350250
  },
350251
350251
  deviceType: {
350252
350252
  type: "string",
@@ -350259,11 +350259,11 @@ var init_schemas = __esm({
350259
350259
  osVersion: {
350260
350260
  type: "string",
350261
350261
  minLength: 1,
350262
- description: "Platform version used when creating a device; must match an installed system image (install more with `doc-detective install android`). Ignored when `name` already matches an existing device. Default: the newest installed version."
350262
+ description: "Platform version used when creating a device; must match an installed image/runtime for the target platform (install more with `doc-detective install android` or `doc-detective install ios`). Ignored when `name` already matches an existing device. Default: the newest installed version."
350263
350263
  },
350264
350264
  headless: {
350265
350265
  type: "boolean",
350266
- description: "Run the Android emulator without a window. Ignored where not applicable."
350266
+ description: "Run the Android emulator without a window. No-op on iOS (simulators boot without the Simulator UI on CI) and ignored where not applicable."
350267
350267
  },
350268
350268
  orientation: {
350269
350269
  type: "string",
@@ -359944,7 +359944,7 @@ var init_schemas = __esm({
359944
359944
  ]
359945
359945
  },
359946
359946
  device: {
359947
- description: "Default device for a mobile (`android`/`ios`) context. A string references a device by name; an object refines it. The `platform` is implied by the context, so it is not required here. When the named device doesn't already exist, Doc Detective creates it with defaults (see `deviceType`/`osVersion`), provided the toolchain is installed (`doc-detective install android`). Same shape as `startSurface.device`.",
359947
+ description: "Default device for a mobile (`android`/`ios`) context. A string references a device by name; an object refines it. The `platform` is implied by the context, so it is not required here. When the named device doesn't already exist, Doc Detective creates it with defaults (see `deviceType`/`osVersion`), provided the toolchain is installed (`doc-detective install android` or `doc-detective install ios`). Same shape as `startSurface.device`.",
359948
359948
  examples: [
359949
359949
  "pixel7",
359950
359950
  {
@@ -359983,7 +359983,7 @@ var init_schemas = __esm({
359983
359983
  transform: [
359984
359984
  "trim"
359985
359985
  ],
359986
- description: "Device name and registry identity \u2014 the same name resolves to the same device. Reference form: names an existing AVD (Android) / simulator (iOS) to reuse. If no device by this name exists, Doc Detective creates one under this name using `deviceType`/`osVersion` (or their defaults), provided the toolchain and a matching system image are installed (`doc-detective install android`)."
359986
+ description: "Device name and registry identity \u2014 the same name resolves to the same device. Reference form: names an existing AVD (Android) / simulator (iOS) to reuse. If no device by this name exists, Doc Detective creates one under this name using `deviceType`/`osVersion` (or their defaults), provided the toolchain is installed (`doc-detective install android` or `doc-detective install ios`)."
359987
359987
  },
359988
359988
  deviceType: {
359989
359989
  type: "string",
@@ -359996,11 +359996,11 @@ var init_schemas = __esm({
359996
359996
  osVersion: {
359997
359997
  type: "string",
359998
359998
  minLength: 1,
359999
- description: "Platform version used when creating a device; must match an installed system image (install more with `doc-detective install android`). Ignored when `name` already matches an existing device. Default: the newest installed version."
359999
+ description: "Platform version used when creating a device; must match an installed image/runtime for the target platform (install more with `doc-detective install android` or `doc-detective install ios`). Ignored when `name` already matches an existing device. Default: the newest installed version."
360000
360000
  },
360001
360001
  headless: {
360002
360002
  type: "boolean",
360003
- description: "Run the Android emulator without a window. Ignored where not applicable."
360003
+ description: "Run the Android emulator without a window. No-op on iOS (simulators boot without the Simulator UI on CI) and ignored where not applicable."
360004
360004
  },
360005
360005
  orientation: {
360006
360006
  type: "string",
@@ -360786,7 +360786,7 @@ var init_schemas = __esm({
360786
360786
  ]
360787
360787
  },
360788
360788
  device: {
360789
- description: "Default device for a mobile (`android`/`ios`) context. A string references a device by name; an object refines it. The `platform` is implied by the context, so it is not required here. When the named device doesn't already exist, Doc Detective creates it with defaults (see `deviceType`/`osVersion`), provided the toolchain is installed (`doc-detective install android`). Same shape as `startSurface.device`.",
360789
+ description: "Default device for a mobile (`android`/`ios`) context. A string references a device by name; an object refines it. The `platform` is implied by the context, so it is not required here. When the named device doesn't already exist, Doc Detective creates it with defaults (see `deviceType`/`osVersion`), provided the toolchain is installed (`doc-detective install android` or `doc-detective install ios`). Same shape as `startSurface.device`.",
360790
360790
  examples: [
360791
360791
  "pixel7",
360792
360792
  {
@@ -360825,7 +360825,7 @@ var init_schemas = __esm({
360825
360825
  transform: [
360826
360826
  "trim"
360827
360827
  ],
360828
- description: "Device name and registry identity \u2014 the same name resolves to the same device. Reference form: names an existing AVD (Android) / simulator (iOS) to reuse. If no device by this name exists, Doc Detective creates one under this name using `deviceType`/`osVersion` (or their defaults), provided the toolchain and a matching system image are installed (`doc-detective install android`)."
360828
+ description: "Device name and registry identity \u2014 the same name resolves to the same device. Reference form: names an existing AVD (Android) / simulator (iOS) to reuse. If no device by this name exists, Doc Detective creates one under this name using `deviceType`/`osVersion` (or their defaults), provided the toolchain is installed (`doc-detective install android` or `doc-detective install ios`)."
360829
360829
  },
360830
360830
  deviceType: {
360831
360831
  type: "string",
@@ -360838,11 +360838,11 @@ var init_schemas = __esm({
360838
360838
  osVersion: {
360839
360839
  type: "string",
360840
360840
  minLength: 1,
360841
- description: "Platform version used when creating a device; must match an installed system image (install more with `doc-detective install android`). Ignored when `name` already matches an existing device. Default: the newest installed version."
360841
+ description: "Platform version used when creating a device; must match an installed image/runtime for the target platform (install more with `doc-detective install android` or `doc-detective install ios`). Ignored when `name` already matches an existing device. Default: the newest installed version."
360842
360842
  },
360843
360843
  headless: {
360844
360844
  type: "boolean",
360845
- description: "Run the Android emulator without a window. Ignored where not applicable."
360845
+ description: "Run the Android emulator without a window. No-op on iOS (simulators boot without the Simulator UI on CI) and ignored where not applicable."
360846
360846
  },
360847
360847
  orientation: {
360848
360848
  type: "string",
@@ -397431,7 +397431,7 @@ var init_schemas = __esm({
397431
397431
  startSurface: {
397432
397432
  $schema: "http://json-schema.org/draft-07/schema#",
397433
397433
  title: "startSurface",
397434
- description: "Open (provision) a surface and register it by name so later steps can target it with `surface`. Phases A1\u2013A2 ship the desktop native app branch: launch a Windows or macOS application by executable path, `.app` path, bundle ID, or UWP AppUserModelID. macOS additionally requires the Accessibility permission for the process that runs Doc Detective (System Settings \u2192 Privacy & Security \u2192 Accessibility); without it the context lands as SKIPPED with a walkthrough. Phase A3 adds Android apps on a managed emulator via the `device`, `install`, and `activity` fields (iOS lands in A4). Browser/process branches and the parallel array form arrive with multi-surface Phase 6. See docs/design/native-app-surfaces.md.",
397434
+ description: "Open (provision) a surface and register it by name so later steps can target it with `surface`. Phases A1\u2013A2 ship the desktop native app branch: launch a Windows or macOS application by executable path, `.app` path, bundle ID, or UWP AppUserModelID. macOS additionally requires the Accessibility permission for the process that runs Doc Detective (System Settings \u2192 Privacy & Security \u2192 Accessibility); without it the context lands as SKIPPED with a walkthrough. Phase A3 adds Android apps on a managed emulator, and phase A4 adds iOS app surfaces on macOS via XCUITest/simctl. Browser/process branches and the parallel array form arrive with multi-surface Phase 6. See docs/design/native-app-surfaces.md.",
397435
397435
  components: {
397436
397436
  schemas: {
397437
397437
  appDescriptor: {
@@ -397483,15 +397483,15 @@ var init_schemas = __esm({
397483
397483
  install: {
397484
397484
  type: "string",
397485
397485
  minLength: 1,
397486
- description: "Path to an installable artifact (`.apk`/`.app`/`.ipa`) to install on the device before launch. Lands with the Android phase (A3); on other platforms it is validated but not yet honored."
397486
+ description: "Path to an installable artifact (`.apk`/`.app`/`.ipa`) to install on the device before launch. Supported on Android and iOS app surfaces."
397487
397487
  },
397488
397488
  activity: {
397489
397489
  type: "string",
397490
397490
  minLength: 1,
397491
- description: "Android main activity override (defaults to the package's launcher activity). Lands with the Android phase (A3)."
397491
+ description: "Android main activity override (defaults to the package's launcher activity). Android-only."
397492
397492
  },
397493
397493
  device: {
397494
- description: "Device the app runs on. Omit for a host desktop app, or (in a mobile context) to use the context's default device. A string references a device by name; an object refines it. Lands with the Android phase (A3).",
397494
+ description: "Device the app runs on. Omit for a host desktop app, or (in a mobile context) to use the context's default device. A string references a device by name; an object refines it. Supported on Android and iOS mobile targets.",
397495
397495
  anyOf: [
397496
397496
  {
397497
397497
  type: "string",
@@ -397524,7 +397524,7 @@ var init_schemas = __esm({
397524
397524
  transform: [
397525
397525
  "trim"
397526
397526
  ],
397527
- description: "Device name and registry identity \u2014 the same name resolves to the same device. Reference form: names an existing AVD (Android) / simulator (iOS) to reuse. If no device by this name exists, Doc Detective creates one under this name using `deviceType`/`osVersion` (or their defaults), provided the toolchain and a matching system image are installed (`doc-detective install android`)."
397527
+ description: "Device name and registry identity \u2014 the same name resolves to the same device. Reference form: names an existing AVD (Android) / simulator (iOS) to reuse. If no device by this name exists, Doc Detective creates one under this name using `deviceType`/`osVersion` (or their defaults), provided the toolchain is installed (`doc-detective install android` or `doc-detective install ios`)."
397528
397528
  },
397529
397529
  deviceType: {
397530
397530
  type: "string",
@@ -397537,11 +397537,11 @@ var init_schemas = __esm({
397537
397537
  osVersion: {
397538
397538
  type: "string",
397539
397539
  minLength: 1,
397540
- description: "Platform version used when creating a device; must match an installed system image (install more with `doc-detective install android`). Ignored when `name` already matches an existing device. Default: the newest installed version."
397540
+ description: "Platform version used when creating a device; must match an installed image/runtime for the target platform (install more with `doc-detective install android` or `doc-detective install ios`). Ignored when `name` already matches an existing device. Default: the newest installed version."
397541
397541
  },
397542
397542
  headless: {
397543
397543
  type: "boolean",
397544
- description: "Run the Android emulator without a window. Ignored where not applicable."
397544
+ description: "Run the Android emulator without a window. No-op on iOS (simulators boot without the Simulator UI on CI) and ignored where not applicable."
397545
397545
  },
397546
397546
  orientation: {
397547
397547
  type: "string",
@@ -397713,7 +397713,7 @@ var init_schemas = __esm({
397713
397713
  transform: [
397714
397714
  "trim"
397715
397715
  ],
397716
- description: "Device name and registry identity \u2014 the same name resolves to the same device. Reference form: names an existing AVD (Android) / simulator (iOS) to reuse. If no device by this name exists, Doc Detective creates one under this name using `deviceType`/`osVersion` (or their defaults), provided the toolchain and a matching system image are installed (`doc-detective install android`)."
397716
+ description: "Device name and registry identity \u2014 the same name resolves to the same device. Reference form: names an existing AVD (Android) / simulator (iOS) to reuse. If no device by this name exists, Doc Detective creates one under this name using `deviceType`/`osVersion` (or their defaults), provided the toolchain is installed (`doc-detective install android` or `doc-detective install ios`)."
397717
397717
  },
397718
397718
  deviceType: {
397719
397719
  type: "string",
@@ -397726,11 +397726,11 @@ var init_schemas = __esm({
397726
397726
  osVersion: {
397727
397727
  type: "string",
397728
397728
  minLength: 1,
397729
- description: "Platform version used when creating a device; must match an installed system image (install more with `doc-detective install android`). Ignored when `name` already matches an existing device. Default: the newest installed version."
397729
+ description: "Platform version used when creating a device; must match an installed image/runtime for the target platform (install more with `doc-detective install android` or `doc-detective install ios`). Ignored when `name` already matches an existing device. Default: the newest installed version."
397730
397730
  },
397731
397731
  headless: {
397732
397732
  type: "boolean",
397733
- description: "Run the Android emulator without a window. Ignored where not applicable."
397733
+ description: "Run the Android emulator without a window. No-op on iOS (simulators boot without the Simulator UI on CI) and ignored where not applicable."
397734
397734
  },
397735
397735
  orientation: {
397736
397736
  type: "string",
@@ -397829,15 +397829,15 @@ var init_schemas = __esm({
397829
397829
  install: {
397830
397830
  type: "string",
397831
397831
  minLength: 1,
397832
- description: "Path to an installable artifact (`.apk`/`.app`/`.ipa`) to install on the device before launch. Lands with the Android phase (A3); on other platforms it is validated but not yet honored."
397832
+ description: "Path to an installable artifact (`.apk`/`.app`/`.ipa`) to install on the device before launch. Supported on Android and iOS app surfaces."
397833
397833
  },
397834
397834
  activity: {
397835
397835
  type: "string",
397836
397836
  minLength: 1,
397837
- description: "Android main activity override (defaults to the package's launcher activity). Lands with the Android phase (A3)."
397837
+ description: "Android main activity override (defaults to the package's launcher activity). Android-only."
397838
397838
  },
397839
397839
  device: {
397840
- description: "Device the app runs on. Omit for a host desktop app, or (in a mobile context) to use the context's default device. A string references a device by name; an object refines it. Lands with the Android phase (A3).",
397840
+ description: "Device the app runs on. Omit for a host desktop app, or (in a mobile context) to use the context's default device. A string references a device by name; an object refines it. Supported on Android and iOS mobile targets.",
397841
397841
  anyOf: [
397842
397842
  {
397843
397843
  type: "string",
@@ -397870,7 +397870,7 @@ var init_schemas = __esm({
397870
397870
  transform: [
397871
397871
  "trim"
397872
397872
  ],
397873
- description: "Device name and registry identity \u2014 the same name resolves to the same device. Reference form: names an existing AVD (Android) / simulator (iOS) to reuse. If no device by this name exists, Doc Detective creates one under this name using `deviceType`/`osVersion` (or their defaults), provided the toolchain and a matching system image are installed (`doc-detective install android`)."
397873
+ description: "Device name and registry identity \u2014 the same name resolves to the same device. Reference form: names an existing AVD (Android) / simulator (iOS) to reuse. If no device by this name exists, Doc Detective creates one under this name using `deviceType`/`osVersion` (or their defaults), provided the toolchain is installed (`doc-detective install android` or `doc-detective install ios`)."
397874
397874
  },
397875
397875
  deviceType: {
397876
397876
  type: "string",
@@ -397883,11 +397883,11 @@ var init_schemas = __esm({
397883
397883
  osVersion: {
397884
397884
  type: "string",
397885
397885
  minLength: 1,
397886
- description: "Platform version used when creating a device; must match an installed system image (install more with `doc-detective install android`). Ignored when `name` already matches an existing device. Default: the newest installed version."
397886
+ description: "Platform version used when creating a device; must match an installed image/runtime for the target platform (install more with `doc-detective install android` or `doc-detective install ios`). Ignored when `name` already matches an existing device. Default: the newest installed version."
397887
397887
  },
397888
397888
  headless: {
397889
397889
  type: "boolean",
397890
- description: "Run the Android emulator without a window. Ignored where not applicable."
397890
+ description: "Run the Android emulator without a window. No-op on iOS (simulators boot without the Simulator UI on CI) and ignored where not applicable."
397891
397891
  },
397892
397892
  orientation: {
397893
397893
  type: "string",
@@ -438921,7 +438921,7 @@ var init_schemas = __esm({
438921
438921
  startSurface: {
438922
438922
  $schema: "http://json-schema.org/draft-07/schema#",
438923
438923
  title: "startSurface",
438924
- description: "Open (provision) a surface and register it by name so later steps can target it with `surface`. Phases A1\u2013A2 ship the desktop native app branch: launch a Windows or macOS application by executable path, `.app` path, bundle ID, or UWP AppUserModelID. macOS additionally requires the Accessibility permission for the process that runs Doc Detective (System Settings \u2192 Privacy & Security \u2192 Accessibility); without it the context lands as SKIPPED with a walkthrough. Phase A3 adds Android apps on a managed emulator via the `device`, `install`, and `activity` fields (iOS lands in A4). Browser/process branches and the parallel array form arrive with multi-surface Phase 6. See docs/design/native-app-surfaces.md.",
438924
+ description: "Open (provision) a surface and register it by name so later steps can target it with `surface`. Phases A1\u2013A2 ship the desktop native app branch: launch a Windows or macOS application by executable path, `.app` path, bundle ID, or UWP AppUserModelID. macOS additionally requires the Accessibility permission for the process that runs Doc Detective (System Settings \u2192 Privacy & Security \u2192 Accessibility); without it the context lands as SKIPPED with a walkthrough. Phase A3 adds Android apps on a managed emulator, and phase A4 adds iOS app surfaces on macOS via XCUITest/simctl. Browser/process branches and the parallel array form arrive with multi-surface Phase 6. See docs/design/native-app-surfaces.md.",
438925
438925
  components: {
438926
438926
  schemas: {
438927
438927
  appDescriptor: {
@@ -438973,15 +438973,15 @@ var init_schemas = __esm({
438973
438973
  install: {
438974
438974
  type: "string",
438975
438975
  minLength: 1,
438976
- description: "Path to an installable artifact (`.apk`/`.app`/`.ipa`) to install on the device before launch. Lands with the Android phase (A3); on other platforms it is validated but not yet honored."
438976
+ description: "Path to an installable artifact (`.apk`/`.app`/`.ipa`) to install on the device before launch. Supported on Android and iOS app surfaces."
438977
438977
  },
438978
438978
  activity: {
438979
438979
  type: "string",
438980
438980
  minLength: 1,
438981
- description: "Android main activity override (defaults to the package's launcher activity). Lands with the Android phase (A3)."
438981
+ description: "Android main activity override (defaults to the package's launcher activity). Android-only."
438982
438982
  },
438983
438983
  device: {
438984
- description: "Device the app runs on. Omit for a host desktop app, or (in a mobile context) to use the context's default device. A string references a device by name; an object refines it. Lands with the Android phase (A3).",
438984
+ description: "Device the app runs on. Omit for a host desktop app, or (in a mobile context) to use the context's default device. A string references a device by name; an object refines it. Supported on Android and iOS mobile targets.",
438985
438985
  anyOf: [
438986
438986
  {
438987
438987
  type: "string",
@@ -439014,7 +439014,7 @@ var init_schemas = __esm({
439014
439014
  transform: [
439015
439015
  "trim"
439016
439016
  ],
439017
- description: "Device name and registry identity \u2014 the same name resolves to the same device. Reference form: names an existing AVD (Android) / simulator (iOS) to reuse. If no device by this name exists, Doc Detective creates one under this name using `deviceType`/`osVersion` (or their defaults), provided the toolchain and a matching system image are installed (`doc-detective install android`)."
439017
+ description: "Device name and registry identity \u2014 the same name resolves to the same device. Reference form: names an existing AVD (Android) / simulator (iOS) to reuse. If no device by this name exists, Doc Detective creates one under this name using `deviceType`/`osVersion` (or their defaults), provided the toolchain is installed (`doc-detective install android` or `doc-detective install ios`)."
439018
439018
  },
439019
439019
  deviceType: {
439020
439020
  type: "string",
@@ -439027,11 +439027,11 @@ var init_schemas = __esm({
439027
439027
  osVersion: {
439028
439028
  type: "string",
439029
439029
  minLength: 1,
439030
- description: "Platform version used when creating a device; must match an installed system image (install more with `doc-detective install android`). Ignored when `name` already matches an existing device. Default: the newest installed version."
439030
+ description: "Platform version used when creating a device; must match an installed image/runtime for the target platform (install more with `doc-detective install android` or `doc-detective install ios`). Ignored when `name` already matches an existing device. Default: the newest installed version."
439031
439031
  },
439032
439032
  headless: {
439033
439033
  type: "boolean",
439034
- description: "Run the Android emulator without a window. Ignored where not applicable."
439034
+ description: "Run the Android emulator without a window. No-op on iOS (simulators boot without the Simulator UI on CI) and ignored where not applicable."
439035
439035
  },
439036
439036
  orientation: {
439037
439037
  type: "string",
@@ -439203,7 +439203,7 @@ var init_schemas = __esm({
439203
439203
  transform: [
439204
439204
  "trim"
439205
439205
  ],
439206
- description: "Device name and registry identity \u2014 the same name resolves to the same device. Reference form: names an existing AVD (Android) / simulator (iOS) to reuse. If no device by this name exists, Doc Detective creates one under this name using `deviceType`/`osVersion` (or their defaults), provided the toolchain and a matching system image are installed (`doc-detective install android`)."
439206
+ description: "Device name and registry identity \u2014 the same name resolves to the same device. Reference form: names an existing AVD (Android) / simulator (iOS) to reuse. If no device by this name exists, Doc Detective creates one under this name using `deviceType`/`osVersion` (or their defaults), provided the toolchain is installed (`doc-detective install android` or `doc-detective install ios`)."
439207
439207
  },
439208
439208
  deviceType: {
439209
439209
  type: "string",
@@ -439216,11 +439216,11 @@ var init_schemas = __esm({
439216
439216
  osVersion: {
439217
439217
  type: "string",
439218
439218
  minLength: 1,
439219
- description: "Platform version used when creating a device; must match an installed system image (install more with `doc-detective install android`). Ignored when `name` already matches an existing device. Default: the newest installed version."
439219
+ description: "Platform version used when creating a device; must match an installed image/runtime for the target platform (install more with `doc-detective install android` or `doc-detective install ios`). Ignored when `name` already matches an existing device. Default: the newest installed version."
439220
439220
  },
439221
439221
  headless: {
439222
439222
  type: "boolean",
439223
- description: "Run the Android emulator without a window. Ignored where not applicable."
439223
+ description: "Run the Android emulator without a window. No-op on iOS (simulators boot without the Simulator UI on CI) and ignored where not applicable."
439224
439224
  },
439225
439225
  orientation: {
439226
439226
  type: "string",
@@ -439319,15 +439319,15 @@ var init_schemas = __esm({
439319
439319
  install: {
439320
439320
  type: "string",
439321
439321
  minLength: 1,
439322
- description: "Path to an installable artifact (`.apk`/`.app`/`.ipa`) to install on the device before launch. Lands with the Android phase (A3); on other platforms it is validated but not yet honored."
439322
+ description: "Path to an installable artifact (`.apk`/`.app`/`.ipa`) to install on the device before launch. Supported on Android and iOS app surfaces."
439323
439323
  },
439324
439324
  activity: {
439325
439325
  type: "string",
439326
439326
  minLength: 1,
439327
- description: "Android main activity override (defaults to the package's launcher activity). Lands with the Android phase (A3)."
439327
+ description: "Android main activity override (defaults to the package's launcher activity). Android-only."
439328
439328
  },
439329
439329
  device: {
439330
- description: "Device the app runs on. Omit for a host desktop app, or (in a mobile context) to use the context's default device. A string references a device by name; an object refines it. Lands with the Android phase (A3).",
439330
+ description: "Device the app runs on. Omit for a host desktop app, or (in a mobile context) to use the context's default device. A string references a device by name; an object refines it. Supported on Android and iOS mobile targets.",
439331
439331
  anyOf: [
439332
439332
  {
439333
439333
  type: "string",
@@ -439360,7 +439360,7 @@ var init_schemas = __esm({
439360
439360
  transform: [
439361
439361
  "trim"
439362
439362
  ],
439363
- description: "Device name and registry identity \u2014 the same name resolves to the same device. Reference form: names an existing AVD (Android) / simulator (iOS) to reuse. If no device by this name exists, Doc Detective creates one under this name using `deviceType`/`osVersion` (or their defaults), provided the toolchain and a matching system image are installed (`doc-detective install android`)."
439363
+ description: "Device name and registry identity \u2014 the same name resolves to the same device. Reference form: names an existing AVD (Android) / simulator (iOS) to reuse. If no device by this name exists, Doc Detective creates one under this name using `deviceType`/`osVersion` (or their defaults), provided the toolchain is installed (`doc-detective install android` or `doc-detective install ios`)."
439364
439364
  },
439365
439365
  deviceType: {
439366
439366
  type: "string",
@@ -439373,11 +439373,11 @@ var init_schemas = __esm({
439373
439373
  osVersion: {
439374
439374
  type: "string",
439375
439375
  minLength: 1,
439376
- description: "Platform version used when creating a device; must match an installed system image (install more with `doc-detective install android`). Ignored when `name` already matches an existing device. Default: the newest installed version."
439376
+ description: "Platform version used when creating a device; must match an installed image/runtime for the target platform (install more with `doc-detective install android` or `doc-detective install ios`). Ignored when `name` already matches an existing device. Default: the newest installed version."
439377
439377
  },
439378
439378
  headless: {
439379
439379
  type: "boolean",
439380
- description: "Run the Android emulator without a window. Ignored where not applicable."
439380
+ description: "Run the Android emulator without a window. No-op on iOS (simulators boot without the Simulator UI on CI) and ignored where not applicable."
439381
439381
  },
439382
439382
  orientation: {
439383
439383
  type: "string",
@@ -445217,7 +445217,7 @@ var init_schemas = __esm({
445217
445217
  startSurface_v3: {
445218
445218
  $schema: "http://json-schema.org/draft-07/schema#",
445219
445219
  title: "startSurface",
445220
- description: "Open (provision) a surface and register it by name so later steps can target it with `surface`. Phases A1\u2013A2 ship the desktop native app branch: launch a Windows or macOS application by executable path, `.app` path, bundle ID, or UWP AppUserModelID. macOS additionally requires the Accessibility permission for the process that runs Doc Detective (System Settings \u2192 Privacy & Security \u2192 Accessibility); without it the context lands as SKIPPED with a walkthrough. Phase A3 adds Android apps on a managed emulator via the `device`, `install`, and `activity` fields (iOS lands in A4). Browser/process branches and the parallel array form arrive with multi-surface Phase 6. See docs/design/native-app-surfaces.md.",
445220
+ description: "Open (provision) a surface and register it by name so later steps can target it with `surface`. Phases A1\u2013A2 ship the desktop native app branch: launch a Windows or macOS application by executable path, `.app` path, bundle ID, or UWP AppUserModelID. macOS additionally requires the Accessibility permission for the process that runs Doc Detective (System Settings \u2192 Privacy & Security \u2192 Accessibility); without it the context lands as SKIPPED with a walkthrough. Phase A3 adds Android apps on a managed emulator, and phase A4 adds iOS app surfaces on macOS via XCUITest/simctl. Browser/process branches and the parallel array form arrive with multi-surface Phase 6. See docs/design/native-app-surfaces.md.",
445221
445221
  components: {
445222
445222
  schemas: {
445223
445223
  appDescriptor: {
@@ -445269,15 +445269,15 @@ var init_schemas = __esm({
445269
445269
  install: {
445270
445270
  type: "string",
445271
445271
  minLength: 1,
445272
- description: "Path to an installable artifact (`.apk`/`.app`/`.ipa`) to install on the device before launch. Lands with the Android phase (A3); on other platforms it is validated but not yet honored."
445272
+ description: "Path to an installable artifact (`.apk`/`.app`/`.ipa`) to install on the device before launch. Supported on Android and iOS app surfaces."
445273
445273
  },
445274
445274
  activity: {
445275
445275
  type: "string",
445276
445276
  minLength: 1,
445277
- description: "Android main activity override (defaults to the package's launcher activity). Lands with the Android phase (A3)."
445277
+ description: "Android main activity override (defaults to the package's launcher activity). Android-only."
445278
445278
  },
445279
445279
  device: {
445280
- description: "Device the app runs on. Omit for a host desktop app, or (in a mobile context) to use the context's default device. A string references a device by name; an object refines it. Lands with the Android phase (A3).",
445280
+ description: "Device the app runs on. Omit for a host desktop app, or (in a mobile context) to use the context's default device. A string references a device by name; an object refines it. Supported on Android and iOS mobile targets.",
445281
445281
  anyOf: [
445282
445282
  {
445283
445283
  type: "string",
@@ -445310,7 +445310,7 @@ var init_schemas = __esm({
445310
445310
  transform: [
445311
445311
  "trim"
445312
445312
  ],
445313
- description: "Device name and registry identity \u2014 the same name resolves to the same device. Reference form: names an existing AVD (Android) / simulator (iOS) to reuse. If no device by this name exists, Doc Detective creates one under this name using `deviceType`/`osVersion` (or their defaults), provided the toolchain and a matching system image are installed (`doc-detective install android`)."
445313
+ description: "Device name and registry identity \u2014 the same name resolves to the same device. Reference form: names an existing AVD (Android) / simulator (iOS) to reuse. If no device by this name exists, Doc Detective creates one under this name using `deviceType`/`osVersion` (or their defaults), provided the toolchain is installed (`doc-detective install android` or `doc-detective install ios`)."
445314
445314
  },
445315
445315
  deviceType: {
445316
445316
  type: "string",
@@ -445323,11 +445323,11 @@ var init_schemas = __esm({
445323
445323
  osVersion: {
445324
445324
  type: "string",
445325
445325
  minLength: 1,
445326
- description: "Platform version used when creating a device; must match an installed system image (install more with `doc-detective install android`). Ignored when `name` already matches an existing device. Default: the newest installed version."
445326
+ description: "Platform version used when creating a device; must match an installed image/runtime for the target platform (install more with `doc-detective install android` or `doc-detective install ios`). Ignored when `name` already matches an existing device. Default: the newest installed version."
445327
445327
  },
445328
445328
  headless: {
445329
445329
  type: "boolean",
445330
- description: "Run the Android emulator without a window. Ignored where not applicable."
445330
+ description: "Run the Android emulator without a window. No-op on iOS (simulators boot without the Simulator UI on CI) and ignored where not applicable."
445331
445331
  },
445332
445332
  orientation: {
445333
445333
  type: "string",
@@ -445499,7 +445499,7 @@ var init_schemas = __esm({
445499
445499
  transform: [
445500
445500
  "trim"
445501
445501
  ],
445502
- description: "Device name and registry identity \u2014 the same name resolves to the same device. Reference form: names an existing AVD (Android) / simulator (iOS) to reuse. If no device by this name exists, Doc Detective creates one under this name using `deviceType`/`osVersion` (or their defaults), provided the toolchain and a matching system image are installed (`doc-detective install android`)."
445502
+ description: "Device name and registry identity \u2014 the same name resolves to the same device. Reference form: names an existing AVD (Android) / simulator (iOS) to reuse. If no device by this name exists, Doc Detective creates one under this name using `deviceType`/`osVersion` (or their defaults), provided the toolchain is installed (`doc-detective install android` or `doc-detective install ios`)."
445503
445503
  },
445504
445504
  deviceType: {
445505
445505
  type: "string",
@@ -445512,11 +445512,11 @@ var init_schemas = __esm({
445512
445512
  osVersion: {
445513
445513
  type: "string",
445514
445514
  minLength: 1,
445515
- description: "Platform version used when creating a device; must match an installed system image (install more with `doc-detective install android`). Ignored when `name` already matches an existing device. Default: the newest installed version."
445515
+ description: "Platform version used when creating a device; must match an installed image/runtime for the target platform (install more with `doc-detective install android` or `doc-detective install ios`). Ignored when `name` already matches an existing device. Default: the newest installed version."
445516
445516
  },
445517
445517
  headless: {
445518
445518
  type: "boolean",
445519
- description: "Run the Android emulator without a window. Ignored where not applicable."
445519
+ description: "Run the Android emulator without a window. No-op on iOS (simulators boot without the Simulator UI on CI) and ignored where not applicable."
445520
445520
  },
445521
445521
  orientation: {
445522
445522
  type: "string",
@@ -445615,15 +445615,15 @@ var init_schemas = __esm({
445615
445615
  install: {
445616
445616
  type: "string",
445617
445617
  minLength: 1,
445618
- description: "Path to an installable artifact (`.apk`/`.app`/`.ipa`) to install on the device before launch. Lands with the Android phase (A3); on other platforms it is validated but not yet honored."
445618
+ description: "Path to an installable artifact (`.apk`/`.app`/`.ipa`) to install on the device before launch. Supported on Android and iOS app surfaces."
445619
445619
  },
445620
445620
  activity: {
445621
445621
  type: "string",
445622
445622
  minLength: 1,
445623
- description: "Android main activity override (defaults to the package's launcher activity). Lands with the Android phase (A3)."
445623
+ description: "Android main activity override (defaults to the package's launcher activity). Android-only."
445624
445624
  },
445625
445625
  device: {
445626
- description: "Device the app runs on. Omit for a host desktop app, or (in a mobile context) to use the context's default device. A string references a device by name; an object refines it. Lands with the Android phase (A3).",
445626
+ description: "Device the app runs on. Omit for a host desktop app, or (in a mobile context) to use the context's default device. A string references a device by name; an object refines it. Supported on Android and iOS mobile targets.",
445627
445627
  anyOf: [
445628
445628
  {
445629
445629
  type: "string",
@@ -445656,7 +445656,7 @@ var init_schemas = __esm({
445656
445656
  transform: [
445657
445657
  "trim"
445658
445658
  ],
445659
- description: "Device name and registry identity \u2014 the same name resolves to the same device. Reference form: names an existing AVD (Android) / simulator (iOS) to reuse. If no device by this name exists, Doc Detective creates one under this name using `deviceType`/`osVersion` (or their defaults), provided the toolchain and a matching system image are installed (`doc-detective install android`)."
445659
+ description: "Device name and registry identity \u2014 the same name resolves to the same device. Reference form: names an existing AVD (Android) / simulator (iOS) to reuse. If no device by this name exists, Doc Detective creates one under this name using `deviceType`/`osVersion` (or their defaults), provided the toolchain is installed (`doc-detective install android` or `doc-detective install ios`)."
445660
445660
  },
445661
445661
  deviceType: {
445662
445662
  type: "string",
@@ -445669,11 +445669,11 @@ var init_schemas = __esm({
445669
445669
  osVersion: {
445670
445670
  type: "string",
445671
445671
  minLength: 1,
445672
- description: "Platform version used when creating a device; must match an installed system image (install more with `doc-detective install android`). Ignored when `name` already matches an existing device. Default: the newest installed version."
445672
+ description: "Platform version used when creating a device; must match an installed image/runtime for the target platform (install more with `doc-detective install android` or `doc-detective install ios`). Ignored when `name` already matches an existing device. Default: the newest installed version."
445673
445673
  },
445674
445674
  headless: {
445675
445675
  type: "boolean",
445676
- description: "Run the Android emulator without a window. Ignored where not applicable."
445676
+ description: "Run the Android emulator without a window. No-op on iOS (simulators boot without the Simulator UI on CI) and ignored where not applicable."
445677
445677
  },
445678
445678
  orientation: {
445679
445679
  type: "string",
@@ -481297,7 +481297,7 @@ var init_schemas = __esm({
481297
481297
  startSurface: {
481298
481298
  $schema: "http://json-schema.org/draft-07/schema#",
481299
481299
  title: "startSurface",
481300
- description: "Open (provision) a surface and register it by name so later steps can target it with `surface`. Phases A1\u2013A2 ship the desktop native app branch: launch a Windows or macOS application by executable path, `.app` path, bundle ID, or UWP AppUserModelID. macOS additionally requires the Accessibility permission for the process that runs Doc Detective (System Settings \u2192 Privacy & Security \u2192 Accessibility); without it the context lands as SKIPPED with a walkthrough. Phase A3 adds Android apps on a managed emulator via the `device`, `install`, and `activity` fields (iOS lands in A4). Browser/process branches and the parallel array form arrive with multi-surface Phase 6. See docs/design/native-app-surfaces.md.",
481300
+ description: "Open (provision) a surface and register it by name so later steps can target it with `surface`. Phases A1\u2013A2 ship the desktop native app branch: launch a Windows or macOS application by executable path, `.app` path, bundle ID, or UWP AppUserModelID. macOS additionally requires the Accessibility permission for the process that runs Doc Detective (System Settings \u2192 Privacy & Security \u2192 Accessibility); without it the context lands as SKIPPED with a walkthrough. Phase A3 adds Android apps on a managed emulator, and phase A4 adds iOS app surfaces on macOS via XCUITest/simctl. Browser/process branches and the parallel array form arrive with multi-surface Phase 6. See docs/design/native-app-surfaces.md.",
481301
481301
  components: {
481302
481302
  schemas: {
481303
481303
  appDescriptor: {
@@ -481349,15 +481349,15 @@ var init_schemas = __esm({
481349
481349
  install: {
481350
481350
  type: "string",
481351
481351
  minLength: 1,
481352
- description: "Path to an installable artifact (`.apk`/`.app`/`.ipa`) to install on the device before launch. Lands with the Android phase (A3); on other platforms it is validated but not yet honored."
481352
+ description: "Path to an installable artifact (`.apk`/`.app`/`.ipa`) to install on the device before launch. Supported on Android and iOS app surfaces."
481353
481353
  },
481354
481354
  activity: {
481355
481355
  type: "string",
481356
481356
  minLength: 1,
481357
- description: "Android main activity override (defaults to the package's launcher activity). Lands with the Android phase (A3)."
481357
+ description: "Android main activity override (defaults to the package's launcher activity). Android-only."
481358
481358
  },
481359
481359
  device: {
481360
- description: "Device the app runs on. Omit for a host desktop app, or (in a mobile context) to use the context's default device. A string references a device by name; an object refines it. Lands with the Android phase (A3).",
481360
+ description: "Device the app runs on. Omit for a host desktop app, or (in a mobile context) to use the context's default device. A string references a device by name; an object refines it. Supported on Android and iOS mobile targets.",
481361
481361
  anyOf: [
481362
481362
  {
481363
481363
  type: "string",
@@ -481390,7 +481390,7 @@ var init_schemas = __esm({
481390
481390
  transform: [
481391
481391
  "trim"
481392
481392
  ],
481393
- description: "Device name and registry identity \u2014 the same name resolves to the same device. Reference form: names an existing AVD (Android) / simulator (iOS) to reuse. If no device by this name exists, Doc Detective creates one under this name using `deviceType`/`osVersion` (or their defaults), provided the toolchain and a matching system image are installed (`doc-detective install android`)."
481393
+ description: "Device name and registry identity \u2014 the same name resolves to the same device. Reference form: names an existing AVD (Android) / simulator (iOS) to reuse. If no device by this name exists, Doc Detective creates one under this name using `deviceType`/`osVersion` (or their defaults), provided the toolchain is installed (`doc-detective install android` or `doc-detective install ios`)."
481394
481394
  },
481395
481395
  deviceType: {
481396
481396
  type: "string",
@@ -481403,11 +481403,11 @@ var init_schemas = __esm({
481403
481403
  osVersion: {
481404
481404
  type: "string",
481405
481405
  minLength: 1,
481406
- description: "Platform version used when creating a device; must match an installed system image (install more with `doc-detective install android`). Ignored when `name` already matches an existing device. Default: the newest installed version."
481406
+ description: "Platform version used when creating a device; must match an installed image/runtime for the target platform (install more with `doc-detective install android` or `doc-detective install ios`). Ignored when `name` already matches an existing device. Default: the newest installed version."
481407
481407
  },
481408
481408
  headless: {
481409
481409
  type: "boolean",
481410
- description: "Run the Android emulator without a window. Ignored where not applicable."
481410
+ description: "Run the Android emulator without a window. No-op on iOS (simulators boot without the Simulator UI on CI) and ignored where not applicable."
481411
481411
  },
481412
481412
  orientation: {
481413
481413
  type: "string",
@@ -481579,7 +481579,7 @@ var init_schemas = __esm({
481579
481579
  transform: [
481580
481580
  "trim"
481581
481581
  ],
481582
- description: "Device name and registry identity \u2014 the same name resolves to the same device. Reference form: names an existing AVD (Android) / simulator (iOS) to reuse. If no device by this name exists, Doc Detective creates one under this name using `deviceType`/`osVersion` (or their defaults), provided the toolchain and a matching system image are installed (`doc-detective install android`)."
481582
+ description: "Device name and registry identity \u2014 the same name resolves to the same device. Reference form: names an existing AVD (Android) / simulator (iOS) to reuse. If no device by this name exists, Doc Detective creates one under this name using `deviceType`/`osVersion` (or their defaults), provided the toolchain is installed (`doc-detective install android` or `doc-detective install ios`)."
481583
481583
  },
481584
481584
  deviceType: {
481585
481585
  type: "string",
@@ -481592,11 +481592,11 @@ var init_schemas = __esm({
481592
481592
  osVersion: {
481593
481593
  type: "string",
481594
481594
  minLength: 1,
481595
- description: "Platform version used when creating a device; must match an installed system image (install more with `doc-detective install android`). Ignored when `name` already matches an existing device. Default: the newest installed version."
481595
+ description: "Platform version used when creating a device; must match an installed image/runtime for the target platform (install more with `doc-detective install android` or `doc-detective install ios`). Ignored when `name` already matches an existing device. Default: the newest installed version."
481596
481596
  },
481597
481597
  headless: {
481598
481598
  type: "boolean",
481599
- description: "Run the Android emulator without a window. Ignored where not applicable."
481599
+ description: "Run the Android emulator without a window. No-op on iOS (simulators boot without the Simulator UI on CI) and ignored where not applicable."
481600
481600
  },
481601
481601
  orientation: {
481602
481602
  type: "string",
@@ -481695,15 +481695,15 @@ var init_schemas = __esm({
481695
481695
  install: {
481696
481696
  type: "string",
481697
481697
  minLength: 1,
481698
- description: "Path to an installable artifact (`.apk`/`.app`/`.ipa`) to install on the device before launch. Lands with the Android phase (A3); on other platforms it is validated but not yet honored."
481698
+ description: "Path to an installable artifact (`.apk`/`.app`/`.ipa`) to install on the device before launch. Supported on Android and iOS app surfaces."
481699
481699
  },
481700
481700
  activity: {
481701
481701
  type: "string",
481702
481702
  minLength: 1,
481703
- description: "Android main activity override (defaults to the package's launcher activity). Lands with the Android phase (A3)."
481703
+ description: "Android main activity override (defaults to the package's launcher activity). Android-only."
481704
481704
  },
481705
481705
  device: {
481706
- description: "Device the app runs on. Omit for a host desktop app, or (in a mobile context) to use the context's default device. A string references a device by name; an object refines it. Lands with the Android phase (A3).",
481706
+ description: "Device the app runs on. Omit for a host desktop app, or (in a mobile context) to use the context's default device. A string references a device by name; an object refines it. Supported on Android and iOS mobile targets.",
481707
481707
  anyOf: [
481708
481708
  {
481709
481709
  type: "string",
@@ -481736,7 +481736,7 @@ var init_schemas = __esm({
481736
481736
  transform: [
481737
481737
  "trim"
481738
481738
  ],
481739
- description: "Device name and registry identity \u2014 the same name resolves to the same device. Reference form: names an existing AVD (Android) / simulator (iOS) to reuse. If no device by this name exists, Doc Detective creates one under this name using `deviceType`/`osVersion` (or their defaults), provided the toolchain and a matching system image are installed (`doc-detective install android`)."
481739
+ description: "Device name and registry identity \u2014 the same name resolves to the same device. Reference form: names an existing AVD (Android) / simulator (iOS) to reuse. If no device by this name exists, Doc Detective creates one under this name using `deviceType`/`osVersion` (or their defaults), provided the toolchain is installed (`doc-detective install android` or `doc-detective install ios`)."
481740
481740
  },
481741
481741
  deviceType: {
481742
481742
  type: "string",
@@ -481749,11 +481749,11 @@ var init_schemas = __esm({
481749
481749
  osVersion: {
481750
481750
  type: "string",
481751
481751
  minLength: 1,
481752
- description: "Platform version used when creating a device; must match an installed system image (install more with `doc-detective install android`). Ignored when `name` already matches an existing device. Default: the newest installed version."
481752
+ description: "Platform version used when creating a device; must match an installed image/runtime for the target platform (install more with `doc-detective install android` or `doc-detective install ios`). Ignored when `name` already matches an existing device. Default: the newest installed version."
481753
481753
  },
481754
481754
  headless: {
481755
481755
  type: "boolean",
481756
- description: "Run the Android emulator without a window. Ignored where not applicable."
481756
+ description: "Run the Android emulator without a window. No-op on iOS (simulators boot without the Simulator UI on CI) and ignored where not applicable."
481757
481757
  },
481758
481758
  orientation: {
481759
481759
  type: "string",
@@ -488091,7 +488091,7 @@ var init_schemas = __esm({
488091
488091
  ]
488092
488092
  },
488093
488093
  device: {
488094
- description: "Default device for a mobile (`android`/`ios`) context. A string references a device by name; an object refines it. The `platform` is implied by the context, so it is not required here. When the named device doesn't already exist, Doc Detective creates it with defaults (see `deviceType`/`osVersion`), provided the toolchain is installed (`doc-detective install android`). Same shape as `startSurface.device`.",
488094
+ description: "Default device for a mobile (`android`/`ios`) context. A string references a device by name; an object refines it. The `platform` is implied by the context, so it is not required here. When the named device doesn't already exist, Doc Detective creates it with defaults (see `deviceType`/`osVersion`), provided the toolchain is installed (`doc-detective install android` or `doc-detective install ios`). Same shape as `startSurface.device`.",
488095
488095
  examples: [
488096
488096
  "pixel7",
488097
488097
  {
@@ -488130,7 +488130,7 @@ var init_schemas = __esm({
488130
488130
  transform: [
488131
488131
  "trim"
488132
488132
  ],
488133
- description: "Device name and registry identity \u2014 the same name resolves to the same device. Reference form: names an existing AVD (Android) / simulator (iOS) to reuse. If no device by this name exists, Doc Detective creates one under this name using `deviceType`/`osVersion` (or their defaults), provided the toolchain and a matching system image are installed (`doc-detective install android`)."
488133
+ description: "Device name and registry identity \u2014 the same name resolves to the same device. Reference form: names an existing AVD (Android) / simulator (iOS) to reuse. If no device by this name exists, Doc Detective creates one under this name using `deviceType`/`osVersion` (or their defaults), provided the toolchain is installed (`doc-detective install android` or `doc-detective install ios`)."
488134
488134
  },
488135
488135
  deviceType: {
488136
488136
  type: "string",
@@ -488143,11 +488143,11 @@ var init_schemas = __esm({
488143
488143
  osVersion: {
488144
488144
  type: "string",
488145
488145
  minLength: 1,
488146
- description: "Platform version used when creating a device; must match an installed system image (install more with `doc-detective install android`). Ignored when `name` already matches an existing device. Default: the newest installed version."
488146
+ description: "Platform version used when creating a device; must match an installed image/runtime for the target platform (install more with `doc-detective install android` or `doc-detective install ios`). Ignored when `name` already matches an existing device. Default: the newest installed version."
488147
488147
  },
488148
488148
  headless: {
488149
488149
  type: "boolean",
488150
- description: "Run the Android emulator without a window. Ignored where not applicable."
488150
+ description: "Run the Android emulator without a window. No-op on iOS (simulators boot without the Simulator UI on CI) and ignored where not applicable."
488151
488151
  },
488152
488152
  orientation: {
488153
488153
  type: "string",
@@ -524736,7 +524736,7 @@ var init_schemas = __esm({
524736
524736
  startSurface: {
524737
524737
  $schema: "http://json-schema.org/draft-07/schema#",
524738
524738
  title: "startSurface",
524739
- description: "Open (provision) a surface and register it by name so later steps can target it with `surface`. Phases A1\u2013A2 ship the desktop native app branch: launch a Windows or macOS application by executable path, `.app` path, bundle ID, or UWP AppUserModelID. macOS additionally requires the Accessibility permission for the process that runs Doc Detective (System Settings \u2192 Privacy & Security \u2192 Accessibility); without it the context lands as SKIPPED with a walkthrough. Phase A3 adds Android apps on a managed emulator via the `device`, `install`, and `activity` fields (iOS lands in A4). Browser/process branches and the parallel array form arrive with multi-surface Phase 6. See docs/design/native-app-surfaces.md.",
524739
+ description: "Open (provision) a surface and register it by name so later steps can target it with `surface`. Phases A1\u2013A2 ship the desktop native app branch: launch a Windows or macOS application by executable path, `.app` path, bundle ID, or UWP AppUserModelID. macOS additionally requires the Accessibility permission for the process that runs Doc Detective (System Settings \u2192 Privacy & Security \u2192 Accessibility); without it the context lands as SKIPPED with a walkthrough. Phase A3 adds Android apps on a managed emulator, and phase A4 adds iOS app surfaces on macOS via XCUITest/simctl. Browser/process branches and the parallel array form arrive with multi-surface Phase 6. See docs/design/native-app-surfaces.md.",
524740
524740
  components: {
524741
524741
  schemas: {
524742
524742
  appDescriptor: {
@@ -524788,15 +524788,15 @@ var init_schemas = __esm({
524788
524788
  install: {
524789
524789
  type: "string",
524790
524790
  minLength: 1,
524791
- description: "Path to an installable artifact (`.apk`/`.app`/`.ipa`) to install on the device before launch. Lands with the Android phase (A3); on other platforms it is validated but not yet honored."
524791
+ description: "Path to an installable artifact (`.apk`/`.app`/`.ipa`) to install on the device before launch. Supported on Android and iOS app surfaces."
524792
524792
  },
524793
524793
  activity: {
524794
524794
  type: "string",
524795
524795
  minLength: 1,
524796
- description: "Android main activity override (defaults to the package's launcher activity). Lands with the Android phase (A3)."
524796
+ description: "Android main activity override (defaults to the package's launcher activity). Android-only."
524797
524797
  },
524798
524798
  device: {
524799
- description: "Device the app runs on. Omit for a host desktop app, or (in a mobile context) to use the context's default device. A string references a device by name; an object refines it. Lands with the Android phase (A3).",
524799
+ description: "Device the app runs on. Omit for a host desktop app, or (in a mobile context) to use the context's default device. A string references a device by name; an object refines it. Supported on Android and iOS mobile targets.",
524800
524800
  anyOf: [
524801
524801
  {
524802
524802
  type: "string",
@@ -524829,7 +524829,7 @@ var init_schemas = __esm({
524829
524829
  transform: [
524830
524830
  "trim"
524831
524831
  ],
524832
- description: "Device name and registry identity \u2014 the same name resolves to the same device. Reference form: names an existing AVD (Android) / simulator (iOS) to reuse. If no device by this name exists, Doc Detective creates one under this name using `deviceType`/`osVersion` (or their defaults), provided the toolchain and a matching system image are installed (`doc-detective install android`)."
524832
+ description: "Device name and registry identity \u2014 the same name resolves to the same device. Reference form: names an existing AVD (Android) / simulator (iOS) to reuse. If no device by this name exists, Doc Detective creates one under this name using `deviceType`/`osVersion` (or their defaults), provided the toolchain is installed (`doc-detective install android` or `doc-detective install ios`)."
524833
524833
  },
524834
524834
  deviceType: {
524835
524835
  type: "string",
@@ -524842,11 +524842,11 @@ var init_schemas = __esm({
524842
524842
  osVersion: {
524843
524843
  type: "string",
524844
524844
  minLength: 1,
524845
- description: "Platform version used when creating a device; must match an installed system image (install more with `doc-detective install android`). Ignored when `name` already matches an existing device. Default: the newest installed version."
524845
+ description: "Platform version used when creating a device; must match an installed image/runtime for the target platform (install more with `doc-detective install android` or `doc-detective install ios`). Ignored when `name` already matches an existing device. Default: the newest installed version."
524846
524846
  },
524847
524847
  headless: {
524848
524848
  type: "boolean",
524849
- description: "Run the Android emulator without a window. Ignored where not applicable."
524849
+ description: "Run the Android emulator without a window. No-op on iOS (simulators boot without the Simulator UI on CI) and ignored where not applicable."
524850
524850
  },
524851
524851
  orientation: {
524852
524852
  type: "string",
@@ -525018,7 +525018,7 @@ var init_schemas = __esm({
525018
525018
  transform: [
525019
525019
  "trim"
525020
525020
  ],
525021
- description: "Device name and registry identity \u2014 the same name resolves to the same device. Reference form: names an existing AVD (Android) / simulator (iOS) to reuse. If no device by this name exists, Doc Detective creates one under this name using `deviceType`/`osVersion` (or their defaults), provided the toolchain and a matching system image are installed (`doc-detective install android`)."
525021
+ description: "Device name and registry identity \u2014 the same name resolves to the same device. Reference form: names an existing AVD (Android) / simulator (iOS) to reuse. If no device by this name exists, Doc Detective creates one under this name using `deviceType`/`osVersion` (or their defaults), provided the toolchain is installed (`doc-detective install android` or `doc-detective install ios`)."
525022
525022
  },
525023
525023
  deviceType: {
525024
525024
  type: "string",
@@ -525031,11 +525031,11 @@ var init_schemas = __esm({
525031
525031
  osVersion: {
525032
525032
  type: "string",
525033
525033
  minLength: 1,
525034
- description: "Platform version used when creating a device; must match an installed system image (install more with `doc-detective install android`). Ignored when `name` already matches an existing device. Default: the newest installed version."
525034
+ description: "Platform version used when creating a device; must match an installed image/runtime for the target platform (install more with `doc-detective install android` or `doc-detective install ios`). Ignored when `name` already matches an existing device. Default: the newest installed version."
525035
525035
  },
525036
525036
  headless: {
525037
525037
  type: "boolean",
525038
- description: "Run the Android emulator without a window. Ignored where not applicable."
525038
+ description: "Run the Android emulator without a window. No-op on iOS (simulators boot without the Simulator UI on CI) and ignored where not applicable."
525039
525039
  },
525040
525040
  orientation: {
525041
525041
  type: "string",
@@ -525134,15 +525134,15 @@ var init_schemas = __esm({
525134
525134
  install: {
525135
525135
  type: "string",
525136
525136
  minLength: 1,
525137
- description: "Path to an installable artifact (`.apk`/`.app`/`.ipa`) to install on the device before launch. Lands with the Android phase (A3); on other platforms it is validated but not yet honored."
525137
+ description: "Path to an installable artifact (`.apk`/`.app`/`.ipa`) to install on the device before launch. Supported on Android and iOS app surfaces."
525138
525138
  },
525139
525139
  activity: {
525140
525140
  type: "string",
525141
525141
  minLength: 1,
525142
- description: "Android main activity override (defaults to the package's launcher activity). Lands with the Android phase (A3)."
525142
+ description: "Android main activity override (defaults to the package's launcher activity). Android-only."
525143
525143
  },
525144
525144
  device: {
525145
- description: "Device the app runs on. Omit for a host desktop app, or (in a mobile context) to use the context's default device. A string references a device by name; an object refines it. Lands with the Android phase (A3).",
525145
+ description: "Device the app runs on. Omit for a host desktop app, or (in a mobile context) to use the context's default device. A string references a device by name; an object refines it. Supported on Android and iOS mobile targets.",
525146
525146
  anyOf: [
525147
525147
  {
525148
525148
  type: "string",
@@ -525175,7 +525175,7 @@ var init_schemas = __esm({
525175
525175
  transform: [
525176
525176
  "trim"
525177
525177
  ],
525178
- description: "Device name and registry identity \u2014 the same name resolves to the same device. Reference form: names an existing AVD (Android) / simulator (iOS) to reuse. If no device by this name exists, Doc Detective creates one under this name using `deviceType`/`osVersion` (or their defaults), provided the toolchain and a matching system image are installed (`doc-detective install android`)."
525178
+ description: "Device name and registry identity \u2014 the same name resolves to the same device. Reference form: names an existing AVD (Android) / simulator (iOS) to reuse. If no device by this name exists, Doc Detective creates one under this name using `deviceType`/`osVersion` (or their defaults), provided the toolchain is installed (`doc-detective install android` or `doc-detective install ios`)."
525179
525179
  },
525180
525180
  deviceType: {
525181
525181
  type: "string",
@@ -525188,11 +525188,11 @@ var init_schemas = __esm({
525188
525188
  osVersion: {
525189
525189
  type: "string",
525190
525190
  minLength: 1,
525191
- description: "Platform version used when creating a device; must match an installed system image (install more with `doc-detective install android`). Ignored when `name` already matches an existing device. Default: the newest installed version."
525191
+ description: "Platform version used when creating a device; must match an installed image/runtime for the target platform (install more with `doc-detective install android` or `doc-detective install ios`). Ignored when `name` already matches an existing device. Default: the newest installed version."
525192
525192
  },
525193
525193
  headless: {
525194
525194
  type: "boolean",
525195
- description: "Run the Android emulator without a window. Ignored where not applicable."
525195
+ description: "Run the Android emulator without a window. No-op on iOS (simulators boot without the Simulator UI on CI) and ignored where not applicable."
525196
525196
  },
525197
525197
  orientation: {
525198
525198
  type: "string",
@@ -566226,7 +566226,7 @@ var init_schemas = __esm({
566226
566226
  startSurface: {
566227
566227
  $schema: "http://json-schema.org/draft-07/schema#",
566228
566228
  title: "startSurface",
566229
- description: "Open (provision) a surface and register it by name so later steps can target it with `surface`. Phases A1\u2013A2 ship the desktop native app branch: launch a Windows or macOS application by executable path, `.app` path, bundle ID, or UWP AppUserModelID. macOS additionally requires the Accessibility permission for the process that runs Doc Detective (System Settings \u2192 Privacy & Security \u2192 Accessibility); without it the context lands as SKIPPED with a walkthrough. Phase A3 adds Android apps on a managed emulator via the `device`, `install`, and `activity` fields (iOS lands in A4). Browser/process branches and the parallel array form arrive with multi-surface Phase 6. See docs/design/native-app-surfaces.md.",
566229
+ description: "Open (provision) a surface and register it by name so later steps can target it with `surface`. Phases A1\u2013A2 ship the desktop native app branch: launch a Windows or macOS application by executable path, `.app` path, bundle ID, or UWP AppUserModelID. macOS additionally requires the Accessibility permission for the process that runs Doc Detective (System Settings \u2192 Privacy & Security \u2192 Accessibility); without it the context lands as SKIPPED with a walkthrough. Phase A3 adds Android apps on a managed emulator, and phase A4 adds iOS app surfaces on macOS via XCUITest/simctl. Browser/process branches and the parallel array form arrive with multi-surface Phase 6. See docs/design/native-app-surfaces.md.",
566230
566230
  components: {
566231
566231
  schemas: {
566232
566232
  appDescriptor: {
@@ -566278,15 +566278,15 @@ var init_schemas = __esm({
566278
566278
  install: {
566279
566279
  type: "string",
566280
566280
  minLength: 1,
566281
- description: "Path to an installable artifact (`.apk`/`.app`/`.ipa`) to install on the device before launch. Lands with the Android phase (A3); on other platforms it is validated but not yet honored."
566281
+ description: "Path to an installable artifact (`.apk`/`.app`/`.ipa`) to install on the device before launch. Supported on Android and iOS app surfaces."
566282
566282
  },
566283
566283
  activity: {
566284
566284
  type: "string",
566285
566285
  minLength: 1,
566286
- description: "Android main activity override (defaults to the package's launcher activity). Lands with the Android phase (A3)."
566286
+ description: "Android main activity override (defaults to the package's launcher activity). Android-only."
566287
566287
  },
566288
566288
  device: {
566289
- description: "Device the app runs on. Omit for a host desktop app, or (in a mobile context) to use the context's default device. A string references a device by name; an object refines it. Lands with the Android phase (A3).",
566289
+ description: "Device the app runs on. Omit for a host desktop app, or (in a mobile context) to use the context's default device. A string references a device by name; an object refines it. Supported on Android and iOS mobile targets.",
566290
566290
  anyOf: [
566291
566291
  {
566292
566292
  type: "string",
@@ -566319,7 +566319,7 @@ var init_schemas = __esm({
566319
566319
  transform: [
566320
566320
  "trim"
566321
566321
  ],
566322
- description: "Device name and registry identity \u2014 the same name resolves to the same device. Reference form: names an existing AVD (Android) / simulator (iOS) to reuse. If no device by this name exists, Doc Detective creates one under this name using `deviceType`/`osVersion` (or their defaults), provided the toolchain and a matching system image are installed (`doc-detective install android`)."
566322
+ description: "Device name and registry identity \u2014 the same name resolves to the same device. Reference form: names an existing AVD (Android) / simulator (iOS) to reuse. If no device by this name exists, Doc Detective creates one under this name using `deviceType`/`osVersion` (or their defaults), provided the toolchain is installed (`doc-detective install android` or `doc-detective install ios`)."
566323
566323
  },
566324
566324
  deviceType: {
566325
566325
  type: "string",
@@ -566332,11 +566332,11 @@ var init_schemas = __esm({
566332
566332
  osVersion: {
566333
566333
  type: "string",
566334
566334
  minLength: 1,
566335
- description: "Platform version used when creating a device; must match an installed system image (install more with `doc-detective install android`). Ignored when `name` already matches an existing device. Default: the newest installed version."
566335
+ description: "Platform version used when creating a device; must match an installed image/runtime for the target platform (install more with `doc-detective install android` or `doc-detective install ios`). Ignored when `name` already matches an existing device. Default: the newest installed version."
566336
566336
  },
566337
566337
  headless: {
566338
566338
  type: "boolean",
566339
- description: "Run the Android emulator without a window. Ignored where not applicable."
566339
+ description: "Run the Android emulator without a window. No-op on iOS (simulators boot without the Simulator UI on CI) and ignored where not applicable."
566340
566340
  },
566341
566341
  orientation: {
566342
566342
  type: "string",
@@ -566508,7 +566508,7 @@ var init_schemas = __esm({
566508
566508
  transform: [
566509
566509
  "trim"
566510
566510
  ],
566511
- description: "Device name and registry identity \u2014 the same name resolves to the same device. Reference form: names an existing AVD (Android) / simulator (iOS) to reuse. If no device by this name exists, Doc Detective creates one under this name using `deviceType`/`osVersion` (or their defaults), provided the toolchain and a matching system image are installed (`doc-detective install android`)."
566511
+ description: "Device name and registry identity \u2014 the same name resolves to the same device. Reference form: names an existing AVD (Android) / simulator (iOS) to reuse. If no device by this name exists, Doc Detective creates one under this name using `deviceType`/`osVersion` (or their defaults), provided the toolchain is installed (`doc-detective install android` or `doc-detective install ios`)."
566512
566512
  },
566513
566513
  deviceType: {
566514
566514
  type: "string",
@@ -566521,11 +566521,11 @@ var init_schemas = __esm({
566521
566521
  osVersion: {
566522
566522
  type: "string",
566523
566523
  minLength: 1,
566524
- description: "Platform version used when creating a device; must match an installed system image (install more with `doc-detective install android`). Ignored when `name` already matches an existing device. Default: the newest installed version."
566524
+ description: "Platform version used when creating a device; must match an installed image/runtime for the target platform (install more with `doc-detective install android` or `doc-detective install ios`). Ignored when `name` already matches an existing device. Default: the newest installed version."
566525
566525
  },
566526
566526
  headless: {
566527
566527
  type: "boolean",
566528
- description: "Run the Android emulator without a window. Ignored where not applicable."
566528
+ description: "Run the Android emulator without a window. No-op on iOS (simulators boot without the Simulator UI on CI) and ignored where not applicable."
566529
566529
  },
566530
566530
  orientation: {
566531
566531
  type: "string",
@@ -566624,15 +566624,15 @@ var init_schemas = __esm({
566624
566624
  install: {
566625
566625
  type: "string",
566626
566626
  minLength: 1,
566627
- description: "Path to an installable artifact (`.apk`/`.app`/`.ipa`) to install on the device before launch. Lands with the Android phase (A3); on other platforms it is validated but not yet honored."
566627
+ description: "Path to an installable artifact (`.apk`/`.app`/`.ipa`) to install on the device before launch. Supported on Android and iOS app surfaces."
566628
566628
  },
566629
566629
  activity: {
566630
566630
  type: "string",
566631
566631
  minLength: 1,
566632
- description: "Android main activity override (defaults to the package's launcher activity). Lands with the Android phase (A3)."
566632
+ description: "Android main activity override (defaults to the package's launcher activity). Android-only."
566633
566633
  },
566634
566634
  device: {
566635
- description: "Device the app runs on. Omit for a host desktop app, or (in a mobile context) to use the context's default device. A string references a device by name; an object refines it. Lands with the Android phase (A3).",
566635
+ description: "Device the app runs on. Omit for a host desktop app, or (in a mobile context) to use the context's default device. A string references a device by name; an object refines it. Supported on Android and iOS mobile targets.",
566636
566636
  anyOf: [
566637
566637
  {
566638
566638
  type: "string",
@@ -566665,7 +566665,7 @@ var init_schemas = __esm({
566665
566665
  transform: [
566666
566666
  "trim"
566667
566667
  ],
566668
- description: "Device name and registry identity \u2014 the same name resolves to the same device. Reference form: names an existing AVD (Android) / simulator (iOS) to reuse. If no device by this name exists, Doc Detective creates one under this name using `deviceType`/`osVersion` (or their defaults), provided the toolchain and a matching system image are installed (`doc-detective install android`)."
566668
+ description: "Device name and registry identity \u2014 the same name resolves to the same device. Reference form: names an existing AVD (Android) / simulator (iOS) to reuse. If no device by this name exists, Doc Detective creates one under this name using `deviceType`/`osVersion` (or their defaults), provided the toolchain is installed (`doc-detective install android` or `doc-detective install ios`)."
566669
566669
  },
566670
566670
  deviceType: {
566671
566671
  type: "string",
@@ -566678,11 +566678,11 @@ var init_schemas = __esm({
566678
566678
  osVersion: {
566679
566679
  type: "string",
566680
566680
  minLength: 1,
566681
- description: "Platform version used when creating a device; must match an installed system image (install more with `doc-detective install android`). Ignored when `name` already matches an existing device. Default: the newest installed version."
566681
+ description: "Platform version used when creating a device; must match an installed image/runtime for the target platform (install more with `doc-detective install android` or `doc-detective install ios`). Ignored when `name` already matches an existing device. Default: the newest installed version."
566682
566682
  },
566683
566683
  headless: {
566684
566684
  type: "boolean",
566685
- description: "Run the Android emulator without a window. Ignored where not applicable."
566685
+ description: "Run the Android emulator without a window. No-op on iOS (simulators boot without the Simulator UI on CI) and ignored where not applicable."
566686
566686
  },
566687
566687
  orientation: {
566688
566688
  type: "string",
@@ -592845,6 +592845,20 @@ async function extractZip(zipPath, destDir) {
592845
592845
  throw new Error(`couldn't extract ${zipPath}: no working zip extractor found (${lastError?.message ?? lastError})`);
592846
592846
  }
592847
592847
 
592848
+ // dist/core/tests/mobileDevice.js
592849
+ function normalizeDeviceDescriptor({ contextDevice, stepDevice, platform }) {
592850
+ const asObj = (d) => typeof d === "string" ? { name: d.trim() } : d ? { ...d } : {};
592851
+ const ctx = asObj(contextDevice);
592852
+ const step = asObj(stepDevice);
592853
+ const merged = { ...ctx, ...step };
592854
+ for (const k of Object.keys(step)) {
592855
+ if (step[k] === void 0 && ctx[k] !== void 0)
592856
+ merged[k] = ctx[k];
592857
+ }
592858
+ merged.platform = step.platform ?? ctx.platform ?? platform;
592859
+ return merged;
592860
+ }
592861
+
592848
592862
  // dist/core/tests/androidEmulator.js
592849
592863
  function parseAdbDevices(text) {
592850
592864
  const out = [];
@@ -592875,18 +592889,6 @@ function parseAccelCheck({ code, text = "" }) {
592875
592889
  return false;
592876
592890
  return !/not installed|not usable|is not/i.test(text);
592877
592891
  }
592878
- function normalizeDeviceDescriptor({ contextDevice, stepDevice, platform }) {
592879
- const asObj = (d) => typeof d === "string" ? { name: d.trim() } : d ? { ...d } : {};
592880
- const ctx = asObj(contextDevice);
592881
- const step = asObj(stepDevice);
592882
- const merged = { ...ctx, ...step };
592883
- for (const k of Object.keys(step)) {
592884
- if (step[k] === void 0 && ctx[k] !== void 0)
592885
- merged[k] = ctx[k];
592886
- }
592887
- merged.platform = step.platform ?? ctx.platform ?? platform;
592888
- return merged;
592889
- }
592890
592892
  function udidForPort(port) {
592891
592893
  return `emulator-${port}`;
592892
592894
  }
@@ -593192,6 +593194,26 @@ function buildAcquireDeviceDeps(sdk, abi, log3) {
593192
593194
  };
593193
593195
  }
593194
593196
 
593197
+ // dist/core/tests/mobilePlatform.js
593198
+ function isMobileTargetPlatform(platform) {
593199
+ if (platform === "android" || platform === "ios")
593200
+ return platform;
593201
+ return null;
593202
+ }
593203
+ function mobileContextSkipReason({ platform }) {
593204
+ const roadmap = "docs/design/native-app-surfaces.md";
593205
+ if (platform === "ios") {
593206
+ return {
593207
+ level: "warning",
593208
+ reason: `Skipping context on 'ios': mobile browser testing on iOS lands in phase A5 of the native app roadmap (${roadmap}). Native iOS app tests run on capable macOS hosts.`
593209
+ };
593210
+ }
593211
+ return {
593212
+ level: "warning",
593213
+ reason: `Skipping context on 'android': mobile browser testing on Android lands in phase A5 of the native app roadmap (${roadmap}). Native Android app tests (no browser steps) run today.`
593214
+ };
593215
+ }
593216
+
593195
593217
  // dist/core/tests/appSurface.js
593196
593218
  init_validate();
593197
593219
  function classifyAppIdentifier(app) {
@@ -593368,6 +593390,9 @@ function buildUiAutomator2Locator(criteria) {
593368
593390
  const predicate = predicates.length ? `[${predicates.join(" and ")}]` : "";
593369
593391
  return { strategy: "xpath", value: `//${tag ?? "*"}${predicate}` };
593370
593392
  }
593393
+ function buildXCUITestLocator(criteria) {
593394
+ return buildAxLocator(criteria);
593395
+ }
593371
593396
  var DESKTOP_UNSUPPORTED_MOBILE_FIELDS = ["device", "install", "activity"].map((field) => ({
593372
593397
  field,
593373
593398
  isSet: (value) => value !== void 0,
@@ -593493,6 +593518,63 @@ var APP_DRIVER_PLATFORMS = {
593493
593518
  guidance: "A working directory is meaningless for an Android package launch."
593494
593519
  }
593495
593520
  ]
593521
+ },
593522
+ ios: {
593523
+ driverPackage: "appium-xcuitest-driver",
593524
+ driverLabel: "iOS app driver",
593525
+ platformName: "iOS",
593526
+ automationName: "XCUITest",
593527
+ buildLocator: (criteria) => buildXCUITestLocator(criteria),
593528
+ // iOS maps text/name through the same XCUI naming surface as macOS.
593529
+ nameFieldsCollide: true,
593530
+ buildCapabilities(descriptor, appId, extras) {
593531
+ const capabilities = {
593532
+ platformName: "iOS",
593533
+ "appium:automationName": "XCUITest",
593534
+ "appium:newCommandTimeout": 600,
593535
+ "wdio:enforceWebDriverClassic": true
593536
+ };
593537
+ if (classifyAppIdentifier(appId) === "id") {
593538
+ capabilities["appium:bundleId"] = appId;
593539
+ } else {
593540
+ capabilities["appium:app"] = import_node_path13.default.resolve(appId);
593541
+ }
593542
+ if (descriptor.install) {
593543
+ capabilities["appium:app"] = import_node_path13.default.resolve(descriptor.install);
593544
+ }
593545
+ if (extras?.udid)
593546
+ capabilities["appium:udid"] = extras.udid;
593547
+ const timeout = descriptor.timeout ?? 6e4;
593548
+ capabilities["appium:wdaLaunchTimeout"] = Math.max(timeout, 12e4);
593549
+ capabilities["appium:wdaConnectionTimeout"] = Math.max(timeout, 12e4);
593550
+ const derivedDataPath = process.env.DOC_DETECTIVE_IOS_WDA_DERIVED_DATA_PATH;
593551
+ if (derivedDataPath && derivedDataPath.trim()) {
593552
+ capabilities["appium:derivedDataPath"] = derivedDataPath.trim();
593553
+ }
593554
+ return capabilities;
593555
+ },
593556
+ unsupportedFields: [
593557
+ {
593558
+ field: "activity",
593559
+ isSet: (value) => value !== void 0,
593560
+ guidance: "`activity` is Android-only; iOS launches by bundle identifier or installed app payload."
593561
+ },
593562
+ {
593563
+ field: "args",
593564
+ isSet: (value) => Array.isArray(value) && value.length > 0,
593565
+ guidance: "The iOS driver does not honor desktop-style process arguments for AUT launch."
593566
+ },
593567
+ {
593568
+ field: "workingDirectory",
593569
+ isSet: (value) => value !== void 0 && value !== ".",
593570
+ guidance: "A working directory is not meaningful for iOS app launches."
593571
+ },
593572
+ {
593573
+ field: "env",
593574
+ isSet: (value) => value !== void 0,
593575
+ guidance: "Use driverOptions for iOS-specific launch controls; app environment overrides are not supported here."
593576
+ }
593577
+ ]
593496
593578
  }
593497
593579
  };
593498
593580
  var MAC_TCC_WALKTHROUGH = "Open System Settings \u2192 Privacy & Security \u2192 Accessibility and enable the app that launches Doc Detective (your terminal, IDE, or CI runner process), then rerun.";
@@ -593557,14 +593639,65 @@ async function probeMacAccessibility() {
593557
593639
  });
593558
593640
  });
593559
593641
  }
593642
+ function probeIosToolchain(deps = {}) {
593643
+ const platform = deps.platform ?? process.platform;
593644
+ const run = deps.run ?? ((command, args) => {
593645
+ const result = (0, import_node_child_process8.spawnSync)(command, args, {
593646
+ encoding: "utf8",
593647
+ windowsHide: true,
593648
+ // xcrun/simctl gets 2 minutes for the cold CoreSimulator warm-up;
593649
+ // xcode-select is a cheap path lookup.
593650
+ timeout: command === "xcrun" ? 12e4 : 15e3,
593651
+ maxBuffer: 32 * 1024 * 1024
593652
+ });
593653
+ return {
593654
+ status: result.status,
593655
+ stdout: typeof result.stdout === "string" ? result.stdout : "",
593656
+ stderr: typeof result.stderr === "string" ? result.stderr : ""
593657
+ };
593658
+ });
593659
+ if (platform !== "darwin") {
593660
+ return {
593661
+ ok: false,
593662
+ reason: "Skipping context on 'ios': iOS app surfaces require a macOS host with Xcode and Simulator tooling."
593663
+ };
593664
+ }
593665
+ const xcodeSelect = run("xcode-select", ["-p"]);
593666
+ if (xcodeSelect.status !== 0) {
593667
+ return {
593668
+ ok: false,
593669
+ reason: "Skipping context on 'ios': Xcode command-line tools are not configured. Install Xcode and run `xcode-select --install`."
593670
+ };
593671
+ }
593672
+ const developerDir = String(xcodeSelect.stdout ?? "").trim();
593673
+ const simctl = run("xcrun", ["simctl", "list", "devices", "available"]);
593674
+ if (simctl.status !== 0) {
593675
+ const detail = String(simctl.stderr ?? "").trim().split(/\r?\n/).filter(Boolean).pop() || (simctl.status === null ? "the command timed out" : `exit ${simctl.status}`);
593676
+ return {
593677
+ ok: false,
593678
+ reason: `Skipping context on 'ios': \`xcrun simctl\` is unavailable (developer dir: ${developerDir || "unset"}; ${detail}). If \`xcode-select -p\` points at CommandLineTools, run \`sudo xcode-select -s /Applications/Xcode.app\`; otherwise open Xcode once to finish simulator components and rerun.`
593679
+ };
593680
+ }
593681
+ return { ok: true };
593682
+ }
593560
593683
  async function appSurfacePreflight({ config, platform, deps = {} }) {
593561
593684
  const platformDriver = APP_DRIVER_PLATFORMS[platform];
593562
593685
  if (!platformDriver) {
593563
593686
  return {
593564
593687
  ok: false,
593565
- reason: `Skipping context on '${platform}': native app surfaces run on Windows and macOS in this phase. Gate the test with runOn platforms (["windows"] or ["mac"]) so this skip is intentional.`
593688
+ reason: `Skipping context on '${platform}': native app surfaces run on Windows, macOS, Android, and iOS in this phase. Gate the test with runOn platforms so this skip is intentional.`
593566
593689
  };
593567
593690
  }
593691
+ if (platform === "ios") {
593692
+ const probe = deps.probeIosToolchain ?? probeIosToolchain;
593693
+ const ios = probe();
593694
+ if (!ios.ok) {
593695
+ return {
593696
+ ok: false,
593697
+ reason: ios.reason
593698
+ };
593699
+ }
593700
+ }
593568
593701
  if (platform === "mac") {
593569
593702
  const probe = deps.probeAccessibility ?? probeMacAccessibility;
593570
593703
  let trusted = null;
@@ -593708,7 +593841,7 @@ async function startAppSurface({ config, step, appSession, platform, serverDeps
593708
593841
  const platformDriver = APP_DRIVER_PLATFORMS[platform];
593709
593842
  if (!platformDriver) {
593710
593843
  result.status = "FAIL";
593711
- result.description = `startSurface (app) runs on Windows and macOS desktops and Android emulators in this phase. Gate the test with runOn platforms (["windows"], ["mac"], or ["android"]).`;
593844
+ result.description = `startSurface (app) runs on Windows and macOS desktops plus Android and iOS mobile targets in this phase. Gate the test with runOn platforms (["windows"], ["mac"], ["android"], or ["ios"]).`;
593712
593845
  return result;
593713
593846
  }
593714
593847
  for (const { field, isSet, guidance } of platformDriver.unsupportedFields) {
@@ -593741,7 +593874,8 @@ async function startAppSurface({ config, step, appSession, platform, serverDeps
593741
593874
  }
593742
593875
  let driver;
593743
593876
  let deviceName;
593744
- if (platform === "android") {
593877
+ if (isMobileTargetPlatform(platform)) {
593878
+ const targetNoun = platform === "ios" ? "simulator" : "device";
593745
593879
  const desc = normalizeDeviceDescriptor({
593746
593880
  contextDevice: appSession.defaultDevice,
593747
593881
  stepDevice: descriptor.device,
@@ -593749,7 +593883,7 @@ async function startAppSurface({ config, step, appSession, platform, serverDeps
593749
593883
  });
593750
593884
  if (!serverDeps.acquireDevice) {
593751
593885
  result.status = "FAIL";
593752
- result.description = "Android app session is missing its device layer; this is a runner bug (runContext must wire serverDeps.acquireDevice).";
593886
+ result.description = `The ${platformDriver.driverLabel} session is missing its ${targetNoun} layer; this is a runner bug (runContext must wire serverDeps.acquireDevice).`;
593753
593887
  return result;
593754
593888
  }
593755
593889
  let acquired;
@@ -593757,12 +593891,12 @@ async function startAppSurface({ config, step, appSession, platform, serverDeps
593757
593891
  acquired = await serverDeps.acquireDevice(desc);
593758
593892
  } catch (error) {
593759
593893
  result.status = "FAIL";
593760
- result.description = `Couldn't acquire the Android device for "${appId}": ${error?.message ?? error}`;
593894
+ result.description = `Couldn't acquire the ${targetNoun} for "${appId}": ${error?.message ?? error}`;
593761
593895
  return result;
593762
593896
  }
593763
593897
  if ("skip" in acquired) {
593764
593898
  result.status = "FAIL";
593765
- result.description = `Couldn't acquire the Android device for "${appId}": ${acquired.skip}`;
593899
+ result.description = `Couldn't acquire the ${targetNoun} for "${appId}": ${acquired.skip}`;
593766
593900
  return result;
593767
593901
  }
593768
593902
  deviceName = acquired.entry.name;
@@ -593777,7 +593911,7 @@ async function startAppSurface({ config, step, appSession, platform, serverDeps
593777
593911
  driver = await serverDeps.startDriver(capabilities, appSession.server.port);
593778
593912
  } catch (error) {
593779
593913
  result.status = "FAIL";
593780
- result.description = `Couldn't launch app "${appId}" on the Android device "${deviceName}": ${error?.message ?? error}.`;
593914
+ result.description = `Couldn't launch app "${appId}" on the ${targetNoun} "${deviceName}": ${error?.message ?? error}.`;
593781
593915
  return result;
593782
593916
  }
593783
593917
  sessions.set(deviceName, {
@@ -593832,7 +593966,7 @@ async function startAppSurface({ config, step, appSession, platform, serverDeps
593832
593966
  platform
593833
593967
  });
593834
593968
  if (found.error) {
593835
- if (platform !== "android") {
593969
+ if (!isMobileTargetPlatform(platform)) {
593836
593970
  try {
593837
593971
  await driver.deleteSession();
593838
593972
  } catch {
@@ -598613,23 +598747,332 @@ async function closeSurface({ config, step, driver, processRegistry, appSession
598613
598747
  return result;
598614
598748
  }
598615
598749
 
598616
- // dist/core/tests/mobilePlatform.js
598617
- function isMobileTargetPlatform(platform) {
598618
- if (platform === "android" || platform === "ios")
598619
- return platform;
598620
- return null;
598750
+ // dist/core/tests/iosSimulator.js
598751
+ var import_node_child_process11 = require("node:child_process");
598752
+ function parseSimctlDevices(text) {
598753
+ let data;
598754
+ try {
598755
+ data = JSON.parse(String(text));
598756
+ } catch {
598757
+ return [];
598758
+ }
598759
+ const byRuntime = data?.devices;
598760
+ if (!byRuntime || typeof byRuntime !== "object")
598761
+ return [];
598762
+ const out = [];
598763
+ for (const [runtime, list] of Object.entries(byRuntime)) {
598764
+ if (!Array.isArray(list))
598765
+ continue;
598766
+ for (const d of list) {
598767
+ if (!d || typeof d.udid !== "string" || typeof d.name !== "string")
598768
+ continue;
598769
+ out.push({
598770
+ udid: d.udid,
598771
+ name: d.name,
598772
+ state: typeof d.state === "string" ? d.state : "Unknown",
598773
+ runtime,
598774
+ isAvailable: d.isAvailable !== false,
598775
+ deviceTypeIdentifier: typeof d.deviceTypeIdentifier === "string" ? d.deviceTypeIdentifier : void 0
598776
+ });
598777
+ }
598778
+ }
598779
+ return out;
598621
598780
  }
598622
- function mobileContextSkipReason({ platform, hasBrowserStep }) {
598623
- const roadmap = "docs/design/native-app-surfaces.md";
598624
- if (platform === "ios") {
598781
+ function parseSimctlRuntimes(text) {
598782
+ let data;
598783
+ try {
598784
+ data = JSON.parse(String(text));
598785
+ } catch {
598786
+ return [];
598787
+ }
598788
+ const list = data?.runtimes;
598789
+ if (!Array.isArray(list))
598790
+ return [];
598791
+ const out = [];
598792
+ for (const r of list) {
598793
+ if (!r || typeof r.identifier !== "string")
598794
+ continue;
598795
+ out.push({
598796
+ identifier: r.identifier,
598797
+ version: typeof r.version === "string" ? r.version : "",
598798
+ name: typeof r.name === "string" ? r.name : r.identifier,
598799
+ isAvailable: r.isAvailable !== false,
598800
+ platform: typeof r.platform === "string" ? r.platform : void 0
598801
+ });
598802
+ }
598803
+ return out;
598804
+ }
598805
+ function parseSimctlDeviceTypes(text) {
598806
+ let data;
598807
+ try {
598808
+ data = JSON.parse(String(text));
598809
+ } catch {
598810
+ return [];
598811
+ }
598812
+ const list = data?.devicetypes;
598813
+ if (!Array.isArray(list))
598814
+ return [];
598815
+ const out = [];
598816
+ for (const t of list) {
598817
+ if (!t || typeof t.identifier !== "string" || typeof t.name !== "string")
598818
+ continue;
598819
+ out.push({
598820
+ identifier: t.identifier,
598821
+ name: t.name,
598822
+ productFamily: typeof t.productFamily === "string" ? t.productFamily : void 0
598823
+ });
598824
+ }
598825
+ return out;
598826
+ }
598827
+ function compareVersions(a, b) {
598828
+ const pa = String(a).split(".").map((n) => parseInt(n, 10) || 0);
598829
+ const pb = String(b).split(".").map((n) => parseInt(n, 10) || 0);
598830
+ const len = Math.max(pa.length, pb.length);
598831
+ for (let i = 0; i < len; i++) {
598832
+ const d = (pa[i] ?? 0) - (pb[i] ?? 0);
598833
+ if (d !== 0)
598834
+ return d;
598835
+ }
598836
+ return 0;
598837
+ }
598838
+ function isIosRuntime(r) {
598839
+ if (r.platform)
598840
+ return r.platform === "iOS";
598841
+ return /\.iOS-/i.test(r.identifier) || /^iOS\b/i.test(r.name);
598842
+ }
598843
+ function newestRuntime(runtimes) {
598844
+ const ios = runtimes.filter((r) => r.isAvailable && isIosRuntime(r));
598845
+ if (!ios.length)
598846
+ return null;
598847
+ return ios.reduce((best, r) => compareVersions(r.version, best.version) > 0 ? r : best);
598848
+ }
598849
+ function productFamilyForDeviceType(deviceType) {
598850
+ return deviceType === "tablet" ? "iPad" : "iPhone";
598851
+ }
598852
+ function deviceTypeModelNumber(name) {
598853
+ const match = /\b(\d+)\b/.exec(name);
598854
+ return match ? parseInt(match[1], 10) : -1;
598855
+ }
598856
+ function newestDeviceType(deviceTypes, family) {
598857
+ const rank = (name) => {
598858
+ if (/pro max/i.test(name))
598859
+ return 3;
598860
+ if (/\bpro\b/i.test(name))
598861
+ return 2;
598862
+ if (/\bplus\b/i.test(name))
598863
+ return 1;
598864
+ return 0;
598865
+ };
598866
+ const candidates = deviceTypes.filter((t) => (t.productFamily ?? "").toLowerCase() === family.toLowerCase());
598867
+ if (!candidates.length)
598868
+ return null;
598869
+ return candidates.reduce((best, t) => {
598870
+ const dn = deviceTypeModelNumber(t.name) - deviceTypeModelNumber(best.name);
598871
+ if (dn !== 0)
598872
+ return dn > 0 ? t : best;
598873
+ return rank(t.name) > rank(best.name) ? t : best;
598874
+ });
598875
+ }
598876
+ function candidateDevices(desc, devices, runtimes) {
598877
+ const family = productFamilyForDeviceType(desc.deviceType);
598878
+ const iosRuntimes = new Set(runtimes.filter((r) => r.isAvailable && isIosRuntime(r)).map((r) => r.identifier));
598879
+ const versionOf = (runtimeId) => runtimes.find((r) => r.identifier === runtimeId)?.version ?? "";
598880
+ const familyRe = family === "iPad" ? /iPad/i : /iPhone|iPod/i;
598881
+ return devices.filter((d) => d.isAvailable !== false).filter((d) => iosRuntimes.has(d.runtime)).filter((d) => {
598882
+ if (!desc.osVersion)
598883
+ return true;
598884
+ return versionOf(d.runtime) === desc.osVersion;
598885
+ }).filter((d) => familyRe.test(d.deviceTypeIdentifier ?? "") || familyRe.test(d.name));
598886
+ }
598887
+ function planSimulatorAcquisition(desc, { devices, runtimes, deviceTypes }) {
598888
+ const versionOf = (runtimeId) => runtimes.find((r) => r.identifier === runtimeId)?.version ?? "";
598889
+ const newestOf = (list) => list.length ? list.reduce((best, d) => compareVersions(versionOf(d.runtime), versionOf(best.runtime)) > 0 ? d : best) : null;
598890
+ const isBooted = (d) => /^booted$/i.test(d.state);
598891
+ const iosRuntimeIds = new Set(runtimes.filter((r) => r.isAvailable && isIosRuntime(r)).map((r) => r.identifier));
598892
+ if (desc.name) {
598893
+ const named = devices.filter((d) => d.name === desc.name && d.isAvailable !== false && iosRuntimeIds.has(d.runtime));
598894
+ const booted2 = named.find(isBooted);
598895
+ if (booted2)
598896
+ return { action: "reuse-booted", name: desc.name, udid: booted2.udid };
598897
+ const existing2 = newestOf(named);
598898
+ if (existing2)
598899
+ return { action: "boot", name: desc.name, udid: existing2.udid };
598900
+ return planCreate(desc, runtimes, deviceTypes, devices, desc.name);
598901
+ }
598902
+ const candidates = candidateDevices(desc, devices, runtimes);
598903
+ const booted = candidates.find(isBooted);
598904
+ if (booted)
598905
+ return { action: "reuse-booted", name: booted.name, udid: booted.udid };
598906
+ const existing = newestOf(candidates);
598907
+ if (existing)
598908
+ return { action: "boot", name: existing.name, udid: existing.udid };
598909
+ return planCreate(desc, runtimes, deviceTypes, devices, defaultSimulatorName(desc));
598910
+ }
598911
+ function defaultSimulatorName(desc) {
598912
+ return desc.deviceType === "tablet" ? "doc-detective-ipad" : "doc-detective-iphone";
598913
+ }
598914
+ function planCreate(desc, runtimes, deviceTypes, devices, name) {
598915
+ const family = productFamilyForDeviceType(desc.deviceType);
598916
+ const available = runtimes.filter((r) => r.isAvailable && isIosRuntime(r));
598917
+ let runtime;
598918
+ if (desc.osVersion) {
598919
+ runtime = available.find((r) => r.version === desc.osVersion);
598920
+ } else {
598921
+ const warmedIds = new Set(devices.filter((d) => d.isAvailable !== false).map((d) => d.runtime));
598922
+ const warmed = available.filter((r) => warmedIds.has(r.identifier));
598923
+ runtime = (warmed.length ? newestRuntime(warmed) : null) ?? newestRuntime(available);
598924
+ }
598925
+ if (!runtime) {
598625
598926
  return {
598626
- level: "info",
598627
- reason: `Skipping context on 'ios': iOS app surfaces land in phase A4 of the native app roadmap (${roadmap}). Gate iOS tests with runOn platforms so this skip is intentional.`
598927
+ action: "skip",
598928
+ reason: desc.osVersion ? `Skipping context on 'ios': no installed iOS ${desc.osVersion} simulator runtime to create the "${name}" simulator. Install one via Xcode \u2192 Settings \u2192 Components (or \`xcodebuild -downloadPlatform iOS\`).` : `Skipping context on 'ios': no installed iOS simulator runtime is available. Open Xcode once (or run \`xcodebuild -downloadPlatform iOS\`) to install a simulator runtime, then rerun.`
598929
+ };
598930
+ }
598931
+ const deviceType = newestDeviceType(deviceTypes, family);
598932
+ if (!deviceType) {
598933
+ return {
598934
+ action: "skip",
598935
+ reason: `Skipping context on 'ios': no ${family} simulator device type is available to create the "${name}" simulator. Install the iOS platform components in Xcode and rerun.`
598628
598936
  };
598629
598937
  }
598630
598938
  return {
598631
- level: "warning",
598632
- reason: `Skipping context on 'android': mobile browser testing on Android lands in phase A5 of the native app roadmap (${roadmap}). Native Android app tests (no browser steps) run today.`
598939
+ action: "create-boot",
598940
+ name,
598941
+ deviceTypeId: deviceType.identifier,
598942
+ runtimeId: runtime.identifier
598943
+ };
598944
+ }
598945
+ function createSimulatorRegistry() {
598946
+ return /* @__PURE__ */ new Map();
598947
+ }
598948
+ async function acquireSimulator({ desc, registry, deps }) {
598949
+ if (desc.name) {
598950
+ const registered = registry.get(desc.name);
598951
+ if (registered) {
598952
+ const entry = registered.ready ? await registered.ready : registered;
598953
+ return { entry };
598954
+ }
598955
+ }
598956
+ const [devices, runtimes, deviceTypes] = await Promise.all([
598957
+ deps.listDevices(),
598958
+ deps.listRuntimes(),
598959
+ deps.listDeviceTypes()
598960
+ ]);
598961
+ const plan = planSimulatorAcquisition(desc, {
598962
+ devices,
598963
+ runtimes,
598964
+ deviceTypes
598965
+ });
598966
+ if (plan.action === "skip")
598967
+ return { skip: plan.reason };
598968
+ const existing = registry.get(plan.name);
598969
+ if (existing) {
598970
+ const entry = existing.ready ? await existing.ready : existing;
598971
+ return { entry };
598972
+ }
598973
+ if (plan.action === "reuse-booted") {
598974
+ const entry = {
598975
+ name: plan.name,
598976
+ udid: plan.udid,
598977
+ bootedByUs: false
598978
+ };
598979
+ registry.set(plan.name, entry);
598980
+ return { entry };
598981
+ }
598982
+ const placeholder = {
598983
+ name: plan.name,
598984
+ udid: plan.action === "boot" ? plan.udid : "",
598985
+ bootedByUs: true
598986
+ };
598987
+ const readyPromise = (async () => {
598988
+ if (plan.action === "create-boot") {
598989
+ deps.log?.(`Creating simulator "${plan.name}" (${plan.deviceTypeId} on ${plan.runtimeId}).`);
598990
+ const created = await deps.create({
598991
+ name: plan.name,
598992
+ deviceTypeId: plan.deviceTypeId,
598993
+ runtimeId: plan.runtimeId
598994
+ });
598995
+ placeholder.udid = created.udid;
598996
+ }
598997
+ deps.log?.(`Booting simulator "${plan.name}" (${placeholder.udid}).`);
598998
+ await deps.boot(placeholder.udid);
598999
+ return placeholder;
599000
+ })();
599001
+ placeholder.ready = readyPromise;
599002
+ registry.set(plan.name, placeholder);
599003
+ try {
599004
+ await readyPromise;
599005
+ } catch (error) {
599006
+ if (registry.get(plan.name) === placeholder)
599007
+ registry.delete(plan.name);
599008
+ throw error;
599009
+ }
599010
+ return { entry: placeholder };
599011
+ }
599012
+ async function teardownSimulatorRegistry(registry, shutdown) {
599013
+ for (const entry of registry.values()) {
599014
+ if (!entry.bootedByUs)
599015
+ continue;
599016
+ try {
599017
+ await shutdown(entry);
599018
+ } catch {
599019
+ }
599020
+ }
599021
+ registry.clear();
599022
+ }
599023
+ function runSimctl(args, timeout = 6e4) {
599024
+ return new Promise((resolve) => {
599025
+ (0, import_node_child_process11.execFile)("xcrun", ["simctl", ...args], { timeout, maxBuffer: 32 * 1024 * 1024 }, (error, stdout, stderr) => {
599026
+ resolve({
599027
+ // A timeout or spawn error sets no numeric `code` (it's null) — treat
599028
+ // that as a failure, not success, so a hung `simctl` doesn't look like
599029
+ // an empty-but-ok result to the boot/create callers.
599030
+ code: error ? typeof error.code === "number" ? error.code : 1 : 0,
599031
+ stdout: String(stdout ?? ""),
599032
+ stderr: String(stderr ?? "")
599033
+ });
599034
+ });
599035
+ });
599036
+ }
599037
+ async function realBootSimulator(udid, timeout = 3e5) {
599038
+ const boot = await runSimctl(["boot", udid], 6e4);
599039
+ if (boot.code !== 0 && !/current state: Booted/i.test(boot.stderr)) {
599040
+ throw new Error(`simctl boot ${udid} failed (code ${boot.code}): ${boot.stderr.trim()}`);
599041
+ }
599042
+ await runSimctl(["bootstatus", udid, "-b"], timeout);
599043
+ }
599044
+ async function realCreateSimulator({ name, deviceTypeId, runtimeId }) {
599045
+ const created = await runSimctl(["create", name, deviceTypeId, runtimeId]);
599046
+ if (created.code !== 0) {
599047
+ throw new Error(`simctl create "${name}" failed (code ${created.code}): ${created.stderr.trim()}`);
599048
+ }
599049
+ const udid = created.stdout.trim().split(/\r?\n/).pop()?.trim() ?? "";
599050
+ if (!udid) {
599051
+ throw new Error(`simctl create "${name}" returned no udid.`);
599052
+ }
599053
+ return { udid };
599054
+ }
599055
+ async function realShutdownSimulator(udid) {
599056
+ await runSimctl(["shutdown", udid], 3e4);
599057
+ }
599058
+ function buildAcquireSimulatorDeps(log3) {
599059
+ return {
599060
+ listDevices: async () => {
599061
+ const { stdout } = await runSimctl(["list", "devices", "--json"], 6e4);
599062
+ return parseSimctlDevices(stdout);
599063
+ },
599064
+ listRuntimes: async () => {
599065
+ const { stdout } = await runSimctl(["list", "runtimes", "--json"], 6e4);
599066
+ return parseSimctlRuntimes(stdout);
599067
+ },
599068
+ listDeviceTypes: async () => {
599069
+ const { stdout } = await runSimctl(["list", "devicetypes", "--json"], 6e4);
599070
+ return parseSimctlDeviceTypes(stdout);
599071
+ },
599072
+ create: realCreateSimulator,
599073
+ boot: realBootSimulator,
599074
+ shutdown: (entry) => realShutdownSimulator(entry.udid),
599075
+ log: log3
598633
599076
  };
598634
599077
  }
598635
599078
 
@@ -598908,7 +599351,7 @@ async function dragAndDropElement({ config, step, driver }) {
598908
599351
 
598909
599352
  // dist/core/tests.js
598910
599353
  var import_node_path23 = __toESM(require("node:path"), 1);
598911
- var import_node_child_process11 = require("node:child_process");
599354
+ var import_node_child_process12 = require("node:child_process");
598912
599355
  var import_node_crypto7 = require("node:crypto");
598913
599356
  init_appium();
598914
599357
  init_config();
@@ -599274,8 +599717,7 @@ async function androidContextPreflight({ config, context, clog }) {
599274
599717
  const hasBrowserStep = isBrowserRequired({ test: context });
599275
599718
  if (hasBrowserStep) {
599276
599719
  const { level, reason } = mobileContextSkipReason({
599277
- platform: "android",
599278
- hasBrowserStep
599720
+ platform: "android"
599279
599721
  });
599280
599722
  return { ok: false, level, reason };
599281
599723
  }
@@ -599401,6 +599843,50 @@ async function androidContextPreflight({ config, context, clog }) {
599401
599843
  };
599402
599844
  }
599403
599845
  }
599846
+ async function iosContextPreflight({ config, context }) {
599847
+ const hasBrowserStep = isBrowserRequired({ test: context });
599848
+ if (hasBrowserStep) {
599849
+ const { level, reason } = mobileContextSkipReason({
599850
+ platform: "ios"
599851
+ });
599852
+ return { ok: false, level, reason };
599853
+ }
599854
+ const pre = await appSurfacePreflight({ config, platform: "ios" });
599855
+ if (!pre.ok)
599856
+ return { ok: false, level: "info", reason: pre.reason };
599857
+ const simulatorDeps = buildAcquireSimulatorDeps((m) => log(config, "debug", m));
599858
+ try {
599859
+ const desc = normalizeDeviceDescriptor({
599860
+ contextDevice: context.device,
599861
+ platform: "ios"
599862
+ });
599863
+ const [devices, runtimes, deviceTypes] = await Promise.all([
599864
+ simulatorDeps.listDevices(),
599865
+ simulatorDeps.listRuntimes(),
599866
+ simulatorDeps.listDeviceTypes()
599867
+ ]);
599868
+ const plan = planSimulatorAcquisition(desc, {
599869
+ devices,
599870
+ runtimes,
599871
+ deviceTypes
599872
+ });
599873
+ if (plan.action === "skip") {
599874
+ return { ok: false, level: "info", reason: plan.reason };
599875
+ }
599876
+ } catch (error) {
599877
+ return {
599878
+ ok: false,
599879
+ level: "info",
599880
+ reason: `Skipping context on 'ios': couldn't probe the iOS simulator environment (${error?.message ?? error}). Check Xcode / simctl, or run \`doc-detective install ios --yes\`.`
599881
+ };
599882
+ }
599883
+ return {
599884
+ ok: true,
599885
+ appiumEntry: pre.appiumEntry,
599886
+ appiumHome: pre.appiumHome,
599887
+ simulatorDeps
599888
+ };
599889
+ }
599404
599890
  function getDefaultBrowser({ runnerDetails }) {
599405
599891
  let browser = {};
599406
599892
  const browserNames = ["firefox", "chrome", "safari"];
@@ -599817,6 +600303,7 @@ async function runSpecs({ resolvedTests }) {
599817
600303
  }
599818
600304
  const processRegistry = /* @__PURE__ */ new Map();
599819
600305
  const deviceRegistry = createDeviceRegistry();
600306
+ const simulatorRegistry = createSimulatorRegistry();
599820
600307
  const killAllRegistered = async () => {
599821
600308
  const entries = [...processRegistry.entries()];
599822
600309
  processRegistry.clear();
@@ -599878,6 +600365,7 @@ async function runSpecs({ resolvedTests }) {
599878
600365
  warmUpResults,
599879
600366
  processRegistry,
599880
600367
  deviceRegistry,
600368
+ simulatorRegistry,
599881
600369
  logPrefix: limit > 1 ? `[${job.test.testId}/${job.context.contextId}]` : ""
599882
600370
  });
599883
600371
  } catch (error) {
@@ -599933,6 +600421,7 @@ async function runSpecs({ resolvedTests }) {
599933
600421
  warmUpResults,
599934
600422
  processRegistry,
599935
600423
  deviceRegistry,
600424
+ simulatorRegistry,
599936
600425
  platform,
599937
600426
  markAutoRecord,
599938
600427
  limit,
@@ -599975,6 +600464,13 @@ async function runSpecs({ resolvedTests }) {
599975
600464
  await killTree(entry.process?.pid);
599976
600465
  });
599977
600466
  }
600467
+ if (simulatorRegistry.size > 0) {
600468
+ const simDeps = buildAcquireSimulatorDeps();
600469
+ await teardownSimulatorRegistry(simulatorRegistry, async (entry) => {
600470
+ log(config, "debug", `Shutting down simulator "${entry.name}" (${entry.udid}).`);
600471
+ await simDeps.shutdown(entry);
600472
+ });
600473
+ }
599978
600474
  process.off("SIGINT", onSignal);
599979
600475
  process.off("SIGTERM", onSignal);
599980
600476
  }
@@ -600001,7 +600497,7 @@ async function runSpecs({ resolvedTests }) {
600001
600497
  }
600002
600498
  return report;
600003
600499
  }
600004
- async function runRoutedSpec({ spec, specReport, specGuardSkip, config, runnerDetails, appiumPool, portToDisplay, metaValues, installAttempts, warmUpResults, processRegistry, deviceRegistry, platform, markAutoRecord, limit, resourceRegistry, exclusivityCtx }) {
600500
+ async function runRoutedSpec({ spec, specReport, specGuardSkip, config, runnerDetails, appiumPool, portToDisplay, metaValues, installAttempts, warmUpResults, processRegistry, deviceRegistry, simulatorRegistry, platform, markAutoRecord, limit, resourceRegistry, exclusivityCtx }) {
600005
600501
  let stopRest = false;
600006
600502
  let warnedRunStop = false;
600007
600503
  const indexByTestId = /* @__PURE__ */ new Map();
@@ -600117,6 +600613,7 @@ async function runRoutedSpec({ spec, specReport, specGuardSkip, config, runnerDe
600117
600613
  warmUpResults,
600118
600614
  processRegistry,
600119
600615
  deviceRegistry,
600616
+ simulatorRegistry,
600120
600617
  logPrefix: limit > 1 ? `[${job.test.testId}/${job.context.contextId}]` : ""
600121
600618
  });
600122
600619
  } catch (error) {
@@ -600443,7 +600940,7 @@ async function captureAutoScreenshot({ config, driver, spec, test, context, step
600443
600940
  return null;
600444
600941
  }
600445
600942
  }
600446
- async function runContext({ config, spec, test, context, runnerDetails, appiumPool, portToDisplay, metaValues, installAttempts, warmUpResults, processRegistry, deviceRegistry, logPrefix = "" }) {
600943
+ async function runContext({ config, spec, test, context, runnerDetails, appiumPool, portToDisplay, metaValues, installAttempts, warmUpResults, processRegistry, deviceRegistry, simulatorRegistry, logPrefix = "" }) {
600447
600944
  const platform = runnerDetails.environment.platform;
600448
600945
  let availableApps = runnerDetails.availableApps;
600449
600946
  const clog = (level, message) => log(config, level, logPrefix && typeof message === "string" ? `${logPrefix} ${message}` : message);
@@ -600478,30 +600975,40 @@ async function runContext({ config, spec, test, context, runnerDetails, appiumPo
600478
600975
  contextReport.resultDescription = requirementsSkip;
600479
600976
  return contextReport;
600480
600977
  }
600481
- if (mobileTarget === "ios") {
600482
- const { level, reason } = mobileContextSkipReason({ platform: "ios" });
600483
- clog(level, reason);
600484
- contextReport.result = "SKIPPED";
600485
- contextReport.resultDescription = reason;
600486
- return contextReport;
600487
- }
600488
- const pre = await androidContextPreflight({ config, context, clog });
600489
- if (!pre.ok) {
600490
- clog(pre.level, pre.reason);
600491
- contextReport.result = "SKIPPED";
600492
- contextReport.resultDescription = pre.reason;
600493
- return contextReport;
600978
+ if (mobileTarget === "android") {
600979
+ const pre = await androidContextPreflight({ config, context, clog });
600980
+ if (!pre.ok) {
600981
+ clog(pre.level, pre.reason);
600982
+ contextReport.result = "SKIPPED";
600983
+ contextReport.resultDescription = pre.reason;
600984
+ return contextReport;
600985
+ }
600986
+ appSession = createAppSessionState();
600987
+ appSession.appiumEntry = pre.appiumEntry;
600988
+ appSession.appiumHome = pre.appiumHome;
600989
+ appSession.defaultDevice = context.device;
600990
+ appSession.androidSdkRoot = pre.sdkRoot;
600991
+ appSession.androidDeviceRegistry = deviceRegistry;
600992
+ appSession.androidDeviceDeps = pre.deviceDeps;
600993
+ contextReport.device = context.device ?? { platform: "android" };
600994
+ if (pre.warnings.length)
600995
+ contextReport.warnings = pre.warnings;
600996
+ } else {
600997
+ const pre = await iosContextPreflight({ config, context });
600998
+ if (!pre.ok) {
600999
+ clog(pre.level, pre.reason);
601000
+ contextReport.result = "SKIPPED";
601001
+ contextReport.resultDescription = pre.reason;
601002
+ return contextReport;
601003
+ }
601004
+ appSession = createAppSessionState();
601005
+ appSession.appiumEntry = pre.appiumEntry;
601006
+ appSession.appiumHome = pre.appiumHome;
601007
+ appSession.defaultDevice = context.device;
601008
+ appSession.iosSimulatorRegistry = simulatorRegistry;
601009
+ appSession.iosSimulatorDeps = pre.simulatorDeps;
601010
+ contextReport.device = context.device ?? { platform: "ios" };
600494
601011
  }
600495
- appSession = createAppSessionState();
600496
- appSession.appiumEntry = pre.appiumEntry;
600497
- appSession.appiumHome = pre.appiumHome;
600498
- appSession.defaultDevice = context.device;
600499
- appSession.androidSdkRoot = pre.sdkRoot;
600500
- appSession.androidDeviceRegistry = deviceRegistry;
600501
- appSession.androidDeviceDeps = pre.deviceDeps;
600502
- contextReport.device = context.device ?? { platform: "android" };
600503
- if (pre.warnings.length)
600504
- contextReport.warnings = pre.warnings;
600505
601012
  }
600506
601013
  if (context.platform === platform) {
600507
601014
  const requirementsSkip = contextRequirementsSkipMessage({ context });
@@ -601206,15 +601713,22 @@ async function runStep({ config = {}, context = {}, step, driver, metaValues = {
601206
601713
  return { port: server.port, process: server.process };
601207
601714
  },
601208
601715
  startDriver: (capabilities, port) => driverStart(capabilities, port, 2, { cacheDir: config?.cacheDir }),
601209
- // Android device acquisition (boot/create-and-boot, or reuse),
601210
- // bound to the run-level registry stashed on the app session. Only
601211
- // set for android app sessions (which only exist on a capable host).
601716
+ // Mobile device acquisition (boot/create-and-boot, or reuse), bound
601717
+ // to the run-level registry stashed on the app session. Android uses
601718
+ // the emulator layer; iOS uses the simctl simulator layer. Both
601719
+ // return the same { entry:{name,udid} } | { skip } shape, so
601720
+ // startAppSurface's mobile branch stays uniform. Only set for a
601721
+ // mobile app session (which only exists on a capable host).
601212
601722
  /* c8 ignore start */
601213
601723
  acquireDevice: appSession?.androidDeviceDeps ? (desc) => acquireDevice({
601214
601724
  desc,
601215
601725
  registry: appSession.androidDeviceRegistry,
601216
601726
  sdkRoot: appSession.androidSdkRoot,
601217
601727
  deps: appSession.androidDeviceDeps
601728
+ }) : appSession?.iosSimulatorDeps ? (desc) => acquireSimulator({
601729
+ desc,
601730
+ registry: appSession.iosSimulatorRegistry,
601731
+ deps: appSession.iosSimulatorDeps
601218
601732
  }) : void 0
601219
601733
  /* c8 ignore stop */
601220
601734
  }
@@ -601283,7 +601797,7 @@ async function startAppiumServer(appiumEntry, config, display, extraEnv) {
601283
601797
  ...display ? { DISPLAY: display } : {},
601284
601798
  ...extraEnv ?? {}
601285
601799
  } : process.env;
601286
- const proc = (0, import_node_child_process11.spawn)(process.execPath, [appiumEntry, "-a", "127.0.0.1", "-p", String(port)], {
601800
+ const proc = (0, import_node_child_process12.spawn)(process.execPath, [appiumEntry, "-a", "127.0.0.1", "-p", String(port)], {
601287
601801
  windowsHide: true,
601288
601802
  cwd: import_node_path23.default.join(__dirname5, "../.."),
601289
601803
  env
@@ -601324,6 +601838,7 @@ async function appiumIsReady(port, timeoutMs = 12e4) {
601324
601838
  async function driverStart(capabilities, port, maxAttempts = 4, ctx = {}) {
601325
601839
  const TRANSIENT = /ECONNREFUSED|ECONNRESET|socket hang up|could not proxy command|crashed during startup|cannot connect to|DevToolsActivePort|session not created/i;
601326
601840
  const wdio = await loadHeavyDep("webdriverio", { ctx });
601841
+ const startupCeiling = Math.max(12e4, Number(capabilities?.["appium:wdaLaunchTimeout"]) || 0, Number(capabilities?.["appium:wdaConnectionTimeout"]) || 0, Number(capabilities?.["appium:serverStartupTimeout"]) || 0);
601327
601842
  let lastError;
601328
601843
  for (let attempt = 1; attempt <= maxAttempts; attempt++) {
601329
601844
  try {
@@ -601334,8 +601849,7 @@ async function driverStart(capabilities, port, maxAttempts = 4, ctx = {}) {
601334
601849
  path: "/",
601335
601850
  logLevel: "error",
601336
601851
  capabilities,
601337
- connectionRetryTimeout: 12e4,
601338
- // 2 minutes
601852
+ connectionRetryTimeout: startupCeiling,
601339
601853
  waitforTimeout: 12e4
601340
601854
  // 2 minutes
601341
601855
  });
@@ -601430,7 +601944,7 @@ async function getRunner(options = {}) {
601430
601944
  if (!appiumEntry) {
601431
601945
  throw new Error("appium is not installed. Run `doc-detective install runtime appium` to install it.");
601432
601946
  }
601433
- const appium = (0, import_node_child_process11.spawn)(process.execPath, [appiumEntry, "-a", "127.0.0.1", "-p", String(appiumPort)], {
601947
+ const appium = (0, import_node_child_process12.spawn)(process.execPath, [appiumEntry, "-a", "127.0.0.1", "-p", String(appiumPort)], {
601434
601948
  windowsHide: true,
601435
601949
  cwd: import_node_path23.default.join(__dirname5, "../..")
601436
601950
  });