@theihtisham/agent-shadow-brain 6.0.0 → 6.0.3

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 (191) hide show
  1. package/CHANGELOG.md +372 -0
  2. package/README.md +366 -355
  3. package/dist/brain/auto-update.js +1 -1
  4. package/dist/brain/brain-3d.d.ts +79 -0
  5. package/dist/brain/brain-3d.d.ts.map +1 -0
  6. package/dist/brain/brain-3d.js +468 -0
  7. package/dist/brain/brain-3d.js.map +1 -0
  8. package/dist/brain/brain-active-learner.d.ts +74 -0
  9. package/dist/brain/brain-active-learner.d.ts.map +1 -0
  10. package/dist/brain/brain-active-learner.js +425 -0
  11. package/dist/brain/brain-active-learner.js.map +1 -0
  12. package/dist/brain/brain-ascii.d.ts +32 -0
  13. package/dist/brain/brain-ascii.d.ts.map +1 -0
  14. package/dist/brain/brain-ascii.js +402 -0
  15. package/dist/brain/brain-ascii.js.map +1 -0
  16. package/dist/brain/brain-cinema.d.ts +45 -0
  17. package/dist/brain/brain-cinema.d.ts.map +1 -0
  18. package/dist/brain/brain-cinema.js +393 -0
  19. package/dist/brain/brain-cinema.js.map +1 -0
  20. package/dist/brain/brain-coach.d.ts +45 -0
  21. package/dist/brain/brain-coach.d.ts.map +1 -0
  22. package/dist/brain/brain-coach.js +383 -0
  23. package/dist/brain/brain-coach.js.map +1 -0
  24. package/dist/brain/brain-consolidator.d.ts +56 -0
  25. package/dist/brain/brain-consolidator.d.ts.map +1 -0
  26. package/dist/brain/brain-consolidator.js +386 -0
  27. package/dist/brain/brain-consolidator.js.map +1 -0
  28. package/dist/brain/brain-contradictions.d.ts +57 -0
  29. package/dist/brain/brain-contradictions.d.ts.map +1 -0
  30. package/dist/brain/brain-contradictions.js +443 -0
  31. package/dist/brain/brain-contradictions.js.map +1 -0
  32. package/dist/brain/brain-diff.d.ts +61 -0
  33. package/dist/brain/brain-diff.d.ts.map +1 -0
  34. package/dist/brain/brain-diff.js +439 -0
  35. package/dist/brain/brain-diff.js.map +1 -0
  36. package/dist/brain/brain-dna.d.ts +59 -0
  37. package/dist/brain/brain-dna.d.ts.map +1 -0
  38. package/dist/brain/brain-dna.js +336 -0
  39. package/dist/brain/brain-dna.js.map +1 -0
  40. package/dist/brain/brain-doppelganger.d.ts +32 -0
  41. package/dist/brain/brain-doppelganger.d.ts.map +1 -0
  42. package/dist/brain/brain-doppelganger.js +417 -0
  43. package/dist/brain/brain-doppelganger.js.map +1 -0
  44. package/dist/brain/brain-graph-walker.d.ts +54 -0
  45. package/dist/brain/brain-graph-walker.d.ts.map +1 -0
  46. package/dist/brain/brain-graph-walker.js +412 -0
  47. package/dist/brain/brain-graph-walker.js.map +1 -0
  48. package/dist/brain/brain-holiday-card.d.ts +50 -0
  49. package/dist/brain/brain-holiday-card.d.ts.map +1 -0
  50. package/dist/brain/brain-holiday-card.js +432 -0
  51. package/dist/brain/brain-holiday-card.js.map +1 -0
  52. package/dist/brain/brain-memes.d.ts +44 -0
  53. package/dist/brain/brain-memes.d.ts.map +1 -0
  54. package/dist/brain/brain-memes.js +438 -0
  55. package/dist/brain/brain-memes.js.map +1 -0
  56. package/dist/brain/brain-memory-tiers.d.ts +67 -0
  57. package/dist/brain/brain-memory-tiers.d.ts.map +1 -0
  58. package/dist/brain/brain-memory-tiers.js +292 -0
  59. package/dist/brain/brain-memory-tiers.js.map +1 -0
  60. package/dist/brain/brain-notebook.d.ts +68 -0
  61. package/dist/brain/brain-notebook.d.ts.map +1 -0
  62. package/dist/brain/brain-notebook.js +379 -0
  63. package/dist/brain/brain-notebook.js.map +1 -0
  64. package/dist/brain/brain-portability.js +3 -3
  65. package/dist/brain/brain-portability.js.map +1 -1
  66. package/dist/brain/brain-quantize.d.ts +62 -0
  67. package/dist/brain/brain-quantize.d.ts.map +1 -0
  68. package/dist/brain/brain-quantize.js +346 -0
  69. package/dist/brain/brain-quantize.js.map +1 -0
  70. package/dist/brain/brain-query-expander.d.ts +31 -0
  71. package/dist/brain/brain-query-expander.d.ts.map +1 -0
  72. package/dist/brain/brain-query-expander.js +417 -0
  73. package/dist/brain/brain-query-expander.js.map +1 -0
  74. package/dist/brain/brain-quest.d.ts +58 -0
  75. package/dist/brain/brain-quest.d.ts.map +1 -0
  76. package/dist/brain/brain-quest.js +541 -0
  77. package/dist/brain/brain-quest.js.map +1 -0
  78. package/dist/brain/brain-recall-cache.d.ts +73 -0
  79. package/dist/brain/brain-recall-cache.d.ts.map +1 -0
  80. package/dist/brain/brain-recall-cache.js +444 -0
  81. package/dist/brain/brain-recall-cache.js.map +1 -0
  82. package/dist/brain/brain-reflex.d.ts +55 -0
  83. package/dist/brain/brain-reflex.d.ts.map +1 -0
  84. package/dist/brain/brain-reflex.js +364 -0
  85. package/dist/brain/brain-reflex.js.map +1 -0
  86. package/dist/brain/brain-replay.d.ts +74 -0
  87. package/dist/brain/brain-replay.d.ts.map +1 -0
  88. package/dist/brain/brain-replay.js +336 -0
  89. package/dist/brain/brain-replay.js.map +1 -0
  90. package/dist/brain/brain-rerank.d.ts +39 -0
  91. package/dist/brain/brain-rerank.d.ts.map +1 -0
  92. package/dist/brain/brain-rerank.js +216 -0
  93. package/dist/brain/brain-rerank.js.map +1 -0
  94. package/dist/brain/brain-roast.d.ts +44 -0
  95. package/dist/brain/brain-roast.d.ts.map +1 -0
  96. package/dist/brain/brain-roast.js +566 -0
  97. package/dist/brain/brain-roast.js.map +1 -0
  98. package/dist/brain/brain-sonification.d.ts +57 -0
  99. package/dist/brain/brain-sonification.d.ts.map +1 -0
  100. package/dist/brain/brain-sonification.js +286 -0
  101. package/dist/brain/brain-sonification.js.map +1 -0
  102. package/dist/brain/brain-tarot.d.ts +49 -0
  103. package/dist/brain/brain-tarot.d.ts.map +1 -0
  104. package/dist/brain/brain-tarot.js +634 -0
  105. package/dist/brain/brain-tarot.js.map +1 -0
  106. package/dist/brain/brain-time-capsule.d.ts +80 -0
  107. package/dist/brain/brain-time-capsule.d.ts.map +1 -0
  108. package/dist/brain/brain-time-capsule.js +289 -0
  109. package/dist/brain/brain-time-capsule.js.map +1 -0
  110. package/dist/brain/brain-trophies.d.ts +60 -0
  111. package/dist/brain/brain-trophies.d.ts.map +1 -0
  112. package/dist/brain/brain-trophies.js +431 -0
  113. package/dist/brain/brain-trophies.js.map +1 -0
  114. package/dist/brain/brain-working-memory.d.ts +78 -0
  115. package/dist/brain/brain-working-memory.d.ts.map +1 -0
  116. package/dist/brain/brain-working-memory.js +367 -0
  117. package/dist/brain/brain-working-memory.js.map +1 -0
  118. package/dist/brain/confidence-gate.d.ts +69 -0
  119. package/dist/brain/confidence-gate.d.ts.map +1 -0
  120. package/dist/brain/confidence-gate.js +244 -0
  121. package/dist/brain/confidence-gate.js.map +1 -0
  122. package/dist/brain/constitution.d.ts +59 -0
  123. package/dist/brain/constitution.d.ts.map +1 -0
  124. package/dist/brain/constitution.js +315 -0
  125. package/dist/brain/constitution.js.map +1 -0
  126. package/dist/brain/context-continuity.d.ts +78 -0
  127. package/dist/brain/context-continuity.d.ts.map +1 -0
  128. package/dist/brain/context-continuity.js +341 -0
  129. package/dist/brain/context-continuity.js.map +1 -0
  130. package/dist/brain/embeddings-v2.d.ts +58 -0
  131. package/dist/brain/embeddings-v2.d.ts.map +1 -0
  132. package/dist/brain/embeddings-v2.js +344 -0
  133. package/dist/brain/embeddings-v2.js.map +1 -0
  134. package/dist/brain/global-brain.d.ts.map +1 -1
  135. package/dist/brain/global-brain.js +35 -9
  136. package/dist/brain/global-brain.js.map +1 -1
  137. package/dist/brain/hive-voice.d.ts +71 -0
  138. package/dist/brain/hive-voice.d.ts.map +1 -0
  139. package/dist/brain/hive-voice.js +352 -0
  140. package/dist/brain/hive-voice.js.map +1 -0
  141. package/dist/brain/live-brain.d.ts +119 -0
  142. package/dist/brain/live-brain.d.ts.map +1 -0
  143. package/dist/brain/live-brain.js +405 -0
  144. package/dist/brain/live-brain.js.map +1 -0
  145. package/dist/brain/markdown-export.d.ts +48 -0
  146. package/dist/brain/markdown-export.d.ts.map +1 -0
  147. package/dist/brain/markdown-export.js +382 -0
  148. package/dist/brain/markdown-export.js.map +1 -0
  149. package/dist/brain/mcp-server.d.ts +4 -0
  150. package/dist/brain/mcp-server.d.ts.map +1 -1
  151. package/dist/brain/mcp-server.js +81 -5
  152. package/dist/brain/mcp-server.js.map +1 -1
  153. package/dist/brain/memory-seeder.d.ts +78 -0
  154. package/dist/brain/memory-seeder.d.ts.map +1 -0
  155. package/dist/brain/memory-seeder.js +326 -0
  156. package/dist/brain/memory-seeder.js.map +1 -0
  157. package/dist/brain/multimodal-vision.d.ts +38 -0
  158. package/dist/brain/multimodal-vision.d.ts.map +1 -0
  159. package/dist/brain/multimodal-vision.js +257 -0
  160. package/dist/brain/multimodal-vision.js.map +1 -0
  161. package/dist/brain/orchestrator.js +1 -1
  162. package/dist/brain/otel-lite.d.ts +71 -0
  163. package/dist/brain/otel-lite.d.ts.map +1 -0
  164. package/dist/brain/otel-lite.js +232 -0
  165. package/dist/brain/otel-lite.js.map +1 -0
  166. package/dist/brain/token-economy.d.ts +2 -0
  167. package/dist/brain/token-economy.d.ts.map +1 -1
  168. package/dist/brain/token-economy.js +80 -24
  169. package/dist/brain/token-economy.js.map +1 -1
  170. package/dist/cli.js +1120 -32
  171. package/dist/cli.js.map +1 -1
  172. package/dist/dashboard/server.d.ts +5 -0
  173. package/dist/dashboard/server.d.ts.map +1 -1
  174. package/dist/dashboard/server.js +355 -2
  175. package/dist/dashboard/server.js.map +1 -1
  176. package/dist/dashboard/v6-dashboard-html.d.ts +1 -1
  177. package/dist/dashboard/v6-dashboard-html.d.ts.map +1 -1
  178. package/dist/dashboard/v6-dashboard-html.js +755 -85
  179. package/dist/dashboard/v6-dashboard-html.js.map +1 -1
  180. package/dist/index.d.ts +4 -0
  181. package/dist/index.d.ts.map +1 -1
  182. package/dist/index.js +4 -0
  183. package/dist/index.js.map +1 -1
  184. package/dist/types.d.ts +17 -12
  185. package/dist/types.d.ts.map +1 -1
  186. package/docs/launch/README.md +61 -0
  187. package/docs/launch/RELEASE_CHECKLIST_v6.0.3.md +102 -0
  188. package/docs/launch/RELEASE_NOTES_v6.0.3.md +111 -0
  189. package/package.json +25 -13
  190. package/tools/export-resume-pack.mjs +56 -0
  191. package/tools/record-global-memory.mjs +72 -0
@@ -0,0 +1,336 @@
1
+ // src/brain/brain-dna.ts — Brain DNA (viral feature)
2
+ // v6.0.2
3
+ //
4
+ // Spotify-Wrapped-style shareable card for a brain's "personality". Reads the
5
+ // Global Brain (and the Replay log when present) to compute archetypes + a
6
+ // one-page SVG card optimized for Instagram / Twitter / LinkedIn sharing.
7
+ //
8
+ // Pure-SVG, zero new npm deps. Graceful when the brain has zero events.
9
+ import * as fs from 'fs';
10
+ import * as path from 'path';
11
+ import * as os from 'os';
12
+ import { GlobalBrain, getGlobalBrain } from './global-brain.js';
13
+ import { getBrainReplay } from './brain-replay.js';
14
+ const ARCHETYPES = [
15
+ { name: 'The Debugger', tagline: 'Hunts root causes through collision chains.', accent: '#ff6b8a', glyph: 'DBG' },
16
+ { name: 'The Architect', tagline: 'Builds decisions into living blueprints.', accent: '#a78bfa', glyph: 'ARC' },
17
+ { name: 'The Speedster', tagline: 'Sub-millisecond recall, every single call.', accent: '#00ffd5', glyph: 'SPD' },
18
+ { name: 'The Scholar', tagline: 'Reads more than it writes. Knows why.', accent: '#fbbf24', glyph: 'SCH' },
19
+ { name: 'The Cartographer', tagline: 'Maps every dependency, every drift.', accent: '#34d399', glyph: 'CTG' },
20
+ { name: 'The Diplomat', tagline: 'Negotiates handoffs between agents.', accent: '#60a5fa', glyph: 'DIP' },
21
+ { name: 'The Sentinel', tagline: 'Quarantines hallucinations before they ship.', accent: '#f87171', glyph: 'SEN' },
22
+ { name: 'The Wanderer', tagline: 'Young brain, vast horizons, no fixed star.', accent: '#7dd3fc', glyph: 'WND' },
23
+ ];
24
+ // ── Class ────────────────────────────────────────────────────────────────────
25
+ export class BrainDna {
26
+ constructor(brain, replay) {
27
+ this.brain = brain ?? getGlobalBrain();
28
+ this.replay = replay ?? getBrainReplay();
29
+ }
30
+ /** Generate a DNA card for a project. Returns SVG string + computed stats. */
31
+ generate(project, opts = {}) {
32
+ const stats = this.computeStats(project);
33
+ const style = opts.style ?? 'card';
34
+ const svg = style === 'banner'
35
+ ? this.renderBanner(project, stats)
36
+ : style === 'poster'
37
+ ? this.renderPoster(project, stats)
38
+ : this.renderCard(project, stats);
39
+ return { svg, stats };
40
+ }
41
+ /** Side-by-side comparison of two projects. */
42
+ compareCards(projectA, projectB) {
43
+ const a = this.computeStats(projectA);
44
+ const b = this.computeStats(projectB);
45
+ const left = this.renderCard(projectA, a, { half: 'left' });
46
+ const right = this.renderCard(projectB, b, { half: 'right' });
47
+ return { svg: this.composeSideBySide(projectA, a, projectB, b, left, right) };
48
+ }
49
+ /** Names of all defined archetypes. */
50
+ topArchetypes() { return ARCHETYPES.map(a => a.name); }
51
+ /** Compute the raw stats (no rendering). Public for tooling/tests. */
52
+ computeStats(project) {
53
+ this.safeInit();
54
+ const projectId = this.resolveProjectId(project);
55
+ const entries = this.brain.recall({ projectId, limit: 5000 });
56
+ let events = [];
57
+ try {
58
+ events = this.replay.listEvents(project);
59
+ }
60
+ catch { /* empty */ }
61
+ const entitySet = new Set();
62
+ const agentCounts = new Map();
63
+ const categoryCounts = new Map();
64
+ const languageCounts = new Map();
65
+ let firstSeen = Number.POSITIVE_INFINITY;
66
+ let lastSeen = 0;
67
+ for (const e of entries) {
68
+ const t = e.createdAt instanceof Date ? e.createdAt.getTime() : Number(e.createdAt);
69
+ if (t < firstSeen)
70
+ firstSeen = t;
71
+ if (t > lastSeen)
72
+ lastSeen = t;
73
+ agentCounts.set(e.agentTool, (agentCounts.get(e.agentTool) ?? 0) + 1);
74
+ categoryCounts.set(e.category, (categoryCounts.get(e.category) ?? 0) + 1);
75
+ entitySet.add(e.id);
76
+ const lang = e.metadata?.language ?? e.metadata?.lang;
77
+ if (lang)
78
+ languageCounts.set(lang, (languageCounts.get(lang) ?? 0) + 1);
79
+ }
80
+ for (const ev of events) {
81
+ const key = ev.payload?.entity
82
+ ?? ev.payload?.id;
83
+ if (key)
84
+ entitySet.add(key);
85
+ if (ev.agent)
86
+ agentCounts.set(ev.agent, (agentCounts.get(ev.agent) ?? 0) + 1);
87
+ if (ev.ts < firstSeen)
88
+ firstSeen = ev.ts;
89
+ if (ev.ts > lastSeen)
90
+ lastSeen = ev.ts;
91
+ }
92
+ const hasData = entries.length > 0 || events.length > 0;
93
+ const ageDays = hasData && isFinite(firstSeen)
94
+ ? Math.max(0, (lastSeen - firstSeen) / (24 * 60 * 60 * 1000))
95
+ : 0;
96
+ const collisions = events.filter(e => e.type.includes('collision')).length;
97
+ const decisions = entries.filter(e => /decision|adr|architecture/i.test(e.category)).length
98
+ + events.filter(e => e.type.includes('decision') || e.type.includes('adr')).length;
99
+ const hallucinations = events.filter(e => e.type.includes('hallucination') || e.type.includes('quarantine')).length;
100
+ const totalMemories = entries.length
101
+ + events.filter(e => e.type === 'memory.write' || e.type === 'brain.remember').length;
102
+ const cacheHits = events.filter(e => e.type === 'cache.hit').length;
103
+ const cacheMisses = events.filter(e => e.type === 'cache.miss').length;
104
+ const cacheTotal = cacheHits + cacheMisses;
105
+ const cacheHitRate = cacheTotal > 0 ? cacheHits / cacheTotal : undefined;
106
+ const archetype = this.pickArchetype({
107
+ collisions, decisions, cacheHitRate, hallucinations,
108
+ totalMemories, ageDays,
109
+ agentVariety: agentCounts.size,
110
+ eventCount: events.length,
111
+ });
112
+ const arc = ARCHETYPES.find(a => a.name === archetype);
113
+ return {
114
+ topEntities: Array.from(entitySet).slice(0, 5),
115
+ dominantPatterns: topN(categoryCounts, 5),
116
+ agentContributions: Array.from(agentCounts.entries())
117
+ .sort((a, b) => b[1] - a[1]).slice(0, 4)
118
+ .map(([agent, count]) => ({ agent, count })),
119
+ totalMemories,
120
+ totalEntities: entitySet.size,
121
+ ageDays: Math.round(ageDays * 10) / 10,
122
+ topLanguages: topN(languageCounts, 3),
123
+ hallucinationsCaught: hallucinations,
124
+ archetype,
125
+ archetypeTagline: arc.tagline,
126
+ cacheHitRate,
127
+ decisionsRecorded: decisions,
128
+ collisionsDetected: collisions,
129
+ };
130
+ }
131
+ // ── Internals ──────────────────────────────────────────────────────────────
132
+ safeInit() {
133
+ // Brain may be uninitialized; calling recall pre-init returns []. We avoid
134
+ // forcing init() because callers in test contexts may construct mocks.
135
+ try {
136
+ void this.brain.getStats();
137
+ }
138
+ catch { /* swallow */ }
139
+ }
140
+ resolveProjectId(project) {
141
+ try {
142
+ return GlobalBrain.projectIdFor(project);
143
+ }
144
+ catch {
145
+ return '';
146
+ }
147
+ }
148
+ pickArchetype(s) {
149
+ if (s.eventCount === 0 && s.totalMemories === 0)
150
+ return 'The Wanderer';
151
+ if (s.collisions >= 5 && s.collisions > s.decisions)
152
+ return 'The Debugger';
153
+ if (s.decisions >= 5)
154
+ return 'The Architect';
155
+ if ((s.cacheHitRate ?? 0) >= 0.8)
156
+ return 'The Speedster';
157
+ if (s.hallucinations >= 3)
158
+ return 'The Sentinel';
159
+ if (s.agentVariety >= 3)
160
+ return 'The Diplomat';
161
+ if (s.totalMemories >= 200)
162
+ return 'The Scholar';
163
+ if (s.ageDays >= 30)
164
+ return 'The Cartographer';
165
+ return 'The Wanderer';
166
+ }
167
+ // ── Renderers ──────────────────────────────────────────────────────────────
168
+ renderCard(project, stats, opts = {}) {
169
+ const W = 1080, H = 1080, P = 64;
170
+ const arc = ARCHETYPES.find(a => a.name === stats.archetype);
171
+ const projName = path.basename(path.resolve(project)) || 'unknown-brain';
172
+ const metrics = this.metricGrid(stats);
173
+ const gridStartY = 540;
174
+ const grid = [];
175
+ const cols = 3;
176
+ const cellW = (W - P * 2) / cols;
177
+ const cellH = 130;
178
+ metrics.forEach((m, i) => {
179
+ const x = P + (i % cols) * cellW;
180
+ const y = gridStartY + Math.floor(i / cols) * cellH;
181
+ grid.push(`<g transform="translate(${x},${y})">
182
+ <text x="0" y="22" fill="#7dd3fc" font-size="13" font-family="ui-sans-serif,system-ui" opacity="0.75">${esc(m.label)}</text>
183
+ <text x="0" y="64" fill="#e2f5ff" font-size="34" font-family="ui-monospace,SFMono-Regular,Menlo,monospace" font-weight="700">${esc(m.value)}</text>
184
+ <text x="0" y="86" fill="#7dd3fc" font-size="11" font-family="ui-monospace,monospace" opacity="0.55">${esc(m.sub)}</text>
185
+ </g>`);
186
+ });
187
+ const halfTag = opts.half ? ` data-half="${opts.half}"` : '';
188
+ return `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 ${W} ${H}" width="${W}" height="${H}"${halfTag}>
189
+ <!-- TODO: Ed25519-signed export marker -->
190
+ <defs>
191
+ <linearGradient id="card-bg" x1="0" y1="0" x2="1" y2="1">
192
+ <stop offset="0" stop-color="#061224"/>
193
+ <stop offset="0.5" stop-color="#0a1628"/>
194
+ <stop offset="1" stop-color="#0d2540"/>
195
+ </linearGradient>
196
+ <radialGradient id="halo" cx="0.5" cy="0.32" r="0.55">
197
+ <stop offset="0" stop-color="${arc.accent}" stop-opacity="0.35"/>
198
+ <stop offset="1" stop-color="${arc.accent}" stop-opacity="0"/>
199
+ </radialGradient>
200
+ <linearGradient id="hero" x1="0" y1="0" x2="1" y2="0">
201
+ <stop offset="0" stop-color="${arc.accent}"/>
202
+ <stop offset="1" stop-color="#00ffd5"/>
203
+ </linearGradient>
204
+ </defs>
205
+ <rect width="${W}" height="${H}" fill="url(#card-bg)"/>
206
+ <rect width="${W}" height="${H}" fill="url(#halo)"/>
207
+ <text x="${P}" y="96" fill="#7dd3fc" font-size="14" font-family="ui-monospace,monospace" letter-spacing="3">BRAIN DNA · v6.0.2</text>
208
+ <text x="${P}" y="140" fill="#e2f5ff" font-size="38" font-family="ui-sans-serif,system-ui" font-weight="600">${esc(projName)}</text>
209
+ <text x="${P}" y="170" fill="#7dd3fc" font-size="16" font-family="ui-monospace,monospace" opacity="0.7">${stats.ageDays.toFixed(1)} days alive</text>
210
+
211
+ <g transform="translate(${P},${260})">
212
+ <text x="0" y="0" fill="#7dd3fc" font-size="14" font-family="ui-monospace,monospace" opacity="0.75" letter-spacing="2">PERSONALITY ARCHETYPE</text>
213
+ <text x="0" y="80" fill="url(#hero)" font-size="84" font-family="ui-sans-serif,system-ui" font-weight="800">${esc(stats.archetype)}</text>
214
+ <text x="0" y="120" fill="#cfe9ff" font-size="20" font-family="ui-sans-serif,system-ui" opacity="0.85">${esc(stats.archetypeTagline)}</text>
215
+ <rect x="0" y="150" width="120" height="3" fill="${arc.accent}"/>
216
+ </g>
217
+
218
+ ${grid.join('\n ')}
219
+
220
+ <text x="${P}" y="${H - 76}" fill="#7dd3fc" font-size="13" font-family="ui-monospace,monospace" opacity="0.8">Powered by @shadow-brain</text>
221
+ <text x="${P}" y="${H - 52}" fill="#cfe9ff" font-size="14" font-family="ui-monospace,monospace">npm i -g @theihtisham/agent-shadow-brain</text>
222
+ <text x="${W - P}" y="${H - 52}" fill="${arc.accent}" font-size="16" font-family="ui-monospace,monospace" text-anchor="end" font-weight="700">${arc.glyph}</text>
223
+ </svg>`;
224
+ }
225
+ renderBanner(project, stats) {
226
+ const W = 1500, H = 500;
227
+ const arc = ARCHETYPES.find(a => a.name === stats.archetype);
228
+ const projName = path.basename(path.resolve(project)) || 'unknown-brain';
229
+ return `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 ${W} ${H}" width="${W}" height="${H}">
230
+ <!-- TODO: Ed25519-signed export marker -->
231
+ <defs>
232
+ <linearGradient id="b-bg" x1="0" y1="0" x2="1" y2="1">
233
+ <stop offset="0" stop-color="#061224"/><stop offset="1" stop-color="#0d2540"/>
234
+ </linearGradient>
235
+ <linearGradient id="b-hero" x1="0" y1="0" x2="1" y2="0">
236
+ <stop offset="0" stop-color="${arc.accent}"/><stop offset="1" stop-color="#00ffd5"/>
237
+ </linearGradient>
238
+ </defs>
239
+ <rect width="${W}" height="${H}" fill="url(#b-bg)"/>
240
+ <text x="48" y="80" fill="#7dd3fc" font-size="14" font-family="ui-monospace,monospace" letter-spacing="3">BRAIN DNA</text>
241
+ <text x="48" y="160" fill="#e2f5ff" font-size="48" font-family="ui-sans-serif,system-ui" font-weight="600">${esc(projName)}</text>
242
+ <text x="48" y="280" fill="url(#b-hero)" font-size="96" font-family="ui-sans-serif,system-ui" font-weight="800">${esc(stats.archetype)}</text>
243
+ <text x="48" y="320" fill="#cfe9ff" font-size="20" font-family="ui-sans-serif,system-ui" opacity="0.85">${esc(stats.archetypeTagline)}</text>
244
+ <text x="48" y="${H - 40}" fill="#7dd3fc" font-size="14" font-family="ui-monospace,monospace">npm i -g @theihtisham/agent-shadow-brain</text>
245
+ <text x="${W - 48}" y="${H - 40}" fill="${arc.accent}" font-size="18" font-family="ui-monospace,monospace" text-anchor="end" font-weight="700">${stats.totalMemories} memories · ${stats.totalEntities} entities · ${stats.ageDays}d</text>
246
+ </svg>`;
247
+ }
248
+ renderPoster(project, stats) {
249
+ // Poster = vertical 1080x1920 (Story-shaped)
250
+ const W = 1080, H = 1920, P = 72;
251
+ const arc = ARCHETYPES.find(a => a.name === stats.archetype);
252
+ const projName = path.basename(path.resolve(project)) || 'unknown-brain';
253
+ const metrics = this.metricGrid(stats);
254
+ const items = metrics.map((m, i) => `<g transform="translate(${P},${720 + i * 130})">
255
+ <text x="0" y="0" fill="#7dd3fc" font-size="14" font-family="ui-monospace,monospace" opacity="0.7">${esc(m.label)}</text>
256
+ <text x="0" y="48" fill="#e2f5ff" font-size="40" font-family="ui-monospace,monospace" font-weight="700">${esc(m.value)}</text>
257
+ <text x="0" y="74" fill="#7dd3fc" font-size="12" font-family="ui-monospace,monospace" opacity="0.55">${esc(m.sub)}</text>
258
+ </g>`).join('\n ');
259
+ return `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 ${W} ${H}" width="${W}" height="${H}">
260
+ <!-- TODO: Ed25519-signed export marker -->
261
+ <defs>
262
+ <linearGradient id="p-bg" x1="0" y1="0" x2="0" y2="1">
263
+ <stop offset="0" stop-color="#061224"/><stop offset="1" stop-color="#0d2540"/>
264
+ </linearGradient>
265
+ <linearGradient id="p-hero" x1="0" y1="0" x2="1" y2="0">
266
+ <stop offset="0" stop-color="${arc.accent}"/><stop offset="1" stop-color="#00ffd5"/>
267
+ </linearGradient>
268
+ </defs>
269
+ <rect width="${W}" height="${H}" fill="url(#p-bg)"/>
270
+ <text x="${P}" y="160" fill="#7dd3fc" font-size="14" font-family="ui-monospace,monospace" letter-spacing="4">BRAIN DNA · v6.0.2</text>
271
+ <text x="${P}" y="230" fill="#e2f5ff" font-size="56" font-family="ui-sans-serif,system-ui" font-weight="600">${esc(projName)}</text>
272
+ <text x="${P}" y="460" fill="url(#p-hero)" font-size="110" font-family="ui-sans-serif,system-ui" font-weight="800">${esc(stats.archetype)}</text>
273
+ <text x="${P}" y="500" fill="#cfe9ff" font-size="22" font-family="ui-sans-serif,system-ui" opacity="0.85">${esc(stats.archetypeTagline)}</text>
274
+ ${items}
275
+ <text x="${P}" y="${H - 80}" fill="#7dd3fc" font-size="14" font-family="ui-monospace,monospace">npm i -g @theihtisham/agent-shadow-brain</text>
276
+ </svg>`;
277
+ }
278
+ composeSideBySide(pA, sA, pB, sB, _leftSvg, _rightSvg) {
279
+ // Compose a fresh side-by-side instead of nesting two large SVGs.
280
+ const W = 2200, H = 1080, gap = 40;
281
+ const inner = (this.renderCard(pA, sA, { half: 'left' }))
282
+ .replace(/^<svg[^>]+>/, '').replace(/<\/svg>\s*$/, '');
283
+ const inner2 = (this.renderCard(pB, sB, { half: 'right' }))
284
+ .replace(/^<svg[^>]+>/, '').replace(/<\/svg>\s*$/, '');
285
+ return `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 ${W} ${H}" width="${W}" height="${H}">
286
+ <rect width="${W}" height="${H}" fill="#020812"/>
287
+ <g transform="translate(0,0)">${inner}</g>
288
+ <g transform="translate(${1080 + gap},0)">${inner2}</g>
289
+ <line x1="${1080 + gap / 2}" y1="40" x2="${1080 + gap / 2}" y2="${H - 40}" stroke="#1a3a5a" stroke-width="1"/>
290
+ </svg>`;
291
+ }
292
+ metricGrid(stats) {
293
+ const topAgent = stats.agentContributions[0];
294
+ const topLang = stats.topLanguages[0] ?? '—';
295
+ return [
296
+ { label: 'MEMORIES', value: fmt(stats.totalMemories), sub: 'recorded thoughts' },
297
+ { label: 'ENTITIES', value: fmt(stats.totalEntities), sub: 'tracked symbols' },
298
+ { label: 'DAYS ALIVE', value: stats.ageDays.toFixed(1), sub: 'since first event' },
299
+ { label: 'TOP LANGUAGE', value: topLang.toUpperCase().slice(0, 12), sub: 'most-tagged' },
300
+ { label: 'TOP AGENT', value: (topAgent?.agent ?? 'none').slice(0, 14), sub: `${topAgent?.count ?? 0} contributions` },
301
+ { label: 'HALLUCINATIONS', value: fmt(stats.hallucinationsCaught), sub: 'caught + quarantined' },
302
+ ];
303
+ }
304
+ }
305
+ // ── Helpers ──────────────────────────────────────────────────────────────────
306
+ function topN(m, n) {
307
+ return Array.from(m.entries()).sort((a, b) => b[1] - a[1]).slice(0, n).map(([k]) => k);
308
+ }
309
+ function fmt(n) {
310
+ if (n >= 1000000)
311
+ return (n / 1000000).toFixed(1) + 'M';
312
+ if (n >= 1000)
313
+ return (n / 1000).toFixed(1) + 'k';
314
+ return String(n);
315
+ }
316
+ function esc(s) {
317
+ return String(s).replace(/[&<>"']/g, c => ({ '&': '&amp;', '<': '&lt;', '>': '&gt;', '"': '&quot;', "'": '&#39;' }[c]));
318
+ }
319
+ // PNG rasterization: only enable if `node-canvas` is present at runtime. Guarded
320
+ // behind a try-import-shaped helper. SVG is always produced.
321
+ export async function rasterizeToPng(_svg) {
322
+ // TODO: detect node-canvas at runtime via createRequire and rasterize.
323
+ // Currently returns null — callers should treat PNG as opt-in.
324
+ void _svg;
325
+ void os;
326
+ void fs;
327
+ return null;
328
+ }
329
+ let _instance = null;
330
+ export function getBrainDna() {
331
+ if (!_instance)
332
+ _instance = new BrainDna();
333
+ return _instance;
334
+ }
335
+ export function resetBrainDnaForTests() { _instance = null; }
336
+ //# sourceMappingURL=brain-dna.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"brain-dna.js","sourceRoot":"","sources":["../../src/brain/brain-dna.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ import { BrainDna } from './brain-dna.js';
2
+ export type PoolKind = 'local' | 'exchange' | 'all';
3
+ export interface DoppelgangerMatch {
4
+ otherProject: string;
5
+ similarity: number;
6
+ sharedArchetype: boolean;
7
+ sharedEntities: string[];
8
+ divergentEntities: string[];
9
+ compatibilityScore: number;
10
+ blurb: string;
11
+ svg: string;
12
+ }
13
+ export declare class BrainDoppelganger {
14
+ private dna;
15
+ constructor(dna?: BrainDna);
16
+ /** Find similar brains across the chosen pool. */
17
+ findMatches(project: string, opts?: {
18
+ pool?: PoolKind;
19
+ topK?: number;
20
+ minSimilarity?: number;
21
+ }): Promise<DoppelgangerMatch[]>;
22
+ /** Render a 1200x630 horizontal compatibility card for two projects. */
23
+ compatibilityCard(myProject: string, otherProject: string): Promise<{
24
+ svg: string;
25
+ }>;
26
+ private collectPool;
27
+ private collectLocal;
28
+ private collectExchange;
29
+ }
30
+ export declare function getBrainDoppelganger(): BrainDoppelganger;
31
+ export declare function resetBrainDoppelgangerForTests(): void;
32
+ //# sourceMappingURL=brain-doppelganger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"brain-doppelganger.d.ts","sourceRoot":"","sources":["../../src/brain/brain-doppelganger.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,QAAQ,EAA6C,MAAM,gBAAgB,CAAC;AAIrF,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,UAAU,GAAG,KAAK,CAAC;AAEpD,MAAM,WAAW,iBAAiB;IAChC,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,OAAO,CAAC;IACzB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;CACb;AAwBD,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,GAAG,CAAW;gBAEV,GAAG,CAAC,EAAE,QAAQ;IAI1B,kDAAkD;IAC5C,WAAW,CACf,OAAO,EAAE,MAAM,EACf,IAAI,GAAE;QAAE,IAAI,CAAC,EAAE,QAAQ,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,aAAa,CAAC,EAAE,MAAM,CAAA;KAAO,GACpE,OAAO,CAAC,iBAAiB,EAAE,CAAC;IAmE/B,wEAAwE;IAClE,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;YAa5E,WAAW;IAazB,OAAO,CAAC,YAAY;YAuBN,eAAe;CAgB9B;AAmSD,wBAAgB,oBAAoB,IAAI,iBAAiB,CAGxD;AACD,wBAAgB,8BAA8B,IAAI,IAAI,CAAsB"}