stim 1.21.0 → 1.22.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (184) hide show
  1. package/README.md +60 -7
  2. package/dist/{acquire-artifact-CD4lbiWE.mjs → acquire-artifact-Co2k4f7O.mjs} +21 -3
  3. package/dist/{act-DHAw2A2S.mjs → act-DsuqEkiM.mjs} +298 -164
  4. package/dist/{activity-BzVfHSrY.mjs → activity-CMLmzp7o.mjs} +33 -12
  5. package/dist/{agent-device-usage-output-zh1vhbLp.mjs → agent-device-usage-output-DUFaTMdd.mjs} +7 -7
  6. package/dist/{android-BLgbNqox.mjs → android-ByRMUoiJ.mjs} +66 -52
  7. package/dist/{android-DUYkNF4u.mjs → android-C7sVmyI9.mjs} +160 -59
  8. package/dist/{android-CV_GCELZ.mjs → android-DGkNqa_c.mjs} +5 -5
  9. package/dist/{android-BEJ8Jpl7.mjs → android-DR5lZ2Az.mjs} +2 -2
  10. package/dist/android-cas-compiler.mjs +1 -1
  11. package/dist/{android-cas-Ct5b1xCK.mjs → android-cas-ngferVq2.mjs} +3 -3
  12. package/dist/{client-B7QVOlCr.d.mts → android-project-DVWyCbWU.d.mts} +145 -7
  13. package/dist/api.d.mts +132 -118
  14. package/dist/api.mjs +239 -42
  15. package/dist/{artifact-B8T3S5gi.mjs → artifact-8EY8SAPw.mjs} +40 -35
  16. package/dist/{artifact-DAuZ-FNU.mjs → artifact-DJPy518Y.mjs} +69 -40
  17. package/dist/artifact-platform-CXcmX_j3.mjs +27 -0
  18. package/dist/{browser-web-QQzVjz3O.mjs → browser-web-Bcv99PBM.mjs} +187 -59
  19. package/dist/{budget-Bs6SxxzO.mjs → budget-Cvwn54qV.mjs} +830 -699
  20. package/dist/{build-CoPzQRNw.mjs → build-CabC3G23.mjs} +34 -27
  21. package/dist/{build-cache-DmyR9Zzc.mjs → build-cache-Dv7RN200.mjs} +4 -4
  22. package/dist/{build-plan-CaFskB7_.mjs → build-plan-DUC8Ka9y.mjs} +74 -14
  23. package/dist/{cache-manifest-DkkqguoK.mjs → cache-manifest-DSeQjt-Q.mjs} +1 -1
  24. package/dist/cache-manifest.mjs +1 -1
  25. package/dist/{ccache-BJRZ9pG3.mjs → ccache-Btwc36-I.mjs} +6 -6
  26. package/dist/{cdp-CWmIUMbw.mjs → cdp-3fwICjzi.mjs} +1 -1
  27. package/dist/{chrome-B6tfCta1.mjs → chrome-Bbw689-6.mjs} +1 -1
  28. package/dist/{cli-0DYf8QhQ.mjs → cli-CHZa9Lvk.mjs} +20 -20
  29. package/dist/cli.mjs +1 -1
  30. package/dist/{client-UXD70ZbM.mjs → client-OyRoEuSr.mjs} +218 -47
  31. package/dist/collector-run.d.mts +1 -1
  32. package/dist/collector-run.mjs +6 -6
  33. package/dist/{command-output-B1UrjZHL.mjs → command-output-gwpm28fu.mjs} +1 -1
  34. package/dist/{config-CYcBF478.mjs → config-DlrsduwG.mjs} +17 -11
  35. package/dist/{created-devices-CqeBlrEn.mjs → created-devices-x9rN6bhs.mjs} +13 -3
  36. package/dist/{dependency-state-BbKQW83h.mjs → dependency-state-1I9KZT1Y.mjs} +2 -2
  37. package/dist/{detached-entry-DFRyG1_o.mjs → detached-entry-BwNEtIrP.mjs} +1 -1
  38. package/dist/{dev-client-UOeESKm6.mjs → dev-client-BSDR5h3F.mjs} +2 -2
  39. package/dist/{device-ExJq8Ei7.mjs → device-B-L3Fbxy.mjs} +71 -14
  40. package/dist/{device-DCxH7_By.mjs → device-DklWZLqb.mjs} +16 -16
  41. package/dist/{device-capacity-CMlqEcvw.mjs → device-capacity-DK5_EwRS.mjs} +9 -10
  42. package/dist/device-host-worker.mjs +25 -32
  43. package/dist/{device-ios-DRUeKaFV.mjs → device-ios-DoB6KFCO.mjs} +39 -16
  44. package/dist/{device-lease-run-C8raGFoP.mjs → device-lease-run-xJPQ_QQG.mjs} +5 -5
  45. package/dist/{device-pool-DMRpVX9a.mjs → device-pool-BMkdsefq.mjs} +3 -3
  46. package/dist/{doctor-DTvaDOda.mjs → doctor-Bo7BXLux.mjs} +24 -37
  47. package/dist/{doctor-Dhqebm0q.mjs → doctor-D5_EzwfA.mjs} +19 -16
  48. package/dist/doctor-fingerprint-DZLoYFVb.mjs +16 -0
  49. package/dist/doctor-fingerprint.mjs +1 -1
  50. package/dist/{doctor-BLHCYxzi.mjs → doctor-thjWAV0z.mjs} +1 -1
  51. package/dist/{doctor-watchman-Cv1F10Kj.mjs → doctor-watchman-N2wDotwQ.mjs} +5 -5
  52. package/dist/{eas-build-BomfRnFT.mjs → eas-build-CwknaQYj.mjs} +4 -4
  53. package/dist/{eas-fallback-DJwZpy0c.mjs → eas-fallback-CSgAulr5.mjs} +27 -18
  54. package/dist/{eas-session-ledger-op6A54yi.mjs → eas-session-ledger-DlY_serQ.mjs} +8 -7
  55. package/dist/{error-diagnostics-Bf0rZvG9.mjs → error-diagnostics-DBWO2rxE.mjs} +10 -10
  56. package/dist/{exec-_UbtCQcG.mjs → exec-DEoAhcze.mjs} +155 -47
  57. package/dist/{exec-H20xSg2T.d.mts → exec-DnYc4HGH.d.mts} +17 -4
  58. package/dist/{gc-_-dCXdyL.mjs → gc-CXxN-4SE.mjs} +587 -313
  59. package/dist/gc-DnNDQyaP.mjs +3 -0
  60. package/dist/{guide-Yqwt2bd6.mjs → guide-Br0LEfKy.mjs} +239 -43
  61. package/dist/{hosted-android-Bw-honsd.mjs → hosted-android-B-9f-jkd.mjs} +6 -6
  62. package/dist/{hosted-client-DB_gBPfY.mjs → hosted-client-DZAPrcro.mjs} +4 -4
  63. package/dist/{hosted-ios-CUvOf4Vr.mjs → hosted-ios-CsCS21hn.mjs} +1 -1
  64. package/dist/{hosted-logs-DL_P5AdN.mjs → hosted-logs-FIRx9X2f.mjs} +5 -5
  65. package/dist/{hosted-macos-QI141yKk.mjs → hosted-macos-_awYSpfv.mjs} +21 -12
  66. package/dist/{hosted-native-Ksyjgzq-.mjs → hosted-native-BdzE668-.mjs} +27 -14
  67. package/dist/{idle-BVeRGroT.d.mts → idle-C4cZ757K.d.mts} +3 -3
  68. package/dist/{idle-shutdown-DaKmZi0z.mjs → idle-shutdown-DDg3SdvY.mjs} +7 -7
  69. package/dist/ios-CDvlmUs7.d.mts +24 -0
  70. package/dist/{ios-CQ68hG9s.mjs → ios-Ds1clbIt.mjs} +8 -8
  71. package/dist/{ios-device-CwFMehUS.mjs → ios-device--h_-8ENa.mjs} +3 -3
  72. package/dist/{ios-device-CXGP1bsD.mjs → ios-device-BXZ0c7Kb.mjs} +1 -1
  73. package/dist/{ios-CpByZy12.mjs → ios-hcBpnEGk.mjs} +81 -34
  74. package/dist/{ios-ubFsBzwq.mjs → ios-pm4nL6By.mjs} +59 -50
  75. package/dist/{ios-project-WuwwBdvW.mjs → ios-project-CZhKODF3.mjs} +5 -5
  76. package/dist/{ios-signing-DTTIChGs.mjs → ios-signing-BtAffm0A.mjs} +2 -2
  77. package/dist/{ios-state-DvFX-K_l.mjs → ios-state-Dtw5K2aI.mjs} +1 -1
  78. package/dist/{ios-qNJt4dFm.mjs → ios-xtlRHaeB.mjs} +1 -1
  79. package/dist/{js-swap-Cc1dttps.mjs → js-swap-Bwhh4S7V.mjs} +7 -29
  80. package/dist/{launch-Zq2mOSDy.mjs → launch-BjxemNpK.mjs} +40 -39
  81. package/dist/{launch-CD1yVc7U.mjs → launch-CCzXlc8r.mjs} +16 -16
  82. package/dist/{logs-BS00Anxf.mjs → logs-BfwwadsZ.mjs} +151 -24
  83. package/dist/{logs-CMm05HxN.mjs → logs-jTS_lHSo.mjs} +10 -17
  84. package/dist/{macos-B65--pPd.mjs → macos-DVlSSyUg.mjs} +1 -1
  85. package/dist/{macos-C-0qJ6zq.mjs → macos-NfV2D7dO.mjs} +143 -46
  86. package/dist/macos-run.mjs +1 -1
  87. package/dist/maintenance-run.mjs +8 -8
  88. package/dist/{metro-DEXpIhHC.mjs → metro-DiXtA3Ty.mjs} +59 -37
  89. package/dist/{metro-gateway-BMJNlj3E.mjs → metro-gateway-CKZqKqx7.mjs} +120 -22
  90. package/dist/{named-ports-BWTzt6mu.mjs → named-ports-DkEzOfzO.mjs} +40 -33
  91. package/dist/{native-android-JACyjTZs.mjs → native-android-CqgnOgsT.mjs} +43 -242
  92. package/dist/native-gradle-artifact-inputs-DHFnmrVf.mjs +270 -0
  93. package/dist/{native-gradle-inputs-Bep9JcSF.mjs → native-gradle-inputs-Dnh84Zbd.mjs} +3 -129
  94. package/dist/{native-run-DY_RLx3C.mjs → native-run-NwUuxbkg.mjs} +4 -5
  95. package/dist/{native-runtime-Dg1Q7tfF.mjs → native-runtime-B7KIafpM.mjs} +8 -7
  96. package/dist/native-source-Y0yLhFyQ.mjs +133 -0
  97. package/dist/{native-xcode-inputs-CB2iQeWq.mjs → native-xcode-inputs-D_VOfFL7.mjs} +2 -3
  98. package/dist/{native-xcode-ios-CXX39F7o.mjs → native-xcode-ios-BYDOHWLN.mjs} +27 -32
  99. package/dist/offload-worker.d.mts +65 -2
  100. package/dist/offload-worker.mjs +305 -73
  101. package/dist/operation-exec-BW0em61G.mjs +171 -0
  102. package/dist/{ownership-DEmM5vhh.mjs → ownership-C5fo5Edb.mjs} +3 -3
  103. package/dist/{page-CPaHeYqj.mjs → page-DBL2PiUU.mjs} +8 -4
  104. package/dist/{placement-log-BqGbTa61.mjs → placement-log-BnGgJRRZ.mjs} +1 -1
  105. package/dist/{plan-placement-Bwj-IjY1.mjs → plan-placement-DIsMtN-d.mjs} +12 -8
  106. package/dist/{ports-D-MmCTdv.mjs → ports-Cy1RkmuQ.mjs} +3 -3
  107. package/dist/{prebuild-uD_ipCxF.mjs → prebuild-D4JoEAEs.mjs} +49 -14
  108. package/dist/{project-BZNjmW_8.mjs → project-wM_XFTvE.mjs} +16 -16
  109. package/dist/{pull-request-Lfetn8Kr.mjs → pull-request-W1IuLXDt.mjs} +102 -20
  110. package/dist/{pull-request-zjCSAryH.d.mts → pull-request-eODyIqZF.d.mts} +6 -2
  111. package/dist/pull-requests.d.mts +2 -2
  112. package/dist/pull-requests.mjs +2 -2
  113. package/dist/{react-native-android-DuzH0cn3.mjs → react-native-android-6OZ7MSM7.mjs} +71 -48
  114. package/dist/{react-native-build-rhk4smwQ.mjs → react-native-build-Dvd8hC21.mjs} +8 -8
  115. package/dist/{react-native-doctor-CQpuIMso.mjs → react-native-doctor-DsoSF1Y9.mjs} +7 -7
  116. package/dist/{react-native-ios-Bhq1rJeV.mjs → react-native-ios-4u1Rn-GR.mjs} +40 -26
  117. package/dist/{recordings-DYteQSu4.mjs → recordings-CQmfzAh7.mjs} +1 -1
  118. package/dist/registration-BcRgF6Ox.mjs +51 -0
  119. package/dist/{reload-CmTRFJaX.mjs → reload-BzkYabB-.mjs} +16 -15
  120. package/dist/{reload-DzjSl5P_.mjs → reload-D7AVlb8N.mjs} +1 -1
  121. package/dist/{remote-ByYkXdGD.mjs → remote-DjGDmlTZ.mjs} +18 -15
  122. package/dist/{result-DNiS-tTP.mjs → result-D2Ykz_iD.mjs} +24 -23
  123. package/dist/{run-D23HmJMs.mjs → run-DidHghD1.mjs} +3 -2
  124. package/dist/{selection-CSl9i5qU.mjs → selection-DSMbWEX2.mjs} +6 -5
  125. package/dist/{server-bare-CxTrvDg8.mjs → server-bare-CafzuyFB.mjs} +2 -2
  126. package/dist/{server-command-CtzloH3v.mjs → server-command-C6QjeupS.mjs} +5 -5
  127. package/dist/{server-expo-DT_F_uVI.mjs → server-expo-CrjB29pq.mjs} +7 -5
  128. package/dist/server-expo-D58c9L0M.mjs +2 -0
  129. package/dist/{settings-CsJDEXgK.mjs → settings-C7O8A6ZI.mjs} +223 -243
  130. package/dist/{settings-T1gtc3bf.mjs → settings-DpR-1Wnn.mjs} +1 -1
  131. package/dist/{settings-write-HyVZ8eQ8.mjs → settings-write-CzD60rOD.mjs} +7 -6
  132. package/dist/settings.schema.json +13 -0
  133. package/dist/{simslim-Cgk17SXV.mjs → simslim-BNckWpXi.mjs} +2 -2
  134. package/dist/{slot-launch-DF8VfT64.mjs → slot-launch-CbfmNgM6.mjs} +6 -6
  135. package/dist/{stage-BIS0ydsV.mjs → stage-Bps5oius.mjs} +21 -4
  136. package/dist/{start-RChynRDp.mjs → start-Br-oxqMD.mjs} +1 -1
  137. package/dist/{start-7lpH7hmN.mjs → start-EojN4WFz.mjs} +622 -393
  138. package/dist/{state-C4ZtUisW.mjs → state--smjFSTL.mjs} +22 -7
  139. package/dist/{state-XMziexv2.mjs → state-08I3hw3_.mjs} +2 -2
  140. package/dist/{stats-53T7OTb9.mjs → stats-D3GerlFW.mjs} +5 -5
  141. package/dist/{stats-report-BFfMpWWF.mjs → stats-report-BzaPrRm6.mjs} +1 -1
  142. package/dist/{status-DqEUSSxs.mjs → status-BRROykC8.mjs} +2 -2
  143. package/dist/{status-CSi6tlRq.mjs → status-EvrK72L2.mjs} +1 -1
  144. package/dist/{status-BL7jVyAB.mjs → status-WBDajew2.mjs} +43 -29
  145. package/dist/{status-watch-GDCfqpTE.mjs → status-watch-Bg_u-pwR.mjs} +48 -16
  146. package/dist/status-worker.mjs +1 -1
  147. package/dist/{stim-desktop-C12we7lz.mjs → stim-desktop-D5OGpYZM.mjs} +2 -2
  148. package/dist/{stop-Bk_1qiV6.mjs → stop-DTZ9uTw3.mjs} +2 -2
  149. package/dist/{stop-D7h6jAXQ.mjs → stop-Dky10AEJ.mjs} +31 -22
  150. package/dist/{stop-CPzlM1L-.mjs → stop-Mv6W9FAk.mjs} +15 -16
  151. package/dist/supervisor-run.d.mts +3 -3
  152. package/dist/supervisor-run.mjs +28 -36
  153. package/dist/{support-Dlu37g6H.mjs → support-CNioewsd.mjs} +10 -10
  154. package/dist/{support-67vraa1Q.mjs → support-yUiOjnVY.mjs} +8 -8
  155. package/dist/swiftpm-artifact-inputs-DFcGsXDP.mjs +153 -0
  156. package/dist/swiftpm-macos-BIak-Rxv.mjs +532 -0
  157. package/dist/toolchain-BY8X8HXx.mjs +2 -0
  158. package/dist/{toolchain-Hp9sCpK4.mjs → toolchain-DpJMHq0n.mjs} +9 -6
  159. package/dist/{trigger-BAahxUPq.mjs → trigger-Cbyc41d_.mjs} +3 -3
  160. package/dist/trigger-yb_nFzPF.mjs +2 -0
  161. package/dist/{warm-progress-BHX5r0Ei.mjs → warm-progress-CA3TgT3-.mjs} +29 -16
  162. package/dist/web-CZ07gd77.mjs +2 -0
  163. package/dist/{web-CJmIj6AI.mjs → web-DKx6yoFA.mjs} +11 -10
  164. package/dist/web-run.mjs +11 -9
  165. package/dist/windows-report.mjs +1 -1
  166. package/dist/{workspace-state-Cjuigeeu.mjs → workspace-state-U08dEzhG.mjs} +3 -3
  167. package/dist/{workspaces-BccMFmGQ.mjs → workspaces-CpANmBlq.mjs} +594 -266
  168. package/dist/{worktree-DQ6Zi2Mv.mjs → worktree-CHecZ4Oq.mjs} +850 -551
  169. package/dist/worktree-ZqZVjD9K.mjs +2 -0
  170. package/dist/{xcode-Zlx3qjEs.mjs → xcode-BXn9-xYx.mjs} +5 -5
  171. package/package.json +7 -7
  172. package/shim/android-audio/Main.java +24 -0
  173. package/shim/android-audio/README.md +17 -0
  174. package/shim/android-audio.jar +0 -0
  175. package/dist/gc-C-WwL0yi.mjs +0 -3
  176. package/dist/git-C3iTsJaZ.mjs +0 -73
  177. package/dist/server-expo-C-90EhcG.mjs +0 -2
  178. package/dist/settings-DkdmlelE.d.mts +0 -15
  179. package/dist/swiftpm-macos-p8WZbxKU.mjs +0 -130
  180. package/dist/toolchain-DhKwp9iI.mjs +0 -2
  181. package/dist/trigger-Bf3uDcpv.mjs +0 -2
  182. package/dist/web-DknQETPs.mjs +0 -2
  183. package/dist/workspace-process-lock-1_1OoVW5.mjs +0 -57
  184. package/dist/worktree-CK2MpJW5.mjs +0 -2
package/README.md CHANGED
@@ -44,12 +44,22 @@ Stim builds or restores the app, installs it, launches it, and checks launch
44
44
  readiness. Plain output streams progress and reports the complete result. Use
45
45
  `--json` when a script needs structured data.
46
46
 
47
- For native Xcode simulator builds, a local and configured-provider miss can
47
+ For native Xcode simulator builds, declared repeatable SwiftPM macOS builds,
48
+ and React Native/Expo iOS Simulator or Android development builds, a local and configured-provider miss can
48
49
  reuse an exact completed artifact from an enabled paired build worker. Reuse
49
50
  checks the full source, toolchain, SDK, architecture and target cache key and
50
51
  verifies the downloaded archive. It needs no compilation slot. An explicit
51
- local build and remote build mode off skip peer lookup; other project types
52
- keep their existing cache paths. See `stim guide settings` for placement.
52
+ local build and remote build mode off skip peer lookup. React Native archives
53
+ match the native fingerprint, build choices and compatible toolchain verified
54
+ around compilation; they remain reusable after the worker changes checkouts.
55
+ Release and physical device builds keep their existing cache paths. See `stim guide settings` for placement.
56
+ SwiftPM peer reuse requires `macos.artifactInputs` and a capable worker. Its
57
+ receipt verifies actual worker source and rechecks worker-private files,
58
+ environment and Swift/Xcode/SDK identity. Private values are not transferred;
59
+ worker identities are separate from local cache keys. Compiler overrides
60
+ (`SWIFT_EXEC` and `SWIFT_EXEC_MANIFEST`) are resolved and versioned separately.
61
+ Overrides and custom toolchain launchers
62
+ require the worker checkout to revalidate their selection. See `stim guide macos`.
53
63
 
54
64
  ## Native Android build workers
55
65
 
@@ -107,6 +117,28 @@ execution budget and 35 second cleanup budget, with the report timeout and
107
117
  cleanup refusals described below. Cancellation stops pending work but cannot
108
118
  retract a request already sent. Reload never retries automatically.
109
119
 
120
+ `warmWorktree({ signal?, beforeWarm? })` copies missing ignored state from the
121
+ source checkout into the client's linked worktree in process, returning
122
+ `{ exitCode: 0 | 1 }`. It preserves existing entries and tracked files, shares
123
+ the source's read claim, and takes an exclusive claim on the target while copying.
124
+ `beforeWarm(workspace)` admits each canonical workspace in the resolved warming
125
+ scope before registration or copying; throwing refuses warming. Progress uses
126
+ `onProgress`. Cancellation drains the copy child before removing its partial
127
+ entry or releasing claims. Unverifiable cleanup retains the claims and reports
128
+ `STIM_CLAIM_UNAVAILABLE` with recovery paths. Warming has a 90 minute execution
129
+ budget and a 35 second cleanup budget. Source refresh remains available through
130
+ `stim worktree warm --refresh`; this API does not refresh or install dependencies.
131
+
132
+ `removeWorktree({ target?, force?, signal? })` uses the CLI's removal checks and
133
+ cleanup in process. The target defaults to `projectRoot`; relative paths resolve
134
+ against it. It returns `{ removed, exitCode }` without changing `process.exitCode`.
135
+ Source checkout environment cleanup can succeed with `removed: false` and
136
+ `exitCode: 0`; a linked worktree deleted before a branch-cleanup failure returns
137
+ `removed: true` and `exitCode: 1`. `force` means CLI `--force`, including discarding
138
+ unsaved work. It uses the 60 second execution and 35 second cleanup budgets below.
139
+ Cancellation stops pending actions and drains owned cleanup; completed deletions
140
+ remain applied.
141
+
110
142
  `setSetting(key, text, { scope?, signal? })` and `unsetSetting(key, { scope?, signal? })`
111
143
  share the CLI's validation and return its JSON write result, including masked
112
144
  sensitive values. Values use CLI text syntax, including JSON for arrays and
@@ -114,7 +146,10 @@ objects. Config lock waits and device-pool probes are asynchronous. Cancellation
114
146
  prevents a pending write; a committed write finishes its recording cleanup
115
147
  before settling. Recording changes serialize through cleanup within the home.
116
148
 
117
- All operations run in the importing process. `settings()` and `stats()`
149
+ Native lifecycle operations run in the importing process. Custom Expo
150
+ `buildCacheProvider` modules are not supported. Use EAS or a Stim cache provider.
151
+
152
+ `settings()` and `stats()`
118
153
  read the `stim settings --json` and `stim stats --json` payloads. All
119
154
  use the client's own home and leave the caller's cwd, environment,
120
155
  output, signal handlers and exit listeners as they were. The API and CLI call
@@ -126,6 +161,16 @@ Cancelling `stop()` while it waits for another native operation ends that wait.
126
161
  Once teardown starts, it finishes cleanup before rejecting with `STIM_CANCELLED`;
127
162
  its config, workspace-state, and lease lock waits are asynchronous.
128
163
 
164
+ `plan({ platform: 'ios' | 'android' | 'macos', signal? })` predicts the next
165
+ configured native build, as the CLI's `--plan --json` reports it, without building
166
+ or launching. iOS and Android also accept `slot`; build and device selectors
167
+ come from the project's settings. Plans use the report execution and cleanup
168
+ budgets below. Fingerprinting uses the existing cancellable report helper;
169
+ native probes and cache downloads finish cleanup before the report settles.
170
+ Cache providers must settle after cancellation. If cleanup cannot finish within
171
+ 35 seconds, the plan refuses with `STIM_CLAIM_UNAVAILABLE` and retains the download
172
+ directory; it does not delete files a broken provider may still be writing.
173
+
129
174
  `doctor({ platform?, record? })` and `gc({ cache?, olderThan?, worktrees? })` read their CLI
130
175
  JSON reports with a 60 second execution budget and optional `signal`. Doctor
131
176
  never repairs; its `stim.runningPath` is null. By default it does not record a
@@ -153,12 +198,19 @@ On Windows, report probes require the built-in Windows PowerShell for process-tr
153
198
  `home` and `buildCache` accept absolute paths. Omit them to use normal Stim
154
199
  settings. A cache used by concurrent writers needs the same coordinating Stim
155
200
  home; do not point independent homes at a concurrently writable artifact cache.
201
+ `start({ remote?, resetCache?, waitSeconds?, signal?, beforeStart? })` starts or
202
+ reuses the managed dev server and returns flat start facts.
203
+ The optional admission callback receives the resolved app before startup effects.
204
+ Cancellation accounts for newly spawned processes before returning; a verified
205
+ supervisor handed off to its workspace can remain running. Unconfirmed cleanup
206
+ reports `STIM_CLAIM_UNAVAILABLE` with the retained ownership claims' recovery remedy.
207
+
156
208
  Ownership checks and cache locks remain active. `stop()` acts on this workspace,
157
209
  including resources from earlier runs, so use a dedicated workspace in CI.
158
210
 
159
211
  Stim failures are `StimError` instances with `code`, `message`, `remedy`, and
160
212
  `details`. An exception thrown by `onProgress` stops further progress and is
161
- propagated unchanged: `build()` or `run()` is cancelled, and
213
+ propagated unchanged: `start()`, `build()` or `run()` is cancelled, and
162
214
  `stop()` or read finishes its work first.
163
215
  `logs({ tail, sources, minLevel, slot, since, grep, errorsOnly })` reads the same
164
216
  merged records as `stim logs --json`, including crash capture and agent actions.
@@ -170,8 +222,9 @@ no `tail`, timeline batches hold at most 500 records. Agent attribution still
170
222
  retains its matching records during backfill. These reads run in process and yield between log chunks.
171
223
  Local follow uses filesystem hints with a ten-second repair scan. While a
172
224
  directory watch is unavailable, it retries and scans every 500 ms; Expo error
173
- context uses a timer only while pending. Agent-action and active hosted log
174
- sampling are unchanged.
225
+ context uses a timer only while pending. Local agent actions use filesystem
226
+ notifications for state and claim changes, with the same repair timing. Active hosted log
227
+ queries retain their pull cadence.
175
228
  Attachment schedules one 500 ms recovery scan. A moved directory on Windows can
176
229
  require the ten-second repair scan.
177
230
  Hosted targets join and leave the follow stream from local state notifications;
@@ -1,4 +1,5 @@
1
- import { I as waitForSharedBuild } from "./activity-BzVfHSrY.mjs";
1
+ import { r as WorkspaceProcessCleanupError } from "./exec-DEoAhcze.mjs";
2
+ import { I as waitForSharedBuild } from "./activity-CMLmzp7o.mjs";
2
3
  import { rmSync } from "node:fs";
3
4
  //#region src/engine/artifact-lifecycle.ts
4
5
  async function runArtifactLifecycle(phases) {
@@ -63,6 +64,14 @@ function createCleanupScope(report) {
63
64
  }
64
65
  //#endregion
65
66
  //#region src/engine/acquire-artifact.ts
67
+ function unresolvedCleanup(error) {
68
+ return error instanceof WorkspaceProcessCleanupError || error instanceof Error && "reportCleanup" in error;
69
+ }
70
+ /** Waits for upload readers; unresolved child cleanup refuses deletion of their temporary inputs. */
71
+ async function settleArtifactUploads(...uploads) {
72
+ const unresolved = (await Promise.allSettled(uploads)).find((result) => result.status === "rejected" && unresolvedCleanup(result.reason));
73
+ if (unresolved?.status === "rejected") throw unresolved.reason;
74
+ }
66
75
  async function acquireArtifact(adapter, { root, logFile, deps }) {
67
76
  const owned = createCleanupScope((error) => adapter.temporaryReleaseFailed(error));
68
77
  let closeOffload = null;
@@ -138,7 +147,16 @@ async function acquireArtifact(adapter, { root, logFile, deps }) {
138
147
  release: owned.transfer()
139
148
  };
140
149
  } catch (error) {
141
- await adapter.settleFailed?.();
150
+ try {
151
+ await adapter.settleFailed?.();
152
+ } catch (cleanupError) {
153
+ if (unresolvedCleanup(cleanupError)) owned.transfer();
154
+ throw cleanupError;
155
+ }
156
+ if (unresolvedCleanup(error)) {
157
+ owned.transfer();
158
+ throw error;
159
+ }
142
160
  const failure = adapter.refuse(error);
143
161
  if (failure === null) throw error;
144
162
  return {
@@ -150,4 +168,4 @@ async function acquireArtifact(adapter, { root, logFile, deps }) {
150
168
  }
151
169
  }
152
170
  //#endregion
153
- export { acquireArtifact as t };
171
+ export { settleArtifactUploads as n, acquireArtifact as t };