diff --git a/crates/codegraph-ui/viewer/assets/archivo-latin-ext-wght-normal-C4zznr8T.woff2 b/crates/codegraph-ui/viewer/assets/archivo-latin-ext-wght-normal-C4zznr8T.woff2
deleted file mode 100644
index 2e544c2..0000000
Binary files a/crates/codegraph-ui/viewer/assets/archivo-latin-ext-wght-normal-C4zznr8T.woff2 and /dev/null differ
diff --git a/crates/codegraph-ui/viewer/assets/archivo-latin-wght-normal-E0tuGl4L.woff2 b/crates/codegraph-ui/viewer/assets/archivo-latin-wght-normal-E0tuGl4L.woff2
deleted file mode 100644
index 716d4ab..0000000
Binary files a/crates/codegraph-ui/viewer/assets/archivo-latin-wght-normal-E0tuGl4L.woff2 and /dev/null differ
diff --git a/crates/codegraph-ui/viewer/assets/archivo-vietnamese-wght-normal-XAtsl5Q_.woff2 b/crates/codegraph-ui/viewer/assets/archivo-vietnamese-wght-normal-XAtsl5Q_.woff2
deleted file mode 100644
index 0149781..0000000
Binary files a/crates/codegraph-ui/viewer/assets/archivo-vietnamese-wght-normal-XAtsl5Q_.woff2 and /dev/null differ
diff --git a/crates/codegraph-ui/viewer/assets/ibm-plex-mono-cyrillic-400-italic-2syK4fUT.woff b/crates/codegraph-ui/viewer/assets/ibm-plex-mono-cyrillic-400-italic-2syK4fUT.woff
deleted file mode 100644
index 1389938..0000000
Binary files a/crates/codegraph-ui/viewer/assets/ibm-plex-mono-cyrillic-400-italic-2syK4fUT.woff and /dev/null differ
diff --git a/crates/codegraph-ui/viewer/assets/ibm-plex-mono-cyrillic-400-italic-CBJ8pzag.woff2 b/crates/codegraph-ui/viewer/assets/ibm-plex-mono-cyrillic-400-italic-CBJ8pzag.woff2
deleted file mode 100644
index 2bbfd70..0000000
Binary files a/crates/codegraph-ui/viewer/assets/ibm-plex-mono-cyrillic-400-italic-CBJ8pzag.woff2 and /dev/null differ
diff --git a/crates/codegraph-ui/viewer/assets/ibm-plex-mono-cyrillic-400-normal-BSMlKf0J.woff2 b/crates/codegraph-ui/viewer/assets/ibm-plex-mono-cyrillic-400-normal-BSMlKf0J.woff2
deleted file mode 100644
index 20e72b0..0000000
Binary files a/crates/codegraph-ui/viewer/assets/ibm-plex-mono-cyrillic-400-normal-BSMlKf0J.woff2 and /dev/null differ
diff --git a/crates/codegraph-ui/viewer/assets/ibm-plex-mono-cyrillic-400-normal-CEL4l2ZJ.woff b/crates/codegraph-ui/viewer/assets/ibm-plex-mono-cyrillic-400-normal-CEL4l2ZJ.woff
deleted file mode 100644
index 1487d93..0000000
Binary files a/crates/codegraph-ui/viewer/assets/ibm-plex-mono-cyrillic-400-normal-CEL4l2ZJ.woff and /dev/null differ
diff --git a/crates/codegraph-ui/viewer/assets/ibm-plex-mono-cyrillic-500-normal-Ael50iVv.woff b/crates/codegraph-ui/viewer/assets/ibm-plex-mono-cyrillic-500-normal-Ael50iVv.woff
deleted file mode 100644
index 7e53f59..0000000
Binary files a/crates/codegraph-ui/viewer/assets/ibm-plex-mono-cyrillic-500-normal-Ael50iVv.woff and /dev/null differ
diff --git a/crates/codegraph-ui/viewer/assets/ibm-plex-mono-cyrillic-500-normal-Bq9vWWag.woff2 b/crates/codegraph-ui/viewer/assets/ibm-plex-mono-cyrillic-500-normal-Bq9vWWag.woff2
deleted file mode 100644
index 328efe3..0000000
Binary files a/crates/codegraph-ui/viewer/assets/ibm-plex-mono-cyrillic-500-normal-Bq9vWWag.woff2 and /dev/null differ
diff --git a/crates/codegraph-ui/viewer/assets/ibm-plex-mono-cyrillic-600-normal-CTOM6hUh.woff2 b/crates/codegraph-ui/viewer/assets/ibm-plex-mono-cyrillic-600-normal-CTOM6hUh.woff2
deleted file mode 100644
index 56fa97f..0000000
Binary files a/crates/codegraph-ui/viewer/assets/ibm-plex-mono-cyrillic-600-normal-CTOM6hUh.woff2 and /dev/null differ
diff --git a/crates/codegraph-ui/viewer/assets/ibm-plex-mono-cyrillic-600-normal-fLZuRloM.woff b/crates/codegraph-ui/viewer/assets/ibm-plex-mono-cyrillic-600-normal-fLZuRloM.woff
deleted file mode 100644
index bc061ec..0000000
Binary files a/crates/codegraph-ui/viewer/assets/ibm-plex-mono-cyrillic-600-normal-fLZuRloM.woff and /dev/null differ
diff --git a/crates/codegraph-ui/viewer/assets/ibm-plex-mono-cyrillic-ext-400-italic-B4oTjJdl.woff b/crates/codegraph-ui/viewer/assets/ibm-plex-mono-cyrillic-ext-400-italic-B4oTjJdl.woff
deleted file mode 100644
index 44ae51e..0000000
Binary files a/crates/codegraph-ui/viewer/assets/ibm-plex-mono-cyrillic-ext-400-italic-B4oTjJdl.woff and /dev/null differ
diff --git a/crates/codegraph-ui/viewer/assets/ibm-plex-mono-cyrillic-ext-400-italic-CBjNughH.woff2 b/crates/codegraph-ui/viewer/assets/ibm-plex-mono-cyrillic-ext-400-italic-CBjNughH.woff2
deleted file mode 100644
index d7f4391..0000000
Binary files a/crates/codegraph-ui/viewer/assets/ibm-plex-mono-cyrillic-ext-400-italic-CBjNughH.woff2 and /dev/null differ
diff --git a/crates/codegraph-ui/viewer/assets/ibm-plex-mono-cyrillic-ext-400-normal-DMdlQ8Kv.woff b/crates/codegraph-ui/viewer/assets/ibm-plex-mono-cyrillic-ext-400-normal-DMdlQ8Kv.woff
deleted file mode 100644
index eff6edd..0000000
Binary files a/crates/codegraph-ui/viewer/assets/ibm-plex-mono-cyrillic-ext-400-normal-DMdlQ8Kv.woff and /dev/null differ
diff --git a/crates/codegraph-ui/viewer/assets/ibm-plex-mono-cyrillic-ext-400-normal-xuaO2J-f.woff2 b/crates/codegraph-ui/viewer/assets/ibm-plex-mono-cyrillic-ext-400-normal-xuaO2J-f.woff2
deleted file mode 100644
index b54e556..0000000
Binary files a/crates/codegraph-ui/viewer/assets/ibm-plex-mono-cyrillic-ext-400-normal-xuaO2J-f.woff2 and /dev/null differ
diff --git a/crates/codegraph-ui/viewer/assets/ibm-plex-mono-cyrillic-ext-500-normal-BIfNGwUT.woff b/crates/codegraph-ui/viewer/assets/ibm-plex-mono-cyrillic-ext-500-normal-BIfNGwUT.woff
deleted file mode 100644
index 626c775..0000000
Binary files a/crates/codegraph-ui/viewer/assets/ibm-plex-mono-cyrillic-ext-500-normal-BIfNGwUT.woff and /dev/null differ
diff --git a/crates/codegraph-ui/viewer/assets/ibm-plex-mono-cyrillic-ext-500-normal-BqneJy0T.woff2 b/crates/codegraph-ui/viewer/assets/ibm-plex-mono-cyrillic-ext-500-normal-BqneJy0T.woff2
deleted file mode 100644
index 7d066e9..0000000
Binary files a/crates/codegraph-ui/viewer/assets/ibm-plex-mono-cyrillic-ext-500-normal-BqneJy0T.woff2 and /dev/null differ
diff --git a/crates/codegraph-ui/viewer/assets/ibm-plex-mono-cyrillic-ext-600-normal-9HEixskS.woff b/crates/codegraph-ui/viewer/assets/ibm-plex-mono-cyrillic-ext-600-normal-9HEixskS.woff
deleted file mode 100644
index ee42a1e..0000000
Binary files a/crates/codegraph-ui/viewer/assets/ibm-plex-mono-cyrillic-ext-600-normal-9HEixskS.woff and /dev/null differ
diff --git a/crates/codegraph-ui/viewer/assets/ibm-plex-mono-cyrillic-ext-600-normal-V-xxqcpd.woff2 b/crates/codegraph-ui/viewer/assets/ibm-plex-mono-cyrillic-ext-600-normal-V-xxqcpd.woff2
deleted file mode 100644
index 7ebf1f2..0000000
Binary files a/crates/codegraph-ui/viewer/assets/ibm-plex-mono-cyrillic-ext-600-normal-V-xxqcpd.woff2 and /dev/null differ
diff --git a/crates/codegraph-ui/viewer/assets/ibm-plex-mono-latin-400-italic-66oory27.woff b/crates/codegraph-ui/viewer/assets/ibm-plex-mono-latin-400-italic-66oory27.woff
deleted file mode 100644
index 9ba3964..0000000
Binary files a/crates/codegraph-ui/viewer/assets/ibm-plex-mono-latin-400-italic-66oory27.woff and /dev/null differ
diff --git a/crates/codegraph-ui/viewer/assets/ibm-plex-mono-latin-400-italic-BqAiT5Ww.woff2 b/crates/codegraph-ui/viewer/assets/ibm-plex-mono-latin-400-italic-BqAiT5Ww.woff2
deleted file mode 100644
index 855c41c..0000000
Binary files a/crates/codegraph-ui/viewer/assets/ibm-plex-mono-latin-400-italic-BqAiT5Ww.woff2 and /dev/null differ
diff --git a/crates/codegraph-ui/viewer/assets/ibm-plex-mono-latin-400-normal-CvHOgSBP.woff b/crates/codegraph-ui/viewer/assets/ibm-plex-mono-latin-400-normal-CvHOgSBP.woff
deleted file mode 100644
index 8c83fdc..0000000
Binary files a/crates/codegraph-ui/viewer/assets/ibm-plex-mono-latin-400-normal-CvHOgSBP.woff and /dev/null differ
diff --git a/crates/codegraph-ui/viewer/assets/ibm-plex-mono-latin-400-normal-DMJ8VG8y.woff2 b/crates/codegraph-ui/viewer/assets/ibm-plex-mono-latin-400-normal-DMJ8VG8y.woff2
deleted file mode 100644
index 0804aaf..0000000
Binary files a/crates/codegraph-ui/viewer/assets/ibm-plex-mono-latin-400-normal-DMJ8VG8y.woff2 and /dev/null differ
diff --git a/crates/codegraph-ui/viewer/assets/ibm-plex-mono-latin-500-normal-CB9ihrfo.woff b/crates/codegraph-ui/viewer/assets/ibm-plex-mono-latin-500-normal-CB9ihrfo.woff
deleted file mode 100644
index 780de71..0000000
Binary files a/crates/codegraph-ui/viewer/assets/ibm-plex-mono-latin-500-normal-CB9ihrfo.woff and /dev/null differ
diff --git a/crates/codegraph-ui/viewer/assets/ibm-plex-mono-latin-500-normal-DSY6xOcd.woff2 b/crates/codegraph-ui/viewer/assets/ibm-plex-mono-latin-500-normal-DSY6xOcd.woff2
deleted file mode 100644
index 090f82f..0000000
Binary files a/crates/codegraph-ui/viewer/assets/ibm-plex-mono-latin-500-normal-DSY6xOcd.woff2 and /dev/null differ
diff --git a/crates/codegraph-ui/viewer/assets/ibm-plex-mono-latin-600-normal-BgSNZQsw.woff2 b/crates/codegraph-ui/viewer/assets/ibm-plex-mono-latin-600-normal-BgSNZQsw.woff2
deleted file mode 100644
index 67aeeb0..0000000
Binary files a/crates/codegraph-ui/viewer/assets/ibm-plex-mono-latin-600-normal-BgSNZQsw.woff2 and /dev/null differ
diff --git a/crates/codegraph-ui/viewer/assets/ibm-plex-mono-latin-600-normal-DWFSQ4vo.woff b/crates/codegraph-ui/viewer/assets/ibm-plex-mono-latin-600-normal-DWFSQ4vo.woff
deleted file mode 100644
index c812d78..0000000
Binary files a/crates/codegraph-ui/viewer/assets/ibm-plex-mono-latin-600-normal-DWFSQ4vo.woff and /dev/null differ
diff --git a/crates/codegraph-ui/viewer/assets/ibm-plex-mono-latin-ext-400-italic-B7_fu1kp.woff2 b/crates/codegraph-ui/viewer/assets/ibm-plex-mono-latin-ext-400-italic-B7_fu1kp.woff2
deleted file mode 100644
index 7d4e8fd..0000000
Binary files a/crates/codegraph-ui/viewer/assets/ibm-plex-mono-latin-ext-400-italic-B7_fu1kp.woff2 and /dev/null differ
diff --git a/crates/codegraph-ui/viewer/assets/ibm-plex-mono-latin-ext-400-italic-Bg0ZHwF4.woff b/crates/codegraph-ui/viewer/assets/ibm-plex-mono-latin-ext-400-italic-Bg0ZHwF4.woff
deleted file mode 100644
index abacaa7..0000000
Binary files a/crates/codegraph-ui/viewer/assets/ibm-plex-mono-latin-ext-400-italic-Bg0ZHwF4.woff and /dev/null differ
diff --git a/crates/codegraph-ui/viewer/assets/ibm-plex-mono-latin-ext-400-normal-BmRBH3aV.woff2 b/crates/codegraph-ui/viewer/assets/ibm-plex-mono-latin-ext-400-normal-BmRBH3aV.woff2
deleted file mode 100644
index 732c64d..0000000
Binary files a/crates/codegraph-ui/viewer/assets/ibm-plex-mono-latin-ext-400-normal-BmRBH3aV.woff2 and /dev/null differ
diff --git a/crates/codegraph-ui/viewer/assets/ibm-plex-mono-latin-ext-400-normal-D3D2R8hC.woff b/crates/codegraph-ui/viewer/assets/ibm-plex-mono-latin-ext-400-normal-D3D2R8hC.woff
deleted file mode 100644
index 338fc76..0000000
Binary files a/crates/codegraph-ui/viewer/assets/ibm-plex-mono-latin-ext-400-normal-D3D2R8hC.woff and /dev/null differ
diff --git a/crates/codegraph-ui/viewer/assets/ibm-plex-mono-latin-ext-500-normal-CAhNIIs5.woff2 b/crates/codegraph-ui/viewer/assets/ibm-plex-mono-latin-ext-500-normal-CAhNIIs5.woff2
deleted file mode 100644
index 6f33f8c..0000000
Binary files a/crates/codegraph-ui/viewer/assets/ibm-plex-mono-latin-ext-500-normal-CAhNIIs5.woff2 and /dev/null differ
diff --git a/crates/codegraph-ui/viewer/assets/ibm-plex-mono-latin-ext-500-normal-CZ70TYgx.woff b/crates/codegraph-ui/viewer/assets/ibm-plex-mono-latin-ext-500-normal-CZ70TYgx.woff
deleted file mode 100644
index 370da9c..0000000
Binary files a/crates/codegraph-ui/viewer/assets/ibm-plex-mono-latin-ext-500-normal-CZ70TYgx.woff and /dev/null differ
diff --git a/crates/codegraph-ui/viewer/assets/ibm-plex-mono-latin-ext-600-normal-D38SheWl.woff2 b/crates/codegraph-ui/viewer/assets/ibm-plex-mono-latin-ext-600-normal-D38SheWl.woff2
deleted file mode 100644
index c0b57de..0000000
Binary files a/crates/codegraph-ui/viewer/assets/ibm-plex-mono-latin-ext-600-normal-D38SheWl.woff2 and /dev/null differ
diff --git a/crates/codegraph-ui/viewer/assets/ibm-plex-mono-latin-ext-600-normal-DmB0ttJJ.woff b/crates/codegraph-ui/viewer/assets/ibm-plex-mono-latin-ext-600-normal-DmB0ttJJ.woff
deleted file mode 100644
index 45e343b..0000000
Binary files a/crates/codegraph-ui/viewer/assets/ibm-plex-mono-latin-ext-600-normal-DmB0ttJJ.woff and /dev/null differ
diff --git a/crates/codegraph-ui/viewer/assets/ibm-plex-mono-vietnamese-400-italic-D6eaYXMU.woff b/crates/codegraph-ui/viewer/assets/ibm-plex-mono-vietnamese-400-italic-D6eaYXMU.woff
deleted file mode 100644
index 54aff22..0000000
Binary files a/crates/codegraph-ui/viewer/assets/ibm-plex-mono-vietnamese-400-italic-D6eaYXMU.woff and /dev/null differ
diff --git a/crates/codegraph-ui/viewer/assets/ibm-plex-mono-vietnamese-400-italic-DRuN92E5.woff2 b/crates/codegraph-ui/viewer/assets/ibm-plex-mono-vietnamese-400-italic-DRuN92E5.woff2
deleted file mode 100644
index bafe6fa..0000000
Binary files a/crates/codegraph-ui/viewer/assets/ibm-plex-mono-vietnamese-400-italic-DRuN92E5.woff2 and /dev/null differ
diff --git a/crates/codegraph-ui/viewer/assets/ibm-plex-mono-vietnamese-400-normal-BulugwFq.woff2 b/crates/codegraph-ui/viewer/assets/ibm-plex-mono-vietnamese-400-normal-BulugwFq.woff2
deleted file mode 100644
index 21612f4..0000000
Binary files a/crates/codegraph-ui/viewer/assets/ibm-plex-mono-vietnamese-400-normal-BulugwFq.woff2 and /dev/null differ
diff --git a/crates/codegraph-ui/viewer/assets/ibm-plex-mono-vietnamese-400-normal-DDuiU_S-.woff b/crates/codegraph-ui/viewer/assets/ibm-plex-mono-vietnamese-400-normal-DDuiU_S-.woff
deleted file mode 100644
index dfa68b0..0000000
Binary files a/crates/codegraph-ui/viewer/assets/ibm-plex-mono-vietnamese-400-normal-DDuiU_S-.woff and /dev/null differ
diff --git a/crates/codegraph-ui/viewer/assets/ibm-plex-mono-vietnamese-500-normal-C8zxqsMH.woff b/crates/codegraph-ui/viewer/assets/ibm-plex-mono-vietnamese-500-normal-C8zxqsMH.woff
deleted file mode 100644
index b1a1d12..0000000
Binary files a/crates/codegraph-ui/viewer/assets/ibm-plex-mono-vietnamese-500-normal-C8zxqsMH.woff and /dev/null differ
diff --git a/crates/codegraph-ui/viewer/assets/ibm-plex-mono-vietnamese-500-normal-DZ4AoWbu.woff2 b/crates/codegraph-ui/viewer/assets/ibm-plex-mono-vietnamese-500-normal-DZ4AoWbu.woff2
deleted file mode 100644
index 3920890..0000000
Binary files a/crates/codegraph-ui/viewer/assets/ibm-plex-mono-vietnamese-500-normal-DZ4AoWbu.woff2 and /dev/null differ
diff --git a/crates/codegraph-ui/viewer/assets/ibm-plex-mono-vietnamese-600-normal-D2EvbN8M.woff2 b/crates/codegraph-ui/viewer/assets/ibm-plex-mono-vietnamese-600-normal-D2EvbN8M.woff2
deleted file mode 100644
index a1c5bd3..0000000
Binary files a/crates/codegraph-ui/viewer/assets/ibm-plex-mono-vietnamese-600-normal-D2EvbN8M.woff2 and /dev/null differ
diff --git a/crates/codegraph-ui/viewer/assets/ibm-plex-mono-vietnamese-600-normal-iLQfcSjf.woff b/crates/codegraph-ui/viewer/assets/ibm-plex-mono-vietnamese-600-normal-iLQfcSjf.woff
deleted file mode 100644
index fbc5264..0000000
Binary files a/crates/codegraph-ui/viewer/assets/ibm-plex-mono-vietnamese-600-normal-iLQfcSjf.woff and /dev/null differ
diff --git a/crates/codegraph-ui/viewer/assets/index-Bpmr0I56.js b/crates/codegraph-ui/viewer/assets/index-Bpmr0I56.js
deleted file mode 100644
index 0684dbb..0000000
--- a/crates/codegraph-ui/viewer/assets/index-Bpmr0I56.js
+++ /dev/null
@@ -1,97 +0,0 @@
-(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const s of document.querySelectorAll('link[rel="modulepreload"]'))o(s);new MutationObserver(s=>{for(const i of s)if(i.type==="childList")for(const a of i.addedNodes)a.tagName==="LINK"&&a.rel==="modulepreload"&&o(a)}).observe(document,{childList:!0,subtree:!0});function r(s){const i={};return s.integrity&&(i.integrity=s.integrity),s.referrerPolicy&&(i.referrerPolicy=s.referrerPolicy),s.crossOrigin==="use-credentials"?i.credentials="include":s.crossOrigin==="anonymous"?i.credentials="omit":i.credentials="same-origin",i}function o(s){if(s.ep)return;s.ep=!0;const i=r(s);fetch(s.href,i)}})();const Bv=!1;var Ja=Array.isArray,im=Array.prototype.indexOf,_a=Array.prototype.includes,$a=Array.from,am=Object.defineProperty,ro=Object.getOwnPropertyDescriptor,Vv=Object.getOwnPropertyDescriptors,Wv=Object.prototype,lm=Array.prototype,el=Object.getPrototypeOf,hd=Object.isExtensible;function As(e){return typeof e=="function"}const Ln=()=>{};function cm(e){return e()}function Tc(e){for(var t=0;t Searching… Reading saved trails… No saved trails yet. Walk a path through the code, then press Save trail on the trail bar to keep it. Only the first trails in the directory are listed. Every symbol you open shows who calls it on the left, its verbatim source in the middle, and
- what it calls on the right — each callee lined up with the line that makes the call.{if(i){if(i.pending.delete(h),i.done.add(h),i.pending.size===0){var d=e.outrogroups;qc(e,$a(i.done)),d.delete(i),d.size===0&&(e.outrogroups=null)}}else a-=1},!1)}if(a===0){var c=o.length===0&&r!==null&&e.pending.size===0;if(c){var f=r,u=f.parentNode;u_(u),u.append(f),e.items.clear()}qc(e,t,!c)}else i={pending:new Set(t),done:new Set},(e.outrogroups??=new Set).add(i)}function qc(e,t,r=!0){var o;if(e.pending.size>0){o=new Set;for(const a of e.pending.values())for(const l of a)o.add(e.items.get(l).e)}for(var s=0;s=0;){var l=a+i;(a===0||xd.includes(o[a-1]))&&(l===o.length||xd.includes(o[l]))?o=(a===0?"":o.substring(0,a))+o.substring(l+1):a=l}}return o===""?null:o}function kd(e,t=!1){var r=t?" !important;":";",o="";for(var s of Object.keys(e)){var i=e[s];i!=null&&i!==""&&(o+=" "+s+": "+i+r)}return o}function Kl(e){return e[0]!=="-"||e[1]!=="-"?e.toLowerCase():e}function H_(e,t){if(t){var r="",o,s;if(Array.isArray(t)?(o=t[0],s=t[1]):o=t,e){e=String(e).replaceAll(/\/\*.*?\*\//g,"").trim();var i=!1,a=0,l=!1,c=[];o&&c.push(...Object.keys(o).map(Kl)),s&&c.push(...Object.keys(s).map(Kl));var f=0,u=-1;const y=e.length;for(var h=0;h
",1),r0=N('
Where to start
All entry points ›Nothing selected
/ to focus the search box.Uncertain
",1),E0=N("Tests
Uncertain
What would need re-checking if this changed
Kd?s+1+Kd:null,f=c===null?[]:r.slice(c);return{rows:r,connectors:a,focusIndex:s,foldFrom:c,foldCount:f.length,foldNoun:tw(f.map(u=>u.entry).filter(u=>!!u)),headline:nw(e,t),note:rw(e)}}function tw(e){if(e.length===0)return"subtypes";const t=e.filter(r=>r.relation==="implements").length;return t===e.length?"implementations":t===0?"subclasses":"subtypes"}function nw(e,t){return e.polymorphic?`A call through ${t.name} dispatches to ${e.implementers} implementations — no single static target.`:""}function rw(e){const t=[];return e.descendants.truncated?t.push(`Showing ${e.descendants.shown} of ${e.descendants.total} subtypes`):e.bounded&&t.push("Deeper subtypes exist below the levels walked"),e.ancestors.truncated&&t.push(`${e.ancestors.total-e.ancestors.shown} more supertypes above`),t.join(" · ")}function ow(e,t){const r=t||e.foldFrom===null?e.rows.length:e.foldFrom;return{rows:e.rows.slice(0,r),connectors:e.connectors.filter(o=>o.toIndex
changed on disk after the last index sync — '),Vw=N('
Loading…
'),hb=N('
Loading…
'),dx=N('
Loading…
=0;)(a=o[s])&&(i&&a.compareDocumentPosition(i)^4&&i.parentNode.insertBefore(a,i),i=a);return this}function Jx(e){e||(e=$x);function t(h,d){return h&&d?e(h.__data__,d.__data__):!h-!d}for(var r=this._groups,o=r.length,s=new Array(o),i=0;i Too few links here carry an import or a declared type, so the layering uses raw reference
- counts. A name shared by two unrelated modules can move a box. Nothing in the index depends on this module — no import, call or reference crosses into
- it. It may be an entry point, or reached in a way the graph cannot see. Hover a link to see what crosses it — the counts by kind and the symbol pairs behind the
- weight. Click a module to isolate its links and list its files. Aggregating the graph by module… Reading screens and transitions… No navigation leaves this screen. screens · transitions. ● The entry screen is at the top; each row down is one more
- transition away from it. Click a screen and each of its transitions is labelled at the far
- end of its line — beside the screen it leads to or comes from — with the last condition
- checked before it happens; hover the line, or its row here, for the whole chain and the
- calls it travels through. Solid: the destination is written at the call. Dashed grey: it comes back from a
- helper's return value (inferred). Dashed accent: a transition back up the picture
- (returning), drawn around the boxes rather than through them. Dashed box: a trigger that
- is not a screen — shared chrome, or code no screen's render chain reaches. The host it runs in has not wired the steps question. The Screens and Flow views still work. Pick an endpoint and this view draws everything it sets in motion — its handler and what runs
- before it, the calls into the database, a queue, another service, and every response it can
- send — one box per step, an arrow for every way one leads to the next, and on each arrow the
- condition under which it happens. Or search a symbol and choose What happens from here. Pick a screen and this view draws everything it sets in motion — its handlers, the calls that
- cross into native code, the events that come back, the state it writes, the requests that leave
- the app — one box per step, an arrow for every way one leads to the next, and on each arrow the
- condition under which it happens. Or search a symbol and choose What happens from here. No screens or endpoints in this graph. Open a symbol from the search box and follow What happens from here,
- or link here directly with #/steps?symbol=<name>. Walking from the anchor… Nothing the picture holds is written inside this symbol — a screen renders handlers that fire on
- events, and they have no order between them. Read it as what it sets in motion instead. The event lands in a component of another screen — a picture of its own. Start here (or double-click its box) to see it, or continue through screens from the summary. ● The anchor is at the top, and each row down is what happens next: a line
- means and then. Where the code forks both ways, a small box asks the condition once and each
- line out of it answers — yes, no, a case; a lone
- guard rides its line as WHEN. A call written inside another call's arguments
- happens first — the token is signed before the reply that carries it — and an arm that answers,
- returns or throws simply has nothing leaving it. Click a step for its sites and the whole condition; a
- step is the next anchor. ● The anchor is at the top; each row down is one more step away from
- it. Click a step and each of its links is labelled at the far end of its line with the last
- condition checked before it happens; hover the line, or its row here, for the whole chain and the
- plumbing it travels through. A step is the next anchor, and any link opens as a Flow strip. Not drawn: Read as: in order what it sets in motion steps · links · depth key Where the graph stops. Following the calls… Ask for a path in the search box — “how does execute reach getFile”, or execute -> getFile — or walk a trail and read it as a flow. Asked: to . names nothing in this index. Reading the graph… Flow › to draw the path from it to a second symbol. Reading the graph… Exported symbols are on this list. Nothing in this repository references them, but anything
- outside it can — a published package, another service, a script. Read each one before you
- believe it. The rows were not checked against the text of the files that can reach them, so a
- reference the extractor did not record would not have been caught. The scan stopped at its cap — this index holds more unreferenced symbols than were
- considered. Symbols no import, call or reference in this index reaches, largest first. Everything below
- is what the graph can see; the notes under the list are what it cannot. does not match a view. Try the start. Searching… Port, read-only and watching are set on the command line: Reading saved trails… No saved trails yet. Walk a path through the code, then press Save trail on the trail bar to keep it. Only the first trails in the directory are listed. Nothing in this index is depended on yet. No file in this index runs anything at its top level. No test file reaches into the rest of the index. what the graph holds, by node and edge kind production symbols the most code reaches into every indexed file, fixtures included=0&&(r=t.slice(o+1),t=t.slice(0,o)),{type:t,name:r}})}function G2(e){return function(){var t=this.__on;if(t){for(var r=0,o=-1,s=t.length,i;r()=>e;function Qc(e,{sourceEvent:t,subject:r,target:o,identifier:s,active:i,x:a,y:l,dx:c,dy:f,dispatch:u}){Object.defineProperties(this,{type:{value:e,enumerable:!0,configurable:!0},sourceEvent:{value:t,enumerable:!0,configurable:!0},subject:{value:r,enumerable:!0,configurable:!0},target:{value:o,enumerable:!0,configurable:!0},identifier:{value:s,enumerable:!0,configurable:!0},active:{value:i,enumerable:!0,configurable:!0},x:{value:a,enumerable:!0,configurable:!0},y:{value:l,enumerable:!0,configurable:!0},dx:{value:c,enumerable:!0,configurable:!0},dy:{value:f,enumerable:!0,configurable:!0},_:{value:u}})}Qc.prototype.on=function(){var e=this._.on.apply(this._,arguments);return e===this._?this:e};function ok(e){return!e.ctrlKey&&!e.button}function sk(){return this.parentNode}function ik(e,t){return t??{x:e.x,y:e.y}}function ak(){return navigator.maxTouchPoints||"ontouchstart"in this}function lk(){var e=ok,t=sk,r=ik,o=ak,s={},i=il("start","drag","end"),a=0,l,c,f,u,h=0;function d(T){T.on("mousedown.drag",g).filter(o).on("touchstart.drag",w).on("touchmove.drag",M,rk).on("touchend.drag touchcancel.drag",I).style("touch-action","none").style("-webkit-tap-highlight-color","rgba(0,0,0,0)")}function g(T,A){if(!(u||!e.call(this,T,A))){var D=C(this,t.call(this,T,A),T,A,"mouse");D&&(Un(T.view).on("mousemove.drag",p,gi).on("mouseup.drag",y,gi),Og(T.view),ac(T),f=!1,l=T.clientX,c=T.clientY,D("start",T))}}function p(T){if(Qo(T),!f){var A=T.clientX-l,D=T.clientY-c;f=A*A+D*D>h}s.mouse("drag",T)}function y(T){Un(T.view).on("mousemove.drag mouseup.drag",null),Lg(T.view,f),Qo(T),s.mouse("end",T)}function w(T,A){if(e.call(this,T,A)){var D=T.changedTouches,j=t.call(this,T,A),R=D.length,z,W;for(z=0;z()=>e;function ZE(e,{sourceEvent:t,target:r,transform:o,dispatch:s}){Object.defineProperties(this,{type:{value:e,enumerable:!0,configurable:!0},sourceEvent:{value:t,enumerable:!0,configurable:!0},target:{value:r,enumerable:!0,configurable:!0},transform:{value:o,enumerable:!0,configurable:!0},_:{value:s}})}function Or(e,t,r){this.k=e,this.x=t,this.y=r}Or.prototype={constructor:Or,scale:function(e){return e===1?this:new Or(this.k*e,this.x,this.y)},translate:function(e,t){return e===0&t===0?this:new Or(this.k,this.x+this.k*e,this.y+this.k*t)},apply:function(e){return[e[0]*this.k+this.x,e[1]*this.k+this.y]},applyX:function(e){return e*this.k+this.x},applyY:function(e){return e*this.k+this.y},invert:function(e){return[(e[0]-this.x)/this.k,(e[1]-this.y)/this.k]},invertX:function(e){return(e-this.x)/this.k},invertY:function(e){return(e-this.y)/this.k},rescaleX:function(e){return e.copy().domain(e.range().map(this.invertX,this).map(e.invert,e))},rescaleY:function(e){return e.copy().domain(e.range().map(this.invertY,this).map(e.invert,e))},toString:function(){return"translate("+this.x+","+this.y+") scale("+this.k+")"}};var ul=new Or(1,0,0);Gg.prototype=Or.prototype;function Gg(e){for(;!e.__zoom;)if(!(e=e.parentNode))return ul;return e.__zoom}function uc(e){e.stopImmediatePropagation()}function zs(e){e.preventDefault(),e.stopImmediatePropagation()}function UE(e){return(!e.ctrlKey||e.type==="wheel")&&!e.button}function QE(){var e=this;return e instanceof SVGElement?(e=e.ownerSVGElement||e,e.hasAttribute("viewBox")?(e=e.viewBox.baseVal,[[e.x,e.y],[e.x+e.width,e.y+e.height]]):[[0,0],[e.width.baseVal.value,e.height.baseVal.value]]):[[0,0],[e.clientWidth,e.clientHeight]]}function xf(){return this.__zoom||ul}function JE(e){return-e.deltaY*(e.deltaMode===1?.05:e.deltaMode?1:.002)*(e.ctrlKey?10:1)}function $E(){return navigator.maxTouchPoints||"ontouchstart"in this}function eS(e,t,r){var o=e.invertX(t[0][0])-r[0][0],s=e.invertX(t[1][0])-r[1][0],i=e.invertY(t[0][1])-r[0][1],a=e.invertY(t[1][1])-r[1][1];return e.translate(s>o?(o+s)/2:Math.min(0,o)||Math.max(0,s),a>i?(i+a)/2:Math.min(0,i)||Math.max(0,a))}function tS(){var e=UE,t=QE,r=eS,o=JE,s=$E,i=[0,1/0],a=[[-1/0,-1/0],[1/0,1/0]],l=250,c=fa,f=il("start","zoom","end"),u,h,d,g=500,p=150,y=0,w=10;function M(b){b.property("__zoom",xf).on("wheel.zoom",R,{passive:!1}).on("mousedown.zoom",z).on("dblclick.zoom",W).filter(s).on("touchstart.zoom",H).on("touchmove.zoom",B).on("touchend.zoom touchcancel.zoom",k).style("-webkit-tap-highlight-color","rgba(0,0,0,0)")}M.transform=function(b,E,q,O){var K=b.selection?b.selection():b;K.property("__zoom",xf),b!==K?A(b,E,q,O):K.interrupt().each(function(){D(this,arguments).event(O).start().zoom(null,typeof E=="function"?E.apply(this,arguments):E).end()})},M.scaleBy=function(b,E,q,O){M.scaleTo(b,function(){var K=this.__zoom.k,Y=typeof E=="function"?E.apply(this,arguments):E;return K*Y},q,O)},M.scaleTo=function(b,E,q,O){M.transform(b,function(){var K=t.apply(this,arguments),Y=this.__zoom,G=q==null?T(K):typeof q=="function"?q.apply(this,arguments):q,U=Y.invert(G),X=typeof E=="function"?E.apply(this,arguments):E;return r(C(I(Y,X),G,U),K,a)},q,O)},M.translateBy=function(b,E,q,O){M.transform(b,function(){return r(this.__zoom.translate(typeof E=="function"?E.apply(this,arguments):E,typeof q=="function"?q.apply(this,arguments):q),t.apply(this,arguments),a)},null,O)},M.translateTo=function(b,E,q,O,K){M.transform(b,function(){var Y=t.apply(this,arguments),G=this.__zoom,U=O==null?T(Y):typeof O=="function"?O.apply(this,arguments):O;return r(ul.translate(U[0],U[1]).scale(G.k).translate(typeof E=="function"?-E.apply(this,arguments):-E,typeof q=="function"?-q.apply(this,arguments):-q),Y,a)},O,K)};function I(b,E){return E=Math.max(i[0],Math.min(i[1],E)),E===b.k?b:new Or(E,b.x,b.y)}function C(b,E,q){var O=E[0]-q[0]*b.k,K=E[1]-q[1]*b.k;return O===b.x&&K===b.y?b:new Or(b.k,O,K)}function T(b){return[(+b[0][0]+ +b[1][0])/2,(+b[0][1]+ +b[1][1])/2]}function A(b,E,q,O){b.on("start.zoom",function(){D(this,arguments).event(O).start()}).on("interrupt.zoom end.zoom",function(){D(this,arguments).event(O).end()}).tween("zoom",function(){var K=this,Y=arguments,G=D(K,Y).event(O),U=t.apply(K,Y),X=q==null?T(U):typeof q=="function"?q.apply(K,Y):q,$=Math.max(U[1][0]-U[0][0],U[1][1]-U[0][1]),Z=K.__zoom,Q=typeof E=="function"?E.apply(K,Y):E,F=c(Z.invert(X).concat($/Z.k),Q.invert(X).concat($/Q.k));return function(J){if(J===1)J=Q;else{var te=F(J),ie=$/te[2];J=new Or(ie,X[0]-te[0]*ie,X[1]-te[1]*ie)}G.zoom(null,J)}})}function D(b,E,q){return!q&&b.__zooming||new j(b,E)}function j(b,E){this.that=b,this.args=E,this.active=0,this.sourceEvent=null,this.extent=t.apply(b,E),this.taps=0}j.prototype={event:function(b){return b&&(this.sourceEvent=b),this},start:function(){return++this.active===1&&(this.that.__zooming=this,this.emit("start")),this},zoom:function(b,E){return this.mouse&&b!=="mouse"&&(this.mouse[1]=E.invert(this.mouse[0])),this.touch0&&b!=="touch"&&(this.touch0[1]=E.invert(this.touch0[0])),this.touch1&&b!=="touch"&&(this.touch1[1]=E.invert(this.touch1[0])),this.that.__zoom=E,this.emit("zoom"),this},end:function(){return--this.active===0&&(delete this.that.__zooming,this.emit("end")),this},emit:function(b){var E=Un(this.that).datum();f.call(b,this.that,new ZE(b,{sourceEvent:this.sourceEvent,target:M,transform:this.that.__zoom,dispatch:f}),E)}};function R(b,...E){if(!e.apply(this,arguments))return;var q=D(this,E).event(b),O=this.__zoom,K=Math.max(i[0],Math.min(i[1],O.k*Math.pow(2,o.apply(this,arguments)))),Y=lr(b);if(q.wheel)(q.mouse[0][0]!==Y[0]||q.mouse[0][1]!==Y[1])&&(q.mouse[1]=O.invert(q.mouse[0]=Y)),clearTimeout(q.wheel);else{if(O.k===K)return;q.mouse=[Y,O.invert(Y)],ga(this),q.start()}zs(b),q.wheel=setTimeout(G,p),q.zoom("mouse",r(C(I(O,K),q.mouse[0],q.mouse[1]),q.extent,a));function G(){q.wheel=null,q.end()}}function z(b,...E){if(d||!e.apply(this,arguments))return;var q=b.currentTarget,O=D(this,E,!0).event(b),K=Un(b.view).on("mousemove.zoom",X,!0).on("mouseup.zoom",$,!0),Y=lr(b,q),G=b.clientX,U=b.clientY;Og(b.view),uc(b),O.mouse=[Y,this.__zoom.invert(Y)],ga(this),O.start();function X(Z){if(zs(Z),!O.moved){var Q=Z.clientX-G,F=Z.clientY-U;O.moved=Q*Q+F*F>y}O.event(Z).zoom("mouse",r(C(O.that.__zoom,O.mouse[0]=lr(Z,q),O.mouse[1]),O.extent,a))}function $(Z){K.on("mousemove.zoom mouseup.zoom",null),Lg(Z.view,O.moved),zs(Z),O.event(Z).end()}}function W(b,...E){if(e.apply(this,arguments)){var q=this.__zoom,O=lr(b.changedTouches?b.changedTouches[0]:b,this),K=q.invert(O),Y=q.k*(b.shiftKey?.5:2),G=r(C(I(q,Y),O,K),t.apply(this,E),a);zs(b),l>0?Un(this).transition().duration(l).call(A,G,O,b):Un(this).call(M.transform,G,O,b)}}function H(b,...E){if(e.apply(this,arguments)){var q=b.touches,O=q.length,K=D(this,E,b.changedTouches.length===O).event(b),Y,G,U,X;for(uc(b),G=0;GMutual dependencies
Dependency cycles
Circular imports between files
The map could not be built
Nothing to draw here
The screens could not be read
No screen navigation in this graph
Opens from
Goes to
',1),fC=N("· triggered outside a screen",1),vC=N('Most connected
`,1),pC=N(''),mC=N('This viewer cannot draw steps
What happens from where?
The steps could not be read
This has no body to read in order
Arrives from
Leads to
',1),XN=N(" ",1),GN=N('Most connected
',1),nI=N(''),rI=N('The flow could not be built
Nothing to follow yet
No path between them
Flow
Entry points
'),mA=N(`
Dead code
No such view
e.wv)return!0}(t&er)!==0&&hr===null&&on(e,bn)}return!1}function tp(e,t,r=!0){var s=e.reactions;if(s!==null&&!(zr!==null&&zr.has(e)))for(var a=0;acodegraph ui --help.
",1),yb=S('
Index composition
Most depended on
Tests by reach
Files by language
Uncertain
",1),cw=S(" Tests
Uncertain
What would need re-checking
changed on disk after the last index sync — '),q2=S(' ',1),D2=S(''),R2=S('
'),A8=S('
'),N8=S(`
Nothing in the index depends on this module — no import, call or reference crosses into + it. It may be an entry point, or reached in a way the graph cannot see.
`),z8=S('Derived from the graph, not drawn by hand: each module sits one layer above the modules it + depends on, so reading top to bottom follows the dependency direction. Line weight is how many + calls, imports and type references cross the link.
Hover a link to see what crosses it — the counts by kind and the symbol pairs behind the + weight. Click a module to isolate its links and list its files.
`,1),hv=S(""),L8=S('Too few links here carry an import or a declared type, so the layering uses raw reference + counts. A name shared by two unrelated modules can move a box.
`),q8=S('Click a module on the map to list its files.
'),X8=S('Open first file'),G8=S('');function Z8(e,t){We(t,!0);const r=(y,O=kn,N=kn,B=kn,W=kn)=>{var Y=vv(),J=_e(Y),G=d(J);{let $=b(()=>B()==="target"?"arrow-right":"corner-down-right");Ne(G,{get name(){return n($)},size:14})}var ee=h(G),oe=h(J,2);{var ge=$=>{var ae=T8(),ne=_e(ae);ke(ne,17,()=>N().slice(0,8),K=>K.source+K.target,(K,Z)=>{var ce=M8(),te=d(ce),ie=d(te),ve=h(te,2),fe=d(ve),pe=h(ve,2),ye=d(pe);let Pe;I(de=>{w(ie,B()==="target"?n(Z).target:n(Z).source),w(fe,n(Z).count),Pe=rt(ye,"",Pe,de)},[()=>({width:`${Math.max(4,Math.round(100*n(Z).count/W()))}%`})]),xe("click",ce,()=>t.onSelect(B()==="target"?n(Z).target:n(Z).source)),m(K,ce)});var re=h(ne,2);{var Q=K=>{var Z=C8(),ce=d(Z);I(()=>w(ce,`+${N().length-8} more`)),m(K,Z)};F(re,K=>{N().length>8&&K(Q)})}m($,ae)},U=$=>{var ae=I8();m($,ae)};F(oe,$=>{N().length>0?$(ge):$(U,-1)})}I(()=>w(ee,`${O()??""} · ${N().length??""}`)),m(y,Y)},s=[1,2,3,4];function a(y){return y===1?"top-level folders":`${y} folders deep`}const i=b(()=>t.selected===null?null:t.layout.nodes.find(y=>y.id===t.selected)??null),o=b(()=>n(i)?.module??null),l=b(()=>new Set(n(o)?.generatedFiles??[])),c=b(()=>t.selected===null?[]:t.layout.edges.filter(y=>y.source===t.selected).map(y=>y.link).sort((y,O)=>O.count-y.count||y.target.localeCompare(O.target))),u=b(()=>t.selected===null?[]:t.layout.edges.filter(y=>y.target===t.selected).map(y=>y.link).sort((y,O)=>O.count-y.count||y.source.localeCompare(O.source))),v=b(()=>t.layout.edges.filter(y=>y.thin&&!y.back).length);let p=he("overview");vt(()=>{t.selected,q(p,"overview")});const f=b(()=>Math.max(1,...n(c).map(y=>y.count))),g=b(()=>Math.max(1,...n(u).map(y=>y.count)));var _=G8(),x=d(_),k=d(x);let C;var T=h(k,2);let M;var z=h(T,2);let R;var D=h(x,2),V=d(D);{var X=y=>{var O=L8(),N=_e(O);{var B=Q=>{var K=z8(),Z=_e(K),ce=d(Z);Lt(ce,{kind:"module",size:32});var te=h(ce,2),ie=d(te),ve=d(ie),fe=h(ie,2),pe=d(fe),ye=h(pe);{var Pe=ct=>{var pt=Yt();I(Se=>w(pt,`· ${Se??""}`),[()=>n(o).languages.map(Se=>Se.language).join(", ")]),m(ct,pt)};F(ye,ct=>{n(o).languages.length>0&&ct(Pe)})}var de=h(te,2),be=d(de);Ne(be,{name:"x"});var Ee=h(Z,2),Ge=d(Ee),me=h(d(Ge)),ze=d(me),De=h(Ge,2),Le=h(d(De)),Ze=d(Le),Re=h(De,2),ue=h(d(Re)),le=d(ue),we=h(Ee,2);{var Ce=ct=>{var pt=ui(),Se=d(pt);I(()=>w(Se,n(o).generated===n(o).files?"Every file in it is tool-generated.":`${n(o).generated} of its files are tool-generated.`)),m(ct,pt)};F(we,ct=>{n(o).generated>0&&ct(Ce)})}var $e=h(we,2);{var Oe=ct=>{var pt=A8(),Se=d(pt),Ae=d(Se),je=h(Se);I((Fe,Me)=>{w(Ae,Fe),w(je,` outside it, across + ${Me??""}, reference straight into it — the + floor on what a change here has to be checked against, and the bar along the bottom of + the box.`)},[()=>bt(n(o).dependents.files,"file"),()=>bt(n(o).dependents.modules,"module")]),m(ct,pt)};F($e,ct=>{(n(o).dependents?.files??0)>0&&ct(Oe)})}var at=h($e,2);{var wt=ct=>{var pt=N8();m(ct,pt)};F(at,ct=>{n(i)?.island&&ct(wt)})}var Mt=h(at,2);r(Mt,()=>"Depends on",()=>n(c),()=>"target",()=>n(f));var Tt=h(Mt,2);r(Tt,()=>"Depended on by",()=>n(u),()=>"source",()=>n(g)),I((ct,pt,Se,Ae)=>{w(ve,n(o).id),w(pe,ct),w(ze,pt),w(Ze,Se),w(le,Ae)},[()=>bt(n(o).files,"file"),()=>n(o).symbols.toLocaleString(),()=>n(o).files.toLocaleString(),()=>(n(o).dependents?.files??0).toLocaleString()]),xe("click",de,()=>t.onSelect(null)),m(Q,K)},W=Q=>{var K=P8();m(Q,K)};F(N,Q=>{n(o)?Q(B):Q(W,-1)})}var Y=h(N,4),J=h(d(Y),2);ke(J,21,()=>t.payload.roots,Q=>Q.root,(Q,K)=>{var Z=hv(),ce=d(Z),te={};I(()=>{w(ce,`${n(K).label??""} · ${n(K).files??""} files`),te!==(te=n(K).root)&&(Z.value=(Z.__value=n(K).root)??"")}),m(Q,Z)});var G;wo(J);var ee=h(Y,2),oe=h(d(ee),2),ge=d(oe),U=d(ge);ge.value=ge.__value="auto";var $=h(ge);ke($,16,()=>s,Q=>Q,(Q,K)=>{var Z=hv(),ce=d(Z),te={};I((ie,ve)=>{w(ce,ie),te!==(te=ve)&&(Z.value=(Z.__value=ve)??"")},[()=>a(K),()=>String(K)]),m(Q,Z)});var ae;wo(oe);var ne=h(ee,2),re=d(ne);I((Q,K)=>{G!==(G=t.payload.root)&&(J.value=(J.__value=t.payload.root)??"",Ws(J,t.payload.root)),w(U,`automatic — ${Q??""}`),ae!==(ae=K)&&(oe.value=(oe.__value=K)??"",Ws(oe,K)),up(re,t.includeTests)},[()=>a(t.payload.depth),()=>t.chosenDepth===null?"auto":String(t.chosenDepth)]),xe("change",J,Q=>t.onSelectRoot(Q.currentTarget.value)),xe("change",oe,Q=>{const K=Q.currentTarget.value;t.onSelectDepth(K==="auto"?null:Number(K))}),xe("change",re,Q=>t.onToggleTests(Q.currentTarget.checked)),m(y,O)},j=y=>{var O=V8(),N=_e(O),B=d(N);{var W=Q=>{var K=ui(),Z=d(K);I(ce=>w(Z,`${ce??""} carrying fewer than ${t.layout.minWeight??""} references + ${n(v)===1?"is":"are"} hidden until you select a module ${n(v)===1?"it":"they"} touch.`),[()=>bt(n(v),"link")]),m(Q,K)};F(B,Q=>{n(v)>0&&Q(W)})}var Y=h(B,2);{var J=Q=>{var K=ui(),Z=d(K);I(()=>w(Z,`The layering uses the ${t.layout.basis.declaredLinks??""} of ${t.layout.basis.totalLinks??""} links with an + import, a qualified name, an inheritance clause or a typed receiver behind them. Bare + name matches still count toward line weight, but they do not decide what sits above what.`)),m(Q,K)},G=Q=>{var K=O8();m(Q,K)};F(Y,Q=>{t.layout.basis.kind==="declared"?Q(J):Q(G,-1)})}var ee=h(Y,2);{var oe=Q=>{var K=ui(),Z=d(K);I(ce=>w(Z,`${ce??""} below confidence ${t.payload.excluded.confidenceBelow??""} + ${t.payload.excluded.uncertainEdges===1?"is":"are"} excluded from every count on this + screen — they are name-only guesses.`),[()=>bt(t.payload.excluded.uncertainEdges,"cross-module reference")]),m(Q,K)};F(ee,Q=>{t.payload.excluded.uncertainEdges>0&&Q(oe)})}var ge=h(N,2);{var U=Q=>{var K=D8(),Z=d(K),ce=h(d(Z)),te=d(ce),ie=h(Z,2);ke(ie,17,()=>t.layout.mutual.slice(0,8),pe=>pe.back.source+pe.back.target,(pe,ye)=>{var Pe=q8(),de=d(Pe),be=d(de),Ee=h(de),Ge=h(Ee),me=d(Ge);I(()=>{w(be,n(ye).back.source),w(Ee,` ⇄ ${n(ye).back.target??""} `),w(me,`(${n(ye).back.count??""} back-references)`)}),m(pe,Pe)});var ve=h(ie,2);{var fe=pe=>{var ye=Ac(),Pe=d(ye);I(()=>w(Pe,`+${t.layout.mutual.length-8} more`)),m(pe,ye)};F(ve,pe=>{t.layout.mutual.length>8&&pe(fe)})}I(pe=>w(te,`· ${pe??""} — the lighter direction, dashed when + selected`),[()=>bt(t.layout.mutual.length,"pair")]),m(Q,K)};F(ge,Q=>{t.layout.mutual.length>0&&Q(U)})}var $=h(ge,2);{var ae=Q=>{var K=H8(),Z=d(K),ce=h(d(Z)),te=d(ce),ie=h(Z,2);ke(ie,17,()=>t.layout.moduleCycles.slice(0,6),Kn,(ve,fe)=>{var pe=R8(),ye=d(pe);I(Pe=>w(ye,`${Pe??""} → ${n(fe)[0]??""}`),[()=>n(fe).join(" → ")]),m(ve,pe)}),I(ve=>w(te,`· ${ve??""} of three or more modules`),[()=>bt(t.layout.moduleCycles.length,"loop")]),m(Q,K)};F($,Q=>{t.layout.moduleCycles.length>0&&Q(ae)})}var ne=h($,2);{var re=Q=>{var K=B8(),Z=d(K),ce=h(d(Z)),te=d(ce),ie=h(Z,2);ke(ie,17,()=>t.payload.cycles.items.slice(0,6),Kn,(pe,ye)=>{var Pe=F8(),de=_e(Pe),be=d(de),Ee=d(be),Ge=h(be),me=h(de,2);ke(me,16,()=>n(ye).files,Le=>Le,(Le,Ze)=>{var Re=j8(),ue=d(Re);I(le=>{se(Re,"href",le),w(ue,Ze)},[()=>rn(Ze)]),m(Le,Re)});var ze=h(me,2);{var De=Le=>{var Ze=Ac(),Re=d(Ze);I(()=>w(Re,`+${n(ye).size-n(ye).files.length} more files in this group`)),m(Le,Ze)};F(ze,Le=>{n(ye).size>n(ye).files.length&&Le(De)})}I(Le=>{w(Ee,`${n(ye).size??""} files ·`),w(Ge,` ${Le??""}`)},[()=>n(ye).modules.join(", ")]),m(pe,Pe)});var ve=h(ie,2);{var fe=pe=>{var ye=Ac(),Pe=d(ye);I(()=>w(Pe,`+${t.payload.cycles.total-t.payload.cycles.shown} more groups`)),m(pe,ye)};F(ve,pe=>{t.payload.cycles.truncated&&pe(fe)})}I(pe=>w(te,`· ${pe??""}`),[()=>bt(t.payload.cycles.total,"group")]),m(Q,K)};F(ne,Q=>{t.payload.cycles.total>0&&Q(re)})}m(y,O)},P=y=>{var O=Et(),N=_e(O);{var B=Y=>{var J=vv(),G=_e(J),ee=d(G);Ne(ee,{name:"folder",size:14});var oe=h(ee),ge=h(G,2);{var U=ae=>{var ne=Et(),re=_e(ne);ke(re,16,()=>t.files,Q=>Q,(Q,K)=>{var Z=W8();let ce;var te=d(Z);Ne(te,{name:"file-code-2",size:14});var ie=h(te,1,!0);I((ve,fe,pe)=>{ce=qe(Z,1,"filerow svelte-dzmqqy",null,ce,ve),se(Z,"href",fe),se(Z,"title",pe),w(ie,K)},[()=>({gen:n(l).has(K)}),()=>rn(K),()=>n(l).has(K)?`${K} — tool-generated`:K]),m(Q,Z)}),m(ae,ne)},$=ae=>{var ne=K8();m(ae,ne)};F(ge,ae=>{t.files.length>0?ae(U):ae($,-1)})}I(()=>w(oe,`Files · ${n(o).fileList?.total??t.files.length??""}`)),m(Y,J)},W=Y=>{var J=Y8();m(Y,J)};F(N,Y=>{n(o)?Y(B):Y(W,-1)})}m(y,O)};F(V,y=>{n(p)==="overview"?y(X):n(p)==="dependencies"?y(j,1):y(P,-1)})}var A=h(D,2),H=d(A);{var L=y=>{var O=X8(),N=d(O);Ne(N,{name:"external-link"}),I(B=>se(O,"href",B),[()=>rn(t.files[0]??"")]),m(y,O)};F(H,y=>{n(o)&&t.files.length>0&&y(L)})}var E=h(H,2);im(E,{get build(){return t.buildSvg},get filename(){return t.exportName}}),I(()=>{se(k,"aria-selected",n(p)==="overview"),C=qe(k,1,"svelte-dzmqqy",null,C,{on:n(p)==="overview"}),se(T,"aria-selected",n(p)==="dependencies"),M=qe(T,1,"svelte-dzmqqy",null,M,{on:n(p)==="dependencies"}),se(z,"aria-selected",n(p)==="files"),R=qe(z,1,"svelte-dzmqqy",null,R,{on:n(p)==="files"})}),xe("click",k,()=>q(p,"overview")),xe("click",T,()=>q(p,"dependencies")),xe("click",z,()=>q(p,"files")),m(e,_),Ke()}St(["click","change"]);var U8=S(' '),Q8=S('
Reading screens and transitions…
'),Pv=S('
'),hi=S(''),Lv=S('
No navigation leaves this screen.
'),I9=S(''),z9=S(''),P9=S(`
screens · transitions.
● The entry screen is at the top; each row down is one more + transition away from it. Click a screen and each of its transitions is labelled at the far + end of its line — beside the screen it leads to or comes from — with the last condition + checked before it happens; hover the line, or its row here, for the whole chain and the + calls it travels through.
Solid: the destination is written at the call. Dashed grey: it comes back from a + helper's return value (inferred). Dashed accent: a transition back up the picture + (returning), drawn around the boxes rather than through them. Dashed box: a trigger that + is not a screen — shared chrome, or code no screen's render chain reaches.
The host it runs in has not wired the steps question. The Screens and Flow views still work.
Pick an endpoint and this view draws everything it sets in motion — its handler and what runs + before it, the calls into the database, a queue, another service, and every response it can + send — one box per step, an arrow for every way one leads to the next, and on each arrow the + condition under which it happens. Or search a symbol and choose What happens from here.
`),YC=S(`Pick a screen and this view draws everything it sets in motion — its handlers, the calls that + cross into native code, the events that come back, the state it writes, the requests that leave + the app — one box per step, an arrow for every way one leads to the next, and on each arrow the + condition under which it happens. Or search a symbol and choose What happens from here.
`),qc=S(''),XC=S(`
No screens or endpoints in this graph. Open a symbol from the search box and follow What happens from here, + or link here directly with #/steps?symbol=<name>.
`),Kv=S(' '),GC=S(''),ZC=S('
Walking from the anchor…
Nothing the picture holds is written inside this symbol — a screen renders handlers that fire on + events, and they have no order between them. Read it as what it sets in motion instead.
'),cT=S('
The event lands in a component of another screen — a picture of its own. Start here (or double-click its box) to see it, or continue through screens from the summary.
'),Yv=S(''),Xv=S('
'),th=S(""),vT=S(" "),hT=S(`
● The anchor is at the top, and each row down is what happens next: a line + means and then. Where the code forks both ways, a small box asks the condition once and each + line out of it answers — yes, no, a case; a lone + guard rides its line as WHEN. A call written inside another call's arguments + happens first — the token is signed before the reply that carries it — and an arm that answers, + returns or throws simply has nothing leaving it. Click a step for its sites and the whole condition; a + step is the next anchor.
`),pT=S(`● The anchor is at the top; each row down is one more step away from + it. Click a step and each of its links is labelled at the far end of its line with the last + condition checked before it happens; hover the line, or its row here, for the whole chain and the + plumbing it travels through. A step is the next anchor, and any link opens as a Flow strip.
`),nh=S(" ",1),gT=S(" into shared chrome.",1),mT=S('Not drawn:
'),_T=S(''),yT=S('Read as: in order what it sets in motion
steps · links · depth
'),IT=S('
key
'),sh=S(''),OT=S(''),qT=S('
',1),DT=S('
'),HT=S(''),jT=S('
'),FT=S('
Where the graph stops.
Ask for a path in the search box — “how does execute reach getFile”, or execute -> getFile — or walk a trail and read it as a flow.
Asked: to .
'),UT=S('
',1),JT=S('
'),$T=S('This path runs through the one in .',1),e7=S('
'),t7=S('
names nothing in this index.
'),n7=S(''),y7=S('
'),x7=S('
Reading the graph…
'),k7=S(''),S7=S('Flow to draw the path from it to a second symbol.
'),P7=S('
Exported symbols are on this list. Nothing in this repository references them, but anything + outside it can — a published package, another service, a script. Read each one before you + believe it.
`),O7=S('exported'),q7=S(' '),D7=S(' '),R7=S('',1),B7=S('
'),V7=S(" ",1),W7=S('
'),Y7=S('
The rows were not checked against the text of the files that can reach them, so a + reference the extractor did not record would not have been caught.
`),Z7=S(`The scan stopped at its cap — this index holds more unreferenced symbols than were + considered.
`),U7=S("Every rule removes a symbol something could still reach. What remains has no static + reference — not proof that it is unused.
symbols nothing in the index reaches · largest first · grouped by file
macros, trait objects and reflection leave no edge
does not match a view. Try the start.
{file} changed on disk after the last index sync — {@render children()}
{message}
+ {#if guidance}{guidance}
{/if} + {#if command || onretry} +Searching…
{:else if view.empty} -{view.empty}
+{view.empty}
{/if} + + diff --git a/ui/src/components/PaletteRows.svelte b/ui/src/components/PaletteRows.svelte index a872ffe..acd320b 100644 --- a/ui/src/components/PaletteRows.svelte +++ b/ui/src/components/PaletteRows.svelte @@ -101,39 +101,53 @@ display: flex; align-items: baseline; gap: 8px; - padding: 6px 10px 4px; - border-bottom: 1px solid var(--rule-faint); - color: var(--ink-3); - font-size: 12px; + padding: 8px 8px 4px; + color: var(--fg-3); + font: var(--t-micro); + letter-spacing: 0.6px; + text-transform: uppercase; } .head-note { overflow: hidden; - color: var(--ink-4); - font-size: 11.5px; + color: var(--fg-4); + font: var(--t-caption); + letter-spacing: 0; text-overflow: ellipsis; + text-transform: none; white-space: nowrap; } + /* §7: result rows 40 high, `card` + `line-faint`, r 8. */ .row { display: grid; width: 100%; - align-items: baseline; - padding: 6px 10px; - border-bottom: 1px solid var(--rule-faint); - color: var(--ink); + min-height: 40px; + align-items: center; + margin: 0 0 4px; + padding: 0 10px; + border: 1px solid var(--line-faint); + border-radius: 8px; + background: var(--card); + color: var(--fg); gap: 10px; - grid-template-columns: 18px 1fr auto; + grid-template-columns: 20px minmax(0, 1fr) auto; text-align: left; } - .row:last-child { - border-bottom: 0; + .row:hover { + border-color: var(--line); + background: var(--raised); } - .row:hover, .row.sel { - background: var(--press); + border-color: var(--primary-line); + background: var(--primary-soft); + box-shadow: var(--glow-20); + } + + .row.sel .nm { + color: var(--primary-ink); } .mid { @@ -143,25 +157,22 @@ } .nm { - font-family: var(--mono); - font-size: 12.5px; + font: var(--t-mono-500); } .nm.gen { - color: var(--ink-4); + color: var(--fg-4); } .sig { - margin-left: 6px; - color: var(--ink-3); - font-family: var(--mono); - font-size: 11.5px; + margin-left: 8px; + color: var(--fg-3); + font: var(--t-mono-sm); } .loc { - color: var(--ink-3); - font-family: var(--mono); - font-size: 11px; + color: var(--fg-3); + font: var(--t-mono-sm); white-space: nowrap; } diff --git a/ui/src/components/PhoneTabBar.svelte b/ui/src/components/PhoneTabBar.svelte new file mode 100644 index 0000000..ecfa69f --- /dev/null +++ b/ui/src/components/PhoneTabBar.svelte @@ -0,0 +1,84 @@ + + + + + + diff --git a/ui/src/components/SavedTrails.svelte b/ui/src/components/SavedTrails.svelte index cf36ac2..99a01df 100644 --- a/ui/src/components/SavedTrails.svelte +++ b/ui/src/components/SavedTrails.svelte @@ -1,4 +1,5 @@ + +Port, read-only and watching are set on the command line: codegraph ui --help.