@theihtisham/agent-shadow-brain 6.0.0 → 6.0.2

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 (144) hide show
  1. package/README.md +107 -7
  2. package/dist/brain/brain-3d.d.ts +79 -0
  3. package/dist/brain/brain-3d.d.ts.map +1 -0
  4. package/dist/brain/brain-3d.js +468 -0
  5. package/dist/brain/brain-3d.js.map +1 -0
  6. package/dist/brain/brain-active-learner.d.ts +74 -0
  7. package/dist/brain/brain-active-learner.d.ts.map +1 -0
  8. package/dist/brain/brain-active-learner.js +425 -0
  9. package/dist/brain/brain-active-learner.js.map +1 -0
  10. package/dist/brain/brain-ascii.d.ts +32 -0
  11. package/dist/brain/brain-ascii.d.ts.map +1 -0
  12. package/dist/brain/brain-ascii.js +402 -0
  13. package/dist/brain/brain-ascii.js.map +1 -0
  14. package/dist/brain/brain-cinema.d.ts +45 -0
  15. package/dist/brain/brain-cinema.d.ts.map +1 -0
  16. package/dist/brain/brain-cinema.js +393 -0
  17. package/dist/brain/brain-cinema.js.map +1 -0
  18. package/dist/brain/brain-coach.d.ts +45 -0
  19. package/dist/brain/brain-coach.d.ts.map +1 -0
  20. package/dist/brain/brain-coach.js +383 -0
  21. package/dist/brain/brain-coach.js.map +1 -0
  22. package/dist/brain/brain-consolidator.d.ts +56 -0
  23. package/dist/brain/brain-consolidator.d.ts.map +1 -0
  24. package/dist/brain/brain-consolidator.js +386 -0
  25. package/dist/brain/brain-consolidator.js.map +1 -0
  26. package/dist/brain/brain-contradictions.d.ts +57 -0
  27. package/dist/brain/brain-contradictions.d.ts.map +1 -0
  28. package/dist/brain/brain-contradictions.js +443 -0
  29. package/dist/brain/brain-contradictions.js.map +1 -0
  30. package/dist/brain/brain-diff.d.ts +61 -0
  31. package/dist/brain/brain-diff.d.ts.map +1 -0
  32. package/dist/brain/brain-diff.js +439 -0
  33. package/dist/brain/brain-diff.js.map +1 -0
  34. package/dist/brain/brain-dna.d.ts +59 -0
  35. package/dist/brain/brain-dna.d.ts.map +1 -0
  36. package/dist/brain/brain-dna.js +336 -0
  37. package/dist/brain/brain-dna.js.map +1 -0
  38. package/dist/brain/brain-doppelganger.d.ts +32 -0
  39. package/dist/brain/brain-doppelganger.d.ts.map +1 -0
  40. package/dist/brain/brain-doppelganger.js +417 -0
  41. package/dist/brain/brain-doppelganger.js.map +1 -0
  42. package/dist/brain/brain-graph-walker.d.ts +54 -0
  43. package/dist/brain/brain-graph-walker.d.ts.map +1 -0
  44. package/dist/brain/brain-graph-walker.js +412 -0
  45. package/dist/brain/brain-graph-walker.js.map +1 -0
  46. package/dist/brain/brain-holiday-card.d.ts +50 -0
  47. package/dist/brain/brain-holiday-card.d.ts.map +1 -0
  48. package/dist/brain/brain-holiday-card.js +432 -0
  49. package/dist/brain/brain-holiday-card.js.map +1 -0
  50. package/dist/brain/brain-memes.d.ts +44 -0
  51. package/dist/brain/brain-memes.d.ts.map +1 -0
  52. package/dist/brain/brain-memes.js +438 -0
  53. package/dist/brain/brain-memes.js.map +1 -0
  54. package/dist/brain/brain-memory-tiers.d.ts +67 -0
  55. package/dist/brain/brain-memory-tiers.d.ts.map +1 -0
  56. package/dist/brain/brain-memory-tiers.js +292 -0
  57. package/dist/brain/brain-memory-tiers.js.map +1 -0
  58. package/dist/brain/brain-notebook.d.ts +68 -0
  59. package/dist/brain/brain-notebook.d.ts.map +1 -0
  60. package/dist/brain/brain-notebook.js +379 -0
  61. package/dist/brain/brain-notebook.js.map +1 -0
  62. package/dist/brain/brain-quantize.d.ts +62 -0
  63. package/dist/brain/brain-quantize.d.ts.map +1 -0
  64. package/dist/brain/brain-quantize.js +346 -0
  65. package/dist/brain/brain-quantize.js.map +1 -0
  66. package/dist/brain/brain-query-expander.d.ts +31 -0
  67. package/dist/brain/brain-query-expander.d.ts.map +1 -0
  68. package/dist/brain/brain-query-expander.js +417 -0
  69. package/dist/brain/brain-query-expander.js.map +1 -0
  70. package/dist/brain/brain-quest.d.ts +58 -0
  71. package/dist/brain/brain-quest.d.ts.map +1 -0
  72. package/dist/brain/brain-quest.js +541 -0
  73. package/dist/brain/brain-quest.js.map +1 -0
  74. package/dist/brain/brain-recall-cache.d.ts +73 -0
  75. package/dist/brain/brain-recall-cache.d.ts.map +1 -0
  76. package/dist/brain/brain-recall-cache.js +444 -0
  77. package/dist/brain/brain-recall-cache.js.map +1 -0
  78. package/dist/brain/brain-reflex.d.ts +55 -0
  79. package/dist/brain/brain-reflex.d.ts.map +1 -0
  80. package/dist/brain/brain-reflex.js +364 -0
  81. package/dist/brain/brain-reflex.js.map +1 -0
  82. package/dist/brain/brain-replay.d.ts +74 -0
  83. package/dist/brain/brain-replay.d.ts.map +1 -0
  84. package/dist/brain/brain-replay.js +336 -0
  85. package/dist/brain/brain-replay.js.map +1 -0
  86. package/dist/brain/brain-rerank.d.ts +39 -0
  87. package/dist/brain/brain-rerank.d.ts.map +1 -0
  88. package/dist/brain/brain-rerank.js +216 -0
  89. package/dist/brain/brain-rerank.js.map +1 -0
  90. package/dist/brain/brain-roast.d.ts +44 -0
  91. package/dist/brain/brain-roast.d.ts.map +1 -0
  92. package/dist/brain/brain-roast.js +566 -0
  93. package/dist/brain/brain-roast.js.map +1 -0
  94. package/dist/brain/brain-sonification.d.ts +57 -0
  95. package/dist/brain/brain-sonification.d.ts.map +1 -0
  96. package/dist/brain/brain-sonification.js +286 -0
  97. package/dist/brain/brain-sonification.js.map +1 -0
  98. package/dist/brain/brain-tarot.d.ts +49 -0
  99. package/dist/brain/brain-tarot.d.ts.map +1 -0
  100. package/dist/brain/brain-tarot.js +634 -0
  101. package/dist/brain/brain-tarot.js.map +1 -0
  102. package/dist/brain/brain-time-capsule.d.ts +80 -0
  103. package/dist/brain/brain-time-capsule.d.ts.map +1 -0
  104. package/dist/brain/brain-time-capsule.js +289 -0
  105. package/dist/brain/brain-time-capsule.js.map +1 -0
  106. package/dist/brain/brain-trophies.d.ts +60 -0
  107. package/dist/brain/brain-trophies.d.ts.map +1 -0
  108. package/dist/brain/brain-trophies.js +431 -0
  109. package/dist/brain/brain-trophies.js.map +1 -0
  110. package/dist/brain/brain-working-memory.d.ts +78 -0
  111. package/dist/brain/brain-working-memory.d.ts.map +1 -0
  112. package/dist/brain/brain-working-memory.js +367 -0
  113. package/dist/brain/brain-working-memory.js.map +1 -0
  114. package/dist/brain/confidence-gate.d.ts +69 -0
  115. package/dist/brain/confidence-gate.d.ts.map +1 -0
  116. package/dist/brain/confidence-gate.js +244 -0
  117. package/dist/brain/confidence-gate.js.map +1 -0
  118. package/dist/brain/constitution.d.ts +59 -0
  119. package/dist/brain/constitution.d.ts.map +1 -0
  120. package/dist/brain/constitution.js +315 -0
  121. package/dist/brain/constitution.js.map +1 -0
  122. package/dist/brain/embeddings-v2.d.ts +58 -0
  123. package/dist/brain/embeddings-v2.d.ts.map +1 -0
  124. package/dist/brain/embeddings-v2.js +344 -0
  125. package/dist/brain/embeddings-v2.js.map +1 -0
  126. package/dist/brain/hive-voice.d.ts +71 -0
  127. package/dist/brain/hive-voice.d.ts.map +1 -0
  128. package/dist/brain/hive-voice.js +352 -0
  129. package/dist/brain/hive-voice.js.map +1 -0
  130. package/dist/brain/markdown-export.d.ts +48 -0
  131. package/dist/brain/markdown-export.d.ts.map +1 -0
  132. package/dist/brain/markdown-export.js +382 -0
  133. package/dist/brain/markdown-export.js.map +1 -0
  134. package/dist/brain/multimodal-vision.d.ts +38 -0
  135. package/dist/brain/multimodal-vision.d.ts.map +1 -0
  136. package/dist/brain/multimodal-vision.js +257 -0
  137. package/dist/brain/multimodal-vision.js.map +1 -0
  138. package/dist/brain/otel-lite.d.ts +71 -0
  139. package/dist/brain/otel-lite.d.ts.map +1 -0
  140. package/dist/brain/otel-lite.js +232 -0
  141. package/dist/brain/otel-lite.js.map +1 -0
  142. package/dist/cli.js +881 -2
  143. package/dist/cli.js.map +1 -1
  144. package/package.json +2 -2
@@ -0,0 +1,425 @@
1
+ // src/brain/brain-active-learner.ts — learn from accept/reject feedback
2
+ // v6.0.2 — Hive Mind Edition
3
+ //
4
+ // The brain should not be static. When the user accepts recall result A and
5
+ // ignores B for a class of queries, the next similar query should bias toward
6
+ // A's region of the vector space. This module captures that signal and
7
+ // re-ranks candidates accordingly. No LLM, no online gradient descent — just
8
+ // log-odds bias on per-cluster acceptance ratios. Transparent and auditable.
9
+ //
10
+ // Storage layout (per project):
11
+ // ~/.shadow-brain/active-learning/<project>.jsonl — append-only feedback log
12
+ // ~/.shadow-brain/active-learning/<project>-biases.json — derived bias cache
13
+ //
14
+ // Bias model:
15
+ // 1. Cluster query embeddings into k=16 buckets via mini-batch k-means.
16
+ // Falls back to word-bag clustering when the embeddings module isn't
17
+ // available (e.g. tests, offline). Per-cluster counts of accepts/
18
+ // rejects per memoryId.
19
+ // 2. bias(memoryId | cluster) = log((accepts + 1) / (rejects + 1)).
20
+ // Add-one smoothing keeps cold cells well-behaved.
21
+ // 3. Decay older feedback exponentially: w = 0.95^(age_days / 30). Recent
22
+ // corrections dominate, stale preferences fade.
23
+ // 4. score_biased = score * (1 + clamp(0.4 * bias, -0.3, 0.3)). The cap
24
+ // keeps a bad cluster assignment from ever flipping the ranking by
25
+ // more than 30%, so a noisy cluster can't drown out the actual
26
+ // similarity signal.
27
+ //
28
+ // Biases are recomputed at most once per UTC day per project; in-memory
29
+ // values are reused for the rest of the day. Triggering a stats() or bias()
30
+ // call after midnight refreshes them.
31
+ import * as fs from 'fs';
32
+ import * as path from 'path';
33
+ import * as os from 'os';
34
+ const ROOT_DIR = path.join(os.homedir(), '.shadow-brain', 'active-learning');
35
+ const CLUSTER_K = 16;
36
+ const KMEANS_ITERS = 8;
37
+ const HALF_LIFE_DAYS = 30;
38
+ const DECAY_BASE = 0.95;
39
+ const BIAS_GAIN = 0.4;
40
+ const BIAS_CLAMP = 0.3;
41
+ const DAY_MS = 24 * 60 * 60 * 1000;
42
+ export class BrainActiveLearner {
43
+ constructor() {
44
+ this.state = new Map();
45
+ this.embedderPromise = null;
46
+ }
47
+ /** Record a single feedback event. Returns once persisted. */
48
+ async recordFeedback(feedback) {
49
+ const fb = { ...feedback, ts: feedback.ts ?? Date.now() };
50
+ if (!fb.project)
51
+ throw new Error('feedback.project is required');
52
+ const st = await this.loadProject(fb.project);
53
+ st.feedback.push(fb);
54
+ // Invalidate cache so next bias()/stats() recomputes.
55
+ st.biasCache = null;
56
+ await this.append(fb);
57
+ }
58
+ /**
59
+ * Re-rank candidates using accumulated feedback for this project.
60
+ * Returns a new array; does not mutate input. When there is no feedback
61
+ * the candidates pass through unchanged with biasApplied=0.
62
+ */
63
+ async bias(query, candidates, project) {
64
+ if (!candidates || candidates.length === 0)
65
+ return [];
66
+ const st = await this.loadProject(project);
67
+ if (st.feedback.length === 0) {
68
+ return candidates.map(c => ({ ...c, biasApplied: 0 }));
69
+ }
70
+ const cache = await this.ensureBiases(project, st);
71
+ const cluster = await this.assignCluster(query, cache.centroids);
72
+ const clusterBias = cache.byCluster[String(cluster)] ?? {};
73
+ const out = [];
74
+ for (const c of candidates) {
75
+ const b = (clusterBias[c.id] ?? cache.byId[c.id] ?? 0);
76
+ const adj = clamp(BIAS_GAIN * b, -BIAS_CLAMP, BIAS_CLAMP);
77
+ out.push({ id: c.id, score: c.score * (1 + adj), biasApplied: adj });
78
+ }
79
+ out.sort((a, b) => b.score - a.score);
80
+ return out;
81
+ }
82
+ /** Return a summary for the given project. Empty stats when no feedback. */
83
+ stats(project) {
84
+ const st = this.state.get(project);
85
+ if (!st || st.feedback.length === 0) {
86
+ return { totalFeedback: 0, acceptRate: 0, topAccepted: [], topRejected: [], lastUpdated: 0 };
87
+ }
88
+ const accepts = new Map();
89
+ const rejects = new Map();
90
+ let acceptCount = 0;
91
+ let lastUpdated = 0;
92
+ for (const fb of st.feedback) {
93
+ if (fb.ts && fb.ts > lastUpdated)
94
+ lastUpdated = fb.ts;
95
+ if (fb.kind === 'accepted' || fb.kind === 'modified') {
96
+ accepts.set(fb.resultId, (accepts.get(fb.resultId) ?? 0) + 1);
97
+ acceptCount++;
98
+ }
99
+ else if (fb.kind === 'rejected' || fb.kind === 'ignored') {
100
+ rejects.set(fb.resultId, (rejects.get(fb.resultId) ?? 0) + 1);
101
+ }
102
+ }
103
+ return {
104
+ totalFeedback: st.feedback.length,
105
+ acceptRate: st.feedback.length > 0 ? +(acceptCount / st.feedback.length).toFixed(3) : 0,
106
+ topAccepted: topN(accepts, 5),
107
+ topRejected: topN(rejects, 5),
108
+ lastUpdated,
109
+ };
110
+ }
111
+ /** Export feedback + derived biases for backup / inspection. */
112
+ async export(project) {
113
+ const st = await this.loadProject(project);
114
+ const cache = await this.ensureBiases(project, st);
115
+ return { feedback: st.feedback.slice(), biases: { ...cache.byId } };
116
+ }
117
+ /** Import feedback. Appends to existing file. Returns count imported. */
118
+ async import(data, project) {
119
+ if (!data || !Array.isArray(data.feedback))
120
+ return { imported: 0 };
121
+ const st = await this.loadProject(project);
122
+ let imported = 0;
123
+ for (const fb of data.feedback) {
124
+ if (!fb || typeof fb.queryText !== 'string' || typeof fb.resultId !== 'string')
125
+ continue;
126
+ const normalized = {
127
+ queryText: fb.queryText,
128
+ resultId: fb.resultId,
129
+ kind: fb.kind,
130
+ userAction: fb.userAction,
131
+ project: fb.project ?? project,
132
+ ts: fb.ts ?? Date.now(),
133
+ };
134
+ st.feedback.push(normalized);
135
+ await this.append(normalized);
136
+ imported++;
137
+ }
138
+ st.biasCache = null;
139
+ return { imported };
140
+ }
141
+ /** Wipe all feedback + bias cache for a project. */
142
+ async reset(project) {
143
+ this.state.delete(project);
144
+ const files = [this.feedbackFile(project), this.biasFile(project)];
145
+ for (const f of files) {
146
+ try {
147
+ if (fs.existsSync(f))
148
+ fs.unlinkSync(f);
149
+ }
150
+ catch { /* non-fatal */ }
151
+ }
152
+ }
153
+ // ── Persistence ──────────────────────────────────────────────────────
154
+ feedbackFile(project) {
155
+ return path.join(ROOT_DIR, `${safe(project)}.jsonl`);
156
+ }
157
+ biasFile(project) {
158
+ return path.join(ROOT_DIR, `${safe(project)}-biases.json`);
159
+ }
160
+ async loadProject(project) {
161
+ let st = this.state.get(project);
162
+ if (st)
163
+ return st;
164
+ fs.mkdirSync(ROOT_DIR, { recursive: true });
165
+ const feedback = [];
166
+ const fbFile = this.feedbackFile(project);
167
+ if (fs.existsSync(fbFile)) {
168
+ const raw = fs.readFileSync(fbFile, 'utf-8');
169
+ for (const line of raw.split('\n')) {
170
+ if (!line.trim())
171
+ continue;
172
+ try {
173
+ const parsed = JSON.parse(line);
174
+ if (parsed && parsed.resultId && parsed.kind)
175
+ feedback.push(parsed);
176
+ }
177
+ catch { /* skip corrupt line */ }
178
+ }
179
+ }
180
+ let biasCache = null;
181
+ const bFile = this.biasFile(project);
182
+ if (fs.existsSync(bFile)) {
183
+ try {
184
+ const parsed = JSON.parse(fs.readFileSync(bFile, 'utf-8'));
185
+ if (parsed && parsed.centroids && parsed.byCluster)
186
+ biasCache = parsed;
187
+ }
188
+ catch { /* skip */ }
189
+ }
190
+ st = { feedback, biasCache, lastLoaded: Date.now() };
191
+ this.state.set(project, st);
192
+ return st;
193
+ }
194
+ async append(fb) {
195
+ fs.mkdirSync(ROOT_DIR, { recursive: true });
196
+ await fs.promises.appendFile(this.feedbackFile(fb.project), JSON.stringify(fb) + '\n', 'utf-8');
197
+ }
198
+ async writeBiasCache(project, cache) {
199
+ fs.mkdirSync(ROOT_DIR, { recursive: true });
200
+ const tmp = this.biasFile(project) + '.tmp';
201
+ fs.writeFileSync(tmp, JSON.stringify(cache));
202
+ fs.renameSync(tmp, this.biasFile(project));
203
+ }
204
+ // ── Bias computation ────────────────────────────────────────────────
205
+ async ensureBiases(project, st) {
206
+ const now = Date.now();
207
+ // Reuse if same day AND no new feedback since the cache was built.
208
+ if (st.biasCache
209
+ && sameUtcDay(st.biasCache.computedAt, now)
210
+ && st.biasCache.feedbackCount === st.feedback.length) {
211
+ return st.biasCache;
212
+ }
213
+ const cache = await this.computeBiases(st.feedback);
214
+ st.biasCache = cache;
215
+ this.writeBiasCache(project, cache).catch(() => { });
216
+ return cache;
217
+ }
218
+ async computeBiases(feedback) {
219
+ const now = Date.now();
220
+ if (feedback.length === 0) {
221
+ return { byId: {}, byCluster: {}, centroids: [], computedAt: now, feedbackCount: 0 };
222
+ }
223
+ // Embed all queries (cheap because of the embeddings cache; falls back to
224
+ // a hashing word-bag if the embeddings module is unavailable).
225
+ const embedFn = await this.getEmbedder();
226
+ const vectors = [];
227
+ for (const fb of feedback) {
228
+ vectors.push(embedFn ? await embedFn(fb.queryText) : wordBag(fb.queryText));
229
+ }
230
+ const k = Math.min(CLUSTER_K, Math.max(1, feedback.length));
231
+ const { centroids, assignments } = kmeans(vectors, k, KMEANS_ITERS);
232
+ // Per-cluster {memoryId: {acceptsW, rejectsW}} with time decay.
233
+ const byCluster = {};
234
+ for (let i = 0; i < feedback.length; i++) {
235
+ const fb = feedback[i];
236
+ const cluster = String(assignments[i]);
237
+ const ageDays = (now - (fb.ts ?? now)) / DAY_MS;
238
+ const w = Math.pow(DECAY_BASE, ageDays / HALF_LIFE_DAYS);
239
+ const bucket = byCluster[cluster] ?? (byCluster[cluster] = new Map());
240
+ const row = bucket.get(fb.resultId) ?? { a: 0, r: 0 };
241
+ if (fb.kind === 'accepted' || fb.kind === 'modified')
242
+ row.a += w;
243
+ else if (fb.kind === 'rejected' || fb.kind === 'ignored')
244
+ row.r += w;
245
+ bucket.set(fb.resultId, row);
246
+ }
247
+ const clusterBiasOut = {};
248
+ const flatAccum = new Map();
249
+ for (const [cluster, bucket] of Object.entries(byCluster)) {
250
+ const row = {};
251
+ for (const [id, { a, r }] of bucket) {
252
+ const bias = Math.log((a + 1) / (r + 1));
253
+ row[id] = bias;
254
+ const acc = flatAccum.get(id) ?? { sum: 0, count: 0 };
255
+ acc.sum += bias;
256
+ acc.count++;
257
+ flatAccum.set(id, acc);
258
+ }
259
+ clusterBiasOut[cluster] = row;
260
+ }
261
+ const byId = {};
262
+ for (const [id, acc] of flatAccum)
263
+ byId[id] = +(acc.sum / acc.count).toFixed(6);
264
+ return {
265
+ byId,
266
+ byCluster: clusterBiasOut,
267
+ centroids,
268
+ computedAt: now,
269
+ feedbackCount: feedback.length,
270
+ };
271
+ }
272
+ async assignCluster(query, centroids) {
273
+ if (!centroids || centroids.length === 0)
274
+ return 0;
275
+ const embedFn = await this.getEmbedder();
276
+ const v = embedFn ? await embedFn(query) : wordBag(query);
277
+ let bestI = 0, bestD = Infinity;
278
+ for (let i = 0; i < centroids.length; i++) {
279
+ const d = euclidSq(v, centroids[i]);
280
+ if (d < bestD) {
281
+ bestD = d;
282
+ bestI = i;
283
+ }
284
+ }
285
+ return bestI;
286
+ }
287
+ /**
288
+ * Dynamic import of embeddings module. If the import fails (e.g. test
289
+ * environment without the module compiled), we fall back to a local word
290
+ * bag — clustering still works, just with coarser query buckets.
291
+ */
292
+ async getEmbedder() {
293
+ if (!this.embedderPromise) {
294
+ this.embedderPromise = (async () => {
295
+ try {
296
+ const mod = await import('./embeddings.js');
297
+ const emb = mod.getEmbeddings();
298
+ await emb.init();
299
+ return (t) => emb.embed(t);
300
+ }
301
+ catch {
302
+ return null;
303
+ }
304
+ })();
305
+ }
306
+ return this.embedderPromise;
307
+ }
308
+ }
309
+ // ── helpers ─────────────────────────────────────────────────────────────
310
+ function safe(s) {
311
+ return s.replace(/[^a-zA-Z0-9._-]/g, '_').slice(0, 200) || 'default';
312
+ }
313
+ function topN(m, n) {
314
+ return Array.from(m.entries())
315
+ .map(([id, count]) => ({ id, count }))
316
+ .sort((a, b) => b.count - a.count)
317
+ .slice(0, n);
318
+ }
319
+ function clamp(x, lo, hi) {
320
+ return x < lo ? lo : x > hi ? hi : x;
321
+ }
322
+ function sameUtcDay(a, b) {
323
+ return Math.floor(a / DAY_MS) === Math.floor(b / DAY_MS);
324
+ }
325
+ function euclidSq(a, b) {
326
+ const n = Math.min(a.length, b.length);
327
+ let d = 0;
328
+ for (let i = 0; i < n; i++) {
329
+ const x = a[i] - b[i];
330
+ d += x * x;
331
+ }
332
+ return d;
333
+ }
334
+ function wordBag(text, dim = 64) {
335
+ const vec = new Array(dim).fill(0);
336
+ const tokens = (text || '').toLowerCase().replace(/[^a-z0-9\s]/g, ' ').split(/\s+/).filter(t => t.length > 1);
337
+ for (const t of tokens) {
338
+ let h = 2166136261;
339
+ for (let i = 0; i < t.length; i++)
340
+ h = Math.imul(h ^ t.charCodeAt(i), 16777619);
341
+ vec[(h >>> 0) % dim] += 1;
342
+ }
343
+ // L2 normalize so euclidean distance is comparable across query lengths.
344
+ let n = 0;
345
+ for (const x of vec)
346
+ n += x * x;
347
+ n = Math.sqrt(n) || 1;
348
+ return vec.map(x => x / n);
349
+ }
350
+ function kmeans(vectors, k, iters) {
351
+ if (vectors.length === 0)
352
+ return { centroids: [], assignments: [] };
353
+ const dim = vectors[0].length;
354
+ // k-means++ seeding for stable initial centroids.
355
+ const centroids = [];
356
+ let seed = 1;
357
+ const rand = () => { seed = (seed * 16807) % 2147483647; return seed / 2147483647; };
358
+ centroids.push(vectors[Math.floor(rand() * vectors.length)].slice());
359
+ while (centroids.length < k) {
360
+ const dists = vectors.map(v => {
361
+ let best = Infinity;
362
+ for (const c of centroids) {
363
+ const d = euclidSq(v, c);
364
+ if (d < best)
365
+ best = d;
366
+ }
367
+ return best;
368
+ });
369
+ const total = dists.reduce((s, d) => s + d, 0) || 1;
370
+ let target = rand() * total;
371
+ let idx = 0;
372
+ for (; idx < dists.length - 1; idx++) {
373
+ target -= dists[idx];
374
+ if (target <= 0)
375
+ break;
376
+ }
377
+ centroids.push(vectors[idx].slice());
378
+ }
379
+ const assignments = new Array(vectors.length).fill(0);
380
+ for (let iter = 0; iter < iters; iter++) {
381
+ let changed = false;
382
+ for (let i = 0; i < vectors.length; i++) {
383
+ let bestI = 0, bestD = Infinity;
384
+ for (let c = 0; c < centroids.length; c++) {
385
+ const d = euclidSq(vectors[i], centroids[c]);
386
+ if (d < bestD) {
387
+ bestD = d;
388
+ bestI = c;
389
+ }
390
+ }
391
+ if (assignments[i] !== bestI) {
392
+ assignments[i] = bestI;
393
+ changed = true;
394
+ }
395
+ }
396
+ if (!changed && iter > 0)
397
+ break;
398
+ // Recompute centroids as the mean of assigned vectors.
399
+ const sums = Array.from({ length: k }, () => new Array(dim).fill(0));
400
+ const counts = new Array(k).fill(0);
401
+ for (let i = 0; i < vectors.length; i++) {
402
+ const c = assignments[i];
403
+ const v = vectors[i];
404
+ counts[c]++;
405
+ for (let j = 0; j < dim; j++)
406
+ sums[c][j] += v[j];
407
+ }
408
+ for (let c = 0; c < k; c++) {
409
+ if (counts[c] === 0)
410
+ continue; // keep empty centroid as-is
411
+ for (let j = 0; j < dim; j++)
412
+ sums[c][j] /= counts[c];
413
+ centroids[c] = sums[c];
414
+ }
415
+ }
416
+ return { centroids, assignments };
417
+ }
418
+ let _instance = null;
419
+ export function getBrainActiveLearner() {
420
+ if (!_instance)
421
+ _instance = new BrainActiveLearner();
422
+ return _instance;
423
+ }
424
+ export function resetBrainActiveLearnerForTests() { _instance = null; }
425
+ //# sourceMappingURL=brain-active-learner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"brain-active-learner.js","sourceRoot":"","sources":["../../src/brain/brain-active-learner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ import { GlobalBrain } from './global-brain.js';
2
+ import { BrainReplay } from './brain-replay.js';
3
+ export type AsciiStyle = 'galaxy' | 'tree' | 'matrix' | 'pixel' | 'banner' | 'sparkline';
4
+ export interface AsciiOptions {
5
+ width?: number;
6
+ height?: number;
7
+ style?: AsciiStyle;
8
+ }
9
+ export declare class BrainAscii {
10
+ private brain;
11
+ private replay;
12
+ constructor(brain?: GlobalBrain, replay?: BrainReplay);
13
+ /** Main entrypoint. Returns a console.log-ready string for the chosen style. */
14
+ render(project: string, opts?: AsciiOptions): Promise<string>;
15
+ /** Single-line sparkline of daily brain activity over the last `days` days. */
16
+ dailySparkline(project: string, days?: number): Promise<string>;
17
+ /** ASCII-art mascot for one of the 8 archetypes. */
18
+ mascot(archetypeName?: string): string;
19
+ /** figlet-style banner of an arbitrary string (A-Z, 0-9, space). */
20
+ headerBanner(text: string): string;
21
+ private gather;
22
+ private galaxy;
23
+ private emptyGalaxy;
24
+ private tree;
25
+ private matrix;
26
+ private pixel;
27
+ private bannerStyle;
28
+ private sparklineStyle;
29
+ }
30
+ export declare function getBrainAscii(): BrainAscii;
31
+ export declare function resetBrainAsciiForTests(): void;
32
+ //# sourceMappingURL=brain-ascii.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"brain-ascii.d.ts","sourceRoot":"","sources":["../../src/brain/brain-ascii.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,WAAW,EAAkB,MAAM,mBAAmB,CAAC;AAChE,OAAO,EAAE,WAAW,EAA+B,MAAM,mBAAmB,CAAC;AAK7E,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,GAAG,WAAW,CAAC;AAEzF,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,UAAU,CAAC;CACpB;AAyBD,qBAAa,UAAU;IACrB,OAAO,CAAC,KAAK,CAAc;IAC3B,OAAO,CAAC,MAAM,CAAc;gBAEhB,KAAK,CAAC,EAAE,WAAW,EAAE,MAAM,CAAC,EAAE,WAAW;IAKrD,gFAAgF;IAC1E,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,GAAE,YAAiB,GAAG,OAAO,CAAC,MAAM,CAAC;IAiBvE,+EAA+E;IACzE,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,GAAE,MAAW,GAAG,OAAO,CAAC,MAAM,CAAC;IAWzE,oDAAoD;IACpD,MAAM,CAAC,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM;IAMtC,oEAAoE;IACpE,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAQlC,OAAO,CAAC,MAAM;IAqBd,OAAO,CAAC,MAAM;IA4Cd,OAAO,CAAC,WAAW;IAanB,OAAO,CAAC,IAAI;IAwCZ,OAAO,CAAC,MAAM;IA2Bd,OAAO,CAAC,KAAK;IAiCb,OAAO,CAAC,WAAW;IASnB,OAAO,CAAC,cAAc;CAQvB;AAyID,wBAAgB,aAAa,IAAI,UAAU,CAG1C;AACD,wBAAgB,uBAAuB,IAAI,IAAI,CAAsB"}