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
@@ -0,0 +1,70 @@
1
+ import { insertBundleGlobalFooter, readBundleGlobalFooter } from './bundleGlobalFooter'
2
+
3
+ // what the dev server answers for an app's local Expo Kotlin modules on an
4
+ // Android device: one linked Kotlin/Wasm process, or each module's diagnostic.
5
+ // a process that links compose views needs the tenant's kotlin native runtime.
6
+ // a release bundle carries the same result as a footer.
7
+ export interface ExpoKotlinCompilationResult {
8
+ namespaces: string[]
9
+ module: { url: string; hash: string; compose: boolean } | null
10
+ failures: { namespace: string; diagnostic: string }[]
11
+ }
12
+
13
+ function record(value: unknown): value is Record<string, unknown> {
14
+ return value !== null && typeof value === 'object' && !Array.isArray(value)
15
+ }
16
+
17
+ export function readExpoKotlinMetadata(value: unknown): ExpoKotlinCompilationResult {
18
+ const invalid = () => new Error('invalid Expo Kotlin compilation metadata')
19
+ if (
20
+ !record(value) ||
21
+ !Array.isArray(value.namespaces) ||
22
+ !Array.isArray(value.failures)
23
+ )
24
+ throw invalid()
25
+ const namespaces: string[] = []
26
+ for (const namespace of value.namespaces) {
27
+ if (typeof namespace !== 'string') throw invalid()
28
+ namespaces.push(namespace)
29
+ }
30
+ const failures: ExpoKotlinCompilationResult['failures'] = []
31
+ for (const failure of value.failures) {
32
+ if (
33
+ !record(failure) ||
34
+ typeof failure.namespace !== 'string' ||
35
+ typeof failure.diagnostic !== 'string'
36
+ )
37
+ throw invalid()
38
+ failures.push({ namespace: failure.namespace, diagnostic: failure.diagnostic })
39
+ }
40
+ const module = value.module
41
+ if (module === null) return { namespaces, module: null, failures }
42
+ if (
43
+ !record(module) ||
44
+ typeof module.url !== 'string' ||
45
+ typeof module.hash !== 'string' ||
46
+ typeof module.compose !== 'boolean'
47
+ )
48
+ throw invalid()
49
+ return {
50
+ namespaces,
51
+ module: { url: module.url, hash: module.hash, compose: module.compose },
52
+ failures,
53
+ }
54
+ }
55
+
56
+ export function readExpoKotlinFooter(source: string): ExpoKotlinCompilationResult | null {
57
+ const value = readBundleGlobalFooter(source, '__peachExpoKotlin')
58
+ return value === null ? null : readExpoKotlinMetadata(value)
59
+ }
60
+
61
+ export function insertExpoKotlinFooter(
62
+ source: string,
63
+ metadata: ExpoKotlinCompilationResult,
64
+ ): string {
65
+ return insertBundleGlobalFooter(
66
+ source,
67
+ '__peachExpoKotlin',
68
+ readExpoKotlinMetadata(metadata),
69
+ )
70
+ }
@@ -1,3 +1,5 @@
1
+ import { insertBundleGlobalFooter, readBundleGlobalFooter } from './bundleGlobalFooter'
2
+
1
3
  export interface ExpoSwiftSourceUnit {
2
4
  namespace: string
3
5
  moduleId: string
@@ -64,8 +66,6 @@ export function isExpoSwiftCompilationResult(
64
66
  return remaining.size === 0
65
67
  }
66
68
 
67
- const FOOTER_PREFIX = 'globalThis.__peachExpoSwift='
68
-
69
69
  export function readExpoSwiftMetadata(value: unknown): ExpoSwiftCompilationResult | null {
70
70
  if (value === null || value === undefined) return null
71
71
  if (!isExpoSwiftCompilationResult(value))
@@ -74,14 +74,7 @@ export function readExpoSwiftMetadata(value: unknown): ExpoSwiftCompilationResul
74
74
  }
75
75
 
76
76
  export function readExpoSwiftFooter(source: string): ExpoSwiftCompilationResult | null {
77
- const start = source.lastIndexOf(`\n${FOOTER_PREFIX}`)
78
- if (start < 0) return null
79
- const end = source.indexOf('\n', start + 1)
80
- const line = source.slice(start + 1, end < 0 ? undefined : end)
81
- if (!line.endsWith(';')) throw new Error('Expo Swift footer is truncated')
82
- const metadata = readExpoSwiftMetadata(JSON.parse(line.slice(FOOTER_PREFIX.length, -1)))
83
- if (!metadata) throw new Error('Expo Swift footer has no metadata')
84
- return metadata
77
+ return readExpoSwiftMetadata(readBundleGlobalFooter(source, '__peachExpoSwift'))
85
78
  }
86
79
 
87
80
  export function insertExpoSwiftFooter(
@@ -89,19 +82,5 @@ export function insertExpoSwiftFooter(
89
82
  metadata: ExpoSwiftCompilationResult,
90
83
  ): string {
91
84
  readExpoSwiftMetadata(metadata)
92
- const start = source.lastIndexOf(`\n${FOOTER_PREFIX}`)
93
- if (start >= 0) {
94
- readExpoSwiftFooter(source)
95
- const end = source.indexOf('\n', start + 1)
96
- source = source.slice(0, start) + (end < 0 ? '' : source.slice(end))
97
- }
98
- const json = JSON.stringify(metadata)
99
- .replace(/\u2028/g, '\\u2028')
100
- .replace(/\u2029/g, '\\u2029')
101
- .replace(/<\//g, '<\\/')
102
- const footer = `\n${FOOTER_PREFIX}${json};`
103
- const identity = source.lastIndexOf('\nglobalThis.__sootsimModulePaths=')
104
- return identity < 0
105
- ? source + footer
106
- : source.slice(0, identity) + footer + source.slice(identity)
85
+ return insertBundleGlobalFooter(source, '__peachExpoSwift', metadata)
107
86
  }
package/src/home-paths.ts CHANGED
@@ -35,6 +35,7 @@ import { randomUUID } from 'node:crypto'
35
35
  import fs from 'node:fs'
36
36
  import { homedir } from 'node:os'
37
37
  import path from 'node:path'
38
+ import type { DriverId } from '../cli/drivers/types'
38
39
 
39
40
  export const PEACH_HOME_ENV = 'PEACH_HOME'
40
41
  export const ACTIVE_RUNTIME_FILE = 'active'
@@ -56,7 +57,7 @@ export function rnxHomeDir(): string {
56
57
  // persistent launchd / systemd agent: dev shells shouldn't register an agent
57
58
  // whose Program path points at workspace artifacts that change between
58
59
  // sessions, and whose served engine assets are the stale prod build instead
59
- // of the live `bun dev:sootsim` output.
60
+ // of the live `bun dev:peach` output.
60
61
  //
61
62
  // overrides:
62
63
  // SOOTSIM_DEV=1 / SOOTSIM_DEV=0 force the answer
@@ -224,7 +225,7 @@ export interface SharedConfig {
224
225
  homeScreen?: import('@peach/globals').PeachHomeScreenConfig
225
226
  telemetry?: boolean
226
227
  onboardingVersion?: number
227
- simulatorDriver?: 'electron' | 'playwright'
228
+ simulatorDriver?: SimulatorDriverPreference
228
229
  settings?: Record<string, unknown>
229
230
  [key: string]: unknown
230
231
  }
@@ -262,7 +263,7 @@ export function writeSharedConfig(patch: Partial<SharedConfig>): SharedConfig {
262
263
 
263
264
  const CURRENT_ONBOARDING_VERSION = 1
264
265
 
265
- export type SimulatorDriverPreference = 'electron' | 'playwright'
266
+ export type SimulatorDriverPreference = DriverId
266
267
 
267
268
  export function isOnboardingComplete(): boolean {
268
269
  return readSharedConfig().onboardingVersion === CURRENT_ONBOARDING_VERSION
@@ -270,7 +271,9 @@ export function isOnboardingComplete(): boolean {
270
271
 
271
272
  export function readSimulatorDriverPreference(): SimulatorDriverPreference | null {
272
273
  const driver = readSharedConfig().simulatorDriver
273
- return driver === 'electron' || driver === 'playwright' ? driver : null
274
+ return driver === 'desktop' || driver === 'electron' || driver === 'playwright'
275
+ ? driver
276
+ : null
274
277
  }
275
278
 
276
279
  export function writeOnboardingPreferences(driver: SimulatorDriverPreference): void {
@@ -505,7 +505,7 @@ export class SootSimBridgeHost {
505
505
  !fs.existsSync(path.join(this.activeRuntimeDirPath, 'index.html'))
506
506
 
507
507
  for (let attempt = 0; attempt < this.portFallbackCount; attempt++) {
508
- const candidate = this.preferredPort + attempt
508
+ const candidate = this.preferredPort === 0 ? 0 : this.preferredPort + attempt
509
509
  try {
510
510
  const boundPort = await this.bindOnce(candidate, options?.silent === true)
511
511
  this.effectivePort = boundPort
@@ -513,7 +513,7 @@ export class SootSimBridgeHost {
513
513
  this.startedAt = Date.now()
514
514
  if (attempt > 0 && !options?.silent) {
515
515
  process.stderr.write(
516
- `ws bridge bound to port ${candidate} (preferred ${this.preferredPort} was taken)\n`,
516
+ `ws bridge bound to port ${boundPort} (preferred ${this.preferredPort} was taken)\n`,
517
517
  )
518
518
  }
519
519
  try {
@@ -533,7 +533,7 @@ export class SootSimBridgeHost {
533
533
  }
534
534
  if (!options?.silent) {
535
535
  process.stderr.write(
536
- `ws bridge port ${candidate} already in use, trying ${candidate + 1}\n`,
536
+ `ws bridge port ${candidate} already in use, trying ${this.preferredPort === 0 ? 'another ephemeral port' : candidate + 1}\n`,
537
537
  )
538
538
  }
539
539
  // bindOnce already cleaned up httpServer/wss on failure
@@ -1383,6 +1383,8 @@ export class SootSimBridgeHost {
1383
1383
  // daemon would silently validate published code instead of the checkout.
1384
1384
  // local-publish writes the marker above when it stages a source build.
1385
1385
  if (process.env.PEACH_HOME && isSootsimDevCheckout() && !readActiveRuntime()) {
1386
+ this.bootstrapping = false
1387
+ if (this.httpServer) this.writeLockfileSnapshot()
1386
1388
  return
1387
1389
  }
1388
1390
  void this.runRuntimeUpdate('startup')
@@ -1549,6 +1551,24 @@ export class SootSimBridgeHost {
1549
1551
  })
1550
1552
  return
1551
1553
  }
1554
+ if (
1555
+ req.url?.startsWith('/__peach/expo-kotlin') ||
1556
+ req.url?.startsWith('/__peach/kotlin-artifact/')
1557
+ ) {
1558
+ void import('../expo-kotlin-host.ts')
1559
+ .then(({ handleExpoKotlinRequest }) => handleExpoKotlinRequest(req, res))
1560
+ .then((handled) => {
1561
+ if (!handled) {
1562
+ res.writeHead(404)
1563
+ res.end('Kotlin artifact not found')
1564
+ }
1565
+ })
1566
+ .catch((error: unknown) => {
1567
+ res.writeHead(500)
1568
+ res.end(String(error))
1569
+ })
1570
+ return
1571
+ }
1552
1572
 
1553
1573
  // proxy + app-api routes need to accept POST/PUT/DELETE/PATCH/OPTIONS
1554
1574
  // because they forward the request to a real upstream. handle them
@@ -35,6 +35,8 @@ import {
35
35
  } from '../backend-origin.ts'
36
36
  import {
37
37
  buildFetchProxyUpstreamHeaders,
38
+ FETCH_PROXY_FAILURE_HEADER,
39
+ FETCH_PROXY_FAILURE_PARAM,
38
40
  nodeRequestHeaderEntries,
39
41
  resolveFetchProxyTargetUrl,
40
42
  } from './fetch-proxy-overrides.ts'
@@ -344,6 +346,17 @@ export async function handleFetchProxyRequest(
344
346
  } catch {}
345
347
  }
346
348
  }
349
+ if (!res.headersSent && params.has(FETCH_PROXY_FAILURE_PARAM)) {
350
+ const code = (err as { code?: unknown })?.code
351
+ res.statusCode = 502
352
+ res.setHeader(
353
+ FETCH_PROXY_FAILURE_HEADER,
354
+ typeof code === 'string' ? code : 'unknown',
355
+ )
356
+ applyFetchProxyCors(req, res)
357
+ res.end()
358
+ return
359
+ }
347
360
  // an upstream that cannot be reached fails the page's request the way a
348
361
  // direct fetch would: as a network error, never a response. a synthetic
349
362
  // 5xx reads as a live server answering (the bundle loader then polls it as
@@ -14,6 +14,17 @@
14
14
  // the name itself reach upstream (see buildFetchProxyUpstreamHeaders).
15
15
  export const FETCH_PROXY_NATIVE_USER_AGENT_HEADER = 'x-sootsim-native-user-agent'
16
16
 
17
+ // a fetch cannot read why a request failed: the browser reports every
18
+ // transport failure as the same TypeError. the engine's fetch transport adds
19
+ // this query parameter to the proxy requests it sends, and for those alone
20
+ // the proxy answers an unreachable upstream with a 502 naming the node error
21
+ // code (ENOTFOUND, ECONNREFUSED, ECONNRESET, ...) under the header below; the
22
+ // transport turns that answer back into a rejection carrying the code, so
23
+ // URLSession can report the error iOS reports. every other consumer (xhr,
24
+ // images, webview loads) keeps the bare network error.
25
+ export const FETCH_PROXY_FAILURE_PARAM = 'peachFailure'
26
+ export const FETCH_PROXY_FAILURE_HEADER = 'x-peach-upstream-failure'
27
+
17
28
  const HOST_HEADER_OVERRIDES: Array<{
18
29
  hostSuffix: string
19
30
  headers: Record<string, string>
@@ -85,6 +85,11 @@ export async function handleReplacementModuleRequest(
85
85
  return false
86
86
  }
87
87
 
88
+ // the route check comes first: dev servers mount this handler ahead of every
89
+ // request, so the loopback guard must only refuse replacement-module requests,
90
+ // never the bundle and status requests a LAN device or remote emulator makes.
91
+ if (url.pathname !== REPLACEMENT_MODULE_ROUTE) return false
92
+
88
93
  if (options.requireLoopbackOrigin) {
89
94
  const origin = req.headers.origin
90
95
  const remoteAddress = req.socket.remoteAddress?.replace(/^::ffff:/, '')
@@ -103,8 +108,6 @@ export async function handleReplacementModuleRequest(
103
108
  }
104
109
  }
105
110
 
106
- if (url.pathname !== REPLACEMENT_MODULE_ROUTE) return false
107
-
108
111
  if (options.requestToken && url.searchParams.get('token') !== options.requestToken) {
109
112
  res.writeHead(403, { 'Content-Type': 'text/plain; charset=utf-8' })
110
113
  res.end('replacement module request token is invalid')
package/src/index.ts CHANGED
@@ -42,6 +42,7 @@ export {
42
42
  rnxCaptureRasterRegions,
43
43
  packRnxCaptureRegions,
44
44
  rnxRasterFrames,
45
+ rnxRasterRegionRequests,
45
46
  RNX_SCREEN_CAPTURE_VERSION,
46
47
  selectRnxRasterNodeIds,
47
48
  type RnxCaptureAccessibility,
@@ -62,10 +63,11 @@ export {
62
63
  type RnxCaptureTree,
63
64
  type RnxCaptureVisualEvidence,
64
65
  type RnxRasterRegionTree,
66
+ type RnxRasterSelection,
65
67
  type RnxScreenCapture,
66
68
  } from './capture-contract'
67
69
 
68
- export { rnxPlugin } from './vite-plugin-one'
70
+ export { peachPlugin } from './vite-plugin-one'
69
71
  export { default as metroPlugin } from './metro-plugin'
70
72
  export { default as jumpToSourceBabelPlugin } from './jump-to-source-babel'
71
73
  export {