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;
@@ -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 __create = Object.create;
@@ -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 __create = Object.create;
@@ -32,8 +32,10 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
32
32
  // src/kotlin-host.ts
33
33
  var kotlin_host_exports = {};
34
34
  __export(kotlin_host_exports, {
35
+ expoKotlinArtifact: () => expoKotlinArtifact,
35
36
  kotlinAppArtifact: () => kotlinAppArtifact,
36
37
  kotlinArtifact: () => kotlinArtifact,
38
+ kotlinArtifactFiles: () => kotlinArtifactFiles,
37
39
  kotlinSources: () => kotlinSources,
38
40
  peachKotlinModuleRoot: () => peachKotlinModuleRoot,
39
41
  serveKotlinArtifact: () => serveKotlinArtifact,
@@ -45,7 +47,9 @@ var import_node_crypto = require("node:crypto");
45
47
  var import_node_fs = __toESM(require("node:fs"), 1);
46
48
  var import_node_module = require("node:module");
47
49
  var import_node_path2 = __toESM(require("node:path"), 1);
50
+ var import_node_url = require("node:url");
48
51
  var import_node_util = require("node:util");
52
+ var import_acorn = require("acorn");
49
53
 
50
54
  // src/home-paths.ts
51
55
  var import_node_os = require("node:os");
@@ -268,9 +272,9 @@ function kotlinSources(root, skip = SKIP_DIRS) {
268
272
  }
269
273
  function entrySource(ids) {
270
274
  return [
275
+ "import android.os.Build",
271
276
  "import kotlin.js.JsAny",
272
277
  "import kotlin.js.Promise",
273
- "import kotlinx.coroutines.CoroutineStart",
274
278
  "import kotlinx.coroutines.Dispatchers",
275
279
  "import kotlinx.coroutines.GlobalScope",
276
280
  "import kotlinx.coroutines.promise",
@@ -284,10 +288,14 @@ function entrySource(ids) {
284
288
  " else -> null",
285
289
  "}?.also { instances[packageName] = it }",
286
290
  "",
291
+ "@OptIn(kotlin.js.ExperimentalJsExport::class)",
292
+ "@JsExport",
293
+ "fun peachSetAndroidBuildInfo(model: String, release: String) = Build.setDevice(model, release)",
294
+ "",
287
295
  "@OptIn(kotlin.js.ExperimentalJsExport::class, kotlin.js.ExperimentalWasmJsInterop::class, kotlinx.coroutines.DelicateCoroutinesApi::class)",
288
296
  "@JsExport",
289
297
  "fun peachNativeCall(module: String, method: String, argsJson: String, contractHash: String): Promise<JsAny?> =",
290
- " GlobalScope.promise(Dispatchers.Main, CoroutineStart.UNDISPATCHED) {",
298
+ " GlobalScope.promise(Dispatchers.Main) {",
291
299
  " val reply = JSONObject()",
292
300
  " try {",
293
301
  ` val packageName = module.substringBefore('.', "")`,
@@ -309,7 +317,7 @@ function entrySource(ids) {
309
317
  ""
310
318
  ].join("\n");
311
319
  }
312
- var BUILD_FORMAT = 8;
320
+ var BUILD_FORMAT = 14;
313
321
  var builds = /* @__PURE__ */ new Map();
314
322
  function buildsDir() {
315
323
  return import_node_path2.default.join(kotlinHome(), "builds");
@@ -336,7 +344,7 @@ async function kotlinArtifact(root, moduleRoot, origin) {
336
344
  }
337
345
  generated["PeachEntry.kt"] = entrySource(ids);
338
346
  if (viewIds.length > 0) generated["PeachViews.kt"] = viewsSource(viewIds);
339
- const shims = kotlinSources(import_node_path2.default.join(moduleRoot, "Sources")).filter(
347
+ const shims = kotlinSources(import_node_path2.default.join(moduleRoot, "Sources"), /* @__PURE__ */ new Set()).filter(
340
348
  (file) => usesCompose || !file.endsWith("/OneNativeSourceViewDispatch.kt")
341
349
  );
342
350
  if (viewIds.length > 0)
@@ -346,6 +354,261 @@ async function kotlinArtifact(root, moduleRoot, origin) {
346
354
  origin
347
355
  );
348
356
  }
357
+ function readExpoField(value) {
358
+ if (!isRecord(value) || typeof value.name !== "string" || typeof value.key !== "string" || typeof value.required !== "boolean" || typeof value.mutable !== "boolean" || typeof value.hidden !== "boolean")
359
+ throw new Error("expo-types printed an invalid field");
360
+ const range = value.initializer;
361
+ if (range !== null && (!Array.isArray(range) || range.length !== 2 || typeof range[0] !== "number" || typeof range[1] !== "number"))
362
+ throw new Error("expo-types printed an invalid initializer range");
363
+ return {
364
+ name: value.name,
365
+ key: value.key,
366
+ required: value.required,
367
+ mutable: value.mutable,
368
+ hidden: value.hidden,
369
+ initializer: range === null ? null : [range[0], range[1]]
370
+ };
371
+ }
372
+ function readExpoTypes(output) {
373
+ return output.split("\n").filter((line) => line.startsWith("{")).map((line) => {
374
+ const row = JSON.parse(line);
375
+ if (!isRecord(row) || typeof row.file !== "string" || typeof row.package !== "string" || !Array.isArray(row.records) || !Array.isArray(row.enums) || !Array.isArray(row.views) || !Array.isArray(row.props))
376
+ throw new Error("expo-types printed an invalid file");
377
+ return {
378
+ file: row.file,
379
+ package: row.package,
380
+ records: row.records.map((record) => {
381
+ if (!isRecord(record) || typeof record.name !== "string" || typeof record.hidden !== "boolean" || !Array.isArray(record.fields))
382
+ throw new Error("expo-types printed an invalid record");
383
+ return {
384
+ name: record.name,
385
+ hidden: record.hidden,
386
+ fields: record.fields.map(readExpoField)
387
+ };
388
+ }),
389
+ enums: row.enums.map((entry) => {
390
+ if (!isRecord(entry) || typeof entry.name !== "string" || typeof entry.hidden !== "boolean" || typeof entry.fields !== "number" || entry.parameter !== null && typeof entry.parameter !== "string" || typeof entry.hiddenParameter !== "boolean")
391
+ throw new Error("expo-types printed an invalid enum");
392
+ return {
393
+ name: entry.name,
394
+ hidden: entry.hidden,
395
+ fields: entry.fields,
396
+ parameter: entry.parameter,
397
+ hiddenParameter: entry.hiddenParameter
398
+ };
399
+ }),
400
+ views: row.views.map((view) => {
401
+ if (!isRecord(view) || typeof view.name !== "string" || typeof view.hidden !== "boolean" || typeof view.props !== "string")
402
+ throw new Error("expo-types printed an invalid view");
403
+ return { name: view.name, hidden: view.hidden, props: view.props };
404
+ }),
405
+ props: row.props.map((entry) => {
406
+ if (!isRecord(entry) || typeof entry.name !== "string" || typeof entry.hidden !== "boolean" || !Array.isArray(entry.states) || !entry.states.every((state) => typeof state === "string"))
407
+ throw new Error("expo-types printed invalid compose props");
408
+ return { name: entry.name, hidden: entry.hidden, states: entry.states };
409
+ })
410
+ };
411
+ });
412
+ }
413
+ var expoTypeScans = /* @__PURE__ */ new Map();
414
+ function scanExpoTypes(toolchain, script, sources) {
415
+ const candidates = sources.filter(
416
+ (file) => /\bRecord\b|\benum\s+class\b|\bExpoComposeView\b|\bExpoView\b|\bComposeProps\b/.test(
417
+ import_node_fs.default.readFileSync(file, "utf8")
418
+ )
419
+ );
420
+ if (candidates.length === 0) return Promise.resolve([]);
421
+ const digest = (0, import_node_crypto.createHash)("sha256");
422
+ for (const file of [script, ...candidates])
423
+ digest.update(`${file}\0${import_node_fs.default.readFileSync(file, "utf8")}\0`);
424
+ const key = digest.digest("hex");
425
+ let scan = expoTypeScans.get(key);
426
+ if (!scan) {
427
+ scan = (async () => {
428
+ const { kotlinc } = await ensureToolchain(toolchain);
429
+ const { stdout } = await run(
430
+ import_node_path2.default.join(import_node_path2.default.dirname(kotlinc), "kotlinc"),
431
+ [
432
+ "-cp",
433
+ import_node_path2.default.resolve(import_node_path2.default.dirname(kotlinc), "../lib/kotlin-compiler.jar"),
434
+ "-script",
435
+ script,
436
+ ...candidates
437
+ ],
438
+ { maxBuffer: 16 * 1024 * 1024 }
439
+ );
440
+ return readExpoTypes(stdout);
441
+ })().catch((error) => {
442
+ expoTypeScans.delete(key);
443
+ throw error;
444
+ });
445
+ expoTypeScans.set(key, scan);
446
+ }
447
+ return scan;
448
+ }
449
+ function expoTypeSources(files) {
450
+ const generated = {};
451
+ const origins = {};
452
+ const registrations = [];
453
+ files.forEach((file, index) => {
454
+ const edits = [];
455
+ const calls = [];
456
+ for (const record of file.records) {
457
+ const fields = [];
458
+ for (const field of record.fields) {
459
+ if (field.initializer)
460
+ edits.push({ range: field.initializer, owner: record.name, field });
461
+ if (field.hidden) {
462
+ if (!field.initializer)
463
+ throw new Error(
464
+ `${file.file}: @Field ${record.name}.${field.name} is private and has no initializer, which Peach cannot set`
465
+ );
466
+ continue;
467
+ }
468
+ const name = literal(field.key);
469
+ const read = `{ record: ${record.name} -> record.${field.name} }`;
470
+ const write = field.mutable && !field.initializer ? `{ record, value -> record.${field.name} = value }` : "null";
471
+ fields.push(
472
+ ` dev.peach.expo.PeachExpoTypes.field(${name}, ${field.required}, ${read}, ${write}),`
473
+ );
474
+ }
475
+ if (record.hidden) continue;
476
+ calls.push(
477
+ [
478
+ ` dev.peach.expo.PeachExpoTypes.record(${record.name}::class, ${literal(file.package ? `${file.package}.${record.name}` : record.name)}, { ${record.name}() }, listOf(`,
479
+ ...fields,
480
+ " ))"
481
+ ].join("\n")
482
+ );
483
+ }
484
+ for (const entry of file.enums) {
485
+ if (entry.hidden) continue;
486
+ if (entry.hiddenParameter)
487
+ throw new Error(
488
+ `${file.file}: enum ${entry.name} keeps its value in a private property, which Peach cannot read`
489
+ );
490
+ const value = entry.fields === 1 ? `{ it.${entry.parameter} }` : "null";
491
+ calls.push(
492
+ ` dev.peach.expo.PeachExpoTypes.enum(${entry.name}::class, enumValues<${entry.name}>(), ${entry.fields}, ${entry.parameter === null ? "null" : literal(entry.parameter)}, ${value})`
493
+ );
494
+ }
495
+ const views = [
496
+ ...file.views.filter((view) => !view.hidden).map(
497
+ (view) => ` dev.peach.expo.PeachExpoTypes.view(${view.name}::class, ${view.props ? `${view.props}::class` : "null"}) { context, appContext -> ${view.name}(context, appContext) }`
498
+ ),
499
+ ...file.props.filter((entry) => !entry.hidden).map(
500
+ (entry) => [
501
+ ` dev.peach.expo.PeachExpoTypes.composeProps(${entry.name}::class, listOf(`,
502
+ ...entry.states.map(
503
+ (state) => ` dev.peach.expo.PeachExpoCompose.prop(${literal(state)}) { props: ${entry.name} -> props.${state} },`
504
+ ),
505
+ " ))"
506
+ ].join("\n")
507
+ )
508
+ ];
509
+ if (edits.length > 0 || views.length > 0) {
510
+ let text = import_node_fs.default.readFileSync(file.file, "utf8").replaceAll("\r\n", "\n");
511
+ for (const { range, owner, field } of edits.sort((a, b) => b.range[0] - a.range[0]))
512
+ text = `${text.slice(0, range[0])}dev.peach.expo.PeachExpoTypes.initial(${owner}::class, ${literal(field.key)}, ${field.required}) { ${text.slice(range[0], range[1])} }${text.slice(range[1])}`;
513
+ if (views.length > 0) {
514
+ text = [
515
+ text,
516
+ "",
517
+ `internal fun peachExpoViews${index}() {`,
518
+ ...views,
519
+ "}",
520
+ ""
521
+ ].join("\n");
522
+ registrations.push(
523
+ `${file.package ? `${file.package}.` : ""}peachExpoViews${index}()`
524
+ );
525
+ }
526
+ const name = `PeachExpoSource_${index}_${import_node_path2.default.basename(file.file)}`;
527
+ generated[name] = text;
528
+ origins[name] = file.file;
529
+ }
530
+ if (calls.length === 0) return;
531
+ generated[`PeachExpoTypes_${index}.kt`] = [
532
+ ...file.package ? [`package ${file.package}`, ""] : [],
533
+ `internal fun peachExpoTypes${index}() {`,
534
+ ...calls,
535
+ "}",
536
+ ""
537
+ ].join("\n");
538
+ registrations.push(
539
+ `${file.package ? `${file.package}.` : ""}peachExpoTypes${index}()`
540
+ );
541
+ });
542
+ return { generated, origins, registrations };
543
+ }
544
+ async function expoKotlinArtifact(root, moduleRoot, origin, modules) {
545
+ const toolchain = readToolchain(moduleRoot);
546
+ const language = appKotlinLanguage(root);
547
+ const scanned = await scanExpoTypes(
548
+ toolchain,
549
+ import_node_path2.default.join(moduleRoot, "tools/expo-types.main.kts"),
550
+ modules.sources
551
+ );
552
+ const usesCompose = scanned.some((file) => file.views.length > 0) || modules.sources.some(
553
+ (file) => /\bandroidx\.compose\./.test(import_node_fs.default.readFileSync(file, "utf8"))
554
+ );
555
+ const shims = [
556
+ ...kotlinSources(import_node_path2.default.join(moduleRoot, "Sources"), /* @__PURE__ */ new Set()).filter(
557
+ (file) => usesCompose || !file.endsWith("/OneNativeSourceViewDispatch.kt")
558
+ ),
559
+ ...kotlinSources(import_node_path2.default.join(moduleRoot, "ExpoSources"), /* @__PURE__ */ new Set()),
560
+ ...kotlinSources(import_node_path2.default.join(moduleRoot, "AndroidViewSources"), /* @__PURE__ */ new Set()),
561
+ ...usesCompose ? [
562
+ ...kotlinSources(import_node_path2.default.join(moduleRoot, "ComposeSources")),
563
+ ...kotlinSources(import_node_path2.default.join(moduleRoot, "ExpoComposeSources"), /* @__PURE__ */ new Set())
564
+ ] : []
565
+ ];
566
+ const types = expoTypeSources(scanned);
567
+ const rewritten = new Set(Object.values(types.origins));
568
+ const entry = [
569
+ "@file:OptIn(kotlin.js.ExperimentalJsExport::class)",
570
+ "",
571
+ "import dev.peach.expo.PeachExpoRuntime",
572
+ "",
573
+ "private val registered by lazy {",
574
+ ...types.registrations.map((call) => ` ${call}`),
575
+ " PeachExpoRuntime.register(listOf(",
576
+ ...modules.modules.map(
577
+ ({ classifier, name }) => ` { ${classifier}() } to ${name === null ? "null" : JSON.stringify(name)},`
578
+ ),
579
+ " ))",
580
+ "}",
581
+ "",
582
+ "@JsExport fun peachExpoListen(notify: () -> Unit) {",
583
+ " registered",
584
+ " PeachExpoRuntime.listen(notify)",
585
+ "}",
586
+ "",
587
+ "@JsExport fun peachExpoCall(payload: String): String {",
588
+ " registered",
589
+ " return PeachExpoRuntime.dispatch(payload)",
590
+ "}",
591
+ ""
592
+ ].join("\n");
593
+ const artifact = await compileKotlin(
594
+ {
595
+ root,
596
+ toolchain,
597
+ language,
598
+ sources: modules.sources.filter((file) => !rewritten.has(file)),
599
+ generated: {
600
+ ...types.generated,
601
+ "PeachExpoEntry.kt": entry,
602
+ ...usesCompose ? { "PeachViews.kt": viewsSource([]) } : {}
603
+ },
604
+ origins: types.origins,
605
+ shims,
606
+ usesCompose
607
+ },
608
+ origin
609
+ );
610
+ return { ...artifact, compose: usesCompose };
611
+ }
349
612
  function viewsSource(viewIds) {
350
613
  return [
351
614
  "import dev.onejs.one.OneNativeSourceViewDispatch",
@@ -391,8 +654,8 @@ async function kotlinAppArtifact(app, moduleRoot, origin) {
391
654
  "import androidx.lifecycle.createSavedStateHandle",
392
655
  "",
393
656
  "@JsExport",
394
- "fun peachAppMount(density: Float, fontScale: Float, locale: String, backend: String, stencilBits: Int,",
395
- " regular: String, medium: String, bold: String, insets: String, night: Boolean,",
657
+ "fun peachAppMount(density: Float, fontScale: Float, locale: String,",
658
+ " font: String, insets: String, night: Boolean,",
396
659
  " invalidate: (Boolean) -> Unit): String = dev.peach.app.peachStartApp(",
397
660
  " dev.peach.app.PeachAppSpec(",
398
661
  ` android.content.ComponentName(${literal(app.packageName)}, ${literal(app.launcher.name)}),`,
@@ -406,8 +669,9 @@ async function kotlinAppArtifact(app, moduleRoot, origin) {
406
669
  " androidx.lifecycle.viewmodel.viewModelFactory {",
407
670
  ...viewModels.map(viewModelInitializer),
408
671
  " },",
672
+ ` ${app.predictiveBack},`,
409
673
  " ),",
410
- " density, fontScale, locale, backend, stencilBits, regular, medium, bold, insets, night, invalidate,",
674
+ " density, fontScale, locale, font, insets, night, invalidate,",
411
675
  ")",
412
676
  "",
413
677
  "@JsExport",
@@ -420,7 +684,10 @@ async function kotlinAppArtifact(app, moduleRoot, origin) {
420
684
  "fun peachAppNight(night: Boolean) = dev.peach.app.peachAppNight(night)",
421
685
  "",
422
686
  "@JsExport",
423
- "fun peachAppIme(bottom: Int) = dev.peach.app.peachAppIme(bottom)",
687
+ "fun peachAppIme(bottom: Int, visible: Boolean) = dev.peach.app.peachAppIme(bottom, visible)",
688
+ "",
689
+ "@JsExport",
690
+ "fun peachAppInsets(insets: String, visibleSystemBars: Int) = dev.peach.app.peachAppInsets(insets, visibleSystemBars)",
424
691
  ""
425
692
  ].join("\n");
426
693
  const generated = {
@@ -430,9 +697,10 @@ async function kotlinAppArtifact(app, moduleRoot, origin) {
430
697
  ...appResourceSources(app)
431
698
  };
432
699
  const shims = [
433
- ...kotlinSources(import_node_path2.default.join(moduleRoot, "Sources")),
700
+ ...kotlinSources(import_node_path2.default.join(moduleRoot, "Sources"), /* @__PURE__ */ new Set()),
434
701
  ...kotlinSources(import_node_path2.default.join(moduleRoot, "ComposeSources")),
435
- ...kotlinSources(import_node_path2.default.join(moduleRoot, "AppSources"), /* @__PURE__ */ new Set())
702
+ ...kotlinSources(import_node_path2.default.join(moduleRoot, "AppSources"), /* @__PURE__ */ new Set()),
703
+ ...kotlinSources(import_node_path2.default.join(moduleRoot, "AndroidViewSources"), /* @__PURE__ */ new Set())
436
704
  ];
437
705
  return compileKotlin(
438
706
  {
@@ -622,6 +890,7 @@ async function compileKotlin(input, origin) {
622
890
  language,
623
891
  sources,
624
892
  generated,
893
+ origins = {},
625
894
  shims,
626
895
  usesCompose,
627
896
  viewModels
@@ -667,6 +936,7 @@ async function compileKotlin(input, origin) {
667
936
  const common = [
668
937
  // the full upstream Compose graph exceeds kotlinc's 512 mib default heap.
669
938
  "-J-Xmx2g",
939
+ "-Xallow-kotlin-package",
670
940
  "-Xwasm-target=js",
671
941
  "-libraries",
672
942
  libraries.join(import_node_path2.default.delimiter)
@@ -728,16 +998,50 @@ async function compileKotlin(input, origin) {
728
998
  ],
729
999
  { maxBuffer: 16 * 1024 * 1024 }
730
1000
  );
731
- if (usesCompose)
1001
+ if (usesCompose) {
732
1002
  await run("unzip", [
733
1003
  "-q",
734
1004
  "-j",
735
1005
  composeRuntime,
736
1006
  "skiko.mjs",
737
- "skiko.wasm",
738
1007
  "-d",
739
1008
  import_node_path2.default.join(work, "js")
740
1009
  ]);
1010
+ const skikoPath = import_node_path2.default.join(work, "js", "skiko.mjs");
1011
+ const upstream = (0, import_acorn.parse)(import_node_fs.default.readFileSync(skikoPath, "utf8"), {
1012
+ ecmaVersion: "latest",
1013
+ sourceType: "module"
1014
+ });
1015
+ const bindings = [];
1016
+ for (const statement of upstream.body) {
1017
+ if (statement.type !== "ExportNamedDeclaration" || statement.declaration?.type !== "VariableDeclaration" || statement.declaration.kind !== "let")
1018
+ continue;
1019
+ for (const binding of statement.declaration.declarations) {
1020
+ if (binding.id.type !== "Identifier")
1021
+ throw new Error("Skiko binding must have one exported identifier");
1022
+ bindings.push(binding.id.name);
1023
+ }
1024
+ }
1025
+ if (bindings.length !== 967) throw new Error("pinned Skiko binding count changed");
1026
+ const names = [
1027
+ "awaitSkiko",
1028
+ "loadedWasm",
1029
+ "registerSkikoWasmReadyCallback",
1030
+ "skikoApi",
1031
+ "GL",
1032
+ ...bindings
1033
+ ];
1034
+ import_node_fs.default.writeFileSync(
1035
+ skikoPath,
1036
+ [
1037
+ "const runtime = globalThis.__peachKotlinSkiko;",
1038
+ "if (!runtime) throw Error('Kotlin tenant runtime was not installed before guest evaluation');",
1039
+ `for (const name of ${JSON.stringify(names)}) if (!(name in runtime)) throw Error('Kotlin tenant runtime has no ' + name);`,
1040
+ ...names.map((name) => `export const ${name} = runtime.${name};`),
1041
+ ""
1042
+ ].join("\n")
1043
+ );
1044
+ }
741
1045
  if (usesCompose) {
742
1046
  for (const library of toolchain.composeJsLibraries) {
743
1047
  let imported = false;
@@ -770,7 +1074,9 @@ async function compileKotlin(input, origin) {
770
1074
  }
771
1075
  } catch (error) {
772
1076
  import_node_fs.default.rmSync(work, { recursive: true, force: true });
773
- const output = isRecord(error) ? `${String(error.stderr ?? "")}${String(error.stdout ?? "")}` : "";
1077
+ let output = isRecord(error) ? `${String(error.stderr ?? "")}${String(error.stdout ?? "")}` : "";
1078
+ for (const [name, source] of Object.entries(origins))
1079
+ output = output.replaceAll(import_node_path2.default.join(generatedDir, name), source);
774
1080
  throw new Error(
775
1081
  `kotlin compile failed:
776
1082
  ${output.trim() || (error instanceof Error ? error.message : String(error))}`
@@ -818,6 +1124,14 @@ var CONTENT_TYPES = {
818
1124
  ".mjs": "text/javascript",
819
1125
  ".wasm": "application/wasm"
820
1126
  };
1127
+ function kotlinArtifactFiles(hash) {
1128
+ const dir = import_node_path2.default.join(buildsDir(), hash, "js");
1129
+ return import_node_fs.default.readdirSync(dir).sort().map((name) => {
1130
+ const contentType = CONTENT_TYPES[import_node_path2.default.extname(name)];
1131
+ if (!contentType) throw new Error(`unexpected kotlin artifact file ${name}`);
1132
+ return { name, bytes: import_node_fs.default.readFileSync(import_node_path2.default.join(dir, name)), contentType };
1133
+ });
1134
+ }
821
1135
  function serveKotlinArtifact(pathname, res) {
822
1136
  if (!pathname.startsWith(KOTLIN_ARTIFACT_PREFIX)) return false;
823
1137
  const [hash, file, ...rest] = pathname.slice(KOTLIN_ARTIFACT_PREFIX.length).split("/");
@@ -840,11 +1154,8 @@ function serveKotlinArtifact(pathname, res) {
840
1154
  return true;
841
1155
  }
842
1156
  var KOTLIN_PACKAGE_PATH = "/__peach/kotlin-package";
843
- function peachKotlinModuleRoot(root) {
844
- const peachsimPackage = (0, import_node_module.createRequire)(import_node_path2.default.join(root, "package.json")).resolve(
845
- "peachsim/package.json"
846
- );
847
- return import_node_path2.default.join(import_node_path2.default.dirname(peachsimPackage), "kotlin");
1157
+ function peachKotlinModuleRoot() {
1158
+ return import_node_path2.default.resolve(import_node_path2.default.dirname((0, import_node_url.fileURLToPath)(__sootsim_import_meta_url)), "..", "kotlin");
848
1159
  }
849
1160
  async function serveKotlinRequest(pathname, res, app) {
850
1161
  if (serveKotlinArtifact(pathname, res)) return true;
@@ -862,8 +1173,10 @@ async function serveKotlinRequest(pathname, res, app) {
862
1173
  }
863
1174
  // Annotate the CommonJS export names for ESM import in node:
864
1175
  0 && (module.exports = {
1176
+ expoKotlinArtifact,
865
1177
  kotlinAppArtifact,
866
1178
  kotlinArtifact,
1179
+ kotlinArtifactFiles,
867
1180
  kotlinSources,
868
1181
  peachKotlinModuleRoot,
869
1182
  serveKotlinArtifact,
package/dist-lib/menu.cjs CHANGED
@@ -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;
package/dist-lib/menu.mjs CHANGED
@@ -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/public-brand.ts
4
4
  var name = "Peach";
@@ -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/is-record.ts
4
4
  function isRecord(value) {
@@ -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;
@@ -28,15 +28,15 @@ __export(metro_production_bundle_exports, {
28
28
  detachRNXMetroSourceMapUrl: () => detachRNXMetroSourceMapUrl,
29
29
  readRNXMetroBundleLayout: () => readRNXMetroBundleLayout,
30
30
  readRNXMetroModuleIdentity: () => readRNXMetroModuleIdentity,
31
- toRNXDevelopmentBundleUrl: () => toRNXDevelopmentBundleUrl,
32
- toRNXProductionBundleUrl: () => toRNXProductionBundleUrl,
31
+ toPeachDevelopmentBundleUrl: () => toPeachDevelopmentBundleUrl,
32
+ toPeachProductionBundleUrl: () => toPeachProductionBundleUrl,
33
33
  validateRNXMetroModuleIdentity: () => validateRNXMetroModuleIdentity,
34
34
  validateRNXMetroModulePaths: () => validateRNXMetroModulePaths
35
35
  });
36
36
  module.exports = __toCommonJS(metro_production_bundle_exports);
37
37
  var RNXSIM_METRO_MODULE_PATHS_PREFIX = "globalThis.__sootsimModulePaths=";
38
38
  var RNX_METRO_MODULE_IDENTITY_VERSION = 2;
39
- function toRNXProductionBundleUrl(bundleUrl) {
39
+ function toPeachProductionBundleUrl(bundleUrl) {
40
40
  const relative = bundleUrl.startsWith("/");
41
41
  const url = new URL(bundleUrl, "http://peachsim.local");
42
42
  url.searchParams.set("dev", "false");
@@ -44,7 +44,7 @@ function toRNXProductionBundleUrl(bundleUrl) {
44
44
  url.searchParams.set("minify", "true");
45
45
  return relative ? `${url.pathname}${url.search}${url.hash}` : url.toString();
46
46
  }
47
- function toRNXDevelopmentBundleUrl(bundleUrl) {
47
+ function toPeachDevelopmentBundleUrl(bundleUrl) {
48
48
  const relative = bundleUrl.startsWith("/");
49
49
  const url = new URL(bundleUrl, "http://peachsim.local");
50
50
  url.searchParams.set("dev", "true");
@@ -322,8 +322,8 @@ function validateRNXMetroModuleIdentity(identity) {
322
322
  detachRNXMetroSourceMapUrl,
323
323
  readRNXMetroBundleLayout,
324
324
  readRNXMetroModuleIdentity,
325
- toRNXDevelopmentBundleUrl,
326
- toRNXProductionBundleUrl,
325
+ toPeachDevelopmentBundleUrl,
326
+ toPeachProductionBundleUrl,
327
327
  validateRNXMetroModuleIdentity,
328
328
  validateRNXMetroModulePaths
329
329
  });
@@ -1,9 +1,9 @@
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/metro-production-bundle.ts
4
4
  var RNXSIM_METRO_MODULE_PATHS_PREFIX = "globalThis.__sootsimModulePaths=";
5
5
  var RNX_METRO_MODULE_IDENTITY_VERSION = 2;
6
- function toRNXProductionBundleUrl(bundleUrl) {
6
+ function toPeachProductionBundleUrl(bundleUrl) {
7
7
  const relative = bundleUrl.startsWith("/");
8
8
  const url = new URL(bundleUrl, "http://peachsim.local");
9
9
  url.searchParams.set("dev", "false");
@@ -11,7 +11,7 @@ function toRNXProductionBundleUrl(bundleUrl) {
11
11
  url.searchParams.set("minify", "true");
12
12
  return relative ? `${url.pathname}${url.search}${url.hash}` : url.toString();
13
13
  }
14
- function toRNXDevelopmentBundleUrl(bundleUrl) {
14
+ function toPeachDevelopmentBundleUrl(bundleUrl) {
15
15
  const relative = bundleUrl.startsWith("/");
16
16
  const url = new URL(bundleUrl, "http://peachsim.local");
17
17
  url.searchParams.set("dev", "true");
@@ -288,8 +288,8 @@ export {
288
288
  detachRNXMetroSourceMapUrl,
289
289
  readRNXMetroBundleLayout,
290
290
  readRNXMetroModuleIdentity,
291
- toRNXDevelopmentBundleUrl,
292
- toRNXProductionBundleUrl,
291
+ toPeachDevelopmentBundleUrl,
292
+ toPeachProductionBundleUrl,
293
293
  validateRNXMetroModuleIdentity,
294
294
  validateRNXMetroModulePaths
295
295
  };