@theihtisham/agent-shadow-brain 5.2.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 (301) hide show
  1. package/README.md +310 -1014
  2. package/dist/brain/agent-firewall.d.ts +7 -0
  3. package/dist/brain/agent-firewall.d.ts.map +1 -0
  4. package/dist/brain/agent-firewall.js +152 -0
  5. package/dist/brain/agent-firewall.js.map +1 -0
  6. package/dist/brain/agent-handoff.d.ts +19 -0
  7. package/dist/brain/agent-handoff.d.ts.map +1 -0
  8. package/dist/brain/agent-handoff.js +127 -0
  9. package/dist/brain/agent-handoff.js.map +1 -0
  10. package/dist/brain/air-gap.d.ts +23 -0
  11. package/dist/brain/air-gap.d.ts.map +1 -0
  12. package/dist/brain/air-gap.js +137 -0
  13. package/dist/brain/air-gap.js.map +1 -0
  14. package/dist/brain/attention-heatmap.d.ts +24 -0
  15. package/dist/brain/attention-heatmap.d.ts.map +1 -0
  16. package/dist/brain/attention-heatmap.js +108 -0
  17. package/dist/brain/attention-heatmap.js.map +1 -0
  18. package/dist/brain/auto-setup.js +19 -14
  19. package/dist/brain/auto-setup.js.map +1 -1
  20. package/dist/brain/auto-update.js +1 -1
  21. package/dist/brain/brain-3d.d.ts +79 -0
  22. package/dist/brain/brain-3d.d.ts.map +1 -0
  23. package/dist/brain/brain-3d.js +468 -0
  24. package/dist/brain/brain-3d.js.map +1 -0
  25. package/dist/brain/brain-active-learner.d.ts +74 -0
  26. package/dist/brain/brain-active-learner.d.ts.map +1 -0
  27. package/dist/brain/brain-active-learner.js +425 -0
  28. package/dist/brain/brain-active-learner.js.map +1 -0
  29. package/dist/brain/brain-ascii.d.ts +32 -0
  30. package/dist/brain/brain-ascii.d.ts.map +1 -0
  31. package/dist/brain/brain-ascii.js +402 -0
  32. package/dist/brain/brain-ascii.js.map +1 -0
  33. package/dist/brain/brain-chat.d.ts +42 -0
  34. package/dist/brain/brain-chat.d.ts.map +1 -0
  35. package/dist/brain/brain-chat.js +162 -0
  36. package/dist/brain/brain-chat.js.map +1 -0
  37. package/dist/brain/brain-cinema.d.ts +45 -0
  38. package/dist/brain/brain-cinema.d.ts.map +1 -0
  39. package/dist/brain/brain-cinema.js +393 -0
  40. package/dist/brain/brain-cinema.js.map +1 -0
  41. package/dist/brain/brain-coach.d.ts +45 -0
  42. package/dist/brain/brain-coach.d.ts.map +1 -0
  43. package/dist/brain/brain-coach.js +383 -0
  44. package/dist/brain/brain-coach.js.map +1 -0
  45. package/dist/brain/brain-consolidator.d.ts +56 -0
  46. package/dist/brain/brain-consolidator.d.ts.map +1 -0
  47. package/dist/brain/brain-consolidator.js +386 -0
  48. package/dist/brain/brain-consolidator.js.map +1 -0
  49. package/dist/brain/brain-contradictions.d.ts +57 -0
  50. package/dist/brain/brain-contradictions.d.ts.map +1 -0
  51. package/dist/brain/brain-contradictions.js +443 -0
  52. package/dist/brain/brain-contradictions.js.map +1 -0
  53. package/dist/brain/brain-diff.d.ts +61 -0
  54. package/dist/brain/brain-diff.d.ts.map +1 -0
  55. package/dist/brain/brain-diff.js +439 -0
  56. package/dist/brain/brain-diff.js.map +1 -0
  57. package/dist/brain/brain-dna.d.ts +59 -0
  58. package/dist/brain/brain-dna.d.ts.map +1 -0
  59. package/dist/brain/brain-dna.js +336 -0
  60. package/dist/brain/brain-dna.js.map +1 -0
  61. package/dist/brain/brain-doppelganger.d.ts +32 -0
  62. package/dist/brain/brain-doppelganger.d.ts.map +1 -0
  63. package/dist/brain/brain-doppelganger.js +417 -0
  64. package/dist/brain/brain-doppelganger.js.map +1 -0
  65. package/dist/brain/brain-encryption.d.ts +14 -0
  66. package/dist/brain/brain-encryption.d.ts.map +1 -0
  67. package/dist/brain/brain-encryption.js +68 -0
  68. package/dist/brain/brain-encryption.js.map +1 -0
  69. package/dist/brain/brain-exchange.d.ts +30 -0
  70. package/dist/brain/brain-exchange.d.ts.map +1 -0
  71. package/dist/brain/brain-exchange.js +106 -0
  72. package/dist/brain/brain-exchange.js.map +1 -0
  73. package/dist/brain/brain-garden.d.ts +18 -0
  74. package/dist/brain/brain-garden.d.ts.map +1 -0
  75. package/dist/brain/brain-garden.js +81 -0
  76. package/dist/brain/brain-garden.js.map +1 -0
  77. package/dist/brain/brain-graph-walker.d.ts +54 -0
  78. package/dist/brain/brain-graph-walker.d.ts.map +1 -0
  79. package/dist/brain/brain-graph-walker.js +412 -0
  80. package/dist/brain/brain-graph-walker.js.map +1 -0
  81. package/dist/brain/brain-holiday-card.d.ts +50 -0
  82. package/dist/brain/brain-holiday-card.d.ts.map +1 -0
  83. package/dist/brain/brain-holiday-card.js +432 -0
  84. package/dist/brain/brain-holiday-card.js.map +1 -0
  85. package/dist/brain/brain-memes.d.ts +44 -0
  86. package/dist/brain/brain-memes.d.ts.map +1 -0
  87. package/dist/brain/brain-memes.js +438 -0
  88. package/dist/brain/brain-memes.js.map +1 -0
  89. package/dist/brain/brain-memory-tiers.d.ts +67 -0
  90. package/dist/brain/brain-memory-tiers.d.ts.map +1 -0
  91. package/dist/brain/brain-memory-tiers.js +292 -0
  92. package/dist/brain/brain-memory-tiers.js.map +1 -0
  93. package/dist/brain/brain-notebook.d.ts +68 -0
  94. package/dist/brain/brain-notebook.d.ts.map +1 -0
  95. package/dist/brain/brain-notebook.js +379 -0
  96. package/dist/brain/brain-notebook.js.map +1 -0
  97. package/dist/brain/brain-portability.js +1 -1
  98. package/dist/brain/brain-quantize.d.ts +62 -0
  99. package/dist/brain/brain-quantize.d.ts.map +1 -0
  100. package/dist/brain/brain-quantize.js +346 -0
  101. package/dist/brain/brain-quantize.js.map +1 -0
  102. package/dist/brain/brain-query-expander.d.ts +31 -0
  103. package/dist/brain/brain-query-expander.d.ts.map +1 -0
  104. package/dist/brain/brain-query-expander.js +417 -0
  105. package/dist/brain/brain-query-expander.js.map +1 -0
  106. package/dist/brain/brain-quest.d.ts +58 -0
  107. package/dist/brain/brain-quest.d.ts.map +1 -0
  108. package/dist/brain/brain-quest.js +541 -0
  109. package/dist/brain/brain-quest.js.map +1 -0
  110. package/dist/brain/brain-recall-cache.d.ts +73 -0
  111. package/dist/brain/brain-recall-cache.d.ts.map +1 -0
  112. package/dist/brain/brain-recall-cache.js +444 -0
  113. package/dist/brain/brain-recall-cache.js.map +1 -0
  114. package/dist/brain/brain-reflex.d.ts +55 -0
  115. package/dist/brain/brain-reflex.d.ts.map +1 -0
  116. package/dist/brain/brain-reflex.js +364 -0
  117. package/dist/brain/brain-reflex.js.map +1 -0
  118. package/dist/brain/brain-replay.d.ts +74 -0
  119. package/dist/brain/brain-replay.d.ts.map +1 -0
  120. package/dist/brain/brain-replay.js +336 -0
  121. package/dist/brain/brain-replay.js.map +1 -0
  122. package/dist/brain/brain-rerank.d.ts +39 -0
  123. package/dist/brain/brain-rerank.d.ts.map +1 -0
  124. package/dist/brain/brain-rerank.js +216 -0
  125. package/dist/brain/brain-rerank.js.map +1 -0
  126. package/dist/brain/brain-roast.d.ts +44 -0
  127. package/dist/brain/brain-roast.d.ts.map +1 -0
  128. package/dist/brain/brain-roast.js +566 -0
  129. package/dist/brain/brain-roast.js.map +1 -0
  130. package/dist/brain/brain-sonification.d.ts +57 -0
  131. package/dist/brain/brain-sonification.d.ts.map +1 -0
  132. package/dist/brain/brain-sonification.js +286 -0
  133. package/dist/brain/brain-sonification.js.map +1 -0
  134. package/dist/brain/brain-tarot.d.ts +49 -0
  135. package/dist/brain/brain-tarot.d.ts.map +1 -0
  136. package/dist/brain/brain-tarot.js +634 -0
  137. package/dist/brain/brain-tarot.js.map +1 -0
  138. package/dist/brain/brain-time-capsule.d.ts +80 -0
  139. package/dist/brain/brain-time-capsule.d.ts.map +1 -0
  140. package/dist/brain/brain-time-capsule.js +289 -0
  141. package/dist/brain/brain-time-capsule.js.map +1 -0
  142. package/dist/brain/brain-trophies.d.ts +60 -0
  143. package/dist/brain/brain-trophies.d.ts.map +1 -0
  144. package/dist/brain/brain-trophies.js +431 -0
  145. package/dist/brain/brain-trophies.js.map +1 -0
  146. package/dist/brain/brain-working-memory.d.ts +78 -0
  147. package/dist/brain/brain-working-memory.d.ts.map +1 -0
  148. package/dist/brain/brain-working-memory.js +367 -0
  149. package/dist/brain/brain-working-memory.js.map +1 -0
  150. package/dist/brain/branch-brain.d.ts +23 -0
  151. package/dist/brain/branch-brain.d.ts.map +1 -0
  152. package/dist/brain/branch-brain.js +159 -0
  153. package/dist/brain/branch-brain.js.map +1 -0
  154. package/dist/brain/calibration-monitor.d.ts +20 -0
  155. package/dist/brain/calibration-monitor.d.ts.map +1 -0
  156. package/dist/brain/calibration-monitor.js +144 -0
  157. package/dist/brain/calibration-monitor.js.map +1 -0
  158. package/dist/brain/causal-chains.d.ts +37 -0
  159. package/dist/brain/causal-chains.d.ts.map +1 -0
  160. package/dist/brain/causal-chains.js +250 -0
  161. package/dist/brain/causal-chains.js.map +1 -0
  162. package/dist/brain/collision-detective.d.ts +32 -0
  163. package/dist/brain/collision-detective.d.ts.map +1 -0
  164. package/dist/brain/collision-detective.js +233 -0
  165. package/dist/brain/collision-detective.js.map +1 -0
  166. package/dist/brain/confidence-gate.d.ts +69 -0
  167. package/dist/brain/confidence-gate.d.ts.map +1 -0
  168. package/dist/brain/confidence-gate.js +244 -0
  169. package/dist/brain/confidence-gate.js.map +1 -0
  170. package/dist/brain/constitution.d.ts +59 -0
  171. package/dist/brain/constitution.d.ts.map +1 -0
  172. package/dist/brain/constitution.js +315 -0
  173. package/dist/brain/constitution.js.map +1 -0
  174. package/dist/brain/cost-aware-spawner.d.ts +7 -0
  175. package/dist/brain/cost-aware-spawner.d.ts.map +1 -0
  176. package/dist/brain/cost-aware-spawner.js +77 -0
  177. package/dist/brain/cost-aware-spawner.js.map +1 -0
  178. package/dist/brain/dream-engine.d.ts +35 -0
  179. package/dist/brain/dream-engine.d.ts.map +1 -0
  180. package/dist/brain/dream-engine.js +273 -0
  181. package/dist/brain/dream-engine.js.map +1 -0
  182. package/dist/brain/embeddings-v2.d.ts +58 -0
  183. package/dist/brain/embeddings-v2.d.ts.map +1 -0
  184. package/dist/brain/embeddings-v2.js +344 -0
  185. package/dist/brain/embeddings-v2.js.map +1 -0
  186. package/dist/brain/embeddings.d.ts +27 -0
  187. package/dist/brain/embeddings.d.ts.map +1 -0
  188. package/dist/brain/embeddings.js +175 -0
  189. package/dist/brain/embeddings.js.map +1 -0
  190. package/dist/brain/forgetting-curve.d.ts +21 -0
  191. package/dist/brain/forgetting-curve.d.ts.map +1 -0
  192. package/dist/brain/forgetting-curve.js +174 -0
  193. package/dist/brain/forgetting-curve.js.map +1 -0
  194. package/dist/brain/formal-verification-bridge.d.ts +26 -0
  195. package/dist/brain/formal-verification-bridge.d.ts.map +1 -0
  196. package/dist/brain/formal-verification-bridge.js +219 -0
  197. package/dist/brain/formal-verification-bridge.js.map +1 -0
  198. package/dist/brain/global-brain.d.ts +8 -1
  199. package/dist/brain/global-brain.d.ts.map +1 -1
  200. package/dist/brain/global-brain.js +24 -0
  201. package/dist/brain/global-brain.js.map +1 -1
  202. package/dist/brain/hallucination-quarantine.d.ts +26 -0
  203. package/dist/brain/hallucination-quarantine.d.ts.map +1 -0
  204. package/dist/brain/hallucination-quarantine.js +135 -0
  205. package/dist/brain/hallucination-quarantine.js.map +1 -0
  206. package/dist/brain/hive-accelerator.d.ts +39 -0
  207. package/dist/brain/hive-accelerator.d.ts.map +1 -0
  208. package/dist/brain/hive-accelerator.js +152 -0
  209. package/dist/brain/hive-accelerator.js.map +1 -0
  210. package/dist/brain/hive-voice.d.ts +71 -0
  211. package/dist/brain/hive-voice.d.ts.map +1 -0
  212. package/dist/brain/hive-voice.js +352 -0
  213. package/dist/brain/hive-voice.js.map +1 -0
  214. package/dist/brain/json-output.d.ts +26 -0
  215. package/dist/brain/json-output.d.ts.map +1 -0
  216. package/dist/brain/json-output.js +112 -0
  217. package/dist/brain/json-output.js.map +1 -0
  218. package/dist/brain/l0-cache.js +1 -1
  219. package/dist/brain/l0-cache.js.map +1 -1
  220. package/dist/brain/local-llm.d.ts +20 -0
  221. package/dist/brain/local-llm.d.ts.map +1 -0
  222. package/dist/brain/local-llm.js +132 -0
  223. package/dist/brain/local-llm.js.map +1 -0
  224. package/dist/brain/markdown-export.d.ts +48 -0
  225. package/dist/brain/markdown-export.d.ts.map +1 -0
  226. package/dist/brain/markdown-export.js +382 -0
  227. package/dist/brain/markdown-export.js.map +1 -0
  228. package/dist/brain/mcp-server.d.ts +40 -0
  229. package/dist/brain/mcp-server.d.ts.map +1 -1
  230. package/dist/brain/mcp-server.js +395 -12
  231. package/dist/brain/mcp-server.js.map +1 -1
  232. package/dist/brain/model-registry.d.ts +96 -0
  233. package/dist/brain/model-registry.d.ts.map +1 -0
  234. package/dist/brain/model-registry.js +585 -0
  235. package/dist/brain/model-registry.js.map +1 -0
  236. package/dist/brain/multimodal-vision.d.ts +38 -0
  237. package/dist/brain/multimodal-vision.d.ts.map +1 -0
  238. package/dist/brain/multimodal-vision.js +257 -0
  239. package/dist/brain/multimodal-vision.js.map +1 -0
  240. package/dist/brain/orchestrator.js +1 -1
  241. package/dist/brain/otel-lite.d.ts +71 -0
  242. package/dist/brain/otel-lite.d.ts.map +1 -0
  243. package/dist/brain/otel-lite.js +232 -0
  244. package/dist/brain/otel-lite.js.map +1 -0
  245. package/dist/brain/pr-auto-review.d.ts +17 -0
  246. package/dist/brain/pr-auto-review.d.ts.map +1 -0
  247. package/dist/brain/pr-auto-review.js +73 -0
  248. package/dist/brain/pr-auto-review.js.map +1 -0
  249. package/dist/brain/pre-mortem.d.ts +21 -0
  250. package/dist/brain/pre-mortem.d.ts.map +1 -0
  251. package/dist/brain/pre-mortem.js +210 -0
  252. package/dist/brain/pre-mortem.js.map +1 -0
  253. package/dist/brain/prompt-cache.d.ts +54 -0
  254. package/dist/brain/prompt-cache.d.ts.map +1 -0
  255. package/dist/brain/prompt-cache.js +105 -0
  256. package/dist/brain/prompt-cache.js.map +1 -0
  257. package/dist/brain/reputation-ledger.d.ts +42 -0
  258. package/dist/brain/reputation-ledger.d.ts.map +1 -0
  259. package/dist/brain/reputation-ledger.js +326 -0
  260. package/dist/brain/reputation-ledger.js.map +1 -0
  261. package/dist/brain/session-hooks.d.ts +19 -0
  262. package/dist/brain/session-hooks.d.ts.map +1 -1
  263. package/dist/brain/session-hooks.js +249 -18
  264. package/dist/brain/session-hooks.js.map +1 -1
  265. package/dist/brain/subagent-bridge.d.ts +46 -0
  266. package/dist/brain/subagent-bridge.d.ts.map +1 -0
  267. package/dist/brain/subagent-bridge.js +364 -0
  268. package/dist/brain/subagent-bridge.js.map +1 -0
  269. package/dist/brain/swarm-debate.d.ts +22 -0
  270. package/dist/brain/swarm-debate.d.ts.map +1 -0
  271. package/dist/brain/swarm-debate.js +134 -0
  272. package/dist/brain/swarm-debate.js.map +1 -0
  273. package/dist/brain/team-brain-sync.d.ts +22 -0
  274. package/dist/brain/team-brain-sync.d.ts.map +1 -0
  275. package/dist/brain/team-brain-sync.js +132 -0
  276. package/dist/brain/team-brain-sync.js.map +1 -0
  277. package/dist/brain/token-economy.d.ts +25 -0
  278. package/dist/brain/token-economy.d.ts.map +1 -0
  279. package/dist/brain/token-economy.js +216 -0
  280. package/dist/brain/token-economy.js.map +1 -0
  281. package/dist/brain/voice-mode.d.ts +15 -0
  282. package/dist/brain/voice-mode.d.ts.map +1 -0
  283. package/dist/brain/voice-mode.js +97 -0
  284. package/dist/brain/voice-mode.js.map +1 -0
  285. package/dist/cli.js +1702 -4
  286. package/dist/cli.js.map +1 -1
  287. package/dist/dashboard/server.d.ts +6 -0
  288. package/dist/dashboard/server.d.ts.map +1 -1
  289. package/dist/dashboard/server.js +1118 -368
  290. package/dist/dashboard/server.js.map +1 -1
  291. package/dist/dashboard/v6-dashboard-html.d.ts +2 -0
  292. package/dist/dashboard/v6-dashboard-html.d.ts.map +1 -0
  293. package/dist/dashboard/v6-dashboard-html.js +2474 -0
  294. package/dist/dashboard/v6-dashboard-html.js.map +1 -0
  295. package/dist/index.d.ts +27 -0
  296. package/dist/index.d.ts.map +1 -1
  297. package/dist/index.js +29 -1
  298. package/dist/index.js.map +1 -1
  299. package/dist/types.d.ts +518 -2
  300. package/dist/types.d.ts.map +1 -1
  301. package/package.json +33 -4
@@ -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"}