stim 1.29.0 → 1.30.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 (124) hide show
  1. package/dist/{acquire-artifact-C2DKfenN.mjs → acquire-artifact-CrZ4rEbI.mjs} +1 -1
  2. package/dist/{act-CrTcskiE.mjs → act-BaKjDWGw.mjs} +12 -12
  3. package/dist/{activity-BR5oHSO5.mjs → activity-BTaUf0tc.mjs} +2 -2
  4. package/dist/{agent-device-usage-output-W0x4SoC7.mjs → agent-device-usage-output-DYBpO17K.mjs} +3 -3
  5. package/dist/{android-BPmCmyAy.mjs → android-BCYLwmH6.mjs} +5 -5
  6. package/dist/{android-CLU_MMnb.mjs → android-BEQUDpOg.mjs} +1 -1
  7. package/dist/{android-l616dRP1.mjs → android-BWqdDK6R.mjs} +36 -34
  8. package/dist/{android-BHKgeOuq.mjs → android-DdKG6lyD.mjs} +39 -30
  9. package/dist/api.mjs +21 -21
  10. package/dist/{apk-signed-tail-B-wKoF_8.mjs → apk-signed-tail-B8kw4a8K.mjs} +1 -1
  11. package/dist/{artifact-Dm9ScLrh.mjs → artifact-DTHXcmQ3.mjs} +11 -11
  12. package/dist/{artifact-DHuFYfhD.mjs → artifact-M6W2l-xh.mjs} +11 -11
  13. package/dist/{auto-placement-C8sJsyMN.mjs → auto-placement-CZaWDmcY.mjs} +8 -8
  14. package/dist/{browser-web-_tQTbQUs.mjs → browser-web-JQ7lFej3.mjs} +5 -5
  15. package/dist/{build-DtCU9Kim.mjs → build-C2ZWoCmg.mjs} +18 -18
  16. package/dist/{build-cache-BGwTsIEa.mjs → build-cache-DlC3owap.mjs} +1 -1
  17. package/dist/{build-plan-CWyjMPKo.mjs → build-plan-J3iRR3gI.mjs} +5 -5
  18. package/dist/{ccache-DsDkdP72.mjs → ccache-B8gY50-h.mjs} +11 -11
  19. package/dist/{cli-3fjOg-Oc.mjs → cli-xRPXJPtA.mjs} +17 -17
  20. package/dist/cli.mjs +1 -1
  21. package/dist/{client-BTUH8TF1.mjs → client-DrHykA24.mjs} +3 -3
  22. package/dist/collector-run.mjs +1 -1
  23. package/dist/{command-output-DjCsmzLZ.mjs → command-output-BBW8eWPL.mjs} +1 -1
  24. package/dist/{dependencies-CHNqX6Pr.mjs → dependencies-vUh9mp5z.mjs} +31 -30
  25. package/dist/{dev-client-CROrxj1x.mjs → dev-client-CASgAOu7.mjs} +2 -2
  26. package/dist/device-ChnO7bR9.mjs +761 -0
  27. package/dist/device-CsIdRXfm.mjs +175 -0
  28. package/dist/{device-Bmm5qjM-.mjs → device-android-CcdQqQWg.mjs} +26 -193
  29. package/dist/{device-capacity-B2ChA-bz.mjs → device-capacity-C5C_jOQd.mjs} +9 -9
  30. package/dist/device-host-worker.mjs +40 -31
  31. package/dist/{device-ios-CYzivd31.mjs → device-ios-DbmtPIiw.mjs} +24 -14
  32. package/dist/{device-lease-run-qRq_2W2V.mjs → device-lease-run-Do6zYA7y.mjs} +3 -3
  33. package/dist/{device-pool-CrmiE4_x.mjs → device-pool-CpoYiCGO.mjs} +2 -2
  34. package/dist/{device-provision-CK2XiEp1.mjs → device-provision-B5Ms94qY.mjs} +6 -6
  35. package/dist/{doctor-Dr3C1iXV.mjs → doctor-CJSB5q-s.mjs} +14 -14
  36. package/dist/{doctor-Cp4-HN1f.mjs → doctor-CLE4AZEI.mjs} +12 -12
  37. package/dist/{doctor-BO_kaFWX.mjs → doctor-CpfbYh3Q.mjs} +1 -1
  38. package/dist/doctor-fingerprint.mjs +1 -1
  39. package/dist/{doctor-watchman-CJr2aXXv.mjs → doctor-watchman-D1IyMle9.mjs} +2 -2
  40. package/dist/{eas-build-D-9HmGZS.mjs → eas-build-DIDOHw2P.mjs} +2 -2
  41. package/dist/{eas-fallback-Cemt2GVL.mjs → eas-fallback-DVS9oBSc.mjs} +2 -2
  42. package/dist/{eas-session-ledger-B0KLZx5m.mjs → eas-session-ledger-CW3l-inB.mjs} +1 -1
  43. package/dist/{error-diagnostics-CV_1RoEH.mjs → error-diagnostics-XJ9eWdtq.mjs} +5 -5
  44. package/dist/{gc-DjXwQXHK.mjs → gc-BVIcxCxE.mjs} +2 -2
  45. package/dist/{gc-CKHqL4aS.mjs → gc-Co7PE36D.mjs} +13 -13
  46. package/dist/{guide-CeRlWVsS.mjs → guide-DkepBgHT.mjs} +110 -13
  47. package/dist/{hosted-android-DI_vvv7U.mjs → hosted-android-Du7NxufJ.mjs} +2 -2
  48. package/dist/{hosted-client-CgoxdU9j.mjs → hosted-client-Cect92SZ.mjs} +2 -2
  49. package/dist/{hosted-logs-C-4INmkn.mjs → hosted-logs-Opcjv1Lr.mjs} +3 -3
  50. package/dist/{hosted-logs-sync-Bf5s02fi.mjs → hosted-logs-sync-wsI7N1Hv.mjs} +6 -10
  51. package/dist/{hosted-macos-Doh85YUM.mjs → hosted-macos-BP9Kucat.mjs} +4 -4
  52. package/dist/{hosted-native-DvZENAL-.mjs → hosted-native-DmdLSmvu.mjs} +6 -5
  53. package/dist/{idle-shutdown-BM37gMfU.mjs → idle-shutdown-BcMN_cLm.mjs} +4 -4
  54. package/dist/{ios-CNDH6fNF.mjs → ios-BFkBHuRT.mjs} +8 -8
  55. package/dist/{ios-UM_dManb.mjs → ios-CG0IsLtt.mjs} +24 -24
  56. package/dist/{ios-CoMCWfub.mjs → ios-CXnoVO_z.mjs} +2 -2
  57. package/dist/{ios-device-L1-pota_.mjs → ios-device-ClSfuu-_.mjs} +1 -1
  58. package/dist/{ios-project-DJYptOCh.mjs → ios-project-BM9TbTE7.mjs} +5 -5
  59. package/dist/{js-swap-BthE4kZC.mjs → js-swap-9Rx-5Nqz.mjs} +3 -3
  60. package/dist/{launch-D798aSm8.mjs → launch-DvJV1Mx4.mjs} +14 -14
  61. package/dist/{lightened-vSxkstg6.mjs → lightened-23pqe7LS.mjs} +2 -2
  62. package/dist/{logs-BND8MiBq.mjs → logs-DJgZlf2K.mjs} +5 -5
  63. package/dist/{logs-CilPftm3.mjs → logs-Pkeh3wZk.mjs} +5 -4
  64. package/dist/{macos-CxUi9xcE.mjs → macos-DPvPQadc.mjs} +15 -15
  65. package/dist/{macos-BOQrKYeJ.mjs → macos-Du07NsOB.mjs} +1 -1
  66. package/dist/maintenance-run.mjs +4 -4
  67. package/dist/{native-android-BkhrCjdX.mjs → native-android-CBOM1_gB.mjs} +12 -12
  68. package/dist/{native-gradle-artifact-inputs-Cw4P6Gyr.mjs → native-gradle-artifact-inputs-D_iAfPuS.mjs} +3 -3
  69. package/dist/{native-runtime-DyH2gkXK.mjs → native-runtime-D4cTwU0Z.mjs} +3 -3
  70. package/dist/{native-xcode-inputs-DV8jr3kJ.mjs → native-xcode-inputs-BF-ogSnG.mjs} +1 -1
  71. package/dist/{native-xcode-ios-DdpPG2iT.mjs → native-xcode-ios-DwJBfMP6.mjs} +12 -12
  72. package/dist/offload-worker.mjs +15 -15
  73. package/dist/{phone-reverses-DZRad8HT.mjs → phone-reverses-CvhhkGMH.mjs} +2 -2
  74. package/dist/{placement-log-CoN6xrjY.mjs → placement-log-CRR_TE1r.mjs} +1 -1
  75. package/dist/{plan-placement-7sHuqR-r.mjs → plan-placement-CdLc-pTb.mjs} +4 -4
  76. package/dist/{ports-VQSAPZhl.mjs → ports-g4N_cfyg.mjs} +1 -1
  77. package/dist/{prebuild-Bqp0LFGN.mjs → prebuild-DBJMhwSS.mjs} +6 -6
  78. package/dist/{project-D1n0K4yg.mjs → project-DPQjnpcI.mjs} +11 -11
  79. package/dist/{react-native-android-FQ-yX3Mv.mjs → react-native-android-idMWOwkX.mjs} +21 -21
  80. package/dist/{react-native-build-D58bIqV9.mjs → react-native-build-BSoh4HkH.mjs} +5 -5
  81. package/dist/{react-native-doctor-AkUH2aca.mjs → react-native-doctor-CYibY8-4.mjs} +8 -7
  82. package/dist/{react-native-ios-Dmsv8j7T.mjs → react-native-ios-13KIIOOy.mjs} +15 -14
  83. package/dist/{reload-CDKEzzaf.mjs → reload-B9DZOjcV.mjs} +1 -1
  84. package/dist/{reload-BV0nD-k9.mjs → reload-BUQI3dSu.mjs} +8 -8
  85. package/dist/{remote-C8xyslUa.mjs → remote-C-RGHhAP.mjs} +6 -6
  86. package/dist/{result-9fqcJ90W.mjs → result-W4HCum4A.mjs} +11 -11
  87. package/dist/{selection-D1ZDzHFX.mjs → selection-PCMT97XD.mjs} +1 -1
  88. package/dist/{server-command-RlS-Kl4a.mjs → server-command-oqi3TDy7.mjs} +2 -2
  89. package/dist/server-expo-BUFAq2In.mjs +2 -0
  90. package/dist/{server-expo-bB1VV2k-.mjs → server-expo-C1K07shx.mjs} +1 -1
  91. package/dist/{settings-BcVCcAT5.mjs → settings-CKlMOmhj.mjs} +2 -2
  92. package/dist/{settings-payload-_aatELz2.mjs → settings-payload-CE-NZ6Lq.mjs} +1 -1
  93. package/dist/{settings-write-CkTVGQ4O.mjs → settings-write-D7Xwa_-M.mjs} +2 -2
  94. package/dist/{slot-launch-Dbgfh8gc.mjs → slot-launch-CeIK1iUI.mjs} +4 -4
  95. package/dist/{stage-BuHuRj1y.mjs → stage-Blqe6bWb.mjs} +1 -1
  96. package/dist/{start-Dlv4XXTP.mjs → start-B7J5a9nS.mjs} +5 -5
  97. package/dist/{start-Cr-c3Xhq.mjs → start-CvP2pJjc.mjs} +1 -1
  98. package/dist/{stats-D5c-uIBp.mjs → stats-Uo7l8OAk.mjs} +3 -3
  99. package/dist/{status-DbQv--Yb.mjs → status-CqJI1TgG.mjs} +1 -1
  100. package/dist/{status-D6PBK6_-.mjs → status-_rWXFSO7.mjs} +15 -15
  101. package/dist/{status-watch-okrpea4i.mjs → status-watch-CnSyXUmj.mjs} +3 -3
  102. package/dist/status-worker.mjs +1 -1
  103. package/dist/{stop-CHtAiv79.mjs → stop-Bogo9oO2.mjs} +2 -2
  104. package/dist/{stop-uRQ-zYcl.mjs → stop-CMVfaA-6.mjs} +2 -2
  105. package/dist/{stop-p9uSKuGE.mjs → stop-CnF9ixYe.mjs} +10 -10
  106. package/dist/supervisor-run.mjs +9 -9
  107. package/dist/{support-PFyTkrnr.mjs → support-BGqpYMV8.mjs} +15 -11
  108. package/dist/{support-BMpQIug0.mjs → support-DUevTPur.mjs} +7 -7
  109. package/dist/{swiftpm-artifact-inputs-Cddq6jN2.mjs → swiftpm-artifact-inputs-BcJk6-3u.mjs} +1 -1
  110. package/dist/{swiftpm-macos-BSj9iZlI.mjs → swiftpm-macos-DBrmoocG.mjs} +4 -4
  111. package/dist/toolchain-Cw9VVHOY.mjs +2 -0
  112. package/dist/{toolchain-CLGnEUgT.mjs → toolchain-DLdoyxIt.mjs} +18 -10
  113. package/dist/{warm-progress--KkkBBaq.mjs → warm-progress-DQ2wQZKp.mjs} +1 -1
  114. package/dist/web-CI_qCRPw.mjs +2 -0
  115. package/dist/{web-xlVssjQf.mjs → web-g9U7L1sR.mjs} +3 -3
  116. package/dist/web-run.mjs +2 -2
  117. package/dist/{workspaces-CvSYD_78.mjs → workspaces-7_RWoi6c.mjs} +4 -4
  118. package/dist/{worktree-DTOIohFe.mjs → worktree-DEet9H3p.mjs} +1 -1
  119. package/dist/{worktree-CaQBf6kh.mjs → worktree-qKJ3x07S.mjs} +13 -13
  120. package/package.json +7 -7
  121. package/dist/device-BvpasThQ.mjs +0 -297
  122. package/dist/server-expo-BVV9qy31.mjs +0 -2
  123. package/dist/toolchain-B-mzR9Rh.mjs +0 -2
  124. package/dist/web-BxSo493O.mjs +0 -2
@@ -1,8 +1,8 @@
1
1
  import { t as ANDROID_AVD_CONFIG_HELP } from "./settings-D776ygML.mjs";
2
- import { i as findProjectRoot$1 } from "./project-D1n0K4yg.mjs";
3
- import { h as RECENT_LAUNCH_MS } from "./eas-session-ledger-B0KLZx5m.mjs";
4
- import { o as guideStatus, t as WATCHMAN_NESTED_WORKTREES } from "./doctor-watchman-CJr2aXXv.mjs";
5
- import "./status-watch-okrpea4i.mjs";
2
+ import { i as findProjectRoot$1 } from "./project-DPQjnpcI.mjs";
3
+ import { h as RECENT_LAUNCH_MS } from "./eas-session-ledger-CW3l-inB.mjs";
4
+ import { o as guideStatus, t as WATCHMAN_NESTED_WORKTREES } from "./doctor-watchman-D1IyMle9.mjs";
5
+ import "./status-watch-CnSyXUmj.mjs";
6
6
  import { SETTINGS, SETTINGS_SCHEMA_URL, TUTORIAL_VERSION } from "@stim-cli/core/state";
7
7
  import chalk from "chalk";
8
8
  //#region src/guide/agent.ts
@@ -418,6 +418,7 @@ FULL TOPIC LIST
418
418
  stim guide lifecycle budget # disk and memory budgets, automatic reclaim
419
419
  stim guide lifecycle options # every flag, Android variants, --device-type, --system-image, --device-profile
420
420
  stim guide lifecycle devices # ios --device and android --device on a physical phone
421
+ stim guide lifecycle tools # device location|permission|push|network on the owned simulator or emulator
421
422
  stim guide lifecycle release # Release configurations and ...Release variants
422
423
  stim guide api # typed run, stop, diagnostics and cancellation from the main package
423
424
  stim guide facts # the --json payloads
@@ -703,7 +704,7 @@ Do not point independent Stim homes at a concurrently writable shared cache.
703
704
  //#endregion
704
705
  //#region src/guide/facts.ts
705
706
  const facts = {
706
- summary: "The --json payloads: `start`, `ios`, `android`, `web`, `ios|android --plan`, `reload`, `stop`, `status`, `doctor`, `device lock`/`unlock`, `gc`, and the error contract",
707
+ summary: "The --json payloads: `start`, `ios`, `android`, `web`, `ios|android --plan`, `reload`, `stop`, `status`, `doctor`, `device lock`/`unlock`, `device location|permission|push|network`, `gc`, and the error contract",
707
708
  preamble: () => `SLOTS
708
709
  Named ios/android runs add slot to their JSON facts. Default-run fields remain
709
710
  compatible. status adds a slots array per environment with each named slot's
@@ -713,7 +714,7 @@ Named collector, lease-holder, and launch keys use platform:slot internally.
713
714
  FACTS CONTRACT
714
715
 
715
716
  \`start\`, \`ios\`, \`android\`, \`web\`, \`reload\`, \`stop\`, \`status\`, \`stats\`, \`doctor\`,
716
- \`gc\`, and \`device lock\`/\`device unlock\` each print exactly ONE line of JSON on
717
+ \`gc\`, \`device lock\`/\`device unlock\`, and \`device location|permission|push|network\` each print exactly ONE line of JSON on
717
718
  stdout for \`--json\`. Every other line goes to stderr, so it is always safe
718
719
  to pipe. \`logs --json\` is the one exception: it is NDJSON, one record per
719
720
  line by design (see \`guide logs\`), not this single-payload contract.
@@ -4643,7 +4644,11 @@ so a Debug run on one is wired to a LAN origin instead of localhost.`,
4643
4644
  then until SpringBoard has finished starting, which \`simctl launch\` needs.
4644
4645
  Booted alone does not end that wait. The failure names the udid and the wait.
4645
4646
  After boot, a process-spawn probe must finish within 30 seconds before
4646
- installation. If it fails, the refusal includes observed host memory pressure
4647
+ installation. A probe that times out while the simulator still reports Booted
4648
+ is retried for about three minutes, since a loaded host can leave a booted
4649
+ simulator unresponsive for a while; a timeout on a simulator that no longer
4650
+ reports Booted, and any other probe failure, refuse at once. If it
4651
+ fails, the refusal includes observed host memory pressure
4647
4652
  when available. Free memory before retrying under pressure; see
4648
4653
  \`stim guide lifecycle simslim\`. Booted alone does not prove readiness.
4649
4654
  The same probe lists the simulator's launchd jobs and requires a running
@@ -4715,6 +4720,35 @@ so a Debug run on one is wired to a LAN origin instead of localhost.`,
4715
4720
  no token left in its \`state.json\` (its workspace directory was recreated).
4716
4721
  The remedy for that last one is \`stim device unlock\`, which releases by
4717
4722
  holder rather than by token.`
4723
+ },
4724
+ STIM_DEVICE_TOOL_TARGET: {
4725
+ summary: "a device tool found no owned, running simulator or emulator in that slot to act on",
4726
+ body: () => `STIM_DEVICE_TOOL_TARGET
4727
+ \`stim device location|permission|push|network\` act only on this workspace's
4728
+ own local simulator or emulator in the slot. The message says which check
4729
+ failed: the slot's device is hosted on another Mac, the workspace runs an
4730
+ EAS Simulator session, the slot has no owned device (a physical device
4731
+ reached with \`--device\` is never one), the recorded simulator is gone or not
4732
+ owned by this Stim home, or it is not booted or running. Permission and push
4733
+ also refuse when no app is recorded for the device. Run the platform command
4734
+ the remedy names (\`stim ios\` or \`stim android\`, with \`--slot\` for a named
4735
+ slot) and retry. No tool runs before this refusal.`
4736
+ },
4737
+ STIM_DEVICE_TOOL_UNSUPPORTED: {
4738
+ summary: "that device tool has no equivalent on that platform",
4739
+ body: () => `STIM_DEVICE_TOOL_UNSUPPORTED
4740
+ The platform lacks the action: Android cannot clear a simulated location
4741
+ (\`adb emu geo fix\` only sets one), iOS has no network switch, and Android
4742
+ has no simulated push. The remedy names the nearest thing.`
4743
+ },
4744
+ STIM_DEVICE_TOOL_FAILED: {
4745
+ summary: "simctl or adb failed, or the device did not report the change afterwards",
4746
+ body: () => `STIM_DEVICE_TOOL_FAILED
4747
+ The tool call exited non-zero or timed out, with its output in the message, or
4748
+ the read-back after an Android permission or network change did not show the
4749
+ requested state. For a permission, the app must declare the permission in its
4750
+ manifest; when it declares none of the service's permissions the call refuses
4751
+ with this code. Check the device with \`stim status\` and retry.`
4718
4752
  },
4719
4753
  STIM_DEVICE_WIRELESS_FAILED: {
4720
4754
  summary: "an iPhone paired over Wi-Fi timed out or dropped during install or launch; use the cable",
@@ -5734,8 +5768,11 @@ SpringBoard is back; an already slim simulator is not touched. Turn sound on
5734
5768
  for one device with Sound (iOS) or Media sound (Android) in its Stim Desktop
5735
5769
  options; the choice lasts until that device next boots. Android 14 and older images have no shell command that can
5736
5770
  set media volume, so startup warns, as it does whenever a mute is not
5737
- confirmed. Host volume, Android alarm and ringtone volumes, hosted devices and
5738
- physical devices are unchanged.
5771
+ confirmed. A hosted simulator or emulator on a named Mac is muted the same way
5772
+ after the host boots or adopts it (best effort; a failed mute is not reported
5773
+ to the client), and Stim Desktop's Sound options do not reach
5774
+ it. Host volume, Android alarm and ringtone volumes and physical devices are
5775
+ unchanged.
5739
5776
 
5740
5777
  Repeat step 3 whenever a NATIVE input changes. A JS-only edit needs nothing --
5741
5778
  that is what Fast Refresh over the running dev server is for. \`stim reload\` is
@@ -8453,6 +8490,60 @@ THE POOL: WHICH DEVICE AN ID-LESS \`--device\` PICKS
8453
8490
  The chosen device is on the phase line and in \`--json\` (\`udid\` or
8454
8491
  \`serial\`, plus \`deviceName\`), so an agent can hand the same id to its
8455
8492
  device tool.`
8493
+ },
8494
+ tools: {
8495
+ summary: "device location, permission, push and network: change the owned simulator or emulator and read it back",
8496
+ body: () => ` \`stim device location|permission|push|network\` change the workspace's own
8497
+ simulator or emulator. Each takes the platform first, like \`device lock\`,
8498
+ and \`--slot <name>\` and \`--json\`:
8499
+
8500
+ stim device location <ios|android> --set <lat,lng> # --set 45.5,-73.6
8501
+ stim device location ios --clear
8502
+ stim device permission <ios|android> <grant|revoke|reset> <service>
8503
+ stim device push ios --payload '<json with an "aps" key>'
8504
+ stim device network android <on|off>
8505
+
8506
+ THE TARGET is the slot's owned, booted simulator or emulator, resolved the
8507
+ way \`reload\` resolves it: the project record says \`owned\`, the ledger
8508
+ agrees, and the serial belongs to the recorded AVD. A hosted device, an EAS
8509
+ Simulator session, a physical device (\`--device\`), a device Stim does not
8510
+ own, and a device that is not running refuse with STIM_DEVICE_TOOL_TARGET and
8511
+ run no tool. An action the platform lacks (Android \`--clear\`, iOS network,
8512
+ Android push) refuses with STIM_DEVICE_TOOL_UNSUPPORTED. A tool call that
8513
+ fails, or a device that disagrees with the change afterwards, is
8514
+ STIM_DEVICE_TOOL_FAILED. A bad value is STIM_BAD_ARG.
8515
+
8516
+ \`--set\` takes latitude and longitude as ONE value so a negative latitude is
8517
+ not read as a flag. Android's \`adb emu geo fix\` takes longitude first; Stim
8518
+ swaps them. The emulator has no way to clear a location.
8519
+
8520
+ \`permission\` acts on the app of the slot's last launch, else the project's
8521
+ bundle id or Android package. iOS services are simctl's own: all, calendar,
8522
+ contacts, contacts-limited, location, location-always, media-library,
8523
+ microphone, motion, photos, photos-add, reminders, siri. iOS notifications
8524
+ and camera are not simctl services. Android services are calendar, camera,
8525
+ contacts, location, microphone, motion, notifications, photos; one service is
8526
+ one or two \`pm\` permissions. A permission the app did not declare is
8527
+ listed in \`skipped\` and the call succeeds when the app declares at least one;
8528
+ an app that declares none is STIM_DEVICE_TOOL_FAILED.
8529
+ \`push\` needs the app to hold notification permission on the simulator, which
8530
+ \`simctl privacy\` cannot grant: without it simctl answers "Source is not
8531
+ authorized" and the call is STIM_DEVICE_TOOL_FAILED; open the app and accept
8532
+ its prompt.
8533
+ Android \`reset\` revokes the permission and clears its user-set flags so
8534
+ the app asks again. A grant needs one of the
8535
+ service's permissions to read back granted; a revoke or reset needs all of
8536
+ them not granted, and a reset also no USER_SET or USER_FIXED flag. Changing a
8537
+ permission can terminate the running app on both platforms.
8538
+
8539
+ \`--json\` prints ONE line: { platform, slot, deviceId, deviceName, tool,
8540
+ action, ..., readBack }. \`readBack\` is read from the device after the change:
8541
+ Android permissions are { permissions: [{ name, granted }] } from
8542
+ \`dumpsys package\`, and Android network is { wifi, data } from \`settings get
8543
+ global wifi_on|mobile_data\`. \`readBack\` is null where the platform has no
8544
+ read: iOS location, permission and push, and Android location. Then the exit
8545
+ status of simctl or adb is the only confirmation; Stim never echoes the
8546
+ request as a read-back.`
8456
8547
  },
8457
8548
  release: {
8458
8549
  summary: "Release configurations and ...Release variants: Metro skipped, process-proven launch, the JS swap",
@@ -10130,7 +10221,7 @@ KEYS STIM READS
10130
10221
  restores stock services when Stim applied the profile. Absolute paths, root or
10131
10222
  symlink escapes, and missing files are refused before
10132
10223
  simulator creation. Remote and unowned simulators are
10133
- never changed.
10224
+ never slimmed.
10134
10225
  ios.signingIdentity e.g. "Apple Development: Jane (TEAMID5678)" -- the
10135
10226
  keychain identity to re-seal a \`--device\` build with,
10136
10227
  overriding the one Stim derives from the artifact's own
@@ -10931,6 +11022,13 @@ answer, an incompatible Stim build, CPU, Xcode, simulator SDK or CocoaPods, no
10931
11022
  Bundler for an app whose Gemfile.lock pins CocoaPods, no iPhone simulator on
10932
11023
  the runtime \`stim ios\` builds for here, low disk, or busy. With Package.swift
10933
11024
  and no platform selection on a Mac, it also checks the macOS Xcode and SDK.
11025
+ A client with no Xcode and no simulator SDK, such as Linux or Windows, has no
11026
+ Xcode to match: the Mac's own Xcode, simulator SDK and CocoaPods are the
11027
+ build's toolchain, the client leaves pod install to it, and \`stim ios --remote
11028
+ <mac> --remote-build <mac>\` runs the app on that Mac's hosted simulator. If
11029
+ that pod install changes Podfile.lock or the Xcode project, the build fails
11030
+ with fingerprint-mismatch; run pod install once on a Mac and commit the
11031
+ result. A client with an Xcode still needs the same one.
10934
11032
  Two machines build for each other when their Stim releases share a build
10935
11033
  compatibility version, which changes only when what a worker builds, how it
10936
11034
  builds, or the build messages change; their Stim builds can differ. A
@@ -12186,11 +12284,10 @@ script such as mini-desktop.sh use these instead:
12186
12284
  quit stim stop (verified stop; the host frees the slot
12187
12285
  and removes the app's defaults)
12188
12286
  clean stim worktree remove
12189
- 3 concurrent slots concurrency.maxDevices on the host; one bundle id
12287
+ 3 concurrent slots concurrency.maxDevices on the host, counted apart
12288
+ from simulators and emulators; one bundle id
12190
12289
  slot per session
12191
12290
 
12192
- The host's own owned devices count toward concurrency.maxDevices.
12193
-
12194
12291
  The agent-device rows work once the host's agent field names agent-device.
12195
12292
 
12196
12293
  On macOS 27, agent-device screenshot of a hosted app can return an image of the
@@ -1,7 +1,7 @@
1
1
  import { c as throwIfCancelled } from "./exec-aULwtNly.mjs";
2
- import { c as call, l as connectHost } from "./hosted-client-CgoxdU9j.mjs";
2
+ import { c as call, l as connectHost } from "./hosted-client-Cect92SZ.mjs";
3
3
  import { i as requestHostedMetro } from "./metro-request-BtF7ox53.mjs";
4
- import { a as stopHostedNative, i as prepareHostedNative, r as placeHostedNative } from "./hosted-native-DvZENAL-.mjs";
4
+ import { a as stopHostedNative, i as prepareHostedNative, r as placeHostedNative } from "./hosted-native-DmdLSmvu.mjs";
5
5
  //#region src/device-host/hosted-android.ts
6
6
  async function prepareHostedAndroid(machine, selectors, recorded, mode) {
7
7
  return await prepareHostedNative(machine, selectors, recorded, "android", false, mode);
@@ -1,7 +1,7 @@
1
1
  import { c as throwIfCancelled, o as cancellableSleep } from "./exec-aULwtNly.mjs";
2
2
  import { Y as diagnoseConnectFailure, st as resolveEndpoint } from "./config-AbUjIBOQ.mjs";
3
- import { t as BuildConnection } from "./client-BTUH8TF1.mjs";
4
- import { g as configuredMachines } from "./selection-D1ZDzHFX.mjs";
3
+ import { t as BuildConnection } from "./client-DrHykA24.mjs";
4
+ import { g as configuredMachines } from "./selection-PCMT97XD.mjs";
5
5
  import { createHash } from "node:crypto";
6
6
  import { lstatSync, readFileSync, readdirSync, readlinkSync } from "node:fs";
7
7
  import { join } from "node:path";
@@ -1,11 +1,11 @@
1
1
  import { t as getExecutor } from "./exec-aULwtNly.mjs";
2
2
  import { E as workspaceDir, k as workspaceLogsDir$1 } from "./workspace-state-DGwkPXwq.mjs";
3
3
  import { B as deviceSlotFileKey, it as parseMachine$1, q as validateDeviceSlot } from "./config-AbUjIBOQ.mjs";
4
- import { l as phaseLine } from "./command-output-DjCsmzLZ.mjs";
4
+ import { l as phaseLine } from "./command-output-BBW8eWPL.mjs";
5
5
  import { n as macosDir } from "./state-C2AUjjhg.mjs";
6
- import { n as androidLogGroups, r as isAndroidCrashText } from "./android-CLU_MMnb.mjs";
6
+ import { n as androidLogGroups, r as isAndroidCrashText } from "./android-BEQUDpOg.mjs";
7
7
  import { c as readNdjsonGenerations$1, i as createNdjsonWriter } from "./ndjson-CrjIsGzw.mjs";
8
- import { c as call } from "./hosted-client-CgoxdU9j.mjs";
8
+ import { c as call } from "./hosted-client-Cect92SZ.mjs";
9
9
  import { mkdirSync, readFileSync, realpathSync, renameSync, rmSync, writeFileSync } from "node:fs";
10
10
  import { dirname, join } from "node:path";
11
11
  import { LOG_ROTATE_BYTES, ambientWrite, withDirLockAsync } from "@stim-cli/core";
@@ -1,8 +1,8 @@
1
- import { n as pullHostedNativeLogs, r as readHostedNativeLogs, t as pullHostedMacosLogs } from "./hosted-logs-C-4INmkn.mjs";
2
- import { l as phaseLine } from "./command-output-DjCsmzLZ.mjs";
3
- import { l as connectHost } from "./hosted-client-CgoxdU9j.mjs";
1
+ import { n as pullHostedNativeLogs, r as readHostedNativeLogs, t as pullHostedMacosLogs } from "./hosted-logs-Opcjv1Lr.mjs";
2
+ import { l as phaseLine } from "./command-output-BBW8eWPL.mjs";
3
+ import { l as connectHost } from "./hosted-client-Cect92SZ.mjs";
4
4
  import { n as readHostedIos, t as readHostedAndroid } from "./ios-state-Ce_dystM.mjs";
5
- import "./hosted-macos-Doh85YUM.mjs";
5
+ import "./hosted-macos-BP9Kucat.mjs";
6
6
  import { watch } from "node:fs";
7
7
  import { dirname, relative, resolve, sep } from "node:path";
8
8
  import { ambientWrite, configDir } from "@stim-cli/core";
@@ -108,14 +108,10 @@ function followHostedLaunchLogs(root, slot, platform, since, context) {
108
108
  stop
109
109
  };
110
110
  }
111
- async function syncHostedLogs(root, context) {
111
+ async function syncHostedLogs(root, context, includeSlots = true) {
112
112
  const macos = readMacosRecord(root)?.host;
113
113
  const warnings = /* @__PURE__ */ new Set();
114
- return (await Promise.all([
115
- ...macos ? [syncHostedMacosLogs(root, macos, void 0, warnings, "ios", context)] : [],
116
- ...Object.entries(readHostedIos(root)).map(([slot, placement]) => syncHostedMacosLogs(root, placement, slot, warnings, "ios", context)),
117
- ...Object.entries(readHostedAndroid(root)).map(([slot, placement]) => syncHostedMacosLogs(root, placement, slot, warnings, "android", context))
118
- ])).every(Boolean);
114
+ return (await Promise.all([...macos ? [syncHostedMacosLogs(root, macos, void 0, warnings, "ios", context)] : [], ...includeSlots ? [...Object.entries(readHostedIos(root)).map(([slot, placement]) => syncHostedMacosLogs(root, placement, slot, warnings, "ios", context)), ...Object.entries(readHostedAndroid(root)).map(([slot, placement]) => syncHostedMacosLogs(root, placement, slot, warnings, "android", context))] : []])).every(Boolean);
119
115
  }
120
116
  function followHostedLogs(root, failing, context) {
121
117
  const stops = /* @__PURE__ */ new Map();
@@ -1,9 +1,9 @@
1
1
  import { o as cancellableSleep } from "./exec-aULwtNly.mjs";
2
- import { a as agentAccess, i as closeAgentConnection, o as removeAgentAccess, t as pullHostedMacosLogs } from "./hosted-logs-C-4INmkn.mjs";
3
- import { l as phaseLine } from "./command-output-DjCsmzLZ.mjs";
2
+ import { a as agentAccess, i as closeAgentConnection, o as removeAgentAccess, t as pullHostedMacosLogs } from "./hosted-logs-Opcjv1Lr.mjs";
3
+ import { l as phaseLine } from "./command-output-BBW8eWPL.mjs";
4
4
  import { n as macosDir } from "./state-C2AUjjhg.mjs";
5
- import { ot as runCancellationSignal } from "./toolchain-CLGnEUgT.mjs";
6
- import { _ as stoppedSession, a as SESSION_TIMEOUT_MS, c as call, f as hostedSession, g as sha256, h as settle, i as RESERVE_TIMEOUT_MS, l as connectHost, o as attach, r as PREPARE_TIMEOUT_MS, s as bundleManifest, t as INSTALL_TIMEOUT_MS, u as heldNoLonger, v as unknownSession, y as upload } from "./hosted-client-CgoxdU9j.mjs";
5
+ import { st as runCancellationSignal } from "./toolchain-DLdoyxIt.mjs";
6
+ import { _ as stoppedSession, a as SESSION_TIMEOUT_MS, c as call, f as hostedSession, g as sha256, h as settle, i as RESERVE_TIMEOUT_MS, l as connectHost, o as attach, r as PREPARE_TIMEOUT_MS, s as bundleManifest, t as INSTALL_TIMEOUT_MS, u as heldNoLonger, v as unknownSession, y as upload } from "./hosted-client-Cect92SZ.mjs";
7
7
  import { randomUUID } from "node:crypto";
8
8
  import { join } from "node:path";
9
9
  import { ambientContext, ambientWrite } from "@stim-cli/core";
@@ -1,15 +1,15 @@
1
1
  import { o as cancellableSleep, x as withDrainingCancellation } from "./exec-aULwtNly.mjs";
2
2
  import { E as workspaceDir, l as withWorkspaceStateLockAsync, r as readWorkspaceState$1 } from "./workspace-state-DGwkPXwq.mjs";
3
- import { a as agentAccess, i as closeAgentConnection, n as pullHostedNativeLogs, o as removeAgentAccess } from "./hosted-logs-C-4INmkn.mjs";
4
- import { ot as runCancellationSignal } from "./toolchain-CLGnEUgT.mjs";
5
- import { _ as stoppedSession, a as SESSION_TIMEOUT_MS, c as call, f as hostedSession, g as sha256, h as settle, i as RESERVE_TIMEOUT_MS, l as connectHost, m as requireHostedAppMode, n as OFFER_TIMEOUT_MS, o as attach, r as PREPARE_TIMEOUT_MS, s as bundleManifest, t as INSTALL_TIMEOUT_MS, u as heldNoLonger, v as unknownSession, y as upload } from "./hosted-client-CgoxdU9j.mjs";
3
+ import { a as agentAccess, i as closeAgentConnection, n as pullHostedNativeLogs, o as removeAgentAccess } from "./hosted-logs-Opcjv1Lr.mjs";
4
+ import { st as runCancellationSignal } from "./toolchain-DLdoyxIt.mjs";
5
+ import { _ as stoppedSession, a as SESSION_TIMEOUT_MS, c as call, f as hostedSession, g as sha256, h as settle, i as RESERVE_TIMEOUT_MS, l as connectHost, m as requireHostedAppMode, n as OFFER_TIMEOUT_MS, o as attach, r as PREPARE_TIMEOUT_MS, s as bundleManifest, t as INSTALL_TIMEOUT_MS, u as heldNoLonger, v as unknownSession, y as upload } from "./hosted-client-Cect92SZ.mjs";
6
6
  import { a as requireHostedMetro, i as requestHostedMetro, n as closeHostedMetro } from "./metro-request-BtF7ox53.mjs";
7
7
  import { s as writeHostedNative } from "./ios-state-Ce_dystM.mjs";
8
8
  import { randomUUID } from "node:crypto";
9
9
  import { readFileSync } from "node:fs";
10
10
  import { join } from "node:path";
11
11
  import { ambientContext, ambientWrite } from "@stim-cli/core";
12
- import { hostedNativeRecords, isJsonObject, parseHostedAndroidDevice, parseHostedChoice, parseHostedDevice, parseHostedNativeOffer, parseHostedNativePlacement, requireAutomaticMachine, unreadableHostedNative } from "@stim-cli/core/state";
12
+ import { hostedMemoryRefusal, hostedNativeRecords, isJsonObject, parseHostedAndroidDevice, parseHostedChoice, parseHostedDevice, parseHostedNativeOffer, parseHostedNativePlacement, requireAutomaticMachine, unreadableHostedNative } from "@stim-cli/core/state";
13
13
  //#region src/device-host/hosted-native.ts
14
14
  function hostingRefusal(machine, error) {
15
15
  return Object.assign(/* @__PURE__ */ new Error(`${machine}: ${error instanceof Error ? error.message : String(error)}`), {
@@ -58,7 +58,8 @@ async function prepareHostedNative(machine, selectors, recorded, platform = "ios
58
58
  if (typeof offer.declined === "string") throw new Error(offer.declined);
59
59
  if (!choice) throw new Error(platform === "ios" ? "No compatible installed iOS simulator runtime was offered." : "No compatible installed Android emulator image was offered.");
60
60
  if (!isJsonObject(offer.capacity) || offer.capacity.available === 0) throw new Error("No hosted device capacity is available.");
61
- if (!isJsonObject(offer.resources) || offer.resources.memoryPressure !== "normal") throw new Error("Host memory pressure is unknown or elevated.");
61
+ const memoryRefusal = hostedMemoryRefusal(isJsonObject(offer.resources) ? offer.resources.memoryPressure : null);
62
+ if (memoryRefusal) throw new Error(memoryRefusal);
62
63
  return {
63
64
  host,
64
65
  choice,
@@ -1,11 +1,11 @@
1
1
  import { k as workspaceLogsDir$1, r as readWorkspaceState$1, s as updateWorkspaceStateAsync } from "./workspace-state-DGwkPXwq.mjs";
2
2
  import { V as deviceSlotKey, _ as loadConfig$1 } from "./config-AbUjIBOQ.mjs";
3
- import { o as formatLongDuration } from "./command-output-DjCsmzLZ.mjs";
3
+ import { o as formatLongDuration } from "./command-output-BBW8eWPL.mjs";
4
4
  import { i as createNdjsonWriter } from "./ndjson-CrjIsGzw.mjs";
5
- import { B as workspaceBuildInProgress, P as collectOwnedDeviceActivity, ht as teardownOwnedIosSim, pt as teardownOwnedAvd } from "./workspaces-CvSYD_78.mjs";
5
+ import { B as workspaceBuildInProgress, P as collectOwnedDeviceActivity, ht as teardownOwnedIosSim, pt as teardownOwnedAvd } from "./workspaces-7_RWoi6c.mjs";
6
6
  import { t as canonicalPath } from "./paths-BsJMoPP2.mjs";
7
- import { _ as workspaceDeviceLastUseAt } from "./activity-BR5oHSO5.mjs";
8
- import { d as listAllIosSims } from "./ios-CoMCWfub.mjs";
7
+ import { _ as workspaceDeviceLastUseAt } from "./activity-BTaUf0tc.mjs";
8
+ import { d as listAllIosSims } from "./ios-CXnoVO_z.mjs";
9
9
  import { join } from "node:path";
10
10
  import { LOG_ROTATE_BYTES } from "@stim-cli/core";
11
11
  import { DEVICE_IDLE_SHUTDOWN_KEY, DEVICE_RECLAIM_REASON, readDeviceIdleShutdowns } from "@stim-cli/core/state";
@@ -1,9 +1,9 @@
1
- import { h as shortUdid, i as formatDuration, l as phaseLine, m as shortHash } from "./command-output-DjCsmzLZ.mjs";
2
- import { xn as schemesFromInfoPlist, yn as pickDevClientScheme } from "./ccache-DsDkdP72.mjs";
3
- import { f as podAction, h as resolveDeviceType, i as deviceLabel, m as resolveConfiguration, n as buildLogFile, s as iosConfigurationSetting, t as appNameFromPath, u as isReleaseConfiguration, v as resolveRuntime } from "./support-BMpQIug0.mjs";
4
- import { n as ensureWorkspaceStorageSafely } from "./native-runtime-DyH2gkXK.mjs";
5
- import { t as devClientScheme } from "./dev-client-CROrxj1x.mjs";
6
- import { c as writeLastBuild, i as iosFacts, n as cacheDescription, o as lastBuildRecord } from "./ios-project-DJYptOCh.mjs";
7
- import { d as replaceCollector, u as collectorEntry } from "./dependencies-CHNqX6Pr.mjs";
8
- import { n as registerIos, r as runIosOperation, t as iosCommand } from "./ios-UM_dManb.mjs";
1
+ import { h as shortUdid, i as formatDuration, l as phaseLine, m as shortHash } from "./command-output-BBW8eWPL.mjs";
2
+ import { xn as schemesFromInfoPlist, yn as pickDevClientScheme } from "./ccache-B8gY50-h.mjs";
3
+ import { f as podAction, h as resolveDeviceType, i as deviceLabel, m as resolveConfiguration, n as buildLogFile, s as iosConfigurationSetting, t as appNameFromPath, u as isReleaseConfiguration, v as resolveRuntime } from "./support-DUevTPur.mjs";
4
+ import { n as ensureWorkspaceStorageSafely } from "./native-runtime-D4cTwU0Z.mjs";
5
+ import { t as devClientScheme } from "./dev-client-CASgAOu7.mjs";
6
+ import { c as writeLastBuild, i as iosFacts, n as cacheDescription, o as lastBuildRecord } from "./ios-project-BM9TbTE7.mjs";
7
+ import { d as replaceCollector, u as collectorEntry } from "./dependencies-vUh9mp5z.mjs";
8
+ import { n as registerIos, r as runIosOperation, t as iosCommand } from "./ios-CG0IsLtt.mjs";
9
9
  export { appNameFromPath, buildLogFile, cacheDescription, collectorEntry, iosCommand as default, devClientScheme, deviceLabel, ensureWorkspaceStorageSafely, formatDuration, iosConfigurationSetting, iosFacts, isReleaseConfiguration, lastBuildRecord, phaseLine, pickDevClientScheme, podAction, registerIos, replaceCollector, resolveConfiguration, resolveDeviceType, resolveRuntime, runIosOperation, schemesFromInfoPlist, shortHash, shortUdid, writeLastBuild };
@@ -1,33 +1,33 @@
1
1
  import { a as recordWorkspaceUseAsync, k as workspaceLogsDir$1 } from "./workspace-state-DGwkPXwq.mjs";
2
2
  import { B as deviceSlotFileKey, W as parseDeviceSlotOption, q as validateDeviceSlot } from "./config-AbUjIBOQ.mjs";
3
- import { _ as stepTimer, g as stepClock, i as formatDuration, l as phaseLine } from "./command-output-DjCsmzLZ.mjs";
3
+ import { _ as stepTimer, g as stepClock, i as formatDuration, l as phaseLine } from "./command-output-BBW8eWPL.mjs";
4
4
  import { B as publicUrlSetting, C as iosSigningIdentitySettingError, F as metroWarmupUrlSetting, N as metroPortSetting, S as iosSigningIdentitySetting, T as iosSigningIdentitySha1SettingError, a as SETTING_SHAPE_REMEDY, g as deviceReclaimIdleMinutesSetting, ot as tunnelModeSetting, v as iosLanHostSetting, w as iosSigningIdentitySha1Setting, y as iosLanHostSettingError, z as projectSettingsContextAsync } from "./settings-D776ygML.mjs";
5
- import { t as NO_PROJECT_REFUSAL } from "./project-D1n0K4yg.mjs";
6
- import { ft as POOL_SETTING_REMEDY, vt as parkedMaxSetting } from "./android-BHKgeOuq.mjs";
7
- import { En as runProcessOperation, Et as binOnPath, Qt as DEFAULT_METRO_PORT, qn as ownedSessionName, wn as exitAfterFlush } from "./ccache-DsDkdP72.mjs";
8
- import { $ as tapBuildLog, H as NO_BUILD_PROGRESS, Q as startBuildProgress, Z as runFailureRecord, et as thrownRunFailureRecord, lt as statsProjectKey$1, rt as createRunRecorder } from "./workspaces-CvSYD_78.mjs";
9
- import { Q as cancelledFailure, at as runCancellation, k as COMPILATION_CACHE_NOT_RUN, ot as runCancellationSignal, st as withNativeBuildRun } from "./toolchain-CLGnEUgT.mjs";
10
- import { i as createIosSimSnapshot } from "./ios-CoMCWfub.mjs";
5
+ import { t as NO_PROJECT_REFUSAL } from "./project-DPQjnpcI.mjs";
6
+ import { ft as POOL_SETTING_REMEDY, vt as parkedMaxSetting } from "./android-DdKG6lyD.mjs";
7
+ import { En as runProcessOperation, Et as binOnPath, Qt as DEFAULT_METRO_PORT, qn as ownedSessionName, wn as exitAfterFlush } from "./ccache-B8gY50-h.mjs";
8
+ import { $ as tapBuildLog, H as NO_BUILD_PROGRESS, Q as startBuildProgress, Z as runFailureRecord, et as thrownRunFailureRecord, lt as statsProjectKey$1, rt as createRunRecorder } from "./workspaces-7_RWoi6c.mjs";
9
+ import { $ as cancelledFailure, A as COMPILATION_CACHE_NOT_RUN, ct as withNativeBuildRun, ot as runCancellation, st as runCancellationSignal } from "./toolchain-DLdoyxIt.mjs";
10
+ import { i as createIosSimSnapshot } from "./ios-CXnoVO_z.mjs";
11
11
  import { d as optimizationBuildProfile, l as artifactCachePolicy } from "./errors-DHm_U5gv.mjs";
12
- import { S as setRemoteLogSink, d as simulatorRuntime } from "./client-BTUH8TF1.mjs";
13
- import { s as parseBuildMachineOption } from "./selection-D1ZDzHFX.mjs";
12
+ import { S as setRemoteLogSink, d as simulatorRuntime } from "./client-DrHykA24.mjs";
13
+ import { s as parseBuildMachineOption } from "./selection-PCMT97XD.mjs";
14
14
  import { r as hostedMetroSettings } from "./metro-request-BtF7ox53.mjs";
15
15
  import { i as writeDevicePlacementAsync } from "./ios-state-Ce_dystM.mjs";
16
- import { t as devClientPortBusy } from "./hosted-native-DvZENAL-.mjs";
17
- import { i as restoreLightenedDependencies, n as printLightenedFailure } from "./lightened-vSxkstg6.mjs";
18
- import { f as waitFlagConflict, o as leaseExpiryText } from "./device-lease-run-qRq_2W2V.mjs";
19
- import { _ as resolveIosWait, a as deviceModelRefusal, b as resolveSimulatorAppFlag, c as iosProjectPathError, d as ownedSimFailure, g as resolveIosBuildSetup, h as resolveDeviceType, i as deviceLabel, m as resolveConfiguration, n as buildLogFile, r as createIosDeviceWaitRun, u as isReleaseConfiguration, v as resolveRuntime, x as simulatorBuildArch, y as resolveSchemeSelection } from "./support-BMpQIug0.mjs";
20
- import { r as isEasBuildFailure } from "./eas-build-D-9HmGZS.mjs";
21
- import { a as iosPoolCandidates, c as isWirelessIosDevice, f as resolveIosPhysicalDevice, o as iosPoolNoCandidatesRefusal, r as iosDeviceBounds } from "./ios-device-L1-pota_.mjs";
22
- import { i as launchOutcomeRecord, r as isPhysicalDeviceRequest, t as ensureDevServer } from "./native-runtime-DyH2gkXK.mjs";
23
- import "./dev-client-CROrxj1x.mjs";
24
- import { t as didSetUpDevice } from "./device-Bmm5qjM-.mjs";
16
+ import { t as devClientPortBusy } from "./hosted-native-DmdLSmvu.mjs";
17
+ import { i as restoreLightenedDependencies, n as printLightenedFailure } from "./lightened-23pqe7LS.mjs";
18
+ import { f as waitFlagConflict, o as leaseExpiryText } from "./device-lease-run-Do6zYA7y.mjs";
19
+ import { _ as resolveIosWait, a as deviceModelRefusal, b as resolveSimulatorAppFlag, c as iosProjectPathError, d as ownedSimFailure, g as resolveIosBuildSetup, h as resolveDeviceType, i as deviceLabel, m as resolveConfiguration, n as buildLogFile, r as createIosDeviceWaitRun, u as isReleaseConfiguration, v as resolveRuntime, x as simulatorBuildArch, y as resolveSchemeSelection } from "./support-DUevTPur.mjs";
20
+ import { r as isEasBuildFailure } from "./eas-build-DIDOHw2P.mjs";
21
+ import { a as iosPoolCandidates, c as isWirelessIosDevice, f as resolveIosPhysicalDevice, o as iosPoolNoCandidatesRefusal, r as iosDeviceBounds } from "./ios-device-ClSfuu-_.mjs";
22
+ import { i as launchOutcomeRecord, r as isPhysicalDeviceRequest, t as ensureDevServer } from "./native-runtime-D4cTwU0Z.mjs";
23
+ import "./dev-client-CASgAOu7.mjs";
24
+ import { t as didSetUpDevice } from "./device-CsIdRXfm.mjs";
25
25
  import { t as unsupportedPlan } from "./project-plan-BPwbLwQu.mjs";
26
- import { a as refusePlan, i as printPlan, n as planFlagRefusal } from "./build-plan-CWyjMPKo.mjs";
27
- import { a as iosLedgerDevice, c as writeLastBuild, o as lastBuildRecord, s as reportIosResult } from "./ios-project-DJYptOCh.mjs";
28
- import { t as acquireIosArtifact } from "./artifact-Dm9ScLrh.mjs";
29
- import { a as hostedIosSelectors, i as hostedIosMetroNote, n as connectIosTarget, o as iosPlacementBudget, r as deviceRemoteConflict, s as selectIosPlacement, t as connectIosBackend } from "./remote-C8xyslUa.mjs";
30
- import { i as lanOriginUrlFor, l as verifyIosMetroRun, n as chooseLanAddress, o as finishIosRun, t as DEFAULT_DEPS } from "./dependencies-CHNqX6Pr.mjs";
26
+ import { a as refusePlan, i as printPlan, n as planFlagRefusal } from "./build-plan-J3iRR3gI.mjs";
27
+ import { a as iosLedgerDevice, c as writeLastBuild, o as lastBuildRecord, s as reportIosResult } from "./ios-project-BM9TbTE7.mjs";
28
+ import { t as acquireIosArtifact } from "./artifact-DTHXcmQ3.mjs";
29
+ import { a as hostedIosSelectors, i as hostedIosMetroNote, n as connectIosTarget, o as iosPlacementBudget, r as deviceRemoteConflict, s as selectIosPlacement, t as connectIosBackend } from "./remote-C-RGHhAP.mjs";
30
+ import { i as lanOriginUrlFor, l as verifyIosMetroRun, n as chooseLanAddress, o as finishIosRun, t as DEFAULT_DEPS } from "./dependencies-vUh9mp5z.mjs";
31
31
  import { join } from "node:path";
32
32
  import { workspaceId } from "@stim-cli/core";
33
33
  import { hostedIosStatus, parseMachine } from "@stim-cli/core/state";
@@ -809,7 +809,7 @@ async function runIos(context, projectRoot, opts = {}, overrides = {}, progress
809
809
  wireless = resolved.wireless === true;
810
810
  }
811
811
  if (checkCapacity && !hostedTarget) {
812
- const capacity = d.checkDeviceCapacity({
812
+ const capacity = await d.checkDeviceCapacity({
813
813
  platform: "ios",
814
814
  project: proj,
815
815
  max: limits.maxDevices,
@@ -3,8 +3,8 @@ import { P as formatBytes, _ as loadConfig$1 } from "./config-AbUjIBOQ.mjs";
3
3
  import { n as stripAnsi, r as waitForChild, t as createLineReader } from "./process-output-Fpl8PYi8.mjs";
4
4
  import { n as runOperationFileQuiet, t as runOperationFile } from "./operation-exec-Dp4FuIGR.mjs";
5
5
  import { i as stimDesktopInstalledAsync, n as settingDefault, t as STIM_DESKTOP_OPEN_OPTIONS } from "./stim-desktop-CYXLFpFS.mjs";
6
- import { Ct as forgetCreatedDeviceAsync, Et as recordCreatedDeviceAsync, dt as isStimOwnedSim } from "./android-BHKgeOuq.mjs";
7
- import { n as signedTailFor } from "./apk-signed-tail-B-wKoF_8.mjs";
6
+ import { Ct as forgetCreatedDeviceAsync, Et as recordCreatedDeviceAsync, dt as isStimOwnedSim } from "./android-DdKG6lyD.mjs";
7
+ import { n as signedTailFor } from "./apk-signed-tail-B8kw4a8K.mjs";
8
8
  import { createHash } from "node:crypto";
9
9
  import { closeSync, existsSync, lstatSync, mkdtempSync, openSync, readSync, readdirSync, rmSync, writeFileSync } from "node:fs";
10
10
  import { tmpdir, totalmem } from "node:os";
@@ -1,5 +1,5 @@
1
1
  import { t as getExecutor } from "./exec-aULwtNly.mjs";
2
- import { $t as INSTALL_ERROR, rn as appProcessFromPid } from "./ccache-DsDkdP72.mjs";
2
+ import { $t as INSTALL_ERROR, rn as appProcessFromPid } from "./ccache-B8gY50-h.mjs";
3
3
  import { n as TOOL_ERROR_PREFIX } from "./ios-device-CiBA-er9.mjs";
4
4
  import { mkdtempSync, readFileSync, rmSync } from "node:fs";
5
5
  import { tmpdir } from "node:os";
@@ -1,10 +1,10 @@
1
1
  import { w as workspaceAgentDeviceDir } from "./workspace-state-DGwkPXwq.mjs";
2
- import { i as formatDuration, l as phaseLine } from "./command-output-DjCsmzLZ.mjs";
2
+ import { i as formatDuration, l as phaseLine } from "./command-output-BBW8eWPL.mjs";
3
3
  import { a as workspaceLinkLine } from "./stim-desktop-CYXLFpFS.mjs";
4
- import { Mn as isEasAuthFailureText, On as UPLOAD_TIMEOUT_MS, jn as easAuthNote, kn as cacheLevel } from "./ccache-DsDkdP72.mjs";
5
- import { X as recordFinishedBuild } from "./workspaces-CvSYD_78.mjs";
6
- import { P as compilationCacheActivityLine, k as COMPILATION_CACHE_NOT_RUN } from "./toolchain-CLGnEUgT.mjs";
7
- import { i as deviceLabel } from "./support-BMpQIug0.mjs";
4
+ import { Mn as isEasAuthFailureText, On as UPLOAD_TIMEOUT_MS, jn as easAuthNote, kn as cacheLevel } from "./ccache-B8gY50-h.mjs";
5
+ import { X as recordFinishedBuild } from "./workspaces-7_RWoi6c.mjs";
6
+ import { A as COMPILATION_CACHE_NOT_RUN, F as compilationCacheActivityLine } from "./toolchain-DLdoyxIt.mjs";
7
+ import { i as deviceLabel } from "./support-DUevTPur.mjs";
8
8
  import { buildDiagnostics } from "@stim-cli/core/state";
9
9
  import chalk from "chalk";
10
10
  //#region src/commands/ios/result.ts
@@ -2,9 +2,9 @@ import { _ as spawnDeclared, b as operationState, c as throwIfCancelled, t as ge
2
2
  import { r as waitForChild, t as createLineReader } from "./process-output-Fpl8PYi8.mjs";
3
3
  import { a as killOnAbort, t as runOperationFile } from "./operation-exec-Dp4FuIGR.mjs";
4
4
  import { an as makeTemporaryDirectory, on as removeTemporaryEntry } from "./settings-D776ygML.mjs";
5
- import { Bn as bundleInvocation } from "./ccache-DsDkdP72.mjs";
6
- import { G as tailLines, U as startBuildHeartbeat, j as HEARTBEAT_INTERVAL_MS } from "./toolchain-CLGnEUgT.mjs";
7
- import { s as expoTelemetryEnv, t as cleanLine } from "./server-expo-bB1VV2k-.mjs";
5
+ import { Bn as bundleInvocation } from "./ccache-B8gY50-h.mjs";
6
+ import { K as tailLines, M as HEARTBEAT_INTERVAL_MS, W as startBuildHeartbeat } from "./toolchain-DLdoyxIt.mjs";
7
+ import { s as expoTelemetryEnv, t as cleanLine } from "./server-expo-C1K07shx.mjs";
8
8
  import { randomUUID } from "node:crypto";
9
9
  import { existsSync, mkdirSync, readFileSync, readdirSync, rmSync, writeFileSync } from "node:fs";
10
10
  import { basename, join } from "node:path";
@@ -1,24 +1,24 @@
1
1
  import { x as withDrainingCancellation } from "./exec-aULwtNly.mjs";
2
2
  import { k as workspaceLogsDir } from "./workspace-state-DGwkPXwq.mjs";
3
3
  import { B as deviceSlotFileKey, C as saveConfig, E as upsertProject, H as deviceSlotPlatforms, O as withConfigLockAsync, P as formatBytes, V as deviceSlotKey, _ as loadConfig, w as setDevice } from "./config-AbUjIBOQ.mjs";
4
- import { _ as stepTimer, c as launchErrorReport, i as formatDuration, l as phaseLine, n as appReadinessMessage, v as launchErrorPreview } from "./command-output-DjCsmzLZ.mjs";
5
- import { L as workspaceDevServerMode } from "./project-D1n0K4yg.mjs";
4
+ import { _ as stepTimer, c as launchErrorReport, i as formatDuration, l as phaseLine, n as appReadinessMessage, v as launchErrorPreview } from "./command-output-BBW8eWPL.mjs";
5
+ import { L as workspaceDevServerMode } from "./project-DPQjnpcI.mjs";
6
6
  import { o as workspaceLinks } from "./stim-desktop-CYXLFpFS.mjs";
7
- import { i as androidDataFreeBytes, ot as trimAndroidCaches, tt as resetAdoptedAvd, u as androidToolCwd } from "./android-BHKgeOuq.mjs";
7
+ import { i as androidDataFreeBytes, ot as trimAndroidCaches, tt as resetAdoptedAvd, u as androidToolCwd } from "./android-DdKG6lyD.mjs";
8
8
  import { c as pidExists, f as signalProcessTree } from "./metro-BMQHczcf.mjs";
9
- import { Bt as RELEASE_VERIFY_WAIT_MS, Gt as unattributedLaunchLines, It as LAUNCH_BUNDLING, Kt as unverifiedLaunchLines, Lt as LAUNCH_FATAL, Rt as LAUNCH_UNVERIFIED, Vt as VERIFY_TIMEOUT_MS, Zt as ADB_INSTALL_TIMEOUT_MS, gn as restartedAppNote, nn as androidDevClientUrl, tn as androidAppProcess, un as installConflictKind } from "./ccache-DsDkdP72.mjs";
10
- import { pt as teardownOwnedAvd } from "./workspaces-CvSYD_78.mjs";
11
- import { x as providerUploadOutcome } from "./build-cache-BGwTsIEa.mjs";
12
- import { t as recordPhoneReverse } from "./phone-reverses-DZRad8HT.mjs";
9
+ import { Bt as RELEASE_VERIFY_WAIT_MS, Gt as unattributedLaunchLines, It as LAUNCH_BUNDLING, Kt as unverifiedLaunchLines, Lt as LAUNCH_FATAL, Rt as LAUNCH_UNVERIFIED, Vt as VERIFY_TIMEOUT_MS, Zt as ADB_INSTALL_TIMEOUT_MS, gn as restartedAppNote, nn as androidDevClientUrl, tn as androidAppProcess, un as installConflictKind } from "./ccache-B8gY50-h.mjs";
10
+ import { pt as teardownOwnedAvd } from "./workspaces-7_RWoi6c.mjs";
11
+ import { x as providerUploadOutcome } from "./build-cache-DlC3owap.mjs";
12
+ import { t as recordPhoneReverse } from "./phone-reverses-CvhhkGMH.mjs";
13
13
  import { n as verifyCollectorOwnership, r as readCollectors } from "./ownership-Dtz9G5Gl.mjs";
14
- import { n as nativeRunCommand, r as siblingPlatformSlots, t as launchSlotScope } from "./slot-launch-Dbgfh8gc.mjs";
14
+ import { n as nativeRunCommand, r as siblingPlatformSlots, t as launchSlotScope } from "./slot-launch-CeIK1iUI.mjs";
15
15
  import { t as spawnEntry } from "./spawn-entry-jw19m8Nl.mjs";
16
- import { c as lostRefusal, s as lostLine, t as DEBUG_VERIFY_STEP_MS } from "./device-lease-run-qRq_2W2V.mjs";
17
- import { a as captureNativeCrashes, r as androidCrashClockOffset, s as printNativeCrashReport, t as errorDiagnostics } from "./error-diagnostics-CV_1RoEH.mjs";
18
- import { f as settleFingerprintCheck } from "./prebuild-Bqp0LFGN.mjs";
19
- import { i as launchOutcomeRecord } from "./native-runtime-DyH2gkXK.mjs";
20
- import { a as PLATFORM, b as noDeviceDiagnostic, h as displayPath, n as LAUNCH_FAILED, r as NO_DEVICE, t as INSTALL_FAILED } from "./support-PFyTkrnr.mjs";
21
- import { a as persistLastBuild, n as finishAndroidUpload, s as reportAndroidResult } from "./result-9fqcJ90W.mjs";
16
+ import { c as lostRefusal, s as lostLine, t as DEBUG_VERIFY_STEP_MS } from "./device-lease-run-Do6zYA7y.mjs";
17
+ import { a as captureNativeCrashes, r as androidCrashClockOffset, s as printNativeCrashReport, t as errorDiagnostics } from "./error-diagnostics-XJ9eWdtq.mjs";
18
+ import { f as settleFingerprintCheck } from "./prebuild-DBJMhwSS.mjs";
19
+ import { i as launchOutcomeRecord } from "./native-runtime-D4cTwU0Z.mjs";
20
+ import { a as PLATFORM, b as noDeviceDiagnostic, h as displayPath, n as LAUNCH_FAILED, r as NO_DEVICE, t as INSTALL_FAILED } from "./support-BGqpYMV8.mjs";
21
+ import { a as persistLastBuild, n as finishAndroidUpload, s as reportAndroidResult } from "./result-W4HCum4A.mjs";
22
22
  import { mkdirSync, openSync, statSync } from "node:fs";
23
23
  import { basename, join } from "node:path";
24
24
  import { ambientEnv } from "@stim-cli/core";
@@ -1,9 +1,9 @@
1
1
  import { l as WorkspaceProcessCleanupError } from "./exec-aULwtNly.mjs";
2
2
  import { c as withWorkspaceStateLock } from "./workspace-state-DGwkPXwq.mjs";
3
- import { l as phaseLine } from "./command-output-DjCsmzLZ.mjs";
3
+ import { l as phaseLine } from "./command-output-BBW8eWPL.mjs";
4
4
  import { Jt as warmWorktreePaths, Lt as podsOutOfSync, Q as resolveSettings, Rt as readWorktreeExclude, kt as listCarryableIgnoredEntries, vt as depsOutOfSync } from "./settings-D776ygML.mjs";
5
5
  import { t as canonicalPath } from "./paths-BsJMoPP2.mjs";
6
- import { m as warmWorktreeTarget } from "./worktree-CaQBf6kh.mjs";
6
+ import { m as warmWorktreeTarget } from "./worktree-qKJ3x07S.mjs";
7
7
  import { existsSync, mkdirSync, readFileSync, renameSync, rmSync, writeFileSync } from "node:fs";
8
8
  import { basename, dirname, join, relative } from "node:path";
9
9
  import { isJsonObject, readJsonObject, workspaceLightenedFile, workspaceMetadataFile } from "@stim-cli/core/state";
@@ -1,11 +1,11 @@
1
1
  import { i as recordWorkspaceUse, k as workspaceLogsDir$1, r as readWorkspaceState$1 } from "./workspace-state-DGwkPXwq.mjs";
2
2
  import { W as parseDeviceSlotOption, _ as loadConfig$1, g as isPathPrefix$1 } from "./config-AbUjIBOQ.mjs";
3
- import { f as refuseNoProject, v as launchErrorPreview } from "./command-output-DjCsmzLZ.mjs";
4
- import { n as findCommandWorkspace } from "./project-D1n0K4yg.mjs";
3
+ import { f as refuseNoProject, v as launchErrorPreview } from "./command-output-BBW8eWPL.mjs";
4
+ import { n as findCommandWorkspace } from "./project-DPQjnpcI.mjs";
5
5
  import { n as SOURCES$1, t as LEVELS$1 } from "./ndjson-CrjIsGzw.mjs";
6
- import { i as followAgentActions, n as openWorkspaceLogs } from "./logs-CilPftm3.mjs";
7
- import { t as errorDiagnostics } from "./error-diagnostics-CV_1RoEH.mjs";
8
- import { n as followHostedLogs } from "./hosted-logs-sync-Bf5s02fi.mjs";
6
+ import { i as followAgentActions, n as openWorkspaceLogs } from "./logs-Pkeh3wZk.mjs";
7
+ import { t as errorDiagnostics } from "./error-diagnostics-XJ9eWdtq.mjs";
8
+ import { n as followHostedLogs } from "./hosted-logs-sync-wsI7N1Hv.mjs";
9
9
  import { t as watchStdoutReader } from "./stdout-reader-C8yjre1x.mjs";
10
10
  import { realpathSync } from "node:fs";
11
11
  import { relative, sep } from "node:path";
@@ -1,9 +1,9 @@
1
1
  import { S as process_identity_exports } from "./exec-aULwtNly.mjs";
2
2
  import { k as workspaceLogsDir$1 } from "./workspace-state-DGwkPXwq.mjs";
3
3
  import { G as projectDeviceSlots, _ as loadConfig$1 } from "./config-AbUjIBOQ.mjs";
4
- import { f as readAgentDeviceRecordsAsync, n as agentDeviceLiveness, o as envDir } from "./activity-BR5oHSO5.mjs";
5
- import { o as captureWorkspaceCrashes } from "./error-diagnostics-CV_1RoEH.mjs";
6
- import { n as followHostedLogs, r as syncHostedLogs } from "./hosted-logs-sync-Bf5s02fi.mjs";
4
+ import { f as readAgentDeviceRecordsAsync, n as agentDeviceLiveness, o as envDir } from "./activity-BTaUf0tc.mjs";
5
+ import { o as captureWorkspaceCrashes } from "./error-diagnostics-XJ9eWdtq.mjs";
6
+ import { n as followHostedLogs, r as syncHostedLogs } from "./hosted-logs-sync-wsI7N1Hv.mjs";
7
7
  import { readdirSync, statSync, watch } from "node:fs";
8
8
  import { homedir } from "node:os";
9
9
  import { dirname, join, relative, resolve, sep } from "node:path";
@@ -222,7 +222,8 @@ async function openWorkspaceLogs(context, options = {}, follow = false) {
222
222
  const root = context.projectRoot;
223
223
  const dir = workspaceLogsDir$1(root);
224
224
  if (!logFiles(dir).length) throw Object.assign(/* @__PURE__ */ new Error(`No Stim workspace has run in ${root}. Run stim start, stim ios, or stim android in the app first.`), { code: "STIM_NO_PROJECT" });
225
- const hostedReachable = await syncHostedLogs(root, context);
225
+ const readsDevice = !options.sources?.length || options.sources.includes("device");
226
+ const hostedReachable = await syncHostedLogs(root, context, readsDevice);
226
227
  context.signal.throwIfAborted();
227
228
  const initial = await openLogDir(dir, { signal: context.signal });
228
229
  let attempts;