@mneme-ai/core 2.19.84 → 2.19.85-lite

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.
@@ -436,7 +436,10 @@ async function fetchSoulFromBridge() {
436
436
  // Mark each text node's sentences with a leading dot. Use a dataset
437
437
  // flag to avoid re-decorating the same node as the response streams.
438
438
  const verdictTally = { confirmed: 0, refuted: 0, total: 0 };
439
- function decorateContainer(node) {
439
+ // v2.19.85 — declared as \`let\` (not function decl) so the sandbag
440
+ // auto-capture patch can wrap it without violating strict-mode
441
+ // reassignment rules.
442
+ let decorateContainer = function decorateContainerImpl(node) {
440
443
  if (!node || node.dataset && node.dataset.mnemePolygraphed) return;
441
444
  // Find LEAF text-bearing elements (<p>, <li>, <pre>, headings).
442
445
  const candidates = node.querySelectorAll ? node.querySelectorAll('p, li, h1, h2, h3, h4, blockquote') : [];
@@ -497,7 +500,7 @@ async function fetchSoulFromBridge() {
497
500
  el.dataset.mnemePolygraphed = 'done';
498
501
  });
499
502
  });
500
- }
503
+ };
501
504
 
502
505
  function findResponseContainers() {
503
506
  const out = [];
@@ -520,17 +523,105 @@ async function fetchSoulFromBridge() {
520
523
  }, 350);
521
524
  }
522
525
 
526
+ // ── v2.19.85 SANDBAG AUTO-CAPTURE (the wild bit) ──────────────────
527
+ // When the user re-asks a question with hedging phrases (are-you-sure,
528
+ // really, double-check, แน่ใจไหม, จริงเหรอ, ผิดแล้ว), the userscript
529
+ // reads the PREVIOUS AI response (PROD answer) and the NEXT AI
530
+ // response (TEST answer where the AI knows it is being challenged),
531
+ // packages both, and POSTs to /v1/polygraph/sandbag-capture. Bridge
532
+ // records both legs into the AEGIS A3 polygraph ledger. Drift surfaces
533
+ // automatically the next time mneme polygraph drift runs.
534
+ const HEDGE_TRIGGERS = [
535
+ 'are you sure', 'really', 'double-check', 'double check', 'fact check',
536
+ 'is that true', 'are you certain', 'is that right', "that's wrong",
537
+ 'แน่ใจไหม', 'จริงเหรอ', 'จริงไหม', 'ผิดแล้ว', 'ไม่จริง',
538
+ ];
539
+ let sandbagState = { lastUserQuestion: '', lastAiAnswer: '', awaitingTestAnswer: false, lastHedge: '' };
540
+
541
+ function attachUserInputWatcher() {
542
+ document.addEventListener('keydown', (ev) => {
543
+ if (ev.key !== 'Enter' || ev.shiftKey) return;
544
+ const target = ev.target;
545
+ if (!target || !(target.tagName === 'TEXTAREA' || target.tagName === 'INPUT' || target.isContentEditable)) return;
546
+ const txt = ((target.value || target.textContent || '') + '').toLowerCase();
547
+ if (!txt) return;
548
+ let hedge = '';
549
+ for (const trig of HEDGE_TRIGGERS) {
550
+ if (txt.includes(trig)) { hedge = trig; break; }
551
+ }
552
+ if (hedge && sandbagState.lastAiAnswer) {
553
+ sandbagState.awaitingTestAnswer = true;
554
+ sandbagState.lastUserQuestion = txt.slice(0, 240);
555
+ sandbagState.lastHedge = hedge;
556
+ } else if (!hedge) {
557
+ sandbagState.lastUserQuestion = txt.slice(0, 240);
558
+ }
559
+ }, true);
560
+ }
561
+
562
+ // Track AI responses so the most recent one is captured as the PROD
563
+ // leg of any future sandbag pair.
564
+ const originalDecorate = decorateContainer;
565
+ decorateContainer = function patchedDecorate(node) {
566
+ originalDecorate(node);
567
+ try {
568
+ const txt = ((node && node.textContent) || '').slice(0, 600);
569
+ if (!txt) return;
570
+ if (sandbagState.awaitingTestAnswer && sandbagState.lastAiAnswer && POLYGRAPH_BRIDGE) {
571
+ const body = {
572
+ vendor: SITE,
573
+ question: sandbagState.lastUserQuestion,
574
+ prodAnswer: sandbagState.lastAiAnswer,
575
+ testAnswer: txt,
576
+ hedge: sandbagState.lastHedge,
577
+ };
578
+ try {
579
+ GM_xmlhttpRequest({
580
+ method: 'POST',
581
+ url: POLYGRAPH_BRIDGE + '/v1/polygraph/sandbag-capture',
582
+ headers: { 'Content-Type': 'application/json', 'Authorization': 'Bearer ' + POLYGRAPH_TOKEN },
583
+ data: JSON.stringify(body),
584
+ timeout: 4000,
585
+ onload: (r) => {
586
+ try {
587
+ const v = JSON.parse(r.responseText);
588
+ if (v && v.ok && typeof v.drift === 'number' && Math.abs(v.drift) >= 0.15) {
589
+ showSandbagBanner(SITE, v.drift, sandbagState.lastHedge);
590
+ }
591
+ } catch {}
592
+ },
593
+ onerror: () => {}, ontimeout: () => {},
594
+ });
595
+ } catch {}
596
+ sandbagState.awaitingTestAnswer = false;
597
+ sandbagState.lastHedge = '';
598
+ }
599
+ sandbagState.lastAiAnswer = txt;
600
+ } catch {}
601
+ };
602
+
603
+ function showSandbagBanner(vendor, drift, hedge) {
604
+ const existing = document.getElementById('mneme-sandbag-banner');
605
+ if (existing) existing.remove();
606
+ const banner = document.createElement('div');
607
+ banner.id = 'mneme-sandbag-banner';
608
+ banner.style.cssText = 'position:fixed;top:14px;left:50%;transform:translateX(-50%);z-index:99999;background:linear-gradient(135deg,#ff5b5b,#7c3aed);color:#fff;padding:10px 18px;border-radius:10px;font-family:ui-sans-serif,system-ui,sans-serif;font-size:13px;font-weight:600;box-shadow:0 6px 20px rgba(0,0,0,0.4);cursor:pointer;max-width:560px;text-align:center;';
609
+ const pct = Math.round(Math.abs(drift) * 100);
610
+ banner.innerHTML = '⚠️ <strong>Mneme polygraph: SANDBAG signal</strong><br><span style="font-weight:400;font-size:12px;opacity:0.95">' + vendor + ' answered ' + pct + '% differently after you said "' + (hedge || 'hedge') + '". Click to dismiss.</span>';
611
+ banner.addEventListener('click', () => banner.remove());
612
+ document.body.appendChild(banner);
613
+ setTimeout(() => banner.remove(), 12000);
614
+ }
615
+
523
616
  async function bootPolygraph() {
524
617
  ekgInit();
525
- // Resolve the bridge BEFORE the first MutationObserver fire so dots
526
- // get real verdicts on the very first AI response instead of greys.
527
618
  POLYGRAPH_BRIDGE = await resolveBridgeUrl();
619
+ attachUserInputWatcher();
528
620
  const obs = new MutationObserver(onMutation);
529
621
  obs.observe(document.body, { childList: true, subtree: true, characterData: true });
530
622
  onMutation();
531
- console.log('[Mneme] Polygraph armed site=' + SITE + ' · bridge=' + (POLYGRAPH_BRIDGE || 'OFFLINE (run: mneme polygraph autosetup)'));
623
+ console.log('[Mneme] Polygraph armed | site=' + SITE + ' | bridge=' + (POLYGRAPH_BRIDGE || 'OFFLINE') + ' | sandbag auto-capture: ON');
532
624
  }
533
- // Defer to document-idle so the AI page's initial DOM is settled.
534
625
  if (document.readyState === 'complete' || document.readyState === 'interactive') bootPolygraph();
535
626
  else window.addEventListener('DOMContentLoaded', bootPolygraph);
536
627
  })();
@@ -1 +1 @@
1
- {"version":3,"file":"userscript_generator.js","sourceRoot":"","sources":["../../src/permeate/userscript_generator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AA6BH,MAAM,UAAU,kBAAkB,CAAC,IAAuB;IACxD,MAAM,MAAM,GAAG;QACb,mBAAmB;QACnB,sCAAsC;QACtC,4DAA4D;QAC5D,oBAAoB,IAAI,CAAC,YAAY,EAAE;QACvC,8IAA8I;QAC9I,wBAAwB;QACxB,wCAAwC;QACxC,2GAA2G;QAC3G,4CAA4C;QAC5C,8CAA8C;QAC9C,gDAAgD;QAChD,sCAAsC;QACtC,kDAAkD;QAClD,8CAA8C;QAC9C,2CAA2C;QAC3C,kCAAkC;QAClC,oCAAoC;QACpC,gCAAgC;QAChC,oBAAoB;KACrB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEb,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS;QAChC,CAAC,CAAC;;qBAEe,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC;uBAC5B,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC;;;;;;;;;;;;CAY5D;QACG,CAAC,CAAC,EAAE,CAAC;IAEP,MAAM,IAAI,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqGd,CAAC,IAAI,EAAE,CAAC;IAEP,0DAA0D;IAC1D,oEAAoE;IACpE,sEAAsE;IACtE,gCAAgC;IAChC,gEAAgE;IAChE,qEAAqE;IACrE,gEAAgE;IAChE,wEAAwE;IACxE,sDAAsD;IACtD,mEAAmE;IACnE,qEAAqE;IACrE,0EAA0E;IAC1E,qDAAqD;IACrD,wEAAwE;IACxE,sEAAsE;IACtE,MAAM,cAAc,GAAG,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS;QACrD,CAAC,CAAC;;;;;;;;;;;;;;mCAc6B,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC;mCAC9B,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsVxE;QACG,CAAC,CAAC,EAAE,CAAC;IAEP,MAAM,OAAO,GAAG,GAAG,MAAM,OAAO,WAAW,GAAG,IAAI,KAAK,cAAc,EAAE,CAAC;IACxE,OAAO;QACL,OAAO;QACP,QAAQ,EAAE,IAAI,CAAC,SAAS;YACtB,CAAC,CAAC,mBAAmB,IAAI,CAAC,YAAY,UAAU;YAChD,CAAC,CAAC,uBAAuB,IAAI,CAAC,YAAY,UAAU;QACtD,WAAW,EAAE,IAAI,CAAC,SAAS;YACzB,CAAC,CAAC,qYAAqY;YACvY,CAAC,CAAC,sSAAsS;KAC3S,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"userscript_generator.js","sourceRoot":"","sources":["../../src/permeate/userscript_generator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AA6BH,MAAM,UAAU,kBAAkB,CAAC,IAAuB;IACxD,MAAM,MAAM,GAAG;QACb,mBAAmB;QACnB,sCAAsC;QACtC,4DAA4D;QAC5D,oBAAoB,IAAI,CAAC,YAAY,EAAE;QACvC,8IAA8I;QAC9I,wBAAwB;QACxB,wCAAwC;QACxC,2GAA2G;QAC3G,4CAA4C;QAC5C,8CAA8C;QAC9C,gDAAgD;QAChD,sCAAsC;QACtC,kDAAkD;QAClD,8CAA8C;QAC9C,2CAA2C;QAC3C,kCAAkC;QAClC,oCAAoC;QACpC,gCAAgC;QAChC,oBAAoB;KACrB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEb,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS;QAChC,CAAC,CAAC;;qBAEe,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC;uBAC5B,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC;;;;;;;;;;;;CAY5D;QACG,CAAC,CAAC,EAAE,CAAC;IAEP,MAAM,IAAI,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqGd,CAAC,IAAI,EAAE,CAAC;IAEP,0DAA0D;IAC1D,oEAAoE;IACpE,sEAAsE;IACtE,gCAAgC;IAChC,gEAAgE;IAChE,qEAAqE;IACrE,gEAAgE;IAChE,wEAAwE;IACxE,sDAAsD;IACtD,mEAAmE;IACnE,qEAAqE;IACrE,0EAA0E;IAC1E,qDAAqD;IACrD,wEAAwE;IACxE,sEAAsE;IACtE,MAAM,cAAc,GAAG,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS;QACrD,CAAC,CAAC;;;;;;;;;;;;;;mCAc6B,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC;mCAC9B,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAibxE;QACG,CAAC,CAAC,EAAE,CAAC;IAEP,MAAM,OAAO,GAAG,GAAG,MAAM,OAAO,WAAW,GAAG,IAAI,KAAK,cAAc,EAAE,CAAC;IACxE,OAAO;QACL,OAAO;QACP,QAAQ,EAAE,IAAI,CAAC,SAAS;YACtB,CAAC,CAAC,mBAAmB,IAAI,CAAC,YAAY,UAAU;YAChD,CAAC,CAAC,uBAAuB,IAAI,CAAC,YAAY,UAAU;QACtD,WAAW,EAAE,IAAI,CAAC,SAAS;YACzB,CAAC,CAAC,qYAAqY;YACvY,CAAC,CAAC,sSAAsS;KAC3S,CAAC;AACJ,CAAC"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@mneme-ai/core",
3
- "version": "2.19.84",
4
- "description": "Core indexing, retrieval, and graph engine for Mneme",
3
+ "version": "2.19.85-lite",
4
+ "description": "Core indexing, retrieval, and graph engine for Mneme — LITE variant (no bundled WASM embedder, no native deps).",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
7
7
  "types": "./dist/index.d.ts",
@@ -69,8 +69,5 @@
69
69
  },
70
70
  "engines": {
71
71
  "node": ">=22.13.0 <25.0.0"
72
- },
73
- "optionalDependencies": {
74
- "z3-solver": "^4.16.0"
75
72
  }
76
73
  }