peachsim 0.1.1641 → 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 (618) hide show
  1. package/README.md +12 -0
  2. package/cli/app-bundle-resources.ts +57 -0
  3. package/cli/app-catalog.ts +1 -1
  4. package/cli/app-fonts.ts +11 -80
  5. package/cli/app-splash.ts +18 -12
  6. package/cli/bridge-flow-runner.ts +11 -7
  7. package/cli/cloud-client.ts +10 -13
  8. package/cli/command-registry.ts +13 -4
  9. package/cli/commands/box.ts +4 -4
  10. package/cli/commands/control.ts +105 -53
  11. package/cli/commands/coverage-parser.ts +67 -0
  12. package/cli/commands/coverage.ts +550 -0
  13. package/cli/commands/debug.ts +9 -18
  14. package/cli/commands/desktop.ts +19 -7
  15. package/cli/commands/device.ts +14 -9
  16. package/cli/commands/guest-host.ts +6 -10
  17. package/cli/commands/inspect/core.ts +81 -17
  18. package/cli/commands/inspect.ts +13 -8
  19. package/cli/commands/kotlin.ts +2 -2
  20. package/cli/commands/maestro-compare.ts +1 -1
  21. package/cli/commands/platform.ts +20 -11
  22. package/cli/commands/preview.ts +16 -18
  23. package/cli/commands/runtime.ts +3 -2
  24. package/cli/commands/screenshot-layers.ts +1 -1
  25. package/cli/commands/screenshot.ts +1 -1
  26. package/cli/commands/serve.ts +5 -1
  27. package/cli/commands/support.ts +4 -4
  28. package/cli/commands/three-mode.ts +22 -15
  29. package/cli/commands/upload.ts +44 -45
  30. package/cli/current-sim.ts +38 -0
  31. package/cli/desktop-companion.ts +36 -8
  32. package/cli/device-option.ts +1 -1
  33. package/cli/drivers/playwright.ts +40 -0
  34. package/cli/drivers/types.ts +4 -0
  35. package/cli/help-core.ts +1 -1
  36. package/cli/internal-child.ts +2 -1
  37. package/cli/main.ts +9 -3
  38. package/cli/outbound-endpoints.ts +15 -5
  39. package/cli/output-redaction.ts +39 -14
  40. package/cli/remote-simulators.ts +4 -1
  41. package/cli/scene-video.ts +5 -2
  42. package/cli/send-to-box.ts +7 -10
  43. package/cli/telemetry.ts +1 -1
  44. package/cli/ws-bridge.ts +8 -1
  45. package/detox/attempt-events.cjs +3 -1
  46. package/detox/attempt-events.d.cts +1 -1
  47. package/detox/expectations.ts +108 -99
  48. package/detox/frame-offset.d.mts +6 -0
  49. package/detox/frame-offset.mjs +35 -0
  50. package/detox/gestures.ts +6 -18
  51. package/detox/index.ts +169 -101
  52. package/detox/jest-preset.cjs +1 -3
  53. package/detox/jest-transform.cjs +4 -0
  54. package/detox/matchers.ts +3 -0
  55. package/detox/motion-change.cjs +52 -118
  56. package/detox/motion-change.d.cts +6 -27
  57. package/detox/motion-leg-starts.cjs +20 -0
  58. package/detox/motion-leg-starts.d.cts +8 -0
  59. package/dist-lib/agent-daemon-client.cjs +1 -1
  60. package/dist-lib/agent-events.cjs +1 -1
  61. package/dist-lib/attached-projects.cjs +1 -1
  62. package/dist-lib/auth/shared-session.cjs +1 -1
  63. package/dist-lib/backend-origin.cjs +3 -3
  64. package/dist-lib/beta.cjs +1 -1
  65. package/dist-lib/beta.mjs +1 -1
  66. package/dist-lib/bridge-constants.cjs +1 -1
  67. package/dist-lib/bridge-contract-input.cjs +65 -1
  68. package/dist-lib/bridge-contract-input.mjs +63 -1
  69. package/dist-lib/bridge-contract.cjs +19 -1
  70. package/dist-lib/bridge-contract.mjs +17 -1
  71. package/dist-lib/bundle-channel.cjs +38332 -14940
  72. package/dist-lib/capture-contract.cjs +1 -1
  73. package/dist-lib/capture-contract.mjs +1 -1
  74. package/dist-lib/cloud-contract.cjs +1 -1
  75. package/dist-lib/cloud-contract.mjs +1 -1
  76. package/dist-lib/cloud-test-args.cjs +1 -1
  77. package/dist-lib/cloud-test-args.mjs +1 -1
  78. package/dist-lib/cloud.cjs +1 -1
  79. package/dist-lib/cloud.mjs +1 -1
  80. package/dist-lib/config.cjs +1 -1
  81. package/dist-lib/config.mjs +5 -3
  82. package/dist-lib/detox/index.cjs +1247 -4511
  83. package/dist-lib/detox/jest-preset.cjs +1 -3
  84. package/dist-lib/detox/jest-transform.cjs +4 -0
  85. package/dist-lib/dev-bundle-resolution.cjs +28 -24
  86. package/dist-lib/expo-swift-bundle.cjs +35243 -13172
  87. package/dist-lib/expo-swift-metadata.cjs +1 -1
  88. package/dist-lib/expo-swift-metadata.mjs +1 -1
  89. package/dist-lib/home-paths.cjs +1 -1
  90. package/dist-lib/host/bridge-host.cjs +45285 -63163
  91. package/dist-lib/host/fetch-proxy-handler.cjs +3544 -11
  92. package/dist-lib/host/fetch-proxy-overrides.cjs +1 -1
  93. package/dist-lib/host/fetch-proxy-overrides.mjs +1 -1
  94. package/dist-lib/host/replacement-module-handler.cjs +1 -1
  95. package/dist-lib/host/websocket-proxy.cjs +1 -1
  96. package/dist-lib/index.cjs +1997 -2069
  97. package/dist-lib/jump-to-source-babel.cjs +1 -1
  98. package/dist-lib/jump-to-source-native.cjs +1 -1
  99. package/dist-lib/kotlin-host.cjs +2 -2
  100. package/dist-lib/menu.cjs +14 -6
  101. package/dist-lib/menu.mjs +14 -6
  102. package/dist-lib/metro-fingerprint-registry.cjs +1 -1
  103. package/dist-lib/metro-fingerprint-registry.mjs +1 -1
  104. package/dist-lib/metro-production-bundle.cjs +1 -1
  105. package/dist-lib/metro-production-bundle.mjs +1 -1
  106. package/dist-lib/metro.cjs +468 -563
  107. package/dist-lib/native-app-identity-project.cjs +128 -292
  108. package/dist-lib/native-app-identity-project.mjs +1262 -51
  109. package/dist-lib/native-app-identity.cjs +8 -3
  110. package/dist-lib/native-app-identity.mjs +8 -3
  111. package/dist-lib/native-firebase-metadata.cjs +1 -1
  112. package/dist-lib/native-firebase-metadata.mjs +1 -1
  113. package/dist-lib/plist.cjs +2 -244
  114. package/dist-lib/plist.mjs +1 -1
  115. package/dist-lib/profiles.cjs +1 -1
  116. package/dist-lib/public-brand.cjs +1 -1
  117. package/dist-lib/public-origins-lib-esm.json +290 -0
  118. package/dist-lib/public-origins-lib-static.json +1 -0
  119. package/dist-lib/public-origins-lib.json +1852 -0
  120. package/dist-lib/react-native-host-modules.cjs +1 -1
  121. package/dist-lib/react-native-host-modules.mjs +1 -1
  122. package/dist-lib/scripts/dev-server-scanner.cjs +14 -253
  123. package/dist-lib/sdk.cjs +84 -16
  124. package/dist-lib/sdk.mjs +82 -15
  125. package/dist-lib/skills.cjs +51248 -75450
  126. package/dist-lib/swift-compile.cjs +26154 -1245
  127. package/dist-lib/swift-compile.mjs +26151 -1230
  128. package/dist-lib/swift-package.cjs +79 -1
  129. package/dist-lib/swift-package.mjs +75 -1
  130. package/dist-lib/swift-submit.cjs +1 -1
  131. package/dist-lib/swift-submit.mjs +1 -1
  132. package/dist-lib/swift-toolchain.cjs +1 -1
  133. package/dist-lib/swift.cjs +1 -1
  134. package/dist-lib/vite-swift.cjs +34394 -12323
  135. package/dist-lib/vite.cjs +373 -298
  136. package/dist-lib/worklet-executable.cjs +1 -1
  137. package/dist-lib/worklet-executable.mjs +1 -1
  138. package/dist-types/packages/peach-compat/src/engine-config.d.ts +2 -0
  139. package/dist-types/packages/peach-compat/src/stubs/form-sheet-spring.d.ts +9 -0
  140. package/dist-types/packages/peach-compat/src/stubs/native-evaluation-lease.d.ts +47 -0
  141. package/dist-types/packages/peach-compat/src/stubs/native-seams/react-native-cookies.d.ts +113 -0
  142. package/dist-types/packages/peach-compat/src/stubs/native-seams/react-native-gesture-handler.d.ts +154 -0
  143. package/dist-types/packages/peach-compat/src/stubs/screen-transition-math.d.ts +756 -0
  144. package/dist-types/packages/peach-compat/src/stubs/transition-scalar.d.ts +25 -0
  145. package/dist-types/packages/peach-engine/src/billing/plans.d.ts +64 -0
  146. package/dist-types/packages/peach-engine/src/browser-page-target.d.ts +2 -0
  147. package/dist-types/packages/peach-engine/src/bundle-platform-url.d.ts +3 -0
  148. package/dist-types/packages/peach-engine/src/capture/browser-accessibility-host.d.ts +3 -0
  149. package/dist-types/packages/peach-engine/src/capture/browser-composite.d.ts +55 -0
  150. package/dist-types/packages/peach-engine/src/capture/browserAccessibilityContract.d.ts +27 -0
  151. package/dist-types/packages/peach-engine/src/capture/nativeScreenCaptureContract.d.ts +22 -0
  152. package/dist-types/packages/peach-engine/src/cli-companion.d.ts +36 -0
  153. package/dist-types/packages/peach-engine/src/components/native-ui/webview-frame-bridge.d.ts +34 -0
  154. package/dist-types/packages/peach-engine/src/config.d.ts +5 -0
  155. package/dist-types/packages/peach-engine/src/engine/android-stretch-effect.d.ts +57 -0
  156. package/dist-types/packages/peach-engine/src/engine/animated-driven-style.d.ts +47 -0
  157. package/dist-types/packages/peach-engine/src/engine/animated-value.d.ts +5 -0
  158. package/dist-types/packages/peach-engine/src/engine/animated.d.ts +195 -0
  159. package/dist-types/packages/peach-engine/src/engine/animation-clockContract.d.ts +15 -0
  160. package/dist-types/packages/peach-engine/src/engine/animation-graph.d.ts +148 -0
  161. package/dist-types/packages/peach-engine/src/engine/app-catalog-wire.d.ts +10 -0
  162. package/dist-types/packages/peach-engine/src/engine/app-font-registry.d.ts +87 -0
  163. package/dist-types/packages/peach-engine/src/engine/attributed-paragraph-paint.d.ts +7 -0
  164. package/dist-types/packages/peach-engine/src/engine/attributed-paragraph.d.ts +123 -0
  165. package/dist-types/packages/peach-engine/src/engine/audioContract.d.ts +16 -0
  166. package/dist-types/packages/peach-engine/src/engine/canvaskit-api.d.ts +93 -0
  167. package/dist-types/packages/peach-engine/src/engine/canvaskit-renderer.d.ts +216 -0
  168. package/dist-types/packages/peach-engine/src/engine/config-plugin-fonts.d.ts +40 -0
  169. package/dist-types/packages/peach-engine/src/engine/config-plugin-splash.d.ts +25 -0
  170. package/dist-types/packages/peach-engine/src/engine/cull-visibility.d.ts +44 -0
  171. package/dist-types/packages/peach-engine/src/engine/damage-rect.d.ts +19 -0
  172. package/dist-types/packages/peach-engine/src/engine/engine-resource.d.ts +6 -0
  173. package/dist-types/packages/peach-engine/src/engine/expo-manifest.d.ts +5 -0
  174. package/dist-types/packages/peach-engine/src/engine/fiber-debug-metadata.d.ts +30 -0
  175. package/dist-types/packages/peach-engine/src/engine/font-config.d.ts +139 -0
  176. package/dist-types/packages/peach-engine/src/engine/generated/sf-pro-font.d.ts +1 -0
  177. package/dist-types/packages/peach-engine/src/engine/glass-material.d.ts +31 -0
  178. package/dist-types/packages/peach-engine/src/engine/host-composite.d.ts +100 -0
  179. package/dist-types/packages/peach-engine/src/engine/hosted-semantics.d.ts +49 -0
  180. package/dist-types/packages/peach-engine/src/engine/image-audit.d.ts +70 -0
  181. package/dist-types/packages/peach-engine/src/engine/image-loader.d.ts +350 -0
  182. package/dist-types/packages/peach-engine/src/engine/inspect-info.d.ts +27 -0
  183. package/dist-types/packages/peach-engine/src/engine/inspect-outline.d.ts +14 -0
  184. package/dist-types/packages/peach-engine/src/engine/inspect-visibility.d.ts +33 -0
  185. package/dist-types/packages/peach-engine/src/engine/ios-fast-scroll.d.ts +16 -0
  186. package/dist-types/packages/peach-engine/src/engine/layout-sab.d.ts +43 -0
  187. package/dist-types/packages/peach-engine/src/engine/liquid-glass-rect.d.ts +23 -0
  188. package/dist-types/packages/peach-engine/src/engine/liquid-glass-shaders.d.ts +9 -0
  189. package/dist-types/packages/peach-engine/src/engine/liquid-glass.d.ts +283 -0
  190. package/dist-types/packages/peach-engine/src/engine/live-object-counts.d.ts +6 -0
  191. package/dist-types/packages/peach-engine/src/engine/lottie-runtime.d.ts +32 -0
  192. package/dist-types/packages/peach-engine/src/engine/lottie-types.d.ts +138 -0
  193. package/dist-types/packages/peach-engine/src/engine/memory-counts.d.ts +27 -0
  194. package/dist-types/packages/peach-engine/src/engine/metalDirectContract.d.ts +108 -0
  195. package/dist-types/packages/peach-engine/src/engine/metalShaderContract.d.ts +217 -0
  196. package/dist-types/packages/peach-engine/src/engine/native-animation-driver.d.ts +112 -0
  197. package/dist-types/packages/peach-engine/src/engine/native-animation-graph.d.ts +62 -0
  198. package/dist-types/packages/peach-engine/src/engine/native-layout.d.ts +133 -0
  199. package/dist-types/packages/peach-engine/src/engine/native-resources.d.ts +26 -0
  200. package/dist-types/packages/peach-engine/src/engine/nativeReanimatedContract.d.ts +25 -0
  201. package/dist-types/packages/peach-engine/src/engine/nativeReplayContract.d.ts +64 -0
  202. package/dist-types/packages/peach-engine/src/engine/node.d.ts +589 -0
  203. package/dist-types/packages/peach-engine/src/engine/paint-boundary-types.d.ts +112 -0
  204. package/dist-types/packages/peach-engine/src/engine/paint-boundary.d.ts +57 -0
  205. package/dist-types/packages/peach-engine/src/engine/portalContract.d.ts +21 -0
  206. package/dist-types/packages/peach-engine/src/engine/portals.d.ts +20 -0
  207. package/dist-types/packages/peach-engine/src/engine/render-damage.d.ts +107 -0
  208. package/dist-types/packages/peach-engine/src/engine/riveContract.d.ts +420 -0
  209. package/dist-types/packages/peach-engine/src/engine/rn-spring.d.ts +51 -0
  210. package/dist-types/packages/peach-engine/src/engine/scene-table.d.ts +379 -0
  211. package/dist-types/packages/peach-engine/src/engine/scroll-momentum-math.d.ts +152 -0
  212. package/dist-types/packages/peach-engine/src/engine/scroll-pan-contacts.d.ts +10 -0
  213. package/dist-types/packages/peach-engine/src/engine/scroll-platform.d.ts +75 -0
  214. package/dist-types/packages/peach-engine/src/engine/scroll-range.d.ts +14 -0
  215. package/dist-types/packages/peach-engine/src/engine/scroll-velocity.d.ts +14 -0
  216. package/dist-types/packages/peach-engine/src/engine/scroll.d.ts +320 -0
  217. package/dist-types/packages/peach-engine/src/engine/signal.d.ts +7 -0
  218. package/dist-types/packages/peach-engine/src/engine/snapshot-cache-policy.d.ts +6 -0
  219. package/dist-types/packages/peach-engine/src/engine/svg-geometry.d.ts +41 -0
  220. package/dist-types/packages/peach-engine/src/engine/text-attachment-paragraphs.d.ts +10 -0
  221. package/dist-types/packages/peach-engine/src/engine/text-decoration.d.ts +11 -0
  222. package/dist-types/packages/peach-engine/src/engine/text-line-break.d.ts +22 -0
  223. package/dist-types/packages/peach-engine/src/engine/text-paint-receipt.d.ts +98 -0
  224. package/dist-types/packages/peach-engine/src/engine/text-paragraph.d.ts +11 -0
  225. package/dist-types/packages/peach-engine/src/engine/text-paragraphContract.d.ts +34 -0
  226. package/dist-types/packages/peach-engine/src/engine/text-transform.d.ts +1 -0
  227. package/dist-types/packages/peach-engine/src/engine/types.d.ts +657 -0
  228. package/dist-types/packages/peach-engine/src/engine/visible-frame.d.ts +54 -0
  229. package/dist-types/packages/peach-engine/src/engine/webrtcContract.d.ts +74 -0
  230. package/dist-types/packages/peach-engine/src/graphite-stats-fields.d.ts +184 -0
  231. package/dist-types/packages/peach-engine/src/guest-import-meta.d.ts +12 -0
  232. package/dist-types/packages/peach-engine/src/guest-module-overrides.d.ts +7 -0
  233. package/dist-types/packages/peach-engine/src/ios/app-card-types.d.ts +7 -0
  234. package/dist-types/packages/peach-engine/src/ios/apps/canvas-map-data.d.ts +177 -0
  235. package/dist-types/packages/peach-engine/src/ios/aux-home-scene.d.ts +54 -0
  236. package/dist-types/packages/peach-engine/src/ios/chrome-metrics.d.ts +47 -0
  237. package/dist-types/packages/peach-engine/src/ios/constants.d.ts +21 -0
  238. package/dist-types/packages/peach-engine/src/ios/duo-housing.d.ts +37 -0
  239. package/dist-types/packages/peach-engine/src/ios/home/types.d.ts +29 -0
  240. package/dist-types/packages/peach-engine/src/ios/home-app-catalog.d.ts +43 -0
  241. package/dist-types/packages/peach-engine/src/ios/photo-store.d.ts +73 -0
  242. package/dist-types/packages/peach-engine/src/ios/photoLibraryContract.d.ts +166 -0
  243. package/dist-types/packages/peach-engine/src/ios/shell-controller-types.d.ts +21 -0
  244. package/dist-types/packages/peach-engine/src/ios/shell-transition-debug.d.ts +18 -0
  245. package/dist-types/packages/peach-engine/src/metro-asset-path.d.ts +21 -0
  246. package/dist-types/packages/peach-engine/src/metro-fingerprint-registry-client.d.ts +11 -0
  247. package/dist-types/packages/peach-engine/src/metro-fingerprint.d.ts +38 -0
  248. package/dist-types/packages/peach-engine/src/native-preview-bundle.d.ts +44 -0
  249. package/dist-types/packages/peach-engine/src/observability/types.d.ts +74 -0
  250. package/dist-types/packages/peach-engine/src/peach-warm-manifest.d.ts +32 -0
  251. package/dist-types/packages/peach-engine/src/permissions/app-settings-client.d.ts +25 -0
  252. package/dist-types/packages/peach-engine/src/permissions/system-permission-types.d.ts +20 -0
  253. package/dist-types/packages/peach-engine/src/platform/android-back-panel.d.ts +131 -0
  254. package/dist-types/packages/peach-engine/src/platform/android-gesture-exclusion.d.ts +28 -0
  255. package/dist-types/packages/peach-engine/src/platform/android-predictive-back.d.ts +33 -0
  256. package/dist-types/packages/peach-engine/src/platform/system-bars-state.d.ts +14 -0
  257. package/dist-types/packages/peach-engine/src/playwright-sim-host.d.ts +1 -0
  258. package/dist-types/packages/peach-engine/src/preview/bundle-layout.d.ts +8 -0
  259. package/dist-types/packages/peach-engine/src/preview/bundle-variantContract.d.ts +24 -0
  260. package/dist-types/packages/peach-engine/src/preview/capture-bundle.d.ts +26 -0
  261. package/dist-types/packages/peach-engine/src/preview/compress-node.d.ts +2 -0
  262. package/dist-types/packages/peach-engine/src/preview/compress.d.ts +2 -0
  263. package/dist-types/packages/peach-engine/src/preview/presigned-upload.d.ts +60 -0
  264. package/dist-types/packages/peach-engine/src/preview/trace.d.ts +144 -0
  265. package/dist-types/packages/peach-engine/src/preview/upload-protocol.d.ts +152 -0
  266. package/dist-types/packages/peach-engine/src/profiler/animation-recording-loader.d.ts +1 -0
  267. package/dist-types/packages/peach-engine/src/profiler/profile-trace.d.ts +4 -0
  268. package/dist-types/packages/peach-engine/src/react-bridge.d.ts +3 -0
  269. package/dist-types/packages/peach-engine/src/react-native/AppState.d.ts +45 -0
  270. package/dist-types/packages/peach-engine/src/react-native/Appearance.d.ts +34 -0
  271. package/dist-types/packages/peach-engine/src/react-native/framework-colors-data.d.ts +2 -0
  272. package/dist-types/packages/peach-engine/src/react-native/host-services.d.ts +42 -0
  273. package/dist-types/packages/peach-engine/src/react-native/layout-animation.d.ts +22 -0
  274. package/dist-types/packages/peach-engine/src/react-native/platform-colors.d.ts +17 -0
  275. package/dist-types/packages/peach-engine/src/remote-stream/client-config.d.ts +10 -0
  276. package/dist-types/packages/peach-engine/src/remote-stream/cloud-display.d.ts +58 -0
  277. package/dist-types/packages/peach-engine/src/remote-stream/scene-recording.d.ts +45 -0
  278. package/dist-types/packages/peach-engine/src/render-worker/animated-drive-output.d.ts +35 -0
  279. package/dist-types/packages/peach-engine/src/render-worker/app-load.d.ts +16 -0
  280. package/dist-types/packages/peach-engine/src/render-worker/aux-surface-types.d.ts +2 -0
  281. package/dist-types/packages/peach-engine/src/render-worker/canvaskit-shared.d.ts +42 -0
  282. package/dist-types/packages/peach-engine/src/render-worker/canvaskit-webgpu.d.ts +434 -0
  283. package/dist-types/packages/peach-engine/src/render-worker/canvaskit-worker-init.d.ts +12 -0
  284. package/dist-types/packages/peach-engine/src/render-worker/compositor-backend.d.ts +31 -0
  285. package/dist-types/packages/peach-engine/src/render-worker/compositor-gpu.d.ts +202 -0
  286. package/dist-types/packages/peach-engine/src/render-worker/compositor-protocol.d.ts +1945 -0
  287. package/dist-types/packages/peach-engine/src/render-worker/compositor-runtime/scroll-drag-resample.d.ts +44 -0
  288. package/dist-types/packages/peach-engine/src/render-worker/css-keyframes-drive.d.ts +36 -0
  289. package/dist-types/packages/peach-engine/src/render-worker/edit-menu-geometry.d.ts +8 -0
  290. package/dist-types/packages/peach-engine/src/render-worker/engine-resource-relay.d.ts +21 -0
  291. package/dist-types/packages/peach-engine/src/render-worker/expo-widgetContract.d.ts +16 -0
  292. package/dist-types/packages/peach-engine/src/render-worker/gesture-seam-protocol.d.ts +152 -0
  293. package/dist-types/packages/peach-engine/src/render-worker/graph-linked-value.d.ts +29 -0
  294. package/dist-types/packages/peach-engine/src/render-worker/graphite-pipeline-compiler-contract.d.ts +49 -0
  295. package/dist-types/packages/peach-engine/src/render-worker/graphite-pipeline-compiler.d.ts +12 -0
  296. package/dist-types/packages/peach-engine/src/render-worker/host-service-protocol.d.ts +756 -0
  297. package/dist-types/packages/peach-engine/src/render-worker/image-lifecycle-event.d.ts +22 -0
  298. package/dist-types/packages/peach-engine/src/render-worker/image-pixel-contract.d.ts +48 -0
  299. package/dist-types/packages/peach-engine/src/render-worker/live-frame-mirror.d.ts +34 -0
  300. package/dist-types/packages/peach-engine/src/render-worker/map-command-channel.d.ts +189 -0
  301. package/dist-types/packages/peach-engine/src/render-worker/mapNativeContract.d.ts +101 -0
  302. package/dist-types/packages/peach-engine/src/render-worker/native-dynamic-synchronizable.d.ts +22 -0
  303. package/dist-types/packages/peach-engine/src/render-worker/native-menu-gesture.d.ts +9 -0
  304. package/dist-types/packages/peach-engine/src/render-worker/native-ui-commandContract.d.ts +23 -0
  305. package/dist-types/packages/peach-engine/src/render-worker/native-ui-protocol.d.ts +1087 -0
  306. package/dist-types/packages/peach-engine/src/render-worker/native-widgetContract.d.ts +100 -0
  307. package/dist-types/packages/peach-engine/src/render-worker/nativeAnimMirrorContract.d.ts +174 -0
  308. package/dist-types/packages/peach-engine/src/render-worker/nativeSyncReplyContract.d.ts +11 -0
  309. package/dist-types/packages/peach-engine/src/render-worker/one-native-contentContract.d.ts +54 -0
  310. package/dist-types/packages/peach-engine/src/render-worker/pointerSampleContract.d.ts +14 -0
  311. package/dist-types/packages/peach-engine/src/render-worker/protocol.d.ts +880 -0
  312. package/dist-types/packages/peach-engine/src/render-worker/reanimated-css-contract.d.ts +63 -0
  313. package/dist-types/packages/peach-engine/src/render-worker/reanimated-readiness.d.ts +29 -0
  314. package/dist-types/packages/peach-engine/src/render-worker/resilient-frame-clock.d.ts +22 -0
  315. package/dist-types/packages/peach-engine/src/render-worker/retained-app-load.d.ts +20 -0
  316. package/dist-types/packages/peach-engine/src/render-worker/screen-edge-swipe-commit-protocol.d.ts +1 -0
  317. package/dist-types/packages/peach-engine/src/render-worker/screen-form-sheet-commit-protocol.d.ts +26 -0
  318. package/dist-types/packages/peach-engine/src/render-worker/scroll-mirror-tenant.d.ts +37 -0
  319. package/dist-types/packages/peach-engine/src/render-worker/scroll-mirror.d.ts +164 -0
  320. package/dist-types/packages/peach-engine/src/render-worker/shell-event-registry.d.ts +119 -0
  321. package/dist-types/packages/peach-engine/src/render-worker/shell-gesture-regions.d.ts +41 -0
  322. package/dist-types/packages/peach-engine/src/render-worker/shell-protocol.d.ts +603 -0
  323. package/dist-types/packages/peach-engine/src/render-worker/shell-scene-schema.d.ts +101 -0
  324. package/dist-types/packages/peach-engine/src/render-worker/shell-tree-inline-sources.d.ts +13 -0
  325. package/dist-types/packages/peach-engine/src/render-worker/shell-tree-wire.d.ts +87 -0
  326. package/dist-types/packages/peach-engine/src/render-worker/test-bridge-protocol.d.ts +47 -0
  327. package/dist-types/packages/peach-engine/src/render-worker/text-inputContract.d.ts +93 -0
  328. package/dist-types/packages/peach-engine/src/render-worker/tree-sync-port.d.ts +102 -0
  329. package/dist-types/packages/peach-engine/src/render-worker/webgpu-frame-transaction.d.ts +292 -0
  330. package/dist-types/packages/peach-engine/src/render-worker/webgpu-readback-scheduler.d.ts +107 -0
  331. package/dist-types/packages/peach-engine/src/render-worker/webview-capture-protocol.d.ts +16 -0
  332. package/dist-types/packages/peach-engine/src/render-worker/worker-input-runtime.d.ts +211 -0
  333. package/dist-types/packages/peach-engine/src/render-worker/worker-storage.d.ts +33 -0
  334. package/dist-types/packages/peach-engine/src/render-worker/worklet-runtime.d.ts +987 -0
  335. package/dist-types/packages/peach-engine/src/render-worker/worklet-sab.d.ts +24 -0
  336. package/dist-types/packages/peach-engine/src/rolldown-bundle-inventory.d.ts +84 -0
  337. package/dist-types/packages/peach-engine/src/rolldown-production-fingerprint.d.ts +31 -0
  338. package/dist-types/packages/peach-engine/src/screenshots/timeline-assets.d.ts +10 -0
  339. package/dist-types/packages/peach-engine/src/screenshots/tokens.d.ts +9 -0
  340. package/dist-types/packages/peach-engine/src/settings/devices.d.ts +70 -0
  341. package/dist-types/packages/peach-engine/src/settings/duo-fold-bus.d.ts +87 -0
  342. package/dist-types/packages/peach-engine/src/settings/interface-rotation.d.ts +30 -0
  343. package/dist-types/packages/peach-engine/src/settings/react-native-configuration.d.ts +12 -0
  344. package/dist-types/packages/peach-engine/src/settings/scene-geometryContract.d.ts +40 -0
  345. package/dist-types/packages/peach-engine/src/settings/store.d.ts +37 -0
  346. package/dist-types/packages/peach-engine/src/shell-events.d.ts +203 -0
  347. package/dist-types/packages/peach-engine/src/shell-intent.d.ts +68 -0
  348. package/dist-types/packages/peach-engine/src/sootsim-event.d.ts +35 -0
  349. package/dist-types/packages/peach-engine/src/top-overlay-state.d.ts +5 -0
  350. package/dist-types/packages/peach-engine/src/web-authentication-automation-host.d.ts +2 -0
  351. package/dist-types/packages/peach-engine/src/webAuthenticationContract.d.ts +34 -0
  352. package/dist-types/packages/peach-engine/src/webview-automation-host.d.ts +180 -0
  353. package/dist-types/packages/peach-engine/src/wireframe-mode.d.ts +16 -0
  354. package/dist-types/packages/peach-globals/src/frameBreakdownContract.d.ts +16 -0
  355. package/dist-types/packages/peach-globals/src/index.d.ts +3311 -0
  356. package/dist-types/packages/peach-globals/src/nativeSurfaceContract.d.ts +76 -0
  357. package/dist-types/packages/peach-globals/src/pointerSourceEventContract.d.ts +8 -0
  358. package/dist-types/packages/peach-globals/src/profileTrace.d.ts +11 -0
  359. package/dist-types/packages/peach-globals/src/profilerContract.d.ts +223 -0
  360. package/dist-types/packages/peach-kit/src/capabilities.d.ts +721 -0
  361. package/dist-types/packages/peach-kit/src/internal.d.ts +4 -0
  362. package/dist-types/packages/peach-kit/src/materials/types.d.ts +27 -0
  363. package/dist-types/packages/peach-kit/src/materials/uikit-blur-material.d.ts +14 -0
  364. package/dist-types/packages/peach-kit/src/navigation-types.d.ts +11 -0
  365. package/dist-types/packages/peach-kit/src/react-bridge.d.ts +53 -0
  366. package/dist-types/packages/peach-kit/src/runtime.d.ts +26 -0
  367. package/dist-types/packages/peach-kit/src/ui/hosting-safe-area.d.ts +24 -0
  368. package/dist-types/packages/peach-kit/src/ui/popover-placement.d.ts +53 -0
  369. package/dist-types/packages/peach-kit/src/ui/presentationContract.d.ts +17 -0
  370. package/kotlin/ComposeSources/PeachComposeHost.kt +1 -1
  371. package/kotlin/JniSources/com/facebook/jni/HybridData.kt +0 -2
  372. package/kotlin/JniSources/dev/peach/jni/NativeBindings.kt +0 -2
  373. package/kotlin/JniTransportSources/dev/peach/jni/integration/JniTransport.kt +0 -2
  374. package/kotlin/README.md +6 -0
  375. package/package.json +22 -2
  376. package/runtime-companion.json +1 -0
  377. package/skills/contrast/SKILL.md +1 -0
  378. package/src/appBundleResourcesContract.ts +51 -0
  379. package/src/assetCatalogContract.ts +21 -0
  380. package/src/backend-origin.ts +3 -1
  381. package/src/bridge-contract-input.ts +84 -0
  382. package/src/bridge-contract.ts +35 -3
  383. package/src/browser-launch-policy.ts +1 -0
  384. package/src/bundle-channel.mjs +4 -2
  385. package/src/cli-runtime.ts +55 -0
  386. package/src/crash-fingerprint.ts +26 -0
  387. package/src/dev-bundle-resolution.ts +50 -23
  388. package/src/device-catalog.ts +1159 -0
  389. package/src/host/bridge-host.ts +20 -37
  390. package/src/host/browser-pointer.ts +71 -0
  391. package/src/host/dev-server-package-versions.ts +23 -0
  392. package/src/host/fetch-proxy-handler.ts +17 -4
  393. package/src/host/staged-host-files.ts +28 -4
  394. package/src/installed-package-versions.ts +142 -38
  395. package/src/kotlin-host.ts +1 -1
  396. package/src/launchMetadataContract.ts +1 -0
  397. package/src/menu.ts +12 -4
  398. package/src/metro-plugin.ts +4 -4
  399. package/src/metro-project-root.ts +68 -0
  400. package/src/native-app-identity-project.ts +47 -38
  401. package/src/nitro-adapter.lock.json +26 -0
  402. package/src/nitro-adapter.ts +103 -0
  403. package/src/nitro-bundle.ts +24 -10
  404. package/src/nitro-compile.ts +33 -51
  405. package/src/nitro-source.ts +177 -96
  406. package/src/nitroAdapterContract.ts +217 -0
  407. package/src/nitroContract.ts +24 -11
  408. package/src/process-group.ts +41 -34
  409. package/src/react-bridge-importers.ts +28 -0
  410. package/src/reactNativeConfigurationContract.ts +36 -0
  411. package/src/runtime-assets.ts +7 -2
  412. package/src/runtime-delivery.ts +8 -7
  413. package/src/runtimePlatformContract.ts +70 -0
  414. package/src/screenshots/frame-compose.ts +42 -43
  415. package/src/screenshots/org-deck.ts +9 -4
  416. package/src/screenshots/preset-names.ts +29 -0
  417. package/src/screenshots/registry.ts +5 -5
  418. package/src/screenshots/schema.ts +1 -1
  419. package/src/screenshots/screenshotContract.ts +971 -0
  420. package/src/settings-flags.ts +107 -0
  421. package/src/settingsContract.ts +609 -0
  422. package/src/storageSnapshotContract.ts +344 -0
  423. package/src/stub-pattern-matcher.ts +550 -0
  424. package/src/swift-compile.ts +926 -47
  425. package/src/swift-compiler-digest.ts +17 -3
  426. package/src/swift-distribution.lock.json +49 -22
  427. package/src/swift-host.ts +167 -52
  428. package/src/swift-objc-compile.ts +86 -26
  429. package/src/swift-objc-export.ts +532 -0
  430. package/src/swift-objc-import.ts +769 -0
  431. package/src/swift-objc-metadata.ts +285 -10
  432. package/src/swift-objc-sdk.ts +13970 -158
  433. package/src/swift-objc-standin.ts +137 -1
  434. package/src/swift-package.ts +94 -0
  435. package/src/swift-packages.ts +5 -5
  436. package/src/swift-root-lock.ts +241 -92
  437. package/src/swift-submit.ts +6 -0
  438. package/src/swiftContract.ts +99 -0
  439. package/src/target-matcher.ts +6 -1
  440. package/src/vite-plugin.ts +14 -40
  441. package/src/worker-system-chunks.ts +1 -1
  442. package/src/workerChunkContract.ts +5 -0
  443. package/src/worklets-babel.ts +24 -5
  444. package/src/xcode-project.ts +103 -11
  445. package/src/xcode-target-members.ts +10 -3
  446. package/cli/drivers/playwright-sim-host.ts +0 -825
  447. package/kotlin/fixtures/counter/Counter.d.kt.ts +0 -17
  448. package/kotlin/fixtures/counter/Counter.kt +0 -51
  449. package/kotlin/fixtures/counter/CounterApp.native.tsx +0 -61
  450. package/kotlin/fixtures/counter/CounterApp.tsx +0 -3
  451. package/kotlin/fixtures/counter/CounterScreen.d.kt.ts +0 -8
  452. package/kotlin/fixtures/counter/CounterScreen.kt +0 -56
  453. package/kotlin/fixtures/counter/app/_layout.tsx +0 -4
  454. package/kotlin/fixtures/counter/app/index+spa.tsx +0 -1
  455. package/kotlin/fixtures/counter/app/routes.d.ts +0 -18
  456. package/kotlin/fixtures/counter/package.json +0 -20
  457. package/kotlin/fixtures/counter/tsconfig.json +0 -19
  458. package/kotlin/fixtures/counter/vite.config.ts +0 -20
  459. package/kotlin/fixtures/headless-counter/Headless.kt +0 -234
  460. package/kotlin/fixtures/import-animation/Animation.d.kt.ts +0 -7
  461. package/kotlin/fixtures/import-animation/Animation.kt +0 -80
  462. package/kotlin/fixtures/import-animation/ImportAnimation.native.tsx +0 -13
  463. package/kotlin/fixtures/import-animation/README.md +0 -24
  464. package/kotlin/fixtures/import-animation/app/_layout.tsx +0 -4
  465. package/kotlin/fixtures/import-animation/app/index+spa.tsx +0 -1
  466. package/kotlin/fixtures/import-animation/app/routes.d.ts +0 -18
  467. package/kotlin/fixtures/import-animation/package.json +0 -23
  468. package/kotlin/fixtures/import-animation/tsconfig.json +0 -20
  469. package/kotlin/fixtures/import-animation/vite.config.ts +0 -20
  470. package/kotlin/fixtures/import-drawing/Drawing.d.kt.ts +0 -7
  471. package/kotlin/fixtures/import-drawing/Drawing.kt +0 -101
  472. package/kotlin/fixtures/import-drawing/ImportDrawing.native.tsx +0 -18
  473. package/kotlin/fixtures/import-drawing/README.md +0 -34
  474. package/kotlin/fixtures/import-drawing/app/_layout.tsx +0 -4
  475. package/kotlin/fixtures/import-drawing/app/index+spa.tsx +0 -1
  476. package/kotlin/fixtures/import-drawing/package.json +0 -23
  477. package/kotlin/fixtures/import-drawing/tsconfig.json +0 -20
  478. package/kotlin/fixtures/import-drawing/vite.config.ts +0 -20
  479. package/kotlin/fixtures/import-editor/Editor.d.kt.ts +0 -7
  480. package/kotlin/fixtures/import-editor/Editor.kt +0 -59
  481. package/kotlin/fixtures/import-editor/ImportEditor.native.tsx +0 -23
  482. package/kotlin/fixtures/import-editor/README.md +0 -27
  483. package/kotlin/fixtures/import-editor/app/_layout.tsx +0 -4
  484. package/kotlin/fixtures/import-editor/app/index+spa.tsx +0 -1
  485. package/kotlin/fixtures/import-editor/package.json +0 -23
  486. package/kotlin/fixtures/import-editor/tsconfig.json +0 -20
  487. package/kotlin/fixtures/import-editor/vite.config.ts +0 -20
  488. package/kotlin/fixtures/import-effects/Effects.d.kt.ts +0 -7
  489. package/kotlin/fixtures/import-effects/Effects.kt +0 -87
  490. package/kotlin/fixtures/import-effects/ImportEffects.native.tsx +0 -13
  491. package/kotlin/fixtures/import-effects/README.md +0 -19
  492. package/kotlin/fixtures/import-effects/app/_layout.tsx +0 -4
  493. package/kotlin/fixtures/import-effects/app/index+spa.tsx +0 -1
  494. package/kotlin/fixtures/import-effects/package.json +0 -23
  495. package/kotlin/fixtures/import-effects/tsconfig.json +0 -20
  496. package/kotlin/fixtures/import-effects/vite.config.ts +0 -20
  497. package/kotlin/fixtures/import-layout/ImportLayout.native.tsx +0 -13
  498. package/kotlin/fixtures/import-layout/Layout.d.kt.ts +0 -7
  499. package/kotlin/fixtures/import-layout/Layout.kt +0 -72
  500. package/kotlin/fixtures/import-layout/README.md +0 -24
  501. package/kotlin/fixtures/import-layout/app/_layout.tsx +0 -4
  502. package/kotlin/fixtures/import-layout/app/index+spa.tsx +0 -1
  503. package/kotlin/fixtures/import-layout/package.json +0 -23
  504. package/kotlin/fixtures/import-layout/tsconfig.json +0 -20
  505. package/kotlin/fixtures/import-layout/vite.config.ts +0 -20
  506. package/kotlin/fixtures/import-navigation/ImportNavigation.native.tsx +0 -18
  507. package/kotlin/fixtures/import-navigation/Navigation.d.kt.ts +0 -7
  508. package/kotlin/fixtures/import-navigation/Navigation.kt +0 -104
  509. package/kotlin/fixtures/import-navigation/README.md +0 -31
  510. package/kotlin/fixtures/import-navigation/app/_layout.tsx +0 -4
  511. package/kotlin/fixtures/import-navigation/app/index+spa.tsx +0 -1
  512. package/kotlin/fixtures/import-navigation/package.json +0 -23
  513. package/kotlin/fixtures/import-navigation/tsconfig.json +0 -20
  514. package/kotlin/fixtures/import-navigation/vite.config.ts +0 -20
  515. package/kotlin/fixtures/import-overlays/ImportOverlays.native.tsx +0 -29
  516. package/kotlin/fixtures/import-overlays/Overlays.d.kt.ts +0 -7
  517. package/kotlin/fixtures/import-overlays/Overlays.kt +0 -93
  518. package/kotlin/fixtures/import-overlays/README.md +0 -34
  519. package/kotlin/fixtures/import-overlays/app/_layout.tsx +0 -4
  520. package/kotlin/fixtures/import-overlays/app/index+spa.tsx +0 -1
  521. package/kotlin/fixtures/import-overlays/package.json +0 -23
  522. package/kotlin/fixtures/import-overlays/tsconfig.json +0 -20
  523. package/kotlin/fixtures/import-overlays/vite.config.ts +0 -20
  524. package/kotlin/fixtures/import-resources/ImportResources.native.tsx +0 -18
  525. package/kotlin/fixtures/import-resources/README.md +0 -26
  526. package/kotlin/fixtures/import-resources/Resources.d.kt.ts +0 -6
  527. package/kotlin/fixtures/import-resources/Resources.kt +0 -72
  528. package/kotlin/fixtures/import-resources/app/_layout.tsx +0 -4
  529. package/kotlin/fixtures/import-resources/app/index+spa.tsx +0 -1
  530. package/kotlin/fixtures/import-resources/package.json +0 -23
  531. package/kotlin/fixtures/import-resources/tsconfig.json +0 -20
  532. package/kotlin/fixtures/import-resources/vite.config.ts +0 -20
  533. package/kotlin/fixtures/import-scroll/ImportNested.native.tsx +0 -10
  534. package/kotlin/fixtures/import-scroll/ImportScroll.native.tsx +0 -13
  535. package/kotlin/fixtures/import-scroll/Nested.d.kt.ts +0 -4
  536. package/kotlin/fixtures/import-scroll/Nested.kt +0 -64
  537. package/kotlin/fixtures/import-scroll/README.md +0 -38
  538. package/kotlin/fixtures/import-scroll/Scroll.d.kt.ts +0 -7
  539. package/kotlin/fixtures/import-scroll/Scroll.kt +0 -91
  540. package/kotlin/fixtures/import-scroll/app/_layout.tsx +0 -4
  541. package/kotlin/fixtures/import-scroll/app/index+spa.tsx +0 -1
  542. package/kotlin/fixtures/import-scroll/app/nested+spa.tsx +0 -1
  543. package/kotlin/fixtures/import-scroll/package.json +0 -23
  544. package/kotlin/fixtures/import-scroll/tsconfig.json +0 -20
  545. package/kotlin/fixtures/import-scroll/vite.config.ts +0 -20
  546. package/kotlin/fixtures/import-selection/ImportSelection.native.tsx +0 -44
  547. package/kotlin/fixtures/import-selection/README.md +0 -32
  548. package/kotlin/fixtures/import-selection/Selection.d.kt.ts +0 -8
  549. package/kotlin/fixtures/import-selection/Selection.kt +0 -78
  550. package/kotlin/fixtures/import-selection/app/_layout.tsx +0 -4
  551. package/kotlin/fixtures/import-selection/app/index+spa.tsx +0 -1
  552. package/kotlin/fixtures/import-selection/package.json +0 -23
  553. package/kotlin/fixtures/import-selection/tsconfig.json +0 -20
  554. package/kotlin/fixtures/import-selection/vite.config.ts +0 -20
  555. package/kotlin/fixtures/import-surfaces/ImportSurfaces.native.tsx +0 -13
  556. package/kotlin/fixtures/import-surfaces/README.md +0 -22
  557. package/kotlin/fixtures/import-surfaces/Surfaces.d.kt.ts +0 -7
  558. package/kotlin/fixtures/import-surfaces/Surfaces.kt +0 -64
  559. package/kotlin/fixtures/import-surfaces/app/_layout.tsx +0 -4
  560. package/kotlin/fixtures/import-surfaces/app/index+spa.tsx +0 -1
  561. package/kotlin/fixtures/import-surfaces/package.json +0 -23
  562. package/kotlin/fixtures/import-surfaces/tsconfig.json +0 -20
  563. package/kotlin/fixtures/import-surfaces/vite.config.ts +0 -20
  564. package/kotlin/fixtures/import-values/ImportValues.native.tsx +0 -61
  565. package/kotlin/fixtures/import-values/README.md +0 -28
  566. package/kotlin/fixtures/import-values/Values.d.kt.ts +0 -15
  567. package/kotlin/fixtures/import-values/Values.kt +0 -84
  568. package/kotlin/fixtures/import-values/app/_layout.tsx +0 -4
  569. package/kotlin/fixtures/import-values/app/index+spa.tsx +0 -1
  570. package/kotlin/fixtures/import-values/package.json +0 -23
  571. package/kotlin/fixtures/import-values/tsconfig.json +0 -20
  572. package/kotlin/fixtures/import-values/vite.config.ts +0 -20
  573. package/kotlin/fixtures/kotlin-app/app/build.gradle.kts +0 -30
  574. package/kotlin/fixtures/kotlin-app/app/src/main/AndroidManifest.xml +0 -13
  575. package/kotlin/fixtures/kotlin-app/app/src/main/java/dev/contrast/kotlinapp/MainActivity.kt +0 -60
  576. package/kotlin/fixtures/kotlin-app/app/src/main/java/dev/contrast/kotlinapp/ProbeApplication.kt +0 -18
  577. package/kotlin/fixtures/kotlin-app/build.gradle.kts +0 -5
  578. package/kotlin/fixtures/kotlin-app/gradle.properties +0 -4
  579. package/kotlin/fixtures/kotlin-app/settings.gradle.kts +0 -4
  580. package/kotlin/fixtures/kotlin-app-variants/Anim.kt +0 -62
  581. package/kotlin/fixtures/kotlin-app-variants/BarBehavior.kt +0 -38
  582. package/kotlin/fixtures/kotlin-app-variants/BarVisibility.kt +0 -36
  583. package/kotlin/fixtures/kotlin-app-variants/Bitmaps.kt +0 -50
  584. package/kotlin/fixtures/kotlin-app-variants/Browse.kt +0 -73
  585. package/kotlin/fixtures/kotlin-app-variants/Colors.kt +0 -41
  586. package/kotlin/fixtures/kotlin-app-variants/Controls.kt +0 -62
  587. package/kotlin/fixtures/kotlin-app-variants/Drag.kt +0 -56
  588. package/kotlin/fixtures/kotlin-app-variants/Draw.kt +0 -74
  589. package/kotlin/fixtures/kotlin-app-variants/Drawables.kt +0 -53
  590. package/kotlin/fixtures/kotlin-app-variants/Focus.kt +0 -62
  591. package/kotlin/fixtures/kotlin-app-variants/Form.kt +0 -47
  592. package/kotlin/fixtures/kotlin-app-variants/Icons.kt +0 -59
  593. package/kotlin/fixtures/kotlin-app-variants/Ime.kt +0 -53
  594. package/kotlin/fixtures/kotlin-app-variants/Lists.kt +0 -57
  595. package/kotlin/fixtures/kotlin-app-variants/Nav.kt +0 -47
  596. package/kotlin/fixtures/kotlin-app-variants/Note.kt +0 -40
  597. package/kotlin/fixtures/kotlin-app-variants/Overlays.kt +0 -56
  598. package/kotlin/fixtures/kotlin-app-variants/Pan.kt +0 -38
  599. package/kotlin/fixtures/kotlin-app-variants/Pickers.kt +0 -44
  600. package/kotlin/fixtures/kotlin-app-variants/Press.kt +0 -43
  601. package/kotlin/fixtures/kotlin-app-variants/Scroll.kt +0 -63
  602. package/kotlin/fixtures/kotlin-app-variants/Sheet.kt +0 -43
  603. package/kotlin/fixtures/kotlin-app-variants/Strings.kt +0 -49
  604. package/kotlin/fixtures/kotlin-app-variants/Tabs.kt +0 -47
  605. package/kotlin/fixtures/kotlin-app-variants/TextWidth.kt +0 -45
  606. package/kotlin/fixtures/kotlin-app-variants/TransientInsets.kt +0 -50
  607. package/kotlin/fixtures/kotlin-app-variants/Transition.kt +0 -69
  608. package/kotlin/fixtures/kotlin-app-variants/ViewConfig.kt +0 -22
  609. package/kotlin/fixtures/kotlin-app-variants/Widgets.kt +0 -67
  610. package/kotlin/fixtures/runtime-state/RuntimeState.kt +0 -200
  611. package/kotlin/fork/README.md +0 -97
  612. package/kotlin/fork/build.sh +0 -176
  613. package/kotlin/fork/compose-worker-globals.patch +0 -1247
  614. package/kotlin/fork/fork.json +0 -46
  615. package/kotlin/fork/publish.ts +0 -99
  616. package/kotlin/fork/skia-android-shaping.patch +0 -189
  617. package/kotlin/fork/skiko-local.init.gradle +0 -10
  618. package/kotlin/fork/skiko-worker-clock.patch +0 -122
@@ -13,6 +13,7 @@ import {
13
13
  SOOTSIM_BRIDGE_SIM_CLOSE_CODE,
14
14
  SOOTSIM_BRIDGE_SIM_CLOSE_REASON,
15
15
  } from '../bridge-constants.ts'
16
+ import { commandWritesSim, type WsCommand } from '../bridge-contract.ts'
16
17
  import { getCliVersion } from '../cli-version.ts'
17
18
  import { activeDesktopHostApp } from '../desktop-host-delivery.ts'
18
19
  import { handleExpoSwiftRequest } from '../expo-swift-host.ts'
@@ -69,7 +70,6 @@ import {
69
70
  handleWebSocketProxyUpgrade,
70
71
  rejectUntrustedBridgeUpgrade,
71
72
  } from './websocket-proxy.ts'
72
- import type { WsCommand } from '../bridge-contract.ts'
73
73
 
74
74
  const SOOTSIM_CROSS_ORIGIN_EMBEDDER_POLICY = 'require-corp'
75
75
 
@@ -197,22 +197,6 @@ interface BridgeCliLease {
197
197
  ownerSocket?: WebSocket
198
198
  }
199
199
 
200
- // interactive commands change app state and must respect the lease.
201
- // observational/lifecycle commands (evaluate/tree/query/resolve/screenshot/capture/focus/call/close)
202
- // pass through without taking or checking a lease so cleanup never gets stuck
203
- // behind a stale cli owner.
204
- // `call` used to acquire a lease too, but most call paths are queries
205
- // (`__sootsimTest.findByTestId`, state reads, etc.). the CLI opts write
206
- // calls into lease acquisition via msg.acquireLock=true.
207
- const WRITE_COMMAND_TYPES = new Set([
208
- 'tap',
209
- 'keyboard',
210
- 'longPress',
211
- 'perform',
212
- 'reset',
213
- 'camera',
214
- ])
215
-
216
200
  // how long a `close` waits for the sim page to tear itself down before the
217
201
  // host disconnects the sim socket. the close code is part of the protocol:
218
202
  // browser clients treat it as terminal and skip their normal reconnect loop.
@@ -223,13 +207,6 @@ const FORCE_CLOSE_TERMINATE_MS = 1000
223
207
  // type). a duplicate copy used to live here from a concurrent edit and
224
208
  // broke the standalone CLI esbuild bundle ("symbol already declared").
225
209
 
226
- function shouldAcquireLease(msg: any): boolean {
227
- if (!msg || typeof msg.type !== 'string') return false
228
- if (msg.acquireLock === true) return true
229
- if (msg.readOnly === true) return false
230
- return WRITE_COMMAND_TYPES.has(msg.type)
231
- }
232
-
233
210
  interface BridgeRestorableSimState {
234
211
  recentActions: BridgeRecentAction[]
235
212
  lastActiveAt: number
@@ -1075,7 +1052,7 @@ export class SootSimBridgeHost {
1075
1052
  }
1076
1053
 
1077
1054
  const targetSim = await this.waitForSim(msg.simId)
1078
- if (shouldAcquireLease(msg)) {
1055
+ if (commandWritesSim(msg)) {
1079
1056
  const outcome = this.tryAcquireLease(ws, targetSim)
1080
1057
  if (!outcome.granted) {
1081
1058
  if (ws.readyState === WebSocket.OPEN) {
@@ -1530,7 +1507,21 @@ export class SootSimBridgeHost {
1530
1507
  * non-upgrade routes that don't match serve index.html (SPA behavior) so
1531
1508
  * electron's webContents can navigate freely inside the runtime. */
1532
1509
  private handleHttpRequest(req: IncomingMessage, res: ServerResponse) {
1533
- if (rejectUntrustedBridgeOrigin(req, res)) return
1510
+ const method = (req.method || 'GET').toUpperCase()
1511
+ let url: URL
1512
+ try {
1513
+ url = new URL(req.url || '/', `http://${req.headers.host || 'localhost'}`)
1514
+ } catch {
1515
+ res.writeHead(400, { 'Content-Type': 'text/plain; charset=utf-8' })
1516
+ res.end('invalid request URL or host')
1517
+ return
1518
+ }
1519
+ const publicEngineFont =
1520
+ (method === 'GET' || method === 'HEAD') &&
1521
+ /^\/(?:runtime\/|sootsim\/)?engine\/fonts\/[^\\]*\.(ttf|otf|woff2?)$/.test(
1522
+ url.pathname,
1523
+ )
1524
+ if (!publicEngineFont && rejectUntrustedBridgeOrigin(req, res)) return
1534
1525
  if (req.url === '/__peach/fetch-transport') {
1535
1526
  res.writeHead(200, {
1536
1527
  'Content-Type': 'application/json',
@@ -1619,16 +1610,6 @@ export class SootSimBridgeHost {
1619
1610
  return
1620
1611
  }
1621
1612
 
1622
- const method = (req.method || 'GET').toUpperCase()
1623
- let url: URL
1624
- try {
1625
- url = new URL(req.url || '/', `http://${req.headers.host || 'localhost'}`)
1626
- } catch {
1627
- res.writeHead(400, { 'Content-Type': 'text/plain; charset=utf-8' })
1628
- res.end('invalid request URL or host')
1629
- return
1630
- }
1631
-
1632
1613
  // /__sootsim/shared-config is the one awaited HTTP write. ordinary
1633
1614
  // settings fan out over WS, but destructive reloads need confirmation
1634
1615
  // that the disk source of truth accepted their final reset first.
@@ -1972,6 +1953,8 @@ export class SootSimBridgeHost {
1972
1953
  res.writeHead(200, {
1973
1954
  'Content-Type': contentType,
1974
1955
  'Cache-Control': 'no-store',
1956
+ // native file documents have an opaque origin when reading public fonts.
1957
+ ...(publicEngineFont ? { 'Access-Control-Allow-Origin': '*' } : {}),
1975
1958
  })
1976
1959
  if (method === 'HEAD') {
1977
1960
  res.end()
@@ -2510,7 +2493,7 @@ export class SootSimBridgeHost {
2510
2493
  // called when the sim reports a real user interaction (pointerdown,
2511
2494
  // keydown, wheel, touch). creates or refreshes a short `user-active` lease
2512
2495
  // that keeps agent writes from trampling a user who is driving the sim.
2513
- // reads still pass through — shouldAcquireLease only blocks on writes.
2496
+ // reads still pass through — commandWritesSim only blocks on writes.
2514
2497
  private updateUserActivity(sim: BridgeSimConnection) {
2515
2498
  const existing = this.getActiveLease(sim)
2516
2499
  if (existing && existing.kind === 'cli') {
@@ -0,0 +1,71 @@
1
+ export interface BrowserPointerRequest {
2
+ phase: 'down' | 'move' | 'up' | 'cancel'
3
+ x: number
4
+ y: number
5
+ pointerId: number
6
+ }
7
+
8
+ // both browser hosts use chromium input so editable defaults and cross-origin
9
+ // iframe hit testing run in the browser, rather than simulated DOM events.
10
+ export function createBrowserPointerDispatcher(
11
+ send: (
12
+ method: 'Input.dispatchTouchEvent',
13
+ params: {
14
+ type: 'touchStart' | 'touchMove' | 'touchEnd' | 'touchCancel'
15
+ touchPoints: Array<{ x: number; y: number; id: number }>
16
+ },
17
+ ) => Promise<unknown>,
18
+ ) {
19
+ const points = new Map<number, { x: number; y: number; id: number }>()
20
+ return async (value: unknown): Promise<void> => {
21
+ if (!value || typeof value !== 'object') throw new Error('missing browser pointer')
22
+ const phase = Reflect.get(value, 'phase')
23
+ const x = Reflect.get(value, 'x')
24
+ const y = Reflect.get(value, 'y')
25
+ const pointerId = Reflect.get(value, 'pointerId')
26
+ if (phase !== 'down' && phase !== 'move' && phase !== 'up' && phase !== 'cancel')
27
+ throw new Error('invalid browser pointer phase')
28
+ if (
29
+ typeof x !== 'number' ||
30
+ !Number.isFinite(x) ||
31
+ typeof y !== 'number' ||
32
+ !Number.isFinite(y)
33
+ )
34
+ throw new Error('browser pointer coordinates must be finite')
35
+ if (
36
+ typeof pointerId !== 'number' ||
37
+ !Number.isSafeInteger(pointerId) ||
38
+ pointerId < 0
39
+ )
40
+ throw new Error('browser pointer id must be a nonnegative integer')
41
+ const request: BrowserPointerRequest = { phase, x, y, pointerId }
42
+ if (request.phase === 'down') {
43
+ if (points.has(request.pointerId)) throw new Error('browser pointer already down')
44
+ points.set(request.pointerId, { x: request.x, y: request.y, id: request.pointerId })
45
+ } else {
46
+ // chromium cancels the entire touch stream at once; the caller still
47
+ // releases each bound pointer while unwinding a multi-touch gesture.
48
+ if (request.phase === 'cancel' && points.size === 0) return
49
+ if (!points.has(request.pointerId)) throw new Error('browser pointer is not down')
50
+ if (request.phase === 'move')
51
+ points.set(request.pointerId, {
52
+ x: request.x,
53
+ y: request.y,
54
+ id: request.pointerId,
55
+ })
56
+ else if (request.phase === 'cancel') points.clear()
57
+ else points.delete(request.pointerId)
58
+ }
59
+ await send('Input.dispatchTouchEvent', {
60
+ type:
61
+ request.phase === 'down'
62
+ ? 'touchStart'
63
+ : request.phase === 'move'
64
+ ? 'touchMove'
65
+ : request.phase === 'up'
66
+ ? 'touchEnd'
67
+ : 'touchCancel',
68
+ touchPoints: [...points.values()],
69
+ })
70
+ }
71
+ }
@@ -0,0 +1,23 @@
1
+ import fs from 'fs'
2
+ import path from 'path'
3
+ import { readInstalledNativePackageVersionsAsync } from '../installed-package-versions.ts'
4
+ import { resolveMetroProjectRoot } from '../metro-project-root.ts'
5
+ import type { PackageVersions } from '../packageVersionsContract'
6
+
7
+ // a plain Metro or Expo dev server records no installed versions in its
8
+ // bundle. the bridge serving that bundle reads them from the project the
9
+ // server names, the way `peach open` reads its own project. a server that
10
+ // names no project, or one whose project is not on this machine, gets none.
11
+ export async function readDevServerPackageVersions(
12
+ bundleUrl: URL,
13
+ ): Promise<PackageVersions | null> {
14
+ if (!bundleUrl.pathname.endsWith('.bundle')) return null
15
+ const projectRoot = await resolveMetroProjectRoot(bundleUrl.href)
16
+ if (!projectRoot) return null
17
+ try {
18
+ await fs.promises.access(path.join(projectRoot, 'package.json'))
19
+ } catch {
20
+ return null
21
+ }
22
+ return readInstalledNativePackageVersionsAsync(projectRoot)
23
+ }
@@ -33,6 +33,8 @@ import {
33
33
  isTrustedBridgeRequest,
34
34
  normalizeHostname,
35
35
  } from '../backend-origin.ts'
36
+ import { PACKAGE_VERSIONS_HEADER } from '../packageVersionsContract'
37
+ import { readDevServerPackageVersions } from './dev-server-package-versions.ts'
36
38
  import {
37
39
  buildFetchProxyUpstreamHeaders,
38
40
  FETCH_PROXY_FAILURE_HEADER,
@@ -218,7 +220,7 @@ export async function handleFetchProxyRequest(
218
220
 
219
221
  await proxyUpstream(req, res, upstreamUrl, params.has(FETCH_PROXY_FAILURE_PARAM), {
220
222
  requestHeaders: (target) => buildFetchProxyHeaders(req.headers, target),
221
- respond: (upstream, setCookies) => {
223
+ respond: async (upstream, setCookies) => {
222
224
  for (const [key, value] of Object.entries(upstream.headers)) {
223
225
  const lowerKey = key.toLowerCase()
224
226
  if (
@@ -240,6 +242,17 @@ export async function handleFetchProxyRequest(
240
242
  }
241
243
  res.setHeader(key, value)
242
244
  }
245
+ // a bundle whose server records no install gets the one its project holds
246
+ if (
247
+ isBundleProxyRequestUrl(req.url) &&
248
+ req.method === 'GET' &&
249
+ upstream.statusCode === 200 &&
250
+ !res.hasHeader(PACKAGE_VERSIONS_HEADER)
251
+ ) {
252
+ const packageVersions = await readDevServerPackageVersions(upstreamUrl)
253
+ if (packageVersions)
254
+ res.setHeader(PACKAGE_VERSIONS_HEADER, JSON.stringify(packageVersions))
255
+ }
243
256
  applyFetchProxyCors(req, res)
244
257
  if (setCookies.length > 0)
245
258
  res.setHeader('x-sootsim-set-cookie', setCookies.join(', '))
@@ -345,7 +358,7 @@ async function proxyUpstream(
345
358
  reportFailure: boolean,
346
359
  route: {
347
360
  requestHeaders: (targetUrl: URL) => Record<string, string | string[]>
348
- respond: (upstream: IncomingMessage, setCookies: string[]) => void
361
+ respond: (upstream: IncomingMessage, setCookies: string[]) => void | Promise<void>
349
362
  },
350
363
  ): Promise<void> {
351
364
  const originalMethod = req.method || 'GET'
@@ -444,7 +457,7 @@ async function proxyUpstream(
444
457
  redirectLimit: 10,
445
458
  }
446
459
  res.setHeader(FETCH_PROXY_NATIVE_COOKIE_RESPONSE_HEADER, nativeCookieHopHeader(hop))
447
- route.respond(proxyRes, hopCookies)
460
+ await route.respond(proxyRes, hopCookies)
448
461
  if (isNativeCookieRedirect(hop)) res.removeHeader('location')
449
462
  res.statusCode = isNativeCookieRedirect(hop) ? 200 : status
450
463
  await pipeline(proxyRes, res)
@@ -479,7 +492,7 @@ async function proxyUpstream(
479
492
  }
480
493
 
481
494
  if (redirects > 0) res.setHeader(FETCH_PROXY_RESPONSE_URL_HEADER, targetUrl.href)
482
- route.respond(proxyRes, hopCookies)
495
+ await route.respond(proxyRes, hopCookies)
483
496
  res.statusCode = status
484
497
  await pipeline(proxyRes, res)
485
498
  }
@@ -51,11 +51,21 @@ export function stageHostBytes(
51
51
  origin: string,
52
52
  extension = '',
53
53
  ): string {
54
- const digest = createHash('sha256').update(bytes).digest('hex')
55
- extension = extension.toLowerCase()
56
- const name = STAGED_NAME.test(digest + extension) ? digest + extension : digest
54
+ const directory = prepareStagedDirectory()
55
+ return writeStagedBytes(bytes, origin, extension, directory)
56
+ }
57
+
58
+ // a resource pack prunes once, rather than scanning the cache for every file.
59
+ export function stageHostByteFiles(
60
+ files: readonly Uint8Array[],
61
+ origin: string,
62
+ ): string[] {
63
+ const directory = prepareStagedDirectory()
64
+ return files.map((bytes) => writeStagedBytes(bytes, origin, '', directory))
65
+ }
66
+
67
+ function prepareStagedDirectory(): string {
57
68
  const directory = stagedDir()
58
- const destination = path.join(directory, name)
59
69
  fs.mkdirSync(directory, { recursive: true })
60
70
  const now = Date.now()
61
71
  for (const entry of fs.readdirSync(directory, { withFileTypes: true })) {
@@ -63,6 +73,20 @@ export function stageHostBytes(
63
73
  if (entry.isFile() && now - fs.statSync(stale).mtimeMs > STAGED_RETENTION_MS)
64
74
  fs.rmSync(stale, { force: true })
65
75
  }
76
+ return directory
77
+ }
78
+
79
+ function writeStagedBytes(
80
+ bytes: Uint8Array,
81
+ origin: string,
82
+ extension: string,
83
+ directory: string,
84
+ ): string {
85
+ const digest = createHash('sha256').update(bytes).digest('hex')
86
+ extension = extension.toLowerCase()
87
+ const name = STAGED_NAME.test(digest + extension) ? digest + extension : digest
88
+ const destination = path.join(directory, name)
89
+ const now = Date.now()
66
90
  if (fs.existsSync(destination)) {
67
91
  fs.utimesSync(destination, new Date(now), new Date(now))
68
92
  } else {
@@ -2,38 +2,144 @@
2
2
  // compiles a package's native side from the copy autolinking finds, which is
3
3
  // Node resolution from the project root, so that is the copy read here even
4
4
  // when the graph also bundles a nested one.
5
+ //
6
+ // each walk yields the file system reads it needs. the sync driver answers
7
+ // them for one-shot callers; the async one for servers that must keep
8
+ // answering other requests while a large workspace is read.
5
9
 
6
10
  import fs from 'fs'
7
11
  import path from 'path'
8
12
  import { LAZY_STUB_PATTERNS } from '@peach/compat/lazy-stub-patterns'
9
13
  import { NATIVE_RUNTIME_PACKAGE_NAMES } from '@peach/compat/native-package-names'
10
14
  import { COMPAT_STUBS } from '@peach/compat/stub-manifest'
11
- import { extractPackageFromPath } from '../../peach-engine/src/stub-pattern-matcher'
15
+ import { extractPackageFromPath } from './stub-pattern-matcher.ts'
12
16
  import type { PackageVersions } from './packageVersionsContract'
13
17
 
14
- function readInstalledPackage(projectRoot: string, name: string) {
15
- let dir = projectRoot
16
- for (;;) {
17
- let manifest: unknown
18
- try {
19
- manifest = JSON.parse(
20
- fs.readFileSync(path.join(dir, 'node_modules', name, 'package.json'), 'utf8'),
21
- )
22
- } catch (error) {
23
- if (!(error instanceof Error && 'code' in error && error.code === 'ENOENT')) {
24
- throw error
18
+ type InstalledPackage = { root: string; manifest: object }
19
+
20
+ type FsStep =
21
+ | { op: 'exists'; path: string }
22
+ | { op: 'realpath'; path: string }
23
+ // the parsed package.json, or null when there is none or it is not an object
24
+ | { op: 'manifest'; path: string }
25
+ type FsAnswer = boolean | string | object | null
26
+ type FsWalk<T> = Generator<FsStep, T, FsAnswer>
27
+
28
+ function* exists(target: string): FsWalk<boolean> {
29
+ return (yield { op: 'exists', path: target }) === true
30
+ }
31
+
32
+ function* realpath(target: string): FsWalk<string> {
33
+ const resolved = yield { op: 'realpath', path: target }
34
+ if (typeof resolved !== 'string') throw new Error(`could not resolve ${target}`)
35
+ return resolved
36
+ }
37
+
38
+ function* readManifest(target: string): FsWalk<object | null> {
39
+ const manifest = yield { op: 'manifest', path: target }
40
+ return typeof manifest === 'object' ? manifest : null
41
+ }
42
+
43
+ function parseManifest(source: string): object | null {
44
+ const manifest: unknown = JSON.parse(source)
45
+ return typeof manifest === 'object' && manifest !== null ? manifest : null
46
+ }
47
+
48
+ function isMissing(error: unknown): boolean {
49
+ return error instanceof Error && 'code' in error && error.code === 'ENOENT'
50
+ }
51
+
52
+ function answerSync(step: FsStep): FsAnswer {
53
+ if (step.op === 'exists') return fs.existsSync(step.path)
54
+ if (step.op === 'realpath') return fs.realpathSync(step.path)
55
+ try {
56
+ return parseManifest(fs.readFileSync(step.path, 'utf8'))
57
+ } catch (error) {
58
+ if (isMissing(error)) return null
59
+ throw error
60
+ }
61
+ }
62
+
63
+ async function answerAsync(step: FsStep): Promise<FsAnswer> {
64
+ if (step.op === 'exists')
65
+ return fs.promises.access(step.path).then(
66
+ () => true,
67
+ () => false,
68
+ )
69
+ if (step.op === 'realpath') return fs.promises.realpath(step.path)
70
+ try {
71
+ return parseManifest(await fs.promises.readFile(step.path, 'utf8'))
72
+ } catch (error) {
73
+ if (isMissing(error)) return null
74
+ throw error
75
+ }
76
+ }
77
+
78
+ function runSync<T>(walk: FsWalk<T>): T {
79
+ for (let step = walk.next(); ; ) {
80
+ if (step.done) return step.value
81
+ step = walk.next(answerSync(step.value))
82
+ }
83
+ }
84
+
85
+ async function runAsync<T>(walk: FsWalk<T>): Promise<T> {
86
+ for (let step = walk.next(); ; ) {
87
+ if (step.done) return step.value
88
+ step = walk.next(await answerAsync(step.value))
89
+ }
90
+ }
91
+
92
+ // Node resolution looks in each ancestor's node_modules, skipping directories
93
+ // that are themselves node_modules. one walk asks the same ancestors for many
94
+ // names, so each directory's node_modules is checked once and each manifest
95
+ // read once.
96
+ function createInstalledPackageReader() {
97
+ const hasModules = new Map<string, boolean>()
98
+ const manifests = new Map<string, InstalledPackage | null>()
99
+ return function* readInstalledPackage(
100
+ fromDir: string,
101
+ name: string,
102
+ ): FsWalk<InstalledPackage | null> {
103
+ for (let dir = fromDir; ; ) {
104
+ if (path.basename(dir) !== 'node_modules') {
105
+ const modules = path.join(dir, 'node_modules')
106
+ let present = hasModules.get(dir)
107
+ if (present === undefined) {
108
+ present = yield* exists(modules)
109
+ hasModules.set(dir, present)
110
+ }
111
+ if (present) {
112
+ const root = path.join(modules, name)
113
+ let installed = manifests.get(root)
114
+ if (installed === undefined) {
115
+ const manifest = yield* readManifest(path.join(root, 'package.json'))
116
+ installed = manifest ? { root, manifest } : null
117
+ manifests.set(root, installed)
118
+ }
119
+ if (installed) return installed
120
+ }
25
121
  }
26
122
  const parent = path.dirname(dir)
27
123
  if (parent === dir) return null
28
124
  dir = parent
29
- continue
30
125
  }
31
- return typeof manifest === 'object' && manifest !== null
32
- ? { root: path.join(dir, 'node_modules', name), manifest }
33
- : null
34
126
  }
35
127
  }
36
128
 
129
+ function* installedVersionsWalk(
130
+ projectRoot: string,
131
+ names: Iterable<string>,
132
+ ): FsWalk<PackageVersions> {
133
+ const readInstalledPackage = createInstalledPackageReader()
134
+ const versions: PackageVersions = {}
135
+ for (const name of [...names].sort()) {
136
+ const installed = yield* readInstalledPackage(projectRoot, name)
137
+ const version = installed && Reflect.get(installed.manifest, 'version')
138
+ if (typeof version === 'string' && version.length > 0) versions[name] = version
139
+ }
140
+ return versions
141
+ }
142
+
37
143
  export function readInstalledPackageVersions(
38
144
  projectRoot: string,
39
145
  modulePaths: Iterable<string>,
@@ -43,20 +149,14 @@ export function readInstalledPackageVersions(
43
149
  const name = extractPackageFromPath(modulePath.replaceAll(path.sep, '/'))
44
150
  if (name) names.add(name)
45
151
  }
46
- const versions: PackageVersions = {}
47
- for (const name of [...names].sort()) {
48
- const installed = readInstalledPackage(projectRoot, name)
49
- const version = installed && Reflect.get(installed.manifest, 'version')
50
- if (typeof version === 'string' && version.length > 0) versions[name] = version
51
- }
52
- return versions
152
+ return runSync(installedVersionsWalk(projectRoot, names))
53
153
  }
54
154
 
55
155
  // plain expo and one servers need no peach plugin. the launcher reads their
56
156
  // installed native packages from the app's dependency graph. an unrelated
57
157
  // package hoisted beside a workspace app is resolvable but is not linked.
58
- export function readInstalledNativePackageVersions(projectRoot: string): PackageVersions {
59
- const appRoot = fs.realpathSync(projectRoot)
158
+ function* nativePackageVersionsWalk(projectRoot: string): FsWalk<PackageVersions> {
159
+ const appRoot = yield* realpath(projectRoot)
60
160
  const nativeNames = new Set<string>()
61
161
  for (const specifier of [
62
162
  'react-native',
@@ -67,17 +167,14 @@ export function readInstalledNativePackageVersions(projectRoot: string): Package
67
167
  const name = extractPackageFromPath(`node_modules/${specifier}`)
68
168
  if (name) nativeNames.add(name)
69
169
  }
70
- const manifest: unknown = JSON.parse(
71
- fs.readFileSync(path.join(appRoot, 'package.json'), 'utf8'),
72
- )
73
- if (typeof manifest !== 'object' || manifest === null) {
74
- throw new Error('app package.json must contain an object')
75
- }
76
- const pending = [{ root: appRoot, manifest }]
170
+ const manifest = yield* readManifest(path.join(appRoot, 'package.json'))
171
+ if (!manifest) throw new Error('app package.json must contain an object')
172
+ const readInstalledPackage = createInstalledPackageReader()
173
+ const pending: InstalledPackage[] = [{ root: appRoot, manifest }]
77
174
  const visited = new Set<string>()
78
175
  const needed = new Set<string>()
79
176
  for (let next = pending.pop(); next; next = pending.pop()) {
80
- const root = fs.realpathSync(next.root)
177
+ const root = yield* realpath(next.root)
81
178
  if (visited.has(root)) continue
82
179
  visited.add(root)
83
180
  const fields = ['dependencies', 'optionalDependencies', 'peerDependencies']
@@ -92,15 +189,22 @@ export function readInstalledNativePackageVersions(projectRoot: string): Package
92
189
  if (typeof peer === 'object' && peer !== null && Reflect.get(peer, 'optional'))
93
190
  continue
94
191
  }
95
- const installed = readInstalledPackage(root, name)
192
+ const installed = yield* readInstalledPackage(root, name)
96
193
  if (!installed) continue
97
194
  if (nativeNames.has(name)) needed.add(name)
98
195
  pending.push(installed)
99
196
  }
100
197
  }
101
198
  }
102
- return readInstalledPackageVersions(
103
- projectRoot,
104
- [...needed].map((specifier) => `node_modules/${specifier}`),
105
- )
199
+ return yield* installedVersionsWalk(projectRoot, needed)
200
+ }
201
+
202
+ export function readInstalledNativePackageVersions(projectRoot: string): PackageVersions {
203
+ return runSync(nativePackageVersionsWalk(projectRoot))
204
+ }
205
+
206
+ export function readInstalledNativePackageVersionsAsync(
207
+ projectRoot: string,
208
+ ): Promise<PackageVersions> {
209
+ return runAsync(nativePackageVersionsWalk(projectRoot))
106
210
  }
@@ -325,7 +325,7 @@ function entrySource(ids: string[]): string {
325
325
  '@JsExport',
326
326
  'fun peachSetAndroidBuildInfo(model: String, release: String) = Build.setDevice(model, release)',
327
327
  '',
328
- '@OptIn(kotlin.js.ExperimentalJsExport::class, kotlin.js.ExperimentalWasmJsInterop::class, kotlinx.coroutines.DelicateCoroutinesApi::class)',
328
+ '@OptIn(kotlin.js.ExperimentalJsExport::class, kotlinx.coroutines.DelicateCoroutinesApi::class)',
329
329
  '@JsExport',
330
330
  'fun peachNativeCall(module: String, method: String, argsJson: String, contractHash: String): Promise<JsAny?> =',
331
331
  ' GlobalScope.promise(Dispatchers.Main) {',
@@ -6,6 +6,7 @@ export const LAUNCH_METADATA_KEYS: readonly string[] = [
6
6
  'appFonts',
7
7
  'appSplash',
8
8
  'appCatalog',
9
+ 'appBundleResources',
9
10
  'nativeAppIdentity',
10
11
  'nativeFirebase',
11
12
  'appManifest',
package/src/menu.ts CHANGED
@@ -71,7 +71,13 @@ export const SOOTSIM_RENDER_RESOLUTION_LABELS: Record<SootSimRenderResolution, s
71
71
  // engine's wireframe store draws. 'wireframe' is the clean structural sketch;
72
72
  // the others are its screen-space styles that ship as named effects.
73
73
  export type SootSimScreenEffect = 'none' | 'wireframe' | 'blueprint' | 'panel' | 'green'
74
- export const SOOTSIM_SCREEN_EFFECTS = ['none', 'wireframe', 'blueprint', 'panel', 'green'] as const
74
+ export const SOOTSIM_SCREEN_EFFECTS = [
75
+ 'none',
76
+ 'wireframe',
77
+ 'blueprint',
78
+ 'panel',
79
+ 'green',
80
+ ] as const
75
81
 
76
82
  export function isSootSimScreenEffect(value: unknown): value is SootSimScreenEffect {
77
83
  return (
@@ -373,9 +379,9 @@ function deviceMenu(
373
379
  },
374
380
  { type: 'separator' },
375
381
  { label: 'Trigger Screenshot', action: 'screenshot' },
376
- // pose controls for the current device: open/close on foldables,
377
- // rotate left/right wherever a turn changes geometry, the way ios
378
- // simulator holds them (rotate left is cmd+left, rotate right
382
+ // pose controls for the current device: open/close, book and laptop on
383
+ // foldables, rotate left/right wherever a turn changes geometry, the way
384
+ // ios simulator holds them (rotate left is cmd+left, rotate right
379
385
  // cmd+right). truthiness, not !== null: a partial state must hide
380
386
  // these, never show duo items for the wrong device.
381
387
  ...(state.devicePosture || state.canRotate
@@ -390,6 +396,8 @@ function deviceMenu(
390
396
  : 'Open iPhone Duo',
391
397
  action: 'toggle-duo-posture',
392
398
  },
399
+ { label: 'Book Pose', action: 'fold-duo-book' },
400
+ { label: 'Laptop Pose', action: 'fold-duo-laptop' },
393
401
  ]
394
402
  : []),
395
403
  ...(state.canRotate
@@ -12,10 +12,6 @@ import fs from 'fs'
12
12
  import { createRequire } from 'module'
13
13
  import { randomUUID } from 'node:crypto'
14
14
  import path from 'path'
15
- import {
16
- getRuntimePlatformAdapter,
17
- isRuntimePlatform,
18
- } from '../../peach-engine/src/platform/adapter'
19
15
  import { resolveAppProject } from '../cli/app-project'
20
16
  import { collectAndroidAutolinkedPackages } from './android-autolinking'
21
17
  import { insertAndroidAutolinkingFooter } from './androidAutolinkingContract'
@@ -51,6 +47,10 @@ import {
51
47
  serveRuntimeFile,
52
48
  SOOTSIM_RUNTIME_MISSING_MESSAGE,
53
49
  } from './runtime-assets'
50
+ import {
51
+ getRuntimePlatformAdapter,
52
+ isRuntimePlatform,
53
+ } from './runtimePlatformContract.ts'
54
54
 
55
55
  const prefix = '/__peachsim'
56
56
  export { toPeachDevelopmentBundleUrl, toPeachProductionBundleUrl }