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
@@ -1,3 +1,5 @@
1
+ import { createHash, randomUUID } from 'crypto'
2
+ import { readFileSync, rmSync } from 'fs'
1
3
  // peach record upload — publish a recording from a running simulator. scene
2
4
  // recordings carry their own content identity; --live-bundle adds the app
3
5
  // bundle for interactive playback under the existing bundle identity.
@@ -7,44 +9,19 @@
7
9
  // owner turns on Public link from the preview page's share menu. uploads
8
10
  // require a signed-in desktop session or an api key so the share is
9
11
  // associated with the user's account.
10
-
11
- import { createHash, randomUUID } from 'crypto'
12
- import { readFileSync, rmSync } from 'fs'
13
12
  import { tmpdir } from 'os'
14
13
  import path from 'path'
15
14
  import { gzipSync, gunzipSync } from 'zlib'
16
15
  import { readProfileTrace } from '@peach/globals/profile-trace'
17
16
  import { toProfileFile, type ProfileFile } from '@peach/globals/profiler'
18
- import { resolveAppFontsWire } from 'peach-engine/engine/config-plugin-fonts'
19
- import { shouldCompress } from 'peach-engine/preview/compress'
20
- import { brotliBundle } from 'peach-engine/preview/compress-node'
21
- import {
22
- canonicalPublicPreviewOrigin,
23
- runPresignedUpload,
24
- type InitRequestBody,
25
- } from 'peach-engine/preview/presigned-upload'
26
- import {
27
- hasShareableStorage,
28
- type ShareableStorageSnapshot,
29
- } from 'peach-engine/preview/storage-snapshot-contract'
30
- import {
31
- TRACE_CAPTURE_POSTROLL_MS,
32
- TRACE_CAPTURE_PREROLL_MS,
33
- isTraceTimelineEvent,
34
- parseTraceTimelineJsonl,
35
- } from 'peach-engine/preview/trace'
36
- import {
37
- mergeProfileTimeline,
38
- profileFrameSummary,
39
- } from 'peach-engine/profiler/profile-trace'
40
- import { readSceneRecordingUpload } from 'peach-engine/remote-stream/scene-recording'
41
- import {
42
- resolvedExpoAppIconUrl,
43
- expoConfigFromManifest,
44
- } from '../../../peach-engine/src/engine/expo-manifest'
45
17
  import { loopbackOriginOf } from '../../src/backend-origin'
18
+ import { getCliRuntime } from '../../src/cli-runtime.ts'
46
19
  import { parseExpoManifestBody } from '../../src/expo-manifest-body'
47
20
  import { rnxPublicBrand } from '../../src/public-brand'
21
+ import {
22
+ hasShareableStorage,
23
+ ShareableStorageSnapshot,
24
+ } from '../../src/storageSnapshotContract.ts'
48
25
  import { fetchAppFontFiles } from '../app-fonts'
49
26
  import { fetchAppSplashImages } from '../app-splash'
50
27
  import { authHeaderValue, githubUploadIdentity, resolveCliAuth } from '../auth'
@@ -59,8 +36,9 @@ import {
59
36
  evalInBridge,
60
37
  parseBridgeCliArgs,
61
38
  } from '../ws-bridge'
39
+ import type { BundleSnapshot } from '#peach-cli-contract/preview/capture-bundle'
40
+ import type { InitRequestBody } from '#peach-cli-contract/preview/presigned-upload'
62
41
  import type { SootSimTimelineEvent } from '@peach/globals'
63
- import type { BundleSnapshot } from 'peach-engine/preview/capture-bundle'
64
42
 
65
43
  interface UploadOptions {
66
44
  port?: number
@@ -375,9 +353,13 @@ function traceTimelineQuery(args: {
375
353
  }): { since?: number; until?: number; limit: number } {
376
354
  if (args.recordedDurationMs && args.recordingStartedAtMs) {
377
355
  return {
378
- since: args.recordingStartedAtMs - TRACE_CAPTURE_PREROLL_MS,
356
+ since:
357
+ args.recordingStartedAtMs -
358
+ getCliRuntime().preview_trace.TRACE_CAPTURE_PREROLL_MS,
379
359
  until:
380
- args.recordingStartedAtMs + args.recordedDurationMs + TRACE_CAPTURE_POSTROLL_MS,
360
+ args.recordingStartedAtMs +
361
+ args.recordedDurationMs +
362
+ getCliRuntime().preview_trace.TRACE_CAPTURE_POSTROLL_MS,
381
363
  limit: 2000,
382
364
  }
383
365
  }
@@ -388,7 +370,7 @@ function readTraceTimelineEventsFile(filePath: string): SootSimTimelineEvent[] {
388
370
  const bytes = readFileSync(filePath)
389
371
  const isGzip = bytes[0] === 0x1f && bytes[1] === 0x8b
390
372
  const text = (isGzip ? gunzipSync(bytes) : bytes).toString('utf8')
391
- return parseTraceTimelineJsonl(text)
373
+ return getCliRuntime().preview_trace.parseTraceTimelineJsonl(text)
392
374
  }
393
375
 
394
376
  async function readTraceProfileFile(filePath: string): Promise<ProfileFile> {
@@ -693,14 +675,17 @@ export async function runUpload(
693
675
  : []
694
676
  traceTimelineEvents = [
695
677
  ...traceTimelineEvents,
696
- ...timelineEvents.filter(isTraceTimelineEvent),
678
+ ...timelineEvents.filter(getCliRuntime().preview_trace.isTraceTimelineEvent),
697
679
  ].sort((a, b) => a.t - b.t || a.seq - b.seq)
698
680
  } finally {
699
681
  bridge.close()
700
682
  }
701
683
 
702
684
  if (traceProfile)
703
- traceTimelineEvents = mergeProfileTimeline(traceTimelineEvents, traceProfile)
685
+ traceTimelineEvents = getCliRuntime().profiler_profile_trace.mergeProfileTimeline(
686
+ traceTimelineEvents,
687
+ traceProfile,
688
+ )
704
689
 
705
690
  if (!snapshot) {
706
691
  console.error(
@@ -881,7 +866,10 @@ export async function runUpload(
881
866
  let sceneStream: InitRequestBody['sceneStream']
882
867
  if (scenePath) {
883
868
  sceneBytes = readFileSync(scenePath)
884
- const { header, slot } = await readSceneRecordingUpload(sceneBytes)
869
+ const { header, slot } =
870
+ await getCliRuntime().remote_stream_scene_recording.readSceneRecordingUpload(
871
+ sceneBytes,
872
+ )
885
873
  sceneStream = slot
886
874
  console.log(
887
875
  ` attaching scene stream: ${(sceneBytes.byteLength / 1024).toFixed(1)} KiB, ${header.frameCount} frames over ${Math.round(header.durationMs)}ms`,
@@ -949,7 +937,7 @@ export async function runUpload(
949
937
  responseHeaders?: Array<{ name: string; value: string }>,
950
938
  requestVaryHash?: string,
951
939
  ): PreparedFile => {
952
- const compress = shouldCompress(contentType)
940
+ const compress = getCliRuntime().preview_compress.shouldCompress(contentType)
953
941
  const bytes = compress ? gzipSync(raw) : raw
954
942
  return {
955
943
  url,
@@ -972,7 +960,10 @@ export async function runUpload(
972
960
  // pipelines store identical bytes keyed by sha256(url).
973
961
  const appFontFiles: PreparedFile[] = []
974
962
  const appFontsWire = hasBundle
975
- ? await resolveAppFontsWire(appFontsWireFromPageHref(snapshot.pageHref), fetch)
963
+ ? await getCliRuntime().engine_config_plugin_fonts.resolveAppFontsWire(
964
+ appFontsWireFromPageHref(snapshot.pageHref),
965
+ fetch,
966
+ )
976
967
  : ''
977
968
  if (appFontsWire) {
978
969
  const fonts = await fetchAppFontFiles(appFontsWire, {
@@ -1043,7 +1034,7 @@ export async function runUpload(
1043
1034
  })
1044
1035
  if (response.ok && !response.headers.get('content-type')?.includes('html')) {
1045
1036
  const manifest: unknown = parseExpoManifestBody(await response.text())
1046
- const config = expoConfigFromManifest(manifest)
1037
+ const config = getCliRuntime().engine_expo_manifest.expoConfigFromManifest(manifest)
1047
1038
  if (config) {
1048
1039
  appManifest = manifestUrl
1049
1040
  appIdentityFiles.push(
@@ -1056,7 +1047,11 @@ export async function runUpload(
1056
1047
  'application/json',
1057
1048
  ),
1058
1049
  )
1059
- const iconUrl = resolvedExpoAppIconUrl(config, platform, snapshot.bundleUrl)
1050
+ const iconUrl = getCliRuntime().engine_expo_manifest.resolvedExpoAppIconUrl(
1051
+ config,
1052
+ platform,
1053
+ snapshot.bundleUrl,
1054
+ )
1060
1055
  if (iconUrl) {
1061
1056
  try {
1062
1057
  const icon = await fetch(iconUrl, { signal: AbortSignal.timeout(30_000) })
@@ -1116,7 +1111,9 @@ export async function runUpload(
1116
1111
  // brotli source bytes for the upload. finalize verifies the source hash,
1117
1112
  // minifies in the node build container, and stores one canonical brotli
1118
1113
  // bundle. assets stay gzip below.
1119
- const bundleBr = bundleBytes ? brotliBundle(bundleBytes) : undefined
1114
+ const bundleBr = bundleBytes
1115
+ ? getCliRuntime().preview_compress_node.brotliBundle(bundleBytes)
1116
+ : undefined
1120
1117
  const identityBytes = bundleBytes ?? sceneBytes
1121
1118
  if (!identityBytes) throw new Error('upload requires a bundle or scene recording')
1122
1119
  const contentHash = createHash('sha256').update(identityBytes).digest('hex')
@@ -1181,7 +1178,9 @@ export async function runUpload(
1181
1178
  storage: storageGz
1182
1179
  ? { sizeBytes: storageGz.byteLength, encoding: 'gzip' }
1183
1180
  : undefined,
1184
- traceFrameStats: traceProfile ? profileFrameSummary(traceProfile) : undefined,
1181
+ traceFrameStats: traceProfile
1182
+ ? getCliRuntime().profiler_profile_trace.profileFrameSummary(traceProfile)
1183
+ : undefined,
1185
1184
  recordedDurationMs,
1186
1185
  recordingStartedAtMs,
1187
1186
  capture,
@@ -1250,7 +1249,7 @@ export async function runUpload(
1250
1249
 
1251
1250
  let finalize
1252
1251
  try {
1253
- const result = await runPresignedUpload({
1252
+ const result = await getCliRuntime().preview_presigned_upload.runPresignedUpload({
1254
1253
  originBase: origin,
1255
1254
  initBody,
1256
1255
  bundleBytes: bundleBr,
@@ -1308,7 +1307,7 @@ export async function runUpload(
1308
1307
  peachExit(1, message)
1309
1308
  }
1310
1309
 
1311
- const previewUrl = `${canonicalPublicPreviewOrigin(publicOrigin)}${finalize.url}`
1310
+ const previewUrl = `${getCliRuntime().preview_presigned_upload.canonicalPublicPreviewOrigin(publicOrigin)}${finalize.url}`
1312
1311
  console.log(`\n stored ${finalize.filesStored ?? 0} extra files`)
1313
1312
  console.log(` preview: ${previewUrl}`)
1314
1313
 
@@ -191,6 +191,7 @@ export function readCurrentTarget(): LocalCurrentTarget | null {
191
191
  rmSync(filepath, { force: true })
192
192
  return null
193
193
  }
194
+ if (Reflect.get(parsed, 'pendingOpen') === true) return null
194
195
  const version = Reflect.get(parsed, 'version')
195
196
  const plane = Reflect.get(parsed, 'plane')
196
197
  const simId = Reflect.get(parsed, 'simId')
@@ -241,3 +242,40 @@ export function saveCurrentSimId(simId: string) {
241
242
  export function clearCurrentSimId() {
242
243
  rmSync(getCurrentSimPath(), { force: true })
243
244
  }
245
+
246
+ // `peach open` has started choosing a new target and none is pinned yet. the
247
+ // mark holds until a successful open/use pins a sim or the pin is cleared, so
248
+ // a failed open cannot hand later mutating commands to whichever other tab the
249
+ // bridge happens to hold.
250
+ export function markOpenPending() {
251
+ writeSecureJsonAtomic(getCurrentSimPath(), {
252
+ version: CURRENT_SIM_VERSION,
253
+ plane: 'local',
254
+ pendingOpen: true,
255
+ updatedAt: new Date().toISOString(),
256
+ })
257
+ }
258
+
259
+ // refuses a command that would choose its own sim while an open is pending.
260
+ // callers pass it only for commands with no sim the user named.
261
+ export function assertNoPendingOpen() {
262
+ if (!isOpenPending()) return
263
+ throw new Error(
264
+ 'the last `peach open` did not pin a sim, so this command would land on whichever tab is connected. run `peach open` again, `peach use <sim>`, or pass --sim <id>',
265
+ )
266
+ }
267
+
268
+ function isOpenPending(): boolean {
269
+ const filepath = getCurrentSimPath()
270
+ if (!existsSync(filepath)) return false
271
+ try {
272
+ const parsed: unknown = JSON.parse(readFileSync(filepath, 'utf8'))
273
+ return (
274
+ parsed !== null &&
275
+ typeof parsed === 'object' &&
276
+ Reflect.get(parsed, 'pendingOpen') === true
277
+ )
278
+ } catch {
279
+ return false
280
+ }
281
+ }
@@ -134,12 +134,15 @@ function retiredElectronApps(): string[] {
134
134
  }
135
135
 
136
136
  // existing Electron apps stay on disk; CLI users receive the migration once.
137
- // the notice names those apps and does not reject a native host beside them.
137
+ // the notice names those apps and does not reject a native host beside them;
138
+ // it recommends installing only when no native host is selected and present.
138
139
  export function notifyDesktopMigration(): void {
139
140
  if (process.platform !== 'darwin' && process.platform !== 'linux') return
140
141
  const legacy = retiredElectronApps()
141
142
  const marker = join(rnxHomeDir(), 'electron-native-migration')
142
143
  if (legacy.length === 0 || existsSync(marker)) return
144
+ const nativeApp = nativeDesktopOverrideError() ? null : getNativeDesktopAppPath()
145
+ const nativeReady = nativeApp !== null && existsSync(nativeExecutable(nativeApp))
143
146
  mkdirSync(rnxHomeDir(), { recursive: true })
144
147
  try {
145
148
  writeFileSync(marker, '', { flag: 'wx' })
@@ -148,7 +151,10 @@ export function notifyDesktopMigration(): void {
148
151
  throw error
149
152
  }
150
153
  console.error(
151
- ` Electron has retired on Mac and Linux (${legacy.join(', ')}). Install the native app: peach desktop install`,
154
+ ` Electron has retired on Mac and Linux (${legacy.join(', ')}). ` +
155
+ (nativeReady
156
+ ? `The native app at ${nativeApp} is in use.`
157
+ : 'Install the native app: peach desktop install'),
152
158
  )
153
159
  }
154
160
 
@@ -198,7 +204,21 @@ export function nativeDesktopIsDefault(): boolean {
198
204
  )
199
205
  }
200
206
 
207
+ // why PEACH_DESKTOP_APP cannot select a host; launch rejects it, the installer
208
+ // and the migration notice do not use it
209
+ function nativeDesktopOverrideError(): string | null {
210
+ const explicitApp = process.env.PEACH_DESKTOP_APP
211
+ if (!explicitApp) return null
212
+ if (process.platform === 'darwin' && !explicitApp.endsWith('.app'))
213
+ return 'PEACH_DESKTOP_APP must name a Mac .app bundle'
214
+ if (process.platform !== 'darwin' && process.platform !== 'linux')
215
+ return 'native desktop requires macOS or Linux'
216
+ return null
217
+ }
218
+
201
219
  export function getNativeDesktopAppPath(): string | null {
220
+ const overrideError = nativeDesktopOverrideError()
221
+ if (overrideError) throw new Error(overrideError)
202
222
  const explicitApp = process.env.PEACH_DESKTOP_APP
203
223
  if (!explicitApp)
204
224
  return process.platform === 'linux'
@@ -206,18 +226,20 @@ export function getNativeDesktopAppPath(): string | null {
206
226
  ? '/usr/bin/peach-desktop'
207
227
  : null
208
228
  : activeDesktopHostApp()
209
- if (process.platform === 'darwin' && !explicitApp.endsWith('.app'))
210
- throw new Error('PEACH_DESKTOP_APP must name a Mac .app bundle')
211
- if (process.platform !== 'darwin' && process.platform !== 'linux')
212
- throw new Error('native desktop requires macOS or Linux')
213
229
  return resolve(explicitApp)
214
230
  }
215
231
 
232
+ function nativeExecutable(appPath: string): string {
233
+ return process.platform === 'darwin'
234
+ ? join(appPath, 'Contents/MacOS/PeachDesktop')
235
+ : appPath
236
+ }
237
+
216
238
  function findNativeDesktopCompanion(): DesktopCompanionInstall | null {
217
239
  const appPath = getNativeDesktopAppPath()
218
240
  if (!appPath) return null
219
241
  const mac = process.platform === 'darwin'
220
- if (!existsSync(mac ? join(appPath, 'Contents/MacOS/PeachDesktop') : appPath)) {
242
+ if (!existsSync(nativeExecutable(appPath))) {
221
243
  throw new Error(
222
244
  `native desktop executable missing in ${appPath}${mac ? ' (run `peach desktop install --native --force`)' : ''}`,
223
245
  )
@@ -394,6 +416,7 @@ export async function launchDesktopCompanion(
394
416
  if (opts.ownerPid && opts.ownerPid > 1) extraArgs.push(`--owner-pid=${opts.ownerPid}`)
395
417
 
396
418
  if (install.kind === 'native-mac-app') {
419
+ const explicitApp = Boolean(process.env.PEACH_DESKTOP_APP)
397
420
  const launchUrl =
398
421
  url ||
399
422
  opts.profileId ||
@@ -404,6 +427,7 @@ export async function launchDesktopCompanion(
404
427
  ? buildMacLaunchUrl(url, opts, true)
405
428
  : ''
406
429
  if (
430
+ !explicitApp &&
407
431
  opts.bridgePort &&
408
432
  launchUrl &&
409
433
  (await openInConnectedMacApp(opts.bridgePort, launchUrl))
@@ -413,7 +437,11 @@ export async function launchDesktopCompanion(
413
437
  // `open -n -a` spawns an instance bound to this caller's PEACH_HOME and
414
438
  // bridge port rather than handing the URL to another session's running
415
439
  // PeachDesktop process; subsequent opens on the same bridge reuse that
416
- // instance via openInConnectedMacApp above.
440
+ // instance via openInConnectedMacApp above unless a build is explicitly selected.
441
+ // a connected host cannot establish the selected build or its launch preferences.
442
+ if (explicitApp) {
443
+ extraArgs.push('-SUEnableAutomaticChecks', 'NO', '-SUAutomaticallyUpdate', 'NO')
444
+ }
417
445
  extraArgs.push('--no-personal-home')
418
446
  // a CLI launch builds its windows from its own args: skip appkit's restore of a prior
419
447
  // crashed session, whose reopen alert blocks boot, without clearing the saved state
@@ -1,4 +1,4 @@
1
- import { devices, listSelectableDeviceModels } from 'peach-engine/settings/devices'
1
+ import { devices, listSelectableDeviceModels } from '../src/device-catalog.ts'
2
2
 
3
3
  export function validateDeviceOption(device: string | undefined): boolean {
4
4
  if (!device || device in devices) return true
@@ -18,6 +18,7 @@ import { createServer } from 'net'
18
18
  import { tmpdir } from 'os'
19
19
  import { join } from 'path'
20
20
  import { AUTOMATION_SIM_IDLE_REAP_TTL_MS } from '../../src/bridge-constants'
21
+ import { getCliVersion } from '../../src/cli-version'
21
22
  import {
22
23
  desktopHostDelivery,
23
24
  desktopHostPlatform,
@@ -54,6 +55,38 @@ function probe(): DriverAvailability {
54
55
  }
55
56
  }
56
57
 
58
+ // every bridge since the fetch transport landed serves its route, so a 404
59
+ // from a server whose /healthz identifies a peach bridge means that bridge
60
+ // predates this cli. without that identity the port may hold something else,
61
+ // and the message says only what was observed. restarting closes every sim
62
+ // the bridge hosts, so the cli never does it.
63
+ async function olderBridgeMessage(bridgePort: number): Promise<string> {
64
+ const restart = `run \`peach daemon restart\` to load the matching bridge; it closes every sim that bridge hosts, so it was not restarted.`
65
+ let health: unknown = null
66
+ try {
67
+ const response = await fetch(`http://127.0.0.1:${bridgePort}/healthz`, {
68
+ signal: AbortSignal.timeout(10_000),
69
+ })
70
+ health = await response.json()
71
+ } catch {
72
+ // an unreadable /healthz leaves the server unidentified
73
+ }
74
+ const field = (key: string) =>
75
+ health && typeof health === 'object' ? Reflect.get(health, key) : null
76
+ const pid = field('pid')
77
+ if (field('ok') !== true || typeof pid !== 'number') {
78
+ return `port ${bridgePort} has no fetch transport route and its /healthz did not identify a peach bridge, so this peach cli ${getCliVersion()} cannot use it. if an older peach bridge holds that port, ${restart}`
79
+ }
80
+ const runtime = field('activeRuntime')
81
+ const details = [
82
+ `pid ${pid}`,
83
+ typeof runtime === 'string' ? `runtime ${runtime}` : null,
84
+ ]
85
+ .filter((part) => part !== null)
86
+ .join(', ')
87
+ return `the peach bridge on port ${bridgePort} (${details}) has no fetch transport route, so it predates this peach cli ${getCliVersion()}. ${restart}`
88
+ }
89
+
57
90
  // resolve the Chrome user-data dir for a profiled launch. a non-empty
58
91
  // return means the host should use a persistent context; '' means a plain
59
92
  // (in-memory) browser launch.
@@ -111,6 +144,12 @@ async function launch(opts: DriverLaunchOptions): Promise<DriverLaunchResult> {
111
144
  `http://127.0.0.1:${opts.bridgePort}/__peach/fetch-transport`,
112
145
  { signal: AbortSignal.timeout(10_000) },
113
146
  )
147
+ if (response.status === 404) {
148
+ return {
149
+ launched: false,
150
+ message: await olderBridgeMessage(opts.bridgePort),
151
+ }
152
+ }
114
153
  if (!response.ok) throw new Error(`transport discovery returned ${response.status}`)
115
154
  const descriptor: unknown = await response.json()
116
155
  if (!descriptor || typeof descriptor !== 'object')
@@ -235,6 +274,7 @@ async function launch(opts: DriverLaunchOptions): Promise<DriverLaunchResult> {
235
274
  launched: true,
236
275
  message: `playwright ${hostCommand ? 'native host' : 'Chromium'} launched → ${targetUrl.href}${ownerNote}`,
237
276
  pid: child.pid,
277
+ process: child,
238
278
  target: resolved.spec,
239
279
  attachUrl: targetUrl.href,
240
280
  connectAckFile,
@@ -2,6 +2,8 @@
2
2
  // playwright-owned profile. desktop launches the native host; electron the
3
3
  // Electron companion.
4
4
 
5
+ import type { ChildProcess } from 'node:child_process'
6
+
5
7
  export type DriverId = 'desktop' | 'electron' | 'playwright'
6
8
 
7
9
  // broad category for grouping / filtering. "native" is a desktop host;
@@ -85,6 +87,8 @@ export interface DriverLaunchResult {
85
87
  // expose what makes sense for its environment. pid for spawned processes,
86
88
  // `target` for an install path, `attachUrl` for automation drivers.
87
89
  pid?: number
90
+ // the spawned handle, for drivers whose process tree the caller must stop.
91
+ process?: ChildProcess
88
92
  target?: string
89
93
  attachUrl?: string
90
94
  connectAckFile?: string
package/cli/help-core.ts CHANGED
@@ -4,11 +4,11 @@ import {
4
4
  renderCliGroupHelp,
5
5
  renderCliIndexHelp,
6
6
  } from '@peach/skills/cli/renderers'
7
- import { formatFlagHelp } from 'peach-engine/settings/cli-flags'
8
7
  import {
9
8
  DEFAULT_SOOTSIM_BRIDGE_PORT,
10
9
  DEFAULT_SOOTSIM_BRIDGE_URL,
11
10
  } from '../src/bridge-constants'
11
+ import { formatFlagHelp } from '../src/settings-flags.ts'
12
12
  import {
13
13
  getRnxCommandAvailability,
14
14
  getRnxFirstPositional,
@@ -195,7 +195,8 @@ export async function runScript(scriptPath: string, args: string[]): Promise<voi
195
195
  * an absolute path the driver hands it in the environment, launches chrome,
196
196
  * and keeps this process alive until the browser goes away. */
197
197
  async function playwrightHost(): Promise<void> {
198
- const { PLAYWRIGHT_SIM_HOST } = await import('./drivers/playwright-sim-host')
198
+ const { getCliRuntime } = await import('../src/cli-runtime')
199
+ const { PLAYWRIGHT_SIM_HOST } = getCliRuntime().playwright_sim_host
199
200
  const run: unknown = vm.runInThisContext(
200
201
  `(function(require){${PLAYWRIGHT_SIM_HOST}\n})`,
201
202
  { filename: 'rnx-playwright-host.js' },
package/cli/main.ts CHANGED
@@ -1,9 +1,9 @@
1
+ import { Console } from 'node:console'
1
2
  // the peach CLI proper: argv parsing, the one-time privacy choice, and the
2
3
  // single lazy-imported command a run dispatches to. `./bin` imports this only
3
4
  // when none of its hidden entry points claimed the process.
4
-
5
- import { Console } from 'node:console'
6
5
  import { automaticPeachUpdatesEnabled } from '../src/automatic-update-policy'
6
+ import { getCliRuntime } from '../src/cli-runtime.ts'
7
7
  import { exitWithFlushedOutput } from '../src/process-output'
8
8
  import { rnxPublicBrand } from '../src/public-brand'
9
9
  import { levenshtein } from './levenshtein'
@@ -330,7 +330,7 @@ if (theme && theme !== 'light' && theme !== 'dark' && theme !== 'auto') {
330
330
 
331
331
  // apply device/theme to settings store if provided
332
332
  if (device || theme) {
333
- const { settingsStore } = await import('peach-engine/settings/store')
333
+ const { settingsStore } = await Promise.resolve(getCliRuntime().settings_store)
334
334
  const overrides: Record<string, any> = {}
335
335
  if (device) overrides.deviceModel = device
336
336
  if (theme) overrides.colorScheme = theme
@@ -708,6 +708,12 @@ try {
708
708
  break
709
709
  }
710
710
 
711
+ case 'coverage': {
712
+ const { runCoverage } = await import('./commands/coverage')
713
+ process.exitCode = await runCoverage(parsed.commandArgs)
714
+ break
715
+ }
716
+
711
717
  case 'project-report': {
712
718
  const { runProjectReport } = await import('./commands/project-report')
713
719
  await exitWithFlush(runProjectReport(parsed.commandArgs))
@@ -38,7 +38,7 @@ export const OUTBOUND_ENDPOINTS: Record<string, OutboundEndpointDeclaration> = {
38
38
  runtime_delivery: {
39
39
  category: 'runtime-delivery',
40
40
  destination:
41
- 'https://contrast.dev/runtimes/manifest.json and selected runtime tarball; with `peach desktop install --native`, https://r2.rnxsim.com/releases/native/<channel>/ manifest and versioned host zip',
41
+ 'https://peachsim.com/runtimes/manifest.json and selected runtime tarball; with `peach desktop install --native`, https://r2.rnxsim.com/releases/native/<channel>/ manifest and versioned host zip',
42
42
  preConsent: true,
43
43
  payload: 'HTTP runtime or desktop host version request; no project or app data',
44
44
  },
@@ -107,7 +107,7 @@ export const OUTBOUND_ENDPOINTS: Record<string, OutboundEndpointDeclaration> = {
107
107
  },
108
108
  release_notes: {
109
109
  category: 'explicit-user-action',
110
- destination: 'https://contrast.dev/api/changelog/sootsim',
110
+ destination: 'https://peachsim.com/api/changelog/sootsim',
111
111
  preConsent: false,
112
112
  payload: 'requested runtime version only',
113
113
  },
@@ -216,6 +216,14 @@ export const OUTBOUND_ENDPOINTS: Record<string, OutboundEndpointDeclaration> = {
216
216
  payload:
217
217
  'HTTP GET of a pinned, sha256-checked toolchain file; fires only when the user builds a Kotlin app and the file is not cached',
218
218
  },
219
+ coverage_parser_download: {
220
+ category: 'explicit-user-action',
221
+ destination:
222
+ 'https://registry.npmjs.org/@typescript/typescript-<platform>/-/ pinned parser tarball',
223
+ preConsent: false,
224
+ payload:
225
+ 'HTTP GET of the pinned, sha512-checked native parser when peach coverage has no matching installed or cached parser; version, platform and architecture only, with no source or project data',
226
+ },
219
227
  linux_browser_libs_download: {
220
228
  category: 'runtime-delivery',
221
229
  destination:
@@ -639,6 +647,8 @@ export const DECLARED_OUTBOUND_CALLS: Record<string, OutboundCallDeclaration> =
639
647
  { category: 'local_development', count: 1 },
640
648
  'packages/peachsim/cli/drivers/playwright.ts :: fetch :: `http://127.0.0.1:${opts.bridgePort}/__peach/fetch-transport`':
641
649
  { category: 'local_development', count: 1 },
650
+ 'packages/peachsim/cli/drivers/playwright.ts :: fetch :: `http://127.0.0.1:${bridgePort}/healthz`':
651
+ { category: 'local_development', count: 1 },
642
652
  "packages/peach-engine/src/screenshots/capture-store.ts :: fetch :: captureApiUrl(ref, 'grid')":
643
653
  { category: 'contrast_user_action', count: 1 },
644
654
  'packages/peach-engine/src/screenshots/capture-store.ts :: fetch :: captureApiUrl(ref, variant)':
@@ -656,7 +666,7 @@ export const DECLARED_OUTBOUND_CALLS: Record<string, OutboundCallDeclaration> =
656
666
  },
657
667
  "packages/peach-engine/src/settings/persistence.ts :: fetch :: '/__sootsim/shared-config'":
658
668
  { category: 'same_origin_runtime', count: 1 },
659
- 'packages/peachsim/cli/app-fonts.ts :: fetch :: `${origin}/`': {
669
+ 'packages/peachsim/src/metro-project-root.ts :: fetch :: `${origin}/`': {
660
670
  category: 'local_development',
661
671
  count: 1,
662
672
  },
@@ -789,7 +799,7 @@ export const DECLARED_OUTBOUND_CALLS: Record<string, OutboundCallDeclaration> =
789
799
  },
790
800
  'packages/peach-engine/src/components/native-ui/ShareSheetView.tsx :: fetch-alias :: `/__fetch-proxy?url=${encodeURIComponent()}`':
791
801
  { category: 'guest_app_network', count: 1 },
792
- 'packages/peachsim/src/dev-bundle-resolution.ts :: fetch :: `/__fetch-proxy?url=${encodeURIComponent()}`':
802
+ 'packages/peachsim/src/dev-bundle-resolution.ts :: fetch :: `${pageOrigin}/__fetch-proxy?url=${encodeURIComponent()}`':
793
803
  { category: 'guest_app_network', count: 1 },
794
804
  'packages/peachsim/src/dev-bundle-resolution.ts :: fetch :: targetUrl': {
795
805
  category: 'guest_app_network',
@@ -837,7 +847,7 @@ export const DECLARED_OUTBOUND_CALLS: Record<string, OutboundCallDeclaration> =
837
847
  category: 'guest_app_network',
838
848
  count: 1,
839
849
  },
840
- 'packages/peachsim/cli/app-fonts.ts :: fetch :: `${origin}/status`': {
850
+ 'packages/peachsim/src/metro-project-root.ts :: fetch :: `${origin}/status`': {
841
851
  category: 'local_development',
842
852
  count: 1,
843
853
  },