@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/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, DEFAULT_MEMORY_CONFIG, QueryOptions, QueryResult, RagResult, } from "./types";
6
+ export { Piece, MemoryConfig, QueryOptions, QueryResult, RagResult, } from "./types";
7
+ export { DEFAULT_MEMORY_CONFIG } from "./config";
6
8
  //# sourceMappingURL=index.d.ts.map
@@ -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,qBAAqB,EACrB,YAAY,EACZ,WAAW,EACX,SAAS,GACZ,MAAM,SAAS,CAAC"}
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 types_1 = require("./types");
13
- Object.defineProperty(exports, "DEFAULT_MEMORY_CONFIG", { enumerable: true, get: function () { return types_1.DEFAULT_MEMORY_CONFIG; } });
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;AACrB,iCAOiB;AAJb,8GAAA,qBAAqB,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
@@ -1,2 +1,3 @@
1
+ #!/usr/bin/env node
1
2
  export {};
2
3
  //# sourceMappingURL=main.d.ts.map
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 server_1 = require("./server");
4
- const PORT = process.env.PORT ?? 3000;
5
- const app = (0, server_1.createServer)();
6
- app.listen(PORT, () => {
7
- console.log(`Memory RAG server running on http://localhost:${PORT}`);
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":";;AAAA,qCAAwC;AAExC,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC;AACtC,MAAM,GAAG,GAAG,IAAA,qBAAY,GAAE,CAAC;AAC3B,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE;IAClB,OAAO,CAAC,GAAG,CAAC,iDAAiD,IAAI,EAAE,CAAC,CAAC;AACzE,CAAC,CAAC,CAAC"}
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
@@ -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;CAuC7E"}
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 helpful assistant. Answer the user's question based on the provided context. " +
27
- "If the context does not contain enough information, say so. " +
28
- "Cite sources by their number when relevant.";
29
- const userPrompt = `Context:\n${contextBlock}\n\nQuestion: ${query}`;
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;QACjD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAE7D,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,YAAY,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,OAAO,EAAE,CAC1E;aACA,IAAI,CAAC,MAAM,CAAC,CAAC;QAElB,MAAM,YAAY,GACd,yFAAyF;YACzF,8DAA8D;YAC9D,6CAA6C,CAAC;QAElD,MAAM,UAAU,GAAG,aAAa,YAAY,iBAAiB,KAAK,EAAE,CAAC;QAErE,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;AAlDD,kCAkDC"}
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"}
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAyB,MAAM,SAAS,CAAC;AAE9D,wBAAgB,YAAY,CAAC,MAAM,GAAE,YAAiB,+CAwHrD"}
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 types_1 = require("./types");
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 = { ...types_1.DEFAULT_MEMORY_CONFIG, ...config };
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
- const piece = await store.addPiece(content, tags ?? []);
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 piece = await store.getPiece(id);
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
- const piece = await store.updatePiece(id, content, tags);
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
- await store.deletePiece(id);
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
- const results = await store.queryPieces(query, { tags, topK });
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
- const result = await rag.query(query, { tags, topK });
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) {
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
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"}