peachsim 0.1.939 → 0.1.1399

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 (396) hide show
  1. package/README.md +28 -22
  2. package/cli/app-catalog.ts +29 -14
  3. package/cli/app-fonts.ts +5 -3
  4. package/cli/bridge-flow-runner.ts +40 -29
  5. package/cli/cloud-client.ts +57 -21
  6. package/cli/cloud-test-tunnel.ts +12 -18
  7. package/cli/commands/agent.ts +1 -1
  8. package/cli/commands/app-fonts.ts +3 -3
  9. package/cli/commands/assert.ts +8 -8
  10. package/cli/commands/auth.ts +8 -3
  11. package/cli/commands/box/bundle-plane.ts +13 -1
  12. package/cli/commands/box.ts +16 -5
  13. package/cli/commands/compat.ts +1 -1
  14. package/cli/commands/config.ts +2 -2
  15. package/cli/commands/control.ts +125 -71
  16. package/cli/commands/cpu-profile.ts +45 -1
  17. package/cli/commands/daemon.ts +131 -33
  18. package/cli/commands/debug.ts +24 -17
  19. package/cli/commands/desktop.ts +7 -1
  20. package/cli/commands/detect.ts +101 -0
  21. package/cli/commands/detox.ts +6 -6
  22. package/cli/commands/device.ts +12 -12
  23. package/cli/commands/electron.ts +32 -14
  24. package/cli/commands/flow.ts +49 -41
  25. package/cli/commands/guest-host.ts +39 -1
  26. package/cli/commands/inspect/core.ts +14 -8
  27. package/cli/commands/inspect/list.ts +1 -1
  28. package/cli/commands/inspect/settle.ts +5 -3
  29. package/cli/commands/inspect/settling.ts +229 -44
  30. package/cli/commands/inspect/wait-idle.ts +3 -2
  31. package/cli/commands/inspect.ts +105 -93
  32. package/cli/commands/install-cli.ts +36 -15
  33. package/cli/commands/install-desktop.ts +68 -195
  34. package/cli/commands/kotlin.ts +6 -5
  35. package/cli/commands/login.ts +5 -5
  36. package/cli/commands/maestro-compare.ts +554 -0
  37. package/cli/commands/maestro-generate.ts +6 -3
  38. package/cli/commands/maestro.ts +22 -0
  39. package/cli/commands/mode.ts +2 -2
  40. package/cli/commands/no-bridge-hint.ts +6 -2
  41. package/cli/commands/platform.ts +35 -6
  42. package/cli/commands/preview.ts +6 -0
  43. package/cli/commands/project-report.ts +10 -12
  44. package/cli/commands/record.ts +37 -37
  45. package/cli/commands/runtime.ts +9 -9
  46. package/cli/commands/screenshot-layers.ts +4 -4
  47. package/cli/commands/screenshot-mode.ts +2 -2
  48. package/cli/commands/screenshot.ts +8 -8
  49. package/cli/commands/screenshots-capture.ts +2 -2
  50. package/cli/commands/serve.ts +9 -12
  51. package/cli/commands/setup.ts +29 -14
  52. package/cli/commands/shell-boolean-mode.ts +2 -2
  53. package/cli/commands/show-touches-mode.ts +2 -2
  54. package/cli/commands/skills.ts +11 -11
  55. package/cli/commands/swift.ts +29 -11
  56. package/cli/commands/telemetry.ts +2 -2
  57. package/cli/commands/test.ts +5 -0
  58. package/cli/commands/three-mode.ts +3 -3
  59. package/cli/commands/timeline.ts +4 -4
  60. package/cli/commands/upgrade.ts +2 -2
  61. package/cli/commands/upload.ts +15 -15
  62. package/cli/commands/what-happened.ts +2 -2
  63. package/cli/current-sim.ts +6 -3
  64. package/cli/desktop-companion.ts +55 -149
  65. package/cli/dev-build-freshness.ts +2 -2
  66. package/cli/drivers/desktop.ts +17 -9
  67. package/cli/drivers/electron.ts +1 -2
  68. package/cli/drivers/playwright-sim-host.ts +11 -2
  69. package/cli/drivers/playwright.ts +35 -2
  70. package/cli/drivers/types.ts +8 -0
  71. package/cli/maestro-compare.ts +670 -0
  72. package/cli/outbound-endpoints.ts +46 -8
  73. package/cli/recording-access.ts +6 -6
  74. package/cli/run-registry.ts +1 -1
  75. package/cli/runtime-compat.ts +5 -1
  76. package/cli/send-to-box.ts +3 -3
  77. package/cli/shell-init.ts +2 -1
  78. package/cli/ws-bridge.ts +9 -5
  79. package/detox/element-types.ts +1 -0
  80. package/detox/gestures.ts +3 -3
  81. package/detox/index.ts +67 -38
  82. package/detox/navigation-lifecycle.ts +9 -6
  83. package/detox/proof-frame.cjs +6 -4
  84. package/dist-lib/agent-daemon-client.cjs +1 -1
  85. package/dist-lib/agent-events.cjs +1 -1
  86. package/dist-lib/attached-projects.cjs +1 -1
  87. package/dist-lib/auth/shared-session.cjs +1 -1
  88. package/dist-lib/backend-origin.cjs +1 -1
  89. package/dist-lib/beta.cjs +1 -1
  90. package/dist-lib/beta.mjs +1 -1
  91. package/dist-lib/bridge-constants.cjs +1 -1
  92. package/dist-lib/bridge-contract-input.cjs +42 -17
  93. package/dist-lib/bridge-contract-input.mjs +41 -16
  94. package/dist-lib/bridge-contract.cjs +1 -4
  95. package/dist-lib/bridge-contract.mjs +1 -3
  96. package/dist-lib/bundle-channel.cjs +2918 -550
  97. package/dist-lib/capture-contract.cjs +65 -24
  98. package/dist-lib/capture-contract.mjs +63 -24
  99. package/dist-lib/cloud-contract.cjs +2 -2
  100. package/dist-lib/cloud-contract.mjs +2 -2
  101. package/dist-lib/cloud-test-args.cjs +1 -1
  102. package/dist-lib/cloud-test-args.mjs +1 -1
  103. package/dist-lib/cloud.cjs +3 -3
  104. package/dist-lib/cloud.mjs +3 -3
  105. package/dist-lib/config.cjs +15 -5
  106. package/dist-lib/config.mjs +154 -0
  107. package/dist-lib/detox/index.cjs +495 -139
  108. package/dist-lib/dev-bundle-resolution.cjs +1 -1
  109. package/dist-lib/expo-swift-bundle.cjs +1168 -238
  110. package/dist-lib/expo-swift-metadata.cjs +34 -23
  111. package/dist-lib/expo-swift-metadata.mjs +32 -23
  112. package/dist-lib/home-paths.cjs +2 -2
  113. package/dist-lib/host/bridge-host.cjs +2938 -654
  114. package/dist-lib/host/fetch-proxy-handler.cjs +14 -1
  115. package/dist-lib/host/fetch-proxy-overrides.cjs +7 -1
  116. package/dist-lib/host/fetch-proxy-overrides.mjs +5 -1
  117. package/dist-lib/host/replacement-module-handler.cjs +2 -2
  118. package/dist-lib/host/websocket-proxy.cjs +1 -1
  119. package/dist-lib/index.cjs +999 -353
  120. package/dist-lib/jump-to-source-babel.cjs +1 -1
  121. package/dist-lib/jump-to-source-native.cjs +1 -1
  122. package/dist-lib/kotlin-host.cjs +332 -19
  123. package/dist-lib/menu.cjs +1 -1
  124. package/dist-lib/menu.mjs +1 -1
  125. package/dist-lib/metro-fingerprint-registry.cjs +1 -1
  126. package/dist-lib/metro-fingerprint-registry.mjs +1 -1
  127. package/dist-lib/metro-production-bundle.cjs +7 -7
  128. package/dist-lib/metro-production-bundle.mjs +5 -5
  129. package/dist-lib/metro.cjs +688 -250
  130. package/dist-lib/native-app-identity-project.cjs +2647 -0
  131. package/dist-lib/native-app-identity-project.mjs +1257 -0
  132. package/dist-lib/native-app-identity.cjs +325 -25
  133. package/dist-lib/native-app-identity.mjs +323 -25
  134. package/dist-lib/native-firebase-metadata.cjs +1 -1
  135. package/dist-lib/native-firebase-metadata.mjs +1 -1
  136. package/dist-lib/plist.cjs +1 -1
  137. package/dist-lib/plist.mjs +1 -1
  138. package/dist-lib/profiles.cjs +1 -1
  139. package/dist-lib/public-brand.cjs +1 -1
  140. package/dist-lib/react-native-host-modules.cjs +5 -1
  141. package/dist-lib/react-native-host-modules.mjs +5 -1
  142. package/dist-lib/scripts/dev-server-scanner.cjs +57 -32
  143. package/dist-lib/sdk.cjs +231 -51
  144. package/dist-lib/sdk.mjs +231 -51
  145. package/dist-lib/skills.cjs +4107 -1374
  146. package/dist-lib/swift-compile.cjs +290 -30
  147. package/dist-lib/swift-compile.mjs +290 -30
  148. package/dist-lib/swift-package.cjs +143 -12
  149. package/dist-lib/swift-package.mjs +137 -11
  150. package/dist-lib/swift-submit.cjs +47 -5
  151. package/dist-lib/swift-submit.mjs +42 -5
  152. package/dist-lib/swift-toolchain.cjs +7 -2
  153. package/dist-lib/swift.cjs +1 -1
  154. package/dist-lib/vite-swift.cjs +1392 -458
  155. package/dist-lib/vite.cjs +13 -17
  156. package/dist-lib/worklet-executable.cjs +248 -33
  157. package/dist-lib/worklet-executable.mjs +248 -33
  158. package/install.sh +10 -1
  159. package/kotlin/{AppSources → AndroidViewSources}/android/content/res/Resources.kt +9 -9
  160. package/kotlin/AndroidViewSources/android/graphics/Canvas.kt +20 -0
  161. package/kotlin/AndroidViewSources/android/view/View.kt +211 -0
  162. package/kotlin/AndroidViewSources/android/widget/FrameLayout.kt +61 -0
  163. package/kotlin/AndroidViewSources/android/widget/LinearLayout.kt +49 -0
  164. package/kotlin/AppSources/android/view/Window.kt +36 -0
  165. package/kotlin/AppSources/android/view/WindowInsets.kt +9 -0
  166. package/kotlin/AppSources/android/view/WindowInsetsController.kt +5 -0
  167. package/kotlin/AppSources/android/window/OnBackInvokedDispatcher.kt +48 -0
  168. package/kotlin/AppSources/androidx/activity/OnBackPressedDispatcher.kt +20 -5
  169. package/kotlin/AppSources/androidx/compose/foundation/layout/WindowInsets.kt +15 -0
  170. package/kotlin/AppSources/androidx/compose/ui/platform/ComposeView.kt +2 -1
  171. package/kotlin/AppSources/dev/peach/app/PeachApp.kt +42 -50
  172. package/kotlin/ComposeSources/PeachComposeHost.kt +200 -84
  173. package/kotlin/ExpoComposeSources/PeachAndroidView.kt +87 -0
  174. package/kotlin/ExpoComposeSources/PeachExpoViewMount.kt +24 -0
  175. package/kotlin/ExpoComposeSources/dev/peach/expo/PeachExpoCompose.kt +28 -0
  176. package/kotlin/ExpoComposeSources/expo/modules/kotlin/views/ExpoComposeView.kt +70 -0
  177. package/kotlin/ExpoSources/dev/peach/expo/PeachExpoRuntime.kt +513 -0
  178. package/kotlin/ExpoSources/dev/peach/expo/PeachExpoTypes.kt +173 -0
  179. package/kotlin/ExpoSources/expo/modules/kotlin/AppContext.kt +20 -0
  180. package/kotlin/ExpoSources/expo/modules/kotlin/Promise.kt +19 -0
  181. package/kotlin/ExpoSources/expo/modules/kotlin/classcomponent/ClassComponentBuilder.kt +198 -0
  182. package/kotlin/ExpoSources/expo/modules/kotlin/exception/CodedException.kt +126 -0
  183. package/kotlin/ExpoSources/expo/modules/kotlin/functions/Functions.kt +132 -0
  184. package/kotlin/ExpoSources/expo/modules/kotlin/jni/JavaScriptTypedArray.kt +81 -0
  185. package/kotlin/ExpoSources/expo/modules/kotlin/modules/Module.kt +98 -0
  186. package/kotlin/ExpoSources/expo/modules/kotlin/objects/ObjectDefinitionBuilder.kt +236 -0
  187. package/kotlin/ExpoSources/expo/modules/kotlin/records/Record.kt +12 -0
  188. package/kotlin/ExpoSources/expo/modules/kotlin/runtime/Runtime.kt +9 -0
  189. package/kotlin/ExpoSources/expo/modules/kotlin/sharedobjects/SharedObject.kt +50 -0
  190. package/kotlin/ExpoSources/expo/modules/kotlin/sharedobjects/SharedObjectRegistry.kt +57 -0
  191. package/kotlin/ExpoSources/expo/modules/kotlin/sharedobjects/SharedRef.kt +19 -0
  192. package/kotlin/ExpoSources/expo/modules/kotlin/typedarray/ConcreteTypedArrays.kt +158 -0
  193. package/kotlin/ExpoSources/expo/modules/kotlin/typedarray/GenericTypedArray.kt +8 -0
  194. package/kotlin/ExpoSources/expo/modules/kotlin/typedarray/TypedArray.kt +29 -0
  195. package/kotlin/ExpoSources/expo/modules/kotlin/typedarray/TypedArrayIterator.kt +9 -0
  196. package/kotlin/ExpoSources/expo/modules/kotlin/types/AnyType.kt +155 -0
  197. package/kotlin/ExpoSources/expo/modules/kotlin/types/Either.kt +91 -0
  198. package/kotlin/ExpoSources/expo/modules/kotlin/types/Enumerable.kt +6 -0
  199. package/kotlin/ExpoSources/expo/modules/kotlin/viewevent/ViewEvent.kt +54 -0
  200. package/kotlin/ExpoSources/expo/modules/kotlin/views/ExpoView.kt +23 -0
  201. package/kotlin/ExpoSources/expo/modules/kotlin/views/ViewDefinitionBuilder.kt +71 -0
  202. package/kotlin/ExpoSources/expo/modules/kotlin/views/ViewProps.kt +35 -0
  203. package/kotlin/README.md +13 -3
  204. package/kotlin/Sources/android/os/Build.kt +17 -0
  205. package/kotlin/Sources/android/os/Handler.kt +35 -0
  206. package/kotlin/Sources/android/os/Looper.kt +17 -0
  207. package/kotlin/Sources/android/os/MessageQueue.kt +56 -0
  208. package/kotlin/Sources/android/os/SystemClock.kt +14 -0
  209. package/kotlin/Sources/android/util/Log.kt +64 -0
  210. package/kotlin/Sources/java/security/MessageDigest.kt +114 -0
  211. package/kotlin/Sources/kotlin/text/StringFormat.kt +9 -0
  212. package/kotlin/Sources/org/json/JSON.kt +44 -0
  213. package/kotlin/fixtures/counter/Counter.d.kt.ts +1 -0
  214. package/kotlin/fixtures/counter/Counter.kt +10 -3
  215. package/kotlin/fixtures/counter/CounterApp.native.tsx +1 -1
  216. package/kotlin/fixtures/counter/vite.config.ts +2 -2
  217. package/kotlin/fixtures/headless-counter/Headless.kt +7 -6
  218. package/kotlin/fixtures/import-animation/Animation.d.kt.ts +7 -0
  219. package/kotlin/fixtures/import-animation/Animation.kt +80 -0
  220. package/kotlin/fixtures/import-animation/ImportAnimation.native.tsx +13 -0
  221. package/kotlin/fixtures/import-animation/README.md +24 -0
  222. package/kotlin/fixtures/import-animation/app/_layout.tsx +4 -0
  223. package/kotlin/fixtures/import-animation/app/index+spa.tsx +1 -0
  224. package/kotlin/fixtures/import-animation/app/routes.d.ts +18 -0
  225. package/kotlin/fixtures/import-animation/package.json +23 -0
  226. package/kotlin/fixtures/import-animation/tsconfig.json +20 -0
  227. package/kotlin/fixtures/import-animation/vite.config.ts +20 -0
  228. package/kotlin/fixtures/import-editor/Editor.d.kt.ts +7 -0
  229. package/kotlin/fixtures/import-editor/Editor.kt +59 -0
  230. package/kotlin/fixtures/import-editor/ImportEditor.native.tsx +23 -0
  231. package/kotlin/fixtures/import-editor/README.md +27 -0
  232. package/kotlin/fixtures/import-editor/app/_layout.tsx +4 -0
  233. package/kotlin/fixtures/import-editor/app/index+spa.tsx +1 -0
  234. package/kotlin/fixtures/import-editor/package.json +23 -0
  235. package/kotlin/fixtures/import-editor/tsconfig.json +20 -0
  236. package/kotlin/fixtures/import-editor/vite.config.ts +20 -0
  237. package/kotlin/fixtures/import-effects/Effects.d.kt.ts +7 -0
  238. package/kotlin/fixtures/import-effects/Effects.kt +87 -0
  239. package/kotlin/fixtures/import-effects/ImportEffects.native.tsx +13 -0
  240. package/kotlin/fixtures/import-effects/README.md +19 -0
  241. package/kotlin/fixtures/import-effects/app/_layout.tsx +4 -0
  242. package/kotlin/fixtures/import-effects/app/index+spa.tsx +1 -0
  243. package/kotlin/fixtures/import-effects/package.json +23 -0
  244. package/kotlin/fixtures/import-effects/tsconfig.json +20 -0
  245. package/kotlin/fixtures/import-effects/vite.config.ts +20 -0
  246. package/kotlin/fixtures/import-layout/ImportLayout.native.tsx +13 -0
  247. package/kotlin/fixtures/import-layout/Layout.d.kt.ts +7 -0
  248. package/kotlin/fixtures/import-layout/Layout.kt +72 -0
  249. package/kotlin/fixtures/import-layout/README.md +24 -0
  250. package/kotlin/fixtures/import-layout/app/_layout.tsx +4 -0
  251. package/kotlin/fixtures/import-layout/app/index+spa.tsx +1 -0
  252. package/kotlin/fixtures/import-layout/package.json +23 -0
  253. package/kotlin/fixtures/import-layout/tsconfig.json +20 -0
  254. package/kotlin/fixtures/import-layout/vite.config.ts +20 -0
  255. package/kotlin/fixtures/import-navigation/ImportNavigation.native.tsx +18 -0
  256. package/kotlin/fixtures/import-navigation/Navigation.d.kt.ts +7 -0
  257. package/kotlin/fixtures/import-navigation/Navigation.kt +104 -0
  258. package/kotlin/fixtures/import-navigation/README.md +31 -0
  259. package/kotlin/fixtures/import-navigation/app/_layout.tsx +4 -0
  260. package/kotlin/fixtures/import-navigation/app/index+spa.tsx +1 -0
  261. package/kotlin/fixtures/import-navigation/package.json +23 -0
  262. package/kotlin/fixtures/import-navigation/tsconfig.json +20 -0
  263. package/kotlin/fixtures/import-navigation/vite.config.ts +20 -0
  264. package/kotlin/fixtures/import-overlays/ImportOverlays.native.tsx +29 -0
  265. package/kotlin/fixtures/import-overlays/Overlays.d.kt.ts +7 -0
  266. package/kotlin/fixtures/import-overlays/Overlays.kt +93 -0
  267. package/kotlin/fixtures/import-overlays/README.md +34 -0
  268. package/kotlin/fixtures/import-overlays/app/_layout.tsx +4 -0
  269. package/kotlin/fixtures/import-overlays/app/index+spa.tsx +1 -0
  270. package/kotlin/fixtures/import-overlays/package.json +23 -0
  271. package/kotlin/fixtures/import-overlays/tsconfig.json +20 -0
  272. package/kotlin/fixtures/import-overlays/vite.config.ts +20 -0
  273. package/kotlin/fixtures/import-scroll/ImportScroll.native.tsx +13 -0
  274. package/kotlin/fixtures/import-scroll/README.md +23 -0
  275. package/kotlin/fixtures/import-scroll/Scroll.d.kt.ts +7 -0
  276. package/kotlin/fixtures/import-scroll/Scroll.kt +91 -0
  277. package/kotlin/fixtures/import-scroll/app/_layout.tsx +4 -0
  278. package/kotlin/fixtures/import-scroll/app/index+spa.tsx +1 -0
  279. package/kotlin/fixtures/import-scroll/package.json +23 -0
  280. package/kotlin/fixtures/import-scroll/tsconfig.json +20 -0
  281. package/kotlin/fixtures/import-scroll/vite.config.ts +20 -0
  282. package/kotlin/fixtures/import-selection/ImportSelection.native.tsx +44 -0
  283. package/kotlin/fixtures/import-selection/README.md +32 -0
  284. package/kotlin/fixtures/import-selection/Selection.d.kt.ts +8 -0
  285. package/kotlin/fixtures/import-selection/Selection.kt +78 -0
  286. package/kotlin/fixtures/import-selection/app/_layout.tsx +4 -0
  287. package/kotlin/fixtures/import-selection/app/index+spa.tsx +1 -0
  288. package/kotlin/fixtures/import-selection/package.json +23 -0
  289. package/kotlin/fixtures/import-selection/tsconfig.json +20 -0
  290. package/kotlin/fixtures/import-selection/vite.config.ts +20 -0
  291. package/kotlin/fixtures/import-surfaces/ImportSurfaces.native.tsx +13 -0
  292. package/kotlin/fixtures/import-surfaces/README.md +22 -0
  293. package/kotlin/fixtures/import-surfaces/Surfaces.d.kt.ts +7 -0
  294. package/kotlin/fixtures/import-surfaces/Surfaces.kt +64 -0
  295. package/kotlin/fixtures/import-surfaces/app/_layout.tsx +4 -0
  296. package/kotlin/fixtures/import-surfaces/app/index+spa.tsx +1 -0
  297. package/kotlin/fixtures/import-surfaces/package.json +23 -0
  298. package/kotlin/fixtures/import-surfaces/tsconfig.json +20 -0
  299. package/kotlin/fixtures/import-surfaces/vite.config.ts +20 -0
  300. package/kotlin/fixtures/import-values/ImportValues.native.tsx +35 -0
  301. package/kotlin/fixtures/import-values/README.md +23 -0
  302. package/kotlin/fixtures/import-values/Values.d.kt.ts +11 -0
  303. package/kotlin/fixtures/import-values/Values.kt +66 -0
  304. package/kotlin/fixtures/import-values/app/_layout.tsx +4 -0
  305. package/kotlin/fixtures/import-values/app/index+spa.tsx +1 -0
  306. package/kotlin/fixtures/import-values/package.json +23 -0
  307. package/kotlin/fixtures/import-values/tsconfig.json +20 -0
  308. package/kotlin/fixtures/import-values/vite.config.ts +20 -0
  309. package/kotlin/fixtures/kotlin-app-variants/BarBehavior.kt +38 -0
  310. package/kotlin/fixtures/kotlin-app-variants/BarVisibility.kt +36 -0
  311. package/kotlin/fixtures/kotlin-app-variants/Ime.kt +3 -1
  312. package/kotlin/fixtures/kotlin-app-variants/TransientInsets.kt +50 -0
  313. package/kotlin/fork/NOTICE +6 -1
  314. package/kotlin/fork/README.md +15 -7
  315. package/kotlin/fork/build.sh +2 -0
  316. package/kotlin/fork/compose-worker-globals.patch +186 -4
  317. package/kotlin/fork/fork.json +2 -2
  318. package/kotlin/fork/skiko-worker-clock.patch +12 -0
  319. package/kotlin/toolchain.json +12 -12
  320. package/kotlin/tools/expo-types.main.kts +115 -0
  321. package/package.json +17 -23
  322. package/scripts/dev-server-scanner.ts +92 -66
  323. package/skills/contrast/SKILL.md +2 -2
  324. package/skills/peach-debug/SKILL.md +1 -1
  325. package/skills/peach-perf/SKILL.md +1 -1
  326. package/skills/peach-setup/SKILL.md +2 -1
  327. package/skills/peach-test/SKILL.md +8 -0
  328. package/src/assetCatalogContract.ts +43 -1
  329. package/src/bridge-contract-input.ts +46 -19
  330. package/src/bridge-contract.ts +0 -1
  331. package/src/bundle-channel.mjs +197 -84
  332. package/src/bundleGlobalFooter.ts +38 -0
  333. package/src/capture-contract.ts +107 -33
  334. package/src/cloud-contract.ts +5 -1
  335. package/src/cloud.ts +5 -2
  336. package/src/config.ts +22 -3
  337. package/src/configured-bundle-producer.ts +1 -1
  338. package/src/desktop-host-delivery.ts +95 -1
  339. package/src/expo-kotlin-bundle.ts +29 -0
  340. package/src/expo-kotlin-host.ts +201 -0
  341. package/src/expo-swift-host.ts +96 -76
  342. package/src/expoKotlinContract.ts +70 -0
  343. package/src/expoSwiftContract.ts +4 -25
  344. package/src/home-paths.ts +7 -4
  345. package/src/host/bridge-host.ts +23 -3
  346. package/src/host/fetch-proxy-handler.ts +13 -0
  347. package/src/host/fetch-proxy-overrides.ts +11 -0
  348. package/src/host/replacement-module-handler.ts +5 -2
  349. package/src/index.ts +3 -1
  350. package/src/kotlin-host.ts +463 -19
  351. package/src/metro-plugin.ts +56 -28
  352. package/src/metro-production-bundle.ts +2 -2
  353. package/src/native-app-identity-project.ts +190 -0
  354. package/src/native-app-identity.ts +398 -34
  355. package/src/native-firebase-config.ts +69 -15
  356. package/src/native-seam-manifest.ts +6 -0
  357. package/src/one-widget-discovery.ts +2 -1
  358. package/src/openstep-plist.ts +107 -0
  359. package/src/react-native-host-modules.ts +4 -0
  360. package/src/runtime-assets.ts +2 -2
  361. package/src/sim-client.ts +2 -2
  362. package/src/swift-binary-modules.ts +3 -1
  363. package/src/swift-compile.ts +286 -38
  364. package/src/swift-distribution-contract.ts +4 -0
  365. package/src/swift-distribution.lock.json +123 -12
  366. package/src/swift-distribution.ts +7 -3
  367. package/src/swift-host.ts +298 -83
  368. package/src/swift-package-manifest.ts +29 -2
  369. package/src/swift-package.ts +180 -10
  370. package/src/swift-packages.ts +4 -0
  371. package/src/swift-standin-emit.ts +4 -1
  372. package/src/swift-standins.ts +274 -15
  373. package/src/swift-submit.ts +62 -7
  374. package/src/swift-toolchain.ts +6 -1
  375. package/src/swiftContract.ts +126 -3
  376. package/src/vite-plugin-one.ts +13 -16
  377. package/src/vite-plugin-swift.ts +4 -5
  378. package/src/vite-plugin.ts +360 -144
  379. package/src/vite.d.ts +1 -1
  380. package/src/worker-system-chunks.ts +221 -0
  381. package/src/worklet-executable.ts +348 -38
  382. package/src/worklets-babel.ts +1 -1
  383. package/src/xcode-project.ts +243 -127
  384. package/dist-lib/agent-identity.cjs +0 -39
  385. package/dist-lib/agent-sessions.cjs +0 -760
  386. package/dist-lib/cli-constants.cjs +0 -32
  387. package/dist-lib/render-mode.cjs +0 -44
  388. package/kotlin/AppSources/android/view/View.kt +0 -74
  389. package/kotlin/AppSources/android/widget/FrameLayout.kt +0 -6
  390. package/src/render-mode.ts +0 -15
  391. /package/kotlin/{AppSources → AndroidViewSources}/android/content/Context.kt +0 -0
  392. /package/kotlin/{AppSources → AndroidViewSources}/android/content/res/Configuration.kt +0 -0
  393. /package/kotlin/{AppSources → AndroidViewSources}/android/graphics/Color.kt +0 -0
  394. /package/kotlin/{AppSources → AndroidViewSources}/android/util/DisplayMetrics.kt +0 -0
  395. /package/kotlin/{AppSources → AndroidViewSources}/dev/peach/app/JavaFormat.kt +0 -0
  396. /package/kotlin/{AppSources → Sources}/java/lang/Runnable.kt +0 -0
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.939 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! peach v0.1.1399 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
2
2
  let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
@@ -23,11 +23,13 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
23
23
  var capture_contract_exports = {};
24
24
  __export(capture_contract_exports, {
25
25
  RNX_SCREEN_CAPTURE_VERSION: () => RNX_SCREEN_CAPTURE_VERSION,
26
+ isGpuSceneSource: () => isGpuSceneSource,
26
27
  isRnxCaptureRegionAtlas: () => isRnxCaptureRegionAtlas,
27
28
  isRnxScreenCapture: () => isRnxScreenCapture,
28
29
  packRnxCaptureRegions: () => packRnxCaptureRegions,
29
30
  rnxCaptureRasterRegions: () => rnxCaptureRasterRegions,
30
31
  rnxRasterFrames: () => rnxRasterFrames,
32
+ rnxRasterRegionRequests: () => rnxRasterRegionRequests,
31
33
  selectRnxRasterNodeIds: () => selectRnxRasterNodeIds
32
34
  });
33
35
  module.exports = __toCommonJS(capture_contract_exports);
@@ -36,26 +38,50 @@ function isLiveRasterSource(node) {
36
38
  const source = node.props?.source;
37
39
  return node.type === "image" && !!source && typeof source === "object" && "uri" in source && typeof source.uri === "string" && source.uri.startsWith("live:");
38
40
  }
41
+ function rasterLayerFrame(node) {
42
+ const visible = node.visibleFrame;
43
+ if (isLiveRasterSource(node) && visible && visible.width > 0 && visible.height > 0) {
44
+ return { x: visible.x, y: visible.y, width: visible.width, height: visible.height };
45
+ }
46
+ return node.frame ?? {
47
+ x: node.absolutePosition.x,
48
+ y: node.absolutePosition.y,
49
+ width: node.layout.width,
50
+ height: node.layout.height
51
+ };
52
+ }
53
+ function isGpuSceneSource(node) {
54
+ if (!isLiveRasterSource(node)) return false;
55
+ const source = node.props?.source;
56
+ const uri = source && typeof source === "object" ? Reflect.get(source, "uri") : null;
57
+ return typeof uri === "string" && (uri.startsWith("live:expo-gl-") || uri.startsWith("live:wgpu-"));
58
+ }
39
59
  function selectRnxRasterNodeIds(tree) {
40
60
  const nodesById = new Map(tree.nodes.map((node) => [node.nodeId, node]));
41
61
  const maxLayerArea = tree.width * tree.height * 0.25;
42
62
  const eligible = /* @__PURE__ */ new Map();
43
63
  for (const node of tree.nodes) {
44
64
  const liveVideo = isLiveRasterSource(node);
45
- const visibleFrame = liveVideo && node.visibleFrame && (node.visibleFrame.width <= 0 || node.visibleFrame.height <= 0) ? node.frame : node.visibleFrame ?? node.frame;
65
+ const visibleFrame = liveVideo ? rasterLayerFrame(node) : node.visibleFrame ?? node.frame;
46
66
  if (!visibleFrame || visibleFrame.width <= 0 || visibleFrame.height <= 0) continue;
67
+ const glass = node.style._liquidGlass !== void 0 || node.style._liquidGlassEdge !== void 0 || node.style._liquidGlassMaterialTint !== void 0;
47
68
  const unsupported = node.type === "masked-view" || liveVideo || node.type === "text" && typeof node.text === "string" && (new RegExp("\\p{Emoji_Presentation}", "u").test(node.text) || new RegExp("\\uFE0F|\\u200D|\\u20E3|\\p{Emoji_Modifier}|\\p{Regional_Indicator}", "u").test(
48
69
  node.text
49
- )) || node.style._liquidGlass !== void 0 || node.style._liquidGlassEdge !== void 0 || node.style._liquidGlassMaterialTint !== void 0;
50
- const area = visibleFrame.width * visibleFrame.height;
51
- if (unsupported && (liveVideo || area <= maxLayerArea)) {
52
- eligible.set(node.nodeId, { nodeId: node.nodeId, area, liveVideo });
70
+ )) || glass;
71
+ if (!unsupported) continue;
72
+ const captured = rasterLayerFrame(node);
73
+ const area = captured.width * captured.height;
74
+ if (liveVideo || area <= maxLayerArea) {
75
+ eligible.set(node.nodeId, { nodeId: node.nodeId, area, liveVideo, ownPaint: false });
76
+ } else if (glass) {
77
+ eligible.set(node.nodeId, { nodeId: node.nodeId, area, liveVideo, ownPaint: true });
53
78
  }
54
79
  }
55
80
  for (const nodeId of [...eligible.keys()]) {
56
81
  let parentNodeId = nodesById.get(nodeId)?.parentNodeId ?? null;
57
82
  while (parentNodeId !== null) {
58
- if (eligible.has(parentNodeId)) {
83
+ const parent = eligible.get(parentNodeId);
84
+ if (parent && !parent.ownPaint) {
59
85
  eligible.delete(nodeId);
60
86
  break;
61
87
  }
@@ -63,29 +89,29 @@ function selectRnxRasterNodeIds(tree) {
63
89
  }
64
90
  }
65
91
  const candidates = [...eligible.values()].sort(
66
- (left, right) => Number(right.liveVideo) - Number(left.liveVideo) || left.area - right.area || left.nodeId - right.nodeId
92
+ (left, right) => Number(right.liveVideo) - Number(left.liveVideo) || Number(right.ownPaint) - Number(left.ownPaint) || left.area - right.area || left.nodeId - right.nodeId
67
93
  );
68
94
  const screenArea = tree.width * tree.height;
69
- const selected = /* @__PURE__ */ new Set();
95
+ const selection = { nodeIds: /* @__PURE__ */ new Set(), ownPaint: /* @__PURE__ */ new Set() };
70
96
  let atlasArea = 0;
97
+ let layerArea = 0;
71
98
  for (const candidate of candidates) {
72
- const maxAtlasArea = screenArea * (candidate.liveVideo ? 1 : 0.5);
73
- if (atlasArea + candidate.area > maxAtlasArea) continue;
74
- selected.add(candidate.nodeId);
99
+ const leading = candidate.liveVideo || candidate.ownPaint;
100
+ if (atlasArea + candidate.area > screenArea * (leading ? 1 : 1.25) || !leading && layerArea + candidate.area > screenArea * 0.5) {
101
+ continue;
102
+ }
103
+ selection.nodeIds.add(candidate.nodeId);
104
+ if (candidate.ownPaint) selection.ownPaint.add(candidate.nodeId);
75
105
  atlasArea += candidate.area;
106
+ if (!leading) layerArea += candidate.area;
76
107
  }
77
- return selected;
108
+ return selection;
78
109
  }
79
110
  function rnxRasterFrames(tree, nodeIds) {
80
111
  const frames = /* @__PURE__ */ new Map();
81
112
  for (const node of tree.nodes) {
82
113
  if (!nodeIds.has(node.nodeId)) continue;
83
- const frame = node.frame ?? {
84
- x: node.absolutePosition.x,
85
- y: node.absolutePosition.y,
86
- width: node.layout.width,
87
- height: node.layout.height
88
- };
114
+ const frame = rasterLayerFrame(node);
89
115
  const glassOutset = liquidGlassPaintOutset(node.style._liquidGlass, frame);
90
116
  const shadowRadius = typeof node.style.shadowRadius === "number" ? node.style.shadowRadius : 0;
91
117
  const shadowOffset = node.style.shadowOffset;
@@ -159,11 +185,22 @@ function rnxCaptureRasterRegions(capture) {
159
185
  visibleFrame: node.layout.visibleFrame
160
186
  }))
161
187
  };
162
- const nodeIds = selectRnxRasterNodeIds(tree);
163
- const frames = rnxRasterFrames(tree, nodeIds);
164
- return [...nodeIds].flatMap((nodeId) => {
188
+ const selection = selectRnxRasterNodeIds(tree);
189
+ return rnxRasterRegionRequests(tree, selection);
190
+ }
191
+ function rnxRasterRegionRequests(tree, selection) {
192
+ const frames = rnxRasterFrames(tree, selection.nodeIds);
193
+ return [...selection.nodeIds].flatMap((nodeId) => {
165
194
  const frame = frames.get(nodeId);
166
- return frame ? [{ key: String(nodeId), nodeId, frame }] : [];
195
+ if (!frame) return [];
196
+ return [
197
+ {
198
+ key: String(nodeId),
199
+ nodeId,
200
+ frame,
201
+ ...selection.ownPaint.has(nodeId) ? { ownPaint: true } : {}
202
+ }
203
+ ];
167
204
  });
168
205
  }
169
206
  function packRnxCaptureRegions(regions, pixelRatio, surface) {
@@ -184,6 +221,7 @@ function packRnxCaptureRegions(regions, pixelRatio, surface) {
184
221
  return {
185
222
  key: region.key,
186
223
  nodeId: region.nodeId,
224
+ ...region.ownPaint ? { ownPaint: true } : {},
187
225
  frame: {
188
226
  x: left / pixelRatio,
189
227
  y: top / pixelRatio,
@@ -249,6 +287,7 @@ function packRnxCaptureRegions(regions, pixelRatio, surface) {
249
287
  atlasRegions: best.regions.map((region) => ({
250
288
  key: region.key,
251
289
  nodeId: region.nodeId,
290
+ ...region.ownPaint ? { ownPaint: true } : {},
252
291
  frame: region.frame,
253
292
  // a region flush with the far edge is anchored to the logical edge so
254
293
  // its source never runs past the atlas by a rounding hair
@@ -325,7 +364,7 @@ function isRnxCaptureRegionAtlas(value) {
325
364
  }
326
365
  const keys = /* @__PURE__ */ new Set();
327
366
  for (const region of value.regions) {
328
- if (!captureRecord(region) || typeof region.key !== "string" || region.key.length === 0 || keys.has(region.key) || !captureInteger(region.nodeId) || region.nodeId <= 0 || !captureRect(region.frame) || region.frame.width <= 0 || region.frame.height <= 0 || !captureRect(region.source) || region.source.x < 0 || region.source.y < 0 || region.source.width !== region.frame.width || region.source.height !== region.frame.height || region.source.x + region.source.width > value.width || region.source.y + region.source.height > value.height) {
367
+ if (!captureRecord(region) || typeof region.key !== "string" || region.key.length === 0 || keys.has(region.key) || !captureInteger(region.nodeId) || region.nodeId <= 0 || region.ownPaint !== void 0 && region.ownPaint !== true || !captureRect(region.frame) || region.frame.width <= 0 || region.frame.height <= 0 || !captureRect(region.source) || region.source.x < 0 || region.source.y < 0 || region.source.width !== region.frame.width || region.source.height !== region.frame.height || region.source.x + region.source.width > value.width || region.source.y + region.source.height > value.height) {
329
368
  return false;
330
369
  }
331
370
  keys.add(region.key);
@@ -335,10 +374,12 @@ function isRnxCaptureRegionAtlas(value) {
335
374
  // Annotate the CommonJS export names for ESM import in node:
336
375
  0 && (module.exports = {
337
376
  RNX_SCREEN_CAPTURE_VERSION,
377
+ isGpuSceneSource,
338
378
  isRnxCaptureRegionAtlas,
339
379
  isRnxScreenCapture,
340
380
  packRnxCaptureRegions,
341
381
  rnxCaptureRasterRegions,
342
382
  rnxRasterFrames,
383
+ rnxRasterRegionRequests,
343
384
  selectRnxRasterNodeIds
344
385
  });
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.939 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! peach v0.1.1399 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
2
2
 
3
3
  // src/capture-contract.ts
4
4
  var RNX_SCREEN_CAPTURE_VERSION = 1;
@@ -6,26 +6,50 @@ function isLiveRasterSource(node) {
6
6
  const source = node.props?.source;
7
7
  return node.type === "image" && !!source && typeof source === "object" && "uri" in source && typeof source.uri === "string" && source.uri.startsWith("live:");
8
8
  }
9
+ function rasterLayerFrame(node) {
10
+ const visible = node.visibleFrame;
11
+ if (isLiveRasterSource(node) && visible && visible.width > 0 && visible.height > 0) {
12
+ return { x: visible.x, y: visible.y, width: visible.width, height: visible.height };
13
+ }
14
+ return node.frame ?? {
15
+ x: node.absolutePosition.x,
16
+ y: node.absolutePosition.y,
17
+ width: node.layout.width,
18
+ height: node.layout.height
19
+ };
20
+ }
21
+ function isGpuSceneSource(node) {
22
+ if (!isLiveRasterSource(node)) return false;
23
+ const source = node.props?.source;
24
+ const uri = source && typeof source === "object" ? Reflect.get(source, "uri") : null;
25
+ return typeof uri === "string" && (uri.startsWith("live:expo-gl-") || uri.startsWith("live:wgpu-"));
26
+ }
9
27
  function selectRnxRasterNodeIds(tree) {
10
28
  const nodesById = new Map(tree.nodes.map((node) => [node.nodeId, node]));
11
29
  const maxLayerArea = tree.width * tree.height * 0.25;
12
30
  const eligible = /* @__PURE__ */ new Map();
13
31
  for (const node of tree.nodes) {
14
32
  const liveVideo = isLiveRasterSource(node);
15
- const visibleFrame = liveVideo && node.visibleFrame && (node.visibleFrame.width <= 0 || node.visibleFrame.height <= 0) ? node.frame : node.visibleFrame ?? node.frame;
33
+ const visibleFrame = liveVideo ? rasterLayerFrame(node) : node.visibleFrame ?? node.frame;
16
34
  if (!visibleFrame || visibleFrame.width <= 0 || visibleFrame.height <= 0) continue;
35
+ const glass = node.style._liquidGlass !== void 0 || node.style._liquidGlassEdge !== void 0 || node.style._liquidGlassMaterialTint !== void 0;
17
36
  const unsupported = node.type === "masked-view" || liveVideo || node.type === "text" && typeof node.text === "string" && (/\p{Emoji_Presentation}/u.test(node.text) || /\uFE0F|\u200D|\u20E3|\p{Emoji_Modifier}|\p{Regional_Indicator}/u.test(
18
37
  node.text
19
- )) || node.style._liquidGlass !== void 0 || node.style._liquidGlassEdge !== void 0 || node.style._liquidGlassMaterialTint !== void 0;
20
- const area = visibleFrame.width * visibleFrame.height;
21
- if (unsupported && (liveVideo || area <= maxLayerArea)) {
22
- eligible.set(node.nodeId, { nodeId: node.nodeId, area, liveVideo });
38
+ )) || glass;
39
+ if (!unsupported) continue;
40
+ const captured = rasterLayerFrame(node);
41
+ const area = captured.width * captured.height;
42
+ if (liveVideo || area <= maxLayerArea) {
43
+ eligible.set(node.nodeId, { nodeId: node.nodeId, area, liveVideo, ownPaint: false });
44
+ } else if (glass) {
45
+ eligible.set(node.nodeId, { nodeId: node.nodeId, area, liveVideo, ownPaint: true });
23
46
  }
24
47
  }
25
48
  for (const nodeId of [...eligible.keys()]) {
26
49
  let parentNodeId = nodesById.get(nodeId)?.parentNodeId ?? null;
27
50
  while (parentNodeId !== null) {
28
- if (eligible.has(parentNodeId)) {
51
+ const parent = eligible.get(parentNodeId);
52
+ if (parent && !parent.ownPaint) {
29
53
  eligible.delete(nodeId);
30
54
  break;
31
55
  }
@@ -33,29 +57,29 @@ function selectRnxRasterNodeIds(tree) {
33
57
  }
34
58
  }
35
59
  const candidates = [...eligible.values()].sort(
36
- (left, right) => Number(right.liveVideo) - Number(left.liveVideo) || left.area - right.area || left.nodeId - right.nodeId
60
+ (left, right) => Number(right.liveVideo) - Number(left.liveVideo) || Number(right.ownPaint) - Number(left.ownPaint) || left.area - right.area || left.nodeId - right.nodeId
37
61
  );
38
62
  const screenArea = tree.width * tree.height;
39
- const selected = /* @__PURE__ */ new Set();
63
+ const selection = { nodeIds: /* @__PURE__ */ new Set(), ownPaint: /* @__PURE__ */ new Set() };
40
64
  let atlasArea = 0;
65
+ let layerArea = 0;
41
66
  for (const candidate of candidates) {
42
- const maxAtlasArea = screenArea * (candidate.liveVideo ? 1 : 0.5);
43
- if (atlasArea + candidate.area > maxAtlasArea) continue;
44
- selected.add(candidate.nodeId);
67
+ const leading = candidate.liveVideo || candidate.ownPaint;
68
+ if (atlasArea + candidate.area > screenArea * (leading ? 1 : 1.25) || !leading && layerArea + candidate.area > screenArea * 0.5) {
69
+ continue;
70
+ }
71
+ selection.nodeIds.add(candidate.nodeId);
72
+ if (candidate.ownPaint) selection.ownPaint.add(candidate.nodeId);
45
73
  atlasArea += candidate.area;
74
+ if (!leading) layerArea += candidate.area;
46
75
  }
47
- return selected;
76
+ return selection;
48
77
  }
49
78
  function rnxRasterFrames(tree, nodeIds) {
50
79
  const frames = /* @__PURE__ */ new Map();
51
80
  for (const node of tree.nodes) {
52
81
  if (!nodeIds.has(node.nodeId)) continue;
53
- const frame = node.frame ?? {
54
- x: node.absolutePosition.x,
55
- y: node.absolutePosition.y,
56
- width: node.layout.width,
57
- height: node.layout.height
58
- };
82
+ const frame = rasterLayerFrame(node);
59
83
  const glassOutset = liquidGlassPaintOutset(node.style._liquidGlass, frame);
60
84
  const shadowRadius = typeof node.style.shadowRadius === "number" ? node.style.shadowRadius : 0;
61
85
  const shadowOffset = node.style.shadowOffset;
@@ -129,11 +153,22 @@ function rnxCaptureRasterRegions(capture) {
129
153
  visibleFrame: node.layout.visibleFrame
130
154
  }))
131
155
  };
132
- const nodeIds = selectRnxRasterNodeIds(tree);
133
- const frames = rnxRasterFrames(tree, nodeIds);
134
- return [...nodeIds].flatMap((nodeId) => {
156
+ const selection = selectRnxRasterNodeIds(tree);
157
+ return rnxRasterRegionRequests(tree, selection);
158
+ }
159
+ function rnxRasterRegionRequests(tree, selection) {
160
+ const frames = rnxRasterFrames(tree, selection.nodeIds);
161
+ return [...selection.nodeIds].flatMap((nodeId) => {
135
162
  const frame = frames.get(nodeId);
136
- return frame ? [{ key: String(nodeId), nodeId, frame }] : [];
163
+ if (!frame) return [];
164
+ return [
165
+ {
166
+ key: String(nodeId),
167
+ nodeId,
168
+ frame,
169
+ ...selection.ownPaint.has(nodeId) ? { ownPaint: true } : {}
170
+ }
171
+ ];
137
172
  });
138
173
  }
139
174
  function packRnxCaptureRegions(regions, pixelRatio, surface) {
@@ -154,6 +189,7 @@ function packRnxCaptureRegions(regions, pixelRatio, surface) {
154
189
  return {
155
190
  key: region.key,
156
191
  nodeId: region.nodeId,
192
+ ...region.ownPaint ? { ownPaint: true } : {},
157
193
  frame: {
158
194
  x: left / pixelRatio,
159
195
  y: top / pixelRatio,
@@ -219,6 +255,7 @@ function packRnxCaptureRegions(regions, pixelRatio, surface) {
219
255
  atlasRegions: best.regions.map((region) => ({
220
256
  key: region.key,
221
257
  nodeId: region.nodeId,
258
+ ...region.ownPaint ? { ownPaint: true } : {},
222
259
  frame: region.frame,
223
260
  // a region flush with the far edge is anchored to the logical edge so
224
261
  // its source never runs past the atlas by a rounding hair
@@ -295,7 +332,7 @@ function isRnxCaptureRegionAtlas(value) {
295
332
  }
296
333
  const keys = /* @__PURE__ */ new Set();
297
334
  for (const region of value.regions) {
298
- if (!captureRecord(region) || typeof region.key !== "string" || region.key.length === 0 || keys.has(region.key) || !captureInteger(region.nodeId) || region.nodeId <= 0 || !captureRect(region.frame) || region.frame.width <= 0 || region.frame.height <= 0 || !captureRect(region.source) || region.source.x < 0 || region.source.y < 0 || region.source.width !== region.frame.width || region.source.height !== region.frame.height || region.source.x + region.source.width > value.width || region.source.y + region.source.height > value.height) {
335
+ if (!captureRecord(region) || typeof region.key !== "string" || region.key.length === 0 || keys.has(region.key) || !captureInteger(region.nodeId) || region.nodeId <= 0 || region.ownPaint !== void 0 && region.ownPaint !== true || !captureRect(region.frame) || region.frame.width <= 0 || region.frame.height <= 0 || !captureRect(region.source) || region.source.x < 0 || region.source.y < 0 || region.source.width !== region.frame.width || region.source.height !== region.frame.height || region.source.x + region.source.width > value.width || region.source.y + region.source.height > value.height) {
299
336
  return false;
300
337
  }
301
338
  keys.add(region.key);
@@ -304,10 +341,12 @@ function isRnxCaptureRegionAtlas(value) {
304
341
  }
305
342
  export {
306
343
  RNX_SCREEN_CAPTURE_VERSION,
344
+ isGpuSceneSource,
307
345
  isRnxCaptureRegionAtlas,
308
346
  isRnxScreenCapture,
309
347
  packRnxCaptureRegions,
310
348
  rnxCaptureRasterRegions,
311
349
  rnxRasterFrames,
350
+ rnxRasterRegionRequests,
312
351
  selectRnxRasterNodeIds
313
352
  };
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.939 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! peach v0.1.1399 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
2
2
  let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
@@ -49,7 +49,7 @@ __export(cloud_contract_exports, {
49
49
  rnxCloudScopesAllowCommand: () => rnxCloudScopesAllowCommand
50
50
  });
51
51
  module.exports = __toCommonJS(cloud_contract_exports);
52
- var RNX_CLOUD_MAX_ARTIFACT_BYTES = 20 * 1024 * 1024;
52
+ var RNX_CLOUD_MAX_ARTIFACT_BYTES = 40761776;
53
53
  var RNX_CLOUD_DESIGN_MAX_STORAGE_ENTRIES = 256;
54
54
  var RNX_CLOUD_DESIGN_MAX_STORAGE_BYTES = 1024 * 1024;
55
55
  var RNX_CLOUD_TEST_FILES_MAX_COUNT = 256;
@@ -1,7 +1,7 @@
1
- /*! rnx v0.1.939 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! peach v0.1.1399 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
2
2
 
3
3
  // src/cloud-contract.ts
4
- var RNX_CLOUD_MAX_ARTIFACT_BYTES = 20 * 1024 * 1024;
4
+ var RNX_CLOUD_MAX_ARTIFACT_BYTES = 40761776;
5
5
  var RNX_CLOUD_DESIGN_MAX_STORAGE_ENTRIES = 256;
6
6
  var RNX_CLOUD_DESIGN_MAX_STORAGE_BYTES = 1024 * 1024;
7
7
  var RNX_CLOUD_TEST_FILES_MAX_COUNT = 256;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.939 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! peach v0.1.1399 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
2
2
  let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.939 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! peach v0.1.1399 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
2
2
 
3
3
  // src/cloud-test-args.ts
4
4
  var CLOUD_TEST_ARGS_MAX_COUNT = 32;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.939 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! peach v0.1.1399 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
2
2
  let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
@@ -100,7 +100,7 @@ function isRnxScreenCapture(value) {
100
100
  }
101
101
 
102
102
  // src/cloud-contract.ts
103
- var RNX_CLOUD_MAX_ARTIFACT_BYTES = 20 * 1024 * 1024;
103
+ var RNX_CLOUD_MAX_ARTIFACT_BYTES = 40761776;
104
104
  var RNX_CLOUD_DESIGN_MAX_STORAGE_BYTES = 1024 * 1024;
105
105
  var RNX_CLOUD_COMMAND_SCOPE_SET = /* @__PURE__ */ new Set([
106
106
  "read",
@@ -387,7 +387,7 @@ var RemoteSimulator = class {
387
387
  do: (command) => this.sendCommand(command),
388
388
  wait: (condition, options) => {
389
389
  const timeoutMs = options?.maxMs ?? DEFAULT_WAIT_READY_MS;
390
- const waitCondition = condition === "ready" ? { type: "ready" } : condition;
390
+ const waitCondition = condition === "ready" ? { type: "ready" } : { type: "present", selector: { testID: condition.selector } };
391
391
  return this.sendCommand(
392
392
  {
393
393
  type: "waitFor",
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.939 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! peach v0.1.1399 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
2
2
  var __defProp = Object.defineProperty;
3
3
  var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
4
4
  var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
@@ -70,7 +70,7 @@ function isRnxScreenCapture(value) {
70
70
  }
71
71
 
72
72
  // src/cloud-contract.ts
73
- var RNX_CLOUD_MAX_ARTIFACT_BYTES = 20 * 1024 * 1024;
73
+ var RNX_CLOUD_MAX_ARTIFACT_BYTES = 40761776;
74
74
  var RNX_CLOUD_DESIGN_MAX_STORAGE_BYTES = 1024 * 1024;
75
75
  var RNX_CLOUD_COMMAND_SCOPE_SET = /* @__PURE__ */ new Set([
76
76
  "read",
@@ -357,7 +357,7 @@ var RemoteSimulator = class {
357
357
  do: (command) => this.sendCommand(command),
358
358
  wait: (condition, options) => {
359
359
  const timeoutMs = options?.maxMs ?? DEFAULT_WAIT_READY_MS;
360
- const waitCondition = condition === "ready" ? { type: "ready" } : condition;
360
+ const waitCondition = condition === "ready" ? { type: "ready" } : { type: "present", selector: { testID: condition.selector } };
361
361
  return this.sendCommand(
362
362
  {
363
363
  type: "waitFor",
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.939 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! peach v0.1.1399 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
2
2
  let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
@@ -32,6 +32,7 @@ __export(config_exports, {
32
32
  hasPeachConfig: () => hasPeachConfig,
33
33
  isPeachConfig: () => isPeachConfig,
34
34
  mergePeachConfig: () => mergePeachConfig,
35
+ readNativeRenderer: () => readNativeRenderer,
35
36
  readPeachBundleConfig: () => readPeachBundleConfig,
36
37
  readPeachBundleConfigFooter: () => readPeachBundleConfigFooter,
37
38
  readPeachConfigFromSearchParams: () => readPeachConfigFromSearchParams
@@ -49,6 +50,11 @@ function isRecord(value) {
49
50
  }
50
51
 
51
52
  // src/config.ts
53
+ function readNativeRenderer(value) {
54
+ if (value === void 0) return void 0;
55
+ if (value === "paper" || value === "fabric") return value;
56
+ throw new Error("nativeRenderer must be paper or fabric");
57
+ }
52
58
  var PEACH_CONFIG_QUERY_PARAM = "peachConfig";
53
59
  function collectConfiguredFileModules(config) {
54
60
  return [
@@ -65,7 +71,7 @@ function collectConfiguredFileModules(config) {
65
71
  }
66
72
  function isPeachConfig(value) {
67
73
  if (!isRecord(value)) return false;
68
- return (value.runtimeVersion === void 0 || typeof value.runtimeVersion === "string" && value.runtimeVersion === value.runtimeVersion.trim() && isValidRuntimeVersion(value.runtimeVersion)) && [
74
+ return (value.nativeRenderer === void 0 || value.nativeRenderer === "paper" || value.nativeRenderer === "fabric") && (value.runtimeVersion === void 0 || typeof value.runtimeVersion === "string" && value.runtimeVersion === value.runtimeVersion.trim() && isValidRuntimeVersion(value.runtimeVersion)) && [
69
75
  "modules",
70
76
  "turboModules",
71
77
  "nativeModules",
@@ -121,7 +127,7 @@ function hasOwnKeys(value) {
121
127
  }
122
128
  function hasPeachConfig(config) {
123
129
  if (!config) return false;
124
- return typeof config.runtimeVersion === "string" && config.runtimeVersion.length > 0 || hasOwnKeys(config.modules) || hasOwnKeys(config.turboModules) || hasOwnKeys(config.nativeModules) || hasOwnKeys(config.nativeViews) || hasOwnKeys(config.env) || hasOwnKeys(config.network?.remap) || hasOwnKeys(config.settings) || hasOwnKeys(config.initialState);
130
+ return config.nativeRenderer !== void 0 || typeof config.runtimeVersion === "string" && config.runtimeVersion.length > 0 || hasOwnKeys(config.modules) || hasOwnKeys(config.turboModules) || hasOwnKeys(config.nativeModules) || hasOwnKeys(config.nativeViews) || hasOwnKeys(config.env) || hasOwnKeys(config.network?.remap) || hasOwnKeys(config.settings) || hasOwnKeys(config.initialState);
125
131
  }
126
132
  function mergePeachConfig(base, override) {
127
133
  if (!hasPeachConfig(base) && !hasPeachConfig(override)) return void 0;
@@ -129,6 +135,7 @@ function mergePeachConfig(base, override) {
129
135
  if (!hasPeachConfig(override)) return base ? { ...base } : void 0;
130
136
  return {
131
137
  runtimeVersion: override.runtimeVersion ?? base.runtimeVersion,
138
+ nativeRenderer: override.nativeRenderer ?? base.nativeRenderer,
132
139
  modules: { ...base.modules || {}, ...override.modules || {} },
133
140
  turboModules: { ...base.turboModules || {}, ...override.turboModules || {} },
134
141
  nativeModules: {
@@ -150,14 +157,16 @@ function mergePeachConfig(base, override) {
150
157
  function readPeachConfigFromSearchParams(searchParams) {
151
158
  const raw = searchParams.get(PEACH_CONFIG_QUERY_PARAM);
152
159
  if (!raw) return void 0;
160
+ let parsed;
153
161
  try {
154
- const parsed = JSON.parse(raw);
155
- return hasPeachConfig(parsed) ? parsed : void 0;
162
+ parsed = JSON.parse(raw);
156
163
  } catch (error) {
157
164
  const message = error instanceof Error ? error.message : String(error);
158
165
  console.warn(`[peach] invalid ${PEACH_CONFIG_QUERY_PARAM}: ${message}`);
159
166
  return void 0;
160
167
  }
168
+ if (isRecord(parsed)) readNativeRenderer(parsed.nativeRenderer);
169
+ return isPeachConfig(parsed) && hasPeachConfig(parsed) ? parsed : void 0;
161
170
  }
162
171
  function applyPeachConfigToUrl(url, config) {
163
172
  const parsed = new URL(url);
@@ -180,6 +189,7 @@ function applyPeachConfigToUrl(url, config) {
180
189
  hasPeachConfig,
181
190
  isPeachConfig,
182
191
  mergePeachConfig,
192
+ readNativeRenderer,
183
193
  readPeachBundleConfig,
184
194
  readPeachBundleConfigFooter,
185
195
  readPeachConfigFromSearchParams