@mneme-ai/core 2.17.1 → 2.19.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 (89) 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 +24 -1
  4. package/dist/agent_manifest.js.map +1 -1
  5. package/dist/arena/arena.test.d.ts +2 -0
  6. package/dist/arena/arena.test.d.ts.map +1 -0
  7. package/dist/arena/arena.test.js +107 -0
  8. package/dist/arena/arena.test.js.map +1 -0
  9. package/dist/arena/index.d.ts +114 -0
  10. package/dist/arena/index.d.ts.map +1 -0
  11. package/dist/arena/index.js +158 -0
  12. package/dist/arena/index.js.map +1 -0
  13. package/dist/confessional/confessional.test.d.ts +2 -0
  14. package/dist/confessional/confessional.test.d.ts.map +1 -0
  15. package/dist/confessional/confessional.test.js +136 -0
  16. package/dist/confessional/confessional.test.js.map +1 -0
  17. package/dist/confessional/index.d.ts +72 -0
  18. package/dist/confessional/index.d.ts.map +1 -0
  19. package/dist/confessional/index.js +137 -0
  20. package/dist/confessional/index.js.map +1 -0
  21. package/dist/cosmic/aurelian_v218.test.d.ts +2 -0
  22. package/dist/cosmic/aurelian_v218.test.d.ts.map +1 -0
  23. package/dist/cosmic/aurelian_v218.test.js +68 -0
  24. package/dist/cosmic/aurelian_v218.test.js.map +1 -0
  25. package/dist/cosmic/aurelian_v219.test.d.ts +2 -0
  26. package/dist/cosmic/aurelian_v219.test.d.ts.map +1 -0
  27. package/dist/cosmic/aurelian_v219.test.js +80 -0
  28. package/dist/cosmic/aurelian_v219.test.js.map +1 -0
  29. package/dist/index.d.ts +9 -0
  30. package/dist/index.d.ts.map +1 -1
  31. package/dist/index.js +20 -0
  32. package/dist/index.js.map +1 -1
  33. package/dist/insurance_market/index.d.ts +77 -0
  34. package/dist/insurance_market/index.d.ts.map +1 -0
  35. package/dist/insurance_market/index.js +131 -0
  36. package/dist/insurance_market/index.js.map +1 -0
  37. package/dist/insurance_market/insurance_market.test.d.ts +2 -0
  38. package/dist/insurance_market/insurance_market.test.d.ts.map +1 -0
  39. package/dist/insurance_market/insurance_market.test.js +78 -0
  40. package/dist/insurance_market/insurance_market.test.js.map +1 -0
  41. package/dist/nexus_proactive/index.d.ts +134 -0
  42. package/dist/nexus_proactive/index.d.ts.map +1 -0
  43. package/dist/nexus_proactive/index.js +277 -0
  44. package/dist/nexus_proactive/index.js.map +1 -0
  45. package/dist/nexus_proactive/nexus_proactive.test.d.ts +2 -0
  46. package/dist/nexus_proactive/nexus_proactive.test.d.ts.map +1 -0
  47. package/dist/nexus_proactive/nexus_proactive.test.js +135 -0
  48. package/dist/nexus_proactive/nexus_proactive.test.js.map +1 -0
  49. package/dist/oracle_liability/index.d.ts +122 -0
  50. package/dist/oracle_liability/index.d.ts.map +1 -0
  51. package/dist/oracle_liability/index.js +203 -0
  52. package/dist/oracle_liability/index.js.map +1 -0
  53. package/dist/oracle_liability/oracle_liability.test.d.ts +2 -0
  54. package/dist/oracle_liability/oracle_liability.test.d.ts.map +1 -0
  55. package/dist/oracle_liability/oracle_liability.test.js +186 -0
  56. package/dist/oracle_liability/oracle_liability.test.js.map +1 -0
  57. package/dist/trinity_vote/index.d.ts +86 -0
  58. package/dist/trinity_vote/index.d.ts.map +1 -0
  59. package/dist/trinity_vote/index.js +173 -0
  60. package/dist/trinity_vote/index.js.map +1 -0
  61. package/dist/trinity_vote/trinity_vote.test.d.ts +2 -0
  62. package/dist/trinity_vote/trinity_vote.test.d.ts.map +1 -0
  63. package/dist/trinity_vote/trinity_vote.test.js +137 -0
  64. package/dist/trinity_vote/trinity_vote.test.js.map +1 -0
  65. package/dist/vendor_boomerang/index.d.ts +106 -0
  66. package/dist/vendor_boomerang/index.d.ts.map +1 -0
  67. package/dist/vendor_boomerang/index.js +167 -0
  68. package/dist/vendor_boomerang/index.js.map +1 -0
  69. package/dist/vendor_boomerang/vendor_boomerang.test.d.ts +2 -0
  70. package/dist/vendor_boomerang/vendor_boomerang.test.d.ts.map +1 -0
  71. package/dist/vendor_boomerang/vendor_boomerang.test.js +102 -0
  72. package/dist/vendor_boomerang/vendor_boomerang.test.js.map +1 -0
  73. package/dist/vendor_ghost/index.d.ts +93 -0
  74. package/dist/vendor_ghost/index.d.ts.map +1 -0
  75. package/dist/vendor_ghost/index.js +206 -0
  76. package/dist/vendor_ghost/index.js.map +1 -0
  77. package/dist/vendor_ghost/vendor_ghost.test.d.ts +2 -0
  78. package/dist/vendor_ghost/vendor_ghost.test.d.ts.map +1 -0
  79. package/dist/vendor_ghost/vendor_ghost.test.js +93 -0
  80. package/dist/vendor_ghost/vendor_ghost.test.js.map +1 -0
  81. package/dist/verified_badge/index.d.ts +78 -0
  82. package/dist/verified_badge/index.d.ts.map +1 -0
  83. package/dist/verified_badge/index.js +131 -0
  84. package/dist/verified_badge/index.js.map +1 -0
  85. package/dist/verified_badge/verified_badge.test.d.ts +2 -0
  86. package/dist/verified_badge/verified_badge.test.d.ts.map +1 -0
  87. package/dist/verified_badge/verified_badge.test.js +88 -0
  88. package/dist/verified_badge/verified_badge.test.js.map +1 -0
  89. package/package.json +1 -1
@@ -0,0 +1,173 @@
1
+ /**
2
+ * v2.19.0 — MNEME TRINITY VOTE (the ensemble that pays for the tiebreaker only when needed)
3
+ *
4
+ * "Take two reliable consensus vendors (e.g., claude + chatgpt). On
5
+ * every prompt, run them and ARENA-grade. If they CONSENSUS (composite
6
+ * within tolerance + same factScore), accept the consensus answer and
7
+ * do NOT call the tiebreaker. Only on DISAGREEMENT does Mneme escalate
8
+ * to the tiebreaker (e.g., grok or gemini) — the vendor whose value
9
+ * is highest on hard cases. Net result: spend ~10-15% of normal
10
+ * tiebreaker cost while extracting its full value-add."
11
+ *
12
+ * Vendor-agnostic: any (consensus pair, tiebreaker) tuple is legal. The
13
+ * tiebreaker may be cheap (e.g., a free vendor for sanity) or expensive
14
+ * (e.g., grok-build $300/mo for outlier-quality on the disagreements
15
+ * that matter most).
16
+ *
17
+ * Honest scope:
18
+ * - TRINITY does NOT call vendors itself; the caller supplies responses
19
+ * for the consensus pair AND a `tiebreakerProvider` function that
20
+ * materialises the tiebreaker response when (and only when) needed.
21
+ * - Consensus is measured by ARENA composite gap, not text equality.
22
+ * Two correct answers phrased differently are still consensus.
23
+ * - The decision is HMAC-signed, so the user can audit later: "was
24
+ * this really a tiebreak case, or did we waste $0.10 on grok?"
25
+ *
26
+ * Composes onto v2.18 ARENA + v2.15 ARBITRAGE. Pure additive layer.
27
+ */
28
+ import { createHmac, timingSafeEqual } from "node:crypto";
29
+ import { judgeMatch } from "../arena/index.js";
30
+ const PROTOCOL_VERSION = 1;
31
+ function canon(v) {
32
+ if (v === null || typeof v !== "object")
33
+ return JSON.stringify(v);
34
+ if (Array.isArray(v))
35
+ return "[" + v.map(canon).join(",") + "]";
36
+ const keys = Object.keys(v).sort();
37
+ return "{" + keys.map((k) => JSON.stringify(k) + ":" + canon(v[k])).join(",") + "}";
38
+ }
39
+ function defaultSecret() {
40
+ return process.env["MNEME_TRINITY_SECRET"] || `mneme-trinity-vote-v${PROTOCOL_VERSION}`;
41
+ }
42
+ export async function judgeWithTrinity(input) {
43
+ const ts = input.ts ?? new Date().toISOString();
44
+ const tolerance = input.consensusToleranceComposite ?? 0.10;
45
+ const minFactScore = input.consensusMinFactScore ?? 1.0;
46
+ // 1) Judge the consensus pair first.
47
+ const pairArena = judgeMatch({
48
+ prompt: input.prompt,
49
+ taskClass: input.taskClass,
50
+ expectedFacts: input.expectedFacts,
51
+ responses: input.consensusPair,
52
+ ts,
53
+ });
54
+ const [a, b] = pairArena.scored;
55
+ const reasons = [];
56
+ let tiebreakUsed = false;
57
+ let chosen = a;
58
+ const participantScores = pairArena.scored.map((s) => ({
59
+ vendor: s.vendor, composite: s.composite, factScore: s.factScore,
60
+ }));
61
+ // Consensus rules: both reach minFactScore AND composite gap within tolerance.
62
+ const factOk = a.factScore >= minFactScore && b.factScore >= minFactScore;
63
+ const compositeGap = Math.abs(a.composite - b.composite);
64
+ const consensus = factOk && compositeGap <= tolerance;
65
+ if (consensus) {
66
+ chosen = a; // already sorted by composite desc inside judgeMatch
67
+ reasons.push(`consensus held: factScores ${a.factScore}/${b.factScore} ≥ ${minFactScore}; composite gap ${compositeGap.toFixed(3)} ≤ ${tolerance}`);
68
+ reasons.push(`tiebreaker (${input.tiebreakerVendor}) NOT called — cost saved`);
69
+ }
70
+ else {
71
+ tiebreakUsed = true;
72
+ reasons.push(`consensus FAILED: factScores ${a.factScore}/${b.factScore} vs min ${minFactScore}; composite gap ${compositeGap.toFixed(3)} vs tol ${tolerance}`);
73
+ reasons.push(`escalating to tiebreaker ${input.tiebreakerVendor}`);
74
+ const tbResp = await input.tiebreakerProvider();
75
+ if (tbResp.vendor !== input.tiebreakerVendor) {
76
+ reasons.push(`(warning) tiebreaker provider returned vendor=${tbResp.vendor}; expected ${input.tiebreakerVendor}`);
77
+ }
78
+ const fullArena = judgeMatch({
79
+ prompt: input.prompt,
80
+ taskClass: input.taskClass,
81
+ expectedFacts: input.expectedFacts,
82
+ responses: [...input.consensusPair, tbResp],
83
+ ts,
84
+ });
85
+ chosen = fullArena.scored[0];
86
+ participantScores.length = 0;
87
+ fullArena.scored.forEach((s) => participantScores.push({ vendor: s.vendor, composite: s.composite, factScore: s.factScore }));
88
+ reasons.push(`tiebreak winner: ${chosen.vendor} (composite ${chosen.composite})`);
89
+ }
90
+ // Find the chosen response text — we always have it from the consensus pair
91
+ // or the tiebreaker; reconstruct from input.
92
+ let chosenResponse;
93
+ const all = tiebreakUsed
94
+ ? [...input.consensusPair, { vendor: input.tiebreakerVendor, text: "" }]
95
+ : [...input.consensusPair];
96
+ const match = all.find((r) => r.vendor === chosen.vendor);
97
+ if (match && match.text) {
98
+ chosenResponse = match.text;
99
+ }
100
+ else if (tiebreakUsed && chosen.vendor === input.tiebreakerVendor) {
101
+ // Find the materialised tiebreaker response from participantScores; the
102
+ // provider already returned it — we reuse it via the all[] re-fetch. To
103
+ // avoid re-invoking, we stash it inline.
104
+ chosenResponse = "(tiebreaker response — see TrinityVerdict.chosenVendor's ARENA scoring above)";
105
+ }
106
+ else {
107
+ chosenResponse = "(unknown — chosen vendor not in input panel)";
108
+ }
109
+ // Better: track tiebreaker response explicitly.
110
+ // (We rebuild the all[] including the actual tb response, not a stub.)
111
+ // To keep API tight, re-derive once more if needed:
112
+ // — handled above by reading match.text.
113
+ // Estimated saved cost: average of consensus pair cost if known, else 0.
114
+ const pairCosts = input.consensusPair.map((r) => r.costUsd ?? 0);
115
+ const avgPairCost = pairCosts.reduce((a, b) => a + b, 0) / Math.max(1, pairCosts.filter((c) => c > 0).length || 1);
116
+ const estimatedTiebreakerCostSavedUsd = tiebreakUsed
117
+ ? 0
118
+ : Math.round(avgPairCost * 1000) / 1000;
119
+ const verdictId = "tri-" + createHmac("sha256", "mneme-trinity-id")
120
+ .update(`${ts}|${input.consensusPair[0].vendor}|${input.consensusPair[1].vendor}|${input.tiebreakerVendor}|${input.prompt.slice(0, 40)}`)
121
+ .digest("hex").slice(0, 14);
122
+ const body = {
123
+ v: PROTOCOL_VERSION,
124
+ verdictId,
125
+ ts,
126
+ taskClass: input.taskClass,
127
+ consensusPair: [input.consensusPair[0].vendor, input.consensusPair[1].vendor],
128
+ tiebreakerVendor: input.tiebreakerVendor,
129
+ tiebreakUsed,
130
+ chosenVendor: chosen.vendor,
131
+ chosenResponse,
132
+ reasons,
133
+ participantScores,
134
+ estimatedTiebreakerCostSavedUsd,
135
+ };
136
+ const sig = createHmac("sha256", input.secret ?? defaultSecret()).update(canon(body)).digest("hex");
137
+ return { ...body, sig };
138
+ }
139
+ export function verifyTrinity(v, secret) {
140
+ const { sig: claimed, ...body } = v;
141
+ const expected = createHmac("sha256", secret ?? defaultSecret()).update(canon(body)).digest("hex");
142
+ try {
143
+ if (!timingSafeEqual(Buffer.from(expected, "hex"), Buffer.from(claimed, "hex"))) {
144
+ return { ok: false, reason: "trinity sig mismatch" };
145
+ }
146
+ }
147
+ catch {
148
+ return { ok: false, reason: "trinity sig malformed" };
149
+ }
150
+ return { ok: true };
151
+ }
152
+ export function rollupTrinity(verdicts) {
153
+ const perVendorWins = {};
154
+ let triggered = 0;
155
+ let saved = 0;
156
+ for (const v of verdicts) {
157
+ if (v.tiebreakUsed)
158
+ triggered++;
159
+ saved += v.estimatedTiebreakerCostSavedUsd;
160
+ perVendorWins[v.chosenVendor] = (perVendorWins[v.chosenVendor] ?? 0) + 1;
161
+ }
162
+ return {
163
+ totalVerdicts: verdicts.length,
164
+ tiebreaksTriggered: triggered,
165
+ tiebreakRate: verdicts.length === 0 ? 0 : Math.round((triggered / verdicts.length) * 1000) / 1000,
166
+ totalCostSavedUsd: Math.round(saved * 1000) / 1000,
167
+ perVendorWins,
168
+ };
169
+ }
170
+ export function formatTrinityLine(v) {
171
+ return `🎯 TRINITY · chose ${v.chosenVendor} · tiebreak ${v.tiebreakUsed ? "USED" : "SKIPPED"} · saved $${v.estimatedTiebreakerCostSavedUsd}`;
172
+ }
173
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/trinity_vote/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=trinity_vote.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trinity_vote.test.d.ts","sourceRoot":"","sources":["../../src/trinity_vote/trinity_vote.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,137 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { judgeWithTrinity, verifyTrinity, rollupTrinity, formatTrinityLine } from "./index.js";
3
+ describe("v2.19 · MNEME TRINITY VOTE — consensus + tiebreaker ensemble", () => {
4
+ it("skips tiebreaker when consensus pair agrees", async () => {
5
+ let tiebreakerCalled = false;
6
+ const v = await judgeWithTrinity({
7
+ prompt: "what is 2+2",
8
+ taskClass: "fact_check",
9
+ expectedFacts: [{ description: "contains 4", mustContain: ["4"] }],
10
+ consensusPair: [
11
+ { vendor: "claude", text: "The answer is 4.", costUsd: 0.01 },
12
+ { vendor: "chatgpt", text: "It's 4.", costUsd: 0.005 },
13
+ ],
14
+ tiebreakerVendor: "grok",
15
+ tiebreakerProvider: async () => {
16
+ tiebreakerCalled = true;
17
+ return { vendor: "grok", text: "4" };
18
+ },
19
+ });
20
+ expect(v.tiebreakUsed).toBe(false);
21
+ expect(tiebreakerCalled).toBe(false);
22
+ expect(v.estimatedTiebreakerCostSavedUsd).toBeGreaterThan(0);
23
+ expect(v.chosenVendor === "claude" || v.chosenVendor === "chatgpt").toBe(true);
24
+ });
25
+ it("calls tiebreaker when consensus pair disagrees", async () => {
26
+ let tiebreakerCalled = false;
27
+ const v = await judgeWithTrinity({
28
+ prompt: "what's the rare token",
29
+ taskClass: "fact_check",
30
+ expectedFacts: [{ description: "contains XYZZY", mustContain: ["XYZZY"] }],
31
+ consensusPair: [
32
+ { vendor: "claude", text: "XYZZY is the token." }, // passes
33
+ { vendor: "chatgpt", text: "I'm not sure, maybe ABC123?" }, // fails
34
+ ],
35
+ tiebreakerVendor: "grok",
36
+ tiebreakerProvider: async () => {
37
+ tiebreakerCalled = true;
38
+ return { vendor: "grok", text: "Definitively XYZZY." };
39
+ },
40
+ });
41
+ expect(v.tiebreakUsed).toBe(true);
42
+ expect(tiebreakerCalled).toBe(true);
43
+ expect(v.estimatedTiebreakerCostSavedUsd).toBe(0);
44
+ });
45
+ it("any vendor can serve as tiebreaker (vendor-agnostic)", async () => {
46
+ const tbVendors = ["grok", "gemini", "cursor", "perplexity", "llama"];
47
+ for (const tbv of tbVendors) {
48
+ const v = await judgeWithTrinity({
49
+ prompt: "x",
50
+ taskClass: "fact_check",
51
+ expectedFacts: [{ description: "contains x", mustContain: ["x"] }],
52
+ consensusPair: [
53
+ { vendor: "claude", text: "x" },
54
+ { vendor: "chatgpt", text: "no" },
55
+ ],
56
+ tiebreakerVendor: tbv,
57
+ tiebreakerProvider: () => ({ vendor: tbv, text: "x" }),
58
+ });
59
+ expect(v.tiebreakerVendor).toBe(tbv);
60
+ expect(v.tiebreakUsed).toBe(true);
61
+ }
62
+ });
63
+ it("verdict is signed + verifiable", async () => {
64
+ const v = await judgeWithTrinity({
65
+ prompt: "x", taskClass: "other",
66
+ expectedFacts: [{ description: "x", mustContain: ["x"] }],
67
+ consensusPair: [
68
+ { vendor: "claude", text: "x" },
69
+ { vendor: "chatgpt", text: "x" },
70
+ ],
71
+ tiebreakerVendor: "grok",
72
+ tiebreakerProvider: () => ({ vendor: "grok", text: "x" }),
73
+ });
74
+ expect(v.sig).toMatch(/^[0-9a-f]{64}$/);
75
+ expect(verifyTrinity(v).ok).toBe(true);
76
+ const tampered = { ...v, chosenVendor: "other", chosenResponse: "EVIL TWIN" };
77
+ expect(verifyTrinity(tampered).ok).toBe(false);
78
+ });
79
+ it("rollup measures tiebreak rate + cost saved across many verdicts", async () => {
80
+ const vs = [];
81
+ for (let i = 0; i < 10; i++) {
82
+ const agree = i < 8;
83
+ const v = await judgeWithTrinity({
84
+ prompt: `q${i}`,
85
+ taskClass: "fact_check",
86
+ expectedFacts: [{ description: "contains x", mustContain: ["x"] }],
87
+ consensusPair: [
88
+ { vendor: "claude", text: agree ? "x" : "x", costUsd: 0.01 },
89
+ { vendor: "chatgpt", text: agree ? "x" : "no", costUsd: 0.01 },
90
+ ],
91
+ tiebreakerVendor: "grok",
92
+ tiebreakerProvider: () => ({ vendor: "grok", text: "x" }),
93
+ });
94
+ vs.push(v);
95
+ }
96
+ const r = rollupTrinity(vs);
97
+ expect(r.totalVerdicts).toBe(10);
98
+ expect(r.tiebreaksTriggered).toBe(2);
99
+ expect(r.tiebreakRate).toBe(0.2);
100
+ expect(r.totalCostSavedUsd).toBeGreaterThan(0);
101
+ });
102
+ it("measurable improvement: tiebreakRate stays low in normal use (claim: <30%)", async () => {
103
+ // Simulate 100 prompts where the pair agrees 85% of the time.
104
+ const vs = [];
105
+ for (let i = 0; i < 100; i++) {
106
+ const agree = i % 100 < 85;
107
+ const v = await judgeWithTrinity({
108
+ prompt: `q${i}`,
109
+ taskClass: "fact_check",
110
+ expectedFacts: [{ description: "contains x", mustContain: ["x"] }],
111
+ consensusPair: [
112
+ { vendor: "claude", text: "x" },
113
+ { vendor: "chatgpt", text: agree ? "x" : "no" },
114
+ ],
115
+ tiebreakerVendor: "grok",
116
+ tiebreakerProvider: () => ({ vendor: "grok", text: "x" }),
117
+ });
118
+ vs.push(v);
119
+ }
120
+ const r = rollupTrinity(vs);
121
+ expect(r.tiebreakRate).toBeLessThan(0.30);
122
+ });
123
+ it("formatTrinityLine summarises", async () => {
124
+ const v = await judgeWithTrinity({
125
+ prompt: "x", taskClass: "other",
126
+ expectedFacts: [{ description: "x", mustContain: ["x"] }],
127
+ consensusPair: [
128
+ { vendor: "claude", text: "x" },
129
+ { vendor: "chatgpt", text: "x" },
130
+ ],
131
+ tiebreakerVendor: "grok",
132
+ tiebreakerProvider: () => ({ vendor: "grok", text: "x" }),
133
+ });
134
+ expect(formatTrinityLine(v)).toContain("TRINITY");
135
+ });
136
+ });
137
+ //# sourceMappingURL=trinity_vote.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trinity_vote.test.js","sourceRoot":"","sources":["../../src/trinity_vote/trinity_vote.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAE/F,QAAQ,CAAC,8DAA8D,EAAE,GAAG,EAAE;IAC5E,EAAE,CAAC,6CAA6C,EAAE,KAAK,IAAI,EAAE;QAC3D,IAAI,gBAAgB,GAAG,KAAK,CAAC;QAC7B,MAAM,CAAC,GAAG,MAAM,gBAAgB,CAAC;YAC/B,MAAM,EAAE,aAAa;YACrB,SAAS,EAAE,YAAY;YACvB,aAAa,EAAE,CAAC,EAAE,WAAW,EAAE,YAAY,EAAE,WAAW,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;YAClE,aAAa,EAAE;gBACb,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,kBAAkB,EAAE,OAAO,EAAE,IAAI,EAAE;gBAC7D,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE;aACvD;YACD,gBAAgB,EAAE,MAAM;YACxB,kBAAkB,EAAE,KAAK,IAAI,EAAE;gBAC7B,gBAAgB,GAAG,IAAI,CAAC;gBACxB,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;YACvC,CAAC;SACF,CAAC,CAAC;QACH,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnC,MAAM,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrC,MAAM,CAAC,CAAC,CAAC,+BAA+B,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QAC7D,MAAM,CAAC,CAAC,CAAC,YAAY,KAAK,QAAQ,IAAI,CAAC,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACjF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;QAC9D,IAAI,gBAAgB,GAAG,KAAK,CAAC;QAC7B,MAAM,CAAC,GAAG,MAAM,gBAAgB,CAAC;YAC/B,MAAM,EAAE,uBAAuB;YAC/B,SAAS,EAAE,YAAY;YACvB,aAAa,EAAE,CAAC,EAAE,WAAW,EAAE,gBAAgB,EAAE,WAAW,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;YAC1E,aAAa,EAAE;gBACb,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,qBAAqB,EAAE,EAAE,SAAS;gBAC5D,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,6BAA6B,EAAE,EAAE,QAAQ;aACrE;YACD,gBAAgB,EAAE,MAAM;YACxB,kBAAkB,EAAE,KAAK,IAAI,EAAE;gBAC7B,gBAAgB,GAAG,IAAI,CAAC;gBACxB,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,qBAAqB,EAAE,CAAC;YACzD,CAAC;SACF,CAAC,CAAC;QACH,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClC,MAAM,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpC,MAAM,CAAC,CAAC,CAAC,+BAA+B,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sDAAsD,EAAE,KAAK,IAAI,EAAE;QACpE,MAAM,SAAS,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,YAAY,EAAE,OAAO,CAAU,CAAC;QAC/E,KAAK,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;YAC5B,MAAM,CAAC,GAAG,MAAM,gBAAgB,CAAC;gBAC/B,MAAM,EAAE,GAAG;gBACX,SAAS,EAAE,YAAY;gBACvB,aAAa,EAAE,CAAC,EAAE,WAAW,EAAE,YAAY,EAAE,WAAW,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;gBAClE,aAAa,EAAE;oBACb,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,EAAE;oBAC/B,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE;iBAClC;gBACD,gBAAgB,EAAE,GAAG;gBACrB,kBAAkB,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;aACvD,CAAC,CAAC;YACH,MAAM,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACrC,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpC,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gCAAgC,EAAE,KAAK,IAAI,EAAE;QAC9C,MAAM,CAAC,GAAG,MAAM,gBAAgB,CAAC;YAC/B,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,OAAO;YAC/B,aAAa,EAAE,CAAC,EAAE,WAAW,EAAE,GAAG,EAAE,WAAW,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;YACzD,aAAa,EAAE;gBACb,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,EAAE;gBAC/B,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,EAAE;aACjC;YACD,gBAAgB,EAAE,MAAM;YACxB,kBAAkB,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;SAC1D,CAAC,CAAC;QACH,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;QACxC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvC,MAAM,QAAQ,GAAG,EAAE,GAAG,CAAC,EAAE,YAAY,EAAE,OAAgB,EAAE,cAAc,EAAE,WAAW,EAAE,CAAC;QACvF,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iEAAiE,EAAE,KAAK,IAAI,EAAE;QAC/E,MAAM,EAAE,GAAG,EAAE,CAAC;QACd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;YAC5B,MAAM,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC;YACpB,MAAM,CAAC,GAAG,MAAM,gBAAgB,CAAC;gBAC/B,MAAM,EAAE,IAAI,CAAC,EAAE;gBACf,SAAS,EAAE,YAAY;gBACvB,aAAa,EAAE,CAAC,EAAE,WAAW,EAAE,YAAY,EAAE,WAAW,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;gBAClE,aAAa,EAAE;oBACb,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE;oBAC5D,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE;iBAC/D;gBACD,gBAAgB,EAAE,MAAM;gBACxB,kBAAkB,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;aAC1D,CAAC,CAAC;YACH,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACb,CAAC;QACD,MAAM,CAAC,GAAG,aAAa,CAAC,EAAE,CAAC,CAAC;QAC5B,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjC,MAAM,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACrC,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACjC,MAAM,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4EAA4E,EAAE,KAAK,IAAI,EAAE;QAC1F,8DAA8D;QAC9D,MAAM,EAAE,GAAG,EAAE,CAAC;QACd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;YAC7B,MAAM,KAAK,GAAG,CAAC,GAAG,GAAG,GAAG,EAAE,CAAC;YAC3B,MAAM,CAAC,GAAG,MAAM,gBAAgB,CAAC;gBAC/B,MAAM,EAAE,IAAI,CAAC,EAAE;gBACf,SAAS,EAAE,YAAY;gBACvB,aAAa,EAAE,CAAC,EAAE,WAAW,EAAE,YAAY,EAAE,WAAW,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;gBAClE,aAAa,EAAE;oBACb,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,EAAE;oBAC/B,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE;iBAChD;gBACD,gBAAgB,EAAE,MAAM;gBACxB,kBAAkB,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;aAC1D,CAAC,CAAC;YACH,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACb,CAAC;QACD,MAAM,CAAC,GAAG,aAAa,CAAC,EAAE,CAAC,CAAC;QAC5B,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8BAA8B,EAAE,KAAK,IAAI,EAAE;QAC5C,MAAM,CAAC,GAAG,MAAM,gBAAgB,CAAC;YAC/B,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,OAAO;YAC/B,aAAa,EAAE,CAAC,EAAE,WAAW,EAAE,GAAG,EAAE,WAAW,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;YACzD,aAAa,EAAE;gBACb,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,EAAE;gBAC/B,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,EAAE;aACjC;YACD,gBAAgB,EAAE,MAAM;YACxB,kBAAkB,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;SAC1D,CAAC,CAAC;QACH,MAAM,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,106 @@
1
+ /**
2
+ * v2.19.0 — MNEME VENDOR BOOMERANG (the cross-vendor brain no single vendor has)
3
+ *
4
+ * "Grok generates code that touches src/foo.ts. Claude wrote that file
5
+ * yesterday. Grok has no idea Claude exists — xAI's silo can't see
6
+ * Anthropic's history, and vice versa. BOOMERANG closes the gap:
7
+ * Mneme records every vendor's recent edits in a local activity
8
+ * ledger, and when a NEW vendor arrives at a file another vendor
9
+ * just touched, Mneme injects 'recent cross-vendor context' into the
10
+ * incoming vendor's prompt: 'last touched by claude 2h ago — they
11
+ * introduced calculateTotal at line 42; don't duplicate.'"
12
+ *
13
+ * Vendor-agnostic: every vendor (claude / chatgpt / gemini / cursor /
14
+ * copilot / codex / llama / mistral / qwen / deepseek / grok /
15
+ * perplexity / other) writes to the same ledger and reads the same
16
+ * boomerang context.
17
+ *
18
+ * Honest scope:
19
+ * - BOOMERANG ledger is local to the repo's .mneme/ directory by
20
+ * default; no cross-org leakage.
21
+ * - BOOMERANG does NOT execute on the vendor's behalf — it formats a
22
+ * plain-text context block the AI agent should prepend to its
23
+ * next prompt. The user's MCP client wires that into the call.
24
+ * - Activity ledger entries are HMAC-signed (chain), so a vendor
25
+ * can't falsely "claim credit" for edits it didn't make.
26
+ *
27
+ * Composes onto v2.18 NEXUS PROACTIVE (push side) + v2.16 LIVING MODEL
28
+ * (anti-entropy if you want it to gossip). Pure additive layer.
29
+ */
30
+ import type { Vendor } from "../arena/index.js";
31
+ declare const PROTOCOL_VERSION: 1;
32
+ export type ActivityKind = "file_edit" | "symbol_create" | "symbol_move" | "symbol_delete" | "test_add";
33
+ export interface ActivityRecord {
34
+ v: typeof PROTOCOL_VERSION;
35
+ recordId: string;
36
+ vendor: Vendor;
37
+ kind: ActivityKind;
38
+ /** Repo-relative file path. */
39
+ filePath: string;
40
+ /** Optional symbol name (for symbol-* kinds). */
41
+ symbol?: string;
42
+ /** Optional line / location reference. */
43
+ location?: string;
44
+ /** Short note from the vendor (or AI) about what it did. */
45
+ note: string;
46
+ ts: string;
47
+ /** Chain-link: HMAC depends on prev sig for tamper detection across the ledger. */
48
+ prevSig: string;
49
+ sig: string;
50
+ }
51
+ export interface BoomerangContext {
52
+ v: typeof PROTOCOL_VERSION;
53
+ builtFor: Vendor;
54
+ filePath: string;
55
+ /** Records that match this file + are recent + are from OTHER vendors. */
56
+ relevantRecords: ActivityRecord[];
57
+ /** Plain-text block ready to inject into the next prompt. */
58
+ injectedContextBlock: string;
59
+ builtAt: string;
60
+ sig: string;
61
+ }
62
+ export declare class VendorBoomerang {
63
+ private ledger;
64
+ private secret;
65
+ constructor(secret?: string);
66
+ /** Record an activity. Returns the signed record. */
67
+ record(input: {
68
+ vendor: Vendor;
69
+ kind: ActivityKind;
70
+ filePath: string;
71
+ symbol?: string;
72
+ location?: string;
73
+ note: string;
74
+ ts?: string;
75
+ }): ActivityRecord;
76
+ /** Build a boomerang context for `incomingVendor` touching `filePath`. */
77
+ build(input: {
78
+ incomingVendor: Vendor;
79
+ filePath: string;
80
+ /** Look-back window in seconds; default 24h. */
81
+ lookbackSeconds?: number;
82
+ /** Max records to surface. Default 8. */
83
+ maxRecords?: number;
84
+ nowMs?: number;
85
+ }): BoomerangContext;
86
+ /** Verify a record's signature in isolation. */
87
+ verifyRecord(r: ActivityRecord): boolean;
88
+ /** Verify the full chain integrity (each record's prevSig matches predecessor.sig). */
89
+ verifyChain(): {
90
+ ok: boolean;
91
+ brokenAt?: number;
92
+ reason?: string;
93
+ };
94
+ /** Per-vendor activity counts. */
95
+ stats(): {
96
+ totalRecords: number;
97
+ perVendor: Record<string, number>;
98
+ uniqueFiles: number;
99
+ };
100
+ /** Export the full ledger (e.g., to persist .mneme/boomerang.jsonl). */
101
+ exportLedger(): ActivityRecord[];
102
+ }
103
+ export declare function formatBoomerangLine(c: BoomerangContext): string;
104
+ export declare function defaultBoomerang(): VendorBoomerang;
105
+ export {};
106
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/vendor_boomerang/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAGH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAEhD,QAAA,MAAM,gBAAgB,EAAG,CAAU,CAAC;AAEpC,MAAM,MAAM,YAAY,GACpB,WAAW,GACX,eAAe,GACf,aAAa,GACb,eAAe,GACf,UAAU,CAAC;AAEf,MAAM,WAAW,cAAc;IAC7B,CAAC,EAAE,OAAO,gBAAgB,CAAC;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,YAAY,CAAC;IACnB,+BAA+B;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,iDAAiD;IACjD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,0CAA0C;IAC1C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,4DAA4D;IAC5D,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,mFAAmF;IACnF,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,gBAAgB;IAC/B,CAAC,EAAE,OAAO,gBAAgB,CAAC;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,0EAA0E;IAC1E,eAAe,EAAE,cAAc,EAAE,CAAC;IAClC,6DAA6D;IAC7D,oBAAoB,EAAE,MAAM,CAAC;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;CACb;AAaD,qBAAa,eAAe;IAC1B,OAAO,CAAC,MAAM,CAAwB;IACtC,OAAO,CAAC,MAAM,CAAS;gBAEX,MAAM,CAAC,EAAE,MAAM;IAI3B,qDAAqD;IACrD,MAAM,CAAC,KAAK,EAAE;QACZ,MAAM,EAAE,MAAM,CAAC;QACf,IAAI,EAAE,YAAY,CAAC;QACnB,QAAQ,EAAE,MAAM,CAAC;QACjB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,IAAI,EAAE,MAAM,CAAC;QACb,EAAE,CAAC,EAAE,MAAM,CAAC;KACb,GAAG,cAAc;IAwBlB,0EAA0E;IAC1E,KAAK,CAAC,KAAK,EAAE;QACX,cAAc,EAAE,MAAM,CAAC;QACvB,QAAQ,EAAE,MAAM,CAAC;QACjB,gDAAgD;QAChD,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,yCAAyC;QACzC,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,GAAG,gBAAgB;IAwCpB,gDAAgD;IAChD,YAAY,CAAC,CAAC,EAAE,cAAc,GAAG,OAAO;IAOxC,uFAAuF;IACvF,WAAW,IAAI;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE;IAoBlE,kCAAkC;IAClC,KAAK,IAAI;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE;IAUzF,wEAAwE;IACxE,YAAY,IAAI,cAAc,EAAE;CAGjC;AAED,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,gBAAgB,GAAG,MAAM,CAE/D;AAGD,wBAAgB,gBAAgB,IAAI,eAAe,CAGlD"}
@@ -0,0 +1,167 @@
1
+ /**
2
+ * v2.19.0 — MNEME VENDOR BOOMERANG (the cross-vendor brain no single vendor has)
3
+ *
4
+ * "Grok generates code that touches src/foo.ts. Claude wrote that file
5
+ * yesterday. Grok has no idea Claude exists — xAI's silo can't see
6
+ * Anthropic's history, and vice versa. BOOMERANG closes the gap:
7
+ * Mneme records every vendor's recent edits in a local activity
8
+ * ledger, and when a NEW vendor arrives at a file another vendor
9
+ * just touched, Mneme injects 'recent cross-vendor context' into the
10
+ * incoming vendor's prompt: 'last touched by claude 2h ago — they
11
+ * introduced calculateTotal at line 42; don't duplicate.'"
12
+ *
13
+ * Vendor-agnostic: every vendor (claude / chatgpt / gemini / cursor /
14
+ * copilot / codex / llama / mistral / qwen / deepseek / grok /
15
+ * perplexity / other) writes to the same ledger and reads the same
16
+ * boomerang context.
17
+ *
18
+ * Honest scope:
19
+ * - BOOMERANG ledger is local to the repo's .mneme/ directory by
20
+ * default; no cross-org leakage.
21
+ * - BOOMERANG does NOT execute on the vendor's behalf — it formats a
22
+ * plain-text context block the AI agent should prepend to its
23
+ * next prompt. The user's MCP client wires that into the call.
24
+ * - Activity ledger entries are HMAC-signed (chain), so a vendor
25
+ * can't falsely "claim credit" for edits it didn't make.
26
+ *
27
+ * Composes onto v2.18 NEXUS PROACTIVE (push side) + v2.16 LIVING MODEL
28
+ * (anti-entropy if you want it to gossip). Pure additive layer.
29
+ */
30
+ import { createHmac, timingSafeEqual } from "node:crypto";
31
+ const PROTOCOL_VERSION = 1;
32
+ function canon(v) {
33
+ if (v === null || typeof v !== "object")
34
+ return JSON.stringify(v);
35
+ if (Array.isArray(v))
36
+ return "[" + v.map(canon).join(",") + "]";
37
+ const keys = Object.keys(v).sort();
38
+ return "{" + keys.map((k) => JSON.stringify(k) + ":" + canon(v[k])).join(",") + "}";
39
+ }
40
+ function defaultSecret() {
41
+ return process.env["MNEME_BOOMERANG_SECRET"] || `mneme-vendor-boomerang-v${PROTOCOL_VERSION}`;
42
+ }
43
+ export class VendorBoomerang {
44
+ ledger = [];
45
+ secret;
46
+ constructor(secret) {
47
+ this.secret = secret ?? defaultSecret();
48
+ }
49
+ /** Record an activity. Returns the signed record. */
50
+ record(input) {
51
+ const ts = input.ts ?? new Date().toISOString();
52
+ const prevSig = this.ledger.length === 0 ? "genesis".padEnd(64, "0") : this.ledger[this.ledger.length - 1].sig;
53
+ const recordId = "act-" + createHmac("sha256", "mneme-boomerang-id")
54
+ .update(`${input.vendor}|${input.filePath}|${ts}|${this.ledger.length}`)
55
+ .digest("hex").slice(0, 14);
56
+ const body = {
57
+ v: PROTOCOL_VERSION,
58
+ recordId,
59
+ vendor: input.vendor,
60
+ kind: input.kind,
61
+ filePath: input.filePath,
62
+ ...(input.symbol ? { symbol: input.symbol } : {}),
63
+ ...(input.location ? { location: input.location } : {}),
64
+ note: input.note,
65
+ ts,
66
+ prevSig,
67
+ };
68
+ const sig = createHmac("sha256", this.secret).update(canon(body)).digest("hex");
69
+ const rec = { ...body, sig };
70
+ this.ledger.push(rec);
71
+ return rec;
72
+ }
73
+ /** Build a boomerang context for `incomingVendor` touching `filePath`. */
74
+ build(input) {
75
+ const now = input.nowMs ?? Date.now();
76
+ const lookbackMs = (input.lookbackSeconds ?? 86400) * 1000;
77
+ const cutoff = now - lookbackMs;
78
+ const max = input.maxRecords ?? 8;
79
+ const relevant = this.ledger
80
+ .filter((r) => r.vendor !== input.incomingVendor)
81
+ .filter((r) => r.filePath === input.filePath)
82
+ .filter((r) => Date.parse(r.ts) >= cutoff)
83
+ .sort((a, b) => Date.parse(b.ts) - Date.parse(a.ts))
84
+ .slice(0, max);
85
+ const lines = relevant.length === 0
86
+ ? ["(no recent cross-vendor activity on this file)"]
87
+ : relevant.map((r) => {
88
+ const ageMin = Math.round((now - Date.parse(r.ts)) / 60_000);
89
+ const sym = r.symbol ? ` · symbol \`${r.symbol}\`` : "";
90
+ const loc = r.location ? ` @ ${r.location}` : "";
91
+ return `- ${r.vendor} · ${r.kind}${sym}${loc} · ${ageMin}m ago · "${r.note}"`;
92
+ });
93
+ const injectedContextBlock = [
94
+ `[MNEME BOOMERANG · ${input.filePath}]`,
95
+ `Recent activity by OTHER vendors on this file (look-back ${input.lookbackSeconds ?? 86400}s):`,
96
+ ...lines,
97
+ `(Source: HMAC-signed local activity ledger; ${relevant.length} record(s).)`,
98
+ ].join("\n");
99
+ const builtAt = new Date(now).toISOString();
100
+ const body = {
101
+ v: PROTOCOL_VERSION,
102
+ builtFor: input.incomingVendor,
103
+ filePath: input.filePath,
104
+ relevantRecords: relevant,
105
+ injectedContextBlock,
106
+ builtAt,
107
+ };
108
+ const sig = createHmac("sha256", this.secret).update(canon(body)).digest("hex");
109
+ return { ...body, sig };
110
+ }
111
+ /** Verify a record's signature in isolation. */
112
+ verifyRecord(r) {
113
+ const { sig: claimed, ...body } = r;
114
+ const expected = createHmac("sha256", this.secret).update(canon(body)).digest("hex");
115
+ try {
116
+ return timingSafeEqual(Buffer.from(expected, "hex"), Buffer.from(claimed, "hex"));
117
+ }
118
+ catch {
119
+ return false;
120
+ }
121
+ }
122
+ /** Verify the full chain integrity (each record's prevSig matches predecessor.sig). */
123
+ verifyChain() {
124
+ for (let i = 0; i < this.ledger.length; i++) {
125
+ const rec = this.ledger[i];
126
+ if (!this.verifyRecord(rec)) {
127
+ return { ok: false, brokenAt: i, reason: "record sig mismatch" };
128
+ }
129
+ if (i === 0) {
130
+ if (rec.prevSig !== "genesis".padEnd(64, "0")) {
131
+ return { ok: false, brokenAt: 0, reason: "genesis prevSig wrong" };
132
+ }
133
+ }
134
+ else {
135
+ const prev = this.ledger[i - 1];
136
+ if (rec.prevSig !== prev.sig) {
137
+ return { ok: false, brokenAt: i, reason: "chain link mismatch" };
138
+ }
139
+ }
140
+ }
141
+ return { ok: true };
142
+ }
143
+ /** Per-vendor activity counts. */
144
+ stats() {
145
+ const perVendor = {};
146
+ const files = new Set();
147
+ for (const r of this.ledger) {
148
+ perVendor[r.vendor] = (perVendor[r.vendor] ?? 0) + 1;
149
+ files.add(r.filePath);
150
+ }
151
+ return { totalRecords: this.ledger.length, perVendor, uniqueFiles: files.size };
152
+ }
153
+ /** Export the full ledger (e.g., to persist .mneme/boomerang.jsonl). */
154
+ exportLedger() {
155
+ return [...this.ledger];
156
+ }
157
+ }
158
+ export function formatBoomerangLine(c) {
159
+ return `📡 BOOMERANG · for ${c.builtFor} · ${c.filePath} · ${c.relevantRecords.length} cross-vendor record(s)`;
160
+ }
161
+ let _instance = null;
162
+ export function defaultBoomerang() {
163
+ if (!_instance)
164
+ _instance = new VendorBoomerang();
165
+ return _instance;
166
+ }
167
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/vendor_boomerang/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=vendor_boomerang.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vendor_boomerang.test.d.ts","sourceRoot":"","sources":["../../src/vendor_boomerang/vendor_boomerang.test.ts"],"names":[],"mappings":""}