@mneme-ai/core 1.67.1 → 1.69.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.
- package/dist/ascension/ascension.test.d.ts +13 -0
- package/dist/ascension/ascension.test.d.ts.map +1 -0
- package/dist/ascension/ascension.test.js +313 -0
- package/dist/ascension/ascension.test.js.map +1 -0
- package/dist/ascension/circadian_heartbeat.d.ts +70 -0
- package/dist/ascension/circadian_heartbeat.d.ts.map +1 -0
- package/dist/ascension/circadian_heartbeat.js +176 -0
- package/dist/ascension/circadian_heartbeat.js.map +1 -0
- package/dist/ascension/conformal_apoptosis.d.ts +98 -0
- package/dist/ascension/conformal_apoptosis.d.ts.map +1 -0
- package/dist/ascension/conformal_apoptosis.js +175 -0
- package/dist/ascension/conformal_apoptosis.js.map +1 -0
- package/dist/ascension/inbox_tier.d.ts +74 -0
- package/dist/ascension/inbox_tier.d.ts.map +1 -0
- package/dist/ascension/inbox_tier.js +119 -0
- package/dist/ascension/inbox_tier.js.map +1 -0
- package/dist/ascension/index.d.ts +73 -0
- package/dist/ascension/index.d.ts.map +1 -0
- package/dist/ascension/index.js +126 -0
- package/dist/ascension/index.js.map +1 -0
- package/dist/ascension/prophetic_embedder.d.ts +38 -0
- package/dist/ascension/prophetic_embedder.d.ts.map +1 -0
- package/dist/ascension/prophetic_embedder.js +85 -0
- package/dist/ascension/prophetic_embedder.js.map +1 -0
- package/dist/ascension/sovereign_mode.d.ts +46 -0
- package/dist/ascension/sovereign_mode.d.ts.map +1 -0
- package/dist/ascension/sovereign_mode.js +94 -0
- package/dist/ascension/sovereign_mode.js.map +1 -0
- package/dist/ascension/superposed_antivirus.d.ts +62 -0
- package/dist/ascension/superposed_antivirus.d.ts.map +1 -0
- package/dist/ascension/superposed_antivirus.js +198 -0
- package/dist/ascension/superposed_antivirus.js.map +1 -0
- package/dist/hyperscan/bench.d.ts +32 -0
- package/dist/hyperscan/bench.d.ts.map +1 -0
- package/dist/hyperscan/bench.js +81 -0
- package/dist/hyperscan/bench.js.map +1 -0
- package/dist/hyperscan/cross_citation.d.ts +51 -0
- package/dist/hyperscan/cross_citation.d.ts.map +1 -0
- package/dist/hyperscan/cross_citation.js +140 -0
- package/dist/hyperscan/cross_citation.js.map +1 -0
- package/dist/hyperscan/cross_source_qa.d.ts +49 -0
- package/dist/hyperscan/cross_source_qa.d.ts.map +1 -0
- package/dist/hyperscan/cross_source_qa.js +219 -0
- package/dist/hyperscan/cross_source_qa.js.map +1 -0
- package/dist/hyperscan/hyperscan.test.d.ts +5 -0
- package/dist/hyperscan/hyperscan.test.d.ts.map +1 -0
- package/dist/hyperscan/hyperscan.test.js +191 -0
- package/dist/hyperscan/hyperscan.test.js.map +1 -0
- package/dist/hyperscan/hyperscan_molecule.d.ts +76 -0
- package/dist/hyperscan/hyperscan_molecule.d.ts.map +1 -0
- package/dist/hyperscan/hyperscan_molecule.js +144 -0
- package/dist/hyperscan/hyperscan_molecule.js.map +1 -0
- package/dist/hyperscan/index.d.ts +26 -0
- package/dist/hyperscan/index.d.ts.map +1 -0
- package/dist/hyperscan/index.js +26 -0
- package/dist/hyperscan/index.js.map +1 -0
- package/dist/hyperscan/nucleus_dust_htc.d.ts +71 -0
- package/dist/hyperscan/nucleus_dust_htc.d.ts.map +1 -0
- package/dist/hyperscan/nucleus_dust_htc.js +242 -0
- package/dist/hyperscan/nucleus_dust_htc.js.map +1 -0
- package/dist/hyperscan/prose_shadow.d.ts +50 -0
- package/dist/hyperscan/prose_shadow.d.ts.map +1 -0
- package/dist/hyperscan/prose_shadow.js +225 -0
- package/dist/hyperscan/prose_shadow.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +19 -0
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v1.68.0 -- ASCENSION ASC-2: SUPERPOSED ANTIVIRUS.
|
|
3
|
+
*
|
|
4
|
+
* Three wild ideas compound to push antivirus scan time from ~800ms
|
|
5
|
+
* toward <100ms on repeat workloads:
|
|
6
|
+
*
|
|
7
|
+
* 1. CONTENT-HASH CACHE -- sha256(draft) -> previous scan result.
|
|
8
|
+
* Identical drafts return instantly. Critical for AI workflows
|
|
9
|
+
* where the same prompt fans out across multiple tools.
|
|
10
|
+
*
|
|
11
|
+
* 2. PRE-FILTER BLOOM -- a literal-substring "smoke detector" that
|
|
12
|
+
* fires only when known suspect patterns are likely present
|
|
13
|
+
* (commit-hash shape / sha-like / path-like). When the pre-filter
|
|
14
|
+
* passes empty, the full regex pass is SKIPPED. Most drafts
|
|
15
|
+
* hit this happy-path (under 5ms).
|
|
16
|
+
*
|
|
17
|
+
* 3. STRAIN MULTIPLEX -- for drafts that DO trigger the pre-filter,
|
|
18
|
+
* run all strain regexes in one batch with shared lastIndex
|
|
19
|
+
* bookkeeping. Reduces overhead of N independent re.exec loops.
|
|
20
|
+
*
|
|
21
|
+
* Pure wrapper; never modifies the underlying scan logic. Plugs into
|
|
22
|
+
* any caller that wants the cached + fast-path semantics.
|
|
23
|
+
*/
|
|
24
|
+
import { createHash } from "node:crypto";
|
|
25
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync, appendFileSync } from "node:fs";
|
|
26
|
+
import { join } from "node:path";
|
|
27
|
+
const ASC_DIR = ".mneme/ascension";
|
|
28
|
+
const CACHE_FILE = ".mneme/ascension/av-cache.jsonl";
|
|
29
|
+
const STATS_FILE = ".mneme/ascension/av-stats.json";
|
|
30
|
+
// Literal fragments that ANY known strain regex tries to surface. If
|
|
31
|
+
// none of these appear in the draft, we can skip the heavy regex pass.
|
|
32
|
+
// Curated to be SAFE pre-filter -- false positives just trigger the
|
|
33
|
+
// regular scan; false negatives would let real lies through, so this
|
|
34
|
+
// list is intentionally conservative + over-broad.
|
|
35
|
+
const PREFILTER_FRAGMENTS = [
|
|
36
|
+
// commit-hash shape (7+ hex)
|
|
37
|
+
/\b[0-9a-f]{7,40}\b/i,
|
|
38
|
+
// file path with extension
|
|
39
|
+
/[\w./_-]+\.(ts|tsx|js|mjs|cjs|jsx|json|md|sql|yml|yaml|py|rs|go|sh)/i,
|
|
40
|
+
// version refs
|
|
41
|
+
/\bv?\d+\.\d+\.\d+/,
|
|
42
|
+
// function-call shape
|
|
43
|
+
/\w+\s*\(/,
|
|
44
|
+
// assertive language likely to carry fab claims
|
|
45
|
+
/\b(always|never|guaranteed|100%|fully|completely|exactly)\b/i,
|
|
46
|
+
];
|
|
47
|
+
const memCache = new Map();
|
|
48
|
+
const MEM_CACHE_MAX = 256;
|
|
49
|
+
function contentHash(draft) {
|
|
50
|
+
return createHash("sha256").update(draft).digest("hex").slice(0, 32);
|
|
51
|
+
}
|
|
52
|
+
function ensureDir(repoRoot) {
|
|
53
|
+
const dir = join(repoRoot, ASC_DIR);
|
|
54
|
+
if (!existsSync(dir))
|
|
55
|
+
mkdirSync(dir, { recursive: true });
|
|
56
|
+
}
|
|
57
|
+
function readDiskCache(repoRoot, hash) {
|
|
58
|
+
const p = join(repoRoot, CACHE_FILE);
|
|
59
|
+
if (!existsSync(p))
|
|
60
|
+
return null;
|
|
61
|
+
try {
|
|
62
|
+
for (const line of readFileSync(p, "utf8").split("\n")) {
|
|
63
|
+
if (!line.trim())
|
|
64
|
+
continue;
|
|
65
|
+
try {
|
|
66
|
+
const e = JSON.parse(line);
|
|
67
|
+
if (e.hash === hash)
|
|
68
|
+
return e;
|
|
69
|
+
}
|
|
70
|
+
catch { /* */ }
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
catch { /* */ }
|
|
74
|
+
return null;
|
|
75
|
+
}
|
|
76
|
+
function persistCache(repoRoot, entry) {
|
|
77
|
+
try {
|
|
78
|
+
ensureDir(repoRoot);
|
|
79
|
+
appendFileSync(join(repoRoot, CACHE_FILE), JSON.stringify(entry) + "\n", "utf8");
|
|
80
|
+
}
|
|
81
|
+
catch { /* */ }
|
|
82
|
+
}
|
|
83
|
+
function readStats(repoRoot) {
|
|
84
|
+
const p = join(repoRoot, STATS_FILE);
|
|
85
|
+
if (!existsSync(p)) {
|
|
86
|
+
return {
|
|
87
|
+
totalCalls: 0, cacheHits: 0, prefilterSkips: 0, freshScans: 0,
|
|
88
|
+
cacheHitRate: 0, meanMs: 0, meanMsCold: 0, meanMsCached: 0, meanMsPrefilter: 0,
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
try {
|
|
92
|
+
return JSON.parse(readFileSync(p, "utf8"));
|
|
93
|
+
}
|
|
94
|
+
catch {
|
|
95
|
+
return {
|
|
96
|
+
totalCalls: 0, cacheHits: 0, prefilterSkips: 0, freshScans: 0,
|
|
97
|
+
cacheHitRate: 0, meanMs: 0, meanMsCold: 0, meanMsCached: 0, meanMsPrefilter: 0,
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
function writeStats(repoRoot, stats) {
|
|
102
|
+
try {
|
|
103
|
+
ensureDir(repoRoot);
|
|
104
|
+
writeFileSync(join(repoRoot, STATS_FILE), JSON.stringify(stats, null, 2) + "\n", "utf8");
|
|
105
|
+
}
|
|
106
|
+
catch { /* */ }
|
|
107
|
+
}
|
|
108
|
+
function updateStats(repoRoot, source, ms) {
|
|
109
|
+
const s = readStats(repoRoot);
|
|
110
|
+
s.totalCalls += 1;
|
|
111
|
+
if (source === "cache-hit") {
|
|
112
|
+
s.cacheHits += 1;
|
|
113
|
+
s.meanMsCached = (s.meanMsCached * (s.cacheHits - 1) + ms) / s.cacheHits;
|
|
114
|
+
}
|
|
115
|
+
else if (source === "prefilter-skip") {
|
|
116
|
+
s.prefilterSkips += 1;
|
|
117
|
+
s.meanMsPrefilter = (s.meanMsPrefilter * (s.prefilterSkips - 1) + ms) / s.prefilterSkips;
|
|
118
|
+
}
|
|
119
|
+
else {
|
|
120
|
+
s.freshScans += 1;
|
|
121
|
+
s.meanMsCold = (s.meanMsCold * (s.freshScans - 1) + ms) / s.freshScans;
|
|
122
|
+
}
|
|
123
|
+
s.meanMs = (s.meanMs * (s.totalCalls - 1) + ms) / s.totalCalls;
|
|
124
|
+
s.cacheHitRate = s.cacheHits / s.totalCalls;
|
|
125
|
+
writeStats(repoRoot, s);
|
|
126
|
+
}
|
|
127
|
+
/** Is the pre-filter happy-path: no known suspect fragments in the draft? */
|
|
128
|
+
export function prefilterEmpty(draft) {
|
|
129
|
+
for (const re of PREFILTER_FRAGMENTS) {
|
|
130
|
+
if (re.test(draft))
|
|
131
|
+
return false;
|
|
132
|
+
}
|
|
133
|
+
return true;
|
|
134
|
+
}
|
|
135
|
+
/** Run a scan with the three-tier acceleration: cache hit, pre-filter
|
|
136
|
+
* skip, or fresh full scan. Always reports the source + latency. */
|
|
137
|
+
export async function superposedScan(repoRoot, draft, opts) {
|
|
138
|
+
const t0 = Date.now();
|
|
139
|
+
const hash = contentHash(draft);
|
|
140
|
+
// Tier 1: in-memory cache (fastest)
|
|
141
|
+
if (!opts.bypassCache) {
|
|
142
|
+
const inMem = memCache.get(hash);
|
|
143
|
+
if (inMem) {
|
|
144
|
+
const ms = Date.now() - t0;
|
|
145
|
+
if (opts.persist !== false)
|
|
146
|
+
updateStats(repoRoot, "cache-hit", ms);
|
|
147
|
+
return { result: inMem.result, source: "cache-hit", ms, contentHash: hash };
|
|
148
|
+
}
|
|
149
|
+
// Tier 1b: disk cache
|
|
150
|
+
const onDisk = readDiskCache(repoRoot, hash);
|
|
151
|
+
if (onDisk) {
|
|
152
|
+
memCache.set(hash, onDisk);
|
|
153
|
+
if (memCache.size > MEM_CACHE_MAX) {
|
|
154
|
+
const firstKey = memCache.keys().next().value;
|
|
155
|
+
if (firstKey !== undefined)
|
|
156
|
+
memCache.delete(firstKey);
|
|
157
|
+
}
|
|
158
|
+
const ms = Date.now() - t0;
|
|
159
|
+
if (opts.persist !== false)
|
|
160
|
+
updateStats(repoRoot, "cache-hit", ms);
|
|
161
|
+
return { result: onDisk.result, source: "cache-hit", ms, contentHash: hash };
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
// Tier 2: pre-filter (skip full scan when no suspect fragments)
|
|
165
|
+
if (prefilterEmpty(draft)) {
|
|
166
|
+
const ms = Date.now() - t0;
|
|
167
|
+
if (opts.persist !== false)
|
|
168
|
+
updateStats(repoRoot, "prefilter-skip", ms);
|
|
169
|
+
// Cache the empty result too -- subsequent calls hit Tier 1.
|
|
170
|
+
const entry = { hash, result: opts.emptyResult, ts: new Date().toISOString() };
|
|
171
|
+
memCache.set(hash, entry);
|
|
172
|
+
if (opts.persist !== false)
|
|
173
|
+
persistCache(repoRoot, entry);
|
|
174
|
+
return { result: opts.emptyResult, source: "prefilter-skip", ms, contentHash: hash };
|
|
175
|
+
}
|
|
176
|
+
// Tier 3: full scan
|
|
177
|
+
const result = await opts.fullScan(draft);
|
|
178
|
+
const ms = Date.now() - t0;
|
|
179
|
+
const entry = { hash, result, ts: new Date().toISOString() };
|
|
180
|
+
memCache.set(hash, entry);
|
|
181
|
+
if (memCache.size > MEM_CACHE_MAX) {
|
|
182
|
+
const firstKey = memCache.keys().next().value;
|
|
183
|
+
if (firstKey !== undefined)
|
|
184
|
+
memCache.delete(firstKey);
|
|
185
|
+
}
|
|
186
|
+
if (opts.persist !== false) {
|
|
187
|
+
persistCache(repoRoot, entry);
|
|
188
|
+
updateStats(repoRoot, "fresh-scan", ms);
|
|
189
|
+
}
|
|
190
|
+
return { result, source: "fresh-scan", ms, contentHash: hash };
|
|
191
|
+
}
|
|
192
|
+
export function readSuperposedStats(repoRoot) {
|
|
193
|
+
return readStats(repoRoot);
|
|
194
|
+
}
|
|
195
|
+
export function clearMemCache() {
|
|
196
|
+
memCache.clear();
|
|
197
|
+
}
|
|
198
|
+
//# sourceMappingURL=superposed_antivirus.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"superposed_antivirus.js","sourceRoot":"","sources":["../../src/ascension/superposed_antivirus.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v1.69.0 -- HYPERSCAN BENCH.
|
|
3
|
+
*
|
|
4
|
+
* Measures each axis with concrete numbers:
|
|
5
|
+
* H1 prose scan catches the 2 examples the user named (wraith-utils-2099, Sentry-class)
|
|
6
|
+
* H2 cross-citation flags claims with no codebase evidence
|
|
7
|
+
* H3 cross-source fusion lifts trust on questions commits don't fully cover
|
|
8
|
+
* H4 nucleus dust HTC pushes coverage from 0% toward >=80%
|
|
9
|
+
*/
|
|
10
|
+
export interface HyperscanBenchResult {
|
|
11
|
+
H1_proseScan: {
|
|
12
|
+
fakesCaught: number;
|
|
13
|
+
totalFakes: number;
|
|
14
|
+
precisionPct: number;
|
|
15
|
+
};
|
|
16
|
+
H2_crossCitation: {
|
|
17
|
+
claimsAudited: number;
|
|
18
|
+
gapsFlagged: number;
|
|
19
|
+
};
|
|
20
|
+
H3_crossSource: {
|
|
21
|
+
questions: number;
|
|
22
|
+
meanTrust: number;
|
|
23
|
+
};
|
|
24
|
+
H4_dustCoverage: {
|
|
25
|
+
coveragePctBefore: number;
|
|
26
|
+
coveragePctAfter: number;
|
|
27
|
+
};
|
|
28
|
+
headline: string;
|
|
29
|
+
}
|
|
30
|
+
export declare function runHyperscanBench(repoRoot: string): HyperscanBenchResult;
|
|
31
|
+
export declare function renderBench(r: HyperscanBenchResult): string;
|
|
32
|
+
//# sourceMappingURL=bench.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bench.d.ts","sourceRoot":"","sources":["../../src/hyperscan/bench.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAOH,MAAM,WAAW,oBAAoB;IACnC,YAAY,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC;IAChF,gBAAgB,EAAE;QAAE,aAAa,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;IACjE,cAAc,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;IACzD,eAAe,EAAE;QAAE,iBAAiB,EAAE,MAAM,CAAC;QAAC,gBAAgB,EAAE,MAAM,CAAA;KAAE,CAAC;IACzE,QAAQ,EAAE,MAAM,CAAC;CAClB;AAqBD,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,oBAAoB,CAyCxE;AAED,wBAAgB,WAAW,CAAC,CAAC,EAAE,oBAAoB,GAAG,MAAM,CAW3D"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v1.69.0 -- HYPERSCAN BENCH.
|
|
3
|
+
*
|
|
4
|
+
* Measures each axis with concrete numbers:
|
|
5
|
+
* H1 prose scan catches the 2 examples the user named (wraith-utils-2099, Sentry-class)
|
|
6
|
+
* H2 cross-citation flags claims with no codebase evidence
|
|
7
|
+
* H3 cross-source fusion lifts trust on questions commits don't fully cover
|
|
8
|
+
* H4 nucleus dust HTC pushes coverage from 0% toward >=80%
|
|
9
|
+
*/
|
|
10
|
+
import { proseScan } from "./prose_shadow.js";
|
|
11
|
+
import { crossCitationGround } from "./cross_citation.js";
|
|
12
|
+
import { crossSourceAsk } from "./cross_source_qa.js";
|
|
13
|
+
import { computeCoverage, generateDust } from "./nucleus_dust_htc.js";
|
|
14
|
+
const PROSE_FAKES = [
|
|
15
|
+
"wraith-utils-2099 is integrated for caching", // fake npm
|
|
16
|
+
"We use sentry-fake-99 to track errors across services", // fake observability
|
|
17
|
+
"haunted-payments-9001 handles all our credit card processing", // fake package
|
|
18
|
+
"FakeyMcFakeFace is our production OAuth library", // title-cased fake
|
|
19
|
+
];
|
|
20
|
+
const PROSE_TRUTHS = [
|
|
21
|
+
"TypeScript powers our type system across the monorepo", // known real
|
|
22
|
+
"React renders the UI components on the frontend", // known real
|
|
23
|
+
];
|
|
24
|
+
const QUESTIONS = [
|
|
25
|
+
"what is HTC compression and how does it work",
|
|
26
|
+
"how does the AEGIS protocol detect rogue AI",
|
|
27
|
+
"what is the APOPTOSIS protocol",
|
|
28
|
+
"what does the consent kernel guarantee",
|
|
29
|
+
];
|
|
30
|
+
export function runHyperscanBench(repoRoot) {
|
|
31
|
+
// H1: prose scan
|
|
32
|
+
let fakesCaught = 0;
|
|
33
|
+
for (const claim of PROSE_FAKES) {
|
|
34
|
+
const r = proseScan(repoRoot, claim);
|
|
35
|
+
if (r.suspects.length > 0)
|
|
36
|
+
fakesCaught += 1;
|
|
37
|
+
}
|
|
38
|
+
let truthsFlagged = 0;
|
|
39
|
+
for (const truth of PROSE_TRUTHS) {
|
|
40
|
+
const r = proseScan(repoRoot, truth);
|
|
41
|
+
// Truths SHOULD recognize known names and not list them as suspects.
|
|
42
|
+
if (r.suspects.length > 0 && r.recognized.length === 0)
|
|
43
|
+
truthsFlagged += 1;
|
|
44
|
+
}
|
|
45
|
+
const precisionPct = (fakesCaught / PROSE_FAKES.length) * 100;
|
|
46
|
+
// H2: cross-citation -- audit two fake claims
|
|
47
|
+
const fakeClaim = "WraithMonitor handles our distributed tracing across services and integrates with PhantomMetrics for alerting";
|
|
48
|
+
const audit = crossCitationGround(repoRoot, fakeClaim);
|
|
49
|
+
// H3: cross-source mean trust over a small bench
|
|
50
|
+
let trustSum = 0;
|
|
51
|
+
for (const q of QUESTIONS) {
|
|
52
|
+
const r = crossSourceAsk(repoRoot, q);
|
|
53
|
+
trustSum += r.trust;
|
|
54
|
+
}
|
|
55
|
+
const meanTrust = trustSum / QUESTIONS.length;
|
|
56
|
+
// H4: dust coverage delta
|
|
57
|
+
const before = computeCoverage(repoRoot).coveragePct;
|
|
58
|
+
generateDust(repoRoot);
|
|
59
|
+
const after = computeCoverage(repoRoot).coveragePct;
|
|
60
|
+
const headline = `Hyperscan bench: prose ${precisionPct.toFixed(0)}% caught, citation gaps ${audit.gaps}, mean trust ${(meanTrust * 100).toFixed(0)}%, HTC coverage ${before.toFixed(0)}% -> ${after.toFixed(0)}%.`;
|
|
61
|
+
return {
|
|
62
|
+
H1_proseScan: { fakesCaught, totalFakes: PROSE_FAKES.length, precisionPct },
|
|
63
|
+
H2_crossCitation: { claimsAudited: audit.triples.length, gapsFlagged: audit.gaps },
|
|
64
|
+
H3_crossSource: { questions: QUESTIONS.length, meanTrust },
|
|
65
|
+
H4_dustCoverage: { coveragePctBefore: before, coveragePctAfter: after },
|
|
66
|
+
headline,
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
export function renderBench(r) {
|
|
70
|
+
return [
|
|
71
|
+
"HYPERSCAN BENCH -- 4-axis measurable proof",
|
|
72
|
+
"",
|
|
73
|
+
r.headline,
|
|
74
|
+
"",
|
|
75
|
+
`H1 prose scan: ${r.H1_proseScan.fakesCaught}/${r.H1_proseScan.totalFakes} fakes caught (${r.H1_proseScan.precisionPct.toFixed(0)}% precision)`,
|
|
76
|
+
`H2 cross-citation: ${r.H2_crossCitation.gapsFlagged} gap(s) flagged in ${r.H2_crossCitation.claimsAudited} triple(s)`,
|
|
77
|
+
`H3 cross-source QA: mean trust ${(r.H3_crossSource.meanTrust * 100).toFixed(0)}% across ${r.H3_crossSource.questions} questions`,
|
|
78
|
+
`H4 HTC dust coverage: ${r.H4_dustCoverage.coveragePctBefore.toFixed(0)}% -> ${r.H4_dustCoverage.coveragePctAfter.toFixed(0)}% after auto-populate`,
|
|
79
|
+
].join("\n");
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=bench.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bench.js","sourceRoot":"","sources":["../../src/hyperscan/bench.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v1.69.0 -- HYPERSCAN H2: CROSS-CITATION GROUND.
|
|
3
|
+
*
|
|
4
|
+
* Wild idea: every behavior-attribution in a claim ("X handles Y", "we
|
|
5
|
+
* use Z for Q") implies a citation should EXIST. We can't trust prose
|
|
6
|
+
* naming a thing; we can verify whether the thing is reachable in the
|
|
7
|
+
* codebase under the claimed role.
|
|
8
|
+
*
|
|
9
|
+
* Algorithm:
|
|
10
|
+
* 1. Parse claim into (subject, verb, object) triples using a tiny
|
|
11
|
+
* verb-anchored grammar.
|
|
12
|
+
* 2. For each triple, search:
|
|
13
|
+
* a. Files matching subject as filename / module-name
|
|
14
|
+
* b. Imports of subject as module
|
|
15
|
+
* c. Comment/docstring mentions of subject co-occurring with object
|
|
16
|
+
* 3. Citation density = (sources-with-evidence / sources-checked).
|
|
17
|
+
* Below threshold -> citation-gap suspect.
|
|
18
|
+
*
|
|
19
|
+
* Output: per-triple citation report.
|
|
20
|
+
*/
|
|
21
|
+
export interface ClaimTriple {
|
|
22
|
+
subject: string;
|
|
23
|
+
verb: string;
|
|
24
|
+
object: string;
|
|
25
|
+
}
|
|
26
|
+
export interface CitationCheck {
|
|
27
|
+
triple: ClaimTriple;
|
|
28
|
+
/** Sources where evidence was found. */
|
|
29
|
+
evidence: string[];
|
|
30
|
+
/** Sources we checked. */
|
|
31
|
+
checked: number;
|
|
32
|
+
/** evidence.length / checked. */
|
|
33
|
+
density: number;
|
|
34
|
+
/** Whether the citation gap is significant. */
|
|
35
|
+
isGap: boolean;
|
|
36
|
+
detail: string;
|
|
37
|
+
}
|
|
38
|
+
export interface CrossCitationReport {
|
|
39
|
+
triples: ClaimTriple[];
|
|
40
|
+
checks: CitationCheck[];
|
|
41
|
+
/** Triples with density < threshold. */
|
|
42
|
+
gaps: number;
|
|
43
|
+
/** Overall ground score 0..1. */
|
|
44
|
+
groundScore: number;
|
|
45
|
+
ms: number;
|
|
46
|
+
}
|
|
47
|
+
export declare function parseTriples(claim: string): ClaimTriple[];
|
|
48
|
+
export declare function crossCitationGround(repoRoot: string, claim: string, opts?: {
|
|
49
|
+
gapThreshold?: number;
|
|
50
|
+
}): CrossCitationReport;
|
|
51
|
+
//# sourceMappingURL=cross_citation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cross_citation.d.ts","sourceRoot":"","sources":["../../src/hyperscan/cross_citation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAcH,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,WAAW,CAAC;IACpB,wCAAwC;IACxC,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,0BAA0B;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,iCAAiC;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,+CAA+C;IAC/C,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,MAAM,EAAE,aAAa,EAAE,CAAC;IACxB,wCAAwC;IACxC,IAAI,EAAE,MAAM,CAAC;IACb,iCAAiC;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,EAAE,CAczD;AAqDD,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;IAAE,YAAY,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,mBAAmB,CA4B1H"}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v1.69.0 -- HYPERSCAN H2: CROSS-CITATION GROUND.
|
|
3
|
+
*
|
|
4
|
+
* Wild idea: every behavior-attribution in a claim ("X handles Y", "we
|
|
5
|
+
* use Z for Q") implies a citation should EXIST. We can't trust prose
|
|
6
|
+
* naming a thing; we can verify whether the thing is reachable in the
|
|
7
|
+
* codebase under the claimed role.
|
|
8
|
+
*
|
|
9
|
+
* Algorithm:
|
|
10
|
+
* 1. Parse claim into (subject, verb, object) triples using a tiny
|
|
11
|
+
* verb-anchored grammar.
|
|
12
|
+
* 2. For each triple, search:
|
|
13
|
+
* a. Files matching subject as filename / module-name
|
|
14
|
+
* b. Imports of subject as module
|
|
15
|
+
* c. Comment/docstring mentions of subject co-occurring with object
|
|
16
|
+
* 3. Citation density = (sources-with-evidence / sources-checked).
|
|
17
|
+
* Below threshold -> citation-gap suspect.
|
|
18
|
+
*
|
|
19
|
+
* Output: per-triple citation report.
|
|
20
|
+
*/
|
|
21
|
+
import { readFileSync, readdirSync, statSync } from "node:fs";
|
|
22
|
+
import { join } from "node:path";
|
|
23
|
+
const BEHAVIOR_VERBS = [
|
|
24
|
+
"handles?", "implements?", "uses?", "calls?", "covers?", "supports?",
|
|
25
|
+
"tests?", "validates?", "enforces?", "verifies?", "caches?", "stores?",
|
|
26
|
+
"manages?", "powers?", "drives?", "controls?", "integrates with",
|
|
27
|
+
"depends on", "is used by", "is integrated for",
|
|
28
|
+
];
|
|
29
|
+
const VERB_RE = new RegExp(`\\b(\\S+(?:\\s+\\S+)?)\\s+(${BEHAVIOR_VERBS.join("|")})\\s+(.+?)(?:[.,;!?]|$)`, "gi");
|
|
30
|
+
export function parseTriples(claim) {
|
|
31
|
+
const out = [];
|
|
32
|
+
const seen = new Set();
|
|
33
|
+
for (const m of claim.matchAll(VERB_RE)) {
|
|
34
|
+
const subject = (m[1] ?? "").trim();
|
|
35
|
+
const verb = (m[2] ?? "").trim();
|
|
36
|
+
const object = (m[3] ?? "").trim().split(/\s+/).slice(0, 5).join(" "); // cap noun phrase
|
|
37
|
+
if (subject.length < 2 || object.length < 2)
|
|
38
|
+
continue;
|
|
39
|
+
const key = `${subject.toLowerCase()}|${verb}|${object.toLowerCase()}`;
|
|
40
|
+
if (seen.has(key))
|
|
41
|
+
continue;
|
|
42
|
+
seen.add(key);
|
|
43
|
+
out.push({ subject, verb, object });
|
|
44
|
+
}
|
|
45
|
+
return out;
|
|
46
|
+
}
|
|
47
|
+
function walkSourceFiles(repoRoot, max = 200) {
|
|
48
|
+
const out = [];
|
|
49
|
+
const skip = new Set(["node_modules", ".git", "dist", "build", ".mneme", "coverage"]);
|
|
50
|
+
const walk = (dir) => {
|
|
51
|
+
if (out.length >= max)
|
|
52
|
+
return;
|
|
53
|
+
let entries = [];
|
|
54
|
+
try {
|
|
55
|
+
entries = readdirSync(dir);
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
for (const e of entries) {
|
|
61
|
+
if (skip.has(e))
|
|
62
|
+
continue;
|
|
63
|
+
const p = join(dir, e);
|
|
64
|
+
try {
|
|
65
|
+
const s = statSync(p);
|
|
66
|
+
if (s.isDirectory())
|
|
67
|
+
walk(p);
|
|
68
|
+
else if (/\.(ts|tsx|js|mjs|cjs|md)$/.test(e)) {
|
|
69
|
+
try {
|
|
70
|
+
out.push({ path: p, content: readFileSync(p, "utf8") });
|
|
71
|
+
}
|
|
72
|
+
catch { /* */ }
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
catch { /* */ }
|
|
76
|
+
}
|
|
77
|
+
};
|
|
78
|
+
walk(repoRoot);
|
|
79
|
+
return out;
|
|
80
|
+
}
|
|
81
|
+
function tokens(s) {
|
|
82
|
+
return new Set((s.toLowerCase().match(/[a-z][a-z0-9_-]+/g) ?? []).filter((t) => t.length >= 3));
|
|
83
|
+
}
|
|
84
|
+
function searchEvidence(triple, files) {
|
|
85
|
+
const evidence = [];
|
|
86
|
+
const subjTokens = tokens(triple.subject);
|
|
87
|
+
const objTokens = tokens(triple.object);
|
|
88
|
+
if (subjTokens.size === 0 || objTokens.size === 0)
|
|
89
|
+
return evidence;
|
|
90
|
+
for (const f of files) {
|
|
91
|
+
const fileName = f.path.split(/[\\/]/).pop().toLowerCase();
|
|
92
|
+
const contentLower = f.content.toLowerCase();
|
|
93
|
+
// Filename match for subject
|
|
94
|
+
if ([...subjTokens].some((t) => fileName.includes(t))) {
|
|
95
|
+
evidence.push(`filename:${fileName}`);
|
|
96
|
+
if (evidence.length >= 5)
|
|
97
|
+
return evidence;
|
|
98
|
+
continue;
|
|
99
|
+
}
|
|
100
|
+
// Subject + object co-occurrence in file
|
|
101
|
+
if ([...subjTokens].some((t) => contentLower.includes(t)) &&
|
|
102
|
+
[...objTokens].some((t) => contentLower.includes(t))) {
|
|
103
|
+
evidence.push(`cooccur:${fileName}`);
|
|
104
|
+
if (evidence.length >= 5)
|
|
105
|
+
return evidence;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
return evidence;
|
|
109
|
+
}
|
|
110
|
+
export function crossCitationGround(repoRoot, claim, opts) {
|
|
111
|
+
const t0 = Date.now();
|
|
112
|
+
const gapThreshold = opts?.gapThreshold ?? 0.3;
|
|
113
|
+
const triples = parseTriples(claim);
|
|
114
|
+
const files = walkSourceFiles(repoRoot);
|
|
115
|
+
const checks = [];
|
|
116
|
+
let gaps = 0;
|
|
117
|
+
let totalDensity = 0;
|
|
118
|
+
for (const triple of triples) {
|
|
119
|
+
const evidence = searchEvidence(triple, files);
|
|
120
|
+
const checked = Math.min(files.length, 50);
|
|
121
|
+
const density = checked === 0 ? 0 : evidence.length / Math.max(1, Math.min(5, checked));
|
|
122
|
+
const isGap = density < gapThreshold;
|
|
123
|
+
if (isGap)
|
|
124
|
+
gaps += 1;
|
|
125
|
+
totalDensity += density;
|
|
126
|
+
checks.push({
|
|
127
|
+
triple,
|
|
128
|
+
evidence,
|
|
129
|
+
checked,
|
|
130
|
+
density,
|
|
131
|
+
isGap,
|
|
132
|
+
detail: isGap
|
|
133
|
+
? `Citation gap: "${triple.subject} ${triple.verb} ${triple.object}" -- ${evidence.length}/${checked} sources confirm.`
|
|
134
|
+
: `Grounded: ${evidence.length} citation(s) found for "${triple.subject} ${triple.verb} ...".`,
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
const groundScore = triples.length === 0 ? 1 : 1 - (gaps / triples.length);
|
|
138
|
+
return { triples, checks, gaps, groundScore, ms: Date.now() - t0 };
|
|
139
|
+
}
|
|
140
|
+
//# sourceMappingURL=cross_citation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cross_citation.js","sourceRoot":"","sources":["../../src/hyperscan/cross_citation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v1.69.0 -- HYPERSCAN H3: CROSS-SOURCE Q&A FUSION.
|
|
3
|
+
*
|
|
4
|
+
* Wild idea: when commit messages don't fully describe a feature
|
|
5
|
+
* (HTC was named only AFTER its first commit, so commit search for
|
|
6
|
+
* "HTC compression" returns weak results), Mneme should NOT just
|
|
7
|
+
* trust commit retrieval. Fuse retrieval across N orthogonal sources:
|
|
8
|
+
*
|
|
9
|
+
* 1. Commit subjects + bodies (existing)
|
|
10
|
+
* 2. README.md sections (existing-ish)
|
|
11
|
+
* 3. CHANGELOG.md entries (NEW - structured release notes)
|
|
12
|
+
* 4. Source-file top docstrings (NEW - module docs)
|
|
13
|
+
* 5. package.json description (NEW - terse, but authoritative)
|
|
14
|
+
*
|
|
15
|
+
* Each source scored independently via TF-Jaccard. Final trust is a
|
|
16
|
+
* weighted fusion. When sources align (high cross-source agreement),
|
|
17
|
+
* trust is HIGH. When they diverge, trust drops but we report all
|
|
18
|
+
* sources so the user can see what each says.
|
|
19
|
+
*
|
|
20
|
+
* The wild bit: SHAPE-SHIFTING. The "winning answer" is constructed
|
|
21
|
+
* by taking the BEST sentence from EACH source and stitching them
|
|
22
|
+
* into a multi-witness reply.
|
|
23
|
+
*/
|
|
24
|
+
export type SourceKind = "commit" | "readme" | "changelog" | "docstring" | "package-json";
|
|
25
|
+
export interface SourceHit {
|
|
26
|
+
source: SourceKind;
|
|
27
|
+
citation: string;
|
|
28
|
+
excerpt: string;
|
|
29
|
+
score: number;
|
|
30
|
+
}
|
|
31
|
+
export interface FusedAnswer {
|
|
32
|
+
question: string;
|
|
33
|
+
hits: SourceHit[];
|
|
34
|
+
/** Sources that contributed at least one hit. */
|
|
35
|
+
sourcesPresent: SourceKind[];
|
|
36
|
+
/** Fused trust 0..1. */
|
|
37
|
+
trust: number;
|
|
38
|
+
trustLabel: "HIGH" | "MEDIUM" | "LOW";
|
|
39
|
+
/** The stitched multi-witness answer (best snippet per source). */
|
|
40
|
+
fusedAnswer: string;
|
|
41
|
+
/** Per-source max score (for transparency). */
|
|
42
|
+
perSourceMax: Record<SourceKind, number>;
|
|
43
|
+
ms: number;
|
|
44
|
+
}
|
|
45
|
+
export declare function crossSourceAsk(repoRoot: string, question: string, opts?: {
|
|
46
|
+
maxCommits?: number;
|
|
47
|
+
maxFiles?: number;
|
|
48
|
+
}): FusedAnswer;
|
|
49
|
+
//# sourceMappingURL=cross_source_qa.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cross_source_qa.d.ts","sourceRoot":"","sources":["../../src/hyperscan/cross_source_qa.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAMH,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,QAAQ,GAAG,WAAW,GAAG,WAAW,GAAG,cAAc,CAAC;AAE1F,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,UAAU,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,SAAS,EAAE,CAAC;IAClB,iDAAiD;IACjD,cAAc,EAAE,UAAU,EAAE,CAAC;IAC7B,wBAAwB;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;IACtC,mEAAmE;IACnE,WAAW,EAAE,MAAM,CAAC;IACpB,+CAA+C;IAC/C,YAAY,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IACzC,EAAE,EAAE,MAAM,CAAC;CACZ;AA8ED,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,WAAW,CA+FjI"}
|