agent-knowledge 1.0.0

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 (130) hide show
  1. package/CHANGELOG.md +77 -0
  2. package/LICENSE +21 -0
  3. package/README.md +191 -0
  4. package/dist/dashboard.d.ts +4 -0
  5. package/dist/dashboard.d.ts.map +1 -0
  6. package/dist/dashboard.js +434 -0
  7. package/dist/dashboard.js.map +1 -0
  8. package/dist/embeddings/claude.d.ts +21 -0
  9. package/dist/embeddings/claude.d.ts.map +1 -0
  10. package/dist/embeddings/claude.js +84 -0
  11. package/dist/embeddings/claude.js.map +1 -0
  12. package/dist/embeddings/factory.d.ts +9 -0
  13. package/dist/embeddings/factory.d.ts.map +1 -0
  14. package/dist/embeddings/factory.js +60 -0
  15. package/dist/embeddings/factory.js.map +1 -0
  16. package/dist/embeddings/gemini.d.ts +21 -0
  17. package/dist/embeddings/gemini.d.ts.map +1 -0
  18. package/dist/embeddings/gemini.js +86 -0
  19. package/dist/embeddings/gemini.js.map +1 -0
  20. package/dist/embeddings/index.d.ts +4 -0
  21. package/dist/embeddings/index.d.ts.map +1 -0
  22. package/dist/embeddings/index.js +3 -0
  23. package/dist/embeddings/index.js.map +1 -0
  24. package/dist/embeddings/local.d.ts +20 -0
  25. package/dist/embeddings/local.d.ts.map +1 -0
  26. package/dist/embeddings/local.js +73 -0
  27. package/dist/embeddings/local.js.map +1 -0
  28. package/dist/embeddings/openai.d.ts +20 -0
  29. package/dist/embeddings/openai.d.ts.map +1 -0
  30. package/dist/embeddings/openai.js +84 -0
  31. package/dist/embeddings/openai.js.map +1 -0
  32. package/dist/embeddings/types.d.ts +39 -0
  33. package/dist/embeddings/types.d.ts.map +1 -0
  34. package/dist/embeddings/types.js +12 -0
  35. package/dist/embeddings/types.js.map +1 -0
  36. package/dist/index.d.ts +2 -0
  37. package/dist/index.d.ts.map +1 -0
  38. package/dist/index.js +18 -0
  39. package/dist/index.js.map +1 -0
  40. package/dist/knowledge/distill.d.ts +27 -0
  41. package/dist/knowledge/distill.d.ts.map +1 -0
  42. package/dist/knowledge/distill.js +407 -0
  43. package/dist/knowledge/distill.js.map +1 -0
  44. package/dist/knowledge/git.d.ts +30 -0
  45. package/dist/knowledge/git.d.ts.map +1 -0
  46. package/dist/knowledge/git.js +228 -0
  47. package/dist/knowledge/git.js.map +1 -0
  48. package/dist/knowledge/search.d.ts +20 -0
  49. package/dist/knowledge/search.d.ts.map +1 -0
  50. package/dist/knowledge/search.js +72 -0
  51. package/dist/knowledge/search.js.map +1 -0
  52. package/dist/knowledge/store.d.ts +47 -0
  53. package/dist/knowledge/store.d.ts.map +1 -0
  54. package/dist/knowledge/store.js +173 -0
  55. package/dist/knowledge/store.js.map +1 -0
  56. package/dist/search/excerpt.d.ts +12 -0
  57. package/dist/search/excerpt.d.ts.map +1 -0
  58. package/dist/search/excerpt.js +28 -0
  59. package/dist/search/excerpt.js.map +1 -0
  60. package/dist/search/fuzzy.d.ts +15 -0
  61. package/dist/search/fuzzy.d.ts.map +1 -0
  62. package/dist/search/fuzzy.js +81 -0
  63. package/dist/search/fuzzy.js.map +1 -0
  64. package/dist/search/tfidf.d.ts +19 -0
  65. package/dist/search/tfidf.d.ts.map +1 -0
  66. package/dist/search/tfidf.js +200 -0
  67. package/dist/search/tfidf.js.map +1 -0
  68. package/dist/search/types.d.ts +19 -0
  69. package/dist/search/types.d.ts.map +1 -0
  70. package/dist/search/types.js +2 -0
  71. package/dist/search/types.js.map +1 -0
  72. package/dist/server.d.ts +3 -0
  73. package/dist/server.d.ts.map +1 -0
  74. package/dist/server.js +518 -0
  75. package/dist/server.js.map +1 -0
  76. package/dist/sessions/indexer.d.ts +15 -0
  77. package/dist/sessions/indexer.d.ts.map +1 -0
  78. package/dist/sessions/indexer.js +182 -0
  79. package/dist/sessions/indexer.js.map +1 -0
  80. package/dist/sessions/parser.d.ts +58 -0
  81. package/dist/sessions/parser.d.ts.map +1 -0
  82. package/dist/sessions/parser.js +142 -0
  83. package/dist/sessions/parser.js.map +1 -0
  84. package/dist/sessions/scopes.d.ts +16 -0
  85. package/dist/sessions/scopes.d.ts.map +1 -0
  86. package/dist/sessions/scopes.js +153 -0
  87. package/dist/sessions/scopes.js.map +1 -0
  88. package/dist/sessions/search.d.ts +26 -0
  89. package/dist/sessions/search.d.ts.map +1 -0
  90. package/dist/sessions/search.js +256 -0
  91. package/dist/sessions/search.js.map +1 -0
  92. package/dist/sessions/summary.d.ts +28 -0
  93. package/dist/sessions/summary.d.ts.map +1 -0
  94. package/dist/sessions/summary.js +135 -0
  95. package/dist/sessions/summary.js.map +1 -0
  96. package/dist/types.d.ts +26 -0
  97. package/dist/types.d.ts.map +1 -0
  98. package/dist/types.js +109 -0
  99. package/dist/types.js.map +1 -0
  100. package/dist/ui/app.js +1029 -0
  101. package/dist/ui/index.html +373 -0
  102. package/dist/ui/styles.css +1508 -0
  103. package/dist/ui/ui/app.js +811 -0
  104. package/dist/ui/ui/index.html +300 -0
  105. package/dist/ui/ui/styles.css +1154 -0
  106. package/dist/validate.d.ts +21 -0
  107. package/dist/validate.d.ts.map +1 -0
  108. package/dist/validate.js +86 -0
  109. package/dist/validate.js.map +1 -0
  110. package/dist/vectorstore/chunker.d.ts +48 -0
  111. package/dist/vectorstore/chunker.d.ts.map +1 -0
  112. package/dist/vectorstore/chunker.js +165 -0
  113. package/dist/vectorstore/chunker.js.map +1 -0
  114. package/dist/vectorstore/index.d.ts +5 -0
  115. package/dist/vectorstore/index.d.ts.map +1 -0
  116. package/dist/vectorstore/index.js +3 -0
  117. package/dist/vectorstore/index.js.map +1 -0
  118. package/dist/vectorstore/store.d.ts +139 -0
  119. package/dist/vectorstore/store.d.ts.map +1 -0
  120. package/dist/vectorstore/store.js +500 -0
  121. package/dist/vectorstore/store.js.map +1 -0
  122. package/dist/version.d.ts +2 -0
  123. package/dist/version.d.ts.map +1 -0
  124. package/dist/version.js +2 -0
  125. package/dist/version.js.map +1 -0
  126. package/docs/ARCHITECTURE.md +244 -0
  127. package/docs/DASHBOARD.md +133 -0
  128. package/docs/SETUP.md +178 -0
  129. package/package.json +92 -0
  130. package/scripts/copy-ui.js +6 -0
@@ -0,0 +1,407 @@
1
+ import { readFileSync, writeFileSync, existsSync } from 'fs';
2
+ import { join } from 'path';
3
+ import { getProjectDirs, getSessionFiles, parseSessionFile, getSessionMeta, } from '../sessions/parser.js';
4
+ import { getSessionSummary } from '../sessions/summary.js';
5
+ import { listEntries, readEntry, writeEntry } from './store.js';
6
+ import { gitPull, gitPush } from './git.js';
7
+ import { getConfig } from '../types.js';
8
+ // ── Cursor tracking ─────────────────────────────────────────────────────────
9
+ function getCursorPath() {
10
+ const config = getConfig();
11
+ return join(config.claudeDir, '.knowledge-distill-cursor');
12
+ }
13
+ function getLastDistillTime() {
14
+ const cursorPath = getCursorPath();
15
+ if (!existsSync(cursorPath))
16
+ return null;
17
+ try {
18
+ return readFileSync(cursorPath, 'utf-8').trim() || null;
19
+ }
20
+ catch {
21
+ return null;
22
+ }
23
+ }
24
+ function setLastDistillTime(iso) {
25
+ writeFileSync(getCursorPath(), iso, 'utf-8');
26
+ }
27
+ // ── Secrets / sensitive data scrubbing ──────────────────────────────────────
28
+ const SECRET_PATTERNS = [
29
+ // API keys and tokens (common prefixes)
30
+ { pattern: /\b(sk-[a-zA-Z0-9]{20,})\b/g, replacement: '[REDACTED_API_KEY]' },
31
+ { pattern: /\b(ghp_[a-zA-Z0-9]{36,})\b/g, replacement: '[REDACTED_GITHUB_TOKEN]' },
32
+ { pattern: /\b(gho_[a-zA-Z0-9]{36,})\b/g, replacement: '[REDACTED_GITHUB_TOKEN]' },
33
+ { pattern: /\b(glpat-[a-zA-Z0-9_-]{20,})\b/g, replacement: '[REDACTED_GITLAB_TOKEN]' },
34
+ { pattern: /\b(xox[bsapr]-[a-zA-Z0-9-]{10,})\b/g, replacement: '[REDACTED_SLACK_TOKEN]' },
35
+ { pattern: /\b(AIza[a-zA-Z0-9_-]{35})\b/g, replacement: '[REDACTED_GOOGLE_KEY]' },
36
+ { pattern: /\b(AKIA[A-Z0-9]{16})\b/g, replacement: '[REDACTED_AWS_KEY]' },
37
+ {
38
+ pattern: /\b(eyJ[a-zA-Z0-9_-]{20,}\.[a-zA-Z0-9_-]{20,}\.[a-zA-Z0-9_-]{20,})\b/g,
39
+ replacement: '[REDACTED_JWT]',
40
+ },
41
+ // Generic key=value patterns
42
+ {
43
+ pattern: /(?:api[_-]?key|apikey|secret[_-]?key|access[_-]?token|auth[_-]?token|bearer|password|passwd|pwd)\s*[:=]\s*["']?([^\s"']{8,})["']?/gi,
44
+ replacement: '[REDACTED_CREDENTIAL]',
45
+ },
46
+ // Bearer tokens in headers
47
+ { pattern: /Bearer\s+[a-zA-Z0-9._\-+/=]{20,}/gi, replacement: 'Bearer [REDACTED]' },
48
+ // Connection strings with passwords
49
+ { pattern: /(:\/\/[^:]+:)[^@\s]{4,}(@)/g, replacement: '$1[REDACTED]$2' },
50
+ // Private key blocks
51
+ {
52
+ pattern: /-----BEGIN[A-Z ]*PRIVATE KEY-----[\s\S]*?-----END[A-Z ]*PRIVATE KEY-----/g,
53
+ replacement: '[REDACTED_PRIVATE_KEY]',
54
+ },
55
+ // .env style secrets
56
+ {
57
+ pattern: /^[A-Z_]*(SECRET|TOKEN|PASSWORD|KEY|CREDENTIAL)[A-Z_]*\s*=\s*\S+/gm,
58
+ replacement: '[REDACTED_ENV_VAR]',
59
+ },
60
+ // Base64-encoded blobs that look like secrets (long, no spaces)
61
+ { pattern: /\b[A-Za-z0-9+/]{64,}={0,2}\b/g, replacement: '[REDACTED_BASE64]' },
62
+ // Email addresses (privacy)
63
+ {
64
+ pattern: /\b[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}\b/g,
65
+ replacement: '[REDACTED_EMAIL]',
66
+ },
67
+ ];
68
+ // Content that should be stripped entirely (system noise, not secrets)
69
+ const NOISE_PATTERNS = [
70
+ /<system-reminder>[\s\S]*?<\/system-reminder>/g,
71
+ /<task-notification>[\s\S]*?<\/task-notification>/g,
72
+ /<command-name>[\s\S]*?<\/command-name>/g,
73
+ /<command-message>[\s\S]*?<\/command-message>/g,
74
+ /<command-args>[\s\S]*?<\/command-args>/g,
75
+ /<local-command-stdout>[\s\S]*?<\/local-command-stdout>/g,
76
+ /<local-command-caveat>[\s\S]*?<\/local-command-caveat>/g,
77
+ /<user-prompt-submit-hook>[\s\S]*?<\/user-prompt-submit-hook>/g,
78
+ /\btool_use_id\b[^}\n]*/g,
79
+ /\boutput-file[^<\n]*/g,
80
+ ];
81
+ /**
82
+ * Scrub secrets and system noise from text before it reaches git.
83
+ */
84
+ export function scrubContent(text) {
85
+ let result = text;
86
+ for (const pattern of NOISE_PATTERNS) {
87
+ result = result.replace(pattern, '');
88
+ }
89
+ // Redact secrets
90
+ for (const { pattern, replacement } of SECRET_PATTERNS) {
91
+ pattern.lastIndex = 0;
92
+ result = result.replace(pattern, replacement);
93
+ }
94
+ result = result.replace(/[A-Z]:[/\\]Users[/\\][^/\\\s]+[/\\]/gi, '~/');
95
+ result = result.replace(/\/home\/[^/\s]+\//g, '~/');
96
+ result = result.replace(/\n{3,}/g, '\n\n');
97
+ return result.trim();
98
+ }
99
+ /**
100
+ * Check if text contains potentially sensitive content that wasn't caught
101
+ * by pattern matching. Returns true if the text looks safe.
102
+ */
103
+ function isSafeContent(text) {
104
+ // Reject topics that are mostly XML/JSON/system garbage
105
+ if (text.startsWith('<') && text.includes('>'))
106
+ return false;
107
+ if (text.startsWith('{') || text.startsWith('[{'))
108
+ return false;
109
+ // Reject base64 image data
110
+ if (text.includes('base64') && text.includes('media_type'))
111
+ return false;
112
+ // Reject tool result JSON
113
+ if (text.includes('tool_use_id') || text.includes('tool_result'))
114
+ return false;
115
+ // Reject very short or very long content
116
+ if (text.length < 15)
117
+ return false;
118
+ if (text.length > 500)
119
+ return false;
120
+ // Must contain at least some alphabetic content
121
+ const alphaRatio = (text.match(/[a-zA-Z]/g) || []).length / text.length;
122
+ if (alphaRatio < 0.3)
123
+ return false;
124
+ return true;
125
+ }
126
+ // ── Project name normalization ──────────────────────────────────────────────
127
+ /**
128
+ * Normalize a Claude Code project directory name to a clean, readable
129
+ * project name suitable for the knowledge base.
130
+ *
131
+ * Input examples:
132
+ * "C--Users-Mathias--claude-mcp-servers-agent-comm--worktrees-review-security"
133
+ * "C--Users-Mathias-odoo19-odoo"
134
+ * "C--Users-Mathias--agent-comm-swarm-scale-test-3"
135
+ * "C--Users-Mathias--claude"
136
+ *
137
+ * Output:
138
+ * "agent-comm" (worktree merged with parent)
139
+ * "odoo19" (Windows path cleaned)
140
+ * "agent-comm" (swarm merged with parent)
141
+ * "claude-code-config" (special case for ~/.claude)
142
+ */
143
+ export function normalizeProjectName(raw) {
144
+ let name = raw;
145
+ // Strip Windows-style user prefix: C--Users-<Username>-- or C--Users-<Username>-
146
+ name = name.replace(/^C--Users-[^-]+-{1,2}/i, '');
147
+ // Strip leading dot (hidden dirs)
148
+ name = name.replace(/^\./, '');
149
+ // Handle worktrees: <project>--worktrees-<name> → <project>
150
+ // Also: <project>--claude-worktrees-<name> → <project>
151
+ name = name.replace(/--(?:claude-)?worktrees-[a-z0-9-]+$/i, '');
152
+ // Handle swarm sessions: <project>-swarm-<role>-<n> → <project>
153
+ name = name.replace(/-swarm-[a-z]+-(?:agent|review|scale-test|test|ui)-?\d*$/i, '');
154
+ name = name.replace(/-swarm-[a-z0-9-]+$/i, '');
155
+ // Known path-to-name mappings for common patterns
156
+ const pathMappings = [
157
+ // ~/.claude itself
158
+ [/^claude$/, 'claude-code-config'],
159
+ // MCP servers under ~/.claude
160
+ [/^claude-mcp-servers-(.+)$/, '$1'],
161
+ // Claude subprojects
162
+ [/^claude-(.+)$/, '$1'],
163
+ // Odoo paths: odoo19-odoo → odoo19, odoo16-env-odoo-customers-etron-onretail-odoo → onretail-odoo
164
+ [/^odoo(\d+)-.*?-odoo$/, 'odoo$1'],
165
+ [/^odoo(\d+)-odoo$/, 'odoo$1'],
166
+ // Generic: strip trailing -odoo suffix duplicate
167
+ [/^(.+?)-odoo-odoo$/, '$1-odoo'],
168
+ ];
169
+ for (const [pattern, replacement] of pathMappings) {
170
+ if (pattern.test(name)) {
171
+ name = name.replace(pattern, replacement);
172
+ break;
173
+ }
174
+ }
175
+ // Final cleanup
176
+ name = name
177
+ .toLowerCase()
178
+ .replace(/[^a-z0-9-]/g, '-')
179
+ .replace(/-+/g, '-')
180
+ .replace(/^-|-$/g, '');
181
+ return name || 'unknown';
182
+ }
183
+ /**
184
+ * Determine if a project should be skipped entirely.
185
+ * Short-lived swarm sessions, worktrees with only 1 session, etc.
186
+ */
187
+ function shouldSkipProject(name, sessionCount) {
188
+ // Skip if the session count is too low for a worktree/swarm
189
+ // (they'll be merged into the parent anyway)
190
+ // This is handled by normalization — duplicates merge.
191
+ // But skip truly empty results
192
+ if (sessionCount === 0)
193
+ return true;
194
+ return false;
195
+ }
196
+ function extractInsights(cutoff) {
197
+ const projects = getProjectDirs();
198
+ const raw = new Map();
199
+ for (const proj of projects) {
200
+ const sessions = getSessionFiles(proj.path);
201
+ for (const sess of sessions) {
202
+ try {
203
+ const entries = parseSessionFile(sess.file);
204
+ if (entries.length === 0)
205
+ continue;
206
+ const meta = getSessionMeta(entries);
207
+ if (meta.startTime === 'unknown')
208
+ continue;
209
+ if (cutoff && meta.startTime <= cutoff)
210
+ continue;
211
+ const summary = getSessionSummary(sess.id, proj.name);
212
+ if (!summary)
213
+ continue;
214
+ // Clean and filter topics
215
+ const humanTopics = summary.topics
216
+ .map((t) => scrubContent(t.content))
217
+ .filter((t) => isSafeContent(t));
218
+ if (humanTopics.length === 0 && summary.toolsUsed.length === 0)
219
+ continue;
220
+ // Normalize project name (merges worktrees/swarms into parent)
221
+ const normalized = normalizeProjectName(proj.name);
222
+ let pi = raw.get(normalized);
223
+ if (!pi) {
224
+ pi = { sessions: 0, topics: [], tools: new Set(), files: new Set(), latestDate: '' };
225
+ raw.set(normalized, pi);
226
+ }
227
+ pi.sessions++;
228
+ pi.topics.push(...humanTopics.slice(0, 5));
229
+ for (const t of summary.toolsUsed)
230
+ pi.tools.add(t);
231
+ // Scrub file paths — remove absolute user-specific prefixes
232
+ for (const f of summary.filesModified) {
233
+ const cleaned = f.replace(/^[A-Z]:[/\\]Users[/\\][^/\\]+[/\\]/i, '~/');
234
+ pi.files.add(cleaned);
235
+ }
236
+ if (meta.startTime > pi.latestDate)
237
+ pi.latestDate = meta.startTime;
238
+ }
239
+ catch {
240
+ continue;
241
+ }
242
+ }
243
+ }
244
+ // Filter out empty projects
245
+ const insights = new Map();
246
+ for (const [name, pi] of raw) {
247
+ if (!shouldSkipProject(name, pi.sessions)) {
248
+ insights.set(name, pi);
249
+ }
250
+ }
251
+ return insights;
252
+ }
253
+ // ── Knowledge base update ───────────────────────────────────────────────────
254
+ function buildActivitySection(pi) {
255
+ const lines = [];
256
+ lines.push(`## Recent Activity`);
257
+ lines.push('');
258
+ lines.push(`_Auto-distilled from ${pi.sessions} session(s), last updated ${pi.latestDate.split('T')[0]}_`);
259
+ lines.push('');
260
+ if (pi.topics.length > 0) {
261
+ lines.push('### Topics Discussed');
262
+ const unique = [...new Set(pi.topics)].slice(0, 15);
263
+ for (const topic of unique) {
264
+ const short = topic.length > 150 ? topic.slice(0, 150) + '...' : topic;
265
+ // Final scrub — defense in depth
266
+ const safe = scrubContent(short);
267
+ if (safe.length > 10) {
268
+ lines.push(`- ${safe}`);
269
+ }
270
+ }
271
+ lines.push('');
272
+ }
273
+ if (pi.tools.size > 0) {
274
+ lines.push('### Tools Used');
275
+ lines.push([...pi.tools].sort().join(', '));
276
+ lines.push('');
277
+ }
278
+ if (pi.files.size > 0) {
279
+ lines.push('### Files Touched');
280
+ const fileList = [...pi.files].sort().slice(0, 30);
281
+ for (const f of fileList) {
282
+ lines.push(`- \`${f}\``);
283
+ }
284
+ if (pi.files.size > 30) {
285
+ lines.push(`- _...and ${pi.files.size - 30} more_`);
286
+ }
287
+ lines.push('');
288
+ }
289
+ return lines.join('\n');
290
+ }
291
+ function mergeIntoEntry(existingContent, activitySection) {
292
+ const activityMarker = '## Recent Activity';
293
+ const idx = existingContent.indexOf(activityMarker);
294
+ if (idx >= 0) {
295
+ const nextH2 = existingContent.indexOf('\n## ', idx + activityMarker.length);
296
+ if (nextH2 >= 0) {
297
+ return existingContent.slice(0, idx) + activitySection + existingContent.slice(nextH2);
298
+ }
299
+ return existingContent.slice(0, idx) + activitySection;
300
+ }
301
+ return existingContent.trimEnd() + '\n\n' + activitySection;
302
+ }
303
+ // ── Pre-push safety check ───────────────────────────────────────────────────
304
+ /**
305
+ * Final safety scan of all content about to be written. Returns list of
306
+ * issues found. If non-empty, the write should be aborted.
307
+ */
308
+ function auditContent(content) {
309
+ const issues = [];
310
+ if (/\bsk-[a-zA-Z0-9]{20,}\b/.test(content))
311
+ issues.push('Possible API key (sk-...)');
312
+ if (/\bghp_[a-zA-Z0-9]{36,}\b/.test(content))
313
+ issues.push('Possible GitHub token');
314
+ if (/\bglpat-[a-zA-Z0-9_-]{20,}\b/.test(content))
315
+ issues.push('Possible GitLab token');
316
+ if (/-----BEGIN[A-Z ]*PRIVATE KEY-----/.test(content))
317
+ issues.push('Private key block detected');
318
+ if (/\bpassword\s*[:=]\s*\S{4,}/i.test(content))
319
+ issues.push('Possible password in plaintext');
320
+ if (/Bearer\s+[a-zA-Z0-9._\-+/=]{20,}/i.test(content))
321
+ issues.push('Possible bearer token');
322
+ return issues;
323
+ }
324
+ // ── Main distill entry point ────────────────────────────────────────────────
325
+ export async function distillSessions() {
326
+ const config = getConfig();
327
+ const cutoff = getLastDistillTime();
328
+ const insights = extractInsights(cutoff);
329
+ if (insights.size === 0) {
330
+ return { updated: [], created: [], skipped: [] };
331
+ }
332
+ await gitPull(config.memoryDir);
333
+ const updated = [];
334
+ const created = [];
335
+ const skipped = [];
336
+ let latestDate = cutoff ?? '';
337
+ const existingEntries = listEntries(config.memoryDir, 'projects');
338
+ const entryMap = new Map();
339
+ const entryMapNoDash = new Map();
340
+ for (const e of existingEntries) {
341
+ const name = e.path
342
+ .replace(/^projects\//, '')
343
+ .replace(/\.md$/, '')
344
+ .toLowerCase();
345
+ entryMap.set(name, e.path);
346
+ entryMapNoDash.set(name.replace(/-/g, ''), e.path);
347
+ }
348
+ for (const [normalizedName, pi] of insights) {
349
+ const activitySection = buildActivitySection(pi);
350
+ const issues = auditContent(activitySection);
351
+ if (issues.length > 0) {
352
+ console.error(`[knowledge] BLOCKED distill for "${normalizedName}": ${issues.join(', ')}`);
353
+ skipped.push(normalizedName);
354
+ if (pi.latestDate > latestDate)
355
+ latestDate = pi.latestDate;
356
+ continue;
357
+ }
358
+ const existingPath = entryMap.get(normalizedName) ?? entryMapNoDash.get(normalizedName.replace(/-/g, ''));
359
+ try {
360
+ if (existingPath) {
361
+ const { content } = readEntry(config.memoryDir, existingPath);
362
+ const merged = mergeIntoEntry(content, activitySection);
363
+ // Audit the merged result too
364
+ const mergedIssues = auditContent(merged);
365
+ if (mergedIssues.length > 0) {
366
+ console.error(`[knowledge] BLOCKED merge for "${normalizedName}": ${mergedIssues.join(', ')}`);
367
+ skipped.push(normalizedName);
368
+ continue;
369
+ }
370
+ const filename = existingPath.replace(/^projects\//, '');
371
+ writeEntry(config.memoryDir, 'projects', filename, merged);
372
+ updated.push(existingPath);
373
+ }
374
+ else {
375
+ const filename = `${normalizedName}.md`;
376
+ const content = [
377
+ '---',
378
+ `title: ${normalizedName}`,
379
+ `tags: [auto-distilled]`,
380
+ `updated: ${new Date().toISOString().split('T')[0]}`,
381
+ '---',
382
+ '',
383
+ `# ${normalizedName}`,
384
+ '',
385
+ activitySection,
386
+ ].join('\n');
387
+ writeEntry(config.memoryDir, 'projects', filename, content);
388
+ created.push(`projects/${filename}`);
389
+ }
390
+ }
391
+ catch (err) {
392
+ console.error(`[knowledge] Failed to distill project ${normalizedName}: ${err}`);
393
+ }
394
+ if (pi.latestDate > latestDate) {
395
+ latestDate = pi.latestDate;
396
+ }
397
+ }
398
+ if (updated.length > 0 || created.length > 0) {
399
+ const count = updated.length + created.length;
400
+ await gitPush(config.memoryDir, `distill: update ${count} project(s) from session insights`);
401
+ }
402
+ if (latestDate) {
403
+ setLastDistillTime(latestDate);
404
+ }
405
+ return { updated, created, skipped };
406
+ }
407
+ //# sourceMappingURL=distill.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"distill.js","sourceRoot":"","sources":["../../src/knowledge/distill.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ export interface GitResult {
2
+ success: boolean;
3
+ message: string;
4
+ }
5
+ /**
6
+ * Pull latest changes from remote with rebase.
7
+ */
8
+ export declare function gitPull(dir: string): Promise<GitResult>;
9
+ /**
10
+ * Stage all changes, commit if dirty, and push.
11
+ * Only commits when there are staged changes.
12
+ */
13
+ export declare function gitPush(dir: string, commitMsg?: string): Promise<GitResult>;
14
+ /**
15
+ * Pull then push — full bidirectional sync.
16
+ */
17
+ export declare function gitSync(dir: string): Promise<{
18
+ pull: GitResult;
19
+ push: GitResult;
20
+ }>;
21
+ /**
22
+ * Ensure the memory directory exists and is a git repo.
23
+ *
24
+ * - If dir missing + gitUrl set → clone, then scaffold missing files
25
+ * - If dir exists but not a git repo + gitUrl set → scaffold + init + push
26
+ * - If dir missing + no gitUrl → scaffold local-only dir
27
+ * - If dir exists + is a git repo → no-op
28
+ */
29
+ export declare function ensureRepo(dir: string, gitUrl?: string): GitResult;
30
+ //# sourceMappingURL=git.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../../src/knowledge/git.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACjB;AAsBD;;GAEG;AACH,wBAAsB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAO7D;AAED;;;GAGG;AACH,wBAAsB,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAmBjF;AAED;;GAEG;AACH,wBAAsB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,IAAI,EAAE,SAAS,CAAA;CAAE,CAAC,CAIxF;AAkHD;;;;;;;GAOG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAgDlE"}