sootsim 0.1.119 → 0.1.121

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (146) hide show
  1. package/dist-cli/bin.js +3 -3
  2. package/dist-cli/chunks/{agent-HMYFFW3K.js → agent-NZ4A6JKO.js} +2 -2
  3. package/dist-cli/chunks/{agent-wrapper-L5TRN5OW.js → agent-wrapper-CYQ5L2YH.js} +2 -2
  4. package/dist-cli/chunks/{app-fonts-G5L5BPHX.js → app-fonts-2DF4NW5D.js} +2 -2
  5. package/dist-cli/chunks/{assert-MN4TCTKK.js → assert-PASM5PLL.js} +2 -2
  6. package/dist-cli/chunks/auto-bootstrap-IPNK6GF7.js +2 -0
  7. package/dist-cli/chunks/beta-RG7JT6HD.js +2 -0
  8. package/dist-cli/chunks/chunk-2FTVPI7F.js +2 -0
  9. package/dist-cli/chunks/{chunk-XYT2OO4N.js → chunk-2U4CGOD6.js} +1 -1
  10. package/dist-cli/chunks/{chunk-TGLPBQ4D.js → chunk-3A7SRWSQ.js} +2 -2
  11. package/dist-cli/chunks/{chunk-LB7BYFMF.js → chunk-3DDNLPIH.js} +2 -2
  12. package/dist-cli/chunks/{chunk-4KU7AIP7.js → chunk-3WDN2S2A.js} +1 -1
  13. package/dist-cli/chunks/{chunk-ZX4FJNIW.js → chunk-4BXESMZ7.js} +1 -1
  14. package/dist-cli/chunks/{chunk-H4F45EGT.js → chunk-4UQMPWDA.js} +1 -1
  15. package/dist-cli/chunks/{chunk-RF2STDGD.js → chunk-5OA35LZX.js} +2 -2
  16. package/dist-cli/chunks/{chunk-JFHETXYV.js → chunk-7CA63OS4.js} +1 -1
  17. package/dist-cli/chunks/{chunk-MNILEOSP.js → chunk-7RXO4KKF.js} +1 -1
  18. package/dist-cli/chunks/{chunk-O552XDE7.js → chunk-B77PWTHR.js} +2 -2
  19. package/dist-cli/chunks/chunk-BTWXWUDB.js +1 -0
  20. package/dist-cli/chunks/{chunk-3MWC6EE2.js → chunk-CGB6KRKN.js} +2 -2
  21. package/dist-cli/chunks/{chunk-EIAYJLBW.js → chunk-DORQQNP4.js} +2 -2
  22. package/dist-cli/chunks/{chunk-TUJWNKG4.js → chunk-GU3MWKJY.js} +1 -1
  23. package/dist-cli/chunks/{chunk-BBLE5DMP.js → chunk-I26R4PE2.js} +1 -1
  24. package/dist-cli/chunks/{chunk-GEPWAAGG.js → chunk-IQNZPHGD.js} +2 -2
  25. package/dist-cli/chunks/{chunk-47SB3JEW.js → chunk-KTE2VIXH.js} +3 -3
  26. package/dist-cli/chunks/chunk-KXLYXKMA.js +1 -0
  27. package/dist-cli/chunks/{chunk-QMU4MAG3.js → chunk-KY6NY6WN.js} +1 -1
  28. package/dist-cli/chunks/{chunk-C3VO2MSV.js → chunk-LT2X5ISU.js} +2 -2
  29. package/dist-cli/chunks/{chunk-J6UPVQ37.js → chunk-MSU27JEW.js} +2 -2
  30. package/dist-cli/chunks/{chunk-475TNRB7.js → chunk-MUTDER75.js} +2 -2
  31. package/dist-cli/chunks/{chunk-WNK5XRWG.js → chunk-NQ4EDJV4.js} +2 -2
  32. package/dist-cli/chunks/{chunk-DE6JMHEW.js → chunk-OBYYAT4F.js} +2 -2
  33. package/dist-cli/chunks/{chunk-APWX6YCC.js → chunk-OEV7EOMC.js} +2 -2
  34. package/dist-cli/chunks/{chunk-O7SJH4E7.js → chunk-PMAKUYYK.js} +2 -2
  35. package/dist-cli/chunks/{chunk-OS62SSOF.js → chunk-QNQO5VHO.js} +9 -9
  36. package/dist-cli/chunks/chunk-QUEATUWT.js +1 -0
  37. package/dist-cli/chunks/{chunk-5OZHLK4L.js → chunk-RVWJ3TAE.js} +2 -2
  38. package/dist-cli/chunks/{chunk-AV6YDPVF.js → chunk-SA5RP334.js} +2 -2
  39. package/dist-cli/chunks/{chunk-RAWQNHKI.js → chunk-SF6W3FRS.js} +1 -1
  40. package/dist-cli/chunks/{chunk-AUKEEPZT.js → chunk-SRA2TVCG.js} +1 -1
  41. package/dist-cli/chunks/{chunk-JP3PNWTD.js → chunk-VALW4SKE.js} +1 -1
  42. package/dist-cli/chunks/{chunk-FUUXRMXG.js → chunk-VJPN6DQU.js} +2 -2
  43. package/dist-cli/chunks/{chunk-MJQXUHDS.js → chunk-VSKLWCFM.js} +2 -2
  44. package/dist-cli/chunks/{chunk-CHHBZJBH.js → chunk-VSRV5LFU.js} +1 -1
  45. package/dist-cli/chunks/{chunk-SSQWBV2F.js → chunk-VX5CAWLC.js} +2 -2
  46. package/dist-cli/chunks/{chunk-YZ6MQTDJ.js → chunk-W3FBNBTX.js} +2 -2
  47. package/dist-cli/chunks/{chunk-BZH7FKZZ.js → chunk-WHL7FMLG.js} +84 -27
  48. package/dist-cli/chunks/{chunk-FCRJNHIA.js → chunk-X4LYRBLZ.js} +1 -1
  49. package/dist-cli/chunks/{chunk-4EQ5V4CA.js → chunk-Y7ZMV3PG.js} +1 -1
  50. package/dist-cli/chunks/{chunk-YBRJSW5C.js → chunk-YQIFU3PB.js} +3 -3
  51. package/dist-cli/chunks/{chunk-HPTOFA3Y.js → chunk-Z47GWZMZ.js} +3 -3
  52. package/dist-cli/chunks/cli-version-DPV7EKFK.js +2 -0
  53. package/dist-cli/chunks/{compat-3C3O2TKY.js → compat-FMBQL2CX.js} +3 -3
  54. package/dist-cli/chunks/{config-TEO7DXWJ.js → config-JD23SW7N.js} +2 -2
  55. package/dist-cli/chunks/control-IAHPU5HD.js +2 -0
  56. package/dist-cli/chunks/{cpu-profile-QSFGY7HA.js → cpu-profile-2Z4KGCAE.js} +2 -2
  57. package/dist-cli/chunks/{daemon-R2TQX4HR.js → daemon-NDO6JPDH.js} +2 -2
  58. package/dist-cli/chunks/{debug-UMLASBX2.js → debug-RBVMEH33.js} +3 -3
  59. package/dist-cli/chunks/{detox-Y6TFEKQU.js → detox-TBJAZEBB.js} +2 -2
  60. package/dist-cli/chunks/{device-4NBQC4LP.js → device-26YM4HM7.js} +2 -2
  61. package/dist-cli/chunks/{diagnose-DKXPE4P6.js → diagnose-PW7FGUOI.js} +2 -2
  62. package/dist-cli/chunks/drivers-L6UY2JC6.js +2 -0
  63. package/dist-cli/chunks/{electron-3AZTVV3N.js → electron-TBMZ3C5I.js} +3 -3
  64. package/dist-cli/chunks/flow-QSDMMKNZ.js +2 -0
  65. package/dist-cli/chunks/help-OC7HYZ5F.js +2 -0
  66. package/dist-cli/chunks/{hints-K323Q4NQ.js → hints-Q3I4PXMT.js} +2 -2
  67. package/dist-cli/chunks/{home-paths-H7GUBJAB.js → home-paths-P5GMZADH.js} +2 -2
  68. package/dist-cli/chunks/{inspect-UJFYMPE5.js → inspect-UTHL2UK4.js} +55 -58
  69. package/dist-cli/chunks/install-3UWGXX6F.js +2 -0
  70. package/dist-cli/chunks/{install-desktop-NT5QJIPD.js → install-desktop-XQYE3QYC.js} +3 -3
  71. package/dist-cli/chunks/{keys-OJVAQQK5.js → keys-75OBQ7OF.js} +2 -2
  72. package/dist-cli/chunks/{launch-VMMQENF6.js → launch-TFE3CZZ3.js} +3 -3
  73. package/dist-cli/chunks/{login-CRJE2OZK.js → login-EIL5PLK4.js} +4 -4
  74. package/dist-cli/chunks/{logout-3DXVRPLM.js → logout-2DXPOPWE.js} +2 -2
  75. package/dist-cli/chunks/{maestro-FPDCZ3NO.js → maestro-Q27CNJGT.js} +2 -2
  76. package/dist-cli/chunks/{preview-7WLF767D.js → preview-ZGVCXKQZ.js} +2 -2
  77. package/dist-cli/chunks/{profile-DE5LJZ5Y.js → profile-TCX6GYV5.js} +2 -2
  78. package/dist-cli/chunks/{react-HLRPZFFH.js → react-24D26RLU.js} +2 -2
  79. package/dist-cli/chunks/{record-VQAG2YYZ.js → record-3MODR5RQ.js} +2 -2
  80. package/dist-cli/chunks/runtime-5MJPHLRZ.js +2 -0
  81. package/dist-cli/chunks/{runtime-delivery-O2WD2RT6.js → runtime-delivery-NWSDCFAI.js} +2 -2
  82. package/dist-cli/chunks/{screenshot-HYSJVWYN.js → screenshot-4A6JTLUV.js} +2 -2
  83. package/dist-cli/chunks/{screenshot-mode-ME7WKY7S.js → screenshot-mode-KVMXLFJ4.js} +2 -2
  84. package/dist-cli/chunks/{screenshots-5MY3SHOW.js → screenshots-XGG6PNXW.js} +2 -2
  85. package/dist-cli/chunks/{server-LRSX4VKM.js → server-MRLLYDV7.js} +2 -2
  86. package/dist-cli/chunks/setup-repo-OUMNEC36.js +2 -0
  87. package/dist-cli/chunks/{skills-SHJHDYYU.js → skills-COR2GQRN.js} +2 -2
  88. package/dist-cli/chunks/{start-FBIHKRWV.js → start-SD27AJ7E.js} +4 -4
  89. package/dist-cli/chunks/store-JVV7G7VY.js +2 -0
  90. package/dist-cli/chunks/telemetry-BMJNBZT6.js +2 -0
  91. package/dist-cli/chunks/{test-W5VLOO6C.js → test-4N6K3C5R.js} +3 -3
  92. package/dist-cli/chunks/{three-mode-OILRSRAU.js → three-mode-PJQGXIP4.js} +2 -2
  93. package/dist-cli/chunks/{timeline-H4SFNSBA.js → timeline-C7JSMHCV.js} +2 -2
  94. package/dist-cli/chunks/{upgrade-4SYAHMAP.js → upgrade-SFUV6KPW.js} +2 -2
  95. package/dist-cli/chunks/upload-XQLVCUKI.js +2 -0
  96. package/dist-cli/chunks/{web-UXTXQNYW.js → web-GK27H4NM.js} +2 -2
  97. package/dist-cli/chunks/what-happened-GAY54LBV.js +22 -0
  98. package/dist-cli/chunks/{whoami-QDFN5LHP.js → whoami-C2WULTLS.js} +2 -2
  99. package/dist-lib/agent-daemon-client.cjs +1 -1
  100. package/dist-lib/agent-events.cjs +1 -1
  101. package/dist-lib/agent-sessions.cjs +1 -1
  102. package/dist-lib/attached-projects.cjs +1 -1
  103. package/dist-lib/auth/shared-session.cjs +1 -1
  104. package/dist-lib/backend-origin.cjs +1 -1
  105. package/dist-lib/beta.cjs +1 -1
  106. package/dist-lib/beta.mjs +1 -1
  107. package/dist-lib/bridge-constants.cjs +1 -1
  108. package/dist-lib/cli-constants.cjs +1 -1
  109. package/dist-lib/config.cjs +1 -1
  110. package/dist-lib/detox/index.cjs +1 -1
  111. package/dist-lib/dev-bundle-resolution.cjs +1 -1
  112. package/dist-lib/home-paths.cjs +1 -1
  113. package/dist-lib/host/bridge-host.cjs +1 -1
  114. package/dist-lib/host/fetch-proxy-handler.cjs +1 -1
  115. package/dist-lib/host/fetch-proxy-overrides.cjs +1 -1
  116. package/dist-lib/host/fetch-proxy-overrides.mjs +1 -1
  117. package/dist-lib/host/websocket-proxy.cjs +1 -1
  118. package/dist-lib/index.cjs +1 -1
  119. package/dist-lib/metro.cjs +1 -1
  120. package/dist-lib/profiles.cjs +1 -1
  121. package/dist-lib/render-mode.cjs +1 -1
  122. package/dist-lib/scripts/demo-app-registry.cjs +1 -1
  123. package/dist-lib/scripts/dev-server-scanner.cjs +1 -1
  124. package/dist-lib/sdk.cjs +143 -5
  125. package/dist-lib/sdk.mjs +138 -5
  126. package/dist-lib/skills.cjs +1 -1
  127. package/dist-lib/vite.cjs +1 -1
  128. package/package.json +1 -1
  129. package/dist-cli/chunks/auto-bootstrap-QJ5PP7KT.js +0 -2
  130. package/dist-cli/chunks/beta-LAPRQ3TP.js +0 -2
  131. package/dist-cli/chunks/chunk-5AL4WWUG.js +0 -1
  132. package/dist-cli/chunks/chunk-IKVDJYRI.js +0 -2
  133. package/dist-cli/chunks/chunk-RIMNMM3O.js +0 -1
  134. package/dist-cli/chunks/chunk-YPLXVVG4.js +0 -1
  135. package/dist-cli/chunks/cli-version-JKOW3OL3.js +0 -2
  136. package/dist-cli/chunks/control-UUSQA7VO.js +0 -2
  137. package/dist-cli/chunks/drivers-TFUZRRDZ.js +0 -2
  138. package/dist-cli/chunks/flow-744L27RP.js +0 -2
  139. package/dist-cli/chunks/help-JUP3UEFR.js +0 -2
  140. package/dist-cli/chunks/install-D5J5LA2V.js +0 -2
  141. package/dist-cli/chunks/runtime-LBAJOT4M.js +0 -2
  142. package/dist-cli/chunks/setup-repo-5FHT7B6J.js +0 -2
  143. package/dist-cli/chunks/store-ZSAUNVP6.js +0 -2
  144. package/dist-cli/chunks/telemetry-E2ZAX2C6.js +0 -2
  145. package/dist-cli/chunks/upload-NPGWC7E5.js +0 -2
  146. package/dist-cli/chunks/what-happened-SNC6DEIJ.js +0 -22
@@ -0,0 +1,22 @@
1
+ /*! sootsim v0.1.121 | (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-WHL7FMLG.js";import{c as N,e as F}from"./chunk-NQ4EDJV4.js";import{b as k}from"./chunk-SF6W3FRS.js";import"./chunk-KY6NY6WN.js";import"./chunk-4BXESMZ7.js";import"./chunk-SRA2TVCG.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
+ sootsim what-happened \u2014 show recent events from the semantic timeline
4
+
5
+ usage:
6
+ sootsim what-happened # since last CLI call
7
+ sootsim what-happened --summary # one-line counts
8
+ sootsim what-happened --all # full ring (ignore cursor)
9
+ sootsim what-happened --since 5s # absolute window
10
+ sootsim what-happened --kinds toast,fetch
11
+ sootsim what-happened --noisy # include react-commit/layout/scroll
12
+ sootsim what-happened --limit 50
13
+ sootsim what-happened --json
14
+ sootsim what-happened --no-advance # don't advance cursor after read
15
+
16
+ note: by default react-commit, layout, and scroll events are hidden as
17
+ noise \u2014 pass --noisy or include them in --kinds to see them.
18
+ `),process.exit(0));let s=n.includes("--summary"),l=n.includes("--flow"),i=n.includes("--all"),r=n.includes("--json"),u=n.includes("--no-advance"),v=n.includes("--noisy"),{since:a}=O(n),{kinds:d}=B(n),{limit:C}=D(n),g=k(),$={limit:C??200,...d&&d.length?{kinds:d}:{},...a!==void 0?{since:a}:i?{}:{sinceCursor:g}},h=F(e);try{if(s){let c=await T(h,$);if(r)console.log(JSON.stringify(c));else{let m=i?"all time":a!==void 0?`last ${((Date.now()-a)/1e3).toFixed(1)}s`:"since last call";console.log(` ${m}: ${_(c)}`)}!u&&!i&&c.lastAt&&await y(h,g,c.lastAt);return}let o=await A(h,$),E=Array.isArray(d)&&d.some(c=>b.has(c)),I=!v&&!E,f=0;if(I){let c=o.events.filter(m=>b.has(m.kind)?(f+=1,!1):!0);o.events=c}if(r)console.log(JSON.stringify(l?x(o.events):o,null,2));else{if(o.events.length===0)f>0?console.log(` no non-noise events (${f} react-commit/layout/scroll hidden)`):console.log(i?" no events recorded":a!==void 0?" no events in window":" no new events since last call");else if(l){let c=o.events[0]?.t??null,m=x(o.events),w=i?`\u2500\u2500\u2500 ${o.events.length} event(s) total \u2014 flow view \u2500\u2500\u2500`:a!==void 0?`\u2500\u2500\u2500 ${o.events.length} event(s) in last ${((Date.now()-a)/1e3).toFixed(1)}s \u2014 flow view \u2500\u2500\u2500`:`\u2500\u2500\u2500 ${o.events.length} event(s) since last call \u2014 flow view \u2500\u2500\u2500`;console.log(` ${w}`);for(let p of m){console.log(`
19
+ \u2500\u2500 ${p.label} (${p.events.length} event${p.events.length===1?"":"s"}) \u2500\u2500`);for(let M of p.events)console.log(S(M,c))}}else{let c=o.events[0]?.t??null,m=i?`\u2500\u2500\u2500 ${o.events.length} event(s) total \u2500\u2500\u2500`:a!==void 0?`\u2500\u2500\u2500 ${o.events.length} event(s) in last ${((Date.now()-a)/1e3).toFixed(1)}s \u2500\u2500\u2500`:`\u2500\u2500\u2500 ${o.events.length} event(s) since last call \u2500\u2500\u2500`;console.log(` ${m}`);for(let w of o.events)console.log(S(w,c))}f>0&&o.events.length>0&&process.stderr.write(`
20
+ ${f} high-frequency event(s) hidden (react-commit/layout/scroll)
21
+ rerun with --noisy or --kinds react-commit,layout,scroll to include them
22
+ `)}!u&&!i&&o.watermark>0&&await y(h,g,o.watermark)}finally{h.close()}}export{J as runWhatHappened};
@@ -1,2 +1,2 @@
1
- /*! sootsim v0.1.119 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{d as i}from"./chunk-APWX6YCC.js";import{d as n}from"./chunk-AV6YDPVF.js";import"./chunk-ZX4FJNIW.js";import"./chunk-AUKEEPZT.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.121 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
+ import{d as i}from"./chunk-OEV7EOMC.js";import{d as n}from"./chunk-SA5RP334.js";import"./chunk-4BXESMZ7.js";import"./chunk-SRA2TVCG.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.119 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.121 | (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.119 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.121 | (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.119 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.121 | (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.119 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.121 | (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.119 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.121 | (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.119 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.121 | (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.119 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.121 | (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.119 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.121 | (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.119 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.121 | (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.119 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.121 | (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.119 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.121 | (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.119 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.121 | (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.119 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.121 | (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.119 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.121 | (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.119 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.121 | (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.119 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.121 | (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.119 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.121 | (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.119 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.121 | (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.119 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.121 | (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.119 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.121 | (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.119 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.121 | (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.119 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.121 | (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.119 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.121 | (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.119 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.121 | (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.119 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.121 | (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.119 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.121 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
@@ -24,6 +24,8 @@ var sdk_exports = {};
24
24
  __export(sdk_exports, {
25
25
  DEBUG_CHANNELS: () => DEBUG_CHANNELS,
26
26
  LAYOUT_GET_NATIVE_EVAL: () => LAYOUT_GET_NATIVE_EVAL,
27
+ MERGED_CONSOLE_COUNT_EVAL: () => MERGED_CONSOLE_COUNT_EVAL,
28
+ NOISY_TIMELINE_KINDS: () => NOISY_TIMELINE_KINDS,
27
29
  READY_CONTENT_NODE_FLOOR: () => READY_CONTENT_NODE_FLOOR,
28
30
  READY_NODE_STABLE_MS: () => READY_NODE_STABLE_MS,
29
31
  WAIT_READY_PROBE: () => WAIT_READY_PROBE,
@@ -33,6 +35,9 @@ __export(sdk_exports, {
33
35
  clearRequests: () => clearRequests,
34
36
  filterLogEntries: () => filterLogEntries,
35
37
  formatLayoutElements: () => formatLayoutElements,
38
+ formatTimelineEvent: () => formatTimelineEvent,
39
+ formatTimelineEvents: () => formatTimelineEvents,
40
+ formatTimelinePayload: () => formatTimelinePayload,
36
41
  formatTimelineSummary: () => formatTimelineSummary,
37
42
  getShellState: () => getShellState,
38
43
  inspectAccessibilityTree: () => inspectAccessibilityTree,
@@ -708,7 +713,17 @@ async function inspectWaitSelector(bridge, testId, timeoutMs = 5e3, opts = {}) {
708
713
  const t = window.__sootsimTest
709
714
  if (!t) return undefined // bridge not ready \u2014 indeterminate, not "gone"
710
715
  try {
711
- const matches = await t.queryAll?.({ hasId: ID, pruneHidden: true })
716
+ // gone-mode confirms a gate/screen LEFT \u2014 it only needs structural
717
+ // existence + layout, NOT the full-tree occlusion pass (pruneHidden).
718
+ // that pass (computeOccludedInspectNodeIds) walks the whole tree and
719
+ // does O(n\xB2)-ish rect-occlusion testing EVERY poll; on a large
720
+ // post-login app tree it costs seconds per poll, so --gone can never
721
+ // get two clean "absent" polls inside budget and falsely reports the
722
+ // gate as still blocked \u2014 the root cause of the 3pc PR-preview outage.
723
+ // presence-mode keeps pruneHidden so "appeared" still means
724
+ // visibly-reachable. a departed gate is unmounted or zero-sized, so the
725
+ // cheap structural+layout check is correct here and ~O(n) cheap.
726
+ const matches = await t.queryAll?.(gone ? { hasId: ID } : { hasId: ID, pruneHidden: true })
712
727
  if (!Array.isArray(matches)) return undefined
713
728
  return matches.find(present) || null
714
729
  } catch {
@@ -739,24 +754,76 @@ async function inspectWaitSelector(bridge, testId, timeoutMs = 5e3, opts = {}) {
739
754
  );
740
755
  return result ?? { found: false, elapsed: timeoutMs };
741
756
  }
757
+ function consoleEntriesEval(level, limit) {
758
+ const getter = level === "error" ? "getErrors" : "getWarnings";
759
+ return `(() => {
760
+ const out = []
761
+ const seen = new Set()
762
+ const norm = (s) => (typeof s === 'string' ? s : (() => { try { return JSON.stringify(s) } catch { return String(s) } })())
763
+ const key = (ts, args) => Math.round((ts || 0) / 250) + '|' + (Array.isArray(args) ? args.map(norm).join(' ') : norm(args))
764
+ const push = (e) => {
765
+ if (!e) return
766
+ const ts = typeof e.timestamp === 'number' ? e.timestamp : (typeof e.ts === 'number' ? e.ts : 0)
767
+ const k = key(ts, e.args)
768
+ if (seen.has(k)) return
769
+ seen.add(k)
770
+ out.push({ timestamp: ts, args: Array.isArray(e.args) ? e.args : [e.args], stack: e.stack || undefined, source: e.source || undefined })
771
+ }
772
+ // page-realm ws-bridge buffer first (richest stacks for page-origin errors)
773
+ try { for (const e of (window.__sootsimConsole?.${getter}(${limit}) || [])) push(e) } catch {}
774
+ // engine observability store \u2014 the always-on render-worker / forwarded path
775
+ try {
776
+ const obs = window.__sootsimObservability
777
+ const snap = obs && obs.logs && typeof obs.logs.getSnapshot === 'function' ? obs.logs.getSnapshot() : []
778
+ for (const e of snap) if (e && e.level === ${JSON.stringify(level)}) push(e)
779
+ } catch {}
780
+ return out.sort((a, b) => (a.timestamp || 0) - (b.timestamp || 0)).slice(-${limit})
781
+ })()`;
782
+ }
742
783
  async function inspectErrors(bridge, limit = 20) {
743
784
  const result = await bridge.send({
744
785
  type: "evaluate",
745
- code: `window.__sootsimConsole?.getErrors(${limit}) || []`
786
+ code: consoleEntriesEval("error", limit)
746
787
  });
747
788
  return Array.isArray(result) ? result : [];
748
789
  }
749
790
  async function inspectWarnings(bridge, limit = 20) {
750
791
  const result = await bridge.send({
751
792
  type: "evaluate",
752
- code: `window.__sootsimConsole?.getWarnings(${limit}) || []`
793
+ code: consoleEntriesEval("warn", limit)
753
794
  });
754
795
  return Array.isArray(result) ? result : [];
755
796
  }
797
+ var MERGED_CONSOLE_COUNT_EVAL = `(() => {
798
+ const norm = (s) => (typeof s === 'string' ? s : (() => { try { return JSON.stringify(s) } catch { return String(s) } })())
799
+ const key = (lvl, ts, args) => lvl + '|' + Math.round((ts || 0) / 250) + '|' + (Array.isArray(args) ? args.map(norm).join(' ') : norm(args))
800
+ const seen = new Set()
801
+ let errors = 0
802
+ let warnings = 0
803
+ const add = (lvl, ts, args) => {
804
+ if (lvl !== 'error' && lvl !== 'warn') return
805
+ const k = key(lvl, ts, args)
806
+ if (seen.has(k)) return
807
+ seen.add(k)
808
+ if (lvl === 'error') errors++
809
+ else warnings++
810
+ }
811
+ try {
812
+ const c = window.__sootsimConsole
813
+ for (const e of (c?.getErrors?.(200) || [])) add('error', e?.timestamp ?? e?.ts, e?.args)
814
+ for (const e of (c?.getWarnings?.(200) || [])) add('warn', e?.timestamp ?? e?.ts, e?.args)
815
+ } catch {}
816
+ try {
817
+ const obs = window.__sootsimObservability
818
+ const snap = obs && obs.logs && typeof obs.logs.getSnapshot === 'function' ? obs.logs.getSnapshot() : []
819
+ for (const e of snap) if (e) add(e.level, e.ts, e.args)
820
+ } catch {}
821
+ return { errors, warnings, total: errors + warnings }
822
+ })()`;
756
823
  async function clearConsole(bridge) {
757
824
  await bridge.send({
758
825
  type: "evaluate",
759
- code: 'window.__sootsimConsole?.clear(); "cleared"'
826
+ code: 'window.__sootsimConsole?.clear(); window.__sootsimObservability?.logs?.clear?.(); "cleared"'
760
827
  });
761
828
  }
762
829
  async function inspectRequests(bridge, opts = {}) {
@@ -1014,6 +1081,72 @@ function formatTimelineSummary(summary) {
1014
1081
  }
1015
1082
  return parts.join(" \xB7 ");
1016
1083
  }
1084
+ var NOISY_TIMELINE_KINDS = /* @__PURE__ */ new Set([
1085
+ "react-commit",
1086
+ "layout",
1087
+ "scroll"
1088
+ ]);
1089
+ function formatTimelineRelativeTime(t, anchor) {
1090
+ if (anchor === null) return new Date(t).toLocaleTimeString();
1091
+ const dt = (t - anchor) / 1e3;
1092
+ const sign = dt >= 0 ? "+" : "";
1093
+ return `${sign}${dt.toFixed(2)}s`;
1094
+ }
1095
+ function formatTimelinePayload(kind, d) {
1096
+ switch (kind) {
1097
+ case "app-launch":
1098
+ return d.phase === "launch" ? `launch ${d.appName ?? d.toAppId ?? ""}` : `dismiss ${d.appName ?? d.fromAppId ?? ""} \u2192 ${d.toAppId ?? ""}`;
1099
+ case "toast":
1100
+ return `"${d.text ?? ""}"${d.durationMs ? ` (${d.durationMs}ms)` : ""}`;
1101
+ case "keyboard":
1102
+ return `${d.phase ?? "?"}${d.heightPx ? ` h=${d.heightPx}` : ""}${d.mode ? ` ${d.mode}` : ""}`;
1103
+ case "screen":
1104
+ return `${d.phase ?? "?"} ${d.name ?? d.activeName ?? ""}`;
1105
+ case "route":
1106
+ return `${d.phase ?? "?"} ${d.path ?? d.pathname ?? ""}`;
1107
+ case "alert":
1108
+ case "actionsheet":
1109
+ case "picker":
1110
+ return `${d.phase ?? "?"} ${d.title ?? d.message ?? ""}`;
1111
+ case "notification":
1112
+ return `${d.title ?? ""}${d.body ? ` \u2014 ${d.body}` : ""}`;
1113
+ case "fetch":
1114
+ return `${d.method ?? "GET"} ${d.url ?? ""}${d.status ? ` -> ${d.status}` : ""}`;
1115
+ case "console":
1116
+ return `${d.level ?? "log"}: ${(d.message ?? "").toString().slice(0, 120)}`;
1117
+ case "shell":
1118
+ return `${d.event ?? d.type ?? d.phase ?? ""}`;
1119
+ case "scroll":
1120
+ return `${d.phase ?? "?"} ${d.target ?? ""}`;
1121
+ case "gesture":
1122
+ return `${d.phase ?? "?"} ${d.type ?? ""}`;
1123
+ case "text-input":
1124
+ return `${d.phase ?? "?"}${d.value !== void 0 ? ` "${String(d.value).slice(0, 40)}"` : ""}`;
1125
+ case "layout":
1126
+ return `${d.kind ?? "?"} ${d.testID ?? d.type ?? ""}${d.skipped ? ` skipped:${d.reason ?? "unknown"}` : ""}`;
1127
+ case "react-commit": {
1128
+ const slowest = d.slowest;
1129
+ return `${d.fiberCount ?? "?"} fibers ${d.durationMs ?? "?"}ms${slowest?.displayName ? ` \xB7 ${slowest.displayName} ${slowest.durationMs ?? "?"}ms` : ""}`;
1130
+ }
1131
+ case "reanimated":
1132
+ case "animation":
1133
+ return `${d.kind ?? ""} ${d.target ?? ""}${d.durationMs ? ` ${d.durationMs}ms` : ""}`;
1134
+ }
1135
+ return "";
1136
+ }
1137
+ function formatTimelineEvent(event, anchor) {
1138
+ const ts = formatTimelineRelativeTime(event.t, anchor).padStart(8);
1139
+ const ctx = event.context.padEnd(6);
1140
+ const kind = `[${event.kind}]`.padEnd(15);
1141
+ const d = event.data;
1142
+ const payload = d && typeof d === "object" ? formatTimelinePayload(event.kind, d) : "";
1143
+ return ` ${ts} ${ctx} ${kind} ${payload}`;
1144
+ }
1145
+ function formatTimelineEvents(events) {
1146
+ if (!events.length) return "";
1147
+ const anchor = events[0]?.t ?? null;
1148
+ return events.map((e) => formatTimelineEvent(e, anchor)).join("\n");
1149
+ }
1017
1150
 
1018
1151
  // cli/commands/inspect/settling.ts
1019
1152
  async function waitForSootsimIdle({
@@ -1490,6 +1623,8 @@ async function tapBest(bridge, query, opts = {}) {
1490
1623
  0 && (module.exports = {
1491
1624
  DEBUG_CHANNELS,
1492
1625
  LAYOUT_GET_NATIVE_EVAL,
1626
+ MERGED_CONSOLE_COUNT_EVAL,
1627
+ NOISY_TIMELINE_KINDS,
1493
1628
  READY_CONTENT_NODE_FLOOR,
1494
1629
  READY_NODE_STABLE_MS,
1495
1630
  WAIT_READY_PROBE,
@@ -1499,6 +1634,9 @@ async function tapBest(bridge, query, opts = {}) {
1499
1634
  clearRequests,
1500
1635
  filterLogEntries,
1501
1636
  formatLayoutElements,
1637
+ formatTimelineEvent,
1638
+ formatTimelineEvents,
1639
+ formatTimelinePayload,
1502
1640
  formatTimelineSummary,
1503
1641
  getShellState,
1504
1642
  inspectAccessibilityTree,
package/dist-lib/sdk.mjs CHANGED
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.119 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.121 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
 
3
3
  // cli/commands/inspect/core.ts
4
4
  function resolveMaxMsFlag(args, fallbackMs) {
@@ -626,7 +626,17 @@ async function inspectWaitSelector(bridge, testId, timeoutMs = 5e3, opts = {}) {
626
626
  const t = window.__sootsimTest
627
627
  if (!t) return undefined // bridge not ready \u2014 indeterminate, not "gone"
628
628
  try {
629
- const matches = await t.queryAll?.({ hasId: ID, pruneHidden: true })
629
+ // gone-mode confirms a gate/screen LEFT \u2014 it only needs structural
630
+ // existence + layout, NOT the full-tree occlusion pass (pruneHidden).
631
+ // that pass (computeOccludedInspectNodeIds) walks the whole tree and
632
+ // does O(n\xB2)-ish rect-occlusion testing EVERY poll; on a large
633
+ // post-login app tree it costs seconds per poll, so --gone can never
634
+ // get two clean "absent" polls inside budget and falsely reports the
635
+ // gate as still blocked \u2014 the root cause of the 3pc PR-preview outage.
636
+ // presence-mode keeps pruneHidden so "appeared" still means
637
+ // visibly-reachable. a departed gate is unmounted or zero-sized, so the
638
+ // cheap structural+layout check is correct here and ~O(n) cheap.
639
+ const matches = await t.queryAll?.(gone ? { hasId: ID } : { hasId: ID, pruneHidden: true })
630
640
  if (!Array.isArray(matches)) return undefined
631
641
  return matches.find(present) || null
632
642
  } catch {
@@ -657,24 +667,76 @@ async function inspectWaitSelector(bridge, testId, timeoutMs = 5e3, opts = {}) {
657
667
  );
658
668
  return result ?? { found: false, elapsed: timeoutMs };
659
669
  }
670
+ function consoleEntriesEval(level, limit) {
671
+ const getter = level === "error" ? "getErrors" : "getWarnings";
672
+ return `(() => {
673
+ const out = []
674
+ const seen = new Set()
675
+ const norm = (s) => (typeof s === 'string' ? s : (() => { try { return JSON.stringify(s) } catch { return String(s) } })())
676
+ const key = (ts, args) => Math.round((ts || 0) / 250) + '|' + (Array.isArray(args) ? args.map(norm).join(' ') : norm(args))
677
+ const push = (e) => {
678
+ if (!e) return
679
+ const ts = typeof e.timestamp === 'number' ? e.timestamp : (typeof e.ts === 'number' ? e.ts : 0)
680
+ const k = key(ts, e.args)
681
+ if (seen.has(k)) return
682
+ seen.add(k)
683
+ out.push({ timestamp: ts, args: Array.isArray(e.args) ? e.args : [e.args], stack: e.stack || undefined, source: e.source || undefined })
684
+ }
685
+ // page-realm ws-bridge buffer first (richest stacks for page-origin errors)
686
+ try { for (const e of (window.__sootsimConsole?.${getter}(${limit}) || [])) push(e) } catch {}
687
+ // engine observability store \u2014 the always-on render-worker / forwarded path
688
+ try {
689
+ const obs = window.__sootsimObservability
690
+ const snap = obs && obs.logs && typeof obs.logs.getSnapshot === 'function' ? obs.logs.getSnapshot() : []
691
+ for (const e of snap) if (e && e.level === ${JSON.stringify(level)}) push(e)
692
+ } catch {}
693
+ return out.sort((a, b) => (a.timestamp || 0) - (b.timestamp || 0)).slice(-${limit})
694
+ })()`;
695
+ }
660
696
  async function inspectErrors(bridge, limit = 20) {
661
697
  const result = await bridge.send({
662
698
  type: "evaluate",
663
- code: `window.__sootsimConsole?.getErrors(${limit}) || []`
699
+ code: consoleEntriesEval("error", limit)
664
700
  });
665
701
  return Array.isArray(result) ? result : [];
666
702
  }
667
703
  async function inspectWarnings(bridge, limit = 20) {
668
704
  const result = await bridge.send({
669
705
  type: "evaluate",
670
- code: `window.__sootsimConsole?.getWarnings(${limit}) || []`
706
+ code: consoleEntriesEval("warn", limit)
671
707
  });
672
708
  return Array.isArray(result) ? result : [];
673
709
  }
710
+ var MERGED_CONSOLE_COUNT_EVAL = `(() => {
711
+ const norm = (s) => (typeof s === 'string' ? s : (() => { try { return JSON.stringify(s) } catch { return String(s) } })())
712
+ const key = (lvl, ts, args) => lvl + '|' + Math.round((ts || 0) / 250) + '|' + (Array.isArray(args) ? args.map(norm).join(' ') : norm(args))
713
+ const seen = new Set()
714
+ let errors = 0
715
+ let warnings = 0
716
+ const add = (lvl, ts, args) => {
717
+ if (lvl !== 'error' && lvl !== 'warn') return
718
+ const k = key(lvl, ts, args)
719
+ if (seen.has(k)) return
720
+ seen.add(k)
721
+ if (lvl === 'error') errors++
722
+ else warnings++
723
+ }
724
+ try {
725
+ const c = window.__sootsimConsole
726
+ for (const e of (c?.getErrors?.(200) || [])) add('error', e?.timestamp ?? e?.ts, e?.args)
727
+ for (const e of (c?.getWarnings?.(200) || [])) add('warn', e?.timestamp ?? e?.ts, e?.args)
728
+ } catch {}
729
+ try {
730
+ const obs = window.__sootsimObservability
731
+ const snap = obs && obs.logs && typeof obs.logs.getSnapshot === 'function' ? obs.logs.getSnapshot() : []
732
+ for (const e of snap) if (e) add(e.level, e.ts, e.args)
733
+ } catch {}
734
+ return { errors, warnings, total: errors + warnings }
735
+ })()`;
674
736
  async function clearConsole(bridge) {
675
737
  await bridge.send({
676
738
  type: "evaluate",
677
- code: 'window.__sootsimConsole?.clear(); "cleared"'
739
+ code: 'window.__sootsimConsole?.clear(); window.__sootsimObservability?.logs?.clear?.(); "cleared"'
678
740
  });
679
741
  }
680
742
  async function inspectRequests(bridge, opts = {}) {
@@ -932,6 +994,72 @@ function formatTimelineSummary(summary) {
932
994
  }
933
995
  return parts.join(" \xB7 ");
934
996
  }
997
+ var NOISY_TIMELINE_KINDS = /* @__PURE__ */ new Set([
998
+ "react-commit",
999
+ "layout",
1000
+ "scroll"
1001
+ ]);
1002
+ function formatTimelineRelativeTime(t, anchor) {
1003
+ if (anchor === null) return new Date(t).toLocaleTimeString();
1004
+ const dt = (t - anchor) / 1e3;
1005
+ const sign = dt >= 0 ? "+" : "";
1006
+ return `${sign}${dt.toFixed(2)}s`;
1007
+ }
1008
+ function formatTimelinePayload(kind, d) {
1009
+ switch (kind) {
1010
+ case "app-launch":
1011
+ return d.phase === "launch" ? `launch ${d.appName ?? d.toAppId ?? ""}` : `dismiss ${d.appName ?? d.fromAppId ?? ""} \u2192 ${d.toAppId ?? ""}`;
1012
+ case "toast":
1013
+ return `"${d.text ?? ""}"${d.durationMs ? ` (${d.durationMs}ms)` : ""}`;
1014
+ case "keyboard":
1015
+ return `${d.phase ?? "?"}${d.heightPx ? ` h=${d.heightPx}` : ""}${d.mode ? ` ${d.mode}` : ""}`;
1016
+ case "screen":
1017
+ return `${d.phase ?? "?"} ${d.name ?? d.activeName ?? ""}`;
1018
+ case "route":
1019
+ return `${d.phase ?? "?"} ${d.path ?? d.pathname ?? ""}`;
1020
+ case "alert":
1021
+ case "actionsheet":
1022
+ case "picker":
1023
+ return `${d.phase ?? "?"} ${d.title ?? d.message ?? ""}`;
1024
+ case "notification":
1025
+ return `${d.title ?? ""}${d.body ? ` \u2014 ${d.body}` : ""}`;
1026
+ case "fetch":
1027
+ return `${d.method ?? "GET"} ${d.url ?? ""}${d.status ? ` -> ${d.status}` : ""}`;
1028
+ case "console":
1029
+ return `${d.level ?? "log"}: ${(d.message ?? "").toString().slice(0, 120)}`;
1030
+ case "shell":
1031
+ return `${d.event ?? d.type ?? d.phase ?? ""}`;
1032
+ case "scroll":
1033
+ return `${d.phase ?? "?"} ${d.target ?? ""}`;
1034
+ case "gesture":
1035
+ return `${d.phase ?? "?"} ${d.type ?? ""}`;
1036
+ case "text-input":
1037
+ return `${d.phase ?? "?"}${d.value !== void 0 ? ` "${String(d.value).slice(0, 40)}"` : ""}`;
1038
+ case "layout":
1039
+ return `${d.kind ?? "?"} ${d.testID ?? d.type ?? ""}${d.skipped ? ` skipped:${d.reason ?? "unknown"}` : ""}`;
1040
+ case "react-commit": {
1041
+ const slowest = d.slowest;
1042
+ return `${d.fiberCount ?? "?"} fibers ${d.durationMs ?? "?"}ms${slowest?.displayName ? ` \xB7 ${slowest.displayName} ${slowest.durationMs ?? "?"}ms` : ""}`;
1043
+ }
1044
+ case "reanimated":
1045
+ case "animation":
1046
+ return `${d.kind ?? ""} ${d.target ?? ""}${d.durationMs ? ` ${d.durationMs}ms` : ""}`;
1047
+ }
1048
+ return "";
1049
+ }
1050
+ function formatTimelineEvent(event, anchor) {
1051
+ const ts = formatTimelineRelativeTime(event.t, anchor).padStart(8);
1052
+ const ctx = event.context.padEnd(6);
1053
+ const kind = `[${event.kind}]`.padEnd(15);
1054
+ const d = event.data;
1055
+ const payload = d && typeof d === "object" ? formatTimelinePayload(event.kind, d) : "";
1056
+ return ` ${ts} ${ctx} ${kind} ${payload}`;
1057
+ }
1058
+ function formatTimelineEvents(events) {
1059
+ if (!events.length) return "";
1060
+ const anchor = events[0]?.t ?? null;
1061
+ return events.map((e) => formatTimelineEvent(e, anchor)).join("\n");
1062
+ }
935
1063
 
936
1064
  // cli/commands/inspect/settling.ts
937
1065
  async function waitForSootsimIdle({
@@ -1407,6 +1535,8 @@ async function tapBest(bridge, query, opts = {}) {
1407
1535
  export {
1408
1536
  DEBUG_CHANNELS,
1409
1537
  LAYOUT_GET_NATIVE_EVAL,
1538
+ MERGED_CONSOLE_COUNT_EVAL,
1539
+ NOISY_TIMELINE_KINDS,
1410
1540
  READY_CONTENT_NODE_FLOOR,
1411
1541
  READY_NODE_STABLE_MS,
1412
1542
  WAIT_READY_PROBE,
@@ -1416,6 +1546,9 @@ export {
1416
1546
  clearRequests,
1417
1547
  filterLogEntries,
1418
1548
  formatLayoutElements,
1549
+ formatTimelineEvent,
1550
+ formatTimelineEvents,
1551
+ formatTimelinePayload,
1419
1552
  formatTimelineSummary,
1420
1553
  getShellState,
1421
1554
  inspectAccessibilityTree,
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.119 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.121 | (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;