@mneme-ai/core 2.19.22 → 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/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/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 +6 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -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/whats_new.d.ts.map +1 -1
- package/dist/whats_new.js +8 -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 +27 -0
- package/dist/wrapper_genesis/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
2
|
+
import { buildUnifiedCatalog, verifyCatalog, findByAlias, computeCatalogStats, formatCatalogLine, deriveAliases, } from "./index.js";
|
|
3
|
+
const SECRET = "proprioception-test-secret-997744";
|
|
4
|
+
describe("v2.19.23 PROPRIOCEPTION · deriveAliases", () => {
|
|
5
|
+
it("kebab-case CLI -> dash/snake/camel/nodelim variants", () => {
|
|
6
|
+
const a = deriveAliases("ghost-code");
|
|
7
|
+
expect(a).toContain("ghost-code");
|
|
8
|
+
expect(a).toContain("ghost_code");
|
|
9
|
+
expect(a).toContain("ghostcode");
|
|
10
|
+
expect(a).toContain("ghostcode"); // lowercased camel
|
|
11
|
+
});
|
|
12
|
+
it("MCP-style 'mneme.ghost.distill' strips prefix + derives variants", () => {
|
|
13
|
+
const a = deriveAliases("mneme.ghost.distill");
|
|
14
|
+
expect(a).toContain("ghost.distill");
|
|
15
|
+
expect(a).toContain("ghost_distill");
|
|
16
|
+
expect(a).toContain("ghost-distill");
|
|
17
|
+
expect(a).toContain("ghostdistill");
|
|
18
|
+
});
|
|
19
|
+
it("aliases are deduplicated + lowercased + sorted", () => {
|
|
20
|
+
const a = deriveAliases("FOO-BAR");
|
|
21
|
+
expect(a).toEqual([...a].sort());
|
|
22
|
+
for (const x of a)
|
|
23
|
+
expect(x).toBe(x.toLowerCase());
|
|
24
|
+
});
|
|
25
|
+
});
|
|
26
|
+
describe("v2.19.23 PROPRIOCEPTION · buildUnifiedCatalog", () => {
|
|
27
|
+
it("classifies cli_only / mcp_only / both correctly", () => {
|
|
28
|
+
const cat = buildUnifiedCatalog({
|
|
29
|
+
cliCommands: [
|
|
30
|
+
{ name: "ghost", description: "ghost-code lens" },
|
|
31
|
+
{ name: "status", description: "memory status" },
|
|
32
|
+
{ name: "ask", description: "Q&A" }, // cli_only — no mcp wrapper
|
|
33
|
+
],
|
|
34
|
+
mcpTools: [
|
|
35
|
+
{ name: "mneme.ghost.distill" },
|
|
36
|
+
{ name: "mneme.status.report" },
|
|
37
|
+
{ name: "mneme.arena.judge" }, // mcp_only — no cli command
|
|
38
|
+
],
|
|
39
|
+
secret: SECRET,
|
|
40
|
+
});
|
|
41
|
+
const byName = (n) => cat.entries.find((e) => e.canonical === n);
|
|
42
|
+
expect(byName("ghost").kind).toBe("both");
|
|
43
|
+
expect(byName("ghost").surface).toEqual(["cli", "mcp"]);
|
|
44
|
+
expect(byName("status").kind).toBe("both");
|
|
45
|
+
expect(byName("ask").kind).toBe("cli_only");
|
|
46
|
+
expect(byName("ask").surface).toEqual(["cli"]);
|
|
47
|
+
expect(byName("arena").kind).toBe("mcp_only");
|
|
48
|
+
expect(byName("arena").surface).toEqual(["mcp"]);
|
|
49
|
+
});
|
|
50
|
+
it("entries sorted by canonical (stable order)", () => {
|
|
51
|
+
const cat = buildUnifiedCatalog({
|
|
52
|
+
cliCommands: [{ name: "zebra" }, { name: "alpha" }],
|
|
53
|
+
mcpTools: [{ name: "mneme.beta.go" }, { name: "mneme.alpha.go" }],
|
|
54
|
+
secret: SECRET,
|
|
55
|
+
});
|
|
56
|
+
const names = cat.entries.map((e) => e.canonical);
|
|
57
|
+
expect(names).toEqual(["alpha", "beta", "zebra"]);
|
|
58
|
+
});
|
|
59
|
+
it("CLI description preferred over MCP description for 'both' entries", () => {
|
|
60
|
+
const cat = buildUnifiedCatalog({
|
|
61
|
+
cliCommands: [{ name: "ghost", description: "CLI desc" }],
|
|
62
|
+
mcpTools: [{ name: "mneme.ghost.distill", description: "MCP desc" }],
|
|
63
|
+
secret: SECRET,
|
|
64
|
+
});
|
|
65
|
+
expect(cat.entries.find((e) => e.canonical === "ghost").description).toBe("CLI desc");
|
|
66
|
+
});
|
|
67
|
+
it("sharedCount = number of 'both' entries", () => {
|
|
68
|
+
const cat = buildUnifiedCatalog({
|
|
69
|
+
cliCommands: [{ name: "ghost" }, { name: "status" }, { name: "ask" }],
|
|
70
|
+
mcpTools: [{ name: "mneme.ghost.x" }, { name: "mneme.status.y" }, { name: "mneme.unrelated.z" }],
|
|
71
|
+
secret: SECRET,
|
|
72
|
+
});
|
|
73
|
+
expect(cat.sharedCount).toBe(2);
|
|
74
|
+
});
|
|
75
|
+
});
|
|
76
|
+
describe("v2.19.23 PROPRIOCEPTION · HMAC integrity", () => {
|
|
77
|
+
it("verifyCatalog passes on untampered", () => {
|
|
78
|
+
const cat = buildUnifiedCatalog({
|
|
79
|
+
cliCommands: [{ name: "a" }],
|
|
80
|
+
mcpTools: [{ name: "mneme.b.c" }],
|
|
81
|
+
secret: SECRET,
|
|
82
|
+
});
|
|
83
|
+
expect(verifyCatalog(cat, SECRET)).toBe(true);
|
|
84
|
+
});
|
|
85
|
+
it("verifyCatalog rejects tamper", () => {
|
|
86
|
+
const cat = buildUnifiedCatalog({
|
|
87
|
+
cliCommands: [{ name: "a" }],
|
|
88
|
+
mcpTools: [{ name: "mneme.b.c" }],
|
|
89
|
+
secret: SECRET,
|
|
90
|
+
});
|
|
91
|
+
const tampered = { ...cat, totalCli: 999 };
|
|
92
|
+
expect(verifyCatalog(tampered, SECRET)).toBe(false);
|
|
93
|
+
});
|
|
94
|
+
it("MEASURED 100% determinism: same input -> same sig (50 trials)", () => {
|
|
95
|
+
const input = {
|
|
96
|
+
cliCommands: [{ name: "ghost" }, { name: "status" }],
|
|
97
|
+
mcpTools: [{ name: "mneme.ghost.distill" }, { name: "mneme.arena.judge" }],
|
|
98
|
+
secret: SECRET,
|
|
99
|
+
};
|
|
100
|
+
const firstSig = buildUnifiedCatalog(input).sig;
|
|
101
|
+
let allEqual = true;
|
|
102
|
+
for (let i = 0; i < 50; i++) {
|
|
103
|
+
if (buildUnifiedCatalog(input).sig !== firstSig) {
|
|
104
|
+
allEqual = false;
|
|
105
|
+
break;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
expect(allEqual).toBe(true);
|
|
109
|
+
});
|
|
110
|
+
});
|
|
111
|
+
describe("v2.19.23 PROPRIOCEPTION · findByAlias (one catalog, many surfaces)", () => {
|
|
112
|
+
it("resolves canonical name to entry", () => {
|
|
113
|
+
const cat = buildUnifiedCatalog({
|
|
114
|
+
cliCommands: [{ name: "ghost-code" }],
|
|
115
|
+
mcpTools: [{ name: "mneme.arena.judge" }],
|
|
116
|
+
secret: SECRET,
|
|
117
|
+
});
|
|
118
|
+
expect(findByAlias(cat, "ghost-code")?.canonical).toBe("ghost-code");
|
|
119
|
+
expect(findByAlias(cat, "GHOST-CODE")?.canonical).toBe("ghost-code"); // case-insensitive
|
|
120
|
+
});
|
|
121
|
+
it("resolves derived aliases (snake_case, camelCase, no-delim)", () => {
|
|
122
|
+
const cat = buildUnifiedCatalog({
|
|
123
|
+
cliCommands: [{ name: "ghost-code" }],
|
|
124
|
+
mcpTools: [],
|
|
125
|
+
secret: SECRET,
|
|
126
|
+
});
|
|
127
|
+
expect(findByAlias(cat, "ghost_code")?.canonical).toBe("ghost-code");
|
|
128
|
+
expect(findByAlias(cat, "ghostcode")?.canonical).toBe("ghost-code");
|
|
129
|
+
});
|
|
130
|
+
it("unknown alias returns undefined", () => {
|
|
131
|
+
const cat = buildUnifiedCatalog({ cliCommands: [{ name: "a" }], mcpTools: [], secret: SECRET });
|
|
132
|
+
expect(findByAlias(cat, "no-such")).toBeUndefined();
|
|
133
|
+
});
|
|
134
|
+
});
|
|
135
|
+
describe("v2.19.23 PROPRIOCEPTION · stats + formatter", () => {
|
|
136
|
+
it("computeCatalogStats unifiedRatio = both / total", () => {
|
|
137
|
+
const cat = buildUnifiedCatalog({
|
|
138
|
+
cliCommands: [{ name: "a" }, { name: "b" }, { name: "c" }],
|
|
139
|
+
mcpTools: [{ name: "mneme.a.x" }, { name: "mneme.d.x" }],
|
|
140
|
+
secret: SECRET,
|
|
141
|
+
});
|
|
142
|
+
const s = computeCatalogStats(cat);
|
|
143
|
+
expect(s.both).toBe(1); // a
|
|
144
|
+
expect(s.cliOnly).toBe(2); // b, c
|
|
145
|
+
expect(s.mcpOnly).toBe(1); // d
|
|
146
|
+
expect(s.unifiedRatio).toBeCloseTo(1 / 4, 5);
|
|
147
|
+
});
|
|
148
|
+
it("formatCatalogLine renders single-line digest", () => {
|
|
149
|
+
const cat = buildUnifiedCatalog({
|
|
150
|
+
cliCommands: [{ name: "a" }, { name: "b" }],
|
|
151
|
+
mcpTools: [{ name: "mneme.a.x" }],
|
|
152
|
+
secret: SECRET,
|
|
153
|
+
});
|
|
154
|
+
const line = formatCatalogLine(computeCatalogStats(cat));
|
|
155
|
+
expect(line).toContain("PROPRIOCEPTION");
|
|
156
|
+
expect(line).toContain("unified");
|
|
157
|
+
});
|
|
158
|
+
});
|
|
159
|
+
//# sourceMappingURL=proprioception.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proprioception.test.js","sourceRoot":"","sources":["../../src/proprioception/proprioception.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EACL,mBAAmB,EACnB,aAAa,EACb,WAAW,EACX,mBAAmB,EACnB,iBAAiB,EACjB,aAAa,GACd,MAAM,YAAY,CAAC;AAEpB,MAAM,MAAM,GAAG,mCAAmC,CAAC;AAEnD,QAAQ,CAAC,yCAAyC,EAAE,GAAG,EAAE;IACvD,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;QAC7D,MAAM,CAAC,GAAG,aAAa,CAAC,YAAY,CAAC,CAAC;QACtC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;QAClC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;QAClC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;QACjC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC,mBAAmB;IACvD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kEAAkE,EAAE,GAAG,EAAE;QAC1E,MAAM,CAAC,GAAG,aAAa,CAAC,qBAAqB,CAAC,CAAC;QAC/C,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;QACrC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;QACrC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;QACrC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;QACxD,MAAM,CAAC,GAAG,aAAa,CAAC,SAAS,CAAC,CAAC;QACnC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QACjC,KAAK,MAAM,CAAC,IAAI,CAAC;YAAE,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,+CAA+C,EAAE,GAAG,EAAE;IAC7D,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,MAAM,GAAG,GAAG,mBAAmB,CAAC;YAC9B,WAAW,EAAE;gBACX,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE;gBACjD,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,eAAe,EAAE;gBAChD,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,EAAE,4BAA4B;aAClE;YACD,QAAQ,EAAE;gBACR,EAAE,IAAI,EAAE,qBAAqB,EAAE;gBAC/B,EAAE,IAAI,EAAE,qBAAqB,EAAE;gBAC/B,EAAE,IAAI,EAAE,mBAAmB,EAAE,EAAE,4BAA4B;aAC5D;YACD,MAAM,EAAE,MAAM;SACf,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,CAAC,CAAE,CAAC;QAC1E,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC1C,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;QACxD,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC3C,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC5C,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;QAC/C,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC9C,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,MAAM,GAAG,GAAG,mBAAmB,CAAC;YAC9B,WAAW,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;YACnD,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,EAAE,EAAE,IAAI,EAAE,gBAAgB,EAAE,CAAC;YACjE,MAAM,EAAE,MAAM;SACf,CAAC,CAAC;QACH,MAAM,KAAK,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QAClD,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mEAAmE,EAAE,GAAG,EAAE;QAC3E,MAAM,GAAG,GAAG,mBAAmB,CAAC;YAC9B,WAAW,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,CAAC;YACzD,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,qBAAqB,EAAE,WAAW,EAAE,UAAU,EAAE,CAAC;YACpE,MAAM,EAAE,MAAM;SACf,CAAC,CAAC;QACH,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,OAAO,CAAE,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACzF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAChD,MAAM,GAAG,GAAG,mBAAmB,CAAC;YAC9B,WAAW,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;YACrE,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,EAAE,EAAE,IAAI,EAAE,gBAAgB,EAAE,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,CAAC;YAChG,MAAM,EAAE,MAAM;SACf,CAAC,CAAC;QACH,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,0CAA0C,EAAE,GAAG,EAAE;IACxD,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC5C,MAAM,GAAG,GAAG,mBAAmB,CAAC;YAC9B,WAAW,EAAE,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;YAC5B,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;YACjC,MAAM,EAAE,MAAM;SACf,CAAC,CAAC;QACH,MAAM,CAAC,aAAa,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;QACtC,MAAM,GAAG,GAAG,mBAAmB,CAAC;YAC9B,WAAW,EAAE,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;YAC5B,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;YACjC,MAAM,EAAE,MAAM;SACf,CAAC,CAAC;QACH,MAAM,QAAQ,GAAG,EAAE,GAAG,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC;QAC3C,MAAM,CAAC,aAAa,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+DAA+D,EAAE,GAAG,EAAE;QACvE,MAAM,KAAK,GAAG;YACZ,WAAW,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;YACpD,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,qBAAqB,EAAE,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,CAAC;YAC1E,MAAM,EAAE,MAAM;SACf,CAAC;QACF,MAAM,QAAQ,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC;QAChD,IAAI,QAAQ,GAAG,IAAI,CAAC;QACpB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;YAC5B,IAAI,mBAAmB,CAAC,KAAK,CAAC,CAAC,GAAG,KAAK,QAAQ,EAAE,CAAC;gBAAC,QAAQ,GAAG,KAAK,CAAC;gBAAC,MAAM;YAAC,CAAC;QAC/E,CAAC;QACD,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,oEAAoE,EAAE,GAAG,EAAE;IAClF,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC1C,MAAM,GAAG,GAAG,mBAAmB,CAAC;YAC9B,WAAW,EAAE,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;YACrC,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,mBAAmB,EAAE,CAAC;YACzC,MAAM,EAAE,MAAM;SACf,CAAC,CAAC;QACH,MAAM,CAAC,WAAW,CAAC,GAAG,EAAE,YAAY,CAAC,EAAE,SAAS,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACrE,MAAM,CAAC,WAAW,CAAC,GAAG,EAAE,YAAY,CAAC,EAAE,SAAS,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,mBAAmB;IAC3F,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4DAA4D,EAAE,GAAG,EAAE;QACpE,MAAM,GAAG,GAAG,mBAAmB,CAAC;YAC9B,WAAW,EAAE,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;YACrC,QAAQ,EAAE,EAAE;YACZ,MAAM,EAAE,MAAM;SACf,CAAC,CAAC;QACH,MAAM,CAAC,WAAW,CAAC,GAAG,EAAE,YAAY,CAAC,EAAE,SAAS,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACrE,MAAM,CAAC,WAAW,CAAC,GAAG,EAAE,WAAW,CAAC,EAAE,SAAS,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACtE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QACzC,MAAM,GAAG,GAAG,mBAAmB,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;QAChG,MAAM,CAAC,WAAW,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;IACtD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,6CAA6C,EAAE,GAAG,EAAE;IAC3D,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,MAAM,GAAG,GAAG,mBAAmB,CAAC;YAC9B,WAAW,EAAE,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;YAC1D,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;YACxD,MAAM,EAAE,MAAM;SACf,CAAC,CAAC;QACH,MAAM,CAAC,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAC;QACnC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI;QAC5B,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO;QAClC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI;QAC/B,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,MAAM,GAAG,GAAG,mBAAmB,CAAC;YAC9B,WAAW,EAAE,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;YAC3C,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;YACjC,MAAM,EAAE,MAAM;SACf,CAAC,CAAC;QACH,MAAM,IAAI,GAAG,iBAAiB,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC;QACzD,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;QACzC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,86 @@
|
|
|
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
|
+
export type ReflexEventKind = "file_save" | "git_commit" | "terminal_command" | "user_chat" | "tool_call";
|
|
30
|
+
export interface BuiltinReflexRule {
|
|
31
|
+
/** Stable id; used for analytics + dedup. */
|
|
32
|
+
id: string;
|
|
33
|
+
/** Event kind this rule fires on. */
|
|
34
|
+
eventKind: ReflexEventKind;
|
|
35
|
+
/** Optional context predicate (e.g., context.command startsWith "git push"). */
|
|
36
|
+
contextPredicate?: (context: Record<string, unknown>) => boolean;
|
|
37
|
+
/** Proposed follow-up tool name. */
|
|
38
|
+
toolName: string;
|
|
39
|
+
/** Default args (template; caller specializes). */
|
|
40
|
+
argsTemplate: Record<string, unknown>;
|
|
41
|
+
/** Prior confidence 0..1 (static; before any observation). */
|
|
42
|
+
priorConfidence: number;
|
|
43
|
+
/** Human reason for the rule. */
|
|
44
|
+
reason: string;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* 8 built-in rules that turn cold-start REFLEX into a useful pre-execution
|
|
48
|
+
* layer from day one. Drawn from common AI-agent workflows on a repo.
|
|
49
|
+
*/
|
|
50
|
+
export declare const BUILTIN_RULES: BuiltinReflexRule[];
|
|
51
|
+
export interface BlendedPrediction {
|
|
52
|
+
toolName: string;
|
|
53
|
+
argsTemplate: Record<string, unknown>;
|
|
54
|
+
/** Blended confidence (0..1). */
|
|
55
|
+
confidence: number;
|
|
56
|
+
/** Where did the confidence come from? */
|
|
57
|
+
source: "rule_only" | "observation_only" | "blended";
|
|
58
|
+
/** Original prior (rule) confidence; null if no rule matched. */
|
|
59
|
+
priorConfidence: number | null;
|
|
60
|
+
/** Original posterior (frequency) confidence; null if no observations. */
|
|
61
|
+
posteriorConfidence: number | null;
|
|
62
|
+
sampleCount: number;
|
|
63
|
+
}
|
|
64
|
+
export interface BlendInput {
|
|
65
|
+
eventKind: ReflexEventKind;
|
|
66
|
+
context: Record<string, unknown>;
|
|
67
|
+
/** Frequency-based predictions from v2.19.22 REFLEX. */
|
|
68
|
+
observations: Array<{
|
|
69
|
+
toolName: string;
|
|
70
|
+
argsTemplate: Record<string, unknown>;
|
|
71
|
+
confidence: number;
|
|
72
|
+
sampleCount: number;
|
|
73
|
+
}>;
|
|
74
|
+
/** Custom rules; defaults to BUILTIN_RULES. */
|
|
75
|
+
rules?: BuiltinReflexRule[];
|
|
76
|
+
topN?: number;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Blend built-in rule priors with frequency-observed posteriors.
|
|
80
|
+
* Returns top-N predictions; cold-start works because rules ship priors.
|
|
81
|
+
*/
|
|
82
|
+
export declare function blendPredictions(input: BlendInput): BlendedPrediction[];
|
|
83
|
+
export declare function formatBlendLine(p: BlendedPrediction): string;
|
|
84
|
+
export declare function listBuiltinRules(): BuiltinReflexRule[];
|
|
85
|
+
export declare const _PROTOCOL_VERSION: 1;
|
|
86
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/spinal_reflex/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAOH,MAAM,MAAM,eAAe,GAAG,WAAW,GAAG,YAAY,GAAG,kBAAkB,GAAG,WAAW,GAAG,WAAW,CAAC;AAE1G,MAAM,WAAW,iBAAiB;IAChC,6CAA6C;IAC7C,EAAE,EAAE,MAAM,CAAC;IACX,qCAAqC;IACrC,SAAS,EAAE,eAAe,CAAC;IAC3B,gFAAgF;IAChF,gBAAgB,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC;IACjE,oCAAoC;IACpC,QAAQ,EAAE,MAAM,CAAC;IACjB,mDAAmD;IACnD,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACtC,8DAA8D;IAC9D,eAAe,EAAE,MAAM,CAAC;IACxB,iCAAiC;IACjC,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;GAGG;AACH,eAAO,MAAM,aAAa,EAAE,iBAAiB,EA2E5C,CAAC;AAEF,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACtC,iCAAiC;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,0CAA0C;IAC1C,MAAM,EAAE,WAAW,GAAG,kBAAkB,GAAG,SAAS,CAAC;IACrD,iEAAiE;IACjE,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,0EAA0E;IAC1E,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,eAAe,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,wDAAwD;IACxD,YAAY,EAAE,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC1H,+CAA+C;IAC/C,KAAK,CAAC,EAAE,iBAAiB,EAAE,CAAC;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAUD;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,UAAU,GAAG,iBAAiB,EAAE,CAuCvE;AAED,wBAAgB,eAAe,CAAC,CAAC,EAAE,iBAAiB,GAAG,MAAM,CAG5D;AAED,wBAAgB,gBAAgB,IAAI,iBAAiB,EAAE,CAEtD;AAED,eAAO,MAAM,iBAAiB,GAAmB,CAAC"}
|
|
@@ -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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"}
|