exovault-mcp-server 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/auth.d.ts +41 -0
- package/dist/auth.d.ts.map +1 -0
- package/dist/auth.js +236 -0
- package/dist/auth.js.map +1 -0
- package/dist/auto-session.d.ts +39 -0
- package/dist/auto-session.d.ts.map +1 -0
- package/dist/auto-session.js +128 -0
- package/dist/auto-session.js.map +1 -0
- package/dist/buffer-persistence.d.ts +35 -0
- package/dist/buffer-persistence.d.ts.map +1 -0
- package/dist/buffer-persistence.js +110 -0
- package/dist/buffer-persistence.js.map +1 -0
- package/dist/coerce-params.d.ts +36 -0
- package/dist/coerce-params.d.ts.map +1 -0
- package/dist/coerce-params.js +120 -0
- package/dist/coerce-params.js.map +1 -0
- package/dist/crypto.d.ts +39 -0
- package/dist/crypto.d.ts.map +1 -0
- package/dist/crypto.js +119 -0
- package/dist/crypto.js.map +1 -0
- package/dist/db.d.ts +350 -0
- package/dist/db.d.ts.map +1 -0
- package/dist/db.js +866 -0
- package/dist/db.js.map +1 -0
- package/dist/embedding-config.d.ts +11 -0
- package/dist/embedding-config.d.ts.map +1 -0
- package/dist/embedding-config.js +24 -0
- package/dist/embedding-config.js.map +1 -0
- package/dist/entity-extraction.d.ts +22 -0
- package/dist/entity-extraction.d.ts.map +1 -0
- package/dist/entity-extraction.js +140 -0
- package/dist/entity-extraction.js.map +1 -0
- package/dist/episodic-headline.d.ts +6 -0
- package/dist/episodic-headline.d.ts.map +1 -0
- package/dist/episodic-headline.js +62 -0
- package/dist/episodic-headline.js.map +1 -0
- package/dist/error-sanitizer.d.ts +20 -0
- package/dist/error-sanitizer.d.ts.map +1 -0
- package/dist/error-sanitizer.js +54 -0
- package/dist/error-sanitizer.js.map +1 -0
- package/dist/extraction-budget.d.ts +39 -0
- package/dist/extraction-budget.d.ts.map +1 -0
- package/dist/extraction-budget.js +122 -0
- package/dist/extraction-budget.js.map +1 -0
- package/dist/extraction-llm.d.ts +22 -0
- package/dist/extraction-llm.d.ts.map +1 -0
- package/dist/extraction-llm.js +32 -0
- package/dist/extraction-llm.js.map +1 -0
- package/dist/extraction-prompt.d.ts +40 -0
- package/dist/extraction-prompt.d.ts.map +1 -0
- package/dist/extraction-prompt.js +176 -0
- package/dist/extraction-prompt.js.map +1 -0
- package/dist/gateway-client.d.ts +303 -0
- package/dist/gateway-client.d.ts.map +1 -0
- package/dist/gateway-client.js +285 -0
- package/dist/gateway-client.js.map +1 -0
- package/dist/gateway-init.d.ts +32 -0
- package/dist/gateway-init.d.ts.map +1 -0
- package/dist/gateway-init.js +71 -0
- package/dist/gateway-init.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +1242 -0
- package/dist/index.js.map +1 -0
- package/dist/infer-task-status.d.ts +7 -0
- package/dist/infer-task-status.d.ts.map +1 -0
- package/dist/infer-task-status.js +23 -0
- package/dist/infer-task-status.js.map +1 -0
- package/dist/normalize-agent-id.d.ts +21 -0
- package/dist/normalize-agent-id.d.ts.map +1 -0
- package/dist/normalize-agent-id.js +54 -0
- package/dist/normalize-agent-id.js.map +1 -0
- package/dist/openai.d.ts +14 -0
- package/dist/openai.d.ts.map +1 -0
- package/dist/openai.js +43 -0
- package/dist/openai.js.map +1 -0
- package/dist/rlm/actions.d.ts +31 -0
- package/dist/rlm/actions.d.ts.map +1 -0
- package/dist/rlm/actions.js +241 -0
- package/dist/rlm/actions.js.map +1 -0
- package/dist/rlm/benchmark.d.ts +2 -0
- package/dist/rlm/benchmark.d.ts.map +1 -0
- package/dist/rlm/benchmark.js +215 -0
- package/dist/rlm/benchmark.js.map +1 -0
- package/dist/rlm/execute.d.ts +13 -0
- package/dist/rlm/execute.d.ts.map +1 -0
- package/dist/rlm/execute.js +366 -0
- package/dist/rlm/execute.js.map +1 -0
- package/dist/rlm/index.d.ts +6 -0
- package/dist/rlm/index.d.ts.map +1 -0
- package/dist/rlm/index.js +147 -0
- package/dist/rlm/index.js.map +1 -0
- package/dist/rlm/profiles.d.ts +9 -0
- package/dist/rlm/profiles.d.ts.map +1 -0
- package/dist/rlm/profiles.js +46 -0
- package/dist/rlm/profiles.js.map +1 -0
- package/dist/rlm/types.d.ts +98 -0
- package/dist/rlm/types.d.ts.map +1 -0
- package/dist/rlm/types.js +6 -0
- package/dist/rlm/types.js.map +1 -0
- package/dist/rlm/verify.d.ts +13 -0
- package/dist/rlm/verify.d.ts.map +1 -0
- package/dist/rlm/verify.js +58 -0
- package/dist/rlm/verify.js.map +1 -0
- package/dist/rlm/writeback.d.ts +7 -0
- package/dist/rlm/writeback.d.ts.map +1 -0
- package/dist/rlm/writeback.js +77 -0
- package/dist/rlm/writeback.js.map +1 -0
- package/dist/scripts/backfill-memory-embeddings.d.ts +2 -0
- package/dist/scripts/backfill-memory-embeddings.d.ts.map +1 -0
- package/dist/scripts/backfill-memory-embeddings.js +153 -0
- package/dist/scripts/backfill-memory-embeddings.js.map +1 -0
- package/dist/session-buffer.d.ts +104 -0
- package/dist/session-buffer.d.ts.map +1 -0
- package/dist/session-buffer.js +466 -0
- package/dist/session-buffer.js.map +1 -0
- package/dist/session-dedup.d.ts +30 -0
- package/dist/session-dedup.d.ts.map +1 -0
- package/dist/session-dedup.js +67 -0
- package/dist/session-dedup.js.map +1 -0
- package/dist/session-flush.d.ts +81 -0
- package/dist/session-flush.d.ts.map +1 -0
- package/dist/session-flush.js +169 -0
- package/dist/session-flush.js.map +1 -0
- package/dist/session-lifecycle.d.ts +72 -0
- package/dist/session-lifecycle.d.ts.map +1 -0
- package/dist/session-lifecycle.js +247 -0
- package/dist/session-lifecycle.js.map +1 -0
- package/dist/setup.d.ts +2 -0
- package/dist/setup.d.ts.map +1 -0
- package/dist/setup.js +260 -0
- package/dist/setup.js.map +1 -0
- package/dist/stopwords.d.ts +2 -0
- package/dist/stopwords.d.ts.map +1 -0
- package/dist/stopwords.js +20 -0
- package/dist/stopwords.js.map +1 -0
- package/dist/strip-html.d.ts +5 -0
- package/dist/strip-html.d.ts.map +1 -0
- package/dist/strip-html.js +35 -0
- package/dist/strip-html.js.map +1 -0
- package/dist/task-completion-flush.d.ts +36 -0
- package/dist/task-completion-flush.d.ts.map +1 -0
- package/dist/task-completion-flush.js +97 -0
- package/dist/task-completion-flush.js.map +1 -0
- package/dist/task-lifecycle-types.d.ts +13 -0
- package/dist/task-lifecycle-types.d.ts.map +1 -0
- package/dist/task-lifecycle-types.js +12 -0
- package/dist/task-lifecycle-types.js.map +1 -0
- package/dist/task-lifecycle.d.ts +78 -0
- package/dist/task-lifecycle.d.ts.map +1 -0
- package/dist/task-lifecycle.js +256 -0
- package/dist/task-lifecycle.js.map +1 -0
- package/dist/tools/agent-messages.d.ts +26 -0
- package/dist/tools/agent-messages.d.ts.map +1 -0
- package/dist/tools/agent-messages.js +123 -0
- package/dist/tools/agent-messages.js.map +1 -0
- package/dist/tools/agent-tasks.d.ts +24 -0
- package/dist/tools/agent-tasks.d.ts.map +1 -0
- package/dist/tools/agent-tasks.js +162 -0
- package/dist/tools/agent-tasks.js.map +1 -0
- package/dist/tools/archive-memory.d.ts +2 -0
- package/dist/tools/archive-memory.d.ts.map +1 -0
- package/dist/tools/archive-memory.js +19 -0
- package/dist/tools/archive-memory.js.map +1 -0
- package/dist/tools/blind-index.d.ts +29 -0
- package/dist/tools/blind-index.d.ts.map +1 -0
- package/dist/tools/blind-index.js +53 -0
- package/dist/tools/blind-index.js.map +1 -0
- package/dist/tools/cleanup-memories.d.ts +44 -0
- package/dist/tools/cleanup-memories.d.ts.map +1 -0
- package/dist/tools/cleanup-memories.js +126 -0
- package/dist/tools/cleanup-memories.js.map +1 -0
- package/dist/tools/context-checkpoint.d.ts +28 -0
- package/dist/tools/context-checkpoint.d.ts.map +1 -0
- package/dist/tools/context-checkpoint.js +140 -0
- package/dist/tools/context-checkpoint.js.map +1 -0
- package/dist/tools/context-profiles.d.ts +67 -0
- package/dist/tools/context-profiles.d.ts.map +1 -0
- package/dist/tools/context-profiles.js +30 -0
- package/dist/tools/context-profiles.js.map +1 -0
- package/dist/tools/create-note.d.ts +2 -0
- package/dist/tools/create-note.d.ts.map +1 -0
- package/dist/tools/create-note.js +60 -0
- package/dist/tools/create-note.js.map +1 -0
- package/dist/tools/create-vault.d.ts +5 -0
- package/dist/tools/create-vault.d.ts.map +1 -0
- package/dist/tools/create-vault.js +121 -0
- package/dist/tools/create-vault.js.map +1 -0
- package/dist/tools/decrypt-helpers.d.ts +31 -0
- package/dist/tools/decrypt-helpers.d.ts.map +1 -0
- package/dist/tools/decrypt-helpers.js +33 -0
- package/dist/tools/decrypt-helpers.js.map +1 -0
- package/dist/tools/delete-note.d.ts +2 -0
- package/dist/tools/delete-note.d.ts.map +1 -0
- package/dist/tools/delete-note.js +21 -0
- package/dist/tools/delete-note.js.map +1 -0
- package/dist/tools/explore-graph.d.ts +11 -0
- package/dist/tools/explore-graph.d.ts.map +1 -0
- package/dist/tools/explore-graph.js +169 -0
- package/dist/tools/explore-graph.js.map +1 -0
- package/dist/tools/get-related-memories.d.ts +2 -0
- package/dist/tools/get-related-memories.d.ts.map +1 -0
- package/dist/tools/get-related-memories.js +59 -0
- package/dist/tools/get-related-memories.js.map +1 -0
- package/dist/tools/knowledge-links.d.ts +17 -0
- package/dist/tools/knowledge-links.d.ts.map +1 -0
- package/dist/tools/knowledge-links.js +102 -0
- package/dist/tools/knowledge-links.js.map +1 -0
- package/dist/tools/list-active-agents.d.ts +5 -0
- package/dist/tools/list-active-agents.d.ts.map +1 -0
- package/dist/tools/list-active-agents.js +15 -0
- package/dist/tools/list-active-agents.js.map +1 -0
- package/dist/tools/list-notes.d.ts +2 -0
- package/dist/tools/list-notes.d.ts.map +1 -0
- package/dist/tools/list-notes.js +19 -0
- package/dist/tools/list-notes.js.map +1 -0
- package/dist/tools/list-vaults.d.ts +2 -0
- package/dist/tools/list-vaults.d.ts.map +1 -0
- package/dist/tools/list-vaults.js +19 -0
- package/dist/tools/list-vaults.js.map +1 -0
- package/dist/tools/mmr.d.ts +18 -0
- package/dist/tools/mmr.d.ts.map +1 -0
- package/dist/tools/mmr.js +67 -0
- package/dist/tools/mmr.js.map +1 -0
- package/dist/tools/read-memories.d.ts +2 -0
- package/dist/tools/read-memories.d.ts.map +1 -0
- package/dist/tools/read-memories.js +46 -0
- package/dist/tools/read-memories.js.map +1 -0
- package/dist/tools/read-note.d.ts +2 -0
- package/dist/tools/read-note.d.ts.map +1 -0
- package/dist/tools/read-note.js +35 -0
- package/dist/tools/read-note.js.map +1 -0
- package/dist/tools/read-notes.d.ts +6 -0
- package/dist/tools/read-notes.d.ts.map +1 -0
- package/dist/tools/read-notes.js +45 -0
- package/dist/tools/read-notes.js.map +1 -0
- package/dist/tools/resolve-vault-id.d.ts +6 -0
- package/dist/tools/resolve-vault-id.d.ts.map +1 -0
- package/dist/tools/resolve-vault-id.js +7 -0
- package/dist/tools/resolve-vault-id.js.map +1 -0
- package/dist/tools/rrf.d.ts +28 -0
- package/dist/tools/rrf.d.ts.map +1 -0
- package/dist/tools/rrf.js +19 -0
- package/dist/tools/rrf.js.map +1 -0
- package/dist/tools/search-and-read.d.ts +11 -0
- package/dist/tools/search-and-read.d.ts.map +1 -0
- package/dist/tools/search-and-read.js +208 -0
- package/dist/tools/search-and-read.js.map +1 -0
- package/dist/tools/search-memories.d.ts +13 -0
- package/dist/tools/search-memories.d.ts.map +1 -0
- package/dist/tools/search-memories.js +272 -0
- package/dist/tools/search-memories.js.map +1 -0
- package/dist/tools/search-notes.d.ts +2 -0
- package/dist/tools/search-notes.d.ts.map +1 -0
- package/dist/tools/search-notes.js +94 -0
- package/dist/tools/search-notes.js.map +1 -0
- package/dist/tools/semantic-search.d.ts +7 -0
- package/dist/tools/semantic-search.d.ts.map +1 -0
- package/dist/tools/semantic-search.js +85 -0
- package/dist/tools/semantic-search.js.map +1 -0
- package/dist/tools/session-start.d.ts +24 -0
- package/dist/tools/session-start.d.ts.map +1 -0
- package/dist/tools/session-start.js +256 -0
- package/dist/tools/session-start.js.map +1 -0
- package/dist/tools/stale-tasks.d.ts +22 -0
- package/dist/tools/stale-tasks.d.ts.map +1 -0
- package/dist/tools/stale-tasks.js +39 -0
- package/dist/tools/stale-tasks.js.map +1 -0
- package/dist/tools/temporal-decay.d.ts +21 -0
- package/dist/tools/temporal-decay.d.ts.map +1 -0
- package/dist/tools/temporal-decay.js +32 -0
- package/dist/tools/temporal-decay.js.map +1 -0
- package/dist/tools/update-memory.d.ts +19 -0
- package/dist/tools/update-memory.d.ts.map +1 -0
- package/dist/tools/update-memory.js +230 -0
- package/dist/tools/update-memory.js.map +1 -0
- package/dist/tools/update-note.d.ts +2 -0
- package/dist/tools/update-note.d.ts.map +1 -0
- package/dist/tools/update-note.js +79 -0
- package/dist/tools/update-note.js.map +1 -0
- package/dist/tools/vault-instruction-template.d.ts +17 -0
- package/dist/tools/vault-instruction-template.d.ts.map +1 -0
- package/dist/tools/vault-instruction-template.js +77 -0
- package/dist/tools/vault-instruction-template.js.map +1 -0
- package/dist/tools/wiki-link-sync.d.ts +34 -0
- package/dist/tools/wiki-link-sync.d.ts.map +1 -0
- package/dist/tools/wiki-link-sync.js +132 -0
- package/dist/tools/wiki-link-sync.js.map +1 -0
- package/dist/tools/wrap-tool-handler.d.ts +8 -0
- package/dist/tools/wrap-tool-handler.d.ts.map +1 -0
- package/dist/tools/wrap-tool-handler.js +32 -0
- package/dist/tools/wrap-tool-handler.js.map +1 -0
- package/dist/tools/write-memory.d.ts +34 -0
- package/dist/tools/write-memory.d.ts.map +1 -0
- package/dist/tools/write-memory.js +359 -0
- package/dist/tools/write-memory.js.map +1 -0
- package/dist/usage.d.ts +11 -0
- package/dist/usage.d.ts.map +1 -0
- package/dist/usage.js +38 -0
- package/dist/usage.js.map +1 -0
- package/dist/wiki-link-parser.d.ts +27 -0
- package/dist/wiki-link-parser.d.ts.map +1 -0
- package/dist/wiki-link-parser.js +93 -0
- package/dist/wiki-link-parser.js.map +1 -0
- package/package.json +38 -0
|
@@ -0,0 +1,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":"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"}
|
|
@@ -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 @@
|
|
|
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"}
|