stim 1.31.0 → 1.32.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 (115) hide show
  1. package/dist/{acquire-artifact-P84h3ssa.mjs → acquire-artifact-CI9fIokp.mjs} +1 -1
  2. package/dist/{act-lcOIEy32.mjs → act-BfChMxcU.mjs} +62 -13
  3. package/dist/{activity-Dw4N_RFe.mjs → activity-yjH7Q3zn.mjs} +1 -1
  4. package/dist/{agent-device-usage-output-Boie2yB-.mjs → agent-device-usage-output-DO412bsG.mjs} +3 -3
  5. package/dist/{android-DhiWSOFU.mjs → android-BNm5A40S.mjs} +29 -29
  6. package/dist/{android-aIuJZoDu.mjs → android-D56S_GX3.mjs} +5 -5
  7. package/dist/api.mjs +21 -21
  8. package/dist/{artifact-ta3xA0c4.mjs → artifact-C8Nvp07y.mjs} +10 -10
  9. package/dist/{artifact-Cr34-Yyy.mjs → artifact-k1x9Jrn0.mjs} +10 -10
  10. package/dist/{auto-placement-DtTRG0rk.mjs → auto-placement--nfdQ9rp.mjs} +5 -5
  11. package/dist/{browser-web-DuULNZrS.mjs → browser-web-6RDAeH0z.mjs} +5 -5
  12. package/dist/{build-BpFFbdXD.mjs → build-VXX_dtl5.mjs} +15 -15
  13. package/dist/{build-plan-DH1rT11x.mjs → build-plan-BK34X2iY.mjs} +4 -4
  14. package/dist/{ccache-DVDO2ocE.mjs → ccache-BrwGIxmV.mjs} +7 -7
  15. package/dist/{cli-C0jjwTuM.mjs → cli-Jc7obreB.mjs} +17 -17
  16. package/dist/cli.mjs +1 -1
  17. package/dist/{client-DhJOvSvh.mjs → client-lDmA-5jx.mjs} +3 -3
  18. package/dist/{command-output-VrXd6qPX.mjs → command-output-CfPW1bKP.mjs} +1 -1
  19. package/dist/{dependencies-DIU-5rnG.mjs → dependencies-DkZ8681S.mjs} +28 -28
  20. package/dist/{dev-client-DeAg0fso.mjs → dev-client-eDZy6RoX.mjs} +2 -2
  21. package/dist/{device-DuNLOlR6.mjs → device-CTozKhU0.mjs} +6 -6
  22. package/dist/{device-C2WsPgFt.mjs → device-CeIikWac.mjs} +8 -8
  23. package/dist/{device-android-BjhH0Ru3.mjs → device-android-zgD9We85.mjs} +3 -3
  24. package/dist/{device-capacity-Du5wBTNJ.mjs → device-capacity-Bki6B-7h.mjs} +3 -3
  25. package/dist/device-host-worker.mjs +7 -7
  26. package/dist/{device-ios-CUYUhSYO.mjs → device-ios-TE5ejeXx.mjs} +3 -3
  27. package/dist/{device-lease-run-CHXQEn-7.mjs → device-lease-run-DeNGjJZM.mjs} +3 -3
  28. package/dist/{device-pool-kUHO7MHO.mjs → device-pool-mjyUYaau.mjs} +2 -2
  29. package/dist/{device-provision-e7bKS7lx.mjs → device-provision-j_B7G0e6.mjs} +6 -6
  30. package/dist/{doctor-hva3sd9f.mjs → doctor-BlrcoQ7B.mjs} +10 -10
  31. package/dist/{doctor-B6kIVgU9.mjs → doctor-CNZuvTSe.mjs} +1 -1
  32. package/dist/{doctor-BGcsAgAV.mjs → doctor-sSLtn-j1.mjs} +11 -11
  33. package/dist/{doctor-watchman-DJY550yz.mjs → doctor-watchman-CCuboyj1.mjs} +2 -2
  34. package/dist/{eas-build-CBFgseh1.mjs → eas-build-CaG-Sfs9.mjs} +2 -2
  35. package/dist/{eas-fallback-DFXdz4d6.mjs → eas-fallback-BpX1lpco.mjs} +2 -2
  36. package/dist/{eas-session-ledger-aFBLTZr2.mjs → eas-session-ledger-B-nTfdfk.mjs} +1 -1
  37. package/dist/{error-diagnostics-CCsq_3uG.mjs → error-diagnostics-q56Im4D8.mjs} +3 -3
  38. package/dist/{gc-DASUa3Z_.mjs → gc-By2Kc-Ek.mjs} +2 -2
  39. package/dist/{gc-B0K4d_PL.mjs → gc-Dv6nb9nf.mjs} +10 -10
  40. package/dist/{guide-Civo5-zV.mjs → guide-CwpsGWTJ.mjs} +71 -22
  41. package/dist/{hosted-android-CH1Sm4wo.mjs → hosted-android-c5nPJA6S.mjs} +3 -3
  42. package/dist/{hosted-client-5ur3YpxY.mjs → hosted-client-Hs-fD4L3.mjs} +2 -2
  43. package/dist/{hosted-logs-BYg4yeti.mjs → hosted-logs-BteXG8rm.mjs} +12 -6
  44. package/dist/{hosted-logs-sync-BPe8xnMu.mjs → hosted-logs-sync-B8bjLEMs.mjs} +4 -4
  45. package/dist/{hosted-macos-BagT0Gn3.mjs → hosted-macos-B4byscei.mjs} +4 -4
  46. package/dist/{hosted-native-kaR4nUHk.mjs → hosted-native-Bh9IJ_t5.mjs} +5 -5
  47. package/dist/{idle-shutdown-BWHQ7mQG.mjs → idle-shutdown-BaeCo4ps.mjs} +3 -3
  48. package/dist/{ios-BKR-Dq46.mjs → ios-D1XKSITX.mjs} +8 -8
  49. package/dist/{ios-DUL68MI5.mjs → ios-D3oK9-O4.mjs} +22 -22
  50. package/dist/{ios-device-Dz8gFZ0K.mjs → ios-device-D7Gi3e1I.mjs} +1 -1
  51. package/dist/{ios-project-Br1tVYWX.mjs → ios-project-DDQlX_jX.mjs} +5 -5
  52. package/dist/{js-swap-BfG8XpyS.mjs → js-swap-C8N5DXHl.mjs} +3 -3
  53. package/dist/{launch-CrGndh8T.mjs → launch-DxpvL6il.mjs} +12 -12
  54. package/dist/{lightened-DZ9Ip0T3.mjs → lightened-Df6II_XI.mjs} +2 -2
  55. package/dist/{logs-DpIKWT3A.mjs → logs-CuWJWF88.mjs} +5 -5
  56. package/dist/{logs-C-hfMsxK.mjs → logs-zv3ge7c6.mjs} +3 -3
  57. package/dist/{macos-DZ9ZSolN.mjs → macos-C6U-4Iip.mjs} +14 -14
  58. package/dist/{macos-DNmKwfDy.mjs → macos-CbRZheLw.mjs} +1 -1
  59. package/dist/maintenance-run.mjs +3 -3
  60. package/dist/{metro-request-RDhyx85c.mjs → metro-request-DODHNXCN.mjs} +7 -1
  61. package/dist/{native-android-DExhFqR6.mjs → native-android-9dVFqvTT.mjs} +10 -10
  62. package/dist/{native-gradle-artifact-inputs-Bcmbdc23.mjs → native-gradle-artifact-inputs-BlY97pt8.mjs} +1 -1
  63. package/dist/{native-runtime-D4qgnjK_.mjs → native-runtime-DQfxW5Au.mjs} +3 -3
  64. package/dist/{native-xcode-inputs-EWma1lXh.mjs → native-xcode-inputs-tDuUvSU8.mjs} +1 -1
  65. package/dist/{native-xcode-ios-Y6rzmWTc.mjs → native-xcode-ios-CG-PD-7g.mjs} +11 -11
  66. package/dist/offload-worker.mjs +13 -13
  67. package/dist/{phone-reverses-Drj5QQCh.mjs → phone-reverses-CnNwdz9A.mjs} +1 -1
  68. package/dist/{placement-log-CFT8SnlS.mjs → placement-log-CRL0IY-k.mjs} +1 -1
  69. package/dist/{plan-placement-DhKCH_wF.mjs → plan-placement-2imvnlWP.mjs} +4 -4
  70. package/dist/{ports-BNtJ5DCj.mjs → ports-CKktj5lV.mjs} +1 -1
  71. package/dist/{prebuild-D0hvmO4j.mjs → prebuild-CyNrUWgV.mjs} +5 -5
  72. package/dist/{project-DCLkDM8C.mjs → project-Crtcbfl0.mjs} +11 -11
  73. package/dist/{react-native-android-Dp7vctEA.mjs → react-native-android-Cabe2YER.mjs} +17 -17
  74. package/dist/{react-native-build-vK2lFYfN.mjs → react-native-build-DhWBUV_H.mjs} +4 -4
  75. package/dist/{react-native-doctor-BtWzwZHU.mjs → react-native-doctor-D-twmBon.mjs} +4 -4
  76. package/dist/{react-native-ios-DW1Ax3Yv.mjs → react-native-ios-u_ley41B.mjs} +12 -12
  77. package/dist/{reload-B-d7-CsI.mjs → reload-D2TpUlns.mjs} +6 -6
  78. package/dist/{reload-BS_ntVV_.mjs → reload-f9hvEHE9.mjs} +1 -1
  79. package/dist/{remote-DScVlaMz.mjs → remote-BsBAjlD2.mjs} +6 -6
  80. package/dist/{result-Epkl6gyG.mjs → result-EOsWV6sp.mjs} +10 -10
  81. package/dist/{selection-C95m--1_.mjs → selection-C4ZQz_ER.mjs} +1 -1
  82. package/dist/{server-command-B1gDRJB2.mjs → server-command-BMyKtnjH.mjs} +2 -2
  83. package/dist/{server-expo-CP4dURQp.mjs → server-expo-BLxcN2x2.mjs} +1 -1
  84. package/dist/server-expo-DwR3eD-a.mjs +2 -0
  85. package/dist/{settings-CjTRNCi3.mjs → settings-jeS0WmUF.mjs} +2 -2
  86. package/dist/{settings-payload-zf5EnCTg.mjs → settings-payload-CrX933Xi.mjs} +1 -1
  87. package/dist/{settings-write-Fe0K6BeC.mjs → settings-write-DMcT23Kl.mjs} +2 -2
  88. package/dist/settings.schema.json +2 -2
  89. package/dist/{slot-launch-B4MHzVX2.mjs → slot-launch-CSpQcFZw.mjs} +2 -2
  90. package/dist/{stage-DDrnM0CY.mjs → stage-Cf9uSM1a.mjs} +1 -1
  91. package/dist/{start-LSwIFlBv.mjs → start-CLN_r9EG.mjs} +5 -5
  92. package/dist/{start-BXl5tkv8.mjs → start-CquYgzVf.mjs} +1 -1
  93. package/dist/{stats-EgpYD536.mjs → stats-BVEZuSlg.mjs} +3 -3
  94. package/dist/{status-DBMD7ZQT.mjs → status-Bhdy07v0.mjs} +1 -1
  95. package/dist/{status-BLDvhatv.mjs → status-D0ruTmPl.mjs} +12 -12
  96. package/dist/{status-watch-BwG4lJ1q.mjs → status-watch-DSu_hhg6.mjs} +1 -1
  97. package/dist/status-worker.mjs +1 -1
  98. package/dist/{stop-BfNhzvXO.mjs → stop-B616ZyTv.mjs} +2 -2
  99. package/dist/{stop-4SAV_RR8.mjs → stop-RZqER_Ww.mjs} +2 -2
  100. package/dist/{stop-WyrZQuX6.mjs → stop-W4DK8qZq.mjs} +9 -9
  101. package/dist/supervisor-run.mjs +131 -39
  102. package/dist/{support-Cs24xRQa.mjs → support-NxnD8QXd.mjs} +6 -6
  103. package/dist/{support-Cffz6_Ft.mjs → support-S_5nkkzs.mjs} +3 -3
  104. package/dist/{swiftpm-macos-D0CzQtpp.mjs → swiftpm-macos-Gtq9bNQb.mjs} +2 -2
  105. package/dist/{toolchain-BEra9AIX.mjs → toolchain-B2bN8jEo.mjs} +1 -1
  106. package/dist/{toolchain-CGdgD4x4.mjs → toolchain-Bnm8vUCV.mjs} +2 -2
  107. package/dist/{web-BE89ONcc.mjs → web-BdWG8b5_.mjs} +3 -3
  108. package/dist/web-DwuluWJt.mjs +2 -0
  109. package/dist/web-run.mjs +1 -1
  110. package/dist/{workspaces-BNEyJ1B_.mjs → workspaces-C59v9bpD.mjs} +6 -5
  111. package/dist/{worktree-BTrii9e_.mjs → worktree-CinoSsGy.mjs} +10 -10
  112. package/dist/{worktree-DB3Ypdj6.mjs → worktree-K9F50fD_.mjs} +1 -1
  113. package/package.json +7 -7
  114. package/dist/server-expo-D3k9mvP8.mjs +0 -2
  115. package/dist/web-DQPxvFVD.mjs +0 -2
@@ -1,8 +1,8 @@
1
1
  import { t as ANDROID_AVD_CONFIG_HELP } from "./settings-C6UTYW2K.mjs";
2
- import { i as findProjectRoot$1 } from "./project-DCLkDM8C.mjs";
3
- import { h as RECENT_LAUNCH_MS } from "./eas-session-ledger-aFBLTZr2.mjs";
4
- import { o as guideStatus, t as WATCHMAN_NESTED_WORKTREES } from "./doctor-watchman-DJY550yz.mjs";
5
- import "./status-watch-BwG4lJ1q.mjs";
2
+ import { i as findProjectRoot$1 } from "./project-Crtcbfl0.mjs";
3
+ import { h as RECENT_LAUNCH_MS } from "./eas-session-ledger-B-nTfdfk.mjs";
4
+ import { o as guideStatus, t as WATCHMAN_NESTED_WORKTREES } from "./doctor-watchman-CCuboyj1.mjs";
5
+ import "./status-watch-DSu_hhg6.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
@@ -291,7 +291,8 @@ replacement runs while one is queued. See \`stim guide lifecycle concurrency\`.
291
291
  After maintenance.idleStopHours (default 6) with no Stim command, native run,
292
292
  Metro bundle or HMR request, agent-device command or live view, automatic
293
293
  maintenance stops the workspace as stim stop does. Device and app logs do not
294
- count. After a long pause, run stim ios or android again before driving the
294
+ count. A device hosted on a remote Mac stops with it, and stim-server stops a hosted
295
+ session whose client has been gone that long. After a long pause, run stim ios or android again before driving the
295
296
  app; see \`stim guide cleanup\`.
296
297
 
297
298
  Treat a refusal as an ownership or state mismatch: read its code and remedy.
@@ -2846,7 +2847,7 @@ HOSTED IOS METRO
2846
2847
  Macs; a running Metro or a pin on a port the host uses refuses the run before
2847
2848
  the build. metro.tunnel and metro.publicUrl are ignored. Supervisor restart
2848
2849
  reopens the recorded links; stop or a stopped hosted session closes them. A recorded
2849
- hosted session prevents Metro idle stop. Release runs skip the bridge.
2850
+ hosted session prevents Metro idle stop; maintenance.idleStopHours still stops the workspace and its hosted session (guide cleanup). Release runs skip the bridge.
2850
2851
  Hosted Debug runs require a supervisor and a stim-server that support these
2851
2852
  links before reservation. --no-metro-check refuses; restart a missing or older supervisor
2852
2853
  with stim stop; stim start.
@@ -5673,6 +5674,17 @@ not on any remote" (worktree remove)
5673
5674
  };
5674
5675
  //#endregion
5675
5676
  //#region src/guide/lifecycle.ts
5677
+ const HOSTED_RECORDING = (noun) => `\
5678
+ agent-device record start [path] --remote-config <file> records the ${noun};
5679
+ record stop downloads the video to path, or ./recording-<time>.mp4, on this
5680
+ machine. The host writes it only under the session's private agent-device state
5681
+ and deletes the files after the download, on stim stop or session teardown and
5682
+ when its daemon restarts. One recording runs per session; a second start, a host output
5683
+ path, record inside batch and a record stop from another agent-device session
5684
+ are refused. The host stops a recording after 10 minutes; a record stop within
5685
+ the next 15 minutes downloads it. A finished recording over 512 MiB is deleted
5686
+ instead. A host whose Stim predates hosted recording refuses
5687
+ record as a command outside its allowed list.`;
5676
5688
  const lifecycle = {
5677
5689
  summary: "The full worktree -> start -> ios/android -> logs -> teardown flow, with sections for builds, devices and flags",
5678
5690
  preamble: () => `ENVIRONMENT LIFECYCLE
@@ -6218,7 +6230,7 @@ Status adds android.host { machine, session, selected, agent, device: { name,
6218
6230
  systemImage, api }, state } per slot. The public name is the profile and API
6219
6231
  level, never the host serial or AVD name. ready, stopped and unverified are
6220
6232
  session probe states; a conflicting local emulator remains visible with a
6221
- warning. A recorded placement keeps the workspace in use and blocks idle stop.
6233
+ warning. A recorded placement keeps the workspace in use and blocks the supervisor's idle stop and device reclaim; maintenance.idleStopHours still stops it once the host confirms the session (guide cleanup, IDLE STOP).
6222
6234
 
6223
6235
  stop and worktree remove wait for device-host.stop, park the host's eligible owned
6224
6236
  emulator within pool.androidParkedMax (delete otherwise), close the Metro links and clear placement. stop --json reports
@@ -6240,6 +6252,11 @@ The host verifies the policy digest and android-instance backend before granting
6240
6252
  control. An older host, missing binary or unsupported policy reports driver: none;
6241
6253
  the host's notice explains unavailable control.
6242
6254
 
6255
+ On a local: machine, daemonBaseUrl is http://127.0.0.1:<port> of this
6256
+ workspace's Metro supervisor, which carries each request to the host over its
6257
+ own authenticated device-host connection (host feature hosted-agent-link). It
6258
+ works for Debug runs while stim start runs; Release runs report driver: none.
6259
+
6243
6260
  android.host.agent in stim status --json provides driver, remoteConfig and
6244
6261
  command, never its token. Each slot has a separate 0600 file under the workspace
6245
6262
  state directory at hosted-android/<slot>/agent-device-remote.json. Use that file:
@@ -6255,12 +6272,15 @@ session's tenant. devices is permitted for the client's open flow; inventory
6255
6272
  contains only this emulator. Never use its serial with a local agent-device.
6256
6273
  Allowed commands are devices, open, close, snapshot, diff, wait, find, get, is,
6257
6274
  click, fill, press, type, focus, scroll, screenshot, longpress, swipe, back, home,
6258
- orientation, appstate, alert and batch. Stim installs; install, reinstall,
6259
- uninstall, boot, shutdown, close --shutdown, record, logs, uploads and device-wide
6260
- actions are refused. Other serials in commands, flags, inputs, nested batches or
6261
- lease requests are refused. Ambient client paths and owner fields are stripped;
6262
- the host pins platform, serial, tenant, runId, clientId, deviceKey and backend.
6263
- Host paths and launch inputs are refused. Screenshots use only remote artifacts.
6275
+ orientation, appstate, alert, batch, record start and record stop. Stim installs;
6276
+ install, reinstall, uninstall, boot, shutdown, close --shutdown, logs, uploads and
6277
+ device-wide actions are refused. Other serials in commands, flags, inputs, nested
6278
+ batches or lease requests are refused. Ambient client paths and owner fields are
6279
+ stripped; the host pins platform, serial, tenant, runId, clientId, deviceKey and
6280
+ backend. Host paths and launch inputs are refused. Screenshots use only remote
6281
+ artifacts.
6282
+
6283
+ ${HOSTED_RECORDING("emulator")}
6264
6284
 
6265
6285
  Stop closes the matching agent-device connection and removes the slot file only
6266
6286
  once the host confirms stop or revocation. Reinstall, stop, revocation and server
@@ -6540,6 +6560,11 @@ session and rotates its grant; rerun stim ios to reattach and refresh the config
6540
6560
  An unresolved proxy or daemon retains its claim and blocks reinstall and native
6541
6561
  teardown; clear a named claim only after proving its owner and child are gone.
6542
6562
 
6563
+ On a local: machine, daemonBaseUrl is http://127.0.0.1:<port> of this
6564
+ workspace's Metro supervisor, which carries each request to the host over its
6565
+ own authenticated device-host connection (host feature hosted-agent-link). It
6566
+ works for Debug runs while stim start runs; Release runs report driver: none.
6567
+
6543
6568
  The client writes a separate 0600 remote-config file for each workspace slot.
6544
6569
  Status prints agent: <command>; ios.host.agent in --json carries driver,
6545
6570
  remoteConfig and command, never the token. Use the returned file:
@@ -6561,13 +6586,13 @@ targeting its exact simulator UDID before deleting the simulator, even without c
6561
6586
 
6562
6587
  Allowed: devices, open, close, snapshot, diff, wait, find, get, is, click, fill,
6563
6588
  press, type, focus, scroll, screenshot, longpress, swipe, back, home, orientation,
6564
- appstate, alert and batch. These inspect or interact with the simulator and
6565
- installed apps. devices lists only the session's simulator, filtered by the
6566
- daemon policy. Its device claims are session-local and record / as the workspace;
6589
+ appstate, alert, batch, record start and record stop. These inspect, interact
6590
+ with or record the simulator and installed apps. devices lists only the
6591
+ session's simulator, filtered by the daemon policy. Its device claims are session-local and record / as the workspace;
6567
6592
  a host-side agent-device using the same simulator is not visible to the hosted daemon.
6568
6593
  Client device selectors are stripped and requests are pinned to iOS and that
6569
6594
  UDID; an explicitly named foreign UDID is refused. Selecting another device,
6570
- boot/shutdown/erase, installs, uninstall, uploads, push, record, logs, network,
6595
+ boot/shutdown/erase, installs, uninstall, uploads, push, logs, network,
6571
6596
  perf, trace, clipboard and settings are refused. Stim installs; the agent cannot
6572
6597
  enumerate other host devices or write host files. Ambient client fields (cwd,
6573
6598
  stateDir, config and remoteConfig) are stripped, including inside batch steps.
@@ -6577,6 +6602,8 @@ Only agent-device's generated screenshot temp artifact is accepted and returned
6577
6602
  to the client; arbitrary host screenshot destinations are refused. Runtime
6578
6603
  hints are dropped and only reporting/artifact metadata passes through.
6579
6604
 
6605
+ ${HOSTED_RECORDING("simulator")}
6606
+
6580
6607
  If hosting.agentDriver is none, the driver cannot enforce its policy, or the
6581
6608
  host does not advertise hosted-ios-agent, agent reports
6582
6609
  { driver: 'none', setting: 'hosting.agentDriver' }. Update the host and check
@@ -8849,7 +8876,7 @@ status's maintenance block and the maintenance log.
8849
8876
 
8850
8877
  IDLE STOP: the idle check, and gc --delete unless maintenance.mode is off (its
8851
8878
  dry run lists them in the maintenance plan), stop a workspace whose dev server
8852
- runs or whose owned simulator or emulator is booted once it has had no real
8879
+ runs, whose owned simulator or emulator is booted, or whose device is hosted on a remote Mac once it has had no real
8853
8880
  activity for maintenance.idleStopHours (default 6; 0 never; machine or project
8854
8881
  layers; STIM_MAINTENANCE_IDLE_STOP_HOURS overrides; fractions work). Six hours
8855
8882
  outlasts a lunch break, a meeting or an agent's pause between tasks, and still
@@ -8864,7 +8891,7 @@ only stays connected does not either. The stop is stim stop's: the dev
8864
8891
  server stops, the owned devices shut down through centralized teardown
8865
8892
  (never deleted), and the port is released; device leases stay. A build, a
8866
8893
  held native-run or metro-start lock, a build lock or slot, a running macOS
8867
- app, a hosted or remote session, an unexpired device lease, a managed tunnel
8894
+ app, a remote (EAS) session, an unexpired device lease, a managed tunnel
8868
8895
  or remote lock, a running owned Chrome, a device driver other than
8869
8896
  agent-device, a live agent-device claim with no session activity to judge,
8870
8897
  device activity, an emulator list or an emulator's AVD name that cannot be read keeps
@@ -8877,7 +8904,21 @@ after stim stop, and the supervisor_stopped line in metro.ndjson names
8877
8904
  automatic maintenance and the idle time as the requester. The next start, ios or android starts it
8878
8905
  again. An owned emulator the activity check missed keeps the workspace while
8879
8906
  adb lists it, and so does any emulator adb lists without an AVD name, such as
8880
- a stale offline entry that adb kill-server clears. A dev server that may still run after its supervisor
8907
+ a stale offline entry that adb kill-server clears. A workspace whose iOS, Android or macOS device is hosted on a remote Mac is
8908
+ stopped the same way once the host confirms the session is ready; stim stop's
8909
+ hosted path ends the session and the host parks or tears down the device. A host
8910
+ that does not answer, a session it cannot confirm (unknown, as after a worker
8911
+ crash) and a placement that cannot be read keep the workspace, and a live view of
8912
+ the hosted device is not seen here. On the host, stim-server stops a ready session
8913
+ whose client has had no connection, live stream or Metro link and sent no
8914
+ agent-device request for the host's own machine maintenance.idleStopHours (default 6; 0
8915
+ never; STIM_MAINTENANCE_IDLE_STOP_HOURS overrides), only while its maintenance.mode is on;
8916
+ a project value or maintenance.keep on the client does not reach it. Server downtime is not
8917
+ counted. It uses the stop a person uses, never touches a session whose journal state is
8918
+ preparing, stopping or unknown, or one with a native operation or a claim it cannot prove free
8919
+ (a session a crashed server left ready counts once its claim is proven free),
8920
+ and writes the reason to the server log and the session's idleStop journal field.
8921
+ The count is per client, not per session. A dev server that may still run after its supervisor
8881
8922
  exited is kept until stim stop ends it. So is a dev server whose requests Stim
8882
8923
  does not record: an Expo project before SDK 54, which cannot load Stim's Metro config
8883
8924
  adapter, or a dev server an older Stim started, until stim stop and stim start
@@ -10744,7 +10785,8 @@ STIM_HOME and CI make the mode off unless STIM_MAINTENANCE is set.
10744
10785
  maintenance.keep is a project setting: pin a workspace so a pass never clears
10745
10786
  its build outputs or removes its worktree.
10746
10787
  maintenance.idleStopHours takes machine or project layers, so one workspace can
10747
- stop sooner, later or never.
10788
+ stop sooner, later or never. On a hosting Mac stim-server reads its machine value
10789
+ to stop a hosted session whose client has been gone that long.
10748
10790
  See \`guide cleanup\` for checks, plans and log paths.
10749
10791
 
10750
10792
  ${SETTINGS.filter((setting) => setting.key.startsWith("maintenance.") || /^caches\..*MaxGb$/.test(setting.key)).map((setting) => ` ${setting.key} ${setting.env ?? "project setting"} ${setting.default === void 0 ? "unset" : `default ${setting.default}`}
@@ -10941,7 +10983,10 @@ ticket, which is a credential: whoever spends it first, after setup stores it,
10941
10983
  gets the approval, and on a local network that takes only the ticket and a
10942
10984
  route to the worker, not tailnet membership. Agents show it only to the user.
10943
10985
  Offloaded builds and hosted Debug and
10944
- Release runs work there; agent control of hosted apps needs a tailnet machine.
10986
+ Release runs work there. Agent control of hosted iOS and Android Debug runs
10987
+ goes through a loopback port of this workspace's Metro supervisor, which
10988
+ carries it over its own authenticated connection; Release runs and hosted macOS
10989
+ apps there report agent control as none.
10945
10990
  \`stim-server pair\` puts \`ws://<address>:<port>\` in the phone pairing code
10946
10991
  when Tailscale is not running and \`server.lanAddresses\` is set.
10947
10992
 
@@ -12233,6 +12278,10 @@ backend. Reserved names are case-insensitive and trimmed; they refuse with
12233
12278
  STIM_BAD_ARG before state access or a connection. The device pool switches
12234
12279
  (remote.devicePoolDisabled) also apply to automatic macOS placement.
12235
12280
 
12281
+ A hosted app is not kept forever: the idle workspace stop ends its hosted session
12282
+ after maintenance.idleStopHours without activity, and stim-server stops a session
12283
+ whose client has been gone that long (guide cleanup, IDLE STOP).
12284
+
12236
12285
  Logs: the host records the hosted app's stdout, stderr and exit like a local run.
12237
12286
  stim logs, including --errors, --json and --follow, asks the host over the same
12238
12287
  approved connection, copies the records it has not copied yet into 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-5ur3YpxY.mjs";
3
- import { i as requestHostedMetro } from "./metro-request-RDhyx85c.mjs";
4
- import { a as stopHostedNative, i as prepareHostedNative, r as placeHostedNative } from "./hosted-native-kaR4nUHk.mjs";
2
+ import { c as call, l as connectHost } from "./hosted-client-Hs-fD4L3.mjs";
3
+ import { a as requestHostedMetro } from "./metro-request-DODHNXCN.mjs";
4
+ import { a as stopHostedNative, i as prepareHostedNative, r as placeHostedNative } from "./hosted-native-Bh9IJ_t5.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 { X as diagnoseConnectFailure, ct as resolveEndpoint } from "./config-D5qNWJEP.mjs";
3
- import { t as BuildConnection } from "./client-DhJOvSvh.mjs";
4
- import { g as configuredMachines } from "./selection-C95m--1_.mjs";
3
+ import { t as BuildConnection } from "./client-lDmA-5jx.mjs";
4
+ import { g as configuredMachines } from "./selection-C4ZQz_ER.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-3bF4TB8P.mjs";
3
3
  import { J as validateDeviceSlot, V as deviceSlotFileKey, at as parseMachine$1 } from "./config-D5qNWJEP.mjs";
4
- import { l as phaseLine } from "./command-output-VrXd6qPX.mjs";
4
+ import { l as phaseLine } from "./command-output-CfPW1bKP.mjs";
5
5
  import { n as macosDir } from "./state-CiflgxTP.mjs";
6
6
  import { n as androidLogGroups, r as isAndroidCrashText } from "./android-BeeC15Ve.mjs";
7
7
  import { c as readNdjsonGenerations$1, i as createNdjsonWriter } from "./ndjson-CrjIsGzw.mjs";
8
- import { c as call } from "./hosted-client-5ur3YpxY.mjs";
8
+ import { c as call } from "./hosted-client-Hs-fD4L3.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";
@@ -46,10 +46,16 @@ async function removeAgentAccess(file, keep) {
46
46
  if (path !== keep) rmSync(path, { force: true });
47
47
  }
48
48
  }
49
- async function agentAccess(file, credential, grant, note, platform = "macos") {
49
+ /**
50
+ * Writes the remote config that lets agent-device drive a hosted app and says how to use it. A tailnet machine is
51
+ * reached at its `tailscale serve` route. A local network machine is reached only through `relay`, the loopback port
52
+ * of this workspace's supervisor relay, or not at all when `relay` is the reason there is none.
53
+ */
54
+ async function agentAccess(file, credential, grant, note, platform = "macos", relay = `Agent control of apps hosted on ${credential.machine} over the local network is relayed only for hosted iOS and Android Debug runs.`) {
50
55
  const machine = parseMachine$1(credential.machine);
51
- if (machine?.transport === "local") {
52
- if (grant !== void 0) note(`Agent control of apps hosted on ${credential.machine} needs a tailnet machine; the local network does not carry it.`);
56
+ const local = machine?.transport === "local";
57
+ if (local && typeof relay === "string") {
58
+ if (grant !== void 0) note(relay);
53
59
  await removeAgentAccess(file);
54
60
  return {
55
61
  driver: "none",
@@ -65,7 +71,7 @@ async function agentAccess(file, credential, grant, note, platform = "macos") {
65
71
  const target = client ? join(dirname(file), client.configFile) : file;
66
72
  const access = client && issued ? client.access({
67
73
  grant: issued,
68
- baseUrl: `https://${credential.address}${port === 443 ? "" : `:${port}`}${issued.path}`,
74
+ baseUrl: local ? `http://127.0.0.1:${relay}${issued.path}` : `https://${credential.address}${port === 443 ? "" : `:${port}`}${issued.path}`,
69
75
  file: target,
70
76
  platform
71
77
  }) : null;
@@ -1,8 +1,8 @@
1
- import { n as pullHostedNativeLogs, r as readHostedNativeLogs, t as pullHostedMacosLogs } from "./hosted-logs-BYg4yeti.mjs";
2
- import { l as phaseLine } from "./command-output-VrXd6qPX.mjs";
3
- import { l as connectHost } from "./hosted-client-5ur3YpxY.mjs";
1
+ import { n as pullHostedNativeLogs, r as readHostedNativeLogs, t as pullHostedMacosLogs } from "./hosted-logs-BteXG8rm.mjs";
2
+ import { l as phaseLine } from "./command-output-CfPW1bKP.mjs";
3
+ import { l as connectHost } from "./hosted-client-Hs-fD4L3.mjs";
4
4
  import { n as readHostedIos, t as readHostedAndroid } from "./ios-state-BEIJRJ7P.mjs";
5
- import "./hosted-macos-BagT0Gn3.mjs";
5
+ import "./hosted-macos-B4byscei.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";
@@ -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-BYg4yeti.mjs";
3
- import { l as phaseLine } from "./command-output-VrXd6qPX.mjs";
2
+ import { a as agentAccess, i as closeAgentConnection, o as removeAgentAccess, t as pullHostedMacosLogs } from "./hosted-logs-BteXG8rm.mjs";
3
+ import { l as phaseLine } from "./command-output-CfPW1bKP.mjs";
4
4
  import { n as macosDir } from "./state-CiflgxTP.mjs";
5
- import { st as runCancellationSignal } from "./toolchain-CGdgD4x4.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-5ur3YpxY.mjs";
5
+ import { st as runCancellationSignal } from "./toolchain-Bnm8vUCV.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-Hs-fD4L3.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,9 +1,9 @@
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-3bF4TB8P.mjs";
3
- import { a as agentAccess, i as closeAgentConnection, n as pullHostedNativeLogs, o as removeAgentAccess } from "./hosted-logs-BYg4yeti.mjs";
4
- import { st as runCancellationSignal } from "./toolchain-CGdgD4x4.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-5ur3YpxY.mjs";
6
- import { a as requireHostedMetro, i as requestHostedMetro, n as closeHostedMetro } from "./metro-request-RDhyx85c.mjs";
3
+ import { a as agentAccess, i as closeAgentConnection, n as pullHostedNativeLogs, o as removeAgentAccess } from "./hosted-logs-BteXG8rm.mjs";
4
+ import { st as runCancellationSignal } from "./toolchain-Bnm8vUCV.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-Hs-fD4L3.mjs";
6
+ import { a as requestHostedMetro, n as closeHostedMetro, o as requireHostedMetro, r as hostedAgentPort } from "./metro-request-DODHNXCN.mjs";
7
7
  import { s as writeHostedNative } from "./ios-state-BEIJRJ7P.mjs";
8
8
  import { randomUUID } from "node:crypto";
9
9
  import { readFileSync } from "node:fs";
@@ -268,7 +268,7 @@ async function placeHostedNativeOnce(target, { root, slot, bundle, handoff, bund
268
268
  if (typeof delivery.notice === "string") note(delivery.notice);
269
269
  placement = {
270
270
  ...placement,
271
- agent: await agentAccess(platform === "ios" ? iosAgentRemoteConfig(root, slot) : androidAgentRemoteConfig(root, slot), host.credential, host.connection.supports(platform === "ios" ? "hosted-ios-agent" : "hosted-android-agent") ? delivery.agent : void 0, note, platform)
271
+ agent: await agentAccess(platform === "ios" ? iosAgentRemoteConfig(root, slot) : androidAgentRemoteConfig(root, slot), host.credential, host.connection.supports(platform === "ios" ? "hosted-ios-agent" : "hosted-android-agent") ? delivery.agent : void 0, note, platform, mode !== "development" ? void 0 : !host.connection.supports("hosted-agent-link") ? `${host.machine} runs a stim-server that cannot carry agent control over the local network. Update stim-server there, then retry.` : hostedAgentPort(root, session.id) ?? `The Metro supervisor has no agent relay ready for ${host.machine}. Rerun this command; if it persists, run stim stop; stim start, then retry.`)
272
272
  };
273
273
  return {
274
274
  placement,
@@ -1,10 +1,10 @@
1
1
  import { k as workspaceLogsDir$1, r as readWorkspaceState$1, s as updateWorkspaceStateAsync } from "./workspace-state-3bF4TB8P.mjs";
2
2
  import { H as deviceSlotKey, v as loadConfig$1 } from "./config-D5qNWJEP.mjs";
3
- import { o as formatLongDuration } from "./command-output-VrXd6qPX.mjs";
3
+ import { o as formatLongDuration } from "./command-output-CfPW1bKP.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-BNEyJ1B_.mjs";
5
+ import { B as workspaceBuildInProgress, P as collectOwnedDeviceActivity, ht as teardownOwnedIosSim, pt as teardownOwnedAvd } from "./workspaces-C59v9bpD.mjs";
6
6
  import { t as canonicalPath } from "./paths-BsJMoPP2.mjs";
7
- import { _ as workspaceDeviceLastUseAt } from "./activity-Dw4N_RFe.mjs";
7
+ import { _ as workspaceDeviceLastUseAt } from "./activity-yjH7Q3zn.mjs";
8
8
  import { d as listAllIosSims } from "./ios-CdAV4-1E.mjs";
9
9
  import { join } from "node:path";
10
10
  import { LOG_ROTATE_BYTES } from "@stim-cli/core";
@@ -1,9 +1,9 @@
1
- import { h as shortUdid, i as formatDuration, l as phaseLine, m as shortHash } from "./command-output-VrXd6qPX.mjs";
2
- import { xn as schemesFromInfoPlist, yn as pickDevClientScheme } from "./ccache-DVDO2ocE.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-Cs24xRQa.mjs";
4
- import { n as ensureWorkspaceStorageSafely } from "./native-runtime-D4qgnjK_.mjs";
5
- import { t as devClientScheme } from "./dev-client-DeAg0fso.mjs";
6
- import { c as writeLastBuild, i as iosFacts, n as cacheDescription, o as lastBuildRecord } from "./ios-project-Br1tVYWX.mjs";
7
- import { d as replaceCollector, u as collectorEntry } from "./dependencies-DIU-5rnG.mjs";
8
- import { n as registerIos, r as runIosOperation, t as iosCommand } from "./ios-DUL68MI5.mjs";
1
+ import { h as shortUdid, i as formatDuration, l as phaseLine, m as shortHash } from "./command-output-CfPW1bKP.mjs";
2
+ import { xn as schemesFromInfoPlist, yn as pickDevClientScheme } from "./ccache-BrwGIxmV.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-NxnD8QXd.mjs";
4
+ import { n as ensureWorkspaceStorageSafely } from "./native-runtime-DQfxW5Au.mjs";
5
+ import { t as devClientScheme } from "./dev-client-eDZy6RoX.mjs";
6
+ import { c as writeLastBuild, i as iosFacts, n as cacheDescription, o as lastBuildRecord } from "./ios-project-DDQlX_jX.mjs";
7
+ import { d as replaceCollector, u as collectorEntry } from "./dependencies-DkZ8681S.mjs";
8
+ import { n as registerIos, r as runIosOperation, t as iosCommand } from "./ios-D3oK9-O4.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-3bF4TB8P.mjs";
2
2
  import { G as parseDeviceSlotOption, J as validateDeviceSlot, V as deviceSlotFileKey } from "./config-D5qNWJEP.mjs";
3
- import { _ as stepTimer, g as stepClock, i as formatDuration, l as phaseLine } from "./command-output-VrXd6qPX.mjs";
3
+ import { _ as stepTimer, g as stepClock, i as formatDuration, l as phaseLine } from "./command-output-CfPW1bKP.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-C6UTYW2K.mjs";
5
- import { t as NO_PROJECT_REFUSAL } from "./project-DCLkDM8C.mjs";
5
+ import { t as NO_PROJECT_REFUSAL } from "./project-Crtcbfl0.mjs";
6
6
  import { bt as parkedMaxSetting, mt as POOL_SETTING_REMEDY } from "./android-DsEj2CCs.mjs";
7
- import { En as runProcessOperation, Et as binOnPath, Qt as DEFAULT_METRO_PORT, qn as ownedSessionName, wn as exitAfterFlush } from "./ccache-DVDO2ocE.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-BNEyJ1B_.mjs";
9
- import { $ as cancelledFailure, A as COMPILATION_CACHE_NOT_RUN, ct as withNativeBuildRun, ot as runCancellation, st as runCancellationSignal } from "./toolchain-CGdgD4x4.mjs";
7
+ import { En as runProcessOperation, Et as binOnPath, Qt as DEFAULT_METRO_PORT, qn as ownedSessionName, wn as exitAfterFlush } from "./ccache-BrwGIxmV.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-C59v9bpD.mjs";
9
+ import { $ as cancelledFailure, A as COMPILATION_CACHE_NOT_RUN, ct as withNativeBuildRun, ot as runCancellation, st as runCancellationSignal } from "./toolchain-Bnm8vUCV.mjs";
10
10
  import { i as createIosSimSnapshot } from "./ios-CdAV4-1E.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-DhJOvSvh.mjs";
13
- import { s as parseBuildMachineOption } from "./selection-C95m--1_.mjs";
14
- import { r as hostedMetroSettings } from "./metro-request-RDhyx85c.mjs";
12
+ import { S as setRemoteLogSink, d as simulatorRuntime } from "./client-lDmA-5jx.mjs";
13
+ import { s as parseBuildMachineOption } from "./selection-C4ZQz_ER.mjs";
14
+ import { i as hostedMetroSettings } from "./metro-request-DODHNXCN.mjs";
15
15
  import { i as writeDevicePlacementAsync } from "./ios-state-BEIJRJ7P.mjs";
16
- import { t as devClientPortBusy } from "./hosted-native-kaR4nUHk.mjs";
17
- import { i as restoreLightenedDependencies, n as printLightenedFailure } from "./lightened-DZ9Ip0T3.mjs";
18
- import { f as waitFlagConflict, o as leaseExpiryText } from "./device-lease-run-CHXQEn-7.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-Cs24xRQa.mjs";
20
- import { r as isEasBuildFailure } from "./eas-build-CBFgseh1.mjs";
21
- import { a as iosPoolCandidates, c as isWirelessIosDevice, f as resolveIosPhysicalDevice, o as iosPoolNoCandidatesRefusal, r as iosDeviceBounds } from "./ios-device-Dz8gFZ0K.mjs";
22
- import { i as launchOutcomeRecord, r as isPhysicalDeviceRequest, t as ensureDevServer } from "./native-runtime-D4qgnjK_.mjs";
23
- import "./dev-client-DeAg0fso.mjs";
24
- import { t as didSetUpDevice } from "./device-DuNLOlR6.mjs";
16
+ import { t as devClientPortBusy } from "./hosted-native-Bh9IJ_t5.mjs";
17
+ import { i as restoreLightenedDependencies, n as printLightenedFailure } from "./lightened-Df6II_XI.mjs";
18
+ import { f as waitFlagConflict, o as leaseExpiryText } from "./device-lease-run-DeNGjJZM.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-NxnD8QXd.mjs";
20
+ import { r as isEasBuildFailure } from "./eas-build-CaG-Sfs9.mjs";
21
+ import { a as iosPoolCandidates, c as isWirelessIosDevice, f as resolveIosPhysicalDevice, o as iosPoolNoCandidatesRefusal, r as iosDeviceBounds } from "./ios-device-D7Gi3e1I.mjs";
22
+ import { i as launchOutcomeRecord, r as isPhysicalDeviceRequest, t as ensureDevServer } from "./native-runtime-DQfxW5Au.mjs";
23
+ import "./dev-client-eDZy6RoX.mjs";
24
+ import { t as didSetUpDevice } from "./device-CTozKhU0.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-DH1rT11x.mjs";
27
- import { a as iosLedgerDevice, c as writeLastBuild, o as lastBuildRecord, s as reportIosResult } from "./ios-project-Br1tVYWX.mjs";
28
- import { t as acquireIosArtifact } from "./artifact-Cr34-Yyy.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-DScVlaMz.mjs";
30
- import { i as lanOriginUrlFor, l as verifyIosMetroRun, n as chooseLanAddress, o as finishIosRun, t as DEFAULT_DEPS } from "./dependencies-DIU-5rnG.mjs";
26
+ import { a as refusePlan, i as printPlan, n as planFlagRefusal } from "./build-plan-BK34X2iY.mjs";
27
+ import { a as iosLedgerDevice, c as writeLastBuild, o as lastBuildRecord, s as reportIosResult } from "./ios-project-DDQlX_jX.mjs";
28
+ import { t as acquireIosArtifact } from "./artifact-k1x9Jrn0.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-BsBAjlD2.mjs";
30
+ import { i as lanOriginUrlFor, l as verifyIosMetroRun, n as chooseLanAddress, o as finishIosRun, t as DEFAULT_DEPS } from "./dependencies-DkZ8681S.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";
@@ -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-DVDO2ocE.mjs";
2
+ import { $t as INSTALL_ERROR, rn as appProcessFromPid } from "./ccache-BrwGIxmV.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-3bF4TB8P.mjs";
2
- import { i as formatDuration, l as phaseLine } from "./command-output-VrXd6qPX.mjs";
2
+ import { i as formatDuration, l as phaseLine } from "./command-output-CfPW1bKP.mjs";
3
3
  import { a as workspaceLinkLine } from "./stim-desktop-1XxET4S8.mjs";
4
- import { Mn as isEasAuthFailureText, On as UPLOAD_TIMEOUT_MS, jn as easAuthNote, kn as cacheLevel } from "./ccache-DVDO2ocE.mjs";
5
- import { X as recordFinishedBuild } from "./workspaces-BNEyJ1B_.mjs";
6
- import { A as COMPILATION_CACHE_NOT_RUN, F as compilationCacheActivityLine } from "./toolchain-CGdgD4x4.mjs";
7
- import { i as deviceLabel } from "./support-Cs24xRQa.mjs";
4
+ import { Mn as isEasAuthFailureText, On as UPLOAD_TIMEOUT_MS, jn as easAuthNote, kn as cacheLevel } from "./ccache-BrwGIxmV.mjs";
5
+ import { X as recordFinishedBuild } from "./workspaces-C59v9bpD.mjs";
6
+ import { A as COMPILATION_CACHE_NOT_RUN, F as compilationCacheActivityLine } from "./toolchain-Bnm8vUCV.mjs";
7
+ import { i as deviceLabel } from "./support-NxnD8QXd.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-C6UTYW2K.mjs";
5
- import { Bn as bundleInvocation } from "./ccache-DVDO2ocE.mjs";
6
- import { K as tailLines, M as HEARTBEAT_INTERVAL_MS, W as startBuildHeartbeat } from "./toolchain-CGdgD4x4.mjs";
7
- import { s as expoTelemetryEnv, t as cleanLine } from "./server-expo-CP4dURQp.mjs";
5
+ import { Bn as bundleInvocation } from "./ccache-BrwGIxmV.mjs";
6
+ import { K as tailLines, M as HEARTBEAT_INTERVAL_MS, W as startBuildHeartbeat } from "./toolchain-Bnm8vUCV.mjs";
7
+ import { s as expoTelemetryEnv, t as cleanLine } from "./server-expo-BLxcN2x2.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-3bF4TB8P.mjs";
3
3
  import { D as upsertProject, F as formatBytes, H as deviceSlotKey, T as setDevice, U as deviceSlotPlatforms, V as deviceSlotFileKey, k as withConfigLockAsync, v as loadConfig, w as saveConfig } from "./config-D5qNWJEP.mjs";
4
- import { _ as stepTimer, c as launchErrorReport, i as formatDuration, l as phaseLine, n as appReadinessMessage, v as launchErrorPreview } from "./command-output-VrXd6qPX.mjs";
5
- import { L as workspaceDevServerMode } from "./project-DCLkDM8C.mjs";
4
+ import { _ as stepTimer, c as launchErrorReport, i as formatDuration, l as phaseLine, n as appReadinessMessage, v as launchErrorPreview } from "./command-output-CfPW1bKP.mjs";
5
+ import { L as workspaceDevServerMode } from "./project-Crtcbfl0.mjs";
6
6
  import { o as workspaceLinks } from "./stim-desktop-1XxET4S8.mjs";
7
7
  import { ct as trimAndroidCaches, i as androidDataFreeBytes, rt as resetAdoptedAvd, u as androidToolCwd } from "./android-DsEj2CCs.mjs";
8
8
  import { c as pidExists, f as signalProcessTree } from "./metro-mKHEMO-a.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-DVDO2ocE.mjs";
10
- import { pt as teardownOwnedAvd } from "./workspaces-BNEyJ1B_.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-BrwGIxmV.mjs";
10
+ import { pt as teardownOwnedAvd } from "./workspaces-C59v9bpD.mjs";
11
11
  import { x as providerUploadOutcome } from "./build-cache-BsKim4V7.mjs";
12
- import { t as recordPhoneReverse } from "./phone-reverses-Drj5QQCh.mjs";
12
+ import { t as recordPhoneReverse } from "./phone-reverses-CnNwdz9A.mjs";
13
13
  import { n as verifyCollectorOwnership, r as readCollectors } from "./ownership-CCfiBfOP.mjs";
14
- import { n as nativeRunCommand, r as siblingPlatformSlots, t as launchSlotScope } from "./slot-launch-B4MHzVX2.mjs";
14
+ import { n as nativeRunCommand, r as siblingPlatformSlots, t as launchSlotScope } from "./slot-launch-CSpQcFZw.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-CHXQEn-7.mjs";
17
- import { a as captureNativeCrashes, r as androidCrashClockOffset, s as printNativeCrashReport, t as errorDiagnostics } from "./error-diagnostics-CCsq_3uG.mjs";
18
- import { f as settleFingerprintCheck } from "./prebuild-D0hvmO4j.mjs";
19
- import { i as launchOutcomeRecord } from "./native-runtime-D4qgnjK_.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-Cffz6_Ft.mjs";
21
- import { a as persistLastBuild, n as finishAndroidUpload, s as reportAndroidResult } from "./result-Epkl6gyG.mjs";
16
+ import { c as lostRefusal, s as lostLine, t as DEBUG_VERIFY_STEP_MS } from "./device-lease-run-DeNGjJZM.mjs";
17
+ import { a as captureNativeCrashes, r as androidCrashClockOffset, s as printNativeCrashReport, t as errorDiagnostics } from "./error-diagnostics-q56Im4D8.mjs";
18
+ import { f as settleFingerprintCheck } from "./prebuild-CyNrUWgV.mjs";
19
+ import { i as launchOutcomeRecord } from "./native-runtime-DQfxW5Au.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-S_5nkkzs.mjs";
21
+ import { a as persistLastBuild, n as finishAndroidUpload, s as reportAndroidResult } from "./result-EOsWV6sp.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-3bF4TB8P.mjs";
3
- import { l as phaseLine } from "./command-output-VrXd6qPX.mjs";
3
+ import { l as phaseLine } from "./command-output-CfPW1bKP.mjs";
4
4
  import { Jt as warmWorktreePaths, Lt as podsOutOfSync, Q as resolveSettings, Rt as readWorktreeExclude, kt as listCarryableIgnoredEntries, vt as depsOutOfSync } from "./settings-C6UTYW2K.mjs";
5
5
  import { t as canonicalPath } from "./paths-BsJMoPP2.mjs";
6
- import { m as warmWorktreeTarget } from "./worktree-BTrii9e_.mjs";
6
+ import { m as warmWorktreeTarget } from "./worktree-CinoSsGy.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-3bF4TB8P.mjs";
2
2
  import { G as parseDeviceSlotOption, _ as isPathPrefix$1, v as loadConfig$1 } from "./config-D5qNWJEP.mjs";
3
- import { f as refuseNoProject, v as launchErrorPreview } from "./command-output-VrXd6qPX.mjs";
4
- import { n as findCommandWorkspace } from "./project-DCLkDM8C.mjs";
3
+ import { f as refuseNoProject, v as launchErrorPreview } from "./command-output-CfPW1bKP.mjs";
4
+ import { n as findCommandWorkspace } from "./project-Crtcbfl0.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-C-hfMsxK.mjs";
7
- import { t as errorDiagnostics } from "./error-diagnostics-CCsq_3uG.mjs";
8
- import { n as followHostedLogs } from "./hosted-logs-sync-BPe8xnMu.mjs";
6
+ import { i as followAgentActions, n as openWorkspaceLogs } from "./logs-zv3ge7c6.mjs";
7
+ import { t as errorDiagnostics } from "./error-diagnostics-q56Im4D8.mjs";
8
+ import { n as followHostedLogs } from "./hosted-logs-sync-B8bjLEMs.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-3bF4TB8P.mjs";
3
3
  import { K as projectDeviceSlots, v as loadConfig$1 } from "./config-D5qNWJEP.mjs";
4
- import { f as readAgentDeviceRecordsAsync, n as agentDeviceLiveness, o as envDir } from "./activity-Dw4N_RFe.mjs";
5
- import { o as captureWorkspaceCrashes } from "./error-diagnostics-CCsq_3uG.mjs";
6
- import { n as followHostedLogs, r as syncHostedLogs } from "./hosted-logs-sync-BPe8xnMu.mjs";
4
+ import { f as readAgentDeviceRecordsAsync, n as agentDeviceLiveness, o as envDir } from "./activity-yjH7Q3zn.mjs";
5
+ import { o as captureWorkspaceCrashes } from "./error-diagnostics-q56Im4D8.mjs";
6
+ import { n as followHostedLogs, r as syncHostedLogs } from "./hosted-logs-sync-B8bjLEMs.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";