peachsim 0.1.1644 → 0.1.1653

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (608) hide show
  1. package/README.md +12 -0
  2. package/cli/app-catalog.ts +1 -1
  3. package/cli/app-fonts.ts +11 -80
  4. package/cli/app-splash.ts +18 -12
  5. package/cli/bridge-flow-runner.ts +11 -7
  6. package/cli/cloud-client.ts +10 -13
  7. package/cli/command-registry.ts +13 -4
  8. package/cli/commands/box.ts +4 -4
  9. package/cli/commands/control.ts +93 -53
  10. package/cli/commands/coverage-parser.ts +67 -0
  11. package/cli/commands/coverage.ts +550 -0
  12. package/cli/commands/debug.ts +9 -18
  13. package/cli/commands/desktop.ts +19 -7
  14. package/cli/commands/device.ts +14 -9
  15. package/cli/commands/guest-host.ts +6 -10
  16. package/cli/commands/inspect/core.ts +81 -17
  17. package/cli/commands/inspect.ts +13 -8
  18. package/cli/commands/kotlin.ts +2 -2
  19. package/cli/commands/maestro-compare.ts +1 -1
  20. package/cli/commands/platform.ts +20 -11
  21. package/cli/commands/preview.ts +16 -18
  22. package/cli/commands/runtime.ts +3 -2
  23. package/cli/commands/screenshot-layers.ts +1 -1
  24. package/cli/commands/screenshot.ts +1 -1
  25. package/cli/commands/serve.ts +5 -1
  26. package/cli/commands/support.ts +4 -4
  27. package/cli/commands/three-mode.ts +22 -15
  28. package/cli/commands/upload.ts +44 -45
  29. package/cli/current-sim.ts +38 -0
  30. package/cli/desktop-companion.ts +36 -8
  31. package/cli/device-option.ts +1 -1
  32. package/cli/drivers/playwright.ts +1 -0
  33. package/cli/drivers/types.ts +4 -0
  34. package/cli/help-core.ts +1 -1
  35. package/cli/internal-child.ts +2 -1
  36. package/cli/main.ts +9 -3
  37. package/cli/outbound-endpoints.ts +11 -3
  38. package/cli/output-redaction.ts +39 -14
  39. package/cli/remote-simulators.ts +4 -1
  40. package/cli/scene-video.ts +5 -2
  41. package/cli/send-to-box.ts +7 -10
  42. package/cli/telemetry.ts +1 -1
  43. package/cli/ws-bridge.ts +8 -1
  44. package/detox/attempt-events.cjs +3 -1
  45. package/detox/attempt-events.d.cts +1 -1
  46. package/detox/expectations.ts +108 -99
  47. package/detox/frame-offset.d.mts +6 -0
  48. package/detox/frame-offset.mjs +35 -0
  49. package/detox/gestures.ts +6 -18
  50. package/detox/index.ts +169 -101
  51. package/detox/jest-preset.cjs +1 -3
  52. package/detox/jest-transform.cjs +4 -0
  53. package/detox/matchers.ts +3 -0
  54. package/detox/motion-change.cjs +46 -114
  55. package/detox/motion-change.d.cts +5 -27
  56. package/dist-lib/agent-daemon-client.cjs +1 -1
  57. package/dist-lib/agent-events.cjs +1 -1
  58. package/dist-lib/attached-projects.cjs +1 -1
  59. package/dist-lib/auth/shared-session.cjs +1 -1
  60. package/dist-lib/backend-origin.cjs +1 -1
  61. package/dist-lib/beta.cjs +1 -1
  62. package/dist-lib/beta.mjs +1 -1
  63. package/dist-lib/bridge-constants.cjs +1 -1
  64. package/dist-lib/bridge-contract-input.cjs +65 -1
  65. package/dist-lib/bridge-contract-input.mjs +63 -1
  66. package/dist-lib/bridge-contract.cjs +19 -1
  67. package/dist-lib/bridge-contract.mjs +17 -1
  68. package/dist-lib/bundle-channel.cjs +38091 -14846
  69. package/dist-lib/capture-contract.cjs +1 -1
  70. package/dist-lib/capture-contract.mjs +1 -1
  71. package/dist-lib/cloud-contract.cjs +1 -1
  72. package/dist-lib/cloud-contract.mjs +1 -1
  73. package/dist-lib/cloud-test-args.cjs +1 -1
  74. package/dist-lib/cloud-test-args.mjs +1 -1
  75. package/dist-lib/cloud.cjs +1 -1
  76. package/dist-lib/cloud.mjs +1 -1
  77. package/dist-lib/config.cjs +1 -1
  78. package/dist-lib/config.mjs +5 -3
  79. package/dist-lib/detox/index.cjs +1244 -4509
  80. package/dist-lib/detox/jest-preset.cjs +1 -3
  81. package/dist-lib/detox/jest-transform.cjs +4 -0
  82. package/dist-lib/dev-bundle-resolution.cjs +28 -24
  83. package/dist-lib/expo-swift-bundle.cjs +35049 -13125
  84. package/dist-lib/expo-swift-metadata.cjs +1 -1
  85. package/dist-lib/expo-swift-metadata.mjs +1 -1
  86. package/dist-lib/home-paths.cjs +1 -1
  87. package/dist-lib/host/bridge-host.cjs +45112 -63143
  88. package/dist-lib/host/fetch-proxy-handler.cjs +3544 -11
  89. package/dist-lib/host/fetch-proxy-overrides.cjs +1 -1
  90. package/dist-lib/host/fetch-proxy-overrides.mjs +1 -1
  91. package/dist-lib/host/replacement-module-handler.cjs +1 -1
  92. package/dist-lib/host/websocket-proxy.cjs +1 -1
  93. package/dist-lib/index.cjs +1909 -2029
  94. package/dist-lib/jump-to-source-babel.cjs +1 -1
  95. package/dist-lib/jump-to-source-native.cjs +1 -1
  96. package/dist-lib/kotlin-host.cjs +2 -2
  97. package/dist-lib/menu.cjs +1 -1
  98. package/dist-lib/menu.mjs +1 -1
  99. package/dist-lib/metro-fingerprint-registry.cjs +1 -1
  100. package/dist-lib/metro-fingerprint-registry.mjs +1 -1
  101. package/dist-lib/metro-production-bundle.cjs +1 -1
  102. package/dist-lib/metro-production-bundle.mjs +1 -1
  103. package/dist-lib/metro.cjs +380 -522
  104. package/dist-lib/native-app-identity-project.cjs +39 -252
  105. package/dist-lib/native-app-identity-project.mjs +1174 -11
  106. package/dist-lib/native-app-identity.cjs +8 -3
  107. package/dist-lib/native-app-identity.mjs +8 -3
  108. package/dist-lib/native-firebase-metadata.cjs +1 -1
  109. package/dist-lib/native-firebase-metadata.mjs +1 -1
  110. package/dist-lib/plist.cjs +2 -244
  111. package/dist-lib/plist.mjs +1 -1
  112. package/dist-lib/profiles.cjs +1 -1
  113. package/dist-lib/public-brand.cjs +1 -1
  114. package/dist-lib/public-origins-lib-esm.json +290 -0
  115. package/dist-lib/public-origins-lib-static.json +1 -0
  116. package/dist-lib/public-origins-lib.json +1852 -0
  117. package/dist-lib/react-native-host-modules.cjs +1 -1
  118. package/dist-lib/react-native-host-modules.mjs +1 -1
  119. package/dist-lib/scripts/dev-server-scanner.cjs +14 -253
  120. package/dist-lib/sdk.cjs +83 -16
  121. package/dist-lib/sdk.mjs +81 -15
  122. package/dist-lib/skills.cjs +50546 -75098
  123. package/dist-lib/swift-compile.cjs +25897 -1070
  124. package/dist-lib/swift-compile.mjs +25866 -1033
  125. package/dist-lib/swift-package.cjs +79 -1
  126. package/dist-lib/swift-package.mjs +75 -1
  127. package/dist-lib/swift-submit.cjs +1 -1
  128. package/dist-lib/swift-submit.mjs +1 -1
  129. package/dist-lib/swift-toolchain.cjs +1 -1
  130. package/dist-lib/swift.cjs +1 -1
  131. package/dist-lib/vite-swift.cjs +34273 -12349
  132. package/dist-lib/vite.cjs +373 -298
  133. package/dist-lib/worklet-executable.cjs +1 -1
  134. package/dist-lib/worklet-executable.mjs +1 -1
  135. package/dist-types/packages/peach-compat/src/engine-config.d.ts +2 -0
  136. package/dist-types/packages/peach-compat/src/stubs/form-sheet-spring.d.ts +9 -0
  137. package/dist-types/packages/peach-compat/src/stubs/native-evaluation-lease.d.ts +47 -0
  138. package/dist-types/packages/peach-compat/src/stubs/native-seams/react-native-cookies.d.ts +113 -0
  139. package/dist-types/packages/peach-compat/src/stubs/native-seams/react-native-gesture-handler.d.ts +154 -0
  140. package/dist-types/packages/peach-compat/src/stubs/screen-transition-math.d.ts +756 -0
  141. package/dist-types/packages/peach-compat/src/stubs/transition-scalar.d.ts +25 -0
  142. package/dist-types/packages/peach-engine/src/billing/plans.d.ts +64 -0
  143. package/dist-types/packages/peach-engine/src/browser-page-target.d.ts +2 -0
  144. package/dist-types/packages/peach-engine/src/bundle-platform-url.d.ts +3 -0
  145. package/dist-types/packages/peach-engine/src/capture/browser-accessibility-host.d.ts +3 -0
  146. package/dist-types/packages/peach-engine/src/capture/browser-composite.d.ts +55 -0
  147. package/dist-types/packages/peach-engine/src/capture/browserAccessibilityContract.d.ts +27 -0
  148. package/dist-types/packages/peach-engine/src/capture/nativeScreenCaptureContract.d.ts +22 -0
  149. package/dist-types/packages/peach-engine/src/cli-companion.d.ts +36 -0
  150. package/dist-types/packages/peach-engine/src/components/native-ui/webview-frame-bridge.d.ts +34 -0
  151. package/dist-types/packages/peach-engine/src/config.d.ts +5 -0
  152. package/dist-types/packages/peach-engine/src/engine/android-stretch-effect.d.ts +57 -0
  153. package/dist-types/packages/peach-engine/src/engine/animated-driven-style.d.ts +47 -0
  154. package/dist-types/packages/peach-engine/src/engine/animated-value.d.ts +5 -0
  155. package/dist-types/packages/peach-engine/src/engine/animated.d.ts +195 -0
  156. package/dist-types/packages/peach-engine/src/engine/animation-clockContract.d.ts +15 -0
  157. package/dist-types/packages/peach-engine/src/engine/animation-graph.d.ts +148 -0
  158. package/dist-types/packages/peach-engine/src/engine/app-catalog-wire.d.ts +10 -0
  159. package/dist-types/packages/peach-engine/src/engine/app-font-registry.d.ts +87 -0
  160. package/dist-types/packages/peach-engine/src/engine/attributed-paragraph-paint.d.ts +7 -0
  161. package/dist-types/packages/peach-engine/src/engine/attributed-paragraph.d.ts +123 -0
  162. package/dist-types/packages/peach-engine/src/engine/audioContract.d.ts +16 -0
  163. package/dist-types/packages/peach-engine/src/engine/canvaskit-api.d.ts +93 -0
  164. package/dist-types/packages/peach-engine/src/engine/canvaskit-renderer.d.ts +216 -0
  165. package/dist-types/packages/peach-engine/src/engine/config-plugin-fonts.d.ts +40 -0
  166. package/dist-types/packages/peach-engine/src/engine/config-plugin-splash.d.ts +25 -0
  167. package/dist-types/packages/peach-engine/src/engine/cull-visibility.d.ts +44 -0
  168. package/dist-types/packages/peach-engine/src/engine/damage-rect.d.ts +19 -0
  169. package/dist-types/packages/peach-engine/src/engine/engine-resource.d.ts +6 -0
  170. package/dist-types/packages/peach-engine/src/engine/expo-manifest.d.ts +5 -0
  171. package/dist-types/packages/peach-engine/src/engine/fiber-debug-metadata.d.ts +30 -0
  172. package/dist-types/packages/peach-engine/src/engine/font-config.d.ts +139 -0
  173. package/dist-types/packages/peach-engine/src/engine/generated/sf-pro-font.d.ts +1 -0
  174. package/dist-types/packages/peach-engine/src/engine/glass-material.d.ts +31 -0
  175. package/dist-types/packages/peach-engine/src/engine/host-composite.d.ts +100 -0
  176. package/dist-types/packages/peach-engine/src/engine/hosted-semantics.d.ts +49 -0
  177. package/dist-types/packages/peach-engine/src/engine/image-audit.d.ts +70 -0
  178. package/dist-types/packages/peach-engine/src/engine/image-loader.d.ts +350 -0
  179. package/dist-types/packages/peach-engine/src/engine/inspect-info.d.ts +27 -0
  180. package/dist-types/packages/peach-engine/src/engine/inspect-outline.d.ts +14 -0
  181. package/dist-types/packages/peach-engine/src/engine/inspect-visibility.d.ts +33 -0
  182. package/dist-types/packages/peach-engine/src/engine/ios-fast-scroll.d.ts +16 -0
  183. package/dist-types/packages/peach-engine/src/engine/layout-sab.d.ts +43 -0
  184. package/dist-types/packages/peach-engine/src/engine/liquid-glass-rect.d.ts +23 -0
  185. package/dist-types/packages/peach-engine/src/engine/liquid-glass-shaders.d.ts +9 -0
  186. package/dist-types/packages/peach-engine/src/engine/liquid-glass.d.ts +283 -0
  187. package/dist-types/packages/peach-engine/src/engine/live-object-counts.d.ts +6 -0
  188. package/dist-types/packages/peach-engine/src/engine/lottie-runtime.d.ts +32 -0
  189. package/dist-types/packages/peach-engine/src/engine/lottie-types.d.ts +138 -0
  190. package/dist-types/packages/peach-engine/src/engine/memory-counts.d.ts +27 -0
  191. package/dist-types/packages/peach-engine/src/engine/metalDirectContract.d.ts +108 -0
  192. package/dist-types/packages/peach-engine/src/engine/metalShaderContract.d.ts +217 -0
  193. package/dist-types/packages/peach-engine/src/engine/native-animation-driver.d.ts +112 -0
  194. package/dist-types/packages/peach-engine/src/engine/native-animation-graph.d.ts +62 -0
  195. package/dist-types/packages/peach-engine/src/engine/native-layout.d.ts +133 -0
  196. package/dist-types/packages/peach-engine/src/engine/native-resources.d.ts +26 -0
  197. package/dist-types/packages/peach-engine/src/engine/nativeReanimatedContract.d.ts +25 -0
  198. package/dist-types/packages/peach-engine/src/engine/nativeReplayContract.d.ts +64 -0
  199. package/dist-types/packages/peach-engine/src/engine/node.d.ts +589 -0
  200. package/dist-types/packages/peach-engine/src/engine/paint-boundary-types.d.ts +112 -0
  201. package/dist-types/packages/peach-engine/src/engine/paint-boundary.d.ts +57 -0
  202. package/dist-types/packages/peach-engine/src/engine/portalContract.d.ts +21 -0
  203. package/dist-types/packages/peach-engine/src/engine/portals.d.ts +20 -0
  204. package/dist-types/packages/peach-engine/src/engine/render-damage.d.ts +107 -0
  205. package/dist-types/packages/peach-engine/src/engine/riveContract.d.ts +420 -0
  206. package/dist-types/packages/peach-engine/src/engine/rn-spring.d.ts +51 -0
  207. package/dist-types/packages/peach-engine/src/engine/scene-table.d.ts +379 -0
  208. package/dist-types/packages/peach-engine/src/engine/scroll-momentum-math.d.ts +152 -0
  209. package/dist-types/packages/peach-engine/src/engine/scroll-pan-contacts.d.ts +10 -0
  210. package/dist-types/packages/peach-engine/src/engine/scroll-platform.d.ts +75 -0
  211. package/dist-types/packages/peach-engine/src/engine/scroll-range.d.ts +14 -0
  212. package/dist-types/packages/peach-engine/src/engine/scroll-velocity.d.ts +14 -0
  213. package/dist-types/packages/peach-engine/src/engine/scroll.d.ts +320 -0
  214. package/dist-types/packages/peach-engine/src/engine/signal.d.ts +7 -0
  215. package/dist-types/packages/peach-engine/src/engine/snapshot-cache-policy.d.ts +6 -0
  216. package/dist-types/packages/peach-engine/src/engine/svg-geometry.d.ts +41 -0
  217. package/dist-types/packages/peach-engine/src/engine/text-attachment-paragraphs.d.ts +10 -0
  218. package/dist-types/packages/peach-engine/src/engine/text-decoration.d.ts +11 -0
  219. package/dist-types/packages/peach-engine/src/engine/text-line-break.d.ts +22 -0
  220. package/dist-types/packages/peach-engine/src/engine/text-paint-receipt.d.ts +98 -0
  221. package/dist-types/packages/peach-engine/src/engine/text-paragraph.d.ts +11 -0
  222. package/dist-types/packages/peach-engine/src/engine/text-paragraphContract.d.ts +34 -0
  223. package/dist-types/packages/peach-engine/src/engine/text-transform.d.ts +1 -0
  224. package/dist-types/packages/peach-engine/src/engine/types.d.ts +657 -0
  225. package/dist-types/packages/peach-engine/src/engine/visible-frame.d.ts +54 -0
  226. package/dist-types/packages/peach-engine/src/engine/webrtcContract.d.ts +74 -0
  227. package/dist-types/packages/peach-engine/src/graphite-stats-fields.d.ts +184 -0
  228. package/dist-types/packages/peach-engine/src/guest-import-meta.d.ts +12 -0
  229. package/dist-types/packages/peach-engine/src/guest-module-overrides.d.ts +7 -0
  230. package/dist-types/packages/peach-engine/src/ios/app-card-types.d.ts +7 -0
  231. package/dist-types/packages/peach-engine/src/ios/apps/canvas-map-data.d.ts +177 -0
  232. package/dist-types/packages/peach-engine/src/ios/aux-home-scene.d.ts +54 -0
  233. package/dist-types/packages/peach-engine/src/ios/chrome-metrics.d.ts +47 -0
  234. package/dist-types/packages/peach-engine/src/ios/constants.d.ts +21 -0
  235. package/dist-types/packages/peach-engine/src/ios/duo-housing.d.ts +37 -0
  236. package/dist-types/packages/peach-engine/src/ios/home/types.d.ts +29 -0
  237. package/dist-types/packages/peach-engine/src/ios/home-app-catalog.d.ts +43 -0
  238. package/dist-types/packages/peach-engine/src/ios/photo-store.d.ts +73 -0
  239. package/dist-types/packages/peach-engine/src/ios/photoLibraryContract.d.ts +166 -0
  240. package/dist-types/packages/peach-engine/src/ios/shell-controller-types.d.ts +21 -0
  241. package/dist-types/packages/peach-engine/src/ios/shell-transition-debug.d.ts +18 -0
  242. package/dist-types/packages/peach-engine/src/metro-asset-path.d.ts +21 -0
  243. package/dist-types/packages/peach-engine/src/metro-fingerprint-registry-client.d.ts +11 -0
  244. package/dist-types/packages/peach-engine/src/metro-fingerprint.d.ts +38 -0
  245. package/dist-types/packages/peach-engine/src/native-preview-bundle.d.ts +44 -0
  246. package/dist-types/packages/peach-engine/src/observability/types.d.ts +74 -0
  247. package/dist-types/packages/peach-engine/src/peach-warm-manifest.d.ts +32 -0
  248. package/dist-types/packages/peach-engine/src/permissions/app-settings-client.d.ts +25 -0
  249. package/dist-types/packages/peach-engine/src/permissions/system-permission-types.d.ts +20 -0
  250. package/dist-types/packages/peach-engine/src/platform/android-back-panel.d.ts +131 -0
  251. package/dist-types/packages/peach-engine/src/platform/android-gesture-exclusion.d.ts +28 -0
  252. package/dist-types/packages/peach-engine/src/platform/android-predictive-back.d.ts +33 -0
  253. package/dist-types/packages/peach-engine/src/platform/system-bars-state.d.ts +14 -0
  254. package/dist-types/packages/peach-engine/src/playwright-sim-host.d.ts +1 -0
  255. package/dist-types/packages/peach-engine/src/preview/bundle-layout.d.ts +8 -0
  256. package/dist-types/packages/peach-engine/src/preview/bundle-variantContract.d.ts +24 -0
  257. package/dist-types/packages/peach-engine/src/preview/capture-bundle.d.ts +26 -0
  258. package/dist-types/packages/peach-engine/src/preview/compress-node.d.ts +2 -0
  259. package/dist-types/packages/peach-engine/src/preview/compress.d.ts +2 -0
  260. package/dist-types/packages/peach-engine/src/preview/presigned-upload.d.ts +60 -0
  261. package/dist-types/packages/peach-engine/src/preview/trace.d.ts +144 -0
  262. package/dist-types/packages/peach-engine/src/preview/upload-protocol.d.ts +152 -0
  263. package/dist-types/packages/peach-engine/src/profiler/animation-recording-loader.d.ts +1 -0
  264. package/dist-types/packages/peach-engine/src/profiler/profile-trace.d.ts +4 -0
  265. package/dist-types/packages/peach-engine/src/react-bridge.d.ts +3 -0
  266. package/dist-types/packages/peach-engine/src/react-native/AppState.d.ts +45 -0
  267. package/dist-types/packages/peach-engine/src/react-native/Appearance.d.ts +34 -0
  268. package/dist-types/packages/peach-engine/src/react-native/framework-colors-data.d.ts +2 -0
  269. package/dist-types/packages/peach-engine/src/react-native/host-services.d.ts +42 -0
  270. package/dist-types/packages/peach-engine/src/react-native/layout-animation.d.ts +22 -0
  271. package/dist-types/packages/peach-engine/src/react-native/platform-colors.d.ts +17 -0
  272. package/dist-types/packages/peach-engine/src/remote-stream/client-config.d.ts +10 -0
  273. package/dist-types/packages/peach-engine/src/remote-stream/cloud-display.d.ts +58 -0
  274. package/dist-types/packages/peach-engine/src/remote-stream/scene-recording.d.ts +45 -0
  275. package/dist-types/packages/peach-engine/src/render-worker/animated-drive-output.d.ts +35 -0
  276. package/dist-types/packages/peach-engine/src/render-worker/app-load.d.ts +16 -0
  277. package/dist-types/packages/peach-engine/src/render-worker/aux-surface-types.d.ts +2 -0
  278. package/dist-types/packages/peach-engine/src/render-worker/canvaskit-shared.d.ts +42 -0
  279. package/dist-types/packages/peach-engine/src/render-worker/canvaskit-webgpu.d.ts +434 -0
  280. package/dist-types/packages/peach-engine/src/render-worker/canvaskit-worker-init.d.ts +12 -0
  281. package/dist-types/packages/peach-engine/src/render-worker/compositor-backend.d.ts +31 -0
  282. package/dist-types/packages/peach-engine/src/render-worker/compositor-gpu.d.ts +202 -0
  283. package/dist-types/packages/peach-engine/src/render-worker/compositor-protocol.d.ts +1945 -0
  284. package/dist-types/packages/peach-engine/src/render-worker/compositor-runtime/scroll-drag-resample.d.ts +44 -0
  285. package/dist-types/packages/peach-engine/src/render-worker/css-keyframes-drive.d.ts +36 -0
  286. package/dist-types/packages/peach-engine/src/render-worker/edit-menu-geometry.d.ts +8 -0
  287. package/dist-types/packages/peach-engine/src/render-worker/engine-resource-relay.d.ts +21 -0
  288. package/dist-types/packages/peach-engine/src/render-worker/expo-widgetContract.d.ts +16 -0
  289. package/dist-types/packages/peach-engine/src/render-worker/gesture-seam-protocol.d.ts +152 -0
  290. package/dist-types/packages/peach-engine/src/render-worker/graph-linked-value.d.ts +29 -0
  291. package/dist-types/packages/peach-engine/src/render-worker/graphite-pipeline-compiler-contract.d.ts +49 -0
  292. package/dist-types/packages/peach-engine/src/render-worker/graphite-pipeline-compiler.d.ts +12 -0
  293. package/dist-types/packages/peach-engine/src/render-worker/host-service-protocol.d.ts +756 -0
  294. package/dist-types/packages/peach-engine/src/render-worker/image-lifecycle-event.d.ts +22 -0
  295. package/dist-types/packages/peach-engine/src/render-worker/image-pixel-contract.d.ts +48 -0
  296. package/dist-types/packages/peach-engine/src/render-worker/live-frame-mirror.d.ts +34 -0
  297. package/dist-types/packages/peach-engine/src/render-worker/map-command-channel.d.ts +189 -0
  298. package/dist-types/packages/peach-engine/src/render-worker/mapNativeContract.d.ts +101 -0
  299. package/dist-types/packages/peach-engine/src/render-worker/native-dynamic-synchronizable.d.ts +22 -0
  300. package/dist-types/packages/peach-engine/src/render-worker/native-menu-gesture.d.ts +9 -0
  301. package/dist-types/packages/peach-engine/src/render-worker/native-ui-commandContract.d.ts +23 -0
  302. package/dist-types/packages/peach-engine/src/render-worker/native-ui-protocol.d.ts +1087 -0
  303. package/dist-types/packages/peach-engine/src/render-worker/native-widgetContract.d.ts +100 -0
  304. package/dist-types/packages/peach-engine/src/render-worker/nativeAnimMirrorContract.d.ts +174 -0
  305. package/dist-types/packages/peach-engine/src/render-worker/nativeSyncReplyContract.d.ts +11 -0
  306. package/dist-types/packages/peach-engine/src/render-worker/one-native-contentContract.d.ts +54 -0
  307. package/dist-types/packages/peach-engine/src/render-worker/pointerSampleContract.d.ts +14 -0
  308. package/dist-types/packages/peach-engine/src/render-worker/protocol.d.ts +880 -0
  309. package/dist-types/packages/peach-engine/src/render-worker/reanimated-css-contract.d.ts +63 -0
  310. package/dist-types/packages/peach-engine/src/render-worker/reanimated-readiness.d.ts +29 -0
  311. package/dist-types/packages/peach-engine/src/render-worker/resilient-frame-clock.d.ts +22 -0
  312. package/dist-types/packages/peach-engine/src/render-worker/retained-app-load.d.ts +20 -0
  313. package/dist-types/packages/peach-engine/src/render-worker/screen-edge-swipe-commit-protocol.d.ts +1 -0
  314. package/dist-types/packages/peach-engine/src/render-worker/screen-form-sheet-commit-protocol.d.ts +26 -0
  315. package/dist-types/packages/peach-engine/src/render-worker/scroll-mirror-tenant.d.ts +37 -0
  316. package/dist-types/packages/peach-engine/src/render-worker/scroll-mirror.d.ts +164 -0
  317. package/dist-types/packages/peach-engine/src/render-worker/shell-event-registry.d.ts +119 -0
  318. package/dist-types/packages/peach-engine/src/render-worker/shell-gesture-regions.d.ts +41 -0
  319. package/dist-types/packages/peach-engine/src/render-worker/shell-protocol.d.ts +603 -0
  320. package/dist-types/packages/peach-engine/src/render-worker/shell-scene-schema.d.ts +101 -0
  321. package/dist-types/packages/peach-engine/src/render-worker/shell-tree-inline-sources.d.ts +13 -0
  322. package/dist-types/packages/peach-engine/src/render-worker/shell-tree-wire.d.ts +87 -0
  323. package/dist-types/packages/peach-engine/src/render-worker/test-bridge-protocol.d.ts +47 -0
  324. package/dist-types/packages/peach-engine/src/render-worker/text-inputContract.d.ts +93 -0
  325. package/dist-types/packages/peach-engine/src/render-worker/tree-sync-port.d.ts +102 -0
  326. package/dist-types/packages/peach-engine/src/render-worker/webgpu-frame-transaction.d.ts +292 -0
  327. package/dist-types/packages/peach-engine/src/render-worker/webgpu-readback-scheduler.d.ts +107 -0
  328. package/dist-types/packages/peach-engine/src/render-worker/webview-capture-protocol.d.ts +16 -0
  329. package/dist-types/packages/peach-engine/src/render-worker/worker-input-runtime.d.ts +211 -0
  330. package/dist-types/packages/peach-engine/src/render-worker/worker-storage.d.ts +33 -0
  331. package/dist-types/packages/peach-engine/src/render-worker/worklet-runtime.d.ts +987 -0
  332. package/dist-types/packages/peach-engine/src/render-worker/worklet-sab.d.ts +24 -0
  333. package/dist-types/packages/peach-engine/src/rolldown-bundle-inventory.d.ts +84 -0
  334. package/dist-types/packages/peach-engine/src/rolldown-production-fingerprint.d.ts +31 -0
  335. package/dist-types/packages/peach-engine/src/screenshots/timeline-assets.d.ts +10 -0
  336. package/dist-types/packages/peach-engine/src/screenshots/tokens.d.ts +9 -0
  337. package/dist-types/packages/peach-engine/src/settings/devices.d.ts +70 -0
  338. package/dist-types/packages/peach-engine/src/settings/duo-fold-bus.d.ts +87 -0
  339. package/dist-types/packages/peach-engine/src/settings/interface-rotation.d.ts +30 -0
  340. package/dist-types/packages/peach-engine/src/settings/react-native-configuration.d.ts +12 -0
  341. package/dist-types/packages/peach-engine/src/settings/scene-geometryContract.d.ts +40 -0
  342. package/dist-types/packages/peach-engine/src/settings/store.d.ts +37 -0
  343. package/dist-types/packages/peach-engine/src/shell-events.d.ts +203 -0
  344. package/dist-types/packages/peach-engine/src/shell-intent.d.ts +68 -0
  345. package/dist-types/packages/peach-engine/src/sootsim-event.d.ts +35 -0
  346. package/dist-types/packages/peach-engine/src/top-overlay-state.d.ts +5 -0
  347. package/dist-types/packages/peach-engine/src/web-authentication-automation-host.d.ts +2 -0
  348. package/dist-types/packages/peach-engine/src/webAuthenticationContract.d.ts +34 -0
  349. package/dist-types/packages/peach-engine/src/webview-automation-host.d.ts +180 -0
  350. package/dist-types/packages/peach-engine/src/wireframe-mode.d.ts +16 -0
  351. package/dist-types/packages/peach-globals/src/frameBreakdownContract.d.ts +16 -0
  352. package/dist-types/packages/peach-globals/src/index.d.ts +3311 -0
  353. package/dist-types/packages/peach-globals/src/nativeSurfaceContract.d.ts +76 -0
  354. package/dist-types/packages/peach-globals/src/pointerSourceEventContract.d.ts +8 -0
  355. package/dist-types/packages/peach-globals/src/profileTrace.d.ts +11 -0
  356. package/dist-types/packages/peach-globals/src/profilerContract.d.ts +223 -0
  357. package/dist-types/packages/peach-kit/src/capabilities.d.ts +721 -0
  358. package/dist-types/packages/peach-kit/src/internal.d.ts +4 -0
  359. package/dist-types/packages/peach-kit/src/materials/types.d.ts +27 -0
  360. package/dist-types/packages/peach-kit/src/materials/uikit-blur-material.d.ts +14 -0
  361. package/dist-types/packages/peach-kit/src/navigation-types.d.ts +11 -0
  362. package/dist-types/packages/peach-kit/src/react-bridge.d.ts +53 -0
  363. package/dist-types/packages/peach-kit/src/runtime.d.ts +26 -0
  364. package/dist-types/packages/peach-kit/src/ui/hosting-safe-area.d.ts +24 -0
  365. package/dist-types/packages/peach-kit/src/ui/popover-placement.d.ts +53 -0
  366. package/dist-types/packages/peach-kit/src/ui/presentationContract.d.ts +17 -0
  367. package/kotlin/ComposeSources/PeachComposeHost.kt +1 -1
  368. package/kotlin/JniSources/com/facebook/jni/HybridData.kt +0 -2
  369. package/kotlin/JniSources/dev/peach/jni/NativeBindings.kt +0 -2
  370. package/kotlin/JniTransportSources/dev/peach/jni/integration/JniTransport.kt +0 -2
  371. package/kotlin/README.md +6 -0
  372. package/package.json +22 -2
  373. package/runtime-companion.json +1 -0
  374. package/skills/contrast/SKILL.md +1 -0
  375. package/src/assetCatalogContract.ts +21 -0
  376. package/src/bridge-contract-input.ts +84 -0
  377. package/src/bridge-contract.ts +35 -3
  378. package/src/browser-launch-policy.ts +1 -0
  379. package/src/bundle-channel.mjs +4 -2
  380. package/src/cli-runtime.ts +55 -0
  381. package/src/crash-fingerprint.ts +26 -0
  382. package/src/dev-bundle-resolution.ts +50 -23
  383. package/src/device-catalog.ts +1159 -0
  384. package/src/host/bridge-host.ts +3 -26
  385. package/src/host/browser-pointer.ts +71 -0
  386. package/src/host/dev-server-package-versions.ts +23 -0
  387. package/src/host/fetch-proxy-handler.ts +17 -4
  388. package/src/installed-package-versions.ts +142 -38
  389. package/src/kotlin-host.ts +1 -1
  390. package/src/metro-plugin.ts +4 -4
  391. package/src/metro-project-root.ts +68 -0
  392. package/src/nitro-adapter.lock.json +26 -0
  393. package/src/nitro-adapter.ts +103 -0
  394. package/src/nitro-bundle.ts +24 -10
  395. package/src/nitro-compile.ts +33 -51
  396. package/src/nitro-source.ts +177 -96
  397. package/src/nitroAdapterContract.ts +217 -0
  398. package/src/nitroContract.ts +24 -11
  399. package/src/process-group.ts +41 -34
  400. package/src/react-bridge-importers.ts +28 -0
  401. package/src/reactNativeConfigurationContract.ts +36 -0
  402. package/src/runtime-assets.ts +7 -2
  403. package/src/runtime-delivery.ts +2 -0
  404. package/src/runtimePlatformContract.ts +70 -0
  405. package/src/screenshots/frame-compose.ts +42 -43
  406. package/src/screenshots/org-deck.ts +9 -4
  407. package/src/screenshots/preset-names.ts +29 -0
  408. package/src/screenshots/registry.ts +5 -5
  409. package/src/screenshots/schema.ts +1 -1
  410. package/src/screenshots/screenshotContract.ts +971 -0
  411. package/src/settings-flags.ts +107 -0
  412. package/src/settingsContract.ts +609 -0
  413. package/src/storageSnapshotContract.ts +344 -0
  414. package/src/stub-pattern-matcher.ts +550 -0
  415. package/src/swift-compile.ts +908 -40
  416. package/src/swift-compiler-digest.ts +13 -1
  417. package/src/swift-distribution.lock.json +49 -22
  418. package/src/swift-host.ts +167 -52
  419. package/src/swift-objc-compile.ts +54 -24
  420. package/src/swift-objc-export.ts +532 -0
  421. package/src/swift-objc-import.ts +769 -0
  422. package/src/swift-objc-metadata.ts +285 -10
  423. package/src/swift-objc-sdk.ts +13970 -158
  424. package/src/swift-objc-standin.ts +137 -1
  425. package/src/swift-package.ts +94 -0
  426. package/src/swift-packages.ts +5 -5
  427. package/src/swift-submit.ts +6 -0
  428. package/src/swiftContract.ts +99 -0
  429. package/src/target-matcher.ts +6 -1
  430. package/src/vite-plugin.ts +14 -40
  431. package/src/worker-system-chunks.ts +1 -1
  432. package/src/workerChunkContract.ts +5 -0
  433. package/src/worklets-babel.ts +24 -5
  434. package/src/xcode-project.ts +36 -7
  435. package/src/xcode-target-members.ts +10 -3
  436. package/cli/drivers/playwright-sim-host.ts +0 -825
  437. package/kotlin/fixtures/counter/Counter.d.kt.ts +0 -17
  438. package/kotlin/fixtures/counter/Counter.kt +0 -51
  439. package/kotlin/fixtures/counter/CounterApp.native.tsx +0 -61
  440. package/kotlin/fixtures/counter/CounterApp.tsx +0 -3
  441. package/kotlin/fixtures/counter/CounterScreen.d.kt.ts +0 -8
  442. package/kotlin/fixtures/counter/CounterScreen.kt +0 -56
  443. package/kotlin/fixtures/counter/app/_layout.tsx +0 -4
  444. package/kotlin/fixtures/counter/app/index+spa.tsx +0 -1
  445. package/kotlin/fixtures/counter/app/routes.d.ts +0 -18
  446. package/kotlin/fixtures/counter/package.json +0 -20
  447. package/kotlin/fixtures/counter/tsconfig.json +0 -19
  448. package/kotlin/fixtures/counter/vite.config.ts +0 -20
  449. package/kotlin/fixtures/headless-counter/Headless.kt +0 -234
  450. package/kotlin/fixtures/import-animation/Animation.d.kt.ts +0 -7
  451. package/kotlin/fixtures/import-animation/Animation.kt +0 -80
  452. package/kotlin/fixtures/import-animation/ImportAnimation.native.tsx +0 -13
  453. package/kotlin/fixtures/import-animation/README.md +0 -24
  454. package/kotlin/fixtures/import-animation/app/_layout.tsx +0 -4
  455. package/kotlin/fixtures/import-animation/app/index+spa.tsx +0 -1
  456. package/kotlin/fixtures/import-animation/app/routes.d.ts +0 -18
  457. package/kotlin/fixtures/import-animation/package.json +0 -23
  458. package/kotlin/fixtures/import-animation/tsconfig.json +0 -20
  459. package/kotlin/fixtures/import-animation/vite.config.ts +0 -20
  460. package/kotlin/fixtures/import-drawing/Drawing.d.kt.ts +0 -7
  461. package/kotlin/fixtures/import-drawing/Drawing.kt +0 -101
  462. package/kotlin/fixtures/import-drawing/ImportDrawing.native.tsx +0 -18
  463. package/kotlin/fixtures/import-drawing/README.md +0 -34
  464. package/kotlin/fixtures/import-drawing/app/_layout.tsx +0 -4
  465. package/kotlin/fixtures/import-drawing/app/index+spa.tsx +0 -1
  466. package/kotlin/fixtures/import-drawing/package.json +0 -23
  467. package/kotlin/fixtures/import-drawing/tsconfig.json +0 -20
  468. package/kotlin/fixtures/import-drawing/vite.config.ts +0 -20
  469. package/kotlin/fixtures/import-editor/Editor.d.kt.ts +0 -7
  470. package/kotlin/fixtures/import-editor/Editor.kt +0 -59
  471. package/kotlin/fixtures/import-editor/ImportEditor.native.tsx +0 -23
  472. package/kotlin/fixtures/import-editor/README.md +0 -27
  473. package/kotlin/fixtures/import-editor/app/_layout.tsx +0 -4
  474. package/kotlin/fixtures/import-editor/app/index+spa.tsx +0 -1
  475. package/kotlin/fixtures/import-editor/package.json +0 -23
  476. package/kotlin/fixtures/import-editor/tsconfig.json +0 -20
  477. package/kotlin/fixtures/import-editor/vite.config.ts +0 -20
  478. package/kotlin/fixtures/import-effects/Effects.d.kt.ts +0 -7
  479. package/kotlin/fixtures/import-effects/Effects.kt +0 -87
  480. package/kotlin/fixtures/import-effects/ImportEffects.native.tsx +0 -13
  481. package/kotlin/fixtures/import-effects/README.md +0 -19
  482. package/kotlin/fixtures/import-effects/app/_layout.tsx +0 -4
  483. package/kotlin/fixtures/import-effects/app/index+spa.tsx +0 -1
  484. package/kotlin/fixtures/import-effects/package.json +0 -23
  485. package/kotlin/fixtures/import-effects/tsconfig.json +0 -20
  486. package/kotlin/fixtures/import-effects/vite.config.ts +0 -20
  487. package/kotlin/fixtures/import-layout/ImportLayout.native.tsx +0 -13
  488. package/kotlin/fixtures/import-layout/Layout.d.kt.ts +0 -7
  489. package/kotlin/fixtures/import-layout/Layout.kt +0 -72
  490. package/kotlin/fixtures/import-layout/README.md +0 -24
  491. package/kotlin/fixtures/import-layout/app/_layout.tsx +0 -4
  492. package/kotlin/fixtures/import-layout/app/index+spa.tsx +0 -1
  493. package/kotlin/fixtures/import-layout/package.json +0 -23
  494. package/kotlin/fixtures/import-layout/tsconfig.json +0 -20
  495. package/kotlin/fixtures/import-layout/vite.config.ts +0 -20
  496. package/kotlin/fixtures/import-navigation/ImportNavigation.native.tsx +0 -18
  497. package/kotlin/fixtures/import-navigation/Navigation.d.kt.ts +0 -7
  498. package/kotlin/fixtures/import-navigation/Navigation.kt +0 -104
  499. package/kotlin/fixtures/import-navigation/README.md +0 -31
  500. package/kotlin/fixtures/import-navigation/app/_layout.tsx +0 -4
  501. package/kotlin/fixtures/import-navigation/app/index+spa.tsx +0 -1
  502. package/kotlin/fixtures/import-navigation/package.json +0 -23
  503. package/kotlin/fixtures/import-navigation/tsconfig.json +0 -20
  504. package/kotlin/fixtures/import-navigation/vite.config.ts +0 -20
  505. package/kotlin/fixtures/import-overlays/ImportOverlays.native.tsx +0 -29
  506. package/kotlin/fixtures/import-overlays/Overlays.d.kt.ts +0 -7
  507. package/kotlin/fixtures/import-overlays/Overlays.kt +0 -93
  508. package/kotlin/fixtures/import-overlays/README.md +0 -34
  509. package/kotlin/fixtures/import-overlays/app/_layout.tsx +0 -4
  510. package/kotlin/fixtures/import-overlays/app/index+spa.tsx +0 -1
  511. package/kotlin/fixtures/import-overlays/package.json +0 -23
  512. package/kotlin/fixtures/import-overlays/tsconfig.json +0 -20
  513. package/kotlin/fixtures/import-overlays/vite.config.ts +0 -20
  514. package/kotlin/fixtures/import-resources/ImportResources.native.tsx +0 -18
  515. package/kotlin/fixtures/import-resources/README.md +0 -26
  516. package/kotlin/fixtures/import-resources/Resources.d.kt.ts +0 -6
  517. package/kotlin/fixtures/import-resources/Resources.kt +0 -72
  518. package/kotlin/fixtures/import-resources/app/_layout.tsx +0 -4
  519. package/kotlin/fixtures/import-resources/app/index+spa.tsx +0 -1
  520. package/kotlin/fixtures/import-resources/package.json +0 -23
  521. package/kotlin/fixtures/import-resources/tsconfig.json +0 -20
  522. package/kotlin/fixtures/import-resources/vite.config.ts +0 -20
  523. package/kotlin/fixtures/import-scroll/ImportNested.native.tsx +0 -10
  524. package/kotlin/fixtures/import-scroll/ImportScroll.native.tsx +0 -13
  525. package/kotlin/fixtures/import-scroll/Nested.d.kt.ts +0 -4
  526. package/kotlin/fixtures/import-scroll/Nested.kt +0 -64
  527. package/kotlin/fixtures/import-scroll/README.md +0 -38
  528. package/kotlin/fixtures/import-scroll/Scroll.d.kt.ts +0 -7
  529. package/kotlin/fixtures/import-scroll/Scroll.kt +0 -91
  530. package/kotlin/fixtures/import-scroll/app/_layout.tsx +0 -4
  531. package/kotlin/fixtures/import-scroll/app/index+spa.tsx +0 -1
  532. package/kotlin/fixtures/import-scroll/app/nested+spa.tsx +0 -1
  533. package/kotlin/fixtures/import-scroll/package.json +0 -23
  534. package/kotlin/fixtures/import-scroll/tsconfig.json +0 -20
  535. package/kotlin/fixtures/import-scroll/vite.config.ts +0 -20
  536. package/kotlin/fixtures/import-selection/ImportSelection.native.tsx +0 -44
  537. package/kotlin/fixtures/import-selection/README.md +0 -32
  538. package/kotlin/fixtures/import-selection/Selection.d.kt.ts +0 -8
  539. package/kotlin/fixtures/import-selection/Selection.kt +0 -78
  540. package/kotlin/fixtures/import-selection/app/_layout.tsx +0 -4
  541. package/kotlin/fixtures/import-selection/app/index+spa.tsx +0 -1
  542. package/kotlin/fixtures/import-selection/package.json +0 -23
  543. package/kotlin/fixtures/import-selection/tsconfig.json +0 -20
  544. package/kotlin/fixtures/import-selection/vite.config.ts +0 -20
  545. package/kotlin/fixtures/import-surfaces/ImportSurfaces.native.tsx +0 -13
  546. package/kotlin/fixtures/import-surfaces/README.md +0 -22
  547. package/kotlin/fixtures/import-surfaces/Surfaces.d.kt.ts +0 -7
  548. package/kotlin/fixtures/import-surfaces/Surfaces.kt +0 -64
  549. package/kotlin/fixtures/import-surfaces/app/_layout.tsx +0 -4
  550. package/kotlin/fixtures/import-surfaces/app/index+spa.tsx +0 -1
  551. package/kotlin/fixtures/import-surfaces/package.json +0 -23
  552. package/kotlin/fixtures/import-surfaces/tsconfig.json +0 -20
  553. package/kotlin/fixtures/import-surfaces/vite.config.ts +0 -20
  554. package/kotlin/fixtures/import-values/ImportValues.native.tsx +0 -61
  555. package/kotlin/fixtures/import-values/README.md +0 -28
  556. package/kotlin/fixtures/import-values/Values.d.kt.ts +0 -15
  557. package/kotlin/fixtures/import-values/Values.kt +0 -84
  558. package/kotlin/fixtures/import-values/app/_layout.tsx +0 -4
  559. package/kotlin/fixtures/import-values/app/index+spa.tsx +0 -1
  560. package/kotlin/fixtures/import-values/package.json +0 -23
  561. package/kotlin/fixtures/import-values/tsconfig.json +0 -20
  562. package/kotlin/fixtures/import-values/vite.config.ts +0 -20
  563. package/kotlin/fixtures/kotlin-app/app/build.gradle.kts +0 -30
  564. package/kotlin/fixtures/kotlin-app/app/src/main/AndroidManifest.xml +0 -13
  565. package/kotlin/fixtures/kotlin-app/app/src/main/java/dev/contrast/kotlinapp/MainActivity.kt +0 -60
  566. package/kotlin/fixtures/kotlin-app/app/src/main/java/dev/contrast/kotlinapp/ProbeApplication.kt +0 -18
  567. package/kotlin/fixtures/kotlin-app/build.gradle.kts +0 -5
  568. package/kotlin/fixtures/kotlin-app/gradle.properties +0 -4
  569. package/kotlin/fixtures/kotlin-app/settings.gradle.kts +0 -4
  570. package/kotlin/fixtures/kotlin-app-variants/Anim.kt +0 -62
  571. package/kotlin/fixtures/kotlin-app-variants/BarBehavior.kt +0 -38
  572. package/kotlin/fixtures/kotlin-app-variants/BarVisibility.kt +0 -36
  573. package/kotlin/fixtures/kotlin-app-variants/Bitmaps.kt +0 -50
  574. package/kotlin/fixtures/kotlin-app-variants/Browse.kt +0 -73
  575. package/kotlin/fixtures/kotlin-app-variants/Colors.kt +0 -41
  576. package/kotlin/fixtures/kotlin-app-variants/Controls.kt +0 -62
  577. package/kotlin/fixtures/kotlin-app-variants/Drag.kt +0 -56
  578. package/kotlin/fixtures/kotlin-app-variants/Draw.kt +0 -74
  579. package/kotlin/fixtures/kotlin-app-variants/Drawables.kt +0 -53
  580. package/kotlin/fixtures/kotlin-app-variants/Focus.kt +0 -62
  581. package/kotlin/fixtures/kotlin-app-variants/Form.kt +0 -47
  582. package/kotlin/fixtures/kotlin-app-variants/Icons.kt +0 -59
  583. package/kotlin/fixtures/kotlin-app-variants/Ime.kt +0 -53
  584. package/kotlin/fixtures/kotlin-app-variants/Lists.kt +0 -57
  585. package/kotlin/fixtures/kotlin-app-variants/Nav.kt +0 -47
  586. package/kotlin/fixtures/kotlin-app-variants/Note.kt +0 -40
  587. package/kotlin/fixtures/kotlin-app-variants/Overlays.kt +0 -56
  588. package/kotlin/fixtures/kotlin-app-variants/Pan.kt +0 -38
  589. package/kotlin/fixtures/kotlin-app-variants/Pickers.kt +0 -44
  590. package/kotlin/fixtures/kotlin-app-variants/Press.kt +0 -43
  591. package/kotlin/fixtures/kotlin-app-variants/Scroll.kt +0 -63
  592. package/kotlin/fixtures/kotlin-app-variants/Sheet.kt +0 -43
  593. package/kotlin/fixtures/kotlin-app-variants/Strings.kt +0 -49
  594. package/kotlin/fixtures/kotlin-app-variants/Tabs.kt +0 -47
  595. package/kotlin/fixtures/kotlin-app-variants/TextWidth.kt +0 -45
  596. package/kotlin/fixtures/kotlin-app-variants/TransientInsets.kt +0 -50
  597. package/kotlin/fixtures/kotlin-app-variants/Transition.kt +0 -69
  598. package/kotlin/fixtures/kotlin-app-variants/ViewConfig.kt +0 -22
  599. package/kotlin/fixtures/kotlin-app-variants/Widgets.kt +0 -67
  600. package/kotlin/fixtures/runtime-state/RuntimeState.kt +0 -200
  601. package/kotlin/fork/README.md +0 -97
  602. package/kotlin/fork/build.sh +0 -176
  603. package/kotlin/fork/compose-worker-globals.patch +0 -1247
  604. package/kotlin/fork/fork.json +0 -46
  605. package/kotlin/fork/publish.ts +0 -99
  606. package/kotlin/fork/skia-android-shaping.patch +0 -189
  607. package/kotlin/fork/skiko-local.init.gradle +0 -10
  608. package/kotlin/fork/skiko-worker-clock.patch +0 -122
@@ -0,0 +1,217 @@
1
+ // the prebuilt Nitro adapter archive's shapes and identity rules, shared by its
2
+ // builder (packages/sootsim-swift/scripts/build-nitro-adapter-archive.ts), its
3
+ // publisher (scripts/ops/nitro-adapter-publish.ts) and the installed CLI that
4
+ // downloads and verifies it. nothing here reads adapter sources: an installed
5
+ // CLI carries this file and checks an archive against the lock it was built with.
6
+ import { createHash } from 'node:crypto'
7
+ import { readdirSync, readFileSync } from 'node:fs'
8
+ import path from 'node:path'
9
+ import { isRecord } from './is-record'
10
+
11
+ /** the file at the root of an unpacked adapter, and its install marker. */
12
+ export const NITRO_ADAPTER_MANIFEST = 'manifest.json'
13
+ export const NITRO_ADAPTER_ARCHIVE = 'libPeachNitroAdapter.a'
14
+
15
+ // header staging the collector exposes: JSI without the dynamic and test
16
+ // pieces, and Nitro's cpp tree without views, copied to bare and nested names.
17
+ export const HEADER_STAGE = {
18
+ jsi: {
19
+ from: 'ReactCommon/jsi/jsi',
20
+ skip: ['test'],
21
+ keep: '\\.h$',
22
+ exclude: 'JSIDynamic.h',
23
+ to: 'jsi',
24
+ },
25
+ nitro: {
26
+ from: 'cpp',
27
+ skip: ['views'],
28
+ keep: '\\.(?:h|hpp|hxx|inl)$',
29
+ to: ['core', 'core/NitroModules'],
30
+ },
31
+ }
32
+
33
+ export interface NitroAdapterRoots {
34
+ nitroModules: string
35
+ reactNative: string
36
+ }
37
+
38
+ /** what the installed CLI needs to trust an archive; no private provenance. */
39
+ export interface NitroAdapterManifest {
40
+ schema: 1
41
+ /** the guest platform the producer built for; every consumer matches it against the lock or its own recomputed identity. */
42
+ platform: string
43
+ target: string
44
+ recipe: string
45
+ adapter: { sha256: string }
46
+ headers: { reactNativeJsi: string; nitroModules: string }
47
+ compiler: string
48
+ sdk: { id: string; checksum: string }
49
+ framework: { distribution: string; wireAbi: string }
50
+ archive: { path: string; size: number; sha256: string }
51
+ }
52
+
53
+ /** the published tarball one CLI build installs, committed beside swift-distribution.lock.json. */
54
+ export interface NitroAdapterLock extends Omit<NitroAdapterManifest, 'archive'> {
55
+ /** the downloaded .tar.gz, which installVerifiedTarball checks. */
56
+ archive: { sha256: string; size: number }
57
+ }
58
+
59
+ export const sha256Hex = (data: Uint8Array | string) =>
60
+ createHash('sha256').update(data).digest('hex')
61
+
62
+ export function digest(entries: Record<string, string>) {
63
+ const hash = createHash('sha256')
64
+ for (const key of Object.keys(entries).sort()) hash.update(`${key}\0${entries[key]}\n`)
65
+ return hash.digest('hex')
66
+ }
67
+
68
+ function headerFiles(base: string, directory: string, skip: string[], keep: RegExp) {
69
+ const files: string[] = []
70
+ const walk = (relative: string) => {
71
+ for (const entry of readdirSync(path.join(base, relative), { withFileTypes: true })) {
72
+ if (entry.name.startsWith('.') || skip.includes(entry.name)) continue
73
+ const next = path.posix.join(relative, entry.name)
74
+ if (entry.isDirectory()) walk(next)
75
+ else if (keep.test(entry.name)) files.push(next)
76
+ }
77
+ }
78
+ walk(directory)
79
+ return files.sort()
80
+ }
81
+
82
+ /** the original header closures the collector exposes, with per-file hashes. */
83
+ export function headerClosure(roots: NitroAdapterRoots) {
84
+ const { jsi: j, nitro: n } = HEADER_STAGE
85
+ const jsiFiles = headerFiles(
86
+ roots.reactNative,
87
+ j.from,
88
+ j.skip,
89
+ new RegExp(j.keep),
90
+ ).filter((file) => !file.endsWith(`/${j.exclude}`))
91
+ const nitroFiles = headerFiles(roots.nitroModules, n.from, n.skip, new RegExp(n.keep))
92
+ const hashes = (base: string, files: string[]) =>
93
+ Object.fromEntries(
94
+ files.map((file) => [file, sha256Hex(readFileSync(path.join(base, file)))]),
95
+ )
96
+ return {
97
+ jsi: hashes(roots.reactNative, jsiFiles),
98
+ nitro: hashes(roots.nitroModules, nitroFiles),
99
+ nitroFiles,
100
+ jsiFiles,
101
+ }
102
+ }
103
+
104
+ /** the digests an app's original React Native and Nitro headers must match. */
105
+ export function headerDigests(roots: NitroAdapterRoots) {
106
+ const closure = headerClosure(roots)
107
+ return { reactNativeJsi: digest(closure.jsi), nitroModules: digest(closure.nitro) }
108
+ }
109
+
110
+ const hex64 = (value: unknown): value is string =>
111
+ typeof value === 'string' && /^[a-f0-9]{64}$/.test(value)
112
+
113
+ function text(value: unknown, what: string): string {
114
+ if (typeof value !== 'string' || !value)
115
+ throw new Error(`invalid Nitro adapter ${what}`)
116
+ return value
117
+ }
118
+
119
+ function digestField(value: unknown, what: string): string {
120
+ if (!hex64(value)) throw new Error(`invalid Nitro adapter ${what}`)
121
+ return value
122
+ }
123
+
124
+ function identity(value: unknown) {
125
+ if (!isRecord(value) || value.schema !== 1)
126
+ throw new Error('invalid Nitro adapter manifest')
127
+ const { adapter, headers, sdk, framework } = value
128
+ if (!isRecord(adapter) || !isRecord(headers) || !isRecord(sdk) || !isRecord(framework))
129
+ throw new Error('invalid Nitro adapter manifest')
130
+ return {
131
+ schema: 1 as const,
132
+ platform: text(value.platform, 'platform'),
133
+ target: text(value.target, 'target'),
134
+ recipe: digestField(value.recipe, 'recipe'),
135
+ adapter: { sha256: digestField(adapter.sha256, 'adapter digest') },
136
+ headers: {
137
+ reactNativeJsi: digestField(headers.reactNativeJsi, 'JSI header digest'),
138
+ nitroModules: digestField(headers.nitroModules, 'Nitro header digest'),
139
+ },
140
+ compiler: text(value.compiler, 'compiler'),
141
+ sdk: {
142
+ id: text(sdk.id, 'sdk id'),
143
+ checksum: digestField(sdk.checksum, 'sdk checksum'),
144
+ },
145
+ framework: {
146
+ distribution: text(framework.distribution, 'distribution'),
147
+ wireAbi: digestField(framework.wireAbi, 'wire abi'),
148
+ },
149
+ }
150
+ }
151
+
152
+ /** keeps only the public fields, so a producer's private provenance never
153
+ * reaches a packed manifest. */
154
+ export function parseNitroAdapterManifest(value: unknown): NitroAdapterManifest {
155
+ const archive = isRecord(value) ? value.archive : undefined
156
+ if (
157
+ !isRecord(archive) ||
158
+ typeof archive.path !== 'string' ||
159
+ archive.path !== NITRO_ADAPTER_ARCHIVE ||
160
+ typeof archive.size !== 'number'
161
+ )
162
+ throw new Error('invalid Nitro adapter archive record')
163
+ return {
164
+ ...identity(value),
165
+ archive: {
166
+ path: archive.path,
167
+ size: archive.size,
168
+ sha256: digestField(archive.sha256, 'archive digest'),
169
+ },
170
+ }
171
+ }
172
+
173
+ export function parseNitroAdapterLock(value: unknown): NitroAdapterLock {
174
+ const archive = isRecord(value) ? value.archive : undefined
175
+ if (!isRecord(archive) || typeof archive.size !== 'number')
176
+ throw new Error('invalid Nitro adapter lock archive')
177
+ return {
178
+ ...identity(value),
179
+ archive: {
180
+ sha256: digestField(archive.sha256, 'lock archive digest'),
181
+ size: archive.size,
182
+ },
183
+ }
184
+ }
185
+
186
+ /** the lock one published manifest and its tarball produce. */
187
+ export function nitroAdapterLock(
188
+ manifest: NitroAdapterManifest,
189
+ tarball: { sha256: string; size: number },
190
+ ): NitroAdapterLock {
191
+ const { archive: _library, ...rest } = manifest
192
+ return { ...rest, archive: tarball }
193
+ }
194
+
195
+ /** the tarball's path under PEACH_SWIFT_ENDPOINT: content addressed, so immutable. */
196
+ export function nitroAdapterArchiveKey(lock: NitroAdapterLock): string {
197
+ return `nitro-adapter/${lock.archive.sha256}.tar.gz`
198
+ }
199
+
200
+ /** throws unless an unpacked adapter is the one the lock pins and its library
201
+ * bytes are the ones its manifest records. needs no adapter source. */
202
+ export function verifyInstalledNitroAdapter(
203
+ directory: string,
204
+ lock: NitroAdapterLock,
205
+ ): NitroAdapterManifest {
206
+ const manifest = parseNitroAdapterManifest(
207
+ JSON.parse(readFileSync(path.join(directory, NITRO_ADAPTER_MANIFEST), 'utf8')),
208
+ )
209
+ const { archive, ...recorded } = manifest
210
+ const { archive: _tarball, ...pinned } = lock
211
+ if (JSON.stringify(recorded) !== JSON.stringify(pinned))
212
+ throw new Error('Nitro adapter manifest does not match the lock this build carries')
213
+ const bytes = readFileSync(path.join(directory, archive.path))
214
+ if (bytes.length !== archive.size || sha256Hex(bytes) !== archive.sha256)
215
+ throw new Error('Nitro adapter library does not match its manifest')
216
+ return manifest
217
+ }
@@ -3,33 +3,46 @@ import {
3
3
  readBundleMetadataFooter,
4
4
  } from './bundleGlobalFooter'
5
5
 
6
+ /** the guest platform every Nitro compile targets. */
7
+ export const NITRO_GUEST_PLATFORM = 'ios'
8
+
6
9
  export interface NitroCompiledModule {
7
- platform: 'ios'
8
- packageName: string
9
- packageVersion: string
10
+ platform: typeof NITRO_GUEST_PLATFORM
11
+ /** the original providers this one executable registers, by package name. */
12
+ packages: { name: string; version: string }[]
10
13
  url: string
11
14
  hash: string
12
15
  icuUrl: string
13
16
  }
14
17
 
18
+ function readNitroPackage(
19
+ value: unknown,
20
+ ): NitroCompiledModule['packages'][number] | null {
21
+ if (typeof value !== 'object' || value === null) return null
22
+ const name = Reflect.get(value, 'name')
23
+ const version = Reflect.get(value, 'version')
24
+ return typeof name === 'string' && name && typeof version === 'string' && version
25
+ ? { name, version }
26
+ : null
27
+ }
28
+
15
29
  export function readNitroMetadata(value: unknown): NitroCompiledModule | null {
16
30
  if (value === null || value === undefined) return null
17
31
  if (
18
32
  typeof value !== 'object' ||
19
33
  Array.isArray(value) ||
20
- Reflect.get(value, 'platform') !== 'ios'
34
+ Reflect.get(value, 'platform') !== NITRO_GUEST_PLATFORM
21
35
  )
22
36
  throw new Error('invalid Nitro compilation metadata')
23
- const packageName = Reflect.get(value, 'packageName')
24
- const packageVersion = Reflect.get(value, 'packageVersion')
37
+ const listed = Reflect.get(value, 'packages')
38
+ const packages = Array.isArray(listed) ? listed.map(readNitroPackage) : []
25
39
  const url = Reflect.get(value, 'url')
26
40
  const hash = Reflect.get(value, 'hash')
27
41
  const icuUrl = Reflect.get(value, 'icuUrl')
28
42
  if (
29
- typeof packageName !== 'string' ||
30
- !packageName ||
31
- typeof packageVersion !== 'string' ||
32
- !packageVersion ||
43
+ packages.length === 0 ||
44
+ !packages.every((entry) => entry !== null) ||
45
+ new Set(packages.map(({ name }) => name)).size !== packages.length ||
33
46
  typeof url !== 'string' ||
34
47
  !url ||
35
48
  typeof hash !== 'string' ||
@@ -38,7 +51,7 @@ export function readNitroMetadata(value: unknown): NitroCompiledModule | null {
38
51
  !icuUrl
39
52
  )
40
53
  throw new Error('invalid Nitro compilation metadata')
41
- return { platform: 'ios', packageName, packageVersion, url, hash, icuUrl }
54
+ return { platform: 'ios', packages, url, hash, icuUrl }
42
55
  }
43
56
 
44
57
  export function readNitroFooter(source: string): NitroCompiledModule | null {
@@ -9,6 +9,7 @@ import {
9
9
  } from 'node:fs'
10
10
  import { tmpdir } from 'node:os'
11
11
  import { join } from 'node:path'
12
+ import { Duplex } from 'node:stream'
12
13
  import { setTimeout as sleep } from 'node:timers/promises'
13
14
 
14
15
  const GRACEFUL_TIMEOUT_MS = 3_000
@@ -90,6 +91,7 @@ async function protectProcessFreeze(rootPid: number) {
90
91
  [
91
92
  '-c',
92
93
  `
94
+ (
93
95
  journal=$1
94
96
  cleanup() {
95
97
  trap '' HUP INT TERM
@@ -106,26 +108,53 @@ async function protectProcessFreeze(rootPid: number) {
106
108
  trap 'cleanup; exit 0' HUP INT TERM
107
109
  trap 'rm -f "$journal"; rmdir "\${journal%/*}"' EXIT
108
110
  printf 'ready\n'
109
- if ! IFS= read -r command || [ "$command" != disarm ]; then cleanup; fi
111
+ if ! IFS= read -r command <&3 || [ "$command" != disarm ]; then cleanup; fi
112
+ ) &
110
113
  `,
111
114
  FREEZE_GUARD_NAME,
112
115
  journal,
113
116
  ],
114
117
  {
115
118
  detached: true,
116
- stdio: ['pipe', 'pipe', 'ignore'],
119
+ // the launcher exits before capture, reparenting the guard outside any
120
+ // nested target tree. fd 3 survives that exit, unlike child.stdin.
121
+ stdio: ['ignore', 'pipe', 'ignore', 'pipe'],
117
122
  },
118
123
  )
124
+ let guardClosed = false
119
125
  const closed = new Promise<void>((resolveClose) =>
120
- guard.once('close', () => resolveClose()),
126
+ guard.once('close', () => {
127
+ guardClosed = true
128
+ resolveClose()
129
+ }),
121
130
  )
122
- guard.stdin.on('error', () => {})
131
+ const control = guard.stdio[3]
132
+ const output = guard.stdout
133
+ if (!(control instanceof Duplex) || !output) {
134
+ guard.kill()
135
+ await closed
136
+ rmSync(directory, { recursive: true, force: true })
137
+ throw new Error('process freeze guard control pipe is unavailable')
138
+ }
139
+ control.on('error', () => {})
123
140
  try {
124
141
  await new Promise<void>((resolveReady, reject) => {
125
- let output = ''
126
- guard.stdout.on('data', (bytes: Buffer) => {
127
- output += bytes.toString()
128
- if (output.includes('ready\n')) resolveReady()
142
+ let readyOutput = ''
143
+ let launcherExited = false
144
+ const ready = () => {
145
+ if (launcherExited && readyOutput.includes('ready\n')) resolveReady()
146
+ }
147
+ output.on('data', (bytes: Buffer) => {
148
+ readyOutput += bytes.toString()
149
+ ready()
150
+ })
151
+ guard.once('exit', (code, signal) => {
152
+ if (code !== 0 || signal !== null) {
153
+ reject(new Error('process freeze guard launcher failed'))
154
+ return
155
+ }
156
+ launcherExited = true
157
+ ready()
129
158
  })
130
159
  guard.once('error', reject)
131
160
  guard.once('close', () =>
@@ -133,47 +162,25 @@ async function protectProcessFreeze(rootPid: number) {
133
162
  )
134
163
  })
135
164
  } catch (error) {
136
- guard.stdin.destroy()
165
+ control.destroy()
137
166
  await closed
138
167
  rmSync(directory, { recursive: true, force: true })
139
168
  throw error
140
169
  }
141
170
  return {
142
171
  record(pid: number) {
143
- if (guard.exitCode !== null || guard.signalCode !== null)
172
+ if (guardClosed || control.destroyed)
144
173
  throw new Error('process freeze guard exited during capture')
145
174
  appendFileSync(journal, `pid ${pid}\n`)
146
175
  },
147
176
  async release(disarm: boolean) {
148
- guard.stdin.end(disarm ? 'disarm\n' : undefined)
177
+ control.end(disarm ? 'disarm\n' : undefined)
149
178
  await closed
150
179
  rmSync(directory, { recursive: true, force: true })
151
180
  },
152
181
  }
153
182
  }
154
183
 
155
- // a nested capture's guard is a descendant of this tree but must keep running
156
- // to resume its own targets, so a freeze never reaches it. ps exits 1 when
157
- // some pids already vanished, so only a spawn failure or timeout is an error.
158
- function withoutFreezeGuards(pids: number[]): number[] {
159
- if (pids.length === 0) return pids
160
- const result = spawnSync('ps', ['-o', 'pid=,command=', '-p', pids.join(',')], {
161
- encoding: 'utf8',
162
- stdio: ['ignore', 'pipe', 'pipe'],
163
- timeout: FORCED_EXIT_TIMEOUT_MS,
164
- killSignal: 'SIGKILL',
165
- })
166
- if (result.error || (result.status !== 0 && result.status !== 1))
167
- throw new Error(result.error?.message || `ps exited ${result.status}`)
168
- const guards = new Set(
169
- result.stdout
170
- .split('\n')
171
- .filter((line) => line.includes(FREEZE_GUARD_NAME))
172
- .map((line) => Number(line.trim().split(/\s+/)[0])),
173
- )
174
- return pids.filter((pid) => !guards.has(pid))
175
- }
176
-
177
184
  // reparented members remain in the group; detached descendants need their
178
185
  // recorded pids. both can leave zombies, which signal zero cannot distinguish
179
186
  // from running processes. inspect their states together before confirming exit.
@@ -266,7 +273,7 @@ export async function terminateProcessGroup(
266
273
  }
267
274
  let children: number[]
268
275
  try {
269
- children = withoutFreezeGuards(listProcessChildren(parents, remaining))
276
+ children = listProcessChildren(parents, remaining)
270
277
  } catch (error) {
271
278
  inspectionError = new Error(`could not inspect descendants: ${String(error)}`)
272
279
  break
@@ -0,0 +1,28 @@
1
+ // which importers of `react` are routed through the peach-kit react bridge.
2
+ // shared by the vite plugins and the esbuild browser artifacts.
3
+
4
+ // the engine, compat, kit and reconciler sources the renderer shares a React with
5
+ export function isEngineReactImporter(importer: string): boolean {
6
+ return (
7
+ importer.includes('/peachsim/src/') ||
8
+ importer.includes('/peach-engine/src/') ||
9
+ importer.includes('/peach-compat/src/') ||
10
+ importer.includes('/peach-compat/dist-pressability/') ||
11
+ importer.includes('/peach-kit/src/') ||
12
+ importer.includes('react-reconciler')
13
+ )
14
+ }
15
+
16
+ // the bridge's own import of react would loop, and the stub registry needs the
17
+ // real React (with __CLIENT_INTERNALS) for bundle stubs. these match the files,
18
+ // not any path containing the name, so a checkout directory cannot trip them.
19
+ export function keepsRealReact(importer: string): boolean {
20
+ return /\/(react-bridge|stub-registry)\.[cm]?[jt]sx?$/.test(importer)
21
+ }
22
+
23
+ // workers are built, so any pure-JS RN-ecosystem package in node_modules is
24
+ // bridged too. the bridge and the stub registry keep the real React.
25
+ export function isWorkerReactBridgeImporter(importer: string): boolean {
26
+ if (keepsRealReact(importer)) return false
27
+ return isEngineReactImporter(importer) || importer.includes('/node_modules/')
28
+ }
@@ -0,0 +1,36 @@
1
+ import type { SettingsValues } from './settingsContract.ts'
2
+
3
+ // render workers mirror only these host-owned values. importing the settings
4
+ // store here would also boot device selection, persistence and the ui schema.
5
+ export const DEFAULT_REACT_NATIVE_CONFIGURATION = {
6
+ // the appearance setting itself (automatic, light or dark); the resolved
7
+ // scheme reaches workers through Appearance
8
+ colorScheme: 'auto',
9
+ language: 'en',
10
+ region: 'US',
11
+ fontSize: 1,
12
+ boldText: false,
13
+ reduceMotion: false,
14
+ largerAccessibilitySizes: false,
15
+ glassTintAmount: 0.5,
16
+ reduceTransparency: false,
17
+ increaseContrast: false,
18
+ showBorders: false,
19
+ onOffLabels: false,
20
+ differentiateWithoutColor: false,
21
+ smartInvert: false,
22
+ preferCrossFadeTransitions: false,
23
+ } satisfies Partial<SettingsValues>
24
+
25
+ export type ReactNativeConfigurationKey = keyof typeof DEFAULT_REACT_NATIVE_CONFIGURATION
26
+
27
+ export type ReactNativeConfigurationSnapshot = Pick<
28
+ SettingsValues,
29
+ ReactNativeConfigurationKey
30
+ >
31
+
32
+ export const REACT_NATIVE_CONFIGURATION_KEYS = Object.keys(
33
+ DEFAULT_REACT_NATIVE_CONFIGURATION,
34
+ ).filter(
35
+ (key): key is ReactNativeConfigurationKey => key in DEFAULT_REACT_NATIVE_CONFIGURATION,
36
+ )
@@ -54,7 +54,7 @@ export function findMonorepoRoot(): string | null {
54
54
  /** the fresh dev-stack engine build to serve when running inside the Contrast
55
55
  * monorepo dev checkout, or null when the installed runtime should serve
56
56
  * (published CLI, packaged electron, or an isolated PEACH_HOME). */
57
- export function resolveDevCheckoutRuntimeRoot(): string | null {
57
+ export function resolveDevCheckoutRuntimeAssetRoot(): string | null {
58
58
  // an explicit home that has a STAGED/active runtime is the isolation the
59
59
  // CI/local-publish path sets up to validate the installed-runtime code path —
60
60
  // honor that staged runtime. an explicit home with NO active runtime is just
@@ -65,7 +65,12 @@ export function resolveDevCheckoutRuntimeRoot(): string | null {
65
65
  if (process.env.PEACH_HOME && readActiveRuntime()) return null
66
66
  const root = findMonorepoRoot()
67
67
  if (!root) return null
68
- const devBuild = path.join(root, 'public/sootsim')
68
+ return path.join(root, 'public/sootsim')
69
+ }
70
+
71
+ export function resolveDevCheckoutRuntimeRoot(): string | null {
72
+ const devBuild = resolveDevCheckoutRuntimeAssetRoot()
73
+ if (!devBuild) return null
69
74
  // require the runtime shape the installed runtime also has, so serving it is
70
75
  // a drop-in (index.html shell + engine/ + both engine-tenant workers).
71
76
  if (
@@ -11,6 +11,7 @@
11
11
  // out as a bare require.
12
12
 
13
13
  import { createRuntimeDelivery, type RuntimeProduct } from '@contrast/runtime-delivery'
14
+ import { verifyCliCompanion } from './cli-runtime'
14
15
  import {
15
16
  cacheDir,
16
17
  configFilePath,
@@ -37,6 +38,7 @@ export const RNX_RUNTIME_PRODUCT: RuntimeProduct = {
37
38
  // engine-tenant/ beneath it. index.html is what the daemon and the
38
39
  // vite/metro plugins serve, so its absence means the tarball is not one.
39
40
  installedMarker: 'index.html',
41
+ verifyInstall: verifyCliCompanion,
40
42
  env: {
41
43
  cdnOrigin: 'PEACH_CDN_ORIGIN',
42
44
  channel: 'PEACH_RUNTIME_CHANNEL',
@@ -0,0 +1,70 @@
1
+ import type { RuntimePlatform } from './device-catalog.ts'
2
+
3
+ export interface RuntimePlatformAdapterRegistry<Value> {
4
+ readonly ios: Value
5
+ readonly android: Value
6
+ }
7
+
8
+ interface IOSRuntimePlatformAdapter {
9
+ readonly id: 'ios'
10
+ readonly displayName: 'iOS'
11
+ readonly isIOS: true
12
+ readonly isAndroid: false
13
+ select<Value>(registry: RuntimePlatformAdapterRegistry<Value>): Value
14
+ }
15
+
16
+ interface AndroidRuntimePlatformAdapter {
17
+ readonly id: 'android'
18
+ readonly displayName: 'Android'
19
+ readonly isIOS: false
20
+ readonly isAndroid: true
21
+ select<Value>(registry: RuntimePlatformAdapterRegistry<Value>): Value
22
+ }
23
+
24
+ export type RuntimePlatformAdapter =
25
+ | IOSRuntimePlatformAdapter
26
+ | AndroidRuntimePlatformAdapter
27
+
28
+ const IOS_ADAPTER = Object.freeze({
29
+ id: 'ios',
30
+ displayName: 'iOS',
31
+ isIOS: true,
32
+ isAndroid: false,
33
+ select: <Value>(registry: RuntimePlatformAdapterRegistry<Value>) => registry.ios,
34
+ } satisfies IOSRuntimePlatformAdapter)
35
+
36
+ const ANDROID_ADAPTER = Object.freeze({
37
+ id: 'android',
38
+ displayName: 'Android',
39
+ isIOS: false,
40
+ isAndroid: true,
41
+ select: <Value>(registry: RuntimePlatformAdapterRegistry<Value>) => registry.android,
42
+ } satisfies AndroidRuntimePlatformAdapter)
43
+
44
+ const RUNTIME_PLATFORM_ADAPTERS = Object.freeze({
45
+ ios: IOS_ADAPTER,
46
+ android: ANDROID_ADAPTER,
47
+ } satisfies Record<RuntimePlatform, RuntimePlatformAdapter>)
48
+
49
+ export function isRuntimePlatform(value: unknown): value is RuntimePlatform {
50
+ return value === 'ios' || value === 'android'
51
+ }
52
+
53
+ export function parseRuntimePlatform(
54
+ value: unknown,
55
+ boundary = 'runtime platform',
56
+ ): RuntimePlatform {
57
+ if (!isRuntimePlatform(value)) {
58
+ const received = typeof value === 'string' ? JSON.stringify(value) : String(value)
59
+ throw new Error(
60
+ `invalid ${boundary}: expected "ios" or "android", received ${received}`,
61
+ )
62
+ }
63
+ return value
64
+ }
65
+
66
+ export function getRuntimePlatformAdapter<Platform extends RuntimePlatform>(
67
+ platform: Platform,
68
+ ): (typeof RUNTIME_PLATFORM_ADAPTERS)[Platform] {
69
+ return RUNTIME_PLATFORM_ADAPTERS[platform]
70
+ }