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.
Files changed (305) hide show
  1. package/dist/auth.d.ts +41 -0
  2. package/dist/auth.d.ts.map +1 -0
  3. package/dist/auth.js +236 -0
  4. package/dist/auth.js.map +1 -0
  5. package/dist/auto-session.d.ts +39 -0
  6. package/dist/auto-session.d.ts.map +1 -0
  7. package/dist/auto-session.js +128 -0
  8. package/dist/auto-session.js.map +1 -0
  9. package/dist/buffer-persistence.d.ts +35 -0
  10. package/dist/buffer-persistence.d.ts.map +1 -0
  11. package/dist/buffer-persistence.js +110 -0
  12. package/dist/buffer-persistence.js.map +1 -0
  13. package/dist/coerce-params.d.ts +36 -0
  14. package/dist/coerce-params.d.ts.map +1 -0
  15. package/dist/coerce-params.js +120 -0
  16. package/dist/coerce-params.js.map +1 -0
  17. package/dist/crypto.d.ts +39 -0
  18. package/dist/crypto.d.ts.map +1 -0
  19. package/dist/crypto.js +119 -0
  20. package/dist/crypto.js.map +1 -0
  21. package/dist/db.d.ts +350 -0
  22. package/dist/db.d.ts.map +1 -0
  23. package/dist/db.js +866 -0
  24. package/dist/db.js.map +1 -0
  25. package/dist/embedding-config.d.ts +11 -0
  26. package/dist/embedding-config.d.ts.map +1 -0
  27. package/dist/embedding-config.js +24 -0
  28. package/dist/embedding-config.js.map +1 -0
  29. package/dist/entity-extraction.d.ts +22 -0
  30. package/dist/entity-extraction.d.ts.map +1 -0
  31. package/dist/entity-extraction.js +140 -0
  32. package/dist/entity-extraction.js.map +1 -0
  33. package/dist/episodic-headline.d.ts +6 -0
  34. package/dist/episodic-headline.d.ts.map +1 -0
  35. package/dist/episodic-headline.js +62 -0
  36. package/dist/episodic-headline.js.map +1 -0
  37. package/dist/error-sanitizer.d.ts +20 -0
  38. package/dist/error-sanitizer.d.ts.map +1 -0
  39. package/dist/error-sanitizer.js +54 -0
  40. package/dist/error-sanitizer.js.map +1 -0
  41. package/dist/extraction-budget.d.ts +39 -0
  42. package/dist/extraction-budget.d.ts.map +1 -0
  43. package/dist/extraction-budget.js +122 -0
  44. package/dist/extraction-budget.js.map +1 -0
  45. package/dist/extraction-llm.d.ts +22 -0
  46. package/dist/extraction-llm.d.ts.map +1 -0
  47. package/dist/extraction-llm.js +32 -0
  48. package/dist/extraction-llm.js.map +1 -0
  49. package/dist/extraction-prompt.d.ts +40 -0
  50. package/dist/extraction-prompt.d.ts.map +1 -0
  51. package/dist/extraction-prompt.js +176 -0
  52. package/dist/extraction-prompt.js.map +1 -0
  53. package/dist/gateway-client.d.ts +303 -0
  54. package/dist/gateway-client.d.ts.map +1 -0
  55. package/dist/gateway-client.js +285 -0
  56. package/dist/gateway-client.js.map +1 -0
  57. package/dist/gateway-init.d.ts +32 -0
  58. package/dist/gateway-init.d.ts.map +1 -0
  59. package/dist/gateway-init.js +71 -0
  60. package/dist/gateway-init.js.map +1 -0
  61. package/dist/index.d.ts +2 -0
  62. package/dist/index.d.ts.map +1 -0
  63. package/dist/index.js +1242 -0
  64. package/dist/index.js.map +1 -0
  65. package/dist/infer-task-status.d.ts +7 -0
  66. package/dist/infer-task-status.d.ts.map +1 -0
  67. package/dist/infer-task-status.js +23 -0
  68. package/dist/infer-task-status.js.map +1 -0
  69. package/dist/normalize-agent-id.d.ts +21 -0
  70. package/dist/normalize-agent-id.d.ts.map +1 -0
  71. package/dist/normalize-agent-id.js +54 -0
  72. package/dist/normalize-agent-id.js.map +1 -0
  73. package/dist/openai.d.ts +14 -0
  74. package/dist/openai.d.ts.map +1 -0
  75. package/dist/openai.js +43 -0
  76. package/dist/openai.js.map +1 -0
  77. package/dist/rlm/actions.d.ts +31 -0
  78. package/dist/rlm/actions.d.ts.map +1 -0
  79. package/dist/rlm/actions.js +241 -0
  80. package/dist/rlm/actions.js.map +1 -0
  81. package/dist/rlm/benchmark.d.ts +2 -0
  82. package/dist/rlm/benchmark.d.ts.map +1 -0
  83. package/dist/rlm/benchmark.js +215 -0
  84. package/dist/rlm/benchmark.js.map +1 -0
  85. package/dist/rlm/execute.d.ts +13 -0
  86. package/dist/rlm/execute.d.ts.map +1 -0
  87. package/dist/rlm/execute.js +366 -0
  88. package/dist/rlm/execute.js.map +1 -0
  89. package/dist/rlm/index.d.ts +6 -0
  90. package/dist/rlm/index.d.ts.map +1 -0
  91. package/dist/rlm/index.js +147 -0
  92. package/dist/rlm/index.js.map +1 -0
  93. package/dist/rlm/profiles.d.ts +9 -0
  94. package/dist/rlm/profiles.d.ts.map +1 -0
  95. package/dist/rlm/profiles.js +46 -0
  96. package/dist/rlm/profiles.js.map +1 -0
  97. package/dist/rlm/types.d.ts +98 -0
  98. package/dist/rlm/types.d.ts.map +1 -0
  99. package/dist/rlm/types.js +6 -0
  100. package/dist/rlm/types.js.map +1 -0
  101. package/dist/rlm/verify.d.ts +13 -0
  102. package/dist/rlm/verify.d.ts.map +1 -0
  103. package/dist/rlm/verify.js +58 -0
  104. package/dist/rlm/verify.js.map +1 -0
  105. package/dist/rlm/writeback.d.ts +7 -0
  106. package/dist/rlm/writeback.d.ts.map +1 -0
  107. package/dist/rlm/writeback.js +77 -0
  108. package/dist/rlm/writeback.js.map +1 -0
  109. package/dist/scripts/backfill-memory-embeddings.d.ts +2 -0
  110. package/dist/scripts/backfill-memory-embeddings.d.ts.map +1 -0
  111. package/dist/scripts/backfill-memory-embeddings.js +153 -0
  112. package/dist/scripts/backfill-memory-embeddings.js.map +1 -0
  113. package/dist/session-buffer.d.ts +104 -0
  114. package/dist/session-buffer.d.ts.map +1 -0
  115. package/dist/session-buffer.js +466 -0
  116. package/dist/session-buffer.js.map +1 -0
  117. package/dist/session-dedup.d.ts +30 -0
  118. package/dist/session-dedup.d.ts.map +1 -0
  119. package/dist/session-dedup.js +67 -0
  120. package/dist/session-dedup.js.map +1 -0
  121. package/dist/session-flush.d.ts +81 -0
  122. package/dist/session-flush.d.ts.map +1 -0
  123. package/dist/session-flush.js +169 -0
  124. package/dist/session-flush.js.map +1 -0
  125. package/dist/session-lifecycle.d.ts +72 -0
  126. package/dist/session-lifecycle.d.ts.map +1 -0
  127. package/dist/session-lifecycle.js +247 -0
  128. package/dist/session-lifecycle.js.map +1 -0
  129. package/dist/setup.d.ts +2 -0
  130. package/dist/setup.d.ts.map +1 -0
  131. package/dist/setup.js +260 -0
  132. package/dist/setup.js.map +1 -0
  133. package/dist/stopwords.d.ts +2 -0
  134. package/dist/stopwords.d.ts.map +1 -0
  135. package/dist/stopwords.js +20 -0
  136. package/dist/stopwords.js.map +1 -0
  137. package/dist/strip-html.d.ts +5 -0
  138. package/dist/strip-html.d.ts.map +1 -0
  139. package/dist/strip-html.js +35 -0
  140. package/dist/strip-html.js.map +1 -0
  141. package/dist/task-completion-flush.d.ts +36 -0
  142. package/dist/task-completion-flush.d.ts.map +1 -0
  143. package/dist/task-completion-flush.js +97 -0
  144. package/dist/task-completion-flush.js.map +1 -0
  145. package/dist/task-lifecycle-types.d.ts +13 -0
  146. package/dist/task-lifecycle-types.d.ts.map +1 -0
  147. package/dist/task-lifecycle-types.js +12 -0
  148. package/dist/task-lifecycle-types.js.map +1 -0
  149. package/dist/task-lifecycle.d.ts +78 -0
  150. package/dist/task-lifecycle.d.ts.map +1 -0
  151. package/dist/task-lifecycle.js +256 -0
  152. package/dist/task-lifecycle.js.map +1 -0
  153. package/dist/tools/agent-messages.d.ts +26 -0
  154. package/dist/tools/agent-messages.d.ts.map +1 -0
  155. package/dist/tools/agent-messages.js +123 -0
  156. package/dist/tools/agent-messages.js.map +1 -0
  157. package/dist/tools/agent-tasks.d.ts +24 -0
  158. package/dist/tools/agent-tasks.d.ts.map +1 -0
  159. package/dist/tools/agent-tasks.js +162 -0
  160. package/dist/tools/agent-tasks.js.map +1 -0
  161. package/dist/tools/archive-memory.d.ts +2 -0
  162. package/dist/tools/archive-memory.d.ts.map +1 -0
  163. package/dist/tools/archive-memory.js +19 -0
  164. package/dist/tools/archive-memory.js.map +1 -0
  165. package/dist/tools/blind-index.d.ts +29 -0
  166. package/dist/tools/blind-index.d.ts.map +1 -0
  167. package/dist/tools/blind-index.js +53 -0
  168. package/dist/tools/blind-index.js.map +1 -0
  169. package/dist/tools/cleanup-memories.d.ts +44 -0
  170. package/dist/tools/cleanup-memories.d.ts.map +1 -0
  171. package/dist/tools/cleanup-memories.js +126 -0
  172. package/dist/tools/cleanup-memories.js.map +1 -0
  173. package/dist/tools/context-checkpoint.d.ts +28 -0
  174. package/dist/tools/context-checkpoint.d.ts.map +1 -0
  175. package/dist/tools/context-checkpoint.js +140 -0
  176. package/dist/tools/context-checkpoint.js.map +1 -0
  177. package/dist/tools/context-profiles.d.ts +67 -0
  178. package/dist/tools/context-profiles.d.ts.map +1 -0
  179. package/dist/tools/context-profiles.js +30 -0
  180. package/dist/tools/context-profiles.js.map +1 -0
  181. package/dist/tools/create-note.d.ts +2 -0
  182. package/dist/tools/create-note.d.ts.map +1 -0
  183. package/dist/tools/create-note.js +60 -0
  184. package/dist/tools/create-note.js.map +1 -0
  185. package/dist/tools/create-vault.d.ts +5 -0
  186. package/dist/tools/create-vault.d.ts.map +1 -0
  187. package/dist/tools/create-vault.js +121 -0
  188. package/dist/tools/create-vault.js.map +1 -0
  189. package/dist/tools/decrypt-helpers.d.ts +31 -0
  190. package/dist/tools/decrypt-helpers.d.ts.map +1 -0
  191. package/dist/tools/decrypt-helpers.js +33 -0
  192. package/dist/tools/decrypt-helpers.js.map +1 -0
  193. package/dist/tools/delete-note.d.ts +2 -0
  194. package/dist/tools/delete-note.d.ts.map +1 -0
  195. package/dist/tools/delete-note.js +21 -0
  196. package/dist/tools/delete-note.js.map +1 -0
  197. package/dist/tools/explore-graph.d.ts +11 -0
  198. package/dist/tools/explore-graph.d.ts.map +1 -0
  199. package/dist/tools/explore-graph.js +169 -0
  200. package/dist/tools/explore-graph.js.map +1 -0
  201. package/dist/tools/get-related-memories.d.ts +2 -0
  202. package/dist/tools/get-related-memories.d.ts.map +1 -0
  203. package/dist/tools/get-related-memories.js +59 -0
  204. package/dist/tools/get-related-memories.js.map +1 -0
  205. package/dist/tools/knowledge-links.d.ts +17 -0
  206. package/dist/tools/knowledge-links.d.ts.map +1 -0
  207. package/dist/tools/knowledge-links.js +102 -0
  208. package/dist/tools/knowledge-links.js.map +1 -0
  209. package/dist/tools/list-active-agents.d.ts +5 -0
  210. package/dist/tools/list-active-agents.d.ts.map +1 -0
  211. package/dist/tools/list-active-agents.js +15 -0
  212. package/dist/tools/list-active-agents.js.map +1 -0
  213. package/dist/tools/list-notes.d.ts +2 -0
  214. package/dist/tools/list-notes.d.ts.map +1 -0
  215. package/dist/tools/list-notes.js +19 -0
  216. package/dist/tools/list-notes.js.map +1 -0
  217. package/dist/tools/list-vaults.d.ts +2 -0
  218. package/dist/tools/list-vaults.d.ts.map +1 -0
  219. package/dist/tools/list-vaults.js +19 -0
  220. package/dist/tools/list-vaults.js.map +1 -0
  221. package/dist/tools/mmr.d.ts +18 -0
  222. package/dist/tools/mmr.d.ts.map +1 -0
  223. package/dist/tools/mmr.js +67 -0
  224. package/dist/tools/mmr.js.map +1 -0
  225. package/dist/tools/read-memories.d.ts +2 -0
  226. package/dist/tools/read-memories.d.ts.map +1 -0
  227. package/dist/tools/read-memories.js +46 -0
  228. package/dist/tools/read-memories.js.map +1 -0
  229. package/dist/tools/read-note.d.ts +2 -0
  230. package/dist/tools/read-note.d.ts.map +1 -0
  231. package/dist/tools/read-note.js +35 -0
  232. package/dist/tools/read-note.js.map +1 -0
  233. package/dist/tools/read-notes.d.ts +6 -0
  234. package/dist/tools/read-notes.d.ts.map +1 -0
  235. package/dist/tools/read-notes.js +45 -0
  236. package/dist/tools/read-notes.js.map +1 -0
  237. package/dist/tools/resolve-vault-id.d.ts +6 -0
  238. package/dist/tools/resolve-vault-id.d.ts.map +1 -0
  239. package/dist/tools/resolve-vault-id.js +7 -0
  240. package/dist/tools/resolve-vault-id.js.map +1 -0
  241. package/dist/tools/rrf.d.ts +28 -0
  242. package/dist/tools/rrf.d.ts.map +1 -0
  243. package/dist/tools/rrf.js +19 -0
  244. package/dist/tools/rrf.js.map +1 -0
  245. package/dist/tools/search-and-read.d.ts +11 -0
  246. package/dist/tools/search-and-read.d.ts.map +1 -0
  247. package/dist/tools/search-and-read.js +208 -0
  248. package/dist/tools/search-and-read.js.map +1 -0
  249. package/dist/tools/search-memories.d.ts +13 -0
  250. package/dist/tools/search-memories.d.ts.map +1 -0
  251. package/dist/tools/search-memories.js +272 -0
  252. package/dist/tools/search-memories.js.map +1 -0
  253. package/dist/tools/search-notes.d.ts +2 -0
  254. package/dist/tools/search-notes.d.ts.map +1 -0
  255. package/dist/tools/search-notes.js +94 -0
  256. package/dist/tools/search-notes.js.map +1 -0
  257. package/dist/tools/semantic-search.d.ts +7 -0
  258. package/dist/tools/semantic-search.d.ts.map +1 -0
  259. package/dist/tools/semantic-search.js +85 -0
  260. package/dist/tools/semantic-search.js.map +1 -0
  261. package/dist/tools/session-start.d.ts +24 -0
  262. package/dist/tools/session-start.d.ts.map +1 -0
  263. package/dist/tools/session-start.js +256 -0
  264. package/dist/tools/session-start.js.map +1 -0
  265. package/dist/tools/stale-tasks.d.ts +22 -0
  266. package/dist/tools/stale-tasks.d.ts.map +1 -0
  267. package/dist/tools/stale-tasks.js +39 -0
  268. package/dist/tools/stale-tasks.js.map +1 -0
  269. package/dist/tools/temporal-decay.d.ts +21 -0
  270. package/dist/tools/temporal-decay.d.ts.map +1 -0
  271. package/dist/tools/temporal-decay.js +32 -0
  272. package/dist/tools/temporal-decay.js.map +1 -0
  273. package/dist/tools/update-memory.d.ts +19 -0
  274. package/dist/tools/update-memory.d.ts.map +1 -0
  275. package/dist/tools/update-memory.js +230 -0
  276. package/dist/tools/update-memory.js.map +1 -0
  277. package/dist/tools/update-note.d.ts +2 -0
  278. package/dist/tools/update-note.d.ts.map +1 -0
  279. package/dist/tools/update-note.js +79 -0
  280. package/dist/tools/update-note.js.map +1 -0
  281. package/dist/tools/vault-instruction-template.d.ts +17 -0
  282. package/dist/tools/vault-instruction-template.d.ts.map +1 -0
  283. package/dist/tools/vault-instruction-template.js +77 -0
  284. package/dist/tools/vault-instruction-template.js.map +1 -0
  285. package/dist/tools/wiki-link-sync.d.ts +34 -0
  286. package/dist/tools/wiki-link-sync.d.ts.map +1 -0
  287. package/dist/tools/wiki-link-sync.js +132 -0
  288. package/dist/tools/wiki-link-sync.js.map +1 -0
  289. package/dist/tools/wrap-tool-handler.d.ts +8 -0
  290. package/dist/tools/wrap-tool-handler.d.ts.map +1 -0
  291. package/dist/tools/wrap-tool-handler.js +32 -0
  292. package/dist/tools/wrap-tool-handler.js.map +1 -0
  293. package/dist/tools/write-memory.d.ts +34 -0
  294. package/dist/tools/write-memory.d.ts.map +1 -0
  295. package/dist/tools/write-memory.js +359 -0
  296. package/dist/tools/write-memory.js.map +1 -0
  297. package/dist/usage.d.ts +11 -0
  298. package/dist/usage.d.ts.map +1 -0
  299. package/dist/usage.js +38 -0
  300. package/dist/usage.js.map +1 -0
  301. package/dist/wiki-link-parser.d.ts +27 -0
  302. package/dist/wiki-link-parser.d.ts.map +1 -0
  303. package/dist/wiki-link-parser.js +93 -0
  304. package/dist/wiki-link-parser.js.map +1 -0
  305. package/package.json +38 -0
@@ -0,0 +1,19 @@
1
+ import { archiveMemory as dbArchiveMemory, getMemory } from "../db.js";
2
+ import { logMcpUsageEvent } from "../usage.js";
3
+ export async function archiveMemory(ctx, memoryId, archived = true) {
4
+ const memory = await getMemory(ctx.supabase, ctx.userId, memoryId);
5
+ if (!memory) {
6
+ return JSON.stringify({ success: false, error: "Memory not found" });
7
+ }
8
+ await dbArchiveMemory(ctx.supabase, memoryId, ctx.userId, archived);
9
+ const payload = JSON.stringify({ success: true, memoryId, archived });
10
+ await logMcpUsageEvent({
11
+ supabase: ctx.supabase,
12
+ userId: ctx.userId,
13
+ vaultId: memory.vault_id ?? undefined,
14
+ operationType: archived ? "mcp_archive_memory" : "mcp_unarchive_memory",
15
+ inputText: memoryId,
16
+ outputText: payload,
17
+ });
18
+ return payload;
19
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"archive-memory.js","sourceRoot":"","sources":["../../src/tools/archive-memory.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,IAAI,eAAe,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AACvE,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE/C,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,GAAe,EACf,QAAgB,EAChB,QAAQ,GAAG,IAAI;IAEf,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACnE,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,kBAAkB,EAAE,CAAC,CAAC;IACvE,CAAC;IAED,MAAM,eAAe,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACpE,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC;IACtE,MAAM,gBAAgB,CAAC;QACrB,QAAQ,EAAE,GAAG,CAAC,QAAQ;QACtB,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,OAAO,EAAE,MAAM,CAAC,QAAQ,IAAI,SAAS;QACrC,aAAa,EAAE,QAAQ,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,sBAAsB;QACvE,SAAS,EAAE,QAAQ;QACnB,UAAU,EAAE,OAAO;KACpB,CAAC,CAAC;IACH,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Blind index utilities for privacy-preserving keyword search on E2E encrypted content.
3
+ *
4
+ * At write time: tokenize plaintext → HMAC-SHA256 each token → store hashes.
5
+ * At search time: tokenize query → HMAC-SHA256 each token → match against stored hashes.
6
+ * The DB never sees plaintext tokens — only irreversible HMAC hashes.
7
+ */
8
+ /**
9
+ * Tokenizes text into normalized lowercase tokens.
10
+ * Preserves hyphens, underscores, and dots (important for identifiers like
11
+ * "invoice-2345", "VERCEL_TOKEN", "config.json").
12
+ */
13
+ export declare function tokenize(text: string): string[];
14
+ /**
15
+ * Derives a 256-bit HMAC key from the MEK hex string.
16
+ * This sub-key is used exclusively for blind index token hashing.
17
+ * Deterministic: same MEK always produces the same blind key.
18
+ */
19
+ export declare function deriveBlindKey(mekHex: string): Buffer;
20
+ /**
21
+ * HMAC-SHA256 hashes a single token with the blind key.
22
+ * Returns a compact base64url-encoded string (43 chars).
23
+ */
24
+ export declare function hashToken(token: string, blindKey: Buffer): string;
25
+ /**
26
+ * Convenience: tokenizes plaintext and hashes all tokens in one step.
27
+ * Returns an array of base64url HMAC hashes ready for DB storage or query matching.
28
+ */
29
+ export declare function generateBlindTokens(plaintext: string, mekHex: string): string[];
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blind-index.d.ts","sourceRoot":"","sources":["../../src/tools/blind-index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAUH;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAO/C;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAIrD;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEjE;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAK/E"}
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Blind index utilities for privacy-preserving keyword search on E2E encrypted content.
3
+ *
4
+ * At write time: tokenize plaintext → HMAC-SHA256 each token → store hashes.
5
+ * At search time: tokenize query → HMAC-SHA256 each token → match against stored hashes.
6
+ * The DB never sees plaintext tokens — only irreversible HMAC hashes.
7
+ */
8
+ import { createHmac } from "node:crypto";
9
+ /** Salt used to derive the blind index sub-key from the MEK. */
10
+ const BLIND_INDEX_SALT = "exovault-blind-index-v1";
11
+ /** Maximum number of unique tokens stored per memory. */
12
+ const MAX_TOKENS = 500;
13
+ /**
14
+ * Tokenizes text into normalized lowercase tokens.
15
+ * Preserves hyphens, underscores, and dots (important for identifiers like
16
+ * "invoice-2345", "VERCEL_TOKEN", "config.json").
17
+ */
18
+ export function tokenize(text) {
19
+ return text
20
+ .toLowerCase()
21
+ .split(/[^a-z0-9_\-.]+/)
22
+ .filter((t) => t.length >= 2)
23
+ .filter((v, i, a) => a.indexOf(v) === i)
24
+ .slice(0, MAX_TOKENS);
25
+ }
26
+ /**
27
+ * Derives a 256-bit HMAC key from the MEK hex string.
28
+ * This sub-key is used exclusively for blind index token hashing.
29
+ * Deterministic: same MEK always produces the same blind key.
30
+ */
31
+ export function deriveBlindKey(mekHex) {
32
+ return createHmac("sha256", Buffer.from(mekHex, "hex"))
33
+ .update(BLIND_INDEX_SALT)
34
+ .digest();
35
+ }
36
+ /**
37
+ * HMAC-SHA256 hashes a single token with the blind key.
38
+ * Returns a compact base64url-encoded string (43 chars).
39
+ */
40
+ export function hashToken(token, blindKey) {
41
+ return createHmac("sha256", blindKey).update(token).digest("base64url");
42
+ }
43
+ /**
44
+ * Convenience: tokenizes plaintext and hashes all tokens in one step.
45
+ * Returns an array of base64url HMAC hashes ready for DB storage or query matching.
46
+ */
47
+ export function generateBlindTokens(plaintext, mekHex) {
48
+ const tokens = tokenize(plaintext);
49
+ if (tokens.length === 0)
50
+ return [];
51
+ const blindKey = deriveBlindKey(mekHex);
52
+ return tokens.map((t) => hashToken(t, blindKey));
53
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blind-index.js","sourceRoot":"","sources":["../../src/tools/blind-index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,gEAAgE;AAChE,MAAM,gBAAgB,GAAG,yBAAyB,CAAC;AAEnD,yDAAyD;AACzD,MAAM,UAAU,GAAG,GAAG,CAAC;AAEvB;;;;GAIG;AACH,MAAM,UAAU,QAAQ,CAAC,IAAY;IACnC,OAAO,IAAI;SACR,WAAW,EAAE;SACb,KAAK,CAAC,gBAAgB,CAAC;SACvB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC;SAC5B,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;SACvC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;AAC1B,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,MAAc;IAC3C,OAAO,UAAU,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;SACpD,MAAM,CAAC,gBAAgB,CAAC;SACxB,MAAM,EAAE,CAAC;AACd,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,SAAS,CAAC,KAAa,EAAE,QAAgB;IACvD,OAAO,UAAU,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;AAC1E,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,SAAiB,EAAE,MAAc;IACnE,MAAM,MAAM,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC;IACnC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACnC,MAAM,QAAQ,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;IACxC,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC;AACnD,CAAC"}
@@ -0,0 +1,44 @@
1
+ import type { McpContext } from "../auth.js";
2
+ interface CleanupInput {
3
+ vaultId?: string;
4
+ /** Archive episodic memories older than N days (default: 30) */
5
+ maxEpisodicAgeDays?: number;
6
+ /** Archive memories with importance <= this threshold (default: 1) */
7
+ maxImportance?: number;
8
+ /** Only archive memories not updated in N days (default: 14) */
9
+ staleAfterDays?: number;
10
+ /** Preview what would be archived without actually archiving (default: false) */
11
+ dryRun?: boolean;
12
+ }
13
+ export interface CleanupCandidate {
14
+ id: string;
15
+ memoryType: string;
16
+ summary: string | null;
17
+ importance: number;
18
+ reason: string;
19
+ updatedAt: string;
20
+ }
21
+ export interface CleanupOptions {
22
+ maxEpisodicAgeDays?: number;
23
+ maxImportance?: number;
24
+ staleAfterDays?: number;
25
+ dryRun?: boolean;
26
+ /** When true, only apply safe rules (3: failed indexing, 4: superseded). Skips judgment-based rules 1+2. */
27
+ safeOnly?: boolean;
28
+ }
29
+ export interface CleanupResult {
30
+ scannedCount: number;
31
+ candidateCount: number;
32
+ archivedCount: number;
33
+ candidates: CleanupCandidate[];
34
+ }
35
+ /**
36
+ * Core cleanup logic — scans memories and archives candidates based on rules.
37
+ * Extracted so it can be called standalone (e.g. auto-cleanup in session_start).
38
+ */
39
+ export declare function runCleanup(ctx: McpContext, vaultId: string | undefined, options?: CleanupOptions): Promise<CleanupResult>;
40
+ /**
41
+ * MCP-facing cleanup tool — wraps runCleanup with logging and JSON output.
42
+ */
43
+ export declare function cleanupMemories(ctx: McpContext, input: CleanupInput): Promise<string>;
44
+ export {};
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cleanup-memories.d.ts","sourceRoot":"","sources":["../../src/tools/cleanup-memories.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAK7C,UAAU,YAAY;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,gEAAgE;IAChE,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,sEAAsE;IACtE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,gEAAgE;IAChE,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,iFAAiF;IACjF,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,cAAc;IAC7B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,4GAA4G;IAC5G,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,aAAa;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,gBAAgB,EAAE,CAAC;CAChC;AAED;;;GAGG;AACH,wBAAsB,UAAU,CAC9B,GAAG,EAAE,UAAU,EACf,OAAO,EAAE,MAAM,GAAG,SAAS,EAC3B,OAAO,GAAE,cAAmB,GAC3B,OAAO,CAAC,aAAa,CAAC,CAiGxB;AAED;;GAEG;AACH,wBAAsB,eAAe,CACnC,GAAG,EAAE,UAAU,EACf,KAAK,EAAE,YAAY,GAClB,OAAO,CAAC,MAAM,CAAC,CA+BjB"}
@@ -0,0 +1,126 @@
1
+ import { getMemories, archiveMemory } from "../db.js";
2
+ import { logMcpUsageEvent } from "../usage.js";
3
+ import { resolveVaultId } from "./resolve-vault-id.js";
4
+ /**
5
+ * Core cleanup logic — scans memories and archives candidates based on rules.
6
+ * Extracted so it can be called standalone (e.g. auto-cleanup in session_start).
7
+ */
8
+ export async function runCleanup(ctx, vaultId, options = {}) {
9
+ const resolvedVaultId = ctx.defaultVaultId
10
+ ? resolveVaultId(ctx, vaultId)
11
+ : vaultId;
12
+ const maxEpisodicAgeDays = options.maxEpisodicAgeDays ?? 30;
13
+ const maxImportance = options.maxImportance ?? 1;
14
+ const staleAfterDays = options.staleAfterDays ?? 14;
15
+ const dryRun = options.dryRun ?? false;
16
+ const safeOnly = options.safeOnly ?? false;
17
+ const now = Date.now();
18
+ const candidates = [];
19
+ // Fetch non-archived memories (up to 200 for scanning)
20
+ const memories = await getMemories(ctx.supabase, ctx.userId, {
21
+ vaultId: resolvedVaultId,
22
+ includeArchived: false,
23
+ limit: 200,
24
+ });
25
+ for (const m of memories) {
26
+ const ageMs = now - new Date(m.updated_at).getTime();
27
+ const ageDays = ageMs / (1000 * 60 * 60 * 24);
28
+ if (!safeOnly) {
29
+ // Rule 1: Old episodic memories with low importance
30
+ if (m.memory_type === "episodic" &&
31
+ ageDays > maxEpisodicAgeDays &&
32
+ m.importance <= 2) {
33
+ candidates.push({
34
+ id: m.id,
35
+ memoryType: m.memory_type,
36
+ summary: m.encrypted_summary ? "(encrypted)" : null,
37
+ importance: m.importance,
38
+ reason: `episodic memory older than ${maxEpisodicAgeDays} days (${Math.floor(ageDays)}d)`,
39
+ updatedAt: m.updated_at,
40
+ });
41
+ continue;
42
+ }
43
+ // Rule 2: Very low importance memories that are stale
44
+ if (m.importance <= maxImportance && ageDays > staleAfterDays) {
45
+ candidates.push({
46
+ id: m.id,
47
+ memoryType: m.memory_type,
48
+ summary: m.encrypted_summary ? "(encrypted)" : null,
49
+ importance: m.importance,
50
+ reason: `importance ${m.importance} and stale for ${Math.floor(ageDays)} days`,
51
+ updatedAt: m.updated_at,
52
+ });
53
+ continue;
54
+ }
55
+ }
56
+ // Rule 3: Failed indexing older than 7 days (embeddings never succeeded)
57
+ if (m.indexing_status === "failed" && ageDays > 7) {
58
+ candidates.push({
59
+ id: m.id,
60
+ memoryType: m.memory_type,
61
+ summary: m.encrypted_summary ? "(encrypted)" : null,
62
+ importance: m.importance,
63
+ reason: `indexing failed for ${Math.floor(ageDays)} days`,
64
+ updatedAt: m.updated_at,
65
+ });
66
+ continue;
67
+ }
68
+ // Rule 4: Superseded memories (replaced by newer version)
69
+ if (m.superseded_by_id) {
70
+ candidates.push({
71
+ id: m.id,
72
+ memoryType: m.memory_type,
73
+ summary: m.encrypted_summary ? "(encrypted)" : null,
74
+ importance: m.importance,
75
+ reason: `superseded by ${m.superseded_by_id}`,
76
+ updatedAt: m.updated_at,
77
+ });
78
+ }
79
+ }
80
+ // Archive candidates (unless dry run)
81
+ let archivedCount = 0;
82
+ if (!dryRun) {
83
+ for (const c of candidates) {
84
+ await archiveMemory(ctx.supabase, c.id, ctx.userId, true);
85
+ archivedCount++;
86
+ }
87
+ }
88
+ return {
89
+ scannedCount: memories.length,
90
+ candidateCount: candidates.length,
91
+ archivedCount,
92
+ candidates,
93
+ };
94
+ }
95
+ /**
96
+ * MCP-facing cleanup tool — wraps runCleanup with logging and JSON output.
97
+ */
98
+ export async function cleanupMemories(ctx, input) {
99
+ const result = await runCleanup(ctx, input.vaultId, {
100
+ maxEpisodicAgeDays: input.maxEpisodicAgeDays,
101
+ maxImportance: input.maxImportance,
102
+ staleAfterDays: input.staleAfterDays,
103
+ dryRun: input.dryRun,
104
+ });
105
+ const payload = JSON.stringify({
106
+ dryRun: input.dryRun ?? false,
107
+ scannedCount: result.scannedCount,
108
+ candidateCount: result.candidateCount,
109
+ archivedCount: result.archivedCount,
110
+ candidates: result.candidates.map((c) => ({
111
+ id: c.id,
112
+ memoryType: c.memoryType,
113
+ importance: c.importance,
114
+ reason: c.reason,
115
+ updatedAt: c.updatedAt,
116
+ })),
117
+ }, null, 2);
118
+ await logMcpUsageEvent({
119
+ supabase: ctx.supabase,
120
+ userId: ctx.userId,
121
+ operationType: "mcp_cleanup_memories",
122
+ inputText: JSON.stringify(input),
123
+ outputText: payload,
124
+ });
125
+ return payload;
126
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cleanup-memories.js","sourceRoot":"","sources":["../../src/tools/cleanup-memories.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import type { McpContext } from "../auth.js";
2
+ interface MemoryRelation {
3
+ memoryId: string;
4
+ relationType: "derived_from" | "contradicts" | "refines" | "part_of" | "supersedes";
5
+ }
6
+ interface CheckpointMemoryInput {
7
+ content: string;
8
+ memoryType?: string;
9
+ summary?: string;
10
+ importance?: number;
11
+ confidence?: number;
12
+ entities?: string[];
13
+ writeReason?: string;
14
+ relatedMemoryIds?: MemoryRelation[];
15
+ sourceNoteIds?: string[];
16
+ supersededById?: string;
17
+ }
18
+ interface CheckpointInput {
19
+ memories: CheckpointMemoryInput[];
20
+ sessionSummary?: string;
21
+ vaultId?: string;
22
+ agentId?: string;
23
+ modelId?: string;
24
+ agentRunId?: string;
25
+ dedup?: boolean;
26
+ }
27
+ export declare function contextCheckpoint(ctx: McpContext, input: CheckpointInput): Promise<string>;
28
+ export {};
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-checkpoint.d.ts","sourceRoot":"","sources":["../../src/tools/context-checkpoint.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAO7C,UAAU,cAAc;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,cAAc,GAAG,aAAa,GAAG,SAAS,GAAG,SAAS,GAAG,YAAY,CAAC;CACrF;AAED,UAAU,qBAAqB;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gBAAgB,CAAC,EAAE,cAAc,EAAE,CAAC;IACpC,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,UAAU,eAAe;IACvB,QAAQ,EAAE,qBAAqB,EAAE,CAAC;IAClC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AASD,wBAAsB,iBAAiB,CACrC,GAAG,EAAE,UAAU,EACf,KAAK,EAAE,eAAe,GACrB,OAAO,CAAC,MAAM,CAAC,CA0JjB"}
@@ -0,0 +1,140 @@
1
+ import { writeMemory } from "./write-memory.js";
2
+ import { logMcpUsageEvent } from "../usage.js";
3
+ import { generateEpisodicHeadline } from "../episodic-headline.js";
4
+ import { getPendingMessages, bulkUpdateMessageStatus } from "../db.js";
5
+ import { decrypt } from "../crypto.js";
6
+ export async function contextCheckpoint(ctx, input) {
7
+ const start = Date.now();
8
+ const dedup = input.dedup ?? true;
9
+ const results = [];
10
+ let created = 0;
11
+ let skipped = 0;
12
+ let superseded = 0;
13
+ let failed = 0;
14
+ // Process memories sequentially so dedup can see previously written ones
15
+ for (let i = 0; i < input.memories.length; i++) {
16
+ const mem = input.memories[i];
17
+ try {
18
+ const externalWriteId = input.agentRunId
19
+ ? `checkpoint:${input.agentRunId}:${i}`
20
+ : undefined;
21
+ const resultJson = await writeMemory(ctx, {
22
+ content: mem.content,
23
+ memoryType: mem.memoryType,
24
+ summary: mem.summary,
25
+ importance: mem.importance,
26
+ confidence: mem.confidence,
27
+ entities: mem.entities,
28
+ writeReason: mem.writeReason,
29
+ relatedMemoryIds: mem.relatedMemoryIds,
30
+ sourceNoteIds: mem.sourceNoteIds,
31
+ supersededById: mem.supersededById,
32
+ vaultId: input.vaultId,
33
+ agentId: input.agentId,
34
+ modelId: input.modelId,
35
+ agentRunId: input.agentRunId,
36
+ externalWriteId,
37
+ dedup,
38
+ });
39
+ const parsed = JSON.parse(resultJson);
40
+ const dedupAction = parsed.dedupAction;
41
+ if (dedupAction === "skip") {
42
+ skipped++;
43
+ results.push({ index: i, memoryId: parsed.memoryId, status: "skipped" });
44
+ }
45
+ else if (parsed.created === false && parsed.upserted === true) {
46
+ // Upserted via externalWriteId — count as superseded
47
+ superseded++;
48
+ results.push({ index: i, memoryId: parsed.memoryId, status: "superseded" });
49
+ }
50
+ else {
51
+ created++;
52
+ results.push({ index: i, memoryId: parsed.memoryId, status: "created" });
53
+ }
54
+ }
55
+ catch (err) {
56
+ failed++;
57
+ results.push({
58
+ index: i,
59
+ status: "failed",
60
+ error: err.message,
61
+ });
62
+ }
63
+ }
64
+ // Write session summary as episodic memory if provided
65
+ if (input.sessionSummary?.trim()) {
66
+ try {
67
+ const externalWriteId = input.agentRunId
68
+ ? `checkpoint:${input.agentRunId}:session_summary`
69
+ : undefined;
70
+ await writeMemory(ctx, {
71
+ content: input.sessionSummary,
72
+ memoryType: "episodic",
73
+ summary: generateEpisodicHeadline(input.sessionSummary),
74
+ importance: 2,
75
+ confidence: 4,
76
+ vaultId: input.vaultId,
77
+ agentId: input.agentId,
78
+ modelId: input.modelId,
79
+ agentRunId: input.agentRunId,
80
+ writeReason: "End-of-session context checkpoint",
81
+ externalWriteId,
82
+ dedup,
83
+ });
84
+ }
85
+ catch {
86
+ // Don't fail the whole checkpoint for a session summary error
87
+ }
88
+ }
89
+ // Fetch pending messages for this agent (budget: 3, best-effort)
90
+ let pendingMessages = null;
91
+ if (input.agentId) {
92
+ try {
93
+ const pendingMsgRows = await getPendingMessages(ctx.supabase, ctx.userId, input.agentId, 3);
94
+ if (pendingMsgRows.length > 0) {
95
+ pendingMessages = await Promise.all(pendingMsgRows.map(async (m) => {
96
+ const content = await decrypt(m.encrypted_content, m.content_iv, ctx.masterKey);
97
+ return {
98
+ id: m.id,
99
+ senderId: m.sender_id,
100
+ senderType: m.sender_type,
101
+ category: m.category,
102
+ priority: m.priority,
103
+ subject: m.subject,
104
+ content,
105
+ createdAt: m.created_at,
106
+ };
107
+ }));
108
+ // Mark as delivered (best-effort)
109
+ await bulkUpdateMessageStatus(ctx.supabase, pendingMsgRows.map((m) => m.id), ctx.userId, "delivered", { delivered_at: new Date().toISOString() }).catch(() => { });
110
+ }
111
+ }
112
+ catch {
113
+ // Best-effort — never block checkpoint for message delivery
114
+ }
115
+ }
116
+ const durationMs = Date.now() - start;
117
+ const result = {
118
+ total: input.memories.length,
119
+ created,
120
+ skipped,
121
+ superseded,
122
+ failed,
123
+ durationMs,
124
+ results,
125
+ };
126
+ if (pendingMessages && pendingMessages.length > 0) {
127
+ result.pendingMessages = pendingMessages;
128
+ }
129
+ const payload = JSON.stringify(result);
130
+ await logMcpUsageEvent({
131
+ supabase: ctx.supabase,
132
+ userId: ctx.userId,
133
+ vaultId: input.vaultId,
134
+ modelId: input.modelId,
135
+ operationType: "mcp_context_checkpoint",
136
+ inputText: `${input.memories.length} memories`,
137
+ outputText: payload,
138
+ });
139
+ return payload;
140
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-checkpoint.js","sourceRoot":"","sources":["../../src/tools/context-checkpoint.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,67 @@
1
+ /**
2
+ * Context profiles for session_start — preset retrieval ratios
3
+ * for different agent situations.
4
+ */
5
+ export declare const CONTEXT_PROFILES: {
6
+ readonly default: {
7
+ readonly maxEpisodic: 3;
8
+ readonly maxFacts: 5;
9
+ readonly maxTasks: 5;
10
+ readonly maxConstraints: 10;
11
+ };
12
+ readonly planning: {
13
+ readonly maxEpisodic: 1;
14
+ readonly maxFacts: 8;
15
+ readonly maxTasks: 8;
16
+ readonly maxConstraints: 10;
17
+ };
18
+ readonly incident: {
19
+ readonly maxEpisodic: 5;
20
+ readonly maxFacts: 8;
21
+ readonly maxTasks: 3;
22
+ readonly maxConstraints: 10;
23
+ };
24
+ readonly handoff: {
25
+ readonly maxEpisodic: 5;
26
+ readonly maxFacts: 5;
27
+ readonly maxTasks: 8;
28
+ readonly maxConstraints: 10;
29
+ };
30
+ readonly deep: {
31
+ readonly maxEpisodic: 5;
32
+ readonly maxFacts: 10;
33
+ readonly maxTasks: 5;
34
+ readonly maxConstraints: 10;
35
+ };
36
+ readonly minimal: {
37
+ readonly maxEpisodic: 1;
38
+ readonly maxFacts: 2;
39
+ readonly maxTasks: 2;
40
+ readonly maxConstraints: 3;
41
+ };
42
+ readonly none: {
43
+ readonly maxEpisodic: 0;
44
+ readonly maxFacts: 0;
45
+ readonly maxTasks: 0;
46
+ readonly maxConstraints: 0;
47
+ };
48
+ };
49
+ export type ContextMode = keyof typeof CONTEXT_PROFILES;
50
+ export interface ContextLimits {
51
+ maxEpisodic: number;
52
+ maxFacts: number;
53
+ maxTasks: number;
54
+ maxConstraints: number;
55
+ }
56
+ /**
57
+ * Resolves context limits from a mode preset + optional explicit overrides.
58
+ * Explicit params always take precedence over mode defaults.
59
+ * Unknown modes fall back to "default".
60
+ */
61
+ export declare function resolveContextLimits(input: {
62
+ mode?: string;
63
+ maxEpisodic?: number;
64
+ maxFacts?: number;
65
+ maxTasks?: number;
66
+ maxConstraints?: number;
67
+ }): ContextLimits;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-profiles.d.ts","sourceRoot":"","sources":["../../src/tools/context-profiles.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAQnB,CAAC;AAEX,MAAM,MAAM,WAAW,GAAG,MAAM,OAAO,gBAAgB,CAAC;AACxD,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE;IAC1C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,GAAG,aAAa,CAahB"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Context profiles for session_start — preset retrieval ratios
3
+ * for different agent situations.
4
+ */
5
+ export const CONTEXT_PROFILES = {
6
+ default: { maxEpisodic: 3, maxFacts: 5, maxTasks: 5, maxConstraints: 10 },
7
+ planning: { maxEpisodic: 1, maxFacts: 8, maxTasks: 8, maxConstraints: 10 },
8
+ incident: { maxEpisodic: 5, maxFacts: 8, maxTasks: 3, maxConstraints: 10 },
9
+ handoff: { maxEpisodic: 5, maxFacts: 5, maxTasks: 8, maxConstraints: 10 },
10
+ deep: { maxEpisodic: 5, maxFacts: 10, maxTasks: 5, maxConstraints: 10 },
11
+ minimal: { maxEpisodic: 1, maxFacts: 2, maxTasks: 2, maxConstraints: 3 },
12
+ none: { maxEpisodic: 0, maxFacts: 0, maxTasks: 0, maxConstraints: 0 },
13
+ };
14
+ /**
15
+ * Resolves context limits from a mode preset + optional explicit overrides.
16
+ * Explicit params always take precedence over mode defaults.
17
+ * Unknown modes fall back to "default".
18
+ */
19
+ export function resolveContextLimits(input) {
20
+ const mode = input.mode;
21
+ const profile = mode && mode in CONTEXT_PROFILES
22
+ ? CONTEXT_PROFILES[mode]
23
+ : CONTEXT_PROFILES.default;
24
+ return {
25
+ maxEpisodic: input.maxEpisodic ?? profile.maxEpisodic,
26
+ maxFacts: input.maxFacts ?? profile.maxFacts,
27
+ maxTasks: input.maxTasks ?? profile.maxTasks,
28
+ maxConstraints: input.maxConstraints ?? profile.maxConstraints,
29
+ };
30
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-profiles.js","sourceRoot":"","sources":["../../src/tools/context-profiles.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,OAAO,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,cAAc,EAAE,EAAE,EAAE;IACzE,QAAQ,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,cAAc,EAAE,EAAE,EAAE;IAC1E,QAAQ,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,cAAc,EAAE,EAAE,EAAE;IAC1E,OAAO,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,cAAc,EAAE,EAAE,EAAE;IACzE,IAAI,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,cAAc,EAAE,EAAE,EAAE;IACvE,OAAO,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,cAAc,EAAE,CAAC,EAAE;IACxE,IAAI,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,cAAc,EAAE,CAAC,EAAE;CAC7D,CAAC;AAUX;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAAC,KAMpC;IACC,MAAM,IAAI,GAAG,KAAK,CAAC,IAA+B,CAAC;IACnD,MAAM,OAAO,GACX,IAAI,IAAI,IAAI,IAAI,gBAAgB;QAC9B,CAAC,CAAC,gBAAgB,CAAC,IAAI,CAAC;QACxB,CAAC,CAAC,gBAAgB,CAAC,OAAO,CAAC;IAE/B,OAAO;QACL,WAAW,EAAE,KAAK,CAAC,WAAW,IAAI,OAAO,CAAC,WAAW;QACrD,QAAQ,EAAE,KAAK,CAAC,QAAQ,IAAI,OAAO,CAAC,QAAQ;QAC5C,QAAQ,EAAE,KAAK,CAAC,QAAQ,IAAI,OAAO,CAAC,QAAQ;QAC5C,cAAc,EAAE,KAAK,CAAC,cAAc,IAAI,OAAO,CAAC,cAAc;KAC/D,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { McpContext } from "../auth.js";
2
+ export declare function createNote(ctx: McpContext, vaultId: string, title: string, content: string, tags?: string[]): Promise<string>;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-note.d.ts","sourceRoot":"","sources":["../../src/tools/create-note.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAO7C,wBAAsB,UAAU,CAC9B,GAAG,EAAE,UAAU,EACf,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,IAAI,CAAC,EAAE,MAAM,EAAE,GACd,OAAO,CAAC,MAAM,CAAC,CAgEjB"}