@theihtisham/agent-shadow-brain 5.1.1 → 6.0.0

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 (183) hide show
  1. package/README.md +355 -1095
  2. package/dist/adapters/copilot.d.ts +14 -0
  3. package/dist/adapters/copilot.d.ts.map +1 -0
  4. package/dist/adapters/copilot.js +93 -0
  5. package/dist/adapters/copilot.js.map +1 -0
  6. package/dist/adapters/cursor.d.ts +13 -0
  7. package/dist/adapters/cursor.d.ts.map +1 -0
  8. package/dist/adapters/cursor.js +96 -0
  9. package/dist/adapters/cursor.js.map +1 -0
  10. package/dist/adapters/index.d.ts +4 -1
  11. package/dist/adapters/index.d.ts.map +1 -1
  12. package/dist/adapters/index.js +7 -3
  13. package/dist/adapters/index.js.map +1 -1
  14. package/dist/adapters/windsurf.d.ts +14 -0
  15. package/dist/adapters/windsurf.d.ts.map +1 -0
  16. package/dist/adapters/windsurf.js +107 -0
  17. package/dist/adapters/windsurf.js.map +1 -0
  18. package/dist/brain/agent-firewall.d.ts +7 -0
  19. package/dist/brain/agent-firewall.d.ts.map +1 -0
  20. package/dist/brain/agent-firewall.js +152 -0
  21. package/dist/brain/agent-firewall.js.map +1 -0
  22. package/dist/brain/agent-handoff.d.ts +19 -0
  23. package/dist/brain/agent-handoff.d.ts.map +1 -0
  24. package/dist/brain/agent-handoff.js +127 -0
  25. package/dist/brain/agent-handoff.js.map +1 -0
  26. package/dist/brain/air-gap.d.ts +23 -0
  27. package/dist/brain/air-gap.d.ts.map +1 -0
  28. package/dist/brain/air-gap.js +137 -0
  29. package/dist/brain/air-gap.js.map +1 -0
  30. package/dist/brain/attention-heatmap.d.ts +24 -0
  31. package/dist/brain/attention-heatmap.d.ts.map +1 -0
  32. package/dist/brain/attention-heatmap.js +108 -0
  33. package/dist/brain/attention-heatmap.js.map +1 -0
  34. package/dist/brain/auto-setup.js +19 -14
  35. package/dist/brain/auto-setup.js.map +1 -1
  36. package/dist/brain/auto-update.js +1 -1
  37. package/dist/brain/brain-chat.d.ts +42 -0
  38. package/dist/brain/brain-chat.d.ts.map +1 -0
  39. package/dist/brain/brain-chat.js +162 -0
  40. package/dist/brain/brain-chat.js.map +1 -0
  41. package/dist/brain/brain-encryption.d.ts +14 -0
  42. package/dist/brain/brain-encryption.d.ts.map +1 -0
  43. package/dist/brain/brain-encryption.js +68 -0
  44. package/dist/brain/brain-encryption.js.map +1 -0
  45. package/dist/brain/brain-exchange.d.ts +30 -0
  46. package/dist/brain/brain-exchange.d.ts.map +1 -0
  47. package/dist/brain/brain-exchange.js +106 -0
  48. package/dist/brain/brain-exchange.js.map +1 -0
  49. package/dist/brain/brain-garden.d.ts +18 -0
  50. package/dist/brain/brain-garden.d.ts.map +1 -0
  51. package/dist/brain/brain-garden.js +81 -0
  52. package/dist/brain/brain-garden.js.map +1 -0
  53. package/dist/brain/brain-portability.js +1 -1
  54. package/dist/brain/branch-brain.d.ts +23 -0
  55. package/dist/brain/branch-brain.d.ts.map +1 -0
  56. package/dist/brain/branch-brain.js +159 -0
  57. package/dist/brain/branch-brain.js.map +1 -0
  58. package/dist/brain/calibration-monitor.d.ts +20 -0
  59. package/dist/brain/calibration-monitor.d.ts.map +1 -0
  60. package/dist/brain/calibration-monitor.js +144 -0
  61. package/dist/brain/calibration-monitor.js.map +1 -0
  62. package/dist/brain/causal-chains.d.ts +37 -0
  63. package/dist/brain/causal-chains.d.ts.map +1 -0
  64. package/dist/brain/causal-chains.js +250 -0
  65. package/dist/brain/causal-chains.js.map +1 -0
  66. package/dist/brain/collision-detective.d.ts +32 -0
  67. package/dist/brain/collision-detective.d.ts.map +1 -0
  68. package/dist/brain/collision-detective.js +233 -0
  69. package/dist/brain/collision-detective.js.map +1 -0
  70. package/dist/brain/cost-aware-spawner.d.ts +7 -0
  71. package/dist/brain/cost-aware-spawner.d.ts.map +1 -0
  72. package/dist/brain/cost-aware-spawner.js +77 -0
  73. package/dist/brain/cost-aware-spawner.js.map +1 -0
  74. package/dist/brain/dream-engine.d.ts +35 -0
  75. package/dist/brain/dream-engine.d.ts.map +1 -0
  76. package/dist/brain/dream-engine.js +273 -0
  77. package/dist/brain/dream-engine.js.map +1 -0
  78. package/dist/brain/embeddings.d.ts +27 -0
  79. package/dist/brain/embeddings.d.ts.map +1 -0
  80. package/dist/brain/embeddings.js +175 -0
  81. package/dist/brain/embeddings.js.map +1 -0
  82. package/dist/brain/forgetting-curve.d.ts +21 -0
  83. package/dist/brain/forgetting-curve.d.ts.map +1 -0
  84. package/dist/brain/forgetting-curve.js +174 -0
  85. package/dist/brain/forgetting-curve.js.map +1 -0
  86. package/dist/brain/formal-verification-bridge.d.ts +26 -0
  87. package/dist/brain/formal-verification-bridge.d.ts.map +1 -0
  88. package/dist/brain/formal-verification-bridge.js +219 -0
  89. package/dist/brain/formal-verification-bridge.js.map +1 -0
  90. package/dist/brain/global-brain.d.ts +63 -0
  91. package/dist/brain/global-brain.d.ts.map +1 -0
  92. package/dist/brain/global-brain.js +348 -0
  93. package/dist/brain/global-brain.js.map +1 -0
  94. package/dist/brain/hallucination-quarantine.d.ts +26 -0
  95. package/dist/brain/hallucination-quarantine.d.ts.map +1 -0
  96. package/dist/brain/hallucination-quarantine.js +135 -0
  97. package/dist/brain/hallucination-quarantine.js.map +1 -0
  98. package/dist/brain/hive-accelerator.d.ts +39 -0
  99. package/dist/brain/hive-accelerator.d.ts.map +1 -0
  100. package/dist/brain/hive-accelerator.js +152 -0
  101. package/dist/brain/hive-accelerator.js.map +1 -0
  102. package/dist/brain/json-output.d.ts +26 -0
  103. package/dist/brain/json-output.d.ts.map +1 -0
  104. package/dist/brain/json-output.js +112 -0
  105. package/dist/brain/json-output.js.map +1 -0
  106. package/dist/brain/l0-cache.d.ts +40 -0
  107. package/dist/brain/l0-cache.d.ts.map +1 -0
  108. package/dist/brain/l0-cache.js +176 -0
  109. package/dist/brain/l0-cache.js.map +1 -0
  110. package/dist/brain/local-llm.d.ts +20 -0
  111. package/dist/brain/local-llm.d.ts.map +1 -0
  112. package/dist/brain/local-llm.js +132 -0
  113. package/dist/brain/local-llm.js.map +1 -0
  114. package/dist/brain/mcp-server.d.ts +44 -0
  115. package/dist/brain/mcp-server.d.ts.map +1 -1
  116. package/dist/brain/mcp-server.js +486 -12
  117. package/dist/brain/mcp-server.js.map +1 -1
  118. package/dist/brain/model-registry.d.ts +96 -0
  119. package/dist/brain/model-registry.d.ts.map +1 -0
  120. package/dist/brain/model-registry.js +585 -0
  121. package/dist/brain/model-registry.js.map +1 -0
  122. package/dist/brain/orchestrator.js +1 -1
  123. package/dist/brain/pr-auto-review.d.ts +17 -0
  124. package/dist/brain/pr-auto-review.d.ts.map +1 -0
  125. package/dist/brain/pr-auto-review.js +73 -0
  126. package/dist/brain/pr-auto-review.js.map +1 -0
  127. package/dist/brain/pre-mortem.d.ts +21 -0
  128. package/dist/brain/pre-mortem.d.ts.map +1 -0
  129. package/dist/brain/pre-mortem.js +210 -0
  130. package/dist/brain/pre-mortem.js.map +1 -0
  131. package/dist/brain/prompt-cache.d.ts +54 -0
  132. package/dist/brain/prompt-cache.d.ts.map +1 -0
  133. package/dist/brain/prompt-cache.js +105 -0
  134. package/dist/brain/prompt-cache.js.map +1 -0
  135. package/dist/brain/reputation-ledger.d.ts +42 -0
  136. package/dist/brain/reputation-ledger.d.ts.map +1 -0
  137. package/dist/brain/reputation-ledger.js +326 -0
  138. package/dist/brain/reputation-ledger.js.map +1 -0
  139. package/dist/brain/session-hooks.d.ts +47 -0
  140. package/dist/brain/session-hooks.d.ts.map +1 -0
  141. package/dist/brain/session-hooks.js +706 -0
  142. package/dist/brain/session-hooks.js.map +1 -0
  143. package/dist/brain/subagent-bridge.d.ts +46 -0
  144. package/dist/brain/subagent-bridge.d.ts.map +1 -0
  145. package/dist/brain/subagent-bridge.js +364 -0
  146. package/dist/brain/subagent-bridge.js.map +1 -0
  147. package/dist/brain/subconscious.d.ts +34 -0
  148. package/dist/brain/subconscious.d.ts.map +1 -0
  149. package/dist/brain/subconscious.js +275 -0
  150. package/dist/brain/subconscious.js.map +1 -0
  151. package/dist/brain/swarm-debate.d.ts +22 -0
  152. package/dist/brain/swarm-debate.d.ts.map +1 -0
  153. package/dist/brain/swarm-debate.js +134 -0
  154. package/dist/brain/swarm-debate.js.map +1 -0
  155. package/dist/brain/team-brain-sync.d.ts +22 -0
  156. package/dist/brain/team-brain-sync.d.ts.map +1 -0
  157. package/dist/brain/team-brain-sync.js +132 -0
  158. package/dist/brain/team-brain-sync.js.map +1 -0
  159. package/dist/brain/token-economy.d.ts +25 -0
  160. package/dist/brain/token-economy.d.ts.map +1 -0
  161. package/dist/brain/token-economy.js +216 -0
  162. package/dist/brain/token-economy.js.map +1 -0
  163. package/dist/brain/voice-mode.d.ts +15 -0
  164. package/dist/brain/voice-mode.d.ts.map +1 -0
  165. package/dist/brain/voice-mode.js +97 -0
  166. package/dist/brain/voice-mode.js.map +1 -0
  167. package/dist/cli.js +990 -6
  168. package/dist/cli.js.map +1 -1
  169. package/dist/dashboard/server.d.ts +6 -0
  170. package/dist/dashboard/server.d.ts.map +1 -1
  171. package/dist/dashboard/server.js +1118 -368
  172. package/dist/dashboard/server.js.map +1 -1
  173. package/dist/dashboard/v6-dashboard-html.d.ts +2 -0
  174. package/dist/dashboard/v6-dashboard-html.d.ts.map +1 -0
  175. package/dist/dashboard/v6-dashboard-html.js +2474 -0
  176. package/dist/dashboard/v6-dashboard-html.js.map +1 -0
  177. package/dist/index.d.ts +27 -0
  178. package/dist/index.d.ts.map +1 -1
  179. package/dist/index.js +29 -1
  180. package/dist/index.js.map +1 -1
  181. package/dist/types.d.ts +644 -1
  182. package/dist/types.d.ts.map +1 -1
  183. package/package.json +77 -12
@@ -0,0 +1,273 @@
1
+ // src/brain/dream-engine.ts — Dream Engine (background reflection)
2
+ // v6.0.0 — Hive Mind Edition
3
+ //
4
+ // LLMs are always reactive. Shadow Brain is the first dev tool with a
5
+ // REFLECTIVE IDLE LOOP. When no agent is active for `idleThresholdMs`, the
6
+ // Dream Engine wakes up and:
7
+ // - Re-reads recent decisions with fresh context
8
+ // - Runs counterfactual analysis ("what if X instead of Y?")
9
+ // - Strengthens validated patterns, weakens falsified ones
10
+ // - Drops "dream insights" into the brain, flagged for next session
11
+ //
12
+ // Uses Local LLM (Ollama) by default — 100% local, free, offline-capable.
13
+ import * as fs from 'fs';
14
+ import * as path from 'path';
15
+ import * as os from 'os';
16
+ import * as crypto from 'crypto';
17
+ import { getGlobalBrain } from './global-brain.js';
18
+ import { getLocalLLM } from './local-llm.js';
19
+ import { getModelRegistry } from './model-registry.js';
20
+ import { generateJson, z } from './json-output.js';
21
+ const DREAMS_PATH = path.join(os.homedir(), '.shadow-brain', 'dreams.json');
22
+ const DEFAULT_CONFIG = {
23
+ enabled: true,
24
+ idleThresholdMs: 5 * 60 * 1000,
25
+ maxDreamsPerCycle: 5,
26
+ useLocalLLM: true,
27
+ dreamIntervalMs: 10 * 60 * 1000,
28
+ };
29
+ function emptyStats() {
30
+ return {
31
+ totalDreams: 0,
32
+ byType: { revisit: 0, counterfactual: 0, consolidation: 0, contradiction: 0, 'pattern-discovery': 0 },
33
+ avgConfidence: 0,
34
+ actionableCount: 0,
35
+ acknowledgedCount: 0,
36
+ lastDreamAt: null,
37
+ totalDreamTimeMs: 0,
38
+ };
39
+ }
40
+ export class DreamEngine {
41
+ constructor(opts = {}) {
42
+ this.dreams = new Map();
43
+ this.stats = emptyStats();
44
+ this.lastActivityAt = Date.now();
45
+ this.cycleTimer = null;
46
+ this.initialized = false;
47
+ this.brain = getGlobalBrain();
48
+ this.llm = getLocalLLM();
49
+ this.config = { ...DEFAULT_CONFIG, ...opts };
50
+ }
51
+ async init() {
52
+ if (this.initialized)
53
+ return;
54
+ fs.mkdirSync(path.dirname(DREAMS_PATH), { recursive: true });
55
+ await this.brain.init();
56
+ if (fs.existsSync(DREAMS_PATH)) {
57
+ try {
58
+ const raw = fs.readFileSync(DREAMS_PATH, 'utf-8');
59
+ const parsed = JSON.parse(raw);
60
+ for (const d of parsed.dreams ?? []) {
61
+ this.dreams.set(d.id, { ...d, generatedAt: new Date(d.generatedAt) });
62
+ }
63
+ if (parsed.stats) {
64
+ this.stats = {
65
+ ...emptyStats(),
66
+ ...parsed.stats,
67
+ lastDreamAt: parsed.stats.lastDreamAt ? new Date(parsed.stats.lastDreamAt) : null,
68
+ };
69
+ }
70
+ this.lastActivityAt = parsed.lastActivityAt ?? Date.now();
71
+ }
72
+ catch {
73
+ /* corrupt — fresh */
74
+ }
75
+ }
76
+ this.initialized = true;
77
+ }
78
+ /** Record that SOMETHING happened (agent activity). Resets idle timer. */
79
+ noteActivity() {
80
+ this.lastActivityAt = Date.now();
81
+ }
82
+ /** Start background reflection loop. Safe to call once; no-op if already running. */
83
+ async start() {
84
+ await this.init();
85
+ if (!this.config.enabled)
86
+ return;
87
+ if (this.cycleTimer)
88
+ return;
89
+ this.cycleTimer = setInterval(() => this.tick().catch(() => { }), this.config.dreamIntervalMs);
90
+ // Avoid preventing the process from exiting
91
+ this.cycleTimer.unref?.();
92
+ }
93
+ async stop() {
94
+ if (this.cycleTimer)
95
+ clearInterval(this.cycleTimer);
96
+ this.cycleTimer = null;
97
+ await this.persist();
98
+ }
99
+ /** Run a single reflection pass. Exposed for tests + manual triggering. */
100
+ async dreamOnce() {
101
+ await this.init();
102
+ const since = Date.now() - this.config.idleThresholdMs;
103
+ if (Date.now() - this.lastActivityAt < this.config.idleThresholdMs) {
104
+ return []; // not idle yet
105
+ }
106
+ const start = Date.now();
107
+ const recent = this.brain.recall({ limit: 40 });
108
+ if (recent.length < 3)
109
+ return [];
110
+ void since;
111
+ const newDreams = [];
112
+ const available = await this.llm.isAvailable();
113
+ for (const type of ['revisit', 'counterfactual', 'consolidation', 'contradiction', 'pattern-discovery']) {
114
+ if (newDreams.length >= this.config.maxDreamsPerCycle)
115
+ break;
116
+ const dream = await this.generate(type, recent, available);
117
+ if (dream) {
118
+ this.dreams.set(dream.id, dream);
119
+ this.stats.totalDreams++;
120
+ this.stats.byType[type]++;
121
+ if (dream.actOnNextSession)
122
+ this.stats.actionableCount++;
123
+ const n = this.stats.totalDreams;
124
+ this.stats.avgConfidence = this.stats.avgConfidence + (dream.confidence - this.stats.avgConfidence) / n;
125
+ newDreams.push(dream);
126
+ }
127
+ }
128
+ this.stats.lastDreamAt = new Date();
129
+ this.stats.totalDreamTimeMs += Date.now() - start;
130
+ await this.persist();
131
+ return newDreams;
132
+ }
133
+ listDreams(opts = {}) {
134
+ const all = Array.from(this.dreams.values()).sort((a, b) => b.generatedAt.getTime() - a.generatedAt.getTime());
135
+ return all
136
+ .filter(d => !opts.type || d.type === opts.type)
137
+ .filter(d => !opts.unacknowledgedOnly || !d.acknowledged)
138
+ .slice(0, opts.limit ?? 20);
139
+ }
140
+ async acknowledge(dreamId) {
141
+ await this.init();
142
+ const d = this.dreams.get(dreamId);
143
+ if (!d)
144
+ return false;
145
+ d.acknowledged = true;
146
+ this.stats.acknowledgedCount++;
147
+ await this.persist();
148
+ return true;
149
+ }
150
+ getStats() {
151
+ return JSON.parse(JSON.stringify(this.stats));
152
+ }
153
+ // ── Internals ─────────────────────────────────────────────────────────────
154
+ async tick() {
155
+ if (!this.config.enabled)
156
+ return;
157
+ if (Date.now() - this.lastActivityAt < this.config.idleThresholdMs)
158
+ return;
159
+ await this.dreamOnce().catch(() => { });
160
+ }
161
+ async generate(type, recent, llmAvailable) {
162
+ const seeds = recent.slice(0, 6);
163
+ const sourceIds = seeds.map(s => s.id);
164
+ const bullets = seeds.map((s, i) => `${i + 1}. [${s.category}] ${s.content.slice(0, 160)}`).join('\n');
165
+ let content;
166
+ let confidence = 0.55;
167
+ let actionable = false;
168
+ // Prefer ModelRegistry (respects user's lead provider + caching) — fall back to LocalLLM
169
+ const DreamSchema = z.object({
170
+ content: z.string().min(4).max(900),
171
+ confidence: z.number().min(0).max(1),
172
+ actionable: z.boolean().optional(),
173
+ });
174
+ try {
175
+ const registry = getModelRegistry();
176
+ await registry.init();
177
+ const intel = registry.getIntelligence();
178
+ const canUseRegistry = intel.leadProvider !== 'none' && llmAvailable;
179
+ if (canUseRegistry) {
180
+ const prompt = this.promptForType(type, bullets) + '\n\nReply as JSON: {"content": "<insight>", "confidence": 0.0-1.0, "actionable": true|false}';
181
+ const result = await generateJson(prompt, DreamSchema, {
182
+ system: 'You are Shadow Brain\'s reflective dream engine. Be terse. Output JSON only.',
183
+ featureName: 'dream-engine',
184
+ maxTokens: 300,
185
+ fallback: { content: this.syntheticDream(type, seeds), confidence: 0.4 },
186
+ });
187
+ content = result.value.content.slice(0, 600);
188
+ confidence = Math.max(0.3, Math.min(1, result.value.confidence));
189
+ actionable = !!result.value.actionable;
190
+ }
191
+ else if (llmAvailable) {
192
+ // LocalLLM free-text fallback
193
+ const prompt = this.promptForType(type, bullets);
194
+ const res = await this.llm.generate(prompt, 'You are a reflective assistant inside Shadow Brain. Speak tersely.');
195
+ content = res.text.trim();
196
+ confidence = res.provider === 'none' ? 0.4 : 0.7;
197
+ }
198
+ else {
199
+ content = this.syntheticDream(type, seeds);
200
+ }
201
+ }
202
+ catch {
203
+ content = this.syntheticDream(type, seeds);
204
+ }
205
+ if (!content)
206
+ return null;
207
+ return {
208
+ id: `dream-${crypto.randomBytes(6).toString('hex')}`,
209
+ type,
210
+ content: content.slice(0, 600),
211
+ sourceMemoryIds: sourceIds,
212
+ confidence,
213
+ generatedAt: new Date(),
214
+ actOnNextSession: actionable || (confidence >= 0.6 && (type === 'contradiction' || type === 'pattern-discovery')),
215
+ acknowledged: false,
216
+ };
217
+ }
218
+ promptForType(type, bullets) {
219
+ switch (type) {
220
+ case 'revisit':
221
+ return `Revisit these recent decisions and note anything you would change with fresh eyes. Reply in two sentences max.\n\n${bullets}`;
222
+ case 'counterfactual':
223
+ return `Pick the single riskiest decision below and describe in two sentences a counterfactual — what if we had chosen differently?\n\n${bullets}`;
224
+ case 'consolidation':
225
+ return `Extract at most one generalizable pattern from these decisions, in one sentence.\n\n${bullets}`;
226
+ case 'contradiction':
227
+ return `Are any of these decisions in tension with each other? If yes, name the tension in two sentences. If no, say "none".\n\n${bullets}`;
228
+ case 'pattern-discovery':
229
+ return `Find one repeating theme across these items that could become a project principle. Reply with one short sentence.\n\n${bullets}`;
230
+ }
231
+ }
232
+ syntheticDream(type, seeds) {
233
+ const cat = seeds[0]?.category ?? 'general';
234
+ switch (type) {
235
+ case 'revisit':
236
+ return `Reviewed ${seeds.length} recent ${cat} decisions; no fresh counter-evidence detected.`;
237
+ case 'counterfactual':
238
+ return `Counterfactual on recent ${cat}: the inverse choice would have traded simplicity for control.`;
239
+ case 'consolidation':
240
+ return `Recurring ${cat} theme: prefer explicit contracts over implicit state.`;
241
+ case 'contradiction':
242
+ return `No hard contradictions found across recent ${cat} decisions.`;
243
+ case 'pattern-discovery':
244
+ return `Emerging ${cat} principle: invariants belong at the edges, not the middle.`;
245
+ }
246
+ }
247
+ async persist() {
248
+ try {
249
+ const payload = {
250
+ schemaVersion: 1,
251
+ dreams: Array.from(this.dreams.values()),
252
+ stats: this.stats,
253
+ lastActivityAt: this.lastActivityAt,
254
+ };
255
+ const tmp = DREAMS_PATH + '.tmp';
256
+ fs.writeFileSync(tmp, JSON.stringify(payload, null, 2));
257
+ fs.renameSync(tmp, DREAMS_PATH);
258
+ }
259
+ catch {
260
+ /* non-fatal */
261
+ }
262
+ }
263
+ }
264
+ let _instance = null;
265
+ export function getDreamEngine(opts) {
266
+ if (!_instance)
267
+ _instance = new DreamEngine(opts);
268
+ return _instance;
269
+ }
270
+ export function resetDreamEngineForTests() {
271
+ _instance = null;
272
+ }
273
+ //# sourceMappingURL=dream-engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dream-engine.js","sourceRoot":"","sources":["../../src/brain/dream-engine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ export declare class Embeddings {
2
+ private cache;
3
+ private ollamaModel;
4
+ private ollamaBaseUrl;
5
+ private initialized;
6
+ init(): Promise<void>;
7
+ /** Embed a string — returns a unit-norm vector. Uses cache when available. */
8
+ embed(text: string): Promise<number[]>;
9
+ /** Cosine similarity between two same-length vectors (L2-normalized assumed). */
10
+ static cosine(a: number[], b: number[]): number;
11
+ /** Rank candidates by cosine similarity to the query embedding. */
12
+ semanticSearch(query: string, candidates: Array<{
13
+ id: string;
14
+ text: string;
15
+ }>, topK?: number): Promise<Array<{
16
+ id: string;
17
+ score: number;
18
+ }>>;
19
+ flush(): Promise<void>;
20
+ private embedOllama;
21
+ /** Zero-dep local embedding: char tri-grams → hashed bag → dim 128 → TF weighting → L2 normalize. */
22
+ private embedLocal;
23
+ private persist;
24
+ }
25
+ export declare function getEmbeddings(): Embeddings;
26
+ export declare function resetEmbeddingsForTests(): void;
27
+ //# sourceMappingURL=embeddings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embeddings.d.ts","sourceRoot":"","sources":["../../src/brain/embeddings.ts"],"names":[],"mappings":"AAqBA,qBAAa,UAAU;IACrB,OAAO,CAAC,KAAK,CAAoC;IACjD,OAAO,CAAC,WAAW,CAAuB;IAC1C,OAAO,CAAC,aAAa,CAAoC;IACzD,OAAO,CAAC,WAAW,CAAS;IAEtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAgC3B,8EAA8E;IACxE,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAe5C,iFAAiF;IACjF,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM;IAO/C,mEAAmE;IAC7D,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,EAAE,IAAI,SAAK,GAAG,OAAO,CAAC,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAYxI,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;YAId,WAAW;IAezB,qGAAqG;IACrG,OAAO,CAAC,UAAU;YAqBJ,OAAO;CAYtB;AAeD,wBAAgB,aAAa,IAAI,UAAU,CAG1C;AACD,wBAAgB,uBAAuB,IAAI,IAAI,CAAsB"}
@@ -0,0 +1,175 @@
1
+ // src/brain/embeddings.ts — Lightweight embeddings + semantic search
2
+ // v6.0.0 — Hive Mind Edition
3
+ //
4
+ // Uses a local hashing-based embedding (tfidf + char n-grams) for zero-dep
5
+ // semantic recall. If Ollama is available with an embedding model
6
+ // (nomic-embed-text, mxbai-embed-large, all-minilm), upgrades to real
7
+ // dense embeddings automatically.
8
+ //
9
+ // Exposed: embed(text), cosineSim(a,b), semanticSearch(query, candidates)
10
+ import * as fs from 'fs';
11
+ import * as path from 'path';
12
+ import * as os from 'os';
13
+ import { getModelRegistry } from './model-registry.js';
14
+ const CACHE_DIR = path.join(os.homedir(), '.shadow-brain', 'embeddings');
15
+ const CACHE_PATH = path.join(CACHE_DIR, 'vectors.json');
16
+ const EMB_DIM = 128;
17
+ export class Embeddings {
18
+ constructor() {
19
+ this.cache = new Map();
20
+ this.ollamaModel = null;
21
+ this.ollamaBaseUrl = 'http://127.0.0.1:11434';
22
+ this.initialized = false;
23
+ }
24
+ async init() {
25
+ if (this.initialized)
26
+ return;
27
+ fs.mkdirSync(CACHE_DIR, { recursive: true });
28
+ if (fs.existsSync(CACHE_PATH)) {
29
+ try {
30
+ const parsed = JSON.parse(fs.readFileSync(CACHE_PATH, 'utf-8'));
31
+ for (const [k, v] of Object.entries(parsed.vectors ?? {}))
32
+ this.cache.set(k, v);
33
+ }
34
+ catch { /* skip */ }
35
+ }
36
+ // Probe for Ollama embedding model
37
+ try {
38
+ const reg = getModelRegistry();
39
+ await reg.init();
40
+ const ollama = reg.getProvider('ollama');
41
+ if (ollama?.enabled) {
42
+ this.ollamaBaseUrl = ollama.baseUrl;
43
+ const res = await fetch(this.ollamaBaseUrl + '/api/tags', { signal: AbortSignal.timeout(2000) });
44
+ if (res.ok) {
45
+ const json = await res.json();
46
+ const preferred = ['nomic-embed-text', 'mxbai-embed-large', 'all-minilm'];
47
+ for (const pref of preferred) {
48
+ const match = json.models?.find(m => m.name.startsWith(pref));
49
+ if (match) {
50
+ this.ollamaModel = match.name;
51
+ break;
52
+ }
53
+ }
54
+ }
55
+ }
56
+ }
57
+ catch { /* no ollama */ }
58
+ this.initialized = true;
59
+ }
60
+ /** Embed a string — returns a unit-norm vector. Uses cache when available. */
61
+ async embed(text) {
62
+ await this.init();
63
+ const trimmed = (text || '').slice(0, 8000);
64
+ const cached = this.cache.get(trimmed);
65
+ if (cached)
66
+ return cached;
67
+ let vec = null;
68
+ if (this.ollamaModel)
69
+ vec = await this.embedOllama(trimmed).catch(() => null);
70
+ if (!vec)
71
+ vec = this.embedLocal(trimmed);
72
+ this.cache.set(trimmed, vec);
73
+ if (this.cache.size % 25 === 0)
74
+ this.persist().catch(() => { });
75
+ return vec;
76
+ }
77
+ /** Cosine similarity between two same-length vectors (L2-normalized assumed). */
78
+ static cosine(a, b) {
79
+ let dot = 0;
80
+ const n = Math.min(a.length, b.length);
81
+ for (let i = 0; i < n; i++)
82
+ dot += a[i] * b[i];
83
+ return dot;
84
+ }
85
+ /** Rank candidates by cosine similarity to the query embedding. */
86
+ async semanticSearch(query, candidates, topK = 20) {
87
+ await this.init();
88
+ const q = await this.embed(query);
89
+ const scored = [];
90
+ for (const c of candidates) {
91
+ const v = await this.embed(c.text);
92
+ scored.push({ id: c.id, score: Embeddings.cosine(q, v) });
93
+ }
94
+ scored.sort((a, b) => b.score - a.score);
95
+ return scored.slice(0, topK);
96
+ }
97
+ async flush() { await this.persist(); }
98
+ // ── Internals ─────────────────────────────────────────────────────────
99
+ async embedOllama(text) {
100
+ try {
101
+ const res = await fetch(this.ollamaBaseUrl + '/api/embeddings', {
102
+ method: 'POST', headers: { 'Content-Type': 'application/json' },
103
+ body: JSON.stringify({ model: this.ollamaModel, prompt: text }),
104
+ signal: AbortSignal.timeout(30000),
105
+ });
106
+ if (!res.ok)
107
+ return null;
108
+ const json = await res.json();
109
+ if (!json.embedding || !json.embedding.length)
110
+ return null;
111
+ // L2 normalize
112
+ return normalize(json.embedding);
113
+ }
114
+ catch {
115
+ return null;
116
+ }
117
+ }
118
+ /** Zero-dep local embedding: char tri-grams → hashed bag → dim 128 → TF weighting → L2 normalize. */
119
+ embedLocal(text) {
120
+ const vec = new Array(EMB_DIM).fill(0);
121
+ const norm = text.toLowerCase().replace(/[^a-z0-9\s]/g, ' ');
122
+ // word unigrams
123
+ const tokens = norm.split(/\s+/).filter(t => t.length > 1);
124
+ const stopwords = new Set(['the', 'a', 'an', 'and', 'or', 'of', 'to', 'for', 'in', 'on', 'is', 'it', 'this', 'that', 'as', 'by', 'be', 'do']);
125
+ for (const t of tokens) {
126
+ if (stopwords.has(t))
127
+ continue;
128
+ const h = hash32(t) % EMB_DIM;
129
+ vec[h] += 1 + Math.log(t.length);
130
+ }
131
+ // char tri-grams for fuzzy matching
132
+ for (let i = 0; i <= norm.length - 3; i++) {
133
+ const tri = norm.slice(i, i + 3);
134
+ if (!/\S/.test(tri))
135
+ continue;
136
+ const h = (hash32(tri) * 17) % EMB_DIM;
137
+ vec[h] += 0.3;
138
+ }
139
+ return normalize(vec);
140
+ }
141
+ async persist() {
142
+ try {
143
+ const shape = {
144
+ schemaVersion: 1,
145
+ vectors: Object.fromEntries(this.cache.entries()),
146
+ lastProvider: this.ollamaModel ? 'ollama' : 'local',
147
+ };
148
+ const tmp = CACHE_PATH + '.tmp';
149
+ fs.writeFileSync(tmp, JSON.stringify(shape));
150
+ fs.renameSync(tmp, CACHE_PATH);
151
+ }
152
+ catch { /* non-fatal */ }
153
+ }
154
+ }
155
+ function hash32(s) {
156
+ let h = 2166136261;
157
+ for (let i = 0; i < s.length; i++)
158
+ h = Math.imul(h ^ s.charCodeAt(i), 16777619);
159
+ return h >>> 0;
160
+ }
161
+ function normalize(v) {
162
+ let n = 0;
163
+ for (const x of v)
164
+ n += x * x;
165
+ n = Math.sqrt(n) || 1;
166
+ return v.map(x => x / n);
167
+ }
168
+ let _instance = null;
169
+ export function getEmbeddings() {
170
+ if (!_instance)
171
+ _instance = new Embeddings();
172
+ return _instance;
173
+ }
174
+ export function resetEmbeddingsForTests() { _instance = null; }
175
+ //# sourceMappingURL=embeddings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embeddings.js","sourceRoot":"","sources":["../../src/brain/embeddings.ts"],"names":[],"mappings":"AAAA,qEAAqE;AACrE,6BAA6B;AAC7B,EAAE;AACF,2EAA2E;AAC3E,kEAAkE;AAClE,sEAAsE;AACtE,kCAAkC;AAClC,EAAE;AACF,0EAA0E;AAE1E,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAEvD,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,eAAe,EAAE,YAAY,CAAC,CAAC;AACzE,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;AACxD,MAAM,OAAO,GAAG,GAAG,CAAC;AAIpB,MAAM,OAAO,UAAU;IAAvB;QACU,UAAK,GAA0B,IAAI,GAAG,EAAE,CAAC;QACzC,gBAAW,GAAkB,IAAI,CAAC;QAClC,kBAAa,GAAW,wBAAwB,CAAC;QACjD,gBAAW,GAAG,KAAK,CAAC;IA4H9B,CAAC;IA1HC,KAAK,CAAC,IAAI;QACR,IAAI,IAAI,CAAC,WAAW;YAAE,OAAO;QAC7B,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7C,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC9B,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAU,CAAC;gBACzE,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC;oBAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAClF,CAAC;YAAC,MAAM,CAAC,CAAC,UAAU,CAAC,CAAC;QACxB,CAAC;QAED,mCAAmC;QACnC,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,gBAAgB,EAAE,CAAC;YAC/B,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;YACjB,MAAM,MAAM,GAAG,GAAG,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;YACzC,IAAI,MAAM,EAAE,OAAO,EAAE,CAAC;gBACpB,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC,OAAO,CAAC;gBACpC,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,aAAa,GAAG,WAAW,EAAE,EAAE,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBACjG,IAAI,GAAG,CAAC,EAAE,EAAE,CAAC;oBACX,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAA0C,CAAC;oBACtE,MAAM,SAAS,GAAG,CAAC,kBAAkB,EAAE,mBAAmB,EAAE,YAAY,CAAC,CAAC;oBAC1E,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;wBAC7B,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;wBAC9D,IAAI,KAAK,EAAE,CAAC;4BAAC,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC,IAAI,CAAC;4BAAC,MAAM;wBAAC,CAAC;oBACtD,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC;QAE3B,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;IAC1B,CAAC;IAED,8EAA8E;IAC9E,KAAK,CAAC,KAAK,CAAC,IAAY;QACtB,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAClB,MAAM,OAAO,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;QAC5C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACvC,IAAI,MAAM;YAAE,OAAO,MAAM,CAAC;QAE1B,IAAI,GAAG,GAAoB,IAAI,CAAC;QAChC,IAAI,IAAI,CAAC,WAAW;YAAE,GAAG,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;QAC9E,IAAI,CAAC,GAAG;YAAE,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QAEzC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QAC7B,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,EAAE,KAAK,CAAC;YAAE,IAAI,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAC/D,OAAO,GAAG,CAAC;IACb,CAAC;IAED,iFAAiF;IACjF,MAAM,CAAC,MAAM,CAAC,CAAW,EAAE,CAAW;QACpC,IAAI,GAAG,GAAG,CAAC,CAAC;QACZ,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC;QACvC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;YAAE,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/C,OAAO,GAAG,CAAC;IACb,CAAC;IAED,mEAAmE;IACnE,KAAK,CAAC,cAAc,CAAC,KAAa,EAAE,UAA+C,EAAE,IAAI,GAAG,EAAE;QAC5F,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAClB,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAClC,MAAM,MAAM,GAAyC,EAAE,CAAC;QACxD,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;YAC3B,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YACnC,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;QAC5D,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;QACzC,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,KAAK,KAAoB,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IAEtD,yEAAyE;IAEjE,KAAK,CAAC,WAAW,CAAC,IAAY;QACpC,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,aAAa,GAAG,iBAAiB,EAAE;gBAC9D,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;gBAC/D,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;gBAC/D,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,KAAM,CAAC;aACpC,CAAC,CAAC;YACH,IAAI,CAAC,GAAG,CAAC,EAAE;gBAAE,OAAO,IAAI,CAAC;YACzB,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAA8B,CAAC;YAC1D,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM;gBAAE,OAAO,IAAI,CAAC;YAC3D,eAAe;YACf,OAAO,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACnC,CAAC;QAAC,MAAM,CAAC;YAAC,OAAO,IAAI,CAAC;QAAC,CAAC;IAC1B,CAAC;IAED,qGAAqG;IAC7F,UAAU,CAAC,IAAY;QAC7B,MAAM,GAAG,GAAG,IAAI,KAAK,CAAS,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC/C,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC;QAC7D,gBAAgB;QAChB,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC3D,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,CAAC,KAAK,EAAC,GAAG,EAAC,IAAI,EAAC,KAAK,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,KAAK,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,MAAM,EAAC,MAAM,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,CAAC,CAAC;QAC7H,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;YACvB,IAAI,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;gBAAE,SAAS;YAC/B,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC;YAC9B,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QACnC,CAAC;QACD,oCAAoC;QACpC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC1C,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;YACjC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;gBAAE,SAAS;YAC9B,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,OAAO,CAAC;YACvC,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC;QAChB,CAAC;QACD,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC;IACxB,CAAC;IAEO,KAAK,CAAC,OAAO;QACnB,IAAI,CAAC;YACH,MAAM,KAAK,GAAU;gBACnB,aAAa,EAAE,CAAC;gBAChB,OAAO,EAAE,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;gBACjD,YAAY,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO;aACpD,CAAC;YACF,MAAM,GAAG,GAAG,UAAU,GAAG,MAAM,CAAC;YAChC,EAAE,CAAC,aAAa,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;YAC7C,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;QACjC,CAAC;QAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC;IAC7B,CAAC;CACF;AAED,SAAS,MAAM,CAAC,CAAS;IACvB,IAAI,CAAC,GAAG,UAAU,CAAC;IACnB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE;QAAE,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;IAChF,OAAO,CAAC,KAAK,CAAC,CAAC;AACjB,CAAC;AACD,SAAS,SAAS,CAAC,CAAW;IAC5B,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,KAAK,MAAM,CAAC,IAAI,CAAC;QAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC9B,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACtB,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AAC3B,CAAC;AAED,IAAI,SAAS,GAAsB,IAAI,CAAC;AACxC,MAAM,UAAU,aAAa;IAC3B,IAAI,CAAC,SAAS;QAAE,SAAS,GAAG,IAAI,UAAU,EAAE,CAAC;IAC7C,OAAO,SAAS,CAAC;AACnB,CAAC;AACD,MAAM,UAAU,uBAAuB,KAAW,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC"}
@@ -0,0 +1,21 @@
1
+ import { ConsolidationReport, ForgettingState, MemoryTier } from '../types.js';
2
+ export declare class ForgettingCurve {
3
+ private states;
4
+ private reports;
5
+ private cycleCount;
6
+ private initialized;
7
+ init(): Promise<void>;
8
+ track(memoryId: string, initialStrength?: number, consolidatedTier?: MemoryTier): Promise<ForgettingState>;
9
+ reinforce(memoryId: string, strengthBoost?: number): Promise<ForgettingState | null>;
10
+ /** Run a consolidation sleep cycle. Returns a report of changes. */
11
+ runConsolidation(): Promise<ConsolidationReport>;
12
+ getState(memoryId: string): ForgettingState | null;
13
+ listStates(limit?: number): ForgettingState[];
14
+ listReports(limit?: number): ConsolidationReport[];
15
+ private tierForStrength;
16
+ private tierRank;
17
+ private persist;
18
+ }
19
+ export declare function getForgettingCurve(): ForgettingCurve;
20
+ export declare function resetForgettingCurveForTests(): void;
21
+ //# sourceMappingURL=forgetting-curve.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"forgetting-curve.d.ts","sourceRoot":"","sources":["../../src/brain/forgetting-curve.ts"],"names":[],"mappings":"AAcA,OAAO,EACL,mBAAmB,EACnB,eAAe,EACf,UAAU,EACX,MAAM,aAAa,CAAC;AAarB,qBAAa,eAAe;IAC1B,OAAO,CAAC,MAAM,CAA2C;IACzD,OAAO,CAAC,OAAO,CAA6B;IAC5C,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,WAAW,CAAS;IAEtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAkBrB,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,eAAe,SAAM,EAAE,gBAAgB,GAAE,UAAkB,GAAG,OAAO,CAAC,eAAe,CAAC;IAkB9G,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,aAAa,SAAM,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC;IAYvF,oEAAoE;IAC9D,gBAAgB,IAAI,OAAO,CAAC,mBAAmB,CAAC;IAgDtD,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI;IAIlD,UAAU,CAAC,KAAK,SAAK,GAAG,eAAe,EAAE;IAMzC,WAAW,CAAC,KAAK,SAAK,GAAG,mBAAmB,EAAE;IAM9C,OAAO,CAAC,eAAe;IAOvB,OAAO,CAAC,QAAQ;YASF,OAAO;CActB;AAID,wBAAgB,kBAAkB,IAAI,eAAe,CAGpD;AAED,wBAAgB,4BAA4B,IAAI,IAAI,CAEnD"}