peachsim 0.1.1641 → 0.1.1653

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 (618) hide show
  1. package/README.md +12 -0
  2. package/cli/app-bundle-resources.ts +57 -0
  3. package/cli/app-catalog.ts +1 -1
  4. package/cli/app-fonts.ts +11 -80
  5. package/cli/app-splash.ts +18 -12
  6. package/cli/bridge-flow-runner.ts +11 -7
  7. package/cli/cloud-client.ts +10 -13
  8. package/cli/command-registry.ts +13 -4
  9. package/cli/commands/box.ts +4 -4
  10. package/cli/commands/control.ts +105 -53
  11. package/cli/commands/coverage-parser.ts +67 -0
  12. package/cli/commands/coverage.ts +550 -0
  13. package/cli/commands/debug.ts +9 -18
  14. package/cli/commands/desktop.ts +19 -7
  15. package/cli/commands/device.ts +14 -9
  16. package/cli/commands/guest-host.ts +6 -10
  17. package/cli/commands/inspect/core.ts +81 -17
  18. package/cli/commands/inspect.ts +13 -8
  19. package/cli/commands/kotlin.ts +2 -2
  20. package/cli/commands/maestro-compare.ts +1 -1
  21. package/cli/commands/platform.ts +20 -11
  22. package/cli/commands/preview.ts +16 -18
  23. package/cli/commands/runtime.ts +3 -2
  24. package/cli/commands/screenshot-layers.ts +1 -1
  25. package/cli/commands/screenshot.ts +1 -1
  26. package/cli/commands/serve.ts +5 -1
  27. package/cli/commands/support.ts +4 -4
  28. package/cli/commands/three-mode.ts +22 -15
  29. package/cli/commands/upload.ts +44 -45
  30. package/cli/current-sim.ts +38 -0
  31. package/cli/desktop-companion.ts +36 -8
  32. package/cli/device-option.ts +1 -1
  33. package/cli/drivers/playwright.ts +40 -0
  34. package/cli/drivers/types.ts +4 -0
  35. package/cli/help-core.ts +1 -1
  36. package/cli/internal-child.ts +2 -1
  37. package/cli/main.ts +9 -3
  38. package/cli/outbound-endpoints.ts +15 -5
  39. package/cli/output-redaction.ts +39 -14
  40. package/cli/remote-simulators.ts +4 -1
  41. package/cli/scene-video.ts +5 -2
  42. package/cli/send-to-box.ts +7 -10
  43. package/cli/telemetry.ts +1 -1
  44. package/cli/ws-bridge.ts +8 -1
  45. package/detox/attempt-events.cjs +3 -1
  46. package/detox/attempt-events.d.cts +1 -1
  47. package/detox/expectations.ts +108 -99
  48. package/detox/frame-offset.d.mts +6 -0
  49. package/detox/frame-offset.mjs +35 -0
  50. package/detox/gestures.ts +6 -18
  51. package/detox/index.ts +169 -101
  52. package/detox/jest-preset.cjs +1 -3
  53. package/detox/jest-transform.cjs +4 -0
  54. package/detox/matchers.ts +3 -0
  55. package/detox/motion-change.cjs +52 -118
  56. package/detox/motion-change.d.cts +6 -27
  57. package/detox/motion-leg-starts.cjs +20 -0
  58. package/detox/motion-leg-starts.d.cts +8 -0
  59. package/dist-lib/agent-daemon-client.cjs +1 -1
  60. package/dist-lib/agent-events.cjs +1 -1
  61. package/dist-lib/attached-projects.cjs +1 -1
  62. package/dist-lib/auth/shared-session.cjs +1 -1
  63. package/dist-lib/backend-origin.cjs +3 -3
  64. package/dist-lib/beta.cjs +1 -1
  65. package/dist-lib/beta.mjs +1 -1
  66. package/dist-lib/bridge-constants.cjs +1 -1
  67. package/dist-lib/bridge-contract-input.cjs +65 -1
  68. package/dist-lib/bridge-contract-input.mjs +63 -1
  69. package/dist-lib/bridge-contract.cjs +19 -1
  70. package/dist-lib/bridge-contract.mjs +17 -1
  71. package/dist-lib/bundle-channel.cjs +38332 -14940
  72. package/dist-lib/capture-contract.cjs +1 -1
  73. package/dist-lib/capture-contract.mjs +1 -1
  74. package/dist-lib/cloud-contract.cjs +1 -1
  75. package/dist-lib/cloud-contract.mjs +1 -1
  76. package/dist-lib/cloud-test-args.cjs +1 -1
  77. package/dist-lib/cloud-test-args.mjs +1 -1
  78. package/dist-lib/cloud.cjs +1 -1
  79. package/dist-lib/cloud.mjs +1 -1
  80. package/dist-lib/config.cjs +1 -1
  81. package/dist-lib/config.mjs +5 -3
  82. package/dist-lib/detox/index.cjs +1247 -4511
  83. package/dist-lib/detox/jest-preset.cjs +1 -3
  84. package/dist-lib/detox/jest-transform.cjs +4 -0
  85. package/dist-lib/dev-bundle-resolution.cjs +28 -24
  86. package/dist-lib/expo-swift-bundle.cjs +35243 -13172
  87. package/dist-lib/expo-swift-metadata.cjs +1 -1
  88. package/dist-lib/expo-swift-metadata.mjs +1 -1
  89. package/dist-lib/home-paths.cjs +1 -1
  90. package/dist-lib/host/bridge-host.cjs +45285 -63163
  91. package/dist-lib/host/fetch-proxy-handler.cjs +3544 -11
  92. package/dist-lib/host/fetch-proxy-overrides.cjs +1 -1
  93. package/dist-lib/host/fetch-proxy-overrides.mjs +1 -1
  94. package/dist-lib/host/replacement-module-handler.cjs +1 -1
  95. package/dist-lib/host/websocket-proxy.cjs +1 -1
  96. package/dist-lib/index.cjs +1997 -2069
  97. package/dist-lib/jump-to-source-babel.cjs +1 -1
  98. package/dist-lib/jump-to-source-native.cjs +1 -1
  99. package/dist-lib/kotlin-host.cjs +2 -2
  100. package/dist-lib/menu.cjs +14 -6
  101. package/dist-lib/menu.mjs +14 -6
  102. package/dist-lib/metro-fingerprint-registry.cjs +1 -1
  103. package/dist-lib/metro-fingerprint-registry.mjs +1 -1
  104. package/dist-lib/metro-production-bundle.cjs +1 -1
  105. package/dist-lib/metro-production-bundle.mjs +1 -1
  106. package/dist-lib/metro.cjs +468 -563
  107. package/dist-lib/native-app-identity-project.cjs +128 -292
  108. package/dist-lib/native-app-identity-project.mjs +1262 -51
  109. package/dist-lib/native-app-identity.cjs +8 -3
  110. package/dist-lib/native-app-identity.mjs +8 -3
  111. package/dist-lib/native-firebase-metadata.cjs +1 -1
  112. package/dist-lib/native-firebase-metadata.mjs +1 -1
  113. package/dist-lib/plist.cjs +2 -244
  114. package/dist-lib/plist.mjs +1 -1
  115. package/dist-lib/profiles.cjs +1 -1
  116. package/dist-lib/public-brand.cjs +1 -1
  117. package/dist-lib/public-origins-lib-esm.json +290 -0
  118. package/dist-lib/public-origins-lib-static.json +1 -0
  119. package/dist-lib/public-origins-lib.json +1852 -0
  120. package/dist-lib/react-native-host-modules.cjs +1 -1
  121. package/dist-lib/react-native-host-modules.mjs +1 -1
  122. package/dist-lib/scripts/dev-server-scanner.cjs +14 -253
  123. package/dist-lib/sdk.cjs +84 -16
  124. package/dist-lib/sdk.mjs +82 -15
  125. package/dist-lib/skills.cjs +51248 -75450
  126. package/dist-lib/swift-compile.cjs +26154 -1245
  127. package/dist-lib/swift-compile.mjs +26151 -1230
  128. package/dist-lib/swift-package.cjs +79 -1
  129. package/dist-lib/swift-package.mjs +75 -1
  130. package/dist-lib/swift-submit.cjs +1 -1
  131. package/dist-lib/swift-submit.mjs +1 -1
  132. package/dist-lib/swift-toolchain.cjs +1 -1
  133. package/dist-lib/swift.cjs +1 -1
  134. package/dist-lib/vite-swift.cjs +34394 -12323
  135. package/dist-lib/vite.cjs +373 -298
  136. package/dist-lib/worklet-executable.cjs +1 -1
  137. package/dist-lib/worklet-executable.mjs +1 -1
  138. package/dist-types/packages/peach-compat/src/engine-config.d.ts +2 -0
  139. package/dist-types/packages/peach-compat/src/stubs/form-sheet-spring.d.ts +9 -0
  140. package/dist-types/packages/peach-compat/src/stubs/native-evaluation-lease.d.ts +47 -0
  141. package/dist-types/packages/peach-compat/src/stubs/native-seams/react-native-cookies.d.ts +113 -0
  142. package/dist-types/packages/peach-compat/src/stubs/native-seams/react-native-gesture-handler.d.ts +154 -0
  143. package/dist-types/packages/peach-compat/src/stubs/screen-transition-math.d.ts +756 -0
  144. package/dist-types/packages/peach-compat/src/stubs/transition-scalar.d.ts +25 -0
  145. package/dist-types/packages/peach-engine/src/billing/plans.d.ts +64 -0
  146. package/dist-types/packages/peach-engine/src/browser-page-target.d.ts +2 -0
  147. package/dist-types/packages/peach-engine/src/bundle-platform-url.d.ts +3 -0
  148. package/dist-types/packages/peach-engine/src/capture/browser-accessibility-host.d.ts +3 -0
  149. package/dist-types/packages/peach-engine/src/capture/browser-composite.d.ts +55 -0
  150. package/dist-types/packages/peach-engine/src/capture/browserAccessibilityContract.d.ts +27 -0
  151. package/dist-types/packages/peach-engine/src/capture/nativeScreenCaptureContract.d.ts +22 -0
  152. package/dist-types/packages/peach-engine/src/cli-companion.d.ts +36 -0
  153. package/dist-types/packages/peach-engine/src/components/native-ui/webview-frame-bridge.d.ts +34 -0
  154. package/dist-types/packages/peach-engine/src/config.d.ts +5 -0
  155. package/dist-types/packages/peach-engine/src/engine/android-stretch-effect.d.ts +57 -0
  156. package/dist-types/packages/peach-engine/src/engine/animated-driven-style.d.ts +47 -0
  157. package/dist-types/packages/peach-engine/src/engine/animated-value.d.ts +5 -0
  158. package/dist-types/packages/peach-engine/src/engine/animated.d.ts +195 -0
  159. package/dist-types/packages/peach-engine/src/engine/animation-clockContract.d.ts +15 -0
  160. package/dist-types/packages/peach-engine/src/engine/animation-graph.d.ts +148 -0
  161. package/dist-types/packages/peach-engine/src/engine/app-catalog-wire.d.ts +10 -0
  162. package/dist-types/packages/peach-engine/src/engine/app-font-registry.d.ts +87 -0
  163. package/dist-types/packages/peach-engine/src/engine/attributed-paragraph-paint.d.ts +7 -0
  164. package/dist-types/packages/peach-engine/src/engine/attributed-paragraph.d.ts +123 -0
  165. package/dist-types/packages/peach-engine/src/engine/audioContract.d.ts +16 -0
  166. package/dist-types/packages/peach-engine/src/engine/canvaskit-api.d.ts +93 -0
  167. package/dist-types/packages/peach-engine/src/engine/canvaskit-renderer.d.ts +216 -0
  168. package/dist-types/packages/peach-engine/src/engine/config-plugin-fonts.d.ts +40 -0
  169. package/dist-types/packages/peach-engine/src/engine/config-plugin-splash.d.ts +25 -0
  170. package/dist-types/packages/peach-engine/src/engine/cull-visibility.d.ts +44 -0
  171. package/dist-types/packages/peach-engine/src/engine/damage-rect.d.ts +19 -0
  172. package/dist-types/packages/peach-engine/src/engine/engine-resource.d.ts +6 -0
  173. package/dist-types/packages/peach-engine/src/engine/expo-manifest.d.ts +5 -0
  174. package/dist-types/packages/peach-engine/src/engine/fiber-debug-metadata.d.ts +30 -0
  175. package/dist-types/packages/peach-engine/src/engine/font-config.d.ts +139 -0
  176. package/dist-types/packages/peach-engine/src/engine/generated/sf-pro-font.d.ts +1 -0
  177. package/dist-types/packages/peach-engine/src/engine/glass-material.d.ts +31 -0
  178. package/dist-types/packages/peach-engine/src/engine/host-composite.d.ts +100 -0
  179. package/dist-types/packages/peach-engine/src/engine/hosted-semantics.d.ts +49 -0
  180. package/dist-types/packages/peach-engine/src/engine/image-audit.d.ts +70 -0
  181. package/dist-types/packages/peach-engine/src/engine/image-loader.d.ts +350 -0
  182. package/dist-types/packages/peach-engine/src/engine/inspect-info.d.ts +27 -0
  183. package/dist-types/packages/peach-engine/src/engine/inspect-outline.d.ts +14 -0
  184. package/dist-types/packages/peach-engine/src/engine/inspect-visibility.d.ts +33 -0
  185. package/dist-types/packages/peach-engine/src/engine/ios-fast-scroll.d.ts +16 -0
  186. package/dist-types/packages/peach-engine/src/engine/layout-sab.d.ts +43 -0
  187. package/dist-types/packages/peach-engine/src/engine/liquid-glass-rect.d.ts +23 -0
  188. package/dist-types/packages/peach-engine/src/engine/liquid-glass-shaders.d.ts +9 -0
  189. package/dist-types/packages/peach-engine/src/engine/liquid-glass.d.ts +283 -0
  190. package/dist-types/packages/peach-engine/src/engine/live-object-counts.d.ts +6 -0
  191. package/dist-types/packages/peach-engine/src/engine/lottie-runtime.d.ts +32 -0
  192. package/dist-types/packages/peach-engine/src/engine/lottie-types.d.ts +138 -0
  193. package/dist-types/packages/peach-engine/src/engine/memory-counts.d.ts +27 -0
  194. package/dist-types/packages/peach-engine/src/engine/metalDirectContract.d.ts +108 -0
  195. package/dist-types/packages/peach-engine/src/engine/metalShaderContract.d.ts +217 -0
  196. package/dist-types/packages/peach-engine/src/engine/native-animation-driver.d.ts +112 -0
  197. package/dist-types/packages/peach-engine/src/engine/native-animation-graph.d.ts +62 -0
  198. package/dist-types/packages/peach-engine/src/engine/native-layout.d.ts +133 -0
  199. package/dist-types/packages/peach-engine/src/engine/native-resources.d.ts +26 -0
  200. package/dist-types/packages/peach-engine/src/engine/nativeReanimatedContract.d.ts +25 -0
  201. package/dist-types/packages/peach-engine/src/engine/nativeReplayContract.d.ts +64 -0
  202. package/dist-types/packages/peach-engine/src/engine/node.d.ts +589 -0
  203. package/dist-types/packages/peach-engine/src/engine/paint-boundary-types.d.ts +112 -0
  204. package/dist-types/packages/peach-engine/src/engine/paint-boundary.d.ts +57 -0
  205. package/dist-types/packages/peach-engine/src/engine/portalContract.d.ts +21 -0
  206. package/dist-types/packages/peach-engine/src/engine/portals.d.ts +20 -0
  207. package/dist-types/packages/peach-engine/src/engine/render-damage.d.ts +107 -0
  208. package/dist-types/packages/peach-engine/src/engine/riveContract.d.ts +420 -0
  209. package/dist-types/packages/peach-engine/src/engine/rn-spring.d.ts +51 -0
  210. package/dist-types/packages/peach-engine/src/engine/scene-table.d.ts +379 -0
  211. package/dist-types/packages/peach-engine/src/engine/scroll-momentum-math.d.ts +152 -0
  212. package/dist-types/packages/peach-engine/src/engine/scroll-pan-contacts.d.ts +10 -0
  213. package/dist-types/packages/peach-engine/src/engine/scroll-platform.d.ts +75 -0
  214. package/dist-types/packages/peach-engine/src/engine/scroll-range.d.ts +14 -0
  215. package/dist-types/packages/peach-engine/src/engine/scroll-velocity.d.ts +14 -0
  216. package/dist-types/packages/peach-engine/src/engine/scroll.d.ts +320 -0
  217. package/dist-types/packages/peach-engine/src/engine/signal.d.ts +7 -0
  218. package/dist-types/packages/peach-engine/src/engine/snapshot-cache-policy.d.ts +6 -0
  219. package/dist-types/packages/peach-engine/src/engine/svg-geometry.d.ts +41 -0
  220. package/dist-types/packages/peach-engine/src/engine/text-attachment-paragraphs.d.ts +10 -0
  221. package/dist-types/packages/peach-engine/src/engine/text-decoration.d.ts +11 -0
  222. package/dist-types/packages/peach-engine/src/engine/text-line-break.d.ts +22 -0
  223. package/dist-types/packages/peach-engine/src/engine/text-paint-receipt.d.ts +98 -0
  224. package/dist-types/packages/peach-engine/src/engine/text-paragraph.d.ts +11 -0
  225. package/dist-types/packages/peach-engine/src/engine/text-paragraphContract.d.ts +34 -0
  226. package/dist-types/packages/peach-engine/src/engine/text-transform.d.ts +1 -0
  227. package/dist-types/packages/peach-engine/src/engine/types.d.ts +657 -0
  228. package/dist-types/packages/peach-engine/src/engine/visible-frame.d.ts +54 -0
  229. package/dist-types/packages/peach-engine/src/engine/webrtcContract.d.ts +74 -0
  230. package/dist-types/packages/peach-engine/src/graphite-stats-fields.d.ts +184 -0
  231. package/dist-types/packages/peach-engine/src/guest-import-meta.d.ts +12 -0
  232. package/dist-types/packages/peach-engine/src/guest-module-overrides.d.ts +7 -0
  233. package/dist-types/packages/peach-engine/src/ios/app-card-types.d.ts +7 -0
  234. package/dist-types/packages/peach-engine/src/ios/apps/canvas-map-data.d.ts +177 -0
  235. package/dist-types/packages/peach-engine/src/ios/aux-home-scene.d.ts +54 -0
  236. package/dist-types/packages/peach-engine/src/ios/chrome-metrics.d.ts +47 -0
  237. package/dist-types/packages/peach-engine/src/ios/constants.d.ts +21 -0
  238. package/dist-types/packages/peach-engine/src/ios/duo-housing.d.ts +37 -0
  239. package/dist-types/packages/peach-engine/src/ios/home/types.d.ts +29 -0
  240. package/dist-types/packages/peach-engine/src/ios/home-app-catalog.d.ts +43 -0
  241. package/dist-types/packages/peach-engine/src/ios/photo-store.d.ts +73 -0
  242. package/dist-types/packages/peach-engine/src/ios/photoLibraryContract.d.ts +166 -0
  243. package/dist-types/packages/peach-engine/src/ios/shell-controller-types.d.ts +21 -0
  244. package/dist-types/packages/peach-engine/src/ios/shell-transition-debug.d.ts +18 -0
  245. package/dist-types/packages/peach-engine/src/metro-asset-path.d.ts +21 -0
  246. package/dist-types/packages/peach-engine/src/metro-fingerprint-registry-client.d.ts +11 -0
  247. package/dist-types/packages/peach-engine/src/metro-fingerprint.d.ts +38 -0
  248. package/dist-types/packages/peach-engine/src/native-preview-bundle.d.ts +44 -0
  249. package/dist-types/packages/peach-engine/src/observability/types.d.ts +74 -0
  250. package/dist-types/packages/peach-engine/src/peach-warm-manifest.d.ts +32 -0
  251. package/dist-types/packages/peach-engine/src/permissions/app-settings-client.d.ts +25 -0
  252. package/dist-types/packages/peach-engine/src/permissions/system-permission-types.d.ts +20 -0
  253. package/dist-types/packages/peach-engine/src/platform/android-back-panel.d.ts +131 -0
  254. package/dist-types/packages/peach-engine/src/platform/android-gesture-exclusion.d.ts +28 -0
  255. package/dist-types/packages/peach-engine/src/platform/android-predictive-back.d.ts +33 -0
  256. package/dist-types/packages/peach-engine/src/platform/system-bars-state.d.ts +14 -0
  257. package/dist-types/packages/peach-engine/src/playwright-sim-host.d.ts +1 -0
  258. package/dist-types/packages/peach-engine/src/preview/bundle-layout.d.ts +8 -0
  259. package/dist-types/packages/peach-engine/src/preview/bundle-variantContract.d.ts +24 -0
  260. package/dist-types/packages/peach-engine/src/preview/capture-bundle.d.ts +26 -0
  261. package/dist-types/packages/peach-engine/src/preview/compress-node.d.ts +2 -0
  262. package/dist-types/packages/peach-engine/src/preview/compress.d.ts +2 -0
  263. package/dist-types/packages/peach-engine/src/preview/presigned-upload.d.ts +60 -0
  264. package/dist-types/packages/peach-engine/src/preview/trace.d.ts +144 -0
  265. package/dist-types/packages/peach-engine/src/preview/upload-protocol.d.ts +152 -0
  266. package/dist-types/packages/peach-engine/src/profiler/animation-recording-loader.d.ts +1 -0
  267. package/dist-types/packages/peach-engine/src/profiler/profile-trace.d.ts +4 -0
  268. package/dist-types/packages/peach-engine/src/react-bridge.d.ts +3 -0
  269. package/dist-types/packages/peach-engine/src/react-native/AppState.d.ts +45 -0
  270. package/dist-types/packages/peach-engine/src/react-native/Appearance.d.ts +34 -0
  271. package/dist-types/packages/peach-engine/src/react-native/framework-colors-data.d.ts +2 -0
  272. package/dist-types/packages/peach-engine/src/react-native/host-services.d.ts +42 -0
  273. package/dist-types/packages/peach-engine/src/react-native/layout-animation.d.ts +22 -0
  274. package/dist-types/packages/peach-engine/src/react-native/platform-colors.d.ts +17 -0
  275. package/dist-types/packages/peach-engine/src/remote-stream/client-config.d.ts +10 -0
  276. package/dist-types/packages/peach-engine/src/remote-stream/cloud-display.d.ts +58 -0
  277. package/dist-types/packages/peach-engine/src/remote-stream/scene-recording.d.ts +45 -0
  278. package/dist-types/packages/peach-engine/src/render-worker/animated-drive-output.d.ts +35 -0
  279. package/dist-types/packages/peach-engine/src/render-worker/app-load.d.ts +16 -0
  280. package/dist-types/packages/peach-engine/src/render-worker/aux-surface-types.d.ts +2 -0
  281. package/dist-types/packages/peach-engine/src/render-worker/canvaskit-shared.d.ts +42 -0
  282. package/dist-types/packages/peach-engine/src/render-worker/canvaskit-webgpu.d.ts +434 -0
  283. package/dist-types/packages/peach-engine/src/render-worker/canvaskit-worker-init.d.ts +12 -0
  284. package/dist-types/packages/peach-engine/src/render-worker/compositor-backend.d.ts +31 -0
  285. package/dist-types/packages/peach-engine/src/render-worker/compositor-gpu.d.ts +202 -0
  286. package/dist-types/packages/peach-engine/src/render-worker/compositor-protocol.d.ts +1945 -0
  287. package/dist-types/packages/peach-engine/src/render-worker/compositor-runtime/scroll-drag-resample.d.ts +44 -0
  288. package/dist-types/packages/peach-engine/src/render-worker/css-keyframes-drive.d.ts +36 -0
  289. package/dist-types/packages/peach-engine/src/render-worker/edit-menu-geometry.d.ts +8 -0
  290. package/dist-types/packages/peach-engine/src/render-worker/engine-resource-relay.d.ts +21 -0
  291. package/dist-types/packages/peach-engine/src/render-worker/expo-widgetContract.d.ts +16 -0
  292. package/dist-types/packages/peach-engine/src/render-worker/gesture-seam-protocol.d.ts +152 -0
  293. package/dist-types/packages/peach-engine/src/render-worker/graph-linked-value.d.ts +29 -0
  294. package/dist-types/packages/peach-engine/src/render-worker/graphite-pipeline-compiler-contract.d.ts +49 -0
  295. package/dist-types/packages/peach-engine/src/render-worker/graphite-pipeline-compiler.d.ts +12 -0
  296. package/dist-types/packages/peach-engine/src/render-worker/host-service-protocol.d.ts +756 -0
  297. package/dist-types/packages/peach-engine/src/render-worker/image-lifecycle-event.d.ts +22 -0
  298. package/dist-types/packages/peach-engine/src/render-worker/image-pixel-contract.d.ts +48 -0
  299. package/dist-types/packages/peach-engine/src/render-worker/live-frame-mirror.d.ts +34 -0
  300. package/dist-types/packages/peach-engine/src/render-worker/map-command-channel.d.ts +189 -0
  301. package/dist-types/packages/peach-engine/src/render-worker/mapNativeContract.d.ts +101 -0
  302. package/dist-types/packages/peach-engine/src/render-worker/native-dynamic-synchronizable.d.ts +22 -0
  303. package/dist-types/packages/peach-engine/src/render-worker/native-menu-gesture.d.ts +9 -0
  304. package/dist-types/packages/peach-engine/src/render-worker/native-ui-commandContract.d.ts +23 -0
  305. package/dist-types/packages/peach-engine/src/render-worker/native-ui-protocol.d.ts +1087 -0
  306. package/dist-types/packages/peach-engine/src/render-worker/native-widgetContract.d.ts +100 -0
  307. package/dist-types/packages/peach-engine/src/render-worker/nativeAnimMirrorContract.d.ts +174 -0
  308. package/dist-types/packages/peach-engine/src/render-worker/nativeSyncReplyContract.d.ts +11 -0
  309. package/dist-types/packages/peach-engine/src/render-worker/one-native-contentContract.d.ts +54 -0
  310. package/dist-types/packages/peach-engine/src/render-worker/pointerSampleContract.d.ts +14 -0
  311. package/dist-types/packages/peach-engine/src/render-worker/protocol.d.ts +880 -0
  312. package/dist-types/packages/peach-engine/src/render-worker/reanimated-css-contract.d.ts +63 -0
  313. package/dist-types/packages/peach-engine/src/render-worker/reanimated-readiness.d.ts +29 -0
  314. package/dist-types/packages/peach-engine/src/render-worker/resilient-frame-clock.d.ts +22 -0
  315. package/dist-types/packages/peach-engine/src/render-worker/retained-app-load.d.ts +20 -0
  316. package/dist-types/packages/peach-engine/src/render-worker/screen-edge-swipe-commit-protocol.d.ts +1 -0
  317. package/dist-types/packages/peach-engine/src/render-worker/screen-form-sheet-commit-protocol.d.ts +26 -0
  318. package/dist-types/packages/peach-engine/src/render-worker/scroll-mirror-tenant.d.ts +37 -0
  319. package/dist-types/packages/peach-engine/src/render-worker/scroll-mirror.d.ts +164 -0
  320. package/dist-types/packages/peach-engine/src/render-worker/shell-event-registry.d.ts +119 -0
  321. package/dist-types/packages/peach-engine/src/render-worker/shell-gesture-regions.d.ts +41 -0
  322. package/dist-types/packages/peach-engine/src/render-worker/shell-protocol.d.ts +603 -0
  323. package/dist-types/packages/peach-engine/src/render-worker/shell-scene-schema.d.ts +101 -0
  324. package/dist-types/packages/peach-engine/src/render-worker/shell-tree-inline-sources.d.ts +13 -0
  325. package/dist-types/packages/peach-engine/src/render-worker/shell-tree-wire.d.ts +87 -0
  326. package/dist-types/packages/peach-engine/src/render-worker/test-bridge-protocol.d.ts +47 -0
  327. package/dist-types/packages/peach-engine/src/render-worker/text-inputContract.d.ts +93 -0
  328. package/dist-types/packages/peach-engine/src/render-worker/tree-sync-port.d.ts +102 -0
  329. package/dist-types/packages/peach-engine/src/render-worker/webgpu-frame-transaction.d.ts +292 -0
  330. package/dist-types/packages/peach-engine/src/render-worker/webgpu-readback-scheduler.d.ts +107 -0
  331. package/dist-types/packages/peach-engine/src/render-worker/webview-capture-protocol.d.ts +16 -0
  332. package/dist-types/packages/peach-engine/src/render-worker/worker-input-runtime.d.ts +211 -0
  333. package/dist-types/packages/peach-engine/src/render-worker/worker-storage.d.ts +33 -0
  334. package/dist-types/packages/peach-engine/src/render-worker/worklet-runtime.d.ts +987 -0
  335. package/dist-types/packages/peach-engine/src/render-worker/worklet-sab.d.ts +24 -0
  336. package/dist-types/packages/peach-engine/src/rolldown-bundle-inventory.d.ts +84 -0
  337. package/dist-types/packages/peach-engine/src/rolldown-production-fingerprint.d.ts +31 -0
  338. package/dist-types/packages/peach-engine/src/screenshots/timeline-assets.d.ts +10 -0
  339. package/dist-types/packages/peach-engine/src/screenshots/tokens.d.ts +9 -0
  340. package/dist-types/packages/peach-engine/src/settings/devices.d.ts +70 -0
  341. package/dist-types/packages/peach-engine/src/settings/duo-fold-bus.d.ts +87 -0
  342. package/dist-types/packages/peach-engine/src/settings/interface-rotation.d.ts +30 -0
  343. package/dist-types/packages/peach-engine/src/settings/react-native-configuration.d.ts +12 -0
  344. package/dist-types/packages/peach-engine/src/settings/scene-geometryContract.d.ts +40 -0
  345. package/dist-types/packages/peach-engine/src/settings/store.d.ts +37 -0
  346. package/dist-types/packages/peach-engine/src/shell-events.d.ts +203 -0
  347. package/dist-types/packages/peach-engine/src/shell-intent.d.ts +68 -0
  348. package/dist-types/packages/peach-engine/src/sootsim-event.d.ts +35 -0
  349. package/dist-types/packages/peach-engine/src/top-overlay-state.d.ts +5 -0
  350. package/dist-types/packages/peach-engine/src/web-authentication-automation-host.d.ts +2 -0
  351. package/dist-types/packages/peach-engine/src/webAuthenticationContract.d.ts +34 -0
  352. package/dist-types/packages/peach-engine/src/webview-automation-host.d.ts +180 -0
  353. package/dist-types/packages/peach-engine/src/wireframe-mode.d.ts +16 -0
  354. package/dist-types/packages/peach-globals/src/frameBreakdownContract.d.ts +16 -0
  355. package/dist-types/packages/peach-globals/src/index.d.ts +3311 -0
  356. package/dist-types/packages/peach-globals/src/nativeSurfaceContract.d.ts +76 -0
  357. package/dist-types/packages/peach-globals/src/pointerSourceEventContract.d.ts +8 -0
  358. package/dist-types/packages/peach-globals/src/profileTrace.d.ts +11 -0
  359. package/dist-types/packages/peach-globals/src/profilerContract.d.ts +223 -0
  360. package/dist-types/packages/peach-kit/src/capabilities.d.ts +721 -0
  361. package/dist-types/packages/peach-kit/src/internal.d.ts +4 -0
  362. package/dist-types/packages/peach-kit/src/materials/types.d.ts +27 -0
  363. package/dist-types/packages/peach-kit/src/materials/uikit-blur-material.d.ts +14 -0
  364. package/dist-types/packages/peach-kit/src/navigation-types.d.ts +11 -0
  365. package/dist-types/packages/peach-kit/src/react-bridge.d.ts +53 -0
  366. package/dist-types/packages/peach-kit/src/runtime.d.ts +26 -0
  367. package/dist-types/packages/peach-kit/src/ui/hosting-safe-area.d.ts +24 -0
  368. package/dist-types/packages/peach-kit/src/ui/popover-placement.d.ts +53 -0
  369. package/dist-types/packages/peach-kit/src/ui/presentationContract.d.ts +17 -0
  370. package/kotlin/ComposeSources/PeachComposeHost.kt +1 -1
  371. package/kotlin/JniSources/com/facebook/jni/HybridData.kt +0 -2
  372. package/kotlin/JniSources/dev/peach/jni/NativeBindings.kt +0 -2
  373. package/kotlin/JniTransportSources/dev/peach/jni/integration/JniTransport.kt +0 -2
  374. package/kotlin/README.md +6 -0
  375. package/package.json +22 -2
  376. package/runtime-companion.json +1 -0
  377. package/skills/contrast/SKILL.md +1 -0
  378. package/src/appBundleResourcesContract.ts +51 -0
  379. package/src/assetCatalogContract.ts +21 -0
  380. package/src/backend-origin.ts +3 -1
  381. package/src/bridge-contract-input.ts +84 -0
  382. package/src/bridge-contract.ts +35 -3
  383. package/src/browser-launch-policy.ts +1 -0
  384. package/src/bundle-channel.mjs +4 -2
  385. package/src/cli-runtime.ts +55 -0
  386. package/src/crash-fingerprint.ts +26 -0
  387. package/src/dev-bundle-resolution.ts +50 -23
  388. package/src/device-catalog.ts +1159 -0
  389. package/src/host/bridge-host.ts +20 -37
  390. package/src/host/browser-pointer.ts +71 -0
  391. package/src/host/dev-server-package-versions.ts +23 -0
  392. package/src/host/fetch-proxy-handler.ts +17 -4
  393. package/src/host/staged-host-files.ts +28 -4
  394. package/src/installed-package-versions.ts +142 -38
  395. package/src/kotlin-host.ts +1 -1
  396. package/src/launchMetadataContract.ts +1 -0
  397. package/src/menu.ts +12 -4
  398. package/src/metro-plugin.ts +4 -4
  399. package/src/metro-project-root.ts +68 -0
  400. package/src/native-app-identity-project.ts +47 -38
  401. package/src/nitro-adapter.lock.json +26 -0
  402. package/src/nitro-adapter.ts +103 -0
  403. package/src/nitro-bundle.ts +24 -10
  404. package/src/nitro-compile.ts +33 -51
  405. package/src/nitro-source.ts +177 -96
  406. package/src/nitroAdapterContract.ts +217 -0
  407. package/src/nitroContract.ts +24 -11
  408. package/src/process-group.ts +41 -34
  409. package/src/react-bridge-importers.ts +28 -0
  410. package/src/reactNativeConfigurationContract.ts +36 -0
  411. package/src/runtime-assets.ts +7 -2
  412. package/src/runtime-delivery.ts +8 -7
  413. package/src/runtimePlatformContract.ts +70 -0
  414. package/src/screenshots/frame-compose.ts +42 -43
  415. package/src/screenshots/org-deck.ts +9 -4
  416. package/src/screenshots/preset-names.ts +29 -0
  417. package/src/screenshots/registry.ts +5 -5
  418. package/src/screenshots/schema.ts +1 -1
  419. package/src/screenshots/screenshotContract.ts +971 -0
  420. package/src/settings-flags.ts +107 -0
  421. package/src/settingsContract.ts +609 -0
  422. package/src/storageSnapshotContract.ts +344 -0
  423. package/src/stub-pattern-matcher.ts +550 -0
  424. package/src/swift-compile.ts +926 -47
  425. package/src/swift-compiler-digest.ts +17 -3
  426. package/src/swift-distribution.lock.json +49 -22
  427. package/src/swift-host.ts +167 -52
  428. package/src/swift-objc-compile.ts +86 -26
  429. package/src/swift-objc-export.ts +532 -0
  430. package/src/swift-objc-import.ts +769 -0
  431. package/src/swift-objc-metadata.ts +285 -10
  432. package/src/swift-objc-sdk.ts +13970 -158
  433. package/src/swift-objc-standin.ts +137 -1
  434. package/src/swift-package.ts +94 -0
  435. package/src/swift-packages.ts +5 -5
  436. package/src/swift-root-lock.ts +241 -92
  437. package/src/swift-submit.ts +6 -0
  438. package/src/swiftContract.ts +99 -0
  439. package/src/target-matcher.ts +6 -1
  440. package/src/vite-plugin.ts +14 -40
  441. package/src/worker-system-chunks.ts +1 -1
  442. package/src/workerChunkContract.ts +5 -0
  443. package/src/worklets-babel.ts +24 -5
  444. package/src/xcode-project.ts +103 -11
  445. package/src/xcode-target-members.ts +10 -3
  446. package/cli/drivers/playwright-sim-host.ts +0 -825
  447. package/kotlin/fixtures/counter/Counter.d.kt.ts +0 -17
  448. package/kotlin/fixtures/counter/Counter.kt +0 -51
  449. package/kotlin/fixtures/counter/CounterApp.native.tsx +0 -61
  450. package/kotlin/fixtures/counter/CounterApp.tsx +0 -3
  451. package/kotlin/fixtures/counter/CounterScreen.d.kt.ts +0 -8
  452. package/kotlin/fixtures/counter/CounterScreen.kt +0 -56
  453. package/kotlin/fixtures/counter/app/_layout.tsx +0 -4
  454. package/kotlin/fixtures/counter/app/index+spa.tsx +0 -1
  455. package/kotlin/fixtures/counter/app/routes.d.ts +0 -18
  456. package/kotlin/fixtures/counter/package.json +0 -20
  457. package/kotlin/fixtures/counter/tsconfig.json +0 -19
  458. package/kotlin/fixtures/counter/vite.config.ts +0 -20
  459. package/kotlin/fixtures/headless-counter/Headless.kt +0 -234
  460. package/kotlin/fixtures/import-animation/Animation.d.kt.ts +0 -7
  461. package/kotlin/fixtures/import-animation/Animation.kt +0 -80
  462. package/kotlin/fixtures/import-animation/ImportAnimation.native.tsx +0 -13
  463. package/kotlin/fixtures/import-animation/README.md +0 -24
  464. package/kotlin/fixtures/import-animation/app/_layout.tsx +0 -4
  465. package/kotlin/fixtures/import-animation/app/index+spa.tsx +0 -1
  466. package/kotlin/fixtures/import-animation/app/routes.d.ts +0 -18
  467. package/kotlin/fixtures/import-animation/package.json +0 -23
  468. package/kotlin/fixtures/import-animation/tsconfig.json +0 -20
  469. package/kotlin/fixtures/import-animation/vite.config.ts +0 -20
  470. package/kotlin/fixtures/import-drawing/Drawing.d.kt.ts +0 -7
  471. package/kotlin/fixtures/import-drawing/Drawing.kt +0 -101
  472. package/kotlin/fixtures/import-drawing/ImportDrawing.native.tsx +0 -18
  473. package/kotlin/fixtures/import-drawing/README.md +0 -34
  474. package/kotlin/fixtures/import-drawing/app/_layout.tsx +0 -4
  475. package/kotlin/fixtures/import-drawing/app/index+spa.tsx +0 -1
  476. package/kotlin/fixtures/import-drawing/package.json +0 -23
  477. package/kotlin/fixtures/import-drawing/tsconfig.json +0 -20
  478. package/kotlin/fixtures/import-drawing/vite.config.ts +0 -20
  479. package/kotlin/fixtures/import-editor/Editor.d.kt.ts +0 -7
  480. package/kotlin/fixtures/import-editor/Editor.kt +0 -59
  481. package/kotlin/fixtures/import-editor/ImportEditor.native.tsx +0 -23
  482. package/kotlin/fixtures/import-editor/README.md +0 -27
  483. package/kotlin/fixtures/import-editor/app/_layout.tsx +0 -4
  484. package/kotlin/fixtures/import-editor/app/index+spa.tsx +0 -1
  485. package/kotlin/fixtures/import-editor/package.json +0 -23
  486. package/kotlin/fixtures/import-editor/tsconfig.json +0 -20
  487. package/kotlin/fixtures/import-editor/vite.config.ts +0 -20
  488. package/kotlin/fixtures/import-effects/Effects.d.kt.ts +0 -7
  489. package/kotlin/fixtures/import-effects/Effects.kt +0 -87
  490. package/kotlin/fixtures/import-effects/ImportEffects.native.tsx +0 -13
  491. package/kotlin/fixtures/import-effects/README.md +0 -19
  492. package/kotlin/fixtures/import-effects/app/_layout.tsx +0 -4
  493. package/kotlin/fixtures/import-effects/app/index+spa.tsx +0 -1
  494. package/kotlin/fixtures/import-effects/package.json +0 -23
  495. package/kotlin/fixtures/import-effects/tsconfig.json +0 -20
  496. package/kotlin/fixtures/import-effects/vite.config.ts +0 -20
  497. package/kotlin/fixtures/import-layout/ImportLayout.native.tsx +0 -13
  498. package/kotlin/fixtures/import-layout/Layout.d.kt.ts +0 -7
  499. package/kotlin/fixtures/import-layout/Layout.kt +0 -72
  500. package/kotlin/fixtures/import-layout/README.md +0 -24
  501. package/kotlin/fixtures/import-layout/app/_layout.tsx +0 -4
  502. package/kotlin/fixtures/import-layout/app/index+spa.tsx +0 -1
  503. package/kotlin/fixtures/import-layout/package.json +0 -23
  504. package/kotlin/fixtures/import-layout/tsconfig.json +0 -20
  505. package/kotlin/fixtures/import-layout/vite.config.ts +0 -20
  506. package/kotlin/fixtures/import-navigation/ImportNavigation.native.tsx +0 -18
  507. package/kotlin/fixtures/import-navigation/Navigation.d.kt.ts +0 -7
  508. package/kotlin/fixtures/import-navigation/Navigation.kt +0 -104
  509. package/kotlin/fixtures/import-navigation/README.md +0 -31
  510. package/kotlin/fixtures/import-navigation/app/_layout.tsx +0 -4
  511. package/kotlin/fixtures/import-navigation/app/index+spa.tsx +0 -1
  512. package/kotlin/fixtures/import-navigation/package.json +0 -23
  513. package/kotlin/fixtures/import-navigation/tsconfig.json +0 -20
  514. package/kotlin/fixtures/import-navigation/vite.config.ts +0 -20
  515. package/kotlin/fixtures/import-overlays/ImportOverlays.native.tsx +0 -29
  516. package/kotlin/fixtures/import-overlays/Overlays.d.kt.ts +0 -7
  517. package/kotlin/fixtures/import-overlays/Overlays.kt +0 -93
  518. package/kotlin/fixtures/import-overlays/README.md +0 -34
  519. package/kotlin/fixtures/import-overlays/app/_layout.tsx +0 -4
  520. package/kotlin/fixtures/import-overlays/app/index+spa.tsx +0 -1
  521. package/kotlin/fixtures/import-overlays/package.json +0 -23
  522. package/kotlin/fixtures/import-overlays/tsconfig.json +0 -20
  523. package/kotlin/fixtures/import-overlays/vite.config.ts +0 -20
  524. package/kotlin/fixtures/import-resources/ImportResources.native.tsx +0 -18
  525. package/kotlin/fixtures/import-resources/README.md +0 -26
  526. package/kotlin/fixtures/import-resources/Resources.d.kt.ts +0 -6
  527. package/kotlin/fixtures/import-resources/Resources.kt +0 -72
  528. package/kotlin/fixtures/import-resources/app/_layout.tsx +0 -4
  529. package/kotlin/fixtures/import-resources/app/index+spa.tsx +0 -1
  530. package/kotlin/fixtures/import-resources/package.json +0 -23
  531. package/kotlin/fixtures/import-resources/tsconfig.json +0 -20
  532. package/kotlin/fixtures/import-resources/vite.config.ts +0 -20
  533. package/kotlin/fixtures/import-scroll/ImportNested.native.tsx +0 -10
  534. package/kotlin/fixtures/import-scroll/ImportScroll.native.tsx +0 -13
  535. package/kotlin/fixtures/import-scroll/Nested.d.kt.ts +0 -4
  536. package/kotlin/fixtures/import-scroll/Nested.kt +0 -64
  537. package/kotlin/fixtures/import-scroll/README.md +0 -38
  538. package/kotlin/fixtures/import-scroll/Scroll.d.kt.ts +0 -7
  539. package/kotlin/fixtures/import-scroll/Scroll.kt +0 -91
  540. package/kotlin/fixtures/import-scroll/app/_layout.tsx +0 -4
  541. package/kotlin/fixtures/import-scroll/app/index+spa.tsx +0 -1
  542. package/kotlin/fixtures/import-scroll/app/nested+spa.tsx +0 -1
  543. package/kotlin/fixtures/import-scroll/package.json +0 -23
  544. package/kotlin/fixtures/import-scroll/tsconfig.json +0 -20
  545. package/kotlin/fixtures/import-scroll/vite.config.ts +0 -20
  546. package/kotlin/fixtures/import-selection/ImportSelection.native.tsx +0 -44
  547. package/kotlin/fixtures/import-selection/README.md +0 -32
  548. package/kotlin/fixtures/import-selection/Selection.d.kt.ts +0 -8
  549. package/kotlin/fixtures/import-selection/Selection.kt +0 -78
  550. package/kotlin/fixtures/import-selection/app/_layout.tsx +0 -4
  551. package/kotlin/fixtures/import-selection/app/index+spa.tsx +0 -1
  552. package/kotlin/fixtures/import-selection/package.json +0 -23
  553. package/kotlin/fixtures/import-selection/tsconfig.json +0 -20
  554. package/kotlin/fixtures/import-selection/vite.config.ts +0 -20
  555. package/kotlin/fixtures/import-surfaces/ImportSurfaces.native.tsx +0 -13
  556. package/kotlin/fixtures/import-surfaces/README.md +0 -22
  557. package/kotlin/fixtures/import-surfaces/Surfaces.d.kt.ts +0 -7
  558. package/kotlin/fixtures/import-surfaces/Surfaces.kt +0 -64
  559. package/kotlin/fixtures/import-surfaces/app/_layout.tsx +0 -4
  560. package/kotlin/fixtures/import-surfaces/app/index+spa.tsx +0 -1
  561. package/kotlin/fixtures/import-surfaces/package.json +0 -23
  562. package/kotlin/fixtures/import-surfaces/tsconfig.json +0 -20
  563. package/kotlin/fixtures/import-surfaces/vite.config.ts +0 -20
  564. package/kotlin/fixtures/import-values/ImportValues.native.tsx +0 -61
  565. package/kotlin/fixtures/import-values/README.md +0 -28
  566. package/kotlin/fixtures/import-values/Values.d.kt.ts +0 -15
  567. package/kotlin/fixtures/import-values/Values.kt +0 -84
  568. package/kotlin/fixtures/import-values/app/_layout.tsx +0 -4
  569. package/kotlin/fixtures/import-values/app/index+spa.tsx +0 -1
  570. package/kotlin/fixtures/import-values/package.json +0 -23
  571. package/kotlin/fixtures/import-values/tsconfig.json +0 -20
  572. package/kotlin/fixtures/import-values/vite.config.ts +0 -20
  573. package/kotlin/fixtures/kotlin-app/app/build.gradle.kts +0 -30
  574. package/kotlin/fixtures/kotlin-app/app/src/main/AndroidManifest.xml +0 -13
  575. package/kotlin/fixtures/kotlin-app/app/src/main/java/dev/contrast/kotlinapp/MainActivity.kt +0 -60
  576. package/kotlin/fixtures/kotlin-app/app/src/main/java/dev/contrast/kotlinapp/ProbeApplication.kt +0 -18
  577. package/kotlin/fixtures/kotlin-app/build.gradle.kts +0 -5
  578. package/kotlin/fixtures/kotlin-app/gradle.properties +0 -4
  579. package/kotlin/fixtures/kotlin-app/settings.gradle.kts +0 -4
  580. package/kotlin/fixtures/kotlin-app-variants/Anim.kt +0 -62
  581. package/kotlin/fixtures/kotlin-app-variants/BarBehavior.kt +0 -38
  582. package/kotlin/fixtures/kotlin-app-variants/BarVisibility.kt +0 -36
  583. package/kotlin/fixtures/kotlin-app-variants/Bitmaps.kt +0 -50
  584. package/kotlin/fixtures/kotlin-app-variants/Browse.kt +0 -73
  585. package/kotlin/fixtures/kotlin-app-variants/Colors.kt +0 -41
  586. package/kotlin/fixtures/kotlin-app-variants/Controls.kt +0 -62
  587. package/kotlin/fixtures/kotlin-app-variants/Drag.kt +0 -56
  588. package/kotlin/fixtures/kotlin-app-variants/Draw.kt +0 -74
  589. package/kotlin/fixtures/kotlin-app-variants/Drawables.kt +0 -53
  590. package/kotlin/fixtures/kotlin-app-variants/Focus.kt +0 -62
  591. package/kotlin/fixtures/kotlin-app-variants/Form.kt +0 -47
  592. package/kotlin/fixtures/kotlin-app-variants/Icons.kt +0 -59
  593. package/kotlin/fixtures/kotlin-app-variants/Ime.kt +0 -53
  594. package/kotlin/fixtures/kotlin-app-variants/Lists.kt +0 -57
  595. package/kotlin/fixtures/kotlin-app-variants/Nav.kt +0 -47
  596. package/kotlin/fixtures/kotlin-app-variants/Note.kt +0 -40
  597. package/kotlin/fixtures/kotlin-app-variants/Overlays.kt +0 -56
  598. package/kotlin/fixtures/kotlin-app-variants/Pan.kt +0 -38
  599. package/kotlin/fixtures/kotlin-app-variants/Pickers.kt +0 -44
  600. package/kotlin/fixtures/kotlin-app-variants/Press.kt +0 -43
  601. package/kotlin/fixtures/kotlin-app-variants/Scroll.kt +0 -63
  602. package/kotlin/fixtures/kotlin-app-variants/Sheet.kt +0 -43
  603. package/kotlin/fixtures/kotlin-app-variants/Strings.kt +0 -49
  604. package/kotlin/fixtures/kotlin-app-variants/Tabs.kt +0 -47
  605. package/kotlin/fixtures/kotlin-app-variants/TextWidth.kt +0 -45
  606. package/kotlin/fixtures/kotlin-app-variants/TransientInsets.kt +0 -50
  607. package/kotlin/fixtures/kotlin-app-variants/Transition.kt +0 -69
  608. package/kotlin/fixtures/kotlin-app-variants/ViewConfig.kt +0 -22
  609. package/kotlin/fixtures/kotlin-app-variants/Widgets.kt +0 -67
  610. package/kotlin/fixtures/runtime-state/RuntimeState.kt +0 -200
  611. package/kotlin/fork/README.md +0 -97
  612. package/kotlin/fork/build.sh +0 -176
  613. package/kotlin/fork/compose-worker-globals.patch +0 -1247
  614. package/kotlin/fork/fork.json +0 -46
  615. package/kotlin/fork/publish.ts +0 -99
  616. package/kotlin/fork/skia-android-shaping.patch +0 -189
  617. package/kotlin/fork/skiko-local.init.gradle +0 -10
  618. package/kotlin/fork/skiko-worker-clock.patch +0 -122
@@ -0,0 +1,550 @@
1
+ import { createHash } from 'node:crypto'
2
+ import { existsSync, lstatSync, readFileSync, readdirSync } from 'node:fs'
3
+ import { dirname, extname, isAbsolute, join, relative, resolve, sep } from 'node:path'
4
+ import { VERIFIED_SURFACES } from '@peach/compat/verified-map'
5
+ import {
6
+ VERIFIED_AXES,
7
+ VERIFIED_SOURCE_API_ROOTS,
8
+ verifiedSourceApiDoors,
9
+ type VerifiedSurface,
10
+ } from '@peach/compat/verified-map-types'
11
+ import { resolveCompatVersionRange } from '@peach/compat/version-range'
12
+ import { z } from 'zod'
13
+ import { resolveCapabilityReferences } from '../../../../scripts/lib/capability-reference-resolution'
14
+ import {
15
+ capabilitySourceExclusion,
16
+ collectCapabilityReferences,
17
+ type CapabilityReferenceCandidate,
18
+ } from '../../../../scripts/lib/capability-source-references'
19
+ import { withTypeScriptSourceParser } from '../../../../scripts/lib/native-typescript-parser'
20
+ import inventoryData from '../../../peach-compat/src/generated/capability-inventory.json'
21
+ import { coverageParserPath } from './coverage-parser'
22
+ import { readProjectManifest, resolveManifestVersions } from './detect'
23
+ import type { ProjectManifest } from './projectReportContract'
24
+
25
+ const SOURCE_EXTENSIONS = new Set([
26
+ '.js',
27
+ '.jsx',
28
+ '.mjs',
29
+ '.cjs',
30
+ '.ts',
31
+ '.tsx',
32
+ '.mts',
33
+ '.cts',
34
+ ])
35
+ // validate the snapshot fields this consumer reads, without changing proof schemas.
36
+ const inventorySchema = z.object({
37
+ generatedAt: z.string(),
38
+ sourceApiSnapshots: z.array(
39
+ z.object({
40
+ exportName: z.string(),
41
+ module: z.string(),
42
+ sourceApiVersion: z.string(),
43
+ }),
44
+ ),
45
+ rows: z.array(
46
+ z.object({
47
+ id: z.string(),
48
+ packageName: z.string(),
49
+ upstreamKind: z.enum([
50
+ 'event',
51
+ 'export',
52
+ 'imperative-method',
53
+ 'native-module',
54
+ 'prop',
55
+ 'subsystem',
56
+ ]),
57
+ upstreamName: z.string(),
58
+ supportedVersionRange: z.string(),
59
+ exactTestedVersion: z.string(),
60
+ platforms: z.array(z.enum(['ios', 'android'])),
61
+ publicReferencePaths: z
62
+ .array(
63
+ z.object({
64
+ module: z.string(),
65
+ exportName: z.string(),
66
+ memberName: z.string().nullable(),
67
+ }),
68
+ )
69
+ .optional(),
70
+ }),
71
+ ),
72
+ })
73
+
74
+ export interface CoverageGraphRequest {
75
+ entry?: string
76
+ platform: 'ios' | 'android'
77
+ }
78
+
79
+ interface FinalGraph {
80
+ source: 'contrast-bundler-final-build'
81
+ entry: string | null
82
+ entrySource: 'requested' | 'manifest' | 'conventional' | null
83
+ platform: 'ios' | 'android'
84
+ modules: number
85
+ projectModules: number
86
+ packageModules: number
87
+ nullDependencySlots: { project: number; package: number }
88
+ warnings: number
89
+ complete: true | null
90
+ unsupportedAliases: string[]
91
+ artifactVersions: Record<string, string>
92
+ }
93
+
94
+ // the project's own modules of the final build, as app-relative paths. the build
95
+ // is the canonical Contrast bundler compile, which returns the final graph
96
+ // without running the project, so no second build configuration or resolver
97
+ // exists and no app code executes. package modules are artifacts and are
98
+ // counted, never scanned.
99
+ async function readFinalGraph(
100
+ app: string,
101
+ request: CoverageGraphRequest,
102
+ ): Promise<{ error: string } | { graph: FinalGraph; projectModules: Set<string> }> {
103
+ const { compileProject } = await import('../../../contrast-bundler/compile/project')
104
+ let compiled: ReturnType<typeof compileProject>
105
+ try {
106
+ compiled = compileProject({
107
+ dir: app,
108
+ entry: request.entry,
109
+ platform: request.platform,
110
+ })
111
+ } catch (error) {
112
+ return { error: error instanceof Error ? error.message : String(error) }
113
+ }
114
+ const { report, closure } = compiled
115
+ // a build that did not reach `compiled` is a failed build even when it kept a
116
+ // closure: the graph reaches files the toolchain could not transform.
117
+ if (report.stage !== 'compiled' || !closure) {
118
+ return { error: report.error ?? `the build stopped at stage ${report.stage}` }
119
+ }
120
+ const projectPrefix = '/app/'
121
+ const modulePrefix = '/app/node_modules/'
122
+ const projectModules = new Set<string>()
123
+ let packageModules = 0
124
+ let projectNullSlots = 0
125
+ let packageNullSlots = 0
126
+ for (const module of closure.bundle.modules) {
127
+ const nulls = module.dependencies.filter((dependency) => dependency == null).length
128
+ if (module.path.startsWith(projectPrefix) && !module.path.startsWith(modulePrefix)) {
129
+ projectModules.add(module.path.slice(projectPrefix.length))
130
+ projectNullSlots += nulls
131
+ } else {
132
+ packageModules++
133
+ packageNullSlots += nulls
134
+ }
135
+ }
136
+ const graph: FinalGraph = {
137
+ source: 'contrast-bundler-final-build',
138
+ entry: report.entry?.slice(projectPrefix.length) ?? null,
139
+ entrySource: report.entrySource,
140
+ platform: request.platform,
141
+ modules: closure.bundle.modules.length,
142
+ projectModules: projectModules.size,
143
+ packageModules,
144
+ // null slots are informational: a NODE_ENV-excluded branch is a known absent
145
+ // edge and an unresolved optional require is not, so only the bundler's own
146
+ // entryClosures.complete decides.
147
+ nullDependencySlots: { project: projectNullSlots, package: packageNullSlots },
148
+ warnings: closure.bundle.warnings.length,
149
+ complete: closure.entryClosures.complete ? true : null,
150
+ unsupportedAliases: report.unsupportedAliases,
151
+ // artifact versions of the packages the closure compiled, not the repository's
152
+ // installed or locked versions.
153
+ artifactVersions: report.versions,
154
+ }
155
+ return { graph, projectModules }
156
+ }
157
+
158
+ export async function createCoverageReport(
159
+ appDirectory: string,
160
+ requestedSources: readonly string[] = [],
161
+ graphRequest?: CoverageGraphRequest,
162
+ ) {
163
+ const app = resolve(appDirectory)
164
+ const manifest = readProjectManifest(app)
165
+ if (!manifest) throw new Error(`coverage needs a package.json in ${app}`)
166
+ const inventory = inventorySchema.parse(inventoryData)
167
+ const versionOwners = new Map<string, ReturnType<typeof resolveManifestVersions>>()
168
+ const lockfiles = new Map<string, Map<string, string>>()
169
+ const sourceOwners = new Map<string, string>()
170
+ const packageOwners = new Map<string, string>()
171
+ const ownerManifests = new Map<string, ProjectManifest | null>()
172
+ const surfaces: readonly VerifiedSurface[] = VERIFIED_SURFACES
173
+ const sourceRoots = (requestedSources.length ? requestedSources : ['.']).map((path) => {
174
+ const local = relative(app, resolve(app, path)).split(sep).join('/') || '.'
175
+ if (local === '..' || local.startsWith('../') || isAbsolute(local))
176
+ throw new Error('--source must stay inside the app directory')
177
+ let ancestor = app
178
+ for (const part of local.split('/')) {
179
+ ancestor = join(ancestor, part)
180
+ if (lstatSync(ancestor).isSymbolicLink())
181
+ throw new Error('--source cannot traverse symbolic links')
182
+ }
183
+ return local
184
+ })
185
+ const files = new Map<string, string>()
186
+ const unknowns: { path: string; reason: string }[] = []
187
+ const pending = [...sourceRoots]
188
+ let entries = 0
189
+ let bytes = 0
190
+ let limited = false
191
+ while (pending.length) {
192
+ const path = pending.pop()
193
+ if (path === undefined || files.has(path)) continue
194
+ if (++entries > 100_000) {
195
+ limited = true
196
+ break
197
+ }
198
+ try {
199
+ const full = resolve(app, path)
200
+ const stat = lstatSync(full)
201
+ if (stat.isSymbolicLink()) {
202
+ unknowns.push({ path, reason: 'symbolic link was not followed' })
203
+ continue
204
+ }
205
+ if (stat.isDirectory()) {
206
+ if (
207
+ capabilitySourceExclusion(
208
+ `${path === '.' ? '' : `${path}/`}__source.ts`,
209
+ sourceRoots,
210
+ )
211
+ )
212
+ continue
213
+ const children = readdirSync(full)
214
+ .filter((child) => !child.startsWith('.'))
215
+ .sort()
216
+ .reverse()
217
+ pending.push(
218
+ ...children.map((child) => (path === '.' ? child : `${path}/${child}`)),
219
+ )
220
+ continue
221
+ }
222
+ if (
223
+ !SOURCE_EXTENSIONS.has(extname(path)) ||
224
+ capabilitySourceExclusion(path, sourceRoots)
225
+ )
226
+ continue
227
+ if (
228
+ files.size >= 2_000 ||
229
+ stat.size > 4 * 1024 * 1024 ||
230
+ bytes + stat.size > 32 * 1024 * 1024
231
+ ) {
232
+ limited = true
233
+ unknowns.push({ path, reason: 'source size limit' })
234
+ continue
235
+ }
236
+ const content = readFileSync(full, 'utf8')
237
+ bytes += Buffer.byteLength(content)
238
+ files.set(path, content)
239
+ let directory = dirname(full)
240
+ const traversed: string[] = []
241
+ while (!packageOwners.has(directory)) {
242
+ traversed.push(directory)
243
+ if (existsSync(join(directory, 'package.json'))) {
244
+ const ownerManifest = readProjectManifest(directory)
245
+ packageOwners.set(directory, directory)
246
+ ownerManifests.set(directory, ownerManifest)
247
+ if (!ownerManifest)
248
+ unknowns.push({
249
+ path: relative(app, directory),
250
+ reason: 'invalid package manifest; dependency versions remain unknown',
251
+ })
252
+ break
253
+ }
254
+ if (directory === app) throw new Error(`missing package owner for ${path}`)
255
+ directory = dirname(directory)
256
+ }
257
+ const owner = packageOwners.get(directory)
258
+ if (!owner) throw new Error(`missing package owner for ${path}`)
259
+ for (const traversedDirectory of traversed)
260
+ packageOwners.set(traversedDirectory, owner)
261
+ sourceOwners.set(path, owner)
262
+ } catch (error) {
263
+ unknowns.push({
264
+ path,
265
+ reason: error instanceof Error ? error.message : String(error),
266
+ })
267
+ }
268
+ }
269
+ const final = graphRequest ? await readFinalGraph(app, graphRequest) : undefined
270
+ if (final && 'error' in final)
271
+ unknowns.push({
272
+ path: graphRequest?.entry ?? '(entry)',
273
+ reason: `final build graph unavailable: ${final.error}`,
274
+ })
275
+ const graph = final && 'graph' in final ? final : undefined
276
+ const parserPath = files.size ? await coverageParserPath() : undefined
277
+ const candidates: CapabilityReferenceCandidate[] = files.size
278
+ ? await withTypeScriptSourceParser(async (parse) => {
279
+ // one snapshot holds the repository. each file keeps its own lexical bindings.
280
+ return parse(files, async (sources, projects) => {
281
+ const candidates: CapabilityReferenceCandidate[] = []
282
+ for (const [path, source] of files) {
283
+ candidates.push(
284
+ ...(await collectCapabilityReferences(
285
+ async (_files, analyze) => analyze(sources, projects),
286
+ source,
287
+ path,
288
+ null,
289
+ 'repository',
290
+ VERIFIED_SOURCE_API_ROOTS,
291
+ )),
292
+ )
293
+ }
294
+ return candidates
295
+ })
296
+ }, parserPath)
297
+ : []
298
+ const referencedPackages = new Map<string, Set<string>>()
299
+ for (const reference of candidates) {
300
+ const owner = sourceOwners.get(reference.path)
301
+ if (!owner) continue
302
+ const names = referencedPackages.get(owner) ?? new Set<string>()
303
+ names.add(reference.packageName)
304
+ referencedPackages.set(owner, names)
305
+ }
306
+ for (const [owner, names] of referencedPackages) {
307
+ const ownerManifest = ownerManifests.get(owner)
308
+ if (!ownerManifest) continue
309
+ const dependencies = Object.fromEntries(
310
+ Object.entries({
311
+ ...ownerManifest.dependencies,
312
+ ...ownerManifest.devDependencies,
313
+ }).filter(([name]) => names.has(name)),
314
+ )
315
+ versionOwners.set(owner, resolveManifestVersions(owner, { dependencies }, lockfiles))
316
+ }
317
+ const definitions = new Map(inventory.rows.map((row) => [row.id, row]))
318
+ const references = resolveCapabilityReferences(
319
+ inventory.rows,
320
+ candidates,
321
+ verifiedSourceApiDoors(
322
+ surfaces.flatMap((surface) => surface.features.flatMap((f) => f.frontDoors)),
323
+ ),
324
+ ).map((reference) => {
325
+ const owner = sourceOwners.get(reference.path)
326
+ const dependency = owner
327
+ ? versionOwners.get(owner)?.[reference.packageName]
328
+ : undefined
329
+ const row =
330
+ reference.state === 'attributed'
331
+ ? definitions.get(reference.capabilityId)
332
+ : undefined
333
+ // a source API door has no inventory row. its chain was read from one
334
+ // installed package version, which says nothing about native proof.
335
+ const sourceApi =
336
+ reference.state === 'attributed' && !row
337
+ ? inventory.sourceApiSnapshots.find(
338
+ (snapshot) =>
339
+ snapshot.module === reference.module &&
340
+ snapshot.exportName === reference.exportName,
341
+ )
342
+ : undefined
343
+ const versionStatus =
344
+ !dependency ||
345
+ dependency.source === 'declared' ||
346
+ !/^\d+\.\d+\.\d+(?:-[\w.-]+)?(?:\+[\w.-]+)?$/.test(dependency.version)
347
+ ? 'unknown'
348
+ : sourceApi
349
+ ? dependency.version === sourceApi.sourceApiVersion
350
+ ? 'matched'
351
+ : 'mismatched'
352
+ : row
353
+ ? resolveCompatVersionRange([row.supportedVersionRange], dependency.version)
354
+ .status
355
+ : 'unknown'
356
+ const features =
357
+ reference.state === 'attributed'
358
+ ? surfaces
359
+ .flatMap((surface) => surface.features)
360
+ .filter((feature) =>
361
+ feature.frontDoors.some((door) => door === reference.capabilityId),
362
+ )
363
+ .map((feature) => feature.id)
364
+ : []
365
+ return {
366
+ ...reference,
367
+ // 'in-final-graph': the file is a project module of the final build.
368
+ // 'not-in-final-graph' is evidence of unreachability only when
369
+ // graph.complete is true. null: no graph was requested or built.
370
+ graphReach: graph
371
+ ? graph.projectModules.has(reference.path)
372
+ ? 'in-final-graph'
373
+ : 'not-in-final-graph'
374
+ : null,
375
+ artifactVersion: graph?.graph.artifactVersions[reference.packageName] ?? null,
376
+ packageOwner: owner ? relative(app, owner).split(sep).join('/') || '.' : null,
377
+ packageVersion: dependency ?? null,
378
+ versionStatus,
379
+ supportedVersionRange: row?.supportedVersionRange ?? null,
380
+ exactTestedVersion: row?.exactTestedVersion ?? null,
381
+ sourceApiVersion: sourceApi?.sourceApiVersion ?? null,
382
+ platformApplicable: sourceApi ? true : (row?.platforms.includes('ios') ?? null),
383
+ features,
384
+ mapping:
385
+ reference.state === 'excluded'
386
+ ? 'excluded'
387
+ : reference.state !== 'attributed'
388
+ ? 'unknown-api'
389
+ : versionStatus !== 'matched'
390
+ ? 'unknown-version'
391
+ : !(sourceApi || row?.platforms.includes('ios'))
392
+ ? 'other-platform'
393
+ : features.length
394
+ ? 'mapped'
395
+ : 'unmapped-feature',
396
+ }
397
+ })
398
+ const reached = new Set(
399
+ references
400
+ .filter((reference) => reference.mapping === 'mapped')
401
+ .flatMap((reference) => reference.features),
402
+ )
403
+ const features = surfaces
404
+ .flatMap((surface) => surface.features)
405
+ .filter((feature) => reached.has(feature.id))
406
+ .map((feature) => ({
407
+ id: feature.id,
408
+ title: feature.title,
409
+ reachability: 'possible',
410
+ unknownAxes: Object.keys(VERIFIED_AXES).filter(
411
+ (axis) => !Object.keys(feature.axes).includes(axis),
412
+ ),
413
+ axes: feature.axes,
414
+ settings: feature.settings ?? [],
415
+ graphReach: graph
416
+ ? references.some(
417
+ (reference) =>
418
+ reference.mapping === 'mapped' &&
419
+ reference.graphReach === 'in-final-graph' &&
420
+ reference.features.includes(feature.id),
421
+ )
422
+ ? 'in-final-graph'
423
+ : 'not-in-final-graph'
424
+ : null,
425
+ verification: 'unknown',
426
+ reason: 'source references do not select device, OS, settings or interaction cells',
427
+ proofUrl: 'https://peachsim.com/conformance',
428
+ }))
429
+ return {
430
+ schemaVersion: 1,
431
+ input: {
432
+ kind: 'repository-source',
433
+ app,
434
+ sources: sourceRoots,
435
+ files: files.size,
436
+ bytes,
437
+ limited,
438
+ fingerprint: createHash('sha256')
439
+ .update(JSON.stringify([...files]))
440
+ .digest('hex'),
441
+ },
442
+ registry: {
443
+ source: 'cli-capability-snapshot',
444
+ generatedAt: inventory.generatedAt,
445
+ fingerprint: createHash('sha256')
446
+ .update(JSON.stringify(inventoryData))
447
+ .digest('hex'),
448
+ runtimePinned: false,
449
+ },
450
+ summary: {
451
+ references: references.length,
452
+ mappedReferences: references.filter((reference) => reference.mapping === 'mapped')
453
+ .length,
454
+ unknownReferences: references.filter(
455
+ (reference) =>
456
+ reference.mapping === 'unknown-api' ||
457
+ reference.mapping === 'unknown-version' ||
458
+ reference.mapping === 'unmapped-feature',
459
+ ).length,
460
+ possibleFeatures: features.length,
461
+ mapped: null,
462
+ verified: null,
463
+ },
464
+ graph: graph?.graph ?? null,
465
+ references,
466
+ features,
467
+ unknowns,
468
+ limitations: [
469
+ ...(graphRequest
470
+ ? [
471
+ 'The final build graph is one entry on one platform. Project modules a framework loads without a static import from that entry, such as file-system routes, are not in it. Package modules are transformed artifacts and are counted, not scanned; their features and library internals stay unknown. Artifact versions come from the compiled package set, not the repository lockfile, and do not change version status.',
472
+ 'A file outside the final graph is evidence of unreachability only when graph.complete is true. An unresolved optional require, a missing entry or a file the toolchain could not transform leaves it unknown; null slots from NODE_ENV-excluded branches do not. Attribution applicability still follows the iOS inventory on every platform.',
473
+ ]
474
+ : []),
475
+ 'Application source is scanned conservatively, without compiling or executing the app. Source roots do not establish entrypoint reachability.',
476
+ 'Transitive library source, computed loading, cross-file aliases and runtime values are not resolved. Their feature and scenario reach remains unknown.',
477
+ 'Declared dependency ranges alone are not exact package versions. The installed or unambiguous lockfile version must match the inventory range.',
478
+ 'This CLI inventory snapshot is not pinned to a selected runtime. Native fidelity and scenario verification remain unknown; no aggregate percentage is established.',
479
+ 'Swift source indexing is not included in this React Native source scan.',
480
+ ],
481
+ }
482
+ }
483
+
484
+ export async function runCoverage(args: string[]): Promise<number> {
485
+ let app = process.cwd()
486
+ let json = false
487
+ const sources: string[] = []
488
+ let graph = false
489
+ let entry: string | undefined
490
+ let platform: 'ios' | 'android' = 'ios'
491
+ for (let index = 0; index < args.length; index++) {
492
+ const arg = args[index]
493
+ if (arg === '--json') {
494
+ json = true
495
+ continue
496
+ }
497
+ if (arg === '--graph') {
498
+ graph = true
499
+ continue
500
+ }
501
+ if (arg === '--entry' || arg === '--platform') {
502
+ const value = args[++index]
503
+ if (!value || value.startsWith('-')) throw new Error(`${arg} needs a value`)
504
+ if (arg === '--entry') entry = value
505
+ else if (value === 'ios' || value === 'android') platform = value
506
+ else throw new Error('--platform must be ios or android')
507
+ continue
508
+ }
509
+ if (arg === '--app' || arg === '--source') {
510
+ const value = args[++index]
511
+ if (!value || value.startsWith('-')) throw new Error(`${arg} needs a path`)
512
+ if (arg === '--app') app = resolve(value)
513
+ else sources.push(value)
514
+ } else throw new Error(`unknown coverage argument: ${arg}`)
515
+ }
516
+ if (!graph && (entry || platform !== 'ios'))
517
+ throw new Error('--entry and --platform need --graph')
518
+ const report = await createCoverageReport(
519
+ app,
520
+ sources,
521
+ graph ? { entry, platform } : undefined,
522
+ )
523
+ if (json) console.log(JSON.stringify(report, null, 2))
524
+ else {
525
+ console.log(
526
+ `Scanned ${report.input.files} source files: ${report.summary.mappedReferences} mapped references, ${report.summary.unknownReferences} unknown or unmapped references.`,
527
+ )
528
+ console.log(
529
+ `Possible features: ${report.summary.possibleFeatures}. Mapped share: unknown. Verified share: unknown.`,
530
+ )
531
+ if (report.graph)
532
+ console.log(
533
+ `Final graph (${report.graph.platform}): ${report.graph.projectModules} project modules, ${report.graph.packageModules} package modules; complete: ${report.graph.complete ?? 'unknown'}.`,
534
+ )
535
+ for (const feature of report.features)
536
+ console.log(
537
+ ` ${feature.id}${feature.graphReach ? ` (${feature.graphReach})` : ''}: verification unknown; unknown axes: ${feature.unknownAxes.join(', ') || 'none'}`,
538
+ )
539
+ for (const reference of report.references.filter(
540
+ (reference) =>
541
+ !['mapped', 'excluded', 'other-platform'].includes(reference.mapping),
542
+ ))
543
+ console.log(
544
+ ` ${reference.path}:${reference.start} ${reference.module} ${reference.exportName}${reference.memberName ? `.${reference.memberName}` : ''}: ${reference.mapping}`,
545
+ )
546
+ for (const issue of report.unknowns) console.log(` ${issue.path}: ${issue.reason}`)
547
+ for (const limitation of report.limitations) console.log(` ${limitation}`)
548
+ }
549
+ return !report.input.files || report.input.limited || report.unknowns.length ? 1 : 0
550
+ }
@@ -1,3 +1,4 @@
1
+ import { DEFAULT_SOOTSIM_BRIDGE_PORT } from '../../src/bridge-constants'
1
2
  // peach debug — drive __sootsimDebug.* from the terminal
2
3
  //
3
4
  // connects to a running peach instance via the WebSocket bridge and forwards
@@ -17,8 +18,6 @@
17
18
  // peach debug flags
18
19
  //
19
20
  // all commands print JSON by default so they pipe cleanly into jq.
20
-
21
- import { DEFAULT_SOOTSIM_BRIDGE_PORT } from '../../src/bridge-constants'
22
21
  import { printBridgeFailureDiagnostics } from '../bridge-diagnostics'
23
22
  import { rethrowIfExit, peachExit } from '../run-rnx'
24
23
  import {
@@ -29,17 +28,19 @@ import {
29
28
  } from '../ws-bridge'
30
29
  import {
31
30
  callDebugBridge,
31
+ inspectDebugChannels,
32
32
  inspectDebugFind,
33
33
  inspectDebugFlags,
34
34
  inspectDebugRecent,
35
35
  inspectDebugStatus,
36
36
  setDebugChannels,
37
+ toggleDebugChannel,
37
38
  } from './inspect/core'
38
39
  import { callTestBridge } from './inspect/shared'
39
40
  import type {
40
41
  ImageAuditReport,
41
42
  ImageAuditRow,
42
- } from '../../../peach-engine/src/render-worker/compositor-protocol'
43
+ } from '#peach-cli-contract/render-worker/compositor-protocol'
43
44
  import type { PeachDebugSnapshotOperation } from '@peach/globals'
44
45
 
45
46
  interface DebugOptions {
@@ -487,35 +488,25 @@ export async function runDebug(args: string[], opts: DebugOptions) {
487
488
  console.error(' usage: peach debug toggle <channel>')
488
489
  peachExit(1)
489
490
  }
490
- const result = await callDebugBridge(
491
- bridge,
492
- `toggle(${JSON.stringify(channel)})`,
493
- true,
494
- )
495
- if (!args.includes('--host')) {
496
- await callDebugBridge(
497
- bridge,
498
- `${result ? 'enable' : 'disable'}(${JSON.stringify(channel)})`,
499
- )
500
- }
491
+ const result = await toggleDebugChannel(bridge, channel, args.includes('--host'))
501
492
  console.log(fmt({ [channel]: result }, pretty))
502
493
  break
503
494
  }
504
495
 
505
496
  case 'status': {
506
- const result = await inspectDebugStatus(bridge)
497
+ const result = await inspectDebugStatus(bridge, args.includes('--host'))
507
498
  console.log(fmt(result, pretty))
508
499
  break
509
500
  }
510
501
 
511
502
  case 'channels': {
512
- const result = await call(bridge, 'window.__sootsimDebug.channels()')
503
+ const result = await inspectDebugChannels(bridge, args.includes('--host'))
513
504
  console.log(fmt(result, pretty))
514
505
  break
515
506
  }
516
507
 
517
508
  case 'flags': {
518
- const result = await inspectDebugFlags(bridge)
509
+ const result = await inspectDebugFlags(bridge, args.includes('--host'))
519
510
  console.log(fmt(result, pretty))
520
511
  break
521
512
  }
@@ -615,7 +606,7 @@ export async function runDebug(args: string[], opts: DebugOptions) {
615
606
  case 'find': {
616
607
  const target = rest[0]
617
608
  if (target === 'sheets' || target === 'portals' || target === 'boundaries') {
618
- const result = await inspectDebugFind(bridge, target)
609
+ const result = await inspectDebugFind(bridge, target, args.includes('--host'))
619
610
  console.log(fmt(result, pretty))
620
611
  } else {
621
612
  console.error(' usage: peach debug find <sheets|portals|boundaries>')
@@ -1,3 +1,5 @@
1
+ import { getRnxPositionals } from '../command-registry'
2
+ import { peachExit } from '../run-rnx'
1
3
  import { runElectron } from './electron'
2
4
  import { runInstallDesktop, runUninstallDesktop } from './install-desktop'
3
5
 
@@ -6,6 +8,8 @@ interface DesktopOptions {
6
8
  device?: string
7
9
  }
8
10
 
11
+ const DESKTOP_VALUE_FLAGS = new Set(['--profile', '--channel'])
12
+
9
13
  function printHelp(): void {
10
14
  console.log(`
11
15
  peach desktop — launch or install the desktop companion
@@ -31,15 +35,23 @@ export async function runDesktop(args: string[], opts: DesktopOptions): Promise<
31
35
  return
32
36
  }
33
37
 
34
- const sub = args.find((arg) => !arg.startsWith('-'))
35
- if (sub === 'uninstall') {
36
- await runUninstallDesktop(args.filter((arg) => arg !== 'uninstall'))
38
+ const positionals = getRnxPositionals(args, DESKTOP_VALUE_FLAGS)
39
+ const sub = positionals[0]
40
+ if (sub === 'uninstall' || sub === 'install') {
41
+ const index = args.findIndex(
42
+ (arg, i) => arg === sub && !DESKTOP_VALUE_FLAGS.has(args[i - 1]),
43
+ )
44
+ const rest = [...args.slice(0, index), ...args.slice(index + 1)]
45
+ if (sub === 'uninstall') await runUninstallDesktop(rest)
46
+ else await runInstallDesktop(rest)
37
47
  return
38
48
  }
39
- if (sub === 'install') {
40
- const index = args.indexOf(sub)
41
- await runInstallDesktop([...args.slice(0, index), ...args.slice(index + 1)])
42
- return
49
+
50
+ const unknown = positionals.filter((arg) => !arg.startsWith('peach://'))
51
+ if (unknown.length > 0) {
52
+ console.error(` peach desktop: unknown argument: ${unknown[0]}`)
53
+ console.error(' run peach desktop --help for usage')
54
+ peachExit(1)
43
55
  }
44
56
 
45
57
  await runElectron(args, opts)