sootsim 0.1.133 → 0.1.135

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 (153) hide show
  1. package/detox/gestures.ts +2 -2
  2. package/detox/index.ts +211 -9
  3. package/dist-cli/bin.js +3 -3
  4. package/dist-cli/chunks/{agent-HUV6ZDVC.js → agent-EV3LMTI2.js} +2 -2
  5. package/dist-cli/chunks/{agent-wrapper-DWQ4YJ2L.js → agent-wrapper-GOUAYJWS.js} +2 -2
  6. package/dist-cli/chunks/{app-fonts-KZU5WKNH.js → app-fonts-7ZGCVBWL.js} +2 -2
  7. package/dist-cli/chunks/{assert-O6MCNH6B.js → assert-CZPAVBXB.js} +2 -2
  8. package/dist-cli/chunks/auto-bootstrap-PRFJ44RD.js +2 -0
  9. package/dist-cli/chunks/beta-HNHNY7GJ.js +2 -0
  10. package/dist-cli/chunks/chunk-2RQ5M6MJ.js +13 -0
  11. package/dist-cli/chunks/{chunk-A34CFM2J.js → chunk-2VUPH4SQ.js} +1 -1
  12. package/dist-cli/chunks/{chunk-Q3GCZEPC.js → chunk-45Z6VTEC.js} +1 -1
  13. package/dist-cli/chunks/{chunk-KUTTVAMM.js → chunk-4PJFJ77U.js} +1 -1
  14. package/dist-cli/chunks/{chunk-HSNSCKU6.js → chunk-56LSJ5RZ.js} +2 -2
  15. package/dist-cli/chunks/{chunk-KFN2YKGC.js → chunk-5HFMOWG3.js} +1 -1
  16. package/dist-cli/chunks/{chunk-KHC77NFP.js → chunk-5JSVHUKF.js} +3 -3
  17. package/dist-cli/chunks/{chunk-XEGM2NRW.js → chunk-5PB5X45Q.js} +2 -2
  18. package/dist-cli/chunks/{chunk-THJDQ2EB.js → chunk-7TWZYT4A.js} +1 -1
  19. package/dist-cli/chunks/{chunk-R4PCQVBM.js → chunk-7WF23EDW.js} +2 -2
  20. package/dist-cli/chunks/{chunk-GCNZ32Y7.js → chunk-AQ6QT2DY.js} +2 -2
  21. package/dist-cli/chunks/{chunk-FJRIG6HG.js → chunk-ASXKBNRL.js} +2 -2
  22. package/dist-cli/chunks/{chunk-GMHBZDQA.js → chunk-CLO4G4ZK.js} +1 -1
  23. package/dist-cli/chunks/{chunk-2NV5VDY3.js → chunk-CYELNMX7.js} +2 -2
  24. package/dist-cli/chunks/{chunk-IMG7XQRR.js → chunk-DNF7AILW.js} +2 -2
  25. package/dist-cli/chunks/{chunk-2OST4PMS.js → chunk-EKZJFBGU.js} +2 -2
  26. package/dist-cli/chunks/{chunk-LK6Y3IGB.js → chunk-G7W4URXX.js} +2 -2
  27. package/dist-cli/chunks/{chunk-4CQXBMKU.js → chunk-GBBGAIOO.js} +1 -1
  28. package/dist-cli/chunks/chunk-GGLJLJ7P.js +1 -0
  29. package/dist-cli/chunks/{chunk-VO3QIOCT.js → chunk-IJU5JVF2.js} +1 -1
  30. package/dist-cli/chunks/{chunk-G4OBKVUY.js → chunk-MLNENEA4.js} +1 -1
  31. package/dist-cli/chunks/{chunk-7BCTUWOM.js → chunk-MLVYS3AE.js} +2 -2
  32. package/dist-cli/chunks/{chunk-YZVZA6IX.js → chunk-OC5UQFLJ.js} +1 -1
  33. package/dist-cli/chunks/{chunk-SKF4RZDK.js → chunk-OODLGJLZ.js} +2 -2
  34. package/dist-cli/chunks/{chunk-PZSY7LCJ.js → chunk-PVWYEMAR.js} +1 -1
  35. package/dist-cli/chunks/{chunk-AKIYNT56.js → chunk-PWRO2WPW.js} +1 -1
  36. package/dist-cli/chunks/{chunk-GDHDUANQ.js → chunk-QDGNAEBR.js} +2 -2
  37. package/dist-cli/chunks/{chunk-VZB6MROZ.js → chunk-QDRAULAC.js} +2 -2
  38. package/dist-cli/chunks/{chunk-RPQCGJI7.js → chunk-QLXTTGJD.js} +2 -2
  39. package/dist-cli/chunks/{chunk-BHPSNVNR.js → chunk-QMUNA6VQ.js} +3 -3
  40. package/dist-cli/chunks/{chunk-UJBMEBQF.js → chunk-S5ZKCSJZ.js} +1 -1
  41. package/dist-cli/chunks/chunk-TVCTN2EF.js +2 -0
  42. package/dist-cli/chunks/{chunk-BC357P2N.js → chunk-TXDUBB6W.js} +2 -2
  43. package/dist-cli/chunks/{chunk-MTXMNE75.js → chunk-U6TZCGUB.js} +1 -1
  44. package/dist-cli/chunks/{chunk-YL3KKAZR.js → chunk-UM7EEN26.js} +1 -1
  45. package/dist-cli/chunks/{chunk-OO3C2GYN.js → chunk-UNM45I7B.js} +2 -2
  46. package/dist-cli/chunks/{chunk-FXB2ETM3.js → chunk-UOBTAOWL.js} +2 -2
  47. package/dist-cli/chunks/chunk-VH4VPAMR.js +1 -0
  48. package/dist-cli/chunks/{chunk-HEOJB2Q7.js → chunk-XAVQLMY7.js} +2 -2
  49. package/dist-cli/chunks/{chunk-TTCMDOP6.js → chunk-XMZJQZFB.js} +2 -2
  50. package/dist-cli/chunks/{chunk-QGPM7UTZ.js → chunk-XOK53FNY.js} +1 -1
  51. package/dist-cli/chunks/{chunk-DYNVMRON.js → chunk-YQM3RWNV.js} +2 -2
  52. package/dist-cli/chunks/{chunk-ROINTL2P.js → chunk-Z5WZKI7J.js} +2 -2
  53. package/dist-cli/chunks/chunk-ZANDDBFJ.js +1 -0
  54. package/dist-cli/chunks/{chunk-NNRWRRI5.js → chunk-ZFDBEITH.js} +3 -3
  55. package/dist-cli/chunks/cli-version-EOI7UVCS.js +2 -0
  56. package/dist-cli/chunks/{compat-3BWLNHPY.js → compat-DZRWNMC2.js} +3 -3
  57. package/dist-cli/chunks/{config-H7YEVE5J.js → config-JNO26BKX.js} +2 -2
  58. package/dist-cli/chunks/{control-ZFU3T2LE.js → control-GWQ44GVR.js} +2 -2
  59. package/dist-cli/chunks/{cpu-profile-XYCDA5GM.js → cpu-profile-2VSK3E45.js} +2 -2
  60. package/dist-cli/chunks/{daemon-TBN5MRVC.js → daemon-QMFDDXFF.js} +2 -2
  61. package/dist-cli/chunks/{debug-2WAJZ4C7.js → debug-Q3K4TXLC.js} +3 -3
  62. package/dist-cli/chunks/demo-app-registry-LDTURANL.js +2 -0
  63. package/dist-cli/chunks/{detox-JLJPKRA3.js → detox-TX4AUV2W.js} +2 -2
  64. package/dist-cli/chunks/{device-WPWC2KSY.js → device-E5RRT67Y.js} +2 -2
  65. package/dist-cli/chunks/{diagnose-PYBIEZFD.js → diagnose-CGHRCXKF.js} +2 -2
  66. package/dist-cli/chunks/drivers-WF5OT6EA.js +2 -0
  67. package/dist-cli/chunks/{electron-ZW7YMV37.js → electron-YSY7HZBI.js} +3 -3
  68. package/dist-cli/chunks/flow-PV4WV3DZ.js +2 -0
  69. package/dist-cli/chunks/help-RZ2M7P7U.js +2 -0
  70. package/dist-cli/chunks/{hints-3YQNXM27.js → hints-V7M7GKXL.js} +2 -2
  71. package/dist-cli/chunks/{home-paths-SBGRHOZC.js → home-paths-KYTBCLPQ.js} +2 -2
  72. package/dist-cli/chunks/{inspect-YXTS4PR6.js → inspect-ZUYLUCRJ.js} +3 -3
  73. package/dist-cli/chunks/install-XLJ4CJUN.js +2 -0
  74. package/dist-cli/chunks/{install-desktop-27SPMPUV.js → install-desktop-HKLVDL7Q.js} +3 -3
  75. package/dist-cli/chunks/{keys-Y7OJXBGI.js → keys-QJDWORM5.js} +2 -2
  76. package/dist-cli/chunks/{launch-OUG2GFLO.js → launch-CBIYGOV7.js} +3 -3
  77. package/dist-cli/chunks/{login-XXJQHPWA.js → login-II2EWFHY.js} +4 -4
  78. package/dist-cli/chunks/{logout-FHJ26UTW.js → logout-E52753SB.js} +2 -2
  79. package/dist-cli/chunks/{maestro-P4ZVR2I4.js → maestro-DUIODHYF.js} +2 -2
  80. package/dist-cli/chunks/{preview-6ONBLQBI.js → preview-LSVZXF7S.js} +2 -2
  81. package/dist-cli/chunks/{profile-LQOEBIPK.js → profile-2LUO56EX.js} +2 -2
  82. package/dist-cli/chunks/{react-R4KJVWDA.js → react-KPNHGOQ3.js} +2 -2
  83. package/dist-cli/chunks/{record-OBJJDTFN.js → record-LLNZNJSY.js} +2 -2
  84. package/dist-cli/chunks/runtime-B3RQF5NL.js +2 -0
  85. package/dist-cli/chunks/{runtime-delivery-LEU6ABXJ.js → runtime-delivery-A2PZCEPU.js} +2 -2
  86. package/dist-cli/chunks/{screenshot-AKU27ZTJ.js → screenshot-OEIH2ETO.js} +2 -2
  87. package/dist-cli/chunks/{screenshot-mode-XPJM2SRF.js → screenshot-mode-3TDLGZPT.js} +2 -2
  88. package/dist-cli/chunks/{screenshots-SJY4LH2Q.js → screenshots-GCJW22B5.js} +2 -2
  89. package/dist-cli/chunks/{server-2SSM3BKA.js → server-CBH2UYLT.js} +3 -3
  90. package/dist-cli/chunks/setup-repo-U7XMVCQA.js +2 -0
  91. package/dist-cli/chunks/{skills-C7ZVO6AF.js → skills-DVPCRUUO.js} +2 -2
  92. package/dist-cli/chunks/{start-5BFFCFOT.js → start-2T5QRVL2.js} +4 -4
  93. package/dist-cli/chunks/store-WIQ4ZE4Z.js +2 -0
  94. package/dist-cli/chunks/telemetry-2XPV6PVU.js +2 -0
  95. package/dist-cli/chunks/{test-5YTOB2K7.js → test-ZGUHV3XE.js} +3 -3
  96. package/dist-cli/chunks/{three-mode-ZTVDFRRN.js → three-mode-3BUTKBTR.js} +2 -2
  97. package/dist-cli/chunks/{timeline-ZSHW5COY.js → timeline-WS2FXPG2.js} +2 -2
  98. package/dist-cli/chunks/{upgrade-DU2VLCLD.js → upgrade-FFTCNLCI.js} +2 -2
  99. package/dist-cli/chunks/upload-JQMTDQMQ.js +2 -0
  100. package/dist-cli/chunks/{version-G7MFHWDO.js → version-OQOFXNMZ.js} +2 -2
  101. package/dist-cli/chunks/web-Y2ZMUXP4.js +2 -0
  102. package/dist-cli/chunks/{what-happened-ZYPPAPQM.js → what-happened-5A2RUC6V.js} +2 -2
  103. package/dist-cli/chunks/{whoami-U4JDM3X4.js → whoami-ZVM5A34Z.js} +2 -2
  104. package/dist-lib/agent-daemon-client.cjs +1 -1
  105. package/dist-lib/agent-events.cjs +1 -1
  106. package/dist-lib/agent-sessions.cjs +1 -1
  107. package/dist-lib/attached-projects.cjs +1 -1
  108. package/dist-lib/auth/shared-session.cjs +1 -1
  109. package/dist-lib/backend-origin.cjs +1 -1
  110. package/dist-lib/beta.cjs +1 -1
  111. package/dist-lib/beta.mjs +1 -1
  112. package/dist-lib/bridge-constants.cjs +1 -1
  113. package/dist-lib/cli-constants.cjs +1 -1
  114. package/dist-lib/config.cjs +1 -1
  115. package/dist-lib/detox/index.cjs +169 -11
  116. package/dist-lib/dev-bundle-resolution.cjs +30 -1
  117. package/dist-lib/home-paths.cjs +1 -1
  118. package/dist-lib/host/bridge-host.cjs +1 -1
  119. package/dist-lib/host/fetch-proxy-handler.cjs +1 -1
  120. package/dist-lib/host/fetch-proxy-overrides.cjs +1 -1
  121. package/dist-lib/host/fetch-proxy-overrides.mjs +1 -1
  122. package/dist-lib/host/websocket-proxy.cjs +1 -1
  123. package/dist-lib/index.cjs +1 -1
  124. package/dist-lib/metro.cjs +1 -1
  125. package/dist-lib/profiles.cjs +1 -1
  126. package/dist-lib/render-mode.cjs +1 -1
  127. package/dist-lib/scripts/demo-app-registry.cjs +1 -1
  128. package/dist-lib/scripts/dev-server-scanner.cjs +1 -1
  129. package/dist-lib/sdk.cjs +1 -1
  130. package/dist-lib/sdk.mjs +1 -1
  131. package/dist-lib/skills.cjs +5 -5
  132. package/dist-lib/vite.cjs +1 -1
  133. package/package.json +1 -1
  134. package/src/dev-bundle-resolution.ts +64 -0
  135. package/dist-cli/chunks/auto-bootstrap-LTOQSXRM.js +0 -2
  136. package/dist-cli/chunks/beta-Y2OJHTRQ.js +0 -2
  137. package/dist-cli/chunks/chunk-7SYFZZK3.js +0 -2
  138. package/dist-cli/chunks/chunk-AEYD4ODQ.js +0 -1
  139. package/dist-cli/chunks/chunk-D3OLBBEO.js +0 -1
  140. package/dist-cli/chunks/chunk-ESQVUOW2.js +0 -13
  141. package/dist-cli/chunks/chunk-YP4W6KI5.js +0 -1
  142. package/dist-cli/chunks/cli-version-RQJHNNYX.js +0 -2
  143. package/dist-cli/chunks/demo-app-registry-JXOXYWFT.js +0 -2
  144. package/dist-cli/chunks/drivers-XPCQOVAR.js +0 -2
  145. package/dist-cli/chunks/flow-SWXVIYST.js +0 -2
  146. package/dist-cli/chunks/help-HAITGXVU.js +0 -2
  147. package/dist-cli/chunks/install-VFUIM3QH.js +0 -2
  148. package/dist-cli/chunks/runtime-6JVXVZ4K.js +0 -2
  149. package/dist-cli/chunks/setup-repo-X6WRLPI5.js +0 -2
  150. package/dist-cli/chunks/store-5FCKCDEL.js +0 -2
  151. package/dist-cli/chunks/telemetry-N6DCFUGB.js +0 -2
  152. package/dist-cli/chunks/upload-QLV4POAH.js +0 -2
  153. package/dist-cli/chunks/web-66TKNXN5.js +0 -2
@@ -1,5 +1,5 @@
1
- /*! sootsim v0.1.133 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{B as T,C as A,D as y,O as _,P as b,Q as S}from"./chunk-PZSY7LCJ.js";import{c as N,e as F}from"./chunk-2OST4PMS.js";import{b as k}from"./chunk-THJDQ2EB.js";import"./chunk-QGPM7UTZ.js";import"./chunk-YL3KKAZR.js";import"./chunk-Q3GCZEPC.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=N(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.135 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
+ import{B as T,C as A,D as y,O as _,P as b,Q as S}from"./chunk-PVWYEMAR.js";import{c as N,e as F}from"./chunk-EKZJFBGU.js";import{b as k}from"./chunk-7TWZYT4A.js";import"./chunk-XOK53FNY.js";import"./chunk-UM7EEN26.js";import"./chunk-45Z6VTEC.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=N(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,2 +1,2 @@
1
- /*! sootsim v0.1.133 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{d as i}from"./chunk-R4PCQVBM.js";import{d as n}from"./chunk-XEGM2NRW.js";import"./chunk-YL3KKAZR.js";import"./chunk-Q3GCZEPC.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.135 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
+ import{d as i}from"./chunk-7WF23EDW.js";import{d as n}from"./chunk-5PB5X45Q.js";import"./chunk-UM7EEN26.js";import"./chunk-45Z6VTEC.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.133 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.135 | (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.133 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.135 | (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.133 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.135 | (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.133 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.135 | (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.133 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.135 | (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.133 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.135 | (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.133 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.135 | (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.133 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.135 | (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.133 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.135 | (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.133 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.135 | (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.133 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.135 | (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.133 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.135 | (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;
@@ -218,7 +218,7 @@ async function dragScrollNode(page, node, pixels, direction) {
218
218
  }
219
219
  const startPage = await sootsimToPage(page, startSootX, startSootY);
220
220
  const endPage = await sootsimToPage(page, endSootX, endSootY);
221
- const steps = 12;
221
+ const steps = Math.max(16, Math.ceil(pixels / 8));
222
222
  await page.mouse.move(startPage.x, startPage.y);
223
223
  await page.mouse.down();
224
224
  await page.waitForTimeout(20);
@@ -226,7 +226,7 @@ async function dragScrollNode(page, node, pixels, direction) {
226
226
  const dy = (endPage.y - startPage.y) / steps;
227
227
  for (let i = 1; i <= steps; i++) {
228
228
  await page.mouse.move(startPage.x + dx * i, startPage.y + dy * i);
229
- await page.waitForTimeout(16);
229
+ await page.waitForTimeout(24);
230
230
  }
231
231
  await page.mouse.up();
232
232
  await page.waitForTimeout(180);
@@ -821,6 +821,145 @@ async function waitForSootsimTree(page, timeout = 3e4) {
821
821
  throw await describeSootsimBridgeFailure(page, error);
822
822
  }
823
823
  }
824
+ async function waitForSootsimSurfaceMetrics(page, timeout = 3e4) {
825
+ const deadline = Date.now() + timeout;
826
+ let lastSnapshot = null;
827
+ while (Date.now() < deadline) {
828
+ lastSnapshot = await page.evaluate(async () => {
829
+ const metricsWindow = (value) => {
830
+ if (!value || typeof value !== "object") return null;
831
+ const windowValue = value.window;
832
+ if (!windowValue || typeof windowValue !== "object") return null;
833
+ return windowValue;
834
+ };
835
+ const snapshot = await window.__sootsimTest?.getSurfaceMetricsSnapshot?.();
836
+ const windowMetrics = metricsWindow(snapshot);
837
+ const width = windowMetrics?.width;
838
+ const height = windowMetrics?.height;
839
+ if (typeof width === "number" && typeof height === "number" && width > 0 && height > 0) {
840
+ return { ready: true };
841
+ }
842
+ return { ready: false, snapshot };
843
+ });
844
+ if (lastSnapshot && typeof lastSnapshot === "object" && lastSnapshot.ready) {
845
+ return;
846
+ }
847
+ await page.waitForTimeout(50);
848
+ }
849
+ throw new Error(
850
+ `timed out waiting for sootsim surface metrics: ${JSON.stringify(lastSnapshot)}`
851
+ );
852
+ }
853
+ async function waitForSootsimShellReady(page, timeout = 3e4) {
854
+ try {
855
+ await page.evaluate(async (timeoutMs) => {
856
+ const start = Date.now();
857
+ const deadline = start + timeoutMs;
858
+ const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
859
+ const remaining = () => Math.max(1, deadline - Date.now());
860
+ const withTimeout = async (label, promise) => {
861
+ let timer = null;
862
+ try {
863
+ await Promise.race([
864
+ promise,
865
+ new Promise((_, reject) => {
866
+ timer = setTimeout(
867
+ () => reject(new Error(`${label} timed out after ${timeoutMs}ms`)),
868
+ remaining()
869
+ );
870
+ })
871
+ ]);
872
+ } finally {
873
+ if (timer) clearTimeout(timer);
874
+ }
875
+ };
876
+ const isTenantOnly = new URL(window.location.href).searchParams.get("renderMode") === "tenant-only";
877
+ let shellHost = null;
878
+ while (Date.now() < deadline) {
879
+ const candidate = window.SootSim?.bridges?.shellHost;
880
+ if (candidate || isTenantOnly) {
881
+ shellHost = candidate ?? null;
882
+ break;
883
+ }
884
+ await sleep(25);
885
+ }
886
+ if (!shellHost) {
887
+ if (isTenantOnly) return;
888
+ throw new Error(`sootsim shell host unavailable after ${timeoutMs}ms`);
889
+ }
890
+ if (shellHost.ready && typeof shellHost.ready.then === "function") {
891
+ await withTimeout("sootsim shell ready", shellHost.ready);
892
+ }
893
+ if (shellHost.firstContentPainted && typeof shellHost.firstContentPainted.then === "function") {
894
+ await withTimeout(
895
+ "sootsim shell first content paint",
896
+ shellHost.firstContentPainted
897
+ );
898
+ }
899
+ const waitForScreenTransitions = window.__sootsimTest?.waitForScreenTransitions;
900
+ if (typeof waitForScreenTransitions === "function") {
901
+ const transitionResult = await waitForScreenTransitions({
902
+ timeoutMs: Math.min(remaining(), 3e3),
903
+ settleMs: 64,
904
+ startWindowMs: 700
905
+ });
906
+ if (transitionResult?.timedOut === true) {
907
+ throw new Error(
908
+ `sootsim launch transitions timed out: ${JSON.stringify(transitionResult)}`
909
+ );
910
+ }
911
+ }
912
+ }, timeout);
913
+ } catch (error) {
914
+ throw await describeSootsimBridgeFailure(page, error);
915
+ }
916
+ }
917
+ async function waitForSootsimWorkletsIdle(page, timeout = 3e3) {
918
+ const result = await page.evaluate(
919
+ async ({ timeout: timeout2 }) => {
920
+ const getPeerStats = window.__sootsimTest?.getPeerStats;
921
+ if (typeof getPeerStats !== "function") {
922
+ return { settled: true, skipped: true };
923
+ }
924
+ const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
925
+ const readStats = () => Promise.race([
926
+ getPeerStats(false),
927
+ new Promise((resolve) => setTimeout(() => resolve(null), 250))
928
+ ]);
929
+ const start = Date.now();
930
+ const deadline = start + timeout2;
931
+ const requiredStableMs = 120;
932
+ let stableSince = null;
933
+ let lastPending = 0;
934
+ await sleep(0);
935
+ while (Date.now() < deadline) {
936
+ const stats = await readStats();
937
+ const pending = stats && typeof stats === "object" && typeof stats.pendingRunWorklets === "number" ? stats.pendingRunWorklets : 0;
938
+ lastPending = pending;
939
+ if (pending === 0) {
940
+ stableSince ??= Date.now();
941
+ if (Date.now() - stableSince >= requiredStableMs) {
942
+ return { settled: true, elapsed: Date.now() - start, pending };
943
+ }
944
+ } else {
945
+ stableSince = null;
946
+ }
947
+ await sleep(25);
948
+ }
949
+ return {
950
+ settled: false,
951
+ elapsed: Date.now() - start,
952
+ pending: lastPending
953
+ };
954
+ },
955
+ { timeout }
956
+ );
957
+ if (!result?.settled) {
958
+ throw new Error(
959
+ `sootsim worklet runtime did not settle after ${result?.elapsed ?? timeout}ms (pending=${result?.pending ?? "unknown"})`
960
+ );
961
+ }
962
+ }
824
963
  async function closeContext() {
825
964
  const context = _context;
826
965
  _context = null;
@@ -960,13 +1099,16 @@ function getNodeCenter(nodeInfo) {
960
1099
  }
961
1100
  async function getDefaultTapPoint(page, nodeInfo) {
962
1101
  const center = getNodeCenter(nodeInfo);
963
- const viewport = await readSootsimInteractiveViewport(page);
964
1102
  const frame = nodeInfo.visibleFrame ?? {
965
1103
  x: nodeInfo.absolutePosition?.x ?? nodeInfo.layout?.x ?? 0,
966
1104
  y: nodeInfo.absolutePosition?.y ?? nodeInfo.layout?.y ?? 0,
967
1105
  width: nodeInfo.layout?.width ?? 0,
968
1106
  height: nodeInfo.layout?.height ?? 0
969
1107
  };
1108
+ const fullFrameTolerance = 0.5;
1109
+ const fullyVisible = typeof nodeInfo.absolutePosition?.x === "number" && typeof nodeInfo.absolutePosition?.y === "number" && typeof nodeInfo.layout?.width === "number" && typeof nodeInfo.layout?.height === "number" && Math.abs(frame.x - nodeInfo.absolutePosition.x) <= fullFrameTolerance && Math.abs(frame.y - nodeInfo.absolutePosition.y) <= fullFrameTolerance && frame.width >= nodeInfo.layout.width - fullFrameTolerance && frame.height >= nodeInfo.layout.height - fullFrameTolerance;
1110
+ if (fullyVisible) return center;
1111
+ const viewport = await readSootsimInteractiveViewport(page);
970
1112
  const left = Math.max(0, frame.x);
971
1113
  const top = Math.max(0, frame.y);
972
1114
  const right = Math.min(viewport.width, frame.x + frame.width);
@@ -1103,6 +1245,7 @@ function createSootElement(matcher) {
1103
1245
  _matcher: matcher,
1104
1246
  async tap(point) {
1105
1247
  const page = getPage();
1248
+ await waitForSootsimWorkletsIdle(page, 3e3);
1106
1249
  const node = await findNodeByMatcher(matcher);
1107
1250
  if (!node) throw new Error(`element not found for tap: ${JSON.stringify(matcher)}`);
1108
1251
  const defaultPoint = point ? null : await getDefaultTapPoint(page, node);
@@ -1152,11 +1295,19 @@ function createSootElement(matcher) {
1152
1295
  if (!node)
1153
1296
  throw new Error(`element not found for longPress: ${JSON.stringify(matcher)}`);
1154
1297
  const center = getNodeCenter(node);
1155
- const pageCoords = await sootsimToPage(page, center.x, center.y);
1156
- await page.mouse.move(pageCoords.x, pageCoords.y);
1157
- await page.mouse.down();
1158
- await page.waitForTimeout(duration);
1159
- await page.mouse.up();
1298
+ await page.evaluate(
1299
+ async ({ duration: duration2, x, y }) => {
1300
+ const longPress = window.SootSim?.bridges?.interact?.longPress;
1301
+ if (typeof longPress !== "function") {
1302
+ throw new Error("sootsim longPress bridge is not installed");
1303
+ }
1304
+ const hit = await longPress(x, y, duration2);
1305
+ if (!hit) {
1306
+ throw new Error(`sootsim longPress missed at ${x},${y}`);
1307
+ }
1308
+ },
1309
+ { duration, x: center.x, y: center.y }
1310
+ );
1160
1311
  await page.waitForTimeout(50);
1161
1312
  },
1162
1313
  async longPressAndDrag(duration, normalizedStartX, normalizedStartY, targetElement, normalizedEndX, normalizedEndY, speed = "fast", holdDuration = 0) {
@@ -1429,15 +1580,19 @@ var device = {
1429
1580
  device._currentUrl = url;
1430
1581
  await _page.goto(url, { waitUntil: "load", timeout: 3e4 });
1431
1582
  await waitForSootsimTree(_page, 3e4);
1583
+ await waitForSootsimSurfaceMetrics(_page, 3e4);
1584
+ await waitForSootsimShellReady(_page, 3e4);
1585
+ await waitForSootsimWorkletsIdle(_page, 3e3);
1432
1586
  device._lastReadyAtMs = Date.now();
1433
- await _page.waitForTimeout(500);
1434
1587
  },
1435
1588
  _lastReadyAtMs: 0,
1436
1589
  async reloadReactNative() {
1437
1590
  const page = getPage();
1438
1591
  await page.reload({ waitUntil: "load", timeout: 3e4 });
1439
1592
  await waitForSootsimTree(page, 3e4);
1440
- await page.waitForTimeout(500);
1593
+ await waitForSootsimSurfaceMetrics(page, 3e4);
1594
+ await waitForSootsimShellReady(page, 3e4);
1595
+ await waitForSootsimWorkletsIdle(page, 3e3);
1441
1596
  },
1442
1597
  async terminateApp() {
1443
1598
  await closeBrowser();
@@ -1450,6 +1605,9 @@ var device = {
1450
1605
  const page = getPage();
1451
1606
  await page.goto(url.url, { waitUntil: "load", timeout: 3e4 });
1452
1607
  await waitForSootsimTree(page, 1e4);
1608
+ await waitForSootsimSurfaceMetrics(page, 1e4);
1609
+ await waitForSootsimShellReady(page, 1e4);
1610
+ await waitForSootsimWorkletsIdle(page, 3e3);
1453
1611
  },
1454
1612
  async takeScreenshot(name) {
1455
1613
  return writeSootsimScreenshot(name);
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.133 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.135 | (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;
@@ -108,8 +108,37 @@ function isBaseServerUrl(url) {
108
108
  const path = url.pathname || "/";
109
109
  return (path === "/" || path === "") && !url.search && !url.hash;
110
110
  }
111
+ async function resolvePortViaServerScan(port) {
112
+ try {
113
+ const res = await fetch("/__server-scan", { cache: "no-store" });
114
+ if (!res.ok) return null;
115
+ if (!(res.headers.get("content-type") || "").toLowerCase().includes("json"))
116
+ return null;
117
+ const servers = await res.json();
118
+ if (!Array.isArray(servers)) return null;
119
+ const match = servers.find(
120
+ (s) => !!s && typeof s === "object" && s.port === port && typeof s.bundleUrl === "string"
121
+ );
122
+ if (!match) return null;
123
+ return {
124
+ bundleUrl: match.bundleUrl,
125
+ port,
126
+ framework: typeof match.framework === "string" ? match.framework : "unknown",
127
+ projectName: typeof match.projectName === "string" ? match.projectName : void 0
128
+ };
129
+ } catch {
130
+ return null;
131
+ }
132
+ }
111
133
  async function probeBaseUrlBundle(baseUrl, port) {
112
134
  const normalizedBaseUrl = baseUrl.replace(/\/+$/, "");
135
+ try {
136
+ if (isLoopbackHost(new URL(normalizedBaseUrl).hostname)) {
137
+ const viaScan = await resolvePortViaServerScan(port);
138
+ if (viaScan) return viaScan;
139
+ }
140
+ } catch {
141
+ }
113
142
  try {
114
143
  const manifestRes = await fetchDevProbe(`${normalizedBaseUrl}/`, {
115
144
  headers: { "expo-platform": "ios" }
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.133 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.135 | (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.133 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.135 | (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.133 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.135 | (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.133 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.135 | (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.133 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.135 | (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.133 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.135 | (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.133 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.135 | (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.133 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.135 | (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.133 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.135 | (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.133 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.135 | (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.133 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.135 | (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.133 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.135 | (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.133 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.135 | (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.133 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.135 | (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.133 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.135 | (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;
@@ -117,8 +117,8 @@ var init_registry = __esm({
117
117
  range: ">=4.0.0",
118
118
  coverage: 0.87,
119
119
  note: "screen container, stack, header config, search bar, navigation props",
120
- working: "Screen, ScreenContainer, ScreenStack, Android modal/pageSheet push fallback, Android statusBarHidden/statusBarStyle/navigationBarHidden traits, push/pop slide, zoom/fade/fade_from_bottom transitions, edge swipe-back, parallax behind-screen, large title collapse, header (back button, inline/large title, custom left/center/right/search bar subviews, crossfade), useHeaderHeight, useTransitionProgress, FullWindowOverlay, SearchBar, Tabs.Host/Screen, lifecycle callbacks (onAppear/onDisappear/onWillAppear/onWillDisappear), onDismissed",
121
- missing: "freezeEnabled/enableFreeze (always false), statusBarColor/navigationBarColor/navigationBarTranslucent ignored, replaceAnimation differentiation, formSheet detent fidelity, integrated search bar placements"
120
+ working: "Screen, ScreenContainer, ScreenStack, enableFreeze/freezeEnabled with delayed React freeze, Android modal/pageSheet push fallback, Android statusBarHidden/statusBarStyle/navigationBarHidden traits, push/pop slide, zoom/fade/fade_from_bottom transitions, edge swipe-back, parallax behind-screen, large title collapse, header (back button, inline/large title, custom left/center/right/search bar subviews, crossfade), useHeaderHeight, useTransitionProgress, FullWindowOverlay, SearchBar, Tabs.Host/Screen, lifecycle callbacks (onAppear/onDisappear/onWillAppear/onWillDisappear), onDismissed",
121
+ missing: "statusBarColor/navigationBarColor/navigationBarTranslucent ignored, replaceAnimation differentiation, formSheet detent fidelity, integrated search bar placements"
122
122
  }
123
123
  ]
124
124
  },
@@ -3478,8 +3478,8 @@ var init_registry = __esm({
3478
3478
  range: ">=6.0.0",
3479
3479
  coverage: 0.9,
3480
3480
  note: "pure JS wrapper around react-native-screens (stubbed); push/pop, header, modals, large titles all flow through screens stub",
3481
- working: "createNativeStackNavigator, Screen, Group, Navigator, header config (title, back button, large title, search bar, custom left/right), Android modal/pageSheet push fallback, modal/formSheet/pageSheet presentation, push/pop animations, gesture-driven back, useHeaderHeight",
3482
- missing: "fidelity bound by react-native-screens stub \u2014 formSheet detent fidelity, search bar placements, freezeOnBlur"
3481
+ working: "createNativeStackNavigator, Screen, Group, Navigator, header config (title, back button, large title, search bar, custom left/right), Android modal/pageSheet push fallback, modal/formSheet/pageSheet presentation, push/pop animations, gesture-driven back, freezeOnBlur via react-native-screens, useHeaderHeight",
3482
+ missing: "fidelity bound by react-native-screens stub \u2014 formSheet detent fidelity, search bar placements"
3483
3483
  }
3484
3484
  ]
3485
3485
  },
package/dist-lib/vite.cjs CHANGED
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.133 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.135 | (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.133",
3
+ "version": "0.1.135",
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",
@@ -63,12 +63,76 @@ function isBaseServerUrl(url: URL) {
63
63
  return (path === '/' || path === '') && !url.search && !url.hash
64
64
  }
65
65
 
66
+ // resolve a loopback dev-server port through the SAME server-side scanner the
67
+ // dev-server list uses (`/__server-scan`), so an explicit port (`/rn/<port>`, a
68
+ // typed port) gets the EXACT manifest `launchAsset.url` the list resolves —
69
+ // byte-identical, one resolver.
70
+ //
71
+ // why this exists: in a browser/worker the direct manifest probe below is
72
+ // cross-origin (shell on :5173, dev server on :<port>), and a dev server
73
+ // answers a cross-origin `GET /` with its SSR HTML, not the expo manifest. so
74
+ // the manifest branch silently fails (`.json()` throws on HTML) and the probe
75
+ // falls back to a generic `/index.bundle` — a DIFFERENT metro entry point than
76
+ // the manifest's `metro-entry.bundle`, which makes metro build the same app
77
+ // twice. the scanner runs server-side (same-origin node fetch, sends the
78
+ // expo-platform header) and reads `launchAsset.url` correctly.
79
+ //
80
+ // env-agnostic by design: it just attempts `/__server-scan` and lets the result
81
+ // decide. in the tenant worker (which has no `location`) the patched fetch
82
+ // resolves the relative path to the shell origin and returns the scan json. in a
83
+ // node/bun CLI a relative-URL fetch with no base throws → null → the direct probe
84
+ // runs (correct there, since node can read the cross-origin manifest). in prod
85
+ // the path SPA-falls-back to HTML → the json content-type guard returns null →
86
+ // direct probe. so there is exactly one resolver per environment, no env sniff.
87
+ async function resolvePortViaServerScan(port: number): Promise<ResolvedDevBundle | null> {
88
+ try {
89
+ const res = await fetch('/__server-scan', { cache: 'no-store' })
90
+ if (!res.ok) return null
91
+ if (!(res.headers.get('content-type') || '').toLowerCase().includes('json'))
92
+ return null
93
+ const servers: unknown = await res.json()
94
+ if (!Array.isArray(servers)) return null
95
+ const match = servers.find(
96
+ (
97
+ s,
98
+ ): s is {
99
+ port: number
100
+ bundleUrl: string
101
+ framework?: string
102
+ projectName?: string
103
+ } =>
104
+ !!s &&
105
+ typeof s === 'object' &&
106
+ (s as { port?: unknown }).port === port &&
107
+ typeof (s as { bundleUrl?: unknown }).bundleUrl === 'string',
108
+ )
109
+ if (!match) return null
110
+ return {
111
+ bundleUrl: match.bundleUrl,
112
+ port,
113
+ framework: typeof match.framework === 'string' ? match.framework : 'unknown',
114
+ projectName: typeof match.projectName === 'string' ? match.projectName : undefined,
115
+ }
116
+ } catch {
117
+ return null
118
+ }
119
+ }
120
+
66
121
  async function probeBaseUrlBundle(
67
122
  baseUrl: string,
68
123
  port: number,
69
124
  ): Promise<ResolvedDevBundle | null> {
70
125
  const normalizedBaseUrl = baseUrl.replace(/\/+$/, '')
71
126
 
127
+ // browser/worker loopback targets resolve through the server-side scanner so
128
+ // they match the dev-server list exactly — see resolvePortViaServerScan.
129
+ try {
130
+ if (isLoopbackHost(new URL(normalizedBaseUrl).hostname)) {
131
+ const viaScan = await resolvePortViaServerScan(port)
132
+ if (viaScan) return viaScan
133
+ }
134
+ } catch {}
135
+
72
136
  try {
73
137
  const manifestRes = await fetchDevProbe(`${normalizedBaseUrl}/`, {
74
138
  headers: { 'expo-platform': 'ios' },
@@ -1,2 +0,0 @@
1
- /*! sootsim v0.1.133 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{a,b,c,d}from"./chunk-NNRWRRI5.js";import"./chunk-2OST4PMS.js";import"./chunk-THJDQ2EB.js";import"./chunk-QGPM7UTZ.js";import"./chunk-YL3KKAZR.js";import"./chunk-Q3GCZEPC.js";export{c as ensureDaemonRunning,a as ensureRuntimeInstalled,d as ensureSootsimReady,b as resolveBootstrapPort};
@@ -1,2 +0,0 @@
1
- /*! sootsim v0.1.133 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{a,b,c,d,e}from"./chunk-VO3QIOCT.js";import"./chunk-Q3GCZEPC.js";export{e as BETA_ASK_HEADLINE,c as BETA_LABEL,d as BETA_TAGLINE,b as BETA_VERSION_TARGET,a as IS_BETA};