peachsim 0.1.578 → 0.1.579

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 (178) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +11 -9
  3. package/cli/app-catalog.ts +77 -0
  4. package/cli/app-fonts.ts +4 -20
  5. package/cli/app-splash.ts +2 -18
  6. package/cli/bridge-flow-runner.ts +505 -139
  7. package/cli/cloud-client.ts +1 -4
  8. package/cli/cloud-session.ts +1 -4
  9. package/cli/cloud-test-result-files.ts +3 -0
  10. package/cli/cloud-test-tunnel.ts +2 -5
  11. package/cli/command-registry.ts +2 -0
  12. package/cli/commands/agent.ts +149 -23
  13. package/cli/commands/assert.ts +1 -4
  14. package/cli/commands/box/peach-command.ts +62 -0
  15. package/cli/commands/box/plane-share.ts +0 -70
  16. package/cli/commands/box/rnx-command.ts +1 -60
  17. package/cli/commands/box/search-command.ts +14 -0
  18. package/cli/commands/box.ts +2 -2
  19. package/cli/commands/control.ts +121 -27
  20. package/cli/commands/cpu-profile.ts +23 -10
  21. package/cli/commands/daemon.ts +1 -9
  22. package/cli/commands/detox.ts +26 -18
  23. package/cli/commands/device.ts +129 -1
  24. package/cli/commands/film.ts +25 -16
  25. package/cli/commands/flow.ts +9 -2
  26. package/cli/commands/inspect/actions.ts +75 -1
  27. package/cli/commands/inspect/core.ts +81 -2
  28. package/cli/commands/inspect/describe.ts +2 -6
  29. package/cli/commands/inspect/env.ts +1 -1
  30. package/cli/commands/inspect/settling.ts +20 -3
  31. package/cli/commands/inspect/shared.ts +1 -4
  32. package/cli/commands/inspect/sleep.ts +1 -1
  33. package/cli/commands/inspect.ts +16 -49
  34. package/cli/commands/install-desktop.ts +8 -6
  35. package/cli/commands/login.ts +3 -5
  36. package/cli/commands/maestro-generate.ts +1 -4
  37. package/cli/commands/maestro.ts +38 -21
  38. package/cli/commands/no-bridge-hint.ts +0 -14
  39. package/cli/commands/permissions.ts +2 -2
  40. package/cli/commands/platform.ts +13 -6
  41. package/cli/commands/screenshot.ts +6 -1
  42. package/cli/commands/skills.ts +1 -1
  43. package/cli/commands/test.ts +6 -2
  44. package/cli/commands/three-mode.ts +162 -19
  45. package/cli/commands/upload.ts +3 -18
  46. package/cli/current-sim.ts +0 -1
  47. package/cli/desktop-companion.ts +40 -8
  48. package/cli/drivers/playwright-provisioning.ts +1 -4
  49. package/cli/flow-export.ts +1 -8
  50. package/cli/flow-session.ts +0 -4
  51. package/cli/hints.ts +1 -16
  52. package/cli/inspect-notice-state.ts +0 -4
  53. package/cli/main.ts +2 -4
  54. package/cli/outbound-endpoints.ts +1 -24
  55. package/cli/parse-args.ts +1 -2
  56. package/cli/rnx-in-process.ts +3 -1
  57. package/cli/run-rnx-core.ts +4 -2
  58. package/cli/run-rnx.ts +18 -10
  59. package/cli/send-to-box.ts +1 -4
  60. package/cli/telemetry.ts +1 -1
  61. package/cli/ws-bridge.ts +1 -5
  62. package/detox/gestures.ts +20 -6
  63. package/detox/index.ts +379 -123
  64. package/detox/navigation-lifecycle.ts +22 -13
  65. package/dist-lib/agent-daemon-client.cjs +21 -15
  66. package/dist-lib/agent-events.cjs +1 -1
  67. package/dist-lib/agent-identity.cjs +3 -17
  68. package/dist-lib/agent-sessions.cjs +5 -4
  69. package/dist-lib/attached-projects.cjs +1 -77
  70. package/dist-lib/auth/shared-session.cjs +1 -1
  71. package/dist-lib/backend-origin.cjs +11 -1
  72. package/dist-lib/beta.cjs +1 -1
  73. package/dist-lib/beta.mjs +1 -1
  74. package/dist-lib/bridge-constants.cjs +1 -1
  75. package/dist-lib/bridge-contract-input.cjs +7 -5
  76. package/dist-lib/bridge-contract-input.mjs +7 -5
  77. package/dist-lib/bridge-contract.cjs +1 -1
  78. package/dist-lib/bridge-contract.mjs +1 -1
  79. package/dist-lib/capture-contract.cjs +30 -7
  80. package/dist-lib/capture-contract.mjs +30 -7
  81. package/dist-lib/cli-constants.cjs +1 -1
  82. package/dist-lib/cloud-contract.cjs +1 -1
  83. package/dist-lib/cloud-contract.mjs +1 -1
  84. package/dist-lib/cloud-test-args.cjs +1 -1
  85. package/dist-lib/cloud-test-args.mjs +1 -1
  86. package/dist-lib/cloud.cjs +17 -11
  87. package/dist-lib/cloud.mjs +17 -11
  88. package/dist-lib/config.cjs +1 -1
  89. package/dist-lib/detox/index.cjs +321 -122
  90. package/dist-lib/dev-bundle-resolution.cjs +1 -1
  91. package/dist-lib/home-paths.cjs +1 -1
  92. package/dist-lib/host/bridge-host.cjs +427 -212
  93. package/dist-lib/host/fetch-proxy-handler.cjs +5 -28
  94. package/dist-lib/host/fetch-proxy-overrides.cjs +1 -1
  95. package/dist-lib/host/fetch-proxy-overrides.mjs +1 -1
  96. package/dist-lib/host/replacement-module-handler.cjs +1 -1
  97. package/dist-lib/host/websocket-proxy.cjs +1 -1
  98. package/dist-lib/index.cjs +315 -58
  99. package/dist-lib/jump-to-source-babel.cjs +1 -1
  100. package/dist-lib/jump-to-source-native.cjs +1 -1
  101. package/dist-lib/menu.cjs +67 -31
  102. package/dist-lib/menu.mjs +64 -28
  103. package/dist-lib/metro-fingerprint-registry.cjs +8 -4
  104. package/dist-lib/metro-fingerprint-registry.mjs +6 -4
  105. package/dist-lib/metro-production-bundle.cjs +2 -2
  106. package/dist-lib/metro-production-bundle.mjs +2 -2
  107. package/dist-lib/metro.cjs +8 -4
  108. package/dist-lib/profiles.cjs +1 -1
  109. package/dist-lib/public-brand.cjs +7 -4
  110. package/dist-lib/react-native-host-modules.cjs +1 -1
  111. package/dist-lib/react-native-host-modules.mjs +1 -1
  112. package/dist-lib/render-mode.cjs +3 -13
  113. package/dist-lib/scripts/dev-server-scanner.cjs +5 -17
  114. package/dist-lib/sdk.cjs +129 -10
  115. package/dist-lib/sdk.mjs +127 -10
  116. package/dist-lib/skills.cjs +1635 -1121
  117. package/dist-lib/swift-compile.cjs +277 -70
  118. package/dist-lib/swift-compile.mjs +275 -70
  119. package/dist-lib/swift-package.cjs +17 -5
  120. package/dist-lib/swift-package.mjs +15 -4
  121. package/dist-lib/swift-submit.cjs +32 -8
  122. package/dist-lib/swift-submit.mjs +29 -7
  123. package/dist-lib/swift.cjs +30912 -577
  124. package/dist-lib/vite-kotlin.cjs +356 -0
  125. package/dist-lib/vite-swift.cjs +1743 -0
  126. package/dist-lib/vite.cjs +208 -1039
  127. package/kotlin/README.md +18 -0
  128. package/kotlin/Sources/androidx/annotation/Keep.kt +4 -0
  129. package/kotlin/Sources/dev/onejs/one/OneNativeSourceDispatch.kt +7 -0
  130. package/kotlin/Sources/dev/onejs/one/source/OneModule.kt +4 -0
  131. package/kotlin/Sources/org/json/JSON.kt +244 -0
  132. package/kotlin/toolchain.json +19 -0
  133. package/package.json +14 -2
  134. package/scripts/dev-server-scanner.ts +0 -18
  135. package/scripts/optional-demo-registry.ts +0 -17
  136. package/skills/contrast/SKILL.md +2 -2
  137. package/skills/peach-setup/SKILL.md +16 -0
  138. package/src/agent-daemon-client.ts +36 -22
  139. package/src/agent-identity.ts +0 -15
  140. package/src/agent-prompt.ts +12 -0
  141. package/src/attached-projects.ts +0 -72
  142. package/src/backend-origin.ts +10 -0
  143. package/src/bridge-contract-input.ts +2 -5
  144. package/src/bridge-contract.ts +2 -0
  145. package/src/capture-contract.ts +53 -11
  146. package/src/cloud.ts +4 -9
  147. package/src/dev-server-open.ts +0 -99
  148. package/src/home-paths.ts +2 -3
  149. package/src/host/agent-host.ts +82 -36
  150. package/src/host/bridge-host.ts +5 -11
  151. package/src/host/fetch-proxy-handler.ts +19 -43
  152. package/src/is-record.ts +4 -0
  153. package/src/menu.ts +82 -37
  154. package/src/metro-fingerprint-registry.ts +1 -4
  155. package/src/metro-production-bundle.ts +1 -1
  156. package/src/plist.ts +1 -4
  157. package/src/public-brand.ts +5 -3
  158. package/src/render-mode.ts +0 -12
  159. package/src/runtime-assets.ts +9 -2
  160. package/src/screenshots/compose.ts +7 -1
  161. package/src/screenshots/frame-compose.ts +21 -10
  162. package/src/screenshots/schema.ts +1 -4
  163. package/src/sim-client.ts +2 -4
  164. package/src/skills/builtin/maestro-test.ts +1 -4
  165. package/src/sleep.ts +4 -0
  166. package/src/swift-compile.ts +209 -47
  167. package/src/swift-icu.ts +140 -0
  168. package/src/swift-package.ts +26 -2
  169. package/src/swift-submit.ts +84 -4
  170. package/src/swift.ts +2 -0
  171. package/src/vite-plugin-kotlin.ts +376 -0
  172. package/src/vite-plugin-one.ts +224 -36
  173. package/src/vite-plugin-swift.ts +382 -96
  174. package/src/vite-plugin.ts +121 -134
  175. package/src/vite.d.ts +10 -0
  176. package/cli/resolve-assets.ts +0 -63
  177. package/src/rolldown-plugin-swift.ts +0 -244
  178. package/src/team-machine-prompt.ts +0 -73
package/dist-lib/menu.cjs CHANGED
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.578 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.579 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
@@ -25,8 +25,8 @@ __export(menu_exports, {
25
25
  SOOTSIM_AMBIENT_GLOW_LABELS: () => SOOTSIM_AMBIENT_GLOW_LABELS,
26
26
  SOOTSIM_AMBIENT_GLOW_LEVELS: () => SOOTSIM_AMBIENT_GLOW_LEVELS,
27
27
  SOOTSIM_ENGINE_EVENT_NAME: () => SOOTSIM_ENGINE_EVENT_NAME,
28
- SOOTSIM_HOME_SCREEN_VERSIONS: () => SOOTSIM_HOME_SCREEN_VERSIONS,
29
- SOOTSIM_HOME_SCREEN_VERSION_LABELS: () => SOOTSIM_HOME_SCREEN_VERSION_LABELS,
28
+ SOOTSIM_RENDER_RESOLUTION_LABELS: () => SOOTSIM_RENDER_RESOLUTION_LABELS,
29
+ SOOTSIM_RENDER_RESOLUTION_LEVELS: () => SOOTSIM_RENDER_RESOLUTION_LEVELS,
30
30
  SOOTSIM_SHELL_COMMAND_NAME: () => SOOTSIM_SHELL_COMMAND_NAME,
31
31
  buildSootSimDeviceChoiceDefs: () => buildSootSimDeviceChoiceDefs,
32
32
  buildSootSimMenuDefs: () => buildSootSimMenuDefs,
@@ -36,20 +36,21 @@ __export(menu_exports, {
36
36
  getShortcutDocSections: () => getShortcutDocSections,
37
37
  getShortcutDocSectionsFromDefs: () => getShortcutDocSectionsFromDefs,
38
38
  isSootSimAmbientGlowLevel: () => isSootSimAmbientGlowLevel,
39
- isSootSimHomeScreenVersion: () => isSootSimHomeScreenVersion,
39
+ isSootSimRenderResolution: () => isSootSimRenderResolution,
40
40
  matchesAccelerator: () => matchesAccelerator
41
41
  });
42
42
  module.exports = __toCommonJS(menu_exports);
43
43
 
44
44
  // src/public-brand.ts
45
45
  var name = "Peach";
46
- var rnxPublicBrand = Object.freeze({
46
+ var peachPublicBrand = Object.freeze({
47
47
  name,
48
48
  packageName: "peachsim",
49
49
  commandName: "peach",
50
- domain: "rnxsim.com",
51
- origin: "https://rnxsim.com"
50
+ domain: "peachsim.com",
51
+ origin: "https://peachsim.com"
52
52
  });
53
+ var rnxPublicBrand = peachPublicBrand;
53
54
 
54
55
  // src/menu.ts
55
56
  var SOOTSIM_ENGINE_EVENT_NAME = "sootsim:engine-event";
@@ -63,13 +64,14 @@ var SOOTSIM_AMBIENT_GLOW_LABELS = {
63
64
  soft: "Soft",
64
65
  full: "Full"
65
66
  };
66
- var SOOTSIM_HOME_SCREEN_VERSIONS = ["ios26", "ios27"];
67
- function isSootSimHomeScreenVersion(value) {
68
- return value === "ios26" || value === "ios27";
67
+ var SOOTSIM_RENDER_RESOLUTION_LEVELS = ["high", "medium", "low"];
68
+ function isSootSimRenderResolution(value) {
69
+ return value === "high" || value === "medium" || value === "low";
69
70
  }
70
- var SOOTSIM_HOME_SCREEN_VERSION_LABELS = {
71
- ios26: "iOS 26",
72
- ios27: "iOS 27"
71
+ var SOOTSIM_RENDER_RESOLUTION_LABELS = {
72
+ high: "High",
73
+ medium: "Medium",
74
+ low: "Low"
73
75
  };
74
76
  function buildSootSimMenuDefs(state, deviceChoices) {
75
77
  return [
@@ -245,6 +247,38 @@ function deviceMenu(state, deviceChoices) {
245
247
  },
246
248
  { type: "separator" },
247
249
  { label: "Trigger Screenshot", action: "screenshot" },
250
+ // pose controls for the current device: open/close on foldables,
251
+ // rotate left/right wherever a turn changes geometry, the way ios
252
+ // simulator holds them (rotate left is cmd+left, rotate right
253
+ // cmd+right). truthiness, not !== null: a partial state must hide
254
+ // these, never show duo items for the wrong device.
255
+ ...state.devicePosture || state.canRotate ? [
256
+ { type: "separator" },
257
+ ...state.devicePosture ? [
258
+ {
259
+ label: state.devicePosture === "open" ? "Close iPhone Duo" : "Open iPhone Duo",
260
+ action: "toggle-duo-posture"
261
+ }
262
+ ] : [],
263
+ ...state.canRotate ? [
264
+ {
265
+ label: "Rotate Left",
266
+ accelerator: "CmdOrCtrl+Left",
267
+ action: "rotate-left",
268
+ browserAccelerator: true,
269
+ shortcutLabel: "rotate left",
270
+ showInShortcutDocs: true
271
+ },
272
+ {
273
+ label: "Rotate Right",
274
+ accelerator: "CmdOrCtrl+Right",
275
+ action: "rotate-right",
276
+ browserAccelerator: true,
277
+ shortcutLabel: "rotate right",
278
+ showInShortcutDocs: true
279
+ }
280
+ ] : []
281
+ ] : [],
248
282
  { type: "separator" },
249
283
  ...buildSootSimDeviceChoiceDefs(state.currentDevice, deviceChoices, {
250
284
  action: "switch-device"
@@ -309,6 +343,11 @@ function debugMenu(state) {
309
343
  checked: state.alwaysShowLiveWebViews,
310
344
  action: "toggle-live-webviews"
311
345
  },
346
+ {
347
+ label: "Share This Tab for WebViews",
348
+ action: "capture-webviews",
349
+ hiddenIn: "electron"
350
+ },
312
351
  {
313
352
  label: "Send to Box Carries Sign-In",
314
353
  type: "checkbox",
@@ -404,21 +443,18 @@ function windowMenu(state) {
404
443
  actionPayload: level
405
444
  }))
406
445
  },
407
- // both eras stay selectable while the ios 27 home surfaces land one at a
408
- // time, and the device's own os picks the starting value. the switch is
409
- // the iPhone Duo's, so it is offered exactly where the Duo is.
410
- ...state.developmentMode ? [
411
- {
412
- label: "Home Screen",
413
- items: SOOTSIM_HOME_SCREEN_VERSIONS.map((version) => ({
414
- label: SOOTSIM_HOME_SCREEN_VERSION_LABELS[version],
415
- type: "radio",
416
- checked: state.homeScreenVersion === version,
417
- action: "set-home-screen",
418
- actionPayload: version
419
- }))
420
- }
421
- ] : [],
446
+ {
447
+ // every host: the level only changes backing-store sizes, so the
448
+ // device-shaped electron window shows it the same as the browser.
449
+ label: "Render Resolution",
450
+ items: SOOTSIM_RENDER_RESOLUTION_LEVELS.map((level) => ({
451
+ label: SOOTSIM_RENDER_RESOLUTION_LABELS[level],
452
+ type: "radio",
453
+ checked: state.renderResolution === level,
454
+ action: "set-render-resolution",
455
+ actionPayload: level
456
+ }))
457
+ },
422
458
  {
423
459
  label: "Wireframe",
424
460
  type: "checkbox",
@@ -630,8 +666,8 @@ function matchesAccelerator(event, accelerator) {
630
666
  SOOTSIM_AMBIENT_GLOW_LABELS,
631
667
  SOOTSIM_AMBIENT_GLOW_LEVELS,
632
668
  SOOTSIM_ENGINE_EVENT_NAME,
633
- SOOTSIM_HOME_SCREEN_VERSIONS,
634
- SOOTSIM_HOME_SCREEN_VERSION_LABELS,
669
+ SOOTSIM_RENDER_RESOLUTION_LABELS,
670
+ SOOTSIM_RENDER_RESOLUTION_LEVELS,
635
671
  SOOTSIM_SHELL_COMMAND_NAME,
636
672
  buildSootSimDeviceChoiceDefs,
637
673
  buildSootSimMenuDefs,
@@ -641,6 +677,6 @@ function matchesAccelerator(event, accelerator) {
641
677
  getShortcutDocSections,
642
678
  getShortcutDocSectionsFromDefs,
643
679
  isSootSimAmbientGlowLevel,
644
- isSootSimHomeScreenVersion,
680
+ isSootSimRenderResolution,
645
681
  matchesAccelerator
646
682
  });
package/dist-lib/menu.mjs CHANGED
@@ -1,14 +1,15 @@
1
- /*! rnx v0.1.578 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.579 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
 
3
3
  // src/public-brand.ts
4
4
  var name = "Peach";
5
- var rnxPublicBrand = Object.freeze({
5
+ var peachPublicBrand = Object.freeze({
6
6
  name,
7
7
  packageName: "peachsim",
8
8
  commandName: "peach",
9
- domain: "rnxsim.com",
10
- origin: "https://rnxsim.com"
9
+ domain: "peachsim.com",
10
+ origin: "https://peachsim.com"
11
11
  });
12
+ var rnxPublicBrand = peachPublicBrand;
12
13
 
13
14
  // src/menu.ts
14
15
  var SOOTSIM_ENGINE_EVENT_NAME = "sootsim:engine-event";
@@ -22,13 +23,14 @@ var SOOTSIM_AMBIENT_GLOW_LABELS = {
22
23
  soft: "Soft",
23
24
  full: "Full"
24
25
  };
25
- var SOOTSIM_HOME_SCREEN_VERSIONS = ["ios26", "ios27"];
26
- function isSootSimHomeScreenVersion(value) {
27
- return value === "ios26" || value === "ios27";
26
+ var SOOTSIM_RENDER_RESOLUTION_LEVELS = ["high", "medium", "low"];
27
+ function isSootSimRenderResolution(value) {
28
+ return value === "high" || value === "medium" || value === "low";
28
29
  }
29
- var SOOTSIM_HOME_SCREEN_VERSION_LABELS = {
30
- ios26: "iOS 26",
31
- ios27: "iOS 27"
30
+ var SOOTSIM_RENDER_RESOLUTION_LABELS = {
31
+ high: "High",
32
+ medium: "Medium",
33
+ low: "Low"
32
34
  };
33
35
  function buildSootSimMenuDefs(state, deviceChoices) {
34
36
  return [
@@ -204,6 +206,38 @@ function deviceMenu(state, deviceChoices) {
204
206
  },
205
207
  { type: "separator" },
206
208
  { label: "Trigger Screenshot", action: "screenshot" },
209
+ // pose controls for the current device: open/close on foldables,
210
+ // rotate left/right wherever a turn changes geometry, the way ios
211
+ // simulator holds them (rotate left is cmd+left, rotate right
212
+ // cmd+right). truthiness, not !== null: a partial state must hide
213
+ // these, never show duo items for the wrong device.
214
+ ...state.devicePosture || state.canRotate ? [
215
+ { type: "separator" },
216
+ ...state.devicePosture ? [
217
+ {
218
+ label: state.devicePosture === "open" ? "Close iPhone Duo" : "Open iPhone Duo",
219
+ action: "toggle-duo-posture"
220
+ }
221
+ ] : [],
222
+ ...state.canRotate ? [
223
+ {
224
+ label: "Rotate Left",
225
+ accelerator: "CmdOrCtrl+Left",
226
+ action: "rotate-left",
227
+ browserAccelerator: true,
228
+ shortcutLabel: "rotate left",
229
+ showInShortcutDocs: true
230
+ },
231
+ {
232
+ label: "Rotate Right",
233
+ accelerator: "CmdOrCtrl+Right",
234
+ action: "rotate-right",
235
+ browserAccelerator: true,
236
+ shortcutLabel: "rotate right",
237
+ showInShortcutDocs: true
238
+ }
239
+ ] : []
240
+ ] : [],
207
241
  { type: "separator" },
208
242
  ...buildSootSimDeviceChoiceDefs(state.currentDevice, deviceChoices, {
209
243
  action: "switch-device"
@@ -268,6 +302,11 @@ function debugMenu(state) {
268
302
  checked: state.alwaysShowLiveWebViews,
269
303
  action: "toggle-live-webviews"
270
304
  },
305
+ {
306
+ label: "Share This Tab for WebViews",
307
+ action: "capture-webviews",
308
+ hiddenIn: "electron"
309
+ },
271
310
  {
272
311
  label: "Send to Box Carries Sign-In",
273
312
  type: "checkbox",
@@ -363,21 +402,18 @@ function windowMenu(state) {
363
402
  actionPayload: level
364
403
  }))
365
404
  },
366
- // both eras stay selectable while the ios 27 home surfaces land one at a
367
- // time, and the device's own os picks the starting value. the switch is
368
- // the iPhone Duo's, so it is offered exactly where the Duo is.
369
- ...state.developmentMode ? [
370
- {
371
- label: "Home Screen",
372
- items: SOOTSIM_HOME_SCREEN_VERSIONS.map((version) => ({
373
- label: SOOTSIM_HOME_SCREEN_VERSION_LABELS[version],
374
- type: "radio",
375
- checked: state.homeScreenVersion === version,
376
- action: "set-home-screen",
377
- actionPayload: version
378
- }))
379
- }
380
- ] : [],
405
+ {
406
+ // every host: the level only changes backing-store sizes, so the
407
+ // device-shaped electron window shows it the same as the browser.
408
+ label: "Render Resolution",
409
+ items: SOOTSIM_RENDER_RESOLUTION_LEVELS.map((level) => ({
410
+ label: SOOTSIM_RENDER_RESOLUTION_LABELS[level],
411
+ type: "radio",
412
+ checked: state.renderResolution === level,
413
+ action: "set-render-resolution",
414
+ actionPayload: level
415
+ }))
416
+ },
381
417
  {
382
418
  label: "Wireframe",
383
419
  type: "checkbox",
@@ -588,8 +624,8 @@ export {
588
624
  SOOTSIM_AMBIENT_GLOW_LABELS,
589
625
  SOOTSIM_AMBIENT_GLOW_LEVELS,
590
626
  SOOTSIM_ENGINE_EVENT_NAME,
591
- SOOTSIM_HOME_SCREEN_VERSIONS,
592
- SOOTSIM_HOME_SCREEN_VERSION_LABELS,
627
+ SOOTSIM_RENDER_RESOLUTION_LABELS,
628
+ SOOTSIM_RENDER_RESOLUTION_LEVELS,
593
629
  SOOTSIM_SHELL_COMMAND_NAME,
594
630
  buildSootSimDeviceChoiceDefs,
595
631
  buildSootSimMenuDefs,
@@ -599,6 +635,6 @@ export {
599
635
  getShortcutDocSections,
600
636
  getShortcutDocSectionsFromDefs,
601
637
  isSootSimAmbientGlowLevel,
602
- isSootSimHomeScreenVersion,
638
+ isSootSimRenderResolution,
603
639
  matchesAccelerator
604
640
  };
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.578 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.579 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
@@ -30,13 +30,17 @@ __export(metro_fingerprint_registry_exports, {
30
30
  parseRNXMetroFingerprintRegistry: () => parseRNXMetroFingerprintRegistry
31
31
  });
32
32
  module.exports = __toCommonJS(metro_fingerprint_registry_exports);
33
+
34
+ // src/is-record.ts
35
+ function isRecord(value) {
36
+ return typeof value === "object" && value !== null && !Array.isArray(value);
37
+ }
38
+
39
+ // src/metro-fingerprint-registry.ts
33
40
  var RNX_METRO_FINGERPRINT_SCHEMA_VERSION = 2;
34
41
  var RNX_METRO_FINGERPRINT_POINTER_PATH = "/compile/metro-fingerprints.json";
35
42
  var RNX_METRO_FINGERPRINT_MAX_POINTER_BYTES = 16 * 1024;
36
43
  var RNX_METRO_FINGERPRINT_MAX_PAYLOAD_BYTES = 8 * 1024 * 1024;
37
- function isRecord(value) {
38
- return typeof value === "object" && value !== null && !Array.isArray(value);
39
- }
40
44
  function isSha256(value) {
41
45
  return typeof value === "string" && /^[a-f0-9]{64}$/.test(value);
42
46
  }
@@ -1,13 +1,15 @@
1
- /*! rnx v0.1.578 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.579 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
+
3
+ // src/is-record.ts
4
+ function isRecord(value) {
5
+ return typeof value === "object" && value !== null && !Array.isArray(value);
6
+ }
2
7
 
3
8
  // src/metro-fingerprint-registry.ts
4
9
  var RNX_METRO_FINGERPRINT_SCHEMA_VERSION = 2;
5
10
  var RNX_METRO_FINGERPRINT_POINTER_PATH = "/compile/metro-fingerprints.json";
6
11
  var RNX_METRO_FINGERPRINT_MAX_POINTER_BYTES = 16 * 1024;
7
12
  var RNX_METRO_FINGERPRINT_MAX_PAYLOAD_BYTES = 8 * 1024 * 1024;
8
- function isRecord(value) {
9
- return typeof value === "object" && value !== null && !Array.isArray(value);
10
- }
11
13
  function isSha256(value) {
12
14
  return typeof value === "string" && /^[a-f0-9]{64}$/.test(value);
13
15
  }
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.578 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.579 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
@@ -54,7 +54,7 @@ function toRNXDevelopmentBundleUrl(bundleUrl) {
54
54
  }
55
55
  var RNXSIM_METRO_SOURCE_MAP_COMMENT = "//# sourceMappingURL=";
56
56
  function detachRNXMetroSourceMapUrl(bundleText) {
57
- const trimmedEnd = bundleText.replace(/\s+$/, "");
57
+ const trimmedEnd = bundleText.trimEnd();
58
58
  const commentStart = trimmedEnd.lastIndexOf(`
59
59
  ${RNXSIM_METRO_SOURCE_MAP_COMMENT}`);
60
60
  if (commentStart < 0) return { source: bundleText, sourceMappingUrl: null };
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.578 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.579 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
 
3
3
  // src/metro-production-bundle.ts
4
4
  var RNXSIM_METRO_MODULE_PATHS_PREFIX = "globalThis.__sootsimModulePaths=";
@@ -21,7 +21,7 @@ function toRNXDevelopmentBundleUrl(bundleUrl) {
21
21
  }
22
22
  var RNXSIM_METRO_SOURCE_MAP_COMMENT = "//# sourceMappingURL=";
23
23
  function detachRNXMetroSourceMapUrl(bundleText) {
24
- const trimmedEnd = bundleText.replace(/\s+$/, "");
24
+ const trimmedEnd = bundleText.trimEnd();
25
25
  const commentStart = trimmedEnd.lastIndexOf(`
26
26
  ${RNXSIM_METRO_SOURCE_MAP_COMMENT}`);
27
27
  if (commentStart < 0) return { source: bundleText, sourceMappingUrl: null };
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.578 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.579 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __create = Object.create;
@@ -508,7 +508,7 @@ function toRNXDevelopmentBundleUrl(bundleUrl) {
508
508
  }
509
509
  var RNXSIM_METRO_SOURCE_MAP_COMMENT = "//# sourceMappingURL=";
510
510
  function detachRNXMetroSourceMapUrl(bundleText) {
511
- const trimmedEnd = bundleText.replace(/\s+$/, "");
511
+ const trimmedEnd = bundleText.trimEnd();
512
512
  const commentStart = trimmedEnd.lastIndexOf(`
513
513
  ${RNXSIM_METRO_SOURCE_MAP_COMMENT}`);
514
514
  if (commentStart < 0) return { source: bundleText, sourceMappingUrl: null };
@@ -626,7 +626,10 @@ var ROOT_RUNTIME_PATHS = [
626
626
  "/spike/",
627
627
  "/test-wallpaper.jpg",
628
628
  "/preview-sw.js",
629
- "/sootsim.svg"
629
+ "/sootsim.svg",
630
+ "/bedrock-sqlite.wasm",
631
+ "/bedrock-sqlite.js",
632
+ "/sootsim/"
630
633
  ];
631
634
  function resolveActiveRuntimeRoot() {
632
635
  const devRoot = resolveDevCheckoutRuntimeRoot();
@@ -683,7 +686,8 @@ function resolveRuntimeFilePath(runtimeRoot, pathname) {
683
686
  for (const segment of pathname.split("/")) {
684
687
  if (segment === "..") return null;
685
688
  }
686
- const fullPath = import_path.default.resolve(runtimeRoot, pathname.replace(/^\/+/, ""));
689
+ const normalized = pathname.startsWith("/sootsim/") ? pathname.slice("/sootsim".length) : pathname;
690
+ const fullPath = import_path.default.resolve(runtimeRoot, normalized.replace(/^\/+/, ""));
687
691
  const rootWithSep = runtimeRoot.endsWith(import_path.default.sep) ? runtimeRoot : runtimeRoot + import_path.default.sep;
688
692
  if (!fullPath.startsWith(rootWithSep) && fullPath !== runtimeRoot) return null;
689
693
  if (!import_fs.default.existsSync(fullPath) || !import_fs.default.statSync(fullPath).isFile()) return null;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.578 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.579 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __create = Object.create;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.578 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.579 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
@@ -22,18 +22,21 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
22
22
  // src/public-brand.ts
23
23
  var public_brand_exports = {};
24
24
  __export(public_brand_exports, {
25
+ peachPublicBrand: () => peachPublicBrand,
25
26
  rnxPublicBrand: () => rnxPublicBrand
26
27
  });
27
28
  module.exports = __toCommonJS(public_brand_exports);
28
29
  var name = "Peach";
29
- var rnxPublicBrand = Object.freeze({
30
+ var peachPublicBrand = Object.freeze({
30
31
  name,
31
32
  packageName: "peachsim",
32
33
  commandName: "peach",
33
- domain: "rnxsim.com",
34
- origin: "https://rnxsim.com"
34
+ domain: "peachsim.com",
35
+ origin: "https://peachsim.com"
35
36
  });
37
+ var rnxPublicBrand = peachPublicBrand;
36
38
  // Annotate the CommonJS export names for ESM import in node:
37
39
  0 && (module.exports = {
40
+ peachPublicBrand,
38
41
  rnxPublicBrand
39
42
  });
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.578 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.579 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.578 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.579 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
 
3
3
  // src/react-native-host-modules.ts
4
4
  var REACT_NATIVE_PASSTHROUGH_SPECIFIERS = [
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.578 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.579 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
@@ -22,16 +22,11 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
22
22
  // src/render-mode.ts
23
23
  var render_mode_exports = {};
24
24
  __export(render_mode_exports, {
25
- getRenderMode: () => getRenderMode,
26
25
  hasRenderWorkerBootstrap: () => hasRenderWorkerBootstrap,
27
26
  isRenderMainMode: () => isRenderMainMode,
28
- isRenderWorkerMode: () => isRenderWorkerMode,
29
- shouldEnableRenderWorker: () => shouldEnableRenderWorker
27
+ isRenderWorkerMode: () => isRenderWorkerMode
30
28
  });
31
29
  module.exports = __toCommonJS(render_mode_exports);
32
- function getRenderMode(_searchParams) {
33
- return "worker";
34
- }
35
30
  function isRenderWorkerMode(_searchParams) {
36
31
  return true;
37
32
  }
@@ -41,14 +36,9 @@ function isRenderMainMode(_searchParams) {
41
36
  function hasRenderWorkerBootstrap(workerModuleBaseUrl) {
42
37
  return typeof workerModuleBaseUrl === "string" && workerModuleBaseUrl.length > 0;
43
38
  }
44
- function shouldEnableRenderWorker(_searchParams, workerModuleBaseUrl) {
45
- return hasRenderWorkerBootstrap(workerModuleBaseUrl);
46
- }
47
39
  // Annotate the CommonJS export names for ESM import in node:
48
40
  0 && (module.exports = {
49
- getRenderMode,
50
41
  hasRenderWorkerBootstrap,
51
42
  isRenderMainMode,
52
- isRenderWorkerMode,
53
- shouldEnableRenderWorker
43
+ isRenderWorkerMode
54
44
  });
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.578 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.579 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __create = Object.create;
@@ -33,9 +33,7 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
33
33
  var dev_server_scanner_exports = {};
34
34
  __export(dev_server_scanner_exports, {
35
35
  DevServerScanUnavailableError: () => DevServerScanUnavailableError,
36
- __applyManifestForTests: () => __applyManifestForTests,
37
36
  __attachAppSettingsBundleForTests: () => __attachAppSettingsBundleForTests,
38
- __isSootSimSelfServerForTests: () => __isSootSimSelfServerForTests,
39
37
  __resetScannerCache: () => __resetScannerCache,
40
38
  __shouldReuseScannerCacheEntry: () => __shouldReuseScannerCacheEntry,
41
39
  discoverListeningPorts: () => discoverListeningPorts,
@@ -139,9 +137,13 @@ var import_node_path = require("node:path");
139
137
 
140
138
  // src/plist.ts
141
139
  var import_plist = __toESM(require("@expo/plist"), 1);
140
+
141
+ // src/is-record.ts
142
142
  function isRecord(value) {
143
143
  return typeof value === "object" && value !== null && !Array.isArray(value);
144
144
  }
145
+
146
+ // src/plist.ts
145
147
  function resolvePlistParser(value) {
146
148
  if (!isRecord(value)) return null;
147
149
  const direct = value.parse;
@@ -896,17 +898,6 @@ function applyManifest(result, manifestRes, buildIconProxyUrl) {
896
898
  }
897
899
  return result;
898
900
  }
899
- function __applyManifestForTests(result, manifestBody, buildIconProxyUrl) {
900
- return applyManifest(
901
- result,
902
- {
903
- statusCode: 200,
904
- body: manifestBody,
905
- hostname: new URL(result.bundleUrl).hostname
906
- },
907
- buildIconProxyUrl
908
- );
909
- }
910
901
  var ENRICH_TIMEOUT_MS = 2e4;
911
902
  var enrichmentCache = /* @__PURE__ */ new Map();
912
903
  var enrichmentInFlight = /* @__PURE__ */ new Set();
@@ -1103,7 +1094,6 @@ function isSootSimSelfServer(server) {
1103
1094
  if (bundleId?.startsWith("dev.peachsim.")) return true;
1104
1095
  return false;
1105
1096
  }
1106
- var __isSootSimSelfServerForTests = isSootSimSelfServer;
1107
1097
  var portCache = /* @__PURE__ */ new Map();
1108
1098
  var portCacheInvalidatedAt = /* @__PURE__ */ new Map();
1109
1099
  function invalidatePortCache(port) {
@@ -1233,9 +1223,7 @@ async function scanDevServers(opts = {}) {
1233
1223
  // Annotate the CommonJS export names for ESM import in node:
1234
1224
  0 && (module.exports = {
1235
1225
  DevServerScanUnavailableError,
1236
- __applyManifestForTests,
1237
1226
  __attachAppSettingsBundleForTests,
1238
- __isSootSimSelfServerForTests,
1239
1227
  __resetScannerCache,
1240
1228
  __shouldReuseScannerCacheEntry,
1241
1229
  discoverListeningPorts,