simple-memory-mcp 1.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +742 -0
- package/dist/cli/arg-parser.d.ts +9 -0
- package/dist/cli/arg-parser.d.ts.map +1 -0
- package/dist/cli/arg-parser.js +68 -0
- package/dist/cli/arg-parser.js.map +1 -0
- package/dist/cli/help-generator.d.ts +8 -0
- package/dist/cli/help-generator.d.ts.map +1 -0
- package/dist/cli/help-generator.js +89 -0
- package/dist/cli/help-generator.js.map +1 -0
- package/dist/cli/index.d.ts +27 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +56 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/query-builder.d.ts +8 -0
- package/dist/cli/query-builder.d.ts.map +1 -0
- package/dist/cli/query-builder.js +63 -0
- package/dist/cli/query-builder.js.map +1 -0
- package/dist/cli/shortcuts-config.d.ts +26 -0
- package/dist/cli/shortcuts-config.d.ts.map +1 -0
- package/dist/cli/shortcuts-config.js +94 -0
- package/dist/cli/shortcuts-config.js.map +1 -0
- package/dist/graphql/resolvers.d.ts +101 -0
- package/dist/graphql/resolvers.d.ts.map +1 -0
- package/dist/graphql/resolvers.js +98 -0
- package/dist/graphql/resolvers.js.map +1 -0
- package/dist/graphql/schema.d.ts +13 -0
- package/dist/graphql/schema.d.ts.map +1 -0
- package/dist/graphql/schema.js +314 -0
- package/dist/graphql/schema.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +573 -0
- package/dist/index.js.map +1 -0
- package/dist/services/backup-service.d.ts +57 -0
- package/dist/services/backup-service.d.ts.map +1 -0
- package/dist/services/backup-service.js +191 -0
- package/dist/services/backup-service.js.map +1 -0
- package/dist/services/database-optimizer.d.ts +15 -0
- package/dist/services/database-optimizer.d.ts.map +1 -0
- package/dist/services/database-optimizer.js +45 -0
- package/dist/services/database-optimizer.js.map +1 -0
- package/dist/services/memory-service.d.ts +126 -0
- package/dist/services/memory-service.d.ts.map +1 -0
- package/dist/services/memory-service.js +862 -0
- package/dist/services/memory-service.js.map +1 -0
- package/dist/services/migrations.d.ts +17 -0
- package/dist/services/migrations.d.ts.map +1 -0
- package/dist/services/migrations.js +273 -0
- package/dist/services/migrations.js.map +1 -0
- package/dist/tests/backup-export-test.d.ts +2 -0
- package/dist/tests/backup-export-test.d.ts.map +1 -0
- package/dist/tests/backup-export-test.js +162 -0
- package/dist/tests/backup-export-test.js.map +1 -0
- package/dist/tests/backup-test.d.ts +14 -0
- package/dist/tests/backup-test.d.ts.map +1 -0
- package/dist/tests/backup-test.js +209 -0
- package/dist/tests/backup-test.js.map +1 -0
- package/dist/tests/export-import-test.d.ts +15 -0
- package/dist/tests/export-import-test.d.ts.map +1 -0
- package/dist/tests/export-import-test.js +227 -0
- package/dist/tests/export-import-test.js.map +1 -0
- package/dist/tests/graphql-comprehensive-test.d.ts +6 -0
- package/dist/tests/graphql-comprehensive-test.d.ts.map +1 -0
- package/dist/tests/graphql-comprehensive-test.js +342 -0
- package/dist/tests/graphql-comprehensive-test.js.map +1 -0
- package/dist/tests/graphql-performance-test.d.ts +6 -0
- package/dist/tests/graphql-performance-test.d.ts.map +1 -0
- package/dist/tests/graphql-performance-test.js +141 -0
- package/dist/tests/graphql-performance-test.js.map +1 -0
- package/dist/tests/graphql-test.d.ts +5 -0
- package/dist/tests/graphql-test.d.ts.map +1 -0
- package/dist/tests/graphql-test.js +47 -0
- package/dist/tests/graphql-test.js.map +1 -0
- package/dist/tests/memory-server-tests.d.ts +7 -0
- package/dist/tests/memory-server-tests.d.ts.map +1 -0
- package/dist/tests/memory-server-tests.js +466 -0
- package/dist/tests/memory-server-tests.js.map +1 -0
- package/dist/tests/migration-test.d.ts +2 -0
- package/dist/tests/migration-test.d.ts.map +1 -0
- package/dist/tests/migration-test.js +270 -0
- package/dist/tests/migration-test.js.map +1 -0
- package/dist/tests/performance-benchmark.d.ts +7 -0
- package/dist/tests/performance-benchmark.d.ts.map +1 -0
- package/dist/tests/performance-benchmark.js +234 -0
- package/dist/tests/performance-benchmark.js.map +1 -0
- package/dist/tests/performance-test.d.ts +3 -0
- package/dist/tests/performance-test.d.ts.map +1 -0
- package/dist/tests/performance-test.js +61 -0
- package/dist/tests/performance-test.js.map +1 -0
- package/dist/tests/time-range-test.d.ts +7 -0
- package/dist/tests/time-range-test.d.ts.map +1 -0
- package/dist/tests/time-range-test.js +169 -0
- package/dist/tests/time-range-test.js.map +1 -0
- package/dist/tools/delete-memory/cli-parser.d.ts +2 -0
- package/dist/tools/delete-memory/cli-parser.d.ts.map +1 -0
- package/dist/tools/delete-memory/cli-parser.js +13 -0
- package/dist/tools/delete-memory/cli-parser.js.map +1 -0
- package/dist/tools/delete-memory/executor.d.ts +13 -0
- package/dist/tools/delete-memory/executor.d.ts.map +1 -0
- package/dist/tools/delete-memory/executor.js +40 -0
- package/dist/tools/delete-memory/executor.js.map +1 -0
- package/dist/tools/delete-memory/index.d.ts +3 -0
- package/dist/tools/delete-memory/index.d.ts.map +1 -0
- package/dist/tools/delete-memory/index.js +24 -0
- package/dist/tools/delete-memory/index.js.map +1 -0
- package/dist/tools/export-memory/cli-parser.d.ts +2 -0
- package/dist/tools/export-memory/cli-parser.d.ts.map +1 -0
- package/dist/tools/export-memory/cli-parser.js +34 -0
- package/dist/tools/export-memory/cli-parser.js.map +1 -0
- package/dist/tools/export-memory/executor.d.ts +10 -0
- package/dist/tools/export-memory/executor.d.ts.map +1 -0
- package/dist/tools/export-memory/executor.js +41 -0
- package/dist/tools/export-memory/executor.js.map +1 -0
- package/dist/tools/export-memory/index.d.ts +4 -0
- package/dist/tools/export-memory/index.d.ts.map +1 -0
- package/dist/tools/export-memory/index.js +99 -0
- package/dist/tools/export-memory/index.js.map +1 -0
- package/dist/tools/import-memory/cli-parser.d.ts +2 -0
- package/dist/tools/import-memory/cli-parser.d.ts.map +1 -0
- package/dist/tools/import-memory/cli-parser.js +25 -0
- package/dist/tools/import-memory/cli-parser.js.map +1 -0
- package/dist/tools/import-memory/executor.d.ts +8 -0
- package/dist/tools/import-memory/executor.d.ts.map +1 -0
- package/dist/tools/import-memory/executor.js +31 -0
- package/dist/tools/import-memory/executor.js.map +1 -0
- package/dist/tools/import-memory/index.d.ts +4 -0
- package/dist/tools/import-memory/index.d.ts.map +1 -0
- package/dist/tools/import-memory/index.js +70 -0
- package/dist/tools/import-memory/index.js.map +1 -0
- package/dist/tools/index.d.ts +14 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +48 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/memory-graphql/cli-parser.d.ts +6 -0
- package/dist/tools/memory-graphql/cli-parser.d.ts.map +1 -0
- package/dist/tools/memory-graphql/cli-parser.js +24 -0
- package/dist/tools/memory-graphql/cli-parser.js.map +1 -0
- package/dist/tools/memory-graphql/executor.d.ts +18 -0
- package/dist/tools/memory-graphql/executor.d.ts.map +1 -0
- package/dist/tools/memory-graphql/executor.js +53 -0
- package/dist/tools/memory-graphql/executor.js.map +1 -0
- package/dist/tools/memory-graphql/index.d.ts +3 -0
- package/dist/tools/memory-graphql/index.d.ts.map +1 -0
- package/dist/tools/memory-graphql/index.js +73 -0
- package/dist/tools/memory-graphql/index.js.map +1 -0
- package/dist/tools/memory-stats/cli-parser.d.ts +2 -0
- package/dist/tools/memory-stats/cli-parser.d.ts.map +1 -0
- package/dist/tools/memory-stats/cli-parser.js +8 -0
- package/dist/tools/memory-stats/cli-parser.js.map +1 -0
- package/dist/tools/memory-stats/executor.d.ts +4 -0
- package/dist/tools/memory-stats/executor.d.ts.map +1 -0
- package/dist/tools/memory-stats/executor.js +4 -0
- package/dist/tools/memory-stats/executor.js.map +1 -0
- package/dist/tools/memory-stats/index.d.ts +3 -0
- package/dist/tools/memory-stats/index.d.ts.map +1 -0
- package/dist/tools/memory-stats/index.js +15 -0
- package/dist/tools/memory-stats/index.js.map +1 -0
- package/dist/tools/search-memory/cli-parser.d.ts +2 -0
- package/dist/tools/search-memory/cli-parser.d.ts.map +1 -0
- package/dist/tools/search-memory/cli-parser.js +56 -0
- package/dist/tools/search-memory/cli-parser.js.map +1 -0
- package/dist/tools/search-memory/executor.d.ts +36 -0
- package/dist/tools/search-memory/executor.d.ts.map +1 -0
- package/dist/tools/search-memory/executor.js +83 -0
- package/dist/tools/search-memory/executor.js.map +1 -0
- package/dist/tools/search-memory/index.d.ts +3 -0
- package/dist/tools/search-memory/index.d.ts.map +1 -0
- package/dist/tools/search-memory/index.js +89 -0
- package/dist/tools/search-memory/index.js.map +1 -0
- package/dist/tools/store-memory/cli-parser.d.ts +2 -0
- package/dist/tools/store-memory/cli-parser.d.ts.map +1 -0
- package/dist/tools/store-memory/cli-parser.js +21 -0
- package/dist/tools/store-memory/cli-parser.js.map +1 -0
- package/dist/tools/store-memory/executor.d.ts +16 -0
- package/dist/tools/store-memory/executor.d.ts.map +1 -0
- package/dist/tools/store-memory/executor.js +100 -0
- package/dist/tools/store-memory/executor.js.map +1 -0
- package/dist/tools/store-memory/index.d.ts +3 -0
- package/dist/tools/store-memory/index.d.ts.map +1 -0
- package/dist/tools/store-memory/index.js +68 -0
- package/dist/tools/store-memory/index.js.map +1 -0
- package/dist/tools/sync-memory/cli-parser.d.ts +1 -0
- package/dist/tools/sync-memory/cli-parser.d.ts.map +1 -0
- package/dist/tools/sync-memory/cli-parser.js +2 -0
- package/dist/tools/sync-memory/cli-parser.js.map +1 -0
- package/dist/tools/sync-memory/executor.d.ts +1 -0
- package/dist/tools/sync-memory/executor.d.ts.map +1 -0
- package/dist/tools/sync-memory/executor.js +2 -0
- package/dist/tools/sync-memory/executor.js.map +1 -0
- package/dist/tools/sync-memory/index.d.ts +1 -0
- package/dist/tools/sync-memory/index.d.ts.map +1 -0
- package/dist/tools/sync-memory/index.js +2 -0
- package/dist/tools/sync-memory/index.js.map +1 -0
- package/dist/tools/update-memory/cli-parser.d.ts +2 -0
- package/dist/tools/update-memory/cli-parser.d.ts.map +1 -0
- package/dist/tools/update-memory/cli-parser.js +17 -0
- package/dist/tools/update-memory/cli-parser.js.map +1 -0
- package/dist/tools/update-memory/executor.d.ts +16 -0
- package/dist/tools/update-memory/executor.d.ts.map +1 -0
- package/dist/tools/update-memory/executor.js +59 -0
- package/dist/tools/update-memory/executor.js.map +1 -0
- package/dist/tools/update-memory/index.d.ts +3 -0
- package/dist/tools/update-memory/index.d.ts.map +1 -0
- package/dist/tools/update-memory/index.js +30 -0
- package/dist/tools/update-memory/index.js.map +1 -0
- package/dist/transports/streamable-http.d.ts +38 -0
- package/dist/transports/streamable-http.d.ts.map +1 -0
- package/dist/transports/streamable-http.js +209 -0
- package/dist/transports/streamable-http.js.map +1 -0
- package/dist/types/tools.d.ts +79 -0
- package/dist/types/tools.d.ts.map +1 -0
- package/dist/types/tools.js +3 -0
- package/dist/types/tools.js.map +1 -0
- package/dist/utils/cli-parser.d.ts +12 -0
- package/dist/utils/cli-parser.d.ts.map +1 -0
- package/dist/utils/cli-parser.js +43 -0
- package/dist/utils/cli-parser.js.map +1 -0
- package/dist/utils/config.d.ts +95 -0
- package/dist/utils/config.d.ts.map +1 -0
- package/dist/utils/config.js +176 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/db-integrity-check.d.ts +22 -0
- package/dist/utils/db-integrity-check.d.ts.map +1 -0
- package/dist/utils/db-integrity-check.js +69 -0
- package/dist/utils/db-integrity-check.js.map +1 -0
- package/dist/utils/debug.d.ts +25 -0
- package/dist/utils/debug.d.ts.map +1 -0
- package/dist/utils/debug.js +67 -0
- package/dist/utils/debug.js.map +1 -0
- package/dist/utils/help-generator.d.ts +18 -0
- package/dist/utils/help-generator.d.ts.map +1 -0
- package/dist/utils/help-generator.js +81 -0
- package/dist/utils/help-generator.js.map +1 -0
- package/dist/utils/json-parser.d.ts +12 -0
- package/dist/utils/json-parser.d.ts.map +1 -0
- package/dist/utils/json-parser.js +52 -0
- package/dist/utils/json-parser.js.map +1 -0
- package/dist/utils/mcp-config.d.ts +12 -0
- package/dist/utils/mcp-config.d.ts.map +1 -0
- package/dist/utils/mcp-config.js +64 -0
- package/dist/utils/mcp-config.js.map +1 -0
- package/dist/web-server.d.ts +3 -0
- package/dist/web-server.d.ts.map +1 -0
- package/dist/web-server.js +265 -0
- package/dist/web-server.js.map +1 -0
- package/package.json +75 -0
package/dist/index.js
ADDED
|
@@ -0,0 +1,573 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
3
|
+
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
4
|
+
import { CallToolRequestSchema, ListToolsRequestSchema, GetPromptRequestSchema, ListPromptsRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
|
|
5
|
+
import { config } from 'dotenv';
|
|
6
|
+
config();
|
|
7
|
+
import { existsSync } from 'fs';
|
|
8
|
+
import { resolve } from 'path';
|
|
9
|
+
import { MemoryService } from './services/memory-service.js';
|
|
10
|
+
import { toolRegistry } from './tools/index.js';
|
|
11
|
+
import { debugLog } from './utils/debug.js';
|
|
12
|
+
import { checkDatabaseIntegrity, rebuildHashIndex } from './utils/db-integrity-check.js';
|
|
13
|
+
import { getDatabasePath, ensureConfigDir } from './utils/config.js';
|
|
14
|
+
import { StreamableHTTPServerTransport } from './transports/streamable-http.js';
|
|
15
|
+
import { execute as executeGraphQL } from './tools/memory-graphql/executor.js';
|
|
16
|
+
// Initialize server
|
|
17
|
+
const server = new Server({
|
|
18
|
+
name: 'simple-memory-mcp',
|
|
19
|
+
version: '1.0.0',
|
|
20
|
+
}, {
|
|
21
|
+
capabilities: {
|
|
22
|
+
tools: {},
|
|
23
|
+
prompts: {},
|
|
24
|
+
},
|
|
25
|
+
});
|
|
26
|
+
// Initialize services
|
|
27
|
+
function initializeServices() {
|
|
28
|
+
try {
|
|
29
|
+
const { path: dbPath, isDefault } = getDatabasePath();
|
|
30
|
+
const resolvedPath = resolve(dbPath);
|
|
31
|
+
const dbExists = existsSync(resolvedPath);
|
|
32
|
+
// Ensure config directory exists for default path
|
|
33
|
+
if (isDefault) {
|
|
34
|
+
ensureConfigDir();
|
|
35
|
+
}
|
|
36
|
+
// Log where the database is (helpful for debugging)
|
|
37
|
+
if (!dbExists) {
|
|
38
|
+
if (isDefault) {
|
|
39
|
+
debugLog(`Creating database at default location: ${resolvedPath}`);
|
|
40
|
+
debugLog(`To use a custom location, set MEMORY_DB in your MCP config.`);
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
debugLog(`Creating NEW database at: ${resolvedPath}`);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
const memoryService = new MemoryService(dbPath);
|
|
47
|
+
memoryService.initialize();
|
|
48
|
+
debugLog('Memory service initialized at:', resolvedPath);
|
|
49
|
+
return memoryService;
|
|
50
|
+
}
|
|
51
|
+
catch (error) {
|
|
52
|
+
// Fatal error - this should always show
|
|
53
|
+
console.error('Failed to initialize services:', error);
|
|
54
|
+
process.exit(1);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
// Global references (initialized in main())
|
|
58
|
+
let memoryService;
|
|
59
|
+
let toolContext;
|
|
60
|
+
// List available tools
|
|
61
|
+
server.setRequestHandler(ListToolsRequestSchema, async () => {
|
|
62
|
+
return {
|
|
63
|
+
tools: toolRegistry.getDefinitions(),
|
|
64
|
+
};
|
|
65
|
+
});
|
|
66
|
+
// Handle tool calls
|
|
67
|
+
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
68
|
+
const { name, arguments: args } = request.params;
|
|
69
|
+
debugLog('Tool call:', name, 'with args:', args);
|
|
70
|
+
try {
|
|
71
|
+
const result = await toolRegistry.handle(name, args || {}, toolContext);
|
|
72
|
+
return {
|
|
73
|
+
content: [
|
|
74
|
+
{
|
|
75
|
+
type: 'text',
|
|
76
|
+
text: typeof result === 'string' ? result : JSON.stringify(result, null, 2),
|
|
77
|
+
},
|
|
78
|
+
],
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
catch (error) {
|
|
82
|
+
debugLog('Tool error:', error);
|
|
83
|
+
const errorMessage = error instanceof Error ? error.message : 'Unknown error';
|
|
84
|
+
return {
|
|
85
|
+
content: [
|
|
86
|
+
{
|
|
87
|
+
type: 'text',
|
|
88
|
+
text: `Error: ${errorMessage}`,
|
|
89
|
+
},
|
|
90
|
+
],
|
|
91
|
+
isError: true,
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
});
|
|
95
|
+
// List available prompts
|
|
96
|
+
server.setRequestHandler(ListPromptsRequestSchema, async () => {
|
|
97
|
+
return {
|
|
98
|
+
prompts: [],
|
|
99
|
+
};
|
|
100
|
+
});
|
|
101
|
+
// Handle prompt requests
|
|
102
|
+
server.setRequestHandler(GetPromptRequestSchema, async (request) => {
|
|
103
|
+
const { name, arguments: args } = request.params;
|
|
104
|
+
return {
|
|
105
|
+
messages: [
|
|
106
|
+
{
|
|
107
|
+
role: 'user',
|
|
108
|
+
content: {
|
|
109
|
+
type: 'text',
|
|
110
|
+
text: `Simple Memory MCP Server does not provide prompts. Use tools: ${toolRegistry.getToolNames().join(', ')}`,
|
|
111
|
+
},
|
|
112
|
+
},
|
|
113
|
+
],
|
|
114
|
+
};
|
|
115
|
+
});
|
|
116
|
+
// =============================================================================
|
|
117
|
+
// CLI SHORTCUTS - Simple commands that generate GraphQL queries
|
|
118
|
+
// =============================================================================
|
|
119
|
+
// Helper to escape GraphQL strings
|
|
120
|
+
function escapeGraphQL(str) {
|
|
121
|
+
return str
|
|
122
|
+
.replace(/\\/g, '\\\\')
|
|
123
|
+
.replace(/"/g, '\\"')
|
|
124
|
+
.replace(/\n/g, '\\n')
|
|
125
|
+
.replace(/\r/g, '\\r')
|
|
126
|
+
.replace(/\t/g, '\\t');
|
|
127
|
+
}
|
|
128
|
+
// Helper to process tags for GraphQL
|
|
129
|
+
function processTagsForGraphQL(tags) {
|
|
130
|
+
return tags.split(',').map((t) => `"${t.trim()}"`).join(', ');
|
|
131
|
+
}
|
|
132
|
+
// Simple shortcut definitions - maps commands to GraphQL query builders
|
|
133
|
+
const CLI_SHORTCUTS = {
|
|
134
|
+
search: (args) => {
|
|
135
|
+
const limit = args.limit || 10;
|
|
136
|
+
const parts = [`limit: ${limit}`];
|
|
137
|
+
if (args.query)
|
|
138
|
+
parts.push(`query: "${escapeGraphQL(args.query)}"`);
|
|
139
|
+
if (args.tags) {
|
|
140
|
+
parts.push(`tags: [${processTagsForGraphQL(args.tags)}]`);
|
|
141
|
+
}
|
|
142
|
+
if (args.daysAgo)
|
|
143
|
+
parts.push(`daysAgo: ${args.daysAgo}`);
|
|
144
|
+
if (args.summary)
|
|
145
|
+
parts.push(`summaryOnly: true`);
|
|
146
|
+
const fields = args.summary
|
|
147
|
+
? 'hash title preview tags createdAt'
|
|
148
|
+
: 'hash title content tags createdAt';
|
|
149
|
+
return `{ memories(${parts.join(', ')}) { ${fields} } }`;
|
|
150
|
+
},
|
|
151
|
+
store: (args) => {
|
|
152
|
+
if (!args.content)
|
|
153
|
+
throw new Error('--content is required');
|
|
154
|
+
const tagsArg = args.tags ? `, tags: [${processTagsForGraphQL(args.tags)}]` : '';
|
|
155
|
+
return `mutation { store(content: "${escapeGraphQL(args.content)}"${tagsArg}) { success hash } }`;
|
|
156
|
+
},
|
|
157
|
+
update: (args) => {
|
|
158
|
+
if (!args.hash)
|
|
159
|
+
throw new Error('--hash is required');
|
|
160
|
+
if (!args.content)
|
|
161
|
+
throw new Error('--content is required');
|
|
162
|
+
const tagsArg = args.tags ? `, tags: [${processTagsForGraphQL(args.tags)}]` : '';
|
|
163
|
+
return `mutation { update(hash: "${args.hash}", content: "${escapeGraphQL(args.content)}"${tagsArg}) { success newHash } }`;
|
|
164
|
+
},
|
|
165
|
+
get: (args) => {
|
|
166
|
+
if (!args.hash)
|
|
167
|
+
throw new Error('--hash is required');
|
|
168
|
+
return `{ memory(hash: "${args.hash}") { hash content tags createdAt } }`;
|
|
169
|
+
},
|
|
170
|
+
related: (args) => {
|
|
171
|
+
if (!args.hash)
|
|
172
|
+
throw new Error('--hash is required');
|
|
173
|
+
const limit = args.limit || 10;
|
|
174
|
+
return `{ related(hash: "${args.hash}", limit: ${limit}) { hash title tags } }`;
|
|
175
|
+
},
|
|
176
|
+
delete: (args) => {
|
|
177
|
+
if (args.hash) {
|
|
178
|
+
return `mutation { delete(hash: "${args.hash}") { success deletedCount } }`;
|
|
179
|
+
}
|
|
180
|
+
else if (args.tag) {
|
|
181
|
+
return `mutation { delete(tag: "${args.tag}") { success deletedCount } }`;
|
|
182
|
+
}
|
|
183
|
+
throw new Error('Either --hash or --tag is required');
|
|
184
|
+
},
|
|
185
|
+
stats: () => {
|
|
186
|
+
return `{ stats { version totalMemories totalRelationships dbSize dbPath schemaVersion configPath backupEnabled backupPath backupCount lastBackupAge nextBackupIn mcpConfigPaths { name path exists } } }`;
|
|
187
|
+
},
|
|
188
|
+
};
|
|
189
|
+
// Parse CLI args helper - simple argument parser
|
|
190
|
+
function parseCliArgs(args) {
|
|
191
|
+
const result = {};
|
|
192
|
+
for (let i = 0; i < args.length; i++) {
|
|
193
|
+
const arg = args[i];
|
|
194
|
+
if (arg === '--help' || arg === '-h') {
|
|
195
|
+
result.help = true;
|
|
196
|
+
continue;
|
|
197
|
+
}
|
|
198
|
+
if (arg.startsWith('--')) {
|
|
199
|
+
const key = arg.slice(2);
|
|
200
|
+
const nextArg = args[i + 1];
|
|
201
|
+
// Check if next arg exists and is not another flag
|
|
202
|
+
if (nextArg && !nextArg.startsWith('--')) {
|
|
203
|
+
result[key] = nextArg;
|
|
204
|
+
i++; // skip next arg
|
|
205
|
+
}
|
|
206
|
+
else {
|
|
207
|
+
// Boolean flag (no value or next arg is another flag)
|
|
208
|
+
result[key] = true;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
return result;
|
|
213
|
+
}
|
|
214
|
+
// Show general help
|
|
215
|
+
function showHelp() {
|
|
216
|
+
console.log(`
|
|
217
|
+
simple-memory - Persistent memory storage for LLMs
|
|
218
|
+
|
|
219
|
+
USAGE:
|
|
220
|
+
simple-memory <command> [options]
|
|
221
|
+
|
|
222
|
+
QUICK COMMANDS:
|
|
223
|
+
search Search memories by content or tags
|
|
224
|
+
store Store a new memory
|
|
225
|
+
update Update an existing memory
|
|
226
|
+
get Get a memory by hash
|
|
227
|
+
related Find related memories
|
|
228
|
+
delete Delete a memory
|
|
229
|
+
stats Show database statistics
|
|
230
|
+
|
|
231
|
+
CONFIGURATION:
|
|
232
|
+
config Show or initialize config file
|
|
233
|
+
|
|
234
|
+
ADVANCED:
|
|
235
|
+
graphql Execute raw GraphQL query
|
|
236
|
+
export-memory Export memories to JSON
|
|
237
|
+
import-memory Import memories from JSON
|
|
238
|
+
check-integrity Check database integrity
|
|
239
|
+
rebuild-index Rebuild hash index
|
|
240
|
+
|
|
241
|
+
Run "simple-memory <command> --help" for command-specific options.
|
|
242
|
+
|
|
243
|
+
EXAMPLES:
|
|
244
|
+
simple-memory search --query "typescript" --limit 5
|
|
245
|
+
simple-memory store --content "Remember this" --tags "note,important"
|
|
246
|
+
simple-memory stats
|
|
247
|
+
simple-memory get --hash "abc123..."
|
|
248
|
+
simple-memory delete --tag "temporary"
|
|
249
|
+
`);
|
|
250
|
+
}
|
|
251
|
+
// Show command-specific help
|
|
252
|
+
function showCommandHelp(command) {
|
|
253
|
+
const help = {
|
|
254
|
+
search: `
|
|
255
|
+
simple-memory search - Search memories
|
|
256
|
+
|
|
257
|
+
OPTIONS:
|
|
258
|
+
--query <text> Full-text search query
|
|
259
|
+
--tags <tags> Filter by tags (comma-separated)
|
|
260
|
+
--limit <n> Max results [default: 10]
|
|
261
|
+
--daysAgo <n> Filter to last N days
|
|
262
|
+
--summary Return summaries only (faster)
|
|
263
|
+
--verbose Show generated GraphQL query
|
|
264
|
+
|
|
265
|
+
EXAMPLES:
|
|
266
|
+
simple-memory search --query "typescript"
|
|
267
|
+
simple-memory search --tags "project,work" --limit 20
|
|
268
|
+
simple-memory search --query "bug" --daysAgo 7
|
|
269
|
+
simple-memory search --query "api" --verbose
|
|
270
|
+
`,
|
|
271
|
+
store: `
|
|
272
|
+
simple-memory store - Store a new memory
|
|
273
|
+
|
|
274
|
+
OPTIONS:
|
|
275
|
+
--content <text> Content to store (required)
|
|
276
|
+
--tags <tags> Tags (comma-separated)
|
|
277
|
+
--verbose Show generated GraphQL query
|
|
278
|
+
|
|
279
|
+
EXAMPLES:
|
|
280
|
+
simple-memory store --content "Remember this note"
|
|
281
|
+
simple-memory store --content "API key: xyz" --tags "credentials,api"
|
|
282
|
+
`,
|
|
283
|
+
update: `
|
|
284
|
+
simple-memory update - Update existing memory
|
|
285
|
+
|
|
286
|
+
OPTIONS:
|
|
287
|
+
--hash <hash> Memory hash (required)
|
|
288
|
+
--content <text> New content (required)
|
|
289
|
+
--tags <tags> New tags (replaces existing)
|
|
290
|
+
|
|
291
|
+
EXAMPLES:
|
|
292
|
+
simple-memory update --hash "abc123" --content "Updated content"
|
|
293
|
+
`,
|
|
294
|
+
get: `
|
|
295
|
+
simple-memory get - Get memory by hash
|
|
296
|
+
|
|
297
|
+
OPTIONS:
|
|
298
|
+
--hash <hash> Memory hash (required)
|
|
299
|
+
|
|
300
|
+
EXAMPLES:
|
|
301
|
+
simple-memory get --hash "abc123..."
|
|
302
|
+
`,
|
|
303
|
+
related: `
|
|
304
|
+
simple-memory related - Find related memories
|
|
305
|
+
|
|
306
|
+
OPTIONS:
|
|
307
|
+
--hash <hash> Memory hash (required)
|
|
308
|
+
--limit <n> Max results [default: 10]
|
|
309
|
+
|
|
310
|
+
EXAMPLES:
|
|
311
|
+
simple-memory related --hash "abc123..."
|
|
312
|
+
`,
|
|
313
|
+
delete: `
|
|
314
|
+
simple-memory delete - Delete memory
|
|
315
|
+
|
|
316
|
+
OPTIONS:
|
|
317
|
+
--hash <hash> Delete specific memory
|
|
318
|
+
--tag <tag> Delete all with this tag (use ONE only)
|
|
319
|
+
|
|
320
|
+
EXAMPLES:
|
|
321
|
+
simple-memory delete --hash "abc123..."
|
|
322
|
+
simple-memory delete --tag "temporary"
|
|
323
|
+
`,
|
|
324
|
+
stats: `
|
|
325
|
+
simple-memory stats - Show database statistics
|
|
326
|
+
|
|
327
|
+
No options needed.
|
|
328
|
+
|
|
329
|
+
EXAMPLES:
|
|
330
|
+
simple-memory stats
|
|
331
|
+
`,
|
|
332
|
+
graphql: `
|
|
333
|
+
simple-memory graphql - Execute raw GraphQL query
|
|
334
|
+
|
|
335
|
+
OPTIONS:
|
|
336
|
+
--query <graphql> GraphQL query or mutation (required)
|
|
337
|
+
|
|
338
|
+
EXAMPLES:
|
|
339
|
+
simple-memory graphql --query '{ stats { totalMemories } }'
|
|
340
|
+
simple-memory graphql --query '{ memories(limit: 5) { hash title tags } }'
|
|
341
|
+
simple-memory graphql --query 'mutation { store(content: "text") { hash } }'
|
|
342
|
+
`,
|
|
343
|
+
config: `
|
|
344
|
+
simple-memory config - Show or initialize configuration
|
|
345
|
+
|
|
346
|
+
OPTIONS:
|
|
347
|
+
--init Create default config.json with examples
|
|
348
|
+
--show Show current config (default)
|
|
349
|
+
--path Show path to config file only
|
|
350
|
+
|
|
351
|
+
EXAMPLES:
|
|
352
|
+
simple-memory config # Show current configuration
|
|
353
|
+
simple-memory config --init # Create config.json with examples
|
|
354
|
+
simple-memory config --path # Print config file path
|
|
355
|
+
|
|
356
|
+
CONFIG FILE:
|
|
357
|
+
Location: ~/.simple-memory/config.json
|
|
358
|
+
|
|
359
|
+
Settings in config.json apply to ALL clients (CLI, MCP, etc.)
|
|
360
|
+
Environment variables can override for specific contexts.
|
|
361
|
+
`,
|
|
362
|
+
};
|
|
363
|
+
console.log(help[command] || 'No help available for this command.');
|
|
364
|
+
}
|
|
365
|
+
// Execute GraphQL query helper
|
|
366
|
+
async function executeGraphQLQuery(query) {
|
|
367
|
+
const result = await executeGraphQL({ query }, toolContext);
|
|
368
|
+
return result;
|
|
369
|
+
}
|
|
370
|
+
// Start server or run CLI
|
|
371
|
+
async function main() {
|
|
372
|
+
const args = process.argv.slice(2);
|
|
373
|
+
// Check for --http or --both flags
|
|
374
|
+
const useHttp = args.includes('--http') || args.includes('--both');
|
|
375
|
+
const useBoth = args.includes('--both');
|
|
376
|
+
const useStdio = !args.includes('--http') || useBoth;
|
|
377
|
+
// Remove transport flags from args
|
|
378
|
+
const cliArgs = args.filter(arg => arg !== '--http' && arg !== '--both');
|
|
379
|
+
// Suppress debug output in CLI mode for cleaner output (must be set before service init)
|
|
380
|
+
// But respect explicit MEMORY_DEBUG=true if user wants debug in CLI
|
|
381
|
+
const isCliMode = cliArgs.length > 0;
|
|
382
|
+
if (isCliMode && process.env.MEMORY_DEBUG !== 'true') {
|
|
383
|
+
process.env.MEMORY_DEBUG = 'false';
|
|
384
|
+
}
|
|
385
|
+
// Initialize services (backup auto-configures from env vars)
|
|
386
|
+
memoryService = initializeServices();
|
|
387
|
+
// Create tool context
|
|
388
|
+
toolContext = {
|
|
389
|
+
memoryService,
|
|
390
|
+
config: {}
|
|
391
|
+
};
|
|
392
|
+
if (cliArgs.length > 0) {
|
|
393
|
+
// CLI mode - check for help first
|
|
394
|
+
if (cliArgs[0] === '--help' || cliArgs[0] === '-h') {
|
|
395
|
+
showHelp();
|
|
396
|
+
process.exit(0);
|
|
397
|
+
}
|
|
398
|
+
const command = cliArgs[0];
|
|
399
|
+
// Handle shortcuts
|
|
400
|
+
if (command in CLI_SHORTCUTS) {
|
|
401
|
+
const parsedArgs = parseCliArgs(cliArgs.slice(1));
|
|
402
|
+
if (parsedArgs.help) {
|
|
403
|
+
showCommandHelp(command);
|
|
404
|
+
process.exit(0);
|
|
405
|
+
}
|
|
406
|
+
try {
|
|
407
|
+
const query = CLI_SHORTCUTS[command](parsedArgs);
|
|
408
|
+
// Show generated GraphQL if --verbose flag is set (helps users learn GraphQL)
|
|
409
|
+
if (parsedArgs.verbose) {
|
|
410
|
+
console.log('Generated GraphQL:', query);
|
|
411
|
+
console.log('---');
|
|
412
|
+
}
|
|
413
|
+
const result = await executeGraphQLQuery(query);
|
|
414
|
+
console.log(JSON.stringify(result, null, 2));
|
|
415
|
+
process.exit(0);
|
|
416
|
+
}
|
|
417
|
+
catch (error) {
|
|
418
|
+
console.error(`Error: ${error instanceof Error ? error.message : error}`);
|
|
419
|
+
console.log(`\nRun "simple-memory ${command} --help" for usage.`);
|
|
420
|
+
process.exit(1);
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
// Handle raw GraphQL
|
|
424
|
+
if (command === 'graphql') {
|
|
425
|
+
const parsedArgs = parseCliArgs(cliArgs.slice(1));
|
|
426
|
+
if (parsedArgs.help) {
|
|
427
|
+
showCommandHelp('graphql');
|
|
428
|
+
process.exit(0);
|
|
429
|
+
}
|
|
430
|
+
if (!parsedArgs.query) {
|
|
431
|
+
console.error('Error: --query is required');
|
|
432
|
+
console.log('\nRun "simple-memory graphql --help" for usage.');
|
|
433
|
+
process.exit(1);
|
|
434
|
+
}
|
|
435
|
+
const result = await executeGraphQLQuery(parsedArgs.query);
|
|
436
|
+
console.log(JSON.stringify(result, null, 2));
|
|
437
|
+
process.exit(0);
|
|
438
|
+
}
|
|
439
|
+
// Handle config command
|
|
440
|
+
if (command === 'config') {
|
|
441
|
+
const parsedArgs = parseCliArgs(cliArgs.slice(1));
|
|
442
|
+
if (parsedArgs.help) {
|
|
443
|
+
showCommandHelp('config');
|
|
444
|
+
process.exit(0);
|
|
445
|
+
}
|
|
446
|
+
const { getConfigPath, loadConfigFile, initConfigFile, getConfig } = await import('./utils/config.js');
|
|
447
|
+
const configPath = getConfigPath();
|
|
448
|
+
if (parsedArgs.path) {
|
|
449
|
+
console.log(configPath);
|
|
450
|
+
process.exit(0);
|
|
451
|
+
}
|
|
452
|
+
if (parsedArgs.init) {
|
|
453
|
+
const { path, created } = initConfigFile();
|
|
454
|
+
if (created) {
|
|
455
|
+
console.log(`✅ Created config file: ${path}`);
|
|
456
|
+
console.log('\nEdit this file to configure database, backups, and other settings.');
|
|
457
|
+
console.log('Settings apply to all clients (CLI, MCP, etc.)');
|
|
458
|
+
}
|
|
459
|
+
else {
|
|
460
|
+
console.log(`Config file already exists: ${path}`);
|
|
461
|
+
}
|
|
462
|
+
process.exit(0);
|
|
463
|
+
}
|
|
464
|
+
// Default: show current config
|
|
465
|
+
console.log(`Config file: ${configPath}\n`);
|
|
466
|
+
const config = getConfig();
|
|
467
|
+
console.log('Current configuration:');
|
|
468
|
+
console.log(JSON.stringify(config, null, 2));
|
|
469
|
+
process.exit(0);
|
|
470
|
+
}
|
|
471
|
+
// CLI mode - check for integrity commands
|
|
472
|
+
if (command === 'check-integrity') {
|
|
473
|
+
const { path: dbPath } = getDatabasePath();
|
|
474
|
+
console.log(`Database: ${dbPath}\n`);
|
|
475
|
+
console.log('Running database integrity check...\n');
|
|
476
|
+
const result = checkDatabaseIntegrity(dbPath);
|
|
477
|
+
console.log('=== Integrity Check Results ===');
|
|
478
|
+
console.log(`Total memories: ${result.totalMemories}`);
|
|
479
|
+
console.log(`Corrupted hashes: ${result.corruptedHashes}`);
|
|
480
|
+
console.log(`Orphaned hash indexes: ${result.orphanedHashIndexes}`);
|
|
481
|
+
console.log(`Missing hash indexes: ${result.missingHashIndexes}`);
|
|
482
|
+
if (result.orphanedMemories.length > 0) {
|
|
483
|
+
console.log('\n⚠️ Issues found:');
|
|
484
|
+
result.orphanedMemories.forEach(mem => {
|
|
485
|
+
console.log(` ID ${mem.id}: ${mem.hash}`);
|
|
486
|
+
console.log(` Content: ${mem.content}`);
|
|
487
|
+
});
|
|
488
|
+
console.log('\nRun "simple-memory rebuild-index" to rebuild the hash index');
|
|
489
|
+
}
|
|
490
|
+
else {
|
|
491
|
+
console.log('\n✓ No integrity issues detected');
|
|
492
|
+
}
|
|
493
|
+
process.exit(result.orphanedMemories.length > 0 ? 1 : 0);
|
|
494
|
+
}
|
|
495
|
+
if (command === 'rebuild-index') {
|
|
496
|
+
const { path: dbPath } = getDatabasePath();
|
|
497
|
+
console.log(`Database: ${dbPath}\n`);
|
|
498
|
+
rebuildHashIndex(dbPath);
|
|
499
|
+
process.exit(0);
|
|
500
|
+
}
|
|
501
|
+
// Handle export/import (keep these as-is from tool registry)
|
|
502
|
+
if (command === 'export-memory' || command === 'import-memory') {
|
|
503
|
+
try {
|
|
504
|
+
const parser = toolRegistry.getCliParser(command);
|
|
505
|
+
const parsedArgs = parser ? parser(cliArgs.slice(1)) : {};
|
|
506
|
+
const result = await toolRegistry.handle(command, parsedArgs, toolContext);
|
|
507
|
+
console.log(JSON.stringify(result, null, 2));
|
|
508
|
+
process.exit(0);
|
|
509
|
+
}
|
|
510
|
+
catch (error) {
|
|
511
|
+
console.error('Error:', error instanceof Error ? error.message : error);
|
|
512
|
+
process.exit(1);
|
|
513
|
+
}
|
|
514
|
+
}
|
|
515
|
+
// Unknown command
|
|
516
|
+
console.error(`Unknown command: ${command}`);
|
|
517
|
+
showHelp();
|
|
518
|
+
process.exit(1);
|
|
519
|
+
}
|
|
520
|
+
else {
|
|
521
|
+
// MCP mode - connect transport(s)
|
|
522
|
+
if (useHttp) {
|
|
523
|
+
// HTTP transport mode
|
|
524
|
+
const httpPort = parseInt(process.env.MCP_PORT || '3000', 10);
|
|
525
|
+
const httpHost = process.env.MCP_HOST || 'localhost';
|
|
526
|
+
const httpTransport = new StreamableHTTPServerTransport({
|
|
527
|
+
port: httpPort,
|
|
528
|
+
host: httpHost
|
|
529
|
+
});
|
|
530
|
+
try {
|
|
531
|
+
await server.connect(httpTransport);
|
|
532
|
+
console.log(`✅ Simple Memory MCP server running on HTTP: http://${httpHost}:${httpPort}/mcp`);
|
|
533
|
+
}
|
|
534
|
+
catch (error) {
|
|
535
|
+
console.error('Failed to start HTTP transport:', error instanceof Error ? error.message : error);
|
|
536
|
+
if (error instanceof Error && error.stack) {
|
|
537
|
+
debugLog('Stack trace:', error.stack);
|
|
538
|
+
}
|
|
539
|
+
process.exit(1);
|
|
540
|
+
}
|
|
541
|
+
}
|
|
542
|
+
if (useStdio) {
|
|
543
|
+
// Stdio transport mode (default or hybrid)
|
|
544
|
+
if (useBoth) {
|
|
545
|
+
debugLog('🔌 Hybrid mode: stdio + HTTP');
|
|
546
|
+
// Servers are already connected above in HTTP block
|
|
547
|
+
}
|
|
548
|
+
else {
|
|
549
|
+
const transport = new StdioServerTransport();
|
|
550
|
+
await server.connect(transport);
|
|
551
|
+
debugLog('🔌 Simple Memory MCP server running on stdio');
|
|
552
|
+
}
|
|
553
|
+
}
|
|
554
|
+
}
|
|
555
|
+
}
|
|
556
|
+
// Handle cleanup
|
|
557
|
+
const cleanup = () => {
|
|
558
|
+
if (memoryService) {
|
|
559
|
+
memoryService.close();
|
|
560
|
+
}
|
|
561
|
+
process.exit(0);
|
|
562
|
+
};
|
|
563
|
+
process.on('SIGINT', cleanup);
|
|
564
|
+
process.on('SIGTERM', cleanup);
|
|
565
|
+
process.on('uncaughtException', (error) => {
|
|
566
|
+
console.error('Uncaught exception:', error);
|
|
567
|
+
cleanup();
|
|
568
|
+
});
|
|
569
|
+
main().catch((error) => {
|
|
570
|
+
console.error('Fatal error:', error);
|
|
571
|
+
cleanup();
|
|
572
|
+
});
|
|
573
|
+
//# 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,57 @@
|
|
|
1
|
+
import type { ExportFormat } from '../types/tools.js';
|
|
2
|
+
export interface BackupConfig {
|
|
3
|
+
backupPath: string;
|
|
4
|
+
autoBackupInterval?: number;
|
|
5
|
+
maxBackups?: number;
|
|
6
|
+
source?: string;
|
|
7
|
+
getBackupData: () => ExportFormat;
|
|
8
|
+
}
|
|
9
|
+
export declare class BackupService {
|
|
10
|
+
private config;
|
|
11
|
+
private lastBackupTime;
|
|
12
|
+
constructor(config: BackupConfig);
|
|
13
|
+
/**
|
|
14
|
+
* Get path to backup metadata file
|
|
15
|
+
*/
|
|
16
|
+
private getMetadataPath;
|
|
17
|
+
/**
|
|
18
|
+
* Save backup metadata
|
|
19
|
+
* @returns true if saved successfully, false on error
|
|
20
|
+
*/
|
|
21
|
+
private saveMetadata;
|
|
22
|
+
/**
|
|
23
|
+
* Get last backup time from metadata file
|
|
24
|
+
* @returns timestamp in milliseconds, or 0 if no metadata exists
|
|
25
|
+
*/
|
|
26
|
+
private getLastBackupTime;
|
|
27
|
+
/**
|
|
28
|
+
* Create a JSON export backup of all memories
|
|
29
|
+
*/
|
|
30
|
+
backup(label?: string): string | null;
|
|
31
|
+
/**
|
|
32
|
+
* Check if backup should be created based on throttle interval
|
|
33
|
+
*/
|
|
34
|
+
shouldBackup(): boolean;
|
|
35
|
+
/**
|
|
36
|
+
* Backup if enough time has passed since last backup (lazy backup on write)
|
|
37
|
+
*/
|
|
38
|
+
backupIfNeeded(): string | null;
|
|
39
|
+
/**
|
|
40
|
+
* Initialize lazy backup mode (creates initial backup if needed)
|
|
41
|
+
* Backups will be created on write operations when interval has passed
|
|
42
|
+
*/
|
|
43
|
+
initialize(): void;
|
|
44
|
+
/**
|
|
45
|
+
* Clean up old backups, keeping only the most recent N
|
|
46
|
+
*/
|
|
47
|
+
private cleanupOldBackups;
|
|
48
|
+
/**
|
|
49
|
+
* Get count of available backups
|
|
50
|
+
*/
|
|
51
|
+
getBackupCount(): number;
|
|
52
|
+
/**
|
|
53
|
+
* Get time since last backup in minutes
|
|
54
|
+
*/
|
|
55
|
+
getTimeSinceLastBackup(): number;
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=backup-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backup-service.d.ts","sourceRoot":"","sources":["../../src/services/backup-service.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEtD,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,YAAY,CAAC;CACnC;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,cAAc,CAAa;gBAEvB,MAAM,EAAE,YAAY;IAmBhC;;OAEG;IACH,OAAO,CAAC,eAAe;IAIvB;;;OAGG;IACH,OAAO,CAAC,YAAY;IAcpB;;;OAGG;IACH,OAAO,CAAC,iBAAiB;IAsBzB;;OAEG;IACH,MAAM,CAAC,KAAK,GAAE,MAAiB,GAAG,MAAM,GAAG,IAAI;IA+B/C;;OAEG;IACH,YAAY,IAAI,OAAO;IAUvB;;OAEG;IACH,cAAc,IAAI,MAAM,GAAG,IAAI;IAO/B;;;OAGG;IACH,UAAU,IAAI,IAAI;IAMlB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAmCzB;;OAEG;IACH,cAAc,IAAI,MAAM;IAcxB;;OAEG;IACH,sBAAsB,IAAI,MAAM;CAIjC"}
|