@mneme-ai/core 2.46.0 → 2.48.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 (50) hide show
  1. package/dist/index.d.ts +1 -0
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +4 -0
  4. package/dist/index.js.map +1 -1
  5. package/dist/nemesis/calibration_corpus.d.ts +40 -0
  6. package/dist/nemesis/calibration_corpus.d.ts.map +1 -0
  7. package/dist/nemesis/calibration_corpus.js +148 -0
  8. package/dist/nemesis/calibration_corpus.js.map +1 -0
  9. package/dist/nemesis/classifier_calibrated.d.ts +48 -0
  10. package/dist/nemesis/classifier_calibrated.d.ts.map +1 -0
  11. package/dist/nemesis/classifier_calibrated.js +185 -0
  12. package/dist/nemesis/classifier_calibrated.js.map +1 -0
  13. package/dist/nemesis/eu_ai_act_stamp.d.ts +1 -0
  14. package/dist/nemesis/eu_ai_act_stamp.d.ts.map +1 -1
  15. package/dist/nemesis/eu_ai_act_stamp.js +25 -4
  16. package/dist/nemesis/eu_ai_act_stamp.js.map +1 -1
  17. package/dist/nemesis/features.d.ts.map +1 -1
  18. package/dist/nemesis/features.js +54 -10
  19. package/dist/nemesis/features.js.map +1 -1
  20. package/dist/nemesis/index.d.ts +6 -0
  21. package/dist/nemesis/index.d.ts.map +1 -1
  22. package/dist/nemesis/index.js +9 -0
  23. package/dist/nemesis/index.js.map +1 -1
  24. package/dist/nemesis/key_management.d.ts +30 -0
  25. package/dist/nemesis/key_management.d.ts.map +1 -0
  26. package/dist/nemesis/key_management.js +91 -0
  27. package/dist/nemesis/key_management.js.map +1 -0
  28. package/dist/nemesis/learning_loop.d.ts +45 -0
  29. package/dist/nemesis/learning_loop.d.ts.map +1 -0
  30. package/dist/nemesis/learning_loop.js +116 -0
  31. package/dist/nemesis/learning_loop.js.map +1 -0
  32. package/dist/nemesis/nemesis_to_conclave.d.ts +42 -0
  33. package/dist/nemesis/nemesis_to_conclave.d.ts.map +1 -0
  34. package/dist/nemesis/nemesis_to_conclave.js +74 -0
  35. package/dist/nemesis/nemesis_to_conclave.js.map +1 -0
  36. package/dist/nemesis/vendor_reconcile.d.ts +38 -0
  37. package/dist/nemesis/vendor_reconcile.d.ts.map +1 -0
  38. package/dist/nemesis/vendor_reconcile.js +50 -0
  39. package/dist/nemesis/vendor_reconcile.js.map +1 -0
  40. package/dist/release_gate/probe_coverage.d.ts +56 -0
  41. package/dist/release_gate/probe_coverage.d.ts.map +1 -0
  42. package/dist/release_gate/probe_coverage.js +116 -0
  43. package/dist/release_gate/probe_coverage.js.map +1 -0
  44. package/dist/truth_gate/claims.d.ts.map +1 -1
  45. package/dist/truth_gate/claims.js +15 -0
  46. package/dist/truth_gate/claims.js.map +1 -1
  47. package/dist/truth_gate/probes.d.ts.map +1 -1
  48. package/dist/truth_gate/probes.js +62 -1
  49. package/dist/truth_gate/probes.js.map +1 -1
  50. package/package.json +1 -1
@@ -0,0 +1,185 @@
1
+ /**
2
+ * v2.47.0 — CALIBRATED CLASSIFIER (production-grade).
3
+ *
4
+ * Replaces v2.46.0's fixed-weight heuristic with a per-vendor
5
+ * Mahalanobis-style log-likelihood score derived from the seed
6
+ * calibration corpus + the (opt-in) self-calibrating learning ledger.
7
+ *
8
+ * Algorithm:
9
+ * For each vendor V with stats {feature_i: (mean_i, stdev_i)}:
10
+ * logL(fp | V) = − Σ_i ((fp[i] − mean_i) / max(stdev_i, ε))²
11
+ *
12
+ * Top vendor = argmax logL. Confidence = softmax(logL) of the top.
13
+ *
14
+ * Only DISCRIMINATIVE features are used (the ones with high inter-vendor
15
+ * variance) — others would just add noise. We compute discriminativeness
16
+ * dynamically per feature.
17
+ *
18
+ * Falls back to v2.46.0 heuristic classifier when seed stats unavailable
19
+ * (e.g. user has deleted the corpus). Defensive: never throws.
20
+ */
21
+ import { seedStats, buildSeedCorpus } from "./calibration_corpus.js";
22
+ import { classifyAgent as heuristicClassify } from "./classifier.js";
23
+ import { extractFingerprint } from "./features.js";
24
+ const EPSILON_FLOOR = 1e-3;
25
+ /** Cap per-feature z² so a single zero-stdev mismatch can't dominate. */
26
+ const Z_SQUARED_CAP = 100;
27
+ /** EPSILON_FLOOR for any feature with stdev<= this threshold is set to 10% of mean (or floor). */
28
+ function effectiveStdev(mean, stdev) {
29
+ if (stdev > EPSILON_FLOOR)
30
+ return stdev;
31
+ // Zero-stdev: scale to mean's magnitude so features with large means don't
32
+ // produce absurd z-scores. If mean is also tiny, use floor.
33
+ const relative = Math.abs(mean) * 0.10;
34
+ return Math.max(relative, EPSILON_FLOOR);
35
+ }
36
+ /**
37
+ * Compute discriminativeness per feature: ratio of cross-vendor mean
38
+ * variance to within-vendor variance. Higher = more discriminative.
39
+ * Features with discriminativeness < threshold are excluded from scoring.
40
+ */
41
+ function discriminativeFeatures(statsMap, minDiscrim = 0.5) {
42
+ const featureKeys = new Set();
43
+ for (const s of statsMap.values())
44
+ for (const k of Object.keys(s.features))
45
+ featureKeys.add(k);
46
+ const out = [];
47
+ for (const k of featureKeys) {
48
+ const means = [];
49
+ const stdevs = [];
50
+ for (const s of statsMap.values()) {
51
+ const f = s.features[k];
52
+ if (!f)
53
+ continue;
54
+ means.push(f.mean);
55
+ stdevs.push(f.stdev);
56
+ }
57
+ if (means.length < 2)
58
+ continue;
59
+ const meanOfMeans = means.reduce((a, b) => a + b, 0) / means.length;
60
+ const meansVar = means.reduce((s, m) => s + (m - meanOfMeans) ** 2, 0) / means.length;
61
+ const meanStdev = stdevs.reduce((a, b) => a + b, 0) / stdevs.length;
62
+ const denom = meanStdev * meanStdev + EPSILON_FLOOR;
63
+ const discrim = meansVar / denom;
64
+ if (discrim >= minDiscrim)
65
+ out.push(k);
66
+ }
67
+ return out;
68
+ }
69
+ let _cachedDiscrim = null;
70
+ function getDiscriminativeFeatures() {
71
+ if (_cachedDiscrim)
72
+ return _cachedDiscrim;
73
+ try {
74
+ _cachedDiscrim = discriminativeFeatures(seedStats());
75
+ }
76
+ catch {
77
+ _cachedDiscrim = [];
78
+ }
79
+ return _cachedDiscrim;
80
+ }
81
+ export function __resetCalibratedCacheForTest() { _cachedDiscrim = null; }
82
+ /**
83
+ * Calibrated log-likelihood score per vendor. Pure deterministic.
84
+ */
85
+ function scoreCalibrated(fp) {
86
+ const stats = (() => { try {
87
+ return seedStats();
88
+ }
89
+ catch {
90
+ return new Map();
91
+ } })();
92
+ if (stats.size === 0)
93
+ return { scores: {}, discrim: [] };
94
+ const discrim = getDiscriminativeFeatures();
95
+ if (discrim.length === 0)
96
+ return { scores: {}, discrim };
97
+ const scores = {};
98
+ const fpObj = fp;
99
+ for (const [vendor, vstats] of stats) {
100
+ let logL = 0;
101
+ for (const k of discrim) {
102
+ const f = vstats.features[k];
103
+ if (!f)
104
+ continue;
105
+ const sd = effectiveStdev(f.mean, f.stdev);
106
+ const z = (Number(fpObj[k] ?? 0) - f.mean) / sd;
107
+ const zSq = Math.min(Z_SQUARED_CAP, z * z);
108
+ logL -= zSq;
109
+ }
110
+ scores[vendor] = logL;
111
+ }
112
+ return { scores, discrim };
113
+ }
114
+ function softmaxTop(scores) {
115
+ const entries = Object.entries(scores);
116
+ if (entries.length === 0)
117
+ return { topVendor: "unknown", confidence: 0 };
118
+ const maxLogL = Math.max(...entries.map(([, v]) => v));
119
+ const exps = entries.map(([k, v]) => [k, Math.exp((v - maxLogL) / Math.max(1, entries.length))]);
120
+ const sum = exps.reduce((s, [, v]) => s + v, 0);
121
+ const sorted = exps.sort((a, b) => b[1] - a[1]);
122
+ const top = sorted[0];
123
+ return { topVendor: top[0], confidence: sum === 0 ? 0 : top[1] / sum };
124
+ }
125
+ /**
126
+ * Calibrated classification. Falls back to v2.46.0 heuristic when the
127
+ * calibration corpus is unavailable.
128
+ */
129
+ export function classifyAgentCalibrated(fp) {
130
+ // v2.48.0 — LOW-SIGNAL GUARD: when the fingerprint has no real signal
131
+ // (no added/removed lines + no PR description + no commits), the
132
+ // classifier should NOT commit to a vendor with high confidence. The
133
+ // Mahalanobis math always picks a winner when given an all-zero vector
134
+ // (the vendor with the smallest mean wins), producing false-positive
135
+ // 99% confidence on garbage/empty inputs (v2.47 B1 cluster).
136
+ const fpObj0 = fp;
137
+ const totalSignal = Number(fpObj0["added_lines"] ?? 0) +
138
+ Number(fpObj0["removed_lines"] ?? 0) +
139
+ Number(fpObj0["pr_desc_length_chars"] ?? 0) +
140
+ Number(fpObj0["commit_count"] ?? 0);
141
+ if (totalSignal < 3) {
142
+ return {
143
+ topVendor: "unknown",
144
+ confidence: 0,
145
+ scores: {},
146
+ reasoning: `low-signal guard (total signal ${totalSignal} < 3) — refusing to commit to a vendor on empty/garbage input`,
147
+ };
148
+ }
149
+ const { scores, discrim } = scoreCalibrated(fp);
150
+ if (Object.keys(scores).length === 0) {
151
+ // Fallback to heuristic; tag the reasoning so callers know
152
+ const fallback = heuristicClassify(fp);
153
+ return { ...fallback, reasoning: `heuristic fallback (no seed corpus): ${fallback.reasoning}` };
154
+ }
155
+ const { topVendor, confidence } = softmaxTop(scores);
156
+ const driving = discrim.slice(0, 3).join(", ");
157
+ return {
158
+ topVendor,
159
+ confidence,
160
+ scores,
161
+ reasoning: `calibrated log-likelihood over ${discrim.length} discriminative features (top: ${driving}); top vendor ${topVendor} (conf ${confidence.toFixed(2)})`,
162
+ };
163
+ }
164
+ export function evaluateSeedAccuracy() {
165
+ const entries = buildSeedCorpus();
166
+ const perVendor = {};
167
+ let total = 0;
168
+ let correct = 0;
169
+ for (const e of entries) {
170
+ const fp = extractFingerprint(e.fixture);
171
+ const v = classifyAgentCalibrated(fp);
172
+ const isCorrect = v.topVendor === e.vendor;
173
+ total++;
174
+ if (isCorrect)
175
+ correct++;
176
+ const pv = perVendor[e.vendor] ?? { total: 0, correct: 0, accuracy: 0 };
177
+ pv.total++;
178
+ if (isCorrect)
179
+ pv.correct++;
180
+ pv.accuracy = pv.correct / pv.total;
181
+ perVendor[e.vendor] = pv;
182
+ }
183
+ return { total, correct, accuracy: total === 0 ? 0 : correct / total, perVendor };
184
+ }
185
+ //# sourceMappingURL=classifier_calibrated.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"classifier_calibrated.js","sourceRoot":"","sources":["../../src/nemesis/classifier_calibrated.ts"],"names":[],"mappings":"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"}
@@ -21,6 +21,7 @@
21
21
  * via `nemesis install-hook`.
22
22
  */
23
23
  import type { Article50StampInput, StampResult, VerifyStampResult } from "./types.js";
24
+ export declare function __resetWarmCacheForTest(): void;
24
25
  export declare function stampArticle50(input: Article50StampInput): StampResult;
25
26
  /**
26
27
  * Parse a stamped message + HMAC-verify. Returns valid=false on any
@@ -1 +1 @@
1
- {"version":3,"file":"eu_ai_act_stamp.d.ts","sourceRoot":"","sources":["../../src/nemesis/eu_ai_act_stamp.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAGH,OAAO,KAAK,EACM,mBAAmB,EAAE,WAAW,EAAE,iBAAiB,EACpE,MAAM,YAAY,CAAC;AAmBpB,wBAAgB,cAAc,CAAC,KAAK,EAAE,mBAAmB,GAAG,WAAW,CAkCtE;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,cAAc,EAAE,MAAM,GAAG,iBAAiB,CA+BrE"}
1
+ {"version":3,"file":"eu_ai_act_stamp.d.ts","sourceRoot":"","sources":["../../src/nemesis/eu_ai_act_stamp.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAGH,OAAO,KAAK,EACM,mBAAmB,EAAE,WAAW,EAAE,iBAAiB,EACpE,MAAM,YAAY,CAAC;AAYpB,wBAAgB,uBAAuB,IAAI,IAAI,CAAsB;AA4BrE,wBAAgB,cAAc,CAAC,KAAK,EAAE,mBAAmB,GAAG,WAAW,CAkCtE;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,cAAc,EAAE,MAAM,GAAG,iBAAiB,CA+BrE"}
@@ -21,9 +21,30 @@
21
21
  * via `nemesis install-hook`.
22
22
  */
23
23
  import { createHmac } from "node:crypto";
24
- const HMAC_KEY = process.env["MNEME_NEMESIS_KEY"] ?? "MNEME-NEMESIS-DEFAULT-KEY-v2.46";
24
+ // v2.48.0 WARMCACHE: resolve HMAC key once per process so single-call
25
+ // (git hook UX) hits <100ms. Pre-v2.48 git hook = 984ms because the
26
+ // crypto module + key resolution happened cold every call.
27
+ let _keyCache = null;
28
+ function getHmacKey() {
29
+ if (_keyCache)
30
+ return _keyCache;
31
+ _keyCache = process.env["MNEME_NEMESIS_KEY"] ?? "MNEME-NEMESIS-DEFAULT-KEY-v2.46";
32
+ return _keyCache;
33
+ }
34
+ // Test-only reset (used by v48 retry of cold-path measurement).
35
+ export function __resetWarmCacheForTest() { _keyCache = null; }
25
36
  const REGIME = "EU-AI-ACT-2024";
26
37
  const ARTICLE = "50";
38
+ /**
39
+ * v2.48.0 — B2 fix: Number.isFinite guard before clamping. Math.max/min
40
+ * propagate NaN, so pre-v2.48 confidence=NaN survived the clamp + leaked
41
+ * into the stamp body as the literal string "NaN".
42
+ */
43
+ function safeConfidence(c) {
44
+ if (typeof c !== "number" || !Number.isFinite(c))
45
+ return 0;
46
+ return Math.max(0, Math.min(1, c));
47
+ }
27
48
  function canonicalStampBody(s, message) {
28
49
  // Order matters for HMAC; we sort keys explicitly.
29
50
  return JSON.stringify({
@@ -50,12 +71,12 @@ export function stampArticle50(input) {
50
71
  }
51
72
  const at = new Date().toISOString();
52
73
  const contentType = input.contentType ?? "text/x-source-code";
53
- const confidence = Math.max(0, Math.min(1, input.confidence ?? 0));
74
+ const confidence = safeConfidence(input.confidence);
54
75
  const message = input.message ?? "";
55
76
  const body = {
56
77
  at, vendor: input.vendor, confidence, contentType, regime: REGIME, article: ARTICLE,
57
78
  };
58
- const hmac = createHmac("sha256", HMAC_KEY).update(canonicalStampBody(body, message)).digest("hex").slice(0, 32);
79
+ const hmac = createHmac("sha256", getHmacKey()).update(canonicalStampBody(body, message)).digest("hex").slice(0, 32);
59
80
  const stamp = { ...body, hmac };
60
81
  const block = [
61
82
  "",
@@ -108,7 +129,7 @@ export function verifyStamp(stampedMessage) {
108
129
  const body = {
109
130
  at, vendor, confidence: confidenceNum, contentType, regime: REGIME, article: ARTICLE,
110
131
  };
111
- const expected = createHmac("sha256", HMAC_KEY).update(canonicalStampBody(body, message)).digest("hex").slice(0, 32);
132
+ const expected = createHmac("sha256", getHmacKey()).update(canonicalStampBody(body, message)).digest("hex").slice(0, 32);
112
133
  if (expected !== hmac)
113
134
  return { valid: false, reason: "HMAC mismatch — stamp was tampered" };
114
135
  return { valid: true, parsed: { ...body, hmac } };
@@ -1 +1 @@
1
- {"version":3,"file":"eu_ai_act_stamp.js","sourceRoot":"","sources":["../../src/nemesis/eu_ai_act_stamp.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"eu_ai_act_stamp.js","sourceRoot":"","sources":["../../src/nemesis/eu_ai_act_stamp.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"features.d.ts","sourceRoot":"","sources":["../../src/nemesis/features.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAqDvD,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,WAAW,CA6GhE"}
1
+ {"version":3,"file":"features.d.ts","sourceRoot":"","sources":["../../src/nemesis/features.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAkGvD,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,WAAW,CA6GhE"}
@@ -26,31 +26,75 @@ function shannonEntropyNormalized(counts) {
26
26
  return maxH === 0 ? 0 : h / maxH; // ∈ [0, 1]
27
27
  }
28
28
  /**
29
- * Parse a unified diff into per-file added/removed line counts +
30
- * collected added-line text.
29
+ * v2.48.0 UNIVERSAL DIFF PARSER. Handles every diff format encountered
30
+ * in the wild:
31
+ *
32
+ * 1. Standard `git diff` output with `diff --git a/x b/x` headers
33
+ * 2. GitHub API raw diff (no diff-git header; just hunks `@@ -1,3 +1,5 @@`)
34
+ * 3. GitLab API raw diff (same as GitHub)
35
+ * 4. Patch files (`Index: foo` legacy SVN format)
36
+ * 5. HEADER-LESS RAW (just `+`/`-` lines — common in test fixtures,
37
+ * clipboards, AI-pasted snippets)
38
+ *
39
+ * Root-cause fix for B1 (v2.47 audit): the pre-v2.48 parser required a
40
+ * `diff --git` header to set `current`. Without one, ALL `+` lines were
41
+ * IGNORED. Result: classifier saw `conditional_density=0` for any test
42
+ * fixture that lacked the header, and defaulted to the lowest-mean
43
+ * vendor (copilot).
44
+ *
45
+ * Fallback strategy: if no header found in the whole input but there
46
+ * are `+` lines, synthesize an "anonymous" file so + and - lines count.
31
47
  */
32
48
  function parseDiff(diff) {
33
49
  const perFile = new Map();
34
50
  const addedLines = [];
35
51
  const removedLines = [];
36
52
  let current = null;
37
- let currentName = "";
53
+ let anonymousCreated = false;
54
+ const ensureAnonymous = () => {
55
+ if (!current) {
56
+ current = { added: 0, removed: 0 };
57
+ perFile.set("__anonymous__", current);
58
+ anonymousCreated = true;
59
+ }
60
+ return current;
61
+ };
38
62
  for (const ln of diff.split("\n")) {
39
- const m = ln.match(/^diff --git a\/(\S+) b\/(\S+)/);
40
- if (m) {
41
- currentName = m[2];
63
+ // Recognize multiple header formats.
64
+ const gitHeader = ln.match(/^diff --git a\/(\S+) b\/(\S+)/);
65
+ if (gitHeader) {
42
66
  current = { added: 0, removed: 0 };
43
- perFile.set(currentName, current);
67
+ perFile.set(gitHeader[2], current);
68
+ anonymousCreated = false;
44
69
  continue;
45
70
  }
46
- if (!current)
71
+ // SVN/legacy
72
+ const svnHeader = ln.match(/^Index: (\S+)/);
73
+ if (svnHeader) {
74
+ current = { added: 0, removed: 0 };
75
+ perFile.set(svnHeader[1], current);
76
+ anonymousCreated = false;
47
77
  continue;
78
+ }
79
+ // Hunk header alone (GitHub/GitLab raw) — ensures we have a current
80
+ // file to count into. If we're already counting, leave it alone.
81
+ if (/^@@ /.test(ln)) {
82
+ if (!current || anonymousCreated) {
83
+ current = { added: 0, removed: 0 };
84
+ const fname = `__hunk_${perFile.size}__`;
85
+ perFile.set(fname, current);
86
+ anonymousCreated = false;
87
+ }
88
+ continue;
89
+ }
48
90
  if (ln.startsWith("+") && !ln.startsWith("+++")) {
49
- current.added++;
91
+ const cur = ensureAnonymous();
92
+ cur.added++;
50
93
  addedLines.push(ln.slice(1));
51
94
  }
52
95
  else if (ln.startsWith("-") && !ln.startsWith("---")) {
53
- current.removed++;
96
+ const cur = ensureAnonymous();
97
+ cur.removed++;
54
98
  removedLines.push(ln.slice(1));
55
99
  }
56
100
  }
@@ -1 +1 @@
1
- {"version":3,"file":"features.js","sourceRoot":"","sources":["../../src/nemesis/features.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"features.js","sourceRoot":"","sources":["../../src/nemesis/features.ts"],"names":[],"mappings":"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"}
@@ -22,5 +22,11 @@ export { encodeWatermark, decodeWatermark } from "./watermark.js";
22
22
  export { installPreCommitHook, type InstallHookInput, type InstallHookResult } from "./git_hook_installer.js";
23
23
  export { recordFingerprint, readTimeline, computeVariance, type DriftEntry, type VarianceResult } from "./drift_timeline.js";
24
24
  export { detectReplayAttack, type ReplayResult } from "./replay_attack.js";
25
+ export { buildSeedCorpus, computeStats, seedStats, type CorpusEntry, type VendorStats, } from "./calibration_corpus.js";
26
+ export { classifyAgentCalibrated, evaluateSeedAccuracy, type AccuracyReport, } from "./classifier_calibrated.js";
27
+ export { appendCalibrationEntry, readCalibrationLedger, recomputeStats, calibrationStatus, type CalibrationStatus, type AppendResult, } from "./learning_loop.js";
28
+ export { resolveHmacKey, generateProductionKey, type KeyResolution, type KeySource, } from "./key_management.js";
29
+ export { reconcileVendor, type ReconcileInput, type ReconcileVerdict, } from "./vendor_reconcile.js";
30
+ export { computeWeightDelta, applyToConclave, type VerdictInput, type WeightDelta, type ApplyResult, } from "./nemesis_to_conclave.js";
25
31
  export { generateProbes, gradeRun, recordRun, readRuns, trendFor, type Probe, type ProbeFamily, type NemesisRun, type TrendSeries, } from "./nemesis.js";
26
32
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/nemesis/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,YAAY,EACV,QAAQ,EAAE,OAAO,EAAE,WAAW,EAAE,YAAY,EAC5C,kBAAkB,EAAE,eAAe,EAAE,mBAAmB,EACxD,mBAAmB,EAAE,cAAc,EAAE,WAAW,EAAE,iBAAiB,GACpE,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,eAAe,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AACjF,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnE,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAClE,OAAO,EAAE,oBAAoB,EAAE,KAAK,gBAAgB,EAAE,KAAK,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC9G,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,eAAe,EAAE,KAAK,UAAU,EAAE,KAAK,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC7H,OAAO,EAAE,kBAAkB,EAAE,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAO3E,OAAO,EACL,cAAc,EACd,QAAQ,EACR,SAAS,EACT,QAAQ,EACR,QAAQ,EACR,KAAK,KAAK,EACV,KAAK,WAAW,EAChB,KAAK,UAAU,EACf,KAAK,WAAW,GACjB,MAAM,cAAc,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/nemesis/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,YAAY,EACV,QAAQ,EAAE,OAAO,EAAE,WAAW,EAAE,YAAY,EAC5C,kBAAkB,EAAE,eAAe,EAAE,mBAAmB,EACxD,mBAAmB,EAAE,cAAc,EAAE,WAAW,EAAE,iBAAiB,GACpE,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,eAAe,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AACjF,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnE,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAClE,OAAO,EAAE,oBAAoB,EAAE,KAAK,gBAAgB,EAAE,KAAK,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC9G,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,eAAe,EAAE,KAAK,UAAU,EAAE,KAAK,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC7H,OAAO,EAAE,kBAAkB,EAAE,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAI3E,OAAO,EACL,eAAe,EAAE,YAAY,EAAE,SAAS,EACxC,KAAK,WAAW,EAAE,KAAK,WAAW,GACnC,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,uBAAuB,EAAE,oBAAoB,EAC7C,KAAK,cAAc,GACpB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,sBAAsB,EAAE,qBAAqB,EAAE,cAAc,EAAE,iBAAiB,EAChF,KAAK,iBAAiB,EAAE,KAAK,YAAY,GAC1C,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,cAAc,EAAE,qBAAqB,EACrC,KAAK,aAAa,EAAE,KAAK,SAAS,GACnC,MAAM,qBAAqB,CAAC;AAG7B,OAAO,EACL,eAAe,EAAE,KAAK,cAAc,EAAE,KAAK,gBAAgB,GAC5D,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,kBAAkB,EAAE,eAAe,EACnC,KAAK,YAAY,EAAE,KAAK,WAAW,EAAE,KAAK,WAAW,GACtD,MAAM,0BAA0B,CAAC;AAOlC,OAAO,EACL,cAAc,EACd,QAAQ,EACR,SAAS,EACT,QAAQ,EACR,QAAQ,EACR,KAAK,KAAK,EACV,KAAK,WAAW,EAChB,KAAK,UAAU,EACf,KAAK,WAAW,GACjB,MAAM,cAAc,CAAC"}
@@ -21,6 +21,15 @@ export { encodeWatermark, decodeWatermark } from "./watermark.js";
21
21
  export { installPreCommitHook } from "./git_hook_installer.js";
22
22
  export { recordFingerprint, readTimeline, computeVariance } from "./drift_timeline.js";
23
23
  export { detectReplayAttack } from "./replay_attack.js";
24
+ // v2.47.0 — CALIBRATED CLASSIFIER + SELF-CALIBRATING LEARNING LOOP +
25
+ // production-grade HMAC key management.
26
+ export { buildSeedCorpus, computeStats, seedStats, } from "./calibration_corpus.js";
27
+ export { classifyAgentCalibrated, evaluateSeedAccuracy, } from "./classifier_calibrated.js";
28
+ export { appendCalibrationEntry, readCalibrationLedger, recomputeStats, calibrationStatus, } from "./learning_loop.js";
29
+ export { resolveHmacKey, generateProductionKey, } from "./key_management.js";
30
+ // v2.48.0 — bug extinction protocol additions.
31
+ export { reconcileVendor, } from "./vendor_reconcile.js";
32
+ export { computeWeightDelta, applyToConclave, } from "./nemesis_to_conclave.js";
24
33
  // v1.61 NEMESIS PROTOCOL (Tier 5 — weekly adversarial audit) lives in
25
34
  // nemesis.ts alongside the new v2.46.0 ANTI-IDENTITY-LIE ENGINE. Both
26
35
  // export through this barrel so downstream consumers (MCP `nemesis.generate`
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/nemesis/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAQH,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,OAAO,EAAsB,MAAM,eAAe,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AACjF,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnE,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAClE,OAAO,EAAE,oBAAoB,EAAiD,MAAM,yBAAyB,CAAC;AAC9G,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,eAAe,EAAwC,MAAM,qBAAqB,CAAC;AAC7H,OAAO,EAAE,kBAAkB,EAAqB,MAAM,oBAAoB,CAAC;AAE3E,sEAAsE;AACtE,sEAAsE;AACtE,6EAA6E;AAC7E,qEAAqE;AACrE,sEAAsE;AACtE,OAAO,EACL,cAAc,EACd,QAAQ,EACR,SAAS,EACT,QAAQ,EACR,QAAQ,GAKT,MAAM,cAAc,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/nemesis/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAQH,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,OAAO,EAAsB,MAAM,eAAe,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AACjF,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnE,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAClE,OAAO,EAAE,oBAAoB,EAAiD,MAAM,yBAAyB,CAAC;AAC9G,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,eAAe,EAAwC,MAAM,qBAAqB,CAAC;AAC7H,OAAO,EAAE,kBAAkB,EAAqB,MAAM,oBAAoB,CAAC;AAE3E,qEAAqE;AACrE,wCAAwC;AACxC,OAAO,EACL,eAAe,EAAE,YAAY,EAAE,SAAS,GAEzC,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,uBAAuB,EAAE,oBAAoB,GAE9C,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,sBAAsB,EAAE,qBAAqB,EAAE,cAAc,EAAE,iBAAiB,GAEjF,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,cAAc,EAAE,qBAAqB,GAEtC,MAAM,qBAAqB,CAAC;AAE7B,+CAA+C;AAC/C,OAAO,EACL,eAAe,GAChB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,kBAAkB,EAAE,eAAe,GAEpC,MAAM,0BAA0B,CAAC;AAElC,sEAAsE;AACtE,sEAAsE;AACtE,6EAA6E;AAC7E,qEAAqE;AACrE,sEAAsE;AACtE,OAAO,EACL,cAAc,EACd,QAAQ,EACR,SAAS,EACT,QAAQ,EACR,QAAQ,GAKT,MAAM,cAAc,CAAC"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * v2.47.0 — NEMESIS HMAC KEY MANAGEMENT.
3
+ *
4
+ * Production-grade key resolution + WARN-LOUD on default key usage so
5
+ * users in production never accidentally rely on the public default
6
+ * (which an attacker who reads our source can forge against).
7
+ *
8
+ * Resolution order:
9
+ * 1. process.env.MNEME_NEMESIS_KEY (highest priority; production)
10
+ * 2. file: ${repoRoot}/.mneme/nemesis/hmac.key (per-repo override)
11
+ * 3. file: ~/.mneme/nemesis/hmac.key (per-user override)
12
+ * 4. DEFAULT_KEY_INSECURE (last resort; WARN logged)
13
+ *
14
+ * The result is cached for the process lifetime to avoid repeated
15
+ * filesystem reads.
16
+ */
17
+ export type KeySource = "env" | "repo-file" | "user-file" | "default-insecure";
18
+ export interface KeyResolution {
19
+ key: string;
20
+ source: KeySource;
21
+ /** True when source is default-insecure (production should override). */
22
+ insecureWarning: boolean;
23
+ /** User-facing message describing what to do for production. */
24
+ message: string;
25
+ }
26
+ export declare function resolveHmacKey(repoRoot?: string): KeyResolution;
27
+ /** Generate a fresh 32-byte hex key suitable for production use. */
28
+ export declare function generateProductionKey(): string;
29
+ export declare function __resetKeyCacheForTest(): void;
30
+ //# sourceMappingURL=key_management.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"key_management.d.ts","sourceRoot":"","sources":["../../src/nemesis/key_management.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AASH,MAAM,MAAM,SAAS,GAAG,KAAK,GAAG,WAAW,GAAG,WAAW,GAAG,kBAAkB,CAAC;AAE/E,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,SAAS,CAAC;IAClB,yEAAyE;IACzE,eAAe,EAAE,OAAO,CAAC;IACzB,gEAAgE;IAChE,OAAO,EAAE,MAAM,CAAC;CACjB;AAKD,wBAAgB,cAAc,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,aAAa,CA2D/D;AAED,oEAAoE;AACpE,wBAAgB,qBAAqB,IAAI,MAAM,CAE9C;AAED,wBAAgB,sBAAsB,IAAI,IAAI,CAAqC"}
@@ -0,0 +1,91 @@
1
+ /**
2
+ * v2.47.0 — NEMESIS HMAC KEY MANAGEMENT.
3
+ *
4
+ * Production-grade key resolution + WARN-LOUD on default key usage so
5
+ * users in production never accidentally rely on the public default
6
+ * (which an attacker who reads our source can forge against).
7
+ *
8
+ * Resolution order:
9
+ * 1. process.env.MNEME_NEMESIS_KEY (highest priority; production)
10
+ * 2. file: ${repoRoot}/.mneme/nemesis/hmac.key (per-repo override)
11
+ * 3. file: ~/.mneme/nemesis/hmac.key (per-user override)
12
+ * 4. DEFAULT_KEY_INSECURE (last resort; WARN logged)
13
+ *
14
+ * The result is cached for the process lifetime to avoid repeated
15
+ * filesystem reads.
16
+ */
17
+ import { existsSync, readFileSync } from "node:fs";
18
+ import { join } from "node:path";
19
+ import { homedir } from "node:os";
20
+ import { randomBytes } from "node:crypto";
21
+ const DEFAULT_KEY_INSECURE = "MNEME-NEMESIS-DEFAULT-KEY-v2.46-INSECURE";
22
+ let _cached = null;
23
+ let _warned = false;
24
+ export function resolveHmacKey(repoRoot) {
25
+ if (_cached)
26
+ return _cached;
27
+ // 1. env var
28
+ const envKey = process.env["MNEME_NEMESIS_KEY"];
29
+ if (typeof envKey === "string" && envKey.length >= 16) {
30
+ _cached = {
31
+ key: envKey, source: "env", insecureWarning: false,
32
+ message: "HMAC key loaded from MNEME_NEMESIS_KEY env var.",
33
+ };
34
+ return _cached;
35
+ }
36
+ // 2. repo file
37
+ if (repoRoot) {
38
+ const p = join(repoRoot, ".mneme", "nemesis", "hmac.key");
39
+ if (existsSync(p)) {
40
+ try {
41
+ const k = readFileSync(p, "utf8").trim();
42
+ if (k.length >= 16) {
43
+ _cached = {
44
+ key: k, source: "repo-file", insecureWarning: false,
45
+ message: `HMAC key loaded from ${p}`,
46
+ };
47
+ return _cached;
48
+ }
49
+ }
50
+ catch { /* fall through */ }
51
+ }
52
+ }
53
+ // 3. user file
54
+ const userPath = join(homedir(), ".mneme", "nemesis", "hmac.key");
55
+ if (existsSync(userPath)) {
56
+ try {
57
+ const k = readFileSync(userPath, "utf8").trim();
58
+ if (k.length >= 16) {
59
+ _cached = {
60
+ key: k, source: "user-file", insecureWarning: false,
61
+ message: `HMAC key loaded from ${userPath}`,
62
+ };
63
+ return _cached;
64
+ }
65
+ }
66
+ catch { /* fall through */ }
67
+ }
68
+ // 4. default (INSECURE)
69
+ if (!_warned) {
70
+ _warned = true;
71
+ // Warn on stderr so dev sees it; production CI catches it.
72
+ try {
73
+ process.stderr.write("⚠ NEMESIS HMAC key falling back to public default (INSECURE).\n" +
74
+ " For production: set MNEME_NEMESIS_KEY env var (≥16 chars random) OR\n" +
75
+ " write a key to .mneme/nemesis/hmac.key (≥16 chars random).\n" +
76
+ " Generate one: node -e \"console.log(require('crypto').randomBytes(32).toString('hex'))\"\n");
77
+ }
78
+ catch { /* */ }
79
+ }
80
+ _cached = {
81
+ key: DEFAULT_KEY_INSECURE, source: "default-insecure", insecureWarning: true,
82
+ message: "HMAC key fell back to INSECURE default. Set MNEME_NEMESIS_KEY or .mneme/nemesis/hmac.key for production.",
83
+ };
84
+ return _cached;
85
+ }
86
+ /** Generate a fresh 32-byte hex key suitable for production use. */
87
+ export function generateProductionKey() {
88
+ return randomBytes(32).toString("hex");
89
+ }
90
+ export function __resetKeyCacheForTest() { _cached = null; _warned = false; }
91
+ //# sourceMappingURL=key_management.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"key_management.js","sourceRoot":"","sources":["../../src/nemesis/key_management.ts"],"names":[],"mappings":"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"}