stim 1.20.0 → 1.20.1

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 (126) hide show
  1. package/dist/{activity-BrGh9EAI.mjs → activity-BaMpUQ4-.mjs} +2 -2
  2. package/dist/{agent-device-usage-output-DVyv_hWj.mjs → agent-device-usage-output-VPaOgGaF.mjs} +3 -3
  3. package/dist/{android-Brx6EKvJ.mjs → android-CLbBJ2ve.mjs} +34 -34
  4. package/dist/{android-CK3fpEyZ.mjs → android-CZh6ElG5.mjs} +1 -1
  5. package/dist/{android-BsYNR81W.mjs → android-DE8-JfGW.mjs} +4 -4
  6. package/dist/{android-cas-DCAuXryb.mjs → android-cas-BFpS84v2.mjs} +1 -1
  7. package/dist/{android-0vv-OruW.mjs → android-eXfIjKJr.mjs} +5 -5
  8. package/dist/api-run.mjs +13 -13
  9. package/dist/{app-install-0LgaQRT7.mjs → app-install-Cg9YJy3x.mjs} +1 -1
  10. package/dist/{artifact-CnC0mfov.mjs → artifact-Ctb2jpw6.mjs} +11 -11
  11. package/dist/{artifact-DClXJNWx.mjs → artifact-DXk_Fle_.mjs} +12 -12
  12. package/dist/{browser-web-CzBmhmgs.mjs → browser-web-xQWC2RWl.mjs} +10 -10
  13. package/dist/{budget-BONq9vXY.mjs → budget-RFbwFpG5.mjs} +11 -11
  14. package/dist/{build-BixRI6sB.mjs → build-COBA1tBc.mjs} +19 -19
  15. package/dist/{build-plan-CP0tckNU.mjs → build-plan-CRjAA6Qi.mjs} +14 -14
  16. package/dist/{ccache-CjHQ5F8g.mjs → ccache-CtbqWxIC.mjs} +3 -3
  17. package/dist/{cli-B2R8wH1F.mjs → cli-sGqlPu1n.mjs} +17 -17
  18. package/dist/cli.mjs +1 -1
  19. package/dist/{client-BLy1Pw2V.mjs → client-zqjFd79D.mjs} +4 -4
  20. package/dist/collector-run.mjs +3 -3
  21. package/dist/{command-output-BjPN99ZB.mjs → command-output-CPDq_90S.mjs} +1 -1
  22. package/dist/{created-devices-HU_DAb_Q.mjs → created-devices-CXBMtoj5.mjs} +1 -1
  23. package/dist/{dev-client-ClATaJoH.mjs → dev-client-BqYjMIaC.mjs} +2 -2
  24. package/dist/{device-B7lsC0K1.mjs → device-BgNj-qVj.mjs} +7 -7
  25. package/dist/{device-DVCwAFlX.mjs → device-D4DqjSZZ.mjs} +9 -9
  26. package/dist/{device-capacity-Ca_ke1LE.mjs → device-capacity-DrwHwR97.mjs} +8 -8
  27. package/dist/device-host-worker.mjs +11 -11
  28. package/dist/{device-ios-CRUqPxKw.mjs → device-ios-DE8KJd3b.mjs} +7 -7
  29. package/dist/{device-lease-DHOBXGgS.mjs → device-lease-C309csaB.mjs} +5 -4
  30. package/dist/{device-lease-run-CvDeHTkG.mjs → device-lease-run-Baelt3nc.mjs} +3 -3
  31. package/dist/{device-pool-L2-5GxMy.mjs → device-pool-DtK9S6AD.mjs} +2 -2
  32. package/dist/{device-remote-Bmg42063.mjs → device-remote-DjsNw8DD.mjs} +11 -11
  33. package/dist/{doctor-C2MSuMMg.mjs → doctor-DiP9HsIP.mjs} +10 -10
  34. package/dist/{doctor-DPAqhVCK.mjs → doctor-Dunu3Nv1.mjs} +17 -17
  35. package/dist/{doctor-watchman-CB4NnVZm.mjs → doctor-watchman-XJzT8tK-.mjs} +5 -4
  36. package/dist/{eas-build-Dw_ec2Km.mjs → eas-build-0gadvrca.mjs} +3 -3
  37. package/dist/{eas-session-ledger-DZlC-Fq3.mjs → eas-session-ledger-DJDeL4Uq.mjs} +1 -1
  38. package/dist/{error-diagnostics-Du7I_GuY.mjs → error-diagnostics-BhQtoLrZ.mjs} +7 -7
  39. package/dist/{gc-PWp34zGb.mjs → gc-D5cz5G0k.mjs} +17 -17
  40. package/dist/{gradle-C2OEKCCI.mjs → gradle-CZZo1TSA.mjs} +4 -4
  41. package/dist/{guide-Dai9lphv.mjs → guide-DakjcoUt.mjs} +31 -166
  42. package/dist/{hosted-android-DQ-Agsd8.mjs → hosted-android-C-D8Dj0_.mjs} +3 -3
  43. package/dist/{hosted-client-Io01s5By.mjs → hosted-client--hNFgixu.mjs} +2 -2
  44. package/dist/{hosted-ios-DIxFnYp-.mjs → hosted-ios-Chx9XQyI.mjs} +1 -1
  45. package/dist/{hosted-logs-DP-ABU_M.mjs → hosted-logs-Bkz0Hxzh.mjs} +5 -5
  46. package/dist/{hosted-macos-Aziw9T_9.mjs → hosted-macos-ckTjN-0V.mjs} +4 -4
  47. package/dist/{hosted-native-BdAQi21M.mjs → hosted-native-3KXZ5-qn.mjs} +5 -5
  48. package/dist/{idle-shutdown-DdMqoSUB.mjs → idle-shutdown-DhAUyf5s.mjs} +6 -6
  49. package/dist/{ios-BZ9dg2Fr.mjs → ios-BDBN-xpf.mjs} +8 -8
  50. package/dist/{ios-CZuv6gRv.mjs → ios-CQ8bHQXB.mjs} +27 -27
  51. package/dist/{ios-device-BreZOpM0.mjs → ios-device-BWHKGaJq.mjs} +1 -1
  52. package/dist/{ios-CXLIUxXJ.mjs → ios-o896T9PE.mjs} +17 -13
  53. package/dist/{ios-project-B9drt_aY.mjs → ios-project-BeOXKPt2.mjs} +7 -7
  54. package/dist/{ios-state-CjrL2qv-.mjs → ios-state-BsXMwo5y.mjs} +1 -1
  55. package/dist/{js-swap-C8icNYIY.mjs → js-swap-Z_mSuRrx.mjs} +2 -2
  56. package/dist/{launch-YrbqaIFj.mjs → launch-BootbMk4.mjs} +34 -34
  57. package/dist/{launch-DxH0THLP.mjs → launch-V1zqiOYn.mjs} +17 -17
  58. package/dist/{launch-verify-BzRdbuO1.mjs → launch-verify-Dl78EVgR.mjs} +2 -2
  59. package/dist/{logs-DHaRNfg7.mjs → logs-Bh4eqCCc.mjs} +9 -9
  60. package/dist/{macos-V_3Ui7g4.mjs → macos-D7irBW3A.mjs} +14 -14
  61. package/dist/macos-kivF8qKz.mjs +2 -0
  62. package/dist/macos-run.mjs +1 -1
  63. package/dist/maintenance-run.mjs +4 -4
  64. package/dist/{metro-D_j9sN-B.mjs → metro-_ZIE3Axg.mjs} +1 -1
  65. package/dist/{metro-gateway-BBJldOdi.mjs → metro-gateway-BzlQZQmU.mjs} +2 -2
  66. package/dist/{miss-reason-BPAzZS0r.mjs → miss-reason-SuTptY-I.mjs} +2 -2
  67. package/dist/{named-ports-C2lvoPsb.mjs → named-ports-O1TIl7tx.mjs} +1 -1
  68. package/dist/{native-android-lHzaew7r.mjs → native-android-D94RlJ-X.mjs} +7 -7
  69. package/dist/{native-runtime-BRmWL7ru.mjs → native-runtime-D024BAvm.mjs} +5 -5
  70. package/dist/{native-xcode-inputs-eutS19jU.mjs → native-xcode-inputs-UElfGs59.mjs} +2 -3
  71. package/dist/{native-xcode-ios-DP3cHLwu.mjs → native-xcode-ios-CjS-nDVY.mjs} +12 -12
  72. package/dist/offload-worker.mjs +12 -12
  73. package/dist/{ownership-DXzMMSx6.mjs → ownership-BrjepDiv.mjs} +2 -2
  74. package/dist/{placement-log-reFbjqEr.mjs → placement-log-BItXET1x.mjs} +1 -1
  75. package/dist/{plan-BDk2AeY_.mjs → plan-Jwu_vr-F.mjs} +8 -8
  76. package/dist/{plan-placement-D_YYlE6N.mjs → plan-placement-B466UYMU.mjs} +3 -3
  77. package/dist/{ports-jzvAJXXL.mjs → ports-BFRL6JTj.mjs} +2 -2
  78. package/dist/{prebuild-Bw44QxVh.mjs → prebuild-DB_zLOLc.mjs} +3 -3
  79. package/dist/{preview-BaBJ72Al.mjs → preview-BRLFRhTz.mjs} +10 -10
  80. package/dist/{project-B8_duAzW.mjs → project-DX8fXyw_.mjs} +107 -43
  81. package/dist/{react-native-android-chm1DMlA.mjs → react-native-android-CuXM3QS8.mjs} +21 -21
  82. package/dist/{react-native-build-oAw6gQeW.mjs → react-native-build-JUF31S8U.mjs} +5 -5
  83. package/dist/{react-native-doctor-DYXoh-6I.mjs → react-native-doctor-BQHqiXaQ.mjs} +4 -4
  84. package/dist/{react-native-ios-SCTK_CT5.mjs → react-native-ios-DtVO4qf2.mjs} +13 -13
  85. package/dist/{reload-D34GkY78.mjs → reload-D9V7D8gP.mjs} +12 -12
  86. package/dist/{remote-BU9UyhCJ.mjs → remote-CZiTijxG.mjs} +5 -5
  87. package/dist/{remote-cache-Bsts6f6Y.mjs → remote-cache-fxcl5C-L.mjs} +3 -3
  88. package/dist/{result-BDoRk1k3.mjs → result-BrfgXtdO.mjs} +7 -7
  89. package/dist/{run-qvff78hv.mjs → run-ClC8UVB5.mjs} +1 -1
  90. package/dist/{server-command-7XIKlWtO.mjs → server-command-DnJYLnr4.mjs} +3 -3
  91. package/dist/{server-expo-CsYu2aKL.mjs → server-expo-CUuzP9Mp.mjs} +1 -1
  92. package/dist/server-expo-Dvkd7JcF.mjs +2 -0
  93. package/dist/{settings-CT3E71-i.mjs → settings-BuKMOANA.mjs} +1 -1
  94. package/dist/settings.schema.json +1 -1
  95. package/dist/{slot-launch-B9hn96wd.mjs → slot-launch-CeCRr6MK.mjs} +5 -5
  96. package/dist/{start-CdvcTaXr.mjs → start-CRkG-mZ7.mjs} +8 -8
  97. package/dist/{start-CbQCSnXQ.mjs → start-mh6bS27z.mjs} +1 -1
  98. package/dist/{state-Boo0IMJq.mjs → state-BUpAmt2r.mjs} +1 -1
  99. package/dist/{state-DI84A-uu.mjs → state-lqxdOH_g.mjs} +5 -4
  100. package/dist/{stats-BIIDrjA8.mjs → stats-CaB1MxMi.mjs} +3 -3
  101. package/dist/{status-DARMkc9q.mjs → status-C7vzkInu.mjs} +20 -20
  102. package/dist/{status-watch-DvmI3SmN.mjs → status-watch-ZaVqRdtW.mjs} +3 -3
  103. package/dist/{stop-iNemHsJC.mjs → stop-BO80KJoT.mjs} +16 -16
  104. package/dist/{stop-CCZS-C9m.mjs → stop-BU7JaFCg.mjs} +2 -2
  105. package/dist/{stop-WQPQHLuy.mjs → stop-Cftw_sXJ.mjs} +5 -5
  106. package/dist/supervisor-run.mjs +13 -13
  107. package/dist/{support-CnE_SIjt.mjs → support-Ca6PZbpr.mjs} +4 -4
  108. package/dist/{support-DCco5fut.mjs → support-Co0wk8Cv.mjs} +8 -8
  109. package/dist/{swiftpm-macos-afeNUExW.mjs → swiftpm-macos-siFSkmCO.mjs} +2 -2
  110. package/dist/{tailnet-CoJUb2tB.mjs → tailnet-D7-tE_ug.mjs} +3 -3
  111. package/dist/toolchain-B12psPA2.mjs +2 -0
  112. package/dist/{toolchain-DqyDXs30.mjs → toolchain-SqehyPLw.mjs} +4 -4
  113. package/dist/{warm-progress-C3ASD6z5.mjs → warm-progress-5FAXkXIg.mjs} +2 -2
  114. package/dist/{watchman-CQl51YZu.mjs → watchman-CqmaGcIb.mjs} +4 -4
  115. package/dist/{web-B3eldHFH.mjs → web-BTjzE8mc.mjs} +5 -5
  116. package/dist/web-CHN5gh34.mjs +2 -0
  117. package/dist/web-run.mjs +4 -4
  118. package/dist/{workspace-state-CSIFuuDa.mjs → workspace-state-CvgTFe-h.mjs} +3 -3
  119. package/dist/{workspaces-D2xSHBDY.mjs → workspaces-C4kqIOlx.mjs} +11 -11
  120. package/dist/{worktree-q7_OZNY0.mjs → worktree-Cgnm6vZt.mjs} +1 -1
  121. package/dist/{worktree-BxDqaTev.mjs → worktree-DtRsh6go.mjs} +23 -23
  122. package/package.json +6 -7
  123. package/dist/macos-C0iljhsN.mjs +0 -2
  124. package/dist/server-expo-DV43vep4.mjs +0 -2
  125. package/dist/toolchain-BIupIro1.mjs +0 -2
  126. package/dist/web-BLXpOe6b.mjs +0 -2
@@ -1,8 +1,8 @@
1
1
  import { t as ANDROID_AVD_CONFIG_HELP } from "./settings-Bbztm4oV.mjs";
2
- import { r as findProjectRoot } from "./project-B8_duAzW.mjs";
3
- import { s as RECENT_LAUNCH_MS } from "./watchman-CQl51YZu.mjs";
4
- import { o as guideStatus, t as WATCHMAN_NESTED_WORKTREES } from "./doctor-watchman-CB4NnVZm.mjs";
5
- import "./status-watch-DvmI3SmN.mjs";
2
+ import { r as findProjectRoot } from "./project-DX8fXyw_.mjs";
3
+ import { s as RECENT_LAUNCH_MS } from "./watchman-CqmaGcIb.mjs";
4
+ import { o as guideStatus, t as WATCHMAN_NESTED_WORKTREES } from "./doctor-watchman-XJzT8tK-.mjs";
5
+ import "./status-watch-ZaVqRdtW.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
@@ -405,7 +405,7 @@ FULL TOPIC LIST
405
405
  stim guide cleanup # what reclaims a device, and what deletes
406
406
  stim guide cleanup collector # an unproven collector pid; why the app on a phone closed
407
407
  stim guide cleanup memory # watchman and Gradle daemon memory; gc --cache watchman
408
- stim guide tutorial # tutorial sections and manual commands
408
+ stim guide tutorial # tutorial sections
409
409
  stim guide tutorial run # create the app and build in a tour worktree
410
410
  stim guide settings # configuration files and supported keys`
411
411
  };
@@ -10260,139 +10260,13 @@ const TUTORIAL_RESTART_PROMPT = "Restart the Stim tutorial.";
10260
10260
  const TUTORIAL_ASKS = {
10261
10261
  begin: `Clone ${TUTORIAL_REPO} into {base} and follow stim guide tutorial run.`,
10262
10262
  build: "Make the title purple in the Stim tutorial app and check it on the simulator.",
10263
- agent: "Open the app on the iOS simulator, take a screenshot and confirm the title color.",
10263
+ parallel: "While that builds, make the Tap me button green in a new worktree and check it on the simulator.",
10264
10264
  finish: "I'm done with these experiments in {base} and don't need the changes. Stop the apps and remove the worktrees {worktrees}, and keep the clone. Follow stim guide tutorial finish.",
10265
10265
  delete: "Remove the Stim tutorial: remove its worktrees and the clone at {base} with stim worktree remove, then delete {base}. Follow stim guide tutorial delete.",
10266
10266
  share: `Open a pull request to ${TUTORIAL_REPO} with my title color change, with before and after screenshots from the simulator. See stim guide tutorial share.`,
10267
10267
  retry: "The first iOS build of the tutorial app in {tour} failed. Find out why and run it on iOS again."
10268
10268
  };
10269
- const TUTORIAL_STEPS = [
10270
- {
10271
- id: "begin",
10272
- title: "Get the Test App",
10273
- who: "agent",
10274
- optional: false,
10275
- ask: TUTORIAL_ASKS.begin,
10276
- section: "run",
10277
- commands: []
10278
- },
10279
- {
10280
- id: "build",
10281
- title: "Make a Change",
10282
- who: "you",
10283
- optional: false,
10284
- ask: TUTORIAL_ASKS.build,
10285
- section: null,
10286
- commands: []
10287
- },
10288
- {
10289
- id: "parallel",
10290
- title: "Change It Again in Parallel",
10291
- who: "you",
10292
- optional: false,
10293
- ask: null,
10294
- section: null,
10295
- commands: []
10296
- },
10297
- {
10298
- id: "device",
10299
- title: "Live View and Control",
10300
- who: "you",
10301
- optional: true,
10302
- ask: null,
10303
- section: null,
10304
- commands: ["stim status"]
10305
- },
10306
- {
10307
- id: "agent",
10308
- title: "Agent Actions and Replay",
10309
- who: "agent",
10310
- optional: true,
10311
- ask: TUTORIAL_ASKS.agent,
10312
- section: null,
10313
- commands: [
10314
- "cd \"{tour}\"",
10315
- "export AGENT_DEVICE_STATE_DIR=\"{stateDir}\"",
10316
- `agent-device open ${TUTORIAL_BUNDLE_ID} --platform ios --udid {udid}`,
10317
- "agent-device screenshot tutorial.png",
10318
- "agent-device close",
10319
- "stim logs --source agent --tail 10"
10320
- ]
10321
- },
10322
- {
10323
- id: "logs",
10324
- title: "App Logs",
10325
- who: "you",
10326
- optional: true,
10327
- ask: null,
10328
- section: null,
10329
- commands: ["stim logs --errors", "stim logs --grep stim:tutorial"]
10330
- },
10331
- {
10332
- id: "phone",
10333
- title: "Watch on Your Phone",
10334
- who: "you",
10335
- optional: true,
10336
- ask: null,
10337
- section: null,
10338
- commands: []
10339
- },
10340
- {
10341
- id: "share",
10342
- title: "Share Your Finish",
10343
- who: "you",
10344
- optional: true,
10345
- ask: TUTORIAL_ASKS.share,
10346
- section: "share",
10347
- commands: [
10348
- "cd \"{tour}\"",
10349
- "git commit -am \"<one-line summary>\"",
10350
- "mkdir -p .expo/screenshots",
10351
- "git checkout origin/main -- theme.js",
10352
- "xcrun simctl io {udid} screenshot .expo/screenshots/before.png",
10353
- "git checkout HEAD -- theme.js",
10354
- "xcrun simctl io {udid} screenshot .expo/screenshots/after.png",
10355
- "cp .github/pull_request_template.md .expo/screenshots/body.md",
10356
- `gh repo fork ${TUTORIAL_REPO} --remote --remote-name fork`,
10357
- "git push -u fork HEAD",
10358
- `gh pr create --repo ${TUTORIAL_REPO} --title "<one-line summary>" --body-file .expo/screenshots/body.md --attach ".expo/screenshots/before.png#Before" --attach ".expo/screenshots/after.png#After"`
10359
- ]
10360
- },
10361
- {
10362
- id: "finish",
10363
- title: "Finish and Archive",
10364
- who: "agent",
10365
- optional: false,
10366
- ask: TUTORIAL_ASKS.finish,
10367
- section: "finish",
10368
- commands: [
10369
- "cd \"{tour}\"",
10370
- "stim stop",
10371
- "cd \"{second}\"",
10372
- "stim stop",
10373
- "cd \"{base}\"",
10374
- "stim worktree remove \"{tour}\"",
10375
- "stim worktree remove \"{second}\""
10376
- ]
10377
- },
10378
- {
10379
- id: "delete",
10380
- title: "Delete the Test App",
10381
- who: "agent",
10382
- optional: true,
10383
- ask: TUTORIAL_ASKS.delete,
10384
- section: "delete",
10385
- commands: [
10386
- "cd \"{base}\"",
10387
- "grep stimTutorial app.json",
10388
- "git worktree list",
10389
- "stim stop",
10390
- "stim worktree remove \"{base}\"",
10391
- "cd ..",
10392
- "rm -rf \"{base}\""
10393
- ]
10394
- }
10395
- ];
10269
+ TUTORIAL_ASKS.begin, TUTORIAL_ASKS.build, TUTORIAL_ASKS.parallel, TUTORIAL_ASKS.share, TUTORIAL_ASKS.finish, TUTORIAL_ASKS.delete;
10396
10270
  //#endregion
10397
10271
  //#region src/guide/tutorial.ts
10398
10272
  const paths = `Use {base} = ~/stim-tutorial unless the user named another folder. Expand ~
@@ -10420,9 +10294,6 @@ Without agent-device, use xcrun simctl io <ios.udid> screenshot
10420
10294
  never booted. Take both with the same tool so they match in size. .expo/ is
10421
10295
  ignored and outside the native fingerprint, so the files are never committed,
10422
10296
  never change the build, and never block stim worktree remove. Keep each PNG under 1 MB.`;
10423
- function commands(id) {
10424
- return TUTORIAL_STEPS.find((step) => step.id === id).commands.join("\n");
10425
- }
10426
10297
  //#endregion
10427
10298
  //#region src/guide/index.ts
10428
10299
  const TOPICS = {
@@ -10444,11 +10315,9 @@ const TOPICS = {
10444
10315
  preamble: () => `STIM TUTORIAL
10445
10316
 
10446
10317
  The tutorial clones ${TUTORIAL_REPO}, a tiny Expo app, into {base}; the clone is
10447
- never run, and only the optional delete step removes it. The user then asks for a visual change, and for another
10448
- change while the first builds. Each change runs in its own linked worktree of
10449
- {base}, so each has its own simulator and Metro port, and the second worktree's
10450
- first iOS build reuses the first one's native build. Only the clone, the
10451
- optional share and the cleanup need this guide: the changes are ordinary
10318
+ never run, and only the optional delete step removes it. The user then asks for a visual change, which runs in a
10319
+ linked worktree of {base} with its own simulator and Metro port. Only the clone,
10320
+ the optional share and the cleanup need this guide: the changes are ordinary
10452
10321
  requests, so follow stim guide agent for them, and check each change on the
10453
10322
  device.
10454
10323
 
@@ -10461,8 +10330,7 @@ ${local}
10461
10330
 
10462
10331
  ${paths}
10463
10332
 
10464
- Never pair phones, approve machines, or grant access on the user's behalf.
10465
- For commands to type yourself, read stim guide tutorial manual.`,
10333
+ Never pair phones, approve machines, or grant access on the user's behalf.`,
10466
10334
  sections: {
10467
10335
  run: {
10468
10336
  summary: "Clone the test app into a fresh folder and install its dependencies",
@@ -10501,10 +10369,20 @@ ${local}
10501
10369
 
10502
10370
  ${screenshots}
10503
10371
 
10372
+ Check each change on the device with agent-device in that same session, after
10373
+ the after screenshot, so Stim Desktop records your actions and the user can
10374
+ replay them: tap tap-button, toggle dark-accent-switch, type a name in
10375
+ name-input, then take a screenshot (agent-device screenshot
10376
+ .expo/screenshots/checked.png) and confirm the change. Refs expire after each
10377
+ action: run agent-device snapshot -i before every action and use the ref it
10378
+ reports for that testID. When agentDevice.installed is false in stim status
10379
+ --json, do not install agent-device unasked: check the change with the build
10380
+ result and stim logs --errors, and tell the user that agent-device would let
10381
+ you tap through the app.
10382
+
10504
10383
  PAUSE: end the turn. Tell the user to ask for a visual change next, such as
10505
- making the title purple, in their own words. Each change runs in a new linked
10506
- worktree of {base} (stim guide agent), and its first iOS build takes a few
10507
- minutes.`
10384
+ making the title purple, in their own words. It runs in a new linked worktree
10385
+ of {base} (stim guide agent), and its first iOS build takes a few minutes.`
10508
10386
  },
10509
10387
  finish: {
10510
10388
  summary: "Stop and remove the two tutorial worktrees, keeping the clone",
@@ -10518,7 +10396,13 @@ as {tour} and {second}. Never touch any other worktree, an earlier tutorial
10518
10396
  clone, or the clone itself. For each, stop from its path, then remove it from
10519
10397
  the clone:
10520
10398
 
10521
- ${commands("finish")}
10399
+ cd "{tour}"
10400
+ stim stop
10401
+ cd "{second}"
10402
+ stim stop
10403
+ cd "{base}"
10404
+ stim worktree remove "{tour}"
10405
+ stim worktree remove "{second}"
10522
10406
 
10523
10407
  Use a plain remove first. The user's finish request says they do not need the
10524
10408
  changes, which is the consent stim guide agent asks for before worktree remove
@@ -10631,25 +10515,6 @@ path; never use --force for them. Reuse the clone at {base} only if its
10631
10515
  stimTutorial marker equals ${TUTORIAL_VERSION}; otherwise follow stim guide
10632
10516
  tutorial run into a fresh folder. Pause as run instructs. Stim Desktop starts
10633
10517
  over: only worktrees and builds after the restart count.`
10634
- },
10635
- manual: {
10636
- summary: "The commands behind each step, for typing yourself",
10637
- body: () => `MANUAL TUTORIAL
10638
-
10639
- ${paths}
10640
-
10641
- Replace {base}, {tour} and {second} with absolute paths: {base} is the clone,
10642
- {tour} the first worktree and {second} the second. For Agent Actions, replace
10643
- {stateDir} with agentDevice.stateDir from stim ios or stim status --json and
10644
- {udid} with the workspace's ios.udid. Clone with git
10645
- clone https://github.com/${TUTORIAL_REPO}.git into a fresh folder outside any
10646
- repository. Each change runs in its own worktree of that clone (stim guide
10647
- agent); the clone itself is never run. Run each worktree on iOS with
10648
- stim ios --remote local --remote-build local so it stays on this Mac.
10649
-
10650
- ${TUTORIAL_STEPS.map((step) => `${step.title}${step.optional ? " (optional)" : ""}\n\n${step.commands.length ? `\`\`\`sh\n${step.commands.join("\n")}\n\`\`\`` : "Ask your agent in your own words, or observe this step in Stim Desktop."}`).join("\n\n")}
10651
-
10652
- Finish removes only the two tutorial worktrees, never the clone; stim guide tutorial finish says when --force is allowed for them.`
10653
10518
  }
10654
10519
  }
10655
10520
  }
@@ -1,6 +1,6 @@
1
- import { o as call, s as connectHost } from "./hosted-client-Io01s5By.mjs";
2
- import { i as requestHostedMetro } from "./metro-gateway-BBJldOdi.mjs";
3
- import { n as prepareHostedNative, r as stopHostedNative, t as placeHostedNative } from "./hosted-native-BdAQi21M.mjs";
1
+ import { o as call, s as connectHost } from "./hosted-client--hNFgixu.mjs";
2
+ import { i as requestHostedMetro } from "./metro-gateway-BzlQZQmU.mjs";
3
+ import { n as prepareHostedNative, r as stopHostedNative, t as placeHostedNative } from "./hosted-native-3KXZ5-qn.mjs";
4
4
  //#region src/device-host/hosted-android.ts
5
5
  async function prepareHostedAndroid(machine, selectors, recorded, mode) {
6
6
  return await prepareHostedNative(machine, selectors, recorded, "android", false, mode);
@@ -1,5 +1,5 @@
1
- import { c as pinnedEndpoint$1 } from "./tailnet-CoJUb2tB.mjs";
2
- import { t as BuildConnection, x as configuredMachines } from "./client-BLy1Pw2V.mjs";
1
+ import { c as pinnedEndpoint$1 } from "./tailnet-D7-tE_ug.mjs";
2
+ import { t as BuildConnection, x as configuredMachines } from "./client-zqjFd79D.mjs";
3
3
  import { lstatSync, readFileSync, readdirSync, readlinkSync } from "node:fs";
4
4
  import { join } from "node:path";
5
5
  import { HOSTED_APP_CHUNK_BYTES, hostedMacosAppSlot, isJsonObject, readDeviceHostMachines } from "@stim-cli/core/state";
@@ -1,4 +1,4 @@
1
- import { n as prepareHostedNative, r as stopHostedNative, t as placeHostedNative } from "./hosted-native-BdAQi21M.mjs";
1
+ import { n as prepareHostedNative, r as stopHostedNative, t as placeHostedNative } from "./hosted-native-3KXZ5-qn.mjs";
2
2
  //#region src/device-host/hosted-ios.ts
3
3
  async function prepareHostedIos(machine, selectors, recorded, mode) {
4
4
  return await prepareHostedNative(machine, selectors, recorded, "ios", false, mode);
@@ -1,11 +1,11 @@
1
1
  import { t as getExecutor } from "./exec-B81Qodjn.mjs";
2
2
  import { L as deviceSlotFileKey, W as validateDeviceSlot } from "./config-D0LhTY3S.mjs";
3
- import { w as workspaceLogsDir$1, x as workspaceDir } from "./workspace-state-CSIFuuDa.mjs";
4
- import { l as phaseLine } from "./command-output-BjPN99ZB.mjs";
5
- import { o as parseMachine$1 } from "./tailnet-CoJUb2tB.mjs";
3
+ import { w as workspaceLogsDir$1, x as workspaceDir } from "./workspace-state-CvgTFe-h.mjs";
4
+ import { l as phaseLine } from "./command-output-CPDq_90S.mjs";
5
+ import { o as parseMachine$1 } from "./tailnet-D7-tE_ug.mjs";
6
6
  import { r as createNdjsonWriter } from "./ndjson-GOnbyvso.mjs";
7
- import { n as macosDir } from "./state-Boo0IMJq.mjs";
8
- import { o as call } from "./hosted-client-Io01s5By.mjs";
7
+ import { n as macosDir } from "./state-BUpAmt2r.mjs";
8
+ import { o as call } from "./hosted-client--hNFgixu.mjs";
9
9
  import { mkdirSync, readFileSync, realpathSync, renameSync, rmSync, writeFileSync } from "node:fs";
10
10
  import { dirname, join } from "node:path";
11
11
  import { isJsonObject, parseHostedAgentGrant, parseHostedLogsCursor } from "@stim-cli/core/state";
@@ -1,7 +1,7 @@
1
- import { l as phaseLine } from "./command-output-BjPN99ZB.mjs";
2
- import { n as macosDir } from "./state-Boo0IMJq.mjs";
3
- import { a as bundleManifest, c as heldNoLonger, f as settle, g as upload, h as unknownSession, i as attach, l as hostedSession, m as sleep, n as PREPARE_TIMEOUT_MS, o as call, p as sha256, r as SESSION_TIMEOUT_MS, s as connectHost, t as INSTALL_TIMEOUT_MS } from "./hosted-client-Io01s5By.mjs";
4
- import { i as agentAccess, r as closeAgentConnection, t as pullHostedMacosLogs } from "./hosted-logs-DP-ABU_M.mjs";
1
+ import { l as phaseLine } from "./command-output-CPDq_90S.mjs";
2
+ import { n as macosDir } from "./state-BUpAmt2r.mjs";
3
+ import { a as bundleManifest, c as heldNoLonger, f as settle, g as upload, h as unknownSession, i as attach, l as hostedSession, m as sleep, n as PREPARE_TIMEOUT_MS, o as call, p as sha256, r as SESSION_TIMEOUT_MS, s as connectHost, t as INSTALL_TIMEOUT_MS } from "./hosted-client--hNFgixu.mjs";
4
+ import { i as agentAccess, r as closeAgentConnection, t as pullHostedMacosLogs } from "./hosted-logs-Bkz0Hxzh.mjs";
5
5
  import { rmSync } from "node:fs";
6
6
  import { join } from "node:path";
7
7
  import { hostedMacosBundleId, parseHostedMacosDevice, validHostedAppArguments } from "@stim-cli/core/state";
@@ -1,8 +1,8 @@
1
- import { r as readWorkspaceState$1, x as workspaceDir } from "./workspace-state-CSIFuuDa.mjs";
2
- import { a as bundleManifest, c as heldNoLonger, d as requireHostedAppMode, f as settle, g as upload, h as unknownSession, i as attach, l as hostedSession, m as sleep, n as PREPARE_TIMEOUT_MS, o as call, p as sha256, r as SESSION_TIMEOUT_MS, s as connectHost, t as INSTALL_TIMEOUT_MS } from "./hosted-client-Io01s5By.mjs";
3
- import { i as agentAccess, n as pullHostedNativeLogs, r as closeAgentConnection } from "./hosted-logs-DP-ABU_M.mjs";
4
- import { a as requireHostedMetro, i as requestHostedMetro, n as closeHostedMetro } from "./metro-gateway-BBJldOdi.mjs";
5
- import { s as writeHostedNative } from "./ios-state-CjrL2qv-.mjs";
1
+ import { r as readWorkspaceState$1, x as workspaceDir } from "./workspace-state-CvgTFe-h.mjs";
2
+ import { a as bundleManifest, c as heldNoLonger, d as requireHostedAppMode, f as settle, g as upload, h as unknownSession, i as attach, l as hostedSession, m as sleep, n as PREPARE_TIMEOUT_MS, o as call, p as sha256, r as SESSION_TIMEOUT_MS, s as connectHost, t as INSTALL_TIMEOUT_MS } from "./hosted-client--hNFgixu.mjs";
3
+ import { i as agentAccess, n as pullHostedNativeLogs, r as closeAgentConnection } from "./hosted-logs-Bkz0Hxzh.mjs";
4
+ import { a as requireHostedMetro, i as requestHostedMetro, n as closeHostedMetro } from "./metro-gateway-BzlQZQmU.mjs";
5
+ import { s as writeHostedNative } from "./ios-state-BsXMwo5y.mjs";
6
6
  import { readFileSync, rmSync } from "node:fs";
7
7
  import { join } from "node:path";
8
8
  import { hostedNativeRecords, isJsonObject, parseHostedAndroidDevice, parseHostedChoice, parseHostedDevice, parseHostedNativeOffer, parseHostedNativePlacement, requireAutomaticMachine, unreadableHostedNative } from "@stim-cli/core/state";
@@ -1,10 +1,10 @@
1
1
  import { R as deviceSlotKey, _ as loadConfig$1 } from "./config-D0LhTY3S.mjs";
2
- import { a as updateWorkspaceState, r as readWorkspaceState$1 } from "./workspace-state-CSIFuuDa.mjs";
3
- import { o as formatLongDuration } from "./command-output-BjPN99ZB.mjs";
4
- import { T as canonicalPath, b as teardownOwnedIosSim, v as teardownOwnedAvd } from "./workspaces-D2xSHBDY.mjs";
5
- import { f as collectOwnedDeviceActivity, g as workspaceBuildInProgress } from "./budget-BONq9vXY.mjs";
6
- import { m as workspaceDeviceLastUseAt } from "./activity-BrGh9EAI.mjs";
7
- import { d as listAllIosSims } from "./ios-CXLIUxXJ.mjs";
2
+ import { a as updateWorkspaceState, r as readWorkspaceState$1 } from "./workspace-state-CvgTFe-h.mjs";
3
+ import { o as formatLongDuration } from "./command-output-CPDq_90S.mjs";
4
+ import { T as canonicalPath, b as teardownOwnedIosSim, v as teardownOwnedAvd } from "./workspaces-C4kqIOlx.mjs";
5
+ import { f as collectOwnedDeviceActivity, g as workspaceBuildInProgress } from "./budget-RFbwFpG5.mjs";
6
+ import { m as workspaceDeviceLastUseAt } from "./activity-BaMpUQ4-.mjs";
7
+ import { d as listAllIosSims } from "./ios-o896T9PE.mjs";
8
8
  import { DEVICE_IDLE_SHUTDOWN_KEY, DEVICE_RECLAIM_REASON, readDeviceIdleShutdowns } from "@stim-cli/core/state";
9
9
  //#region src/devices/idle-shutdown.ts
10
10
  const SIM_LIST_TIMEOUT_MS = 1e4;
@@ -1,9 +1,9 @@
1
- import { h as shortUdid, i as formatDuration, l as phaseLine, m as shortHash } from "./command-output-BjPN99ZB.mjs";
2
- import { D as schemesFromInfoPlist, T as pickDevClientScheme } from "./app-install-0LgaQRT7.mjs";
3
- import { n as ensureWorkspaceStorageSafely } from "./native-runtime-BRmWL7ru.mjs";
4
- import { t as devClientScheme } from "./dev-client-ClATaJoH.mjs";
5
- 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-DCco5fut.mjs";
6
- import { a as lastBuildRecord, i as iosFacts, n as cacheDescription, s as writeLastBuild } from "./ios-project-B9drt_aY.mjs";
7
- import { n as registerIos, r as runIosOperation, t as iosCommand } from "./ios-CZuv6gRv.mjs";
8
- import { a as collectorEntry, o as replaceCollector } from "./launch-YrbqaIFj.mjs";
1
+ import { h as shortUdid, i as formatDuration, l as phaseLine, m as shortHash } from "./command-output-CPDq_90S.mjs";
2
+ import { D as schemesFromInfoPlist, T as pickDevClientScheme } from "./app-install-Cg9YJy3x.mjs";
3
+ import { n as ensureWorkspaceStorageSafely } from "./native-runtime-D024BAvm.mjs";
4
+ import { t as devClientScheme } from "./dev-client-BqYjMIaC.mjs";
5
+ 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-Co0wk8Cv.mjs";
6
+ import { a as lastBuildRecord, i as iosFacts, n as cacheDescription, s as writeLastBuild } from "./ios-project-BeOXKPt2.mjs";
7
+ import { n as registerIos, r as runIosOperation, t as iosCommand } from "./ios-CQ8bHQXB.mjs";
8
+ import { a as collectorEntry, o as replaceCollector } from "./launch-BootbMk4.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,34 +1,34 @@
1
1
  import { L as deviceSlotFileKey, V as parseDeviceSlotOption, W as validateDeviceSlot } from "./config-D0LhTY3S.mjs";
2
2
  import { C as iosSigningIdentitySha1Setting, I as projectSettingsContext, L as publicUrlSetting, N as metroWarmupUrlSetting, S as iosSigningIdentitySettingError, _ as iosLanHostSetting, a as SETTING_SHAPE_REMEDY, g as deviceReclaimIdleMinutesSetting, j as metroPortSetting, tt as tunnelModeSetting, v as iosLanHostSettingError, w as iosSigningIdentitySha1SettingError, x as iosSigningIdentitySetting } from "./settings-Bbztm4oV.mjs";
3
- import { i as recordWorkspaceUse, w as workspaceLogsDir$1 } from "./workspace-state-CSIFuuDa.mjs";
4
- import { _ as stepTimer, g as stepClock, i as formatDuration, l as phaseLine } from "./command-output-BjPN99ZB.mjs";
5
- import { I as workspaceDevServerMode, t as NO_PROJECT_REFUSAL } from "./project-B8_duAzW.mjs";
6
- import { at as POOL_SETTING_REMEDY, dt as parkedMaxSetting } from "./android-BsYNR81W.mjs";
7
- import { At as createRunRecorder, It as statsProjectKey$1, Ot as startBuildProgress, kt as tapBuildLog, yt as NO_BUILD_PROGRESS } from "./budget-BONq9vXY.mjs";
8
- import { S as withNativeBuildRun, b as runCancellation, p as cancelledFailure, x as runCancellationSignal } from "./tailnet-CoJUb2tB.mjs";
3
+ import { i as recordWorkspaceUse, w as workspaceLogsDir$1 } from "./workspace-state-CvgTFe-h.mjs";
4
+ import { _ as stepTimer, g as stepClock, i as formatDuration, l as phaseLine } from "./command-output-CPDq_90S.mjs";
5
+ import { I as workspaceDevServerMode, t as NO_PROJECT_REFUSAL } from "./project-DX8fXyw_.mjs";
6
+ import { at as POOL_SETTING_REMEDY, dt as parkedMaxSetting } from "./android-DE8-JfGW.mjs";
7
+ import { At as createRunRecorder, It as statsProjectKey$1, Ot as startBuildProgress, kt as tapBuildLog, yt as NO_BUILD_PROGRESS } from "./budget-RFbwFpG5.mjs";
8
+ import { S as withNativeBuildRun, b as runCancellation, p as cancelledFailure, x as runCancellationSignal } from "./tailnet-D7-tE_ug.mjs";
9
9
  import { d as optimizationBuildProfile, l as artifactCachePolicy } from "./errors-DzkMYh8Q.mjs";
10
- import { o as exitAfterFlush } from "./remote-cache-Bsts6f6Y.mjs";
11
- import { d as simulatorRuntime, f as setRemoteLogSink, g as parseBuildMachineOption } from "./client-BLy1Pw2V.mjs";
12
- import { i as createIosSimSnapshot } from "./ios-CXLIUxXJ.mjs";
13
- import { r as DEFAULT_METRO_PORT } from "./app-install-0LgaQRT7.mjs";
14
- import { r as isPhysicalDeviceRequest, t as ensureDevServer } from "./native-runtime-BRmWL7ru.mjs";
15
- import { _ as COMPILATION_CACHE_NOT_RUN } from "./toolchain-DqyDXs30.mjs";
16
- import "./dev-client-ClATaJoH.mjs";
17
- import { f as waitFlagConflict, o as leaseExpiryText } from "./device-lease-run-CvDeHTkG.mjs";
18
- import { r as hostedMetroSettings } from "./metro-gateway-BBJldOdi.mjs";
19
- import { i as writeDevicePlacement } from "./ios-state-CjrL2qv-.mjs";
20
- import { a as refusePlan, i as printPlan, n as planFlagRefusal } from "./build-plan-CP0tckNU.mjs";
21
- import { r as siblingPlatformSlots, t as launchSlotScope } from "./slot-launch-B9hn96wd.mjs";
22
- import { S as ownedSessionName, n as binOnPath } from "./device-remote-Bmg42063.mjs";
23
- import { r as isEasBuildFailure } from "./eas-build-Dw_ec2Km.mjs";
24
- import { t as didSetUpDevice } from "./device-DVCwAFlX.mjs";
10
+ import { o as exitAfterFlush } from "./remote-cache-fxcl5C-L.mjs";
11
+ import { d as simulatorRuntime, f as setRemoteLogSink, g as parseBuildMachineOption } from "./client-zqjFd79D.mjs";
12
+ import { i as createIosSimSnapshot } from "./ios-o896T9PE.mjs";
13
+ import { r as DEFAULT_METRO_PORT } from "./app-install-Cg9YJy3x.mjs";
14
+ import { r as isPhysicalDeviceRequest, t as ensureDevServer } from "./native-runtime-D024BAvm.mjs";
15
+ import { _ as COMPILATION_CACHE_NOT_RUN } from "./toolchain-SqehyPLw.mjs";
16
+ import "./dev-client-BqYjMIaC.mjs";
17
+ import { f as waitFlagConflict, o as leaseExpiryText } from "./device-lease-run-Baelt3nc.mjs";
18
+ import { r as hostedMetroSettings } from "./metro-gateway-BzlQZQmU.mjs";
19
+ import { i as writeDevicePlacement } from "./ios-state-BsXMwo5y.mjs";
20
+ import { a as refusePlan, i as printPlan, n as planFlagRefusal } from "./build-plan-CRjAA6Qi.mjs";
21
+ import { r as siblingPlatformSlots, t as launchSlotScope } from "./slot-launch-CeCRr6MK.mjs";
22
+ import { S as ownedSessionName, n as binOnPath } from "./device-remote-DjsNw8DD.mjs";
23
+ import { r as isEasBuildFailure } from "./eas-build-0gadvrca.mjs";
24
+ import { t as didSetUpDevice } from "./device-D4DqjSZZ.mjs";
25
25
  import { t as unsupportedPlan } from "./project-plan-BPwbLwQu.mjs";
26
- 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-DCco5fut.mjs";
27
- import { a as lastBuildRecord, o as reportIosResult, s as writeLastBuild } from "./ios-project-B9drt_aY.mjs";
28
- import { t as acquireIosArtifact } from "./artifact-CnC0mfov.mjs";
29
- import { a as iosPlacementBudget, i as hostedIosSelectors, n as connectIosTarget, o as selectIosPlacement, r as hostedIosMetroNote, t as connectIosBackend } from "./remote-BU9UyhCJ.mjs";
30
- import { a as iosPoolCandidates, c as isWirelessIosDevice, f as resolveIosPhysicalDevice, o as iosPoolNoCandidatesRefusal, r as iosDeviceBounds } from "./ios-device-BreZOpM0.mjs";
31
- import { i as DEFAULT_DEPS, l as lanOriginUrlFor, s as chooseLanAddress, t as finishIosRun } from "./launch-YrbqaIFj.mjs";
26
+ 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-Co0wk8Cv.mjs";
27
+ import { a as lastBuildRecord, o as reportIosResult, s as writeLastBuild } from "./ios-project-BeOXKPt2.mjs";
28
+ import { t as acquireIosArtifact } from "./artifact-Ctb2jpw6.mjs";
29
+ import { a as iosPlacementBudget, i as hostedIosSelectors, n as connectIosTarget, o as selectIosPlacement, r as hostedIosMetroNote, t as connectIosBackend } from "./remote-CZiTijxG.mjs";
30
+ import { a as iosPoolCandidates, c as isWirelessIosDevice, f as resolveIosPhysicalDevice, o as iosPoolNoCandidatesRefusal, r as iosDeviceBounds } from "./ios-device-BWHKGaJq.mjs";
31
+ import { i as DEFAULT_DEPS, l as lanOriginUrlFor, s as chooseLanAddress, t as finishIosRun } from "./launch-BootbMk4.mjs";
32
32
  import { basename, join } from "node:path";
33
33
  import { hostedIosStatus, parseMachine } from "@stim-cli/core/state";
34
34
  import { workspaceId } from "@stim-cli/core";
@@ -1,6 +1,6 @@
1
1
  import { t as getExecutor } from "./exec-B81Qodjn.mjs";
2
2
  import { n as TOOL_ERROR_PREFIX } from "./ios-device-B1B14xND.mjs";
3
- import { i as INSTALL_ERROR } from "./app-install-0LgaQRT7.mjs";
3
+ import { i as INSTALL_ERROR } from "./app-install-Cg9YJy3x.mjs";
4
4
  import { mkdtempSync, readFileSync, rmSync } from "node:fs";
5
5
  import { join } from "node:path";
6
6
  import { tmpdir } from "node:os";
@@ -2,11 +2,11 @@ import { t as getExecutor } from "./exec-B81Qodjn.mjs";
2
2
  import { _ as loadConfig$1, j as formatBytes } from "./config-D0LhTY3S.mjs";
3
3
  import { n as stripAnsi, r as waitForChild, t as createLineReader } from "./process-output-Fpl8PYi8.mjs";
4
4
  import { n as settingDefault, t as STIM_DESKTOP_OPEN_OPTIONS } from "./stim-desktop-8GQX2OV8.mjs";
5
- import { it as isStimOwnedSim } from "./android-BsYNR81W.mjs";
6
- import { r as recordCreatedDevice, t as forgetCreatedDevice } from "./created-devices-HU_DAb_Q.mjs";
5
+ import { it as isStimOwnedSim } from "./android-DE8-JfGW.mjs";
6
+ import { r as recordCreatedDevice, t as forgetCreatedDevice } from "./created-devices-CXBMtoj5.mjs";
7
7
  import { closeSync, existsSync, lstatSync, mkdtempSync, openSync, readSync, readdirSync, rmSync, writeFileSync } from "node:fs";
8
8
  import { dirname, isAbsolute, join, resolve } from "node:path";
9
- import { IOS_SIMULATOR_APPS, settingDefinition } from "@stim-cli/core/state";
9
+ import { IOS_SIMULATOR_APPS, isJsonObject, settingDefinition } from "@stim-cli/core/state";
10
10
  import { createHash } from "node:crypto";
11
11
  import { tmpdir, totalmem } from "node:os";
12
12
  //#region src/engine/installed-artifact.ts
@@ -577,10 +577,15 @@ function listIosDeviceTypes() {
577
577
  timeoutMs: 3e4,
578
578
  killSignal: "SIGKILL"
579
579
  });
580
- return (JSON.parse(out).devicetypes || []).map((dt) => ({
581
- identifier: dt.identifier,
582
- name: dt.name
583
- }));
580
+ const data = JSON.parse(out);
581
+ return isJsonObject(data) ? deviceTypesOf(data.devicetypes) : [];
582
+ }
583
+ function deviceTypesOf(value) {
584
+ if (!Array.isArray(value)) return [];
585
+ return value.flatMap((entry) => isJsonObject(entry) && typeof entry.identifier === "string" && typeof entry.name === "string" ? [{
586
+ identifier: entry.identifier,
587
+ name: entry.name
588
+ }] : []);
584
589
  }
585
590
  function rankIphone(name) {
586
591
  const gen = /^iPhone\s+(\d+)/i.exec(name);
@@ -874,15 +879,14 @@ async function listIosRuntimesAsync() {
874
879
  return parseIosRuntimes(await getExecutor().runFileAsync("xcrun", LIST_RUNTIMES_ARGS, LIST_RUNTIMES_OPTIONS));
875
880
  }
876
881
  function parseIosRuntimes(out) {
877
- return (JSON.parse(out).runtimes || []).filter((r) => r.isAvailable && r.platform === "iOS").map((r) => ({
882
+ const data = JSON.parse(out);
883
+ if (!isJsonObject(data) || !Array.isArray(data.runtimes)) return [];
884
+ return data.runtimes.flatMap((r) => isJsonObject(r) && r.isAvailable === true && r.platform === "iOS" && typeof r.identifier === "string" && typeof r.name === "string" && typeof r.version === "string" ? [{
878
885
  identifier: r.identifier,
879
886
  name: r.name,
880
887
  version: r.version,
881
- supportedDeviceTypes: (r.supportedDeviceTypes || []).map((d) => ({
882
- identifier: d.identifier,
883
- name: d.name
884
- }))
885
- }));
888
+ supportedDeviceTypes: deviceTypesOf(r.supportedDeviceTypes)
889
+ }] : []);
886
890
  }
887
891
  //#endregion
888
892
  export { configuredIosSimulatorViewer as A, resetIosKeychain as C, sanitizeDeviceLabel as D, resolveOwnedIosSim as E, memoryCulpritAdvice as F, memoryCulpritFindings as I, readMemoryCulprits as L, hostMemoryPressureAdvice as M, memoryCulpritsUnder as N, shutdownIosSim as O, readHostMemoryPressure as P, deviceHoldsApk as R, renameIosSim as S, resolveIosCreation as T, ownedSimName as _, createOwnedIosSim as a, parseSimctlList as b, eraseIosSim as c, listAllIosSims as d, listAllIosSimsAsync as f, listUserApps as g, listIosRuntimesAsync as h, createIosSimSnapshot as i, parseIosSimulatorApp as j, uninstallIosApp as k, iosRuntimeMatches as l, listIosRuntimes as m, bootIosSim as n, deleteIosSim as o, listIosDeviceTypes as p, clearIosAppData as r, deleteParkedIosSim as s, IOS_BOOT_TIMEOUT_MS as t, iosSimulatorFailureAdvice as u, parkedSimName as v, resetIosPrivacy as w, pickDefaultIosCreation as x, parseRuntimeVersion as y, deviceHoldsBundle as z };
@@ -1,11 +1,11 @@
1
- import { y as workspaceAgentDeviceDir } from "./workspace-state-CSIFuuDa.mjs";
2
- import { i as formatDuration, l as phaseLine } from "./command-output-BjPN99ZB.mjs";
1
+ import { y as workspaceAgentDeviceDir } from "./workspace-state-CvgTFe-h.mjs";
2
+ import { i as formatDuration, l as phaseLine } from "./command-output-CPDq_90S.mjs";
3
3
  import { i as workspaceLinkLine } from "./stim-desktop-8GQX2OV8.mjs";
4
- import { Dt as recordFinishedBuild } from "./budget-BONq9vXY.mjs";
5
- import { a as easAuthNote, n as UPLOAD_TIMEOUT_MS, r as cacheLevel, s as isEasAuthFailureText } from "./remote-cache-Bsts6f6Y.mjs";
6
- import "./launch-verify-BzRdbuO1.mjs";
7
- import { S as compilationCacheActivityLine, _ as COMPILATION_CACHE_NOT_RUN } from "./toolchain-DqyDXs30.mjs";
8
- import { i as deviceLabel } from "./support-DCco5fut.mjs";
4
+ import { Dt as recordFinishedBuild } from "./budget-RFbwFpG5.mjs";
5
+ import { a as easAuthNote, n as UPLOAD_TIMEOUT_MS, r as cacheLevel, s as isEasAuthFailureText } from "./remote-cache-fxcl5C-L.mjs";
6
+ import "./launch-verify-Dl78EVgR.mjs";
7
+ import { S as compilationCacheActivityLine, _ as COMPILATION_CACHE_NOT_RUN } from "./toolchain-SqehyPLw.mjs";
8
+ import { i as deviceLabel } from "./support-Co0wk8Cv.mjs";
9
9
  import { buildDiagnostics } from "@stim-cli/core/state";
10
10
  import chalk from "chalk";
11
11
  //#region src/commands/ios/result.ts
@@ -1,4 +1,4 @@
1
- import { a as updateWorkspaceState, r as readWorkspaceState$1 } from "./workspace-state-CSIFuuDa.mjs";
1
+ import { a as updateWorkspaceState, r as readWorkspaceState$1 } from "./workspace-state-CvgTFe-h.mjs";
2
2
  import { HOSTED_METRO_REQUESTS_KEY, hostedMetroRequests, hostedNativeRecords, isJsonObject, parseHostedNativePlacement, unreadableHostedNative } from "@stim-cli/core/state";
3
3
  //#region src/device-host/ios-state.ts
4
4
  function readHostedNative(root, platform, slot) {
@@ -1,8 +1,8 @@
1
1
  import { t as getExecutor } from "./exec-B81Qodjn.mjs";
2
2
  import { Ft as removeTemporaryEntry, Pt as makeTemporaryDirectory } from "./settings-Bbztm4oV.mjs";
3
3
  import { r as waitForChild, t as createLineReader } from "./process-output-Fpl8PYi8.mjs";
4
- import { t as cleanLine } from "./server-expo-CsYu2aKL.mjs";
5
- import { M as startBuildHeartbeat, P as tailLines, y as HEARTBEAT_INTERVAL_MS } from "./toolchain-DqyDXs30.mjs";
4
+ import { t as cleanLine } from "./server-expo-CUuzP9Mp.mjs";
5
+ import { M as startBuildHeartbeat, P as tailLines, y as HEARTBEAT_INTERVAL_MS } from "./toolchain-SqehyPLw.mjs";
6
6
  import { existsSync, mkdirSync, readFileSync, readdirSync, rmSync, writeFileSync } from "node:fs";
7
7
  import { basename, join } from "node:path";
8
8
  import { randomUUID } from "node:crypto";