@mneme-ai/core 1.68.0 → 1.70.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/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 +23 -0
- package/dist/index.js.map +1 -1
- package/dist/precog/bayesian_priors.d.ts +49 -0
- package/dist/precog/bayesian_priors.d.ts.map +1 -0
- package/dist/precog/bayesian_priors.js +135 -0
- package/dist/precog/bayesian_priors.js.map +1 -0
- package/dist/precog/firewall.d.ts +72 -0
- package/dist/precog/firewall.d.ts.map +1 -0
- package/dist/precog/firewall.js +141 -0
- package/dist/precog/firewall.js.map +1 -0
- package/dist/precog/index.d.ts +54 -0
- package/dist/precog/index.d.ts.map +1 -0
- package/dist/precog/index.js +94 -0
- package/dist/precog/index.js.map +1 -0
- package/dist/precog/package_verifier.d.ts +45 -0
- package/dist/precog/package_verifier.d.ts.map +1 -0
- package/dist/precog/package_verifier.js +139 -0
- package/dist/precog/package_verifier.js.map +1 -0
- package/dist/precog/precog.test.d.ts +5 -0
- package/dist/precog/precog.test.d.ts.map +1 -0
- package/dist/precog/precog.test.js +224 -0
- package/dist/precog/precog.test.js.map +1 -0
- package/dist/precog/sha_version_verifier.d.ts +34 -0
- package/dist/precog/sha_version_verifier.d.ts.map +1 -0
- package/dist/precog/sha_version_verifier.js +131 -0
- package/dist/precog/sha_version_verifier.js.map +1 -0
- package/dist/precog/temporal_verifier.d.ts +45 -0
- package/dist/precog/temporal_verifier.d.ts.map +1 -0
- package/dist/precog/temporal_verifier.js +139 -0
- package/dist/precog/temporal_verifier.js.map +1 -0
- package/dist/precog/trust_certificate.d.ts +44 -0
- package/dist/precog/trust_certificate.d.ts.map +1 -0
- package/dist/precog/trust_certificate.js +103 -0
- package/dist/precog/trust_certificate.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v1.70.0 -- PRECOG P1: PACKAGE VERIFIER.
|
|
3
|
+
*
|
|
4
|
+
* Catch the most common AI fabrication: "we use X package" where X
|
|
5
|
+
* is hallucinated. Extracts package references from prose:
|
|
6
|
+
*
|
|
7
|
+
* 1. `pkg@version` form
|
|
8
|
+
* 2. `import ... from "pkg"` style
|
|
9
|
+
* 3. `npm install pkg` style
|
|
10
|
+
* 4. quoted package names in prose ("uses 'lodash'")
|
|
11
|
+
*
|
|
12
|
+
* Cross-checks against:
|
|
13
|
+
* - package.json {dependencies, devDependencies, peerDependencies}
|
|
14
|
+
* - workspace patterns from package.json#workspaces
|
|
15
|
+
* - HEURISTIC npm-name validity (npm registry naming rules)
|
|
16
|
+
*
|
|
17
|
+
* Returns suspect packages + the specific rule that flagged them.
|
|
18
|
+
*/
|
|
19
|
+
export interface PackageRef {
|
|
20
|
+
/** Package name as it appears. */
|
|
21
|
+
name: string;
|
|
22
|
+
/** Optional version captured. */
|
|
23
|
+
version?: string;
|
|
24
|
+
/** How we found it. */
|
|
25
|
+
source: "pkg-at-version" | "import-from" | "npm-install" | "prose-shape";
|
|
26
|
+
offset: number;
|
|
27
|
+
}
|
|
28
|
+
export interface PackageSuspect {
|
|
29
|
+
ref: PackageRef;
|
|
30
|
+
reason: string;
|
|
31
|
+
/** 0..1; higher = stronger suspicion. */
|
|
32
|
+
confidence: number;
|
|
33
|
+
}
|
|
34
|
+
export interface PackageVerifyReport {
|
|
35
|
+
refs: PackageRef[];
|
|
36
|
+
/** Packages whose existence we couldn't confirm. */
|
|
37
|
+
suspects: PackageSuspect[];
|
|
38
|
+
/** Packages confirmed in package.json. */
|
|
39
|
+
confirmed: string[];
|
|
40
|
+
/** Plain-English. */
|
|
41
|
+
headline: string;
|
|
42
|
+
}
|
|
43
|
+
export declare function extractPackageRefs(text: string): PackageRef[];
|
|
44
|
+
export declare function verifyPackages(repoRoot: string, text: string): PackageVerifyReport;
|
|
45
|
+
//# sourceMappingURL=package_verifier.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"package_verifier.d.ts","sourceRoot":"","sources":["../../src/precog/package_verifier.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAcH,MAAM,WAAW,UAAU;IACzB,kCAAkC;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,iCAAiC;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,uBAAuB;IACvB,MAAM,EAAE,gBAAgB,GAAG,aAAa,GAAG,aAAa,GAAG,aAAa,CAAC;IACzE,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,UAAU,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,yCAAyC;IACzC,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,UAAU,EAAE,CAAC;IACnB,oDAAoD;IACpD,QAAQ,EAAE,cAAc,EAAE,CAAC;IAC3B,0CAA0C;IAC1C,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,qBAAqB;IACrB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAyBD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,EAAE,CAkC7D;AAeD,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,mBAAmB,CAkClF"}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v1.70.0 -- PRECOG P1: PACKAGE VERIFIER.
|
|
3
|
+
*
|
|
4
|
+
* Catch the most common AI fabrication: "we use X package" where X
|
|
5
|
+
* is hallucinated. Extracts package references from prose:
|
|
6
|
+
*
|
|
7
|
+
* 1. `pkg@version` form
|
|
8
|
+
* 2. `import ... from "pkg"` style
|
|
9
|
+
* 3. `npm install pkg` style
|
|
10
|
+
* 4. quoted package names in prose ("uses 'lodash'")
|
|
11
|
+
*
|
|
12
|
+
* Cross-checks against:
|
|
13
|
+
* - package.json {dependencies, devDependencies, peerDependencies}
|
|
14
|
+
* - workspace patterns from package.json#workspaces
|
|
15
|
+
* - HEURISTIC npm-name validity (npm registry naming rules)
|
|
16
|
+
*
|
|
17
|
+
* Returns suspect packages + the specific rule that flagged them.
|
|
18
|
+
*/
|
|
19
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
20
|
+
import { join } from "node:path";
|
|
21
|
+
const PKG_AT_VERSION = /\b([@a-z0-9][\w@./-]+)@(\d+\.\d+\.\d+(?:-[\w.-]+)?)\b/gi;
|
|
22
|
+
const IMPORT_FROM = /(?:from|require)\s*\(?\s*["']([^"']+)["']/g;
|
|
23
|
+
const NPM_INSTALL = /\bnpm\s+(?:install|i|add)\s+([\w@./-]+)/g;
|
|
24
|
+
// v1.70 -- bare prose package-shape (3+ hyphenated segments).
|
|
25
|
+
// Catches "wraith-utils-2099", "phantom-fake-9999" without @version
|
|
26
|
+
// or import syntax. Anchored to lowercase + hyphens to reduce FP on
|
|
27
|
+
// natural-language hyphenated phrases.
|
|
28
|
+
const PROSE_PKG_SHAPE = /\b([a-z][a-z0-9]*(?:-[a-z0-9]+){2,})\b/g;
|
|
29
|
+
const NPM_NAME_VALID = /^(@[a-z0-9-_.]+\/)?[a-z0-9-_.]+$/i;
|
|
30
|
+
function loadKnownDeps(repoRoot) {
|
|
31
|
+
const deps = new Set();
|
|
32
|
+
const p = join(repoRoot, "package.json");
|
|
33
|
+
if (!existsSync(p))
|
|
34
|
+
return deps;
|
|
35
|
+
try {
|
|
36
|
+
const pkg = JSON.parse(readFileSync(p, "utf8"));
|
|
37
|
+
for (const key of ["dependencies", "devDependencies", "peerDependencies", "optionalDependencies"]) {
|
|
38
|
+
const obj = pkg[key];
|
|
39
|
+
if (obj)
|
|
40
|
+
for (const name of Object.keys(obj))
|
|
41
|
+
deps.add(name);
|
|
42
|
+
}
|
|
43
|
+
// Also bring in workspace package names so internal references resolve.
|
|
44
|
+
const wsRaw = pkg["workspaces"];
|
|
45
|
+
if (Array.isArray(wsRaw)) {
|
|
46
|
+
for (const ws of wsRaw) {
|
|
47
|
+
if (typeof ws === "string" && !ws.includes("*"))
|
|
48
|
+
deps.add(ws);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
catch { /* */ }
|
|
53
|
+
return deps;
|
|
54
|
+
}
|
|
55
|
+
export function extractPackageRefs(text) {
|
|
56
|
+
const out = [];
|
|
57
|
+
const seen = new Set();
|
|
58
|
+
const push = (ref) => {
|
|
59
|
+
const key = `${ref.source}|${ref.name}|${ref.version ?? ""}`;
|
|
60
|
+
if (seen.has(key))
|
|
61
|
+
return;
|
|
62
|
+
seen.add(key);
|
|
63
|
+
out.push(ref);
|
|
64
|
+
};
|
|
65
|
+
for (const m of text.matchAll(PKG_AT_VERSION)) {
|
|
66
|
+
push({ name: m[1], version: m[2], source: "pkg-at-version", offset: m.index ?? 0 });
|
|
67
|
+
}
|
|
68
|
+
for (const m of text.matchAll(IMPORT_FROM)) {
|
|
69
|
+
const raw = m[1];
|
|
70
|
+
// Take top-level segment (e.g. @scope/pkg or pkg from pkg/sub/path).
|
|
71
|
+
const top = raw.startsWith("@") ? raw.split("/").slice(0, 2).join("/") : raw.split("/")[0];
|
|
72
|
+
if (top && !top.startsWith(".") && !top.startsWith("/")) {
|
|
73
|
+
push({ name: top, source: "import-from", offset: m.index ?? 0 });
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
for (const m of text.matchAll(NPM_INSTALL)) {
|
|
77
|
+
push({ name: m[1], source: "npm-install", offset: m.index ?? 0 });
|
|
78
|
+
}
|
|
79
|
+
// Prose-shape: only catch when other extractors didn't already match.
|
|
80
|
+
// Most code-y phrases like "node-modules", "package-lock" are skipped by
|
|
81
|
+
// the 3-segment requirement; but we whitelist a few obvious non-packages.
|
|
82
|
+
const FALSE_POSITIVE_PROSE = new Set(["package-lock-json", "tsconfig-build-json", "single-page-app"]);
|
|
83
|
+
for (const m of text.matchAll(PROSE_PKG_SHAPE)) {
|
|
84
|
+
const name = m[1];
|
|
85
|
+
if (FALSE_POSITIVE_PROSE.has(name))
|
|
86
|
+
continue;
|
|
87
|
+
const offset = m.index ?? 0;
|
|
88
|
+
push({ name, source: "prose-shape", offset });
|
|
89
|
+
}
|
|
90
|
+
return out;
|
|
91
|
+
}
|
|
92
|
+
const BUILTIN_NODE_MODULES = new Set([
|
|
93
|
+
"node:fs", "node:path", "node:os", "node:crypto", "node:child_process",
|
|
94
|
+
"node:http", "node:https", "node:url", "node:util", "node:events", "node:stream",
|
|
95
|
+
"node:buffer", "node:zlib", "node:assert", "node:test", "node:net", "node:tls",
|
|
96
|
+
"node:dns", "node:querystring", "node:readline", "node:worker_threads",
|
|
97
|
+
"node:perf_hooks", "node:vm", "node:timers", "node:console",
|
|
98
|
+
// legacy non-prefixed forms
|
|
99
|
+
"fs", "path", "os", "crypto", "child_process", "http", "https", "url", "util",
|
|
100
|
+
"events", "stream", "buffer", "zlib", "assert", "net", "tls", "dns",
|
|
101
|
+
"querystring", "readline", "worker_threads", "perf_hooks", "vm", "timers",
|
|
102
|
+
"console",
|
|
103
|
+
]);
|
|
104
|
+
export function verifyPackages(repoRoot, text) {
|
|
105
|
+
const refs = extractPackageRefs(text);
|
|
106
|
+
const known = loadKnownDeps(repoRoot);
|
|
107
|
+
const suspects = [];
|
|
108
|
+
const confirmed = [];
|
|
109
|
+
for (const ref of refs) {
|
|
110
|
+
// Suspicious future version BEATS name-confirmation -- if someone
|
|
111
|
+
// claims typescript@99.5.0, the package exists but the version is fab.
|
|
112
|
+
if (ref.version && /^([89]\d|\d{3,})\./.test(ref.version)) {
|
|
113
|
+
suspects.push({ ref, reason: `Suspicious future version ${ref.version} on package "${ref.name}"`, confidence: 0.75 });
|
|
114
|
+
continue;
|
|
115
|
+
}
|
|
116
|
+
if (BUILTIN_NODE_MODULES.has(ref.name.toLowerCase())) {
|
|
117
|
+
confirmed.push(ref.name);
|
|
118
|
+
continue;
|
|
119
|
+
}
|
|
120
|
+
if (known.has(ref.name)) {
|
|
121
|
+
confirmed.push(ref.name);
|
|
122
|
+
continue;
|
|
123
|
+
}
|
|
124
|
+
// Validity heuristics.
|
|
125
|
+
if (!NPM_NAME_VALID.test(ref.name)) {
|
|
126
|
+
suspects.push({ ref, reason: `Invalid npm package name shape: "${ref.name}"`, confidence: 0.85 });
|
|
127
|
+
continue;
|
|
128
|
+
}
|
|
129
|
+
// Not in deps + not built-in -> NOT necessarily a lie, but flag at low confidence.
|
|
130
|
+
suspects.push({
|
|
131
|
+
ref,
|
|
132
|
+
reason: `Package "${ref.name}" not in package.json dependencies (could be a hallucinated reference).`,
|
|
133
|
+
confidence: ref.source === "pkg-at-version" ? 0.7 : 0.55,
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
const headline = `${refs.length} package ref(s); ${confirmed.length} confirmed, ${suspects.length} suspect.`;
|
|
137
|
+
return { refs, suspects, confirmed, headline };
|
|
138
|
+
}
|
|
139
|
+
//# sourceMappingURL=package_verifier.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"package_verifier.js","sourceRoot":"","sources":["../../src/precog/package_verifier.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"precog.test.d.ts","sourceRoot":"","sources":["../../src/precog/precog.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v1.70.0 -- PRECOG PROTOCOL test suite.
|
|
3
|
+
*/
|
|
4
|
+
import { describe, it, expect, beforeEach, afterEach } from "vitest";
|
|
5
|
+
import { mkdtempSync, rmSync, writeFileSync } from "node:fs";
|
|
6
|
+
import { tmpdir } from "node:os";
|
|
7
|
+
import { join } from "node:path";
|
|
8
|
+
import { execSync } from "node:child_process";
|
|
9
|
+
import { verifyPackages, extractPackageRefs } from "./package_verifier.js";
|
|
10
|
+
import { verifyFacts, extractFactRefs } from "./sha_version_verifier.js";
|
|
11
|
+
import { verifyTemporal, extractTemporalRefs } from "./temporal_verifier.js";
|
|
12
|
+
import { intercept } from "./firewall.js";
|
|
13
|
+
import { issueCertificate, verifyCertificate } from "./trust_certificate.js";
|
|
14
|
+
import { priorFor, recordFailure } from "./bayesian_priors.js";
|
|
15
|
+
import { runPrecogBench } from "./index.js";
|
|
16
|
+
function setup() { return mkdtempSync(join(tmpdir(), "mneme-pc-")); }
|
|
17
|
+
function cleanup(r) { try {
|
|
18
|
+
rmSync(r, { recursive: true, force: true });
|
|
19
|
+
}
|
|
20
|
+
catch { /* */ } }
|
|
21
|
+
function initGitWithTags(r, commits, tags) {
|
|
22
|
+
execSync(`git init --quiet -b main`, { cwd: r, stdio: "ignore" });
|
|
23
|
+
execSync(`git config user.email "alice@example.com"`, { cwd: r, stdio: "ignore" });
|
|
24
|
+
execSync(`git config user.name "Alice"`, { cwd: r, stdio: "ignore" });
|
|
25
|
+
execSync(`git config commit.gpgsign false`, { cwd: r, stdio: "ignore" });
|
|
26
|
+
for (let i = 0; i < commits.length; i++) {
|
|
27
|
+
writeFileSync(join(r, `f${i}.txt`), `${i}`, "utf8");
|
|
28
|
+
execSync(`git add -A`, { cwd: r, stdio: "ignore" });
|
|
29
|
+
execSync(`git commit -m "${commits[i]}" --no-gpg-sign --quiet`, { cwd: r, stdio: "ignore" });
|
|
30
|
+
}
|
|
31
|
+
for (const t of tags)
|
|
32
|
+
execSync(`git tag ${t}`, { cwd: r, stdio: "ignore" });
|
|
33
|
+
}
|
|
34
|
+
// ─── P1 PACKAGE VERIFIER ─────────────────────────────────────────────
|
|
35
|
+
describe("v1.70 Precog P1 · Package Verifier", () => {
|
|
36
|
+
let r;
|
|
37
|
+
beforeEach(() => {
|
|
38
|
+
r = setup();
|
|
39
|
+
writeFileSync(join(r, "package.json"), JSON.stringify({
|
|
40
|
+
name: "test", dependencies: { typescript: "5.0.0", react: "18.0.0" },
|
|
41
|
+
}), "utf8");
|
|
42
|
+
});
|
|
43
|
+
afterEach(() => cleanup(r));
|
|
44
|
+
it("extracts pkg@version + import-from + npm-install refs", () => {
|
|
45
|
+
const refs = extractPackageRefs("import x from 'lodash'; npm install foo-bar; legendary@9.99.0 also");
|
|
46
|
+
expect(refs.length).toBeGreaterThanOrEqual(3);
|
|
47
|
+
});
|
|
48
|
+
it("flags package not in deps", () => {
|
|
49
|
+
const r1 = verifyPackages(r, "we use wraith-utils-2099 for caching");
|
|
50
|
+
expect(r1.suspects.find((s) => s.ref.name.includes("wraith"))).toBeDefined();
|
|
51
|
+
});
|
|
52
|
+
it("confirms real deps", () => {
|
|
53
|
+
const r1 = verifyPackages(r, "import { thing } from 'typescript'; import x from 'react'");
|
|
54
|
+
expect(r1.confirmed).toContain("typescript");
|
|
55
|
+
expect(r1.confirmed).toContain("react");
|
|
56
|
+
expect(r1.suspects.length).toBe(0);
|
|
57
|
+
});
|
|
58
|
+
it("treats node:* built-ins as confirmed", () => {
|
|
59
|
+
const r1 = verifyPackages(r, "import { readFileSync } from 'node:fs'");
|
|
60
|
+
expect(r1.confirmed).toContain("node:fs");
|
|
61
|
+
});
|
|
62
|
+
it("flags suspicious future versions", () => {
|
|
63
|
+
const r1 = verifyPackages(r, "we use typescript@99.5.0 in production");
|
|
64
|
+
expect(r1.suspects.find((s) => s.ref.version === "99.5.0")).toBeDefined();
|
|
65
|
+
});
|
|
66
|
+
});
|
|
67
|
+
// ─── P2 SHA / VERSION / EMAIL VERIFIER ───────────────────────────────
|
|
68
|
+
describe("v1.70 Precog P2 · SHA/Version/Email Verifier", () => {
|
|
69
|
+
let r;
|
|
70
|
+
beforeEach(() => { r = setup(); initGitWithTags(r, ["first", "second"], ["v1.0.0"]); });
|
|
71
|
+
afterEach(() => cleanup(r));
|
|
72
|
+
it("extracts SHA + version + email refs", () => {
|
|
73
|
+
const refs = extractFactRefs("commit deadbeefcafe shipped in v1.0.0 by alice@example.com");
|
|
74
|
+
const kinds = refs.map((r) => r.kind);
|
|
75
|
+
expect(kinds).toContain("sha");
|
|
76
|
+
expect(kinds).toContain("version");
|
|
77
|
+
expect(kinds).toContain("email");
|
|
78
|
+
});
|
|
79
|
+
it("flags fake SHA", () => {
|
|
80
|
+
const r1 = verifyFacts(r, "the bug was in commit deadbeefcafefade1234567890abcdef1234567");
|
|
81
|
+
expect(r1.suspects.find((s) => s.ref.kind === "sha")).toBeDefined();
|
|
82
|
+
});
|
|
83
|
+
it("confirms real tag", () => {
|
|
84
|
+
const r1 = verifyFacts(r, "shipped in v1.0.0 last week");
|
|
85
|
+
expect(r1.confirmed.some((c) => c.kind === "version" && c.value.endsWith("1.0.0"))).toBe(true);
|
|
86
|
+
});
|
|
87
|
+
it("flags fake version", () => {
|
|
88
|
+
const r1 = verifyFacts(r, "shipped in v9.99.0 the legendary feature");
|
|
89
|
+
expect(r1.suspects.find((s) => s.ref.kind === "version" && s.ref.value.endsWith("9.99.0"))).toBeDefined();
|
|
90
|
+
});
|
|
91
|
+
it("confirms real author email", () => {
|
|
92
|
+
const r1 = verifyFacts(r, "Alice <alice@example.com> wrote this");
|
|
93
|
+
expect(r1.confirmed.some((c) => c.kind === "email" && c.value === "alice@example.com")).toBe(true);
|
|
94
|
+
});
|
|
95
|
+
});
|
|
96
|
+
// ─── P3 TEMPORAL VERIFIER ────────────────────────────────────────────
|
|
97
|
+
describe("v1.70 Precog P3 · Temporal Verifier", () => {
|
|
98
|
+
let r;
|
|
99
|
+
beforeEach(() => { r = setup(); initGitWithTags(r, ["init"], []); });
|
|
100
|
+
afterEach(() => cleanup(r));
|
|
101
|
+
it("extracts temporal phrases", () => {
|
|
102
|
+
const refs = extractTemporalRefs("we did this yesterday and last week shipped X");
|
|
103
|
+
expect(refs.length).toBeGreaterThanOrEqual(2);
|
|
104
|
+
});
|
|
105
|
+
it("flags claim about file deletion when none in window", () => {
|
|
106
|
+
const r1 = verifyTemporal(r, "we deleted packages/imaginary-9999.ts last week");
|
|
107
|
+
expect(r1.suspects.length).toBeGreaterThanOrEqual(1);
|
|
108
|
+
});
|
|
109
|
+
it("INSUFFICIENT EVIDENCE on empty window", () => {
|
|
110
|
+
const r1 = verifyTemporal(r, "we did some work 365 days ago in the deep past");
|
|
111
|
+
// 365 days ago -- new repo has no commits there.
|
|
112
|
+
expect(r1.suspects.length).toBeGreaterThanOrEqual(1);
|
|
113
|
+
});
|
|
114
|
+
});
|
|
115
|
+
// ─── P5 TRUST CERTIFICATE ────────────────────────────────────────────
|
|
116
|
+
describe("v1.70 Precog P5 · Trust Certificate", () => {
|
|
117
|
+
let r;
|
|
118
|
+
beforeEach(() => { r = setup(); });
|
|
119
|
+
afterEach(() => cleanup(r));
|
|
120
|
+
it("issues CERTIFIED when all verifiers pass", () => {
|
|
121
|
+
const cert = issueCertificate(r, "claim", [
|
|
122
|
+
{ name: "P1", passed: true },
|
|
123
|
+
{ name: "P2", passed: true },
|
|
124
|
+
]);
|
|
125
|
+
expect(cert.verdict).toBe("CERTIFIED");
|
|
126
|
+
expect(cert.signers.length).toBe(2);
|
|
127
|
+
expect(verifyCertificate(r, cert)).toBe("VALID");
|
|
128
|
+
});
|
|
129
|
+
it("issues REVOKED when majority flagged", () => {
|
|
130
|
+
const cert = issueCertificate(r, "claim", [
|
|
131
|
+
{ name: "P1", passed: false },
|
|
132
|
+
{ name: "P2", passed: false },
|
|
133
|
+
{ name: "P3", passed: true },
|
|
134
|
+
]);
|
|
135
|
+
expect(cert.verdict).toBe("REVOKED");
|
|
136
|
+
expect(verifyCertificate(r, cert)).toBe("NOT_CERTIFIED");
|
|
137
|
+
});
|
|
138
|
+
it("detects invalid HMAC", () => {
|
|
139
|
+
const cert = issueCertificate(r, "claim", [{ name: "P1", passed: true }]);
|
|
140
|
+
const tampered = { ...cert, hmac: "x".repeat(64) };
|
|
141
|
+
expect(verifyCertificate(r, tampered)).toBe("INVALID_HMAC");
|
|
142
|
+
});
|
|
143
|
+
it("expires", () => {
|
|
144
|
+
const cert = issueCertificate(r, "claim", [{ name: "P1", passed: true }], { ttlMs: 1 });
|
|
145
|
+
return new Promise((resolve) => setTimeout(() => {
|
|
146
|
+
expect(verifyCertificate(r, cert)).toBe("EXPIRED");
|
|
147
|
+
resolve();
|
|
148
|
+
}, 10));
|
|
149
|
+
});
|
|
150
|
+
});
|
|
151
|
+
// ─── P6 BAYESIAN PRIORS ──────────────────────────────────────────────
|
|
152
|
+
describe("v1.70 Precog P6 · Bayesian Priors", () => {
|
|
153
|
+
let r;
|
|
154
|
+
beforeEach(() => { r = setup(); });
|
|
155
|
+
afterEach(() => cleanup(r));
|
|
156
|
+
it("base prior on empty history", () => {
|
|
157
|
+
const p = priorFor(r, "some claim");
|
|
158
|
+
expect(p.posterior).toBeCloseTo(0.05, 2);
|
|
159
|
+
});
|
|
160
|
+
it("posterior rises after similar failure", () => {
|
|
161
|
+
recordFailure(r, "wraith-utils-2099 is a fake package", "npm-package");
|
|
162
|
+
recordFailure(r, "wraith-utils-2099 is a fake package", "npm-package");
|
|
163
|
+
const p = priorFor(r, "wraith-utils-2099 is a fake package");
|
|
164
|
+
expect(p.posterior).toBeGreaterThan(0.05);
|
|
165
|
+
expect(p.topNeighbors.length).toBeGreaterThanOrEqual(1);
|
|
166
|
+
});
|
|
167
|
+
});
|
|
168
|
+
// ─── P4 FIREWALL ────────────────────────────────────────────────────
|
|
169
|
+
describe("v1.70 Precog P4 · Firewall", () => {
|
|
170
|
+
let r;
|
|
171
|
+
beforeEach(() => {
|
|
172
|
+
r = setup();
|
|
173
|
+
writeFileSync(join(r, "package.json"), JSON.stringify({ name: "test", dependencies: { typescript: "5.0.0" } }), "utf8");
|
|
174
|
+
initGitWithTags(r, ["init"], []);
|
|
175
|
+
});
|
|
176
|
+
afterEach(() => cleanup(r));
|
|
177
|
+
it("HEDGES claim with fake package", () => {
|
|
178
|
+
const r1 = intercept(r, "we use wraith-utils-2099 for caching", { recordOnReject: false });
|
|
179
|
+
expect(r1.verdict).toBe("HEDGED");
|
|
180
|
+
expect(r1.hedges.length).toBeGreaterThanOrEqual(1);
|
|
181
|
+
expect(r1.verified).toContain("[unverified package");
|
|
182
|
+
});
|
|
183
|
+
it("CERTIFIED clean claim with real dep", () => {
|
|
184
|
+
const r1 = intercept(r, "the project uses typescript for type safety", { recordOnReject: false });
|
|
185
|
+
expect(r1.verdict).toBe("CERTIFIED");
|
|
186
|
+
expect(r1.certificate).not.toBeNull();
|
|
187
|
+
});
|
|
188
|
+
it("REJECTS claim with many hedges", () => {
|
|
189
|
+
const claim = "wraith-utils-2099 and phantom-fake-9999 and ghost-cache-9998 and demon-99 were all used in v9.99.0 last quarter by alice@nowhere.invalid commit deadbeefcafefade1234567890ab";
|
|
190
|
+
const r1 = intercept(r, claim, { recordOnReject: false });
|
|
191
|
+
expect(["HEDGED", "REJECTED"]).toContain(r1.verdict);
|
|
192
|
+
expect(r1.hedges.length).toBeGreaterThanOrEqual(3);
|
|
193
|
+
});
|
|
194
|
+
it("hedges preserve unrelated text", () => {
|
|
195
|
+
const r1 = intercept(r, "the project uses typescript and wraith-utils-2099 for builds", { recordOnReject: false });
|
|
196
|
+
expect(r1.verified).toContain("typescript"); // Real dep preserved
|
|
197
|
+
expect(r1.verified).toContain("[unverified package"); // Fake hedged
|
|
198
|
+
});
|
|
199
|
+
it("verifierResults reflect each P-layer", () => {
|
|
200
|
+
const r1 = intercept(r, "we use typescript", { recordOnReject: false });
|
|
201
|
+
const names = r1.verifierResults.map((v) => v.name);
|
|
202
|
+
expect(names).toContain("P1-package");
|
|
203
|
+
expect(names).toContain("P2-fact");
|
|
204
|
+
expect(names).toContain("P3-temporal");
|
|
205
|
+
expect(names).toContain("P6-prior");
|
|
206
|
+
});
|
|
207
|
+
});
|
|
208
|
+
// ─── BENCH ───────────────────────────────────────────────────────────
|
|
209
|
+
describe("v1.70 Precog · BENCH", () => {
|
|
210
|
+
let r;
|
|
211
|
+
beforeEach(() => {
|
|
212
|
+
r = setup();
|
|
213
|
+
writeFileSync(join(r, "package.json"), JSON.stringify({ name: "test", dependencies: { typescript: "5.0.0", react: "18.0.0" } }), "utf8");
|
|
214
|
+
writeFileSync(join(r, "README.md"), "# Project\n\nUses TypeScript.\n", "utf8");
|
|
215
|
+
writeFileSync(join(r, "CHANGELOG.md"), "## [1.0.0]\n", "utf8");
|
|
216
|
+
initGitWithTags(r, ["init"], []);
|
|
217
|
+
});
|
|
218
|
+
afterEach(() => cleanup(r));
|
|
219
|
+
it("catch rate >= 80% on 9-lie corpus", () => {
|
|
220
|
+
const r1 = runPrecogBench(r);
|
|
221
|
+
expect(r1.catchRate).toBeGreaterThanOrEqual(0.8);
|
|
222
|
+
});
|
|
223
|
+
});
|
|
224
|
+
//# sourceMappingURL=precog.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"precog.test.js","sourceRoot":"","sources":["../../src/precog/precog.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v1.70.0 -- PRECOG P2: SHA / VERSION / EMAIL VERIFIER.
|
|
3
|
+
*
|
|
4
|
+
* Common AI fabrications:
|
|
5
|
+
* - "in commit abc1234" (commit doesn't exist)
|
|
6
|
+
* - "we shipped v9.99.0 last quarter" (no such tag)
|
|
7
|
+
* - "Alice <alice@example.com> wrote this" (no such git author)
|
|
8
|
+
*
|
|
9
|
+
* Each fact verifier shells out to git/CHANGELOG/git-log respectively:
|
|
10
|
+
* - SHA -> git rev-list / git cat-file -e
|
|
11
|
+
* - Version -> git tags + CHANGELOG.md
|
|
12
|
+
* - Email -> distinct authors from git log --format=%ae
|
|
13
|
+
*
|
|
14
|
+
* Pure read; no side effects.
|
|
15
|
+
*/
|
|
16
|
+
export interface FactRef {
|
|
17
|
+
kind: "sha" | "version" | "email";
|
|
18
|
+
value: string;
|
|
19
|
+
offset: number;
|
|
20
|
+
}
|
|
21
|
+
export interface FactSuspect {
|
|
22
|
+
ref: FactRef;
|
|
23
|
+
reason: string;
|
|
24
|
+
confidence: number;
|
|
25
|
+
}
|
|
26
|
+
export interface FactReport {
|
|
27
|
+
refs: FactRef[];
|
|
28
|
+
confirmed: FactRef[];
|
|
29
|
+
suspects: FactSuspect[];
|
|
30
|
+
headline: string;
|
|
31
|
+
}
|
|
32
|
+
export declare function extractFactRefs(text: string): FactRef[];
|
|
33
|
+
export declare function verifyFacts(repoRoot: string, text: string): FactReport;
|
|
34
|
+
//# sourceMappingURL=sha_version_verifier.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sha_version_verifier.d.ts","sourceRoot":"","sources":["../../src/precog/sha_version_verifier.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAUH,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,KAAK,GAAG,SAAS,GAAG,OAAO,CAAC;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,OAAO,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,OAAO,EAAE,CAAC;IAChB,SAAS,EAAE,OAAO,EAAE,CAAC;IACrB,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;CAClB;AA0CD,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,EAAE,CAwBvD;AAED,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,UAAU,CAwBtE"}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v1.70.0 -- PRECOG P2: SHA / VERSION / EMAIL VERIFIER.
|
|
3
|
+
*
|
|
4
|
+
* Common AI fabrications:
|
|
5
|
+
* - "in commit abc1234" (commit doesn't exist)
|
|
6
|
+
* - "we shipped v9.99.0 last quarter" (no such tag)
|
|
7
|
+
* - "Alice <alice@example.com> wrote this" (no such git author)
|
|
8
|
+
*
|
|
9
|
+
* Each fact verifier shells out to git/CHANGELOG/git-log respectively:
|
|
10
|
+
* - SHA -> git rev-list / git cat-file -e
|
|
11
|
+
* - Version -> git tags + CHANGELOG.md
|
|
12
|
+
* - Email -> distinct authors from git log --format=%ae
|
|
13
|
+
*
|
|
14
|
+
* Pure read; no side effects.
|
|
15
|
+
*/
|
|
16
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
17
|
+
import { join } from "node:path";
|
|
18
|
+
import { execSync } from "node:child_process";
|
|
19
|
+
const SHA_RE = /\b([0-9a-f]{7,40})\b/gi;
|
|
20
|
+
const VERSION_RE = /\bv?(\d+\.\d+\.\d+(?:-[\w.-]+)?)\b/g;
|
|
21
|
+
const EMAIL_RE = /\b([\w.+-]+)@([\w-]+(?:\.[\w-]+)+)\b/g;
|
|
22
|
+
function gitCheckSha(repoRoot, sha) {
|
|
23
|
+
try {
|
|
24
|
+
execSync(`git -C "${repoRoot}" cat-file -e ${sha}`, { stdio: "ignore", timeout: 2000 });
|
|
25
|
+
return true;
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
return false;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
function gitListTags(repoRoot) {
|
|
32
|
+
try {
|
|
33
|
+
const r = execSync(`git -C "${repoRoot}" tag --list`, { encoding: "utf8", stdio: ["ignore", "pipe", "ignore"], timeout: 2000 });
|
|
34
|
+
return new Set(r.split("\n").map((t) => t.trim()).filter(Boolean));
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
return new Set();
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
function gitListAuthorEmails(repoRoot) {
|
|
41
|
+
try {
|
|
42
|
+
const r = execSync(`git -C "${repoRoot}" log --format=%ae --max-count=2000`, { encoding: "utf8", stdio: ["ignore", "pipe", "ignore"], timeout: 3000 });
|
|
43
|
+
const out = new Set();
|
|
44
|
+
for (const line of r.split("\n")) {
|
|
45
|
+
const v = line.trim().toLowerCase();
|
|
46
|
+
if (v)
|
|
47
|
+
out.add(v);
|
|
48
|
+
}
|
|
49
|
+
return out;
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
return new Set();
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
function changelogVersions(repoRoot) {
|
|
56
|
+
const p = join(repoRoot, "CHANGELOG.md");
|
|
57
|
+
if (!existsSync(p))
|
|
58
|
+
return new Set();
|
|
59
|
+
const out = new Set();
|
|
60
|
+
try {
|
|
61
|
+
const content = readFileSync(p, "utf8");
|
|
62
|
+
// Match `## [1.2.3]` / `# v1.2.3` lines.
|
|
63
|
+
for (const m of content.matchAll(/^\s*#+\s*\[?v?(\d+\.\d+\.\d+(?:-[\w.-]+)?)\]?/gm)) {
|
|
64
|
+
out.add(m[1]);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
catch { /* */ }
|
|
68
|
+
return out;
|
|
69
|
+
}
|
|
70
|
+
export function extractFactRefs(text) {
|
|
71
|
+
const out = [];
|
|
72
|
+
const seen = new Set();
|
|
73
|
+
const push = (ref) => {
|
|
74
|
+
const key = `${ref.kind}|${ref.value}`;
|
|
75
|
+
if (seen.has(key))
|
|
76
|
+
return;
|
|
77
|
+
seen.add(key);
|
|
78
|
+
out.push(ref);
|
|
79
|
+
};
|
|
80
|
+
for (const m of text.matchAll(SHA_RE)) {
|
|
81
|
+
const v = m[1];
|
|
82
|
+
if (v.length < 7)
|
|
83
|
+
continue;
|
|
84
|
+
if (!/[a-f]/.test(v))
|
|
85
|
+
continue; // pure-digit -> probably a number, not SHA
|
|
86
|
+
push({ kind: "sha", value: v.toLowerCase(), offset: m.index ?? 0 });
|
|
87
|
+
}
|
|
88
|
+
for (const m of text.matchAll(VERSION_RE)) {
|
|
89
|
+
// Use the FULL match (incl. optional "v") as the surface so hedging
|
|
90
|
+
// spans correctly; the verifier strips "v" for lookup.
|
|
91
|
+
push({ kind: "version", value: m[0], offset: m.index ?? 0 });
|
|
92
|
+
}
|
|
93
|
+
for (const m of text.matchAll(EMAIL_RE)) {
|
|
94
|
+
push({ kind: "email", value: m[0].toLowerCase(), offset: m.index ?? 0 });
|
|
95
|
+
}
|
|
96
|
+
return out;
|
|
97
|
+
}
|
|
98
|
+
export function verifyFacts(repoRoot, text) {
|
|
99
|
+
const refs = extractFactRefs(text);
|
|
100
|
+
const tags = gitListTags(repoRoot);
|
|
101
|
+
const changelog = changelogVersions(repoRoot);
|
|
102
|
+
const authors = gitListAuthorEmails(repoRoot);
|
|
103
|
+
const confirmed = [];
|
|
104
|
+
const suspects = [];
|
|
105
|
+
for (const ref of refs) {
|
|
106
|
+
if (ref.kind === "sha") {
|
|
107
|
+
if (gitCheckSha(repoRoot, ref.value))
|
|
108
|
+
confirmed.push(ref);
|
|
109
|
+
else
|
|
110
|
+
suspects.push({ ref, reason: `SHA ${ref.value} not found in git object database.`, confidence: 0.95 });
|
|
111
|
+
}
|
|
112
|
+
else if (ref.kind === "version") {
|
|
113
|
+
const numeric = ref.value.replace(/^v/i, "");
|
|
114
|
+
const inTags = tags.has(numeric) || tags.has(`v${numeric}`);
|
|
115
|
+
const inChangelog = changelog.has(numeric);
|
|
116
|
+
if (inTags || inChangelog)
|
|
117
|
+
confirmed.push(ref);
|
|
118
|
+
else
|
|
119
|
+
suspects.push({ ref, reason: `Version ${ref.value} not in git tags or CHANGELOG.md.`, confidence: 0.85 });
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
if (authors.has(ref.value))
|
|
123
|
+
confirmed.push(ref);
|
|
124
|
+
else
|
|
125
|
+
suspects.push({ ref, reason: `Author email ${ref.value} not in git log authors.`, confidence: 0.8 });
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
const headline = `${refs.length} fact ref(s); ${confirmed.length} confirmed, ${suspects.length} suspect.`;
|
|
129
|
+
return { refs, confirmed, suspects, headline };
|
|
130
|
+
}
|
|
131
|
+
//# sourceMappingURL=sha_version_verifier.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sha_version_verifier.js","sourceRoot":"","sources":["../../src/precog/sha_version_verifier.ts"],"names":[],"mappings":"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"}
|