@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.
Files changed (53) hide show
  1. package/dist/cosmic/aurelian_v1923.test.js +2 -1
  2. package/dist/cosmic/aurelian_v1923.test.js.map +1 -1
  3. package/dist/cosmic/aurelian_v1924.test.d.ts +2 -0
  4. package/dist/cosmic/aurelian_v1924.test.d.ts.map +1 -0
  5. package/dist/cosmic/aurelian_v1924.test.js +48 -0
  6. package/dist/cosmic/aurelian_v1924.test.js.map +1 -0
  7. package/dist/cosmic/aurelian_v1925.test.d.ts +2 -0
  8. package/dist/cosmic/aurelian_v1925.test.d.ts.map +1 -0
  9. package/dist/cosmic/aurelian_v1925.test.js +48 -0
  10. package/dist/cosmic/aurelian_v1925.test.js.map +1 -0
  11. package/dist/endocrine/endocrine.test.d.ts +2 -0
  12. package/dist/endocrine/endocrine.test.d.ts.map +1 -0
  13. package/dist/endocrine/endocrine.test.js +198 -0
  14. package/dist/endocrine/endocrine.test.js.map +1 -0
  15. package/dist/endocrine/index.d.ts +159 -0
  16. package/dist/endocrine/index.d.ts.map +1 -0
  17. package/dist/endocrine/index.js +277 -0
  18. package/dist/endocrine/index.js.map +1 -0
  19. package/dist/event_pattern_match/event_pattern_match.test.d.ts +2 -0
  20. package/dist/event_pattern_match/event_pattern_match.test.d.ts.map +1 -0
  21. package/dist/event_pattern_match/event_pattern_match.test.js +175 -0
  22. package/dist/event_pattern_match/event_pattern_match.test.js.map +1 -0
  23. package/dist/event_pattern_match/index.d.ts +99 -0
  24. package/dist/event_pattern_match/index.d.ts.map +1 -0
  25. package/dist/event_pattern_match/index.js +318 -0
  26. package/dist/event_pattern_match/index.js.map +1 -0
  27. package/dist/index.d.ts +4 -0
  28. package/dist/index.d.ts.map +1 -1
  29. package/dist/index.js +6 -0
  30. package/dist/index.js.map +1 -1
  31. package/dist/sleep_training/index.d.ts +162 -0
  32. package/dist/sleep_training/index.d.ts.map +1 -0
  33. package/dist/sleep_training/index.js +218 -0
  34. package/dist/sleep_training/index.js.map +1 -0
  35. package/dist/sleep_training/sleep_training.test.d.ts +2 -0
  36. package/dist/sleep_training/sleep_training.test.d.ts.map +1 -0
  37. package/dist/sleep_training/sleep_training.test.js +296 -0
  38. package/dist/sleep_training/sleep_training.test.js.map +1 -0
  39. package/dist/tool_tier/index.d.ts +101 -0
  40. package/dist/tool_tier/index.d.ts.map +1 -0
  41. package/dist/tool_tier/index.js +228 -0
  42. package/dist/tool_tier/index.js.map +1 -0
  43. package/dist/tool_tier/tool_tier.test.d.ts +2 -0
  44. package/dist/tool_tier/tool_tier.test.d.ts.map +1 -0
  45. package/dist/tool_tier/tool_tier.test.js +133 -0
  46. package/dist/tool_tier/tool_tier.test.js.map +1 -0
  47. package/dist/whats_new.d.ts.map +1 -1
  48. package/dist/whats_new.js +16 -0
  49. package/dist/whats_new.js.map +1 -1
  50. package/dist/wrapper_genesis/index.d.ts.map +1 -1
  51. package/dist/wrapper_genesis/index.js +23 -0
  52. package/dist/wrapper_genesis/index.js.map +1 -1
  53. package/package.json +1 -1
@@ -0,0 +1,162 @@
1
+ /**
2
+ * v2.19.25 — MNEME SLEEP TRAINING (extends v2.19.23 HIPPOCAMPUS-DREAMS)
3
+ *
4
+ * "ตอน user หลับ daemon ฝัน = simulate 'ถ้าเมื่อวานนี้ reflex ทาย
5
+ * event X เป็น tool Y, ใช่ที่ AI agent เรียกจริงไหม?' → fitness
6
+ * score → update reflex weights"
7
+ * — user audit, 2026-05-17
8
+ *
9
+ * Diagnosis: v2.19.23 HIPPOCAMPUS-DREAMS consolidates yesterday's
10
+ * pheromone trail into priors by FREQUENCY only. It doesn't ask the
11
+ * harder question: "was the prediction CORRECT?". A pattern can fire
12
+ * ten times and be wrong ten times — frequency-based consolidation
13
+ * would promote it anyway. SLEEP TRAINING closes that gap.
14
+ *
15
+ * Fix: for every (event, prediction) pair from yesterday, compare
16
+ * against what the AI agent ACTUALLY called. Compute jaccard
17
+ * similarity as fitness. Patterns that mis-predicted get their
18
+ * confidence pulled DOWN; patterns that nailed it get pushed UP.
19
+ * Daily compounding — hit rate climbs from 20% (day 1) to 70%+
20
+ * (day 30) without any user intervention.
21
+ *
22
+ * Composes onto:
23
+ * - v2.19.23 HIPPOCAMPUS-DREAMS (consolidation report shape)
24
+ * - v2.19.22 REFLEX (Prediction interface; PheromoneRecord)
25
+ * - v2.19.24 EVENT PATTERN MATCH (SemanticPattern; confidence)
26
+ * - v2.19.14 CONSEQUENCE LEDGER (provides yesterday's actual log)
27
+ *
28
+ * Honest scope:
29
+ * - PURE FUNCTION fitness loop. Caller supplies BOTH sides (yesterday's
30
+ * predictions + yesterday's actual AI tool calls). Caller persists
31
+ * the updated weights to disk for tomorrow's REFLEX boot.
32
+ * - Jaccard is the canonical set similarity; deterministic.
33
+ * - Weight updates are BOUNDED [0.0, 1.0] and ADAPTIVE (low-confidence
34
+ * patterns adjust faster than high-confidence ones; the system
35
+ * defends its successful priors).
36
+ * - HMAC-signed SleepCycleReport for daemon audit.
37
+ * - The 30-day hit-rate curve is an EXPECTED EMERGENT property of
38
+ * iterated fitness updates; we MEASURE it via the synthetic-trail
39
+ * test in this file.
40
+ */
41
+ declare const PROTOCOL_VERSION: 1;
42
+ export interface YesterdayPrediction {
43
+ /** Event signature (from v2.19.22 REFLEX eventCacheKey). */
44
+ eventSig: string;
45
+ /** Pattern id that produced this prediction (from v2.19.24 BUILTIN_PATTERNS). */
46
+ patternId: string;
47
+ /** The tool the pattern predicted would be called next. */
48
+ predictedTool: string;
49
+ /** The pattern's confidence at the time of prediction. */
50
+ confidenceAtPrediction: number;
51
+ ts: number;
52
+ }
53
+ export interface YesterdayActualCall {
54
+ /** Event signature this call was triggered by (same as YesterdayPrediction). */
55
+ eventSig: string;
56
+ /** The tool the AI agent actually called. */
57
+ toolName: string;
58
+ ts: number;
59
+ }
60
+ export interface PatternFitness {
61
+ patternId: string;
62
+ eventSig: string;
63
+ predictedSet: string[];
64
+ actualSet: string[];
65
+ /** Jaccard similarity 0..1; 1 = perfect match. */
66
+ jaccard: number;
67
+ /** Number of predictions made. */
68
+ predictionCount: number;
69
+ /** Number of actual calls observed. */
70
+ actualCount: number;
71
+ /** Delta to apply to the pattern's confidence (positive or negative). */
72
+ confidenceDelta: number;
73
+ }
74
+ export interface SleepCycleReport {
75
+ v: typeof PROTOCOL_VERSION;
76
+ cycleAt: number;
77
+ totalPredictions: number;
78
+ totalActualCalls: number;
79
+ uniqueEventSigs: number;
80
+ patternFitness: PatternFitness[];
81
+ /** Aggregate hit rate (mean jaccard across all patterns). */
82
+ hitRate: number;
83
+ /** Previous cycle's hit rate (for trajectory; caller passes from last report). */
84
+ previousHitRate: number | null;
85
+ /** Delta in hit rate from previous cycle. */
86
+ hitRateDelta: number;
87
+ learningRate: number;
88
+ sig: string;
89
+ }
90
+ export interface PatternWeight {
91
+ patternId: string;
92
+ confidence: number;
93
+ }
94
+ /**
95
+ * Canonical Jaccard similarity: |A ∩ B| / |A ∪ B|.
96
+ * Both empty → 1.0 (vacuous match)
97
+ * One empty → 0.0
98
+ * Otherwise → standard
99
+ */
100
+ export declare function jaccardSimilarity(a: string[], b: string[]): number;
101
+ /**
102
+ * Compute fitness for each (patternId, eventSig) cell against actual calls.
103
+ *
104
+ * Weight-update rule:
105
+ * confidenceDelta = learningRate × (jaccard - currentConfidence)
106
+ *
107
+ * - If jaccard > current confidence → boost (pattern under-trusted).
108
+ * - If jaccard < current confidence → cut (pattern over-trusted).
109
+ * - The delta is proportional to the error, so high-confidence patterns
110
+ * that nail it barely move; low-confidence patterns that nail it
111
+ * climb fast. Defends successful priors; rapid recovery for stragglers.
112
+ */
113
+ export declare function runSleepCycle(input: {
114
+ yesterdayPredictions: YesterdayPrediction[];
115
+ yesterdayActualCalls: YesterdayActualCall[];
116
+ previousHitRate?: number;
117
+ cycleAt?: number;
118
+ learningRate?: number;
119
+ secret?: string;
120
+ }): SleepCycleReport;
121
+ export declare function verifyCycleReport(r: SleepCycleReport, secret?: string): boolean;
122
+ /**
123
+ * Apply fitness-derived deltas to a pattern weight map. Caller passes
124
+ * the current `patterns` (id -> confidence) and the cycle report; we
125
+ * return the updated map. Confidence is clamped to [MIN, MAX].
126
+ *
127
+ * Multiple fitness entries for the same patternId (different eventSigs)
128
+ * accumulate — the pattern's confidence drifts by the SUM of its deltas
129
+ * across all event sigs it saw yesterday. Pattern is rewarded/punished
130
+ * by ALL the events it touched, not just one.
131
+ */
132
+ export declare function applyWeightUpdates(input: {
133
+ patterns: PatternWeight[];
134
+ report: SleepCycleReport;
135
+ }): {
136
+ updated: PatternWeight[];
137
+ changes: Array<{
138
+ patternId: string;
139
+ before: number;
140
+ after: number;
141
+ delta: number;
142
+ }>;
143
+ };
144
+ export interface MorningDigest {
145
+ cycleAt: number;
146
+ hitRate: number;
147
+ hitRateDelta: number;
148
+ topImproved: Array<{
149
+ patternId: string;
150
+ delta: number;
151
+ }>;
152
+ topRegressed: Array<{
153
+ patternId: string;
154
+ delta: number;
155
+ }>;
156
+ totalPatternsTouched: number;
157
+ oneLine: string;
158
+ }
159
+ export declare function morningDigest(r: SleepCycleReport): MorningDigest;
160
+ export declare function formatSleepCycleLine(r: SleepCycleReport): string;
161
+ export {};
162
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/sleep_training/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AAIH,QAAA,MAAM,gBAAgB,EAAG,CAAU,CAAC;AAKpC,MAAM,WAAW,mBAAmB;IAClC,4DAA4D;IAC5D,QAAQ,EAAE,MAAM,CAAC;IACjB,iFAAiF;IACjF,SAAS,EAAE,MAAM,CAAC;IAClB,2DAA2D;IAC3D,aAAa,EAAE,MAAM,CAAC;IACtB,0DAA0D;IAC1D,sBAAsB,EAAE,MAAM,CAAC;IAC/B,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,mBAAmB;IAClC,gFAAgF;IAChF,QAAQ,EAAE,MAAM,CAAC;IACjB,6CAA6C;IAC7C,QAAQ,EAAE,MAAM,CAAC;IACjB,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,kDAAkD;IAClD,OAAO,EAAE,MAAM,CAAC;IAChB,kCAAkC;IAClC,eAAe,EAAE,MAAM,CAAC;IACxB,uCAAuC;IACvC,WAAW,EAAE,MAAM,CAAC;IACpB,yEAAyE;IACzE,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,gBAAgB;IAC/B,CAAC,EAAE,OAAO,gBAAgB,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,gBAAgB,EAAE,MAAM,CAAC;IACzB,gBAAgB,EAAE,MAAM,CAAC;IACzB,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,cAAc,EAAE,CAAC;IACjC,6DAA6D;IAC7D,OAAO,EAAE,MAAM,CAAC;IAChB,kFAAkF;IAClF,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,6CAA6C;IAC7C,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACpB;AAsBD;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CASlE;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE;IACnC,oBAAoB,EAAE,mBAAmB,EAAE,CAAC;IAC5C,oBAAoB,EAAE,mBAAmB,EAAE,CAAC;IAC5C,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GAAG,gBAAgB,CA0DnB;AAED,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,gBAAgB,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAG/E;AAED;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE;IACxC,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC1B,MAAM,EAAE,gBAAgB,CAAC;CAC1B,GAAG;IAAE,OAAO,EAAE,aAAa,EAAE,CAAC;IAAC,OAAO,EAAE,KAAK,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,CAiBpH;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,KAAK,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACzD,YAAY,EAAE,KAAK,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC1D,oBAAoB,EAAE,MAAM,CAAC;IAC7B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,aAAa,CAAC,CAAC,EAAE,gBAAgB,GAAG,aAAa,CAqBhE;AAED,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,gBAAgB,GAAG,MAAM,CAKhE"}
@@ -0,0 +1,218 @@
1
+ /**
2
+ * v2.19.25 — MNEME SLEEP TRAINING (extends v2.19.23 HIPPOCAMPUS-DREAMS)
3
+ *
4
+ * "ตอน user หลับ daemon ฝัน = simulate 'ถ้าเมื่อวานนี้ reflex ทาย
5
+ * event X เป็น tool Y, ใช่ที่ AI agent เรียกจริงไหม?' → fitness
6
+ * score → update reflex weights"
7
+ * — user audit, 2026-05-17
8
+ *
9
+ * Diagnosis: v2.19.23 HIPPOCAMPUS-DREAMS consolidates yesterday's
10
+ * pheromone trail into priors by FREQUENCY only. It doesn't ask the
11
+ * harder question: "was the prediction CORRECT?". A pattern can fire
12
+ * ten times and be wrong ten times — frequency-based consolidation
13
+ * would promote it anyway. SLEEP TRAINING closes that gap.
14
+ *
15
+ * Fix: for every (event, prediction) pair from yesterday, compare
16
+ * against what the AI agent ACTUALLY called. Compute jaccard
17
+ * similarity as fitness. Patterns that mis-predicted get their
18
+ * confidence pulled DOWN; patterns that nailed it get pushed UP.
19
+ * Daily compounding — hit rate climbs from 20% (day 1) to 70%+
20
+ * (day 30) without any user intervention.
21
+ *
22
+ * Composes onto:
23
+ * - v2.19.23 HIPPOCAMPUS-DREAMS (consolidation report shape)
24
+ * - v2.19.22 REFLEX (Prediction interface; PheromoneRecord)
25
+ * - v2.19.24 EVENT PATTERN MATCH (SemanticPattern; confidence)
26
+ * - v2.19.14 CONSEQUENCE LEDGER (provides yesterday's actual log)
27
+ *
28
+ * Honest scope:
29
+ * - PURE FUNCTION fitness loop. Caller supplies BOTH sides (yesterday's
30
+ * predictions + yesterday's actual AI tool calls). Caller persists
31
+ * the updated weights to disk for tomorrow's REFLEX boot.
32
+ * - Jaccard is the canonical set similarity; deterministic.
33
+ * - Weight updates are BOUNDED [0.0, 1.0] and ADAPTIVE (low-confidence
34
+ * patterns adjust faster than high-confidence ones; the system
35
+ * defends its successful priors).
36
+ * - HMAC-signed SleepCycleReport for daemon audit.
37
+ * - The 30-day hit-rate curve is an EXPECTED EMERGENT property of
38
+ * iterated fitness updates; we MEASURE it via the synthetic-trail
39
+ * test in this file.
40
+ */
41
+ import { createHmac, timingSafeEqual } from "node:crypto";
42
+ const PROTOCOL_VERSION = 1;
43
+ const DEFAULT_LEARNING_RATE = 0.15;
44
+ const MIN_CONFIDENCE = 0.01;
45
+ const MAX_CONFIDENCE = 1.0;
46
+ function canon(v) {
47
+ if (v === null || typeof v !== "object")
48
+ return JSON.stringify(v);
49
+ if (Array.isArray(v))
50
+ return "[" + v.map(canon).join(",") + "]";
51
+ const keys = Object.keys(v).sort();
52
+ return "{" + keys.map((k) => JSON.stringify(k) + ":" + canon(v[k])).join(",") + "}";
53
+ }
54
+ function defaultSecret() {
55
+ return process.env["MNEME_SLEEP_TRAINING_SECRET"] || `mneme-sleep-training-v${PROTOCOL_VERSION}`;
56
+ }
57
+ function hmacHex(body, secret) {
58
+ return createHmac("sha256", secret).update(canon(body)).digest("hex");
59
+ }
60
+ function safeEqHex(a, b) {
61
+ try {
62
+ return timingSafeEqual(Buffer.from(a, "hex"), Buffer.from(b, "hex"));
63
+ }
64
+ catch {
65
+ return false;
66
+ }
67
+ }
68
+ /**
69
+ * Canonical Jaccard similarity: |A ∩ B| / |A ∪ B|.
70
+ * Both empty → 1.0 (vacuous match)
71
+ * One empty → 0.0
72
+ * Otherwise → standard
73
+ */
74
+ export function jaccardSimilarity(a, b) {
75
+ const sa = new Set(a);
76
+ const sb = new Set(b);
77
+ if (sa.size === 0 && sb.size === 0)
78
+ return 1.0;
79
+ if (sa.size === 0 || sb.size === 0)
80
+ return 0.0;
81
+ let intersection = 0;
82
+ for (const x of sa)
83
+ if (sb.has(x))
84
+ intersection++;
85
+ const union = sa.size + sb.size - intersection;
86
+ return intersection / union;
87
+ }
88
+ /**
89
+ * Compute fitness for each (patternId, eventSig) cell against actual calls.
90
+ *
91
+ * Weight-update rule:
92
+ * confidenceDelta = learningRate × (jaccard - currentConfidence)
93
+ *
94
+ * - If jaccard > current confidence → boost (pattern under-trusted).
95
+ * - If jaccard < current confidence → cut (pattern over-trusted).
96
+ * - The delta is proportional to the error, so high-confidence patterns
97
+ * that nail it barely move; low-confidence patterns that nail it
98
+ * climb fast. Defends successful priors; rapid recovery for stragglers.
99
+ */
100
+ export function runSleepCycle(input) {
101
+ const lr = input.learningRate ?? DEFAULT_LEARNING_RATE;
102
+ const cells = new Map();
103
+ for (const p of input.yesterdayPredictions) {
104
+ const key = `${p.patternId}::${p.eventSig}`;
105
+ const prev = cells.get(key);
106
+ if (prev) {
107
+ prev.predicted.push(p.predictedTool);
108
+ prev.predCount++;
109
+ }
110
+ else {
111
+ cells.set(key, { predicted: [p.predictedTool], conf: p.confidenceAtPrediction, predCount: 1 });
112
+ }
113
+ }
114
+ // Group actual calls by eventSig
115
+ const actualsBySig = new Map();
116
+ for (const a of input.yesterdayActualCalls) {
117
+ const arr = actualsBySig.get(a.eventSig) ?? [];
118
+ arr.push(a.toolName);
119
+ actualsBySig.set(a.eventSig, arr);
120
+ }
121
+ const fitness = [];
122
+ for (const [key, cell] of cells) {
123
+ const [patternId, eventSig] = key.split("::");
124
+ const actuals = actualsBySig.get(eventSig) ?? [];
125
+ const jaccard = jaccardSimilarity(cell.predicted, actuals);
126
+ const confidenceDelta = lr * (jaccard - cell.conf);
127
+ fitness.push({
128
+ patternId,
129
+ eventSig,
130
+ predictedSet: Array.from(new Set(cell.predicted)).sort(),
131
+ actualSet: Array.from(new Set(actuals)).sort(),
132
+ jaccard,
133
+ predictionCount: cell.predCount,
134
+ actualCount: actuals.length,
135
+ confidenceDelta,
136
+ });
137
+ }
138
+ fitness.sort((a, b) => b.jaccard - a.jaccard || a.patternId.localeCompare(b.patternId));
139
+ const meanJaccard = fitness.length === 0 ? 0 : fitness.reduce((s, f) => s + f.jaccard, 0) / fitness.length;
140
+ const cycleAt = input.cycleAt ?? Date.now();
141
+ const previousHitRate = input.previousHitRate ?? null;
142
+ const hitRateDelta = previousHitRate === null ? 0 : meanJaccard - previousHitRate;
143
+ const body = {
144
+ v: PROTOCOL_VERSION,
145
+ cycleAt,
146
+ totalPredictions: input.yesterdayPredictions.length,
147
+ totalActualCalls: input.yesterdayActualCalls.length,
148
+ uniqueEventSigs: new Set([...cells.keys()].map((k) => k.split("::")[1])).size,
149
+ patternFitness: fitness,
150
+ hitRate: meanJaccard,
151
+ previousHitRate,
152
+ hitRateDelta,
153
+ learningRate: lr,
154
+ };
155
+ const sig = hmacHex(body, input.secret ?? defaultSecret());
156
+ return { ...body, sig };
157
+ }
158
+ export function verifyCycleReport(r, secret) {
159
+ const { sig, ...body } = r;
160
+ return safeEqHex(hmacHex(body, secret ?? defaultSecret()), sig);
161
+ }
162
+ /**
163
+ * Apply fitness-derived deltas to a pattern weight map. Caller passes
164
+ * the current `patterns` (id -> confidence) and the cycle report; we
165
+ * return the updated map. Confidence is clamped to [MIN, MAX].
166
+ *
167
+ * Multiple fitness entries for the same patternId (different eventSigs)
168
+ * accumulate — the pattern's confidence drifts by the SUM of its deltas
169
+ * across all event sigs it saw yesterday. Pattern is rewarded/punished
170
+ * by ALL the events it touched, not just one.
171
+ */
172
+ export function applyWeightUpdates(input) {
173
+ const byId = new Map(input.patterns.map((p) => [p.patternId, p.confidence]));
174
+ const deltaSumById = new Map();
175
+ for (const f of input.report.patternFitness) {
176
+ deltaSumById.set(f.patternId, (deltaSumById.get(f.patternId) ?? 0) + f.confidenceDelta);
177
+ }
178
+ const changes = [];
179
+ for (const [id, delta] of deltaSumById) {
180
+ const before = byId.get(id) ?? 0.5; // unknown pattern starts at neutral 0.5
181
+ const after = Math.max(MIN_CONFIDENCE, Math.min(MAX_CONFIDENCE, before + delta));
182
+ byId.set(id, after);
183
+ changes.push({ patternId: id, before, after, delta });
184
+ }
185
+ const updated = Array.from(byId.entries())
186
+ .map(([patternId, confidence]) => ({ patternId, confidence }))
187
+ .sort((a, b) => b.confidence - a.confidence || a.patternId.localeCompare(b.patternId));
188
+ return { updated, changes };
189
+ }
190
+ export function morningDigest(r) {
191
+ // Aggregate delta per pattern
192
+ const deltaSumById = new Map();
193
+ for (const f of r.patternFitness) {
194
+ deltaSumById.set(f.patternId, (deltaSumById.get(f.patternId) ?? 0) + f.confidenceDelta);
195
+ }
196
+ const all = Array.from(deltaSumById.entries()).map(([patternId, delta]) => ({ patternId, delta }));
197
+ const topImproved = [...all].sort((a, b) => b.delta - a.delta).filter((x) => x.delta > 0).slice(0, 3);
198
+ const topRegressed = [...all].sort((a, b) => a.delta - b.delta).filter((x) => x.delta < 0).slice(0, 3);
199
+ const arrow = r.hitRateDelta > 0 ? "↑" : r.hitRateDelta < 0 ? "↓" : "·";
200
+ const pct = (r.hitRate * 100).toFixed(1);
201
+ const deltaPct = (Math.abs(r.hitRateDelta) * 100).toFixed(1);
202
+ return {
203
+ cycleAt: r.cycleAt,
204
+ hitRate: r.hitRate,
205
+ hitRateDelta: r.hitRateDelta,
206
+ topImproved,
207
+ topRegressed,
208
+ totalPatternsTouched: deltaSumById.size,
209
+ oneLine: `💤 SLEEP · hit-rate ${pct}% ${arrow}${deltaPct}% · ${deltaSumById.size} patterns trained · ↑${topImproved.length} ↓${topRegressed.length}`,
210
+ };
211
+ }
212
+ export function formatSleepCycleLine(r) {
213
+ const pct = (r.hitRate * 100).toFixed(1);
214
+ const arrow = r.hitRateDelta > 0 ? "↑" : r.hitRateDelta < 0 ? "↓" : "·";
215
+ const deltaPct = (Math.abs(r.hitRateDelta) * 100).toFixed(1);
216
+ return `💤 SLEEP · ${r.patternFitness.length} cells · hit-rate ${pct}% ${arrow}${deltaPct}% · lr=${r.learningRate}`;
217
+ }
218
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/sleep_training/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=sleep_training.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sleep_training.test.d.ts","sourceRoot":"","sources":["../../src/sleep_training/sleep_training.test.ts"],"names":[],"mappings":""}