@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.
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/nemesis/calibration_corpus.d.ts +40 -0
- package/dist/nemesis/calibration_corpus.d.ts.map +1 -0
- package/dist/nemesis/calibration_corpus.js +148 -0
- package/dist/nemesis/calibration_corpus.js.map +1 -0
- package/dist/nemesis/classifier_calibrated.d.ts +48 -0
- package/dist/nemesis/classifier_calibrated.d.ts.map +1 -0
- package/dist/nemesis/classifier_calibrated.js +185 -0
- package/dist/nemesis/classifier_calibrated.js.map +1 -0
- package/dist/nemesis/eu_ai_act_stamp.d.ts +1 -0
- package/dist/nemesis/eu_ai_act_stamp.d.ts.map +1 -1
- package/dist/nemesis/eu_ai_act_stamp.js +25 -4
- package/dist/nemesis/eu_ai_act_stamp.js.map +1 -1
- package/dist/nemesis/features.d.ts.map +1 -1
- package/dist/nemesis/features.js +54 -10
- package/dist/nemesis/features.js.map +1 -1
- package/dist/nemesis/index.d.ts +6 -0
- package/dist/nemesis/index.d.ts.map +1 -1
- package/dist/nemesis/index.js +9 -0
- package/dist/nemesis/index.js.map +1 -1
- package/dist/nemesis/key_management.d.ts +30 -0
- package/dist/nemesis/key_management.d.ts.map +1 -0
- package/dist/nemesis/key_management.js +91 -0
- package/dist/nemesis/key_management.js.map +1 -0
- package/dist/nemesis/learning_loop.d.ts +45 -0
- package/dist/nemesis/learning_loop.d.ts.map +1 -0
- package/dist/nemesis/learning_loop.js +116 -0
- package/dist/nemesis/learning_loop.js.map +1 -0
- package/dist/nemesis/nemesis_to_conclave.d.ts +42 -0
- package/dist/nemesis/nemesis_to_conclave.d.ts.map +1 -0
- package/dist/nemesis/nemesis_to_conclave.js +74 -0
- package/dist/nemesis/nemesis_to_conclave.js.map +1 -0
- package/dist/nemesis/vendor_reconcile.d.ts +38 -0
- package/dist/nemesis/vendor_reconcile.d.ts.map +1 -0
- package/dist/nemesis/vendor_reconcile.js +50 -0
- package/dist/nemesis/vendor_reconcile.js.map +1 -0
- package/dist/release_gate/probe_coverage.d.ts +56 -0
- package/dist/release_gate/probe_coverage.d.ts.map +1 -0
- package/dist/release_gate/probe_coverage.js +116 -0
- package/dist/release_gate/probe_coverage.js.map +1 -0
- package/dist/truth_gate/claims.d.ts.map +1 -1
- package/dist/truth_gate/claims.js +15 -0
- package/dist/truth_gate/claims.js.map +1 -1
- package/dist/truth_gate/probes.d.ts.map +1 -1
- package/dist/truth_gate/probes.js +62 -1
- package/dist/truth_gate/probes.js.map +1 -1
- 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;
|
|
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
|
-
|
|
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 =
|
|
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",
|
|
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",
|
|
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":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAKzC,
|
|
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;
|
|
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"}
|
package/dist/nemesis/features.js
CHANGED
|
@@ -26,31 +26,75 @@ function shannonEntropyNormalized(counts) {
|
|
|
26
26
|
return maxH === 0 ? 0 : h / maxH; // ∈ [0, 1]
|
|
27
27
|
}
|
|
28
28
|
/**
|
|
29
|
-
*
|
|
30
|
-
*
|
|
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
|
|
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
|
-
|
|
40
|
-
|
|
41
|
-
|
|
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(
|
|
67
|
+
perFile.set(gitHeader[2], current);
|
|
68
|
+
anonymousCreated = false;
|
|
44
69
|
continue;
|
|
45
70
|
}
|
|
46
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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":"AAAA;;;;;;;;;GASG;AAIH,SAAS,UAAU,CAAC,GAAW,EAAE,GAAW;IAC1C,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC;AACnC,CAAC;AAED,SAAS,wBAAwB,CAAC,MAAgB;IAChD,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IAChD,IAAI,KAAK,KAAK,CAAC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IACjD,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,IAAI,CAAC,KAAK,CAAC;YAAE,SAAS;QACtB,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACpB,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACzB,CAAC;IACD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;IACnD,OAAO,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,WAAW;AAC/C,CAAC;AAED
|
|
1
|
+
{"version":3,"file":"features.js","sourceRoot":"","sources":["../../src/nemesis/features.ts"],"names":[],"mappings":"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"}
|
package/dist/nemesis/index.d.ts
CHANGED
|
@@ -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;
|
|
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"}
|
package/dist/nemesis/index.js
CHANGED
|
@@ -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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"}
|