@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.
- package/README.md +107 -7
- package/dist/brain/brain-3d.d.ts +79 -0
- package/dist/brain/brain-3d.d.ts.map +1 -0
- package/dist/brain/brain-3d.js +468 -0
- package/dist/brain/brain-3d.js.map +1 -0
- package/dist/brain/brain-active-learner.d.ts +74 -0
- package/dist/brain/brain-active-learner.d.ts.map +1 -0
- package/dist/brain/brain-active-learner.js +425 -0
- package/dist/brain/brain-active-learner.js.map +1 -0
- package/dist/brain/brain-ascii.d.ts +32 -0
- package/dist/brain/brain-ascii.d.ts.map +1 -0
- package/dist/brain/brain-ascii.js +402 -0
- package/dist/brain/brain-ascii.js.map +1 -0
- package/dist/brain/brain-cinema.d.ts +45 -0
- package/dist/brain/brain-cinema.d.ts.map +1 -0
- package/dist/brain/brain-cinema.js +393 -0
- package/dist/brain/brain-cinema.js.map +1 -0
- package/dist/brain/brain-coach.d.ts +45 -0
- package/dist/brain/brain-coach.d.ts.map +1 -0
- package/dist/brain/brain-coach.js +383 -0
- package/dist/brain/brain-coach.js.map +1 -0
- package/dist/brain/brain-consolidator.d.ts +56 -0
- package/dist/brain/brain-consolidator.d.ts.map +1 -0
- package/dist/brain/brain-consolidator.js +386 -0
- package/dist/brain/brain-consolidator.js.map +1 -0
- package/dist/brain/brain-contradictions.d.ts +57 -0
- package/dist/brain/brain-contradictions.d.ts.map +1 -0
- package/dist/brain/brain-contradictions.js +443 -0
- package/dist/brain/brain-contradictions.js.map +1 -0
- package/dist/brain/brain-diff.d.ts +61 -0
- package/dist/brain/brain-diff.d.ts.map +1 -0
- package/dist/brain/brain-diff.js +439 -0
- package/dist/brain/brain-diff.js.map +1 -0
- package/dist/brain/brain-dna.d.ts +59 -0
- package/dist/brain/brain-dna.d.ts.map +1 -0
- package/dist/brain/brain-dna.js +336 -0
- package/dist/brain/brain-dna.js.map +1 -0
- package/dist/brain/brain-doppelganger.d.ts +32 -0
- package/dist/brain/brain-doppelganger.d.ts.map +1 -0
- package/dist/brain/brain-doppelganger.js +417 -0
- package/dist/brain/brain-doppelganger.js.map +1 -0
- package/dist/brain/brain-graph-walker.d.ts +54 -0
- package/dist/brain/brain-graph-walker.d.ts.map +1 -0
- package/dist/brain/brain-graph-walker.js +412 -0
- package/dist/brain/brain-graph-walker.js.map +1 -0
- package/dist/brain/brain-holiday-card.d.ts +50 -0
- package/dist/brain/brain-holiday-card.d.ts.map +1 -0
- package/dist/brain/brain-holiday-card.js +432 -0
- package/dist/brain/brain-holiday-card.js.map +1 -0
- package/dist/brain/brain-memes.d.ts +44 -0
- package/dist/brain/brain-memes.d.ts.map +1 -0
- package/dist/brain/brain-memes.js +438 -0
- package/dist/brain/brain-memes.js.map +1 -0
- package/dist/brain/brain-memory-tiers.d.ts +67 -0
- package/dist/brain/brain-memory-tiers.d.ts.map +1 -0
- package/dist/brain/brain-memory-tiers.js +292 -0
- package/dist/brain/brain-memory-tiers.js.map +1 -0
- package/dist/brain/brain-notebook.d.ts +68 -0
- package/dist/brain/brain-notebook.d.ts.map +1 -0
- package/dist/brain/brain-notebook.js +379 -0
- package/dist/brain/brain-notebook.js.map +1 -0
- package/dist/brain/brain-quantize.d.ts +62 -0
- package/dist/brain/brain-quantize.d.ts.map +1 -0
- package/dist/brain/brain-quantize.js +346 -0
- package/dist/brain/brain-quantize.js.map +1 -0
- package/dist/brain/brain-query-expander.d.ts +31 -0
- package/dist/brain/brain-query-expander.d.ts.map +1 -0
- package/dist/brain/brain-query-expander.js +417 -0
- package/dist/brain/brain-query-expander.js.map +1 -0
- package/dist/brain/brain-quest.d.ts +58 -0
- package/dist/brain/brain-quest.d.ts.map +1 -0
- package/dist/brain/brain-quest.js +541 -0
- package/dist/brain/brain-quest.js.map +1 -0
- package/dist/brain/brain-recall-cache.d.ts +73 -0
- package/dist/brain/brain-recall-cache.d.ts.map +1 -0
- package/dist/brain/brain-recall-cache.js +444 -0
- package/dist/brain/brain-recall-cache.js.map +1 -0
- package/dist/brain/brain-reflex.d.ts +55 -0
- package/dist/brain/brain-reflex.d.ts.map +1 -0
- package/dist/brain/brain-reflex.js +364 -0
- package/dist/brain/brain-reflex.js.map +1 -0
- package/dist/brain/brain-replay.d.ts +74 -0
- package/dist/brain/brain-replay.d.ts.map +1 -0
- package/dist/brain/brain-replay.js +336 -0
- package/dist/brain/brain-replay.js.map +1 -0
- package/dist/brain/brain-rerank.d.ts +39 -0
- package/dist/brain/brain-rerank.d.ts.map +1 -0
- package/dist/brain/brain-rerank.js +216 -0
- package/dist/brain/brain-rerank.js.map +1 -0
- package/dist/brain/brain-roast.d.ts +44 -0
- package/dist/brain/brain-roast.d.ts.map +1 -0
- package/dist/brain/brain-roast.js +566 -0
- package/dist/brain/brain-roast.js.map +1 -0
- package/dist/brain/brain-sonification.d.ts +57 -0
- package/dist/brain/brain-sonification.d.ts.map +1 -0
- package/dist/brain/brain-sonification.js +286 -0
- package/dist/brain/brain-sonification.js.map +1 -0
- package/dist/brain/brain-tarot.d.ts +49 -0
- package/dist/brain/brain-tarot.d.ts.map +1 -0
- package/dist/brain/brain-tarot.js +634 -0
- package/dist/brain/brain-tarot.js.map +1 -0
- package/dist/brain/brain-time-capsule.d.ts +80 -0
- package/dist/brain/brain-time-capsule.d.ts.map +1 -0
- package/dist/brain/brain-time-capsule.js +289 -0
- package/dist/brain/brain-time-capsule.js.map +1 -0
- package/dist/brain/brain-trophies.d.ts +60 -0
- package/dist/brain/brain-trophies.d.ts.map +1 -0
- package/dist/brain/brain-trophies.js +431 -0
- package/dist/brain/brain-trophies.js.map +1 -0
- package/dist/brain/brain-working-memory.d.ts +78 -0
- package/dist/brain/brain-working-memory.d.ts.map +1 -0
- package/dist/brain/brain-working-memory.js +367 -0
- package/dist/brain/brain-working-memory.js.map +1 -0
- package/dist/brain/confidence-gate.d.ts +69 -0
- package/dist/brain/confidence-gate.d.ts.map +1 -0
- package/dist/brain/confidence-gate.js +244 -0
- package/dist/brain/confidence-gate.js.map +1 -0
- package/dist/brain/constitution.d.ts +59 -0
- package/dist/brain/constitution.d.ts.map +1 -0
- package/dist/brain/constitution.js +315 -0
- package/dist/brain/constitution.js.map +1 -0
- package/dist/brain/embeddings-v2.d.ts +58 -0
- package/dist/brain/embeddings-v2.d.ts.map +1 -0
- package/dist/brain/embeddings-v2.js +344 -0
- package/dist/brain/embeddings-v2.js.map +1 -0
- package/dist/brain/hive-voice.d.ts +71 -0
- package/dist/brain/hive-voice.d.ts.map +1 -0
- package/dist/brain/hive-voice.js +352 -0
- package/dist/brain/hive-voice.js.map +1 -0
- package/dist/brain/markdown-export.d.ts +48 -0
- package/dist/brain/markdown-export.d.ts.map +1 -0
- package/dist/brain/markdown-export.js +382 -0
- package/dist/brain/markdown-export.js.map +1 -0
- package/dist/brain/multimodal-vision.d.ts +38 -0
- package/dist/brain/multimodal-vision.d.ts.map +1 -0
- package/dist/brain/multimodal-vision.js +257 -0
- package/dist/brain/multimodal-vision.js.map +1 -0
- package/dist/brain/otel-lite.d.ts +71 -0
- package/dist/brain/otel-lite.d.ts.map +1 -0
- package/dist/brain/otel-lite.js +232 -0
- package/dist/brain/otel-lite.js.map +1 -0
- package/dist/cli.js +881 -2
- package/dist/cli.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,439 @@
|
|
|
1
|
+
// src/brain/brain-diff.ts — Brain Diff (viral feature)
|
|
2
|
+
// v6.0.2 — semantic diff between two brains
|
|
3
|
+
//
|
|
4
|
+
// "What did your brain learn that mine didn't?"
|
|
5
|
+
//
|
|
6
|
+
// Accepts either an in-memory BrainSnapshot or a path/capsuleId. Computes:
|
|
7
|
+
// • onlyInA / onlyInB / bothShared / conflicting entities
|
|
8
|
+
// • similarity score (cosine-mean over shared entity embeddings)
|
|
9
|
+
// • narrative (2-3 sentence English summary)
|
|
10
|
+
// • svg (Venn-diagram-style card, tweet-ready, 1200x600)
|
|
11
|
+
//
|
|
12
|
+
// Designed to coordinate with brain-time-capsule.ts via interfaces only — no
|
|
13
|
+
// hard import of capsule internals, so each module is independently testable.
|
|
14
|
+
import * as fs from 'fs';
|
|
15
|
+
import * as path from 'path';
|
|
16
|
+
import * as os from 'os';
|
|
17
|
+
import * as zlib from 'zlib';
|
|
18
|
+
const BRAIN_ROOT = path.join(os.homedir(), '.shadow-brain');
|
|
19
|
+
export class BrainDiff {
|
|
20
|
+
/** Compute a semantic diff between two brains. */
|
|
21
|
+
async diff(brainA, brainB) {
|
|
22
|
+
const a = await this.normalize(brainA, 'A');
|
|
23
|
+
const b = await this.normalize(brainB, 'B');
|
|
24
|
+
const byIdA = indexBy(a.entities, e => e.id);
|
|
25
|
+
const byIdB = indexBy(b.entities, e => e.id);
|
|
26
|
+
const onlyInA = [];
|
|
27
|
+
const onlyInB = [];
|
|
28
|
+
const bothShared = [];
|
|
29
|
+
const conflicting = [];
|
|
30
|
+
for (const e of a.entities) {
|
|
31
|
+
const other = byIdB.get(e.id);
|
|
32
|
+
if (!other)
|
|
33
|
+
onlyInA.push(e);
|
|
34
|
+
else if (sameContent(e, other))
|
|
35
|
+
bothShared.push(e);
|
|
36
|
+
else {
|
|
37
|
+
const sim = await this.cosine(e, other);
|
|
38
|
+
conflicting.push({ a: e, b: other, reason: 'same-id-different-content', similarity: sim });
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
for (const e of b.entities) {
|
|
42
|
+
if (!byIdA.has(e.id))
|
|
43
|
+
onlyInB.push(e);
|
|
44
|
+
}
|
|
45
|
+
// Mean cosine of shared entities — defaults to 1 when no overlap (vacuously identical).
|
|
46
|
+
const sharedSimilarities = [];
|
|
47
|
+
for (const e of bothShared) {
|
|
48
|
+
const other = byIdB.get(e.id);
|
|
49
|
+
if (!other)
|
|
50
|
+
continue;
|
|
51
|
+
sharedSimilarities.push(await this.cosine(e, other));
|
|
52
|
+
}
|
|
53
|
+
const similarityScore = sharedSimilarities.length
|
|
54
|
+
? sharedSimilarities.reduce((s, x) => s + x, 0) / sharedSimilarities.length
|
|
55
|
+
: (bothShared.length === 0 && (a.entities.length || b.entities.length) ? 0 : 1);
|
|
56
|
+
const stats = {
|
|
57
|
+
addedCount: onlyInB.length,
|
|
58
|
+
removedCount: onlyInA.length,
|
|
59
|
+
conflictCount: conflicting.length,
|
|
60
|
+
similarityScore,
|
|
61
|
+
sizeA: a.entities.length,
|
|
62
|
+
sizeB: b.entities.length,
|
|
63
|
+
};
|
|
64
|
+
const narrative = this.narrate(a, b, onlyInA, onlyInB, bothShared, similarityScore);
|
|
65
|
+
const svg = this.renderSvg(a.label ?? 'Brain A', b.label ?? 'Brain B', onlyInA, onlyInB, bothShared, stats);
|
|
66
|
+
return {
|
|
67
|
+
labelA: a.label ?? 'Brain A',
|
|
68
|
+
labelB: b.label ?? 'Brain B',
|
|
69
|
+
onlyInA, onlyInB, bothShared, conflicting,
|
|
70
|
+
stats,
|
|
71
|
+
narrative,
|
|
72
|
+
svg,
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Apply a diff back into a target brain snapshot. Returns the merged entities.
|
|
77
|
+
* Caller is responsible for persisting them.
|
|
78
|
+
*/
|
|
79
|
+
async applyDiff(targetBrain, diff, opts) {
|
|
80
|
+
const merged = new Map();
|
|
81
|
+
for (const e of targetBrain.entities)
|
|
82
|
+
merged.set(e.id, e);
|
|
83
|
+
const consider = async (entities, from) => {
|
|
84
|
+
for (const e of entities) {
|
|
85
|
+
if (opts.strategy === 'addOnly' && merged.has(e.id))
|
|
86
|
+
continue;
|
|
87
|
+
if (opts.strategy === 'interactive') {
|
|
88
|
+
const keep = opts.decide ? await opts.decide(e, from) : true;
|
|
89
|
+
if (!keep)
|
|
90
|
+
continue;
|
|
91
|
+
}
|
|
92
|
+
merged.set(e.id, e);
|
|
93
|
+
}
|
|
94
|
+
};
|
|
95
|
+
// mergeAll: pull from both onlyInA + onlyInB + winning side of conflicts (use B as "newer").
|
|
96
|
+
if (opts.strategy === 'mergeAll' || opts.strategy === 'addOnly' || opts.strategy === 'interactive') {
|
|
97
|
+
await consider(diff.onlyInA, 'A');
|
|
98
|
+
await consider(diff.onlyInB, 'B');
|
|
99
|
+
if (opts.strategy === 'mergeAll') {
|
|
100
|
+
for (const c of diff.conflicting)
|
|
101
|
+
merged.set(c.b.id, c.b);
|
|
102
|
+
}
|
|
103
|
+
else if (opts.strategy === 'interactive') {
|
|
104
|
+
for (const c of diff.conflicting) {
|
|
105
|
+
const keepB = opts.decide ? await opts.decide(c.b, 'B') : true;
|
|
106
|
+
if (keepB)
|
|
107
|
+
merged.set(c.b.id, c.b);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
return Array.from(merged.values());
|
|
112
|
+
}
|
|
113
|
+
// ── Internals ────────────────────────────────────────────────────────────────
|
|
114
|
+
async normalize(input, fallbackLabel) {
|
|
115
|
+
if (typeof input !== 'string') {
|
|
116
|
+
return { ...input, label: input.label ?? `Brain ${fallbackLabel}`, entities: input.entities ?? [] };
|
|
117
|
+
}
|
|
118
|
+
// Treat string as a path / capsuleId.
|
|
119
|
+
const snapshot = await loadFromPathOrCapsule(input);
|
|
120
|
+
if (snapshot.entities.length === 0)
|
|
121
|
+
snapshot.entities = [];
|
|
122
|
+
snapshot.label = snapshot.label ?? path.basename(input) ?? `Brain ${fallbackLabel}`;
|
|
123
|
+
return snapshot;
|
|
124
|
+
}
|
|
125
|
+
/** Cosine similarity between two entities. Embeds lazily if needed. */
|
|
126
|
+
async cosine(a, b) {
|
|
127
|
+
const va = await ensureVector(a);
|
|
128
|
+
const vb = await ensureVector(b);
|
|
129
|
+
if (!va || !vb)
|
|
130
|
+
return contentSimilarity(a.content, b.content);
|
|
131
|
+
const n = Math.min(va.length, vb.length);
|
|
132
|
+
let dot = 0;
|
|
133
|
+
for (let i = 0; i < n; i++)
|
|
134
|
+
dot += va[i] * vb[i];
|
|
135
|
+
return dot;
|
|
136
|
+
}
|
|
137
|
+
narrate(a, b, onlyA, onlyB, shared, sim) {
|
|
138
|
+
const topA = topCategories(onlyA);
|
|
139
|
+
const topB = topCategories(onlyB);
|
|
140
|
+
const sharedTop = topCategories(shared);
|
|
141
|
+
const labelA = a.label ?? 'Brain A';
|
|
142
|
+
const labelB = b.label ?? 'Brain B';
|
|
143
|
+
const sentences = [];
|
|
144
|
+
if (topA.length) {
|
|
145
|
+
sentences.push(`${labelA} focuses heavily on ${describeTop(topA)}.`);
|
|
146
|
+
}
|
|
147
|
+
else if (onlyA.length === 0) {
|
|
148
|
+
sentences.push(`${labelA} has no entities unique to it.`);
|
|
149
|
+
}
|
|
150
|
+
if (topB.length) {
|
|
151
|
+
sentences.push(`${labelB} is ${describeTop(topB)}-heavy.`);
|
|
152
|
+
}
|
|
153
|
+
else if (onlyB.length === 0) {
|
|
154
|
+
sentences.push(`${labelB} has no entities unique to it.`);
|
|
155
|
+
}
|
|
156
|
+
if (sharedTop.length) {
|
|
157
|
+
sentences.push(`Both share strong ${describeTop(sharedTop)} patterns (similarity ${(sim * 100).toFixed(0)}%).`);
|
|
158
|
+
}
|
|
159
|
+
const ratio = b.entities.length > 0 ? a.entities.length / b.entities.length : 1;
|
|
160
|
+
if (ratio !== 1 && Math.abs(ratio - 1) > 0.05 && a.entities.length && b.entities.length) {
|
|
161
|
+
const pct = Math.abs(ratio - 1) * 100;
|
|
162
|
+
const which = ratio > 1 ? labelA : labelB;
|
|
163
|
+
sentences.push(`${which} is ${pct.toFixed(0)}% larger.`);
|
|
164
|
+
}
|
|
165
|
+
return sentences.slice(0, 4).join(' ');
|
|
166
|
+
}
|
|
167
|
+
renderSvg(labelA, labelB, onlyA, onlyB, shared, stats) {
|
|
168
|
+
const W = 1200, H = 600;
|
|
169
|
+
const cx1 = 420, cx2 = 780, cy = 320, r = 240;
|
|
170
|
+
const topA = topEntities(onlyA, 5);
|
|
171
|
+
const topB = topEntities(onlyB, 5);
|
|
172
|
+
const topShared = topEntities(shared, 5);
|
|
173
|
+
const renderList = (items, x, anchor) => items.map((e, i) => {
|
|
174
|
+
const text = escapeXml(shortLabel(e));
|
|
175
|
+
return ` <text x="${x}" y="${cy - 30 + i * 18}" font-size="13" fill="#e8ecf4" text-anchor="${anchor}">• ${text}</text>`;
|
|
176
|
+
}).join('\n');
|
|
177
|
+
const safeA = escapeXml(labelA.length > 30 ? labelA.slice(0, 29) + '…' : labelA);
|
|
178
|
+
const safeB = escapeXml(labelB.length > 30 ? labelB.slice(0, 29) + '…' : labelB);
|
|
179
|
+
const simPct = (stats.similarityScore * 100).toFixed(0);
|
|
180
|
+
return `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 ${W} ${H}" width="${W}" height="${H}" role="img" aria-label="Brain Diff card">
|
|
181
|
+
<defs>
|
|
182
|
+
<radialGradient id="bdA" cx="50%" cy="50%" r="50%">
|
|
183
|
+
<stop offset="0%" stop-color="#18ffff" stop-opacity="0.55"/>
|
|
184
|
+
<stop offset="100%" stop-color="#18ffff" stop-opacity="0.10"/>
|
|
185
|
+
</radialGradient>
|
|
186
|
+
<radialGradient id="bdB" cx="50%" cy="50%" r="50%">
|
|
187
|
+
<stop offset="0%" stop-color="#ec4899" stop-opacity="0.55"/>
|
|
188
|
+
<stop offset="100%" stop-color="#ec4899" stop-opacity="0.10"/>
|
|
189
|
+
</radialGradient>
|
|
190
|
+
<linearGradient id="bdBg" x1="0" y1="0" x2="1" y2="1">
|
|
191
|
+
<stop offset="0%" stop-color="#030509"/>
|
|
192
|
+
<stop offset="100%" stop-color="#10152a"/>
|
|
193
|
+
</linearGradient>
|
|
194
|
+
<linearGradient id="bdShared" x1="0" y1="0" x2="1" y2="0">
|
|
195
|
+
<stop offset="0%" stop-color="#18ffff"/>
|
|
196
|
+
<stop offset="100%" stop-color="#ec4899"/>
|
|
197
|
+
</linearGradient>
|
|
198
|
+
</defs>
|
|
199
|
+
<rect width="${W}" height="${H}" fill="url(#bdBg)"/>
|
|
200
|
+
<text x="40" y="44" font-family="ui-sans-serif,system-ui,sans-serif" font-size="22" font-weight="700" fill="#18ffff">Brain Diff</text>
|
|
201
|
+
<text x="40" y="68" font-family="ui-sans-serif,system-ui,sans-serif" font-size="13" fill="#a4afc4">${safeA} vs ${safeB} · similarity ${simPct}%</text>
|
|
202
|
+
<circle cx="${cx1}" cy="${cy}" r="${r}" fill="url(#bdA)" stroke="#18ffff" stroke-opacity="0.55"/>
|
|
203
|
+
<circle cx="${cx2}" cy="${cy}" r="${r}" fill="url(#bdB)" stroke="#ec4899" stroke-opacity="0.55"/>
|
|
204
|
+
<text x="${cx1 - r + 30}" y="${cy - r + 20}" font-size="16" font-weight="700" fill="#18ffff">${safeA}</text>
|
|
205
|
+
<text x="${cx1 - r + 30}" y="${cy - r + 42}" font-size="12" fill="#a4afc4">${onlyA.length} unique · ${stats.sizeA} total</text>
|
|
206
|
+
${renderList(topA, cx1 - r + 30, 'start')}
|
|
207
|
+
<text x="${cx2 + r - 30}" y="${cy - r + 20}" font-size="16" font-weight="700" fill="#ec4899" text-anchor="end">${safeB}</text>
|
|
208
|
+
<text x="${cx2 + r - 30}" y="${cy - r + 42}" font-size="12" fill="#a4afc4" text-anchor="end">${onlyB.length} unique · ${stats.sizeB} total</text>
|
|
209
|
+
${renderList(topB, cx2 + r - 30, 'end')}
|
|
210
|
+
<text x="${(cx1 + cx2) / 2}" y="${cy - r + 20}" font-size="14" font-weight="700" fill="url(#bdShared)" text-anchor="middle">SHARED</text>
|
|
211
|
+
<text x="${(cx1 + cx2) / 2}" y="${cy - r + 42}" font-size="12" fill="#a855f7" text-anchor="middle">${shared.length} entities</text>
|
|
212
|
+
${renderList(topShared, (cx1 + cx2) / 2, 'middle')}
|
|
213
|
+
<text x="40" y="${H - 12}" font-family="ui-sans-serif,system-ui,sans-serif" font-size="11" fill="#3e4762">agent-shadow-brain · brain diff</text>
|
|
214
|
+
</svg>`;
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
// ── Snapshot loader: capsule-aware, but tolerant when capsule module isn't loaded ──
|
|
218
|
+
async function loadFromPathOrCapsule(input) {
|
|
219
|
+
// Case 1: literal JSON file path on disk.
|
|
220
|
+
if (input.endsWith('.json') && fs.existsSync(input)) {
|
|
221
|
+
try {
|
|
222
|
+
const raw = JSON.parse(fs.readFileSync(input, 'utf-8'));
|
|
223
|
+
return coerceSnapshot(raw, input);
|
|
224
|
+
}
|
|
225
|
+
catch { /* fall through */ }
|
|
226
|
+
}
|
|
227
|
+
// Case 2: capsule directory or capsule id under ~/.shadow-brain/time-capsules.
|
|
228
|
+
const capsulePath = resolveCapsulePath(input);
|
|
229
|
+
if (capsulePath) {
|
|
230
|
+
return await loadCapsuleSnapshot(capsulePath);
|
|
231
|
+
}
|
|
232
|
+
// Case 3: input is a directory containing brain-state files (live brain root).
|
|
233
|
+
if (fs.existsSync(input) && fs.statSync(input).isDirectory()) {
|
|
234
|
+
return loadLiveBrainSnapshot(input);
|
|
235
|
+
}
|
|
236
|
+
// Empty fallback — graceful.
|
|
237
|
+
return { label: path.basename(input) || 'unknown', entities: [], source: input };
|
|
238
|
+
}
|
|
239
|
+
function resolveCapsulePath(input) {
|
|
240
|
+
if (path.isAbsolute(input) && fs.existsSync(input) && fs.existsSync(path.join(input, 'manifest.json'))) {
|
|
241
|
+
return input;
|
|
242
|
+
}
|
|
243
|
+
const capsuleRoot = path.join(BRAIN_ROOT, 'time-capsules');
|
|
244
|
+
if (!fs.existsSync(capsuleRoot))
|
|
245
|
+
return null;
|
|
246
|
+
for (const project of fs.readdirSync(capsuleRoot)) {
|
|
247
|
+
const projectDir = path.join(capsuleRoot, project);
|
|
248
|
+
if (!fs.statSync(projectDir).isDirectory())
|
|
249
|
+
continue;
|
|
250
|
+
const direct = path.join(projectDir, input.endsWith('.tcz') ? input : `${input}.tcz`);
|
|
251
|
+
if (fs.existsSync(direct))
|
|
252
|
+
return direct;
|
|
253
|
+
}
|
|
254
|
+
return null;
|
|
255
|
+
}
|
|
256
|
+
async function loadCapsuleSnapshot(capsuleDir) {
|
|
257
|
+
const manifestPath = path.join(capsuleDir, 'manifest.json');
|
|
258
|
+
if (!fs.existsSync(manifestPath))
|
|
259
|
+
return { label: path.basename(capsuleDir), entities: [], source: capsuleDir };
|
|
260
|
+
const manifest = JSON.parse(fs.readFileSync(manifestPath, 'utf-8'));
|
|
261
|
+
const entities = [];
|
|
262
|
+
for (const f of manifest.files ?? []) {
|
|
263
|
+
try {
|
|
264
|
+
const gz = fs.readFileSync(path.join(capsuleDir, 'content', f.rel + '.gz'));
|
|
265
|
+
const raw = zlib.gunzipSync(gz).toString('utf-8');
|
|
266
|
+
extractEntitiesFrom(f.rel, raw, entities);
|
|
267
|
+
}
|
|
268
|
+
catch { /* skip */ }
|
|
269
|
+
}
|
|
270
|
+
return { label: manifest.label ?? manifest.project ?? path.basename(capsuleDir), entities, source: capsuleDir };
|
|
271
|
+
}
|
|
272
|
+
function loadLiveBrainSnapshot(dir) {
|
|
273
|
+
const entities = [];
|
|
274
|
+
walkBrain(dir, dir, entities);
|
|
275
|
+
return { label: path.basename(dir), entities, source: dir };
|
|
276
|
+
}
|
|
277
|
+
function walkBrain(absRoot, abs, out, depth = 0) {
|
|
278
|
+
if (depth > 5)
|
|
279
|
+
return;
|
|
280
|
+
let stat;
|
|
281
|
+
try {
|
|
282
|
+
stat = fs.statSync(abs);
|
|
283
|
+
}
|
|
284
|
+
catch {
|
|
285
|
+
return;
|
|
286
|
+
}
|
|
287
|
+
if (stat.isFile() && abs.endsWith('.json')) {
|
|
288
|
+
try {
|
|
289
|
+
const raw = fs.readFileSync(abs, 'utf-8');
|
|
290
|
+
const rel = path.relative(absRoot, abs).replace(/\\/g, '/');
|
|
291
|
+
extractEntitiesFrom(rel, raw, out);
|
|
292
|
+
}
|
|
293
|
+
catch { /* skip */ }
|
|
294
|
+
}
|
|
295
|
+
else if (stat.isDirectory()) {
|
|
296
|
+
for (const entry of fs.readdirSync(abs)) {
|
|
297
|
+
if (entry.startsWith('.'))
|
|
298
|
+
continue;
|
|
299
|
+
walkBrain(absRoot, path.join(abs, entry), out, depth + 1);
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
function extractEntitiesFrom(rel, raw, out) {
|
|
304
|
+
try {
|
|
305
|
+
const parsed = JSON.parse(raw);
|
|
306
|
+
// Common shapes: { entries: [...] }, { memories: [...] }, [...]
|
|
307
|
+
const candidates = Array.isArray(parsed) ? parsed :
|
|
308
|
+
Array.isArray(parsed.entries) ? parsed.entries :
|
|
309
|
+
Array.isArray(parsed.memories) ? parsed.memories :
|
|
310
|
+
Array.isArray(parsed.items) ? parsed.items :
|
|
311
|
+
[];
|
|
312
|
+
for (const c of candidates) {
|
|
313
|
+
if (!c || typeof c !== 'object')
|
|
314
|
+
continue;
|
|
315
|
+
const rec = c;
|
|
316
|
+
const id = String(rec.id ?? rec.key ?? `${rel}:${out.length}`);
|
|
317
|
+
const content = String(rec.content ?? rec.text ?? rec.body ?? rec.summary ?? '').slice(0, 1200);
|
|
318
|
+
if (!content)
|
|
319
|
+
continue;
|
|
320
|
+
out.push({
|
|
321
|
+
id,
|
|
322
|
+
category: typeof rec.category === 'string' ? rec.category : (typeof rec.type === 'string' ? rec.type : undefined),
|
|
323
|
+
content,
|
|
324
|
+
importance: typeof rec.importance === 'number' ? rec.importance : undefined,
|
|
325
|
+
vector: Array.isArray(rec.vector) ? rec.vector : undefined,
|
|
326
|
+
metadata: typeof rec.metadata === 'object' && rec.metadata ? rec.metadata : undefined,
|
|
327
|
+
});
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
catch { /* skip non-JSON */ }
|
|
331
|
+
}
|
|
332
|
+
function coerceSnapshot(raw, source) {
|
|
333
|
+
if (!raw || typeof raw !== 'object')
|
|
334
|
+
return { label: path.basename(source), entities: [], source };
|
|
335
|
+
const rec = raw;
|
|
336
|
+
if (Array.isArray(rec.entities)) {
|
|
337
|
+
return { label: typeof rec.label === 'string' ? rec.label : path.basename(source), entities: rec.entities, source };
|
|
338
|
+
}
|
|
339
|
+
const entities = [];
|
|
340
|
+
extractEntitiesFrom(source, JSON.stringify(raw), entities);
|
|
341
|
+
return { label: path.basename(source), entities, source };
|
|
342
|
+
}
|
|
343
|
+
// ── Vector / similarity helpers ──
|
|
344
|
+
async function ensureVector(e) {
|
|
345
|
+
if (e.vector && e.vector.length)
|
|
346
|
+
return e.vector;
|
|
347
|
+
// Try embeddings module dynamically. Defensive: fall back to local hash if not loaded.
|
|
348
|
+
try {
|
|
349
|
+
const mod = await import('./embeddings.js').catch(() => null);
|
|
350
|
+
if (mod && typeof mod.getEmbeddings === 'function') {
|
|
351
|
+
const emb = mod.getEmbeddings();
|
|
352
|
+
const v = await emb.embed(e.content);
|
|
353
|
+
if (Array.isArray(v) && v.length) {
|
|
354
|
+
e.vector = v;
|
|
355
|
+
return v;
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
catch { /* fall through */ }
|
|
360
|
+
// Local hash vector as last resort — keeps cosine math meaningful.
|
|
361
|
+
e.vector = hashVector(e.content, 128);
|
|
362
|
+
return e.vector;
|
|
363
|
+
}
|
|
364
|
+
function hashVector(text, dim) {
|
|
365
|
+
const v = new Array(dim).fill(0);
|
|
366
|
+
const norm = text.toLowerCase().replace(/[^a-z0-9\s]/g, ' ');
|
|
367
|
+
const tokens = norm.split(/\s+/).filter(t => t.length > 1);
|
|
368
|
+
for (const t of tokens) {
|
|
369
|
+
let h = 2166136261;
|
|
370
|
+
for (let i = 0; i < t.length; i++)
|
|
371
|
+
h = Math.imul(h ^ t.charCodeAt(i), 16777619);
|
|
372
|
+
v[(h >>> 0) % dim] += 1;
|
|
373
|
+
}
|
|
374
|
+
let n = 0;
|
|
375
|
+
for (const x of v)
|
|
376
|
+
n += x * x;
|
|
377
|
+
n = Math.sqrt(n) || 1;
|
|
378
|
+
for (let i = 0; i < dim; i++)
|
|
379
|
+
v[i] = v[i] / n;
|
|
380
|
+
return v;
|
|
381
|
+
}
|
|
382
|
+
function contentSimilarity(a, b) {
|
|
383
|
+
// Jaccard on token sets — fast fallback.
|
|
384
|
+
const sa = new Set(a.toLowerCase().split(/\s+/).filter(t => t.length > 2));
|
|
385
|
+
const sb = new Set(b.toLowerCase().split(/\s+/).filter(t => t.length > 2));
|
|
386
|
+
if (sa.size === 0 && sb.size === 0)
|
|
387
|
+
return 1;
|
|
388
|
+
let inter = 0;
|
|
389
|
+
for (const t of sa)
|
|
390
|
+
if (sb.has(t))
|
|
391
|
+
inter++;
|
|
392
|
+
return inter / (sa.size + sb.size - inter || 1);
|
|
393
|
+
}
|
|
394
|
+
function sameContent(a, b) {
|
|
395
|
+
return a.content === b.content && (a.category ?? '') === (b.category ?? '');
|
|
396
|
+
}
|
|
397
|
+
function indexBy(items, keyFn) {
|
|
398
|
+
const m = new Map();
|
|
399
|
+
for (const it of items)
|
|
400
|
+
m.set(keyFn(it), it);
|
|
401
|
+
return m;
|
|
402
|
+
}
|
|
403
|
+
function topCategories(entities) {
|
|
404
|
+
const counts = new Map();
|
|
405
|
+
for (const e of entities) {
|
|
406
|
+
const c = e.category ?? 'general';
|
|
407
|
+
counts.set(c, (counts.get(c) ?? 0) + 1);
|
|
408
|
+
}
|
|
409
|
+
return Array.from(counts.entries()).map(([category, count]) => ({ category, count })).sort((a, b) => b.count - a.count).slice(0, 3);
|
|
410
|
+
}
|
|
411
|
+
function describeTop(top) {
|
|
412
|
+
if (top.length === 0)
|
|
413
|
+
return 'general topics';
|
|
414
|
+
if (top.length === 1)
|
|
415
|
+
return `${top[0].category} (${top[0].count})`;
|
|
416
|
+
return `${top[0].category} (${top[0].count})`;
|
|
417
|
+
}
|
|
418
|
+
function topEntities(entities, k) {
|
|
419
|
+
return [...entities]
|
|
420
|
+
.sort((a, b) => (b.importance ?? 0.5) - (a.importance ?? 0.5) || b.content.length - a.content.length)
|
|
421
|
+
.slice(0, k);
|
|
422
|
+
}
|
|
423
|
+
function shortLabel(e) {
|
|
424
|
+
const cat = e.category ? `[${e.category}] ` : '';
|
|
425
|
+
const body = e.content.replace(/\s+/g, ' ').trim();
|
|
426
|
+
const label = cat + (body.length > 36 ? body.slice(0, 35) + '…' : body);
|
|
427
|
+
return label.slice(0, 44);
|
|
428
|
+
}
|
|
429
|
+
function escapeXml(s) {
|
|
430
|
+
return s.replace(/[<>&"']/g, c => ({ '<': '<', '>': '>', '&': '&', '"': '"', "'": ''' }[c]));
|
|
431
|
+
}
|
|
432
|
+
let _instance = null;
|
|
433
|
+
export function getBrainDiff() {
|
|
434
|
+
if (!_instance)
|
|
435
|
+
_instance = new BrainDiff();
|
|
436
|
+
return _instance;
|
|
437
|
+
}
|
|
438
|
+
export function resetBrainDiffForTests() { _instance = null; }
|
|
439
|
+
//# sourceMappingURL=brain-diff.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"brain-diff.js","sourceRoot":"","sources":["../../src/brain/brain-diff.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { GlobalBrain } from './global-brain.js';
|
|
2
|
+
import { BrainReplay } from './brain-replay.js';
|
|
3
|
+
export interface BrainDnaStats {
|
|
4
|
+
topEntities: string[];
|
|
5
|
+
dominantPatterns: string[];
|
|
6
|
+
agentContributions: Array<{
|
|
7
|
+
agent: string;
|
|
8
|
+
count: number;
|
|
9
|
+
}>;
|
|
10
|
+
totalMemories: number;
|
|
11
|
+
totalEntities: number;
|
|
12
|
+
ageDays: number;
|
|
13
|
+
topLanguages: string[];
|
|
14
|
+
hallucinationsCaught: number;
|
|
15
|
+
archetype: ArchetypeName;
|
|
16
|
+
archetypeTagline: string;
|
|
17
|
+
cacheHitRate?: number;
|
|
18
|
+
decisionsRecorded: number;
|
|
19
|
+
collisionsDetected: number;
|
|
20
|
+
}
|
|
21
|
+
export type ArchetypeName = 'The Debugger' | 'The Architect' | 'The Speedster' | 'The Scholar' | 'The Cartographer' | 'The Diplomat' | 'The Sentinel' | 'The Wanderer';
|
|
22
|
+
export interface ArchetypeDef {
|
|
23
|
+
name: ArchetypeName;
|
|
24
|
+
tagline: string;
|
|
25
|
+
accent: string;
|
|
26
|
+
glyph: string;
|
|
27
|
+
}
|
|
28
|
+
export declare class BrainDna {
|
|
29
|
+
private brain;
|
|
30
|
+
private replay;
|
|
31
|
+
constructor(brain?: GlobalBrain, replay?: BrainReplay);
|
|
32
|
+
/** Generate a DNA card for a project. Returns SVG string + computed stats. */
|
|
33
|
+
generate(project: string, opts?: {
|
|
34
|
+
style?: 'card' | 'poster' | 'banner';
|
|
35
|
+
}): {
|
|
36
|
+
svg: string;
|
|
37
|
+
stats: BrainDnaStats;
|
|
38
|
+
};
|
|
39
|
+
/** Side-by-side comparison of two projects. */
|
|
40
|
+
compareCards(projectA: string, projectB: string): {
|
|
41
|
+
svg: string;
|
|
42
|
+
};
|
|
43
|
+
/** Names of all defined archetypes. */
|
|
44
|
+
topArchetypes(): string[];
|
|
45
|
+
/** Compute the raw stats (no rendering). Public for tooling/tests. */
|
|
46
|
+
computeStats(project: string): BrainDnaStats;
|
|
47
|
+
private safeInit;
|
|
48
|
+
private resolveProjectId;
|
|
49
|
+
private pickArchetype;
|
|
50
|
+
private renderCard;
|
|
51
|
+
private renderBanner;
|
|
52
|
+
private renderPoster;
|
|
53
|
+
private composeSideBySide;
|
|
54
|
+
private metricGrid;
|
|
55
|
+
}
|
|
56
|
+
export declare function rasterizeToPng(_svg: string): Promise<Buffer | null>;
|
|
57
|
+
export declare function getBrainDna(): BrainDna;
|
|
58
|
+
export declare function resetBrainDnaForTests(): void;
|
|
59
|
+
//# sourceMappingURL=brain-dna.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"brain-dna.d.ts","sourceRoot":"","sources":["../../src/brain/brain-dna.ts"],"names":[],"mappings":"AAYA,OAAO,EAAE,WAAW,EAAkB,MAAM,mBAAmB,CAAC;AAChE,OAAO,EAAE,WAAW,EAA+B,MAAM,mBAAmB,CAAC;AAI7E,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,kBAAkB,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC5D,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,SAAS,EAAE,aAAa,CAAC;IACzB,gBAAgB,EAAE,MAAM,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,kBAAkB,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,MAAM,aAAa,GACrB,cAAc,GACd,eAAe,GACf,eAAe,GACf,aAAa,GACb,kBAAkB,GAClB,cAAc,GACd,cAAc,GACd,cAAc,CAAC;AAEnB,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,aAAa,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf;AAeD,qBAAa,QAAQ;IACnB,OAAO,CAAC,KAAK,CAAc;IAC3B,OAAO,CAAC,MAAM,CAAc;gBAEhB,KAAK,CAAC,EAAE,WAAW,EAAE,MAAM,CAAC,EAAE,WAAW;IAKrD,8EAA8E;IAC9E,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,GAAE;QAAE,KAAK,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,QAAQ,CAAA;KAAO,GAAG;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,aAAa,CAAA;KAAE;IAWrH,+CAA+C;IAC/C,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE;IAQjE,uCAAuC;IACvC,aAAa,IAAI,MAAM,EAAE;IAEzB,sEAAsE;IACtE,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,aAAa;IAgF5C,OAAO,CAAC,QAAQ;IAMhB,OAAO,CAAC,gBAAgB;IAIxB,OAAO,CAAC,aAAa;IAiBrB,OAAO,CAAC,UAAU;IA8DlB,OAAO,CAAC,YAAY;IAwBpB,OAAO,CAAC,YAAY;IA+BpB,OAAO,CAAC,iBAAiB;IAmBzB,OAAO,CAAC,UAAU;CAYnB;AAkBD,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAOzE;AAGD,wBAAgB,WAAW,IAAI,QAAQ,CAGtC;AACD,wBAAgB,qBAAqB,IAAI,IAAI,CAAsB"}
|