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.
Files changed (151) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +289 -0
  3. package/dist/bin/claudectx.d.ts +2 -0
  4. package/dist/bin/claudectx.js +304 -0
  5. package/dist/bin/claudectx.js.map +1 -0
  6. package/dist/installer/daemon.d.ts +3 -0
  7. package/dist/installer/daemon.js +80 -0
  8. package/dist/installer/daemon.js.map +1 -0
  9. package/dist/installer/patch-settings.d.ts +2 -0
  10. package/dist/installer/patch-settings.js +83 -0
  11. package/dist/installer/patch-settings.js.map +1 -0
  12. package/dist/src/api/consolidate.d.ts +3 -0
  13. package/dist/src/api/consolidate.js +29 -0
  14. package/dist/src/api/consolidate.js.map +1 -0
  15. package/dist/src/api/context.d.ts +1 -0
  16. package/dist/src/api/context.js +26 -0
  17. package/dist/src/api/context.js.map +1 -0
  18. package/dist/src/api/force-end-session.d.ts +2 -0
  19. package/dist/src/api/force-end-session.js +60 -0
  20. package/dist/src/api/force-end-session.js.map +1 -0
  21. package/dist/src/api/health.d.ts +1 -0
  22. package/dist/src/api/health.js +27 -0
  23. package/dist/src/api/health.js.map +1 -0
  24. package/dist/src/api/hook.d.ts +2 -0
  25. package/dist/src/api/hook.js +187 -0
  26. package/dist/src/api/hook.js.map +1 -0
  27. package/dist/src/api/logs.d.ts +2 -0
  28. package/dist/src/api/logs.js +66 -0
  29. package/dist/src/api/logs.js.map +1 -0
  30. package/dist/src/api/memory.d.ts +2 -0
  31. package/dist/src/api/memory.js +93 -0
  32. package/dist/src/api/memory.js.map +1 -0
  33. package/dist/src/api/metrics.d.ts +3 -0
  34. package/dist/src/api/metrics.js +58 -0
  35. package/dist/src/api/metrics.js.map +1 -0
  36. package/dist/src/api/observations.d.ts +1 -0
  37. package/dist/src/api/observations.js +31 -0
  38. package/dist/src/api/observations.js.map +1 -0
  39. package/dist/src/api/projects.d.ts +1 -0
  40. package/dist/src/api/projects.js +29 -0
  41. package/dist/src/api/projects.js.map +1 -0
  42. package/dist/src/api/resync.d.ts +3 -0
  43. package/dist/src/api/resync.js +188 -0
  44. package/dist/src/api/resync.js.map +1 -0
  45. package/dist/src/api/search.d.ts +1 -0
  46. package/dist/src/api/search.js +36 -0
  47. package/dist/src/api/search.js.map +1 -0
  48. package/dist/src/api/sessions.d.ts +1 -0
  49. package/dist/src/api/sessions.js +137 -0
  50. package/dist/src/api/sessions.js.map +1 -0
  51. package/dist/src/api/settings.d.ts +2 -0
  52. package/dist/src/api/settings.js +90 -0
  53. package/dist/src/api/settings.js.map +1 -0
  54. package/dist/src/api/tags.d.ts +1 -0
  55. package/dist/src/api/tags.js +89 -0
  56. package/dist/src/api/tags.js.map +1 -0
  57. package/dist/src/config.d.ts +17 -0
  58. package/dist/src/config.js +39 -0
  59. package/dist/src/config.js.map +1 -0
  60. package/dist/src/db/client.d.ts +3 -0
  61. package/dist/src/db/client.js +38 -0
  62. package/dist/src/db/client.js.map +1 -0
  63. package/dist/src/db/migrate.d.ts +1 -0
  64. package/dist/src/db/migrate.js +56 -0
  65. package/dist/src/db/migrate.js.map +1 -0
  66. package/dist/src/db/migrations/001_add_memory_tables.sql +149 -0
  67. package/dist/src/db/migrations/002_add_project_id_to_memory.sql +25 -0
  68. package/dist/src/db/migrations/003_enhance_sessions_schema.sql +27 -0
  69. package/dist/src/db/migrations/004_add_bookmarks.sql +5 -0
  70. package/dist/src/db/migrations/005_add_tags.sql +21 -0
  71. package/dist/src/db/migrations/006_add_notes.sql +2 -0
  72. package/dist/src/db/migrations/007_add_archived.sql +2 -0
  73. package/dist/src/db/queries.d.ts +104 -0
  74. package/dist/src/db/queries.js +432 -0
  75. package/dist/src/db/queries.js.map +1 -0
  76. package/dist/src/db/schema.d.ts +1 -0
  77. package/dist/src/db/schema.js +81 -0
  78. package/dist/src/db/schema.js.map +1 -0
  79. package/dist/src/hooks/post-tool-use.d.ts +1 -0
  80. package/dist/src/hooks/post-tool-use.js +23 -0
  81. package/dist/src/hooks/post-tool-use.js.map +1 -0
  82. package/dist/src/hooks/pre-compact.d.ts +1 -0
  83. package/dist/src/hooks/pre-compact.js +18 -0
  84. package/dist/src/hooks/pre-compact.js.map +1 -0
  85. package/dist/src/hooks/session-end.d.ts +1 -0
  86. package/dist/src/hooks/session-end.js +20 -0
  87. package/dist/src/hooks/session-end.js.map +1 -0
  88. package/dist/src/hooks/session-start.d.ts +1 -0
  89. package/dist/src/hooks/session-start.js +32 -0
  90. package/dist/src/hooks/session-start.js.map +1 -0
  91. package/dist/src/hooks/stop.d.ts +1 -0
  92. package/dist/src/hooks/stop.js +22 -0
  93. package/dist/src/hooks/stop.js.map +1 -0
  94. package/dist/src/hooks/user-prompt-submit.d.ts +1 -0
  95. package/dist/src/hooks/user-prompt-submit.js +18 -0
  96. package/dist/src/hooks/user-prompt-submit.js.map +1 -0
  97. package/dist/src/hooks/utils.d.ts +3 -0
  98. package/dist/src/hooks/utils.js +96 -0
  99. package/dist/src/hooks/utils.js.map +1 -0
  100. package/dist/src/index.d.ts +1 -0
  101. package/dist/src/index.js +92 -0
  102. package/dist/src/index.js.map +1 -0
  103. package/dist/src/services/auto-summarizer.d.ts +5 -0
  104. package/dist/src/services/auto-summarizer.js +50 -0
  105. package/dist/src/services/auto-summarizer.js.map +1 -0
  106. package/dist/src/services/claude-md-updater.d.ts +1 -0
  107. package/dist/src/services/claude-md-updater.js +43 -0
  108. package/dist/src/services/claude-md-updater.js.map +1 -0
  109. package/dist/src/services/context-builder.d.ts +1 -0
  110. package/dist/src/services/context-builder.js +97 -0
  111. package/dist/src/services/context-builder.js.map +1 -0
  112. package/dist/src/services/fuzzy-task-matcher.d.ts +37 -0
  113. package/dist/src/services/fuzzy-task-matcher.js +96 -0
  114. package/dist/src/services/fuzzy-task-matcher.js.map +1 -0
  115. package/dist/src/services/logger.d.ts +20 -0
  116. package/dist/src/services/logger.js +43 -0
  117. package/dist/src/services/logger.js.map +1 -0
  118. package/dist/src/services/memory-consolidator.d.ts +32 -0
  119. package/dist/src/services/memory-consolidator.js +192 -0
  120. package/dist/src/services/memory-consolidator.js.map +1 -0
  121. package/dist/src/services/memory-decay.d.ts +16 -0
  122. package/dist/src/services/memory-decay.js +79 -0
  123. package/dist/src/services/memory-decay.js.map +1 -0
  124. package/dist/src/services/metrics.d.ts +58 -0
  125. package/dist/src/services/metrics.js +100 -0
  126. package/dist/src/services/metrics.js.map +1 -0
  127. package/dist/src/services/project-detector.d.ts +5 -0
  128. package/dist/src/services/project-detector.js +43 -0
  129. package/dist/src/services/project-detector.js.map +1 -0
  130. package/dist/src/services/queue.d.ts +2 -0
  131. package/dist/src/services/queue.js +16 -0
  132. package/dist/src/services/queue.js.map +1 -0
  133. package/dist/src/services/session-timeout.d.ts +1 -0
  134. package/dist/src/services/session-timeout.js +50 -0
  135. package/dist/src/services/session-timeout.js.map +1 -0
  136. package/dist/src/services/summarization-queue.d.ts +43 -0
  137. package/dist/src/services/summarization-queue.js +150 -0
  138. package/dist/src/services/summarization-queue.js.map +1 -0
  139. package/dist/src/services/summarizer.d.ts +2 -0
  140. package/dist/src/services/summarizer.js +239 -0
  141. package/dist/src/services/summarizer.js.map +1 -0
  142. package/dist/src/services/transcript-reader.d.ts +9 -0
  143. package/dist/src/services/transcript-reader.js +50 -0
  144. package/dist/src/services/transcript-reader.js.map +1 -0
  145. package/dist/src/services/watcher.d.ts +1 -0
  146. package/dist/src/services/watcher.js +34 -0
  147. package/dist/src/services/watcher.js.map +1 -0
  148. package/dist/src/ws/broadcast.d.ts +3 -0
  149. package/dist/src/ws/broadcast.js +24 -0
  150. package/dist/src/ws/broadcast.js.map +1 -0
  151. 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,9 @@
1
+ interface Turn {
2
+ role?: string;
3
+ type?: string;
4
+ name?: string;
5
+ content?: string;
6
+ input?: any;
7
+ }
8
+ export declare function readTranscript(filePath: string): Promise<Turn[]>;
9
+ export {};
@@ -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,3 @@
1
+ import { WebSocketServer } from 'ws';
2
+ export declare function initWS(server: WebSocketServer): void;
3
+ export declare function broadcast(data: object): void;
@@ -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
+ }