peachsim 0.1.940 → 0.1.1400

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 (398) hide show
  1. package/README.md +28 -22
  2. package/cli/app-catalog.ts +29 -14
  3. package/cli/app-fonts.ts +17 -8
  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 +107 -95
  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 +19 -16
  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 +50 -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/screenshot-output.ts +17 -0
  77. package/cli/send-to-box.ts +3 -3
  78. package/cli/shell-init.ts +2 -1
  79. package/cli/ws-bridge.ts +9 -5
  80. package/detox/element-types.ts +1 -0
  81. package/detox/gestures.ts +3 -3
  82. package/detox/index.ts +67 -38
  83. package/detox/navigation-lifecycle.ts +9 -6
  84. package/detox/proof-frame.cjs +6 -4
  85. package/dist-lib/agent-daemon-client.cjs +1 -1
  86. package/dist-lib/agent-events.cjs +1 -1
  87. package/dist-lib/attached-projects.cjs +1 -1
  88. package/dist-lib/auth/shared-session.cjs +1 -1
  89. package/dist-lib/backend-origin.cjs +1 -1
  90. package/dist-lib/beta.cjs +1 -1
  91. package/dist-lib/beta.mjs +1 -1
  92. package/dist-lib/bridge-constants.cjs +1 -1
  93. package/dist-lib/bridge-contract-input.cjs +42 -17
  94. package/dist-lib/bridge-contract-input.mjs +41 -16
  95. package/dist-lib/bridge-contract.cjs +1 -4
  96. package/dist-lib/bridge-contract.mjs +1 -3
  97. package/dist-lib/bundle-channel.cjs +2918 -550
  98. package/dist-lib/capture-contract.cjs +65 -24
  99. package/dist-lib/capture-contract.mjs +63 -24
  100. package/dist-lib/cloud-contract.cjs +2 -2
  101. package/dist-lib/cloud-contract.mjs +2 -2
  102. package/dist-lib/cloud-test-args.cjs +1 -1
  103. package/dist-lib/cloud-test-args.mjs +1 -1
  104. package/dist-lib/cloud.cjs +3 -3
  105. package/dist-lib/cloud.mjs +3 -3
  106. package/dist-lib/config.cjs +15 -5
  107. package/dist-lib/config.mjs +154 -0
  108. package/dist-lib/detox/index.cjs +495 -139
  109. package/dist-lib/dev-bundle-resolution.cjs +3 -1
  110. package/dist-lib/expo-swift-bundle.cjs +1168 -238
  111. package/dist-lib/expo-swift-metadata.cjs +34 -23
  112. package/dist-lib/expo-swift-metadata.mjs +32 -23
  113. package/dist-lib/home-paths.cjs +2 -2
  114. package/dist-lib/host/bridge-host.cjs +2938 -654
  115. package/dist-lib/host/fetch-proxy-handler.cjs +14 -1
  116. package/dist-lib/host/fetch-proxy-overrides.cjs +7 -1
  117. package/dist-lib/host/fetch-proxy-overrides.mjs +5 -1
  118. package/dist-lib/host/replacement-module-handler.cjs +2 -2
  119. package/dist-lib/host/websocket-proxy.cjs +1 -1
  120. package/dist-lib/index.cjs +981 -353
  121. package/dist-lib/jump-to-source-babel.cjs +1 -1
  122. package/dist-lib/jump-to-source-native.cjs +1 -1
  123. package/dist-lib/kotlin-host.cjs +332 -19
  124. package/dist-lib/menu.cjs +1 -1
  125. package/dist-lib/menu.mjs +1 -1
  126. package/dist-lib/metro-fingerprint-registry.cjs +1 -1
  127. package/dist-lib/metro-fingerprint-registry.mjs +1 -1
  128. package/dist-lib/metro-production-bundle.cjs +7 -7
  129. package/dist-lib/metro-production-bundle.mjs +5 -5
  130. package/dist-lib/metro.cjs +670 -250
  131. package/dist-lib/native-app-identity-project.cjs +2647 -0
  132. package/dist-lib/native-app-identity-project.mjs +1257 -0
  133. package/dist-lib/native-app-identity.cjs +304 -25
  134. package/dist-lib/native-app-identity.mjs +302 -25
  135. package/dist-lib/native-firebase-metadata.cjs +1 -1
  136. package/dist-lib/native-firebase-metadata.mjs +1 -1
  137. package/dist-lib/plist.cjs +1 -1
  138. package/dist-lib/plist.mjs +1 -1
  139. package/dist-lib/profiles.cjs +1 -1
  140. package/dist-lib/public-brand.cjs +1 -1
  141. package/dist-lib/react-native-host-modules.cjs +5 -1
  142. package/dist-lib/react-native-host-modules.mjs +5 -1
  143. package/dist-lib/scripts/dev-server-scanner.cjs +57 -32
  144. package/dist-lib/sdk.cjs +231 -51
  145. package/dist-lib/sdk.mjs +231 -51
  146. package/dist-lib/skills.cjs +4114 -1376
  147. package/dist-lib/swift-compile.cjs +290 -30
  148. package/dist-lib/swift-compile.mjs +290 -30
  149. package/dist-lib/swift-package.cjs +143 -12
  150. package/dist-lib/swift-package.mjs +137 -11
  151. package/dist-lib/swift-submit.cjs +47 -5
  152. package/dist-lib/swift-submit.mjs +42 -5
  153. package/dist-lib/swift-toolchain.cjs +7 -2
  154. package/dist-lib/swift.cjs +1 -1
  155. package/dist-lib/vite-swift.cjs +1392 -458
  156. package/dist-lib/vite.cjs +13 -17
  157. package/dist-lib/worklet-executable.cjs +248 -33
  158. package/dist-lib/worklet-executable.mjs +248 -33
  159. package/install.sh +10 -1
  160. package/kotlin/{AppSources → AndroidViewSources}/android/content/res/Resources.kt +9 -9
  161. package/kotlin/AndroidViewSources/android/graphics/Canvas.kt +20 -0
  162. package/kotlin/AndroidViewSources/android/view/View.kt +211 -0
  163. package/kotlin/AndroidViewSources/android/widget/FrameLayout.kt +61 -0
  164. package/kotlin/AndroidViewSources/android/widget/LinearLayout.kt +49 -0
  165. package/kotlin/AppSources/android/view/Window.kt +36 -0
  166. package/kotlin/AppSources/android/view/WindowInsets.kt +9 -0
  167. package/kotlin/AppSources/android/view/WindowInsetsController.kt +5 -0
  168. package/kotlin/AppSources/android/window/OnBackInvokedDispatcher.kt +48 -0
  169. package/kotlin/AppSources/androidx/activity/OnBackPressedDispatcher.kt +20 -5
  170. package/kotlin/AppSources/androidx/compose/foundation/layout/WindowInsets.kt +15 -0
  171. package/kotlin/AppSources/androidx/compose/ui/platform/ComposeView.kt +2 -1
  172. package/kotlin/AppSources/dev/peach/app/PeachApp.kt +42 -50
  173. package/kotlin/ComposeSources/PeachComposeHost.kt +200 -84
  174. package/kotlin/ExpoComposeSources/PeachAndroidView.kt +87 -0
  175. package/kotlin/ExpoComposeSources/PeachExpoViewMount.kt +24 -0
  176. package/kotlin/ExpoComposeSources/dev/peach/expo/PeachExpoCompose.kt +28 -0
  177. package/kotlin/ExpoComposeSources/expo/modules/kotlin/views/ExpoComposeView.kt +70 -0
  178. package/kotlin/ExpoSources/dev/peach/expo/PeachExpoRuntime.kt +513 -0
  179. package/kotlin/ExpoSources/dev/peach/expo/PeachExpoTypes.kt +173 -0
  180. package/kotlin/ExpoSources/expo/modules/kotlin/AppContext.kt +20 -0
  181. package/kotlin/ExpoSources/expo/modules/kotlin/Promise.kt +19 -0
  182. package/kotlin/ExpoSources/expo/modules/kotlin/classcomponent/ClassComponentBuilder.kt +198 -0
  183. package/kotlin/ExpoSources/expo/modules/kotlin/exception/CodedException.kt +126 -0
  184. package/kotlin/ExpoSources/expo/modules/kotlin/functions/Functions.kt +132 -0
  185. package/kotlin/ExpoSources/expo/modules/kotlin/jni/JavaScriptTypedArray.kt +81 -0
  186. package/kotlin/ExpoSources/expo/modules/kotlin/modules/Module.kt +98 -0
  187. package/kotlin/ExpoSources/expo/modules/kotlin/objects/ObjectDefinitionBuilder.kt +236 -0
  188. package/kotlin/ExpoSources/expo/modules/kotlin/records/Record.kt +12 -0
  189. package/kotlin/ExpoSources/expo/modules/kotlin/runtime/Runtime.kt +9 -0
  190. package/kotlin/ExpoSources/expo/modules/kotlin/sharedobjects/SharedObject.kt +50 -0
  191. package/kotlin/ExpoSources/expo/modules/kotlin/sharedobjects/SharedObjectRegistry.kt +57 -0
  192. package/kotlin/ExpoSources/expo/modules/kotlin/sharedobjects/SharedRef.kt +19 -0
  193. package/kotlin/ExpoSources/expo/modules/kotlin/typedarray/ConcreteTypedArrays.kt +158 -0
  194. package/kotlin/ExpoSources/expo/modules/kotlin/typedarray/GenericTypedArray.kt +8 -0
  195. package/kotlin/ExpoSources/expo/modules/kotlin/typedarray/TypedArray.kt +29 -0
  196. package/kotlin/ExpoSources/expo/modules/kotlin/typedarray/TypedArrayIterator.kt +9 -0
  197. package/kotlin/ExpoSources/expo/modules/kotlin/types/AnyType.kt +155 -0
  198. package/kotlin/ExpoSources/expo/modules/kotlin/types/Either.kt +91 -0
  199. package/kotlin/ExpoSources/expo/modules/kotlin/types/Enumerable.kt +6 -0
  200. package/kotlin/ExpoSources/expo/modules/kotlin/viewevent/ViewEvent.kt +54 -0
  201. package/kotlin/ExpoSources/expo/modules/kotlin/views/ExpoView.kt +23 -0
  202. package/kotlin/ExpoSources/expo/modules/kotlin/views/ViewDefinitionBuilder.kt +71 -0
  203. package/kotlin/ExpoSources/expo/modules/kotlin/views/ViewProps.kt +35 -0
  204. package/kotlin/README.md +13 -3
  205. package/kotlin/Sources/android/os/Build.kt +17 -0
  206. package/kotlin/Sources/android/os/Handler.kt +35 -0
  207. package/kotlin/Sources/android/os/Looper.kt +17 -0
  208. package/kotlin/Sources/android/os/MessageQueue.kt +56 -0
  209. package/kotlin/Sources/android/os/SystemClock.kt +14 -0
  210. package/kotlin/Sources/android/util/Log.kt +64 -0
  211. package/kotlin/Sources/java/security/MessageDigest.kt +114 -0
  212. package/kotlin/Sources/kotlin/text/StringFormat.kt +9 -0
  213. package/kotlin/Sources/org/json/JSON.kt +44 -0
  214. package/kotlin/fixtures/counter/Counter.d.kt.ts +1 -0
  215. package/kotlin/fixtures/counter/Counter.kt +10 -3
  216. package/kotlin/fixtures/counter/CounterApp.native.tsx +1 -1
  217. package/kotlin/fixtures/counter/vite.config.ts +2 -2
  218. package/kotlin/fixtures/headless-counter/Headless.kt +7 -6
  219. package/kotlin/fixtures/import-animation/Animation.d.kt.ts +7 -0
  220. package/kotlin/fixtures/import-animation/Animation.kt +80 -0
  221. package/kotlin/fixtures/import-animation/ImportAnimation.native.tsx +13 -0
  222. package/kotlin/fixtures/import-animation/README.md +24 -0
  223. package/kotlin/fixtures/import-animation/app/_layout.tsx +4 -0
  224. package/kotlin/fixtures/import-animation/app/index+spa.tsx +1 -0
  225. package/kotlin/fixtures/import-animation/app/routes.d.ts +18 -0
  226. package/kotlin/fixtures/import-animation/package.json +23 -0
  227. package/kotlin/fixtures/import-animation/tsconfig.json +20 -0
  228. package/kotlin/fixtures/import-animation/vite.config.ts +20 -0
  229. package/kotlin/fixtures/import-editor/Editor.d.kt.ts +7 -0
  230. package/kotlin/fixtures/import-editor/Editor.kt +59 -0
  231. package/kotlin/fixtures/import-editor/ImportEditor.native.tsx +23 -0
  232. package/kotlin/fixtures/import-editor/README.md +27 -0
  233. package/kotlin/fixtures/import-editor/app/_layout.tsx +4 -0
  234. package/kotlin/fixtures/import-editor/app/index+spa.tsx +1 -0
  235. package/kotlin/fixtures/import-editor/package.json +23 -0
  236. package/kotlin/fixtures/import-editor/tsconfig.json +20 -0
  237. package/kotlin/fixtures/import-editor/vite.config.ts +20 -0
  238. package/kotlin/fixtures/import-effects/Effects.d.kt.ts +7 -0
  239. package/kotlin/fixtures/import-effects/Effects.kt +87 -0
  240. package/kotlin/fixtures/import-effects/ImportEffects.native.tsx +13 -0
  241. package/kotlin/fixtures/import-effects/README.md +19 -0
  242. package/kotlin/fixtures/import-effects/app/_layout.tsx +4 -0
  243. package/kotlin/fixtures/import-effects/app/index+spa.tsx +1 -0
  244. package/kotlin/fixtures/import-effects/package.json +23 -0
  245. package/kotlin/fixtures/import-effects/tsconfig.json +20 -0
  246. package/kotlin/fixtures/import-effects/vite.config.ts +20 -0
  247. package/kotlin/fixtures/import-layout/ImportLayout.native.tsx +13 -0
  248. package/kotlin/fixtures/import-layout/Layout.d.kt.ts +7 -0
  249. package/kotlin/fixtures/import-layout/Layout.kt +72 -0
  250. package/kotlin/fixtures/import-layout/README.md +24 -0
  251. package/kotlin/fixtures/import-layout/app/_layout.tsx +4 -0
  252. package/kotlin/fixtures/import-layout/app/index+spa.tsx +1 -0
  253. package/kotlin/fixtures/import-layout/package.json +23 -0
  254. package/kotlin/fixtures/import-layout/tsconfig.json +20 -0
  255. package/kotlin/fixtures/import-layout/vite.config.ts +20 -0
  256. package/kotlin/fixtures/import-navigation/ImportNavigation.native.tsx +18 -0
  257. package/kotlin/fixtures/import-navigation/Navigation.d.kt.ts +7 -0
  258. package/kotlin/fixtures/import-navigation/Navigation.kt +104 -0
  259. package/kotlin/fixtures/import-navigation/README.md +31 -0
  260. package/kotlin/fixtures/import-navigation/app/_layout.tsx +4 -0
  261. package/kotlin/fixtures/import-navigation/app/index+spa.tsx +1 -0
  262. package/kotlin/fixtures/import-navigation/package.json +23 -0
  263. package/kotlin/fixtures/import-navigation/tsconfig.json +20 -0
  264. package/kotlin/fixtures/import-navigation/vite.config.ts +20 -0
  265. package/kotlin/fixtures/import-overlays/ImportOverlays.native.tsx +29 -0
  266. package/kotlin/fixtures/import-overlays/Overlays.d.kt.ts +7 -0
  267. package/kotlin/fixtures/import-overlays/Overlays.kt +93 -0
  268. package/kotlin/fixtures/import-overlays/README.md +34 -0
  269. package/kotlin/fixtures/import-overlays/app/_layout.tsx +4 -0
  270. package/kotlin/fixtures/import-overlays/app/index+spa.tsx +1 -0
  271. package/kotlin/fixtures/import-overlays/package.json +23 -0
  272. package/kotlin/fixtures/import-overlays/tsconfig.json +20 -0
  273. package/kotlin/fixtures/import-overlays/vite.config.ts +20 -0
  274. package/kotlin/fixtures/import-scroll/ImportScroll.native.tsx +13 -0
  275. package/kotlin/fixtures/import-scroll/README.md +23 -0
  276. package/kotlin/fixtures/import-scroll/Scroll.d.kt.ts +7 -0
  277. package/kotlin/fixtures/import-scroll/Scroll.kt +91 -0
  278. package/kotlin/fixtures/import-scroll/app/_layout.tsx +4 -0
  279. package/kotlin/fixtures/import-scroll/app/index+spa.tsx +1 -0
  280. package/kotlin/fixtures/import-scroll/package.json +23 -0
  281. package/kotlin/fixtures/import-scroll/tsconfig.json +20 -0
  282. package/kotlin/fixtures/import-scroll/vite.config.ts +20 -0
  283. package/kotlin/fixtures/import-selection/ImportSelection.native.tsx +44 -0
  284. package/kotlin/fixtures/import-selection/README.md +32 -0
  285. package/kotlin/fixtures/import-selection/Selection.d.kt.ts +8 -0
  286. package/kotlin/fixtures/import-selection/Selection.kt +78 -0
  287. package/kotlin/fixtures/import-selection/app/_layout.tsx +4 -0
  288. package/kotlin/fixtures/import-selection/app/index+spa.tsx +1 -0
  289. package/kotlin/fixtures/import-selection/package.json +23 -0
  290. package/kotlin/fixtures/import-selection/tsconfig.json +20 -0
  291. package/kotlin/fixtures/import-selection/vite.config.ts +20 -0
  292. package/kotlin/fixtures/import-surfaces/ImportSurfaces.native.tsx +13 -0
  293. package/kotlin/fixtures/import-surfaces/README.md +22 -0
  294. package/kotlin/fixtures/import-surfaces/Surfaces.d.kt.ts +7 -0
  295. package/kotlin/fixtures/import-surfaces/Surfaces.kt +64 -0
  296. package/kotlin/fixtures/import-surfaces/app/_layout.tsx +4 -0
  297. package/kotlin/fixtures/import-surfaces/app/index+spa.tsx +1 -0
  298. package/kotlin/fixtures/import-surfaces/package.json +23 -0
  299. package/kotlin/fixtures/import-surfaces/tsconfig.json +20 -0
  300. package/kotlin/fixtures/import-surfaces/vite.config.ts +20 -0
  301. package/kotlin/fixtures/import-values/ImportValues.native.tsx +35 -0
  302. package/kotlin/fixtures/import-values/README.md +23 -0
  303. package/kotlin/fixtures/import-values/Values.d.kt.ts +11 -0
  304. package/kotlin/fixtures/import-values/Values.kt +66 -0
  305. package/kotlin/fixtures/import-values/app/_layout.tsx +4 -0
  306. package/kotlin/fixtures/import-values/app/index+spa.tsx +1 -0
  307. package/kotlin/fixtures/import-values/package.json +23 -0
  308. package/kotlin/fixtures/import-values/tsconfig.json +20 -0
  309. package/kotlin/fixtures/import-values/vite.config.ts +20 -0
  310. package/kotlin/fixtures/kotlin-app-variants/BarBehavior.kt +38 -0
  311. package/kotlin/fixtures/kotlin-app-variants/BarVisibility.kt +36 -0
  312. package/kotlin/fixtures/kotlin-app-variants/Ime.kt +3 -1
  313. package/kotlin/fixtures/kotlin-app-variants/TransientInsets.kt +50 -0
  314. package/kotlin/fork/NOTICE +6 -1
  315. package/kotlin/fork/README.md +15 -7
  316. package/kotlin/fork/build.sh +2 -0
  317. package/kotlin/fork/compose-worker-globals.patch +186 -4
  318. package/kotlin/fork/fork.json +2 -2
  319. package/kotlin/fork/skiko-worker-clock.patch +12 -0
  320. package/kotlin/toolchain.json +12 -12
  321. package/kotlin/tools/expo-types.main.kts +115 -0
  322. package/package.json +17 -23
  323. package/scripts/dev-server-scanner.ts +92 -66
  324. package/skills/contrast/SKILL.md +2 -2
  325. package/skills/peach-debug/SKILL.md +1 -1
  326. package/skills/peach-perf/SKILL.md +1 -1
  327. package/skills/peach-setup/SKILL.md +2 -1
  328. package/skills/peach-test/SKILL.md +8 -0
  329. package/src/assetCatalogContract.ts +43 -1
  330. package/src/bridge-contract-input.ts +46 -19
  331. package/src/bridge-contract.ts +0 -1
  332. package/src/bundle-channel.mjs +197 -84
  333. package/src/bundleGlobalFooter.ts +38 -0
  334. package/src/capture-contract.ts +107 -33
  335. package/src/cloud-contract.ts +5 -1
  336. package/src/cloud.ts +5 -2
  337. package/src/config.ts +22 -3
  338. package/src/configured-bundle-producer.ts +1 -1
  339. package/src/desktop-host-delivery.ts +95 -1
  340. package/src/dev-bundle-resolution.ts +1 -1
  341. package/src/expo-kotlin-bundle.ts +29 -0
  342. package/src/expo-kotlin-host.ts +201 -0
  343. package/src/expo-swift-host.ts +96 -76
  344. package/src/expoKotlinContract.ts +70 -0
  345. package/src/expoSwiftContract.ts +4 -25
  346. package/src/home-paths.ts +7 -4
  347. package/src/host/bridge-host.ts +23 -3
  348. package/src/host/fetch-proxy-handler.ts +13 -0
  349. package/src/host/fetch-proxy-overrides.ts +11 -0
  350. package/src/host/replacement-module-handler.ts +5 -2
  351. package/src/index.ts +3 -1
  352. package/src/kotlin-host.ts +463 -19
  353. package/src/metro-plugin.ts +56 -28
  354. package/src/metro-production-bundle.ts +2 -2
  355. package/src/native-app-identity-project.ts +190 -0
  356. package/src/native-app-identity.ts +367 -34
  357. package/src/native-firebase-config.ts +69 -15
  358. package/src/native-seam-manifest.ts +6 -0
  359. package/src/one-widget-discovery.ts +2 -1
  360. package/src/openstep-plist.ts +107 -0
  361. package/src/react-native-host-modules.ts +4 -0
  362. package/src/runtime-assets.ts +2 -2
  363. package/src/sim-client.ts +2 -2
  364. package/src/swift-binary-modules.ts +3 -1
  365. package/src/swift-compile.ts +286 -38
  366. package/src/swift-distribution-contract.ts +4 -0
  367. package/src/swift-distribution.lock.json +123 -12
  368. package/src/swift-distribution.ts +7 -3
  369. package/src/swift-host.ts +298 -83
  370. package/src/swift-package-manifest.ts +29 -2
  371. package/src/swift-package.ts +180 -10
  372. package/src/swift-packages.ts +4 -0
  373. package/src/swift-standin-emit.ts +4 -1
  374. package/src/swift-standins.ts +274 -15
  375. package/src/swift-submit.ts +62 -7
  376. package/src/swift-toolchain.ts +6 -1
  377. package/src/swiftContract.ts +126 -3
  378. package/src/vite-plugin-one.ts +13 -16
  379. package/src/vite-plugin-swift.ts +4 -5
  380. package/src/vite-plugin.ts +360 -144
  381. package/src/vite.d.ts +1 -1
  382. package/src/worker-system-chunks.ts +221 -0
  383. package/src/worklet-executable.ts +348 -38
  384. package/src/worklets-babel.ts +1 -1
  385. package/src/xcode-project.ts +243 -127
  386. package/dist-lib/agent-identity.cjs +0 -39
  387. package/dist-lib/agent-sessions.cjs +0 -760
  388. package/dist-lib/cli-constants.cjs +0 -32
  389. package/dist-lib/render-mode.cjs +0 -44
  390. package/kotlin/AppSources/android/view/View.kt +0 -74
  391. package/kotlin/AppSources/android/widget/FrameLayout.kt +0 -6
  392. package/src/render-mode.ts +0 -15
  393. /package/kotlin/{AppSources → AndroidViewSources}/android/content/Context.kt +0 -0
  394. /package/kotlin/{AppSources → AndroidViewSources}/android/content/res/Configuration.kt +0 -0
  395. /package/kotlin/{AppSources → AndroidViewSources}/android/graphics/Color.kt +0 -0
  396. /package/kotlin/{AppSources → AndroidViewSources}/android/util/DisplayMetrics.kt +0 -0
  397. /package/kotlin/{AppSources → AndroidViewSources}/dev/peach/app/JavaFormat.kt +0 -0
  398. /package/kotlin/{AppSources → Sources}/java/lang/Runnable.kt +0 -0
@@ -110,7 +110,7 @@ export function startCloudTestTokenProxy(
110
110
  upstreamPort: number,
111
111
  sidecarPorts: readonly number[],
112
112
  token: string,
113
- ): Promise<{ close: () => void } | null> {
113
+ ): Promise<{ port: number; close: () => void } | null> {
114
114
  const server = createServer((req, res) => {
115
115
  const auth = req.headers.authorization || ''
116
116
  if (auth !== `Bearer ${token}`) {
@@ -177,7 +177,11 @@ export function startCloudTestTokenProxy(
177
177
  return new Promise((resolve) => {
178
178
  server.on('error', () => resolve(null))
179
179
  server.listen(listenPort, '127.0.0.1', () => {
180
- resolve({ close: () => server.close() })
180
+ const address = server.address()
181
+ if (!address || typeof address !== 'object') {
182
+ throw new Error('token proxy has no listening address')
183
+ }
184
+ resolve({ port: address.port, close: () => server.close() })
181
185
  })
182
186
  })
183
187
  }
@@ -187,7 +191,7 @@ function cloudflaredAvailable(): boolean {
187
191
  return probe.status === 0
188
192
  }
189
193
 
190
- async function ensureCloudflared(): Promise<boolean> {
194
+ export async function ensureCloudflared(): Promise<boolean> {
191
195
  if (cloudflaredAvailable()) return true
192
196
  const archMap: Record<string, string> = { x64: 'amd64', arm64: 'arm64' }
193
197
  const arch = archMap[process.arch]
@@ -232,7 +236,7 @@ function childAlive(child: ChildProcess): boolean {
232
236
  return child.exitCode === null && child.signalCode === null
233
237
  }
234
238
 
235
- async function launchQuickTunnel(
239
+ export async function launchQuickTunnel(
236
240
  originUrl: string,
237
241
  hostHeader: string,
238
242
  logFile: string,
@@ -297,23 +301,13 @@ export async function publishLiveDevStack(args: {
297
301
  }): Promise<PublishedLiveDevStack> {
298
302
  const { devPort, sidecarPorts } = args
299
303
  const jobToken = randomBytes(16).toString('hex')
300
- // free loopback port for the token proxy; the advertised authority stays
304
+ // let the token proxy own its port; the advertised authority stays
301
305
  // the dev server's own port so Metro URLs resolve on the recorder.
302
- const { Server } = await import('node:net')
303
- const proxyPort = await new Promise<number>((resolve, reject) => {
304
- const probe = new Server()
305
- probe.once('error', reject)
306
- probe.listen(0, '127.0.0.1', () => {
307
- const address = probe.address()
308
- const port = address && typeof address === 'object' ? address.port : 0
309
- probe.close(() => resolve(port))
310
- })
311
- })
312
- if (!proxyPort) throw new Error('could not allocate a tunnel proxy port')
313
- const proxy = await startCloudTestTokenProxy(proxyPort, devPort, sidecarPorts, jobToken)
306
+ const proxy = await startCloudTestTokenProxy(0, devPort, sidecarPorts, jobToken)
314
307
  if (!proxy) {
315
- throw new Error(`could not start the tunnel token proxy on 127.0.0.1:${proxyPort}`)
308
+ throw new Error('could not start the tunnel token proxy on 127.0.0.1')
316
309
  }
310
+ const proxyPort = proxy.port
317
311
  const closeProxy = proxy.close
318
312
  const hostHeader = `127.0.0.1:${devPort}`
319
313
  if (!(await ensureCloudflared())) {
@@ -37,7 +37,7 @@ import type { AgentEvent } from '../../src/agent-events'
37
37
  import type { AgentInspectMessage } from '../../src/agent-prompt'
38
38
 
39
39
  // the bridge this invocation talks to: `-p`, else the same dev-bridge or
40
- // daemon pick every other command makes (PORT_OFFSET and SOOTSIM_BRIDGE_PORT
40
+ // daemon pick every other command makes (PORT_OFFSET and PEACH_BRIDGE_PORT
41
41
  // included).
42
42
  let daemonPort = 0
43
43
 
@@ -15,7 +15,7 @@ import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs'
15
15
  import { join } from 'node:path'
16
16
  import { gzipSync } from 'node:zlib'
17
17
  import { fetchAppFontFiles } from '../app-fonts'
18
- import { rnxExit } from '../run-rnx'
18
+ import { peachExit } from '../run-rnx'
19
19
 
20
20
  type ManifestEntry = {
21
21
  url: string
@@ -41,7 +41,7 @@ async function stage(args: string[]): Promise<void> {
41
41
  console.error(
42
42
  ' usage: peach app-fonts stage --wire <wire> --out-dir <dir> --manifest <path>',
43
43
  )
44
- rnxExit(1)
44
+ peachExit(1)
45
45
  }
46
46
  if (!wire.trim()) {
47
47
  console.log('no app fonts declared — nothing to stage')
@@ -95,5 +95,5 @@ export async function runAppFonts(args: string[]): Promise<void> {
95
95
  }
96
96
  console.error(` unknown app-fonts subcommand: ${sub ?? '(none)'}`)
97
97
  console.error(' available: stage')
98
- rnxExit(1)
98
+ peachExit(1)
99
99
  }
@@ -15,7 +15,7 @@
15
15
 
16
16
  import { spawn } from 'child_process'
17
17
  import { sleep } from '../../src/sleep'
18
- import { rnxExit } from '../run-rnx'
18
+ import { peachExit } from '../run-rnx'
19
19
  import { rnxSelfInvocation } from '../self-invocation'
20
20
 
21
21
  // READ_VERBS lists every command whose stdout we know is valid JSON under
@@ -405,13 +405,13 @@ function runJq(expr: string, payload: unknown): Promise<string> {
405
405
  export async function runAssert(rawArgs: string[]): Promise<void> {
406
406
  if (rawArgs[0] === '--help' || rawArgs[0] === '-h' || rawArgs.length === 0) {
407
407
  printHelp()
408
- rnxExit(rawArgs.length === 0 ? 2 : 0)
408
+ peachExit(rawArgs.length === 0 ? 2 : 0)
409
409
  }
410
410
 
411
411
  const parsed = parseAssertArgs(rawArgs)
412
412
  if ('error' in parsed) {
413
413
  process.stderr.write(` assert: ${parsed.error}\n`)
414
- rnxExit(2)
414
+ peachExit(2)
415
415
  }
416
416
 
417
417
  const { verbArgs, predicates, withinMs, negate, quiet, allowTimeout } = parsed
@@ -422,7 +422,7 @@ export async function runAssert(rawArgs: string[]): Promise<void> {
422
422
  ` assert: unknown or non-read verb: ${verbArgs.join(' ')}\n` +
423
423
  ` supported: ${Array.from(READ_VERBS).sort().join(', ')}\n`,
424
424
  )
425
- rnxExit(2)
425
+ peachExit(2)
426
426
  }
427
427
 
428
428
  // default assertion when none given is --exists. matches the common
@@ -454,7 +454,7 @@ export async function runAssert(rawArgs: string[]): Promise<void> {
454
454
  const label = exitCode === 1 ? 'fail' : 'skip'
455
455
  process.stderr.write(` assert: ${label} — ${lastVerbSkipReason}\n`)
456
456
  }
457
- rnxExit(exitCode)
457
+ peachExit(exitCode)
458
458
  }
459
459
 
460
460
  let allPass = true
@@ -470,7 +470,7 @@ export async function runAssert(rawArgs: string[]): Promise<void> {
470
470
  }
471
471
  } catch (err: any) {
472
472
  if (!quiet) process.stderr.write(` assert: skip — ${err.message}\n`)
473
- rnxExit(125)
473
+ peachExit(125)
474
474
  }
475
475
 
476
476
  const pass = negate ? !allPass : allPass
@@ -480,7 +480,7 @@ export async function runAssert(rawArgs: string[]): Promise<void> {
480
480
  ` assert: pass${attempts > 1 ? ` (attempt ${attempts})` : ''} — ${reasons.join('; ')}\n`,
481
481
  )
482
482
  }
483
- rnxExit(0)
483
+ peachExit(0)
484
484
  }
485
485
 
486
486
  lastFailReason = reasons.join('; ')
@@ -493,7 +493,7 @@ export async function runAssert(rawArgs: string[]): Promise<void> {
493
493
  ` assert: fail${attempts > 1 ? ` after ${attempts} attempt(s)` : ''} — ${lastFailReason}\n`,
494
494
  )
495
495
  }
496
- rnxExit(1)
496
+ peachExit(1)
497
497
  }
498
498
  }
499
499
 
@@ -3,7 +3,7 @@ import {
3
3
  sharedDesktopAuthAccounts,
4
4
  } from '../../src/auth/shared-session'
5
5
  import { CHOOSE_ACCOUNT_HINT, resolveCliAuth } from '../auth'
6
- import { rnxExit } from '../run-rnx'
6
+ import { peachExit } from '../run-rnx'
7
7
 
8
8
  function printHelp(): void {
9
9
  console.log(`
@@ -38,7 +38,12 @@ async function printStatus(): Promise<number> {
38
38
  }
39
39
 
40
40
  const current = await refreshSharedDesktopAuthSession(auth.origin)
41
- const user = current?.user
41
+ if (!current) {
42
+ console.log(' not signed in')
43
+ console.log(' run `peach login` to sign in again')
44
+ return 1
45
+ }
46
+ const user = current.user
42
47
  const accounts = sharedDesktopAuthAccounts(user)
43
48
  const accountId = current?.accountId ?? auth.accountId
44
49
  const account = accounts.find((candidate) => candidate.id === accountId)
@@ -67,5 +72,5 @@ export async function runAuth(args: string[]): Promise<void> {
67
72
 
68
73
  console.error(` unknown auth command: ${sub}`)
69
74
  printHelp()
70
- rnxExit(1)
75
+ peachExit(1)
71
76
  }
@@ -10,21 +10,33 @@
10
10
 
11
11
  import {
12
12
  PREBUILT_BUNDLE_DEVICE_PATH,
13
+ PREBUILT_BUNDLE_NATIVE_RENDERER_PATH,
13
14
  prebuiltAppFontsPartPath,
14
15
  PREBUILT_BUNDLE_PART_BYTES,
15
16
  prebuiltBundlePartPath,
16
17
  } from '@peach/box/template'
18
+ import type { NativeRenderer } from '../../../src/config'
17
19
  import type { ProjectFileMeta, ProjectFilePlane } from '@peach/box/plane'
18
20
 
19
21
  export class BundleFilePlane implements ProjectFilePlane {
20
22
  private readonly parts = new Map<string, Uint8Array>()
21
23
  private readonly entries = new Map<string, ProjectFileMeta>()
22
24
 
23
- constructor(bundle: Uint8Array, device: string | null, appFonts = '') {
25
+ constructor(
26
+ bundle: Uint8Array,
27
+ device: string | null,
28
+ appFonts = '',
29
+ nativeRenderer?: NativeRenderer,
30
+ ) {
24
31
  if (bundle.byteLength === 0) throw new Error('a Box bundle cannot be empty')
25
32
  if (appFonts)
26
33
  this.recordParts(new TextEncoder().encode(appFonts), prebuiltAppFontsPartPath)
27
34
  if (device) this.record(PREBUILT_BUNDLE_DEVICE_PATH, new TextEncoder().encode(device))
35
+ if (nativeRenderer !== undefined)
36
+ this.record(
37
+ PREBUILT_BUNDLE_NATIVE_RENDERER_PATH,
38
+ new TextEncoder().encode(nativeRenderer),
39
+ )
28
40
  this.recordParts(bundle, prebuiltBundlePartPath)
29
41
  }
30
42
 
@@ -44,6 +44,7 @@ import { CheckoutFilePlane, CheckoutRequiresGitError } from './box/checkout-plan
44
44
  import { createPeachCommand } from './box/peach-command'
45
45
  import { sharePlane } from './box/plane-share'
46
46
  import { createSearchCommand } from './box/search-command'
47
+ import { readNativeProjectRenderer } from './detect'
47
48
  import type { BoxShellSession } from '@peach/box/client'
48
49
  import type { BoxTemplateResolution } from '@peach/box/template'
49
50
 
@@ -535,6 +536,13 @@ export async function createPrebuiltBundleBox(options: {
535
536
  accountId: string | null
536
537
  secrets?: Readonly<Record<string, string>>
537
538
  }) {
539
+ const platform =
540
+ options.device && isDeviceModel(options.device)
541
+ ? getRuntimePlatform(options.device)
542
+ : 'ios'
543
+ const nativeRenderer = options.nativeProjectDir
544
+ ? readNativeProjectRenderer(options.nativeProjectDir, platform)
545
+ : undefined
538
546
  return cloudBoxClient(options).create({
539
547
  name: options.name,
540
548
  stack: prebuiltBundleBoxTemplate.stack,
@@ -545,12 +553,10 @@ export async function createPrebuiltBundleBox(options: {
545
553
  options.nativeProjectDir
546
554
  ? readNativeLinkedAppFontsWire({
547
555
  projectDir: options.nativeProjectDir,
548
- platform:
549
- options.device && isDeviceModel(options.device)
550
- ? getRuntimePlatform(options.device)
551
- : 'ios',
556
+ platform,
552
557
  })
553
558
  : '',
559
+ nativeRenderer,
554
560
  ),
555
561
  ...(options.secrets ? { secrets: options.secrets } : {}),
556
562
  })
@@ -592,10 +598,15 @@ async function runCloudBoxCreate(
592
598
  // built, so naming a second template would ask for two different boxes.
593
599
  const bundlePath = flag(args, 'bundle')
594
600
  const nativeProjectDir = flag(args, 'native-project')
601
+ const assetsDirectory = flag(args, 'assets')
595
602
  if (nativeProjectDir && !bundlePath) {
596
603
  console.error(` ${peach} box create: --native-project requires --bundle.`)
597
604
  return 1
598
605
  }
606
+ if (assetsDirectory && !bundlePath) {
607
+ console.error(` ${peach} box create: --assets requires --bundle.`)
608
+ return 1
609
+ }
599
610
  const namedTemplate = flag(args, 'template')
600
611
  if (bundlePath && namedTemplate) {
601
612
  console.error(
@@ -630,7 +641,7 @@ async function runCloudBoxCreate(
630
641
  // embeds them. the box service owns the size ceiling, not this producer.
631
642
  let artifact: CloudBoxArtifactProduction
632
643
  try {
633
- artifact = await produceCloudBoxArtifact(resolved)
644
+ artifact = await produceCloudBoxArtifact(resolved, assetsDirectory)
634
645
  } catch (error) {
635
646
  console.error(
636
647
  ` ${peach} box create: could not prepare the bundle at ${resolved}: ${
@@ -202,7 +202,7 @@ function reportLocalNative(local: LocalNative[]): void {
202
202
  }
203
203
  console.log(` })`)
204
204
  }
205
- console.log(`\n guide: ${rnxPublicBrand.origin}/docs/rnx/compat/custom-stubs`)
205
+ console.log(`\n guide: ${rnxPublicBrand.origin}/docs/peach/compat/custom-stubs`)
206
206
  }
207
207
 
208
208
  // an app's own native code, found from the names its JavaScript asks the native
@@ -1,4 +1,4 @@
1
- import { rnxExit } from '../run-rnx'
1
+ import { peachExit } from '../run-rnx'
2
2
  import { runTelemetry } from './telemetry'
3
3
 
4
4
  function printHelp(): void {
@@ -30,5 +30,5 @@ export async function runConfig(args: string[]): Promise<void> {
30
30
 
31
31
  console.error(` unknown config command: ${sub ?? '(missing)'}`)
32
32
  printHelp()
33
- rnxExit(1)
33
+ peachExit(1)
34
34
  }