@mneme-ai/xray 2.150.0 → 2.152.0

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 (42) hide show
  1. package/dist/battery/busfactor.d.ts.map +1 -1
  2. package/dist/battery/busfactor.js +24 -8
  3. package/dist/battery/busfactor.js.map +1 -1
  4. package/dist/battery/coupling.d.ts +3 -0
  5. package/dist/battery/coupling.d.ts.map +1 -0
  6. package/dist/battery/coupling.js +61 -0
  7. package/dist/battery/coupling.js.map +1 -0
  8. package/dist/battery/deps.d.ts +2 -0
  9. package/dist/battery/deps.d.ts.map +1 -1
  10. package/dist/battery/deps.js +34 -7
  11. package/dist/battery/deps.js.map +1 -1
  12. package/dist/battery/hotspots.d.ts.map +1 -1
  13. package/dist/battery/hotspots.js +54 -15
  14. package/dist/battery/hotspots.js.map +1 -1
  15. package/dist/bin.js +27 -0
  16. package/dist/bin.js.map +1 -1
  17. package/dist/bridge.d.ts +2 -0
  18. package/dist/bridge.d.ts.map +1 -0
  19. package/dist/bridge.js +89 -0
  20. package/dist/bridge.js.map +1 -0
  21. package/dist/clone.d.ts.map +1 -1
  22. package/dist/clone.js +2 -1
  23. package/dist/clone.js.map +1 -1
  24. package/dist/engine.d.ts.map +1 -1
  25. package/dist/engine.js +17 -4
  26. package/dist/engine.js.map +1 -1
  27. package/dist/gauntlet.d.ts.map +1 -1
  28. package/dist/gauntlet.js +3 -2
  29. package/dist/gauntlet.js.map +1 -1
  30. package/dist/index.d.ts +3 -0
  31. package/dist/index.d.ts.map +1 -1
  32. package/dist/index.js +3 -0
  33. package/dist/index.js.map +1 -1
  34. package/dist/server.d.ts.map +1 -1
  35. package/dist/server.js +27 -6
  36. package/dist/server.js.map +1 -1
  37. package/dist/types.d.ts +30 -2
  38. package/dist/types.d.ts.map +1 -1
  39. package/package.json +3 -2
  40. package/public/card.js +33 -8
  41. package/public/index.html +44 -1
  42. package/public/report.html +5 -1
package/public/index.html CHANGED
@@ -109,7 +109,18 @@
109
109
  .muted{color:var(--sub)}
110
110
  /* crisper section separation */
111
111
  .card .top{background:linear-gradient(#fff,#fcfcfd)}
112
- .row .k{font-weight:560}
112
+ .row .k{font-weight:560;display:flex;flex-direction:column;gap:3px}
113
+ .kdesc{font-size:11px;color:var(--sub);text-transform:none;letter-spacing:0;font-weight:400;line-height:1.3}
114
+ .spark{font-family:ui-monospace,Menlo,monospace;letter-spacing:1px;color:var(--a)}
115
+ /* local-folder bridge panel */
116
+ .localbox{max-width:560px;margin:18px auto 0;border:1px solid var(--line);border-radius:14px;padding:16px 18px;background:var(--soft);display:none}
117
+ .localbox.on{display:block}
118
+ .localbox .lh{display:flex;align-items:center;gap:8px;font-size:13.5px;font-weight:560}
119
+ .localdot{width:8px;height:8px;border-radius:50%;background:var(--green)}
120
+ .localrow{display:flex;gap:8px;margin-top:10px}
121
+ .localrow input{flex:1;padding:11px 13px;border:1px solid var(--line);border-radius:10px;font-size:14px;font-family:ui-monospace,Menlo,monospace}
122
+ .localrow button{padding:11px 16px;border:0;border-radius:10px;background:var(--ink);color:#fff;cursor:pointer;font-size:14px}
123
+ .localhint{font-size:12px;color:var(--sub);margin-top:8px}
113
124
  /* ---- mobile / cross-browser responsive ---- */
114
125
  @media (max-width:680px){
115
126
  .wrap{padding:0 16px}
@@ -156,6 +167,14 @@
156
167
  <span id="keystate" class="kstate"></span>
157
168
  </div>
158
169
  </details>
170
+ <div class="localbox" id="localbox">
171
+ <div class="lh"><span class="localdot"></span>Local agent detected — scan a folder on <b>this machine</b> (source never leaves it)</div>
172
+ <div class="localrow">
173
+ <input id="localpath" placeholder="/absolute/path/to/your/repo (git or not)" autocomplete="off" spellcheck="false" />
174
+ <button id="localgo" type="button">Scan local</button>
175
+ </div>
176
+ <div class="localhint">Private code? This reads it locally and shows the signed result here — nothing is uploaded.</div>
177
+ </div>
159
178
  <p class="err" id="err" style="display:none"></p>
160
179
  </header>
161
180
 
@@ -287,6 +306,30 @@ document.getElementById("f").addEventListener("submit", async e=>{
287
306
  }catch(ex){ err.textContent = String(ex); err.style.display="block"; }
288
307
  finally{ go.disabled=false; go.textContent="X-Ray"; }
289
308
  });
309
+ // ---- LOCAL BRIDGE: detect the local agent + scan a folder (code never uploaded) ----
310
+ const BRIDGE = "http://127.0.0.1:7799";
311
+ async function detectBridge(){
312
+ try{
313
+ const ctrl=new AbortController(); const t=setTimeout(()=>ctrl.abort(),1200);
314
+ const r=await fetch(BRIDGE+"/bridge/ping",{signal:ctrl.signal}); clearTimeout(t);
315
+ if(r.ok){ document.getElementById("localbox").classList.add("on"); }
316
+ }catch{ /* no local agent — silent */ }
317
+ }
318
+ document.getElementById("localgo").addEventListener("click", async ()=>{
319
+ const p=document.getElementById("localpath").value.trim();
320
+ const err=document.getElementById("err"), btn=document.getElementById("localgo");
321
+ err.style.display="none"; document.getElementById("out").innerHTML="";
322
+ if(!p) return;
323
+ btn.disabled=true; btn.innerHTML='<span class="spin"></span>Scanning…';
324
+ try{
325
+ const res=await fetch(BRIDGE+"/bridge/xray",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({path:p})});
326
+ const data=await res.json();
327
+ if(!res.ok){ err.textContent=data.error||"local scan failed"; err.style.display="block"; }
328
+ else { render(data); window.scrollTo({top:0,behavior:"smooth"}); }
329
+ }catch(ex){ err.textContent="Could not reach the local agent. Run: npx @mneme-ai/xray bridge"; err.style.display="block"; }
330
+ finally{ btn.disabled=false; btn.textContent="Scan local"; }
331
+ });
332
+ detectBridge();
290
333
  refreshKeyState();
291
334
  loadList();
292
335
  </script>
@@ -21,7 +21,11 @@
21
21
  .top .repo{font-size:21px;font-weight:620;word-break:break-all}.top .head{color:var(--sub);font-size:14.5px;margin-top:2px}
22
22
  .rows{padding:8px 28px 14px}
23
23
  .row{display:flex;gap:14px;padding:15px 0;border-bottom:1px solid var(--soft);align-items:baseline}.row:last-child{border-bottom:0}
24
- .row .k{font-size:13px;letter-spacing:.04em;text-transform:uppercase;color:var(--sub);width:128px;flex:none}
24
+ .row .k{font-size:13px;letter-spacing:.04em;text-transform:uppercase;color:var(--sub);width:140px;flex:none;display:flex;flex-direction:column;gap:3px}
25
+ .kdesc{font-size:11px;color:var(--sub);text-transform:none;letter-spacing:0;line-height:1.3}
26
+ .spark{font-family:ui-monospace,Menlo,monospace;letter-spacing:1px;color:#4f46e5}
27
+ .muted{color:var(--sub)}
28
+ @media (max-width:640px){ .row{flex-direction:column;gap:4px} .row .k{width:auto} }
25
29
  .row .v{font-size:15.5px}.row .v .big{font-weight:640}
26
30
  .chips{display:flex;flex-wrap:wrap;gap:6px;margin-top:6px}
27
31
  .chip{font-size:12.5px;padding:3px 9px;border-radius:999px;background:var(--soft);border:1px solid var(--line);color:#374151}