@mneme-ai/xray 2.156.0 → 2.158.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 (2) hide show
  1. package/package.json +1 -1
  2. package/public/index.html +100 -7
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mneme-ai/xray",
3
- "version": "2.156.0",
3
+ "version": "2.158.0",
4
4
  "description": "Mneme Repo X-Ray — a signed, raw-free, deterministic X-Ray of any repo. Every number is reproducible from git/AST/metadata and sealed with an offline-verifiable NOTARY receipt. No source code ever leaves the machine; no LLM guesses anything.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
package/public/index.html CHANGED
@@ -21,7 +21,20 @@
21
21
  -webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility;
22
22
  font-feature-settings:"cv11","ss01";letter-spacing:-0.011em}
23
23
  ::selection{background:var(--a-soft)}
24
- .wrap{max-width:720px;margin:0 auto;padding:0 24px}
24
+ .wrap{max-width:720px;margin:0 auto;padding:0 24px;position:relative;z-index:1}
25
+ /* decorative comets — only on wide screens (desktop / iPad landscape) */
26
+ .comet{position:fixed;pointer-events:none;z-index:0;opacity:0;display:none}
27
+ .comet-a{top:9%;right:3.5vw}
28
+ .comet-b{bottom:7%;left:3vw}
29
+ @media (min-width:1180px){
30
+ .comet{display:block;animation:cometIn 1.2s ease .3s forwards}
31
+ .comet-a{animation:cometIn 1.2s ease .3s forwards, driftA 16s ease-in-out 1.5s infinite alternate}
32
+ .comet-b{animation:cometIn 1.2s ease .6s forwards, driftB 19s ease-in-out 2s infinite alternate}
33
+ }
34
+ @keyframes cometIn{from{opacity:0;transform:translateY(-10px)}to{opacity:1;transform:none}}
35
+ @keyframes driftA{from{transform:translate(0,0) rotate(0deg)}to{transform:translate(-14px,18px) rotate(-3deg)}}
36
+ @keyframes driftB{from{transform:translate(0,0) rotate(0deg)}to{transform:translate(16px,-14px) rotate(3deg)}}
37
+ @media (prefers-reduced-motion:reduce){.comet{animation:none!important;opacity:1!important}}
25
38
  /* hero */
26
39
  header{padding:96px 0 40px;text-align:center}
27
40
  .mark{font-size:12px;letter-spacing:.22em;text-transform:uppercase;color:var(--sub);font-weight:600}
@@ -36,6 +49,9 @@
36
49
  color:var(--sub);font-size:13px;line-height:1.5}
37
50
  .btnhelp b{color:var(--ink2);font-weight:600}
38
51
  .keyhelp{font-size:12.5px;color:var(--sub);margin:12px 0 0;line-height:1.5;text-align:center}
52
+ .keymsg{margin:12px auto 0;max-width:520px;text-align:center;font-size:13px;line-height:1.55;color:#166534;
53
+ background:#f0fdf4;border:1px solid #dcfce7;border-radius:10px;padding:11px 14px}
54
+ .keymsg b{color:#14532d;font-weight:640}
39
55
  button{height:54px;padding:0 24px;border:0;border-radius:var(--rs);background:var(--ink);color:#fff;
40
56
  font-size:15.5px;font-weight:560;cursor:pointer;transition:transform .12s, opacity .18s, background .18s;white-space:nowrap}
41
57
  button:hover{background:#22232c}
@@ -60,9 +76,9 @@
60
76
  .rows{padding:6px 30px 16px}
61
77
  .row{display:flex;gap:18px;padding:17px 0;border-bottom:1px solid var(--line2);align-items:baseline}
62
78
  .row:last-child{border-bottom:0}
63
- .row .k{width:132px;flex:none;display:flex;flex-direction:column;gap:3px}
64
- .row .k>:first-child,.row .k{font-size:12px;letter-spacing:.06em;text-transform:uppercase;color:var(--sub);font-weight:600}
65
- .kdesc{font-size:11px;color:#a3a7af;text-transform:none;letter-spacing:0;font-weight:400;line-height:1.35}
79
+ .row .k{width:138px;flex:none;display:flex;flex-direction:column;gap:4px;
80
+ font-size:12.5px;letter-spacing:.05em;text-transform:uppercase;color:var(--ink);font-weight:700}
81
+ .kdesc{font-size:11.5px;color:#5e636d;text-transform:none;letter-spacing:0;font-weight:400;line-height:1.4}
66
82
  .row .v{font-size:15px;color:var(--ink2)}
67
83
  .row .v .big{font-weight:660;color:var(--ink);font-size:16px}
68
84
  .muted{color:var(--sub)}
@@ -180,6 +196,72 @@
180
196
  </style>
181
197
  </head>
182
198
  <body>
199
+ <!-- decorative comets — desktop / iPad only, hidden on narrow screens -->
200
+ <div class="comet comet-a" aria-hidden="true">
201
+ <svg viewBox="0 0 340 360" width="340" height="360">
202
+ <defs>
203
+ <linearGradient id="mtail" x1="1" y1="0" x2="0" y2="1">
204
+ <stop offset="0" stop-color="#0b0b0f" stop-opacity=".68"/><stop offset="1" stop-color="#0b0b0f" stop-opacity="0"/>
205
+ </linearGradient>
206
+ <radialGradient id="dust"><stop offset="0" stop-color="#0b0b0f" stop-opacity=".2"/><stop offset="1" stop-color="#0b0b0f" stop-opacity="0"/></radialGradient>
207
+ </defs>
208
+ <!-- expanding shockwave ring on impact -->
209
+ <circle cx="74" cy="266" r="16" fill="none" stroke="#0b0b0f" stroke-width="2">
210
+ <animate attributeName="r" dur="9s" repeatCount="indefinite" values="14;14;120" keyTimes="0;.34;.54"/>
211
+ <animate attributeName="opacity" dur="9s" repeatCount="indefinite" values="0;0;.45;0;0" keyTimes="0;.34;.36;.54;1"/>
212
+ <animate attributeName="stroke-width" dur="9s" repeatCount="indefinite" values="3;3;.4" keyTimes="0;.34;.54"/>
213
+ </circle>
214
+ <!-- dust puff -->
215
+ <circle cx="74" cy="266" r="46" fill="url(#dust)">
216
+ <animate attributeName="opacity" dur="9s" repeatCount="indefinite" values="0;0;1;0" keyTimes="0;.34;.4;.66"/>
217
+ </circle>
218
+ <!-- the meteor: rocky head + burning tail, streaks in then vanishes at impact -->
219
+ <g>
220
+ <animate attributeName="opacity" dur="9s" repeatCount="indefinite" values="0;.95;.95;0;0" keyTimes="0;.07;.32;.35;1"/>
221
+ <animateTransform attributeName="transform" type="translate" dur="9s" repeatCount="indefinite"
222
+ values="190 -150; 0 0; 0 0" keyTimes="0;.34;1" calcMode="spline" keySplines="0.5 0 0.9 1; 0 0 1 1"/>
223
+ <path d="M246 40 Q150 110 78 258 Q150 122 236 52 Z" fill="url(#mtail)"/>
224
+ <polygon points="250,30 268,42 263,62 243,60 236,42" fill="#0b0b0f"/>
225
+ <polygon points="250,30 268,42 256,48" fill="#34343d"/>
226
+ </g>
227
+ <!-- debris shards burst out of the impact -->
228
+ <g fill="#0b0b0f">
229
+ <g opacity="0"><polygon points="0,0 9,2 6,10 -2,8"/>
230
+ <animate attributeName="opacity" dur="9s" repeatCount="indefinite" values="0;0;1;0" keyTimes="0;.34;.37;.6"/>
231
+ <animateTransform attributeName="transform" type="translate" additive="sum" dur="9s" repeatCount="indefinite" values="74 266;74 266;26 198;20 224" keyTimes="0;.34;.52;.6" calcMode="spline" keySplines="0 0 1 1;0.3 0 0.8 1;0.4 0 1 1"/>
232
+ <animateTransform attributeName="transform" type="rotate" additive="sum" dur="9s" repeatCount="indefinite" values="0;0;220" keyTimes="0;.34;.6"/></g>
233
+ <g opacity="0"><polygon points="0,0 8,3 5,9 -1,6"/>
234
+ <animate attributeName="opacity" dur="9s" repeatCount="indefinite" values="0;0;1;0" keyTimes="0;.34;.37;.62"/>
235
+ <animateTransform attributeName="transform" type="translate" additive="sum" dur="9s" repeatCount="indefinite" values="74 266;74 266;58 188;54 214" keyTimes="0;.34;.52;.62" calcMode="spline" keySplines="0 0 1 1;0.3 0 0.8 1;0.4 0 1 1"/>
236
+ <animateTransform attributeName="transform" type="rotate" additive="sum" dur="9s" repeatCount="indefinite" values="0;0;-180" keyTimes="0;.34;.62"/></g>
237
+ <g opacity="0"><polygon points="0,0 10,2 7,11 -1,8"/>
238
+ <animate attributeName="opacity" dur="9s" repeatCount="indefinite" values="0;0;1;0" keyTimes="0;.34;.37;.6"/>
239
+ <animateTransform attributeName="transform" type="translate" additive="sum" dur="9s" repeatCount="indefinite" values="74 266;74 266;112 196;120 222" keyTimes="0;.34;.52;.6" calcMode="spline" keySplines="0 0 1 1;0.3 0 0.8 1;0.4 0 1 1"/>
240
+ <animateTransform attributeName="transform" type="rotate" additive="sum" dur="9s" repeatCount="indefinite" values="0;0;300" keyTimes="0;.34;.6"/></g>
241
+ <g opacity="0"><polygon points="0,0 7,2 5,8 -1,6"/>
242
+ <animate attributeName="opacity" dur="9s" repeatCount="indefinite" values="0;0;1;0" keyTimes="0;.34;.37;.64"/>
243
+ <animateTransform attributeName="transform" type="translate" additive="sum" dur="9s" repeatCount="indefinite" values="74 266;74 266;146 226;156 248" keyTimes="0;.34;.52;.64" calcMode="spline" keySplines="0 0 1 1;0.3 0 0.8 1;0.4 0 1 1"/>
244
+ <animateTransform attributeName="transform" type="rotate" additive="sum" dur="9s" repeatCount="indefinite" values="0;0;160" keyTimes="0;.34;.64"/></g>
245
+ <g opacity="0"><polygon points="0,0 8,2 6,10 -2,7"/>
246
+ <animate attributeName="opacity" dur="9s" repeatCount="indefinite" values="0;0;1;0" keyTimes="0;.34;.37;.58"/>
247
+ <animateTransform attributeName="transform" type="translate" additive="sum" dur="9s" repeatCount="indefinite" values="74 266;74 266;10 244;4 262" keyTimes="0;.34;.52;.58" calcMode="spline" keySplines="0 0 1 1;0.3 0 0.8 1;0.4 0 1 1"/>
248
+ <animateTransform attributeName="transform" type="rotate" additive="sum" dur="9s" repeatCount="indefinite" values="0;0;-120" keyTimes="0;.34;.58"/></g>
249
+ </g>
250
+ <!-- settled rubble that lingers a moment at the crater -->
251
+ <g fill="#0b0b0f" opacity="0">
252
+ <animate attributeName="opacity" dur="9s" repeatCount="indefinite" values="0;0;.5;.5;0" keyTimes="0;.36;.42;.78;.92"/>
253
+ <polygon points="60,270 70,266 74,274 62,277"/><polygon points="78,272 88,269 90,277 79,279"/>
254
+ </g>
255
+ </svg>
256
+ </div>
257
+ <div class="comet comet-b" aria-hidden="true">
258
+ <svg viewBox="0 0 300 300" width="220" height="220"><defs>
259
+ <linearGradient id="tb" x1="0" y1="1" x2="1" y2="0"><stop offset="0" stop-color="#0b0b0f" stop-opacity=".5"/><stop offset="1" stop-color="#0b0b0f" stop-opacity="0"/></linearGradient></defs>
260
+ <path d="M38 256 Q150 182 270 48 Q150 168 48 246 Z" fill="url(#tb)"/>
261
+ <circle cx="38" cy="256" r="12" fill="#0b0b0f" opacity=".12"/>
262
+ <circle cx="38" cy="256" r="6" fill="#0b0b0f"/>
263
+ </svg>
264
+ </div>
183
265
  <div class="wrap">
184
266
  <header>
185
267
  <div class="mark">Mneme · Repo X-Ray</div>
@@ -203,6 +285,7 @@
203
285
  <button id="savekey" type="button">Save</button>
204
286
  <span id="keystate" class="kstate"></span>
205
287
  </div>
288
+ <div id="keymsg" class="keymsg" style="display:none"></div>
206
289
  </details>
207
290
  <div class="localbox" id="localbox">
208
291
  <div class="lh"><span class="localdot"></span>Local agent detected — scan a folder on <b>this machine</b> (source never leaves it)</div>
@@ -271,13 +354,23 @@ async function profileId(token){
271
354
  function refreshKeyState(){
272
355
  const k=getKey(), st=document.getElementById("keystate"), tab=document.getElementById("tabMine");
273
356
  document.getElementById("key").value = k;
274
- st.textContent = k ? "signed in ✓" : "";
357
+ st.textContent = k ? "saved ✓" : "";
275
358
  tab.style.display = k ? "inline-block" : "none";
276
359
  }
277
360
  document.getElementById("savekey").addEventListener("click", ()=>{
278
361
  const k=document.getElementById("key").value.trim();
279
- if(k) localStorage.setItem("xrayKey",k); else localStorage.removeItem("xrayKey");
280
- refreshKeyState(); loadList();
362
+ const msg=document.getElementById("keymsg");
363
+ if(k){
364
+ localStorage.setItem("xrayKey",k);
365
+ refreshKeyState();
366
+ msg.innerHTML='✓ Saved. From now on, every <b>X-Ray</b> or <b>AI Pack</b> you run is kept under <b>My repos</b> — open it any time with this same key.';
367
+ msg.style.display="block";
368
+ tab="mine"; setTab(document.getElementById("tabMine")); loadList();
369
+ } else {
370
+ localStorage.removeItem("xrayKey"); refreshKeyState();
371
+ msg.innerHTML='Signed out. Reports are no longer saved.'; msg.style.display="block";
372
+ tab="board"; setTab(document.getElementById("tabBoard")); loadList();
373
+ }
281
374
  });
282
375
 
283
376
  let tab="board", offset=0, loaded=[];