@mneme-ai/core 2.19.23 → 2.19.25
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cosmic/aurelian_v1923.test.js +2 -1
- package/dist/cosmic/aurelian_v1923.test.js.map +1 -1
- package/dist/cosmic/aurelian_v1924.test.d.ts +2 -0
- package/dist/cosmic/aurelian_v1924.test.d.ts.map +1 -0
- package/dist/cosmic/aurelian_v1924.test.js +48 -0
- package/dist/cosmic/aurelian_v1924.test.js.map +1 -0
- package/dist/cosmic/aurelian_v1925.test.d.ts +2 -0
- package/dist/cosmic/aurelian_v1925.test.d.ts.map +1 -0
- package/dist/cosmic/aurelian_v1925.test.js +48 -0
- package/dist/cosmic/aurelian_v1925.test.js.map +1 -0
- package/dist/endocrine/endocrine.test.d.ts +2 -0
- package/dist/endocrine/endocrine.test.d.ts.map +1 -0
- package/dist/endocrine/endocrine.test.js +198 -0
- package/dist/endocrine/endocrine.test.js.map +1 -0
- package/dist/endocrine/index.d.ts +159 -0
- package/dist/endocrine/index.d.ts.map +1 -0
- package/dist/endocrine/index.js +277 -0
- package/dist/endocrine/index.js.map +1 -0
- package/dist/event_pattern_match/event_pattern_match.test.d.ts +2 -0
- package/dist/event_pattern_match/event_pattern_match.test.d.ts.map +1 -0
- package/dist/event_pattern_match/event_pattern_match.test.js +175 -0
- package/dist/event_pattern_match/event_pattern_match.test.js.map +1 -0
- package/dist/event_pattern_match/index.d.ts +99 -0
- package/dist/event_pattern_match/index.d.ts.map +1 -0
- package/dist/event_pattern_match/index.js +318 -0
- package/dist/event_pattern_match/index.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -1
- package/dist/sleep_training/index.d.ts +162 -0
- package/dist/sleep_training/index.d.ts.map +1 -0
- package/dist/sleep_training/index.js +218 -0
- package/dist/sleep_training/index.js.map +1 -0
- package/dist/sleep_training/sleep_training.test.d.ts +2 -0
- package/dist/sleep_training/sleep_training.test.d.ts.map +1 -0
- package/dist/sleep_training/sleep_training.test.js +296 -0
- package/dist/sleep_training/sleep_training.test.js.map +1 -0
- package/dist/tool_tier/index.d.ts +101 -0
- package/dist/tool_tier/index.d.ts.map +1 -0
- package/dist/tool_tier/index.js +228 -0
- package/dist/tool_tier/index.js.map +1 -0
- package/dist/tool_tier/tool_tier.test.d.ts +2 -0
- package/dist/tool_tier/tool_tier.test.d.ts.map +1 -0
- package/dist/tool_tier/tool_tier.test.js +133 -0
- package/dist/tool_tier/tool_tier.test.js.map +1 -0
- package/dist/whats_new.d.ts.map +1 -1
- package/dist/whats_new.js +16 -0
- package/dist/whats_new.js.map +1 -1
- package/dist/wrapper_genesis/index.d.ts.map +1 -1
- package/dist/wrapper_genesis/index.js +23 -0
- package/dist/wrapper_genesis/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,277 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v2.19.25 — MNEME ENDOCRINE (extends v2.19.23 HORMONAL)
|
|
3
|
+
*
|
|
4
|
+
* "Mneme อ่าน mood signals (commit tone, time-of-day, idle pattern,
|
|
5
|
+
* error frequency) → ผลิต 'hormones' ที่ทุก organ ฟัง → behavior
|
|
6
|
+
* ทั้งระบบเปลี่ยน"
|
|
7
|
+
* — user audit, 2026-05-17
|
|
8
|
+
*
|
|
9
|
+
* Diagnosis: v2.19.23 HORMONAL ships 3 generic signals (focus /
|
|
10
|
+
* fatigue / mood) — useful but abstract. The user wants the named
|
|
11
|
+
* biological vocabulary that maps DIRECTLY to behavior:
|
|
12
|
+
* - CORTISOL (stress) → reflex calmer, daemon quieter
|
|
13
|
+
* - DOPAMINE (flow) → reflex strengthens current pattern
|
|
14
|
+
* - MELATONIN (rest) → deep dream cycle, suppress all
|
|
15
|
+
* - OXYTOCIN (social) → surface TRINITY + CONFESSIONAL
|
|
16
|
+
*
|
|
17
|
+
* ENDOCRINE adds 4 NAMED hormones with explicit source detectors +
|
|
18
|
+
* cross-organ effect ladder. Each hormone has its own decay
|
|
19
|
+
* constant + clamped to [0,1]. Sources are pure-function classifiers
|
|
20
|
+
* over commit messages / clock / streak signals.
|
|
21
|
+
*
|
|
22
|
+
* Composes onto v2.19.23 HORMONAL (HormonalState is parallel; both
|
|
23
|
+
* coexist — generic and named — caller picks abstraction level).
|
|
24
|
+
*
|
|
25
|
+
* Honest scope:
|
|
26
|
+
* - PURE FUNCTION classifiers + state update. Caller hooks the actual
|
|
27
|
+
* signal sources (commit msg / shell error code / system clock /
|
|
28
|
+
* idle detect).
|
|
29
|
+
* - Hormone levels are CORRELATION not CAUSATION; the cross-organ
|
|
30
|
+
* "effects" are POLICIES, applied by each organ at its own pace.
|
|
31
|
+
* - HMAC-chained ledger so daemon can audit hormone evolution over
|
|
32
|
+
* time + roll back if a misclassified signal spikes a hormone wrongly.
|
|
33
|
+
*/
|
|
34
|
+
import { createHmac, timingSafeEqual } from "node:crypto";
|
|
35
|
+
const PROTOCOL_VERSION = 1;
|
|
36
|
+
const CLAMP = (x) => Math.max(0, Math.min(1, x));
|
|
37
|
+
function canon(v) {
|
|
38
|
+
if (v === null || typeof v !== "object")
|
|
39
|
+
return JSON.stringify(v);
|
|
40
|
+
if (Array.isArray(v))
|
|
41
|
+
return "[" + v.map(canon).join(",") + "]";
|
|
42
|
+
const keys = Object.keys(v).sort();
|
|
43
|
+
return "{" + keys.map((k) => JSON.stringify(k) + ":" + canon(v[k])).join(",") + "}";
|
|
44
|
+
}
|
|
45
|
+
function defaultSecret() {
|
|
46
|
+
return process.env["MNEME_ENDOCRINE_SECRET"] || `mneme-endocrine-v${PROTOCOL_VERSION}`;
|
|
47
|
+
}
|
|
48
|
+
function hmacHex(body, secret) {
|
|
49
|
+
return createHmac("sha256", secret).update(canon(body)).digest("hex");
|
|
50
|
+
}
|
|
51
|
+
function safeEqHex(a, b) {
|
|
52
|
+
try {
|
|
53
|
+
return timingSafeEqual(Buffer.from(a, "hex"), Buffer.from(b, "hex"));
|
|
54
|
+
}
|
|
55
|
+
catch {
|
|
56
|
+
return false;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
export function neutralEndocrineState(ts = 0) {
|
|
60
|
+
return { v: PROTOCOL_VERSION, cortisol: 0, dopamine: 0, melatonin: 0, oxytocin: 0, ts };
|
|
61
|
+
}
|
|
62
|
+
// ─── source detectors (pure functions over signal) ──────────────────
|
|
63
|
+
/**
|
|
64
|
+
* CORTISOL spikes from:
|
|
65
|
+
* - Stress keywords in commit msg (case-insensitive):
|
|
66
|
+
* fuck / damn / finally / broken / wtf / fix-fix / hotfix / rollback
|
|
67
|
+
* - Error count > 3 in 15-min window
|
|
68
|
+
* - Late-night activity (22:00..03:00)
|
|
69
|
+
*/
|
|
70
|
+
export function detectCortisolDelta(signals) {
|
|
71
|
+
let delta = 0;
|
|
72
|
+
if (signals.commitMessage) {
|
|
73
|
+
const m = signals.commitMessage.toLowerCase();
|
|
74
|
+
if (/\b(fuck|damn|finally|broken|wtf|fix[\s-]?fix|hotfix|rollback)\b/.test(m))
|
|
75
|
+
delta += 0.18;
|
|
76
|
+
}
|
|
77
|
+
if (typeof signals.errorCountWindow === "number" && signals.errorCountWindow > 3) {
|
|
78
|
+
delta += Math.min(0.25, signals.errorCountWindow * 0.04);
|
|
79
|
+
}
|
|
80
|
+
if (typeof signals.hourOfDay === "number") {
|
|
81
|
+
const h = signals.hourOfDay;
|
|
82
|
+
if (h >= 22 || h <= 3)
|
|
83
|
+
delta += 0.08;
|
|
84
|
+
}
|
|
85
|
+
return delta;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* DOPAMINE spikes from:
|
|
89
|
+
* - greenStreakCount >= 5 consecutive successful commits
|
|
90
|
+
* - testPassStreakCount >= 5
|
|
91
|
+
* - No errors in the last window
|
|
92
|
+
*/
|
|
93
|
+
export function detectDopamineDelta(signals) {
|
|
94
|
+
let delta = 0;
|
|
95
|
+
if (typeof signals.greenStreakCount === "number" && signals.greenStreakCount >= 5) {
|
|
96
|
+
delta += Math.min(0.2, (signals.greenStreakCount - 4) * 0.04);
|
|
97
|
+
}
|
|
98
|
+
if (typeof signals.testPassStreakCount === "number" && signals.testPassStreakCount >= 5) {
|
|
99
|
+
delta += Math.min(0.15, (signals.testPassStreakCount - 4) * 0.03);
|
|
100
|
+
}
|
|
101
|
+
if (typeof signals.errorCountWindow === "number" && signals.errorCountWindow === 0) {
|
|
102
|
+
delta += 0.05;
|
|
103
|
+
}
|
|
104
|
+
return delta;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* MELATONIN spikes from:
|
|
108
|
+
* - Late local hour (22:00 onwards; peaks at 02:00)
|
|
109
|
+
* - Sustained idle (>15min)
|
|
110
|
+
*/
|
|
111
|
+
export function detectMelatoninDelta(signals) {
|
|
112
|
+
let delta = 0;
|
|
113
|
+
if (typeof signals.hourOfDay === "number") {
|
|
114
|
+
const h = signals.hourOfDay;
|
|
115
|
+
// Peak melatonin around 02:00; high from 22:00 to 06:00.
|
|
116
|
+
if (h >= 22)
|
|
117
|
+
delta += (h - 21) * 0.04;
|
|
118
|
+
else if (h <= 5)
|
|
119
|
+
delta += (6 - h) * 0.04;
|
|
120
|
+
}
|
|
121
|
+
if (typeof signals.idleMs === "number" && signals.idleMs >= 15 * 60_000) {
|
|
122
|
+
delta += Math.min(0.2, (signals.idleMs / (15 * 60_000)) * 0.06);
|
|
123
|
+
}
|
|
124
|
+
return delta;
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* OXYTOCIN spikes from:
|
|
128
|
+
* - Co-Authored-By trailer in commit message
|
|
129
|
+
* - distinctAuthorsHour >= 2 (pair / mob session)
|
|
130
|
+
*/
|
|
131
|
+
export function detectOxytocinDelta(signals) {
|
|
132
|
+
let delta = 0;
|
|
133
|
+
if (signals.hasCoAuthor)
|
|
134
|
+
delta += 0.2;
|
|
135
|
+
if (signals.commitMessage && /co-authored-by:/i.test(signals.commitMessage))
|
|
136
|
+
delta += 0.1;
|
|
137
|
+
if (typeof signals.distinctAuthorsHour === "number" && signals.distinctAuthorsHour >= 2) {
|
|
138
|
+
delta += Math.min(0.15, (signals.distinctAuthorsHour - 1) * 0.05);
|
|
139
|
+
}
|
|
140
|
+
return delta;
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Half-life decay per hormone (different time constants reflect biology):
|
|
144
|
+
* cortisol — fast decay (stress passes)
|
|
145
|
+
* dopamine — fast decay (flow is fragile)
|
|
146
|
+
* melatonin — slow decay (sleep pressure builds + releases gradually)
|
|
147
|
+
* oxytocin — medium decay (social warmth lingers)
|
|
148
|
+
*/
|
|
149
|
+
const HALF_LIFE_MIN = {
|
|
150
|
+
cortisol: 30,
|
|
151
|
+
dopamine: 20,
|
|
152
|
+
melatonin: 90,
|
|
153
|
+
oxytocin: 60,
|
|
154
|
+
};
|
|
155
|
+
function decayFactor(elapsedMs, halfLifeMin) {
|
|
156
|
+
const minutes = elapsedMs / 60_000;
|
|
157
|
+
// Standard half-life decay: x * 0.5^(t/h)
|
|
158
|
+
return Math.pow(0.5, minutes / halfLifeMin);
|
|
159
|
+
}
|
|
160
|
+
/** Evolve endocrine state given new signals + elapsed time. */
|
|
161
|
+
export function produceFromSignals(input) {
|
|
162
|
+
const decayed = {
|
|
163
|
+
cortisol: input.state.cortisol * decayFactor(input.signals.elapsedMs, HALF_LIFE_MIN.cortisol),
|
|
164
|
+
dopamine: input.state.dopamine * decayFactor(input.signals.elapsedMs, HALF_LIFE_MIN.dopamine),
|
|
165
|
+
melatonin: input.state.melatonin * decayFactor(input.signals.elapsedMs, HALF_LIFE_MIN.melatonin),
|
|
166
|
+
oxytocin: input.state.oxytocin * decayFactor(input.signals.elapsedMs, HALF_LIFE_MIN.oxytocin),
|
|
167
|
+
};
|
|
168
|
+
return {
|
|
169
|
+
v: PROTOCOL_VERSION,
|
|
170
|
+
cortisol: CLAMP(decayed.cortisol + detectCortisolDelta(input.signals)),
|
|
171
|
+
dopamine: CLAMP(decayed.dopamine + detectDopamineDelta(input.signals)),
|
|
172
|
+
melatonin: CLAMP(decayed.melatonin + detectMelatoninDelta(input.signals)),
|
|
173
|
+
oxytocin: CLAMP(decayed.oxytocin + detectOxytocinDelta(input.signals)),
|
|
174
|
+
ts: input.nowMs ?? input.state.ts + input.signals.elapsedMs,
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Hormones → organ behavior. Pure function over current state.
|
|
179
|
+
*
|
|
180
|
+
* - cortisol high → reflex calmer (less aggressive); daemon quieter; suppress notifications
|
|
181
|
+
* - dopamine high → reflex strengthens current pattern (aggressive surface advanced tools)
|
|
182
|
+
* - melatonin high → deep dream cycle; SUPPRESS notifications (let user rest)
|
|
183
|
+
* - oxytocin high → surface TRINITY + CONFESSIONAL (collaboration tools)
|
|
184
|
+
*/
|
|
185
|
+
export function crossOrganEffects(state) {
|
|
186
|
+
// Baseline 0.5; adjusted by hormone balance.
|
|
187
|
+
let aggressiveness = 0.5;
|
|
188
|
+
aggressiveness -= state.cortisol * 0.4; // stress calms
|
|
189
|
+
aggressiveness += state.dopamine * 0.4; // flow energises
|
|
190
|
+
aggressiveness -= state.melatonin * 0.3; // sleep calms
|
|
191
|
+
aggressiveness = CLAMP(aggressiveness);
|
|
192
|
+
let quietness = 0.3;
|
|
193
|
+
quietness += state.cortisol * 0.4; // stress → quiet
|
|
194
|
+
quietness += state.melatonin * 0.5; // sleep → very quiet
|
|
195
|
+
quietness -= state.dopamine * 0.2; // flow → slightly chatty
|
|
196
|
+
quietness = CLAMP(quietness);
|
|
197
|
+
const dreamDepth = CLAMP(0.3 + state.melatonin * 0.7);
|
|
198
|
+
const notificationsSuppressed = state.melatonin >= 0.6 || state.cortisol >= 0.7;
|
|
199
|
+
const surfaceTrinityAndConfessional = state.oxytocin >= 0.4;
|
|
200
|
+
// Dominant mood
|
|
201
|
+
const levels = [
|
|
202
|
+
["cortisol", state.cortisol], ["dopamine", state.dopamine],
|
|
203
|
+
["melatonin", state.melatonin], ["oxytocin", state.oxytocin],
|
|
204
|
+
];
|
|
205
|
+
levels.sort((a, b) => b[1] - a[1]);
|
|
206
|
+
const top = levels[0];
|
|
207
|
+
const dominantMood = top[1] < 0.2 ? "calm baseline" : `${top[0]} dominant (${top[1].toFixed(2)})`;
|
|
208
|
+
return {
|
|
209
|
+
reflexAggressiveness: aggressiveness,
|
|
210
|
+
daemonQuietness: quietness,
|
|
211
|
+
dreamCycleDepth: dreamDepth,
|
|
212
|
+
notificationsSuppressed,
|
|
213
|
+
surfaceTrinityAndConfessional,
|
|
214
|
+
dominantMood,
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
export function emptyEndocrineLedger() {
|
|
218
|
+
return { v: PROTOCOL_VERSION, records: [] };
|
|
219
|
+
}
|
|
220
|
+
export function recordEndocrine(input) {
|
|
221
|
+
const prev = input.ledger.records[input.ledger.records.length - 1];
|
|
222
|
+
const body = {
|
|
223
|
+
v: PROTOCOL_VERSION,
|
|
224
|
+
ts: input.nowMs ?? input.state.ts,
|
|
225
|
+
state: input.state,
|
|
226
|
+
signals: input.signals,
|
|
227
|
+
prevSig: prev ? prev.sig : null,
|
|
228
|
+
};
|
|
229
|
+
const sig = hmacHex(body, input.secret ?? defaultSecret());
|
|
230
|
+
return { v: PROTOCOL_VERSION, records: [...input.ledger.records, { ...body, sig }] };
|
|
231
|
+
}
|
|
232
|
+
export function verifyEndocrineLedger(ledger, secret) {
|
|
233
|
+
const sec = secret ?? defaultSecret();
|
|
234
|
+
let prevSig = null;
|
|
235
|
+
for (let i = 0; i < ledger.records.length; i++) {
|
|
236
|
+
const r = ledger.records[i];
|
|
237
|
+
const { sig, ...body } = r;
|
|
238
|
+
if (body.prevSig !== prevSig)
|
|
239
|
+
return { ok: false, brokenAt: i, reason: `prevSig mismatch at step ${i}` };
|
|
240
|
+
if (!safeEqHex(hmacHex(body, sec), sig))
|
|
241
|
+
return { ok: false, brokenAt: i, reason: `HMAC mismatch at step ${i}` };
|
|
242
|
+
prevSig = sig;
|
|
243
|
+
}
|
|
244
|
+
return { ok: true };
|
|
245
|
+
}
|
|
246
|
+
export function formatEndocrineLine(s) {
|
|
247
|
+
return `🧪 ENDOCRINE · 🩸${s.cortisol.toFixed(2)} · ⚡${s.dopamine.toFixed(2)} · 🌙${s.melatonin.toFixed(2)} · 💞${s.oxytocin.toFixed(2)}`;
|
|
248
|
+
}
|
|
249
|
+
export function listHormoneInfo() {
|
|
250
|
+
return [
|
|
251
|
+
{
|
|
252
|
+
hormone: "cortisol",
|
|
253
|
+
emoji: "🩸",
|
|
254
|
+
sources: ["stress keywords in commit msg", "error count > 3 in 15min", "hour 22:00-03:00 (late night)"],
|
|
255
|
+
effects: ["reflex calmer", "daemon quieter", "notifications suppressed at >= 0.7"],
|
|
256
|
+
},
|
|
257
|
+
{
|
|
258
|
+
hormone: "dopamine",
|
|
259
|
+
emoji: "⚡",
|
|
260
|
+
sources: ["green commit streak >= 5", "test pass streak >= 5", "zero errors window"],
|
|
261
|
+
effects: ["reflex aggressive surface advanced tools", "slightly chattier daemon"],
|
|
262
|
+
},
|
|
263
|
+
{
|
|
264
|
+
hormone: "melatonin",
|
|
265
|
+
emoji: "🌙",
|
|
266
|
+
sources: ["late local hour (22:00 onwards)", "early-morning (00:00-06:00)", "idle > 15min"],
|
|
267
|
+
effects: ["deep dream cycle", "very quiet daemon", "notifications suppressed at >= 0.6"],
|
|
268
|
+
},
|
|
269
|
+
{
|
|
270
|
+
hormone: "oxytocin",
|
|
271
|
+
emoji: "💞",
|
|
272
|
+
sources: ["Co-Authored-By trailer", "distinct authors >= 2 in hour"],
|
|
273
|
+
effects: ["surface TRINITY VOTE + CONFESSIONAL", "multi-vendor consensus"],
|
|
274
|
+
},
|
|
275
|
+
];
|
|
276
|
+
}
|
|
277
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/endocrine/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event_pattern_match.test.d.ts","sourceRoot":"","sources":["../../src/event_pattern_match/event_pattern_match.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
2
|
+
import { matchEventPatterns, reportMatch, verifyReport, listBuiltinPatterns, formatPredictionLine, BUILTIN_PATTERNS, } from "./index.js";
|
|
3
|
+
const SECRET = "event-pattern-test-secret-997744";
|
|
4
|
+
function evt(kind, text, ts = 1) {
|
|
5
|
+
return { v: 1, kind, text, ts };
|
|
6
|
+
}
|
|
7
|
+
describe("v2.19.24 EVENT PATTERN MATCH · BUILTIN_PATTERNS coverage", () => {
|
|
8
|
+
it("ships >= 18 patterns covering 5 event kinds", () => {
|
|
9
|
+
expect(BUILTIN_PATTERNS.length).toBeGreaterThanOrEqual(18);
|
|
10
|
+
const kinds = new Set();
|
|
11
|
+
for (const p of BUILTIN_PATTERNS)
|
|
12
|
+
for (const k of p.eventKinds)
|
|
13
|
+
kinds.add(k);
|
|
14
|
+
expect(kinds.has("git_commit")).toBe(true);
|
|
15
|
+
expect(kinds.has("file_save")).toBe(true);
|
|
16
|
+
expect(kinds.has("clipboard")).toBe(true);
|
|
17
|
+
expect(kinds.has("terminal_command")).toBe(true);
|
|
18
|
+
expect(kinds.has("user_chat")).toBe(true);
|
|
19
|
+
});
|
|
20
|
+
it("every pattern has unique id + at least one suggested tool", () => {
|
|
21
|
+
const ids = new Set();
|
|
22
|
+
for (const p of BUILTIN_PATTERNS) {
|
|
23
|
+
expect(ids.has(p.id)).toBe(false);
|
|
24
|
+
ids.add(p.id);
|
|
25
|
+
expect(p.tools.length).toBeGreaterThan(0);
|
|
26
|
+
for (const t of p.tools) {
|
|
27
|
+
expect(t.confidence).toBeGreaterThan(0);
|
|
28
|
+
expect(t.confidence).toBeLessThanOrEqual(1);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
it("listBuiltinPatterns returns a copy (mutation-safe)", () => {
|
|
33
|
+
const before = BUILTIN_PATTERNS.length;
|
|
34
|
+
const a = listBuiltinPatterns();
|
|
35
|
+
a.pop();
|
|
36
|
+
expect(BUILTIN_PATTERNS.length).toBe(before);
|
|
37
|
+
});
|
|
38
|
+
});
|
|
39
|
+
describe("v2.19.24 EVENT PATTERN MATCH · the user's canonical scenario", () => {
|
|
40
|
+
it("'fix: token leak in auth.ts' commit -> bug_prophet + forensics.vulns + apoptosis.detect + antivirus", () => {
|
|
41
|
+
const predictions = matchEventPatterns({
|
|
42
|
+
event: evt("git_commit", "fix: token leak in auth.ts"),
|
|
43
|
+
topN: 10,
|
|
44
|
+
});
|
|
45
|
+
const tools = predictions.map((p) => p.toolName);
|
|
46
|
+
// fix: prefix pattern -> bug_prophet + premortem
|
|
47
|
+
expect(tools).toContain("mneme.bug_prophet.prophesy");
|
|
48
|
+
// security_token_leak -> forensics.vulns + apoptosis + antivirus
|
|
49
|
+
expect(tools).toContain("mneme.forensics.vulns");
|
|
50
|
+
expect(tools).toContain("mneme.apoptosis.detect");
|
|
51
|
+
expect(tools).toContain("mneme.antivirus.scan");
|
|
52
|
+
// forensics.vulns matched 2 patterns (token_leak + auth_file) -> max confidence
|
|
53
|
+
const vulns = predictions.find((p) => p.toolName === "mneme.forensics.vulns");
|
|
54
|
+
expect(vulns.matchedPatterns.length).toBeGreaterThanOrEqual(1);
|
|
55
|
+
expect(vulns.confidence).toBeGreaterThanOrEqual(0.85);
|
|
56
|
+
});
|
|
57
|
+
it("'check this with claude code' clipboard -> handoff.universal (1-step not 10-step)", () => {
|
|
58
|
+
const predictions = matchEventPatterns({
|
|
59
|
+
event: evt("clipboard", "check this with claude code"),
|
|
60
|
+
});
|
|
61
|
+
expect(predictions[0].toolName).toBe("mneme.handoff.universal");
|
|
62
|
+
expect(predictions[0].confidence).toBeGreaterThanOrEqual(0.9);
|
|
63
|
+
});
|
|
64
|
+
it("Thai 'ตรวจของแท้' clipboard -> caption.sever + provenance.evaluate (multilingual)", () => {
|
|
65
|
+
const predictions = matchEventPatterns({
|
|
66
|
+
event: evt("clipboard", "ตรวจของแท้ของรองเท้านี้"),
|
|
67
|
+
});
|
|
68
|
+
const tools = predictions.map((p) => p.toolName);
|
|
69
|
+
expect(tools).toContain("mneme.caption.sever");
|
|
70
|
+
expect(tools).toContain("mneme.provenance.evaluate");
|
|
71
|
+
});
|
|
72
|
+
});
|
|
73
|
+
describe("v2.19.24 EVENT PATTERN MATCH · multi-pattern merge (max-confidence wins)", () => {
|
|
74
|
+
it("when 2 patterns suggest same tool with different confidence -> highest wins + both matchedPatterns recorded", () => {
|
|
75
|
+
const customPatterns = [
|
|
76
|
+
{
|
|
77
|
+
id: "p_low",
|
|
78
|
+
eventKinds: ["git_commit"],
|
|
79
|
+
regex: /low/,
|
|
80
|
+
tools: [{ toolName: "shared.tool", argsTemplate: {}, confidence: 0.3 }],
|
|
81
|
+
reason: "low",
|
|
82
|
+
},
|
|
83
|
+
{
|
|
84
|
+
id: "p_high",
|
|
85
|
+
eventKinds: ["git_commit"],
|
|
86
|
+
regex: /low/,
|
|
87
|
+
tools: [{ toolName: "shared.tool", argsTemplate: {}, confidence: 0.9 }],
|
|
88
|
+
reason: "high",
|
|
89
|
+
},
|
|
90
|
+
];
|
|
91
|
+
const predictions = matchEventPatterns({
|
|
92
|
+
event: evt("git_commit", "low intensity commit"),
|
|
93
|
+
patterns: customPatterns,
|
|
94
|
+
});
|
|
95
|
+
expect(predictions.length).toBe(1);
|
|
96
|
+
expect(predictions[0].confidence).toBe(0.9);
|
|
97
|
+
expect(predictions[0].matchedPatterns).toContain("p_low");
|
|
98
|
+
expect(predictions[0].matchedPatterns).toContain("p_high");
|
|
99
|
+
});
|
|
100
|
+
it("event kind filters patterns (clipboard pattern does NOT fire on git_commit)", () => {
|
|
101
|
+
const predictions = matchEventPatterns({
|
|
102
|
+
event: evt("git_commit", "check this with claude code"),
|
|
103
|
+
});
|
|
104
|
+
const tools = predictions.map((p) => p.toolName);
|
|
105
|
+
expect(tools).not.toContain("mneme.handoff.universal");
|
|
106
|
+
});
|
|
107
|
+
it("no matching patterns -> empty predictions", () => {
|
|
108
|
+
const predictions = matchEventPatterns({
|
|
109
|
+
event: evt("git_commit", "absolutely no keywords just words"),
|
|
110
|
+
});
|
|
111
|
+
expect(predictions).toEqual([]);
|
|
112
|
+
});
|
|
113
|
+
it("topN respected; sorted by confidence desc", () => {
|
|
114
|
+
const predictions = matchEventPatterns({
|
|
115
|
+
event: evt("git_commit", "fix: cve-2024-1234 token leak api_key in auth.ts"),
|
|
116
|
+
topN: 3,
|
|
117
|
+
});
|
|
118
|
+
expect(predictions.length).toBeLessThanOrEqual(3);
|
|
119
|
+
for (let i = 1; i < predictions.length; i++) {
|
|
120
|
+
expect(predictions[i - 1].confidence).toBeGreaterThanOrEqual(predictions[i].confidence);
|
|
121
|
+
}
|
|
122
|
+
});
|
|
123
|
+
});
|
|
124
|
+
describe("v2.19.24 EVENT PATTERN MATCH · file-type hints", () => {
|
|
125
|
+
it("'.test.ts' file save -> coverage check", () => {
|
|
126
|
+
const predictions = matchEventPatterns({
|
|
127
|
+
event: evt("file_save", "src/auth.test.ts"),
|
|
128
|
+
});
|
|
129
|
+
const tools = predictions.map((p) => p.toolName);
|
|
130
|
+
expect(tools).toContain("mneme.ask");
|
|
131
|
+
});
|
|
132
|
+
it("config file save (package.json) -> deps.oracle + premortem", () => {
|
|
133
|
+
const predictions = matchEventPatterns({
|
|
134
|
+
event: evt("file_save", "package.json"),
|
|
135
|
+
});
|
|
136
|
+
const tools = predictions.map((p) => p.toolName);
|
|
137
|
+
expect(tools).toContain("mneme.deps.oracle");
|
|
138
|
+
expect(tools).toContain("mneme.premortem");
|
|
139
|
+
});
|
|
140
|
+
});
|
|
141
|
+
describe("v2.19.24 EVENT PATTERN MATCH · HMAC report + determinism", () => {
|
|
142
|
+
it("reportMatch HMAC verifies on untampered; rejects tamper", () => {
|
|
143
|
+
const r = reportMatch({ event: evt("git_commit", "fix: bug"), secret: SECRET });
|
|
144
|
+
expect(verifyReport(r, SECRET)).toBe(true);
|
|
145
|
+
const tampered = { ...r, patternsMatched: 999 };
|
|
146
|
+
expect(verifyReport(tampered, SECRET)).toBe(false);
|
|
147
|
+
});
|
|
148
|
+
it("MEASURED 100% determinism: same event -> same report sig (30 trials)", () => {
|
|
149
|
+
const event = evt("git_commit", "fix: token leak in auth.ts", 1_000_000);
|
|
150
|
+
const firstSig = reportMatch({ event, secret: SECRET }).sig;
|
|
151
|
+
let allEqual = true;
|
|
152
|
+
for (let i = 0; i < 30; i++) {
|
|
153
|
+
if (reportMatch({ event, secret: SECRET }).sig !== firstSig) {
|
|
154
|
+
allEqual = false;
|
|
155
|
+
break;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
expect(allEqual).toBe(true);
|
|
159
|
+
});
|
|
160
|
+
});
|
|
161
|
+
describe("v2.19.24 EVENT PATTERN MATCH · formatter", () => {
|
|
162
|
+
it("formatPredictionLine includes tool, conf%, matched pattern ids", () => {
|
|
163
|
+
const line = formatPredictionLine({
|
|
164
|
+
toolName: "mneme.forensics.vulns",
|
|
165
|
+
argsTemplate: {},
|
|
166
|
+
confidence: 0.85,
|
|
167
|
+
matchedPatterns: ["security_token_leak", "security_auth_file"],
|
|
168
|
+
});
|
|
169
|
+
expect(line).toContain("mneme.forensics.vulns");
|
|
170
|
+
expect(line).toContain("85%");
|
|
171
|
+
expect(line).toContain("security_token_leak");
|
|
172
|
+
expect(line).toContain("security_auth_file");
|
|
173
|
+
});
|
|
174
|
+
});
|
|
175
|
+
//# sourceMappingURL=event_pattern_match.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event_pattern_match.test.js","sourceRoot":"","sources":["../../src/event_pattern_match/event_pattern_match.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,99 @@
|
|
|
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
|
+
declare const PROTOCOL_VERSION: 1;
|
|
42
|
+
export type SemanticEventKind = "git_commit" | "file_save" | "clipboard" | "terminal_command" | "user_chat";
|
|
43
|
+
export interface SemanticEvent {
|
|
44
|
+
v: typeof PROTOCOL_VERSION;
|
|
45
|
+
kind: SemanticEventKind;
|
|
46
|
+
/** Full text content of the event (commit msg, file path, clipboard text, etc). */
|
|
47
|
+
text: string;
|
|
48
|
+
/** Optional structured context (e.g., { filePath, sha, args }). */
|
|
49
|
+
context?: Record<string, unknown>;
|
|
50
|
+
ts: number;
|
|
51
|
+
}
|
|
52
|
+
export interface SemanticPattern {
|
|
53
|
+
id: string;
|
|
54
|
+
eventKinds: SemanticEventKind[];
|
|
55
|
+
regex: RegExp;
|
|
56
|
+
/** Tools this pattern suggests when matched, each with prior confidence. */
|
|
57
|
+
tools: Array<{
|
|
58
|
+
toolName: string;
|
|
59
|
+
argsTemplate: Record<string, unknown>;
|
|
60
|
+
confidence: number;
|
|
61
|
+
}>;
|
|
62
|
+
reason: string;
|
|
63
|
+
}
|
|
64
|
+
export interface SemanticPrediction {
|
|
65
|
+
toolName: string;
|
|
66
|
+
argsTemplate: Record<string, unknown>;
|
|
67
|
+
confidence: number;
|
|
68
|
+
matchedPatterns: string[];
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* 18 built-in semantic patterns covering the most common AI-agent
|
|
72
|
+
* workflows on a code repo. Each pattern is one regex over event.text
|
|
73
|
+
* + optional eventKind filter + a list of suggested tools.
|
|
74
|
+
*/
|
|
75
|
+
export declare const BUILTIN_PATTERNS: readonly SemanticPattern[];
|
|
76
|
+
/** Match an event against ALL patterns; return ranked predictions. */
|
|
77
|
+
export declare function matchEventPatterns(input: {
|
|
78
|
+
event: SemanticEvent;
|
|
79
|
+
patterns?: readonly SemanticPattern[];
|
|
80
|
+
topN?: number;
|
|
81
|
+
}): SemanticPrediction[];
|
|
82
|
+
export interface MatchReport {
|
|
83
|
+
v: typeof PROTOCOL_VERSION;
|
|
84
|
+
event: SemanticEvent;
|
|
85
|
+
predictions: SemanticPrediction[];
|
|
86
|
+
patternsConsidered: number;
|
|
87
|
+
patternsMatched: number;
|
|
88
|
+
sig: string;
|
|
89
|
+
}
|
|
90
|
+
export declare function reportMatch(input: {
|
|
91
|
+
event: SemanticEvent;
|
|
92
|
+
topN?: number;
|
|
93
|
+
secret?: string;
|
|
94
|
+
}): MatchReport;
|
|
95
|
+
export declare function verifyReport(r: MatchReport, secret?: string): boolean;
|
|
96
|
+
export declare function listBuiltinPatterns(): SemanticPattern[];
|
|
97
|
+
export declare function formatPredictionLine(p: SemanticPrediction): string;
|
|
98
|
+
export {};
|
|
99
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/event_pattern_match/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AAIH,QAAA,MAAM,gBAAgB,EAAG,CAAU,CAAC;AAEpC,MAAM,MAAM,iBAAiB,GAAG,YAAY,GAAG,WAAW,GAAG,WAAW,GAAG,kBAAkB,GAAG,WAAW,CAAC;AAE5G,MAAM,WAAW,aAAa;IAC5B,CAAC,EAAE,OAAO,gBAAgB,CAAC;IAC3B,IAAI,EAAE,iBAAiB,CAAC;IACxB,mFAAmF;IACnF,IAAI,EAAE,MAAM,CAAC;IACb,mEAAmE;IACnE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,iBAAiB,EAAE,CAAC;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,4EAA4E;IAC5E,KAAK,EAAE,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC9F,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACtC,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,EAAE,CAAC;CAC3B;AAED;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,EAAE,SAAS,eAAe,EA8LtD,CAAC;AAEF,sEAAsE;AACtE,wBAAgB,kBAAkB,CAAC,KAAK,EAAE;IACxC,KAAK,EAAE,aAAa,CAAC;IACrB,QAAQ,CAAC,EAAE,SAAS,eAAe,EAAE,CAAC;IACtC,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,GAAG,kBAAkB,EAAE,CA6BvB;AAED,MAAM,WAAW,WAAW;IAC1B,CAAC,EAAE,OAAO,gBAAgB,CAAC;IAC3B,KAAK,EAAE,aAAa,CAAC;IACrB,WAAW,EAAE,kBAAkB,EAAE,CAAC;IAClC,kBAAkB,EAAE,MAAM,CAAC;IAC3B,eAAe,EAAE,MAAM,CAAC;IACxB,GAAG,EAAE,MAAM,CAAC;CACb;AAsBD,wBAAgB,WAAW,CAAC,KAAK,EAAE;IAAE,KAAK,EAAE,aAAa,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,WAAW,CAaxG;AAED,wBAAgB,YAAY,CAAC,CAAC,EAAE,WAAW,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAGrE;AAED,wBAAgB,mBAAmB,IAAI,eAAe,EAAE,CAEvD;AAED,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,kBAAkB,GAAG,MAAM,CAGlE"}
|