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,153 @@
1
+ #!/usr/bin/env node
2
+ import { createHash } from "node:crypto";
3
+ import { initialize } from "../auth.js";
4
+ import { decrypt } from "../crypto.js";
5
+ import { replaceMemoryEmbeddings, updateMemory } from "../db.js";
6
+ import { generateEmbeddings } from "../openai.js";
7
+ const OPENAI_EMBEDDING_MODEL = "text-embedding-3-small";
8
+ const DEEPSEEK_EMBEDDING_MODEL = "deepseek-embedding";
9
+ const VECTOR_DIMS = 1536;
10
+ const CHARS_PER_TOKEN = 4;
11
+ const CHUNK_TARGET_CHARS = 2400;
12
+ const CHUNK_OVERLAP_CHARS = 400;
13
+ function estimateTokens(text) {
14
+ return Math.ceil(text.length / CHARS_PER_TOKEN);
15
+ }
16
+ function buildContentHash(raw) {
17
+ return createHash("sha256").update(raw, "utf8").digest("hex");
18
+ }
19
+ function chunkText(plaintext) {
20
+ const text = plaintext.trim();
21
+ if (!text)
22
+ return [];
23
+ if (text.length <= CHUNK_TARGET_CHARS)
24
+ return [{ text, index: 0 }];
25
+ const chunks = [];
26
+ let start = 0;
27
+ let idx = 0;
28
+ while (start < text.length) {
29
+ const end = Math.min(start + CHUNK_TARGET_CHARS, text.length);
30
+ chunks.push({ text: text.slice(start, end).trim(), index: idx++ });
31
+ if (end >= text.length)
32
+ break;
33
+ start = Math.max(0, end - CHUNK_OVERLAP_CHARS);
34
+ }
35
+ return chunks;
36
+ }
37
+ function parseLimitArg() {
38
+ const arg = process.argv.find((v) => v.startsWith("--limit="));
39
+ if (!arg)
40
+ return 200;
41
+ const value = Number(arg.split("=")[1]);
42
+ return Number.isFinite(value) && value > 0 ? Math.floor(value) : 200;
43
+ }
44
+ async function loadBackfillCandidates(ctx, limit) {
45
+ const { data, error } = await ctx.supabase
46
+ .from("memories")
47
+ .select("*")
48
+ .eq("user_id", ctx.userId)
49
+ .eq("is_archived", false)
50
+ .in("indexing_status", ["pending", "failed", "stale"])
51
+ .order("updated_at", { ascending: false })
52
+ .limit(limit);
53
+ if (error) {
54
+ throw new Error(`Failed to load candidate memories: ${error.message}`);
55
+ }
56
+ return (data ?? []);
57
+ }
58
+ async function main() {
59
+ const ctx = await initialize();
60
+ const limit = parseLimitArg();
61
+ const envApiKey = process.env.RLM_EMBEDDING_API_KEY ??
62
+ process.env.EMBEDDING_API_KEY ??
63
+ process.env.OPENAI_API_KEY;
64
+ const embeddingConfig = envApiKey
65
+ ? {
66
+ apiKey: envApiKey,
67
+ baseUrl: process.env.RLM_EMBEDDING_BASE_URL ?? process.env.EMBEDDING_BASE_URL ?? "https://api.openai.com/v1",
68
+ model: process.env.RLM_EMBEDDING_MODEL ?? process.env.EMBEDDING_MODEL ?? OPENAI_EMBEDDING_MODEL,
69
+ }
70
+ : ctx.openaiApiKey
71
+ ? {
72
+ apiKey: ctx.openaiApiKey,
73
+ baseUrl: "https://api.openai.com/v1",
74
+ model: OPENAI_EMBEDDING_MODEL,
75
+ }
76
+ : ctx.llmConfig
77
+ ? {
78
+ apiKey: ctx.llmConfig.apiKey,
79
+ baseUrl: ctx.llmConfig.baseUrl,
80
+ model: process.env.RLM_EMBEDDING_MODEL ?? DEEPSEEK_EMBEDDING_MODEL,
81
+ }
82
+ : null;
83
+ if (!embeddingConfig) {
84
+ throw new Error("No embedding-capable key found in MCP config (openaiApiKey or llmApiKey).");
85
+ }
86
+ const candidates = await loadBackfillCandidates(ctx, limit);
87
+ if (candidates.length === 0) {
88
+ process.stdout.write("No candidate memories found for backfill.\n");
89
+ return;
90
+ }
91
+ let ok = 0;
92
+ let failed = 0;
93
+ for (const memory of candidates) {
94
+ try {
95
+ const content = await decrypt(memory.encrypted_content, memory.content_iv, ctx.masterKey);
96
+ const summary = memory.encrypted_summary && memory.summary_iv
97
+ ? await decrypt(memory.encrypted_summary, memory.summary_iv, ctx.masterKey).catch(() => null)
98
+ : null;
99
+ const base = summary?.trim() ? `Summary: ${summary.trim()}\n\n${content.trim()}` : content.trim();
100
+ const chunks = chunkText(base);
101
+ if (chunks.length === 0) {
102
+ await updateMemory(ctx.supabase, memory.id, ctx.userId, {
103
+ indexing_status: "failed",
104
+ indexing_error: "no_chunks_generated",
105
+ });
106
+ failed += 1;
107
+ continue;
108
+ }
109
+ await updateMemory(ctx.supabase, memory.id, ctx.userId, {
110
+ indexing_status: "embedding",
111
+ indexing_error: null,
112
+ });
113
+ const vectors = await generateEmbeddings(chunks.map((c) => c.text), embeddingConfig.apiKey, {
114
+ baseUrl: embeddingConfig.baseUrl,
115
+ model: embeddingConfig.model,
116
+ });
117
+ const badVector = vectors.find((v) => v.length !== VECTOR_DIMS);
118
+ if (badVector) {
119
+ throw new Error(`embedding_dimensions_mismatch expected=${VECTOR_DIMS} got=${badVector.length} model=${embeddingConfig.model}`);
120
+ }
121
+ await replaceMemoryEmbeddings(ctx.supabase, {
122
+ memoryId: memory.id,
123
+ userId: ctx.userId,
124
+ embeddingModel: embeddingConfig.model,
125
+ contentHash: buildContentHash(chunks.map((c) => c.text).join("\n\n")),
126
+ rows: vectors.map((embedding, i) => ({
127
+ chunkIndex: chunks[i]?.index ?? i,
128
+ embedding,
129
+ tokenCount: estimateTokens(chunks[i]?.text ?? ""),
130
+ })),
131
+ });
132
+ await updateMemory(ctx.supabase, memory.id, ctx.userId, {
133
+ indexing_status: "ready",
134
+ indexing_error: null,
135
+ last_indexed_at: new Date().toISOString(),
136
+ });
137
+ ok += 1;
138
+ }
139
+ catch (error) {
140
+ const message = error instanceof Error ? error.message.slice(0, 2000) : "backfill_failed";
141
+ await updateMemory(ctx.supabase, memory.id, ctx.userId, {
142
+ indexing_status: "failed",
143
+ indexing_error: message,
144
+ });
145
+ failed += 1;
146
+ }
147
+ }
148
+ process.stdout.write(`Backfill complete. processed=${candidates.length} ready=${ok} failed=${failed}\n`);
149
+ }
150
+ main().catch((err) => {
151
+ process.stderr.write(`Backfill failed: ${err.message}\n`);
152
+ process.exit(1);
153
+ });
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backfill-memory-embeddings.js","sourceRoot":"","sources":["../../src/scripts/backfill-memory-embeddings.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,104 @@
1
+ /**
2
+ * Session buffer — tracks tool call activity during a local MCP session.
3
+ *
4
+ * The buffer accumulates tool calls (with truncated I/O summaries) so that
5
+ * when the session ends (idle timeout, stdin EOF, SIGTERM), we can generate
6
+ * a rule-based episodic summary or feed the activity log to an LLM for
7
+ * structured extraction.
8
+ *
9
+ * Buffer data is kept in-memory and periodically written to a JSON file
10
+ * at `~/.exovault-mcp/sessions/session-{agentRunId}.json` as a crash
11
+ * recovery mechanism.
12
+ */
13
+ export type ActivityCategory = "read" | "write" | "search" | "system";
14
+ export interface SessionActivity {
15
+ tool: string;
16
+ timestamp: string;
17
+ category: ActivityCategory;
18
+ inputSummary?: string;
19
+ outputSummary?: string;
20
+ }
21
+ export interface SessionBufferData {
22
+ agentRunId: string;
23
+ agentId: string;
24
+ startedAt: string;
25
+ vaultId: string;
26
+ activities: SessionActivity[];
27
+ memoriesWritten: string[];
28
+ lastActivityAt: string;
29
+ lastFlushedAt: string | null;
30
+ /** Rich transcript entries for auto-episodic generation (higher char limits than activity summaries). */
31
+ transcript: TranscriptEntry[];
32
+ }
33
+ /**
34
+ * A rich transcript entry capturing meaningful context from a tool call.
35
+ * Unlike SessionActivity (200-char summaries for lightweight tracking),
36
+ * transcript entries capture enough content for episodic generation.
37
+ */
38
+ export interface TranscriptEntry {
39
+ tool: string;
40
+ timestamp: string;
41
+ /** Human-readable summary of what this tool call did, with actual content. */
42
+ context: string;
43
+ }
44
+ /** Tool name → category mapping. */
45
+ export declare const TOOL_CATEGORIES: Record<string, ActivityCategory>;
46
+ export declare function categorizeTool(toolName: string): ActivityCategory;
47
+ export interface SessionBuffer {
48
+ recordActivity(tool: string, inputSummary?: string, outputSummary?: string): void;
49
+ /** Record a rich transcript entry for auto-episodic generation. */
50
+ recordTranscript(tool: string, context: string): void;
51
+ recordMemoryWrite(memoryId: string): void;
52
+ markFlushed(): void;
53
+ wasCheckpointed(): boolean;
54
+ getSearchCount(): number;
55
+ getWriteCount(): number;
56
+ getReadCount(): number;
57
+ getTotalCount(): number;
58
+ getData(): SessionBufferData;
59
+ }
60
+ export declare function createSessionBuffer(config: {
61
+ agentRunId: string;
62
+ agentId: string;
63
+ vaultId: string;
64
+ }): SessionBuffer;
65
+ /**
66
+ * Build a conversation turn from the session activity for auto-ingestion.
67
+ * Returns null if there's nothing meaningful to ingest (empty or system-only).
68
+ */
69
+ export declare function buildTurnContent(data: SessionBufferData): string | null;
70
+ /**
71
+ * Build a rule-based episodic summary from the session buffer.
72
+ * Used as a fallback when LLM extraction is skipped or budget-exhausted.
73
+ * Always available at $0.00.
74
+ *
75
+ * Synthesizes WHAT was discussed, explored, decided, and accomplished
76
+ * using tool call metadata (inputs + outputs).
77
+ */
78
+ export declare function buildRuleBasedEpisodic(data: SessionBufferData): string;
79
+ /**
80
+ * Determine if a tool call should generate a transcript entry.
81
+ * Only "rich" tools (writes, searches, graph, checkpoint) are worth capturing.
82
+ */
83
+ export declare function shouldTranscript(toolName: string): boolean;
84
+ /**
85
+ * Extract a human-readable context string from a tool call's args and result.
86
+ * Returns null if the tool shouldn't be transcribed.
87
+ *
88
+ * The args object is the raw tool input (not yet stringified).
89
+ * The resultText is the text content from the tool response.
90
+ */
91
+ export declare function extractToolContext(toolName: string, args: Record<string, unknown>, resultText?: string): string | null;
92
+ /**
93
+ * Minimum number of transcript entries to qualify for auto-episodic generation.
94
+ * Below this threshold, the session is too thin to be worth summarizing.
95
+ */
96
+ export declare const MIN_TRANSCRIPT_ENTRIES_FOR_EPISODIC = 3;
97
+ /**
98
+ * Build a narrative episodic summary from transcript entries.
99
+ * Used when the agent didn't call context_checkpoint but the session
100
+ * has enough rich tool context to generate a useful summary.
101
+ *
102
+ * Returns null if the transcript is too thin.
103
+ */
104
+ export declare function buildTranscriptEpisodic(data: SessionBufferData): string | null;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-buffer.d.ts","sourceRoot":"","sources":["../src/session-buffer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAEtE,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,eAAe,EAAE,CAAC;IAC9B,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,yGAAyG;IACzG,UAAU,EAAE,eAAe,EAAE,CAAC;CAC/B;AAED;;;;GAIG;AACH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,8EAA8E;IAC9E,OAAO,EAAE,MAAM,CAAC;CACjB;AAKD,oCAAoC;AACpC,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAoC5D,CAAC;AAEF,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,gBAAgB,CAEjE;AAOD,MAAM,WAAW,aAAa;IAC5B,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAClF,mEAAmE;IACnE,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACtD,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1C,WAAW,IAAI,IAAI,CAAC;IACpB,eAAe,IAAI,OAAO,CAAC;IAC3B,cAAc,IAAI,MAAM,CAAC;IACzB,aAAa,IAAI,MAAM,CAAC;IACxB,YAAY,IAAI,MAAM,CAAC;IACvB,aAAa,IAAI,MAAM,CAAC;IACxB,OAAO,IAAI,iBAAiB,CAAC;CAC9B;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE;IAC1C,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB,GAAG,aAAa,CA4EhB;AAUD;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,iBAAiB,GAAG,MAAM,GAAG,IAAI,CAkBvE;AAED;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,iBAAiB,GAAG,MAAM,CAiCtE;AAwID;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAE1D;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,UAAU,CAAC,EAAE,MAAM,GAClB,MAAM,GAAG,IAAI,CA0Ff;AAMD;;;GAGG;AACH,eAAO,MAAM,mCAAmC,IAAI,CAAC;AAErD;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,iBAAiB,GAAG,MAAM,GAAG,IAAI,CAkB9E"}