sootsim 0.1.127 → 0.1.129

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 (149) hide show
  1. package/dist-cli/bin.js +3 -3
  2. package/dist-cli/chunks/{agent-LUN4QHOL.js → agent-2CLXZJCE.js} +2 -2
  3. package/dist-cli/chunks/{agent-wrapper-APEJDITM.js → agent-wrapper-DMTETGFP.js} +2 -2
  4. package/dist-cli/chunks/{app-fonts-AKZ7ZDOK.js → app-fonts-25BQNOJE.js} +2 -2
  5. package/dist-cli/chunks/{assert-MFPNYG7R.js → assert-EYRTQ6ER.js} +2 -2
  6. package/dist-cli/chunks/auto-bootstrap-NB4SLPAE.js +2 -0
  7. package/dist-cli/chunks/beta-2LKOVRW5.js +2 -0
  8. package/dist-cli/chunks/{chunk-GNG6W27T.js → chunk-3QJLWCBD.js} +2 -2
  9. package/dist-cli/chunks/{chunk-GNYI3JAB.js → chunk-4DT5LVP3.js} +1 -1
  10. package/dist-cli/chunks/{chunk-LF3KGYGE.js → chunk-4PN5EVFA.js} +2 -2
  11. package/dist-cli/chunks/{chunk-5UWZ47FH.js → chunk-56IYXKG5.js} +1 -1
  12. package/dist-cli/chunks/{chunk-ZP3CCVT7.js → chunk-5AR7JQNL.js} +1 -1
  13. package/dist-cli/chunks/{chunk-4JCC7SR2.js → chunk-5ITNDSDP.js} +2 -2
  14. package/dist-cli/chunks/{chunk-OKAG4ZKD.js → chunk-5T5OIH3R.js} +2 -2
  15. package/dist-cli/chunks/{chunk-HNEBMDYQ.js → chunk-5Y4V7DHL.js} +2 -2
  16. package/dist-cli/chunks/{chunk-ZGXZQPYO.js → chunk-7FDXV4PE.js} +2 -2
  17. package/dist-cli/chunks/{chunk-5WIVTKYW.js → chunk-7HRQGZ7J.js} +1 -1
  18. package/dist-cli/chunks/{chunk-7DAYDZ6K.js → chunk-AQSGGVCD.js} +3 -3
  19. package/dist-cli/chunks/{chunk-NDGBW36P.js → chunk-CHCJWMYW.js} +1 -1
  20. package/dist-cli/chunks/chunk-DLMQVCTV.js +1 -0
  21. package/dist-cli/chunks/{chunk-FMCKRPCU.js → chunk-EMTFJESP.js} +1 -1
  22. package/dist-cli/chunks/{chunk-B56YQYVI.js → chunk-EP3L4A52.js} +1 -1
  23. package/dist-cli/chunks/{chunk-L2CWZNGS.js → chunk-EP3YPVJY.js} +2 -2
  24. package/dist-cli/chunks/{chunk-24GWVHOQ.js → chunk-FSYDDBEL.js} +2 -2
  25. package/dist-cli/chunks/{chunk-SM2JP7BO.js → chunk-GPUIF547.js} +1 -1
  26. package/dist-cli/chunks/{chunk-36AO2O2R.js → chunk-HHI7444G.js} +57 -17
  27. package/dist-cli/chunks/{chunk-FGTMXDHE.js → chunk-IAG3ZUAE.js} +2 -2
  28. package/dist-cli/chunks/{chunk-DQAWYKPD.js → chunk-IFHNUWKU.js} +2 -2
  29. package/dist-cli/chunks/{chunk-Y4YKDIS6.js → chunk-J4RRVZLG.js} +1 -1
  30. package/dist-cli/chunks/{chunk-7JJF24H4.js → chunk-KG247GVZ.js} +2 -2
  31. package/dist-cli/chunks/{chunk-2YJLYAL3.js → chunk-LNU7WB6Z.js} +2 -2
  32. package/dist-cli/chunks/{chunk-BY4HZZZH.js → chunk-MMR2PBWA.js} +3 -3
  33. package/dist-cli/chunks/{chunk-MT6WASRO.js → chunk-NHK744OV.js} +1 -1
  34. package/dist-cli/chunks/{chunk-7QBGAHCM.js → chunk-NW72VNGA.js} +3 -3
  35. package/dist-cli/chunks/chunk-PAZWCF3C.js +1 -0
  36. package/dist-cli/chunks/{chunk-52XT4NSH.js → chunk-PEQUGH7X.js} +2 -2
  37. package/dist-cli/chunks/{chunk-VIXWXLVX.js → chunk-PSMCJQXE.js} +2 -2
  38. package/dist-cli/chunks/{chunk-DC6VXHIZ.js → chunk-QF6IUOSK.js} +1 -1
  39. package/dist-cli/chunks/{chunk-CSXM46RX.js → chunk-QJCDLCY7.js} +2 -2
  40. package/dist-cli/chunks/chunk-QMDFOSCP.js +1 -0
  41. package/dist-cli/chunks/{chunk-6D4U74IK.js → chunk-RJ6BJSSK.js} +2 -2
  42. package/dist-cli/chunks/{chunk-FPVP3O53.js → chunk-SY4CNQ7Q.js} +2 -2
  43. package/dist-cli/chunks/{chunk-IWSLRFIG.js → chunk-T73PO7QP.js} +2 -2
  44. package/dist-cli/chunks/{chunk-3U2ZPTHG.js → chunk-VXLPV53O.js} +2 -2
  45. package/dist-cli/chunks/{chunk-TGJWE3CN.js → chunk-WA4F3S3O.js} +2 -2
  46. package/dist-cli/chunks/{chunk-FG6YYUCT.js → chunk-WAK4QVNM.js} +1 -1
  47. package/dist-cli/chunks/{chunk-NKJJMS2M.js → chunk-WB3P3VGN.js} +1 -1
  48. package/dist-cli/chunks/{chunk-5WSDKWL7.js → chunk-X6UBD524.js} +2 -2
  49. package/dist-cli/chunks/chunk-XLUUJCSP.js +2 -0
  50. package/dist-cli/chunks/{chunk-3DHE4SHG.js → chunk-Y3YURX2A.js} +1 -1
  51. package/dist-cli/chunks/{chunk-YVB5QNKO.js → chunk-YKXKGZSJ.js} +1 -1
  52. package/dist-cli/chunks/cli-version-I3UMBT5O.js +2 -0
  53. package/dist-cli/chunks/{compat-JELEOJPN.js → compat-EIQNZ4JY.js} +3 -3
  54. package/dist-cli/chunks/{config-REAVTZCI.js → config-WBBB4KAF.js} +2 -2
  55. package/dist-cli/chunks/control-EX3VXQ7V.js +2 -0
  56. package/dist-cli/chunks/{cpu-profile-OGVBRPW7.js → cpu-profile-334GREGX.js} +2 -2
  57. package/dist-cli/chunks/{daemon-ZUOHTLAC.js → daemon-J65WSF5U.js} +2 -2
  58. package/dist-cli/chunks/{debug-G533AR4F.js → debug-DB737GNO.js} +3 -3
  59. package/dist-cli/chunks/{detox-TBWG4AR3.js → detox-GYZJZZB6.js} +2 -2
  60. package/dist-cli/chunks/{device-PQEM6FOV.js → device-CNPPTXFU.js} +2 -2
  61. package/dist-cli/chunks/{diagnose-4J75PLPF.js → diagnose-ERZANOHM.js} +2 -2
  62. package/dist-cli/chunks/drivers-7YH3VVVZ.js +2 -0
  63. package/dist-cli/chunks/{electron-A2SD7F3N.js → electron-4BT5EQHI.js} +3 -3
  64. package/dist-cli/chunks/flow-OFD6LF6V.js +2 -0
  65. package/dist-cli/chunks/help-FRUNM3LL.js +2 -0
  66. package/dist-cli/chunks/{hints-7PG63DKS.js → hints-VUH6VBJ7.js} +2 -2
  67. package/dist-cli/chunks/{home-paths-QIX4W62B.js → home-paths-ECU3BYCS.js} +2 -2
  68. package/dist-cli/chunks/{inspect-T3H6FTHE.js → inspect-KKQJ5KQV.js} +4 -4
  69. package/dist-cli/chunks/install-LZLX3YZP.js +2 -0
  70. package/dist-cli/chunks/{install-desktop-AJ7MV6OQ.js → install-desktop-Q6QSPYQS.js} +3 -3
  71. package/dist-cli/chunks/{keys-ODRTRJX7.js → keys-XMG7L2AL.js} +2 -2
  72. package/dist-cli/chunks/{launch-5BF5JBYF.js → launch-WH323264.js} +3 -3
  73. package/dist-cli/chunks/{login-MQ2PDQNI.js → login-3YYWFKB3.js} +4 -4
  74. package/dist-cli/chunks/{logout-KH374434.js → logout-U77GYAWT.js} +2 -2
  75. package/dist-cli/chunks/{maestro-J5GGRVH6.js → maestro-NQEF23G7.js} +2 -2
  76. package/dist-cli/chunks/{preview-CCPCRU6W.js → preview-AOTCHNWB.js} +2 -2
  77. package/dist-cli/chunks/{profile-MTL2HU6F.js → profile-57CSZI4O.js} +2 -2
  78. package/dist-cli/chunks/{react-UTYPZQWT.js → react-5JGWHJCG.js} +2 -2
  79. package/dist-cli/chunks/{record-AFRD6E2J.js → record-JQW5AQDG.js} +2 -2
  80. package/dist-cli/chunks/runtime-3PEHSFYI.js +2 -0
  81. package/dist-cli/chunks/{runtime-delivery-PJZCHZOA.js → runtime-delivery-2SY6VTTC.js} +2 -2
  82. package/dist-cli/chunks/{screenshot-AQHIB3G7.js → screenshot-LNYP7U72.js} +2 -2
  83. package/dist-cli/chunks/{screenshot-mode-NOOW6RL5.js → screenshot-mode-LMUUUFJY.js} +2 -2
  84. package/dist-cli/chunks/{screenshots-KVKV2KAZ.js → screenshots-R7T7DOBG.js} +2 -2
  85. package/dist-cli/chunks/{server-6KNS5Y7Q.js → server-7H67CYP4.js} +12 -12
  86. package/dist-cli/chunks/setup-repo-QJEHYA7R.js +2 -0
  87. package/dist-cli/chunks/{skills-62FUBTDY.js → skills-SDSSTD44.js} +2 -2
  88. package/dist-cli/chunks/{start-XBAW57QL.js → start-MQAJ7GA6.js} +4 -4
  89. package/dist-cli/chunks/store-ZYMG4VDY.js +2 -0
  90. package/dist-cli/chunks/telemetry-AXLZH6Y2.js +2 -0
  91. package/dist-cli/chunks/{test-TSJ5PCO6.js → test-3IWJYEBS.js} +3 -3
  92. package/dist-cli/chunks/{three-mode-VK2D4NYV.js → three-mode-4F5PHPL2.js} +2 -2
  93. package/dist-cli/chunks/{timeline-HY7B7HAW.js → timeline-XDSEYH2S.js} +2 -2
  94. package/dist-cli/chunks/{upgrade-BHZN6X5M.js → upgrade-DH362WFZ.js} +2 -2
  95. package/dist-cli/chunks/upload-TJUKEH3W.js +2 -0
  96. package/dist-cli/chunks/{version-YFEE6ZGK.js → version-FRIIGCBS.js} +2 -2
  97. package/dist-cli/chunks/web-D3OXRMIU.js +2 -0
  98. package/dist-cli/chunks/{what-happened-VDAD5V3N.js → what-happened-QWW5OLBU.js} +2 -2
  99. package/dist-cli/chunks/{whoami-ONERUEKE.js → whoami-HU3F2UE5.js} +2 -2
  100. package/dist-lib/agent-daemon-client.cjs +1 -1
  101. package/dist-lib/agent-events.cjs +1 -1
  102. package/dist-lib/agent-sessions.cjs +1 -1
  103. package/dist-lib/attached-projects.cjs +1 -1
  104. package/dist-lib/auth/shared-session.cjs +1 -1
  105. package/dist-lib/backend-origin.cjs +1 -1
  106. package/dist-lib/beta.cjs +1 -1
  107. package/dist-lib/beta.mjs +1 -1
  108. package/dist-lib/bridge-constants.cjs +1 -1
  109. package/dist-lib/cli-constants.cjs +1 -1
  110. package/dist-lib/config.cjs +1 -1
  111. package/dist-lib/detox/index.cjs +1 -1
  112. package/dist-lib/dev-bundle-resolution.cjs +1 -1
  113. package/dist-lib/home-paths.cjs +1 -1
  114. package/dist-lib/host/bridge-host.cjs +20 -7
  115. package/dist-lib/host/fetch-proxy-handler.cjs +20 -7
  116. package/dist-lib/host/fetch-proxy-overrides.cjs +10 -6
  117. package/dist-lib/host/fetch-proxy-overrides.mjs +10 -6
  118. package/dist-lib/host/websocket-proxy.cjs +1 -1
  119. package/dist-lib/index.cjs +1 -1
  120. package/dist-lib/metro.cjs +1 -1
  121. package/dist-lib/profiles.cjs +1 -1
  122. package/dist-lib/render-mode.cjs +1 -1
  123. package/dist-lib/scripts/demo-app-registry.cjs +1 -1
  124. package/dist-lib/scripts/dev-server-scanner.cjs +1 -1
  125. package/dist-lib/sdk.cjs +65 -11
  126. package/dist-lib/sdk.mjs +64 -11
  127. package/dist-lib/skills.cjs +27 -13
  128. package/dist-lib/vite.cjs +1 -1
  129. package/package.json +1 -1
  130. package/src/host/fetch-proxy-handler.ts +23 -2
  131. package/src/host/fetch-proxy-overrides.ts +17 -5
  132. package/dist-cli/chunks/auto-bootstrap-LBKZGZZF.js +0 -2
  133. package/dist-cli/chunks/beta-VGO5KHIW.js +0 -2
  134. package/dist-cli/chunks/chunk-3WXNKHSH.js +0 -1
  135. package/dist-cli/chunks/chunk-FW5SXCE2.js +0 -2
  136. package/dist-cli/chunks/chunk-QVIEWXVS.js +0 -1
  137. package/dist-cli/chunks/chunk-UWEGL2QF.js +0 -1
  138. package/dist-cli/chunks/cli-version-YVYBW43E.js +0 -2
  139. package/dist-cli/chunks/control-3AUN3AWZ.js +0 -2
  140. package/dist-cli/chunks/drivers-PNGLYCLQ.js +0 -2
  141. package/dist-cli/chunks/flow-THQYC2Y4.js +0 -2
  142. package/dist-cli/chunks/help-ASEA4FFM.js +0 -2
  143. package/dist-cli/chunks/install-FXTDM3ZL.js +0 -2
  144. package/dist-cli/chunks/runtime-SE4VB7MF.js +0 -2
  145. package/dist-cli/chunks/setup-repo-XXEF6YK3.js +0 -2
  146. package/dist-cli/chunks/store-FOWKJFEJ.js +0 -2
  147. package/dist-cli/chunks/telemetry-FDYR6W5E.js +0 -2
  148. package/dist-cli/chunks/upload-B6UNK5GQ.js +0 -2
  149. package/dist-cli/chunks/web-KNX5TVQW.js +0 -2
@@ -1,5 +1,5 @@
1
- /*! sootsim v0.1.127 | (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-36AO2O2R.js";import{c as N,e as F}from"./chunk-52XT4NSH.js";import{b as k}from"./chunk-ZP3CCVT7.js";import"./chunk-5WIVTKYW.js";import"./chunk-Y4YKDIS6.js";import"./chunk-B56YQYVI.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.129 | (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-HHI7444G.js";import{c as N,e as F}from"./chunk-PEQUGH7X.js";import{b as k}from"./chunk-5AR7JQNL.js";import"./chunk-7HRQGZ7J.js";import"./chunk-J4RRVZLG.js";import"./chunk-EP3L4A52.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.127 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{d as i}from"./chunk-TGJWE3CN.js";import{d as n}from"./chunk-GNG6W27T.js";import"./chunk-Y4YKDIS6.js";import"./chunk-B56YQYVI.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.129 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
+ import{d as i}from"./chunk-WA4F3S3O.js";import{d as n}from"./chunk-3QJLWCBD.js";import"./chunk-J4RRVZLG.js";import"./chunk-EP3L4A52.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.127 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.129 | (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.127 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.129 | (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.127 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.129 | (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.127 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.129 | (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.127 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.129 | (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.127 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.129 | (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.127 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.129 | (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.127 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.129 | (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.127 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.129 | (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.127 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.129 | (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.127 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.129 | (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.127 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.129 | (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.127 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.129 | (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.127 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.129 | (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.127 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.129 | (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;
@@ -2873,23 +2873,27 @@ var HOST_HEADER_OVERRIDES = [
2873
2873
  headers: {
2874
2874
  origin: "https://app.uniswap.org",
2875
2875
  referer: "https://app.uniswap.org/"
2876
- }
2876
+ },
2877
+ // uniswap's native gateway accepts the app origin, but forcing a desktop
2878
+ // browser ua on native api posts returns a bogus 414/tcp-stack response.
2879
+ suppressBrowserUserAgent: true
2877
2880
  }
2878
2881
  ];
2879
2882
  function headerOverridesFor(hostname) {
2880
2883
  const host = hostname.toLowerCase();
2881
2884
  for (const override of HOST_HEADER_OVERRIDES) {
2882
2885
  if (host === override.hostSuffix || host.endsWith(`.${override.hostSuffix}`)) {
2883
- return override.headers;
2886
+ return override;
2884
2887
  }
2885
2888
  }
2886
- return {};
2889
+ return void 0;
2887
2890
  }
2888
2891
  function getFetchProxyTargetHeaders(targetUrl) {
2892
+ const hostOverrides = headerOverridesFor(targetUrl.hostname);
2889
2893
  return {
2890
2894
  "accept-encoding": "identity",
2891
- "user-agent": FETCH_PROXY_BROWSER_USER_AGENT,
2892
- ...headerOverridesFor(targetUrl.hostname)
2895
+ ...hostOverrides?.suppressBrowserUserAgent ? {} : { "user-agent": FETCH_PROXY_BROWSER_USER_AGENT },
2896
+ ...hostOverrides?.headers
2893
2897
  };
2894
2898
  }
2895
2899
 
@@ -2947,6 +2951,12 @@ function formatFetchProxyError(targetUrl, err) {
2947
2951
  }
2948
2952
  return message;
2949
2953
  }
2954
+ function isTextProxyContentType(contentType) {
2955
+ const value = Array.isArray(contentType) ? contentType[0] : contentType;
2956
+ const normalized = value?.split(";", 1)[0]?.trim().toLowerCase();
2957
+ if (!normalized) return false;
2958
+ return normalized.startsWith("text/") || normalized === "application/json" || normalized.endsWith("+json") || normalized === "application/x-www-form-urlencoded" || normalized === "application/xml" || normalized.endsWith("+xml") || normalized === "application/javascript" || normalized === "application/graphql";
2959
+ }
2950
2960
  function buildFetchProxyHeaders(reqHeaders, targetUrl) {
2951
2961
  const headers = {};
2952
2962
  for (const [key, value] of Object.entries(reqHeaders)) {
@@ -3012,7 +3022,10 @@ async function handleFetchProxyRequest(req, res) {
3012
3022
  for await (const chunk of req) {
3013
3023
  chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));
3014
3024
  }
3015
- if (chunks.length > 0) body = Buffer.concat(chunks);
3025
+ if (chunks.length > 0) {
3026
+ const bytes = Buffer.concat(chunks);
3027
+ body = isTextProxyContentType(req.headers["content-type"]) ? bytes.toString("utf8") : bytes;
3028
+ }
3016
3029
  }
3017
3030
  let upstream;
3018
3031
  try {
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.127 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.129 | (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;
@@ -51,23 +51,27 @@ var HOST_HEADER_OVERRIDES = [
51
51
  headers: {
52
52
  origin: "https://app.uniswap.org",
53
53
  referer: "https://app.uniswap.org/"
54
- }
54
+ },
55
+ // uniswap's native gateway accepts the app origin, but forcing a desktop
56
+ // browser ua on native api posts returns a bogus 414/tcp-stack response.
57
+ suppressBrowserUserAgent: true
55
58
  }
56
59
  ];
57
60
  function headerOverridesFor(hostname) {
58
61
  const host = hostname.toLowerCase();
59
62
  for (const override of HOST_HEADER_OVERRIDES) {
60
63
  if (host === override.hostSuffix || host.endsWith(`.${override.hostSuffix}`)) {
61
- return override.headers;
64
+ return override;
62
65
  }
63
66
  }
64
- return {};
67
+ return void 0;
65
68
  }
66
69
  function getFetchProxyTargetHeaders(targetUrl) {
70
+ const hostOverrides = headerOverridesFor(targetUrl.hostname);
67
71
  return {
68
72
  "accept-encoding": "identity",
69
- "user-agent": FETCH_PROXY_BROWSER_USER_AGENT,
70
- ...headerOverridesFor(targetUrl.hostname)
73
+ ...hostOverrides?.suppressBrowserUserAgent ? {} : { "user-agent": FETCH_PROXY_BROWSER_USER_AGENT },
74
+ ...hostOverrides?.headers
71
75
  };
72
76
  }
73
77
 
@@ -125,6 +129,12 @@ function formatFetchProxyError(targetUrl, err) {
125
129
  }
126
130
  return message;
127
131
  }
132
+ function isTextProxyContentType(contentType) {
133
+ const value = Array.isArray(contentType) ? contentType[0] : contentType;
134
+ const normalized = value?.split(";", 1)[0]?.trim().toLowerCase();
135
+ if (!normalized) return false;
136
+ return normalized.startsWith("text/") || normalized === "application/json" || normalized.endsWith("+json") || normalized === "application/x-www-form-urlencoded" || normalized === "application/xml" || normalized.endsWith("+xml") || normalized === "application/javascript" || normalized === "application/graphql";
137
+ }
128
138
  function buildFetchProxyHeaders(reqHeaders, targetUrl) {
129
139
  const headers = {};
130
140
  for (const [key, value] of Object.entries(reqHeaders)) {
@@ -190,7 +200,10 @@ async function handleFetchProxyRequest(req, res) {
190
200
  for await (const chunk of req) {
191
201
  chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));
192
202
  }
193
- if (chunks.length > 0) body = Buffer.concat(chunks);
203
+ if (chunks.length > 0) {
204
+ const bytes = Buffer.concat(chunks);
205
+ body = isTextProxyContentType(req.headers["content-type"]) ? bytes.toString("utf8") : bytes;
206
+ }
194
207
  }
195
208
  let upstream;
196
209
  try {
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.127 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.129 | (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;
@@ -33,23 +33,27 @@ var HOST_HEADER_OVERRIDES = [
33
33
  headers: {
34
34
  origin: "https://app.uniswap.org",
35
35
  referer: "https://app.uniswap.org/"
36
- }
36
+ },
37
+ // uniswap's native gateway accepts the app origin, but forcing a desktop
38
+ // browser ua on native api posts returns a bogus 414/tcp-stack response.
39
+ suppressBrowserUserAgent: true
37
40
  }
38
41
  ];
39
42
  function headerOverridesFor(hostname) {
40
43
  const host = hostname.toLowerCase();
41
44
  for (const override of HOST_HEADER_OVERRIDES) {
42
45
  if (host === override.hostSuffix || host.endsWith(`.${override.hostSuffix}`)) {
43
- return override.headers;
46
+ return override;
44
47
  }
45
48
  }
46
- return {};
49
+ return void 0;
47
50
  }
48
51
  function getFetchProxyTargetHeaders(targetUrl) {
52
+ const hostOverrides = headerOverridesFor(targetUrl.hostname);
49
53
  return {
50
54
  "accept-encoding": "identity",
51
- "user-agent": FETCH_PROXY_BROWSER_USER_AGENT,
52
- ...headerOverridesFor(targetUrl.hostname)
55
+ ...hostOverrides?.suppressBrowserUserAgent ? {} : { "user-agent": FETCH_PROXY_BROWSER_USER_AGENT },
56
+ ...hostOverrides?.headers
53
57
  };
54
58
  }
55
59
  // Annotate the CommonJS export names for ESM import in node:
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.127 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.129 | (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";
@@ -8,23 +8,27 @@ var HOST_HEADER_OVERRIDES = [
8
8
  headers: {
9
9
  origin: "https://app.uniswap.org",
10
10
  referer: "https://app.uniswap.org/"
11
- }
11
+ },
12
+ // uniswap's native gateway accepts the app origin, but forcing a desktop
13
+ // browser ua on native api posts returns a bogus 414/tcp-stack response.
14
+ suppressBrowserUserAgent: true
12
15
  }
13
16
  ];
14
17
  function headerOverridesFor(hostname) {
15
18
  const host = hostname.toLowerCase();
16
19
  for (const override of HOST_HEADER_OVERRIDES) {
17
20
  if (host === override.hostSuffix || host.endsWith(`.${override.hostSuffix}`)) {
18
- return override.headers;
21
+ return override;
19
22
  }
20
23
  }
21
- return {};
24
+ return void 0;
22
25
  }
23
26
  function getFetchProxyTargetHeaders(targetUrl) {
27
+ const hostOverrides = headerOverridesFor(targetUrl.hostname);
24
28
  return {
25
29
  "accept-encoding": "identity",
26
- "user-agent": FETCH_PROXY_BROWSER_USER_AGENT,
27
- ...headerOverridesFor(targetUrl.hostname)
30
+ ...hostOverrides?.suppressBrowserUserAgent ? {} : { "user-agent": FETCH_PROXY_BROWSER_USER_AGENT },
31
+ ...hostOverrides?.headers
28
32
  };
29
33
  }
30
34
  export {
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.127 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.129 | (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.127 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.129 | (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.127 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.129 | (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.127 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.129 | (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.127 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.129 | (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.127 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.129 | (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.127 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.129 | (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.127 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.129 | (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;
@@ -70,6 +70,7 @@ __export(sdk_exports, {
70
70
  isTapSuccess: () => isTapSuccess,
71
71
  rankInteractive: () => rankInteractive,
72
72
  readyProbeHasContent: () => readyProbeHasContent,
73
+ readyProbeHasTargetContent: () => readyProbeHasTargetContent,
73
74
  resolveFindMode: () => resolveFindMode,
74
75
  resolveMaxMsFlag: () => resolveMaxMsFlag,
75
76
  scoreInteractive: () => scoreInteractive,
@@ -253,6 +254,39 @@ var LAYOUT_GET_NATIVE_EVAL = `(async () => {
253
254
  const n = typeof raw === 'number' ? raw : (typeof raw === 'string' ? parseFloat(raw) : NaN)
254
255
  return Number.isFinite(n) ? Math.round(n) : 0
255
256
  }
257
+ // styling extractors \u2014 omit boring defaults so the agent only sees notable
258
+ // styling (low opacity, struck text, clipping, a real border/color).
259
+ const colorStr = (v) => {
260
+ if (v == null) return undefined
261
+ const s = String(v).split(' ').join('')
262
+ return s && s !== 'transparent' && s !== 'rgba(0,0,0,0)' ? s : undefined
263
+ }
264
+ const opacityOf = (style) => {
265
+ const o = style && style.opacity
266
+ const n = typeof o === 'number' ? o : (typeof o === 'string' ? parseFloat(o) : NaN)
267
+ return Number.isFinite(n) && n < 1 ? Math.round(n * 100) / 100 : undefined
268
+ }
269
+ const weightOf = (style) => {
270
+ const w = style && style.fontWeight
271
+ const n = typeof w === 'number' ? w : (typeof w === 'string' ? parseInt(w, 10) : NaN)
272
+ return Number.isFinite(n) && n >= 600 ? n : undefined
273
+ }
274
+ const decoOf = (style) => {
275
+ const d = style && (style.textDecorationLine || style.textDecoration)
276
+ return d && d !== 'none' && d !== 'normal' ? String(d).split(' ')[0] : undefined
277
+ }
278
+ const overflowOf = (style) => (style && style.overflow === 'hidden' ? 'hidden' : undefined)
279
+ const borderWOf = (style) => {
280
+ if (!style) return undefined
281
+ const keys = ['borderWidth','borderTopWidth','borderBottomWidth','borderLeftWidth','borderRightWidth']
282
+ let max = 0
283
+ for (const k of keys) {
284
+ const r = style[k]
285
+ const n = typeof r === 'number' ? r : (typeof r === 'string' ? parseFloat(r) : NaN)
286
+ if (Number.isFinite(n)) max = Math.max(max, n)
287
+ }
288
+ return max > 0 ? Math.round(max) : undefined
289
+ }
256
290
 
257
291
  const isVisible = (n) => {
258
292
  const layout = n && n.layout
@@ -283,6 +317,13 @@ var LAYOUT_GET_NATIVE_EVAL = `(async () => {
283
317
  borderRadius: radiusOf(style),
284
318
  padding: { t: round(pad.top), r: round(pad.right), b: round(pad.bottom), l: round(pad.left) },
285
319
  fontSize: fontSizeOf(style),
320
+ color: text ? colorStr(style.color) : undefined,
321
+ bg: colorStr(style.backgroundColor),
322
+ opacity: opacityOf(style),
323
+ fontWeight: weightOf(style),
324
+ textDecoration: decoOf(style),
325
+ overflow: overflowOf(style),
326
+ borderWidth: borderWOf(style),
286
327
  }
287
328
  })
288
329
  })()`;
@@ -290,7 +331,7 @@ async function inspectGetLayout(bridge) {
290
331
  const raw = await bridge.send({ type: "evaluate", code: LAYOUT_GET_NATIVE_EVAL });
291
332
  return Array.isArray(raw) ? raw : [];
292
333
  }
293
- function formatLayoutElements(elements) {
334
+ function formatLayoutElements(elements, opts) {
294
335
  if (elements.length === 0) return " no visible elements found";
295
336
  const lines = elements.map((el) => {
296
337
  const ident = el.testID ? `#${el.testID}` : el.selector ? el.selector : el.role ? `[${el.role}]` : `<${el.type}>`;
@@ -302,6 +343,15 @@ function formatLayoutElements(elements) {
302
343
  parts.push(uniform ? `pad:${p.t}` : `pad:${p.t},${p.r},${p.b},${p.l}`);
303
344
  }
304
345
  if (el.fontSize > 0) parts.push(`font:${el.fontSize}`);
346
+ if (opts?.styling) {
347
+ if (el.fontWeight) parts.push(`weight:${el.fontWeight}`);
348
+ if (el.color) parts.push(`color:${el.color}`);
349
+ if (el.bg) parts.push(`bg:${el.bg}`);
350
+ if (el.opacity != null) parts.push(`opacity:${el.opacity}`);
351
+ if (el.textDecoration) parts.push(`deco:${el.textDecoration}`);
352
+ if (el.overflow) parts.push(`overflow:${el.overflow}`);
353
+ if (el.borderWidth) parts.push(`border:${el.borderWidth}`);
354
+ }
305
355
  if (el.text) {
306
356
  const text = el.text.length > 40 ? `${el.text.slice(0, 39)}\u2026` : el.text;
307
357
  parts.push(`"${text}"`);
@@ -686,8 +736,11 @@ var WAIT_READY_PROGRESS_INTERVAL_MS = 2e3;
686
736
  function readyProbeHasContent(probe) {
687
737
  return probe.targets > 0 || probe.nodes >= READY_CONTENT_NODE_FLOOR;
688
738
  }
739
+ function readyProbeHasTargetContent(probe) {
740
+ return probe.targets > 0;
741
+ }
689
742
  function waitReadyReason(status) {
690
- return status.externalError ? `guest app errored: ${status.externalError}` : status.loadingText ? `still showing "${status.loadingText}"` : status.externalReady === false ? "guest app is still loading" : status.flag !== true ? "guest app has not emitted sootsim:externalAppReady" : status.targets <= 0 ? "ready flag emitted but no visible app content is inspectable yet" : "node tree is still changing";
743
+ return status.externalError ? `guest app errored: ${status.externalError}` : status.loadingText ? `still showing "${status.loadingText}"` : status.externalReady === false ? "guest app is still loading" : status.flag !== true && status.targets > 0 ? "native content is rendered but the ready signal has not settled" : status.flag !== true ? "guest app has not emitted sootsim:externalAppReady" : status.targets <= 0 ? "ready flag emitted but no visible app content is inspectable yet" : "node tree is still changing";
691
744
  }
692
745
  async function inspectWaitReady(bridge, timeoutMs = 2e4, options = {}) {
693
746
  const start = Date.now();
@@ -729,14 +782,14 @@ async function inspectWaitReady(bridge, timeoutMs = 2e4, options = {}) {
729
782
  lastNodes = last.nodes;
730
783
  nodeStableSince = now;
731
784
  }
732
- if (last.flag === true) {
733
- if (last.externalReady !== false && !last.externalError && !last.loadingText && readyProbeHasContent(last)) {
734
- if (now - nodeStableSince >= READY_NODE_STABLE_MS) {
735
- return {
736
- ...status,
737
- ready: true
738
- };
739
- }
785
+ const hasReadySignal = last.flag === true && readyProbeHasContent(last);
786
+ const hasRenderedContentWithoutReadySignal = last.flag !== true && readyProbeHasTargetContent(last);
787
+ if ((hasReadySignal || hasRenderedContentWithoutReadySignal) && last.externalReady !== false && !last.externalError && !last.loadingText) {
788
+ if (now - nodeStableSince >= READY_NODE_STABLE_MS) {
789
+ return {
790
+ ...status,
791
+ ready: true
792
+ };
740
793
  }
741
794
  }
742
795
  if (options.onProgress && progressIntervalMs > 0 && now >= nextProgressAt) {
@@ -1731,6 +1784,7 @@ async function tapBest(bridge, query, opts = {}) {
1731
1784
  isTapSuccess,
1732
1785
  rankInteractive,
1733
1786
  readyProbeHasContent,
1787
+ readyProbeHasTargetContent,
1734
1788
  resolveFindMode,
1735
1789
  resolveMaxMsFlag,
1736
1790
  scoreInteractive,