sootsim 0.1.245 → 0.1.247

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 (145) hide show
  1. package/dist-cli/bin.js +4 -4
  2. package/dist-cli/chunks/{agent-UMI3624H.js → agent-HTLX4KQF.js} +2 -2
  3. package/dist-cli/chunks/{agent-wrapper-32NCVUN3.js → agent-wrapper-QM2I2EBD.js} +2 -2
  4. package/dist-cli/chunks/{app-fonts-TBS2JXBD.js → app-fonts-AKNBT2UP.js} +2 -2
  5. package/dist-cli/chunks/{assert-OMMFZ746.js → assert-MY5SFFFV.js} +2 -2
  6. package/dist-cli/chunks/{auth-WSMHQHRX.js → auth-O2LKHA4C.js} +2 -2
  7. package/dist-cli/chunks/beta-OSQRVYE6.js +2 -0
  8. package/dist-cli/chunks/{camera-PDBRIA46.js → camera-QOK5KMFT.js} +2 -2
  9. package/dist-cli/chunks/{chunk-SVJJCPWT.js → chunk-2FECZBMM.js} +2 -2
  10. package/dist-cli/chunks/{chunk-3DDBZ2FZ.js → chunk-2FJDP375.js} +2 -2
  11. package/dist-cli/chunks/{chunk-3ZCD72ZT.js → chunk-3FGUYVRW.js} +2 -2
  12. package/dist-cli/chunks/{chunk-JXVG6Q3C.js → chunk-45IDLKQN.js} +1 -1
  13. package/dist-cli/chunks/chunk-5ARB5A4I.js +1 -0
  14. package/dist-cli/chunks/{chunk-JQOVMKKD.js → chunk-5ZVIHAJF.js} +2 -2
  15. package/dist-cli/chunks/{chunk-54VL33HG.js → chunk-6HHBUJ7L.js} +2 -2
  16. package/dist-cli/chunks/{chunk-XSFLFCHE.js → chunk-7GXZLHQ6.js} +2 -2
  17. package/dist-cli/chunks/{chunk-3R74AUXP.js → chunk-APDT5K2R.js} +2 -2
  18. package/dist-cli/chunks/{chunk-7YJ5YDCN.js → chunk-AYFATLD2.js} +3 -3
  19. package/dist-cli/chunks/{chunk-C4HOGMXJ.js → chunk-BSYKHGDR.js} +3 -3
  20. package/dist-cli/chunks/{chunk-SANCSFUC.js → chunk-DN3HN7NP.js} +1 -1
  21. package/dist-cli/chunks/{chunk-DRU4THKE.js → chunk-E47232KV.js} +1 -1
  22. package/dist-cli/chunks/{chunk-WGEQ5ERO.js → chunk-EH4P26I2.js} +2 -2
  23. package/dist-cli/chunks/{chunk-RDXNAJED.js → chunk-EODZYQOI.js} +2 -2
  24. package/dist-cli/chunks/{chunk-CMGNS5BS.js → chunk-EYJS4F3A.js} +3 -3
  25. package/dist-cli/chunks/{chunk-H5UF73ZY.js → chunk-FVV3AX2Y.js} +1 -1
  26. package/dist-cli/chunks/{chunk-MBKGVLMH.js → chunk-GJTKZRJ6.js} +1 -1
  27. package/dist-cli/chunks/chunk-GSEYN5U2.js +13 -0
  28. package/dist-cli/chunks/{chunk-EADC2EO4.js → chunk-HEOFUHBL.js} +3 -3
  29. package/dist-cli/chunks/{chunk-76656NTC.js → chunk-HH4R7B6H.js} +2 -2
  30. package/dist-cli/chunks/{chunk-4QTQ7IB6.js → chunk-IEQIQZD6.js} +2 -2
  31. package/dist-cli/chunks/{chunk-4SFP6OAX.js → chunk-J2EJYSHB.js} +2 -2
  32. package/dist-cli/chunks/{chunk-LJINY7Y4.js → chunk-KFGR5SSJ.js} +1 -1
  33. package/dist-cli/chunks/{chunk-FJSEDCSJ.js → chunk-KTJUM4UT.js} +1 -1
  34. package/dist-cli/chunks/chunk-MXAZGWXS.js +1 -0
  35. package/dist-cli/chunks/chunk-NRS42OYY.js +5 -0
  36. package/dist-cli/chunks/{chunk-KJZI5667.js → chunk-NYQEGIOL.js} +1 -1
  37. package/dist-cli/chunks/{chunk-AKT6TFRG.js → chunk-OSZ4OD3O.js} +4 -4
  38. package/dist-cli/chunks/{chunk-ECI6JGA5.js → chunk-Q7HCOK5E.js} +2 -2
  39. package/dist-cli/chunks/{chunk-PFAHCNFB.js → chunk-RN3GEY4U.js} +2 -2
  40. package/dist-cli/chunks/{chunk-WU5OEQS2.js → chunk-RRT2TALP.js} +1 -1
  41. package/dist-cli/chunks/{chunk-UWQG2IZU.js → chunk-SII7HFIJ.js} +1 -1
  42. package/dist-cli/chunks/{chunk-FTWJFLIX.js → chunk-UGMJ7NOX.js} +1 -1
  43. package/dist-cli/chunks/{chunk-TOW7WQWO.js → chunk-UZZGIJ7J.js} +2 -2
  44. package/dist-cli/chunks/{chunk-IRQ7AX6M.js → chunk-VU7IQGA7.js} +2 -2
  45. package/dist-cli/chunks/{chunk-XUA5QIEZ.js → chunk-VY7HSBM7.js} +1 -1
  46. package/dist-cli/chunks/{chunk-5GUYHQTQ.js → chunk-WNINMBWE.js} +1 -1
  47. package/dist-cli/chunks/{chunk-YTKWLW7X.js → chunk-XGCK42RK.js} +2 -2
  48. package/dist-cli/chunks/{chunk-2BPZJTMF.js → chunk-XJQRQLWK.js} +1 -1
  49. package/dist-cli/chunks/{chunk-XN4CFIPA.js → chunk-YQ662TA3.js} +1 -1
  50. package/dist-cli/chunks/{chunk-2JMGQZXX.js → chunk-ZJ6V2Q5D.js} +1 -1
  51. package/dist-cli/chunks/{chunk-TUHXJKDI.js → chunk-ZTPGU6EE.js} +2 -2
  52. package/dist-cli/chunks/{chunk-VOR45PVI.js → chunk-ZWWYBQWV.js} +2 -2
  53. package/dist-cli/chunks/cli-version-ERQL5BZI.js +2 -0
  54. package/dist-cli/chunks/{compat-N54KQAGG.js → compat-T5HNT3UV.js} +3 -3
  55. package/dist-cli/chunks/{config-7ZXR72CY.js → config-E4J4ZDOQ.js} +2 -2
  56. package/dist-cli/chunks/{control-QALBPKIH.js → control-2NVJQV4C.js} +2 -2
  57. package/dist-cli/chunks/daemon-CJFZVJZ5.js +2 -0
  58. package/dist-cli/chunks/{debug-UYH3J6U3.js → debug-KOMBXMDJ.js} +3 -3
  59. package/dist-cli/chunks/{desktop-TM4MENZU.js → desktop-STHMGKEO.js} +3 -3
  60. package/dist-cli/chunks/{detox-JOQJUBLP.js → detox-YQTOJXBH.js} +2 -2
  61. package/dist-cli/chunks/{device-FYMBNXT2.js → device-3HPDY4ZY.js} +2 -2
  62. package/dist-cli/chunks/{diagnose-7WJUXS4O.js → diagnose-JJW35UGR.js} +2 -2
  63. package/dist-cli/chunks/drivers-73KAOB2I.js +2 -0
  64. package/dist-cli/chunks/{film-T7CLCOS2.js → film-CE2HMYW7.js} +3 -3
  65. package/dist-cli/chunks/flow-XP5SQVSY.js +2 -0
  66. package/dist-cli/chunks/help-ZGLDTFYK.js +2 -0
  67. package/dist-cli/chunks/{hidden-runtime-alias-BRNXNJQG.js → hidden-runtime-alias-M4RD6R2L.js} +2 -2
  68. package/dist-cli/chunks/{home-paths-HHCAAVCG.js → home-paths-SGUDLMTV.js} +2 -2
  69. package/dist-cli/chunks/inspect-P6YXCVUZ.js +2 -0
  70. package/dist-cli/chunks/install-desktop-WHBWUAZL.js +2 -0
  71. package/dist-cli/chunks/{login-TQAT5LPH.js → login-XZAUZJYN.js} +4 -4
  72. package/dist-cli/chunks/{logout-GDQEZTKP.js → logout-HGL3LIDQ.js} +2 -2
  73. package/dist-cli/chunks/{maestro-QYA3C7DI.js → maestro-BYGFDXUP.js} +3 -3
  74. package/dist-cli/chunks/{maestro-generate-K4MEYSBB.js → maestro-generate-G3426KCZ.js} +3 -3
  75. package/dist-cli/chunks/{mode-SGYFVJ4F.js → mode-ZFVAH7E5.js} +2 -2
  76. package/dist-cli/chunks/optional-demo-registry-VJ4J5AWF.js +2 -0
  77. package/dist-cli/chunks/{perf-HZXIAQPN.js → perf-IIHIC5GW.js} +2 -2
  78. package/dist-cli/chunks/{record-GET7EHCQ.js → record-UOG4XUKE.js} +3 -3
  79. package/dist-cli/chunks/runtime-5XLD5ZQF.js +2 -0
  80. package/dist-cli/chunks/{screenshot-command-DQ4SSPVJ.js → screenshot-command-6W4RF2Q6.js} +3 -3
  81. package/dist-cli/chunks/{screenshots-capture-I53ST6HQ.js → screenshots-capture-OTC65CFK.js} +2 -2
  82. package/dist-cli/chunks/{serve-F6ADSU46.js → serve-5T6G5XI4.js} +15 -15
  83. package/dist-cli/chunks/{setup-VLD6A6KK.js → setup-LRL62FOW.js} +3 -3
  84. package/dist-cli/chunks/{skills-ZOUVVU2U.js → skills-WJB2C4OV.js} +2 -2
  85. package/dist-cli/chunks/{storage-WAL7ICBS.js → storage-JANXATOJ.js} +2 -2
  86. package/dist-cli/chunks/store-JRTAAUGQ.js +2 -0
  87. package/dist-cli/chunks/telemetry-U4UD3S77.js +2 -0
  88. package/dist-cli/chunks/{timeline-L3YLCXES.js → timeline-VHF7NSCW.js} +2 -2
  89. package/dist-cli/chunks/{upgrade-N7KMSLXU.js → upgrade-7UH2IQQX.js} +2 -2
  90. package/dist-cli/chunks/upload-HMXQHDXK.js +2 -0
  91. package/dist-cli/chunks/{version-BUJFV5ZF.js → version-2OML4LH7.js} +2 -2
  92. package/dist-cli/chunks/{web-3UOCXNQ6.js → web-I2YUJKJ5.js} +2 -2
  93. package/dist-cli/chunks/{what-happened-JJZYWMHI.js → what-happened-IIUOHM7D.js} +2 -2
  94. package/dist-lib/agent-daemon-client.cjs +1 -1
  95. package/dist-lib/agent-events.cjs +1 -1
  96. package/dist-lib/agent-identity.cjs +1 -1
  97. package/dist-lib/agent-sessions.cjs +1 -1
  98. package/dist-lib/attached-projects.cjs +1 -1
  99. package/dist-lib/auth/shared-session.cjs +1 -1
  100. package/dist-lib/backend-origin.cjs +1 -1
  101. package/dist-lib/beta.cjs +1 -1
  102. package/dist-lib/beta.mjs +1 -1
  103. package/dist-lib/bridge-constants.cjs +1 -1
  104. package/dist-lib/cli-constants.cjs +1 -1
  105. package/dist-lib/config.cjs +1 -1
  106. package/dist-lib/detox/index.cjs +1 -1
  107. package/dist-lib/dev-bundle-resolution.cjs +1 -1
  108. package/dist-lib/home-paths.cjs +1 -1
  109. package/dist-lib/host/bridge-host.cjs +18 -3
  110. package/dist-lib/host/fetch-proxy-handler.cjs +18 -3
  111. package/dist-lib/host/fetch-proxy-overrides.cjs +1 -1
  112. package/dist-lib/host/fetch-proxy-overrides.mjs +1 -1
  113. package/dist-lib/host/websocket-proxy.cjs +1 -1
  114. package/dist-lib/index.cjs +1 -1
  115. package/dist-lib/jump-to-source-babel.cjs +1 -1
  116. package/dist-lib/menu.cjs +1 -1
  117. package/dist-lib/menu.mjs +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/dev-server-scanner.cjs +1 -1
  122. package/dist-lib/sdk.cjs +1 -1
  123. package/dist-lib/sdk.mjs +1 -1
  124. package/dist-lib/skills.cjs +25 -4
  125. package/dist-lib/vite.cjs +1 -1
  126. package/package.json +1 -1
  127. package/src/host/bridge-host.ts +2 -2
  128. package/src/host/fetch-proxy-handler.ts +13 -0
  129. package/dist-cli/chunks/beta-SF4DAISL.js +0 -2
  130. package/dist-cli/chunks/chunk-3FX4CPRD.js +0 -1
  131. package/dist-cli/chunks/chunk-OR3BDGW6.js +0 -13
  132. package/dist-cli/chunks/chunk-RPHRM35M.js +0 -1
  133. package/dist-cli/chunks/chunk-TJI5OFJV.js +0 -5
  134. package/dist-cli/chunks/cli-version-VSVRSPXF.js +0 -2
  135. package/dist-cli/chunks/daemon-HLYIFX53.js +0 -2
  136. package/dist-cli/chunks/drivers-MNRFJMBA.js +0 -2
  137. package/dist-cli/chunks/flow-UVSIUAFJ.js +0 -2
  138. package/dist-cli/chunks/help-I3LIJA4S.js +0 -2
  139. package/dist-cli/chunks/inspect-354EP4YM.js +0 -2
  140. package/dist-cli/chunks/install-desktop-3BH6M4S3.js +0 -2
  141. package/dist-cli/chunks/optional-demo-registry-FQRZRVLM.js +0 -2
  142. package/dist-cli/chunks/runtime-ZR4YFU7J.js +0 -2
  143. package/dist-cli/chunks/store-YVNWLTST.js +0 -2
  144. package/dist-cli/chunks/telemetry-HOTMJXDS.js +0 -2
  145. package/dist-cli/chunks/upload-GZR6SJIQ.js +0 -2
@@ -1,5 +1,5 @@
1
- /*! sootsim v0.1.245 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{C as N,D as F,F as y,Q as T,R as b,S}from"./chunk-WU5OEQS2.js";import{g as A,i as _}from"./chunk-WGEQ5ERO.js";import"./chunk-JXVG6Q3C.js";import{c as k}from"./chunk-UWQG2IZU.js";import"./chunk-5GUYHQTQ.js";import"./chunk-XN4CFIPA.js";function O(n){let t=[];for(let e=0;e<n.length;e++)if(n[e]==="--since"&&e+1<n.length){t.push(e,e+1);let s=n[e+1].trim(),l=/^(\d+(?:\.\d+)?)(ms|s|m)?$/.exec(s);if(l){let r=Number(l[1]),u=l[2]??"ms",v=u==="s"?r*1e3:u==="m"?r*6e4:r;return{since:Date.now()-v,consumed:t}}let i=Number(s);if(Number.isFinite(i)&&i>1e12)return{since:i,consumed:t}}return{consumed:t}}function B(n){let t=[];for(let e=0;e<n.length;e++)if(n[e]==="--kinds"&&e+1<n.length)return t.push(e,e+1),{kinds:n[e+1].split(",").map(s=>s.trim()).filter(Boolean),consumed:t};return{consumed:t}}function D(n){let t=[];for(let e=0;e<n.length;e++)if(n[e]==="--limit"&&e+1<n.length){t.push(e,e+1);let s=Number(n[e+1]);if(Number.isFinite(s)&&s>0)return{limit:s,consumed:t}}return{consumed:t}}function x(n){let t=[],e={label:"initial state",events:[],startedAt:n[0]?.t??null};t.push(e);for(let s of n)if(e.events.push(s),s.kind==="screen"||s.kind==="route"){let l=s.data,i=l?.phase;if(!i||i==="enter"||i==="appear"||i==="active"){let r=l?.name||l?.activeName||l?.path||l?.pathname||s.kind;t.length===1&&e.events.length===1?e.label=`${s.kind}: ${r}`:(e={label:`${s.kind}: ${r}`,events:[],startedAt:s.t},t.push(e))}}return t}async function J(n,t){let e=A(n,{port:t.port,stripBooleanFlags:["--summary","--all","--json","--no-advance","--help","-h","--flow","--noisy"],stripValueFlags:["--since","--kinds","--limit"]});(n.includes("--help")||n.includes("-h"))&&(console.log(`
1
+ /*! sootsim v0.1.247 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
+ import{C as N,D as F,F as y,Q as T,R as b,S}from"./chunk-RRT2TALP.js";import{g as A,i as _}from"./chunk-EH4P26I2.js";import"./chunk-45IDLKQN.js";import{c as k}from"./chunk-SII7HFIJ.js";import"./chunk-WNINMBWE.js";import"./chunk-YQ662TA3.js";function O(n){let t=[];for(let e=0;e<n.length;e++)if(n[e]==="--since"&&e+1<n.length){t.push(e,e+1);let s=n[e+1].trim(),l=/^(\d+(?:\.\d+)?)(ms|s|m)?$/.exec(s);if(l){let r=Number(l[1]),u=l[2]??"ms",v=u==="s"?r*1e3:u==="m"?r*6e4:r;return{since:Date.now()-v,consumed:t}}let i=Number(s);if(Number.isFinite(i)&&i>1e12)return{since:i,consumed:t}}return{consumed:t}}function B(n){let t=[];for(let e=0;e<n.length;e++)if(n[e]==="--kinds"&&e+1<n.length)return t.push(e,e+1),{kinds:n[e+1].split(",").map(s=>s.trim()).filter(Boolean),consumed:t};return{consumed:t}}function D(n){let t=[];for(let e=0;e<n.length;e++)if(n[e]==="--limit"&&e+1<n.length){t.push(e,e+1);let s=Number(n[e+1]);if(Number.isFinite(s)&&s>0)return{limit:s,consumed:t}}return{consumed:t}}function x(n){let t=[],e={label:"initial state",events:[],startedAt:n[0]?.t??null};t.push(e);for(let s of n)if(e.events.push(s),s.kind==="screen"||s.kind==="route"){let l=s.data,i=l?.phase;if(!i||i==="enter"||i==="appear"||i==="active"){let r=l?.name||l?.activeName||l?.path||l?.pathname||s.kind;t.length===1&&e.events.length===1?e.label=`${s.kind}: ${r}`:(e={label:`${s.kind}: ${r}`,events:[],startedAt:s.t},t.push(e))}}return t}async function J(n,t){let e=A(n,{port:t.port,stripBooleanFlags:["--summary","--all","--json","--no-advance","--help","-h","--flow","--noisy"],stripValueFlags:["--since","--kinds","--limit"]});(n.includes("--help")||n.includes("-h"))&&(console.log(`
3
3
  sootsim what-happened \u2014 show recent events from the semantic timeline
4
4
 
5
5
  usage:
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.245 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.247 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __create = Object.create;
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.245 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.247 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.245 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.247 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.245 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.247 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __create = Object.create;
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.245 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.247 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __create = Object.create;
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.245 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.247 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __create = Object.create;
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.245 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.247 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
package/dist-lib/beta.cjs CHANGED
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.245 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.247 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
package/dist-lib/beta.mjs CHANGED
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.245 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.247 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
 
3
3
  // src/beta.ts
4
4
  var IS_BETA = true;
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.245 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.247 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.245 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.247 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.245 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.247 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.245 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.247 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __create = Object.create;
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.245 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.247 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.245 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.247 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __create = Object.create;
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.245 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.247 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __create = Object.create;
@@ -2371,6 +2371,15 @@ var import_http2 = __toESM(require("http"), 1);
2371
2371
  var import_https = __toESM(require("https"), 1);
2372
2372
  var import_promises2 = require("stream/promises");
2373
2373
 
2374
+ // src/backend-origin.ts
2375
+ function normalizeHostname(hostname) {
2376
+ return hostname.replace(/^\[|\]$/g, "").toLowerCase();
2377
+ }
2378
+ function isLoopbackHost(hostname) {
2379
+ const normalized = normalizeHostname(hostname);
2380
+ return normalized === "localhost" || normalized.endsWith(".localhost") || normalized === "0.0.0.0" || normalized === "::1" || /^127(?:\.\d{1,3}){3}$/.test(normalized);
2381
+ }
2382
+
2374
2383
  // src/host/fetch-proxy-overrides.ts
2375
2384
  var FETCH_PROXY_BROWSER_USER_AGENT = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36";
2376
2385
  var HOST_HEADER_OVERRIDES = [
@@ -2438,6 +2447,10 @@ var APP_API_HEADER_REWRITES = /* @__PURE__ */ new Set([
2438
2447
  "sec-fetch-mode",
2439
2448
  "sec-fetch-dest"
2440
2449
  ]);
2450
+ function loopbackTlsOptions(targetUrl) {
2451
+ if (targetUrl.protocol !== "https:") return {};
2452
+ return isLoopbackHost(targetUrl.hostname) ? { rejectUnauthorized: false } : {};
2453
+ }
2441
2454
  function applyFetchProxyCors(res) {
2442
2455
  for (const [key, value] of Object.entries(FETCH_PROXY_CORS_HEADERS)) {
2443
2456
  res.setHeader(key, value);
@@ -2546,7 +2559,8 @@ async function handleFetchProxyRequest(req, res) {
2546
2559
  port: targetUrl2.port || (targetUrl2.protocol === "https:" ? 443 : 80),
2547
2560
  path: targetUrl2.pathname + targetUrl2.search,
2548
2561
  method,
2549
- headers: targetHeaders
2562
+ headers: targetHeaders,
2563
+ ...loopbackTlsOptions(targetUrl2)
2550
2564
  },
2551
2565
  resolve
2552
2566
  );
@@ -2651,7 +2665,8 @@ function handleAppApiRequest(req, res) {
2651
2665
  port: targetUrl.port || (targetUrl.protocol === "https:" ? 443 : 80),
2652
2666
  path: targetUrl.pathname + targetUrl.search,
2653
2667
  method: req.method,
2654
- headers: fwdHeaders
2668
+ headers: fwdHeaders,
2669
+ ...loopbackTlsOptions(targetUrl)
2655
2670
  },
2656
2671
  (proxyRes) => {
2657
2672
  const exposedHeaders = Object.keys(proxyRes.headers).filter((name) => {
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.245 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.247 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __create = Object.create;
@@ -44,6 +44,15 @@ var import_http = __toESM(require("http"), 1);
44
44
  var import_https = __toESM(require("https"), 1);
45
45
  var import_promises = require("stream/promises");
46
46
 
47
+ // src/backend-origin.ts
48
+ function normalizeHostname(hostname) {
49
+ return hostname.replace(/^\[|\]$/g, "").toLowerCase();
50
+ }
51
+ function isLoopbackHost(hostname) {
52
+ const normalized = normalizeHostname(hostname);
53
+ return normalized === "localhost" || normalized.endsWith(".localhost") || normalized === "0.0.0.0" || normalized === "::1" || /^127(?:\.\d{1,3}){3}$/.test(normalized);
54
+ }
55
+
47
56
  // src/host/fetch-proxy-overrides.ts
48
57
  var FETCH_PROXY_BROWSER_USER_AGENT = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36";
49
58
  var HOST_HEADER_OVERRIDES = [
@@ -111,6 +120,10 @@ var APP_API_HEADER_REWRITES = /* @__PURE__ */ new Set([
111
120
  "sec-fetch-mode",
112
121
  "sec-fetch-dest"
113
122
  ]);
123
+ function loopbackTlsOptions(targetUrl) {
124
+ if (targetUrl.protocol !== "https:") return {};
125
+ return isLoopbackHost(targetUrl.hostname) ? { rejectUnauthorized: false } : {};
126
+ }
114
127
  function applyFetchProxyCors(res) {
115
128
  for (const [key, value] of Object.entries(FETCH_PROXY_CORS_HEADERS)) {
116
129
  res.setHeader(key, value);
@@ -219,7 +232,8 @@ async function handleFetchProxyRequest(req, res) {
219
232
  port: targetUrl2.port || (targetUrl2.protocol === "https:" ? 443 : 80),
220
233
  path: targetUrl2.pathname + targetUrl2.search,
221
234
  method,
222
- headers: targetHeaders
235
+ headers: targetHeaders,
236
+ ...loopbackTlsOptions(targetUrl2)
223
237
  },
224
238
  resolve
225
239
  );
@@ -324,7 +338,8 @@ function handleAppApiRequest(req, res) {
324
338
  port: targetUrl.port || (targetUrl.protocol === "https:" ? 443 : 80),
325
339
  path: targetUrl.pathname + targetUrl.search,
326
340
  method: req.method,
327
- headers: fwdHeaders
341
+ headers: fwdHeaders,
342
+ ...loopbackTlsOptions(targetUrl)
328
343
  },
329
344
  (proxyRes) => {
330
345
  const exposedHeaders = Object.keys(proxyRes.headers).filter((name) => {
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.245 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.247 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.245 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.247 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
 
3
3
  // src/host/fetch-proxy-overrides.ts
4
4
  var FETCH_PROXY_BROWSER_USER_AGENT = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36";
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.245 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.247 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.245 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.247 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __create = Object.create;
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.245 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.247 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
package/dist-lib/menu.cjs CHANGED
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.245 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.247 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
package/dist-lib/menu.mjs CHANGED
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.245 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.247 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
 
3
3
  // src/menu.ts
4
4
  var SOOTSIM_ENGINE_EVENT_NAME = "sootsim:engine-event";
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.245 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.247 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __create = Object.create;
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.245 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.247 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __create = Object.create;
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.245 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.247 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.245 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.247 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __create = Object.create;
package/dist-lib/sdk.cjs CHANGED
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.245 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.247 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
package/dist-lib/sdk.mjs CHANGED
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.245 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.247 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
 
3
3
  // cli/commands/inspect/core.ts
4
4
  function resolveMaxMsFlag(args, fallbackMs) {
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.245 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.247 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __create = Object.create;
@@ -12850,6 +12850,20 @@ var init_agent_host = __esm({
12850
12850
  }
12851
12851
  });
12852
12852
 
12853
+ // src/backend-origin.ts
12854
+ function normalizeHostname(hostname) {
12855
+ return hostname.replace(/^\[|\]$/g, "").toLowerCase();
12856
+ }
12857
+ function isLoopbackHost(hostname) {
12858
+ const normalized = normalizeHostname(hostname);
12859
+ return normalized === "localhost" || normalized.endsWith(".localhost") || normalized === "0.0.0.0" || normalized === "::1" || /^127(?:\.\d{1,3}){3}$/.test(normalized);
12860
+ }
12861
+ var init_backend_origin = __esm({
12862
+ "src/backend-origin.ts"() {
12863
+ "use strict";
12864
+ }
12865
+ });
12866
+
12853
12867
  // src/host/fetch-proxy-overrides.ts
12854
12868
  function headerOverridesFor(hostname) {
12855
12869
  const host = hostname.toLowerCase();
@@ -12889,6 +12903,10 @@ var init_fetch_proxy_overrides = __esm({
12889
12903
  });
12890
12904
 
12891
12905
  // src/host/fetch-proxy-handler.ts
12906
+ function loopbackTlsOptions(targetUrl) {
12907
+ if (targetUrl.protocol !== "https:") return {};
12908
+ return isLoopbackHost(targetUrl.hostname) ? { rejectUnauthorized: false } : {};
12909
+ }
12892
12910
  function applyFetchProxyCors(res) {
12893
12911
  for (const [key, value] of Object.entries(FETCH_PROXY_CORS_HEADERS)) {
12894
12912
  res.setHeader(key, value);
@@ -12997,7 +13015,8 @@ async function handleFetchProxyRequest(req, res) {
12997
13015
  port: targetUrl2.port || (targetUrl2.protocol === "https:" ? 443 : 80),
12998
13016
  path: targetUrl2.pathname + targetUrl2.search,
12999
13017
  method,
13000
- headers: targetHeaders
13018
+ headers: targetHeaders,
13019
+ ...loopbackTlsOptions(targetUrl2)
13001
13020
  },
13002
13021
  resolve5
13003
13022
  );
@@ -13102,7 +13121,8 @@ function handleAppApiRequest(req, res) {
13102
13121
  port: targetUrl.port || (targetUrl.protocol === "https:" ? 443 : 80),
13103
13122
  path: targetUrl.pathname + targetUrl.search,
13104
13123
  method: req.method,
13105
- headers: fwdHeaders
13124
+ headers: fwdHeaders,
13125
+ ...loopbackTlsOptions(targetUrl)
13106
13126
  },
13107
13127
  (proxyRes) => {
13108
13128
  const exposedHeaders = Object.keys(proxyRes.headers).filter((name) => {
@@ -13132,6 +13152,7 @@ var init_fetch_proxy_handler = __esm({
13132
13152
  import_http2 = __toESM(require("http"), 1);
13133
13153
  import_https = __toESM(require("https"), 1);
13134
13154
  import_promises2 = require("stream/promises");
13155
+ init_backend_origin();
13135
13156
  init_fetch_proxy_overrides();
13136
13157
  STRIP_FETCH_PROXY_HEADERS = /* @__PURE__ */ new Set([
13137
13158
  "host",
@@ -17514,7 +17535,7 @@ var init_upload = __esm({
17514
17535
  init_ws_bridge();
17515
17536
  REMOTE_DEFAULT_ORIGIN = process.env.SOOTSIM_UPLOAD_ORIGIN || "https://contrast.dev";
17516
17537
  REMOTE_DEFAULT_PUBLIC_PREVIEW_ORIGIN = process.env.SOOTSIM_PREVIEW_ORIGIN || "https://sootsim.com";
17517
- LOCAL_DEFAULT_ORIGIN = "http://localhost:3000";
17538
+ LOCAL_DEFAULT_ORIGIN = "https://contrast.localhost:3000";
17518
17539
  LOCAL_UPLOAD_PROBE_TIMEOUT_MS = 2e3;
17519
17540
  }
17520
17541
  });
package/dist-lib/vite.cjs CHANGED
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.245 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.247 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __create = Object.create;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sootsim",
3
- "version": "0.1.245",
3
+ "version": "0.1.247",
4
4
  "description": "sootsim CLI + vite/metro plugins + skills registry. bridge client for driving the proprietary sootsim-engine over WebSocket.",
5
5
  "author": "Tamagui LLC",
6
6
  "license": "MIT",
@@ -236,7 +236,7 @@ export interface BridgeHostOptions {
236
236
  * billing, and preview uploads — inlined into served runtime html as
237
237
  * `window.__sootsimContrastOrigin`. without it the engine's origin.ts
238
238
  * resolves the daemon's own loopback host (localhost:<runtimePort>) to
239
- * the dev `localhost:3000` stack, so a *prod* CLI user's preview
239
+ * the dev `contrast.localhost:3000` stack, so a *prod* CLI user's preview
240
240
  * recording would upload to a localhost stack that doesn't exist. the
241
241
  * `sootsim serve` command resolves this with the same probe the
242
242
  * upload itself uses (`resolveDefaultUploadOrigin`). */
@@ -306,7 +306,7 @@ const HTTP_MIME_TYPES: Record<string, string> = {
306
306
  * - `window.__sootsimContrastOrigin` — the contrast origin for auth /
307
307
  * billing / preview uploads. the daemon serves runtimes from its own
308
308
  * loopback host, and engine `origin.ts` otherwise resolves any
309
- * loopback host to the dev `localhost:3000` stack — so without this a
309
+ * loopback host to the dev `contrast.localhost:3000` stack — so without this a
310
310
  * prod CLI user's preview recording would upload to a localhost stack
311
311
  * that does not exist. */
312
312
  export function injectSharedConfigIntoHtml(
@@ -26,6 +26,7 @@
26
26
  import http, { type IncomingMessage, type ServerResponse } from 'http'
27
27
  import https from 'https'
28
28
  import { finished, pipeline } from 'stream/promises'
29
+ import { isLoopbackHost } from '../backend-origin.ts'
29
30
  import {
30
31
  FETCH_PROXY_BROWSER_USER_AGENT,
31
32
  getFetchProxyTargetHeaders,
@@ -68,6 +69,16 @@ const APP_API_HEADER_REWRITES = new Set([
68
69
  'sec-fetch-dest',
69
70
  ])
70
71
 
72
+ // a developer's local https stack signs with a locally-trusted CA (mkcert et
73
+ // al) that node's bundled root store cannot see, so proxied requests to it die
74
+ // with SELF_SIGNED_CERT_IN_CHAIN. traffic to a loopback target never leaves
75
+ // the machine, so certificate validation adds nothing there — accept it rather
76
+ // than requiring every host to plumb a CA bundle into a long-lived daemon.
77
+ function loopbackTlsOptions(targetUrl: URL): { rejectUnauthorized?: boolean } {
78
+ if (targetUrl.protocol !== 'https:') return {}
79
+ return isLoopbackHost(targetUrl.hostname) ? { rejectUnauthorized: false } : {}
80
+ }
81
+
71
82
  function applyFetchProxyCors(res: ServerResponse) {
72
83
  for (const [key, value] of Object.entries(FETCH_PROXY_CORS_HEADERS)) {
73
84
  res.setHeader(key, value)
@@ -214,6 +225,7 @@ export async function handleFetchProxyRequest(
214
225
  path: targetUrl.pathname + targetUrl.search,
215
226
  method,
216
227
  headers: targetHeaders,
228
+ ...loopbackTlsOptions(targetUrl),
217
229
  },
218
230
  resolve,
219
231
  )
@@ -358,6 +370,7 @@ export function handleAppApiRequest(req: IncomingMessage, res: ServerResponse):
358
370
  path: targetUrl.pathname + targetUrl.search,
359
371
  method: req.method,
360
372
  headers: fwdHeaders,
373
+ ...loopbackTlsOptions(targetUrl),
361
374
  },
362
375
  (proxyRes) => {
363
376
  const exposedHeaders = Object.keys(proxyRes.headers)
@@ -1,2 +0,0 @@
1
- /*! sootsim v0.1.245 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{a,b,c,d}from"./chunk-MBKGVLMH.js";import"./chunk-XN4CFIPA.js";export{d as BETA_ASK_HEADLINE,b as BETA_LABEL,c as BETA_TAGLINE,a as IS_BETA};
@@ -1 +0,0 @@
1
- /*! sootsim v0.1.245 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
@@ -1,13 +0,0 @@
1
- /*! sootsim v0.1.245 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{a as j,b as ne,c as re,d as xe,e as ke,g as Pe}from"./chunk-TJI5OFJV.js";import{b as Ie,l as ce}from"./chunk-VOR45PVI.js";import{a as U,b as ae}from"./chunk-KJZI5667.js";import{a as Te,b as _e}from"./chunk-FTWJFLIX.js";import{a as Ce,b as se,c as Ee}from"./chunk-2JMGQZXX.js";import{d as le}from"./chunk-LJINY7Y4.js";import{m as R}from"./chunk-TUHXJKDI.js";import{m as Me,o as Re}from"./chunk-WU5OEQS2.js";import{a as Ue,b as Oe,c as ie,e as Be,f as De,g as C,h as v,i as E}from"./chunk-WGEQ5ERO.js";import{e as _,f as b,g as M}from"./chunk-UWQG2IZU.js";import{H as Se,M as te,O as W,l as ve}from"./chunk-5GUYHQTQ.js";import{g as oe,i as $e}from"./chunk-TOW7WQWO.js";import{spawn as je,spawnSync as Ke}from"node:child_process";import D from"node:fs";import pt from"node:os";import T from"node:path";import{WebSocket as ft}from"ws";function st(e){return e.replace(/^\[|\]$/g,"").toLowerCase()}function K(e){let t=st(e);return t==="localhost"||t.endsWith(".localhost")||t==="0.0.0.0"||t==="::1"||/^127(?:\.\d{1,3}){3}$/.test(t)}function Le(e){return new Error(`could not resolve a native bundle for ${e}. pass an explicit bundle URL or open Connect and choose the app there.`)}function it(e,t){return e?.includes("/one/metro-entry.bundle")?"one":typeof t=="string"&&t?"expo":"unknown"}function Ne(e,t,o){return`${e}//${t}:${o}`}function at(e){if(typeof window>"u")return!1;try{let t=new URL(e);return K(t.hostname)&&K(window.location.hostname)&&t.origin!==window.location.origin}catch{return!1}}async function Ae(e,t){let o={...t,cache:t?.cache??"no-store"};return at(e)?fetch(`/__fetch-proxy?url=${encodeURIComponent(e)}`,o):fetch(e,o)}function lt(e){return e==="https:"?443:80}function ct(e){let t=e.pathname||"/";return(t==="/"||t==="")&&!e.search&&!e.hash}async function dt(e){try{let t=await fetch("/__server-scan",{cache:"no-store"});if(!t.ok||!(t.headers.get("content-type")||"").toLowerCase().includes("json"))return null;let o=await t.json();if(!Array.isArray(o))return null;let n=o.find(r=>!!r&&typeof r=="object"&&r.port===e&&typeof r.bundleUrl=="string");return n?{bundleUrl:re(n.bundleUrl),port:e,framework:typeof n.framework=="string"?n.framework:"unknown",projectName:typeof n.projectName=="string"?n.projectName:void 0}:null}catch{return null}}async function Fe(e,t){let o=e.replace(/\/+$/,"");try{if(K(new URL(o).hostname)){let n=await dt(t);if(n)return n}}catch{}try{let n=await Ae(`${o}/`,{headers:{"expo-platform":"ios"}});if(n.ok){let r=await n.json(),s=r?.extra?.expoClient||r?.extra||{},i=typeof r?.launchAsset?.url=="string"?r.launchAsset.url:void 0;if(i||s.name)return{bundleUrl:re(i||`${o}${ne}`),port:t,framework:it(i,s.sdkVersion),projectName:s.name}}}catch{}try{let n=await Ae(`${o}/status`);if(n.ok&&(await n.text()).includes("packager-status:running"))return{bundleUrl:`${o}${ne}`,port:t,framework:"metro"}}catch{}return null}async function mt(e){return Fe(Ne("http:","localhost",e),e)}async function He(e){let t=e.trim();if(/^\d+$/.test(t)){let a=parseInt(t,10),l=await mt(a);if(l)return l;throw Le(`localhost:${a}`)}let o=t.startsWith("http")?t:`http://${t}`,n;try{n=new URL(o)}catch{throw new Error(`could not parse "${e}". pass a dev-server port, a dev-server base URL, or a full bundle URL.`)}let r=n.protocol||"http:",s=n.port?parseInt(n.port,10):lt(r),i=Ne(r,n.hostname,s);if(ct(n)){let a=await Fe(i,s);if(a)return a;throw Le(i)}return{bundleUrl:n.toString(),port:s,framework:"unknown"}}function lo(){console.error(" no sootsim desktop companion found."),console.error(""),console.error(" install the desktop app:"),console.error(" sootsim desktop install"),console.error(""),console.error(" or run setup to install the background daemon:"),console.error(" sootsim setup"),console.error("")}function We(e){let t=U();if(console.log(` note: no sootsim bridge detected on port ${e}`),t){console.log(" launch the installed companion with:"),console.log(" sootsim desktop");return}console.log(""),console.log(" run `sootsim setup` to install the background daemon,"),console.log(" or run `sootsim serve` in another shell for a foreground bridge.")}function ut(e){console.error(""),console.error(` no sim is connected to the sootsim bridge on port ${e}.`),console.error(""),console.error(" start your app dev server, then open it in sootsim:"),console.error(" npx expo start --localhost --port 8081"),console.error(" sootsim open 8081"),console.error(""),console.error(" then inspect the live app:"),console.error(" sootsim describe")}async function co(e,t,o){let n=[];try{n=await e.listSims()}catch{}if(console.error(""),n.length===0){ut(t);return}console.error(` no sim with id "${o}" is connected to the bridge on port ${t}.`),console.error(""),console.error(" connected sims:");for(let r of n){let s=[r.isPrimary?"primary":null,r.readyState,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 ht=12e4,ze=100,gt=5e3,qe=1e4,wt={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 $(e){return new Promise(t=>setTimeout(t,e))}function Ge(e){let t=process.env[e]?.trim();if(!t)return null;let o=Number(t);return Number.isInteger(o)&&o>0?o:null}function bt(){let e=Ge("SOOTSIM_DRIVER_CONNECT_TIMEOUT_MS")??Ge("SOOTSIM_PW_CONNECT_TIMEOUT_MS")??ht;return{timeoutMs:e,hostTimeoutMs:e+gt,intervalMs:ze,attempts:Math.max(1,Math.ceil(e/ze))}}function yt(e){return e==="chromium"||e==="electron"||e==="playwright"||e==="system"}function vt(e,t){return e.includes("--headless")?!0:e.includes("--headed")?!1:t==="playwright"&&process.platform==="linux"&&!process.env.DISPLAY&&!process.env.WAYLAND_DISPLAY?(console.error(" no display detected \u2192 running playwright headless (override with --headed)"),!0):!1}function G(e){return e.trim()}var Ye=/^[A-Za-z][A-Za-z0-9+.-]*:/;function St(e){let t=e.trim();if(!t)throw new Error("expected <url-or-route>");return Ye.test(t)||t.startsWith("/")?t:`/${t}`}function $t(e){return e!==null&&typeof e=="object"}function xt(e){let t=e.trim();return t?t.startsWith("/")?!0:Ye.test(t)?!/^https?:\/\//i.test(t):!1:!1}async function kt(e){if(await z(e,250))return e;let t=te();if(t&&W(t)&&await z(t.bridgePort,500))return t.bridgePort;if(t&&W(t))throw new Error(`sootsim bridge lockfile is fresh (port ${t.bridgePort}) but the bridge is not reachable. run \`sootsim daemon restart\` or \`sootsim daemon uninstall\`.`);await It();let o=Pt(["serve","--quiet","--port",String(e)]),n=null;o.once("exit",(s,i)=>{n=String(s??i??"unknown")}),o.unref();let r=Date.now()+qe;for(;Date.now()<r;){let s=te();if(s&&W(s)&&await z(s.bridgePort,250))return console.error(` started local bridge on port ${s.bridgePort}; run \`sootsim setup\` to install the background daemon`),s.bridgePort;if(await z(e,250))return console.error(` started local bridge on port ${e}; run \`sootsim setup\` to install the background daemon`),e;if(n)throw new Error(`sootsim bridge exited before becoming ready (exit ${n})`);await $(150)}throw new Error(`sootsim bridge did not start within ${Math.round(qe/1e3)}s`)}async function It(){let e=Se();if(e&&D.existsSync(ve(e)))return;console.error(" installing sootsim engine runtime...");let{runRuntime:t}=await import("./runtime-ZR4YFU7J.js");await t(["install"],{})}function Pt(e){let t=process.argv[1];return t&&D.existsSync(t)?je(process.execPath,[t,...e],{detached:!0,stdio:"ignore",env:process.env}):je("sootsim",e,{detached:!0,stdio:"ignore",env:process.env})}function z(e,t){return new Promise(o=>{let n=new ft(`ws://127.0.0.1:${e}`,{handshakeTimeout:t}),r=!1,s=i=>{if(!r){r=!0;try{n.close()}catch{}o(i)}};n.once("open",()=>s(!0)),n.once("error",()=>s(!1)),setTimeout(()=>s(!1),t)})}function ue(e){try{let t=new URL(e),o=t.pathname.replace(/\/+$/,"")||"/";return t.searchParams.has("open")||t.searchParams.has("port")||t.searchParams.has("bundle")||t.searchParams.has("demo")||t.pathname.includes("/sootsim/index.html")||o==="/sootsim"||t.pathname==="/__soot"||t.pathname==="/__soot/"||o==="/rn"||/^\/rn\/[^/]+$/i.test(o)||/^\/app\/[^/]+$/i.test(o)||o==="/__soot/rn"||/^\/__soot\/rn\/[^/]+$/i.test(o)||/^\/__soot\/app\/[^/]+$/i.test(o)}catch{return!1}}function Ct(e){try{let t=new URL(e,"http://sootsim.local");if(t.origin!=="http://sootsim.local")return!1;let o=t.pathname.replace(/\/+$/,"")||"/";return o==="/rn"||/^\/rn\/[^/]+$/i.test(o)||/^\/app\/[^/]+$/i.test(o)||o==="/__soot/rn"||/^\/__soot\/rn\/[^/]+$/i.test(o)||/^\/__soot\/app\/[^/]+$/i.test(o)}catch{return!1}}function Et(e,t){let o=new URL(e,"http://sootsim.local"),n=new URL(t),r=V(n.pathname),s=o.pathname.startsWith("/__soot/")?o.pathname.slice(7):o.pathname;return n.pathname=`${r}${s}`,n.search=o.search,n.hash=o.hash,n.toString()}function Tt(e){try{let t=new URL(e).pathname.replace(/\/+$/,"")||"/";return/^\/preview\/[^/]+$/.test(t)||/^\/build\/.+/.test(t)}catch{return!1}}async function Bo(e){let t=G(e);return(await Ze(t)).bundleUrl}function _t(e){try{let t=new URL(e.startsWith("http")?e:`http://${e}`),o=t.pathname||"/";if(o!=="/"&&o!==""||t.search||t.hash||!/^(localhost|127\.0\.0\.1|\[::1\]|::1)$/i.test(t.hostname))return null;let n=t.port?Number(t.port):t.protocol==="https:"?443:80;return Number.isFinite(n)&&n>0?n:null}catch{return null}}async function Ze(e){let t=G(e),o=/^\d+$/.test(t)?Number(t):_t(t);if(o&&o>0){let n=await ke(o);if(n)return{bundleUrl:n.bundleUrl,port:n.port,framework:n.framework,projectName:n.projectName}}return He(t)}function V(e){let t=e.replace(/\/+$/,"")||"/";return t==="/__soot"||t.startsWith("/__soot/")?"/__soot":""}function Mt(e,t){let o=G(e),n=new URL(t),r=V(n.pathname);return n.pathname=`${r}/rn`,n.searchParams.delete("bundle"),n.searchParams.delete("demo"),n.searchParams.delete("app"),n.searchParams.delete("open"),n.searchParams.delete("port"),/^\d+$/.test(o)?n.pathname=`${r}/rn/${o}`:(n.pathname=`${r}/rn`,n.searchParams.set("open",o)),n.toString()}function Rt(e){let t=G(e);return/^\d+$/.test(t)||/^https?:\/\//i.test(t)?!0:/^(localhost|127\.0\.0\.1|\[::1\]|[^/]+\.localhost):\d+(?:\/.*)?$/i.test(t)}async function Ut(e,t,o={}){let n=await Ze(e),r=new URL(t),s=V(r.pathname);r.pathname=`${s}/rn`,r.searchParams.delete("open"),r.searchParams.delete("port"),r.searchParams.delete("demo"),r.searchParams.delete("app");let i=o.hot===void 0?n.bundleUrl:xe(n.bundleUrl,o.hot);return r.searchParams.set("bundle",i),r.toString()}function Ot(e){return e.startsWith("~/")?T.join(pt.homedir(),e.slice(2)):T.isAbsolute(e)?e:T.resolve(process.cwd(),e)}function Bt(e){let t={},o={};for(let r=0;r<e.length;r++){if(e[r]==="--replace"){let s=e[r+1];s||(console.error(" sootsim open: --replace expects <module>=<file>"),process.exit(1));let i=s.indexOf("=");(i<=0||i===s.length-1)&&(console.error(" sootsim open: --replace expects <module>=<file>"),process.exit(1));let a=s.slice(0,i).trim(),l=Ot(s.slice(i+1).trim());D.existsSync(l)||(console.error(` sootsim open: replacement file not found: ${l}`),process.exit(1)),t[a]={file:l},r++;continue}if(e[r]==="--remap"){let s=e[r+1],i=s?s.indexOf("="):-1;(!s||i<=0||i===s.length-1)&&(console.error(" sootsim open: --remap expects <host:port>=<host:port>"),process.exit(1)),o[s.slice(0,i).trim()]=s.slice(i+1).trim(),r++;continue}}let n={};return Object.keys(t).length>0&&(n.modules=t),Object.keys(o).length>0&&(n.network={remap:o}),n.modules||n.network?n:void 0}function Xe(){return Ue().shellBaseUrl}async function Dt(e){try{let t=new URL(e),o=t.searchParams.get("bundle")||"";if(!o)return e;let n=process.env.CONTRAST_REPO_DIR||await se(o)||void 0,r=Ce({bundleUrl:o,repoDir:n});if(r.length===0)return e;let s=await Lt(r);return s.length===0?e:(t.searchParams.set("appFonts",Ee(s)),t.toString())}catch{return e}}async function Lt(e){let t=await Promise.all(e.map(async n=>{let r=new AbortController,s=setTimeout(()=>r.abort(),1500);try{let i=await fetch(n.url,{method:"HEAD",signal:r.signal});return i.status>=200&&i.status<400?n:null}catch{return null}finally{clearTimeout(s)}})),o=[];for(let n of t)n!==null&&o.push(n);return o}async function At(e,t,o={}){if(!e)return new URL(t).toString();if(ue(e))return new URL(e).toString();if(Ct(e))return Et(e,t);let n=wt[e.toLowerCase()];if(n){let r=new URL(t),s=V(r.pathname);return r.pathname=`${s}${n}`,r.toString()}return Rt(e)?Ut(e,t,o):Mt(e,t)}async function Nt(e){try{let t=new URL(e),o=t.searchParams.get("bundle")||"";if(!o)return e;let n=process.env.CONTRAST_REPO_DIR||await se(o)||void 0,r=Te({bundleUrl:o,repoDir:n});return!r||r.imageUrl&&!await Ft(r.imageUrl)?e:(t.searchParams.set("appSplash",_e(r)),t.toString())}catch{return e}}async function Ft(e){let t=new AbortController,o=setTimeout(()=>t.abort(),1500);try{let n=await fetch(e,{method:"HEAD",signal:t.signal});return n.status>=200&&n.status<400}catch{return!1}finally{clearTimeout(o)}}async function q(e,t=Xe(),o={}){let n=await At(e,t,o),r=await Nt(await Dt(n));if(!o.device)return r;let s=new URL(r);return s.searchParams.set("device",o.device),s.toString()}function Ve(e,t){let o=e?.url||e?.origin||t;try{let n=new URL(o);return n.searchParams.delete("bundle"),n.searchParams.delete("demo"),n.searchParams.delete("app"),n.searchParams.delete("open"),n.searchParams.delete("port"),n.searchParams.delete("inspectOpen"),n.searchParams.delete("appFonts"),n.searchParams.delete("appSplash"),n.toString()}catch{return t}}async function Ht(e,t,o,n={}){let r=new URL(await q(e,t,n));return r.searchParams.set("inspectOpen",o),r.toString()}async function Wt(e,t,o,n={}){let r=n.attempts??30,s=n.intervalMs??500,i=n.minNodeCount??10;for(let a=0;a<r;a++){let l=v(e,{commandTimeoutMs:t,simId:o,simIdSource:"flag"});try{let d=await l.send({type:"evaluate",code:"(async () => (await window.__sootsimTest?.getNodeCount()) || 0)()"});if(typeof d=="number"&&d>i)return{bridge:l,count:d}}catch{}l.close(),await $(s)}return null}function jt(e){if(!e)return null;try{let t=new URL(e);if(t.searchParams.has("bundle")){let o=t.searchParams.get("bundle")||"";try{let n=new URL(o),r=n.pathname.length>36?`...${n.pathname.slice(-36)}`:n.pathname;return`bundle ${n.host}${r}`}catch{return"bundle"}}return t.searchParams.has("port")?`connect :${t.searchParams.get("port")||""}`:t.searchParams.has("open")?`connect ${t.searchParams.get("open")||""}`:t.searchParams.has("demo")?`demo ${t.searchParams.get("demo")||"default"}`:t.pathname.includes("/sootsim/index.html")||t.pathname==="/sootsim/"||t.pathname==="/sootsim"?"embedded sootsim":null}catch{return null}}function Kt(e){let t=e.indexOf(":");if(t<=0)return e.length>24?`${e.slice(0,21)}\u2026`:e;let o=e.slice(0,t),n=e.slice(t+1),r=n.length>12?`${n.slice(0,8)}\u2026`:n;return o==="AGENTBUS_SESSION"||o==="CLAUDE_CODE_SESSION_ID"||o==="CODEX_THREAD_ID"?`agent ${r}`:`${o} ${r}`}function Do(e,t){if(e.length===0){console.log(" no sims connected");return}console.log(` connected sims (${e.length}):
3
- `);for(let o of e){let n=o.lockedBy&&o.lockExpiresAt?`locked by ${Kt(o.lockedBy)} (${Math.max(0,Math.round((o.lockExpiresAt-Date.now())/1e3))}s)`:"",r=[o.isPrimary?"primary":"",o.id===t?"selected":"",o.readyState,o.userVisible===!1?"hidden":o.userVisible===!0?"visible":"",o.attachedCliCount&&o.attachedCliCount>0?"in use":"",o.userFocused?"focused":"",n].filter(Boolean);console.log(` ${o.id}${r.length?` [${r.join(", ")}]`:""}`);let s=jt(o.url);if(s)console.log(` loaded: ${s}`);else if(o.url){let a=o.url.length>96?`${o.url.slice(0,93)}\u2026`:o.url;console.log(` url: ${a}`)}else o.origin&&console.log(` origin: ${o.origin}`);let i=zt(o);i&&console.log(` engine: ${i}`),o.title&&console.log(` title: ${o.title}`),o.visibilityState&&o.visibilityState!=="visible"&&console.log(` visibility: ${o.visibilityState}`),console.log(` connected: ${Je(Date.now()-o.connectedAt)}`),o.lastActiveAt&&o.lastActiveAt>0&&console.log(` last active: ${Je(Date.now()-o.lastActiveAt)}`)}}function zt(e){let t=e.url||e.origin||"";if(!t)return null;try{let o=new URL(t).port;return o==="5173"?"dev \u2014 local source (:5173)":o==="3000"?"Contrast app embedded (:3000)":Pe()?`dev \u2014 local build (:${o||"?"})`:`runtime \u2014 published engine (:${o||"?"})`}catch{return null}}function Je(e){let t=Math.max(0,Math.round(e/1e3));return t<60?`${t}s ago`:t<3600?`${Math.round(t/60)}m ago`:t<86400?`${Math.round(t/3600)}h ago`:`${Math.round(t/86400)}d ago`}async function de(e,t,o,n={}){let r=n.attempts??30,s=n.intervalMs??500;for(let i=0;i<r;i++){let a=v(e,{commandTimeoutMs:t});try{let d=(await a.listSims()).find(o);if(d)return d}catch{}finally{a.close()}await $(s)}return null}async function qt(e,t,o,n,r={}){let s=r.attempts??30,i=r.intervalMs??500,a=!!n&&Number.isInteger(n)&&n>1,l=()=>a&&n!==void 0&&!pe(n);for(let d=0;d<s;d++){if(l())return{kind:"host-exit"};let m=v(e,{commandTimeoutMs:t});try{let g=(await m.listSims()).find(o);if(g)return l()?{kind:"host-exit"}:{kind:"match",sim:g}}catch{}finally{m.close()}if(l())return{kind:"host-exit"};await $(i)}return{kind:"timeout"}}async function Gt(e,t,o,n={}){let r=n.attempts??20,s=n.intervalMs??250;for(let i=0;i<r;i++){let a=v(e,{commandTimeoutMs:t});try{let d=(await a.listSims()).find(m=>m.id===o);if(!d||d.readyState!=="open")return!0}catch{return!0}finally{a.close()}await $(s)}return!1}function Vt(e){let t=e.meta;if(!t||t.sootsimHostDriver!=="playwright")return null;let o=Number(t.sootsimHostPid);return!Number.isInteger(o)||o<=1||o===process.pid?null:o}function Jt(e){if(!e.connectAckFile)return!1;try{return D.writeFileSync(e.connectAckFile,`${JSON.stringify({connectedAt:Date.now(),pid:e.pid??null})}
4
- `,{flag:"w"}),!0}catch{return!1}}function Qe(e){if(e.diagnosticLogPath)try{let t=D.readFileSync(e.diagnosticLogPath,"utf8").trim();if(!t){console.error(` ${T.basename(e.diagnosticLogPath)} was empty`);return}let o=t.length>4e3?`\u2026
5
- ${t.slice(-4e3)}`:t;console.error(` ${T.basename(e.diagnosticLogPath)}:`),console.error(o)}catch(t){let o=t instanceof Error?t.message:String(t);console.error(` failed to read ${T.basename(e.diagnosticLogPath)}: ${o}`)}}function pe(e){try{return process.kill(e,0),!0}catch(t){return t?.code==="EPERM"}}async function Qt(e,t=2500){let o=Date.now()+t;for(;Date.now()<o;){if(!pe(e))return!0;await $(100)}return!pe(e)}function Yt(e){let t=Ke("ps",["-o","command=","-p",String(e)],{encoding:"utf8",stdio:["ignore","pipe","pipe"]}),o=Ke("ps",["eww","-o","command=","-p",String(e)],{encoding:"utf8",stdio:["ignore","pipe","pipe"]});if(t.status!==0||o.status!==0)return!1;let n=(t.stdout||"").trimEnd(),r=(o.stdout||"").trimEnd();return(r.startsWith(n)?r.slice(n.length):r).includes("SOOTSIM_PW_URL=")}async function me(e,t){let o=new Set(t),n=new Set;for(let r of e){if(!o.has(r.id))continue;let s=Vt(r);s&&n.add(s)}for(let r of n){if(!Yt(r)){console.log(` skipped pid ${r}: not a sootsim playwright host (stale sim record)`);continue}try{process.kill(r,"SIGTERM")}catch{}if(await Qt(r)){console.log(` closed playwright host process ${r}`);continue}try{process.kill(r,"SIGKILL"),console.log(` force-closed playwright host process ${r}`)}catch{}}}function J(e,t){if(t){let r=t.trim(),s=e.find(i=>i.id===r);if(!s)throw new Error(`no sim connected with id ${r}`);return s}let o=e.find(r=>r.isPrimary&&r.readyState==="open");if(o)return o;let n=e.find(r=>r.readyState==="open");if(n)return n;throw new Error("no sim connected")}function O(e,t,o){console.log(` ${o==="current sim"?"loaded":"opened"}: ${e} [${o}]`),console.log(` current sim: ${t.id}`),console.log(JSON.stringify({simId:t.id,url:t.url},null,2))}async function B(e,t,o){if(o.includes("--no-describe"))return;let n=process.env.SOOTSIM_QUIET_TARGET_NOTICE;process.env.SOOTSIM_QUIET_TARGET_NOTICE="1";try{await Zt(e,t,{stableMs:150,maxMs:400});let r=v(e,{commandTimeoutMs:3e3,simId:t,cliLabel:"open --describe",simIdSource:"flag"});try{let s=null;try{s=await r.send({type:"evaluate",code:Me})}catch{}if(s&&!(s.flag===!0&&!s.loadingText&&Re(s))){let m=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: ${m} (nodes: ${s.nodes}, targets: ${s.targets})`),console.log(" before interacting, run: sootsim wait ready --max-ms 120000")}let a=`(async () => {
6
- const t = window.__sootsimTest
7
- const ms = window.SootSim?.bridges?.mainShell
8
- if (!t) return null
9
- let shell = null
10
- try { shell = ms?.getState ? await ms.getState() : null } catch {}
11
- const tree = await t.dumpTree(12, ${JSON.stringify({describe:!0,verbose:!1,filter:""})})
12
- return { tree, shell }
13
- })()`,l=await r.send({type:"evaluate",code:a});if(!l?.tree)return;if(console.log(""),l.shell?.state){let d=[`state=${l.shell.state}`,l.shell.activeApp?`app=${l.shell.activeApp}`:null].filter(Boolean);console.log(` shell: ${d.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 Zt(e,t,o){let n=Date.now()+o.maxMs,r="(async () => (await window.__sootsimTest?.getNodeCount?.()) || 0)()",s=v(e,{commandTimeoutMs:2e3,simId:t,simIdSource:"flag"});try{let i=-1,a=0;for(;Date.now()<n;){let l=-1;try{let d=await s.send({type:"evaluate",code:r});typeof d=="number"&&(l=d)}catch{}if(l>=0&&l===i){if(Date.now()-a>=o.stableMs)return}else i=l,a=Date.now();await $(50)}}finally{s.close()}}async function Xt(e,t={}){let o=C(e,{port:t.port,commandTimeoutMs:t.timeoutMs});o.positional.length!==1&&(console.error(" sootsim open: expected exactly one <url-or-route>"),console.error(" examples: sootsim open /settings | sootsim open myapp://settings"),process.exit(1));let n;try{n=St(o.positional[0]??"")}catch(i){console.error(` sootsim open: ${i instanceof Error?i.message:String(i)}`),process.exit(1)}let r=E(o),s=o.simId?` --sim ${o.simId}`:"";try{let i=await r.send({type:"call",path:"SootSim.bridges.test.openDeepLink",args:[n]});if($t(i)&&i.ok===!1)throw new Error(typeof i.error=="string"?i.error:"deep-link dispatch failed");console.log(` opened deep link: ${n}`)}catch(i){console.error(` link failed: ${i instanceof Error?i.message:String(i)}`),await R(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 Lo(e,t={}){let o=C(e,{port:t.port,commandTimeoutMs:t.timeoutMs,stripBooleanFlags:["--new","--headless","--headed","--ephemeral","--hot","--no-hmr","--no-describe"],stripValueFlags:["--base-url","--replace","--driver","--profile","--cdp-port","--browser","--device"]}),n=e.find((c,p)=>e[p-1]==="--profile"),r=e.includes("--ephemeral"),s=e.find((c,p)=>e[p-1]==="--cdp-port"),i=s?Number(s):void 0;s&&(!Number.isFinite(i)||i<=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 a=n?Ie(n).id:void 0,l=!!a||r,d=e.includes("--new")||l,m=Bt(e);d&&o.simIdSource==="flag"&&(console.error(" sootsim open: --new, --profile, and --ephemeral cannot be combined with --sim"),process.exit(1));let u=o.positional[0]||"";if(xt(u)){d&&(console.error(" sootsim open: deep links target the current app; remove --new, --profile, or --ephemeral"),process.exit(1)),await Xt(e,t);return}if(Tt(u)){let c=(()=>{try{return/^(localhost|127\.0\.0\.1|\[::1\]|::1)$/i.test(new URL(u).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 le(u,{background:!1})}catch(p){console.error(` could not launch a browser: ${p instanceof Error?p.message:String(p)}`),console.error(` open it yourself: ${u}`),process.exit(1)}console.log(c?" 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 g=e.find((c,p)=>e[p-1]==="--base-url"),Q=t.port!==void 0||e.some(c=>c==="--port"||c==="-p"||c.startsWith("--port="));if(g&&!Q){let c=ie(g);c&&(o.wsPort=c)}o.wsPort=await kt(o.wsPort);let y=e.find((c,p)=>e[p-1]==="--driver")||"",tt=vt(e,y);i&&y!=="playwright"&&(console.error(" sootsim open: --cdp-port is only honored by the playwright driver \u2014 add `--driver playwright`"),process.exit(1));let x=e.find((c,p)=>e[p-1]==="--browser");x&&y!=="playwright"&&(console.error(" sootsim open: --browser is only honored by the playwright driver \u2014 add `--driver playwright`"),process.exit(1));let L=x==="chromium"||x==="webkit"||x==="firefox"?x:void 0;x&&!L&&(console.error(` sootsim open: --browser must be chromium, webkit, or firefox \u2014 got "${x}"`),process.exit(1)),i&&L&&L!=="chromium"&&(console.error(" sootsim open: --cdp-port requires the chromium engine"),process.exit(1));let fe=e.includes("--hot"),he=e.includes("--no-hmr");fe&&he&&(console.error(" sootsim open: --hot and --no-hmr cannot be combined"),process.exit(1));let ot=fe?!0:he?!1:y!=="playwright",k=e.find((c,p)=>e[p-1]==="--device");k&&!(k in oe)&&(console.error(` sootsim open: unknown device "${k}"`),console.error(` known devices: ${$e().join(", ")}`),process.exit(1));let Y=k?oe[k]:void 0,A={hot:ot,device:k},nt=Oe(o.wsPort),I=g||nt?.shellBaseUrl||Xe(),ge=e.includes("--base-url");Be(o.wsPort,I);let we=_();if(!y&&!d&&(o.simIdSource==="flag"||o.simIdSource==="saved"&&!!we)){let c=E(o),p=o.simId?` --sim ${o.simId}`:"",f=!1;try{let h=null;try{let w=await c.listSims();if(o.simIdSource==="saved"?(h=w.find(P=>P.id===we&&P.readyState==="open")??null,h||M()):h=J(w,o.simId),!h)if(o.simIdSource==="saved")f=!0;else throw new Error("no sim connected");if(!f&&h){let P=ge||ue(u)?I:Ve(h,I),H=await q(u,j(P,m),A);c.send({type:"evaluate",simId:h.id,code:`window.location.href = ${JSON.stringify(H)}`}).catch(()=>{})}}catch(w){console.error(` open failed: ${w instanceof Error?w.message:String(w)}`),await R(c,{errorsCommand:`sootsim get errors 5${p}`,warningsCommand:`sootsim get warnings 5${p}`,requestsCommand:`sootsim get requests 5${p}`}),process.exit(1)}if(!f&&h){await $(1500);let w=await Wt(o.wsPort,o.commandTimeoutMs,h.id);w||(console.error(" timed out waiting for current sim to load target"),process.exit(1)),w.bridge.close(),b(h.id);let P=ge||ue(u)?I:Ve(h,I),H=await q(u,j(P,m),A);O(H,{...h,url:H},"current sim"),await B(o.wsPort,h.id,e);return}}finally{c.close()}}let be=j(I,m),rt=await q(u,be,A),ye=`cli-${Date.now().toString(36)}-${Math.random().toString(36).slice(2,8)}`,S=await Ht(u,be,ye,A),Z={newWindow:!0},N=c=>c.url?.includes(`inspectOpen=${ye}`)??!1;if(y){yt(y)||(console.error(` unknown driver "${y}" \u2014 run \`sootsim list --drivers\``),process.exit(1));let c=ce(y);c||(console.error(` unknown driver "${y}" \u2014 run \`sootsim list --drivers\``),process.exit(1));let p=bt(),f=await c.launch({url:S,bridgePort:ie(I)??o.wsPort,headless:tt,newWindow:Z.newWindow,profileId:a,ephemeralProfile:r,cdpPort:i,browser:L,device:k,viewport:Y?{width:Y.width+120,height:Y.height+60}:void 0,connectTimeoutMs:p.hostTimeoutMs});f.launched||(console.error(` ${c.name} driver: ${f.message}`),process.exit(1));let h=await qt(o.wsPort,o.commandTimeoutMs,N,f.pid,{attempts:p.attempts,intervalMs:p.intervalMs});if(h.kind==="host-exit"&&(Qe(f),console.error(` ${c.name} host crashed \u2014 sim is no longer attached`),process.exit(1)),h.kind==="timeout"){if(f.pid)try{process.kill(f.pid,"SIGTERM"),console.error(` closed ${c.name} host process ${f.pid}`)}catch{}Qe(f),console.error(` timed out after ${p.timeoutMs}ms waiting for opened sim to connect`),process.exit(1)}let w=h.sim;b(w.id),Jt(f),O(S,w,`${c.name} driver`),await B(o.wsPort,w.id,e);return}if(l){let c=U();c||(console.error(" profiles require electron or playwright; install the desktop companion or use `--driver playwright`"),process.exit(1));try{(await ae(S,c,{profileId:a,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 p=await de(o.wsPort,o.commandTimeoutMs,N,{attempts:40,intervalMs:500});p||(console.error(" timed out waiting for profiled sim to connect"),process.exit(1)),b(p.id),O(S,p,"desktop companion"),await B(o.wsPort,p.id,e);return}let X=!1,ee=!1;try{let c=v(o.wsPort,{commandTimeoutMs:2e3});try{await c.listSims(),X=!0}finally{c.close()}}catch{}if(X)try{let c=v(o.wsPort,{commandTimeoutMs:3e3});try{await c.openUrl(S,Z),ee=!0}finally{c.close()}}catch{}if(!ee){let c=U();if(c)try{if((await ae(S,c)).launched){let f=await de(o.wsPort,o.commandTimeoutMs,N,{attempts:20,intervalMs:500});if(f){b(f.id),O(S,f,"desktop companion"),await B(o.wsPort,f.id,e);return}}}catch{}try{await le(S,Z)}catch(p){console.error(` open failed: ${p instanceof Error?p.message:String(p)}`),ce("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(!X){console.log(` opened: ${rt}`),We(o.wsPort);return}}let F=await de(o.wsPort,o.commandTimeoutMs,N,{attempts:30,intervalMs:500});F||(console.error(" timed out waiting for opened sim to connect"),process.exit(1)),b(F.id),O(S,F,ee?"bridge":"direct shell open"),await B(o.wsPort,F.id,e)}async function et(e,t={}){let o=C(e,{port:t.port,commandTimeoutMs:t.timeoutMs,stripBooleanFlags:["--force"]}),n=e.includes("--force"),r=E(o),s=o.simId?` --sim ${o.simId}`:"";try{try{let i=await r.listSims(),a=J(i,o.positional[0]||o.simId);if(a.lockedBy&&a.lockExpiresAt&&a.lockExpiresAt>Date.now()){let l=Math.max(0,Math.round((a.lockExpiresAt-Date.now())/1e3));a.lockedByKind==="user-active"&&(console.error(` refused: ${a.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: ${a.id} is leased by ${a.lockedBy} (${l}s)`),console.error(` \`sootsim use ${a.id} --force\` to take it, or \`sootsim open --new\` for a fresh sim`),process.exit(1))}await r.focusSim(a.id),b(a.id),console.log(` using: ${a.id}`)}catch(i){console.error(` use failed: ${i instanceof Error?i.message:String(i)}`),await R(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 Ao(e,t={}){await et(e,t)}async function No(e,t={}){await et(e,t)}async function Fo(e,t={}){let o=C(e,{port:t.port,commandTimeoutMs:t.timeoutMs,stripBooleanFlags:["--force"]}),n=e.includes("--force"),r=E(o);try{try{let s=await r.listSims(),i=J(s,o.positional[0]||o.simId),a=n&&i.lockedBy&&i.lockedByKind!=="user-active"?i.lockedBy:null,l=await r.claim(i.id,{force:n});b(i.id);let d=Math.max(0,Math.round((l.lockExpiresAt-Date.now())/1e3)),m=l.bootedCount>0?` (booted ${l.bootedCount})`:"";console.log(` claimed: ${l.simId} [${d}s]${m}`),a&&console.log(` took over from: ${a}`)}catch(s){if(s instanceof De){let i=Math.max(0,Math.round(s.lock.expiresInMs/1e3));console.error(` claim failed: locked by ${s.lock.by} for ${i}s more`),console.error(" use --force to take it, or `sootsim open --new` for a fresh sim"),process.exit(1)}console.error(` claim failed: ${s instanceof Error?s.message:String(s)}`),process.exit(1)}}finally{r.close()}}async function eo(e,t,o,n){if(n.length===0)return{closed:[],remaining:[]};await Promise.all(n.map(s=>e.closeSim(s).catch(()=>{})));let r=new Set(n);for(let s=0;s<40;s++){let i=[];try{let a=v(t,{commandTimeoutMs:o});try{i=(await a.listSims()).filter(d=>r.has(d.id)&&d.readyState==="open").map(d=>d.id)}finally{a.close()}}catch{i=[]}if(i.length===0)return{closed:[...r],remaining:[]};if(s===39)return{closed:[...r].filter(a=>!i.includes(a)),remaining:i};await $(250)}return{closed:[...r],remaining:[]}}function to(e,t){let o=e.filter(u=>u.readyState==="open"),n=o.map(u=>u.id),r=t.explicitKeepId?.trim()||"",s=t.savedKeepId?.trim()||"",i=s?o.some(u=>u.id===s):!1,a=s&&!i?s:null,l=null,d=null,m=null;if(t.closeOthers)if(r){let u=o.find(g=>g.id===r);u?l=u.id:d=r}else if(s&&i)l=s;else{let u=o.find(g=>g.isPrimary)??o[0]??null;u&&(l=u.id,s&&!i&&(m=u.id))}return{openIds:n,keepId:l,targets:d?[]:n.filter(u=>u!==l),staleSavedId:a,missingExplicitKeepId:d,fallbackKeepId:m}}async function Ho(e,t={}){let o=C(e,{port:t.port,commandTimeoutMs:t.timeoutMs,stripBooleanFlags:["--all","--others"]}),n=E(o),r=o.simId?` --sim ${o.simId}`:"",s=e.includes("--all"),i=e.includes("--others");if(s||i){try{let a=await n.listSims(),l=_(),d=o.positional[0]||(o.simIdSource==="flag"?o.simId:void 0),m=to(a,{closeOthers:i,explicitKeepId:d,savedKeepId:l});if(m.staleSavedId&&M(),m.fallbackKeepId&&(b(m.fallbackKeepId),console.log(` saved sim ${m.staleSavedId} is gone \u2014 keeping primary ${m.fallbackKeepId}`)),m.missingExplicitKeepId&&(console.error(` close failed: keep sim ${m.missingExplicitKeepId} is not connected; not closing other sims`),process.exit(1)),m.targets.length===0){console.log(m.keepId?` nothing to close \u2014 only the kept sim ${m.keepId} is connected`:m.staleSavedId?` nothing to close \u2014 no sims connected (cleared stale current sim ${m.staleSavedId})`:" nothing to close \u2014 no sims connected");return}let u=await eo(n,o.wsPort,o.commandTimeoutMs,m.targets);await me(a,m.targets);let g=_();g&&u.closed.includes(g)&&(m.keepId?b(m.keepId):M());let Q=` closed ${u.closed.length} sim(s)${m.keepId?` (kept ${m.keepId})`:""}`;console.log(Q),u.remaining.length>0&&(console.error(` close failed: still connected: ${u.remaining.join(", ")}`),process.exit(1))}catch(a){console.error(` close failed: ${a instanceof Error?a.message:String(a)}`),process.exit(1)}finally{n.close()}return}try{try{let a=await n.listSims(),l=J(a,o.positional[0]||o.simId),d=a.find(u=>u.id!==l.id&&u.readyState==="open");await n.closeSim(l.id),await Gt(o.wsPort,o.commandTimeoutMs,l.id)||(await me(a,[l.id]),console.error(` close failed: ${l.id} is still connected`),process.exit(1)),await me(a,[l.id]),_()===l.id&&(d?b(d.id):M()),console.log(` closed: ${l.id}`)}catch(a){console.error(` close failed: ${a instanceof Error?a.message:String(a)}`),await R(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{lo as a,ut as b,co as c,bt as d,St as e,Bo as f,Xe as g,q as h,Ht as i,jt as j,Do as k,de as l,qt as m,Vt as n,Jt as o,me as p,Xt as q,Lo as r,Ao as s,No as t,Fo as u,eo as v,to as w,Ho as x};
@@ -1 +0,0 @@
1
- /*! sootsim v0.1.245 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */