sootsim 0.1.120 → 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-JAQ76LFW.js → agent-NZ4A6JKO.js} +2 -2
  3. package/dist-cli/chunks/{agent-wrapper-UFBNAQR3.js → agent-wrapper-CYQ5L2YH.js} +2 -2
  4. package/dist-cli/chunks/{app-fonts-66WNE562.js → app-fonts-2DF4NW5D.js} +2 -2
  5. package/dist-cli/chunks/{assert-RXN5UUG3.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-E6MZZ2JK.js → chunk-2U4CGOD6.js} +1 -1
  10. package/dist-cli/chunks/{chunk-JHOXMDAW.js → chunk-3A7SRWSQ.js} +2 -2
  11. package/dist-cli/chunks/{chunk-KPNFYPCM.js → chunk-3DDNLPIH.js} +2 -2
  12. package/dist-cli/chunks/{chunk-SPNQRDT7.js → chunk-3WDN2S2A.js} +1 -1
  13. package/dist-cli/chunks/{chunk-3OXUZ4YW.js → chunk-4BXESMZ7.js} +1 -1
  14. package/dist-cli/chunks/{chunk-IGRECENR.js → chunk-4UQMPWDA.js} +1 -1
  15. package/dist-cli/chunks/{chunk-PISK5DP6.js → chunk-5OA35LZX.js} +2 -2
  16. package/dist-cli/chunks/{chunk-P3YMHC64.js → chunk-7CA63OS4.js} +1 -1
  17. package/dist-cli/chunks/{chunk-OJQCMP4V.js → chunk-7RXO4KKF.js} +1 -1
  18. package/dist-cli/chunks/{chunk-O2ZEDQRY.js → chunk-B77PWTHR.js} +2 -2
  19. package/dist-cli/chunks/chunk-BTWXWUDB.js +1 -0
  20. package/dist-cli/chunks/{chunk-527SSINQ.js → chunk-CGB6KRKN.js} +2 -2
  21. package/dist-cli/chunks/{chunk-QL5FA4KK.js → chunk-DORQQNP4.js} +2 -2
  22. package/dist-cli/chunks/{chunk-D4S3A7VQ.js → chunk-GU3MWKJY.js} +1 -1
  23. package/dist-cli/chunks/{chunk-6ECCKNU4.js → chunk-I26R4PE2.js} +1 -1
  24. package/dist-cli/chunks/{chunk-7IJSQITG.js → chunk-IQNZPHGD.js} +2 -2
  25. package/dist-cli/chunks/{chunk-LRAMRKPE.js → chunk-KTE2VIXH.js} +3 -3
  26. package/dist-cli/chunks/chunk-KXLYXKMA.js +1 -0
  27. package/dist-cli/chunks/{chunk-SLLX3SWM.js → chunk-KY6NY6WN.js} +1 -1
  28. package/dist-cli/chunks/{chunk-3RTBGCJF.js → chunk-LT2X5ISU.js} +2 -2
  29. package/dist-cli/chunks/{chunk-DLVWPEI4.js → chunk-MSU27JEW.js} +2 -2
  30. package/dist-cli/chunks/{chunk-O2M2AP7H.js → chunk-MUTDER75.js} +2 -2
  31. package/dist-cli/chunks/{chunk-WWFXKF3K.js → chunk-NQ4EDJV4.js} +2 -2
  32. package/dist-cli/chunks/{chunk-RKJS56NM.js → chunk-OBYYAT4F.js} +2 -2
  33. package/dist-cli/chunks/{chunk-S5UDIVJX.js → chunk-OEV7EOMC.js} +2 -2
  34. package/dist-cli/chunks/{chunk-FPRRNX2V.js → chunk-PMAKUYYK.js} +2 -2
  35. package/dist-cli/chunks/{chunk-4XZ4WY4A.js → chunk-QNQO5VHO.js} +9 -9
  36. package/dist-cli/chunks/chunk-QUEATUWT.js +1 -0
  37. package/dist-cli/chunks/{chunk-BPSFMOFQ.js → chunk-RVWJ3TAE.js} +2 -2
  38. package/dist-cli/chunks/{chunk-LK74SKOV.js → chunk-SA5RP334.js} +2 -2
  39. package/dist-cli/chunks/{chunk-V2UHENRM.js → chunk-SF6W3FRS.js} +1 -1
  40. package/dist-cli/chunks/{chunk-IGCYRC3B.js → chunk-SRA2TVCG.js} +1 -1
  41. package/dist-cli/chunks/{chunk-663EI6DT.js → chunk-VALW4SKE.js} +1 -1
  42. package/dist-cli/chunks/{chunk-52IG45RY.js → chunk-VJPN6DQU.js} +2 -2
  43. package/dist-cli/chunks/{chunk-PIMLP3CT.js → chunk-VSKLWCFM.js} +2 -2
  44. package/dist-cli/chunks/{chunk-25PXT5BN.js → chunk-VSRV5LFU.js} +1 -1
  45. package/dist-cli/chunks/{chunk-MB5HWJMY.js → chunk-VX5CAWLC.js} +2 -2
  46. package/dist-cli/chunks/{chunk-UMR6DJZG.js → chunk-W3FBNBTX.js} +2 -2
  47. package/dist-cli/chunks/{chunk-SPM7MIOO.js → chunk-WHL7FMLG.js} +73 -26
  48. package/dist-cli/chunks/{chunk-BJH7O6J6.js → chunk-X4LYRBLZ.js} +1 -1
  49. package/dist-cli/chunks/{chunk-7NLXLHEX.js → chunk-Y7ZMV3PG.js} +1 -1
  50. package/dist-cli/chunks/{chunk-ZYR5O6UT.js → chunk-YQIFU3PB.js} +3 -3
  51. package/dist-cli/chunks/{chunk-WTPKU4YG.js → chunk-Z47GWZMZ.js} +3 -3
  52. package/dist-cli/chunks/cli-version-DPV7EKFK.js +2 -0
  53. package/dist-cli/chunks/{compat-6HRSZHAI.js → compat-FMBQL2CX.js} +3 -3
  54. package/dist-cli/chunks/{config-AAHNHDGM.js → config-JD23SW7N.js} +2 -2
  55. package/dist-cli/chunks/control-IAHPU5HD.js +2 -0
  56. package/dist-cli/chunks/{cpu-profile-RBTXSQVS.js → cpu-profile-2Z4KGCAE.js} +2 -2
  57. package/dist-cli/chunks/{daemon-ZDL4HAJ6.js → daemon-NDO6JPDH.js} +2 -2
  58. package/dist-cli/chunks/{debug-GPCQOMPB.js → debug-RBVMEH33.js} +3 -3
  59. package/dist-cli/chunks/{detox-ZMUVIM6C.js → detox-TBJAZEBB.js} +2 -2
  60. package/dist-cli/chunks/{device-7U2WD3LH.js → device-26YM4HM7.js} +2 -2
  61. package/dist-cli/chunks/{diagnose-AHAABGO2.js → diagnose-PW7FGUOI.js} +2 -2
  62. package/dist-cli/chunks/drivers-L6UY2JC6.js +2 -0
  63. package/dist-cli/chunks/{electron-5MXNHIMP.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-6E337RVS.js → hints-Q3I4PXMT.js} +2 -2
  67. package/dist-cli/chunks/{home-paths-CZ67HGJ7.js → home-paths-P5GMZADH.js} +2 -2
  68. package/dist-cli/chunks/{inspect-OFQEFD7A.js → inspect-UTHL2UK4.js} +55 -58
  69. package/dist-cli/chunks/install-3UWGXX6F.js +2 -0
  70. package/dist-cli/chunks/{install-desktop-AGDDOM5C.js → install-desktop-XQYE3QYC.js} +3 -3
  71. package/dist-cli/chunks/{keys-ILCZHN7X.js → keys-75OBQ7OF.js} +2 -2
  72. package/dist-cli/chunks/{launch-4BT4CF5H.js → launch-TFE3CZZ3.js} +3 -3
  73. package/dist-cli/chunks/{login-EBW5MZ7B.js → login-EIL5PLK4.js} +4 -4
  74. package/dist-cli/chunks/{logout-FACVEAU4.js → logout-2DXPOPWE.js} +2 -2
  75. package/dist-cli/chunks/{maestro-T5OJV4WN.js → maestro-Q27CNJGT.js} +2 -2
  76. package/dist-cli/chunks/{preview-OGUTDHGA.js → preview-ZGVCXKQZ.js} +2 -2
  77. package/dist-cli/chunks/{profile-OM32C3WD.js → profile-TCX6GYV5.js} +2 -2
  78. package/dist-cli/chunks/{react-BT3Q3HEE.js → react-24D26RLU.js} +2 -2
  79. package/dist-cli/chunks/{record-SDAASQC5.js → record-3MODR5RQ.js} +2 -2
  80. package/dist-cli/chunks/runtime-5MJPHLRZ.js +2 -0
  81. package/dist-cli/chunks/{runtime-delivery-2ET2INWI.js → runtime-delivery-NWSDCFAI.js} +2 -2
  82. package/dist-cli/chunks/{screenshot-GDNEA6ET.js → screenshot-4A6JTLUV.js} +2 -2
  83. package/dist-cli/chunks/{screenshot-mode-GX3PSJUV.js → screenshot-mode-KVMXLFJ4.js} +2 -2
  84. package/dist-cli/chunks/{screenshots-BHHQP5D4.js → screenshots-XGG6PNXW.js} +2 -2
  85. package/dist-cli/chunks/{server-SISUV3YX.js → server-MRLLYDV7.js} +2 -2
  86. package/dist-cli/chunks/setup-repo-OUMNEC36.js +2 -0
  87. package/dist-cli/chunks/{skills-2F6XJMFM.js → skills-COR2GQRN.js} +2 -2
  88. package/dist-cli/chunks/{start-AVNDR55O.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-X2EOPVCG.js → test-4N6K3C5R.js} +3 -3
  92. package/dist-cli/chunks/{three-mode-HOAKG3OJ.js → three-mode-PJQGXIP4.js} +2 -2
  93. package/dist-cli/chunks/{timeline-U5LB2UAV.js → timeline-C7JSMHCV.js} +2 -2
  94. package/dist-cli/chunks/{upgrade-JKGP376V.js → upgrade-SFUV6KPW.js} +2 -2
  95. package/dist-cli/chunks/upload-XQLVCUKI.js +2 -0
  96. package/dist-cli/chunks/{web-XC36Y7B2.js → web-GK27H4NM.js} +2 -2
  97. package/dist-cli/chunks/what-happened-GAY54LBV.js +22 -0
  98. package/dist-cli/chunks/{whoami-MA2TQQQL.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 +132 -4
  125. package/dist-lib/sdk.mjs +127 -4
  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-WOBYOIE3.js +0 -2
  130. package/dist-cli/chunks/beta-TRSZJRLI.js +0 -2
  131. package/dist-cli/chunks/chunk-NUEWNRWO.js +0 -1
  132. package/dist-cli/chunks/chunk-O7HUOQQ7.js +0 -2
  133. package/dist-cli/chunks/chunk-PXMMDJOI.js +0 -1
  134. package/dist-cli/chunks/chunk-VCJ6CAP5.js +0 -1
  135. package/dist-cli/chunks/cli-version-IDCZT6SQ.js +0 -2
  136. package/dist-cli/chunks/control-2AGQ4GUN.js +0 -2
  137. package/dist-cli/chunks/drivers-RKCUWIKI.js +0 -2
  138. package/dist-cli/chunks/flow-NOT2JPAQ.js +0 -2
  139. package/dist-cli/chunks/help-HBLSAWHF.js +0 -2
  140. package/dist-cli/chunks/install-33SLF767.js +0 -2
  141. package/dist-cli/chunks/runtime-23HEVNFL.js +0 -2
  142. package/dist-cli/chunks/setup-repo-NU5MACBJ.js +0 -2
  143. package/dist-cli/chunks/store-IQBPTP5Z.js +0 -2
  144. package/dist-cli/chunks/telemetry-4ASKMD4D.js +0 -2
  145. package/dist-cli/chunks/upload-MSXXFBQA.js +0 -2
  146. package/dist-cli/chunks/what-happened-F7KIUJLJ.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.120 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{d as i}from"./chunk-S5UDIVJX.js";import{d as n}from"./chunk-LK74SKOV.js";import"./chunk-3OXUZ4YW.js";import"./chunk-IGCYRC3B.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.120 | (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.120 | (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.120 | (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.120 | (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.120 | (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.120 | (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.120 | (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.120 | (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.120 | (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.120 | (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.120 | (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.120 | (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.120 | (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.120 | (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.120 | (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.120 | (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.120 | (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.120 | (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.120 | (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.120 | (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.120 | (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.120 | (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.120 | (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.120 | (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.120 | (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.120 | (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,
@@ -749,24 +754,76 @@ async function inspectWaitSelector(bridge, testId, timeoutMs = 5e3, opts = {}) {
749
754
  );
750
755
  return result ?? { found: false, elapsed: timeoutMs };
751
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
+ }
752
783
  async function inspectErrors(bridge, limit = 20) {
753
784
  const result = await bridge.send({
754
785
  type: "evaluate",
755
- code: `window.__sootsimConsole?.getErrors(${limit}) || []`
786
+ code: consoleEntriesEval("error", limit)
756
787
  });
757
788
  return Array.isArray(result) ? result : [];
758
789
  }
759
790
  async function inspectWarnings(bridge, limit = 20) {
760
791
  const result = await bridge.send({
761
792
  type: "evaluate",
762
- code: `window.__sootsimConsole?.getWarnings(${limit}) || []`
793
+ code: consoleEntriesEval("warn", limit)
763
794
  });
764
795
  return Array.isArray(result) ? result : [];
765
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
+ })()`;
766
823
  async function clearConsole(bridge) {
767
824
  await bridge.send({
768
825
  type: "evaluate",
769
- code: 'window.__sootsimConsole?.clear(); "cleared"'
826
+ code: 'window.__sootsimConsole?.clear(); window.__sootsimObservability?.logs?.clear?.(); "cleared"'
770
827
  });
771
828
  }
772
829
  async function inspectRequests(bridge, opts = {}) {
@@ -1024,6 +1081,72 @@ function formatTimelineSummary(summary) {
1024
1081
  }
1025
1082
  return parts.join(" \xB7 ");
1026
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
+ }
1027
1150
 
1028
1151
  // cli/commands/inspect/settling.ts
1029
1152
  async function waitForSootsimIdle({
@@ -1500,6 +1623,8 @@ async function tapBest(bridge, query, opts = {}) {
1500
1623
  0 && (module.exports = {
1501
1624
  DEBUG_CHANNELS,
1502
1625
  LAYOUT_GET_NATIVE_EVAL,
1626
+ MERGED_CONSOLE_COUNT_EVAL,
1627
+ NOISY_TIMELINE_KINDS,
1503
1628
  READY_CONTENT_NODE_FLOOR,
1504
1629
  READY_NODE_STABLE_MS,
1505
1630
  WAIT_READY_PROBE,
@@ -1509,6 +1634,9 @@ async function tapBest(bridge, query, opts = {}) {
1509
1634
  clearRequests,
1510
1635
  filterLogEntries,
1511
1636
  formatLayoutElements,
1637
+ formatTimelineEvent,
1638
+ formatTimelineEvents,
1639
+ formatTimelinePayload,
1512
1640
  formatTimelineSummary,
1513
1641
  getShellState,
1514
1642
  inspectAccessibilityTree,
package/dist-lib/sdk.mjs CHANGED
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.120 | (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) {
@@ -667,24 +667,76 @@ async function inspectWaitSelector(bridge, testId, timeoutMs = 5e3, opts = {}) {
667
667
  );
668
668
  return result ?? { found: false, elapsed: timeoutMs };
669
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
+ }
670
696
  async function inspectErrors(bridge, limit = 20) {
671
697
  const result = await bridge.send({
672
698
  type: "evaluate",
673
- code: `window.__sootsimConsole?.getErrors(${limit}) || []`
699
+ code: consoleEntriesEval("error", limit)
674
700
  });
675
701
  return Array.isArray(result) ? result : [];
676
702
  }
677
703
  async function inspectWarnings(bridge, limit = 20) {
678
704
  const result = await bridge.send({
679
705
  type: "evaluate",
680
- code: `window.__sootsimConsole?.getWarnings(${limit}) || []`
706
+ code: consoleEntriesEval("warn", limit)
681
707
  });
682
708
  return Array.isArray(result) ? result : [];
683
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
+ })()`;
684
736
  async function clearConsole(bridge) {
685
737
  await bridge.send({
686
738
  type: "evaluate",
687
- code: 'window.__sootsimConsole?.clear(); "cleared"'
739
+ code: 'window.__sootsimConsole?.clear(); window.__sootsimObservability?.logs?.clear?.(); "cleared"'
688
740
  });
689
741
  }
690
742
  async function inspectRequests(bridge, opts = {}) {
@@ -942,6 +994,72 @@ function formatTimelineSummary(summary) {
942
994
  }
943
995
  return parts.join(" \xB7 ");
944
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
+ }
945
1063
 
946
1064
  // cli/commands/inspect/settling.ts
947
1065
  async function waitForSootsimIdle({
@@ -1417,6 +1535,8 @@ async function tapBest(bridge, query, opts = {}) {
1417
1535
  export {
1418
1536
  DEBUG_CHANNELS,
1419
1537
  LAYOUT_GET_NATIVE_EVAL,
1538
+ MERGED_CONSOLE_COUNT_EVAL,
1539
+ NOISY_TIMELINE_KINDS,
1420
1540
  READY_CONTENT_NODE_FLOOR,
1421
1541
  READY_NODE_STABLE_MS,
1422
1542
  WAIT_READY_PROBE,
@@ -1426,6 +1546,9 @@ export {
1426
1546
  clearRequests,
1427
1547
  filterLogEntries,
1428
1548
  formatLayoutElements,
1549
+ formatTimelineEvent,
1550
+ formatTimelineEvents,
1551
+ formatTimelinePayload,
1429
1552
  formatTimelineSummary,
1430
1553
  getShellState,
1431
1554
  inspectAccessibilityTree,
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.120 | (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/vite.cjs CHANGED
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.120 | (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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sootsim",
3
- "version": "0.1.120",
3
+ "version": "0.1.121",
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",
@@ -1,2 +0,0 @@
1
- /*! sootsim v0.1.120 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{a,b,c,d}from"./chunk-WTPKU4YG.js";import"./chunk-WWFXKF3K.js";import"./chunk-V2UHENRM.js";import"./chunk-SLLX3SWM.js";import"./chunk-3OXUZ4YW.js";import"./chunk-IGCYRC3B.js";export{c as ensureDaemonRunning,a as ensureRuntimeInstalled,d as ensureSootsimReady,b as resolveBootstrapPort};
@@ -1,2 +0,0 @@
1
- /*! sootsim v0.1.120 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{a,b,c,d,e}from"./chunk-7NLXLHEX.js";import"./chunk-IGCYRC3B.js";export{e as BETA_ASK_HEADLINE,c as BETA_LABEL,d as BETA_TAGLINE,b as BETA_VERSION_TARGET,a as IS_BETA};
@@ -1 +0,0 @@
1
- /*! sootsim v0.1.120 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
@@ -1,2 +0,0 @@
1
- /*! sootsim v0.1.120 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- var t="http://localhost:5173/";export{t as a};