exovault-mcp-server 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.
- package/dist/auth.d.ts +41 -0
- package/dist/auth.d.ts.map +1 -0
- package/dist/auth.js +236 -0
- package/dist/auth.js.map +1 -0
- package/dist/auto-session.d.ts +39 -0
- package/dist/auto-session.d.ts.map +1 -0
- package/dist/auto-session.js +128 -0
- package/dist/auto-session.js.map +1 -0
- package/dist/buffer-persistence.d.ts +35 -0
- package/dist/buffer-persistence.d.ts.map +1 -0
- package/dist/buffer-persistence.js +110 -0
- package/dist/buffer-persistence.js.map +1 -0
- package/dist/coerce-params.d.ts +36 -0
- package/dist/coerce-params.d.ts.map +1 -0
- package/dist/coerce-params.js +120 -0
- package/dist/coerce-params.js.map +1 -0
- package/dist/crypto.d.ts +39 -0
- package/dist/crypto.d.ts.map +1 -0
- package/dist/crypto.js +119 -0
- package/dist/crypto.js.map +1 -0
- package/dist/db.d.ts +350 -0
- package/dist/db.d.ts.map +1 -0
- package/dist/db.js +866 -0
- package/dist/db.js.map +1 -0
- package/dist/embedding-config.d.ts +11 -0
- package/dist/embedding-config.d.ts.map +1 -0
- package/dist/embedding-config.js +24 -0
- package/dist/embedding-config.js.map +1 -0
- package/dist/entity-extraction.d.ts +22 -0
- package/dist/entity-extraction.d.ts.map +1 -0
- package/dist/entity-extraction.js +140 -0
- package/dist/entity-extraction.js.map +1 -0
- package/dist/episodic-headline.d.ts +6 -0
- package/dist/episodic-headline.d.ts.map +1 -0
- package/dist/episodic-headline.js +62 -0
- package/dist/episodic-headline.js.map +1 -0
- package/dist/error-sanitizer.d.ts +20 -0
- package/dist/error-sanitizer.d.ts.map +1 -0
- package/dist/error-sanitizer.js +54 -0
- package/dist/error-sanitizer.js.map +1 -0
- package/dist/extraction-budget.d.ts +39 -0
- package/dist/extraction-budget.d.ts.map +1 -0
- package/dist/extraction-budget.js +122 -0
- package/dist/extraction-budget.js.map +1 -0
- package/dist/extraction-llm.d.ts +22 -0
- package/dist/extraction-llm.d.ts.map +1 -0
- package/dist/extraction-llm.js +32 -0
- package/dist/extraction-llm.js.map +1 -0
- package/dist/extraction-prompt.d.ts +40 -0
- package/dist/extraction-prompt.d.ts.map +1 -0
- package/dist/extraction-prompt.js +176 -0
- package/dist/extraction-prompt.js.map +1 -0
- package/dist/gateway-client.d.ts +303 -0
- package/dist/gateway-client.d.ts.map +1 -0
- package/dist/gateway-client.js +285 -0
- package/dist/gateway-client.js.map +1 -0
- package/dist/gateway-init.d.ts +32 -0
- package/dist/gateway-init.d.ts.map +1 -0
- package/dist/gateway-init.js +71 -0
- package/dist/gateway-init.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +1242 -0
- package/dist/index.js.map +1 -0
- package/dist/infer-task-status.d.ts +7 -0
- package/dist/infer-task-status.d.ts.map +1 -0
- package/dist/infer-task-status.js +23 -0
- package/dist/infer-task-status.js.map +1 -0
- package/dist/normalize-agent-id.d.ts +21 -0
- package/dist/normalize-agent-id.d.ts.map +1 -0
- package/dist/normalize-agent-id.js +54 -0
- package/dist/normalize-agent-id.js.map +1 -0
- package/dist/openai.d.ts +14 -0
- package/dist/openai.d.ts.map +1 -0
- package/dist/openai.js +43 -0
- package/dist/openai.js.map +1 -0
- package/dist/rlm/actions.d.ts +31 -0
- package/dist/rlm/actions.d.ts.map +1 -0
- package/dist/rlm/actions.js +241 -0
- package/dist/rlm/actions.js.map +1 -0
- package/dist/rlm/benchmark.d.ts +2 -0
- package/dist/rlm/benchmark.d.ts.map +1 -0
- package/dist/rlm/benchmark.js +215 -0
- package/dist/rlm/benchmark.js.map +1 -0
- package/dist/rlm/execute.d.ts +13 -0
- package/dist/rlm/execute.d.ts.map +1 -0
- package/dist/rlm/execute.js +366 -0
- package/dist/rlm/execute.js.map +1 -0
- package/dist/rlm/index.d.ts +6 -0
- package/dist/rlm/index.d.ts.map +1 -0
- package/dist/rlm/index.js +147 -0
- package/dist/rlm/index.js.map +1 -0
- package/dist/rlm/profiles.d.ts +9 -0
- package/dist/rlm/profiles.d.ts.map +1 -0
- package/dist/rlm/profiles.js +46 -0
- package/dist/rlm/profiles.js.map +1 -0
- package/dist/rlm/types.d.ts +98 -0
- package/dist/rlm/types.d.ts.map +1 -0
- package/dist/rlm/types.js +6 -0
- package/dist/rlm/types.js.map +1 -0
- package/dist/rlm/verify.d.ts +13 -0
- package/dist/rlm/verify.d.ts.map +1 -0
- package/dist/rlm/verify.js +58 -0
- package/dist/rlm/verify.js.map +1 -0
- package/dist/rlm/writeback.d.ts +7 -0
- package/dist/rlm/writeback.d.ts.map +1 -0
- package/dist/rlm/writeback.js +77 -0
- package/dist/rlm/writeback.js.map +1 -0
- package/dist/scripts/backfill-memory-embeddings.d.ts +2 -0
- package/dist/scripts/backfill-memory-embeddings.d.ts.map +1 -0
- package/dist/scripts/backfill-memory-embeddings.js +153 -0
- package/dist/scripts/backfill-memory-embeddings.js.map +1 -0
- package/dist/session-buffer.d.ts +104 -0
- package/dist/session-buffer.d.ts.map +1 -0
- package/dist/session-buffer.js +466 -0
- package/dist/session-buffer.js.map +1 -0
- package/dist/session-dedup.d.ts +30 -0
- package/dist/session-dedup.d.ts.map +1 -0
- package/dist/session-dedup.js +67 -0
- package/dist/session-dedup.js.map +1 -0
- package/dist/session-flush.d.ts +81 -0
- package/dist/session-flush.d.ts.map +1 -0
- package/dist/session-flush.js +169 -0
- package/dist/session-flush.js.map +1 -0
- package/dist/session-lifecycle.d.ts +72 -0
- package/dist/session-lifecycle.d.ts.map +1 -0
- package/dist/session-lifecycle.js +247 -0
- package/dist/session-lifecycle.js.map +1 -0
- package/dist/setup.d.ts +2 -0
- package/dist/setup.d.ts.map +1 -0
- package/dist/setup.js +260 -0
- package/dist/setup.js.map +1 -0
- package/dist/stopwords.d.ts +2 -0
- package/dist/stopwords.d.ts.map +1 -0
- package/dist/stopwords.js +20 -0
- package/dist/stopwords.js.map +1 -0
- package/dist/strip-html.d.ts +5 -0
- package/dist/strip-html.d.ts.map +1 -0
- package/dist/strip-html.js +35 -0
- package/dist/strip-html.js.map +1 -0
- package/dist/task-completion-flush.d.ts +36 -0
- package/dist/task-completion-flush.d.ts.map +1 -0
- package/dist/task-completion-flush.js +97 -0
- package/dist/task-completion-flush.js.map +1 -0
- package/dist/task-lifecycle-types.d.ts +13 -0
- package/dist/task-lifecycle-types.d.ts.map +1 -0
- package/dist/task-lifecycle-types.js +12 -0
- package/dist/task-lifecycle-types.js.map +1 -0
- package/dist/task-lifecycle.d.ts +78 -0
- package/dist/task-lifecycle.d.ts.map +1 -0
- package/dist/task-lifecycle.js +256 -0
- package/dist/task-lifecycle.js.map +1 -0
- package/dist/tools/agent-messages.d.ts +26 -0
- package/dist/tools/agent-messages.d.ts.map +1 -0
- package/dist/tools/agent-messages.js +123 -0
- package/dist/tools/agent-messages.js.map +1 -0
- package/dist/tools/agent-tasks.d.ts +24 -0
- package/dist/tools/agent-tasks.d.ts.map +1 -0
- package/dist/tools/agent-tasks.js +162 -0
- package/dist/tools/agent-tasks.js.map +1 -0
- package/dist/tools/archive-memory.d.ts +2 -0
- package/dist/tools/archive-memory.d.ts.map +1 -0
- package/dist/tools/archive-memory.js +19 -0
- package/dist/tools/archive-memory.js.map +1 -0
- package/dist/tools/blind-index.d.ts +29 -0
- package/dist/tools/blind-index.d.ts.map +1 -0
- package/dist/tools/blind-index.js +53 -0
- package/dist/tools/blind-index.js.map +1 -0
- package/dist/tools/cleanup-memories.d.ts +44 -0
- package/dist/tools/cleanup-memories.d.ts.map +1 -0
- package/dist/tools/cleanup-memories.js +126 -0
- package/dist/tools/cleanup-memories.js.map +1 -0
- package/dist/tools/context-checkpoint.d.ts +28 -0
- package/dist/tools/context-checkpoint.d.ts.map +1 -0
- package/dist/tools/context-checkpoint.js +140 -0
- package/dist/tools/context-checkpoint.js.map +1 -0
- package/dist/tools/context-profiles.d.ts +67 -0
- package/dist/tools/context-profiles.d.ts.map +1 -0
- package/dist/tools/context-profiles.js +30 -0
- package/dist/tools/context-profiles.js.map +1 -0
- package/dist/tools/create-note.d.ts +2 -0
- package/dist/tools/create-note.d.ts.map +1 -0
- package/dist/tools/create-note.js +60 -0
- package/dist/tools/create-note.js.map +1 -0
- package/dist/tools/create-vault.d.ts +5 -0
- package/dist/tools/create-vault.d.ts.map +1 -0
- package/dist/tools/create-vault.js +121 -0
- package/dist/tools/create-vault.js.map +1 -0
- package/dist/tools/decrypt-helpers.d.ts +31 -0
- package/dist/tools/decrypt-helpers.d.ts.map +1 -0
- package/dist/tools/decrypt-helpers.js +33 -0
- package/dist/tools/decrypt-helpers.js.map +1 -0
- package/dist/tools/delete-note.d.ts +2 -0
- package/dist/tools/delete-note.d.ts.map +1 -0
- package/dist/tools/delete-note.js +21 -0
- package/dist/tools/delete-note.js.map +1 -0
- package/dist/tools/explore-graph.d.ts +11 -0
- package/dist/tools/explore-graph.d.ts.map +1 -0
- package/dist/tools/explore-graph.js +169 -0
- package/dist/tools/explore-graph.js.map +1 -0
- package/dist/tools/get-related-memories.d.ts +2 -0
- package/dist/tools/get-related-memories.d.ts.map +1 -0
- package/dist/tools/get-related-memories.js +59 -0
- package/dist/tools/get-related-memories.js.map +1 -0
- package/dist/tools/knowledge-links.d.ts +17 -0
- package/dist/tools/knowledge-links.d.ts.map +1 -0
- package/dist/tools/knowledge-links.js +102 -0
- package/dist/tools/knowledge-links.js.map +1 -0
- package/dist/tools/list-active-agents.d.ts +5 -0
- package/dist/tools/list-active-agents.d.ts.map +1 -0
- package/dist/tools/list-active-agents.js +15 -0
- package/dist/tools/list-active-agents.js.map +1 -0
- package/dist/tools/list-notes.d.ts +2 -0
- package/dist/tools/list-notes.d.ts.map +1 -0
- package/dist/tools/list-notes.js +19 -0
- package/dist/tools/list-notes.js.map +1 -0
- package/dist/tools/list-vaults.d.ts +2 -0
- package/dist/tools/list-vaults.d.ts.map +1 -0
- package/dist/tools/list-vaults.js +19 -0
- package/dist/tools/list-vaults.js.map +1 -0
- package/dist/tools/mmr.d.ts +18 -0
- package/dist/tools/mmr.d.ts.map +1 -0
- package/dist/tools/mmr.js +67 -0
- package/dist/tools/mmr.js.map +1 -0
- package/dist/tools/read-memories.d.ts +2 -0
- package/dist/tools/read-memories.d.ts.map +1 -0
- package/dist/tools/read-memories.js +46 -0
- package/dist/tools/read-memories.js.map +1 -0
- package/dist/tools/read-note.d.ts +2 -0
- package/dist/tools/read-note.d.ts.map +1 -0
- package/dist/tools/read-note.js +35 -0
- package/dist/tools/read-note.js.map +1 -0
- package/dist/tools/read-notes.d.ts +6 -0
- package/dist/tools/read-notes.d.ts.map +1 -0
- package/dist/tools/read-notes.js +45 -0
- package/dist/tools/read-notes.js.map +1 -0
- package/dist/tools/resolve-vault-id.d.ts +6 -0
- package/dist/tools/resolve-vault-id.d.ts.map +1 -0
- package/dist/tools/resolve-vault-id.js +7 -0
- package/dist/tools/resolve-vault-id.js.map +1 -0
- package/dist/tools/rrf.d.ts +28 -0
- package/dist/tools/rrf.d.ts.map +1 -0
- package/dist/tools/rrf.js +19 -0
- package/dist/tools/rrf.js.map +1 -0
- package/dist/tools/search-and-read.d.ts +11 -0
- package/dist/tools/search-and-read.d.ts.map +1 -0
- package/dist/tools/search-and-read.js +208 -0
- package/dist/tools/search-and-read.js.map +1 -0
- package/dist/tools/search-memories.d.ts +13 -0
- package/dist/tools/search-memories.d.ts.map +1 -0
- package/dist/tools/search-memories.js +272 -0
- package/dist/tools/search-memories.js.map +1 -0
- package/dist/tools/search-notes.d.ts +2 -0
- package/dist/tools/search-notes.d.ts.map +1 -0
- package/dist/tools/search-notes.js +94 -0
- package/dist/tools/search-notes.js.map +1 -0
- package/dist/tools/semantic-search.d.ts +7 -0
- package/dist/tools/semantic-search.d.ts.map +1 -0
- package/dist/tools/semantic-search.js +85 -0
- package/dist/tools/semantic-search.js.map +1 -0
- package/dist/tools/session-start.d.ts +24 -0
- package/dist/tools/session-start.d.ts.map +1 -0
- package/dist/tools/session-start.js +256 -0
- package/dist/tools/session-start.js.map +1 -0
- package/dist/tools/stale-tasks.d.ts +22 -0
- package/dist/tools/stale-tasks.d.ts.map +1 -0
- package/dist/tools/stale-tasks.js +39 -0
- package/dist/tools/stale-tasks.js.map +1 -0
- package/dist/tools/temporal-decay.d.ts +21 -0
- package/dist/tools/temporal-decay.d.ts.map +1 -0
- package/dist/tools/temporal-decay.js +32 -0
- package/dist/tools/temporal-decay.js.map +1 -0
- package/dist/tools/update-memory.d.ts +19 -0
- package/dist/tools/update-memory.d.ts.map +1 -0
- package/dist/tools/update-memory.js +230 -0
- package/dist/tools/update-memory.js.map +1 -0
- package/dist/tools/update-note.d.ts +2 -0
- package/dist/tools/update-note.d.ts.map +1 -0
- package/dist/tools/update-note.js +79 -0
- package/dist/tools/update-note.js.map +1 -0
- package/dist/tools/vault-instruction-template.d.ts +17 -0
- package/dist/tools/vault-instruction-template.d.ts.map +1 -0
- package/dist/tools/vault-instruction-template.js +77 -0
- package/dist/tools/vault-instruction-template.js.map +1 -0
- package/dist/tools/wiki-link-sync.d.ts +34 -0
- package/dist/tools/wiki-link-sync.d.ts.map +1 -0
- package/dist/tools/wiki-link-sync.js +132 -0
- package/dist/tools/wiki-link-sync.js.map +1 -0
- package/dist/tools/wrap-tool-handler.d.ts +8 -0
- package/dist/tools/wrap-tool-handler.d.ts.map +1 -0
- package/dist/tools/wrap-tool-handler.js +32 -0
- package/dist/tools/wrap-tool-handler.js.map +1 -0
- package/dist/tools/write-memory.d.ts +34 -0
- package/dist/tools/write-memory.d.ts.map +1 -0
- package/dist/tools/write-memory.js +359 -0
- package/dist/tools/write-memory.js.map +1 -0
- package/dist/usage.d.ts +11 -0
- package/dist/usage.d.ts.map +1 -0
- package/dist/usage.js +38 -0
- package/dist/usage.js.map +1 -0
- package/dist/wiki-link-parser.d.ts +27 -0
- package/dist/wiki-link-parser.d.ts.map +1 -0
- package/dist/wiki-link-parser.js +93 -0
- package/dist/wiki-link-parser.js.map +1 -0
- package/package.json +38 -0
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { decrypt, encrypt } from "../crypto.js";
|
|
2
|
+
import { insertKnowledgeLink, deleteKnowledgeLink, getLinksForNode, } from "../db.js";
|
|
3
|
+
import { logMcpUsageEvent } from "../usage.js";
|
|
4
|
+
async function decryptLinkLabel(link, masterKey) {
|
|
5
|
+
if (!link.encrypted_label || !link.label_iv)
|
|
6
|
+
return null;
|
|
7
|
+
try {
|
|
8
|
+
return await decrypt(link.encrypted_label, link.label_iv, masterKey);
|
|
9
|
+
}
|
|
10
|
+
catch {
|
|
11
|
+
return null;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
function formatLink(link, label) {
|
|
15
|
+
return {
|
|
16
|
+
id: link.id,
|
|
17
|
+
sourceType: link.source_type,
|
|
18
|
+
sourceId: link.source_id,
|
|
19
|
+
targetType: link.target_type,
|
|
20
|
+
targetId: link.target_id,
|
|
21
|
+
relationType: link.relation_type,
|
|
22
|
+
label,
|
|
23
|
+
isPending: link.is_pending,
|
|
24
|
+
createdAt: link.created_at,
|
|
25
|
+
createdBy: link.created_by,
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
export async function getLinks(ctx, input) {
|
|
29
|
+
const links = await getLinksForNode(ctx.supabase, ctx.userId, input.nodeType, input.nodeId, { direction: input.direction ?? "both", limit: input.limit ?? 50 });
|
|
30
|
+
const results = await Promise.all(links.map(async (link) => {
|
|
31
|
+
const label = await decryptLinkLabel(link, ctx.masterKey);
|
|
32
|
+
return formatLink(link, label);
|
|
33
|
+
}));
|
|
34
|
+
const payload = JSON.stringify({
|
|
35
|
+
nodeType: input.nodeType,
|
|
36
|
+
nodeId: input.nodeId,
|
|
37
|
+
direction: input.direction ?? "both",
|
|
38
|
+
links: results,
|
|
39
|
+
}, null, 2);
|
|
40
|
+
await logMcpUsageEvent({
|
|
41
|
+
supabase: ctx.supabase,
|
|
42
|
+
userId: ctx.userId,
|
|
43
|
+
operationType: "mcp_get_links",
|
|
44
|
+
outputText: payload,
|
|
45
|
+
});
|
|
46
|
+
return payload;
|
|
47
|
+
}
|
|
48
|
+
const VALID_RELATION_TYPES = new Set([
|
|
49
|
+
"wiki_link", "derived_from", "contradicts", "refines",
|
|
50
|
+
"part_of", "supersedes", "source_of", "references", "manual",
|
|
51
|
+
]);
|
|
52
|
+
export async function addLink(ctx, input) {
|
|
53
|
+
if (!VALID_RELATION_TYPES.has(input.relationType)) {
|
|
54
|
+
throw new Error(`Invalid relationType "${input.relationType}". Valid types: ${Array.from(VALID_RELATION_TYPES).join(", ")}`);
|
|
55
|
+
}
|
|
56
|
+
// Encrypt label if provided
|
|
57
|
+
let encryptedLabel = null;
|
|
58
|
+
let labelIv = null;
|
|
59
|
+
if (input.label) {
|
|
60
|
+
const enc = await encrypt(input.label, ctx.masterKey);
|
|
61
|
+
encryptedLabel = enc.ciphertext;
|
|
62
|
+
labelIv = enc.iv;
|
|
63
|
+
}
|
|
64
|
+
const link = await insertKnowledgeLink(ctx.supabase, {
|
|
65
|
+
user_id: ctx.userId,
|
|
66
|
+
source_type: input.sourceType,
|
|
67
|
+
source_id: input.sourceId,
|
|
68
|
+
target_type: input.targetType,
|
|
69
|
+
target_id: input.targetId,
|
|
70
|
+
relation_type: input.relationType,
|
|
71
|
+
encrypted_label: encryptedLabel,
|
|
72
|
+
label_iv: labelIv,
|
|
73
|
+
created_by: "agent",
|
|
74
|
+
});
|
|
75
|
+
const payload = JSON.stringify({
|
|
76
|
+
linkId: link.id,
|
|
77
|
+
created: true,
|
|
78
|
+
sourceType: link.source_type,
|
|
79
|
+
sourceId: link.source_id,
|
|
80
|
+
targetType: link.target_type,
|
|
81
|
+
targetId: link.target_id,
|
|
82
|
+
relationType: link.relation_type,
|
|
83
|
+
});
|
|
84
|
+
await logMcpUsageEvent({
|
|
85
|
+
supabase: ctx.supabase,
|
|
86
|
+
userId: ctx.userId,
|
|
87
|
+
operationType: "mcp_add_link",
|
|
88
|
+
outputText: payload,
|
|
89
|
+
});
|
|
90
|
+
return payload;
|
|
91
|
+
}
|
|
92
|
+
export async function removeLink(ctx, linkId) {
|
|
93
|
+
await deleteKnowledgeLink(ctx.supabase, linkId, ctx.userId);
|
|
94
|
+
const payload = JSON.stringify({ linkId, deleted: true });
|
|
95
|
+
await logMcpUsageEvent({
|
|
96
|
+
supabase: ctx.supabase,
|
|
97
|
+
userId: ctx.userId,
|
|
98
|
+
operationType: "mcp_remove_link",
|
|
99
|
+
outputText: payload,
|
|
100
|
+
});
|
|
101
|
+
return payload;
|
|
102
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"knowledge-links.js","sourceRoot":"","sources":["../../src/tools/knowledge-links.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-active-agents.d.ts","sourceRoot":"","sources":["../../src/tools/list-active-agents.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAI7C,wBAAsB,gBAAgB,CACpC,GAAG,EAAE,UAAU,EACf,OAAO,CAAC,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAC/C,OAAO,CAAC,MAAM,CAAC,CAgBjB"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { getActiveAgents } from "../db.js";
|
|
2
|
+
import { logMcpUsageEvent } from "../usage.js";
|
|
3
|
+
export async function listActiveAgents(ctx, options) {
|
|
4
|
+
const sinceDays = options?.sinceDays ?? 30;
|
|
5
|
+
const limit = options?.limit ?? 20;
|
|
6
|
+
const agents = await getActiveAgents(ctx.supabase, ctx.userId, sinceDays, limit);
|
|
7
|
+
const payload = JSON.stringify({ agents, sinceDays });
|
|
8
|
+
await logMcpUsageEvent({
|
|
9
|
+
supabase: ctx.supabase,
|
|
10
|
+
userId: ctx.userId,
|
|
11
|
+
operationType: "mcp_list_active_agents",
|
|
12
|
+
outputText: payload,
|
|
13
|
+
});
|
|
14
|
+
return payload;
|
|
15
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-active-agents.js","sourceRoot":"","sources":["../../src/tools/list-active-agents.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAC3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE/C,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,GAAe,EACf,OAAgD;IAEhD,MAAM,SAAS,GAAG,OAAO,EAAE,SAAS,IAAI,EAAE,CAAC;IAC3C,MAAM,KAAK,GAAG,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC;IAEnC,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;IAEjF,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;IAEtD,MAAM,gBAAgB,CAAC;QACrB,QAAQ,EAAE,GAAG,CAAC,QAAQ;QACtB,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,aAAa,EAAE,wBAAwB;QACvC,UAAU,EAAE,OAAO;KACpB,CAAC,CAAC;IAEH,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-notes.d.ts","sourceRoot":"","sources":["../../src/tools/list-notes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAK7C,wBAAsB,SAAS,CAC7B,GAAG,EAAE,UAAU,EACf,OAAO,CAAC,EAAE,MAAM,EAChB,KAAK,SAAK,GACT,OAAO,CAAC,MAAM,CAAC,CAoBjB"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { getNotes } from "../db.js";
|
|
2
|
+
import { stripHtml } from "../strip-html.js";
|
|
3
|
+
import { decryptNoteFields } from "./decrypt-helpers.js";
|
|
4
|
+
export async function listNotes(ctx, vaultId, limit = 20) {
|
|
5
|
+
const notes = await getNotes(ctx.supabase, ctx.userId, vaultId, limit);
|
|
6
|
+
const results = await Promise.all(notes.map(async (n) => {
|
|
7
|
+
const { title, content, tags } = await decryptNoteFields(n, ctx.masterKey);
|
|
8
|
+
const preview = stripHtml(content).slice(0, 200);
|
|
9
|
+
return {
|
|
10
|
+
id: n.id,
|
|
11
|
+
title,
|
|
12
|
+
tags,
|
|
13
|
+
preview,
|
|
14
|
+
vaultId: n.vault_id,
|
|
15
|
+
updatedAt: n.updated_at,
|
|
16
|
+
};
|
|
17
|
+
}));
|
|
18
|
+
return JSON.stringify(results, null, 2);
|
|
19
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-notes.js","sourceRoot":"","sources":["../../src/tools/list-notes.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AACpC,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAEzD,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,GAAe,EACf,OAAgB,EAChB,KAAK,GAAG,EAAE;IAEV,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;IAEvE,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAC/B,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE;QACpB,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,MAAM,iBAAiB,CAAC,CAAC,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC;QAC3E,MAAM,OAAO,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QAEjD,OAAO;YACL,EAAE,EAAE,CAAC,CAAC,EAAE;YACR,KAAK;YACL,IAAI;YACJ,OAAO;YACP,OAAO,EAAE,CAAC,CAAC,QAAQ;YACnB,SAAS,EAAE,CAAC,CAAC,UAAU;SACxB,CAAC;IACJ,CAAC,CAAC,CACH,CAAC;IAEF,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AAC1C,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-vaults.d.ts","sourceRoot":"","sources":["../../src/tools/list-vaults.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAI7C,wBAAsB,UAAU,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAoBjE"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { getVaults, countNotesByVault } from "../db.js";
|
|
2
|
+
import { decrypt } from "../crypto.js";
|
|
3
|
+
export async function listVaults(ctx) {
|
|
4
|
+
const [vaults, noteCounts] = await Promise.all([
|
|
5
|
+
getVaults(ctx.supabase, ctx.userId),
|
|
6
|
+
countNotesByVault(ctx.supabase, ctx.userId),
|
|
7
|
+
]);
|
|
8
|
+
const results = await Promise.all(vaults.map(async (v) => {
|
|
9
|
+
const name = await decrypt(v.encrypted_name, v.name_iv, ctx.masterKey);
|
|
10
|
+
return {
|
|
11
|
+
id: v.id,
|
|
12
|
+
name,
|
|
13
|
+
icon: v.icon,
|
|
14
|
+
color: v.color,
|
|
15
|
+
noteCount: noteCounts[v.id] ?? 0,
|
|
16
|
+
};
|
|
17
|
+
}));
|
|
18
|
+
return JSON.stringify(results, null, 2);
|
|
19
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-vaults.js","sourceRoot":"","sources":["../../src/tools/list-vaults.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AACxD,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,GAAe;IAC9C,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QAC7C,SAAS,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC;QACnC,iBAAiB,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC;KAC5C,CAAC,CAAC;IAEH,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAC/B,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE;QACrB,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,CAAC,CAAC,cAAc,EAAE,CAAC,CAAC,OAAO,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC;QACvE,OAAO;YACL,EAAE,EAAE,CAAC,CAAC,EAAE;YACR,IAAI;YACJ,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,KAAK,EAAE,CAAC,CAAC,KAAK;YACd,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC;SACjC,CAAC;IACJ,CAAC,CAAC,CACH,CAAC;IAEF,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AAC1C,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Maximal Marginal Relevance (MMR) re-ranking (MCP server copy).
|
|
3
|
+
*
|
|
4
|
+
* Keep in sync with src/lib/search/mmr.ts in the Next.js app.
|
|
5
|
+
*
|
|
6
|
+
* MMR(d) = λ × relevance(d) − (1−λ) × max(sim(d, selected))
|
|
7
|
+
*/
|
|
8
|
+
export interface MMRCandidate {
|
|
9
|
+
id: string;
|
|
10
|
+
relevanceScore: number;
|
|
11
|
+
embedding: number[] | null;
|
|
12
|
+
}
|
|
13
|
+
export interface MMRResult {
|
|
14
|
+
id: string;
|
|
15
|
+
score: number;
|
|
16
|
+
}
|
|
17
|
+
export declare function cosineSimilarity(a: number[], b: number[]): number;
|
|
18
|
+
export declare function selectMMR(candidates: MMRCandidate[], k: number, lambda?: number): MMRResult[];
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mmr.d.ts","sourceRoot":"","sources":["../../src/tools/mmr.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;CAC5B;AAED,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAiBjE;AAED,wBAAgB,SAAS,CACvB,UAAU,EAAE,YAAY,EAAE,EAC1B,CAAC,EAAE,MAAM,EACT,MAAM,SAAM,GACX,SAAS,EAAE,CAiDb"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Maximal Marginal Relevance (MMR) re-ranking (MCP server copy).
|
|
3
|
+
*
|
|
4
|
+
* Keep in sync with src/lib/search/mmr.ts in the Next.js app.
|
|
5
|
+
*
|
|
6
|
+
* MMR(d) = λ × relevance(d) − (1−λ) × max(sim(d, selected))
|
|
7
|
+
*/
|
|
8
|
+
export function cosineSimilarity(a, b) {
|
|
9
|
+
if (a.length !== b.length || a.length === 0)
|
|
10
|
+
return 0;
|
|
11
|
+
let dot = 0;
|
|
12
|
+
let magA = 0;
|
|
13
|
+
let magB = 0;
|
|
14
|
+
for (let i = 0; i < a.length; i++) {
|
|
15
|
+
dot += a[i] * b[i];
|
|
16
|
+
magA += a[i] * a[i];
|
|
17
|
+
magB += b[i] * b[i];
|
|
18
|
+
}
|
|
19
|
+
const denom = Math.sqrt(magA) * Math.sqrt(magB);
|
|
20
|
+
if (denom === 0)
|
|
21
|
+
return 0;
|
|
22
|
+
return dot / denom;
|
|
23
|
+
}
|
|
24
|
+
export function selectMMR(candidates, k, lambda = 0.7) {
|
|
25
|
+
if (candidates.length === 0)
|
|
26
|
+
return [];
|
|
27
|
+
const selected = [];
|
|
28
|
+
const remaining = new Set(candidates.map((_, i) => i));
|
|
29
|
+
let bestIdx = 0;
|
|
30
|
+
for (const idx of remaining) {
|
|
31
|
+
if (candidates[idx].relevanceScore > candidates[bestIdx].relevanceScore) {
|
|
32
|
+
bestIdx = idx;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
selected.push({ id: candidates[bestIdx].id, score: candidates[bestIdx].relevanceScore });
|
|
36
|
+
remaining.delete(bestIdx);
|
|
37
|
+
while (selected.length < k && remaining.size > 0) {
|
|
38
|
+
let bestMMRScore = -Infinity;
|
|
39
|
+
let bestMMRIdx = -1;
|
|
40
|
+
for (const idx of remaining) {
|
|
41
|
+
const candidate = candidates[idx];
|
|
42
|
+
const relevanceTerm = lambda * candidate.relevanceScore;
|
|
43
|
+
let maxSim = 0;
|
|
44
|
+
if (candidate.embedding !== null) {
|
|
45
|
+
for (const sel of selected) {
|
|
46
|
+
const selCandidate = candidates.find((c) => c.id === sel.id);
|
|
47
|
+
if (selCandidate?.embedding !== null && selCandidate?.embedding !== undefined) {
|
|
48
|
+
const sim = cosineSimilarity(candidate.embedding, selCandidate.embedding);
|
|
49
|
+
if (sim > maxSim)
|
|
50
|
+
maxSim = sim;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
const diversityPenalty = (1 - lambda) * maxSim;
|
|
55
|
+
const mmrScore = relevanceTerm - diversityPenalty;
|
|
56
|
+
if (mmrScore > bestMMRScore) {
|
|
57
|
+
bestMMRScore = mmrScore;
|
|
58
|
+
bestMMRIdx = idx;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
if (bestMMRIdx === -1)
|
|
62
|
+
break;
|
|
63
|
+
selected.push({ id: candidates[bestMMRIdx].id, score: bestMMRScore });
|
|
64
|
+
remaining.delete(bestMMRIdx);
|
|
65
|
+
}
|
|
66
|
+
return selected;
|
|
67
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mmr.js","sourceRoot":"","sources":["../../src/tools/mmr.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"read-memories.d.ts","sourceRoot":"","sources":["../../src/tools/read-memories.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAK7C,wBAAsB,YAAY,CAChC,GAAG,EAAE,UAAU,EACf,SAAS,EAAE,MAAM,EAAE,GAClB,OAAO,CAAC,MAAM,CAAC,CAiDjB"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { getMemoriesByIds, touchMemories } from "../db.js";
|
|
2
|
+
import { logMcpUsageEvent } from "../usage.js";
|
|
3
|
+
import { decryptMemoryFields } from "./decrypt-helpers.js";
|
|
4
|
+
export async function readMemories(ctx, memoryIds) {
|
|
5
|
+
const memories = await getMemoriesByIds(ctx.supabase, ctx.userId, memoryIds);
|
|
6
|
+
const foundIds = new Set(memories.map((m) => m.id));
|
|
7
|
+
const notFound = memoryIds.filter((id) => !foundIds.has(id));
|
|
8
|
+
const decrypted = await Promise.all(memories.map(async (m) => {
|
|
9
|
+
const { content, summary } = await decryptMemoryFields(m, ctx.masterKey);
|
|
10
|
+
return {
|
|
11
|
+
id: m.id,
|
|
12
|
+
memoryType: m.memory_type,
|
|
13
|
+
content,
|
|
14
|
+
summary,
|
|
15
|
+
vaultId: m.vault_id,
|
|
16
|
+
agentId: m.agent_id,
|
|
17
|
+
modelId: m.model_id,
|
|
18
|
+
agentRunId: m.agent_run_id,
|
|
19
|
+
writeReason: m.write_reason,
|
|
20
|
+
externalWriteId: m.external_write_id,
|
|
21
|
+
importance: m.importance,
|
|
22
|
+
confidence: m.confidence,
|
|
23
|
+
indexingStatus: m.indexing_status,
|
|
24
|
+
metadata: m.metadata,
|
|
25
|
+
relatedMemoryIds: m.related_memory_ids,
|
|
26
|
+
sourceNoteIds: m.source_note_ids,
|
|
27
|
+
supersededById: m.superseded_by_id,
|
|
28
|
+
entities: m.entities,
|
|
29
|
+
accessCount: m.access_count,
|
|
30
|
+
lastAccessedAt: m.last_accessed_at,
|
|
31
|
+
createdAt: m.created_at,
|
|
32
|
+
updatedAt: m.updated_at,
|
|
33
|
+
};
|
|
34
|
+
}));
|
|
35
|
+
// Track access (fire-and-forget)
|
|
36
|
+
const foundMemoryIds = memories.map((m) => m.id);
|
|
37
|
+
touchMemories(ctx.supabase, ctx.userId, foundMemoryIds);
|
|
38
|
+
const payload = JSON.stringify({ memories: decrypted, notFound }, null, 2);
|
|
39
|
+
await logMcpUsageEvent({
|
|
40
|
+
supabase: ctx.supabase,
|
|
41
|
+
userId: ctx.userId,
|
|
42
|
+
operationType: "mcp_read_memories",
|
|
43
|
+
outputText: payload,
|
|
44
|
+
});
|
|
45
|
+
return payload;
|
|
46
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"read-memories.js","sourceRoot":"","sources":["../../src/tools/read-memories.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAE3D,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,GAAe,EACf,SAAmB;IAEnB,MAAM,QAAQ,GAAG,MAAM,gBAAgB,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAC7E,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACpD,MAAM,QAAQ,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IAE7D,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,GAAG,CACjC,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE;QACvB,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,MAAM,mBAAmB,CAAC,CAAC,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC;QAEzE,OAAO;YACL,EAAE,EAAE,CAAC,CAAC,EAAE;YACR,UAAU,EAAE,CAAC,CAAC,WAAW;YACzB,OAAO;YACP,OAAO;YACP,OAAO,EAAE,CAAC,CAAC,QAAQ;YACnB,OAAO,EAAE,CAAC,CAAC,QAAQ;YACnB,OAAO,EAAE,CAAC,CAAC,QAAQ;YACnB,UAAU,EAAE,CAAC,CAAC,YAAY;YAC1B,WAAW,EAAE,CAAC,CAAC,YAAY;YAC3B,eAAe,EAAE,CAAC,CAAC,iBAAiB;YACpC,UAAU,EAAE,CAAC,CAAC,UAAU;YACxB,UAAU,EAAE,CAAC,CAAC,UAAU;YACxB,cAAc,EAAE,CAAC,CAAC,eAAe;YACjC,QAAQ,EAAE,CAAC,CAAC,QAAQ;YACpB,gBAAgB,EAAE,CAAC,CAAC,kBAAkB;YACtC,aAAa,EAAE,CAAC,CAAC,eAAe;YAChC,cAAc,EAAE,CAAC,CAAC,gBAAgB;YAClC,QAAQ,EAAE,CAAC,CAAC,QAAQ;YACpB,WAAW,EAAE,CAAC,CAAC,YAAY;YAC3B,cAAc,EAAE,CAAC,CAAC,gBAAgB;YAClC,SAAS,EAAE,CAAC,CAAC,UAAU;YACvB,SAAS,EAAE,CAAC,CAAC,UAAU;SACxB,CAAC;IACJ,CAAC,CAAC,CACH,CAAC;IAEF,iCAAiC;IACjC,MAAM,cAAc,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACjD,aAAa,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IAExD,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAC3E,MAAM,gBAAgB,CAAC;QACrB,QAAQ,EAAE,GAAG,CAAC,QAAQ;QACtB,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,aAAa,EAAE,mBAAmB;QAClC,UAAU,EAAE,OAAO;KACpB,CAAC,CAAC;IAEH,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"read-note.d.ts","sourceRoot":"","sources":["../../src/tools/read-note.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAM7C,wBAAsB,QAAQ,CAC5B,GAAG,EAAE,UAAU,EACf,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,MAAM,CAAC,CAuCjB"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { getNote, getVault } from "../db.js";
|
|
2
|
+
import { decrypt } from "../crypto.js";
|
|
3
|
+
import { logMcpUsageEvent } from "../usage.js";
|
|
4
|
+
import { decryptNoteFields } from "./decrypt-helpers.js";
|
|
5
|
+
export async function readNote(ctx, noteId) {
|
|
6
|
+
const note = await getNote(ctx.supabase, ctx.userId, noteId);
|
|
7
|
+
if (!note) {
|
|
8
|
+
return JSON.stringify({ error: "Note not found" });
|
|
9
|
+
}
|
|
10
|
+
const { title, content, tags } = await decryptNoteFields(note, ctx.masterKey);
|
|
11
|
+
// Fetch vault name for context
|
|
12
|
+
let vaultName = "";
|
|
13
|
+
const vault = await getVault(ctx.supabase, ctx.userId, note.vault_id);
|
|
14
|
+
if (vault) {
|
|
15
|
+
vaultName = await decrypt(vault.encrypted_name, vault.name_iv, ctx.masterKey);
|
|
16
|
+
}
|
|
17
|
+
const payload = JSON.stringify({
|
|
18
|
+
id: note.id,
|
|
19
|
+
title,
|
|
20
|
+
content,
|
|
21
|
+
tags,
|
|
22
|
+
vaultName,
|
|
23
|
+
vaultId: note.vault_id,
|
|
24
|
+
createdAt: note.created_at,
|
|
25
|
+
updatedAt: note.updated_at,
|
|
26
|
+
}, null, 2);
|
|
27
|
+
await logMcpUsageEvent({
|
|
28
|
+
supabase: ctx.supabase,
|
|
29
|
+
userId: ctx.userId,
|
|
30
|
+
vaultId: note.vault_id,
|
|
31
|
+
operationType: "mcp_read_note",
|
|
32
|
+
outputText: payload,
|
|
33
|
+
});
|
|
34
|
+
return payload;
|
|
35
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"read-note.js","sourceRoot":"","sources":["../../src/tools/read-note.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAEzD,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC5B,GAAe,EACf,MAAc;IAEd,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7D,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,gBAAgB,EAAE,CAAC,CAAC;IACrD,CAAC;IAED,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,MAAM,iBAAiB,CAAC,IAAI,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC;IAE9E,+BAA+B;IAC/B,IAAI,SAAS,GAAG,EAAE,CAAC;IACnB,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;IACtE,IAAI,KAAK,EAAE,CAAC;QACV,SAAS,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,OAAO,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC;IAChF,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAC5B;QACE,EAAE,EAAE,IAAI,CAAC,EAAE;QACX,KAAK;QACL,OAAO;QACP,IAAI;QACJ,SAAS;QACT,OAAO,EAAE,IAAI,CAAC,QAAQ;QACtB,SAAS,EAAE,IAAI,CAAC,UAAU;QAC1B,SAAS,EAAE,IAAI,CAAC,UAAU;KAC3B,EACD,IAAI,EACJ,CAAC,CACF,CAAC;IAEF,MAAM,gBAAgB,CAAC;QACrB,QAAQ,EAAE,GAAG,CAAC,QAAQ;QACtB,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,OAAO,EAAE,IAAI,CAAC,QAAQ;QACtB,aAAa,EAAE,eAAe;QAC9B,UAAU,EAAE,OAAO;KACpB,CAAC,CAAC;IAEH,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { McpContext } from "../auth.js";
|
|
2
|
+
/**
|
|
3
|
+
* Batch-reads multiple notes by ID. Returns full decrypted content for each,
|
|
4
|
+
* plus a list of any IDs that were not found.
|
|
5
|
+
*/
|
|
6
|
+
export declare function readNotes(ctx: McpContext, noteIds: string[]): Promise<string>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"read-notes.d.ts","sourceRoot":"","sources":["../../src/tools/read-notes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAK7C;;;GAGG;AACH,wBAAsB,SAAS,CAC7B,GAAG,EAAE,UAAU,EACf,OAAO,EAAE,MAAM,EAAE,GAChB,OAAO,CAAC,MAAM,CAAC,CA4CjB"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { getNotesByIds, getVault } from "../db.js";
|
|
2
|
+
import { decrypt } from "../crypto.js";
|
|
3
|
+
import { decryptNoteFields } from "./decrypt-helpers.js";
|
|
4
|
+
/**
|
|
5
|
+
* Batch-reads multiple notes by ID. Returns full decrypted content for each,
|
|
6
|
+
* plus a list of any IDs that were not found.
|
|
7
|
+
*/
|
|
8
|
+
export async function readNotes(ctx, noteIds) {
|
|
9
|
+
const notes = await getNotesByIds(ctx.supabase, ctx.userId, noteIds);
|
|
10
|
+
// Build a set of found IDs to report missing ones
|
|
11
|
+
const foundIds = new Set(notes.map((n) => n.id));
|
|
12
|
+
const notFound = noteIds.filter((id) => !foundIds.has(id));
|
|
13
|
+
// Cache vault names to avoid redundant fetches
|
|
14
|
+
const vaultNameCache = new Map();
|
|
15
|
+
async function getVaultName(vaultId) {
|
|
16
|
+
const cached = vaultNameCache.get(vaultId);
|
|
17
|
+
if (cached !== undefined)
|
|
18
|
+
return cached;
|
|
19
|
+
const vault = await getVault(ctx.supabase, ctx.userId, vaultId);
|
|
20
|
+
let name = "";
|
|
21
|
+
if (vault) {
|
|
22
|
+
name = await decrypt(vault.encrypted_name, vault.name_iv, ctx.masterKey);
|
|
23
|
+
}
|
|
24
|
+
vaultNameCache.set(vaultId, name);
|
|
25
|
+
return name;
|
|
26
|
+
}
|
|
27
|
+
async function decryptNote(note) {
|
|
28
|
+
const [{ title, content, tags }, vaultName] = await Promise.all([
|
|
29
|
+
decryptNoteFields(note, ctx.masterKey),
|
|
30
|
+
getVaultName(note.vault_id),
|
|
31
|
+
]);
|
|
32
|
+
return {
|
|
33
|
+
id: note.id,
|
|
34
|
+
title,
|
|
35
|
+
content,
|
|
36
|
+
tags,
|
|
37
|
+
vaultName,
|
|
38
|
+
vaultId: note.vault_id,
|
|
39
|
+
createdAt: note.created_at,
|
|
40
|
+
updatedAt: note.updated_at,
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
const results = await Promise.all(notes.map(decryptNote));
|
|
44
|
+
return JSON.stringify({ notes: results, notFound }, null, 2);
|
|
45
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"read-notes.js","sourceRoot":"","sources":["../../src/tools/read-notes.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAgB,MAAM,UAAU,CAAC;AACjE,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAEzD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,GAAe,EACf,OAAiB;IAEjB,MAAM,KAAK,GAAG,MAAM,aAAa,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAErE,kDAAkD;IAClD,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACjD,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IAE3D,+CAA+C;IAC/C,MAAM,cAAc,GAAG,IAAI,GAAG,EAAkB,CAAC;IAEjD,KAAK,UAAU,YAAY,CAAC,OAAe;QACzC,MAAM,MAAM,GAAG,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC3C,IAAI,MAAM,KAAK,SAAS;YAAE,OAAO,MAAM,CAAC;QAExC,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAChE,IAAI,IAAI,GAAG,EAAE,CAAC;QACd,IAAI,KAAK,EAAE,CAAC;YACV,IAAI,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,OAAO,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC;QAC3E,CAAC;QACD,cAAc,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAClC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,UAAU,WAAW,CAAC,IAAa;QACtC,MAAM,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,SAAS,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YAC9D,iBAAiB,CAAC,IAAI,EAAE,GAAG,CAAC,SAAS,CAAC;YACtC,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC;SAC5B,CAAC,CAAC;QAEH,OAAO;YACL,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,KAAK;YACL,OAAO;YACP,IAAI;YACJ,SAAS;YACT,OAAO,EAAE,IAAI,CAAC,QAAQ;YACtB,SAAS,EAAE,IAAI,CAAC,UAAU;YAC1B,SAAS,EAAE,IAAI,CAAC,UAAU;SAC3B,CAAC;IACJ,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC;IAE1D,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AAC/D,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { McpContext } from "../auth.js";
|
|
2
|
+
/**
|
|
3
|
+
* Resolves the effective vault ID from an explicit parameter or the context default.
|
|
4
|
+
* Returns `undefined` if neither is set (caller decides whether that's an error).
|
|
5
|
+
*/
|
|
6
|
+
export declare function resolveVaultId(ctx: McpContext, requestedVaultId?: string): string | undefined;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve-vault-id.d.ts","sourceRoot":"","sources":["../../src/tools/resolve-vault-id.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,GAAG,EAAE,UAAU,EACf,gBAAgB,CAAC,EAAE,MAAM,GACxB,MAAM,GAAG,SAAS,CAEpB"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resolves the effective vault ID from an explicit parameter or the context default.
|
|
3
|
+
* Returns `undefined` if neither is set (caller decides whether that's an error).
|
|
4
|
+
*/
|
|
5
|
+
export function resolveVaultId(ctx, requestedVaultId) {
|
|
6
|
+
return requestedVaultId ?? ctx.defaultVaultId ?? undefined;
|
|
7
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve-vault-id.js","sourceRoot":"","sources":["../../src/tools/resolve-vault-id.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,UAAU,cAAc,CAC5B,GAAe,EACf,gBAAyB;IAEzB,OAAO,gBAAgB,IAAI,GAAG,CAAC,cAAc,IAAI,SAAS,CAAC;AAC7D,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reciprocal Rank Fusion (RRF) — fuses multiple ranked lists into a single
|
|
3
|
+
* ranked list using the formula:
|
|
4
|
+
*
|
|
5
|
+
* RRF_score(d) = Σ weight_i / (k + rank_i(d) + 1)
|
|
6
|
+
*
|
|
7
|
+
* where rank_i(d) is the 0-based position of document d in list i,
|
|
8
|
+
* weight_i is the list's weight, and k is a smoothing constant (default 60).
|
|
9
|
+
*
|
|
10
|
+
* Reference: Cormack, Clarke & Buettcher (2009) — "Reciprocal Rank Fusion
|
|
11
|
+
* outperforms Condorcet and individual Rank Learning Methods"
|
|
12
|
+
*/
|
|
13
|
+
export interface RRFScoredResult {
|
|
14
|
+
id: string;
|
|
15
|
+
score: number;
|
|
16
|
+
}
|
|
17
|
+
export declare function fuseWithRRF(rankedLists: {
|
|
18
|
+
ids: string[];
|
|
19
|
+
weight: number;
|
|
20
|
+
}[], k?: number): string[];
|
|
21
|
+
/**
|
|
22
|
+
* Like fuseWithRRF but returns { id, score } pairs for downstream re-ranking
|
|
23
|
+
* (e.g. temporal decay, MMR).
|
|
24
|
+
*/
|
|
25
|
+
export declare function fuseWithRRFScored(rankedLists: {
|
|
26
|
+
ids: string[];
|
|
27
|
+
weight: number;
|
|
28
|
+
}[], k?: number): RRFScoredResult[];
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rrf.d.ts","sourceRoot":"","sources":["../../src/tools/rrf.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,WAAW,CACzB,WAAW,EAAE;IAAE,GAAG,EAAE,MAAM,EAAE,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,EAAE,EAChD,CAAC,SAAK,GACL,MAAM,EAAE,CAEV;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,WAAW,EAAE;IAAE,GAAG,EAAE,MAAM,EAAE,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,EAAE,EAChD,CAAC,SAAK,GACL,eAAe,EAAE,CAanB"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export function fuseWithRRF(rankedLists, k = 60) {
|
|
2
|
+
return fuseWithRRFScored(rankedLists, k).map((r) => r.id);
|
|
3
|
+
}
|
|
4
|
+
/**
|
|
5
|
+
* Like fuseWithRRF but returns { id, score } pairs for downstream re-ranking
|
|
6
|
+
* (e.g. temporal decay, MMR).
|
|
7
|
+
*/
|
|
8
|
+
export function fuseWithRRFScored(rankedLists, k = 60) {
|
|
9
|
+
const scores = new Map();
|
|
10
|
+
for (const list of rankedLists) {
|
|
11
|
+
for (let i = 0; i < list.ids.length; i++) {
|
|
12
|
+
const id = list.ids[i];
|
|
13
|
+
scores.set(id, (scores.get(id) ?? 0) + list.weight / (k + i + 1));
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
return [...scores.entries()]
|
|
17
|
+
.sort((a, b) => b[1] - a[1])
|
|
18
|
+
.map(([id, score]) => ({ id, score }));
|
|
19
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rrf.js","sourceRoot":"","sources":["../../src/tools/rrf.ts"],"names":[],"mappings":"AAiBA,MAAM,UAAU,WAAW,CACzB,WAAgD,EAChD,CAAC,GAAG,EAAE;IAEN,OAAO,iBAAiB,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AAC5D,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAC/B,WAAgD,EAChD,CAAC,GAAG,EAAE;IAEN,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;IAEzC,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;QAC/B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACzC,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACvB,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACpE,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;SACzB,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;SAC3B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;AAC3C,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { McpContext } from "../auth.js";
|
|
2
|
+
/**
|
|
3
|
+
* Combined search + full read: runs hybrid search (70% semantic + 30% keyword),
|
|
4
|
+
* then returns the full decrypted content of the top matches.
|
|
5
|
+
*
|
|
6
|
+
* Fallback chain:
|
|
7
|
+
* 1. Hybrid (semantic + keyword) — if OpenAI key is available
|
|
8
|
+
* 2. Keyword-only — if no OpenAI key or semantic fails
|
|
9
|
+
* 3. Recency-fallback — if no keyword matches at all
|
|
10
|
+
*/
|
|
11
|
+
export declare function searchAndRead(ctx: McpContext, query: string, maxNotes?: number): Promise<string>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search-and-read.d.ts","sourceRoot":"","sources":["../../src/tools/search-and-read.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAQ7C;;;;;;;;GAQG;AACH,wBAAsB,aAAa,CACjC,GAAG,EAAE,UAAU,EACf,KAAK,EAAE,MAAM,EACb,QAAQ,SAAI,GACX,OAAO,CAAC,MAAM,CAAC,CAiOjB"}
|