@cartisien/engram-mcp 0.2.0 → 0.3.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 (66) hide show
  1. package/LICENSE +21 -0
  2. package/dist/analysis/emotions.d.ts +16 -0
  3. package/dist/analysis/emotions.js +130 -0
  4. package/dist/analysis/emotions.js.map +1 -0
  5. package/dist/analysis/entities.d.ts +15 -0
  6. package/dist/analysis/entities.js +182 -0
  7. package/dist/analysis/entities.js.map +1 -0
  8. package/dist/analysis/themes.d.ts +11 -0
  9. package/dist/analysis/themes.js +151 -0
  10. package/dist/analysis/themes.js.map +1 -0
  11. package/dist/client.d.ts +3 -0
  12. package/dist/client.js +31 -0
  13. package/dist/client.js.map +1 -0
  14. package/dist/config.d.ts +13 -0
  15. package/dist/config.js +20 -0
  16. package/dist/config.js.map +1 -0
  17. package/dist/response.d.ts +17 -0
  18. package/dist/response.js +17 -0
  19. package/dist/response.js.map +1 -0
  20. package/dist/server.d.ts +7 -0
  21. package/dist/server.js +104 -0
  22. package/dist/server.js.map +1 -0
  23. package/dist/tools/consolidate.d.ts +41 -0
  24. package/dist/tools/consolidate.js +53 -0
  25. package/dist/tools/consolidate.js.map +1 -0
  26. package/dist/tools/context.d.ts +44 -0
  27. package/dist/tools/context.js +186 -0
  28. package/dist/tools/context.js.map +1 -0
  29. package/dist/tools/detect_changes.d.ts +35 -0
  30. package/dist/tools/detect_changes.js +178 -0
  31. package/dist/tools/detect_changes.js.map +1 -0
  32. package/dist/tools/forget.d.ts +38 -0
  33. package/dist/tools/forget.js +38 -0
  34. package/dist/tools/forget.js.map +1 -0
  35. package/dist/tools/graph.d.ts +40 -0
  36. package/dist/tools/graph.js +74 -0
  37. package/dist/tools/graph.js.map +1 -0
  38. package/dist/tools/impact.d.ts +39 -0
  39. package/dist/tools/impact.js +143 -0
  40. package/dist/tools/impact.js.map +1 -0
  41. package/dist/tools/process_detect.d.ts +49 -0
  42. package/dist/tools/process_detect.js +218 -0
  43. package/dist/tools/process_detect.js.map +1 -0
  44. package/dist/tools/recall.d.ts +81 -0
  45. package/dist/tools/recall.js +134 -0
  46. package/dist/tools/recall.js.map +1 -0
  47. package/dist/tools/remember.d.ts +47 -0
  48. package/dist/tools/remember.js +79 -0
  49. package/dist/tools/remember.js.map +1 -0
  50. package/dist/tools/search.d.ts +72 -0
  51. package/dist/tools/search.js +96 -0
  52. package/dist/tools/search.js.map +1 -0
  53. package/dist/tools/stats.d.ts +23 -0
  54. package/dist/tools/stats.js +47 -0
  55. package/dist/tools/stats.js.map +1 -0
  56. package/package.json +29 -14
  57. package/README.md +0 -114
  58. package/dist/engram.d.ts +0 -99
  59. package/dist/engram.js +0 -283
  60. package/dist/src/index.d.ts +0 -2
  61. package/dist/src/index.js +0 -322
  62. package/engram.ts +0 -385
  63. package/src/index.ts +0 -336
  64. package/tests/mcp.test.ts +0 -274
  65. package/tsconfig.json +0 -17
  66. package/tsconfig.test.json +0 -5
package/dist/config.js ADDED
@@ -0,0 +1,20 @@
1
+ import { homedir } from 'os';
2
+ import { join } from 'path';
3
+ function env(key, fallback) {
4
+ return process.env[key] ?? fallback;
5
+ }
6
+ export function loadConfig() {
7
+ return {
8
+ dbPath: env('ENGRAM_DB_PATH', join(homedir(), '.engram', 'memory.db')),
9
+ sessionId: env('ENGRAM_SESSION_ID', 'default'),
10
+ embeddingUrl: env('ENGRAM_EMBEDDING_URL', 'http://localhost:11434'),
11
+ embeddingModel: env('ENGRAM_EMBEDDING_MODEL', 'nomic-embed-text'),
12
+ embeddingProvider: env('ENGRAM_EMBEDDING_PROVIDER', 'ollama'),
13
+ maxContextLength: parseInt(env('ENGRAM_MAX_CONTEXT', '4000'), 10),
14
+ dedupThreshold: parseFloat(env('ENGRAM_DEDUP_THRESHOLD', '0.95')),
15
+ enableWAL: env('ENGRAM_ENABLE_WAL', 'true') === 'true',
16
+ semanticSearch: env('ENGRAM_SEMANTIC_SEARCH', 'true') === 'true',
17
+ graphMemory: true, // always enabled in MCP server
18
+ };
19
+ }
20
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAe5B,SAAS,GAAG,CAAC,GAAW,EAAE,QAAgB;IACxC,OAAO,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,QAAQ,CAAC;AACtC,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,OAAO;QACL,MAAM,EAAE,GAAG,CAAC,gBAAgB,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;QACtE,SAAS,EAAE,GAAG,CAAC,mBAAmB,EAAE,SAAS,CAAC;QAC9C,YAAY,EAAE,GAAG,CAAC,sBAAsB,EAAE,wBAAwB,CAAC;QACnE,cAAc,EAAE,GAAG,CAAC,wBAAwB,EAAE,kBAAkB,CAAC;QACjE,iBAAiB,EAAE,GAAG,CAAC,2BAA2B,EAAE,QAAQ,CAAC;QAC7D,gBAAgB,EAAE,QAAQ,CAAC,GAAG,CAAC,oBAAoB,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC;QACjE,cAAc,EAAE,UAAU,CAAC,GAAG,CAAC,wBAAwB,EAAE,MAAM,CAAC,CAAC;QACjE,SAAS,EAAE,GAAG,CAAC,mBAAmB,EAAE,MAAM,CAAC,KAAK,MAAM;QACtD,cAAc,EAAE,GAAG,CAAC,wBAAwB,EAAE,MAAM,CAAC,KAAK,MAAM;QAChE,WAAW,EAAE,IAAI,EAAE,+BAA+B;KACnD,CAAC;AACJ,CAAC"}
@@ -0,0 +1,17 @@
1
+ export interface McpResponse<T = unknown> {
2
+ success: boolean;
3
+ data?: T;
4
+ error?: {
5
+ code: string;
6
+ message: string;
7
+ suggestions?: string[];
8
+ };
9
+ meta: {
10
+ query_time_ms: number;
11
+ version: string;
12
+ session_id: string;
13
+ };
14
+ suggestions?: string[];
15
+ }
16
+ export declare function ok<T>(data: T, sessionId: string, startMs: number, suggestions?: string[]): McpResponse<T>;
17
+ export declare function fail(code: string, message: string, sessionId: string, startMs: number, suggestions?: string[]): McpResponse;
@@ -0,0 +1,17 @@
1
+ const VERSION = '0.2.0';
2
+ export function ok(data, sessionId, startMs, suggestions) {
3
+ return {
4
+ success: true,
5
+ data,
6
+ meta: { query_time_ms: Date.now() - startMs, version: VERSION, session_id: sessionId },
7
+ ...(suggestions?.length ? { suggestions } : {}),
8
+ };
9
+ }
10
+ export function fail(code, message, sessionId, startMs, suggestions) {
11
+ return {
12
+ success: false,
13
+ error: { code, message, ...(suggestions?.length ? { suggestions } : {}) },
14
+ meta: { query_time_ms: Date.now() - startMs, version: VERSION, session_id: sessionId },
15
+ };
16
+ }
17
+ //# sourceMappingURL=response.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"response.js","sourceRoot":"","sources":["../src/response.ts"],"names":[],"mappings":"AAQA,MAAM,OAAO,GAAG,OAAO,CAAC;AAExB,MAAM,UAAU,EAAE,CAChB,IAAO,EACP,SAAiB,EACjB,OAAe,EACf,WAAsB;IAEtB,OAAO;QACL,OAAO,EAAE,IAAI;QACb,IAAI;QACJ,IAAI,EAAE,EAAE,aAAa,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE;QACtF,GAAG,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAChD,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,IAAI,CAClB,IAAY,EACZ,OAAe,EACf,SAAiB,EACjB,OAAe,EACf,WAAsB;IAEtB,OAAO;QACL,OAAO,EAAE,KAAK;QACd,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE;QACzE,IAAI,EAAE,EAAE,aAAa,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE;KACvF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Engram MCP Server v0.2.0
4
+ * Exposes agent memory as structured relational intelligence.
5
+ * Transport: stdio
6
+ */
7
+ export {};
package/dist/server.js ADDED
@@ -0,0 +1,104 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Engram MCP Server v0.2.0
4
+ * Exposes agent memory as structured relational intelligence.
5
+ * Transport: stdio
6
+ */
7
+ import { Server } from '@modelcontextprotocol/sdk/server/index.js';
8
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
9
+ import { CallToolRequestSchema, ListToolsRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
10
+ import { getEngram } from './client.js';
11
+ import { toolRemember, REMEMBER_SCHEMA } from './tools/remember.js';
12
+ import { toolRecall, RECALL_SCHEMA } from './tools/recall.js';
13
+ import { toolSearch, SEARCH_SCHEMA } from './tools/search.js';
14
+ import { toolContext, CONTEXT_SCHEMA } from './tools/context.js';
15
+ import { toolImpact, IMPACT_SCHEMA } from './tools/impact.js';
16
+ import { toolDetectChanges, DETECT_CHANGES_SCHEMA } from './tools/detect_changes.js';
17
+ import { toolConsolidate, CONSOLIDATE_SCHEMA } from './tools/consolidate.js';
18
+ import { toolProcessDetect, PROCESS_DETECT_SCHEMA } from './tools/process_detect.js';
19
+ import { toolForget, FORGET_SCHEMA } from './tools/forget.js';
20
+ import { toolStats, STATS_SCHEMA } from './tools/stats.js';
21
+ import { toolGraph, GRAPH_SCHEMA } from './tools/graph.js';
22
+ const ALL_TOOLS = [
23
+ REMEMBER_SCHEMA,
24
+ RECALL_SCHEMA,
25
+ SEARCH_SCHEMA,
26
+ CONTEXT_SCHEMA,
27
+ IMPACT_SCHEMA,
28
+ DETECT_CHANGES_SCHEMA,
29
+ CONSOLIDATE_SCHEMA,
30
+ PROCESS_DETECT_SCHEMA,
31
+ FORGET_SCHEMA,
32
+ STATS_SCHEMA,
33
+ GRAPH_SCHEMA,
34
+ ];
35
+ async function main() {
36
+ const server = new Server({ name: 'engram', version: '0.2.0' }, { capabilities: { tools: {} } });
37
+ // List available tools
38
+ server.setRequestHandler(ListToolsRequestSchema, async () => ({
39
+ tools: ALL_TOOLS.map(t => ({
40
+ name: t.name,
41
+ description: t.description,
42
+ inputSchema: t.inputSchema,
43
+ })),
44
+ }));
45
+ // Handle tool calls
46
+ server.setRequestHandler(CallToolRequestSchema, async (request) => {
47
+ const { name, arguments: args = {} } = request.params;
48
+ const engram = await getEngram();
49
+ let result;
50
+ // Cast via unknown to satisfy TypeScript — runtime validation is in each tool handler
51
+ const a = args;
52
+ switch (name) {
53
+ case 'remember':
54
+ result = await toolRemember(engram, a);
55
+ break;
56
+ case 'recall':
57
+ result = await toolRecall(engram, a);
58
+ break;
59
+ case 'search':
60
+ result = await toolSearch(engram, a);
61
+ break;
62
+ case 'context':
63
+ result = await toolContext(engram, a);
64
+ break;
65
+ case 'impact':
66
+ result = await toolImpact(engram, a);
67
+ break;
68
+ case 'detect_changes':
69
+ result = await toolDetectChanges(engram, a);
70
+ break;
71
+ case 'consolidate':
72
+ result = await toolConsolidate(engram, a);
73
+ break;
74
+ case 'process_detect':
75
+ result = await toolProcessDetect(engram, a);
76
+ break;
77
+ case 'forget':
78
+ result = await toolForget(engram, a);
79
+ break;
80
+ case 'stats':
81
+ result = await toolStats(engram, a);
82
+ break;
83
+ case 'graph':
84
+ result = await toolGraph(engram, a);
85
+ break;
86
+ default:
87
+ result = {
88
+ success: false,
89
+ error: { code: 'UNKNOWN_TOOL', message: `Unknown tool: ${name}` },
90
+ meta: { query_time_ms: 0, version: '0.2.0', session_id: 'unknown' },
91
+ };
92
+ }
93
+ return {
94
+ content: [{ type: 'text', text: JSON.stringify(result, null, 2) }],
95
+ };
96
+ });
97
+ const transport = new StdioServerTransport();
98
+ await server.connect(transport);
99
+ }
100
+ main().catch((err) => {
101
+ process.stderr.write(`Engram MCP fatal error: ${err}\n`);
102
+ process.exit(1);
103
+ });
104
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ import type { Engram } from '@cartisien/engram';
2
+ export interface ConsolidateInput {
3
+ trigger?: 'manual' | 'scheduled' | 'threshold';
4
+ session_id?: string;
5
+ keep?: number;
6
+ aggressiveness?: 'conservative' | 'normal' | 'aggressive';
7
+ dry_run?: boolean;
8
+ }
9
+ export declare function toolConsolidate(engram: Engram, input: ConsolidateInput): Promise<import("../response.js").McpResponse<unknown>>;
10
+ export declare const CONSOLIDATE_SCHEMA: {
11
+ readonly name: "consolidate";
12
+ readonly description: "Consolidate working memories into long-term storage. Archives old memories beyond the keep threshold.";
13
+ readonly inputSchema: {
14
+ readonly type: "object";
15
+ readonly properties: {
16
+ readonly trigger: {
17
+ readonly type: "string";
18
+ readonly enum: readonly ["manual", "scheduled", "threshold"];
19
+ readonly default: "manual";
20
+ };
21
+ readonly session_id: {
22
+ readonly type: "string";
23
+ };
24
+ readonly keep: {
25
+ readonly type: "number";
26
+ readonly description: "Number of working memories to keep (overrides aggressiveness)";
27
+ };
28
+ readonly aggressiveness: {
29
+ readonly type: "string";
30
+ readonly enum: readonly ["conservative", "normal", "aggressive"];
31
+ readonly default: "normal";
32
+ readonly description: "conservative=keep 50, normal=keep 20, aggressive=keep 10";
33
+ };
34
+ readonly dry_run: {
35
+ readonly type: "boolean";
36
+ readonly default: false;
37
+ readonly description: "Preview consolidation without making changes";
38
+ };
39
+ };
40
+ };
41
+ };
@@ -0,0 +1,53 @@
1
+ import { ok, fail } from '../response.js';
2
+ import { defaultSession } from '../client.js';
3
+ const KEEP_BY_AGGRESSIVENESS = {
4
+ conservative: 50,
5
+ normal: 20,
6
+ aggressive: 10,
7
+ };
8
+ export async function toolConsolidate(engram, input) {
9
+ const start = Date.now();
10
+ const sessionId = input.session_id ?? defaultSession();
11
+ const aggressiveness = input.aggressiveness ?? 'normal';
12
+ const keep = input.keep ?? KEEP_BY_AGGRESSIVENESS[aggressiveness];
13
+ const dryRun = input.dry_run ?? false;
14
+ try {
15
+ const result = await engram.consolidate(sessionId, { keep, dryRun });
16
+ const suggestions = [];
17
+ if (result.archived > 0) {
18
+ suggestions.push(`${result.archived} memories archived — use tier_filter: ['archived'] to access them`);
19
+ }
20
+ if (result.summarized === 0) {
21
+ suggestions.push(`Nothing to consolidate — session has fewer than ${keep} working memories`);
22
+ }
23
+ return ok({
24
+ dry_run: dryRun,
25
+ trigger: input.trigger ?? 'manual',
26
+ processed: result.summarized,
27
+ keep_threshold: keep,
28
+ actions: {
29
+ promoted_to_long_term: result.created,
30
+ archived: result.archived,
31
+ summarized: result.summarized,
32
+ },
33
+ }, sessionId, start, suggestions);
34
+ }
35
+ catch (err) {
36
+ return fail('CONSOLIDATE_FAILED', String(err), sessionId, start);
37
+ }
38
+ }
39
+ export const CONSOLIDATE_SCHEMA = {
40
+ name: 'consolidate',
41
+ description: 'Consolidate working memories into long-term storage. Archives old memories beyond the keep threshold.',
42
+ inputSchema: {
43
+ type: 'object',
44
+ properties: {
45
+ trigger: { type: 'string', enum: ['manual', 'scheduled', 'threshold'], default: 'manual' },
46
+ session_id: { type: 'string' },
47
+ keep: { type: 'number', description: 'Number of working memories to keep (overrides aggressiveness)' },
48
+ aggressiveness: { type: 'string', enum: ['conservative', 'normal', 'aggressive'], default: 'normal', description: 'conservative=keep 50, normal=keep 20, aggressive=keep 10' },
49
+ dry_run: { type: 'boolean', default: false, description: 'Preview consolidation without making changes' },
50
+ },
51
+ },
52
+ };
53
+ //# sourceMappingURL=consolidate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"consolidate.js","sourceRoot":"","sources":["../../src/tools/consolidate.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAU9C,MAAM,sBAAsB,GAAG;IAC7B,YAAY,EAAE,EAAE;IAChB,MAAM,EAAE,EAAE;IACV,UAAU,EAAE,EAAE;CACf,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,MAAc,EAAE,KAAuB;IAC3E,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACzB,MAAM,SAAS,GAAG,KAAK,CAAC,UAAU,IAAI,cAAc,EAAE,CAAC;IAEvD,MAAM,cAAc,GAAG,KAAK,CAAC,cAAc,IAAI,QAAQ,CAAC;IACxD,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,IAAI,sBAAsB,CAAC,cAAc,CAAC,CAAC;IAClE,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC;IAEtC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;QAErE,MAAM,WAAW,GAAa,EAAE,CAAC;QACjC,IAAI,MAAM,CAAC,QAAQ,GAAG,CAAC,EAAE,CAAC;YACxB,WAAW,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,QAAQ,mEAAmE,CAAC,CAAC;QAC1G,CAAC;QACD,IAAI,MAAM,CAAC,UAAU,KAAK,CAAC,EAAE,CAAC;YAC5B,WAAW,CAAC,IAAI,CAAC,mDAAmD,IAAI,mBAAmB,CAAC,CAAC;QAC/F,CAAC;QAED,OAAO,EAAE,CAAC;YACR,OAAO,EAAE,MAAM;YACf,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI,QAAQ;YAClC,SAAS,EAAE,MAAM,CAAC,UAAU;YAC5B,cAAc,EAAE,IAAI;YACpB,OAAO,EAAE;gBACP,qBAAqB,EAAE,MAAM,CAAC,OAAO;gBACrC,QAAQ,EAAE,MAAM,CAAC,QAAQ;gBACzB,UAAU,EAAE,MAAM,CAAC,UAAU;aAC9B;SACF,EAAE,SAAS,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC;IAEpC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,IAAI,CAAC,oBAAoB,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;IACnE,CAAC;AACH,CAAC;AAED,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,IAAI,EAAE,aAAa;IACnB,WAAW,EAAE,uGAAuG;IACpH,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,QAAQ,EAAE,WAAW,EAAE,WAAW,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE;YAC1F,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YAC9B,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,+DAA+D,EAAE;YACtG,cAAc,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,cAAc,EAAE,QAAQ,EAAE,YAAY,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,0DAA0D,EAAE;YAC9K,OAAO,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,8CAA8C,EAAE;SAC1G;KACF;CACO,CAAC"}
@@ -0,0 +1,44 @@
1
+ import type { Engram } from '@cartisien/engram';
2
+ export interface ContextInput {
3
+ target: string;
4
+ target_type: 'entity' | 'theme' | 'memory';
5
+ session_id?: string;
6
+ depth?: number;
7
+ include_memories?: boolean;
8
+ include_metrics?: boolean;
9
+ }
10
+ export declare function toolContext(engram: Engram, input: ContextInput): Promise<import("../response.js").McpResponse<unknown>>;
11
+ export declare const CONTEXT_SCHEMA: {
12
+ readonly name: "context";
13
+ readonly description: "Get 360° context around a specific entity, theme, or memory. Returns timeline, relationships, emotional arc, and key memories.";
14
+ readonly inputSchema: {
15
+ readonly type: "object";
16
+ readonly properties: {
17
+ readonly target: {
18
+ readonly type: "string";
19
+ readonly description: "Entity name, theme name, or memory_id";
20
+ };
21
+ readonly target_type: {
22
+ readonly type: "string";
23
+ readonly enum: readonly ["entity", "theme", "memory"];
24
+ };
25
+ readonly session_id: {
26
+ readonly type: "string";
27
+ };
28
+ readonly depth: {
29
+ readonly type: "number";
30
+ readonly default: 2;
31
+ readonly description: "Relationship depth (1-3)";
32
+ };
33
+ readonly include_memories: {
34
+ readonly type: "boolean";
35
+ readonly default: true;
36
+ };
37
+ readonly include_metrics: {
38
+ readonly type: "boolean";
39
+ readonly default: true;
40
+ };
41
+ };
42
+ readonly required: readonly ["target", "target_type"];
43
+ };
44
+ };
@@ -0,0 +1,186 @@
1
+ import { themeNames } from '../analysis/themes.js';
2
+ import { scoreEmotion } from '../analysis/emotions.js';
3
+ import { ok, fail } from '../response.js';
4
+ import { defaultSession } from '../client.js';
5
+ export async function toolContext(engram, input) {
6
+ const start = Date.now();
7
+ const sessionId = input.session_id ?? defaultSession();
8
+ if (!input.target?.trim()) {
9
+ return fail('INVALID_INPUT', 'target is required', sessionId, start);
10
+ }
11
+ if (!['entity', 'theme', 'memory'].includes(input.target_type)) {
12
+ return fail('INVALID_INPUT', 'target_type must be entity, theme, or memory', sessionId, start);
13
+ }
14
+ try {
15
+ if (input.target_type === 'entity') {
16
+ return await entityContext(engram, input, sessionId, start);
17
+ }
18
+ else if (input.target_type === 'theme') {
19
+ return await themeContext(engram, input, sessionId, start);
20
+ }
21
+ else {
22
+ return await memoryContext(engram, input, sessionId, start);
23
+ }
24
+ }
25
+ catch (err) {
26
+ return fail('CONTEXT_FAILED', String(err), sessionId, start);
27
+ }
28
+ }
29
+ async function entityContext(engram, input, sessionId, start) {
30
+ const graphResult = await engram.graph(sessionId, input.target.toLowerCase());
31
+ if (!graphResult.relatedMemories.length && !graphResult.relationships.length) {
32
+ return fail('ENTITY_NOT_FOUND', `Entity '${input.target}' not found in memory`, sessionId, start, [
33
+ `Use 'remember' to add memories mentioning '${input.target}'`,
34
+ `Try searching with 'recall' using query: '${input.target}'`,
35
+ ]);
36
+ }
37
+ const memories = graphResult.relatedMemories.slice(0, 20);
38
+ // Build timeline from memories
39
+ const timeline = memories
40
+ .sort((a, b) => a.timestamp.getTime() - b.timestamp.getTime())
41
+ .map(m => ({
42
+ date: m.timestamp.toISOString().slice(0, 10),
43
+ memory_id: m.id,
44
+ summary: m.content.slice(0, 100) + (m.content.length > 100 ? '...' : ''),
45
+ }));
46
+ // Emotional arc: group by month
47
+ const emotionalArc = buildEmotionalArc(memories.map(m => ({
48
+ date: m.timestamp,
49
+ tone: scoreEmotion(m.content).tone,
50
+ })));
51
+ // Theme profile
52
+ const allContent = memories.map(m => m.content).join(' ');
53
+ const themes = themeNames(allContent, 5);
54
+ // Key memories: highest importance
55
+ const keyMemories = memories
56
+ .sort((a, b) => (b.importance ?? 0.5) - (a.importance ?? 0.5))
57
+ .slice(0, 3)
58
+ .map(m => ({
59
+ id: m.id,
60
+ summary: m.content.slice(0, 120) + (m.content.length > 120 ? '...' : ''),
61
+ importance: m.importance ?? 0.5,
62
+ timestamp: m.timestamp.toISOString(),
63
+ }));
64
+ const firstSeen = memories[0]?.timestamp.toISOString() ?? null;
65
+ return ok({
66
+ target: {
67
+ name: input.target,
68
+ type: 'entity',
69
+ first_mentioned: firstSeen,
70
+ mention_count: memories.length,
71
+ },
72
+ relationships: {
73
+ entities: graphResult.relationships.map(r => ({
74
+ name: r.target,
75
+ relation: r.relation,
76
+ type: r.type,
77
+ confidence: r.confidence ?? 0.5,
78
+ })),
79
+ },
80
+ timeline,
81
+ themes,
82
+ emotional_arc: emotionalArc,
83
+ key_memories: keyMemories,
84
+ }, sessionId, start, [`Try 'recall' with entity_filter: ['${input.target}'] for full history`]);
85
+ }
86
+ async function themeContext(engram, input, sessionId, start) {
87
+ // Get memories matching this theme
88
+ const memories = await engram.recall(sessionId, input.target, {
89
+ limit: 30,
90
+ threshold: 0.5,
91
+ tiers: ['working', 'long_term'],
92
+ });
93
+ const themeMatches = memories.filter(m => {
94
+ const themes = themeNames(m.content, 5);
95
+ return themes.includes(input.target);
96
+ });
97
+ if (themeMatches.length === 0) {
98
+ return fail('THEME_NOT_FOUND', `No memories found for theme '${input.target}'`, sessionId, start, [
99
+ `Available: use 'stats' to see recent memory distribution`,
100
+ ]);
101
+ }
102
+ const timeline = themeMatches
103
+ .sort((a, b) => a.timestamp.getTime() - b.timestamp.getTime())
104
+ .map(m => ({
105
+ date: m.timestamp.toISOString().slice(0, 10),
106
+ memory_id: m.id,
107
+ summary: m.content.slice(0, 100) + (m.content.length > 100 ? '...' : ''),
108
+ }));
109
+ const emotionalArc = buildEmotionalArc(themeMatches.map(m => ({
110
+ date: m.timestamp,
111
+ tone: scoreEmotion(m.content).tone,
112
+ })));
113
+ return ok({
114
+ target: { name: input.target, type: 'theme', mention_count: themeMatches.length },
115
+ timeline,
116
+ emotional_arc: emotionalArc,
117
+ key_memories: themeMatches.slice(0, 3).map(m => ({
118
+ id: m.id,
119
+ summary: m.content.slice(0, 120),
120
+ importance: m.importance ?? 0.5,
121
+ })),
122
+ }, sessionId, start);
123
+ }
124
+ async function memoryContext(engram, input, sessionId, start) {
125
+ // Recall memories similar to this memory_id
126
+ const seed = await engram.recall(sessionId, undefined, { limit: 1 });
127
+ const target = seed.find(m => m.id === input.target);
128
+ if (!target) {
129
+ return fail('MEMORY_NOT_FOUND', `Memory '${input.target}' not found`, sessionId, start);
130
+ }
131
+ const similar = await engram.recall(sessionId, target.content, {
132
+ limit: 10,
133
+ threshold: 0.6,
134
+ });
135
+ return ok({
136
+ target: {
137
+ id: target.id,
138
+ content: target.content,
139
+ role: target.role,
140
+ tier: target.tier,
141
+ timestamp: target.timestamp.toISOString(),
142
+ },
143
+ similar_memories: similar.filter(m => m.id !== target.id).map(m => ({
144
+ id: m.id,
145
+ content: m.content.slice(0, 120),
146
+ relevance: m.similarity ?? 0,
147
+ })),
148
+ themes: themeNames(target.content, 3),
149
+ emotional_tone: scoreEmotion(target.content).tone,
150
+ }, sessionId, start);
151
+ }
152
+ function buildEmotionalArc(entries) {
153
+ // Group by year-month
154
+ const byMonth = {};
155
+ for (const e of entries) {
156
+ const key = e.date.toISOString().slice(0, 7); // YYYY-MM
157
+ if (!byMonth[key])
158
+ byMonth[key] = [];
159
+ byMonth[key].push(e.tone);
160
+ }
161
+ return Object.entries(byMonth).map(([period, tones]) => {
162
+ // Most common tone
163
+ const counts = {};
164
+ for (const t of tones)
165
+ counts[t] = (counts[t] ?? 0) + 1;
166
+ const dominant = Object.entries(counts).sort(([, a], [, b]) => b - a)[0]?.[0] ?? 'neutral';
167
+ return { period, tone: dominant };
168
+ });
169
+ }
170
+ export const CONTEXT_SCHEMA = {
171
+ name: 'context',
172
+ description: 'Get 360° context around a specific entity, theme, or memory. Returns timeline, relationships, emotional arc, and key memories.',
173
+ inputSchema: {
174
+ type: 'object',
175
+ properties: {
176
+ target: { type: 'string', description: 'Entity name, theme name, or memory_id' },
177
+ target_type: { type: 'string', enum: ['entity', 'theme', 'memory'] },
178
+ session_id: { type: 'string' },
179
+ depth: { type: 'number', default: 2, description: 'Relationship depth (1-3)' },
180
+ include_memories: { type: 'boolean', default: true },
181
+ include_metrics: { type: 'boolean', default: true },
182
+ },
183
+ required: ['target', 'target_type'],
184
+ },
185
+ };
186
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/tools/context.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ import type { Engram } from '@cartisien/engram';
2
+ export interface DetectChangesInput {
3
+ baseline: 'session' | 'day' | 'week' | 'month';
4
+ session_id?: string;
5
+ scope?: 'entities' | 'themes' | 'emotions' | 'all';
6
+ compare_session_id?: string;
7
+ }
8
+ export declare function toolDetectChanges(engram: Engram, input: DetectChangesInput): Promise<import("../response.js").McpResponse<unknown>>;
9
+ export declare const DETECT_CHANGES_SCHEMA: {
10
+ readonly name: "detect_changes";
11
+ readonly description: "Compare recent memory activity against a baseline period to identify new entities, theme shifts, emotional changes, and anomalies.";
12
+ readonly inputSchema: {
13
+ readonly type: "object";
14
+ readonly properties: {
15
+ readonly baseline: {
16
+ readonly type: "string";
17
+ readonly enum: readonly ["session", "day", "week", "month"];
18
+ readonly description: "Time window to compare against";
19
+ };
20
+ readonly session_id: {
21
+ readonly type: "string";
22
+ };
23
+ readonly scope: {
24
+ readonly type: "string";
25
+ readonly enum: readonly ["entities", "themes", "emotions", "all"];
26
+ readonly default: "all";
27
+ };
28
+ readonly compare_session_id: {
29
+ readonly type: "string";
30
+ readonly description: "Compare against a specific session instead";
31
+ };
32
+ };
33
+ readonly required: readonly ["baseline"];
34
+ };
35
+ };