memctx 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/LICENSE +21 -0
- package/README.md +289 -0
- package/dist/bin/claudectx.d.ts +2 -0
- package/dist/bin/claudectx.js +304 -0
- package/dist/bin/claudectx.js.map +1 -0
- package/dist/installer/daemon.d.ts +3 -0
- package/dist/installer/daemon.js +80 -0
- package/dist/installer/daemon.js.map +1 -0
- package/dist/installer/patch-settings.d.ts +2 -0
- package/dist/installer/patch-settings.js +83 -0
- package/dist/installer/patch-settings.js.map +1 -0
- package/dist/src/api/consolidate.d.ts +3 -0
- package/dist/src/api/consolidate.js +29 -0
- package/dist/src/api/consolidate.js.map +1 -0
- package/dist/src/api/context.d.ts +1 -0
- package/dist/src/api/context.js +26 -0
- package/dist/src/api/context.js.map +1 -0
- package/dist/src/api/force-end-session.d.ts +2 -0
- package/dist/src/api/force-end-session.js +60 -0
- package/dist/src/api/force-end-session.js.map +1 -0
- package/dist/src/api/health.d.ts +1 -0
- package/dist/src/api/health.js +27 -0
- package/dist/src/api/health.js.map +1 -0
- package/dist/src/api/hook.d.ts +2 -0
- package/dist/src/api/hook.js +187 -0
- package/dist/src/api/hook.js.map +1 -0
- package/dist/src/api/logs.d.ts +2 -0
- package/dist/src/api/logs.js +66 -0
- package/dist/src/api/logs.js.map +1 -0
- package/dist/src/api/memory.d.ts +2 -0
- package/dist/src/api/memory.js +93 -0
- package/dist/src/api/memory.js.map +1 -0
- package/dist/src/api/metrics.d.ts +3 -0
- package/dist/src/api/metrics.js +58 -0
- package/dist/src/api/metrics.js.map +1 -0
- package/dist/src/api/observations.d.ts +1 -0
- package/dist/src/api/observations.js +31 -0
- package/dist/src/api/observations.js.map +1 -0
- package/dist/src/api/projects.d.ts +1 -0
- package/dist/src/api/projects.js +29 -0
- package/dist/src/api/projects.js.map +1 -0
- package/dist/src/api/resync.d.ts +3 -0
- package/dist/src/api/resync.js +188 -0
- package/dist/src/api/resync.js.map +1 -0
- package/dist/src/api/search.d.ts +1 -0
- package/dist/src/api/search.js +36 -0
- package/dist/src/api/search.js.map +1 -0
- package/dist/src/api/sessions.d.ts +1 -0
- package/dist/src/api/sessions.js +137 -0
- package/dist/src/api/sessions.js.map +1 -0
- package/dist/src/api/settings.d.ts +2 -0
- package/dist/src/api/settings.js +90 -0
- package/dist/src/api/settings.js.map +1 -0
- package/dist/src/api/tags.d.ts +1 -0
- package/dist/src/api/tags.js +89 -0
- package/dist/src/api/tags.js.map +1 -0
- package/dist/src/config.d.ts +17 -0
- package/dist/src/config.js +39 -0
- package/dist/src/config.js.map +1 -0
- package/dist/src/db/client.d.ts +3 -0
- package/dist/src/db/client.js +38 -0
- package/dist/src/db/client.js.map +1 -0
- package/dist/src/db/migrate.d.ts +1 -0
- package/dist/src/db/migrate.js +56 -0
- package/dist/src/db/migrate.js.map +1 -0
- package/dist/src/db/migrations/001_add_memory_tables.sql +149 -0
- package/dist/src/db/migrations/002_add_project_id_to_memory.sql +25 -0
- package/dist/src/db/migrations/003_enhance_sessions_schema.sql +27 -0
- package/dist/src/db/migrations/004_add_bookmarks.sql +5 -0
- package/dist/src/db/migrations/005_add_tags.sql +21 -0
- package/dist/src/db/migrations/006_add_notes.sql +2 -0
- package/dist/src/db/migrations/007_add_archived.sql +2 -0
- package/dist/src/db/queries.d.ts +104 -0
- package/dist/src/db/queries.js +432 -0
- package/dist/src/db/queries.js.map +1 -0
- package/dist/src/db/schema.d.ts +1 -0
- package/dist/src/db/schema.js +81 -0
- package/dist/src/db/schema.js.map +1 -0
- package/dist/src/hooks/post-tool-use.d.ts +1 -0
- package/dist/src/hooks/post-tool-use.js +23 -0
- package/dist/src/hooks/post-tool-use.js.map +1 -0
- package/dist/src/hooks/pre-compact.d.ts +1 -0
- package/dist/src/hooks/pre-compact.js +18 -0
- package/dist/src/hooks/pre-compact.js.map +1 -0
- package/dist/src/hooks/session-end.d.ts +1 -0
- package/dist/src/hooks/session-end.js +20 -0
- package/dist/src/hooks/session-end.js.map +1 -0
- package/dist/src/hooks/session-start.d.ts +1 -0
- package/dist/src/hooks/session-start.js +32 -0
- package/dist/src/hooks/session-start.js.map +1 -0
- package/dist/src/hooks/stop.d.ts +1 -0
- package/dist/src/hooks/stop.js +22 -0
- package/dist/src/hooks/stop.js.map +1 -0
- package/dist/src/hooks/user-prompt-submit.d.ts +1 -0
- package/dist/src/hooks/user-prompt-submit.js +18 -0
- package/dist/src/hooks/user-prompt-submit.js.map +1 -0
- package/dist/src/hooks/utils.d.ts +3 -0
- package/dist/src/hooks/utils.js +96 -0
- package/dist/src/hooks/utils.js.map +1 -0
- package/dist/src/index.d.ts +1 -0
- package/dist/src/index.js +92 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/services/auto-summarizer.d.ts +5 -0
- package/dist/src/services/auto-summarizer.js +50 -0
- package/dist/src/services/auto-summarizer.js.map +1 -0
- package/dist/src/services/claude-md-updater.d.ts +1 -0
- package/dist/src/services/claude-md-updater.js +43 -0
- package/dist/src/services/claude-md-updater.js.map +1 -0
- package/dist/src/services/context-builder.d.ts +1 -0
- package/dist/src/services/context-builder.js +97 -0
- package/dist/src/services/context-builder.js.map +1 -0
- package/dist/src/services/fuzzy-task-matcher.d.ts +37 -0
- package/dist/src/services/fuzzy-task-matcher.js +96 -0
- package/dist/src/services/fuzzy-task-matcher.js.map +1 -0
- package/dist/src/services/logger.d.ts +20 -0
- package/dist/src/services/logger.js +43 -0
- package/dist/src/services/logger.js.map +1 -0
- package/dist/src/services/memory-consolidator.d.ts +32 -0
- package/dist/src/services/memory-consolidator.js +192 -0
- package/dist/src/services/memory-consolidator.js.map +1 -0
- package/dist/src/services/memory-decay.d.ts +16 -0
- package/dist/src/services/memory-decay.js +79 -0
- package/dist/src/services/memory-decay.js.map +1 -0
- package/dist/src/services/metrics.d.ts +58 -0
- package/dist/src/services/metrics.js +100 -0
- package/dist/src/services/metrics.js.map +1 -0
- package/dist/src/services/project-detector.d.ts +5 -0
- package/dist/src/services/project-detector.js +43 -0
- package/dist/src/services/project-detector.js.map +1 -0
- package/dist/src/services/queue.d.ts +2 -0
- package/dist/src/services/queue.js +16 -0
- package/dist/src/services/queue.js.map +1 -0
- package/dist/src/services/session-timeout.d.ts +1 -0
- package/dist/src/services/session-timeout.js +50 -0
- package/dist/src/services/session-timeout.js.map +1 -0
- package/dist/src/services/summarization-queue.d.ts +43 -0
- package/dist/src/services/summarization-queue.js +150 -0
- package/dist/src/services/summarization-queue.js.map +1 -0
- package/dist/src/services/summarizer.d.ts +2 -0
- package/dist/src/services/summarizer.js +239 -0
- package/dist/src/services/summarizer.js.map +1 -0
- package/dist/src/services/transcript-reader.d.ts +9 -0
- package/dist/src/services/transcript-reader.js +50 -0
- package/dist/src/services/transcript-reader.js.map +1 -0
- package/dist/src/services/watcher.d.ts +1 -0
- package/dist/src/services/watcher.js +34 -0
- package/dist/src/services/watcher.js.map +1 -0
- package/dist/src/ws/broadcast.d.ts +3 -0
- package/dist/src/ws/broadcast.js +24 -0
- package/dist/src/ws/broadcast.js.map +1 -0
- package/package.json +66 -0
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.summarizeSession = summarizeSession;
|
|
7
|
+
exports.snapshotSession = snapshotSession;
|
|
8
|
+
const sdk_1 = __importDefault(require("@anthropic-ai/sdk"));
|
|
9
|
+
const transcript_reader_1 = require("./transcript-reader");
|
|
10
|
+
const queries_1 = require("../db/queries");
|
|
11
|
+
const config_1 = require("../config");
|
|
12
|
+
const claude_md_updater_1 = require("./claude-md-updater");
|
|
13
|
+
const broadcast_1 = require("../ws/broadcast");
|
|
14
|
+
const fuzzy_task_matcher_1 = require("./fuzzy-task-matcher");
|
|
15
|
+
const logger_1 = require("./logger");
|
|
16
|
+
const metrics_1 = require("./metrics");
|
|
17
|
+
function compactTranscriptSmart(turns) {
|
|
18
|
+
// Take last 80 turns for better context
|
|
19
|
+
const recentTurns = turns.slice(-80);
|
|
20
|
+
const lines = [];
|
|
21
|
+
let lastRole = '';
|
|
22
|
+
for (const turn of recentTurns) {
|
|
23
|
+
if (turn.role === 'user') {
|
|
24
|
+
const content = (turn.content || '').slice(0, 500);
|
|
25
|
+
if (content.trim()) {
|
|
26
|
+
lines.push(`USER: ${content}`);
|
|
27
|
+
lastRole = 'user';
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
else if (turn.role === 'assistant') {
|
|
31
|
+
// Keep full assistant responses for decisions/explanations
|
|
32
|
+
const content = (turn.content || '').slice(0, 800);
|
|
33
|
+
if (content.trim()) {
|
|
34
|
+
lines.push(`CLAUDE: ${content}`);
|
|
35
|
+
lastRole = 'assistant';
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
else if (turn.type === 'tool_use') {
|
|
39
|
+
// Compress repetitive tool calls
|
|
40
|
+
const toolName = turn.name || 'unknown';
|
|
41
|
+
const input = JSON.stringify(turn.input || {});
|
|
42
|
+
if (toolName === 'Read' || toolName === 'Grep' || toolName === 'Glob') {
|
|
43
|
+
lines.push(`TOOL(${toolName}): ${input.slice(0, 150)}`);
|
|
44
|
+
}
|
|
45
|
+
else if (toolName === 'Edit' || toolName === 'Write') {
|
|
46
|
+
lines.push(`TOOL(${toolName}): ${input.slice(0, 300)}`);
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
lines.push(`TOOL(${toolName}): ${input.slice(0, 200)}`);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return lines.join('\n');
|
|
54
|
+
}
|
|
55
|
+
function getClient() {
|
|
56
|
+
return new sdk_1.default({
|
|
57
|
+
apiKey: config_1.CONFIG.apiKey,
|
|
58
|
+
baseURL: config_1.CONFIG.apiBaseUrl
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
async function summarizeSession(sessionId, transcriptPath, projectId) {
|
|
62
|
+
if (!config_1.CONFIG.apiKey || config_1.CONFIG.disableSummaries) {
|
|
63
|
+
console.log('No API key or summaries disabled — skipping AI summary for session', sessionId);
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
try {
|
|
67
|
+
const startTime = Date.now();
|
|
68
|
+
const turns = await (0, transcript_reader_1.readTranscript)(transcriptPath);
|
|
69
|
+
if (turns.length === 0)
|
|
70
|
+
return;
|
|
71
|
+
// Smart transcript compaction
|
|
72
|
+
const compactTranscript = compactTranscriptSmart(turns);
|
|
73
|
+
const client = getClient();
|
|
74
|
+
logger_1.logger.info('Summarizer', `Starting summarization for session ${sessionId}`, {
|
|
75
|
+
model: config_1.CONFIG.summaryModel,
|
|
76
|
+
transcriptLength: turns.length
|
|
77
|
+
});
|
|
78
|
+
const response = await client.messages.create({
|
|
79
|
+
model: config_1.CONFIG.summaryModel,
|
|
80
|
+
max_tokens: config_1.CONFIG.summaryMaxTokens,
|
|
81
|
+
stream: false,
|
|
82
|
+
system: `You are a memory extraction system. Analyze the session and extract:
|
|
83
|
+
1. Session summary (what was done, mood, complexity, blockers, resolutions, key insight)
|
|
84
|
+
2. User preferences discovered (coding style, workflow, communication)
|
|
85
|
+
3. Domain knowledge learned (technologies, patterns, gotchas)
|
|
86
|
+
4. Problem-solving patterns used
|
|
87
|
+
5. Pending tasks identified
|
|
88
|
+
6. People/teams mentioned
|
|
89
|
+
|
|
90
|
+
Always respond with ONLY valid JSON matching the exact schema provided. No preamble, no markdown, no explanation.`,
|
|
91
|
+
messages: [{
|
|
92
|
+
role: 'user',
|
|
93
|
+
content: `Summarize this Claude Code coding session transcript. Return ONLY JSON.
|
|
94
|
+
|
|
95
|
+
TRANSCRIPT:
|
|
96
|
+
${compactTranscript}
|
|
97
|
+
|
|
98
|
+
Return this exact JSON schema:
|
|
99
|
+
{
|
|
100
|
+
"title": "5-8 word title describing the main work done",
|
|
101
|
+
"status": "completed OR in_progress OR blocked",
|
|
102
|
+
"what_we_did": ["specific thing 1", "specific thing 2", "specific thing 3"],
|
|
103
|
+
"decisions_made": ["architectural or technical decision made"],
|
|
104
|
+
"files_changed": ["relative/path/to/file.ts"],
|
|
105
|
+
"next_steps": ["concrete next thing to do"],
|
|
106
|
+
"gotchas": ["important warning or thing to remember"],
|
|
107
|
+
"tech_stack_notes": ["framework/library/pattern note"],
|
|
108
|
+
"mood": "productive OR frustrated OR exploratory OR debugging OR blocked",
|
|
109
|
+
"complexity": "trivial OR simple OR moderate OR complex OR very_complex",
|
|
110
|
+
"blockers": ["thing that blocked progress"],
|
|
111
|
+
"resolved": ["problem that was solved"],
|
|
112
|
+
"key_insight": "single most important learning or realization from this session",
|
|
113
|
+
"preferences": [{"category": "coding", "key": "style", "value": "TypeScript", "confidence": 0.9}],
|
|
114
|
+
"knowledge": [{"category": "technology", "topic": "9router", "content": "Returns OpenAI format", "confidence": 0.8}],
|
|
115
|
+
"patterns": [{"type": "debugging", "title": "Check logs first", "description": "Always check logs before diving into code"}],
|
|
116
|
+
"tasks": [{"title": "Fix bug", "description": "Details", "priority": "high", "status": "pending"}],
|
|
117
|
+
"contacts": [{"name": "John", "type": "person", "role": "engineer", "context": "discussed API"}]
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
Rules:
|
|
121
|
+
- what_we_did: max 5 items, be specific (not "wrote code")
|
|
122
|
+
- decisions_made: only real decisions, skip trivial ones
|
|
123
|
+
- files_changed: only files actually modified/created
|
|
124
|
+
- next_steps: max 3 items, most important first
|
|
125
|
+
- gotchas: only truly important things (bugs found, footguns)
|
|
126
|
+
- tech_stack_notes: language/framework specifics future sessions need
|
|
127
|
+
- mood: overall emotional tone of the session
|
|
128
|
+
- complexity: technical difficulty level
|
|
129
|
+
- blockers: things that prevented progress (empty array if none)
|
|
130
|
+
- resolved: problems that were fixed (empty array if none)
|
|
131
|
+
- key_insight: most valuable takeaway (empty string if none)
|
|
132
|
+
- If nothing significant happened, use status "in_progress"`
|
|
133
|
+
}]
|
|
134
|
+
});
|
|
135
|
+
console.log(`[Summarizer] Response received:`, JSON.stringify(response, null, 2));
|
|
136
|
+
// Handle both Anthropic format (content array) and OpenAI format (choices array)
|
|
137
|
+
let raw = '';
|
|
138
|
+
if (response.content && response.content[0]) {
|
|
139
|
+
// Anthropic format
|
|
140
|
+
raw = response.content[0].type === 'text' ? response.content[0].text : '';
|
|
141
|
+
}
|
|
142
|
+
else if (response.choices && response.choices[0]) {
|
|
143
|
+
// OpenAI format (from 9router)
|
|
144
|
+
raw = response.choices[0].message.content || '';
|
|
145
|
+
}
|
|
146
|
+
else {
|
|
147
|
+
throw new Error(`Invalid API response: ${JSON.stringify(response)}`);
|
|
148
|
+
}
|
|
149
|
+
console.log(`[Summarizer] Raw content:`, raw);
|
|
150
|
+
const summary = JSON.parse(raw.replace(/```json\n?|\n?```/g, '').trim());
|
|
151
|
+
// Calculate session duration
|
|
152
|
+
const session = queries_1.queries.getSession(sessionId);
|
|
153
|
+
const durationSeconds = session?.ended_at && session?.started_at
|
|
154
|
+
? session.ended_at - session.started_at
|
|
155
|
+
: null;
|
|
156
|
+
queries_1.queries.updateSession(sessionId, {
|
|
157
|
+
summary_title: summary.title,
|
|
158
|
+
summary_status: 'completed', // Always mark summary as completed after successful AI processing
|
|
159
|
+
summary_what_we_did: JSON.stringify(summary.what_we_did),
|
|
160
|
+
summary_decisions: JSON.stringify(summary.decisions_made),
|
|
161
|
+
summary_files_changed: JSON.stringify(summary.files_changed),
|
|
162
|
+
summary_next_steps: JSON.stringify(summary.next_steps),
|
|
163
|
+
summary_gotchas: JSON.stringify(summary.gotchas),
|
|
164
|
+
summary_tech_notes: JSON.stringify(summary.tech_stack_notes),
|
|
165
|
+
summary_mood: summary.mood || null,
|
|
166
|
+
summary_complexity: summary.complexity || null,
|
|
167
|
+
summary_blockers: summary.blockers ? JSON.stringify(summary.blockers) : null,
|
|
168
|
+
summary_resolved: summary.resolved ? JSON.stringify(summary.resolved) : null,
|
|
169
|
+
summary_key_insight: summary.key_insight || null,
|
|
170
|
+
duration_seconds: durationSeconds,
|
|
171
|
+
status: 'completed'
|
|
172
|
+
});
|
|
173
|
+
// Store extracted memory
|
|
174
|
+
if (summary.preferences) {
|
|
175
|
+
for (const pref of summary.preferences) {
|
|
176
|
+
queries_1.queries.setPreference(pref.category, pref.key, pref.value, pref.confidence, sessionId, projectId);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
if (summary.knowledge) {
|
|
180
|
+
for (const k of summary.knowledge) {
|
|
181
|
+
const id = `${k.category}_${k.topic}`.replace(/\s+/g, '_').toLowerCase();
|
|
182
|
+
queries_1.queries.addKnowledge({ id, category: k.category, topic: k.topic, content: k.content, confidence: k.confidence, sessionId, projectId });
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
if (summary.patterns) {
|
|
186
|
+
for (const p of summary.patterns) {
|
|
187
|
+
const id = `${p.type}_${p.title}`.replace(/\s+/g, '_').toLowerCase();
|
|
188
|
+
queries_1.queries.addPattern({ id, type: p.type, title: p.title, description: p.description, example: p.example, projectId });
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
if (summary.tasks) {
|
|
192
|
+
for (const t of summary.tasks) {
|
|
193
|
+
// Use fuzzy matching to avoid duplicate tasks
|
|
194
|
+
fuzzy_task_matcher_1.fuzzyTaskMatcher.addTaskSmart({
|
|
195
|
+
title: t.title,
|
|
196
|
+
description: t.description,
|
|
197
|
+
priority: t.priority,
|
|
198
|
+
projectId,
|
|
199
|
+
sessionId
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
if (summary.contacts) {
|
|
204
|
+
for (const c of summary.contacts) {
|
|
205
|
+
const id = c.name.replace(/\s+/g, '_').toLowerCase();
|
|
206
|
+
queries_1.queries.addContact({ id, name: c.name, type: c.type, role: c.role, projectId });
|
|
207
|
+
queries_1.queries.addInteraction(id, sessionId, 'mentioned', c.context);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
for (const item of [...summary.what_we_did, ...summary.decisions_made]) {
|
|
211
|
+
queries_1.queries.insertObservation({
|
|
212
|
+
session_id: sessionId,
|
|
213
|
+
project_id: projectId,
|
|
214
|
+
event_type: 'decision',
|
|
215
|
+
content: item,
|
|
216
|
+
metadata: '{}'
|
|
217
|
+
});
|
|
218
|
+
}
|
|
219
|
+
await (0, claude_md_updater_1.updateClaudeMd)(projectId, sessionId, summary);
|
|
220
|
+
(0, broadcast_1.broadcast)({ type: 'summary_ready', session_id: sessionId, title: summary.title });
|
|
221
|
+
const duration = Date.now() - startTime;
|
|
222
|
+
logger_1.logger.info('Summarizer', `Summary saved for session ${sessionId}`, {
|
|
223
|
+
title: summary.title,
|
|
224
|
+
duration: `${duration}ms`
|
|
225
|
+
});
|
|
226
|
+
metrics_1.metricsTracker.recordSummarization(true, duration);
|
|
227
|
+
}
|
|
228
|
+
catch (err) {
|
|
229
|
+
logger_1.logger.error('Summarizer', `Summarization failed for session ${sessionId}`, { error: err });
|
|
230
|
+
metrics_1.metricsTracker.recordSummarization(false, 0);
|
|
231
|
+
queries_1.queries.updateSession(sessionId, { status: 'completed' });
|
|
232
|
+
throw err; // Re-throw for queue retry logic
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
async function snapshotSession(sessionId, transcriptPath, projectId) {
|
|
236
|
+
await summarizeSession(sessionId, transcriptPath, projectId);
|
|
237
|
+
queries_1.queries.updateSession(sessionId, { status: 'compacted' });
|
|
238
|
+
}
|
|
239
|
+
//# sourceMappingURL=summarizer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"summarizer.js","sourceRoot":"","sources":["../../../src/services/summarizer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.readTranscript = readTranscript;
|
|
7
|
+
const fs_1 = __importDefault(require("fs"));
|
|
8
|
+
const readline_1 = __importDefault(require("readline"));
|
|
9
|
+
async function readTranscript(filePath) {
|
|
10
|
+
if (!fs_1.default.existsSync(filePath))
|
|
11
|
+
return [];
|
|
12
|
+
const turns = [];
|
|
13
|
+
const rl = readline_1.default.createInterface({
|
|
14
|
+
input: fs_1.default.createReadStream(filePath),
|
|
15
|
+
crlfDelay: Infinity
|
|
16
|
+
});
|
|
17
|
+
for await (const line of rl) {
|
|
18
|
+
if (!line.trim())
|
|
19
|
+
continue;
|
|
20
|
+
try {
|
|
21
|
+
const entry = JSON.parse(line);
|
|
22
|
+
if (entry.type === 'user' && entry.message?.content) {
|
|
23
|
+
const content = Array.isArray(entry.message.content)
|
|
24
|
+
? entry.message.content.map((c) => c.text || '').join(' ')
|
|
25
|
+
: String(entry.message.content);
|
|
26
|
+
turns.push({ role: 'user', content });
|
|
27
|
+
}
|
|
28
|
+
if (entry.type === 'assistant' && entry.message?.content) {
|
|
29
|
+
const content = Array.isArray(entry.message.content)
|
|
30
|
+
? entry.message.content
|
|
31
|
+
.filter((c) => c.type === 'text')
|
|
32
|
+
.map((c) => c.text || '').join(' ')
|
|
33
|
+
: String(entry.message.content);
|
|
34
|
+
turns.push({ role: 'assistant', content });
|
|
35
|
+
if (Array.isArray(entry.message.content)) {
|
|
36
|
+
for (const block of entry.message.content) {
|
|
37
|
+
if (block.type === 'tool_use') {
|
|
38
|
+
turns.push({ type: 'tool_use', name: block.name, input: block.input });
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
// Skip malformed lines
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
return turns;
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=transcript-reader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transcript-reader.js","sourceRoot":"","sources":["../../../src/services/transcript-reader.ts"],"names":[],"mappings":";;;;;AAWA,wCA2CC;AAtDD,4CAAmB;AACnB,wDAA+B;AAUxB,KAAK,UAAU,cAAc,CAAC,QAAgB;IACnD,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO,EAAE,CAAA;IAEvC,MAAM,KAAK,GAAW,EAAE,CAAA;IACxB,MAAM,EAAE,GAAG,kBAAQ,CAAC,eAAe,CAAC;QAClC,KAAK,EAAE,YAAE,CAAC,gBAAgB,CAAC,QAAQ,CAAC;QACpC,SAAS,EAAE,QAAQ;KACpB,CAAC,CAAA;IAEF,IAAI,KAAK,EAAE,MAAM,IAAI,IAAI,EAAE,EAAE,CAAC;QAC5B,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;YAAE,SAAQ;QAC1B,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;YAE9B,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,IAAI,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC;gBACpD,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;oBAClD,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;oBAC/D,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;gBACjC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAA;YACvC,CAAC;YAED,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,IAAI,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC;gBACzD,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;oBAClD,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO;yBAClB,MAAM,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC;yBACrC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;oBAC5C,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;gBACjC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,CAAA;gBAE1C,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;oBACzC,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;wBAC1C,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;4BAC9B,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,CAAA;wBACxE,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,uBAAuB;QACzB,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAA;AACd,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function startWatcher(): void;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.startWatcher = startWatcher;
|
|
7
|
+
const chokidar_1 = __importDefault(require("chokidar"));
|
|
8
|
+
const path_1 = __importDefault(require("path"));
|
|
9
|
+
const config_1 = require("../config");
|
|
10
|
+
const queries_1 = require("../db/queries");
|
|
11
|
+
function startWatcher() {
|
|
12
|
+
if (!config_1.CONFIG.claudeProjectsDir)
|
|
13
|
+
return;
|
|
14
|
+
const watchPath = path_1.default.join(config_1.CONFIG.claudeProjectsDir, '**', '*.jsonl');
|
|
15
|
+
const watcher = chokidar_1.default.watch(watchPath, {
|
|
16
|
+
persistent: true,
|
|
17
|
+
ignoreInitial: true,
|
|
18
|
+
awaitWriteFinish: { stabilityThreshold: 2000, pollInterval: 500 }
|
|
19
|
+
});
|
|
20
|
+
watcher.on('change', (filePath) => {
|
|
21
|
+
// Check if this transcript belongs to a known session
|
|
22
|
+
const transcriptName = path_1.default.basename(filePath, '.jsonl');
|
|
23
|
+
const session = queries_1.queries.getSession(transcriptName);
|
|
24
|
+
if (session && session.status === 'active') {
|
|
25
|
+
// File was written — update transcript path
|
|
26
|
+
queries_1.queries.updateSession(transcriptName, { transcript_path: filePath });
|
|
27
|
+
}
|
|
28
|
+
});
|
|
29
|
+
watcher.on('error', (err) => {
|
|
30
|
+
console.error('Watcher error:', err);
|
|
31
|
+
});
|
|
32
|
+
console.log('File watcher started for', config_1.CONFIG.claudeProjectsDir);
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=watcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"watcher.js","sourceRoot":"","sources":["../../../src/services/watcher.ts"],"names":[],"mappings":";;;;;AAOA,oCA2BC;AAlCD,wDAA+B;AAC/B,gDAAuB;AACvB,sCAAkC;AAClC,2CAAuC;AAIvC,SAAgB,YAAY;IAC1B,IAAI,CAAC,eAAM,CAAC,iBAAiB;QAAE,OAAM;IAErC,MAAM,SAAS,GAAG,cAAI,CAAC,IAAI,CAAC,eAAM,CAAC,iBAAiB,EAAE,IAAI,EAAE,SAAS,CAAC,CAAA;IAEtE,MAAM,OAAO,GAAG,kBAAQ,CAAC,KAAK,CAAC,SAAS,EAAE;QACxC,UAAU,EAAE,IAAI;QAChB,aAAa,EAAE,IAAI;QACnB,gBAAgB,EAAE,EAAE,kBAAkB,EAAE,IAAI,EAAE,YAAY,EAAE,GAAG,EAAE;KAClE,CAAC,CAAA;IAEF,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAgB,EAAE,EAAE;QACxC,sDAAsD;QACtD,MAAM,cAAc,GAAG,cAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAA;QAExD,MAAM,OAAO,GAAG,iBAAO,CAAC,UAAU,CAAC,cAAc,CAAC,CAAA;QAClD,IAAI,OAAO,IAAI,OAAO,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC3C,4CAA4C;YAC5C,iBAAO,CAAC,aAAa,CAAC,cAAc,EAAE,EAAE,eAAe,EAAE,QAAQ,EAAE,CAAC,CAAA;QACtE,CAAC;IACH,CAAC,CAAC,CAAA;IAEF,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAU,EAAE,EAAE;QACjC,OAAO,CAAC,KAAK,CAAC,gBAAgB,EAAE,GAAG,CAAC,CAAA;IACtC,CAAC,CAAC,CAAA;IAEF,OAAO,CAAC,GAAG,CAAC,0BAA0B,EAAE,eAAM,CAAC,iBAAiB,CAAC,CAAA;AACnE,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.initWS = initWS;
|
|
4
|
+
exports.broadcast = broadcast;
|
|
5
|
+
const ws_1 = require("ws");
|
|
6
|
+
let wss = null;
|
|
7
|
+
function initWS(server) {
|
|
8
|
+
wss = server;
|
|
9
|
+
server.on('connection', (ws) => {
|
|
10
|
+
ws.send(JSON.stringify({ type: 'connected', timestamp: Date.now() }));
|
|
11
|
+
});
|
|
12
|
+
}
|
|
13
|
+
function broadcast(data) {
|
|
14
|
+
if (!wss)
|
|
15
|
+
return;
|
|
16
|
+
const payload = JSON.stringify({ ...data, timestamp: Date.now() });
|
|
17
|
+
console.log('[Broadcast]', JSON.stringify(data));
|
|
18
|
+
wss.clients.forEach((client) => {
|
|
19
|
+
if (client.readyState === ws_1.WebSocket.OPEN) {
|
|
20
|
+
client.send(payload);
|
|
21
|
+
}
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=broadcast.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"broadcast.js","sourceRoot":"","sources":["../../../src/ws/broadcast.ts"],"names":[],"mappings":";;AAIA,wBAMC;AAED,8BAWC;AAvBD,2BAA+C;AAE/C,IAAI,GAAG,GAA2B,IAAI,CAAA;AAEtC,SAAgB,MAAM,CAAC,MAAuB;IAC5C,GAAG,GAAG,MAAM,CAAA;IAEZ,MAAM,CAAC,EAAE,CAAC,YAAY,EAAE,CAAC,EAAE,EAAE,EAAE;QAC7B,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAA;IACvE,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,SAAgB,SAAS,CAAC,IAAY;IACpC,IAAI,CAAC,GAAG;QAAE,OAAM;IAChB,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAA;IAElE,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAA;IAEhD,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE;QAC7B,IAAI,MAAM,CAAC,UAAU,KAAK,cAAS,CAAC,IAAI,EAAE,CAAC;YACzC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QACtB,CAAC;IACH,CAAC,CAAC,CAAA;AACJ,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "memctx",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Autonomous session memory for Claude Code - automatically captures, analyzes, and summarizes your development sessions",
|
|
5
|
+
"author": "Fahad Aziz Qureshi <info@memctx.dev> (https://memctx.dev)",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "https://github.com/bbhunterpk-ux/memctx.git"
|
|
10
|
+
},
|
|
11
|
+
"bugs": {
|
|
12
|
+
"url": "https://github.com/bbhunterpk-ux/memctx/issues"
|
|
13
|
+
},
|
|
14
|
+
"homepage": "https://memctx.dev",
|
|
15
|
+
"keywords": [
|
|
16
|
+
"claude",
|
|
17
|
+
"claude-code",
|
|
18
|
+
"ai",
|
|
19
|
+
"memory",
|
|
20
|
+
"context",
|
|
21
|
+
"session-tracking",
|
|
22
|
+
"anthropic",
|
|
23
|
+
"development-tools",
|
|
24
|
+
"productivity",
|
|
25
|
+
"memctx"
|
|
26
|
+
],
|
|
27
|
+
"type": "commonjs",
|
|
28
|
+
"main": "dist/index.js",
|
|
29
|
+
"bin": {
|
|
30
|
+
"memctx": "./dist/bin/claudectx.js"
|
|
31
|
+
},
|
|
32
|
+
"files": [
|
|
33
|
+
"dist/",
|
|
34
|
+
"README.md",
|
|
35
|
+
"LICENSE"
|
|
36
|
+
],
|
|
37
|
+
"engines": {
|
|
38
|
+
"node": ">=18.0.0"
|
|
39
|
+
},
|
|
40
|
+
"scripts": {
|
|
41
|
+
"prepublishOnly": "pnpm run build",
|
|
42
|
+
"dev": "NODE_NO_WARNINGS=1 tsx watch src/index.ts",
|
|
43
|
+
"dev:dashboard": "cd dashboard && vite --port $PORT",
|
|
44
|
+
"build": "pnpm run build:worker && pnpm run build:dashboard",
|
|
45
|
+
"build:worker": "tsc -p tsconfig.worker.json",
|
|
46
|
+
"build:dashboard": "cd dashboard && pnpm install && pnpm vite build",
|
|
47
|
+
"start": "node dist/index.js",
|
|
48
|
+
"typecheck": "tsc -p tsconfig.json --noEmit"
|
|
49
|
+
},
|
|
50
|
+
"dependencies": {
|
|
51
|
+
"@anthropic-ai/sdk": "^0.26.0",
|
|
52
|
+
"@types/better-sqlite3": "^7.6.13",
|
|
53
|
+
"better-sqlite3": "^12.8.0",
|
|
54
|
+
"chokidar": "^3.6.0",
|
|
55
|
+
"express": "^4.19.2",
|
|
56
|
+
"p-queue": "^8.0.1",
|
|
57
|
+
"ws": "^8.17.0"
|
|
58
|
+
},
|
|
59
|
+
"devDependencies": {
|
|
60
|
+
"@types/express": "^4.17.21",
|
|
61
|
+
"@types/node": "^20.12.0",
|
|
62
|
+
"@types/ws": "^8.5.10",
|
|
63
|
+
"tsx": "catalog:",
|
|
64
|
+
"typescript": "~5.9.2"
|
|
65
|
+
}
|
|
66
|
+
}
|