stim 1.25.0 → 1.27.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.
- package/README.md +1 -1
- package/dist/{acquire-artifact-zA4S7RHE.mjs → acquire-artifact-BKN2Yuhg.mjs} +2 -2
- package/dist/{act-BbHS3oV8.mjs → act-ROviTF_t.mjs} +415 -118
- package/dist/{activity-BpjwrQXU.mjs → activity-Cd-ysFes.mjs} +6 -7
- package/dist/{agent-device-usage-output-Bnkerfod.mjs → agent-device-usage-output-C5nCKWp9.mjs} +5 -5
- package/dist/{android-CNZgRC-4.mjs → android--HBgpvpW.mjs} +5 -5
- package/dist/{android-BGwuK3Mc.mjs → android-Cd6w7_qw.mjs} +134 -57
- package/dist/{android-saBeB4lr.mjs → android-Deb9X3_Y.mjs} +37 -15
- package/dist/{android-Cjcj8MCw.mjs → android-DriNoAVy.mjs} +99 -47
- package/dist/{android-cas-BVqh2Zep.mjs → android-cas-D5e6ecUg.mjs} +4 -4
- package/dist/android-cas-compiler.mjs +1 -1
- package/dist/{android-project-CTYaETc0.d.mts → android-project-DUGMbq28.d.mts} +55 -1
- package/dist/api.d.mts +20 -7
- package/dist/api.mjs +42 -32
- package/dist/apk-signed-tail-BHQHx3Rm.mjs +142 -0
- package/dist/{artifact-Co8zixVx.mjs → artifact-0AGJYB9O.mjs} +28 -28
- package/dist/{artifact-DN8JNwqS.mjs → artifact-faemIZv5.mjs} +40 -30
- package/dist/{artifact-platform-CMRc0M_r.mjs → artifact-platform-BO2Uvk_A.mjs} +1 -1
- package/dist/{attempt-DW-mQqM7.mjs → attempt-ClyJlZPT.mjs} +4 -2
- package/dist/auto-placement-z-H5pJza.mjs +350 -0
- package/dist/{browser-web-CCgZsHmI.mjs → browser-web-slD8AvLp.mjs} +16 -17
- package/dist/{build-cache-CKCzxzxA.mjs → build-cache-gBJ-WKzA.mjs} +141 -37
- package/dist/{build-CAiw8Ezm.mjs → build-hS0QyFlQ.mjs} +38 -31
- package/dist/{build-plan-zCuHGlA8.mjs → build-plan-CBqYbzYM.mjs} +7 -6
- package/dist/{cache-manifest-BPXRONJz.mjs → cache-manifest-DEjqGGat.mjs} +1 -1
- package/dist/cache-manifest.mjs +1 -1
- package/dist/{budget-HyShrIpL.mjs → ccache-BWTze1Ls.mjs} +634 -1514
- package/dist/{cdp-BG3FJCCx.mjs → cdp-C3svvXiE.mjs} +1 -1
- package/dist/{chrome-BvV8ssI3.mjs → chrome-DyDWurWG.mjs} +1 -1
- package/dist/{cli-C4w607Pz.mjs → cli-ftXDLto1.mjs} +24 -23
- package/dist/cli.mjs +1 -1
- package/dist/{client-BQsmyp_-.mjs → client-xsdxrhWA.mjs} +77 -116
- package/dist/collector-run.d.mts +10 -9
- package/dist/collector-run.mjs +42 -27
- package/dist/{command-output-BBvS1H6v.mjs → command-output-Dj-WT4BP.mjs} +1 -1
- package/dist/{config-BZhXY15H.mjs → config-Cn94Jc0g.mjs} +343 -18
- package/dist/{launch-DscF1QfM.mjs → dependencies-BGokZ-Ng.mjs} +330 -279
- package/dist/{dependency-state-BwNCYG5Q.mjs → dependency-state-C3OtgG94.mjs} +14 -7
- package/dist/{detached-entry-KmieOKgN.mjs → detached-entry-BPlSaCwC.mjs} +1 -1
- package/dist/{dev-client-CHoXXZeg.mjs → dev-client-BMca82xo.mjs} +2 -2
- package/dist/{device-F5-4z9ef.mjs → device-BJm0irrq.mjs} +16 -16
- package/dist/{device-capacity-ZYaRALv5.mjs → device-capacity-6LP7QsaA.mjs} +103 -25
- package/dist/device-host-worker.mjs +19 -21
- package/dist/{device-ios-DkHBrmvH.mjs → device-ios-534c14fz.mjs} +288 -28
- package/dist/{device-lease-run-ogEeJ62K.mjs → device-lease-run-DwsGfjUN.mjs} +5 -5
- package/dist/{device-pool-BIg8MU8l.mjs → device-pool-BnQqvs6o.mjs} +3 -3
- package/dist/{device-B9FqTBYW.mjs → device-tM41-TUq.mjs} +25 -24
- package/dist/{doctor-A_Nr_fDe.mjs → doctor-Dbx1ZpD2.mjs} +1 -1
- package/dist/{doctor-k3P3PizH.mjs → doctor-DyqE9n1J.mjs} +28 -16
- package/dist/{doctor-Bm8TVpGn.mjs → doctor-F-3VUUyN.mjs} +128 -35
- package/dist/{doctor-fingerprint-zlujA1Gs.mjs → doctor-fingerprint-o7ZI9YLn.mjs} +9 -3
- package/dist/doctor-fingerprint.mjs +1 -1
- package/dist/{doctor-watchman-BovI1y3-.mjs → doctor-watchman-CxDbyrrt.mjs} +5 -5
- package/dist/{eas-build-CyDKNTBP.mjs → eas-build-CjNSWmjo.mjs} +4 -4
- package/dist/eas-fallback-9fqb46kW.mjs +87 -0
- package/dist/{eas-session-ledger-BMCA1gdO.mjs → eas-session-ledger-DrP4OuuM.mjs} +6 -6
- package/dist/{error-diagnostics-B1Mj_-7h.mjs → error-diagnostics-snej9k4j.mjs} +51 -25
- package/dist/{exec-VFRpu1iA.mjs → exec-aULwtNly.mjs} +57 -6
- package/dist/{gc-eaz403W6.mjs → gc-BRwAY3qT.mjs} +2 -2
- package/dist/{gc-B9jcnmIk.mjs → gc-CGZ1Yg88.mjs} +218 -72
- package/dist/{guide-DR0K0xW9.mjs → guide-_rfEh_zM.mjs} +839 -222
- package/dist/{hosted-android-Bvb2-ZxD.mjs → hosted-android-BMKzUNnY.mjs} +4 -4
- package/dist/{hosted-client-rsRqysJc.mjs → hosted-client-D7Pk_Oo1.mjs} +13 -9
- package/dist/{hosted-logs-CWKGYWNX.mjs → hosted-logs-B1gqQuva.mjs} +18 -12
- package/dist/hosted-logs-sync-Dg3qrZmV.mjs +195 -0
- package/dist/{hosted-macos-d0pv9Tth.mjs → hosted-macos-B9w4H8hc.mjs} +6 -6
- package/dist/{hosted-native-BxTizGU2.mjs → hosted-native-CdgaiuyP.mjs} +17 -17
- package/dist/{idle-shutdown-BIyfl0Zj.mjs → idle-shutdown-Cbvo5KEh.mjs} +21 -9
- package/dist/{ios-BRVM8b0P.mjs → ios-B5HlVMhQ.mjs} +138 -55
- package/dist/{ios-Dvt97HgQ.mjs → ios-Bk4mWbtS.mjs} +8 -8
- package/dist/{ios-ENC4sRPA.mjs → ios-CsRVik64.mjs} +7 -1
- package/dist/{ios-BQzvJlzw.mjs → ios-E26qSpkb.mjs} +94 -11
- package/dist/{ios-device-CKSvk0bu.mjs → ios-device-C_QkIf1Z.mjs} +3 -3
- package/dist/{ios-device-B6HK951C.mjs → ios-device-CiBA-er9.mjs} +1 -1
- package/dist/{ios-project-DCUDo06I.mjs → ios-project-D8Jcy_br.mjs} +22 -9
- package/dist/{ios-signing-4c_qXvQm.mjs → ios-signing-BJzvDPfU.mjs} +2 -2
- package/dist/{ios-state-CT9nV5SP.mjs → ios-state-BZ03NFgF.mjs} +1 -1
- package/dist/{js-swap-Z9HbC4cj.mjs → js-swap-Dg2a945i.mjs} +8 -7
- package/dist/{launch-D0lPvFFu.mjs → launch-CRyBeNsA.mjs} +53 -44
- package/dist/lightened-BCsdAGj_.mjs +171 -0
- package/dist/{logs-BsIRre8x.mjs → logs-CC_-ZzEE.mjs} +10 -174
- package/dist/{logs-Crs9y34Z.mjs → logs-aJQb-RDg.mjs} +112 -38
- package/dist/{macos-CcUlJPMu.mjs → macos-BGmTpnv9.mjs} +1 -1
- package/dist/{macos-D477nfzH.mjs → macos-DlCBhMw5.mjs} +73 -39
- package/dist/macos-run.mjs +1 -1
- package/dist/maintenance-run.mjs +30 -13
- package/dist/{metro-1pJgCX4U.mjs → metro-CvyD-xwe.mjs} +4 -4
- package/dist/{metro-gateway-Bp9gJQAN.mjs → metro-gateway-BnHdqMO_.mjs} +3 -4
- package/dist/{named-ports-BVbn8SvC.mjs → named-ports-BCyMWA6b.mjs} +3 -3
- package/dist/{native-android-BvMizJn1.mjs → native-android-DlpxCyOP.mjs} +17 -18
- package/dist/{native-gradle-artifact-inputs-BJscK4vN.mjs → native-gradle-artifact-inputs-C13qT7R_.mjs} +5 -5
- package/dist/{native-runtime-B9w_Qyz3.mjs → native-runtime-DqaIBO5w.mjs} +9 -9
- package/dist/{native-source-D-4Dh4JU.mjs → native-source-D1AzWiuP.mjs} +1 -1
- package/dist/{native-xcode-inputs-Cv4l-obn.mjs → native-xcode-inputs-B1W8SrxB.mjs} +3 -3
- package/dist/{native-xcode-ios-DGrg90hE.mjs → native-xcode-ios-QPP0Rm68.mjs} +17 -18
- package/dist/{ndjson-CgE_o3Dl.mjs → ndjson-Dy2W4vRa.mjs} +2 -2
- package/dist/offload-worker.d.mts +3 -1
- package/dist/offload-worker.mjs +34 -25
- package/dist/{operation-exec-CUZifp6Z.mjs → operation-exec-Dp4FuIGR.mjs} +1 -1
- package/dist/{ownership-jxxz-19m.mjs → ownership-Bx-0cku-.mjs} +3 -3
- package/dist/{page-CzEA_-5_.mjs → page-CQJlcj3x.mjs} +2 -2
- package/dist/{phone-reverses-CYb7RRAx.mjs → phone-reverses-C9yAaKEv.mjs} +18 -4
- package/dist/{placement-log-DjOXJRIH.mjs → placement-log-BXUbiZM6.mjs} +3 -3
- package/dist/{plan-placement-BqKgKHCi.mjs → plan-placement-UxnQjv5Z.mjs} +36 -10
- package/dist/{ports-DtS1Amb0.mjs → ports-uUrghqWN.mjs} +3 -3
- package/dist/prebuild-BDpToDgR.mjs +1246 -0
- package/dist/{project-BiC68mIp.mjs → project-DYj-HVx6.mjs} +17 -18
- package/dist/{pull-request-CbNlkFok.mjs → pull-request-BzLmzAIQ.mjs} +2 -2
- package/dist/pull-requests.mjs +1 -1
- package/dist/{react-native-android-DRYqoJc4.mjs → react-native-android-DDBccgJw.mjs} +56 -36
- package/dist/{react-native-build-CwZB-agu.mjs → react-native-build-DaK2IFyP.mjs} +9 -9
- package/dist/{react-native-doctor-BCrytK7h.mjs → react-native-doctor-B-Mw6DcR.mjs} +50 -9
- package/dist/{react-native-ios-Cr1buNFo.mjs → react-native-ios-DjYwUF9U.mjs} +45 -25
- package/dist/{recordings-BaoQ0t-J.mjs → recordings-C20iUZfp.mjs} +1 -1
- package/dist/{registration-CN6nlhcD.mjs → registration-BwCe64PH.mjs} +1 -1
- package/dist/{reload-Beftw2X3.mjs → reload-DJBeF_rC.mjs} +1 -1
- package/dist/{reload-FbSgMF8x.mjs → reload-fUdkH2_p.mjs} +16 -16
- package/dist/{remote-BuZj6AyU.mjs → remote-y6n99WMW.mjs} +22 -9
- package/dist/{result-CR2vk2cj.mjs → result-CTqBw2Te.mjs} +32 -21
- package/dist/{run-BtzE09Dl.mjs → run-DaCeNKRm.mjs} +3 -3
- package/dist/{selection-D5cxEl3t.mjs → selection-Bs8phwhN.mjs} +183 -62
- package/dist/{server-bare-CH9X0RLn.mjs → server-bare-BOh-iZEj.mjs} +2 -2
- package/dist/{server-command-CaBbDNU2.mjs → server-command-8CuA51Cv.mjs} +6 -6
- package/dist/{server-expo-Ck8EIidM.mjs → server-expo-ABQs2XFA.mjs} +4 -4
- package/dist/server-expo-Ba_Y21vB.mjs +2 -0
- package/dist/{settings-B5tCoq9N.mjs → settings-BDVI8Ivc.mjs} +331 -62
- package/dist/{settings-DzH9mGQZ.mjs → settings-CMHhQNwI.mjs} +24 -3
- package/dist/settings-payload-cm60Zhib.mjs +257 -0
- package/dist/settings-write-BdNRLlBn.mjs +185 -0
- package/dist/settings.schema.json +84 -39
- package/dist/{simslim-BjxszUAb.mjs → simslim-DCQwzoPy.mjs} +4 -3
- package/dist/{slot-launch-QeuJMlnJ.mjs → slot-launch-0l7RqSpr.mjs} +6 -6
- package/dist/{stage-D8xlRU2D.mjs → stage-F4cAfJGi.mjs} +2 -2
- package/dist/{start-C1JLjkNw.mjs → start-DcqnF9p8.mjs} +1 -1
- package/dist/{start-YMpNwLhh.mjs → start-DrPwER_2.mjs} +27 -23
- package/dist/{state-DMRNP7-4.mjs → state-BX1y5syV.mjs} +4 -5
- package/dist/{state-DPaM3u5K.mjs → state-CZxLyetD.mjs} +2 -3
- package/dist/{stats-CP7STzZw.mjs → stats-GxuCbles.mjs} +5 -5
- package/dist/{stats-report-n2U5plhk.mjs → stats-report-B86Cv7Uc.mjs} +1 -1
- package/dist/{status-Fect2w9R.mjs → status-7ULDEJ1e.mjs} +1 -1
- package/dist/{status-CRLiJ-O_.mjs → status-BfnK9pUd.mjs} +25 -26
- package/dist/{status-cNw6i0_t.mjs → status-Bj7ZYvvc.mjs} +1 -1
- package/dist/{status-watch-Bc2J4TZn.mjs → status-watch-BfabQn03.mjs} +5 -5
- package/dist/status-worker.mjs +1 -1
- package/dist/{stim-desktop-DS0mzR8U.mjs → stim-desktop-CbWo21kb.mjs} +2 -2
- package/dist/{stop-COP6PQqw.mjs → stop-CH79S3IZ.mjs} +5 -6
- package/dist/{stop-Db9Kh-UA.mjs → stop-D-EAr25B.mjs} +25 -22
- package/dist/{stop-Br7LKxBE.mjs → stop-x1Yu3He4.mjs} +2 -2
- package/dist/supervisor-run.d.mts +1 -0
- package/dist/supervisor-run.mjs +17 -18
- package/dist/{support-qKcbgmI5.mjs → support-Be0UeVZU.mjs} +10 -10
- package/dist/{support-Cxj9CmII.mjs → support-CNg_YsOk.mjs} +6 -6
- package/dist/{swiftpm-artifact-inputs-iY9fsmOc.mjs → swiftpm-artifact-inputs-uPqYvGBv.mjs} +4 -4
- package/dist/{swiftpm-macos-Bp_sn9P4.mjs → swiftpm-macos-Ch4YjY_A.mjs} +11 -12
- package/dist/toolchain-CbCG6C5Z.mjs +2413 -0
- package/dist/toolchain-JYAOquPg.mjs +2 -0
- package/dist/{trigger-CBMe2YLH.mjs → trigger-DMou-X7j.mjs} +3 -3
- package/dist/trigger-qp2ji5wE.mjs +2 -0
- package/dist/{warm-progress-BV3ZPmcY.mjs → warm-progress-C0RsbngN.mjs} +731 -728
- package/dist/{web-B4Yjyt1G.mjs → web-Cq_AQ4DK.mjs} +9 -10
- package/dist/web-Je6abcpz.mjs +2 -0
- package/dist/web-run.mjs +9 -9
- package/dist/windows-report.mjs +1 -1
- package/dist/{workspace-state-CPSp3mav.mjs → workspace-state-BjqdjnJR.mjs} +46 -8
- package/dist/{workspaces-C9w4aeXF.mjs → workspaces-DFbj07jp.mjs} +1801 -76
- package/dist/{worktree-CclFIe1Z.mjs → worktree-COAJ3-OD.mjs} +934 -511
- package/dist/{worktree-Ct9Gk3KL.mjs → worktree-JGUd_53L.mjs} +1 -1
- package/package.json +8 -8
- package/dist/ccache-h1FKhZeg.mjs +0 -143
- package/dist/created-devices-D2Aca-xu.mjs +0 -52
- package/dist/eas-fallback-gaZi-dJL.mjs +0 -381
- package/dist/hosted-ios-RtVcJH3u.mjs +0 -15
- package/dist/native-run-D5OJsGwA.mjs +0 -276
- package/dist/paths-DQtTgsBf.mjs +0 -42
- package/dist/prebuild-JUaqOLpc.mjs +0 -501
- package/dist/server-expo-C16Zf2k7.mjs +0 -2
- package/dist/settings-write-n0zwfohx.mjs +0 -360
- package/dist/toolchain-DB1aeqxO.mjs +0 -2
- package/dist/toolchain-VzLJzZ7O.mjs +0 -908
- package/dist/trigger-BLsHgAGR.mjs +0 -2
- package/dist/web-DS4UDWvf.mjs +0 -2
- package/dist/xcode-CiIIDnuD.mjs +0 -910
|
@@ -1,32 +1,31 @@
|
|
|
1
|
-
import { C as reportSignal, T as trackReportResource, t as getExecutor } from "./exec-
|
|
2
|
-
import {
|
|
3
|
-
import { _ as loadConfig$1,
|
|
4
|
-
import { d as quotedPath, u as plural } from "./command-output-
|
|
5
|
-
import { l as gitQuietAsync, o as git } from "./operation-exec-
|
|
6
|
-
import { r as
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
12
|
-
import { N as listBuildLocks } from "./activity-
|
|
13
|
-
import {
|
|
14
|
-
import {
|
|
1
|
+
import { C as reportSignal, T as trackReportResource, t as getExecutor } from "./exec-aULwtNly.mjs";
|
|
2
|
+
import { T as workspaceDerivedData, r as readWorkspaceState$1, y as sharedBuildCache } from "./workspace-state-BjqdjnJR.mjs";
|
|
3
|
+
import { _ as loadConfig$1, at as realIo, s as configCorruptRepair, u as getConcurrencyLimits } from "./config-Cn94Jc0g.mjs";
|
|
4
|
+
import { d as quotedPath, u as plural } from "./command-output-Dj-WT4BP.mjs";
|
|
5
|
+
import { l as gitQuietAsync, o as git } from "./operation-exec-Dp4FuIGR.mjs";
|
|
6
|
+
import { $t as makeTemporaryDirectory, At as listWorktreesAsync, Bt as resolveSourceCheckoutAsync, D as iosSimSlimProfileSetting, E as iosSimSlimDefaultSetting, G as remoteIosSetting, It as repoRoot, Lt as repoRootAsync, Mt as locallyKnownUpstreamAsync, Q as resolveSettings, Qt as filesystemDevice, R as projectSettingsContext, U as remoteAndroidSetting, V as readCommittedSettings, Y as resolveIosProjectDir, a as SETTING_SHAPE_REMEDY, at as settingsLayers, ct as webSettings, i as SETTINGS_WITH_RESOLVE_TIME_FALLBACK, it as settingValueAt, k as mergeSettingsLayers, m as defaultAndroidLayout, nn as temporaryRoot, q as resolveAndroidLayout, r as PATH_SETTINGS, rt as settingShapeErrors, st as unknownSettingKeys, tt as settingOrigin, vt as dirtyFingerprintFiles, xt as gitCommonDirAsync } from "./settings-BDVI8Ivc.mjs";
|
|
7
|
+
import { C as resolvePackageJson, _ as appProjectProblem, b as isPackageResolvable, v as detectIsExpo } from "./project-DYj-HVx6.mjs";
|
|
8
|
+
import { ft as POOL_SETTING_REMEDY, k as hostSystemImageArch, o as androidHome, vt as parkedMaxSetting } from "./android-DriNoAVy.mjs";
|
|
9
|
+
import { An as checkEasAuth$1, Fn as providerFromConfig, Gn as easCliSupport, Kn as easCliUpgradeRemedy, Ln as resolveEasCliBin, Pn as ownerFromConfig, Wn as MIN_EAS_CLI_SIMULATOR_VERSION, a as projectCmakeLauncher, i as ccacheInstallCommand, jt as readInstalledEasCliVersionAsync } from "./ccache-BWTze1Ls.mjs";
|
|
10
|
+
import { bt as listBuildSlots } from "./workspaces-DFbj07jp.mjs";
|
|
11
|
+
import { Y as podInstallCommand } from "./toolchain-CbCG6C5Z.mjs";
|
|
12
|
+
import { N as listBuildLocks } from "./activity-Cd-ysFes.mjs";
|
|
13
|
+
import { m as fingerprintProject, o as diffFingerprintSources } from "./build-cache-gBJ-WKzA.mjs";
|
|
14
|
+
import { F as hostMemoryPressureAdvice, z as readHostMemoryPressureAsync } from "./ios-E26qSpkb.mjs";
|
|
15
15
|
import { p as resolveOptimizations, u as compilerCacheFallbackMessage } from "./errors-DHm_U5gv.mjs";
|
|
16
|
-
import {
|
|
17
|
-
import {
|
|
18
|
-
import {
|
|
19
|
-
import { a as countLiveOwnedDevicesAsync, i as countLiveOwnedDevices } from "./device-capacity-
|
|
20
|
-
import { t as readDoctorFingerprint } from "./doctor-fingerprint-
|
|
21
|
-
import { i as probeSigningIdentities } from "./ios-signing-
|
|
22
|
-
import { a as findChrome, t as CHROME_INSTALL_REMEDY } from "./chrome-
|
|
23
|
-
import {
|
|
24
|
-
import {
|
|
25
|
-
import { t as
|
|
26
|
-
import { r as resolveAndroidCompilerCache, t as readAndroidCasToolchain } from "./android-cas-BVqh2Zep.mjs";
|
|
16
|
+
import { n as hasInstalledDependencies, r as installedNpmTreeIsValidAsync, t as dependencyState } from "./dependency-state-C3OtgG94.mjs";
|
|
17
|
+
import { g as androidPathRoomRemedy, i as ccacheEnabled, l as androidSdkRefusal, m as androidPathRoomMessage, p as androidPathRoom, t as apkOutputsDir } from "./react-native-build-DaK2IFyP.mjs";
|
|
18
|
+
import { a as envSettingRefusal, i as configSettingRefusal } from "./settings-payload-cm60Zhib.mjs";
|
|
19
|
+
import { a as countLiveOwnedDevicesAsync, i as countLiveOwnedDevices } from "./device-capacity-6LP7QsaA.mjs";
|
|
20
|
+
import { t as readDoctorFingerprint } from "./doctor-fingerprint-o7ZI9YLn.mjs";
|
|
21
|
+
import { i as probeSigningIdentities } from "./ios-signing-BJzvDPfU.mjs";
|
|
22
|
+
import { a as findChrome, t as CHROME_INSTALL_REMEDY } from "./chrome-DyDWurWG.mjs";
|
|
23
|
+
import { n as simslimIsOnPath } from "./simslim-DCQwzoPy.mjs";
|
|
24
|
+
import { t as MIN_EAS_CLI_BUILD_DOWNLOAD_VERSION } from "./eas-build-CjNSWmjo.mjs";
|
|
25
|
+
import { r as resolveAndroidCompilerCache, t as readAndroidCasToolchain } from "./android-cas-D5e6ecUg.mjs";
|
|
27
26
|
import { existsSync, lstatSync, readFileSync, readdirSync, realpathSync, rmSync } from "node:fs";
|
|
28
27
|
import { basename, dirname, isAbsolute, join, relative, resolve, sep } from "node:path";
|
|
29
|
-
import { LAST_BUILD_KEYS, isJsonObject, readBuildHistory, readJsonObject, readStats, settingDefinition } from "@stim-cli/core/state";
|
|
28
|
+
import { LAST_BUILD_KEYS, REPLACED_SETTINGS, isJsonObject, readBuildHistory, readJsonObject, readStats, replacementAdvice, settingDefinition } from "@stim-cli/core/state";
|
|
30
29
|
import { basename as basename$1, dirname as dirname$1, isAbsolute as isAbsolute$1, join as join$1, relative as relative$1, resolve as resolve$1, sep as sep$1 } from "path";
|
|
31
30
|
import { existsSync as existsSync$1, lstatSync as lstatSync$1, readFileSync as readFileSync$1, readdirSync as readdirSync$1, realpathSync as realpathSync$1 } from "fs";
|
|
32
31
|
import * as expoFingerprint from "@expo/fingerprint";
|
|
@@ -36,9 +35,15 @@ import { createRequire } from "module";
|
|
|
36
35
|
function readMachineSettings(context) {
|
|
37
36
|
try {
|
|
38
37
|
const layers = settingsLayers(context);
|
|
38
|
+
const repositoryLayer = context.projectPath && context.repoRoot && context.repoRoot !== context.projectPath ? {
|
|
39
|
+
scope: "committed",
|
|
40
|
+
file: join(context.repoRoot, ".stim.json"),
|
|
41
|
+
settings: readCommittedSettings(context.repoRoot)
|
|
42
|
+
} : null;
|
|
39
43
|
return {
|
|
40
44
|
settings: mergeSettingsLayers(layers.map((layer) => layer.settings)),
|
|
41
45
|
layers,
|
|
46
|
+
repositoryLayer,
|
|
42
47
|
corrupt: null
|
|
43
48
|
};
|
|
44
49
|
} catch (error) {
|
|
@@ -56,7 +61,7 @@ function readMachineSettings(context) {
|
|
|
56
61
|
}
|
|
57
62
|
}
|
|
58
63
|
const PATH_SETTINGS_TRIMMED_BY_THEIR_CONSUMER = /* @__PURE__ */ new Set(["android.keystore"]);
|
|
59
|
-
function checkMachineSettings({ settings, layers, projectRoot, optimizations = null, reportedElsewhere = [], exists = existsSync, env = process.env }) {
|
|
64
|
+
function checkMachineSettings({ settings, layers, repositoryLayer = null, projectRoot, optimizations = null, reportedElsewhere = [], exists = existsSync, env = process.env, remoteBuild }) {
|
|
60
65
|
const findings = [];
|
|
61
66
|
const fallback = optimizations?.android.compilerCacheFallback ?? null;
|
|
62
67
|
const fallbackEntry = fallback ? settingOrigin(layers, fallback.key) : null;
|
|
@@ -95,13 +100,49 @@ function checkMachineSettings({ settings, layers, projectRoot, optimizations = n
|
|
|
95
100
|
optimizations,
|
|
96
101
|
file: fallbackEntry?.file ?? null
|
|
97
102
|
}));
|
|
98
|
-
|
|
99
|
-
|
|
103
|
+
const holders = repositoryLayer ? [...layers, repositoryLayer] : layers;
|
|
104
|
+
const unknownKeys = /* @__PURE__ */ new Set([...unknownSettingKeys(settings), ...repositoryLayer ? unknownSettingKeys(repositoryLayer.settings) : []]);
|
|
105
|
+
for (const key of unknownKeys) for (const holder of holders.filter((layer) => settingValueAt(layer.settings, key) !== void 0)) {
|
|
106
|
+
const file = holder.file;
|
|
107
|
+
const advice = replacementAdvice(key, settingValueAt(holder.settings, key));
|
|
108
|
+
if (advice) {
|
|
109
|
+
findings.push({
|
|
110
|
+
level: "note",
|
|
111
|
+
title: `${key} was replaced by ${advice.key}`,
|
|
112
|
+
detail: `${key} in ${file} is not read by Stim, so ${advice.key} decides placement and its default applies until you set it.`,
|
|
113
|
+
fix: `${advice.command ? `Run \`${advice.command}\`` : `Set ${advice.key}`}, then remove ${key} from ${file}.`
|
|
114
|
+
});
|
|
115
|
+
continue;
|
|
116
|
+
}
|
|
100
117
|
findings.push({
|
|
101
118
|
level: "note",
|
|
102
119
|
title: "A key in the config is inert",
|
|
103
|
-
detail: `${key}
|
|
104
|
-
fix: `Remove ${key}
|
|
120
|
+
detail: `${key} in ${file} is not read by Stim, so its value changes nothing.`,
|
|
121
|
+
fix: `Remove ${key} from ${file}, or run \`stim guide settings\` for the name that replaced it.`
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
const buildValueRefusal = configSettingRefusal("remote.build", remoteBuild);
|
|
125
|
+
if (buildValueRefusal) findings.push({
|
|
126
|
+
level: "cost",
|
|
127
|
+
title: "A setting has the wrong type",
|
|
128
|
+
detail: buildValueRefusal.message,
|
|
129
|
+
fix: buildValueRefusal.remedy
|
|
130
|
+
});
|
|
131
|
+
const buildEnvRefusal = envSettingRefusal("remote.build", env);
|
|
132
|
+
if (buildEnvRefusal) findings.push({
|
|
133
|
+
level: "cost",
|
|
134
|
+
title: "A setting has the wrong type",
|
|
135
|
+
detail: buildEnvRefusal.message,
|
|
136
|
+
fix: buildEnvRefusal.remedy
|
|
137
|
+
});
|
|
138
|
+
for (const [key, replaced] of Object.entries(REPLACED_SETTINGS)) {
|
|
139
|
+
if (!replaced.env || !env[replaced.env]?.trim()) continue;
|
|
140
|
+
const advice = replacementAdvice(key, env[replaced.env]);
|
|
141
|
+
findings.push({
|
|
142
|
+
level: "note",
|
|
143
|
+
title: `${replaced.env} was replaced by ${replaced.key}`,
|
|
144
|
+
detail: `${replaced.env} is not read by Stim, so ${replaced.key} decides placement and its default applies until you set it.`,
|
|
145
|
+
fix: `${advice?.command ? `Run \`${advice.command}\`` : `Set ${replaced.key}`}, then unset ${replaced.env}.`
|
|
105
146
|
});
|
|
106
147
|
}
|
|
107
148
|
return findings;
|
|
@@ -563,9 +604,9 @@ function checkChrome({ usesWeb, chrome = findChrome }) {
|
|
|
563
604
|
if (!usesWeb() || chrome()) return null;
|
|
564
605
|
return finding("cost", "No Chrome is installed, so `stim web` cannot open this app", "`stim web` drives the installed Google Chrome or Chromium with a Stim-owned profile, and found neither in /Applications, ~/Applications, Program Files or on PATH. This project renders on the web (web.url is set, app.json lists the web platform, or react-native-web is installed).", CHROME_INSTALL_REMEDY);
|
|
565
606
|
}
|
|
566
|
-
function checkCcacheInstalled(onPath) {
|
|
607
|
+
function checkCcacheInstalled(onPath, platform = process.platform) {
|
|
567
608
|
if (onPath) return null;
|
|
568
|
-
return finding("cost", "ccache is not on PATH, so Android C++ recompiles in every worktree", "Stim resolves the launcher with a PATH lookup for `ccache` -- the same lookup the build itself uses -- and found nothing, so it passes no CMAKE_C_COMPILER_LAUNCHER / CMAKE_CXX_COMPILER_LAUNCHER to Gradle and every AGP CMake task compiles without one. Those tasks are uncacheable by Gradle, so not one C++ object crosses a worktree. Measured on trailhead (arm64, fresh worktree): 49.6s without the launcher against 34.2s with it.",
|
|
609
|
+
return finding("cost", "ccache is not on PATH, so Android C++ recompiles in every worktree", "Stim resolves the launcher with a PATH lookup for `ccache` -- the same lookup the build itself uses -- and found nothing, so it passes no CMAKE_C_COMPILER_LAUNCHER / CMAKE_CXX_COMPILER_LAUNCHER to Gradle and every AGP CMake task compiles without one. Those tasks are uncacheable by Gradle, so not one C++ object crosses a worktree. Measured on trailhead (arm64, fresh worktree): 49.6s without the launcher against 34.2s with it.", `${ccacheInstallCommand(platform)}, then delete android/app/.cxx and node_modules/**/android/.cxx once so CMake reconfigures with the launcher. The shell that runs Stim must have the install location on PATH${platform === "darwin" ? " -- agent shells often lack /opt/homebrew/bin" : ""}.`);
|
|
569
610
|
}
|
|
570
611
|
function launcherPath(launcher) {
|
|
571
612
|
const command = launcher?.split(";")[0]?.trim();
|
|
@@ -810,9 +851,11 @@ async function runDoctor(projectRoot, options = {}, inspectors = []) {
|
|
|
810
851
|
...checkMachineSettings({
|
|
811
852
|
settings: projectSettings,
|
|
812
853
|
layers: machineSettings.layers,
|
|
854
|
+
repositoryLayer: machineSettings.repositoryLayer,
|
|
813
855
|
projectRoot,
|
|
814
856
|
optimizations,
|
|
815
857
|
env: options.operation?.env ?? options.remoteEnv ?? process.env,
|
|
858
|
+
remoteBuild: loadConfig$1()?.remote?.build,
|
|
816
859
|
reportedElsewhere: simslimProfileError ? ["ios.simslimProfile"] : []
|
|
817
860
|
})
|
|
818
861
|
].filter((f) => Boolean(f));
|
|
@@ -874,8 +917,9 @@ async function reactNativeDoctorFindings({ root: projectRoot, settings: projectS
|
|
|
874
917
|
readEasCliVersion: () => remoteVersion
|
|
875
918
|
})).filter((remoteFinding) => remoteFinding !== null);
|
|
876
919
|
const easBuildDownloadFinding = await projectEasBuildDownloadFinding(projectRoot, remoteBackends, lookupEasCli, options.operation);
|
|
920
|
+
const appProjectFinding = checkAppProject(projectRoot);
|
|
877
921
|
return [
|
|
878
|
-
|
|
922
|
+
appProjectFinding,
|
|
879
923
|
checkIosHost(platform, host),
|
|
880
924
|
checkXcodeEnvLineEndings(projectRoot, platform, host),
|
|
881
925
|
...checkStorageLayout(projectRoot, {
|
|
@@ -899,7 +943,8 @@ async function reactNativeDoctorFindings({ root: projectRoot, settings: projectS
|
|
|
899
943
|
easFinding,
|
|
900
944
|
easBuildDownloadFinding,
|
|
901
945
|
await readOffloadCandidate(tailnetStatus, now(), host),
|
|
902
|
-
...remoteFindings
|
|
946
|
+
...remoteFindings,
|
|
947
|
+
appProjectFinding ? null : checkReadinessMarkers(projectRoot)
|
|
903
948
|
].filter((value) => Boolean(value));
|
|
904
949
|
}
|
|
905
950
|
function checkAndroidPathRoom(projectRoot, platform, host, hostArch = process.arch) {
|
|
@@ -954,6 +999,54 @@ function checkAppProject(projectRoot) {
|
|
|
954
999
|
if (problem.kind === "not-an-app") result.code = "not-an-app";
|
|
955
1000
|
return result;
|
|
956
1001
|
}
|
|
1002
|
+
const READINESS_MARKER = "[stim:readiness]";
|
|
1003
|
+
const READINESS_SCAN_LIMIT = 5e3;
|
|
1004
|
+
const READINESS_SKIPPED_DIRS = /* @__PURE__ */ new Set([
|
|
1005
|
+
"node_modules",
|
|
1006
|
+
"ios",
|
|
1007
|
+
"android",
|
|
1008
|
+
"macos",
|
|
1009
|
+
"windows",
|
|
1010
|
+
"Pods",
|
|
1011
|
+
"build",
|
|
1012
|
+
"dist",
|
|
1013
|
+
"web-build",
|
|
1014
|
+
"coverage"
|
|
1015
|
+
]);
|
|
1016
|
+
const JS_SOURCE = /\.[cm]?[jt]sx?$/;
|
|
1017
|
+
function hasReadinessMarker(projectRoot) {
|
|
1018
|
+
const dirs = [projectRoot];
|
|
1019
|
+
let scanned = 0;
|
|
1020
|
+
for (let dir = dirs.pop(); dir !== void 0; dir = dirs.pop()) {
|
|
1021
|
+
let entries;
|
|
1022
|
+
try {
|
|
1023
|
+
entries = readdirSync$1(dir, { withFileTypes: true });
|
|
1024
|
+
} catch {
|
|
1025
|
+
continue;
|
|
1026
|
+
}
|
|
1027
|
+
for (const entry of entries) {
|
|
1028
|
+
if (entry.name.startsWith(".")) continue;
|
|
1029
|
+
const path = join$1(dir, entry.name);
|
|
1030
|
+
if (entry.isDirectory()) {
|
|
1031
|
+
if (!READINESS_SKIPPED_DIRS.has(entry.name)) dirs.push(path);
|
|
1032
|
+
continue;
|
|
1033
|
+
}
|
|
1034
|
+
if (!entry.isFile() || !JS_SOURCE.test(entry.name)) continue;
|
|
1035
|
+
if (++scanned > READINESS_SCAN_LIMIT) return null;
|
|
1036
|
+
try {
|
|
1037
|
+
if (readFileSync$1(path, "utf-8").includes(READINESS_MARKER)) return true;
|
|
1038
|
+
} catch {}
|
|
1039
|
+
}
|
|
1040
|
+
}
|
|
1041
|
+
return false;
|
|
1042
|
+
}
|
|
1043
|
+
function checkReadinessMarkers(projectRoot) {
|
|
1044
|
+
if (hasReadinessMarker(projectRoot) !== false) return null;
|
|
1045
|
+
return {
|
|
1046
|
+
code: "readiness-markers-missing",
|
|
1047
|
+
...finding("note", "The app does not report readiness to Stim", `No \`${READINESS_MARKER}\` marker appears in this app's JavaScript or TypeScript sources outside node_modules. A debug \`stim ios\` or \`stim android\` launch then ends shortly after the app's JavaScript starts running, before the app is usable, and a later startup error shows only in \`stim logs --errors\`.`, "In debug builds, log `[stim:readiness] pending` from the first module the app's entry loads, before the root component, and `[stim:readiness] ready` once the app is usable. `stim guide lifecycle readiness` has the code.")
|
|
1048
|
+
};
|
|
1049
|
+
}
|
|
957
1050
|
function agentDeviceIsOnPath() {
|
|
958
1051
|
try {
|
|
959
1052
|
return Boolean(getExecutor().findExecutable("agent-device"));
|
|
@@ -1,14 +1,20 @@
|
|
|
1
|
-
import { t as getExecutor } from "./exec-
|
|
1
|
+
import { t as getExecutor } from "./exec-aULwtNly.mjs";
|
|
2
|
+
import { setPriority } from "node:os";
|
|
2
3
|
import { fileURLToPath } from "node:url";
|
|
3
4
|
//#region src/doctor-fingerprint.ts
|
|
4
|
-
async function readDoctorFingerprint(operation, request) {
|
|
5
|
+
async function readDoctorFingerprint(operation, request, { lowPriority = false } = {}) {
|
|
5
6
|
const output = await getExecutor().runFileAsync(process.execPath, [fileURLToPath(new URL("../dist/doctor-fingerprint.mjs", import.meta.url))], {
|
|
6
7
|
cwd: operation.cwd,
|
|
7
8
|
env: Object.fromEntries(Object.entries(operation.env).filter((entry) => entry[1] !== void 0)),
|
|
8
9
|
input: JSON.stringify(request),
|
|
9
10
|
timeoutMs: 6e4,
|
|
10
11
|
killSignal: "SIGKILL",
|
|
11
|
-
signal: operation.signal
|
|
12
|
+
signal: operation.signal,
|
|
13
|
+
...lowPriority ? { onSpawn: (child) => {
|
|
14
|
+
try {
|
|
15
|
+
if (child.pid) setPriority(child.pid, 10);
|
|
16
|
+
} catch {}
|
|
17
|
+
} } : {}
|
|
12
18
|
});
|
|
13
19
|
return JSON.parse(output);
|
|
14
20
|
}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { E as upsertProject, O as withConfigLockAsync$1, d as getConfigDir, p as getProject } from "./config-
|
|
2
|
-
import { l as gitQuietAsync } from "./operation-exec-
|
|
3
|
-
import {
|
|
4
|
-
import { f as projectRegistry } from "./project-
|
|
5
|
-
import { d as parseWatchRoots, m as runWatchman, s as compareStimVersions } from "./eas-session-ledger-
|
|
1
|
+
import { E as upsertProject, O as withConfigLockAsync$1, d as getConfigDir, p as getProject } from "./config-Cn94Jc0g.mjs";
|
|
2
|
+
import { l as gitQuietAsync } from "./operation-exec-Dp4FuIGR.mjs";
|
|
3
|
+
import { At as listWorktreesAsync, Lt as repoRootAsync } from "./settings-BDVI8Ivc.mjs";
|
|
4
|
+
import { f as projectRegistry } from "./project-DYj-HVx6.mjs";
|
|
5
|
+
import { d as parseWatchRoots, m as runWatchman, s as compareStimVersions } from "./eas-session-ledger-DrP4OuuM.mjs";
|
|
6
6
|
import { mkdirSync, readFileSync, realpathSync, renameSync, rmSync, unlinkSync, writeFileSync } from "node:fs";
|
|
7
7
|
import { dirname, isAbsolute, join, relative, sep } from "node:path";
|
|
8
8
|
import { isJsonObject } from "@stim-cli/core/state";
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { D as ownership_claim_exports, c as throwIfCancelled, t as getExecutor } from "./exec-
|
|
2
|
-
import { a as killOnAbort, r as childEnvironment } from "./operation-exec-
|
|
3
|
-
import {
|
|
4
|
-
import { M as acquireBuildLock, P as releaseBuildLock } from "./activity-
|
|
1
|
+
import { D as ownership_claim_exports, c as throwIfCancelled, t as getExecutor } from "./exec-aULwtNly.mjs";
|
|
2
|
+
import { a as killOnAbort, r as childEnvironment } from "./operation-exec-Dp4FuIGR.mjs";
|
|
3
|
+
import { Gn as easCliSupport, Kn as easCliUpgradeRemedy, Ln as resolveEasCliBin, Vn as remoteCliInvocation } from "./ccache-BWTze1Ls.mjs";
|
|
4
|
+
import { M as acquireBuildLock, P as releaseBuildLock } from "./activity-Cd-ysFes.mjs";
|
|
5
5
|
import { createHash } from "node:crypto";
|
|
6
6
|
import { existsSync, realpathSync, statSync } from "node:fs";
|
|
7
7
|
//#region src/engine/eas-build.ts
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { c as throwIfCancelled, t as getExecutor } from "./exec-aULwtNly.mjs";
|
|
2
|
+
import { p as getProject } from "./config-Cn94Jc0g.mjs";
|
|
3
|
+
import { r as childEnvironment } from "./operation-exec-Dp4FuIGR.mjs";
|
|
4
|
+
import { dt as detectProviders, ft as planMetroReach } from "./settings-BDVI8Ivc.mjs";
|
|
5
|
+
import { M as readMetroTunnel, P as readRemoteSession } from "./project-DYj-HVx6.mjs";
|
|
6
|
+
import { Gn as easCliSupport, Hn as remoteCommand, Ln as resolveEasCliBin, Mn as isEasAuthFailureText, Un as MIN_EAS_CLI_DEVICE_VERSION, Wn as MIN_EAS_CLI_SIMULATOR_VERSION, jt as readInstalledEasCliVersionAsync } from "./ccache-BWTze1Ls.mjs";
|
|
7
|
+
//#region src/engine/eas-fallback.ts
|
|
8
|
+
const AVAILABILITY_TIMEOUT_MS = 3e4;
|
|
9
|
+
function unusable(code, reason) {
|
|
10
|
+
return {
|
|
11
|
+
usable: false,
|
|
12
|
+
code,
|
|
13
|
+
reason
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
/** Reads `eas simulator:availability --json`: `{"available": true, ...}` on stdout, or a failure on stderr. */
|
|
17
|
+
function parseSimulatorAvailability(outcome) {
|
|
18
|
+
if ("failure" in outcome) {
|
|
19
|
+
if (outcome.timedOut) return unusable("eas-unavailable", "eas simulator:availability timed out");
|
|
20
|
+
const detail = outcome.failure.split("\n").map((line) => line.trim()).find((line) => line && !/is now available\.$|^(To upgrade|npm install|Proceeding with|\(node:|\(Use `node)/.test(line));
|
|
21
|
+
if (isEasAuthFailureText(outcome.failure)) return unusable("eas-logged-out", "eas-cli is not logged in (run eas login or set EXPO_TOKEN)");
|
|
22
|
+
return unusable("eas-unavailable", `eas simulator:availability failed${detail ? `: ${detail}` : ""}`);
|
|
23
|
+
}
|
|
24
|
+
let data = null;
|
|
25
|
+
try {
|
|
26
|
+
data = JSON.parse(outcome.stdout.slice(outcome.stdout.indexOf("{")));
|
|
27
|
+
} catch {}
|
|
28
|
+
if (typeof data !== "object" || data === null || typeof data.available !== "boolean") return unusable("eas-unavailable", "eas simulator:availability printed no availability");
|
|
29
|
+
return data.available ? { usable: true } : unusable("eas-not-enabled", "EAS Simulator is not enabled for this EAS account");
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Whether this run could use an EAS Simulator the way `--remote eas` does, without starting a session or a build.
|
|
33
|
+
* Each refusal names what `--remote eas` would refuse later, so automatic placement falls through instead.
|
|
34
|
+
*/
|
|
35
|
+
async function checkEasFallback({ root, platform, slot, release, isExpo, tunnelMode, publicUrl, deviceTypeFlag, localOnlyFlags, env = process.env, resolveBin = resolveEasCliBin, readVersion = readInstalledEasCliVersionAsync, operation, onPath = (bin) => getExecutor().findExecutable(bin) !== null, readTunnel = readMetroTunnel, readSession = readRemoteSession, metroPort = () => getProject(root)?.metroPort ?? null, availability = async (bin) => {
|
|
36
|
+
try {
|
|
37
|
+
return { stdout: await remoteCommand({
|
|
38
|
+
operation,
|
|
39
|
+
easBin: bin
|
|
40
|
+
}, bin, [
|
|
41
|
+
"simulator:availability",
|
|
42
|
+
"--json",
|
|
43
|
+
"--non-interactive"
|
|
44
|
+
], {
|
|
45
|
+
cwd: root,
|
|
46
|
+
...childEnvironment(env),
|
|
47
|
+
timeoutMs: AVAILABILITY_TIMEOUT_MS
|
|
48
|
+
}) };
|
|
49
|
+
} catch (error) {
|
|
50
|
+
const err = error;
|
|
51
|
+
return {
|
|
52
|
+
failure: String(err.stderr || err.message || error),
|
|
53
|
+
timedOut: err.code === "ETIMEDOUT"
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
} }) {
|
|
57
|
+
if (slot !== "default") return unusable("eas-named-slot", `an EAS Simulator takes only the default slot, not ${slot}`);
|
|
58
|
+
if (localOnlyFlags.length) return unusable("eas-local-flags", `${localOnlyFlags.join(" and ")} applies only to a ${platform} device on a Mac`);
|
|
59
|
+
const session = readSession(root);
|
|
60
|
+
if (session && session.platform !== platform) return unusable("eas-session-busy", `this workspace's EAS Simulator session ${session.sessionId} runs ${session.platform ?? "another platform"}`);
|
|
61
|
+
if (session && deviceTypeFlag?.trim() && session.deviceType !== deviceTypeFlag.trim()) return unusable("eas-session-busy", `this workspace's EAS Simulator session ${session.sessionId} runs ${session.deviceType ?? "the model EAS chose"}, not ${deviceTypeFlag.trim()}`);
|
|
62
|
+
if (!onPath("agent-device")) return unusable("eas-no-agent-device", "agent-device is not on PATH");
|
|
63
|
+
throwIfCancelled(operation?.signal, "EAS availability");
|
|
64
|
+
const bin = resolveBin(root);
|
|
65
|
+
if (!bin) return unusable("eas-no-cli", "eas-cli is not installed for this project or on PATH");
|
|
66
|
+
const versionOutput = await readVersion(bin.file, root, operation);
|
|
67
|
+
const minimum = platform === "ios" && deviceTypeFlag?.trim() ? MIN_EAS_CLI_DEVICE_VERSION : MIN_EAS_CLI_SIMULATOR_VERSION;
|
|
68
|
+
const { supported, version } = easCliSupport(versionOutput, minimum);
|
|
69
|
+
if (!supported) return unusable("eas-cli-too-old", `eas-cli ${version ?? "(unknown version)"} is older than ${minimum}`);
|
|
70
|
+
if (!release) {
|
|
71
|
+
const mode = tunnelMode ?? "auto";
|
|
72
|
+
if (mode === "off") return unusable("eas-metro-unreachable", "metro.tunnel is off, so an EAS Simulator cannot reach Metro");
|
|
73
|
+
const plan = planMetroReach({
|
|
74
|
+
mode,
|
|
75
|
+
metroPort: metroPort() ?? "unknown",
|
|
76
|
+
publicUrl: env["STIM_METRO_PUBLIC_URL"]?.trim() || publicUrl,
|
|
77
|
+
isExpo,
|
|
78
|
+
available: detectProviders(onPath, mode)
|
|
79
|
+
});
|
|
80
|
+
if ("failed" in plan) return unusable("eas-metro-unreachable", plan.failed);
|
|
81
|
+
if ("start" in plan && plan.start === "tailscale") return unusable("eas-metro-unreachable", "metro.tunnel is tailscale, which an EAS Simulator cannot reach");
|
|
82
|
+
if ("expoTunnel" in plan && readTunnel(root)?.kind !== "expo") return unusable("eas-metro-unreachable", "Metro has no Expo tunnel; run stim start --remote first");
|
|
83
|
+
}
|
|
84
|
+
return parseSimulatorAvailability(await availability(bin.file));
|
|
85
|
+
}
|
|
86
|
+
//#endregion
|
|
87
|
+
export { checkEasFallback as t };
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { C as reportSignal, t as getExecutor } from "./exec-
|
|
2
|
-
import {
|
|
3
|
-
import { G as projectDeviceSlots, V as deviceSlotKey } from "./config-
|
|
4
|
-
import { a as formatElapsed, o as formatLongDuration, r as clockTime, u as plural } from "./command-output-
|
|
5
|
-
import { n as isInsideProject } from "./metro-
|
|
6
|
-
import { r as cdpEndpoint } from "./state-
|
|
1
|
+
import { C as reportSignal, t as getExecutor } from "./exec-aULwtNly.mjs";
|
|
2
|
+
import { M as withDirLock$1, N as withDirLockAsync$1, w as workspaceAgentDeviceDir } from "./workspace-state-BjqdjnJR.mjs";
|
|
3
|
+
import { G as projectDeviceSlots, V as deviceSlotKey } from "./config-Cn94Jc0g.mjs";
|
|
4
|
+
import { a as formatElapsed, o as formatLongDuration, r as clockTime, u as plural } from "./command-output-Dj-WT4BP.mjs";
|
|
5
|
+
import { n as isInsideProject } from "./metro-CvyD-xwe.mjs";
|
|
6
|
+
import { r as cdpEndpoint } from "./state-BX1y5syV.mjs";
|
|
7
7
|
import { accessSync, constants, existsSync, mkdirSync, realpathSync, renameSync, rmSync, statSync, writeFileSync } from "node:fs";
|
|
8
8
|
import { delimiter, dirname, join, resolve } from "node:path";
|
|
9
9
|
import { workspaceId } from "@stim-cli/core";
|
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
import { t as getExecutor } from "./exec-
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import { I as readWorkspaceLaunches } from "./project-
|
|
6
|
-
import { o as androidHome, u as androidToolCwd } from "./android-
|
|
7
|
-
import { d as resolveProjectMetro } from "./metro-
|
|
8
|
-
import { i as parseLogcatLine, n as androidLogGroups, r as isAndroidCrashText } from "./android-
|
|
9
|
-
import { S as parseLease, v as deviceLeasePath, y as fileLeaseIo } from "./activity-
|
|
10
|
-
import { r as deviceConsoleLevel } from "./ios-device-
|
|
1
|
+
import { t as getExecutor } from "./exec-aULwtNly.mjs";
|
|
2
|
+
import { r as readWorkspaceState$1 } from "./workspace-state-BjqdjnJR.mjs";
|
|
3
|
+
import { H as deviceSlotPlatforms, V as deviceSlotKey, p as getProject } from "./config-Cn94Jc0g.mjs";
|
|
4
|
+
import { v as launchErrorPreview } from "./command-output-Dj-WT4BP.mjs";
|
|
5
|
+
import { I as readWorkspaceLaunches } from "./project-DYj-HVx6.mjs";
|
|
6
|
+
import { o as androidHome, u as androidToolCwd } from "./android-DriNoAVy.mjs";
|
|
7
|
+
import { d as resolveProjectMetro } from "./metro-CvyD-xwe.mjs";
|
|
8
|
+
import { i as parseLogcatLine, n as androidLogGroups, r as isAndroidCrashText } from "./android-Deb9X3_Y.mjs";
|
|
9
|
+
import { S as parseLease, v as deviceLeasePath, y as fileLeaseIo } from "./activity-Cd-ysFes.mjs";
|
|
10
|
+
import { r as deviceConsoleLevel } from "./ios-device-CiBA-er9.mjs";
|
|
11
11
|
import { createHash, randomUUID } from "node:crypto";
|
|
12
12
|
import { existsSync, readFileSync, renameSync } from "node:fs";
|
|
13
13
|
import { homedir } from "node:os";
|
|
@@ -88,6 +88,28 @@ function parseIosCrash(text, target) {
|
|
|
88
88
|
return null;
|
|
89
89
|
}
|
|
90
90
|
}
|
|
91
|
+
/**
|
|
92
|
+
* The symbol dyld could not bind when one image of the app bundle needs a symbol that another image of the same
|
|
93
|
+
* bundle does not export. Only the bundle's own bytes decide this, so a stored app that does it never launches.
|
|
94
|
+
*/
|
|
95
|
+
function bundleBindFailure(record) {
|
|
96
|
+
if (record.event !== "native_crash" || typeof record.rawReport !== "string") return null;
|
|
97
|
+
try {
|
|
98
|
+
const termination = JSON.parse(record.rawReport.slice(record.rawReport.indexOf("\n") + 1)).termination;
|
|
99
|
+
if (termination?.namespace !== "DYLD") return null;
|
|
100
|
+
const bundles = /* @__PURE__ */ new Map();
|
|
101
|
+
let symbol;
|
|
102
|
+
for (const line of termination.reasons ?? []) {
|
|
103
|
+
symbol ??= /^Symbol not found: (\S+)/.exec(line)?.[1];
|
|
104
|
+
const image = /^(Referenced from|Expected in):\s+<[^>]+> (.*?\.app)\//.exec(line);
|
|
105
|
+
if (image?.[1] && image[2]) bundles.set(image[1], image[2]);
|
|
106
|
+
}
|
|
107
|
+
const bundle = bundles.get("Referenced from");
|
|
108
|
+
return symbol && bundle && bundle === bundles.get("Expected in") ? symbol : null;
|
|
109
|
+
} catch {
|
|
110
|
+
return null;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
91
113
|
/** Extracts crash-buffer groups only when their own process header names the target app. */
|
|
92
114
|
function parseAndroidCrashes(text, target, clockOffsetMs) {
|
|
93
115
|
const entries = text.split("\n").map((line) => parseLogcatLine(line, { clockOffsetMs })).filter((record) => record !== null && Number(record.ts) >= target.since && Number(record.ts) <= (target.until ?? Infinity));
|
|
@@ -310,6 +332,22 @@ async function simulatorFatalConsole(target, signal) {
|
|
|
310
332
|
signal?.throwIfAborted();
|
|
311
333
|
return records;
|
|
312
334
|
}
|
|
335
|
+
async function androidCrashClockOffset(deviceId, signal) {
|
|
336
|
+
const before = Date.now();
|
|
337
|
+
const clock = (await crashCommand("adb", [
|
|
338
|
+
"-s",
|
|
339
|
+
deviceId,
|
|
340
|
+
"shell",
|
|
341
|
+
"date",
|
|
342
|
+
"+%s%3N"
|
|
343
|
+
], {
|
|
344
|
+
timeoutMs: 1e3,
|
|
345
|
+
cwd: androidToolCwd()
|
|
346
|
+
}, signal))?.trim();
|
|
347
|
+
const after = Date.now();
|
|
348
|
+
if (!/^\d{13}$/.test(clock ?? "") || after < before || after - before > 1e3) return null;
|
|
349
|
+
return Math.round((before + after) / 2) - Number(clock);
|
|
350
|
+
}
|
|
313
351
|
/** Reads platform crash evidence without starting, stopping or modifying a device. */
|
|
314
352
|
async function captureNativeCrashes(target, logsDir, signal, env = process.env) {
|
|
315
353
|
signal?.throwIfAborted();
|
|
@@ -343,20 +381,8 @@ async function captureNativeCrashes(target, logsDir, signal, env = process.env)
|
|
|
343
381
|
}
|
|
344
382
|
if (nativeReports.length) records = nativeReports;
|
|
345
383
|
} else if (target.platform === "android") {
|
|
346
|
-
const
|
|
347
|
-
|
|
348
|
-
"-s",
|
|
349
|
-
target.deviceId,
|
|
350
|
-
"shell",
|
|
351
|
-
"date",
|
|
352
|
-
"+%s%3N"
|
|
353
|
-
], {
|
|
354
|
-
timeoutMs: 1e3,
|
|
355
|
-
cwd: androidToolCwd()
|
|
356
|
-
}, signal))?.trim();
|
|
357
|
-
const after = Date.now();
|
|
358
|
-
if (!/^\d{13}$/.test(clock ?? "") || after < before || after - before > 1e3) return [];
|
|
359
|
-
const offset = Math.round((before + after) / 2) - Number(clock);
|
|
384
|
+
const offset = target.clockOffsetMs === void 0 ? await androidCrashClockOffset(target.deviceId, signal) : target.clockOffsetMs;
|
|
385
|
+
if (offset === null) return [];
|
|
360
386
|
const text = await crashCommand("adb", [
|
|
361
387
|
"-s",
|
|
362
388
|
target.deviceId,
|
|
@@ -722,4 +748,4 @@ async function errorDiagnostics(input, { root, logsDir, port, allowRequest = fal
|
|
|
722
748
|
return merged;
|
|
723
749
|
}
|
|
724
750
|
//#endregion
|
|
725
|
-
export {
|
|
751
|
+
export { captureNativeCrashes as a, simulatorConsolePaths as c, bundleBindFailure as i, IOS_CRASH_REPORT_RETRY as n, captureWorkspaceCrashes as o, androidCrashClockOffset as r, printNativeCrashReport as s, errorDiagnostics as t };
|
|
@@ -4,7 +4,7 @@ import { existsSync, rmSync } from "node:fs";
|
|
|
4
4
|
import { availableParallelism, loadavg, tmpdir } from "node:os";
|
|
5
5
|
import { join } from "node:path";
|
|
6
6
|
import { ambientContext, ambientEnv } from "@stim-cli/core";
|
|
7
|
-
import { createDebugLog, runId } from "@stim-cli/core/state";
|
|
7
|
+
import { createDebugLog, redactArgv, redactCommandLine, runId, trace } from "@stim-cli/core/state";
|
|
8
8
|
import { basename as basename$1, delimiter as delimiter$1, join as join$1, resolve as resolve$1 } from "path";
|
|
9
9
|
import { execSync } from "child_process";
|
|
10
10
|
import spawn from "cross-spawn";
|
|
@@ -876,12 +876,37 @@ function outcomeOf(error) {
|
|
|
876
876
|
};
|
|
877
877
|
}
|
|
878
878
|
let executionId = 0;
|
|
879
|
-
function
|
|
879
|
+
function fileSpan(file, args, opts) {
|
|
880
|
+
const program = basename$1(file);
|
|
881
|
+
const argv = redactArgv(args ?? [], opts.redact, file);
|
|
882
|
+
const first = argv[0];
|
|
883
|
+
return {
|
|
884
|
+
name: first && /^[a-z][a-z0-9-]{1,23}$/.test(first) ? `${program} ${first}` : program,
|
|
885
|
+
args: {
|
|
886
|
+
argv: [file, ...argv],
|
|
887
|
+
...opts.cwd ? { cwd: opts.cwd } : {}
|
|
888
|
+
}
|
|
889
|
+
};
|
|
890
|
+
}
|
|
891
|
+
function commandSpan(cmd, opts) {
|
|
892
|
+
return {
|
|
893
|
+
name: programOf(cmd.replace(/^\s*(?:[A-Za-z_][A-Za-z0-9_]*=\S*\s+)+/, "")).replace(/["']/g, ""),
|
|
894
|
+
args: {
|
|
895
|
+
command: redactCommandLine(cmd, opts.redact),
|
|
896
|
+
...opts.cwd ? { cwd: opts.cwd } : {}
|
|
897
|
+
}
|
|
898
|
+
};
|
|
899
|
+
}
|
|
900
|
+
function timedSync(fn, program, span) {
|
|
880
901
|
return (...args) => {
|
|
881
|
-
|
|
902
|
+
const logging = debugLog.enabled();
|
|
903
|
+
const tracing = trace.enabled();
|
|
904
|
+
if (!logging && !tracing) return fn(...args);
|
|
882
905
|
const id = ++executionId;
|
|
883
906
|
const name = program(...args);
|
|
884
907
|
const started = performance.now();
|
|
908
|
+
const traced = tracing ? span(...args) : null;
|
|
909
|
+
const end = traced ? trace.beginExec(traced.name, traced.args) : null;
|
|
885
910
|
debugLog.log("exec.start", {
|
|
886
911
|
program: name,
|
|
887
912
|
executionId: id
|
|
@@ -894,6 +919,7 @@ function timedSync(fn, program) {
|
|
|
894
919
|
ms: Math.round(performance.now() - started),
|
|
895
920
|
ok: true
|
|
896
921
|
});
|
|
922
|
+
end?.({ ok: true });
|
|
897
923
|
return out;
|
|
898
924
|
} catch (error) {
|
|
899
925
|
debugLog.log("exec", {
|
|
@@ -902,19 +928,24 @@ function timedSync(fn, program) {
|
|
|
902
928
|
ms: Math.round(performance.now() - started),
|
|
903
929
|
...outcomeOf(error)
|
|
904
930
|
});
|
|
931
|
+
end?.(outcomeOf(error));
|
|
905
932
|
throw error;
|
|
906
933
|
}
|
|
907
934
|
};
|
|
908
935
|
}
|
|
909
936
|
let active = {
|
|
910
937
|
...defaultExecutor,
|
|
911
|
-
run: timedSync((cmd, opts) => defaultExecutor.run(cmd, opts), programOf),
|
|
912
|
-
runFile: timedSync((file, args, opts) => defaultExecutor.runFile(file, args, opts), (file) => basename$1(file)),
|
|
938
|
+
run: timedSync((cmd, opts) => defaultExecutor.run(cmd, opts), programOf, (cmd, opts) => commandSpan(cmd, opts)),
|
|
939
|
+
runFile: timedSync((file, args, opts) => defaultExecutor.runFile(file, args, opts), (file) => basename$1(file), (file, args, opts) => fileSpan(file, args, opts)),
|
|
913
940
|
async runFileAsync(file, args, opts) {
|
|
914
|
-
|
|
941
|
+
const logging = debugLog.enabled();
|
|
942
|
+
const tracing = trace.enabled();
|
|
943
|
+
if (!logging && !tracing) return defaultExecutor.runFileAsync(file, args, opts);
|
|
915
944
|
const id = ++executionId;
|
|
916
945
|
const name = basename$1(file);
|
|
917
946
|
const started = performance.now();
|
|
947
|
+
const traced = tracing ? fileSpan(file, args, opts) : null;
|
|
948
|
+
const end = traced ? trace.beginExec(traced.name, traced.args) : null;
|
|
918
949
|
debugLog.log("exec.start", {
|
|
919
950
|
program: name,
|
|
920
951
|
executionId: id
|
|
@@ -927,6 +958,7 @@ let active = {
|
|
|
927
958
|
ms: Math.round(performance.now() - started),
|
|
928
959
|
ok: true
|
|
929
960
|
});
|
|
961
|
+
end?.({ ok: true });
|
|
930
962
|
return out;
|
|
931
963
|
} catch (error) {
|
|
932
964
|
debugLog.log("exec", {
|
|
@@ -935,8 +967,27 @@ let active = {
|
|
|
935
967
|
ms: Math.round(performance.now() - started),
|
|
936
968
|
...outcomeOf(error)
|
|
937
969
|
});
|
|
970
|
+
end?.(outcomeOf(error));
|
|
938
971
|
throw error;
|
|
939
972
|
}
|
|
973
|
+
},
|
|
974
|
+
spawn(cmd, args, opts) {
|
|
975
|
+
const child = defaultExecutor.spawn(cmd, args, opts);
|
|
976
|
+
if (!trace.enabled()) return child;
|
|
977
|
+
const { name, args: spanArgs } = fileSpan(cmd, args, {
|
|
978
|
+
timeoutMs: "unbounded",
|
|
979
|
+
...typeof opts?.cwd === "string" ? { cwd: opts.cwd } : {}
|
|
980
|
+
});
|
|
981
|
+
const end = trace.beginExec(name, {
|
|
982
|
+
...spanArgs,
|
|
983
|
+
spawned: true
|
|
984
|
+
});
|
|
985
|
+
child.once("close", (exit, signal) => end({
|
|
986
|
+
ok: exit === 0,
|
|
987
|
+
...exit !== null ? { exit } : {},
|
|
988
|
+
...signal ? { signal } : {}
|
|
989
|
+
}));
|
|
990
|
+
return child;
|
|
940
991
|
}
|
|
941
992
|
};
|
|
942
993
|
function getExecutor() {
|