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,256 @@
1
+ /**
2
+ * Task lifecycle — pure functions for task completion detection, plan decomposition,
3
+ * and activity-based status transitions.
4
+ *
5
+ * All functions are pure (no I/O, no DB calls). They follow the same pattern
6
+ * as extraction-prompt.ts: prompt builders + response parsers.
7
+ */
8
+ // ─── Stop words for keyword extraction ────────────────────────────────
9
+ const STOP_WORDS = new Set([
10
+ "the", "a", "an", "is", "are", "was", "were", "be", "been", "being",
11
+ "have", "has", "had", "do", "does", "did", "will", "would", "could",
12
+ "should", "may", "might", "shall", "can", "need", "must", "ought",
13
+ "i", "me", "my", "we", "our", "you", "your", "he", "she", "it",
14
+ "they", "them", "this", "that", "these", "those", "to", "of", "in",
15
+ "for", "on", "with", "at", "by", "from", "as", "into", "through",
16
+ "during", "before", "after", "above", "below", "and", "but", "or",
17
+ "nor", "not", "so", "if", "then", "than", "when", "where", "how",
18
+ "all", "each", "every", "both", "few", "more", "most", "some", "any",
19
+ "no", "only", "own", "same", "just", "now", "also", "very", "often",
20
+ ]);
21
+ // ─── buildTaskCompletionPrompt ────────────────────────────────────────
22
+ /**
23
+ * Build a prompt for LLM-based task completion detection.
24
+ * Gives the LLM the open tasks and session activity, asks it to determine
25
+ * which tasks are done based on evidence.
26
+ */
27
+ export function buildTaskCompletionPrompt(openTasks, sessionActivities) {
28
+ const taskLines = openTasks.map((t) => {
29
+ const doneWhen = t.doneWhen ? `doneWhen:${t.doneWhen}` : "doneWhen:null";
30
+ return `${t.id}|${t.title}|${doneWhen}|${t.status}`;
31
+ });
32
+ const activityLines = sessionActivities
33
+ .filter((a) => a.category === "write" || a.category === "search")
34
+ .slice(-20)
35
+ .map((a) => {
36
+ const time = a.timestamp.slice(11, 16);
37
+ return [a.tool, time, a.inputSummary ?? ""].filter(Boolean).join("|");
38
+ });
39
+ const prompt = [
40
+ "Tasks open:",
41
+ ...taskLines,
42
+ "",
43
+ "Session activity:",
44
+ ...(activityLines.length > 0 ? activityLines : ["(no write/search activity)"]),
45
+ "",
46
+ "For each task, determine completion. Return JSON array:",
47
+ '[{"id":"T1","done":true,"conf":0.9,"ev":"evidence string"}]',
48
+ "Only mark done when evidence DIRECTLY addresses the task's title or doneWhen criteria. conf 0-1.",
49
+ "If doneWhen is null, infer from title — but evidence must still be specific to that task.",
50
+ "",
51
+ "If you see completed work not matching any listed task, add:",
52
+ '{"id":"NEW","done":true,"conf":0.85,"ev":"evidence","title":"Descriptive task title with specifics"}',
53
+ "NEW task titles MUST be descriptive (10+ words) and capture WHAT was done and WHY.",
54
+ "GOOD: \"Implement conversation turn browsing UI with chat-like layout and keyword search\"",
55
+ "BAD: \"Session access features implementation\"",
56
+ "Return [] if no tasks completed and no new completed work detected.",
57
+ ].join("\n");
58
+ const systemPrompt = "You are a task completion detector. Given open tasks and session activity, " +
59
+ "determine which tasks are done. Be conservative — only mark a task as done " +
60
+ "when the session activity DIRECTLY addresses that specific task's title or " +
61
+ "doneWhen criteria. Do NOT force-match unrelated work to the closest task. " +
62
+ "If the session shows significant completed work that does NOT match any open " +
63
+ "task, report it as a NEW entry with a descriptive title. Return valid JSON only.";
64
+ return { prompt, systemPrompt };
65
+ }
66
+ // ─── parseTaskCompletionResult ────────────────────────────────────────
67
+ /**
68
+ * Parse LLM response into existing task completions + new discovered tasks.
69
+ * Entries with id="NEW" are routed to newTasks (require title field).
70
+ * Returns null on total parse failure.
71
+ */
72
+ export function parseTaskCompletionResult(text) {
73
+ if (!text || text.trim().length === 0)
74
+ return null;
75
+ const jsonStr = extractJsonArray(text);
76
+ if (!jsonStr)
77
+ return null;
78
+ let parsed;
79
+ try {
80
+ parsed = JSON.parse(jsonStr);
81
+ }
82
+ catch {
83
+ return null;
84
+ }
85
+ if (!Array.isArray(parsed))
86
+ return null;
87
+ const existingTasks = [];
88
+ const newTasks = [];
89
+ for (const item of parsed) {
90
+ if (typeof item !== "object" || item === null)
91
+ continue;
92
+ const rec = item;
93
+ const rawId = asString(rec.id) || asString(rec.taskId);
94
+ if (!rawId)
95
+ continue;
96
+ const completed = asBool(rec.done) ?? asBool(rec.completed);
97
+ if (completed === undefined)
98
+ continue;
99
+ let confidence = asNumber(rec.conf) ?? asNumber(rec.confidence) ?? 0;
100
+ confidence = Math.max(0, Math.min(1, confidence));
101
+ const evidence = asString(rec.ev) || asString(rec.evidence) || "";
102
+ if (rawId === "NEW") {
103
+ const title = asString(rec.title);
104
+ if (!title || !completed)
105
+ continue;
106
+ newTasks.push({ title, doneWhen: asString(rec.doneWhen), confidence, evidence });
107
+ }
108
+ else {
109
+ existingTasks.push({ taskId: rawId, completed, confidence, evidence });
110
+ }
111
+ }
112
+ return { existingTasks, newTasks };
113
+ }
114
+ // ─── matchTaskActivity ────────────────────────────────────────────────
115
+ /**
116
+ * Zero-cost keyword matching for auto-status transitions (todo → in_progress).
117
+ * Compares task title keywords against recent activity summaries.
118
+ * No LLM call — pure keyword overlap.
119
+ */
120
+ export function matchTaskActivity(task, recentActivities) {
121
+ if (recentActivities.length === 0) {
122
+ return { match: false, confidence: 0 };
123
+ }
124
+ const taskKeywords = extractKeywords(task.title);
125
+ if (taskKeywords.length === 0) {
126
+ return { match: false, confidence: 0 };
127
+ }
128
+ // Collect all text from write-category activities
129
+ const activityText = recentActivities
130
+ .filter((a) => a.category === "write" || a.category === "search")
131
+ .map((a) => [a.inputSummary, a.outputSummary].filter(Boolean).join(" "))
132
+ .join(" ")
133
+ .toLowerCase();
134
+ if (!activityText) {
135
+ return { match: false, confidence: 0 };
136
+ }
137
+ // Count keyword matches
138
+ let matches = 0;
139
+ for (const kw of taskKeywords) {
140
+ if (activityText.includes(kw)) {
141
+ matches++;
142
+ }
143
+ }
144
+ let confidence = matches / taskKeywords.length;
145
+ // Entity bonus: if task entities appear in activity text, boost confidence
146
+ const entities = task.entities ?? [];
147
+ for (const entity of entities) {
148
+ if (activityText.includes(entity.toLowerCase())) {
149
+ confidence = Math.min(1, confidence + 0.15);
150
+ }
151
+ }
152
+ const match = confidence >= 0.3;
153
+ return { match, confidence: match ? confidence : 0 };
154
+ }
155
+ // ─── buildPlanTasksPrompt ─────────────────────────────────────────────
156
+ /**
157
+ * Build a prompt for LLM-based plan decomposition into tasks.
158
+ */
159
+ export function buildPlanTasksPrompt(plan, existingTasks) {
160
+ const existingLines = existingTasks.length > 0
161
+ ? [
162
+ "Existing tasks (do NOT duplicate):",
163
+ ...existingTasks.map((t) => `- ${t.title} [${t.status}]`),
164
+ "",
165
+ ]
166
+ : [];
167
+ const prompt = [
168
+ "Plan to decompose:",
169
+ plan,
170
+ "",
171
+ ...existingLines,
172
+ "Break this plan into actionable tasks. Return JSON array:",
173
+ '[{"title":"Task title","description":"Optional details","doneWhen":"Completion criteria","priority":3}]',
174
+ "Each task needs a clear doneWhen — specific, verifiable criteria for completion.",
175
+ "Priority 1-5 (5=critical). Order tasks by execution sequence.",
176
+ "Do NOT create tasks that duplicate existing ones listed above.",
177
+ ].join("\n");
178
+ const systemPrompt = "You are a project planner. Decompose plans into actionable tasks with clear " +
179
+ "completion criteria. Each task should be independently completable and verifiable. " +
180
+ "Return valid JSON only.";
181
+ return { prompt, systemPrompt };
182
+ }
183
+ // ─── parsePlanTasksResult ─────────────────────────────────────────────
184
+ /**
185
+ * Parse LLM response into validated PlannedTask[].
186
+ * Returns null on total parse failure.
187
+ */
188
+ export function parsePlanTasksResult(text) {
189
+ if (!text || text.trim().length === 0)
190
+ return null;
191
+ const jsonStr = extractJsonArray(text);
192
+ if (!jsonStr)
193
+ return null;
194
+ let parsed;
195
+ try {
196
+ parsed = JSON.parse(jsonStr);
197
+ }
198
+ catch {
199
+ return null;
200
+ }
201
+ if (!Array.isArray(parsed))
202
+ return null;
203
+ const validated = [];
204
+ for (const item of parsed) {
205
+ if (typeof item !== "object" || item === null)
206
+ continue;
207
+ const rec = item;
208
+ const title = asString(rec.title);
209
+ if (!title)
210
+ continue;
211
+ const description = asString(rec.description);
212
+ const doneWhen = asString(rec.doneWhen) ?? "";
213
+ let priority = asNumber(rec.priority) ?? 3;
214
+ priority = Math.max(1, Math.min(5, Math.round(priority)));
215
+ validated.push({ title, description, doneWhen, priority });
216
+ }
217
+ return validated;
218
+ }
219
+ // ─── Helpers ──────────────────────────────────────────────────────────
220
+ function extractJsonArray(text) {
221
+ const trimmed = text.trim();
222
+ if (trimmed.startsWith("["))
223
+ return trimmed;
224
+ const fenceMatch = trimmed.match(/```(?:json)?\s*\n?([\s\S]*?)\n?\s*```/);
225
+ if (fenceMatch) {
226
+ const inner = fenceMatch[1].trim();
227
+ if (inner.startsWith("["))
228
+ return inner;
229
+ }
230
+ const arrayMatch = trimmed.match(/\[[\s\S]*\]/);
231
+ if (arrayMatch)
232
+ return arrayMatch[0];
233
+ return null;
234
+ }
235
+ function extractKeywords(text) {
236
+ return text
237
+ .toLowerCase()
238
+ .replace(/[^a-z0-9\s]/g, " ")
239
+ .split(/\s+/)
240
+ .filter((w) => w.length > 2 && !STOP_WORDS.has(w));
241
+ }
242
+ function asString(v) {
243
+ if (typeof v === "string" && v.length > 0)
244
+ return v;
245
+ return undefined;
246
+ }
247
+ function asNumber(v) {
248
+ if (typeof v === "number" && !Number.isNaN(v))
249
+ return v;
250
+ return undefined;
251
+ }
252
+ function asBool(v) {
253
+ if (typeof v === "boolean")
254
+ return v;
255
+ return undefined;
256
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-lifecycle.js","sourceRoot":"","sources":["../src/task-lifecycle.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import type { McpContext } from "../auth.js";
2
+ export declare function sendMessage(ctx: McpContext, input: {
3
+ targetId: string;
4
+ content: string;
5
+ senderId: string;
6
+ category?: string;
7
+ priority?: number;
8
+ subject?: string;
9
+ vaultId?: string;
10
+ expiresInDays?: number;
11
+ metadata?: Record<string, unknown>;
12
+ template?: string;
13
+ templateData?: Record<string, unknown>;
14
+ parentMessageId?: string;
15
+ }): Promise<string>;
16
+ export declare function ackMessage(ctx: McpContext, input: {
17
+ messageId: string;
18
+ }): Promise<string>;
19
+ export declare function readMessages(ctx: McpContext, input: {
20
+ agentId: string;
21
+ status?: string;
22
+ category?: string;
23
+ limit?: number;
24
+ includeBroadcast?: boolean;
25
+ vaultId?: string;
26
+ }): Promise<string>;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-messages.d.ts","sourceRoot":"","sources":["../../src/tools/agent-messages.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAmD7C,wBAAsB,WAAW,CAC/B,GAAG,EAAE,UAAU,EACf,KAAK,EAAE;IACL,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvC,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B,GACA,OAAO,CAAC,MAAM,CAAC,CAmEjB;AAID,wBAAsB,UAAU,CAC9B,GAAG,EAAE,UAAU,EACf,KAAK,EAAE;IACL,SAAS,EAAE,MAAM,CAAC;CACnB,GACA,OAAO,CAAC,MAAM,CAAC,CAcjB;AAID,wBAAsB,YAAY,CAChC,GAAG,EAAE,UAAU,EACf,KAAK,EAAE;IACL,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,GACA,OAAO,CAAC,MAAM,CAAC,CAoCjB"}
@@ -0,0 +1,123 @@
1
+ import { encrypt, decrypt } from "../crypto.js";
2
+ import { insertAgentMessage, getAgentMessages, bulkUpdateMessageStatus, resolveThreadId, } from "../db.js";
3
+ // ─── Helpers ─────────────────────────────────────────────────────────────────
4
+ const MAX_CONTENT_LENGTH = 10_240;
5
+ const MAX_SUBJECT_LENGTH = 200;
6
+ function deriveTargetType(targetId) {
7
+ if (targetId === "*")
8
+ return "broadcast";
9
+ if (targetId === "user")
10
+ return "user";
11
+ return "agent";
12
+ }
13
+ function deriveSenderType(senderId) {
14
+ if (senderId === "user")
15
+ return "user";
16
+ if (senderId === "system")
17
+ return "system";
18
+ return "agent";
19
+ }
20
+ function decryptedMessage(row, content) {
21
+ return {
22
+ id: row.id,
23
+ senderType: row.sender_type,
24
+ senderId: row.sender_id,
25
+ targetType: row.target_type,
26
+ targetId: row.target_id,
27
+ category: row.category,
28
+ priority: row.priority,
29
+ subject: row.subject,
30
+ content,
31
+ status: row.status,
32
+ metadata: row.metadata,
33
+ createdAt: row.created_at,
34
+ deliveredAt: row.delivered_at,
35
+ acknowledgedAt: row.acknowledged_at,
36
+ };
37
+ }
38
+ // ─── sendMessage ─────────────────────────────────────────────────────────────
39
+ export async function sendMessage(ctx, input) {
40
+ // Validate
41
+ if (input.content.length > MAX_CONTENT_LENGTH) {
42
+ throw new Error(`Content exceeds maximum length of ${MAX_CONTENT_LENGTH} characters`);
43
+ }
44
+ if (input.subject && input.subject.length > MAX_SUBJECT_LENGTH) {
45
+ throw new Error(`Subject exceeds maximum length of ${MAX_SUBJECT_LENGTH} characters`);
46
+ }
47
+ // Encrypt content
48
+ const { ciphertext, iv } = await encrypt(input.content, ctx.masterKey);
49
+ // Derive types
50
+ const targetType = deriveTargetType(input.targetId);
51
+ const senderType = deriveSenderType(input.senderId);
52
+ // Compute expiration
53
+ let expiresAt;
54
+ if (input.expiresInDays) {
55
+ expiresAt = new Date(Date.now() + input.expiresInDays * 24 * 60 * 60 * 1000).toISOString();
56
+ }
57
+ // Merge template info into metadata if provided
58
+ let metadata = input.metadata ?? null;
59
+ if (input.template) {
60
+ metadata = {
61
+ ...(metadata ?? {}),
62
+ template: input.template,
63
+ templateData: input.templateData ?? {},
64
+ };
65
+ }
66
+ // Thread resolution
67
+ let threadId = null;
68
+ if (input.parentMessageId) {
69
+ threadId = await resolveThreadId(ctx.supabase, ctx.userId, input.parentMessageId);
70
+ }
71
+ const row = await insertAgentMessage(ctx.supabase, {
72
+ user_id: ctx.userId,
73
+ vault_id: input.vaultId ?? null,
74
+ sender_type: senderType,
75
+ sender_id: input.senderId,
76
+ target_type: targetType,
77
+ target_id: input.targetId,
78
+ category: input.category ?? "info",
79
+ priority: input.priority ?? 3,
80
+ subject: input.subject ?? null,
81
+ encrypted_content: ciphertext,
82
+ content_iv: iv,
83
+ expires_at: expiresAt ?? null,
84
+ metadata,
85
+ parent_message_id: input.parentMessageId ?? null,
86
+ thread_id: threadId,
87
+ });
88
+ return JSON.stringify({
89
+ messageId: row.id,
90
+ created: true,
91
+ targetId: input.targetId,
92
+ targetType,
93
+ category: input.category ?? "info",
94
+ }, null, 2);
95
+ }
96
+ // ─── ackMessage ──────────────────────────────────────────────────────────────
97
+ export async function ackMessage(ctx, input) {
98
+ await bulkUpdateMessageStatus(ctx.supabase, [input.messageId], ctx.userId, "acknowledged", { acknowledged_at: new Date().toISOString() });
99
+ return JSON.stringify({ messageId: input.messageId, acknowledged: true }, null, 2);
100
+ }
101
+ // ─── readMessages ────────────────────────────────────────────────────────────
102
+ export async function readMessages(ctx, input) {
103
+ const rows = await getAgentMessages(ctx.supabase, ctx.userId, input.agentId, {
104
+ status: input.status,
105
+ category: input.category,
106
+ limit: input.limit,
107
+ includeBroadcast: input.includeBroadcast,
108
+ vaultId: input.vaultId,
109
+ });
110
+ // Decrypt content for each message
111
+ const messages = await Promise.all(rows.map(async (row) => {
112
+ const content = await decrypt(row.encrypted_content, row.content_iv, ctx.masterKey);
113
+ return decryptedMessage(row, content);
114
+ }));
115
+ // Mark pending messages as delivered
116
+ const pendingIds = rows
117
+ .filter((r) => r.status === "pending")
118
+ .map((r) => r.id);
119
+ if (pendingIds.length > 0) {
120
+ await bulkUpdateMessageStatus(ctx.supabase, pendingIds, ctx.userId, "delivered", { delivered_at: new Date().toISOString() });
121
+ }
122
+ return JSON.stringify({ messages, total: messages.length }, null, 2);
123
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-messages.js","sourceRoot":"","sources":["../../src/tools/agent-messages.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EACL,kBAAkB,EAClB,gBAAgB,EAChB,uBAAuB,EACvB,eAAe,GAEhB,MAAM,UAAU,CAAC;AAElB,gFAAgF;AAEhF,MAAM,kBAAkB,GAAG,MAAM,CAAC;AAClC,MAAM,kBAAkB,GAAG,GAAG,CAAC;AAE/B,SAAS,gBAAgB,CAAC,QAAgB;IACxC,IAAI,QAAQ,KAAK,GAAG;QAAE,OAAO,WAAW,CAAC;IACzC,IAAI,QAAQ,KAAK,MAAM;QAAE,OAAO,MAAM,CAAC;IACvC,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,gBAAgB,CAAC,QAAgB;IACxC,IAAI,QAAQ,KAAK,MAAM;QAAE,OAAO,MAAM,CAAC;IACvC,IAAI,QAAQ,KAAK,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAC3C,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,gBAAgB,CACvB,GAAoB,EACpB,OAAe;IAEf,OAAO;QACL,EAAE,EAAE,GAAG,CAAC,EAAE;QACV,UAAU,EAAE,GAAG,CAAC,WAAW;QAC3B,QAAQ,EAAE,GAAG,CAAC,SAAS;QACvB,UAAU,EAAE,GAAG,CAAC,WAAW;QAC3B,QAAQ,EAAE,GAAG,CAAC,SAAS;QACvB,QAAQ,EAAE,GAAG,CAAC,QAAQ;QACtB,QAAQ,EAAE,GAAG,CAAC,QAAQ;QACtB,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,OAAO;QACP,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,QAAQ,EAAE,GAAG,CAAC,QAAQ;QACtB,SAAS,EAAE,GAAG,CAAC,UAAU;QACzB,WAAW,EAAE,GAAG,CAAC,YAAY;QAC7B,cAAc,EAAE,GAAG,CAAC,eAAe;KACpC,CAAC;AACJ,CAAC;AAED,gFAAgF;AAEhF,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,GAAe,EACf,KAaC;IAED,WAAW;IACX,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,kBAAkB,EAAE,CAAC;QAC9C,MAAM,IAAI,KAAK,CAAC,qCAAqC,kBAAkB,aAAa,CAAC,CAAC;IACxF,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,kBAAkB,EAAE,CAAC;QAC/D,MAAM,IAAI,KAAK,CAAC,qCAAqC,kBAAkB,aAAa,CAAC,CAAC;IACxF,CAAC;IAED,kBAAkB;IAClB,MAAM,EAAE,UAAU,EAAE,EAAE,EAAE,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC;IAEvE,eAAe;IACf,MAAM,UAAU,GAAG,gBAAgB,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IACpD,MAAM,UAAU,GAAG,gBAAgB,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAEpD,qBAAqB;IACrB,IAAI,SAA6B,CAAC;IAClC,IAAI,KAAK,CAAC,aAAa,EAAE,CAAC;QACxB,SAAS,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,aAAa,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;IAC7F,CAAC;IAED,gDAAgD;IAChD,IAAI,QAAQ,GAAG,KAAK,CAAC,QAAQ,IAAI,IAAI,CAAC;IACtC,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;QACnB,QAAQ,GAAG;YACT,GAAG,CAAC,QAAQ,IAAI,EAAE,CAAC;YACnB,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,YAAY,EAAE,KAAK,CAAC,YAAY,IAAI,EAAE;SACvC,CAAC;IACJ,CAAC;IAED,oBAAoB;IACpB,IAAI,QAAQ,GAAkB,IAAI,CAAC;IACnC,IAAI,KAAK,CAAC,eAAe,EAAE,CAAC;QAC1B,QAAQ,GAAG,MAAM,eAAe,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,eAAe,CAAC,CAAC;IACpF,CAAC;IAED,MAAM,GAAG,GAAG,MAAM,kBAAkB,CAAC,GAAG,CAAC,QAAQ,EAAE;QACjD,OAAO,EAAE,GAAG,CAAC,MAAM;QACnB,QAAQ,EAAE,KAAK,CAAC,OAAO,IAAI,IAAI;QAC/B,WAAW,EAAE,UAAU;QACvB,SAAS,EAAE,KAAK,CAAC,QAAQ;QACzB,WAAW,EAAE,UAAU;QACvB,SAAS,EAAE,KAAK,CAAC,QAAQ;QACzB,QAAQ,EAAE,KAAK,CAAC,QAAQ,IAAI,MAAM;QAClC,QAAQ,EAAE,KAAK,CAAC,QAAQ,IAAI,CAAC;QAC7B,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI,IAAI;QAC9B,iBAAiB,EAAE,UAAU;QAC7B,UAAU,EAAE,EAAE;QACd,UAAU,EAAE,SAAS,IAAI,IAAI;QAC7B,QAAQ;QACR,iBAAiB,EAAE,KAAK,CAAC,eAAe,IAAI,IAAI;QAChD,SAAS,EAAE,QAAQ;KACpB,CAAC,CAAC;IAEH,OAAO,IAAI,CAAC,SAAS,CACnB;QACE,SAAS,EAAE,GAAG,CAAC,EAAE;QACjB,OAAO,EAAE,IAAI;QACb,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,UAAU;QACV,QAAQ,EAAE,KAAK,CAAC,QAAQ,IAAI,MAAM;KACnC,EACD,IAAI,EACJ,CAAC,CACF,CAAC;AACJ,CAAC;AAED,gFAAgF;AAEhF,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,GAAe,EACf,KAEC;IAED,MAAM,uBAAuB,CAC3B,GAAG,CAAC,QAAQ,EACZ,CAAC,KAAK,CAAC,SAAS,CAAC,EACjB,GAAG,CAAC,MAAM,EACV,cAAc,EACd,EAAE,eAAe,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAC9C,CAAC;IAEF,OAAO,IAAI,CAAC,SAAS,CACnB,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,YAAY,EAAE,IAAI,EAAE,EAClD,IAAI,EACJ,CAAC,CACF,CAAC;AACJ,CAAC;AAED,gFAAgF;AAEhF,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,GAAe,EACf,KAOC;IAED,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,OAAO,EAAE;QAC3E,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,gBAAgB,EAAE,KAAK,CAAC,gBAAgB;QACxC,OAAO,EAAE,KAAK,CAAC,OAAO;KACvB,CAAC,CAAC;IAEH,mCAAmC;IACnC,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,GAAG,CAChC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;QACrB,MAAM,OAAO,GAAG,MAAM,OAAO,CAC3B,GAAG,CAAC,iBAAiB,EACrB,GAAG,CAAC,UAAU,EACd,GAAG,CAAC,SAAS,CACd,CAAC;QACF,OAAO,gBAAgB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IACxC,CAAC,CAAC,CACH,CAAC;IAEF,qCAAqC;IACrC,MAAM,UAAU,GAAG,IAAI;SACpB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC;SACrC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACpB,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1B,MAAM,uBAAuB,CAC3B,GAAG,CAAC,QAAQ,EACZ,UAAU,EACV,GAAG,CAAC,MAAM,EACV,WAAW,EACX,EAAE,YAAY,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAC3C,CAAC;IACJ,CAAC;IAED,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AACvE,CAAC"}
@@ -0,0 +1,24 @@
1
+ import type { McpContext } from "../auth.js";
2
+ export declare function createTask(ctx: McpContext, input: {
3
+ title: string;
4
+ description?: string;
5
+ vaultId?: string;
6
+ status?: string;
7
+ priority?: number;
8
+ agentId?: string;
9
+ agentRunId?: string;
10
+ assignedAgentId?: string;
11
+ sourceMemoryId?: string;
12
+ }): Promise<string>;
13
+ export declare function updateTask(ctx: McpContext, input: {
14
+ taskId: string;
15
+ status?: string;
16
+ priority?: number;
17
+ assignedAgentId?: string | null;
18
+ }): Promise<string>;
19
+ export declare function listTasks(ctx: McpContext, input: {
20
+ vaultId?: string;
21
+ status?: string;
22
+ assignedAgentId?: string;
23
+ limit?: number;
24
+ }): Promise<string>;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-tasks.d.ts","sourceRoot":"","sources":["../../src/tools/agent-tasks.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAuH7C,wBAAsB,UAAU,CAC9B,GAAG,EAAE,UAAU,EACf,KAAK,EAAE;IACL,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,GACA,OAAO,CAAC,MAAM,CAAC,CAqDjB;AAED,wBAAsB,UAAU,CAC9B,GAAG,EAAE,UAAU,EACf,KAAK,EAAE;IACL,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACjC,GACA,OAAO,CAAC,MAAM,CAAC,CAiCjB;AAED,wBAAsB,SAAS,CAC7B,GAAG,EAAE,UAAU,EACf,KAAK,EAAE;IACL,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GACA,OAAO,CAAC,MAAM,CAAC,CAyCjB"}
@@ -0,0 +1,162 @@
1
+ import { encrypt, decrypt } from "../crypto.js";
2
+ import { resolveVaultId } from "./resolve-vault-id.js";
3
+ import { getVault } from "../db.js";
4
+ import { sanitizeDbError } from "../error-sanitizer.js";
5
+ import { inferTaskStatus } from "../infer-task-status.js";
6
+ import { normalizeAgentId } from "../normalize-agent-id.js";
7
+ // ─── Types ───────────────────────────────────────────────────────────────────
8
+ const TASK_STATUSES = ["backlog", "todo", "in_progress", "done", "blocked"];
9
+ // ─── DB helpers ──────────────────────────────────────────────────────────────
10
+ async function insertTask(supabase, data) {
11
+ const { data: row, error } = await supabase
12
+ .from("agent_tasks")
13
+ .insert({
14
+ user_id: data.user_id,
15
+ vault_id: data.vault_id ?? null,
16
+ encrypted_title: data.encrypted_title,
17
+ title_iv: data.title_iv,
18
+ encrypted_description: data.encrypted_description ?? null,
19
+ description_iv: data.description_iv ?? null,
20
+ status: data.status ?? "todo",
21
+ priority: data.priority ?? 3,
22
+ agent_id: data.agent_id ?? null,
23
+ agent_run_id: data.agent_run_id ?? null,
24
+ assigned_agent_id: data.assigned_agent_id ?? null,
25
+ source_memory_id: data.source_memory_id ?? null,
26
+ })
27
+ .select("*")
28
+ .single();
29
+ if (error)
30
+ throw new Error(sanitizeDbError("insert task", error.message));
31
+ return row;
32
+ }
33
+ async function updateTaskRow(supabase, taskId, userId, updates) {
34
+ const { data, error } = await supabase
35
+ .from("agent_tasks")
36
+ .update({ ...updates, updated_at: new Date().toISOString() })
37
+ .eq("id", taskId)
38
+ .eq("user_id", userId)
39
+ .select("*")
40
+ .single();
41
+ if (error) {
42
+ if (error.code === "PGRST116")
43
+ throw new Error("Task not found");
44
+ throw new Error(sanitizeDbError("update task", error.message));
45
+ }
46
+ return data;
47
+ }
48
+ async function listTaskRows(supabase, userId, filters) {
49
+ const limit = filters?.limit ?? 100;
50
+ let query = supabase
51
+ .from("agent_tasks")
52
+ .select("*")
53
+ .eq("user_id", userId)
54
+ .order("updated_at", { ascending: false })
55
+ .limit(limit);
56
+ if (filters?.vaultId)
57
+ query = query.eq("vault_id", filters.vaultId);
58
+ if (filters?.status)
59
+ query = query.eq("status", filters.status);
60
+ if (filters?.assignedAgentId)
61
+ query = query.eq("assigned_agent_id", filters.assignedAgentId);
62
+ const { data, error } = await query;
63
+ if (error)
64
+ throw new Error(sanitizeDbError("list tasks", error.message));
65
+ return (data ?? []);
66
+ }
67
+ // ─── MCP tool functions ──────────────────────────────────────────────────────
68
+ export async function createTask(ctx, input) {
69
+ const scopedVaultId = resolveVaultId(ctx, input.vaultId) ?? null;
70
+ if (scopedVaultId) {
71
+ const vault = await getVault(ctx.supabase, ctx.userId, scopedVaultId);
72
+ if (!vault)
73
+ throw new Error(`Invalid vaultId: ${scopedVaultId}`);
74
+ }
75
+ // Validate status if provided
76
+ if (input.status && !TASK_STATUSES.includes(input.status)) {
77
+ throw new Error(`Invalid status "${input.status}". Must be one of: ${TASK_STATUSES.join(", ")}`);
78
+ }
79
+ // Infer status from title/description if caller left it as default "todo"
80
+ const effectiveStatus = inferTaskStatus(input.title, input.description, input.status) ?? input.status ?? "todo";
81
+ const encTitle = await encrypt(input.title, ctx.masterKey);
82
+ const encDesc = input.description
83
+ ? await encrypt(input.description, ctx.masterKey)
84
+ : null;
85
+ const normalizedAgentId = input.agentId
86
+ ? normalizeAgentId(input.agentId)
87
+ : null;
88
+ const row = await insertTask(ctx.supabase, {
89
+ user_id: ctx.userId,
90
+ vault_id: scopedVaultId,
91
+ encrypted_title: encTitle.ciphertext,
92
+ title_iv: encTitle.iv,
93
+ encrypted_description: encDesc?.ciphertext ?? null,
94
+ description_iv: encDesc?.iv ?? null,
95
+ status: effectiveStatus,
96
+ priority: input.priority ?? 3,
97
+ agent_id: normalizedAgentId,
98
+ agent_run_id: input.agentRunId ?? null,
99
+ assigned_agent_id: input.assignedAgentId ?? null,
100
+ source_memory_id: input.sourceMemoryId ?? null,
101
+ });
102
+ return JSON.stringify({
103
+ taskId: row.id,
104
+ created: true,
105
+ status: row.status,
106
+ priority: row.priority,
107
+ }, null, 2);
108
+ }
109
+ export async function updateTask(ctx, input) {
110
+ if (input.status && !TASK_STATUSES.includes(input.status)) {
111
+ throw new Error(`Invalid status "${input.status}". Must be one of: ${TASK_STATUSES.join(", ")}`);
112
+ }
113
+ const updates = {};
114
+ if (input.status !== undefined)
115
+ updates.status = input.status;
116
+ if (input.priority !== undefined)
117
+ updates.priority = input.priority;
118
+ if (input.assignedAgentId !== undefined)
119
+ updates.assigned_agent_id = input.assignedAgentId;
120
+ if (Object.keys(updates).length === 0) {
121
+ throw new Error("No fields to update. Provide status, priority, or assignedAgentId.");
122
+ }
123
+ const row = await updateTaskRow(ctx.supabase, input.taskId, ctx.userId, updates);
124
+ return JSON.stringify({
125
+ taskId: row.id,
126
+ updated: true,
127
+ status: row.status,
128
+ priority: row.priority,
129
+ }, null, 2);
130
+ }
131
+ export async function listTasks(ctx, input) {
132
+ const scopedVaultId = resolveVaultId(ctx, input.vaultId);
133
+ const rows = await listTaskRows(ctx.supabase, ctx.userId, {
134
+ vaultId: scopedVaultId,
135
+ status: input.status,
136
+ assignedAgentId: input.assignedAgentId,
137
+ limit: input.limit,
138
+ });
139
+ // Decrypt all titles/descriptions in parallel
140
+ const tasks = await Promise.all(rows.map(async (row) => {
141
+ const title = await decrypt(row.encrypted_title, row.title_iv, ctx.masterKey);
142
+ let description = null;
143
+ if (row.encrypted_description && row.description_iv) {
144
+ description = await decrypt(row.encrypted_description, row.description_iv, ctx.masterKey);
145
+ }
146
+ return {
147
+ id: row.id,
148
+ vaultId: row.vault_id,
149
+ title,
150
+ description,
151
+ status: row.status,
152
+ priority: row.priority,
153
+ agentId: row.agent_id,
154
+ agentRunId: row.agent_run_id,
155
+ assignedAgentId: row.assigned_agent_id,
156
+ sourceMemoryId: row.source_memory_id,
157
+ createdAt: row.created_at,
158
+ updatedAt: row.updated_at,
159
+ };
160
+ }));
161
+ return JSON.stringify({ tasks, count: tasks.length }, null, 2);
162
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-tasks.js","sourceRoot":"","sources":["../../src/tools/agent-tasks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { McpContext } from "../auth.js";
2
+ export declare function archiveMemory(ctx: McpContext, memoryId: string, archived?: boolean): Promise<string>;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"archive-memory.d.ts","sourceRoot":"","sources":["../../src/tools/archive-memory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAI7C,wBAAsB,aAAa,CACjC,GAAG,EAAE,UAAU,EACf,QAAQ,EAAE,MAAM,EAChB,QAAQ,UAAO,GACd,OAAO,CAAC,MAAM,CAAC,CAiBjB"}