@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,405 @@
1
+ // src/brain/live-brain.ts - v6.0.3 live memory control layer
2
+ import * as fs from 'fs';
3
+ import * as path from 'path';
4
+ import { analyzeMemoryQuality, generateContextResumePack, } from './context-continuity.js';
5
+ import { GlobalBrain, getGlobalBrain } from './global-brain.js';
6
+ const DEFAULT_LIVE_QUERIES = [
7
+ 'current state next step blocker',
8
+ 'mistake rejected route do not repeat',
9
+ 'source backed lesson verified evidence',
10
+ 'agent handoff resume context continuity',
11
+ 'tool command workflow successful fix',
12
+ 'memory quality stale duplicate source',
13
+ ];
14
+ const DEFAULT_SYSTEM_PROMPT = [
15
+ 'You are using Shadow Brain memory.',
16
+ 'Answer from source-backed project memory when possible.',
17
+ 'Mention uncertainty when a memory has no source, is stale, or conflicts with visible project files.',
18
+ 'Do not invent missing facts.',
19
+ ].join(' ');
20
+ function metadataList(entry, key) {
21
+ const value = entry.metadata?.[key];
22
+ return Array.isArray(value) ? value.map(String).filter(Boolean) : [];
23
+ }
24
+ function entryText(entry) {
25
+ return [
26
+ entry.projectName,
27
+ entry.agentTool,
28
+ entry.category,
29
+ entry.content,
30
+ JSON.stringify(entry.metadata ?? {}),
31
+ ].join(' ').toLowerCase();
32
+ }
33
+ function normalizeTerms(query) {
34
+ const stop = new Set([
35
+ 'a', 'an', 'and', 'are', 'as', 'at', 'be', 'by', 'for', 'from', 'in', 'into',
36
+ 'is', 'it', 'of', 'on', 'or', 'that', 'the', 'to', 'with',
37
+ ]);
38
+ return query
39
+ .toLowerCase()
40
+ .split(/[^a-z0-9_.:-]+/)
41
+ .map(term => term.trim())
42
+ .filter(term => term.length > 2 && !stop.has(term));
43
+ }
44
+ export function scoreLiveMemory(entry, now = new Date()) {
45
+ const sources = metadataList(entry, 'sources');
46
+ const tags = metadataList(entry, 'tags');
47
+ const ageDays = (now.getTime() - new Date(entry.createdAt).getTime()) / 86400000;
48
+ const contentLength = String(entry.content ?? '').trim().length;
49
+ let score = 30;
50
+ if (contentLength >= 120)
51
+ score += 18;
52
+ else if (contentLength >= 60)
53
+ score += 10;
54
+ if (sources.length)
55
+ score += 25;
56
+ if (tags.length)
57
+ score += 8;
58
+ if (entry.category.includes('.'))
59
+ score += 5;
60
+ score += Math.min(10, Math.round(entry.importance * 10));
61
+ score += Math.min(6, Math.log2((entry.accessCount ?? 0) + 1) * 2);
62
+ if (ageDays > 30)
63
+ score -= 10;
64
+ if (ageDays > 90)
65
+ score -= 15;
66
+ return Math.max(0, Math.min(100, Math.round(score)));
67
+ }
68
+ function enrich(entry, now = new Date()) {
69
+ return {
70
+ ...entry,
71
+ qualityScore: scoreLiveMemory(entry, now),
72
+ sources: metadataList(entry, 'sources'),
73
+ tags: metadataList(entry, 'tags'),
74
+ };
75
+ }
76
+ function countBy(items) {
77
+ const counts = new Map();
78
+ for (const item of items)
79
+ counts.set(item, (counts.get(item) ?? 0) + 1);
80
+ return Array.from(counts.entries())
81
+ .sort((a, b) => b[1] - a[1] || a[0].localeCompare(b[0]))
82
+ .map(([key, count]) => ({ key, count }));
83
+ }
84
+ export function rankMemoryEntries(entries, query, limit = 8, now = new Date()) {
85
+ const terms = normalizeTerms(query);
86
+ const ranked = entries.map(entry => {
87
+ const haystack = entryText(entry);
88
+ let score = scoreLiveMemory(entry, now) / 100;
89
+ for (const term of terms) {
90
+ if (entry.category.toLowerCase().includes(term))
91
+ score += 5;
92
+ if (String(entry.content).toLowerCase().includes(term))
93
+ score += 3;
94
+ if (JSON.stringify(entry.metadata ?? {}).toLowerCase().includes(term))
95
+ score += 1.5;
96
+ if (haystack.includes(term))
97
+ score += 0.5;
98
+ }
99
+ return { ...entry, score };
100
+ });
101
+ return ranked
102
+ .filter(entry => terms.length === 0 || entry.score > scoreLiveMemory(entry, now) / 100)
103
+ .sort((a, b) => b.score - a.score || b.importance - a.importance)
104
+ .slice(0, limit);
105
+ }
106
+ export function evaluateRecallSnapshot(entries, queries = DEFAULT_LIVE_QUERIES, limit = 5, now = new Date()) {
107
+ const cases = queries.map(query => {
108
+ const hits = rankMemoryEntries(entries, query, limit, now);
109
+ const sourceBackedHits = hits.filter(hit => metadataList(hit, 'sources').length > 0).length;
110
+ const warnings = [];
111
+ if (!hits.length)
112
+ warnings.push('No memory matched this query.');
113
+ if (hits.length && sourceBackedHits === 0)
114
+ warnings.push('Hits exist, but none include source paths.');
115
+ return {
116
+ query,
117
+ hitCount: hits.length,
118
+ sourceBackedHits,
119
+ topIds: hits.map(hit => hit.id),
120
+ topCategories: Array.from(new Set(hits.map(hit => hit.category))).slice(0, 4),
121
+ warnings,
122
+ };
123
+ });
124
+ const totalHits = cases.reduce((sum, item) => sum + item.hitCount, 0);
125
+ const sourceBackedHits = cases.reduce((sum, item) => sum + item.sourceBackedHits, 0);
126
+ return {
127
+ generatedAt: now.toISOString(),
128
+ queryCount: cases.length,
129
+ avgHitCount: cases.length ? Number((totalHits / cases.length).toFixed(2)) : 0,
130
+ sourceBackedHitRate: totalHits ? Number((sourceBackedHits / totalHits).toFixed(3)) : 0,
131
+ cases,
132
+ };
133
+ }
134
+ function buildLearningActions(opts) {
135
+ const actions = [];
136
+ const project = JSON.stringify(opts.projectDir);
137
+ if (!opts.entries.length) {
138
+ actions.push({
139
+ priority: 'critical',
140
+ title: 'Seed the first project memories',
141
+ reason: 'The live brain has no project-scoped entries, so agents cannot resume complex work from memory.',
142
+ command: `shadow-brain resume-seed ${project}`,
143
+ });
144
+ }
145
+ if (!opts.projectScoped && opts.entries.length) {
146
+ actions.push({
147
+ priority: 'high',
148
+ title: 'Create project-scoped memories',
149
+ reason: 'The report is using global fallback memory. Project isolation will be weak until this project records its own lessons.',
150
+ command: `shadow-brain timeline ${project}`,
151
+ });
152
+ }
153
+ if (opts.quality.sourceCoverage < 0.7 && opts.entries.length > 0) {
154
+ actions.push({
155
+ priority: 'high',
156
+ title: 'Backfill evidence sources',
157
+ reason: 'Agents trust and reuse memories better when each durable lesson points to docs, logs, commits, or proof files.',
158
+ command: `shadow-brain live-brain status ${project} --json`,
159
+ });
160
+ }
161
+ if (opts.quality.stale > 0) {
162
+ actions.push({
163
+ priority: 'medium',
164
+ title: 'Verify stale memories',
165
+ reason: `${opts.quality.stale} memories are older than 30 days. They should be checked against current files before agents rely on them.`,
166
+ command: `shadow-brain live-brain brief ${project}`,
167
+ });
168
+ }
169
+ if (opts.quality.duplicates.length) {
170
+ actions.push({
171
+ priority: 'medium',
172
+ title: 'Merge duplicate memory clusters',
173
+ reason: `${opts.quality.duplicates.length} possible duplicate clusters can pollute recall ranking and agent context.`,
174
+ command: `shadow-brain live-brain hygiene ${project}`,
175
+ });
176
+ }
177
+ if (opts.recallEval.avgHitCount < 2 && opts.entries.length > 3) {
178
+ actions.push({
179
+ priority: 'medium',
180
+ title: 'Improve recall keywords and categories',
181
+ reason: 'The default recall eval returns too few hits. Add clearer categories, tags, and action words to durable memories.',
182
+ command: `shadow-brain live-brain eval ${project}`,
183
+ });
184
+ }
185
+ if (opts.agentCount < 2) {
186
+ actions.push({
187
+ priority: 'low',
188
+ title: 'Connect more agents deliberately',
189
+ reason: 'Only one agent has written useful memory. Cross-agent learning improves when Codex, Claude Code, Cursor, or other tools share source-backed lessons.',
190
+ command: `shadow-brain audit-hooks ${project}`,
191
+ });
192
+ }
193
+ if (opts.sourceDocCount === 0) {
194
+ actions.push({
195
+ priority: 'low',
196
+ title: 'Add visible source-of-truth docs',
197
+ reason: 'Resume packs are strongest when the project has README, AGENTS.md, progress docs, or verification logs to quote.',
198
+ });
199
+ }
200
+ return actions;
201
+ }
202
+ export function buildTrainingRows(entries, opts = {}, now = new Date()) {
203
+ const maxRows = opts.maxRows ?? 200;
204
+ const rows = entries
205
+ .map(entry => enrich(entry, now))
206
+ .filter(entry => opts.includeLowQuality || entry.qualityScore >= 55)
207
+ .sort((a, b) => b.qualityScore - a.qualityScore || b.importance - a.importance)
208
+ .slice(0, maxRows)
209
+ .map(entry => {
210
+ const sources = entry.sources.length ? entry.sources.join('; ') : 'No source path recorded.';
211
+ const tags = entry.tags.length ? entry.tags.join(', ') : 'none';
212
+ return {
213
+ messages: [
214
+ { role: 'system', content: opts.systemPrompt ?? DEFAULT_SYSTEM_PROMPT },
215
+ {
216
+ role: 'user',
217
+ content: `Project: ${entry.projectName}\nCategory: ${entry.category}\nTask: Recall the durable lesson this agent should use before similar work.`,
218
+ },
219
+ {
220
+ role: 'assistant',
221
+ content: `${entry.content}\n\nSources: ${sources}\nTags: ${tags}\nQuality score: ${entry.qualityScore}/100`,
222
+ },
223
+ ],
224
+ metadata: {
225
+ memoryId: entry.id,
226
+ projectId: entry.projectId,
227
+ projectName: entry.projectName,
228
+ agentTool: entry.agentTool,
229
+ category: entry.category,
230
+ importance: entry.importance,
231
+ sources: entry.sources,
232
+ tags: entry.tags,
233
+ qualityScore: entry.qualityScore,
234
+ },
235
+ };
236
+ });
237
+ return rows;
238
+ }
239
+ export function buildTrainingJsonl(entries, opts = {}, now = new Date()) {
240
+ return buildTrainingRows(entries, opts, now).map(row => JSON.stringify(row)).join('\n');
241
+ }
242
+ export function formatLiveBrainBriefing(report) {
243
+ const actions = report.learningActions.length
244
+ ? report.learningActions.map(action => `- [${action.priority}] ${action.title}: ${action.reason}${action.command ? `\n Command: ${action.command}` : ''}`).join('\n')
245
+ : '- No immediate hygiene actions. Continue recording compact, source-backed lessons.';
246
+ const topMemories = report.topMemories.length
247
+ ? report.topMemories.slice(0, 8).map(memory => {
248
+ const sources = memory.sources.length ? `\n Sources: ${memory.sources.join('; ')}` : '\n Sources: none recorded';
249
+ return `- ${memory.category} (${memory.agentTool}, score ${memory.qualityScore}/100)\n ${memory.content.slice(0, 700)}${sources}`;
250
+ }).join('\n')
251
+ : '- No memories available yet.';
252
+ const warnings = [
253
+ ...report.resumePack.warnings,
254
+ ...report.memoryQuality.warnings,
255
+ ...report.recallEval.cases.flatMap(item => item.warnings.map(warning => `${item.query}: ${warning}`)),
256
+ ];
257
+ const warningText = warnings.length ? Array.from(new Set(warnings)).map(w => `- ${w}`).join('\n') : '- None.';
258
+ return [
259
+ '# Shadow Brain Live Agent Briefing',
260
+ '',
261
+ `Generated: ${report.generatedAt}`,
262
+ `Project: ${report.projectName}`,
263
+ `Path: ${report.projectDir}`,
264
+ '',
265
+ '## Rules For Agents',
266
+ '',
267
+ '- Treat visible project files as source of truth when they conflict with memory.',
268
+ '- Prefer source-backed memories over agent-inferred memories.',
269
+ '- Do not store secrets, tokens, passwords, private keys, or raw credentials.',
270
+ '- Record only durable lessons, current blockers, proven commands, and verified decisions.',
271
+ '- Keep memory compact: one reusable lesson per memory.',
272
+ '',
273
+ '## Live Brain Health',
274
+ '',
275
+ `- Memories: ${report.memoryQuality.totalEntries}`,
276
+ `- Average quality score: ${report.memoryQuality.avgScore}/100`,
277
+ `- Source coverage: ${Math.round(report.memoryQuality.sourceCoverage * 100)}%`,
278
+ `- Stale memories: ${report.memoryQuality.stale}`,
279
+ `- Duplicate clusters: ${report.memoryQuality.duplicates.length}`,
280
+ `- Recall eval avg hits: ${report.recallEval.avgHitCount}`,
281
+ '',
282
+ '## Actions',
283
+ '',
284
+ actions,
285
+ '',
286
+ '## Top Memories',
287
+ '',
288
+ topMemories,
289
+ '',
290
+ '## Warnings',
291
+ '',
292
+ warningText,
293
+ '',
294
+ '## Useful Commands',
295
+ '',
296
+ `- shadow-brain live-brain status ${JSON.stringify(report.projectDir)}`,
297
+ `- shadow-brain live-brain brief ${JSON.stringify(report.projectDir)}`,
298
+ `- shadow-brain live-brain eval ${JSON.stringify(report.projectDir)}`,
299
+ `- shadow-brain live-brain train-pack ${JSON.stringify(report.projectDir)} --out shadow-brain-training.jsonl`,
300
+ `- shadow-brain global recall --query "current blocker next step" --json --limit 8`,
301
+ ].join('\n');
302
+ }
303
+ export function analyzeLiveBrainSnapshot(opts) {
304
+ const now = opts.now ?? new Date();
305
+ const maxMemories = opts.maxMemories ?? 12;
306
+ const projectExists = fs.existsSync(opts.projectDir);
307
+ const quality = analyzeMemoryQuality(opts.entries, now);
308
+ const enriched = opts.entries
309
+ .map(entry => enrich(entry, now))
310
+ .sort((a, b) => b.qualityScore - a.qualityScore || b.importance - a.importance);
311
+ const recallEval = evaluateRecallSnapshot(opts.entries, opts.queries ?? DEFAULT_LIVE_QUERIES, 5, now);
312
+ const resumePack = generateContextResumePack({
313
+ projectDir: opts.projectDir,
314
+ projectName: opts.projectName,
315
+ projectId: opts.projectId,
316
+ entries: opts.entries,
317
+ maxMemories,
318
+ now,
319
+ });
320
+ const agentCoverage = countBy(opts.entries.map(entry => entry.agentTool))
321
+ .map(({ key, count }) => ({ agent: key, count }));
322
+ const categoryCoverage = countBy(opts.entries.map(entry => entry.category))
323
+ .map(({ key, count }) => ({ category: key, count }));
324
+ const sourceDocCount = resumePack.stats.docCount;
325
+ const staleCutoff = now.getTime() - 30 * 86400000;
326
+ const staleMemories = enriched.filter(entry => new Date(entry.createdAt).getTime() < staleCutoff).slice(0, 12);
327
+ const lowQualityMemories = enriched.filter(entry => entry.qualityScore < 55).slice(0, 12);
328
+ const learningActions = buildLearningActions({
329
+ projectDir: opts.projectDir,
330
+ entries: opts.entries,
331
+ quality,
332
+ recallEval,
333
+ agentCount: agentCoverage.length,
334
+ sourceDocCount,
335
+ projectScoped: opts.projectScoped ?? true,
336
+ });
337
+ const reportBase = {
338
+ generatedAt: now.toISOString(),
339
+ projectDir: path.resolve(opts.projectDir),
340
+ projectName: opts.projectName,
341
+ projectId: opts.projectId,
342
+ projectExists,
343
+ projectScoped: opts.projectScoped ?? true,
344
+ stats: opts.stats ?? {},
345
+ memoryQuality: quality,
346
+ agentCoverage,
347
+ categoryCoverage,
348
+ topMemories: enriched.slice(0, maxMemories),
349
+ staleMemories,
350
+ lowQualityMemories,
351
+ recallEval,
352
+ learningActions,
353
+ resumePack,
354
+ };
355
+ return {
356
+ ...reportBase,
357
+ agentBriefing: formatLiveBrainBriefing(reportBase),
358
+ };
359
+ }
360
+ export class LiveBrain {
361
+ constructor(brain = getGlobalBrain()) {
362
+ this.brain = brain;
363
+ }
364
+ async report(opts) {
365
+ const projectDir = path.resolve(opts.projectDir);
366
+ const projectId = GlobalBrain.projectIdFor(projectDir);
367
+ const maxMemories = opts.maxMemories ?? 12;
368
+ await this.brain.init();
369
+ try {
370
+ let entries = this.brain.recall({ projectId, minImportance: 0, limit: 800 });
371
+ let projectScoped = true;
372
+ if (!entries.length && opts.globalFallback !== false) {
373
+ entries = this.brain.recall({ minImportance: 0, limit: 800 });
374
+ projectScoped = false;
375
+ }
376
+ return analyzeLiveBrainSnapshot({
377
+ projectDir,
378
+ projectName: opts.projectName ?? path.basename(projectDir),
379
+ projectId,
380
+ projectScoped,
381
+ entries,
382
+ stats: this.brain.getStats(),
383
+ queries: opts.queries,
384
+ maxMemories,
385
+ });
386
+ }
387
+ finally {
388
+ await this.brain.shutdown();
389
+ }
390
+ }
391
+ async trainingJsonl(opts) {
392
+ const report = await this.report(opts);
393
+ const entries = [
394
+ ...report.topMemories,
395
+ ...report.staleMemories,
396
+ ...report.lowQualityMemories,
397
+ ];
398
+ const byId = new Map(entries.map(entry => [entry.id, entry]));
399
+ return buildTrainingJsonl(Array.from(byId.values()), opts);
400
+ }
401
+ }
402
+ export function getLiveBrain(brain) {
403
+ return new LiveBrain(brain);
404
+ }
405
+ //# sourceMappingURL=live-brain.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"live-brain.js","sourceRoot":"","sources":["../../src/brain/live-brain.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ export type Section = 'memories' | 'patterns' | 'decisions' | 'entities' | 'rules';
2
+ export interface BrainEntity {
3
+ id: string;
4
+ type?: string;
5
+ created?: string;
6
+ importance?: number;
7
+ content?: string;
8
+ [k: string]: unknown;
9
+ }
10
+ export interface ExportResult {
11
+ path: string;
12
+ sizeBytes: number;
13
+ sectionCounts: Record<Section, number>;
14
+ }
15
+ export interface ImportResult {
16
+ added: number;
17
+ modified: number;
18
+ skipped: number;
19
+ errors: string[];
20
+ }
21
+ export interface DiffResult {
22
+ willAdd: string[];
23
+ willModify: string[];
24
+ willSkip: string[];
25
+ }
26
+ export declare class MarkdownExport {
27
+ /** Export selected brain sections to a single .shadow-brain.md file. */
28
+ exportBrain(project: string, opts?: {
29
+ sections?: Section[];
30
+ outPath?: string;
31
+ }): Promise<ExportResult>;
32
+ /** Parse a .shadow-brain.md and write entities back into the brain store. */
33
+ importBrain(mdPath: string, opts?: {
34
+ merge?: 'replace' | 'addNew' | 'overwrite';
35
+ }): Promise<ImportResult>;
36
+ /** Preview what an import will do, without writing anything. */
37
+ diff(mdPath: string): Promise<DiffResult>;
38
+ private renderMarkdown;
39
+ private parseMarkdown;
40
+ private parseEntities;
41
+ private loadSection;
42
+ private readEntity;
43
+ private writeEntity;
44
+ private clearSection;
45
+ }
46
+ export declare function getMarkdownExport(): MarkdownExport;
47
+ export declare function resetMarkdownExportForTests(): void;
48
+ //# sourceMappingURL=markdown-export.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown-export.d.ts","sourceRoot":"","sources":["../../src/brain/markdown-export.ts"],"names":[],"mappings":"AAeA,MAAM,MAAM,OAAO,GAAG,UAAU,GAAG,UAAU,GAAG,WAAW,GAAG,UAAU,GAAG,OAAO,CAAC;AAmBnF,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;CACxC;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,qBAAa,cAAc;IACzB,wEAAwE;IAClE,WAAW,CACf,OAAO,EAAE,MAAM,EACf,IAAI,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAChD,OAAO,CAAC,YAAY,CAAC;IAqCxB,6EAA6E;IACvE,WAAW,CACf,MAAM,EAAE,MAAM,EACd,IAAI,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,SAAS,GAAG,QAAQ,GAAG,WAAW,CAAA;KAAE,GACpD,OAAO,CAAC,YAAY,CAAC;IAuCxB,gEAAgE;IAC1D,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAsB/C,OAAO,CAAC,cAAc;IAmCtB,OAAO,CAAC,aAAa;IAqCrB,OAAO,CAAC,aAAa;IA2BrB,OAAO,CAAC,WAAW;IAgBnB,OAAO,CAAC,UAAU;IAKlB,OAAO,CAAC,WAAW;IAanB,OAAO,CAAC,YAAY;CASrB;AAkFD,wBAAgB,iBAAiB,IAAI,cAAc,CAGlD;AACD,wBAAgB,2BAA2B,IAAI,IAAI,CAAsB"}