sootsim 0.1.293 → 0.1.294

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 (165) hide show
  1. package/detox/expectations.ts +4 -3
  2. package/detox/index.ts +2 -4
  3. package/dist-cli/bin.js +7 -5
  4. package/dist-cli/chunks/{agent-YWI2NWL7.js → agent-GDFF6G7N.js} +4 -2
  5. package/dist-cli/chunks/{agent-wrapper-IYJ7UZOA.js → agent-wrapper-ZUKQUOD2.js} +4 -2
  6. package/dist-cli/chunks/{app-fonts-FQFUC4LR.js → app-fonts-IMYBO6AQ.js} +4 -2
  7. package/dist-cli/chunks/{assert-XUCELWAC.js → assert-GXOGZUKO.js} +4 -2
  8. package/dist-cli/chunks/{auth-4DQTV3OW.js → auth-P7FAKLHQ.js} +4 -2
  9. package/dist-cli/chunks/beta-RXT5RU3A.js +4 -0
  10. package/dist-cli/chunks/{camera-RYOHBVZA.js → camera-RNVAC4IO.js} +4 -2
  11. package/dist-cli/chunks/{chunk-2XYCSFGN.js → chunk-24BJFJFB.js} +26 -24
  12. package/dist-cli/chunks/{chunk-WVMYRKSS.js → chunk-2M7OZ6Y4.js} +4 -2
  13. package/dist-cli/chunks/chunk-37ZXWXM3.js +4 -0
  14. package/dist-cli/chunks/{chunk-UOHGYYSO.js → chunk-3F2GAJ4Z.js} +3 -1
  15. package/dist-cli/chunks/{chunk-KC5SCOGS.js → chunk-4Z4URZOG.js} +4 -2
  16. package/dist-cli/chunks/{chunk-LOQLZFRK.js → chunk-5S3GPTX7.js} +4 -2
  17. package/dist-cli/chunks/chunk-6YN3IAWJ.js +4 -0
  18. package/dist-cli/chunks/{chunk-YRFWATLA.js → chunk-7HVMAGDK.js} +4 -2
  19. package/dist-cli/chunks/{chunk-4B4VFT73.js → chunk-7Q77LTPT.js} +7 -5
  20. package/dist-cli/chunks/{chunk-RKXHQ2Q3.js → chunk-AFLGWOX3.js} +18 -16
  21. package/dist-cli/chunks/{chunk-LA5DIO33.js → chunk-AMKQUZA2.js} +3 -1
  22. package/dist-cli/chunks/{chunk-TJS5IMOH.js → chunk-AO65WEF7.js} +3 -1
  23. package/dist-cli/chunks/{chunk-BQT5YDTV.js → chunk-BBVBMGTT.js} +5 -3
  24. package/dist-cli/chunks/{chunk-WPPMUUML.js → chunk-BXO2PTNM.js} +4 -2
  25. package/dist-cli/chunks/{chunk-2VKTOZQ5.js → chunk-CTMPC5DN.js} +4 -2
  26. package/dist-cli/chunks/{chunk-RV67J726.js → chunk-D2R7PDN5.js} +3 -1
  27. package/dist-cli/chunks/{chunk-RMLJXP7T.js → chunk-DI55E6CS.js} +4 -2
  28. package/dist-cli/chunks/chunk-DUHBRW7J.js +4 -0
  29. package/dist-cli/chunks/chunk-EXTV6NWM.js +74 -0
  30. package/dist-cli/chunks/{chunk-6IFJLHDA.js → chunk-FNCSUHUR.js} +3 -1
  31. package/dist-cli/chunks/{chunk-DE4ZA3NL.js → chunk-FSRRJGYC.js} +4 -2
  32. package/dist-cli/chunks/{chunk-UPKYK52K.js → chunk-I233T2T4.js} +4 -2
  33. package/dist-cli/chunks/{chunk-E5WYXRGV.js → chunk-ISJ4ACWL.js} +28 -26
  34. package/dist-cli/chunks/{chunk-AFRXWKTA.js → chunk-JFWEDISV.js} +3 -1
  35. package/dist-cli/chunks/chunk-JGGXQHXH.js +10 -0
  36. package/dist-cli/chunks/chunk-JUOQ4ZPA.js +7 -0
  37. package/dist-cli/chunks/{chunk-2M57EAWS.js → chunk-K53YCAQM.js} +3 -1
  38. package/dist-cli/chunks/{chunk-7B6RGFTM.js → chunk-KWIURH7N.js} +4 -2
  39. package/dist-cli/chunks/{chunk-VO74GDXL.js → chunk-N4MT5KEB.js} +5 -3
  40. package/dist-cli/chunks/{chunk-VZ44FQDG.js → chunk-O6I5ZGMY.js} +3 -1
  41. package/dist-cli/chunks/chunk-OKSGM6IG.js +4 -0
  42. package/dist-cli/chunks/chunk-OYYQQBKP.js +3 -0
  43. package/dist-cli/chunks/{chunk-NCCMRFXU.js → chunk-PSOUSJSZ.js} +3 -1
  44. package/dist-cli/chunks/{chunk-J6P2UPXH.js → chunk-PZTKQG6H.js} +4 -2
  45. package/dist-cli/chunks/{chunk-B7TX4WFB.js → chunk-RWUNC66S.js} +4 -2
  46. package/dist-cli/chunks/{chunk-547W23BB.js → chunk-SLMUW2WU.js} +4 -2
  47. package/dist-cli/chunks/{chunk-WI36YJ23.js → chunk-SPQKJDIK.js} +3 -1
  48. package/dist-cli/chunks/{chunk-PCAPHXN3.js → chunk-V2MYTL4C.js} +4 -2
  49. package/dist-cli/chunks/{chunk-JOPKZVOW.js → chunk-VVVORIQI.js} +3 -1
  50. package/dist-cli/chunks/chunk-VXGCZUX4.js +5 -0
  51. package/dist-cli/chunks/chunk-W44PDEQH.js +4 -0
  52. package/dist-cli/chunks/{chunk-WOWLO4LL.js → chunk-WQL3BLFD.js} +3 -1
  53. package/dist-cli/chunks/{chunk-U3564F2Y.js → chunk-WYRLRNIP.js} +4 -2
  54. package/dist-cli/chunks/{chunk-WP3TFHFL.js → chunk-XYFP466E.js} +4 -2
  55. package/dist-cli/chunks/chunk-ZFMJFX27.js +4 -0
  56. package/dist-cli/chunks/{chunk-67CIS55C.js → chunk-ZUX5PIGI.js} +3 -1
  57. package/dist-cli/chunks/{cleanup-BLFDJSFS.js → cleanup-74SKOD2P.js} +4 -2
  58. package/dist-cli/chunks/cli-version-2JGMYL4O.js +4 -0
  59. package/dist-cli/chunks/{compat-Q3WCSTB7.js → compat-ME6HXEEU.js} +5 -3
  60. package/dist-cli/chunks/{config-NHNMRRNB.js → config-PM67EWT3.js} +4 -2
  61. package/dist-cli/chunks/control-HV7GZXAH.js +4 -0
  62. package/dist-cli/chunks/daemon-LKRHF5OK.js +4 -0
  63. package/dist-cli/chunks/{debug-PGRMZFXA.js → debug-XUGWZLIW.js} +5 -3
  64. package/dist-cli/chunks/{desktop-NVTQ37LH.js → desktop-IO5HPX5Z.js} +5 -3
  65. package/dist-cli/chunks/{detox-W3JDXS76.js → detox-E42OEJJZ.js} +4 -2
  66. package/dist-cli/chunks/{device-KQYN3EVK.js → device-XA67L2EB.js} +4 -2
  67. package/dist-cli/chunks/{diagnose-CPUKSGNO.js → diagnose-36FD6ECF.js} +4 -2
  68. package/dist-cli/chunks/disk-cleanup-DDCFGFWK.js +4 -0
  69. package/dist-cli/chunks/drivers-C2SH3DWS.js +4 -0
  70. package/dist-cli/chunks/{film-VZGAZ2YY.js → film-XARTGFIZ.js} +11 -24
  71. package/dist-cli/chunks/flow-E64G5LF3.js +4 -0
  72. package/dist-cli/chunks/help-4ZSRG4F4.js +4 -0
  73. package/dist-cli/chunks/{hidden-runtime-alias-KWHABCNZ.js → hidden-runtime-alias-T4ZALBE2.js} +4 -2
  74. package/dist-cli/chunks/{home-paths-O4CGYVHF.js → home-paths-5L7N2FLS.js} +4 -2
  75. package/dist-cli/chunks/inspect-U2SV25ER.js +4 -0
  76. package/dist-cli/chunks/install-desktop-LTGVT7ID.js +4 -0
  77. package/dist-cli/chunks/{login-KPN4Z26Q.js → login-GF6WVVER.js} +6 -4
  78. package/dist-cli/chunks/logout-6F6UKUNI.js +4 -0
  79. package/dist-cli/chunks/{maestro-PYA4AHTS.js → maestro-FMPKHEMX.js} +13 -11
  80. package/dist-cli/chunks/{maestro-generate-KCMYWPWL.js → maestro-generate-QGPGNXI6.js} +5 -3
  81. package/dist-cli/chunks/{mode-AEB7G2SJ.js → mode-JSNMAHDZ.js} +4 -2
  82. package/dist-cli/chunks/optional-demo-registry-K4VERLJV.js +4 -0
  83. package/dist-cli/chunks/{perf-YLXGZI3E.js → perf-PO7ARUTG.js} +4 -2
  84. package/dist-cli/chunks/{permissions-7VMVZOUV.js → permissions-XI2QUAEZ.js} +4 -2
  85. package/dist-cli/chunks/{record-AVQO45PE.js → record-4CJCJAFD.js} +5 -3
  86. package/dist-cli/chunks/runtime-SN2RWDES.js +4 -0
  87. package/dist-cli/chunks/{screenshot-command-LACQLA4N.js → screenshot-command-NDVULWMZ.js} +5 -3
  88. package/dist-cli/chunks/{screenshots-capture-PROOBSGB.js → screenshots-capture-Q7UTXF3V.js} +4 -2
  89. package/dist-cli/chunks/{serve-FJN2FRGW.js → serve-UEUIBHCK.js} +4 -2
  90. package/dist-cli/chunks/{setup-IVV4NRYQ.js → setup-ZEEWYK4B.js} +5 -3
  91. package/dist-cli/chunks/{skills-WYR3PJOH.js → skills-NFG6VAO5.js} +4 -2
  92. package/dist-cli/chunks/{storage-GM7K4MGM.js → storage-POWCOUCQ.js} +4 -2
  93. package/dist-cli/chunks/store-BJK7V7FL.js +4 -0
  94. package/dist-cli/chunks/telemetry-EJP5EW7K.js +4 -0
  95. package/dist-cli/chunks/{timeline-R5UL3N4T.js → timeline-MNHZCVAL.js} +4 -2
  96. package/dist-cli/chunks/{upgrade-RWHSFZRX.js → upgrade-X57SIG7L.js} +4 -2
  97. package/dist-cli/chunks/upload-JABM3ITZ.js +4 -0
  98. package/dist-cli/chunks/{version-7K6TVQOW.js → version-V4IKIDX7.js} +4 -2
  99. package/dist-cli/chunks/web-F5CLF34I.js +4 -0
  100. package/dist-cli/chunks/{what-happened-K24TSJZX.js → what-happened-H74HHGRK.js} +4 -2
  101. package/dist-lib/agent-daemon-client.cjs +1 -1
  102. package/dist-lib/agent-events.cjs +1 -1
  103. package/dist-lib/agent-identity.cjs +3 -3
  104. package/dist-lib/agent-sessions.cjs +1 -1
  105. package/dist-lib/attached-projects.cjs +1 -1
  106. package/dist-lib/auth/shared-session.cjs +1 -1
  107. package/dist-lib/backend-origin.cjs +1 -1
  108. package/dist-lib/beta.cjs +1 -1
  109. package/dist-lib/beta.mjs +1 -1
  110. package/dist-lib/bridge-constants.cjs +1 -1
  111. package/dist-lib/cli-constants.cjs +1 -1
  112. package/dist-lib/config.cjs +1 -1
  113. package/dist-lib/detox/index.cjs +5 -4
  114. package/dist-lib/dev-bundle-resolution.cjs +1 -1
  115. package/dist-lib/home-paths.cjs +1 -1
  116. package/dist-lib/host/bridge-host.cjs +3 -3
  117. package/dist-lib/host/fetch-proxy-handler.cjs +1 -1
  118. package/dist-lib/host/fetch-proxy-overrides.cjs +1 -1
  119. package/dist-lib/host/fetch-proxy-overrides.mjs +1 -1
  120. package/dist-lib/host/websocket-proxy.cjs +1 -1
  121. package/dist-lib/index.cjs +1 -1
  122. package/dist-lib/jump-to-source-babel.cjs +1 -1
  123. package/dist-lib/menu.cjs +45 -4
  124. package/dist-lib/menu.mjs +42 -4
  125. package/dist-lib/metro.cjs +1 -1
  126. package/dist-lib/profiles.cjs +1 -1
  127. package/dist-lib/render-mode.cjs +1 -1
  128. package/dist-lib/scripts/dev-server-scanner.cjs +1 -1
  129. package/dist-lib/sdk.cjs +5 -2
  130. package/dist-lib/sdk.mjs +4 -2
  131. package/dist-lib/skills.cjs +325 -182
  132. package/dist-lib/vite.cjs +1 -1
  133. package/package.json +6 -1
  134. package/scripts/postinstall.cjs +11 -2
  135. package/src/agent-identity.ts +2 -2
  136. package/src/menu.ts +53 -4
  137. package/src/vite-plugin.ts +102 -2
  138. package/dist-cli/chunks/beta-CFDAW6UN.js +0 -2
  139. package/dist-cli/chunks/chunk-3UX6AY2B.js +0 -2
  140. package/dist-cli/chunks/chunk-6VVLDYPV.js +0 -8
  141. package/dist-cli/chunks/chunk-7H34H74K.js +0 -72
  142. package/dist-cli/chunks/chunk-7H5G4HUK.js +0 -2
  143. package/dist-cli/chunks/chunk-ACSTEPSD.js +0 -2
  144. package/dist-cli/chunks/chunk-HKMWUN7F.js +0 -2
  145. package/dist-cli/chunks/chunk-K5JEUI5G.js +0 -5
  146. package/dist-cli/chunks/chunk-MOU2WLO4.js +0 -2
  147. package/dist-cli/chunks/chunk-QXDXUDJD.js +0 -1
  148. package/dist-cli/chunks/chunk-USJTVC7T.js +0 -2
  149. package/dist-cli/chunks/chunk-YNG4C3ZS.js +0 -2
  150. package/dist-cli/chunks/cli-version-TQHZOK4L.js +0 -2
  151. package/dist-cli/chunks/control-I7YBDRJT.js +0 -2
  152. package/dist-cli/chunks/daemon-4R3SZLZY.js +0 -2
  153. package/dist-cli/chunks/disk-cleanup-2COWZWBC.js +0 -2
  154. package/dist-cli/chunks/drivers-RRZM6E72.js +0 -2
  155. package/dist-cli/chunks/flow-VH6DFDQ4.js +0 -2
  156. package/dist-cli/chunks/help-3HQ2RINO.js +0 -2
  157. package/dist-cli/chunks/inspect-PKMJGXDH.js +0 -2
  158. package/dist-cli/chunks/install-desktop-K5TP3ZHJ.js +0 -2
  159. package/dist-cli/chunks/logout-E3UCJAMC.js +0 -2
  160. package/dist-cli/chunks/optional-demo-registry-AIWOBAAA.js +0 -2
  161. package/dist-cli/chunks/runtime-HOGETVVD.js +0 -2
  162. package/dist-cli/chunks/store-YLVHPKG7.js +0 -2
  163. package/dist-cli/chunks/telemetry-MQKB6PFX.js +0 -2
  164. package/dist-cli/chunks/upload-RBH4XGJ2.js +0 -2
  165. package/dist-cli/chunks/web-46ZPQCAL.js +0 -2
package/dist-lib/vite.cjs CHANGED
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.293 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.294 | (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;
package/package.json CHANGED
@@ -1,9 +1,14 @@
1
1
  {
2
2
  "name": "sootsim",
3
- "version": "0.1.293",
3
+ "version": "0.1.294",
4
4
  "description": "sootsim CLI + vite/metro plugins + skills registry. bridge client for driving the proprietary sootsim-engine over WebSocket.",
5
5
  "author": "Tamagui LLC",
6
6
  "license": "MIT",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "git+https://github.com/sootbean/soot.git",
10
+ "directory": "packages/sootsim"
11
+ },
7
12
  "type": "module",
8
13
  "publishConfig": {
9
14
  "access": "public"
@@ -42,13 +42,22 @@ if (existingActiveRuntime) {
42
42
  process.exit(0)
43
43
  }
44
44
 
45
+ const RUNTIME_INSTALL_TIMEOUT_MS = 60_000
46
+
45
47
  const bin = path.join(__dirname, '..', 'dist-cli', 'bin.js')
46
48
  const res = spawnSync(process.execPath, [bin, 'runtime', 'install'], {
47
49
  stdio: 'inherit',
48
- timeout: 60_000,
50
+ timeout: RUNTIME_INSTALL_TIMEOUT_MS,
49
51
  })
50
52
 
51
- if (res.status !== 0) {
53
+ if (res.error && res.error.code === 'ETIMEDOUT') {
54
+ // the runtime tarball is ~48MB; on a slow link it does not finish inside the
55
+ // npm-install budget above. say that plainly instead of implying we chose to
56
+ // defer — the user has to run the install themselves for it to complete.
57
+ console.log(
58
+ `sootsim: runtime download did not finish within ${RUNTIME_INSTALL_TIMEOUT_MS / 1000}s, so npm install could return — run \`sootsim upgrade\` to finish it`,
59
+ )
60
+ } else if (res.status !== 0) {
52
61
  console.log('sootsim: runtime install deferred to first run')
53
62
  }
54
63
  process.exit(0)
@@ -12,8 +12,8 @@ export function agentSessionIdFromCliIdentity(identity: string | null): string |
12
12
  export function teamMachineSessionIdFromCliIdentity(
13
13
  identity: string | null,
14
14
  ): string | null {
15
- if (!identity?.startsWith('AGENTBUS_SESSION:')) return null
16
- const sessionId = identity.slice('AGENTBUS_SESSION:'.length).trim()
15
+ if (!identity?.startsWith('TM_SESSION:')) return null
16
+ const sessionId = identity.slice('TM_SESSION:'.length).trim()
17
17
  if (!TEAM_MACHINE_SESSION_RE.test(sessionId)) return null
18
18
  return sessionId
19
19
  }
package/src/menu.ts CHANGED
@@ -7,6 +7,26 @@ export const SOOTSIM_SHELL_COMMAND_NAME = 'sootsim:shell-command'
7
7
  export type SootSimMenuPlatform = 'browser' | 'electron'
8
8
  export type SootSimScaleMode = 'physical' | 'point' | 'pixel' | 'fit'
9
9
 
10
+ // ambient glow strength. one setting with three states rather than an on/off
11
+ // pair plus a separate strength: every host that carries the preference (the
12
+ // menus, the persisted setting, the ?ambientGlow= boot seed, the live
13
+ // set-ambient-glow push, electron's shared config) then carries exactly one
14
+ // value and cannot end up half-configured.
15
+ export type SootSimAmbientGlowLevel = 'off' | 'soft' | 'full'
16
+ export const SOOTSIM_AMBIENT_GLOW_LEVELS = ['off', 'soft', 'full'] as const
17
+
18
+ export function isSootSimAmbientGlowLevel(
19
+ value: unknown,
20
+ ): value is SootSimAmbientGlowLevel {
21
+ return value === 'off' || value === 'soft' || value === 'full'
22
+ }
23
+
24
+ export const SOOTSIM_AMBIENT_GLOW_LABELS: Record<SootSimAmbientGlowLevel, string> = {
25
+ off: 'Off',
26
+ soft: 'Soft',
27
+ full: 'Full',
28
+ }
29
+
10
30
  export type SootSimMenuItemDef =
11
31
  | { type: 'separator' }
12
32
  | {
@@ -35,8 +55,10 @@ export type SootSimMenuDef = {
35
55
  export interface SootSimMenuState {
36
56
  currentDevice: string
37
57
  showBezels: boolean
38
- showTopBar: boolean
58
+ showMenuBar: boolean
39
59
  showRail: boolean
60
+ solidWindow: boolean
61
+ ambientGlow: SootSimAmbientGlowLevel
40
62
  screenshotMode: boolean
41
63
  threeMode: boolean
42
64
  inspectMode: boolean
@@ -73,6 +95,7 @@ export interface SootSimShortcutDocSection {
73
95
  export type MenuItemDef = SootSimMenuItemDef
74
96
  export type MenuDef = SootSimMenuDef
75
97
  export type MenuState = SootSimMenuState
98
+ export type AmbientGlowLevel = SootSimAmbientGlowLevel
76
99
  export type ShortcutPlatform = SootSimMenuPlatform
77
100
  export type MenuShortcutEntry = SootSimMenuShortcutEntry
78
101
  export type ShortcutDocEntry = SootSimShortcutDocEntry
@@ -366,10 +389,11 @@ function windowMenu(state: SootSimMenuState): SootSimMenuDef {
366
389
  action: 'toggle-bezels',
367
390
  },
368
391
  {
369
- label: 'Show Top Bar',
392
+ label: 'Show Menu Bar',
370
393
  type: 'checkbox',
371
- checked: state.showTopBar,
372
- action: 'toggle-topbar',
394
+ checked: state.showMenuBar,
395
+ action: 'toggle-menubar',
396
+ hiddenIn: 'electron',
373
397
  },
374
398
  {
375
399
  label: 'Show Rail',
@@ -378,6 +402,31 @@ function windowMenu(state: SootSimMenuState): SootSimMenuDef {
378
402
  action: 'toggle-rail',
379
403
  hiddenIn: 'electron',
380
404
  },
405
+ {
406
+ // desktop only. the device window is frameless and transparent, which
407
+ // is right for a phone floating on the desktop and wrong for the
408
+ // full-window modes; this pins the solid style on all the time. 3d
409
+ // mode switches to it on its own either way.
410
+ label: 'Solid Window',
411
+ type: 'checkbox',
412
+ checked: state.solidWindow,
413
+ action: 'toggle-solid-window',
414
+ hiddenIn: 'browser',
415
+ },
416
+ {
417
+ // browser only: the wash needs several glow radii of stage around the
418
+ // device to fade out in, and electron's transparent window is sized to
419
+ // the device, so there it can only paint a clipped rectangle.
420
+ label: 'Ambient Glow',
421
+ hiddenIn: 'electron',
422
+ items: SOOTSIM_AMBIENT_GLOW_LEVELS.map((level) => ({
423
+ label: SOOTSIM_AMBIENT_GLOW_LABELS[level],
424
+ type: 'radio' as const,
425
+ checked: state.ambientGlow === level,
426
+ action: 'set-ambient-glow',
427
+ actionPayload: level,
428
+ })),
429
+ },
381
430
  {
382
431
  label: 'Screenshot',
383
432
  type: 'checkbox',
@@ -15,6 +15,7 @@ import { fileURLToPath } from 'url'
15
15
  import { type Plugin, transformWithOxc } from 'vite'
16
16
  import { resolveExportsHiddenSubpath } from '../../compat/src/resolve-hidden-subpath.ts'
17
17
  import {
18
+ SOOTSIM_COMPAT_PUBLISHED_BROWSER_ENTRIES,
18
19
  SOOTSIM_COMPAT_WRAPPER_REAL_PACKAGES,
19
20
  SOOTSIM_HAPTIC_FEEDBACK_TOUCHABLE_SOURCE,
20
21
  SOOTSIM_HAPTIC_FEEDBACK_TOUCHABLE_SPECIFIER,
@@ -95,6 +96,68 @@ const rnLibraryStubs = Object.fromEntries(
95
96
  ]),
96
97
  )
97
98
 
99
+ type PublishedBrowserPackage = {
100
+ specifier: string
101
+ packageDir: string
102
+ browserEntry: string
103
+ }
104
+
105
+ function resolvePublishedBrowserPackages(appDir: string): PublishedBrowserPackage[] {
106
+ const packageRequire = appDir
107
+ ? createRequire(path.join(appDir, 'package.json'))
108
+ : sootsimPluginRequire
109
+ return Object.values(SOOTSIM_COMPAT_PUBLISHED_BROWSER_ENTRIES).flatMap(
110
+ ({ specifier }) => {
111
+ try {
112
+ const packageJson = packageRequire.resolve(`${specifier}/package.json`)
113
+ const packageManifest = JSON.parse(fs.readFileSync(packageJson, 'utf8'))
114
+ const rootExport = Reflect.get(packageManifest.exports, '.')
115
+ const browserFile =
116
+ typeof rootExport === 'object' && rootExport !== null
117
+ ? Reflect.get(rootExport, 'browser')
118
+ : undefined
119
+ if (typeof browserFile !== 'string') return []
120
+ const packageDir = path.dirname(packageJson)
121
+ const browserEntry = path.resolve(packageDir, browserFile)
122
+ if (!fs.existsSync(browserEntry)) return []
123
+ return [{ specifier, packageDir, browserEntry }]
124
+ } catch {
125
+ return []
126
+ }
127
+ },
128
+ )
129
+ }
130
+
131
+ function resolvePublishedBrowserInternal(
132
+ source: string,
133
+ importer: string | undefined,
134
+ packages: PublishedBrowserPackage[],
135
+ ): string | null {
136
+ if (!importer || !source.startsWith('.')) return null
137
+ const cleanImporter = importer.split('?')[0]
138
+ const packageEntry = packages.find(({ packageDir }) => {
139
+ const relative = path.relative(packageDir, cleanImporter)
140
+ return relative.length > 0 && !relative.startsWith('..') && !path.isAbsolute(relative)
141
+ })
142
+ if (!packageEntry) return null
143
+
144
+ const cleanSource = source.split('?')[0]
145
+ const resolved = path.resolve(path.dirname(cleanImporter), cleanSource)
146
+ const sourceExtension = path.extname(cleanSource)
147
+ if (sourceExtension) {
148
+ const candidate = `${resolved.slice(0, -sourceExtension.length)}.web${sourceExtension}`
149
+ return fs.existsSync(candidate) ? candidate : null
150
+ }
151
+
152
+ for (const extension of ['.tsx', '.ts', '.jsx', '.js', '.mjs', '.cjs']) {
153
+ const fileCandidate = `${resolved}.web${extension}`
154
+ if (fs.existsSync(fileCandidate)) return fileCandidate
155
+ const indexCandidate = path.join(resolved, `index.web${extension}`)
156
+ if (fs.existsSync(indexCandidate)) return indexCandidate
157
+ }
158
+ return null
159
+ }
160
+
98
161
  // resolve the real @react-navigation/native location at config time so the
99
162
  // wrapper at compat/src/stubs/react-navigation-native.tsx can import it
100
163
  // without bouncing back through the alias above. the wrapper imports from
@@ -269,6 +332,7 @@ export function sootsim(options: SootSimOptions = {}): Plugin[] {
269
332
  const appDir = options.app ? path.resolve(options.app) : ''
270
333
  const extraSources = (options.sources || []).map((s) => path.resolve(s))
271
334
  const ownedPackages = new Set([...coreOwnedPackages, ...(options.ownedPackages || [])])
335
+ const publishedBrowserPackages = resolvePublishedBrowserPackages(appDir)
272
336
 
273
337
  function isAppSource(filePath: string): boolean {
274
338
  // exclude node_modules — only actual app source files
@@ -280,7 +344,14 @@ export function sootsim(options: SootSimOptions = {}): Plugin[] {
280
344
  return [
281
345
  wsBridgePlugin(),
282
346
  reactBridgePlugin(),
283
- sootsimConfigPlugin(appDir, extraSources),
347
+ {
348
+ name: 'sootsim-published-browser-internals',
349
+ enforce: 'pre',
350
+ resolveId(source, importer) {
351
+ return resolvePublishedBrowserInternal(source, importer, publishedBrowserPackages)
352
+ },
353
+ },
354
+ sootsimConfigPlugin(appDir, extraSources, publishedBrowserPackages),
284
355
  rnghUpstreamInternalResolvePlugin(),
285
356
  fixJsxRuntimeExports(),
286
357
  flowStripTransform(),
@@ -688,7 +759,11 @@ export function wsBridgePlugin(): Plugin {
688
759
  }
689
760
 
690
761
  // applies resolve, define, optimizeDeps config
691
- function sootsimConfigPlugin(appDir: string, extraSources: string[]): Plugin {
762
+ function sootsimConfigPlugin(
763
+ appDir: string,
764
+ extraSources: string[],
765
+ publishedBrowserPackages: PublishedBrowserPackage[],
766
+ ): Plugin {
692
767
  return {
693
768
  name: 'sootsim-config',
694
769
  config(_, { mode }) {
@@ -710,6 +785,13 @@ function sootsimConfigPlugin(appDir: string, extraSources: string[]): Plugin {
710
785
  replacement: path.resolve(compatStubsDir, file),
711
786
  }))
712
787
 
788
+ const publishedBrowserEntryAliases = publishedBrowserPackages.map(
789
+ ({ specifier, browserEntry }) => ({
790
+ find: new RegExp(`^${specifier.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')}$`),
791
+ replacement: browserEntry,
792
+ }),
793
+ )
794
+
713
795
  const dedupe = ['react', 'react-dom', 'react/jsx-runtime', 'react/jsx-dev-runtime']
714
796
 
715
797
  // internal sootsim builds must keep the entire Tamagui package family on a
@@ -735,6 +817,12 @@ function sootsimConfigPlugin(appDir: string, extraSources: string[]): Plugin {
735
817
  // them served live so our plugin aliases kick in.
736
818
  '@gorhom/bottom-sheet',
737
819
  '@gorhom/portal',
820
+ // these reviewed packages publish a supported browser artifact. keep
821
+ // them on the live graph so the exact alias below wins over their
822
+ // `react-native` export during dependency optimization too.
823
+ ...Object.values(SOOTSIM_COMPAT_PUBLISHED_BROWSER_ENTRIES).map(
824
+ ({ specifier }) => specifier,
825
+ ),
738
826
  ]
739
827
 
740
828
  return {
@@ -797,6 +885,17 @@ function sootsimConfigPlugin(appDir: string, extraSources: string[]): Plugin {
797
885
  ],
798
886
  },
799
887
  plugins: [
888
+ {
889
+ name: 'sootsim-published-browser-internals',
890
+ resolveId(source: string, importer: string | undefined) {
891
+ const replacement = resolvePublishedBrowserInternal(
892
+ source,
893
+ importer,
894
+ publishedBrowserPackages,
895
+ )
896
+ return replacement ? { id: replacement } : null
897
+ },
898
+ },
800
899
  {
801
900
  name: 'sootsim-stub-images',
802
901
  resolveId(source: string, importer: string | undefined) {
@@ -843,6 +942,7 @@ function sootsimConfigPlugin(appDir: string, extraSources: string[]): Plugin {
843
942
  ],
844
943
  alias: [
845
944
  ...sootsimBrowserSourceAliases,
945
+ ...publishedBrowserEntryAliases,
846
946
  ...Object.entries(rnLibraryStubs).map(([find, replacement]) => ({
847
947
  find,
848
948
  replacement,
@@ -1,2 +0,0 @@
1
- /*! sootsim v0.1.293 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{a,b,c,d}from"./chunk-USJTVC7T.js";import"./chunk-RV67J726.js";export{d as BETA_ASK_HEADLINE,b as BETA_LABEL,c as BETA_TAGLINE,a as IS_BETA};
@@ -1,2 +0,0 @@
1
- /*! sootsim v0.1.293 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- var t=4001,r="sootsim close";var e="http://localhost:5173/";export{t as a,r as b,e as c};
@@ -1,8 +0,0 @@
1
- /*! sootsim v0.1.293 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{a as c}from"./chunk-UPKYK52K.js";import{a}from"./chunk-KC5SCOGS.js";import{a as e}from"./chunk-RMLJXP7T.js";import{c as n}from"./chunk-3UX6AY2B.js";import{c as i,d as m,e as p}from"./chunk-AFRXWKTA.js";import{a as u}from"./chunk-NCCMRFXU.js";import{a as f,c as s}from"./chunk-USJTVC7T.js";function g(){return`sootsim CLI v${u()} \xB7 ${c().primary}`}function C(){let r=m({bridgePort:7668,defaultShellUrl:n},e()),o=`
3
- ${s}
4
- `;console.log(`${g()}
5
- ${o}${r}
6
- `),a("clean-uninstall")}function E(r){let o=i(r,{bridgePort:7668,defaultShellUrl:n},e());return o?(console.log(`${o}
7
- `),!0):!1}function I(r,o={}){let l=p(r,{bridgePort:7668,defaultShellUrl:n},o);if(!l){console.log(`unknown command: ${r}`);return}console.log(`${l}
8
- `)}export{C as a,E as b,I as c};
@@ -1,72 +0,0 @@
1
- /*! sootsim v0.1.293 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{c as F,d as M}from"./chunk-7H5G4HUK.js";import{c as H}from"./chunk-6VVLDYPV.js";import{g as R,j as L,r as U,s as x,t as O}from"./chunk-WOWLO4LL.js";import{a as j}from"./chunk-NCCMRFXU.js";import{execFileSync as Q,spawnSync as a}from"child_process";import{existsSync as l,mkdirSync as E,readFileSync as it,realpathSync as at,rmSync as h,writeFileSync as q}from"fs";import{homedir as b}from"os";import{basename as ct,dirname as C,resolve as u,sep as W}from"path";import{execFileSync as Z}from"child_process";import{chmodSync as tt,mkdirSync as A,rmSync as et,writeFileSync as I}from"fs";import{dirname as _}from"path";var rt="dev.sootsim.daemon",V="SootSim Daemon",Y="0.1.36";function G(t,e,r){let n=x(),o=O(),i=_(_(o)),c=_(o),p=`${i}/Resources`;et(n,{recursive:!0,force:!0}),A(U(),{recursive:!0}),A(c,{recursive:!0}),A(p,{recursive:!0}),I(`${i}/Info.plist`,ot()),I(`${i}/PkgInfo`,"APPL????"),I(o,nt(t,e,r)),tt(o,493);try{Z("codesign",["--force","--sign","-","--deep",n],{stdio:"pipe"})}catch(s){let f=s instanceof Error?s.message:String(s);console.warn(` warning: ad-hoc codesign of ${n} failed: ${f}
3
- the daemon will still run, but Login Items may show a generic name.`)}return{bundlePath:n,launcherPath:o}}function ot(){return`<?xml version="1.0" encoding="UTF-8"?>
4
- <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
5
- <plist version="1.0">
6
- <dict>
7
- <key>CFBundleDevelopmentRegion</key><string>en</string>
8
- <key>CFBundleDisplayName</key><string>${V}</string>
9
- <key>CFBundleExecutable</key><string>sootsim-daemon</string>
10
- <key>CFBundleIdentifier</key><string>${rt}</string>
11
- <key>CFBundleInfoDictionaryVersion</key><string>6.0</string>
12
- <key>CFBundleName</key><string>${V}</string>
13
- <key>CFBundlePackageType</key><string>APPL</string>
14
- <key>CFBundleShortVersionString</key><string>${Y}</string>
15
- <key>CFBundleSignature</key><string>????</string>
16
- <key>CFBundleVersion</key><string>${Y}</string>
17
- <key>LSBackgroundOnly</key><true/>
18
- <key>LSUIElement</key><true/>
19
- <key>LSMinimumSystemVersion</key><string>13.0</string>
20
- <key>NSHumanReadableCopyright</key><string>Tamagui LLC</string>
21
- </dict>
22
- </plist>
23
- `}function nt(t,e,r){let o=[t.executable,...t.prefixArgs,"serve","--quiet","--port",String(e)].map(T).join(" "),i=T(r.stdout),c=T(r.stderr);return`#!/bin/sh
24
- # SootSim Daemon launcher \u2014 auto-generated by 'sootsim setup'.
25
- # launchd spawns this; we exec the real sootsim invocation in place so
26
- # launchd tracks the daemon process, not the shell wrapper.
27
- #
28
- # stdout: ${r.stdout}
29
- # stderr: ${r.stderr}
30
- # a missing or broken executable can make launchd retry forever. truncate a
31
- # retry log before it passes 10 MiB so that failure stays bounded on disk.
32
- for log_path in ${i} ${c}; do
33
- if [ -f "$log_path" ]; then
34
- log_bytes=$(wc -c < "$log_path" 2>/dev/null || echo 0)
35
- if [ "$log_bytes" -gt 10485760 ]; then
36
- : > "$log_path"
37
- fi
38
- fi
39
- done
40
- exec ${o}
41
- `}function T(t){return`'${t.replace(/'/g,"'\\''")}'`}var z=60,y="dev.sootsim.daemon",N="dev.sootsim.server",g="sootsim-daemon",m=u(b(),"Library/Logs/sootsim"),D=u(b(),".local/state/sootsim");async function Yt(t,e={}){let[r,...n]=t,o=e.port??7668;if(!r||r==="--help"||r==="-h"){K();return}new Set(["install","uninstall","restart","start","stop","logs"]).has(r)&&F({event:`daemon_${r}`,properties:{platform:process.platform,subsource:"daemon"}});try{switch(r){case"install":return await bt({port:o,force:n.includes("--force")});case"uninstall":return await St();case"status":return await kt();case"restart":return await xt();case"start":return await Dt();case"stop":return await Et();case"logs":return await Pt(n);default:console.error(` unknown daemon subcommand: ${r}`),K(),process.exit(1)}}finally{await M()}}function K(){H("daemon")}function lt(){let t=ut();if(t)return t;let e=gt();return{executable:process.execPath,prefixArgs:[e]}}function ut(){if(!pt())return null;let t=dt();if(!t)return null;let e=j(),r=e==="0.0.0"?"sootsim":`sootsim@${e}`;return{executable:process.execPath,prefixArgs:[t,"exec","--yes","--package",r,"--","sootsim"]}}function pt(){let t=process.argv[1];return process.env.npm_command==="exec"?!0:t?P(t).includes(`${W}_npx${W}`):!1}function dt(){try{let e=Q("which",["npm"],{encoding:"utf8"}).trim();if(e&&l(e))return X(e)}catch{}let t=process.env.npm_execpath;return t&&l(t)?X(t):null}function X(t){let e=P(t);if(ct(e)==="npx-cli.js"){let r=u(C(e),"npm-cli.js");if(l(r))return r}return e}function gt(){try{let e=Q("which",["sootsim"],{encoding:"utf8"}).trim();if(e&&l(e))return P(e)}catch{}let t=process.argv[1];if(t&&l(t))return P(t);throw new Error("could not locate the sootsim binary")}function P(t){try{return at(t)}catch{return t}}function mt(t,e){E(m,{recursive:!0});let r=u(m,"bridge.out.log"),n=u(m,"bridge.err.log"),{launcherPath:o}=G(t,e,{stdout:r,stderr:n}),i=` <string>${ht(o)}</string>`;return`<?xml version="1.0" encoding="UTF-8"?>
42
- <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
43
- <plist version="1.0">
44
- <dict>
45
- <key>Label</key><string>${y}</string>
46
- <key>ProgramArguments</key>
47
- <array>
48
- ${i}
49
- </array>
50
- <key>RunAtLoad</key><true/>
51
- <key>KeepAlive</key><true/>
52
- <key>ThrottleInterval</key><integer>${z}</integer>
53
- <key>ProcessType</key><string>Background</string>
54
- <key>StandardOutPath</key><string>${r}</string>
55
- <key>StandardErrorPath</key><string>${n}</string>
56
- </dict>
57
- </plist>
58
- `}function ft(t,e){return E(D,{recursive:!0}),`[Unit]
59
- Description=sootsim bridge daemon
60
- After=default.target
61
-
62
- [Service]
63
- Type=simple
64
- ExecStart=${[t.executable,...t.prefixArgs].map(yt).join(" ")} serve --quiet --port ${e}
65
- Restart=always
66
- RestartSec=${z}
67
-
68
- [Install]
69
- WantedBy=default.target
70
- `}function ht(t){return t.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&apos;")}function yt(t){return/[^\w@%+=:,./-]/.test(t)?`'${t.replace(/'/g,"'\\''")}'`:t}function w(){return u(b(),"Library/LaunchAgents",`${y}.plist`)}function $t(t=b()){return u(t,"Library/LaunchAgents",`${N}.plist`)}function S(){return u(b(),".config/systemd/user",`${g}.service`)}function Gt(){if(L())return{supported:!1,installed:!1};if(process.platform==="darwin"){let t=w();return{supported:!0,installed:l(t),path:t}}if(process.platform==="linux"){let t=S();return{supported:!0,installed:l(t),path:t}}return{supported:!1,installed:!1}}async function bt({port:t,force:e}){if(L())throw new Error("background daemon setup is unavailable in this environment");let r=lt();if(console.log(` binary: ${[r.executable,...r.prefixArgs].join(" ")}`),console.log(` port: ${t}`),process.platform==="darwin"){J().missing||console.log(` removed legacy ${N} service`);let o=w();if(l(o)&&!e){console.log(` already installed at ${o}`),console.log(" pass --force to overwrite, or use 'sootsim daemon restart' to reload");return}E(C(o),{recursive:!0}),q(o,mt(r,t)),console.log(` wrote ${o}`);let i=`gui/${process.getuid()}`,c=`${i}/${y}`,p=()=>{let d=a("launchctl",["bootstrap",i,o],{stdio:"pipe",encoding:"utf8"}),k=(d.stderr||d.stdout||"").trim();if(d.status!==0)return{ok:!1,reason:`bootstrap exit ${d.status}${k?`: ${k}`:""}`};let B=a("launchctl",["print",c],{encoding:"utf8"});return B.status!==0?{ok:!1,reason:`bootstrap returned 0 but service not registered (print exit ${B.status})`}:{ok:!0}},s=p();if(!s.ok){let d=s.reason;if(a("launchctl",["bootout",c],{stdio:"ignore"}),s=p(),!s.ok)throw new Error(`launchctl bootstrap failed: ${s.reason}`+(d!==s.reason?` (initial: ${d})`:"")+" \u2014 try `sootsim daemon uninstall` then retry, or reboot if launchd state is stuck.")}let f=Date.now()+4e3,$,v;for(;Date.now()<f;){let d=a("launchctl",["print",c],{encoding:"utf8"});if(d.status===0&&($=d.stdout?.match(/state\s*=\s*(\w+)/)?.[1],v=d.stdout?.match(/pid\s*=\s*(\d+)/)?.[1],$==="running"||v))break;await new Promise(k=>setTimeout(k,150))}if($!=="running"&&!v)throw new Error(`daemon registered but did not reach running state within 4s (last state: ${$||"unknown"}). check ${u(m,"bridge.err.log")} \u2014 typically a stale runtime or a port already bound by another process.`);console.log(` registered (state: ${$||"unknown"}${v?`, pid ${v}`:""}, log: ${u(m,"bridge.err.log")})`);return}if(process.platform==="linux"){let n=S();if(l(n)&&!e){console.log(` already installed at ${n}`),console.log(" pass --force to overwrite, or use 'sootsim daemon restart' to reload");return}E(C(n),{recursive:!0}),q(n,ft(r,t)),console.log(` wrote ${n}`);let o=a("systemctl",["--user","daemon-reload"],{stdio:"pipe",encoding:"utf8"});if(o.status!==0){let s=(o.stderr||o.stdout||"").trim();throw new Error(`systemctl daemon-reload failed${s?`: ${s}`:""}`)}let i=a("systemctl",["--user","enable","--now",g],{stdio:"pipe",encoding:"utf8"});if(i.status!==0){let s=(i.stderr||i.stdout||"").trim();throw new Error(`systemctl enable --now failed${s?`: ${s}`:""} \u2014 try \`sootsim daemon uninstall\` then retry.`)}let p=(a("systemctl",["--user","is-active",g],{encoding:"utf8"}).stdout||"").trim()||"unknown";console.log(` registered (state: ${p}, journalctl --user -u ${g} to tail logs)`);try{let s=process.env.USER||process.env.LOGNAME||"";if(s){let f=a("loginctl",["show-user",s,"--property=Linger","--value"],{encoding:"utf8"});!((f.stdout||"").trim().toLowerCase()==="yes")&&f.status===0&&console.log(` note: linger is not enabled for "${s}". the daemon will exit at logout.
71
- enable persistence with: sudo loginctl enable-linger ${s}`)}}catch{}return}console.error(` background daemon is not supported on ${process.platform}`),console.error(" run 'sootsim serve' in a persistent shell instead"),process.exit(1)}function J(t={}){let e=t.userHome??b(),r=$t(e),n=u(e,"Library/Logs/sootsim"),o=[];if(l(r)){let i=`${t.launchTarget??`gui/${process.getuid?.()??0}`}/${N}`;(t.bootout??(p=>{a("launchctl",["bootout",p],{stdio:"ignore"})}))(i),h(r,{force:!0}),o.push(r)}for(let i of["server.err.log","server.out.log"]){let c=u(n,i);l(c)&&(h(c,{force:!0}),o.push(c))}return{removed:o,missing:o.length===0}}function vt(){let t=[];if(process.platform==="darwin"){let e=J();t.push(...e.removed);let r=w();l(r)&&(a("launchctl",["bootout",`gui/${process.getuid()}/${y}`],{stdio:"ignore"}),h(r,{force:!0}),t.push(r));let n=x();return l(n)&&(h(n,{recursive:!0,force:!0}),t.push(n)),l(m)&&(h(m,{recursive:!0,force:!0}),t.push(m)),{removed:t,missing:t.length===0}}if(process.platform==="linux"){let e=S();return l(e)&&(a("systemctl",["--user","disable","--now",g],{stdio:"ignore"}),h(e,{force:!0}),a("systemctl",["--user","daemon-reload"],{stdio:"ignore"}),a("systemctl",["--user","reset-failed",g],{stdio:"ignore"}),t.push(e)),l(D)&&(h(D,{recursive:!0,force:!0}),t.push(D)),{removed:t,missing:t.length===0}}return{removed:t,missing:!0}}function wt(){let t=[],e=R();return l(e)&&(h(e,{recursive:!0,force:!0}),t.push(e)),{removed:t,missing:t.length===0}}async function St(){let t=vt();for(let r of t.removed)console.log(` removed ${r}`);let e=wt();for(let r of e.removed)console.log(` removed ${r}`);t.missing&&e.missing&&console.log(" not installed")}async function kt(){if(process.platform==="darwin"){let t=w();if(!l(t)){console.log(" installed: no");return}console.log(` installed: yes (${t})`);let e=Lt(t);e&&console.log(` binary: ${e}`);let r=a("launchctl",["print",`gui/${process.getuid()}/${y}`],{encoding:"utf8"});if(r.status===0){let n=r.stdout.match(/state\s*=\s*(\w+)/)?.[1],o=r.stdout.match(/pid\s*=\s*(\d+)/)?.[1];console.log(` state: ${n||"unknown"}${o?` (pid ${o})`:""}`)}else console.log(" state: not running");return}if(process.platform==="linux"){let t=S();if(!l(t)){console.log(" installed: no");return}console.log(` installed: yes (${t})`);let e=a("systemctl",["--user","is-active",g],{encoding:"utf8"});console.log(` state: ${e.stdout.trim()||"unknown"}`);return}console.error(` unsupported platform: ${process.platform}`),process.exit(1)}async function xt(){if(process.platform==="darwin"){let t=w();l(t)||(console.error(" daemon not registered \u2014 run `sootsim setup`"),process.exit(1));let e=a("launchctl",["kickstart","-k",`gui/${process.getuid()}/${y}`],{stdio:"pipe",encoding:"utf8"});e.status!==0&&(console.error(` kickstart failed: ${e.stderr?.trim()}`),process.exit(1)),console.log(" restarted");return}if(process.platform==="linux"){let t=S();l(t)||(console.error(" daemon not registered \u2014 run `sootsim setup`"),process.exit(1));let e=a("systemctl",["--user","restart",g],{stdio:"pipe",encoding:"utf8"});e.status!==0&&(console.error(` restart failed: ${e.stderr?.trim()}`),process.exit(1)),console.log(" restarted");return}console.error(` unsupported platform: ${process.platform}`),process.exit(1)}async function Dt(){if(process.platform==="darwin"){a("launchctl",["kickstart",`gui/${process.getuid()}/${y}`],{stdio:"inherit"});return}if(process.platform==="linux"){a("systemctl",["--user","start",g],{stdio:"inherit"});return}console.error(` unsupported platform: ${process.platform}`),process.exit(1)}async function Et(){if(process.platform==="darwin"){a("launchctl",["bootout",`gui/${process.getuid()}/${y}`],{stdio:"inherit"});return}if(process.platform==="linux"){a("systemctl",["--user","stop",g],{stdio:"inherit"});return}console.error(` unsupported platform: ${process.platform}`),process.exit(1)}async function Pt(t){let e=t.find(o=>/^-n\d+$|^--lines=\d+$|^\d+$/.test(o)),r=e?Number(e.replace(/\D/g,"")):200,n=t.includes("-f")||t.includes("--follow");if(process.platform==="darwin"){let o=u(m,"bridge.out.log"),i=u(m,"bridge.err.log"),c=[o,i].filter(s=>l(s));c.length===0&&(console.error(` no daemon logs yet at ${m} \u2014 run \`sootsim setup\` to install the daemon`),process.exit(1));let p=n?["-n",String(r),"-F",...c]:["-n",String(r),...c];a("tail",p,{stdio:"inherit"});return}if(process.platform==="linux"){let o=`${g}.service`,i=["--user","-u",o,"-n",String(r),"--no-pager"],c=a("journalctl",n?[...i,"-f"]:i,{encoding:"utf8",stdio:n?"inherit":"pipe"});if(n)return;let p=`${c.stdout||""}${c.stderr||""}`,s=/insufficient permissions|No journal files were opened/i.test(p);if(c.status===0&&!s){process.stdout.write(c.stdout||"");return}let f=a("journalctl",[`_SYSTEMD_USER_UNIT=${o}`,"-n",String(r),"--no-pager"],{encoding:"utf8"});if(f.status===0&&(f.stdout||"").trim()){process.stdout.write(f.stdout);return}console.error(` could not read --user journal for ${o} (this user isn't in the systemd-journal group yet).
72
- run: sudo journalctl _SYSTEMD_USER_UNIT=${o} -n ${r} --no-pager`),process.exit(1)}console.error(` unsupported platform: ${process.platform}`),process.exit(1)}function Lt(t){try{return it(t,"utf8").match(/<array>\s*<string>([^<]+)<\/string>/)?.[1]||null}catch{return null}}export{Yt as a,Gt as b,bt as c,J as d,vt as e,wt as f};
@@ -1,2 +0,0 @@
1
- /*! sootsim v0.1.293 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{a}from"./chunk-547W23BB.js";import{A as l,B as u}from"./chunk-WOWLO4LL.js";var c=/^[A-Za-z0-9._:-]{1,160}$/;function T(e){if(!e?.startsWith("AGENTBUS_SESSION:"))return null;let n=e.slice(17).trim();return c.test(n)?n:null}function p(e){return c.test(e)}function f(){let e=process.env.DO_NOT_TRACK;return e==="1"||e==="true"||!l()}function S(){if(f())return null;let e=process.env.VITE_POSTHOG_API_KEY||"";if(!e)return null;let n=process.env.CONTRAST_POSTHOG_HOST||process.env.VITE_POSTHOG_HOST||"https://us.i.posthog.com";return{apiKey:e,host:n.replace(/\/+$/,"")}}function d(){try{return u()}catch{return"anonymous-cli"}}function m(e){return e?e.userId?e.userId:e.installationId!=null?`install:${e.installationId}`:e.repoId?`repo:${e.repoId}`:e.shareId?`share:${e.shareId}`:d():d()}function g(e){let n=e.identity??{},i=process.env.AGENTBUS_SESSION,s=i&&p(i)?"agentbus":process.env.CI==="1"||process.env.CI==="true"||process.env.GITHUB_ACTIONS==="true"?"ci":null,t={$lib:"sootsim-cli",source:n.source??"cli",...e.properties,traffic_type:s?"automated":"human",is_automated:s!==null,...s?{automation_source:s}:{}};return n.userId&&(t.userId=n.userId),n.repoId&&(t.repoId=n.repoId),n.installationId!=null&&(t.installationId=String(n.installationId)),n.shareId&&(t.shareId=n.shareId),n.plan&&(t.plan=n.plan),{event:e.event,distinct_id:m(n),properties:t,timestamp:new Date().toISOString()}}var r=[],I=!1;async function o(){if(r.length===0)return;let e=S();if(!e){r.length=0;return}let n=r.splice(0,r.length).map(g);try{await fetch(`${e.host}/batch/`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({api_key:e.apiKey,batch:n}),signal:AbortSignal.timeout(2e3)})}catch{}}function h(){I||(I=!0,process.on("beforeExit",()=>void o()),process.on("exit",()=>void o()))}function E(e){if(f())return;h();let n=null;try{n=a()?.user?.id??null}catch{n=null}r.push({...e,identity:{source:"cli",userId:n,...e.identity}})}async function C(){await o()}export{T as a,p as b,E as c,C as d};
@@ -1,2 +0,0 @@
1
- /*! sootsim v0.1.293 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{createHash as D}from"node:crypto";import y from"node:fs";import{createRequire as I}from"node:module";import h from"node:path";var w=/(^|\/)expo-splash-screen$/,R=/(^|\/)react-native-bootsplash$/;function U(n,e){let r=e.replace(/\/+$/,""),o=n.replace(/^\.\//,"").replace(/^\/+/,"");if(o)return`${r}/assets/${o}`}function d(n,e,r){return r?r(n):U(n,e)}function C(n){if(n==="cover")return"cover";if(n==="contain"||n==="native")return"contain"}function p(n){return typeof n=="string"&&n.length>0?n:void 0}function k(n){return typeof n=="number"&&Number.isFinite(n)?n:void 0}function v(n,e,r){if(!n||typeof n!="object")return null;let o=n,s={source:"expo-splash-screen",backgroundColor:p(o.backgroundColor)??"#ffffff"},l=p(o.image);l&&(s.imageUrl=d(l,e,r));let t=k(o.imageWidth);t!=null&&(s.imageWidthPx=t);let c=C(o.resizeMode);c&&(s.resizeMode=c);let i=o.dark;if(i&&typeof i=="object"){let g=i,u=p(g.backgroundColor),f=p(g.image);(u||f)&&(s.dark={},u&&(s.dark.backgroundColor=u),f&&(s.dark.imageUrl=d(f,e,r)))}return s}function j(n,e,r,o){let a=n[e],s=a&&typeof a=="object"?a.splash:void 0,l=n.splash,t=s&&typeof s=="object"?s:l;if(!t||typeof t!="object")return null;let i={source:"expo-legacy",backgroundColor:p(t.backgroundColor)??"#ffffff",imageWidthPx:k(t.imageWidth)??200,resizeMode:C(t.resizeMode)??"contain"},g=p(t.image);g&&(i.imageUrl=d(g,r,o));let u=t.dark;if(u&&typeof u=="object"){let f=u,S=p(f.backgroundColor),m=p(f.image);(S||m)&&(i.dark={},S&&(i.dark.backgroundColor=S),m&&(i.dark.imageUrl=d(m,r,o)))}return i}function _(n,e,r){if(!n||typeof n!="object")return null;let o=n,a=p(o.logo);if(!a)return null;let s={source:"react-native-bootsplash",backgroundColor:p(o.background)??"#fff",imageUrl:d(a,e,r),imageWidthPx:k(o.logoWidth)??100,resizeMode:"contain"},l=p(o.darkBackground),t=p(o.darkLogo);return(l||t)&&(s.dark={},l&&(s.dark.backgroundColor=l),t&&(s.dark.imageUrl=d(t,e,r))),s}function b(n,e,r,o={}){if(!n||typeof n!="object")return null;let a=n,s=a.plugins,l=null,t=null;if(Array.isArray(s))for(let i of s){let g=Array.isArray(i)?i[0]:i;if(typeof g!="string")continue;let u=Array.isArray(i)?i[1]??{}:{};!l&&w.test(g)?l=v(u,r,o.resolveAssetUrl):!t&&R.test(g)&&(t=_(u,r,o.resolveAssetUrl))}if(l)return l;let c=j(a,e,r,o.resolveAssetUrl);return c||t}var x=I(import.meta.url);function E(n){try{let e=new URL(n),r=e.hostname.replace(/^\[|\]$/g,"").toLowerCase();if(r==="localhost"||r.endsWith(".localhost")||r==="0.0.0.0"||r==="::1"||/^127(?:\.\d{1,3}){3}$/.test(r))return e.origin}catch{}return null}var L=["app.config.js","app.config.ts","app.config.cjs","app.config.mjs","app.json"];function P(n){for(let e of L)try{if(y.statSync(h.join(n,e)).isFile())return!0}catch{}return!1}var F=new Set(["node_modules","artifacts","dist","build","out","coverage","tmp","public","ios","android","macos","windows","__fixtures__","__tests__","examples","example"]);function A(n,e){P(n)&&e.push(n);let r;try{r=y.readdirSync(n,{withFileTypes:!0})}catch{return}for(let o of r)o.isDirectory()&&(o.name.startsWith(".")||F.has(o.name)||A(h.join(n,o.name),e))}function M(n){try{return y.statSync(h.join(n,"package.json")).isFile()}catch{return!1}}function H(n){let e=E(n.bundleUrl);if(!e)return null;let r=n.repoDir||process.env.CONTRAST_REPO_DIR,o=r?h.resolve(r):process.cwd();if(!r&&!M(o))return null;let a=[];if(r)A(o,a),a.includes(o)||a.push(o);else{if(!P(o))return null;a.push(o)}if(a.length===0)return null;let s=(n.platform||process.env.CONTRAST_PLATFORM||"ios").toLowerCase(),l=null;try{let c=x.resolve("@expo/config",{paths:[...a,o]}),i=x(c);typeof i.getConfig=="function"&&(l=i.getConfig)}catch{}if(!l)return null;let t;for(let c of a)try{let i=l(c,{skipSDKVersionRequirement:!0});if(i?.exp&&typeof i.exp=="object"){t=i.exp;break}}catch{}return!t||typeof t!="object"?null:b(t,s==="android"?"android":"ios",e)}function J(n){return encodeURIComponent(JSON.stringify(n))}function z(n){if(!n)return null;try{let e=JSON.parse(decodeURIComponent(n));if(!e||typeof e!="object")return null;let r=e;return r.source!=="expo-splash-screen"&&r.source!=="expo-legacy"&&r.source!=="react-native-bootsplash"||typeof r.backgroundColor!="string"?null:e}catch{return null}}function W(n){let e=new Set;return n.imageUrl&&e.add(n.imageUrl),n.dark?.imageUrl&&e.add(n.dark.imageUrl),[...e]}function N(n){let e=(n.split("?")[0].split(".").pop()||"").toLowerCase();return e==="png"?"image/png":e==="jpg"||e==="jpeg"?"image/jpeg":e==="webp"?"image/webp":e==="gif"?"image/gif":e==="svg"?"image/svg+xml":"application/octet-stream"}async function K(n,e){let r=z(n);if(!r)return[];let o=[],a=new Set;for(let s of W(r)){let l=D("sha256").update(s).digest("hex");if(!a.has(l)){a.add(l);try{let t=await fetch(s);if(!t.ok){e?.onError?.(s,new Error(`${t.status} ${t.statusText}`));continue}let c=new Uint8Array(await t.arrayBuffer());o.push({url:s,urlhash:l,contentType:N(s),bytes:c}),e?.onStaged?.({url:s,byteLength:c.byteLength})}catch(t){e?.onError?.(s,t)}}}return o}export{H as a,J as b,K as c};
@@ -1,2 +0,0 @@
1
- /*! sootsim v0.1.293 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{c as k,k as l,l as C,m as w}from"./chunk-YNG4C3ZS.js";var m="sootsim:settings",a=["errorReporting","colorScheme","reduceMotion","boldText","fontSize","largerAccessibilitySizes","a11yMode","a11yDepth","screenshotCanvas","screenshotBackground","screenshotText","screenshotPose","screenshotDynamicSize","alwaysShowLiveWebViews","showTopBar","showRail","agentProvider","onboardingComplete","betaConsentVersion","detailedTelemetry"];function R(){if(typeof window>"u")return null;let e=window.sootsimElectron;return e&&typeof e=="object"?e:null}function g(e){let n={};for(let t of a){if(!(t in e))continue;let o=e[t],i=l[t];i.validate&&!i.validate(o)||i.options&&!i.options.includes(o)||(n[t]=o)}return n}function V(e){let n={};for(let t of a)n[t]=e[t];return n}function D(){if(typeof localStorage>"u")return{};try{let e=localStorage.getItem(m);return e?g(JSON.parse(e)):{}}catch{return{}}}function j(e){if(!(typeof localStorage>"u"))try{localStorage.setItem(m,JSON.stringify(e))}catch{}}function x(){let n=R()?.sharedConfig?.settings;return!n||typeof n!="object"?{}:g(n)}function T(e){let n=R();if(n?.writeSharedConfig)try{n.writeSharedConfig({settings:e})}catch{}}function K(){if(typeof window>"u")return null;let e=window.__sootsimSharedConfig;return e&&typeof e=="object"?e:null}function M(){let e=K()?.settings;return!e||typeof e!="object"?{}:g(e)}function B(e){if(!K())return;let n={settings:e};try{if(globalThis.__sootsimBridgeRequest?.writeSharedConfig?.(n))return}catch{}if(!(typeof fetch>"u"))try{fetch("/__sootsim/shared-config",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(n),keepalive:!0}).catch(()=>{})}catch{}}function P(){let e=D(),n=M(),t=x();return{...e,...n,...t}}function _(e,n={}){let t=V(e);for(let o of a)n[o]!==void 0&&(t[o]=n[o]);j(t),T(t),B(t)}function E(e){if(typeof window>"u")return()=>{};let n=r=>{if(!(r.key!==m||r.newValue==null))try{e(g(JSON.parse(r.newValue)))}catch{}};window.addEventListener("storage",n);let t=R(),o;t?.onSharedConfigChanged&&(o=t.onSharedConfigChanged(r=>{let d=r?.settings;!d||typeof d!="object"||e(g(d))}));let c=globalThis.__sootsimBridgeRequest?.subscribeSharedConfig?.(r=>{let d=r?.settings;!d||typeof d!="object"||e(g(d))});return()=>{window.removeEventListener("storage",n),o?.(),c?.()}}var I=C(),O=w(),p=P(),u=new Set,S={};for(let e of a)I[e]!==void 0&&(u.add(e),p[e]!==void 0&&(S[e]=p[e]),delete p[e]);var s={...O,...p},h=[],f=null;function y(){for(let e of h)e()}function b(){y(),_(s,S)}function v(e,n){let t=l[e];return t.validate&&!t.validate(n)||t.options&&!t.options.includes(n)||s[e]===n?!1:(s={...s,[e]:n},e==="deviceModel"&&(f=null),!0)}E(e=>{let n={...s},t=!1;for(let[o,i]of Object.entries(e)){let c=o;if(u.has(c)){S[c]=i;continue}n[c]!==i&&(n[c]=i,t=!0)}t&&(s=n,f=null,y())});var N={get(e){return s[e]},set(e,n){v(e,n)&&b()},setRuntime(e,n){u.has(e)||(u.add(e),a.includes(e)&&(S[e]=s[e])),v(e,n)&&y()},isRuntimeControlled(e){return u.has(e)},getAll(){return s},apply(e){let n=!1,t={...s};for(let[o,i]of Object.entries(e)){if(i===void 0)continue;let c=o,r=l[c];r&&(r.validate&&!r.validate(i)||r.options&&!r.options.includes(i)||t[c]!==i&&(t[c]=i,n=!0))}n&&(s=t,f=null,b())},applyRuntime(e){let n=!1;for(let t of Object.keys(e)){let o=e[t];o!==void 0&&(u.has(t)||(u.add(t),a.includes(t)&&(S[t]=s[t])),v(t,o)&&(n=!0))}n&&y()},reset(){s=w(),f=null,b()},subscribe(e){return h.push(e),()=>{h=h.filter(n=>n!==e)}},getDeviceSpec(){return f||(f=k(s.deviceModel)),f},getA11yMode(){return s.a11yMode},setA11yMode(e){this.set("a11yMode",e)},getInspectMode(){return s.inspectMode},setInspectMode(e){this.set("inspectMode",e)}};export{N as a};
@@ -1,5 +0,0 @@
1
- /*! sootsim v0.1.293 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{existsSync as A,mkdirSync as M,readFileSync as v,rmSync as f,writeFileSync as h}from"fs";import{tmpdir as w}from"os";import{dirname as B,join as $,resolve as U}from"path";import{execFileSync as _}from"child_process";import{readFileSync as b}from"fs";import{createRequire as y}from"module";var c=null,p=null;function m(r){c||(c=T());try{return c(r)}catch{return null}}function C(r){p||(p=O());try{return p(r)}catch{return null}}function O(){if(process.platform==="linux")return r=>{try{return b(`/proc/${r}/comm`,"utf8").trim()||null}catch{return null}};if(process.platform==="darwin"){let r=x();return r||F()}return()=>null}function T(){let r=Number(process.env.PPID);if(Number.isFinite(r)&&r>1&&r!==process.ppid)return()=>r;if(process.platform==="linux")return D();if(process.platform==="darwin"){let n=R();return n||k()}return()=>null}function D(){return r=>{try{let n=b(`/proc/${r}/stat`,"utf8"),t=n.lastIndexOf(")");if(t<0)return null;let e=n.slice(t+1).trim().split(/\s+/),i=Number(e[1]);return Number.isFinite(i)&&i>0?i:null}catch{return null}}}var N=3,l=216,P=16,S=48,L=16;function R(){if(!process.versions?.bun)return null;try{let r=y(import.meta.url),{dlopen:n,FFIType:t}=r("bun:ffi"),e=n("/usr/lib/libproc.dylib",{proc_pidinfo:{args:[t.i32,t.i32,t.u64,t.ptr,t.i32],returns:t.i32}}),i=Buffer.alloc(l);return o=>{if(Number(e.symbols.proc_pidinfo(o,N,0n,i,l))<=0)return null;let u=i.readUInt32LE(P);return u>0?u:null}}catch{return null}}function x(){if(!process.versions?.bun)return null;try{let r=y(import.meta.url),{dlopen:n,FFIType:t}=r("bun:ffi"),e=n("/usr/lib/libproc.dylib",{proc_pidinfo:{args:[t.i32,t.i32,t.u64,t.ptr,t.i32],returns:t.i32}}),i=Buffer.alloc(l);return o=>{if(Number(e.symbols.proc_pidinfo(o,N,0n,i,l))<=0)return null;let u=i.subarray(S,S+L),I=u.indexOf(0);return u.subarray(0,I<0?u.length:I).toString("utf8")||null}}catch{return null}}function F(){return r=>{try{let t=_("lsof",["-R","-p",String(r),"-d","cwd","-a"],{encoding:"utf8",timeout:2e3,stdio:["ignore","pipe","ignore"]}).split(`
3
- `)[1];return t&&t.trim().split(/\s+/)[0]||null}catch{return null}}}function k(){return r=>{try{let t=_("lsof",["-R","-p",String(r),"-d","cwd","-a"],{encoding:"utf8",timeout:2e3,stdio:["ignore","pipe","ignore"]}).split(`
4
- `)[1];if(!t)return null;let e=t.trim().split(/\s+/),i=Number(e[2]);return Number.isFinite(i)&&i>1?i:null}catch{return null}}}var d=1,g="SOOTSIM_CLI_CURRENT_SIM_PATH",V=["SOOTSIM_CLI_IDENTITY","AGENTBUS_SESSION","CLAUDE_CODE_SESSION_ID","CODEX_THREAD_ID","TERM_SESSION_ID","ITERM_SESSION_ID","TMUX_PANE","STY","KITTY_WINDOW_ID","WEZTERM_PANE","ALACRITTY_WINDOW_ID","WINDOWID","VSCODE_INJECTION"],W=/^(?:tmux|screen)|^tm$/i;function E(r,n=20){let t=r,e=m(r);if(!e||e<=1)return null;for(let i=0;i<n;i++){let o=C(e);if(o&&W.test(o))return t;let s=m(e);if(!s||s<=1)return o?e:t;t=e,e=s}return e}function Y(){for(let n of V){let t=process.env[n];if(t&&t.trim())return{key:`${n}:${t.trim()}`,source:n,stable:!0}}let r=E(process.ppid);return r&&r>1?{key:`gppid-${r}`,source:"grand-ppid",stable:!0}:{key:`pid-${process.ppid}`,source:"ppid",stable:!1}}function H(){return Y().key}function tr(){return E(process.ppid)}function a(){if(process.env[g])return U(process.env[g]);let r=H();return $(w(),`sootsim-current-sim-${r}.json`)}function J(){let r=a();if(!A(r))return null;try{let n=JSON.parse(v(r,"utf8"));return n.version!==d||typeof n.simId!="string"||!n.simId.trim()||typeof n.updatedAt!="string"?(f(r,{force:!0}),null):{version:d,simId:n.simId.trim(),updatedAt:n.updatedAt}}catch{return f(r,{force:!0}),null}}function nr(){return J()?.simId||null}function er(r){let n=r.trim();if(!n)return;let t=a();M(B(t),{recursive:!0}),h(t,JSON.stringify({version:d,simId:n,updatedAt:new Date().toISOString()},null,2)+`
5
- `)}function ir(){f(a(),{force:!0})}export{C as a,Y as b,H as c,tr as d,nr as e,er as f,ir as g};
@@ -1,2 +0,0 @@
1
- /*! sootsim v0.1.293 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{createHash as b}from"node:crypto";import g from"node:fs";import{createRequire as R}from"node:module";import u from"node:path";var y=/\.(ttf|otf|woff|woff2)$/i;function P(t,n,r){if(!t||typeof t!="object")return;let o=t.fonts;if(Array.isArray(o))for(let i of o)typeof i=="string"&&r.push(i);let e=t[n];if(!e||typeof e!="object")return;let s=e.fonts;if(Array.isArray(s))for(let i of s){if(typeof i=="string"){r.push(i);continue}if(!i||typeof i!="object")continue;let c=i.fontDefinitions;if(Array.isArray(c))for(let a of c){if(!a||typeof a!="object")continue;let p=a.path;typeof p=="string"&&r.push(p)}}}function m(t,n){if(!Array.isArray(t))return[];let r=[];for(let o of t){let e=Array.isArray(o)?o[0]:o;if(typeof e!="string"||!/(^|\/)expo-font$/.test(e))continue;let s=Array.isArray(o)?o[1]??{}:{};P(s,n,r)}return r}function C(t){return t.slice(t.lastIndexOf("/")+1).replace(y,"")}function h(t,n){let r=n.replace(/\/+$/,""),o=new Set,e=[];for(let s of t){let i=s.replace(/^\.\//,"").replace(/^\/+/,"");!i||o.has(i)||(o.add(i),y.test(i)&&e.push({family:C(i),url:`${r}/assets/${i}`}))}return e}var d=R(import.meta.url);function x(t){try{let n=new URL(t),r=n.hostname.replace(/^\[|\]$/g,"").toLowerCase();if(r==="localhost"||r.endsWith(".localhost")||r==="0.0.0.0"||r==="::1"||/^127(?:\.\d{1,3}){3}$/.test(r))return n.origin}catch{}return null}var S=["app.config.js","app.config.ts","app.config.cjs","app.config.mjs","app.json"];function w(t){for(let n of S)try{if(g.statSync(u.join(t,n)).isFile())return!0}catch{}return!1}var j=new Set(["node_modules","artifacts","dist","build","out","coverage","tmp","public","ios","android","macos","windows","__fixtures__","__tests__","examples","example"]);function A(t,n){w(t)&&n.push(t);let r;try{r=g.readdirSync(t,{withFileTypes:!0})}catch{return}for(let o of r)o.isDirectory()&&(o.name.startsWith(".")||j.has(o.name)||A(u.join(t,o.name),n))}function _(t){try{return g.statSync(u.join(t,"package.json")).isFile()}catch{return!1}}function I(t){let n=x(t.bundleUrl);if(!n)return[];let r=t.repoDir||process.env.CONTRAST_REPO_DIR,o=r?u.resolve(r):process.cwd();if(!r&&!_(o))return[];let e=[];if(r)A(o,e),e.includes(o)||e.push(o);else{if(!w(o))return[];e.push(o)}if(e.length===0)return[];let s=(t.platform||process.env.CONTRAST_PLATFORM||"ios").toLowerCase(),i=null;try{let l=d.resolve("@expo/config",{paths:[...e,o]}),f=d(l);typeof f.getConfig=="function"&&(i=f.getConfig)}catch{}if(!i)return[];let c;for(let l of e)try{let f=i(l,{skipSDKVersionRequirement:!0});if(f?.exp&&typeof f.exp=="object"){let F=f.exp.plugins;if(Array.isArray(F)){c=f.exp;break}}}catch{}if(!c||typeof c!="object")return[];let a=c.plugins;if(!Array.isArray(a))return[];let p=m(a,s==="android"?"android":"ios");return h(p,n)}async function L(t,n){let r=x(t);if(!r)return null;let o=new AbortController,e=setTimeout(()=>o.abort(),n?.timeoutMs??1500);try{let s=await fetch(`${r}/`,{headers:{"expo-platform":"ios",Accept:"application/json"},signal:o.signal});if(!s.ok)return null;let c=(await s.json())?.extra?.expoClient?._internal?.projectRoot;return typeof c=="string"&&c.length>0?c:null}catch{return null}finally{clearTimeout(e)}}function M(t){return t.map(n=>`${encodeURIComponent(n.url)}::${encodeURIComponent(n.family)}`).join(",")}function k(t){let n=[];for(let r of t.split(",")){let o=r.trim();if(!o)continue;let e=o.indexOf("::"),s=e===-1?o:o.slice(0,e);try{n.push(decodeURIComponent(s))}catch{n.push(s)}}return n.filter(Boolean)}function D(t){let n=(t.split("?")[0].split(".").pop()||"").toLowerCase();return n==="ttf"?"font/ttf":n==="otf"?"font/otf":n==="woff"?"font/woff":n==="woff2"?"font/woff2":"application/octet-stream"}async function N(t,n){let r=[],o=new Set;for(let e of k(t)){let s=b("sha256").update(e).digest("hex");if(!o.has(s)){o.add(s);try{let i=await fetch(e);if(!i.ok){n?.onError?.(e,new Error(`${i.status} ${i.statusText}`));continue}let c=new Uint8Array(await i.arrayBuffer());r.push({url:e,urlhash:s,contentType:D(e),bytes:c}),n?.onStaged?.({url:e,byteLength:c.byteLength})}catch(i){n?.onError?.(e,i)}}}return r}export{I as a,L as b,M as c,N as d};
@@ -1 +0,0 @@
1
- /*! sootsim v0.1.293 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
@@ -1,2 +0,0 @@
1
- /*! sootsim v0.1.293 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- var o=!0,e="public beta",t=e,n="we send anonymous error and dependency data while you use it";export{o as a,e as b,t as c,n as d};
@@ -1,2 +0,0 @@
1
- /*! sootsim v0.1.293 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- function i(t,o,a,l){return{width:3,ringToggle:{side:"left",top:t[0],height:t[1]},volumeUp:{side:"left",top:o[0],height:o[1]},volumeDown:{side:"left",top:a[0],height:a[1]},lock:{side:"right",top:l[0],height:l[1]}}}var D={width:2.5,lock:{side:"right",top:188.7,height:68.1},ringToggle:{side:"left",top:113.2,height:36},volumeUp:{side:"left",top:188.2,height:68.1},volumeDown:{side:"left",top:269,height:68.1}},f={width:3,lock:{side:"right",top:671/2.625,height:163/2.625},ringToggle:{side:"left",top:-1e3,height:0},volumeUp:{side:"right",top:971/2.625,height:165/2.625},volumeDown:{side:"right",top:1136/2.625,height:166/2.625}},v={width:3,lock:{side:"right",top:248,height:72},ringToggle:{side:"left",top:-1e3,height:0},volumeUp:{side:"right",top:144,height:62},volumeDown:{side:"right",top:216,height:62}},s=24,c="17",d=37,T=1080/2.625,C=2400/2.625,u=132/2.625;function n(t){return{top:t,right:t,bottom:t,left:t}}function N(t){let o=(t.frameInsets.top+t.frameInsets.right+t.frameInsets.bottom+t.frameInsets.left)/4,a=Math.max(Math.abs(t.frameInsets.top-o),Math.abs(t.frameInsets.right-o),Math.abs(t.frameInsets.bottom-o),Math.abs(t.frameInsets.left-o));return{frameRadius:t.cornerRadius+o,frameRadiusApproximationError:a,screenRadius:t.cornerRadius}}function k(t){return{...N(t),frameHeight:t.frameInsets.top+t.height+t.frameInsets.bottom,frameWidth:t.frameInsets.left+t.width+t.frameInsets.right,screenBottomInset:t.frameInsets.bottom,screenLeft:t.frameInsets.left,screenRightInset:t.frameInsets.right,screenTop:t.frameInsets.top}}function r(t){return{...t,platform:"ios",navigationBarHeight:0,navigationBarMode:t.homeIndicatorHeight>0?"gesture":"none",displayCutout:{top:t.dynamicIsland?t.statusBarHeight:0,bottom:0,left:0,right:0},cameraCutout:null,osVersion:t.iosVersion,androidApiLevel:null,systemName:"iOS",manufacturer:"Apple",brand:"Apple",modelName:t.name}}var I={"canvas-workspace":r({name:"Canvas Workspace",width:1440,height:900,scale:1,statusBarHeight:0,homeIndicatorHeight:0,cornerRadius:0,continuousCornerRadius:0,frameInsets:n(16),dynamicIsland:null,safeAreaInsets:{top:0,bottom:0,left:0,right:0},iosVersion:"26.4",physicalPPI:110,hardwareButtons:i([185.8,41.7],[258.2,67.6],[344,67.6],[281.5,106.9]),experimental:!0}),"iphone-se":r({name:"iPhone SE",width:375,height:667,scale:2,statusBarHeight:20,homeIndicatorHeight:0,cornerRadius:0,continuousCornerRadius:0,frameInsets:n(28.7),dynamicIsland:null,safeAreaInsets:{top:20,bottom:0,left:0,right:0},iosVersion:"15.8",physicalPPI:326,hardwareButtons:D}),"iphone-14":r({name:"iPhone 14",width:390,height:844,scale:3,statusBarHeight:47,homeIndicatorHeight:34,cornerRadius:46.2,continuousCornerRadius:67.462,frameInsets:n(19.5),dynamicIsland:null,safeAreaInsets:{top:47,bottom:34,left:0,right:0},iosVersion:"17.6",physicalPPI:460,hardwareButtons:i([141.7,29.7],[205.9,69.6],[289.5,69.6],[228.9,114.5])}),"iphone-15":r({name:"iPhone 15",width:393,height:852,scale:3,statusBarHeight:59,homeIndicatorHeight:34,cornerRadius:53.9,continuousCornerRadius:73.402,frameInsets:n(18.2),dynamicIsland:{width:126,height:37.3,top:14.1},safeAreaInsets:{top:59,bottom:34,left:0,right:0},iosVersion:"17.6",physicalPPI:460,hardwareButtons:i([171.7,32],[235.8,65.3],[320.5,65.3],[280.6,105.2])}),"iphone-15-plus":r({name:"iPhone 15 Plus",width:430,height:932,scale:3,statusBarHeight:59,homeIndicatorHeight:34,cornerRadius:53.9,continuousCornerRadius:74.654,frameInsets:n(17.3),dynamicIsland:{width:126,height:37.3,top:11.4},safeAreaInsets:{top:59,bottom:34,left:0,right:0},iosVersion:"17.6",physicalPPI:460,hardwareButtons:i([172.1,33],[236.1,66.6],[321.2,66.6],[281,106.8])}),"iphone-15-pro":r({name:"iPhone 15 Pro",width:393,height:852,scale:3,statusBarHeight:59,homeIndicatorHeight:34,cornerRadius:53.9,continuousCornerRadius:73.402,frameInsets:n(15.3),dynamicIsland:{width:126,height:38,top:13.4},safeAreaInsets:{top:59,bottom:34,left:0,right:0},iosVersion:"18.2",physicalPPI:460,hardwareButtons:i([159.1,31.5],[220.1,61.9],[299,61.9],[260.8,98.9])}),"iphone-15-pro-max":r({name:"iPhone 15 Pro Max",width:430,height:932,scale:3,statusBarHeight:59,homeIndicatorHeight:34,cornerRadius:53.9,continuousCornerRadius:74.654,frameInsets:n(15.3),dynamicIsland:{width:126,height:38,top:13.3},safeAreaInsets:{top:59,bottom:34,left:0,right:0},iosVersion:"18.2",physicalPPI:460,hardwareButtons:i([173.3,32.2],[253.4,61.7],[343.3,61.7],[268.5,98.5])}),"iphone-16":r({name:"iPhone 16",width:393,height:852,scale:3,statusBarHeight:59,homeIndicatorHeight:34,cornerRadius:53.9,continuousCornerRadius:73.402,frameInsets:n(15.3),dynamicIsland:{width:126,height:37.3,top:11},safeAreaInsets:{top:59,bottom:34,left:0,right:0},iosVersion:"26.4",physicalPPI:460,hardwareButtons:i([159.1,31.5],[220.1,61.9],[299,61.9],[260.8,98.9])}),"iphone-16-plus":r({name:"iPhone 16 Plus",width:430,height:932,scale:3,statusBarHeight:59,homeIndicatorHeight:34,cornerRadius:53.9,continuousCornerRadius:74.654,frameInsets:n(15.3),dynamicIsland:{width:126,height:37.3,top:11.4},safeAreaInsets:{top:59,bottom:34,left:0,right:0},iosVersion:"26.4",physicalPPI:460,hardwareButtons:i([173.3,32.2],[253.4,61.7],[343.3,61.7],[268.5,98.5])}),"iphone-16-pro":r({name:"iPhone 16 Pro",width:402,height:874,scale:3,statusBarHeight:62,homeIndicatorHeight:34,cornerRadius:61,continuousCornerRadius:84.661,frameInsets:n(15.3),dynamicIsland:{width:126,height:38,top:13.5},safeAreaInsets:{top:62,bottom:34,left:0,right:0},iosVersion:"26.4",physicalPPI:460,hardwareButtons:i([159.1,31.5],[220.1,61.9],[299,61.9],[260.8,98.9])}),"iphone-16-pro-max":r({name:"iPhone 16 Pro Max",width:440,height:956,scale:3,statusBarHeight:62,homeIndicatorHeight:34,cornerRadius:61.3,continuousCornerRadius:85.163,frameInsets:n(15.4),dynamicIsland:{width:126,height:38,top:14},safeAreaInsets:{top:62,bottom:34,left:0,right:0},iosVersion:"26.4",physicalPPI:460,hardwareButtons:i([178.8,32.2],[266.8,61.8],[352.7,61.8],[292.2,98.3])}),"iphone-17":r({name:"iPhone 17",width:402,height:874,scale:3,statusBarHeight:59,homeIndicatorHeight:34,cornerRadius:61,continuousCornerRadius:84.661,frameInsets:n(15.3),dynamicIsland:{width:126,height:37.3,top:14},safeAreaInsets:{top:59,bottom:34,left:0,right:0},iosVersion:"26.4",physicalPPI:460,hardwareButtons:i([159.1,31.5],[220.1,61.9],[299,61.9],[260.8,98.9])}),"iphone-17-air":r({name:"iPhone Air",width:420,height:912,scale:3,statusBarHeight:59,homeIndicatorHeight:34,cornerRadius:64.6,continuousCornerRadius:88.313,frameInsets:n(15.475),dynamicIsland:{width:126,height:38,top:20},safeAreaInsets:{top:59,bottom:34,left:0,right:0},iosVersion:"26.4",physicalPPI:460,hardwareButtons:i([178.8,32.2],[266.8,61.8],[352.7,61.8],[292.2,98.3])}),"iphone-17-pro":r({name:"iPhone 17 Pro",width:402,height:874,scale:3,statusBarHeight:59,homeIndicatorHeight:34,cornerRadius:61,continuousCornerRadius:84.661,frameInsets:n(15.3),dynamicIsland:{width:126,height:38,top:14},safeAreaInsets:{top:59,bottom:34,left:0,right:0},iosVersion:"26.4",physicalPPI:460,hardwareButtons:i([159.1,31.5],[220.1,61.9],[299,61.9],[260.8,98.9])}),"iphone-17-pro-max":r({name:"iPhone 17 Pro Max",width:440,height:956,scale:3,statusBarHeight:62,homeIndicatorHeight:34,cornerRadius:61.3,continuousCornerRadius:85.163,frameInsets:n(15.4),dynamicIsland:{width:126,height:38,top:14},safeAreaInsets:{top:62,bottom:34,left:0,right:0},iosVersion:"26.4",physicalPPI:460,hardwareButtons:i([178.8,32.2],[266.8,61.8],[352.7,61.8],[292.2,98.3])}),"pixel-8":{platform:"android",name:"Pixel 8",width:T,height:C,scale:2.625,statusBarHeight:u,homeIndicatorHeight:0,navigationBarHeight:s,navigationBarMode:"gesture",displayCutout:{top:u,bottom:0,left:0,right:0},cornerRadius:39,continuousCornerRadius:39,frameInsets:{top:55/2.625,right:50/2.625,bottom:58/2.625,left:49/2.625},dynamicIsland:null,cameraCutout:{diameter:72.5/2.625},safeAreaInsets:{top:u,bottom:s,left:0,right:0},osVersion:c,iosVersion:"",androidApiLevel:d,systemName:"Android",manufacturer:"Google",brand:"google",modelName:"Pixel 8",physicalPPI:428,hardwareButtons:f},"pixel-8-three-button":{platform:"android",name:"Pixel 8 (3-button)",width:T,height:C,scale:2.625,statusBarHeight:u,homeIndicatorHeight:0,navigationBarHeight:48,navigationBarMode:"three-button",displayCutout:{top:u,bottom:0,left:0,right:0},cornerRadius:39,continuousCornerRadius:39,frameInsets:{top:55/2.625,right:50/2.625,bottom:58/2.625,left:49/2.625},dynamicIsland:null,cameraCutout:{diameter:72.5/2.625},safeAreaInsets:{top:u,bottom:48,left:0,right:0},osVersion:c,iosVersion:"",androidApiLevel:d,systemName:"Android",manufacturer:"Google",brand:"google",modelName:"Pixel 8",physicalPPI:428,hardwareButtons:f},"pixel-9-pro-xl":{platform:"android",name:"Pixel 9 Pro XL",width:448,height:997,scale:3,statusBarHeight:40,homeIndicatorHeight:0,navigationBarHeight:s,navigationBarMode:"gesture",displayCutout:{top:40,bottom:0,left:0,right:0},cornerRadius:41,continuousCornerRadius:41,frameInsets:n(12),dynamicIsland:null,cameraCutout:{diameter:24},safeAreaInsets:{top:40,bottom:s,left:0,right:0},osVersion:c,iosVersion:"",androidApiLevel:d,systemName:"Android",manufacturer:"Google",brand:"google",modelName:"Pixel 9 Pro XL",physicalPPI:486,hardwareButtons:f},"pixel-10":{platform:"android",name:"Pixel 10",width:360,height:808,scale:3,statusBarHeight:40,homeIndicatorHeight:0,navigationBarHeight:s,navigationBarMode:"gesture",displayCutout:{top:40,bottom:0,left:0,right:0},cornerRadius:40,continuousCornerRadius:40,frameInsets:n(18),dynamicIsland:null,cameraCutout:{diameter:26},safeAreaInsets:{top:40,bottom:s,left:0,right:0},osVersion:c,iosVersion:"",androidApiLevel:d,systemName:"Android",manufacturer:"Google",brand:"google",modelName:"Pixel 10",physicalPPI:422,hardwareButtons:f},"galaxy-s24":{platform:"android",name:"Galaxy S24",width:360,height:780,scale:3,statusBarHeight:36,homeIndicatorHeight:0,navigationBarHeight:s,navigationBarMode:"gesture",displayCutout:{top:36,bottom:0,left:0,right:0},cornerRadius:36,continuousCornerRadius:36,frameInsets:n(8),dynamicIsland:null,cameraCutout:{diameter:18},safeAreaInsets:{top:36,bottom:s,left:0,right:0},osVersion:c,iosVersion:"",androidApiLevel:d,systemName:"Android",manufacturer:"Samsung",brand:"samsung",modelName:"SM-S921B",physicalPPI:416,hardwareButtons:v},"galaxy-s24-ultra":{platform:"android",name:"Galaxy S24 Ultra",width:384,height:832,scale:3.75,statusBarHeight:36,homeIndicatorHeight:0,navigationBarHeight:s,navigationBarMode:"gesture",displayCutout:{top:36,bottom:0,left:0,right:0},cornerRadius:24,continuousCornerRadius:24,frameInsets:n(9),dynamicIsland:null,cameraCutout:{diameter:18},safeAreaInsets:{top:36,bottom:s,left:0,right:0},osVersion:c,iosVersion:"",androidApiLevel:d,systemName:"Android",manufacturer:"Samsung",brand:"samsung",modelName:"SM-S928B",physicalPPI:505,hardwareButtons:v}},R="iphone-17-pro";function _(t){return I[t]}function w(){return Object.keys(I)}function V(){return w().filter(t=>!I[t].experimental)}var b={"iphone-6-9":{name:"iphone-6-9",label:'iPhone 6.7"',width:1284,height:2778,store:"apple"},"iphone-6-1":{name:"iphone-6-1",label:'iPhone 6.5"',width:1242,height:2688,store:"apple"},"android-phone":{name:"android-phone",label:"Google Play phone",width:1080,height:1920,store:"google"},"android-tablet-7":{name:"android-tablet-7",label:'Google Play 7" tablet',width:1200,height:1920,store:"google"},"android-tablet-10":{name:"android-tablet-10",label:'Google Play 10" tablet',width:1600,height:2560,store:"google"}},y={dark:{type:"gradient",direction:180,glow:"#4caeff",stops:[{offset:0,color:"#111827"},{offset:40,color:"#101725"},{offset:100,color:"#06080d"}]},cyan:{type:"gradient",direction:180,glow:"#25c3ec",stops:[{offset:0,color:"#1b465c"},{offset:32,color:"#122336"},{offset:100,color:"#05070b"}]},gold:{type:"gradient",direction:180,glow:"#ffc25a",stops:[{offset:0,color:"#3b2f1a"},{offset:34,color:"#18140d"},{offset:100,color:"#050505"}]},red:{type:"gradient",direction:180,glow:"#ff6178",stops:[{offset:0,color:"#3e1018"},{offset:35,color:"#17080c"},{offset:100,color:"#050405"}]}},z={color:"#25c3ec",blur:120,spread:52,opacity:.34},U="iphone-17-pro";var O=[{name:"white",value:"#ffffff"},{name:"gray-light",value:"#d1d5db"},{name:"gray",value:"#6b7280"},{name:"gray-dark",value:"#3b4350"},{name:"slate",value:"#2a3644"},{name:"black",value:"#000000"},{name:"cyan",value:"#25c3ec"},{name:"blue",value:"#3f7cff"},{name:"teal",value:"#1fc7b4"},{name:"green",value:"#42c95d"},{name:"lime",value:"#92d21b"},{name:"gold",value:"#f5c518"},{name:"orange",value:"#ff912e"},{name:"coral",value:"#ff6f5b"},{name:"red",value:"#ff4f6f"},{name:"berry",value:"#d054ff"},{name:"magenta",value:"#ff4eb8"}],B=Object.fromEntries(O.map(t=>[t.name,t.value]));function j(t){return B[t]??B.gray}function G(t){return Object.prototype.hasOwnProperty.call(b,t)?b[t]:null}function M(t){return{type:t.type,color:t.color,direction:t.direction,glow:t.glow,stops:t.stops?.map(o=>({...o}))}}function K(t){return Object.prototype.hasOwnProperty.call(y,t)?M(y[t]):null}var H=[.823,.882,.941,1,1.118,1.235,1.353,1.786,2.143,2.643,3.143,3.571];function e(t,o){return Object.freeze({fontSize:t,lineHeight:o})}var Y=Object.freeze({xs:Object.freeze({largeTitle:e(31,44.408775),title1:e(25,37.128102),title2:e(19,27.816685),title3:e(17,23.807109),headline:e(14,20.161577),body:e(14,20.161577),callout:e(13,18.942243),subheadline:e(12,16.720313),footnote:e(12,16.986979),caption1:e(11,15.564453),caption2:e(11,16.126953)}),s:Object.freeze({largeTitle:e(32,45.797256),title1:e(26,38.556756),title2:e(20,29.22433),title3:e(18,25.160469),headline:e(15,21.536754),body:e(15,21.536754),callout:e(14,20.326079),subheadline:e(13,18.213672),footnote:e(12,16.986979),caption1:e(11,15.564453),caption2:e(11,16.126953)}),m:Object.freeze({largeTitle:e(33,47.185737),title1:e(27,39.985409),title2:e(21,30.631975),title3:e(19,26.513828),headline:e(16,22.911932),body:e(16,22.911932),callout:e(15,21.709914),subheadline:e(14,19.557031),footnote:e(12,16.986979),caption1:e(11,15.564453),caption2:e(11,16.126953)}),l:Object.freeze({largeTitle:e(34,48.574219),title1:e(28,41.414063),title2:e(22,32.253906),title3:e(20,27.867187),headline:e(17,24.287109),body:e(17,24.287109),callout:e(16,23.09375),subheadline:e(15,20.900391),footnote:e(13,18.513672),caption1:e(12,17.320313),caption2:e(11,16.126953)}),xl:Object.freeze({largeTitle:e(36,51.351181),title1:e(30,44.271369),title2:e(24,35.069196),title3:e(22,30.733906),headline:e(19,27.037464),body:e(19,27.037464),callout:e(18,25.861421),subheadline:e(17,23.587109),footnote:e(15,21.233724),caption1:e(14,20.269531),caption2:e(13,19.667518)}),xxl:Object.freeze({largeTitle:e(38,54.323266),title1:e(32,47.128676),title2:e(26,37.884487),title3:e(24,33.440625),headline:e(21,29.78782),body:e(21,29.78782),callout:e(20,28.629092),subheadline:e(19,26.273828),footnote:e(17,23.953776),caption1:e(16,23.03125),caption2:e(15,22.515775)}),xxxl:Object.freeze({largeTitle:e(40,57.100229),title1:e(34,50.221278),title2:e(28,40.699777),title3:e(26,36.147344),headline:e(23,32.719993),body:e(23,32.719993),callout:e(22,31.58724),subheadline:e(21,28.960547),footnote:e(19,26.673828),caption1:e(18,25.792969),caption2:e(17,25.364032)}),ax1:Object.freeze({largeTitle:e(44,62.654154),title1:e(38,56.171186),title2:e(34,49.359933),title3:e(31,43.074141),headline:e(28,39.595881),body:e(28,39.595881),callout:e(26,37.122582),subheadline:e(25,34.483984),footnote:e(23,32.280599),caption1:e(22,31.316406),caption2:e(20,29.636418)}),ax2:Object.freeze({largeTitle:e(48,68.403201),title1:e(43,63.314453),title2:e(39,56.612444),title3:e(37,51.194297),headline:e(33,46.653587),body:e(33,46.653587),callout:e(32,45.616071),subheadline:e(30,41.200781),footnote:e(27,37.720703),caption1:e(26,37.027344),caption2:e(24,35.332933)}),ax3:Object.freeze({largeTitle:e(52,73.957127),title1:e(48,70.693015),title2:e(44,63.65067),title3:e(43,59.474453),headline:e(40,56.461648),body:e(40,56.461648),callout:e(38,54.109561),subheadline:e(36,49.410937),footnote:e(33,46.047526),caption1:e(32,45.5),caption2:e(29,42.684345)}),ax4:Object.freeze({largeTitle:e(56,79.706174),title1:e(53,77.600988),title2:e(50,72.310826),title3:e(49,67.754609),headline:e(47,65.360618),body:e(47,66.269709),callout:e(44,62.412574),subheadline:e(42,57.621094),footnote:e(38,53.014323),caption1:e(37,52.404297),caption2:e(34,50.035757)}),ax5:Object.freeze({largeTitle:e(60,85.260099),title1:e(58,85.214844),title2:e(56,80.970982),title3:e(55,76.034766),headline:e(53,74.520774),body:e(53,74.520774),callout:e(51,72.2899),subheadline:e(49,67.174609),footnote:e(44,61.174479),caption1:e(43,60.876953),caption2:e(40,58.811298)})});function A(t){return H.some(o=>Object.is(o,t))}var P={deviceModel:{type:"enum",default:R,description:"device model to simulate",cliFlag:"device",cliFlagShort:"d",options:w(),group:"device"},orientation:{type:"enum",default:"portrait",description:"screen orientation",cliFlag:"orientation",options:["portrait","landscape"],group:"device"},colorScheme:{type:"enum",default:"auto",description:"color scheme (auto follows system preference)",cliFlag:"theme",cliFlagShort:"t",options:["light","dark","auto"],group:"appearance"},reduceMotion:{type:"boolean",default:!1,description:"reduce motion",group:"appearance"},boldText:{type:"boolean",default:!1,description:"bold text",group:"appearance"},fontSize:{type:"number",default:1,description:"font size multiplier (1.0 = default)",group:"appearance",validate:t=>t>=.5&&t<=4},largerAccessibilitySizes:{type:"boolean",default:!1,description:"show accessibility categories in the dynamic type size picker",group:"appearance"},networkCondition:{type:"enum",default:"wifi",description:"simulated network condition",cliFlag:"network",options:["wifi","lte","fast-3g","slow-3g","offline"],group:"network"},language:{type:"string",default:"en",description:"language code (ISO 639-1)",cliFlag:"language",group:"locale"},region:{type:"string",default:"US",description:"region code (ISO 3166-1)",cliFlag:"region",group:"locale"},renderDensity:{type:"number",default:0,description:"render density override in device pixels per point for high-resolution capture (0 = device native)",group:"simulator",validate:t=>t===0||t>=1&&t<=9},showTouches:{type:"boolean",default:!1,description:"show touch indicators",group:"simulator"},showFrame:{type:"boolean",default:!0,description:"show device frame",cliFlag:"frame",group:"simulator"},showTopBar:{type:"boolean",default:!0,description:"keep the top bar visible instead of revealing it at the top edge",group:"simulator"},showRail:{type:"boolean",default:!0,description:"keep the rail visible instead of revealing it on hover",group:"simulator"},screenshotMode:{type:"boolean",default:!1,description:"show screenshot composition mode in the browser shell",group:"simulator"},screenshotCanvasEditing:{type:"boolean",default:!1,description:"experimental figma-style slide editing: draggable copy block, drop-in image layers (owner review pending)",group:"simulator"},threeMode:{type:"boolean",default:!1,description:"show the experimental 3d device stage in the browser shell",group:"simulator"},threeRecordingEditor:{type:"boolean",default:!1,description:"dock the 3d recording editor in the 3d stage (toggled from its rail)",group:"simulator"},screenshotCanvas:{type:"enum",default:"iphone-6-9",description:"target app-store canvas preset for screenshot mode",options:Object.keys(b),group:"simulator"},screenshotBackground:{type:"enum",default:"dark",description:"background preset rendered inside the screenshot canvas",options:Object.keys(y),group:"simulator"},screenshotText:{type:"enum",default:"bold-top",description:"text layout preset for the screenshot canvas",options:["bold-top","editorial-left","minimal-bottom","none"],group:"simulator"},screenshotPose:{type:"enum",default:"straight",description:"device pose preset inside the screenshot canvas",options:["straight","tilted-left","tilted-right","cut-bottom","cut-top"],group:"simulator"},screenshotDynamicSize:{type:"boolean",default:!1,description:"let the screenshot canvas rect fit available space (off = pin to exact preset pixels)",group:"simulator"},showStatusBar:{type:"boolean",default:!0,description:"show status bar",group:"simulator"},showHomeIndicator:{type:"boolean",default:!0,description:"show home indicator",group:"simulator"},alwaysShowLiveWebViews:{type:"boolean",default:!1,description:"always render WebViews as live browser views",group:"simulator"},a11yMode:{type:"enum",default:"delayed",description:"accessibility tree sync mode (off, delayed=100ms, active=30ms)",options:["off","delayed","active"],group:"simulator"},a11yDepth:{type:"enum",default:"deep",description:"accessibility tree structure depth (shallow or deep)",options:["shallow","deep"],group:"simulator"},inspectMode:{type:"boolean",default:!1,description:"inspect mode",group:"simulator"},errorReporting:{type:"boolean",default:!1,description:"send anonymous crash reports",group:"privacy"},agentProvider:{type:"enum",default:"codex",description:"ai agent used by the sootsim agent prompt bar",options:["codex","claude"],group:"agent"},onboardingComplete:{type:"boolean",default:!1,description:"first-run onboarding completed",group:"beta"},betaConsentVersion:{type:"number",default:0,description:"last accepted beta telemetry policy version",group:"beta"},detailedTelemetry:{type:"boolean",default:!0,description:"send detailed usage telemetry (sessions, perf samples)",group:"beta"}};function E(){if(typeof window>"u")return{};let t={};try{let o=new URLSearchParams(window.location.search),a=o.get("device");a&&P.deviceModel.options?.includes(a)&&(t.deviceModel=a),o.get("ssMode")==="1"&&(t.screenshotMode=!0),o.get("filmStage")==="1"&&(t.threeMode=!0,a||(t.deviceModel="iphone-17-air"));let l=Number(o.get("renderDensity"));Number.isFinite(l)&&l>=1&&l<=9&&(t.renderDensity=l),o.get("ssEdit")==="1"&&(t.screenshotCanvasEditing=!0);let S=o.get("colorScheme")??o.get("theme");S&&P.colorScheme.options?.includes(S)&&(t.colorScheme=S);let p=o.get("reduceMotion");p==="1"||p==="true"?t.reduceMotion=!0:(p==="0"||p==="false")&&(t.reduceMotion=!1);let h=o.get("boldText");h==="1"||h==="true"?t.boldText=!0:(h==="0"||h==="false")&&(t.boldText=!1);let x=Number(o.get("fontSize"));Number.isFinite(x)&&A(x)&&(t.fontSize=x);let m=o.get("largerAccessibilitySizes");m==="1"||m==="true"?t.largerAccessibilitySizes=!0:(m==="0"||m==="false")&&(t.largerAccessibilitySizes=!1);let g=o.get("alwaysShowLiveWebViews");g==="1"||g==="true"?t.alwaysShowLiveWebViews=!0:(g==="0"||g==="false")&&(t.alwaysShowLiveWebViews=!1)}catch{}return t}function Q(){let t={};for(let[o,a]of Object.entries(P))t[o]=a.default;return Object.assign(t,E()),t}export{k as a,I as b,_ as c,V as d,z as e,U as f,j as g,G as h,M as i,K as j,P as k,E as l,Q as m};
@@ -1,2 +0,0 @@
1
- /*! sootsim v0.1.293 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{a}from"./chunk-NCCMRFXU.js";import"./chunk-RV67J726.js";export{a as getCliVersion};
@@ -1,2 +0,0 @@
1
- /*! sootsim v0.1.293 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{d as a,e as b,f as c,g as d,h as e,i as f,j as g,k as h,l as i,m as j,n as k,o as l,p as m,q as n,r as o,s as p,t as q,u as r,v as s,w as t,x as u}from"./chunk-4B4VFT73.js";import"./chunk-WP3TFHFL.js";import"./chunk-67CIS55C.js";import"./chunk-B7TX4WFB.js";import"./chunk-7B6RGFTM.js";import"./chunk-LA5DIO33.js";import"./chunk-RKXHQ2Q3.js";import"./chunk-ACSTEPSD.js";import"./chunk-MOU2WLO4.js";import"./chunk-JOPKZVOW.js";import"./chunk-HKMWUN7F.js";import"./chunk-6IFJLHDA.js";import"./chunk-J6P2UPXH.js";import"./chunk-TJS5IMOH.js";import"./chunk-RMLJXP7T.js";import"./chunk-YNG4C3ZS.js";import"./chunk-3UX6AY2B.js";import"./chunk-K5JEUI5G.js";import"./chunk-WOWLO4LL.js";import"./chunk-RV67J726.js";export{f as buildOpenUrl,e as buildShellUrl,s as closeSimsBulk,b as normalizeDeepLinkTarget,t as planBulkCloseTargets,k as playwrightHostPidForSim,h as printConnectedSims,c as resolveBundleTarget,d as resolveDefaultShellBaseUrl,a as resolveDriverConnectWaitOptions,r as runClaimCommand,u as runCloseCommand,q as runFocusCommand,n as runLinkCommand,o as runOpenCommand,p as runUseCommand,l as signalDriverLaunchConnected,g as summarizeSimUrl,m as terminatePlaywrightHostsForSims,i as waitForSimMatch,j as waitForSimMatchOrHostExit};
@@ -1,2 +0,0 @@
1
- /*! sootsim v0.1.293 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{a,b,c,d,e,f}from"./chunk-7H34H74K.js";import"./chunk-7H5G4HUK.js";import"./chunk-547W23BB.js";import"./chunk-6VVLDYPV.js";import"./chunk-UPKYK52K.js";import"./chunk-KC5SCOGS.js";import"./chunk-RMLJXP7T.js";import"./chunk-YNG4C3ZS.js";import"./chunk-3UX6AY2B.js";import"./chunk-K5JEUI5G.js";import"./chunk-AFRXWKTA.js";import"./chunk-WOWLO4LL.js";import"./chunk-NCCMRFXU.js";import"./chunk-USJTVC7T.js";import"./chunk-RV67J726.js";export{c as daemonInstall,b as getDaemonServiceStatus,a as runDaemon,e as teardownDaemonService,d as teardownLegacyMacDaemonArtifacts,f as teardownSootsimHome};
@@ -1,2 +0,0 @@
1
- /*! sootsim v0.1.293 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{a,b,c,d,e}from"./chunk-LOQLZFRK.js";import"./chunk-2VKTOZQ5.js";import"./chunk-TJS5IMOH.js";import"./chunk-WOWLO4LL.js";import"./chunk-RV67J726.js";export{e as applyAutomaticSootsimCleanup,d as applySootsimCleanup,b as formatSootsimBytes,a as isAutomaticSootsimCleanupComplete,c as planSootsimCleanup};
@@ -1,2 +0,0 @@
1
- /*! sootsim v0.1.293 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import"./chunk-QXDXUDJD.js";import{f as a,g as b,h as c,i as d,j as e,k as f,l as g,m as h,n as i}from"./chunk-7B6RGFTM.js";import"./chunk-LA5DIO33.js";import"./chunk-JOPKZVOW.js";import"./chunk-TJS5IMOH.js";import"./chunk-K5JEUI5G.js";import"./chunk-WOWLO4LL.js";import"./chunk-RV67J726.js";export{e as ALL_DRIVERS,i as buildDriverListRows,a as chromiumDriver,b as electronDriver,f as getAllDrivers,g as getDriver,c as playwrightDriver,h as resolveDriver,d as systemDriver};
@@ -1,2 +0,0 @@
1
- /*! sootsim v0.1.293 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{c,d,e,f,g,h}from"./chunk-E5WYXRGV.js";import"./chunk-YRFWATLA.js";import"./chunk-2M57EAWS.js";import{c as a,d as b}from"./chunk-2XYCSFGN.js";import"./chunk-U3564F2Y.js";import"./chunk-WPPMUUML.js";import"./chunk-DE4ZA3NL.js";import"./chunk-4B4VFT73.js";import"./chunk-WP3TFHFL.js";import"./chunk-67CIS55C.js";import"./chunk-B7TX4WFB.js";import"./chunk-7B6RGFTM.js";import"./chunk-LA5DIO33.js";import"./chunk-RKXHQ2Q3.js";import"./chunk-ACSTEPSD.js";import"./chunk-MOU2WLO4.js";import"./chunk-JOPKZVOW.js";import"./chunk-HKMWUN7F.js";import"./chunk-6IFJLHDA.js";import"./chunk-J6P2UPXH.js";import"./chunk-WI36YJ23.js";import"./chunk-7H5G4HUK.js";import"./chunk-547W23BB.js";import"./chunk-TJS5IMOH.js";import"./chunk-KC5SCOGS.js";import"./chunk-RMLJXP7T.js";import"./chunk-YNG4C3ZS.js";import"./chunk-3UX6AY2B.js";import"./chunk-K5JEUI5G.js";import"./chunk-AFRXWKTA.js";import"./chunk-WOWLO4LL.js";import"./chunk-RV67J726.js";export{e as discoverSootsimUrl,c as getLastFlowPreviewUploadResult,d as getLastFlowTraceSteps,g as hoistLeadingSimFlag,a as parseFlowFile,f as runFlowPlayback,h as runMaestroAuthoring,b as validateFlowFile};
@@ -1,2 +0,0 @@
1
- /*! sootsim v0.1.293 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{a,b,c}from"./chunk-6VVLDYPV.js";import"./chunk-UPKYK52K.js";import"./chunk-KC5SCOGS.js";import"./chunk-RMLJXP7T.js";import"./chunk-YNG4C3ZS.js";import"./chunk-3UX6AY2B.js";import"./chunk-K5JEUI5G.js";import"./chunk-AFRXWKTA.js";import"./chunk-WOWLO4LL.js";import"./chunk-NCCMRFXU.js";import"./chunk-USJTVC7T.js";import"./chunk-RV67J726.js";export{c as printCommandHelp,b as printGroupHelp,a as printHelp};