@absolutejs/absolute 0.20.0-beta.104 → 0.20.0-beta.106

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 (32) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/changelog.json +45 -0
  3. package/dist/angular/components/core/streamingSlotRegistrar.js +1 -1
  4. package/dist/angular/components/core/streamingSlotRegistry.js +2 -2
  5. package/dist/cli/{compile-g8vmvr0w.js → compile-hsbs1xf6.js} +2 -2
  6. package/dist/cli/{dev-m4r4zs2k.js → dev-f6b6hkke.js} +4 -4
  7. package/dist/cli/{expoProject-780thyfd.js → expoProject-zkprmjjz.js} +1 -1
  8. package/dist/cli/{index-d5fr1xp3.js → index-0zcebhm4.js} +59 -1
  9. package/dist/cli/{index-wpfvpsk7.js → index-5skbydh0.js} +1 -1
  10. package/dist/cli/{index-67kedtn7.js → index-hrzd7e5x.js} +1 -1
  11. package/dist/cli/{index-3sdvzrv2.js → index-jf1f6npt.js} +233 -4
  12. package/dist/cli/{index-27hhdgtg.js → index-mazxtfh4.js} +1 -1
  13. package/dist/cli/{index-qxnptvwn.js → index-q1d4ns4n.js} +100 -9
  14. package/dist/cli/index.js +5 -5
  15. package/dist/cli/{iosNativeWatcher-3k715hq0.js → iosNativeWatcher-t6gv0p1w.js} +2 -2
  16. package/dist/cli/{iosSimulatorController-dr98a0p9.js → iosSimulatorController-5n2a9fxv.js} +2 -2
  17. package/dist/cli/{mobile-njmnd7vc.js → mobile-w4my2dc7.js} +1008 -173
  18. package/dist/cli/{remoteMacProtocol-kqvkp0qd.js → remoteMacProtocol-dybpgazw.js} +6 -2
  19. package/dist/cli/{start-39aqmr5n.js → start-5grq7nfr.js} +3 -3
  20. package/dist/mobile/index.js +1445 -575
  21. package/dist/mobile/index.js.map +10 -9
  22. package/dist/mobile/remoteMacAgentEntry.js +341 -294
  23. package/dist/src/mobile/index.d.ts +1 -0
  24. package/dist/src/mobile/iosRelease.d.ts +31 -7
  25. package/dist/src/mobile/iosReleaseAcceptance.d.ts +66 -0
  26. package/dist/src/mobile/iosTestReport.d.ts +1 -0
  27. package/dist/src/mobile/nativeReleaseReadiness.d.ts +1 -1
  28. package/dist/src/mobile/nativeTestReport.d.ts +16 -0
  29. package/dist/src/mobile/remoteMacProtocol.d.ts +51 -4
  30. package/dist/src/mobile/remoteMacWire.d.ts +1 -1
  31. package/dist/src/mobile/shellReleaseReadiness.d.ts +1 -1
  32. package/package.json +1 -1
package/CHANGELOG.md CHANGED
@@ -6,6 +6,20 @@ This file is generated by `absolute-changelog` from the entries in
6
6
  `changelog/`. Edit an entry, not this file — and add new ones under
7
7
  `changelog/unreleased/`.
8
8
 
9
+ ## 0.20.0-beta.106 — 2026-09-16
10
+
11
+ ### Added
12
+
13
+ - **Remote Macs run all three installed iOS release acceptance lanes** (`ABSOLUTE_REMOTE_MAC_PROTOCOL_VERSION`, `AbsoluteRemoteIosReleaseAcceptance`, `BuildAbsoluteRemoteIosReleaseOptions`, `RunAbsoluteRemoteIosReleaseAcceptanceOptions`, `cleanAbsoluteRemoteMacWorkspace`, `inspectAbsoluteRemoteMacWorkspace`, `runAbsoluteIosDeviceReleaseAcceptance`, `runAbsoluteIosSimulatorReleaseAcceptance`, `runAbsoluteRemoteIosReleaseAcceptance`, `syncAbsoluteRemoteMacAcceptanceRelease`)
14
+ Paired developer-owned Macs can now export and return the same-archive registered-device IPA, then execute source-equivalent Simulator, archive-equivalent registered-device, and store-delivered TestFlight acceptance from Windows or Linux. Protocol v4 atomically synchronizes and re-hashes immutable releases, validates returned evidence locally, propagates cancellation into Xcode and device tools, and emits sanitized remote-host reports and phase telemetry without transferring signing or publication credentials.
15
+
16
+ ## 0.20.0-beta.105 — 2026-09-16
17
+
18
+ ### Added
19
+
20
+ - **iOS releases gain three-lane installed-app acceptance** (`AbsoluteIosReleaseMetadata`, `BuildAbsoluteIosReleaseOptions`, `buildAbsoluteIosRelease`, `buildAbsoluteRemoteIosRelease`, `installAbsoluteIosRelease`, `readAbsoluteIosRelease`, `requireAbsoluteIosReleaseMetadata`, `runAbsoluteIosDeviceReleaseAcceptance`, `runAbsoluteIosSimulatorReleaseAcceptance`)
21
+ `absolute mobile test ios --release` now records honest source-equivalent Simulator, same-archive registered-device, or Apple-processed TestFlight evidence. Capacitor and Expo emit version/build-specific native readiness markers, immutable releases can include a separately hashed registered-device IPA, physical offline claims require explicit confirmation, and sanitized reports retain only artifact classification, outcome, and bounded timings.
22
+
9
23
  ## 0.20.0-beta.104 — 2026-09-16
10
24
 
11
25
  ### Added
package/changelog.json CHANGED
@@ -2,6 +2,51 @@
2
2
  "contract": 1,
3
3
  "name": "@absolutejs/absolute",
4
4
  "releases": [
5
+ {
6
+ "changes": [
7
+ {
8
+ "detail": "Paired developer-owned Macs can now export and return the same-archive registered-device IPA, then execute source-equivalent Simulator, archive-equivalent registered-device, and store-delivered TestFlight acceptance from Windows or Linux. Protocol v4 atomically synchronizes and re-hashes immutable releases, validates returned evidence locally, propagates cancellation into Xcode and device tools, and emits sanitized remote-host reports and phase telemetry without transferring signing or publication credentials.",
9
+ "kind": "added",
10
+ "summary": "Remote Macs run all three installed iOS release acceptance lanes",
11
+ "symbols": [
12
+ "ABSOLUTE_REMOTE_MAC_PROTOCOL_VERSION",
13
+ "AbsoluteRemoteIosReleaseAcceptance",
14
+ "BuildAbsoluteRemoteIosReleaseOptions",
15
+ "RunAbsoluteRemoteIosReleaseAcceptanceOptions",
16
+ "cleanAbsoluteRemoteMacWorkspace",
17
+ "inspectAbsoluteRemoteMacWorkspace",
18
+ "runAbsoluteIosDeviceReleaseAcceptance",
19
+ "runAbsoluteIosSimulatorReleaseAcceptance",
20
+ "runAbsoluteRemoteIosReleaseAcceptance",
21
+ "syncAbsoluteRemoteMacAcceptanceRelease"
22
+ ]
23
+ }
24
+ ],
25
+ "date": "2026-09-16",
26
+ "version": "0.20.0-beta.106"
27
+ },
28
+ {
29
+ "changes": [
30
+ {
31
+ "detail": "`absolute mobile test ios --release` now records honest source-equivalent Simulator, same-archive registered-device, or Apple-processed TestFlight evidence. Capacitor and Expo emit version/build-specific native readiness markers, immutable releases can include a separately hashed registered-device IPA, physical offline claims require explicit confirmation, and sanitized reports retain only artifact classification, outcome, and bounded timings.",
32
+ "kind": "added",
33
+ "summary": "iOS releases gain three-lane installed-app acceptance",
34
+ "symbols": [
35
+ "AbsoluteIosReleaseMetadata",
36
+ "BuildAbsoluteIosReleaseOptions",
37
+ "buildAbsoluteIosRelease",
38
+ "buildAbsoluteRemoteIosRelease",
39
+ "installAbsoluteIosRelease",
40
+ "readAbsoluteIosRelease",
41
+ "requireAbsoluteIosReleaseMetadata",
42
+ "runAbsoluteIosDeviceReleaseAcceptance",
43
+ "runAbsoluteIosSimulatorReleaseAcceptance"
44
+ ]
45
+ }
46
+ ],
47
+ "date": "2026-09-16",
48
+ "version": "0.20.0-beta.105"
49
+ },
5
50
  {
6
51
  "changes": [
7
52
  {
@@ -1,7 +1,7 @@
1
1
  // @bun
2
2
  var __require = import.meta.require;
3
3
 
4
- // .angular-partial-tmp-GUfFrl/src/core/streamingSlotRegistrar.ts
4
+ // .angular-partial-tmp-fRHLty/src/core/streamingSlotRegistrar.ts
5
5
  var STREAMING_SLOT_REGISTRAR_KEY = Symbol.for("absolutejs.streamingSlotRegistrar");
6
6
  var STREAMING_SLOT_WARNING_STORAGE_KEY = Symbol.for("absolutejs.streamingSlotWarningController");
7
7
  var STREAMING_SLOT_COLLECTION_STORAGE_KEY = Symbol.for("absolutejs.streamingSlotCollectionController");
@@ -1,7 +1,7 @@
1
1
  // @bun
2
2
  var __require = import.meta.require;
3
3
 
4
- // .angular-partial-tmp-GUfFrl/src/core/streamingSlotRegistrar.ts
4
+ // .angular-partial-tmp-fRHLty/src/core/streamingSlotRegistrar.ts
5
5
  var STREAMING_SLOT_REGISTRAR_KEY = Symbol.for("absolutejs.streamingSlotRegistrar");
6
6
  var STREAMING_SLOT_WARNING_STORAGE_KEY = Symbol.for("absolutejs.streamingSlotWarningController");
7
7
  var STREAMING_SLOT_COLLECTION_STORAGE_KEY = Symbol.for("absolutejs.streamingSlotCollectionController");
@@ -48,7 +48,7 @@ var warnMissingStreamingSlotCollector = (primitiveName) => {
48
48
  getWarningController()?.maybeWarn(primitiveName);
49
49
  };
50
50
 
51
- // .angular-partial-tmp-GUfFrl/src/core/streamingSlotRegistry.ts
51
+ // .angular-partial-tmp-fRHLty/src/core/streamingSlotRegistry.ts
52
52
  var STREAMING_SLOT_STORAGE_KEY = Symbol.for("absolutejs.streamingSlotAsyncLocalStorage");
53
53
  var isObjectRecord2 = (value) => Boolean(value) && typeof value === "object";
54
54
  var isAsyncLocalStorage = (value) => isObjectRecord2(value) && ("getStore" in value) && typeof value.getStore === "function" && ("run" in value) && typeof value.run === "function";
@@ -15,7 +15,7 @@ import {
15
15
  createIslandRegistryDefinitionPlugin,
16
16
  finalizeAbsoluteMobileCompatibilityBuild,
17
17
  resolveServerBundleExternals
18
- } from "./index-67kedtn7.js";
18
+ } from "./index-hrzd7e5x.js";
19
19
  import {
20
20
  loadIslandRegistryBuildInfo
21
21
  } from "./index-bzs19w3r.js";
@@ -36,7 +36,7 @@ import"./index-w5vswatm.js";
36
36
  import {
37
37
  normalizeAbsoluteMobileConfig
38
38
  } from "./index-rd2hbttb.js";
39
- import"./index-d5fr1xp3.js";
39
+ import"./index-0zcebhm4.js";
40
40
  import {
41
41
  ABSOLUTE_NATIVE_AUTH_CLIENTS_ENV,
42
42
  installAbsoluteMobileAuthEnvironment
@@ -1286,16 +1286,16 @@ var loadAbsoluteMobileDevModules = async () => {
1286
1286
  expoNativeWatcher
1287
1287
  ] = await Promise.all([
1288
1288
  import("./config-vy04mqce.js"),
1289
- import("./expoProject-780thyfd.js"),
1289
+ import("./expoProject-zkprmjjz.js"),
1290
1290
  import("./expoDevController-zz516pdd.js"),
1291
1291
  import("./nativeAuth-zx4tsb1f.js"),
1292
1292
  import("./androidEmulatorController-nybhzc6c.js"),
1293
1293
  import("./emulatorDoctor-y2nqmaha.js"),
1294
1294
  import("./emulatorInstaller-3shdna4g.js"),
1295
1295
  import("./androidNativeWatcher-2930tb8c.js"),
1296
- import("./iosSimulatorController-dr98a0p9.js"),
1297
- import("./remoteMacProtocol-kqvkp0qd.js"),
1298
- import("./iosNativeWatcher-3k715hq0.js"),
1296
+ import("./iosSimulatorController-5n2a9fxv.js"),
1297
+ import("./remoteMacProtocol-dybpgazw.js"),
1298
+ import("./iosNativeWatcher-t6gv0p1w.js"),
1299
1299
  import("./expoNativeWatcher-rmc95bak.js")
1300
1300
  ]);
1301
1301
  return {
@@ -2,7 +2,7 @@
2
2
  import {
3
3
  syncAbsoluteExpoWebAssets,
4
4
  writeAbsoluteExpoProject
5
- } from "./index-d5fr1xp3.js";
5
+ } from "./index-0zcebhm4.js";
6
6
  import"./index-ar4gz15x.js";
7
7
  import"./index-mywsk201.js";
8
8
  export {
@@ -1416,9 +1416,59 @@ var moduleConfig2 = `${JSON.stringify({
1416
1416
  "expo.modules.absoluteactivityresultrecovery.AbsoluteActivityResultRecoveryModule"
1417
1417
  ]
1418
1418
  },
1419
- platforms: ["android"]
1419
+ apple: { modules: ["AbsoluteActivityResultRecoveryModule"] },
1420
+ platforms: ["apple", "android"]
1420
1421
  }, null, 2)}
1421
1422
  `;
1423
+ var podspec2 = `${HEADER2}Pod::Spec.new do |s|
1424
+ s.name = 'AbsoluteActivityResultRecovery'
1425
+ s.version = '0.0.1'
1426
+ s.summary = 'AbsoluteJS native runtime readiness bridge'
1427
+ s.description = 'Generated lifecycle and embedded-content readiness bridge for an AbsoluteJS Expo application.'
1428
+ s.author = 'AbsoluteJS'
1429
+ s.homepage = 'https://absolutejs.com'
1430
+ s.platforms = { :ios => '16.4' }
1431
+ s.source = { git: '' }
1432
+ s.static_framework = true
1433
+ s.dependency 'ExpoModulesCore'
1434
+ s.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES' }
1435
+ s.source_files = '**/*.{h,m,mm,swift,hpp,cpp}'
1436
+ end
1437
+ `;
1438
+ var iosModule2 = `${HEADER2}import ExpoModulesCore
1439
+
1440
+ public final class AbsoluteActivityResultRecoveryModule: Module {
1441
+ public func definition() -> ModuleDefinition {
1442
+ Name("AbsoluteActivityResultRecovery")
1443
+
1444
+ Function("markApplicationRuntimeReady") { }
1445
+
1446
+ Function("markEmbeddedWebReady") {
1447
+ let info = Bundle.main.infoDictionary ?? [:]
1448
+ let version = info["CFBundleShortVersionString"] as? String ?? "unknown"
1449
+ let build = info["CFBundleVersion"] as? String ?? "unknown"
1450
+ NSLog("AbsoluteJS: Expo embedded web content ready; version=%@; build=%@", version, build)
1451
+ }
1452
+
1453
+ Function("markEmbeddedWebPhase") { (phase: String) in
1454
+ let allowed = [
1455
+ "assets-start", "assets-ready", "assets-root-failed",
1456
+ "assets-directory-failed", "assets-destination-failed",
1457
+ "assets-module-failed", "assets-source-failed",
1458
+ "assets-download-failed", "assets-copy-failed",
1459
+ "assets-read-failed", "assets-write-failed",
1460
+ "assets-finalize-failed", "assets-unexpected-failed",
1461
+ "devices-start", "devices-ready", "devices-failed"
1462
+ ]
1463
+ if allowed.contains(phase) {
1464
+ NSLog("AbsoluteJS: Expo embedded web phase: %@", phase)
1465
+ }
1466
+ }
1467
+
1468
+ Function("takePendingCancellation") { false }
1469
+ }
1470
+ }
1471
+ `;
1422
1472
  var androidBuild2 = `${HEADER2}plugins {
1423
1473
  id 'com.android.library'
1424
1474
  id 'expo-module-gradle-plugin'
@@ -1595,6 +1645,14 @@ var absoluteExpoActivityResultRecoveryFiles = (project) => new Map([
1595
1645
  join4(project, "modules/absolute-activity-result-recovery/expo-module.config.json"),
1596
1646
  moduleConfig2
1597
1647
  ],
1648
+ [
1649
+ join4(project, "modules/absolute-activity-result-recovery/ios/AbsoluteActivityResultRecovery.podspec"),
1650
+ podspec2
1651
+ ],
1652
+ [
1653
+ join4(project, "modules/absolute-activity-result-recovery/ios/AbsoluteActivityResultRecoveryModule.swift"),
1654
+ iosModule2
1655
+ ],
1598
1656
  [
1599
1657
  join4(project, "modules/absolute-activity-result-recovery/android/build.gradle"),
1600
1658
  androidBuild2
@@ -1,7 +1,7 @@
1
1
  // @bun
2
2
  import {
3
3
  fingerprintAbsoluteIosNativeProject
4
- } from "./index-qxnptvwn.js";
4
+ } from "./index-q1d4ns4n.js";
5
5
  import {
6
6
  normalizeAbsoluteIosDeviceHost,
7
7
  normalizeAbsoluteIosDeviceIdentifier,
@@ -10,7 +10,7 @@ import {
10
10
  resolveAbsoluteMobileUpdateRuntime,
11
11
  syncAbsoluteExpoWebAssets,
12
12
  writeAbsoluteExpoProject
13
- } from "./index-d5fr1xp3.js";
13
+ } from "./index-0zcebhm4.js";
14
14
 
15
15
  // src/build/islandRegistryTransform.ts
16
16
  import { basename } from "path";
@@ -2,7 +2,7 @@
2
2
  import {
3
3
  installAbsoluteIosRelease,
4
4
  requireAbsoluteIosReleaseMetadata
5
- } from "./index-qxnptvwn.js";
5
+ } from "./index-q1d4ns4n.js";
6
6
  import {
7
7
  unrefTimer
8
8
  } from "./index-bw4ktfnz.js";
@@ -32,7 +32,7 @@ import {
32
32
 
33
33
  // src/mobile/remoteMacWire.ts
34
34
  var ABSOLUTE_REMOTE_MAC_EVENT_PREFIX = "ABSOLUTE_REMOTE_MAC\t";
35
- var ABSOLUTE_REMOTE_MAC_PROTOCOL_VERSION = 3;
35
+ var ABSOLUTE_REMOTE_MAC_PROTOCOL_VERSION = 4;
36
36
 
37
37
  // src/mobile/remoteMacProtocol.ts
38
38
  var PROFILE_FORMAT = 1;
@@ -576,6 +576,45 @@ var absoluteRemoteReleaseInputSyncCommands = (project) => {
576
576
  tar: ["tar", "-cf", "-", "-C", project.config.bundleDirectory, "."]
577
577
  };
578
578
  };
579
+ var syncAbsoluteRemoteMacAcceptanceRelease = async (project, release, options = {}) => {
580
+ options.signal?.throwIfAborted();
581
+ const destination = posix.join(project.remoteProjectRoot, ".absolutejs", "mobile", "acceptance", "ios", release.metadata.releaseId);
582
+ const staging = `${destination}.incoming-${randomUUID()}`;
583
+ const script = [
584
+ "set -eu",
585
+ "umask 077",
586
+ `rm -rf ${shellQuote(staging)}`,
587
+ `mkdir -p ${shellQuote(staging)}`,
588
+ `tar -xf - -C ${shellQuote(staging)}`,
589
+ `test -f ${shellQuote(posix.join(staging, "release.json"))}`,
590
+ `rm -rf ${shellQuote(destination)}`,
591
+ `mkdir -p ${shellQuote(posix.dirname(destination))}`,
592
+ `mv ${shellQuote(staging)} ${shellQuote(destination)}`
593
+ ].join("; ");
594
+ const archive = Bun.spawn(["tar", "-cf", "-", "-C", release.releaseRoot, "."], {
595
+ signal: options.signal,
596
+ stderr: "pipe",
597
+ stdout: "pipe"
598
+ });
599
+ const upload = Bun.spawn([
600
+ ...absoluteRemoteMacSshBase(project.profile),
601
+ "/bin/sh -lc",
602
+ shellQuote(script)
603
+ ], {
604
+ signal: options.signal,
605
+ stderr: "pipe",
606
+ stdin: archive.stdout,
607
+ stdout: "pipe"
608
+ });
609
+ const [archiveExit, uploadExit, archiveError, uploadError] = await Promise.all([
610
+ archive.exited,
611
+ upload.exited,
612
+ new Response(archive.stderr).text(),
613
+ new Response(upload.stderr).text()
614
+ ]);
615
+ if (archiveExit !== 0 || uploadExit !== 0)
616
+ throw new Error(`Remote iOS acceptance artifact synchronization failed: ${(archiveError || uploadError).trim()}`);
617
+ };
579
618
  var syncAbsoluteRemoteMacReleaseInputs = async (project, options = {}) => {
580
619
  options.signal?.throwIfAborted();
581
620
  const commands = absoluteRemoteReleaseInputSyncCommands(project);
@@ -646,11 +685,28 @@ var retrieveAbsoluteRemoteIosRelease = async (project, metadata, outputDirectory
646
685
  ]);
647
686
  if (downloadExit !== 0)
648
687
  throw new Error(`Remote iOS release retrieval failed: ${downloadError.trim()}`);
688
+ let registeredArtifactPath;
689
+ if (metadata.registeredDevice) {
690
+ registeredArtifactPath = join(staging, "App.registered-device.ipa");
691
+ const registeredDownload = Bun.spawn([
692
+ ...absoluteRemoteMacSshBase(project.profile),
693
+ "/bin/sh -lc",
694
+ shellQuote(`cat ${shellQuote(posix.join(releaseRoot, metadata.registeredDevice.artifact))}`)
695
+ ], { stderr: "pipe", stdout: "pipe" });
696
+ const [registeredExit, registeredError] = await Promise.all([
697
+ registeredDownload.exited,
698
+ new Response(registeredDownload.stderr).text(),
699
+ writeRemoteArtifact(registeredArtifactPath, registeredDownload.stdout)
700
+ ]);
701
+ if (registeredExit !== 0)
702
+ throw new Error(`Remote iOS registered-device artifact retrieval failed: ${registeredError.trim()}`);
703
+ }
649
704
  return await installAbsoluteIosRelease({
650
705
  artifactPath,
651
706
  metadata,
652
707
  outputDirectory,
653
- projectRoot: project.projectRoot
708
+ projectRoot: project.projectRoot,
709
+ ...registeredArtifactPath ? { registeredArtifactPath } : {}
654
710
  });
655
711
  } finally {
656
712
  await rm(staging, { force: true, recursive: true }).catch(() => {
@@ -748,6 +804,7 @@ var buildAbsoluteRemoteIosRelease = async (options) => {
748
804
  shellQuote(encodedConfig),
749
805
  ...options.allowUnsigned ? ["--unsigned"] : [],
750
806
  ...options.prepareBuildNumber ? ["--request-build-number"] : [],
807
+ ...options.registeredDeviceArtifact ? ["--registered-device-artifact"] : [],
751
808
  ...options.developmentTeam ? ["--development-team", shellQuote(options.developmentTeam)] : []
752
809
  ].join(" ");
753
810
  const process2 = (options.transport?.spawn ?? defaultTransport.spawn)([
@@ -852,6 +909,178 @@ var buildAbsoluteRemoteIosRelease = async (options) => {
852
909
  }
853
910
  }
854
911
  };
912
+ var requireRemoteIosReleaseAcceptance = (value, release, distribution) => {
913
+ if (typeof value !== "object" || value === null)
914
+ throw new TypeError("Remote Mac returned invalid iOS release evidence.");
915
+ const result = value;
916
+ let expectedExactness = "archive-equivalent";
917
+ if (distribution === "simulator-release")
918
+ expectedExactness = "source-equivalent";
919
+ if (distribution === "testflight")
920
+ expectedExactness = "store-delivered";
921
+ const expectedDistribution = distribution === "testflight" ? "apple-processed" : distribution;
922
+ const expectedTarget = distribution === "simulator-release" ? "simulator" : "device";
923
+ if (result.status !== "pass" || result.embeddedLocal !== true || result.releaseId !== release.metadata.releaseId || result.engine !== release.metadata.engine || result.marketingVersion !== release.metadata.marketingVersion || result.artifactSha256 !== release.metadata.sha256 || result.artifactBytes !== release.metadata.bytes || result.signed !== release.metadata.signed || result.artifactExactness !== expectedExactness || result.distribution !== expectedDistribution || result.target !== expectedTarget || (distribution === "simulator-release" ? result.networkUnavailable !== "not-proven" : result.networkUnavailable !== "user-confirmed") || (release.metadata.buildNumber === undefined ? result.buildNumber !== undefined : result.buildNumber !== release.metadata.buildNumber) || !["durationMs", "installMs", "launchMs", "relaunchMs"].every((field) => typeof result[field] === "number" && Number.isFinite(result[field]) && result[field] >= 0))
924
+ throw new TypeError("Remote Mac iOS release evidence does not match the immutable release or requested lane.");
925
+ return value;
926
+ };
927
+ var runAbsoluteRemoteIosReleaseAcceptance = async (options) => {
928
+ options.signal?.throwIfAborted();
929
+ if (options.distribution !== "simulator-release" && !options.deviceIdentifier)
930
+ throw new TypeError("Remote physical iOS release acceptance requires a device identifier.");
931
+ if (options.distribution !== "simulator-release" && !options.networkUnavailableConfirmed)
932
+ throw new TypeError("Remote physical iOS release acceptance requires explicit network-unavailable confirmation.");
933
+ const operation = new AbortController;
934
+ const abort = () => operation.abort(options.signal?.reason ?? new Error("Remote iOS release acceptance cancelled."));
935
+ options.signal?.addEventListener("abort", abort, { once: true });
936
+ const startedAt = performance.now();
937
+ const leaseStartedAt = performance.now();
938
+ let lease;
939
+ try {
940
+ lease = await (options.acquireLease ?? ((project, signal) => acquireAbsoluteRemoteMacReleaseLease(project, {
941
+ signal,
942
+ transport: options.transport
943
+ })))(options.project, operation.signal);
944
+ } catch (error) {
945
+ options.signal?.removeEventListener("abort", abort);
946
+ throw error;
947
+ }
948
+ const leaseDuration = performance.now() - leaseStartedAt;
949
+ options.onPhaseTiming?.({
950
+ durationMs: leaseDuration,
951
+ phase: "remote-release-acceptance-lease"
952
+ });
953
+ let heartbeat;
954
+ const heartbeatTimer = setInterval(() => {
955
+ if (heartbeat)
956
+ return;
957
+ heartbeat = lease.heartbeat().catch((error) => operation.abort(error)).finally(() => {
958
+ heartbeat = undefined;
959
+ });
960
+ }, REMOTE_RELEASE_LEASE_HEARTBEAT_MS);
961
+ unrefTimer(heartbeatTimer);
962
+ try {
963
+ const syncStartedAt = performance.now();
964
+ if (options.syncProject)
965
+ await options.syncProject(options.project);
966
+ else
967
+ await syncAbsoluteRemoteMacProject(options.project, {
968
+ signal: operation.signal
969
+ });
970
+ operation.signal.throwIfAborted();
971
+ if (options.syncReleaseInputs)
972
+ await options.syncReleaseInputs(options.project);
973
+ else
974
+ await syncAbsoluteRemoteMacReleaseInputs(options.project, {
975
+ signal: operation.signal
976
+ });
977
+ operation.signal.throwIfAborted();
978
+ if (options.syncRelease)
979
+ await options.syncRelease(options.project, options.release);
980
+ else
981
+ await syncAbsoluteRemoteMacAcceptanceRelease(options.project, options.release, { signal: operation.signal });
982
+ operation.signal.throwIfAborted();
983
+ const syncDuration = performance.now() - syncStartedAt;
984
+ options.onPhaseTiming?.({
985
+ durationMs: syncDuration,
986
+ phase: "remote-release-acceptance-sync"
987
+ });
988
+ const agent = await (options.installAgent ?? installAbsoluteRemoteMacAgent)(options.project);
989
+ const encodedConfig = Buffer.from(JSON.stringify(portableMobileConfig(options.project))).toString("base64url");
990
+ const remoteCommand = [
991
+ `cd ${shellQuote(options.project.remoteProjectRoot)}`,
992
+ "&&",
993
+ "exec",
994
+ shellQuote(options.project.profile.bunPath),
995
+ shellQuote(agent.remotePath),
996
+ "--test-ios-release",
997
+ "--mobile-config",
998
+ shellQuote(encodedConfig),
999
+ "--release-id",
1000
+ shellQuote(options.release.metadata.releaseId),
1001
+ "--distribution",
1002
+ shellQuote(options.distribution),
1003
+ ...options.deviceIdentifier ? ["--device", shellQuote(options.deviceIdentifier)] : [],
1004
+ ...options.simulatorUdid ? ["--simulator-udid", shellQuote(options.simulatorUdid)] : [],
1005
+ ...options.networkUnavailableConfirmed ? ["--network-unavailable-confirmed"] : []
1006
+ ].join(" ");
1007
+ const process2 = (options.transport?.spawn ?? defaultTransport.spawn)([
1008
+ ...absoluteRemoteMacSshBase(options.project.profile),
1009
+ "/bin/sh -lc",
1010
+ shellQuote(remoteCommand)
1011
+ ], { signal: operation.signal });
1012
+ const killOnAbort = () => process2.kill();
1013
+ operation.signal.addEventListener("abort", killOnAbort, { once: true });
1014
+ let failure;
1015
+ let accepted;
1016
+ const stdoutDone = consumeLines(process2.stdout, (line) => {
1017
+ if (!line.startsWith(ABSOLUTE_REMOTE_MAC_EVENT_PREFIX))
1018
+ return;
1019
+ try {
1020
+ const event = JSON.parse(line.slice(ABSOLUTE_REMOTE_MAC_EVENT_PREFIX.length));
1021
+ if (event.v !== ABSOLUTE_REMOTE_MAC_PROTOCOL_VERSION)
1022
+ throw new Error("Remote Mac protocol version mismatch.");
1023
+ if (event.type === "log")
1024
+ options.log?.(event.message);
1025
+ if (event.type === "timing") {
1026
+ const durationMs = Reflect.get(event, "durationMs");
1027
+ const phase = Reflect.get(event, "phase");
1028
+ if (typeof durationMs === "number" && typeof phase === "string")
1029
+ options.onPhaseTiming?.({ durationMs, phase });
1030
+ }
1031
+ if (event.type === "fatal")
1032
+ failure = new Error(event.error);
1033
+ if (event.type === "release-acceptance") {
1034
+ if (!event.targetId || typeof event.targetId !== "string")
1035
+ throw new TypeError("Remote Mac returned an invalid iOS acceptance target.");
1036
+ accepted = {
1037
+ result: requireRemoteIosReleaseAcceptance(event.result, options.release, options.distribution),
1038
+ targetId: event.targetId
1039
+ };
1040
+ }
1041
+ } catch (error) {
1042
+ failure = error instanceof Error ? error : new Error("Remote Mac emitted invalid iOS release evidence.");
1043
+ process2.kill();
1044
+ }
1045
+ });
1046
+ const stderrDone = consumeLines(process2.stderr, (line) => options.log?.(`[remote] ${line}`));
1047
+ const exitCode = await process2.exited;
1048
+ operation.signal.removeEventListener("abort", killOnAbort);
1049
+ try {
1050
+ process2.stdin.end();
1051
+ } catch {}
1052
+ await Promise.all([stdoutDone, stderrDone]);
1053
+ operation.signal.throwIfAborted();
1054
+ if (failure)
1055
+ throw failure;
1056
+ if (exitCode !== 0)
1057
+ throw new Error(`Remote iOS release acceptance agent exited with status ${exitCode}.`);
1058
+ if (!accepted)
1059
+ throw new Error("Remote iOS release acceptance agent returned no evidence.");
1060
+ const total = performance.now() - startedAt;
1061
+ options.log?.(`Remote Mac ${options.project.profile.name} completed ${options.distribution} acceptance for ${options.release.metadata.releaseId} in ${total.toFixed(2)}ms (agent ${agent.uploaded ? "uploaded" : "cache hit"}).`);
1062
+ return {
1063
+ ...accepted,
1064
+ timings: {
1065
+ "remote-release-acceptance-lease": leaseDuration,
1066
+ "remote-release-acceptance-sync": syncDuration,
1067
+ total
1068
+ }
1069
+ };
1070
+ } finally {
1071
+ clearInterval(heartbeatTimer);
1072
+ await heartbeat?.catch(() => {
1073
+ return;
1074
+ });
1075
+ options.signal?.removeEventListener("abort", abort);
1076
+ try {
1077
+ await lease.release();
1078
+ options.log?.("Released Remote Mac release acceptance lease.");
1079
+ } catch (error) {
1080
+ options.log?.(`Remote Mac acceptance lease cleanup failed and will recover after expiry: ${error instanceof Error ? error.message : String(error)}`);
1081
+ }
1082
+ }
1083
+ };
855
1084
  var startAbsoluteRemoteExpoIosDevSession = async (options) => {
856
1085
  let session = await startAbsoluteRemoteDevSession({
857
1086
  certificateAuthorityPath: options.certificateAuthorityPath,
@@ -1147,4 +1376,4 @@ var startAbsoluteRemoteDevSession = async (options) => {
1147
1376
  return makeSession();
1148
1377
  };
1149
1378
 
1150
- export { ABSOLUTE_REMOTE_MAC_EVENT_PREFIX, ABSOLUTE_REMOTE_MAC_PROTOCOL_VERSION, validateAbsoluteRemoteMacProfileName, validateAbsoluteSshDestination, absoluteRemoteMacSshBase, captureAbsoluteRemoteMacCommand, getAbsoluteRemoteMacProfile, inspectAbsoluteRemoteMac, inspectAbsoluteRemoteMacLanHost, listAbsoluteRemoteMacProfiles, pairAbsoluteRemoteMac, removeAbsoluteRemoteMacProfile, createAbsoluteRemoteExpoIosDevProject, createAbsoluteRemoteIosDevProject, acquireAbsoluteRemoteMacReleaseLease, cleanAbsoluteRemoteMacWorkspace, inspectAbsoluteRemoteMacWorkspace, installAbsoluteRemoteMacAgent, materializeAbsoluteRemoteMacAgent, absoluteRemoteProjectSyncCommands, syncAbsoluteRemoteMacProject, absoluteRemoteReleaseInputSyncCommands, syncAbsoluteRemoteMacReleaseInputs, buildAbsoluteRemoteIosRelease, startAbsoluteRemoteExpoIosDevSession, startAbsoluteRemoteIosDevSession };
1379
+ export { ABSOLUTE_REMOTE_MAC_EVENT_PREFIX, ABSOLUTE_REMOTE_MAC_PROTOCOL_VERSION, validateAbsoluteRemoteMacProfileName, validateAbsoluteSshDestination, absoluteRemoteMacSshBase, captureAbsoluteRemoteMacCommand, getAbsoluteRemoteMacProfile, inspectAbsoluteRemoteMac, inspectAbsoluteRemoteMacLanHost, listAbsoluteRemoteMacProfiles, pairAbsoluteRemoteMac, removeAbsoluteRemoteMacProfile, createAbsoluteRemoteExpoIosDevProject, createAbsoluteRemoteIosDevProject, acquireAbsoluteRemoteMacReleaseLease, cleanAbsoluteRemoteMacWorkspace, inspectAbsoluteRemoteMacWorkspace, installAbsoluteRemoteMacAgent, materializeAbsoluteRemoteMacAgent, absoluteRemoteProjectSyncCommands, syncAbsoluteRemoteMacProject, absoluteRemoteReleaseInputSyncCommands, syncAbsoluteRemoteMacAcceptanceRelease, syncAbsoluteRemoteMacReleaseInputs, buildAbsoluteRemoteIosRelease, runAbsoluteRemoteIosReleaseAcceptance, startAbsoluteRemoteExpoIosDevSession, startAbsoluteRemoteIosDevSession };
@@ -6,7 +6,7 @@ import {
6
6
  createIslandRegistryDefinitionPlugin,
7
7
  finalizeAbsoluteMobileCompatibilityBuild,
8
8
  resolveServerBundleExternals
9
- } from "./index-67kedtn7.js";
9
+ } from "./index-hrzd7e5x.js";
10
10
  import {
11
11
  loadIslandRegistryBuildInfo
12
12
  } from "./index-bzs19w3r.js";