cozo-memory 1.0.6 → 1.0.8
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/README.md +77 -10
- package/dist/cli-commands.js +6 -0
- package/dist/cli.js +80 -0
- package/dist/eval-suite.js +136 -0
- package/dist/hybrid-search.js +99 -0
- package/dist/index.js +361 -43
- package/dist/inference-engine.js +7 -0
- package/dist/make-old.js +58 -0
- package/dist/test-agentic-retrieval.js +28 -0
- package/dist/test-discovery.js +53 -0
- package/dist/test-graphrag.js +35 -0
- package/dist/test-user-profile.js +59 -0
- package/dist/tui.js +6 -4
- package/dist/verify-agentic-logic.js +64 -0
- package/package.json +2 -1
- package/dist/test-mcp-search.js +0 -47
- package/dist/tui-blessed.js +0 -789
- package/dist/tui.py +0 -481
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const index_1 = require("../src/index");
|
|
7
|
+
const path_1 = __importDefault(require("path"));
|
|
8
|
+
const fs_1 = __importDefault(require("fs"));
|
|
9
|
+
async function runTest() {
|
|
10
|
+
const testDbPath = path_1.default.resolve(__dirname, "discovery_test.cozo");
|
|
11
|
+
// Cleanup previous test DB
|
|
12
|
+
if (fs_1.default.existsSync(testDbPath + ".db"))
|
|
13
|
+
fs_1.default.unlinkSync(testDbPath + ".db");
|
|
14
|
+
const server = new index_1.MemoryServer(testDbPath);
|
|
15
|
+
await server.initPromise;
|
|
16
|
+
console.log("1. Creating test entities...");
|
|
17
|
+
const aliceRes = await server.createEntity({
|
|
18
|
+
name: "Alice",
|
|
19
|
+
type: "Person",
|
|
20
|
+
metadata: { role: "Developer" }
|
|
21
|
+
});
|
|
22
|
+
const aliceId = aliceRes.id;
|
|
23
|
+
const phoenixRes = await server.createEntity({
|
|
24
|
+
name: "Project Phoenix",
|
|
25
|
+
type: "Project",
|
|
26
|
+
metadata: { status: "active" }
|
|
27
|
+
});
|
|
28
|
+
const phoenixId = phoenixRes.id;
|
|
29
|
+
console.log("2. Adding overlapping observations...");
|
|
30
|
+
await server.addObservation({
|
|
31
|
+
entity_id: aliceId,
|
|
32
|
+
text: "Alice is currently focusing all her time on Project Phoenix."
|
|
33
|
+
});
|
|
34
|
+
console.log("3. Running reflection in 'discovery' mode...");
|
|
35
|
+
// We specify the model to ensure it uses one that supports JSON mode if possible
|
|
36
|
+
const reflectRes = await server.reflectMemory({
|
|
37
|
+
entity_id: aliceId,
|
|
38
|
+
mode: "discovery"
|
|
39
|
+
});
|
|
40
|
+
console.log("Result:", JSON.stringify(reflectRes, null, 2));
|
|
41
|
+
console.log("4. Verifying relationship creation...");
|
|
42
|
+
const relationsRes = await server.db.run(`
|
|
43
|
+
?[to_name, rel_type] := *relationship{from_id, to_id, relation_type: rel_type, @ "NOW"},
|
|
44
|
+
from_id = $alice,
|
|
45
|
+
*entity{id: to_id, name: to_name, @ "NOW"}
|
|
46
|
+
`, { alice: aliceId });
|
|
47
|
+
console.log("Relationships from Alice:", relationsRes.rows);
|
|
48
|
+
// Cleanup
|
|
49
|
+
if (fs_1.default.existsSync(testDbPath + ".db"))
|
|
50
|
+
fs_1.default.unlinkSync(testDbPath + ".db");
|
|
51
|
+
process.exit(0);
|
|
52
|
+
}
|
|
53
|
+
runTest().catch(console.error);
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const index_1 = require("./index");
|
|
4
|
+
async function run() {
|
|
5
|
+
const server = new index_1.MemoryServer();
|
|
6
|
+
await server.initPromise;
|
|
7
|
+
console.log("Setting up Test Clusters for GraphRAG Community Summaries...");
|
|
8
|
+
// Cluster 1: Frontend
|
|
9
|
+
const fe1 = await server.createEntity({ name: "ReactJS", type: "technology", metadata: {} });
|
|
10
|
+
const fe2 = await server.createEntity({ name: "Redux", type: "technology", metadata: {} });
|
|
11
|
+
const fe3 = await server.createEntity({ name: "Frontend Project A", type: "project", metadata: {} });
|
|
12
|
+
await server.addObservation({ entity_id: fe1.id, text: "ReactJS is used for building UIs." });
|
|
13
|
+
await server.addObservation({ entity_id: fe2.id, text: "Redux is used for state management in React." });
|
|
14
|
+
await server.addObservation({ entity_id: fe3.id, text: "Project A is a heavy frontend SPA using React and Redux." });
|
|
15
|
+
await server.createRelation({ from_id: fe3.id, to_id: fe1.id, relation_type: "uses", strength: 1.0 });
|
|
16
|
+
await server.createRelation({ from_id: fe3.id, to_id: fe2.id, relation_type: "uses", strength: 1.0 });
|
|
17
|
+
await server.createRelation({ from_id: fe1.id, to_id: fe2.id, relation_type: "integrates_with", strength: 1.0 });
|
|
18
|
+
console.log("Created Frontend Cluster");
|
|
19
|
+
// Cluster 2: Backend
|
|
20
|
+
const be1 = await server.createEntity({ name: "PostgreSQL", type: "database", metadata: {} });
|
|
21
|
+
const be2 = await server.createEntity({ name: "CozoDB", type: "database", metadata: {} });
|
|
22
|
+
const be3 = await server.createEntity({ name: "Backend Project B", type: "project", metadata: {} });
|
|
23
|
+
await server.addObservation({ entity_id: be1.id, text: "PostgreSQL is a robust relational database." });
|
|
24
|
+
await server.addObservation({ entity_id: be2.id, text: "CozoDB is a graph database with Datalog." });
|
|
25
|
+
await server.addObservation({ entity_id: be3.id, text: "Project B relies heavily on complex queries across PG and CozoDB." });
|
|
26
|
+
await server.createRelation({ from_id: be3.id, to_id: be1.id, relation_type: "uses", strength: 1.0 });
|
|
27
|
+
await server.createRelation({ from_id: be3.id, to_id: be2.id, relation_type: "uses", strength: 1.0 });
|
|
28
|
+
await server.createRelation({ from_id: be1.id, to_id: be2.id, relation_type: "migrating_to", strength: 1.0 });
|
|
29
|
+
console.log("Created Backend Cluster");
|
|
30
|
+
console.log("Initiating Community Summarization...");
|
|
31
|
+
const result = await server.summarizeCommunities({ min_community_size: 3 });
|
|
32
|
+
console.log("Community Summarization Result:", JSON.stringify(result, null, 2));
|
|
33
|
+
process.exit(0);
|
|
34
|
+
}
|
|
35
|
+
run().catch(console.error);
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const index_1 = require("./index");
|
|
4
|
+
async function testUserProfileEditing() {
|
|
5
|
+
console.log("=== Testing User Profile Editing ===\n");
|
|
6
|
+
const server = new index_1.MemoryServer();
|
|
7
|
+
await server.start();
|
|
8
|
+
try {
|
|
9
|
+
// 1. View current profile
|
|
10
|
+
console.log("1. Current user profile:");
|
|
11
|
+
const currentProfile = await server.editUserProfile({});
|
|
12
|
+
console.log(JSON.stringify(currentProfile, null, 2));
|
|
13
|
+
// 2. Update metadata
|
|
14
|
+
console.log("\n2. Updating profile metadata:");
|
|
15
|
+
const metadataUpdate = await server.editUserProfile({
|
|
16
|
+
metadata: {
|
|
17
|
+
timezone: "Europe/Berlin",
|
|
18
|
+
language: "de",
|
|
19
|
+
work_hours: "09:00-17:00"
|
|
20
|
+
}
|
|
21
|
+
});
|
|
22
|
+
console.log(JSON.stringify(metadataUpdate, null, 2));
|
|
23
|
+
// 3. Add new preferences
|
|
24
|
+
console.log("\n3. Adding new preferences:");
|
|
25
|
+
const addPrefs = await server.editUserProfile({
|
|
26
|
+
observations: [
|
|
27
|
+
{ text: "Prefers TypeScript over JavaScript for type safety" },
|
|
28
|
+
{ text: "Likes clean, minimal code without unnecessary comments" },
|
|
29
|
+
{ text: "Prefers functional programming patterns" }
|
|
30
|
+
]
|
|
31
|
+
});
|
|
32
|
+
console.log(JSON.stringify(addPrefs, null, 2));
|
|
33
|
+
// 4. Clear and reset preferences
|
|
34
|
+
console.log("\n4. Clearing and resetting preferences:");
|
|
35
|
+
const resetPrefs = await server.editUserProfile({
|
|
36
|
+
clear_observations: true,
|
|
37
|
+
observations: [
|
|
38
|
+
{ text: "Works primarily with Node.js and TypeScript", metadata: { category: "tech_stack" } },
|
|
39
|
+
{ text: "Prefers concise documentation", metadata: { category: "style" } }
|
|
40
|
+
]
|
|
41
|
+
});
|
|
42
|
+
console.log(JSON.stringify(resetPrefs, null, 2));
|
|
43
|
+
// 5. Update name and type
|
|
44
|
+
console.log("\n5. Updating profile name and type:");
|
|
45
|
+
const nameUpdate = await server.editUserProfile({
|
|
46
|
+
name: "Developer Profile",
|
|
47
|
+
type: "UserProfile"
|
|
48
|
+
});
|
|
49
|
+
console.log(JSON.stringify(nameUpdate, null, 2));
|
|
50
|
+
console.log("\n=== Test completed successfully ===");
|
|
51
|
+
}
|
|
52
|
+
catch (error) {
|
|
53
|
+
console.error("Test failed:", error);
|
|
54
|
+
}
|
|
55
|
+
finally {
|
|
56
|
+
process.exit(0);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
testUserProfileEditing();
|
package/dist/tui.js
CHANGED
|
@@ -63,13 +63,13 @@ async function main() {
|
|
|
63
63
|
else if (key.downArrow) {
|
|
64
64
|
setState(prev => ({
|
|
65
65
|
...prev,
|
|
66
|
-
selectedIndex: Math.min(
|
|
66
|
+
selectedIndex: Math.min(6, prev.selectedIndex + 1)
|
|
67
67
|
}));
|
|
68
68
|
}
|
|
69
69
|
else if (key.return) {
|
|
70
|
-
const screens = ['entity', 'search', 'graph', 'system', 'result', 'menu'];
|
|
70
|
+
const screens = ['entity', 'profile', 'search', 'graph', 'system', 'result', 'menu'];
|
|
71
71
|
const newScreen = screens[state.selectedIndex];
|
|
72
|
-
if (state.selectedIndex ===
|
|
72
|
+
if (state.selectedIndex === 5) {
|
|
73
73
|
setState(prev => ({ ...prev, loading: true }));
|
|
74
74
|
cli.health().then(result => {
|
|
75
75
|
setState(prev => ({ ...prev, screen: 'result', result, loading: false }));
|
|
@@ -89,7 +89,7 @@ async function main() {
|
|
|
89
89
|
if (state.error) {
|
|
90
90
|
return React.createElement(Box, { flexDirection: 'column', padding: 1 }, React.createElement(Text, { color: 'red' }, `❌ Error: ${state.error}`), React.createElement(Text, { dimColor: true }, 'Press ESC to return to menu'));
|
|
91
91
|
}
|
|
92
|
-
return React.createElement(Box, { flexDirection: 'column', padding: 1 }, React.createElement(Header), state.screen === 'menu' && React.createElement(MainMenu, { selectedIndex: state.selectedIndex }), state.screen === 'entity' && React.createElement(EntityScreen), state.screen === 'search' && React.createElement(SearchScreen), state.screen === 'graph' && React.createElement(GraphScreen), state.screen === 'system' && React.createElement(SystemScreen), state.screen === 'result' && React.createElement(ResultScreen, { result: state.result }), React.createElement(Footer));
|
|
92
|
+
return React.createElement(Box, { flexDirection: 'column', padding: 1 }, React.createElement(Header), state.screen === 'menu' && React.createElement(MainMenu, { selectedIndex: state.selectedIndex }), state.screen === 'entity' && React.createElement(EntityScreen), state.screen === 'profile' && React.createElement(ProfileScreen), state.screen === 'search' && React.createElement(SearchScreen), state.screen === 'graph' && React.createElement(GraphScreen), state.screen === 'system' && React.createElement(SystemScreen), state.screen === 'result' && React.createElement(ResultScreen, { result: state.result }), React.createElement(Footer));
|
|
93
93
|
};
|
|
94
94
|
const Header = () => React.createElement(Box, {
|
|
95
95
|
flexDirection: 'column',
|
|
@@ -107,6 +107,7 @@ async function main() {
|
|
|
107
107
|
const MainMenu = ({ selectedIndex }) => {
|
|
108
108
|
const menuItems = [
|
|
109
109
|
{ icon: '📦', label: 'Entity Operations', desc: 'Create, read, update, delete entities' },
|
|
110
|
+
{ icon: '👤', label: 'User Profile', desc: 'Manage user preferences and profile' },
|
|
110
111
|
{ icon: '🔍', label: 'Search & Context', desc: 'Hybrid search, context retrieval' },
|
|
111
112
|
{ icon: '🕸️', label: 'Graph Operations', desc: 'Explore, PageRank, communities' },
|
|
112
113
|
{ icon: '⚙️', label: 'System Management', desc: 'Health, metrics, export/import' },
|
|
@@ -116,6 +117,7 @@ async function main() {
|
|
|
116
117
|
return React.createElement(Box, { flexDirection: 'column' }, React.createElement(Box, { marginBottom: 1 }, React.createElement(Text, { bold: true, color: 'yellow' }, 'Main Menu')), ...menuItems.map((item, index) => React.createElement(Box, { key: index, marginLeft: 2 }, React.createElement(Text, { color: selectedIndex === index ? 'green' : 'white' }, `${selectedIndex === index ? '▶ ' : ' '}${item.icon} ${item.label}`), selectedIndex === index && React.createElement(Text, { dimColor: true }, ` - ${item.desc}`))));
|
|
117
118
|
};
|
|
118
119
|
const EntityScreen = () => React.createElement(Box, { flexDirection: 'column' }, React.createElement(Text, { bold: true, color: 'cyan' }, '📦 Entity Operations'), React.createElement(Box, { marginTop: 1, flexDirection: 'column', marginLeft: 2 }, React.createElement(Text, null, '• Create Entity: ', React.createElement(Text, { dimColor: true }, 'cozo-memory entity create -n "Name" -t "Type"')), React.createElement(Text, null, '• Get Entity: ', React.createElement(Text, { dimColor: true }, 'cozo-memory entity get -i <id>')), React.createElement(Text, null, '• Delete Entity: ', React.createElement(Text, { dimColor: true }, 'cozo-memory entity delete -i <id>')), React.createElement(Text, null, '• Add Observation: ', React.createElement(Text, { dimColor: true }, 'cozo-memory obs add -i <id> -t "Text"'))), React.createElement(Box, { marginTop: 1 }, React.createElement(Text, { color: 'yellow' }, '💡 Use the CLI commands shown above for entity operations')));
|
|
120
|
+
const ProfileScreen = () => React.createElement(Box, { flexDirection: 'column' }, React.createElement(Text, { bold: true, color: 'cyan' }, '👤 User Profile Management'), React.createElement(Box, { marginTop: 1, flexDirection: 'column', marginLeft: 2 }, React.createElement(Text, null, '• Show Profile: ', React.createElement(Text, { dimColor: true }, 'cozo-memory profile show')), React.createElement(Text, null, '• Update Metadata: ', React.createElement(Text, { dimColor: true }, 'cozo-memory profile update -m \'{"key":"value"}\'')), React.createElement(Text, null, '• Add Preference: ', React.createElement(Text, { dimColor: true }, 'cozo-memory profile add-preference -t "I prefer TypeScript"')), React.createElement(Text, null, '• Reset Preferences: ', React.createElement(Text, { dimColor: true }, 'cozo-memory profile reset'))), React.createElement(Box, { marginTop: 1 }, React.createElement(Text, { color: 'yellow' }, '💡 User profile preferences get 50% search boost automatically')));
|
|
119
121
|
const SearchScreen = () => React.createElement(Box, { flexDirection: 'column' }, React.createElement(Text, { bold: true, color: 'cyan' }, '🔍 Search & Context'), React.createElement(Box, { marginTop: 1, flexDirection: 'column', marginLeft: 2 }, React.createElement(Text, null, '• Search: ', React.createElement(Text, { dimColor: true }, 'cozo-memory search query -q "your query"')), React.createElement(Text, null, '• Context: ', React.createElement(Text, { dimColor: true }, 'cozo-memory search context -q "query" -w 5')), React.createElement(Text, null, '• Advanced: ', React.createElement(Text, { dimColor: true }, 'With filters, entity types, time ranges'))), React.createElement(Box, { marginTop: 1 }, React.createElement(Text, { color: 'yellow' }, '💡 Hybrid search combines vector, keyword, and graph signals')));
|
|
120
122
|
const GraphScreen = () => React.createElement(Box, { flexDirection: 'column' }, React.createElement(Text, { bold: true, color: 'cyan' }, '🕸️ Graph Operations'), React.createElement(Box, { marginTop: 1, flexDirection: 'column', marginLeft: 2 }, React.createElement(Text, null, '• Explore: ', React.createElement(Text, { dimColor: true }, 'cozo-memory graph explore -s <id> -h 3')), React.createElement(Text, null, '• PageRank: ', React.createElement(Text, { dimColor: true }, 'cozo-memory graph pagerank')), React.createElement(Text, null, '• Communities: ', React.createElement(Text, { dimColor: true }, 'cozo-memory graph communities')), React.createElement(Text, null, '• Path Finding: ', React.createElement(Text, { dimColor: true }, 'cozo-memory graph explore -s <id1> -e <id2>'))), React.createElement(Box, { marginTop: 1 }, React.createElement(Text, { color: 'yellow' }, '💡 Graph algorithms help discover implicit relationships')));
|
|
121
123
|
const SystemScreen = () => React.createElement(Box, { flexDirection: 'column' }, React.createElement(Text, { bold: true, color: 'cyan' }, '⚙️ System Management'), React.createElement(Box, { marginTop: 1, flexDirection: 'column', marginLeft: 2 }, React.createElement(Text, null, '• Health: ', React.createElement(Text, { dimColor: true }, 'cozo-memory system health')), React.createElement(Text, null, '• Metrics: ', React.createElement(Text, { dimColor: true }, 'cozo-memory system metrics')), React.createElement(Text, null, '• Export JSON: ', React.createElement(Text, { dimColor: true }, 'cozo-memory export json -o backup.json')), React.createElement(Text, null, '• Export Markdown: ', React.createElement(Text, { dimColor: true }, 'cozo-memory export markdown -o notes.md')), React.createElement(Text, null, '• Export Obsidian: ', React.createElement(Text, { dimColor: true }, 'cozo-memory export obsidian -o vault.zip')), React.createElement(Text, null, '• Import: ', React.createElement(Text, { dimColor: true }, 'cozo-memory import file -i data.json -f cozo'))), React.createElement(Box, { marginTop: 1 }, React.createElement(Text, { color: 'yellow' }, '💡 Regular exports recommended for backup')));
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
const hybrid_search_1 = require("./hybrid-search");
|
|
37
|
+
const db_service_1 = require("./db-service");
|
|
38
|
+
const path = __importStar(require("path"));
|
|
39
|
+
async function testAgenticSearch() {
|
|
40
|
+
console.log("Starting agentic_search direct test...");
|
|
41
|
+
// Create a minimal environment to test HybridSearch
|
|
42
|
+
const dbPath = path.resolve(process.cwd(), 'memory.db');
|
|
43
|
+
console.log(`Using database at: ${dbPath}`);
|
|
44
|
+
const dbService = new db_service_1.CozoDbService(dbPath, 'sqlite');
|
|
45
|
+
await dbService.init();
|
|
46
|
+
const hybridSearch = new hybrid_search_1.HybridSearch(dbService);
|
|
47
|
+
await hybridSearch.init();
|
|
48
|
+
const query = "Was ist der Status der Frontend und Backend Projekte?";
|
|
49
|
+
console.log(`Querying: "${query}"`);
|
|
50
|
+
try {
|
|
51
|
+
const results = await hybridSearch.agenticRetrieve({
|
|
52
|
+
query,
|
|
53
|
+
limit: 5
|
|
54
|
+
});
|
|
55
|
+
console.log("Agentic Search Results:", JSON.stringify(results, null, 2));
|
|
56
|
+
}
|
|
57
|
+
catch (error) {
|
|
58
|
+
console.error("Error during agentic search:", error);
|
|
59
|
+
}
|
|
60
|
+
finally {
|
|
61
|
+
await dbService.close();
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
testAgenticSearch();
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "cozo-memory",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.8",
|
|
4
4
|
"mcpName": "io.github.tobs-code/cozo-memory",
|
|
5
5
|
"description": "Local-first persistent memory system for AI agents with hybrid search, graph reasoning, and MCP integration",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -37,6 +37,7 @@
|
|
|
37
37
|
"rebuild": "npm run clean && npm run build",
|
|
38
38
|
"test": "echo \"Error: no test specified\" && exit 1",
|
|
39
39
|
"benchmark": "ts-node src/benchmark.ts",
|
|
40
|
+
"eval": "ts-node src/eval-suite.ts",
|
|
40
41
|
"download-model": "ts-node src/download-model.ts"
|
|
41
42
|
},
|
|
42
43
|
"keywords": [
|
package/dist/test-mcp-search.js
DELETED
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const index_1 = require("./index");
|
|
4
|
-
async function testMCPSearch() {
|
|
5
|
-
console.log('Initializing MemoryServer...');
|
|
6
|
-
const server = new index_1.MemoryServer();
|
|
7
|
-
await server.initPromise;
|
|
8
|
-
console.log('\n=== Test 1: Create Entity via MCP mutate_memory ===');
|
|
9
|
-
const createResult = await server.mutateMemory({
|
|
10
|
-
action: 'create_entity',
|
|
11
|
-
name: 'Test Search Entity',
|
|
12
|
-
type: 'test',
|
|
13
|
-
metadata: { purpose: 'search_test' }
|
|
14
|
-
});
|
|
15
|
-
console.log('Created:', createResult);
|
|
16
|
-
const entityId = createResult.id;
|
|
17
|
-
console.log('\n=== Test 2: Add Observation via MCP mutate_memory ===');
|
|
18
|
-
const obsResult = await server.mutateMemory({
|
|
19
|
-
action: 'add_observation',
|
|
20
|
-
entity_id: entityId,
|
|
21
|
-
text: 'This is a test observation for searching with keywords like authentication and OAuth',
|
|
22
|
-
metadata: { test: true }
|
|
23
|
-
});
|
|
24
|
-
console.log('Added observation:', obsResult);
|
|
25
|
-
console.log('\n=== Test 3: Search via MCP query_memory ===');
|
|
26
|
-
const searchResult = await server.queryMemory({
|
|
27
|
-
action: 'search',
|
|
28
|
-
query: 'authentication',
|
|
29
|
-
limit: 5
|
|
30
|
-
});
|
|
31
|
-
console.log('Search result:', JSON.stringify(searchResult, null, 2));
|
|
32
|
-
console.log('\n=== Test 4: Search for "Alice" ===');
|
|
33
|
-
const aliceResult = await server.queryMemory({
|
|
34
|
-
action: 'search',
|
|
35
|
-
query: 'Alice',
|
|
36
|
-
limit: 5
|
|
37
|
-
});
|
|
38
|
-
console.log('Alice search result:', JSON.stringify(aliceResult, null, 2));
|
|
39
|
-
console.log('\n=== Test 5: Search for "TypeScript" ===');
|
|
40
|
-
const tsResult = await server.queryMemory({
|
|
41
|
-
action: 'search',
|
|
42
|
-
query: 'TypeScript',
|
|
43
|
-
limit: 5
|
|
44
|
-
});
|
|
45
|
-
console.log('TypeScript search result:', JSON.stringify(tsResult, null, 2));
|
|
46
|
-
}
|
|
47
|
-
testMCPSearch().catch(console.error);
|