peachsim 0.1.940 → 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 +981 -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 +670 -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 +304 -25
  133. package/dist-lib/native-app-identity.mjs +302 -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 +367 -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,96 @@
1
- /*! rnx v0.1.940 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! peach v0.1.1399 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
2
+
3
+ // src/openstep-plist.ts
4
+ function parseOpenStepPlist(text) {
5
+ let i = 0;
6
+ const fail = (message) => {
7
+ const line = text.slice(0, i).split("\n").length;
8
+ throw new Error(`project.pbxproj line ${line}: ${message}`);
9
+ };
10
+ const skip = () => {
11
+ for (; ; ) {
12
+ const ch = text[i];
13
+ if (ch === " " || ch === " " || ch === "\n" || ch === "\r") i++;
14
+ else if (ch === "/" && text[i + 1] === "*") {
15
+ const end = text.indexOf("*/", i + 2);
16
+ if (end < 0) fail("unterminated comment");
17
+ i = end + 2;
18
+ } else if (ch === "/" && text[i + 1] === "/") {
19
+ const end = text.indexOf("\n", i);
20
+ i = end < 0 ? text.length : end + 1;
21
+ } else return;
22
+ }
23
+ };
24
+ const quoted = () => {
25
+ i++;
26
+ let out = "";
27
+ for (; ; ) {
28
+ const ch = text[i++];
29
+ if (ch === void 0) fail("unterminated string");
30
+ if (ch === '"') return out;
31
+ if (ch !== "\\") {
32
+ out += ch;
33
+ continue;
34
+ }
35
+ const next = text[i++];
36
+ if (next === "n") out += "\n";
37
+ else if (next === "t") out += " ";
38
+ else if (next === "r") out += "\r";
39
+ else if (next === "U") {
40
+ out += String.fromCharCode(parseInt(text.slice(i, i + 4), 16));
41
+ i += 4;
42
+ } else out += next;
43
+ }
44
+ };
45
+ const value = () => {
46
+ skip();
47
+ const ch = text[i];
48
+ if (ch === "{") {
49
+ i++;
50
+ const dict = {};
51
+ for (; ; ) {
52
+ skip();
53
+ if (text[i] === "}") {
54
+ i++;
55
+ return dict;
56
+ }
57
+ const key = value();
58
+ if (typeof key !== "string") fail("dictionary key is not a string");
59
+ skip();
60
+ if (text[i++] !== "=") fail("expected =");
61
+ if (Object.hasOwn(dict, key)) fail(`duplicate key ${key}`);
62
+ dict[key] = value();
63
+ skip();
64
+ if (text[i++] !== ";") fail("expected ;");
65
+ }
66
+ }
67
+ if (ch === "(") {
68
+ i++;
69
+ const list = [];
70
+ for (; ; ) {
71
+ skip();
72
+ if (text[i] === ")") {
73
+ i++;
74
+ return list;
75
+ }
76
+ list.push(value());
77
+ skip();
78
+ if (text[i] === ",") i++;
79
+ else if (text[i] !== ")") fail("expected , or )");
80
+ }
81
+ }
82
+ if (ch === '"') return quoted();
83
+ const start = i;
84
+ while (i < text.length && /[A-Za-z0-9_$+/:.\-<>]/.test(text[i])) i++;
85
+ if (i === start) fail(`unexpected ${JSON.stringify(ch ?? "end of file")}`);
86
+ return text.slice(start, i);
87
+ };
88
+ if (text.startsWith("// !$*UTF8*$!")) i = text.indexOf("\n") + 1;
89
+ const root = value();
90
+ skip();
91
+ if (i !== text.length) fail("trailing content");
92
+ return root;
93
+ }
2
94
 
3
95
  // src/native-app-identity.ts
4
96
  var NATIVE_APP_IDENTITY_PREFIX = "globalThis.__sootsimNativeAppIdentity=";
@@ -12,12 +104,37 @@ function nonEmptyString(value) {
12
104
  }
13
105
  function isNativeAppIdentity(value) {
14
106
  if (!isRecord(value)) return false;
107
+ const oneUpdates = value.oneUpdates;
108
+ if (oneUpdates !== void 0 && (!isRecord(oneUpdates) || typeof oneUpdates.enabled !== "boolean" || oneUpdates.url !== null && typeof oneUpdates.url !== "string" || oneUpdates.runtimeVersion !== null && typeof oneUpdates.runtimeVersion !== "string" || oneUpdates.embeddedManifestJson !== null && typeof oneUpdates.embeddedManifestJson !== "string" || oneUpdates.enabled && (typeof oneUpdates.url !== "string" || oneUpdates.url.length === 0 || typeof oneUpdates.runtimeVersion !== "string" || oneUpdates.runtimeVersion.length === 0))) {
109
+ return false;
110
+ }
15
111
  const descriptions = value.permissionUsageDescriptions;
16
112
  if (descriptions !== void 0 && !isRecord(descriptions)) return false;
17
113
  if (value.urlQuerySchemes !== void 0 && !Array.isArray(value.urlQuerySchemes))
18
114
  return false;
19
115
  if (value.appIntentIdentifiers !== void 0 && (!Array.isArray(value.appIntentIdentifiers) || !value.appIntentIdentifiers.every((identifier) => typeof identifier === "string")))
20
116
  return false;
117
+ if (value.backgroundTaskIdentifiers !== void 0 && (!Array.isArray(value.backgroundTaskIdentifiers) || !value.backgroundTaskIdentifiers.every(
118
+ (identifier) => typeof identifier === "string"
119
+ )))
120
+ return false;
121
+ if (value.backgroundModes !== void 0 && (!Array.isArray(value.backgroundModes) || !value.backgroundModes.every((mode) => typeof mode === "string")))
122
+ return false;
123
+ if (value.shareIntoAppGroupId !== void 0 && typeof value.shareIntoAppGroupId !== "string")
124
+ return false;
125
+ if (value.applicationDisplayName !== void 0 && typeof value.applicationDisplayName !== "string")
126
+ return false;
127
+ if (value.rootViewBackgroundColor !== void 0 && (typeof value.rootViewBackgroundColor !== "number" || !Number.isInteger(value.rootViewBackgroundColor)))
128
+ return false;
129
+ for (const orientations of [
130
+ value.supportedInterfaceOrientations,
131
+ value.ipadSupportedInterfaceOrientations
132
+ ]) {
133
+ if (orientations !== void 0 && (!Array.isArray(orientations) || !orientations.every((orientation) => typeof orientation === "string")))
134
+ return false;
135
+ }
136
+ if (value.defaultScreenOrientationMask !== void 0 && typeof value.defaultScreenOrientationMask !== "string")
137
+ return false;
21
138
  const platform = value.platform;
22
139
  if (value.alternateIconNames !== void 0 && (!Array.isArray(value.alternateIconNames) || !value.alternateIconNames.every((name) => typeof name === "string")))
23
140
  return false;
@@ -40,6 +157,8 @@ function readNativeAppIdentity(value) {
40
157
  }
41
158
  return {
42
159
  applicationName: value.applicationName,
160
+ ...value.applicationDisplayName === void 0 ? {} : { applicationDisplayName: value.applicationDisplayName },
161
+ ...value.rootViewBackgroundColor === void 0 ? {} : { rootViewBackgroundColor: value.rootViewBackgroundColor },
43
162
  ...value.bundleName === void 0 ? {} : { bundleName: value.bundleName },
44
163
  appVersion: value.appVersion,
45
164
  buildVersion: value.buildVersion,
@@ -50,7 +169,27 @@ function readNativeAppIdentity(value) {
50
169
  permissionUsageDescriptions: { ...value.permissionUsageDescriptions }
51
170
  },
52
171
  ...value.appIntentIdentifiers === void 0 ? {} : { appIntentIdentifiers: [...value.appIntentIdentifiers] },
53
- ...value.urlQuerySchemes === void 0 ? {} : { urlQuerySchemes: [...value.urlQuerySchemes] }
172
+ ...value.backgroundTaskIdentifiers === void 0 ? {} : { backgroundTaskIdentifiers: [...value.backgroundTaskIdentifiers] },
173
+ ...value.supportedInterfaceOrientations === void 0 ? {} : {
174
+ supportedInterfaceOrientations: [...value.supportedInterfaceOrientations]
175
+ },
176
+ ...value.ipadSupportedInterfaceOrientations === void 0 ? {} : {
177
+ ipadSupportedInterfaceOrientations: [
178
+ ...value.ipadSupportedInterfaceOrientations
179
+ ]
180
+ },
181
+ ...value.defaultScreenOrientationMask === void 0 ? {} : { defaultScreenOrientationMask: value.defaultScreenOrientationMask },
182
+ ...value.backgroundModes === void 0 ? {} : { backgroundModes: [...value.backgroundModes] },
183
+ ...value.shareIntoAppGroupId === void 0 ? {} : { shareIntoAppGroupId: value.shareIntoAppGroupId },
184
+ ...value.urlQuerySchemes === void 0 ? {} : { urlQuerySchemes: [...value.urlQuerySchemes] },
185
+ ...value.oneUpdates === void 0 ? {} : {
186
+ oneUpdates: {
187
+ enabled: value.oneUpdates.enabled,
188
+ url: value.oneUpdates.url,
189
+ runtimeVersion: value.oneUpdates.runtimeVersion,
190
+ embeddedManifestJson: value.oneUpdates.embeddedManifestJson
191
+ }
192
+ }
54
193
  };
55
194
  }
56
195
  function createNativeAppIdentityHeader(identity) {
@@ -78,7 +217,10 @@ function readNativeAppIdentityFromBundle(source, header) {
78
217
  }
79
218
  const identity = readNativeAppIdentity(value);
80
219
  if (!identity) throw new Error("native app identity response header is malformed");
81
- if (footer && !equalIdentityValues(identity, readNativeAppIdentity(footer))) {
220
+ const footerIdentity = footer ? readNativeAppIdentity(footer) : null;
221
+ const headerBase = { ...identity, oneUpdates: void 0 };
222
+ const footerBase = footerIdentity && { ...footerIdentity, oneUpdates: void 0 };
223
+ if (footerIdentity && !equalIdentityValues(headerBase, footerBase)) {
82
224
  throw new Error("native app identity response header conflicts with bundle footer");
83
225
  }
84
226
  return identity;
@@ -93,7 +235,9 @@ function getAppliedNativeAppIdentity() {
93
235
  return isNativeAppIdentity(value) ? value : null;
94
236
  }
95
237
  function createNativeAppIdentityFooter(identity) {
96
- const payload = JSON.stringify(identity).replace(/\u2028/g, "\\u2028").replace(/\u2029/g, "\\u2029").replace(/<\//g, "<\\/");
238
+ const footerIdentity = { ...identity };
239
+ delete footerIdentity.oneUpdates;
240
+ const payload = JSON.stringify(footerIdentity).replace(/\u2028/g, "\\u2028").replace(/\u2029/g, "\\u2029").replace(/<\//g, "<\\/");
97
241
  return `
98
242
  ${NATIVE_APP_IDENTITY_PREFIX}${payload};`;
99
243
  }
@@ -118,6 +262,9 @@ function readNativeAppIdentityFooter(source) {
118
262
  if (!isNativeAppIdentity(parsed)) {
119
263
  throw new Error("native app identity footer is malformed");
120
264
  }
265
+ if (parsed.oneUpdates !== void 0) {
266
+ throw new Error("native app identity footer cannot contain one updates receipt");
267
+ }
121
268
  return parsed;
122
269
  }
123
270
  function detachNativeAppIdentityFooter(source) {
@@ -221,30 +368,119 @@ function appTargetReleaseSettings(pbxproj, targetName, infoPlistRelativePath) {
221
368
  (candidate) => candidate.name === "Release" && named(candidate.settings)
222
369
  )?.settings ?? null;
223
370
  }
224
- function nativeAppIdentityFromIos(files, parseInfoPlist) {
371
+ function nativeAppIdentityFromIos(files, parseInfoPlist, iosTarget) {
225
372
  const pbxprojPath = Object.keys(files).find(
226
373
  (path) => /(?:^|\/)ios\/[^/]+\.xcodeproj\/project\.pbxproj$/.test(path)
227
- );
374
+ ) ?? Object.keys(files).find(
375
+ (path) => /(?:^|\/)[^/]+\.xcodeproj\/project\.pbxproj$/.test(path)
376
+ ) ?? Object.keys(files).find((path) => /(?:^|\/)project\.pbxproj$/.test(path));
228
377
  if (!pbxprojPath) return null;
229
378
  const pbxproj = files[pbxprojPath];
230
- const applicationTargets = new Set(
231
- [
232
- ...pbxproj.matchAll(
233
- /isa = PBXNativeTarget;[^}]*?name = "?([^";]+)"?;[^}]*?productType = "com\.apple\.product-type\.application";/g
234
- )
235
- ].map((match) => match[1])
379
+ let objects = {};
380
+ try {
381
+ const parsed = parseOpenStepPlist(pbxproj);
382
+ if (isRecord(parsed)) {
383
+ objects = isRecord(parsed.objects) ? parsed.objects : parsed;
384
+ }
385
+ } catch {
386
+ }
387
+ const targets = [];
388
+ for (const [id, obj] of Object.entries(objects)) {
389
+ if (isRecord(obj) && obj.isa === "PBXNativeTarget" && typeof obj.name === "string") {
390
+ targets.push({
391
+ id,
392
+ name: obj.name,
393
+ productType: typeof obj.productType === "string" ? obj.productType : void 0,
394
+ buildConfigurationList: typeof obj.buildConfigurationList === "string" ? obj.buildConfigurationList : void 0
395
+ });
396
+ }
397
+ }
398
+ const applicationTargetNames = new Set(
399
+ targets.filter((t) => t.productType === "com.apple.product-type.application").map((t) => t.name)
236
400
  );
237
- const appDelegatePattern = /(?:^|\/)ios\/([^/]+)\/AppDelegate\.(?:swift|mm|m)$/;
238
- const targetName = Object.keys(files).filter((path) => !path.includes("/Pods/")).map((path) => path.match(appDelegatePattern)?.[1]).find((name) => name !== void 0 && applicationTargets.has(name)) ?? null;
239
- if (!targetName) return null;
240
- const plist = files[`ios/${targetName}/Info.plist`];
401
+ if (applicationTargetNames.size === 0) {
402
+ for (const match of pbxproj.matchAll(
403
+ /isa = PBXNativeTarget;[^}]*?name = "?([^";]+)"?;[^}]*?productType = "com\.apple\.product-type\.application";/g
404
+ )) {
405
+ applicationTargetNames.add(match[1]);
406
+ }
407
+ }
408
+ let targetName = null;
409
+ if (iosTarget) {
410
+ if (applicationTargetNames.has(iosTarget)) {
411
+ targetName = iosTarget;
412
+ } else {
413
+ return null;
414
+ }
415
+ } else if (applicationTargetNames.size === 1) {
416
+ targetName = [...applicationTargetNames][0];
417
+ } else if (applicationTargetNames.size > 1) {
418
+ const appDelegatePattern = /(?:^|\/)ios\/([^/]+)\/AppDelegate\.(?:swift|mm|m)$/;
419
+ const delegateTargets = Object.keys(files).filter((path) => !path.includes("/Pods/")).map((path) => path.match(appDelegatePattern)?.[1]).filter(
420
+ (name) => typeof name === "string" && applicationTargetNames.has(name)
421
+ );
422
+ if (delegateTargets.length === 1) {
423
+ targetName = delegateTargets[0];
424
+ } else {
425
+ return null;
426
+ }
427
+ } else {
428
+ return null;
429
+ }
430
+ const selectedTarget = targets.find((t) => t.name === targetName);
431
+ const settings = {
432
+ TARGET_NAME: targetName,
433
+ PRODUCT_NAME: targetName
434
+ };
435
+ for (const obj of Object.values(objects)) {
436
+ if (isRecord(obj) && obj.isa === "PBXProject" && typeof obj.buildConfigurationList === "string") {
437
+ const listObj = objects[obj.buildConfigurationList];
438
+ if (isRecord(listObj) && Array.isArray(listObj.buildConfigurations)) {
439
+ for (const configId of listObj.buildConfigurations) {
440
+ if (typeof configId === "string") {
441
+ const configObj = objects[configId];
442
+ if (isRecord(configObj) && configObj.name === "Release" && isRecord(configObj.buildSettings)) {
443
+ for (const [k, v] of Object.entries(configObj.buildSettings)) {
444
+ if (typeof v === "string") settings[k] = v;
445
+ }
446
+ }
447
+ }
448
+ }
449
+ }
450
+ }
451
+ }
452
+ if (selectedTarget?.buildConfigurationList) {
453
+ const listObj = objects[selectedTarget.buildConfigurationList];
454
+ if (isRecord(listObj) && Array.isArray(listObj.buildConfigurations)) {
455
+ for (const configId of listObj.buildConfigurations) {
456
+ if (typeof configId === "string") {
457
+ const configObj = objects[configId];
458
+ if (isRecord(configObj) && configObj.name === "Release" && isRecord(configObj.buildSettings)) {
459
+ for (const [k, v] of Object.entries(configObj.buildSettings)) {
460
+ if (typeof v === "string") settings[k] = v;
461
+ }
462
+ }
463
+ }
464
+ }
465
+ }
466
+ } else {
467
+ const legacy = appTargetReleaseSettings(
468
+ pbxproj,
469
+ targetName,
470
+ `${targetName}/Info.plist`
471
+ );
472
+ if (legacy) Object.assign(settings, legacy);
473
+ }
474
+ let plist;
475
+ const infoPlistPath = settings.INFOPLIST_FILE;
476
+ if (infoPlistPath) {
477
+ const normalized = infoPlistPath.replace(/^"|"$/g, "");
478
+ plist = files[`ios/${normalized}`] ?? files[normalized] ?? Object.entries(files).find(([k]) => k.endsWith(`/${normalized}`))?.[1];
479
+ }
480
+ if (!plist) {
481
+ plist = files[`ios/${targetName}/Info.plist`] ?? files[`${targetName}/Info.plist`] ?? Object.entries(files).find(([k]) => k.endsWith(`/${targetName}/Info.plist`))?.[1];
482
+ }
241
483
  if (!plist) return null;
242
- const settings = appTargetReleaseSettings(
243
- pbxproj,
244
- targetName,
245
- `${targetName}/Info.plist`
246
- );
247
- if (!settings) return null;
248
484
  const bundleIdentifier = identityFieldFrom(
249
485
  settings,
250
486
  plistString(plist, "CFBundleIdentifier"),
@@ -271,6 +507,12 @@ function nativeAppIdentityFromIos(files, parseInfoPlist) {
271
507
  const applicationName = identityFieldFrom(settings, plistString(plist, "CFBundleDisplayName"), void 0) ?? bundleName;
272
508
  const dictionary = parseInfoPlist(plist);
273
509
  if (!isRecord(dictionary)) throw new Error("native app Info.plist is not a dictionary");
510
+ const declaredDisplayName = dictionary.CFBundleDisplayName;
511
+ const applicationDisplayName = typeof declaredDisplayName === "string" ? resolveBuildSetting(declaredDisplayName, settings) : void 0;
512
+ if (applicationDisplayName === null)
513
+ throw new Error("native app Info.plist CFBundleDisplayName is unresolved");
514
+ const declaredBackgroundColor = dictionary.RCTRootViewBackgroundColor;
515
+ const rootViewBackgroundColor = typeof declaredBackgroundColor === "number" && Number.isInteger(declaredBackgroundColor) ? declaredBackgroundColor : void 0;
274
516
  const icons = dictionary.CFBundleIcons;
275
517
  const alternates = isRecord(icons) ? icons.CFBundleAlternateIcons : void 0;
276
518
  const alternateIconNames = /* @__PURE__ */ new Set();
@@ -290,6 +532,32 @@ function nativeAppIdentityFromIos(files, parseInfoPlist) {
290
532
  }
291
533
  const intentIds = dictionary.OneAppIntentIdentifiers;
292
534
  const appIntentIdentifiers = Array.isArray(intentIds) && intentIds.every((value) => typeof value === "string") ? intentIds.map((value) => resolveBuildSetting(value, settings)) : [];
535
+ const backgroundIds = dictionary.BGTaskSchedulerPermittedIdentifiers;
536
+ const backgroundTaskIdentifiers = Array.isArray(backgroundIds) && backgroundIds.every((value) => typeof value === "string") ? backgroundIds.map((value) => resolveBuildSetting(value, settings)) : [];
537
+ const declaredModes = dictionary.UIBackgroundModes;
538
+ const backgroundModes = Array.isArray(declaredModes) && declaredModes.every((value) => typeof value === "string") ? declaredModes.map((value) => resolveBuildSetting(value, settings)) : [];
539
+ const screenOrientationLists = [
540
+ "UISupportedInterfaceOrientations",
541
+ "UISupportedInterfaceOrientations~ipad"
542
+ ].map((key) => {
543
+ const list = dictionary[key];
544
+ if (!Array.isArray(list) || !list.every((value) => typeof value === "string"))
545
+ return [];
546
+ return list.map((value) => {
547
+ const resolved = resolveBuildSetting(value, settings);
548
+ if (resolved === null) throw new Error(`native app Info.plist ${key} is unresolved`);
549
+ return resolved;
550
+ });
551
+ });
552
+ const [supportedInterfaceOrientations, ipadSupportedInterfaceOrientations] = screenOrientationLists;
553
+ const declaredDefaultOrientationMask = dictionary.EXDefaultScreenOrientationMask;
554
+ const defaultScreenOrientationMask = typeof declaredDefaultOrientationMask === "string" ? resolveBuildSetting(declaredDefaultOrientationMask, settings) : void 0;
555
+ if (defaultScreenOrientationMask === null)
556
+ throw new Error("native app Info.plist EXDefaultScreenOrientationMask is unresolved");
557
+ const declaredShareGroup = dictionary.ExpoShareIntoAppGroupId;
558
+ const shareIntoAppGroupId = typeof declaredShareGroup === "string" ? resolveBuildSetting(declaredShareGroup, settings) : void 0;
559
+ if (shareIntoAppGroupId === null)
560
+ throw new Error("native app Info.plist ExpoShareIntoAppGroupId is unresolved");
293
561
  const querySchemes = dictionary.LSApplicationQueriesSchemes;
294
562
  if (querySchemes !== void 0 && !Array.isArray(querySchemes)) {
295
563
  throw new Error("native app Info.plist LSApplicationQueriesSchemes is not an array");
@@ -303,7 +571,8 @@ function nativeAppIdentityFromIos(files, parseInfoPlist) {
303
571
  });
304
572
  const permissionUsageDescriptions = {};
305
573
  for (const [key, value] of Object.entries(dictionary)) {
306
- if (!/^NS.*UsageDescription$/.test(key)) continue;
574
+ if (!/^NS.*UsageDescription$/.test(key) && key !== "NSLocationTemporaryUsageDescriptionDictionary")
575
+ continue;
307
576
  if (typeof value !== "string") {
308
577
  permissionUsageDescriptions[key] = value;
309
578
  continue;
@@ -324,22 +593,30 @@ function nativeAppIdentityFromIos(files, parseInfoPlist) {
324
593
  }
325
594
  return {
326
595
  applicationName,
596
+ ...applicationDisplayName === void 0 ? {} : { applicationDisplayName },
597
+ ...rootViewBackgroundColor === void 0 ? {} : { rootViewBackgroundColor },
327
598
  bundleName,
328
599
  appVersion,
329
600
  buildVersion,
330
601
  bundleIdentifier,
331
602
  platform: "ios",
603
+ supportedInterfaceOrientations,
604
+ ipadSupportedInterfaceOrientations,
605
+ ...defaultScreenOrientationMask === void 0 ? {} : { defaultScreenOrientationMask },
332
606
  alternateIconNames: [...alternateIconNames],
333
607
  permissionUsageDescriptions,
334
608
  urlQuerySchemes,
609
+ ...shareIntoAppGroupId === void 0 ? {} : { shareIntoAppGroupId },
610
+ backgroundTaskIdentifiers: backgroundTaskIdentifiers.every((value) => value !== null) ? backgroundTaskIdentifiers : [],
611
+ backgroundModes: backgroundModes.every((value) => value !== null) ? backgroundModes : [],
335
612
  appIntentIdentifiers: appIntentIdentifiers.every((value) => value !== null) ? appIntentIdentifiers : []
336
613
  };
337
614
  }
338
615
  function canExtractNativeAppIdentity(platform) {
339
616
  return platform === "ios";
340
617
  }
341
- function extractNativeAppIdentityFromFiles(files, platform, parseInfoPlist) {
342
- return canExtractNativeAppIdentity(platform) ? nativeAppIdentityFromIos(files, parseInfoPlist) : null;
618
+ function extractNativeAppIdentityFromFiles(files, platform, parseInfoPlist, iosTarget) {
619
+ return canExtractNativeAppIdentity(platform) ? nativeAppIdentityFromIos(files, parseInfoPlist, iosTarget) : null;
343
620
  }
344
621
  export {
345
622
  NATIVE_APP_IDENTITY_HEADER,
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.940 | (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.940 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! peach v0.1.1399 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
2
2
 
3
3
  // src/native-firebase-metadata.ts
4
4
  var PREFIX = "globalThis.__peachNativeFirebaseConfig=";
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.940 | (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 __create = Object.create;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.940 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! peach v0.1.1399 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
2
2
 
3
3
  // src/plist.ts
4
4
  import plist from "plist";
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.940 | (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 __create = Object.create;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.940 | (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.940 | (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;
@@ -27,6 +27,10 @@ __export(react_native_host_modules_exports, {
27
27
  });
28
28
  module.exports = __toCommonJS(react_native_host_modules_exports);
29
29
  var REACT_NATIVE_PASSTHROUGH_SPECIFIERS = [
30
+ // sdk 58 reads these upstream getters and wraps the original metro logger.
31
+ "react-native/unstable-internals-do-not-use",
32
+ "react-native/src/unstable-internals-do-not-use",
33
+ "react-native/Libraries/Utilities/HMRClient",
30
34
  "react-native/Libraries/vendor/emitter",
31
35
  "react-native/Libraries/Components/View/ReactNativeStyleAttributes",
32
36
  "react-native/Libraries/StyleSheet",
@@ -1,7 +1,11 @@
1
- /*! rnx v0.1.940 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! peach v0.1.1399 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
2
2
 
3
3
  // src/react-native-host-modules.ts
4
4
  var REACT_NATIVE_PASSTHROUGH_SPECIFIERS = [
5
+ // sdk 58 reads these upstream getters and wraps the original metro logger.
6
+ "react-native/unstable-internals-do-not-use",
7
+ "react-native/src/unstable-internals-do-not-use",
8
+ "react-native/Libraries/Utilities/HMRClient",
5
9
  "react-native/Libraries/vendor/emitter",
6
10
  "react-native/Libraries/Components/View/ReactNativeStyleAttributes",
7
11
  "react-native/Libraries/StyleSheet",
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.940 | (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 __create = Object.create;
@@ -280,7 +280,6 @@ __export(dev_server_scanner_exports, {
280
280
  __shouldReuseScannerCacheEntry: () => __shouldReuseScannerCacheEntry,
281
281
  discoverListeningPorts: () => discoverListeningPorts,
282
282
  discoverListeningProcesses: () => discoverListeningProcesses,
283
- pidFromNetstat: () => pidFromNetstat,
284
283
  probePort: () => probePort,
285
284
  resolveListeningPid: () => resolveListeningPid,
286
285
  resolveProcessCwd: () => resolveProcessCwd,
@@ -470,7 +469,7 @@ function hasOwnKeys(value) {
470
469
  }
471
470
  function hasPeachConfig(config) {
472
471
  if (!config) return false;
473
- 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);
472
+ 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);
474
473
  }
475
474
  function applyPeachConfigToUrl(url, config) {
476
475
  const parsed = new URL(url);
@@ -590,9 +589,9 @@ function configuredWidgetFromScan(value, bundleUrl) {
590
589
  }
591
590
 
592
591
  // src/one-widget-discovery.ts
593
- async function readConfiguredOneWidget(bundleUrl) {
592
+ async function readConfiguredOneWidget(bundleUrl, fetchScan = fetch) {
594
593
  try {
595
- const response = await fetch(new URL("/__server-scan", bundleUrl).href, {
594
+ const response = await fetchScan(new URL("/__server-scan", bundleUrl).href, {
596
595
  signal: AbortSignal.timeout(3e4)
597
596
  });
598
597
  if (!response.ok || !response.headers.get("content-type")?.includes("json"))
@@ -1215,30 +1214,19 @@ async function discoverListeningPorts(excludePorts = []) {
1215
1214
  const processes = await discoverListeningProcesses(excludePorts);
1216
1215
  return processes.map((p) => p.port);
1217
1216
  }
1218
- function pidFromNetstat(stdout, port) {
1219
- for (const line of stdout.split("\n")) {
1220
- if (!line.includes("LISTEN")) continue;
1221
- const parts = line.trim().split(/\s+/);
1222
- if (!parts[3]?.endsWith(`.${port}`)) continue;
1223
- for (const token of parts) {
1224
- const owner = token.match(/^\S+:(\d+)$/);
1225
- if (owner) {
1226
- const pid = Number(owner[1]);
1227
- if (pid > 0) return pid;
1228
- }
1229
- }
1230
- }
1231
- return null;
1232
- }
1233
1217
  async function resolveListeningPid(port) {
1234
1218
  if (!Number.isInteger(port) || port <= 0) return null;
1235
- try {
1236
- const { stdout } = await execGuarded("netstat -anv -p tcp 2>/dev/null", 8e3, {
1237
- maxBuffer: 16 * 1024 * 1024
1238
- });
1239
- const pid = pidFromNetstat(stdout, port);
1240
- if (pid !== null) return pid;
1241
- } catch {
1219
+ if (process.platform === "darwin") {
1220
+ try {
1221
+ const { stdout } = await execGuarded(
1222
+ `lsof -nP -a -iTCP:${port} -sTCP:LISTEN -t 2>/dev/null`,
1223
+ 8e3
1224
+ );
1225
+ const pids = [...new Set(stdout.trim().split(/\s+/).map(Number))];
1226
+ return pids.length === 1 && Number.isInteger(pids[0]) && pids[0] > 0 ? pids[0] : null;
1227
+ } catch {
1228
+ return null;
1229
+ }
1242
1230
  }
1243
1231
  try {
1244
1232
  const { stdout } = await execGuarded(`ss -tlnp 2>/dev/null`, 8e3, {
@@ -1482,15 +1470,53 @@ async function probePort(port, buildIconProxyUrl, listeningProcess) {
1482
1470
  ...ownerCwd ? { cwd: ownerCwd } : {}
1483
1471
  };
1484
1472
  const onePath = `/node_modules/one/metro-entry.bundle?platform=ios&dev=true`;
1485
- const [sootsimRes, statusRes, manifestRes, expoRes, swiftRes] = await Promise.all([
1486
- knownNonPatched.has(port) ? Promise.resolve(null) : httpGet(probeHostname, port, "/__soot/"),
1473
+ const [sootsimRes, statusRes, manifestRes, expoRes, swiftRes, oneScanRes] = await Promise.all([
1474
+ knownNonPatched.has(port) ? Promise.resolve(null) : httpGet(probeHostname, port, "/__peachsim/"),
1487
1475
  httpGet(probeHostname, port, "/status"),
1488
1476
  knownOne.has(port) ? Promise.resolve(null) : httpGet(probeHostname, port, "/", "GET", MANIFEST_TIMEOUT_MS, {
1489
1477
  "expo-platform": "ios"
1490
1478
  }),
1491
1479
  knownNonExpo.has(port) ? Promise.resolve(null) : httpGet(probeHostname, port, "/_expo/status"),
1492
- httpGet(probeHostname, port, SWIFT_DISCOVERY_PATH)
1480
+ httpGet(probeHostname, port, SWIFT_DISCOVERY_PATH),
1481
+ httpGet(probeHostname, port, "/__server-scan", "GET", MANIFEST_TIMEOUT_MS)
1493
1482
  ]);
1483
+ const oneScan = oneScanRes?.statusCode === 200 ? safeParseManifest(oneScanRes.body) : null;
1484
+ if (Array.isArray(oneScan)) {
1485
+ for (const entry of oneScan) {
1486
+ if (!entry || typeof entry !== "object" || entry.framework !== "one" || entry.port !== port || typeof entry.bundleUrl !== "string")
1487
+ continue;
1488
+ let bundle;
1489
+ try {
1490
+ bundle = new URL(entry.bundleUrl);
1491
+ } catch {
1492
+ continue;
1493
+ }
1494
+ if (bundle.protocol !== "http:" || !isLoopbackHost(bundle.hostname) || bundle.port !== String(port) || !bundle.pathname.endsWith("/one/metro-entry.bundle"))
1495
+ continue;
1496
+ knownOne.add(port);
1497
+ return enrichWithManifest(
1498
+ applyManifest(
1499
+ {
1500
+ port,
1501
+ framework: "one",
1502
+ bundleUrl: withRuntimeConfig(
1503
+ port,
1504
+ alignLoopbackBundleUrlWithProbe(
1505
+ bundle.href,
1506
+ buildLoopbackProbeBaseUrl("http:", probeHostname, port)
1507
+ ),
1508
+ owner.cwd
1509
+ ),
1510
+ lastSeen: Date.now(),
1511
+ ...owner
1512
+ },
1513
+ manifestRes,
1514
+ buildIconProxyUrl
1515
+ ),
1516
+ buildIconProxyUrl
1517
+ );
1518
+ }
1519
+ }
1494
1520
  const swift = swiftRes?.statusCode === 200 ? parseSwiftHostDiscovery(safeParseManifest(swiftRes.body)) : null;
1495
1521
  if (swift) {
1496
1522
  const base = buildLoopbackProbeBaseUrl("http:", probeHostname, port);
@@ -1560,7 +1586,7 @@ async function probePort(port, buildIconProxyUrl, listeningProcess) {
1560
1586
  framework: "one",
1561
1587
  bundleUrl: withRuntimeConfig(
1562
1588
  port,
1563
- `${buildLoopbackProbeBaseUrl("http:", probeHostname, port)}/__soot/bundle.js`,
1589
+ `${buildLoopbackProbeBaseUrl("http:", probeHostname, port)}/__peachsim/bundle.js`,
1564
1590
  owner.cwd
1565
1591
  ),
1566
1592
  hmrUrl: `${buildLoopbackProbeBaseUrl("ws:", probeHostname, port)}/hot`,
@@ -1753,7 +1779,6 @@ async function scanDevServers(opts = {}) {
1753
1779
  __shouldReuseScannerCacheEntry,
1754
1780
  discoverListeningPorts,
1755
1781
  discoverListeningProcesses,
1756
- pidFromNetstat,
1757
1782
  probePort,
1758
1783
  resolveListeningPid,
1759
1784
  resolveProcessCwd,