@mneme-ai/core 2.19.22 → 2.19.24
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/autonomic_breath/autonomic_breath.test.d.ts +2 -0
- package/dist/autonomic_breath/autonomic_breath.test.d.ts.map +1 -0
- package/dist/autonomic_breath/autonomic_breath.test.js +140 -0
- package/dist/autonomic_breath/autonomic_breath.test.js.map +1 -0
- package/dist/autonomic_breath/index.d.ts +135 -0
- package/dist/autonomic_breath/index.d.ts.map +1 -0
- package/dist/autonomic_breath/index.js +180 -0
- package/dist/autonomic_breath/index.js.map +1 -0
- package/dist/cosmic/aurelian_v1923.test.d.ts +2 -0
- package/dist/cosmic/aurelian_v1923.test.d.ts.map +1 -0
- package/dist/cosmic/aurelian_v1923.test.js +90 -0
- package/dist/cosmic/aurelian_v1923.test.js.map +1 -0
- 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/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/hippocampus_dreams/hippocampus_dreams.test.d.ts +2 -0
- package/dist/hippocampus_dreams/hippocampus_dreams.test.d.ts.map +1 -0
- package/dist/hippocampus_dreams/hippocampus_dreams.test.js +106 -0
- package/dist/hippocampus_dreams/hippocampus_dreams.test.js.map +1 -0
- package/dist/hippocampus_dreams/index.d.ts +79 -0
- package/dist/hippocampus_dreams/index.d.ts.map +1 -0
- package/dist/hippocampus_dreams/index.js +122 -0
- package/dist/hippocampus_dreams/index.js.map +1 -0
- package/dist/hormonal/hormonal.test.d.ts +2 -0
- package/dist/hormonal/hormonal.test.d.ts.map +1 -0
- package/dist/hormonal/hormonal.test.js +116 -0
- package/dist/hormonal/hormonal.test.js.map +1 -0
- package/dist/hormonal/index.d.ts +105 -0
- package/dist/hormonal/index.d.ts.map +1 -0
- package/dist/hormonal/index.js +132 -0
- package/dist/hormonal/index.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -1
- package/dist/proprioception/index.d.ts +82 -0
- package/dist/proprioception/index.d.ts.map +1 -0
- package/dist/proprioception/index.js +170 -0
- package/dist/proprioception/index.js.map +1 -0
- package/dist/proprioception/proprioception.test.d.ts +2 -0
- package/dist/proprioception/proprioception.test.d.ts.map +1 -0
- package/dist/proprioception/proprioception.test.js +159 -0
- package/dist/proprioception/proprioception.test.js.map +1 -0
- package/dist/spinal_reflex/index.d.ts +86 -0
- package/dist/spinal_reflex/index.d.ts.map +1 -0
- package/dist/spinal_reflex/index.js +180 -0
- package/dist/spinal_reflex/index.js.map +1 -0
- package/dist/spinal_reflex/spinal_reflex.test.d.ts +2 -0
- package/dist/spinal_reflex/spinal_reflex.test.d.ts.map +1 -0
- package/dist/spinal_reflex/spinal_reflex.test.js +168 -0
- package/dist/spinal_reflex/spinal_reflex.test.js.map +1 -0
- package/dist/thalamus/index.d.ts +92 -0
- package/dist/thalamus/index.d.ts.map +1 -0
- package/dist/thalamus/index.js +95 -0
- package/dist/thalamus/index.js.map +1 -0
- package/dist/thalamus/thalamus.test.d.ts +2 -0
- package/dist/thalamus/thalamus.test.d.ts.map +1 -0
- package/dist/thalamus/thalamus.test.js +101 -0
- package/dist/thalamus/thalamus.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 +36 -0
- package/dist/wrapper_genesis/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
2
|
+
import { classifyEvent, routeEvent, formatRoute } from "./index.js";
|
|
3
|
+
const SECRET = "thalamus-test-secret-997744";
|
|
4
|
+
function evt(kind, ts = 1) {
|
|
5
|
+
return { v: 1, kind, context: {}, ts };
|
|
6
|
+
}
|
|
7
|
+
function ctx(over = {}) {
|
|
8
|
+
return { hasReflexCacheHit: false, daemonAlive: true, idleMs: 0, ...over };
|
|
9
|
+
}
|
|
10
|
+
describe("v2.19.23 THALAMUS · classifyEvent (deterministic routing)", () => {
|
|
11
|
+
it("daemon dead -> breath (highest priority)", () => {
|
|
12
|
+
const d = classifyEvent({ event: evt("tool_call"), context: ctx({ daemonAlive: false }), secret: SECRET });
|
|
13
|
+
expect(d.tier).toBe("breath");
|
|
14
|
+
expect(d.reason).toContain("daemon_dead");
|
|
15
|
+
});
|
|
16
|
+
it("daemon alive + cache hit -> reflex", () => {
|
|
17
|
+
const d = classifyEvent({ event: evt("tool_call"), context: ctx({ hasReflexCacheHit: true }), secret: SECRET });
|
|
18
|
+
expect(d.tier).toBe("reflex");
|
|
19
|
+
expect(d.reason).toContain("cache_hit");
|
|
20
|
+
});
|
|
21
|
+
it("daemon alive + no cache + active -> cortex (fallback)", () => {
|
|
22
|
+
const d = classifyEvent({ event: evt("tool_call"), context: ctx({ idleMs: 100 }), secret: SECRET });
|
|
23
|
+
expect(d.tier).toBe("cortex");
|
|
24
|
+
expect(d.reason).toContain("no_cache");
|
|
25
|
+
});
|
|
26
|
+
it("explicit idle_tick event -> dream regardless of idleMs", () => {
|
|
27
|
+
const d = classifyEvent({ event: evt("idle_tick"), context: ctx(), secret: SECRET });
|
|
28
|
+
expect(d.tier).toBe("dream");
|
|
29
|
+
expect(d.reason).toContain("idle");
|
|
30
|
+
});
|
|
31
|
+
it("idleMs > threshold -> dream", () => {
|
|
32
|
+
const d = classifyEvent({
|
|
33
|
+
event: evt("tool_call"),
|
|
34
|
+
context: ctx({ idleMs: 31 * 60 * 1000, dreamIdleThresholdMs: 30 * 60 * 1000 }),
|
|
35
|
+
secret: SECRET,
|
|
36
|
+
});
|
|
37
|
+
expect(d.tier).toBe("dream");
|
|
38
|
+
});
|
|
39
|
+
it("breath beats cache_hit beats dream beats cortex (priority order)", () => {
|
|
40
|
+
const allTriggers = ctx({ hasReflexCacheHit: true, idleMs: 9_999_999, daemonAlive: false });
|
|
41
|
+
expect(classifyEvent({ event: evt("idle_tick"), context: allTriggers, secret: SECRET }).tier).toBe("breath");
|
|
42
|
+
expect(classifyEvent({ event: evt("idle_tick"), context: { ...allTriggers, daemonAlive: true }, secret: SECRET }).tier).toBe("reflex");
|
|
43
|
+
expect(classifyEvent({ event: evt("idle_tick"), context: { ...allTriggers, daemonAlive: true, hasReflexCacheHit: false }, secret: SECRET }).tier).toBe("dream");
|
|
44
|
+
});
|
|
45
|
+
it("MEASURED 100% determinism: same input -> same HMAC sig (50 trials)", () => {
|
|
46
|
+
const input = { event: evt("tool_call", 42), context: ctx({ hasReflexCacheHit: true }), secret: SECRET };
|
|
47
|
+
const firstSig = classifyEvent(input).sig;
|
|
48
|
+
let allEqual = true;
|
|
49
|
+
for (let i = 0; i < 50; i++) {
|
|
50
|
+
if (classifyEvent(input).sig !== firstSig) {
|
|
51
|
+
allEqual = false;
|
|
52
|
+
break;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
expect(allEqual).toBe(true);
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
describe("v2.19.23 THALAMUS · routeEvent (dispatch)", () => {
|
|
59
|
+
function mkHandlers() {
|
|
60
|
+
const calls = { reflex: 0, cortex: 0, dream: 0, breath: 0 };
|
|
61
|
+
return {
|
|
62
|
+
handlers: {
|
|
63
|
+
reflex: async () => { calls["reflex"]++; return "reflex_result"; },
|
|
64
|
+
cortex: async () => { calls["cortex"]++; return "cortex_result"; },
|
|
65
|
+
dream: async () => { calls["dream"]++; return "dream_result"; },
|
|
66
|
+
breath: async () => { calls["breath"]++; return "breath_result"; },
|
|
67
|
+
},
|
|
68
|
+
calls,
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
it("routes to reflex handler on cache_hit", async () => {
|
|
72
|
+
const { handlers, calls } = mkHandlers();
|
|
73
|
+
const r = await routeEvent({ event: evt("tool_call"), context: ctx({ hasReflexCacheHit: true }), handlers, secret: SECRET });
|
|
74
|
+
expect(r.decision.tier).toBe("reflex");
|
|
75
|
+
expect(r.result).toBe("reflex_result");
|
|
76
|
+
expect(calls).toEqual({ reflex: 1, cortex: 0, dream: 0, breath: 0 });
|
|
77
|
+
});
|
|
78
|
+
it("routes to breath handler when daemon dead (highest priority)", async () => {
|
|
79
|
+
const { handlers, calls } = mkHandlers();
|
|
80
|
+
const r = await routeEvent({ event: evt("tool_call"), context: ctx({ daemonAlive: false, hasReflexCacheHit: true }), handlers, secret: SECRET });
|
|
81
|
+
expect(r.decision.tier).toBe("breath");
|
|
82
|
+
expect(r.result).toBe("breath_result");
|
|
83
|
+
expect(calls["breath"]).toBe(1);
|
|
84
|
+
expect(calls["reflex"]).toBe(0);
|
|
85
|
+
});
|
|
86
|
+
it("routes to dream handler on idle_tick", async () => {
|
|
87
|
+
const { handlers, calls } = mkHandlers();
|
|
88
|
+
const r = await routeEvent({ event: evt("idle_tick"), context: ctx(), handlers, secret: SECRET });
|
|
89
|
+
expect(r.decision.tier).toBe("dream");
|
|
90
|
+
expect(calls["dream"]).toBe(1);
|
|
91
|
+
});
|
|
92
|
+
});
|
|
93
|
+
describe("v2.19.23 THALAMUS · formatter", () => {
|
|
94
|
+
it("formatRoute uses ⚡/🧠/💤/🫁 per tier", () => {
|
|
95
|
+
expect(formatRoute({ v: 1, tier: "reflex", reason: "x", sig: "" })).toContain("⚡");
|
|
96
|
+
expect(formatRoute({ v: 1, tier: "cortex", reason: "x", sig: "" })).toContain("🧠");
|
|
97
|
+
expect(formatRoute({ v: 1, tier: "dream", reason: "x", sig: "" })).toContain("💤");
|
|
98
|
+
expect(formatRoute({ v: 1, tier: "breath", reason: "x", sig: "" })).toContain("🫁");
|
|
99
|
+
});
|
|
100
|
+
});
|
|
101
|
+
//# sourceMappingURL=thalamus.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"thalamus.test.js","sourceRoot":"","sources":["../../src/thalamus/thalamus.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,WAAW,EAA4D,MAAM,YAAY,CAAC;AAE9H,MAAM,MAAM,GAAG,6BAA6B,CAAC;AAE7C,SAAS,GAAG,CAAC,IAA2B,EAAE,EAAE,GAAG,CAAC;IAC9C,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;AACzC,CAAC;AAED,SAAS,GAAG,CAAC,OAA8B,EAAE;IAC3C,OAAO,EAAE,iBAAiB,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC;AAC7E,CAAC;AAED,QAAQ,CAAC,2DAA2D,EAAE,GAAG,EAAE;IACzE,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,MAAM,CAAC,GAAG,aAAa,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,WAAW,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;QAC3G,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC9B,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC5C,MAAM,CAAC,GAAG,aAAa,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,WAAW,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;QAChH,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC9B,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;QAC/D,MAAM,CAAC,GAAG,aAAa,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,WAAW,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;QACpG,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC9B,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;QAChE,MAAM,CAAC,GAAG,aAAa,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,WAAW,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;QACrF,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC7B,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACrC,MAAM,CAAC,GAAG,aAAa,CAAC;YACtB,KAAK,EAAE,GAAG,CAAC,WAAW,CAAC;YACvB,OAAO,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,oBAAoB,EAAE,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,CAAC;YAC9E,MAAM,EAAE,MAAM;SACf,CAAC,CAAC;QACH,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC/B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kEAAkE,EAAE,GAAG,EAAE;QAC1E,MAAM,WAAW,GAAG,GAAG,CAAC,EAAE,iBAAiB,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC;QAC5F,MAAM,CAAC,aAAa,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,WAAW,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC7G,MAAM,CAAC,aAAa,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,WAAW,CAAC,EAAE,OAAO,EAAE,EAAE,GAAG,WAAW,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACvI,MAAM,CAAC,aAAa,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,WAAW,CAAC,EAAE,OAAO,EAAE,EAAE,GAAG,WAAW,EAAE,WAAW,EAAE,IAAI,EAAE,iBAAiB,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAClK,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oEAAoE,EAAE,GAAG,EAAE;QAC5E,MAAM,KAAK,GAAG,EAAE,KAAK,EAAE,GAAG,CAAC,WAAW,EAAE,EAAE,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;QACzG,MAAM,QAAQ,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC;QAC1C,IAAI,QAAQ,GAAG,IAAI,CAAC;QACpB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;YAC5B,IAAI,aAAa,CAAC,KAAK,CAAC,CAAC,GAAG,KAAK,QAAQ,EAAE,CAAC;gBAAC,QAAQ,GAAG,KAAK,CAAC;gBAAC,MAAM;YAAC,CAAC;QACzE,CAAC;QACD,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,2CAA2C,EAAE,GAAG,EAAE;IACzD,SAAS,UAAU;QACjB,MAAM,KAAK,GAA2B,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;QACpF,OAAO;YACL,QAAQ,EAAE;gBACR,MAAM,EAAE,KAAK,IAAI,EAAE,GAAG,KAAK,CAAC,QAAQ,CAAE,EAAE,CAAC,CAAC,OAAO,eAAe,CAAC,CAAC,CAAC;gBACnE,MAAM,EAAE,KAAK,IAAI,EAAE,GAAG,KAAK,CAAC,QAAQ,CAAE,EAAE,CAAC,CAAC,OAAO,eAAe,CAAC,CAAC,CAAC;gBACnE,KAAK,EAAG,KAAK,IAAI,EAAE,GAAG,KAAK,CAAC,OAAO,CAAE,EAAE,CAAC,CAAE,OAAO,cAAc,CAAC,CAAC,CAAC;gBAClE,MAAM,EAAE,KAAK,IAAI,EAAE,GAAG,KAAK,CAAC,QAAQ,CAAE,EAAE,CAAC,CAAC,OAAO,eAAe,CAAC,CAAC,CAAC;aACpE;YACD,KAAK;SACN,CAAC;IACJ,CAAC;IAED,EAAE,CAAC,uCAAuC,EAAE,KAAK,IAAI,EAAE;QACrD,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,UAAU,EAAE,CAAC;QACzC,MAAM,CAAC,GAAG,MAAM,UAAU,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,WAAW,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;QAC7H,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACvC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QACvC,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;IACvE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8DAA8D,EAAE,KAAK,IAAI,EAAE;QAC5E,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,UAAU,EAAE,CAAC;QACzC,MAAM,CAAC,GAAG,MAAM,UAAU,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,WAAW,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,EAAE,WAAW,EAAE,KAAK,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;QACjJ,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACvC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QACvC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAChC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;QACpD,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,UAAU,EAAE,CAAC;QACzC,MAAM,CAAC,GAAG,MAAM,UAAU,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,WAAW,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;QAClG,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACtC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACjC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,+BAA+B,EAAE,GAAG,EAAE;IAC7C,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC9C,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QACnF,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QACpF,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QACnF,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IACtF,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -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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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool_tier.test.d.ts","sourceRoot":"","sources":["../../src/tool_tier/tool_tier.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
2
|
+
import { classifyTier, computeTierBudget, verifyBudget, listByTier, formatBudgetLine, TIER_BADGE, TIER_LABEL, } from "./index.js";
|
|
3
|
+
const SECRET = "tier-test-secret-997744";
|
|
4
|
+
describe("v2.19.24 TOOL TIER · classifyTier (deterministic)", () => {
|
|
5
|
+
it("STARTER_WHITELIST hit -> starter", () => {
|
|
6
|
+
expect(classifyTier("mneme.status").tier).toBe("starter");
|
|
7
|
+
expect(classifyTier("mneme.ask").tier).toBe("starter");
|
|
8
|
+
expect(classifyTier("mneme.limbic.health").tier).toBe("starter");
|
|
9
|
+
expect(classifyTier("mneme.tier.classify").tier).toBe("starter");
|
|
10
|
+
});
|
|
11
|
+
it("EXPERIMENTAL_FAMILIES hit -> experimental", () => {
|
|
12
|
+
expect(classifyTier("mneme.alien.template").tier).toBe("experimental");
|
|
13
|
+
expect(classifyTier("mneme.cf.simulate").tier).toBe("experimental");
|
|
14
|
+
expect(classifyTier("mneme.aletheia.gate").tier).toBe("experimental");
|
|
15
|
+
expect(classifyTier("mneme.honeypot.seed").tier).toBe("experimental");
|
|
16
|
+
});
|
|
17
|
+
it("EXPLORER_FAMILIES hit (v2.18+ pentads + organs) -> explorer", () => {
|
|
18
|
+
expect(classifyTier("mneme.arena.judge").tier).toBe("explorer");
|
|
19
|
+
expect(classifyTier("mneme.ghost.distill").tier).toBe("explorer");
|
|
20
|
+
expect(classifyTier("mneme.reflex.predict").tier).toBe("explorer");
|
|
21
|
+
expect(classifyTier("mneme.breath.decide").tier).toBe("explorer");
|
|
22
|
+
expect(classifyTier("mneme.hippocampus.consolidate").tier).toBe("explorer");
|
|
23
|
+
});
|
|
24
|
+
it("uncategorised family -> deep (advanced fallback)", () => {
|
|
25
|
+
expect(classifyTier("mneme.unrecognised_family.action").tier).toBe("deep");
|
|
26
|
+
expect(classifyTier("mneme.something.else").tier).toBe("deep");
|
|
27
|
+
});
|
|
28
|
+
it("STARTER beats EXPLORER beats EXPERIMENTAL beats DEEP (priority order)", () => {
|
|
29
|
+
// mneme.limbic.health is in starter whitelist; family 'limbic' is also explorer
|
|
30
|
+
expect(classifyTier("mneme.limbic.health").tier).toBe("starter");
|
|
31
|
+
// mneme.intent.execute is starter whitelist; family 'intent' is also explorer
|
|
32
|
+
expect(classifyTier("mneme.intent.execute").tier).toBe("starter");
|
|
33
|
+
});
|
|
34
|
+
it("MEASURED 100% determinism (50 trials on mixed tools)", () => {
|
|
35
|
+
const tools = [
|
|
36
|
+
"mneme.status", "mneme.alien.template", "mneme.arena.judge",
|
|
37
|
+
"mneme.unknown.x", "mneme.ghost.distill",
|
|
38
|
+
];
|
|
39
|
+
const firstResults = tools.map((t) => classifyTier(t).tier);
|
|
40
|
+
let allEqual = true;
|
|
41
|
+
for (let i = 0; i < 50; i++) {
|
|
42
|
+
const r = tools.map((t) => classifyTier(t).tier);
|
|
43
|
+
if (JSON.stringify(r) !== JSON.stringify(firstResults)) {
|
|
44
|
+
allEqual = false;
|
|
45
|
+
break;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
expect(allEqual).toBe(true);
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
describe("v2.19.24 TOOL TIER · computeTierBudget", () => {
|
|
52
|
+
it("counts each tier correctly", () => {
|
|
53
|
+
const b = computeTierBudget({
|
|
54
|
+
toolNames: [
|
|
55
|
+
"mneme.status", // starter
|
|
56
|
+
"mneme.ask", // starter
|
|
57
|
+
"mneme.arena.judge", // explorer
|
|
58
|
+
"mneme.ghost.distill", // explorer
|
|
59
|
+
"mneme.alien.template", // experimental
|
|
60
|
+
"mneme.unknown.x", // deep
|
|
61
|
+
],
|
|
62
|
+
secret: SECRET,
|
|
63
|
+
});
|
|
64
|
+
expect(b.totalTools).toBe(6);
|
|
65
|
+
expect(b.starter).toBe(2);
|
|
66
|
+
expect(b.explorer).toBe(2);
|
|
67
|
+
expect(b.experimental).toBe(1);
|
|
68
|
+
expect(b.deep).toBe(1);
|
|
69
|
+
expect(b.starter + b.explorer + b.deep + b.experimental).toBe(b.totalTools);
|
|
70
|
+
});
|
|
71
|
+
it("empty list -> all zero", () => {
|
|
72
|
+
const b = computeTierBudget({ toolNames: [], secret: SECRET });
|
|
73
|
+
expect(b.totalTools).toBe(0);
|
|
74
|
+
expect(b.starter).toBe(0);
|
|
75
|
+
expect(b.explorer).toBe(0);
|
|
76
|
+
expect(b.deep).toBe(0);
|
|
77
|
+
expect(b.experimental).toBe(0);
|
|
78
|
+
});
|
|
79
|
+
it("HMAC sig verifies on untampered; rejects tamper", () => {
|
|
80
|
+
const b = computeTierBudget({ toolNames: ["mneme.status"], secret: SECRET });
|
|
81
|
+
expect(verifyBudget(b, SECRET)).toBe(true);
|
|
82
|
+
const tampered = { ...b, starter: 999 };
|
|
83
|
+
expect(verifyBudget(tampered, SECRET)).toBe(false);
|
|
84
|
+
});
|
|
85
|
+
it("MEASURED 100% determinism: same input -> same sig (50 trials)", () => {
|
|
86
|
+
const input = { toolNames: ["mneme.status", "mneme.arena.judge", "mneme.unknown"], secret: SECRET };
|
|
87
|
+
const firstSig = computeTierBudget(input).sig;
|
|
88
|
+
let allEqual = true;
|
|
89
|
+
for (let i = 0; i < 50; i++) {
|
|
90
|
+
if (computeTierBudget(input).sig !== firstSig) {
|
|
91
|
+
allEqual = false;
|
|
92
|
+
break;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
expect(allEqual).toBe(true);
|
|
96
|
+
});
|
|
97
|
+
});
|
|
98
|
+
describe("v2.19.24 TOOL TIER · listByTier", () => {
|
|
99
|
+
it("filters to the requested tier; preserves input order", () => {
|
|
100
|
+
const tools = ["mneme.status", "mneme.arena.judge", "mneme.ask", "mneme.alien.x"];
|
|
101
|
+
expect(listByTier({ toolNames: tools, tier: "starter" })).toEqual(["mneme.status", "mneme.ask"]);
|
|
102
|
+
expect(listByTier({ toolNames: tools, tier: "explorer" })).toEqual(["mneme.arena.judge"]);
|
|
103
|
+
expect(listByTier({ toolNames: tools, tier: "experimental" })).toEqual(["mneme.alien.x"]);
|
|
104
|
+
});
|
|
105
|
+
it("returns empty when no tools match", () => {
|
|
106
|
+
expect(listByTier({ toolNames: ["mneme.status"], tier: "experimental" })).toEqual([]);
|
|
107
|
+
});
|
|
108
|
+
});
|
|
109
|
+
describe("v2.19.24 TOOL TIER · presentation constants", () => {
|
|
110
|
+
it("TIER_BADGE maps each tier to a visual badge", () => {
|
|
111
|
+
expect(TIER_BADGE.starter).toBe("⭐⭐⭐");
|
|
112
|
+
expect(TIER_BADGE.explorer).toBe("⭐⭐");
|
|
113
|
+
expect(TIER_BADGE.deep).toBe("⭐");
|
|
114
|
+
expect(TIER_BADGE.experimental).toBe("🔬");
|
|
115
|
+
});
|
|
116
|
+
it("TIER_LABEL upper-cases each tier", () => {
|
|
117
|
+
expect(TIER_LABEL.starter).toBe("STARTER");
|
|
118
|
+
expect(TIER_LABEL.experimental).toBe("EXPERIMENTAL");
|
|
119
|
+
});
|
|
120
|
+
it("formatBudgetLine includes all 4 tier counts", () => {
|
|
121
|
+
const b = computeTierBudget({
|
|
122
|
+
toolNames: ["mneme.status", "mneme.arena.judge", "mneme.unknown", "mneme.alien.x"],
|
|
123
|
+
secret: SECRET,
|
|
124
|
+
});
|
|
125
|
+
const line = formatBudgetLine(b);
|
|
126
|
+
expect(line).toContain("TIER");
|
|
127
|
+
expect(line).toContain("⭐⭐⭐1");
|
|
128
|
+
expect(line).toContain("⭐⭐1");
|
|
129
|
+
expect(line).toContain("⭐1");
|
|
130
|
+
expect(line).toContain("🔬1");
|
|
131
|
+
});
|
|
132
|
+
});
|
|
133
|
+
//# sourceMappingURL=tool_tier.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool_tier.test.js","sourceRoot":"","sources":["../../src/tool_tier/tool_tier.test.ts"],"names":[],"mappings":"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"}
|
package/dist/whats_new.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"whats_new.d.ts","sourceRoot":"","sources":["../src/whats_new.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAMH,MAAM,WAAW,iBAAiB;IAChC,6BAA6B;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,8BAA8B;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,6BAA6B;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,uEAAuE;IACvE,IAAI,EAAE,MAAM,CAAC;IACb,sDAAsD;IACtD,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,yEAAyE;IACzE,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AAED;;oCAEoC;AACpC,eAAO,MAAM,UAAU,EAAE,iBAAiB,
|
|
1
|
+
{"version":3,"file":"whats_new.d.ts","sourceRoot":"","sources":["../src/whats_new.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAMH,MAAM,WAAW,iBAAiB;IAChC,6BAA6B;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,8BAA8B;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,6BAA6B;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,uEAAuE;IACvE,IAAI,EAAE,MAAM,CAAC;IACb,sDAAsD;IACtD,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,yEAAyE;IACzE,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AAED;;oCAEoC;AACpC,eAAO,MAAM,UAAU,EAAE,iBAAiB,EA+VzC,CAAC;AAEF,MAAM,WAAW,cAAc;IAC7B,iCAAiC;IACjC,cAAc,EAAE,MAAM,CAAC;IACvB;kCAC8B;IAC9B,UAAU,EAAE,iBAAiB,EAAE,CAAC;IAChC,gEAAgE;IAChE,cAAc,EAAE,MAAM,CAAC;IACvB,2DAA2D;IAC3D,cAAc,EAAE,MAAM,CAAC;IACvB,2CAA2C;IAC3C,OAAO,EAAE,MAAM,CAAC;CACjB;AAoBD;sEACsE;AACtE,wBAAgB,WAAW,CAAC,IAAI,GAAE;IAAE,cAAc,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAA2B,GAAG,cAAc,CAkB5I;AAED;yEACyE;AACzE,wBAAgB,uBAAuB,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAwB3E"}
|