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.
- package/CHANGELOG.md +77 -0
- package/LICENSE +21 -0
- package/README.md +191 -0
- package/dist/dashboard.d.ts +4 -0
- package/dist/dashboard.d.ts.map +1 -0
- package/dist/dashboard.js +434 -0
- package/dist/dashboard.js.map +1 -0
- package/dist/embeddings/claude.d.ts +21 -0
- package/dist/embeddings/claude.d.ts.map +1 -0
- package/dist/embeddings/claude.js +84 -0
- package/dist/embeddings/claude.js.map +1 -0
- package/dist/embeddings/factory.d.ts +9 -0
- package/dist/embeddings/factory.d.ts.map +1 -0
- package/dist/embeddings/factory.js +60 -0
- package/dist/embeddings/factory.js.map +1 -0
- package/dist/embeddings/gemini.d.ts +21 -0
- package/dist/embeddings/gemini.d.ts.map +1 -0
- package/dist/embeddings/gemini.js +86 -0
- package/dist/embeddings/gemini.js.map +1 -0
- package/dist/embeddings/index.d.ts +4 -0
- package/dist/embeddings/index.d.ts.map +1 -0
- package/dist/embeddings/index.js +3 -0
- package/dist/embeddings/index.js.map +1 -0
- package/dist/embeddings/local.d.ts +20 -0
- package/dist/embeddings/local.d.ts.map +1 -0
- package/dist/embeddings/local.js +73 -0
- package/dist/embeddings/local.js.map +1 -0
- package/dist/embeddings/openai.d.ts +20 -0
- package/dist/embeddings/openai.d.ts.map +1 -0
- package/dist/embeddings/openai.js +84 -0
- package/dist/embeddings/openai.js.map +1 -0
- package/dist/embeddings/types.d.ts +39 -0
- package/dist/embeddings/types.d.ts.map +1 -0
- package/dist/embeddings/types.js +12 -0
- package/dist/embeddings/types.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +18 -0
- package/dist/index.js.map +1 -0
- package/dist/knowledge/distill.d.ts +27 -0
- package/dist/knowledge/distill.d.ts.map +1 -0
- package/dist/knowledge/distill.js +407 -0
- package/dist/knowledge/distill.js.map +1 -0
- package/dist/knowledge/git.d.ts +30 -0
- package/dist/knowledge/git.d.ts.map +1 -0
- package/dist/knowledge/git.js +228 -0
- package/dist/knowledge/git.js.map +1 -0
- package/dist/knowledge/search.d.ts +20 -0
- package/dist/knowledge/search.d.ts.map +1 -0
- package/dist/knowledge/search.js +72 -0
- package/dist/knowledge/search.js.map +1 -0
- package/dist/knowledge/store.d.ts +47 -0
- package/dist/knowledge/store.d.ts.map +1 -0
- package/dist/knowledge/store.js +173 -0
- package/dist/knowledge/store.js.map +1 -0
- package/dist/search/excerpt.d.ts +12 -0
- package/dist/search/excerpt.d.ts.map +1 -0
- package/dist/search/excerpt.js +28 -0
- package/dist/search/excerpt.js.map +1 -0
- package/dist/search/fuzzy.d.ts +15 -0
- package/dist/search/fuzzy.d.ts.map +1 -0
- package/dist/search/fuzzy.js +81 -0
- package/dist/search/fuzzy.js.map +1 -0
- package/dist/search/tfidf.d.ts +19 -0
- package/dist/search/tfidf.d.ts.map +1 -0
- package/dist/search/tfidf.js +200 -0
- package/dist/search/tfidf.js.map +1 -0
- package/dist/search/types.d.ts +19 -0
- package/dist/search/types.d.ts.map +1 -0
- package/dist/search/types.js +2 -0
- package/dist/search/types.js.map +1 -0
- package/dist/server.d.ts +3 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +518 -0
- package/dist/server.js.map +1 -0
- package/dist/sessions/indexer.d.ts +15 -0
- package/dist/sessions/indexer.d.ts.map +1 -0
- package/dist/sessions/indexer.js +182 -0
- package/dist/sessions/indexer.js.map +1 -0
- package/dist/sessions/parser.d.ts +58 -0
- package/dist/sessions/parser.d.ts.map +1 -0
- package/dist/sessions/parser.js +142 -0
- package/dist/sessions/parser.js.map +1 -0
- package/dist/sessions/scopes.d.ts +16 -0
- package/dist/sessions/scopes.d.ts.map +1 -0
- package/dist/sessions/scopes.js +153 -0
- package/dist/sessions/scopes.js.map +1 -0
- package/dist/sessions/search.d.ts +26 -0
- package/dist/sessions/search.d.ts.map +1 -0
- package/dist/sessions/search.js +256 -0
- package/dist/sessions/search.js.map +1 -0
- package/dist/sessions/summary.d.ts +28 -0
- package/dist/sessions/summary.d.ts.map +1 -0
- package/dist/sessions/summary.js +135 -0
- package/dist/sessions/summary.js.map +1 -0
- package/dist/types.d.ts +26 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +109 -0
- package/dist/types.js.map +1 -0
- package/dist/ui/app.js +1029 -0
- package/dist/ui/index.html +373 -0
- package/dist/ui/styles.css +1508 -0
- package/dist/ui/ui/app.js +811 -0
- package/dist/ui/ui/index.html +300 -0
- package/dist/ui/ui/styles.css +1154 -0
- package/dist/validate.d.ts +21 -0
- package/dist/validate.d.ts.map +1 -0
- package/dist/validate.js +86 -0
- package/dist/validate.js.map +1 -0
- package/dist/vectorstore/chunker.d.ts +48 -0
- package/dist/vectorstore/chunker.d.ts.map +1 -0
- package/dist/vectorstore/chunker.js +165 -0
- package/dist/vectorstore/chunker.js.map +1 -0
- package/dist/vectorstore/index.d.ts +5 -0
- package/dist/vectorstore/index.d.ts.map +1 -0
- package/dist/vectorstore/index.js +3 -0
- package/dist/vectorstore/index.js.map +1 -0
- package/dist/vectorstore/store.d.ts +139 -0
- package/dist/vectorstore/store.d.ts.map +1 -0
- package/dist/vectorstore/store.js +500 -0
- package/dist/vectorstore/store.js.map +1 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +2 -0
- package/dist/version.js.map +1 -0
- package/docs/ARCHITECTURE.md +244 -0
- package/docs/DASHBOARD.md +133 -0
- package/docs/SETUP.md +178 -0
- package/package.json +92 -0
- 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"}
|