@mneme-ai/core 2.19.21 → 2.19.23
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/catalog_parity/catalog_parity.test.d.ts +2 -0
- package/dist/catalog_parity/catalog_parity.test.d.ts.map +1 -0
- package/dist/catalog_parity/catalog_parity.test.js +104 -0
- package/dist/catalog_parity/catalog_parity.test.js.map +1 -0
- package/dist/catalog_parity/index.d.ts +69 -0
- package/dist/catalog_parity/index.d.ts.map +1 -0
- package/dist/catalog_parity/index.js +118 -0
- package/dist/catalog_parity/index.js.map +1 -0
- package/dist/cosmic/aurelian_v1922.test.d.ts +2 -0
- package/dist/cosmic/aurelian_v1922.test.d.ts.map +1 -0
- package/dist/cosmic/aurelian_v1922.test.js +48 -0
- package/dist/cosmic/aurelian_v1922.test.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 +89 -0
- package/dist/cosmic/aurelian_v1923.test.js.map +1 -0
- package/dist/dynamic/pack-schema.d.ts +14 -14
- 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 +9 -0
- package/dist/index.js.map +1 -1
- package/dist/periodic/periodic.test.js +1 -1
- package/dist/periodic/periodic.test.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/reflex/index.d.ts +210 -0
- package/dist/reflex/index.d.ts.map +1 -0
- package/dist/reflex/index.js +298 -0
- package/dist/reflex/index.js.map +1 -0
- package/dist/reflex/reflex.test.d.ts +2 -0
- package/dist/reflex/reflex.test.d.ts.map +1 -0
- package/dist/reflex/reflex.test.js +379 -0
- package/dist/reflex/reflex.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/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 +41 -0
- package/dist/wrapper_genesis/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v2.19.23 — MNEME SPINAL REFLEX (organ #4 of LIMBIC · G3+G4 killer)
|
|
3
|
+
*
|
|
4
|
+
* "100 functions vs <10 used auto — bug prophet, consequence ledger,
|
|
5
|
+
* dream cycle, negev token-tax — มีแต่ไม่หมุน. user ต้องคิดเองว่า
|
|
6
|
+
* จะเรียก tool ไหนเมื่อไหร่."
|
|
7
|
+
* — user audit, 2026-05-17
|
|
8
|
+
*
|
|
9
|
+
* Diagnosis: v2.19.22 REFLEX predicts top-N tools by FREQUENCY only.
|
|
10
|
+
* First-day users have zero frequency data → predictions are empty →
|
|
11
|
+
* 90 features stay idle until manually invoked.
|
|
12
|
+
*
|
|
13
|
+
* Fix: BUILTIN RULES ship domain knowledge from day zero. Each rule
|
|
14
|
+
* matches an event signature and proposes a high-priority follow-up
|
|
15
|
+
* tool (with confidence). At prediction time, frequency confidence
|
|
16
|
+
* gets BLENDED with rule confidence so cold-start has actual top-N.
|
|
17
|
+
*
|
|
18
|
+
* Composes onto v2.19.22 REFLEX (Prediction interface, eventCacheKey)
|
|
19
|
+
* + v2.19.10 REVERSE-WRAPPER BUILTIN_RULES pattern (proven).
|
|
20
|
+
*
|
|
21
|
+
* Honest scope:
|
|
22
|
+
* - 8 BUILTIN_RULES ship now; caller can register more.
|
|
23
|
+
* - Rule confidence is a STATIC PRIOR (0.30..0.80); frequency confidence
|
|
24
|
+
* is the OBSERVED posterior. Final = blend(prior, posterior).
|
|
25
|
+
* - When frequency data is rich (>= 5 obs for same event sig),
|
|
26
|
+
* posterior dominates (weight 0.8); when sparse, prior dominates.
|
|
27
|
+
* - PURE FUNCTION; deterministic; composes with REFLEX predictor.
|
|
28
|
+
*/
|
|
29
|
+
const PROTOCOL_VERSION = 1;
|
|
30
|
+
const RICH_OBSERVATION_THRESHOLD = 5;
|
|
31
|
+
const POSTERIOR_WEIGHT_WHEN_RICH = 0.8;
|
|
32
|
+
const POSTERIOR_WEIGHT_WHEN_SPARSE = 0.3;
|
|
33
|
+
/**
|
|
34
|
+
* 8 built-in rules that turn cold-start REFLEX into a useful pre-execution
|
|
35
|
+
* layer from day one. Drawn from common AI-agent workflows on a repo.
|
|
36
|
+
*/
|
|
37
|
+
export const BUILTIN_RULES = [
|
|
38
|
+
{
|
|
39
|
+
id: "git_commit_then_why",
|
|
40
|
+
eventKind: "git_commit",
|
|
41
|
+
toolName: "mneme.ask",
|
|
42
|
+
argsTemplate: { question: "what just changed and why" },
|
|
43
|
+
priorConfidence: 0.7,
|
|
44
|
+
reason: "After every commit, agents commonly ask what changed",
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
id: "git_commit_then_atrophy",
|
|
48
|
+
eventKind: "git_commit",
|
|
49
|
+
toolName: "mneme.consequence.record",
|
|
50
|
+
argsTemplate: { cmd: "git commit", repoStateBefore: {} },
|
|
51
|
+
priorConfidence: 0.55,
|
|
52
|
+
reason: "Every commit is a data point for CONSEQUENCE ledger",
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
id: "file_save_then_ask",
|
|
56
|
+
eventKind: "file_save",
|
|
57
|
+
toolName: "mneme.ask",
|
|
58
|
+
argsTemplate: { question: "is this file consistent with the rest of the repo" },
|
|
59
|
+
priorConfidence: 0.4,
|
|
60
|
+
reason: "Saving a file often precedes a 'is this OK' question",
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
id: "file_save_ts_then_premortem",
|
|
64
|
+
eventKind: "file_save",
|
|
65
|
+
contextPredicate: (c) => typeof c["path"] === "string" && /\.(ts|tsx)$/.test(c["path"]),
|
|
66
|
+
toolName: "mneme.premortem",
|
|
67
|
+
argsTemplate: { change: "edited TS file" },
|
|
68
|
+
priorConfidence: 0.45,
|
|
69
|
+
reason: "TS edits commonly trigger 'will this regress' inspection",
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
id: "terminal_npm_install_then_deps",
|
|
73
|
+
eventKind: "terminal_command",
|
|
74
|
+
contextPredicate: (c) => typeof c["command"] === "string" && c["command"].startsWith("npm install"),
|
|
75
|
+
toolName: "mneme.deps.oracle",
|
|
76
|
+
argsTemplate: {},
|
|
77
|
+
priorConfidence: 0.6,
|
|
78
|
+
reason: "npm install -> predict dep fate via DEPS ORACLE",
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
id: "user_chat_authentic_then_caption_sever",
|
|
82
|
+
eventKind: "user_chat",
|
|
83
|
+
contextPredicate: (c) => {
|
|
84
|
+
const p = String(c["prompt"] ?? "").toLowerCase();
|
|
85
|
+
return p.includes("authentic") || p.includes("real or fake") || p.includes("ตรวจของแท้");
|
|
86
|
+
},
|
|
87
|
+
toolName: "mneme.caption.sever",
|
|
88
|
+
argsTemplate: {},
|
|
89
|
+
priorConfidence: 0.8,
|
|
90
|
+
reason: "Authenticity query on image -> v2.19.18 CAPTION SEVERANCE",
|
|
91
|
+
},
|
|
92
|
+
{
|
|
93
|
+
id: "tool_call_then_proof_attach",
|
|
94
|
+
eventKind: "tool_call",
|
|
95
|
+
toolName: "mneme.proof.attach",
|
|
96
|
+
argsTemplate: {},
|
|
97
|
+
priorConfidence: 0.3,
|
|
98
|
+
reason: "Any tool call may need v2.19.10 PROOF-CARRYING certificate",
|
|
99
|
+
},
|
|
100
|
+
{
|
|
101
|
+
id: "user_chat_what_changed_then_status",
|
|
102
|
+
eventKind: "user_chat",
|
|
103
|
+
contextPredicate: (c) => {
|
|
104
|
+
const p = String(c["prompt"] ?? "").toLowerCase();
|
|
105
|
+
return p.includes("what changed") || p.includes("repo status") || p.includes("มีอะไรใหม่");
|
|
106
|
+
},
|
|
107
|
+
toolName: "mneme.status",
|
|
108
|
+
argsTemplate: {},
|
|
109
|
+
priorConfidence: 0.75,
|
|
110
|
+
reason: "Status query -> mneme status",
|
|
111
|
+
},
|
|
112
|
+
];
|
|
113
|
+
function blendConfidence(prior, posterior, sampleCount) {
|
|
114
|
+
if (prior === null && posterior === null)
|
|
115
|
+
return 0;
|
|
116
|
+
if (prior === null)
|
|
117
|
+
return posterior;
|
|
118
|
+
if (posterior === null)
|
|
119
|
+
return prior;
|
|
120
|
+
const w = sampleCount >= RICH_OBSERVATION_THRESHOLD ? POSTERIOR_WEIGHT_WHEN_RICH : POSTERIOR_WEIGHT_WHEN_SPARSE;
|
|
121
|
+
return w * posterior + (1 - w) * prior;
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Blend built-in rule priors with frequency-observed posteriors.
|
|
125
|
+
* Returns top-N predictions; cold-start works because rules ship priors.
|
|
126
|
+
*/
|
|
127
|
+
export function blendPredictions(input) {
|
|
128
|
+
const rules = input.rules ?? BUILTIN_RULES;
|
|
129
|
+
const topN = input.topN ?? 3;
|
|
130
|
+
// Index observations by toolName
|
|
131
|
+
const obsByTool = new Map(input.observations.map((o) => [o.toolName, o]));
|
|
132
|
+
// Filter rules matching event kind + (optional) context predicate
|
|
133
|
+
const matchingRules = rules.filter((r) => {
|
|
134
|
+
if (r.eventKind !== input.eventKind)
|
|
135
|
+
return false;
|
|
136
|
+
if (r.contextPredicate && !r.contextPredicate(input.context))
|
|
137
|
+
return false;
|
|
138
|
+
return true;
|
|
139
|
+
});
|
|
140
|
+
const rulesByTool = new Map(matchingRules.map((r) => [r.toolName, r]));
|
|
141
|
+
// Union the toolNames
|
|
142
|
+
const allTools = new Set([...obsByTool.keys(), ...rulesByTool.keys()]);
|
|
143
|
+
const blended = [];
|
|
144
|
+
for (const toolName of allTools) {
|
|
145
|
+
const obs = obsByTool.get(toolName);
|
|
146
|
+
const rule = rulesByTool.get(toolName);
|
|
147
|
+
const prior = rule ? rule.priorConfidence : null;
|
|
148
|
+
const posterior = obs ? obs.confidence : null;
|
|
149
|
+
const sampleCount = obs?.sampleCount ?? 0;
|
|
150
|
+
const confidence = blendConfidence(prior, posterior, sampleCount);
|
|
151
|
+
let source;
|
|
152
|
+
if (rule && obs)
|
|
153
|
+
source = "blended";
|
|
154
|
+
else if (rule)
|
|
155
|
+
source = "rule_only";
|
|
156
|
+
else
|
|
157
|
+
source = "observation_only";
|
|
158
|
+
blended.push({
|
|
159
|
+
toolName,
|
|
160
|
+
argsTemplate: obs?.argsTemplate ?? rule.argsTemplate,
|
|
161
|
+
confidence,
|
|
162
|
+
source,
|
|
163
|
+
priorConfidence: prior,
|
|
164
|
+
posteriorConfidence: posterior,
|
|
165
|
+
sampleCount,
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
return blended
|
|
169
|
+
.sort((a, b) => b.confidence - a.confidence || a.toolName.localeCompare(b.toolName))
|
|
170
|
+
.slice(0, topN);
|
|
171
|
+
}
|
|
172
|
+
export function formatBlendLine(p) {
|
|
173
|
+
const conf = (p.confidence * 100).toFixed(0);
|
|
174
|
+
return `⚡ ${p.toolName} · ${conf}% (${p.source}, n=${p.sampleCount})`;
|
|
175
|
+
}
|
|
176
|
+
export function listBuiltinRules() {
|
|
177
|
+
return [...BUILTIN_RULES];
|
|
178
|
+
}
|
|
179
|
+
export const _PROTOCOL_VERSION = PROTOCOL_VERSION;
|
|
180
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/spinal_reflex/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spinal_reflex.test.d.ts","sourceRoot":"","sources":["../../src/spinal_reflex/spinal_reflex.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
2
|
+
import { blendPredictions, BUILTIN_RULES, listBuiltinRules, formatBlendLine } from "./index.js";
|
|
3
|
+
describe("v2.19.23 SPINAL REFLEX · BUILTIN_RULES (cold-start prior)", () => {
|
|
4
|
+
it("ships 8 default rules covering common event kinds", () => {
|
|
5
|
+
expect(BUILTIN_RULES.length).toBe(8);
|
|
6
|
+
const kinds = new Set(BUILTIN_RULES.map((r) => r.eventKind));
|
|
7
|
+
expect(kinds.has("git_commit")).toBe(true);
|
|
8
|
+
expect(kinds.has("file_save")).toBe(true);
|
|
9
|
+
expect(kinds.has("terminal_command")).toBe(true);
|
|
10
|
+
expect(kinds.has("user_chat")).toBe(true);
|
|
11
|
+
expect(kinds.has("tool_call")).toBe(true);
|
|
12
|
+
});
|
|
13
|
+
it("every rule has unique id + valid prior 0..1", () => {
|
|
14
|
+
const ids = new Set(BUILTIN_RULES.map((r) => r.id));
|
|
15
|
+
expect(ids.size).toBe(BUILTIN_RULES.length);
|
|
16
|
+
for (const r of BUILTIN_RULES) {
|
|
17
|
+
expect(r.priorConfidence).toBeGreaterThanOrEqual(0);
|
|
18
|
+
expect(r.priorConfidence).toBeLessThanOrEqual(1);
|
|
19
|
+
}
|
|
20
|
+
});
|
|
21
|
+
it("listBuiltinRules returns a copy (mutation-safe)", () => {
|
|
22
|
+
const a = listBuiltinRules();
|
|
23
|
+
a.pop();
|
|
24
|
+
expect(BUILTIN_RULES.length).toBe(8);
|
|
25
|
+
});
|
|
26
|
+
});
|
|
27
|
+
describe("v2.19.23 SPINAL REFLEX · blendPredictions (cold-start works)", () => {
|
|
28
|
+
it("zero observations -> matching rules supply predictions (cold-start)", () => {
|
|
29
|
+
const p = blendPredictions({
|
|
30
|
+
eventKind: "git_commit",
|
|
31
|
+
context: { sha: "abc" },
|
|
32
|
+
observations: [],
|
|
33
|
+
topN: 5,
|
|
34
|
+
});
|
|
35
|
+
expect(p.length).toBeGreaterThan(0);
|
|
36
|
+
for (const x of p) {
|
|
37
|
+
expect(x.source).toBe("rule_only");
|
|
38
|
+
expect(x.posteriorConfidence).toBeNull();
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
it("zero rules + observations -> observation_only predictions", () => {
|
|
42
|
+
const p = blendPredictions({
|
|
43
|
+
eventKind: "git_commit",
|
|
44
|
+
context: {},
|
|
45
|
+
observations: [{ toolName: "mneme.custom", argsTemplate: {}, confidence: 0.5, sampleCount: 10 }],
|
|
46
|
+
rules: [], // no rules at all
|
|
47
|
+
});
|
|
48
|
+
expect(p[0].source).toBe("observation_only");
|
|
49
|
+
expect(p[0].priorConfidence).toBeNull();
|
|
50
|
+
expect(p[0].posteriorConfidence).toBe(0.5);
|
|
51
|
+
});
|
|
52
|
+
it("rule + observation -> blended source", () => {
|
|
53
|
+
const p = blendPredictions({
|
|
54
|
+
eventKind: "git_commit",
|
|
55
|
+
context: {},
|
|
56
|
+
observations: [{ toolName: "mneme.ask", argsTemplate: {}, confidence: 0.9, sampleCount: 10 }],
|
|
57
|
+
});
|
|
58
|
+
const ask = p.find((x) => x.toolName === "mneme.ask");
|
|
59
|
+
expect(ask.source).toBe("blended");
|
|
60
|
+
expect(ask.priorConfidence).toBe(0.7); // git_commit_then_why prior
|
|
61
|
+
expect(ask.posteriorConfidence).toBe(0.9);
|
|
62
|
+
// sample >= 5 -> posterior weight 0.8: 0.8*0.9 + 0.2*0.7 = 0.86
|
|
63
|
+
expect(ask.confidence).toBeCloseTo(0.86, 5);
|
|
64
|
+
});
|
|
65
|
+
it("sparse observations (n<5) -> prior dominates (weight 0.3 posterior)", () => {
|
|
66
|
+
const p = blendPredictions({
|
|
67
|
+
eventKind: "git_commit",
|
|
68
|
+
context: {},
|
|
69
|
+
observations: [{ toolName: "mneme.ask", argsTemplate: {}, confidence: 0.9, sampleCount: 2 }],
|
|
70
|
+
});
|
|
71
|
+
const ask = p.find((x) => x.toolName === "mneme.ask");
|
|
72
|
+
// sample 2 < 5 -> posterior weight 0.3: 0.3*0.9 + 0.7*0.7 = 0.76
|
|
73
|
+
expect(ask.confidence).toBeCloseTo(0.76, 5);
|
|
74
|
+
});
|
|
75
|
+
it("contextPredicate filters rules (TS file_save -> premortem fires; py file_save -> not)", () => {
|
|
76
|
+
const tsPredictions = blendPredictions({
|
|
77
|
+
eventKind: "file_save",
|
|
78
|
+
context: { path: "src/foo.ts" },
|
|
79
|
+
observations: [],
|
|
80
|
+
topN: 10,
|
|
81
|
+
});
|
|
82
|
+
const tsHasPremortem = tsPredictions.some((x) => x.toolName === "mneme.premortem");
|
|
83
|
+
expect(tsHasPremortem).toBe(true);
|
|
84
|
+
const pyPredictions = blendPredictions({
|
|
85
|
+
eventKind: "file_save",
|
|
86
|
+
context: { path: "src/foo.py" },
|
|
87
|
+
observations: [],
|
|
88
|
+
topN: 10,
|
|
89
|
+
});
|
|
90
|
+
const pyHasPremortem = pyPredictions.some((x) => x.toolName === "mneme.premortem");
|
|
91
|
+
expect(pyHasPremortem).toBe(false);
|
|
92
|
+
});
|
|
93
|
+
it("Thai 'ตรวจของแท้' triggers CAPTION SEVERANCE rule (multi-lingual)", () => {
|
|
94
|
+
const p = blendPredictions({
|
|
95
|
+
eventKind: "user_chat",
|
|
96
|
+
context: { prompt: "ตรวจของแท้" },
|
|
97
|
+
observations: [],
|
|
98
|
+
topN: 10,
|
|
99
|
+
});
|
|
100
|
+
const hasCaption = p.some((x) => x.toolName === "mneme.caption.sever");
|
|
101
|
+
expect(hasCaption).toBe(true);
|
|
102
|
+
});
|
|
103
|
+
it("top-N respected; sorted by confidence desc", () => {
|
|
104
|
+
const p = blendPredictions({
|
|
105
|
+
eventKind: "git_commit",
|
|
106
|
+
context: {},
|
|
107
|
+
observations: [{ toolName: "mneme.ask", argsTemplate: {}, confidence: 0.99, sampleCount: 100 }],
|
|
108
|
+
topN: 2,
|
|
109
|
+
});
|
|
110
|
+
expect(p.length).toBe(2);
|
|
111
|
+
for (let i = 1; i < p.length; i++) {
|
|
112
|
+
expect(p[i - 1].confidence).toBeGreaterThanOrEqual(p[i].confidence);
|
|
113
|
+
}
|
|
114
|
+
});
|
|
115
|
+
it("MEASURED 100% determinism: same input -> same output (20 trials)", () => {
|
|
116
|
+
const input = {
|
|
117
|
+
eventKind: "git_commit",
|
|
118
|
+
context: { sha: "deadbeef" },
|
|
119
|
+
observations: [{ toolName: "mneme.ask", argsTemplate: {}, confidence: 0.6, sampleCount: 7 }],
|
|
120
|
+
};
|
|
121
|
+
const first = JSON.stringify(blendPredictions(input));
|
|
122
|
+
let allEqual = true;
|
|
123
|
+
for (let i = 0; i < 20; i++) {
|
|
124
|
+
if (JSON.stringify(blendPredictions(input)) !== first) {
|
|
125
|
+
allEqual = false;
|
|
126
|
+
break;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
expect(allEqual).toBe(true);
|
|
130
|
+
});
|
|
131
|
+
it("custom rules can be passed; replaces BUILTIN_RULES", () => {
|
|
132
|
+
const customRules = [{
|
|
133
|
+
id: "custom_x",
|
|
134
|
+
eventKind: "git_commit",
|
|
135
|
+
toolName: "custom.tool",
|
|
136
|
+
argsTemplate: {},
|
|
137
|
+
priorConfidence: 0.5,
|
|
138
|
+
reason: "custom",
|
|
139
|
+
}];
|
|
140
|
+
const p = blendPredictions({
|
|
141
|
+
eventKind: "git_commit",
|
|
142
|
+
context: {},
|
|
143
|
+
observations: [],
|
|
144
|
+
rules: customRules,
|
|
145
|
+
topN: 10,
|
|
146
|
+
});
|
|
147
|
+
expect(p.length).toBe(1);
|
|
148
|
+
expect(p[0].toolName).toBe("custom.tool");
|
|
149
|
+
});
|
|
150
|
+
});
|
|
151
|
+
describe("v2.19.23 SPINAL REFLEX · formatter", () => {
|
|
152
|
+
it("formatBlendLine includes tool, conf%, source, sample count", () => {
|
|
153
|
+
const line = formatBlendLine({
|
|
154
|
+
toolName: "mneme.ask",
|
|
155
|
+
argsTemplate: {},
|
|
156
|
+
confidence: 0.86,
|
|
157
|
+
source: "blended",
|
|
158
|
+
priorConfidence: 0.7,
|
|
159
|
+
posteriorConfidence: 0.9,
|
|
160
|
+
sampleCount: 10,
|
|
161
|
+
});
|
|
162
|
+
expect(line).toContain("mneme.ask");
|
|
163
|
+
expect(line).toContain("86%");
|
|
164
|
+
expect(line).toContain("blended");
|
|
165
|
+
expect(line).toContain("n=10");
|
|
166
|
+
});
|
|
167
|
+
});
|
|
168
|
+
//# sourceMappingURL=spinal_reflex.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spinal_reflex.test.js","sourceRoot":"","sources":["../../src/spinal_reflex/spinal_reflex.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v2.19.23 — MNEME THALAMUS (organ #2 of LIMBIC) · sensory router
|
|
3
|
+
*
|
|
4
|
+
* "event → tier → route ไปสมองส่วนที่เหมาะสม"
|
|
5
|
+
*
|
|
6
|
+
* Diagnosis: REFLEX, DREAMS, CORTEX, BREATH all exist as separate
|
|
7
|
+
* organs. Without a router, the daemon has to manually decide which
|
|
8
|
+
* organ handles each event. That's the same 'cortex thinks too much'
|
|
9
|
+
* bug REFLEX was meant to fix.
|
|
10
|
+
*
|
|
11
|
+
* Fix: THALAMUS classifies every event into one of 4 tiers, then
|
|
12
|
+
* routes to the matching organ's handler. Caller supplies the
|
|
13
|
+
* handlers (vendor-agnostic); THALAMUS only decides + dispatches.
|
|
14
|
+
*
|
|
15
|
+
* Tiers:
|
|
16
|
+
* - "reflex" — event has a cached REFLEX entry; return instant
|
|
17
|
+
* - "cortex" — event needs synchronous tool call (normal MCP path)
|
|
18
|
+
* - "dream" — system is idle; defer to background consolidation
|
|
19
|
+
* - "breath" — daemon dead; respawn first, then escalate
|
|
20
|
+
*
|
|
21
|
+
* Composes onto:
|
|
22
|
+
* - v2.19.22 REFLEX (cache HIT short-circuits)
|
|
23
|
+
* - v2.19.23 BREATH (daemon-dead triggers respawn)
|
|
24
|
+
* - v2.19.14 DREAMS (idle period triggers consolidation)
|
|
25
|
+
* - v2.19.16 FEDERATED (when remote attestations needed, route via cortex)
|
|
26
|
+
*
|
|
27
|
+
* Honest scope:
|
|
28
|
+
* - PURE FUNCTION classifier. Handlers are caller-supplied async fns.
|
|
29
|
+
* - Routes by RULE, not by ML. Deterministic; auditable.
|
|
30
|
+
* - No fallback CASCADE; explicit tier per event. Caller picks.
|
|
31
|
+
*/
|
|
32
|
+
declare const PROTOCOL_VERSION: 1;
|
|
33
|
+
export type ThalamusTier = "reflex" | "cortex" | "dream" | "breath";
|
|
34
|
+
export interface ThalamusEvent {
|
|
35
|
+
v: typeof PROTOCOL_VERSION;
|
|
36
|
+
kind: "tool_call" | "file_save" | "git_commit" | "terminal_command" | "user_chat" | "idle_tick" | "daemon_health";
|
|
37
|
+
context: Record<string, unknown>;
|
|
38
|
+
ts: number;
|
|
39
|
+
}
|
|
40
|
+
export interface RouteContext {
|
|
41
|
+
/** Caller signals: is there a fresh cache entry for this event? */
|
|
42
|
+
hasReflexCacheHit: boolean;
|
|
43
|
+
/** Caller signals: daemon PID file present + alive? */
|
|
44
|
+
daemonAlive: boolean;
|
|
45
|
+
/** Caller signals: how long since last user activity, in ms. */
|
|
46
|
+
idleMs: number;
|
|
47
|
+
/** Threshold for "idle enough to dream". Default 30min. */
|
|
48
|
+
dreamIdleThresholdMs?: number;
|
|
49
|
+
}
|
|
50
|
+
export interface RouteDecision {
|
|
51
|
+
v: typeof PROTOCOL_VERSION;
|
|
52
|
+
tier: ThalamusTier;
|
|
53
|
+
reason: string;
|
|
54
|
+
/** HMAC sig for audit. */
|
|
55
|
+
sig: string;
|
|
56
|
+
}
|
|
57
|
+
export interface TierHandlers<T> {
|
|
58
|
+
reflex: (event: ThalamusEvent) => Promise<T>;
|
|
59
|
+
cortex: (event: ThalamusEvent) => Promise<T>;
|
|
60
|
+
dream: (event: ThalamusEvent) => Promise<T>;
|
|
61
|
+
breath: (event: ThalamusEvent) => Promise<T>;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Classify an event into one of 4 tiers.
|
|
65
|
+
*
|
|
66
|
+
* Rules (in priority order):
|
|
67
|
+
* 1. daemon dead → breath (highest; everything else needs daemon)
|
|
68
|
+
* 2. cache hit → reflex (instant return; cheapest path)
|
|
69
|
+
* 3. idle_tick or idleMs > threshold → dream (background work)
|
|
70
|
+
* 4. fallback → cortex (synchronous tool call)
|
|
71
|
+
*/
|
|
72
|
+
export declare function classifyEvent(input: {
|
|
73
|
+
event: ThalamusEvent;
|
|
74
|
+
context: RouteContext;
|
|
75
|
+
secret?: string;
|
|
76
|
+
}): RouteDecision;
|
|
77
|
+
/**
|
|
78
|
+
* Dispatch event to the chosen tier's handler. Returns the handler's
|
|
79
|
+
* Promise unchanged. Pure orchestration; caller owns the handlers.
|
|
80
|
+
*/
|
|
81
|
+
export declare function routeEvent<T>(input: {
|
|
82
|
+
event: ThalamusEvent;
|
|
83
|
+
context: RouteContext;
|
|
84
|
+
handlers: TierHandlers<T>;
|
|
85
|
+
secret?: string;
|
|
86
|
+
}): Promise<{
|
|
87
|
+
decision: RouteDecision;
|
|
88
|
+
result: T;
|
|
89
|
+
}>;
|
|
90
|
+
export declare function formatRoute(d: RouteDecision): string;
|
|
91
|
+
export {};
|
|
92
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/thalamus/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAIH,QAAA,MAAM,gBAAgB,EAAG,CAAU,CAAC;AAEpC,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,CAAC;AAEpE,MAAM,WAAW,aAAa;IAC5B,CAAC,EAAE,OAAO,gBAAgB,CAAC;IAC3B,IAAI,EAAE,WAAW,GAAG,WAAW,GAAG,YAAY,GAAG,kBAAkB,GAAG,WAAW,GAAG,WAAW,GAAG,eAAe,CAAC;IAClH,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,YAAY;IAC3B,mEAAmE;IACnE,iBAAiB,EAAE,OAAO,CAAC;IAC3B,uDAAuD;IACvD,WAAW,EAAE,OAAO,CAAC;IACrB,gEAAgE;IAChE,MAAM,EAAE,MAAM,CAAC;IACf,2DAA2D;IAC3D,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,WAAW,aAAa;IAC5B,CAAC,EAAE,OAAO,gBAAgB,CAAC;IAC3B,IAAI,EAAE,YAAY,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,0BAA0B;IAC1B,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,YAAY,CAAC,CAAC;IAC7B,MAAM,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC;IAC7C,MAAM,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC;IAC7C,KAAK,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC;IAC5C,MAAM,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC;CAC9C;AAiBD;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE;IACnC,KAAK,EAAE,aAAa,CAAC;IACrB,OAAO,EAAE,YAAY,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GAAG,aAAa,CAoBhB;AAED;;;GAGG;AACH,wBAAsB,UAAU,CAAC,CAAC,EAAE,KAAK,EAAE;IACzC,KAAK,EAAE,aAAa,CAAC;IACrB,OAAO,EAAE,YAAY,CAAC;IACtB,QAAQ,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GAAG,OAAO,CAAC;IAAE,QAAQ,EAAE,aAAa,CAAC;IAAC,MAAM,EAAE,CAAC,CAAA;CAAE,CAAC,CAKlD;AAED,wBAAgB,WAAW,CAAC,CAAC,EAAE,aAAa,GAAG,MAAM,CAGpD"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v2.19.23 — MNEME THALAMUS (organ #2 of LIMBIC) · sensory router
|
|
3
|
+
*
|
|
4
|
+
* "event → tier → route ไปสมองส่วนที่เหมาะสม"
|
|
5
|
+
*
|
|
6
|
+
* Diagnosis: REFLEX, DREAMS, CORTEX, BREATH all exist as separate
|
|
7
|
+
* organs. Without a router, the daemon has to manually decide which
|
|
8
|
+
* organ handles each event. That's the same 'cortex thinks too much'
|
|
9
|
+
* bug REFLEX was meant to fix.
|
|
10
|
+
*
|
|
11
|
+
* Fix: THALAMUS classifies every event into one of 4 tiers, then
|
|
12
|
+
* routes to the matching organ's handler. Caller supplies the
|
|
13
|
+
* handlers (vendor-agnostic); THALAMUS only decides + dispatches.
|
|
14
|
+
*
|
|
15
|
+
* Tiers:
|
|
16
|
+
* - "reflex" — event has a cached REFLEX entry; return instant
|
|
17
|
+
* - "cortex" — event needs synchronous tool call (normal MCP path)
|
|
18
|
+
* - "dream" — system is idle; defer to background consolidation
|
|
19
|
+
* - "breath" — daemon dead; respawn first, then escalate
|
|
20
|
+
*
|
|
21
|
+
* Composes onto:
|
|
22
|
+
* - v2.19.22 REFLEX (cache HIT short-circuits)
|
|
23
|
+
* - v2.19.23 BREATH (daemon-dead triggers respawn)
|
|
24
|
+
* - v2.19.14 DREAMS (idle period triggers consolidation)
|
|
25
|
+
* - v2.19.16 FEDERATED (when remote attestations needed, route via cortex)
|
|
26
|
+
*
|
|
27
|
+
* Honest scope:
|
|
28
|
+
* - PURE FUNCTION classifier. Handlers are caller-supplied async fns.
|
|
29
|
+
* - Routes by RULE, not by ML. Deterministic; auditable.
|
|
30
|
+
* - No fallback CASCADE; explicit tier per event. Caller picks.
|
|
31
|
+
*/
|
|
32
|
+
import { createHmac } from "node:crypto";
|
|
33
|
+
const PROTOCOL_VERSION = 1;
|
|
34
|
+
function canon(v) {
|
|
35
|
+
if (v === null || typeof v !== "object")
|
|
36
|
+
return JSON.stringify(v);
|
|
37
|
+
if (Array.isArray(v))
|
|
38
|
+
return "[" + v.map(canon).join(",") + "]";
|
|
39
|
+
const keys = Object.keys(v).sort();
|
|
40
|
+
return "{" + keys.map((k) => JSON.stringify(k) + ":" + canon(v[k])).join(",") + "}";
|
|
41
|
+
}
|
|
42
|
+
function defaultSecret() {
|
|
43
|
+
return process.env["MNEME_THALAMUS_SECRET"] || `mneme-thalamus-v${PROTOCOL_VERSION}`;
|
|
44
|
+
}
|
|
45
|
+
function hmacHex(body, secret) {
|
|
46
|
+
return createHmac("sha256", secret).update(canon(body)).digest("hex");
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Classify an event into one of 4 tiers.
|
|
50
|
+
*
|
|
51
|
+
* Rules (in priority order):
|
|
52
|
+
* 1. daemon dead → breath (highest; everything else needs daemon)
|
|
53
|
+
* 2. cache hit → reflex (instant return; cheapest path)
|
|
54
|
+
* 3. idle_tick or idleMs > threshold → dream (background work)
|
|
55
|
+
* 4. fallback → cortex (synchronous tool call)
|
|
56
|
+
*/
|
|
57
|
+
export function classifyEvent(input) {
|
|
58
|
+
const dreamThreshold = input.context.dreamIdleThresholdMs ?? 30 * 60 * 1000;
|
|
59
|
+
let tier;
|
|
60
|
+
let reason;
|
|
61
|
+
if (!input.context.daemonAlive) {
|
|
62
|
+
tier = "breath";
|
|
63
|
+
reason = "daemon_dead: route to breath for respawn before anything else";
|
|
64
|
+
}
|
|
65
|
+
else if (input.context.hasReflexCacheHit) {
|
|
66
|
+
tier = "reflex";
|
|
67
|
+
reason = "cache_hit: short-circuit to reflex for instant return";
|
|
68
|
+
}
|
|
69
|
+
else if (input.event.kind === "idle_tick" || input.context.idleMs > dreamThreshold) {
|
|
70
|
+
tier = "dream";
|
|
71
|
+
reason = `idle_${input.context.idleMs}ms > ${dreamThreshold}ms threshold: route to dream consolidation`;
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
tier = "cortex";
|
|
75
|
+
reason = "no_cache_or_idle: synchronous cortex path";
|
|
76
|
+
}
|
|
77
|
+
const body = { v: PROTOCOL_VERSION, tier, reason, eventKind: input.event.kind, ts: input.event.ts };
|
|
78
|
+
const sig = hmacHex(body, input.secret ?? defaultSecret());
|
|
79
|
+
return { v: PROTOCOL_VERSION, tier, reason, sig };
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Dispatch event to the chosen tier's handler. Returns the handler's
|
|
83
|
+
* Promise unchanged. Pure orchestration; caller owns the handlers.
|
|
84
|
+
*/
|
|
85
|
+
export async function routeEvent(input) {
|
|
86
|
+
const decision = classifyEvent({ event: input.event, context: input.context, secret: input.secret });
|
|
87
|
+
const handler = input.handlers[decision.tier];
|
|
88
|
+
const result = await handler(input.event);
|
|
89
|
+
return { decision, result };
|
|
90
|
+
}
|
|
91
|
+
export function formatRoute(d) {
|
|
92
|
+
const tag = d.tier === "reflex" ? "⚡" : d.tier === "cortex" ? "🧠" : d.tier === "dream" ? "💤" : "🫁";
|
|
93
|
+
return `${tag} THALAMUS · tier=${d.tier} · ${d.reason}`;
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/thalamus/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"thalamus.test.d.ts","sourceRoot":"","sources":["../../src/thalamus/thalamus.test.ts"],"names":[],"mappings":""}
|