sootsim 0.1.97 → 0.1.99

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-SU77BBVH.js → agent-FRLHFA7O.js} +2 -2
  3. package/dist-cli/chunks/{agent-wrapper-K5SCMKOG.js → agent-wrapper-PGM74DGK.js} +2 -2
  4. package/dist-cli/chunks/{assert-PWMVKWX7.js → assert-SZHEMF7T.js} +2 -2
  5. package/dist-cli/chunks/auto-bootstrap-AI5R4WGI.js +2 -0
  6. package/dist-cli/chunks/beta-WOHNLNX4.js +2 -0
  7. package/dist-cli/chunks/{chunk-G3HCQQFO.js → chunk-3JAOZ6SY.js} +1 -1
  8. package/dist-cli/chunks/{chunk-ZKIINLN6.js → chunk-3YEWVBCW.js} +1 -1
  9. package/dist-cli/chunks/{chunk-4UADXPBP.js → chunk-55M3WRUQ.js} +2 -2
  10. package/dist-cli/chunks/{chunk-KVKPLEZT.js → chunk-5O5EKOMJ.js} +2 -2
  11. package/dist-cli/chunks/{chunk-UP7IGVSE.js → chunk-6UQTZIUA.js} +2 -2
  12. package/dist-cli/chunks/{chunk-Q6B4MLN6.js → chunk-6X5QLXOH.js} +2 -2
  13. package/dist-cli/chunks/{chunk-GPLLLNEU.js → chunk-6YPGG2TW.js} +2 -2
  14. package/dist-cli/chunks/{chunk-X3D7C7BR.js → chunk-7XWCZ7SL.js} +2 -2
  15. package/dist-cli/chunks/{chunk-KDFUASGE.js → chunk-AHZFERZ5.js} +1 -1
  16. package/dist-cli/chunks/{chunk-FMPXNH7K.js → chunk-C5H3YWJD.js} +2 -2
  17. package/dist-cli/chunks/{chunk-JLPT4BLV.js → chunk-CK746JAM.js} +3 -3
  18. package/dist-cli/chunks/{chunk-KOG6Q3PS.js → chunk-CWDGYKLF.js} +1 -1
  19. package/dist-cli/chunks/{chunk-VSVTE6CJ.js → chunk-CWQSVRO6.js} +2 -2
  20. package/dist-cli/chunks/{chunk-OR6YOWNM.js → chunk-EY623SM2.js} +1 -1
  21. package/dist-cli/chunks/{chunk-7PI4V2QQ.js → chunk-F7PFPN2E.js} +1 -1
  22. package/dist-cli/chunks/chunk-FBFKGOHZ.js +1 -0
  23. package/dist-cli/chunks/chunk-GILWNDUQ.js +2 -0
  24. package/dist-cli/chunks/chunk-HMZEAZ24.js +1 -0
  25. package/dist-cli/chunks/{chunk-PTX72XPJ.js → chunk-JIU73CDT.js} +1 -1
  26. package/dist-cli/chunks/{chunk-X4WLYCVV.js → chunk-JNF7362C.js} +2 -2
  27. package/dist-cli/chunks/{chunk-A3SRXMKQ.js → chunk-KBSL524T.js} +2 -2
  28. package/dist-cli/chunks/chunk-MBJEHEBV.js +2 -0
  29. package/dist-cli/chunks/{chunk-DWRXWOP2.js → chunk-MQUVTPGH.js} +1 -1
  30. package/dist-cli/chunks/{chunk-KFDJJVEW.js → chunk-N3L4Z4VW.js} +2 -2
  31. package/dist-cli/chunks/chunk-N4PZHAUK.js +1 -0
  32. package/dist-cli/chunks/{chunk-2EITFRFB.js → chunk-NYJMVX7H.js} +1 -1
  33. package/dist-cli/chunks/{chunk-MTBPYWEZ.js → chunk-ORD337AW.js} +2 -2
  34. package/dist-cli/chunks/{chunk-OXR3OJCB.js → chunk-PULTHGDZ.js} +1 -1
  35. package/dist-cli/chunks/{chunk-SKMED2FE.js → chunk-PVVRIV4S.js} +2 -2
  36. package/dist-cli/chunks/{chunk-VQ5WBD7Q.js → chunk-PVZHEZSO.js} +1 -1
  37. package/dist-cli/chunks/{chunk-IJ33WJ5W.js → chunk-RJYQUUE7.js} +6 -6
  38. package/dist-cli/chunks/chunk-TAPEJKGG.js +2 -0
  39. package/dist-cli/chunks/{chunk-6AY47QPV.js → chunk-THJRUIOX.js} +35 -33
  40. package/dist-cli/chunks/{chunk-T6TWNHBM.js → chunk-THTKBQTR.js} +2 -2
  41. package/dist-cli/chunks/{chunk-Z5L6BUX7.js → chunk-TXW4TZVG.js} +2 -2
  42. package/dist-cli/chunks/{chunk-GDQEQAII.js → chunk-UCJ3W4SE.js} +3 -3
  43. package/dist-cli/chunks/{chunk-FLC42G3G.js → chunk-UMZDMPR3.js} +2 -2
  44. package/dist-cli/chunks/{chunk-MLM6WL6R.js → chunk-UTBM7KTJ.js} +1 -1
  45. package/dist-cli/chunks/{chunk-PSARJP5G.js → chunk-UYMLMK6L.js} +2 -2
  46. package/dist-cli/chunks/{chunk-TERFWC34.js → chunk-WQWDTQYG.js} +2 -2
  47. package/dist-cli/chunks/{chunk-BYNTLWZJ.js → chunk-XI6NGTUM.js} +1 -1
  48. package/dist-cli/chunks/chunk-YI6LL2WK.js +12 -0
  49. package/dist-cli/chunks/{chunk-O4Z3J5IB.js → chunk-YLYJIK7A.js} +1 -1
  50. package/dist-cli/chunks/{chunk-UUWPHSHP.js → chunk-ZBZBID4D.js} +2 -2
  51. package/dist-cli/chunks/cli-version-VKOUVCC4.js +2 -0
  52. package/dist-cli/chunks/{compat-Y56T6S5J.js → compat-TVJCJ34F.js} +3 -3
  53. package/dist-cli/chunks/{config-OGEXYPKO.js → config-CMUGNG25.js} +2 -2
  54. package/dist-cli/chunks/{control-ZDVYQXLR.js → control-E4T7L633.js} +2 -2
  55. package/dist-cli/chunks/{cpu-profile-FEP3AHIR.js → cpu-profile-IQPK6SJM.js} +2 -2
  56. package/dist-cli/chunks/{daemon-BU3J6WX6.js → daemon-LWKCA22S.js} +2 -2
  57. package/dist-cli/chunks/{debug-ROBYKLQA.js → debug-PN2YPNNI.js} +3 -3
  58. package/dist-cli/chunks/{detox-GVUJWGNX.js → detox-VGAKCOQU.js} +2 -2
  59. package/dist-cli/chunks/{device-VEHP4XYJ.js → device-NTABM3ML.js} +2 -2
  60. package/dist-cli/chunks/{diagnose-XBRWUTWC.js → diagnose-OXKEHG7B.js} +2 -2
  61. package/dist-cli/chunks/drivers-NULC7FFQ.js +2 -0
  62. package/dist-cli/chunks/{electron-QTHWLVM2.js → electron-T2VJKTFJ.js} +3 -3
  63. package/dist-cli/chunks/flow-YGNWLD2A.js +2 -0
  64. package/dist-cli/chunks/help-JHVDLNXW.js +2 -0
  65. package/dist-cli/chunks/{hints-MSEYB5MF.js → hints-PK7IJDZU.js} +2 -2
  66. package/dist-cli/chunks/{home-paths-FCV66XAY.js → home-paths-5Y737ZVL.js} +2 -2
  67. package/dist-cli/chunks/{inspect-APBW7CDQ.js → inspect-UBKCSZBM.js} +3 -3
  68. package/dist-cli/chunks/install-ZOZVAVYY.js +2 -0
  69. package/dist-cli/chunks/{install-desktop-B3VDPCV6.js → install-desktop-ZXQ5WDII.js} +3 -3
  70. package/dist-cli/chunks/{keys-7NM5OVNU.js → keys-5PJKPC7I.js} +2 -2
  71. package/dist-cli/chunks/{launch-BMVLIGOX.js → launch-FQQYHDRJ.js} +3 -3
  72. package/dist-cli/chunks/{login-JS2BWAFY.js → login-XKN4KFKG.js} +4 -4
  73. package/dist-cli/chunks/{logout-CBYSAD3P.js → logout-JAV4KNVG.js} +2 -2
  74. package/dist-cli/chunks/{maestro-6GEC3JWX.js → maestro-G2HCMZ5Z.js} +2 -2
  75. package/dist-cli/chunks/{preview-QGYGGBE7.js → preview-M6J7A2BB.js} +2 -2
  76. package/dist-cli/chunks/{profile-XXNBVCLN.js → profile-PCGDJ4OL.js} +2 -2
  77. package/dist-cli/chunks/{react-6BZUOZWH.js → react-RFHZXELV.js} +2 -2
  78. package/dist-cli/chunks/{record-URYEF2AQ.js → record-GADTRQK5.js} +2 -2
  79. package/dist-cli/chunks/runtime-SKN5EFB4.js +2 -0
  80. package/dist-cli/chunks/{runtime-delivery-GCGNMT3F.js → runtime-delivery-EFIF3XJI.js} +2 -2
  81. package/dist-cli/chunks/{screenshot-EFMES4SJ.js → screenshot-DB4XYQGP.js} +2 -2
  82. package/dist-cli/chunks/{screenshot-mode-5ANGALST.js → screenshot-mode-A3JCEB5V.js} +2 -2
  83. package/dist-cli/chunks/{screenshots-W7J7YR7E.js → screenshots-ZVDLSBWH.js} +2 -2
  84. package/dist-cli/chunks/{server-4CQOHGPZ.js → server-YGNXBQTO.js} +10 -10
  85. package/dist-cli/chunks/setup-repo-IZLJN26N.js +2 -0
  86. package/dist-cli/chunks/{skills-N5X3XRR2.js → skills-63TWUEWN.js} +2 -2
  87. package/dist-cli/chunks/{start-345JCUJ3.js → start-57ZETJ7T.js} +4 -4
  88. package/dist-cli/chunks/store-7244VCM7.js +2 -0
  89. package/dist-cli/chunks/telemetry-MHTGW7IU.js +2 -0
  90. package/dist-cli/chunks/{test-QH666WCF.js → test-UVMR4HW4.js} +3 -3
  91. package/dist-cli/chunks/{three-mode-5NHSGHZS.js → three-mode-GHRYSPIP.js} +2 -2
  92. package/dist-cli/chunks/{timeline-YBGMZ4JH.js → timeline-AHQTYOGW.js} +2 -2
  93. package/dist-cli/chunks/{upgrade-BBOLGPZS.js → upgrade-6N4WIHB3.js} +2 -2
  94. package/dist-cli/chunks/upload-M2QRY3MT.js +2 -0
  95. package/dist-cli/chunks/{web-UHDIS4RZ.js → web-GWVV2MDT.js} +2 -2
  96. package/dist-cli/chunks/{what-happened-CJ7U3GH4.js → what-happened-4VKIKJES.js} +2 -2
  97. package/dist-cli/chunks/{whoami-VSKCOFA2.js → whoami-JODFPJAO.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 +63 -3
  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 +1 -1
  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 +1 -1
  122. package/dist-lib/scripts/dev-server-scanner.cjs +1 -1
  123. package/dist-lib/skills.cjs +60 -3
  124. package/dist-lib/vite.cjs +1 -1
  125. package/package.json +1 -1
  126. package/src/bridge-constants.ts +77 -0
  127. package/src/vite-plugin.ts +7 -2
  128. package/dist-cli/chunks/auto-bootstrap-2AELNDXM.js +0 -2
  129. package/dist-cli/chunks/beta-TJMISBHK.js +0 -2
  130. package/dist-cli/chunks/chunk-3SGYIKN4.js +0 -2
  131. package/dist-cli/chunks/chunk-4B7FR74H.js +0 -1
  132. package/dist-cli/chunks/chunk-4QXMGJNW.js +0 -2
  133. package/dist-cli/chunks/chunk-CSVKJXQN.js +0 -1
  134. package/dist-cli/chunks/chunk-QAV5UFSW.js +0 -12
  135. package/dist-cli/chunks/chunk-R232XO5E.js +0 -1
  136. package/dist-cli/chunks/chunk-UT3YONFG.js +0 -2
  137. package/dist-cli/chunks/cli-version-PT5W6CHE.js +0 -2
  138. package/dist-cli/chunks/drivers-P42EXYLX.js +0 -2
  139. package/dist-cli/chunks/flow-D33GCIWV.js +0 -2
  140. package/dist-cli/chunks/help-UBVBGZQE.js +0 -2
  141. package/dist-cli/chunks/install-BMUZQEOD.js +0 -2
  142. package/dist-cli/chunks/runtime-B5Z635OC.js +0 -2
  143. package/dist-cli/chunks/setup-repo-F5TNA7EV.js +0 -2
  144. package/dist-cli/chunks/store-HLAWNN3S.js +0 -2
  145. package/dist-cli/chunks/telemetry-Q6PENS6P.js +0 -2
  146. package/dist-cli/chunks/upload-465MVFYX.js +0 -2
@@ -1,5 +1,5 @@
1
- /*! sootsim v0.1.97 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{A as T,B as y,M as x,z as F}from"./chunk-ZKIINLN6.js";import{c as S,e as N}from"./chunk-KVKPLEZT.js";import{b as k}from"./chunk-KDFUASGE.js";import"./chunk-UT3YONFG.js";import"./chunk-KOG6Q3PS.js";import"./chunk-MLM6WL6R.js";function _(n){let e=[];for(let t=0;t<n.length;t++)if(n[t]==="--since"&&t+1<n.length){e.push(t,t+1);let s=n[t+1].trim(),l=/^(\d+(?:\.\d+)?)(ms|s|m)?$/.exec(s);if(l){let a=Number(l[1]),m=l[2]??"ms",$=m==="s"?a*1e3:m==="m"?a*6e4:a;return{since:Date.now()-$,consumed:e}}let o=Number(s);if(Number.isFinite(o)&&o>1e12)return{since:o,consumed:e}}return{consumed:e}}function K(n){let e=[];for(let t=0;t<n.length;t++)if(n[t]==="--kinds"&&t+1<n.length)return e.push(t,t+1),{kinds:n[t+1].split(",").map(s=>s.trim()).filter(Boolean),consumed:e};return{consumed:e}}function O(n){let e=[];for(let t=0;t<n.length;t++)if(n[t]==="--limit"&&t+1<n.length){e.push(t,t+1);let s=Number(n[t+1]);if(Number.isFinite(s)&&s>0)return{limit:s,consumed:e}}return{consumed:e}}function j(n,e){if(e===null)return new Date(n).toLocaleTimeString();let t=(n-e)/1e3;return`${t>=0?"+":""}${t.toFixed(2)}s`}function B(n,e){switch(n){case"app-launch":return e.phase==="launch"?`launch ${e.appName??e.toAppId??""}`:`dismiss ${e.appName??e.fromAppId??""} \u2192 ${e.toAppId??""}`;case"toast":return`"${e.text??""}"${e.durationMs?` (${e.durationMs}ms)`:""}`;case"keyboard":return`${e.phase??"?"}${e.heightPx?` h=${e.heightPx}`:""}${e.mode?` ${e.mode}`:""}`;case"screen":return`${e.phase??"?"} ${e.name??e.activeName??""}`;case"route":return`${e.phase??"?"} ${e.path??e.pathname??""}`;case"alert":case"actionsheet":case"picker":return`${e.phase??"?"} ${e.title??e.message??""}`;case"notification":return`${e.title??""}${e.body?` \u2014 ${e.body}`:""}`;case"fetch":return`${e.method??"GET"} ${e.url??""}${e.status?` -> ${e.status}`:""}`;case"console":return`${e.level??"log"}: ${(e.message??"").toString().slice(0,120)}`;case"shell":return`${e.event??e.type??e.phase??""}`;case"scroll":return`${e.phase??"?"} ${e.target??""}`;case"gesture":return`${e.phase??"?"} ${e.type??""}`;case"text-input":return`${e.phase??"?"}${e.value!==void 0?` "${String(e.value).slice(0,40)}"`:""}`;case"layout":return`${e.kind??"?"} ${e.testID??e.type??""}${e.skipped?` skipped:${e.reason??"unknown"}`:""}`;case"react-commit":{let t=e.slowest;return`${e.fiberCount??"?"} fibers ${e.durationMs??"?"}ms${t?.displayName?` \xB7 ${t.displayName} ${t.durationMs??"?"}ms`:""}`}case"reanimated":case"animation":return`${e.kind??""} ${e.target??""}${e.durationMs?` ${e.durationMs}ms`:""}`}}function A(n,e){let t=j(n.t,e).padStart(8),s=n.context.padEnd(6),l=`[${n.kind}]`.padEnd(15),o="",a=n.data;return a&&typeof a=="object"&&(o=B(n.kind,a)),` ${t} ${s} ${l} ${o}`}function M(n){let e=[],t={label:"initial state",events:[],startedAt:n[0]?.t??null};e.push(t);for(let s of n)if(t.events.push(s),s.kind==="screen"||s.kind==="route"){let l=s.data,o=l?.phase;if(!o||o==="enter"||o==="appear"||o==="active"){let a=l?.name||l?.activeName||l?.path||l?.pathname||s.kind;e.length===1&&t.events.length===1?t.label=`${s.kind}: ${a}`:(t={label:`${s.kind}: ${a}`,events:[],startedAt:s.t},e.push(t))}}return e}async function J(n,e){let t=S(n,{port:e.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.99 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
+ import{A as T,B as y,M as x,z as F}from"./chunk-3YEWVBCW.js";import{c as S,e as N}from"./chunk-5O5EKOMJ.js";import{b as k}from"./chunk-AHZFERZ5.js";import"./chunk-GILWNDUQ.js";import"./chunk-CWDGYKLF.js";import"./chunk-UTBM7KTJ.js";function _(n){let e=[];for(let t=0;t<n.length;t++)if(n[t]==="--since"&&t+1<n.length){e.push(t,t+1);let s=n[t+1].trim(),l=/^(\d+(?:\.\d+)?)(ms|s|m)?$/.exec(s);if(l){let a=Number(l[1]),m=l[2]??"ms",$=m==="s"?a*1e3:m==="m"?a*6e4:a;return{since:Date.now()-$,consumed:e}}let o=Number(s);if(Number.isFinite(o)&&o>1e12)return{since:o,consumed:e}}return{consumed:e}}function K(n){let e=[];for(let t=0;t<n.length;t++)if(n[t]==="--kinds"&&t+1<n.length)return e.push(t,t+1),{kinds:n[t+1].split(",").map(s=>s.trim()).filter(Boolean),consumed:e};return{consumed:e}}function O(n){let e=[];for(let t=0;t<n.length;t++)if(n[t]==="--limit"&&t+1<n.length){e.push(t,t+1);let s=Number(n[t+1]);if(Number.isFinite(s)&&s>0)return{limit:s,consumed:e}}return{consumed:e}}function j(n,e){if(e===null)return new Date(n).toLocaleTimeString();let t=(n-e)/1e3;return`${t>=0?"+":""}${t.toFixed(2)}s`}function B(n,e){switch(n){case"app-launch":return e.phase==="launch"?`launch ${e.appName??e.toAppId??""}`:`dismiss ${e.appName??e.fromAppId??""} \u2192 ${e.toAppId??""}`;case"toast":return`"${e.text??""}"${e.durationMs?` (${e.durationMs}ms)`:""}`;case"keyboard":return`${e.phase??"?"}${e.heightPx?` h=${e.heightPx}`:""}${e.mode?` ${e.mode}`:""}`;case"screen":return`${e.phase??"?"} ${e.name??e.activeName??""}`;case"route":return`${e.phase??"?"} ${e.path??e.pathname??""}`;case"alert":case"actionsheet":case"picker":return`${e.phase??"?"} ${e.title??e.message??""}`;case"notification":return`${e.title??""}${e.body?` \u2014 ${e.body}`:""}`;case"fetch":return`${e.method??"GET"} ${e.url??""}${e.status?` -> ${e.status}`:""}`;case"console":return`${e.level??"log"}: ${(e.message??"").toString().slice(0,120)}`;case"shell":return`${e.event??e.type??e.phase??""}`;case"scroll":return`${e.phase??"?"} ${e.target??""}`;case"gesture":return`${e.phase??"?"} ${e.type??""}`;case"text-input":return`${e.phase??"?"}${e.value!==void 0?` "${String(e.value).slice(0,40)}"`:""}`;case"layout":return`${e.kind??"?"} ${e.testID??e.type??""}${e.skipped?` skipped:${e.reason??"unknown"}`:""}`;case"react-commit":{let t=e.slowest;return`${e.fiberCount??"?"} fibers ${e.durationMs??"?"}ms${t?.displayName?` \xB7 ${t.displayName} ${t.durationMs??"?"}ms`:""}`}case"reanimated":case"animation":return`${e.kind??""} ${e.target??""}${e.durationMs?` ${e.durationMs}ms`:""}`}}function A(n,e){let t=j(n.t,e).padStart(8),s=n.context.padEnd(6),l=`[${n.kind}]`.padEnd(15),o="",a=n.data;return a&&typeof a=="object"&&(o=B(n.kind,a)),` ${t} ${s} ${l} ${o}`}function M(n){let e=[],t={label:"initial state",events:[],startedAt:n[0]?.t??null};e.push(t);for(let s of n)if(t.events.push(s),s.kind==="screen"||s.kind==="route"){let l=s.data,o=l?.phase;if(!o||o==="enter"||o==="appear"||o==="active"){let a=l?.name||l?.activeName||l?.path||l?.pathname||s.kind;e.length===1&&t.events.length===1?t.label=`${s.kind}: ${a}`:(t={label:`${s.kind}: ${a}`,events:[],startedAt:s.t},e.push(t))}}return e}async function J(n,e){let t=S(n,{port:e.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,2 +1,2 @@
1
- /*! sootsim v0.1.97 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{d as i}from"./chunk-TERFWC34.js";import{d as n}from"./chunk-FLC42G3G.js";import"./chunk-KOG6Q3PS.js";import"./chunk-MLM6WL6R.js";async function u(){let o=i();if(o||(console.log(" not signed in"),console.log(" set SOOTSIM_API_KEY=sk_sootsim_\u2026 or run `sootsim login`"),process.exit(1)),o.kind==="api-key"){let r=`${o.secret.slice(0,14)}\u2026`,t=o.source==="env"?"SOOTSIM_API_KEY env var":"saved key (~/.config/sootsim/credentials.json)";console.log(` api key ${r}`),console.log(` source: ${t}`);return}if(o.kind==="github"){console.log(` github token (${o.source})`),console.log(` repo: ${o.repoId}`);return}let e=await n(),s=e?.user;console.log(` ${s?.email||s?.name||s?.id||"signed in"}`),console.log(` origin: ${e?.origin??o.origin}`),e?.updatedAt&&console.log(` updated: ${e.updatedAt}`)}export{u as runWhoami};
1
+ /*! sootsim v0.1.99 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
+ import{d as i}from"./chunk-WQWDTQYG.js";import{d as n}from"./chunk-UMZDMPR3.js";import"./chunk-CWDGYKLF.js";import"./chunk-UTBM7KTJ.js";async function u(){let o=i();if(o||(console.log(" not signed in"),console.log(" set SOOTSIM_API_KEY=sk_sootsim_\u2026 or run `sootsim login`"),process.exit(1)),o.kind==="api-key"){let r=`${o.secret.slice(0,14)}\u2026`,t=o.source==="env"?"SOOTSIM_API_KEY env var":"saved key (~/.config/sootsim/credentials.json)";console.log(` api key ${r}`),console.log(` source: ${t}`);return}if(o.kind==="github"){console.log(` github token (${o.source})`),console.log(` repo: ${o.repoId}`);return}let e=await n(),s=e?.user;console.log(` ${s?.email||s?.name||s?.id||"signed in"}`),console.log(` origin: ${e?.origin??o.origin}`),e?.updatedAt&&console.log(` updated: ${e.updatedAt}`)}export{u as runWhoami};
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.97 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.99 | (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.97 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.99 | (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.97 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.99 | (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.97 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.99 | (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.97 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.99 | (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.97 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.99 | (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.97 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.99 | (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.97 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.99 | (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.97 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.99 | (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;
@@ -24,15 +24,75 @@ var bridge_constants_exports = {};
24
24
  __export(bridge_constants_exports, {
25
25
  DEFAULT_SOOTSIM_BRIDGE_PORT: () => DEFAULT_SOOTSIM_BRIDGE_PORT,
26
26
  SOOTSIM_BRIDGE_SIM_CLOSE_CODE: () => SOOTSIM_BRIDGE_SIM_CLOSE_CODE,
27
- SOOTSIM_BRIDGE_SIM_CLOSE_REASON: () => SOOTSIM_BRIDGE_SIM_CLOSE_REASON
27
+ SOOTSIM_BRIDGE_SIM_CLOSE_REASON: () => SOOTSIM_BRIDGE_SIM_CLOSE_REASON,
28
+ resolveSootsimBridgePort: () => resolveSootsimBridgePort,
29
+ resolveSootsimBridgePortForHttpPort: () => resolveSootsimBridgePortForHttpPort,
30
+ resolveSootsimBridgePortForRuntimeLocation: () => resolveSootsimBridgePortForRuntimeLocation
28
31
  });
29
32
  module.exports = __toCommonJS(bridge_constants_exports);
30
33
  var DEFAULT_SOOTSIM_BRIDGE_PORT = 7668;
34
+ function parsePort(value) {
35
+ if (typeof value === "number") {
36
+ return Number.isInteger(value) && value > 0 ? value : null;
37
+ }
38
+ if (typeof value !== "string") return null;
39
+ const trimmed = value.trim();
40
+ if (!trimmed) return null;
41
+ const parsed = Number(trimmed);
42
+ return Number.isInteger(parsed) && parsed > 0 ? parsed : null;
43
+ }
44
+ function parsePortOffset(value) {
45
+ const parsed = parsePort(value);
46
+ return parsed === null ? 0 : parsed;
47
+ }
48
+ function resolveSootsimBridgePort(input = {}) {
49
+ const explicitPort = parsePort(input.explicitPort);
50
+ if (explicitPort !== null) return explicitPort;
51
+ return DEFAULT_SOOTSIM_BRIDGE_PORT + parsePortOffset(input.portOffset);
52
+ }
53
+ function resolveSootsimBridgePortForHttpPort(input) {
54
+ const explicitPort = parsePort(input.explicitPort);
55
+ if (explicitPort !== null) return explicitPort;
56
+ const httpPort = parsePort(input.httpPort);
57
+ const portOffset = httpPort === null ? 0 : Math.max(0, httpPort - input.baseHttpPort);
58
+ return resolveSootsimBridgePort({ portOffset });
59
+ }
60
+ var LOCAL_DEV_HTTP_BASE_PORTS = [3e3, 5173];
61
+ var MAX_LOCAL_DEV_PORT_OFFSET = 2e3;
62
+ function parseHrefPort(value) {
63
+ if (typeof value !== "string" || !value.trim()) return null;
64
+ try {
65
+ return parsePort(new URL(value).port);
66
+ } catch {
67
+ return null;
68
+ }
69
+ }
70
+ function closestLocalDevBaseHttpPort(httpPort) {
71
+ let closest = null;
72
+ for (const basePort of LOCAL_DEV_HTTP_BASE_PORTS) {
73
+ const offset = httpPort - basePort;
74
+ if (offset < 0 || offset > MAX_LOCAL_DEV_PORT_OFFSET) continue;
75
+ if (!closest || offset < closest.offset) closest = { basePort, offset };
76
+ }
77
+ return closest?.basePort ?? null;
78
+ }
79
+ function resolveSootsimBridgePortForRuntimeLocation(input = {}) {
80
+ const explicitPort = parsePort(input.explicitPort);
81
+ if (explicitPort !== null) return explicitPort;
82
+ const httpPort = parsePort(input.httpPort) ?? parseHrefPort(input.href);
83
+ if (httpPort === null) return DEFAULT_SOOTSIM_BRIDGE_PORT;
84
+ const baseHttpPort = closestLocalDevBaseHttpPort(httpPort);
85
+ if (baseHttpPort === null) return DEFAULT_SOOTSIM_BRIDGE_PORT;
86
+ return resolveSootsimBridgePortForHttpPort({ httpPort, baseHttpPort });
87
+ }
31
88
  var SOOTSIM_BRIDGE_SIM_CLOSE_CODE = 4001;
32
89
  var SOOTSIM_BRIDGE_SIM_CLOSE_REASON = "sootsim close";
33
90
  // Annotate the CommonJS export names for ESM import in node:
34
91
  0 && (module.exports = {
35
92
  DEFAULT_SOOTSIM_BRIDGE_PORT,
36
93
  SOOTSIM_BRIDGE_SIM_CLOSE_CODE,
37
- SOOTSIM_BRIDGE_SIM_CLOSE_REASON
94
+ SOOTSIM_BRIDGE_SIM_CLOSE_REASON,
95
+ resolveSootsimBridgePort,
96
+ resolveSootsimBridgePortForHttpPort,
97
+ resolveSootsimBridgePortForRuntimeLocation
38
98
  });
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.97 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.99 | (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.97 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.99 | (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.97 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.99 | (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.97 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.99 | (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.97 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.99 | (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.97 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.99 | (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.97 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.99 | (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.97 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.99 | (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.97 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.99 | (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.97 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.99 | (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.97 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.99 | (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.97 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.99 | (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.97 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.99 | (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.97 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.99 | (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.97 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.99 | (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.97 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.99 | (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.97 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.99 | (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;
@@ -9495,13 +9495,70 @@ var bridge_constants_exports = {};
9495
9495
  __export(bridge_constants_exports, {
9496
9496
  DEFAULT_SOOTSIM_BRIDGE_PORT: () => DEFAULT_SOOTSIM_BRIDGE_PORT,
9497
9497
  SOOTSIM_BRIDGE_SIM_CLOSE_CODE: () => SOOTSIM_BRIDGE_SIM_CLOSE_CODE,
9498
- SOOTSIM_BRIDGE_SIM_CLOSE_REASON: () => SOOTSIM_BRIDGE_SIM_CLOSE_REASON
9498
+ SOOTSIM_BRIDGE_SIM_CLOSE_REASON: () => SOOTSIM_BRIDGE_SIM_CLOSE_REASON,
9499
+ resolveSootsimBridgePort: () => resolveSootsimBridgePort,
9500
+ resolveSootsimBridgePortForHttpPort: () => resolveSootsimBridgePortForHttpPort,
9501
+ resolveSootsimBridgePortForRuntimeLocation: () => resolveSootsimBridgePortForRuntimeLocation
9499
9502
  });
9500
- var DEFAULT_SOOTSIM_BRIDGE_PORT, SOOTSIM_BRIDGE_SIM_CLOSE_CODE, SOOTSIM_BRIDGE_SIM_CLOSE_REASON;
9503
+ function parsePort(value) {
9504
+ if (typeof value === "number") {
9505
+ return Number.isInteger(value) && value > 0 ? value : null;
9506
+ }
9507
+ if (typeof value !== "string") return null;
9508
+ const trimmed = value.trim();
9509
+ if (!trimmed) return null;
9510
+ const parsed = Number(trimmed);
9511
+ return Number.isInteger(parsed) && parsed > 0 ? parsed : null;
9512
+ }
9513
+ function parsePortOffset(value) {
9514
+ const parsed = parsePort(value);
9515
+ return parsed === null ? 0 : parsed;
9516
+ }
9517
+ function resolveSootsimBridgePort(input = {}) {
9518
+ const explicitPort = parsePort(input.explicitPort);
9519
+ if (explicitPort !== null) return explicitPort;
9520
+ return DEFAULT_SOOTSIM_BRIDGE_PORT + parsePortOffset(input.portOffset);
9521
+ }
9522
+ function resolveSootsimBridgePortForHttpPort(input) {
9523
+ const explicitPort = parsePort(input.explicitPort);
9524
+ if (explicitPort !== null) return explicitPort;
9525
+ const httpPort = parsePort(input.httpPort);
9526
+ const portOffset = httpPort === null ? 0 : Math.max(0, httpPort - input.baseHttpPort);
9527
+ return resolveSootsimBridgePort({ portOffset });
9528
+ }
9529
+ function parseHrefPort(value) {
9530
+ if (typeof value !== "string" || !value.trim()) return null;
9531
+ try {
9532
+ return parsePort(new URL(value).port);
9533
+ } catch {
9534
+ return null;
9535
+ }
9536
+ }
9537
+ function closestLocalDevBaseHttpPort(httpPort) {
9538
+ let closest = null;
9539
+ for (const basePort of LOCAL_DEV_HTTP_BASE_PORTS) {
9540
+ const offset = httpPort - basePort;
9541
+ if (offset < 0 || offset > MAX_LOCAL_DEV_PORT_OFFSET) continue;
9542
+ if (!closest || offset < closest.offset) closest = { basePort, offset };
9543
+ }
9544
+ return closest?.basePort ?? null;
9545
+ }
9546
+ function resolveSootsimBridgePortForRuntimeLocation(input = {}) {
9547
+ const explicitPort = parsePort(input.explicitPort);
9548
+ if (explicitPort !== null) return explicitPort;
9549
+ const httpPort = parsePort(input.httpPort) ?? parseHrefPort(input.href);
9550
+ if (httpPort === null) return DEFAULT_SOOTSIM_BRIDGE_PORT;
9551
+ const baseHttpPort = closestLocalDevBaseHttpPort(httpPort);
9552
+ if (baseHttpPort === null) return DEFAULT_SOOTSIM_BRIDGE_PORT;
9553
+ return resolveSootsimBridgePortForHttpPort({ httpPort, baseHttpPort });
9554
+ }
9555
+ var DEFAULT_SOOTSIM_BRIDGE_PORT, LOCAL_DEV_HTTP_BASE_PORTS, MAX_LOCAL_DEV_PORT_OFFSET, SOOTSIM_BRIDGE_SIM_CLOSE_CODE, SOOTSIM_BRIDGE_SIM_CLOSE_REASON;
9501
9556
  var init_bridge_constants = __esm({
9502
9557
  "src/bridge-constants.ts"() {
9503
9558
  "use strict";
9504
9559
  DEFAULT_SOOTSIM_BRIDGE_PORT = 7668;
9560
+ LOCAL_DEV_HTTP_BASE_PORTS = [3e3, 5173];
9561
+ MAX_LOCAL_DEV_PORT_OFFSET = 2e3;
9505
9562
  SOOTSIM_BRIDGE_SIM_CLOSE_CODE = 4001;
9506
9563
  SOOTSIM_BRIDGE_SIM_CLOSE_REASON = "sootsim close";
9507
9564
  }
package/dist-lib/vite.cjs CHANGED
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.97 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.99 | (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.97",
3
+ "version": "0.1.99",
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",
@@ -3,6 +3,83 @@
3
3
  // dev plugin, and runtime agree on the same value.
4
4
  export const DEFAULT_SOOTSIM_BRIDGE_PORT = 7668
5
5
 
6
+ function parsePort(value: unknown): number | null {
7
+ if (typeof value === 'number') {
8
+ return Number.isInteger(value) && value > 0 ? value : null
9
+ }
10
+ if (typeof value !== 'string') return null
11
+ const trimmed = value.trim()
12
+ if (!trimmed) return null
13
+ const parsed = Number(trimmed)
14
+ return Number.isInteger(parsed) && parsed > 0 ? parsed : null
15
+ }
16
+
17
+ function parsePortOffset(value: unknown): number {
18
+ const parsed = parsePort(value)
19
+ return parsed === null ? 0 : parsed
20
+ }
21
+
22
+ export function resolveSootsimBridgePort(
23
+ input: {
24
+ explicitPort?: unknown
25
+ portOffset?: unknown
26
+ } = {},
27
+ ): number {
28
+ const explicitPort = parsePort(input.explicitPort)
29
+ if (explicitPort !== null) return explicitPort
30
+ return DEFAULT_SOOTSIM_BRIDGE_PORT + parsePortOffset(input.portOffset)
31
+ }
32
+
33
+ export function resolveSootsimBridgePortForHttpPort(input: {
34
+ explicitPort?: unknown
35
+ httpPort?: unknown
36
+ baseHttpPort: number
37
+ }): number {
38
+ const explicitPort = parsePort(input.explicitPort)
39
+ if (explicitPort !== null) return explicitPort
40
+ const httpPort = parsePort(input.httpPort)
41
+ const portOffset = httpPort === null ? 0 : Math.max(0, httpPort - input.baseHttpPort)
42
+ return resolveSootsimBridgePort({ portOffset })
43
+ }
44
+
45
+ const LOCAL_DEV_HTTP_BASE_PORTS = [3000, 5173]
46
+ const MAX_LOCAL_DEV_PORT_OFFSET = 2000
47
+
48
+ function parseHrefPort(value: unknown): number | null {
49
+ if (typeof value !== 'string' || !value.trim()) return null
50
+ try {
51
+ return parsePort(new URL(value).port)
52
+ } catch {
53
+ return null
54
+ }
55
+ }
56
+
57
+ function closestLocalDevBaseHttpPort(httpPort: number): number | null {
58
+ let closest: { basePort: number; offset: number } | null = null
59
+ for (const basePort of LOCAL_DEV_HTTP_BASE_PORTS) {
60
+ const offset = httpPort - basePort
61
+ if (offset < 0 || offset > MAX_LOCAL_DEV_PORT_OFFSET) continue
62
+ if (!closest || offset < closest.offset) closest = { basePort, offset }
63
+ }
64
+ return closest?.basePort ?? null
65
+ }
66
+
67
+ export function resolveSootsimBridgePortForRuntimeLocation(
68
+ input: {
69
+ explicitPort?: unknown
70
+ href?: unknown
71
+ httpPort?: unknown
72
+ } = {},
73
+ ): number {
74
+ const explicitPort = parsePort(input.explicitPort)
75
+ if (explicitPort !== null) return explicitPort
76
+ const httpPort = parsePort(input.httpPort) ?? parseHrefPort(input.href)
77
+ if (httpPort === null) return DEFAULT_SOOTSIM_BRIDGE_PORT
78
+ const baseHttpPort = closestLocalDevBaseHttpPort(httpPort)
79
+ if (baseHttpPort === null) return DEFAULT_SOOTSIM_BRIDGE_PORT
80
+ return resolveSootsimBridgePortForHttpPort({ httpPort, baseHttpPort })
81
+ }
82
+
6
83
  // private websocket close code used when the daemon intentionally closes a
7
84
  // sim. browser clients treat it as terminal and skip their normal reconnect
8
85
  // loop; playwright-owned sims use it to close their hosting context.
@@ -20,7 +20,7 @@ import {
20
20
  compatStubsForBuildResolver,
21
21
  reactNativeDeepStubsForBuildResolver,
22
22
  } from '../../compat/src/stub-manifest.ts'
23
- import { DEFAULT_SOOTSIM_BRIDGE_PORT } from './bridge-constants.ts'
23
+ import { resolveSootsimBridgePort } from './bridge-constants.ts'
24
24
  import { shouldApplyWorkletsPlugin, transformWorkletsCode } from './worklets-babel.ts'
25
25
 
26
26
  const sootsimPluginRequire = createRequire(import.meta.url)
@@ -499,7 +499,12 @@ export function wsBridgePlugin(): Plugin {
499
499
  // never starts.
500
500
  void import('./host/bridge-host.ts')
501
501
  .then(({ SootSimBridgeHost }) => {
502
- bridgeHost = new SootSimBridgeHost({ port: DEFAULT_SOOTSIM_BRIDGE_PORT })
502
+ bridgeHost = new SootSimBridgeHost({
503
+ port: resolveSootsimBridgePort({
504
+ explicitPort: process.env.SOOTSIM_BRIDGE_PORT,
505
+ portOffset: process.env.PORT_OFFSET,
506
+ }),
507
+ })
503
508
  bridgeHost.start?.({ silent: true })
504
509
  })
505
510
  .catch((err: unknown) => {
@@ -1,2 +0,0 @@
1
- /*! sootsim v0.1.97 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{a,b,c,d}from"./chunk-JLPT4BLV.js";import"./chunk-KVKPLEZT.js";import"./chunk-KDFUASGE.js";import"./chunk-UT3YONFG.js";import"./chunk-KOG6Q3PS.js";import"./chunk-MLM6WL6R.js";export{c as ensureDaemonRunning,a as ensureRuntimeInstalled,d as ensureSootsimReady,b as resolveBootstrapPort};
@@ -1,2 +0,0 @@
1
- /*! sootsim v0.1.97 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{a,b,c,d,e}from"./chunk-VQ5WBD7Q.js";import"./chunk-MLM6WL6R.js";export{e as BETA_ASK_HEADLINE,c as BETA_LABEL,d as BETA_TAGLINE,b as BETA_VERSION_TARGET,a as IS_BETA};
@@ -1,2 +0,0 @@
1
- /*! sootsim v0.1.97 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- var t="http://localhost:5173/";export{t as a};
@@ -1 +0,0 @@
1
- /*! sootsim v0.1.97 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
@@ -1,2 +0,0 @@
1
- /*! sootsim v0.1.97 | (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 +0,0 @@
1
- /*! sootsim v0.1.97 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
@@ -1,12 +0,0 @@
1
- /*! sootsim v0.1.97 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{a as _,b as W,c as de,e as me}from"./chunk-MTBPYWEZ.js";import{m as O}from"./chunk-UP7IGVSE.js";import{k as ae,l as le,n as ce}from"./chunk-ZKIINLN6.js";import{a as pe,b as fe}from"./chunk-4QXMGJNW.js";import{b as ie,c as I,d as S,e as x}from"./chunk-KVKPLEZT.js";import{c as k,d as w,e as C}from"./chunk-KDFUASGE.js";import{g as G}from"./chunk-FMPXNH7K.js";import{a as T,b as q}from"./chunk-DWRXWOP2.js";import{c as ue}from"./chunk-UUWPHSHP.js";import{d as j}from"./chunk-BYNTLWZJ.js";import{a as se}from"./chunk-3SGYIKN4.js";import{E as ne,F as re}from"./chunk-KOG6Q3PS.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};
@@ -1 +0,0 @@
1
- /*! sootsim v0.1.97 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
@@ -1,2 +0,0 @@
1
- /*! sootsim v0.1.97 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- var O="sootsim close";export{O as a};
@@ -1,2 +0,0 @@
1
- /*! sootsim v0.1.97 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{a}from"./chunk-OXR3OJCB.js";import"./chunk-MLM6WL6R.js";export{a as getCliVersion};