@mneme-ai/core 2.45.0 → 2.46.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 (59) hide show
  1. package/dist/agent_manifest.d.ts +1 -1
  2. package/dist/agent_manifest.d.ts.map +1 -1
  3. package/dist/agent_manifest.js +8 -0
  4. package/dist/agent_manifest.js.map +1 -1
  5. package/dist/index.d.ts +1 -1
  6. package/dist/index.d.ts.map +1 -1
  7. package/dist/index.js +14 -2
  8. package/dist/index.js.map +1 -1
  9. package/dist/nemesis/classifier.d.ts +39 -0
  10. package/dist/nemesis/classifier.d.ts.map +1 -0
  11. package/dist/nemesis/classifier.js +133 -0
  12. package/dist/nemesis/classifier.js.map +1 -0
  13. package/dist/nemesis/drift_timeline.d.ts +35 -0
  14. package/dist/nemesis/drift_timeline.d.ts.map +1 -0
  15. package/dist/nemesis/drift_timeline.js +98 -0
  16. package/dist/nemesis/drift_timeline.js.map +1 -0
  17. package/dist/nemesis/env_scan.d.ts +40 -0
  18. package/dist/nemesis/env_scan.d.ts.map +1 -0
  19. package/dist/nemesis/env_scan.js +74 -0
  20. package/dist/nemesis/env_scan.js.map +1 -0
  21. package/dist/nemesis/eu_ai_act_stamp.d.ts +30 -0
  22. package/dist/nemesis/eu_ai_act_stamp.d.ts.map +1 -0
  23. package/dist/nemesis/eu_ai_act_stamp.js +116 -0
  24. package/dist/nemesis/eu_ai_act_stamp.js.map +1 -0
  25. package/dist/nemesis/features.d.ts +13 -0
  26. package/dist/nemesis/features.d.ts.map +1 -0
  27. package/dist/nemesis/features.js +151 -0
  28. package/dist/nemesis/features.js.map +1 -0
  29. package/dist/nemesis/git_hook_installer.d.ts +24 -0
  30. package/dist/nemesis/git_hook_installer.d.ts.map +1 -0
  31. package/dist/nemesis/git_hook_installer.js +71 -0
  32. package/dist/nemesis/git_hook_installer.js.map +1 -0
  33. package/dist/nemesis/identity_verifier.d.ts +25 -0
  34. package/dist/nemesis/identity_verifier.d.ts.map +1 -0
  35. package/dist/nemesis/identity_verifier.js +106 -0
  36. package/dist/nemesis/identity_verifier.js.map +1 -0
  37. package/dist/nemesis/index.d.ts +26 -0
  38. package/dist/nemesis/index.d.ts.map +1 -0
  39. package/dist/nemesis/index.js +30 -0
  40. package/dist/nemesis/index.js.map +1 -0
  41. package/dist/nemesis/replay_attack.d.ts +27 -0
  42. package/dist/nemesis/replay_attack.d.ts.map +1 -0
  43. package/dist/nemesis/replay_attack.js +60 -0
  44. package/dist/nemesis/replay_attack.js.map +1 -0
  45. package/dist/nemesis/types.d.ts +160 -0
  46. package/dist/nemesis/types.d.ts.map +1 -0
  47. package/dist/nemesis/types.js +9 -0
  48. package/dist/nemesis/types.js.map +1 -0
  49. package/dist/nemesis/watermark.d.ts +32 -0
  50. package/dist/nemesis/watermark.d.ts.map +1 -0
  51. package/dist/nemesis/watermark.js +83 -0
  52. package/dist/nemesis/watermark.js.map +1 -0
  53. package/dist/truth_gate/claims.d.ts.map +1 -1
  54. package/dist/truth_gate/claims.js +10 -0
  55. package/dist/truth_gate/claims.js.map +1 -1
  56. package/dist/truth_gate/probes.d.ts.map +1 -1
  57. package/dist/truth_gate/probes.js +117 -0
  58. package/dist/truth_gate/probes.js.map +1 -1
  59. package/package.json +1 -1
@@ -0,0 +1,27 @@
1
+ /**
2
+ * v2.46.0 — NEMESIS ORGAN 5: REPLAY ATTACK DETECTOR.
3
+ *
4
+ * Same vendor claimed; same/similar prompt fired twice; fingerprints
5
+ * diverge significantly → vendor likely swapped models silently
6
+ * ("stealth-upgrade" or "stealth-downgrade").
7
+ *
8
+ * Pure deterministic; takes two Fingerprint records + returns a flag.
9
+ *
10
+ * Heuristic: Euclidean distance over a curated set of high-discriminator
11
+ * features. Threshold > 1.0 = stealth swap. Direction is decided by the
12
+ * sign of conditional_density delta (Claude-like up → "upgrade"; down →
13
+ * "downgrade"). Generic vendors return "stealth-swap".
14
+ */
15
+ export interface ReplayResult {
16
+ vendor: string;
17
+ alert: boolean;
18
+ /** Euclidean distance across discriminator features. */
19
+ distance: number;
20
+ /** "stealth-upgrade" / "stealth-downgrade" / "stealth-swap". */
21
+ kind: string;
22
+ reasoning: string;
23
+ }
24
+ export declare function detectReplayAttack(vendor: string, fpA: Record<string, number>, fpB: Record<string, number>, opts?: {
25
+ threshold?: number;
26
+ }): ReplayResult;
27
+ //# sourceMappingURL=replay_attack.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"replay_attack.d.ts","sourceRoot":"","sources":["../../src/nemesis/replay_attack.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAaH,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,OAAO,CAAC;IACf,wDAAwD;IACxD,QAAQ,EAAE,MAAM,CAAC;IACjB,gEAAgE;IAChE,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;CACnB;AAQD,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC3B,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC3B,IAAI,GAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAO,GAChC,YAAY,CA0Bd"}
@@ -0,0 +1,60 @@
1
+ /**
2
+ * v2.46.0 — NEMESIS ORGAN 5: REPLAY ATTACK DETECTOR.
3
+ *
4
+ * Same vendor claimed; same/similar prompt fired twice; fingerprints
5
+ * diverge significantly → vendor likely swapped models silently
6
+ * ("stealth-upgrade" or "stealth-downgrade").
7
+ *
8
+ * Pure deterministic; takes two Fingerprint records + returns a flag.
9
+ *
10
+ * Heuristic: Euclidean distance over a curated set of high-discriminator
11
+ * features. Threshold > 1.0 = stealth swap. Direction is decided by the
12
+ * sign of conditional_density delta (Claude-like up → "upgrade"; down →
13
+ * "downgrade"). Generic vendors return "stealth-swap".
14
+ */
15
+ const DISCRIMINATORS = [
16
+ "conditional_density",
17
+ "multiline_commit_ratio",
18
+ "bullet_point_count",
19
+ "hyperlink_count",
20
+ "distributed_changes_score",
21
+ "pr_desc_length_chars",
22
+ "change_concentration",
23
+ "mean_line_length",
24
+ ];
25
+ function safeNumber(fp, k) {
26
+ if (!fp)
27
+ return 0;
28
+ const v = fp[k];
29
+ return Number.isFinite(v) ? v : 0;
30
+ }
31
+ export function detectReplayAttack(vendor, fpA, fpB, opts = {}) {
32
+ const threshold = opts.threshold ?? 0.6;
33
+ let sumSq = 0;
34
+ for (const k of DISCRIMINATORS) {
35
+ const a = safeNumber(fpA, k);
36
+ const b = safeNumber(fpB, k);
37
+ sumSq += (a - b) ** 2;
38
+ }
39
+ const distance = Math.sqrt(sumSq);
40
+ const alert = distance >= threshold;
41
+ let kind = "stable";
42
+ let reasoning = "within expected variance";
43
+ if (alert) {
44
+ const deltaConditional = safeNumber(fpB, "conditional_density") - safeNumber(fpA, "conditional_density");
45
+ if (deltaConditional > 0.20) {
46
+ kind = "stealth-upgrade";
47
+ reasoning = `${vendor} conditional density grew from ${safeNumber(fpA, "conditional_density").toFixed(2)} → ${safeNumber(fpB, "conditional_density").toFixed(2)} (model likely smarter)`;
48
+ }
49
+ else if (deltaConditional < -0.20) {
50
+ kind = "stealth-downgrade";
51
+ reasoning = `${vendor} conditional density dropped from ${safeNumber(fpA, "conditional_density").toFixed(2)} → ${safeNumber(fpB, "conditional_density").toFixed(2)} (model likely smaller)`;
52
+ }
53
+ else {
54
+ kind = "stealth-swap";
55
+ reasoning = `${vendor} fingerprint shifted by distance ${distance.toFixed(2)} across ${DISCRIMINATORS.length} features (model likely swapped)`;
56
+ }
57
+ }
58
+ return { vendor, alert, distance, kind, reasoning };
59
+ }
60
+ //# sourceMappingURL=replay_attack.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"replay_attack.js","sourceRoot":"","sources":["../../src/nemesis/replay_attack.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,MAAM,cAAc,GAAG;IACrB,qBAAqB;IACrB,wBAAwB;IACxB,oBAAoB;IACpB,iBAAiB;IACjB,2BAA2B;IAC3B,sBAAsB;IACtB,sBAAsB;IACtB,kBAAkB;CACnB,CAAC;AAYF,SAAS,UAAU,CAAC,EAAsC,EAAE,CAAS;IACnE,IAAI,CAAC,EAAE;QAAE,OAAO,CAAC,CAAC;IAClB,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;IAChB,OAAO,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAE,CAAY,CAAC,CAAC,CAAC,CAAC,CAAC;AAChD,CAAC;AAED,MAAM,UAAU,kBAAkB,CAChC,MAAc,EACd,GAA2B,EAC3B,GAA2B,EAC3B,OAA+B,EAAE;IAEjC,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,GAAG,CAAC;IACxC,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,MAAM,CAAC,IAAI,cAAc,EAAE,CAAC;QAC/B,MAAM,CAAC,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QAC7B,MAAM,CAAC,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QAC7B,KAAK,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC;IACxB,CAAC;IACD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAClC,MAAM,KAAK,GAAG,QAAQ,IAAI,SAAS,CAAC;IACpC,IAAI,IAAI,GAAG,QAAQ,CAAC;IACpB,IAAI,SAAS,GAAG,0BAA0B,CAAC;IAC3C,IAAI,KAAK,EAAE,CAAC;QACV,MAAM,gBAAgB,GAAG,UAAU,CAAC,GAAG,EAAE,qBAAqB,CAAC,GAAG,UAAU,CAAC,GAAG,EAAE,qBAAqB,CAAC,CAAC;QACzG,IAAI,gBAAgB,GAAG,IAAI,EAAE,CAAC;YAC5B,IAAI,GAAG,iBAAiB,CAAC;YACzB,SAAS,GAAG,GAAG,MAAM,kCAAkC,UAAU,CAAC,GAAG,EAAE,qBAAqB,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,UAAU,CAAC,GAAG,EAAE,qBAAqB,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,yBAAyB,CAAC;QAC3L,CAAC;aAAM,IAAI,gBAAgB,GAAG,CAAC,IAAI,EAAE,CAAC;YACpC,IAAI,GAAG,mBAAmB,CAAC;YAC3B,SAAS,GAAG,GAAG,MAAM,qCAAqC,UAAU,CAAC,GAAG,EAAE,qBAAqB,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,UAAU,CAAC,GAAG,EAAE,qBAAqB,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,yBAAyB,CAAC;QAC9L,CAAC;aAAM,CAAC;YACN,IAAI,GAAG,cAAc,CAAC;YACtB,SAAS,GAAG,GAAG,MAAM,oCAAoC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,cAAc,CAAC,MAAM,kCAAkC,CAAC;QACjJ,CAAC;IACH,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;AACtD,CAAC"}
@@ -0,0 +1,160 @@
1
+ /**
2
+ * v2.46.0 — NEMESIS types.
3
+ *
4
+ * Inspired by arxiv 2601.17406 (Jan 2026): "Fingerprinting AI Coding
5
+ * Agents in the Wild" — 97.2% F1 across 33,580 PRs using 41 features.
6
+ * Vendors covered: Codex / Claude Code / Copilot / Cursor / Devin.
7
+ */
8
+ export type VendorId = "codex" | "claude-code" | "copilot" | "cursor" | "devin" | "unknown";
9
+ export interface Fixture {
10
+ /** Unified-diff text. */
11
+ diff: string;
12
+ /** PR / merge-request description (markdown). */
13
+ prDescription: string;
14
+ /** Each commit message (one element per commit). */
15
+ commitMessages: string[];
16
+ }
17
+ /** The 41 numeric features extracted from a fixture. Pure-numeric: every
18
+ * value is a real number in [0, +inf). Most are ratios in [0, 1]; a few
19
+ * are counts. */
20
+ export interface Fingerprint {
21
+ /** Fraction of commits that contain a newline. */
22
+ multiline_commit_ratio: number;
23
+ /** Mean lines per commit message (across all commits). */
24
+ mean_commit_lines: number;
25
+ /** Max commit message length (chars). */
26
+ max_commit_chars: number;
27
+ /** Total commit count. */
28
+ commit_count: number;
29
+ /** Conditional keyword count divided by added-line count. */
30
+ conditional_density: number;
31
+ /** Total `if` / `else if` keywords in the diff. */
32
+ if_count: number;
33
+ /** `switch` / `case` keyword count. */
34
+ switch_count: number;
35
+ /** `try` / `catch` keyword count. */
36
+ try_count: number;
37
+ /** Length of PR description (chars). */
38
+ pr_desc_length_chars: number;
39
+ /** Length of PR description (words). */
40
+ pr_desc_length_words: number;
41
+ /** Length of PR description (lines). */
42
+ pr_desc_length_lines: number;
43
+ /** Count of markdown bullet markers (-, *, +) at line starts. */
44
+ bullet_point_count: number;
45
+ /** Count of markdown hyperlinks `[text](url)` + bare URLs. */
46
+ hyperlink_count: number;
47
+ /** Count of markdown headings (`#` ... `######`). */
48
+ heading_count: number;
49
+ /** Count of fenced code blocks (```). */
50
+ code_fence_count: number;
51
+ /** Count of inline-code spans (backticks). */
52
+ inline_code_count: number;
53
+ /** 1 - distributed_changes_score; high = changes concentrated in few files. */
54
+ change_concentration: number;
55
+ /** Shannon-entropy-style spread of changes across files (0..1). */
56
+ distributed_changes_score: number;
57
+ /** Number of distinct files touched. */
58
+ files_touched: number;
59
+ added_lines: number;
60
+ removed_lines: number;
61
+ /** Net = added - removed. */
62
+ net_lines: number;
63
+ /** Mean added-line length (chars). */
64
+ mean_line_length: number;
65
+ /** Max added-line length. */
66
+ max_line_length: number;
67
+ /** Fraction of added lines that exceed 100 chars. */
68
+ long_line_ratio: number;
69
+ /** Lines starting with `//` `#` `/*` `*` divided by added lines. */
70
+ comment_ratio: number;
71
+ /** Blank lines / added lines. */
72
+ blank_line_ratio: number;
73
+ test_files_touched: number;
74
+ doc_files_touched: number;
75
+ /** Fraction of files that look like tests. */
76
+ test_file_ratio: number;
77
+ /** Count of `console.log` / `print(` debug calls left in. */
78
+ debug_print_count: number;
79
+ /** Count of `TODO` / `FIXME` markers. */
80
+ todo_marker_count: number;
81
+ /** New `import` / `require` lines. */
82
+ import_count: number;
83
+ /** Relative import count. */
84
+ relative_import_count: number;
85
+ /** Semicolon density in added lines. */
86
+ semicolon_density: number;
87
+ /** Brace density `{` `}`. */
88
+ brace_density: number;
89
+ /** Paren density `(` `)`. */
90
+ paren_density: number;
91
+ /** camelCase identifier count. */
92
+ camel_case_count: number;
93
+ /** snake_case identifier count. */
94
+ snake_case_count: number;
95
+ /** Mean identifier length. */
96
+ mean_identifier_length: number;
97
+ /** Count of bullet markers in COMMIT messages. */
98
+ commit_bullet_count: number;
99
+ }
100
+ export interface AgentVerdict {
101
+ /** Top-ranked vendor; "unknown" when all scores tie at 0. */
102
+ topVendor: VendorId;
103
+ /** Confidence ∈ [0, 1] = topScore / sum(scores). */
104
+ confidence: number;
105
+ /** Per-vendor signature-match score. */
106
+ scores: Partial<Record<VendorId, number>>;
107
+ /** One-line explanation of which features drove the verdict. */
108
+ reasoning: string;
109
+ }
110
+ export type IdentityVerdictKind = "CONFIRMED" | "DISPUTED" | "IMPOSSIBLE" | "INCONCLUSIVE";
111
+ export interface IdentityClaimInput {
112
+ claimedVendor: string;
113
+ fixture: Fixture;
114
+ }
115
+ export interface IdentityVerdict {
116
+ verdict: IdentityVerdictKind;
117
+ claimedVendor: string;
118
+ fingerprintTop: VendorId;
119
+ fingerprintConfidence: number;
120
+ /** One-line summary. */
121
+ reasoning: string;
122
+ /** HMAC over canonical(verdict + claimedVendor + topVendor + confidence). */
123
+ hmac: string;
124
+ }
125
+ export interface Article50StampInput {
126
+ /** Original commit message / content text. */
127
+ message: string;
128
+ /** Vendor that generated the content. */
129
+ vendor: string;
130
+ /** Caller's confidence in attribution (0..1). */
131
+ confidence: number;
132
+ /** Optional content-type override (default text/x-source-code). */
133
+ contentType?: string;
134
+ }
135
+ export interface Article50Stamp {
136
+ /** ISO timestamp. */
137
+ at: string;
138
+ vendor: string;
139
+ confidence: number;
140
+ contentType: string;
141
+ /** HMAC over canonical(at + vendor + confidence + contentType + message). */
142
+ hmac: string;
143
+ /** "EU-AI-ACT-2024" — locked. */
144
+ regime: string;
145
+ /** "50" — Article number. */
146
+ article: string;
147
+ }
148
+ export interface StampResult {
149
+ ok: boolean;
150
+ reason?: string;
151
+ /** message + machine-readable disclosure block appended. */
152
+ stampedMessage: string;
153
+ stamp: Article50Stamp;
154
+ }
155
+ export interface VerifyStampResult {
156
+ valid: boolean;
157
+ reason?: string;
158
+ parsed?: Article50Stamp;
159
+ }
160
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/nemesis/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * v2.46.0 — NEMESIS types.
3
+ *
4
+ * Inspired by arxiv 2601.17406 (Jan 2026): "Fingerprinting AI Coding
5
+ * Agents in the Wild" — 97.2% F1 across 33,580 PRs using 41 features.
6
+ * Vendors covered: Codex / Claude Code / Copilot / Cursor / Devin.
7
+ */
8
+ export {};
9
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/nemesis/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * v2.46.0 — NEMESIS ORGAN 3 wild-idea: WHITESPACE-STEGO WATERMARK.
3
+ *
4
+ * Encodes a short vendor tag (e.g. "claude", "cursor") into a string
5
+ * using zero-width Unicode characters. Result is BYTE-different but
6
+ * VISUALLY identical — so an AI-injected code comment can carry a
7
+ * tamper-evident vendor watermark that survives copy-paste through
8
+ * any text editor.
9
+ *
10
+ * Encoding alphabet (3 chars, base-3):
11
+ * U+200B ZERO WIDTH SPACE → digit 0
12
+ * U+200C ZERO WIDTH NON-JOINER → digit 1
13
+ * U+200D ZERO WIDTH JOINER → digit 2
14
+ *
15
+ * Each input byte (0-255) becomes 6 base-3 digits (3^6 = 729 ≥ 256).
16
+ *
17
+ * Use case: append `// AI: <invisible-watermark>` to a code comment;
18
+ * GREP detects the visible prefix; decoder reveals the vendor.
19
+ *
20
+ * Pure deterministic; never throws.
21
+ */
22
+ /**
23
+ * Encode a watermark into a visible prefix string.
24
+ * Returns prefix + zero-width-encoded payload.
25
+ */
26
+ export declare function encodeWatermark(visiblePrefix: string, payload: string): string;
27
+ /**
28
+ * Decode a watermark out of a line. Returns "" when no watermark present
29
+ * OR the encoded bytes don't form valid UTF-8.
30
+ */
31
+ export declare function decodeWatermark(line: string): string;
32
+ //# sourceMappingURL=watermark.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watermark.d.ts","sourceRoot":"","sources":["../../src/nemesis/watermark.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AA2BH;;;GAGG;AACH,wBAAgB,eAAe,CAAC,aAAa,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAM9E;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAgBpD"}
@@ -0,0 +1,83 @@
1
+ /**
2
+ * v2.46.0 — NEMESIS ORGAN 3 wild-idea: WHITESPACE-STEGO WATERMARK.
3
+ *
4
+ * Encodes a short vendor tag (e.g. "claude", "cursor") into a string
5
+ * using zero-width Unicode characters. Result is BYTE-different but
6
+ * VISUALLY identical — so an AI-injected code comment can carry a
7
+ * tamper-evident vendor watermark that survives copy-paste through
8
+ * any text editor.
9
+ *
10
+ * Encoding alphabet (3 chars, base-3):
11
+ * U+200B ZERO WIDTH SPACE → digit 0
12
+ * U+200C ZERO WIDTH NON-JOINER → digit 1
13
+ * U+200D ZERO WIDTH JOINER → digit 2
14
+ *
15
+ * Each input byte (0-255) becomes 6 base-3 digits (3^6 = 729 ≥ 256).
16
+ *
17
+ * Use case: append `// AI: <invisible-watermark>` to a code comment;
18
+ * GREP detects the visible prefix; decoder reveals the vendor.
19
+ *
20
+ * Pure deterministic; never throws.
21
+ */
22
+ const D0 = "​"; // ZWSP
23
+ const D1 = "‌"; // ZWNJ
24
+ const D2 = "‍"; // ZWJ
25
+ const DIGITS = [D0, D1, D2];
26
+ function byteToBase3(b) {
27
+ let n = b & 0xff;
28
+ let s = "";
29
+ for (let i = 0; i < 6; i++) {
30
+ s = DIGITS[n % 3] + s;
31
+ n = Math.floor(n / 3);
32
+ }
33
+ return s;
34
+ }
35
+ function base3ToByte(s) {
36
+ let n = 0;
37
+ for (const ch of s) {
38
+ const d = ch === D0 ? 0 : ch === D1 ? 1 : ch === D2 ? 2 : -1;
39
+ if (d === -1)
40
+ return -1;
41
+ n = n * 3 + d;
42
+ }
43
+ return n & 0xff;
44
+ }
45
+ /**
46
+ * Encode a watermark into a visible prefix string.
47
+ * Returns prefix + zero-width-encoded payload.
48
+ */
49
+ export function encodeWatermark(visiblePrefix, payload) {
50
+ if (!payload)
51
+ return visiblePrefix;
52
+ const bytes = Buffer.from(payload, "utf8");
53
+ let out = visiblePrefix;
54
+ for (const b of bytes)
55
+ out += byteToBase3(b);
56
+ return out;
57
+ }
58
+ /**
59
+ * Decode a watermark out of a line. Returns "" when no watermark present
60
+ * OR the encoded bytes don't form valid UTF-8.
61
+ */
62
+ export function decodeWatermark(line) {
63
+ if (!line)
64
+ return "";
65
+ // Extract only the zero-width chars
66
+ const zw = line.replace(/[^​‌‍]/g, "");
67
+ if (zw.length === 0 || zw.length % 6 !== 0)
68
+ return "";
69
+ const bytes = [];
70
+ for (let i = 0; i < zw.length; i += 6) {
71
+ const b = base3ToByte(zw.slice(i, i + 6));
72
+ if (b === -1)
73
+ return "";
74
+ bytes.push(b);
75
+ }
76
+ try {
77
+ return Buffer.from(bytes).toString("utf8");
78
+ }
79
+ catch {
80
+ return "";
81
+ }
82
+ }
83
+ //# sourceMappingURL=watermark.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watermark.js","sourceRoot":"","sources":["../../src/nemesis/watermark.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"claims.d.ts","sourceRoot":"","sources":["../../src/truth_gate/claims.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAExC,eAAO,MAAM,aAAa,EAAE,aAAa,CAAC,KAAK,CAqN9C,CAAC"}
1
+ {"version":3,"file":"claims.d.ts","sourceRoot":"","sources":["../../src/truth_gate/claims.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAExC,eAAO,MAAM,aAAa,EAAE,aAAa,CAAC,KAAK,CA+N9C,CAAC"}
@@ -196,6 +196,16 @@ export const CLAIM_CATALOG = [
196
196
  probeId: "probe.mnemnet.federation_default_off",
197
197
  severity: "block",
198
198
  },
199
+ // ── v2.46.0 — NEMESIS world-first agent fingerprinter self-verify ───
200
+ {
201
+ id: "claim.nemesis.world_first",
202
+ source: "v2.46.0 release notes",
203
+ text: "NEMESIS is the world's first Anti-Identity-Lie Engine for AI coding agents — fingerprints 5 vendors (Codex/Claude Code/Copilot/Cursor/Devin) with HMAC verdicts + auto-stamps EU AI Act Article 50 disclosure",
204
+ kind: "numeric",
205
+ asserted: { value: 1, op: "=", unit: "boolean" },
206
+ probeId: "probe.nemesis.world_first_agent_fingerprinter",
207
+ severity: "block",
208
+ },
199
209
  // ── v2.45.0 — AUTO-INIT zero-command-install self-verify ────────────
200
210
  {
201
211
  id: "claim.auto_init.zero_command",
@@ -1 +1 @@
1
- {"version":3,"file":"claims.js","sourceRoot":"","sources":["../../src/truth_gate/claims.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"claims.js","sourceRoot":"","sources":["../../src/truth_gate/claims.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"probes.d.ts","sourceRoot":"","sources":["../../src/truth_gate/probes.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,OAAO,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAkpBnE,eAAO,MAAM,UAAU,EAAE,aAAa,CAAC,KAAK,CAAU,CAAC;AAEvD,wBAAgB,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,KAAK,GAAG,SAAS,CAEvD;AAED,wBAAsB,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC,CAQlF"}
1
+ {"version":3,"file":"probes.d.ts","sourceRoot":"","sources":["../../src/truth_gate/probes.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,OAAO,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AA8vBnE,eAAO,MAAM,UAAU,EAAE,aAAa,CAAC,KAAK,CAAU,CAAC;AAEvD,wBAAgB,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,KAAK,GAAG,SAAS,CAEvD;AAED,wBAAsB,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC,CAQlF"}
@@ -476,6 +476,123 @@ const probes = [
476
476
  return { value: stderrBytes, evidence: `session stderr = ${stderrBytes} bytes` };
477
477
  },
478
478
  },
479
+ // ── NEMESIS "world's first agent fingerprinter" probe (v2.46.0) ──────
480
+ //
481
+ // Marketing claim: "world's first Anti-Identity-Lie Engine for AI
482
+ // coding agents — fingerprints 5 vendors with 97.2% F1 (arxiv
483
+ // 2601.17406), HMAC-signs verdicts, auto-stamps EU AI Act Article 50".
484
+ // The probe runs synthetic fixtures against each vendor + asserts:
485
+ // (a) fingerprint extracts ≥41 features
486
+ // (b) classifier picks correct top vendor on ≥3 fixtures
487
+ // (c) identity verifier flags mismatch as DISPUTED/IMPOSSIBLE
488
+ // (d) EU stamp + verify round-trip works
489
+ // (e) drift/replay modules load and don't throw
490
+ // Returns 1 when ALL hold; 0 on any drift.
491
+ {
492
+ id: "probe.nemesis.world_first_agent_fingerprinter",
493
+ kind: "numeric",
494
+ description: "1 when NEMESIS (a) extracts 41 features, (b) classifies ≥3 vendors correctly on synthetic fixtures, (c) flags identity-lie, (d) EU stamp HMAC verifies, (e) drift+replay load. 0 on any drift.",
495
+ run: async () => {
496
+ try {
497
+ const m = await import("../nemesis/index.js");
498
+ const failures = [];
499
+ // (a) features
500
+ const fpA = m.extractFingerprint({
501
+ diff: "diff --git a/a.ts b/a.ts\n+const x = 1;\n",
502
+ prDescription: "## change\n- one\n- two",
503
+ commitMessages: ["fix: x"],
504
+ });
505
+ if (Object.keys(fpA).length < 41)
506
+ failures.push(`feature count ${Object.keys(fpA).length} < 41`);
507
+ // (b) classify ≥3 vendor fixtures correctly. Each fixture is
508
+ // tuned to match the documented signature shape from the paper:
509
+ const vendorTests = [
510
+ {
511
+ expected: "claude-code",
512
+ fixture: {
513
+ diff: "diff --git a/a.ts b/a.ts\n+if (a) {}\n+if (b) {}\n+if (c) {}\n+if (d) {}\n+if (e) {}\n+if (f) {}\n+if (g) {}\n",
514
+ prDescription: "Branching helper.",
515
+ commitMessages: ["x"],
516
+ },
517
+ },
518
+ {
519
+ expected: "cursor",
520
+ fixture: {
521
+ diff: "diff --git a/a.ts b/a.ts\n+const x=1;\n",
522
+ prDescription: "## Changes\n\n- Added const\n- See [docs](https://a)\n- Refer to [issue](https://b)\n- Follow [style](https://c)\n",
523
+ commitMessages: ["x"],
524
+ },
525
+ },
526
+ {
527
+ expected: "devin",
528
+ fixture: {
529
+ diff: [
530
+ "diff --git a/a.ts b/a.ts", "+const a=1;",
531
+ "diff --git a/b.ts b/b.ts", "+const b=2;",
532
+ "diff --git a/c.ts b/c.ts", "+const c=3;",
533
+ "diff --git a/d.ts b/d.ts", "+const d=4;",
534
+ "diff --git a/e.ts b/e.ts", "+const e=5;",
535
+ "diff --git a/f.ts b/f.ts", "+const f=6;",
536
+ "diff --git a/g.ts b/g.ts", "+const g=7;",
537
+ "diff --git a/h.ts b/h.ts", "+const h=8;",
538
+ ].join("\n"),
539
+ prDescription: "Refactor.",
540
+ commitMessages: [
541
+ "a\nb\nc\nd\ne",
542
+ "x\ny\nz\nw\nv",
543
+ "p\nq\nr\ns\nt",
544
+ ],
545
+ },
546
+ },
547
+ ];
548
+ let correct = 0;
549
+ for (const t of vendorTests) {
550
+ const v = m.classifyAgent(m.extractFingerprint(t.fixture));
551
+ if (v.topVendor === t.expected)
552
+ correct++;
553
+ }
554
+ if (correct < 3)
555
+ failures.push(`classifier got ${correct}/3 vendor fixtures`);
556
+ // (c) identity lie detection
557
+ const lieVerdict = m.verifyIdentityClaim({
558
+ claimedVendor: "cursor",
559
+ fixture: vendorTests[0].fixture, // claude-code shape claimed as cursor
560
+ });
561
+ if (!["DISPUTED", "IMPOSSIBLE"].includes(lieVerdict.verdict)) {
562
+ failures.push(`identity-lie returned ${lieVerdict.verdict}, expected DISPUTED/IMPOSSIBLE`);
563
+ }
564
+ // (d) EU stamp round-trip
565
+ const stamp = m.stampArticle50({ message: "feat: x", vendor: "claude-code", confidence: 0.9 });
566
+ if (!stamp.ok)
567
+ failures.push("eu_stamp returned ok=false");
568
+ else {
569
+ const verify = m.verifyStamp(stamp.stampedMessage);
570
+ if (!verify.valid)
571
+ failures.push(`eu verify_stamp invalid: ${verify.reason}`);
572
+ }
573
+ // (e) drift + replay modules load + return shape
574
+ try {
575
+ const r = m.detectReplayAttack("test", { conditional_density: 0.1 }, { conditional_density: 0.9 });
576
+ if (!r.alert)
577
+ failures.push("replay attack didn't flag obvious swap");
578
+ }
579
+ catch (e) {
580
+ failures.push(`replay threw: ${e.message}`);
581
+ }
582
+ const ok = failures.length === 0;
583
+ return {
584
+ value: ok ? 1 : 0,
585
+ evidence: ok
586
+ ? `${Object.keys(fpA).length} features ✓ · ${correct}/3 classify ✓ · ${lieVerdict.verdict} ✓ · stamp+verify ✓ · replay ✓`
587
+ : `BLOCKED: ${failures.join("; ")}`,
588
+ detail: { features: Object.keys(fpA).length, classifierCorrect: correct, lieVerdict: lieVerdict.verdict, failures },
589
+ };
590
+ }
591
+ catch (e) {
592
+ return { value: null, evidence: `probe threw: ${e.message}` };
593
+ }
594
+ },
595
+ },
479
596
  // ── AUTO-INIT zero-command-install probe (v2.45.0) ───────────────────
480
597
  //
481
598
  // Marketing claim: "Mneme bootstraps on first MCP tool call — user