mcpscraper-memory-db 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (104) hide show
  1. package/README.md +40 -0
  2. package/dist/db/chat-link.d.ts +7 -0
  3. package/dist/db/chat-link.js +50 -0
  4. package/dist/db/chat-link.js.map +1 -0
  5. package/dist/db/facts.d.ts +60 -0
  6. package/dist/db/facts.js +186 -0
  7. package/dist/db/facts.js.map +1 -0
  8. package/dist/db/interlink-state.d.ts +34 -0
  9. package/dist/db/interlink-state.js +42 -0
  10. package/dist/db/interlink-state.js.map +1 -0
  11. package/dist/db/keys.d.ts +44 -0
  12. package/dist/db/keys.js +118 -0
  13. package/dist/db/keys.js.map +1 -0
  14. package/dist/db/messages.d.ts +77 -0
  15. package/dist/db/messages.js +198 -0
  16. package/dist/db/messages.js.map +1 -0
  17. package/dist/db/notes.d.ts +109 -0
  18. package/dist/db/notes.js +249 -0
  19. package/dist/db/notes.js.map +1 -0
  20. package/dist/db/pool.d.ts +7 -0
  21. package/dist/db/pool.js +37 -0
  22. package/dist/db/pool.js.map +1 -0
  23. package/dist/db/presence.d.ts +4 -0
  24. package/dist/db/presence.js +25 -0
  25. package/dist/db/presence.js.map +1 -0
  26. package/dist/db/props-snapshots.d.ts +18 -0
  27. package/dist/db/props-snapshots.js +37 -0
  28. package/dist/db/props-snapshots.js.map +1 -0
  29. package/dist/db/provenance.d.ts +26 -0
  30. package/dist/db/provenance.js +43 -0
  31. package/dist/db/provenance.js.map +1 -0
  32. package/dist/db/schedule-entitlements.d.ts +24 -0
  33. package/dist/db/schedule-entitlements.js +70 -0
  34. package/dist/db/schedule-entitlements.js.map +1 -0
  35. package/dist/db/schedule-link.d.ts +7 -0
  36. package/dist/db/schedule-link.js +50 -0
  37. package/dist/db/schedule-link.js.map +1 -0
  38. package/dist/db/scheduled-actions.d.ts +58 -0
  39. package/dist/db/scheduled-actions.js +139 -0
  40. package/dist/db/scheduled-actions.js.map +1 -0
  41. package/dist/db/schema.d.ts +3 -0
  42. package/dist/db/schema.js +340 -0
  43. package/dist/db/schema.js.map +1 -0
  44. package/dist/db/secure-notes.d.ts +26 -0
  45. package/dist/db/secure-notes.js +59 -0
  46. package/dist/db/secure-notes.js.map +1 -0
  47. package/dist/db/shares.d.ts +45 -0
  48. package/dist/db/shares.js +141 -0
  49. package/dist/db/shares.js.map +1 -0
  50. package/dist/db/tables.d.ts +50 -0
  51. package/dist/db/tables.js +226 -0
  52. package/dist/db/tables.js.map +1 -0
  53. package/dist/db/trust.d.ts +10 -0
  54. package/dist/db/trust.js +88 -0
  55. package/dist/db/trust.js.map +1 -0
  56. package/dist/db/usage.d.ts +30 -0
  57. package/dist/db/usage.js +106 -0
  58. package/dist/db/usage.js.map +1 -0
  59. package/dist/db/vaults.d.ts +98 -0
  60. package/dist/db/vaults.js +316 -0
  61. package/dist/db/vaults.js.map +1 -0
  62. package/dist/db/video-runs.d.ts +70 -0
  63. package/dist/db/video-runs.js +176 -0
  64. package/dist/db/video-runs.js.map +1 -0
  65. package/dist/db/webhooks.d.ts +20 -0
  66. package/dist/db/webhooks.js +43 -0
  67. package/dist/db/webhooks.js.map +1 -0
  68. package/dist/lib/auth.d.ts +75 -0
  69. package/dist/lib/auth.js +248 -0
  70. package/dist/lib/auth.js.map +1 -0
  71. package/dist/lib/cost-rates.d.ts +19 -0
  72. package/dist/lib/cost-rates.js +36 -0
  73. package/dist/lib/cost-rates.js.map +1 -0
  74. package/dist/lib/credit-debit.d.ts +15 -0
  75. package/dist/lib/credit-debit.js +21 -0
  76. package/dist/lib/credit-debit.js.map +1 -0
  77. package/dist/lib/operator.d.ts +5 -0
  78. package/dist/lib/operator.js +14 -0
  79. package/dist/lib/operator.js.map +1 -0
  80. package/dist/lib/schedule-cadence.d.ts +6 -0
  81. package/dist/lib/schedule-cadence.js +66 -0
  82. package/dist/lib/schedule-cadence.js.map +1 -0
  83. package/dist/lib/secret-crypto.d.ts +4 -0
  84. package/dist/lib/secret-crypto.js +28 -0
  85. package/dist/lib/secret-crypto.js.map +1 -0
  86. package/dist/lib/vault-contracts.d.ts +18 -0
  87. package/dist/lib/vault-contracts.js +248 -0
  88. package/dist/lib/vault-contracts.js.map +1 -0
  89. package/dist/lib/video-reaper.d.ts +13 -0
  90. package/dist/lib/video-reaper.js +19 -0
  91. package/dist/lib/video-reaper.js.map +1 -0
  92. package/dist/rag/embedder.d.ts +6 -0
  93. package/dist/rag/embedder.js +93 -0
  94. package/dist/rag/embedder.js.map +1 -0
  95. package/dist/rag/index-pipeline.d.ts +22 -0
  96. package/dist/rag/index-pipeline.js +62 -0
  97. package/dist/rag/index-pipeline.js.map +1 -0
  98. package/dist/rag/query-tool.d.ts +47 -0
  99. package/dist/rag/query-tool.js +47 -0
  100. package/dist/rag/query-tool.js.map +1 -0
  101. package/dist/rag/vector-store.d.ts +7 -0
  102. package/dist/rag/vector-store.js +25 -0
  103. package/dist/rag/vector-store.js.map +1 -0
  104. package/package.json +47 -0
@@ -0,0 +1,93 @@
1
+ const EMBED_DIM = Number((process.env.JINA_EMBED_DIM ?? "1024").trim());
2
+ const modelId = (process.env.JINA_EMBED_MODEL ?? "jina-embeddings-v5-omni-small").trim();
3
+ const MAX_ATTEMPTS = 5;
4
+ function buildKeyPool() {
5
+ const env = process.env;
6
+ const keys = Array.from({ length: 5 }, (_, index) => {
7
+ const keyName = index === 0 ? "JINA_API_KEY" : `JINA_API_KEY_${index + 1}`;
8
+ return env[keyName]?.trim();
9
+ });
10
+ const pool = [];
11
+ for (let i = 0; i < keys.length; i++) {
12
+ const key = keys[i];
13
+ if (!key) continue;
14
+ const weight = i === 2 ? 5 : 1;
15
+ for (let w = 0; w < weight; w++) pool.push(key);
16
+ }
17
+ return pool;
18
+ }
19
+ let _pool = null;
20
+ function getKeyPool() {
21
+ if (!_pool) _pool = buildKeyPool();
22
+ return _pool;
23
+ }
24
+ let _keyIndex = 0;
25
+ function nextKey(pool) {
26
+ const key = pool[_keyIndex % pool.length];
27
+ _keyIndex++;
28
+ return key;
29
+ }
30
+ const jinaEmbedder = {
31
+ specificationVersion: "v2",
32
+ provider: "jina",
33
+ modelId,
34
+ maxEmbeddingsPerCall: 100,
35
+ supportsParallelCalls: false,
36
+ async doEmbed({ values, abortSignal, headers }) {
37
+ const pool = getKeyPool();
38
+ if (pool.length === 0) {
39
+ throw new Error("No JINA_API_KEY set (checked JINA_API_KEY through JINA_API_KEY_5)");
40
+ }
41
+ let lastError;
42
+ for (let attempt = 0; attempt < MAX_ATTEMPTS; attempt++) {
43
+ if (abortSignal?.aborted) {
44
+ throw abortSignal.reason instanceof Error ? abortSignal.reason : new DOMException("Aborted", "AbortError");
45
+ }
46
+ const apiKey = nextKey(pool);
47
+ const requestHeaders = {
48
+ "content-type": "application/json",
49
+ authorization: `Bearer ${apiKey}`
50
+ };
51
+ if (headers) {
52
+ for (const [key, value] of Object.entries(headers)) {
53
+ if (value !== void 0) requestHeaders[key] = value;
54
+ }
55
+ }
56
+ try {
57
+ const response = await fetch("https://api.jina.ai/v1/embeddings", {
58
+ method: "POST",
59
+ headers: requestHeaders,
60
+ body: JSON.stringify({
61
+ model: modelId,
62
+ input: values,
63
+ dimensions: EMBED_DIM,
64
+ task: "retrieval.passage"
65
+ }),
66
+ signal: abortSignal
67
+ });
68
+ if ((response.status === 429 || response.status === 524) && attempt < MAX_ATTEMPTS - 1) {
69
+ lastError = new Error(`Jina embeddings request failed: ${response.status} ${response.statusText}`);
70
+ continue;
71
+ }
72
+ if (!response.ok) {
73
+ throw new Error(`Jina embeddings request failed: ${response.status} ${response.statusText}`);
74
+ }
75
+ const data = await response.json();
76
+ return {
77
+ embeddings: data.data.map((d) => d.embedding),
78
+ usage: { tokens: data.usage?.total_tokens ?? 0 }
79
+ };
80
+ } catch (err) {
81
+ if (err instanceof Error && err.name === "AbortError") throw err;
82
+ lastError = err;
83
+ if (attempt < MAX_ATTEMPTS - 1) continue;
84
+ }
85
+ }
86
+ throw lastError instanceof Error ? lastError : new Error("Jina embeddings request failed after retries");
87
+ }
88
+ };
89
+ export {
90
+ EMBED_DIM,
91
+ jinaEmbedder
92
+ };
93
+ //# sourceMappingURL=embedder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/rag/embedder.ts"],"sourcesContent":["import type { EmbeddingModelV2 } from '@ai-sdk/provider'\n\nexport const EMBED_DIM = Number((process.env.JINA_EMBED_DIM ?? '1024').trim())\n\nconst modelId = (process.env.JINA_EMBED_MODEL ?? 'jina-embeddings-v5-omni-small').trim()\n\nconst MAX_ATTEMPTS = 5\n\ninterface JinaEmbeddingResponse {\n data: { embedding: number[] }[]\n usage?: { total_tokens?: number }\n}\n\nfunction buildKeyPool(): string[] {\n const env = process.env\n const keys = Array.from({ length: 5 }, (_, index) => {\n const keyName = index === 0 ? 'JINA_API_KEY' : `JINA_API_KEY_${index + 1}`\n return env[keyName]?.trim()\n })\n const pool: string[] = []\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i]\n if (!key) continue\n const weight = i === 2 ? 5 : 1\n for (let w = 0; w < weight; w++) pool.push(key)\n }\n return pool\n}\n\nlet _pool: string[] | null = null\nfunction getKeyPool(): string[] {\n if (!_pool) _pool = buildKeyPool()\n return _pool\n}\n\nlet _keyIndex = 0\nfunction nextKey(pool: string[]): string {\n const key = pool[_keyIndex % pool.length]\n _keyIndex++\n return key\n}\n\nexport const jinaEmbedder: EmbeddingModelV2<string> = {\n specificationVersion: 'v2',\n provider: 'jina',\n modelId,\n maxEmbeddingsPerCall: 100,\n supportsParallelCalls: false,\n async doEmbed({ values, abortSignal, headers }) {\n const pool = getKeyPool()\n if (pool.length === 0) {\n throw new Error('No JINA_API_KEY set (checked JINA_API_KEY through JINA_API_KEY_5)')\n }\n\n let lastError: unknown\n\n for (let attempt = 0; attempt < MAX_ATTEMPTS; attempt++) {\n if (abortSignal?.aborted) {\n throw abortSignal.reason instanceof Error ? abortSignal.reason : new DOMException('Aborted', 'AbortError')\n }\n\n const apiKey = nextKey(pool)\n const requestHeaders: Record<string, string> = {\n 'content-type': 'application/json',\n authorization: `Bearer ${apiKey}`,\n }\n if (headers) {\n for (const [key, value] of Object.entries(headers)) {\n if (value !== undefined) requestHeaders[key] = value\n }\n }\n\n try {\n const response = await fetch('https://api.jina.ai/v1/embeddings', {\n method: 'POST',\n headers: requestHeaders,\n body: JSON.stringify({\n model: modelId,\n input: values,\n dimensions: EMBED_DIM,\n task: 'retrieval.passage',\n }),\n signal: abortSignal,\n })\n\n if ((response.status === 429 || response.status === 524) && attempt < MAX_ATTEMPTS - 1) {\n lastError = new Error(`Jina embeddings request failed: ${response.status} ${response.statusText}`)\n continue\n }\n\n if (!response.ok) {\n throw new Error(`Jina embeddings request failed: ${response.status} ${response.statusText}`)\n }\n\n const data = (await response.json()) as JinaEmbeddingResponse\n\n return {\n embeddings: data.data.map((d) => d.embedding),\n usage: { tokens: data.usage?.total_tokens ?? 0 },\n }\n } catch (err) {\n if (err instanceof Error && err.name === 'AbortError') throw err\n lastError = err\n if (attempt < MAX_ATTEMPTS - 1) continue\n }\n }\n\n throw lastError instanceof Error ? lastError : new Error('Jina embeddings request failed after retries')\n },\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,22 @@
1
+ declare function indexDocument(args: {
2
+ vault: string;
3
+ id: string;
4
+ text: string;
5
+ source: string;
6
+ capturedAt?: string;
7
+ identity?: string;
8
+ op?: string;
9
+ }): Promise<{
10
+ chunks: number;
11
+ tokens: number;
12
+ costUsd: number;
13
+ }>;
14
+ declare function removeDocument(args: {
15
+ vault: string;
16
+ id: string;
17
+ }): Promise<void>;
18
+ declare function removeVaultVectors(args: {
19
+ vault: string;
20
+ }): Promise<void>;
21
+
22
+ export { indexDocument, removeDocument, removeVaultVectors };
@@ -0,0 +1,62 @@
1
+ import { MDocument } from "@mastra/rag";
2
+ import { embedMany } from "ai";
3
+ import { createHash } from "node:crypto";
4
+ import { jinaEmbedder } from "./embedder";
5
+ import { memoryVectors, INDEX_NAME, ensureIndex } from "./vector-store";
6
+ import { recordCost } from "../db/usage";
7
+ import { embedCostUsd } from "../lib/cost-rates";
8
+ async function indexDocument(args) {
9
+ await ensureIndex();
10
+ const doc = MDocument.fromText(args.text);
11
+ const chunks = await doc.chunk({ strategy: "recursive", maxSize: 512, overlap: 50 });
12
+ if (chunks.length === 0) {
13
+ return { chunks: 0, tokens: 0, costUsd: 0 };
14
+ }
15
+ const { embeddings, usage } = await embedMany({
16
+ model: jinaEmbedder,
17
+ values: chunks.map((c) => c.text)
18
+ });
19
+ const tokens = usage?.tokens ?? 0;
20
+ const costUsd = embedCostUsd(tokens);
21
+ if (args.identity) {
22
+ try {
23
+ await recordCost({ identity: args.identity, source: "embed", op: args.op ?? "index", tokens, costUsd, vault: args.vault });
24
+ } catch {
25
+ }
26
+ }
27
+ const chunkIds = chunks.map(
28
+ (_, i) => createHash("sha256").update(`${args.vault}::${args.id}::${i}`).digest("hex")
29
+ );
30
+ const capturedAt = args.capturedAt ?? (/* @__PURE__ */ new Date()).toISOString();
31
+ await memoryVectors.upsert({
32
+ indexName: INDEX_NAME,
33
+ vectors: embeddings,
34
+ ids: chunkIds,
35
+ metadata: chunks.map((c) => ({
36
+ text: c.text,
37
+ source: args.source,
38
+ vault: args.vault,
39
+ docId: args.id,
40
+ capturedAt
41
+ }))
42
+ });
43
+ return { chunks: chunks.length, tokens, costUsd };
44
+ }
45
+ async function removeDocument(args) {
46
+ await memoryVectors.deleteVectors({
47
+ indexName: INDEX_NAME,
48
+ filter: { vault: args.vault, docId: args.id }
49
+ });
50
+ }
51
+ async function removeVaultVectors(args) {
52
+ await memoryVectors.deleteVectors({
53
+ indexName: INDEX_NAME,
54
+ filter: { vault: args.vault }
55
+ });
56
+ }
57
+ export {
58
+ indexDocument,
59
+ removeDocument,
60
+ removeVaultVectors
61
+ };
62
+ //# sourceMappingURL=index-pipeline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/rag/index-pipeline.ts"],"sourcesContent":["import { MDocument } from '@mastra/rag'\nimport { embedMany } from 'ai'\nimport { createHash } from 'node:crypto'\nimport { jinaEmbedder } from './embedder'\nimport { memoryVectors, INDEX_NAME, ensureIndex } from './vector-store'\nimport { recordCost } from '../db/usage'\nimport { embedCostUsd } from '../lib/cost-rates'\n\nexport async function indexDocument(args: {\n vault: string\n id: string\n text: string\n source: string\n capturedAt?: string\n identity?: string\n op?: string\n}): Promise<{ chunks: number; tokens: number; costUsd: number }> {\n await ensureIndex()\n\n const doc = MDocument.fromText(args.text)\n const chunks = await doc.chunk({ strategy: 'recursive', maxSize: 512, overlap: 50 })\n\n if (chunks.length === 0) {\n return { chunks: 0, tokens: 0, costUsd: 0 }\n }\n\n const { embeddings, usage } = await embedMany({\n model: jinaEmbedder,\n values: chunks.map((c) => c.text),\n })\n\n const tokens = usage?.tokens ?? 0\n const costUsd = embedCostUsd(tokens)\n if (args.identity) {\n try {\n await recordCost({ identity: args.identity, source: 'embed', op: args.op ?? 'index', tokens, costUsd, vault: args.vault })\n } catch {\n void 0\n }\n }\n\n const chunkIds = chunks.map((_, i) =>\n createHash('sha256').update(`${args.vault}::${args.id}::${i}`).digest('hex'),\n )\n\n const capturedAt = args.capturedAt ?? new Date().toISOString()\n\n await memoryVectors.upsert({\n indexName: INDEX_NAME,\n vectors: embeddings,\n ids: chunkIds,\n metadata: chunks.map((c) => ({\n text: c.text,\n source: args.source,\n vault: args.vault,\n docId: args.id,\n capturedAt,\n })),\n })\n\n return { chunks: chunks.length, tokens, costUsd }\n}\n\nexport async function removeDocument(args: { vault: string; id: string }): Promise<void> {\n await memoryVectors.deleteVectors({\n indexName: INDEX_NAME,\n filter: { vault: args.vault, docId: args.id },\n })\n}\n\nexport async function removeVaultVectors(args: { vault: string }): Promise<void> {\n await memoryVectors.deleteVectors({\n indexName: INDEX_NAME,\n filter: { vault: args.vault },\n })\n}\n"],"mappings":"AAAA,SAAS,iBAAiB;AAC1B,SAAS,iBAAiB;AAC1B,SAAS,kBAAkB;AAC3B,SAAS,oBAAoB;AAC7B,SAAS,eAAe,YAAY,mBAAmB;AACvD,SAAS,kBAAkB;AAC3B,SAAS,oBAAoB;AAE7B,eAAsB,cAAc,MAQ6B;AAC/D,QAAM,YAAY;AAElB,QAAM,MAAM,UAAU,SAAS,KAAK,IAAI;AACxC,QAAM,SAAS,MAAM,IAAI,MAAM,EAAE,UAAU,aAAa,SAAS,KAAK,SAAS,GAAG,CAAC;AAEnF,MAAI,OAAO,WAAW,GAAG;AACvB,WAAO,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,EAAE;AAAA,EAC5C;AAEA,QAAM,EAAE,YAAY,MAAM,IAAI,MAAM,UAAU;AAAA,IAC5C,OAAO;AAAA,IACP,QAAQ,OAAO,IAAI,CAAC,MAAM,EAAE,IAAI;AAAA,EAClC,CAAC;AAED,QAAM,SAAS,OAAO,UAAU;AAChC,QAAM,UAAU,aAAa,MAAM;AACnC,MAAI,KAAK,UAAU;AACjB,QAAI;AACF,YAAM,WAAW,EAAE,UAAU,KAAK,UAAU,QAAQ,SAAS,IAAI,KAAK,MAAM,SAAS,QAAQ,SAAS,OAAO,KAAK,MAAM,CAAC;AAAA,IAC3H,QAAQ;AAAA,IAER;AAAA,EACF;AAEA,QAAM,WAAW,OAAO;AAAA,IAAI,CAAC,GAAG,MAC9B,WAAW,QAAQ,EAAE,OAAO,GAAG,KAAK,KAAK,KAAK,KAAK,EAAE,KAAK,CAAC,EAAE,EAAE,OAAO,KAAK;AAAA,EAC7E;AAEA,QAAM,aAAa,KAAK,eAAc,oBAAI,KAAK,GAAE,YAAY;AAE7D,QAAM,cAAc,OAAO;AAAA,IACzB,WAAW;AAAA,IACX,SAAS;AAAA,IACT,KAAK;AAAA,IACL,UAAU,OAAO,IAAI,CAAC,OAAO;AAAA,MAC3B,MAAM,EAAE;AAAA,MACR,QAAQ,KAAK;AAAA,MACb,OAAO,KAAK;AAAA,MACZ,OAAO,KAAK;AAAA,MACZ;AAAA,IACF,EAAE;AAAA,EACJ,CAAC;AAED,SAAO,EAAE,QAAQ,OAAO,QAAQ,QAAQ,QAAQ;AAClD;AAEA,eAAsB,eAAe,MAAoD;AACvF,QAAM,cAAc,cAAc;AAAA,IAChC,WAAW;AAAA,IACX,QAAQ,EAAE,OAAO,KAAK,OAAO,OAAO,KAAK,GAAG;AAAA,EAC9C,CAAC;AACH;AAEA,eAAsB,mBAAmB,MAAwC;AAC/E,QAAM,cAAc,cAAc;AAAA,IAChC,WAAW;AAAA,IACX,QAAQ,EAAE,OAAO,KAAK,MAAM;AAAA,EAC9B,CAAC;AACH;","names":[]}
@@ -0,0 +1,47 @@
1
+ import { RagTool } from './vector-search.js';
2
+
3
+ declare const vectorQueryTool: RagTool<{
4
+ queryText: string;
5
+ filter?: z.ZodCoercedString<unknown>;
6
+ topK?: z.ZodCoercedNumber<unknown>;
7
+ } | {
8
+ queryText: string;
9
+ topK?: z.ZodCoercedNumber<unknown>;
10
+ }, any>;
11
+ declare const graphQueryTool: RagTool<{
12
+ queryText: string;
13
+ filter?: z.ZodCoercedString<unknown>;
14
+ topK?: z.ZodCoercedNumber<unknown>;
15
+ } | {
16
+ queryText: string;
17
+ topK?: z.ZodCoercedNumber<unknown>;
18
+ }, any>;
19
+ declare function embedQuery(query: string): Promise<number[]>;
20
+ declare function queryWithEmbedding(args: {
21
+ embedding: number[];
22
+ vault: string | string[];
23
+ topK?: number;
24
+ docId?: string;
25
+ }): Promise<{
26
+ results: {
27
+ text: string;
28
+ source: string;
29
+ score: number;
30
+ vault?: string;
31
+ }[];
32
+ }>;
33
+ declare function semanticSearch(args: {
34
+ vault: string | string[];
35
+ query: string;
36
+ topK?: number;
37
+ docId?: string;
38
+ }): Promise<{
39
+ results: {
40
+ text: string;
41
+ source: string;
42
+ score: number;
43
+ vault?: string;
44
+ }[];
45
+ }>;
46
+
47
+ export { embedQuery, graphQueryTool, queryWithEmbedding, semanticSearch, vectorQueryTool };
@@ -0,0 +1,47 @@
1
+ import { createVectorQueryTool, createGraphRAGTool } from "@mastra/rag";
2
+ import { embed } from "ai";
3
+ import { jinaEmbedder } from "./embedder";
4
+ import { memoryVectors, INDEX_NAME } from "./vector-store";
5
+ const vectorQueryTool = createVectorQueryTool({
6
+ vectorStoreName: "memoryVectors",
7
+ indexName: INDEX_NAME,
8
+ model: jinaEmbedder
9
+ });
10
+ const graphQueryTool = createGraphRAGTool({
11
+ vectorStoreName: "memoryVectors",
12
+ indexName: INDEX_NAME,
13
+ model: jinaEmbedder,
14
+ graphOptions: { dimension: 1024 }
15
+ });
16
+ async function embedQuery(query) {
17
+ const { embedding } = await embed({ model: jinaEmbedder, value: query });
18
+ return embedding;
19
+ }
20
+ async function queryWithEmbedding(args) {
21
+ const vaultFilter = Array.isArray(args.vault) ? { $in: args.vault } : args.vault;
22
+ const hits = await memoryVectors.query({
23
+ indexName: INDEX_NAME,
24
+ queryVector: args.embedding,
25
+ topK: args.topK ?? 8,
26
+ filter: args.docId ? { vault: vaultFilter, docId: args.docId } : { vault: vaultFilter }
27
+ });
28
+ const results = hits.map((h) => ({
29
+ text: String(h.metadata?.text ?? ""),
30
+ source: String(h.metadata?.source ?? ""),
31
+ score: Number(h.score ?? 0),
32
+ vault: h.metadata?.vault ? String(h.metadata.vault) : void 0
33
+ }));
34
+ return { results };
35
+ }
36
+ async function semanticSearch(args) {
37
+ const embedding = await embedQuery(args.query);
38
+ return queryWithEmbedding({ embedding, vault: args.vault, topK: args.topK, docId: args.docId });
39
+ }
40
+ export {
41
+ embedQuery,
42
+ graphQueryTool,
43
+ queryWithEmbedding,
44
+ semanticSearch,
45
+ vectorQueryTool
46
+ };
47
+ //# sourceMappingURL=query-tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/rag/query-tool.ts"],"sourcesContent":["import { createVectorQueryTool, createGraphRAGTool } from '@mastra/rag'\nimport { embed } from 'ai'\nimport { jinaEmbedder } from './embedder'\nimport { memoryVectors, INDEX_NAME } from './vector-store'\n\nexport const vectorQueryTool = createVectorQueryTool({\n vectorStoreName: 'memoryVectors',\n indexName: INDEX_NAME,\n model: jinaEmbedder,\n})\n\nexport const graphQueryTool = createGraphRAGTool({\n vectorStoreName: 'memoryVectors',\n indexName: INDEX_NAME,\n model: jinaEmbedder,\n graphOptions: { dimension: 1024 },\n})\n\nexport async function embedQuery(query: string): Promise<number[]> {\n const { embedding } = await embed({ model: jinaEmbedder, value: query })\n return embedding\n}\n\nexport async function queryWithEmbedding(args: {\n embedding: number[]\n vault: string | string[]\n topK?: number\n docId?: string\n}): Promise<{ results: { text: string; source: string; score: number; vault?: string }[] }> {\n const vaultFilter = Array.isArray(args.vault) ? { $in: args.vault } : args.vault\n const hits = await memoryVectors.query({\n indexName: INDEX_NAME,\n queryVector: args.embedding,\n topK: args.topK ?? 8,\n filter: args.docId ? { vault: vaultFilter, docId: args.docId } : { vault: vaultFilter },\n })\n const results = hits.map((h) => ({\n text: String(h.metadata?.text ?? ''),\n source: String(h.metadata?.source ?? ''),\n score: Number(h.score ?? 0),\n vault: h.metadata?.vault ? String(h.metadata.vault) : undefined,\n }))\n return { results }\n}\n\nexport async function semanticSearch(args: {\n vault: string | string[]\n query: string\n topK?: number\n docId?: string\n}): Promise<{ results: { text: string; source: string; score: number; vault?: string }[] }> {\n const embedding = await embedQuery(args.query)\n return queryWithEmbedding({ embedding, vault: args.vault, topK: args.topK, docId: args.docId })\n}\n"],"mappings":"AAAA,SAAS,uBAAuB,0BAA0B;AAC1D,SAAS,aAAa;AACtB,SAAS,oBAAoB;AAC7B,SAAS,eAAe,kBAAkB;AAEnC,MAAM,kBAAkB,sBAAsB;AAAA,EACnD,iBAAiB;AAAA,EACjB,WAAW;AAAA,EACX,OAAO;AACT,CAAC;AAEM,MAAM,iBAAiB,mBAAmB;AAAA,EAC/C,iBAAiB;AAAA,EACjB,WAAW;AAAA,EACX,OAAO;AAAA,EACP,cAAc,EAAE,WAAW,KAAK;AAClC,CAAC;AAED,eAAsB,WAAW,OAAkC;AACjE,QAAM,EAAE,UAAU,IAAI,MAAM,MAAM,EAAE,OAAO,cAAc,OAAO,MAAM,CAAC;AACvE,SAAO;AACT;AAEA,eAAsB,mBAAmB,MAKmD;AAC1F,QAAM,cAAc,MAAM,QAAQ,KAAK,KAAK,IAAI,EAAE,KAAK,KAAK,MAAM,IAAI,KAAK;AAC3E,QAAM,OAAO,MAAM,cAAc,MAAM;AAAA,IACrC,WAAW;AAAA,IACX,aAAa,KAAK;AAAA,IAClB,MAAM,KAAK,QAAQ;AAAA,IACnB,QAAQ,KAAK,QAAQ,EAAE,OAAO,aAAa,OAAO,KAAK,MAAM,IAAI,EAAE,OAAO,YAAY;AAAA,EACxF,CAAC;AACD,QAAM,UAAU,KAAK,IAAI,CAAC,OAAO;AAAA,IAC/B,MAAM,OAAO,EAAE,UAAU,QAAQ,EAAE;AAAA,IACnC,QAAQ,OAAO,EAAE,UAAU,UAAU,EAAE;AAAA,IACvC,OAAO,OAAO,EAAE,SAAS,CAAC;AAAA,IAC1B,OAAO,EAAE,UAAU,QAAQ,OAAO,EAAE,SAAS,KAAK,IAAI;AAAA,EACxD,EAAE;AACF,SAAO,EAAE,QAAQ;AACnB;AAEA,eAAsB,eAAe,MAKuD;AAC1F,QAAM,YAAY,MAAM,WAAW,KAAK,KAAK;AAC7C,SAAO,mBAAmB,EAAE,WAAW,OAAO,KAAK,OAAO,MAAM,KAAK,MAAM,OAAO,KAAK,MAAM,CAAC;AAChG;","names":[]}
@@ -0,0 +1,7 @@
1
+ import { PgVector } from '@mastra/pg';
2
+
3
+ declare const INDEX_NAME = "memory";
4
+ declare const memoryVectors: PgVector;
5
+ declare function ensureIndex(): Promise<void>;
6
+
7
+ export { INDEX_NAME, ensureIndex, memoryVectors };
@@ -0,0 +1,25 @@
1
+ import { PgVector } from "@mastra/pg";
2
+ import { EMBED_DIM } from "./embedder";
3
+ const INDEX_NAME = "memory";
4
+ const memoryVectors = new PgVector({
5
+ id: "memoryVectors",
6
+ connectionString: process.env.DATABASE_URL ?? ""
7
+ });
8
+ async function ensureIndex() {
9
+ try {
10
+ await memoryVectors.createIndex({ indexName: INDEX_NAME, dimension: EMBED_DIM });
11
+ } catch (error) {
12
+ const message = error instanceof Error ? error.message : String(error);
13
+ const normalized = message.toLowerCase();
14
+ const alreadyExists = normalized.includes("already exists") || normalized.includes("duplicate");
15
+ if (!alreadyExists) {
16
+ throw error;
17
+ }
18
+ }
19
+ }
20
+ export {
21
+ INDEX_NAME,
22
+ ensureIndex,
23
+ memoryVectors
24
+ };
25
+ //# sourceMappingURL=vector-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/rag/vector-store.ts"],"sourcesContent":["import { PgVector } from '@mastra/pg';\nimport { EMBED_DIM } from './embedder';\n\nexport const INDEX_NAME = 'memory';\n\nexport const memoryVectors = new PgVector({\n id: 'memoryVectors',\n connectionString: process.env.DATABASE_URL ?? '',\n});\n\nexport async function ensureIndex(): Promise<void> {\n try {\n await memoryVectors.createIndex({ indexName: INDEX_NAME, dimension: EMBED_DIM });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n const normalized = message.toLowerCase();\n const alreadyExists =\n normalized.includes('already exists') || normalized.includes('duplicate');\n if (!alreadyExists) {\n throw error;\n }\n }\n}\n"],"mappings":"AAAA,SAAS,gBAAgB;AACzB,SAAS,iBAAiB;AAEnB,MAAM,aAAa;AAEnB,MAAM,gBAAgB,IAAI,SAAS;AAAA,EACxC,IAAI;AAAA,EACJ,kBAAkB,QAAQ,IAAI,gBAAgB;AAChD,CAAC;AAED,eAAsB,cAA6B;AACjD,MAAI;AACF,UAAM,cAAc,YAAY,EAAE,WAAW,YAAY,WAAW,UAAU,CAAC;AAAA,EACjF,SAAS,OAAO;AACd,UAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,UAAM,aAAa,QAAQ,YAAY;AACvC,UAAM,gBACJ,WAAW,SAAS,gBAAgB,KAAK,WAAW,SAAS,WAAW;AAC1E,QAAI,CAAC,eAAe;AAClB,YAAM;AAAA,IACR;AAAA,EACF;AACF;","names":[]}
package/package.json ADDED
@@ -0,0 +1,47 @@
1
+ {
2
+ "name": "mcpscraper-memory-db",
3
+ "version": "1.0.0",
4
+ "description": "Shared data-access layer for the mcpscraper memory product — Postgres db/*.ts, the auth/crypto/vault lib/*.ts modules it depends on, and the Jina/pgvector rag/*.ts indexing layer. Consumed by mcp-memory and mcp-scraper-scheduler so both stay on one implementation instead of hand-copied duplicates.",
5
+ "type": "module",
6
+ "license": "UNLICENSED",
7
+ "private": false,
8
+ "repository": {
9
+ "type": "git",
10
+ "url": "https://github.com/VilovietaSEO/mcpscraper-memory-db.git"
11
+ },
12
+ "exports": {
13
+ "./db/*": {
14
+ "types": "./dist/db/*.d.ts",
15
+ "import": "./dist/db/*.js"
16
+ },
17
+ "./lib/*": {
18
+ "types": "./dist/lib/*.d.ts",
19
+ "import": "./dist/lib/*.js"
20
+ },
21
+ "./rag/*": {
22
+ "types": "./dist/rag/*.d.ts",
23
+ "import": "./dist/rag/*.js"
24
+ }
25
+ },
26
+ "files": [
27
+ "dist"
28
+ ],
29
+ "scripts": {
30
+ "build": "tsup",
31
+ "typecheck": "tsc --noEmit"
32
+ },
33
+ "dependencies": {
34
+ "@ai-sdk/provider": "2.0.3",
35
+ "@mastra/pg": "latest",
36
+ "@mastra/rag": "latest",
37
+ "ai": "latest",
38
+ "jose": "^6.2.3",
39
+ "pg": "latest"
40
+ },
41
+ "devDependencies": {
42
+ "tsup": "^8.0.0",
43
+ "typescript": "^5.6.0",
44
+ "@types/node": "^22.0.0",
45
+ "@types/pg": "^8.11.0"
46
+ }
47
+ }