@aitytech/agentkits-memory 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +250 -0
- package/dist/cache-manager.d.ts +134 -0
- package/dist/cache-manager.d.ts.map +1 -0
- package/dist/cache-manager.js +407 -0
- package/dist/cache-manager.js.map +1 -0
- package/dist/cli/save.d.ts +20 -0
- package/dist/cli/save.d.ts.map +1 -0
- package/dist/cli/save.js +94 -0
- package/dist/cli/save.js.map +1 -0
- package/dist/cli/setup.d.ts +18 -0
- package/dist/cli/setup.d.ts.map +1 -0
- package/dist/cli/setup.js +163 -0
- package/dist/cli/setup.js.map +1 -0
- package/dist/cli/viewer.d.ts +21 -0
- package/dist/cli/viewer.d.ts.map +1 -0
- package/dist/cli/viewer.js +182 -0
- package/dist/cli/viewer.js.map +1 -0
- package/dist/hnsw-index.d.ts +111 -0
- package/dist/hnsw-index.d.ts.map +1 -0
- package/dist/hnsw-index.js +781 -0
- package/dist/hnsw-index.js.map +1 -0
- package/dist/hooks/cli.d.ts +20 -0
- package/dist/hooks/cli.d.ts.map +1 -0
- package/dist/hooks/cli.js +102 -0
- package/dist/hooks/cli.js.map +1 -0
- package/dist/hooks/context.d.ts +31 -0
- package/dist/hooks/context.d.ts.map +1 -0
- package/dist/hooks/context.js +64 -0
- package/dist/hooks/context.js.map +1 -0
- package/dist/hooks/index.d.ts +16 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/index.js +20 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/hooks/observation.d.ts +30 -0
- package/dist/hooks/observation.d.ts.map +1 -0
- package/dist/hooks/observation.js +79 -0
- package/dist/hooks/observation.js.map +1 -0
- package/dist/hooks/service.d.ts +102 -0
- package/dist/hooks/service.d.ts.map +1 -0
- package/dist/hooks/service.js +454 -0
- package/dist/hooks/service.js.map +1 -0
- package/dist/hooks/session-init.d.ts +30 -0
- package/dist/hooks/session-init.d.ts.map +1 -0
- package/dist/hooks/session-init.js +54 -0
- package/dist/hooks/session-init.js.map +1 -0
- package/dist/hooks/summarize.d.ts +30 -0
- package/dist/hooks/summarize.d.ts.map +1 -0
- package/dist/hooks/summarize.js +74 -0
- package/dist/hooks/summarize.js.map +1 -0
- package/dist/hooks/types.d.ts +193 -0
- package/dist/hooks/types.d.ts.map +1 -0
- package/dist/hooks/types.js +137 -0
- package/dist/hooks/types.js.map +1 -0
- package/dist/index.d.ts +173 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +564 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/index.d.ts +9 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +9 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/server.d.ts +22 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +368 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/tools.d.ts +14 -0
- package/dist/mcp/tools.d.ts.map +1 -0
- package/dist/mcp/tools.js +110 -0
- package/dist/mcp/tools.js.map +1 -0
- package/dist/mcp/types.d.ts +100 -0
- package/dist/mcp/types.d.ts.map +1 -0
- package/dist/mcp/types.js +9 -0
- package/dist/mcp/types.js.map +1 -0
- package/dist/migration.d.ts +77 -0
- package/dist/migration.d.ts.map +1 -0
- package/dist/migration.js +457 -0
- package/dist/migration.js.map +1 -0
- package/dist/sqljs-backend.d.ts +128 -0
- package/dist/sqljs-backend.d.ts.map +1 -0
- package/dist/sqljs-backend.js +623 -0
- package/dist/sqljs-backend.js.map +1 -0
- package/dist/types.d.ts +481 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +73 -0
- package/dist/types.js.map +1 -0
- package/hooks.json +46 -0
- package/package.json +67 -0
- package/src/__tests__/index.test.ts +407 -0
- package/src/__tests__/sqljs-backend.test.ts +410 -0
- package/src/cache-manager.ts +515 -0
- package/src/cli/save.ts +109 -0
- package/src/cli/setup.ts +203 -0
- package/src/cli/viewer.ts +218 -0
- package/src/hnsw-index.ts +1013 -0
- package/src/hooks/__tests__/handlers.test.ts +298 -0
- package/src/hooks/__tests__/integration.test.ts +431 -0
- package/src/hooks/__tests__/service.test.ts +487 -0
- package/src/hooks/__tests__/types.test.ts +341 -0
- package/src/hooks/cli.ts +121 -0
- package/src/hooks/context.ts +77 -0
- package/src/hooks/index.ts +23 -0
- package/src/hooks/observation.ts +102 -0
- package/src/hooks/service.ts +582 -0
- package/src/hooks/session-init.ts +70 -0
- package/src/hooks/summarize.ts +89 -0
- package/src/hooks/types.ts +365 -0
- package/src/index.ts +755 -0
- package/src/mcp/__tests__/server.test.ts +181 -0
- package/src/mcp/index.ts +9 -0
- package/src/mcp/server.ts +441 -0
- package/src/mcp/tools.ts +113 -0
- package/src/mcp/types.ts +109 -0
- package/src/migration.ts +574 -0
- package/src/sql.js.d.ts +70 -0
- package/src/sqljs-backend.ts +789 -0
- package/src/types.ts +715 -0
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* AgentKits Memory Setup CLI
|
|
4
|
+
*
|
|
5
|
+
* Sets up memory hooks in a project's .claude/settings.json
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
* npx agentkits-memory-setup [options]
|
|
9
|
+
*
|
|
10
|
+
* Options:
|
|
11
|
+
* --project-dir=X Project directory (default: cwd)
|
|
12
|
+
* --force Overwrite existing hooks
|
|
13
|
+
* --json Output result as JSON
|
|
14
|
+
*
|
|
15
|
+
* @module @agentkits/memory/cli/setup
|
|
16
|
+
*/
|
|
17
|
+
import * as fs from 'node:fs';
|
|
18
|
+
import * as path from 'node:path';
|
|
19
|
+
const args = process.argv.slice(2);
|
|
20
|
+
const MEMORY_HOOKS = {
|
|
21
|
+
SessionStart: [
|
|
22
|
+
{
|
|
23
|
+
matcher: '',
|
|
24
|
+
hooks: [
|
|
25
|
+
{
|
|
26
|
+
type: 'command',
|
|
27
|
+
command: 'npx --yes agentkits-memory-hook context',
|
|
28
|
+
timeout: 10,
|
|
29
|
+
},
|
|
30
|
+
],
|
|
31
|
+
},
|
|
32
|
+
],
|
|
33
|
+
Stop: [
|
|
34
|
+
{
|
|
35
|
+
matcher: '',
|
|
36
|
+
hooks: [
|
|
37
|
+
{
|
|
38
|
+
type: 'command',
|
|
39
|
+
command: 'npx --yes agentkits-memory-hook summarize',
|
|
40
|
+
timeout: 10,
|
|
41
|
+
},
|
|
42
|
+
],
|
|
43
|
+
},
|
|
44
|
+
],
|
|
45
|
+
};
|
|
46
|
+
function parseArgs() {
|
|
47
|
+
const parsed = {};
|
|
48
|
+
for (const arg of args) {
|
|
49
|
+
if (arg.startsWith('--')) {
|
|
50
|
+
const eqIndex = arg.indexOf('=');
|
|
51
|
+
if (eqIndex > 0) {
|
|
52
|
+
const key = arg.slice(2, eqIndex);
|
|
53
|
+
const value = arg.slice(eqIndex + 1);
|
|
54
|
+
parsed[key] = value;
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
parsed[arg.slice(2)] = true;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
return parsed;
|
|
62
|
+
}
|
|
63
|
+
function mergeHooks(existing, newHooks, force) {
|
|
64
|
+
if (!existing || force) {
|
|
65
|
+
return { ...existing, ...newHooks };
|
|
66
|
+
}
|
|
67
|
+
const merged = { ...existing };
|
|
68
|
+
for (const [event, hooks] of Object.entries(newHooks)) {
|
|
69
|
+
if (!hooks)
|
|
70
|
+
continue;
|
|
71
|
+
const existingHooks = merged[event];
|
|
72
|
+
if (!existingHooks) {
|
|
73
|
+
merged[event] = hooks;
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
// Check if memory hook already exists
|
|
77
|
+
const hasMemoryHook = existingHooks.some((h) => h.hooks.some((hook) => hook.command.includes('agentkits-memory')));
|
|
78
|
+
if (!hasMemoryHook) {
|
|
79
|
+
// Append memory hooks
|
|
80
|
+
merged[event] = [...existingHooks, ...hooks];
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
return merged;
|
|
85
|
+
}
|
|
86
|
+
async function main() {
|
|
87
|
+
const options = parseArgs();
|
|
88
|
+
const projectDir = options['project-dir'] || process.env.CLAUDE_PROJECT_DIR || process.cwd();
|
|
89
|
+
const force = !!options.force;
|
|
90
|
+
const asJson = !!options.json;
|
|
91
|
+
const claudeDir = path.join(projectDir, '.claude');
|
|
92
|
+
const settingsPath = path.join(claudeDir, 'settings.json');
|
|
93
|
+
const memoryDir = path.join(claudeDir, 'memory');
|
|
94
|
+
try {
|
|
95
|
+
// Create directories
|
|
96
|
+
if (!fs.existsSync(claudeDir)) {
|
|
97
|
+
fs.mkdirSync(claudeDir, { recursive: true });
|
|
98
|
+
}
|
|
99
|
+
if (!fs.existsSync(memoryDir)) {
|
|
100
|
+
fs.mkdirSync(memoryDir, { recursive: true });
|
|
101
|
+
}
|
|
102
|
+
// Load or create settings
|
|
103
|
+
let settings = {};
|
|
104
|
+
if (fs.existsSync(settingsPath)) {
|
|
105
|
+
const content = fs.readFileSync(settingsPath, 'utf-8');
|
|
106
|
+
settings = JSON.parse(content);
|
|
107
|
+
}
|
|
108
|
+
// Merge hooks
|
|
109
|
+
settings.hooks = mergeHooks(settings.hooks, MEMORY_HOOKS, force);
|
|
110
|
+
// Write settings
|
|
111
|
+
fs.writeFileSync(settingsPath, JSON.stringify(settings, null, 2));
|
|
112
|
+
// Create initial memory files if they don't exist
|
|
113
|
+
const activeContextPath = path.join(memoryDir, 'active-context.md');
|
|
114
|
+
if (!fs.existsSync(activeContextPath)) {
|
|
115
|
+
fs.writeFileSync(activeContextPath, `# Active Context
|
|
116
|
+
|
|
117
|
+
**Task**: None
|
|
118
|
+
**Status**: Ready
|
|
119
|
+
**Updated**: ${new Date().toISOString()}
|
|
120
|
+
|
|
121
|
+
## Current Focus
|
|
122
|
+
|
|
123
|
+
No active task.
|
|
124
|
+
|
|
125
|
+
## Notes
|
|
126
|
+
|
|
127
|
+
Memory system initialized.
|
|
128
|
+
`);
|
|
129
|
+
}
|
|
130
|
+
const result = {
|
|
131
|
+
success: true,
|
|
132
|
+
settingsPath,
|
|
133
|
+
memoryDir,
|
|
134
|
+
hooksAdded: Object.keys(MEMORY_HOOKS),
|
|
135
|
+
message: 'Memory hooks configured successfully',
|
|
136
|
+
};
|
|
137
|
+
if (asJson) {
|
|
138
|
+
console.log(JSON.stringify(result, null, 2));
|
|
139
|
+
}
|
|
140
|
+
else {
|
|
141
|
+
console.log('\n✅ AgentKits Memory Setup Complete\n');
|
|
142
|
+
console.log(`Settings: ${settingsPath}`);
|
|
143
|
+
console.log(`Memory: ${memoryDir}`);
|
|
144
|
+
console.log(`\nHooks added: ${result.hooksAdded.join(', ')}`);
|
|
145
|
+
console.log('\nRestart Claude Code to activate memory hooks.\n');
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
catch (error) {
|
|
149
|
+
const result = {
|
|
150
|
+
success: false,
|
|
151
|
+
error: error instanceof Error ? error.message : String(error),
|
|
152
|
+
};
|
|
153
|
+
if (asJson) {
|
|
154
|
+
console.log(JSON.stringify(result, null, 2));
|
|
155
|
+
}
|
|
156
|
+
else {
|
|
157
|
+
console.error('❌ Setup failed:', result.error);
|
|
158
|
+
}
|
|
159
|
+
process.exit(1);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
main();
|
|
163
|
+
//# sourceMappingURL=setup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/cli/setup.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* AgentKits Memory Viewer CLI
|
|
4
|
+
*
|
|
5
|
+
* Simple CLI to view memory database contents.
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
* npx agentkits-memory-viewer [options]
|
|
9
|
+
*
|
|
10
|
+
* Options:
|
|
11
|
+
* --stats Show database statistics
|
|
12
|
+
* --list List all entries
|
|
13
|
+
* --namespace=X Filter by namespace
|
|
14
|
+
* --limit=N Limit results (default: 20)
|
|
15
|
+
* --json Output as JSON
|
|
16
|
+
* --export Export all to JSON file
|
|
17
|
+
*
|
|
18
|
+
* @module @agentkits/memory/cli/viewer
|
|
19
|
+
*/
|
|
20
|
+
export {};
|
|
21
|
+
//# sourceMappingURL=viewer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"viewer.d.ts","sourceRoot":"","sources":["../../src/cli/viewer.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;;GAiBG"}
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* AgentKits Memory Viewer CLI
|
|
4
|
+
*
|
|
5
|
+
* Simple CLI to view memory database contents.
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
* npx agentkits-memory-viewer [options]
|
|
9
|
+
*
|
|
10
|
+
* Options:
|
|
11
|
+
* --stats Show database statistics
|
|
12
|
+
* --list List all entries
|
|
13
|
+
* --namespace=X Filter by namespace
|
|
14
|
+
* --limit=N Limit results (default: 20)
|
|
15
|
+
* --json Output as JSON
|
|
16
|
+
* --export Export all to JSON file
|
|
17
|
+
*
|
|
18
|
+
* @module @agentkits/memory/cli/viewer
|
|
19
|
+
*/
|
|
20
|
+
import * as fs from 'node:fs';
|
|
21
|
+
import * as path from 'node:path';
|
|
22
|
+
import { createRequire } from 'node:module';
|
|
23
|
+
import initSqlJs from 'sql.js';
|
|
24
|
+
const args = process.argv.slice(2);
|
|
25
|
+
const projectDir = process.env.CLAUDE_PROJECT_DIR || process.cwd();
|
|
26
|
+
function parseArgs() {
|
|
27
|
+
const parsed = {};
|
|
28
|
+
for (const arg of args) {
|
|
29
|
+
if (arg.startsWith('--')) {
|
|
30
|
+
const [key, value] = arg.slice(2).split('=');
|
|
31
|
+
parsed[key] = value ?? true;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
return parsed;
|
|
35
|
+
}
|
|
36
|
+
async function loadDatabase() {
|
|
37
|
+
const require = createRequire(import.meta.url);
|
|
38
|
+
const sqlJsPath = require.resolve('sql.js');
|
|
39
|
+
const SQL = await initSqlJs({
|
|
40
|
+
locateFile: (file) => path.join(path.dirname(sqlJsPath), file),
|
|
41
|
+
});
|
|
42
|
+
const dbPath = path.join(projectDir, '.claude/memory/memory.db');
|
|
43
|
+
if (fs.existsSync(dbPath)) {
|
|
44
|
+
const buffer = fs.readFileSync(dbPath);
|
|
45
|
+
return new SQL.Database(new Uint8Array(buffer));
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
console.log(`\n📭 No database found at: ${dbPath}\n`);
|
|
49
|
+
console.log('Run Claude Code with memory MCP server to create entries.');
|
|
50
|
+
process.exit(0);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
async function main() {
|
|
54
|
+
const options = parseArgs();
|
|
55
|
+
const limit = parseInt(options.limit, 10) || 20;
|
|
56
|
+
const namespace = options.namespace;
|
|
57
|
+
const asJson = !!options.json;
|
|
58
|
+
try {
|
|
59
|
+
const db = await loadDatabase();
|
|
60
|
+
if (options.stats) {
|
|
61
|
+
// Get stats
|
|
62
|
+
const totalResult = db.exec('SELECT COUNT(*) as count FROM memory_entries');
|
|
63
|
+
const total = totalResult[0]?.values[0]?.[0] || 0;
|
|
64
|
+
const nsResult = db.exec('SELECT namespace, COUNT(*) FROM memory_entries GROUP BY namespace');
|
|
65
|
+
const byNamespace = {};
|
|
66
|
+
if (nsResult[0]) {
|
|
67
|
+
for (const row of nsResult[0].values) {
|
|
68
|
+
byNamespace[row[0]] = row[1];
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
const typeResult = db.exec('SELECT type, COUNT(*) FROM memory_entries GROUP BY type');
|
|
72
|
+
const byType = {};
|
|
73
|
+
if (typeResult[0]) {
|
|
74
|
+
for (const row of typeResult[0].values) {
|
|
75
|
+
byType[row[0]] = row[1];
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
if (asJson) {
|
|
79
|
+
console.log(JSON.stringify({ total, byNamespace, byType }, null, 2));
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
console.log('\n📊 Memory Database Statistics\n');
|
|
83
|
+
console.log(`Total Entries: ${total}`);
|
|
84
|
+
console.log('\nEntries by Namespace:');
|
|
85
|
+
for (const [ns, count] of Object.entries(byNamespace)) {
|
|
86
|
+
console.log(` ${ns}: ${count}`);
|
|
87
|
+
}
|
|
88
|
+
console.log('\nEntries by Type:');
|
|
89
|
+
for (const [type, count] of Object.entries(byType)) {
|
|
90
|
+
console.log(` ${type}: ${count}`);
|
|
91
|
+
}
|
|
92
|
+
console.log(`\nDatabase: ${projectDir}/.claude/memory/memory.db\n`);
|
|
93
|
+
}
|
|
94
|
+
db.close();
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
if (options.export) {
|
|
98
|
+
const result = db.exec('SELECT * FROM memory_entries');
|
|
99
|
+
if (!result[0]) {
|
|
100
|
+
console.log('No entries to export.');
|
|
101
|
+
db.close();
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
const columns = result[0].columns;
|
|
105
|
+
const entries = result[0].values.map(row => {
|
|
106
|
+
const entry = {};
|
|
107
|
+
columns.forEach((col, i) => {
|
|
108
|
+
entry[col] = row[i];
|
|
109
|
+
});
|
|
110
|
+
return entry;
|
|
111
|
+
});
|
|
112
|
+
const filename = `memory-export-${Date.now()}.json`;
|
|
113
|
+
fs.writeFileSync(filename, JSON.stringify({ entries, exportedAt: new Date().toISOString() }, null, 2));
|
|
114
|
+
console.log(`✓ Exported ${entries.length} entries to ${filename}`);
|
|
115
|
+
db.close();
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
// Default: list entries
|
|
119
|
+
let query = 'SELECT id, key, content, type, namespace, tags, created_at FROM memory_entries';
|
|
120
|
+
const params = [];
|
|
121
|
+
if (namespace) {
|
|
122
|
+
query += ' WHERE namespace = ?';
|
|
123
|
+
params.push(namespace);
|
|
124
|
+
}
|
|
125
|
+
query += ' ORDER BY created_at DESC LIMIT ?';
|
|
126
|
+
params.push(String(limit));
|
|
127
|
+
const stmt = db.prepare(query);
|
|
128
|
+
stmt.bind(params);
|
|
129
|
+
const entries = [];
|
|
130
|
+
while (stmt.step()) {
|
|
131
|
+
const row = stmt.getAsObject();
|
|
132
|
+
entries.push({
|
|
133
|
+
id: row.id,
|
|
134
|
+
key: row.key,
|
|
135
|
+
content: row.content,
|
|
136
|
+
type: row.type,
|
|
137
|
+
namespace: row.namespace,
|
|
138
|
+
tags: row.tags,
|
|
139
|
+
created_at: row.created_at,
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
stmt.free();
|
|
143
|
+
if (entries.length === 0) {
|
|
144
|
+
console.log('\n📭 No memories found in database.\n');
|
|
145
|
+
console.log(`Database: ${projectDir}/.claude/memory/memory.db`);
|
|
146
|
+
db.close();
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
if (asJson) {
|
|
150
|
+
console.log(JSON.stringify(entries, null, 2));
|
|
151
|
+
db.close();
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
154
|
+
console.log(`\n📚 Memory Database (${entries.length} entries)\n`);
|
|
155
|
+
console.log(`Database: ${projectDir}/.claude/memory/memory.db\n`);
|
|
156
|
+
console.log('─'.repeat(80));
|
|
157
|
+
for (const entry of entries) {
|
|
158
|
+
const date = new Date(entry.created_at).toLocaleString();
|
|
159
|
+
const content = entry.content.length > 100
|
|
160
|
+
? entry.content.slice(0, 100) + '...'
|
|
161
|
+
: entry.content;
|
|
162
|
+
const tags = JSON.parse(entry.tags || '[]').join(', ') || 'none';
|
|
163
|
+
console.log(`\n[${entry.namespace}] ${entry.key}`);
|
|
164
|
+
console.log(` Type: ${entry.type} | Tags: ${tags}`);
|
|
165
|
+
console.log(` Created: ${date}`);
|
|
166
|
+
console.log(` Content: ${content}`);
|
|
167
|
+
console.log('─'.repeat(80));
|
|
168
|
+
}
|
|
169
|
+
// Get total count
|
|
170
|
+
const countResult = db.exec('SELECT COUNT(*) FROM memory_entries');
|
|
171
|
+
const totalCount = countResult[0]?.values[0]?.[0] || entries.length;
|
|
172
|
+
console.log(`\nShowing ${entries.length} of ${totalCount} total entries`);
|
|
173
|
+
console.log('Use --limit=N to see more, --namespace=X to filter\n');
|
|
174
|
+
db.close();
|
|
175
|
+
}
|
|
176
|
+
catch (error) {
|
|
177
|
+
console.error('Error:', error instanceof Error ? error.message : error);
|
|
178
|
+
process.exit(1);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
main();
|
|
182
|
+
//# sourceMappingURL=viewer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"viewer.js","sourceRoot":"","sources":["../../src/cli/viewer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HNSW Vector Index
|
|
3
|
+
*
|
|
4
|
+
* High-performance Hierarchical Navigable Small World (HNSW) index for
|
|
5
|
+
* 150x-12,500x faster vector similarity search compared to brute force.
|
|
6
|
+
*
|
|
7
|
+
* OPTIMIZATIONS:
|
|
8
|
+
* - BinaryMinHeap/BinaryMaxHeap for O(log n) operations (vs O(n log n) Array.sort)
|
|
9
|
+
* - Pre-normalized vectors for O(1) cosine similarity (no sqrt needed)
|
|
10
|
+
* - Bounded max-heap for efficient top-k tracking
|
|
11
|
+
*
|
|
12
|
+
* @module @agentkits/memory/hnsw-index
|
|
13
|
+
*/
|
|
14
|
+
import { EventEmitter } from 'node:events';
|
|
15
|
+
import { HNSWConfig, HNSWStats } from './types.js';
|
|
16
|
+
/**
|
|
17
|
+
* HNSW Index implementation for ultra-fast vector similarity search
|
|
18
|
+
*
|
|
19
|
+
* Performance characteristics:
|
|
20
|
+
* - Search: O(log n) approximate nearest neighbor
|
|
21
|
+
* - Insert: O(log n) amortized
|
|
22
|
+
* - Memory: O(n * M * L) where M is max connections, L is layers
|
|
23
|
+
*/
|
|
24
|
+
export declare class HNSWIndex extends EventEmitter {
|
|
25
|
+
private config;
|
|
26
|
+
private nodes;
|
|
27
|
+
private entryPoint;
|
|
28
|
+
private maxLevel;
|
|
29
|
+
private levelMult;
|
|
30
|
+
private stats;
|
|
31
|
+
private quantizer;
|
|
32
|
+
constructor(config?: Partial<HNSWConfig>);
|
|
33
|
+
/**
|
|
34
|
+
* Add a vector to the index
|
|
35
|
+
*/
|
|
36
|
+
addPoint(id: string, vector: Float32Array): Promise<void>;
|
|
37
|
+
/**
|
|
38
|
+
* Search for k nearest neighbors
|
|
39
|
+
*/
|
|
40
|
+
search(query: Float32Array, k: number, ef?: number): Promise<Array<{
|
|
41
|
+
id: string;
|
|
42
|
+
distance: number;
|
|
43
|
+
}>>;
|
|
44
|
+
/**
|
|
45
|
+
* Search with filters applied post-retrieval
|
|
46
|
+
*/
|
|
47
|
+
searchWithFilters(query: Float32Array, k: number, filter: (id: string) => boolean, ef?: number): Promise<Array<{
|
|
48
|
+
id: string;
|
|
49
|
+
distance: number;
|
|
50
|
+
}>>;
|
|
51
|
+
/**
|
|
52
|
+
* Remove a point from the index
|
|
53
|
+
*/
|
|
54
|
+
removePoint(id: string): Promise<boolean>;
|
|
55
|
+
/**
|
|
56
|
+
* Rebuild the index from scratch
|
|
57
|
+
*/
|
|
58
|
+
rebuild(entries: Array<{
|
|
59
|
+
id: string;
|
|
60
|
+
vector: Float32Array;
|
|
61
|
+
}>): Promise<void>;
|
|
62
|
+
/**
|
|
63
|
+
* Get index statistics
|
|
64
|
+
*/
|
|
65
|
+
getStats(): HNSWStats;
|
|
66
|
+
/**
|
|
67
|
+
* Clear the index
|
|
68
|
+
*/
|
|
69
|
+
clear(): void;
|
|
70
|
+
/**
|
|
71
|
+
* Check if an ID exists in the index
|
|
72
|
+
*/
|
|
73
|
+
has(id: string): boolean;
|
|
74
|
+
/**
|
|
75
|
+
* Get the number of vectors in the index
|
|
76
|
+
*/
|
|
77
|
+
get size(): number;
|
|
78
|
+
private mergeConfig;
|
|
79
|
+
private getRandomLevel;
|
|
80
|
+
private insertNode;
|
|
81
|
+
private searchLayer;
|
|
82
|
+
/**
|
|
83
|
+
* OPTIMIZED searchLayer using heap-based priority queues
|
|
84
|
+
* Performance: O(log n) per operation vs O(n log n) for Array.sort()
|
|
85
|
+
* Expected speedup: 3-5x for large result sets
|
|
86
|
+
*/
|
|
87
|
+
private searchLayerOptimized;
|
|
88
|
+
private selectNeighbors;
|
|
89
|
+
private pruneConnections;
|
|
90
|
+
private distance;
|
|
91
|
+
private cosineDistance;
|
|
92
|
+
/**
|
|
93
|
+
* OPTIMIZED: Cosine distance using pre-normalized vectors
|
|
94
|
+
* Only requires dot product (no sqrt operations)
|
|
95
|
+
* Performance: O(n) with ~2x speedup over standard cosine
|
|
96
|
+
*/
|
|
97
|
+
private cosineDistanceNormalized;
|
|
98
|
+
/**
|
|
99
|
+
* Normalize a vector to unit length for O(1) cosine similarity
|
|
100
|
+
*/
|
|
101
|
+
private normalizeVector;
|
|
102
|
+
/**
|
|
103
|
+
* OPTIMIZED distance calculation that uses pre-normalized vectors when available
|
|
104
|
+
*/
|
|
105
|
+
private distanceOptimized;
|
|
106
|
+
private euclideanDistance;
|
|
107
|
+
private dotProductDistance;
|
|
108
|
+
private manhattanDistance;
|
|
109
|
+
}
|
|
110
|
+
export default HNSWIndex;
|
|
111
|
+
//# sourceMappingURL=hnsw-index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hnsw-index.d.ts","sourceRoot":"","sources":["../src/hnsw-index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAEL,UAAU,EACV,SAAS,EAMV,MAAM,YAAY,CAAC;AAwLpB;;;;;;;GAOG;AACH,qBAAa,SAAU,SAAQ,YAAY;IACzC,OAAO,CAAC,MAAM,CAAa;IAC3B,OAAO,CAAC,KAAK,CAAoC;IACjD,OAAO,CAAC,UAAU,CAAuB;IACzC,OAAO,CAAC,QAAQ,CAAa;IAC7B,OAAO,CAAC,SAAS,CAAS;IAG1B,OAAO,CAAC,KAAK,CAYX;IAGF,OAAO,CAAC,SAAS,CAA0B;gBAE/B,MAAM,GAAE,OAAO,CAAC,UAAU,CAAM;IAU5C;;OAEG;IACG,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAwD/D;;OAEG;IACG,MAAM,CACV,KAAK,EAAE,YAAY,EACnB,CAAC,EAAE,MAAM,EACT,EAAE,CAAC,EAAE,MAAM,GACV,OAAO,CAAC,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAqEnD;;OAEG;IACG,iBAAiB,CACrB,KAAK,EAAE,YAAY,EACnB,CAAC,EAAE,MAAM,EACT,MAAM,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,EAC/B,EAAE,CAAC,EAAE,MAAM,GACV,OAAO,CAAC,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAUnD;;OAEG;IACG,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IA6C/C;;OAEG;IACG,OAAO,CACX,OAAO,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,YAAY,CAAA;KAAE,CAAC,GACnD,OAAO,CAAC,IAAI,CAAC;IAmBhB;;OAEG;IACH,QAAQ,IAAI,SAAS;IAqBrB;;OAEG;IACH,KAAK,IAAI,IAAI;IAab;;OAEG;IACH,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAIxB;;OAEG;IACH,IAAI,IAAI,IAAI,MAAM,CAEjB;IAID,OAAO,CAAC,WAAW;IAWnB,OAAO,CAAC,cAAc;YAQR,UAAU;YAkEV,WAAW;IA2DzB;;;;OAIG;IACH,OAAO,CAAC,oBAAoB;IAgE5B,OAAO,CAAC,eAAe;IAavB,OAAO,CAAC,gBAAgB;IA6BxB,OAAO,CAAC,QAAQ;IAehB,OAAO,CAAC,cAAc;IAetB;;;;OAIG;IACH,OAAO,CAAC,wBAAwB;IAUhC;;OAEG;IACH,OAAO,CAAC,eAAe;IAkBvB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAkBzB,OAAO,CAAC,iBAAiB;IASzB,OAAO,CAAC,kBAAkB;IAS1B,OAAO,CAAC,iBAAiB;CAO1B;AAiHD,eAAe,SAAS,CAAC"}
|