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
@@ -6,8 +6,10 @@
6
6
 
7
7
  import { spawnSync } from 'node:child_process'
8
8
  import {
9
+ accessSync,
9
10
  appendFileSync,
10
11
  chmodSync,
12
+ constants,
11
13
  copyFileSync,
12
14
  existsSync,
13
15
  mkdirSync,
@@ -161,25 +163,44 @@ function installCommandPath(target: string): string | null {
161
163
  const home = process.env.HOME || homedir()
162
164
  const shell = process.env.SHELL || ''
163
165
  const shellName = shell.endsWith('/zsh') ? 'zsh' : shell.endsWith('/bash') ? 'bash' : ''
164
- const profile = join(
165
- home,
166
- shellName === 'zsh' ? '.zshrc' : shellName === 'bash' ? '.bashrc' : '.profile',
167
- )
166
+ const profiles = [
167
+ join(
168
+ home,
169
+ shellName === 'zsh' ? '.zshrc' : shellName === 'bash' ? '.bashrc' : '.profile',
170
+ ),
171
+ ]
172
+ if (shellName === 'bash') {
173
+ let loginProfile = join(home, '.profile')
174
+ // bash login shells read only the first readable profile in this order.
175
+ for (const name of ['.bash_profile', '.bash_login']) {
176
+ const candidate = join(home, name)
177
+ try {
178
+ accessSync(candidate, constants.R_OK)
179
+ loginProfile = candidate
180
+ break
181
+ } catch {}
182
+ }
183
+ profiles.push(loginProfile)
184
+ }
168
185
  const bin = dirname(target)
169
186
  const pathLine = `export PATH="${bin}:$PATH"`
170
187
  const integration = shellName ? `eval "$(command peach __shell-init ${shellName})"` : ''
171
- const current = existsSync(profile) ? readFileSync(profile, 'utf8') : ''
172
- if (current.includes(pathLine) && (!integration || current.includes(integration)))
173
- return null
188
+ const updatedProfiles: string[] = []
189
+ for (const profile of profiles) {
190
+ const current = existsSync(profile) ? readFileSync(profile, 'utf8') : ''
191
+ if (current.includes(pathLine) && (!integration || current.includes(integration)))
192
+ continue
174
193
 
175
- const additions = [
176
- '',
177
- '# added by the peach installer; delete this block to remove peach from your shell',
178
- ...(current.includes(pathLine) ? [] : [pathLine]),
179
- ...(integration && !current.includes(integration) ? [integration] : []),
180
- ]
181
- appendFileSync(profile, `${additions.join('\n')}\n`)
182
- return profile
194
+ const additions = [
195
+ '',
196
+ '# added by the peach installer; delete this block to remove peach from your shell',
197
+ ...(current.includes(pathLine) ? [] : [pathLine]),
198
+ ...(integration && !current.includes(integration) ? [integration] : []),
199
+ ]
200
+ appendFileSync(profile, `${additions.join('\n')}\n`)
201
+ updatedProfiles.push(profile)
202
+ }
203
+ return updatedProfiles.length ? updatedProfiles.join(', ') : null
183
204
  }
184
205
 
185
206
  async function handOffDaemon({
@@ -1,53 +1,30 @@
1
- // peach desktop install — download and install the optional desktop GUI
2
- //
3
- // the CLI + daemon are the canonical peach surface; this command is only
4
- // for users who want a GUI companion on top of that.
5
- //
6
- // --native installs the native desktop host at /Applications/Peach.app on
7
- // macOS, or the standalone headless host that `peach open --headless` attaches
8
- // on Linux x64, verified and cached by version under ~/.peach/desktop/versions/<version>/
9
- // through the same delivery `peach runtime install` uses (src/desktop-host-delivery.ts).
10
- //
11
- // otherwise it installs the Electron companion: it
12
- // fetches the right platform artifact from https://contrast.dev/api/electron-release/
13
- // and installs it into the OS-native location that findInstalledDesktopCompanion() looks for:
14
- // macos: /Applications/peach.app when writable and free of the native host,
15
- // else ~/Applications/peach.app
16
- // linux: ~/Applications/peach.AppImage
17
- // win: spawns the NSIS installer
18
- //
19
- // post-install the electron-updater feed (same URL) handles upgrades inside the
20
- // running app, so this command is a first-install bootstrap, not an update path.
1
+ // install the native Mac app or Linux GTK package; --native on Linux acquires
2
+ // the standalone headless host for CI. Electron installs only on Windows.
21
3
 
22
- import { spawn, spawnSync } from 'child_process'
23
- import {
24
- chmodSync,
25
- copyFileSync,
26
- createWriteStream,
27
- existsSync,
28
- mkdirSync,
29
- rmSync,
30
- statSync,
31
- unlinkSync,
32
- } from 'fs'
4
+ import { spawn } from 'child_process'
5
+ import { createWriteStream, existsSync, mkdirSync, rmSync, statSync } from 'fs'
33
6
  import { tmpdir } from 'os'
34
- import { basename, dirname, join, resolve } from 'path'
7
+ import { dirname, join } from 'path'
35
8
  import {
36
9
  DESKTOP_HOST_CHANNELS,
37
10
  desktopHostDelivery,
38
11
  desktopHostPlatform,
39
- isNativeHostBundle,
40
12
  MAC_HOST_APP,
13
+ registerNativeDesktopLinks,
14
+ uninstallNativeDesktopHost,
41
15
  } from '../../src/desktop-host-delivery'
42
16
  import { desktopHostDir } from '../../src/home-paths'
43
- import { findInstalledDesktopCompanion } from '../desktop-companion'
17
+ import {
18
+ findInstalledDesktopCompanion,
19
+ notifyDesktopMigration,
20
+ } from '../desktop-companion'
44
21
  import { confirm } from '../prompt'
45
- import { rnxExit } from '../run-rnx'
22
+ import { peachExit } from '../run-rnx'
46
23
  import { accent, bold, failure, muted, success, withSpinner } from '../ui'
47
24
 
48
25
  const DOWNLOAD_BASE = 'https://contrast.dev/api/electron-release'
49
26
 
50
- type TargetPlatform = 'mac-arm64' | 'mac-x64' | 'win-x64' | 'linux-x64' | 'linux-arm64'
27
+ type TargetPlatform = 'win-x64' | 'linux-x64'
51
28
 
52
29
  interface Target {
53
30
  platform: TargetPlatform
@@ -57,30 +34,12 @@ interface Target {
57
34
  }
58
35
 
59
36
  function detectTarget(): Target | null {
60
- const arch = process.arch
61
- if (process.platform === 'darwin') {
62
- const platform: TargetPlatform = arch === 'arm64' ? 'mac-arm64' : 'mac-x64'
63
- const filename = `peach-latest-${platform}.dmg`
37
+ if (process.platform === 'linux' && process.arch === 'x64') {
64
38
  return {
65
- platform,
66
- filename,
67
- url: `${DOWNLOAD_BASE}/${filename}`,
68
- install: installMacDmg,
69
- }
70
- }
71
- if (process.platform === 'linux') {
72
- // ship arch-appropriate AppImages. on Apple Silicon Macs (the default
73
- // host for orb/multipass VMs) the linux VM is arm64, so the x64
74
- // AppImage fails at runtime with "Dynamic loader not found:
75
- // /lib64/ld-linux-x86-64.so.2". detect the running arch and pick the
76
- // matching artifact.
77
- const platform: TargetPlatform = arch === 'arm64' ? 'linux-arm64' : 'linux-x64'
78
- const filename = `peach-latest-${platform}.AppImage`
79
- return {
80
- platform,
81
- filename,
82
- url: `${DOWNLOAD_BASE}/${filename}`,
83
- install: installLinuxAppImage,
39
+ platform: 'linux-x64',
40
+ filename: 'PeachDesktop-linux-x64.deb',
41
+ url: 'https://contrast.dev/api/native-release/linux-x64',
42
+ install: installLinuxDeb,
84
43
  }
85
44
  }
86
45
  if (process.platform === 'win32') {
@@ -143,122 +102,24 @@ function renderProgress(received: number, total: number | null): string {
143
102
  return ` ${bar} ${pct}% ${mb} / ${totalMb} MB`
144
103
  }
145
104
 
146
- async function installMacDmg(dmgPath: string): Promise<string> {
147
- const mountOutput = spawnSync(
148
- 'hdiutil',
149
- ['attach', '-nobrowse', '-readonly', dmgPath],
150
- {
151
- encoding: 'utf8',
152
- },
153
- )
154
- if (mountOutput.status !== 0) {
155
- throw new Error(
156
- `hdiutil attach failed: ${mountOutput.stderr || mountOutput.stdout}`.trim(),
157
- )
158
- }
159
- const mountLines = mountOutput.stdout.trim().split('\n')
160
- const mountLine = mountLines[mountLines.length - 1]
161
- const mountPoint = mountLine.split('\t').pop()?.trim()
162
- if (!mountPoint || !existsSync(mountPoint)) {
163
- throw new Error(`could not determine dmg mount point (output: ${mountOutput.stdout})`)
164
- }
165
-
166
- const appSource = join(mountPoint, 'peach.app')
167
- if (!existsSync(appSource)) {
168
- spawnSync('hdiutil', ['detach', '-force', mountPoint])
169
- throw new Error(`peach.app not found inside ${mountPoint}`)
170
- }
171
-
172
- // prefer /Applications if writable, otherwise ~/Applications (same paths
173
- // findInstalledDesktopCompanion checks, so no extra config needed post-install).
174
- const systemApps = '/Applications'
175
- const userApps = resolve(process.env.HOME || '', 'Applications')
176
- let destRoot = systemApps
177
- try {
178
- const probe = join(systemApps, `.peach-write-probe-${process.pid}`)
179
- spawnSync('touch', [probe])
180
- if (existsSync(probe)) rmSync(probe, { force: true })
181
- else destRoot = userApps
182
- } catch {
183
- destRoot = userApps
184
- }
185
- // the native host owns /Applications/Peach.app, the same path on a
186
- // case-insensitive disk, so Electron goes beside the user's apps then
187
- if (isNativeHostBundle(join(systemApps, 'peach.app'))) destRoot = userApps
188
- if (destRoot === userApps) {
189
- mkdirSync(destRoot, { recursive: true })
190
- }
191
-
192
- const appDest = join(destRoot, 'peach.app')
193
-
194
- // copy alongside the destination and swap, rather than deleting the installed
195
- // app first. removing it up front means a failed copy leaves the user with no
196
- // app at all, having destroyed a working install to do it. the staging path is
197
- // in the same directory so the swap is a rename on one volume.
198
- const staging = join(
199
- destRoot,
200
- `.${basename(appDest, '.app')}-incoming-${process.pid}.app`,
201
- )
202
- rmSync(staging, { recursive: true, force: true })
203
-
204
- const copy = spawnSync('cp', ['-R', appSource, staging])
205
- if (copy.status !== 0) {
206
- spawnSync('hdiutil', ['detach', '-force', mountPoint])
207
- rmSync(staging, { recursive: true, force: true })
208
- throw new Error(`copy to ${destRoot} failed: ${copy.stderr?.toString() || ''}`.trim())
209
- }
210
- const detach = spawnSync('hdiutil', ['detach', '-force', mountPoint])
211
-
212
- const previous = join(
213
- destRoot,
214
- `.${basename(appDest, '.app')}-previous-${process.pid}.app`,
215
- )
216
- if (existsSync(appDest)) {
217
- const park = spawnSync('mv', [appDest, previous])
218
- if (park.status !== 0) {
219
- rmSync(staging, { recursive: true, force: true })
220
- throw new Error(
221
- `could not replace ${appDest}: ${park.stderr?.toString() || ''}`.trim(),
222
- )
223
- }
224
- }
225
- const swap = spawnSync('mv', [staging, appDest])
226
- if (swap.status !== 0) {
227
- // put the working install back before reporting failure
228
- if (existsSync(previous)) spawnSync('mv', [previous, appDest])
229
- rmSync(staging, { recursive: true, force: true })
230
- throw new Error(
231
- `could not move into ${appDest}: ${swap.stderr?.toString() || ''}`.trim(),
232
- )
233
- }
234
- rmSync(previous, { recursive: true, force: true })
235
-
236
- if (detach.status !== 0) {
237
- console.warn(
238
- ` warning: failed to unmount ${mountPoint} (${detach.stderr?.toString().trim() || 'unknown error'})`,
105
+ async function installLinuxDeb(packagePath: string): Promise<string> {
106
+ await new Promise<void>((resolvePromise, rejectPromise) => {
107
+ const command = process.getuid?.() === 0 ? 'apt-get' : 'sudo'
108
+ const args =
109
+ command === 'sudo'
110
+ ? ['apt-get', 'install', '-y', packagePath]
111
+ : ['install', '-y', packagePath]
112
+ const child = spawn(command, args, { stdio: 'inherit' })
113
+ child.once('error', rejectPromise)
114
+ child.once('exit', (code) =>
115
+ code === 0
116
+ ? resolvePromise()
117
+ : rejectPromise(new Error(`package install exited with code ${code}`)),
239
118
  )
240
- }
241
-
242
- // clear the quarantine attribute so gatekeeper doesn't nag on first launch;
243
- // the app is already notarized so this is safe.
244
- spawnSync('xattr', ['-dr', 'com.apple.quarantine', appDest])
245
-
246
- return appDest
247
- }
248
-
249
- async function installLinuxAppImage(appImagePath: string): Promise<string> {
250
- const destDir = resolve(process.env.HOME || '', 'Applications')
251
- mkdirSync(destDir, { recursive: true })
252
- const dest = join(destDir, 'peach.AppImage')
253
- if (existsSync(dest)) rmSync(dest, { force: true })
254
- // copyFile + unlink instead of rename: /tmp and ~/Applications are
255
- // routinely on separate mounts in containers / VMs, where renameSync
256
- // fails EXDEV. copy is portable across mounts and the unlink at the
257
- // end keeps the staging dir clean.
258
- copyFileSync(appImagePath, dest)
259
- unlinkSync(appImagePath)
260
- chmodSync(dest, 0o755)
261
- return dest
119
+ })
120
+ if (!existsSync('/usr/bin/peach-desktop'))
121
+ throw new Error('native desktop launcher missing after package install')
122
+ return '/usr/bin/peach-desktop'
262
123
  }
263
124
 
264
125
  async function installWindowsExe(exePath: string): Promise<string> {
@@ -286,7 +147,7 @@ export async function runInstallDesktop(args: string[]) {
286
147
  peach desktop install
287
148
 
288
149
  Download and install the optional peach Desktop app.
289
- The CLI works without it. Choose Desktop when you want a dedicated native window.
150
+ The CLI works without it. Mac and Linux install the native app; Windows installs Electron.
290
151
 
291
152
  usage:
292
153
  peach desktop install [options]
@@ -295,6 +156,7 @@ usage:
295
156
  options:
296
157
  -y, --yes skip confirmation and install immediately
297
158
  --force reinstall even if the companion is already present
159
+ --electron install Electron on Windows; native app on Mac and Linux
298
160
  --native install the native desktop host: /Applications/Peach.app
299
161
  on macOS arm64, the headless host on Linux x64
300
162
  --channel <name> with --native: production (default) or staging
@@ -309,7 +171,7 @@ examples:
309
171
  peach desktop install --native
310
172
  peach desktop install --native --channel staging
311
173
  `)
312
- rnxExit(0)
174
+ peachExit(0)
313
175
  }
314
176
 
315
177
  const skipConfirm =
@@ -319,7 +181,14 @@ examples:
319
181
  process.env.CI === '1' ||
320
182
  !process.stdin.isTTY
321
183
  const force = args.includes('--force')
322
- if (args.includes('--native')) {
184
+ if (args.includes('--native') && args.includes('--electron')) {
185
+ console.error(' --native cannot be combined with --electron')
186
+ peachExit(1)
187
+ }
188
+ notifyDesktopMigration()
189
+ if (args.includes('--electron') && process.platform !== 'win32')
190
+ console.error(' Electron is Windows-only; installing the native desktop app.')
191
+ if (args.includes('--native') || process.platform === 'darwin') {
323
192
  await installNativeHost(args, force)
324
193
  return
325
194
  }
@@ -336,10 +205,8 @@ examples:
336
205
  console.error(
337
206
  ` ${failure('×')} No desktop build is available for ${process.platform}/${process.arch}.`,
338
207
  )
339
- console.error(
340
- ' Supported: darwin-arm64, darwin-x64, linux-x64, linux-arm64, win32-x64',
341
- )
342
- rnxExit(1)
208
+ console.error(' Supported: darwin-arm64, linux-x64, win32-x64')
209
+ peachExit(1)
343
210
  }
344
211
 
345
212
  console.log(` ${bold('Desktop app')}`)
@@ -388,7 +255,7 @@ examples:
388
255
  console.error(
389
256
  ' The CLI and daemon work without the desktop app. Run `peach --help`.',
390
257
  )
391
- rnxExit(1)
258
+ peachExit(1)
392
259
  }
393
260
 
394
261
  if (process.stdout.isTTY) process.stdout.write('\n')
@@ -406,16 +273,8 @@ examples:
406
273
  console.error(
407
274
  ` ${failure('×')} Install failed: ${err instanceof Error ? err.message : String(err)}`,
408
275
  )
409
- // the download is good, only placing the app failed. on macOS the disk
410
- // image installs itself perfectly well by hand, so open it and let the user
411
- // drag rather than leaving them at a dead end. keep workDir for that.
412
- if (process.platform === 'darwin') {
413
- spawnSync('open', [downloadPath])
414
- console.error(` Opened ${target.filename} — drag peach to Applications to finish.`)
415
- } else {
416
- console.error(` Keeping the download at ${downloadPath} for manual installation.`)
417
- }
418
- rnxExit(1)
276
+ console.error(` Keeping the download at ${downloadPath} for manual installation.`)
277
+ peachExit(1)
419
278
  }
420
279
 
421
280
  console.log()
@@ -429,7 +288,7 @@ async function installNativeHost(args: string[], force: boolean): Promise<void>
429
288
  const channel = channelIndex >= 0 ? args[channelIndex + 1] : undefined
430
289
  if (channelIndex >= 0 && !channel) {
431
290
  console.error(` --channel needs ${DESKTOP_HOST_CHANNELS.join(' or ')}`)
432
- rnxExit(1)
291
+ peachExit(1)
433
292
  }
434
293
  const version = args.find(
435
294
  (arg, i) => !arg.startsWith('-') && args[i - 1] !== '--channel' && arg !== 'install',
@@ -447,6 +306,8 @@ async function installNativeHost(args: string[], force: boolean): Promise<void>
447
306
  quiet: true,
448
307
  }),
449
308
  )
309
+ if (resolvedChannel === 'production' && !args.includes('--native'))
310
+ registerNativeDesktopLinks()
450
311
  const location =
451
312
  desktopHostPlatform() === 'linux-x64'
452
313
  ? desktopHostDir(result.version)
@@ -458,7 +319,7 @@ async function installNativeHost(args: string[], force: boolean): Promise<void>
458
319
  console.error(
459
320
  ` ${failure('×')} Native desktop install failed: ${err instanceof Error ? err.message : String(err)}`,
460
321
  )
461
- rnxExit(1)
322
+ peachExit(1)
462
323
  }
463
324
  console.log()
464
325
  console.log(` ${bold('Ready')}`)
@@ -466,6 +327,18 @@ async function installNativeHost(args: string[], force: boolean): Promise<void>
466
327
  console.log(' peach open <target> --headless Render it through the host')
467
328
  return
468
329
  }
469
- console.log(' peach desktop --native Launch the native desktop host')
330
+ console.log(' peach desktop Launch the native desktop host')
470
331
  console.log(' peach open <target> --driver desktop Open a demo or bundle in it')
471
332
  }
333
+
334
+ export async function runUninstallDesktop(args: string[]): Promise<void> {
335
+ if (args.some((arg) => arg !== '--native')) {
336
+ throw new Error(
337
+ 'desktop uninstall removes the native host; Electron remains installed',
338
+ )
339
+ }
340
+ if (!desktopHostPlatform())
341
+ throw new Error('no native desktop host ships on this platform')
342
+ uninstallNativeDesktopHost()
343
+ console.log(' Native desktop host uninstalled.')
344
+ }
@@ -11,7 +11,11 @@ import {
11
11
  } from '../../src/kotlin-app'
12
12
  import { PeachExit } from '../run-rnx'
13
13
  import { runOpenCommand, type OpenCommandResources } from './control'
14
- import { closeGuestResources, isLoopbackGuestRequest } from './guest-host'
14
+ import {
15
+ closeGuestResources,
16
+ isLoopbackGuestRequest,
17
+ waitForGuestCompletion,
18
+ } from './guest-host'
15
19
 
16
20
  const GUEST_PATH = '/__peach/kotlin-guest.js'
17
21
  const HMR_PATH = '/__peach/kotlin-hmr'
@@ -182,10 +186,7 @@ export async function runKotlin(
182
186
  signal: controller.signal,
183
187
  ownerPid: process.pid,
184
188
  })
185
- await new Promise<void>((resolve) => {
186
- if (controller.signal.aborted) resolve()
187
- else controller.signal.addEventListener('abort', () => resolve(), { once: true })
188
- })
189
+ code = await waitForGuestCompletion(resources, controller.signal, 'Kotlin app')
189
190
  } catch (error) {
190
191
  if (!controller.signal.aborted) {
191
192
  console.error(
@@ -11,7 +11,7 @@ import { isLoopbackHost } from '../../src/backend-origin'
11
11
  import { rnxPublicBrand } from '../../src/public-brand'
12
12
  import { openUrl } from '../open-url'
13
13
  import { extractStringFlag } from '../parse-args'
14
- import { rnxExit } from '../run-rnx'
14
+ import { peachExit } from '../run-rnx'
15
15
 
16
16
  const REMOTE_DEFAULT_ORIGIN = process.env.PEACH_AUTH_ORIGIN || 'https://contrast.dev'
17
17
 
@@ -61,7 +61,7 @@ async function chooseAccount(
61
61
  ` no account named ${JSON.stringify(requested)}. your accounts:\n` +
62
62
  accounts.map((account) => ` ${account.name} (${account.id})`).join('\n'),
63
63
  )
64
- rnxExit(1)
64
+ peachExit(1)
65
65
  }
66
66
  return match
67
67
  }
@@ -71,7 +71,7 @@ async function chooseAccount(
71
71
  ' this sign-in belongs to several accounts; rerun with --account <name> to choose the one to bill:\n' +
72
72
  accounts.map((account) => ` ${account.name} (${account.id})`).join('\n'),
73
73
  )
74
- rnxExit(1)
74
+ peachExit(1)
75
75
  }
76
76
  console.log(' which account should remote simulators and boxes bill to?')
77
77
  accounts.forEach((account, index) => console.log(` ${index + 1}. ${account.name}`))
@@ -186,7 +186,7 @@ function isLocalOrigin(origin: string): boolean {
186
186
  export async function runLogin(args: string[]) {
187
187
  if (args.includes('--help') || args.includes('-h')) {
188
188
  printHelp()
189
- rnxExit(0)
189
+ peachExit(0)
190
190
  }
191
191
 
192
192
  const mutableArgs = [...args]
@@ -317,7 +317,7 @@ export async function runLogin(args: string[]) {
317
317
 
318
318
  if (!result.ok) {
319
319
  console.error(` login failed: ${result.error}`)
320
- rnxExit(1)
320
+ peachExit(1)
321
321
  }
322
322
 
323
323
  writeSharedDesktopAuthSession({