engram-sdk 0.1.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/CONTRIBUTING.md +65 -0
- package/Dockerfile +21 -0
- package/EVAL-FRAMEWORK.md +70 -0
- package/EVAL.md +127 -0
- package/LICENSE +17 -0
- package/README.md +309 -0
- package/ROADMAP.md +113 -0
- package/deploy/fly.toml +26 -0
- package/dist/auto-ingest.d.ts +3 -0
- package/dist/auto-ingest.d.ts.map +1 -0
- package/dist/auto-ingest.js +334 -0
- package/dist/auto-ingest.js.map +1 -0
- package/dist/brief.d.ts +45 -0
- package/dist/brief.d.ts.map +1 -0
- package/dist/brief.js +183 -0
- package/dist/brief.js.map +1 -0
- package/dist/claude-watcher.d.ts +3 -0
- package/dist/claude-watcher.d.ts.map +1 -0
- package/dist/claude-watcher.js +385 -0
- package/dist/claude-watcher.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +764 -0
- package/dist/cli.js.map +1 -0
- package/dist/embeddings.d.ts +42 -0
- package/dist/embeddings.d.ts.map +1 -0
- package/dist/embeddings.js +145 -0
- package/dist/embeddings.js.map +1 -0
- package/dist/eval.d.ts +2 -0
- package/dist/eval.d.ts.map +1 -0
- package/dist/eval.js +281 -0
- package/dist/eval.js.map +1 -0
- package/dist/extract.d.ts +11 -0
- package/dist/extract.d.ts.map +1 -0
- package/dist/extract.js +139 -0
- package/dist/extract.js.map +1 -0
- package/dist/hosted.d.ts +3 -0
- package/dist/hosted.d.ts.map +1 -0
- package/dist/hosted.js +144 -0
- package/dist/hosted.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/ingest.d.ts +28 -0
- package/dist/ingest.d.ts.map +1 -0
- package/dist/ingest.js +192 -0
- package/dist/ingest.js.map +1 -0
- package/dist/mcp.d.ts +3 -0
- package/dist/mcp.d.ts.map +1 -0
- package/dist/mcp.js +349 -0
- package/dist/mcp.js.map +1 -0
- package/dist/server.d.ts +17 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +515 -0
- package/dist/server.js.map +1 -0
- package/dist/store.d.ts +87 -0
- package/dist/store.d.ts.map +1 -0
- package/dist/store.js +548 -0
- package/dist/store.js.map +1 -0
- package/dist/types.d.ts +204 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +77 -0
- package/dist/types.js.map +1 -0
- package/dist/vault.d.ts +116 -0
- package/dist/vault.d.ts.map +1 -0
- package/dist/vault.js +1234 -0
- package/dist/vault.js.map +1 -0
- package/package.json +61 -0
package/dist/brief.js
ADDED
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
// ============================================================
|
|
2
|
+
// Session Briefing — Proactive context injection
|
|
3
|
+
// ============================================================
|
|
4
|
+
//
|
|
5
|
+
// Instead of reading flat files at session start, generate a
|
|
6
|
+
// structured, context-aware briefing that gives the agent exactly
|
|
7
|
+
// what it needs for the current interaction.
|
|
8
|
+
//
|
|
9
|
+
// Usage:
|
|
10
|
+
// const briefing = await vault.brief({ who: 'Thomas', context: 'work' })
|
|
11
|
+
/**
|
|
12
|
+
* Generate a context-aware session briefing.
|
|
13
|
+
*
|
|
14
|
+
* This replaces "read all the markdown files" with intelligent,
|
|
15
|
+
* targeted memory retrieval that gives the agent exactly what
|
|
16
|
+
* it needs for the current interaction.
|
|
17
|
+
*/
|
|
18
|
+
export async function brief(vault, options = {}) {
|
|
19
|
+
const { who, when = new Date(), recentTopics = [], recentEntities = [], maxMemories = 30, includePatterns = true, } = options;
|
|
20
|
+
const allMemories = new Map();
|
|
21
|
+
// 1. Person context — who are we talking to?
|
|
22
|
+
const personContext = [];
|
|
23
|
+
if (who) {
|
|
24
|
+
const personMemories = await vault.recall({
|
|
25
|
+
context: `About ${who}`,
|
|
26
|
+
entities: [who],
|
|
27
|
+
limit: 10,
|
|
28
|
+
minSalience: 0.3,
|
|
29
|
+
});
|
|
30
|
+
for (const m of personMemories) {
|
|
31
|
+
personContext.push(m);
|
|
32
|
+
allMemories.set(m.id, m);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
// 2. Recent interactions
|
|
36
|
+
const recentInteractions = await vault.recall({
|
|
37
|
+
context: 'recent conversations and interactions',
|
|
38
|
+
temporalFocus: 'recent',
|
|
39
|
+
limit: 8,
|
|
40
|
+
minSalience: 0.3,
|
|
41
|
+
});
|
|
42
|
+
for (const m of recentInteractions) {
|
|
43
|
+
allMemories.set(m.id, m);
|
|
44
|
+
}
|
|
45
|
+
// 3. Active topics
|
|
46
|
+
const activeProjects = [];
|
|
47
|
+
for (const topic of recentTopics) {
|
|
48
|
+
const topicMemories = await vault.recall({
|
|
49
|
+
context: topic,
|
|
50
|
+
topics: [topic],
|
|
51
|
+
limit: 5,
|
|
52
|
+
minSalience: 0.4,
|
|
53
|
+
});
|
|
54
|
+
for (const m of topicMemories) {
|
|
55
|
+
activeProjects.push(m);
|
|
56
|
+
allMemories.set(m.id, m);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
// 4. Recent entities
|
|
60
|
+
for (const entity of recentEntities) {
|
|
61
|
+
const entityMemories = await vault.recall({
|
|
62
|
+
context: entity,
|
|
63
|
+
entities: [entity],
|
|
64
|
+
limit: 5,
|
|
65
|
+
minSalience: 0.3,
|
|
66
|
+
});
|
|
67
|
+
for (const m of entityMemories) {
|
|
68
|
+
allMemories.set(m.id, m);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
// 5. Behavioral patterns (semantic memories from consolidation)
|
|
72
|
+
const patterns = [];
|
|
73
|
+
if (includePatterns) {
|
|
74
|
+
const patternMemories = await vault.recall({
|
|
75
|
+
context: 'patterns preferences behavioral insights',
|
|
76
|
+
types: ['semantic'],
|
|
77
|
+
limit: 8,
|
|
78
|
+
minSalience: 0.5,
|
|
79
|
+
});
|
|
80
|
+
for (const m of patternMemories) {
|
|
81
|
+
patterns.push(m);
|
|
82
|
+
allMemories.set(m.id, m);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
// 6. Pending items / commitments
|
|
86
|
+
const pendingItems = [];
|
|
87
|
+
const commitmentMemories = await vault.recall({
|
|
88
|
+
context: 'commitments pending todo action items promises',
|
|
89
|
+
topics: ['commitment'],
|
|
90
|
+
limit: 5,
|
|
91
|
+
minSalience: 0.4,
|
|
92
|
+
});
|
|
93
|
+
for (const m of commitmentMemories) {
|
|
94
|
+
pendingItems.push(m);
|
|
95
|
+
allMemories.set(m.id, m);
|
|
96
|
+
}
|
|
97
|
+
// 7. Procedural memories
|
|
98
|
+
const procedures = [];
|
|
99
|
+
const proceduralMemories = await vault.recall({
|
|
100
|
+
context: 'how to handle procedures lessons learned',
|
|
101
|
+
types: ['procedural'],
|
|
102
|
+
limit: 5,
|
|
103
|
+
minSalience: 0.3,
|
|
104
|
+
});
|
|
105
|
+
for (const m of proceduralMemories) {
|
|
106
|
+
procedures.push(m);
|
|
107
|
+
allMemories.set(m.id, m);
|
|
108
|
+
}
|
|
109
|
+
// Build the summary text
|
|
110
|
+
const summaryParts = [];
|
|
111
|
+
summaryParts.push(`# Session Briefing — ${when.toLocaleDateString('en-US', { weekday: 'long', year: 'numeric', month: 'long', day: 'numeric' })}`);
|
|
112
|
+
summaryParts.push('');
|
|
113
|
+
if (personContext.length > 0 && who) {
|
|
114
|
+
summaryParts.push(`## About ${who}`);
|
|
115
|
+
for (const m of personContext.slice(0, 5)) {
|
|
116
|
+
summaryParts.push(`- ${m.content}`);
|
|
117
|
+
}
|
|
118
|
+
summaryParts.push('');
|
|
119
|
+
}
|
|
120
|
+
if (recentInteractions.length > 0) {
|
|
121
|
+
summaryParts.push('## Recent Context');
|
|
122
|
+
for (const m of recentInteractions.slice(0, 5)) {
|
|
123
|
+
const age = timeSince(m.createdAt);
|
|
124
|
+
summaryParts.push(`- (${age}) ${m.summary || m.content.slice(0, 120)}`);
|
|
125
|
+
}
|
|
126
|
+
summaryParts.push('');
|
|
127
|
+
}
|
|
128
|
+
if (activeProjects.length > 0) {
|
|
129
|
+
summaryParts.push('## Active Topics');
|
|
130
|
+
for (const m of activeProjects.slice(0, 5)) {
|
|
131
|
+
summaryParts.push(`- ${m.content}`);
|
|
132
|
+
}
|
|
133
|
+
summaryParts.push('');
|
|
134
|
+
}
|
|
135
|
+
if (patterns.length > 0) {
|
|
136
|
+
summaryParts.push('## Patterns & Preferences');
|
|
137
|
+
for (const m of patterns.slice(0, 5)) {
|
|
138
|
+
summaryParts.push(`- ${m.content}`);
|
|
139
|
+
}
|
|
140
|
+
summaryParts.push('');
|
|
141
|
+
}
|
|
142
|
+
if (pendingItems.length > 0) {
|
|
143
|
+
summaryParts.push('## Pending Items');
|
|
144
|
+
for (const m of pendingItems) {
|
|
145
|
+
summaryParts.push(`- ${m.content}`);
|
|
146
|
+
}
|
|
147
|
+
summaryParts.push('');
|
|
148
|
+
}
|
|
149
|
+
if (procedures.length > 0) {
|
|
150
|
+
summaryParts.push('## Lessons & Procedures');
|
|
151
|
+
for (const m of procedures) {
|
|
152
|
+
summaryParts.push(`- ${m.content}`);
|
|
153
|
+
}
|
|
154
|
+
summaryParts.push('');
|
|
155
|
+
}
|
|
156
|
+
return {
|
|
157
|
+
summary: summaryParts.join('\n'),
|
|
158
|
+
personContext,
|
|
159
|
+
activeProjects: [...new Map(activeProjects.map(m => [m.id, m])).values()],
|
|
160
|
+
recentInteractions,
|
|
161
|
+
patterns,
|
|
162
|
+
pendingItems,
|
|
163
|
+
procedures,
|
|
164
|
+
allMemories: [...allMemories.values()].slice(0, maxMemories),
|
|
165
|
+
generatedAt: when.toISOString(),
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
function timeSince(iso) {
|
|
169
|
+
const ms = Date.now() - new Date(iso).getTime();
|
|
170
|
+
const mins = Math.floor(ms / 60000);
|
|
171
|
+
if (mins < 1)
|
|
172
|
+
return 'just now';
|
|
173
|
+
if (mins < 60)
|
|
174
|
+
return `${mins}m ago`;
|
|
175
|
+
const hours = Math.floor(mins / 60);
|
|
176
|
+
if (hours < 24)
|
|
177
|
+
return `${hours}h ago`;
|
|
178
|
+
const days = Math.floor(hours / 24);
|
|
179
|
+
if (days === 1)
|
|
180
|
+
return 'yesterday';
|
|
181
|
+
return `${days}d ago`;
|
|
182
|
+
}
|
|
183
|
+
//# sourceMappingURL=brief.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"brief.js","sourceRoot":"","sources":["../src/brief.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-watcher.d.ts","sourceRoot":"","sources":["../src/claude-watcher.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,385 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// ============================================================
|
|
3
|
+
// Engram Claude Code Watcher — Passive memory ingestion
|
|
4
|
+
// ============================================================
|
|
5
|
+
//
|
|
6
|
+
// Watches Claude Code session transcripts and silently extracts
|
|
7
|
+
// memories into an Engram vault. No changes to the user's
|
|
8
|
+
// workflow — Engram learns in the background.
|
|
9
|
+
//
|
|
10
|
+
// Usage:
|
|
11
|
+
// node dist/claude-watcher.js # One-shot
|
|
12
|
+
// node dist/claude-watcher.js --watch # Watch mode
|
|
13
|
+
// ENGRAM_API=http://localhost:3800/v1 node dist/claude-watcher.js --watch
|
|
14
|
+
//
|
|
15
|
+
// State tracked in: ~/.config/engram/claude-watcher-state.json
|
|
16
|
+
import { readFileSync, writeFileSync, existsSync, readdirSync, statSync } from 'fs';
|
|
17
|
+
import { join } from 'path';
|
|
18
|
+
import { homedir } from 'os';
|
|
19
|
+
// ============================================================
|
|
20
|
+
// Config
|
|
21
|
+
// ============================================================
|
|
22
|
+
const ENGRAM_API = process.env.ENGRAM_API ?? 'http://127.0.0.1:3800/v1';
|
|
23
|
+
const ENGRAM_AUTH = process.env.ENGRAM_AUTH_TOKEN ? `Bearer ${process.env.ENGRAM_AUTH_TOKEN}` : '';
|
|
24
|
+
const GEMINI_API_KEY = process.env.GEMINI_API_KEY;
|
|
25
|
+
const CLAUDE_PROJECTS_DIR = join(homedir(), '.claude', 'projects');
|
|
26
|
+
const STATE_PATH = join(homedir(), '.config', 'engram', 'claude-watcher-state.json');
|
|
27
|
+
const MIN_CHUNK_SIZE = 200;
|
|
28
|
+
const MAX_CHUNK_SIZE = 4000;
|
|
29
|
+
const INTERVAL_MS = parseInt(process.env.ENGRAM_INGEST_INTERVAL_MS ?? '300000', 10); // 5 min default
|
|
30
|
+
function loadState() {
|
|
31
|
+
if (!existsSync(STATE_PATH))
|
|
32
|
+
return { lastLine: {}, lastRunAt: '' };
|
|
33
|
+
try {
|
|
34
|
+
return JSON.parse(readFileSync(STATE_PATH, 'utf-8'));
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
return { lastLine: {}, lastRunAt: '' };
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
function saveState(state) {
|
|
41
|
+
const dir = join(homedir(), '.config', 'engram');
|
|
42
|
+
if (!existsSync(dir)) {
|
|
43
|
+
const { mkdirSync } = require('fs');
|
|
44
|
+
mkdirSync(dir, { recursive: true });
|
|
45
|
+
}
|
|
46
|
+
writeFileSync(STATE_PATH, JSON.stringify(state, null, 2));
|
|
47
|
+
}
|
|
48
|
+
function findSessionFiles() {
|
|
49
|
+
if (!existsSync(CLAUDE_PROJECTS_DIR)) {
|
|
50
|
+
console.log('No Claude Code projects found at', CLAUDE_PROJECTS_DIR);
|
|
51
|
+
return [];
|
|
52
|
+
}
|
|
53
|
+
const files = [];
|
|
54
|
+
const projects = readdirSync(CLAUDE_PROJECTS_DIR);
|
|
55
|
+
for (const project of projects) {
|
|
56
|
+
const projectDir = join(CLAUDE_PROJECTS_DIR, project);
|
|
57
|
+
if (!statSync(projectDir).isDirectory())
|
|
58
|
+
continue;
|
|
59
|
+
const entries = readdirSync(projectDir);
|
|
60
|
+
for (const entry of entries) {
|
|
61
|
+
if (!entry.endsWith('.jsonl'))
|
|
62
|
+
continue;
|
|
63
|
+
// Skip subagent files
|
|
64
|
+
if (entry.includes('subagent') || entry.includes('compact'))
|
|
65
|
+
continue;
|
|
66
|
+
const fullPath = join(projectDir, entry);
|
|
67
|
+
const stat = statSync(fullPath);
|
|
68
|
+
const sessionId = entry.replace('.jsonl', '');
|
|
69
|
+
files.push({
|
|
70
|
+
path: fullPath,
|
|
71
|
+
project: project.replace(/-/g, '/').replace(/^\//, ''),
|
|
72
|
+
sessionId,
|
|
73
|
+
modifiedAt: stat.mtimeMs,
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
// Sort by modification time, newest first
|
|
78
|
+
return files.sort((a, b) => b.modifiedAt - a.modifiedAt);
|
|
79
|
+
}
|
|
80
|
+
function parseSessionFile(filePath, startLine) {
|
|
81
|
+
const content = readFileSync(filePath, 'utf-8');
|
|
82
|
+
const lines = content.split('\n').filter(l => l.trim());
|
|
83
|
+
const turns = [];
|
|
84
|
+
for (let i = startLine; i < lines.length; i++) {
|
|
85
|
+
try {
|
|
86
|
+
const entry = JSON.parse(lines[i]);
|
|
87
|
+
// Skip non-message entries
|
|
88
|
+
if (entry.type !== 'user' && entry.type !== 'assistant')
|
|
89
|
+
continue;
|
|
90
|
+
let text = '';
|
|
91
|
+
if (entry.type === 'user') {
|
|
92
|
+
// User messages: extract content from the message field
|
|
93
|
+
try {
|
|
94
|
+
const msg = typeof entry.message === 'string' ? JSON.parse(entry.message.replace(/'/g, '"')) : entry.message;
|
|
95
|
+
if (typeof msg.content === 'string') {
|
|
96
|
+
text = msg.content;
|
|
97
|
+
}
|
|
98
|
+
else if (Array.isArray(msg.content)) {
|
|
99
|
+
text = msg.content.filter((c) => c.type === 'text').map((c) => c.text).join('\n');
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
catch {
|
|
103
|
+
// If parsing fails, try to extract text directly
|
|
104
|
+
if (typeof entry.message === 'string') {
|
|
105
|
+
// Try to extract from the raw string
|
|
106
|
+
const match = entry.message.match(/'content':\s*'([^']*)'/);
|
|
107
|
+
if (match)
|
|
108
|
+
text = match[1];
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
else if (entry.type === 'assistant') {
|
|
113
|
+
// Assistant messages: extract text content
|
|
114
|
+
try {
|
|
115
|
+
const msg = typeof entry.message === 'string' ? JSON.parse(entry.message.replace(/'/g, '"')) : entry.message;
|
|
116
|
+
if (msg.content) {
|
|
117
|
+
const contents = Array.isArray(msg.content) ? msg.content : [msg.content];
|
|
118
|
+
text = contents
|
|
119
|
+
.filter((c) => c.type === 'text')
|
|
120
|
+
.map((c) => c.text)
|
|
121
|
+
.join('\n');
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
catch {
|
|
125
|
+
// Skip unparseable assistant messages
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
if (text.length > 20) {
|
|
129
|
+
turns.push({
|
|
130
|
+
role: entry.type,
|
|
131
|
+
content: text.slice(0, 2000), // Cap individual message length
|
|
132
|
+
project: '',
|
|
133
|
+
timestamp: entry.timestamp ?? new Date().toISOString(),
|
|
134
|
+
lineNumber: i,
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
catch {
|
|
139
|
+
// Skip malformed lines
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
return turns;
|
|
143
|
+
}
|
|
144
|
+
// ============================================================
|
|
145
|
+
// Chunk turns into conversation segments
|
|
146
|
+
// ============================================================
|
|
147
|
+
function chunkTurns(turns) {
|
|
148
|
+
const chunks = [];
|
|
149
|
+
let current = '';
|
|
150
|
+
for (const turn of turns) {
|
|
151
|
+
const line = `${turn.role === 'user' ? 'User' : 'Assistant'}: ${turn.content}\n`;
|
|
152
|
+
if (current.length + line.length > MAX_CHUNK_SIZE && current.length >= MIN_CHUNK_SIZE) {
|
|
153
|
+
chunks.push(current);
|
|
154
|
+
current = '';
|
|
155
|
+
}
|
|
156
|
+
current += line;
|
|
157
|
+
}
|
|
158
|
+
if (current.length >= MIN_CHUNK_SIZE) {
|
|
159
|
+
chunks.push(current);
|
|
160
|
+
}
|
|
161
|
+
return chunks;
|
|
162
|
+
}
|
|
163
|
+
// ============================================================
|
|
164
|
+
// Ingest via Engram API
|
|
165
|
+
// ============================================================
|
|
166
|
+
async function ingestChunk(chunk, project) {
|
|
167
|
+
// Try the realtime ingest endpoint first
|
|
168
|
+
const headers = { 'Content-Type': 'application/json' };
|
|
169
|
+
if (ENGRAM_AUTH)
|
|
170
|
+
headers['Authorization'] = ENGRAM_AUTH;
|
|
171
|
+
try {
|
|
172
|
+
const res = await fetch(`${ENGRAM_API}/ingest/realtime`, {
|
|
173
|
+
method: 'POST',
|
|
174
|
+
headers,
|
|
175
|
+
body: JSON.stringify({
|
|
176
|
+
text: `[Project: ${project}]\n${chunk}`,
|
|
177
|
+
}),
|
|
178
|
+
});
|
|
179
|
+
if (res.ok) {
|
|
180
|
+
const data = await res.json();
|
|
181
|
+
return data.created ?? 0;
|
|
182
|
+
}
|
|
183
|
+
// If realtime endpoint doesn't exist, fall back to direct remember
|
|
184
|
+
if (res.status === 404) {
|
|
185
|
+
const memRes = await fetch(`${ENGRAM_API}/memories`, {
|
|
186
|
+
method: 'POST',
|
|
187
|
+
headers,
|
|
188
|
+
body: JSON.stringify({
|
|
189
|
+
content: chunk.slice(0, 500),
|
|
190
|
+
type: 'episodic',
|
|
191
|
+
topics: ['claude-code', project],
|
|
192
|
+
source: { type: 'conversation' },
|
|
193
|
+
}),
|
|
194
|
+
});
|
|
195
|
+
return memRes.ok ? 1 : 0;
|
|
196
|
+
}
|
|
197
|
+
return 0;
|
|
198
|
+
}
|
|
199
|
+
catch (err) {
|
|
200
|
+
console.error('Ingest error:', err);
|
|
201
|
+
return 0;
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
// ============================================================
|
|
205
|
+
// Smart session summary extraction
|
|
206
|
+
// ============================================================
|
|
207
|
+
async function ingestSessionSummary(turns, project) {
|
|
208
|
+
// Build a condensed transcript (cap at 6000 chars to save tokens)
|
|
209
|
+
let transcript = '';
|
|
210
|
+
for (const turn of turns) {
|
|
211
|
+
const prefix = turn.role === 'user' ? 'User' : 'Assistant';
|
|
212
|
+
const content = turn.content.slice(0, 500);
|
|
213
|
+
transcript += `${prefix}: ${content}\n`;
|
|
214
|
+
if (transcript.length > 6000)
|
|
215
|
+
break;
|
|
216
|
+
}
|
|
217
|
+
const prompt = `You are a memory extraction engine. Analyze this Claude Code session and extract the 3-7 most important things worth remembering long-term.
|
|
218
|
+
|
|
219
|
+
PROJECT: ${project}
|
|
220
|
+
|
|
221
|
+
SESSION TRANSCRIPT:
|
|
222
|
+
${transcript}
|
|
223
|
+
|
|
224
|
+
Focus on:
|
|
225
|
+
- Decisions made (architecture, tools, approaches chosen)
|
|
226
|
+
- Facts learned about the user's preferences or workflow
|
|
227
|
+
- Project-specific patterns or conventions
|
|
228
|
+
- Problems solved and how
|
|
229
|
+
- Commitments or next steps mentioned
|
|
230
|
+
|
|
231
|
+
Skip: trivial commands, routine file edits, debugging noise, generic code generation.
|
|
232
|
+
|
|
233
|
+
For each memory, provide:
|
|
234
|
+
- content: A clear, standalone statement (should make sense weeks later without context)
|
|
235
|
+
- type: "semantic" (facts/patterns), "episodic" (specific events/decisions), or "procedural" (how-to/lessons)
|
|
236
|
+
- entities: People, projects, tools mentioned
|
|
237
|
+
- topics: Relevant tags
|
|
238
|
+
- salience: 0.3-1.0 (how important?)
|
|
239
|
+
|
|
240
|
+
Respond as JSON:
|
|
241
|
+
{"memories": [{"content": "...", "type": "...", "entities": ["..."], "topics": ["..."], "salience": 0.5}]}
|
|
242
|
+
|
|
243
|
+
If the session is trivial (just fixing typos, running commands), respond: {"memories": []}`;
|
|
244
|
+
try {
|
|
245
|
+
const response = await fetch(`https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key=${GEMINI_API_KEY}`, {
|
|
246
|
+
method: 'POST',
|
|
247
|
+
headers: { 'Content-Type': 'application/json' },
|
|
248
|
+
body: JSON.stringify({
|
|
249
|
+
contents: [{ parts: [{ text: prompt }] }],
|
|
250
|
+
generationConfig: { responseMimeType: 'application/json', maxOutputTokens: 2048 },
|
|
251
|
+
}),
|
|
252
|
+
});
|
|
253
|
+
if (!response.ok) {
|
|
254
|
+
if (response.status === 429) {
|
|
255
|
+
console.warn(` Rate limited, waiting 15s...`);
|
|
256
|
+
await new Promise(r => setTimeout(r, 15000));
|
|
257
|
+
// Don't retry — will pick up on next cycle
|
|
258
|
+
}
|
|
259
|
+
else {
|
|
260
|
+
console.error(` Gemini API error: ${response.status}`);
|
|
261
|
+
}
|
|
262
|
+
return 0;
|
|
263
|
+
}
|
|
264
|
+
const data = await response.json();
|
|
265
|
+
const text = data.candidates?.[0]?.content?.parts?.[0]?.text ?? '{}';
|
|
266
|
+
const parsed = JSON.parse(text);
|
|
267
|
+
const headers = { 'Content-Type': 'application/json' };
|
|
268
|
+
if (ENGRAM_AUTH)
|
|
269
|
+
headers['Authorization'] = ENGRAM_AUTH;
|
|
270
|
+
let created = 0;
|
|
271
|
+
for (const mem of parsed.memories ?? []) {
|
|
272
|
+
if (mem.salience < 0.2)
|
|
273
|
+
continue;
|
|
274
|
+
// Security filter
|
|
275
|
+
if (/(?:sk-|api[_-]?key|password|token|secret)[:\s=]+\S{10,}/i.test(mem.content))
|
|
276
|
+
continue;
|
|
277
|
+
if (/AIza[a-zA-Z0-9_-]{30,}/.test(mem.content))
|
|
278
|
+
continue;
|
|
279
|
+
const res = await fetch(`${ENGRAM_API}/memories`, {
|
|
280
|
+
method: 'POST',
|
|
281
|
+
headers,
|
|
282
|
+
body: JSON.stringify({
|
|
283
|
+
content: mem.content,
|
|
284
|
+
type: mem.type ?? 'episodic',
|
|
285
|
+
entities: mem.entities ?? [],
|
|
286
|
+
topics: [...(mem.topics ?? []), 'claude-code', project.split('/').pop() ?? project],
|
|
287
|
+
salience: mem.salience ?? 0.5,
|
|
288
|
+
status: 'active',
|
|
289
|
+
source: { type: 'conversation' },
|
|
290
|
+
}),
|
|
291
|
+
});
|
|
292
|
+
if (res.ok)
|
|
293
|
+
created++;
|
|
294
|
+
}
|
|
295
|
+
console.log(` → ${created} memories (summary mode)`);
|
|
296
|
+
return created;
|
|
297
|
+
}
|
|
298
|
+
catch (err) {
|
|
299
|
+
console.error('Session summary error:', err);
|
|
300
|
+
return 0;
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
// ============================================================
|
|
304
|
+
// Main
|
|
305
|
+
// ============================================================
|
|
306
|
+
async function run() {
|
|
307
|
+
const state = loadState();
|
|
308
|
+
const sessions = findSessionFiles();
|
|
309
|
+
// Only process sessions modified in the last 7 days
|
|
310
|
+
const recentCutoff = Date.now() - 7 * 24 * 60 * 60 * 1000;
|
|
311
|
+
const recent = sessions.filter(s => s.modifiedAt > recentCutoff);
|
|
312
|
+
let totalCreated = 0;
|
|
313
|
+
let sessionsProcessed = 0;
|
|
314
|
+
for (const session of recent) {
|
|
315
|
+
const startLine = state.lastLine[session.path] ?? 0;
|
|
316
|
+
const turns = parseSessionFile(session.path, startLine);
|
|
317
|
+
if (turns.length === 0)
|
|
318
|
+
continue;
|
|
319
|
+
console.log(`Processing ${session.project} (${turns.length} new turns)...`);
|
|
320
|
+
sessionsProcessed++;
|
|
321
|
+
// Smart mode: if we have Gemini, send the whole session as one summary request
|
|
322
|
+
// instead of chunking raw text. Much better signal-to-noise.
|
|
323
|
+
if (GEMINI_API_KEY && turns.length >= 3) {
|
|
324
|
+
const created = await ingestSessionSummary(turns, session.project);
|
|
325
|
+
totalCreated += created;
|
|
326
|
+
// Update state
|
|
327
|
+
const lastLine = turns[turns.length - 1].lineNumber + 1;
|
|
328
|
+
state.lastLine[session.path] = lastLine;
|
|
329
|
+
await new Promise(r => setTimeout(r, 5000)); // rate limit between sessions
|
|
330
|
+
continue;
|
|
331
|
+
}
|
|
332
|
+
// Fallback: chunk-based ingestion
|
|
333
|
+
const chunks = chunkTurns(turns);
|
|
334
|
+
for (let i = 0; i < chunks.length; i++) {
|
|
335
|
+
const created = await ingestChunk(chunks[i], session.project);
|
|
336
|
+
totalCreated += created;
|
|
337
|
+
// Rate limit between chunks
|
|
338
|
+
if (i < chunks.length - 1) {
|
|
339
|
+
await new Promise(r => setTimeout(r, 5000));
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
// Update state
|
|
343
|
+
const lastLine = turns[turns.length - 1].lineNumber + 1;
|
|
344
|
+
state.lastLine[session.path] = lastLine;
|
|
345
|
+
}
|
|
346
|
+
state.lastRunAt = new Date().toISOString();
|
|
347
|
+
saveState(state);
|
|
348
|
+
return { memoriesCreated: totalCreated, sessions: sessionsProcessed };
|
|
349
|
+
}
|
|
350
|
+
// ============================================================
|
|
351
|
+
// Entry point
|
|
352
|
+
// ============================================================
|
|
353
|
+
const isWatch = process.argv.includes('--watch');
|
|
354
|
+
if (isWatch) {
|
|
355
|
+
const mins = Math.round(INTERVAL_MS / 60000);
|
|
356
|
+
console.log(`🧠 Engram Claude Code watcher (every ${mins} min)`);
|
|
357
|
+
console.log(` Watching: ${CLAUDE_PROJECTS_DIR}`);
|
|
358
|
+
console.log(` API: ${ENGRAM_API}`);
|
|
359
|
+
let running = false;
|
|
360
|
+
const tick = async () => {
|
|
361
|
+
if (running)
|
|
362
|
+
return;
|
|
363
|
+
running = true;
|
|
364
|
+
try {
|
|
365
|
+
const result = await run();
|
|
366
|
+
if (result.memoriesCreated > 0) {
|
|
367
|
+
console.log(` ✓ ${result.memoriesCreated} memories from ${result.sessions} sessions at ${new Date().toLocaleTimeString()}`);
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
catch (err) {
|
|
371
|
+
console.error('Watcher error:', err);
|
|
372
|
+
}
|
|
373
|
+
finally {
|
|
374
|
+
running = false;
|
|
375
|
+
}
|
|
376
|
+
};
|
|
377
|
+
tick();
|
|
378
|
+
setInterval(tick, INTERVAL_MS);
|
|
379
|
+
}
|
|
380
|
+
else {
|
|
381
|
+
run().then(result => {
|
|
382
|
+
console.log(`Done. ${result.memoriesCreated} memories from ${result.sessions} sessions.`);
|
|
383
|
+
}).catch(console.error);
|
|
384
|
+
}
|
|
385
|
+
//# sourceMappingURL=claude-watcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-watcher.js","sourceRoot":"","sources":["../src/claude-watcher.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
|