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
|
@@ -0,0 +1,342 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Comprehensive GraphQL Test Suite
|
|
3
|
+
* Tests all CRUD operations, search, batching, and error handling via GraphQL
|
|
4
|
+
*/
|
|
5
|
+
import { MemoryService } from '../services/memory-service.js';
|
|
6
|
+
import { execute } from '../tools/memory-graphql/executor.js';
|
|
7
|
+
import { unlink } from 'fs/promises';
|
|
8
|
+
const TEST_DB = './test-graphql.db';
|
|
9
|
+
let memoryService;
|
|
10
|
+
let context;
|
|
11
|
+
async function setup() {
|
|
12
|
+
// Clean up any existing test database
|
|
13
|
+
try {
|
|
14
|
+
await unlink(TEST_DB);
|
|
15
|
+
}
|
|
16
|
+
catch { /* ignore if doesn't exist */ }
|
|
17
|
+
memoryService = new MemoryService(TEST_DB);
|
|
18
|
+
memoryService.initialize();
|
|
19
|
+
context = { memoryService, config: {} };
|
|
20
|
+
}
|
|
21
|
+
async function cleanup() {
|
|
22
|
+
memoryService?.close();
|
|
23
|
+
try {
|
|
24
|
+
await unlink(TEST_DB);
|
|
25
|
+
}
|
|
26
|
+
catch { /* ignore */ }
|
|
27
|
+
}
|
|
28
|
+
async function runTest(name, testFn) {
|
|
29
|
+
const start = Date.now();
|
|
30
|
+
try {
|
|
31
|
+
await testFn();
|
|
32
|
+
return { name, success: true, duration: Date.now() - start };
|
|
33
|
+
}
|
|
34
|
+
catch (error) {
|
|
35
|
+
return {
|
|
36
|
+
name,
|
|
37
|
+
success: false,
|
|
38
|
+
error: error instanceof Error ? error.message : String(error),
|
|
39
|
+
duration: Date.now() - start
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
// ============================================================================
|
|
44
|
+
// TESTS
|
|
45
|
+
// ============================================================================
|
|
46
|
+
async function testStats() {
|
|
47
|
+
const result = await execute({ query: '{ stats { totalMemories version schemaVersion } }' }, context);
|
|
48
|
+
if (result.errors)
|
|
49
|
+
throw new Error(`Stats query failed: ${result.errors[0].message}`);
|
|
50
|
+
if (typeof result.data?.stats?.totalMemories !== 'number') {
|
|
51
|
+
throw new Error('Stats should return totalMemories as number');
|
|
52
|
+
}
|
|
53
|
+
if (!result.data?.stats?.version) {
|
|
54
|
+
throw new Error('Stats should return version');
|
|
55
|
+
}
|
|
56
|
+
console.log(` ✓ Stats: ${result.data.stats.totalMemories} memories, v${result.data.stats.version}`);
|
|
57
|
+
}
|
|
58
|
+
async function testStoreMutation() {
|
|
59
|
+
const result = await execute({
|
|
60
|
+
query: `mutation {
|
|
61
|
+
store(content: "Test memory for GraphQL comprehensive test", tags: ["test", "graphql"]) {
|
|
62
|
+
success
|
|
63
|
+
hash
|
|
64
|
+
error
|
|
65
|
+
}
|
|
66
|
+
}`
|
|
67
|
+
}, context);
|
|
68
|
+
if (result.errors)
|
|
69
|
+
throw new Error(`Store mutation failed: ${result.errors[0].message}`);
|
|
70
|
+
if (!result.data?.store?.success) {
|
|
71
|
+
throw new Error(`Store failed: ${result.data?.store?.error || 'unknown'}`);
|
|
72
|
+
}
|
|
73
|
+
if (!result.data?.store?.hash) {
|
|
74
|
+
throw new Error('Store should return hash');
|
|
75
|
+
}
|
|
76
|
+
console.log(` ✓ Stored memory with hash: ${result.data.store.hash.slice(0, 8)}...`);
|
|
77
|
+
return result.data.store.hash;
|
|
78
|
+
}
|
|
79
|
+
async function testSearchByQuery(expectedHash) {
|
|
80
|
+
const result = await execute({
|
|
81
|
+
query: '{ memories(query: "comprehensive test", limit: 5) { hash title tags } }'
|
|
82
|
+
}, context);
|
|
83
|
+
if (result.errors)
|
|
84
|
+
throw new Error(`Search failed: ${result.errors[0].message}`);
|
|
85
|
+
if (!Array.isArray(result.data?.memories)) {
|
|
86
|
+
throw new Error('Search should return memories array');
|
|
87
|
+
}
|
|
88
|
+
const found = result.data.memories.find((m) => m.hash === expectedHash);
|
|
89
|
+
if (!found) {
|
|
90
|
+
throw new Error('Should find the stored memory by content search');
|
|
91
|
+
}
|
|
92
|
+
console.log(` ✓ Found ${result.data.memories.length} memories by content search`);
|
|
93
|
+
}
|
|
94
|
+
async function testSearchByTags(expectedHash) {
|
|
95
|
+
const result = await execute({
|
|
96
|
+
query: '{ memories(tags: ["graphql"], limit: 10) { hash title tags } }'
|
|
97
|
+
}, context);
|
|
98
|
+
if (result.errors)
|
|
99
|
+
throw new Error(`Tag search failed: ${result.errors[0].message}`);
|
|
100
|
+
if (!Array.isArray(result.data?.memories)) {
|
|
101
|
+
throw new Error('Tag search should return memories array');
|
|
102
|
+
}
|
|
103
|
+
const found = result.data.memories.find((m) => m.hash === expectedHash);
|
|
104
|
+
if (!found) {
|
|
105
|
+
throw new Error('Should find the stored memory by tag search');
|
|
106
|
+
}
|
|
107
|
+
console.log(` ✓ Found ${result.data.memories.length} memories by tag search`);
|
|
108
|
+
}
|
|
109
|
+
async function testGetByHash(hash) {
|
|
110
|
+
const result = await execute({
|
|
111
|
+
query: `{ memory(hash: "${hash}") { hash content tags createdAt } }`
|
|
112
|
+
}, context);
|
|
113
|
+
if (result.errors)
|
|
114
|
+
throw new Error(`Get by hash failed: ${result.errors[0].message}`);
|
|
115
|
+
if (!result.data?.memory) {
|
|
116
|
+
throw new Error('Should find memory by hash');
|
|
117
|
+
}
|
|
118
|
+
if (result.data.memory.hash !== hash) {
|
|
119
|
+
throw new Error('Returned hash should match requested hash');
|
|
120
|
+
}
|
|
121
|
+
if (!result.data.memory.content.includes('comprehensive test')) {
|
|
122
|
+
throw new Error('Content should match stored content');
|
|
123
|
+
}
|
|
124
|
+
console.log(` ✓ Retrieved memory by hash with ${result.data.memory.tags.length} tags`);
|
|
125
|
+
}
|
|
126
|
+
async function testUpdateMutation(hash) {
|
|
127
|
+
const result = await execute({
|
|
128
|
+
query: `mutation {
|
|
129
|
+
update(hash: "${hash}", content: "Updated content for GraphQL test", tags: ["test", "graphql", "updated"]) {
|
|
130
|
+
success
|
|
131
|
+
newHash
|
|
132
|
+
error
|
|
133
|
+
}
|
|
134
|
+
}`
|
|
135
|
+
}, context);
|
|
136
|
+
if (result.errors)
|
|
137
|
+
throw new Error(`Update mutation failed: ${result.errors[0].message}`);
|
|
138
|
+
if (!result.data?.update?.success) {
|
|
139
|
+
throw new Error(`Update failed: ${result.data?.update?.error || 'unknown'}`);
|
|
140
|
+
}
|
|
141
|
+
if (!result.data?.update?.newHash) {
|
|
142
|
+
throw new Error('Update should return newHash');
|
|
143
|
+
}
|
|
144
|
+
// Verify old hash no longer exists
|
|
145
|
+
const oldCheck = await execute({
|
|
146
|
+
query: `{ memory(hash: "${hash}") { hash } }`
|
|
147
|
+
}, context);
|
|
148
|
+
if (oldCheck.data?.memory) {
|
|
149
|
+
throw new Error('Old hash should no longer exist after update');
|
|
150
|
+
}
|
|
151
|
+
console.log(` ✓ Updated memory, new hash: ${result.data.update.newHash.slice(0, 8)}...`);
|
|
152
|
+
return result.data.update.newHash;
|
|
153
|
+
}
|
|
154
|
+
async function testDeleteMutation(hash) {
|
|
155
|
+
const result = await execute({
|
|
156
|
+
query: `mutation {
|
|
157
|
+
delete(hash: "${hash}") {
|
|
158
|
+
success
|
|
159
|
+
deletedCount
|
|
160
|
+
error
|
|
161
|
+
}
|
|
162
|
+
}`
|
|
163
|
+
}, context);
|
|
164
|
+
if (result.errors)
|
|
165
|
+
throw new Error(`Delete mutation failed: ${result.errors[0].message}`);
|
|
166
|
+
if (!result.data?.delete?.success) {
|
|
167
|
+
throw new Error(`Delete failed: ${result.data?.delete?.error || 'unknown'}`);
|
|
168
|
+
}
|
|
169
|
+
if (result.data?.delete?.deletedCount !== 1) {
|
|
170
|
+
throw new Error('Should delete exactly 1 memory');
|
|
171
|
+
}
|
|
172
|
+
// Verify deletion
|
|
173
|
+
const check = await execute({
|
|
174
|
+
query: `{ memory(hash: "${hash}") { hash } }`
|
|
175
|
+
}, context);
|
|
176
|
+
if (check.data?.memory) {
|
|
177
|
+
throw new Error('Deleted memory should not be found');
|
|
178
|
+
}
|
|
179
|
+
console.log(` ✓ Deleted memory successfully`);
|
|
180
|
+
}
|
|
181
|
+
async function testBatchedQuery() {
|
|
182
|
+
// Store some test data first
|
|
183
|
+
await execute({
|
|
184
|
+
query: `mutation { store(content: "Batch test memory 1", tags: ["batch"]) { hash } }`
|
|
185
|
+
}, context);
|
|
186
|
+
await execute({
|
|
187
|
+
query: `mutation { store(content: "Batch test memory 2", tags: ["batch"]) { hash } }`
|
|
188
|
+
}, context);
|
|
189
|
+
// Batched query - multiple operations in one call
|
|
190
|
+
const result = await execute({
|
|
191
|
+
query: `{
|
|
192
|
+
batchSearch: memories(tags: ["batch"], limit: 5) { hash title }
|
|
193
|
+
stats { totalMemories totalRelationships }
|
|
194
|
+
}`
|
|
195
|
+
}, context);
|
|
196
|
+
if (result.errors)
|
|
197
|
+
throw new Error(`Batched query failed: ${result.errors[0].message}`);
|
|
198
|
+
if (!Array.isArray(result.data?.batchSearch)) {
|
|
199
|
+
throw new Error('Batched search should return array');
|
|
200
|
+
}
|
|
201
|
+
if (typeof result.data?.stats?.totalMemories !== 'number') {
|
|
202
|
+
throw new Error('Batched stats should return totalMemories');
|
|
203
|
+
}
|
|
204
|
+
console.log(` ✓ Batched query: ${result.data.batchSearch.length} results + stats in one call`);
|
|
205
|
+
// Cleanup batch test data
|
|
206
|
+
await execute({
|
|
207
|
+
query: `mutation { delete(tag: "batch") { deletedCount } }`
|
|
208
|
+
}, context);
|
|
209
|
+
}
|
|
210
|
+
async function testDeleteByTag() {
|
|
211
|
+
// Store test memories with specific tag
|
|
212
|
+
await execute({
|
|
213
|
+
query: `mutation { store(content: "Delete by tag test 1", tags: ["delete-test"]) { hash } }`
|
|
214
|
+
}, context);
|
|
215
|
+
await execute({
|
|
216
|
+
query: `mutation { store(content: "Delete by tag test 2", tags: ["delete-test"]) { hash } }`
|
|
217
|
+
}, context);
|
|
218
|
+
// Delete by tag
|
|
219
|
+
const result = await execute({
|
|
220
|
+
query: `mutation { delete(tag: "delete-test") { success deletedCount } }`
|
|
221
|
+
}, context);
|
|
222
|
+
if (result.errors)
|
|
223
|
+
throw new Error(`Delete by tag failed: ${result.errors[0].message}`);
|
|
224
|
+
if (!result.data?.delete?.success) {
|
|
225
|
+
throw new Error('Delete by tag should succeed');
|
|
226
|
+
}
|
|
227
|
+
if (result.data?.delete?.deletedCount < 2) {
|
|
228
|
+
throw new Error('Should delete at least 2 memories');
|
|
229
|
+
}
|
|
230
|
+
console.log(` ✓ Deleted ${result.data.delete.deletedCount} memories by tag`);
|
|
231
|
+
}
|
|
232
|
+
async function testErrorHandling() {
|
|
233
|
+
// Invalid query syntax
|
|
234
|
+
const syntaxError = await execute({ query: '{ invalid' }, context);
|
|
235
|
+
if (!syntaxError.errors || syntaxError.errors.length === 0) {
|
|
236
|
+
throw new Error('Invalid syntax should return errors');
|
|
237
|
+
}
|
|
238
|
+
// Non-existent field
|
|
239
|
+
const fieldError = await execute({ query: '{ nonExistentField }' }, context);
|
|
240
|
+
if (!fieldError.errors || fieldError.errors.length === 0) {
|
|
241
|
+
throw new Error('Non-existent field should return errors');
|
|
242
|
+
}
|
|
243
|
+
// Update non-existent memory
|
|
244
|
+
const updateError = await execute({
|
|
245
|
+
query: `mutation { update(hash: "nonexistent123", content: "test") { success error } }`
|
|
246
|
+
}, context);
|
|
247
|
+
if (updateError.data?.update?.success !== false) {
|
|
248
|
+
throw new Error('Update non-existent should return success: false');
|
|
249
|
+
}
|
|
250
|
+
// Delete without hash or tag
|
|
251
|
+
const deleteError = await execute({
|
|
252
|
+
query: `mutation { delete { success error } }`
|
|
253
|
+
}, context);
|
|
254
|
+
if (deleteError.data?.delete?.success !== false) {
|
|
255
|
+
throw new Error('Delete without params should return success: false');
|
|
256
|
+
}
|
|
257
|
+
console.log(` ✓ Error handling works correctly`);
|
|
258
|
+
}
|
|
259
|
+
async function testRelatedMemories() {
|
|
260
|
+
// Store related memories
|
|
261
|
+
const result1 = await execute({
|
|
262
|
+
query: `mutation { store(content: "TypeScript fundamentals guide", tags: ["typescript", "guide"]) { hash } }`
|
|
263
|
+
}, context);
|
|
264
|
+
const hash1 = result1.data?.store?.hash;
|
|
265
|
+
await execute({
|
|
266
|
+
query: `mutation { store(content: "Advanced TypeScript patterns", tags: ["typescript", "advanced"]) { hash } }`
|
|
267
|
+
}, context);
|
|
268
|
+
// Query related memories
|
|
269
|
+
const related = await execute({
|
|
270
|
+
query: `{ related(hash: "${hash1}", limit: 5) { hash title tags } }`
|
|
271
|
+
}, context);
|
|
272
|
+
if (related.errors)
|
|
273
|
+
throw new Error(`Related query failed: ${related.errors[0].message}`);
|
|
274
|
+
// Related might be empty if no relationships created, that's OK
|
|
275
|
+
console.log(` ✓ Related query returned ${related.data?.related?.length || 0} related memories`);
|
|
276
|
+
// Cleanup
|
|
277
|
+
await execute({
|
|
278
|
+
query: `mutation { delete(tag: "typescript") { deletedCount } }`
|
|
279
|
+
}, context);
|
|
280
|
+
}
|
|
281
|
+
// ============================================================================
|
|
282
|
+
// MAIN
|
|
283
|
+
// ============================================================================
|
|
284
|
+
async function runAllTests() {
|
|
285
|
+
console.log('🧪 GraphQL Comprehensive Test Suite');
|
|
286
|
+
console.log('====================================\n');
|
|
287
|
+
await setup();
|
|
288
|
+
const results = [];
|
|
289
|
+
let storedHash = '';
|
|
290
|
+
let updatedHash = '';
|
|
291
|
+
// Run tests in sequence (some depend on previous results)
|
|
292
|
+
console.log('Running tests...\n');
|
|
293
|
+
results.push(await runTest('Stats Query', testStats));
|
|
294
|
+
results.push(await runTest('Store Mutation', async () => {
|
|
295
|
+
storedHash = await testStoreMutation();
|
|
296
|
+
}));
|
|
297
|
+
results.push(await runTest('Search by Query', async () => {
|
|
298
|
+
await testSearchByQuery(storedHash);
|
|
299
|
+
}));
|
|
300
|
+
results.push(await runTest('Search by Tags', async () => {
|
|
301
|
+
await testSearchByTags(storedHash);
|
|
302
|
+
}));
|
|
303
|
+
results.push(await runTest('Get by Hash', async () => {
|
|
304
|
+
await testGetByHash(storedHash);
|
|
305
|
+
}));
|
|
306
|
+
results.push(await runTest('Update Mutation', async () => {
|
|
307
|
+
updatedHash = await testUpdateMutation(storedHash);
|
|
308
|
+
}));
|
|
309
|
+
results.push(await runTest('Delete Mutation', async () => {
|
|
310
|
+
await testDeleteMutation(updatedHash);
|
|
311
|
+
}));
|
|
312
|
+
results.push(await runTest('Batched Query', testBatchedQuery));
|
|
313
|
+
results.push(await runTest('Delete by Tag', testDeleteByTag));
|
|
314
|
+
results.push(await runTest('Related Memories', testRelatedMemories));
|
|
315
|
+
results.push(await runTest('Error Handling', testErrorHandling));
|
|
316
|
+
// Summary
|
|
317
|
+
console.log('\n📊 Test Summary');
|
|
318
|
+
console.log('===============');
|
|
319
|
+
const passed = results.filter(r => r.success).length;
|
|
320
|
+
const total = results.length;
|
|
321
|
+
const totalTime = results.reduce((sum, r) => sum + r.duration, 0);
|
|
322
|
+
for (const r of results) {
|
|
323
|
+
const icon = r.success ? '✅' : '❌';
|
|
324
|
+
console.log(`${icon} ${r.name} (${r.duration}ms)${r.error ? ` - ${r.error}` : ''}`);
|
|
325
|
+
}
|
|
326
|
+
console.log(`\nPassed: ${passed}/${total}`);
|
|
327
|
+
console.log(`Total time: ${totalTime}ms`);
|
|
328
|
+
await cleanup();
|
|
329
|
+
console.log('\n🧹 Test database cleaned up');
|
|
330
|
+
if (passed !== total) {
|
|
331
|
+
console.log('\n💥 Some tests failed!');
|
|
332
|
+
process.exit(1);
|
|
333
|
+
}
|
|
334
|
+
else {
|
|
335
|
+
console.log('\n🎉 All tests passed!');
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
runAllTests().catch(error => {
|
|
339
|
+
console.error('Test runner failed:', error);
|
|
340
|
+
process.exit(1);
|
|
341
|
+
});
|
|
342
|
+
//# sourceMappingURL=graphql-comprehensive-test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graphql-comprehensive-test.js","sourceRoot":"","sources":["../../src/tests/graphql-comprehensive-test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graphql-performance-test.d.ts","sourceRoot":"","sources":["../../src/tests/graphql-performance-test.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GraphQL Performance Benchmark
|
|
3
|
+
* Compares GraphQL layer overhead vs direct MemoryService calls
|
|
4
|
+
*/
|
|
5
|
+
import { MemoryService } from '../services/memory-service.js';
|
|
6
|
+
import { execute as executeGraphQL } from '../tools/memory-graphql/executor.js';
|
|
7
|
+
import { unlink } from 'fs/promises';
|
|
8
|
+
const TEST_DB = './perf-test.db';
|
|
9
|
+
const ITERATIONS = 100;
|
|
10
|
+
async function cleanup() {
|
|
11
|
+
try {
|
|
12
|
+
await unlink(TEST_DB);
|
|
13
|
+
}
|
|
14
|
+
catch { /* ignore */ }
|
|
15
|
+
}
|
|
16
|
+
async function benchmark(name, fn, iterations = ITERATIONS) {
|
|
17
|
+
// Warmup
|
|
18
|
+
for (let i = 0; i < 5; i++)
|
|
19
|
+
await fn();
|
|
20
|
+
const start = performance.now();
|
|
21
|
+
for (let i = 0; i < iterations; i++) {
|
|
22
|
+
await fn();
|
|
23
|
+
}
|
|
24
|
+
const elapsed = performance.now() - start;
|
|
25
|
+
const avgMs = elapsed / iterations;
|
|
26
|
+
const opsPerSec = Math.round(1000 / avgMs);
|
|
27
|
+
console.log(` ${name}: ${avgMs.toFixed(3)}ms avg (${opsPerSec.toLocaleString()} ops/sec)`);
|
|
28
|
+
return avgMs;
|
|
29
|
+
}
|
|
30
|
+
async function runBenchmarks() {
|
|
31
|
+
console.log('🏎️ GraphQL vs Direct MemoryService Performance\n');
|
|
32
|
+
console.log(`Iterations per test: ${ITERATIONS}\n`);
|
|
33
|
+
await cleanup();
|
|
34
|
+
const memoryService = new MemoryService(TEST_DB);
|
|
35
|
+
memoryService.initialize();
|
|
36
|
+
const context = { memoryService, config: {} };
|
|
37
|
+
// Seed some data
|
|
38
|
+
console.log('Seeding test data...');
|
|
39
|
+
for (let i = 0; i < 50; i++) {
|
|
40
|
+
memoryService.store(`Test memory ${i} with some content about topic ${i % 10}`, [`tag${i % 5}`, 'test']);
|
|
41
|
+
}
|
|
42
|
+
console.log('');
|
|
43
|
+
// ============================================================================
|
|
44
|
+
// STORE BENCHMARKS
|
|
45
|
+
// ============================================================================
|
|
46
|
+
console.log('📝 STORE OPERATIONS:');
|
|
47
|
+
let storeCounter = 1000;
|
|
48
|
+
const directStoreTime = await benchmark('Direct MemoryService.store()', async () => {
|
|
49
|
+
memoryService.store(`Benchmark content ${storeCounter++}`, ['benchmark']);
|
|
50
|
+
});
|
|
51
|
+
const graphqlStoreTime = await benchmark('GraphQL mutation { store }', async () => {
|
|
52
|
+
await executeGraphQL({
|
|
53
|
+
query: `mutation { store(content: "GraphQL benchmark ${storeCounter++}", tags: ["benchmark"]) { hash } }`
|
|
54
|
+
}, context);
|
|
55
|
+
});
|
|
56
|
+
console.log(` → GraphQL overhead: ${((graphqlStoreTime / directStoreTime - 1) * 100).toFixed(1)}%\n`);
|
|
57
|
+
// ============================================================================
|
|
58
|
+
// SEARCH BENCHMARKS
|
|
59
|
+
// ============================================================================
|
|
60
|
+
console.log('🔍 SEARCH OPERATIONS:');
|
|
61
|
+
const directSearchTime = await benchmark('Direct MemoryService.search()', async () => {
|
|
62
|
+
memoryService.search('topic', undefined, 10);
|
|
63
|
+
});
|
|
64
|
+
const graphqlSearchTime = await benchmark('GraphQL { memories(query) }', async () => {
|
|
65
|
+
await executeGraphQL({
|
|
66
|
+
query: '{ memories(query: "topic", limit: 10) { hash title } }'
|
|
67
|
+
}, context);
|
|
68
|
+
});
|
|
69
|
+
console.log(` → GraphQL overhead: ${((graphqlSearchTime / directSearchTime - 1) * 100).toFixed(1)}%\n`);
|
|
70
|
+
// ============================================================================
|
|
71
|
+
// TAG SEARCH BENCHMARKS
|
|
72
|
+
// ============================================================================
|
|
73
|
+
console.log('🏷️ TAG SEARCH:');
|
|
74
|
+
const directTagTime = await benchmark('Direct MemoryService.search(tags)', async () => {
|
|
75
|
+
memoryService.search(undefined, ['tag1'], 10);
|
|
76
|
+
});
|
|
77
|
+
const graphqlTagTime = await benchmark('GraphQL { memories(tags) }', async () => {
|
|
78
|
+
await executeGraphQL({
|
|
79
|
+
query: '{ memories(tags: ["tag1"], limit: 10) { hash title tags } }'
|
|
80
|
+
}, context);
|
|
81
|
+
});
|
|
82
|
+
console.log(` → GraphQL overhead: ${((graphqlTagTime / directTagTime - 1) * 100).toFixed(1)}%\n`);
|
|
83
|
+
// ============================================================================
|
|
84
|
+
// STATS BENCHMARKS
|
|
85
|
+
// ============================================================================
|
|
86
|
+
console.log('📊 STATS:');
|
|
87
|
+
const directStatsTime = await benchmark('Direct MemoryService.stats()', async () => {
|
|
88
|
+
memoryService.stats();
|
|
89
|
+
});
|
|
90
|
+
const graphqlStatsTime = await benchmark('GraphQL { stats }', async () => {
|
|
91
|
+
await executeGraphQL({
|
|
92
|
+
query: '{ stats { totalMemories version } }'
|
|
93
|
+
}, context);
|
|
94
|
+
});
|
|
95
|
+
console.log(` → GraphQL overhead: ${((graphqlStatsTime / directStatsTime - 1) * 100).toFixed(1)}%\n`);
|
|
96
|
+
// ============================================================================
|
|
97
|
+
// BATCHED QUERY (GraphQL advantage)
|
|
98
|
+
// ============================================================================
|
|
99
|
+
console.log('⚡ BATCHED OPERATIONS (GraphQL advantage):');
|
|
100
|
+
const separateCallsTime = await benchmark('3 separate direct calls', async () => {
|
|
101
|
+
memoryService.search('topic', undefined, 5);
|
|
102
|
+
memoryService.search(undefined, ['tag1'], 5);
|
|
103
|
+
memoryService.stats();
|
|
104
|
+
});
|
|
105
|
+
const batchedGraphqlTime = await benchmark('1 batched GraphQL call', async () => {
|
|
106
|
+
await executeGraphQL({
|
|
107
|
+
query: `{
|
|
108
|
+
search: memories(query: "topic", limit: 5) { hash title }
|
|
109
|
+
tagged: memories(tags: ["tag1"], limit: 5) { hash title }
|
|
110
|
+
stats { totalMemories }
|
|
111
|
+
}`
|
|
112
|
+
}, context);
|
|
113
|
+
});
|
|
114
|
+
console.log(` → Batched is ${(separateCallsTime / batchedGraphqlTime).toFixed(1)}x the throughput of 3 separate\n`);
|
|
115
|
+
// ============================================================================
|
|
116
|
+
// SUMMARY
|
|
117
|
+
// ============================================================================
|
|
118
|
+
console.log('═══════════════════════════════════════════════════');
|
|
119
|
+
console.log('📋 SUMMARY:');
|
|
120
|
+
console.log('═══════════════════════════════════════════════════');
|
|
121
|
+
console.log(`
|
|
122
|
+
GraphQL adds ~0.3-0.6ms overhead per call for:
|
|
123
|
+
- Query parsing & validation
|
|
124
|
+
- Resolver dispatch
|
|
125
|
+
(Schema is cached after first call)
|
|
126
|
+
|
|
127
|
+
But enables:
|
|
128
|
+
- Batched queries (multiple ops in 1 call)
|
|
129
|
+
- Field selection (return only what you need)
|
|
130
|
+
- 62% reduction in MCP tools (8→3)
|
|
131
|
+
|
|
132
|
+
For MCP usage, GraphQL overhead is negligible compared to:
|
|
133
|
+
- Network round-trip time (~50-200ms)
|
|
134
|
+
- LLM processing time (~500-2000ms)
|
|
135
|
+
- Context token costs
|
|
136
|
+
`);
|
|
137
|
+
memoryService.close();
|
|
138
|
+
await cleanup();
|
|
139
|
+
}
|
|
140
|
+
runBenchmarks().catch(console.error);
|
|
141
|
+
//# sourceMappingURL=graphql-performance-test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graphql-performance-test.js","sourceRoot":"","sources":["../../src/tests/graphql-performance-test.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,qCAAqC,CAAC;AAChF,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,MAAM,OAAO,GAAG,gBAAgB,CAAC;AACjC,MAAM,UAAU,GAAG,GAAG,CAAC;AAEvB,KAAK,UAAU,OAAO;IACpB,IAAI,CAAC;QAAC,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;AACvD,CAAC;AAED,KAAK,UAAU,SAAS,CAAC,IAAY,EAAE,EAAuB,EAAE,aAAqB,UAAU;IAC7F,SAAS;IACT,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;QAAE,MAAM,EAAE,EAAE,CAAC;IAEvC,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;IAChC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,EAAE,CAAC,EAAE,EAAE,CAAC;QACpC,MAAM,EAAE,EAAE,CAAC;IACb,CAAC;IACD,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;IAC1C,MAAM,KAAK,GAAG,OAAO,GAAG,UAAU,CAAC;IACnC,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC;IAE3C,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,KAAK,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,SAAS,CAAC,cAAc,EAAE,WAAW,CAAC,CAAC;IAC5F,OAAO,KAAK,CAAC;AACf,CAAC;AAED,KAAK,UAAU,aAAa;IAC1B,OAAO,CAAC,GAAG,CAAC,oDAAoD,CAAC,CAAC;IAClE,OAAO,CAAC,GAAG,CAAC,wBAAwB,UAAU,IAAI,CAAC,CAAC;IAEpD,MAAM,OAAO,EAAE,CAAC;IAEhB,MAAM,aAAa,GAAG,IAAI,aAAa,CAAC,OAAO,CAAC,CAAC;IACjD,aAAa,CAAC,UAAU,EAAE,CAAC;IAC3B,MAAM,OAAO,GAAG,EAAE,aAAa,EAAE,MAAM,EAAE,EAAE,EAAS,CAAC;IAErD,iBAAiB;IACjB,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;IACpC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5B,aAAa,CAAC,KAAK,CAAC,eAAe,CAAC,kCAAkC,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC;IAC3G,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,+EAA+E;IAC/E,mBAAmB;IACnB,+EAA+E;IAC/E,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;IAEpC,IAAI,YAAY,GAAG,IAAI,CAAC;IACxB,MAAM,eAAe,GAAG,MAAM,SAAS,CAAC,8BAA8B,EAAE,KAAK,IAAI,EAAE;QACjF,aAAa,CAAC,KAAK,CAAC,qBAAqB,YAAY,EAAE,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC;IAC5E,CAAC,CAAC,CAAC;IAEH,MAAM,gBAAgB,GAAG,MAAM,SAAS,CAAC,4BAA4B,EAAE,KAAK,IAAI,EAAE;QAChF,MAAM,cAAc,CAAC;YACnB,KAAK,EAAE,gDAAgD,YAAY,EAAE,oCAAoC;SAC1G,EAAE,OAAO,CAAC,CAAC;IACd,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC,gBAAgB,GAAG,eAAe,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IAEvG,+EAA+E;IAC/E,oBAAoB;IACpB,+EAA+E;IAC/E,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;IAErC,MAAM,gBAAgB,GAAG,MAAM,SAAS,CAAC,+BAA+B,EAAE,KAAK,IAAI,EAAE;QACnF,aAAa,CAAC,MAAM,CAAC,OAAO,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,MAAM,iBAAiB,GAAG,MAAM,SAAS,CAAC,6BAA6B,EAAE,KAAK,IAAI,EAAE;QAClF,MAAM,cAAc,CAAC;YACnB,KAAK,EAAE,wDAAwD;SAChE,EAAE,OAAO,CAAC,CAAC;IACd,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC,iBAAiB,GAAG,gBAAgB,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IAEzG,+EAA+E;IAC/E,wBAAwB;IACxB,+EAA+E;IAC/E,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;IAEhC,MAAM,aAAa,GAAG,MAAM,SAAS,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;QACpF,aAAa,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,MAAM,cAAc,GAAG,MAAM,SAAS,CAAC,4BAA4B,EAAE,KAAK,IAAI,EAAE;QAC9E,MAAM,cAAc,CAAC;YACnB,KAAK,EAAE,6DAA6D;SACrE,EAAE,OAAO,CAAC,CAAC;IACd,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC,cAAc,GAAG,aAAa,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IAEnG,+EAA+E;IAC/E,mBAAmB;IACnB,+EAA+E;IAC/E,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IAEzB,MAAM,eAAe,GAAG,MAAM,SAAS,CAAC,8BAA8B,EAAE,KAAK,IAAI,EAAE;QACjF,aAAa,CAAC,KAAK,EAAE,CAAC;IACxB,CAAC,CAAC,CAAC;IAEH,MAAM,gBAAgB,GAAG,MAAM,SAAS,CAAC,mBAAmB,EAAE,KAAK,IAAI,EAAE;QACvE,MAAM,cAAc,CAAC;YACnB,KAAK,EAAE,qCAAqC;SAC7C,EAAE,OAAO,CAAC,CAAC;IACd,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC,gBAAgB,GAAG,eAAe,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IAEvG,+EAA+E;IAC/E,oCAAoC;IACpC,+EAA+E;IAC/E,OAAO,CAAC,GAAG,CAAC,2CAA2C,CAAC,CAAC;IAEzD,MAAM,iBAAiB,GAAG,MAAM,SAAS,CAAC,yBAAyB,EAAE,KAAK,IAAI,EAAE;QAC9E,aAAa,CAAC,MAAM,CAAC,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC;QAC5C,aAAa,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;QAC7C,aAAa,CAAC,KAAK,EAAE,CAAC;IACxB,CAAC,CAAC,CAAC;IAEH,MAAM,kBAAkB,GAAG,MAAM,SAAS,CAAC,wBAAwB,EAAE,KAAK,IAAI,EAAE;QAC9E,MAAM,cAAc,CAAC;YACnB,KAAK,EAAE;;;;QAIL;SACH,EAAE,OAAO,CAAC,CAAC;IACd,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,iBAAiB,GAAG,kBAAkB,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,kCAAkC,CAAC,CAAC;IAErH,+EAA+E;IAC/E,UAAU;IACV,+EAA+E;IAC/E,OAAO,CAAC,GAAG,CAAC,qDAAqD,CAAC,CAAC;IACnE,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;IAC3B,OAAO,CAAC,GAAG,CAAC,qDAAqD,CAAC,CAAC;IACnE,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;GAeX,CAAC,CAAC;IAEH,aAAa,CAAC,KAAK,EAAE,CAAC;IACtB,MAAM,OAAO,EAAE,CAAC;AAClB,CAAC;AAED,aAAa,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graphql-test.d.ts","sourceRoot":"","sources":["../../src/tests/graphql-test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Quick test for GraphQL tool
|
|
3
|
+
*/
|
|
4
|
+
import { MemoryService } from '../services/memory-service.js';
|
|
5
|
+
import { execute } from '../tools/memory-graphql/executor.js';
|
|
6
|
+
const dbPath = process.env.MEMORY_DB || './memory.db';
|
|
7
|
+
const memoryService = new MemoryService(dbPath);
|
|
8
|
+
memoryService.initialize();
|
|
9
|
+
const context = { memoryService, config: {} };
|
|
10
|
+
async function test() {
|
|
11
|
+
console.log('=== Testing GraphQL Tool ===\n');
|
|
12
|
+
// Test 1: Stats
|
|
13
|
+
console.log('1. Stats query:');
|
|
14
|
+
const stats = await execute({ query: '{ stats { totalMemories version schemaVersion } }' }, context);
|
|
15
|
+
console.log(JSON.stringify(stats, null, 2));
|
|
16
|
+
// Test 2: Search with summaries
|
|
17
|
+
console.log('\n2. Search with title only:');
|
|
18
|
+
const search = await execute({
|
|
19
|
+
query: '{ memories(query: "graphql", limit: 2) { hash title tags } }'
|
|
20
|
+
}, context);
|
|
21
|
+
console.log(JSON.stringify(search, null, 2));
|
|
22
|
+
// Test 3: Get by hash (if we got results)
|
|
23
|
+
if (search.data?.memories?.length > 0) {
|
|
24
|
+
const hash = search.data.memories[0].hash;
|
|
25
|
+
console.log(`\n3. Get full content by hash (${hash.slice(0, 8)}...):`);
|
|
26
|
+
const memory = await execute({
|
|
27
|
+
query: `{ memory(hash: "${hash}") { content tags createdAt } }`
|
|
28
|
+
}, context);
|
|
29
|
+
console.log(JSON.stringify(memory, null, 2));
|
|
30
|
+
}
|
|
31
|
+
// Test 4: Batched query
|
|
32
|
+
console.log('\n4. Batched query (search + stats in one call):');
|
|
33
|
+
const batched = await execute({
|
|
34
|
+
query: `{
|
|
35
|
+
recent: memories(limit: 2) { hash title }
|
|
36
|
+
stats { totalMemories totalRelationships }
|
|
37
|
+
}`
|
|
38
|
+
}, context);
|
|
39
|
+
console.log(JSON.stringify(batched, null, 2));
|
|
40
|
+
// Test 5: Error handling
|
|
41
|
+
console.log('\n5. Error handling (invalid query):');
|
|
42
|
+
const error = await execute({ query: '{ invalid }' }, context);
|
|
43
|
+
console.log(JSON.stringify(error, null, 2));
|
|
44
|
+
memoryService.close();
|
|
45
|
+
}
|
|
46
|
+
test().catch(console.error);
|
|
47
|
+
//# sourceMappingURL=graphql-test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graphql-test.js","sourceRoot":"","sources":["../../src/tests/graphql-test.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,EAAE,OAAO,EAAE,MAAM,qCAAqC,CAAC;AAE9D,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,aAAa,CAAC;AACtD,MAAM,aAAa,GAAG,IAAI,aAAa,CAAC,MAAM,CAAC,CAAC;AAChD,aAAa,CAAC,UAAU,EAAE,CAAC;AAE3B,MAAM,OAAO,GAAG,EAAE,aAAa,EAAE,MAAM,EAAE,EAAE,EAAS,CAAC;AAErD,KAAK,UAAU,IAAI;IACjB,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;IAE9C,gBAAgB;IAChB,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;IAC/B,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,EAAE,KAAK,EAAE,mDAAmD,EAAE,EAAE,OAAO,CAAC,CAAC;IACrG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAE5C,gCAAgC;IAChC,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;IAC5C,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC;QAC3B,KAAK,EAAE,8DAA8D;KACtE,EAAE,OAAO,CAAC,CAAC;IACZ,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAE7C,0CAA0C;IAC1C,IAAI,MAAM,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,GAAG,CAAC,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAC1C,OAAO,CAAC,GAAG,CAAC,kCAAkC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC;QACvE,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC;YAC3B,KAAK,EAAE,mBAAmB,IAAI,iCAAiC;SAChE,EAAE,OAAO,CAAC,CAAC;QACZ,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAC/C,CAAC;IAED,wBAAwB;IACxB,OAAO,CAAC,GAAG,CAAC,kDAAkD,CAAC,CAAC;IAChE,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC;QAC5B,KAAK,EAAE;;;MAGL;KACH,EAAE,OAAO,CAAC,CAAC;IACZ,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAE9C,yBAAyB;IACzB,OAAO,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC;IACpD,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,EAAE,OAAO,CAAC,CAAC;IAC/D,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAE5C,aAAa,CAAC,KAAK,EAAE,CAAC;AACxB,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-server-tests.d.ts","sourceRoot":"","sources":["../../src/tests/memory-server-tests.ts"],"names":[],"mappings":";AAEA;;;GAGG"}
|