@londer/cortex 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.
Files changed (125) hide show
  1. package/CHANGELOG.md +62 -0
  2. package/LICENSE +21 -0
  3. package/README.md +183 -0
  4. package/dist/cli.d.ts +3 -0
  5. package/dist/cli.d.ts.map +1 -0
  6. package/dist/cli.js +278 -0
  7. package/dist/cli.js.map +1 -0
  8. package/dist/config-store.d.ts +15 -0
  9. package/dist/config-store.d.ts.map +1 -0
  10. package/dist/config-store.js +86 -0
  11. package/dist/config-store.js.map +1 -0
  12. package/dist/config.d.ts +28 -0
  13. package/dist/config.d.ts.map +1 -0
  14. package/dist/config.js +39 -0
  15. package/dist/config.js.map +1 -0
  16. package/dist/consolidation/cluster-finder.d.ts +5 -0
  17. package/dist/consolidation/cluster-finder.d.ts.map +1 -0
  18. package/dist/consolidation/cluster-finder.js +43 -0
  19. package/dist/consolidation/cluster-finder.js.map +1 -0
  20. package/dist/consolidation/consolidator.d.ts +29 -0
  21. package/dist/consolidation/consolidator.d.ts.map +1 -0
  22. package/dist/consolidation/consolidator.js +296 -0
  23. package/dist/consolidation/consolidator.js.map +1 -0
  24. package/dist/embedding/embedder.d.ts +9 -0
  25. package/dist/embedding/embedder.d.ts.map +1 -0
  26. package/dist/embedding/embedder.js +89 -0
  27. package/dist/embedding/embedder.js.map +1 -0
  28. package/dist/extraction/auto-extractor.d.ts +7 -0
  29. package/dist/extraction/auto-extractor.d.ts.map +1 -0
  30. package/dist/extraction/auto-extractor.js +174 -0
  31. package/dist/extraction/auto-extractor.js.map +1 -0
  32. package/dist/extraction/conversation-buffer.d.ts +15 -0
  33. package/dist/extraction/conversation-buffer.d.ts.map +1 -0
  34. package/dist/extraction/conversation-buffer.js +60 -0
  35. package/dist/extraction/conversation-buffer.js.map +1 -0
  36. package/dist/extraction/extractor.d.ts +23 -0
  37. package/dist/extraction/extractor.d.ts.map +1 -0
  38. package/dist/extraction/extractor.js +108 -0
  39. package/dist/extraction/extractor.js.map +1 -0
  40. package/dist/extraction/tier1-regex.d.ts +7 -0
  41. package/dist/extraction/tier1-regex.d.ts.map +1 -0
  42. package/dist/extraction/tier1-regex.js +119 -0
  43. package/dist/extraction/tier1-regex.js.map +1 -0
  44. package/dist/extraction/tier2-nlp.d.ts +13 -0
  45. package/dist/extraction/tier2-nlp.d.ts.map +1 -0
  46. package/dist/extraction/tier2-nlp.js +195 -0
  47. package/dist/extraction/tier2-nlp.js.map +1 -0
  48. package/dist/extraction/tier3-llm.d.ts +8 -0
  49. package/dist/extraction/tier3-llm.d.ts.map +1 -0
  50. package/dist/extraction/tier3-llm.js +57 -0
  51. package/dist/extraction/tier3-llm.js.map +1 -0
  52. package/dist/index.d.ts +2 -0
  53. package/dist/index.d.ts.map +1 -0
  54. package/dist/index.js +398 -0
  55. package/dist/index.js.map +1 -0
  56. package/dist/llm/anthropic-client.d.ts +18 -0
  57. package/dist/llm/anthropic-client.d.ts.map +1 -0
  58. package/dist/llm/anthropic-client.js +116 -0
  59. package/dist/llm/anthropic-client.js.map +1 -0
  60. package/dist/orchestration/ranker.d.ts +18 -0
  61. package/dist/orchestration/ranker.d.ts.map +1 -0
  62. package/dist/orchestration/ranker.js +124 -0
  63. package/dist/orchestration/ranker.js.map +1 -0
  64. package/dist/orchestration/scope.d.ts +15 -0
  65. package/dist/orchestration/scope.d.ts.map +1 -0
  66. package/dist/orchestration/scope.js +28 -0
  67. package/dist/orchestration/scope.js.map +1 -0
  68. package/dist/storage/neo4j.d.ts +19 -0
  69. package/dist/storage/neo4j.d.ts.map +1 -0
  70. package/dist/storage/neo4j.js +246 -0
  71. package/dist/storage/neo4j.js.map +1 -0
  72. package/dist/storage/qdrant.d.ts +21 -0
  73. package/dist/storage/qdrant.d.ts.map +1 -0
  74. package/dist/storage/qdrant.js +125 -0
  75. package/dist/storage/qdrant.js.map +1 -0
  76. package/dist/storage/sqlite.d.ts +23 -0
  77. package/dist/storage/sqlite.d.ts.map +1 -0
  78. package/dist/storage/sqlite.js +162 -0
  79. package/dist/storage/sqlite.js.map +1 -0
  80. package/dist/templates/claude-instructions.d.ts +11 -0
  81. package/dist/templates/claude-instructions.d.ts.map +1 -0
  82. package/dist/templates/claude-instructions.js +110 -0
  83. package/dist/templates/claude-instructions.js.map +1 -0
  84. package/dist/tools/config.d.ts +21 -0
  85. package/dist/tools/config.d.ts.map +1 -0
  86. package/dist/tools/config.js +96 -0
  87. package/dist/tools/config.js.map +1 -0
  88. package/dist/tools/consolidate.d.ts +4 -0
  89. package/dist/tools/consolidate.d.ts.map +1 -0
  90. package/dist/tools/consolidate.js +16 -0
  91. package/dist/tools/consolidate.js.map +1 -0
  92. package/dist/tools/context.d.ts +8 -0
  93. package/dist/tools/context.d.ts.map +1 -0
  94. package/dist/tools/context.js +84 -0
  95. package/dist/tools/context.js.map +1 -0
  96. package/dist/tools/forget.d.ts +7 -0
  97. package/dist/tools/forget.d.ts.map +1 -0
  98. package/dist/tools/forget.js +49 -0
  99. package/dist/tools/forget.js.map +1 -0
  100. package/dist/tools/graph-query.d.ts +5 -0
  101. package/dist/tools/graph-query.d.ts.map +1 -0
  102. package/dist/tools/graph-query.js +35 -0
  103. package/dist/tools/graph-query.js.map +1 -0
  104. package/dist/tools/ingest.d.ts +8 -0
  105. package/dist/tools/ingest.d.ts.map +1 -0
  106. package/dist/tools/ingest.js +101 -0
  107. package/dist/tools/ingest.js.map +1 -0
  108. package/dist/tools/relate.d.ts +4 -0
  109. package/dist/tools/relate.d.ts.map +1 -0
  110. package/dist/tools/relate.js +10 -0
  111. package/dist/tools/relate.js.map +1 -0
  112. package/dist/tools/search.d.ts +6 -0
  113. package/dist/tools/search.d.ts.map +1 -0
  114. package/dist/tools/search.js +43 -0
  115. package/dist/tools/search.js.map +1 -0
  116. package/dist/tools/store.d.ts +8 -0
  117. package/dist/tools/store.d.ts.map +1 -0
  118. package/dist/tools/store.js +64 -0
  119. package/dist/tools/store.js.map +1 -0
  120. package/dist/types/index.d.ts +289 -0
  121. package/dist/types/index.d.ts.map +1 -0
  122. package/dist/types/index.js +3 -0
  123. package/dist/types/index.js.map +1 -0
  124. package/docker-compose.yml +27 -0
  125. package/package.json +71 -0
package/dist/index.js ADDED
@@ -0,0 +1,398 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
3
+ import { z } from 'zod';
4
+ import { loadConfig } from './config.js';
5
+ import { getEmbedder } from './embedding/embedder.js';
6
+ import { SQLiteStore } from './storage/sqlite.js';
7
+ import { QdrantStore } from './storage/qdrant.js';
8
+ import { Neo4jStore } from './storage/neo4j.js';
9
+ import { AnthropicClient } from './llm/anthropic-client.js';
10
+ import { RuntimeConfigStore } from './config-store.js';
11
+ import { Tier1Regex } from './extraction/tier1-regex.js';
12
+ import { Tier2NLP } from './extraction/tier2-nlp.js';
13
+ import { Tier3LLM } from './extraction/tier3-llm.js';
14
+ import { EntityExtractor } from './extraction/extractor.js';
15
+ import { ConversationBuffer } from './extraction/conversation-buffer.js';
16
+ import { extractWithLLM, extractLocally } from './extraction/auto-extractor.js';
17
+ import { Consolidator } from './consolidation/consolidator.js';
18
+ import { handleMemoryStore } from './tools/store.js';
19
+ import { handleMemorySearch } from './tools/search.js';
20
+ import { handleMemoryRelate } from './tools/relate.js';
21
+ import { handleMemoryGraphQuery } from './tools/graph-query.js';
22
+ import { handleMemoryContext } from './tools/context.js';
23
+ import { handleMemoryForget } from './tools/forget.js';
24
+ import { handleMemoryIngest } from './tools/ingest.js';
25
+ import { handleMemoryConsolidate } from './tools/consolidate.js';
26
+ import { handleMemoryConfig } from './tools/config.js';
27
+ import { v4 as uuidv4 } from 'uuid';
28
+ async function main() {
29
+ const config = loadConfig();
30
+ console.error('[cortex] Starting Cortex MCP server...');
31
+ // ── Phase 2: Runtime Config Store ──
32
+ const configStore = new RuntimeConfigStore();
33
+ // Apply runtime overrides to config
34
+ const runtimeApiKey = configStore.getRawApiKey();
35
+ const effectiveApiKey = runtimeApiKey ?? config.anthropicApiKey;
36
+ const runtimeExtractionTier = configStore.get('extraction_tier');
37
+ if (runtimeExtractionTier) {
38
+ config.extractionTier = runtimeExtractionTier;
39
+ }
40
+ const runtimeAutoExtract = configStore.get('auto_extract');
41
+ if (runtimeAutoExtract !== null) {
42
+ config.autoExtract = runtimeAutoExtract !== 'false';
43
+ }
44
+ const runtimeConsolidation = configStore.get('consolidation_enabled');
45
+ if (runtimeConsolidation !== null) {
46
+ config.consolidationEnabled = runtimeConsolidation !== 'false';
47
+ }
48
+ // ── Initialise storage clients ──
49
+ const sqlite = new SQLiteStore(config.sqlitePath);
50
+ sqlite.init();
51
+ console.error('[cortex] SQLite initialised.');
52
+ const qdrantStore = new QdrantStore(config);
53
+ try {
54
+ await qdrantStore.init();
55
+ console.error('[cortex] Qdrant initialised.');
56
+ }
57
+ catch (error) {
58
+ console.error(`[cortex] WARNING: Qdrant unavailable: ${error}`);
59
+ }
60
+ const neo4jStore = new Neo4jStore(config);
61
+ try {
62
+ await neo4jStore.init();
63
+ console.error('[cortex] Neo4j initialised.');
64
+ }
65
+ catch (error) {
66
+ console.error(`[cortex] WARNING: Neo4j unavailable: ${error}`);
67
+ }
68
+ // ── Initialise embedder ──
69
+ const embedder = await getEmbedder();
70
+ console.error('[cortex] Embedder ready (model loads on first use).');
71
+ // ── Phase 2: LLM Client ──
72
+ const llmClient = new AnthropicClient(effectiveApiKey, config.llmModel);
73
+ if (llmClient.isAvailable()) {
74
+ console.error(`[cortex] LLM: available (${config.llmModel})`);
75
+ }
76
+ else {
77
+ console.error('[cortex] LLM: unavailable (no API key)');
78
+ }
79
+ // ── Phase 2: Tiered Entity Extractor ──
80
+ const tier1 = new Tier1Regex();
81
+ const tier2 = new Tier2NLP(embedder, qdrantStore);
82
+ const tier3 = llmClient.isAvailable() ? new Tier3LLM(llmClient) : null;
83
+ const extractor = new EntityExtractor(tier1, tier2, tier3, config.extractionTier);
84
+ const activeTier = extractor.getActiveTier();
85
+ const tierNames = { 1: 'Regex + Heuristics', 2: 'NLP + embeddings', 3: 'LLM' };
86
+ console.error(`[cortex] Extraction tier: ${activeTier} (${tierNames[activeTier]})`);
87
+ // ── Phase 2: Consolidator ──
88
+ const consolidator = new Consolidator(embedder, sqlite, qdrantStore, neo4jStore, llmClient.isAvailable() ? llmClient : null, config.consolidationBatchSize);
89
+ if (config.consolidationEnabled) {
90
+ consolidator.startAutoConsolidation(config.consolidationIntervalMs);
91
+ const mode = llmClient.isAvailable() ? 'LLM mode' : 'local mode';
92
+ console.error(`[cortex] Consolidation: enabled (${mode}, interval: ${config.consolidationIntervalMs / 1000}s)`);
93
+ }
94
+ else {
95
+ console.error('[cortex] Consolidation: disabled');
96
+ }
97
+ // ── Phase 2: Conversation Buffer (auto-extraction) ──
98
+ let conversationBuffer = null;
99
+ if (config.autoExtract) {
100
+ const extractionCallback = async (events) => {
101
+ try {
102
+ let memories;
103
+ if (llmClient.isAvailable()) {
104
+ const recentMemories = sqlite.getRecentMemories(events[0]?.project ?? null, 10);
105
+ const recentContext = recentMemories.map(m => m.content).join('\n');
106
+ memories = await extractWithLLM(events, recentContext, llmClient);
107
+ }
108
+ else {
109
+ const recentMemories = sqlite.getRecentMemories(events[0]?.project ?? null, 10);
110
+ memories = await extractLocally(events, recentMemories, extractor, embedder, qdrantStore);
111
+ }
112
+ // Store extracted memories
113
+ for (const mem of memories) {
114
+ const id = uuidv4();
115
+ const now = new Date().toISOString();
116
+ const memory = {
117
+ id,
118
+ content: mem.content,
119
+ type: mem.type,
120
+ project: mem.project,
121
+ tags: mem.tags,
122
+ entities: mem.entities,
123
+ source: 'auto-extraction',
124
+ created_at: now,
125
+ updated_at: now,
126
+ is_deleted: 0,
127
+ source_type: 'auto',
128
+ extraction_confidence: mem.confidence,
129
+ };
130
+ sqlite.insertMemory(memory);
131
+ const vector = await embedder.embed(mem.content);
132
+ const payload = {
133
+ id,
134
+ project: mem.project,
135
+ type: mem.type,
136
+ tags: mem.tags,
137
+ entities: mem.entities,
138
+ created_at: Math.floor(Date.now() / 1000),
139
+ };
140
+ await qdrantStore.upsert(id, vector, payload);
141
+ if (mem.entities.length > 0) {
142
+ await neo4jStore.linkMemoryToEntities(id, mem.entities);
143
+ }
144
+ for (const rel of mem.relationships) {
145
+ try {
146
+ await neo4jStore.createRelation(rel.from, rel.relation, rel.to, mem.project ?? undefined);
147
+ }
148
+ catch { /* ignore relationship errors */ }
149
+ }
150
+ }
151
+ if (memories.length > 0) {
152
+ console.error(`[cortex] Auto-extracted ${memories.length} memories from ${events.length} events`);
153
+ }
154
+ }
155
+ catch (error) {
156
+ console.error(`[cortex] Auto-extraction pipeline error: ${error}`);
157
+ }
158
+ };
159
+ conversationBuffer = new ConversationBuffer(config.extractBufferSize, config.extractDebounceMs, extractionCallback);
160
+ const mode = llmClient.isAvailable() ? 'LLM mode' : 'local mode';
161
+ console.error(`[cortex] Auto-extraction: enabled (${mode})`);
162
+ }
163
+ else {
164
+ console.error('[cortex] Auto-extraction: disabled');
165
+ }
166
+ // ── Helper: wrap tool handler with buffer hook ──
167
+ function wrapWithBuffer(toolName, handler) {
168
+ return async (args) => {
169
+ const result = await handler(args);
170
+ if (conversationBuffer) {
171
+ conversationBuffer.push({
172
+ timestamp: Date.now(),
173
+ tool: toolName,
174
+ input: args,
175
+ output: result,
176
+ project: args.project,
177
+ });
178
+ }
179
+ return result;
180
+ };
181
+ }
182
+ // ── Create MCP server ──
183
+ const server = new McpServer({ name: 'cortex', version: '0.2.0' }, { capabilities: { tools: {} } });
184
+ // ── Register Tools ──
185
+ server.registerTool('memory_store', {
186
+ description: 'Store a new memory in Cortex. Automatically embeds content, stores metadata, and links entities in the knowledge graph.',
187
+ inputSchema: {
188
+ content: z.string().describe('The memory text'),
189
+ type: z.enum(['insight', 'decision', 'pattern', 'snippet', 'fact', 'note']).describe('Memory type'),
190
+ tags: z.array(z.string()).optional().describe('Optional freeform tags'),
191
+ project: z.string().optional().describe('Project scope (auto-inferred if absent)'),
192
+ entities: z.array(z.string()).optional().describe('Entity names to link in the graph'),
193
+ source: z.string().optional().describe('Where this came from'),
194
+ },
195
+ }, async (args) => {
196
+ try {
197
+ const wrappedHandler = wrapWithBuffer('memory_store', (a) => handleMemoryStore(a, embedder, sqlite, qdrantStore, neo4jStore, extractor));
198
+ const result = await wrappedHandler(args);
199
+ return { content: [{ type: 'text', text: JSON.stringify(result) }] };
200
+ }
201
+ catch (error) {
202
+ const message = error instanceof Error ? error.message : String(error);
203
+ return { content: [{ type: 'text', text: `Error: ${message}` }], isError: true };
204
+ }
205
+ });
206
+ server.registerTool('memory_search', {
207
+ description: 'Semantic search across stored memories. Returns ranked results with scope boosting.',
208
+ inputSchema: {
209
+ query: z.string().describe('Natural language query'),
210
+ project: z.string().optional().describe('Scope filter (auto-inferred if absent)'),
211
+ type: z.string().optional().describe('Filter by memory type'),
212
+ tags: z.array(z.string()).optional().describe('Filter by tags'),
213
+ limit: z.number().optional().describe('Max results (default: 10)'),
214
+ },
215
+ }, async (args) => {
216
+ try {
217
+ const wrappedHandler = wrapWithBuffer('memory_search', (a) => handleMemorySearch(a, embedder, sqlite, qdrantStore));
218
+ const result = await wrappedHandler(args);
219
+ return { content: [{ type: 'text', text: JSON.stringify(result) }] };
220
+ }
221
+ catch (error) {
222
+ const message = error instanceof Error ? error.message : String(error);
223
+ return { content: [{ type: 'text', text: `Error: ${message}` }], isError: true };
224
+ }
225
+ });
226
+ server.registerTool('memory_relate', {
227
+ description: 'Create a relationship between entities in the knowledge graph.',
228
+ inputSchema: {
229
+ from_entity: z.string().describe('Source entity name'),
230
+ relation: z.string().describe('Relationship type (e.g. DEPENDS_ON, USES, PART_OF, RELATED_TO, IMPLEMENTS, CALLS)'),
231
+ to_entity: z.string().describe('Target entity name'),
232
+ project: z.string().optional().describe('Project scope'),
233
+ properties: z.record(z.string(), z.string()).optional().describe('Optional metadata on the relation'),
234
+ },
235
+ }, async (args) => {
236
+ try {
237
+ const wrappedHandler = wrapWithBuffer('memory_relate', (a) => handleMemoryRelate(a, neo4jStore));
238
+ const result = await wrappedHandler(args);
239
+ return { content: [{ type: 'text', text: JSON.stringify(result) }] };
240
+ }
241
+ catch (error) {
242
+ const message = error instanceof Error ? error.message : String(error);
243
+ return { content: [{ type: 'text', text: `Error: ${message}` }], isError: true };
244
+ }
245
+ });
246
+ server.registerTool('memory_graph_query', {
247
+ description: 'Traverse the knowledge graph from an entity. Returns connected entities and linked memories.',
248
+ inputSchema: {
249
+ entity: z.string().describe('Starting entity name'),
250
+ depth: z.number().optional().describe('Traversal depth (default: 2, max: 4)'),
251
+ relation_types: z.array(z.string()).optional().describe('Filter by relation types'),
252
+ project: z.string().optional().describe('Project scope'),
253
+ },
254
+ }, async (args) => {
255
+ try {
256
+ const wrappedHandler = wrapWithBuffer('memory_graph_query', (a) => handleMemoryGraphQuery(a, neo4jStore, sqlite));
257
+ const result = await wrappedHandler(args);
258
+ return { content: [{ type: 'text', text: JSON.stringify(result) }] };
259
+ }
260
+ catch (error) {
261
+ const message = error instanceof Error ? error.message : String(error);
262
+ return { content: [{ type: 'text', text: `Error: ${message}` }], isError: true };
263
+ }
264
+ });
265
+ server.registerTool('memory_context', {
266
+ description: 'Smart context retrieval — combines semantic search, graph traversal, and recent memories to build the best possible context for a task.',
267
+ inputSchema: {
268
+ description: z.string().describe('What you are working on / what context you need'),
269
+ project: z.string().optional().describe('Project scope'),
270
+ max_tokens: z.number().optional().describe('Approximate token budget for returned context (default: 2000)'),
271
+ },
272
+ }, async (args) => {
273
+ try {
274
+ const wrappedHandler = wrapWithBuffer('memory_context', (a) => handleMemoryContext(a, embedder, sqlite, qdrantStore, neo4jStore, undefined, extractor));
275
+ const result = await wrappedHandler(args);
276
+ return { content: [{ type: 'text', text: JSON.stringify(result) }] };
277
+ }
278
+ catch (error) {
279
+ const message = error instanceof Error ? error.message : String(error);
280
+ return { content: [{ type: 'text', text: `Error: ${message}` }], isError: true };
281
+ }
282
+ });
283
+ server.registerTool('memory_forget', {
284
+ description: 'Delete or deprecate a memory. Requires confirm: true to actually delete.',
285
+ inputSchema: {
286
+ id: z.string().optional().describe('Specific memory ID to forget'),
287
+ query: z.string().optional().describe('Fuzzy match to find what to forget'),
288
+ confirm: z.boolean().optional().describe('Safety: must be true to actually delete'),
289
+ },
290
+ }, async (args) => {
291
+ try {
292
+ const result = await handleMemoryForget(args, embedder, sqlite, qdrantStore, neo4jStore);
293
+ return { content: [{ type: 'text', text: JSON.stringify(result) }] };
294
+ }
295
+ catch (error) {
296
+ const message = error instanceof Error ? error.message : String(error);
297
+ return { content: [{ type: 'text', text: `Error: ${message}` }], isError: true };
298
+ }
299
+ });
300
+ // ── Phase 2 Tools ──
301
+ server.registerTool('memory_ingest', {
302
+ description: 'Ingest arbitrary text and extract memories, entities, and relationships. Works with or without LLM.',
303
+ inputSchema: {
304
+ content: z.string().describe('Raw text to extract memories from'),
305
+ project: z.string().optional().describe('Project scope'),
306
+ source: z.string().optional().describe('Where this text came from (e.g., conversation, document, meeting-notes)'),
307
+ },
308
+ }, async (args) => {
309
+ try {
310
+ const result = await handleMemoryIngest(args, extractor, embedder, sqlite, qdrantStore, neo4jStore);
311
+ return { content: [{ type: 'text', text: JSON.stringify(result) }] };
312
+ }
313
+ catch (error) {
314
+ const message = error instanceof Error ? error.message : String(error);
315
+ return { content: [{ type: 'text', text: `Error: ${message}` }], isError: true };
316
+ }
317
+ });
318
+ server.registerTool('memory_consolidate', {
319
+ description: 'Consolidate similar or redundant memories. Supports LLM-powered smart merge or local dedup.',
320
+ inputSchema: {
321
+ project: z.string().optional().describe('Limit consolidation to a specific project'),
322
+ dry_run: z.boolean().optional().describe('Preview changes without applying them'),
323
+ max_clusters: z.number().optional().describe('Maximum clusters to process (default: 10)'),
324
+ },
325
+ }, async (args) => {
326
+ try {
327
+ const result = await handleMemoryConsolidate(args, consolidator);
328
+ return { content: [{ type: 'text', text: JSON.stringify(result) }] };
329
+ }
330
+ catch (error) {
331
+ const message = error instanceof Error ? error.message : String(error);
332
+ return { content: [{ type: 'text', text: `Error: ${message}` }], isError: true };
333
+ }
334
+ });
335
+ const configDeps = {
336
+ configStore,
337
+ llmClient,
338
+ extractor,
339
+ sqlite,
340
+ qdrant: qdrantStore,
341
+ neo4j: neo4jStore,
342
+ consolidator,
343
+ baseConfig: config,
344
+ };
345
+ server.registerTool('memory_config', {
346
+ description: 'View or modify Cortex runtime configuration. Use action "get" to see current config, or "set" with key/value to change settings.',
347
+ inputSchema: {
348
+ action: z.enum(['get', 'set']).describe('Action: get current config or set a value'),
349
+ key: z.string().optional().describe('Config key to set (e.g., anthropic_api_key, extraction_tier, auto_extract, consolidation_enabled)'),
350
+ value: z.string().optional().describe('New value for the config key'),
351
+ },
352
+ }, async (args) => {
353
+ try {
354
+ const result = await handleMemoryConfig(args, configDeps);
355
+ return { content: [{ type: 'text', text: JSON.stringify(result) }] };
356
+ }
357
+ catch (error) {
358
+ const message = error instanceof Error ? error.message : String(error);
359
+ return { content: [{ type: 'text', text: `Error: ${message}` }], isError: true };
360
+ }
361
+ });
362
+ // ── Start Transport ──
363
+ const transport = new StdioServerTransport();
364
+ await server.connect(transport);
365
+ console.error('[cortex] Cortex MCP server running on stdio.');
366
+ // ── Graceful Shutdown ──
367
+ const shutdown = async () => {
368
+ console.error('[cortex] Shutting down...');
369
+ // Stop auto-consolidation
370
+ consolidator.stopAutoConsolidation();
371
+ // Flush conversation buffer
372
+ if (conversationBuffer) {
373
+ conversationBuffer.stop();
374
+ try {
375
+ await conversationBuffer.flush();
376
+ }
377
+ catch { /* ignore flush errors during shutdown */ }
378
+ }
379
+ try {
380
+ await server.close();
381
+ }
382
+ catch { /* ignore */ }
383
+ sqlite.close();
384
+ try {
385
+ await neo4jStore.close();
386
+ }
387
+ catch { /* ignore */ }
388
+ console.error('[cortex] Shutdown complete.');
389
+ process.exit(0);
390
+ };
391
+ process.on('SIGINT', shutdown);
392
+ process.on('SIGTERM', shutdown);
393
+ }
394
+ main().catch((error) => {
395
+ console.error(`[cortex] Fatal error: ${error}`);
396
+ process.exit(1);
397
+ });
398
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import type { LLMClient } from '../types/index.js';
2
+ export declare class AnthropicClient implements LLMClient {
3
+ private client;
4
+ private apiKey;
5
+ private model;
6
+ private totalInputTokens;
7
+ private totalOutputTokens;
8
+ constructor(apiKey: string, model: string);
9
+ isAvailable(): boolean;
10
+ setApiKey(key: string): Promise<boolean>;
11
+ extractJSON<T>(systemPrompt: string, userContent: string): Promise<T | null>;
12
+ getUsage(): {
13
+ inputTokens: number;
14
+ outputTokens: number;
15
+ };
16
+ getModel(): string;
17
+ }
18
+ //# sourceMappingURL=anthropic-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anthropic-client.d.ts","sourceRoot":"","sources":["../../src/llm/anthropic-client.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAKnD,qBAAa,eAAgB,YAAW,SAAS;IAC/C,OAAO,CAAC,MAAM,CAA0B;IACxC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,gBAAgB,CAAK;IAC7B,OAAO,CAAC,iBAAiB,CAAK;gBAElB,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;IAQzC,WAAW,IAAI,OAAO;IAIhB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAwBxC,WAAW,CAAC,CAAC,EAAE,YAAY,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC;IAkDlF,QAAQ,IAAI;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE;IAOzD,QAAQ,IAAI,MAAM;CAGnB"}
@@ -0,0 +1,116 @@
1
+ import Anthropic from '@anthropic-ai/sdk';
2
+ const MAX_RETRIES = 3;
3
+ const BASE_DELAY_MS = 1000;
4
+ export class AnthropicClient {
5
+ client = null;
6
+ apiKey;
7
+ model;
8
+ totalInputTokens = 0;
9
+ totalOutputTokens = 0;
10
+ constructor(apiKey, model) {
11
+ this.apiKey = apiKey;
12
+ this.model = model;
13
+ if (apiKey) {
14
+ this.client = new Anthropic({ apiKey });
15
+ }
16
+ }
17
+ isAvailable() {
18
+ return this.client !== null && this.apiKey.length > 0;
19
+ }
20
+ async setApiKey(key) {
21
+ if (!key || !key.startsWith('sk-ant-')) {
22
+ return false;
23
+ }
24
+ const testClient = new Anthropic({ apiKey: key });
25
+ try {
26
+ // Validate with a minimal API call
27
+ await testClient.messages.create({
28
+ model: this.model,
29
+ max_tokens: 1,
30
+ messages: [{ role: 'user', content: 'test' }],
31
+ });
32
+ this.apiKey = key;
33
+ this.client = testClient;
34
+ console.error(`[cortex] LLM API key updated and validated.`);
35
+ return true;
36
+ }
37
+ catch (error) {
38
+ const message = error instanceof Error ? error.message : String(error);
39
+ console.error(`[cortex] API key validation failed: ${message}`);
40
+ return false;
41
+ }
42
+ }
43
+ async extractJSON(systemPrompt, userContent) {
44
+ if (!this.isAvailable()) {
45
+ return null;
46
+ }
47
+ for (let attempt = 0; attempt < MAX_RETRIES; attempt++) {
48
+ try {
49
+ const response = await this.client.messages.create({
50
+ model: this.model,
51
+ max_tokens: 2048,
52
+ system: systemPrompt,
53
+ messages: [{ role: 'user', content: userContent }],
54
+ });
55
+ // Track token usage
56
+ this.totalInputTokens += response.usage.input_tokens;
57
+ this.totalOutputTokens += response.usage.output_tokens;
58
+ console.error(`[cortex] LLM tokens: +${response.usage.input_tokens}in/+${response.usage.output_tokens}out ` +
59
+ `(total: ${this.totalInputTokens}in/${this.totalOutputTokens}out)`);
60
+ // Extract text content
61
+ const textBlock = response.content.find(b => b.type === 'text');
62
+ if (!textBlock || textBlock.type !== 'text') {
63
+ return null;
64
+ }
65
+ return parseJSONResponse(textBlock.text);
66
+ }
67
+ catch (error) {
68
+ const message = error instanceof Error ? error.message : String(error);
69
+ const isRetryable = message.includes('rate_limit') ||
70
+ message.includes('overloaded') ||
71
+ message.includes('529') ||
72
+ message.includes('500');
73
+ if (!isRetryable || attempt === MAX_RETRIES - 1) {
74
+ console.error(`[cortex] LLM call failed (attempt ${attempt + 1}/${MAX_RETRIES}): ${message}`);
75
+ return null;
76
+ }
77
+ const delay = BASE_DELAY_MS * Math.pow(2, attempt);
78
+ console.error(`[cortex] LLM call retrying in ${delay}ms (attempt ${attempt + 1}/${MAX_RETRIES}): ${message}`);
79
+ await sleep(delay);
80
+ }
81
+ }
82
+ return null;
83
+ }
84
+ getUsage() {
85
+ return {
86
+ inputTokens: this.totalInputTokens,
87
+ outputTokens: this.totalOutputTokens,
88
+ };
89
+ }
90
+ getModel() {
91
+ return this.model;
92
+ }
93
+ }
94
+ function parseJSONResponse(text) {
95
+ // Strip markdown code fences if present
96
+ let cleaned = text.trim();
97
+ if (cleaned.startsWith('```')) {
98
+ const firstNewline = cleaned.indexOf('\n');
99
+ cleaned = cleaned.slice(firstNewline + 1);
100
+ if (cleaned.endsWith('```')) {
101
+ cleaned = cleaned.slice(0, -3);
102
+ }
103
+ cleaned = cleaned.trim();
104
+ }
105
+ try {
106
+ return JSON.parse(cleaned);
107
+ }
108
+ catch {
109
+ console.error(`[cortex] Failed to parse LLM JSON response: ${cleaned.slice(0, 200)}`);
110
+ return null;
111
+ }
112
+ }
113
+ function sleep(ms) {
114
+ return new Promise(resolve => setTimeout(resolve, ms));
115
+ }
116
+ //# sourceMappingURL=anthropic-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anthropic-client.js","sourceRoot":"","sources":["../../src/llm/anthropic-client.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,mBAAmB,CAAC;AAG1C,MAAM,WAAW,GAAG,CAAC,CAAC;AACtB,MAAM,aAAa,GAAG,IAAI,CAAC;AAE3B,MAAM,OAAO,eAAe;IAClB,MAAM,GAAqB,IAAI,CAAC;IAChC,MAAM,CAAS;IACf,KAAK,CAAS;IACd,gBAAgB,GAAG,CAAC,CAAC;IACrB,iBAAiB,GAAG,CAAC,CAAC;IAE9B,YAAY,MAAc,EAAE,KAAa;QACvC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,MAAM,EAAE,CAAC;YACX,IAAI,CAAC,MAAM,GAAG,IAAI,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC;IAED,WAAW;QACT,OAAO,IAAI,CAAC,MAAM,KAAK,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;IACxD,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,GAAW;QACzB,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YACvC,OAAO,KAAK,CAAC;QACf,CAAC;QAED,MAAM,UAAU,GAAG,IAAI,SAAS,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;QAClD,IAAI,CAAC;YACH,mCAAmC;YACnC,MAAM,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC;gBAC/B,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,UAAU,EAAE,CAAC;gBACb,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;aAC9C,CAAC,CAAC;YACH,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC;YAClB,IAAI,CAAC,MAAM,GAAG,UAAU,CAAC;YACzB,OAAO,CAAC,KAAK,CAAC,6CAA6C,CAAC,CAAC;YAC7D,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACvE,OAAO,CAAC,KAAK,CAAC,uCAAuC,OAAO,EAAE,CAAC,CAAC;YAChE,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,KAAK,CAAC,WAAW,CAAI,YAAoB,EAAE,WAAmB;QAC5D,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;YACxB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,WAAW,EAAE,OAAO,EAAE,EAAE,CAAC;YACvD,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;oBAClD,KAAK,EAAE,IAAI,CAAC,KAAK;oBACjB,UAAU,EAAE,IAAI;oBAChB,MAAM,EAAE,YAAY;oBACpB,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC;iBACnD,CAAC,CAAC;gBAEH,oBAAoB;gBACpB,IAAI,CAAC,gBAAgB,IAAI,QAAQ,CAAC,KAAK,CAAC,YAAY,CAAC;gBACrD,IAAI,CAAC,iBAAiB,IAAI,QAAQ,CAAC,KAAK,CAAC,aAAa,CAAC;gBACvD,OAAO,CAAC,KAAK,CACX,yBAAyB,QAAQ,CAAC,KAAK,CAAC,YAAY,OAAO,QAAQ,CAAC,KAAK,CAAC,aAAa,MAAM;oBAC7F,WAAW,IAAI,CAAC,gBAAgB,MAAM,IAAI,CAAC,iBAAiB,MAAM,CACnE,CAAC;gBAEF,uBAAuB;gBACvB,MAAM,SAAS,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC;gBAChE,IAAI,CAAC,SAAS,IAAI,SAAS,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;oBAC5C,OAAO,IAAI,CAAC;gBACd,CAAC;gBAED,OAAO,iBAAiB,CAAI,SAAS,CAAC,IAAI,CAAC,CAAC;YAC9C,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBACvE,MAAM,WAAW,GAAG,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC;oBAChD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC;oBAC9B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC;oBACvB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;gBAE1B,IAAI,CAAC,WAAW,IAAI,OAAO,KAAK,WAAW,GAAG,CAAC,EAAE,CAAC;oBAChD,OAAO,CAAC,KAAK,CAAC,qCAAqC,OAAO,GAAG,CAAC,IAAI,WAAW,MAAM,OAAO,EAAE,CAAC,CAAC;oBAC9F,OAAO,IAAI,CAAC;gBACd,CAAC;gBAED,MAAM,KAAK,GAAG,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;gBACnD,OAAO,CAAC,KAAK,CAAC,iCAAiC,KAAK,eAAe,OAAO,GAAG,CAAC,IAAI,WAAW,MAAM,OAAO,EAAE,CAAC,CAAC;gBAC9G,MAAM,KAAK,CAAC,KAAK,CAAC,CAAC;YACrB,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED,QAAQ;QACN,OAAO;YACL,WAAW,EAAE,IAAI,CAAC,gBAAgB;YAClC,YAAY,EAAE,IAAI,CAAC,iBAAiB;SACrC,CAAC;IACJ,CAAC;IAED,QAAQ;QACN,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;CACF;AAED,SAAS,iBAAiB,CAAI,IAAY;IACxC,wCAAwC;IACxC,IAAI,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IAC1B,IAAI,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;QAC9B,MAAM,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC3C,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC;QAC1C,IAAI,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YAC5B,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACjC,CAAC;QACD,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAC3B,CAAC;IAED,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAM,CAAC;IAClC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,KAAK,CAAC,+CAA+C,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;QACtF,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AACzD,CAAC"}
@@ -0,0 +1,18 @@
1
+ import type { RankedSource, ScoredMemory, Memory } from '../types/index.js';
2
+ /**
3
+ * Merge results from semantic search, graph traversal, and recent memories.
4
+ * Deduplicates by memory ID, applies scope boosting, and truncates to token budget.
5
+ */
6
+ export declare function mergeAndRank(semanticResults: ScoredMemory[], graphMemories: Array<{
7
+ id: string;
8
+ content: string;
9
+ score: number;
10
+ }>, recentMemories: Memory[], currentProject: string | null, relatedProjects?: string[], maxTokens?: number): {
11
+ ranked: RankedSource[];
12
+ truncated: boolean;
13
+ };
14
+ /**
15
+ * Format ranked results into a coherent context block.
16
+ */
17
+ export declare function formatContext(ranked: RankedSource[]): string;
18
+ //# sourceMappingURL=ranker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ranker.d.ts","sourceRoot":"","sources":["../../src/orchestration/ranker.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAM5E;;;GAGG;AACH,wBAAgB,YAAY,CAC1B,eAAe,EAAE,YAAY,EAAE,EAC/B,aAAa,EAAE,KAAK,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,EACpE,cAAc,EAAE,MAAM,EAAE,EACxB,cAAc,EAAE,MAAM,GAAG,IAAI,EAC7B,eAAe,CAAC,EAAE,MAAM,EAAE,EAC1B,SAAS,GAAE,MAAa,GACvB;IAAE,MAAM,EAAE,YAAY,EAAE,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,CAsGhD;AASD;;GAEG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,CAS5D"}