sootsim 0.1.93 → 0.1.95

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 (146) hide show
  1. package/dist-cli/bin.js +3 -3
  2. package/dist-cli/chunks/{agent-L6HIJY56.js → agent-QSHBFEH2.js} +2 -2
  3. package/dist-cli/chunks/{agent-wrapper-E46RJGKZ.js → agent-wrapper-EZF7ZWFW.js} +2 -2
  4. package/dist-cli/chunks/{assert-E35SQTDG.js → assert-RDZ62JMU.js} +2 -2
  5. package/dist-cli/chunks/auto-bootstrap-QNTJGTY2.js +2 -0
  6. package/dist-cli/chunks/beta-UMDR2N5Z.js +2 -0
  7. package/dist-cli/chunks/{chunk-EOEORGPV.js → chunk-3ELUS6PR.js} +1 -1
  8. package/dist-cli/chunks/chunk-4EXXGO62.js +1 -0
  9. package/dist-cli/chunks/chunk-4MQ6YXQS.js +79 -0
  10. package/dist-cli/chunks/{chunk-6T6RZPWU.js → chunk-52673BOA.js} +3 -3
  11. package/dist-cli/chunks/{chunk-WPPSP6UG.js → chunk-5VJVM63B.js} +1 -1
  12. package/dist-cli/chunks/{chunk-TRS52XH4.js → chunk-75ETPOPS.js} +1 -1
  13. package/dist-cli/chunks/{chunk-I4M7NBKY.js → chunk-7QAIEML2.js} +3 -3
  14. package/dist-cli/chunks/chunk-7SLPVN2T.js +2 -0
  15. package/dist-cli/chunks/chunk-7XJH4CYY.js +1 -0
  16. package/dist-cli/chunks/{chunk-M4QXOCCY.js → chunk-B7ZFNEFJ.js} +1 -1
  17. package/dist-cli/chunks/{chunk-M5P3ULHQ.js → chunk-D7E2T6EK.js} +2 -2
  18. package/dist-cli/chunks/{chunk-352UPR2W.js → chunk-DF7X6XLF.js} +2 -2
  19. package/dist-cli/chunks/chunk-ETKO3E2K.js +1 -0
  20. package/dist-cli/chunks/{chunk-JLFCHU45.js → chunk-FQ3XGA7P.js} +2 -2
  21. package/dist-cli/chunks/{chunk-W5ET7GSK.js → chunk-G4UGGSGJ.js} +1 -1
  22. package/dist-cli/chunks/{chunk-BXZDXBUA.js → chunk-G4ZC5446.js} +1 -1
  23. package/dist-cli/chunks/{chunk-3IFMI2MH.js → chunk-GQOMMF7T.js} +1 -1
  24. package/dist-cli/chunks/{chunk-6MKI2ZHC.js → chunk-HXJDJEMT.js} +2 -2
  25. package/dist-cli/chunks/{chunk-WVNXRYKC.js → chunk-ISTA6YM5.js} +2 -2
  26. package/dist-cli/chunks/{chunk-WTUKAQUP.js → chunk-IZST5V65.js} +2 -2
  27. package/dist-cli/chunks/{chunk-F5FIYZXA.js → chunk-KVB747DX.js} +2 -2
  28. package/dist-cli/chunks/{chunk-IQJE2PBU.js → chunk-LC46VXFM.js} +12 -12
  29. package/dist-cli/chunks/{chunk-CCKZR7BU.js → chunk-LJAA2AIH.js} +2 -2
  30. package/dist-cli/chunks/{chunk-DIWDDWNK.js → chunk-M66IF4KG.js} +1 -1
  31. package/dist-cli/chunks/{chunk-JLEZDTOL.js → chunk-MECTADHH.js} +3 -3
  32. package/dist-cli/chunks/{chunk-RVUQAUXP.js → chunk-MW7IV7WR.js} +1 -1
  33. package/dist-cli/chunks/{chunk-HVOCWWIV.js → chunk-OFDL7NBZ.js} +1 -1
  34. package/dist-cli/chunks/{chunk-K4DWGJO2.js → chunk-QBWUGBJ2.js} +2 -2
  35. package/dist-cli/chunks/{chunk-D62KWBZG.js → chunk-QCP4NBOQ.js} +2 -2
  36. package/dist-cli/chunks/{chunk-3NEAT5UU.js → chunk-R2FEH3R3.js} +2 -2
  37. package/dist-cli/chunks/chunk-R3JEQB64.js +2 -0
  38. package/dist-cli/chunks/{chunk-XFBHJCF3.js → chunk-RFFEPUWN.js} +1 -1
  39. package/dist-cli/chunks/{chunk-TZFDBDEI.js → chunk-TP3HSOBL.js} +1 -1
  40. package/dist-cli/chunks/{chunk-DSHYPD5A.js → chunk-UFV5UVWJ.js} +2 -2
  41. package/dist-cli/chunks/{chunk-S3QCEBTB.js → chunk-UM4ZFJWP.js} +2 -2
  42. package/dist-cli/chunks/{chunk-C343OFIG.js → chunk-UX5X4MCF.js} +2 -2
  43. package/dist-cli/chunks/{chunk-2JFC45SX.js → chunk-UXJFJII4.js} +2 -2
  44. package/dist-cli/chunks/{chunk-YQRBB7YC.js → chunk-VJ3PA5WE.js} +2 -2
  45. package/dist-cli/chunks/chunk-W2J5AS5G.js +12 -0
  46. package/dist-cli/chunks/chunk-XDXBORFA.js +2 -0
  47. package/dist-cli/chunks/{chunk-LWCVNHLT.js → chunk-YTC2YTSY.js} +2 -2
  48. package/dist-cli/chunks/{chunk-FGWNYFSK.js → chunk-YY7ETGH4.js} +1 -1
  49. package/dist-cli/chunks/{chunk-XPLBMRUI.js → chunk-Z5MA5DSL.js} +2 -2
  50. package/dist-cli/chunks/{chunk-FRFSAMOW.js → chunk-ZBIHQFJH.js} +2 -2
  51. package/dist-cli/chunks/cli-version-XSN4VQZS.js +2 -0
  52. package/dist-cli/chunks/{compat-E6YM3TJZ.js → compat-JE62ROCD.js} +3 -3
  53. package/dist-cli/chunks/{config-5QYHIZDT.js → config-VIDFHVAJ.js} +2 -2
  54. package/dist-cli/chunks/control-IG2XD6G3.js +2 -0
  55. package/dist-cli/chunks/{cpu-profile-M3TNUJW3.js → cpu-profile-AN7QU7FD.js} +2 -2
  56. package/dist-cli/chunks/{daemon-POLLGYA2.js → daemon-4RMB3D3H.js} +2 -2
  57. package/dist-cli/chunks/{debug-P6IGEYZR.js → debug-TB3B3NUZ.js} +3 -3
  58. package/dist-cli/chunks/{detox-HIP5JDSQ.js → detox-7L3QTPDS.js} +2 -2
  59. package/dist-cli/chunks/{device-GL2LVHJD.js → device-WCLWQVHB.js} +2 -2
  60. package/dist-cli/chunks/{diagnose-JGJF6QJ2.js → diagnose-WIPN3A3V.js} +2 -2
  61. package/dist-cli/chunks/drivers-MW7QACKU.js +2 -0
  62. package/dist-cli/chunks/{electron-HO2O3U5S.js → electron-D6J2PGUN.js} +3 -3
  63. package/dist-cli/chunks/flow-DQBV7UG7.js +2 -0
  64. package/dist-cli/chunks/help-3QUXRL5N.js +2 -0
  65. package/dist-cli/chunks/{hints-K5KHWU2I.js → hints-7KTRWBPZ.js} +2 -2
  66. package/dist-cli/chunks/{home-paths-VTUAIJ4X.js → home-paths-KVNHCBED.js} +2 -2
  67. package/dist-cli/chunks/{inspect-5QTZ4446.js → inspect-3OX72G7H.js} +3 -3
  68. package/dist-cli/chunks/install-AI5FBSYP.js +2 -0
  69. package/dist-cli/chunks/{install-desktop-P5IOBTJA.js → install-desktop-H5QOKMND.js} +3 -3
  70. package/dist-cli/chunks/{keys-H65MGEIF.js → keys-4KGCWVC5.js} +2 -2
  71. package/dist-cli/chunks/{launch-LGV3G4IE.js → launch-ALMXEVPI.js} +3 -3
  72. package/dist-cli/chunks/{login-SXC6PXZA.js → login-KV7OCJ7I.js} +4 -4
  73. package/dist-cli/chunks/{logout-JQVXXJQJ.js → logout-P3ARHXJM.js} +2 -2
  74. package/dist-cli/chunks/{maestro-LLK45LHK.js → maestro-BDM34BYL.js} +2 -2
  75. package/dist-cli/chunks/{preview-PCHLQQWW.js → preview-KDWFMNHR.js} +2 -2
  76. package/dist-cli/chunks/{profile-5SUWLDAA.js → profile-FWUDY2NE.js} +2 -2
  77. package/dist-cli/chunks/{react-ASFY75YW.js → react-PC4XY6P6.js} +2 -2
  78. package/dist-cli/chunks/{record-NYEORAUL.js → record-4AOBVYRX.js} +2 -2
  79. package/dist-cli/chunks/runtime-IAUCE7TN.js +2 -0
  80. package/dist-cli/chunks/{runtime-delivery-YQVEY753.js → runtime-delivery-G2N5JP3H.js} +2 -2
  81. package/dist-cli/chunks/{screenshot-GCT4HM3M.js → screenshot-PVM3GYDT.js} +2 -2
  82. package/dist-cli/chunks/{screenshot-mode-AV2UYPI2.js → screenshot-mode-GY7IIQDM.js} +2 -2
  83. package/dist-cli/chunks/{screenshots-25JTW3MK.js → screenshots-LLCE5RGI.js} +2 -2
  84. package/dist-cli/chunks/{server-EMV5ZU3B.js → server-2ITMPR62.js} +2 -2
  85. package/dist-cli/chunks/setup-repo-HTIPFHIF.js +2 -0
  86. package/dist-cli/chunks/{skills-2MLJI75W.js → skills-DYXWP7YE.js} +2 -2
  87. package/dist-cli/chunks/{start-4MINIBCZ.js → start-OYXBP3KM.js} +4 -4
  88. package/dist-cli/chunks/store-VFVXG7L7.js +2 -0
  89. package/dist-cli/chunks/telemetry-K2L4K4B6.js +2 -0
  90. package/dist-cli/chunks/{test-662YO2IZ.js → test-KKDBJ5NS.js} +3 -3
  91. package/dist-cli/chunks/{three-mode-VPDWTIYX.js → three-mode-CZELDF5Z.js} +2 -2
  92. package/dist-cli/chunks/{timeline-4UOJQCTI.js → timeline-WEAB4DGA.js} +2 -2
  93. package/dist-cli/chunks/{upgrade-NV4PNXNY.js → upgrade-Q5IWHTOT.js} +2 -2
  94. package/dist-cli/chunks/upload-SP3SF6ZK.js +2 -0
  95. package/dist-cli/chunks/{web-6VVCC7QO.js → web-ZIFZV3KW.js} +2 -2
  96. package/dist-cli/chunks/{what-happened-C7OMH2CO.js → what-happened-XUWORH46.js} +2 -2
  97. package/dist-cli/chunks/{whoami-PO5M2KCL.js → whoami-GELHQUW3.js} +2 -2
  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/beta.cjs +1 -1
  105. package/dist-lib/beta.mjs +1 -1
  106. package/dist-lib/bridge-constants.cjs +1 -1
  107. package/dist-lib/cli-constants.cjs +1 -1
  108. package/dist-lib/config.cjs +1 -1
  109. package/dist-lib/detox/index.cjs +1 -1
  110. package/dist-lib/dev-bundle-resolution.cjs +1 -1
  111. package/dist-lib/home-paths.cjs +1 -1
  112. package/dist-lib/host/bridge-host.cjs +8 -10
  113. package/dist-lib/host/fetch-proxy-handler.cjs +1 -1
  114. package/dist-lib/host/fetch-proxy-overrides.cjs +1 -1
  115. package/dist-lib/host/fetch-proxy-overrides.mjs +1 -1
  116. package/dist-lib/host/websocket-proxy.cjs +1 -1
  117. package/dist-lib/index.cjs +1 -1
  118. package/dist-lib/metro.cjs +1 -1
  119. package/dist-lib/profiles.cjs +1 -1
  120. package/dist-lib/render-mode.cjs +1 -1
  121. package/dist-lib/scripts/demo-app-registry.cjs +8 -10
  122. package/dist-lib/scripts/dev-server-scanner.cjs +8 -10
  123. package/dist-lib/skills.cjs +20 -11
  124. package/dist-lib/vite.cjs +1 -1
  125. package/package.json +1 -1
  126. package/scripts/demo-app-registry.ts +9 -8
  127. package/dist-cli/chunks/auto-bootstrap-KTVZAENF.js +0 -2
  128. package/dist-cli/chunks/beta-AMLREMEK.js +0 -2
  129. package/dist-cli/chunks/chunk-4DUFZAOO.js +0 -12
  130. package/dist-cli/chunks/chunk-ALNQTDSH.js +0 -1
  131. package/dist-cli/chunks/chunk-G2SZI7US.js +0 -2
  132. package/dist-cli/chunks/chunk-IAR2LAOG.js +0 -79
  133. package/dist-cli/chunks/chunk-IWEKZVXW.js +0 -2
  134. package/dist-cli/chunks/chunk-K3A7IH77.js +0 -1
  135. package/dist-cli/chunks/chunk-QHPFVK62.js +0 -1
  136. package/dist-cli/chunks/cli-version-KG6WCABJ.js +0 -2
  137. package/dist-cli/chunks/control-JIXJTCK4.js +0 -2
  138. package/dist-cli/chunks/drivers-4CENGVIM.js +0 -2
  139. package/dist-cli/chunks/flow-HC36VZGL.js +0 -2
  140. package/dist-cli/chunks/help-57FSVG47.js +0 -2
  141. package/dist-cli/chunks/install-QHY443P7.js +0 -2
  142. package/dist-cli/chunks/runtime-KZJNKYOB.js +0 -2
  143. package/dist-cli/chunks/setup-repo-MHZ7ELJO.js +0 -2
  144. package/dist-cli/chunks/store-NKMSNUBC.js +0 -2
  145. package/dist-cli/chunks/telemetry-IJO3ZRR5.js +0 -2
  146. package/dist-cli/chunks/upload-AJURIKDZ.js +0 -2
@@ -1,7 +1,7 @@
1
- /*! sootsim v0.1.93 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{a as x}from"./chunk-EOEORGPV.js";var j="sootsimConfig";function h(e){return!!e&&Object.keys(e).length>0}function de(e){return e?h(e.modules)||h(e.turboModules)||h(e.nativeModules)||h(e.env)||h(e.settings)||h(e.initialState):!1}function q(e,t){let n=new URL(e);return de(t)?n.searchParams.set(j,JSON.stringify(t)):n.searchParams.delete(j),n.toString()}import{existsSync as d,readFileSync as R,writeFileSync as g}from"node:fs";import{homedir as le}from"node:os";import{dirname as fe,join as c,resolve as y}from"node:path";var _=le();function me(e){let t=e;for(;;){if(d(c(t,"pnpm-workspace.yaml"))||d(c(t,"turbo.json"))||d(c(t,"nx.json"))||d(c(t,"lerna.json")))return t;let n=c(t,"package.json");if(d(n))try{if(JSON.parse(R(n,"utf8")).workspaces)return t}catch{}let r=fe(t);if(r===t)return null;t=r}}function O(e,t){let n=me(process.cwd()),r=[n?y(n,e):null,y(process.cwd(),e),y(process.cwd(),t)].filter(o=>!!o);for(let o of r)if(d(o))return o;return r[0]??y(process.cwd(),e)}var pe=()=>O("packages/sootsim-engine/scripts/expensify-web-proxy.ts","scripts/expensify-web-proxy.ts"),_e=()=>O("packages/sootsim-engine/scripts/rainbow-metadata-proxy.ts","scripts/rainbow-metadata-proxy.ts"),ge=()=>O("packages/compat/src/stubs/mattermost-rnutils-native.ts","../compat/src/stubs/mattermost-rnutils-native.ts"),Re=()=>O("packages/compat/src/stubs/native-seams/react-native-keychain-manager.ts","../compat/src/stubs/native-seams/react-native-keychain-manager.ts"),W=()=>O("packages/compat/src/stubs/mattermost-network-client-native.ts","../compat/src/stubs/mattermost-network-client-native.ts"),Ee=()=>O("packages/sootsim-engine/scripts/mattermost-preview-server.ts","scripts/mattermost-preview-server.ts"),B={USE_NGROK:"true",NGROK_URL:"http://localhost:9000/",SECURE_NGROK_URL:"http://localhost:9000/"},Se=c(_,"github/mattermost-mobile"),N=c(_,"github/uniswap-interface"),Ae=c(N,"apps/mobile"),C=c(N,".env.defaults.local"),he="stored-in-.env.local",V="# sootsim demo env overrides",Pe=c(N,"packages/uniswap/src/features/forceUpgrade/hooks/useForceUpgradeStatus.ts"),Oe=c(N,"apps/mobile/src/notification-service/data-sources/createForceUpgradeNotificationDataSource.ts"),Q="SOOTSIM_DEMO_DISABLE_FORCE_UPGRADE";function X(e){if(!d(e))return{};let t={},n=R(e,"utf8");for(let r of n.split(/\r?\n/)){let o=r.trim();if(!o||o.startsWith("#"))continue;let a=o.match(/^([A-Za-z_][A-Za-z0-9_]*)\s*=\s*(.*)$/);if(!a)continue;let i=a[2].trim();(i.startsWith('"')&&i.endsWith('"')||i.startsWith("'")&&i.endsWith("'"))&&(i=i.slice(1,-1)),t[a[1]]=i}return t}function $(e){if(!e)return!1;let t=e.trim();return!(!t||t.includes(he)||t==="TRADING_API_KEY"||t==="UNISWAP_API_KEY")}function z(e,t){for(let n of e)for(let r of t){let o=n[r];if($(o))return o.trim()}}function oe(){let e=X(C),t=X(c(N,"apps/web/.env")),n=[process.env,e,t],r={},o=[["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,s]of o){let u=z(n,[i,...s]);if(u){r[i]=u;for(let l of s)r[l]=u}}if(!($(r.TRADING_API_KEY)&&$(r.UNISWAP_API_KEY))){let i=z(n,["GRAPHQL_URL_OVERRIDE","REACT_APP_AWS_API_ENDPOINT"])||"https://interface.gateway.uniswap.org/v1/graphql";r.API_BASE_URL_OVERRIDE="https://interface.gateway.uniswap.org",r.API_BASE_URL_V2_OVERRIDE="https://interface.gateway.uniswap.org/v2",r.GRAPHQL_URL_OVERRIDE=i,r.TRADING_API_URL_OVERRIDE="https://trading-api-labs.interface.gateway.uniswap.org",r.FOR_API_URL_OVERRIDE="https://for.interface.gateway.uniswap.org/v2/FOR.v1.FORService"}return r}function Te(){let e=d(C)?R(C,"utf8"):"";if(e&&!e.includes(V))return;let t=oe(),n=[V];for(let[r,o]of Object.entries(t).sort(([a],[i])=>a.localeCompare(i)))n.push(`${r}=${JSON.stringify(o)}`);n.push(""),g(C,`${n.join(`
1
+ /*! sootsim v0.1.95 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
+ import{a as x}from"./chunk-3ELUS6PR.js";var J="sootsimConfig";function h(e){return!!e&&Object.keys(e).length>0}function de(e){return e?h(e.modules)||h(e.turboModules)||h(e.nativeModules)||h(e.env)||h(e.settings)||h(e.initialState):!1}function V(e,t){let n=new URL(e);return de(t)?n.searchParams.set(J,JSON.stringify(t)):n.searchParams.delete(J),n.toString()}import{existsSync as d,readFileSync as R,writeFileSync as g}from"node:fs";import{homedir as le}from"node:os";import{dirname as fe,join as c,resolve as y}from"node:path";var _=le();function me(e){let t=e;for(;;){if(d(c(t,"pnpm-workspace.yaml"))||d(c(t,"turbo.json"))||d(c(t,"nx.json"))||d(c(t,"lerna.json")))return t;let n=c(t,"package.json");if(d(n))try{if(JSON.parse(R(n,"utf8")).workspaces)return t}catch{}let r=fe(t);if(r===t)return null;t=r}}function O(e,t){let n=me(process.cwd()),r=[n?y(n,e):null,y(process.cwd(),e),y(process.cwd(),t)].filter(o=>!!o);for(let o of r)if(d(o))return o;return r[0]??y(process.cwd(),e)}var pe=()=>O("packages/sootsim-engine/scripts/expensify-web-proxy.ts","scripts/expensify-web-proxy.ts"),_e=()=>O("packages/sootsim-engine/scripts/rainbow-metadata-proxy.ts","scripts/rainbow-metadata-proxy.ts"),ge=()=>O("packages/compat/src/stubs/mattermost-rnutils-native.ts","../compat/src/stubs/mattermost-rnutils-native.ts"),Re=()=>O("packages/compat/src/stubs/native-seams/react-native-keychain-manager.ts","../compat/src/stubs/native-seams/react-native-keychain-manager.ts"),W=()=>O("packages/compat/src/stubs/mattermost-network-client-native.ts","../compat/src/stubs/mattermost-network-client-native.ts"),Ee=()=>O("packages/sootsim-engine/scripts/mattermost-preview-server.ts","scripts/mattermost-preview-server.ts"),B={USE_NGROK:"true",NGROK_URL:"http://localhost:9000/",SECURE_NGROK_URL:"http://localhost:9000/"},Se=c(_,"github/mattermost-mobile"),N=c(_,"github/uniswap-interface"),Ae=c(N,"apps/mobile"),C=c(N,".env.defaults.local"),he="stored-in-.env.local",q="# sootsim demo env overrides",Pe=c(N,"packages/uniswap/src/features/forceUpgrade/hooks/useForceUpgradeStatus.ts"),Oe=c(N,"apps/mobile/src/notification-service/data-sources/createForceUpgradeNotificationDataSource.ts"),Q="SOOTSIM_DEMO_DISABLE_FORCE_UPGRADE";function X(e){if(!d(e))return{};let t={},n=R(e,"utf8");for(let r of n.split(/\r?\n/)){let o=r.trim();if(!o||o.startsWith("#"))continue;let a=o.match(/^([A-Za-z_][A-Za-z0-9_]*)\s*=\s*(.*)$/);if(!a)continue;let i=a[2].trim();(i.startsWith('"')&&i.endsWith('"')||i.startsWith("'")&&i.endsWith("'"))&&(i=i.slice(1,-1)),t[a[1]]=i}return t}function $(e){if(!e)return!1;let t=e.trim();return!(!t||t.includes(he)||t==="TRADING_API_KEY"||t==="UNISWAP_API_KEY")}function z(e,t){for(let n of e)for(let r of t){let o=n[r];if($(o))return o.trim()}}function oe(){let e=X(C),t=X(c(N,"apps/web/.env")),n=[process.env,e,t],r={},o=[["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,s]of o){let u=z(n,[i,...s]);if(u){r[i]=u;for(let l of s)r[l]=u}}if(!($(r.TRADING_API_KEY)&&$(r.UNISWAP_API_KEY))){let i=z(n,["GRAPHQL_URL_OVERRIDE","REACT_APP_AWS_API_ENDPOINT"])||"https://interface.gateway.uniswap.org/v1/graphql";r.API_BASE_URL_OVERRIDE="https://interface.gateway.uniswap.org",r.API_BASE_URL_V2_OVERRIDE="https://interface.gateway.uniswap.org/v2",r.GRAPHQL_URL_OVERRIDE=i,r.TRADING_API_URL_OVERRIDE="https://trading-api-labs.interface.gateway.uniswap.org",r.FOR_API_URL_OVERRIDE="https://for.interface.gateway.uniswap.org/v2/FOR.v1.FORService"}return r}function Te(){let e=d(C)?R(C,"utf8"):"";if(e&&!e.includes(q))return;let t=oe(),n=[q];for(let[r,o]of Object.entries(t).sort(([a],[i])=>a.localeCompare(i)))n.push(`${r}=${JSON.stringify(o)}`);n.push(""),g(C,`${n.join(`
3
3
  `)}
4
- `)}function Ie(){let e=`export function useForceUpgradeStatus(): ForceUpgradeStatus {
4
+ `)}function ve(){let e=`export function useForceUpgradeStatus(): ForceUpgradeStatus {
5
5
  `,t=` // sootsim demo: bypass the force-upgrade gate during local engine demos.
6
6
  return 'not-required'
7
7
 
@@ -19,8 +19,8 @@ import{a as x}from"./chunk-EOEORGPV.js";var j="sootsimConfig";function h(e){retu
19
19
  return 'not-required'
20
20
  }
21
21
 
22
- `,i=(s,u,l,f)=>{let m=R(s,"utf8");if(!m.includes(l)){if(m.includes(f)){g(s,m.replace(f,l));return}if(!m.includes(u))throw new Error(`uniswap demo patch failed: expected snippet not found in ${s}`);g(s,m.replace(u,`${u}${l}`))}};i(Pe,e,t,n),i(Oe,r,o,a)}var S=c(_,"github/joplin"),ve=c(S,"packages/app-mobile"),Ne=["packages/lib","packages/renderer","packages/turndown","packages/turndown-plugin-gfm","packages/editor","packages/tools","packages/utils","packages/fork-htmlparser2","packages/fork-uslug","packages/fork-sax","packages/htmlpack","packages/react-native-saf-x","packages/react-native-alarm-notification"];function be(){if(d(S))for(let e of Ne){let t=c(S,e);if(!d(t))continue;let n=c(t,".watchmanconfig");d(n)||g(n,`{}
23
- `)}}var Z=["packages/lib/models/Setting.js","packages/turndown/lib/turndown.cjs.js","packages/app-mobile/pluginAssets/index.js"];function we(){if(!d(S)||Z.filter(r=>!d(c(S,r))).length===0)return;let{execSync:t}=x("node:child_process");t("yarn buildParallel",{cwd:S,stdio:"inherit",env:{...process.env,NO_FLIPPER:"1",CI:""}});let n=Z.filter(r=>!d(c(S,r)));if(n.length>0)throw new Error(`joplin demo: yarn buildParallel did not produce: ${n.join(", ")}`)}var P=c(_,"github/rainbow"),I=c(P,"src/graphql"),Y=c(I,"config.js"),D=c(P,"src/references/networks.json"),v="https://metadata.p.rainbow.me",F=9011,K=`http://127.0.0.1:${F}`,ee="https://api.thegraph.com/subgraphs/name/ensdomains/ens",se="0x0000000000000000000000000000000000000000",ye="https://relay.rainbow.me",Ce="sootsim-rainbow-demo-master-key-do-not-use-for-real-wallets",De="https://rpc.rainbow.me/v1",Le="",ie={1:"https://ethereum-rpc.publicnode.com"},te="sootsim-rainbow-demo-api-key",ke="0x736f6f7473696d2d7261696e626f772d64656d6f2d686173682d6b6579000000",Ue=["src/graphql/__generated__/ens.ts","src/graphql/__generated__/metadata.ts","src/graphql/__generated__/metadataPOST.ts"];function G(e,t){let{execSync:n}=x("node:child_process");n(e,{cwd:t,stdio:"inherit",env:{...process.env,METADATA_BASE_URL:v,RAINBOW_RELAY_QUOTE_SIGNER:process.env.RAINBOW_RELAY_QUOTE_SIGNER??se}})}function Me(){if(!d(I))return;let e=d(Y)?R(Y,"utf8"):"";e.includes(ee)&&e.includes(v)||g(Y,`exports.config = {
22
+ `,i=(s,u,l,f)=>{let m=R(s,"utf8");if(!m.includes(l)){if(m.includes(f)){g(s,m.replace(f,l));return}if(!m.includes(u))throw new Error(`uniswap demo patch failed: expected snippet not found in ${s}`);g(s,m.replace(u,`${u}${l}`))}};i(Pe,e,t,n),i(Oe,r,o,a)}var S=c(_,"github/joplin"),Ie=c(S,"packages/app-mobile"),Ne=["packages/lib","packages/renderer","packages/turndown","packages/turndown-plugin-gfm","packages/editor","packages/tools","packages/utils","packages/fork-htmlparser2","packages/fork-uslug","packages/fork-sax","packages/htmlpack","packages/react-native-saf-x","packages/react-native-alarm-notification"];function be(){if(d(S))for(let e of Ne){let t=c(S,e);if(!d(t))continue;let n=c(t,".watchmanconfig");d(n)||g(n,`{}
23
+ `)}}var Z=["packages/lib/models/Setting.js","packages/turndown/lib/turndown.cjs.js","packages/app-mobile/pluginAssets/index.js"];function we(){if(!d(S)||Z.filter(r=>!d(c(S,r))).length===0)return;let{execSync:t}=x("node:child_process");t("yarn buildParallel",{cwd:S,stdio:"inherit",env:{...process.env,NO_FLIPPER:"1",CI:""}});let n=Z.filter(r=>!d(c(S,r)));if(n.length>0)throw new Error(`joplin demo: yarn buildParallel did not produce: ${n.join(", ")}`)}var P=c(_,"github/rainbow"),v=c(P,"src/graphql"),Y=c(v,"config.js"),D=c(P,"src/references/networks.json"),I="https://metadata.p.rainbow.me",F=9011,K=`http://127.0.0.1:${F}`,ee="https://api.thegraph.com/subgraphs/name/ensdomains/ens",se="0x0000000000000000000000000000000000000000",ye="https://relay.rainbow.me",Ce="sootsim-rainbow-demo-master-key-do-not-use-for-real-wallets",De="https://rpc.rainbow.me/v1",Le="",ie={1:"https://ethereum-rpc.publicnode.com"},te="sootsim-rainbow-demo-api-key",ke="0x736f6f7473696d2d7261696e626f772d64656d6f2d686173682d6b6579000000",Ue="00000000000000000000000000000000",Me=["src/graphql/__generated__/ens.ts","src/graphql/__generated__/metadata.ts","src/graphql/__generated__/metadataPOST.ts"];function G(e,t){let{execSync:n}=x("node:child_process");n(e,{cwd:t,stdio:"inherit",env:{...process.env,METADATA_BASE_URL:I,RAINBOW_RELAY_QUOTE_SIGNER:process.env.RAINBOW_RELAY_QUOTE_SIGNER??se}})}function xe(){if(!d(v))return;let e=d(Y)?R(Y,"utf8"):"";e.includes(ee)&&e.includes(I)||g(Y,`exports.config = {
24
24
  ens: {
25
25
  __name: 'ens',
26
26
  document: './queries/ens.graphql',
@@ -32,12 +32,12 @@ import{a as x}from"./chunk-EOEORGPV.js";var j="sootsimConfig";function h(e){retu
32
32
  metadata: {
33
33
  __name: 'metadata',
34
34
  document: './queries/metadata.graphql',
35
- schema: { method: 'GET', url: '${v}/v1/graph' },
35
+ schema: { method: 'GET', url: '${I}/v1/graph' },
36
36
  },
37
37
  metadataPOST: {
38
38
  __name: 'metadataPOST',
39
39
  document: './queries/metadata.graphql',
40
- schema: { method: 'POST', url: '${v}/v1/graph' },
40
+ schema: { method: 'POST', url: '${I}/v1/graph' },
41
41
  },
42
42
  arc: {
43
43
  __name: 'arc',
@@ -60,8 +60,8 @@ import{a as x}from"./chunk-EOEORGPV.js";var j="sootsimConfig";function h(e){retu
60
60
  },
61
61
  },
62
62
  };
63
- `)}function xe(){let e={ENABLE_DEV_MODE:"1",IS_TESTING:"false",METADATA_BASE_URL:process.env.RAINBOW_METADATA_BASE_URL??K,ADDYS_API_KEY:process.env.ADDYS_API_KEY??te,ADDYS_BASE_URL:process.env.ADDYS_BASE_URL??K,PLATFORM_API_KEY:process.env.PLATFORM_API_KEY??te,PLATFORM_BASE_URL:process.env.PLATFORM_BASE_URL??K,RAINBOW_MASTER_KEY:process.env.RAINBOW_MASTER_KEY??Ce,RAINBOW_RELAY_QUOTE_SIGNER:process.env.RAINBOW_RELAY_QUOTE_SIGNER??se,RAINBOW_RELAY_URL:process.env.RAINBOW_RELAY_URL??ye,RPC_PROXY_API_KEY_PROD:Le,RPC_PROXY_BASE_URL_PROD:process.env.RAINBOW_RPC_PROXY_BASE_URL??process.env.RPC_PROXY_BASE_URL_PROD??De,SECURE_WALLET_HASH_KEY:process.env.SECURE_WALLET_HASH_KEY??ke},t=["ADDYS_API_KEY","ADDYS_BASE_URL","IMGIX_DOMAIN","IMGIX_TOKEN","PLATFORM_API_KEY","PLATFORM_BASE_URL","RAINBOW_TEST_WALLET","RAINBOW_RELAY_API_KEY","RAINBOW_RELAY_URL","SECURE_WALLET_HASH_KEY","TOKEN_SEARCH_URL","WC_PROJECT_ID"];for(let n of t){let r=process.env[n];r&&(e[n]=r)}return!e.WC_PROJECT_ID&&process.env.RAINBOW_WALLETCONNECT_PROJECT_ID&&(e.WC_PROJECT_ID=process.env.RAINBOW_WALLETCONNECT_PROJECT_ID),e}function We(){if(!d(D))return;let e=JSON.parse(R(D,"utf8"));if(!Array.isArray(e.networks))return;let t=!1;for(let n of e.networks){let r=n.id?ie[n.id]:void 0;!r||!n.defaultRPC||n.defaultRPC.url!==r&&(n.defaultRPC.url=r,t=!0)}t&&g(D,`${JSON.stringify(e)}
64
- `)}function Be(){if(!d(P))return;Me(),d(c(I,"node_modules/.bin/graphql-codegen"))||G("fnm exec --using=22 yarn install",I),Ue.some(t=>!d(c(P,t)))&&G("fnm exec --using=22 yarn codegen",I),d(D)||G("fnm exec --using=22 yarn fetch:networks",P),We()}var p=c(_,"github/eigen"),L=c(p,"keys.shared.json"),ne=c(p,"metaflags.json"),re=c(p,"src/__generated__/.relay-complete");function Ye(){if(d(L))try{let e=JSON.parse(R(L,"utf8"));if(!e||typeof e!="object")return;let t=e.secure&&typeof e.secure=="object"?e.secure:void 0,n=e.public&&typeof e.public=="object"?e.public:void 0;return!t&&!n?void 0:{secure:t,public:n}}catch{return}}function Ke(){let e=process.env.SOOTSIM_ARTSY_EMAIL??process.env.MAESTRO_TEST_EMAIL,t=process.env.SOOTSIM_ARTSY_PASSWORD??process.env.MAESTRO_TEST_PASSWORD,n=Ye(),r={};if(e&&t&&(r.SOOTSIM_LAUNCH_ARGUMENTS=JSON.stringify({email:e,password:t,useMaestroInit:!0})),n&&(r.SOOTSIM_REACT_NATIVE_KEYS_JSON=JSON.stringify(n)),Object.keys(r).length!==0)return{env:r}}function Ge(){if(!d(p))return;let{execSync:e}=x("node:child_process"),t=c(p,".yarn/releases/yarn-4.10.3.cjs");if(d(t)){let r=R(t,"utf8"),o='["clone","-c core.autocrlf=false",';r.includes(o)&&g(t,r.replace(o,'["clone","-c","core.autocrlf=false",'))}if(d(c(p,"node_modules/.yarn-state.yml"))||e("yarn install",{cwd:p,stdio:"inherit",env:{...process.env,YARN_CHECKSUM_BEHAVIOR:"update"}}),!d(L)||!d(ne))try{e("yarn setup:oss",{cwd:p,stdio:"inherit"})}catch{if(!d(L)||!d(ne))throw new Error("artsy demo: setup:oss did not create keys/metaflags")}let n=c(p,"node_modules/react-native-launch-arguments/package.json");if(d(n)){let r=R(n,"utf8");r.includes('"dist/index.js"')&&g(n,r.replace('"dist/index.js"','"src/index.ts"'))}d(re)||(e("yarn relay",{cwd:p,stdio:"inherit"}),g(re,""))}var ae=[{name:"bluesky",label:"Bluesky",dir:c(_,"github/bluesky"),preferredPort:8082,framework:"expo",command:e=>({cmd:`npx expo start --port ${e}`}),credentials:{envVars:["SOOTSIM_BLUESKY_PASSWORD"],known:{HANDLE:"natew.bsky.social"}}},{name:"3pc",label:"3PunchConvo",dir:c(_,"lightstrike-labs/three-punch-convo-app/apps/one"),preferredPort:8081,framework:"one",command:e=>({cmd:"npx one dev",env:{ONE_PORT:String(e)}})},{name:"uniswap",label:"Uniswap",dir:Ae,preferredPort:8085,framework:"expo",prepare:()=>{Te(),Ie()},command:e=>({cmd:`npx expo start --clear --port ${e}`,env:oe()})},{name:"takeout",label:"Takeout",dir:c(_,"takeout"),preferredPort:8086,framework:"one",readyTimeoutMs:24e4,managedPorts:e=>{let t=e-8081;return[5433+t,4848+t,9200+t]},command:e=>({cmd:"bun lite:demo",env:{TAKEOUT_ENV_MODE:"development",PORT_OFFSET:String(e-8081),OREZ_DATA_DIR:`${_}/.cache/sootsim-demo/takeout-orez`,VITE_DEMO_MODE:"1",ZERO_APP_ID:"takeout",ZERO_APP_PUBLICATIONS:"zero_takeout",ZERO_CVR_MAX_CONNS:"4",ZERO_NUM_SYNC_WORKERS:"2",ZERO_UPSTREAM_MAX_CONNS:"8"}})},{name:"expensify",label:"Expensify",dir:c(_,"github/expensify"),preferredPort:8087,framework:"rock",runtimeConfig:{env:B},sidecars:[{name:"web-proxy",port:9e3,readyPath:"/api/Ping",command:()=>({cmd:`bun ${JSON.stringify(pe())}`,env:B})}],command:e=>({cmd:`fnm exec --using=20.20.0 npx rock start --port ${e} --no-interactive`,env:B})},{name:"artsy",label:"Artsy",dir:p,preferredPort:8088,framework:"expo",runtimeConfig:Ke(),prepare:()=>{Ge()},command:e=>({cmd:`npx react-native start --port ${e}`}),credentials:{envVars:["SOOTSIM_ARTSY_EMAIL","SOOTSIM_ARTSY_PASSWORD"],note:"auto-login reuses Artsy\u2019s built-in Maestro launch-arguments hook"}},{name:"rainbow",label:"Rainbow",dir:P,preferredPort:8089,framework:"rock",sidecars:[{name:"metadata-proxy",port:F,readyPath:"/health",command:()=>({cmd:`bun ${JSON.stringify(_e())}`,env:{PORT:String(F),RAINBOW_PUBLIC_RPC_URLS:JSON.stringify(ie),RAINBOW_UPSTREAM_METADATA_BASE_URL:v}})}],prepare:()=>{Be()},command:e=>({cmd:`fnm exec --using=22 yarn start --port ${e} --reset-cache`,env:xe()}),credentials:{envVars:["RAINBOW_TEST_WALLET","RAINBOW_WALLETCONNECT_PROJECT_ID","WC_PROJECT_ID","IMGIX_DOMAIN","IMGIX_TOKEN"],note:"launcher supplies a demo encryption key and public mainnet RPC; use only a public throwaway mnemonic for RAINBOW_TEST_WALLET"}},{name:"rocket-chat",label:"Rocket.Chat",dir:c(_,"github/Rocket.Chat.ReactNative"),preferredPort:8093,framework:"expo",command:e=>({cmd:`npx react-native start --port ${e}`,env:{RUNNING_E2E_TESTS:"true"}}),credentials:{envVars:["ROCKET_CHAT_DEMO_SERVER","ROCKET_CHAT_DEMO_USERNAME","ROCKET_CHAT_DEMO_PASSWORD"],known:{SERVER:"https://mobile.qa.rocket.chat"},note:"use packages/sootsim-engine/scripts/rocket-chat-demo-auth.ts to create/login a disposable QA user and print the rocketchat://auth deep link"}},{name:"mattermost",label:"Mattermost",dir:Se,preferredPort:8090,framework:"expo",sidecars:[{name:"preview-server",port:8065,readyPath:"/api/v4/system/ping",command:()=>({cmd:`bun ${JSON.stringify(Ee())}`})}],runtimeConfig:{modules:{"react-native-keychain":!1,"dist/assets/config.json":{inline:{AuthUrlScheme:"mmauth://",AuthUrlSchemeDev:"mmauthbeta://",DefaultServerUrl:"http://localhost:8065",DefaultServerName:"Mattermost Demo",TestServerUrl:"http://localhost:8065",AutoSelectServerUrl:!0,WebsiteURL:"https://mattermost.com",ServerNoticeURL:"https://github.com/mattermost/mattermost-server/blob/master/NOTICE.txt",MobileNoticeURL:"https://github.com/mattermost/mattermost-mobile/blob/master/NOTICE.txt",RudderApiKey:"",SentryEnabled:!1,SentryDsnIos:"",SentryDsnAndroid:"",SentryOptions:{deactivateStacktraceMerging:!0,autoBreadcrumbs:{xhr:!1,console:!0},severityLevelFilter:["fatal"]},ShowReview:!1,ShowOnboarding:!1,ExperimentalNormalizeMarkdownLinks:!1,CustomRequestHeaders:{},CollectNetworkMetrics:!1}}},nativeModules:{RNKeychainManager:{file:Re()},RNUtils:{file:ge()},GenericClient:{file:W()},ApiClient:{file:W()},WebSocketClient:{file:W()}}},command:e=>({cmd:`npx react-native start --host 127.0.0.1 --port ${e}`}),credentials:{known:{SERVER:"http://localhost:8065",USERNAME:"demo",PASSWORD:"DemoPassword1!"},note:"local mattermost-preview seeded through the real REST API; no signup or OTP needed"}},{name:"joplin",label:"Joplin",dir:ve,preferredPort:8084,framework:"expo",prepare:()=>{be(),we()},command:e=>({cmd:`npx expo start --port ${e}`,env:{BROWSERSLIST_IGNORE_OLD_DATA:"true"}}),credentials:{note:"no login required \u2014 sync.target=0 (None), seed via WelcomeUtils"}}];import{exec as Je}from"child_process";import je from"http";import qe from"net";import{promisify as Ve}from"util";var Et="/index.bundle?platform=ios&dev=true&hot=true&minify=false";function $e(e){return/^https?:\/\//i.test(e)}function Fe(e){return e.endsWith(".bundle")}function He(e){process.env.SOOTSIM_PREVIEW_PROD_BUNDLE&&(e.searchParams.set("dev","false"),e.searchParams.set("minify","true"),e.searchParams.has("hot")&&e.searchParams.set("hot","false"))}function ce(e){try{let t=$e(e),n=new URL(e,"http://soot.local");return n.pathname=n.pathname.replace(/\.\.bundle$/,".bundle"),Fe(n.pathname)?(n.searchParams.delete("transform.bytecode"),He(n),t?n.toString():`${n.pathname}${n.search}${n.hash}`):e}catch{return e}}var J=Ve(Je),Qe=250,Xe=1500,ze=120;function Ze(e,t=ze){return new Promise(n=>{let r=new qe.Socket,o=!1,a=i=>{o||(o=!0,r.destroy(),n(i))};r.setTimeout(t),r.once("connect",()=>a(!0)),r.once("timeout",()=>a(!1)),r.once("error",()=>a(!1)),r.connect(e,"localhost")})}function b(e,t,n="GET",r=Qe,o={}){return new Promise(a=>{let i=je.request({hostname:"localhost",port:e,path:t,method:n,timeout:r,headers:o},s=>{let u="";s.on("data",f=>u+=f.toString());let l=(()=>{let f=s.headers["content-type"];if(typeof f=="string")return f;if(Array.isArray(f))return f[0]})();s.on("end",()=>a({statusCode:s.statusCode||0,body:u,contentType:l}))});i.on("error",()=>a(null)),i.setTimeout(r,()=>{i.destroy(),a(null)}),i.end()})}var et=[8081,8082,8083,8084,8085,8086,3e3,3001,19e3].map(e=>({port:e,pid:0}));function H(e,t){return!(e<=0||e>=2e4||t.has(e)||e>=5170&&e<=5200)}async function tt(e=[]){let t=new Set(e);try{let{stdout:n}=await J("lsof -iTCP -sTCP:LISTEN -P -n 2>/dev/null | grep -E '^(node|bun)'",{encoding:"utf8",timeout:2e3});if(n.trim()){let r=new Map;for(let o of n.trim().split(`
65
- `)){let a=o.trim().split(/\s+/);if(a.length<9)continue;let i=Number(a[1]),u=a[8].match(/:(\d+)$/);if(!u)continue;let l=Number(u[1]);H(l,t)&&(r.has(l)||r.set(l,i))}if(r.size>0)return[...r.entries()].map(([o,a])=>({port:o,pid:a}))}}catch{}try{let{stdout:n}=await J(`ss -tlnp 2>/dev/null | grep -E '"(node|bun)"'`,{encoding:"utf8",timeout:2e3});if(n.trim()){let r=new Map;for(let o of n.trim().split(`
66
- `)){let a=o.match(/:(\d+)\s/),i=o.match(/pid=(\d+)/);if(!a)continue;let s=Number(a[1]),u=i?Number(i[1]):0;H(s,t)&&(r.has(s)||r.set(s,u))}if(r.size>0)return[...r.entries()].map(([o,a])=>({port:o,pid:a}))}}catch{}return et.filter(n=>H(n.port,t))}var M=new Map;async function nt(e){if(e<=0)return null;let t=M.get(e);if(t)return t;try{let{stdout:n}=await J(`lsof -p ${e} -a -d cwd -Fn 2>/dev/null`,{encoding:"utf8",timeout:1500});for(let r of n.split(`
67
- `))if(r.startsWith("n")&&r.length>1){let o=r.slice(1).trim();if(o)return M.set(e,o),o}}catch{}return null}function rt(e,t){return{port:e,framework:t,bundleUrl:T(e,`http://localhost:${e}/index.bundle?platform=ios&dev=true&hot=true&minify=false`),hmrUrl:`ws://localhost:${e}/hot`,lastSeen:Date.now()}}function T(e,t){let n=ae.find(o=>o.preferredPort===e),r=n?.runtimeConfig?q(t,n.runtimeConfig):t;return ce(r)}function ot(e){return e.includes("/node_modules/one/metro-entry.bundle")}function st(e){try{let t=JSON.parse(e);return t&&typeof t=="object"?t:null}catch{return null}}function k(e,t,n){if(!t)return e;try{let r=JSON.parse(t.body),o=r?.extra?.expoClient||r?.extra||{};o.name&&(e.projectName=o.name),o.ios?.bundleIdentifier&&(e.bundleId=o.ios.bundleIdentifier),e.framework==="metro"&&o.sdkVersion&&(e.framework="expo");let a=r?.launchAsset?.url;a&&!e.patched&&!ot(e.bundleUrl)&&(e.bundleUrl=T(e.port,a));let i=o.iconUrl||o.ios?.iconUrl||o.icon||o.ios?.icon;if(i)if(e.iconPath=i,n)if(i.startsWith("http"))e.iconUrl=n(i);else{let s=i.replace(/^\.\//,"");e.iconUrl=n(`http://localhost:${e.port}/assets/${s}`)}else e.iconUrl=i.startsWith("http")?i:`http://localhost:${e.port}/assets/${i.replace(/^\.\//,"")}`}catch{}return e}var E=new Set,A=new Set,w=new Set;async function it(e,t){if(!await Ze(e))return null;let n="/node_modules/one/metro-entry.bundle?platform=ios&dev=true",[r,o,a,i]=await Promise.all([E.has(e)?Promise.resolve(null):b(e,"/__soot/"),b(e,"/status"),w.has(e)?Promise.resolve(null):b(e,"/","GET",Xe,{"expo-platform":"ios"}),A.has(e)?Promise.resolve(null):b(e,"/_expo/status")]);i&&i.statusCode===200?A.delete(e):A.has(e)||A.add(e);let s=a?st(a.body):null,u=typeof s?.launchAsset?.url=="string"?s.launchAsset.url:null,l=s?.extra?.expoClient||s?.extra||{};if(s&&(u||typeof l.name=="string")){E.add(e);let m=u||`http://localhost:${e}/index.bundle?platform=ios&dev=true&hot=true&minify=false`,ue=m.includes("/one/metro-entry.bundle")?"one":"expo";return k({port:e,framework:ue,bundleUrl:T(e,m),hmrUrl:`ws://localhost:${e}/hot`,lastSeen:Date.now()},a,t)}if(o&&o.body.includes("packager-status:running"))return E.add(e),k(rt(e,i&&i.statusCode===200?"expo":"metro"),a,t);if(r&&r.statusCode===200&&r.body.includes("sootsim-patched"))return E.delete(e),k({port:e,framework:"one",bundleUrl:T(e,`http://localhost:${e}/__soot/bundle.js`),hmrUrl:`ws://localhost:${e}/hot`,lastSeen:Date.now(),patched:!0},a,t);let f=await b(e,n,"HEAD");return f&&f.statusCode>0&&f.statusCode<400&&/application\/javascript/i.test(f.contentType||"")?(E.add(e),w.add(e),k({port:e,framework:"one",bundleUrl:T(e,`http://localhost:${e}${n}&minify=false`),hmrUrl:`ws://localhost:${e}/hot`,lastSeen:Date.now()},a,t)):(E.add(e),null)}function at(e){let t=e.projectName?.trim().toLowerCase();return!!(t==="soot"||t==="sootsim"||e.bundleId?.trim().toLowerCase()?.startsWith("dev.soot"))}var U=new Map,ct=3e4,ut=1500;function dt(e){return!e||e.framework==="metro"||e.framework==="unknown"}function lt(e){return e?T(e.port,e.bundleUrl)===e.bundleUrl:!0}function ft(e,t,n=Date.now()){if(t===0||e.pid!==t||!lt(e.result))return!1;let r=n-e.cachedAt;return!(e.result===null&&r>=ct||dt(e.result)&&r>=ut)}async function Nt(e={}){let t=await tt(e.excludePorts),n=new Set(t.map(s=>s.port));for(let s of[...U.keys()])n.has(s)||U.delete(s);for(let s of[...E])n.has(s)||E.delete(s);for(let s of[...A])n.has(s)||A.delete(s);for(let s of[...w])n.has(s)||w.delete(s);let r=[],o=[];for(let{port:s,pid:u}of t){let l=U.get(s);if(l&&ft(l,u)){l.result&&r.push(l.result);continue}l&&l.pid!==u&&(E.delete(s),A.delete(s),w.delete(s)),o.push({port:s,pid:u})}o.length>0&&(await Promise.all(o.map(u=>it(u.port,e.buildIconProxyUrl)))).forEach((u,l)=>{let{port:f,pid:m}=o[l];m!==0&&U.set(f,{pid:m,result:u,cachedAt:Date.now()}),u&&r.push(u)});let a=new Map;for(let{port:s,pid:u}of t)u>0&&a.set(s,u);await Promise.all(r.map(async s=>{let u=a.get(s.port);if(!u)return;s.pid=u;let l=await nt(u);l&&(s.cwd=l)}));let i=new Set(a.values());for(let s of[...M.keys()])i.has(s)||M.delete(s);return r.filter(s=>!at(s))}export{q as a,Et as b,ce as c,ae as d,it as e,Nt as f};
63
+ `)}function We(){let e={ENABLE_DEV_MODE:"1",IS_TESTING:"false",METADATA_BASE_URL:process.env.RAINBOW_METADATA_BASE_URL??K,ADDYS_API_KEY:process.env.ADDYS_API_KEY??te,ADDYS_BASE_URL:process.env.ADDYS_BASE_URL??K,PLATFORM_API_KEY:process.env.PLATFORM_API_KEY??te,PLATFORM_BASE_URL:process.env.PLATFORM_BASE_URL??K,RAINBOW_MASTER_KEY:process.env.RAINBOW_MASTER_KEY??Ce,RAINBOW_RELAY_QUOTE_SIGNER:process.env.RAINBOW_RELAY_QUOTE_SIGNER??se,RAINBOW_RELAY_URL:process.env.RAINBOW_RELAY_URL??ye,RPC_PROXY_API_KEY_PROD:Le,RPC_PROXY_BASE_URL_PROD:process.env.RAINBOW_RPC_PROXY_BASE_URL??process.env.RPC_PROXY_BASE_URL_PROD??De,SECURE_WALLET_HASH_KEY:process.env.SECURE_WALLET_HASH_KEY??ke,WC_PROJECT_ID:process.env.WC_PROJECT_ID??process.env.RAINBOW_WALLETCONNECT_PROJECT_ID??Ue},t=["ADDYS_API_KEY","ADDYS_BASE_URL","IMGIX_DOMAIN","IMGIX_TOKEN","PLATFORM_API_KEY","PLATFORM_BASE_URL","RAINBOW_TEST_WALLET","RAINBOW_RELAY_API_KEY","RAINBOW_RELAY_URL","SECURE_WALLET_HASH_KEY","TOKEN_SEARCH_URL"];for(let n of t){let r=process.env[n];r&&(e[n]=r)}return e}function Be(){if(!d(D))return;let e=JSON.parse(R(D,"utf8"));if(!Array.isArray(e.networks))return;let t=!1;for(let n of e.networks){let r=n.id?ie[n.id]:void 0;!r||!n.defaultRPC||n.defaultRPC.url!==r&&(n.defaultRPC.url=r,t=!0)}t&&g(D,`${JSON.stringify(e)}
64
+ `)}function Ye(){if(!d(P))return;xe(),d(c(v,"node_modules/.bin/graphql-codegen"))||G("fnm exec --using=22 yarn install",v),Me.some(t=>!d(c(P,t)))&&G("fnm exec --using=22 yarn codegen",v),d(D)||G("fnm exec --using=22 yarn fetch:networks",P),Be()}var p=c(_,"github/eigen"),L=c(p,"keys.shared.json"),ne=c(p,"metaflags.json"),re=c(p,"src/__generated__/.relay-complete");function Ke(){if(d(L))try{let e=JSON.parse(R(L,"utf8"));if(!e||typeof e!="object")return;let t=e.secure&&typeof e.secure=="object"?e.secure:void 0,n=e.public&&typeof e.public=="object"?e.public:void 0;return!t&&!n?void 0:{secure:t,public:n}}catch{return}}function Ge(){let e=process.env.SOOTSIM_ARTSY_EMAIL??process.env.MAESTRO_TEST_EMAIL,t=process.env.SOOTSIM_ARTSY_PASSWORD??process.env.MAESTRO_TEST_PASSWORD,n=Ke(),r={};if(e&&t&&(r.SOOTSIM_LAUNCH_ARGUMENTS=JSON.stringify({email:e,password:t,useMaestroInit:!0})),n&&(r.SOOTSIM_REACT_NATIVE_KEYS_JSON=JSON.stringify(n)),Object.keys(r).length!==0)return{env:r}}function $e(){if(!d(p))return;let{execSync:e}=x("node:child_process"),t=c(p,".yarn/releases/yarn-4.10.3.cjs");if(d(t)){let r=R(t,"utf8"),o='["clone","-c core.autocrlf=false",';r.includes(o)&&g(t,r.replace(o,'["clone","-c","core.autocrlf=false",'))}if(d(c(p,"node_modules/.yarn-state.yml"))||e("yarn install",{cwd:p,stdio:"inherit",env:{...process.env,YARN_CHECKSUM_BEHAVIOR:"update"}}),!d(L)||!d(ne))try{e("yarn setup:oss",{cwd:p,stdio:"inherit"})}catch{if(!d(L)||!d(ne))throw new Error("artsy demo: setup:oss did not create keys/metaflags")}let n=c(p,"node_modules/react-native-launch-arguments/package.json");if(d(n)){let r=R(n,"utf8");r.includes('"dist/index.js"')&&g(n,r.replace('"dist/index.js"','"src/index.ts"'))}d(re)||(e("yarn relay",{cwd:p,stdio:"inherit"}),g(re,""))}var ae=[{name:"bluesky",label:"Bluesky",dir:c(_,"github/bluesky"),preferredPort:8082,framework:"expo",command:e=>({cmd:`npx expo start --port ${e}`}),credentials:{envVars:["SOOTSIM_BLUESKY_PASSWORD"],known:{HANDLE:"natew.bsky.social"}}},{name:"3pc",label:"3PunchConvo",dir:c(_,"lightstrike-labs/three-punch-convo-app/apps/one"),preferredPort:8081,framework:"one",command:e=>({cmd:"npx one dev",env:{ONE_PORT:String(e)}})},{name:"uniswap",label:"Uniswap",dir:Ae,preferredPort:8085,framework:"expo",prepare:()=>{Te(),ve()},command:e=>({cmd:`npx expo start --clear --port ${e}`,env:oe()})},{name:"takeout",label:"Takeout",dir:c(_,"takeout"),preferredPort:8086,framework:"one",readyTimeoutMs:24e4,managedPorts:e=>{let t=e-8081;return[5433+t,4848+t,9200+t]},command:e=>({cmd:"bun lite:demo",env:{TAKEOUT_ENV_MODE:"development",PORT_OFFSET:String(e-8081),OREZ_DATA_DIR:`${_}/.cache/sootsim-demo/takeout-orez`,VITE_DEMO_MODE:"1",ZERO_APP_ID:"takeout",ZERO_APP_PUBLICATIONS:"zero_takeout",ZERO_CVR_MAX_CONNS:"4",ZERO_NUM_SYNC_WORKERS:"2",ZERO_UPSTREAM_MAX_CONNS:"8"}})},{name:"expensify",label:"Expensify",dir:c(_,"github/expensify"),preferredPort:8087,framework:"rock",runtimeConfig:{env:B},sidecars:[{name:"web-proxy",port:9e3,readyPath:"/api/Ping",command:()=>({cmd:`bun ${JSON.stringify(pe())}`,env:B})}],command:e=>({cmd:`fnm exec --using=20.20.0 npx rock start --port ${e} --no-interactive`,env:B})},{name:"artsy",label:"Artsy",dir:p,preferredPort:8088,framework:"expo",runtimeConfig:Ge(),prepare:()=>{$e()},command:e=>({cmd:`npx react-native start --port ${e}`}),credentials:{envVars:["SOOTSIM_ARTSY_EMAIL","SOOTSIM_ARTSY_PASSWORD"],note:"auto-login reuses Artsy\u2019s built-in Maestro launch-arguments hook"}},{name:"rainbow",label:"Rainbow",dir:P,preferredPort:8089,framework:"rock",sidecars:[{name:"metadata-proxy",port:F,readyPath:"/health",command:()=>({cmd:`bun ${JSON.stringify(_e())}`,env:{PORT:String(F),RAINBOW_PUBLIC_RPC_URLS:JSON.stringify(ie),RAINBOW_UPSTREAM_METADATA_BASE_URL:I}})}],prepare:()=>{Ye()},command:e=>({cmd:`fnm exec --using=22 yarn start --port ${e} --reset-cache`,env:We()}),credentials:{envVars:["RAINBOW_TEST_WALLET"],optionalEnvVars:["RAINBOW_WALLETCONNECT_PROJECT_ID","WC_PROJECT_ID","IMGIX_DOMAIN","IMGIX_TOKEN"],note:"launcher supplies demo encryption, public mainnet RPC, and a placeholder WalletConnect project id; use only a public throwaway mnemonic for RAINBOW_TEST_WALLET"}},{name:"rocket-chat",label:"Rocket.Chat",dir:c(_,"github/Rocket.Chat.ReactNative"),preferredPort:8093,framework:"expo",command:e=>({cmd:`npx react-native start --port ${e}`,env:{RUNNING_E2E_TESTS:"true"}}),credentials:{envVars:["ROCKET_CHAT_DEMO_SERVER","ROCKET_CHAT_DEMO_USERNAME","ROCKET_CHAT_DEMO_PASSWORD"],known:{SERVER:"https://mobile.qa.rocket.chat"},note:"use packages/sootsim-engine/scripts/rocket-chat-demo-auth.ts to create/login a disposable QA user and print the rocketchat://auth deep link"}},{name:"mattermost",label:"Mattermost",dir:Se,preferredPort:8090,framework:"expo",sidecars:[{name:"preview-server",port:8065,readyPath:"/api/v4/system/ping",command:()=>({cmd:`bun ${JSON.stringify(Ee())}`})}],runtimeConfig:{modules:{"react-native-keychain":!1,"dist/assets/config.json":{inline:{AuthUrlScheme:"mmauth://",AuthUrlSchemeDev:"mmauthbeta://",DefaultServerUrl:"http://localhost:8065",DefaultServerName:"Mattermost Demo",TestServerUrl:"http://localhost:8065",AutoSelectServerUrl:!0,WebsiteURL:"https://mattermost.com",ServerNoticeURL:"https://github.com/mattermost/mattermost-server/blob/master/NOTICE.txt",MobileNoticeURL:"https://github.com/mattermost/mattermost-mobile/blob/master/NOTICE.txt",RudderApiKey:"",SentryEnabled:!1,SentryDsnIos:"",SentryDsnAndroid:"",SentryOptions:{deactivateStacktraceMerging:!0,autoBreadcrumbs:{xhr:!1,console:!0},severityLevelFilter:["fatal"]},ShowReview:!1,ShowOnboarding:!1,ExperimentalNormalizeMarkdownLinks:!1,CustomRequestHeaders:{},CollectNetworkMetrics:!1}}},nativeModules:{RNKeychainManager:{file:Re()},RNUtils:{file:ge()},GenericClient:{file:W()},ApiClient:{file:W()},WebSocketClient:{file:W()}}},command:e=>({cmd:`npx react-native start --host 127.0.0.1 --port ${e}`}),credentials:{known:{SERVER:"http://localhost:8065",USERNAME:"demo",PASSWORD:"DemoPassword1!"},note:"local mattermost-preview seeded through the real REST API; no signup or OTP needed"}},{name:"joplin",label:"Joplin",dir:Ie,preferredPort:8084,framework:"expo",prepare:()=>{be(),we()},command:e=>({cmd:`npx expo start --port ${e}`,env:{BROWSERSLIST_IGNORE_OLD_DATA:"true"}}),credentials:{note:"no login required \u2014 sync.target=0 (None), seed via WelcomeUtils"}}];import{exec as Je}from"child_process";import Ve from"http";import qe from"net";import{promisify as Qe}from"util";var St="/index.bundle?platform=ios&dev=true&hot=true&minify=false";function Fe(e){return/^https?:\/\//i.test(e)}function He(e){return e.endsWith(".bundle")}function je(e){process.env.SOOTSIM_PREVIEW_PROD_BUNDLE&&(e.searchParams.set("dev","false"),e.searchParams.set("minify","true"),e.searchParams.has("hot")&&e.searchParams.set("hot","false"))}function ce(e){try{let t=Fe(e),n=new URL(e,"http://soot.local");return n.pathname=n.pathname.replace(/\.\.bundle$/,".bundle"),He(n.pathname)?(n.searchParams.delete("transform.bytecode"),je(n),t?n.toString():`${n.pathname}${n.search}${n.hash}`):e}catch{return e}}var j=Qe(Je),Xe=250,ze=1500,Ze=120;function et(e,t=Ze){return new Promise(n=>{let r=new qe.Socket,o=!1,a=i=>{o||(o=!0,r.destroy(),n(i))};r.setTimeout(t),r.once("connect",()=>a(!0)),r.once("timeout",()=>a(!1)),r.once("error",()=>a(!1)),r.connect(e,"localhost")})}function b(e,t,n="GET",r=Xe,o={}){return new Promise(a=>{let i=Ve.request({hostname:"localhost",port:e,path:t,method:n,timeout:r,headers:o},s=>{let u="";s.on("data",f=>u+=f.toString());let l=(()=>{let f=s.headers["content-type"];if(typeof f=="string")return f;if(Array.isArray(f))return f[0]})();s.on("end",()=>a({statusCode:s.statusCode||0,body:u,contentType:l}))});i.on("error",()=>a(null)),i.setTimeout(r,()=>{i.destroy(),a(null)}),i.end()})}var tt=[8081,8082,8083,8084,8085,8086,3e3,3001,19e3].map(e=>({port:e,pid:0}));function H(e,t){return!(e<=0||e>=2e4||t.has(e)||e>=5170&&e<=5200)}async function nt(e=[]){let t=new Set(e);try{let{stdout:n}=await j("lsof -iTCP -sTCP:LISTEN -P -n 2>/dev/null | grep -E '^(node|bun)'",{encoding:"utf8",timeout:2e3});if(n.trim()){let r=new Map;for(let o of n.trim().split(`
65
+ `)){let a=o.trim().split(/\s+/);if(a.length<9)continue;let i=Number(a[1]),u=a[8].match(/:(\d+)$/);if(!u)continue;let l=Number(u[1]);H(l,t)&&(r.has(l)||r.set(l,i))}if(r.size>0)return[...r.entries()].map(([o,a])=>({port:o,pid:a}))}}catch{}try{let{stdout:n}=await j(`ss -tlnp 2>/dev/null | grep -E '"(node|bun)"'`,{encoding:"utf8",timeout:2e3});if(n.trim()){let r=new Map;for(let o of n.trim().split(`
66
+ `)){let a=o.match(/:(\d+)\s/),i=o.match(/pid=(\d+)/);if(!a)continue;let s=Number(a[1]),u=i?Number(i[1]):0;H(s,t)&&(r.has(s)||r.set(s,u))}if(r.size>0)return[...r.entries()].map(([o,a])=>({port:o,pid:a}))}}catch{}return tt.filter(n=>H(n.port,t))}var M=new Map;async function rt(e){if(e<=0)return null;let t=M.get(e);if(t)return t;try{let{stdout:n}=await j(`lsof -p ${e} -a -d cwd -Fn 2>/dev/null`,{encoding:"utf8",timeout:1500});for(let r of n.split(`
67
+ `))if(r.startsWith("n")&&r.length>1){let o=r.slice(1).trim();if(o)return M.set(e,o),o}}catch{}return null}function ot(e,t){return{port:e,framework:t,bundleUrl:T(e,`http://localhost:${e}/index.bundle?platform=ios&dev=true&hot=true&minify=false`),hmrUrl:`ws://localhost:${e}/hot`,lastSeen:Date.now()}}function T(e,t){let n=ae.find(o=>o.preferredPort===e),r=n?.runtimeConfig?V(t,n.runtimeConfig):t;return ce(r)}function st(e){return e.includes("/node_modules/one/metro-entry.bundle")}function it(e){try{let t=JSON.parse(e);return t&&typeof t=="object"?t:null}catch{return null}}function k(e,t,n){if(!t)return e;try{let r=JSON.parse(t.body),o=r?.extra?.expoClient||r?.extra||{};o.name&&(e.projectName=o.name),o.ios?.bundleIdentifier&&(e.bundleId=o.ios.bundleIdentifier),e.framework==="metro"&&o.sdkVersion&&(e.framework="expo");let a=r?.launchAsset?.url;a&&!e.patched&&!st(e.bundleUrl)&&(e.bundleUrl=T(e.port,a));let i=o.iconUrl||o.ios?.iconUrl||o.icon||o.ios?.icon;if(i)if(e.iconPath=i,n)if(i.startsWith("http"))e.iconUrl=n(i);else{let s=i.replace(/^\.\//,"");e.iconUrl=n(`http://localhost:${e.port}/assets/${s}`)}else e.iconUrl=i.startsWith("http")?i:`http://localhost:${e.port}/assets/${i.replace(/^\.\//,"")}`}catch{}return e}var E=new Set,A=new Set,w=new Set;async function at(e,t){if(!await et(e))return null;let n="/node_modules/one/metro-entry.bundle?platform=ios&dev=true",[r,o,a,i]=await Promise.all([E.has(e)?Promise.resolve(null):b(e,"/__soot/"),b(e,"/status"),w.has(e)?Promise.resolve(null):b(e,"/","GET",ze,{"expo-platform":"ios"}),A.has(e)?Promise.resolve(null):b(e,"/_expo/status")]);i&&i.statusCode===200?A.delete(e):A.has(e)||A.add(e);let s=a?it(a.body):null,u=typeof s?.launchAsset?.url=="string"?s.launchAsset.url:null,l=s?.extra?.expoClient||s?.extra||{};if(s&&(u||typeof l.name=="string")){E.add(e);let m=u||`http://localhost:${e}/index.bundle?platform=ios&dev=true&hot=true&minify=false`,ue=m.includes("/one/metro-entry.bundle")?"one":"expo";return k({port:e,framework:ue,bundleUrl:T(e,m),hmrUrl:`ws://localhost:${e}/hot`,lastSeen:Date.now()},a,t)}if(o&&o.body.includes("packager-status:running"))return E.add(e),k(ot(e,i&&i.statusCode===200?"expo":"metro"),a,t);if(r&&r.statusCode===200&&r.body.includes("sootsim-patched"))return E.delete(e),k({port:e,framework:"one",bundleUrl:T(e,`http://localhost:${e}/__soot/bundle.js`),hmrUrl:`ws://localhost:${e}/hot`,lastSeen:Date.now(),patched:!0},a,t);let f=await b(e,n,"HEAD");return f&&f.statusCode>0&&f.statusCode<400&&/application\/javascript/i.test(f.contentType||"")?(E.add(e),w.add(e),k({port:e,framework:"one",bundleUrl:T(e,`http://localhost:${e}${n}&minify=false`),hmrUrl:`ws://localhost:${e}/hot`,lastSeen:Date.now()},a,t)):(E.add(e),null)}function ct(e){let t=e.projectName?.trim().toLowerCase();return!!(t==="soot"||t==="sootsim"||e.bundleId?.trim().toLowerCase()?.startsWith("dev.soot"))}var U=new Map,ut=3e4,dt=1500;function lt(e){return!e||e.framework==="metro"||e.framework==="unknown"}function ft(e){return e?T(e.port,e.bundleUrl)===e.bundleUrl:!0}function mt(e,t,n=Date.now()){if(t===0||e.pid!==t||!ft(e.result))return!1;let r=n-e.cachedAt;return!(e.result===null&&r>=ut||lt(e.result)&&r>=dt)}async function bt(e={}){let t=await nt(e.excludePorts),n=new Set(t.map(s=>s.port));for(let s of[...U.keys()])n.has(s)||U.delete(s);for(let s of[...E])n.has(s)||E.delete(s);for(let s of[...A])n.has(s)||A.delete(s);for(let s of[...w])n.has(s)||w.delete(s);let r=[],o=[];for(let{port:s,pid:u}of t){let l=U.get(s);if(l&&mt(l,u)){l.result&&r.push(l.result);continue}l&&l.pid!==u&&(E.delete(s),A.delete(s),w.delete(s)),o.push({port:s,pid:u})}o.length>0&&(await Promise.all(o.map(u=>at(u.port,e.buildIconProxyUrl)))).forEach((u,l)=>{let{port:f,pid:m}=o[l];m!==0&&U.set(f,{pid:m,result:u,cachedAt:Date.now()}),u&&r.push(u)});let a=new Map;for(let{port:s,pid:u}of t)u>0&&a.set(s,u);await Promise.all(r.map(async s=>{let u=a.get(s.port);if(!u)return;s.pid=u;let l=await rt(u);l&&(s.cwd=l)}));let i=new Set(a.values());for(let s of[...M.keys()])i.has(s)||M.delete(s);return r.filter(s=>!ct(s))}export{V as a,St as b,ce as c,ae as d,at as e,bt as f};
@@ -1,5 +1,5 @@
1
- /*! sootsim v0.1.93 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{D as A,k as _,l as h,m as v,n as S}from"./chunk-BXZDXBUA.js";import{d as y,h as B,i as E}from"./chunk-JLFCHU45.js";var W={timeoutMs:1800,settleMs:48,startWindowMs:64};function p(e){return new Promise(t=>setTimeout(t,e))}function J(e){return e.includes("--json")}function Y(e){process.stdout.write(`${JSON.stringify(e??null,null,2)}
1
+ /*! sootsim v0.1.95 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
+ import{D as A,k as _,l as h,m as v,n as S}from"./chunk-G4ZC5446.js";import{d as y,h as B,i as E}from"./chunk-FQ3XGA7P.js";var W={timeoutMs:1800,settleMs:48,startWindowMs:64};function p(e){return new Promise(t=>setTimeout(t,e))}function J(e){return e.includes("--json")}function Y(e){process.stdout.write(`${JSON.stringify(e??null,null,2)}
3
3
  `)}function U(e){process.stderr.write(`${e}
4
4
  `)}function $(e,t=Date.now()){let r=new Date(e),n=`${b(r.getHours())}:${b(r.getMinutes())}:${b(r.getSeconds())}`,s=t-e;if(s<0)return n;let o=Math.round(s/1e3);return o<60?`${n} +${o}s`:o<3600?`${n} +${Math.round(o/60)}m`:o<86400?`${n} +${Math.round(o/3600)}h`:`${n} +${Math.round(o/86400)}d`}function b(e){return e<10?`0${e}`:String(e)}async function D(e,t,...r){return B(e,`__sootsimTest.${t}`,...r)}async function q(e,t,...r){return E(e,`SootSim.bridges.mainShell.${t}`,...r)}async function z(e,t={}){try{let r=await D(e,"waitForScreenTransitions",W);if(!t.verbose||!r?.started)return;if(r.timedOut){console.log(` screen transition still active after ${r.waitedMs}ms; continuing`);return}r.waitedMs>0&&console.log(` waited ${r.waitedMs}ms for screen transition settle`)}catch{}}async function K(e,t,r,...n){let s=Date.now()+Math.max(0,r);for(;;)try{return await q(e,t,...n)}catch(o){if(!A(o)||Date.now()>=s)throw o;await p(50)}}async function Q(e,t,r,n={}){let s=n.attempts??30,o=n.intervalMs??500,l=n.minNodeCount??10;for(let a=0;a<s;a++){let u=y(e,{commandTimeoutMs:t,simId:r,simIdSource:n.simIdSource});try{let c=await u.send({type:"evaluate",code:"(async () => (await window.__sootsimTest?.getNodeCount()) || 0)()"});if(typeof c=="number"&&c>l)return{bridge:u,count:c}}catch{}u.close(),await p(o)}return null}async function V(e,t,r,n={}){let s=n.timeoutMs??8e3,o=n.intervalMs??250,l=Date.now()+s;for(;Date.now()<l;){let a=y(e,{commandTimeoutMs:t,simId:r,simIdSource:n.simIdSource});try{return await a.send({type:"evaluate",code:"1"}),a}catch{a.close()}await p(o)}return null}async function X(e,t={}){let r=t.timeoutMs??1e4,n=t.errorGraceMs??3e3,s=t.pollIntervalMs??200,o=Date.now(),l=o+r,a=-1,u=o,c=null,m=!1,d={ready:!1,source:"timeout",elapsedMs:0,nodes:0,targets:0,flag:void 0,loadingText:"",externalReady:null,externalStatus:"",externalError:"",errors:0};for(;Date.now()<l;){try{let i=await e.send({type:"evaluate",code:_}),f=Date.now()-o,g=Number(i?.nodes)||0,x=Number(i?.targets)||0,C=Number(i?.errors)||0,T=i?.flag===!0,w=i?.externalReady,P=typeof i?.loadingText=="string"?i.loadingText.trim():"",N=typeof i?.externalStatus=="string"?i.externalStatus.trim():"",R=typeof i?.externalError=="string"?i.externalError.trim():"",M=typeof i?.externalError=="string"&&R.length>0;if(c=w,m=M,g!==a&&(a=g,u=f),d={ready:!1,source:"timeout",elapsedMs:f,nodes:g,targets:x,flag:i?.flag,loadingText:P,externalReady:typeof w=="boolean"?w:null,externalStatus:N,externalError:R,errors:C},T&&w!==!1&&!M&&g>=h&&S({nodes:g,targets:x})&&f-u>=v)return{...d,ready:!0,source:"flag"};if(f>=n&&C>0&&!T)return{...d,ready:!1,source:"error-bail"}}catch{}await p(s)}return c!==!1&&!m&&d.nodes>=h&&S(d)?{...d,ready:!0,source:"nodes-fallback"}:{...d,ready:!1,source:"timeout",elapsedMs:Date.now()-o}}function k(e){let t=e.displayUrl||e.url;return e.status!=null?`${e.method} ${t} -> ${e.status}${e.statusText?` ${e.statusText}`:""}`:e.error?`${e.method} ${t} -> ${e.error}`:`${e.method} ${t}`}async function I(e,t,...r){return e.send({type:"call",path:`__sootsimTest.${t}`,args:r})}async function O(e,t={}){let r=await e.send({type:"evaluate",code:"window.__sootsimConsole?.count?.() || { errors: 0, warnings: 0, total: 0 }"});if(!r||typeof r!="object")return;let n=Math.max(0,Number(r.errors)||0),s=Math.max(0,Number(r.warnings)||0);if(n===0&&s===0)return;let o=[];if(n>0&&o.push(`${n} console error${n===1?"":"s"}`),s>0&&o.push(`${s} console warning${s===1?"":"s"}`),console.log(`
5
5
  console: ${o.join(", ")}`),t.errorsCommand&&console.log(` inspect: ${t.errorsCommand}`),s>0&&t.warningsCommand&&console.log(` inspect: ${t.warningsCommand}`),!t.includeTail||n===0)return;let l=await e.send({type:"evaluate",code:"window.__sootsimConsole?.getErrors?.(5) || []"});if(!(!Array.isArray(l)||l.length===0)){console.log(`
@@ -1,2 +1,2 @@
1
- /*! sootsim v0.1.93 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.95 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  import{readFileSync as i}from"node:fs";import{fileURLToPath as e}from"node:url";var r=null;function l(){if(r!=null)return r;let o=[()=>e(import.meta.resolve("sootsim/package.json")),()=>e(new URL("../package.json",import.meta.url))];for(let n of o)try{let t=JSON.parse(i(n(),"utf8")).version;if(typeof t=="string"&&t)return r=t,r}catch{}return r="0.0.0",r}export{l as a};
@@ -1,5 +1,5 @@
1
- /*! sootsim v0.1.93 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{a as Ie}from"./chunk-C343OFIG.js";import{a as Ae}from"./chunk-WTUKAQUP.js";import{a as Pe}from"./chunk-IAR2LAOG.js";import{a as V,b as he,c as ge,d as Z,e as ee,f as ye,g as te,i as ie,j as be,k as Me}from"./chunk-D62KWBZG.js";import{f as Te,m as Fe,o as $e,s as ke}from"./chunk-4DUFZAOO.js";import{d as ve,f as Se}from"./chunk-IQJE2PBU.js";import{m as we}from"./chunk-CCKZR7BU.js";import{c as X,d as Q,e as pe}from"./chunk-JLFCHU45.js";import{c as Y}from"./chunk-WPPSP6UG.js";import{a as xe}from"./chunk-TRS52XH4.js";import{a as me,b as G}from"./chunk-M5P3ULHQ.js";import{f as fe}from"./chunk-W5ET7GSK.js";import*as A from"fs";import{tmpdir as De}from"os";import*as y from"path";import*as g from"fs";import*as w from"path";var L=1e4,B=393,C=852,Ee="__sootsimCliPerf",Ke="maestroCopiedText",_e=new Map;function f(o){return new Promise(e=>setTimeout(e,o))}function Je(o){return o?w.basename(o)===".maestro"?w.dirname(o):o:process.cwd()}function He(o,e,t){let i=e.endsWith(".png")?e:`${e}.png`;if(w.isAbsolute(i))return i;if(t.mode==="flow"&&/[\\/]/.test(i)){let r=i.startsWith("./")||i.startsWith("../")?t.flowDir??process.cwd():Je(t.flowDir);return w.resolve(r,i)}return w.join(o,i)}function qe(o){if(typeof o=="string")return{path:o,withFrame:!1};let e=o.path?.trim()||o.name?.trim();if(!e)throw new Error("takeScreenshot object form requires path or name");return{path:e,withFrame:o.withFrame===!0,layers:o.layers}}function re(o){let[e,t]=o.split(",").map(r=>r.trim()),i=(r,n)=>r.endsWith("%")?Number.parseFloat(r)/100*n:Number.parseFloat(r);return{x:i(e,B),y:i(t,C)}}function ze(o){let e=o.split(/^---$/m),t=e.length>1?e[e.length-1]:o,i=ge(he.parse(t),_e);return Array.isArray(i)?i:[]}var W=class{constructor(e,t){this.bridge=e;this.opts=t}stepDelay=0;firstLaunchDone=!1;profilingEnabled=!1;recordingEnabled=!1;recordingAccessChecked=!1;recordingStartedAtMs=null;lastRecordingDurationMs=null;simRouteHint=null;lastFailedStep=null;get simId(){return this.opts.simId}setSimRouteHint(e){this.simRouteHint=this.normalizeSimRoute(e)}normalizeSimRoute(e){if(!e)return null;try{let t=new URL(e);t.searchParams.delete("inspectOpen");let i=t.searchParams.toString();return`${t.origin}${t.pathname}${i?`?${i}`:""}`}catch{return e}}async refreshSimId(){if(this.opts.simId)try{let e=await this.bridge.listSims(),t=e.find(a=>a.id===this.opts.simId);if(t&&(this.simRouteHint=this.normalizeSimRoute(t.url||t.origin)),e.find(a=>a.id===this.opts.simId&&a.readyState==="open")||!this.simRouteHint)return;let r=this.simRouteHint&&e.find(a=>a.readyState==="open"&&this.normalizeSimRoute(a.url||a.origin)===this.simRouteHint);if(!r)return;let n=e.find(a=>a.isPrimary&&a.readyState==="open"),s=e.find(a=>a.readyState==="open"),l=r??n??s;l&&(this.opts.simId=l.id,console.log(` [flow] sim rotated to ${l.id}`))}catch{}}async evaluate(e,t){return this.bridge.send({type:"evaluate",simId:this.opts.simId,code:e},t?{timeoutMs:t}:void 0)}async callTest(e,...t){return this.bridge.send({type:"call",simId:this.opts.simId,path:`__sootsimTest.${e}`,args:t})}async waitForTree(e=L){let t=Date.now()+e,i=Date.now(),r=null,n=0,s=0;for(;Date.now()<t;){try{let a=await this.evaluate(`(async () => {
1
+ /*! sootsim v0.1.95 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
+ import{a as Ie}from"./chunk-UX5X4MCF.js";import{a as Ae}from"./chunk-IZST5V65.js";import{a as Pe}from"./chunk-4MQ6YXQS.js";import{a as V,b as he,c as ge,d as Z,e as ee,f as ye,g as te,i as ie,j as be,k as Me}from"./chunk-QCP4NBOQ.js";import{f as Te,m as Fe,o as $e,s as ke}from"./chunk-W2J5AS5G.js";import{d as ve,f as Se}from"./chunk-LC46VXFM.js";import{m as we}from"./chunk-LJAA2AIH.js";import{c as X,d as Q,e as pe}from"./chunk-FQ3XGA7P.js";import{c as Y}from"./chunk-5VJVM63B.js";import{a as xe}from"./chunk-75ETPOPS.js";import{a as me,b as G}from"./chunk-D7E2T6EK.js";import{f as fe}from"./chunk-G4UGGSGJ.js";import*as A from"fs";import{tmpdir as De}from"os";import*as y from"path";import*as g from"fs";import*as w from"path";var L=1e4,B=393,C=852,Ee="__sootsimCliPerf",Ke="maestroCopiedText",_e=new Map;function f(o){return new Promise(e=>setTimeout(e,o))}function Je(o){return o?w.basename(o)===".maestro"?w.dirname(o):o:process.cwd()}function He(o,e,t){let i=e.endsWith(".png")?e:`${e}.png`;if(w.isAbsolute(i))return i;if(t.mode==="flow"&&/[\\/]/.test(i)){let r=i.startsWith("./")||i.startsWith("../")?t.flowDir??process.cwd():Je(t.flowDir);return w.resolve(r,i)}return w.join(o,i)}function qe(o){if(typeof o=="string")return{path:o,withFrame:!1};let e=o.path?.trim()||o.name?.trim();if(!e)throw new Error("takeScreenshot object form requires path or name");return{path:e,withFrame:o.withFrame===!0,layers:o.layers}}function re(o){let[e,t]=o.split(",").map(r=>r.trim()),i=(r,n)=>r.endsWith("%")?Number.parseFloat(r)/100*n:Number.parseFloat(r);return{x:i(e,B),y:i(t,C)}}function ze(o){let e=o.split(/^---$/m),t=e.length>1?e[e.length-1]:o,i=ge(he.parse(t),_e);return Array.isArray(i)?i:[]}var W=class{constructor(e,t){this.bridge=e;this.opts=t}stepDelay=0;firstLaunchDone=!1;profilingEnabled=!1;recordingEnabled=!1;recordingAccessChecked=!1;recordingStartedAtMs=null;lastRecordingDurationMs=null;simRouteHint=null;lastFailedStep=null;get simId(){return this.opts.simId}setSimRouteHint(e){this.simRouteHint=this.normalizeSimRoute(e)}normalizeSimRoute(e){if(!e)return null;try{let t=new URL(e);t.searchParams.delete("inspectOpen");let i=t.searchParams.toString();return`${t.origin}${t.pathname}${i?`?${i}`:""}`}catch{return e}}async refreshSimId(){if(this.opts.simId)try{let e=await this.bridge.listSims(),t=e.find(a=>a.id===this.opts.simId);if(t&&(this.simRouteHint=this.normalizeSimRoute(t.url||t.origin)),e.find(a=>a.id===this.opts.simId&&a.readyState==="open")||!this.simRouteHint)return;let r=this.simRouteHint&&e.find(a=>a.readyState==="open"&&this.normalizeSimRoute(a.url||a.origin)===this.simRouteHint);if(!r)return;let n=e.find(a=>a.isPrimary&&a.readyState==="open"),s=e.find(a=>a.readyState==="open"),l=r??n??s;l&&(this.opts.simId=l.id,console.log(` [flow] sim rotated to ${l.id}`))}catch{}}async evaluate(e,t){return this.bridge.send({type:"evaluate",simId:this.opts.simId,code:e},t?{timeoutMs:t}:void 0)}async callTest(e,...t){return this.bridge.send({type:"call",simId:this.opts.simId,path:`__sootsimTest.${e}`,args:t})}async waitForTree(e=L){let t=Date.now()+e,i=Date.now(),r=null,n=0,s=0;for(;Date.now()<t;){try{let a=await this.evaluate(`(async () => {
3
3
  const test = window.__sootsimTest
4
4
  if (!test) return { count: 0, loading: true }
5
5
  const count = (await test.getNodeCount?.()) || 0
@@ -370,7 +370,7 @@ flow extension:
370
370
  + completed (${M.length} steps)`),d>0&&console.log(` screenshots: ${d} \u2192 ${s}`),I&&Ce(I),S&&console.log(` video: ${S}`),console.log()}catch(u){if(i&&!I)try{I=await c.stopProfile()}catch{}if(T&&!S)try{S=await c.stopRecording(),_=c.getLastRecordingDurationMs()}catch(d){console.warn(` recording stop failed: ${d?.message||String(d)}`)}console.error(`
371
371
  x failed: ${u.message}
372
372
  `),I&&(console.log(" partial profile:"),Ce(I)),S&&console.log(` partial video: ${S}`);try{let d=c.lastFailedStep,h=d?`step-${String(d.index+1).padStart(2,"0")}-${d.kind}`:"unstaged",R=y.join(s,h);await c.captureFailureBundle(R,{error:u,stepIndex:d?.index,stepKind:d?.kind,stepTarget:d?.target}),console.log(` failure bundle: ${R}`),console.log(" (contents: screenshot.png, describe.json, a11y.txt, tree.txt, console.json, error.json)")}catch(d){try{let h=y.join(s,"error.png");await c.captureFailureScreenshot(h),console.log(` error screenshot: ${h}`)}catch{}console.log(` (failure bundle capture failed: ${d instanceof Error?d.message:String(d)})`)}await we($,{errorsCommand:`sootsim get errors 5${c.simId?` --sim ${c.simId}`:""}`,warningsCommand:`sootsim get warnings 5${c.simId?` --sim ${c.simId}`:""}`,requestsCommand:`sootsim get requests 5${c.simId?` --sim ${c.simId}`:""}`}),O=1}finally{$.close()}if(O===0&&v)try{let u=await Qe(z??[]),d=["--origin",U,"--events",u];oe&&d.push("--public-origin",oe),S&&d.push("--video",S),S&&_&&Number.isFinite(_)&&d.push("--video-duration-ms",String(Math.round(_))),c.simId&&d.push("--sim",c.simId),Re&&d.push("--open"),console.log(`
373
- preparing preview upload\u2026`);let{runUpload:h}=await import("./upload-AJURIKDZ.js");await h(d,{})}catch(u){console.error(` preview upload failed: ${u?.message||u}`),O=1}return J&&(c.simId&&H.add(c.simId),await Xe(b.wsPort,b.commandTimeoutMs,[...H])),await G(),O}async function Xe(o,e,t){let i=[...new Set(t.filter(Boolean))];if(i.length===0)return;let r=Q(o,{commandTimeoutMs:e});try{let n=await r.listSims(),s=i.filter(a=>n.some(m=>m.id===a&&m.readyState==="open"));if(s.length===0)return;let l=await ke(r,o,e,s);await Fe(n,s),l.closed.length>0&&console.log(` closed flow sim(s): ${l.closed.join(", ")}`),l.remaining.length>0&&console.warn(` warn: flow sim(s) still connected after close: ${l.remaining.join(", ")}`)}catch(n){console.warn(` warn: failed to close flow sim(s): ${n instanceof Error?n.message:String(n)}`)}finally{r.close()}}async function Qe(o){let{gzipSync:e}=await import("zlib"),t=o.map(n=>JSON.stringify(n)).join(`
373
+ preparing preview upload\u2026`);let{runUpload:h}=await import("./upload-SP3SF6ZK.js");await h(d,{})}catch(u){console.error(` preview upload failed: ${u?.message||u}`),O=1}return J&&(c.simId&&H.add(c.simId),await Xe(b.wsPort,b.commandTimeoutMs,[...H])),await G(),O}async function Xe(o,e,t){let i=[...new Set(t.filter(Boolean))];if(i.length===0)return;let r=Q(o,{commandTimeoutMs:e});try{let n=await r.listSims(),s=i.filter(a=>n.some(m=>m.id===a&&m.readyState==="open"));if(s.length===0)return;let l=await ke(r,o,e,s);await Fe(n,s),l.closed.length>0&&console.log(` closed flow sim(s): ${l.closed.join(", ")}`),l.remaining.length>0&&console.warn(` warn: flow sim(s) still connected after close: ${l.remaining.join(", ")}`)}catch(n){console.warn(` warn: failed to close flow sim(s): ${n instanceof Error?n.message:String(n)}`)}finally{r.close()}}async function Qe(o){let{gzipSync:e}=await import("zlib"),t=o.map(n=>JSON.stringify(n)).join(`
374
374
  `)+(o.length?`
375
375
  `:""),i=e(Buffer.from(t,"utf8")),r=y.join(De(),`sootsim-events-${Date.now()}.jsonl.gz`);return A.writeFileSync(r,i),console.log(` events: ${o.length} written to ${r} (${i.length} bytes gz)`),r}async function Ze(o){let e=o[0],t=i=>o.find((r,n)=>o[n-1]===i);switch(e){case"start":{let{path:i,state:r}=ye();console.log(" flow draft started"),console.log(` session: ${i}`),console.log(` steps: ${r.steps.length}`);return}case"keep":case"good":{let i=ie();if(i.active||(console.error(" no active flow draft \u2014 run `sootsim flow start` first"),process.exit(1)),!i.kept){console.log(" no pending action to keep");return}console.log(` kept: ${i.candidate.summary}`),console.log(` steps: ${i.stepCount}`);return}case"end":{let i=t("--output")||(o[1]&&!o[1].startsWith("-")?o[1]:void 0),r=o.includes("--validate")||o.includes("--video"),n=o.includes("--video"),s=ie();s.active&&s.kept&&console.log(` auto-kept trailing action: ${s.candidate.summary}`);let l=be(i||(r?tt():void 0));if(l.active||(console.error(" no active flow draft \u2014 run `sootsim flow start` first"),process.exit(1)),!l.valid){console.error(" flow draft is not valid:");for(let a of l.issues)console.error(` - ${a}`);console.error(" draft preserved \u2014 keep at least one real interaction or run `sootsim flow start` to reset"),process.exit(1)}if(r){let a=it(o,l.outputPath),m=await Oe(a);if(m!==0){console.error(`
376
376
  validation failed \u2014 draft preserved so you can keep iterating`),process.exitCode=m;return}te(),console.log(` flow draft validated (${l.stepCount} step${l.stepCount===1?"":"s"})`),l.outputPath&&console.log(` saved: ${l.outputPath}`),n&&console.log(" video: recorded during validation run");return}if(te(),console.log(` flow draft ended (${l.stepCount} step${l.stepCount===1?"":"s"})`),l.outputPath){console.log(` saved: ${l.outputPath}`),console.log(` next: sootsim flow ${l.outputPath} --record`);return}console.log(""),process.stdout.write(l.yaml);return}case"validate":{let i=o[1];(!i||i.startsWith("-"))&&(console.error(" usage: sootsim flow validate <path>"),process.exit(1));let r=ee(i);if(r.length>0){console.error(` x ${i} failed validation:`);for(let n of r)console.error(` - ${n}`);process.exit(1)}console.log(` + ${i} looks valid`);return}}}function et(o){return o[0]==="--sim"&&o.length>=2?[...o.slice(2),"--sim",o[1]]:o}async function Ft(o){let e=et(o),t=e[0];if(t==="start"||t==="keep"||t==="good"||t==="end"||t==="validate")return await Ze(e),0;let i=await Oe(e);return i!==0&&(process.exitCode=i),i}function Ce(o){let e=o.avgMs>0?(1e3/o.avgMs).toFixed(1):"?",t=o.sampleCount>0?(o.jankFrames/o.sampleCount*100).toFixed(1):"0";console.log(`
@@ -1,2 +1,2 @@
1
- /*! sootsim v0.1.93 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.95 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  var t=!0,e="1.0.0",o="public beta",n=`${o} \xB7 free until ${e}`,r="free for everyone until 1.0 \u2014 we send anonymous error and dependency data while you use it";export{t as a,e as b,o as c,n as d,r as e};
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.93 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.95 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
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
3
  ${o}
4
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};
@@ -1,5 +1,5 @@
1
- /*! sootsim v0.1.93 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{c as i,e as d,h as c}from"./chunk-JLFCHU45.js";function g(r){let e=r[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(r,e,t){let l=i(r,{port:e.port}),s=g(l.positional),a=d({...l,commandTimeoutMs:5e3});try{let n=!!(await c(a,"SootSim.bridges.settings.get"))?.[t.modeKey],o=s==="on"?!0:s==="off"?!1:!n;if(n===o)return console.log(` ${t.displayName}: already ${o?"on":"off"}`),{current:n,target:o,changed:!1};if(!await a.send({type:"evaluate",acquireLock:!0,code:`(async () => {
1
+ /*! sootsim v0.1.95 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
+ import{c as i,e as d,h as c}from"./chunk-FQ3XGA7P.js";function g(r){let e=r[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(r,e,t){let l=i(r,{port:e.port}),s=g(l.positional),a=d({...l,commandTimeoutMs:5e3});try{let n=!!(await c(a,"SootSim.bridges.settings.get"))?.[t.modeKey],o=s==="on"?!0:s==="off"?!1:!n;if(n===o)return console.log(` ${t.displayName}: already ${o?"on":"off"}`),{current:n,target:o,changed:!1};if(!await a.send({type:"evaluate",acquireLock:!0,code:`(async () => {
3
3
  const modeKey = ${JSON.stringify(t.modeKey)}
4
4
  const target = ${JSON.stringify(o)}
5
5
  window.dispatchEvent(new CustomEvent('sootsim:shell-command', {
@@ -1,5 +1,5 @@
1
- /*! sootsim v0.1.93 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{b as Ns}from"./chunk-EOEORGPV.js";var ui=`(async () => {
1
+ /*! sootsim v0.1.95 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
+ import{b as Ns}from"./chunk-3ELUS6PR.js";var ui=`(async () => {
3
3
  try { localStorage.clear() } catch {}
4
4
  try { sessionStorage.clear() } catch {}
5
5
  try {
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.93 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{a as R}from"./chunk-XFBHJCF3.js";import{l as D}from"./chunk-M4QXOCCY.js";import{a as T}from"./chunk-EOEORGPV.js";function Y(e){if(!e||typeof e!="object")return!1;let t=e;return typeof t.type=="string"&&typeof t.ts=="number"}function I(e){let t=e.trim();if(!t)return null;try{let r=JSON.parse(t);return Y(r)?r:null}catch{return null}}import{randomBytes as G,createHash as q}from"node:crypto";import m from"node:fs";import y from"node:path";var N=null;function _(){if(N)return N;let e=process.env.SOOTSIM_USER_DATA_DIR;return e||D()}function h(){return _()}function U(){return y.join(_(),"attached-projects.json")}function $(){return{version:1,attachedProjects:[],previewAttachments:[],agentSessions:[]}}function S(){let e=U(),t;try{t=m.readFileSync(e,"utf8")}catch(r){if(r.code==="ENOENT")return $();throw r}try{let r=JSON.parse(t);if(!r||typeof r!="object")throw new Error("not an object");return{version:1,attachedProjects:Array.isArray(r.attachedProjects)?r.attachedProjects:[],previewAttachments:Array.isArray(r.previewAttachments)?r.previewAttachments:[],agentSessions:Array.isArray(r.agentSessions)?r.agentSessions:[]}}catch(r){let n=`${e}.corrupt-${Date.now()}`;try{m.renameSync(e,n),console.warn(`[sootsim] attached-projects.json was unparseable; quarantined to ${n}. original error: ${r.message}`)}catch{}return $()}}function X(e){let t=U();m.mkdirSync(y.dirname(t),{recursive:!0});let r=`${t}.tmp-${process.pid}-${Date.now()}`,n=m.openSync(r,"w",384);try{m.writeFileSync(n,JSON.stringify(e,null,2)),m.fsyncSync(n)}finally{m.closeSync(n)}m.renameSync(r,t)}function w(e){let t=S();return e(t),X(t),t}function B(e){return q("sha256").update(y.resolve(e)).digest("hex").slice(0,16)}function K(){return`s_${G(10).toString("hex")}`}function ge(e){let t=y.resolve(e.cwd),r=B(t),n;return w(o=>{let s=o.attachedProjects.find(c=>c.id===r);if(s){let c={...s,...e,id:r,cwd:t,sourceRoots:e.sourceRoots??s.sourceRoots,knownBundleUrls:e.knownBundleUrls??s.knownBundleUrls,pinnedSourceResolutions:e.pinnedSourceResolutions??s.pinnedSourceResolutions,telemetry:e.telemetry??s.telemetry,updatedAt:Date.now(),createdAt:s.createdAt},g=o.attachedProjects.indexOf(s);o.attachedProjects[g]=c,n=c;return}let a=Date.now(),d={id:r,name:e.name??y.basename(t),cwd:t,repoRoot:e.repoRoot,sourceRoots:e.sourceRoots??[t],framework:e.framework??"unknown",bundleId:e.bundleId,knownBundleUrls:e.knownBundleUrls??[],preferredProvider:e.preferredProvider??"codex",preferredTransport:e.preferredTransport??"tmux",editorOpenCommand:e.editorOpenCommand,moshiWebhookToken:e.moshiWebhookToken,pinnedSourceResolutions:e.pinnedSourceResolutions??{},isolateDiscovery:e.isolateDiscovery,git:e.git,telemetry:e.telemetry??{lastOpened:0,runsCompleted:0},createdAt:a,updatedAt:a};o.attachedProjects.push(d),n=d}),n}function F(e){return S().attachedProjects.find(t=>t.id===e)??null}function ye(){return S().attachedProjects}var Q=336*60*60*1e3;function he(e,t={}){w(r=>{let n=r.attachedProjects.find(s=>s.id===e);if(!n)return;let o=t.ts??Date.now();if(n.telemetry.runsCompleted=(n.telemetry.runsCompleted??0)+1,typeof t.usd=="number"&&Number.isFinite(t.usd)&&t.usd>=0){let s=n.telemetry.costHistory??[],a=o-Q,d=s.filter(c=>c.ts>=a);d.push({ts:o,usd:t.usd}),n.telemetry.costHistory=d}n.updatedAt=o})}function Se(e,t=Date.now()){let r=t-6048e5,n=e.telemetry.costHistory??[],o=0;for(let s of n)s.ts>=r&&(o+=s.usd);return o}function we(e){w(t=>{t.attachedProjects=t.attachedProjects.filter(r=>r.id!==e),t.agentSessions=t.agentSessions.filter(r=>r.projectId!==e),t.previewAttachments=t.previewAttachments.filter(r=>r.projectId!==e)})}function M(e){let t;return w(r=>{if(e.id){let a=r.agentSessions.find(d=>d.id===e.id);if(a){let d={...a,...e,lastSeenAt:Date.now()},c=r.agentSessions.indexOf(a);r.agentSessions[c]=d,t=d;return}}let n=r.attachedProjects.find(a=>a.id===e.projectId);if(!n)throw new Error(`upsertSession: no AttachedProject with id=${e.projectId}`);let o=Date.now(),s={id:e.id??K(),projectId:e.projectId,provider:e.provider,transport:e.transport??n.preferredTransport,cwd:e.cwd??n.cwd,claudeSessionUuid:e.claudeSessionUuid,tmuxSessionName:e.tmuxSessionName,wrapperPid:e.wrapperPid,status:e.status??"idle",needsAttention:e.needsAttention??!1,lastPrompt:e.lastPrompt,lastSummary:e.lastSummary,lastTurnFiles:e.lastTurnFiles,currentlyEditing:e.currentlyEditing,lastSeenAt:o,createdAt:o};r.agentSessions.push(s),t=s}),t}function k(e){return S().agentSessions.find(t=>t.id===e)??null}function C(e){let t=S().agentSessions;return e?t.filter(r=>r.projectId===e):t}function v(e,t){w(r=>{let n=r.agentSessions.find(s=>s.id===e);if(!n)return;let o=r.agentSessions.indexOf(n);r.agentSessions[o]={...n,...t,id:n.id,projectId:n.projectId,createdAt:n.createdAt,lastSeenAt:Date.now()}})}async function ve(){if(S().attachedProjects.length>0)return;let t;try{t=(await import("sootsim/scripts/demo-app-registry")).APPS}catch(n){console.warn("[sootsim] seedFromDemoAppRegistry: could not load demo registry:",n.message);return}if(!Array.isArray(t))return;let r=t;w(n=>{for(let o of r){if(!m.existsSync(o.dir))continue;let s=y.resolve(o.dir),a=B(s);if(n.attachedProjects.some(c=>c.id===a))continue;let d=Date.now();n.attachedProjects.push({id:a,name:o.label,cwd:s,sourceRoots:[s],framework:o.framework,knownBundleUrls:[`http://localhost:${o.preferredPort}/index.bundle`],preferredProvider:"codex",preferredTransport:"tmux",pinnedSourceResolutions:{},telemetry:{lastOpened:0,runsCompleted:0},createdAt:d,updatedAt:d})}})}import{spawn as V,spawnSync as z}from"node:child_process";import{randomUUID as Z}from"node:crypto";import i,{constants as f}from"node:fs";import u from"node:path";import ee from"node:readline";function j(e){return u.join(h(),"sessions",e)}function W(e){return u.join(j(e),"prompt.in")}function J(e){return u.join(j(e),"events.out")}function te(e){return u.join(h(),"transcripts",`${e}.log`)}function O(e,t){if(!e)return!1;try{process.kill(e,0)}catch{return!1}return!(t&&!i.existsSync(j(t)))}function re(){if(process.env.SOOTSIM_BIN)return{cmd:process.env.SOOTSIM_BIN,prefixArgs:[]};if(process.versions.electron){let n=process.resourcesPath;if(n){let o=[u.join(n,"bin","sootsim"),u.join(n,"bin",`sootsim-${process.platform}-${process.arch}`)];for(let s of o)if(i.existsSync(s))return{cmd:s,prefixArgs:[]}}}let e=ne();if(e)return e;let t=process.argv[0],r=process.argv[1];if(r&&/\.(ts|tsx|mjs|cjs|js)$/.test(r))return{cmd:t,prefixArgs:[r]};if(!r||r.includes("/.bin/"))throw new Error("sootsim CLI not found. set SOOTSIM_BIN to the path of the sootsim binary, or build the workspace CLI via `bun run --cwd packages/sootsim build:cli`.");return{cmd:t,prefixArgs:[]}}function ne(){try{let e=se();if(!e)return null;let t=`sootsim-${process.platform}-${process.arch}`,r=u.join(e,"dist-bin",t);if(i.existsSync(r))return{cmd:r,prefixArgs:[]};let n=u.join(e,"dist-cli","bin.js");if(i.existsSync(n)){try{let o=u.join(e,"cli","commands","agent-wrapper.ts");if(i.existsSync(o)){let s=i.statSync(o).mtimeMs;i.statSync(n).mtimeMs<s&&console.warn("[sootsim] dist-cli/bin.js is older than agent-wrapper.ts \u2014 rebuild with `bun run --cwd packages/sootsim build:cli` (watch:cli:binary builds dist-bin/ instead).")}}catch{}return{cmd:process.execPath,prefixArgs:[n]}}return null}catch{return null}}function se(){try{let r=T.resolve("sootsim/package.json");return u.dirname(r)}catch{}let e=oe();if(!e)return null;let t=u.dirname(e);for(let r=0;r<8;r++){let n=u.join(t,"package.json");try{if(i.existsSync(n)&&JSON.parse(i.readFileSync(n,"utf8")).name==="sootsim")return t}catch{}let o=u.dirname(t);if(o===t)break;t=o}return null}function oe(){try{let e=import.meta.url;return!e||!e.startsWith("file://")?null:decodeURIComponent(e.slice(7))}catch{return null}}async function ie(e,t,r){let n=u.join(h(),"locks");i.mkdirSync(n,{recursive:!0});try{i.chmodSync(n,448)}catch{}let o=u.join(n,`start-${e}-${t}.lock`),s=Date.now()+4e3,a=null;for(;a===null;)try{a=i.openSync(o,f.O_WRONLY|f.O_CREAT|f.O_EXCL,384)}catch(d){if(d.code!=="EEXIST")throw d;try{let c=Number(i.readFileSync(o,"utf8").trim());if(c&&!ce(c)){i.unlinkSync(o);continue}}catch{}if(Date.now()>s)throw new Error(`another start is in progress for project=${e} provider=${t} (lock: ${o})`);await new Promise(c=>setTimeout(c,50))}try{return i.writeFileSync(a,String(process.pid)),await r()}finally{try{i.closeSync(a)}catch{}try{i.unlinkSync(o)}catch{}}}function ce(e){try{return process.kill(e,0),!0}catch{return!1}}function L(e){let t=u.dirname(e);i.mkdirSync(t,{recursive:!0});try{i.chmodSync(t,448)}catch{}if(i.existsSync(e))try{if(i.statSync(e).isFIFO()){try{i.chmodSync(e,384)}catch{}return}i.unlinkSync(e)}catch{i.unlinkSync(e)}let r=z("mkfifo",["-m","600",e]);if(r.status!==0)throw new Error(`mkfifo(${e}) failed: ${r.stderr?.toString().trim()||"unknown error"}`)}var l=class extends Error{code;constructor(t,r){super(r),this.code=t}};async function Te(e){let t=F(e.projectId);if(!t)throw new l("NO_PROJECT",`no project with id=${e.projectId}`);let r=e.provider||t.preferredProvider||"codex";return ie(t.id,r,async()=>{let n=C(t.id).find(p=>p.provider===r&&p.status!=="ended"&&O(p.wrapperPid,p.id));if(n)throw new l("ALREADY_RUNNING",`session already running for project=${t.id} provider=${r} (session ${n.id}, pid ${n.wrapperPid}). end it first with \`sootsim agent end <sessionId>\`.`);let o=r==="claude"?Z():void 0,s=M({projectId:t.id,provider:r,transport:"pty",cwd:t.cwd,status:"idle",claudeSessionUuid:o}),a=W(s.id),d=J(s.id),c=te(s.id);L(a),L(d);let g=u.dirname(c);i.mkdirSync(g,{recursive:!0});try{i.chmodSync(g,448)}catch{}let{cmd:A,prefixArgs:H}=re(),P=[...H,"agent-wrapper","--session-id",s.id,"--project-id",t.id,"--provider",r,"--cwd",t.cwd,"--prompt-in",a,"--events-out",d,"--transcript",c];e.codexBin&&P.push("--codex-bin",e.codexBin),e.claudeBin&&P.push("--claude-bin",e.claudeBin),e.freshThread&&P.push("--fresh-thread"),o&&P.push("--claude-session-uuid",o);let x=V(A,P,{detached:!0,stdio:"ignore",env:{...process.env,SOOTSIM_USER_DATA_DIR:h()}});x.unref();let E=e.readyTimeoutMs??6e3,b=await ae(d,p=>p.type==="ready"||p.type==="error",E);if(!b||b.type==="error"){if(x.pid)try{process.kill(x.pid,"SIGTERM")}catch{}try{i.rmSync(j(s.id),{recursive:!0,force:!0})}catch{}v(s.id,{status:"ended"});let p=b&&b.type==="error"?b.message:`no ready event within ${E}ms`;throw new l("WRAPPER_FAILED",p)}return v(s.id,{wrapperPid:x.pid,status:"idle"}),{session:k(s.id),wrapperPid:x.pid}})}async function De(e,t){let r=k(e);if(!r)throw new l("NO_SESSION",`no session with id=${e}`);if(!O(r.wrapperPid,e))throw v(e,{status:"ended"}),new l("NOT_ALIVE",`session wrapper is not alive (pid=${r.wrapperPid}). start a new session.`);let n=W(e);if(!i.existsSync(n))throw new l("NO_FIFO",`prompt FIFO missing: ${n}`);let o=i.openSync(n,f.O_WRONLY);try{let s=R(t);if(!s)throw new l("EMPTY_PROMPT","prompt text is empty");i.writeSync(o,s+`
1
+ /*! sootsim v0.1.95 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
+ import{a as R}from"./chunk-RFFEPUWN.js";import{l as D}from"./chunk-B7ZFNEFJ.js";import{a as T}from"./chunk-3ELUS6PR.js";function Y(e){if(!e||typeof e!="object")return!1;let t=e;return typeof t.type=="string"&&typeof t.ts=="number"}function I(e){let t=e.trim();if(!t)return null;try{let r=JSON.parse(t);return Y(r)?r:null}catch{return null}}import{randomBytes as G,createHash as q}from"node:crypto";import m from"node:fs";import y from"node:path";var N=null;function _(){if(N)return N;let e=process.env.SOOTSIM_USER_DATA_DIR;return e||D()}function h(){return _()}function U(){return y.join(_(),"attached-projects.json")}function $(){return{version:1,attachedProjects:[],previewAttachments:[],agentSessions:[]}}function S(){let e=U(),t;try{t=m.readFileSync(e,"utf8")}catch(r){if(r.code==="ENOENT")return $();throw r}try{let r=JSON.parse(t);if(!r||typeof r!="object")throw new Error("not an object");return{version:1,attachedProjects:Array.isArray(r.attachedProjects)?r.attachedProjects:[],previewAttachments:Array.isArray(r.previewAttachments)?r.previewAttachments:[],agentSessions:Array.isArray(r.agentSessions)?r.agentSessions:[]}}catch(r){let n=`${e}.corrupt-${Date.now()}`;try{m.renameSync(e,n),console.warn(`[sootsim] attached-projects.json was unparseable; quarantined to ${n}. original error: ${r.message}`)}catch{}return $()}}function X(e){let t=U();m.mkdirSync(y.dirname(t),{recursive:!0});let r=`${t}.tmp-${process.pid}-${Date.now()}`,n=m.openSync(r,"w",384);try{m.writeFileSync(n,JSON.stringify(e,null,2)),m.fsyncSync(n)}finally{m.closeSync(n)}m.renameSync(r,t)}function w(e){let t=S();return e(t),X(t),t}function B(e){return q("sha256").update(y.resolve(e)).digest("hex").slice(0,16)}function K(){return`s_${G(10).toString("hex")}`}function ge(e){let t=y.resolve(e.cwd),r=B(t),n;return w(o=>{let s=o.attachedProjects.find(c=>c.id===r);if(s){let c={...s,...e,id:r,cwd:t,sourceRoots:e.sourceRoots??s.sourceRoots,knownBundleUrls:e.knownBundleUrls??s.knownBundleUrls,pinnedSourceResolutions:e.pinnedSourceResolutions??s.pinnedSourceResolutions,telemetry:e.telemetry??s.telemetry,updatedAt:Date.now(),createdAt:s.createdAt},g=o.attachedProjects.indexOf(s);o.attachedProjects[g]=c,n=c;return}let a=Date.now(),d={id:r,name:e.name??y.basename(t),cwd:t,repoRoot:e.repoRoot,sourceRoots:e.sourceRoots??[t],framework:e.framework??"unknown",bundleId:e.bundleId,knownBundleUrls:e.knownBundleUrls??[],preferredProvider:e.preferredProvider??"codex",preferredTransport:e.preferredTransport??"tmux",editorOpenCommand:e.editorOpenCommand,moshiWebhookToken:e.moshiWebhookToken,pinnedSourceResolutions:e.pinnedSourceResolutions??{},isolateDiscovery:e.isolateDiscovery,git:e.git,telemetry:e.telemetry??{lastOpened:0,runsCompleted:0},createdAt:a,updatedAt:a};o.attachedProjects.push(d),n=d}),n}function F(e){return S().attachedProjects.find(t=>t.id===e)??null}function ye(){return S().attachedProjects}var Q=336*60*60*1e3;function he(e,t={}){w(r=>{let n=r.attachedProjects.find(s=>s.id===e);if(!n)return;let o=t.ts??Date.now();if(n.telemetry.runsCompleted=(n.telemetry.runsCompleted??0)+1,typeof t.usd=="number"&&Number.isFinite(t.usd)&&t.usd>=0){let s=n.telemetry.costHistory??[],a=o-Q,d=s.filter(c=>c.ts>=a);d.push({ts:o,usd:t.usd}),n.telemetry.costHistory=d}n.updatedAt=o})}function Se(e,t=Date.now()){let r=t-6048e5,n=e.telemetry.costHistory??[],o=0;for(let s of n)s.ts>=r&&(o+=s.usd);return o}function we(e){w(t=>{t.attachedProjects=t.attachedProjects.filter(r=>r.id!==e),t.agentSessions=t.agentSessions.filter(r=>r.projectId!==e),t.previewAttachments=t.previewAttachments.filter(r=>r.projectId!==e)})}function M(e){let t;return w(r=>{if(e.id){let a=r.agentSessions.find(d=>d.id===e.id);if(a){let d={...a,...e,lastSeenAt:Date.now()},c=r.agentSessions.indexOf(a);r.agentSessions[c]=d,t=d;return}}let n=r.attachedProjects.find(a=>a.id===e.projectId);if(!n)throw new Error(`upsertSession: no AttachedProject with id=${e.projectId}`);let o=Date.now(),s={id:e.id??K(),projectId:e.projectId,provider:e.provider,transport:e.transport??n.preferredTransport,cwd:e.cwd??n.cwd,claudeSessionUuid:e.claudeSessionUuid,tmuxSessionName:e.tmuxSessionName,wrapperPid:e.wrapperPid,status:e.status??"idle",needsAttention:e.needsAttention??!1,lastPrompt:e.lastPrompt,lastSummary:e.lastSummary,lastTurnFiles:e.lastTurnFiles,currentlyEditing:e.currentlyEditing,lastSeenAt:o,createdAt:o};r.agentSessions.push(s),t=s}),t}function k(e){return S().agentSessions.find(t=>t.id===e)??null}function C(e){let t=S().agentSessions;return e?t.filter(r=>r.projectId===e):t}function v(e,t){w(r=>{let n=r.agentSessions.find(s=>s.id===e);if(!n)return;let o=r.agentSessions.indexOf(n);r.agentSessions[o]={...n,...t,id:n.id,projectId:n.projectId,createdAt:n.createdAt,lastSeenAt:Date.now()}})}async function ve(){if(S().attachedProjects.length>0)return;let t;try{t=(await import("sootsim/scripts/demo-app-registry")).APPS}catch(n){console.warn("[sootsim] seedFromDemoAppRegistry: could not load demo registry:",n.message);return}if(!Array.isArray(t))return;let r=t;w(n=>{for(let o of r){if(!m.existsSync(o.dir))continue;let s=y.resolve(o.dir),a=B(s);if(n.attachedProjects.some(c=>c.id===a))continue;let d=Date.now();n.attachedProjects.push({id:a,name:o.label,cwd:s,sourceRoots:[s],framework:o.framework,knownBundleUrls:[`http://localhost:${o.preferredPort}/index.bundle`],preferredProvider:"codex",preferredTransport:"tmux",pinnedSourceResolutions:{},telemetry:{lastOpened:0,runsCompleted:0},createdAt:d,updatedAt:d})}})}import{spawn as V,spawnSync as z}from"node:child_process";import{randomUUID as Z}from"node:crypto";import i,{constants as f}from"node:fs";import u from"node:path";import ee from"node:readline";function j(e){return u.join(h(),"sessions",e)}function W(e){return u.join(j(e),"prompt.in")}function J(e){return u.join(j(e),"events.out")}function te(e){return u.join(h(),"transcripts",`${e}.log`)}function O(e,t){if(!e)return!1;try{process.kill(e,0)}catch{return!1}return!(t&&!i.existsSync(j(t)))}function re(){if(process.env.SOOTSIM_BIN)return{cmd:process.env.SOOTSIM_BIN,prefixArgs:[]};if(process.versions.electron){let n=process.resourcesPath;if(n){let o=[u.join(n,"bin","sootsim"),u.join(n,"bin",`sootsim-${process.platform}-${process.arch}`)];for(let s of o)if(i.existsSync(s))return{cmd:s,prefixArgs:[]}}}let e=ne();if(e)return e;let t=process.argv[0],r=process.argv[1];if(r&&/\.(ts|tsx|mjs|cjs|js)$/.test(r))return{cmd:t,prefixArgs:[r]};if(!r||r.includes("/.bin/"))throw new Error("sootsim CLI not found. set SOOTSIM_BIN to the path of the sootsim binary, or build the workspace CLI via `bun run --cwd packages/sootsim build:cli`.");return{cmd:t,prefixArgs:[]}}function ne(){try{let e=se();if(!e)return null;let t=`sootsim-${process.platform}-${process.arch}`,r=u.join(e,"dist-bin",t);if(i.existsSync(r))return{cmd:r,prefixArgs:[]};let n=u.join(e,"dist-cli","bin.js");if(i.existsSync(n)){try{let o=u.join(e,"cli","commands","agent-wrapper.ts");if(i.existsSync(o)){let s=i.statSync(o).mtimeMs;i.statSync(n).mtimeMs<s&&console.warn("[sootsim] dist-cli/bin.js is older than agent-wrapper.ts \u2014 rebuild with `bun run --cwd packages/sootsim build:cli` (watch:cli:binary builds dist-bin/ instead).")}}catch{}return{cmd:process.execPath,prefixArgs:[n]}}return null}catch{return null}}function se(){try{let r=T.resolve("sootsim/package.json");return u.dirname(r)}catch{}let e=oe();if(!e)return null;let t=u.dirname(e);for(let r=0;r<8;r++){let n=u.join(t,"package.json");try{if(i.existsSync(n)&&JSON.parse(i.readFileSync(n,"utf8")).name==="sootsim")return t}catch{}let o=u.dirname(t);if(o===t)break;t=o}return null}function oe(){try{let e=import.meta.url;return!e||!e.startsWith("file://")?null:decodeURIComponent(e.slice(7))}catch{return null}}async function ie(e,t,r){let n=u.join(h(),"locks");i.mkdirSync(n,{recursive:!0});try{i.chmodSync(n,448)}catch{}let o=u.join(n,`start-${e}-${t}.lock`),s=Date.now()+4e3,a=null;for(;a===null;)try{a=i.openSync(o,f.O_WRONLY|f.O_CREAT|f.O_EXCL,384)}catch(d){if(d.code!=="EEXIST")throw d;try{let c=Number(i.readFileSync(o,"utf8").trim());if(c&&!ce(c)){i.unlinkSync(o);continue}}catch{}if(Date.now()>s)throw new Error(`another start is in progress for project=${e} provider=${t} (lock: ${o})`);await new Promise(c=>setTimeout(c,50))}try{return i.writeFileSync(a,String(process.pid)),await r()}finally{try{i.closeSync(a)}catch{}try{i.unlinkSync(o)}catch{}}}function ce(e){try{return process.kill(e,0),!0}catch{return!1}}function L(e){let t=u.dirname(e);i.mkdirSync(t,{recursive:!0});try{i.chmodSync(t,448)}catch{}if(i.existsSync(e))try{if(i.statSync(e).isFIFO()){try{i.chmodSync(e,384)}catch{}return}i.unlinkSync(e)}catch{i.unlinkSync(e)}let r=z("mkfifo",["-m","600",e]);if(r.status!==0)throw new Error(`mkfifo(${e}) failed: ${r.stderr?.toString().trim()||"unknown error"}`)}var l=class extends Error{code;constructor(t,r){super(r),this.code=t}};async function Te(e){let t=F(e.projectId);if(!t)throw new l("NO_PROJECT",`no project with id=${e.projectId}`);let r=e.provider||t.preferredProvider||"codex";return ie(t.id,r,async()=>{let n=C(t.id).find(p=>p.provider===r&&p.status!=="ended"&&O(p.wrapperPid,p.id));if(n)throw new l("ALREADY_RUNNING",`session already running for project=${t.id} provider=${r} (session ${n.id}, pid ${n.wrapperPid}). end it first with \`sootsim agent end <sessionId>\`.`);let o=r==="claude"?Z():void 0,s=M({projectId:t.id,provider:r,transport:"pty",cwd:t.cwd,status:"idle",claudeSessionUuid:o}),a=W(s.id),d=J(s.id),c=te(s.id);L(a),L(d);let g=u.dirname(c);i.mkdirSync(g,{recursive:!0});try{i.chmodSync(g,448)}catch{}let{cmd:A,prefixArgs:H}=re(),P=[...H,"agent-wrapper","--session-id",s.id,"--project-id",t.id,"--provider",r,"--cwd",t.cwd,"--prompt-in",a,"--events-out",d,"--transcript",c];e.codexBin&&P.push("--codex-bin",e.codexBin),e.claudeBin&&P.push("--claude-bin",e.claudeBin),e.freshThread&&P.push("--fresh-thread"),o&&P.push("--claude-session-uuid",o);let x=V(A,P,{detached:!0,stdio:"ignore",env:{...process.env,SOOTSIM_USER_DATA_DIR:h()}});x.unref();let E=e.readyTimeoutMs??6e3,b=await ae(d,p=>p.type==="ready"||p.type==="error",E);if(!b||b.type==="error"){if(x.pid)try{process.kill(x.pid,"SIGTERM")}catch{}try{i.rmSync(j(s.id),{recursive:!0,force:!0})}catch{}v(s.id,{status:"ended"});let p=b&&b.type==="error"?b.message:`no ready event within ${E}ms`;throw new l("WRAPPER_FAILED",p)}return v(s.id,{wrapperPid:x.pid,status:"idle"}),{session:k(s.id),wrapperPid:x.pid}})}async function De(e,t){let r=k(e);if(!r)throw new l("NO_SESSION",`no session with id=${e}`);if(!O(r.wrapperPid,e))throw v(e,{status:"ended"}),new l("NOT_ALIVE",`session wrapper is not alive (pid=${r.wrapperPid}). start a new session.`);let n=W(e);if(!i.existsSync(n))throw new l("NO_FIFO",`prompt FIFO missing: ${n}`);let o=i.openSync(n,f.O_WRONLY);try{let s=R(t);if(!s)throw new l("EMPTY_PROMPT","prompt text is empty");i.writeSync(o,s+`
3
3
  `)}finally{i.closeSync(o)}v(e,{lastPrompt:t.displayText??t.text,status:"working"})}async function Re(e){let t=k(e);if(!t)throw new l("NO_SESSION",`no session with id=${e}`);if(O(t.wrapperPid,e))try{process.kill(t.wrapperPid,"SIGTERM")}catch{}let r=j(e),n=h();if(r.startsWith(n))try{i.rmSync(r,{recursive:!0,force:!0})}catch{}v(e,{status:"ended",wrapperPid:void 0})}function Ne(e,t){let r=J(e);if(!i.existsSync(r))throw new l("NO_FIFO",`events FIFO missing: ${r}`);let n=i.openSync(r,f.O_RDWR),o=i.createReadStream("",{fd:n,autoClose:!0}),s=ee.createInterface({input:o,crlfDelay:1/0});s.on("line",d=>{let c=I(d);c&&t(c)});let a=!1;return()=>{if(!a){a=!0;try{s.close()}catch{}try{o.destroy()}catch{}}}}async function ae(e,t,r){let n=i.openSync(e,f.O_RDWR|f.O_NONBLOCK),o=Buffer.alloc(8192),s="",a=Date.now()+r;try{for(;Date.now()<a;){let d=0;try{d=i.readSync(n,o,0,o.length,null)}catch(c){if(c.code!=="EAGAIN")throw c;d=0}if(d>0){s+=o.subarray(0,d).toString("utf8");let c;for(;(c=s.indexOf(`
4
4
  `))>=0;){let g=s.slice(0,c);s=s.slice(c+1);let A=I(g);if(A&&t(A))return A}}else await new Promise(c=>setTimeout(c,30))}return null}finally{i.closeSync(n)}}export{I as a,h as b,ge as c,F as d,ye as e,he as f,Se as g,we as h,k as i,C as j,v as k,ve as l,j as m,W as n,J as o,te as p,O as q,re as r,l as s,Te as t,De as u,Re as v,Ne as w};
@@ -0,0 +1,2 @@
1
+ /*! sootsim v0.1.95 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
+ import{createRequire as w}from"node:module";import l from"node:path";var m=w(import.meta.url);function A(t){try{let n=new URL(t),o=n.hostname.replace(/^\[|\]$/g,"").toLowerCase();if(o==="localhost"||o.endsWith(".localhost")||o==="0.0.0.0"||o==="::1"||/^127(?:\.\d{1,3}){3}$/.test(o))return n.origin}catch{}return null}function R(t,n){try{let o=new URL(n).pathname,e=o.indexOf("/node_modules/");if(e>0)return l.join(t,o.slice(0,e).replace(/^\/+/,""))}catch{}return t}function x(t,n,o){if(!n||typeof n!="object")return;let e=n[o];if(!e||typeof e!="object")return;let c=e.fonts;if(Array.isArray(c))for(let r of c){if(typeof r=="string"){t.push(r);continue}if(!r||typeof r!="object")continue;let f=r.fontDefinitions;if(Array.isArray(f))for(let p of f){if(!p||typeof p!="object")continue;let u=p.path;typeof u=="string"&&t.push(u)}}}function b(t){let n=A(t.bundleUrl);if(!n)return[];let o=l.resolve(t.repoDir||process.env.SOOT_REPO_DIR||process.cwd()),e=R(o,t.bundleUrl),c=(t.platform||process.env.SOOT_PLATFORM||"ios").toLowerCase(),r=null;try{let s=m.resolve("@expo/config",{paths:[e,o]}),i=m(s);typeof i.getConfig=="function"&&(r=i.getConfig)}catch{}if(!r)return[];let f;try{f=r(e,{skipSDKVersionRequirement:!0})?.exp}catch{return[]}if(!f||typeof f!="object")return[];let p=f.plugins;if(!Array.isArray(p))return[];let u=[];for(let s of p){let i=Array.isArray(s)?s[0]:s;if(typeof i!="string"||!/(^|\/)expo-font$/.test(i))continue;let a=Array.isArray(s)?s[1]||{}:{};if(!a||typeof a!="object")continue;let y=a.fonts;Array.isArray(y)&&u.push(...y.filter(h=>typeof h=="string")),x(u,a,c)}let g=new Set,d=[];for(let s of u){let i=s.replace(/^\.\//,"").replace(/^\/+/,"");!i||g.has(i)||(g.add(i),/\.(ttf|otf|woff|woff2)$/i.test(i)&&d.push({family:l.basename(i).replace(/\.(ttf|otf|woff|woff2)$/i,""),url:`${n}/assets/${i}`}))}return d}function D(t){return t.map(n=>`${encodeURIComponent(n.url)}::${encodeURIComponent(n.family)}`).join(",")}function F(t){let n=[];for(let o of t.split(",")){let e=o.trim();if(!e)continue;let c=e.indexOf("::"),r=c===-1?e:e.slice(0,c);try{n.push(decodeURIComponent(r))}catch{n.push(r)}}return n.filter(Boolean)}export{b as a,D as b,F as c};
@@ -1,2 +1,2 @@
1
- /*! sootsim v0.1.93 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.95 | (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};
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.93 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.95 | (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,5 +1,5 @@
1
- /*! sootsim v0.1.93 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{a as u,b as f}from"./chunk-TRS52XH4.js";import{a as h,c as p}from"./chunk-FRFSAMOW.js";import{a as c,b as d,c as m}from"./chunk-3IFMI2MH.js";function T(){let e=c();return e?{available:!0,reason:null,detail:e}:{available:!1,reason:"no chromium-family browser found (chrome, chromium, edge, brave, arc)"}}async function O(e){if(e.headless)return{launched:!1,message:"the chromium driver launches a visible browser window and cannot run headless \u2014 a headless `chrome --headless=new` process exits immediately and the sim never connects. for headless automation use `--driver playwright`."};let r=c();if(!r)return{launched:!1,message:"chromium not found \u2014 install chrome or run `sootsim list --drivers`"};if(!e.url)return{launched:!1,message:"chromium driver requires a target url"};if(e.profileId||e.ephemeralProfile)return{launched:!1,message:"profiles require electron or playwright; browser tabs use your current Chrome profile"};try{let t=await m(e.url,{detached:e.detached??!0});return{launched:!0,message:`chromium launched \u2192 ${e.url}`,pid:t.pid,target:t.target??r,attachUrl:e.url}}catch(t){return{launched:!1,message:`chromium spawn failed: ${t instanceof Error?t.message:String(t)}`}}}var v={id:"chromium",name:"chromium",description:"system chrome / chromium / edge \u2014 visible window (headless: use playwright)",kind:"browser",availability:T,launch:O};function I(){let e=u();return e?{available:!0,reason:null,detail:`${e.kind} @ ${e.path}`}:{available:!1,reason:"sootsim desktop app not installed (run `sootsim install-desktop`)"}}async function _(e){let r=u();if(!r)return{launched:!1,message:"sootsim desktop app not installed"};try{let t=await f(e.url,r,{device:e.device,profileId:e.profileId,ephemeralProfile:e.ephemeralProfile});return t.launched?{launched:!0,message:e.url?`electron launched via ${t.via} \u2192 ${e.url}`:`electron launched via ${t.via}`,target:t.target,attachUrl:e.url}:{launched:!1,message:"desktop companion failed to start"}}catch(t){return{launched:!1,message:`electron launch failed: ${t instanceof Error?t.message:String(t)}`}}}var w={id:"electron",name:"electron",description:"sootsim desktop companion app (native window, menu bar)",kind:"native",availability:I,launch:_};import{spawn as x}from"child_process";import{closeSync as M,mkdtempSync as A,openSync as C,readFileSync as E}from"fs";import{createRequire as L}from"module";import{tmpdir as g}from"os";import{join as y}from"path";var R=`
1
+ /*! sootsim v0.1.95 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
+ import{a as u,b as f}from"./chunk-75ETPOPS.js";import{a as h,c as p}from"./chunk-ZBIHQFJH.js";import{a as c,b as d,c as m}from"./chunk-GQOMMF7T.js";function T(){let e=c();return e?{available:!0,reason:null,detail:e}:{available:!1,reason:"no chromium-family browser found (chrome, chromium, edge, brave, arc)"}}async function O(e){if(e.headless)return{launched:!1,message:"the chromium driver launches a visible browser window and cannot run headless \u2014 a headless `chrome --headless=new` process exits immediately and the sim never connects. for headless automation use `--driver playwright`."};let r=c();if(!r)return{launched:!1,message:"chromium not found \u2014 install chrome or run `sootsim list --drivers`"};if(!e.url)return{launched:!1,message:"chromium driver requires a target url"};if(e.profileId||e.ephemeralProfile)return{launched:!1,message:"profiles require electron or playwright; browser tabs use your current Chrome profile"};try{let t=await m(e.url,{detached:e.detached??!0});return{launched:!0,message:`chromium launched \u2192 ${e.url}`,pid:t.pid,target:t.target??r,attachUrl:e.url}}catch(t){return{launched:!1,message:`chromium spawn failed: ${t instanceof Error?t.message:String(t)}`}}}var v={id:"chromium",name:"chromium",description:"system chrome / chromium / edge \u2014 visible window (headless: use playwright)",kind:"browser",availability:T,launch:O};function I(){let e=u();return e?{available:!0,reason:null,detail:`${e.kind} @ ${e.path}`}:{available:!1,reason:"sootsim desktop app not installed (run `sootsim install-desktop`)"}}async function _(e){let r=u();if(!r)return{launched:!1,message:"sootsim desktop app not installed"};try{let t=await f(e.url,r,{device:e.device,profileId:e.profileId,ephemeralProfile:e.ephemeralProfile});return t.launched?{launched:!0,message:e.url?`electron launched via ${t.via} \u2192 ${e.url}`:`electron launched via ${t.via}`,target:t.target,attachUrl:e.url}:{launched:!1,message:"desktop companion failed to start"}}catch(t){return{launched:!1,message:`electron launch failed: ${t instanceof Error?t.message:String(t)}`}}}var w={id:"electron",name:"electron",description:"sootsim desktop companion app (native window, menu bar)",kind:"native",availability:I,launch:_};import{spawn as x}from"child_process";import{closeSync as M,mkdtempSync as A,openSync as C,readFileSync as E}from"fs";import{createRequire as L}from"module";import{tmpdir as g}from"os";import{join as y}from"path";var R=`
3
3
  const modulePath = process.env.SOOTSIM_PW_MODULE;
4
4
  const url = process.env.SOOTSIM_PW_URL;
5
5
  const headless = process.env.SOOTSIM_PW_HEADLESS === '1';
@@ -1,3 +1,3 @@
1
- /*! sootsim v0.1.93 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{i as n}from"./chunk-W5ET7GSK.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.95 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
+ import{i as n}from"./chunk-G4UGGSGJ.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};
@@ -1,5 +1,5 @@
1
- /*! sootsim v0.1.93 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{g as u}from"./chunk-W5ET7GSK.js";var S=52,l=18,h=42,x=96,g=54,E=1.5,$="inset 0 0 0 0.5px #000, inset 0 0 0 2px #757575, inset 0 0 0 5px #212121",w=1;function y(e){let t=u(e),r=t.scale,o=!t.dynamicIsland&&t.homeIndicatorHeight===0&&t.cornerRadius===0,n=t.width,i=t.height,a=o?t.width+l*2:t.width+28,d=o?t.height+h+x:t.height+28,c=9.5,b=w,p=a+c*2,m=d+w*2,f=c+(o?l:14),B=o?h:14,H=o?S:t.cornerRadius+14,v=[{side:"right",top:t.hardwareButtons.lock.top,height:t.hardwareButtons.lock.height,width:t.hardwareButtons.width},{side:"left",top:t.hardwareButtons.ringToggle.top,height:t.hardwareButtons.ringToggle.height,width:t.hardwareButtons.width},{side:"left",top:t.hardwareButtons.volumeUp.top,height:t.hardwareButtons.volumeUp.height,width:t.hardwareButtons.width},{side:"left",top:t.hardwareButtons.volumeDown.top,height:t.hardwareButtons.volumeDown.height,width:t.hardwareButtons.width}];return{model:e,renderScale:r,outerWidth:Math.round(p*r),outerHeight:Math.round(m*r),logicalOuterWidth:p,logicalOuterHeight:m,logicalFrameWidth:a,logicalFrameHeight:d,logicalFrameLeft:c,logicalFrameTop:b,logicalScreenWidth:n,logicalScreenHeight:i,logicalScreenLeft:f,logicalScreenTop:B,logicalScreenRadius:o?0:t.cornerRadius,logicalFrameRadius:H,frameBackground:o?"linear-gradient(180deg, #1b1c20 0%, #0f1012 42%, #050608 100%)":"#000000",frameOutline:o?"0 0 0 1px #1f2125":"0 0 0 1px #333",metallicRingShadow:o?null:$,buttons:v,legacyHomeButton:o?{top:h+t.height+(x-g)/2,left:t.width/2-g/2+l,size:g,ring:E}:null,showHomeIndicator:t.homeIndicatorHeight>0,logicalHomeIndicatorStripHeight:t.homeIndicatorHeight}}function L(e){let t=e.side==="right",r=t?"inset(-3px -3px -3px 0)":"inset(-3px 0 -3px -3px)";return`
1
+ /*! sootsim v0.1.95 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
+ import{g as u}from"./chunk-G4UGGSGJ.js";var S=52,l=18,h=42,x=96,g=54,E=1.5,$="inset 0 0 0 0.5px #000, inset 0 0 0 2px #757575, inset 0 0 0 5px #212121",w=1;function y(e){let t=u(e),r=t.scale,o=!t.dynamicIsland&&t.homeIndicatorHeight===0&&t.cornerRadius===0,n=t.width,i=t.height,a=o?t.width+l*2:t.width+28,d=o?t.height+h+x:t.height+28,c=9.5,b=w,p=a+c*2,m=d+w*2,f=c+(o?l:14),B=o?h:14,H=o?S:t.cornerRadius+14,v=[{side:"right",top:t.hardwareButtons.lock.top,height:t.hardwareButtons.lock.height,width:t.hardwareButtons.width},{side:"left",top:t.hardwareButtons.ringToggle.top,height:t.hardwareButtons.ringToggle.height,width:t.hardwareButtons.width},{side:"left",top:t.hardwareButtons.volumeUp.top,height:t.hardwareButtons.volumeUp.height,width:t.hardwareButtons.width},{side:"left",top:t.hardwareButtons.volumeDown.top,height:t.hardwareButtons.volumeDown.height,width:t.hardwareButtons.width}];return{model:e,renderScale:r,outerWidth:Math.round(p*r),outerHeight:Math.round(m*r),logicalOuterWidth:p,logicalOuterHeight:m,logicalFrameWidth:a,logicalFrameHeight:d,logicalFrameLeft:c,logicalFrameTop:b,logicalScreenWidth:n,logicalScreenHeight:i,logicalScreenLeft:f,logicalScreenTop:B,logicalScreenRadius:o?0:t.cornerRadius,logicalFrameRadius:H,frameBackground:o?"linear-gradient(180deg, #1b1c20 0%, #0f1012 42%, #050608 100%)":"#000000",frameOutline:o?"0 0 0 1px #1f2125":"0 0 0 1px #333",metallicRingShadow:o?null:$,buttons:v,legacyHomeButton:o?{top:h+t.height+(x-g)/2,left:t.width/2-g/2+l,size:g,ring:E}:null,showHomeIndicator:t.homeIndicatorHeight>0,logicalHomeIndicatorStripHeight:t.homeIndicatorHeight}}function L(e){let t=e.side==="right",r=t?"inset(-3px -3px -3px 0)":"inset(-3px 0 -3px -3px)";return`
3
3
  <div
4
4
  aria-hidden="true"
5
5
  style="
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.93 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{A as R,C as w,i as p,r as S,t as O,y as v,z as f}from"./chunk-M4QXOCCY.js";import{spawn as I}from"child_process";import C from"crypto";import s from"fs";import l from"path";import{Readable as k}from"stream";import{pipeline as M}from"stream/promises";var N="https://sootbean.com",D="SOOTSIM_CDN_ORIGIN",E="SOOTSIM_RUNTIME_CHANNEL";function $(){try{let e=JSON.parse(s.readFileSync(O(),"utf8"));return e&&typeof e=="object"?e:{}}catch{return{}}}function d(e){let t=$();return(e||process.env[D]||t.cdnOrigin||N).replace(/\/+$/,"")}function x(e){let t=$();return e||process.env[E]||t.runtimeChannel||"stable"}function T(e){let t=new URL(`${d(e)}/runtimes/manifest.json`);return t.searchParams.set("t",String(Date.now())),t.toString()}function P(e,t){return`${d(t)}/runtimes/sootsim-runtime-${e}.tar.gz`}async function y(e){let t=T(e),r=await fetch(t,{headers:{Accept:"application/json"}});if(!r.ok)throw new Error(`manifest fetch failed: ${r.status} ${r.statusText} (${t})`);return await r.json()}function U(e,t={}){let r=x(t.channel),n=t.version||e.channels[r]?.latest;if(!n)throw new Error(`no version specified and channel '${r}' has no latest entry in the manifest`);let i=e.versions[n];if(!i)throw new Error(`version ${n} not found in manifest; available: ${Object.keys(e.versions).slice(-10).join(", ")||"(none)"}`);return{version:n,channel:r,entry:i}}async function V(e={}){v();let t=d(e.cdnOrigin),r=await y(t),{version:n,channel:i,entry:o}=U(r,e),a=p(n),c=e.setActive!==!1;if(!e.force&&s.existsSync(l.join(a,"index.html")))return c&&R(n),{version:n,channel:i,cdnOrigin:t,runtimeDir:a,installed:!1,activated:c,manifest:r};let g=o.tarball||P(n,t),m=l.join(S(),`sootsim-runtime-${n}.tar.gz`);process.stderr.write(`sootsim: downloading runtime ${n}\u2026
1
+ /*! sootsim v0.1.95 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
+ import{A as R,C as w,i as p,r as S,t as O,y as v,z as f}from"./chunk-B7ZFNEFJ.js";import{spawn as I}from"child_process";import C from"crypto";import s from"fs";import l from"path";import{Readable as k}from"stream";import{pipeline as M}from"stream/promises";var N="https://sootbean.com",D="SOOTSIM_CDN_ORIGIN",E="SOOTSIM_RUNTIME_CHANNEL";function $(){try{let e=JSON.parse(s.readFileSync(O(),"utf8"));return e&&typeof e=="object"?e:{}}catch{return{}}}function d(e){let t=$();return(e||process.env[D]||t.cdnOrigin||N).replace(/\/+$/,"")}function x(e){let t=$();return e||process.env[E]||t.runtimeChannel||"stable"}function T(e){let t=new URL(`${d(e)}/runtimes/manifest.json`);return t.searchParams.set("t",String(Date.now())),t.toString()}function P(e,t){return`${d(t)}/runtimes/sootsim-runtime-${e}.tar.gz`}async function y(e){let t=T(e),r=await fetch(t,{headers:{Accept:"application/json"}});if(!r.ok)throw new Error(`manifest fetch failed: ${r.status} ${r.statusText} (${t})`);return await r.json()}function U(e,t={}){let r=x(t.channel),n=t.version||e.channels[r]?.latest;if(!n)throw new Error(`no version specified and channel '${r}' has no latest entry in the manifest`);let i=e.versions[n];if(!i)throw new Error(`version ${n} not found in manifest; available: ${Object.keys(e.versions).slice(-10).join(", ")||"(none)"}`);return{version:n,channel:r,entry:i}}async function V(e={}){v();let t=d(e.cdnOrigin),r=await y(t),{version:n,channel:i,entry:o}=U(r,e),a=p(n),c=e.setActive!==!1;if(!e.force&&s.existsSync(l.join(a,"index.html")))return c&&R(n),{version:n,channel:i,cdnOrigin:t,runtimeDir:a,installed:!1,activated:c,manifest:r};let g=o.tarball||P(n,t),m=l.join(S(),`sootsim-runtime-${n}.tar.gz`);process.stderr.write(`sootsim: downloading runtime ${n}\u2026
3
3
  `),await _(g,m),process.stderr.write(`sootsim: extracting runtime ${n}\u2026
4
4
  `);let h=await j(m);if(h!==o.sha256)throw s.rmSync(m,{force:!0}),new Error(`sha256 mismatch for runtime ${n}: expected ${o.sha256}, actual ${h}`);let u=l.join(l.dirname(a),`.installing-${n}-${process.pid}`);s.rmSync(u,{recursive:!0,force:!0}),s.mkdirSync(u,{recursive:!0});try{if(await A(m,u),!s.existsSync(l.join(u,"index.html")))throw new Error(`extracted tarball for runtime ${n} is missing index.html`);s.rmSync(a,{recursive:!0,force:!0}),s.renameSync(u,a)}catch(b){throw s.rmSync(u,{recursive:!0,force:!0}),b}return c&&R(n),{version:n,channel:i,cdnOrigin:t,runtimeDir:a,installed:!0,activated:c,manifest:r}}async function q(e={}){v();let t=d(e.cdnOrigin),r=x(e.channel),n=await y(t),i=n.channels[r]?.latest;if(!i)return{checked:!0,updated:!1,reason:`channel '${r}' has no latest runtime`,activeVersion:f()};if(!n.versions[i])return{checked:!0,updated:!1,reason:`manifest is missing version ${i}`,activeVersion:f(),latestVersion:i};let a=f(),c=a?p(a):null,g=c?s.existsSync(l.join(c,"index.html")):!1;if(!(!a||!g||w(i,a)>0))return{checked:!0,updated:!1,reason:"active runtime is current",activeVersion:a,latestVersion:i};let h=await V({version:i,channel:r,cdnOrigin:t,setActive:!1});return{checked:!0,updated:!0,activeVersion:i,latestVersion:i,install:h}}async function B(e={}){let t=f();try{let r=await y(d(e.cdnOrigin)),n=x(e.channel),i=r.channels[n]?.latest??null,o=!!(i&&(!t||w(i,t)>0));return{active:t,latest:i,outdated:o}}catch{return{active:t,latest:null,outdated:!1}}}async function _(e,t){let r=await fetch(e);if(!r.ok||!r.body)throw new Error(`download failed: ${r.status} ${r.statusText} (${e})`);s.mkdirSync(l.dirname(t),{recursive:!0});let n=`${t}.partial`;try{await M(k.fromWeb(r.body),s.createWriteStream(n)),s.renameSync(n,t)}catch(i){try{s.unlinkSync(n)}catch{}throw i}}function j(e){return new Promise((t,r)=>{let n=C.createHash("sha256"),i=s.createReadStream(e);i.on("data",o=>n.update(o)),i.on("error",r),i.on("end",()=>t(n.digest("hex")))})}function A(e,t){return new Promise((r,n)=>{let i=I("tar",["-xzf",e,"-C",t],{stdio:["ignore","inherit","inherit"]});i.on("error",n),i.on("exit",o=>{o===0?r():n(new Error(`tar exited with code ${o}`))})})}export{N as a,D as b,E as c,d,x as e,T as f,P as g,y as h,U as i,V as j,q as k,B as l};
@@ -1,2 +1,2 @@
1
- /*! sootsim v0.1.93 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{g as w,i as u,j as m,k as l}from"./chunk-W5ET7GSK.js";var p="sootsim:settings",v=["errorReporting","colorScheme","a11yMode","a11yDepth","screenshotCanvas","screenshotBackground","screenshotText","screenshotPose","screenshotDynamicSize","agentProvider","onboardingComplete","betaConsentVersion","detailedTelemetry"];function S(){if(typeof window>"u")return null;let e=window.sootsimElectron;return e&&typeof e=="object"?e:null}function g(e){let t={};for(let n of v){if(!(n in e))continue;let r=e[n],o=u[n];o.validate&&!o.validate(r)||o.options&&!o.options.includes(r)||(t[n]=r)}return t}function h(e){let t={};for(let n of v)t[n]=e[n];return t}function _(){if(typeof localStorage>"u")return{};try{let e=localStorage.getItem(p);return e?g(JSON.parse(e)):{}}catch{return{}}}function V(e){if(!(typeof localStorage>"u"))try{localStorage.setItem(p,JSON.stringify(h(e)))}catch{}}function E(){let t=S()?.sharedConfig?.settings;return!t||typeof t!="object"?{}:g(t)}function K(e){let t=S();if(t?.writeSharedConfig)try{t.writeSharedConfig({settings:h(e)})}catch{}}function k(){if(typeof window>"u")return null;let e=window.__sootsimSharedConfig;return e&&typeof e=="object"?e:null}function j(){let e=k()?.settings;return!e||typeof e!="object"?{}:g(e)}function D(e){if(!k())return;let t={settings:h(e)};try{if(globalThis.__sootsimBridgeRequest?.writeSharedConfig?.(t))return}catch{}if(!(typeof fetch>"u"))try{fetch("/__sootsim/shared-config",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t),keepalive:!0}).catch(()=>{})}catch{}}function b(){let e=_(),t=j(),n=E();return{...e,...t,...n}}function R(e){V(e),K(e),D(e)}function C(e){if(typeof window>"u")return()=>{};let t=i=>{if(!(i.key!==p||i.newValue==null))try{e(g(JSON.parse(i.newValue)))}catch{}};window.addEventListener("storage",t);let n=S(),r;n?.onSharedConfigChanged&&(r=n.onSharedConfigChanged(i=>{let d=i?.settings;!d||typeof d!="object"||e(g(d))}));let c=globalThis.__sootsimBridgeRequest?.subscribeSharedConfig?.(i=>{let d=i?.settings;!d||typeof d!="object"||e(g(d))});return()=>{window.removeEventListener("storage",t),r?.(),c?.()}}var M=l(),P=b();for(let e of Object.keys(m()))delete P[e];var s={...M,...P},f=[],a=null;function y(){for(let e of f)e();R(s)}C(e=>{let t={...s},n=!1;for(let[r,o]of Object.entries(e)){let c=r;t[c]!==o&&(t[c]=o,n=!0)}if(n){s=t,a=null;for(let r of f)r()}});var L={get(e){return s[e]},set(e,t){let n=u[e];n.validate&&!n.validate(t)||n.options&&!n.options.includes(t)||s[e]!==t&&(s={...s,[e]:t},e==="deviceModel"&&(a=null),y())},getAll(){return s},apply(e){let t=!1,n={...s};for(let[r,o]of Object.entries(e)){if(o===void 0)continue;let c=r,i=u[c];i&&(i.validate&&!i.validate(o)||i.options&&!i.options.includes(o)||n[c]!==o&&(n[c]=o,t=!0))}t&&(s=n,a=null,y())},reset(){s=l(),a=null,y()},subscribe(e){return f.push(e),()=>{f=f.filter(t=>t!==e)}},getDeviceSpec(){return a||(a=w(s.deviceModel)),a},getA11yMode(){return s.a11yMode},setA11yMode(e){this.set("a11yMode",e)},getInspectMode(){return s.inspectMode},setInspectMode(e){this.set("inspectMode",e)}};export{L as a};
1
+ /*! sootsim v0.1.95 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
+ import{g as w,i as u,j as m,k as l}from"./chunk-G4UGGSGJ.js";var p="sootsim:settings",v=["errorReporting","colorScheme","a11yMode","a11yDepth","screenshotCanvas","screenshotBackground","screenshotText","screenshotPose","screenshotDynamicSize","agentProvider","onboardingComplete","betaConsentVersion","detailedTelemetry"];function S(){if(typeof window>"u")return null;let e=window.sootsimElectron;return e&&typeof e=="object"?e:null}function g(e){let t={};for(let n of v){if(!(n in e))continue;let r=e[n],o=u[n];o.validate&&!o.validate(r)||o.options&&!o.options.includes(r)||(t[n]=r)}return t}function h(e){let t={};for(let n of v)t[n]=e[n];return t}function _(){if(typeof localStorage>"u")return{};try{let e=localStorage.getItem(p);return e?g(JSON.parse(e)):{}}catch{return{}}}function V(e){if(!(typeof localStorage>"u"))try{localStorage.setItem(p,JSON.stringify(h(e)))}catch{}}function E(){let t=S()?.sharedConfig?.settings;return!t||typeof t!="object"?{}:g(t)}function K(e){let t=S();if(t?.writeSharedConfig)try{t.writeSharedConfig({settings:h(e)})}catch{}}function k(){if(typeof window>"u")return null;let e=window.__sootsimSharedConfig;return e&&typeof e=="object"?e:null}function j(){let e=k()?.settings;return!e||typeof e!="object"?{}:g(e)}function D(e){if(!k())return;let t={settings:h(e)};try{if(globalThis.__sootsimBridgeRequest?.writeSharedConfig?.(t))return}catch{}if(!(typeof fetch>"u"))try{fetch("/__sootsim/shared-config",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t),keepalive:!0}).catch(()=>{})}catch{}}function b(){let e=_(),t=j(),n=E();return{...e,...t,...n}}function R(e){V(e),K(e),D(e)}function C(e){if(typeof window>"u")return()=>{};let t=i=>{if(!(i.key!==p||i.newValue==null))try{e(g(JSON.parse(i.newValue)))}catch{}};window.addEventListener("storage",t);let n=S(),r;n?.onSharedConfigChanged&&(r=n.onSharedConfigChanged(i=>{let d=i?.settings;!d||typeof d!="object"||e(g(d))}));let c=globalThis.__sootsimBridgeRequest?.subscribeSharedConfig?.(i=>{let d=i?.settings;!d||typeof d!="object"||e(g(d))});return()=>{window.removeEventListener("storage",t),r?.(),c?.()}}var M=l(),P=b();for(let e of Object.keys(m()))delete P[e];var s={...M,...P},f=[],a=null;function y(){for(let e of f)e();R(s)}C(e=>{let t={...s},n=!1;for(let[r,o]of Object.entries(e)){let c=r;t[c]!==o&&(t[c]=o,n=!0)}if(n){s=t,a=null;for(let r of f)r()}});var L={get(e){return s[e]},set(e,t){let n=u[e];n.validate&&!n.validate(t)||n.options&&!n.options.includes(t)||s[e]!==t&&(s={...s,[e]:t},e==="deviceModel"&&(a=null),y())},getAll(){return s},apply(e){let t=!1,n={...s};for(let[r,o]of Object.entries(e)){if(o===void 0)continue;let c=r,i=u[c];i&&(i.validate&&!i.validate(o)||i.options&&!i.options.includes(o)||n[c]!==o&&(n[c]=o,t=!0))}t&&(s=n,a=null,y())},reset(){s=l(),a=null,y()},subscribe(e){return f.push(e),()=>{f=f.filter(t=>t!==e)}},getDeviceSpec(){return a||(a=w(s.deviceModel)),a},getA11yMode(){return s.a11yMode},setA11yMode(e){this.set("a11yMode",e)},getInspectMode(){return s.inspectMode},setInspectMode(e){this.set("inspectMode",e)}};export{L as a};
@@ -0,0 +1,12 @@
1
+ /*! sootsim v0.1.95 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
+ import{a as _,b as W,c as de,e as me}from"./chunk-LC46VXFM.js";import{m as O}from"./chunk-LJAA2AIH.js";import{k as ae,l as le,n as ce}from"./chunk-G4ZC5446.js";import{a as pe,b as fe}from"./chunk-R3JEQB64.js";import{b as ie,c as I,d as S,e as x}from"./chunk-FQ3XGA7P.js";import{c as k,d as w,e as C}from"./chunk-5VJVM63B.js";import{g as G}from"./chunk-UFV5UVWJ.js";import{a as T,b as q}from"./chunk-75ETPOPS.js";import{c as ue}from"./chunk-ZBIHQFJH.js";import{d as j}from"./chunk-GQOMMF7T.js";import{a as se}from"./chunk-7SLPVN2T.js";import{E as ne,F as re}from"./chunk-B7ZFNEFJ.js";import Pe from"node:fs";import Le from"node:os";import J from"node:path";function Ue(t){return t.replace(/^\[|\]$/g,"").toLowerCase()}function V(t){let o=Ue(t);return o==="localhost"||o.endsWith(".localhost")||o==="0.0.0.0"||o==="::1"||/^127(?:\.\d{1,3}){3}$/.test(o)}function ge(t){return new Error(`could not resolve a native bundle for ${t}. pass an explicit bundle URL or open Connect and choose the app there.`)}function Me(t,o){return t?.includes("/one/metro-entry.bundle")?"one":typeof o=="string"&&o?"expo":"unknown"}function be(t,o,e){return`${t}//${o}:${e}`}function Re(t){if(typeof window>"u")return!1;try{let o=new URL(t);return V(o.hostname)&&V(window.location.hostname)&&o.origin!==window.location.origin}catch{return!1}}async function he(t,o){let e={...o,cache:o?.cache??"no-store"};return Re(t)?fetch(`/__fetch-proxy?url=${encodeURIComponent(t)}`,e):fetch(t,e)}function Ee(t){return t==="https:"?443:80}function Oe(t){let o=t.pathname||"/";return(o==="/"||o==="")&&!t.search&&!t.hash}async function ye(t,o){let e=t.replace(/\/+$/,"");try{let n=await he(`${e}/`,{headers:{"expo-platform":"ios"}});if(n.ok){let r=await n.json(),s=r?.extra?.expoClient||r?.extra||{},a=typeof r?.launchAsset?.url=="string"?r.launchAsset.url:void 0;if(a||s.name)return{bundleUrl:de(a||`${e}${W}`),port:o,framework:Me(a,s.sdkVersion),projectName:s.name}}}catch{}try{let n=await he(`${e}/status`);if(n.ok&&(await n.text()).includes("packager-status:running"))return{bundleUrl:`${e}${W}`,port:o,framework:"metro"}}catch{}return null}async function we(t){return ye(be("http:","localhost",t),t)}async function Se(t){let o=t.trim();if(/^\d+$/.test(o)){let i=parseInt(o,10),l=await we(i);if(l)return l;let c=3;for(let d=1;d<=c;d++){let m=await we(i+d);if(m)return m}throw ge(`localhost:${i} (also scanned +1..+${c})`)}let e=o.startsWith("http")?o:`http://${o}`,n;try{n=new URL(e)}catch{throw new Error(`could not parse "${t}". 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):Ee(r),a=be(r,n.hostname,s);if(Oe(n)){let i=await ye(a,s);if(i)return i;throw ge(a)}return{bundleUrl:n.toString(),port:s,framework:"unknown"}}function dt(){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 ve(t){let o=T();if(console.log(` note: no sootsim bridge detected on port ${t}`),o){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 _e(t){console.error(""),console.error(` no sim is connected to the sootsim bridge on port ${t}.`),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 mt(t,o,e){let n=[];try{n=await t.listSims()}catch{}if(console.error(""),n.length===0){_e(o);return}console.error(` no sim with id "${e}" is connected to the bridge on port ${o}.`),console.error(""),console.error(" connected sims:");for(let r of n){let s=[r.isPrimary?"primary":null,r.readyState,r.userVisible===!1?"hidden":r.userVisible===!0?"visible":null,r.userFocused?"focused":null].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 De={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 v(t){return new Promise(o=>setTimeout(o,t))}function A(t){return t.trim()}function Y(t){try{let o=new URL(t),e=o.pathname.replace(/\/+$/,"")||"/";return o.searchParams.has("open")||o.searchParams.has("port")||o.searchParams.has("bundle")||o.searchParams.has("demo")||o.pathname.includes("/sootsim/index.html")||e==="/sootsim"||o.pathname==="/__soot"||o.pathname==="/__soot/"||e==="/rn"||/^\/rn\/[^/]+$/i.test(e)||/^\/app\/[^/]+$/i.test(e)||e==="/__soot/rn"||/^\/__soot\/rn\/[^/]+$/i.test(e)||/^\/__soot\/app\/[^/]+$/i.test(e)}catch{return!1}}function Ae(t){try{let o=new URL(t).pathname.replace(/\/+$/,"")||"/";return/^\/preview\/[^/]+$/.test(o)||/^\/build\/.+/.test(o)}catch{return!1}}async function Mt(t){let o=A(t);return(await ke(o)).bundleUrl}function Fe(t){try{let o=new URL(t.startsWith("http")?t:`http://${t}`),e=o.pathname||"/";if(e!=="/"&&e!==""||o.search||o.hash||!/^(localhost|127\.0\.0\.1|\[::1\]|::1)$/i.test(o.hostname))return null;let n=o.port?Number(o.port):o.protocol==="https:"?443:80;return Number.isFinite(n)&&n>0?n:null}catch{return null}}async function ke(t){let o=A(t),e=/^\d+$/.test(o)?Number(o):Fe(o);if(e&&e>0){let n=await me(e);if(n)return{bundleUrl:n.bundleUrl,port:n.port,framework:n.framework,projectName:n.projectName}}return Se(o)}function X(t){let o=t.replace(/\/+$/,"")||"/";return o==="/__soot"||o.startsWith("/__soot/")?"/__soot":""}function Ne(t,o){let e=A(t),n=new URL(o),r=X(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(e)?n.pathname=`${r}/rn/${e}`:(n.pathname=`${r}/rn`,n.searchParams.set("open",e)),n.toString()}function He(t){let o=A(t);return/^\d+$/.test(o)||/^https?:\/\//i.test(o)?!0:/^(localhost|127\.0\.0\.1|\[::1\]|[^/]+\.localhost):\d+(?:\/.*)?$/i.test(o)}async function Ke(t,o){let e=await ke(t),n=new URL(o),r=X(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",e.bundleUrl),n.toString()}function ze(t){return t.startsWith("~/")?J.join(Le.homedir(),t.slice(2)):J.isAbsolute(t)?t:J.resolve(process.cwd(),t)}function je(t){let o={};for(let e=0;e<t.length;e++){if(t[e]!=="--replace")continue;let n=t[e+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(),a=ze(n.slice(r+1).trim());Pe.existsSync(a)||(console.error(` sootsim open: replacement file not found: ${a}`),process.exit(1)),o[s]={file:a},e++}return Object.keys(o).length>0?{modules:o}:void 0}function Ce(){let t=ne();return re(t)&&t.runtimePort>0?`http://localhost:${t.runtimePort}/`:se}function We(t,o){try{let e=new URL(t),n=e.searchParams.get("bundle")||"",r=o||fe(pe({bundleUrl:n}));return r?(e.searchParams.set("appFonts",r),e.toString()):t}catch{return t}}async function qe(t,o){if(!t)return new URL(o).toString();if(Y(t))return new URL(t).toString();let e=De[t.toLowerCase()];if(e){let n=new URL(o),r=X(n.pathname);return n.pathname=`${r}${e}`,n.toString()}return He(t)?Ke(t,o):Ne(t,o)}async function D(t,o=Ce(),e=process.env.SOOT_APP_FONTS||""){return We(await qe(t,o),e)}function $e(t,o){let e=t?.url||t?.origin||o;try{let n=new URL(e);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 o}}async function Ge(t,o,e){let n=new URL(await D(t,o));return n.searchParams.set("inspectOpen",e),n.toString()}async function Ve(t,o,e,n={}){let r=n.attempts??30,s=n.intervalMs??500,a=n.minNodeCount??10;for(let i=0;i<r;i++){let l=S(t,{commandTimeoutMs:o,simId:e,simIdSource:"flag"});try{let c=await l.send({type:"evaluate",code:"(async () => (await window.__sootsimTest?.getNodeCount()) || 0)()"});if(typeof c=="number"&&c>a)return{bridge:l,count:c}}catch{}l.close(),await v(s)}return null}function Je(t){if(!t)return null;try{let o=new URL(t);if(o.searchParams.has("bundle")){let e=o.searchParams.get("bundle")||"";try{let n=new URL(e),r=n.pathname.length>36?`...${n.pathname.slice(-36)}`:n.pathname;return`bundle ${n.host}${r}`}catch{return"bundle"}}return o.searchParams.has("port")?`connect :${o.searchParams.get("port")||""}`:o.searchParams.has("open")?`connect ${o.searchParams.get("open")||""}`:o.searchParams.has("demo")?`demo ${o.searchParams.get("demo")||"default"}`:o.pathname.includes("/sootsim/index.html")||o.pathname==="/sootsim/"||o.pathname==="/sootsim"?"embedded sootsim":null}catch{return null}}function Qe(t,o){if(t.length===0){console.log(" no sims connected");return}console.log(` connected sims (${t.length}):
3
+ `);for(let e of t){let n=e.lockedBy&&e.lockExpiresAt?`locked by ${e.lockedBy} (${Math.max(0,Math.round((e.lockExpiresAt-Date.now())/1e3))}s)`:"",r=[e.isPrimary?"primary":"",e.id===o?"selected":"",e.readyState,e.userVisible===!1?"hidden":e.userVisible===!0?"visible":"",e.attachedCliCount&&e.attachedCliCount>0?"in use":"",e.userFocused?"focused":"",n].filter(Boolean);console.log(` ${e.id}${r.length?` [${r.join(", ")}]`:""}`);let s=Je(e.url);if(s)console.log(` loaded: ${s}`);else if(e.url){let a=e.url.length>96?`${e.url.slice(0,93)}\u2026`:e.url;console.log(` url: ${a}`)}else e.origin&&console.log(` origin: ${e.origin}`);e.title&&console.log(` title: ${e.title}`),e.visibilityState&&e.visibilityState!=="visible"&&console.log(` visibility: ${e.visibilityState}`),console.log(` connected: ${Ie(Date.now()-e.connectedAt)}`),e.lastActiveAt&&e.lastActiveAt>0&&console.log(` last active: ${Ie(Date.now()-e.lastActiveAt)}`)}}function Ie(t){let o=Math.max(0,Math.round(t/1e3));return o<60?`${o}s ago`:o<3600?`${Math.round(o/60)}m ago`:o<86400?`${Math.round(o/3600)}h ago`:`${Math.round(o/86400)}d ago`}async function L(t,o,e,n={}){let r=n.attempts??30,s=n.intervalMs??500;for(let a=0;a<r;a++){let i=S(t,{commandTimeoutMs:o});try{let c=(await i.listSims()).find(e);if(c)return c}catch{}finally{i.close()}await v(s)}return null}async function Ye(t,o,e,n={}){let r=n.attempts??20,s=n.intervalMs??250;for(let a=0;a<r;a++){let i=S(t,{commandTimeoutMs:o});try{let c=(await i.listSims()).find(d=>d.id===e);if(!c||c.readyState!=="open")return!0}catch{return!0}finally{i.close()}await v(s)}return!1}function Xe(t){let o=t.meta;if(!o||o.sootsimHostDriver!=="playwright")return null;let e=Number(o.sootsimHostPid);return!Number.isInteger(e)||e<=1||e===process.pid?null:e}function Ze(t){if(!t.connectAckFile)return!1;try{return Pe.writeFileSync(t.connectAckFile,`${JSON.stringify({connectedAt:Date.now(),pid:t.pid??null})}
4
+ `,{flag:"w"}),!0}catch{return!1}}function xe(t){try{return process.kill(t,0),!0}catch(o){return o?.code==="EPERM"}}async function et(t,o=2500){let e=Date.now()+o;for(;Date.now()<e;){if(!xe(t))return!0;await v(100)}return!xe(t)}async function Q(t,o){let e=new Set(o),n=new Set;for(let r of t){if(!e.has(r.id))continue;let s=Xe(r);s&&n.add(s)}for(let r of n){try{process.kill(r,"SIGTERM")}catch{}if(await et(r)){console.log(` closed playwright host process ${r}`);continue}try{process.kill(r,"SIGKILL"),console.log(` force-closed playwright host process ${r}`)}catch{}}}function F(t,o){if(o){let r=o.trim(),s=t.find(a=>a.id===r);if(!s)throw new Error(`no sim connected with id ${r}`);return s}let e=t.find(r=>r.isPrimary&&r.readyState==="open");if(e)return e;let n=t.find(r=>r.readyState==="open");if(n)return n;throw new Error("no sim connected")}function B(t,o,e){console.log(` ${e==="current sim"?"loaded":"opened"}: ${t} [${e}]`),console.log(` current sim: ${o.id}`),console.log(JSON.stringify({simId:o.id,url:o.url},null,2))}async function U(t,o,e){if(e.includes("--no-describe"))return;let n=process.env.SOOTSIM_QUIET_TARGET_NOTICE;process.env.SOOTSIM_QUIET_TARGET_NOTICE="1";try{await tt(t,o,{stableMs:150,maxMs:400});let r=S(t,{commandTimeoutMs:3e3,simId:o,cliLabel:"open --describe",simIdSource:"flag"});try{let s=null;try{s=await r.send({type:"evaluate",code:ae})}catch{}if(s&&!(s.flag===!0&&!s.loadingText&&s.nodes>=le&&ce(s))){let d=s.loadingText?`still showing "${s.loadingText}"`:s.flag!==!0?"guest ready event has not fired":s.targets<=0?"no visible app content is inspectable yet":"app tree is still stabilizing";console.log(` app still loading: ${d} (nodes: ${s.nodes}, targets: ${s.targets})`),console.log(" before interacting, run: sootsim wait ready --max-ms 120000")}let i=`(async () => {
5
+ const t = window.__sootsimTest
6
+ const ms = window.SootSim?.bridges?.mainShell
7
+ if (!t) return null
8
+ let shell = null
9
+ try { shell = ms?.getState ? await ms.getState() : null } catch {}
10
+ const tree = await t.dumpTree(12, ${JSON.stringify({describe:!0,verbose:!1,filter:""})})
11
+ return { tree, shell }
12
+ })()`,l=await r.send({type:"evaluate",code:i});if(!l?.tree)return;if(console.log(""),l.shell?.state){let c=[`state=${l.shell.state}`,l.shell.activeApp?`app=${l.shell.activeApp}`:null].filter(Boolean);console.log(` shell: ${c.join(" ")}`)}console.log(l.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 tt(t,o,e){let n=Date.now()+e.maxMs,r="(async () => (await window.__sootsimTest?.getNodeCount?.()) || 0)()",s=S(t,{commandTimeoutMs:2e3,simId:o,simIdSource:"flag"});try{let a=-1,i=0;for(;Date.now()<n;){let l=-1;try{let c=await s.send({type:"evaluate",code:r});typeof c=="number"&&(l=c)}catch{}if(l>=0&&l===a){if(Date.now()-i>=e.stableMs)return}else a=l,i=Date.now();await v(50)}}finally{s.close()}}async function Rt(t,o={}){let e=I(t,{port:o.port,commandTimeoutMs:o.timeoutMs}),n=x(e);try{let r=await n.listSims();Qe(r,e.simId)}finally{n.close()}}async function Et(t,o={}){let e=I(t,{port:o.port,commandTimeoutMs:o.timeoutMs,stripBooleanFlags:["--new","--headless","--ephemeral"],stripValueFlags:["--base-url","--replace","--driver","--profile","--cdp-port"]}),n=t.find((p,u)=>t[u-1]==="--profile"),r=t.includes("--ephemeral"),s=t.find((p,u)=>t[u-1]==="--cdp-port"),a=s?Number(s):void 0;s&&(!Number.isFinite(a)||a<=0)&&(console.error(` sootsim open: --cdp-port must be a positive port number, got "${s}"`),process.exit(1)),n&&r&&(console.error(" sootsim open: --profile cannot be combined with --ephemeral"),process.exit(1));let i=n?ue(n).id:void 0,l=!!i||r,c=t.includes("--new")||l,d=je(t);c&&e.simIdSource==="flag"&&(console.error(" sootsim open: --new, --profile, and --ephemeral cannot be combined with --sim"),process.exit(1));let m=e.positional[0]||"";if(Ae(m)){let p=(()=>{try{return/^(localhost|127\.0\.0\.1|\[::1\]|::1)$/i.test(new URL(m).hostname)}catch{return!1}})();console.log(" that\u2019s a SootSim preview/build link \u2014 a full player page, not a driveable sim."),console.log(" opening it in your browser for viewing\u2026");try{await j(m,{background:!1})}catch(u){console.error(` could not launch a browser: ${u instanceof Error?u.message:String(u)}`),console.error(` open it yourself: ${m}`),process.exit(1)}console.log(p?" to drive it under the CLI, point `sootsim open` at the app\u2019s dev port instead (e.g. `sootsim open 8081`).":" the CLI can\u2019t drive a remote preview (the engine only attaches to the local bridge from localhost). to drive the app, run it locally and `sootsim open <port>`.");return}let h=t.find((p,u)=>t[u-1]==="--driver")||"",N=t.includes("--headless");a&&h!=="playwright"&&(console.error(" sootsim open: --cdp-port is only honored by the playwright driver \u2014 add `--driver playwright`"),process.exit(1));let P=t.find((p,u)=>t[u-1]==="--base-url")||Ce(),Z=t.includes("--base-url"),ee=k();if(!h&&!c&&(e.simIdSource==="flag"||e.simIdSource==="saved"&&!!ee)){let p=x(e),u=e.simId?` --sim ${e.simId}`:"",f=!1;try{let g=null;try{let y=await p.listSims();if(e.simIdSource==="saved"?(g=y.find($=>$.id===ee&&$.readyState==="open")??null,g||C()):g=F(y,e.simId),!g)if(e.simIdSource==="saved")f=!0;else throw new Error("no sim connected");if(!f&&g){let $=Z||Y(m)?P:$e(g,P),E=await D(m,_($,d));p.send({type:"evaluate",simId:g.id,code:`window.location.href = ${JSON.stringify(E)}`}).catch(()=>{})}}catch(y){console.error(` open failed: ${y instanceof Error?y.message:String(y)}`),await O(p,{errorsCommand:`sootsim get errors 5${u}`,warningsCommand:`sootsim get warnings 5${u}`,requestsCommand:`sootsim get requests 5${u}`}),process.exit(1)}if(!f&&g){await v(1500);let y=await Ve(e.wsPort,e.commandTimeoutMs,g.id);y||(console.error(" timed out waiting for current sim to load target"),process.exit(1)),y.bridge.close(),w(g.id);let $=Z||Y(m)?P:$e(g,P),E=await D(m,_($,d));B(E,{...g,url:E},"current sim"),await U(e.wsPort,g.id,t);return}}finally{p.close()}}let te=_(P,d),Be=await D(m,te),oe=`cli-${Date.now().toString(36)}-${Math.random().toString(36).slice(2,8)}`,b=await Ge(m,te,oe),H={newWindow:!0},M=p=>p.url?.includes(`inspectOpen=${oe}`)??!1;if(h){let p=G(h);p||(console.error(` unknown driver "${h}" \u2014 run \`sootsim list --drivers\``),process.exit(1));let u=await p.launch({url:b,headless:N,newWindow:H.newWindow,profileId:i,ephemeralProfile:r,cdpPort:a});u.launched||(console.error(` ${p.name} driver: ${u.message}`),process.exit(1));let f=await L(e.wsPort,e.commandTimeoutMs,M,{attempts:60,intervalMs:500});if(!f){if(u.pid)try{process.kill(u.pid,"SIGTERM"),console.error(` closed ${p.name} host process ${u.pid}`)}catch{}console.error(" timed out waiting for opened sim to connect"),process.exit(1)}w(f.id),Ze(u),B(b,f,`${p.name} driver`),await U(e.wsPort,f.id,t);return}if(l){let p=T();p||(console.error(" profiles require electron or playwright; install the desktop companion or use `--driver playwright`"),process.exit(1));try{(await q(b,p,{profileId:i,ephemeralProfile:r})).launched||(console.error(" desktop companion failed to start"),process.exit(1))}catch(f){console.error(` desktop companion failed: ${f instanceof Error?f.message:String(f)}`),process.exit(1)}let u=await L(e.wsPort,e.commandTimeoutMs,M,{attempts:40,intervalMs:500});u||(console.error(" timed out waiting for profiled sim to connect"),process.exit(1)),w(u.id),B(b,u,"desktop companion"),await U(e.wsPort,u.id,t);return}let K=!1,z=!1;try{let p=S(e.wsPort,{commandTimeoutMs:2e3});try{await p.listSims(),K=!0}finally{p.close()}}catch{}if(K)try{let p=S(e.wsPort,{commandTimeoutMs:3e3});try{await p.openUrl(b,H),z=!0}finally{p.close()}}catch{}if(!z){let p=T();if(p)try{if((await q(b,p)).launched){let f=await L(e.wsPort,e.commandTimeoutMs,M,{attempts:20,intervalMs:500});if(f){w(f.id),B(b,f,"desktop companion"),await U(e.wsPort,f.id,t);return}}}catch{}try{await j(b,H)}catch(u){console.error(` open failed: ${u instanceof Error?u.message:String(u)}`),G("playwright")?.availability().available?console.error(" no system browser found \u2014 retry with `sootsim open \u2026 --driver playwright` for a headless sim."):console.error(" run `sootsim list --drivers` to see available drivers."),process.exit(1)}if(!K){console.log(` opened: ${Be}`),ve(e.wsPort);return}}let R=await L(e.wsPort,e.commandTimeoutMs,M,{attempts:30,intervalMs:500});R||(console.error(" timed out waiting for opened sim to connect"),process.exit(1)),w(R.id),B(b,R,z?"bridge":"direct shell open"),await U(e.wsPort,R.id,t)}async function Te(t,o={}){let e=I(t,{port:o.port,commandTimeoutMs:o.timeoutMs,stripBooleanFlags:["--force"]}),n=t.includes("--force"),r=x(e),s=e.simId?` --sim ${e.simId}`:"";try{try{let a=await r.listSims(),i=F(a,e.positional[0]||e.simId);if(i.lockedBy&&i.lockExpiresAt&&i.lockExpiresAt>Date.now()){let l=Math.max(0,Math.round((i.lockExpiresAt-Date.now())/1e3));i.lockedByKind==="user-active"&&(console.error(` refused: ${i.id} is locked by the active user (${l}s) \u2014 that's a live human tab`),console.error(" run `sootsim open --new` for a fresh investigation sim"),process.exit(1)),n||(console.error(` refused: ${i.id} is leased by ${i.lockedBy} (${l}s)`),console.error(` \`sootsim use ${i.id} --force\` to take it, or \`sootsim open --new\` for a fresh sim`),process.exit(1))}await r.focusSim(i.id),w(i.id),console.log(` using: ${i.id}`)}catch(a){console.error(` use failed: ${a instanceof Error?a.message:String(a)}`),await O(r,{errorsCommand:`sootsim get errors 5${s}`,warningsCommand:`sootsim get warnings 5${s}`,requestsCommand:`sootsim get requests 5${s}`}),process.exit(1)}}finally{r.close()}}async function Ot(t,o={}){await Te(t,o)}async function _t(t,o={}){await Te(t,o)}async function Lt(t,o={}){let e=I(t,{port:o.port,commandTimeoutMs:o.timeoutMs,stripBooleanFlags:["--force"]}),n=t.includes("--force"),r=x(e);try{try{let s=await r.listSims(),a=F(s,e.positional[0]||e.simId),i=n&&a.lockedBy&&a.lockedByKind!=="user-active"?a.lockedBy:null,l=await r.claim(a.id,{force:n});w(a.id);let c=Math.max(0,Math.round((l.lockExpiresAt-Date.now())/1e3)),d=l.bootedCount>0?` (booted ${l.bootedCount})`:"";console.log(` claimed: ${l.simId} [${c}s]${d}`),i&&console.log(` took over from: ${i}`)}catch(s){if(s instanceof ie){let a=Math.max(0,Math.round(s.lock.expiresInMs/1e3));console.error(` claim failed: locked by ${s.lock.by} for ${a}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 ot(t,o,e,n){if(n.length===0)return{closed:[],remaining:[]};await Promise.all(n.map(s=>t.closeSim(s).catch(()=>{})));let r=new Set(n);for(let s=0;s<40;s++){let a=[];try{let i=S(o,{commandTimeoutMs:e});try{a=(await i.listSims()).filter(c=>r.has(c.id)&&c.readyState==="open").map(c=>c.id)}finally{i.close()}}catch{a=[]}if(a.length===0)return{closed:[...r],remaining:[]};if(s===39)return{closed:[...r].filter(i=>!a.includes(i)),remaining:a};await v(250)}return{closed:[...r],remaining:[]}}function nt(t,o){let e=t.filter(m=>m.readyState==="open"),n=e.map(m=>m.id),r=o.explicitKeepId?.trim()||"",s=o.savedKeepId?.trim()||"",a=s?e.some(m=>m.id===s):!1,i=s&&!a?s:null,l=null,c=null,d=null;if(o.closeOthers)if(r){let m=e.find(h=>h.id===r);m?l=m.id:c=r}else if(s&&a)l=s;else{let m=e.find(h=>h.isPrimary)??e[0]??null;m&&(l=m.id,s&&!a&&(d=m.id))}return{openIds:n,keepId:l,targets:c?[]:n.filter(m=>m!==l),staleSavedId:i,missingExplicitKeepId:c,fallbackKeepId:d}}async function Dt(t,o={}){let e=I(t,{port:o.port,commandTimeoutMs:o.timeoutMs,stripBooleanFlags:["--all","--others"]}),n=x(e),r=e.simId?` --sim ${e.simId}`:"",s=t.includes("--all"),a=t.includes("--others");if(s||a){try{let i=await n.listSims(),l=k(),c=e.positional[0]||(e.simIdSource==="flag"?e.simId:void 0),d=nt(i,{closeOthers:a,explicitKeepId:c,savedKeepId:l});if(d.staleSavedId&&C(),d.fallbackKeepId&&(w(d.fallbackKeepId),console.log(` saved sim ${d.staleSavedId} is gone \u2014 keeping primary ${d.fallbackKeepId}`)),d.missingExplicitKeepId&&(console.error(` close failed: keep sim ${d.missingExplicitKeepId} is not connected; not closing other sims`),process.exit(1)),d.targets.length===0){console.log(d.keepId?` nothing to close \u2014 only the kept sim ${d.keepId} is connected`:d.staleSavedId?` nothing to close \u2014 no sims connected (cleared stale current sim ${d.staleSavedId})`:" nothing to close \u2014 no sims connected");return}let m=await ot(n,e.wsPort,e.commandTimeoutMs,d.targets);await Q(i,d.targets);let h=k();h&&m.closed.includes(h)&&(d.keepId?w(d.keepId):C());let N=` closed ${m.closed.length} sim(s)${d.keepId?` (kept ${d.keepId})`:""}`;console.log(N),m.remaining.length>0&&(console.error(` close failed: still connected: ${m.remaining.join(", ")}`),process.exit(1))}catch(i){console.error(` close failed: ${i instanceof Error?i.message:String(i)}`),process.exit(1)}finally{n.close()}return}try{try{let i=await n.listSims(),l=F(i,e.positional[0]||e.simId),c=i.find(m=>m.id!==l.id&&m.readyState==="open");await n.closeSim(l.id),await Ye(e.wsPort,e.commandTimeoutMs,l.id)||(await Q(i,[l.id]),console.error(` close failed: ${l.id} is still connected`),process.exit(1)),await Q(i,[l.id]),k()===l.id&&(c?w(c.id):C()),console.log(` closed: ${l.id}`)}catch(i){console.error(` close failed: ${i instanceof Error?i.message:String(i)}`),await O(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{dt as a,_e as b,mt as c,Mt as d,Ce as e,D as f,Ge as g,Je as h,Qe as i,L as j,Xe as k,Ze as l,Q as m,Rt as n,Et as o,Ot as p,_t as q,Lt as r,ot as s,nt as t,Dt as u};
@@ -0,0 +1,2 @@
1
+ /*! sootsim v0.1.95 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
+ var O="sootsim close";export{O as a};
@@ -1,3 +1,3 @@
1
- /*! sootsim v0.1.93 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{l as d}from"./chunk-M4QXOCCY.js";import{chmodSync as f,existsSync as g,mkdirSync as k,readFileSync as A,rmSync as i,writeFileSync as y}from"node:fs";import{dirname as c,join as D,resolve as p}from"node:path";var s=1,m="SOOTSIM_SHARED_AUTH_FILE",u="https://sootbean.com";function w(){let t=process.env[m];return t?.trim()?c(p(t)):d()}function a(){let t=process.env[m];return t?.trim()?p(t):D(w(),"desktop-auth.json")}function S(t){if(!t||typeof t!="object")return null;let e=t;return typeof e.id!="string"||!e.id.trim()?null:{id:e.id.trim(),name:typeof e.name=="string"?e.name:void 0,email:typeof e.email=="string"?e.email:void 0,image:typeof e.image=="string"?e.image:void 0,teams:Array.isArray(e.teams)?e.teams.map(r=>{if(!r||typeof r!="object")return null;let n=r;return typeof n.id!="string"||typeof n.name!="string"?null:{id:n.id,name:n.name,role:n.role==="owner"?"owner":"member",githubOrg:typeof n.githubOrg=="string"?n.githubOrg:null}}).filter(r=>!!r):void 0}}function v(t){if(!t||typeof t!="object")return null;let e=t;if(e.version!==s||typeof e.token!="string"||!e.token.trim())return null;let r=typeof e.origin=="string"&&e.origin.trim()?e.origin.trim():u,n=e.source==="cli"||e.source==="electron"||e.source==="browser"||e.source==="unknown"?e.source:"unknown",o=typeof e.updatedAt=="string"&&e.updatedAt?e.updatedAt:new Date().toISOString(),h=typeof e.validatedAt=="string"&&e.validatedAt?e.validatedAt:void 0;return{version:s,token:e.token.trim(),user:S(e.user),origin:r,source:n,updatedAt:o,validatedAt:h}}function O(){let t=a();if(!g(t))return null;try{let e=JSON.parse(A(t,"utf8")),r=v(e);return r||(i(t,{force:!0}),null)}catch{return i(t,{force:!0}),null}}function b(t){let e=a();k(c(e),{recursive:!0});let r={version:s,token:t.token.trim(),user:t.user?S(t.user):null,origin:t.origin?.trim()||u,source:t.source,updatedAt:t.updatedAt||new Date().toISOString(),validatedAt:t.validatedAt};y(e,JSON.stringify(r,null,2)+`
1
+ /*! sootsim v0.1.95 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
+ import{l as d}from"./chunk-B7ZFNEFJ.js";import{chmodSync as f,existsSync as g,mkdirSync as k,readFileSync as A,rmSync as i,writeFileSync as y}from"node:fs";import{dirname as c,join as D,resolve as p}from"node:path";var s=1,m="SOOTSIM_SHARED_AUTH_FILE",u="https://sootbean.com";function w(){let t=process.env[m];return t?.trim()?c(p(t)):d()}function a(){let t=process.env[m];return t?.trim()?p(t):D(w(),"desktop-auth.json")}function S(t){if(!t||typeof t!="object")return null;let e=t;return typeof e.id!="string"||!e.id.trim()?null:{id:e.id.trim(),name:typeof e.name=="string"?e.name:void 0,email:typeof e.email=="string"?e.email:void 0,image:typeof e.image=="string"?e.image:void 0,teams:Array.isArray(e.teams)?e.teams.map(r=>{if(!r||typeof r!="object")return null;let n=r;return typeof n.id!="string"||typeof n.name!="string"?null:{id:n.id,name:n.name,role:n.role==="owner"?"owner":"member",githubOrg:typeof n.githubOrg=="string"?n.githubOrg:null}}).filter(r=>!!r):void 0}}function v(t){if(!t||typeof t!="object")return null;let e=t;if(e.version!==s||typeof e.token!="string"||!e.token.trim())return null;let r=typeof e.origin=="string"&&e.origin.trim()?e.origin.trim():u,n=e.source==="cli"||e.source==="electron"||e.source==="browser"||e.source==="unknown"?e.source:"unknown",o=typeof e.updatedAt=="string"&&e.updatedAt?e.updatedAt:new Date().toISOString(),h=typeof e.validatedAt=="string"&&e.validatedAt?e.validatedAt:void 0;return{version:s,token:e.token.trim(),user:S(e.user),origin:r,source:n,updatedAt:o,validatedAt:h}}function O(){let t=a();if(!g(t))return null;try{let e=JSON.parse(A(t,"utf8")),r=v(e);return r||(i(t,{force:!0}),null)}catch{return i(t,{force:!0}),null}}function b(t){let e=a();k(c(e),{recursive:!0});let r={version:s,token:t.token.trim(),user:t.user?S(t.user):null,origin:t.origin?.trim()||u,source:t.source,updatedAt:t.updatedAt||new Date().toISOString(),validatedAt:t.validatedAt};y(e,JSON.stringify(r,null,2)+`
3
3
  `);try{f(e,384)}catch{}return r}function l(){i(a(),{force:!0})}async function U(t){let e=O();if(!e?.token)return null;let r=t||e.origin||u;try{let n=await fetch(`${r.replace(/\/$/,"")}/api/auth/me`,{headers:{authorization:`Bearer ${e.token}`}});if(n.status===401)return l(),null;if(!n.ok)return e;let o=await n.json();return o.user?.id?b({token:e.token,user:o.user,origin:r,source:e.source,validatedAt:new Date().toISOString()}):(l(),null)}catch{return e}}export{O as a,b,l as c,U as d};
@@ -1,2 +1,2 @@
1
- /*! sootsim v0.1.93 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.95 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  var m={"--help":{type:"boolean",short:"-h"},"--version":{type:"boolean",short:"-V"},"--verbose":{type:"boolean",short:"-v"},"--port":{type:"number",short:"-p"},"--device":{type:"string",short:"-d"},"--theme":{type:"string",short:"-t"},"--headless":{type:"boolean"},"--driver":{type:"string"},"--sim":{type:"string"},"--session":{type:"string"},"--tab":{type:"string"}},c=new Set(["list","describe","find","get","do","wait","network","logs","shell"]),p=new Set(["do","get","wait","shell","debug"]),b={tap:"sootsim do tap","double-tap":"sootsim do double-tap","tap-text":"sootsim do tap-text","tap-id":"sootsim do tap-id",type:"sootsim do type","type-into":"sootsim do type-into",key:"sootsim do key",dispatch:"sootsim do dispatch",dismiss:"sootsim do dismiss",scroll:"sootsim do scroll",drag:"sootsim do drag",swipe:"sootsim do swipe",pinch:"sootsim do pinch",reload:"sootsim do reload",sleep:"sootsim do sleep",settle:"sootsim do settle",tree:"sootsim get tree",a11y:"sootsim get a11y",count:"sootsim get count",layout:"sootsim get layout",url:"sootsim get url",globals:"sootsim get globals",errors:"sootsim get errors",warnings:"sootsim get warnings",requests:"sootsim get requests",node:"sootsim get node",state:"sootsim debug state",js:"sootsim debug js",eval:"sootsim debug eval",perf:"sootsim debug perf","sample-color":"sootsim debug sample-color","find-id":"sootsim find --testid",query:"sootsim find --text|--role|--type|--pressable|--visible",capture:"sootsim screenshot"},u=new Set(["preview","test","detox","maestro","flow","record","profile","cpu-profile","react","screenshot","screenshots","screenshot-mode","three-mode","3d-mode","inspect","debug","timeline","what-happened","diagnose","shell","assert","device","open","list","use","focus","claim","close","config","compat","scan","electron","login","logout","whoami","install","setup-repo","install-desktop","server","daemon","runtime","upgrade","launch","start","skills","upload","keys","hints","agent-wrapper","agent",...c,...Object.keys(b)]);function h(g){let i=g.slice(2),e={command:null,commandArgs:[],globalFlags:{},help:!1,version:!1,verbose:!1},s=0;for(;s<i.length;){let o=i[s];if(o==="--"){e.commandArgs.push(...i.slice(s+1));break}let a=Object.entries(m).find(([n,t])=>n===o||t.short===o);if(a){let[n,t]=a,l=n.replace(/^--/,"");if(t.type==="boolean")e.globalFlags[l]=!0,s++;else{let r=i[s+1];if(r===void 0||r.startsWith("-")){console.error(` warning: ${o} requires a value`),s++;continue}if(t.type==="number"){let d=Number(r);if(Number.isNaN(d)){console.error(` warning: ${o} requires a number, got "${r}"`),s+=2;continue}e.globalFlags[l]=d}else e.globalFlags[l]=r;s+=2}continue}if(!e.command&&!o.startsWith("-")){let n=o.indexOf("-");if(n>0){let t=o.slice(0,n),l=o.slice(n+1);if(p.has(t)&&l.length>0){e.command=t;let r=i.slice(s+1);e.commandArgs=[l,...r[0]==="--"?r.slice(1):r];break}}if(u.has(o)){e.command=o;let t=i.slice(s+1);e.commandArgs=t[0]==="--"?t.slice(1):t;break}e.commandArgs=i.slice(s);break}e.commandArgs.push(o),s++}return e.help=!!e.globalFlags.help,e.version=!!e.globalFlags.version,e.verbose=!!e.globalFlags.verbose,e}export{c as a,b,h as c};