peachsim 0.1.571 → 0.1.573
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/LICENSE +1 -1
- package/README.md +106 -106
- package/cli/app-config.ts +1 -1
- package/cli/app-fonts.ts +4 -4
- package/cli/auth.ts +11 -11
- package/cli/bin.ts +4 -4
- package/cli/bridge-flow-runner.ts +13 -13
- package/cli/browser-evals.ts +2 -2
- package/cli/cli-update.ts +6 -6
- package/cli/cloud-client.ts +16 -16
- package/cli/cloud-dispatch.ts +2 -2
- package/cli/cloud-session.ts +12 -12
- package/cli/cloud-test-tunnel.ts +4 -4
- package/cli/command-registry.ts +7 -7
- package/cli/commands/agent-wrapper.ts +7 -7
- package/cli/commands/agent.ts +16 -16
- package/cli/commands/app-fonts.ts +3 -3
- package/cli/commands/assert.ts +10 -10
- package/cli/commands/auth.ts +5 -5
- package/cli/commands/box/checkout-plane.ts +1 -1
- package/cli/commands/box/plane-share.ts +2 -2
- package/cli/commands/box/rnx-command.ts +5 -5
- package/cli/commands/box.ts +38 -38
- package/cli/commands/camera.ts +13 -13
- package/cli/commands/cleanup.ts +13 -13
- package/cli/commands/compat.ts +7 -7
- package/cli/commands/config.ts +5 -5
- package/cli/commands/control.ts +63 -63
- package/cli/commands/cpu-profile.ts +11 -11
- package/cli/commands/daemon-mac-app.ts +10 -10
- package/cli/commands/daemon.ts +29 -27
- package/cli/commands/debug.ts +35 -35
- package/cli/commands/desktop.ts +3 -3
- package/cli/commands/detox.ts +33 -33
- package/cli/commands/device.ts +9 -9
- package/cli/commands/diagnose.ts +17 -17
- package/cli/commands/do-chain.ts +4 -4
- package/cli/commands/electron.ts +9 -9
- package/cli/commands/film.ts +9 -9
- package/cli/commands/flow.ts +49 -49
- package/cli/commands/inspect/core.ts +12 -12
- package/cli/commands/inspect/count.ts +1 -1
- package/cli/commands/inspect/describe.ts +1 -1
- package/cli/commands/inspect/env.ts +2 -2
- package/cli/commands/inspect/find.ts +2 -2
- package/cli/commands/inspect/get-layout.ts +2 -2
- package/cli/commands/inspect/keyboard.ts +1 -1
- package/cli/commands/inspect/list.ts +4 -4
- package/cli/commands/inspect/memory.ts +1 -1
- package/cli/commands/inspect/resolve-target.ts +1 -1
- package/cli/commands/inspect/screens.ts +1 -1
- package/cli/commands/inspect/shared.ts +1 -1
- package/cli/commands/inspect/tree.ts +1 -1
- package/cli/commands/inspect/url.ts +1 -1
- package/cli/commands/inspect/wait-event.ts +5 -5
- package/cli/commands/inspect.ts +82 -82
- package/cli/commands/install-cli.ts +16 -16
- package/cli/commands/install-desktop.ts +26 -26
- package/cli/commands/login.ts +11 -11
- package/cli/commands/maestro-generate.ts +10 -10
- package/cli/commands/maestro.ts +77 -67
- package/cli/commands/mode.ts +4 -4
- package/cli/commands/no-bridge-hint.ts +12 -12
- package/cli/commands/perf.ts +11 -11
- package/cli/commands/permissions.ts +5 -5
- package/cli/commands/platform.ts +21 -21
- package/cli/commands/preview.ts +5 -5
- package/cli/commands/profile.ts +12 -12
- package/cli/commands/react.ts +15 -15
- package/cli/commands/record.ts +31 -31
- package/cli/commands/report-issue.ts +4 -4
- package/cli/commands/reset.ts +2 -2
- package/cli/commands/runtime.ts +23 -23
- package/cli/commands/screenshot-command.ts +2 -2
- package/cli/commands/screenshot-layers.ts +5 -5
- package/cli/commands/screenshot-mode.ts +7 -7
- package/cli/commands/screenshot.ts +24 -24
- package/cli/commands/screenshots-capture.ts +13 -13
- package/cli/commands/screenshots.ts +6 -6
- package/cli/commands/serve.ts +12 -12
- package/cli/commands/setup.ts +25 -25
- package/cli/commands/skills.ts +30 -23
- package/cli/commands/slides.ts +20 -20
- package/cli/commands/state.ts +2 -2
- package/cli/commands/storage.ts +3 -3
- package/cli/commands/telemetry.ts +2 -2
- package/cli/commands/test.ts +15 -15
- package/cli/commands/three-mode.ts +17 -17
- package/cli/commands/timeline.ts +12 -12
- package/cli/commands/upgrade.ts +11 -11
- package/cli/commands/upload.ts +26 -26
- package/cli/commands/version.ts +7 -7
- package/cli/commands/what-happened.ts +20 -20
- package/cli/current-sim.ts +3 -3
- package/cli/desktop-companion.ts +16 -16
- package/cli/drivers/electron.ts +4 -4
- package/cli/drivers/playwright-sim-host.ts +7 -7
- package/cli/drivers/playwright.ts +4 -4
- package/cli/drivers/registry.ts +1 -1
- package/cli/drivers/types.ts +5 -5
- package/cli/flow-export.ts +1 -1
- package/cli/flow-file.ts +5 -5
- package/cli/flow-session.ts +1 -1
- package/cli/help-core.ts +13 -13
- package/cli/hints.ts +14 -14
- package/cli/inspect-notice-state.ts +1 -1
- package/cli/internal-child.ts +2 -2
- package/cli/maestro-js.ts +4 -4
- package/cli/maestro-report.ts +1 -1
- package/cli/main.ts +14 -14
- package/cli/outbound-endpoints.ts +30 -30
- package/cli/parse-args.ts +7 -7
- package/cli/privacy.ts +1 -1
- package/cli/recording-access.ts +10 -10
- package/cli/resolve-assets.ts +2 -2
- package/cli/rnx-in-process.ts +5 -5
- package/cli/run-registry.ts +1 -1
- package/cli/run-rnx-core.ts +3 -3
- package/cli/run-rnx.ts +1 -1
- package/cli/runtime-notes.ts +1 -1
- package/cli/self-invocation.ts +1 -1
- package/cli/send-to-box.ts +1 -1
- package/cli/shell-init.ts +40 -40
- package/cli/ui.ts +1 -1
- package/cli/ws-bridge.ts +22 -22
- package/detox/config-loader.ts +1 -1
- package/detox/index.ts +28 -28
- package/detox/navigation.ts +2 -2
- package/dist-lib/agent-daemon-client.cjs +12 -12
- package/dist-lib/agent-events.cjs +1 -1
- package/dist-lib/agent-identity.cjs +2 -2
- package/dist-lib/agent-sessions.cjs +12 -12
- package/dist-lib/attached-projects.cjs +4 -4
- package/dist-lib/auth/shared-session.cjs +4 -4
- package/dist-lib/backend-origin.cjs +1 -1
- package/dist-lib/beta.cjs +1 -1
- package/dist-lib/beta.mjs +1 -1
- package/dist-lib/bridge-constants.cjs +4 -4
- package/dist-lib/bridge-contract-input.cjs +1 -1
- package/dist-lib/bridge-contract-input.mjs +1 -1
- package/dist-lib/bridge-contract.cjs +2 -2
- package/dist-lib/bridge-contract.mjs +2 -2
- package/dist-lib/capture-contract.cjs +1 -1
- package/dist-lib/capture-contract.mjs +1 -1
- package/dist-lib/cli-constants.cjs +1 -1
- package/dist-lib/cloud-contract.cjs +1 -1
- package/dist-lib/cloud-contract.mjs +1 -1
- package/dist-lib/cloud-test-args.cjs +1 -1
- package/dist-lib/cloud-test-args.mjs +1 -1
- package/dist-lib/cloud.cjs +42 -42
- package/dist-lib/cloud.mjs +42 -42
- package/dist-lib/config.cjs +2 -2
- package/dist-lib/detox/index.cjs +29 -29
- package/dist-lib/dev-bundle-resolution.cjs +1 -1
- package/dist-lib/home-paths.cjs +12 -12
- package/dist-lib/host/bridge-host.cjs +72 -71
- package/dist-lib/host/fetch-proxy-handler.cjs +1 -1
- package/dist-lib/host/fetch-proxy-overrides.cjs +1 -1
- package/dist-lib/host/fetch-proxy-overrides.mjs +1 -1
- package/dist-lib/host/replacement-module-handler.cjs +6 -6
- package/dist-lib/host/websocket-proxy.cjs +1 -1
- package/dist-lib/index.cjs +48 -48
- package/dist-lib/jump-to-source-babel.cjs +1 -1
- package/dist-lib/jump-to-source-native.cjs +1 -1
- package/dist-lib/menu.cjs +5 -5
- package/dist-lib/menu.mjs +5 -5
- package/dist-lib/metro-fingerprint-registry.cjs +1 -1
- package/dist-lib/metro-fingerprint-registry.mjs +1 -1
- package/dist-lib/metro-production-bundle.cjs +1 -1
- package/dist-lib/metro-production-bundle.mjs +1 -1
- package/dist-lib/metro.cjs +15 -15
- package/dist-lib/profiles.cjs +4 -4
- package/dist-lib/public-brand.cjs +3 -3
- package/dist-lib/react-native-host-modules.cjs +1 -1
- package/dist-lib/react-native-host-modules.mjs +1 -1
- package/dist-lib/render-mode.cjs +1 -1
- package/dist-lib/scripts/dev-server-scanner.cjs +2 -1
- package/dist-lib/sdk.cjs +9 -9
- package/dist-lib/sdk.mjs +9 -9
- package/dist-lib/skills.cjs +416 -415
- package/dist-lib/swift-compile.cjs +1 -1
- package/dist-lib/swift-compile.mjs +1 -1
- package/dist-lib/swift-package.cjs +1 -1
- package/dist-lib/swift-package.mjs +1 -1
- package/dist-lib/swift-submit.cjs +1 -1
- package/dist-lib/swift-submit.mjs +1 -1
- package/dist-lib/swift.cjs +1 -1
- package/dist-lib/vite.cjs +24 -24
- package/package.json +1 -1
- package/scripts/dev-server-scanner.ts +4 -3
- package/skills/contrast/SKILL.md +75 -75
- package/skills/{rnx-debug → peach-debug}/SKILL.md +90 -90
- package/skills/{rnx-perf → peach-perf}/SKILL.md +13 -13
- package/skills/{rnx-setup → peach-setup}/SKILL.md +60 -60
- package/skills/{rnx-test → peach-test}/SKILL.md +44 -44
- package/skills/{rnx-visual → peach-visual}/SKILL.md +26 -26
- package/src/agent-daemon-client.ts +5 -5
- package/src/agent-events.ts +1 -1
- package/src/agent-identity.ts +1 -1
- package/src/agent-sessions.ts +13 -13
- package/src/attached-projects.ts +1 -1
- package/src/auth/shared-session.ts +1 -1
- package/src/bridge-constants.ts +3 -3
- package/src/bridge-contract-input.ts +1 -1
- package/src/bridge-contract.ts +3 -3
- package/src/cli-version.ts +6 -6
- package/src/cloud.ts +40 -40
- package/src/config.ts +1 -1
- package/src/connect.ts +6 -6
- package/src/dev-server-open.ts +8 -8
- package/src/disk-cleanup.ts +3 -3
- package/src/home-paths.ts +26 -26
- package/src/host/agent-host.ts +3 -3
- package/src/host/bridge-host.ts +33 -33
- package/src/host/fetch-proxy-handler.ts +1 -1
- package/src/host/plane-host.ts +2 -2
- package/src/host/replacement-module-handler.ts +2 -2
- package/src/menu.ts +2 -2
- package/src/metro-plugin.ts +7 -7
- package/src/metro-production-bundle.ts +2 -2
- package/src/native-dev-bundle-url.ts +2 -2
- package/src/playwright-host-log.ts +1 -1
- package/src/public-brand.ts +2 -2
- package/src/react-native-host-modules.ts +1 -1
- package/src/rolldown-plugin-swift.ts +3 -3
- package/src/runtime-assets.ts +11 -11
- package/src/runtime-delivery.ts +6 -6
- package/src/screenshots/orchestrate.ts +1 -1
- package/src/screenshots/org-deck.ts +1 -1
- package/src/screenshots/schema.ts +2 -2
- package/src/sim-client.ts +1 -1
- package/src/skills/builtin/compat-check.ts +2 -2
- package/src/vite-plugin-one.ts +8 -8
- package/src/vite-plugin-swift.ts +3 -3
- package/src/vite-plugin.ts +6 -19
package/dist-lib/skills.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! rnx v0.1.
|
|
1
|
+
/*! rnx v0.1.573 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __create = Object.create;
|
|
@@ -5550,12 +5550,12 @@ var init_unsupported_packages = __esm({
|
|
|
5550
5550
|
// '@react-native-firebase/app' is tracked at 0.95 measured coverage.
|
|
5551
5551
|
"react-native-firebase": {
|
|
5552
5552
|
note: "it is the pre-v6 umbrella package, which bundles native Firebase SDKs with no JavaScript path",
|
|
5553
|
-
recovery: "Use the scoped packages instead \u2014 install @react-native-firebase/app plus the features you need (@react-native-firebase/auth, /firestore).
|
|
5553
|
+
recovery: "Use the scoped packages instead \u2014 install @react-native-firebase/app plus the features you need (@react-native-firebase/auth, /firestore). peach runs those against a synthetic native app record."
|
|
5554
5554
|
},
|
|
5555
5555
|
// deprecated upstream since 2021. both replacements are tracked at 0.93.
|
|
5556
5556
|
"react-native-camera": {
|
|
5557
5557
|
note: "it is deprecated upstream and its capture path is entirely native",
|
|
5558
|
-
recovery: "Use react-native-vision-camera or expo-camera.
|
|
5558
|
+
recovery: "Use react-native-vision-camera or expo-camera. peach backs both with a real getUserMedia preview and canvas photo capture."
|
|
5559
5559
|
},
|
|
5560
5560
|
// no maintained upstream package under this name; store billing is native.
|
|
5561
5561
|
"react-native-in-app-purchase": {
|
|
@@ -5751,7 +5751,7 @@ var init_registry = __esm({
|
|
|
5751
5751
|
usage: 3,
|
|
5752
5752
|
importance: 3,
|
|
5753
5753
|
estimate: 1,
|
|
5754
|
-
rationale: "Shared values, timing, spring, decay, sequencing, repetition, interpolation, and easing drive the common animation workflow. The installed upstream JavaScript runs against the
|
|
5754
|
+
rationale: "Shared values, timing, spring, decay, sequencing, repetition, interpolation, and easing drive the common animation workflow. The installed upstream JavaScript runs against the Peach worklet seam, and no app-facing primitive is missing in the inspected path."
|
|
5755
5755
|
},
|
|
5756
5756
|
{
|
|
5757
5757
|
id: "animated-components-and-props",
|
|
@@ -6113,7 +6113,7 @@ var init_registry = __esm({
|
|
|
6113
6113
|
],
|
|
6114
6114
|
capabilityCoverage: CAPABILITY_INVENTORY_PACKAGE_COVERAGE["react-native-webview"],
|
|
6115
6115
|
strictCoverage: REACT_NATIVE_WEBVIEW_STRICT_COVERAGE,
|
|
6116
|
-
note: "native-seam only: the published package runs unchanged and routes RNCWebView through the tenant-to-shell hosted iframe surface. the implementation estimate uses reviewed feature weights; the separate equal-surface strict diagnostic includes the shared, iOS, and Android public prop and ref surface. paired native and
|
|
6116
|
+
note: "native-seam only: the published package runs unchanged and routes RNCWebView through the tenant-to-shell hosted iframe surface. the implementation estimate uses reviewed feature weights; the separate equal-surface strict diagnostic includes the shared, iOS, and Android public prop and ref surface. paired native and Peach runtime conformance covers local HTML, base URL, URI loading, load and navigation callbacks, both injection phases, two-way messaging, imperative URI reload and injection, local HTML fragment navigation and link-request decisions, content scrolling, parent translation, and onOpenWindow target delivery.",
|
|
6117
6117
|
working: "source.uri/source.html/source.baseUrl, Chromium cross-origin URI loading under the shell COEP, same-origin URI cookies, source.html persistent localStorage, document-start ReactNativeWebView bootstrap and injectedJavaScriptBeforeContentLoaded/injectedJavaScript on source.html, strict ReactNativeWebView.postMessage bridge envelope in both directions, onMessage synthetic event with navigation fields, onOpenWindow target delivery for source.html, successful onLoad/Start/End and onNavigationStateChange, ref.reload on URI pages, ref.injectJavaScript/postMessage, local HTML fragment URL/callback behavior, onShouldStartLoadWithRequest for local link clicks with native-shaped request and loading payloads, internal content scrolling, renderLoading, javaScriptEnabled sandbox, layout, inherited clipping and visibility, parked/live presentation",
|
|
6118
6118
|
missing: "Safari/WebKit cross-origin URI pages without COEP-compatible response headers remain permanently loading because WebKit ignores iframe credentialless; Chromium credentialless cross-origin URI frames send no credentials, including cookies set by their own origin, and use ephemeral storage; iframe pixels in canvas screenshots; script injection, ReactNativeWebView bootstrap, and onOpenWindow for remote pages, which get no bridge at all because a browser cannot script a cross-origin frame; cross-origin ref.goBack/goForward/stopLoading and truthful canGoBack/canGoForward values; failed HTTP/refused navigation callbacks (onError/onHttpError and renderError); initial-load and form onShouldStartLoadWithRequest callbacks, allowsBackForwardNavigationGestures, userAgent, dataDetectorTypes, cacheEnabled, incognito, scalesPageToFit, originWhitelist enforcement"
|
|
6119
6119
|
}
|
|
@@ -6147,7 +6147,7 @@ var init_registry = __esm({
|
|
|
6147
6147
|
{
|
|
6148
6148
|
range: ">=56.0.0 <58.0.0",
|
|
6149
6149
|
coverage: 0.35,
|
|
6150
|
-
note: "native-seam only:
|
|
6150
|
+
note: "native-seam only: Peach runtime conformance passes the published Expo 57.0.1 wrapper local-page bridge, script, object, message, scroll, update, and reload paths; native parity has no verdict, so these Peach-only observations do not raise the score.",
|
|
6151
6151
|
working: "DomWebView/WebView exports, source.uri rendering, onMessage data/url/title, ref.reload/injectJavaScript/scrollTo, document-start ReactNativeWebView bootstrap and injectedJavaScriptBeforeContentLoaded on percent-encoded data: URI pages, injectedJavaScriptObject, reload-on-update behavior for injectedJavaScriptObject/injectedJavaScript, layout and parked/live presentation",
|
|
6152
6152
|
missing: "Expo modules bridge, any bridge or script injection on a remote page because a browser cannot script a cross-origin frame, cross-origin scrolling, the re-encoded data: URI a page reports as its own location.href, exact native scroll physics and native-only media/keyboard props, iframe pixels in canvas screenshots"
|
|
6153
6153
|
}
|
|
@@ -6253,7 +6253,7 @@ var init_registry = __esm({
|
|
|
6253
6253
|
usage: 3,
|
|
6254
6254
|
importance: 3,
|
|
6255
6255
|
estimate: 1,
|
|
6256
|
-
rationale: "KeyboardProvider, animation hooks, focused-input hooks, keyboard lifecycle events, and resize events use the live
|
|
6256
|
+
rationale: "KeyboardProvider, animation hooks, focused-input hooks, keyboard lifecycle events, and resize events use the live Peach keyboard source and worklet dispatch path. The inspected event and hook path has no app-facing behavior gap."
|
|
6257
6257
|
},
|
|
6258
6258
|
{
|
|
6259
6259
|
id: "keyboard-controller-api",
|
|
@@ -6390,7 +6390,7 @@ var init_registry = __esm({
|
|
|
6390
6390
|
}
|
|
6391
6391
|
],
|
|
6392
6392
|
capabilityCoverage: CAPABILITY_INVENTORY_PACKAGE_COVERAGE["react-native-worklets"],
|
|
6393
|
-
note: "core RN\u2194UI thread bridging, isolated named Worker runtimes, runtime-kind guards, UI-runtime-id execution, shareable/synchronizable guards, custom serializable registration, and feature flag readers use
|
|
6393
|
+
note: "core RN\u2194UI thread bridging, isolated named Worker runtimes, runtime-kind guards, UI-runtime-id execution, shareable/synchronizable guards, custom serializable registration, and feature flag readers use Peach worker runtimes.",
|
|
6394
6394
|
working: "createWorkletRuntime with isolated named Worker execution and lifecycle teardown, runOnRuntime/runOnRuntimeAsync/scheduleOnRuntime with scheduleOnRN callback return, runOnJS, runOnUI/Sync/Async, scheduleOnRN/UI, UI-runtime runOnRuntimeSyncWithId/scheduleOnRuntimeWithId, makeShareable, createShareable (3-arg form with hostDecorator), createSerializable, createSynchronizable, isShareable, isSynchronizable, isWorkletFunction, isShareableRef, isSerializableRef, makeShareableCloneRecursive/OnUIRecursive, executeOnUIRuntimeSync, callMicrotasks, WorkletsModule, RuntimeKind enum, getRuntimeKind, isRNRuntime, isUIRuntime, isWorkerRuntime, isWorkletRuntime, UIRuntimeId, getUIRuntimeHolder, getUISchedulerHolder, registerCustomSerializable, getStaticFeatureFlag, getDynamicFeatureFlag, setDynamicFeatureFlag, Worklets namespace",
|
|
6395
6395
|
missing: "synchronous named-runtime results, runtime-id scheduling into named workers, custom queue/event-loop configuration, cross-runtime structured-clone hooks for custom registered classes, dynamic feature flag fan-out across the tenant\u2194shell split"
|
|
6396
6396
|
}
|
|
@@ -6456,7 +6456,7 @@ var init_registry = __esm({
|
|
|
6456
6456
|
{
|
|
6457
6457
|
range: ">=1.0.0",
|
|
6458
6458
|
coverage: 0.9,
|
|
6459
|
-
note: "the real expo-image wrapper renders through the shared sootsim-image host. Paired native and
|
|
6459
|
+
note: "the real expo-image wrapper renders through the shared sootsim-image host. Paired native and Peach runtime proof covers source-less placeholder rendering and right-edge contentPosition alignment; a negative control observed centered red/blue content before the renderer implemented the position.",
|
|
6460
6460
|
working: "Image component, ImageBackground, useImage hook, ImageRef class, contentFit, contentPosition right-edge alignment, source-less placeholder rendering and placeholderContentFit, tintColor, onLoad/onLoadStart/onLoadEnd/onError callbacks, source normalization (string/object/array), prefetch, clearMemoryCache, clearDiskCache, getCachePathAsync, configureCache, generateBlurhashAsync, generateThumbhashAsync, loadAsync",
|
|
6461
6461
|
missing: "transition/animation effects, blurRadius, contentPosition variants beyond the paired right-edge proof, sfEffect/SFSymbol, allowDownscaling, autoplay (GIF), responsivePolicy"
|
|
6462
6462
|
}
|
|
@@ -6482,7 +6482,7 @@ var init_registry = __esm({
|
|
|
6482
6482
|
{
|
|
6483
6483
|
range: ">=0.17.0",
|
|
6484
6484
|
coverage: 1,
|
|
6485
|
-
note: "full splash wired to the
|
|
6485
|
+
note: "full splash wired to the peach canvas boot splash, including the app's REAL configured artwork. the config plugin's image + backgroundColor (+ imageWidth, resizeMode, dark variant) and the legacy expo.splash / expo.ios.splash blocks are parsed and painted on boot exactly like the native splash window. setOptions({fade,duration}) is honored: hideAsync()/hide() cross-dissolve the splash over the configured duration (default 400ms, fade default off \u2014 mirroring ios/SplashScreenManager.swift hide()); preventAutoHideAsync holds the splash until the app hides it. matches upstream index.native.ts semantics.",
|
|
6486
6486
|
working: "preventAutoHideAsync (holds splash), hideAsync, hide (sync), setOptions (fade + duration drive the real canvas fade), configured splash image + backgroundColor + imageWidth + resizeMode + dark variant painted on boot (config plugin + legacy expo.splash), SplashScreenOptions type"
|
|
6487
6487
|
}
|
|
6488
6488
|
]
|
|
@@ -6507,7 +6507,7 @@ var init_registry = __esm({
|
|
|
6507
6507
|
{
|
|
6508
6508
|
range: ">=15.0.0",
|
|
6509
6509
|
coverage: 0.9,
|
|
6510
|
-
note: "both APIs implemented over one shared synchronous localStorage VFS: the SDK-18+ class-based File/Directory/Paths API (the bare `expo-file-system` export on SDK 18+) and the legacy async API (`expo-file-system/legacy`), with real network ops via fetch + navigator.storage. legacy and new interoperate on the same filesystem. paired native and
|
|
6510
|
+
note: "both APIs implemented over one shared synchronous localStorage VFS: the SDK-18+ class-based File/Directory/Paths API (the bare `expo-file-system` export on SDK 18+) and the legacy async API (`expo-file-system/legacy`), with real network ops via fetch + navigator.storage. legacy and new interoperate on the same filesystem. paired native and Peach runtime conformance verifies the published DownloadResumable class identity, savable state, and cancel-before-start behavior; the score stays at 90% because active-transfer control remains unsupported.",
|
|
6511
6511
|
working: "SDK-18+ class API: Paths (document/cache/bundle, join/basename/extname/dirname), File (exists, size, md5, name, extension, parentDirectory, create, write text|bytes, text(Sync), base64(Sync), bytes(Sync), arrayBuffer, slice, stream, delete, info, copy, move/rename, open FileHandle, static downloadFileAsync/pickFileAsync), Directory (exists, create, createFile, createDirectory, list, info, delete, copy, move, static pickDirectoryAsync). Legacy API: documentDirectory, cacheDirectory, bundleDirectory, EncodingType, FileSystemSessionType, FileSystemUploadType, FileSystemAcceptedUploadHttpMethod, readAsStringAsync, writeAsStringAsync, deleteAsync, getInfoAsync, makeDirectoryAsync, readDirectoryAsync, copyAsync, moveAsync, downloadAsync, createDownloadResumable (published DownloadResumable class with fileUri/savable state and cancel-before-start), uploadAsync (real fetch with binary or multipart body), createUploadTask, UploadTask class (uploadAsync, cancelAsync, fires completion callback), getFreeDiskStorageAsync (navigator.storage.estimate quota - usage), getTotalDiskCapacityAsync (navigator.storage.estimate quota), getContentUriAsync (returns uri unchanged \u2014 Android-only behavior), StorageAccessFramework namespace stub (Android-only methods throw with platform error). All upstream legacy types exported: FileSystemUploadOptions, FileSystemUploadResult, UploadProgressData, DownloadProgressData, FileSystemNetworkTaskProgressCallback.",
|
|
6512
6512
|
missing: "in-flight DownloadResumable pause, resume, cancellation, and streamed download progress; chunked upload progress events (fetch does not expose upload progress)"
|
|
6513
6513
|
}
|
|
@@ -6574,7 +6574,7 @@ var init_registry = __esm({
|
|
|
6574
6574
|
{
|
|
6575
6575
|
range: ">=12.0.0",
|
|
6576
6576
|
coverage: 0.95,
|
|
6577
|
-
note: "backdrop-filter blur via
|
|
6577
|
+
note: "backdrop-filter blur via peach canvas, all BlurTint values with correct iOS opacity",
|
|
6578
6578
|
working: "BlurView, BlurTargetView, tint (all 22 BlurTint values with real iOS rgba values), intensity, blurReductionFactor, experimentalBlurMethod, blurMethod props",
|
|
6579
6579
|
missing: "actual gaussian blur rendering (approximated by backdrop-filter), Animated.createAnimatedComponent integration fidelity"
|
|
6580
6580
|
}
|
|
@@ -6599,7 +6599,7 @@ var init_registry = __esm({
|
|
|
6599
6599
|
{
|
|
6600
6600
|
range: ">=1.0.0",
|
|
6601
6601
|
coverage: 1,
|
|
6602
|
-
note: "full portal API via
|
|
6602
|
+
note: "full portal API via peach RNTPortalView/RNTPortalHostView custom elements",
|
|
6603
6603
|
working: "Portal (hostName/name/style/children), PortalHost (name/style/children), PortalProvider, usePortal (removePortal), NativePortal, NativePortalHost"
|
|
6604
6604
|
}
|
|
6605
6605
|
]
|
|
@@ -6611,9 +6611,9 @@ var init_registry = __esm({
|
|
|
6611
6611
|
{
|
|
6612
6612
|
range: ">=0.5.0 <0.6.0",
|
|
6613
6613
|
coverage: 0.95,
|
|
6614
|
-
note: "native-seam only: the published provider, navigation adapters, shared-element registry, transition recipes, measurement, Reanimated worklets, and react-native-teleport ownership all run unchanged;
|
|
6614
|
+
note: "native-seam only: the published provider, navigation adapters, shared-element registry, transition recipes, measurement, Reanimated worklets, and react-native-teleport ownership all run unchanged; peach supplies the ScreenChoreographyView host and ScreenChoreographyPreparation TurboModule used by version 0.5's presentation and two-frame layout handshakes",
|
|
6615
6615
|
working: "ChoreographyProvider, ChoreographyScreen, SharedElement and SharedElement.Target, React Navigation and Expo Router adapters, forward and interactive transitions, native preparation with mounted-descendant checks, tag-recycling rejection, positive finite geometry validation, 0.5-point stability tolerance, two stable frame samples, cancellation, and the 500ms native deadline; overlay presentation acknowledgement after a rendered frame and a two-frame dismissal grace period",
|
|
6616
|
-
missing: "native teardown freezes the final overlay into a bitmap for two frames;
|
|
6616
|
+
missing: "native teardown freezes the final overlay into a bitmap for two frames; peach keeps the live overlay subtree visible for those two frames because the canvas host has no synchronous subtree snapshot API"
|
|
6617
6617
|
}
|
|
6618
6618
|
]
|
|
6619
6619
|
},
|
|
@@ -6771,7 +6771,7 @@ var init_registry = __esm({
|
|
|
6771
6771
|
{
|
|
6772
6772
|
range: ">=55.0.0",
|
|
6773
6773
|
coverage: 0.95,
|
|
6774
|
-
note: "SymbolView renders the shared
|
|
6774
|
+
note: "SymbolView renders the shared Peach SF Symbol vector with support for monochrome, hierarchical, palette, and multicolor rendering, weight-based stroke width, and scale sizing. Unknown names use the supplied fallback. unstable_getMaterialSymbolSourceAsync returns a stable URI/size shape so apps that gate on the source resolve correctly.",
|
|
6775
6775
|
working: "SymbolView (named + default export), name object/string selection (string | { ios, android, web }), size, tintColor, colors array, type (monochrome/hierarchical/palette/multicolor), weight stroke-width scaling, scale multiplier sizing, animationSpec/resizeMode props, fallback rendering, unstable_getMaterialSymbolSourceAsync, type exports",
|
|
6776
6776
|
missing: "native Apple asset-catalog layer fidelity, bundled Material Symbols font (size budget), animation/effect modifiers (.bounce, .scale)"
|
|
6777
6777
|
}
|
|
@@ -6943,7 +6943,7 @@ var init_registry = __esm({
|
|
|
6943
6943
|
{
|
|
6944
6944
|
range: ">=0.7.0",
|
|
6945
6945
|
coverage: 0.9,
|
|
6946
|
-
note: "MenuView renders real iOS-style canvas menu via
|
|
6946
|
+
note: "MenuView renders real iOS-style canvas menu via peach ContextMenu",
|
|
6947
6947
|
working: "MenuView, actions (title, subtitle, id, state, attributes: disabled/destructive/hidden), subactions (nested menus), onPressAction, onOpenMenu, onCloseMenu, shouldOpenOnLongPress, themeVariant, isAnchoredToRight, NativeActionEvent",
|
|
6948
6948
|
missing: "keepsMenuPresented attribute (iOS 16+), image/imageColor rendering in menu items, inline element actions"
|
|
6949
6949
|
}
|
|
@@ -7223,7 +7223,7 @@ var init_registry = __esm({
|
|
|
7223
7223
|
coverage: 0.95,
|
|
7224
7224
|
note: "native-seam only \u2014 the real RNShare object (Button/ShareSheet/Overlay/Sheet components, Social map merged from native getConstants() with the upstream enum fallback, normalizeShareOpenOptions / normalizeSingleShareOptions, checkPermissions, isAndroid/isIOS branches) runs from the bundle. sootsim provides the RNShare TurboModule (open/shareSingle/isPackageInstalled/isBase64File/getConstants); open() and shareSingle() route through `SootSim.bridges.shareSheet` \u2014 the same on-canvas UIActivityViewController core RN Share / ActionSheetIOS / expo-sharing present.",
|
|
7225
7225
|
working: "real upstream Button/ShareSheet/Overlay/Sheet UI components, full Social constants table from getConstants(), open (title/message/subject, urls[] folded into the body like UIActivityViewController, failOnCancel, completed/dismissed result with activityType\u2192app), shareSingle (presents the same share sheet, INSTAGRAM_STORIES appId guard, normalize helpers), isPackageInstalled shape, isBase64File true for data: URIs, dismissedAction conversion in upstream JS",
|
|
7226
|
-
missing: "social-specific app routing \u2014 correctly absent (no real third-party social apps exist in
|
|
7226
|
+
missing: "social-specific app routing \u2014 correctly absent (no real third-party social apps exist in Peach to deep-link into); native sharing of file content (the bridge takes message/url/subject; binary attachment paths would need a deeper share-sheet bridge upgrade)"
|
|
7227
7227
|
}
|
|
7228
7228
|
]
|
|
7229
7229
|
},
|
|
@@ -7428,7 +7428,7 @@ var init_registry = __esm({
|
|
|
7428
7428
|
{
|
|
7429
7429
|
range: ">=18.0.0",
|
|
7430
7430
|
coverage: 0,
|
|
7431
|
-
note: "the reference iOS simulator performs this package's behavior.
|
|
7431
|
+
note: "the reference iOS simulator performs this package's behavior. Peach currently provides only this unsupported shape: development noop : push API surface resolves without real FCM delivery. imports and API shape receive no behavior credit",
|
|
7432
7432
|
working: "default messaging(), getToken/deleteToken, requestPermission/hasPermission AUTHORIZED, onMessage/onNotificationOpenedApp/onTokenRefresh subscriptions, getInitialNotification null, setBackgroundMessageHandler, topic subscribe/unsubscribe, auto-init/device registration helpers, AuthorizationStatus constants",
|
|
7433
7433
|
missing: "real FCM token, actual message receipt, background handler execution, notification-open events; intentionally absent for browser simulator"
|
|
7434
7434
|
}
|
|
@@ -7532,7 +7532,7 @@ var init_registry = __esm({
|
|
|
7532
7532
|
{
|
|
7533
7533
|
range: ">=18.0.0",
|
|
7534
7534
|
coverage: 0,
|
|
7535
|
-
note: "the reference iOS simulator performs this package's behavior.
|
|
7535
|
+
note: "the reference iOS simulator performs this package's behavior. Peach currently provides only this unsupported shape: noop callable functions : calls resolve with {data:null}. imports and API shape receive no behavior credit",
|
|
7536
7536
|
working: "default functions(), httpsCallable, useEmulator",
|
|
7537
7537
|
missing: "real HTTPS callable transport, emulator networking, error code mapping"
|
|
7538
7538
|
}
|
|
@@ -7545,7 +7545,7 @@ var init_registry = __esm({
|
|
|
7545
7545
|
{
|
|
7546
7546
|
range: ">=18.0.0",
|
|
7547
7547
|
coverage: 0,
|
|
7548
|
-
note: "the reference iOS simulator creates real Firebase installation identifiers and tokens when configured.
|
|
7548
|
+
note: "the reference iOS simulator creates real Firebase installation identifiers and tokens when configured. Peach returns fixed placeholder strings, so import safety receives no behavior credit",
|
|
7549
7549
|
working: "default installations(), getId, getToken, delete",
|
|
7550
7550
|
missing: "real Firebase installation registration and token lifecycle"
|
|
7551
7551
|
}
|
|
@@ -7558,7 +7558,7 @@ var init_registry = __esm({
|
|
|
7558
7558
|
{
|
|
7559
7559
|
range: ">=18.0.0",
|
|
7560
7560
|
coverage: 0,
|
|
7561
|
-
note: "the reference iOS simulator performs this package's behavior.
|
|
7561
|
+
note: "the reference iOS simulator performs this package's behavior. Peach currently provides only this unsupported shape: development token noop : App Check API shape resolves with stub tokens. imports and API shape receive no behavior credit",
|
|
7562
7562
|
working: "default appCheck(), activate, setTokenAutoRefreshEnabled, getToken, onTokenChanged",
|
|
7563
7563
|
missing: "real attestation provider, token refresh, enforcement with Firebase services"
|
|
7564
7564
|
}
|
|
@@ -7674,7 +7674,7 @@ var init_registry = __esm({
|
|
|
7674
7674
|
}
|
|
7675
7675
|
],
|
|
7676
7676
|
capabilityCoverage: CAPABILITY_INVENTORY_PACKAGE_COVERAGE["@react-native-community/datetimepicker"],
|
|
7677
|
-
note: "the real upstream package JS runs from the guest bundle. the granular onValueChange prop starts in 9.1.0; its controlled iOS wrapper resolves codegenNativeComponent('RNDateTimePicker') to the engine UIDatePicker wheel. paired native and
|
|
7677
|
+
note: "the real upstream package JS runs from the guest bundle. the granular onValueChange prop starts in 9.1.0; its controlled iOS wrapper resolves codegenNativeComponent('RNDateTimePicker') to the engine UIDatePicker wheel. paired native and Peach proof covers fixed-offset and IANA-named date calendars. the pinned Fabric emitter omits utcOffset, so its Int32 field is observed as 0 on native and intentionally matches that value here.",
|
|
7678
7678
|
working: "real upstream DateTimePicker and exported constants, value, mode date/time/datetime, granular onValueChange event and Date, minimumDate, maximumDate, minuteInterval, locale, timeZoneOffsetInMinutes, timeZoneName for date-mode calendar selection, textColor, themeVariant, disabled",
|
|
7679
7679
|
missing: "displayIOS 'default'/'compact'/'inline' calendar styles (all render as wheels), countdown mode renders the time wheel, named-zone time/datetime modes are not retained by paired proof, accentColor, public onDismiss; deprecated onChange is not covered by the retained native proof"
|
|
7680
7680
|
}
|
|
@@ -7702,7 +7702,7 @@ var init_registry = __esm({
|
|
|
7702
7702
|
coverage: 0.76,
|
|
7703
7703
|
note: "the real upstream PickerIOS wrapper runs from the guest bundle and resolves codegenNativeComponent('RNCPicker') to the engine UIPickerView wheel. upstream owns Picker.Item mapping, controlled selection, and callback fan-out.",
|
|
7704
7704
|
working: "real upstream Picker, PickerIOS, Picker.Item label/value, selectedValue, onValueChange(value, index), itemStyle color/fontSize, MODE_DIALOG and MODE_DROPDOWN constants",
|
|
7705
|
-
missing: "Picker.Item color/testID, themeVariant, textAlign, itemStyle fontFamily/fontWeight/fontStyle, multi-line numberOfLines behavior, controlled native selection restore proof, deprecated onChange proof, android dialog/dropdown presentation (mode/prompt/dropdownIconColor render as the iOS wheel), focus()/blur() imperative handle, onFocus/onBlur; selectionColor is ignored by the exact 2.11.4 Fabric iOS host and
|
|
7705
|
+
missing: "Picker.Item color/testID, themeVariant, textAlign, itemStyle fontFamily/fontWeight/fontStyle, multi-line numberOfLines behavior, controlled native selection restore proof, deprecated onChange proof, android dialog/dropdown presentation (mode/prompt/dropdownIconColor render as the iOS wheel), focus()/blur() imperative handle, onFocus/onBlur; selectionColor is ignored by the exact 2.11.4 Fabric iOS host and Peach matches that behavior"
|
|
7706
7706
|
}
|
|
7707
7707
|
]
|
|
7708
7708
|
},
|
|
@@ -7831,7 +7831,7 @@ var init_registry = __esm({
|
|
|
7831
7831
|
range: ">=7.0.0",
|
|
7832
7832
|
coverage: 0.95,
|
|
7833
7833
|
note: "scored against the browser-hosted simulator contract: the real package imports cleanly and its meaningful lock state, platform masks, reads, and portrait-to-landscape event behavior match iOS across eight paired runtime stages. The simulator device frame is intentionally fixed, so the score does not claim faithful UIKit rotation.",
|
|
7834
|
-
working: "getOrientationAsync, getOrientationLockAsync, getPlatformOrientationLockAsync, lockAsync (with upstream TypeError validation), lockPlatformAsync, unlockAsync, supportsOrientationLockAsync, addOrientationChangeListener/remove, all enums; paired native and
|
|
7834
|
+
working: "getOrientationAsync, getOrientationLockAsync, getPlatformOrientationLockAsync, lockAsync (with upstream TypeError validation), lockPlatformAsync, unlockAsync, supportsOrientationLockAsync, addOrientationChangeListener/remove, all enums; paired native and Peach runtime validates support queries, portrait locks and reads, iOS platform-mask read/write, portrait-to-landscape event payloads, and unlock",
|
|
7835
7835
|
missing: "deprecated bulk listener removal and same-axis portrait-up/portrait-down event filtering lack paired runtime coverage; physical device-frame rotation and sensor-driven auto-rotation are intentionally unavailable in the fixed browser-hosted simulator and do not count as an implementation gap"
|
|
7836
7836
|
}
|
|
7837
7837
|
]
|
|
@@ -8001,7 +8001,7 @@ var init_registry = __esm({
|
|
|
8001
8001
|
{
|
|
8002
8002
|
range: ">=1.7.0",
|
|
8003
8003
|
coverage: 0.82,
|
|
8004
|
-
note: "native-seam only. the published Presets, Settings, adaptive hooks, and pattern/realtime composer hooks run unchanged against
|
|
8004
|
+
note: "native-seam only. the published Presets, Settings, adaptive hooks, and pattern/realtime composer hooks run unchanged against Peach's RNPulsar haptic engine.",
|
|
8005
8005
|
working: "Presets catalog and System presets, Settings support/configuration methods, usePatternComposer parse/play/stop/release state, useRealtimeComposer set/playDiscrete/stop/isActive, useAdaptiveHaptics selection, haptic activity visualization with amplitude-scaled strength",
|
|
8006
8006
|
missing: "physical Core Haptics or Android vibrator output, exact per-preset waveform and audio rendering, frequency rendering, background playback, hardware capability detection beyond the simulator engine"
|
|
8007
8007
|
}
|
|
@@ -8108,7 +8108,7 @@ var init_registry = __esm({
|
|
|
8108
8108
|
coverage: 0.93,
|
|
8109
8109
|
note: "real Stripe.js delegation \u2014 initStripe() lazy-loads https://js.stripe.com/v3/ on first call (no upfront network cost), then every payment op (createPaymentMethod, confirmPayment, confirmSetupIntent, createToken, retrievePaymentIntent / SetupIntent, handleNextAction, verifyMicrodepositsForPayment / Setup) delegates to the real Stripe instance and talks to api.stripe.com over HTTPS. tokenization, payment intents, setup intents, and 3DS are the real implementation; errors are mapped into upstream StripeError shape. <CardField> / <CardForm> / <AuBECSDebitForm> / <PaymentMethodMessagingElement> mount real Stripe Elements iframes (PCI-compliant card collection). Apple Pay / Google Pay route through stripe.paymentRequest (the cross-platform abstraction). native PaymentSheet, CustomerSheet, AddressSheet, AddToWalletButton, and openApplePaySetup remain documented-unavailable (no web equivalents for the native bottom sheets / PassKit setup).",
|
|
8110
8110
|
working: "real Stripe.js tokenization + intent flow \u2014 initStripe (loads js.stripe.com/v3 lazily, caches Stripe instance per publishableKey), createPaymentMethod (real), confirmPayment (real, via stripe.confirmCardPayment), confirmSetupIntent (real, via stripe.confirmCardSetup), createToken (real, via stripe.createToken \u2014 bank_account / pii / account; Card requires a mounted CardField), retrievePaymentIntent / retrieveSetupIntent (real), handleNextAction (real, via stripe.handleCardAction), handleNextActionForSetup (real, via stripe.handleNextAction), verifyMicrodepositsForPayment / Setup (real). real Stripe Elements: CardField / CardForm / AuBECSDebitForm / PaymentMethodMessagingElement mount stripe.elements().create(...) DOM iframes when wrapped in a StripeProvider. platform pay paths (confirmPlatformPayPayment / confirmPlatformPaySetupIntent / createPlatformPayPaymentMethod) route through stripe.paymentRequest \u2014 Apple Pay + Google Pay flow through the same browser PaymentRequest sheet Stripe.js abstracts. feature detection: isPlatformPaySupported via window.ApplePaySession.canMakePayments() + window.PaymentRequest. all upstream React surface: StripeProvider, useStripe / usePaymentSheet / usePlatformPay / useConfirmPayment / useConfirmSetupIntent / useApplePay / useGooglePay / useFinancialConnectionsSheet / useOnramp / useCustomerSheet hooks; StripeContainer / AddToWalletButton / AddressSheet / PlatformPayButton / CustomerSheet / ConnectComponentsProvider components; loadConnectAndInitialize, Constants (ApplePayContactFieldsType, ApplePayMerchantCapability, ApplePayShippingType, AndroidGooglePayButtonStyle / Type, IosGooglePayButtonType), all upstream error enums (Confirm/CardAction/Setup/CreatePayment/CreateToken/RetrievePayment/RetrieveSetup/ApplePay/PaymentSheet/Onramp/GooglePay/VerifyMicrodeposits/CollectBankAccount/AddressSheet/CustomerSheet/PlatformPay/Radar), CardBrand enum, PaymentMethodLayout, StripeError + ErrorType + MissingRoutingNumber",
|
|
8111
|
-
missing: 'native PaymentSheet UI (the iOS-styled bottom drawer; web has stripe.elements().create("payment") as a primitive but the styled chrome differs). CustomerSheet / AddressSheet UI (no clean web equivalent). AddToWalletButton + openApplePaySetup (PassKit-only operations). createTokenForCVCUpdate (requires a mounted CardCvcElement). collectBankAccount* APIs (require a Financial Connections session token from the merchant server). raw Stripe Connect embedded components (would need @stripe/connect-js dep). when running inside the
|
|
8111
|
+
missing: 'native PaymentSheet UI (the iOS-styled bottom drawer; web has stripe.elements().create("payment") as a primitive but the styled chrome differs). CustomerSheet / AddressSheet UI (no clean web equivalent). AddToWalletButton + openApplePaySetup (PassKit-only operations). createTokenForCVCUpdate (requires a mounted CardCvcElement). collectBankAccount* APIs (require a Financial Connections session token from the merchant server). raw Stripe Connect embedded components (would need @stripe/connect-js dep). when running inside the peach tenant worker (no `document`), Stripe.js cannot load \u2014 a future SootSim.bridges.stripe host helper would proxy DOM ops; the stub surfaces a typed error in that case so consumer code branches through error UI.'
|
|
8112
8112
|
}
|
|
8113
8113
|
]
|
|
8114
8114
|
},
|
|
@@ -8197,7 +8197,7 @@ var init_registry = __esm({
|
|
|
8197
8197
|
coverage: 0.9,
|
|
8198
8198
|
note: "native-seam only \u2014 upstream index.js is the NativeModules.RNSettings export. sootsim registers the iOS-shaped RNSettings module with LOCATION_SETTING/DISABLED/ENABLED constants and getSetting(LOCATION_SETTING), resolving from the browser geolocation capability without prompting for permission.",
|
|
8199
8199
|
working: "RNSettings default export, LOCATION_SETTING/DISABLED/ENABLED constants, getConstants, getSetting(LOCATION_SETTING) resolves ENABLED when geolocation exists and DISABLED otherwise, unknown setting rejection",
|
|
8200
|
-
missing: "Android-only AIRPLANE_MODE_SETTING/CAPTIONING_SETTINGS/openSetting/event receivers; not part of the iOS
|
|
8200
|
+
missing: "Android-only AIRPLANE_MODE_SETTING/CAPTIONING_SETTINGS/openSetting/event receivers; not part of the iOS Peach contract"
|
|
8201
8201
|
}
|
|
8202
8202
|
]
|
|
8203
8203
|
},
|
|
@@ -8248,7 +8248,7 @@ var init_registry = __esm({
|
|
|
8248
8248
|
{
|
|
8249
8249
|
range: ">=4.0.0",
|
|
8250
8250
|
coverage: 0.5,
|
|
8251
|
-
note: "the published SDK 57 package runs unchanged;
|
|
8251
|
+
note: "the published SDK 57 package runs unchanged; Peach iOS follows its upstream unsupported-platform implementation and returns hidden visibility while component/static setters remain load-safe",
|
|
8252
8252
|
working: "SDK 57 NavigationBar component and setStyle/setHidden statics through the published iOS entry",
|
|
8253
8253
|
missing: "Android navigation-bar visibility and style effects, visibility events, OS contrast enforcement, and per-emulator navigation-bar dimensions"
|
|
8254
8254
|
}
|
|
@@ -8289,9 +8289,9 @@ var init_registry = __esm({
|
|
|
8289
8289
|
{
|
|
8290
8290
|
range: ">=4.0.0",
|
|
8291
8291
|
coverage: 0.9,
|
|
8292
|
-
note: "the published two-function package runs unchanged; its native seam applies processed colors to the tenant-owned app root that
|
|
8292
|
+
note: "the published two-function package runs unchanged; its native seam applies processed colors to the tenant-owned app root that Peach synchronizes to the CanvasKit compositor",
|
|
8293
8293
|
working: "setBackgroundColorAsync and getBackgroundColorAsync round-trip the visible app-surface background, including React Native processed-color conversion; null restores the neutral app surface",
|
|
8294
|
-
missing: "the value does not persist across simulator restarts, and null restores
|
|
8294
|
+
missing: "the value does not persist across simulator restarts, and null restores Peach\u2019s neutral surface rather than the exact platform default color"
|
|
8295
8295
|
}
|
|
8296
8296
|
]
|
|
8297
8297
|
},
|
|
@@ -8330,7 +8330,7 @@ var init_registry = __esm({
|
|
|
8330
8330
|
{
|
|
8331
8331
|
range: ">=11.0.0",
|
|
8332
8332
|
coverage: 0.93,
|
|
8333
|
-
note: "package-local wrapper registers only the ExpoTaskManager native module; upstream expo-task-manager JS runs unchanged. isAvailableAsync returns false on web per upstream's documented unavailable shape (TaskManager.ts:286), so apps with graceful-degradation paths skip background-task registration correctly.
|
|
8333
|
+
note: "package-local wrapper registers only the ExpoTaskManager native module; upstream expo-task-manager JS runs unchanged. isAvailableAsync returns false on web per upstream's documented unavailable shape (TaskManager.ts:286), so apps with graceful-degradation paths skip background-task registration correctly. Peach is exactly as capable here as real expo-on-web (full JS surface + the same documented unavailable shape) \u2014 the only gaps are background execution primitives no browser has.",
|
|
8334
8334
|
working: "upstream defineTask/isTaskDefined validation, native EVENT_NAME, isAvailableAsync (false on web), isTaskRegisteredAsync, getTaskOptionsAsync, getRegisteredTasksAsync, unregisterTaskAsync, unregisterAllTasksAsync, notifyTaskFinishedAsync, native task execution events",
|
|
8335
8335
|
missing: "persistent native EXTaskService storage, app relaunch/headless execution, real task execution while the browser tab is suspended (browsers do not have iOS Background Fetch / Android WorkManager)"
|
|
8336
8336
|
}
|
|
@@ -8655,7 +8655,7 @@ var init_registry = __esm({
|
|
|
8655
8655
|
{
|
|
8656
8656
|
range: ">=3.0.0",
|
|
8657
8657
|
coverage: 1,
|
|
8658
|
-
note: "package JS is just `export default NativeModules.SplashScreen`; the real package runs from the bundle against the SplashScreen native seam. hide() snap-hides the
|
|
8658
|
+
note: "package JS is just `export default NativeModules.SplashScreen`; the real package runs from the bundle against the SplashScreen native seam. hide() snap-hides the peach canvas boot splash (mirrors ios/RNSplashScreen.m removeFromSuperview, no fade); show() returns immediately without re-showing, exactly as the booted-app native path where `waiting` is already false.",
|
|
8659
8659
|
working: "hide() (snap-hides the canvas splash), show() (no-op in a booted app, faithful)"
|
|
8660
8660
|
}
|
|
8661
8661
|
]
|
|
@@ -8693,7 +8693,7 @@ var init_registry = __esm({
|
|
|
8693
8693
|
{
|
|
8694
8694
|
range: ">=5.0.0",
|
|
8695
8695
|
coverage: 0,
|
|
8696
|
-
note: "the reference iOS simulator receives simulated notifications and presents configured OneSignal in-app messages.
|
|
8696
|
+
note: "the reference iOS simulator receives simulated notifications and presents configured OneSignal in-app messages. Peach returns no token, displays no message, and fires no events, so import safety receives no behavior credit",
|
|
8697
8697
|
working: "initialize/login/logout/setConsentGiven/setConsentRequired (log to console), User tag/alias/email/sms add-remove (noop), User.getTags (empty), InAppMessages trigger (log to console), Debug.setLogLevel, LiveActivities.enter/exit, Session outcome methods, event listener registration",
|
|
8698
8698
|
missing: "real push permission, actual subscription token/id (always null), opted-in status (always false), real in-app message display, location sharing, push opt-in actually working"
|
|
8699
8699
|
}
|
|
@@ -8758,7 +8758,7 @@ var init_registry = __esm({
|
|
|
8758
8758
|
{
|
|
8759
8759
|
range: ">=12.0.0",
|
|
8760
8760
|
coverage: 0,
|
|
8761
|
-
note: "the reference iOS simulator presents Facebook login, share, message, and game-request flows when configured.
|
|
8761
|
+
note: "the reference iOS simulator presents Facebook login, share, message, and game-request flows when configured. Peach cancels every dialog and returns no token or profile, so import safety receives no behavior credit",
|
|
8762
8762
|
working: "Settings.setAppID/setClientToken/setGraphAPIVersion/setAutoLogAppEventsEnabled/setAdvertiserIDCollectionEnabled all accept calls, AppEventsLogger.logEvent/logPurchase log to console, all type shapes",
|
|
8763
8763
|
missing: "logInWithPermissions always returns isCancelled:true, AccessToken.getCurrentAccessToken always null, Profile.getCurrentProfile always null, ShareDialog/MessageDialog/GameRequestDialog always isCancelled, no real Graph API, initializeSDK is noop"
|
|
8764
8764
|
}
|
|
@@ -8823,7 +8823,7 @@ var init_registry = __esm({
|
|
|
8823
8823
|
{
|
|
8824
8824
|
range: ">=57.0.4 <58.0.0",
|
|
8825
8825
|
coverage: 1,
|
|
8826
|
-
note: "build-only \u2014 the published JavaScript entry exports null, and the npm package exists solely to autolink the native Swift/C++ ExpoModulesJSI framework used transitively by expo-modules-core; there is no runtime JavaScript API for
|
|
8826
|
+
note: "build-only \u2014 the published JavaScript entry exports null, and the npm package exists solely to autolink the native Swift/C++ ExpoModulesJSI framework used transitively by expo-modules-core; there is no runtime JavaScript API for Peach to provide"
|
|
8827
8827
|
}
|
|
8828
8828
|
]
|
|
8829
8829
|
},
|
|
@@ -8994,7 +8994,7 @@ var init_registry = __esm({
|
|
|
8994
8994
|
{
|
|
8995
8995
|
range: ">=1.0.0",
|
|
8996
8996
|
coverage: 0,
|
|
8997
|
-
note: "the reference iOS simulator performs this package's behavior.
|
|
8997
|
+
note: "the reference iOS simulator performs this package's behavior. Peach currently provides only this unsupported shape: noop icon switching : correct for browser, useDynamicAppIcon hook is functional. imports and API shape receive no behavior credit",
|
|
8998
8998
|
working: "setAppIcon, getAppIcon, useDynamicAppIcon"
|
|
8999
8999
|
}
|
|
9000
9000
|
]
|
|
@@ -9021,7 +9021,7 @@ var init_registry = __esm({
|
|
|
9021
9021
|
coverage: 0.75,
|
|
9022
9022
|
note: "native-seam only \u2014 the real package JS runs from the bundle, parses colors with colord, and calls the RootViewBackground TurboModule. sootsim accepts and records the r/g/b/a native call; the visual root background remains owned by the rendered RN root view because there is no separate UIKit root view behind the canvas tenant tree.",
|
|
9023
9023
|
working: "setRootViewBackgroundColor, colord parsing in upstream JS, RootViewBackground.setBackground(r,g,b,a) native call shape, channel clamping/acceptance",
|
|
9024
|
-
missing: "actual UIKit rootViewController.view.backgroundColor mutation behind the canvas surface; use the RN root view style for visible background color in
|
|
9024
|
+
missing: "actual UIKit rootViewController.view.backgroundColor mutation behind the canvas surface; use the RN root view style for visible background color in Peach"
|
|
9025
9025
|
}
|
|
9026
9026
|
]
|
|
9027
9027
|
},
|
|
@@ -9032,7 +9032,7 @@ var init_registry = __esm({
|
|
|
9032
9032
|
{
|
|
9033
9033
|
range: ">=0.2.0",
|
|
9034
9034
|
coverage: 0,
|
|
9035
|
-
note: "the reference iOS runtime applies the idle-timer flag through activate and deactivate.
|
|
9035
|
+
note: "the reference iOS runtime applies the idle-timer flag through activate and deactivate. Peach accepts both calls without changing that flag, so import safety receives no behavior credit",
|
|
9036
9036
|
working: "activate, deactivate, useKeepAwake, KeepAwake component, KeepAwake TurboModule shape",
|
|
9037
9037
|
missing: "actual UIApplication.idleTimerDisabled / browser Wake Lock acquisition from the tenant worker"
|
|
9038
9038
|
}
|
|
@@ -9218,7 +9218,7 @@ var init_registry = __esm({
|
|
|
9218
9218
|
{
|
|
9219
9219
|
range: ">=3.1.0",
|
|
9220
9220
|
coverage: 0.85,
|
|
9221
|
-
note: "native-seam only \u2014 upstream expo-speech-recognition JS (ExpoWebSpeechRecognition, useSpeechRecognitionEvent, constants, and direct module API) runs unchanged from the bundle;
|
|
9221
|
+
note: "native-seam only \u2014 upstream expo-speech-recognition JS (ExpoWebSpeechRecognition, useSpeechRecognitionEvent, constants, and direct module API) runs unchanged from the bundle; Peach registers only the ExpoSpeechRecognition native module, backed by the host-service SpeechRecognition bridge when available",
|
|
9222
9222
|
working: "ExpoSpeechRecognition native module start/stop/abort/state, native event addListener/remove, granted permission helpers, recognition availability, speech services/default-service helpers, supported-locales shape, iOS audio-session getters/setters; upstream ExpoWebSpeechRecognition class, grammar/list classes, hook, and constants stay authoritative",
|
|
9223
9223
|
missing: "native SFSpeechRecognizer and Android SpeechRecognizer engines, audioSource transcription, recording persistence, locale installation data, offline model downloads, volume metering"
|
|
9224
9224
|
}
|
|
@@ -9321,7 +9321,7 @@ var init_registry = __esm({
|
|
|
9321
9321
|
{
|
|
9322
9322
|
range: ">=0.30.0",
|
|
9323
9323
|
coverage: 0.3,
|
|
9324
|
-
note: "native-seam only: the published Nitro Modules entrypoint installs
|
|
9324
|
+
note: "native-seam only: the published Nitro Modules entrypoint installs Peach's HybridObject registry, but no native JSI bindings run",
|
|
9325
9325
|
working: "published entrypoint and type exports, NitroModules metadata, registered createHybridObject factories, actionable errors for unregistered HybridObjects, hasHybridObject/getAllHybridObjectNames registry state, isRuntimeAlive false, callback wrapper, getHybridObjectConstructor",
|
|
9326
9326
|
missing: "the native JSI framework implementation; package-specific HybridObjects work only where a separate compat seam registers them, and native memory accounting, ArrayBuffer ownership, cross-runtime boxed HybridObjects, and Nitro Views remain absent"
|
|
9327
9327
|
}
|
|
@@ -9360,7 +9360,7 @@ var init_registry = __esm({
|
|
|
9360
9360
|
{
|
|
9361
9361
|
range: ">=19.0.0",
|
|
9362
9362
|
coverage: 0,
|
|
9363
|
-
note: "the reference iOS simulator presents Airship message-center and preference-center UI when configured.
|
|
9363
|
+
note: "the reference iOS simulator presents Airship message-center and preference-center UI when configured. Peach returns an unconfigured state and presents neither surface, so import safety receives no behavior credit",
|
|
9364
9364
|
working: "AirshipRoot constructor + every getter, takeOff, isFlying, push.getNotificationStatus / enableUserNotifications / setForegroundPresentationOptions, contact identify/reset/getNamedUserId, messageCenter list / refresh / dismiss, channel get / addTag / removeTag / setTags, preferenceCenter open, named-user state, iOS.liveActivityManager (every method resolves), addListener / removeAllListeners on UAEventEmitter, all 60+ TurboModule Spec methods accept calls without throwing",
|
|
9365
9365
|
missing: "no Urban Airship SAAS backend \u2014 no real push delivery, no remote-config / engage / journey events, no Live Activity binding to ActivityKit, no actual notification permission grant; the seam acknowledges listener registration but never fires events"
|
|
9366
9366
|
}
|
|
@@ -9385,7 +9385,7 @@ var init_registry = __esm({
|
|
|
9385
9385
|
{
|
|
9386
9386
|
range: ">=2.0.0",
|
|
9387
9387
|
coverage: 0,
|
|
9388
|
-
note: "the reference iOS simulator performs this package's behavior.
|
|
9388
|
+
note: "the reference iOS simulator performs this package's behavior. Peach currently provides only this unsupported shape: load-only stub: getConstants returns PROFILE_KEYS / PUSH_TOKEN_VENDOR / EVENT_NAMES so the bundle initializes; calls are no-ops (no real analytics, push, or in-app forms). imports and API shape receive no behavior credit",
|
|
9389
9389
|
working: "KlaviyoReactNativeSdk.getConstants(), Klaviyo namespace + Profile/Push/Forms/DeepLink/Geofencing methods (no-op), ProfileProperty enum"
|
|
9390
9390
|
}
|
|
9391
9391
|
]
|
|
@@ -9401,7 +9401,7 @@ var init_registry = __esm({
|
|
|
9401
9401
|
{
|
|
9402
9402
|
range: ">=8.0.0",
|
|
9403
9403
|
coverage: 0,
|
|
9404
|
-
note: "the reference iOS simulator performs this package's behavior.
|
|
9404
|
+
note: "the reference iOS simulator performs this package's behavior. Peach currently provides only this unsupported shape: intentional noop : wdyr mutates React internals and crashes sootsim's bridged React. imports and API shape receive no behavior credit",
|
|
9405
9405
|
working: "default export callable as wdyr(React, opts) without error"
|
|
9406
9406
|
}
|
|
9407
9407
|
]
|
|
@@ -9452,7 +9452,7 @@ var init_registry = __esm({
|
|
|
9452
9452
|
{
|
|
9453
9453
|
range: ">=55.0.0",
|
|
9454
9454
|
coverage: 0.85,
|
|
9455
|
-
note: "tooling-only \u2014 Metro injects this package into development bundles;
|
|
9455
|
+
note: "tooling-only \u2014 Metro injects this package into development bundles; Peach supports its location, server-log, rejection-tracking, refresh, and bootstrap helpers as bundler/runtime infrastructure rather than an application-facing API",
|
|
9456
9456
|
working: "runtime entrypoint, location polyfill install, RSC runtime import, web getDevServer path, development log capture and promise rejection tracking on supported globals",
|
|
9457
9457
|
missing: "native reload/logbox paths depend on RN DevSettings and internal native LogBox behavior; production app functionality is unaffected"
|
|
9458
9458
|
}
|
|
@@ -9487,7 +9487,7 @@ var init_registry = __esm({
|
|
|
9487
9487
|
{
|
|
9488
9488
|
range: ">=1.0.0",
|
|
9489
9489
|
coverage: 0.8,
|
|
9490
|
-
note: "native-seam only: the real Palette class runs from the bundle against an RNPalette module backed by
|
|
9490
|
+
note: "native-seam only: the real Palette class runs from the bundle against an RNPalette module backed by Peach's shared browser image and canvas sampler",
|
|
9491
9491
|
working: "remote URL and browser-loadable URI inputs, named vibrant/muted swatch object, full swatch list, color/population/percentage result shape, and rejected image downloads",
|
|
9492
9492
|
missing: "the exact iOS median-cut Palette target scoring algorithm and native filesystem paths outside browser-loadable URLs"
|
|
9493
9493
|
}
|
|
@@ -9619,7 +9619,7 @@ var init_registry = __esm({
|
|
|
9619
9619
|
{
|
|
9620
9620
|
range: ">=8.0.0",
|
|
9621
9621
|
coverage: 0.6,
|
|
9622
|
-
note: "telemetry calls may remain unavailable by scoring policy, but the reference iOS simulator presents the messenger and help-center UI that
|
|
9622
|
+
note: "telemetry calls may remain unavailable by scoring policy, but the reference iOS simulator presents the messenger and help-center UI that Peach omits",
|
|
9623
9623
|
working: "full upstream JS surface (Intercom object + correct enums + IntercomEvents); initialize, login/logout/updateUser/setUserHash/setUserJwt, logEvent, present* (accepted), help-center collection/article/search (empty), getUnreadConversationCount (0), visibility/padding/theme/loglevel setters, push token, event-listener wiring",
|
|
9624
9624
|
missing: "no chat UI presentation, no help center fetches return real data, no push token delivery to Intercom servers"
|
|
9625
9625
|
}
|
|
@@ -9632,7 +9632,7 @@ var init_registry = __esm({
|
|
|
9632
9632
|
{
|
|
9633
9633
|
range: ">=10.0.0",
|
|
9634
9634
|
coverage: 0,
|
|
9635
|
-
note: "the reference iOS simulator presents Braze in-app messages and content cards.
|
|
9635
|
+
note: "the reference iOS simulator presents Braze in-app messages and content cards. Peach accepts the API calls but presents neither surface, so import safety receives no behavior credit",
|
|
9636
9636
|
working: "full upstream JS surface (Braze singleton + all setters/loggers, models, in-app-message UI, ContentCardTypes); changeUser/identity, custom events/purchases/attributes (locally accepted), content cards / banners / feature flags resolve empty, in-app-message + push permission APIs, getInitialURL/PushPayload, location + ad-tracking setters, listener registration",
|
|
9637
9637
|
missing: "no Braze backend \u2014 no event/session delivery, no remote content cards / banners / feature flags, no push token registration, no server-driven in-app messages; intentionally absent for the development simulator"
|
|
9638
9638
|
}
|
|
@@ -9707,7 +9707,7 @@ var init_registry = __esm({
|
|
|
9707
9707
|
{
|
|
9708
9708
|
range: ">=4.0.0",
|
|
9709
9709
|
coverage: 0,
|
|
9710
|
-
note: "the reference iOS simulator performs this package's behavior.
|
|
9710
|
+
note: "the reference iOS simulator performs this package's behavior. Peach currently provides only this unsupported shape: native-seam only: the real customerio-reactnative runs from the bundle (CustomerIO object, CioRegion/CioLogLevel/CioPushPermissionStatus enums, in-app/push/notification-inbox wrappers : all upstream JS, no fabricated values). we stub only the five codegen modules (NativeCustomerIO/Logging/Location/MessagingPush/MessagingInApp), mirroring src/specs/modules/*@6.x exactly: calls accepted, getMessages/token empty, push permission reports NOTDETERMINED (fresh-sim), event-emitter properties return removable no-op subscriptions. per docs/compat-scoring.md analytics rule, delivery is intentionally absent. imports and API shape receive no behavior credit",
|
|
9711
9711
|
working: "full upstream JS surface (CustomerIO object + correct enums + in-app/push/inbox wrappers); initialize/identify/track/screen, profile+device attributes, device-token register/delete, trackMetric, push receipt/permission APIs, in-app dismiss + inbox getMessages/mark/track, all three event-emitter subscriptions (no-op removable)",
|
|
9712
9712
|
missing: "no events sent, no profile sync, no in-app messages displayed, push token not registered"
|
|
9713
9713
|
}
|
|
@@ -9760,7 +9760,7 @@ var init_registry = __esm({
|
|
|
9760
9760
|
{
|
|
9761
9761
|
range: ">=1.0.0",
|
|
9762
9762
|
coverage: 0,
|
|
9763
|
-
note: "the reference iOS simulator performs this package's behavior.
|
|
9763
|
+
note: "the reference iOS simulator performs this package's behavior. Peach currently provides only this unsupported shape: native-seam only: the real @iterable/react-native-sdk runs from the bundle (the Iterable class, inbox/embedded/in-app managers, and the authoritative enums : all upstream JS, no fabricated enum values). we stub only the RNIterableAPI TurboModule, mirroring src/api/NativeRNIterableAPI.ts@2.x (Spec) exactly: init resolves true (SDK initialized but offline), every getter returns the inert no-data value, handleAppLink resolves false so app routing takes over. per docs/compat-scoring.md analytics rule, delivery is intentionally absent. imports and API shape receive no behavior credit",
|
|
9764
9764
|
working: "full upstream JS surface (Iterable class + inbox/embedded managers + correct enums); initialize, setEmail/UserId, in-app + inbox + embedded message getters (empty), track* events, commerce, updateUser/Email/subscriptions, attribution, session + embedded-impression tracking, auth token, listener registration",
|
|
9765
9765
|
missing: "no push registration with Iterable backend, no in-app/embedded message fetch, no email/userId persisted server-side \u2014 intentionally absent for the development simulator (no Iterable backend)"
|
|
9766
9766
|
}
|
|
@@ -9773,7 +9773,7 @@ var init_registry = __esm({
|
|
|
9773
9773
|
{
|
|
9774
9774
|
range: ">=14.0.0",
|
|
9775
9775
|
coverage: 0,
|
|
9776
|
-
note: "the reference iOS simulator renders Google test ads and presents consent flows. the
|
|
9776
|
+
note: "the reference iOS simulator renders Google test ads and presents consent flows. the Peach replacement only initializes to an empty adapter set and reports consent not required; it cannot create an ad through the current public factories. import safety and fabricated no-fill shapes receive no behavior credit",
|
|
9777
9777
|
working: "default initialize returns an empty adapter set; AdsConsent returns a non-requesting placeholder state; RewardedAdEventType, AdEventType, AdsConsentStatus, AdsConsentDebugGeography, BannerAdSize, MaxAdContentRating, and TestIds constants are present",
|
|
9778
9778
|
missing: "real ad delivery and consent UI; InterstitialAd / RewardedAd / RewardedInterstitialAd / AppOpenAd / GAM* createForAdRequest factories, BannerAd / GAMBannerAd, NativeAd / NativeAdView / NativeMediaView / NativeAsset, hooks, upstream validation, loaded state, and public event behavior"
|
|
9779
9779
|
}
|
|
@@ -9837,7 +9837,7 @@ var init_registry = __esm({
|
|
|
9837
9837
|
{
|
|
9838
9838
|
range: ">=8.0.0",
|
|
9839
9839
|
coverage: 0,
|
|
9840
|
-
note: "the reference iOS simulator renders configured RevenueCat paywalls.
|
|
9840
|
+
note: "the reference iOS simulator renders configured RevenueCat paywalls. Peach's replacement returns NOT_PRESENTED, rejects customer center, and substitutes async no-ops for view components. the current 10.7 package ships its own visibly labeled Preview API components, but replacing the package prevents that upstream path from running. none of these shapes receive behavior credit",
|
|
9841
9841
|
working: "RevenueCatUI singleton, presentPaywall (NOT_PRESENTED), presentPaywallIfNeeded (NOT_PRESENTED), presentCustomerCenter (rejects clearly), PAYWALL_RESULT enum (NOT_PRESENTED, ERROR, CANCELLED, PURCHASED, RESTORED)",
|
|
9842
9842
|
missing: "configured paywall and customer-center UI, Paywall / OriginalTemplatePaywallFooterContainerView / CustomerCenterView components, dismiss and purchase/restore callbacks, purchase logic, custom variables, management events, and the package-owned Preview API path"
|
|
9843
9843
|
}
|
|
@@ -9911,7 +9911,7 @@ var init_registry = __esm({
|
|
|
9911
9911
|
{
|
|
9912
9912
|
range: ">=4.0.0",
|
|
9913
9913
|
coverage: 0,
|
|
9914
|
-
note: "the reference iOS simulator performs this package's behavior.
|
|
9914
|
+
note: "the reference iOS simulator performs this package's behavior. Peach currently provides only this unsupported shape: setupPlayer/queue ops/playback controls accepted; getPlaybackState returns State.None; full Event / Capability / RepeatMode / RatingType / IOSCategory enum surface; useTrackPlayerEvents/useProgress/useActiveTrack/usePlaybackState/usePlayWhenReady/useIsPlaying hooks return idle defaults. imports and API shape receive no behavior credit",
|
|
9915
9915
|
missing: 'no MPMediaPlayer / ExoPlayer integration; no MediaSession / lock-screen controls (browsers have MediaSession but the API surface diverges). State machine stays in None so apps branch on "not playing"'
|
|
9916
9916
|
}
|
|
9917
9917
|
]
|
|
@@ -9948,7 +9948,7 @@ var init_registry = __esm({
|
|
|
9948
9948
|
{
|
|
9949
9949
|
range: ">=0.13.0",
|
|
9950
9950
|
coverage: 0,
|
|
9951
|
-
note: "the reference iOS simulator performs this package's behavior.
|
|
9951
|
+
note: "the reference iOS simulator performs this package's behavior. Peach currently provides only this unsupported shape: Zeroconf class with on/off/scan/stop/publishService/getServices accepts every call; no events ever fire so apps with discovery-required UI take their no-services branch. imports and API shape receive no behavior credit",
|
|
9952
9952
|
missing: "no mDNS / Bonjour discovery \u2014 browsers have no local network discovery API"
|
|
9953
9953
|
}
|
|
9954
9954
|
]
|
|
@@ -9960,7 +9960,7 @@ var init_registry = __esm({
|
|
|
9960
9960
|
{
|
|
9961
9961
|
range: ">=4.0.0",
|
|
9962
9962
|
coverage: 0,
|
|
9963
|
-
note: "the reference iOS simulator performs this package's behavior.
|
|
9963
|
+
note: "the reference iOS simulator performs this package's behavior. Peach currently provides only this unsupported shape: ready() resolves with enabled=false; configure/start/stop accepted; all on* listeners register but never fire; getProviderState reports gps:false; getCurrentPosition rejects so apps branch on geolocation-unavailable. imports and API shape receive no behavior credit",
|
|
9964
9964
|
missing: "no background process \u2014 browsers have no equivalent to the iOS background-fetch / Android foreground service that this SDK schedules. AuthorizationStatus exposed for type-checked code"
|
|
9965
9965
|
}
|
|
9966
9966
|
]
|
|
@@ -9984,7 +9984,7 @@ var init_registry = __esm({
|
|
|
9984
9984
|
{
|
|
9985
9985
|
range: ">=2.0.0",
|
|
9986
9986
|
coverage: 0,
|
|
9987
|
-
note: "the reference iOS simulator performs this package's behavior.
|
|
9987
|
+
note: "the reference iOS simulator performs this package's behavior. Peach currently provides only this unsupported shape: prevent/allow/preventForCapture/preventForScreenshot/preventForScreenRecord accepted; getPreventStatus reports allow/allow; useCaptureProtection hook returns idle status. apps with screenshot-blocking UI run unaffected. imports and API shape receive no behavior credit",
|
|
9988
9988
|
missing: "browsers have no screenshot / screen-recording prevention. CaptureProtectionStatus enum exposed"
|
|
9989
9989
|
}
|
|
9990
9990
|
]
|
|
@@ -10009,7 +10009,7 @@ var init_registry = __esm({
|
|
|
10009
10009
|
{
|
|
10010
10010
|
range: ">=5.0.0",
|
|
10011
10011
|
coverage: 0,
|
|
10012
|
-
note: "the reference iOS simulator performs this package's behavior.
|
|
10012
|
+
note: "the reference iOS simulator performs this package's behavior. Peach currently provides only this unsupported shape: Notifications.events() returns subscribers that never fire; registerRemoteNotifications accepts the call without registering; postLocalNotification returns 0; ios/android namespaces accept badge / channel / category ops; isRegisteredForRemoteNotifications=false. imports and API shape receive no behavior credit",
|
|
10013
10013
|
missing: "no APNs / FCM token registration; no native notification UI delivered. recommended swap: expo-notifications which sootsim renders through the shell-native UI provider"
|
|
10014
10014
|
}
|
|
10015
10015
|
]
|
|
@@ -10021,7 +10021,7 @@ var init_registry = __esm({
|
|
|
10021
10021
|
{
|
|
10022
10022
|
range: ">=0.27.0",
|
|
10023
10023
|
coverage: 0.75,
|
|
10024
|
-
note: "upstream WatermelonDB runs over a real asynchronous WMDatabaseBridge backed by
|
|
10024
|
+
note: "upstream WatermelonDB runs over a real asynchronous WMDatabaseBridge backed by Peach's persistent browser SQLite engine; apps requesting JSI use WatermelonDB's supported asynchronous fallback",
|
|
10025
10025
|
working: "database initialization, schema setup and migrations, find/query/queryIds/raw queries/count, transactional batch and batchJSON writes, reset/vacuum/multi-statement execution, record caching, and local storage",
|
|
10026
10026
|
missing: "synchronous nativeWatermelonCreateAdapter JSI dispatch, queryAsArray compression, unsafeLoadFromSync/provideSyncJson turbo sync, native exclusive locking, and unsafe native connection reuse"
|
|
10027
10027
|
}
|
|
@@ -10047,7 +10047,7 @@ var init_registry = __esm({
|
|
|
10047
10047
|
{
|
|
10048
10048
|
range: ">=2.0.0",
|
|
10049
10049
|
coverage: 0,
|
|
10050
|
-
note: "the reference iOS simulator performs this package's behavior.
|
|
10050
|
+
note: "the reference iOS simulator performs this package's behavior. Peach currently provides only this unsupported shape: registerGlobals is a noop; AudioSession namespace accepts startAudioSession/stopAudioSession/configureAudio/selectAudioOutput; setupURLPolyfill noop. recommended swap on web: livekit-client directly. imports and API shape receive no behavior credit",
|
|
10051
10051
|
missing: "no native LiveKit RTC bindings \u2014 browsers have WebRTC but lack LiveKit's background-audio + hardware-codec extensions. registerForPushNotifications rejects"
|
|
10052
10052
|
}
|
|
10053
10053
|
]
|
|
@@ -10107,7 +10107,7 @@ var init_registry = __esm({
|
|
|
10107
10107
|
{
|
|
10108
10108
|
range: ">=1.0.0",
|
|
10109
10109
|
coverage: 0.6,
|
|
10110
|
-
note: "the random-value and storage helpers use
|
|
10110
|
+
note: "the random-value and storage helpers use Peach primitives, but computeS3Etag and device identity return placeholders while the reference iOS simulator computes real results",
|
|
10111
10111
|
missing: "no real AWS SDK calls (Amplify's data-layer talks over fetch/WebSocket which is what runs anyway). flagged 0.5 because no app-side end-to-end coverage yet"
|
|
10112
10112
|
}
|
|
10113
10113
|
]
|
|
@@ -10119,7 +10119,7 @@ var init_registry = __esm({
|
|
|
10119
10119
|
{
|
|
10120
10120
|
range: ">=0.7.0",
|
|
10121
10121
|
coverage: 0.9,
|
|
10122
|
-
note: "native-seam only. Real react-native-quick-crypto JS runs from the bundle against either a
|
|
10122
|
+
note: "native-seam only. Real react-native-quick-crypto JS runs from the bundle against either a Peach-provided global.__QuickCryptoProxy or registered Nitro hybrid objects. The seam implements random, hash/HMAC, PBKDF2, AES-CBC/CTR/GCM, AES secret-key handles, and asynchronous RSA-OAEP WebCrypto key generation and encryption.",
|
|
10123
10123
|
working: "upstream package JS and export surface, global __QuickCryptoProxy and Nitro hybrid-object install before module evaluation, random/randomFill/getRandomValues via upstream JS, createHash/createHmac host objects, pbkdf2 callback/promise form and pbkdf2Sync, AES-CBC/GCM/CTR host ciphers, AES WebCrypto secret-key import/export and encrypt/decrypt, RSA-OAEP subtle.generateKey plus JWK export/import and encrypt/decrypt",
|
|
10124
10124
|
missing: "synchronous RSA key generation and publicEncrypt/publicDecrypt/privateDecrypt, createSign/createVerify, ECDH WebCrypto key paths, general asymmetric DER import, AES-KW, and legacy ciphers such as DES/RC4/ChaCha20."
|
|
10125
10125
|
}
|
|
@@ -10132,7 +10132,7 @@ var init_registry = __esm({
|
|
|
10132
10132
|
{
|
|
10133
10133
|
range: ">=0.3.0",
|
|
10134
10134
|
coverage: 0.55,
|
|
10135
|
-
note: "small compatibility surface backed by the react-native-quick-crypto native proxy for existing
|
|
10135
|
+
note: "small compatibility surface backed by the react-native-quick-crypto native proxy for existing Peach callers; this is not the quick-crypto package replacement and should be replaced by a native-seam-only Nitro Modules implementation when that package becomes a priority.",
|
|
10136
10136
|
working: "createHash plus subtle/webcrypto references for load-safe consumers",
|
|
10137
10137
|
missing: "full upstream react-native-nitro-crypto package JS/native contract is not modeled yet"
|
|
10138
10138
|
}
|
|
@@ -10195,7 +10195,7 @@ var init_registry = __esm({
|
|
|
10195
10195
|
{
|
|
10196
10196
|
range: ">=2.0.0",
|
|
10197
10197
|
coverage: 0,
|
|
10198
|
-
note: "the reference iOS simulator performs this package's behavior.
|
|
10198
|
+
note: "the reference iOS simulator performs this package's behavior. Peach currently provides only this unsupported shape: UnistylesRuntime exposes plausible iOS portrait defaults (insets matching iPhone safe-area, screen 393x852, fontScale 1, pixelRatio 3); StyleSheet/mq/withUnistyles passthrough; useUnistyles returns a {rt, theme} shape. imports and API shape receive no behavior credit",
|
|
10199
10199
|
missing: "no breakpoint-driven rebuilds (browsers can do this via CSS but the unistyles state machine needs JSI hooks). theme switching via setTheme is a noop"
|
|
10200
10200
|
}
|
|
10201
10201
|
]
|
|
@@ -10207,7 +10207,7 @@ var init_registry = __esm({
|
|
|
10207
10207
|
{
|
|
10208
10208
|
range: ">=8.0.0",
|
|
10209
10209
|
coverage: 0,
|
|
10210
|
-
note: "the reference iOS simulator performs this package's behavior.
|
|
10210
|
+
note: "the reference iOS simulator performs this package's behavior. Peach currently provides only this unsupported shape: Rive component renders null (no native renderer in browser); Fit/Alignment/Direction/LoopMode/RiveRenderer enums exposed for type-checked code. imports and API shape receive no behavior credit",
|
|
10211
10211
|
missing: "no Rive .riv runtime \u2014 would need shipping the Rive WASM and wiring a canvas (deferred). apps that use Rive for branding/loading animations run cleanly without the visual"
|
|
10212
10212
|
}
|
|
10213
10213
|
]
|
|
@@ -10231,7 +10231,7 @@ var init_registry = __esm({
|
|
|
10231
10231
|
{
|
|
10232
10232
|
range: ">=0.5.0",
|
|
10233
10233
|
coverage: 0.92,
|
|
10234
|
-
note: "native-seam only - upstream Galeria root / Galeria.Image / context run from the bundle; the Expo Galeria view manager opens
|
|
10234
|
+
note: "native-seam only - upstream Galeria root / Galeria.Image / context run from the bundle; the Expo Galeria view manager opens Peach's shared image viewer with thumbnail transition, Galeria-specific chrome, swipe, pinch, rotation, double-tap zoom, and dismiss",
|
|
10235
10235
|
working: "Galeria root, Galeria.Image, grouped urls, Image.resolveAssetSource mapping, tap-to-open from thumbnail, grouped thumbnail registry for close transitions, fullscreen viewer, adjacent-image swipe, pinch/rotate/double-tap zoom, vertical dismiss, close control, right nav action callback, page indicators, hidePageIndicators, hideBlurOverlay, light/dark theme, onIndexChange, onDismiss, onLongPress",
|
|
10236
10236
|
missing: "SF Symbol names render as textual controls instead of exact symbol glyphs; no native blur effect when blur overlay is shown; natural image dimensions are async and fall back to screen aspect until measured"
|
|
10237
10237
|
}
|
|
@@ -10269,7 +10269,7 @@ var init_registry = __esm({
|
|
|
10269
10269
|
{
|
|
10270
10270
|
range: ">=2.0.0",
|
|
10271
10271
|
coverage: 0,
|
|
10272
|
-
note: "the reference iOS simulator performs this package's behavior.
|
|
10272
|
+
note: "the reference iOS simulator performs this package's behavior. Peach currently provides only this unsupported shape: TrueSheet component passes children through; present/dismiss/resize/scrollToTop ref methods accepted as noops. imports and API shape receive no behavior credit",
|
|
10273
10273
|
missing: "no native bottom-sheet UI. recommended swap on web: a regular sootsim modal \u2014 sootsim already simulates iOS sheet semantics natively"
|
|
10274
10274
|
}
|
|
10275
10275
|
]
|
|
@@ -10329,7 +10329,7 @@ var init_registry = __esm({
|
|
|
10329
10329
|
{
|
|
10330
10330
|
range: ">=1.0.0",
|
|
10331
10331
|
coverage: 0,
|
|
10332
|
-
note: "the reference iOS simulator performs this package's behavior.
|
|
10332
|
+
note: "the reference iOS simulator performs this package's behavior. Peach currently provides only this unsupported shape: ContextMenuView passes children through; long-press shows nothing instead of a native UIContextMenu. apps still render their primary content correctly. imports and API shape receive no behavior credit",
|
|
10333
10333
|
missing: "no native context menu \u2014 recommended swap on web: a tap-on-icon menu via Pressable + Modal"
|
|
10334
10334
|
}
|
|
10335
10335
|
]
|
|
@@ -10354,7 +10354,7 @@ var init_registry = __esm({
|
|
|
10354
10354
|
{
|
|
10355
10355
|
range: ">=14.0.0",
|
|
10356
10356
|
coverage: 0,
|
|
10357
|
-
note: "the reference iOS simulator performs this package's behavior.
|
|
10357
|
+
note: "the reference iOS simulator performs this package's behavior. Peach currently provides only this unsupported shape: Camera component renders null; CameraType / FlashMode / FocusMode / ZoomMode / ResizeMode / ScanBarcodeAlgorithm constants exposed; capture rejects; permission helpers return denied. imports and API shape receive no behavior credit",
|
|
10358
10358
|
missing: "no native camera \u2014 recommended swap on web: expo-camera which uses getUserMedia. type-checked imports compile against this stub"
|
|
10359
10359
|
}
|
|
10360
10360
|
]
|
|
@@ -10366,7 +10366,7 @@ var init_registry = __esm({
|
|
|
10366
10366
|
{
|
|
10367
10367
|
range: ">=4.0.0",
|
|
10368
10368
|
coverage: 0,
|
|
10369
|
-
note: "the reference iOS simulator creates Agora RTC engines and joins calls.
|
|
10369
|
+
note: "the reference iOS simulator creates Agora RTC engines and joins calls. Peach throws when either engine constructor is called, so error shape receives no behavior credit",
|
|
10370
10370
|
missing: "no Agora SDK on web here \u2014 recommended swap: use the Agora Web SDK directly through a host iframe"
|
|
10371
10371
|
}
|
|
10372
10372
|
]
|
|
@@ -10378,7 +10378,7 @@ var init_registry = __esm({
|
|
|
10378
10378
|
{
|
|
10379
10379
|
range: ">=0.1.0",
|
|
10380
10380
|
coverage: 0.58,
|
|
10381
|
-
note: "native-seam only \u2014 the published AppleMaps and GoogleMaps namespaces, enums, permission hook, event unwrapping, and view wrappers run unchanged over
|
|
10381
|
+
note: "native-seam only \u2014 the published AppleMaps and GoogleMaps namespaces, enums, permission hook, event unwrapping, and view wrappers run unchanged over Peach's shared MapLibre-backed map owner",
|
|
10382
10382
|
working: "AppleMaps.View and GoogleMaps.View live map rendering, initial and imperative camera positions, pan/pinch/rotate/tilt gesture settings, default markers, camera-move events, map-loaded callback, marker camera selection, location permission checks and requests",
|
|
10383
10383
|
missing: "map/marker/shape click callbacks, polylines, polygons, circles, annotations, custom marker icons, Google Street View, Apple Look Around, traffic/building/indoor layers, platform-specific map styling and POI filtering"
|
|
10384
10384
|
}
|
|
@@ -10419,7 +10419,7 @@ var init_registry = __esm({
|
|
|
10419
10419
|
{
|
|
10420
10420
|
range: ">=1.0.0",
|
|
10421
10421
|
coverage: 0,
|
|
10422
|
-
note: "the reference iOS simulator performs this package's behavior.
|
|
10422
|
+
note: "the reference iOS simulator performs this package's behavior. Peach currently provides only this unsupported shape: EnrichedTextEditor / EnrichedTextInputView / EnrichedTextRenderer pass children through. imports and API shape receive no behavior credit",
|
|
10423
10423
|
missing: "no native rich-text editing \u2014 use contenteditable or a lib like @10play/tentap-editor for web"
|
|
10424
10424
|
}
|
|
10425
10425
|
]
|
|
@@ -10456,7 +10456,7 @@ var init_registry = __esm({
|
|
|
10456
10456
|
{
|
|
10457
10457
|
range: ">=0.1.0",
|
|
10458
10458
|
coverage: 0,
|
|
10459
|
-
note: "the reference iOS simulator performs this package's behavior.
|
|
10459
|
+
note: "the reference iOS simulator performs this package's behavior. Peach currently provides only this unsupported shape: EmojiPopup component passes children through; OS emoji input is the right path on web. imports and API shape receive no behavior credit",
|
|
10460
10460
|
missing: "no native emoji picker UI in browser preview"
|
|
10461
10461
|
}
|
|
10462
10462
|
]
|
|
@@ -10491,7 +10491,7 @@ var init_registry = __esm({
|
|
|
10491
10491
|
{
|
|
10492
10492
|
range: ">=2.0.0",
|
|
10493
10493
|
coverage: 0,
|
|
10494
|
-
note: "the reference iOS simulator performs this package's behavior.
|
|
10494
|
+
note: "the reference iOS simulator performs this package's behavior. Peach currently provides only this unsupported shape: full singleton + push permission + inbox API accepted; no telemetry delivered. imports and API shape receive no behavior credit",
|
|
10495
10495
|
missing: "no real analytics / in-app messaging / push delivery"
|
|
10496
10496
|
}
|
|
10497
10497
|
]
|
|
@@ -10503,7 +10503,7 @@ var init_registry = __esm({
|
|
|
10503
10503
|
{
|
|
10504
10504
|
range: ">=1.0.0",
|
|
10505
10505
|
coverage: 0,
|
|
10506
|
-
note: "the reference iOS simulator renders the LiquidGlassView effect.
|
|
10506
|
+
note: "the reference iOS simulator renders the LiquidGlassView effect. Peach passes children through without connecting the view to its blur primitives, so import safety receives no behavior credit",
|
|
10507
10507
|
missing: "no native iOS visual effect; consumers can substitute expo-blur which we already polyfill"
|
|
10508
10508
|
}
|
|
10509
10509
|
]
|
|
@@ -10515,7 +10515,7 @@ var init_registry = __esm({
|
|
|
10515
10515
|
{
|
|
10516
10516
|
range: ">=5.0.0",
|
|
10517
10517
|
coverage: 0,
|
|
10518
|
-
note: "the reference iOS simulator Shake Gesture triggers the package event.
|
|
10518
|
+
note: "the reference iOS simulator Shake Gesture triggers the package event. Peach registers subscribers that never fire, so import safety receives no behavior credit",
|
|
10519
10519
|
missing: "real device motion \u2014 same constraint as the iOS simulator. recommended on web: DeviceMotion API with user permission gesture"
|
|
10520
10520
|
}
|
|
10521
10521
|
]
|
|
@@ -10527,7 +10527,7 @@ var init_registry = __esm({
|
|
|
10527
10527
|
{
|
|
10528
10528
|
range: ">=1.0.0",
|
|
10529
10529
|
coverage: 0,
|
|
10530
|
-
note: "the reference iOS simulator performs this package's behavior.
|
|
10530
|
+
note: "the reference iOS simulator performs this package's behavior. Peach currently provides only this unsupported shape: initialize=false / isInitialized=false. imports and API shape receive no behavior credit",
|
|
10531
10531
|
missing: "browsers cannot intercept TLS; SSL pinning is a native-only concern"
|
|
10532
10532
|
}
|
|
10533
10533
|
]
|
|
@@ -10563,7 +10563,7 @@ var init_registry = __esm({
|
|
|
10563
10563
|
{
|
|
10564
10564
|
range: ">=2.0.0",
|
|
10565
10565
|
coverage: 0,
|
|
10566
|
-
note: "the reference iOS simulator performs this package's behavior.
|
|
10566
|
+
note: "the reference iOS simulator performs this package's behavior. Peach currently provides only this unsupported shape: getVolume returns 0.5; setVolume / showNativeVolumeUI accepted; isInSilentMode=false; listeners never fire. imports and API shape receive no behavior credit",
|
|
10567
10567
|
missing: "browsers cannot modify system volume; only the per-element <audio> volume is mutable from JS"
|
|
10568
10568
|
}
|
|
10569
10569
|
]
|
|
@@ -10575,7 +10575,7 @@ var init_registry = __esm({
|
|
|
10575
10575
|
{
|
|
10576
10576
|
range: ">=7.0.0",
|
|
10577
10577
|
coverage: 0.65,
|
|
10578
|
-
note: "native-seam only - upstream Commands, NavigationDelegate, ComponentRegistry, option processing, and enums run unchanged; RNNBridgeModule mounts registered screens into a
|
|
10578
|
+
note: "native-seam only - upstream Commands, NavigationDelegate, ComponentRegistry, option processing, and enums run unchanged; RNNBridgeModule mounts registered screens into a Peach host and RNNEventEmitter delivers launch, lifecycle, and command events",
|
|
10579
10579
|
working: "app launch, setRoot, push, setStackRoot, showModal, registered screen rendering with passProps/componentId, component lifecycle and command completion events, constants, and modal host rendering",
|
|
10580
10580
|
missing: "no retained native stack or simultaneous modal/overlay tree: pop and dismiss emit contract events but do not restore an earlier screen; bottom tabs, side menus, and split views currently render their first component leaf; native navigation chrome/options are not painted"
|
|
10581
10581
|
}
|
|
@@ -10612,7 +10612,7 @@ var init_registry = __esm({
|
|
|
10612
10612
|
{
|
|
10613
10613
|
range: ">=4.0.0",
|
|
10614
10614
|
coverage: 0,
|
|
10615
|
-
note: "the reference iOS simulator performs this package's behavior.
|
|
10615
|
+
note: "the reference iOS simulator performs this package's behavior. Peach currently provides only this unsupported shape: GiphySDK.configure noop; GiphyDialog.show/hide accept; GiphyContent.searchQuery / trending construct config objects; full Direction / MediaType / Rating / Theme / ContentType / ImageType enum surface. imports and API shape receive no behavior credit",
|
|
10616
10616
|
missing: "no native picker UI; no real GIF delivery. recommended swap: @giphy/js-sdk + custom React UI on web"
|
|
10617
10617
|
}
|
|
10618
10618
|
]
|
|
@@ -10685,7 +10685,7 @@ var init_registry = __esm({
|
|
|
10685
10685
|
{
|
|
10686
10686
|
range: ">=21.0.0",
|
|
10687
10687
|
coverage: 0,
|
|
10688
|
-
note: "the reference iOS simulator performs this package's behavior.
|
|
10688
|
+
note: "the reference iOS simulator performs this package's behavior. Peach currently provides only this unsupported shape: isMessagesDisplaySuppressed=false / setMessagesDisplaySuppressed accepted; isAutomaticDataCollectionEnabled=true; triggerEvent accepted but no IAM displayed. imports and API shape receive no behavior credit",
|
|
10689
10689
|
missing: "no native IAM UI in browser preview"
|
|
10690
10690
|
}
|
|
10691
10691
|
]
|
|
@@ -10757,7 +10757,7 @@ var init_registry = __esm({
|
|
|
10757
10757
|
{
|
|
10758
10758
|
range: ">=4.0.0",
|
|
10759
10759
|
coverage: 0.5,
|
|
10760
|
-
note: "
|
|
10760
|
+
note: "Peach has keyboard avoidance, but this package's view and configuration calls do not drive it while they alter layout in the reference iOS simulator",
|
|
10761
10761
|
missing: "no programmatic keyboard offset \u2014 sootsim KeyboardAvoidingView is the right primary path"
|
|
10762
10762
|
}
|
|
10763
10763
|
]
|
|
@@ -10769,7 +10769,7 @@ var init_registry = __esm({
|
|
|
10769
10769
|
{
|
|
10770
10770
|
range: ">=2.0.0",
|
|
10771
10771
|
coverage: 0,
|
|
10772
|
-
note: "the reference iOS simulator performs this package's behavior.
|
|
10772
|
+
note: "the reference iOS simulator performs this package's behavior. Peach currently provides only this unsupported shape: requestPermissions / checkPermissions return denied; findCalendars / fetchAllEvents return []; saveEvent rejects. imports and API shape receive no behavior credit",
|
|
10773
10773
|
missing: "no EventKit / CalendarContract in browser preview"
|
|
10774
10774
|
}
|
|
10775
10775
|
]
|
|
@@ -10793,7 +10793,7 @@ var init_registry = __esm({
|
|
|
10793
10793
|
{
|
|
10794
10794
|
range: ">=10.0.0",
|
|
10795
10795
|
coverage: 0,
|
|
10796
|
-
note: "the reference iOS simulator performs this package's behavior.
|
|
10796
|
+
note: "the reference iOS simulator performs this package's behavior. Peach currently provides only this unsupported shape: DocumentViewerView renders null; isDocumentViewerAvailable=false. imports and API shape receive no behavior credit",
|
|
10797
10797
|
missing: "no QLPreviewController / ACTION_VIEW; recommended swap: an iframe with a PDF.js or similar JS viewer"
|
|
10798
10798
|
}
|
|
10799
10799
|
]
|
|
@@ -10817,7 +10817,7 @@ var init_registry = __esm({
|
|
|
10817
10817
|
{
|
|
10818
10818
|
range: ">=2.0.0",
|
|
10819
10819
|
coverage: 0,
|
|
10820
|
-
note: "the reference iOS simulator runs Clerk authentication and session flows.
|
|
10820
|
+
note: "the reference iOS simulator runs Clerk authentication and session flows. Peach always reports an unauthenticated state and passes every gate component through, so import safety receives no behavior credit",
|
|
10821
10821
|
missing: "no real Clerk auth \u2014 recommended swap: @clerk/clerk-react on web"
|
|
10822
10822
|
}
|
|
10823
10823
|
]
|
|
@@ -10842,7 +10842,7 @@ var init_registry = __esm({
|
|
|
10842
10842
|
{
|
|
10843
10843
|
range: ">=2.0.0",
|
|
10844
10844
|
coverage: 0,
|
|
10845
|
-
note: "the reference iOS simulator renders PDF pages.
|
|
10845
|
+
note: "the reference iOS simulator renders PDF pages. Peach renders null, so import safety receives no behavior credit",
|
|
10846
10846
|
missing: "no native PDF rendering; recommended swap: PDF.js iframe"
|
|
10847
10847
|
}
|
|
10848
10848
|
]
|
|
@@ -10904,7 +10904,7 @@ var init_registry = __esm({
|
|
|
10904
10904
|
{
|
|
10905
10905
|
range: ">=2.0.0",
|
|
10906
10906
|
coverage: 0,
|
|
10907
|
-
note: "the reference iOS simulator presents Survicate surveys when an event qualifies.
|
|
10907
|
+
note: "the reference iOS simulator presents Survicate surveys when an event qualifies. Peach accepts events but presents no survey and fires no listener, so import safety receives no behavior credit",
|
|
10908
10908
|
missing: "no real survey delivery \u2014 same constraint as every analytics SDK in browser preview"
|
|
10909
10909
|
}
|
|
10910
10910
|
]
|
|
@@ -10977,7 +10977,7 @@ var init_registry = __esm({
|
|
|
10977
10977
|
{
|
|
10978
10978
|
range: ">=6.0.0",
|
|
10979
10979
|
coverage: 0,
|
|
10980
|
-
note: "the reference iOS simulator performs this package's behavior.
|
|
10980
|
+
note: "the reference iOS simulator performs this package's behavior. Peach currently provides only this unsupported shape: IQKeyboardManager-style helper. sootsim handles keyboard avoidance via its own pipeline. imports and API shape receive no behavior credit",
|
|
10981
10981
|
missing: "iOS-only library; setEnable/setEnableAutoToolbar/etc accepted but inert"
|
|
10982
10982
|
}
|
|
10983
10983
|
]
|
|
@@ -10989,7 +10989,7 @@ var init_registry = __esm({
|
|
|
10989
10989
|
{
|
|
10990
10990
|
range: ">=4.0.0",
|
|
10991
10991
|
coverage: 0,
|
|
10992
|
-
note: "the reference iOS simulator performs this package's behavior.
|
|
10992
|
+
note: "the reference iOS simulator performs this package's behavior. Peach currently provides only this unsupported shape: getCastState reports NoDevicesAvailable; CastButton renders null; useCastSession=null; useDevices=[]; useCastState=NoDevicesAvailable. imports and API shape receive no behavior credit",
|
|
10993
10993
|
missing: "no Chromecast device discovery / cast"
|
|
10994
10994
|
}
|
|
10995
10995
|
]
|
|
@@ -11074,7 +11074,7 @@ var init_registry = __esm({
|
|
|
11074
11074
|
{
|
|
11075
11075
|
range: ">=0.10.0",
|
|
11076
11076
|
coverage: 0,
|
|
11077
|
-
note: "the reference iOS simulator performs this package's behavior.
|
|
11077
|
+
note: "the reference iOS simulator performs this package's behavior. Peach currently provides only this unsupported shape: print() accepted. imports and API shape receive no behavior credit",
|
|
11078
11078
|
missing: "browsers have window.print() but the API surface differs"
|
|
11079
11079
|
}
|
|
11080
11080
|
]
|
|
@@ -11086,7 +11086,7 @@ var init_registry = __esm({
|
|
|
11086
11086
|
{
|
|
11087
11087
|
range: ">=0.10.0",
|
|
11088
11088
|
coverage: 0,
|
|
11089
|
-
note: "the reference iOS simulator performs this package's behavior.
|
|
11089
|
+
note: "the reference iOS simulator performs this package's behavior. Peach currently provides only this unsupported shape: runUpdateProcess accepted; useHotUpdater reports idle. imports and API shape receive no behavior credit",
|
|
11090
11090
|
missing: "no OTA update mechanism in browser preview"
|
|
11091
11091
|
}
|
|
11092
11092
|
]
|
|
@@ -11122,7 +11122,7 @@ var init_registry = __esm({
|
|
|
11122
11122
|
{
|
|
11123
11123
|
range: ">=4.0.0",
|
|
11124
11124
|
coverage: 0,
|
|
11125
|
-
note: "the reference iOS simulator performs this package's behavior.
|
|
11125
|
+
note: "the reference iOS simulator performs this package's behavior. Peach currently provides only this unsupported shape: start/stop accepted; isRunning=false. imports and API shape receive no behavior credit",
|
|
11126
11126
|
missing: "no foreground service / background task"
|
|
11127
11127
|
}
|
|
11128
11128
|
]
|
|
@@ -11134,7 +11134,7 @@ var init_registry = __esm({
|
|
|
11134
11134
|
{
|
|
11135
11135
|
range: ">=0.0.1",
|
|
11136
11136
|
coverage: 0,
|
|
11137
|
-
note: "the reference iOS simulator performs this package's behavior.
|
|
11137
|
+
note: "the reference iOS simulator performs this package's behavior. Peach currently provides only this unsupported shape: addListener returns removable subscription that never fires. imports and API shape receive no behavior credit",
|
|
11138
11138
|
missing: "browsers cannot detect screenshots"
|
|
11139
11139
|
}
|
|
11140
11140
|
]
|
|
@@ -11181,7 +11181,7 @@ var init_registry = __esm({
|
|
|
11181
11181
|
{
|
|
11182
11182
|
range: ">=2.0.0",
|
|
11183
11183
|
coverage: 0,
|
|
11184
|
-
note: "the reference iOS simulator performs this package's behavior.
|
|
11184
|
+
note: "the reference iOS simulator performs this package's behavior. Peach currently provides only this unsupported shape: show/dismiss accepted; LENGTH_LONG/SHORT/INDEFINITE constants exposed. imports and API shape receive no behavior credit",
|
|
11185
11185
|
missing: "no Material Snackbar UI on iOS / web; recommended swap: sootsim Toast (already polyfilled)"
|
|
11186
11186
|
}
|
|
11187
11187
|
]
|
|
@@ -11205,7 +11205,7 @@ var init_registry = __esm({
|
|
|
11205
11205
|
{
|
|
11206
11206
|
range: ">=1.7.0",
|
|
11207
11207
|
coverage: 0,
|
|
11208
|
-
note: "the reference iOS simulator performs this package's behavior.
|
|
11208
|
+
note: "the reference iOS simulator performs this package's behavior. Peach currently provides only this unsupported shape: getVolume=0.5; getBrightness=0.5; isWifiEnabled=false; isLocationEnabled=false; isBluetoothEnabled=false; isAirplaneEnabled=false; all listeners never fire. imports and API shape receive no behavior credit",
|
|
11209
11209
|
missing: "browsers cannot read / set system-level settings"
|
|
11210
11210
|
}
|
|
11211
11211
|
]
|
|
@@ -11217,7 +11217,7 @@ var init_registry = __esm({
|
|
|
11217
11217
|
{
|
|
11218
11218
|
range: ">=5.0.0",
|
|
11219
11219
|
coverage: 0,
|
|
11220
|
-
note: "the reference iOS simulator performs this package's behavior.
|
|
11220
|
+
note: "the reference iOS simulator performs this package's behavior. Peach currently provides only this unsupported shape: getSSID/getBSSID/getBroadcast/getIPAddress all return null. imports and API shape receive no behavior credit",
|
|
11221
11221
|
missing: "browsers cannot read Wi-Fi info or LAN IP"
|
|
11222
11222
|
}
|
|
11223
11223
|
]
|
|
@@ -11278,7 +11278,7 @@ var init_registry = __esm({
|
|
|
11278
11278
|
{
|
|
11279
11279
|
range: ">=10.0.0",
|
|
11280
11280
|
coverage: 0,
|
|
11281
|
-
note: "the reference iOS simulator performs this package's behavior.
|
|
11281
|
+
note: "the reference iOS simulator performs this package's behavior. Peach currently provides only this unsupported shape: full singleton accepted; no telemetry / nudge UI delivered. imports and API shape receive no behavior credit",
|
|
11282
11282
|
missing: "no real MoEngage SDK; recommended swap: @moengage/web-sdk on web"
|
|
11283
11283
|
}
|
|
11284
11284
|
]
|
|
@@ -11290,7 +11290,7 @@ var init_registry = __esm({
|
|
|
11290
11290
|
{
|
|
11291
11291
|
range: ">=0.5.0",
|
|
11292
11292
|
coverage: 0,
|
|
11293
|
-
note: "the reference iOS simulator performs this package's behavior.
|
|
11293
|
+
note: "the reference iOS simulator performs this package's behavior. Peach currently provides only this unsupported shape: Nitro.startRecorder/startPlayer accepted; addRecordBack/PlayBackListener return removable subscriptions. imports and API shape receive no behavior credit",
|
|
11294
11294
|
missing: "no native record/play audio engine; consumers can use Web Audio + getUserMedia directly"
|
|
11295
11295
|
}
|
|
11296
11296
|
]
|
|
@@ -11363,7 +11363,7 @@ var init_registry = __esm({
|
|
|
11363
11363
|
{
|
|
11364
11364
|
range: ">=2.0.0",
|
|
11365
11365
|
coverage: 0,
|
|
11366
|
-
note: "the reference iOS simulator performs this package's behavior.
|
|
11366
|
+
note: "the reference iOS simulator performs this package's behavior. Peach currently provides only this unsupported shape: Blurhash component renders null. imports and API shape receive no behavior credit",
|
|
11367
11367
|
missing: "no blurhash decoding; recommended swap: a JS implementation like blurhash npm package"
|
|
11368
11368
|
}
|
|
11369
11369
|
]
|
|
@@ -11375,7 +11375,7 @@ var init_registry = __esm({
|
|
|
11375
11375
|
{
|
|
11376
11376
|
range: ">=1.0.0",
|
|
11377
11377
|
coverage: 0,
|
|
11378
|
-
note: "the reference iOS simulator performs this package's behavior.
|
|
11378
|
+
note: "the reference iOS simulator performs this package's behavior. Peach currently provides only this unsupported shape: setAlternateAppIcon accepted; getAlternateAppIcon=null; isAlternateAppIconSupported=false. imports and API shape receive no behavior credit",
|
|
11379
11379
|
missing: "no UIApplication.setAlternateIconName equivalent in browser"
|
|
11380
11380
|
}
|
|
11381
11381
|
]
|
|
@@ -11400,7 +11400,7 @@ var init_registry = __esm({
|
|
|
11400
11400
|
{
|
|
11401
11401
|
range: ">=1.0.0",
|
|
11402
11402
|
coverage: 0,
|
|
11403
|
-
note: "the reference iOS simulator performs this package's behavior.
|
|
11403
|
+
note: "the reference iOS simulator performs this package's behavior. Peach currently provides only this unsupported shape: selectContact / selectContactPhone / openContact resolve null. imports and API shape receive no behavior credit",
|
|
11404
11404
|
missing: "no system contact picker on web"
|
|
11405
11405
|
}
|
|
11406
11406
|
]
|
|
@@ -11424,7 +11424,7 @@ var init_registry = __esm({
|
|
|
11424
11424
|
{
|
|
11425
11425
|
range: ">=1.0.0",
|
|
11426
11426
|
coverage: 0,
|
|
11427
|
-
note: "the reference iOS simulator performs this package's behavior.
|
|
11427
|
+
note: "the reference iOS simulator performs this package's behavior. Peach currently provides only this unsupported shape: setItem accepted; getItem=null; isAppGroupShared=false. imports and API shape receive no behavior credit",
|
|
11428
11428
|
missing: "no App Group container outside of iOS"
|
|
11429
11429
|
}
|
|
11430
11430
|
]
|
|
@@ -11449,7 +11449,7 @@ var init_registry = __esm({
|
|
|
11449
11449
|
{
|
|
11450
11450
|
range: ">=1.0.0",
|
|
11451
11451
|
coverage: 0,
|
|
11452
|
-
note: "the reference iOS simulator performs this package's behavior.
|
|
11452
|
+
note: "the reference iOS simulator performs this package's behavior. Peach currently provides only this unsupported shape: Superwall.configure/identify/registerEvent/registerPlacement/preloadAllPaywalls accepted; getPresentationResult=paywallNotPresented; presentPaywallForEvent=noPaywallToPresent. imports and API shape receive no behavior credit",
|
|
11453
11453
|
missing: "no real Superwall paywall delivery \u2014 Superwall has a Web SDK that consumers should use directly on web"
|
|
11454
11454
|
}
|
|
11455
11455
|
]
|
|
@@ -11461,7 +11461,7 @@ var init_registry = __esm({
|
|
|
11461
11461
|
{
|
|
11462
11462
|
range: ">=1.0.0",
|
|
11463
11463
|
coverage: 0,
|
|
11464
|
-
note: "the reference iOS simulator performs this package's behavior.
|
|
11464
|
+
note: "the reference iOS simulator performs this package's behavior. Peach currently provides only this unsupported shape: set/setFromResponse accepted; get/getFromResponse return empty; clearAll/clearByName/flush accepted. imports and API shape receive no behavior credit",
|
|
11465
11465
|
missing: "no native cookie store; on web document.cookie is the right API but cross-origin reads are blocked"
|
|
11466
11466
|
}
|
|
11467
11467
|
]
|
|
@@ -11521,7 +11521,7 @@ var init_registry = __esm({
|
|
|
11521
11521
|
{
|
|
11522
11522
|
range: ">=0.5.0",
|
|
11523
11523
|
coverage: 0,
|
|
11524
|
-
note: "the reference iOS simulator initializes local llama models and generates output.
|
|
11524
|
+
note: "the reference iOS simulator initializes local llama models and generates output. Peach rejects initialization and returns an empty grammar, so error shape receives no behavior credit",
|
|
11525
11525
|
missing: "no llama.cpp runtime in browser; recommended swap: web-llm or remote inference endpoint"
|
|
11526
11526
|
}
|
|
11527
11527
|
]
|
|
@@ -11714,7 +11714,7 @@ var init_registry = __esm({
|
|
|
11714
11714
|
{
|
|
11715
11715
|
range: ">=1.0.0",
|
|
11716
11716
|
coverage: 0,
|
|
11717
|
-
note: "the reference iOS simulator performs this package's behavior.
|
|
11717
|
+
note: "the reference iOS simulator performs this package's behavior. Peach currently provides only this unsupported shape: debug/info/warn/error accepted; getLogFilePaths=[]; full LogLevel enum exposed. imports and API shape receive no behavior credit",
|
|
11718
11718
|
missing: "no file system writes \u2014 browsers route logs to console.* instead"
|
|
11719
11719
|
}
|
|
11720
11720
|
]
|
|
@@ -11750,7 +11750,7 @@ var init_registry = __esm({
|
|
|
11750
11750
|
{
|
|
11751
11751
|
range: ">=4.0.0",
|
|
11752
11752
|
coverage: 0,
|
|
11753
|
-
note: "the reference iOS simulator performs this package's behavior.
|
|
11753
|
+
note: "the reference iOS simulator performs this package's behavior. Peach currently provides only this unsupported shape: returns empty codeVerifier/codeChallenge. imports and API shape receive no behavior credit",
|
|
11754
11754
|
missing: "consumers should use a proper PKCE library like @noble/hashes on web"
|
|
11755
11755
|
}
|
|
11756
11756
|
]
|
|
@@ -11775,7 +11775,7 @@ var init_registry = __esm({
|
|
|
11775
11775
|
{
|
|
11776
11776
|
range: ">=2.0.0",
|
|
11777
11777
|
coverage: 0,
|
|
11778
|
-
note: "the reference iOS simulator performs this package's behavior.
|
|
11778
|
+
note: "the reference iOS simulator performs this package's behavior. Peach currently provides only this unsupported shape: BarcodeCreatorView renders null; full Type enum exposed. imports and API shape receive no behavior credit",
|
|
11779
11779
|
missing: "no native barcode generation; recommended swap: bwip-js"
|
|
11780
11780
|
}
|
|
11781
11781
|
]
|
|
@@ -11787,7 +11787,7 @@ var init_registry = __esm({
|
|
|
11787
11787
|
{
|
|
11788
11788
|
range: ">=1.0.0",
|
|
11789
11789
|
coverage: 0,
|
|
11790
|
-
note: "the reference iOS simulator performs this package's behavior.
|
|
11790
|
+
note: "the reference iOS simulator performs this package's behavior. Peach currently provides only this unsupported shape: getCurrentConfigurations={}; reload* accepted. imports and API shape receive no behavior credit",
|
|
11791
11791
|
missing: "no WidgetKit on iOS / web"
|
|
11792
11792
|
}
|
|
11793
11793
|
]
|
|
@@ -11799,7 +11799,7 @@ var init_registry = __esm({
|
|
|
11799
11799
|
{
|
|
11800
11800
|
range: ">=8.0.0",
|
|
11801
11801
|
coverage: 0,
|
|
11802
|
-
note: "the reference iOS simulator performs this package's behavior.
|
|
11802
|
+
note: "the reference iOS simulator performs this package's behavior. Peach currently provides only this unsupported shape: THEOplayerView renders null; PlayerEventType enum exposed. imports and API shape receive no behavior credit",
|
|
11803
11803
|
missing: "no THEOplayer player on web \u2014 consumers should use theoplayer Web SDK"
|
|
11804
11804
|
}
|
|
11805
11805
|
]
|
|
@@ -11823,7 +11823,7 @@ var init_registry = __esm({
|
|
|
11823
11823
|
{
|
|
11824
11824
|
range: ">=4.0.0",
|
|
11825
11825
|
coverage: 0,
|
|
11826
|
-
note: `the reference iOS simulator performs this package's behavior.
|
|
11826
|
+
note: `the reference iOS simulator performs this package's behavior. Peach currently provides only this unsupported shape: changeIcon rejects; getIcon="default"; resetIcon noop. imports and API shape receive no behavior credit`,
|
|
11827
11827
|
missing: "duplicate of expo-alternate-app-icons capability"
|
|
11828
11828
|
}
|
|
11829
11829
|
]
|
|
@@ -11835,7 +11835,7 @@ var init_registry = __esm({
|
|
|
11835
11835
|
{
|
|
11836
11836
|
range: ">=1.0.0",
|
|
11837
11837
|
coverage: 0,
|
|
11838
|
-
note: "the reference iOS simulator performs this package's behavior.
|
|
11838
|
+
note: "the reference iOS simulator performs this package's behavior. Peach currently provides only this unsupported shape: ProgressView renders null. imports and API shape receive no behavior credit",
|
|
11839
11839
|
missing: "iOS UIProgressView; consumers can render their own bar in web"
|
|
11840
11840
|
}
|
|
11841
11841
|
]
|
|
@@ -11859,7 +11859,7 @@ var init_registry = __esm({
|
|
|
11859
11859
|
{
|
|
11860
11860
|
range: ">=4.0.0",
|
|
11861
11861
|
coverage: 0,
|
|
11862
|
-
note: `the reference iOS simulator performs this package's behavior.
|
|
11862
|
+
note: `the reference iOS simulator performs this package's behavior. Peach currently provides only this unsupported shape: measure/flatHeights resolve zero-sized; fontFamilyNames=["system"]. imports and API shape receive no behavior credit`,
|
|
11863
11863
|
missing: "no native text measurement; consumers should use canvas measureText on web"
|
|
11864
11864
|
}
|
|
11865
11865
|
]
|
|
@@ -11884,8 +11884,8 @@ var init_registry = __esm({
|
|
|
11884
11884
|
{
|
|
11885
11885
|
range: ">=1.0.0",
|
|
11886
11886
|
coverage: 1,
|
|
11887
|
-
note: "native-seam only: the real package keeps its HapticTypes and worklet-safe triggerHaptics export and installs against
|
|
11888
|
-
working: "all nine public haptic types trigger synchronously through the shared browser vibration and
|
|
11887
|
+
note: "native-seam only: the real package keeps its HapticTypes and worklet-safe triggerHaptics export and installs against Peach's TurboHaptics JSI factory",
|
|
11888
|
+
working: "all nine public haptic types trigger synchronously through the shared browser vibration and Peach haptic-activity path; initialization and repeated installation preserve the package contract"
|
|
11889
11889
|
}
|
|
11890
11890
|
]
|
|
11891
11891
|
},
|
|
@@ -11896,7 +11896,7 @@ var init_registry = __esm({
|
|
|
11896
11896
|
{
|
|
11897
11897
|
range: ">=2.0.0",
|
|
11898
11898
|
coverage: 0,
|
|
11899
|
-
note: "the reference iOS simulator performs this package's behavior.
|
|
11899
|
+
note: "the reference iOS simulator performs this package's behavior. Peach currently provides only this unsupported shape: adapty.activate/identify/logout/getProfile accepted; getPaywall/makePurchase reject; restorePurchases resolves empty access levels. imports and API shape receive no behavior credit",
|
|
11900
11900
|
missing: "recommended swap: @adapty/web-sdk on web"
|
|
11901
11901
|
}
|
|
11902
11902
|
]
|
|
@@ -11908,7 +11908,7 @@ var init_registry = __esm({
|
|
|
11908
11908
|
{
|
|
11909
11909
|
range: ">=1.0.0",
|
|
11910
11910
|
coverage: 0,
|
|
11911
|
-
note: "the reference iOS simulator registers and connects Twilio Voice calls.
|
|
11911
|
+
note: "the reference iOS simulator registers and connects Twilio Voice calls. Peach rejects both operations, so error shape receives no behavior credit",
|
|
11912
11912
|
missing: "recommended swap: @twilio/voice-sdk on web"
|
|
11913
11913
|
}
|
|
11914
11914
|
]
|
|
@@ -11932,7 +11932,7 @@ var init_registry = __esm({
|
|
|
11932
11932
|
{
|
|
11933
11933
|
range: ">=1.0.0",
|
|
11934
11934
|
coverage: 0,
|
|
11935
|
-
note: "the reference iOS simulator performs this package's behavior.
|
|
11935
|
+
note: "the reference iOS simulator performs this package's behavior. Peach currently provides only this unsupported shape: register/registerWith*/unregister accepted; screenshot/recording listeners never fire. imports and API shape receive no behavior credit",
|
|
11936
11936
|
missing: "browsers cannot detect / prevent screenshots"
|
|
11937
11937
|
}
|
|
11938
11938
|
]
|
|
@@ -11957,7 +11957,7 @@ var init_registry = __esm({
|
|
|
11957
11957
|
{
|
|
11958
11958
|
range: ">=1.9.0",
|
|
11959
11959
|
coverage: 0,
|
|
11960
|
-
note: "the reference iOS simulator performs this package's behavior.
|
|
11960
|
+
note: "the reference iOS simulator performs this package's behavior. Peach currently provides only this unsupported shape: picker renders null; ACTION_DATE_SET / ACTION_DISMISSED / ACTION_NEUTRAL constants exposed. imports and API shape receive no behavior credit",
|
|
11961
11961
|
missing: "recommended swap: a JS-only date picker on web"
|
|
11962
11962
|
}
|
|
11963
11963
|
]
|
|
@@ -11969,7 +11969,7 @@ var init_registry = __esm({
|
|
|
11969
11969
|
{
|
|
11970
11970
|
range: ">=0.10.0",
|
|
11971
11971
|
coverage: 0,
|
|
11972
|
-
note: "the reference iOS simulator performs this package's behavior.
|
|
11972
|
+
note: "the reference iOS simulator performs this package's behavior. Peach currently provides only this unsupported shape: NitroImage renders null; loadImageFromUrl rejects. imports and API shape receive no behavior credit",
|
|
11973
11973
|
missing: "use expo-image (already polyfilled) for browser-fast Image"
|
|
11974
11974
|
}
|
|
11975
11975
|
]
|
|
@@ -11993,7 +11993,7 @@ var init_registry = __esm({
|
|
|
11993
11993
|
{
|
|
11994
11994
|
range: ">=6.0.0",
|
|
11995
11995
|
coverage: 0,
|
|
11996
|
-
note: "the reference iOS simulator creates a Scandit data-capture context and renders its view even without camera hardware.
|
|
11996
|
+
note: "the reference iOS simulator creates a Scandit data-capture context and renders its view even without camera hardware. Peach rejects the context and renders null, so error shape receives no behavior credit",
|
|
11997
11997
|
missing: "no Scandit native runtime; recommended swap: scandit-web-datacapture-core"
|
|
11998
11998
|
}
|
|
11999
11999
|
]
|
|
@@ -12017,7 +12017,7 @@ var init_registry = __esm({
|
|
|
12017
12017
|
{
|
|
12018
12018
|
range: ">=2.0.0",
|
|
12019
12019
|
coverage: 0,
|
|
12020
|
-
note: "the reference iOS simulator performs this package's behavior.
|
|
12020
|
+
note: "the reference iOS simulator performs this package's behavior. Peach currently provides only this unsupported shape: show/hide accepted. imports and API shape receive no behavior credit",
|
|
12021
12021
|
missing: "sootsim handles splash via expo-splash-screen (already polyfilled)"
|
|
12022
12022
|
}
|
|
12023
12023
|
]
|
|
@@ -12029,7 +12029,7 @@ var init_registry = __esm({
|
|
|
12029
12029
|
{
|
|
12030
12030
|
range: ">=1.0.0",
|
|
12031
12031
|
coverage: 0,
|
|
12032
|
-
note: "the reference iOS simulator performs this package's behavior.
|
|
12032
|
+
note: "the reference iOS simulator performs this package's behavior. Peach currently provides only this unsupported shape: launchLicenseList accepted; addLicense / setLibraryName accepted. imports and API shape receive no behavior credit",
|
|
12033
12033
|
missing: "no native UI; consumers should render licenses themselves on web"
|
|
12034
12034
|
}
|
|
12035
12035
|
]
|
|
@@ -12065,7 +12065,7 @@ var init_registry = __esm({
|
|
|
12065
12065
|
{
|
|
12066
12066
|
range: ">=0.5.0",
|
|
12067
12067
|
coverage: 0,
|
|
12068
|
-
note: "the reference iOS simulator performs this package's behavior.
|
|
12068
|
+
note: "the reference iOS simulator performs this package's behavior. Peach currently provides only this unsupported shape: NitroWebImage renders null. imports and API shape receive no behavior credit",
|
|
12069
12069
|
missing: "use expo-image (already polyfilled)"
|
|
12070
12070
|
}
|
|
12071
12071
|
]
|
|
@@ -12127,7 +12127,7 @@ var init_registry = __esm({
|
|
|
12127
12127
|
{
|
|
12128
12128
|
range: ">=1.0.0",
|
|
12129
12129
|
coverage: 0,
|
|
12130
|
-
note: "the reference iOS simulator performs this package's behavior.
|
|
12130
|
+
note: "the reference iOS simulator performs this package's behavior. Peach currently provides only this unsupported shape: enabled() accepted; iosProtectFromScreenRecording / iosProtectFromScreenshot accepted. imports and API shape receive no behavior credit",
|
|
12131
12131
|
missing: "browsers cannot prevent screenshots"
|
|
12132
12132
|
}
|
|
12133
12133
|
]
|
|
@@ -12176,7 +12176,7 @@ var init_registry = __esm({
|
|
|
12176
12176
|
{
|
|
12177
12177
|
range: ">=2.0.0",
|
|
12178
12178
|
coverage: 0,
|
|
12179
|
-
note: "the reference iOS simulator performs this package's behavior.
|
|
12179
|
+
note: "the reference iOS simulator performs this package's behavior. Peach currently provides only this unsupported shape: isICloudAvailable=false; documentsDirectory empty; upload/download reject; listSync=[]. imports and API shape receive no behavior credit",
|
|
12180
12180
|
missing: "no iCloud Drive integration in browser"
|
|
12181
12181
|
}
|
|
12182
12182
|
]
|
|
@@ -12188,7 +12188,7 @@ var init_registry = __esm({
|
|
|
12188
12188
|
{
|
|
12189
12189
|
range: ">=1.0.0",
|
|
12190
12190
|
coverage: 1,
|
|
12191
|
-
note: "native-seam: the two pure-JS constants (ScreenCornerRadius, IsScreenRounded) run from the real bundle; only the ScreenCornerRadius NativeModule is ours, and its `cornerRadius` constant returns the live simulated device's measured display corner radius from the same device spec the engine renders the chrome from. this is the package's entire purpose and
|
|
12191
|
+
note: "native-seam: the two pure-JS constants (ScreenCornerRadius, IsScreenRounded) run from the real bundle; only the ScreenCornerRadius NativeModule is ours, and its `cornerRadius` constant returns the live simulated device's measured display corner radius from the same device spec the engine renders the chrome from. this is the package's entire purpose and Peach answers it precisely. faithful complete contract, not a no-op.",
|
|
12192
12192
|
working: "NativeModules.ScreenCornerRadius.cornerRadius (real per-device radius, synchronous constant read at import like upstream); ScreenCornerRadius + IsScreenRounded constants computed by the real package JS off that value, so IsScreenRounded is correct per device"
|
|
12193
12193
|
}
|
|
12194
12194
|
]
|
|
@@ -12200,7 +12200,7 @@ var init_registry = __esm({
|
|
|
12200
12200
|
{
|
|
12201
12201
|
range: ">=4.0.0",
|
|
12202
12202
|
coverage: 0,
|
|
12203
|
-
note: "the reference iOS simulator performs this package's behavior.
|
|
12203
|
+
note: "the reference iOS simulator performs this package's behavior. Peach currently provides only this unsupported shape: startFreeRasp accepted; isAppInDebug/isAppTampered=false. imports and API shape receive no behavior credit",
|
|
12204
12204
|
missing: "no RASP (runtime application self-protection) in browser"
|
|
12205
12205
|
}
|
|
12206
12206
|
]
|
|
@@ -12237,7 +12237,7 @@ var init_registry = __esm({
|
|
|
12237
12237
|
{
|
|
12238
12238
|
range: ">=6.0.0",
|
|
12239
12239
|
coverage: 0,
|
|
12240
|
-
note: "the reference iOS simulator creates a Scandit barcode capture session over supplied frames.
|
|
12240
|
+
note: "the reference iOS simulator creates a Scandit barcode capture session over supplied frames. Peach rejects session creation, so constants and error shape receive no behavior credit",
|
|
12241
12241
|
missing: "recommended swap: scandit-web-datacapture-barcode"
|
|
12242
12242
|
}
|
|
12243
12243
|
]
|
|
@@ -12261,7 +12261,7 @@ var init_registry = __esm({
|
|
|
12261
12261
|
{
|
|
12262
12262
|
range: ">=1.0.0",
|
|
12263
12263
|
coverage: 0,
|
|
12264
|
-
note: "the reference iOS simulator performs this package's behavior.
|
|
12264
|
+
note: "the reference iOS simulator performs this package's behavior. Peach currently provides only this unsupported shape: startActivity rejects; updateActivity/endActivity accepted; listActivities=[]; requestPermissions=denied; isActivityEnabled=false. imports and API shape receive no behavior credit",
|
|
12265
12265
|
missing: "no Dynamic Island / Live Activities outside iOS"
|
|
12266
12266
|
}
|
|
12267
12267
|
]
|
|
@@ -12273,7 +12273,7 @@ var init_registry = __esm({
|
|
|
12273
12273
|
{
|
|
12274
12274
|
range: ">=1.0.0",
|
|
12275
12275
|
coverage: 0,
|
|
12276
|
-
note: "the reference iOS simulator presents the Luciq bug-reporting UI.
|
|
12276
|
+
note: "the reference iOS simulator presents the Luciq bug-reporting UI. Peach accepts the singleton calls but presents no report surface, so import safety receives no behavior credit",
|
|
12277
12277
|
missing: "no real bug-report delivery \u2014 same constraint as every analytics SDK in browser preview"
|
|
12278
12278
|
}
|
|
12279
12279
|
]
|
|
@@ -12285,7 +12285,7 @@ var init_registry = __esm({
|
|
|
12285
12285
|
{
|
|
12286
12286
|
range: ">=2.0.0",
|
|
12287
12287
|
coverage: 0,
|
|
12288
|
-
note: "the reference iOS simulator performs this package's behavior.
|
|
12288
|
+
note: "the reference iOS simulator performs this package's behavior. Peach currently provides only this unsupported shape: isAvailable=false; show rejects. imports and API shape receive no behavior credit",
|
|
12289
12289
|
missing: "no SFSafariViewController in browser; consumers should use sootsim Browser or window.open"
|
|
12290
12290
|
}
|
|
12291
12291
|
]
|
|
@@ -12345,7 +12345,7 @@ var init_registry = __esm({
|
|
|
12345
12345
|
{
|
|
12346
12346
|
range: ">=0.3.0",
|
|
12347
12347
|
coverage: 0,
|
|
12348
|
-
note: "the reference iOS simulator performs this package's behavior.
|
|
12348
|
+
note: "the reference iOS simulator performs this package's behavior. Peach currently provides only this unsupported shape: onKeyDown/UpListener register but never fire. imports and API shape receive no behavior credit",
|
|
12349
12349
|
missing: "sootsim handles its own keyboard events; consumers can use window keydown/keyup directly"
|
|
12350
12350
|
}
|
|
12351
12351
|
]
|
|
@@ -12382,9 +12382,9 @@ var init_registry = __esm({
|
|
|
12382
12382
|
{
|
|
12383
12383
|
range: ">=0.3.0",
|
|
12384
12384
|
coverage: 0.7,
|
|
12385
|
-
note: "native-seam: the real handler and filter lifecycle runs from the bundle while
|
|
12385
|
+
note: "native-seam: the real handler and filter lifecycle runs from the bundle while Peach captures browser logs through its inspector",
|
|
12386
12386
|
working: "configure, registerHandler/remove, filter bookkeeping, TurboModule and NativeEventEmitter contracts",
|
|
12387
|
-
missing: "streaming Apple OSLogStore entries through newLogAvailable; browser process logs remain available in the
|
|
12387
|
+
missing: "streaming Apple OSLogStore entries through newLogAvailable; browser process logs remain available in the Peach inspector instead"
|
|
12388
12388
|
}
|
|
12389
12389
|
]
|
|
12390
12390
|
},
|
|
@@ -12408,7 +12408,7 @@ var init_registry = __esm({
|
|
|
12408
12408
|
{
|
|
12409
12409
|
range: ">=1.0.0",
|
|
12410
12410
|
coverage: 0,
|
|
12411
|
-
note: "the reference iOS simulator mounts React Native inside the native host.
|
|
12411
|
+
note: "the reference iOS simulator mounts React Native inside the native host. Peach passes children through and does not exercise that integration, so import safety receives no behavior credit"
|
|
12412
12412
|
}
|
|
12413
12413
|
]
|
|
12414
12414
|
},
|
|
@@ -12431,7 +12431,7 @@ var init_registry = __esm({
|
|
|
12431
12431
|
{
|
|
12432
12432
|
range: ">=2.0.0",
|
|
12433
12433
|
coverage: 0,
|
|
12434
|
-
note: "the reference iOS simulator performs this package's behavior.
|
|
12434
|
+
note: "the reference iOS simulator performs this package's behavior. Peach currently provides only this unsupported shape: FilamentView/Camera/Light/Model render null; useModel/useEngine/useCamera return null; loadAsset rejects. imports and API shape receive no behavior credit",
|
|
12435
12435
|
missing: "no native Filament 3D renderer; recommended swap: three.js / WebGPU on web"
|
|
12436
12436
|
}
|
|
12437
12437
|
]
|
|
@@ -12443,7 +12443,7 @@ var init_registry = __esm({
|
|
|
12443
12443
|
{
|
|
12444
12444
|
range: ">=0.3.0",
|
|
12445
12445
|
coverage: 0,
|
|
12446
|
-
note: "the reference iOS simulator performs this package's behavior.
|
|
12446
|
+
note: "the reference iOS simulator performs this package's behavior. Peach currently provides only this unsupported shape: useLLM reports {generate: rejects, isReady: false}; useImageEmbeddings rejects. imports and API shape receive no behavior credit",
|
|
12447
12447
|
missing: "no ExecuTorch runtime; recommended swap: web-llm or remote inference"
|
|
12448
12448
|
}
|
|
12449
12449
|
]
|
|
@@ -12479,7 +12479,7 @@ var init_registry = __esm({
|
|
|
12479
12479
|
{
|
|
12480
12480
|
range: ">=2.0.0",
|
|
12481
12481
|
coverage: 0,
|
|
12482
|
-
note: "the reference iOS simulator performs this package's behavior.
|
|
12482
|
+
note: "the reference iOS simulator performs this package's behavior. Peach currently provides only this unsupported shape: initialize/setUserAgreeToAll/setUserDisagreeToAll/showNotice/showPreferences/reset accepted; isReady=true; EventType enum exposed. imports and API shape receive no behavior credit",
|
|
12483
12483
|
missing: "no real Didomi consent collection"
|
|
12484
12484
|
}
|
|
12485
12485
|
]
|
|
@@ -12491,7 +12491,7 @@ var init_registry = __esm({
|
|
|
12491
12491
|
{
|
|
12492
12492
|
range: ">=2.0.0",
|
|
12493
12493
|
coverage: 0,
|
|
12494
|
-
note: "the reference iOS simulator performs this package's behavior.
|
|
12494
|
+
note: "the reference iOS simulator performs this package's behavior. Peach currently provides only this unsupported shape: YouTube renders null. imports and API shape receive no behavior credit",
|
|
12495
12495
|
missing: "no embedded YouTube player; consumers can use the iframe player API directly"
|
|
12496
12496
|
}
|
|
12497
12497
|
]
|
|
@@ -12515,7 +12515,7 @@ var init_registry = __esm({
|
|
|
12515
12515
|
{
|
|
12516
12516
|
range: ">=2.0.0",
|
|
12517
12517
|
coverage: 0.78,
|
|
12518
|
-
note: "native-seam only \u2014 the published Waveform component, candle UI, hooks, scrub logic, events, and imperative facade run unchanged over
|
|
12518
|
+
note: "native-seam only \u2014 the published Waveform component, candle UI, hooks, scrub logic, events, and imperative facade run unchanged over Peach's shared browser audio driver",
|
|
12519
12519
|
working: "static waveform extraction from decoded browser audio, normalized multi-channel sample peaks, prepare/play/pause/stop/seek, current and total duration, volume, playback speed, loop/pause/stop finish modes, independent keyed players, playback progress and completion events, microphone permission, MediaRecorder start/pause/resume/stop, metering updates, recorded blob URL and duration",
|
|
12520
12520
|
missing: "streaming onCurrentExtractedWaveformData progress events and extractor cancellation, reading audio URLs blocked by cross-origin fetch policy, native filesystem paths not exposed through the simulator fetch/VFS bridge, exact AVFoundation/MediaCodec decoder normalization, recording encoder/file-name options, native audio-session routing and background playback"
|
|
12521
12521
|
}
|
|
@@ -12541,7 +12541,7 @@ var init_registry = __esm({
|
|
|
12541
12541
|
{
|
|
12542
12542
|
range: ">=3.0.0",
|
|
12543
12543
|
coverage: 0,
|
|
12544
|
-
note: "the reference iOS simulator performs this package's behavior.
|
|
12544
|
+
note: "the reference iOS simulator performs this package's behavior. Peach currently provides only this unsupported shape: present rejects; preload/invalidate/configure accepted; ColorScheme constants exposed. imports and API shape receive no behavior credit",
|
|
12545
12545
|
missing: "no Shopify checkout sheet; recommended swap: shopify-checkout JS embed"
|
|
12546
12546
|
}
|
|
12547
12547
|
]
|
|
@@ -12565,7 +12565,7 @@ var init_registry = __esm({
|
|
|
12565
12565
|
{
|
|
12566
12566
|
range: ">=1.0.0",
|
|
12567
12567
|
coverage: 0,
|
|
12568
|
-
note: "the reference iOS simulator performs this package's behavior.
|
|
12568
|
+
note: "the reference iOS simulator performs this package's behavior. Peach currently provides only this unsupported shape: showEditor rejects; cleanFiles/closeEditor accepted. imports and API shape receive no behavior credit",
|
|
12569
12569
|
missing: "recommended swap: ffmpeg.wasm + video element"
|
|
12570
12570
|
}
|
|
12571
12571
|
]
|
|
@@ -12589,7 +12589,7 @@ var init_registry = __esm({
|
|
|
12589
12589
|
{
|
|
12590
12590
|
range: ">=3.0.0",
|
|
12591
12591
|
coverage: 0,
|
|
12592
|
-
note: "the reference iOS simulator performs this package's behavior.
|
|
12592
|
+
note: "the reference iOS simulator performs this package's behavior. Peach currently provides only this unsupported shape: download returns task object with pause/resume/cancel/done/error/begin/progress chains; checkForExistingDownloads=[]. imports and API shape receive no behavior credit",
|
|
12593
12593
|
missing: "no background download \u2014 browsers have ServiceWorker fetch but the API differs"
|
|
12594
12594
|
}
|
|
12595
12595
|
]
|
|
@@ -12613,7 +12613,7 @@ var init_registry = __esm({
|
|
|
12613
12613
|
{
|
|
12614
12614
|
range: ">=0.6.0",
|
|
12615
12615
|
coverage: 0,
|
|
12616
|
-
note: "the reference iOS simulator performs this package's behavior.
|
|
12616
|
+
note: "the reference iOS simulator performs this package's behavior. Peach currently provides only this unsupported shape: LineChart/BarChart/PieChart/CandleStickChart/RadarChart/BubbleChart/HorizontalBarChart/ScatterChart/CombinedChart all render null. imports and API shape receive no behavior credit",
|
|
12617
12617
|
missing: "no MPAndroidChart/Charts native; recommended swap: victory-native or recharts on web"
|
|
12618
12618
|
}
|
|
12619
12619
|
]
|
|
@@ -12625,7 +12625,7 @@ var init_registry = __esm({
|
|
|
12625
12625
|
{
|
|
12626
12626
|
range: ">=2.0.0",
|
|
12627
12627
|
coverage: 0,
|
|
12628
|
-
note: "the reference iOS simulator performs this package's behavior.
|
|
12628
|
+
note: "the reference iOS simulator performs this package's behavior. Peach currently provides only this unsupported shape: getCacheUri returns input url; cleanCache/cleanByUrl accepted; getCacheSize=0. imports and API shape receive no behavior credit",
|
|
12629
12629
|
missing: "no video proxy/cache; browsers cache via standard HTTP cache"
|
|
12630
12630
|
}
|
|
12631
12631
|
]
|
|
@@ -12687,7 +12687,7 @@ var init_registry = __esm({
|
|
|
12687
12687
|
{
|
|
12688
12688
|
range: ">=4.0.0",
|
|
12689
12689
|
coverage: 0,
|
|
12690
|
-
note: "the reference iOS simulator renders CometChat conversations, messages, the composer, and call UI.
|
|
12690
|
+
note: "the reference iOS simulator renders CometChat conversations, messages, the composer, and call UI. Peach passes those components through, so import safety receives no behavior credit",
|
|
12691
12691
|
missing: "no real CometChat client; recommended swap: @cometchat/chat-uikit-react"
|
|
12692
12692
|
}
|
|
12693
12693
|
]
|
|
@@ -12711,7 +12711,7 @@ var init_registry = __esm({
|
|
|
12711
12711
|
{
|
|
12712
12712
|
range: ">=1.0.0",
|
|
12713
12713
|
coverage: 0,
|
|
12714
|
-
note: "the reference iOS simulator performs this package's behavior.
|
|
12714
|
+
note: "the reference iOS simulator performs this package's behavior. Peach currently provides only this unsupported shape: SFSymbol/SymbolView render null. imports and API shape receive no behavior credit",
|
|
12715
12715
|
missing: "use expo-symbols (already polyfilled, blends with proof to higher score)"
|
|
12716
12716
|
}
|
|
12717
12717
|
]
|
|
@@ -12784,7 +12784,7 @@ var init_registry = __esm({
|
|
|
12784
12784
|
{
|
|
12785
12785
|
range: ">=8.0.0",
|
|
12786
12786
|
coverage: 0,
|
|
12787
|
-
note: "the reference iOS simulator performs this package's behavior.
|
|
12787
|
+
note: "the reference iOS simulator performs this package's behavior. Peach currently provides only this unsupported shape: Batch singleton + Push/User/Inbox/Profile/Messaging namespaces accepted. imports and API shape receive no behavior credit",
|
|
12788
12788
|
missing: "no real Batch.com push delivery"
|
|
12789
12789
|
}
|
|
12790
12790
|
]
|
|
@@ -12809,7 +12809,7 @@ var init_registry = __esm({
|
|
|
12809
12809
|
{
|
|
12810
12810
|
range: ">=15.0.0",
|
|
12811
12811
|
coverage: 0,
|
|
12812
|
-
note: "the reference iOS simulator performs this package's behavior.
|
|
12812
|
+
note: "the reference iOS simulator performs this package's behavior. Peach currently provides only this unsupported shape: native-seam only: the real @shakebugs/react-native-shake runs from the bundle (the full ~670-line Shake JS object : all upstream). we stub only the Shake TurboModule, mirroring src/NativeShake.ts@17.x exactly: every config setter is accepted, every getter returns the inert unconfigured-SDK value, start/silentReport resolve without delivery. per docs/compat-scoring.md (crash/QA noop), delivery is intentionally absent. held one notch below the 0.95 analytics tier because the in-app report UI (show()) has no backend content. (replaces a drifted JS stub exposing non-Spec methods like setEnabled/setUserMetadata). imports and API shape receive no behavior credit",
|
|
12813
12813
|
working: "full upstream JS surface (Shake object + enums); start, show, all config setters/getters (feedback/blackbox/activity-history/floating-button/screenshot/threshold/intro/video/console toggles), metadata, private views, network/notification capture APIs, user registration, tags, listener registration",
|
|
12814
12814
|
missing: "no shake-to-report delivery, no rendered Shake report form content, no black-box/activity-history/video capture upload \u2014 intentionally absent for the development simulator (no Shake backend)"
|
|
12815
12815
|
}
|
|
@@ -12822,7 +12822,7 @@ var init_registry = __esm({
|
|
|
12822
12822
|
{
|
|
12823
12823
|
range: ">=1.0.0",
|
|
12824
12824
|
coverage: 0,
|
|
12825
|
-
note: `the reference iOS simulator performs this package's behavior.
|
|
12825
|
+
note: `the reference iOS simulator performs this package's behavior. Peach currently provides only this unsupported shape: setAppIcon/getAppIcon resolve "default"; isSupported=false. imports and API shape receive no behavior credit`,
|
|
12826
12826
|
missing: "no UIApplication.setAlternateIconName equivalent"
|
|
12827
12827
|
}
|
|
12828
12828
|
]
|
|
@@ -12834,7 +12834,7 @@ var init_registry = __esm({
|
|
|
12834
12834
|
{
|
|
12835
12835
|
range: ">=0.1.0",
|
|
12836
12836
|
coverage: 0,
|
|
12837
|
-
note: "the reference iOS simulator handles pasted content through the native paste input.
|
|
12837
|
+
note: "the reference iOS simulator handles pasted content through the native paste input. Peach renders only the JavaScript wrapper around a pass-through container, so import safety receives no behavior credit",
|
|
12838
12838
|
missing: "onPaste never fires \u2014 sootsim keyboard has no paste pipeline into guest inputs"
|
|
12839
12839
|
}
|
|
12840
12840
|
]
|
|
@@ -12846,7 +12846,7 @@ var init_registry = __esm({
|
|
|
12846
12846
|
{
|
|
12847
12847
|
range: ">=2.0.0",
|
|
12848
12848
|
coverage: 0,
|
|
12849
|
-
note: "the reference iOS simulator performs this package's behavior.
|
|
12849
|
+
note: "the reference iOS simulator performs this package's behavior. Peach currently provides only this unsupported shape: PDFView renders null. imports and API shape receive no behavior credit",
|
|
12850
12850
|
missing: "recommended swap: PDF.js iframe"
|
|
12851
12851
|
}
|
|
12852
12852
|
]
|
|
@@ -12859,7 +12859,7 @@ var init_registry = __esm({
|
|
|
12859
12859
|
range: ">=0.5.0",
|
|
12860
12860
|
coverage: 0.85,
|
|
12861
12861
|
note: "load-safe noop \u2014 impact/notification/selection accepted",
|
|
12862
|
-
missing: "
|
|
12862
|
+
missing: "peach has expo-haptics; consumers should use that"
|
|
12863
12863
|
}
|
|
12864
12864
|
]
|
|
12865
12865
|
},
|
|
@@ -12870,7 +12870,7 @@ var init_registry = __esm({
|
|
|
12870
12870
|
{
|
|
12871
12871
|
range: ">=2.0.0",
|
|
12872
12872
|
coverage: 0,
|
|
12873
|
-
note: "the reference iOS simulator performs this package's behavior.
|
|
12873
|
+
note: "the reference iOS simulator performs this package's behavior. Peach currently provides only this unsupported shape: initialize accepted; fetchPredictions=[]; fetchPlaceByID rejects. imports and API shape receive no behavior credit",
|
|
12874
12874
|
missing: "recommended swap: Google Places API on web directly"
|
|
12875
12875
|
}
|
|
12876
12876
|
]
|
|
@@ -12882,7 +12882,7 @@ var init_registry = __esm({
|
|
|
12882
12882
|
{
|
|
12883
12883
|
range: ">=2.0.0",
|
|
12884
12884
|
coverage: 0,
|
|
12885
|
-
note: `the reference iOS simulator performs this package's behavior.
|
|
12885
|
+
note: `the reference iOS simulator performs this package's behavior. Peach currently provides only this unsupported shape: alias for expo-dynamic-app-icon (0.85) : load-safe noop matching the upstream "no alternate-icon support in browser" expectation. imports and API shape receive no behavior credit`,
|
|
12886
12886
|
missing: "see expo-dynamic-app-icon"
|
|
12887
12887
|
}
|
|
12888
12888
|
]
|
|
@@ -12920,7 +12920,7 @@ var init_registry = __esm({
|
|
|
12920
12920
|
{
|
|
12921
12921
|
range: ">=1.0.0",
|
|
12922
12922
|
coverage: 0,
|
|
12923
|
-
note: "the reference iOS simulator performs this package's behavior.
|
|
12923
|
+
note: "the reference iOS simulator performs this package's behavior. Peach currently provides only this unsupported shape: startPictureInPicture/stopPictureInPicture accepted; isPipSupported=false. imports and API shape receive no behavior credit",
|
|
12924
12924
|
missing: "browsers expose Document.exitPictureInPicture / requestPictureInPicture; sootsim does not bridge yet"
|
|
12925
12925
|
}
|
|
12926
12926
|
]
|
|
@@ -12932,7 +12932,7 @@ var init_registry = __esm({
|
|
|
12932
12932
|
{
|
|
12933
12933
|
range: ">=1.0.0",
|
|
12934
12934
|
coverage: 0,
|
|
12935
|
-
note: "the reference iOS simulator performs this package's behavior.
|
|
12935
|
+
note: "the reference iOS simulator performs this package's behavior. Peach currently provides only this unsupported shape: isAvailable=false; detect rejects. imports and API shape receive no behavior credit",
|
|
12936
12936
|
missing: "package surface stubbed loosely"
|
|
12937
12937
|
}
|
|
12938
12938
|
]
|
|
@@ -13006,7 +13006,7 @@ var init_registry = __esm({
|
|
|
13006
13006
|
{
|
|
13007
13007
|
range: ">=3.0.0",
|
|
13008
13008
|
coverage: 0,
|
|
13009
|
-
note: "the reference iOS simulator performs this package's behavior.
|
|
13009
|
+
note: "the reference iOS simulator performs this package's behavior. Peach currently provides only this unsupported shape: TwilioVideoLocalView/TwilioVideoParticipantView render null; TwilioVideo.connect rejects. imports and API shape receive no behavior credit",
|
|
13010
13010
|
missing: "recommended swap: twilio-video web SDK"
|
|
13011
13011
|
}
|
|
13012
13012
|
]
|
|
@@ -13018,7 +13018,7 @@ var init_registry = __esm({
|
|
|
13018
13018
|
{
|
|
13019
13019
|
range: ">=1.0.0",
|
|
13020
13020
|
coverage: 0.85,
|
|
13021
|
-
note: "native-seam: the BarcodeFormat enum + LINKING_ERROR proxy run from the bundle; the BarcodeScanning native module backs scan() with the native BarcodeDetector API (shipped in the Chromium runtime
|
|
13021
|
+
note: "native-seam: the BarcodeFormat enum + LINKING_ERROR proxy run from the bundle; the BarcodeScanning native module backs scan() with the native BarcodeDetector API (shipped in the Chromium runtime Peach runs on \u2014 no vendored library needed), loading the source image through the shared expo-file-system VFS / fetch loader and mapping results to upstream\u2019s exact { format, value } shape with the BarcodeFormat enum values",
|
|
13022
13022
|
working: "scan(imageURL) for file:// (VFS) / http(s) / data: images, all BarcodeDetector-supported symbologies mapped to BarcodeFormat (QR/CODE_128/39/93/CODABAR/DATA_MATRIX/EAN/ITF/UPC/PDF417/AZTEC), BarcodeFormat enum",
|
|
13023
13023
|
missing: "BarcodeDetector symbology support is browser-implementation-bounded; when unavailable or nothing is detected, resolves [] (a valid no-barcode result, matching the natives) rather than a richer ML Kit bounding-box/cornerPoints payload (upstream Barcode is only { format, value })"
|
|
13024
13024
|
}
|
|
@@ -13031,7 +13031,7 @@ var init_registry = __esm({
|
|
|
13031
13031
|
{
|
|
13032
13032
|
range: ">=1.0.0",
|
|
13033
13033
|
coverage: 0,
|
|
13034
|
-
note: "the reference iOS simulator performs this package's behavior.
|
|
13034
|
+
note: "the reference iOS simulator performs this package's behavior. Peach currently provides only this unsupported shape: isLocationMocked/isInMockMode=false. imports and API shape receive no behavior credit",
|
|
13035
13035
|
missing: "browsers cannot detect mock location"
|
|
13036
13036
|
}
|
|
13037
13037
|
]
|
|
@@ -13055,7 +13055,7 @@ var init_registry = __esm({
|
|
|
13055
13055
|
{
|
|
13056
13056
|
range: ">=1.0.0",
|
|
13057
13057
|
coverage: 0,
|
|
13058
|
-
note: "the reference iOS simulator performs this package's behavior.
|
|
13058
|
+
note: "the reference iOS simulator performs this package's behavior. Peach currently provides only this unsupported shape: addListener/removeListener register but never fire. imports and API shape receive no behavior credit",
|
|
13059
13059
|
missing: "consumers can use window keydown/keyup directly on web"
|
|
13060
13060
|
}
|
|
13061
13061
|
]
|
|
@@ -13115,7 +13115,7 @@ var init_registry = __esm({
|
|
|
13115
13115
|
{
|
|
13116
13116
|
range: ">=0.5.0",
|
|
13117
13117
|
coverage: 0,
|
|
13118
|
-
note: "the reference iOS simulator performs this package's behavior.
|
|
13118
|
+
note: "the reference iOS simulator performs this package's behavior. Peach currently provides only this unsupported shape: DotLottieAnimation/DotLottiePlayer render null. imports and API shape receive no behavior credit",
|
|
13119
13119
|
missing: "no .lottie playback; recommended swap: @lottiefiles/dotlottie-react on web"
|
|
13120
13120
|
}
|
|
13121
13121
|
]
|
|
@@ -13139,7 +13139,7 @@ var init_registry = __esm({
|
|
|
13139
13139
|
{
|
|
13140
13140
|
range: ">=3.0.0",
|
|
13141
13141
|
coverage: 0,
|
|
13142
|
-
note: "the reference iOS simulator performs this package's behavior.
|
|
13142
|
+
note: "the reference iOS simulator performs this package's behavior. Peach currently provides only this unsupported shape: initialize/logout/deleteToken accepted; login/getProfile reject. imports and API shape receive no behavior credit",
|
|
13143
13143
|
missing: "recommended swap: Naver login JS SDK on web"
|
|
13144
13144
|
}
|
|
13145
13145
|
]
|
|
@@ -13151,7 +13151,7 @@ var init_registry = __esm({
|
|
|
13151
13151
|
{
|
|
13152
13152
|
range: ">=4.0.0",
|
|
13153
13153
|
coverage: 0,
|
|
13154
|
-
note: "the reference iOS simulator performs this package's behavior.
|
|
13154
|
+
note: "the reference iOS simulator performs this package's behavior. Peach currently provides only this unsupported shape: setNativeAppearance accepted; getNativeAppearance reports system. imports and API shape receive no behavior credit",
|
|
13155
13155
|
missing: "sootsim handles colorScheme natively"
|
|
13156
13156
|
}
|
|
13157
13157
|
]
|
|
@@ -13163,7 +13163,7 @@ var init_registry = __esm({
|
|
|
13163
13163
|
{
|
|
13164
13164
|
range: ">=1.0.0",
|
|
13165
13165
|
coverage: 0,
|
|
13166
|
-
note: "the reference iOS simulator performs this package's behavior.
|
|
13166
|
+
note: "the reference iOS simulator performs this package's behavior. Peach currently provides only this unsupported shape: SkiaVideo renders null; VideoComposition class exposed. imports and API shape receive no behavior credit",
|
|
13167
13167
|
missing: "no native skia video; recommended swap: <video> + canvas on web"
|
|
13168
13168
|
}
|
|
13169
13169
|
]
|
|
@@ -13175,7 +13175,7 @@ var init_registry = __esm({
|
|
|
13175
13175
|
{
|
|
13176
13176
|
range: ">=0.0.1",
|
|
13177
13177
|
coverage: 0,
|
|
13178
|
-
note: "the reference iOS simulator performs this package's behavior.
|
|
13178
|
+
note: "the reference iOS simulator performs this package's behavior. Peach currently provides only this unsupported shape: Easing constants exposed; interpolate returns input. imports and API shape receive no behavior credit"
|
|
13179
13179
|
}
|
|
13180
13180
|
]
|
|
13181
13181
|
},
|
|
@@ -13186,7 +13186,7 @@ var init_registry = __esm({
|
|
|
13186
13186
|
{
|
|
13187
13187
|
range: ">=1.0.0",
|
|
13188
13188
|
coverage: 0,
|
|
13189
|
-
note: "the reference iOS simulator performs this package's behavior.
|
|
13189
|
+
note: "the reference iOS simulator performs this package's behavior. Peach currently provides only this unsupported shape: setMode/getMode accepted. imports and API shape receive no behavior credit",
|
|
13190
13190
|
missing: "browsers cannot adjust system performance modes"
|
|
13191
13191
|
}
|
|
13192
13192
|
]
|
|
@@ -13210,7 +13210,7 @@ var init_registry = __esm({
|
|
|
13210
13210
|
{
|
|
13211
13211
|
range: ">=4.0.0",
|
|
13212
13212
|
coverage: 0,
|
|
13213
|
-
note: "the reference iOS simulator performs this package's behavior.
|
|
13213
|
+
note: "the reference iOS simulator performs this package's behavior. Peach currently provides only this unsupported shape: donateShortcut/clearAllShortcuts/clearShortcutsWithIdentifiers/presentShortcut accepted; getShortcuts=[]; addEventListener returns removable subscription. imports and API shape receive no behavior credit",
|
|
13214
13214
|
missing: "no Siri shortcuts on iOS / web"
|
|
13215
13215
|
}
|
|
13216
13216
|
]
|
|
@@ -13258,7 +13258,7 @@ var init_registry = __esm({
|
|
|
13258
13258
|
{
|
|
13259
13259
|
range: ">=1.0.0",
|
|
13260
13260
|
coverage: 0.8,
|
|
13261
|
-
note: "native-seam only - upstream FasterImageView and clearCache platform selection run unchanged; FasterImageView renders through
|
|
13261
|
+
note: "native-seam only - upstream FasterImageView and clearCache platform selection run unchanged; FasterImageView renders through Peach Image with URL, request headers, sizing, resize mode, border radii, accessibility, and native event translation",
|
|
13262
13262
|
working: "remote PNG/JPEG rendering, authenticated image requests, cover/contain/center/fill sizing, per-corner radii, onSuccess/onError, and stable iOS/Android clearCache calls",
|
|
13263
13263
|
missing: "browser-owned image cache eviction, blurhash/thumbhash/base64 placeholders, failure images, activity indicator, grayscale, transition timing, progressive decoding, and directional alignment modes are not yet distinct"
|
|
13264
13264
|
}
|
|
@@ -13271,9 +13271,9 @@ var init_registry = __esm({
|
|
|
13271
13271
|
{
|
|
13272
13272
|
range: ">=5.0.0",
|
|
13273
13273
|
coverage: 0.8,
|
|
13274
|
-
note: "native-seam only - upstream ToolTip component, touch handling, actions, and callbacks run unchanged; ToolTipMenu presents through the
|
|
13274
|
+
note: "native-seam only - upstream ToolTip component, touch handling, actions, and callbacks run unchanged; ToolTipMenu presents through the Peach iOS action sheet and RCTToolTipText forwards selection and blur events",
|
|
13275
13275
|
working: "show/hide lifecycle, selectable text actions, action callbacks, arrow-direction-safe calls, child rendering, and onShow/onHide behavior",
|
|
13276
|
-
missing: "the menu uses
|
|
13276
|
+
missing: "the menu uses Peach action-sheet placement instead of anchoring a compact UIMenuController to the source view"
|
|
13277
13277
|
}
|
|
13278
13278
|
]
|
|
13279
13279
|
},
|
|
@@ -13284,7 +13284,7 @@ var init_registry = __esm({
|
|
|
13284
13284
|
{
|
|
13285
13285
|
range: ">=0.5.0",
|
|
13286
13286
|
coverage: 0,
|
|
13287
|
-
note: "the reference iOS simulator performs this package's behavior.
|
|
13287
|
+
note: "the reference iOS simulator performs this package's behavior. Peach currently provides only this unsupported shape: UnityView renders null; sendUnityMessage/postMessageToUnity accepted; isReady=false. imports and API shape receive no behavior credit",
|
|
13288
13288
|
missing: "no Unity engine in browser; recommended swap: Unity WebGL build embedded in iframe"
|
|
13289
13289
|
}
|
|
13290
13290
|
]
|
|
@@ -13321,7 +13321,7 @@ var init_registry = __esm({
|
|
|
13321
13321
|
{
|
|
13322
13322
|
range: ">=2.0.0",
|
|
13323
13323
|
coverage: 0,
|
|
13324
|
-
note: "the reference iOS simulator performs this package's behavior.
|
|
13324
|
+
note: "the reference iOS simulator performs this package's behavior. Peach currently provides only this unsupported shape: setValue/delete accepted; getValue=null; isCloudAvailable=false. imports and API shape receive no behavior credit",
|
|
13325
13325
|
missing: "no iCloud Drive / Google Drive integration in browser"
|
|
13326
13326
|
}
|
|
13327
13327
|
]
|
|
@@ -13370,7 +13370,7 @@ var init_registry = __esm({
|
|
|
13370
13370
|
{
|
|
13371
13371
|
range: ">=1.0.0",
|
|
13372
13372
|
coverage: 0,
|
|
13373
|
-
note: "the reference iOS simulator performs this package's behavior.
|
|
13373
|
+
note: "the reference iOS simulator performs this package's behavior. Peach currently provides only this unsupported shape: applyTheme resolves immediately; ThemeSwitchAnimationStyle constants exposed. imports and API shape receive no behavior credit",
|
|
13374
13374
|
missing: "no native theme transition animation"
|
|
13375
13375
|
}
|
|
13376
13376
|
]
|
|
@@ -13394,7 +13394,7 @@ var init_registry = __esm({
|
|
|
13394
13394
|
{
|
|
13395
13395
|
range: ">=1.0.0",
|
|
13396
13396
|
coverage: 0.85,
|
|
13397
|
-
note: "native-seam: the impact/notification/selection/androidHaptics wrappers run from the bundle; the Haptics TurboModule delegates to
|
|
13397
|
+
note: "native-seam: the impact/notification/selection/androidHaptics wrappers run from the bundle; the Haptics TurboModule delegates to Peach\u2019s shared expo-haptics navigator.vibrate mapping (same enum string values), so behavior is identical to expo-haptics and there is one source of the vibration logic. calls resolve cleanly when no vibrator is present (and the iOS simulator has no haptics hardware either \u2014 the faithful contract)",
|
|
13398
13398
|
working: "impact(style: light/medium/heavy/soft/rigid), notification(type: success/warning/error), selection(), androidHaptics() \u2014 all mapped to navigator.vibrate patterns via the shared expo-haptics implementation",
|
|
13399
13399
|
missing: "browsers expose only on/off Vibration (no force/sharpness control) \u2014 exact UIFeedbackGenerator texture is approximated by duration, identical to expo-haptics; no perceptible vibration on a device without a vibrator (faithful to the iOS simulator, which has none)"
|
|
13400
13400
|
}
|
|
@@ -13407,7 +13407,7 @@ var init_registry = __esm({
|
|
|
13407
13407
|
{
|
|
13408
13408
|
range: ">=1.0.0",
|
|
13409
13409
|
coverage: 0,
|
|
13410
|
-
note: "the reference iOS simulator performs this package's behavior.
|
|
13410
|
+
note: "the reference iOS simulator performs this package's behavior. Peach currently provides only this unsupported shape: isPasskeyAuthAvailable=false; register/authenticate reject. imports and API shape receive no behavior credit",
|
|
13411
13411
|
missing: "no WebAuthn in tenant worker"
|
|
13412
13412
|
}
|
|
13413
13413
|
]
|
|
@@ -13431,7 +13431,7 @@ var init_registry = __esm({
|
|
|
13431
13431
|
{
|
|
13432
13432
|
range: ">=6.0.0",
|
|
13433
13433
|
coverage: 0,
|
|
13434
|
-
note: "the reference iOS simulator performs this package's behavior.
|
|
13434
|
+
note: "the reference iOS simulator performs this package's behavior. Peach currently provides only this unsupported shape: getInitialShare=null; addNewShareListener returns subscription that never fires. imports and API shape receive no behavior credit",
|
|
13435
13435
|
missing: "no iOS Share Extension in browser"
|
|
13436
13436
|
}
|
|
13437
13437
|
]
|
|
@@ -13564,7 +13564,7 @@ var init_registry = __esm({
|
|
|
13564
13564
|
{
|
|
13565
13565
|
range: ">=21.0.0",
|
|
13566
13566
|
coverage: 0,
|
|
13567
|
-
note: "the reference iOS simulator performs this package's behavior.
|
|
13567
|
+
note: "the reference iOS simulator performs this package's behavior. Peach currently provides only this unsupported shape: native-seam only - upstream Intercom JS facade runs from the bundle; IntercomWrapper accepts registration, identity, messaging, help center, and event-listener calls without a backend session. imports and API shape receive no behavior credit",
|
|
13568
13568
|
working: "login/logout/updateUser, unread count, messenger/help-center/article/carousel/survey presentation calls, event listener registration, token/logging/display-mode setters",
|
|
13569
13569
|
missing: "no Intercom backend delivery, native messenger UI, push registration, or unread-count sync"
|
|
13570
13570
|
}
|
|
@@ -13824,7 +13824,7 @@ var init_registry = __esm({
|
|
|
13824
13824
|
{
|
|
13825
13825
|
range: ">=0.1.0",
|
|
13826
13826
|
coverage: 0.75,
|
|
13827
|
-
note: "native-seam only \u2014 upstream setWidgetData wrapper runs from the bundle; ExpoWidgets.setWidgetData is accepted with no Android widget host in
|
|
13827
|
+
note: "native-seam only \u2014 upstream setWidgetData wrapper runs from the bundle; ExpoWidgets.setWidgetData is accepted with no Android widget host in Peach",
|
|
13828
13828
|
missing: "no Android AppWidget broadcast/rendering host in the iOS-shaped browser simulator"
|
|
13829
13829
|
}
|
|
13830
13830
|
]
|
|
@@ -13903,7 +13903,7 @@ var init_registry = __esm({
|
|
|
13903
13903
|
coverage: 0.95,
|
|
13904
13904
|
note: "native-seam only \u2014 real TestFairy JS class runs from the bundle; TestFairyBridge accepts every session/feedback/logging call without session recording or delivery",
|
|
13905
13905
|
working: "begin, feedback handler toggles, identify/correlation/user attributes, checkpoints/events, screenshot/log/screen/session controls, feedback options, attachFile, network event logging",
|
|
13906
|
-
missing: "no TestFairy video/session upload backend in
|
|
13906
|
+
missing: "no TestFairy video/session upload backend in Peach"
|
|
13907
13907
|
}
|
|
13908
13908
|
]
|
|
13909
13909
|
},
|
|
@@ -13940,7 +13940,7 @@ var init_registry = __esm({
|
|
|
13940
13940
|
coverage: 0.95,
|
|
13941
13941
|
note: "native-seam only \u2014 real Bugfender JS/console facade runs from the bundle; RnBugfender accepts logging/crash/user-feedback calls with no delivery backend",
|
|
13942
13942
|
working: "init/activateLogger, device/session URL getters, log levels, sendIssue/sendCrash/sendUserFeedback, device keys, forceSendOnce, feedback UI returns the clean unavailable path",
|
|
13943
|
-
missing: "no Bugfender dashboard delivery or native feedback UI in
|
|
13943
|
+
missing: "no Bugfender dashboard delivery or native feedback UI in Peach"
|
|
13944
13944
|
}
|
|
13945
13945
|
]
|
|
13946
13946
|
},
|
|
@@ -13976,7 +13976,7 @@ var init_registry = __esm({
|
|
|
13976
13976
|
{
|
|
13977
13977
|
range: ">=1.0.0",
|
|
13978
13978
|
coverage: 0,
|
|
13979
|
-
note: "the reference iOS simulator performs this package's behavior.
|
|
13979
|
+
note: "the reference iOS simulator performs this package's behavior. Peach currently provides only this unsupported shape: native-seam only : upstream expo-module wrapper runs from the bundle; check() resolves true, matching the package web/android no-op branches where there is no iOS local-network prompt. imports and API shape receive no behavior credit",
|
|
13980
13980
|
missing: "no native iOS local-network permission dialog"
|
|
13981
13981
|
}
|
|
13982
13982
|
]
|
|
@@ -13989,7 +13989,7 @@ var init_registry = __esm({
|
|
|
13989
13989
|
range: ">=1.0.0",
|
|
13990
13990
|
coverage: 0.9,
|
|
13991
13991
|
note: "native-seam only \u2014 upstream AndroidSystemBars class runs from the bundle; SystemBars.setSystemUIVisibility is accepted as an iOS/browser no-op",
|
|
13992
|
-
missing: "Android system UI flag rendering is not applicable to
|
|
13992
|
+
missing: "Android system UI flag rendering is not applicable to Peach iOS"
|
|
13993
13993
|
}
|
|
13994
13994
|
]
|
|
13995
13995
|
},
|
|
@@ -14002,7 +14002,7 @@ var init_registry = __esm({
|
|
|
14002
14002
|
coverage: 0.7,
|
|
14003
14003
|
note: "native-seam only \u2014 upstream OTP helpers and extractOtp run from the bundle; ReactNativeOtpVerify returns an empty app signature, removes listeners, and rejects Android SMS consent/retriever starts as unavailable",
|
|
14004
14004
|
working: "getAppSignature, removeSmsListener, onSmsReceived subscription shape, pure-JS extractOtp",
|
|
14005
|
-
missing: "Android SMS Retriever / phone-number consent service is unavailable in
|
|
14005
|
+
missing: "Android SMS Retriever / phone-number consent service is unavailable in Peach iOS"
|
|
14006
14006
|
}
|
|
14007
14007
|
]
|
|
14008
14008
|
},
|
|
@@ -14103,9 +14103,9 @@ var init_registry = __esm({
|
|
|
14103
14103
|
{
|
|
14104
14104
|
range: ">=0.2.0",
|
|
14105
14105
|
coverage: 0.85,
|
|
14106
|
-
note: "native-seam only \u2014 upstream Dimensions fallback logic and exported fetch helpers run from the bundle; ReactNativeStatusBarHeight exposes
|
|
14106
|
+
note: "native-seam only \u2014 upstream Dimensions fallback logic and exported fetch helpers run from the bundle; ReactNativeStatusBarHeight exposes Peach iPhone status and bottom-safe-area constants",
|
|
14107
14107
|
working: "fetchStatusBarHeight and fetchBottomInset through upstream JS",
|
|
14108
|
-
missing: "constants are fixed to the current
|
|
14108
|
+
missing: "constants are fixed to the current Peach device rather than live device-picker updates"
|
|
14109
14109
|
}
|
|
14110
14110
|
]
|
|
14111
14111
|
},
|
|
@@ -14116,7 +14116,7 @@ var init_registry = __esm({
|
|
|
14116
14116
|
{
|
|
14117
14117
|
range: ">=1.0.0",
|
|
14118
14118
|
coverage: 0.65,
|
|
14119
|
-
note: "native-seam only \u2014 upstream exported getIcon/changeIcon functions run from the bundle; getIcon reports DefaultIcon and changeIcon rejects with the iOS NOT_SUPPORTED path because
|
|
14119
|
+
note: "native-seam only \u2014 upstream exported getIcon/changeIcon functions run from the bundle; getIcon reports DefaultIcon and changeIcon rejects with the iOS NOT_SUPPORTED path because Peach has no declared alternate app icons",
|
|
14120
14120
|
working: "getIcon returns DefaultIcon; unsupported changeIcon rejects with code IOS:NOT_SUPPORTED",
|
|
14121
14121
|
missing: "no UIApplication alternateIconName / Info.plist icon set integration"
|
|
14122
14122
|
}
|
|
@@ -14154,7 +14154,7 @@ var init_registry = __esm({
|
|
|
14154
14154
|
{
|
|
14155
14155
|
range: ">=1.0.0",
|
|
14156
14156
|
coverage: 0,
|
|
14157
|
-
note: "the reference iOS simulator displays the package splash animation.
|
|
14157
|
+
note: "the reference iOS simulator displays the package splash animation. Peach only accepts hide(), so import safety receives no behavior credit",
|
|
14158
14158
|
working: "SplashScreen.hide",
|
|
14159
14159
|
missing: "no native launch-screen Lottie overlay to dismiss"
|
|
14160
14160
|
}
|
|
@@ -14459,7 +14459,7 @@ var init_registry = __esm({
|
|
|
14459
14459
|
]
|
|
14460
14460
|
},
|
|
14461
14461
|
// ── lane A2: ranks 751-1000, native-filtered zero-scorers lifted ──
|
|
14462
|
-
// native-seam only: real package JS runs from the bundle;
|
|
14462
|
+
// native-seam only: real package JS runs from the bundle; Peach registers the
|
|
14463
14463
|
// named TurboModule/NativeModule as a structurally-correct noop.
|
|
14464
14464
|
// rudderstack device-mode analytics integrations — each is a one-line
|
|
14465
14465
|
// `NativeModules.RudderIntegration<Name>ReactNative.setup()` wrapper. delivery
|
|
@@ -14728,7 +14728,7 @@ var init_registry = __esm({
|
|
|
14728
14728
|
{
|
|
14729
14729
|
range: ">=0.1.0",
|
|
14730
14730
|
coverage: 0,
|
|
14731
|
-
note: "the reference iOS simulator performs this package's behavior.
|
|
14731
|
+
note: "the reference iOS simulator performs this package's behavior. Peach currently provides only this unsupported shape: native-seam only : the real JS runs from the bundle; the RNFIRMessaging native module is a load-safe noop (synthetic token, no events). delivery intentionally absent in the simulator. imports and API shape receive no behavior credit",
|
|
14732
14732
|
working: "getFCMToken/getAPNSToken (synthetic token), local-notification + topic + badge plumbing importable and resolve cleanly",
|
|
14733
14733
|
missing: "no real push delivery or token registration from the simulator"
|
|
14734
14734
|
}
|
|
@@ -14849,7 +14849,7 @@ var init_registry = __esm({
|
|
|
14849
14849
|
{
|
|
14850
14850
|
range: ">=1.1.2",
|
|
14851
14851
|
coverage: 0.5,
|
|
14852
|
-
note: "upstream Leaflet wrapper runs over
|
|
14852
|
+
note: "upstream Leaflet wrapper runs over Peach's partial react-native-webview seam",
|
|
14853
14853
|
working: "JavaScript wrapper, local Leaflet HTML source, WebView mounting, injected JavaScript, postMessage updates for layers, markers, shapes, center, position, and zoom, and load/message callbacks supported by the shared WebView surface",
|
|
14854
14854
|
missing: "runtime proof for Leaflet map pixels, remote map tiles, gesture interaction, local bundled-asset resolution, and the WebView gaps already listed for react-native-webview"
|
|
14855
14855
|
}
|
|
@@ -15364,7 +15364,7 @@ var init_registry = __esm({
|
|
|
15364
15364
|
{
|
|
15365
15365
|
range: ">=1.0.0",
|
|
15366
15366
|
coverage: 0.85,
|
|
15367
|
-
note: "faithful macOS-only unavailable state on
|
|
15367
|
+
note: "faithful macOS-only unavailable state on Peach iOS and Android devices",
|
|
15368
15368
|
working: "package imports safely, exports pickFile and pickDirectory, and throws its own explicit macOS-only platform error when either API is called outside macOS",
|
|
15369
15369
|
missing: "actual macOS file and directory picker, selection results, multiple selection, cancellation, bookmarks, and macOS runtime support"
|
|
15370
15370
|
}
|
|
@@ -15619,7 +15619,7 @@ var init_registry = __esm({
|
|
|
15619
15619
|
{
|
|
15620
15620
|
range: ">=2.3.0",
|
|
15621
15621
|
coverage: 0.85,
|
|
15622
|
-
note: "faithful tvOS-only unavailable state on
|
|
15622
|
+
note: "faithful tvOS-only unavailable state on Peach phone and tablet devices",
|
|
15623
15623
|
working: "package imports safely, isNativeSearchAvailable returns false, and TvosSearchView returns null unless Platform.OS is iOS and Platform.isTV is true",
|
|
15624
15624
|
missing: "tvOS SwiftUI search field, focus engine, result grid, remote-control interaction, native image loading, marquee, validation warnings, selections, and search events"
|
|
15625
15625
|
}
|
|
@@ -16231,7 +16231,7 @@ var init_registry = __esm({
|
|
|
16231
16231
|
{
|
|
16232
16232
|
range: ">=7.0.0",
|
|
16233
16233
|
coverage: 0,
|
|
16234
|
-
note: "unverified telemetry SDK delivery and replay \u2014 no
|
|
16234
|
+
note: "unverified telemetry SDK delivery and replay \u2014 no Peach-specific noop seam",
|
|
16235
16235
|
missing: "verified initialization, native crash capture, session replay, screenshots, push integration, uploads, and delivery suppression"
|
|
16236
16236
|
}
|
|
16237
16237
|
]
|
|
@@ -17054,8 +17054,8 @@ var init_registry = __esm({
|
|
|
17054
17054
|
{
|
|
17055
17055
|
range: ">=3.2.1",
|
|
17056
17056
|
coverage: 0,
|
|
17057
|
-
note: "unverified browser implementation: the package ships a substantial web recorder, but
|
|
17058
|
-
working: "no audio recording, playback, or analysis behavior is verified in
|
|
17057
|
+
note: "unverified browser implementation: the package ships a substantial web recorder, but Peach has no runtime proof for it",
|
|
17058
|
+
working: "no audio recording, playback, or analysis behavior is verified in Peach",
|
|
17059
17059
|
missing: "runtime proof for the published MediaRecorder, Web Audio, worklet, and WASM paths"
|
|
17060
17060
|
}
|
|
17061
17061
|
]
|
|
@@ -17106,7 +17106,7 @@ var init_registry = __esm({
|
|
|
17106
17106
|
{
|
|
17107
17107
|
range: ">=0.4.1",
|
|
17108
17108
|
coverage: 0,
|
|
17109
|
-
note: "unverified text transformation control: native and DOM-specific implementations ship, but neither has
|
|
17109
|
+
note: "unverified text transformation control: native and DOM-specific implementations ship, but neither has Peach runtime proof",
|
|
17110
17110
|
working: "formatters are plain JavaScript, but the input and caret behavior is not verified",
|
|
17111
17111
|
missing: "verified formatted input updates, selection preservation, worklet execution, and decorator view behavior"
|
|
17112
17112
|
}
|
|
@@ -17248,7 +17248,7 @@ var init_registry = __esm({
|
|
|
17248
17248
|
{
|
|
17249
17249
|
range: ">=11.0.5",
|
|
17250
17250
|
coverage: 0,
|
|
17251
|
-
note: "unsupported CodePush fork:
|
|
17251
|
+
note: "unsupported CodePush fork: Peach's existing package stub does not apply to this package name",
|
|
17252
17252
|
working: "no OTA lifecycle behavior is verified",
|
|
17253
17253
|
missing: "CodePush native module loading, update checks, download, install, restart control, metadata, and events"
|
|
17254
17254
|
}
|
|
@@ -17585,7 +17585,7 @@ var init_registry = __esm({
|
|
|
17585
17585
|
{
|
|
17586
17586
|
range: ">=0.8.4",
|
|
17587
17587
|
coverage: 0.7,
|
|
17588
|
-
note: "browser-backed WebGPU canvas: real GPU contexts render and present through the
|
|
17588
|
+
note: "browser-backed WebGPU canvas: real GPU contexts render and present through the Peach canvas",
|
|
17589
17589
|
working: "WebGPUModule install, navigator.gpu, Canvas contexts, WebGPUView presentation, encoded-image createImageBitmap, hooks, and offscreen WebGPU",
|
|
17590
17590
|
missing: "destroyContext cleanup and native pointer/video interop through importDevice, adoptTexture, loadVideoFrame, createVideoPlayer, and native-buffer frame helpers"
|
|
17591
17591
|
}
|
|
@@ -18150,7 +18150,7 @@ var init_registry = __esm({
|
|
|
18150
18150
|
{
|
|
18151
18151
|
range: ">=0.0.5",
|
|
18152
18152
|
coverage: 0,
|
|
18153
|
-
note: "unsupported: configure is load-safe but
|
|
18153
|
+
note: "unsupported: configure is load-safe but Peach does not draw the native iOS touch visualization",
|
|
18154
18154
|
missing: "ShowTime touch circles, fill and stroke styling, force visualization, multi-tap labels, Pencil filtering, timing, and window-level gesture observation"
|
|
18155
18155
|
}
|
|
18156
18156
|
]
|
|
@@ -18831,7 +18831,7 @@ function scanDepsWithData(pkg, data) {
|
|
|
18831
18831
|
version,
|
|
18832
18832
|
coverage: null,
|
|
18833
18833
|
status: "auto-stub",
|
|
18834
|
-
note: "not yet verified; it may work through
|
|
18834
|
+
note: "not yet verified; it may work through peach's generic native seam",
|
|
18835
18835
|
rnx
|
|
18836
18836
|
});
|
|
18837
18837
|
continue;
|
|
@@ -19125,16 +19125,16 @@ function resolveSootsimBridgePortForRuntimeLocation(input = {}) {
|
|
|
19125
19125
|
function resolveSootsimWebSocketProxyUrl(input) {
|
|
19126
19126
|
const pageUrl = parseHrefUrl(input.href);
|
|
19127
19127
|
if (!pageUrl || pageUrl.protocol !== "http:" && pageUrl.protocol !== "https:") {
|
|
19128
|
-
throw new Error(`invalid
|
|
19128
|
+
throw new Error(`invalid peach websocket proxy page URL: ${input.href}`);
|
|
19129
19129
|
}
|
|
19130
19130
|
let targetUrl;
|
|
19131
19131
|
try {
|
|
19132
19132
|
targetUrl = new URL(input.targetUrl);
|
|
19133
19133
|
} catch {
|
|
19134
|
-
throw new Error(`invalid
|
|
19134
|
+
throw new Error(`invalid peach websocket proxy target URL: ${input.targetUrl}`);
|
|
19135
19135
|
}
|
|
19136
19136
|
if (targetUrl.protocol !== "ws:" && targetUrl.protocol !== "wss:") {
|
|
19137
|
-
throw new Error(`invalid
|
|
19137
|
+
throw new Error(`invalid peach websocket proxy target URL: ${input.targetUrl}`);
|
|
19138
19138
|
}
|
|
19139
19139
|
const proxyUrl = new URL("/__websocket-proxy", pageUrl);
|
|
19140
19140
|
proxyUrl.protocol = pageUrl.protocol === "https:" ? "wss:" : "ws:";
|
|
@@ -20250,6 +20250,7 @@ async function probePort(port, buildIconProxyUrl, listeningProcess) {
|
|
|
20250
20250
|
function isSootSimSelfServer(server) {
|
|
20251
20251
|
const bundleId = server.bundleId?.trim().toLowerCase();
|
|
20252
20252
|
if (bundleId?.startsWith("dev.sootsim.")) return true;
|
|
20253
|
+
if (bundleId?.startsWith("dev.peachsim.")) return true;
|
|
20253
20254
|
return false;
|
|
20254
20255
|
}
|
|
20255
20256
|
function invalidatePortCache(port) {
|
|
@@ -20424,11 +20425,11 @@ var name, rnxPublicBrand;
|
|
|
20424
20425
|
var init_public_brand = __esm({
|
|
20425
20426
|
"src/public-brand.ts"() {
|
|
20426
20427
|
"use strict";
|
|
20427
|
-
name = "
|
|
20428
|
+
name = "Peach";
|
|
20428
20429
|
rnxPublicBrand = Object.freeze({
|
|
20429
20430
|
name,
|
|
20430
20431
|
packageName: "peachsim",
|
|
20431
|
-
commandName: "
|
|
20432
|
+
commandName: "peach",
|
|
20432
20433
|
domain: "rnxsim.com",
|
|
20433
20434
|
origin: "https://rnxsim.com"
|
|
20434
20435
|
});
|
|
@@ -20438,8 +20439,8 @@ var init_public_brand = __esm({
|
|
|
20438
20439
|
// src/cli-version.ts
|
|
20439
20440
|
function getCliVersion() {
|
|
20440
20441
|
if (cached2 != null) return cached2;
|
|
20441
|
-
if (typeof
|
|
20442
|
-
cached2 =
|
|
20442
|
+
if (typeof __PEACH_CLI_VERSION__ !== "undefined" && typeof __PEACH_CLI_VERSION__ === "string" && __PEACH_CLI_VERSION__) {
|
|
20443
|
+
cached2 = __PEACH_CLI_VERSION__;
|
|
20443
20444
|
return cached2;
|
|
20444
20445
|
}
|
|
20445
20446
|
const candidates = [
|
|
@@ -20480,7 +20481,7 @@ __export(home_paths_exports, {
|
|
|
20480
20481
|
DAEMON_HEARTBEAT_STALE_MS: () => DAEMON_HEARTBEAT_STALE_MS,
|
|
20481
20482
|
DAEMON_LOCKFILE: () => DAEMON_LOCKFILE,
|
|
20482
20483
|
DEV_BRIDGES_DIR: () => DEV_BRIDGES_DIR,
|
|
20483
|
-
|
|
20484
|
+
PEACH_HOME_ENV: () => PEACH_HOME_ENV,
|
|
20484
20485
|
activeRuntimeDir: () => activeRuntimeDir,
|
|
20485
20486
|
activeRuntimeFile: () => activeRuntimeFile,
|
|
20486
20487
|
cacheDir: () => cacheDir,
|
|
@@ -20531,9 +20532,9 @@ __export(home_paths_exports, {
|
|
|
20531
20532
|
writeSharedConfig: () => writeSharedConfig
|
|
20532
20533
|
});
|
|
20533
20534
|
function rnxHomeDir() {
|
|
20534
|
-
const override = process.env[
|
|
20535
|
+
const override = process.env[PEACH_HOME_ENV];
|
|
20535
20536
|
if (override && override.length > 0) return import_node_path4.default.resolve(override);
|
|
20536
|
-
return import_node_path4.default.join((0, import_node_os.homedir)(), ".
|
|
20537
|
+
return import_node_path4.default.join((0, import_node_os.homedir)(), ".peach");
|
|
20537
20538
|
}
|
|
20538
20539
|
function isSootsimDevCheckout() {
|
|
20539
20540
|
if (process.env.SOOTSIM_FORCE_DAEMON_INSTALL === "1") return false;
|
|
@@ -20544,7 +20545,7 @@ function isSootsimDevCheckout() {
|
|
|
20544
20545
|
if (!argv1) return false;
|
|
20545
20546
|
try {
|
|
20546
20547
|
const real = import_node_fs4.default.realpathSync(argv1);
|
|
20547
|
-
return real.includes(`${import_node_path4.default.sep}packages${import_node_path4.default.sep}
|
|
20548
|
+
return real.includes(`${import_node_path4.default.sep}packages${import_node_path4.default.sep}peachsim${import_node_path4.default.sep}`);
|
|
20548
20549
|
} catch {
|
|
20549
20550
|
return false;
|
|
20550
20551
|
}
|
|
@@ -20584,10 +20585,10 @@ function daemonAppDir() {
|
|
|
20584
20585
|
return import_node_path4.default.join(rnxHomeDir(), "daemon-app");
|
|
20585
20586
|
}
|
|
20586
20587
|
function daemonAppBundlePath() {
|
|
20587
|
-
return import_node_path4.default.join(daemonAppDir(), "
|
|
20588
|
+
return import_node_path4.default.join(daemonAppDir(), "Peach Daemon.app");
|
|
20588
20589
|
}
|
|
20589
20590
|
function daemonAppLauncherPath() {
|
|
20590
|
-
return import_node_path4.default.join(daemonAppBundlePath(), "Contents", "MacOS", "
|
|
20591
|
+
return import_node_path4.default.join(daemonAppBundlePath(), "Contents", "MacOS", "peach-daemon");
|
|
20591
20592
|
}
|
|
20592
20593
|
function cacheDir() {
|
|
20593
20594
|
return import_node_path4.default.join(rnxHomeDir(), "cache");
|
|
@@ -20839,10 +20840,10 @@ function writeDaemonLockfile(data) {
|
|
|
20839
20840
|
const existing = readDaemonLockfile();
|
|
20840
20841
|
if (!existing) {
|
|
20841
20842
|
if (createDaemonLockfileExclusive(data)) return;
|
|
20842
|
-
throw new Error("another
|
|
20843
|
+
throw new Error("another peach daemon claimed the lockfile before this write");
|
|
20843
20844
|
}
|
|
20844
20845
|
if (!sameDaemonOwner(existing, data)) {
|
|
20845
|
-
throw new Error("refusing to overwrite another
|
|
20846
|
+
throw new Error("refusing to overwrite another peach daemon lockfile");
|
|
20846
20847
|
}
|
|
20847
20848
|
const tmp = `${lockfilePath}.${data.pid}.${(0, import_node_crypto.randomUUID)()}.tmp`;
|
|
20848
20849
|
import_node_fs4.default.writeFileSync(tmp, `${JSON.stringify(data, null, 2)}
|
|
@@ -20850,7 +20851,7 @@ function writeDaemonLockfile(data) {
|
|
|
20850
20851
|
try {
|
|
20851
20852
|
const current = readDaemonLockfile();
|
|
20852
20853
|
if (!current || !sameDaemonOwner(current, data)) {
|
|
20853
|
-
throw new Error("
|
|
20854
|
+
throw new Error("peach daemon lock ownership changed during heartbeat");
|
|
20854
20855
|
}
|
|
20855
20856
|
import_node_fs4.default.renameSync(tmp, lockfilePath);
|
|
20856
20857
|
} finally {
|
|
@@ -21005,7 +21006,7 @@ function removeDevBridgeLockfile(owner) {
|
|
|
21005
21006
|
} catch {
|
|
21006
21007
|
}
|
|
21007
21008
|
}
|
|
21008
|
-
var import_node_crypto, import_node_fs4, import_node_os, import_node_path4,
|
|
21009
|
+
var import_node_crypto, import_node_fs4, import_node_os, import_node_path4, PEACH_HOME_ENV, ACTIVE_RUNTIME_FILE, DAEMON_LOCKFILE, DEV_BRIDGES_DIR, CONFIG_FILE, CLI_UPDATE_FILE, DAEMON_HEARTBEAT_STALE_MS, CURRENT_ONBOARDING_VERSION, DAEMON_LOCKFILE_MAX_BYTES, DAEMON_CLAIM_STALE_MS;
|
|
21009
21010
|
var init_home_paths = __esm({
|
|
21010
21011
|
"src/home-paths.ts"() {
|
|
21011
21012
|
"use strict";
|
|
@@ -21013,7 +21014,7 @@ var init_home_paths = __esm({
|
|
|
21013
21014
|
import_node_fs4 = __toESM(require("node:fs"), 1);
|
|
21014
21015
|
import_node_os = require("node:os");
|
|
21015
21016
|
import_node_path4 = __toESM(require("node:path"), 1);
|
|
21016
|
-
|
|
21017
|
+
PEACH_HOME_ENV = "PEACH_HOME";
|
|
21017
21018
|
ACTIVE_RUNTIME_FILE = "active";
|
|
21018
21019
|
DAEMON_LOCKFILE = "daemon.json";
|
|
21019
21020
|
DEV_BRIDGES_DIR = "dev-bridges";
|
|
@@ -21464,7 +21465,7 @@ function findMonorepoRoot() {
|
|
|
21464
21465
|
return null;
|
|
21465
21466
|
}
|
|
21466
21467
|
function resolveDevCheckoutRuntimeRoot() {
|
|
21467
|
-
if (process.env.
|
|
21468
|
+
if (process.env.PEACH_HOME && readActiveRuntime()) return null;
|
|
21468
21469
|
const root = findMonorepoRoot();
|
|
21469
21470
|
if (!root) return null;
|
|
21470
21471
|
const devBuild = import_path.default.join(root, "public/sootsim");
|
|
@@ -21485,11 +21486,11 @@ function resolveActiveRuntimeRoot() {
|
|
|
21485
21486
|
function runtimeVersionHostname(version) {
|
|
21486
21487
|
const trimmed = version.trim();
|
|
21487
21488
|
if (!isValidRuntimeVersion(trimmed)) {
|
|
21488
|
-
throw new Error(`invalid
|
|
21489
|
+
throw new Error(`invalid peach runtime version: ${version}`);
|
|
21489
21490
|
}
|
|
21490
21491
|
const encoded = Buffer.from(trimmed, "utf8").toString("hex");
|
|
21491
21492
|
const labels = encoded.match(/.{1,60}/g);
|
|
21492
|
-
if (!labels) throw new Error(`invalid
|
|
21493
|
+
if (!labels) throw new Error(`invalid peach runtime version: ${version}`);
|
|
21493
21494
|
return `${labels.join(".")}${RUNTIME_VERSION_HOSTNAME_SUFFIX}`;
|
|
21494
21495
|
}
|
|
21495
21496
|
function isRuntimeVersionHostname(hostname) {
|
|
@@ -21545,7 +21546,7 @@ var init_runtime_delivery = __esm({
|
|
|
21545
21546
|
RNX_CHANGELOG_URL = `${rnxPublicBrand.origin}/changelog`;
|
|
21546
21547
|
RNX_CHANGELOG_API_URL = "https://contrast.dev/api/changelog/sootsim";
|
|
21547
21548
|
RNX_RUNTIME_PRODUCT = {
|
|
21548
|
-
id: "
|
|
21549
|
+
id: "peach",
|
|
21549
21550
|
defaultCdnOrigin: DEFAULT_RUNTIME_CDN_ORIGIN,
|
|
21550
21551
|
manifestPath: "/runtimes/manifest.json",
|
|
21551
21552
|
tarballPath: (version) => `/runtimes/sootsim-runtime-${version}.tar.gz`,
|
|
@@ -21554,8 +21555,8 @@ var init_runtime_delivery = __esm({
|
|
|
21554
21555
|
// vite/metro plugins serve, so its absence means the tarball is not one.
|
|
21555
21556
|
installedMarker: "index.html",
|
|
21556
21557
|
env: {
|
|
21557
|
-
cdnOrigin: "
|
|
21558
|
-
channel: "
|
|
21558
|
+
cdnOrigin: "PEACH_CDN_ORIGIN",
|
|
21559
|
+
channel: "PEACH_RUNTIME_CHANNEL"
|
|
21559
21560
|
},
|
|
21560
21561
|
ensureHome: ensureRnxHome,
|
|
21561
21562
|
configFile: configFilePath,
|
|
@@ -21977,8 +21978,8 @@ function pidIsAlive(pid, sessionId) {
|
|
|
21977
21978
|
return true;
|
|
21978
21979
|
}
|
|
21979
21980
|
function resolveSootsimInvocation() {
|
|
21980
|
-
if (process.env.
|
|
21981
|
-
return { executable: process.env.
|
|
21981
|
+
if (process.env.PEACH_BIN) {
|
|
21982
|
+
return { executable: process.env.PEACH_BIN, prefixArgs: [] };
|
|
21982
21983
|
}
|
|
21983
21984
|
if (IS_STANDALONE) return rnxSelfInvocation();
|
|
21984
21985
|
if (process.versions.electron) {
|
|
@@ -22000,14 +22001,14 @@ function resolveSootsimInvocation() {
|
|
|
22000
22001
|
return { executable: process.argv[0], prefixArgs: [argv1] };
|
|
22001
22002
|
}
|
|
22002
22003
|
throw new Error(
|
|
22003
|
-
"
|
|
22004
|
+
"peach CLI not found. set PEACH_BIN to the path of the peach binary, or build the workspace CLI via `bun run --cwd packages/peachsim build:cli`."
|
|
22004
22005
|
);
|
|
22005
22006
|
}
|
|
22006
22007
|
function tryWorkspaceSootsim() {
|
|
22007
22008
|
try {
|
|
22008
22009
|
const sootsimDir = resolveSootsimPackageDir();
|
|
22009
22010
|
if (!sootsimDir) return null;
|
|
22010
|
-
const binaryName = `
|
|
22011
|
+
const binaryName = `peach-${process.platform === "win32" ? "windows" : process.platform}-${process.arch}${process.platform === "win32" ? ".exe" : ""}`;
|
|
22011
22012
|
const distBinary = import_node_path9.default.join(sootsimDir, "dist-bin", binaryName);
|
|
22012
22013
|
if (import_node_fs9.default.existsSync(distBinary)) return { executable: distBinary, prefixArgs: [] };
|
|
22013
22014
|
const distBin = import_node_path9.default.join(sootsimDir, "dist-cli", "bin.js");
|
|
@@ -22019,7 +22020,7 @@ function tryWorkspaceSootsim() {
|
|
|
22019
22020
|
const buildMtime = import_node_fs9.default.statSync(distBin).mtimeMs;
|
|
22020
22021
|
if (buildMtime < srcMtime) {
|
|
22021
22022
|
console.warn(
|
|
22022
|
-
`[
|
|
22023
|
+
`[peach] dist-cli/bin.js is older than agent-wrapper.ts \u2014 rebuild with \`bun run --cwd packages/peachsim build:cli\`.`
|
|
22023
22024
|
);
|
|
22024
22025
|
}
|
|
22025
22026
|
}
|
|
@@ -22164,7 +22165,7 @@ async function startSession(opts) {
|
|
|
22164
22165
|
if (existingLive) {
|
|
22165
22166
|
throw new AgentSessionError(
|
|
22166
22167
|
"ALREADY_RUNNING",
|
|
22167
|
-
`session already running for project=${project.id} provider=${provider} (session ${existingLive.id}, pid ${existingLive.wrapperPid}). end it first with \`
|
|
22168
|
+
`session already running for project=${project.id} provider=${provider} (session ${existingLive.id}, pid ${existingLive.wrapperPid}). end it first with \`peach agent end <sessionId>\`.`
|
|
22168
22169
|
);
|
|
22169
22170
|
}
|
|
22170
22171
|
const claudeSessionUuid = provider === "claude" ? (0, import_node_crypto4.randomUUID)() : void 0;
|
|
@@ -22506,7 +22507,7 @@ var init_agent_host = __esm({
|
|
|
22506
22507
|
// every session.
|
|
22507
22508
|
sessionsBySocket = /* @__PURE__ */ new Map();
|
|
22508
22509
|
// every connected socket (regardless of role) — gets session-status
|
|
22509
|
-
// pushes so a CLI `
|
|
22510
|
+
// pushes so a CLI `peach agent sessions --watch` can react to state
|
|
22510
22511
|
// changes driven by another client.
|
|
22511
22512
|
allSockets = /* @__PURE__ */ new Set();
|
|
22512
22513
|
// agent wrappers also emit prompt-received from the FIFO reader, but the
|
|
@@ -23815,7 +23816,7 @@ var init_plane_host = __esm({
|
|
|
23815
23816
|
const root = this.realRoot(String(msg.root ?? ""));
|
|
23816
23817
|
if (!this.registered.has(root)) {
|
|
23817
23818
|
throw new PlaneNotRegisteredError(
|
|
23818
|
-
`no box has registered ${root}; start one with \`
|
|
23819
|
+
`no box has registered ${root}; start one with \`peach box\` there`
|
|
23819
23820
|
);
|
|
23820
23821
|
}
|
|
23821
23822
|
const existingId = this.byRoot.get(root);
|
|
@@ -24017,7 +24018,7 @@ function unsupportedSpecifier(specifier) {
|
|
|
24017
24018
|
);
|
|
24018
24019
|
}
|
|
24019
24020
|
function bridgeDeclaration(name2, specifier) {
|
|
24020
|
-
const notReady = (what) => JSON.stringify(`[
|
|
24021
|
+
const notReady = (what) => JSON.stringify(`[peach] replacement ${what} bridge is not ready`);
|
|
24021
24022
|
if (specifier === "react") {
|
|
24022
24023
|
return `const ${name2} = ${REACT_BRIDGE}; if (!${name2}) throw new Error(${notReady("React")});`;
|
|
24023
24024
|
}
|
|
@@ -24025,12 +24026,12 @@ function bridgeDeclaration(name2, specifier) {
|
|
|
24025
24026
|
return `const ${name2} = ${REACT_NATIVE_BRIDGE}; if (!${name2}) throw new Error(${notReady("React Native")});`;
|
|
24026
24027
|
}
|
|
24027
24028
|
if (isContrastKitSpecifier(specifier)) {
|
|
24028
|
-
return `const ${name2} = (globalThis.__contrast_kit_modules && globalThis.__contrast_kit_modules[${JSON.stringify(specifier)}]) || (${PACKAGE_BRIDGES} || {})[${JSON.stringify(specifier)}]; if (!${name2}) throw new Error(${JSON.stringify(`[
|
|
24029
|
+
return `const ${name2} = (globalThis.__contrast_kit_modules && globalThis.__contrast_kit_modules[${JSON.stringify(specifier)}]) || (${PACKAGE_BRIDGES} || {})[${JSON.stringify(specifier)}]; if (!${name2}) throw new Error(${JSON.stringify(`[peach] replacement package bridge ${specifier} is not ready`)});`;
|
|
24029
24030
|
}
|
|
24030
24031
|
if (JSX_RUNTIME_SPECIFIERS.has(specifier)) {
|
|
24031
24032
|
return `const ${name2} = (() => { const react = ${REACT_BRIDGE}; if (!react) throw new Error(${notReady("React")}); const jsx = (type, props, key) => react.createElement(type, key === undefined ? props : { ...props, key }); return { Fragment: react.Fragment, jsx, jsxs: jsx, jsxDEV: jsx }; })();`;
|
|
24032
24033
|
}
|
|
24033
|
-
return `const ${name2} = (${PACKAGE_BRIDGES} || {})[${JSON.stringify(specifier)}]; if (!${name2}) throw new Error(${JSON.stringify(`[
|
|
24034
|
+
return `const ${name2} = (${PACKAGE_BRIDGES} || {})[${JSON.stringify(specifier)}]; if (!${name2}) throw new Error(${JSON.stringify(`[peach] replacement package bridge ${specifier} is not ready`)});`;
|
|
24034
24035
|
}
|
|
24035
24036
|
function compileReplacementModule(input) {
|
|
24036
24037
|
const transformed = (0, import_dist.transform)(input.source, {
|
|
@@ -24206,7 +24207,7 @@ function sendJavaScript(req, res, source) {
|
|
|
24206
24207
|
function isReplacementModuleRequestUrl(rawUrl) {
|
|
24207
24208
|
if (!rawUrl) return false;
|
|
24208
24209
|
try {
|
|
24209
|
-
const pathname = new URL(rawUrl, "http://
|
|
24210
|
+
const pathname = new URL(rawUrl, "http://peach.local").pathname;
|
|
24210
24211
|
return pathname === REPLACEMENT_MODULE_ROUTE;
|
|
24211
24212
|
} catch {
|
|
24212
24213
|
return false;
|
|
@@ -24216,7 +24217,7 @@ async function handleReplacementModuleRequest(req, res, options = {}) {
|
|
|
24216
24217
|
const rawUrl = req.url || "";
|
|
24217
24218
|
let url;
|
|
24218
24219
|
try {
|
|
24219
|
-
url = new URL(rawUrl, "http://
|
|
24220
|
+
url = new URL(rawUrl, "http://peach.local");
|
|
24220
24221
|
} catch {
|
|
24221
24222
|
return false;
|
|
24222
24223
|
}
|
|
@@ -24700,7 +24701,7 @@ var init_run_rnx = __esm({
|
|
|
24700
24701
|
RnxExit = class extends Error {
|
|
24701
24702
|
code;
|
|
24702
24703
|
constructor(code) {
|
|
24703
|
-
super(`
|
|
24704
|
+
super(`peach exited with code ${code}`);
|
|
24704
24705
|
this.name = "RnxExit";
|
|
24705
24706
|
this.code = code;
|
|
24706
24707
|
}
|
|
@@ -24749,7 +24750,7 @@ function isCliApiKeySecret(secret) {
|
|
|
24749
24750
|
return secret.startsWith("sk_rnx_");
|
|
24750
24751
|
}
|
|
24751
24752
|
function readApiKeyFromEnv() {
|
|
24752
|
-
const envName = "
|
|
24753
|
+
const envName = "PEACH_API_KEY";
|
|
24753
24754
|
const secret = process.env[envName]?.trim();
|
|
24754
24755
|
return secret && isCliApiKeySecret(secret) ? { secret, envName } : null;
|
|
24755
24756
|
}
|
|
@@ -24803,11 +24804,11 @@ function authHeaderOrExit(commandLabel) {
|
|
|
24803
24804
|
if (auth) return { auth, header: authHeaderValue(auth) };
|
|
24804
24805
|
process.stderr.write(
|
|
24805
24806
|
`
|
|
24806
|
-
|
|
24807
|
+
peach needs to be authenticated.
|
|
24807
24808
|
|
|
24808
24809
|
pick one:
|
|
24809
|
-
\u2022 run \`
|
|
24810
|
-
\u2022 set
|
|
24810
|
+
\u2022 run \`peach login\` to sign in with your GH account
|
|
24811
|
+
\u2022 set PEACH_API_KEY=sk_rnx_... (recommended for CI)
|
|
24811
24812
|
|
|
24812
24813
|
`
|
|
24813
24814
|
);
|
|
@@ -24820,7 +24821,7 @@ var init_auth = __esm({
|
|
|
24820
24821
|
init_shared_session();
|
|
24821
24822
|
init_run_rnx();
|
|
24822
24823
|
GITHUB_TOKEN_PREFIXES = ["ghs_", "ghp_", "gho_", "ghu_", "github_pat_"];
|
|
24823
|
-
CHOOSE_ACCOUNT_HINT = "this sign-in belongs to several accounts; run `
|
|
24824
|
+
CHOOSE_ACCOUNT_HINT = "this sign-in belongs to several accounts; run `peach login --account <name>` to choose the one to bill";
|
|
24824
24825
|
}
|
|
24825
24826
|
});
|
|
24826
24827
|
|
|
@@ -26204,7 +26205,7 @@ async function assertSelfContainedMetroArtifactAssets(bundle) {
|
|
|
26204
26205
|
descriptors = extractAssetDescriptors(bundle);
|
|
26205
26206
|
} catch (error) {
|
|
26206
26207
|
throw new Error(
|
|
26207
|
-
`
|
|
26208
|
+
`peach ios --remote bundle is not self-contained: ${error instanceof Error ? error.message : String(error)}`
|
|
26208
26209
|
);
|
|
26209
26210
|
}
|
|
26210
26211
|
let variants = 0;
|
|
@@ -26217,7 +26218,7 @@ async function assertSelfContainedMetroArtifactAssets(bundle) {
|
|
|
26217
26218
|
const hashes = descriptor.fileHashes;
|
|
26218
26219
|
if (!uris || !hashes || uris.length !== descriptor.scales.length || hashes.length !== descriptor.scales.length) {
|
|
26219
26220
|
throw new Error(
|
|
26220
|
-
`
|
|
26221
|
+
`peach ios --remote bundle is not self-contained: ${label} does not embed every scale variant`
|
|
26221
26222
|
);
|
|
26222
26223
|
}
|
|
26223
26224
|
const prefix = `data:${metroAssetContentType(descriptor.type)};base64,`;
|
|
@@ -26226,7 +26227,7 @@ async function assertSelfContainedMetroArtifactAssets(bundle) {
|
|
|
26226
26227
|
const expectedHash = hashes[index];
|
|
26227
26228
|
if (!uri.startsWith(prefix) || !/^[a-f0-9]{64}$/.test(expectedHash)) {
|
|
26228
26229
|
throw new Error(
|
|
26229
|
-
`
|
|
26230
|
+
`peach ios --remote bundle is not self-contained: ${label} scale ${descriptor.scales[index]} is not content-addressed embedded data`
|
|
26230
26231
|
);
|
|
26231
26232
|
}
|
|
26232
26233
|
let decoded;
|
|
@@ -26235,12 +26236,12 @@ async function assertSelfContainedMetroArtifactAssets(bundle) {
|
|
|
26235
26236
|
decoded = Uint8Array.from(binary, (character) => character.charCodeAt(0));
|
|
26236
26237
|
} catch {
|
|
26237
26238
|
throw new Error(
|
|
26238
|
-
`
|
|
26239
|
+
`peach ios --remote bundle is not self-contained: ${label} scale ${descriptor.scales[index]} has invalid embedded data`
|
|
26239
26240
|
);
|
|
26240
26241
|
}
|
|
26241
26242
|
if (await sha256HexBytes(decoded) !== expectedHash) {
|
|
26242
26243
|
throw new Error(
|
|
26243
|
-
`
|
|
26244
|
+
`peach ios --remote bundle is not self-contained: ${label} scale ${descriptor.scales[index]} bytes do not match their content hash`
|
|
26244
26245
|
);
|
|
26245
26246
|
}
|
|
26246
26247
|
variants++;
|
|
@@ -26363,13 +26364,13 @@ async function embedMetroAssetFiles(bundle, read) {
|
|
|
26363
26364
|
}
|
|
26364
26365
|
if (loaded.size === 0) {
|
|
26365
26366
|
throw new Error(
|
|
26366
|
-
`
|
|
26367
|
+
`peach ios --remote found no scale of ${site.descriptor.name}.${site.descriptor.type} in the asset dest graph for ${site.descriptor.httpServerLocation}`
|
|
26367
26368
|
);
|
|
26368
26369
|
}
|
|
26369
26370
|
const scales = [...loaded.keys()].sort((left, right) => left - right);
|
|
26370
26371
|
if (scales.length !== site.descriptor.scales.length && !site.scalesSpan) {
|
|
26371
26372
|
throw new Error(
|
|
26372
|
-
`
|
|
26373
|
+
`peach ios --remote could not narrow the scales of ${site.descriptor.name}.${site.descriptor.type} because its descriptor declares none`
|
|
26373
26374
|
);
|
|
26374
26375
|
}
|
|
26375
26376
|
let descriptorBytes = 0;
|
|
@@ -26401,7 +26402,7 @@ async function embedMetroAssetFiles(bundle, read) {
|
|
|
26401
26402
|
const code = parts.join("");
|
|
26402
26403
|
if (countNewlines(code) !== countNewlines(bundle)) {
|
|
26403
26404
|
throw new Error(
|
|
26404
|
-
"
|
|
26405
|
+
"peach Cloud asset embedding changed the bundle line count, which invalidates its source map"
|
|
26405
26406
|
);
|
|
26406
26407
|
}
|
|
26407
26408
|
return {
|
|
@@ -26556,11 +26557,11 @@ async function minify(code, sourceLine, options, withMap) {
|
|
|
26556
26557
|
...withMap ? { sourceMap: true } : {}
|
|
26557
26558
|
});
|
|
26558
26559
|
if (typeof result.code !== "string") {
|
|
26559
|
-
throw new Error(`
|
|
26560
|
+
throw new Error(`peach Cloud could not re-print the statement at line ${sourceLine}`);
|
|
26560
26561
|
}
|
|
26561
26562
|
const map = withMap && typeof result.map === "string" ? result.map : null;
|
|
26562
26563
|
if (withMap && map === null) {
|
|
26563
|
-
throw new Error(`
|
|
26564
|
+
throw new Error(`peach Cloud got no source map for the statement at line ${sourceLine}`);
|
|
26564
26565
|
}
|
|
26565
26566
|
return { code: result.code.trimEnd(), map, sourceLine };
|
|
26566
26567
|
}
|
|
@@ -26570,7 +26571,7 @@ async function minifyDefine(statement, moduleId, sourceLine, options, developmen
|
|
|
26570
26571
|
const define = layout.statements[0];
|
|
26571
26572
|
if (layout.statements.length !== 1 || define?.kind !== "define") {
|
|
26572
26573
|
throw new Error(
|
|
26573
|
-
`
|
|
26574
|
+
`peach Cloud could not re-read module ${moduleId} after minification: the minifier emitted ${layout.statements.length} statements rather than one \`__d(\` call.`
|
|
26574
26575
|
);
|
|
26575
26576
|
}
|
|
26576
26577
|
const factory = piece.code.slice(define.factory.start, define.factory.end);
|
|
@@ -26632,7 +26633,7 @@ async function buildRnxCloudArtifact(bundle, options = {}) {
|
|
|
26632
26633
|
const layout = (0, import_metro_production_bundle.readRNXMetroBundleLayout)(identity.source);
|
|
26633
26634
|
if (layout.moduleIdFailures > 0) {
|
|
26634
26635
|
throw new Error(
|
|
26635
|
-
`
|
|
26636
|
+
`peach Cloud could not read ${layout.moduleIdFailures} Metro module IDs from the bundle`
|
|
26636
26637
|
);
|
|
26637
26638
|
}
|
|
26638
26639
|
(0, import_metro_production_bundle.validateRNXMetroModulePaths)(identity.source, identity.modulePaths);
|
|
@@ -26722,8 +26723,8 @@ var init_metroCloudArtifact = __esm({
|
|
|
26722
26723
|
import_terser = require("terser");
|
|
26723
26724
|
init_metroAssetArtifact();
|
|
26724
26725
|
init_metroDebugSourceMap();
|
|
26725
|
-
MODULE_PATHS_REQUIRED = "
|
|
26726
|
-
SOURCE_MAP_REQUIRED = "
|
|
26726
|
+
MODULE_PATHS_REQUIRED = "peach Cloud requires a Metro bundle carrying rnx module identity. Build it through the published Metro plugin: withRNX(config).";
|
|
26727
|
+
SOURCE_MAP_REQUIRED = "peach Cloud development artifacts require the Metro source map for the bundle. Build it with --sourcemap-output, or serve the bundle with an inline source map.";
|
|
26727
26728
|
MINIFY_OPTIONS = {
|
|
26728
26729
|
ecma: 2020,
|
|
26729
26730
|
compress: false,
|
|
@@ -27818,7 +27819,7 @@ function createCloudBoxSession(input) {
|
|
|
27818
27819
|
function parseCloudSession(encoded) {
|
|
27819
27820
|
const value = encoded.trim();
|
|
27820
27821
|
if (!value || value.length > MAX_ENCODED_SESSION_BYTES || !/^[A-Za-z0-9_-]+$/.test(value)) {
|
|
27821
|
-
throw new Error(`${
|
|
27822
|
+
throw new Error(`${PEACH_CLOUD_SESSION_ENV} is invalid`);
|
|
27822
27823
|
}
|
|
27823
27824
|
let parsed;
|
|
27824
27825
|
try {
|
|
@@ -27828,14 +27829,14 @@ function parseCloudSession(encoded) {
|
|
|
27828
27829
|
}
|
|
27829
27830
|
parsed = JSON.parse(new TextDecoder("utf-8", { fatal: true }).decode(bytes));
|
|
27830
27831
|
} catch {
|
|
27831
|
-
throw new Error(`${
|
|
27832
|
+
throw new Error(`${PEACH_CLOUD_SESSION_ENV} is invalid`);
|
|
27832
27833
|
}
|
|
27833
27834
|
if (!isRecord4(parsed) || parsed.version !== CLOUD_SESSION_VERSION) {
|
|
27834
|
-
throw new Error(`${
|
|
27835
|
+
throw new Error(`${PEACH_CLOUD_SESSION_ENV} is invalid`);
|
|
27835
27836
|
}
|
|
27836
27837
|
const apiOrigin = parsed.apiOrigin;
|
|
27837
27838
|
if (typeof apiOrigin !== "string") {
|
|
27838
|
-
throw new Error(`${
|
|
27839
|
+
throw new Error(`${PEACH_CLOUD_SESSION_ENV} is invalid`);
|
|
27839
27840
|
}
|
|
27840
27841
|
const platform = parsed.platform === "ios" || parsed.platform === "android" ? parsed.platform : void 0;
|
|
27841
27842
|
const device = typeof parsed.device === "string" ? parsed.device : void 0;
|
|
@@ -27877,21 +27878,21 @@ function parseCloudSession(encoded) {
|
|
|
27877
27878
|
boxToken
|
|
27878
27879
|
});
|
|
27879
27880
|
} catch {
|
|
27880
|
-
throw new Error(`${
|
|
27881
|
+
throw new Error(`${PEACH_CLOUD_SESSION_ENV} is invalid`);
|
|
27881
27882
|
}
|
|
27882
27883
|
}
|
|
27883
27884
|
function readCloudSession(environment = process.env) {
|
|
27884
|
-
const encoded = environment[
|
|
27885
|
+
const encoded = environment[PEACH_CLOUD_SESSION_ENV];
|
|
27885
27886
|
return encoded?.trim() ? parseCloudSession(encoded) : null;
|
|
27886
27887
|
}
|
|
27887
|
-
var CLOUD_SESSION_VERSION, MAX_ENCODED_SESSION_BYTES,
|
|
27888
|
+
var CLOUD_SESSION_VERSION, MAX_ENCODED_SESSION_BYTES, PEACH_CLOUD_SESSION_ENV, RNX_SHELL_UPDATE_PREFIX, RNX_SHELL_UPDATE_SET_PREFIX, RNX_SHELL_UPDATE_UNSET;
|
|
27888
27889
|
var init_cloud_session = __esm({
|
|
27889
27890
|
"cli/cloud-session.ts"() {
|
|
27890
27891
|
"use strict";
|
|
27891
27892
|
init_backend_origin();
|
|
27892
27893
|
CLOUD_SESSION_VERSION = 3;
|
|
27893
27894
|
MAX_ENCODED_SESSION_BYTES = 32 * 1024;
|
|
27894
|
-
|
|
27895
|
+
PEACH_CLOUD_SESSION_ENV = "PEACH_CLOUD_SESSION";
|
|
27895
27896
|
RNX_SHELL_UPDATE_PREFIX = "__RNX_SHELL_UPDATE_V1__";
|
|
27896
27897
|
RNX_SHELL_UPDATE_SET_PREFIX = `${RNX_SHELL_UPDATE_PREFIX}set:`;
|
|
27897
27898
|
RNX_SHELL_UPDATE_UNSET = `${RNX_SHELL_UPDATE_PREFIX}unset`;
|
|
@@ -27971,7 +27972,7 @@ function responseError(status, text) {
|
|
|
27971
27972
|
);
|
|
27972
27973
|
}
|
|
27973
27974
|
function resolveCloudOrigin(value) {
|
|
27974
|
-
const configured = value?.trim() || process.env.
|
|
27975
|
+
const configured = value?.trim() || process.env.PEACH_CLOUD_ORIGIN?.trim();
|
|
27975
27976
|
const source = configured || DEFAULT_RNX_CLOUD_ORIGIN;
|
|
27976
27977
|
return normalizeCloudOrigin(source);
|
|
27977
27978
|
}
|
|
@@ -28545,7 +28546,7 @@ var init_cloud_client = __esm({
|
|
|
28545
28546
|
init_detect();
|
|
28546
28547
|
DEFAULT_RNX_CLOUD_ORIGIN = rnxPublicBrand.origin;
|
|
28547
28548
|
MAX_RNX_CLOUD_BUNDLE_BYTES = RNX_CLOUD_MAX_ARTIFACT_BYTES;
|
|
28548
|
-
REMOTE_COMMAND = "
|
|
28549
|
+
REMOTE_COMMAND = "peach remote";
|
|
28549
28550
|
MAX_ASSET_DEST_FILES = 25e3;
|
|
28550
28551
|
ACCOUNT_CHOICE_REFUSALS = /* @__PURE__ */ new Set([
|
|
28551
28552
|
"accountId is required",
|
|
@@ -28690,7 +28691,7 @@ var init_cloud_client = __esm({
|
|
|
28690
28691
|
return Promise.resolve(null);
|
|
28691
28692
|
}
|
|
28692
28693
|
closeSim() {
|
|
28693
|
-
return Promise.reject(new Error("close a box simulator with
|
|
28694
|
+
return Promise.reject(new Error("close a box simulator with peach box stop"));
|
|
28694
28695
|
}
|
|
28695
28696
|
claim() {
|
|
28696
28697
|
return Promise.reject(
|
|
@@ -28898,8 +28899,8 @@ var init_bridge_host = __esm({
|
|
|
28898
28899
|
static USER_BOOT_LEASE_TTL_MS = 6e4;
|
|
28899
28900
|
static SIM_RECONNECT_TTL_MS = 3e4;
|
|
28900
28901
|
// abandoned-tab GC. the ws heartbeat only reaps sims whose socket went
|
|
28901
|
-
// dead — but a background tab from a prior `
|
|
28902
|
-
// keeps its socket alive (the page still pongs) forever, so `
|
|
28902
|
+
// dead — but a background tab from a prior `peach open` / QA / test run
|
|
28903
|
+
// keeps its socket alive (the page still pongs) forever, so `peach list`
|
|
28903
28904
|
// accretes dozens of zombie sims that all time out on every command (QA
|
|
28904
28905
|
// F21-3, carried F19-2). reap a sim only when it is provably nobody's:
|
|
28905
28906
|
// not primary, not user-focused, no CLI attached, no active lease, and no
|
|
@@ -28907,7 +28908,7 @@ var init_bridge_host = __esm({
|
|
|
28907
28908
|
// terminal 4001 code, so the client closes the abandoned window instead
|
|
28908
28909
|
// of reconnecting the zombie straight back in.
|
|
28909
28910
|
static SIM_IDLE_REAP_TTL_MS = 30 * 6e4;
|
|
28910
|
-
// automation sims (spawned by the playwright driver: `
|
|
28911
|
+
// automation sims (spawned by the playwright driver: `peach open --driver
|
|
28911
28912
|
// playwright`, the factory/screenshot capture path — `meta.sootsimHostDriver
|
|
28912
28913
|
// === 'playwright'`) are unattended one-shot browsers, never a human's tab. a
|
|
28913
28914
|
// capture run opens one per slide/app/retry and the 30-min human/dev TTL lets
|
|
@@ -28937,7 +28938,7 @@ var init_bridge_host = __esm({
|
|
|
28937
28938
|
// dropped, sim crashed) leave their server-side WebSocket sitting "open"
|
|
28938
28939
|
// forever. ping every WS_HEARTBEAT_INTERVAL_MS; if the previous round's
|
|
28939
28940
|
// ping was never answered, terminate(). that fires 'close' which runs the
|
|
28940
|
-
// sim-cleanup path and stops `
|
|
28941
|
+
// sim-cleanup path and stops `peach list` from showing 8 zombie
|
|
28941
28942
|
// sims that all time out on every command.
|
|
28942
28943
|
wsHeartbeatTimer = null;
|
|
28943
28944
|
wsIsAlive = /* @__PURE__ */ new WeakMap();
|
|
@@ -29286,7 +29287,7 @@ var init_bridge_host = __esm({
|
|
|
29286
29287
|
expiresAt: Date.now() + _SootSimBridgeHost.USER_BOOT_LEASE_TTL_MS
|
|
29287
29288
|
};
|
|
29288
29289
|
process.stderr.write(
|
|
29289
|
-
`
|
|
29290
|
+
`peach booted ${booted.length} cli client(s)${hadLease ? " (overrode prior lease)" : ""}; held sim for user [${sim.id}]
|
|
29290
29291
|
`
|
|
29291
29292
|
);
|
|
29292
29293
|
this.recordSimAction(sim.id, "sim booted cli clients");
|
|
@@ -29401,7 +29402,7 @@ var init_bridge_host = __esm({
|
|
|
29401
29402
|
ws.send(
|
|
29402
29403
|
JSON.stringify({
|
|
29403
29404
|
id: msg.id,
|
|
29404
|
-
error: `sim ${targetSim.id} is locked by another cli \u2014 use \`
|
|
29405
|
+
error: `sim ${targetSim.id} is locked by another cli \u2014 use \`peach claim ${targetSim.id} --force\` or \`peach open --new\``,
|
|
29405
29406
|
_locked: outcome.lock
|
|
29406
29407
|
})
|
|
29407
29408
|
);
|
|
@@ -29514,7 +29515,7 @@ var init_bridge_host = __esm({
|
|
|
29514
29515
|
const claimed = claimDaemonLockfile(this.buildLockfileSnapshot());
|
|
29515
29516
|
if (!claimed) {
|
|
29516
29517
|
throw new Error(
|
|
29517
|
-
"another
|
|
29518
|
+
"another peach daemon wrote the lockfile during startup \u2014 aborting"
|
|
29518
29519
|
);
|
|
29519
29520
|
}
|
|
29520
29521
|
} catch (err) {
|
|
@@ -29632,7 +29633,7 @@ var init_bridge_host = __esm({
|
|
|
29632
29633
|
return results;
|
|
29633
29634
|
}).catch((err) => {
|
|
29634
29635
|
const message = err instanceof Error ? err.message : String(err);
|
|
29635
|
-
console.error("[
|
|
29636
|
+
console.error("[peach] /__server-scan failed:", message);
|
|
29636
29637
|
return this.scanCache ?? [];
|
|
29637
29638
|
}).finally(() => {
|
|
29638
29639
|
this.inflightScan = null;
|
|
@@ -29640,7 +29641,7 @@ var init_bridge_host = __esm({
|
|
|
29640
29641
|
return this.inflightScan;
|
|
29641
29642
|
}
|
|
29642
29643
|
// serves one staged camera fixture. addressed by basename inside
|
|
29643
|
-
// ~/.
|
|
29644
|
+
// ~/.peach/camera-fixtures, never by a caller-supplied path, so there is
|
|
29644
29645
|
// no traversal surface to defend: a name that is not a plain basename is
|
|
29645
29646
|
// rejected outright. range support is not optional here — chrome asks for
|
|
29646
29647
|
// byte ranges on media and cannot seek or loop a fixture without it.
|
|
@@ -29755,7 +29756,7 @@ var init_bridge_host = __esm({
|
|
|
29755
29756
|
if (this.httpServer) this.writeLockfileSnapshot();
|
|
29756
29757
|
return;
|
|
29757
29758
|
}
|
|
29758
|
-
if (process.env.
|
|
29759
|
+
if (process.env.PEACH_HOME && isSootsimDevCheckout() && !readActiveRuntime()) {
|
|
29759
29760
|
return;
|
|
29760
29761
|
}
|
|
29761
29762
|
void this.runRuntimeUpdate("startup");
|
|
@@ -29770,7 +29771,7 @@ var init_bridge_host = __esm({
|
|
|
29770
29771
|
this.runtimeUpdateInFlight = (async () => {
|
|
29771
29772
|
try {
|
|
29772
29773
|
if (reason === "startup") {
|
|
29773
|
-
process.stderr.write("
|
|
29774
|
+
process.stderr.write("peach: checking for runtime updates\u2026\n");
|
|
29774
29775
|
}
|
|
29775
29776
|
const result = await rnxRuntime.updateToLatest({
|
|
29776
29777
|
protectVersions: this.connectedRuntimeVersions()
|
|
@@ -29778,7 +29779,7 @@ var init_bridge_host = __esm({
|
|
|
29778
29779
|
if (!result.updated || !result.latestVersion) {
|
|
29779
29780
|
if (reason === "startup") {
|
|
29780
29781
|
process.stderr.write(
|
|
29781
|
-
`
|
|
29782
|
+
`peach: runtime ${this.activeRuntimeVersion ?? "(none)"} is current
|
|
29782
29783
|
`
|
|
29783
29784
|
);
|
|
29784
29785
|
}
|
|
@@ -29786,7 +29787,7 @@ var init_bridge_host = __esm({
|
|
|
29786
29787
|
}
|
|
29787
29788
|
const previousVersion = this.activeRuntimeVersion;
|
|
29788
29789
|
const active = this.setActiveRuntime(result.latestVersion);
|
|
29789
|
-
process.stderr.write(`
|
|
29790
|
+
process.stderr.write(`peach runtime updated to ${active.version} (${reason})
|
|
29790
29791
|
`);
|
|
29791
29792
|
try {
|
|
29792
29793
|
writeRuntimeUpgradeNotice({
|
|
@@ -29798,7 +29799,7 @@ var init_bridge_host = __esm({
|
|
|
29798
29799
|
}
|
|
29799
29800
|
} catch (err) {
|
|
29800
29801
|
process.stderr.write(
|
|
29801
|
-
`
|
|
29802
|
+
`peach runtime update failed (${reason}): ${err instanceof Error ? err.message : String(err)}
|
|
29802
29803
|
`
|
|
29803
29804
|
);
|
|
29804
29805
|
} finally {
|
|
@@ -29811,7 +29812,7 @@ var init_bridge_host = __esm({
|
|
|
29811
29812
|
} catch {
|
|
29812
29813
|
}
|
|
29813
29814
|
}
|
|
29814
|
-
process.stderr.write("
|
|
29815
|
+
process.stderr.write("peach: ready\n");
|
|
29815
29816
|
}
|
|
29816
29817
|
}
|
|
29817
29818
|
})();
|
|
@@ -30065,7 +30066,7 @@ var init_bridge_host = __esm({
|
|
|
30065
30066
|
if (!baseDir) {
|
|
30066
30067
|
res.writeHead(503, { "Content-Type": "text/plain; charset=utf-8" });
|
|
30067
30068
|
res.end(
|
|
30068
|
-
versionedRuntimeRequest ? `
|
|
30069
|
+
versionedRuntimeRequest ? `peach: runtime ${requestedRuntime ?? "(invalid version origin)"} is not installed. run \`peach open\` from that app again.` : "peach: no active runtime installed. run `peach runtime install` to fetch one."
|
|
30069
30070
|
);
|
|
30070
30071
|
return;
|
|
30071
30072
|
}
|
|
@@ -30218,7 +30219,7 @@ var init_bridge_host = __esm({
|
|
|
30218
30219
|
this.sweepRestorableSims(now);
|
|
30219
30220
|
this.reapIdleSims(now);
|
|
30220
30221
|
}
|
|
30221
|
-
// GC abandoned sims so `
|
|
30222
|
+
// GC abandoned sims so `peach list` stays usable across long dev / QA /
|
|
30222
30223
|
// test sessions (F21-3). conservative on purpose: a sim is only reaped
|
|
30223
30224
|
// when every "someone cares about this" signal is absent.
|
|
30224
30225
|
//
|
|
@@ -30234,7 +30235,7 @@ var init_bridge_host = __esm({
|
|
|
30234
30235
|
// using is the primary and/or holds a fresh user-active lease; one that is
|
|
30235
30236
|
// none of those and idle past the TTL is abandoned regardless of a stale
|
|
30236
30237
|
// focus flag.
|
|
30237
|
-
// automation sims are spawned by the playwright driver (`
|
|
30238
|
+
// automation sims are spawned by the playwright driver (`peach open
|
|
30238
30239
|
// --driver playwright`, the factory/screenshot capture path), which tags them
|
|
30239
30240
|
// with `meta.sootsimHostDriver === 'playwright'` via the host's addInitScript.
|
|
30240
30241
|
// they are unattended one-shot browsers, never a human's tab, so they get a
|
|
@@ -30637,7 +30638,7 @@ var init_bridge_host = __esm({
|
|
|
30637
30638
|
const candidates = this.getDefaultSimCandidates();
|
|
30638
30639
|
if (candidates.length > 1) {
|
|
30639
30640
|
throw new Error(
|
|
30640
|
-
`multiple sims are connected: ${candidates.map((sim) => sim.id).join(", ")}; run \`
|
|
30641
|
+
`multiple sims are connected: ${candidates.map((sim) => sim.id).join(", ")}; run \`peach use <sim>\` or pass \`--sim <sim>\``
|
|
30641
30642
|
);
|
|
30642
30643
|
}
|
|
30643
30644
|
const candidate = candidates[0];
|
|
@@ -31107,7 +31108,7 @@ function getCurrentSimPath() {
|
|
|
31107
31108
|
return (0, import_path4.resolve)(process.env[CURRENT_SIM_PATH_ENV]);
|
|
31108
31109
|
}
|
|
31109
31110
|
const key = getCliIdentityKey();
|
|
31110
|
-
return (0, import_path4.join)((0, import_os.tmpdir)(), `
|
|
31111
|
+
return (0, import_path4.join)((0, import_os.tmpdir)(), `peach-current-sim-${key}.json`);
|
|
31111
31112
|
}
|
|
31112
31113
|
function legacyCloudCredentialDirectory(filepath) {
|
|
31113
31114
|
return (0, import_path4.join)((0, import_path4.dirname)(filepath), `${(0, import_path4.basename)(filepath)}.credentials`);
|
|
@@ -31171,7 +31172,7 @@ var init_current_sim = __esm({
|
|
|
31171
31172
|
CURRENT_SIM_VERSION = 2;
|
|
31172
31173
|
CURRENT_SIM_PATH_ENV = "SOOTSIM_CLI_CURRENT_SIM_PATH";
|
|
31173
31174
|
IDENTITY_ENV_VARS = [
|
|
31174
|
-
"
|
|
31175
|
+
"PEACH_CLI_IDENTITY",
|
|
31175
31176
|
// explicit override — fastest path, skips all pid lookups
|
|
31176
31177
|
"TM_SESSION",
|
|
31177
31178
|
// Team Machine session id; routes prompt-bar followups back to this agent
|
|
@@ -31208,7 +31209,7 @@ var ws_bridge_exports = {};
|
|
|
31208
31209
|
__export(ws_bridge_exports, {
|
|
31209
31210
|
BRIDGE_VALUE_FLAGS: () => BRIDGE_VALUE_FLAGS,
|
|
31210
31211
|
BridgeSimLockedError: () => BridgeSimLockedError,
|
|
31211
|
-
|
|
31212
|
+
PEACH_PLACEMENT_ENV: () => PEACH_PLACEMENT_ENV,
|
|
31212
31213
|
bridgePortForShellBaseUrl: () => bridgePortForShellBaseUrl,
|
|
31213
31214
|
bridgeWsUrl: () => bridgeWsUrl,
|
|
31214
31215
|
callInBridge: () => callInBridge,
|
|
@@ -31227,7 +31228,7 @@ __export(ws_bridge_exports, {
|
|
|
31227
31228
|
worldForBridgePort: () => worldForBridgePort
|
|
31228
31229
|
});
|
|
31229
31230
|
function resolvePlacement() {
|
|
31230
|
-
return process.env[
|
|
31231
|
+
return process.env[PEACH_PLACEMENT_ENV] === "local-box" ? "local-box" : "host";
|
|
31231
31232
|
}
|
|
31232
31233
|
function bridgeWsUrl(wsPort) {
|
|
31233
31234
|
return `ws://127.0.0.1:${wsPort}`;
|
|
@@ -31354,7 +31355,7 @@ function resolveBridgePortForPin(pin) {
|
|
|
31354
31355
|
if (served === null) {
|
|
31355
31356
|
if (pin.explicitPort) return { port: pin.wsPort };
|
|
31356
31357
|
return {
|
|
31357
|
-
error: `no live
|
|
31358
|
+
error: `no live peach world serves ${pin.baseUrl} \u2014 start that shell first, or name its bridge with --port <port>`
|
|
31358
31359
|
};
|
|
31359
31360
|
}
|
|
31360
31361
|
if (pin.explicitPort && pin.wsPort !== served) {
|
|
@@ -31379,7 +31380,7 @@ function printBridgeWorldNotice(bridgePort, shellBaseUrl) {
|
|
|
31379
31380
|
}
|
|
31380
31381
|
function describeSimIdSource(source) {
|
|
31381
31382
|
if (source === "flag") return "via --sim";
|
|
31382
|
-
if (source === "saved") return "saved via `
|
|
31383
|
+
if (source === "saved") return "saved via `peach use`";
|
|
31383
31384
|
return "primary fallback \u2014 no sim pinned";
|
|
31384
31385
|
}
|
|
31385
31386
|
function formatLockOwner(owner) {
|
|
@@ -31526,7 +31527,7 @@ function createBridge(wsPort, opts = {}) {
|
|
|
31526
31527
|
\u26A0 ${msg._otherCliCount} other CLI identity/identities are driving this sim
|
|
31527
31528
|
taps, scrolls, and keyboard input from multiple agents will collide on
|
|
31528
31529
|
the same screen state (this is not a bridge throughput limit).
|
|
31529
|
-
use \`
|
|
31530
|
+
use \`peach open --new\` for an isolated sim per agent.
|
|
31530
31531
|
|
|
31531
31532
|
`
|
|
31532
31533
|
);
|
|
@@ -31630,7 +31631,7 @@ function createBridge(wsPort, opts = {}) {
|
|
|
31630
31631
|
}
|
|
31631
31632
|
clearCurrentSimId();
|
|
31632
31633
|
throw new Error(
|
|
31633
|
-
`saved sim ${sentSimId} is gone${message.slice(missingSimMessage.length)}; run \`
|
|
31634
|
+
`saved sim ${sentSimId} is gone${message.slice(missingSimMessage.length)}; run \`peach list\` and \`peach use <sim>\`, or open a fresh sim`
|
|
31634
31635
|
);
|
|
31635
31636
|
}
|
|
31636
31637
|
throw error;
|
|
@@ -31724,7 +31725,7 @@ async function checkSimHealth(bridge) {
|
|
|
31724
31725
|
\u26A0 target sim${health.simId ? ` ${health.simId}` : ""} is hidden (document.hidden = true)
|
|
31725
31726
|
` + (health.visibilityState ? ` visibility: ${health.visibilityState}
|
|
31726
31727
|
` : "") + " animations and rAF callbacks are throttled \u2014 coordinates may be wrong\n and launch/transition animations will not complete.\n" + (candidate ? ` another open sim looks usable: ${candidate}; target it with --sim.
|
|
31727
|
-
` : " run `
|
|
31728
|
+
` : " run `peach list` to find the visible sim and target it with --sim.\n") + " page-level window.focus() cannot unhide a browser tab.\n\n"
|
|
31728
31729
|
);
|
|
31729
31730
|
return { hidden: true, warned: true, simId: health.simId };
|
|
31730
31731
|
}
|
|
@@ -31744,7 +31745,7 @@ async function callInBridge(bridge, path20, ...args) {
|
|
|
31744
31745
|
async function callInBridgeWrite(bridge, path20, ...args) {
|
|
31745
31746
|
return bridge.send({ type: "call", path: path20, args, acquireLock: true });
|
|
31746
31747
|
}
|
|
31747
|
-
var import_node_fs16, import_node_path17, import_ws2,
|
|
31748
|
+
var import_node_fs16, import_node_path17, import_ws2, PEACH_PLACEMENT_ENV, resolvedWorld, BridgeSimLockedError, BRIDGE_VALUE_FLAGS_TABLE, BRIDGE_VALUE_FLAGS;
|
|
31748
31749
|
var init_ws_bridge = __esm({
|
|
31749
31750
|
"cli/ws-bridge.ts"() {
|
|
31750
31751
|
"use strict";
|
|
@@ -31756,7 +31757,7 @@ var init_ws_bridge = __esm({
|
|
|
31756
31757
|
init_home_paths();
|
|
31757
31758
|
init_cloud_client();
|
|
31758
31759
|
init_current_sim();
|
|
31759
|
-
|
|
31760
|
+
PEACH_PLACEMENT_ENV = "PEACH_PLACEMENT";
|
|
31760
31761
|
resolvedWorld = null;
|
|
31761
31762
|
BridgeSimLockedError = class extends Error {
|
|
31762
31763
|
lock;
|
|
@@ -31784,7 +31785,7 @@ var init_ws_bridge = __esm({
|
|
|
31784
31785
|
},
|
|
31785
31786
|
{
|
|
31786
31787
|
// `--sim` is the canonical target flag; `--session` / `--tab` are
|
|
31787
|
-
// documented aliases (CLAUDE.md, the
|
|
31788
|
+
// documented aliases (CLAUDE.md, the peach agent skills, and engine docs all
|
|
31788
31789
|
// say `--session <id>`). without these aliases an agent following the docs
|
|
31789
31790
|
// would have `--session ef` silently ignored and get the *currently
|
|
31790
31791
|
// pinned* sim's tree instead — wrong-app data with no error.
|
|
@@ -32244,7 +32245,7 @@ async function loadRNXAppConfig(project) {
|
|
|
32244
32245
|
});
|
|
32245
32246
|
const loaded = await jiti.import(project.configPath, { default: true });
|
|
32246
32247
|
if (!isRNXConfig(loaded)) {
|
|
32247
|
-
throw new Error("the default export must be
|
|
32248
|
+
throw new Error("the default export must be a peach config object");
|
|
32248
32249
|
}
|
|
32249
32250
|
return resolveConfigReplacementFiles(loaded, project.configPath);
|
|
32250
32251
|
} catch (error) {
|
|
@@ -32563,7 +32564,7 @@ var PUBLIC_NO_NETWORK_MARKER, HEADLESS_TENANT_FETCH_HUNG_MARKER;
|
|
|
32563
32564
|
var init_bridge_contract = __esm({
|
|
32564
32565
|
"src/bridge-contract.ts"() {
|
|
32565
32566
|
"use strict";
|
|
32566
|
-
PUBLIC_NO_NETWORK_MARKER = "public
|
|
32567
|
+
PUBLIC_NO_NETWORK_MARKER = "public Peach Cloud simulators have no network";
|
|
32567
32568
|
HEADLESS_TENANT_FETCH_HUNG_MARKER = "headless tenant fetch hung";
|
|
32568
32569
|
}
|
|
32569
32570
|
});
|
|
@@ -32902,7 +32903,7 @@ function layoutGetNativeEval(opts = {}) {
|
|
|
32902
32903
|
|
|
32903
32904
|
const screenshot = window.SootSim && window.SootSim.bridges && window.SootSim.bridges.screenshot
|
|
32904
32905
|
if (typeof screenshot !== 'function') {
|
|
32905
|
-
throw new Error('styled native layout requires the
|
|
32906
|
+
throw new Error('styled native layout requires the peach capture bridge')
|
|
32906
32907
|
}
|
|
32907
32908
|
const device = list.find((node) => node && node.device)?.device || {}
|
|
32908
32909
|
const width = Math.round(Number(device.width) || window.innerWidth || 0)
|
|
@@ -32948,7 +32949,7 @@ function waitReadyReason(status) {
|
|
|
32948
32949
|
if (status.bridgeError.includes(HEADLESS_TENANT_FETCH_HUNG_MARKER) || status.bridgeError.includes(PUBLIC_NO_NETWORK_MARKER)) {
|
|
32949
32950
|
return status.bridgeError;
|
|
32950
32951
|
}
|
|
32951
|
-
return `sim unreachable: ${status.bridgeError} \u2014 the target tab is closed or no sim is connected (check \`
|
|
32952
|
+
return `sim unreachable: ${status.bridgeError} \u2014 the target tab is closed or no sim is connected (check \`peach list\`, reopen with \`peach open\`)`;
|
|
32952
32953
|
}
|
|
32953
32954
|
const waitingOnGuestFetch = status.externalReady === false && /https?:\/\//.test(status.externalStatus);
|
|
32954
32955
|
const base = status.externalError ? `guest app errored: ${status.externalError}` : waitingOnGuestFetch ? `waiting on a guest fetch: ${status.externalStatus}` : status.loadingText ? `still showing "${status.loadingText}"` : status.externalReady === false ? "guest app is still loading" : status.flag !== true && status.targets > 0 ? "native content is rendered but the ready signal has not settled" : status.flag !== true ? "guest app has not emitted sootsim:externalAppReady" : status.targets <= 0 ? "ready flag emitted but no visible app content is inspectable yet" : "node tree is still changing";
|
|
@@ -33331,9 +33332,9 @@ function findElectronBin(startDir) {
|
|
|
33331
33332
|
function findMacApp() {
|
|
33332
33333
|
const root = getSootsimRoot();
|
|
33333
33334
|
const candidates = [
|
|
33334
|
-
"/Applications/
|
|
33335
|
-
(0, import_path6.resolve)(process.env.HOME || "", "Applications/
|
|
33336
|
-
...root ? [(0, import_path6.resolve)(root, "app/
|
|
33335
|
+
"/Applications/peach.app",
|
|
33336
|
+
(0, import_path6.resolve)(process.env.HOME || "", "Applications/peach.app"),
|
|
33337
|
+
...root ? [(0, import_path6.resolve)(root, "app/peach.app")] : []
|
|
33337
33338
|
];
|
|
33338
33339
|
const found = candidates.find((candidate) => (0, import_fs7.existsSync)(candidate));
|
|
33339
33340
|
if (found) {
|
|
@@ -33346,7 +33347,7 @@ function findMacApp() {
|
|
|
33346
33347
|
try {
|
|
33347
33348
|
const result = (0, import_child_process5.execFileSync)(
|
|
33348
33349
|
"mdfind",
|
|
33349
|
-
[`kMDItemCFBundleIdentifier == "${
|
|
33350
|
+
[`kMDItemCFBundleIdentifier == "${PEACH_BUNDLE_ID}"`],
|
|
33350
33351
|
{ encoding: "utf8", timeout: 3e3 }
|
|
33351
33352
|
).trim();
|
|
33352
33353
|
if (result) {
|
|
@@ -33362,17 +33363,17 @@ function findMacApp() {
|
|
|
33362
33363
|
}
|
|
33363
33364
|
function findFirstAppImage(dir) {
|
|
33364
33365
|
if (!(0, import_fs7.existsSync)(dir)) return null;
|
|
33365
|
-
const match = (0, import_fs7.readdirSync)(dir).filter((entry) => entry.startsWith("
|
|
33366
|
+
const match = (0, import_fs7.readdirSync)(dir).filter((entry) => entry.startsWith("peach") && entry.endsWith(".AppImage")).sort().reverse()[0];
|
|
33366
33367
|
return match ? (0, import_path6.join)(dir, match) : null;
|
|
33367
33368
|
}
|
|
33368
33369
|
function findLinuxInstall() {
|
|
33369
33370
|
const root = getSootsimRoot();
|
|
33370
33371
|
const directCandidates = [
|
|
33371
|
-
(0, import_path6.resolve)(process.env.HOME || "", "Applications/
|
|
33372
|
-
(0, import_path6.resolve)(process.env.HOME || "", ".local/bin/
|
|
33373
|
-
"/opt/
|
|
33374
|
-
"/opt/
|
|
33375
|
-
...root ? [(0, import_path6.resolve)(root, "app/
|
|
33372
|
+
(0, import_path6.resolve)(process.env.HOME || "", "Applications/peach.AppImage"),
|
|
33373
|
+
(0, import_path6.resolve)(process.env.HOME || "", ".local/bin/peach.AppImage"),
|
|
33374
|
+
"/opt/peach/peach.AppImage",
|
|
33375
|
+
"/opt/peach/peach",
|
|
33376
|
+
...root ? [(0, import_path6.resolve)(root, "app/peach.AppImage"), (0, import_path6.resolve)(root, "release/linux-unpacked/peach")] : []
|
|
33376
33377
|
];
|
|
33377
33378
|
const directMatch = directCandidates.find((candidate) => (0, import_fs7.existsSync)(candidate));
|
|
33378
33379
|
if (directMatch) {
|
|
@@ -33395,7 +33396,7 @@ function findWindowsInstall() {
|
|
|
33395
33396
|
try {
|
|
33396
33397
|
const output = (0, import_child_process5.execFileSync)(
|
|
33397
33398
|
"reg",
|
|
33398
|
-
["query", `${hive}\\Software\\Classes\\
|
|
33399
|
+
["query", `${hive}\\Software\\Classes\\peach\\shell\\open\\command`, "/ve"],
|
|
33399
33400
|
{ encoding: "utf8", timeout: 3e3 }
|
|
33400
33401
|
);
|
|
33401
33402
|
const executable = /"([^"\r\n]+\.exe)"/i.exec(output)?.[1];
|
|
@@ -33475,7 +33476,7 @@ async function launchDesktopCompanion(url, install = findDesktopCompanion(), opt
|
|
|
33475
33476
|
}
|
|
33476
33477
|
function buildMacLaunchUrl(url, opts) {
|
|
33477
33478
|
if (!opts.profileId && !opts.ephemeralProfile && !opts.ownerPid) return url;
|
|
33478
|
-
const deepLink = new URL("
|
|
33479
|
+
const deepLink = new URL("peach://dev");
|
|
33479
33480
|
deepLink.searchParams.set("url", url);
|
|
33480
33481
|
if (opts.profileId) deepLink.searchParams.set("profile", opts.profileId);
|
|
33481
33482
|
if (opts.ephemeralProfile) deepLink.searchParams.set("ephemeral", "1");
|
|
@@ -33484,7 +33485,7 @@ function buildMacLaunchUrl(url, opts) {
|
|
|
33484
33485
|
}
|
|
33485
33486
|
return deepLink.toString();
|
|
33486
33487
|
}
|
|
33487
|
-
var import_child_process5, import_fs7, import_path6, import_url2, import_meta2, _sootsimRoot,
|
|
33488
|
+
var import_child_process5, import_fs7, import_path6, import_url2, import_meta2, _sootsimRoot, PEACH_BUNDLE_ID;
|
|
33488
33489
|
var init_desktop_companion = __esm({
|
|
33489
33490
|
"cli/desktop-companion.ts"() {
|
|
33490
33491
|
"use strict";
|
|
@@ -33493,7 +33494,7 @@ var init_desktop_companion = __esm({
|
|
|
33493
33494
|
import_path6 = require("path");
|
|
33494
33495
|
import_url2 = require("url");
|
|
33495
33496
|
import_meta2 = {};
|
|
33496
|
-
|
|
33497
|
+
PEACH_BUNDLE_ID = "dev.peachsim.simulator";
|
|
33497
33498
|
}
|
|
33498
33499
|
});
|
|
33499
33500
|
|
|
@@ -33503,7 +33504,7 @@ function probe() {
|
|
|
33503
33504
|
if (!install) {
|
|
33504
33505
|
return {
|
|
33505
33506
|
available: false,
|
|
33506
|
-
reason: "
|
|
33507
|
+
reason: "peach desktop app not installed (run `peach desktop install`)"
|
|
33507
33508
|
};
|
|
33508
33509
|
}
|
|
33509
33510
|
return {
|
|
@@ -33517,7 +33518,7 @@ async function launch(opts) {
|
|
|
33517
33518
|
if (!install) {
|
|
33518
33519
|
return {
|
|
33519
33520
|
launched: false,
|
|
33520
|
-
message: "
|
|
33521
|
+
message: "peach desktop app not installed"
|
|
33521
33522
|
};
|
|
33522
33523
|
}
|
|
33523
33524
|
try {
|
|
@@ -33551,7 +33552,7 @@ var init_electron = __esm({
|
|
|
33551
33552
|
electronDriver = {
|
|
33552
33553
|
id: "electron",
|
|
33553
33554
|
name: "electron",
|
|
33554
|
-
description: "
|
|
33555
|
+
description: "peach desktop companion app (native window, menu bar)",
|
|
33555
33556
|
kind: "native",
|
|
33556
33557
|
availability: probe,
|
|
33557
33558
|
launch
|
|
@@ -33567,7 +33568,7 @@ var PLAYWRIGHT_HOST_LOG_PREFIX;
|
|
|
33567
33568
|
var init_playwright_host_log = __esm({
|
|
33568
33569
|
"src/playwright-host-log.ts"() {
|
|
33569
33570
|
"use strict";
|
|
33570
|
-
PLAYWRIGHT_HOST_LOG_PREFIX = "
|
|
33571
|
+
PLAYWRIGHT_HOST_LOG_PREFIX = "peach-playwright-host-";
|
|
33571
33572
|
}
|
|
33572
33573
|
});
|
|
33573
33574
|
|
|
@@ -33750,7 +33751,7 @@ function resolveUserDataDir(opts) {
|
|
|
33750
33751
|
return playwrightProfileUserDataDir(ensureProfile(opts.profileId).id);
|
|
33751
33752
|
}
|
|
33752
33753
|
if (opts.ephemeralProfile) {
|
|
33753
|
-
return (0, import_fs8.mkdtempSync)((0, import_path7.join)((0, import_os2.tmpdir)(), "
|
|
33754
|
+
return (0, import_fs8.mkdtempSync)((0, import_path7.join)((0, import_os2.tmpdir)(), "peach-playwright-profile-"));
|
|
33754
33755
|
}
|
|
33755
33756
|
return "";
|
|
33756
33757
|
}
|
|
@@ -33896,7 +33897,7 @@ var init_open_url2 = __esm({
|
|
|
33896
33897
|
|
|
33897
33898
|
// cli/commands/inspect/env.ts
|
|
33898
33899
|
function isAgentEnv(env = process.env) {
|
|
33899
|
-
if (env.
|
|
33900
|
+
if (env.PEACH_AGENT === "0") return false;
|
|
33900
33901
|
for (const name2 of AGENT_ENV_VARS) {
|
|
33901
33902
|
const v = env[name2];
|
|
33902
33903
|
if (v && v.trim() && v !== "0") return true;
|
|
@@ -33908,7 +33909,7 @@ var init_env = __esm({
|
|
|
33908
33909
|
"cli/commands/inspect/env.ts"() {
|
|
33909
33910
|
"use strict";
|
|
33910
33911
|
AGENT_ENV_VARS = [
|
|
33911
|
-
"
|
|
33912
|
+
"PEACH_AGENT",
|
|
33912
33913
|
"TM_SESSION",
|
|
33913
33914
|
"CLAUDECODE",
|
|
33914
33915
|
"CLAUDE_CODE_ENTRYPOINT",
|
|
@@ -33949,7 +33950,7 @@ async function fetchRuntimeReleaseNotes(version, fetchImpl = fetch) {
|
|
|
33949
33950
|
}
|
|
33950
33951
|
}
|
|
33951
33952
|
function formatRuntimeReleaseNotes(version, entry) {
|
|
33952
|
-
const lines = [`what's new in
|
|
33953
|
+
const lines = [`what's new in peach engine v${version}:`];
|
|
33953
33954
|
if (!entry || entry.sections.length === 0) {
|
|
33954
33955
|
lines.push(` release notes are not available yet`);
|
|
33955
33956
|
} else {
|
|
@@ -34002,15 +34003,15 @@ async function runRuntime(args, opts = {}) {
|
|
|
34002
34003
|
}
|
|
34003
34004
|
function printHelp() {
|
|
34004
34005
|
console.log(`
|
|
34005
|
-
|
|
34006
|
+
peach runtime \u2014 manage engine runtimes under ~/.peach/runtimes/
|
|
34006
34007
|
|
|
34007
34008
|
usage:
|
|
34008
|
-
|
|
34009
|
-
|
|
34010
|
-
|
|
34011
|
-
|
|
34012
|
-
|
|
34013
|
-
|
|
34009
|
+
peach runtime install [version] install a version (default: channel latest)
|
|
34010
|
+
peach runtime list show installed + available versions
|
|
34011
|
+
peach runtime use <version> switch active runtime
|
|
34012
|
+
peach runtime remove <version> delete an installed runtime
|
|
34013
|
+
peach runtime which print active runtime version
|
|
34014
|
+
peach runtime notes print repo or default engine release notes
|
|
34014
34015
|
|
|
34015
34016
|
flags:
|
|
34016
34017
|
--channel <name> channel to resolve 'latest' from (default: stable)
|
|
@@ -34018,14 +34019,14 @@ flags:
|
|
|
34018
34019
|
--set-active=false do not switch active runtime after install
|
|
34019
34020
|
|
|
34020
34021
|
environment:
|
|
34021
|
-
|
|
34022
|
+
PEACH_CDN_ORIGIN override the CDN base URL (default: ${DEFAULT_RUNTIME_CDN_ORIGIN})
|
|
34022
34023
|
|
|
34023
34024
|
examples:
|
|
34024
|
-
|
|
34025
|
-
|
|
34026
|
-
|
|
34027
|
-
|
|
34028
|
-
|
|
34025
|
+
peach runtime install
|
|
34026
|
+
peach runtime install 1.2.3
|
|
34027
|
+
peach runtime install --channel beta
|
|
34028
|
+
peach runtime use 1.2.3
|
|
34029
|
+
peach runtime notes
|
|
34029
34030
|
`);
|
|
34030
34031
|
}
|
|
34031
34032
|
async function runtimeInstall(args, opts) {
|
|
@@ -34034,7 +34035,7 @@ async function runtimeInstall(args, opts) {
|
|
|
34034
34035
|
const force = flags.force === true;
|
|
34035
34036
|
const setActive = flags.setActive !== false;
|
|
34036
34037
|
ensureRnxHome();
|
|
34037
|
-
console.log(`
|
|
34038
|
+
console.log(`peach runtime install`);
|
|
34038
34039
|
console.log(` cdn: ${rnxRuntime.resolveCdnOrigin()}`);
|
|
34039
34040
|
try {
|
|
34040
34041
|
const result = await rnxRuntime.install({
|
|
@@ -34063,7 +34064,7 @@ async function activateVersion(version) {
|
|
|
34063
34064
|
const notified = await tellDaemonRuntimeChanged(version);
|
|
34064
34065
|
if (!notified) {
|
|
34065
34066
|
console.log(
|
|
34066
|
-
` (no daemon running \u2014 next
|
|
34067
|
+
` (no daemon running \u2014 next peach/electron launch will pick up ${version})`
|
|
34067
34068
|
);
|
|
34068
34069
|
}
|
|
34069
34070
|
}
|
|
@@ -34144,14 +34145,14 @@ async function runtimeList(_args) {
|
|
|
34144
34145
|
async function runtimeUse(args) {
|
|
34145
34146
|
const version = args[0];
|
|
34146
34147
|
if (!version) {
|
|
34147
|
-
console.error(` usage:
|
|
34148
|
+
console.error(` usage: peach runtime use <version>`);
|
|
34148
34149
|
rnxExit(1);
|
|
34149
34150
|
}
|
|
34150
34151
|
const installed2 = rnxRuntime.listInstalled();
|
|
34151
34152
|
if (!installed2.includes(version)) {
|
|
34152
34153
|
console.error(` version ${version} is not installed`);
|
|
34153
34154
|
console.error(` installed: ${installed2.join(", ") || "(none)"}`);
|
|
34154
|
-
console.error(` run \`
|
|
34155
|
+
console.error(` run \`peach runtime install ${version}\` first`);
|
|
34155
34156
|
rnxExit(1);
|
|
34156
34157
|
}
|
|
34157
34158
|
await activateVersion(version);
|
|
@@ -34159,14 +34160,14 @@ async function runtimeUse(args) {
|
|
|
34159
34160
|
async function runtimeRemove(args) {
|
|
34160
34161
|
const version = args[0];
|
|
34161
34162
|
if (!version) {
|
|
34162
|
-
console.error(` usage:
|
|
34163
|
+
console.error(` usage: peach runtime remove <version>`);
|
|
34163
34164
|
rnxExit(1);
|
|
34164
34165
|
}
|
|
34165
34166
|
const active = readActiveRuntime();
|
|
34166
34167
|
if (active === version) {
|
|
34167
34168
|
console.error(` cannot remove active runtime ${version}`);
|
|
34168
34169
|
console.error(
|
|
34169
|
-
` switch with \`
|
|
34170
|
+
` switch with \`peach runtime use <other>\` first, or install another version`
|
|
34170
34171
|
);
|
|
34171
34172
|
rnxExit(1);
|
|
34172
34173
|
}
|
|
@@ -34192,7 +34193,7 @@ async function runtimeWhich() {
|
|
|
34192
34193
|
}
|
|
34193
34194
|
async function runtimeNotes(args) {
|
|
34194
34195
|
if (args.length > 0) {
|
|
34195
|
-
console.error(` usage:
|
|
34196
|
+
console.error(` usage: peach runtime notes`);
|
|
34196
34197
|
rnxExit(1);
|
|
34197
34198
|
}
|
|
34198
34199
|
const { config } = await resolveRNXAppConfig();
|
|
@@ -34325,14 +34326,14 @@ async function ensureBridgeForOpen(preferredPort, explicitPort = false) {
|
|
|
34325
34326
|
return preferredPort;
|
|
34326
34327
|
}
|
|
34327
34328
|
if (explicitPort && preferredWorld !== null) {
|
|
34328
|
-
throw new Error(`
|
|
34329
|
+
throw new Error(`peach open: requested bridge port ${preferredPort} is not reachable.`);
|
|
34329
34330
|
}
|
|
34330
34331
|
if (!explicitPort && lock && isDaemonLockfileFresh(lock) && await canConnectToBridge(lock.bridgePort, 500)) {
|
|
34331
34332
|
return lock.bridgePort;
|
|
34332
34333
|
}
|
|
34333
34334
|
if (lock && isDaemonLockfileFresh(lock)) {
|
|
34334
34335
|
throw new Error(
|
|
34335
|
-
`
|
|
34336
|
+
`peach bridge lockfile is fresh (port ${lock.bridgePort}) but the bridge is not reachable. run \`peach daemon restart\` or \`peach daemon uninstall\`.`
|
|
34336
34337
|
);
|
|
34337
34338
|
}
|
|
34338
34339
|
await ensureRuntimeForOpen();
|
|
@@ -34349,17 +34350,17 @@ async function ensureBridgeForOpen(preferredPort, explicitPort = false) {
|
|
|
34349
34350
|
const selectedPort = explicitPort ? preferredPort : nextLock?.bridgePort;
|
|
34350
34351
|
if (nextLock && isDaemonLockfileFresh(nextLock) && selectedPort !== void 0 && await canConnectToBridge(selectedPort, 250)) {
|
|
34351
34352
|
console.error(
|
|
34352
|
-
` Started a local bridge on port ${selectedPort}. Run \`
|
|
34353
|
+
` Started a local bridge on port ${selectedPort}. Run \`peach daemon install\` to keep it ready between commands.`
|
|
34353
34354
|
);
|
|
34354
34355
|
return selectedPort;
|
|
34355
34356
|
}
|
|
34356
34357
|
if (childExit) {
|
|
34357
|
-
throw new Error(`
|
|
34358
|
+
throw new Error(`peach bridge exited before becoming ready (exit ${childExit})`);
|
|
34358
34359
|
}
|
|
34359
34360
|
await sleep2(150);
|
|
34360
34361
|
}
|
|
34361
34362
|
throw new Error(
|
|
34362
|
-
`
|
|
34363
|
+
`peach bridge did not start within ${Math.round(OPEN_BRIDGE_SPAWN_TIMEOUT_MS / 1e3)}s`
|
|
34363
34364
|
);
|
|
34364
34365
|
}
|
|
34365
34366
|
function assertExplicitBridgeLock(preferredPort, explicitPort, lock) {
|
|
@@ -34372,13 +34373,13 @@ function assertExplicitBridgeLock(preferredPort, explicitPort, lock) {
|
|
|
34372
34373
|
return;
|
|
34373
34374
|
}
|
|
34374
34375
|
throw new Error(
|
|
34375
|
-
`${rnxPublicBrand.commandName} open: requested bridge port ${preferredPort}, but the active daemon owns port ${lock.bridgePort}. explicit --port never selects another bridge; stop that daemon or use an isolated
|
|
34376
|
+
`${rnxPublicBrand.commandName} open: requested bridge port ${preferredPort}, but the active daemon owns port ${lock.bridgePort}. explicit --port never selects another bridge; stop that daemon or use an isolated PEACH_HOME.`
|
|
34376
34377
|
);
|
|
34377
34378
|
}
|
|
34378
34379
|
async function ensureRuntimeForOpen() {
|
|
34379
34380
|
const active = readActiveRuntime();
|
|
34380
34381
|
if (active && import_node_fs20.default.existsSync(runtimeDir(active))) return;
|
|
34381
|
-
console.error(" installing
|
|
34382
|
+
console.error(" installing peach engine runtime...");
|
|
34382
34383
|
const { runRuntime: runRuntime2 } = await Promise.resolve().then(() => (init_runtime(), runtime_exports));
|
|
34383
34384
|
await runRuntime2(["install"], {});
|
|
34384
34385
|
}
|
|
@@ -34548,18 +34549,18 @@ function parseOpenRuntimeConfig(args) {
|
|
|
34548
34549
|
if (args[i] === "--replace") {
|
|
34549
34550
|
const raw = args[i + 1];
|
|
34550
34551
|
if (!raw) {
|
|
34551
|
-
console.error("
|
|
34552
|
+
console.error(" peach open: --replace expects <module>=<file>");
|
|
34552
34553
|
rnxExit(1);
|
|
34553
34554
|
}
|
|
34554
34555
|
const eqIndex = raw.indexOf("=");
|
|
34555
34556
|
if (eqIndex <= 0 || eqIndex === raw.length - 1) {
|
|
34556
|
-
console.error("
|
|
34557
|
+
console.error(" peach open: --replace expects <module>=<file>");
|
|
34557
34558
|
rnxExit(1);
|
|
34558
34559
|
}
|
|
34559
34560
|
const moduleName = raw.slice(0, eqIndex).trim();
|
|
34560
34561
|
const filePath = normalizeReplacementPath(raw.slice(eqIndex + 1).trim());
|
|
34561
34562
|
if (!import_node_fs20.default.existsSync(filePath)) {
|
|
34562
|
-
console.error(`
|
|
34563
|
+
console.error(` peach open: replacement file not found: ${filePath}`);
|
|
34563
34564
|
rnxExit(1);
|
|
34564
34565
|
}
|
|
34565
34566
|
modules[moduleName] = { file: filePath };
|
|
@@ -34570,7 +34571,7 @@ function parseOpenRuntimeConfig(args) {
|
|
|
34570
34571
|
const raw = args[i + 1];
|
|
34571
34572
|
const eqIndex = raw ? raw.indexOf("=") : -1;
|
|
34572
34573
|
if (!raw || eqIndex <= 0 || eqIndex === raw.length - 1) {
|
|
34573
|
-
console.error("
|
|
34574
|
+
console.error(" peach open: --remap expects <host:port>=<host:port>");
|
|
34574
34575
|
rnxExit(1);
|
|
34575
34576
|
}
|
|
34576
34577
|
remap[raw.slice(0, eqIndex).trim()] = raw.slice(eqIndex + 1).trim();
|
|
@@ -34605,7 +34606,7 @@ function applyRuntimeGenerationOrigin(baseUrl, version) {
|
|
|
34605
34606
|
if (!isLoopbackHost(url.hostname)) {
|
|
34606
34607
|
if (!version) return baseUrl;
|
|
34607
34608
|
throw new Error(
|
|
34608
|
-
`runtimeVersion ${selectedVersion} requires a local
|
|
34609
|
+
`runtimeVersion ${selectedVersion} requires a local peach host; got ${url.origin}`
|
|
34609
34610
|
);
|
|
34610
34611
|
}
|
|
34611
34612
|
url.hostname = runtimeVersionHostname(selectedVersion);
|
|
@@ -34935,7 +34936,7 @@ async function terminatePlaywrightHostsForSims(sims, ids) {
|
|
|
34935
34936
|
}
|
|
34936
34937
|
for (const pid of pids) {
|
|
34937
34938
|
if (!isPlaywrightHostProcess(pid)) {
|
|
34938
|
-
console.log(` skipped pid ${pid}: not a
|
|
34939
|
+
console.log(` skipped pid ${pid}: not a peach playwright host (stale sim record)`);
|
|
34939
34940
|
continue;
|
|
34940
34941
|
}
|
|
34941
34942
|
try {
|
|
@@ -35029,7 +35030,7 @@ async function maybeDescribeAfterOpen(wsPort, simId, args) {
|
|
|
35029
35030
|
console.log(
|
|
35030
35031
|
` app still loading: ${reason} (nodes: ${readyProbe.nodes}, targets: ${readyProbe.targets})`
|
|
35031
35032
|
);
|
|
35032
|
-
console.log(" before interacting, run:
|
|
35033
|
+
console.log(" before interacting, run: peach wait ready --max-ms 120000");
|
|
35033
35034
|
}
|
|
35034
35035
|
}
|
|
35035
35036
|
const result = await inspectDescribe(bridge, {
|
|
@@ -35091,8 +35092,8 @@ async function runLinkCommand(args, opts = {}) {
|
|
|
35091
35092
|
commandTimeoutMs: opts.timeoutMs
|
|
35092
35093
|
});
|
|
35093
35094
|
if (parsed.positional.length !== 1) {
|
|
35094
|
-
console.error("
|
|
35095
|
-
console.error(" examples:
|
|
35095
|
+
console.error(" peach open: expected exactly one <url-or-route>");
|
|
35096
|
+
console.error(" examples: peach open /settings | peach open myapp://settings");
|
|
35096
35097
|
rnxExit(1);
|
|
35097
35098
|
}
|
|
35098
35099
|
const bridge = createBridgeFromParsed(parsed);
|
|
@@ -35103,9 +35104,9 @@ async function runLinkCommand(args, opts = {}) {
|
|
|
35103
35104
|
} catch (err) {
|
|
35104
35105
|
console.error(` link failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
35105
35106
|
await printBridgeFailureDiagnostics(bridge, {
|
|
35106
|
-
errorsCommand: `
|
|
35107
|
-
warningsCommand: `
|
|
35108
|
-
requestsCommand: `
|
|
35107
|
+
errorsCommand: `peach get errors 5${simHint}`,
|
|
35108
|
+
warningsCommand: `peach get warnings 5${simHint}`,
|
|
35109
|
+
requestsCommand: `peach get requests 5${simHint}`
|
|
35109
35110
|
});
|
|
35110
35111
|
rnxExit(1);
|
|
35111
35112
|
} finally {
|
|
@@ -35144,12 +35145,12 @@ async function runOpenCommand(args, opts = {}) {
|
|
|
35144
35145
|
const cdpPort = cdpPortArg ? Number(cdpPortArg) : void 0;
|
|
35145
35146
|
if (cdpPortArg && (!Number.isFinite(cdpPort) || cdpPort <= 0)) {
|
|
35146
35147
|
console.error(
|
|
35147
|
-
`
|
|
35148
|
+
` peach open: --cdp-port must be a positive port number, got "${cdpPortArg}"`
|
|
35148
35149
|
);
|
|
35149
35150
|
rnxExit(1);
|
|
35150
35151
|
}
|
|
35151
35152
|
if (requestedProfileId && ephemeralProfile) {
|
|
35152
|
-
console.error("
|
|
35153
|
+
console.error(" peach open: --profile cannot be combined with --ephemeral");
|
|
35153
35154
|
rnxExit(1);
|
|
35154
35155
|
}
|
|
35155
35156
|
const profileId = requestedProfileId ? ensureProfile(requestedProfileId).id : void 0;
|
|
@@ -35157,7 +35158,7 @@ async function runOpenCommand(args, opts = {}) {
|
|
|
35157
35158
|
const commandConfig = parseOpenRuntimeConfig(args);
|
|
35158
35159
|
if (openInNewSim && parsed.simIdSource === "flag") {
|
|
35159
35160
|
console.error(
|
|
35160
|
-
"
|
|
35161
|
+
" peach open: --new, --profile, and --ephemeral cannot be combined with --sim"
|
|
35161
35162
|
);
|
|
35162
35163
|
rnxExit(1);
|
|
35163
35164
|
}
|
|
@@ -35165,14 +35166,14 @@ async function runOpenCommand(args, opts = {}) {
|
|
|
35165
35166
|
if (!target && args.includes("--port")) {
|
|
35166
35167
|
const portValue = args[args.indexOf("--port") + 1] ?? "<number>";
|
|
35167
35168
|
console.error(
|
|
35168
|
-
`
|
|
35169
|
+
` peach open: --port is the WS bridge port, not the app port. to open the app on ${portValue}, pass it positionally: \`peach open ${portValue}\``
|
|
35169
35170
|
);
|
|
35170
35171
|
rnxExit(1);
|
|
35171
35172
|
}
|
|
35172
35173
|
if (isAppDeepLinkTarget(target)) {
|
|
35173
35174
|
if (openInNewSim) {
|
|
35174
35175
|
console.error(
|
|
35175
|
-
"
|
|
35176
|
+
" peach open: deep links target the current app; remove --new, --profile, or --ephemeral"
|
|
35176
35177
|
);
|
|
35177
35178
|
rnxExit(1);
|
|
35178
35179
|
}
|
|
@@ -35188,7 +35189,7 @@ async function runOpenCommand(args, opts = {}) {
|
|
|
35188
35189
|
}
|
|
35189
35190
|
})();
|
|
35190
35191
|
console.log(
|
|
35191
|
-
" that\u2019s
|
|
35192
|
+
" that\u2019s a peach preview/build link \u2014 a full player page, not a driveable sim."
|
|
35192
35193
|
);
|
|
35193
35194
|
console.log(" opening it in your browser for viewing\u2026");
|
|
35194
35195
|
try {
|
|
@@ -35201,7 +35202,7 @@ async function runOpenCommand(args, opts = {}) {
|
|
|
35201
35202
|
rnxExit(1);
|
|
35202
35203
|
}
|
|
35203
35204
|
console.log(
|
|
35204
|
-
isLocal ? " to drive it under the CLI, point `
|
|
35205
|
+
isLocal ? " to drive it under the CLI, point `peach open` at the app\u2019s dev port instead (e.g. `peach open 8081`)." : " the CLI can\u2019t drive a remote preview (the engine only attaches to the local bridge from localhost). to drive the app, run it locally and `peach open <port>`."
|
|
35205
35206
|
);
|
|
35206
35207
|
return;
|
|
35207
35208
|
}
|
|
@@ -35236,25 +35237,25 @@ async function runOpenCommand(args, opts = {}) {
|
|
|
35236
35237
|
parsed.wsPort = await ensureBridgeForOpen(parsed.wsPort, parsed.explicitPort);
|
|
35237
35238
|
const requestedDriverId = args.find((_, i) => args[i - 1] === "--driver") || "";
|
|
35238
35239
|
if (requestedDriverId && !isDriverId(requestedDriverId)) {
|
|
35239
|
-
console.error(` unknown driver "${requestedDriverId}" \u2014 run \`
|
|
35240
|
+
console.error(` unknown driver "${requestedDriverId}" \u2014 run \`peach list --drivers\``);
|
|
35240
35241
|
rnxExit(1);
|
|
35241
35242
|
}
|
|
35242
35243
|
const driverId = isDriverId(requestedDriverId) ? requestedDriverId : process.env.CI === "1" || process.env.CI === "true" || process.env.GITHUB_ACTIONS === "true" || isAgentEnv() || !process.stdin.isTTY ? "playwright" : readSimulatorDriverPreference() || "playwright";
|
|
35243
35244
|
const driverHeadless = resolveDriverHeadless(args, driverId);
|
|
35244
35245
|
if (cdpPort && driverId !== "playwright") {
|
|
35245
|
-
console.error("
|
|
35246
|
+
console.error(" peach open: --cdp-port is only honored by the playwright driver");
|
|
35246
35247
|
rnxExit(1);
|
|
35247
35248
|
}
|
|
35248
35249
|
const hotFlag = args.includes("--hot");
|
|
35249
35250
|
const noHmrFlag = args.includes("--no-hmr");
|
|
35250
35251
|
if (hotFlag && noHmrFlag) {
|
|
35251
|
-
console.error("
|
|
35252
|
+
console.error(" peach open: --hot and --no-hmr cannot be combined");
|
|
35252
35253
|
rnxExit(1);
|
|
35253
35254
|
}
|
|
35254
35255
|
const hotMode = hotFlag ? true : noHmrFlag ? false : driverId !== "playwright";
|
|
35255
35256
|
const deviceArg = args.find((_, i) => args[i - 1] === "--device");
|
|
35256
35257
|
if (deviceArg && !(deviceArg in import_settings.devices)) {
|
|
35257
|
-
console.error(`
|
|
35258
|
+
console.error(` peach open: unknown device "${deviceArg}"`);
|
|
35258
35259
|
console.error(` known devices: ${(0, import_settings.listSelectableDeviceModels)().join(", ")}`);
|
|
35259
35260
|
rnxExit(1);
|
|
35260
35261
|
}
|
|
@@ -35262,7 +35263,7 @@ async function runOpenCommand(args, opts = {}) {
|
|
|
35262
35263
|
const viewportArg = args.find((_, i) => args[i - 1] === "--viewport");
|
|
35263
35264
|
const viewportMatch = viewportArg ? /^(\d+)x(\d+)$/.exec(viewportArg) : null;
|
|
35264
35265
|
if (viewportArg && !viewportMatch) {
|
|
35265
|
-
console.error(`
|
|
35266
|
+
console.error(` peach open: --viewport must be <width>x<height>, got "${viewportArg}"`);
|
|
35266
35267
|
rnxExit(1);
|
|
35267
35268
|
}
|
|
35268
35269
|
const explicitViewport = viewportMatch ? { width: Number(viewportMatch[1]), height: Number(viewportMatch[2]) } : void 0;
|
|
@@ -35358,9 +35359,9 @@ async function runOpenCommand(args, opts = {}) {
|
|
|
35358
35359
|
` open failed: ${err instanceof Error ? err.message : String(err)}`
|
|
35359
35360
|
);
|
|
35360
35361
|
await printBridgeFailureDiagnostics(bridge, {
|
|
35361
|
-
errorsCommand: `
|
|
35362
|
-
warningsCommand: `
|
|
35363
|
-
requestsCommand: `
|
|
35362
|
+
errorsCommand: `peach get errors 5${simHint}`,
|
|
35363
|
+
warningsCommand: `peach get warnings 5${simHint}`,
|
|
35364
|
+
requestsCommand: `peach get requests 5${simHint}`
|
|
35364
35365
|
});
|
|
35365
35366
|
rnxExit(1);
|
|
35366
35367
|
}
|
|
@@ -35376,9 +35377,9 @@ async function runOpenCommand(args, opts = {}) {
|
|
|
35376
35377
|
` timed out waiting for sim ${targetSim.id} to load ${navigatedShellUrl}`
|
|
35377
35378
|
);
|
|
35378
35379
|
await printBridgeFailureDiagnostics(bridge, {
|
|
35379
|
-
errorsCommand: `
|
|
35380
|
-
warningsCommand: `
|
|
35381
|
-
requestsCommand: `
|
|
35380
|
+
errorsCommand: `peach get errors 5${simHint}`,
|
|
35381
|
+
warningsCommand: `peach get warnings 5${simHint}`,
|
|
35382
|
+
requestsCommand: `peach get requests 5${simHint}`
|
|
35382
35383
|
});
|
|
35383
35384
|
rnxExit(1);
|
|
35384
35385
|
}
|
|
@@ -35394,9 +35395,9 @@ async function runOpenCommand(args, opts = {}) {
|
|
|
35394
35395
|
` timed out waiting for current sim to load target after ${ready.attempts} polls over ${Math.round(ready.attempts * ready.intervalMs / 1e3)}s; ${observed}`
|
|
35395
35396
|
);
|
|
35396
35397
|
await printBridgeFailureDiagnostics(bridge, {
|
|
35397
|
-
errorsCommand: `
|
|
35398
|
-
warningsCommand: `
|
|
35399
|
-
requestsCommand: `
|
|
35398
|
+
errorsCommand: `peach get errors 5${simHint}`,
|
|
35399
|
+
warningsCommand: `peach get warnings 5${simHint}`,
|
|
35400
|
+
requestsCommand: `peach get requests 5${simHint}`
|
|
35400
35401
|
});
|
|
35401
35402
|
rnxExit(1);
|
|
35402
35403
|
}
|
|
@@ -35426,7 +35427,7 @@ async function runOpenCommand(args, opts = {}) {
|
|
|
35426
35427
|
}
|
|
35427
35428
|
const driver = getDriver(driverId);
|
|
35428
35429
|
if (!driver) {
|
|
35429
|
-
console.error(` unknown driver "${driverId}" \u2014 run \`
|
|
35430
|
+
console.error(` unknown driver "${driverId}" \u2014 run \`peach list --drivers\``);
|
|
35430
35431
|
rnxExit(1);
|
|
35431
35432
|
}
|
|
35432
35433
|
const connectWait = resolveDriverConnectWaitOptions();
|
|
@@ -35504,7 +35505,7 @@ async function runUseLikeCommand(args, opts = {}) {
|
|
|
35504
35505
|
console.error(
|
|
35505
35506
|
` refused: ${target.id} is locked by the active user (${secs}s) \u2014 that's a live human tab`
|
|
35506
35507
|
);
|
|
35507
|
-
console.error(` run \`
|
|
35508
|
+
console.error(` run \`peach open --new\` for a fresh investigation sim`);
|
|
35508
35509
|
rnxExit(1);
|
|
35509
35510
|
}
|
|
35510
35511
|
if (!force) {
|
|
@@ -35512,7 +35513,7 @@ async function runUseLikeCommand(args, opts = {}) {
|
|
|
35512
35513
|
` refused: ${target.id} is leased by ${target.lockedBy} (${secs}s)`
|
|
35513
35514
|
);
|
|
35514
35515
|
console.error(
|
|
35515
|
-
` \`
|
|
35516
|
+
` \`peach use ${target.id} --force\` to take it, or \`peach open --new\` for a fresh sim`
|
|
35516
35517
|
);
|
|
35517
35518
|
rnxExit(1);
|
|
35518
35519
|
}
|
|
@@ -35524,9 +35525,9 @@ async function runUseLikeCommand(args, opts = {}) {
|
|
|
35524
35525
|
rethrowIfExit(err);
|
|
35525
35526
|
console.error(` use failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
35526
35527
|
await printBridgeFailureDiagnostics(bridge, {
|
|
35527
|
-
errorsCommand: `
|
|
35528
|
-
warningsCommand: `
|
|
35529
|
-
requestsCommand: `
|
|
35528
|
+
errorsCommand: `peach get errors 5${simHint}`,
|
|
35529
|
+
warningsCommand: `peach get warnings 5${simHint}`,
|
|
35530
|
+
requestsCommand: `peach get requests 5${simHint}`
|
|
35530
35531
|
});
|
|
35531
35532
|
rnxExit(1);
|
|
35532
35533
|
}
|
|
@@ -35565,7 +35566,7 @@ async function runClaimCommand(args, opts = {}) {
|
|
|
35565
35566
|
if (err instanceof BridgeSimLockedError) {
|
|
35566
35567
|
const secs = Math.max(0, Math.round(err.lock.expiresInMs / 1e3));
|
|
35567
35568
|
console.error(` claim failed: locked by ${err.lock.by} for ${secs}s more`);
|
|
35568
|
-
console.error(` use --force to take it, or \`
|
|
35569
|
+
console.error(` use --force to take it, or \`peach open --new\` for a fresh sim`);
|
|
35569
35570
|
rnxExit(1);
|
|
35570
35571
|
}
|
|
35571
35572
|
console.error(` claim failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
@@ -35690,7 +35691,7 @@ async function runCloseCommand(args, opts = {}) {
|
|
|
35690
35691
|
);
|
|
35691
35692
|
}
|
|
35692
35693
|
if (plan.refused.some((entry) => entry.kind === "cli") && !force) {
|
|
35693
|
-
console.error(` \`
|
|
35694
|
+
console.error(` \`peach close --all --force\` to close leased sims too`);
|
|
35694
35695
|
}
|
|
35695
35696
|
if (plan.staleSavedId) {
|
|
35696
35697
|
clearCurrentSimId();
|
|
@@ -35768,9 +35769,9 @@ async function runCloseCommand(args, opts = {}) {
|
|
|
35768
35769
|
rethrowIfExit(err);
|
|
35769
35770
|
console.error(` close failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
35770
35771
|
await printBridgeFailureDiagnostics(bridge, {
|
|
35771
|
-
errorsCommand: `
|
|
35772
|
-
warningsCommand: `
|
|
35773
|
-
requestsCommand: `
|
|
35772
|
+
errorsCommand: `peach get errors 5${simHint}`,
|
|
35773
|
+
warningsCommand: `peach get warnings 5${simHint}`,
|
|
35774
|
+
requestsCommand: `peach get requests 5${simHint}`
|
|
35774
35775
|
});
|
|
35775
35776
|
rnxExit(1);
|
|
35776
35777
|
}
|
|
@@ -36449,7 +36450,7 @@ var init_settling = __esm({
|
|
|
36449
36450
|
// cli/maestro-js.ts
|
|
36450
36451
|
function executeSyncHttp(url, method, params) {
|
|
36451
36452
|
if (params?.multipartForm) {
|
|
36452
|
-
throw new Error("http: multipartForm is not supported by
|
|
36453
|
+
throw new Error("http: multipartForm is not supported by peach yet");
|
|
36453
36454
|
}
|
|
36454
36455
|
const childEnv = { ...process.env };
|
|
36455
36456
|
for (const key of Object.keys(childEnv)) {
|
|
@@ -36684,7 +36685,7 @@ var init_run_registry = __esm({
|
|
|
36684
36685
|
// cli/commands/upload.ts
|
|
36685
36686
|
async function resolveDefaultUploadOrigin(explicitOrigin) {
|
|
36686
36687
|
if (explicitOrigin) return explicitOrigin;
|
|
36687
|
-
if (process.env.
|
|
36688
|
+
if (process.env.PEACH_UPLOAD_ORIGIN) return process.env.PEACH_UPLOAD_ORIGIN;
|
|
36688
36689
|
return REMOTE_DEFAULT_ORIGIN;
|
|
36689
36690
|
}
|
|
36690
36691
|
var import_compress, import_compress_node, import_presigned_upload, import_trace, REMOTE_DEFAULT_ORIGIN, REMOTE_DEFAULT_PUBLIC_PREVIEW_ORIGIN;
|
|
@@ -36703,8 +36704,8 @@ var init_upload = __esm({
|
|
|
36703
36704
|
init_run_registry();
|
|
36704
36705
|
init_run_rnx();
|
|
36705
36706
|
init_ws_bridge();
|
|
36706
|
-
REMOTE_DEFAULT_ORIGIN = process.env.
|
|
36707
|
-
REMOTE_DEFAULT_PUBLIC_PREVIEW_ORIGIN = process.env.
|
|
36707
|
+
REMOTE_DEFAULT_ORIGIN = process.env.PEACH_UPLOAD_ORIGIN || "https://contrast.dev";
|
|
36708
|
+
REMOTE_DEFAULT_PUBLIC_PREVIEW_ORIGIN = process.env.PEACH_PREVIEW_ORIGIN || rnxPublicBrand.origin;
|
|
36708
36709
|
}
|
|
36709
36710
|
});
|
|
36710
36711
|
|
|
@@ -36725,11 +36726,11 @@ async function ensureCliRecordingEntitlement(commandLabel, opts = {}) {
|
|
|
36725
36726
|
if (!auth) {
|
|
36726
36727
|
process.stderr.write(
|
|
36727
36728
|
`
|
|
36728
|
-
|
|
36729
|
+
peach needs auth before it can check recording access.
|
|
36729
36730
|
|
|
36730
36731
|
pick one:
|
|
36731
|
-
\u2022 run \`
|
|
36732
|
-
\u2022 set
|
|
36732
|
+
\u2022 run \`peach login\`
|
|
36733
|
+
\u2022 set PEACH_API_KEY=sk_rnx_... (recommended for CI)
|
|
36733
36734
|
|
|
36734
36735
|
`
|
|
36735
36736
|
);
|
|
@@ -36745,7 +36746,7 @@ async function ensureCliRecordingEntitlement(commandLabel, opts = {}) {
|
|
|
36745
36746
|
} catch (error) {
|
|
36746
36747
|
process.stderr.write(
|
|
36747
36748
|
`
|
|
36748
|
-
|
|
36749
|
+
peach couldn't verify recording access.
|
|
36749
36750
|
${error instanceof Error ? error.message : String(error)}
|
|
36750
36751
|
|
|
36751
36752
|
`
|
|
@@ -36755,8 +36756,8 @@ async function ensureCliRecordingEntitlement(commandLabel, opts = {}) {
|
|
|
36755
36756
|
if (res.status === 401) {
|
|
36756
36757
|
process.stderr.write(
|
|
36757
36758
|
`
|
|
36758
|
-
|
|
36759
|
-
sign in again for that origin, or provide a valid
|
|
36759
|
+
peach couldn't verify recording access with the current auth against ${billingOrigin}.
|
|
36760
|
+
sign in again for that origin, or provide a valid PEACH_API_KEY.
|
|
36760
36761
|
|
|
36761
36762
|
`
|
|
36762
36763
|
);
|
|
@@ -36766,7 +36767,7 @@ async function ensureCliRecordingEntitlement(commandLabel, opts = {}) {
|
|
|
36766
36767
|
const text = await res.text().catch(() => "");
|
|
36767
36768
|
process.stderr.write(
|
|
36768
36769
|
`
|
|
36769
|
-
|
|
36770
|
+
peach couldn't verify recording access (${res.status}).
|
|
36770
36771
|
${text || "unexpected billing response"}
|
|
36771
36772
|
|
|
36772
36773
|
`
|
|
@@ -36778,7 +36779,7 @@ async function ensureCliRecordingEntitlement(commandLabel, opts = {}) {
|
|
|
36778
36779
|
const plan = data.plan ?? "free";
|
|
36779
36780
|
process.stderr.write(
|
|
36780
36781
|
`
|
|
36781
|
-
|
|
36782
|
+
peach recording requires Personal, Team, or an active trial.
|
|
36782
36783
|
current plan: ${plan}.
|
|
36783
36784
|
free keeps basic 3d mode; the trial unlocks the full Personal surface.
|
|
36784
36785
|
|
|
@@ -37018,7 +37019,7 @@ var init_bridge_flow_runner = __esm({
|
|
|
37018
37019
|
}
|
|
37019
37020
|
if (status.bridgeError) {
|
|
37020
37021
|
throw new Error(
|
|
37021
|
-
`target sim is not responding to the bridge (${status.bridgeError}). it is likely a stale orphan; run \`
|
|
37022
|
+
`target sim is not responding to the bridge (${status.bridgeError}). it is likely a stale orphan; run \`peach list\`, then close it with \`peach close <id>\` or start a fresh one with \`peach open --new <port>\`.`
|
|
37022
37023
|
);
|
|
37023
37024
|
}
|
|
37024
37025
|
throw new Error(`app not ready after ${timeout}ms: ${waitReadyReason(status)}`);
|
|
@@ -37146,7 +37147,7 @@ var init_bridge_flow_runner = __esm({
|
|
|
37146
37147
|
const extension = videoMime.includes("mp4") ? "mp4" : "webm";
|
|
37147
37148
|
const outputPath = path18.join(
|
|
37148
37149
|
this.opts.recordingOutputDir,
|
|
37149
|
-
`
|
|
37150
|
+
`peach-${Date.now()}.${extension}`
|
|
37150
37151
|
);
|
|
37151
37152
|
fs18.writeFileSync(outputPath, Buffer.concat(chunks));
|
|
37152
37153
|
return outputPath;
|
|
@@ -38258,11 +38259,11 @@ var init_bridge_flow_runner = __esm({
|
|
|
38258
38259
|
await this.resetGuestAppData();
|
|
38259
38260
|
await this.rearmCaptureAfterRuntimeReload();
|
|
38260
38261
|
}
|
|
38261
|
-
// maestro clearKeychain: there is no real keychain in
|
|
38262
|
+
// maestro clearKeychain: there is no real keychain in peach's browser
|
|
38262
38263
|
// sandbox. log loudly so the author notices, then continue — matching the
|
|
38263
38264
|
// "loud warning, not silent skip" policy in the plan.
|
|
38264
38265
|
clearKeychain() {
|
|
38265
|
-
console.warn("[flow] clearKeychain:
|
|
38266
|
+
console.warn("[flow] clearKeychain: peach has no keychain surface \u2014 no-op (warning)");
|
|
38266
38267
|
}
|
|
38267
38268
|
// maestro copyTextFrom: find an element and capture its text for use in
|
|
38268
38269
|
// later steps via ${maestro.copiedText} (upstream form) or the legacy
|
|
@@ -38901,14 +38902,14 @@ var skill = {
|
|
|
38901
38902
|
// src/skills/builtin/compat-check.ts
|
|
38902
38903
|
var skill2 = {
|
|
38903
38904
|
name: "compat-check",
|
|
38904
|
-
description: "Check package compatibility with
|
|
38905
|
+
description: "Check package compatibility with peach",
|
|
38905
38906
|
type: "review",
|
|
38906
38907
|
version: "1.0.0",
|
|
38907
38908
|
triggers: ["compatibility", "compat", "check package", "supported packages"],
|
|
38908
38909
|
tools: [
|
|
38909
38910
|
{
|
|
38910
38911
|
name: "check_compatibility",
|
|
38911
|
-
description: "Scan project dependencies for
|
|
38912
|
+
description: "Scan project dependencies for peach compatibility",
|
|
38912
38913
|
parameters: {
|
|
38913
38914
|
packageName: {
|
|
38914
38915
|
type: "string",
|