ninaivagam 0.1.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 +93 -0
- package/dist/config.d.ts +7 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +8 -0
- package/dist/config.js.map +1 -0
- package/dist/db/connection.d.ts +3 -0
- package/dist/db/connection.d.ts.map +1 -0
- package/dist/db/connection.js +24 -0
- package/dist/db/connection.js.map +1 -0
- package/dist/db/memory.model.d.ts +8 -0
- package/dist/db/memory.model.d.ts.map +1 -0
- package/dist/db/memory.model.js +13 -0
- package/dist/db/memory.model.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +21 -0
- package/dist/index.js.map +1 -0
- package/dist/server.d.ts +3 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +12 -0
- package/dist/server.js.map +1 -0
- package/dist/tools/delete.d.ts +20 -0
- package/dist/tools/delete.d.ts.map +1 -0
- package/dist/tools/delete.js +35 -0
- package/dist/tools/delete.js.map +1 -0
- package/dist/tools/index.d.ts +5 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +5 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/list.d.ts +21 -0
- package/dist/tools/list.d.ts.map +1 -0
- package/dist/tools/list.js +45 -0
- package/dist/tools/list.js.map +1 -0
- package/dist/tools/retrieve.d.ts +20 -0
- package/dist/tools/retrieve.d.ts.map +1 -0
- package/dist/tools/retrieve.js +52 -0
- package/dist/tools/retrieve.js.map +1 -0
- package/dist/tools/store.d.ts +22 -0
- package/dist/tools/store.d.ts.map +1 -0
- package/dist/tools/store.js +30 -0
- package/dist/tools/store.js.map +1 -0
- package/dist/types.d.ts +12 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +11 -0
- package/dist/types.js.map +1 -0
- package/package.json +49 -0
package/README.md
ADDED
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
# ninaivagam
|
|
2
|
+
|
|
3
|
+
**ninaivagam** (Tamil: நினைவகம், "memory/remembrance") is an MCP server that gives AI coding agents (Claude Code, Cursor) persistent, project-scoped memory backed by MongoDB.
|
|
4
|
+
|
|
5
|
+
It stores structured knowledge *about software projects*: folder layouts, architecture decisions, tech stack, git branch strategy, coding conventions, in-progress tasks.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Prerequisites
|
|
10
|
+
|
|
11
|
+
MongoDB must be running. Quick start with Docker:
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
docker run -d -p 27017:27017 --name mongo mongo:7
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
## Add to Claude Code
|
|
20
|
+
|
|
21
|
+
In `~/.claude/settings.json` (global) or `.claude/settings.json` (project):
|
|
22
|
+
|
|
23
|
+
```json
|
|
24
|
+
{
|
|
25
|
+
"mcpServers": {
|
|
26
|
+
"ninaivagam": {
|
|
27
|
+
"command": "npx",
|
|
28
|
+
"args": ["-y", "ninaivagam"],
|
|
29
|
+
"env": {
|
|
30
|
+
"MONGO_URI": "mongodb://localhost:27017",
|
|
31
|
+
"DB_NAME": "agent-memory"
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
Or if installed globally (`npm install -g ninaivagam`):
|
|
39
|
+
|
|
40
|
+
```json
|
|
41
|
+
{
|
|
42
|
+
"mcpServers": {
|
|
43
|
+
"ninaivagam": {
|
|
44
|
+
"command": "ninaivagam",
|
|
45
|
+
"env": {
|
|
46
|
+
"MONGO_URI": "mongodb://localhost:27017"
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
---
|
|
54
|
+
|
|
55
|
+
## Add to Cursor
|
|
56
|
+
|
|
57
|
+
Open Cursor Settings > MCP > Add server:
|
|
58
|
+
- **Command:** `npx`
|
|
59
|
+
- **Args:** `["-y", "ninaivagam"]`
|
|
60
|
+
- **Env:** `MONGO_URI=mongodb://localhost:27017`
|
|
61
|
+
|
|
62
|
+
---
|
|
63
|
+
|
|
64
|
+
## Environment Variables
|
|
65
|
+
|
|
66
|
+
| Variable | Default | Description |
|
|
67
|
+
|---------------|-----------------------------|--------------------------------|
|
|
68
|
+
| `MONGO_URI` | `mongodb://localhost:27017` | MongoDB connection string |
|
|
69
|
+
| `DB_NAME` | `agent-memory` | MongoDB database name |
|
|
70
|
+
| `SERVER_NAME` | `ninaivagam` | Name reported in MCP handshake |
|
|
71
|
+
|
|
72
|
+
---
|
|
73
|
+
|
|
74
|
+
## MCP Tools
|
|
75
|
+
|
|
76
|
+
| Tool | Inputs | Purpose |
|
|
77
|
+
|-------------------|-----------------------------------------|------------------------------------|
|
|
78
|
+
| `store_memory` | projectId, category, key, value, tags? | Create or overwrite a memory entry |
|
|
79
|
+
| `retrieve_memory` | projectId, key, category? | Fetch one memory by key |
|
|
80
|
+
| `list_memories` | projectId, category?, tags?, limit? | List with optional filters |
|
|
81
|
+
| `delete_memory` | projectId, category, key | Remove a memory entry |
|
|
82
|
+
|
|
83
|
+
---
|
|
84
|
+
|
|
85
|
+
## Memory Categories
|
|
86
|
+
|
|
87
|
+
`architecture` · `stack` · `folder-structure` · `git` · `convention` · `task` · `decision` · `other`
|
|
88
|
+
|
|
89
|
+
---
|
|
90
|
+
|
|
91
|
+
## License
|
|
92
|
+
|
|
93
|
+
MIT
|
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,MAAM;;;;;EAKjB,CAAC"}
|
package/dist/config.js
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import pkg from "../package.json" with { type: "json" };
|
|
2
|
+
export const config = Object.freeze({
|
|
3
|
+
MONGO_URI: process.env.MONGO_URI ?? "mongodb://localhost:27017",
|
|
4
|
+
DB_NAME: process.env.DB_NAME ?? "agent-memory",
|
|
5
|
+
SERVER_NAME: process.env.SERVER_NAME ?? "ninaivagam",
|
|
6
|
+
SERVER_VERSION: pkg.version,
|
|
7
|
+
});
|
|
8
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,iBAAiB,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AAExD,MAAM,CAAC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;IAClC,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,2BAA2B;IAC/D,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,cAAc;IAC9C,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,YAAY;IACpD,cAAc,EAAE,GAAG,CAAC,OAAO;CAC5B,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connection.d.ts","sourceRoot":"","sources":["../../src/db/connection.ts"],"names":[],"mappings":"AAGA,wBAAsB,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAS/C;AAED,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAOlD"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import mongoose from "mongoose";
|
|
2
|
+
import { config } from "../config.js";
|
|
3
|
+
export async function connectDB() {
|
|
4
|
+
if (mongoose.connection.readyState !== 0)
|
|
5
|
+
return;
|
|
6
|
+
try {
|
|
7
|
+
await mongoose.connect(config.MONGO_URI, { dbName: config.DB_NAME });
|
|
8
|
+
console.error("ninaivagam connected to MongoDB");
|
|
9
|
+
}
|
|
10
|
+
catch (err) {
|
|
11
|
+
console.error("[ninaivagam] Failed to connect to MongoDB:", err);
|
|
12
|
+
process.exit(1);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
export async function disconnectDB() {
|
|
16
|
+
try {
|
|
17
|
+
await mongoose.disconnect();
|
|
18
|
+
console.error("[ninaivagam] Disconnected from MongoDB");
|
|
19
|
+
}
|
|
20
|
+
catch (err) {
|
|
21
|
+
console.error("[ninaivagam] Error during disconnect:", err);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=connection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connection.js","sourceRoot":"","sources":["../../src/db/connection.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAEtC,MAAM,CAAC,KAAK,UAAU,SAAS;IAC7B,IAAI,QAAQ,CAAC,UAAU,CAAC,UAAU,KAAK,CAAC;QAAE,OAAO;IACjD,IAAI,CAAC;QACH,MAAM,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;QACrE,OAAO,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC;IACnD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,4CAA4C,EAAE,GAAG,CAAC,CAAC;QACjE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY;IAChC,IAAI,CAAC;QACH,MAAM,QAAQ,CAAC,UAAU,EAAE,CAAC;QAC5B,OAAO,CAAC,KAAK,CAAC,wCAAwC,CAAC,CAAC;IAC1D,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,uCAAuC,EAAE,GAAG,CAAC,CAAC;IAC9D,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import mongoose from "mongoose";
|
|
2
|
+
import { type IMemory } from "../types.js";
|
|
3
|
+
export declare const Memory: mongoose.Model<IMemory, {}, {}, {}, mongoose.Document<unknown, {}, IMemory, {}, {}> & IMemory & {
|
|
4
|
+
_id: mongoose.Types.ObjectId;
|
|
5
|
+
} & {
|
|
6
|
+
__v: number;
|
|
7
|
+
}, any>;
|
|
8
|
+
//# sourceMappingURL=memory.model.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory.model.d.ts","sourceRoot":"","sources":["../../src/db/memory.model.ts"],"names":[],"mappings":"AAAA,OAAO,QAAoB,MAAM,UAAU,CAAC;AAC5C,OAAO,EAAqB,KAAK,OAAO,EAAE,MAAM,aAAa,CAAC;AAgB9D,eAAO,MAAM,MAAM;;;;OAAkD,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import mongoose, { Schema } from "mongoose";
|
|
2
|
+
import { MEMORY_CATEGORIES } from "../types.js";
|
|
3
|
+
const MemorySchema = new Schema({
|
|
4
|
+
projectId: { type: String, required: true, index: true },
|
|
5
|
+
category: { type: String, required: true, enum: MEMORY_CATEGORIES },
|
|
6
|
+
key: { type: String, required: true, maxlength: 100 },
|
|
7
|
+
value: { type: String, required: true },
|
|
8
|
+
tags: { type: [String], default: [] },
|
|
9
|
+
}, { timestamps: true });
|
|
10
|
+
// One key per category per project — store_memory upserts on this triple
|
|
11
|
+
MemorySchema.index({ projectId: 1, category: 1, key: 1 }, { unique: true });
|
|
12
|
+
export const Memory = mongoose.model("Memory", MemorySchema);
|
|
13
|
+
//# sourceMappingURL=memory.model.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory.model.js","sourceRoot":"","sources":["../../src/db/memory.model.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,EAAE,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,EAAE,iBAAiB,EAAgB,MAAM,aAAa,CAAC;AAE9D,MAAM,YAAY,GAAG,IAAI,MAAM,CAC7B;IACE,SAAS,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE;IACxD,QAAQ,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,iBAAiB,EAAE;IACnE,GAAG,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE;IACrD,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE;IACvC,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE;CACtC,EACD,EAAE,UAAU,EAAE,IAAI,EAAE,CACrB,CAAC;AAEF,yEAAyE;AACzE,YAAY,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;AAE5E,MAAM,CAAC,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAU,QAAQ,EAAE,YAAY,CAAC,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
3
|
+
import { connectDB, disconnectDB } from "./db/connection.js";
|
|
4
|
+
import { server } from "./server.js";
|
|
5
|
+
async function main() {
|
|
6
|
+
await connectDB();
|
|
7
|
+
const transport = new StdioServerTransport();
|
|
8
|
+
await server.connect(transport);
|
|
9
|
+
console.error("[ninaivagam] MCP server running on stdio");
|
|
10
|
+
const shutdown = async () => {
|
|
11
|
+
await disconnectDB();
|
|
12
|
+
process.exit(0);
|
|
13
|
+
};
|
|
14
|
+
process.on("SIGINT", shutdown);
|
|
15
|
+
process.on("SIGTERM", shutdown);
|
|
16
|
+
}
|
|
17
|
+
main().catch((err) => {
|
|
18
|
+
console.error("[ninaivagam] Fatal error:", err);
|
|
19
|
+
process.exit(1);
|
|
20
|
+
});
|
|
21
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAC7D,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,KAAK,UAAU,IAAI;IACjB,MAAM,SAAS,EAAE,CAAC;IAElB,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAEhC,OAAO,CAAC,KAAK,CAAC,0CAA0C,CAAC,CAAC;IAE1D,MAAM,QAAQ,GAAG,KAAK,IAAI,EAAE;QAC1B,MAAM,YAAY,EAAE,CAAC;QACrB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC;IAEF,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC/B,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;AAClC,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,OAAO,CAAC,KAAK,CAAC,2BAA2B,EAAE,GAAG,CAAC,CAAC;IAChD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
package/dist/server.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAapE,eAAO,MAAM,MAAM,WAGjB,CAAC"}
|
package/dist/server.js
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
import { config } from "./config.js";
|
|
3
|
+
import { storeMemorySchema, storeMemoryHandler, retrieveMemorySchema, retrieveMemoryHandler, listMemoriesSchema, listMemoriesHandler, deleteMemorySchema, deleteMemoryHandler, } from "./tools/index.js";
|
|
4
|
+
export const server = new McpServer({
|
|
5
|
+
name: config.SERVER_NAME,
|
|
6
|
+
version: config.SERVER_VERSION,
|
|
7
|
+
});
|
|
8
|
+
server.tool("store_memory", "Store or update a piece of project knowledge (architecture, stack, folder structure, git strategy, convention, task, decision, etc.)", storeMemorySchema, storeMemoryHandler);
|
|
9
|
+
server.tool("retrieve_memory", "Fetch a single memory entry by project and key", retrieveMemorySchema, retrieveMemoryHandler);
|
|
10
|
+
server.tool("list_memories", "List memory entries for a project, optionally filtered by category or tags", listMemoriesSchema, listMemoriesHandler);
|
|
11
|
+
server.tool("delete_memory", "Delete a memory entry by project, category, and key", deleteMemorySchema, deleteMemoryHandler);
|
|
12
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,oBAAoB,EACpB,qBAAqB,EACrB,kBAAkB,EAClB,mBAAmB,EACnB,kBAAkB,EAClB,mBAAmB,GACpB,MAAM,kBAAkB,CAAC;AAE1B,MAAM,CAAC,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;IAClC,IAAI,EAAE,MAAM,CAAC,WAAW;IACxB,OAAO,EAAE,MAAM,CAAC,cAAc;CAC/B,CAAC,CAAC;AAEH,MAAM,CAAC,IAAI,CACT,cAAc,EACd,sIAAsI,EACtI,iBAAiB,EACjB,kBAAkB,CACnB,CAAC;AAEF,MAAM,CAAC,IAAI,CACT,iBAAiB,EACjB,gDAAgD,EAChD,oBAAoB,EACpB,qBAAqB,CACtB,CAAC;AAEF,MAAM,CAAC,IAAI,CACT,eAAe,EACf,4EAA4E,EAC5E,kBAAkB,EAClB,mBAAmB,CACpB,CAAC;AAEF,MAAM,CAAC,IAAI,CACT,eAAe,EACf,qDAAqD,EACrD,kBAAkB,EAClB,mBAAmB,CACpB,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export declare const deleteMemorySchema: {
|
|
3
|
+
projectId: z.ZodString;
|
|
4
|
+
category: z.ZodEnum<["architecture", "stack", "folder-structure", "git", "convention", "task", "decision", "other"]>;
|
|
5
|
+
key: z.ZodString;
|
|
6
|
+
};
|
|
7
|
+
export declare function deleteMemoryHandler(input: z.infer<z.ZodObject<typeof deleteMemorySchema>>): Promise<{
|
|
8
|
+
content: {
|
|
9
|
+
type: "text";
|
|
10
|
+
text: string;
|
|
11
|
+
}[];
|
|
12
|
+
isError?: undefined;
|
|
13
|
+
} | {
|
|
14
|
+
content: {
|
|
15
|
+
type: "text";
|
|
16
|
+
text: string;
|
|
17
|
+
}[];
|
|
18
|
+
isError: boolean;
|
|
19
|
+
}>;
|
|
20
|
+
//# sourceMappingURL=delete.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delete.d.ts","sourceRoot":"","sources":["../../src/tools/delete.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,eAAO,MAAM,kBAAkB;;;;CAI9B,CAAC;AAEF,wBAAsB,mBAAmB,CACvC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,kBAAkB,CAAC,CAAC;;;;;;;;;;;;GA0BvD"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { Memory } from "../db/memory.model.js";
|
|
3
|
+
import { MEMORY_CATEGORIES } from "../types.js";
|
|
4
|
+
export const deleteMemorySchema = {
|
|
5
|
+
projectId: z.string().min(1),
|
|
6
|
+
category: z.enum(MEMORY_CATEGORIES),
|
|
7
|
+
key: z.string().min(1),
|
|
8
|
+
};
|
|
9
|
+
export async function deleteMemoryHandler(input) {
|
|
10
|
+
try {
|
|
11
|
+
const result = await Memory.deleteOne({
|
|
12
|
+
projectId: input.projectId,
|
|
13
|
+
category: input.category,
|
|
14
|
+
key: input.key,
|
|
15
|
+
});
|
|
16
|
+
const deleted = result.deletedCount > 0;
|
|
17
|
+
return {
|
|
18
|
+
content: [
|
|
19
|
+
{
|
|
20
|
+
type: "text",
|
|
21
|
+
text: deleted
|
|
22
|
+
? `Memory deleted: project="${input.projectId}" category="${input.category}" key="${input.key}".`
|
|
23
|
+
: `No memory found to delete: project="${input.projectId}" category="${input.category}" key="${input.key}".`,
|
|
24
|
+
},
|
|
25
|
+
],
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
catch (err) {
|
|
29
|
+
return {
|
|
30
|
+
content: [{ type: "text", text: `Error deleting memory: ${String(err)}` }],
|
|
31
|
+
isError: true,
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=delete.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delete.js","sourceRoot":"","sources":["../../src/tools/delete.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAC/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEhD,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC5B,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC;IACnC,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;CACvB,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,KAAsD;IAEtD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC;YACpC,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,GAAG,EAAE,KAAK,CAAC,GAAG;SACf,CAAC,CAAC;QAEH,MAAM,OAAO,GAAG,MAAM,CAAC,YAAY,GAAG,CAAC,CAAC;QACxC,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE,OAAO;wBACX,CAAC,CAAC,4BAA4B,KAAK,CAAC,SAAS,eAAe,KAAK,CAAC,QAAQ,UAAU,KAAK,CAAC,GAAG,IAAI;wBACjG,CAAC,CAAC,uCAAuC,KAAK,CAAC,SAAS,eAAe,KAAK,CAAC,QAAQ,UAAU,KAAK,CAAC,GAAG,IAAI;iBAC/G;aACF;SACF,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,0BAA0B,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACnF,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { storeMemorySchema, storeMemoryHandler } from "./store.js";
|
|
2
|
+
export { retrieveMemorySchema, retrieveMemoryHandler } from "./retrieve.js";
|
|
3
|
+
export { listMemoriesSchema, listMemoriesHandler } from "./list.js";
|
|
4
|
+
export { deleteMemorySchema, deleteMemoryHandler } from "./delete.js";
|
|
5
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAC5E,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AACpE,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { storeMemorySchema, storeMemoryHandler } from "./store.js";
|
|
2
|
+
export { retrieveMemorySchema, retrieveMemoryHandler } from "./retrieve.js";
|
|
3
|
+
export { listMemoriesSchema, listMemoriesHandler } from "./list.js";
|
|
4
|
+
export { deleteMemorySchema, deleteMemoryHandler } from "./delete.js";
|
|
5
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAC5E,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AACpE,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export declare const listMemoriesSchema: {
|
|
3
|
+
projectId: z.ZodString;
|
|
4
|
+
category: z.ZodOptional<z.ZodEnum<["architecture", "stack", "folder-structure", "git", "convention", "task", "decision", "other"]>>;
|
|
5
|
+
tags: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
6
|
+
limit: z.ZodOptional<z.ZodNumber>;
|
|
7
|
+
};
|
|
8
|
+
export declare function listMemoriesHandler(input: z.infer<z.ZodObject<typeof listMemoriesSchema>>): Promise<{
|
|
9
|
+
content: {
|
|
10
|
+
type: "text";
|
|
11
|
+
text: string;
|
|
12
|
+
}[];
|
|
13
|
+
isError?: undefined;
|
|
14
|
+
} | {
|
|
15
|
+
content: {
|
|
16
|
+
type: "text";
|
|
17
|
+
text: string;
|
|
18
|
+
}[];
|
|
19
|
+
isError: boolean;
|
|
20
|
+
}>;
|
|
21
|
+
//# sourceMappingURL=list.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../src/tools/list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,eAAO,MAAM,kBAAkB;;;;;CAK9B,CAAC;AAEF,wBAAsB,mBAAmB,CACvC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,kBAAkB,CAAC,CAAC;;;;;;;;;;;;GAoCvD"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { Memory } from "../db/memory.model.js";
|
|
3
|
+
import { MEMORY_CATEGORIES } from "../types.js";
|
|
4
|
+
export const listMemoriesSchema = {
|
|
5
|
+
projectId: z.string().min(1),
|
|
6
|
+
category: z.enum(MEMORY_CATEGORIES).optional(),
|
|
7
|
+
tags: z.array(z.string()).optional(),
|
|
8
|
+
limit: z.number().int().min(1).max(200).optional(),
|
|
9
|
+
};
|
|
10
|
+
export async function listMemoriesHandler(input) {
|
|
11
|
+
try {
|
|
12
|
+
const filter = { projectId: input.projectId };
|
|
13
|
+
if (input.category)
|
|
14
|
+
filter.category = input.category;
|
|
15
|
+
if (input.tags && input.tags.length > 0)
|
|
16
|
+
filter.tags = { $in: input.tags };
|
|
17
|
+
const docs = await Memory.find(filter)
|
|
18
|
+
.limit(input.limit ?? 50)
|
|
19
|
+
.lean();
|
|
20
|
+
const results = docs.map((d) => ({
|
|
21
|
+
category: d.category,
|
|
22
|
+
key: d.key,
|
|
23
|
+
value: d.value.length > 500 ? d.value.slice(0, 500) + "…" : d.value,
|
|
24
|
+
tags: d.tags,
|
|
25
|
+
updatedAt: d.updatedAt,
|
|
26
|
+
}));
|
|
27
|
+
return {
|
|
28
|
+
content: [
|
|
29
|
+
{
|
|
30
|
+
type: "text",
|
|
31
|
+
text: results.length === 0
|
|
32
|
+
? `No memories found for project="${input.projectId}".`
|
|
33
|
+
: JSON.stringify(results, null, 2),
|
|
34
|
+
},
|
|
35
|
+
],
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
catch (err) {
|
|
39
|
+
return {
|
|
40
|
+
content: [{ type: "text", text: `Error listing memories: ${String(err)}` }],
|
|
41
|
+
isError: true,
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=list.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/tools/list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAC/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEhD,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC5B,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,QAAQ,EAAE;IAC9C,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;IACpC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE;CACnD,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,KAAsD;IAEtD,IAAI,CAAC;QACH,MAAM,MAAM,GAA4B,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,CAAC;QACvE,IAAI,KAAK,CAAC,QAAQ;YAAE,MAAM,CAAC,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC;QACrD,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC;YAAE,MAAM,CAAC,IAAI,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC;QAE3E,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC;aACnC,KAAK,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC;aACxB,IAAI,EAAE,CAAC;QAEV,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC/B,QAAQ,EAAE,CAAC,CAAC,QAAQ;YACpB,GAAG,EAAE,CAAC,CAAC,GAAG;YACV,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK;YACnE,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,SAAS,EAAE,CAAC,CAAC,SAAS;SACvB,CAAC,CAAC,CAAC;QAEJ,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAe;oBACrB,IAAI,EACF,OAAO,CAAC,MAAM,KAAK,CAAC;wBAClB,CAAC,CAAC,kCAAkC,KAAK,CAAC,SAAS,IAAI;wBACvD,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;iBACvC;aACF;SACF,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,2BAA2B,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACpF,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export declare const retrieveMemorySchema: {
|
|
3
|
+
projectId: z.ZodString;
|
|
4
|
+
key: z.ZodString;
|
|
5
|
+
category: z.ZodOptional<z.ZodEnum<["architecture", "stack", "folder-structure", "git", "convention", "task", "decision", "other"]>>;
|
|
6
|
+
};
|
|
7
|
+
export declare function retrieveMemoryHandler(input: z.infer<z.ZodObject<typeof retrieveMemorySchema>>): Promise<{
|
|
8
|
+
content: {
|
|
9
|
+
type: "text";
|
|
10
|
+
text: string;
|
|
11
|
+
}[];
|
|
12
|
+
isError?: undefined;
|
|
13
|
+
} | {
|
|
14
|
+
content: {
|
|
15
|
+
type: "text";
|
|
16
|
+
text: string;
|
|
17
|
+
}[];
|
|
18
|
+
isError: boolean;
|
|
19
|
+
}>;
|
|
20
|
+
//# sourceMappingURL=retrieve.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retrieve.d.ts","sourceRoot":"","sources":["../../src/tools/retrieve.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,eAAO,MAAM,oBAAoB;;;;CAIhC,CAAC;AAEF,wBAAsB,qBAAqB,CACzC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,oBAAoB,CAAC,CAAC;;;;;;;;;;;;GA+CzD"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { Memory } from "../db/memory.model.js";
|
|
3
|
+
import { MEMORY_CATEGORIES } from "../types.js";
|
|
4
|
+
export const retrieveMemorySchema = {
|
|
5
|
+
projectId: z.string().min(1),
|
|
6
|
+
key: z.string().min(1),
|
|
7
|
+
category: z.enum(MEMORY_CATEGORIES).optional(),
|
|
8
|
+
};
|
|
9
|
+
export async function retrieveMemoryHandler(input) {
|
|
10
|
+
try {
|
|
11
|
+
const filter = {
|
|
12
|
+
projectId: input.projectId,
|
|
13
|
+
key: input.key,
|
|
14
|
+
};
|
|
15
|
+
if (input.category)
|
|
16
|
+
filter.category = input.category;
|
|
17
|
+
const doc = await Memory.findOne(filter).lean();
|
|
18
|
+
if (!doc) {
|
|
19
|
+
return {
|
|
20
|
+
content: [
|
|
21
|
+
{
|
|
22
|
+
type: "text",
|
|
23
|
+
text: `No memory found for project="${input.projectId}" key="${input.key}"${input.category ? ` category="${input.category}"` : ""}.`,
|
|
24
|
+
},
|
|
25
|
+
],
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
return {
|
|
29
|
+
content: [
|
|
30
|
+
{
|
|
31
|
+
type: "text",
|
|
32
|
+
text: JSON.stringify({
|
|
33
|
+
id: doc._id,
|
|
34
|
+
projectId: doc.projectId,
|
|
35
|
+
category: doc.category,
|
|
36
|
+
key: doc.key,
|
|
37
|
+
value: doc.value,
|
|
38
|
+
tags: doc.tags,
|
|
39
|
+
updatedAt: doc.updatedAt,
|
|
40
|
+
}, null, 2),
|
|
41
|
+
},
|
|
42
|
+
],
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
catch (err) {
|
|
46
|
+
return {
|
|
47
|
+
content: [{ type: "text", text: `Error retrieving memory: ${String(err)}` }],
|
|
48
|
+
isError: true,
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=retrieve.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retrieve.js","sourceRoot":"","sources":["../../src/tools/retrieve.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAC/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEhD,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC5B,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACtB,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,QAAQ,EAAE;CAC/C,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,KAAwD;IAExD,IAAI,CAAC;QACH,MAAM,MAAM,GAA4B;YACtC,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,GAAG,EAAE,KAAK,CAAC,GAAG;SACf,CAAC;QACF,IAAI,KAAK,CAAC,QAAQ;YAAE,MAAM,CAAC,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC;QAErD,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;QAChD,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,gCAAgC,KAAK,CAAC,SAAS,UAAU,KAAK,CAAC,GAAG,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,cAAc,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG;qBACrI;iBACF;aACF,CAAC;QACJ,CAAC;QAED,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAClB;wBACE,EAAE,EAAE,GAAG,CAAC,GAAG;wBACX,SAAS,EAAE,GAAG,CAAC,SAAS;wBACxB,QAAQ,EAAE,GAAG,CAAC,QAAQ;wBACtB,GAAG,EAAE,GAAG,CAAC,GAAG;wBACZ,KAAK,EAAE,GAAG,CAAC,KAAK;wBAChB,IAAI,EAAE,GAAG,CAAC,IAAI;wBACd,SAAS,EAAE,GAAG,CAAC,SAAS;qBACzB,EACD,IAAI,EACJ,CAAC,CACF;iBACF;aACF;SACF,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,4BAA4B,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACrF,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export declare const storeMemorySchema: {
|
|
3
|
+
projectId: z.ZodString;
|
|
4
|
+
category: z.ZodEnum<["architecture", "stack", "folder-structure", "git", "convention", "task", "decision", "other"]>;
|
|
5
|
+
key: z.ZodString;
|
|
6
|
+
value: z.ZodString;
|
|
7
|
+
tags: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
8
|
+
};
|
|
9
|
+
export declare function storeMemoryHandler(input: z.infer<z.ZodObject<typeof storeMemorySchema>>): Promise<{
|
|
10
|
+
content: {
|
|
11
|
+
type: "text";
|
|
12
|
+
text: string;
|
|
13
|
+
}[];
|
|
14
|
+
isError?: undefined;
|
|
15
|
+
} | {
|
|
16
|
+
content: {
|
|
17
|
+
type: "text";
|
|
18
|
+
text: string;
|
|
19
|
+
}[];
|
|
20
|
+
isError: boolean;
|
|
21
|
+
}>;
|
|
22
|
+
//# sourceMappingURL=store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/tools/store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,eAAO,MAAM,iBAAiB;;;;;;CAM7B,CAAC;AAEF,wBAAsB,kBAAkB,CACtC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,iBAAiB,CAAC,CAAC;;;;;;;;;;;;GAsBtD"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { Memory } from "../db/memory.model.js";
|
|
3
|
+
import { MEMORY_CATEGORIES } from "../types.js";
|
|
4
|
+
export const storeMemorySchema = {
|
|
5
|
+
projectId: z.string().min(1),
|
|
6
|
+
category: z.enum(MEMORY_CATEGORIES),
|
|
7
|
+
key: z.string().min(1).max(100),
|
|
8
|
+
value: z.string().min(1),
|
|
9
|
+
tags: z.array(z.string()).optional(),
|
|
10
|
+
};
|
|
11
|
+
export async function storeMemoryHandler(input) {
|
|
12
|
+
try {
|
|
13
|
+
const doc = await Memory.findOneAndUpdate({ projectId: input.projectId, category: input.category, key: input.key }, { value: input.value, tags: input.tags ?? [] }, { upsert: true, new: true });
|
|
14
|
+
return {
|
|
15
|
+
content: [
|
|
16
|
+
{
|
|
17
|
+
type: "text",
|
|
18
|
+
text: `Memory stored.\nid: ${doc._id}\nproject: ${doc.projectId}\ncategory: ${doc.category}\nkey: ${doc.key}\nupdatedAt: ${doc.updatedAt.toISOString()}`,
|
|
19
|
+
},
|
|
20
|
+
],
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
catch (err) {
|
|
24
|
+
return {
|
|
25
|
+
content: [{ type: "text", text: `Error storing memory: ${String(err)}` }],
|
|
26
|
+
isError: true,
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/tools/store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAC/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEhD,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC5B,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC;IACnC,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;IAC/B,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACxB,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;CACrC,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,KAAqD;IAErD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,gBAAgB,CACvC,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,EACxE,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,EAAE,EAAE,EAC9C,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,CAC5B,CAAC;QACF,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE,uBAAuB,GAAG,CAAC,GAAG,cAAc,GAAG,CAAC,SAAS,eAAe,GAAG,CAAC,QAAQ,UAAU,GAAG,CAAC,GAAG,gBAAgB,GAAG,CAAC,SAAS,CAAC,WAAW,EAAE,EAAE;iBACzJ;aACF;SACF,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,yBAAyB,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YAClF,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;AACH,CAAC"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export declare const MEMORY_CATEGORIES: readonly ["architecture", "stack", "folder-structure", "git", "convention", "task", "decision", "other"];
|
|
2
|
+
export type MemoryCategory = (typeof MEMORY_CATEGORIES)[number];
|
|
3
|
+
export interface IMemory {
|
|
4
|
+
projectId: string;
|
|
5
|
+
category: MemoryCategory;
|
|
6
|
+
key: string;
|
|
7
|
+
value: string;
|
|
8
|
+
tags: string[];
|
|
9
|
+
createdAt: Date;
|
|
10
|
+
updatedAt: Date;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,iBAAiB,0GASpB,CAAC;AAEX,MAAM,MAAM,cAAc,GAAG,CAAC,OAAO,iBAAiB,CAAC,CAAC,MAAM,CAAC,CAAC;AAEhE,MAAM,WAAW,OAAO;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,cAAc,CAAC;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,SAAS,EAAE,IAAI,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;CACjB"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,cAAc;IACd,OAAO;IACP,kBAAkB;IAClB,KAAK;IACL,YAAY;IACZ,MAAM;IACN,UAAU;IACV,OAAO;CACC,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "ninaivagam",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "MCP server that gives AI agents persistent, project-scoped memory backed by MongoDB",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"mcp",
|
|
7
|
+
"claude",
|
|
8
|
+
"cursor",
|
|
9
|
+
"ai-agent",
|
|
10
|
+
"memory",
|
|
11
|
+
"modelcontextprotocol"
|
|
12
|
+
],
|
|
13
|
+
"author": "thamizharasanj",
|
|
14
|
+
"license": "MIT",
|
|
15
|
+
"type": "module",
|
|
16
|
+
"main": "./dist/index.js",
|
|
17
|
+
"bin": {
|
|
18
|
+
"ninaivagam": "dist/index.js"
|
|
19
|
+
},
|
|
20
|
+
"files": [
|
|
21
|
+
"dist/**/*",
|
|
22
|
+
"README.md"
|
|
23
|
+
],
|
|
24
|
+
"scripts": {
|
|
25
|
+
"build": "tsc",
|
|
26
|
+
"build:watch": "tsc --watch",
|
|
27
|
+
"start": "node dist/index.js",
|
|
28
|
+
"dev": "tsx src/index.ts",
|
|
29
|
+
"clean": "rimraf dist",
|
|
30
|
+
"prepublishOnly": "npm run clean && npm run build",
|
|
31
|
+
"test": "vitest run",
|
|
32
|
+
"test:watch": "vitest"
|
|
33
|
+
},
|
|
34
|
+
"dependencies": {
|
|
35
|
+
"@modelcontextprotocol/sdk": "^1.28.0",
|
|
36
|
+
"mongoose": "^8.9.0",
|
|
37
|
+
"zod": "^3.25.0"
|
|
38
|
+
},
|
|
39
|
+
"devDependencies": {
|
|
40
|
+
"@types/node": "^22.0.0",
|
|
41
|
+
"rimraf": "^6.0.1",
|
|
42
|
+
"tsx": "^4.21.0",
|
|
43
|
+
"typescript": "^5.8.0",
|
|
44
|
+
"vitest": "^4.1.2"
|
|
45
|
+
},
|
|
46
|
+
"engines": {
|
|
47
|
+
"node": ">=20.0.0"
|
|
48
|
+
}
|
|
49
|
+
}
|