sootsim 0.1.39 → 0.1.41

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 (150) hide show
  1. package/README.md +15 -15
  2. package/dist-cli/bin.js +16 -15
  3. package/dist-cli/chunks/{agent-HZP3LUGJ.js → agent-7BJ2ZP22.js} +2 -2
  4. package/dist-cli/chunks/{agent-wrapper-CS6TV5UR.js → agent-wrapper-OXBYRJVT.js} +2 -2
  5. package/dist-cli/chunks/{assert-WVTX4CNR.js → assert-NZTYFTTT.js} +2 -2
  6. package/dist-cli/chunks/auto-bootstrap-4KQT4TCR.js +2 -0
  7. package/dist-cli/chunks/beta-3S56PNSS.js +2 -0
  8. package/dist-cli/chunks/{chunk-NYZGZDHI.js → chunk-2T6UOHPO.js} +1 -1
  9. package/dist-cli/chunks/chunk-334L67M2.js +2 -0
  10. package/dist-cli/chunks/{chunk-7J4UIBA5.js → chunk-33R6QMNO.js} +2 -2
  11. package/dist-cli/chunks/{chunk-XYTDYBXJ.js → chunk-4UA6P3T2.js} +1 -1
  12. package/dist-cli/chunks/{chunk-GUHXSXNO.js → chunk-5JOYGXCS.js} +2 -2
  13. package/dist-cli/chunks/chunk-6PLNIOJP.js +17 -0
  14. package/dist-cli/chunks/{chunk-YGUQSPU6.js → chunk-7YZJHZ7X.js} +1 -1
  15. package/dist-cli/chunks/{chunk-4YUHJ5FX.js → chunk-ANDSHXLU.js} +2 -2
  16. package/dist-cli/chunks/chunk-AOYBIMKL.js +4 -0
  17. package/dist-cli/chunks/chunk-ASSV2FFC.js +1 -0
  18. package/dist-cli/chunks/chunk-BR6QRN7U.js +11 -0
  19. package/dist-cli/chunks/{chunk-C6GUAXKO.js → chunk-C4AMFYK3.js} +2 -2
  20. package/dist-cli/chunks/{chunk-B2SCT4DL.js → chunk-ECIRRKKE.js} +2 -2
  21. package/dist-cli/chunks/{chunk-FEMOLCB5.js → chunk-FZB4W23Y.js} +2 -2
  22. package/dist-cli/chunks/chunk-G2QUPNHI.js +2 -0
  23. package/dist-cli/chunks/chunk-GB3G5LVB.js +108 -0
  24. package/dist-cli/chunks/{chunk-NJ4WXWKO.js → chunk-GI7FXE7J.js} +2 -2
  25. package/dist-cli/chunks/{chunk-JXKW62SL.js → chunk-GOFKXREQ.js} +2 -2
  26. package/dist-cli/chunks/chunk-HAVQS3PI.js +2 -0
  27. package/dist-cli/chunks/{chunk-223TXYOC.js → chunk-HZVPHAJX.js} +20 -20
  28. package/dist-cli/chunks/{runtime-YJPWA3XA.js → chunk-I5Y4IECP.js} +3 -3
  29. package/dist-cli/chunks/{chunk-YHYSOUIJ.js → chunk-IF33CQL4.js} +2 -2
  30. package/dist-cli/chunks/chunk-IP2MARRU.js +27 -0
  31. package/dist-cli/chunks/{chunk-ECDPQ6S7.js → chunk-J3JJRXIP.js} +1 -1
  32. package/dist-cli/chunks/{chunk-2ESCYOZW.js → chunk-LMNB7NYI.js} +2 -2
  33. package/dist-cli/chunks/{chunk-YUKH7HF6.js → chunk-LX6KS6TL.js} +1 -1
  34. package/dist-cli/chunks/{chunk-RJQ73DLG.js → chunk-MBGNDWGV.js} +4 -4
  35. package/dist-cli/chunks/{chunk-WD54RD4K.js → chunk-N7DDNZTO.js} +1 -1
  36. package/dist-cli/chunks/chunk-NZ5O2OEL.js +56 -0
  37. package/dist-cli/chunks/{chunk-ZBB7YS6C.js → chunk-OJFHAMXD.js} +2 -2
  38. package/dist-cli/chunks/{chunk-VLUFTHBB.js → chunk-OPDPXAYA.js} +2 -2
  39. package/dist-cli/chunks/chunk-OXTFYLZJ.js +4 -0
  40. package/dist-cli/chunks/{chunk-MGVTLDI3.js → chunk-Q6DGMQ2V.js} +2 -2
  41. package/dist-cli/chunks/{chunk-UWRBEBML.js → chunk-S3SQITOO.js} +2 -2
  42. package/dist-cli/chunks/{chunk-P6F636LU.js → chunk-SHHUVGL2.js} +1 -1
  43. package/dist-cli/chunks/{chunk-RLGCJT2D.js → chunk-SWHWVYZS.js} +1 -1
  44. package/dist-cli/chunks/{chunk-CBPTHIJV.js → chunk-TBIGAH3T.js} +1 -1
  45. package/dist-cli/chunks/chunk-UNJTJDZZ.js +62 -0
  46. package/dist-cli/chunks/chunk-WN6YFWS5.js +117 -0
  47. package/dist-cli/chunks/{chunk-E5RYQUFB.js → chunk-WZDE344I.js} +3 -3
  48. package/dist-cli/chunks/{chunk-NF65BNJR.js → chunk-Y2YNXUBT.js} +2 -2
  49. package/dist-cli/chunks/chunk-YFX2XIR4.js +1 -0
  50. package/dist-cli/chunks/chunk-YKFRPIVC.js +1 -0
  51. package/dist-cli/chunks/chunk-ZPURE62G.js +1 -0
  52. package/dist-cli/chunks/{compat-UMJ2IXUW.js → compat-BA6HDW3Q.js} +5 -5
  53. package/dist-cli/chunks/{config-YMJK426V.js → config-QQ63IS5P.js} +2 -2
  54. package/dist-cli/chunks/control-GNJNC524.js +2 -0
  55. package/dist-cli/chunks/cpu-profile-3DDV2SYN.js +2 -0
  56. package/dist-cli/chunks/{daemon-LIVCJZR3.js → daemon-RYSVONEV.js} +2 -2
  57. package/dist-cli/chunks/{debug-EV73WC7H.js → debug-YXE4XZLP.js} +20 -20
  58. package/dist-cli/chunks/demo-app-registry-3VFEW4NV.js +2 -0
  59. package/dist-cli/chunks/{detox-NBT5BVX3.js → detox-2UI3EAXA.js} +2 -2
  60. package/dist-cli/chunks/{device-MMROWQZ3.js → device-UGDJBZKD.js} +2 -2
  61. package/dist-cli/chunks/diagnose-IRDRYKYZ.js +41 -0
  62. package/dist-cli/chunks/drivers-EAONIWG3.js +2 -0
  63. package/dist-cli/chunks/{electron-F5DT7CFY.js → electron-ZCYWIZAE.js} +3 -3
  64. package/dist-cli/chunks/flow-ECSMFTKS.js +2 -0
  65. package/dist-cli/chunks/{hints-RODH4XE4.js → hints-OWOBCWJH.js} +2 -2
  66. package/dist-cli/chunks/{home-paths-PCUMN33Z.js → home-paths-5QMCFTBP.js} +2 -2
  67. package/dist-cli/chunks/inspect-K4VXPM5J.js +995 -0
  68. package/dist-cli/chunks/install-YFE7C2NU.js +2 -0
  69. package/dist-cli/chunks/{install-desktop-ASRNFHZU.js → install-desktop-U3723T63.js} +3 -3
  70. package/dist-cli/chunks/{keys-DOOCGNTD.js → keys-IFVXJ7C2.js} +2 -2
  71. package/dist-cli/chunks/{launch-DTVAQMZG.js → launch-NDGFTRZ5.js} +3 -3
  72. package/dist-cli/chunks/{login-JA6VEDEP.js → login-KEU6RAV3.js} +4 -4
  73. package/dist-cli/chunks/{logout-H4WFWTPC.js → logout-KNFLP5OQ.js} +2 -2
  74. package/dist-cli/chunks/{maestro-4TR7U6TS.js → maestro-GBUBLS6L.js} +2 -2
  75. package/dist-cli/chunks/{preview-GP7XXDW6.js → preview-7OKMPPMN.js} +2 -2
  76. package/dist-cli/chunks/{profile-3FESGAZD.js → profile-CHKDPGJF.js} +2 -2
  77. package/dist-cli/chunks/{react-SJD2DQQV.js → react-GYI5VITJ.js} +2 -2
  78. package/dist-cli/chunks/record-DQR2TEIF.js +45 -0
  79. package/dist-cli/chunks/runtime-XXNKSGFE.js +2 -0
  80. package/dist-cli/chunks/runtime-delivery-JCAY2QVQ.js +2 -0
  81. package/dist-cli/chunks/{screenshot-45SAK7EW.js → screenshot-3T6MNPH7.js} +2 -2
  82. package/dist-cli/chunks/{screenshot-mode-TCY7FBGR.js → screenshot-mode-BUGXY7SQ.js} +2 -2
  83. package/dist-cli/chunks/{screenshots-KZ364S2O.js → screenshots-EMTXGI2Q.js} +2 -2
  84. package/dist-cli/chunks/server-46H2M4TF.js +35 -0
  85. package/dist-cli/chunks/setup-repo-P4LCPAF6.js +2 -0
  86. package/dist-cli/chunks/{skills-SMXCCJCM.js → skills-2RP2CFPD.js} +2 -2
  87. package/dist-cli/chunks/start-QFREXALP.js +23 -0
  88. package/dist-cli/chunks/store-GH77HGEB.js +2 -0
  89. package/dist-cli/chunks/telemetry-WC5J4TE5.js +2 -0
  90. package/dist-cli/chunks/{test-ZXTSA5GV.js → test-LI4PGGTE.js} +3 -3
  91. package/dist-cli/chunks/{three-mode-4Q65J2ZA.js → three-mode-PKINB46T.js} +2 -2
  92. package/dist-cli/chunks/{timeline-ISEDS6XR.js → timeline-5AREJDL5.js} +2 -2
  93. package/dist-cli/chunks/upgrade-W2AGIOSC.js +4 -0
  94. package/dist-cli/chunks/upload-RLS6KTG6.js +2 -0
  95. package/dist-cli/chunks/web-JM6WDSZQ.js +2 -0
  96. package/dist-cli/chunks/what-happened-SVCASJKT.js +15 -0
  97. package/dist-cli/chunks/whoami-5NJ6IPLT.js +2 -0
  98. package/dist-lib/agent-daemon-client.cjs +1 -1
  99. package/dist-lib/agent-events.cjs +1 -1
  100. package/dist-lib/agent-sessions.cjs +1 -1
  101. package/dist-lib/attached-projects.cjs +1 -1
  102. package/dist-lib/auth/shared-session.cjs +1 -1
  103. package/dist-lib/backend-origin.cjs +1 -1
  104. package/dist-lib/bridge-constants.cjs +1 -1
  105. package/dist-lib/cli-constants.cjs +1 -1
  106. package/dist-lib/config.cjs +1 -1
  107. package/dist-lib/dev-bundle-resolution.cjs +1 -1
  108. package/dist-lib/home-paths.cjs +1 -1
  109. package/dist-lib/host/bridge-host.cjs +127 -88
  110. package/dist-lib/host/fetch-proxy-handler.cjs +1 -1
  111. package/dist-lib/index.cjs +1 -1
  112. package/dist-lib/metro.cjs +1 -1
  113. package/dist-lib/profiles.cjs +1 -1
  114. package/dist-lib/render-mode.cjs +1 -1
  115. package/dist-lib/vite-base.cjs +152 -94
  116. package/dist-lib/vite.cjs +1 -1
  117. package/package.json +1 -1
  118. package/dist-cli/chunks/auto-bootstrap-3TUCG2BC.js +0 -2
  119. package/dist-cli/chunks/beta-3SCMB3IN.js +0 -2
  120. package/dist-cli/chunks/chunk-4LHQRDSN.js +0 -2
  121. package/dist-cli/chunks/chunk-4UI5OHEO.js +0 -1
  122. package/dist-cli/chunks/chunk-5L5SZXXG.js +0 -2
  123. package/dist-cli/chunks/chunk-5RSSCKBF.js +0 -1
  124. package/dist-cli/chunks/chunk-6TSUQHSC.js +0 -4
  125. package/dist-cli/chunks/chunk-B3OEHV2C.js +0 -1
  126. package/dist-cli/chunks/chunk-DSDLGFWH.js +0 -61
  127. package/dist-cli/chunks/chunk-HWRR23AJ.js +0 -17
  128. package/dist-cli/chunks/chunk-MIE6NMPJ.js +0 -117
  129. package/dist-cli/chunks/chunk-NFJDHJHK.js +0 -1
  130. package/dist-cli/chunks/chunk-OB3TB4AN.js +0 -4
  131. package/dist-cli/chunks/chunk-SLQ2GTYF.js +0 -27
  132. package/dist-cli/chunks/chunk-W4QHQT64.js +0 -2
  133. package/dist-cli/chunks/chunk-WHQWINDB.js +0 -11
  134. package/dist-cli/chunks/control-DJR3DUAB.js +0 -2
  135. package/dist-cli/chunks/cpu-profile-67MCPAA2.js +0 -22
  136. package/dist-cli/chunks/demo-app-registry-NZBZVJ52.js +0 -2
  137. package/dist-cli/chunks/diagnose-WXOKGBAJ.js +0 -41
  138. package/dist-cli/chunks/drivers-NSPV5S6T.js +0 -2
  139. package/dist-cli/chunks/flow-T6DZQWHE.js +0 -2
  140. package/dist-cli/chunks/inspect-BIMFJFDR.js +0 -1101
  141. package/dist-cli/chunks/install-5YPVP466.js +0 -2
  142. package/dist-cli/chunks/record-PQUAMW5K.js +0 -37
  143. package/dist-cli/chunks/server-S5CRYXXZ.js +0 -35
  144. package/dist-cli/chunks/setup-repo-TH3GXOP7.js +0 -2
  145. package/dist-cli/chunks/start-KLSAQM3C.js +0 -23
  146. package/dist-cli/chunks/store-E2N5NOUS.js +0 -2
  147. package/dist-cli/chunks/telemetry-RJXVYJSN.js +0 -2
  148. package/dist-cli/chunks/upload-KB7INQRC.js +0 -2
  149. package/dist-cli/chunks/what-happened-STY3AOCQ.js +0 -15
  150. package/dist-cli/chunks/whoami-VKRQOG2U.js +0 -2
package/README.md CHANGED
@@ -1,14 +1,14 @@
1
- # sootsim
1
+ # SootSim
2
2
 
3
- CLI + framework plugins for soot's browser-native simulator.
3
+ CLI + framework plugins for SootBean's browser-native simulator.
4
4
 
5
- this package is the public, publishable face of sootsim. it contains:
5
+ this package is the public, publishable face of SootSim. it contains:
6
6
 
7
- - `sootsim` CLI (bridge client — drives a running sootsim instance over
7
+ - `sootsim` CLI (bridge client — drives a running SootSim instance over
8
8
  WebSocket for describing UI, tapping elements, recording flows, etc.)
9
- - `sootsim/vite` — vite plugin for wrapping an app bundler with sootsim
9
+ - `sootsim/vite` — vite plugin for wrapping an app bundler with SootSim
10
10
  - `sootsim/metro` — metro plugin for wrapping a react native bundler
11
- - `sootsim/skills` — registry for soot-flavored automation skills
11
+ - `sootsim/skills` — registry for SootBean-flavored automation skills
12
12
 
13
13
  the rendering engine itself (canvas renderer, yoga layout, iOS/Android shell
14
14
  chrome, wasm, electron shell) lives in the private `sootsim-engine` workspace
@@ -18,12 +18,12 @@ Platform status: iOS is the parity baseline. Android is bootstrapped and
18
18
  usable for focused conformance slices, with Android bundle/runtime identity,
19
19
  device profiles, initial shell chrome, gesture and three-button nav proof,
20
20
  Android system UI/window metrics with cutout-safe insets, and Android
21
- sootsim-only matrix runs.
21
+ SootSim-only matrix runs.
22
22
  Android `react-native-screens`, `react-native-safe-area-context`,
23
23
  RefreshControl, keyboard/IME resize, EdgeEffect, scroll deceleration/fading
24
24
  edges/scrollbars, and basic system-bar API support are improving but still need
25
25
  the Android launch gates before this can be called full parity.
26
- It is not full Android parity until the Android launch gates in the soot repo
26
+ It is not full Android parity until the Android launch gates in the SootBean repo
27
27
  plan pass.
28
28
 
29
29
  ## getting started
@@ -43,7 +43,7 @@ using the same device list as `Window >`.
43
43
 
44
44
  ## CLI
45
45
 
46
- the CLI is the primary debugging surface for sootsim. use it first for runtime
46
+ the CLI is the primary debugging surface for SootSim. use it first for runtime
47
47
  inspection, interaction, animation debugging, shell tracing, screenshots, and
48
48
  flow capture instead of treating it as a test-only tool.
49
49
 
@@ -66,12 +66,12 @@ bun sootsim test --detox # shared Detox-style parity suite against sootsim
66
66
  ```
67
67
 
68
68
  see the full command reference via `bun sootsim --help` or at
69
- `src/features/site/docs/sootsim/cli/` in the soot repo.
69
+ `src/features/site/docs/sootsim/cli/` in the SootBean repo.
70
70
 
71
71
  ## coming from detox
72
72
 
73
- sootsim ships a drop-in detox driver. your existing detox test files
74
- (`import { by, element, expect, device } from 'detox'`) run against sootsim
73
+ SootSim ships a drop-in detox driver. your existing detox test files
74
+ (`import { by, element, expect, device } from 'detox'`) run against SootSim
75
75
  with no code changes — just add one line to your jest config:
76
76
 
77
77
  ```js
@@ -90,7 +90,7 @@ see `docs/migrating-from-detox.md` for details.
90
90
 
91
91
  ## coming from maestro
92
92
 
93
- sootsim's flow runner natively speaks maestro's YAML format. point it at your
93
+ SootSim's flow runner natively speaks maestro's YAML format. point it at your
94
94
  existing `.maestro/` directory:
95
95
 
96
96
  ```sh
@@ -118,7 +118,7 @@ bun sootsim screenshot --with-frame --output /tmp/sootsim-framed.png
118
118
  bun sootsim record --duration 5 --output /tmp/sootsim-anim.mp4
119
119
  ```
120
120
 
121
- `sootsim screenshot --with-frame` composes the real sootsim shell device chrome
121
+ `sootsim screenshot --with-frame` composes the real SootSim shell device chrome
122
122
  around the raw screen bitmap. it reuses the shell bezel/button geometry and
123
123
  still excludes the electron top bar, rail gutter, and other window chrome.
124
124
 
@@ -214,7 +214,7 @@ module.exports = withSootsim({ /* your metro config */ })
214
214
 
215
215
  ## development
216
216
 
217
- this package is part of the soot monorepo. to build the CLI bundle:
217
+ this package is part of the SootBean monorepo. to build the CLI bundle:
218
218
 
219
219
  ```sh
220
220
  bun run build:cli
package/dist-cli/bin.js CHANGED
@@ -1,30 +1,31 @@
1
1
  #!/usr/bin/env node
2
- /*! sootsim v0.1.39 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
3
- import{a as b,b as A,c as k,d as _,e as u,f as E}from"./chunks/chunk-MIE6NMPJ.js";import{a as l}from"./chunks/chunk-GUHXSXNO.js";import{a as p}from"./chunks/chunk-4LHQRDSN.js";import{a as S,d as v}from"./chunks/chunk-CBPTHIJV.js";import"./chunks/chunk-7J4UIBA5.js";import"./chunks/chunk-B3OEHV2C.js";import"./chunks/chunk-WD54RD4K.js";function g(){let e=A({bridgePort:7668,defaultShellUrl:p},l()),t=`
4
- ${v}
5
- `;console.log(`${t}${e}
2
+ /*! sootsim v0.1.41 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
3
+ import{a as E}from"./chunks/chunk-HAVQS3PI.js";import{a as l}from"./chunks/chunk-5JOYGXCS.js";import{a as A,b as k,c as S,d as C,e as u,f as T}from"./chunks/chunk-WN6YFWS5.js";import{a as p}from"./chunks/chunk-334L67M2.js";import{a as v,d as _}from"./chunks/chunk-TBIGAH3T.js";import"./chunks/chunk-33R6QMNO.js";import"./chunks/chunk-ASSV2FFC.js";import{z as L}from"./chunks/chunk-J3JJRXIP.js";import"./chunks/chunk-N7DDNZTO.js";function R(){let t=L();return`sootsim CLI v${E()} \xB7 runtime ${t?`v${t}`:"not installed"}`}function g(){let t=k({bridgePort:7668,defaultShellUrl:p},l()),e=`
4
+ ${_}
5
+ `;console.log(`${R()}
6
+ ${e}${t}
6
7
 
7
8
  auth:
8
9
  sootsim login sign in for desktop uploads
9
10
  sootsim logout clear the shared desktop session
10
11
  sootsim whoami show the current shared desktop account
11
- `)}function T(e){let t=b(e,{bridgePort:7668,defaultShellUrl:p},l());return t?(console.log(`${t}
12
- `),!0):!1}function h(e){if(e==="3d-mode"){h("three-mode");return}if(e==="login"){console.log(`sootsim login
12
+ `)}function O(t){let e=A(t,{bridgePort:7668,defaultShellUrl:p},l());return e?(console.log(`${e}
13
+ `),!0):!1}function h(t){if(t==="3d-mode"){h("three-mode");return}if(t==="login"){console.log(`sootsim login
13
14
 
14
15
  sign in for desktop uploads using the shared desktop session.
15
16
  opens the browser and stores the resulting bearer token for both the CLI and electron.
16
- `);return}if(e==="logout"){console.log(`sootsim logout
17
+ `);return}if(t==="logout"){console.log(`sootsim logout
17
18
 
18
19
  clear the shared desktop session used by the CLI and electron.
19
- `);return}if(e==="whoami"){console.log(`sootsim whoami
20
+ `);return}if(t==="whoami"){console.log(`sootsim whoami
20
21
 
21
22
  show the current shared desktop account used by the CLI and electron.
22
- `);return}let t=k(e,{bridgePort:7668,defaultShellUrl:p});if(!t){console.log(`unknown command: ${e}`);return}console.log(`${t}
23
- `)}function C(e){let t=e instanceof Error?e.message:String(e);(/^command timed out after \d+s$/.test(t)||t.startsWith("sim disconnected:")||t.startsWith("bridge never reconnected")||t.startsWith("no sim connected with id ")||t.startsWith("sootsim bridge daemon is not running")||t.startsWith("refusing to install the persistent sootsim daemon"))&&!process.env.SOOTSIM_VERBOSE&&(process.stderr.write(` ${t}
24
- `),process.exit(1)),e instanceof Error&&e.stack?process.stderr.write(`${e.stack}
25
- `):process.stderr.write(`${t}
26
- `),process.exit(1)}process.on("unhandledRejection",C);process.on("uncaughtException",C);var y=typeof __SOOTSIM_STANDALONE__<"u"&&__SOOTSIM_STANDALONE__,$=new Set(["preview","electron","install-desktop"]);function D(e){!y||!$.has(e)||(process.stderr.write(` sootsim ${e} isn't available in the standalone binary \u2014
23
+ `);return}let e=S(t,{bridgePort:7668,defaultShellUrl:p});if(!e){console.log(`unknown command: ${t}`);return}console.log(`${e}
24
+ `)}function x(t){let e=t instanceof Error?t.message:String(t);(/^command timed out after \d+s$/.test(e)||e.startsWith("sim disconnected:")||e.startsWith("bridge never reconnected")||e.startsWith("no sim connected with id ")||e.startsWith("sootsim bridge daemon is not running")||e.startsWith("refusing to install the persistent sootsim daemon"))&&!process.env.SOOTSIM_VERBOSE&&(process.stderr.write(` ${e}
25
+ `),process.exit(1)),t instanceof Error&&t.stack?process.stderr.write(`${t.stack}
26
+ `):process.stderr.write(`${e}
27
+ `),process.exit(1)}process.on("unhandledRejection",x);process.on("uncaughtException",x);var M=typeof __SOOTSIM_STANDALONE__<"u"&&__SOOTSIM_STANDALONE__,P=new Set(["preview","electron","install-desktop"]);function F(t){!M||!P.has(t)||(process.stderr.write(` sootsim ${t} isn't available in the standalone binary \u2014
27
28
  it needs vite / electron / playwright from a project's node_modules.
28
29
  install the npm package and run via bun or node instead:
29
- npm i -g sootsim && sootsim ${e}
30
- `),process.exit(1))}var o=E(process.argv);{let{trackCliEvent:e}=await import("./chunks/telemetry-RJXVYJSN.js");e({event:"cli_command_invoked",properties:{command:o.command||(o.version?"version":o.help?"help":"none"),arg_count:o.commandArgs.length,platform:process.platform,arch:process.arch,node_version:process.versions.node}})}async function c(e){let{flushCliTelemetry:t}=await import("./chunks/telemetry-RJXVYJSN.js");await t(),process.exit(e)}if(o.version){let{readFileSync:e}=await import("fs"),{fileURLToPath:t}=await import("url"),i=t(import.meta.resolve("sootsim/package.json")),m=JSON.parse(e(i,"utf8")),{IS_BETA:O,BETA_LABEL:x}=await import("./chunks/beta-3SCMB3IN.js"),I=O?` \xB7 ${x}`:"";console.log(`sootsim v${m.version}${I}`),await c(0)}o.help&&!o.command&&(g(),await c(0));var a=o.globalFlags.port,s=o.verbose,d=o.globalFlags.device,f=o.globalFlags.theme,N=o.globalFlags.driver,G=o.globalFlags.headless===!0,L=o.globalFlags.sim,r=L?["--sim",L,...o.commandArgs]:o.commandArgs;if(d||f){let{settingsStore:e}=await import("./chunks/store-E2N5NOUS.js"),t={};d&&(t.deviceModel=d),f&&(t.colorScheme=f),e.apply(t)}if(!o.command&&o.commandArgs.length===0){let{runStart:e}=await import("./chunks/start-KLSAQM3C.js");await e([],{port:a}),await c(0)}var n=o.command??"";n||(g(),await c(o.commandArgs.length>0?1:0));if(n in u){let e=u[n],t=o.commandArgs.length>0?` ${o.commandArgs.join(" ")}`:"";console.error(` \`sootsim ${n}\` was removed. use \`${e}\` instead.`),t&&console.error(` \u2192 ${e}${t}`),console.error(" run `sootsim --help` to see the new verb groups."),await c(1)}if(o.help||o.commandArgs.includes("--help")||o.commandArgs.includes("-h")){let e=n==="do"||n==="get"||n==="debug"||n==="shell"||n==="wait",t=o.commandArgs.find(i=>!i.startsWith("-"));n==="shell"||(e&&!t?T(n)&&await c(0):(h(e&&t?t:n),await c(0)))}D(n);if(_.has(n)){let{ensureSootsimReady:e,resolveBootstrapPort:t}=await import("./chunks/auto-bootstrap-3TUCG2BC.js"),i=t(r,a);await e(i);let{runInspect:m}=await import("./chunks/inspect-BIMFJFDR.js");await m([n,...r],{port:i,verbose:s})}else switch(n){case"assert":{let{runAssert:e}=await import("./chunks/assert-WVTX4CNR.js");await e(o.commandArgs);break}case"flow":{let{runFlow:e}=await import("./chunks/flow-T6DZQWHE.js"),t=await e(r);process.exit(typeof t=="number"?t:0)}case"test":{let{runTest:e}=await import("./chunks/test-ZXTSA5GV.js");await e(o.commandArgs,{port:a,verbose:s});break}case"detox":{let{runDetox:e}=await import("./chunks/detox-NBT5BVX3.js");await e(o.commandArgs,{port:a,verbose:s});break}case"maestro":{let{runMaestro:e}=await import("./chunks/maestro-4TR7U6TS.js"),t=await e(o.commandArgs,{port:a,verbose:s});process.exit(typeof t=="number"?t:0)}case"preview":{let{runPreview:e}=await import("./chunks/preview-GP7XXDW6.js");await e(o.commandArgs,{port:a,verbose:s});break}case"record":{let{runRecord:e}=await import("./chunks/record-PQUAMW5K.js");await e(r,{port:a,verbose:s});break}case"profile":{let{runProfile:e}=await import("./chunks/profile-3FESGAZD.js"),t=await e(o.commandArgs,{port:a,verbose:s});process.exit(typeof t=="number"?t:0)}case"cpu-profile":{let{runCpuProfile:e}=await import("./chunks/cpu-profile-67MCPAA2.js"),t=await e(r,{port:a,verbose:s});process.exit(typeof t=="number"?t:0)}case"react":{let{runReact:e}=await import("./chunks/react-SJD2DQQV.js"),t=await e(r,{port:a,verbose:s});process.exit(typeof t=="number"?t:0)}case"screenshot":{let{runScreenshot:e}=await import("./chunks/screenshot-45SAK7EW.js");await e(r,{port:a,verbose:s});break}case"screenshots":{let{runScreenshots:e}=await import("./chunks/screenshots-KZ364S2O.js"),t=await e(r,{port:a,verbose:s});process.exit(typeof t=="number"?t:0)}case"screenshot-mode":{let{runScreenshotMode:e}=await import("./chunks/screenshot-mode-TCY7FBGR.js");await e(o.commandArgs,{port:a,verbose:s});break}case"three-mode":case"3d-mode":{let{runThreeMode:e}=await import("./chunks/three-mode-4Q65J2ZA.js");await e(o.commandArgs,{port:a,verbose:s});break}case"inspect":{let{runInspect:e}=await import("./chunks/inspect-BIMFJFDR.js");await e(r,{port:a,verbose:s});break}case"debug":{let{runDebug:e}=await import("./chunks/debug-EV73WC7H.js");await e(r,{port:a,verbose:s});break}case"timeline":{let{runTimeline:e}=await import("./chunks/timeline-ISEDS6XR.js");await e(r,{port:a,verbose:s});break}case"what-happened":{let{runWhatHappened:e}=await import("./chunks/what-happened-STY3AOCQ.js");await e(r,{port:a,verbose:s});break}case"diagnose":{let{runDiagnose:e}=await import("./chunks/diagnose-WXOKGBAJ.js"),t=await e(r,{port:a,verbose:s});process.exit(typeof t=="number"?t:0)}case"open":{let{ensureSootsimReady:e,resolveBootstrapPort:t}=await import("./chunks/auto-bootstrap-3TUCG2BC.js"),i=t(r,a);await e(i);let{runOpenCommand:m}=await import("./chunks/control-DJR3DUAB.js");await m(r,{port:i});break}case"use":case"focus":{let{runUseCommand:e}=await import("./chunks/control-DJR3DUAB.js");await e(r,{port:a});break}case"claim":{let{runClaimCommand:e}=await import("./chunks/control-DJR3DUAB.js");await e(r,{port:a});break}case"close":{let{runCloseCommand:e}=await import("./chunks/control-DJR3DUAB.js");await e(r,{port:a});break}case"config":{let{runConfig:e}=await import("./chunks/config-YMJK426V.js");await e(o.commandArgs);break}case"device":{let{runDeviceCommand:e}=await import("./chunks/device-MMROWQZ3.js");await e(r,{port:a});break}case"scan":case"compat":{let{runCompat:e}=await import("./chunks/compat-UMJ2IXUW.js");await e(o.commandArgs);break}case"electron":{let{runElectron:e}=await import("./chunks/electron-F5DT7CFY.js");await e(o.commandArgs,{port:a,device:d,driver:N});break}case"login":{let{runLogin:e}=await import("./chunks/login-JA6VEDEP.js");await e(o.commandArgs);break}case"logout":{let{runLogout:e}=await import("./chunks/logout-H4WFWTPC.js");await e();break}case"whoami":{let{runWhoami:e}=await import("./chunks/whoami-VKRQOG2U.js");await e();break}case"keys":{let{runKeys:e}=await import("./chunks/keys-DOOCGNTD.js");await e(o.commandArgs);break}case"setup-repo":{let{runSetupRepo:e}=await import("./chunks/setup-repo-TH3GXOP7.js");await e(o.commandArgs);break}case"install":{let{runInstall:e}=await import("./chunks/install-5YPVP466.js");await e(o.commandArgs);break}case"install-desktop":{let{runInstallDesktop:e}=await import("./chunks/install-desktop-ASRNFHZU.js");await e(o.commandArgs);break}case"server":{let{runServer:e}=await import("./chunks/server-S5CRYXXZ.js");await e(o.commandArgs,{port:a});break}case"daemon":{let{runDaemon:e}=await import("./chunks/daemon-LIVCJZR3.js");await e(o.commandArgs,{port:a});break}case"runtime":{let{runRuntime:e}=await import("./chunks/runtime-YJPWA3XA.js");await e(o.commandArgs);break}case"launch":{let{runLaunch:e}=await import("./chunks/launch-DTVAQMZG.js");await e(o.commandArgs);break}case"start":{let{runStart:e}=await import("./chunks/start-KLSAQM3C.js");await e(o.commandArgs,{port:a});break}case"agent":{let{runAgentCommand:e}=await import("./chunks/agent-HZP3LUGJ.js"),t=await e(o.commandArgs);process.exit(t)}case"agent-wrapper":{let{runAgentWrapper:e}=await import("./chunks/agent-wrapper-CS6TV5UR.js"),t=await e(o.commandArgs);process.exit(t)}case"skills":{let{runSkills:e}=await import("./chunks/skills-SMXCCJCM.js");await e(o.commandArgs);break}case"upload":{let{runUpload:e}=await import("./chunks/upload-KB7INQRC.js");await e(o.commandArgs,{port:a,verbose:s});break}case"hints":{let{runHints:e}=await import("./chunks/hints-RODH4XE4.js");e(o.commandArgs);break}default:console.error(` unknown command: ${n}`),console.error(" run `sootsim --help` to see the full surface."),process.exit(1)}
30
+ npm i -g sootsim && sootsim ${t}
31
+ `),process.exit(1))}var o=T(process.argv);{let{trackCliEvent:t}=await import("./chunks/telemetry-WC5J4TE5.js");t({event:"cli_command_invoked",properties:{command:o.command||(o.version?"version":o.help?"help":"none"),arg_count:o.commandArgs.length,platform:process.platform,arch:process.arch,node_version:process.versions.node}})}async function c(t){let{flushCliTelemetry:e}=await import("./chunks/telemetry-WC5J4TE5.js");await e(),process.exit(t)}if(o.version){let{readFileSync:t}=await import("fs"),{fileURLToPath:e}=await import("url"),i=e(import.meta.resolve("sootsim/package.json")),m=JSON.parse(t(i,"utf8")),{IS_BETA:I,BETA_LABEL:y}=await import("./chunks/beta-3S56PNSS.js"),D=I?` \xB7 ${y}`:"";console.log(`sootsim v${m.version}${D}`);let{readActiveRuntime:N}=await import("./chunks/home-paths-5QMCFTBP.js"),b=N();console.log(b?`runtime v${b}`:"runtime not installed"),await c(0)}o.help&&!o.command&&(g(),await c(0));var a=o.globalFlags.port,s=o.verbose,d=o.globalFlags.device,f=o.globalFlags.theme,H=o.globalFlags.driver,Q=o.globalFlags.headless===!0,$=o.globalFlags.sim,n=$?["--sim",$,...o.commandArgs]:o.commandArgs;if(d||f){let{settingsStore:t}=await import("./chunks/store-GH77HGEB.js"),e={};d&&(e.deviceModel=d),f&&(e.colorScheme=f),t.apply(e)}if(!o.command&&o.commandArgs.length===0){let{runStart:t}=await import("./chunks/start-QFREXALP.js");await t([],{port:a}),await c(0)}var r=o.command??"";r||(g(),await c(o.commandArgs.length>0?1:0));if(r in u){let t=u[r],e=o.commandArgs.length>0?` ${o.commandArgs.join(" ")}`:"";console.error(` \`sootsim ${r}\` was removed. use \`${t}\` instead.`),e&&console.error(` \u2192 ${t}${e}`),console.error(" run `sootsim --help` to see the new verb groups."),await c(1)}if(o.help||o.commandArgs.includes("--help")||o.commandArgs.includes("-h")){let t=r==="do"||r==="get"||r==="debug"||r==="shell"||r==="wait",e=o.commandArgs.find(i=>!i.startsWith("-"));r==="shell"||(t&&!e?O(r)&&await c(0):(h(t&&e?e:r),await c(0)))}F(r);if(C.has(r)){let{ensureSootsimReady:t,resolveBootstrapPort:e}=await import("./chunks/auto-bootstrap-4KQT4TCR.js"),i=e(n,a);await t(i);let{runInspect:m}=await import("./chunks/inspect-K4VXPM5J.js");await m([r,...n],{port:i,verbose:s})}else switch(r){case"assert":{let{runAssert:t}=await import("./chunks/assert-NZTYFTTT.js");await t(o.commandArgs);break}case"flow":{let{runFlow:t}=await import("./chunks/flow-ECSMFTKS.js"),e=await t(n);process.exit(typeof e=="number"?e:0)}case"test":{let{runTest:t}=await import("./chunks/test-LI4PGGTE.js");await t(o.commandArgs,{port:a,verbose:s});break}case"detox":{let{runDetox:t}=await import("./chunks/detox-2UI3EAXA.js");await t(o.commandArgs,{port:a,verbose:s});break}case"maestro":{let{runMaestro:t}=await import("./chunks/maestro-GBUBLS6L.js"),e=await t(o.commandArgs,{port:a,verbose:s});process.exit(typeof e=="number"?e:0)}case"preview":{let{runPreview:t}=await import("./chunks/preview-7OKMPPMN.js");await t(o.commandArgs,{port:a,verbose:s});break}case"record":{let{runRecord:t}=await import("./chunks/record-DQR2TEIF.js");await t(n,{port:a,verbose:s});break}case"profile":{let{runProfile:t}=await import("./chunks/profile-CHKDPGJF.js"),e=await t(o.commandArgs,{port:a,verbose:s});process.exit(typeof e=="number"?e:0)}case"cpu-profile":{let{runCpuProfile:t}=await import("./chunks/cpu-profile-3DDV2SYN.js"),e=await t(n,{port:a,verbose:s});process.exit(typeof e=="number"?e:0)}case"react":{let{runReact:t}=await import("./chunks/react-GYI5VITJ.js"),e=await t(n,{port:a,verbose:s});process.exit(typeof e=="number"?e:0)}case"screenshot":{let{runScreenshot:t}=await import("./chunks/screenshot-3T6MNPH7.js");await t(n,{port:a,verbose:s});break}case"screenshots":{let{runScreenshots:t}=await import("./chunks/screenshots-EMTXGI2Q.js"),e=await t(n,{port:a,verbose:s});process.exit(typeof e=="number"?e:0)}case"screenshot-mode":{let{runScreenshotMode:t}=await import("./chunks/screenshot-mode-BUGXY7SQ.js");await t(o.commandArgs,{port:a,verbose:s});break}case"three-mode":case"3d-mode":{let{runThreeMode:t}=await import("./chunks/three-mode-PKINB46T.js");await t(o.commandArgs,{port:a,verbose:s});break}case"inspect":{let{runInspect:t}=await import("./chunks/inspect-K4VXPM5J.js");await t(n,{port:a,verbose:s});break}case"debug":{let{runDebug:t}=await import("./chunks/debug-YXE4XZLP.js");await t(n,{port:a,verbose:s});break}case"timeline":{let{runTimeline:t}=await import("./chunks/timeline-5AREJDL5.js");await t(n,{port:a,verbose:s});break}case"what-happened":{let{runWhatHappened:t}=await import("./chunks/what-happened-SVCASJKT.js");await t(n,{port:a,verbose:s});break}case"diagnose":{let{runDiagnose:t}=await import("./chunks/diagnose-IRDRYKYZ.js"),e=await t(n,{port:a,verbose:s});process.exit(typeof e=="number"?e:0)}case"open":{let{ensureSootsimReady:t,resolveBootstrapPort:e}=await import("./chunks/auto-bootstrap-4KQT4TCR.js"),i=e(n,a);await t(i);let{runOpenCommand:m}=await import("./chunks/control-GNJNC524.js");await m(n,{port:i});break}case"use":case"focus":{let{runUseCommand:t}=await import("./chunks/control-GNJNC524.js");await t(n,{port:a});break}case"claim":{let{runClaimCommand:t}=await import("./chunks/control-GNJNC524.js");await t(n,{port:a});break}case"close":{let{runCloseCommand:t}=await import("./chunks/control-GNJNC524.js");await t(n,{port:a});break}case"config":{let{runConfig:t}=await import("./chunks/config-QQ63IS5P.js");await t(o.commandArgs);break}case"device":{let{runDeviceCommand:t}=await import("./chunks/device-UGDJBZKD.js");await t(n,{port:a});break}case"scan":case"compat":{let{runCompat:t}=await import("./chunks/compat-BA6HDW3Q.js");await t(o.commandArgs);break}case"electron":{let{runElectron:t}=await import("./chunks/electron-ZCYWIZAE.js");await t(o.commandArgs,{port:a,device:d,driver:H});break}case"login":{let{runLogin:t}=await import("./chunks/login-KEU6RAV3.js");await t(o.commandArgs);break}case"logout":{let{runLogout:t}=await import("./chunks/logout-KNFLP5OQ.js");await t();break}case"whoami":{let{runWhoami:t}=await import("./chunks/whoami-5NJ6IPLT.js");await t();break}case"keys":{let{runKeys:t}=await import("./chunks/keys-IFVXJ7C2.js");await t(o.commandArgs);break}case"setup-repo":{let{runSetupRepo:t}=await import("./chunks/setup-repo-P4LCPAF6.js");await t(o.commandArgs);break}case"install":{let{runInstall:t}=await import("./chunks/install-YFE7C2NU.js");await t(o.commandArgs);break}case"install-desktop":{let{runInstallDesktop:t}=await import("./chunks/install-desktop-U3723T63.js");await t(o.commandArgs);break}case"server":{let{runServer:t}=await import("./chunks/server-46H2M4TF.js");await t(o.commandArgs,{port:a});break}case"daemon":{let{runDaemon:t}=await import("./chunks/daemon-RYSVONEV.js");await t(o.commandArgs,{port:a});break}case"runtime":{let{runRuntime:t}=await import("./chunks/runtime-XXNKSGFE.js");await t(o.commandArgs);break}case"upgrade":{let{runUpgrade:t}=await import("./chunks/upgrade-W2AGIOSC.js");await t(o.commandArgs);break}case"launch":{let{runLaunch:t}=await import("./chunks/launch-NDGFTRZ5.js");await t(o.commandArgs);break}case"start":{let{runStart:t}=await import("./chunks/start-QFREXALP.js");await t(o.commandArgs,{port:a});break}case"agent":{let{runAgentCommand:t}=await import("./chunks/agent-7BJ2ZP22.js"),e=await t(o.commandArgs);process.exit(e)}case"agent-wrapper":{let{runAgentWrapper:t}=await import("./chunks/agent-wrapper-OXBYRJVT.js"),e=await t(o.commandArgs);process.exit(e)}case"skills":{let{runSkills:t}=await import("./chunks/skills-2RP2CFPD.js");await t(o.commandArgs);break}case"upload":{let{runUpload:t}=await import("./chunks/upload-RLS6KTG6.js");await t(o.commandArgs,{port:a,verbose:s});break}case"hints":{let{runHints:t}=await import("./chunks/hints-OWOBCWJH.js");t(o.commandArgs);break}default:console.error(` unknown command: ${r}`),console.error(" run `sootsim --help` to see the full surface."),process.exit(1)}
@@ -1,5 +1,5 @@
1
- /*! sootsim v0.1.39 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{a as y,b as $,c as b,d as l,e as E,g as A,h as j,j as S,m as I,n as T,o as x,p as g,q as k,r as D}from"./chunk-2ESCYOZW.js";import"./chunk-NYZGZDHI.js";import"./chunk-B3OEHV2C.js";import"./chunk-ECDPQ6S7.js";import"./chunk-WD54RD4K.js";import w from"node:fs";import d from"node:path";import{spawn as N}from"node:child_process";import U from"node:net";import{WebSocket as O}from"ws";var c=class extends Error{code;constructor(e,t){super(e),this.name="AgentDaemonError",this.code=t}},f=class{ws;port;commandTimeoutMs;ready;closed=!1;nextId=1;pending=new Map;eventListeners=new Set;statusListeners=new Set;disconnectListeners=new Set;constructor(e={}){this.port=e.port??7668,this.commandTimeoutMs=e.commandTimeoutMs??15e3,this.ws=new O(`ws://localhost:${this.port}`),this.ready=new Promise((t,s)=>{let r=()=>{this.ws.off("error",o),t()},o=i=>{this.ws.off("open",r),s(new c(`could not connect to sootsim daemon on port ${this.port}: ${i.message}`,"NO_DAEMON"))};this.ws.once("open",r),this.ws.once("error",o)}),this.ws.on("message",t=>this.handleMessage(t)),this.ws.on("close",()=>this.handleClose()),this.ws.on("error",()=>{})}async waitReady(){return this.ready}async listProjects(){return this.send("agent:list-projects")}async upsertProject(e){return this.send("agent:upsert-project",{input:e})}async deleteProject(e){return this.send("agent:delete-project",{projectId:e})}async autoAttachForUrl(e){return this.send("agent:auto-attach-for-url",{input:e})}async listSessions(e){return this.send("agent:list-sessions",{projectId:e})}async startSession(e){return this.send("agent:start-session",{input:e})}async sendPrompt(e,t){return this.send("agent:send-prompt",{sessionId:e,prompt:t})}async endSession(e){return this.send("agent:end-session",{sessionId:e})}async getTranscript(e){return this.send("agent:get-transcript",{sessionId:e})}async getPaths(){return this.send("agent:get-paths")}async subscribeEvents(e){return this.send("agent:subscribe-events",{sessionId:e})}async unsubscribeEvents(e){return this.send("agent:unsubscribe-events",{sessionId:e})}onAgentEvent(e){return this.eventListeners.add(e),()=>this.eventListeners.delete(e)}onSessionStatusChange(e){return this.statusListeners.add(e),()=>this.statusListeners.delete(e)}onDisconnect(e){return this.disconnectListeners.add(e),()=>this.disconnectListeners.delete(e)}close(){if(!this.closed){this.closed=!0;try{this.ws.close()}catch{}}}async send(e,t={}){if(await this.ready,this.closed||this.ws.readyState!==O.OPEN)throw new c("daemon connection is closed","NO_DAEMON");let s=this.nextId++;return new Promise((r,o)=>{let i=setTimeout(()=>{this.pending.delete(s),o(new c(`${e} timed out after ${Math.round(this.commandTimeoutMs/1e3)}s`,"TIMEOUT"))},this.commandTimeoutMs);this.pending.set(s,{resolve:r,reject:o,timer:i});try{this.ws.send(JSON.stringify({id:s,type:e,...t}))}catch(a){clearTimeout(i),this.pending.delete(s),o(a instanceof Error?a:new Error(String(a)))}})}handleMessage(e){let t;try{t=JSON.parse(String(e))}catch{return}if(!t||typeof t!="object")return;if(t.type==="agent:event"){for(let r of this.eventListeners)try{r({sessionId:t.sessionId,event:t.event})}catch{}return}if(t.type==="agent:session-status"){for(let r of this.statusListeners)try{r(t.session)}catch{}return}if(typeof t.id!="number")return;let s=this.pending.get(t.id);s&&(this.pending.delete(t.id),clearTimeout(s.timer),t.error?s.reject(new c(t.error,t.code)):s.resolve(t.result))}handleClose(){if(!this.closed){this.closed=!0;for(let[,e]of this.pending)clearTimeout(e.timer),e.reject(new c("daemon disconnected","DISCONNECT"));this.pending.clear();for(let e of this.disconnectListeners)try{e()}catch{}}}};function R(n=7668,e=400){return new Promise(t=>{let s=new U.Socket,r=!1,o=i=>{r||(r=!0,s.destroy(),t(i))};s.setTimeout(e),s.once("connect",()=>o(!0)),s.once("timeout",()=>o(!1)),s.once("error",()=>o(!1)),s.connect(n,"127.0.0.1")})}async function _(n={}){let e=n.port??7668;if(await R(e))return{alreadyRunning:!0};let{cmd:t,prefixArgs:s}=D(),r=[...s,"server","--quiet"];e!==7668&&r.push("--port",String(e));let o=N(t,r,{detached:!0,stdio:"ignore",env:process.env,cwd:process.cwd()});o.unref();let i=Date.now()+(n.startupTimeoutMs??5e3);for(;Date.now()<i;){if(await R(e))return{alreadyRunning:!1,pid:o.pid};await new Promise(a=>setTimeout(a,100))}throw new c(`spawned sootsim daemon on port ${e} but it did not come up in time. run \`sootsim server\` manually to diagnose.`,"SPAWN_TIMEOUT")}async function h(n={}){await _({port:n.port,startupTimeoutMs:n.startupTimeoutMs});let e=new f(n);try{await e.waitReady()}catch(t){throw e.close(),t}return e}async function ue(n){let[e,...t]=n;try{switch(e){case void 0:case"--help":case"-h":case"help":return C(),0;case"attach":return await F(t);case"projects":return await B();case"project":return await W(t);case"sessions":return await J(t);case"start":return await V(t);case"prompt":return await q(t);case"watch":return await G(t);case"transcript":return await H(t);case"end":return await K(t);case"paths":return await z();default:return process.stderr.write(`unknown agent subcommand: ${e}
1
+ /*! sootsim v0.1.41 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
+ import{a as y,b as $,c as b,d as l,e as E,g as A,h as j,j as S,m as I,n as T,o as x,p as g,q as k,r as D}from"./chunk-LMNB7NYI.js";import"./chunk-2T6UOHPO.js";import"./chunk-ASSV2FFC.js";import"./chunk-J3JJRXIP.js";import"./chunk-N7DDNZTO.js";import w from"node:fs";import d from"node:path";import{spawn as N}from"node:child_process";import U from"node:net";import{WebSocket as O}from"ws";var c=class extends Error{code;constructor(e,t){super(e),this.name="AgentDaemonError",this.code=t}},f=class{ws;port;commandTimeoutMs;ready;closed=!1;nextId=1;pending=new Map;eventListeners=new Set;statusListeners=new Set;disconnectListeners=new Set;constructor(e={}){this.port=e.port??7668,this.commandTimeoutMs=e.commandTimeoutMs??15e3,this.ws=new O(`ws://localhost:${this.port}`),this.ready=new Promise((t,s)=>{let r=()=>{this.ws.off("error",o),t()},o=i=>{this.ws.off("open",r),s(new c(`could not connect to sootsim daemon on port ${this.port}: ${i.message}`,"NO_DAEMON"))};this.ws.once("open",r),this.ws.once("error",o)}),this.ws.on("message",t=>this.handleMessage(t)),this.ws.on("close",()=>this.handleClose()),this.ws.on("error",()=>{})}async waitReady(){return this.ready}async listProjects(){return this.send("agent:list-projects")}async upsertProject(e){return this.send("agent:upsert-project",{input:e})}async deleteProject(e){return this.send("agent:delete-project",{projectId:e})}async autoAttachForUrl(e){return this.send("agent:auto-attach-for-url",{input:e})}async listSessions(e){return this.send("agent:list-sessions",{projectId:e})}async startSession(e){return this.send("agent:start-session",{input:e})}async sendPrompt(e,t){return this.send("agent:send-prompt",{sessionId:e,prompt:t})}async endSession(e){return this.send("agent:end-session",{sessionId:e})}async getTranscript(e){return this.send("agent:get-transcript",{sessionId:e})}async getPaths(){return this.send("agent:get-paths")}async subscribeEvents(e){return this.send("agent:subscribe-events",{sessionId:e})}async unsubscribeEvents(e){return this.send("agent:unsubscribe-events",{sessionId:e})}onAgentEvent(e){return this.eventListeners.add(e),()=>this.eventListeners.delete(e)}onSessionStatusChange(e){return this.statusListeners.add(e),()=>this.statusListeners.delete(e)}onDisconnect(e){return this.disconnectListeners.add(e),()=>this.disconnectListeners.delete(e)}close(){if(!this.closed){this.closed=!0;try{this.ws.close()}catch{}}}async send(e,t={}){if(await this.ready,this.closed||this.ws.readyState!==O.OPEN)throw new c("daemon connection is closed","NO_DAEMON");let s=this.nextId++;return new Promise((r,o)=>{let i=setTimeout(()=>{this.pending.delete(s),o(new c(`${e} timed out after ${Math.round(this.commandTimeoutMs/1e3)}s`,"TIMEOUT"))},this.commandTimeoutMs);this.pending.set(s,{resolve:r,reject:o,timer:i});try{this.ws.send(JSON.stringify({id:s,type:e,...t}))}catch(a){clearTimeout(i),this.pending.delete(s),o(a instanceof Error?a:new Error(String(a)))}})}handleMessage(e){let t;try{t=JSON.parse(String(e))}catch{return}if(!t||typeof t!="object")return;if(t.type==="agent:event"){for(let r of this.eventListeners)try{r({sessionId:t.sessionId,event:t.event})}catch{}return}if(t.type==="agent:session-status"){for(let r of this.statusListeners)try{r(t.session)}catch{}return}if(typeof t.id!="number")return;let s=this.pending.get(t.id);s&&(this.pending.delete(t.id),clearTimeout(s.timer),t.error?s.reject(new c(t.error,t.code)):s.resolve(t.result))}handleClose(){if(!this.closed){this.closed=!0;for(let[,e]of this.pending)clearTimeout(e.timer),e.reject(new c("daemon disconnected","DISCONNECT"));this.pending.clear();for(let e of this.disconnectListeners)try{e()}catch{}}}};function R(n=7668,e=400){return new Promise(t=>{let s=new U.Socket,r=!1,o=i=>{r||(r=!0,s.destroy(),t(i))};s.setTimeout(e),s.once("connect",()=>o(!0)),s.once("timeout",()=>o(!1)),s.once("error",()=>o(!1)),s.connect(n,"127.0.0.1")})}async function _(n={}){let e=n.port??7668;if(await R(e))return{alreadyRunning:!0};let{cmd:t,prefixArgs:s}=D(),r=[...s,"server","--quiet"];e!==7668&&r.push("--port",String(e));let o=N(t,r,{detached:!0,stdio:"ignore",env:process.env,cwd:process.cwd()});o.unref();let i=Date.now()+(n.startupTimeoutMs??5e3);for(;Date.now()<i;){if(await R(e))return{alreadyRunning:!1,pid:o.pid};await new Promise(a=>setTimeout(a,100))}throw new c(`spawned sootsim daemon on port ${e} but it did not come up in time. run \`sootsim server\` manually to diagnose.`,"SPAWN_TIMEOUT")}async function h(n={}){await _({port:n.port,startupTimeoutMs:n.startupTimeoutMs});let e=new f(n);try{await e.waitReady()}catch(t){throw e.close(),t}return e}async function ue(n){let[e,...t]=n;try{switch(e){case void 0:case"--help":case"-h":case"help":return C(),0;case"attach":return await F(t);case"projects":return await B();case"project":return await W(t);case"sessions":return await J(t);case"start":return await V(t);case"prompt":return await q(t);case"watch":return await G(t);case"transcript":return await H(t);case"end":return await K(t);case"paths":return await z();default:return process.stderr.write(`unknown agent subcommand: ${e}
3
3
  `),C(),2}}catch(s){if(s instanceof c)return process.stderr.write(`${s.message}
4
4
  `),1;throw s}}async function v(n){let e=await h({clientLabel:"sootsim-agent-cli"});try{return await n(e)}finally{e.close()}}function C(){process.stdout.write(`sootsim agent \u2014 attached projects + local agent sessions
5
5
 
@@ -1,5 +1,5 @@
1
- /*! sootsim v0.1.39 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{b as M}from"./chunk-NYZGZDHI.js";import"./chunk-WD54RD4K.js";import{execFile as G,spawn as q}from"node:child_process";import{randomUUID as X}from"node:crypto";import{constants as R,createReadStream as Y,createWriteStream as j,existsSync as I,openSync as J}from"node:fs";import V from"node:fs/promises";import z from"node:path";import K from"node:readline";import{promisify as Q}from"node:util";import{spawn as H}from"node:child_process";import L from"node:readline";var b=class extends Error{code;data;constructor(t,r,m){super(t),this.name="CodexRpcError",this.code=r,this.data=m}};function W(d){let t=H(d.bin,["app-server"],{cwd:d.cwd,env:{...process.env,...d.env},stdio:["pipe","pipe","pipe"]}),r=new Map,m=new Map,u=1,g=!1,a=new Promise(s=>{t.on("exit",(i,e)=>{g=!0;let p=new Error(`codex app-server exited (code=${i}, signal=${e??""})`);for(let{reject:f}of r.values())f(p);r.clear(),s({code:i,signal:e})})});L.createInterface({input:t.stdout,crlfDelay:1/0}).on("line",s=>{let i=s.trim();if(!i)return;let e;try{e=JSON.parse(i)}catch{return}if(e.id!=null&&(e.result!==void 0||e.error!==void 0)){let p=typeof e.id=="string"?Number(e.id):e.id,f=p!=null?r.get(p):void 0;if(!f)return;r.delete(p),e.error?f.reject(new b(e.error.message,e.error.code,e.error.data)):f.resolve(e.result);return}if(e.method){let p=m.get(e.method);if(!p)return;for(let f of p)try{f(e.params)}catch(l){console.error(`[codex-client] handler for "${e.method}" threw:`,l instanceof Error?l.stack??l.message:l)}}}),t.stderr.setEncoding("utf8"),t.stderr.on("data",s=>{let i=m.get("__stderr__");if(i)for(let e of i)try{e({text:s})}catch{}});function n(s){if(!g)try{t.stdin.write(JSON.stringify(s)+`
1
+ /*! sootsim v0.1.41 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
+ import{b as M}from"./chunk-2T6UOHPO.js";import"./chunk-N7DDNZTO.js";import{execFile as G,spawn as q}from"node:child_process";import{randomUUID as X}from"node:crypto";import{constants as R,createReadStream as Y,createWriteStream as j,existsSync as I,openSync as J}from"node:fs";import V from"node:fs/promises";import z from"node:path";import K from"node:readline";import{promisify as Q}from"node:util";import{spawn as H}from"node:child_process";import L from"node:readline";var b=class extends Error{code;data;constructor(t,r,m){super(t),this.name="CodexRpcError",this.code=r,this.data=m}};function W(d){let t=H(d.bin,["app-server"],{cwd:d.cwd,env:{...process.env,...d.env},stdio:["pipe","pipe","pipe"]}),r=new Map,m=new Map,u=1,g=!1,a=new Promise(s=>{t.on("exit",(i,e)=>{g=!0;let p=new Error(`codex app-server exited (code=${i}, signal=${e??""})`);for(let{reject:f}of r.values())f(p);r.clear(),s({code:i,signal:e})})});L.createInterface({input:t.stdout,crlfDelay:1/0}).on("line",s=>{let i=s.trim();if(!i)return;let e;try{e=JSON.parse(i)}catch{return}if(e.id!=null&&(e.result!==void 0||e.error!==void 0)){let p=typeof e.id=="string"?Number(e.id):e.id,f=p!=null?r.get(p):void 0;if(!f)return;r.delete(p),e.error?f.reject(new b(e.error.message,e.error.code,e.error.data)):f.resolve(e.result);return}if(e.method){let p=m.get(e.method);if(!p)return;for(let f of p)try{f(e.params)}catch(l){console.error(`[codex-client] handler for "${e.method}" threw:`,l instanceof Error?l.stack??l.message:l)}}}),t.stderr.setEncoding("utf8"),t.stderr.on("data",s=>{let i=m.get("__stderr__");if(i)for(let e of i)try{e({text:s})}catch{}});function n(s){if(!g)try{t.stdin.write(JSON.stringify(s)+`
3
3
  `)}catch{}}return{exited:a,on(s,i){let e=m.get(s);return e||(e=new Set,m.set(s,e)),e.add(i),()=>{e?.delete(i)}},request(s,i){if(g)return Promise.reject(new Error(`codex app-server closed; cannot call ${s}`));let e=u++;return new Promise((p,f)=>{r.set(e,{resolve:l=>p(l),reject:f,method:s}),n({jsonrpc:"2.0",id:e,method:s,params:i})})},notify(s,i){n({jsonrpc:"2.0",method:s,params:i})},async shutdown(s=1500){if(g)return;try{t.stdin.end()}catch{}let i=setTimeout(()=>{if(!g)try{t.kill("SIGTERM")}catch{}},s);try{await a}finally{clearTimeout(i)}},kill(s="SIGTERM"){if(!g)try{t.kill(s)}catch{}}}}var O="never",F="danger-full-access",Z={type:"dangerFullAccess"},D="fast",ee="medium",te=Q(G);async function ne(d,t){let r=t||d;if(r.includes("/")||r.includes("\\"))return I(r)?{ok:!0,path:r}:{ok:!1,message:`agent binary not found at path: ${r}`};try{let{stdout:m}=await te("which",[r],{timeout:1500}),u=m.trim();return u?{ok:!0,path:u}:{ok:!1,message:`${r} not found on PATH`}}catch{return{ok:!1,message:`${r} not found on PATH. install the ${d} CLI and retry, or pass --${d}-bin /path/to/${d} to agent start.`}}}function re(d){let t={"--session-id":"sessionId","--project-id":"projectId","--provider":"provider","--cwd":"cwd","--prompt-in":"promptIn","--events-out":"eventsOut","--transcript":"transcript","--codex-bin":"codexBin","--claude-bin":"claudeBin","--claude-session-uuid":"claudeSessionUuid"},r={};for(let m=0;m<d.length;m++){let u=d[m];if(u==="--fresh-thread"){r.freshThread=!0;continue}let g=t[u];g&&(r[g]=d[m+1],m++)}return r}async function Ie(d){let t=re(d);if(!t.sessionId||!t.projectId||!t.provider||!t.cwd||!t.promptIn||!t.eventsOut)return process.stderr.write(`usage: sootsim agent-wrapper --session-id <id> --project-id <id>
4
4
  --provider codex|claude --cwd <path>
5
5
  --prompt-in <fifo> --events-out <fifo>
@@ -1,5 +1,5 @@
1
- /*! sootsim v0.1.39 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import"./chunk-WD54RD4K.js";import{spawn as x}from"child_process";var w=new Set(["describe","find","list","network","logs","count","tree","url","a11y","node","layout","keyboard","errors","warnings","requests","animations","animation","state","sample-color"]),S=new Set(["--exists","--empty","--negate","--quiet","--allow-timeout","!"]),q=new Set(["--count","--count-at-least","--count-at-most","--contains","--not-contains","--matches","--not-matches","--equals","--jq","--has-path","--within"]),P=new Set(["--path-equals"]);function j(s){let r=[],u=[],n=0,e=!1,t=!1,i=!1;for(let o=0;o<s.length;o++){let a=s[o];if(a==="--within"){let c=Number(s[o+1]);if(!Number.isFinite(c)||c<0)return{error:`--within requires a non-negative number, got: ${s[o+1]}`};n=c,o++;continue}if(a==="--negate"||a==="!"){e=!0;continue}if(a==="--quiet"){t=!0;continue}if(a==="--allow-timeout"){i=!0;continue}if(S.has(a)){u.push({kind:a,args:[]});continue}if(q.has(a)){let c=s[o+1];if(c==null)return{error:`${a} requires a value`};u.push({kind:a,args:[c]}),o++;continue}if(P.has(a)){let c=s[o+1],f=s[o+2];if(c==null||f==null)return{error:`${a} requires <path> <value>`};u.push({kind:a,args:[c,f]}),o+=2;continue}r.push(a)}return r.length===0?{error:"assert requires a verb (e.g. find, describe, get errors)"}:{verbArgs:r,predicates:u,withinMs:n,negate:e,quiet:t,allowTimeout:i}}function N(s){return s[0]==="get"||s[0]==="debug"?w.has(s[1])?s[1]:null:s[0]==="do"||s[0]==="wait"?null:w.has(s[0])?s[0]:null}async function R(s){let u=[process.argv[1],...s,"--json"];return new Promise(n=>{let e=x(process.execPath,u,{stdio:["ignore","pipe","pipe"],env:process.env}),t="",i="";e.stdout.on("data",o=>t+=o.toString()),e.stderr.on("data",o=>i+=o.toString()),e.on("error",o=>{n({ok:!1,payload:null,reason:`spawn failed: ${o.message}`})}),e.on("close",o=>{if(o!==0){let a=i.trim().split(`
1
+ /*! sootsim v0.1.41 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
+ import"./chunk-N7DDNZTO.js";import{spawn as x}from"child_process";var w=new Set(["describe","find","list","network","logs","count","tree","url","a11y","node","layout","keyboard","errors","warnings","requests","animations","animation","state","sample-color"]),S=new Set(["--exists","--empty","--negate","--quiet","--allow-timeout","!"]),q=new Set(["--count","--count-at-least","--count-at-most","--contains","--not-contains","--matches","--not-matches","--equals","--jq","--has-path","--within"]),P=new Set(["--path-equals"]);function j(s){let r=[],u=[],n=0,e=!1,t=!1,i=!1;for(let o=0;o<s.length;o++){let a=s[o];if(a==="--within"){let c=Number(s[o+1]);if(!Number.isFinite(c)||c<0)return{error:`--within requires a non-negative number, got: ${s[o+1]}`};n=c,o++;continue}if(a==="--negate"||a==="!"){e=!0;continue}if(a==="--quiet"){t=!0;continue}if(a==="--allow-timeout"){i=!0;continue}if(S.has(a)){u.push({kind:a,args:[]});continue}if(q.has(a)){let c=s[o+1];if(c==null)return{error:`${a} requires a value`};u.push({kind:a,args:[c]}),o++;continue}if(P.has(a)){let c=s[o+1],f=s[o+2];if(c==null||f==null)return{error:`${a} requires <path> <value>`};u.push({kind:a,args:[c,f]}),o+=2;continue}r.push(a)}return r.length===0?{error:"assert requires a verb (e.g. find, describe, get errors)"}:{verbArgs:r,predicates:u,withinMs:n,negate:e,quiet:t,allowTimeout:i}}function N(s){return s[0]==="get"||s[0]==="debug"?w.has(s[1])?s[1]:null:s[0]==="do"||s[0]==="wait"?null:w.has(s[0])?s[0]:null}async function R(s){let u=[process.argv[1],...s,"--json"];return new Promise(n=>{let e=x(process.execPath,u,{stdio:["ignore","pipe","pipe"],env:process.env}),t="",i="";e.stdout.on("data",o=>t+=o.toString()),e.stderr.on("data",o=>i+=o.toString()),e.on("error",o=>{n({ok:!1,payload:null,reason:`spawn failed: ${o.message}`})}),e.on("close",o=>{if(o!==0){let a=i.trim().split(`
3
3
  `).slice(-2).join(" | ").slice(0,200);n({ok:!1,payload:null,reason:`verb exited ${o}${a?`: ${a}`:""}`});return}if(!t.trim()){n({ok:!1,payload:null,reason:"verb produced no output"});return}try{let a=JSON.parse(t);n({ok:!0,payload:a})}catch{n({ok:!1,payload:null,reason:`verb output was not valid json: ${t.slice(0,120)}`})}})})}function y(s,r){let u=r.split(".").filter(e=>e.length>0),n=s;for(let e of u){if(n==null)return{found:!1};if(Array.isArray(n)){let t=Number(e);if(!Number.isInteger(t)||t<0||t>=n.length)return{found:!1};n=n[t];continue}if(typeof n=="object"){let t=n;if(!(e in t))return{found:!1};n=t[e];continue}return{found:!1}}return{found:!0,value:n}}function d(s){return Array.isArray(s)?s.length:s&&typeof s=="object"?Object.keys(s).length:null}async function A(s,r){let{kind:u,args:n}=s;switch(u){case"--exists":return r==null?{ok:!1,reason:"payload is null"}:d(r)===0?{ok:!1,reason:"payload is empty"}:{ok:!0,reason:"exists"};case"--empty":{if(r==null)return{ok:!0,reason:"payload is null"};let e=d(r);return e===0?{ok:!0,reason:"payload is empty"}:{ok:!1,reason:`payload has ${e} item(s)`}}case"--count":{let e=Number(n[0]),t=d(r);return t==null?{ok:!1,reason:`payload not countable (${typeof r})`}:{ok:t===e,reason:`count=${t}, want=${e}`}}case"--count-at-least":{let e=Number(n[0]),t=d(r);return t==null?{ok:!1,reason:"payload not countable"}:{ok:t>=e,reason:`count=${t}, want>=${e}`}}case"--count-at-most":{let e=Number(n[0]),t=d(r);return t==null?{ok:!1,reason:"payload not countable"}:{ok:t<=e,reason:`count=${t}, want<=${e}`}}case"--contains":{let e=n[0],t=JSON.stringify(r);return{ok:t.includes(e),reason:t.includes(e)?`contains "${e}"`:`missing "${e}"`}}case"--not-contains":{let e=n[0],t=JSON.stringify(r);return{ok:!t.includes(e),reason:t.includes(e)?`unexpected "${e}"`:`not contains "${e}"`}}case"--matches":{let e=new RegExp(n[0]),t=JSON.stringify(r),i=e.test(t);return{ok:i,reason:i?`matches /${n[0]}/`:`no match for /${n[0]}/`}}case"--not-matches":{let e=new RegExp(n[0]),t=JSON.stringify(r),i=!e.test(t);return{ok:i,reason:i?`not matches /${n[0]}/`:`unexpected /${n[0]}/`}}case"--equals":{let e=n[0],t=typeof r=="string"?r:typeof r=="number"||typeof r=="boolean"?String(r):JSON.stringify(r);return{ok:t===e,reason:`got=${JSON.stringify(t)}, want=${JSON.stringify(e)}`}}case"--has-path":{let e=y(r,n[0]);return{ok:e.found,reason:e.found?`path ${n[0]} present`:`path ${n[0]} missing`}}case"--path-equals":{let[e,t]=n,i=y(r,e);if(!i.found)return{ok:!1,reason:`path ${e} missing`};let o=typeof i.value=="string"||typeof i.value=="number"||typeof i.value=="boolean"?String(i.value):JSON.stringify(i.value);return{ok:o===t,reason:`${e}=${o}, want=${t}`}}case"--jq":{let e=n[0];try{let i=(await O(e,r)).trim();return{ok:i.length>0&&i!=="null"&&i!=="false"&&i!=='""',reason:`jq: ${i.slice(0,120)}`}}catch(t){throw new Error(`jq evaluation failed: ${t.message}`)}}default:return{ok:!1,reason:`unknown predicate ${u}`}}}function O(s,r){return new Promise((u,n)=>{let e=x("jq",[s],{stdio:["pipe","pipe","pipe"]}),t="",i="";e.stdout.on("data",o=>t+=o.toString()),e.stderr.on("data",o=>i+=o.toString()),e.on("error",n),e.on("close",o=>{if(o!==0){n(new Error(i.trim()||`jq exited ${o}`));return}u(t)}),e.stdin.end(JSON.stringify(r))})}async function T(s){(s[0]==="--help"||s[0]==="-h"||s.length===0)&&(J(),process.exit(s.length===0?2:0));let r=j(s);"error"in r&&(process.stderr.write(` assert: ${r.error}
4
4
  `),process.exit(2));let{verbArgs:u,predicates:n,withinMs:e,negate:t,quiet:i,allowTimeout:o}=r;N(u)||(process.stderr.write(` assert: unknown or non-read verb: ${u.join(" ")}
5
5
  supported: ${Array.from(w).sort().join(", ")}
@@ -0,0 +1,2 @@
1
+ /*! sootsim v0.1.41 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
+ import{a,b,c,d}from"./chunk-WZDE344I.js";import"./chunk-6PLNIOJP.js";import"./chunk-SWHWVYZS.js";import"./chunk-ASSV2FFC.js";import"./chunk-J3JJRXIP.js";import"./chunk-N7DDNZTO.js";export{c as ensureDaemonRunning,a as ensureRuntimeInstalled,d as ensureSootsimReady,b as resolveBootstrapPort};
@@ -0,0 +1,2 @@
1
+ /*! sootsim v0.1.41 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
+ import{a,b,c,d,e}from"./chunk-TBIGAH3T.js";import"./chunk-N7DDNZTO.js";export{e as BETA_ASK_HEADLINE,c as BETA_LABEL,d as BETA_TAGLINE,b as BETA_VERSION_TARGET,a as IS_BETA};
@@ -1,2 +1,2 @@
1
- /*! sootsim v0.1.39 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.41 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  var c="sootsim-agent-prompt-v1";function r(n){return typeof n=="string"?n.trim():""}function m(n){let e=r(n.text);if(!e)return"";let t=r(n.displayText),s=r(n.inspectSummary),o=r(n.inspectTrace);return!!s||!!o||/[\r\n]/.test(e)||!!t&&t!==e?JSON.stringify({__sootsimAgentPrompt:c,text:e,displayText:t,inspectSummary:s,inspectTrace:o}):e}function u(n){let e=r(n);if(!e)return null;try{let t=JSON.parse(e);if(t.__sootsimAgentPrompt!==c)return{text:e};let s=r(typeof t.text=="string"?t.text:void 0);if(!s)return null;let o=r(typeof t.displayText=="string"?t.displayText:void 0),i=r(typeof t.inspectSummary=="string"?t.inspectSummary:void 0),p=r(typeof t.inspectTrace=="string"?t.inspectTrace:void 0);return{text:s,...o?{displayText:o}:{},...i?{inspectSummary:i}:{},...p?{inspectTrace:p}:{}}}catch{return{text:e}}}export{m as a,u as b};
@@ -0,0 +1,2 @@
1
+ /*! sootsim v0.1.41 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
+ var t="http://localhost:5173/";export{t as a};
@@ -1,2 +1,2 @@
1
- /*! sootsim v0.1.39 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- var o={width:3,lock:{top:253,height:103},ringToggle:{top:152,height:32},volumeUp:{top:214,height:61},volumeDown:{top:290,height:61}},m={width:2.5,lock:{top:130,height:78},ringToggle:{top:94,height:22},volumeUp:{top:126,height:48},volumeDown:{top:188,height:48}},d={width:3,lock:{top:238,height:78},ringToggle:{top:-1e3,height:0},volumeUp:{top:336,height:62},volumeDown:{top:408,height:62}},h={width:3,lock:{top:248,height:72},ringToggle:{top:-1e3,height:0},volumeUp:{top:144,height:62},volumeDown:{top:216,height:62}},a=48;function t(e){return{...e,platform:"ios",navigationBarHeight:0,navigationBarMode:e.homeIndicatorHeight>0?"gesture":"none",displayCutout:{top:e.dynamicIsland?e.statusBarHeight:0,bottom:0,left:0,right:0},cameraCutout:null,osVersion:e.iosVersion,androidApiLevel:null,systemName:"iOS",manufacturer:"Apple",brand:"Apple",modelName:e.name}}var c={"iphone-se":t({name:"iPhone SE",width:375,height:667,scale:2,statusBarHeight:20,homeIndicatorHeight:0,cornerRadius:0,dynamicIsland:null,safeAreaInsets:{top:20,bottom:0,left:0,right:0},iosVersion:"15.8",physicalPPI:326,hardwareButtons:m}),"iphone-14":t({name:"iPhone 14",width:390,height:844,scale:3,statusBarHeight:47,homeIndicatorHeight:34,cornerRadius:55,dynamicIsland:null,safeAreaInsets:{top:47,bottom:34,left:0,right:0},iosVersion:"17.6",physicalPPI:460,hardwareButtons:o}),"iphone-15":t({name:"iPhone 15",width:393,height:852,scale:3,statusBarHeight:59,homeIndicatorHeight:34,cornerRadius:58,dynamicIsland:{width:126,height:37.3},safeAreaInsets:{top:59,bottom:34,left:0,right:0},iosVersion:"17.6",physicalPPI:460,hardwareButtons:o}),"iphone-15-plus":t({name:"iPhone 15 Plus",width:430,height:932,scale:3,statusBarHeight:59,homeIndicatorHeight:34,cornerRadius:58,dynamicIsland:{width:126,height:37.3},safeAreaInsets:{top:59,bottom:34,left:0,right:0},iosVersion:"17.6",physicalPPI:460,hardwareButtons:o}),"iphone-15-pro":t({name:"iPhone 15 Pro",width:393,height:852,scale:3,statusBarHeight:59,homeIndicatorHeight:34,cornerRadius:58,dynamicIsland:{width:126,height:38},safeAreaInsets:{top:59,bottom:34,left:0,right:0},iosVersion:"18.2",physicalPPI:460,hardwareButtons:o}),"iphone-15-pro-max":t({name:"iPhone 15 Pro Max",width:430,height:932,scale:3,statusBarHeight:59,homeIndicatorHeight:34,cornerRadius:58,dynamicIsland:{width:126,height:38},safeAreaInsets:{top:59,bottom:34,left:0,right:0},iosVersion:"18.2",physicalPPI:460,hardwareButtons:o}),"iphone-16":t({name:"iPhone 16",width:393,height:852,scale:3,statusBarHeight:59,homeIndicatorHeight:34,cornerRadius:58,dynamicIsland:{width:126,height:37.3},safeAreaInsets:{top:59,bottom:34,left:0,right:0},iosVersion:"26.4",physicalPPI:460,hardwareButtons:o}),"iphone-16-plus":t({name:"iPhone 16 Plus",width:430,height:932,scale:3,statusBarHeight:59,homeIndicatorHeight:34,cornerRadius:58,dynamicIsland:{width:126,height:37.3},safeAreaInsets:{top:59,bottom:34,left:0,right:0},iosVersion:"26.4",physicalPPI:460,hardwareButtons:o}),"iphone-16-pro":t({name:"iPhone 16 Pro",width:402,height:874,scale:3,statusBarHeight:62,homeIndicatorHeight:34,cornerRadius:58,dynamicIsland:{width:126,height:38},safeAreaInsets:{top:62,bottom:34,left:0,right:0},iosVersion:"26.4",physicalPPI:460,hardwareButtons:o}),"iphone-16-pro-max":t({name:"iPhone 16 Pro Max",width:440,height:956,scale:3,statusBarHeight:62,homeIndicatorHeight:34,cornerRadius:58,dynamicIsland:{width:126,height:38},safeAreaInsets:{top:62,bottom:34,left:0,right:0},iosVersion:"26.4",physicalPPI:460,hardwareButtons:o}),"iphone-17":t({name:"iPhone 17",width:402,height:874,scale:3,statusBarHeight:59,homeIndicatorHeight:34,cornerRadius:58,dynamicIsland:{width:126,height:37.3},safeAreaInsets:{top:59,bottom:34,left:0,right:0},iosVersion:"26.4",physicalPPI:460,hardwareButtons:o}),"iphone-17-air":t({name:"iPhone 17 Air",width:430,height:932,scale:3,statusBarHeight:59,homeIndicatorHeight:34,cornerRadius:58,dynamicIsland:{width:126,height:38},safeAreaInsets:{top:59,bottom:34,left:0,right:0},iosVersion:"26.4",physicalPPI:460,hardwareButtons:o}),"iphone-17-pro":t({name:"iPhone 17 Pro",width:402,height:874,scale:3,statusBarHeight:59,homeIndicatorHeight:34,cornerRadius:58,dynamicIsland:{width:126,height:38},safeAreaInsets:{top:59,bottom:34,left:0,right:0},iosVersion:"26.4",physicalPPI:460,hardwareButtons:o}),"iphone-17-pro-max":t({name:"iPhone 17 Pro Max",width:440,height:956,scale:3,statusBarHeight:62,homeIndicatorHeight:34,cornerRadius:58,dynamicIsland:{width:126,height:38},safeAreaInsets:{top:62,bottom:34,left:0,right:0},iosVersion:"26.4",physicalPPI:460,hardwareButtons:o}),"ipad-pro-13":t({name:'iPad Pro 13"',width:1032,height:1376,scale:2,statusBarHeight:24,homeIndicatorHeight:20,cornerRadius:18,dynamicIsland:null,safeAreaInsets:{top:24,bottom:20,left:0,right:0},iosVersion:"18.2",physicalPPI:264,hardwareButtons:o}),"pixel-8":{platform:"android",name:"Pixel 8",width:412,height:915,scale:2.625,statusBarHeight:40,homeIndicatorHeight:0,navigationBarHeight:a,navigationBarMode:"gesture",displayCutout:{top:40,bottom:0,left:0,right:0},cornerRadius:39,dynamicIsland:null,cameraCutout:{diameter:24},safeAreaInsets:{top:40,bottom:a,left:0,right:0},osVersion:"15",iosVersion:"",androidApiLevel:35,systemName:"Android",manufacturer:"Google",brand:"google",modelName:"Pixel 8",physicalPPI:428,hardwareButtons:d},"pixel-8-three-button":{platform:"android",name:"Pixel 8 (3-button)",width:412,height:915,scale:2.625,statusBarHeight:40,homeIndicatorHeight:0,navigationBarHeight:48,navigationBarMode:"three-button",displayCutout:{top:40,bottom:0,left:0,right:0},cornerRadius:39,dynamicIsland:null,cameraCutout:{diameter:24},safeAreaInsets:{top:40,bottom:48,left:0,right:0},osVersion:"15",iosVersion:"",androidApiLevel:35,systemName:"Android",manufacturer:"Google",brand:"google",modelName:"Pixel 8",physicalPPI:428,hardwareButtons:d},"pixel-9-pro-xl":{platform:"android",name:"Pixel 9 Pro XL",width:448,height:997,scale:3,statusBarHeight:40,homeIndicatorHeight:0,navigationBarHeight:a,navigationBarMode:"gesture",displayCutout:{top:40,bottom:0,left:0,right:0},cornerRadius:41,dynamicIsland:null,cameraCutout:{diameter:24},safeAreaInsets:{top:40,bottom:a,left:0,right:0},osVersion:"15",iosVersion:"",androidApiLevel:35,systemName:"Android",manufacturer:"Google",brand:"google",modelName:"Pixel 9 Pro XL",physicalPPI:486,hardwareButtons:d},"galaxy-s24":{platform:"android",name:"Galaxy S24",width:360,height:780,scale:3,statusBarHeight:36,homeIndicatorHeight:0,navigationBarHeight:a,navigationBarMode:"gesture",displayCutout:{top:36,bottom:0,left:0,right:0},cornerRadius:36,dynamicIsland:null,cameraCutout:{diameter:18},safeAreaInsets:{top:36,bottom:a,left:0,right:0},osVersion:"15",iosVersion:"",androidApiLevel:35,systemName:"Android",manufacturer:"Samsung",brand:"samsung",modelName:"SM-S921B",physicalPPI:416,hardwareButtons:h},"galaxy-s24-ultra":{platform:"android",name:"Galaxy S24 Ultra",width:384,height:824,scale:3.75,statusBarHeight:36,homeIndicatorHeight:0,navigationBarHeight:a,navigationBarMode:"gesture",displayCutout:{top:36,bottom:0,left:0,right:0},cornerRadius:24,dynamicIsland:null,cameraCutout:{diameter:18},safeAreaInsets:{top:36,bottom:a,left:0,right:0},osVersion:"15",iosVersion:"",androidApiLevel:35,systemName:"Android",manufacturer:"Samsung",brand:"samsung",modelName:"SM-S928B",physicalPPI:505,hardwareButtons:h}},u="iphone-17-pro";function y(e){return c[e]}function g(){return Object.keys(c)}var n={"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"},"ipad-13":{name:"ipad-13",label:'iPad 13"',width:2064,height:2752,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"}},s={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"}]}},w={color:"#25c3ec",blur:120,spread:52,opacity:.34},P="iphone-17-pro";function v(e){return Object.prototype.hasOwnProperty.call(n,e)?n[e]:null}function f(e){return{type:e.type,color:e.color,direction:e.direction,glow:e.glow,stops:e.stops?.map(r=>({...r}))}}function S(e){return Object.prototype.hasOwnProperty.call(s,e)?f(s[e]):null}var p={deviceModel:{type:"enum",default:u,description:"device model to simulate",cliFlag:"device",cliFlagShort:"d",options:g(),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:e=>e>=.5&&e<=2},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"},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:"show simulator top bar",group:"simulator"},screenshotMode:{type:"boolean",default:!1,description:"show screenshot composition mode in the browser shell",group:"simulator"},threeMode:{type:"boolean",default:!1,description:"show the experimental 3d device stage in the browser shell",group:"simulator"},screenshotCanvas:{type:"enum",default:"iphone-6-9",description:"target app-store canvas preset for screenshot mode",options:Object.keys(n),group:"simulator"},screenshotBackground:{type:"enum",default:"dark",description:"background preset rendered inside the screenshot canvas",options:Object.keys(s),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"},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 A(){let e={};for(let[r,i]of Object.entries(p))e[r]=i.default;if(typeof window<"u")try{let r=new URLSearchParams(window.location.search),i=r.get("device");i&&p.deviceModel.options?.includes(i)&&(e.deviceModel=i);let l=r.get("colorScheme")??r.get("theme");l&&p.colorScheme.options?.includes(l)&&(e.colorScheme=l)}catch{}return e}export{w as a,P as b,v as c,f as d,S as e,c as f,y as g,g as h,p as i,A as j};
1
+ /*! sootsim v0.1.41 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
+ var o={width:3,lock:{top:253,height:103},ringToggle:{top:152,height:32},volumeUp:{top:214,height:61},volumeDown:{top:290,height:61}},m={width:2.5,lock:{top:130,height:78},ringToggle:{top:94,height:22},volumeUp:{top:126,height:48},volumeDown:{top:188,height:48}},d={width:3,lock:{top:238,height:78},ringToggle:{top:-1e3,height:0},volumeUp:{top:336,height:62},volumeDown:{top:408,height:62}},c={width:3,lock:{top:248,height:72},ringToggle:{top:-1e3,height:0},volumeUp:{top:144,height:62},volumeDown:{top:216,height:62}},a=48;function t(e){return{...e,platform:"ios",navigationBarHeight:0,navigationBarMode:e.homeIndicatorHeight>0?"gesture":"none",displayCutout:{top:e.dynamicIsland?e.statusBarHeight:0,bottom:0,left:0,right:0},cameraCutout:null,osVersion:e.iosVersion,androidApiLevel:null,systemName:"iOS",manufacturer:"Apple",brand:"Apple",modelName:e.name}}var h={"iphone-se":t({name:"iPhone SE",width:375,height:667,scale:2,statusBarHeight:20,homeIndicatorHeight:0,cornerRadius:0,dynamicIsland:null,safeAreaInsets:{top:20,bottom:0,left:0,right:0},iosVersion:"15.8",physicalPPI:326,hardwareButtons:m}),"iphone-14":t({name:"iPhone 14",width:390,height:844,scale:3,statusBarHeight:47,homeIndicatorHeight:34,cornerRadius:55,dynamicIsland:null,safeAreaInsets:{top:47,bottom:34,left:0,right:0},iosVersion:"17.6",physicalPPI:460,hardwareButtons:o}),"iphone-15":t({name:"iPhone 15",width:393,height:852,scale:3,statusBarHeight:59,homeIndicatorHeight:34,cornerRadius:58,dynamicIsland:{width:126,height:37.3},safeAreaInsets:{top:59,bottom:34,left:0,right:0},iosVersion:"17.6",physicalPPI:460,hardwareButtons:o}),"iphone-15-plus":t({name:"iPhone 15 Plus",width:430,height:932,scale:3,statusBarHeight:59,homeIndicatorHeight:34,cornerRadius:58,dynamicIsland:{width:126,height:37.3},safeAreaInsets:{top:59,bottom:34,left:0,right:0},iosVersion:"17.6",physicalPPI:460,hardwareButtons:o}),"iphone-15-pro":t({name:"iPhone 15 Pro",width:393,height:852,scale:3,statusBarHeight:59,homeIndicatorHeight:34,cornerRadius:58,dynamicIsland:{width:126,height:38},safeAreaInsets:{top:59,bottom:34,left:0,right:0},iosVersion:"18.2",physicalPPI:460,hardwareButtons:o}),"iphone-15-pro-max":t({name:"iPhone 15 Pro Max",width:430,height:932,scale:3,statusBarHeight:59,homeIndicatorHeight:34,cornerRadius:58,dynamicIsland:{width:126,height:38},safeAreaInsets:{top:59,bottom:34,left:0,right:0},iosVersion:"18.2",physicalPPI:460,hardwareButtons:o}),"iphone-16":t({name:"iPhone 16",width:393,height:852,scale:3,statusBarHeight:59,homeIndicatorHeight:34,cornerRadius:58,dynamicIsland:{width:126,height:37.3},safeAreaInsets:{top:59,bottom:34,left:0,right:0},iosVersion:"26.4",physicalPPI:460,hardwareButtons:o}),"iphone-16-plus":t({name:"iPhone 16 Plus",width:430,height:932,scale:3,statusBarHeight:59,homeIndicatorHeight:34,cornerRadius:58,dynamicIsland:{width:126,height:37.3},safeAreaInsets:{top:59,bottom:34,left:0,right:0},iosVersion:"26.4",physicalPPI:460,hardwareButtons:o}),"iphone-16-pro":t({name:"iPhone 16 Pro",width:402,height:874,scale:3,statusBarHeight:62,homeIndicatorHeight:34,cornerRadius:58,dynamicIsland:{width:126,height:38},safeAreaInsets:{top:62,bottom:34,left:0,right:0},iosVersion:"26.4",physicalPPI:460,hardwareButtons:o}),"iphone-16-pro-max":t({name:"iPhone 16 Pro Max",width:440,height:956,scale:3,statusBarHeight:62,homeIndicatorHeight:34,cornerRadius:58,dynamicIsland:{width:126,height:38},safeAreaInsets:{top:62,bottom:34,left:0,right:0},iosVersion:"26.4",physicalPPI:460,hardwareButtons:o}),"iphone-17":t({name:"iPhone 17",width:402,height:874,scale:3,statusBarHeight:59,homeIndicatorHeight:34,cornerRadius:58,dynamicIsland:{width:126,height:37.3},safeAreaInsets:{top:59,bottom:34,left:0,right:0},iosVersion:"26.4",physicalPPI:460,hardwareButtons:o}),"iphone-17-air":t({name:"iPhone 17 Air",width:430,height:932,scale:3,statusBarHeight:59,homeIndicatorHeight:34,cornerRadius:58,dynamicIsland:{width:126,height:38},safeAreaInsets:{top:59,bottom:34,left:0,right:0},iosVersion:"26.4",physicalPPI:460,hardwareButtons:o}),"iphone-17-pro":t({name:"iPhone 17 Pro",width:402,height:874,scale:3,statusBarHeight:59,homeIndicatorHeight:34,cornerRadius:58,dynamicIsland:{width:126,height:38},safeAreaInsets:{top:59,bottom:34,left:0,right:0},iosVersion:"26.4",physicalPPI:460,hardwareButtons:o}),"iphone-17-pro-max":t({name:"iPhone 17 Pro Max",width:440,height:956,scale:3,statusBarHeight:62,homeIndicatorHeight:34,cornerRadius:58,dynamicIsland:{width:126,height:38},safeAreaInsets:{top:62,bottom:34,left:0,right:0},iosVersion:"26.4",physicalPPI:460,hardwareButtons:o}),"ipad-pro-13":t({name:'iPad Pro 13"',width:1032,height:1376,scale:2,statusBarHeight:24,homeIndicatorHeight:20,cornerRadius:18,dynamicIsland:null,safeAreaInsets:{top:24,bottom:20,left:0,right:0},iosVersion:"18.2",physicalPPI:264,hardwareButtons:o}),"pixel-8":{platform:"android",name:"Pixel 8",width:412,height:915,scale:2.625,statusBarHeight:40,homeIndicatorHeight:0,navigationBarHeight:a,navigationBarMode:"gesture",displayCutout:{top:40,bottom:0,left:0,right:0},cornerRadius:39,dynamicIsland:null,cameraCutout:{diameter:24},safeAreaInsets:{top:40,bottom:a,left:0,right:0},osVersion:"15",iosVersion:"",androidApiLevel:35,systemName:"Android",manufacturer:"Google",brand:"google",modelName:"Pixel 8",physicalPPI:428,hardwareButtons:d},"pixel-8-three-button":{platform:"android",name:"Pixel 8 (3-button)",width:412,height:915,scale:2.625,statusBarHeight:40,homeIndicatorHeight:0,navigationBarHeight:48,navigationBarMode:"three-button",displayCutout:{top:40,bottom:0,left:0,right:0},cornerRadius:39,dynamicIsland:null,cameraCutout:{diameter:24},safeAreaInsets:{top:40,bottom:48,left:0,right:0},osVersion:"15",iosVersion:"",androidApiLevel:35,systemName:"Android",manufacturer:"Google",brand:"google",modelName:"Pixel 8",physicalPPI:428,hardwareButtons:d},"pixel-9-pro-xl":{platform:"android",name:"Pixel 9 Pro XL",width:448,height:997,scale:3,statusBarHeight:40,homeIndicatorHeight:0,navigationBarHeight:a,navigationBarMode:"gesture",displayCutout:{top:40,bottom:0,left:0,right:0},cornerRadius:41,dynamicIsland:null,cameraCutout:{diameter:24},safeAreaInsets:{top:40,bottom:a,left:0,right:0},osVersion:"15",iosVersion:"",androidApiLevel:35,systemName:"Android",manufacturer:"Google",brand:"google",modelName:"Pixel 9 Pro XL",physicalPPI:486,hardwareButtons:d},"galaxy-s24":{platform:"android",name:"Galaxy S24",width:360,height:780,scale:3,statusBarHeight:36,homeIndicatorHeight:0,navigationBarHeight:a,navigationBarMode:"gesture",displayCutout:{top:36,bottom:0,left:0,right:0},cornerRadius:36,dynamicIsland:null,cameraCutout:{diameter:18},safeAreaInsets:{top:36,bottom:a,left:0,right:0},osVersion:"15",iosVersion:"",androidApiLevel:35,systemName:"Android",manufacturer:"Samsung",brand:"samsung",modelName:"SM-S921B",physicalPPI:416,hardwareButtons:c},"galaxy-s24-ultra":{platform:"android",name:"Galaxy S24 Ultra",width:384,height:824,scale:3.75,statusBarHeight:36,homeIndicatorHeight:0,navigationBarHeight:a,navigationBarMode:"gesture",displayCutout:{top:36,bottom:0,left:0,right:0},cornerRadius:24,dynamicIsland:null,cameraCutout:{diameter:18},safeAreaInsets:{top:36,bottom:a,left:0,right:0},osVersion:"15",iosVersion:"",androidApiLevel:35,systemName:"Android",manufacturer:"Samsung",brand:"samsung",modelName:"SM-S928B",physicalPPI:505,hardwareButtons:c}},u="iphone-17-pro";function b(e){return h[e]}function g(){return Object.keys(h)}var n={"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"},"ipad-13":{name:"ipad-13",label:'iPad 13"',width:2064,height:2752,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"}},s={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"}]}},P={color:"#25c3ec",blur:120,spread:52,opacity:.34},S="iphone-17-pro";function v(e){return Object.prototype.hasOwnProperty.call(n,e)?n[e]:null}function f(e){return{type:e.type,color:e.color,direction:e.direction,glow:e.glow,stops:e.stops?.map(r=>({...r}))}}function B(e){return Object.prototype.hasOwnProperty.call(s,e)?f(s[e]):null}var p={deviceModel:{type:"enum",default:u,description:"device model to simulate",cliFlag:"device",cliFlagShort:"d",options:g(),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:e=>e>=.5&&e<=2},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"},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:"show simulator top bar",group:"simulator"},screenshotMode:{type:"boolean",default:!1,description:"show screenshot composition mode in the browser shell",group:"simulator"},threeMode:{type:"boolean",default:!1,description:"show the experimental 3d device stage in the browser shell",group:"simulator"},screenshotCanvas:{type:"enum",default:"iphone-6-9",description:"target app-store canvas preset for screenshot mode",options:Object.keys(n),group:"simulator"},screenshotBackground:{type:"enum",default:"dark",description:"background preset rendered inside the screenshot canvas",options:Object.keys(s),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"},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 y(){if(typeof window>"u")return{};let e={};try{let r=new URLSearchParams(window.location.search),i=r.get("device");i&&p.deviceModel.options?.includes(i)&&(e.deviceModel=i);let l=r.get("colorScheme")??r.get("theme");l&&p.colorScheme.options?.includes(l)&&(e.colorScheme=l)}catch{}return e}function H(){let e={};for(let[r,i]of Object.entries(p))e[r]=i.default;return Object.assign(e,y()),e}export{P as a,S as b,v as c,f as d,B as e,h as f,b as g,g as h,p as i,y as j,H as k};
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.39 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.41 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  function t(_){return`(async () => {
3
3
  const __t = window.__sootsimTest
4
4
  if (!__t) throw new Error('__sootsimTest not available')
@@ -1,3 +1,3 @@
1
- /*! sootsim v0.1.39 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{i as n}from"./chunk-7J4UIBA5.js";var i=[];for(let[t,e]of Object.entries(n))e.cliFlag&&i.push({name:`--${e.cliFlag}`,short:e.cliFlagShort?`-${e.cliFlagShort}`:void 0,key:t,type:e.type==="enum"?"string":e.type,description:e.description,options:e.options,default:e.default});var a=i;function g(){let t=[];for(let e of a){let s=e.short?`${e.short}, ${e.name}`:` ${e.name}`,o=e.options?` [${e.options.join("|")}]`:"",r=e.default!==void 0?` (default: ${e.default})`:"";t.push(` ${s.padEnd(24)}${e.description}${o}${r}`)}return t.join(`
1
+ /*! sootsim v0.1.41 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
+ import{i as n}from"./chunk-33R6QMNO.js";var i=[];for(let[t,e]of Object.entries(n))e.cliFlag&&i.push({name:`--${e.cliFlag}`,short:e.cliFlagShort?`-${e.cliFlagShort}`:void 0,key:t,type:e.type==="enum"?"string":e.type,description:e.description,options:e.options,default:e.default});var a=i;function g(){let t=[];for(let e of a){let s=e.short?`${e.short}, ${e.name}`:` ${e.name}`,o=e.options?` [${e.options.join("|")}]`:"",r=e.default!==void 0?` (default: ${e.default})`:"";t.push(` ${s.padEnd(24)}${e.description}${o}${r}`)}return t.join(`
3
3
  `)}export{g as a};
@@ -0,0 +1,17 @@
1
+ /*! sootsim v0.1.41 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
+ import{a as T,c as P,e as v}from"./chunk-SWHWVYZS.js";import{E as B,F as k}from"./chunk-J3JJRXIP.js";import{WebSocket as I}from"ws";function C(){let e=B();return e&&k(e)?e.bridgePort:7668}var w=class extends Error{lock;constructor(t,s){super(t),this.name="BridgeSimLockedError",this.lock=s}};function x(e){return e==="flag"?"via --sim":e==="saved"?"saved via `sootsim use`":"primary fallback \u2014 no sim pinned"}function $(e,t={}){let s=new Set,c=t.port??C(),l=t.commandTimeoutMs??15e3,d,u="none",p=new Set(t.stripBooleanFlags??[]),g=new Set(t.stripValueFlags??[]);for(let n=0;n<e.length;n++){let a=e[n];if(a==="--port"||a==="-p"){s.add(n),n+1<e.length&&(s.add(n+1),c=Number(e[n+1])),n++;continue}if(a.startsWith("--port=")){s.add(n),c=Number(a.slice(7));continue}if(a==="--timeout"){s.add(n),n+1<e.length&&(s.add(n+1),l=Number(e[n+1])),n++;continue}if(a==="--sim"){s.add(n),n+1<e.length&&(s.add(n+1),d=e[n+1]?.trim()||void 0,u="flag"),n++;continue}if(p.has(a)){s.add(n);continue}g.has(a)&&(s.add(n),n+1<e.length&&s.add(n+1),n++)}if(!d){let n=P();n&&(d=n.trim()||void 0,u="saved")}return{positional:e.filter((n,a)=>!s.has(a)),wsPort:c,simId:d,simIdSource:u,commandTimeoutMs:l}}function O(e,t={}){let s=1,c=t.commandTimeoutMs??15e3,l=new Map,d=new I(`ws://localhost:${e}`),u=t.simId?{key:`sim:${t.simId}`,source:"explicit-sim-id",stable:!0}:T(),p=new Promise((r,i)=>{d.on("open",()=>{try{d.send(JSON.stringify({type:"bridge:hello",id:0,cliIdentityKey:u.key,cliIdentitySource:u.source,cliLabel:t.cliLabel}))}catch{}r()}),d.on("error",o=>i(new Error(`could not connect to ws://localhost:${e}: ${o.message}`)))}),g=!1,n=!1;function a(r,i){if(n||process.env.SOOTSIM_QUIET_TARGET_NOTICE==="1"||r.startsWith("bridge:")||r==="focus"||r==="close")return;n=!0;let o=i??"primary",m=x(i?t.simIdSource:"none");process.stderr.write(` \u2192 ${o} (${m})
3
+ `)}return d.on("message",r=>{let i;try{i=JSON.parse(r.toString())}catch{return}if(i.id===0)return;let o=l.get(i.id);o&&(l.delete(i.id),i.i>0&&!g&&(g=!0,process.stderr.write(`
4
+ \u26A0 ${i.i} other CLI identity/identities are driving this sim
5
+ taps, scrolls, and keyboard input from multiple agents will collide on
6
+ the same screen state (this is not a bridge throughput limit).
7
+ use \`sootsim open --new\` for an isolated sim per agent.
8
+
9
+ `)),i.error?i.o?o.reject(new w(i.error,i.o)):o.reject(new Error(i.error)):o.resolve(i.result))}),d.on("close",(r,i)=>{let o=i?.toString()||"connection closed";for(let[m,y]of l)l.delete(m),y.reject(new Error(`sim disconnected: ${o} (code ${r})`))}),{async send(r){let i=async o=>{await p;let m=s++;return new Promise((y,h)=>{let S=setTimeout(()=>{l.delete(m),h(new Error(`command timed out after ${Math.round(c/1e3)}s`))},c);l.set(m,{resolve:b=>{clearTimeout(S),y(b)},reject:b=>{clearTimeout(S),h(b)}});let f={...r,id:m};f.simId===void 0&&o&&(f.simId=o),a(r.type??"",f.simId),d.send(JSON.stringify(f))})};try{return await i(t.simId)}catch(o){let m=o instanceof Error?o.message:String(o);if(t.fallbackOnMissingSimId&&t.simId&&r.simId===void 0&&m===`no sim connected with id ${t.simId}`)return v(),process.stderr.write(` \u26A0 saved sim ${t.simId} is gone \u2014 falling back to primary
10
+ pin a sim with: sootsim use <sim>
11
+ `),n=!1,i(void 0);throw o}},async listSims(){let r=await this.send({type:"bridge:list-sims"});return Array.isArray(r)?r:[]},async openUrl(r,i={}){return this.send({type:"bridge:open",url:r,newWindow:i.newWindow===!0})},async focusSim(r){return this.send({type:"focus",simId:r})},async closeSim(r){return this.send({type:"close",simId:r})},async claim(r,i={}){return await this.send({type:"bridge:claim",simId:r,force:i.force===!0})},close(){try{d.readyState===I.OPEN&&d.send(JSON.stringify({type:"bridge:bye",id:0}))}catch{}d.close();let r=setTimeout(()=>{d.readyState!==I.CLOSED&&d.terminate()},250)}}}function F(e){return O(e.wsPort,{commandTimeoutMs:e.commandTimeoutMs,simId:e.simId,fallbackOnMissingSimId:e.simIdSource==="saved",simIdSource:e.simIdSource})}async function N(e){try{return await e.send({type:"evaluate",code:"document.hidden"})===!0?(process.stderr.write(`
12
+ \u26A0 target sim is hidden (document.hidden = true)
13
+ animations and rAF callbacks are throttled \u2014 coordinates may be wrong
14
+ and launch/transition animations will not complete.
15
+ bring the sim to the foreground or use: sootsim debug eval "window.focus()"
16
+
17
+ `),{hidden:!0,warned:!0}):{hidden:!1,warned:!1}}catch{return{hidden:!1,warned:!1}}}async function R(e,t,s={}){let c={type:"evaluate",code:t};return s.acquireLock&&(c.acquireLock=!0),e.send(c)}async function _(e,t,...s){return e.send({type:"call",path:t,args:s})}async function D(e,t,...s){return e.send({type:"call",path:t,args:s,acquireLock:!0})}export{C as a,w as b,$ as c,O as d,F as e,N as f,R as g,_ as h,D as i};
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.39 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.41 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  import{execFileSync as h,spawn as g}from"child_process";import{existsSync as s,readdirSync as k}from"fs";import{dirname as m,join as l,resolve as a}from"path";import{fileURLToPath as v}from"url";var c;function p(){if(c!==void 0)return c;try{c=m(v(import.meta.resolve("sootsim-engine/package.json")))}catch{c=null}return c}var I="dev.sootsim.simulator";function x(){let n=p();if(!n)return null;let e=l(n,"dist-electron/main.cjs");if(!s(e))return null;let i=D(n);return i?{path:i,platform:process.platform,kind:"dev-electron",engineDir:n}:null}function b(){let n=p();return n?s(l(n,"src-electron/main.ts")):!1}function D(n){let e=n;for(let i=0;i<6;i++){let t=l(e,"node_modules/.bin/electron");if(s(t))return t;let r=m(e);if(r===e)break;e=r}return null}function C(){let n=p(),i=["/Applications/sootsim.app",a(process.env.HOME||"","Applications/sootsim.app"),...n?[a(n,"app/sootsim.app")]:[]].find(t=>s(t));if(i)return{path:i,platform:"darwin",kind:"mac-app"};try{let t=h("mdfind",[`kMDItemCFBundleIdentifier == "${I}"`],{encoding:"utf8",timeout:3e3}).trim();if(t)return{path:t.split(`
3
3
  `)[0],platform:"darwin",kind:"mac-app"}}catch{}return null}function f(n){if(!s(n))return null;let e=k(n).filter(i=>i.startsWith("sootsim")&&i.endsWith(".AppImage")).sort().reverse()[0];return e?l(n,e):null}function w(){let n=p(),i=[a(process.env.HOME||"","Applications/sootsim.AppImage"),a(process.env.HOME||"",".local/bin/sootsim.AppImage"),"/opt/sootsim/sootsim.AppImage","/opt/sootsim/sootsim",...n?[a(n,"app/sootsim.AppImage"),a(n,"release/linux-unpacked/sootsim")]:[]].find(r=>s(r));if(i)return{path:i,platform:"linux",kind:i.endsWith(".AppImage")?"linux-appimage":"linux-binary"};let t=n?f(a(n,"app"))||f(a(n,"release")):null;return t?{path:t,platform:"linux",kind:"linux-appimage"}:null}function A(){let n=x();if(n)return n;if(b()){let e=p(),i=l(e,"dist-electron/main.cjs");return s(i)?console.error(` no node_modules/.bin/electron found near ${e}. run \`bun install\`.`):console.error(` dist-electron/main.cjs missing in ${e}.
4
4
  run: bun run --cwd packages/sootsim-engine build:electron-main
@@ -1,3 +1,3 @@
1
- /*! sootsim v0.1.39 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{a as o}from"./chunk-UWRBEBML.js";import{l as s}from"./chunk-ECDPQ6S7.js";import{chmodSync as c,existsSync as a,mkdirSync as l,readFileSync as d,rmSync as p,writeFileSync as h}from"node:fs";import{dirname as g,join as f,resolve as k}from"node:path";function i(){return f(s(),"credentials.json")}function _(){let t=i();if(!a(t))return null;try{let e=JSON.parse(d(t,"utf8"));return e.version!==1||typeof e.apiKey!="string"||!e.apiKey.startsWith("sk_sootsim_")?null:e.apiKey}catch{return null}}function T(t){if(!t.startsWith("sk_sootsim_"))throw new Error("api key must start with sk_sootsim_");let e=i();l(g(k(e)),{recursive:!0}),h(e,JSON.stringify({version:1,apiKey:t,savedAt:new Date().toISOString()},null,2)+`
1
+ /*! sootsim v0.1.41 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
+ import{a as o}from"./chunk-S3SQITOO.js";import{l as s}from"./chunk-J3JJRXIP.js";import{chmodSync as c,existsSync as a,mkdirSync as l,readFileSync as d,rmSync as p,writeFileSync as h}from"node:fs";import{dirname as g,join as f,resolve as k}from"node:path";function i(){return f(s(),"credentials.json")}function _(){let t=i();if(!a(t))return null;try{let e=JSON.parse(d(t,"utf8"));return e.version!==1||typeof e.apiKey!="string"||!e.apiKey.startsWith("sk_sootsim_")?null:e.apiKey}catch{return null}}function T(t){if(!t.startsWith("sk_sootsim_"))throw new Error("api key must start with sk_sootsim_");let e=i();l(g(k(e)),{recursive:!0}),h(e,JSON.stringify({version:1,apiKey:t,savedAt:new Date().toISOString()},null,2)+`
3
3
  `);try{c(e,384)}catch{}}function K(){p(i(),{force:!0})}var m=["ghs_","ghp_","gho_","ghu_","github_pat_"];function y(t){return!!(t&&t.length>=20&&t.length<=256&&m.some(e=>t.startsWith(e)))}function S(){let t=process.env.SOOT_INSTALLATION_TOKEN?.trim(),e=process.env.GITHUB_TOKEN?.trim(),r=t||e;if(!y(r))return null;let n=(process.env.SOOT_REPO||process.env.GITHUB_REPOSITORY||"").trim();if(!n)return null;let u=(process.env.SOOT_INSTALLATION_ID||process.env.GITHUB_APP_INSTALLATION_ID||"").trim();return{kind:"github",token:r,repoId:n,installationId:u||null,source:t?"soot-runner":"github-actions"}}function b(){let t=process.env.SOOTSIM_API_KEY?.trim();if(t&&t.startsWith("sk_sootsim_"))return{kind:"api-key",secret:t,source:"env"};let e=S();if(e)return e;let r=_();if(r)return{kind:"api-key",secret:r,source:"file"};let n=o();return n?.token?{kind:"session",token:n.token,origin:n.origin}:null}function E(t){return t.kind==="api-key"?`Bearer ${t.secret}`:`Bearer ${t.token}`}export{_ as a,T as b,K as c,b as d,E as e};
@@ -0,0 +1,4 @@
1
+ /*! sootsim v0.1.41 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
+ import{createInterface as i}from"readline";var c=()=>i({input:process.stdin,output:process.stdout});function s(o){return new Promise(n=>{let r=c();r.question(o,t=>{r.close(),n(t.trim())})})}async function u(o,n=!0){let r=n?"[Y/n]":"[y/N]";if(!process.stdin.isTTY)return console.log(` ${o} ${r} ${n?"y":"n"} (non-interactive)`),n;let t=await s(` ${o} ${r} `);return t===""?n:t.toLowerCase().startsWith("y")}async function a(o,n){console.log(`
3
+ ${o}
4
+ `);for(let e=0;e<n.length;e++)console.log(` ${e+1}. ${n[e]}`);if(console.log(),!process.stdin.isTTY)return console.log(` choose [1-${n.length}]: 1 (non-interactive)`),0;let r=await s(` choose [1-${n.length}]: `),t=parseInt(r,10);return t>=1&&t<=n.length?t-1:0}export{u as a,a as b};
@@ -0,0 +1 @@
1
+ /*! sootsim v0.1.41 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
@@ -0,0 +1,11 @@
1
+ /*! sootsim v0.1.41 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
+ import{a as B,b as H,c as ne}from"./chunk-LX6KS6TL.js";import{b as T}from"./chunk-SHHUVGL2.js";import{g as se}from"./chunk-NZ5O2OEL.js";import{a as x,b as z}from"./chunk-7YZJHZ7X.js";import{c as re}from"./chunk-Q6DGMQ2V.js";import{d as oe}from"./chunk-C4AMFYK3.js";import{a as Y}from"./chunk-334L67M2.js";import{b as te,c as S,d as w,e as $}from"./chunk-6PLNIOJP.js";import{c as N,d as g,e as F}from"./chunk-SWHWVYZS.js";import{E as Z,F as ee}from"./chunk-J3JJRXIP.js";import xe from"node:fs";import Ce from"node:os";import j from"node:path";function ge(e){return e.replace(/^\[|\]$/g,"").toLowerCase()}function _(e){let t=ge(e);return t==="localhost"||t.endsWith(".localhost")||t==="0.0.0.0"||t==="::1"||/^127(?:\.\d{1,3}){3}$/.test(t)}function ie(e){return new Error(`could not resolve a native bundle for ${e}. pass an explicit bundle URL or open Connect and choose the app there.`)}function we(e,t){return e?.includes("/one/metro-entry.bundle")?"one":typeof t=="string"&&t?"expo":"unknown"}function ce(e,t,o){return`${e}//${t}:${o}`}function be(e){if(typeof window>"u")return!1;try{let t=new URL(e);return _(t.hostname)&&_(window.location.hostname)&&t.origin!==window.location.origin}catch{return!1}}async function ae(e,t){let o={...t,cache:t?.cache??"no-store"};return be(e)?fetch(`/__fetch-proxy?url=${encodeURIComponent(e)}`,o):fetch(e,o)}function ye(e){return e==="https:"?443:80}function Se(e){let t=e.pathname||"/";return(t==="/"||t==="")&&!e.search&&!e.hash}async function le(e,t){let o=e.replace(/\/+$/,"");try{let n=await ae(`${o}/`,{headers:{"expo-platform":"ios"}});if(n.ok){let r=await n.json(),s=r?.extra?.expoClient||r?.extra||{},i=typeof r?.launchAsset?.url=="string"?r.launchAsset.url:void 0;if(i||s.name)return{bundleUrl:ne(i||`${o}${H}`),port:t,framework:we(i,s.sdkVersion),projectName:s.name}}}catch{}try{let n=await ae(`${o}/status`);if(n.ok&&(await n.text()).includes("packager-status:running"))return{bundleUrl:`${o}${H}`,port:t,framework:"metro"}}catch{}return null}async function $e(e){return le(ce("http:","localhost",e),e)}async function q(e){let t=e.trim();if(/^\d+$/.test(t)){let a=parseInt(t,10),l=await $e(a);if(l)return l;throw ie(`localhost:${a}`)}let o=t.startsWith("http")?t:`http://${t}`,n;try{n=new URL(o)}catch{throw new Error(`could not parse "${e}". pass a dev-server port, a dev-server base URL, or a full bundle URL.`)}let r=n.protocol||"http:",s=n.port?parseInt(n.port,10):ye(r),i=ce(r,n.hostname,s);if(_(n.hostname)&&Se(n)){let a=await le(i,s);if(a)return a;throw ie(i)}return{bundleUrl:n.toString(),port:s,framework:"unknown"}}function je(){console.error(" no sootsim desktop companion found."),console.error(""),console.error(" install the desktop app:"),console.error(" sootsim install-desktop"),console.error(""),console.error(" or wire sootsim into your own project so your dev server hosts the bridge:"),console.error(" sootsim setup-repo"),console.error("")}function me(e){let t=x();if(console.log(` note: no sootsim bridge detected on port ${e}`),t){console.log(" launch the installed companion with:"),console.log(" sootsim electron");return}console.log(""),console.log(" to get a bridge running, either:"),console.log(" sootsim install-desktop # download the electron app"),console.log(" sootsim setup-repo # wire sootsim into your own project")}function ve(e){console.error(""),console.error(` no sim is connected to the sootsim bridge on port ${e}.`),console.error(""),console.error(" start your app dev server, then open it in sootsim:"),console.error(" npx expo start --localhost --port 8081"),console.error(" sootsim open 8081"),console.error(""),console.error(" then inspect the live app:"),console.error(" sootsim describe")}async function We(e,t,o){let n=[];try{n=await e.listSims()}catch{}if(console.error(""),n.length===0){ve(t);return}console.error(` no sim with id "${o}" is connected to the bridge on port ${t}.`),console.error(""),console.error(" connected sims:");for(let r of n){let s=[r.isPrimary?"primary":null,r.readyState].filter(Boolean).join(", ");console.error(` ${r.id} (${s})`)}console.error(""),console.error(" pass a valid --sim id, or run `sootsim list` to see all sessions.")}var Pe={rn:"/rn",connectrn:"/rn","connect-rn":"/rn",clock:"/app/clock","native-ui":"/app/native-ui",tamagui:"/app/tamagui",settings:"/app/settings",photos:"/app/photos",camera:"/app/camera"};function I(e){return new Promise(t=>setTimeout(t,e))}function G(e){return e.trim()}function W(e){try{let t=new URL(e),o=t.pathname.replace(/\/+$/,"")||"/";return t.searchParams.has("open")||t.searchParams.has("port")||t.searchParams.has("bundle")||t.searchParams.has("demo")||t.pathname.includes("/sootsim/index.html")||o==="/sootsim"||t.pathname==="/__soot"||t.pathname==="/__soot/"||o==="/rn"||/^\/rn\/[^/]+$/i.test(o)||/^\/app\/[^/]+$/i.test(o)||o==="/__soot/rn"||/^\/__soot\/rn\/[^/]+$/i.test(o)||/^\/__soot\/app\/[^/]+$/i.test(o)}catch{return!1}}async function co(e){let t=G(e);return(await q(t)).bundleUrl}function Q(e){let t=e.replace(/\/+$/,"")||"/";return t==="/__soot"||t.startsWith("/__soot/")?"/__soot":""}function Ie(e,t){let o=G(e),n=new URL(t),r=Q(n.pathname);return n.pathname=`${r}/rn`,n.searchParams.delete("bundle"),n.searchParams.delete("demo"),n.searchParams.delete("app"),n.searchParams.delete("open"),n.searchParams.delete("port"),/^\d+$/.test(o)?n.pathname=`${r}/rn/${o}`:(n.pathname=`${r}/rn`,n.searchParams.set("open",o)),n.toString()}function Ue(e){let t=G(e);return/^\d+$/.test(t)||/^https?:\/\//i.test(t)?!0:/^(localhost|127\.0\.0\.1|\[::1\]|[^/]+\.localhost):\d+(?:\/.*)?$/i.test(t)}async function ke(e,t){let o=await q(e),n=new URL(t),r=Q(n.pathname);return n.pathname=`${r}/rn`,n.searchParams.delete("open"),n.searchParams.delete("port"),n.searchParams.delete("demo"),n.searchParams.delete("app"),n.searchParams.set("bundle",o.bundleUrl),n.toString()}function Me(e){return e.startsWith("~/")?j.join(Ce.homedir(),e.slice(2)):j.isAbsolute(e)?e:j.resolve(process.cwd(),e)}function Te(e){let t={};for(let o=0;o<e.length;o++){if(e[o]!=="--replace")continue;let n=e[o+1];n||(console.error(" sootsim open: --replace expects <module>=<file>"),process.exit(1));let r=n.indexOf("=");(r<=0||r===n.length-1)&&(console.error(" sootsim open: --replace expects <module>=<file>"),process.exit(1));let s=n.slice(0,r).trim(),i=Me(n.slice(r+1).trim());xe.existsSync(i)||(console.error(` sootsim open: replacement file not found: ${i}`),process.exit(1)),t[s]={file:i},o++}return Object.keys(t).length>0?{modules:t}:void 0}function ue(){let e=Z();return ee(e)&&e.runtimePort>0?`http://localhost:${e.runtimePort}/`:Y}async function R(e,t=ue()){if(!e)return new URL(t).toString();if(W(e))return new URL(e).toString();let o=Pe[e.toLowerCase()];if(o){let n=new URL(t),r=Q(n.pathname);return n.pathname=`${r}${o}`,n.toString()}return Ue(e)?ke(e,t):Ie(e,t)}function de(e,t){let o=e?.url||e?.origin||t;try{let n=new URL(o);return n.searchParams.delete("bundle"),n.searchParams.delete("demo"),n.searchParams.delete("app"),n.searchParams.delete("open"),n.searchParams.delete("port"),n.searchParams.delete("inspectOpen"),n.toString()}catch{return t}}async function Be(e,t,o){let n=new URL(await R(e,t));return n.searchParams.set("inspectOpen",o),n.toString()}async function _e(e,t,o,n={}){let r=n.attempts??30,s=n.intervalMs??500,i=n.minNodeCount??10;for(let a=0;a<r;a++){let l=w(e,{commandTimeoutMs:t,simId:o,simIdSource:"flag"});try{let m=await l.send({type:"evaluate",code:"(async () => (await window.__sootsimTest?.getNodeCount()) || 0)()"});if(typeof m=="number"&&m>i)return{bridge:l,count:m}}catch{}l.close(),await I(s)}return null}function Oe(e){if(!e)return null;try{let t=new URL(e);if(t.searchParams.has("bundle")){let o=t.searchParams.get("bundle")||"";try{let n=new URL(o),r=n.pathname.length>36?`...${n.pathname.slice(-36)}`:n.pathname;return`bundle ${n.host}${r}`}catch{return"bundle"}}return t.searchParams.has("port")?`connect :${t.searchParams.get("port")||""}`:t.searchParams.has("open")?`connect ${t.searchParams.get("open")||""}`:t.searchParams.has("demo")?`demo ${t.searchParams.get("demo")||"default"}`:t.pathname.includes("/sootsim/index.html")||t.pathname==="/sootsim/"||t.pathname==="/sootsim"?"embedded sootsim":null}catch{return null}}function Re(e,t){if(e.length===0){console.log(" no sims connected");return}console.log(` connected sims (${e.length}):
3
+ `);for(let o of e){let n=o.lockedBy&&o.lockExpiresAt?`locked by ${o.lockedBy} (${Math.max(0,Math.round((o.lockExpiresAt-Date.now())/1e3))}s)`:"",r=[o.isPrimary?"primary":"",o.id===t?"selected":"",o.readyState,o.attachedCliCount&&o.attachedCliCount>0?"in use":"",o.userFocused?"focused":"",n].filter(Boolean);console.log(` ${o.id}${r.length?` [${r.join(", ")}]`:""}`);let s=Oe(o.url);if(s&&console.log(` loaded: ${s}`),o.url?console.log(` url: ${o.url}`):o.origin&&console.log(` origin: ${o.origin}`),o.title&&console.log(` title: ${o.title}`),console.log(` connected: ${new Date(o.connectedAt).toISOString()}`),o.lastActiveAt&&o.lastActiveAt>0){let i=Math.round((Date.now()-o.lastActiveAt)/1e3),a=i<60?`${i}s ago`:i<3600?`${Math.round(i/60)}m ago`:`${Math.round(i/3600)}h ago`;console.log(` last active: ${a}`)}}}async function O(e,t,o,n={}){let r=n.attempts??30,s=n.intervalMs??500;for(let i=0;i<r;i++){let a=w(e,{commandTimeoutMs:t});try{let m=(await a.listSims()).find(o);if(m)return m}catch{}finally{a.close()}await I(s)}return null}async function Le(e,t,o,n={}){let r=n.attempts??20,s=n.intervalMs??250;for(let i=0;i<r;i++){let a=w(e,{commandTimeoutMs:t});try{let m=(await a.listSims()).find(b=>b.id===o);if(!m||m.readyState!=="open")return!0}catch{return!0}finally{a.close()}await I(s)}return!1}function L(e,t){if(t){let r=t.trim(),s=e.find(i=>i.id===r);if(!s)throw new Error(`no sim connected with id ${r}`);return s}let o=e.find(r=>r.isPrimary&&r.readyState==="open");if(o)return o;let n=e.find(r=>r.readyState==="open");if(n)return n;throw new Error("no sim connected")}function C(e,t,o){console.log(` ${o==="current sim"?"loaded":"opened"}: ${e} [${o}]`),console.log(` current sim: ${t.id}`),console.log(JSON.stringify({simId:t.id,url:t.url},null,2))}async function P(e,t,o){if(o.includes("--no-describe"))return;let n=process.env.SOOTSIM_QUIET_TARGET_NOTICE;process.env.SOOTSIM_QUIET_TARGET_NOTICE="1";try{await Ee(e,t,{stableMs:150,maxMs:400});let r=w(e,{commandTimeoutMs:3e3,simId:t,cliLabel:"open --describe",simIdSource:"flag"});try{let i=`(async () => {
4
+ const t = window.__sootsimTest
5
+ const ms = window.SootSim?.bridges?.mainShell
6
+ if (!t) return null
7
+ let shell = null
8
+ try { shell = ms?.getState ? await ms.getState() : null } catch {}
9
+ const tree = await t.dumpTree(12, ${JSON.stringify({describe:!0,verbose:!1,filter:""})})
10
+ return { tree, shell }
11
+ })()`,a=await r.send({type:"evaluate",code:i});if(!a?.tree)return;if(console.log(""),a.shell?.state){let l=[`state=${a.shell.state}`,a.shell.activeApp?`app=${a.shell.activeApp}`:null].filter(Boolean);console.log(` shell: ${l.join(" ")}`)}console.log(a.tree)}finally{r.close()}}catch{}finally{n===void 0?delete process.env.SOOTSIM_QUIET_TARGET_NOTICE:process.env.SOOTSIM_QUIET_TARGET_NOTICE=n}}async function Ee(e,t,o){let n=Date.now()+o.maxMs,r="(async () => (await window.__sootsimTest?.getNodeCount?.()) || 0)()",s=w(e,{commandTimeoutMs:2e3,simId:t,simIdSource:"flag"});try{let i=-1,a=0;for(;Date.now()<n;){let l=-1;try{let m=await s.send({type:"evaluate",code:r});typeof m=="number"&&(l=m)}catch{}if(l>=0&&l===i){if(Date.now()-a>=o.stableMs)return}else i=l,a=Date.now();await I(50)}}finally{s.close()}}async function lo(e,t={}){let o=S(e,{port:t.port,commandTimeoutMs:t.timeoutMs}),n=$(o);try{let r=await n.listSims();Re(r,o.simId)}finally{n.close()}}async function mo(e,t={}){let o=S(e,{port:t.port,commandTimeoutMs:t.timeoutMs,stripBooleanFlags:["--new","--headless","--ephemeral"],stripValueFlags:["--base-url","--replace","--driver","--profile"]}),n=e.find((c,d)=>e[d-1]==="--profile"),r=e.includes("--ephemeral");n&&r&&(console.error(" sootsim open: --profile cannot be combined with --ephemeral"),process.exit(1));let s=n?re(n).id:void 0,i=!!s||r,a=e.includes("--new")||i,l=Te(e);a&&o.simIdSource==="flag"&&(console.error(" sootsim open: --new, --profile, and --ephemeral cannot be combined with --sim"),process.exit(1));let m=o.positional[0]||"",b=e.find((c,d)=>e[d-1]==="--driver")||"",fe=e.includes("--headless"),v=e.find((c,d)=>e[d-1]==="--base-url")||ue(),J=e.includes("--base-url"),K=N();if(!a&&(o.simIdSource==="flag"||o.simIdSource==="saved"&&!!K)){let c=$(o),d=o.simId?` --sim ${o.simId}`:"",u=!1;try{let p=null;try{let h=await c.listSims();if(o.simIdSource==="saved"?(p=h.find(y=>y.id===K&&y.readyState==="open")??null,p||F()):p=L(h,o.simId),!p)if(o.simIdSource==="saved")u=!0;else throw new Error("no sim connected");if(!u&&p){let y=J||W(m)?v:de(p,v),M=await R(m,B(y,l));c.send({type:"evaluate",simId:p.id,code:`window.location.href = ${JSON.stringify(M)}`}).catch(()=>{})}}catch(h){console.error(` open failed: ${h instanceof Error?h.message:String(h)}`),await T(c,{errorsCommand:`sootsim get errors 5${d}`,warningsCommand:`sootsim get warnings 5${d}`,requestsCommand:`sootsim get requests 5${d}`}),process.exit(1)}if(!u&&p){await I(1500);let h=await _e(o.wsPort,o.commandTimeoutMs,p.id);h||(console.error(" timed out waiting for current sim to load target"),process.exit(1)),h.bridge.close(),g(p.id);let y=J||W(m)?v:de(p,v),M=await R(m,B(y,l));C(M,{...p,url:M},"current sim"),await P(o.wsPort,p.id,e);return}}finally{c.close()}}let V=B(v,l),he=await R(m,V),X=`cli-${Date.now().toString(36)}-${Math.random().toString(36).slice(2,8)}`,f=await Be(m,V,X),E={newWindow:!0},U=c=>c.url?.includes(`inspectOpen=${X}`)??!1;if(b){let c=se(b);c||(console.error(` unknown driver "${b}" \u2014 run \`sootsim list --drivers\``),process.exit(1));let d=await c.launch({url:f,headless:fe,newWindow:E.newWindow,profileId:s,ephemeralProfile:r});d.launched||(console.error(` ${c.name} driver: ${d.message}`),process.exit(1));let u=await O(o.wsPort,o.commandTimeoutMs,U,{attempts:60,intervalMs:500});u||(console.error(" timed out waiting for opened sim to connect"),process.exit(1)),g(u.id),C(f,u,`${c.name} driver`),await P(o.wsPort,u.id,e);return}if(i){let c=x();c||(console.error(" profiles require electron or playwright; install the desktop companion or use `--driver playwright`"),process.exit(1));try{(await z(f,c,{profileId:s,ephemeralProfile:r})).launched||(console.error(" desktop companion failed to start"),process.exit(1))}catch(u){console.error(` desktop companion failed: ${u instanceof Error?u.message:String(u)}`),process.exit(1)}let d=await O(o.wsPort,o.commandTimeoutMs,U,{attempts:40,intervalMs:500});d||(console.error(" timed out waiting for profiled sim to connect"),process.exit(1)),g(d.id),C(f,d,"desktop companion"),await P(o.wsPort,d.id,e);return}let D=!1,A=!1;try{let c=w(o.wsPort,{commandTimeoutMs:2e3});try{await c.listSims(),D=!0}finally{c.close()}}catch{}if(D)try{let c=w(o.wsPort,{commandTimeoutMs:3e3});try{await c.openUrl(f,E),A=!0}finally{c.close()}}catch{}if(!A){let c=x();if(c)try{if((await z(f,c)).launched){let u=await O(o.wsPort,o.commandTimeoutMs,U,{attempts:20,intervalMs:500});if(u){g(u.id),C(f,u,"desktop companion"),await P(o.wsPort,u.id,e);return}}}catch{}if(await oe(f,E),!D){console.log(` opened: ${he}`),me(o.wsPort);return}}let k=await O(o.wsPort,o.commandTimeoutMs,U,{attempts:30,intervalMs:500});k||(console.error(" timed out waiting for opened sim to connect"),process.exit(1)),g(k.id),C(f,k,A?"bridge":"direct shell open"),await P(o.wsPort,k.id,e)}async function pe(e,t={}){let o=S(e,{port:t.port,commandTimeoutMs:t.timeoutMs}),n=$(o),r=o.simId?` --sim ${o.simId}`:"";try{try{let s=await n.listSims(),i=L(s,o.positional[0]||o.simId);await n.focusSim(i.id),g(i.id),console.log(` using: ${i.id}`)}catch(s){console.error(` use failed: ${s instanceof Error?s.message:String(s)}`),await T(n,{errorsCommand:`sootsim get errors 5${r}`,warningsCommand:`sootsim get warnings 5${r}`,requestsCommand:`sootsim get requests 5${r}`}),process.exit(1)}}finally{n.close()}}async function uo(e,t={}){await pe(e,t)}async function po(e,t={}){await pe(e,t)}async function fo(e,t={}){let o=S(e,{port:t.port,commandTimeoutMs:t.timeoutMs,stripBooleanFlags:["--force"]}),n=e.includes("--force"),r=$(o);try{try{let s=await r.listSims(),i=L(s,o.positional[0]||o.simId),a=n&&i.lockedBy&&i.lockedByKind!=="user-active"?i.lockedBy:null,l=await r.claim(i.id,{force:n});g(i.id);let m=Math.max(0,Math.round((l.lockExpiresAt-Date.now())/1e3)),b=l.bootedCount>0?` (booted ${l.bootedCount})`:"";console.log(` claimed: ${l.simId} [${m}s]${b}`),a&&console.log(` took over from: ${a}`)}catch(s){if(s instanceof te){let i=Math.max(0,Math.round(s.lock.expiresInMs/1e3));console.error(` claim failed: locked by ${s.lock.by} for ${i}s more`),console.error(" use --force to take it, or `sootsim open --new` for a fresh sim"),process.exit(1)}console.error(` claim failed: ${s instanceof Error?s.message:String(s)}`),process.exit(1)}}finally{r.close()}}async function ho(e,t={}){let o=S(e,{port:t.port,commandTimeoutMs:t.timeoutMs}),n=$(o),r=o.simId?` --sim ${o.simId}`:"";try{try{let s=await n.listSims(),i=L(s,o.positional[0]||o.simId),a=s.find(m=>m.id!==i.id&&m.readyState==="open");if(await n.closeSim(i.id),!await Le(o.wsPort,o.commandTimeoutMs,i.id)){console.log(` close requested: ${i.id} (still connected)`);return}N()===i.id&&(a?g(a.id):F()),console.log(` closed: ${i.id}`)}catch(s){console.error(` close failed: ${s instanceof Error?s.message:String(s)}`),await T(n,{errorsCommand:`sootsim get errors 5${r}`,warningsCommand:`sootsim get warnings 5${r}`,requestsCommand:`sootsim get requests 5${r}`}),process.exit(1)}}finally{n.close()}}export{je as a,ve as b,We as c,co as d,ue as e,R as f,Be as g,Oe as h,Re as i,O as j,lo as k,mo as l,uo as m,po as n,fo as o,ho as p};
@@ -1,2 +1,2 @@
1
- /*! sootsim v0.1.39 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{execFileSync as p,spawn as l}from"child_process";import{existsSync as a}from"fs";import{homedir as u}from"os";import{join as d}from"path";var g=["/Applications/Google Chrome.app/Contents/MacOS/Google Chrome","~/Applications/Google Chrome.app/Contents/MacOS/Google Chrome","/Applications/Chromium.app/Contents/MacOS/Chromium","~/Applications/Chromium.app/Contents/MacOS/Chromium","/Applications/Microsoft Edge.app/Contents/MacOS/Microsoft Edge","~/Applications/Microsoft Edge.app/Contents/MacOS/Microsoft Edge","/Applications/Brave Browser.app/Contents/MacOS/Brave Browser","~/Applications/Brave Browser.app/Contents/MacOS/Brave Browser","/Applications/Arc.app/Contents/MacOS/Arc","~/Applications/Arc.app/Contents/MacOS/Arc"],h=["/usr/bin/google-chrome","/usr/bin/chromium","/usr/bin/chromium-browser","/usr/bin/microsoft-edge","/usr/bin/brave-browser","/snap/bin/chromium"],f=["C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe","C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe","C:\\Program Files\\Microsoft\\Edge\\Application\\msedge.exe","C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\msedge.exe","C:\\Program Files\\BraveSoftware\\Brave-Browser\\Application\\brave.exe","C:\\Program Files (x86)\\BraveSoftware\\Brave-Browser\\Application\\brave.exe"],C=["google-chrome","chromium","chromium-browser","microsoft-edge","brave-browser"],O=["chrome","msedge","brave"];function w(r){return r.startsWith("~/")?d(u(),r.slice(2)):r}function s(r){for(let n of r){let o=w(n);if(a(o))return o}return null}function U(r,n){try{let e=p(n==="win32"?"where":"which",[r],{encoding:"utf8",timeout:1500,stdio:["ignore","pipe","ignore"]}).trim();return e?e.split(/\r?\n/)[0]:null}catch{return null}}function M(r=process.platform){let n=process.env.CHROME_PATH||process.env.CHROMIUM_PATH;if(n&&a(n))return n;let o=s(r==="darwin"?g:r==="win32"?f:h);if(o)return o;let e=r==="win32"?O:C;for(let t of e){let i=U(t,r);if(i)return i}return null}function A(r,n={}){if(!r)throw new Error("openUrl requires a url");let o=n.platform??process.platform;return n.newWindow?m(r,{...n,platform:o,newWindow:!0}):o==="darwin"?{command:"open",args:n.background===!1?[r]:["-g",r],via:"system"}:o==="win32"?{command:"cmd",args:["/c","start","",r],via:"system"}:{command:"xdg-open",args:[r],via:"system"}}function m(r,n={}){if(!r)throw new Error("openUrl requires a url");let o=n.platform??process.platform,e="chromiumBinary"in n?n.chromiumBinary:M(o);if(!e)throw new Error("browser launch requires Chrome, Chromium, Edge, Brave, or Arc");let t=[];return n.headless?t.push("--headless=new"):n.newWindow!==!1&&t.push("--new-window"),t.push(r),{command:e,args:t,via:"chromium",target:e}}async function c(r,n,o){return new Promise((e,t)=>{let i=l(r,n,{detached:o,stdio:"ignore"});i.once("error",t),i.once("spawn",()=>{o&&i.unref(),e(i.pid)})})}async function x(r,n={}){let o=A(r,n),e=await c(o.command,o.args,n.detached??!0);return{...o,pid:e,attachUrl:r}}async function y(r,n={}){let o=m(r,n),e=await c(o.command,o.args,n.detached??!0);return{...o,pid:e,attachUrl:r}}async function E(r,n={}){await x(r,n)}export{M as a,x as b,y as c,E as d};
1
+ /*! sootsim v0.1.41 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
+ import{execFileSync as p,spawn as l}from"child_process";import{existsSync as s}from"fs";import{homedir as u}from"os";import{join as d}from"path";var g=["/Applications/Google Chrome.app/Contents/MacOS/Google Chrome","~/Applications/Google Chrome.app/Contents/MacOS/Google Chrome","/Applications/Chromium.app/Contents/MacOS/Chromium","~/Applications/Chromium.app/Contents/MacOS/Chromium","/Applications/Microsoft Edge.app/Contents/MacOS/Microsoft Edge","~/Applications/Microsoft Edge.app/Contents/MacOS/Microsoft Edge","/Applications/Brave Browser.app/Contents/MacOS/Brave Browser","~/Applications/Brave Browser.app/Contents/MacOS/Brave Browser","/Applications/Arc.app/Contents/MacOS/Arc","~/Applications/Arc.app/Contents/MacOS/Arc"],f=["/usr/bin/google-chrome","/usr/bin/chromium","/usr/bin/chromium-browser","/usr/bin/microsoft-edge","/usr/bin/brave-browser","/snap/bin/chromium"],h=["C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe","C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe","C:\\Program Files\\Microsoft\\Edge\\Application\\msedge.exe","C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\msedge.exe","C:\\Program Files\\BraveSoftware\\Brave-Browser\\Application\\brave.exe","C:\\Program Files (x86)\\BraveSoftware\\Brave-Browser\\Application\\brave.exe"],C=["google-chrome","chromium","chromium-browser","microsoft-edge","brave-browser"],O=["chrome","msedge","brave"];function w(r){return r.startsWith("~/")?d(u(),r.slice(2)):r}function a(r){for(let n of r){let o=w(n);if(s(o))return o}return null}function U(r,n){try{let e=p(n==="win32"?"where":"which",[r],{encoding:"utf8",timeout:1500,stdio:["ignore","pipe","ignore"]}).trim();return e?e.split(/\r?\n/)[0]:null}catch{return null}}function M(r=process.platform){let n=process.env.CHROME_PATH||process.env.CHROMIUM_PATH;if(n&&s(n))return n;let o=a(r==="darwin"?g:r==="win32"?h:f);if(o)return o;let e=r==="win32"?O:C;for(let t of e){let i=U(t,r);if(i)return i}return null}function A(r,n={}){if(!r)throw new Error("openUrl requires a url");let o=n.platform??process.platform;return n.newWindow?c(r,{...n,platform:o,newWindow:!0}):o==="darwin"?{command:"open",args:n.background===!1?[r]:["-g",r],via:"system"}:o==="win32"?{command:"cmd",args:["/c","start","",r],via:"system"}:{command:"xdg-open",args:[r],via:"system"}}function c(r,n={}){if(!r)throw new Error("openUrl requires a url");let o=n.platform??process.platform,e="chromiumBinary"in n?n.chromiumBinary:M(o);if(!e)throw new Error("browser launch requires Chrome, Chromium, Edge, Brave, or Arc");let t=[];return n.newWindow!==!1&&t.push("--new-window"),t.push(r),{command:e,args:t,via:"chromium",target:e}}async function m(r,n,o){return new Promise((e,t)=>{let i=l(r,n,{detached:o,stdio:"ignore"});i.once("error",t),i.once("spawn",()=>{o&&i.unref(),e(i.pid)})})}async function x(r,n={}){let o=A(r,n),e=await m(o.command,o.args,n.detached??!0);return{...o,pid:e,attachUrl:r}}async function y(r,n={}){let o=c(r,n),e=await m(o.command,o.args,n.detached??!0);return{...o,pid:e,attachUrl:r}}async function E(r,n={}){await x(r,n)}export{M as a,x as b,y as c,E as d};
@@ -1,5 +1,5 @@
1
- /*! sootsim v0.1.39 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{c as l,e as d,h as c}from"./chunk-HWRR23AJ.js";function g(n){let e=n[0]?.toLowerCase()??"toggle";return e!=="on"&&e!=="off"&&e!=="toggle"&&(console.error(` unknown argument: "${e}" (expected on | off | toggle)`),process.exit(1)),e}async function u(n,e,o){let s=l(n,{port:e.port}),a=g(s.positional),r=d({...s,commandTimeoutMs:5e3});try{let i=!!(await c(r,"SootSim.bridges.settings.get"))?.[o.modeKey],t=a==="on"?!0:a==="off"?!1:!i;if(i===t){console.log(` ${o.displayName}: already ${t?"on":"off"}`);return}if(!await r.send({type:"evaluate",acquireLock:!0,code:`(async () => {
1
+ /*! sootsim v0.1.41 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
+ import{c as l,e as d,h as c}from"./chunk-6PLNIOJP.js";function g(n){let e=n[0]?.toLowerCase()??"toggle";return e!=="on"&&e!=="off"&&e!=="toggle"&&(console.error(` unknown argument: "${e}" (expected on | off | toggle)`),process.exit(1)),e}async function u(n,e,o){let s=l(n,{port:e.port}),a=g(s.positional),r=d({...s,commandTimeoutMs:5e3});try{let i=!!(await c(r,"SootSim.bridges.settings.get"))?.[o.modeKey],t=a==="on"?!0:a==="off"?!1:!i;if(i===t){console.log(` ${o.displayName}: already ${t?"on":"off"}`);return}if(!await r.send({type:"evaluate",acquireLock:!0,code:`(async () => {
3
3
  const modeKey = ${JSON.stringify(o.modeKey)}
4
4
  const target = ${JSON.stringify(t)}
5
5
  window.dispatchEvent(new CustomEvent('sootsim:shell-command', {
@@ -1,5 +1,5 @@
1
- /*! sootsim v0.1.39 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{a as L}from"./chunk-WD54RD4K.js";import{existsSync as o,readFileSync as p,writeFileSync as d}from"node:fs";import{homedir as j}from"node:os";import{dirname as $,join as s,resolve as P}from"node:path";var _=j();function Q(e){let t=e;for(;;){if(o(s(t,"pnpm-workspace.yaml"))||o(s(t,"turbo.json"))||o(s(t,"nx.json"))||o(s(t,"lerna.json")))return t;let r=s(t,"package.json");if(o(r))try{if(JSON.parse(p(r,"utf8")).workspaces)return t}catch{}let n=$(t);if(n===t)return null;t=n}}function S(e,t){let r=Q(process.cwd()),n=[r?P(r,e):null,P(process.cwd(),e),P(process.cwd(),t)].filter(a=>!!a);for(let a of n)if(o(a))return a;return n[0]??P(process.cwd(),e)}var X=()=>S("packages/sootsim-engine/scripts/expensify-web-proxy.ts","scripts/expensify-web-proxy.ts"),z=()=>S("packages/sootsim-engine/scripts/rainbow-metadata-proxy.ts","scripts/rainbow-metadata-proxy.ts"),Z=()=>S("packages/compat/src/stubs/mattermost-rnutils-native.ts","../compat/src/stubs/mattermost-rnutils-native.ts"),ee=()=>S("packages/compat/src/stubs/native-seams/react-native-keychain-manager.ts","../compat/src/stubs/native-seams/react-native-keychain-manager.ts"),v=()=>S("packages/compat/src/stubs/mattermost-network-client-native.ts","../compat/src/stubs/mattermost-network-client-native.ts"),D={USE_NGROK:"true",NGROK_URL:"http://localhost:9000/",SECURE_NGROK_URL:"http://localhost:9000/"},te=s(_,"github/mattermost-mobile"),I=s(_,"github/uniswap-interface"),ne=s(I,"apps/mobile"),T=s(I,".env.defaults.local"),re="stored-in-.env.local",W="# sootsim demo env overrides",se=s(I,"packages/uniswap/src/features/forceUpgrade/hooks/useForceUpgradeStatus.ts"),oe=s(I,"apps/mobile/src/notification-service/data-sources/createForceUpgradeNotificationDataSource.ts"),M="SOOTSIM_DEMO_DISABLE_FORCE_UPGRADE";function B(e){if(!o(e))return{};let t={},r=p(e,"utf8");for(let n of r.split(/\r?\n/)){let a=n.trim();if(!a||a.startsWith("#"))continue;let u=a.match(/^([A-Za-z_][A-Za-z0-9_]*)\s*=\s*(.*)$/);if(!u)continue;let i=u[2].trim();(i.startsWith('"')&&i.endsWith('"')||i.startsWith("'")&&i.endsWith("'"))&&(i=i.slice(1,-1)),t[u[1]]=i}return t}function k(e){if(!e)return!1;let t=e.trim();return!(!t||t.includes(re)||t==="TRADING_API_KEY"||t==="UNISWAP_API_KEY")}function Y(e,t){for(let r of e)for(let n of t){let a=r[n];if(k(a))return a.trim()}}function J(){let e=B(T),t=B(s(I,"apps/web/.env")),r=[process.env,e,t],n={},a=[["AMPLITUDE_PROXY_URL_OVERRIDE",["REACT_APP_AMPLITUDE_PROXY_URL"]],["QUICKNODE_ENDPOINT_NAME",["REACT_APP_QUICKNODE_ENDPOINT_NAME"]],["QUICKNODE_ENDPOINT_TOKEN",["REACT_APP_QUICKNODE_ENDPOINT_TOKEN"]],["INFURA_KEY",["REACT_APP_INFURA_KEY"]],["STATSIG_API_KEY",["REACT_APP_STATSIG_API_KEY"]],["STATSIG_PROXY_URL_OVERRIDE",["REACT_APP_STATSIG_PROXY_URL"]],["WALLETCONNECT_PROJECT_ID",["REACT_APP_WALLET_CONNECT_PROJECT_ID"]],["WALLETCONNECT_PROJECT_ID_BETA",["REACT_APP_WALLET_CONNECT_PROJECT_ID"]],["WALLETCONNECT_PROJECT_ID_DEV",["REACT_APP_WALLET_CONNECT_PROJECT_ID"]],["TRADING_API_KEY",["REACT_APP_TRADING_API_KEY"]],["UNISWAP_API_KEY",[]]];for(let[i,l]of a){let R=Y(r,[i,...l]);if(R){n[i]=R;for(let m of l)n[m]=R}}if(!(k(n.TRADING_API_KEY)&&k(n.UNISWAP_API_KEY))){let i=Y(r,["GRAPHQL_URL_OVERRIDE","REACT_APP_AWS_API_ENDPOINT"])||"https://interface.gateway.uniswap.org/v1/graphql";n.API_BASE_URL_OVERRIDE="https://interface.gateway.uniswap.org",n.API_BASE_URL_V2_OVERRIDE="https://interface.gateway.uniswap.org/v2",n.GRAPHQL_URL_OVERRIDE=i,n.TRADING_API_URL_OVERRIDE="https://trading-api-labs.interface.gateway.uniswap.org",n.FOR_API_URL_OVERRIDE="https://for.interface.gateway.uniswap.org/v2/FOR.v1.FORService"}return n}function ae(){let e=o(T)?p(T,"utf8"):"";if(e&&!e.includes(W))return;let t=J(),r=[W];for(let[n,a]of Object.entries(t).sort(([u],[i])=>u.localeCompare(i)))r.push(`${n}=${JSON.stringify(a)}`);r.push(""),d(T,`${r.join(`
1
+ /*! sootsim v0.1.41 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
+ import{a as L}from"./chunk-N7DDNZTO.js";import{existsSync as o,readFileSync as p,writeFileSync as d}from"node:fs";import{homedir as j}from"node:os";import{dirname as $,join as s,resolve as P}from"node:path";var _=j();function Q(e){let t=e;for(;;){if(o(s(t,"pnpm-workspace.yaml"))||o(s(t,"turbo.json"))||o(s(t,"nx.json"))||o(s(t,"lerna.json")))return t;let r=s(t,"package.json");if(o(r))try{if(JSON.parse(p(r,"utf8")).workspaces)return t}catch{}let n=$(t);if(n===t)return null;t=n}}function S(e,t){let r=Q(process.cwd()),n=[r?P(r,e):null,P(process.cwd(),e),P(process.cwd(),t)].filter(a=>!!a);for(let a of n)if(o(a))return a;return n[0]??P(process.cwd(),e)}var X=()=>S("packages/sootsim-engine/scripts/expensify-web-proxy.ts","scripts/expensify-web-proxy.ts"),z=()=>S("packages/sootsim-engine/scripts/rainbow-metadata-proxy.ts","scripts/rainbow-metadata-proxy.ts"),Z=()=>S("packages/compat/src/stubs/mattermost-rnutils-native.ts","../compat/src/stubs/mattermost-rnutils-native.ts"),ee=()=>S("packages/compat/src/stubs/native-seams/react-native-keychain-manager.ts","../compat/src/stubs/native-seams/react-native-keychain-manager.ts"),v=()=>S("packages/compat/src/stubs/mattermost-network-client-native.ts","../compat/src/stubs/mattermost-network-client-native.ts"),D={USE_NGROK:"true",NGROK_URL:"http://localhost:9000/",SECURE_NGROK_URL:"http://localhost:9000/"},te=s(_,"github/mattermost-mobile"),I=s(_,"github/uniswap-interface"),ne=s(I,"apps/mobile"),T=s(I,".env.defaults.local"),re="stored-in-.env.local",W="# sootsim demo env overrides",se=s(I,"packages/uniswap/src/features/forceUpgrade/hooks/useForceUpgradeStatus.ts"),oe=s(I,"apps/mobile/src/notification-service/data-sources/createForceUpgradeNotificationDataSource.ts"),M="SOOTSIM_DEMO_DISABLE_FORCE_UPGRADE";function B(e){if(!o(e))return{};let t={},r=p(e,"utf8");for(let n of r.split(/\r?\n/)){let a=n.trim();if(!a||a.startsWith("#"))continue;let u=a.match(/^([A-Za-z_][A-Za-z0-9_]*)\s*=\s*(.*)$/);if(!u)continue;let i=u[2].trim();(i.startsWith('"')&&i.endsWith('"')||i.startsWith("'")&&i.endsWith("'"))&&(i=i.slice(1,-1)),t[u[1]]=i}return t}function k(e){if(!e)return!1;let t=e.trim();return!(!t||t.includes(re)||t==="TRADING_API_KEY"||t==="UNISWAP_API_KEY")}function Y(e,t){for(let r of e)for(let n of t){let a=r[n];if(k(a))return a.trim()}}function J(){let e=B(T),t=B(s(I,"apps/web/.env")),r=[process.env,e,t],n={},a=[["AMPLITUDE_PROXY_URL_OVERRIDE",["REACT_APP_AMPLITUDE_PROXY_URL"]],["QUICKNODE_ENDPOINT_NAME",["REACT_APP_QUICKNODE_ENDPOINT_NAME"]],["QUICKNODE_ENDPOINT_TOKEN",["REACT_APP_QUICKNODE_ENDPOINT_TOKEN"]],["INFURA_KEY",["REACT_APP_INFURA_KEY"]],["STATSIG_API_KEY",["REACT_APP_STATSIG_API_KEY"]],["STATSIG_PROXY_URL_OVERRIDE",["REACT_APP_STATSIG_PROXY_URL"]],["WALLETCONNECT_PROJECT_ID",["REACT_APP_WALLET_CONNECT_PROJECT_ID"]],["WALLETCONNECT_PROJECT_ID_BETA",["REACT_APP_WALLET_CONNECT_PROJECT_ID"]],["WALLETCONNECT_PROJECT_ID_DEV",["REACT_APP_WALLET_CONNECT_PROJECT_ID"]],["TRADING_API_KEY",["REACT_APP_TRADING_API_KEY"]],["UNISWAP_API_KEY",[]]];for(let[i,l]of a){let R=Y(r,[i,...l]);if(R){n[i]=R;for(let m of l)n[m]=R}}if(!(k(n.TRADING_API_KEY)&&k(n.UNISWAP_API_KEY))){let i=Y(r,["GRAPHQL_URL_OVERRIDE","REACT_APP_AWS_API_ENDPOINT"])||"https://interface.gateway.uniswap.org/v1/graphql";n.API_BASE_URL_OVERRIDE="https://interface.gateway.uniswap.org",n.API_BASE_URL_V2_OVERRIDE="https://interface.gateway.uniswap.org/v2",n.GRAPHQL_URL_OVERRIDE=i,n.TRADING_API_URL_OVERRIDE="https://trading-api-labs.interface.gateway.uniswap.org",n.FOR_API_URL_OVERRIDE="https://for.interface.gateway.uniswap.org/v2/FOR.v1.FORService"}return n}function ae(){let e=o(T)?p(T,"utf8"):"";if(e&&!e.includes(W))return;let t=J(),r=[W];for(let[n,a]of Object.entries(t).sort(([u],[i])=>u.localeCompare(i)))r.push(`${n}=${JSON.stringify(a)}`);r.push(""),d(T,`${r.join(`
3
3
  `)}
4
4
  `)}function ie(){let e=`export function useForceUpgradeStatus(): ForceUpgradeStatus {
5
5
  `,t=` // sootsim demo: bypass the force-upgrade gate during local engine demos.