@aeriondyseti/vector-memory-mcp 0.9.0-dev.2 → 0.9.0-dev.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/README.md +21 -1
- package/dist/scripts/publish.d.ts +13 -0
- package/dist/scripts/publish.d.ts.map +1 -0
- package/dist/scripts/publish.js +56 -0
- package/dist/scripts/publish.js.map +1 -0
- package/dist/scripts/test-runner.d.ts +9 -0
- package/dist/scripts/test-runner.d.ts.map +1 -0
- package/dist/scripts/test-runner.js +61 -0
- package/dist/scripts/test-runner.js.map +1 -0
- package/dist/scripts/warmup.d.ts +8 -0
- package/dist/scripts/warmup.d.ts.map +1 -0
- package/dist/scripts/warmup.js +61 -0
- package/dist/scripts/warmup.js.map +1 -0
- package/dist/src/config/index.d.ts +23 -0
- package/dist/src/config/index.d.ts.map +1 -0
- package/dist/src/config/index.js +46 -0
- package/dist/src/config/index.js.map +1 -0
- package/dist/src/db/connection.d.ts +3 -0
- package/dist/src/db/connection.d.ts.map +1 -0
- package/dist/src/db/connection.js +10 -0
- package/dist/src/db/connection.js.map +1 -0
- package/dist/src/db/memory.repository.d.ts +13 -0
- package/dist/src/db/memory.repository.d.ts.map +1 -0
- package/dist/src/db/memory.repository.js +97 -0
- package/dist/src/db/memory.repository.js.map +1 -0
- package/dist/src/db/schema.d.ts +4 -0
- package/dist/src/db/schema.d.ts.map +1 -0
- package/dist/src/db/schema.js +12 -0
- package/dist/src/db/schema.js.map +1 -0
- package/dist/src/http/mcp-transport.d.ts +19 -0
- package/dist/src/http/mcp-transport.d.ts.map +1 -0
- package/dist/src/http/mcp-transport.js +191 -0
- package/dist/src/http/mcp-transport.js.map +1 -0
- package/dist/src/http/server.d.ts +12 -0
- package/dist/src/http/server.d.ts.map +1 -0
- package/dist/src/http/server.js +168 -0
- package/dist/src/http/server.js.map +1 -0
- package/dist/src/index.d.ts +3 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +59 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/mcp/handlers.d.ts +11 -0
- package/dist/src/mcp/handlers.d.ts.map +1 -0
- package/dist/src/mcp/handlers.js +175 -0
- package/dist/src/mcp/handlers.js.map +1 -0
- package/dist/src/mcp/server.d.ts +5 -0
- package/dist/src/mcp/server.d.ts.map +1 -0
- package/dist/src/mcp/server.js +22 -0
- package/dist/src/mcp/server.js.map +1 -0
- package/dist/src/mcp/tools.d.ts +9 -0
- package/dist/src/mcp/tools.d.ts.map +1 -0
- package/dist/src/mcp/tools.js +243 -0
- package/dist/src/mcp/tools.js.map +1 -0
- package/dist/src/services/embeddings.service.d.ts +12 -0
- package/dist/src/services/embeddings.service.d.ts.map +1 -0
- package/dist/src/services/embeddings.service.js +37 -0
- package/dist/src/services/embeddings.service.js.map +1 -0
- package/dist/src/services/memory.service.d.ts +31 -0
- package/dist/src/services/memory.service.d.ts.map +1 -0
- package/dist/src/services/memory.service.js +131 -0
- package/dist/src/services/memory.service.js.map +1 -0
- package/dist/src/types/memory.d.ts +17 -0
- package/dist/src/types/memory.d.ts.map +1 -0
- package/dist/src/types/memory.js +15 -0
- package/dist/src/types/memory.js.map +1 -0
- package/package.json +12 -8
- package/src/config/index.ts +0 -75
- package/src/db/connection.ts +0 -11
- package/src/db/memory.repository.ts +0 -115
- package/src/db/schema.ts +0 -34
- package/src/http/mcp-transport.ts +0 -255
- package/src/http/server.ts +0 -190
- package/src/index.ts +0 -70
- package/src/mcp/handlers.ts +0 -248
- package/src/mcp/server.ts +0 -34
- package/src/mcp/tools.ts +0 -254
- package/src/services/embeddings.service.ts +0 -48
- package/src/services/memory.service.ts +0 -185
- package/src/types/memory.ts +0 -31
package/README.md
CHANGED
|
@@ -23,21 +23,28 @@ A local-first MCP server that provides vector-based memory storage. Uses local e
|
|
|
23
23
|
|
|
24
24
|
### Prerequisites
|
|
25
25
|
|
|
26
|
-
- [Bun](https://bun.sh/) 1.0+
|
|
26
|
+
- [Bun](https://bun.sh/) 1.0+ (recommended) or [Node.js](https://nodejs.org/) 20+
|
|
27
27
|
- An MCP-compatible client (Claude Code, Claude Desktop, etc.)
|
|
28
28
|
|
|
29
29
|
### Install
|
|
30
30
|
|
|
31
|
+
**With Bun (recommended):**
|
|
31
32
|
```bash
|
|
32
33
|
bun install -g @aeriondyseti/vector-memory-mcp
|
|
33
34
|
```
|
|
34
35
|
|
|
36
|
+
**With npm/Node.js:**
|
|
37
|
+
```bash
|
|
38
|
+
npm install -g @aeriondyseti/vector-memory-mcp
|
|
39
|
+
```
|
|
40
|
+
|
|
35
41
|
> First install downloads ML models (~90MB). This may take a minute.
|
|
36
42
|
|
|
37
43
|
### Configure
|
|
38
44
|
|
|
39
45
|
Add to your MCP client config (e.g., `~/.claude/settings.json`):
|
|
40
46
|
|
|
47
|
+
**With Bun:**
|
|
41
48
|
```json
|
|
42
49
|
{
|
|
43
50
|
"mcpServers": {
|
|
@@ -50,6 +57,19 @@ Add to your MCP client config (e.g., `~/.claude/settings.json`):
|
|
|
50
57
|
}
|
|
51
58
|
```
|
|
52
59
|
|
|
60
|
+
**With Node.js:**
|
|
61
|
+
```json
|
|
62
|
+
{
|
|
63
|
+
"mcpServers": {
|
|
64
|
+
"vector-memory": {
|
|
65
|
+
"type": "stdio",
|
|
66
|
+
"command": "npx",
|
|
67
|
+
"args": ["-y", "@aeriondyseti/vector-memory-mcp"]
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
```
|
|
72
|
+
|
|
53
73
|
### Use
|
|
54
74
|
|
|
55
75
|
Restart your MCP client. You now have access to:
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
#!/usr/bin/env bun
|
|
2
|
+
/**
|
|
3
|
+
* Publish script for vector-memory-mcp
|
|
4
|
+
*
|
|
5
|
+
* Prerequisites:
|
|
6
|
+
* 1. Create a granular access token at https://www.npmjs.com/settings/tokens
|
|
7
|
+
* 2. Store it: npm config set //registry.npmjs.org/:_authToken=npm_YOUR_TOKEN
|
|
8
|
+
* Or set NPM_TOKEN environment variable
|
|
9
|
+
*
|
|
10
|
+
* Usage: bun run scripts/publish.ts [--dry-run]
|
|
11
|
+
*/
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=publish.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"publish.d.ts","sourceRoot":"","sources":["../../scripts/publish.ts"],"names":[],"mappings":";AACA;;;;;;;;;GASG"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
#!/usr/bin/env bun
|
|
2
|
+
/**
|
|
3
|
+
* Publish script for vector-memory-mcp
|
|
4
|
+
*
|
|
5
|
+
* Prerequisites:
|
|
6
|
+
* 1. Create a granular access token at https://www.npmjs.com/settings/tokens
|
|
7
|
+
* 2. Store it: npm config set //registry.npmjs.org/:_authToken=npm_YOUR_TOKEN
|
|
8
|
+
* Or set NPM_TOKEN environment variable
|
|
9
|
+
*
|
|
10
|
+
* Usage: bun run scripts/publish.ts [--dry-run]
|
|
11
|
+
*/
|
|
12
|
+
import { $ } from "bun";
|
|
13
|
+
const dryRun = process.argv.includes("--dry-run");
|
|
14
|
+
async function main() {
|
|
15
|
+
// Check for authentication
|
|
16
|
+
console.log("🔐 Checking NPM authentication...");
|
|
17
|
+
try {
|
|
18
|
+
const whoami = await $ `npm whoami`.text();
|
|
19
|
+
console.log(`✅ Authenticated as: ${whoami.trim()}`);
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
console.error("❌ Not authenticated with NPM.");
|
|
23
|
+
console.error(" Option 1: npm login");
|
|
24
|
+
console.error(" Option 2: npm config set //registry.npmjs.org/:_authToken=npm_YOUR_TOKEN");
|
|
25
|
+
console.error(" Option 3: Set NPM_TOKEN environment variable");
|
|
26
|
+
process.exit(1);
|
|
27
|
+
}
|
|
28
|
+
// Run tests
|
|
29
|
+
console.log("🧪 Running tests...");
|
|
30
|
+
const testResult = await $ `bun run test`.quiet();
|
|
31
|
+
if (testResult.exitCode !== 0) {
|
|
32
|
+
console.error("❌ Tests failed. Aborting publish.");
|
|
33
|
+
process.exit(1);
|
|
34
|
+
}
|
|
35
|
+
console.log("✅ Tests passed");
|
|
36
|
+
// Build
|
|
37
|
+
console.log("🔨 Building...");
|
|
38
|
+
await $ `bun run build`;
|
|
39
|
+
console.log("✅ Build complete");
|
|
40
|
+
// Get version info
|
|
41
|
+
const pkg = await Bun.file("package.json").json();
|
|
42
|
+
console.log(`\n📦 Publishing ${pkg.name}@${pkg.version}...`);
|
|
43
|
+
if (dryRun) {
|
|
44
|
+
console.log("🔍 Dry run - would publish:");
|
|
45
|
+
await $ `npm publish --dry-run`;
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
await $ `npm publish --access public`;
|
|
49
|
+
console.log(`\n✅ Published ${pkg.name}@${pkg.version}`);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
main().catch((err) => {
|
|
53
|
+
console.error("❌ Publish failed:", err.message);
|
|
54
|
+
process.exit(1);
|
|
55
|
+
});
|
|
56
|
+
//# sourceMappingURL=publish.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"publish.js","sourceRoot":"","sources":["../../scripts/publish.ts"],"names":[],"mappings":";AACA;;;;;;;;;GASG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;AAElD,KAAK,UAAU,IAAI;IACjB,2BAA2B;IAC3B,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;IACjD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,CAAC,CAAA,YAAY,CAAC,IAAI,EAAE,CAAC;QAC1C,OAAO,CAAC,GAAG,CAAC,uBAAuB,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACtD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;QAC/C,OAAO,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC;QACxC,OAAO,CAAC,KAAK,CAAC,6EAA6E,CAAC,CAAC;QAC7F,OAAO,CAAC,KAAK,CAAC,iDAAiD,CAAC,CAAC;QACjE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,YAAY;IACZ,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;IACnC,MAAM,UAAU,GAAG,MAAM,CAAC,CAAA,cAAc,CAAC,KAAK,EAAE,CAAC;IACjD,IAAI,UAAU,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;QAC9B,OAAO,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC;QACnD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;IAE9B,QAAQ;IACR,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;IAC9B,MAAM,CAAC,CAAA,eAAe,CAAC;IACvB,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;IAEhC,mBAAmB;IACnB,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,IAAI,EAAE,CAAC;IAClD,OAAO,CAAC,GAAG,CAAC,mBAAmB,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,OAAO,KAAK,CAAC,CAAC;IAE7D,IAAI,MAAM,EAAE,CAAC;QACX,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;QAC3C,MAAM,CAAC,CAAA,uBAAuB,CAAC;IACjC,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,CAAA,6BAA6B,CAAC;QACrC,OAAO,CAAC,GAAG,CAAC,iBAAiB,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;IAC1D,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,OAAO,CAAC,KAAK,CAAC,mBAAmB,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;IAChD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
#!/usr/bin/env bun
|
|
2
|
+
/**
|
|
3
|
+
* Test runner wrapper that handles Bun's post-test crash gracefully.
|
|
4
|
+
*
|
|
5
|
+
* Bun crashes during native module cleanup after tests complete successfully.
|
|
6
|
+
* This wrapper captures the output, verifies tests passed, and exits cleanly.
|
|
7
|
+
*/
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=test-runner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-runner.d.ts","sourceRoot":"","sources":["../../scripts/test-runner.ts"],"names":[],"mappings":";AACA;;;;;GAKG"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
#!/usr/bin/env bun
|
|
2
|
+
/**
|
|
3
|
+
* Test runner wrapper that handles Bun's post-test crash gracefully.
|
|
4
|
+
*
|
|
5
|
+
* Bun crashes during native module cleanup after tests complete successfully.
|
|
6
|
+
* This wrapper captures the output, verifies tests passed, and exits cleanly.
|
|
7
|
+
*/
|
|
8
|
+
import { spawn } from "bun";
|
|
9
|
+
const proc = spawn(["bun", "test", "--preload", "./tests/preload.ts"], {
|
|
10
|
+
stdout: "pipe",
|
|
11
|
+
stderr: "pipe",
|
|
12
|
+
env: { ...process.env, FORCE_COLOR: "1" },
|
|
13
|
+
});
|
|
14
|
+
let stdout = "";
|
|
15
|
+
let stderr = "";
|
|
16
|
+
const decoder = new TextDecoder();
|
|
17
|
+
// Stream stdout in real-time
|
|
18
|
+
const stdoutReader = proc.stdout.getReader();
|
|
19
|
+
(async () => {
|
|
20
|
+
while (true) {
|
|
21
|
+
const { done, value } = await stdoutReader.read();
|
|
22
|
+
if (done)
|
|
23
|
+
break;
|
|
24
|
+
const text = decoder.decode(value);
|
|
25
|
+
stdout += text;
|
|
26
|
+
process.stdout.write(text);
|
|
27
|
+
}
|
|
28
|
+
})();
|
|
29
|
+
// Stream stderr in real-time
|
|
30
|
+
const stderrReader = proc.stderr.getReader();
|
|
31
|
+
(async () => {
|
|
32
|
+
while (true) {
|
|
33
|
+
const { done, value } = await stderrReader.read();
|
|
34
|
+
if (done)
|
|
35
|
+
break;
|
|
36
|
+
const text = decoder.decode(value);
|
|
37
|
+
stderr += text;
|
|
38
|
+
process.stderr.write(text);
|
|
39
|
+
}
|
|
40
|
+
})();
|
|
41
|
+
await proc.exited;
|
|
42
|
+
// Check if tests actually passed by looking for the summary line
|
|
43
|
+
const output = stdout + stderr;
|
|
44
|
+
const passMatch = output.match(/(\d+) pass/);
|
|
45
|
+
const failMatch = output.match(/(\d+) fail/);
|
|
46
|
+
const passed = passMatch ? parseInt(passMatch[1], 10) : 0;
|
|
47
|
+
const failed = failMatch ? parseInt(failMatch[1], 10) : 0;
|
|
48
|
+
// Exit based on test results, not Bun's crash
|
|
49
|
+
if (failed > 0) {
|
|
50
|
+
console.error(`\n❌ ${failed} test(s) failed`);
|
|
51
|
+
process.exit(1);
|
|
52
|
+
}
|
|
53
|
+
else if (passed > 0) {
|
|
54
|
+
console.log(`\n✅ All ${passed} tests passed (ignoring Bun cleanup crash)`);
|
|
55
|
+
process.exit(0);
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
console.error("\n⚠️ Could not determine test results");
|
|
59
|
+
process.exit(1);
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=test-runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-runner.js","sourceRoot":"","sources":["../../scripts/test-runner.ts"],"names":[],"mappings":";AACA;;;;;GAKG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,KAAK,CAAC;AAE5B,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,oBAAoB,CAAC,EAAE;IACrE,MAAM,EAAE,MAAM;IACd,MAAM,EAAE,MAAM;IACd,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,WAAW,EAAE,GAAG,EAAE;CAC1C,CAAC,CAAC;AAEH,IAAI,MAAM,GAAG,EAAE,CAAC;AAChB,IAAI,MAAM,GAAG,EAAE,CAAC;AAEhB,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;AAElC,6BAA6B;AAC7B,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;AAC7C,CAAC,KAAK,IAAI,EAAE;IACV,OAAO,IAAI,EAAE,CAAC;QACZ,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,YAAY,CAAC,IAAI,EAAE,CAAC;QAClD,IAAI,IAAI;YAAE,MAAM;QAChB,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACnC,MAAM,IAAI,IAAI,CAAC;QACf,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC;AACH,CAAC,CAAC,EAAE,CAAC;AAEL,6BAA6B;AAC7B,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;AAC7C,CAAC,KAAK,IAAI,EAAE;IACV,OAAO,IAAI,EAAE,CAAC;QACZ,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,YAAY,CAAC,IAAI,EAAE,CAAC;QAClD,IAAI,IAAI;YAAE,MAAM;QAChB,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACnC,MAAM,IAAI,IAAI,CAAC;QACf,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC;AACH,CAAC,CAAC,EAAE,CAAC;AAEL,MAAM,IAAI,CAAC,MAAM,CAAC;AAElB,iEAAiE;AACjE,MAAM,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;AAC/B,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;AAC7C,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;AAE7C,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC1D,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAE1D,8CAA8C;AAC9C,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;IACf,OAAO,CAAC,KAAK,CAAC,OAAO,MAAM,iBAAiB,CAAC,CAAC;IAC9C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;KAAM,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;IACtB,OAAO,CAAC,GAAG,CAAC,WAAW,MAAM,4CAA4C,CAAC,CAAC;IAC3E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;KAAM,CAAC;IACN,OAAO,CAAC,KAAK,CAAC,wCAAwC,CAAC,CAAC;IACxD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
#!/usr/bin/env bun
|
|
2
|
+
/**
|
|
3
|
+
* Warmup script to pre-download ML models and verify dependencies
|
|
4
|
+
* This runs during installation to ensure everything is ready to use
|
|
5
|
+
*/
|
|
6
|
+
declare function warmup(): Promise<void>;
|
|
7
|
+
export { warmup };
|
|
8
|
+
//# sourceMappingURL=warmup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"warmup.d.ts","sourceRoot":"","sources":["../../scripts/warmup.ts"],"names":[],"mappings":";AAEA;;;GAGG;AAKH,iBAAe,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAsDrC;AAOD,OAAO,EAAE,MAAM,EAAE,CAAC"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
#!/usr/bin/env bun
|
|
2
|
+
/**
|
|
3
|
+
* Warmup script to pre-download ML models and verify dependencies
|
|
4
|
+
* This runs during installation to ensure everything is ready to use
|
|
5
|
+
*/
|
|
6
|
+
import { config } from "../src/config/index.js";
|
|
7
|
+
import { EmbeddingsService } from "../src/services/embeddings.service.js";
|
|
8
|
+
async function warmup() {
|
|
9
|
+
console.log("🔥 Warming up vector-memory-mcp...");
|
|
10
|
+
console.log();
|
|
11
|
+
try {
|
|
12
|
+
// Check native dependencies
|
|
13
|
+
console.log("✓ Checking native dependencies...");
|
|
14
|
+
try {
|
|
15
|
+
await import("onnxruntime-node");
|
|
16
|
+
console.log(" ✓ onnxruntime-node loaded");
|
|
17
|
+
}
|
|
18
|
+
catch (e) {
|
|
19
|
+
console.error(" ✗ onnxruntime-node failed:", e.message);
|
|
20
|
+
process.exit(1);
|
|
21
|
+
}
|
|
22
|
+
try {
|
|
23
|
+
await import("sharp");
|
|
24
|
+
console.log(" ✓ sharp loaded");
|
|
25
|
+
}
|
|
26
|
+
catch (e) {
|
|
27
|
+
console.error(" ✗ sharp failed:", e.message);
|
|
28
|
+
process.exit(1);
|
|
29
|
+
}
|
|
30
|
+
console.log();
|
|
31
|
+
// Initialize embeddings service to download model
|
|
32
|
+
console.log("📥 Downloading ML model (this may take a minute)...");
|
|
33
|
+
console.log(` Model: ${config.embeddingModel}`);
|
|
34
|
+
console.log(` Cache: ~/.cache/huggingface/`);
|
|
35
|
+
console.log();
|
|
36
|
+
const embeddings = new EmbeddingsService(config.embeddingModel, config.embeddingDimension);
|
|
37
|
+
// Trigger model download by generating a test embedding
|
|
38
|
+
const startTime = Date.now();
|
|
39
|
+
await embeddings.embed("warmup test");
|
|
40
|
+
const duration = ((Date.now() - startTime) / 1000).toFixed(2);
|
|
41
|
+
console.log();
|
|
42
|
+
console.log(`✅ Warmup complete! (${duration}s)`);
|
|
43
|
+
console.log();
|
|
44
|
+
console.log("Ready to use! Configure your MCP client and restart to get started.");
|
|
45
|
+
console.log();
|
|
46
|
+
}
|
|
47
|
+
catch (error) {
|
|
48
|
+
console.error();
|
|
49
|
+
console.error("❌ Warmup failed:", error);
|
|
50
|
+
console.error();
|
|
51
|
+
console.error("This is not a critical error - the server will download models on first run.");
|
|
52
|
+
console.error("You can try running 'vector-memory-mcp warmup' manually later.");
|
|
53
|
+
process.exit(0); // Exit successfully to not block installation
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
// Only run if this is the main module
|
|
57
|
+
if (import.meta.url === `file://${process.argv[1]}`) {
|
|
58
|
+
warmup();
|
|
59
|
+
}
|
|
60
|
+
export { warmup };
|
|
61
|
+
//# sourceMappingURL=warmup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"warmup.js","sourceRoot":"","sources":["../../scripts/warmup.ts"],"names":[],"mappings":";AAEA;;;GAGG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,uCAAuC,CAAC;AAE1E,KAAK,UAAU,MAAM;IACnB,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;IAClD,OAAO,CAAC,GAAG,EAAE,CAAC;IAEd,IAAI,CAAC;QACH,4BAA4B;QAC5B,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;QACjD,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC;YACjC,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;QAC7C,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,CAAC,KAAK,CAAC,8BAA8B,EAAG,CAAW,CAAC,OAAO,CAAC,CAAC;YACpE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC;YACtB,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;QAClC,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,CAAC,KAAK,CAAC,mBAAmB,EAAG,CAAW,CAAC,OAAO,CAAC,CAAC;YACzD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,OAAO,CAAC,GAAG,EAAE,CAAC;QAEd,kDAAkD;QAClD,OAAO,CAAC,GAAG,CAAC,qDAAqD,CAAC,CAAC;QACnE,OAAO,CAAC,GAAG,CAAC,aAAa,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC;QAClD,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;QAC/C,OAAO,CAAC,GAAG,EAAE,CAAC;QAEd,MAAM,UAAU,GAAG,IAAI,iBAAiB,CACtC,MAAM,CAAC,cAAc,EACrB,MAAM,CAAC,kBAAkB,CAC1B,CAAC;QAEF,wDAAwD;QACxD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC7B,MAAM,UAAU,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QACtC,MAAM,QAAQ,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAE9D,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,uBAAuB,QAAQ,IAAI,CAAC,CAAC;QACjD,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,qEAAqE,CAAC,CAAC;QACnF,OAAO,CAAC,GAAG,EAAE,CAAC;IAChB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,EAAE,CAAC;QAChB,OAAO,CAAC,KAAK,CAAC,kBAAkB,EAAE,KAAK,CAAC,CAAC;QACzC,OAAO,CAAC,KAAK,EAAE,CAAC;QAChB,OAAO,CAAC,KAAK,CAAC,8EAA8E,CAAC,CAAC;QAC9F,OAAO,CAAC,KAAK,CAAC,gEAAgE,CAAC,CAAC;QAChF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,8CAA8C;IACjE,CAAC;AACH,CAAC;AAED,sCAAsC;AACtC,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,UAAU,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;IACpD,MAAM,EAAE,CAAC;AACX,CAAC;AAED,OAAO,EAAE,MAAM,EAAE,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export type TransportMode = "stdio" | "http" | "both";
|
|
2
|
+
export interface Config {
|
|
3
|
+
dbPath: string;
|
|
4
|
+
embeddingModel: string;
|
|
5
|
+
embeddingDimension: number;
|
|
6
|
+
httpPort: number;
|
|
7
|
+
httpHost: string;
|
|
8
|
+
enableHttp: boolean;
|
|
9
|
+
transportMode: TransportMode;
|
|
10
|
+
}
|
|
11
|
+
export interface ConfigOverrides {
|
|
12
|
+
dbPath?: string;
|
|
13
|
+
httpPort?: number;
|
|
14
|
+
enableHttp?: boolean;
|
|
15
|
+
transportMode?: TransportMode;
|
|
16
|
+
}
|
|
17
|
+
export declare function loadConfig(overrides?: ConfigOverrides): Config;
|
|
18
|
+
/**
|
|
19
|
+
* Parse CLI arguments into config overrides.
|
|
20
|
+
*/
|
|
21
|
+
export declare function parseCliArgs(argv: string[]): ConfigOverrides;
|
|
22
|
+
export declare const config: Config;
|
|
23
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/config/index.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,CAAC;AAEtD,MAAM,WAAW,MAAM;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,MAAM,CAAC;IACvB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,OAAO,CAAC;IACpB,aAAa,EAAE,aAAa,CAAC;CAC9B;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,aAAa,CAAC,EAAE,aAAa,CAAC;CAC/B;AAaD,wBAAgB,UAAU,CAAC,SAAS,GAAE,eAAoB,GAAG,MAAM,CAclE;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,eAAe,CAmB5D;AAGD,eAAO,MAAM,MAAM,QAAe,CAAC"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import arg from "arg";
|
|
2
|
+
import { join } from "path";
|
|
3
|
+
// Defaults - always use repo-local .vector-memory folder
|
|
4
|
+
const DEFAULT_DB_PATH = join(process.cwd(), ".vector-memory", "memories.db");
|
|
5
|
+
const DEFAULT_EMBEDDING_MODEL = "Xenova/all-MiniLM-L6-v2";
|
|
6
|
+
const DEFAULT_EMBEDDING_DIMENSION = 384;
|
|
7
|
+
const DEFAULT_HTTP_PORT = 3271;
|
|
8
|
+
const DEFAULT_HTTP_HOST = "127.0.0.1";
|
|
9
|
+
function resolvePath(path) {
|
|
10
|
+
return path.startsWith("/") ? path : join(process.cwd(), path);
|
|
11
|
+
}
|
|
12
|
+
export function loadConfig(overrides = {}) {
|
|
13
|
+
const transportMode = overrides.transportMode ?? "stdio";
|
|
14
|
+
// HTTP enabled by default (needed for hooks), can disable with --no-http
|
|
15
|
+
const enableHttp = overrides.enableHttp ?? true;
|
|
16
|
+
return {
|
|
17
|
+
dbPath: resolvePath(overrides.dbPath ?? DEFAULT_DB_PATH),
|
|
18
|
+
embeddingModel: DEFAULT_EMBEDDING_MODEL,
|
|
19
|
+
embeddingDimension: DEFAULT_EMBEDDING_DIMENSION,
|
|
20
|
+
httpPort: overrides.httpPort ?? DEFAULT_HTTP_PORT,
|
|
21
|
+
httpHost: DEFAULT_HTTP_HOST,
|
|
22
|
+
enableHttp,
|
|
23
|
+
transportMode,
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Parse CLI arguments into config overrides.
|
|
28
|
+
*/
|
|
29
|
+
export function parseCliArgs(argv) {
|
|
30
|
+
const args = arg({
|
|
31
|
+
"--db-file": String,
|
|
32
|
+
"--port": Number,
|
|
33
|
+
"--no-http": Boolean,
|
|
34
|
+
// Aliases
|
|
35
|
+
"-d": "--db-file",
|
|
36
|
+
"-p": "--port",
|
|
37
|
+
}, { argv, permissive: true });
|
|
38
|
+
return {
|
|
39
|
+
dbPath: args["--db-file"],
|
|
40
|
+
httpPort: args["--port"],
|
|
41
|
+
enableHttp: args["--no-http"] ? false : undefined,
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
// Default config for imports that don't use CLI args
|
|
45
|
+
export const config = loadConfig();
|
|
46
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/config/index.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAqB5B,yDAAyD;AACzD,MAAM,eAAe,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,gBAAgB,EAAE,aAAa,CAAC,CAAC;AAC7E,MAAM,uBAAuB,GAAG,yBAAyB,CAAC;AAC1D,MAAM,2BAA2B,GAAG,GAAG,CAAC;AACxC,MAAM,iBAAiB,GAAG,IAAI,CAAC;AAC/B,MAAM,iBAAiB,GAAG,WAAW,CAAC;AAEtC,SAAS,WAAW,CAAC,IAAY;IAC/B,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC;AACjE,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,YAA6B,EAAE;IACxD,MAAM,aAAa,GAAG,SAAS,CAAC,aAAa,IAAI,OAAO,CAAC;IACzD,yEAAyE;IACzE,MAAM,UAAU,GAAG,SAAS,CAAC,UAAU,IAAI,IAAI,CAAC;IAEhD,OAAO;QACL,MAAM,EAAE,WAAW,CAAC,SAAS,CAAC,MAAM,IAAI,eAAe,CAAC;QACxD,cAAc,EAAE,uBAAuB;QACvC,kBAAkB,EAAE,2BAA2B;QAC/C,QAAQ,EAAE,SAAS,CAAC,QAAQ,IAAI,iBAAiB;QACjD,QAAQ,EAAE,iBAAiB;QAC3B,UAAU;QACV,aAAa;KACd,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,IAAc;IACzC,MAAM,IAAI,GAAG,GAAG,CACd;QACE,WAAW,EAAE,MAAM;QACnB,QAAQ,EAAE,MAAM;QAChB,WAAW,EAAE,OAAO;QAEpB,UAAU;QACV,IAAI,EAAE,WAAW;QACjB,IAAI,EAAE,QAAQ;KACf,EACD,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,CAC3B,CAAC;IAEF,OAAO;QACL,MAAM,EAAE,IAAI,CAAC,WAAW,CAAC;QACzB,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC;QACxB,UAAU,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;KAClD,CAAC;AACJ,CAAC;AAED,qDAAqD;AACrD,MAAM,CAAC,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connection.d.ts","sourceRoot":"","sources":["../../../src/db/connection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,kBAAkB,CAAC;AAI5C,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,CAMnF"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import * as lancedb from "@lancedb/lancedb";
|
|
2
|
+
import { mkdirSync } from "fs";
|
|
3
|
+
import { dirname } from "path";
|
|
4
|
+
export async function connectToDatabase(dbPath) {
|
|
5
|
+
// Ensure directory exists
|
|
6
|
+
mkdirSync(dirname(dbPath), { recursive: true });
|
|
7
|
+
const db = await lancedb.connect(dbPath);
|
|
8
|
+
return db;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=connection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connection.js","sourceRoot":"","sources":["../../../src/db/connection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAC/B,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAE/B,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,MAAc;IACpD,0BAA0B;IAC1B,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAEhD,MAAM,EAAE,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACzC,OAAO,EAAE,CAAC;AACZ,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import * as lancedb from "@lancedb/lancedb";
|
|
2
|
+
import { type Memory, type VectorRow } from "../types/memory.js";
|
|
3
|
+
export declare class MemoryRepository {
|
|
4
|
+
private db;
|
|
5
|
+
constructor(db: lancedb.Connection);
|
|
6
|
+
private getTable;
|
|
7
|
+
insert(memory: Memory): Promise<void>;
|
|
8
|
+
upsert(memory: Memory): Promise<void>;
|
|
9
|
+
findById(id: string): Promise<Memory | null>;
|
|
10
|
+
markDeleted(id: string): Promise<boolean>;
|
|
11
|
+
findSimilar(embedding: number[], limit: number): Promise<VectorRow[]>;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=memory.repository.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory.repository.d.ts","sourceRoot":"","sources":["../../../src/db/memory.repository.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,kBAAkB,CAAC;AAE5C,OAAO,EACL,KAAK,MAAM,EACX,KAAK,SAAS,EAEf,MAAM,oBAAoB,CAAC;AAE5B,qBAAa,gBAAgB;IACf,OAAO,CAAC,EAAE;gBAAF,EAAE,EAAE,OAAO,CAAC,UAAU;YAE5B,QAAQ;IAShB,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAerC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAqBrC,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IA4B5C,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAqBzC,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;CAS5E"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { TABLE_NAME, memorySchema } from "./schema.js";
|
|
2
|
+
import { DELETED_TOMBSTONE, } from "../types/memory.js";
|
|
3
|
+
export class MemoryRepository {
|
|
4
|
+
db;
|
|
5
|
+
constructor(db) {
|
|
6
|
+
this.db = db;
|
|
7
|
+
}
|
|
8
|
+
async getTable() {
|
|
9
|
+
const names = await this.db.tableNames();
|
|
10
|
+
if (names.includes(TABLE_NAME)) {
|
|
11
|
+
return await this.db.openTable(TABLE_NAME);
|
|
12
|
+
}
|
|
13
|
+
// Create with empty data to initialize schema
|
|
14
|
+
return await this.db.createTable(TABLE_NAME, [], { schema: memorySchema });
|
|
15
|
+
}
|
|
16
|
+
async insert(memory) {
|
|
17
|
+
const table = await this.getTable();
|
|
18
|
+
await table.add([
|
|
19
|
+
{
|
|
20
|
+
id: memory.id,
|
|
21
|
+
vector: memory.embedding,
|
|
22
|
+
content: memory.content,
|
|
23
|
+
metadata: JSON.stringify(memory.metadata),
|
|
24
|
+
created_at: memory.createdAt.getTime(),
|
|
25
|
+
updated_at: memory.updatedAt.getTime(),
|
|
26
|
+
superseded_by: memory.supersededBy,
|
|
27
|
+
},
|
|
28
|
+
]);
|
|
29
|
+
}
|
|
30
|
+
async upsert(memory) {
|
|
31
|
+
const table = await this.getTable();
|
|
32
|
+
const existing = await table.query().where(`id = '${memory.id}'`).limit(1).toArray();
|
|
33
|
+
if (existing.length === 0) {
|
|
34
|
+
return await this.insert(memory);
|
|
35
|
+
}
|
|
36
|
+
await table.update({
|
|
37
|
+
where: `id = '${memory.id}'`,
|
|
38
|
+
values: {
|
|
39
|
+
vector: memory.embedding,
|
|
40
|
+
content: memory.content,
|
|
41
|
+
metadata: JSON.stringify(memory.metadata),
|
|
42
|
+
created_at: memory.createdAt.getTime(),
|
|
43
|
+
updated_at: memory.updatedAt.getTime(),
|
|
44
|
+
superseded_by: memory.supersededBy,
|
|
45
|
+
},
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
async findById(id) {
|
|
49
|
+
const table = await this.getTable();
|
|
50
|
+
const results = await table.query().where(`id = '${id}'`).limit(1).toArray();
|
|
51
|
+
if (results.length === 0) {
|
|
52
|
+
return null;
|
|
53
|
+
}
|
|
54
|
+
const row = results[0];
|
|
55
|
+
// Handle Arrow Vector type conversion
|
|
56
|
+
// LanceDB returns an Arrow Vector object which is iterable but not an array
|
|
57
|
+
const vectorData = row.vector;
|
|
58
|
+
const embedding = Array.isArray(vectorData)
|
|
59
|
+
? vectorData
|
|
60
|
+
: Array.from(vectorData);
|
|
61
|
+
return {
|
|
62
|
+
id: row.id,
|
|
63
|
+
content: row.content,
|
|
64
|
+
embedding,
|
|
65
|
+
metadata: JSON.parse(row.metadata),
|
|
66
|
+
createdAt: new Date(row.created_at),
|
|
67
|
+
updatedAt: new Date(row.updated_at),
|
|
68
|
+
supersededBy: row.superseded_by,
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
async markDeleted(id) {
|
|
72
|
+
const table = await this.getTable();
|
|
73
|
+
// Verify existence first to match previous behavior (return false if not found)
|
|
74
|
+
const existing = await table.query().where(`id = '${id}'`).limit(1).toArray();
|
|
75
|
+
if (existing.length === 0) {
|
|
76
|
+
return false;
|
|
77
|
+
}
|
|
78
|
+
const now = Date.now();
|
|
79
|
+
await table.update({
|
|
80
|
+
where: `id = '${id}'`,
|
|
81
|
+
values: {
|
|
82
|
+
superseded_by: DELETED_TOMBSTONE,
|
|
83
|
+
updated_at: now,
|
|
84
|
+
},
|
|
85
|
+
});
|
|
86
|
+
return true;
|
|
87
|
+
}
|
|
88
|
+
async findSimilar(embedding, limit) {
|
|
89
|
+
const table = await this.getTable();
|
|
90
|
+
const results = await table.vectorSearch(embedding).limit(limit).toArray();
|
|
91
|
+
return results.map((r) => ({
|
|
92
|
+
id: r.id,
|
|
93
|
+
distance: r._distance,
|
|
94
|
+
}));
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=memory.repository.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory.repository.js","sourceRoot":"","sources":["../../../src/db/memory.repository.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,EAGL,iBAAiB,GAClB,MAAM,oBAAoB,CAAC;AAE5B,MAAM,OAAO,gBAAgB;IACP;IAApB,YAAoB,EAAsB;QAAtB,OAAE,GAAF,EAAE,CAAoB;IAAG,CAAC;IAEtC,KAAK,CAAC,QAAQ;QACpB,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,UAAU,EAAE,CAAC;QACzC,IAAI,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;YAC/B,OAAO,MAAM,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QAC7C,CAAC;QACD,8CAA8C;QAC9C,OAAO,MAAM,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,UAAU,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,CAAC;IAC7E,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,MAAc;QACzB,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;QACpC,MAAM,KAAK,CAAC,GAAG,CAAC;YACd;gBACE,EAAE,EAAE,MAAM,CAAC,EAAE;gBACb,MAAM,EAAE,MAAM,CAAC,SAAS;gBACxB,OAAO,EAAE,MAAM,CAAC,OAAO;gBACvB,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC;gBACzC,UAAU,EAAE,MAAM,CAAC,SAAS,CAAC,OAAO,EAAE;gBACtC,UAAU,EAAE,MAAM,CAAC,SAAS,CAAC,OAAO,EAAE;gBACtC,aAAa,EAAE,MAAM,CAAC,YAAY;aACnC;SACF,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,MAAc;QACzB,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;QACpC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,SAAS,MAAM,CAAC,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;QAErF,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,OAAO,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACnC,CAAC;QAED,MAAM,KAAK,CAAC,MAAM,CAAC;YACjB,KAAK,EAAE,SAAS,MAAM,CAAC,EAAE,GAAG;YAC5B,MAAM,EAAE;gBACN,MAAM,EAAE,MAAM,CAAC,SAAS;gBACxB,OAAO,EAAE,MAAM,CAAC,OAAO;gBACvB,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC;gBACzC,UAAU,EAAE,MAAM,CAAC,SAAS,CAAC,OAAO,EAAE;gBACtC,UAAU,EAAE,MAAM,CAAC,SAAS,CAAC,OAAO,EAAE;gBACtC,aAAa,EAAE,MAAM,CAAC,YAAY;aACnC;SACF,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,EAAU;QACvB,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;QACpC,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;QAE7E,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QAEvB,sCAAsC;QACtC,4EAA4E;QAC5E,MAAM,UAAU,GAAG,GAAG,CAAC,MAAa,CAAC;QACrC,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC;YACzC,CAAC,CAAC,UAAU;YACZ,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAa,CAAC;QAEvC,OAAO;YACL,EAAE,EAAE,GAAG,CAAC,EAAY;YACpB,OAAO,EAAE,GAAG,CAAC,OAAiB;YAC9B,SAAS;YACT,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAkB,CAAC;YAC5C,SAAS,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,UAAoB,CAAC;YAC7C,SAAS,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,UAAoB,CAAC;YAC7C,YAAY,EAAE,GAAG,CAAC,aAA8B;SACjD,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,EAAU;QAC1B,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;QAEpC,gFAAgF;QAChF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;QAC9E,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,OAAO,KAAK,CAAC;QACf,CAAC;QAED,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,KAAK,CAAC,MAAM,CAAC;YACjB,KAAK,EAAE,SAAS,EAAE,GAAG;YACrB,MAAM,EAAE;gBACN,aAAa,EAAE,iBAAiB;gBAChC,UAAU,EAAE,GAAG;aAChB;SACF,CAAC,CAAC;QAEH,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,SAAmB,EAAE,KAAa;QAClD,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;QACpC,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC;QAE3E,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACzB,EAAE,EAAE,CAAC,CAAC,EAAY;YAClB,QAAQ,EAAE,CAAC,CAAC,SAAmB;SAChC,CAAC,CAAC,CAAC;IACN,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../src/db/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,MAAM,EAOP,MAAM,cAAc,CAAC;AAEtB,eAAO,MAAM,UAAU,aAAa,CAAC;AAErC,eAAO,MAAM,YAAY,aAoBvB,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { Schema, Field, FixedSizeList, Float32, Utf8, Timestamp, TimeUnit, } from "apache-arrow";
|
|
2
|
+
export const TABLE_NAME = "memories";
|
|
3
|
+
export const memorySchema = new Schema([
|
|
4
|
+
new Field("id", new Utf8(), false),
|
|
5
|
+
new Field("vector", new FixedSizeList(384, new Field("item", new Float32())), false),
|
|
6
|
+
new Field("content", new Utf8(), false),
|
|
7
|
+
new Field("metadata", new Utf8(), false), // JSON string
|
|
8
|
+
new Field("created_at", new Timestamp(TimeUnit.MILLISECOND), false),
|
|
9
|
+
new Field("updated_at", new Timestamp(TimeUnit.MILLISECOND), false),
|
|
10
|
+
new Field("superseded_by", new Utf8(), true), // Nullable
|
|
11
|
+
]);
|
|
12
|
+
//# sourceMappingURL=schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../src/db/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,MAAM,EACN,KAAK,EACL,aAAa,EACb,OAAO,EACP,IAAI,EACJ,SAAS,EACT,QAAQ,GACT,MAAM,cAAc,CAAC;AAEtB,MAAM,CAAC,MAAM,UAAU,GAAG,UAAU,CAAC;AAErC,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,MAAM,CAAC;IACrC,IAAI,KAAK,CAAC,IAAI,EAAE,IAAI,IAAI,EAAE,EAAE,KAAK,CAAC;IAClC,IAAI,KAAK,CACP,QAAQ,EACR,IAAI,aAAa,CAAC,GAAG,EAAE,IAAI,KAAK,CAAC,MAAM,EAAE,IAAI,OAAO,EAAE,CAAC,CAAC,EACxD,KAAK,CACN;IACD,IAAI,KAAK,CAAC,SAAS,EAAE,IAAI,IAAI,EAAE,EAAE,KAAK,CAAC;IACvC,IAAI,KAAK,CAAC,UAAU,EAAE,IAAI,IAAI,EAAE,EAAE,KAAK,CAAC,EAAE,cAAc;IACxD,IAAI,KAAK,CACP,YAAY,EACZ,IAAI,SAAS,CAAC,QAAQ,CAAC,WAAW,CAAC,EACnC,KAAK,CACN;IACD,IAAI,KAAK,CACP,YAAY,EACZ,IAAI,SAAS,CAAC,QAAQ,CAAC,WAAW,CAAC,EACnC,KAAK,CACN;IACD,IAAI,KAAK,CAAC,eAAe,EAAE,IAAI,IAAI,EAAE,EAAE,IAAI,CAAC,EAAE,WAAW;CAC1D,CAAC,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP HTTP Transport Handler
|
|
3
|
+
*
|
|
4
|
+
* Provides StreamableHTTP transport for MCP over HTTP.
|
|
5
|
+
* and other HTTP-based MCP clients to connect to the memory server.
|
|
6
|
+
*
|
|
7
|
+
* This implementation handles the MCP protocol directly using Hono's streaming
|
|
8
|
+
* capabilities, since StreamableHTTPServerTransport expects Node.js req/res objects.
|
|
9
|
+
*/
|
|
10
|
+
import { Hono } from "hono";
|
|
11
|
+
import type { MemoryService } from "../services/memory.service.js";
|
|
12
|
+
/**
|
|
13
|
+
* Creates MCP routes for a Hono app.
|
|
14
|
+
*
|
|
15
|
+
* Uses InMemoryTransport internally and bridges to HTTP/SSE manually,
|
|
16
|
+
* since StreamableHTTPServerTransport requires Node.js req/res objects.
|
|
17
|
+
*/
|
|
18
|
+
export declare function createMcpRoutes(memoryService: MemoryService): Hono;
|
|
19
|
+
//# sourceMappingURL=mcp-transport.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-transport.d.ts","sourceRoot":"","sources":["../../../src/http/mcp-transport.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAe5B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAUnE;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,aAAa,EAAE,aAAa,GAAG,IAAI,CAkLlE"}
|