sootsim 0.1.148 → 0.1.150

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/dist-cli/bin.js +3 -3
  2. package/dist-cli/chunks/{agent-A5AQOHSI.js → agent-LSSBQD6J.js} +2 -2
  3. package/dist-cli/chunks/{agent-wrapper-S6AUOIXU.js → agent-wrapper-HYZ3VS4M.js} +2 -2
  4. package/dist-cli/chunks/{app-fonts-MQDZ55OI.js → app-fonts-XXHCZZVE.js} +2 -2
  5. package/dist-cli/chunks/{assert-USJNKN7R.js → assert-7I2ANKDG.js} +2 -2
  6. package/dist-cli/chunks/auto-bootstrap-YJM7QYAO.js +2 -0
  7. package/dist-cli/chunks/beta-EQOZMXP3.js +2 -0
  8. package/dist-cli/chunks/{camera-C4SKSA76.js → camera-4D7T4PZW.js} +2 -2
  9. package/dist-cli/chunks/{chunk-BCWW5RSQ.js → chunk-36L4ANT2.js} +1 -1
  10. package/dist-cli/chunks/{chunk-AXLTLDHE.js → chunk-3CENW2HN.js} +2 -2
  11. package/dist-cli/chunks/{chunk-A57WJDB2.js → chunk-3J5I64W6.js} +2 -2
  12. package/dist-cli/chunks/{chunk-BCRYE4YH.js → chunk-3K237XV5.js} +1 -1
  13. package/dist-cli/chunks/{chunk-KZ6AQHHA.js → chunk-3MWCUIK4.js} +2 -2
  14. package/dist-cli/chunks/{chunk-BWE6H36P.js → chunk-3RRDJNXM.js} +2 -2
  15. package/dist-cli/chunks/{chunk-TWOGFNQ7.js → chunk-45XLWBNT.js} +1 -1
  16. package/dist-cli/chunks/{chunk-NOBEILT5.js → chunk-5Q464MLB.js} +1 -1
  17. package/dist-cli/chunks/{chunk-ZNYPWEMX.js → chunk-65GDTEX7.js} +3 -3
  18. package/dist-cli/chunks/{chunk-YXZD545S.js → chunk-6SXJQK5R.js} +3 -3
  19. package/dist-cli/chunks/{chunk-PMM6MNCR.js → chunk-6UA5JZ4E.js} +2 -2
  20. package/dist-cli/chunks/{chunk-GXHVONDU.js → chunk-7YEISEQ2.js} +2 -2
  21. package/dist-cli/chunks/chunk-B43JOK5N.js +119 -0
  22. package/dist-cli/chunks/{chunk-IYRFX6KX.js → chunk-BFGPENAX.js} +1 -1
  23. package/dist-cli/chunks/{chunk-T4FJHKU4.js → chunk-BUKMAGA6.js} +2 -2
  24. package/dist-cli/chunks/{chunk-NK6RKGX2.js → chunk-BWVKFTFM.js} +1 -1
  25. package/dist-cli/chunks/{chunk-TYHRA7FX.js → chunk-CDLPRRMH.js} +2 -2
  26. package/dist-cli/chunks/{chunk-4T5Q2CUU.js → chunk-DNTULI35.js} +1 -1
  27. package/dist-cli/chunks/{chunk-G5BKDQGP.js → chunk-GXFEY4YV.js} +1 -1
  28. package/dist-cli/chunks/chunk-H5YQDCRA.js +1 -0
  29. package/dist-cli/chunks/{chunk-2SDVI2JB.js → chunk-IADOI73U.js} +2 -2
  30. package/dist-cli/chunks/{chunk-S3WEUJM3.js → chunk-IIJQQIAP.js} +2 -2
  31. package/dist-cli/chunks/{chunk-2OJ53PGA.js → chunk-JPWK6SFZ.js} +1 -1
  32. package/dist-cli/chunks/{chunk-ZMG6VGYA.js → chunk-KIDONDPE.js} +2 -2
  33. package/dist-cli/chunks/{chunk-U2U22DTV.js → chunk-KO4VABY3.js} +1 -1
  34. package/dist-cli/chunks/{chunk-23QZQBTT.js → chunk-LBZGVNQE.js} +1 -1
  35. package/dist-cli/chunks/{chunk-K4QZ6WX6.js → chunk-LPVQM4H7.js} +2 -2
  36. package/dist-cli/chunks/{chunk-XYFPDYAI.js → chunk-MFPT2P6I.js} +1 -1
  37. package/dist-cli/chunks/{chunk-F3MFOV7R.js → chunk-NHDDW7WP.js} +1 -1
  38. package/dist-cli/chunks/{chunk-4JVDEEJJ.js → chunk-NI2TIFUK.js} +1 -1
  39. package/dist-cli/chunks/{chunk-UK7GX57G.js → chunk-NISJ26VT.js} +7 -32
  40. package/dist-cli/chunks/{chunk-NMN4JPG2.js → chunk-NK5T7NYR.js} +1 -1
  41. package/dist-cli/chunks/{chunk-CN3ACF52.js → chunk-NSEXBZUW.js} +2 -2
  42. package/dist-cli/chunks/chunk-OYWQKX2A.js +2 -0
  43. package/dist-cli/chunks/{chunk-YONGHIDE.js → chunk-PFFELWZN.js} +2 -2
  44. package/dist-cli/chunks/{chunk-Y5E53BEN.js → chunk-PGAGVXOZ.js} +2 -2
  45. package/dist-cli/chunks/chunk-PHRIZLTZ.js +1 -0
  46. package/dist-cli/chunks/{chunk-7EBPIOTW.js → chunk-QIGU47UD.js} +1 -1
  47. package/dist-cli/chunks/{chunk-BDKC2GLL.js → chunk-VJRAGYZ6.js} +2 -2
  48. package/dist-cli/chunks/{chunk-474QHKFY.js → chunk-WNJOX4AQ.js} +2 -2
  49. package/dist-cli/chunks/chunk-WQF5CLFD.js +463 -0
  50. package/dist-cli/chunks/{chunk-IQVOFR7U.js → chunk-WZ5JKRIA.js} +2 -2
  51. package/dist-cli/chunks/chunk-YKWGZWBE.js +1 -0
  52. package/dist-cli/chunks/{chunk-XWUUFV45.js → chunk-YLSVHL4W.js} +2 -2
  53. package/dist-cli/chunks/{chunk-2B26APLC.js → chunk-YSN32GSR.js} +2 -2
  54. package/dist-cli/chunks/cli-version-QHAJ7OMR.js +2 -0
  55. package/dist-cli/chunks/{compat-7NMHHJXV.js → compat-EPSPO3GI.js} +3 -3
  56. package/dist-cli/chunks/{config-XKL7G2P3.js → config-7YGGAVYO.js} +2 -2
  57. package/dist-cli/chunks/{control-ZGD3NJES.js → control-TMFCD2NX.js} +2 -2
  58. package/dist-cli/chunks/{cpu-profile-ITFDFMIJ.js → cpu-profile-44YYVMOE.js} +2 -2
  59. package/dist-cli/chunks/{daemon-LHFCZTK6.js → daemon-4XLAN5CC.js} +2 -2
  60. package/dist-cli/chunks/{debug-C3X2PP3H.js → debug-MUYM2RWK.js} +3 -3
  61. package/dist-cli/chunks/{detox-ITXRK6EB.js → detox-NZJVVCA3.js} +2 -2
  62. package/dist-cli/chunks/{device-PBA26VX4.js → device-7HMHAQ2Q.js} +2 -2
  63. package/dist-cli/chunks/{diagnose-IWYHJJ7K.js → diagnose-FXVOC7LV.js} +2 -2
  64. package/dist-cli/chunks/drivers-GM6GJG7Q.js +2 -0
  65. package/dist-cli/chunks/{electron-6NRCOUQ3.js → electron-NKK6Z2F3.js} +3 -3
  66. package/dist-cli/chunks/flow-3E4SG5M7.js +2 -0
  67. package/dist-cli/chunks/help-VIYWVIUB.js +2 -0
  68. package/dist-cli/chunks/{hints-RBTS7PGP.js → hints-BLVNUKRX.js} +2 -2
  69. package/dist-cli/chunks/{home-paths-XKUYGHWD.js → home-paths-2QMRDV5X.js} +2 -2
  70. package/dist-cli/chunks/{inspect-7V5RQUJM.js → inspect-E6Z6N3PK.js} +34 -34
  71. package/dist-cli/chunks/install-U7C5NDWU.js +2 -0
  72. package/dist-cli/chunks/{install-desktop-MD77SEFP.js → install-desktop-O2E7FC4R.js} +3 -3
  73. package/dist-cli/chunks/{keys-LJMI7F3J.js → keys-GWXMM5CC.js} +2 -2
  74. package/dist-cli/chunks/{launch-RKUIUORR.js → launch-KWMHPASG.js} +3 -3
  75. package/dist-cli/chunks/{login-M7EXKPAT.js → login-AJO4L3ZI.js} +4 -4
  76. package/dist-cli/chunks/{logout-OVAZMIW5.js → logout-ZVGPEGAB.js} +2 -2
  77. package/dist-cli/chunks/{maestro-S4RQPFHB.js → maestro-4QX23OEI.js} +2 -2
  78. package/dist-cli/chunks/optional-demo-registry-LKCGAST6.js +2 -0
  79. package/dist-cli/chunks/{preview-QSIZ6KNZ.js → preview-CGBGA343.js} +2 -2
  80. package/dist-cli/chunks/{profile-6QQ3G5X7.js → profile-RLKDXLSK.js} +2 -2
  81. package/dist-cli/chunks/{react-HR7OT4NK.js → react-W2VGA55C.js} +2 -2
  82. package/dist-cli/chunks/{record-ZRSPOPCY.js → record-CF2HMY5Y.js} +2 -2
  83. package/dist-cli/chunks/runtime-A7DUL4IU.js +2 -0
  84. package/dist-cli/chunks/{runtime-delivery-MFVXZGIF.js → runtime-delivery-DZWXR2A5.js} +2 -2
  85. package/dist-cli/chunks/{screenshot-QNQ4TJ3I.js → screenshot-YV7USPJA.js} +2 -2
  86. package/dist-cli/chunks/{screenshot-mode-27K7PUTV.js → screenshot-mode-V27UKIG6.js} +2 -2
  87. package/dist-cli/chunks/{screenshots-LH7R6LV3.js → screenshots-BUOMYKKW.js} +2 -2
  88. package/dist-cli/chunks/{server-QQRPB6AJ.js → server-6EZSHZV3.js} +3 -3
  89. package/dist-cli/chunks/setup-repo-MCAZJVL5.js +2 -0
  90. package/dist-cli/chunks/{skills-KNFHQD77.js → skills-NXDCB76R.js} +2 -2
  91. package/dist-cli/chunks/{slides-GWMFQQAF.js → slides-6LF76Q4J.js} +2 -2
  92. package/dist-cli/chunks/{start-4INDW3QD.js → start-5VNJWI56.js} +4 -4
  93. package/dist-cli/chunks/store-SX54DA6L.js +2 -0
  94. package/dist-cli/chunks/telemetry-PHXMPEY3.js +2 -0
  95. package/dist-cli/chunks/{test-Q3CEHSD5.js → test-KPKJXRDI.js} +3 -3
  96. package/dist-cli/chunks/{three-mode-GTKSFFV7.js → three-mode-RWCVKNGM.js} +2 -2
  97. package/dist-cli/chunks/{timeline-NBDNN5SP.js → timeline-SRG5UM44.js} +2 -2
  98. package/dist-cli/chunks/{upgrade-UE7B726I.js → upgrade-LMUTKCI4.js} +2 -2
  99. package/dist-cli/chunks/upload-3YJQJYAD.js +2 -0
  100. package/dist-cli/chunks/{version-SS32LC2F.js → version-P4LKM55A.js} +2 -2
  101. package/dist-cli/chunks/web-5ZYKOZJG.js +2 -0
  102. package/dist-cli/chunks/{what-happened-NVKZVCHT.js → what-happened-AFWB7XTD.js} +2 -2
  103. package/dist-cli/chunks/{whoami-FWRWWX2E.js → whoami-YXJ6KECJ.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 +1 -1
  116. package/dist-lib/dev-bundle-resolution.cjs +1 -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/dev-server-scanner.cjs +1 -1
  128. package/dist-lib/sdk.cjs +1 -1
  129. package/dist-lib/sdk.mjs +1 -1
  130. package/dist-lib/skills.cjs +156 -59
  131. package/dist-lib/vite.cjs +1 -1
  132. package/package.json +1 -1
  133. package/src/vite-plugin.ts +24 -0
  134. package/dist-cli/chunks/auto-bootstrap-CKH5ZZSJ.js +0 -2
  135. package/dist-cli/chunks/beta-Q6IKT5HT.js +0 -2
  136. package/dist-cli/chunks/chunk-2GROEF3J.js +0 -386
  137. package/dist-cli/chunks/chunk-CKOXSYJ6.js +0 -119
  138. package/dist-cli/chunks/chunk-JQFOV34Q.js +0 -1
  139. package/dist-cli/chunks/chunk-ROADBGFV.js +0 -2
  140. package/dist-cli/chunks/chunk-SY5JYGZE.js +0 -1
  141. package/dist-cli/chunks/chunk-V4EYA5L5.js +0 -1
  142. package/dist-cli/chunks/cli-version-5KMLKVRO.js +0 -2
  143. package/dist-cli/chunks/drivers-5B4IZBF3.js +0 -2
  144. package/dist-cli/chunks/flow-ITIKFOJJ.js +0 -2
  145. package/dist-cli/chunks/help-A26MVCNK.js +0 -2
  146. package/dist-cli/chunks/install-AJ3BWZ2Z.js +0 -2
  147. package/dist-cli/chunks/optional-demo-registry-DA3SDA2G.js +0 -2
  148. package/dist-cli/chunks/runtime-X5RH4ZUA.js +0 -2
  149. package/dist-cli/chunks/setup-repo-CTPFDKV3.js +0 -2
  150. package/dist-cli/chunks/store-SIN5AXHS.js +0 -2
  151. package/dist-cli/chunks/telemetry-QHL6TKNR.js +0 -2
  152. package/dist-cli/chunks/upload-UXXFJA3K.js +0 -2
  153. package/dist-cli/chunks/web-A3EW2IWT.js +0 -2
@@ -1,5 +1,5 @@
1
- /*! sootsim v0.1.148 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{C as T,D as A,E as y,P as _,Q as b,R as S}from"./chunk-7EBPIOTW.js";import{c as N,e as F}from"./chunk-PMM6MNCR.js";import{b as k}from"./chunk-4JVDEEJJ.js";import"./chunk-U2U22DTV.js";import"./chunk-F3MFOV7R.js";import"./chunk-XYFPDYAI.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.150 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
+ import{C as T,D as A,E as y,P as _,Q as b,R as S}from"./chunk-QIGU47UD.js";import{c as N,e as F}from"./chunk-6UA5JZ4E.js";import{b as k}from"./chunk-NI2TIFUK.js";import"./chunk-KO4VABY3.js";import"./chunk-NHDDW7WP.js";import"./chunk-MFPT2P6I.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.148 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{d as i}from"./chunk-A57WJDB2.js";import{d as n}from"./chunk-TYHRA7FX.js";import"./chunk-F3MFOV7R.js";import"./chunk-XYFPDYAI.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.150 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
+ import{d as i}from"./chunk-3J5I64W6.js";import{d as n}from"./chunk-CDLPRRMH.js";import"./chunk-NHDDW7WP.js";import"./chunk-MFPT2P6I.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.148 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.150 | (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.148 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.150 | (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.148 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.150 | (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.148 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.150 | (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.148 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.150 | (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.148 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.150 | (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.148 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.150 | (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.148 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.150 | (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.148 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.150 | (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.148 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.150 | (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.148 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.150 | (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.148 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.150 | (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.148 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.150 | (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.148 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.150 | (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.148 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.150 | (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.148 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.150 | (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.148 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.150 | (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.148 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.150 | (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.148 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.150 | (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.148 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.150 | (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.148 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.150 | (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.148 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.150 | (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.148 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.150 | (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.148 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.150 | (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.148 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.150 | (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.148 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.150 | (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.148 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.150 | (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;
@@ -678,10 +678,10 @@ var init_registry = __esm({
678
678
  versions: [
679
679
  {
680
680
  range: ">=0.1.0",
681
- coverage: 0.92,
682
- note: "all SwiftUI-bridged components stubbed with HTML/RN equivalents",
683
- working: "Button, Switch, Picker, Slider, SegmentedControl, TextField, Checkbox, ColorPicker, ProgressView, Section, Label, ContextMenu (Trigger/Items/Root)",
684
- missing: "native SwiftUI animations, haptic feedback, platform-specific visual styling fidelity"
681
+ coverage: 0.93,
682
+ note: "all SwiftUI-bridged components stubbed with pixel-faithful RN/canvas equivalents, plus iOS 26 Liquid Glass (glassEffect material)",
683
+ working: "Host, Form/Section/List, Button (default/bordered/borderedProminent/destructive via buttonStyle modifier), Toggle, Slider, Stepper, Picker (segmented/menu/inline via selection + tag children), ColorPicker, ProgressView, Gauge, DatePicker, TextField/SecureField, LabeledContent, Label, Image (SF Symbols), HStack/VStack/ZStack, DisclosureGroup, ContentUnavailableView, ContextMenu/Menu, glassEffect (regular/clear), GlassEffectContainer",
684
+ missing: "native SwiftUI spring animations, haptic feedback, real Liquid Glass refraction of backdrop content (sootsim renders a flat translucent material)"
685
685
  }
686
686
  ]
687
687
  },
@@ -15363,41 +15363,17 @@ var init_frame_compose = __esm({
15363
15363
  });
15364
15364
 
15365
15365
  // cli/app-state-reset.ts
15366
- var CLEAR_APP_STATE_EVAL;
15366
+ function resetGuestAppStateEval(resetStorage) {
15367
+ return `(async () => {
15368
+ const bridge = globalThis.SootSim && globalThis.SootSim.bridges && globalThis.SootSim.bridges.hotRemount
15369
+ if (!bridge || typeof bridge.reloadExternalApp !== 'function') return false
15370
+ await bridge.reloadExternalApp({ resetStorage: ${resetStorage ? "true" : "false"} })
15371
+ return true
15372
+ })()`;
15373
+ }
15367
15374
  var init_app_state_reset = __esm({
15368
15375
  "cli/app-state-reset.ts"() {
15369
15376
  "use strict";
15370
- CLEAR_APP_STATE_EVAL = `(async () => {
15371
- try { localStorage.clear() } catch {}
15372
- try { sessionStorage.clear() } catch {}
15373
- try {
15374
- const dbs = (await indexedDB.databases?.()) || []
15375
- await Promise.all(
15376
- dbs.map(
15377
- (db) =>
15378
- new Promise((resolve) => {
15379
- if (!db.name) {
15380
- resolve()
15381
- return
15382
- }
15383
- const req = indexedDB.deleteDatabase(db.name)
15384
- req.onsuccess = () => resolve()
15385
- req.onerror = () => resolve()
15386
- req.onblocked = () => resolve()
15387
- }),
15388
- ),
15389
- )
15390
- } catch {}
15391
- try {
15392
- document.cookie.split(';').forEach((cookie) => {
15393
- const name = cookie.split('=')[0]?.trim()
15394
- if (name) {
15395
- document.cookie = name + '=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/'
15396
- }
15397
- })
15398
- } catch {}
15399
- return true
15400
- })()`;
15401
15377
  }
15402
15378
  });
15403
15379
 
@@ -16641,11 +16617,52 @@ var init_bridge_flow_runner = __esm({
16641
16617
  );
16642
16618
  }
16643
16619
  async findElement(opts) {
16620
+ if (opts.childOf != null || typeof opts.index === "number") {
16621
+ return this.findElementScoped(opts);
16622
+ }
16623
+ const wantRegex = !!opts.text && /[.*+?^$()[\]{}|\\]/.test(opts.text);
16644
16624
  return this.evaluate(`(async () => {
16645
16625
  const test = window.__sootsimTest
16646
16626
  if (!test) return null
16647
16627
  let node = null
16648
- if (${JSON.stringify(!!opts.text)}) node = await test.findByText(${JSON.stringify(opts.text || "")})
16628
+ if (${JSON.stringify(!!opts.text)}) {
16629
+ node = await test.findByText(${JSON.stringify(opts.text || "")})
16630
+ // maestro matches a text selector against the element's ACCESSIBILITY
16631
+ // text too, not just rendered glyphs \u2014 icon-only buttons (e.g. bluesky's
16632
+ // "Pin to Home" / "Mute accounts" pin/menu controls) carry the label on
16633
+ // accessibilityLabel with no visible text node, so findByText misses
16634
+ // them. fall back to an exact a11y-label match, mirroring the real
16635
+ // driver. findByLabel resolves a node, but its info shape omits nodeId/
16636
+ // isTextInput; re-resolve through findByTestId/findById when it exposes
16637
+ // an id so tapOn still gets a resolveTapTarget-able nodeId.
16638
+ if (!node) {
16639
+ const labelled = await test.findByLabel?.(${JSON.stringify(opts.text || "")})
16640
+ if (labelled) {
16641
+ const reId = labelled.testID || labelled.id
16642
+ node =
16643
+ (reId &&
16644
+ ((await test.findByTestId?.(reId)) || (await test.findById?.(reId)))) ||
16645
+ labelled
16646
+ }
16647
+ }
16648
+ if (!node && ${JSON.stringify(wantRegex)} && test.queryAll) {
16649
+ // regex selector fallback: match the pattern against each visible
16650
+ // node's text; prefer the narrowest matching node so a tight <text>
16651
+ // wins over a wide container that merely contains it.
16652
+ let re = null
16653
+ try { re = new RegExp(${JSON.stringify(opts.text || "")}) } catch (e) { re = null }
16654
+ if (re) {
16655
+ const all = (await test.queryAll({ pruneHidden: true })) || []
16656
+ const hits = all.filter(
16657
+ (n) =>
16658
+ n && n.absolutePosition && n.layout &&
16659
+ typeof n.text === 'string' && re.test(n.text),
16660
+ )
16661
+ hits.sort((a, b) => (a.text || '').length - (b.text || '').length)
16662
+ if (hits[0]) node = hits[0]
16663
+ }
16664
+ }
16665
+ }
16649
16666
  if (!node && ${JSON.stringify(!!opts.id)}) {
16650
16667
  node = (await test.findByTestId(${JSON.stringify(opts.id || "")})) || (await test.findById(${JSON.stringify(opts.id || "")}))
16651
16668
  }
@@ -16659,6 +16676,61 @@ var init_bridge_flow_runner = __esm({
16659
16676
  layout: node.layout,
16660
16677
  isTextInput: !!node.isTextInput,
16661
16678
  }
16679
+ })()`);
16680
+ }
16681
+ // maestro `index:` (nth match) and `childOf:` (match scoped to a container)
16682
+ // resolver. queryAll returns every matching node in tree order; childOf keeps
16683
+ // only candidates whose center sits inside the container's bounds.
16684
+ async findElementScoped(opts) {
16685
+ const index = typeof opts.index === "number" ? opts.index : 0;
16686
+ return this.evaluate(`(async () => {
16687
+ const test = window.__sootsimTest
16688
+ if (!test || !test.queryAll) return null
16689
+ // NOT pruneHidden: that over-filters (it dropped every postDropdownBtn in a
16690
+ // feed and made index:0 resolve to nothing \u2014 worse than findByTestId). reach
16691
+ // for the same set findByTestId sees, then PREFER on-screen ones below.
16692
+ const filter = {}
16693
+ if (${JSON.stringify(!!opts.id)}) filter.hasId = ${JSON.stringify(opts.id || "")}
16694
+ if (${JSON.stringify(!!opts.text)}) filter.hasText = ${JSON.stringify(opts.text || "")}
16695
+ let candidates = (await test.queryAll(filter)) || []
16696
+ // a11y-label fallback (icon-only buttons) for text matchers, mirroring
16697
+ // findElement's simple path.
16698
+ if (${JSON.stringify(!!opts.text)} && candidates.length === 0) {
16699
+ const all = (await test.queryAll({})) || []
16700
+ candidates = all.filter((n) => (n.accessibilityLabel || '') === ${JSON.stringify(opts.text || "")})
16701
+ }
16702
+ candidates = candidates.filter((n) => n && n.absolutePosition && n.layout)
16703
+ // prefer on-screen matches (findByTestId's visible-first behavior); only
16704
+ // fall back to off-screen ones when nothing is on-screen, so index: still
16705
+ // resolves a target that needs scrolling into view.
16706
+ const onScreen = candidates.filter((n) => {
16707
+ const cy = n.absolutePosition.y + n.layout.height / 2
16708
+ return cy > 0 && cy < ${SCREEN_H}
16709
+ })
16710
+ if (onScreen.length > 0) candidates = onScreen
16711
+ ${opts.childOf ? `
16712
+ const container = ${opts.childOf.id ? `(await test.findByTestId(${JSON.stringify(opts.childOf.id)})) || (await test.findById(${JSON.stringify(opts.childOf.id)}))` : `await test.findByText(${JSON.stringify(opts.childOf.text || "")})`}
16713
+ if (!container || !container.absolutePosition || !container.layout) return null
16714
+ const x0 = container.absolutePosition.x
16715
+ const y0 = container.absolutePosition.y
16716
+ const x1 = x0 + container.layout.width
16717
+ const y1 = y0 + container.layout.height
16718
+ candidates = candidates.filter((n) => {
16719
+ const cx = n.absolutePosition.x + n.layout.width / 2
16720
+ const cy = n.absolutePosition.y + n.layout.height / 2
16721
+ return cx >= x0 && cx <= x1 && cy >= y0 && cy <= y1
16722
+ })` : ""}
16723
+ const node = candidates[${index}]
16724
+ if (!node) return null
16725
+ return {
16726
+ nodeId: typeof node.nodeId === 'number' ? node.nodeId : null,
16727
+ id: node.id || null,
16728
+ testID: node.testID || null,
16729
+ text: node.text || null,
16730
+ absolutePosition: node.absolutePosition,
16731
+ layout: node.layout,
16732
+ isTextInput: !!node.isTextInput,
16733
+ }
16662
16734
  })()`);
16663
16735
  }
16664
16736
  async resolveTapTarget(nodeId) {
@@ -17245,24 +17317,55 @@ var init_bridge_flow_runner = __esm({
17245
17317
  }
17246
17318
  throw new Error("extendedWaitUntil timed out");
17247
17319
  }
17320
+ // relaunch the guest app for a clearState/launchApp step. two phases:
17321
+ // 1. clear tenant-scoped storage through the engine bridge (best-effort).
17322
+ // 2. ALWAYS hard-reload the page to reset the tenant worker.
17323
+ // phase 2 is the important one for a long suite: the engine soft reload alone
17324
+ // keeps the same worker alive across every flow, so a saturated event loop /
17325
+ // accumulated state from one flow's post-PDS-reset auth-failure storm carries
17326
+ // into the next and degrades until the worker wedges or the tab crashes (the
17327
+ // failures clustered in the tail of a 21-flow run). a full page reload starts
17328
+ // each flow on a fresh worker — worker-independent, so it also recovers a
17329
+ // worker the bridge clear couldn't even ack. storage persists across a page
17330
+ // reload, so the clear in phase 1 is what actually logs the guest out.
17331
+ async reloadGuestApp(resetStorage) {
17332
+ if (resetStorage) {
17333
+ const ATTEMPTS = 3;
17334
+ const PER_ATTEMPT_MS = 2e4;
17335
+ let cleared = false;
17336
+ for (let attempt = 0; attempt < ATTEMPTS && !cleared; attempt++) {
17337
+ try {
17338
+ cleared = await this.evaluate(
17339
+ resetGuestAppStateEval(true),
17340
+ PER_ATTEMPT_MS
17341
+ );
17342
+ } catch {
17343
+ await sleep(1e3);
17344
+ }
17345
+ }
17346
+ if (!cleared) {
17347
+ console.warn(
17348
+ " warn: tenant storage clear did not ack \u2014 hard-reloading anyway (worker reset follows)"
17349
+ );
17350
+ }
17351
+ }
17352
+ await this.evaluate("window.location.reload()").catch(() => {
17353
+ });
17354
+ await sleep(500);
17355
+ await this.refreshSimId();
17356
+ }
17248
17357
  async launchApp(opts) {
17249
17358
  await this.refreshSimId();
17250
17359
  if (opts && typeof opts === "object" && opts.arguments) {
17251
17360
  console.log("[flow] launchApp.arguments ignored (sootsim has no native process)");
17252
17361
  }
17253
17362
  const wantsClear = !!(opts && typeof opts === "object" && opts.clearState);
17254
- if (wantsClear) {
17255
- await this.evaluate(CLEAR_APP_STATE_EVAL, 6e4);
17256
- }
17257
17363
  if (!this.firstLaunchDone && !wantsClear) {
17258
17364
  this.firstLaunchDone = true;
17259
17365
  await this.waitForTree(3e4);
17260
17366
  } else {
17261
17367
  this.firstLaunchDone = true;
17262
- await this.evaluate("window.location.reload()").catch(() => {
17263
- });
17264
- await sleep(500);
17265
- await this.refreshSimId();
17368
+ await this.reloadGuestApp(wantsClear);
17266
17369
  await this.waitForTree(12e4);
17267
17370
  if (this.opts.onAfterLaunch) {
17268
17371
  try {
@@ -17400,23 +17503,17 @@ var init_bridge_flow_runner = __esm({
17400
17503
  return result;
17401
17504
  }
17402
17505
  // maestro stopApp: tear down current app runtime. mirrors the real cli,
17403
- // which kills the running process. in sootsim the app lives in the page,
17404
- // so we clear the in-page app state — the next launchApp reloads it fresh.
17506
+ // which kills the running process. sootsim has no separate process, so we
17507
+ // soft-reload the guest app to a fresh cleared mount — the next launchApp
17508
+ // finds it ready. (does NOT unregister the service worker: it holds the
17509
+ // engine's own bundle chunks, and wiping them 404s the next heavy reload.)
17405
17510
  async stopApp() {
17406
- await this.evaluate(`(async () => {
17407
- try { await (${CLEAR_APP_STATE_EVAL}) } catch {}
17408
- try {
17409
- const regs = await navigator.serviceWorker?.getRegistrations?.()
17410
- await Promise.all((regs || []).map((reg) => reg.unregister()))
17411
- } catch {}
17412
- })()`);
17511
+ await this.reloadGuestApp(true);
17413
17512
  }
17414
- // maestro clearState: wipe app-owned storage but keep the page alive.
17415
- // reuses the same eval launchApp uses under `clearState: true`.
17513
+ // maestro clearState: wipe app-owned storage and relaunch fresh. routes
17514
+ // through the same engine soft-reload launchApp uses under `clearState: true`.
17416
17515
  async clearState() {
17417
- await this.evaluate(`(async () => {
17418
- await (${CLEAR_APP_STATE_EVAL})
17419
- })()`);
17516
+ await this.reloadGuestApp(true);
17420
17517
  }
17421
17518
  // maestro clearKeychain: there is no real keychain in sootsim's browser
17422
17519
  // sandbox. log loudly so the author notices, then continue — matching the
package/dist-lib/vite.cjs CHANGED
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.148 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.150 | (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.148",
3
+ "version": "0.1.150",
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",
@@ -122,6 +122,22 @@ const reactNativeHapticFeedbackTouchablePath = (() => {
122
122
  }
123
123
  })()
124
124
 
125
+ // `@expo/ui/swift-ui/modifiers` is pure JS (every modifier just returns a
126
+ // ModifierConfig via createModifier) and runs from the real bundle unchanged —
127
+ // the runtime stub-registry intentionally does NOT intercept it. but the
128
+ // `@expo/ui/swift-ui` stub alias is a vite PREFIX match, so without an explicit
129
+ // longer alias it captures `.../modifiers` and rewrites it to
130
+ // `<stubs>/expo-ui.ts/modifiers` ("Not a directory"). resolve the real subpath
131
+ // here and alias it first (stubAliases are sorted longest-first, and this is
132
+ // longer than `@expo/ui/swift-ui`, so it wins).
133
+ const expoUiSwiftUiModifiersRealPath = (() => {
134
+ try {
135
+ return sootsimPluginRequire.resolve('@expo/ui/swift-ui/modifiers')
136
+ } catch {
137
+ return null
138
+ }
139
+ })()
140
+
125
141
  const compatWrapperRealPackageAliases: Array<{
126
142
  find: string
127
143
  replacement: string
@@ -701,6 +717,14 @@ function sootsimConfigPlugin(appDir: string, extraSources: string[]): Plugin {
701
717
  ]
702
718
  : []),
703
719
  ...compatWrapperRealPackageAliases,
720
+ ...(expoUiSwiftUiModifiersRealPath
721
+ ? [
722
+ {
723
+ find: '@expo/ui/swift-ui/modifiers',
724
+ replacement: expoUiSwiftUiModifiersRealPath,
725
+ },
726
+ ]
727
+ : []),
704
728
  ...stubAliases,
705
729
  ],
706
730
  },
@@ -1,2 +0,0 @@
1
- /*! sootsim v0.1.148 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{a,b,c,d}from"./chunk-YXZD545S.js";import"./chunk-PMM6MNCR.js";import"./chunk-4JVDEEJJ.js";import"./chunk-U2U22DTV.js";import"./chunk-F3MFOV7R.js";import"./chunk-XYFPDYAI.js";export{c as ensureDaemonRunning,a as ensureRuntimeInstalled,d as ensureSootsimReady,b as resolveBootstrapPort};
@@ -1,2 +0,0 @@
1
- /*! sootsim v0.1.148 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{a,b,c,d,e}from"./chunk-4T5Q2CUU.js";import"./chunk-XYFPDYAI.js";export{e as BETA_ASK_HEADLINE,c as BETA_LABEL,d as BETA_TAGLINE,b as BETA_VERSION_TARGET,a as IS_BETA};