@danielzfliu/memory 1.0.1 → 2.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 +361 -195
- package/dist/config.d.ts +4 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +47 -0
- package/dist/config.js.map +1 -0
- package/dist/http-main.d.ts +2 -0
- package/dist/http-main.d.ts.map +1 -0
- package/dist/http-main.js +9 -0
- package/dist/http-main.js.map +1 -0
- package/dist/hybrid.d.ts +8 -0
- package/dist/hybrid.d.ts.map +1 -0
- package/dist/hybrid.js +46 -0
- package/dist/hybrid.js.map +1 -0
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -3
- package/dist/index.js.map +1 -1
- package/dist/main.d.ts +1 -0
- package/dist/main.js +6 -5
- package/dist/main.js.map +1 -1
- package/dist/mcp.d.ts +20 -0
- package/dist/mcp.d.ts.map +1 -0
- package/dist/mcp.js +170 -0
- package/dist/mcp.js.map +1 -0
- package/dist/rag.d.ts +1 -1
- package/dist/rag.d.ts.map +1 -1
- package/dist/rag.js +14 -7
- package/dist/rag.js.map +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +109 -12
- package/dist/server.js.map +1 -1
- package/dist/store.d.ts +10 -7
- package/dist/store.d.ts.map +1 -1
- package/dist/store.js +149 -49
- package/dist/store.js.map +1 -1
- package/dist/types.d.ts +2 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +0 -8
- package/dist/types.js.map +1 -1
- package/package.json +74 -62
package/dist/hybrid.js
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// ── Hybrid search helpers ────────────────────────────────────────────────────
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.tokenize = tokenize;
|
|
5
|
+
exports.keywordScore = keywordScore;
|
|
6
|
+
exports.reciprocalRankFusion = reciprocalRankFusion;
|
|
7
|
+
const STOP_WORDS = new Set([
|
|
8
|
+
"a", "an", "the", "is", "are", "was", "were", "be", "been", "being",
|
|
9
|
+
"have", "has", "had", "do", "does", "did", "will", "would", "shall",
|
|
10
|
+
"should", "may", "might", "must", "can", "could", "of", "in", "to",
|
|
11
|
+
"for", "with", "on", "at", "from", "by", "as", "into", "about",
|
|
12
|
+
"it", "its", "this", "that", "and", "or", "but", "not", "no", "so",
|
|
13
|
+
]);
|
|
14
|
+
function tokenize(text) {
|
|
15
|
+
return text
|
|
16
|
+
.toLowerCase()
|
|
17
|
+
.split(/[^a-z0-9]+/)
|
|
18
|
+
.filter((t) => t.length > 1 && !STOP_WORDS.has(t));
|
|
19
|
+
}
|
|
20
|
+
function keywordScore(queryTokens, docText) {
|
|
21
|
+
if (queryTokens.length === 0)
|
|
22
|
+
return 0;
|
|
23
|
+
const docLower = docText.toLowerCase();
|
|
24
|
+
let matches = 0;
|
|
25
|
+
for (const token of queryTokens) {
|
|
26
|
+
if (docLower.includes(token))
|
|
27
|
+
matches++;
|
|
28
|
+
}
|
|
29
|
+
return matches / queryTokens.length;
|
|
30
|
+
}
|
|
31
|
+
function reciprocalRankFusion(rankings, idFn, k = 60) {
|
|
32
|
+
const scores = new Map();
|
|
33
|
+
const items = new Map();
|
|
34
|
+
for (const ranking of rankings) {
|
|
35
|
+
for (let rank = 0; rank < ranking.length; rank++) {
|
|
36
|
+
const id = idFn(ranking[rank].item);
|
|
37
|
+
scores.set(id, (scores.get(id) ?? 0) + 1 / (k + rank + 1));
|
|
38
|
+
if (!items.has(id))
|
|
39
|
+
items.set(id, ranking[rank].item);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
return Array.from(scores.entries())
|
|
43
|
+
.sort((a, b) => b[1] - a[1])
|
|
44
|
+
.map(([id, score]) => ({ item: items.get(id), score }));
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=hybrid.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hybrid.js","sourceRoot":"","sources":["../src/hybrid.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
export { PieceStore } from "./store";
|
|
2
2
|
export { RagPipeline } from "./rag";
|
|
3
3
|
export { EmbeddingClient } from "./embeddings";
|
|
4
|
+
export { MemoryMcpServer } from "./mcp";
|
|
4
5
|
export { createServer } from "./server";
|
|
5
|
-
export { Piece, MemoryConfig,
|
|
6
|
+
export { Piece, MemoryConfig, QueryOptions, QueryResult, RagResult, } from "./types";
|
|
7
|
+
export { DEFAULT_MEMORY_CONFIG } from "./config";
|
|
6
8
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AACpC,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AACxC,OAAO,EACH,KAAK,EACL,YAAY,EACZ,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AACpC,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,OAAO,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AACxC,OAAO,EACH,KAAK,EACL,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,SAAS,GACZ,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,14 +1,16 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.DEFAULT_MEMORY_CONFIG = exports.createServer = exports.EmbeddingClient = exports.RagPipeline = exports.PieceStore = void 0;
|
|
3
|
+
exports.DEFAULT_MEMORY_CONFIG = exports.createServer = exports.MemoryMcpServer = exports.EmbeddingClient = exports.RagPipeline = exports.PieceStore = void 0;
|
|
4
4
|
var store_1 = require("./store");
|
|
5
5
|
Object.defineProperty(exports, "PieceStore", { enumerable: true, get: function () { return store_1.PieceStore; } });
|
|
6
6
|
var rag_1 = require("./rag");
|
|
7
7
|
Object.defineProperty(exports, "RagPipeline", { enumerable: true, get: function () { return rag_1.RagPipeline; } });
|
|
8
8
|
var embeddings_1 = require("./embeddings");
|
|
9
9
|
Object.defineProperty(exports, "EmbeddingClient", { enumerable: true, get: function () { return embeddings_1.EmbeddingClient; } });
|
|
10
|
+
var mcp_1 = require("./mcp");
|
|
11
|
+
Object.defineProperty(exports, "MemoryMcpServer", { enumerable: true, get: function () { return mcp_1.MemoryMcpServer; } });
|
|
10
12
|
var server_1 = require("./server");
|
|
11
13
|
Object.defineProperty(exports, "createServer", { enumerable: true, get: function () { return server_1.createServer; } });
|
|
12
|
-
var
|
|
13
|
-
Object.defineProperty(exports, "DEFAULT_MEMORY_CONFIG", { enumerable: true, get: function () { return
|
|
14
|
+
var config_1 = require("./config");
|
|
15
|
+
Object.defineProperty(exports, "DEFAULT_MEMORY_CONFIG", { enumerable: true, get: function () { return config_1.DEFAULT_MEMORY_CONFIG; } });
|
|
14
16
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,iCAAqC;AAA5B,mGAAA,UAAU,OAAA;AACnB,6BAAoC;AAA3B,kGAAA,WAAW,OAAA;AACpB,2CAA+C;AAAtC,6GAAA,eAAe,OAAA;AACxB,mCAAwC;AAA/B,sGAAA,YAAY,OAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,iCAAqC;AAA5B,mGAAA,UAAU,OAAA;AACnB,6BAAoC;AAA3B,kGAAA,WAAW,OAAA;AACpB,2CAA+C;AAAtC,6GAAA,eAAe,OAAA;AACxB,6BAAwC;AAA/B,sGAAA,eAAe,OAAA;AACxB,mCAAwC;AAA/B,sGAAA,YAAY,OAAA;AAQrB,mCAAiD;AAAxC,+GAAA,qBAAqB,OAAA"}
|
package/dist/main.d.ts
CHANGED
package/dist/main.js
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
1
2
|
"use strict";
|
|
2
3
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const
|
|
4
|
-
const
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
4
|
+
const mcp_1 = require("./mcp");
|
|
5
|
+
const server = new mcp_1.MemoryMcpServer();
|
|
6
|
+
server.start().catch((err) => {
|
|
7
|
+
console.error("Failed to start MCP server:", err);
|
|
8
|
+
process.exit(1);
|
|
8
9
|
});
|
|
9
10
|
//# sourceMappingURL=main.js.map
|
package/dist/main.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":";;;AAEA,+BAAwC;AAExC,MAAM,MAAM,GAAG,IAAI,qBAAe,EAAE,CAAC;AACrC,MAAM,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACzB,OAAO,CAAC,KAAK,CAAC,6BAA6B,EAAE,GAAG,CAAC,CAAC;IAClD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACpB,CAAC,CAAC,CAAC"}
|
package/dist/mcp.d.ts
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { Transport } from "@modelcontextprotocol/sdk/shared/transport.js";
|
|
2
|
+
import { MemoryConfig } from "./types";
|
|
3
|
+
export declare class MemoryMcpServer {
|
|
4
|
+
private readonly mcpServer;
|
|
5
|
+
private readonly store;
|
|
6
|
+
private readonly rag;
|
|
7
|
+
private initPromise;
|
|
8
|
+
constructor(config?: MemoryConfig);
|
|
9
|
+
/**
|
|
10
|
+
* Start the server using the given transport (defaults to stdio).
|
|
11
|
+
*/
|
|
12
|
+
start(transport?: Transport): Promise<void>;
|
|
13
|
+
/**
|
|
14
|
+
* Shut down the server and its transport.
|
|
15
|
+
*/
|
|
16
|
+
close(): Promise<void>;
|
|
17
|
+
private ensureStoreInitialized;
|
|
18
|
+
private registerTools;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=mcp.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,SAAS,EAAE,MAAM,+CAA+C,CAAC;AAI1E,OAAO,EAAE,YAAY,EAAiC,MAAM,SAAS,CAAC;AAuBtE,qBAAa,eAAe;IACxB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAY;IACtC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAa;IACnC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAc;IAClC,OAAO,CAAC,WAAW,CAA8B;gBAErC,MAAM,GAAE,YAAiB;IAiBrC;;OAEG;IACG,KAAK,CAAC,SAAS,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAKjD;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;YAMd,sBAAsB;IAcpC,OAAO,CAAC,aAAa;CAwIxB"}
|
package/dist/mcp.js
ADDED
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.MemoryMcpServer = void 0;
|
|
7
|
+
const mcp_js_1 = require("@modelcontextprotocol/sdk/server/mcp.js");
|
|
8
|
+
const stdio_js_1 = require("@modelcontextprotocol/sdk/server/stdio.js");
|
|
9
|
+
const zod_1 = require("zod");
|
|
10
|
+
const store_1 = require("./store");
|
|
11
|
+
const rag_1 = require("./rag");
|
|
12
|
+
const config_1 = require("./config");
|
|
13
|
+
const package_json_1 = __importDefault(require("../package.json"));
|
|
14
|
+
// ──────────────────────────────────────────────────────────────────────────────
|
|
15
|
+
// Helpers
|
|
16
|
+
// ──────────────────────────────────────────────────────────────────────────────
|
|
17
|
+
function toJsonText(payload) {
|
|
18
|
+
return JSON.stringify(payload, null, 2);
|
|
19
|
+
}
|
|
20
|
+
function toolResult(payload, isError = false) {
|
|
21
|
+
return {
|
|
22
|
+
content: [{ type: "text", text: toJsonText(payload) }],
|
|
23
|
+
...(isError ? { isError: true } : {}),
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
// ──────────────────────────────────────────────────────────────────────────────
|
|
27
|
+
// MCP Server
|
|
28
|
+
// ──────────────────────────────────────────────────────────────────────────────
|
|
29
|
+
class MemoryMcpServer {
|
|
30
|
+
mcpServer;
|
|
31
|
+
store;
|
|
32
|
+
rag;
|
|
33
|
+
initPromise = null;
|
|
34
|
+
constructor(config = {}) {
|
|
35
|
+
const resolved = (0, config_1.resolveConfig)(config);
|
|
36
|
+
this.store = new store_1.PieceStore(resolved);
|
|
37
|
+
this.rag = new rag_1.RagPipeline(this.store, resolved.ollamaUrl, resolved.generationModel);
|
|
38
|
+
this.mcpServer = new mcp_js_1.McpServer({
|
|
39
|
+
name: "memory",
|
|
40
|
+
version: package_json_1.default.version,
|
|
41
|
+
});
|
|
42
|
+
this.registerTools();
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Start the server using the given transport (defaults to stdio).
|
|
46
|
+
*/
|
|
47
|
+
async start(transport) {
|
|
48
|
+
const t = transport ?? new stdio_js_1.StdioServerTransport();
|
|
49
|
+
await this.mcpServer.connect(t);
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Shut down the server and its transport.
|
|
53
|
+
*/
|
|
54
|
+
async close() {
|
|
55
|
+
await this.mcpServer.close();
|
|
56
|
+
}
|
|
57
|
+
// ── Store lifecycle ─────────────────────────────────────────────────────
|
|
58
|
+
async ensureStoreInitialized() {
|
|
59
|
+
if (!this.initPromise) {
|
|
60
|
+
this.initPromise = this.store.init();
|
|
61
|
+
}
|
|
62
|
+
try {
|
|
63
|
+
await this.initPromise;
|
|
64
|
+
}
|
|
65
|
+
catch (err) {
|
|
66
|
+
this.initPromise = null;
|
|
67
|
+
throw err;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
// ── Tool registration ───────────────────────────────────────────────────
|
|
71
|
+
registerTools() {
|
|
72
|
+
this.mcpServer.registerTool("add_piece", {
|
|
73
|
+
description: "Add a tagged text piece to the memory store.",
|
|
74
|
+
inputSchema: zod_1.z.object({
|
|
75
|
+
content: zod_1.z.string().describe("Piece content"),
|
|
76
|
+
title: zod_1.z.string().optional().describe("Optional title for display and retrieval context"),
|
|
77
|
+
tags: zod_1.z.array(zod_1.z.string()).optional().describe("Optional tags for filtering and retrieval"),
|
|
78
|
+
collection: zod_1.z.string().optional().describe("Optional collection name (defaults to the configured collection)"),
|
|
79
|
+
}),
|
|
80
|
+
}, async ({ content, title, tags, collection }) => {
|
|
81
|
+
await this.ensureStoreInitialized();
|
|
82
|
+
const piece = await this.store.addPiece(content, tags ?? [], title, collection);
|
|
83
|
+
return toolResult(piece);
|
|
84
|
+
});
|
|
85
|
+
this.mcpServer.registerTool("get_piece", {
|
|
86
|
+
description: "Get a piece by ID.",
|
|
87
|
+
inputSchema: zod_1.z.object({
|
|
88
|
+
id: zod_1.z.string().describe("Piece ID"),
|
|
89
|
+
collection: zod_1.z.string().optional().describe("Optional collection name (defaults to the configured collection)"),
|
|
90
|
+
}),
|
|
91
|
+
}, async ({ id, collection }) => {
|
|
92
|
+
await this.ensureStoreInitialized();
|
|
93
|
+
const piece = await this.store.getPiece(id, collection);
|
|
94
|
+
return toolResult({ found: !!piece, piece });
|
|
95
|
+
});
|
|
96
|
+
this.mcpServer.registerTool("update_piece", {
|
|
97
|
+
description: "Update a piece's content and/or tags.",
|
|
98
|
+
inputSchema: zod_1.z.object({
|
|
99
|
+
id: zod_1.z.string().describe("Piece ID"),
|
|
100
|
+
content: zod_1.z.string().optional().describe("New content (optional)"),
|
|
101
|
+
title: zod_1.z.union([zod_1.z.string(), zod_1.z.null()]).optional().describe("New title, or null to clear it (optional)"),
|
|
102
|
+
tags: zod_1.z.array(zod_1.z.string()).optional().describe("New tags (optional)"),
|
|
103
|
+
collection: zod_1.z.string().optional().describe("Optional collection name (defaults to the configured collection)"),
|
|
104
|
+
}),
|
|
105
|
+
}, async ({ id, content, title, tags, collection }) => {
|
|
106
|
+
await this.ensureStoreInitialized();
|
|
107
|
+
const piece = await this.store.updatePiece(id, content, tags, title, collection);
|
|
108
|
+
return toolResult({ found: !!piece, piece });
|
|
109
|
+
});
|
|
110
|
+
this.mcpServer.registerTool("delete_piece", {
|
|
111
|
+
description: "Delete a piece by ID.",
|
|
112
|
+
inputSchema: zod_1.z.object({
|
|
113
|
+
id: zod_1.z.string().describe("Piece ID"),
|
|
114
|
+
collection: zod_1.z.string().optional().describe("Optional collection name (defaults to the configured collection)"),
|
|
115
|
+
}),
|
|
116
|
+
}, async ({ id, collection }) => {
|
|
117
|
+
await this.ensureStoreInitialized();
|
|
118
|
+
await this.store.deletePiece(id, collection);
|
|
119
|
+
return toolResult({ deleted: true, id });
|
|
120
|
+
});
|
|
121
|
+
this.mcpServer.registerTool("query_pieces", {
|
|
122
|
+
description: "Run semantic search over pieces. Enable hybrid search to combine vector similarity with keyword matching via Reciprocal Rank Fusion.",
|
|
123
|
+
inputSchema: zod_1.z.object({
|
|
124
|
+
query: zod_1.z.string().describe("Semantic query text"),
|
|
125
|
+
tags: zod_1.z.array(zod_1.z.string()).optional().describe("Optional tag filter"),
|
|
126
|
+
topK: zod_1.z.number().int().positive().optional().describe("Maximum number of results (default: 10)"),
|
|
127
|
+
useHybridSearch: zod_1.z.boolean().optional().describe("Combine vector and keyword search via RRF (default: false)"),
|
|
128
|
+
collection: zod_1.z.string().optional().describe("Optional collection name (defaults to the configured collection)"),
|
|
129
|
+
}),
|
|
130
|
+
}, async ({ query, tags, topK, useHybridSearch, collection }) => {
|
|
131
|
+
await this.ensureStoreInitialized();
|
|
132
|
+
const results = await this.store.queryPieces(query, { tags, topK, useHybridSearch }, collection);
|
|
133
|
+
return toolResult(results);
|
|
134
|
+
});
|
|
135
|
+
this.mcpServer.registerTool("rag_query", {
|
|
136
|
+
description: "Run full RAG: retrieve relevant pieces and generate an answer.",
|
|
137
|
+
inputSchema: zod_1.z.object({
|
|
138
|
+
query: zod_1.z.string().describe("User question"),
|
|
139
|
+
tags: zod_1.z.array(zod_1.z.string()).optional().describe("Optional tag filter"),
|
|
140
|
+
topK: zod_1.z.number().int().positive().optional().describe("Maximum number of retrieved sources"),
|
|
141
|
+
useHybridSearch: zod_1.z.boolean().optional().describe("Combine vector and keyword search via RRF (default: false)"),
|
|
142
|
+
collection: zod_1.z.string().optional().describe("Optional collection name (defaults to the configured collection)"),
|
|
143
|
+
}),
|
|
144
|
+
}, async ({ query, tags, topK, useHybridSearch, collection }) => {
|
|
145
|
+
await this.ensureStoreInitialized();
|
|
146
|
+
const result = await this.rag.query(query, { tags, topK, useHybridSearch }, collection);
|
|
147
|
+
return toolResult(result);
|
|
148
|
+
});
|
|
149
|
+
this.mcpServer.registerTool("list_collections", {
|
|
150
|
+
description: "List all collection names in the memory store.",
|
|
151
|
+
inputSchema: zod_1.z.object({}),
|
|
152
|
+
}, async () => {
|
|
153
|
+
await this.ensureStoreInitialized();
|
|
154
|
+
const collections = await this.store.listCollections();
|
|
155
|
+
return toolResult({ collections });
|
|
156
|
+
});
|
|
157
|
+
this.mcpServer.registerTool("delete_collection", {
|
|
158
|
+
description: "Delete an entire collection and all its pieces from the memory store.",
|
|
159
|
+
inputSchema: zod_1.z.object({
|
|
160
|
+
collection: zod_1.z.string().describe("Name of the collection to delete"),
|
|
161
|
+
}),
|
|
162
|
+
}, async ({ collection }) => {
|
|
163
|
+
await this.ensureStoreInitialized();
|
|
164
|
+
await this.store.deleteCollection(collection);
|
|
165
|
+
return toolResult({ deleted: true, collection });
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
exports.MemoryMcpServer = MemoryMcpServer;
|
|
170
|
+
//# sourceMappingURL=mcp.js.map
|
package/dist/mcp.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp.js","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":"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"}
|
package/dist/rag.d.ts
CHANGED
|
@@ -5,6 +5,6 @@ export declare class RagPipeline {
|
|
|
5
5
|
private readonly ollama;
|
|
6
6
|
private readonly model;
|
|
7
7
|
constructor(store: PieceStore, ollamaUrl: string, model: string);
|
|
8
|
-
query(query: string, options?: QueryOptions): Promise<RagResult>;
|
|
8
|
+
query(query: string, options?: QueryOptions, collection?: string): Promise<RagResult>;
|
|
9
9
|
}
|
|
10
10
|
//# sourceMappingURL=rag.d.ts.map
|
package/dist/rag.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rag.d.ts","sourceRoot":"","sources":["../src/rag.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAElD,qBAAa,WAAW;IACpB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAa;IACnC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;gBAEnB,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;IAMzD,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,YAAiB,GAAG,OAAO,CAAC,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"rag.d.ts","sourceRoot":"","sources":["../src/rag.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAElD,qBAAa,WAAW;IACpB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAa;IACnC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;gBAEnB,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;IAMzD,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,YAAiB,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;CA+ClG"}
|
package/dist/rag.js
CHANGED
|
@@ -11,8 +11,8 @@ class RagPipeline {
|
|
|
11
11
|
this.ollama = new ollama_1.Ollama({ host: ollamaUrl });
|
|
12
12
|
this.model = model;
|
|
13
13
|
}
|
|
14
|
-
async query(query, options = {}) {
|
|
15
|
-
const sources = await this.store.queryPieces(query, options);
|
|
14
|
+
async query(query, options = {}, collection) {
|
|
15
|
+
const sources = await this.store.queryPieces(query, options, collection);
|
|
16
16
|
if (sources.length === 0) {
|
|
17
17
|
return {
|
|
18
18
|
answer: "I don't have enough context to answer this question. " +
|
|
@@ -21,12 +21,19 @@ class RagPipeline {
|
|
|
21
21
|
};
|
|
22
22
|
}
|
|
23
23
|
const contextBlock = sources
|
|
24
|
-
.map((s, i) => `[${i + 1}] (tags: ${s.piece.tags.join(", ")})\n${s.piece.content}`)
|
|
24
|
+
.map((s, i) => `[${i + 1}]${s.piece.title ? ` ${s.piece.title}` : ""} (tags: ${s.piece.tags.join(", ")})\n${s.piece.content}`)
|
|
25
25
|
.join("\n\n");
|
|
26
|
-
const systemPrompt = "You are a
|
|
27
|
-
"
|
|
28
|
-
"
|
|
29
|
-
|
|
26
|
+
const systemPrompt = "You are a retrieval-grounded assistant. Answer the user's question using only the provided context. " +
|
|
27
|
+
"Do not use outside knowledge, background assumptions, or examples that are not explicitly supported by the context. " +
|
|
28
|
+
"If the context is incomplete or does not answer the question, say that you do not have enough context instead of guessing. " +
|
|
29
|
+
"Keep the answer concise. Cite sources for every supported factual claim with source numbers like [1].";
|
|
30
|
+
const userPrompt = `Context:\n${contextBlock}\n\n` +
|
|
31
|
+
`Question: ${query}\n\n` +
|
|
32
|
+
"Instructions:\n" +
|
|
33
|
+
"- Use only the context above.\n" +
|
|
34
|
+
"- Do not mention tools, frameworks, companies, or facts that do not appear in the context.\n" +
|
|
35
|
+
"- If the context is insufficient, explicitly say so.\n" +
|
|
36
|
+
"- Cite supported statements with source numbers.";
|
|
30
37
|
const response = await this.ollama.chat({
|
|
31
38
|
model: this.model,
|
|
32
39
|
messages: [
|
package/dist/rag.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rag.js","sourceRoot":"","sources":["../src/rag.ts"],"names":[],"mappings":";;;AAAA,mCAAgC;AAIhC,MAAa,WAAW;IACH,KAAK,CAAa;IAClB,MAAM,CAAS;IACf,KAAK,CAAS;IAE/B,YAAY,KAAiB,EAAE,SAAiB,EAAE,KAAa;QAC3D,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,MAAM,GAAG,IAAI,eAAM,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;QAC9C,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,KAAa,EAAE,UAAwB,EAAE;
|
|
1
|
+
{"version":3,"file":"rag.js","sourceRoot":"","sources":["../src/rag.ts"],"names":[],"mappings":";;;AAAA,mCAAgC;AAIhC,MAAa,WAAW;IACH,KAAK,CAAa;IAClB,MAAM,CAAS;IACf,KAAK,CAAS;IAE/B,YAAY,KAAiB,EAAE,SAAiB,EAAE,KAAa;QAC3D,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,MAAM,GAAG,IAAI,eAAM,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;QAC9C,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,KAAa,EAAE,UAAwB,EAAE,EAAE,UAAmB;QACtE,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,KAAK,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;QAEzE,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,OAAO;gBACH,MAAM,EACF,uDAAuD;oBACvD,sDAAsD;gBAC1D,OAAO,EAAE,EAAE;aACd,CAAC;QACN,CAAC;QAED,MAAM,YAAY,GAAG,OAAO;aACvB,GAAG,CACA,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACL,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,OAAO,EAAE,CACrH;aACA,IAAI,CAAC,MAAM,CAAC,CAAC;QAElB,MAAM,YAAY,GACd,sGAAsG;YACtG,sHAAsH;YACtH,6HAA6H;YAC7H,uGAAuG,CAAC;QAE5G,MAAM,UAAU,GACZ,aAAa,YAAY,MAAM;YAC/B,aAAa,KAAK,MAAM;YACxB,iBAAiB;YACjB,iCAAiC;YACjC,8FAA8F;YAC9F,wDAAwD;YACxD,kDAAkD,CAAC;QAEvD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;YACpC,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,QAAQ,EAAE;gBACN,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,YAAY,EAAE;gBACzC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE;aACxC;SACJ,CAAC,CAAC;QAEH,OAAO;YACH,MAAM,EAAE,QAAQ,CAAC,OAAO,CAAC,OAAO;YAChC,OAAO;SACV,CAAC;IACN,CAAC;CACJ;AA1DD,kCA0DC"}
|
package/dist/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAiBvC,wBAAgB,YAAY,CAAC,MAAM,GAAE,YAAiB,+CA4MrD"}
|
package/dist/server.js
CHANGED
|
@@ -7,9 +7,22 @@ exports.createServer = createServer;
|
|
|
7
7
|
const express_1 = __importDefault(require("express"));
|
|
8
8
|
const store_1 = require("./store");
|
|
9
9
|
const rag_1 = require("./rag");
|
|
10
|
-
const
|
|
10
|
+
const config_1 = require("./config");
|
|
11
|
+
function isStringArray(value) {
|
|
12
|
+
return Array.isArray(value) && value.every((item) => typeof item === "string");
|
|
13
|
+
}
|
|
14
|
+
function isPositiveInteger(value) {
|
|
15
|
+
return Number.isInteger(value) && typeof value === "number" && value > 0;
|
|
16
|
+
}
|
|
17
|
+
function validateTitle(value, allowNull = false) {
|
|
18
|
+
if (value === undefined)
|
|
19
|
+
return undefined;
|
|
20
|
+
if (allowNull && value === null)
|
|
21
|
+
return null;
|
|
22
|
+
return typeof value === "string" ? value : undefined;
|
|
23
|
+
}
|
|
11
24
|
function createServer(config = {}) {
|
|
12
|
-
const resolvedConfig =
|
|
25
|
+
const resolvedConfig = (0, config_1.resolveConfig)(config);
|
|
13
26
|
const app = (0, express_1.default)();
|
|
14
27
|
app.use(express_1.default.json());
|
|
15
28
|
const store = new store_1.PieceStore(resolvedConfig);
|
|
@@ -34,15 +47,48 @@ function createServer(config = {}) {
|
|
|
34
47
|
}
|
|
35
48
|
next();
|
|
36
49
|
});
|
|
50
|
+
// GET /collections — List all collections
|
|
51
|
+
app.get("/collections", async (_req, res) => {
|
|
52
|
+
try {
|
|
53
|
+
const collections = await store.listCollections();
|
|
54
|
+
res.json({ collections });
|
|
55
|
+
}
|
|
56
|
+
catch (err) {
|
|
57
|
+
res.status(500).json({ error: String(err) });
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
// DELETE /collections/:name — Delete a collection
|
|
61
|
+
app.delete("/collections/:name", async (req, res) => {
|
|
62
|
+
try {
|
|
63
|
+
const { name } = req.params;
|
|
64
|
+
await store.deleteCollection(name);
|
|
65
|
+
res.status(204).send();
|
|
66
|
+
}
|
|
67
|
+
catch (err) {
|
|
68
|
+
res.status(500).json({ error: String(err) });
|
|
69
|
+
}
|
|
70
|
+
});
|
|
37
71
|
// POST /pieces — Add a piece
|
|
38
72
|
app.post("/pieces", async (req, res) => {
|
|
39
73
|
try {
|
|
40
|
-
const { content, tags } = req.body;
|
|
74
|
+
const { content, title, tags, collection } = req.body;
|
|
41
75
|
if (!content || typeof content !== "string") {
|
|
42
76
|
res.status(400).json({ error: "content (string) is required" });
|
|
43
77
|
return;
|
|
44
78
|
}
|
|
45
|
-
|
|
79
|
+
if (title !== undefined && typeof title !== "string") {
|
|
80
|
+
res.status(400).json({ error: "title must be a string when provided" });
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
if (tags !== undefined && !isStringArray(tags)) {
|
|
84
|
+
res.status(400).json({ error: "tags must be an array of strings when provided" });
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
if (collection !== undefined && typeof collection !== "string") {
|
|
88
|
+
res.status(400).json({ error: "collection must be a string when provided" });
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
const piece = await store.addPiece(content, tags ?? [], title, collection);
|
|
46
92
|
res.status(201).json(piece);
|
|
47
93
|
}
|
|
48
94
|
catch (err) {
|
|
@@ -53,7 +99,8 @@ function createServer(config = {}) {
|
|
|
53
99
|
app.get("/pieces/:id", async (req, res) => {
|
|
54
100
|
try {
|
|
55
101
|
const { id } = req.params;
|
|
56
|
-
const
|
|
102
|
+
const collection = typeof req.query.collection === "string" ? req.query.collection : undefined;
|
|
103
|
+
const piece = await store.getPiece(id, collection);
|
|
57
104
|
if (!piece) {
|
|
58
105
|
res.status(404).json({ error: "Piece not found" });
|
|
59
106
|
return;
|
|
@@ -68,8 +115,25 @@ function createServer(config = {}) {
|
|
|
68
115
|
app.put("/pieces/:id", async (req, res) => {
|
|
69
116
|
try {
|
|
70
117
|
const { id } = req.params;
|
|
71
|
-
const { content, tags } = req.body;
|
|
72
|
-
|
|
118
|
+
const { content, title, tags, collection } = req.body;
|
|
119
|
+
if (content !== undefined && typeof content !== "string") {
|
|
120
|
+
res.status(400).json({ error: "content must be a string when provided" });
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
const validatedTitle = validateTitle(title, true);
|
|
124
|
+
if (title !== undefined && validatedTitle === undefined) {
|
|
125
|
+
res.status(400).json({ error: "title must be a string or null when provided" });
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
if (tags !== undefined && !isStringArray(tags)) {
|
|
129
|
+
res.status(400).json({ error: "tags must be an array of strings when provided" });
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
if (collection !== undefined && typeof collection !== "string") {
|
|
133
|
+
res.status(400).json({ error: "collection must be a string when provided" });
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
const piece = await store.updatePiece(id, content, tags, validatedTitle, collection);
|
|
73
137
|
if (!piece) {
|
|
74
138
|
res.status(404).json({ error: "Piece not found" });
|
|
75
139
|
return;
|
|
@@ -84,7 +148,8 @@ function createServer(config = {}) {
|
|
|
84
148
|
app.delete("/pieces/:id", async (req, res) => {
|
|
85
149
|
try {
|
|
86
150
|
const { id } = req.params;
|
|
87
|
-
|
|
151
|
+
const collection = typeof req.query.collection === "string" ? req.query.collection : undefined;
|
|
152
|
+
await store.deletePiece(id, collection);
|
|
88
153
|
res.status(204).send();
|
|
89
154
|
}
|
|
90
155
|
catch (err) {
|
|
@@ -94,12 +159,28 @@ function createServer(config = {}) {
|
|
|
94
159
|
// POST /query — Semantic search
|
|
95
160
|
app.post("/query", async (req, res) => {
|
|
96
161
|
try {
|
|
97
|
-
const { query, tags, topK } = req.body;
|
|
162
|
+
const { query, tags, topK, useHybridSearch, collection } = req.body;
|
|
98
163
|
if (!query || typeof query !== "string") {
|
|
99
164
|
res.status(400).json({ error: "query (string) is required" });
|
|
100
165
|
return;
|
|
101
166
|
}
|
|
102
|
-
|
|
167
|
+
if (tags !== undefined && !isStringArray(tags)) {
|
|
168
|
+
res.status(400).json({ error: "tags must be an array of strings when provided" });
|
|
169
|
+
return;
|
|
170
|
+
}
|
|
171
|
+
if (topK !== undefined && !isPositiveInteger(topK)) {
|
|
172
|
+
res.status(400).json({ error: "topK must be a positive integer when provided" });
|
|
173
|
+
return;
|
|
174
|
+
}
|
|
175
|
+
if (useHybridSearch !== undefined && typeof useHybridSearch !== "boolean") {
|
|
176
|
+
res.status(400).json({ error: "useHybridSearch must be a boolean when provided" });
|
|
177
|
+
return;
|
|
178
|
+
}
|
|
179
|
+
if (collection !== undefined && typeof collection !== "string") {
|
|
180
|
+
res.status(400).json({ error: "collection must be a string when provided" });
|
|
181
|
+
return;
|
|
182
|
+
}
|
|
183
|
+
const results = await store.queryPieces(query, { tags, topK, useHybridSearch }, collection);
|
|
103
184
|
res.json(results);
|
|
104
185
|
}
|
|
105
186
|
catch (err) {
|
|
@@ -109,12 +190,28 @@ function createServer(config = {}) {
|
|
|
109
190
|
// POST /rag — Full RAG query
|
|
110
191
|
app.post("/rag", async (req, res) => {
|
|
111
192
|
try {
|
|
112
|
-
const { query, tags, topK } = req.body;
|
|
193
|
+
const { query, tags, topK, useHybridSearch, collection } = req.body;
|
|
113
194
|
if (!query || typeof query !== "string") {
|
|
114
195
|
res.status(400).json({ error: "query (string) is required" });
|
|
115
196
|
return;
|
|
116
197
|
}
|
|
117
|
-
|
|
198
|
+
if (tags !== undefined && !isStringArray(tags)) {
|
|
199
|
+
res.status(400).json({ error: "tags must be an array of strings when provided" });
|
|
200
|
+
return;
|
|
201
|
+
}
|
|
202
|
+
if (topK !== undefined && !isPositiveInteger(topK)) {
|
|
203
|
+
res.status(400).json({ error: "topK must be a positive integer when provided" });
|
|
204
|
+
return;
|
|
205
|
+
}
|
|
206
|
+
if (useHybridSearch !== undefined && typeof useHybridSearch !== "boolean") {
|
|
207
|
+
res.status(400).json({ error: "useHybridSearch must be a boolean when provided" });
|
|
208
|
+
return;
|
|
209
|
+
}
|
|
210
|
+
if (collection !== undefined && typeof collection !== "string") {
|
|
211
|
+
res.status(400).json({ error: "collection must be a string when provided" });
|
|
212
|
+
return;
|
|
213
|
+
}
|
|
214
|
+
const result = await rag.query(query, { tags, topK, useHybridSearch }, collection);
|
|
118
215
|
res.json(result);
|
|
119
216
|
}
|
|
120
217
|
catch (err) {
|
package/dist/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":";;;;;AAoBA,oCA4MC;AAhOD,sDAAqD;AACrD,mCAAqC;AACrC,+BAAoC;AAEpC,qCAAyC;AAEzC,SAAS,aAAa,CAAC,KAAc;IACjC,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC;AACnF,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAc;IACrC,OAAO,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,GAAG,CAAC,CAAC;AAC7E,CAAC;AAED,SAAS,aAAa,CAAC,KAAc,EAAE,SAAS,GAAG,KAAK;IACpD,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC1C,IAAI,SAAS,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAC7C,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AACzD,CAAC;AAED,SAAgB,YAAY,CAAC,SAAuB,EAAE;IAClD,MAAM,cAAc,GAAG,IAAA,sBAAa,EAAC,MAAM,CAAC,CAAC;IAC7C,MAAM,GAAG,GAAG,IAAA,iBAAO,GAAE,CAAC;IACtB,GAAG,CAAC,GAAG,CAAC,iBAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IAExB,MAAM,KAAK,GAAG,IAAI,kBAAU,CAAC,cAAc,CAAC,CAAC;IAC7C,MAAM,GAAG,GAAG,IAAI,iBAAW,CACvB,KAAK,EACL,cAAc,CAAC,SAAS,EACxB,cAAc,CAAC,eAAe,CACjC,CAAC;IAEF,sEAAsE;IACtE,sEAAsE;IACtE,IAAI,WAAW,GAAyB,IAAI,CAAC;IAC7C,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QAC9B,IAAI,CAAC,WAAW,EAAE,CAAC;YACf,WAAW,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;QAC/B,CAAC;QACD,IAAI,CAAC;YACD,MAAM,WAAW,CAAC;QACtB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACX,WAAW,GAAG,IAAI,CAAC,CAAC,8BAA8B;YAClD,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBACjB,KAAK,EAAE,+BAA+B;gBACtC,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC;aACvB,CAAC,CAAC;YACH,OAAO;QACX,CAAC;QACD,IAAI,EAAE,CAAC;IACX,CAAC,CAAC,CAAC;IAEH,0CAA0C;IAC1C,GAAG,CAAC,GAAG,CAAC,cAAc,EAAE,KAAK,EAAE,IAAa,EAAE,GAAa,EAAE,EAAE;QAC3D,IAAI,CAAC;YACD,MAAM,WAAW,GAAG,MAAM,KAAK,CAAC,eAAe,EAAE,CAAC;YAClD,GAAG,CAAC,IAAI,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC;QAC9B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACX,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACjD,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,kDAAkD;IAClD,GAAG,CAAC,MAAM,CAAC,oBAAoB,EAAE,KAAK,EAAE,GAA8B,EAAE,GAAa,EAAE,EAAE;QACrF,IAAI,CAAC;YACD,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC;YAC5B,MAAM,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;YACnC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;QAC3B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACX,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACjD,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,6BAA6B;IAC7B,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,GAAY,EAAE,GAAa,EAAE,EAAE;QACtD,IAAI,CAAC;YACD,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,GAAG,CAAC,IAAI,CAAC;YACtD,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;gBAC1C,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,8BAA8B,EAAE,CAAC,CAAC;gBAChE,OAAO;YACX,CAAC;YACD,IAAI,KAAK,KAAK,SAAS,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;gBACnD,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,sCAAsC,EAAE,CAAC,CAAC;gBACxE,OAAO;YACX,CAAC;YACD,IAAI,IAAI,KAAK,SAAS,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC7C,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,gDAAgD,EAAE,CAAC,CAAC;gBAClF,OAAO;YACX,CAAC;YACD,IAAI,UAAU,KAAK,SAAS,IAAI,OAAO,UAAU,KAAK,QAAQ,EAAE,CAAC;gBAC7D,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,2CAA2C,EAAE,CAAC,CAAC;gBAC7E,OAAO;YACX,CAAC;YACD,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC,OAAO,EAAE,IAAI,IAAI,EAAE,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC;YAC3E,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAChC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACX,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACjD,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,sCAAsC;IACtC,GAAG,CAAC,GAAG,CAAC,aAAa,EAAE,KAAK,EAAE,GAA4B,EAAE,GAAa,EAAE,EAAE;QACzE,IAAI,CAAC;YACD,MAAM,EAAE,EAAE,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC;YAC1B,MAAM,UAAU,GAAG,OAAO,GAAG,CAAC,KAAK,CAAC,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC;YAC/F,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;YACnD,IAAI,CAAC,KAAK,EAAE,CAAC;gBACT,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,iBAAiB,EAAE,CAAC,CAAC;gBACnD,OAAO;YACX,CAAC;YACD,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACpB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACX,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACjD,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,mCAAmC;IACnC,GAAG,CAAC,GAAG,CAAC,aAAa,EAAE,KAAK,EAAE,GAA4B,EAAE,GAAa,EAAE,EAAE;QACzE,IAAI,CAAC;YACD,MAAM,EAAE,EAAE,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC;YAC1B,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,GAAG,CAAC,IAAI,CAAC;YACtD,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;gBACvD,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,wCAAwC,EAAE,CAAC,CAAC;gBAC1E,OAAO;YACX,CAAC;YACD,MAAM,cAAc,GAAG,aAAa,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;YAClD,IAAI,KAAK,KAAK,SAAS,IAAI,cAAc,KAAK,SAAS,EAAE,CAAC;gBACtD,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,8CAA8C,EAAE,CAAC,CAAC;gBAChF,OAAO;YACX,CAAC;YACD,IAAI,IAAI,KAAK,SAAS,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC7C,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,gDAAgD,EAAE,CAAC,CAAC;gBAClF,OAAO;YACX,CAAC;YACD,IAAI,UAAU,KAAK,SAAS,IAAI,OAAO,UAAU,KAAK,QAAQ,EAAE,CAAC;gBAC7D,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,2CAA2C,EAAE,CAAC,CAAC;gBAC7E,OAAO;YACX,CAAC;YACD,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,WAAW,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,UAAU,CAAC,CAAC;YACrF,IAAI,CAAC,KAAK,EAAE,CAAC;gBACT,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,iBAAiB,EAAE,CAAC,CAAC;gBACnD,OAAO;YACX,CAAC;YACD,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACpB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACX,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACjD,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,sCAAsC;IACtC,GAAG,CAAC,MAAM,CAAC,aAAa,EAAE,KAAK,EAAE,GAA4B,EAAE,GAAa,EAAE,EAAE;QAC5E,IAAI,CAAC;YACD,MAAM,EAAE,EAAE,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC;YAC1B,MAAM,UAAU,GAAG,OAAO,GAAG,CAAC,KAAK,CAAC,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC;YAC/F,MAAM,KAAK,CAAC,WAAW,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;YACxC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;QAC3B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACX,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACjD,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,gCAAgC;IAChC,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,GAAY,EAAE,GAAa,EAAE,EAAE;QACrD,IAAI,CAAC;YACD,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,eAAe,EAAE,UAAU,EAAE,GAAG,GAAG,CAAC,IAAI,CAAC;YACpE,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;gBACtC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,4BAA4B,EAAE,CAAC,CAAC;gBAC9D,OAAO;YACX,CAAC;YACD,IAAI,IAAI,KAAK,SAAS,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC7C,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,gDAAgD,EAAE,CAAC,CAAC;gBAClF,OAAO;YACX,CAAC;YACD,IAAI,IAAI,KAAK,SAAS,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,EAAE,CAAC;gBACjD,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,+CAA+C,EAAE,CAAC,CAAC;gBACjF,OAAO;YACX,CAAC;YACD,IAAI,eAAe,KAAK,SAAS,IAAI,OAAO,eAAe,KAAK,SAAS,EAAE,CAAC;gBACxE,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,iDAAiD,EAAE,CAAC,CAAC;gBACnF,OAAO;YACX,CAAC;YACD,IAAI,UAAU,KAAK,SAAS,IAAI,OAAO,UAAU,KAAK,QAAQ,EAAE,CAAC;gBAC7D,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,2CAA2C,EAAE,CAAC,CAAC;gBAC7E,OAAO;YACX,CAAC;YACD,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,WAAW,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,eAAe,EAAE,EAAE,UAAU,CAAC,CAAC;YAC5F,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACtB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACX,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACjD,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,6BAA6B;IAC7B,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,GAAY,EAAE,GAAa,EAAE,EAAE;QACnD,IAAI,CAAC;YACD,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,eAAe,EAAE,UAAU,EAAE,GAAG,GAAG,CAAC,IAAI,CAAC;YACpE,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;gBACtC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,4BAA4B,EAAE,CAAC,CAAC;gBAC9D,OAAO;YACX,CAAC;YACD,IAAI,IAAI,KAAK,SAAS,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC7C,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,gDAAgD,EAAE,CAAC,CAAC;gBAClF,OAAO;YACX,CAAC;YACD,IAAI,IAAI,KAAK,SAAS,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,EAAE,CAAC;gBACjD,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,+CAA+C,EAAE,CAAC,CAAC;gBACjF,OAAO;YACX,CAAC;YACD,IAAI,eAAe,KAAK,SAAS,IAAI,OAAO,eAAe,KAAK,SAAS,EAAE,CAAC;gBACxE,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,iDAAiD,EAAE,CAAC,CAAC;gBACnF,OAAO;YACX,CAAC;YACD,IAAI,UAAU,KAAK,SAAS,IAAI,OAAO,UAAU,KAAK,QAAQ,EAAE,CAAC;gBAC7D,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,2CAA2C,EAAE,CAAC,CAAC;gBAC7E,OAAO;YACX,CAAC;YACD,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,eAAe,EAAE,EAAE,UAAU,CAAC,CAAC;YACnF,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACrB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACX,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACjD,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,OAAO,GAAG,CAAC;AACf,CAAC"}
|