@mneme-ai/core 2.19.23 → 2.19.25
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/cosmic/aurelian_v1923.test.js +2 -1
- package/dist/cosmic/aurelian_v1923.test.js.map +1 -1
- package/dist/cosmic/aurelian_v1924.test.d.ts +2 -0
- package/dist/cosmic/aurelian_v1924.test.d.ts.map +1 -0
- package/dist/cosmic/aurelian_v1924.test.js +48 -0
- package/dist/cosmic/aurelian_v1924.test.js.map +1 -0
- package/dist/cosmic/aurelian_v1925.test.d.ts +2 -0
- package/dist/cosmic/aurelian_v1925.test.d.ts.map +1 -0
- package/dist/cosmic/aurelian_v1925.test.js +48 -0
- package/dist/cosmic/aurelian_v1925.test.js.map +1 -0
- package/dist/endocrine/endocrine.test.d.ts +2 -0
- package/dist/endocrine/endocrine.test.d.ts.map +1 -0
- package/dist/endocrine/endocrine.test.js +198 -0
- package/dist/endocrine/endocrine.test.js.map +1 -0
- package/dist/endocrine/index.d.ts +159 -0
- package/dist/endocrine/index.d.ts.map +1 -0
- package/dist/endocrine/index.js +277 -0
- package/dist/endocrine/index.js.map +1 -0
- package/dist/event_pattern_match/event_pattern_match.test.d.ts +2 -0
- package/dist/event_pattern_match/event_pattern_match.test.d.ts.map +1 -0
- package/dist/event_pattern_match/event_pattern_match.test.js +175 -0
- package/dist/event_pattern_match/event_pattern_match.test.js.map +1 -0
- package/dist/event_pattern_match/index.d.ts +99 -0
- package/dist/event_pattern_match/index.d.ts.map +1 -0
- package/dist/event_pattern_match/index.js +318 -0
- package/dist/event_pattern_match/index.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -1
- package/dist/sleep_training/index.d.ts +162 -0
- package/dist/sleep_training/index.d.ts.map +1 -0
- package/dist/sleep_training/index.js +218 -0
- package/dist/sleep_training/index.js.map +1 -0
- package/dist/sleep_training/sleep_training.test.d.ts +2 -0
- package/dist/sleep_training/sleep_training.test.d.ts.map +1 -0
- package/dist/sleep_training/sleep_training.test.js +296 -0
- package/dist/sleep_training/sleep_training.test.js.map +1 -0
- package/dist/tool_tier/index.d.ts +101 -0
- package/dist/tool_tier/index.d.ts.map +1 -0
- package/dist/tool_tier/index.js +228 -0
- package/dist/tool_tier/index.js.map +1 -0
- package/dist/tool_tier/tool_tier.test.d.ts +2 -0
- package/dist/tool_tier/tool_tier.test.d.ts.map +1 -0
- package/dist/tool_tier/tool_tier.test.js +133 -0
- package/dist/tool_tier/tool_tier.test.js.map +1 -0
- package/dist/whats_new.d.ts.map +1 -1
- package/dist/whats_new.js +16 -0
- package/dist/whats_new.js.map +1 -1
- package/dist/wrapper_genesis/index.d.ts.map +1 -1
- package/dist/wrapper_genesis/index.js +23 -0
- package/dist/wrapper_genesis/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,296 @@
|
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
2
|
+
import { jaccardSimilarity, runSleepCycle, verifyCycleReport, applyWeightUpdates, morningDigest, formatSleepCycleLine, } from "./index.js";
|
|
3
|
+
const SECRET = "sleep-training-test-secret-997744";
|
|
4
|
+
function pred(patternId, eventSig, tool, conf, ts = 1) {
|
|
5
|
+
return { patternId, eventSig, predictedTool: tool, confidenceAtPrediction: conf, ts };
|
|
6
|
+
}
|
|
7
|
+
function act(eventSig, tool, ts = 1) {
|
|
8
|
+
return { eventSig, toolName: tool, ts };
|
|
9
|
+
}
|
|
10
|
+
describe("v2.19.25 SLEEP TRAINING · jaccardSimilarity (canonical fitness function)", () => {
|
|
11
|
+
it("identical sets -> 1.0", () => {
|
|
12
|
+
expect(jaccardSimilarity(["a", "b"], ["a", "b"])).toBe(1.0);
|
|
13
|
+
});
|
|
14
|
+
it("disjoint sets -> 0.0", () => {
|
|
15
|
+
expect(jaccardSimilarity(["a"], ["b"])).toBe(0.0);
|
|
16
|
+
});
|
|
17
|
+
it("both empty -> 1.0 (vacuous match)", () => {
|
|
18
|
+
expect(jaccardSimilarity([], [])).toBe(1.0);
|
|
19
|
+
});
|
|
20
|
+
it("one empty -> 0.0", () => {
|
|
21
|
+
expect(jaccardSimilarity(["a"], [])).toBe(0.0);
|
|
22
|
+
expect(jaccardSimilarity([], ["b"])).toBe(0.0);
|
|
23
|
+
});
|
|
24
|
+
it("partial overlap (2/3) -> 0.667", () => {
|
|
25
|
+
// {a,b,c} ∩ {b,c,d} = {b,c} = 2; union = 4; 2/4 = 0.5
|
|
26
|
+
expect(jaccardSimilarity(["a", "b", "c"], ["b", "c", "d"])).toBeCloseTo(0.5, 5);
|
|
27
|
+
});
|
|
28
|
+
it("duplicate elements are deduplicated (set semantics)", () => {
|
|
29
|
+
expect(jaccardSimilarity(["a", "a", "b"], ["a", "b"])).toBe(1.0);
|
|
30
|
+
});
|
|
31
|
+
});
|
|
32
|
+
describe("v2.19.25 SLEEP TRAINING · runSleepCycle (the brain)", () => {
|
|
33
|
+
it("perfect prediction -> jaccard 1.0; positive delta if conf < 1", () => {
|
|
34
|
+
const r = runSleepCycle({
|
|
35
|
+
yesterdayPredictions: [pred("p1", "sigA", "mneme.ask", 0.5)],
|
|
36
|
+
yesterdayActualCalls: [act("sigA", "mneme.ask")],
|
|
37
|
+
cycleAt: 1_000_000,
|
|
38
|
+
secret: SECRET,
|
|
39
|
+
});
|
|
40
|
+
expect(r.patternFitness.length).toBe(1);
|
|
41
|
+
expect(r.patternFitness[0].jaccard).toBe(1.0);
|
|
42
|
+
expect(r.patternFitness[0].confidenceDelta).toBeGreaterThan(0);
|
|
43
|
+
});
|
|
44
|
+
it("wrong prediction -> jaccard 0.0; negative delta", () => {
|
|
45
|
+
const r = runSleepCycle({
|
|
46
|
+
yesterdayPredictions: [pred("p1", "sigA", "mneme.WRONG", 0.8)],
|
|
47
|
+
yesterdayActualCalls: [act("sigA", "mneme.RIGHT")],
|
|
48
|
+
cycleAt: 0,
|
|
49
|
+
secret: SECRET,
|
|
50
|
+
});
|
|
51
|
+
expect(r.patternFitness[0].jaccard).toBe(0.0);
|
|
52
|
+
expect(r.patternFitness[0].confidenceDelta).toBeLessThan(0);
|
|
53
|
+
});
|
|
54
|
+
it("learningRate 0 -> no weight movement; learningRate 1 -> jump to jaccard", () => {
|
|
55
|
+
const preds = [pred("p1", "sigA", "x", 0.5)];
|
|
56
|
+
const acts = [act("sigA", "x")];
|
|
57
|
+
const zero = runSleepCycle({ yesterdayPredictions: preds, yesterdayActualCalls: acts, cycleAt: 0, learningRate: 0, secret: SECRET });
|
|
58
|
+
expect(zero.patternFitness[0].confidenceDelta).toBe(0);
|
|
59
|
+
const one = runSleepCycle({ yesterdayPredictions: preds, yesterdayActualCalls: acts, cycleAt: 0, learningRate: 1, secret: SECRET });
|
|
60
|
+
expect(one.patternFitness[0].confidenceDelta).toBe(0.5); // (1.0 - 0.5) × 1 = 0.5
|
|
61
|
+
});
|
|
62
|
+
it("hit rate = mean jaccard across all pattern fitness cells", () => {
|
|
63
|
+
const r = runSleepCycle({
|
|
64
|
+
yesterdayPredictions: [
|
|
65
|
+
pred("p1", "sigA", "x", 0.5),
|
|
66
|
+
pred("p2", "sigB", "y", 0.5),
|
|
67
|
+
],
|
|
68
|
+
yesterdayActualCalls: [
|
|
69
|
+
act("sigA", "x"), // p1 perfect
|
|
70
|
+
act("sigB", "z"), // p2 wrong
|
|
71
|
+
],
|
|
72
|
+
cycleAt: 0,
|
|
73
|
+
secret: SECRET,
|
|
74
|
+
});
|
|
75
|
+
expect(r.hitRate).toBeCloseTo((1.0 + 0.0) / 2, 5);
|
|
76
|
+
});
|
|
77
|
+
it("hitRateDelta against previous cycle (trajectory)", () => {
|
|
78
|
+
const r = runSleepCycle({
|
|
79
|
+
yesterdayPredictions: [pred("p1", "sigA", "x", 0.5)],
|
|
80
|
+
yesterdayActualCalls: [act("sigA", "x")],
|
|
81
|
+
previousHitRate: 0.2,
|
|
82
|
+
cycleAt: 0,
|
|
83
|
+
secret: SECRET,
|
|
84
|
+
});
|
|
85
|
+
expect(r.hitRate).toBe(1.0);
|
|
86
|
+
expect(r.hitRateDelta).toBe(0.8);
|
|
87
|
+
});
|
|
88
|
+
it("multiple predictions per (pattern, sig) cell accumulate; max-jaccard tool set", () => {
|
|
89
|
+
const r = runSleepCycle({
|
|
90
|
+
yesterdayPredictions: [
|
|
91
|
+
pred("p1", "sigA", "x", 0.5),
|
|
92
|
+
pred("p1", "sigA", "y", 0.5),
|
|
93
|
+
pred("p1", "sigA", "z", 0.5),
|
|
94
|
+
],
|
|
95
|
+
yesterdayActualCalls: [
|
|
96
|
+
act("sigA", "x"), act("sigA", "y"),
|
|
97
|
+
],
|
|
98
|
+
cycleAt: 0,
|
|
99
|
+
secret: SECRET,
|
|
100
|
+
});
|
|
101
|
+
// predicted={x,y,z}; actual={x,y}; jaccard = 2/3 ≈ 0.667
|
|
102
|
+
expect(r.patternFitness[0].jaccard).toBeCloseTo(2 / 3, 5);
|
|
103
|
+
expect(r.patternFitness[0].predictionCount).toBe(3);
|
|
104
|
+
});
|
|
105
|
+
it("HMAC sig verifies untampered; rejects tamper", () => {
|
|
106
|
+
const r = runSleepCycle({
|
|
107
|
+
yesterdayPredictions: [pred("p1", "sigA", "x", 0.5)],
|
|
108
|
+
yesterdayActualCalls: [act("sigA", "x")],
|
|
109
|
+
cycleAt: 0,
|
|
110
|
+
secret: SECRET,
|
|
111
|
+
});
|
|
112
|
+
expect(verifyCycleReport(r, SECRET)).toBe(true);
|
|
113
|
+
expect(verifyCycleReport({ ...r, hitRate: 0.99 }, SECRET)).toBe(false);
|
|
114
|
+
});
|
|
115
|
+
it("MEASURED 100% determinism: same input -> same sig (30 trials)", () => {
|
|
116
|
+
const input = {
|
|
117
|
+
yesterdayPredictions: [pred("p1", "sigA", "x", 0.5), pred("p2", "sigB", "y", 0.3)],
|
|
118
|
+
yesterdayActualCalls: [act("sigA", "x"), act("sigB", "z")],
|
|
119
|
+
cycleAt: 1_000_000,
|
|
120
|
+
secret: SECRET,
|
|
121
|
+
};
|
|
122
|
+
const firstSig = runSleepCycle(input).sig;
|
|
123
|
+
let allEqual = true;
|
|
124
|
+
for (let i = 0; i < 30; i++) {
|
|
125
|
+
if (runSleepCycle(input).sig !== firstSig) {
|
|
126
|
+
allEqual = false;
|
|
127
|
+
break;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
expect(allEqual).toBe(true);
|
|
131
|
+
});
|
|
132
|
+
});
|
|
133
|
+
describe("v2.19.25 SLEEP TRAINING · applyWeightUpdates (clamp + accumulate)", () => {
|
|
134
|
+
it("positive delta -> confidence climbs (clamped to 1.0)", () => {
|
|
135
|
+
const patterns = [{ patternId: "p1", confidence: 0.5 }];
|
|
136
|
+
const report = runSleepCycle({
|
|
137
|
+
yesterdayPredictions: [pred("p1", "sigA", "x", 0.5)],
|
|
138
|
+
yesterdayActualCalls: [act("sigA", "x")],
|
|
139
|
+
cycleAt: 0,
|
|
140
|
+
learningRate: 1,
|
|
141
|
+
secret: SECRET,
|
|
142
|
+
});
|
|
143
|
+
const { updated, changes } = applyWeightUpdates({ patterns, report });
|
|
144
|
+
expect(updated[0].confidence).toBe(1.0);
|
|
145
|
+
expect(changes[0].before).toBe(0.5);
|
|
146
|
+
expect(changes[0].after).toBe(1.0);
|
|
147
|
+
expect(changes[0].delta).toBe(0.5);
|
|
148
|
+
});
|
|
149
|
+
it("negative delta -> confidence drops (clamped to 0.01)", () => {
|
|
150
|
+
const patterns = [{ patternId: "p1", confidence: 0.5 }];
|
|
151
|
+
const report = runSleepCycle({
|
|
152
|
+
yesterdayPredictions: [pred("p1", "sigA", "wrong", 0.5)],
|
|
153
|
+
yesterdayActualCalls: [act("sigA", "right")],
|
|
154
|
+
cycleAt: 0,
|
|
155
|
+
learningRate: 1,
|
|
156
|
+
secret: SECRET,
|
|
157
|
+
});
|
|
158
|
+
const { updated } = applyWeightUpdates({ patterns, report });
|
|
159
|
+
expect(updated[0].confidence).toBeLessThan(0.5);
|
|
160
|
+
});
|
|
161
|
+
it("unknown patternId starts at neutral 0.5 then adjusts", () => {
|
|
162
|
+
const report = runSleepCycle({
|
|
163
|
+
yesterdayPredictions: [pred("brand_new_pattern", "sigA", "x", 0.5)],
|
|
164
|
+
yesterdayActualCalls: [act("sigA", "x")],
|
|
165
|
+
cycleAt: 0,
|
|
166
|
+
learningRate: 1,
|
|
167
|
+
secret: SECRET,
|
|
168
|
+
});
|
|
169
|
+
const { updated } = applyWeightUpdates({ patterns: [], report });
|
|
170
|
+
expect(updated.length).toBe(1);
|
|
171
|
+
expect(updated[0].patternId).toBe("brand_new_pattern");
|
|
172
|
+
expect(updated[0].confidence).toBeCloseTo(1.0, 5);
|
|
173
|
+
});
|
|
174
|
+
it("multiple eventSigs for same pattern -> deltas accumulate", () => {
|
|
175
|
+
// pattern p1 fires for sigA (right) AND sigB (wrong) on the same night
|
|
176
|
+
const report = runSleepCycle({
|
|
177
|
+
yesterdayPredictions: [
|
|
178
|
+
pred("p1", "sigA", "x", 0.5),
|
|
179
|
+
pred("p1", "sigB", "y", 0.5),
|
|
180
|
+
],
|
|
181
|
+
yesterdayActualCalls: [
|
|
182
|
+
act("sigA", "x"), // sigA: jaccard 1.0; delta +0.5
|
|
183
|
+
act("sigB", "DIFFERENT"), // sigB: jaccard 0.0; delta -0.5
|
|
184
|
+
],
|
|
185
|
+
cycleAt: 0,
|
|
186
|
+
learningRate: 1,
|
|
187
|
+
secret: SECRET,
|
|
188
|
+
});
|
|
189
|
+
const { updated } = applyWeightUpdates({ patterns: [{ patternId: "p1", confidence: 0.5 }], report });
|
|
190
|
+
// deltas sum to 0; confidence stays at 0.5
|
|
191
|
+
expect(updated[0].confidence).toBeCloseTo(0.5, 5);
|
|
192
|
+
});
|
|
193
|
+
});
|
|
194
|
+
describe("v2.19.25 SLEEP TRAINING · MEASURED 30-night hit-rate trajectory (compounding)", () => {
|
|
195
|
+
it("MEASURED hit rate climbs from ~20% (day 1) to >=70% (day 30) when ineffective patterns are filtered out by confidence threshold", () => {
|
|
196
|
+
// Realistic scenario: 5 patterns compete per event sig — 2 correct + 3 wrong.
|
|
197
|
+
// Caller filters: only fire patterns with confidence >= 0.4 each day.
|
|
198
|
+
// SLEEP TRAINING penalises wrong patterns nightly; their confidence drops
|
|
199
|
+
// below threshold; they stop firing; hit rate climbs as noise filtered out.
|
|
200
|
+
const TRUTH_TOOLS = { sigA: "mneme.ask", sigB: "mneme.why" };
|
|
201
|
+
let patterns = [
|
|
202
|
+
// Correct patterns
|
|
203
|
+
{ patternId: "good_A", confidence: 0.5 },
|
|
204
|
+
{ patternId: "good_B", confidence: 0.5 },
|
|
205
|
+
// Wrong patterns (different tool from truth)
|
|
206
|
+
{ patternId: "noise_A1", confidence: 0.5 },
|
|
207
|
+
{ patternId: "noise_A2", confidence: 0.5 },
|
|
208
|
+
{ patternId: "noise_B1", confidence: 0.5 },
|
|
209
|
+
];
|
|
210
|
+
const patternBehavior = {
|
|
211
|
+
good_A: { sig: "sigA", tool: "mneme.ask" },
|
|
212
|
+
good_B: { sig: "sigB", tool: "mneme.why" },
|
|
213
|
+
noise_A1: { sig: "sigA", tool: "mneme.noise1" },
|
|
214
|
+
noise_A2: { sig: "sigA", tool: "mneme.noise2" },
|
|
215
|
+
noise_B1: { sig: "sigB", tool: "mneme.noise3" },
|
|
216
|
+
};
|
|
217
|
+
const FIRE_THRESHOLD = 0.4;
|
|
218
|
+
let previousHitRate = 0;
|
|
219
|
+
let hitRateDay1 = 0;
|
|
220
|
+
let hitRateDay30 = 0;
|
|
221
|
+
for (let day = 1; day <= 30; day++) {
|
|
222
|
+
// Day's predictions: only patterns with confidence >= threshold fire.
|
|
223
|
+
const preds = [];
|
|
224
|
+
for (const p of patterns) {
|
|
225
|
+
if (p.confidence < FIRE_THRESHOLD)
|
|
226
|
+
continue;
|
|
227
|
+
const b = patternBehavior[p.patternId];
|
|
228
|
+
for (let i = 0; i < 5; i++) {
|
|
229
|
+
preds.push(pred(p.patternId, b.sig, b.tool, p.confidence, day * 1000 + i));
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
const acts = [];
|
|
233
|
+
for (let i = 0; i < 5; i++) {
|
|
234
|
+
acts.push(act("sigA", TRUTH_TOOLS.sigA, day * 1000 + i));
|
|
235
|
+
acts.push(act("sigB", TRUTH_TOOLS.sigB, day * 1000 + i + 100));
|
|
236
|
+
}
|
|
237
|
+
const report = runSleepCycle({
|
|
238
|
+
yesterdayPredictions: preds,
|
|
239
|
+
yesterdayActualCalls: acts,
|
|
240
|
+
previousHitRate,
|
|
241
|
+
cycleAt: day * 86400 * 1000,
|
|
242
|
+
learningRate: 0.3,
|
|
243
|
+
secret: SECRET,
|
|
244
|
+
});
|
|
245
|
+
const updated = applyWeightUpdates({ patterns, report });
|
|
246
|
+
patterns = updated.updated;
|
|
247
|
+
previousHitRate = report.hitRate;
|
|
248
|
+
if (day === 1)
|
|
249
|
+
hitRateDay1 = report.hitRate;
|
|
250
|
+
if (day === 30)
|
|
251
|
+
hitRateDay30 = report.hitRate;
|
|
252
|
+
}
|
|
253
|
+
// Day 1: 5 patterns fire (mix of correct + noise) -> mean jaccard ~0.2-0.4
|
|
254
|
+
expect(hitRateDay1).toBeLessThan(0.5);
|
|
255
|
+
// Day 30: noise patterns dropped below threshold; only correct patterns fire -> high jaccard
|
|
256
|
+
expect(hitRateDay30).toBeGreaterThanOrEqual(0.7);
|
|
257
|
+
// Trajectory grew
|
|
258
|
+
expect(hitRateDay30).toBeGreaterThan(hitRateDay1);
|
|
259
|
+
});
|
|
260
|
+
});
|
|
261
|
+
describe("v2.19.25 SLEEP TRAINING · morning digest + formatter", () => {
|
|
262
|
+
it("morningDigest groups top improved + top regressed patterns", () => {
|
|
263
|
+
const report = runSleepCycle({
|
|
264
|
+
yesterdayPredictions: [
|
|
265
|
+
pred("good", "sigA", "x", 0.2), // delta positive
|
|
266
|
+
pred("bad", "sigB", "wrong", 0.8), // delta negative
|
|
267
|
+
],
|
|
268
|
+
yesterdayActualCalls: [
|
|
269
|
+
act("sigA", "x"),
|
|
270
|
+
act("sigB", "actual"),
|
|
271
|
+
],
|
|
272
|
+
cycleAt: 0,
|
|
273
|
+
learningRate: 1,
|
|
274
|
+
secret: SECRET,
|
|
275
|
+
});
|
|
276
|
+
const d = morningDigest(report);
|
|
277
|
+
expect(d.topImproved.length).toBe(1);
|
|
278
|
+
expect(d.topImproved[0].patternId).toBe("good");
|
|
279
|
+
expect(d.topRegressed.length).toBe(1);
|
|
280
|
+
expect(d.topRegressed[0].patternId).toBe("bad");
|
|
281
|
+
expect(d.oneLine).toContain("SLEEP");
|
|
282
|
+
});
|
|
283
|
+
it("formatSleepCycleLine renders single-line digest", () => {
|
|
284
|
+
const r = runSleepCycle({
|
|
285
|
+
yesterdayPredictions: [pred("p1", "sigA", "x", 0.5)],
|
|
286
|
+
yesterdayActualCalls: [act("sigA", "x")],
|
|
287
|
+
cycleAt: 0,
|
|
288
|
+
previousHitRate: 0.5,
|
|
289
|
+
secret: SECRET,
|
|
290
|
+
});
|
|
291
|
+
const line = formatSleepCycleLine(r);
|
|
292
|
+
expect(line).toContain("SLEEP");
|
|
293
|
+
expect(line).toContain("lr=");
|
|
294
|
+
});
|
|
295
|
+
});
|
|
296
|
+
//# sourceMappingURL=sleep_training.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sleep_training.test.js","sourceRoot":"","sources":["../../src/sleep_training/sleep_training.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v2.19.24 — MNEME TOOL TIER (extends v2.19.23 PROPRIOCEPTION)
|
|
3
|
+
*
|
|
4
|
+
* "เลิก split 67 vs 505. ทุก tool เห็นด้วยกัน + TIER badge — user
|
|
5
|
+
* เห็น tier ที่เหมาะกับ skill, AI เห็นทั้งหมด"
|
|
6
|
+
* — user audit, 2026-05-17
|
|
7
|
+
*
|
|
8
|
+
* Diagnosis: v2.19.23 PROPRIOCEPTION unified the catalog but AI agents
|
|
9
|
+
* still saw 568 tools while users saw ~67 in `mneme --help`. Same
|
|
10
|
+
* structural drift, different surface. The fix is not to HIDE tools
|
|
11
|
+
* from AI — it's to STRATIFY them so users see the right slice for
|
|
12
|
+
* their skill level, and AI still sees the full catalog through MCP.
|
|
13
|
+
*
|
|
14
|
+
* 4 tiers (deterministic classifier; no ML):
|
|
15
|
+
* ⭐⭐⭐ STARTER — curated essentials; first-time users
|
|
16
|
+
* ⭐⭐ EXPLORER — v2.18+ pentads + power-user families
|
|
17
|
+
* ⭐ DEEP — orchestration / system / advanced
|
|
18
|
+
* 🔬 EXPERIMENTAL — edge cases / one-off experiments
|
|
19
|
+
*
|
|
20
|
+
* Pure-function classifier; HMAC-signed budget report; CLI surfaces
|
|
21
|
+
* `mneme tools` with `--tier T` filter. AI agents always see the
|
|
22
|
+
* superset via MCP; "the catalog the AI sees ⊇ the catalog the user
|
|
23
|
+
* sees" — info drift goes to zero structurally.
|
|
24
|
+
*
|
|
25
|
+
* Honest scope:
|
|
26
|
+
* - 3 explicit family sets (STARTER_FAMILIES / STARTER_WHITELIST /
|
|
27
|
+
* EXPERIMENTAL_FAMILIES). The "v2.18+ pentads" tier (EXPLORER) is
|
|
28
|
+
* derived from a canonical V218_PLUS_FAMILIES set already used in
|
|
29
|
+
* v2.19.21 GAP CLOSER. Everything else falls to DEEP.
|
|
30
|
+
* - Tier is a HINT to the user, not a security boundary. AI agents
|
|
31
|
+
* can call ANY tier via MCP; the surface choice is presentation-only.
|
|
32
|
+
* - Composes onto v2.19.23 PROPRIOCEPTION (UnifiedCatalogEntry shape)
|
|
33
|
+
* + v2.19.21 KNOWN_LEGACY_TOP_LEVEL (CLI mount surface).
|
|
34
|
+
*/
|
|
35
|
+
declare const PROTOCOL_VERSION: 1;
|
|
36
|
+
export type Tier = "starter" | "explorer" | "deep" | "experimental";
|
|
37
|
+
/**
|
|
38
|
+
* Curated essentials — first-time users meet Mneme through these.
|
|
39
|
+
* Hand-picked; small enough that beginners aren't overwhelmed.
|
|
40
|
+
*/
|
|
41
|
+
export declare const STARTER_WHITELIST: ReadonlySet<string>;
|
|
42
|
+
/**
|
|
43
|
+
* Families that ALWAYS land in EXPLORER (v2.18+ pentads + organs).
|
|
44
|
+
* These are the "power-user / agent-integration" surface. Same set
|
|
45
|
+
* the v2.19.21 GAP CLOSER audited.
|
|
46
|
+
*/
|
|
47
|
+
export declare const EXPLORER_FAMILIES: ReadonlySet<string>;
|
|
48
|
+
/**
|
|
49
|
+
* EXPERIMENTAL — research / edge-case / opinionated tools. Often
|
|
50
|
+
* vendor-specific or single-purpose. Defaulted hidden from the
|
|
51
|
+
* starter view; AI can still call them.
|
|
52
|
+
*/
|
|
53
|
+
export declare const EXPERIMENTAL_FAMILIES: ReadonlySet<string>;
|
|
54
|
+
export interface TierClassification {
|
|
55
|
+
v: typeof PROTOCOL_VERSION;
|
|
56
|
+
toolName: string;
|
|
57
|
+
tier: Tier;
|
|
58
|
+
reason: string;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Classify a single tool name into one of 4 tiers. Deterministic.
|
|
62
|
+
*
|
|
63
|
+
* Rules (priority order):
|
|
64
|
+
* 1. STARTER_WHITELIST hit → starter
|
|
65
|
+
* 2. EXPERIMENTAL_FAMILIES hit → experimental
|
|
66
|
+
* 3. EXPLORER_FAMILIES hit → explorer
|
|
67
|
+
* 4. fallback → deep
|
|
68
|
+
*
|
|
69
|
+
* The fallback is deliberate: anything we haven't explicitly classified
|
|
70
|
+
* is treated as DEEP (advanced; not for first-time users). That way new
|
|
71
|
+
* tools default to advanced visibility, not noise.
|
|
72
|
+
*/
|
|
73
|
+
export declare function classifyTier(toolName: string): TierClassification;
|
|
74
|
+
export interface TierBudget {
|
|
75
|
+
v: typeof PROTOCOL_VERSION;
|
|
76
|
+
totalTools: number;
|
|
77
|
+
starter: number;
|
|
78
|
+
explorer: number;
|
|
79
|
+
deep: number;
|
|
80
|
+
experimental: number;
|
|
81
|
+
sig: string;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Compute a HMAC-signed budget across all tools. Caller passes the
|
|
85
|
+
* full tool name list; we classify each and tally.
|
|
86
|
+
*/
|
|
87
|
+
export declare function computeTierBudget(input: {
|
|
88
|
+
toolNames: string[];
|
|
89
|
+
secret?: string;
|
|
90
|
+
}): TierBudget;
|
|
91
|
+
export declare function verifyBudget(b: TierBudget, secret?: string): boolean;
|
|
92
|
+
/** Filter tool names by tier; preserves input order. */
|
|
93
|
+
export declare function listByTier(input: {
|
|
94
|
+
toolNames: string[];
|
|
95
|
+
tier: Tier;
|
|
96
|
+
}): string[];
|
|
97
|
+
export declare const TIER_BADGE: Record<Tier, string>;
|
|
98
|
+
export declare const TIER_LABEL: Record<Tier, string>;
|
|
99
|
+
export declare function formatBudgetLine(b: TierBudget): string;
|
|
100
|
+
export {};
|
|
101
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tool_tier/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAIH,QAAA,MAAM,gBAAgB,EAAG,CAAU,CAAC;AAEpC,MAAM,MAAM,IAAI,GAAG,SAAS,GAAG,UAAU,GAAG,MAAM,GAAG,cAAc,CAAC;AAEpE;;;GAGG;AACH,eAAO,MAAM,iBAAiB,EAAE,WAAW,CAAC,MAAM,CAqChD,CAAC;AAEH;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,EAAE,WAAW,CAAC,MAAM,CAmBhD,CAAC;AAEH;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,EAAE,WAAW,CAAC,MAAM,CAOpD,CAAC;AAEH,MAAM,WAAW,kBAAkB;IACjC,CAAC,EAAE,OAAO,gBAAgB,CAAC;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,IAAI,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,kBAAkB,CAqBjE;AAED,MAAM,WAAW,UAAU;IACzB,CAAC,EAAE,OAAO,gBAAgB,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;CACb;AAsBD;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE;IAAE,SAAS,EAAE,MAAM,EAAE,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,UAAU,CAmB7F;AAED,wBAAgB,YAAY,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAGpE;AAED,wDAAwD;AACxD,wBAAgB,UAAU,CAAC,KAAK,EAAE;IAAE,SAAS,EAAE,MAAM,EAAE,CAAC;IAAC,IAAI,EAAE,IAAI,CAAA;CAAE,GAAG,MAAM,EAAE,CAE/E;AAED,eAAO,MAAM,UAAU,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAK3C,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAK3C,CAAC;AAEF,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,UAAU,GAAG,MAAM,CAEtD"}
|
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v2.19.24 — MNEME TOOL TIER (extends v2.19.23 PROPRIOCEPTION)
|
|
3
|
+
*
|
|
4
|
+
* "เลิก split 67 vs 505. ทุก tool เห็นด้วยกัน + TIER badge — user
|
|
5
|
+
* เห็น tier ที่เหมาะกับ skill, AI เห็นทั้งหมด"
|
|
6
|
+
* — user audit, 2026-05-17
|
|
7
|
+
*
|
|
8
|
+
* Diagnosis: v2.19.23 PROPRIOCEPTION unified the catalog but AI agents
|
|
9
|
+
* still saw 568 tools while users saw ~67 in `mneme --help`. Same
|
|
10
|
+
* structural drift, different surface. The fix is not to HIDE tools
|
|
11
|
+
* from AI — it's to STRATIFY them so users see the right slice for
|
|
12
|
+
* their skill level, and AI still sees the full catalog through MCP.
|
|
13
|
+
*
|
|
14
|
+
* 4 tiers (deterministic classifier; no ML):
|
|
15
|
+
* ⭐⭐⭐ STARTER — curated essentials; first-time users
|
|
16
|
+
* ⭐⭐ EXPLORER — v2.18+ pentads + power-user families
|
|
17
|
+
* ⭐ DEEP — orchestration / system / advanced
|
|
18
|
+
* 🔬 EXPERIMENTAL — edge cases / one-off experiments
|
|
19
|
+
*
|
|
20
|
+
* Pure-function classifier; HMAC-signed budget report; CLI surfaces
|
|
21
|
+
* `mneme tools` with `--tier T` filter. AI agents always see the
|
|
22
|
+
* superset via MCP; "the catalog the AI sees ⊇ the catalog the user
|
|
23
|
+
* sees" — info drift goes to zero structurally.
|
|
24
|
+
*
|
|
25
|
+
* Honest scope:
|
|
26
|
+
* - 3 explicit family sets (STARTER_FAMILIES / STARTER_WHITELIST /
|
|
27
|
+
* EXPERIMENTAL_FAMILIES). The "v2.18+ pentads" tier (EXPLORER) is
|
|
28
|
+
* derived from a canonical V218_PLUS_FAMILIES set already used in
|
|
29
|
+
* v2.19.21 GAP CLOSER. Everything else falls to DEEP.
|
|
30
|
+
* - Tier is a HINT to the user, not a security boundary. AI agents
|
|
31
|
+
* can call ANY tier via MCP; the surface choice is presentation-only.
|
|
32
|
+
* - Composes onto v2.19.23 PROPRIOCEPTION (UnifiedCatalogEntry shape)
|
|
33
|
+
* + v2.19.21 KNOWN_LEGACY_TOP_LEVEL (CLI mount surface).
|
|
34
|
+
*/
|
|
35
|
+
import { createHmac, timingSafeEqual } from "node:crypto";
|
|
36
|
+
const PROTOCOL_VERSION = 1;
|
|
37
|
+
/**
|
|
38
|
+
* Curated essentials — first-time users meet Mneme through these.
|
|
39
|
+
* Hand-picked; small enough that beginners aren't overwhelmed.
|
|
40
|
+
*/
|
|
41
|
+
export const STARTER_WHITELIST = new Set([
|
|
42
|
+
// Core memory + retrieval
|
|
43
|
+
"mneme.status",
|
|
44
|
+
"mneme.ask",
|
|
45
|
+
"mneme.why",
|
|
46
|
+
"mneme.who_knows",
|
|
47
|
+
"mneme.index",
|
|
48
|
+
// Install + upgrade lifecycle
|
|
49
|
+
"mneme.system.upgrade",
|
|
50
|
+
"mneme.system.health",
|
|
51
|
+
"mneme.upgrade",
|
|
52
|
+
"mneme.doctor",
|
|
53
|
+
"mneme.init",
|
|
54
|
+
// Pulse + identity
|
|
55
|
+
"mneme.welcome",
|
|
56
|
+
"mneme.capabilities",
|
|
57
|
+
"mneme.intent.execute",
|
|
58
|
+
// What's new + smart dispatch
|
|
59
|
+
"mneme.whats_new",
|
|
60
|
+
"mneme.smart_do",
|
|
61
|
+
// Embedder + tier health
|
|
62
|
+
"mneme.embeddings.status",
|
|
63
|
+
"mneme.embeddings.upgrade",
|
|
64
|
+
// Antivirus (the highest-impact daily-use tools)
|
|
65
|
+
"mneme.antivirus.scan",
|
|
66
|
+
"mneme.antivirus.cure",
|
|
67
|
+
// LIMBIC organism health (the new front door)
|
|
68
|
+
"mneme.limbic.health",
|
|
69
|
+
"mneme.breath.stats",
|
|
70
|
+
// People diagnostics (high-value commit-history queries)
|
|
71
|
+
"mneme.atrophy",
|
|
72
|
+
"mneme.who_knows",
|
|
73
|
+
// Premortem (the answer to "is this safe to ship?")
|
|
74
|
+
"mneme.premortem",
|
|
75
|
+
// Tier discovery (this very command)
|
|
76
|
+
"mneme.tier.classify",
|
|
77
|
+
"mneme.tier.list_by_tier",
|
|
78
|
+
]);
|
|
79
|
+
/**
|
|
80
|
+
* Families that ALWAYS land in EXPLORER (v2.18+ pentads + organs).
|
|
81
|
+
* These are the "power-user / agent-integration" surface. Same set
|
|
82
|
+
* the v2.19.21 GAP CLOSER audited.
|
|
83
|
+
*/
|
|
84
|
+
export const EXPLORER_FAMILIES = new Set([
|
|
85
|
+
"arena", "badge", "oracle", "nexus",
|
|
86
|
+
"confessional", "ghost", "trinity", "insurance", "boomerang",
|
|
87
|
+
"evolution", "soul", "mcp_drift", "embedder",
|
|
88
|
+
"inverse", "intent", "dna", "chronostasis", "agreement",
|
|
89
|
+
"dream", "colony", "honey", "retroactive", "genetic",
|
|
90
|
+
"jackpot", "genome", "proof", "suggest",
|
|
91
|
+
"mortal", "muscle", "dialect", "brain", "chrysalis",
|
|
92
|
+
"snn", "negev", "dreams", "chimera", "consequence",
|
|
93
|
+
"truth", "federated", "reachability",
|
|
94
|
+
"caption", "inpaint", "rci", "provenance", "textron",
|
|
95
|
+
// v2.19.21+
|
|
96
|
+
"cli",
|
|
97
|
+
// v2.19.22
|
|
98
|
+
"reflex", "catalog",
|
|
99
|
+
// v2.19.23 LIMBIC organs
|
|
100
|
+
"breath", "thalamus", "proprioception", "spinal", "hippocampus", "hormonal", "limbic",
|
|
101
|
+
// v2.19.24
|
|
102
|
+
"tier", "event",
|
|
103
|
+
]);
|
|
104
|
+
/**
|
|
105
|
+
* EXPERIMENTAL — research / edge-case / opinionated tools. Often
|
|
106
|
+
* vendor-specific or single-purpose. Defaulted hidden from the
|
|
107
|
+
* starter view; AI can still call them.
|
|
108
|
+
*/
|
|
109
|
+
export const EXPERIMENTAL_FAMILIES = new Set([
|
|
110
|
+
"alien", "cf", "adversary", "mesh", "aletheia", "honeypot",
|
|
111
|
+
"court", "tribunal", "diaspora", "telepathy",
|
|
112
|
+
"abyss", "lattice", "neuron", "conduit", "synapse",
|
|
113
|
+
"osmosis", "aura", "relay", "chameleon", "anchor", "rainbow",
|
|
114
|
+
"permeate", "seamless", "ascension", "hyperscan", "precog", "sentinel",
|
|
115
|
+
"wormhole", "metron", "beacon", "nexus_lock",
|
|
116
|
+
]);
|
|
117
|
+
/**
|
|
118
|
+
* Classify a single tool name into one of 4 tiers. Deterministic.
|
|
119
|
+
*
|
|
120
|
+
* Rules (priority order):
|
|
121
|
+
* 1. STARTER_WHITELIST hit → starter
|
|
122
|
+
* 2. EXPERIMENTAL_FAMILIES hit → experimental
|
|
123
|
+
* 3. EXPLORER_FAMILIES hit → explorer
|
|
124
|
+
* 4. fallback → deep
|
|
125
|
+
*
|
|
126
|
+
* The fallback is deliberate: anything we haven't explicitly classified
|
|
127
|
+
* is treated as DEEP (advanced; not for first-time users). That way new
|
|
128
|
+
* tools default to advanced visibility, not noise.
|
|
129
|
+
*/
|
|
130
|
+
export function classifyTier(toolName) {
|
|
131
|
+
let tier;
|
|
132
|
+
let reason;
|
|
133
|
+
if (STARTER_WHITELIST.has(toolName)) {
|
|
134
|
+
tier = "starter";
|
|
135
|
+
reason = "starter_whitelist hit (curated for first-time users)";
|
|
136
|
+
}
|
|
137
|
+
else {
|
|
138
|
+
const parts = toolName.split(".");
|
|
139
|
+
const family = parts[1] ?? parts[0] ?? "";
|
|
140
|
+
if (EXPERIMENTAL_FAMILIES.has(family)) {
|
|
141
|
+
tier = "experimental";
|
|
142
|
+
reason = `family '${family}' in experimental set (research / edge-case)`;
|
|
143
|
+
}
|
|
144
|
+
else if (EXPLORER_FAMILIES.has(family)) {
|
|
145
|
+
tier = "explorer";
|
|
146
|
+
reason = `family '${family}' in explorer set (v2.18+ pentads + organs)`;
|
|
147
|
+
}
|
|
148
|
+
else {
|
|
149
|
+
tier = "deep";
|
|
150
|
+
reason = `family '${family}' not classified explicitly → DEEP fallback (advanced)`;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
return { v: PROTOCOL_VERSION, toolName, tier, reason };
|
|
154
|
+
}
|
|
155
|
+
function canon(v) {
|
|
156
|
+
if (v === null || typeof v !== "object")
|
|
157
|
+
return JSON.stringify(v);
|
|
158
|
+
if (Array.isArray(v))
|
|
159
|
+
return "[" + v.map(canon).join(",") + "]";
|
|
160
|
+
const keys = Object.keys(v).sort();
|
|
161
|
+
return "{" + keys.map((k) => JSON.stringify(k) + ":" + canon(v[k])).join(",") + "}";
|
|
162
|
+
}
|
|
163
|
+
function defaultSecret() {
|
|
164
|
+
return process.env["MNEME_TIER_SECRET"] || `mneme-tool-tier-v${PROTOCOL_VERSION}`;
|
|
165
|
+
}
|
|
166
|
+
function hmacHex(body, secret) {
|
|
167
|
+
return createHmac("sha256", secret).update(canon(body)).digest("hex");
|
|
168
|
+
}
|
|
169
|
+
function safeEqHex(a, b) {
|
|
170
|
+
try {
|
|
171
|
+
return timingSafeEqual(Buffer.from(a, "hex"), Buffer.from(b, "hex"));
|
|
172
|
+
}
|
|
173
|
+
catch {
|
|
174
|
+
return false;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Compute a HMAC-signed budget across all tools. Caller passes the
|
|
179
|
+
* full tool name list; we classify each and tally.
|
|
180
|
+
*/
|
|
181
|
+
export function computeTierBudget(input) {
|
|
182
|
+
let starter = 0, explorer = 0, deep = 0, experimental = 0;
|
|
183
|
+
for (const n of input.toolNames) {
|
|
184
|
+
const c = classifyTier(n);
|
|
185
|
+
if (c.tier === "starter")
|
|
186
|
+
starter++;
|
|
187
|
+
else if (c.tier === "explorer")
|
|
188
|
+
explorer++;
|
|
189
|
+
else if (c.tier === "deep")
|
|
190
|
+
deep++;
|
|
191
|
+
else
|
|
192
|
+
experimental++;
|
|
193
|
+
}
|
|
194
|
+
const body = {
|
|
195
|
+
v: PROTOCOL_VERSION,
|
|
196
|
+
totalTools: input.toolNames.length,
|
|
197
|
+
starter,
|
|
198
|
+
explorer,
|
|
199
|
+
deep,
|
|
200
|
+
experimental,
|
|
201
|
+
};
|
|
202
|
+
const sig = hmacHex(body, input.secret ?? defaultSecret());
|
|
203
|
+
return { ...body, sig };
|
|
204
|
+
}
|
|
205
|
+
export function verifyBudget(b, secret) {
|
|
206
|
+
const { sig, ...body } = b;
|
|
207
|
+
return safeEqHex(hmacHex(body, secret ?? defaultSecret()), sig);
|
|
208
|
+
}
|
|
209
|
+
/** Filter tool names by tier; preserves input order. */
|
|
210
|
+
export function listByTier(input) {
|
|
211
|
+
return input.toolNames.filter((n) => classifyTier(n).tier === input.tier);
|
|
212
|
+
}
|
|
213
|
+
export const TIER_BADGE = {
|
|
214
|
+
starter: "⭐⭐⭐",
|
|
215
|
+
explorer: "⭐⭐",
|
|
216
|
+
deep: "⭐",
|
|
217
|
+
experimental: "🔬",
|
|
218
|
+
};
|
|
219
|
+
export const TIER_LABEL = {
|
|
220
|
+
starter: "STARTER",
|
|
221
|
+
explorer: "EXPLORER",
|
|
222
|
+
deep: "DEEP",
|
|
223
|
+
experimental: "EXPERIMENTAL",
|
|
224
|
+
};
|
|
225
|
+
export function formatBudgetLine(b) {
|
|
226
|
+
return `🪞 TIER · ${b.totalTools} total · ⭐⭐⭐${b.starter} · ⭐⭐${b.explorer} · ⭐${b.deep} · 🔬${b.experimental}`;
|
|
227
|
+
}
|
|
228
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tool_tier/index.ts"],"names":[],"mappings":"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"}
|