@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.
Files changed (83) hide show
  1. package/dist/autonomic_breath/autonomic_breath.test.d.ts +2 -0
  2. package/dist/autonomic_breath/autonomic_breath.test.d.ts.map +1 -0
  3. package/dist/autonomic_breath/autonomic_breath.test.js +140 -0
  4. package/dist/autonomic_breath/autonomic_breath.test.js.map +1 -0
  5. package/dist/autonomic_breath/index.d.ts +135 -0
  6. package/dist/autonomic_breath/index.d.ts.map +1 -0
  7. package/dist/autonomic_breath/index.js +180 -0
  8. package/dist/autonomic_breath/index.js.map +1 -0
  9. package/dist/cosmic/aurelian_v1923.test.d.ts +2 -0
  10. package/dist/cosmic/aurelian_v1923.test.d.ts.map +1 -0
  11. package/dist/cosmic/aurelian_v1923.test.js +90 -0
  12. package/dist/cosmic/aurelian_v1923.test.js.map +1 -0
  13. package/dist/cosmic/aurelian_v1924.test.d.ts +2 -0
  14. package/dist/cosmic/aurelian_v1924.test.d.ts.map +1 -0
  15. package/dist/cosmic/aurelian_v1924.test.js +48 -0
  16. package/dist/cosmic/aurelian_v1924.test.js.map +1 -0
  17. package/dist/event_pattern_match/event_pattern_match.test.d.ts +2 -0
  18. package/dist/event_pattern_match/event_pattern_match.test.d.ts.map +1 -0
  19. package/dist/event_pattern_match/event_pattern_match.test.js +175 -0
  20. package/dist/event_pattern_match/event_pattern_match.test.js.map +1 -0
  21. package/dist/event_pattern_match/index.d.ts +99 -0
  22. package/dist/event_pattern_match/index.d.ts.map +1 -0
  23. package/dist/event_pattern_match/index.js +318 -0
  24. package/dist/event_pattern_match/index.js.map +1 -0
  25. package/dist/hippocampus_dreams/hippocampus_dreams.test.d.ts +2 -0
  26. package/dist/hippocampus_dreams/hippocampus_dreams.test.d.ts.map +1 -0
  27. package/dist/hippocampus_dreams/hippocampus_dreams.test.js +106 -0
  28. package/dist/hippocampus_dreams/hippocampus_dreams.test.js.map +1 -0
  29. package/dist/hippocampus_dreams/index.d.ts +79 -0
  30. package/dist/hippocampus_dreams/index.d.ts.map +1 -0
  31. package/dist/hippocampus_dreams/index.js +122 -0
  32. package/dist/hippocampus_dreams/index.js.map +1 -0
  33. package/dist/hormonal/hormonal.test.d.ts +2 -0
  34. package/dist/hormonal/hormonal.test.d.ts.map +1 -0
  35. package/dist/hormonal/hormonal.test.js +116 -0
  36. package/dist/hormonal/hormonal.test.js.map +1 -0
  37. package/dist/hormonal/index.d.ts +105 -0
  38. package/dist/hormonal/index.d.ts.map +1 -0
  39. package/dist/hormonal/index.js +132 -0
  40. package/dist/hormonal/index.js.map +1 -0
  41. package/dist/index.d.ts +8 -0
  42. package/dist/index.d.ts.map +1 -1
  43. package/dist/index.js +10 -0
  44. package/dist/index.js.map +1 -1
  45. package/dist/proprioception/index.d.ts +82 -0
  46. package/dist/proprioception/index.d.ts.map +1 -0
  47. package/dist/proprioception/index.js +170 -0
  48. package/dist/proprioception/index.js.map +1 -0
  49. package/dist/proprioception/proprioception.test.d.ts +2 -0
  50. package/dist/proprioception/proprioception.test.d.ts.map +1 -0
  51. package/dist/proprioception/proprioception.test.js +159 -0
  52. package/dist/proprioception/proprioception.test.js.map +1 -0
  53. package/dist/spinal_reflex/index.d.ts +86 -0
  54. package/dist/spinal_reflex/index.d.ts.map +1 -0
  55. package/dist/spinal_reflex/index.js +180 -0
  56. package/dist/spinal_reflex/index.js.map +1 -0
  57. package/dist/spinal_reflex/spinal_reflex.test.d.ts +2 -0
  58. package/dist/spinal_reflex/spinal_reflex.test.d.ts.map +1 -0
  59. package/dist/spinal_reflex/spinal_reflex.test.js +168 -0
  60. package/dist/spinal_reflex/spinal_reflex.test.js.map +1 -0
  61. package/dist/thalamus/index.d.ts +92 -0
  62. package/dist/thalamus/index.d.ts.map +1 -0
  63. package/dist/thalamus/index.js +95 -0
  64. package/dist/thalamus/index.js.map +1 -0
  65. package/dist/thalamus/thalamus.test.d.ts +2 -0
  66. package/dist/thalamus/thalamus.test.d.ts.map +1 -0
  67. package/dist/thalamus/thalamus.test.js +101 -0
  68. package/dist/thalamus/thalamus.test.js.map +1 -0
  69. package/dist/tool_tier/index.d.ts +101 -0
  70. package/dist/tool_tier/index.d.ts.map +1 -0
  71. package/dist/tool_tier/index.js +228 -0
  72. package/dist/tool_tier/index.js.map +1 -0
  73. package/dist/tool_tier/tool_tier.test.d.ts +2 -0
  74. package/dist/tool_tier/tool_tier.test.d.ts.map +1 -0
  75. package/dist/tool_tier/tool_tier.test.js +133 -0
  76. package/dist/tool_tier/tool_tier.test.js.map +1 -0
  77. package/dist/whats_new.d.ts.map +1 -1
  78. package/dist/whats_new.js +16 -0
  79. package/dist/whats_new.js.map +1 -1
  80. package/dist/wrapper_genesis/index.d.ts.map +1 -1
  81. package/dist/wrapper_genesis/index.js +36 -0
  82. package/dist/wrapper_genesis/index.js.map +1 -1
  83. package/package.json +1 -1
@@ -0,0 +1,318 @@
1
+ /**
2
+ * v2.19.24 — MNEME EVENT PATTERN MATCH (extends v2.19.23 SPINAL REFLEX)
3
+ *
4
+ * "user commit 'fix: token leak in auth.ts' → reflex detect 'fix:' +
5
+ * 'token leak' + 'auth' → pre-execute bug_prophet + forensics.vulns +
6
+ * apoptosis.detect in 200ms → AI ตอนถามจริงได้ผลใน 0ms"
7
+ * — user audit, 2026-05-17
8
+ *
9
+ * Diagnosis: v2.19.23 SPINAL REFLEX ships 8 BUILTIN_RULES that match
10
+ * on `eventKind + contextPredicate`. The predicates are coarse: they
11
+ * match TYPE OF EVENT, not SEMANTIC CONTENT. A commit message
12
+ * "fix: token leak" gets the same predictions as "feat: add dark mode"
13
+ * because both are git_commit events.
14
+ *
15
+ * Fix: SEMANTIC PATTERN MATCHER inspects event content (commit text,
16
+ * file path, clipboard text, shell command) against a regex pattern
17
+ * library. Each pattern proposes specific follow-up tools with
18
+ * confidence. Multi-pattern hits are MERGED via max-confidence
19
+ * (most-confident-rule-wins per tool name).
20
+ *
21
+ * Built-in patterns (15+) cover:
22
+ * - Commit-message intent (fix / feat / chore / docs / security)
23
+ * - Security keywords (token leak / cve / vuln / exploit / xss / sql)
24
+ * - File-type hints (.ts → bug_prophet; .test.* → coverage; .md → docs)
25
+ * - Clipboard handoff signals ("check this with claude" → handoff.universal)
26
+ * - Shell command intent ("npm install" → deps.oracle; "git push" → premortem)
27
+ *
28
+ * Composes onto:
29
+ * - v2.19.23 SPINAL REFLEX (Prediction interface; blendPredictions consumer)
30
+ * - v2.19.22 REFLEX (eventCacheKey; cache surface)
31
+ * - v2.19.10 REVERSE-WRAPPER BUILTIN_RULES pattern (proven)
32
+ *
33
+ * Honest scope:
34
+ * - PURE FUNCTION matcher; deterministic; HMAC-signed report.
35
+ * - Patterns are REGEX, not NLP. False positives expected on noisy
36
+ * commit messages; caller can ignore matches with confidence < 0.5.
37
+ * - Caller hooks the actual event sources (git post-commit hook /
38
+ * fs.watch / clipboard observer); this module is the SEMANTIC
39
+ * classifier only.
40
+ */
41
+ import { createHmac, timingSafeEqual } from "node:crypto";
42
+ const PROTOCOL_VERSION = 1;
43
+ /**
44
+ * 18 built-in semantic patterns covering the most common AI-agent
45
+ * workflows on a code repo. Each pattern is one regex over event.text
46
+ * + optional eventKind filter + a list of suggested tools.
47
+ */
48
+ export const BUILTIN_PATTERNS = [
49
+ // ─── commit-message intent ──────────────────────────────────────────
50
+ {
51
+ id: "commit_fix_prefix",
52
+ eventKinds: ["git_commit"],
53
+ regex: /^fix(\(\w+\))?:/,
54
+ tools: [
55
+ { toolName: "mneme.bug_prophet.prophesy", argsTemplate: {}, confidence: 0.7 },
56
+ { toolName: "mneme.premortem", argsTemplate: { change: "fix commit" }, confidence: 0.6 },
57
+ ],
58
+ reason: "fix: prefix → bug-prophet checks regression patterns; premortem flags risk",
59
+ },
60
+ {
61
+ id: "commit_feat_prefix",
62
+ eventKinds: ["git_commit"],
63
+ regex: /^feat(\(\w+\))?:/,
64
+ tools: [
65
+ { toolName: "mneme.consequence.record", argsTemplate: { cmd: "feat commit" }, confidence: 0.6 },
66
+ { toolName: "mneme.atrophy", argsTemplate: {}, confidence: 0.45 },
67
+ ],
68
+ reason: "feat: prefix → record consequence + check who-loses-knowledge from new code",
69
+ },
70
+ {
71
+ id: "commit_chore_or_docs",
72
+ eventKinds: ["git_commit"],
73
+ regex: /^(chore|docs|style|refactor)(\(\w+\))?:/,
74
+ tools: [
75
+ { toolName: "mneme.consequence.record", argsTemplate: { cmd: "low-risk commit" }, confidence: 0.4 },
76
+ ],
77
+ reason: "low-risk commit type → just record consequence; no deep checks needed",
78
+ },
79
+ // ─── security keywords ──────────────────────────────────────────────
80
+ {
81
+ id: "security_token_leak",
82
+ eventKinds: ["git_commit", "file_save"],
83
+ regex: /\b(token leak|secret leak|api[\s_-]?key|password|credential)\b/i,
84
+ tools: [
85
+ { toolName: "mneme.forensics.vulns", argsTemplate: {}, confidence: 0.85 },
86
+ { toolName: "mneme.apoptosis.detect", argsTemplate: {}, confidence: 0.75 },
87
+ { toolName: "mneme.antivirus.scan", argsTemplate: {}, confidence: 0.7 },
88
+ ],
89
+ reason: "secret/credential keyword → vulns + apoptosis + antivirus scan immediately",
90
+ },
91
+ {
92
+ id: "security_cve_vuln",
93
+ eventKinds: ["git_commit", "file_save", "terminal_command"],
94
+ regex: /\b(cve-\d+|vulnerabilit|exploit|xss|sql injection|csrf|rce)\b/i,
95
+ tools: [
96
+ { toolName: "mneme.forensics.vulns", argsTemplate: {}, confidence: 0.9 },
97
+ { toolName: "mneme.deps.oracle", argsTemplate: {}, confidence: 0.7 },
98
+ ],
99
+ reason: "CVE / vuln class keyword → forensics.vulns + dep-oracle",
100
+ },
101
+ {
102
+ id: "security_auth_file",
103
+ eventKinds: ["file_save", "git_commit"],
104
+ regex: /(^|\/)(auth|login|session|crypto|password)\w*\.(ts|tsx|js|py|go|rs|java)/i,
105
+ tools: [
106
+ { toolName: "mneme.forensics.vulns", argsTemplate: {}, confidence: 0.7 },
107
+ { toolName: "mneme.premortem", argsTemplate: { change: "edited auth-adjacent file" }, confidence: 0.55 },
108
+ ],
109
+ reason: "auth-adjacent file edit → run vulns + premortem (high-blast-radius area)",
110
+ },
111
+ // ─── file-type hints ────────────────────────────────────────────────
112
+ {
113
+ id: "file_test_save",
114
+ eventKinds: ["file_save"],
115
+ regex: /\.(test|spec)\.(ts|tsx|js|jsx|py|go)$/,
116
+ tools: [
117
+ { toolName: "mneme.ask", argsTemplate: { question: "is this test coverage complete" }, confidence: 0.5 },
118
+ ],
119
+ reason: "test-file save → check coverage gap",
120
+ },
121
+ {
122
+ id: "file_md_save",
123
+ eventKinds: ["file_save"],
124
+ regex: /\.(md|mdx|rst|txt)$/i,
125
+ tools: [
126
+ { toolName: "mneme.antivirus.scan", argsTemplate: {}, confidence: 0.45 },
127
+ ],
128
+ reason: "markdown/docs save → run antivirus to catch hallucinated tool names + phantom files",
129
+ },
130
+ {
131
+ id: "file_config_save",
132
+ eventKinds: ["file_save"],
133
+ regex: /(package\.json|tsconfig\.json|\.env|docker[Ff]ile|\.yml|\.yaml)$/,
134
+ tools: [
135
+ { toolName: "mneme.deps.oracle", argsTemplate: {}, confidence: 0.6 },
136
+ { toolName: "mneme.premortem", argsTemplate: { change: "config file changed" }, confidence: 0.6 },
137
+ ],
138
+ reason: "config file save → dep-oracle + premortem (config drift is high-blast-radius)",
139
+ },
140
+ // ─── clipboard handoff signals ─────────────────────────────────────
141
+ {
142
+ id: "clipboard_handoff_claude",
143
+ eventKinds: ["clipboard"],
144
+ regex: /\b(check this with|send to|paste in|ask) (claude|claude code|claude\.ai|chatgpt|gpt|cursor|copilot)\b/i,
145
+ tools: [
146
+ { toolName: "mneme.handoff.universal", argsTemplate: {}, confidence: 0.95 },
147
+ ],
148
+ reason: "clipboard handoff intent → auto-fire handoff.universal so paste is 1-step not 10-step",
149
+ },
150
+ {
151
+ id: "clipboard_authenticity_image",
152
+ eventKinds: ["clipboard", "user_chat"],
153
+ // No \b word boundary — Thai isn't ASCII word-boundary friendly; we want
154
+ // these terms to match as substrings inside longer chat utterances.
155
+ regex: /(authentic|real or fake|ของแท้|ตรวจของแท้|ของจริง|fake check)/i,
156
+ tools: [
157
+ { toolName: "mneme.caption.sever", argsTemplate: {}, confidence: 0.9 },
158
+ { toolName: "mneme.provenance.evaluate", argsTemplate: {}, confidence: 0.7 },
159
+ ],
160
+ reason: "authenticity query (multilingual EN+TH) → CAPTION SEVERANCE PROTOCOL + provenance check",
161
+ },
162
+ {
163
+ id: "shell_dangerous_destructive",
164
+ eventKinds: ["terminal_command"],
165
+ regex: /\b(rm\s+-rf|git\s+reset\s+--hard|drop\s+(table|database)|truncate\s+table)\b/i,
166
+ tools: [
167
+ { toolName: "mneme.premortem", argsTemplate: { change: "destructive shell command" }, confidence: 0.95 },
168
+ { toolName: "mneme.consequence.record", argsTemplate: { cmd: "destructive" }, confidence: 0.7 },
169
+ ],
170
+ reason: "destructive shell command → premortem MUST run first; consequence record for audit",
171
+ },
172
+ // ─── shell command intent ──────────────────────────────────────────
173
+ {
174
+ id: "shell_npm_install",
175
+ eventKinds: ["terminal_command"],
176
+ regex: /^\s*(npm|pnpm|yarn)\s+(i|install|add)\b/i,
177
+ tools: [
178
+ { toolName: "mneme.deps.oracle", argsTemplate: {}, confidence: 0.85 },
179
+ { toolName: "mneme.antivirus.scan", argsTemplate: {}, confidence: 0.55 },
180
+ ],
181
+ reason: "package install → predict dep fate + antivirus the lock-file diff",
182
+ },
183
+ {
184
+ id: "shell_git_push",
185
+ eventKinds: ["terminal_command"],
186
+ regex: /^\s*git\s+push\b/i,
187
+ tools: [
188
+ { toolName: "mneme.premortem", argsTemplate: { change: "git push" }, confidence: 0.7 },
189
+ { toolName: "mneme.guard", argsTemplate: {}, confidence: 0.65 },
190
+ ],
191
+ reason: "git push → premortem the push + run guard on the staged diff",
192
+ },
193
+ {
194
+ id: "shell_test_run",
195
+ eventKinds: ["terminal_command"],
196
+ regex: /\b(npm\s+test|vitest|jest|pytest|go\s+test|cargo\s+test)\b/i,
197
+ tools: [
198
+ { toolName: "mneme.consequence.record", argsTemplate: { cmd: "test run" }, confidence: 0.5 },
199
+ ],
200
+ reason: "test run → record consequence so we can correlate green/red with later regressions",
201
+ },
202
+ // ─── user-chat intent (Thai + English) ────────────────────────────
203
+ {
204
+ id: "chat_what_changed",
205
+ eventKinds: ["user_chat"],
206
+ regex: /\b(what changed|what's new|มีอะไรใหม่|มีอะไรเปลี่ยน|recent change)\b/i,
207
+ tools: [
208
+ { toolName: "mneme.whats_new", argsTemplate: {}, confidence: 0.85 },
209
+ { toolName: "mneme.status", argsTemplate: {}, confidence: 0.6 },
210
+ ],
211
+ reason: "what-changed query → whats_new + status (multilingual EN+TH)",
212
+ },
213
+ {
214
+ id: "chat_why_does_this_exist",
215
+ eventKinds: ["user_chat"],
216
+ regex: /\b(why does (this|it) exist|why was this added|ทำไมต้องมี|ทำไมเขียนแบบนี้)\b/i,
217
+ tools: [
218
+ { toolName: "mneme.why", argsTemplate: {}, confidence: 0.9 },
219
+ { toolName: "mneme.lineage", argsTemplate: {}, confidence: 0.6 },
220
+ ],
221
+ reason: "why-does-this-exist query → why + lineage (multilingual EN+TH)",
222
+ },
223
+ {
224
+ id: "chat_who_knows",
225
+ eventKinds: ["user_chat"],
226
+ regex: /\b(who knows|who wrote|who can review|ใครรู้เรื่อง|ใครเขียน)\b/i,
227
+ tools: [
228
+ { toolName: "mneme.who_knows", argsTemplate: {}, confidence: 0.9 },
229
+ { toolName: "mneme.atrophy", argsTemplate: {}, confidence: 0.5 },
230
+ ],
231
+ reason: "who-knows query → who_knows + atrophy (multilingual EN+TH)",
232
+ },
233
+ ];
234
+ /** Match an event against ALL patterns; return ranked predictions. */
235
+ export function matchEventPatterns(input) {
236
+ const patterns = input.patterns ?? BUILTIN_PATTERNS;
237
+ const topN = input.topN ?? 5;
238
+ const byTool = new Map();
239
+ for (const p of patterns) {
240
+ if (!p.eventKinds.includes(input.event.kind))
241
+ continue;
242
+ if (!p.regex.test(input.event.text))
243
+ continue;
244
+ for (const t of p.tools) {
245
+ const prev = byTool.get(t.toolName);
246
+ if (prev) {
247
+ // Multi-pattern hit: max-confidence wins; accumulate matched IDs.
248
+ if (t.confidence > prev.confidence) {
249
+ prev.confidence = t.confidence;
250
+ prev.argsTemplate = t.argsTemplate;
251
+ }
252
+ if (!prev.matchedPatterns.includes(p.id))
253
+ prev.matchedPatterns.push(p.id);
254
+ }
255
+ else {
256
+ byTool.set(t.toolName, {
257
+ toolName: t.toolName,
258
+ argsTemplate: t.argsTemplate,
259
+ confidence: t.confidence,
260
+ matchedPatterns: [p.id],
261
+ });
262
+ }
263
+ }
264
+ }
265
+ return Array.from(byTool.values())
266
+ .sort((a, b) => b.confidence - a.confidence || a.toolName.localeCompare(b.toolName))
267
+ .slice(0, topN);
268
+ }
269
+ function canon(v) {
270
+ if (v === null || typeof v !== "object")
271
+ return JSON.stringify(v);
272
+ if (Array.isArray(v))
273
+ return "[" + v.map(canon).join(",") + "]";
274
+ const keys = Object.keys(v).sort();
275
+ return "{" + keys.map((k) => JSON.stringify(k) + ":" + canon(v[k])).join(",") + "}";
276
+ }
277
+ function defaultSecret() {
278
+ return process.env["MNEME_EVENT_PATTERN_SECRET"] || `mneme-event-pattern-v${PROTOCOL_VERSION}`;
279
+ }
280
+ function hmacHex(body, secret) {
281
+ return createHmac("sha256", secret).update(canon(body)).digest("hex");
282
+ }
283
+ function safeEqHex(a, b) {
284
+ try {
285
+ return timingSafeEqual(Buffer.from(a, "hex"), Buffer.from(b, "hex"));
286
+ }
287
+ catch {
288
+ return false;
289
+ }
290
+ }
291
+ export function reportMatch(input) {
292
+ const predictions = matchEventPatterns({ event: input.event, topN: input.topN });
293
+ const matched = new Set();
294
+ for (const p of predictions)
295
+ for (const id of p.matchedPatterns)
296
+ matched.add(id);
297
+ const body = {
298
+ v: PROTOCOL_VERSION,
299
+ event: input.event,
300
+ predictions,
301
+ patternsConsidered: BUILTIN_PATTERNS.length,
302
+ patternsMatched: matched.size,
303
+ };
304
+ const sig = hmacHex(body, input.secret ?? defaultSecret());
305
+ return { ...body, sig };
306
+ }
307
+ export function verifyReport(r, secret) {
308
+ const { sig, ...body } = r;
309
+ return safeEqHex(hmacHex(body, secret ?? defaultSecret()), sig);
310
+ }
311
+ export function listBuiltinPatterns() {
312
+ return [...BUILTIN_PATTERNS];
313
+ }
314
+ export function formatPredictionLine(p) {
315
+ const conf = (p.confidence * 100).toFixed(0);
316
+ return `⚡ ${p.toolName} · ${conf}% · matched=[${p.matchedPatterns.join(",")}]`;
317
+ }
318
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/event_pattern_match/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AAEH,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE1D,MAAM,gBAAgB,GAAG,CAAU,CAAC;AA8BpC;;;;GAIG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAA+B;IAC1D,uEAAuE;IACvE;QACE,EAAE,EAAE,mBAAmB;QACvB,UAAU,EAAE,CAAC,YAAY,CAAC;QAC1B,KAAK,EAAE,iBAAiB;QACxB,KAAK,EAAE;YACL,EAAE,QAAQ,EAAE,4BAA4B,EAAE,YAAY,EAAE,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE;YAC7E,EAAE,QAAQ,EAAE,iBAAiB,EAAE,YAAY,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE;SACzF;QACD,MAAM,EAAE,4EAA4E;KACrF;IACD;QACE,EAAE,EAAE,oBAAoB;QACxB,UAAU,EAAE,CAAC,YAAY,CAAC;QAC1B,KAAK,EAAE,kBAAkB;QACzB,KAAK,EAAE;YACL,EAAE,QAAQ,EAAE,0BAA0B,EAAE,YAAY,EAAE,EAAE,GAAG,EAAE,aAAa,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE;YAC/F,EAAE,QAAQ,EAAE,eAAe,EAAE,YAAY,EAAE,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE;SAClE;QACD,MAAM,EAAE,6EAA6E;KACtF;IACD;QACE,EAAE,EAAE,sBAAsB;QAC1B,UAAU,EAAE,CAAC,YAAY,CAAC;QAC1B,KAAK,EAAE,yCAAyC;QAChD,KAAK,EAAE;YACL,EAAE,QAAQ,EAAE,0BAA0B,EAAE,YAAY,EAAE,EAAE,GAAG,EAAE,iBAAiB,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE;SACpG;QACD,MAAM,EAAE,uEAAuE;KAChF;IAED,uEAAuE;IACvE;QACE,EAAE,EAAE,qBAAqB;QACzB,UAAU,EAAE,CAAC,YAAY,EAAE,WAAW,CAAC;QACvC,KAAK,EAAE,iEAAiE;QACxE,KAAK,EAAE;YACL,EAAE,QAAQ,EAAE,uBAAuB,EAAE,YAAY,EAAE,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE;YACzE,EAAE,QAAQ,EAAE,wBAAwB,EAAE,YAAY,EAAE,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE;YAC1E,EAAE,QAAQ,EAAE,sBAAsB,EAAE,YAAY,EAAE,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE;SACxE;QACD,MAAM,EAAE,4EAA4E;KACrF;IACD;QACE,EAAE,EAAE,mBAAmB;QACvB,UAAU,EAAE,CAAC,YAAY,EAAE,WAAW,EAAE,kBAAkB,CAAC;QAC3D,KAAK,EAAE,gEAAgE;QACvE,KAAK,EAAE;YACL,EAAE,QAAQ,EAAE,uBAAuB,EAAE,YAAY,EAAE,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE;YACxE,EAAE,QAAQ,EAAE,mBAAmB,EAAE,YAAY,EAAE,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE;SACrE;QACD,MAAM,EAAE,yDAAyD;KAClE;IACD;QACE,EAAE,EAAE,oBAAoB;QACxB,UAAU,EAAE,CAAC,WAAW,EAAE,YAAY,CAAC;QACvC,KAAK,EAAE,2EAA2E;QAClF,KAAK,EAAE;YACL,EAAE,QAAQ,EAAE,uBAAuB,EAAE,YAAY,EAAE,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE;YACxE,EAAE,QAAQ,EAAE,iBAAiB,EAAE,YAAY,EAAE,EAAE,MAAM,EAAE,2BAA2B,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE;SACzG;QACD,MAAM,EAAE,0EAA0E;KACnF;IAED,uEAAuE;IACvE;QACE,EAAE,EAAE,gBAAgB;QACpB,UAAU,EAAE,CAAC,WAAW,CAAC;QACzB,KAAK,EAAE,uCAAuC;QAC9C,KAAK,EAAE;YACL,EAAE,QAAQ,EAAE,WAAW,EAAE,YAAY,EAAE,EAAE,QAAQ,EAAE,gCAAgC,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE;SACzG;QACD,MAAM,EAAE,qCAAqC;KAC9C;IACD;QACE,EAAE,EAAE,cAAc;QAClB,UAAU,EAAE,CAAC,WAAW,CAAC;QACzB,KAAK,EAAE,sBAAsB;QAC7B,KAAK,EAAE;YACL,EAAE,QAAQ,EAAE,sBAAsB,EAAE,YAAY,EAAE,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE;SACzE;QACD,MAAM,EAAE,qFAAqF;KAC9F;IACD;QACE,EAAE,EAAE,kBAAkB;QACtB,UAAU,EAAE,CAAC,WAAW,CAAC;QACzB,KAAK,EAAE,kEAAkE;QACzE,KAAK,EAAE;YACL,EAAE,QAAQ,EAAE,mBAAmB,EAAE,YAAY,EAAE,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE;YACpE,EAAE,QAAQ,EAAE,iBAAiB,EAAE,YAAY,EAAE,EAAE,MAAM,EAAE,qBAAqB,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE;SAClG;QACD,MAAM,EAAE,+EAA+E;KACxF;IAED,sEAAsE;IACtE;QACE,EAAE,EAAE,0BAA0B;QAC9B,UAAU,EAAE,CAAC,WAAW,CAAC;QACzB,KAAK,EAAE,wGAAwG;QAC/G,KAAK,EAAE;YACL,EAAE,QAAQ,EAAE,yBAAyB,EAAE,YAAY,EAAE,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE;SAC5E;QACD,MAAM,EAAE,uFAAuF;KAChG;IACD;QACE,EAAE,EAAE,8BAA8B;QAClC,UAAU,EAAE,CAAC,WAAW,EAAE,WAAW,CAAC;QACtC,yEAAyE;QACzE,oEAAoE;QACpE,KAAK,EAAE,gEAAgE;QACvE,KAAK,EAAE;YACL,EAAE,QAAQ,EAAE,qBAAqB,EAAE,YAAY,EAAE,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE;YACtE,EAAE,QAAQ,EAAE,2BAA2B,EAAE,YAAY,EAAE,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE;SAC7E;QACD,MAAM,EAAE,yFAAyF;KAClG;IACD;QACE,EAAE,EAAE,6BAA6B;QACjC,UAAU,EAAE,CAAC,kBAAkB,CAAC;QAChC,KAAK,EAAE,+EAA+E;QACtF,KAAK,EAAE;YACL,EAAE,QAAQ,EAAE,iBAAiB,EAAE,YAAY,EAAE,EAAE,MAAM,EAAE,2BAA2B,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE;YACxG,EAAE,QAAQ,EAAE,0BAA0B,EAAE,YAAY,EAAE,EAAE,GAAG,EAAE,aAAa,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE;SAChG;QACD,MAAM,EAAE,oFAAoF;KAC7F;IAED,sEAAsE;IACtE;QACE,EAAE,EAAE,mBAAmB;QACvB,UAAU,EAAE,CAAC,kBAAkB,CAAC;QAChC,KAAK,EAAE,0CAA0C;QACjD,KAAK,EAAE;YACL,EAAE,QAAQ,EAAE,mBAAmB,EAAE,YAAY,EAAE,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE;YACrE,EAAE,QAAQ,EAAE,sBAAsB,EAAE,YAAY,EAAE,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE;SACzE;QACD,MAAM,EAAE,mEAAmE;KAC5E;IACD;QACE,EAAE,EAAE,gBAAgB;QACpB,UAAU,EAAE,CAAC,kBAAkB,CAAC;QAChC,KAAK,EAAE,mBAAmB;QAC1B,KAAK,EAAE;YACL,EAAE,QAAQ,EAAE,iBAAiB,EAAE,YAAY,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE;YACtF,EAAE,QAAQ,EAAE,aAAa,EAAE,YAAY,EAAE,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE;SAChE;QACD,MAAM,EAAE,8DAA8D;KACvE;IACD;QACE,EAAE,EAAE,gBAAgB;QACpB,UAAU,EAAE,CAAC,kBAAkB,CAAC;QAChC,KAAK,EAAE,6DAA6D;QACpE,KAAK,EAAE;YACL,EAAE,QAAQ,EAAE,0BAA0B,EAAE,YAAY,EAAE,EAAE,GAAG,EAAE,UAAU,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE;SAC7F;QACD,MAAM,EAAE,oFAAoF;KAC7F;IAED,qEAAqE;IACrE;QACE,EAAE,EAAE,mBAAmB;QACvB,UAAU,EAAE,CAAC,WAAW,CAAC;QACzB,KAAK,EAAE,uEAAuE;QAC9E,KAAK,EAAE;YACL,EAAE,QAAQ,EAAE,iBAAiB,EAAE,YAAY,EAAE,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE;YACnE,EAAE,QAAQ,EAAE,cAAc,EAAE,YAAY,EAAE,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE;SAChE;QACD,MAAM,EAAE,8DAA8D;KACvE;IACD;QACE,EAAE,EAAE,0BAA0B;QAC9B,UAAU,EAAE,CAAC,WAAW,CAAC;QACzB,KAAK,EAAE,+EAA+E;QACtF,KAAK,EAAE;YACL,EAAE,QAAQ,EAAE,WAAW,EAAE,YAAY,EAAE,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE;YAC5D,EAAE,QAAQ,EAAE,eAAe,EAAE,YAAY,EAAE,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE;SACjE;QACD,MAAM,EAAE,gEAAgE;KACzE;IACD;QACE,EAAE,EAAE,gBAAgB;QACpB,UAAU,EAAE,CAAC,WAAW,CAAC;QACzB,KAAK,EAAE,iEAAiE;QACxE,KAAK,EAAE;YACL,EAAE,QAAQ,EAAE,iBAAiB,EAAE,YAAY,EAAE,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE;YAClE,EAAE,QAAQ,EAAE,eAAe,EAAE,YAAY,EAAE,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE;SACjE;QACD,MAAM,EAAE,4DAA4D;KACrE;CACF,CAAC;AAEF,sEAAsE;AACtE,MAAM,UAAU,kBAAkB,CAAC,KAIlC;IACC,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,IAAI,gBAAgB,CAAC;IACpD,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,IAAI,CAAC,CAAC;IAC7B,MAAM,MAAM,GAAG,IAAI,GAAG,EAA8B,CAAC;IACrD,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QACzB,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC;YAAE,SAAS;QACvD,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC;YAAE,SAAS;QAC9C,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC;YACxB,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;YACpC,IAAI,IAAI,EAAE,CAAC;gBACT,kEAAkE;gBAClE,IAAI,CAAC,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;oBACnC,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU,CAAC;oBAC/B,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC,YAAY,CAAC;gBACrC,CAAC;gBACD,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;oBAAE,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAC5E,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE;oBACrB,QAAQ,EAAE,CAAC,CAAC,QAAQ;oBACpB,YAAY,EAAE,CAAC,CAAC,YAAY;oBAC5B,UAAU,EAAE,CAAC,CAAC,UAAU;oBACxB,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;iBACxB,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;SAC/B,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;SACnF,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;AACpB,CAAC;AAWD,SAAS,KAAK,CAAC,CAAU;IACvB,IAAI,CAAC,KAAK,IAAI,IAAI,OAAO,CAAC,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IAClE,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;QAAE,OAAO,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;IAChE,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAA4B,CAAC,CAAC,IAAI,EAAE,CAAC;IAC9D,OAAO,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,KAAK,CAAE,CAA6B,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;AACnH,CAAC;AAED,SAAS,aAAa;IACpB,OAAO,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,IAAI,wBAAwB,gBAAgB,EAAE,CAAC;AACjG,CAAC;AAED,SAAS,OAAO,CAAC,IAAa,EAAE,MAAc;IAC5C,OAAO,UAAU,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACxE,CAAC;AAED,SAAS,SAAS,CAAC,CAAS,EAAE,CAAS;IACrC,IAAI,CAAC;QAAC,OAAO,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;IAAC,CAAC;IAC7E,MAAM,CAAC;QAAC,OAAO,KAAK,CAAC;IAAC,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,KAA+D;IACzF,MAAM,WAAW,GAAG,kBAAkB,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;IACjF,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAClC,KAAK,MAAM,CAAC,IAAI,WAAW;QAAE,KAAK,MAAM,EAAE,IAAI,CAAC,CAAC,eAAe;YAAE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACjF,MAAM,IAAI,GAA6B;QACrC,CAAC,EAAE,gBAAgB;QACnB,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,WAAW;QACX,kBAAkB,EAAE,gBAAgB,CAAC,MAAM;QAC3C,eAAe,EAAE,OAAO,CAAC,IAAI;KAC9B,CAAC;IACF,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,MAAM,IAAI,aAAa,EAAE,CAAC,CAAC;IAC3D,OAAO,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,CAAc,EAAE,MAAe;IAC1D,MAAM,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,GAAG,CAAC,CAAC;IAC3B,OAAO,SAAS,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,IAAI,aAAa,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;AAClE,CAAC;AAED,MAAM,UAAU,mBAAmB;IACjC,OAAO,CAAC,GAAG,gBAAgB,CAAC,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,CAAqB;IACxD,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,UAAU,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAC7C,OAAO,KAAK,CAAC,CAAC,QAAQ,MAAM,IAAI,gBAAgB,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;AACjF,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=hippocampus_dreams.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hippocampus_dreams.test.d.ts","sourceRoot":"","sources":["../../src/hippocampus_dreams/hippocampus_dreams.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,106 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { consolidateMemory, verifyConsolidation, formatConsolidationLine } from "./index.js";
3
+ const SECRET = "hippocampus-test-secret-997744";
4
+ function obs(eventSig, toolName, ts, eventKind = "git_commit") {
5
+ return { eventKind, eventSig, toolName, args: { ts }, ts };
6
+ }
7
+ describe("v2.19.23 HIPPOCAMPUS-DREAMS · consolidateMemory", () => {
8
+ it("empty observations -> zero rules", () => {
9
+ const r = consolidateMemory({ yesterdayObservations: [], consolidatedAt: 0, secret: SECRET });
10
+ expect(r.promotedRules.length).toBe(0);
11
+ expect(r.totalObservations).toBe(0);
12
+ expect(r.crystallisationRatio).toBe(0);
13
+ });
14
+ it("patterns fired >= threshold (3) promoted; below threshold dropped", () => {
15
+ const observations = [
16
+ obs("sigA", "mneme.ask", 1),
17
+ obs("sigA", "mneme.ask", 2),
18
+ obs("sigA", "mneme.ask", 3), // 3 times -> promoted
19
+ obs("sigA", "mneme.why", 4),
20
+ obs("sigA", "mneme.why", 5), // 2 times -> not promoted (below threshold 3)
21
+ obs("sigB", "mneme.status", 6), // 1 time -> not promoted
22
+ ];
23
+ const r = consolidateMemory({ yesterdayObservations: observations, consolidatedAt: 0, secret: SECRET });
24
+ expect(r.promotedRules.length).toBe(1);
25
+ expect(r.promotedRules[0].toolName).toBe("mneme.ask");
26
+ expect(r.promotedRules[0].occurrenceCount).toBe(3);
27
+ });
28
+ it("priorConfidence = occurrenceCount / total observations for eventSig", () => {
29
+ const observations = [
30
+ obs("sigA", "mneme.ask", 1),
31
+ obs("sigA", "mneme.ask", 2),
32
+ obs("sigA", "mneme.ask", 3),
33
+ obs("sigA", "mneme.why", 4),
34
+ obs("sigA", "mneme.why", 5),
35
+ ];
36
+ const r = consolidateMemory({ yesterdayObservations: observations, consolidatedAt: 0, secret: SECRET });
37
+ // 3 out of 5 total observations for sigA -> 0.6
38
+ const ask = r.promotedRules.find((p) => p.toolName === "mneme.ask");
39
+ expect(ask.priorConfidence).toBeCloseTo(3 / 5, 5);
40
+ });
41
+ it("custom threshold respected (threshold=1 promotes everything)", () => {
42
+ const observations = [obs("sigA", "t1", 1), obs("sigB", "t2", 2)];
43
+ const r = consolidateMemory({ yesterdayObservations: observations, consolidatedAt: 0, promotionThreshold: 1, secret: SECRET });
44
+ expect(r.promotedRules.length).toBe(2);
45
+ });
46
+ it("sorted by priorConfidence desc", () => {
47
+ const observations = [
48
+ obs("sigA", "t_low", 1), obs("sigA", "t_low", 2), obs("sigA", "t_low", 3), // 3/10
49
+ obs("sigA", "t_high", 4), obs("sigA", "t_high", 5), obs("sigA", "t_high", 6), obs("sigA", "t_high", 7),
50
+ obs("sigA", "t_high", 8), obs("sigA", "t_high", 9), obs("sigA", "t_high", 10), // 7/10
51
+ ];
52
+ const r = consolidateMemory({ yesterdayObservations: observations, consolidatedAt: 0, secret: SECRET });
53
+ expect(r.promotedRules.length).toBe(2);
54
+ expect(r.promotedRules[0].toolName).toBe("t_high");
55
+ });
56
+ it("crystallisationRatio = promoted / uniqueEventSigs", () => {
57
+ const observations = [
58
+ obs("sigA", "t1", 1), obs("sigA", "t1", 2), obs("sigA", "t1", 3),
59
+ obs("sigB", "t2", 4),
60
+ ];
61
+ const r = consolidateMemory({ yesterdayObservations: observations, consolidatedAt: 0, secret: SECRET });
62
+ expect(r.uniqueEventSigs).toBe(2);
63
+ expect(r.promotedRules.length).toBe(1);
64
+ expect(r.crystallisationRatio).toBeCloseTo(1 / 2, 5);
65
+ });
66
+ it("argsTemplate captured from latest occurrence", () => {
67
+ const observations = [
68
+ { eventKind: "git_commit", eventSig: "sigA", toolName: "mneme.ask", args: { v: "v1" }, ts: 1 },
69
+ { eventKind: "git_commit", eventSig: "sigA", toolName: "mneme.ask", args: { v: "v2" }, ts: 2 },
70
+ { eventKind: "git_commit", eventSig: "sigA", toolName: "mneme.ask", args: { v: "v3" }, ts: 3 },
71
+ ];
72
+ const r = consolidateMemory({ yesterdayObservations: observations, consolidatedAt: 0, secret: SECRET });
73
+ expect(r.promotedRules[0].argsTemplate["v"]).toBe("v3");
74
+ });
75
+ it("HMAC sig verifies on untampered; rejects tamper", () => {
76
+ const observations = [obs("sigA", "t1", 1), obs("sigA", "t1", 2), obs("sigA", "t1", 3)];
77
+ const r = consolidateMemory({ yesterdayObservations: observations, consolidatedAt: 0, secret: SECRET });
78
+ expect(verifyConsolidation(r, SECRET)).toBe(true);
79
+ const tampered = { ...r, totalObservations: 9999 };
80
+ expect(verifyConsolidation(tampered, SECRET)).toBe(false);
81
+ });
82
+ it("MEASURED 100% determinism: same input -> same sig (30 trials)", () => {
83
+ const observations = [
84
+ obs("sigA", "t1", 1), obs("sigA", "t1", 2), obs("sigA", "t1", 3),
85
+ obs("sigB", "t2", 4), obs("sigB", "t2", 5), obs("sigB", "t2", 6),
86
+ ];
87
+ const input = { yesterdayObservations: observations, consolidatedAt: 1_000_000, secret: SECRET };
88
+ const firstSig = consolidateMemory(input).sig;
89
+ let allEqual = true;
90
+ for (let i = 0; i < 30; i++) {
91
+ if (consolidateMemory(input).sig !== firstSig) {
92
+ allEqual = false;
93
+ break;
94
+ }
95
+ }
96
+ expect(allEqual).toBe(true);
97
+ });
98
+ });
99
+ describe("v2.19.23 HIPPOCAMPUS-DREAMS · formatter", () => {
100
+ it("formatConsolidationLine renders digest", () => {
101
+ const r = consolidateMemory({ yesterdayObservations: [obs("sigA", "t1", 1)], consolidatedAt: 0, secret: SECRET });
102
+ const line = formatConsolidationLine(r);
103
+ expect(line).toContain("HIPPOCAMPUS");
104
+ });
105
+ });
106
+ //# sourceMappingURL=hippocampus_dreams.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hippocampus_dreams.test.js","sourceRoot":"","sources":["../../src/hippocampus_dreams/hippocampus_dreams.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,79 @@
1
+ /**
2
+ * v2.19.23 — MNEME HIPPOCAMPUS-DREAMS (organ #5 of LIMBIC)
3
+ *
4
+ * "ตอน user หลับ daemon ฝัน → ฝึก reflex จาก yesterday"
5
+ *
6
+ * Diagnosis: v2.19.22 REFLEX learns ONLY from same-day observations.
7
+ * Patterns from last week / last month are LOST when the daemon is
8
+ * restarted (in-memory) or when the cache GCs (TTL expired).
9
+ * v2.19.14 DREAMS exists as a cycle but is not wired to consolidate
10
+ * into REFLEX patterns.
11
+ *
12
+ * Fix: HIPPOCAMPUS-DREAMS reads yesterday's pheromone trail, extracts
13
+ * stable patterns (event sig + tool that fired >= K times), and
14
+ * PROMOTES them to BUILTIN_RULES-style priors. Daemon calls this
15
+ * during the dream-tier idle period. The next day's REFLEX starts
16
+ * warm, not cold.
17
+ *
18
+ * Composes onto:
19
+ * - v2.19.22 REFLEX (PheromoneRecord shape; eventCacheKey)
20
+ * - v2.19.23 SPINAL_REFLEX (output is BuiltinReflexRule)
21
+ * - v2.19.14 DREAMS (caller scheduling pattern; dream cycle infra)
22
+ * - v2.19.10 PROOF-CARRYING (consolidation creates HMAC certificate)
23
+ *
24
+ * Honest scope:
25
+ * - PURE FUNCTION consolidator. Caller schedules the call (e.g.,
26
+ * daemon idle hook at 03:00 local time).
27
+ * - Pattern threshold (default 3 occurrences for promotion) configurable.
28
+ * - Output is a list of new rules + a consolidation report; caller
29
+ * persists the rules to JSON and reloads on next boot.
30
+ * - HMAC-signed report so daemon can audit consolidation history.
31
+ */
32
+ declare const PROTOCOL_VERSION: 1;
33
+ export interface YesterdayObservation {
34
+ eventKind: "file_save" | "git_commit" | "terminal_command" | "user_chat" | "tool_call";
35
+ /** Stable signature over event (already hashed by REFLEX caller). */
36
+ eventSig: string;
37
+ /** Tool that followed this event. */
38
+ toolName: string;
39
+ /** Args (for argsTemplate of the promoted rule). */
40
+ args: Record<string, unknown>;
41
+ ts: number;
42
+ }
43
+ export interface PromotedRule {
44
+ id: string;
45
+ eventKind: YesterdayObservation["eventKind"];
46
+ eventSig: string;
47
+ toolName: string;
48
+ argsTemplate: Record<string, unknown>;
49
+ occurrenceCount: number;
50
+ /** confidence promoted from frequency in yesterday's trail. */
51
+ priorConfidence: number;
52
+ reason: string;
53
+ }
54
+ export interface ConsolidationReport {
55
+ v: typeof PROTOCOL_VERSION;
56
+ consolidatedAt: number;
57
+ totalObservations: number;
58
+ uniqueEventSigs: number;
59
+ promotedRules: PromotedRule[];
60
+ promotionThreshold: number;
61
+ /** promotedRules.length / uniqueEventSigs — ratio of patterns stable enough to keep. */
62
+ crystallisationRatio: number;
63
+ sig: string;
64
+ }
65
+ /**
66
+ * Consolidate yesterday's pheromone trail into promoted rules. Patterns
67
+ * that fired >= threshold times become priors for tomorrow's REFLEX
68
+ * cold-start. Returns an HMAC-signed report.
69
+ */
70
+ export declare function consolidateMemory(input: {
71
+ yesterdayObservations: YesterdayObservation[];
72
+ consolidatedAt?: number;
73
+ promotionThreshold?: number;
74
+ secret?: string;
75
+ }): ConsolidationReport;
76
+ export declare function verifyConsolidation(r: ConsolidationReport, secret?: string): boolean;
77
+ export declare function formatConsolidationLine(r: ConsolidationReport): string;
78
+ export {};
79
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/hippocampus_dreams/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAIH,QAAA,MAAM,gBAAgB,EAAG,CAAU,CAAC;AAGpC,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,WAAW,GAAG,YAAY,GAAG,kBAAkB,GAAG,WAAW,GAAG,WAAW,CAAC;IACvF,qEAAqE;IACrE,QAAQ,EAAE,MAAM,CAAC;IACjB,qCAAqC;IACrC,QAAQ,EAAE,MAAM,CAAC;IACjB,oDAAoD;IACpD,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,oBAAoB,CAAC,WAAW,CAAC,CAAC;IAC7C,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACtC,eAAe,EAAE,MAAM,CAAC;IACxB,+DAA+D;IAC/D,eAAe,EAAE,MAAM,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,mBAAmB;IAClC,CAAC,EAAE,OAAO,gBAAgB,CAAC;IAC3B,cAAc,EAAE,MAAM,CAAC;IACvB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,YAAY,EAAE,CAAC;IAC9B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,wFAAwF;IACxF,oBAAoB,EAAE,MAAM,CAAC;IAC7B,GAAG,EAAE,MAAM,CAAC;CACb;AAsBD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE;IACvC,qBAAqB,EAAE,oBAAoB,EAAE,CAAC;IAC9C,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GAAG,mBAAmB,CAmDtB;AAED,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,mBAAmB,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAGpF;AAED,wBAAgB,uBAAuB,CAAC,CAAC,EAAE,mBAAmB,GAAG,MAAM,CAGtE"}