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
package/dist/setup.js
ADDED
|
@@ -0,0 +1,260 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { createClient } from "@supabase/supabase-js";
|
|
3
|
+
import { createInterface } from "node:readline";
|
|
4
|
+
import { mkdir, writeFile } from "node:fs/promises";
|
|
5
|
+
import { join } from "node:path";
|
|
6
|
+
import { homedir } from "node:os";
|
|
7
|
+
import { parseArgs } from "node:util";
|
|
8
|
+
import { deriveWrappingKey, unwrapMasterKey, importMasterKey, bufferToHex, } from "./crypto.js";
|
|
9
|
+
const CONFIG_DIR = join(homedir(), ".exovault-mcp");
|
|
10
|
+
const CONFIG_FILE = join(CONFIG_DIR, "config.json");
|
|
11
|
+
function printUsage() {
|
|
12
|
+
console.log("Usage:");
|
|
13
|
+
console.log(" exovault-mcp setup --agent-key <key> [--api-url <url>] (gateway mode)");
|
|
14
|
+
console.log(" exovault-mcp setup --url <supabase-url> --key <anon-key> (direct mode)");
|
|
15
|
+
console.log();
|
|
16
|
+
console.log("Gateway mode (recommended):");
|
|
17
|
+
console.log(" --agent-key Agent key from ExoVault Connect Wizard (exv_...)");
|
|
18
|
+
console.log(" --api-url ExoVault API URL (default: https://exovault.co)");
|
|
19
|
+
console.log();
|
|
20
|
+
console.log("Direct mode:");
|
|
21
|
+
console.log(" --url Supabase project URL");
|
|
22
|
+
console.log(" --key Supabase anon key");
|
|
23
|
+
console.log();
|
|
24
|
+
console.log("Copy the full command from your ExoVault settings page.");
|
|
25
|
+
}
|
|
26
|
+
async function prompt(rl, question) {
|
|
27
|
+
return new Promise((resolve) => {
|
|
28
|
+
rl.question(question, (answer) => resolve(answer.trim()));
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
async function promptHidden(question) {
|
|
32
|
+
return new Promise((resolve) => {
|
|
33
|
+
const rl = createInterface({
|
|
34
|
+
input: process.stdin,
|
|
35
|
+
output: process.stdout,
|
|
36
|
+
});
|
|
37
|
+
const origWrite = rl._writeToOutput;
|
|
38
|
+
rl._writeToOutput = function (s) {
|
|
39
|
+
if (s === question) {
|
|
40
|
+
origWrite.call(rl, s);
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
origWrite.call(rl, "");
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
rl.question(question, (answer) => {
|
|
47
|
+
rl.close();
|
|
48
|
+
process.stdout.write("\n");
|
|
49
|
+
resolve(answer.trim());
|
|
50
|
+
});
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
async function setupGatewayMode(agentKey, apiUrl) {
|
|
54
|
+
const baseUrl = apiUrl ?? "https://exovault.co";
|
|
55
|
+
console.log("Setting up gateway mode...");
|
|
56
|
+
console.log(`API URL: ${baseUrl}`);
|
|
57
|
+
console.log();
|
|
58
|
+
// Validate the agent key by calling /api/agent/info
|
|
59
|
+
console.log("Validating agent key...");
|
|
60
|
+
try {
|
|
61
|
+
const res = await fetch(`${baseUrl}/api/agent/info`, {
|
|
62
|
+
headers: { Authorization: `Bearer ${agentKey}` },
|
|
63
|
+
});
|
|
64
|
+
if (!res.ok) {
|
|
65
|
+
const body = await res.text();
|
|
66
|
+
console.error(`Agent key validation failed (${res.status}): ${body}`);
|
|
67
|
+
process.exit(1);
|
|
68
|
+
}
|
|
69
|
+
const info = await res.json();
|
|
70
|
+
console.log(`Connected as integration: ${info.integrationId}`);
|
|
71
|
+
console.log(`Agent type: ${info.agentType}`);
|
|
72
|
+
console.log(`Scopes: ${info.scopes?.join(", ") ?? "all"}`);
|
|
73
|
+
if (info.vaultId) {
|
|
74
|
+
console.log(`Vault-restricted: ${info.vaultId}`);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
catch (err) {
|
|
78
|
+
console.error("Failed to connect to ExoVault API:", err instanceof Error ? err.message : err);
|
|
79
|
+
process.exit(1);
|
|
80
|
+
}
|
|
81
|
+
// Write minimal config
|
|
82
|
+
await mkdir(CONFIG_DIR, { recursive: true, mode: 0o700 });
|
|
83
|
+
const config = {
|
|
84
|
+
agentKey,
|
|
85
|
+
apiUrl: baseUrl,
|
|
86
|
+
};
|
|
87
|
+
await writeFile(CONFIG_FILE, JSON.stringify(config, null, 2), {
|
|
88
|
+
encoding: "utf-8",
|
|
89
|
+
mode: 0o600,
|
|
90
|
+
});
|
|
91
|
+
console.log();
|
|
92
|
+
console.log(`Config saved to: ${CONFIG_FILE}`);
|
|
93
|
+
// Print Claude Code config snippet
|
|
94
|
+
console.log();
|
|
95
|
+
console.log("Add this to your ~/.claude/settings.json (mcpServers section):");
|
|
96
|
+
console.log();
|
|
97
|
+
console.log(JSON.stringify({
|
|
98
|
+
mcpServers: {
|
|
99
|
+
exovault: {
|
|
100
|
+
command: "npx",
|
|
101
|
+
args: ["exovault-mcp"],
|
|
102
|
+
},
|
|
103
|
+
},
|
|
104
|
+
}, null, 2));
|
|
105
|
+
console.log();
|
|
106
|
+
console.log("Setup complete! Restart Claude Code to connect.");
|
|
107
|
+
}
|
|
108
|
+
async function main() {
|
|
109
|
+
// Parse CLI args
|
|
110
|
+
let supabaseUrl;
|
|
111
|
+
let supabaseAnonKey;
|
|
112
|
+
let agentKey;
|
|
113
|
+
let apiUrl;
|
|
114
|
+
try {
|
|
115
|
+
const { values } = parseArgs({
|
|
116
|
+
options: {
|
|
117
|
+
url: { type: "string" },
|
|
118
|
+
key: { type: "string" },
|
|
119
|
+
"agent-key": { type: "string" },
|
|
120
|
+
"api-url": { type: "string" },
|
|
121
|
+
help: { type: "boolean", short: "h" },
|
|
122
|
+
},
|
|
123
|
+
strict: true,
|
|
124
|
+
});
|
|
125
|
+
if (values.help) {
|
|
126
|
+
printUsage();
|
|
127
|
+
process.exit(0);
|
|
128
|
+
}
|
|
129
|
+
agentKey = values["agent-key"];
|
|
130
|
+
apiUrl = values["api-url"];
|
|
131
|
+
supabaseUrl = values.url;
|
|
132
|
+
supabaseAnonKey = values.key;
|
|
133
|
+
// Validate: either --agent-key OR (--url + --key)
|
|
134
|
+
if (!agentKey && (!supabaseUrl || !supabaseAnonKey)) {
|
|
135
|
+
console.error("Error: Provide --agent-key (gateway mode) or --url + --key (direct mode).\n");
|
|
136
|
+
printUsage();
|
|
137
|
+
process.exit(1);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
catch {
|
|
141
|
+
console.error("Error: Invalid arguments.\n");
|
|
142
|
+
printUsage();
|
|
143
|
+
process.exit(1);
|
|
144
|
+
}
|
|
145
|
+
console.log("╔════════════════════════════════════════╗");
|
|
146
|
+
console.log("║ ExoVault MCP Server — Setup Wizard ║");
|
|
147
|
+
console.log("╚════════════════════════════════════════╝");
|
|
148
|
+
console.log();
|
|
149
|
+
// Gateway mode: validate key and write minimal config
|
|
150
|
+
if (agentKey) {
|
|
151
|
+
return setupGatewayMode(agentKey, apiUrl);
|
|
152
|
+
}
|
|
153
|
+
// Direct mode — supabaseUrl and supabaseAnonKey are guaranteed set
|
|
154
|
+
console.log("Sign in with your ExoVault account.");
|
|
155
|
+
console.log();
|
|
156
|
+
const rl = createInterface({
|
|
157
|
+
input: process.stdin,
|
|
158
|
+
output: process.stdout,
|
|
159
|
+
});
|
|
160
|
+
try {
|
|
161
|
+
const email = await prompt(rl, "Email: ");
|
|
162
|
+
rl.close();
|
|
163
|
+
const password = await promptHidden("Password: ");
|
|
164
|
+
console.log();
|
|
165
|
+
console.log("Authenticating...");
|
|
166
|
+
const supabase = createClient(supabaseUrl, supabaseAnonKey);
|
|
167
|
+
const { data: authData, error: authError } = await supabase.auth.signInWithPassword({ email, password });
|
|
168
|
+
if (authError || !authData.session) {
|
|
169
|
+
console.error("Authentication failed:", authError?.message ?? "Unknown error");
|
|
170
|
+
process.exit(1);
|
|
171
|
+
}
|
|
172
|
+
console.log("Authenticated as:", authData.user.email);
|
|
173
|
+
// Fetch encryption params
|
|
174
|
+
const { data: userRow, error: userError } = await supabase
|
|
175
|
+
.from("users")
|
|
176
|
+
.select("encryption_salt, kdf_iterations, wrapped_key, wrapped_key_iv")
|
|
177
|
+
.eq("id", authData.user.id)
|
|
178
|
+
.single();
|
|
179
|
+
if (userError || !userRow) {
|
|
180
|
+
console.error("Failed to fetch user encryption data:", userError?.message);
|
|
181
|
+
process.exit(1);
|
|
182
|
+
}
|
|
183
|
+
const { encryption_salt, kdf_iterations, wrapped_key, wrapped_key_iv } = userRow;
|
|
184
|
+
if (!encryption_salt || !wrapped_key || !wrapped_key_iv) {
|
|
185
|
+
console.error("Encryption not configured for this account. Set up encryption in ExoVault web app first.");
|
|
186
|
+
process.exit(1);
|
|
187
|
+
}
|
|
188
|
+
// Derive wrapping key and unwrap MEK
|
|
189
|
+
console.log("Deriving encryption key (this may take a moment)...");
|
|
190
|
+
const wrappingKey = await deriveWrappingKey(password, encryption_salt, kdf_iterations);
|
|
191
|
+
const mekBytes = await unwrapMasterKey(wrapped_key, wrapped_key_iv, wrappingKey);
|
|
192
|
+
// Verify MEK can be imported
|
|
193
|
+
await importMasterKey(mekBytes);
|
|
194
|
+
console.log("Master key verified successfully.");
|
|
195
|
+
// Write config
|
|
196
|
+
await mkdir(CONFIG_DIR, { recursive: true, mode: 0o700 });
|
|
197
|
+
// Optional: OpenAI API key for semantic search
|
|
198
|
+
console.log();
|
|
199
|
+
const rl2 = createInterface({
|
|
200
|
+
input: process.stdin,
|
|
201
|
+
output: process.stdout,
|
|
202
|
+
});
|
|
203
|
+
const openaiApiKey = await prompt(rl2, "OpenAI API key (optional, for semantic search — press Enter to skip): ");
|
|
204
|
+
rl2.close();
|
|
205
|
+
const config = {
|
|
206
|
+
supabaseUrl: supabaseUrl,
|
|
207
|
+
supabaseAnonKey: supabaseAnonKey,
|
|
208
|
+
accessToken: authData.session.access_token,
|
|
209
|
+
refreshToken: authData.session.refresh_token,
|
|
210
|
+
mekHex: bufferToHex(mekBytes),
|
|
211
|
+
};
|
|
212
|
+
if (openaiApiKey) {
|
|
213
|
+
config.openaiApiKey = openaiApiKey;
|
|
214
|
+
console.log("OpenAI API key saved (enables semantic_search and search_and_read tools).");
|
|
215
|
+
}
|
|
216
|
+
else {
|
|
217
|
+
console.log("Skipped — semantic search tools will fall back to keyword-only mode.");
|
|
218
|
+
}
|
|
219
|
+
// Optional: LLM config for RLM controller / benchmark
|
|
220
|
+
console.log();
|
|
221
|
+
const rl3 = createInterface({
|
|
222
|
+
input: process.stdin,
|
|
223
|
+
output: process.stdout,
|
|
224
|
+
});
|
|
225
|
+
const llmApiKey = await prompt(rl3, "LLM API key (optional, for RLM tools/benchmark — press Enter to skip): ");
|
|
226
|
+
if (llmApiKey) {
|
|
227
|
+
const llmBaseUrlRaw = await prompt(rl3, "LLM base URL (optional, default https://api.deepseek.com): ");
|
|
228
|
+
const llmModelIdRaw = await prompt(rl3, "LLM model ID (optional, default deepseek-chat): ");
|
|
229
|
+
config.llmApiKey = llmApiKey;
|
|
230
|
+
config.llmBaseUrl = llmBaseUrlRaw || "https://api.deepseek.com";
|
|
231
|
+
config.llmModelId = llmModelIdRaw || "deepseek-chat";
|
|
232
|
+
console.log(`LLM config saved (${config.llmModelId} @ ${config.llmBaseUrl}) for RLM tools/benchmark.`);
|
|
233
|
+
}
|
|
234
|
+
else {
|
|
235
|
+
console.log("Skipped — RLM tools/benchmark will require manual llmApiKey config.");
|
|
236
|
+
}
|
|
237
|
+
rl3.close();
|
|
238
|
+
await writeFile(CONFIG_FILE, JSON.stringify(config, null, 2), { encoding: "utf-8", mode: 0o600 });
|
|
239
|
+
console.log(`Config saved to: ${CONFIG_FILE}`);
|
|
240
|
+
// Print Claude Code config snippet
|
|
241
|
+
console.log();
|
|
242
|
+
console.log("Add this to your ~/.claude/settings.json (mcpServers section):");
|
|
243
|
+
console.log();
|
|
244
|
+
console.log(JSON.stringify({
|
|
245
|
+
mcpServers: {
|
|
246
|
+
exovault: {
|
|
247
|
+
command: "npx",
|
|
248
|
+
args: ["exovault-mcp"],
|
|
249
|
+
},
|
|
250
|
+
},
|
|
251
|
+
}, null, 2));
|
|
252
|
+
console.log();
|
|
253
|
+
console.log("Setup complete! Restart Claude Code to connect.");
|
|
254
|
+
}
|
|
255
|
+
catch (err) {
|
|
256
|
+
console.error("Setup failed:", err instanceof Error ? err.message : err);
|
|
257
|
+
process.exit(1);
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
main();
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../src/setup.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stopwords.d.ts","sourceRoot":"","sources":["../src/stopwords.ts"],"names":[],"mappings":"AAAA,gEAAgE;AAChE,eAAO,MAAM,SAAS,aAkBpB,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/** Stopwords (EN + PL) — shared across keyword search tools. */
|
|
2
|
+
export const STOPWORDS = new Set([
|
|
3
|
+
"the", "is", "at", "which", "on", "a", "an", "and", "or", "but",
|
|
4
|
+
"in", "with", "to", "for", "of", "not", "no", "can", "had", "has",
|
|
5
|
+
"have", "it", "its", "was", "were", "be", "been", "do", "does",
|
|
6
|
+
"did", "will", "would", "could", "should", "may", "might", "shall",
|
|
7
|
+
"this", "that", "these", "those", "am", "are", "my", "your", "his",
|
|
8
|
+
"her", "our", "their", "who", "what", "where", "when", "why", "how",
|
|
9
|
+
"all", "each", "every", "both", "few", "more", "most", "other",
|
|
10
|
+
"some", "such", "than", "too", "very", "just", "about", "if", "then",
|
|
11
|
+
"so", "up", "out", "from", "by", "as", "into", "also", "he", "she",
|
|
12
|
+
"we", "they", "me", "him", "us", "them",
|
|
13
|
+
"to", "jest", "się", "nie", "na", "co", "jak", "tak", "za", "od",
|
|
14
|
+
"do", "po", "ale", "czy", "już", "też", "ten", "ta", "te", "tym",
|
|
15
|
+
"tej", "tego", "tych", "tym", "są", "był", "była", "było", "być",
|
|
16
|
+
"ma", "mi", "go", "mu", "ich", "je", "ją", "jej", "jaki", "jaka",
|
|
17
|
+
"jakie", "kto", "gdzie", "kiedy", "dlaczego", "ile", "bardzo",
|
|
18
|
+
"tylko", "jeszcze", "przez", "przy", "oraz", "lub", "ani", "więc",
|
|
19
|
+
"ze", "we", "że", "albo", "bez", "nad", "pod", "przed",
|
|
20
|
+
]);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stopwords.js","sourceRoot":"","sources":["../src/stopwords.ts"],"names":[],"mappings":"AAAA,gEAAgE;AAChE,MAAM,CAAC,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC;IAC/B,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK;IAC/D,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK;IACjE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;IAC9D,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO;IAClE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK;IAClE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK;IACnE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO;IAC9D,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM;IACpE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK;IAClE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM;IACvC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI;IAChE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK;IAChE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK;IAChE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM;IAChE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ;IAC7D,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM;IACjE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO;CACvD,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"strip-html.d.ts","sourceRoot":"","sources":["../src/strip-html.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CA8B9C"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Strips HTML tags and decodes common entities.
|
|
3
|
+
* Ported from src/lib/chunking/strip-html.ts.
|
|
4
|
+
*/
|
|
5
|
+
export function stripHtml(html) {
|
|
6
|
+
return html
|
|
7
|
+
// Table pre-processing: unwrap <p> inside cells
|
|
8
|
+
.replace(/<(t[dh])\b[^>]*>\s*<p>/gi, "<$1>")
|
|
9
|
+
.replace(/<\/p>\s*<\/(t[dh])>/gi, "</$1>")
|
|
10
|
+
// Table structure: cells → " | ", rows → newline
|
|
11
|
+
.replace(/<\/t[dh]>\s*<t[dh]\b[^>]*>/gi, " | ")
|
|
12
|
+
.replace(/<\/t[dh]>/gi, "")
|
|
13
|
+
.replace(/<\/tr>/gi, "\n")
|
|
14
|
+
.replace(/<\/?(?:table|thead|tbody|tfoot|colgroup|col)\b[^>]*>/gi, "")
|
|
15
|
+
// Block elements → newlines
|
|
16
|
+
.replace(/<br\s*\/?>/gi, "\n")
|
|
17
|
+
.replace(/<\/p>/gi, "\n")
|
|
18
|
+
.replace(/<\/li>/gi, "\n")
|
|
19
|
+
.replace(/<\/div>/gi, "\n")
|
|
20
|
+
.replace(/<\/h[1-6]>/gi, "\n")
|
|
21
|
+
// Strip all remaining tags
|
|
22
|
+
.replace(/<[^>]*>/g, "")
|
|
23
|
+
// Decode entities
|
|
24
|
+
.replace(/&/g, "&")
|
|
25
|
+
.replace(/</g, "<")
|
|
26
|
+
.replace(/>/g, ">")
|
|
27
|
+
.replace(/"/g, '"')
|
|
28
|
+
.replace(/'/g, "'")
|
|
29
|
+
.replace(/ /g, " ")
|
|
30
|
+
// Clean up
|
|
31
|
+
.replace(/[ \t]+\|/g, " |")
|
|
32
|
+
.replace(/\|[ \t]+/g, "| ")
|
|
33
|
+
.replace(/\n{3,}/g, "\n\n")
|
|
34
|
+
.trim();
|
|
35
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"strip-html.js","sourceRoot":"","sources":["../src/strip-html.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,UAAU,SAAS,CAAC,IAAY;IACpC,OAAO,IAAI;QACT,gDAAgD;SAC/C,OAAO,CAAC,0BAA0B,EAAE,MAAM,CAAC;SAC3C,OAAO,CAAC,uBAAuB,EAAE,OAAO,CAAC;QAC1C,iDAAiD;SAChD,OAAO,CAAC,8BAA8B,EAAE,KAAK,CAAC;SAC9C,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC;SAC1B,OAAO,CAAC,UAAU,EAAE,IAAI,CAAC;SACzB,OAAO,CAAC,wDAAwD,EAAE,EAAE,CAAC;QACtE,4BAA4B;SAC3B,OAAO,CAAC,cAAc,EAAE,IAAI,CAAC;SAC7B,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC;SACxB,OAAO,CAAC,UAAU,EAAE,IAAI,CAAC;SACzB,OAAO,CAAC,WAAW,EAAE,IAAI,CAAC;SAC1B,OAAO,CAAC,cAAc,EAAE,IAAI,CAAC;QAC9B,2BAA2B;SAC1B,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC;QACxB,kBAAkB;SACjB,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC;SACtB,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC;SACrB,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC;SACrB,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC;SACvB,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC;SACtB,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC;QACxB,WAAW;SACV,OAAO,CAAC,WAAW,EAAE,IAAI,CAAC;SAC1B,OAAO,CAAC,WAAW,EAAE,IAAI,CAAC;SAC1B,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC;SAC1B,IAAI,EAAE,CAAC;AACZ,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Task completion flush — wires task-lifecycle pure functions into the
|
|
3
|
+
* session flush pipeline.
|
|
4
|
+
*
|
|
5
|
+
* Called at session end (idle, stdin EOF, SIGTERM) to detect completed tasks
|
|
6
|
+
* based on session activity evidence.
|
|
7
|
+
*/
|
|
8
|
+
import type { SessionBufferData } from "./session-buffer.js";
|
|
9
|
+
import type { ExtractionClient } from "./extraction-llm.js";
|
|
10
|
+
import type { TaskLifecycleSettings } from "./task-lifecycle-types.js";
|
|
11
|
+
import { type OpenTask } from "./task-lifecycle.js";
|
|
12
|
+
export interface TaskCompletionFlushConfig {
|
|
13
|
+
openTasks: OpenTask[];
|
|
14
|
+
sessionData: SessionBufferData;
|
|
15
|
+
extractionClient: ExtractionClient;
|
|
16
|
+
updateTaskFn: (taskId: string, updates: {
|
|
17
|
+
status: string;
|
|
18
|
+
completionSource: string;
|
|
19
|
+
completionEvidence: string;
|
|
20
|
+
}) => Promise<void>;
|
|
21
|
+
writeMemoryFn?: (content: string) => Promise<void>;
|
|
22
|
+
createCompletedTaskFn?: (task: {
|
|
23
|
+
title: string;
|
|
24
|
+
doneWhen?: string;
|
|
25
|
+
evidence: string;
|
|
26
|
+
}) => Promise<string | null>;
|
|
27
|
+
settings: TaskLifecycleSettings;
|
|
28
|
+
}
|
|
29
|
+
export interface TaskCompletionFlushResult {
|
|
30
|
+
completed: string[];
|
|
31
|
+
suggested: string[];
|
|
32
|
+
newTasksCreated: string[];
|
|
33
|
+
skipped: number;
|
|
34
|
+
error?: string;
|
|
35
|
+
}
|
|
36
|
+
export declare function flushTaskCompletions(config: TaskCompletionFlushConfig): Promise<TaskCompletionFlushResult>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-completion-flush.d.ts","sourceRoot":"","sources":["../src/task-completion-flush.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AACvE,OAAO,EAAwD,KAAK,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAI1G,MAAM,WAAW,yBAAyB;IACxC,SAAS,EAAE,QAAQ,EAAE,CAAC;IACtB,WAAW,EAAE,iBAAiB,CAAC;IAC/B,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,YAAY,EAAE,CACZ,MAAM,EAAE,MAAM,EACd,OAAO,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,gBAAgB,EAAE,MAAM,CAAC;QAAC,kBAAkB,EAAE,MAAM,CAAA;KAAE,KAC9E,OAAO,CAAC,IAAI,CAAC,CAAC;IACnB,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACnD,qBAAqB,CAAC,EAAE,CAAC,IAAI,EAAE;QAC7B,KAAK,EAAE,MAAM,CAAC;QACd,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,QAAQ,EAAE,MAAM,CAAC;KAClB,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC7B,QAAQ,EAAE,qBAAqB,CAAC;CACjC;AAED,MAAM,WAAW,yBAAyB;IACxC,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAMD,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,yBAAyB,GAChC,OAAO,CAAC,yBAAyB,CAAC,CAgGpC"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Task completion flush — wires task-lifecycle pure functions into the
|
|
3
|
+
* session flush pipeline.
|
|
4
|
+
*
|
|
5
|
+
* Called at session end (idle, stdin EOF, SIGTERM) to detect completed tasks
|
|
6
|
+
* based on session activity evidence.
|
|
7
|
+
*/
|
|
8
|
+
import { buildTaskCompletionPrompt, parseTaskCompletionResult } from "./task-lifecycle.js";
|
|
9
|
+
const MAX_OUTPUT_TOKENS = 400;
|
|
10
|
+
// ─── Main function ────────────────────────────────────────────────────
|
|
11
|
+
export async function flushTaskCompletions(config) {
|
|
12
|
+
const { openTasks, sessionData, extractionClient, updateTaskFn, writeMemoryFn, settings } = config;
|
|
13
|
+
const empty = { completed: [], suggested: [], newTasksCreated: [], skipped: 0 };
|
|
14
|
+
// Guard: manual mode or no tasks
|
|
15
|
+
if (settings.autoComplete === "manual" || openTasks.length === 0) {
|
|
16
|
+
return empty;
|
|
17
|
+
}
|
|
18
|
+
// Build prompt and call LLM
|
|
19
|
+
const { prompt, systemPrompt } = buildTaskCompletionPrompt(openTasks, sessionData.activities);
|
|
20
|
+
let llmText;
|
|
21
|
+
try {
|
|
22
|
+
const result = await extractionClient.extract(`${systemPrompt}\n\n${prompt}`, MAX_OUTPUT_TOKENS);
|
|
23
|
+
llmText = result.text;
|
|
24
|
+
}
|
|
25
|
+
catch (e) {
|
|
26
|
+
return { ...empty, error: e.message };
|
|
27
|
+
}
|
|
28
|
+
// Parse response
|
|
29
|
+
const parseResult = parseTaskCompletionResult(llmText);
|
|
30
|
+
if (!parseResult || (parseResult.existingTasks.length === 0 && parseResult.newTasks.length === 0)) {
|
|
31
|
+
return empty;
|
|
32
|
+
}
|
|
33
|
+
const completed = [];
|
|
34
|
+
const suggested = [];
|
|
35
|
+
const newTasksCreated = [];
|
|
36
|
+
let skipped = 0;
|
|
37
|
+
// Process existing task completions
|
|
38
|
+
for (const candidate of parseResult.existingTasks) {
|
|
39
|
+
if (!candidate.completed)
|
|
40
|
+
continue;
|
|
41
|
+
if (candidate.confidence < settings.highConfidenceThreshold) {
|
|
42
|
+
skipped++;
|
|
43
|
+
continue;
|
|
44
|
+
}
|
|
45
|
+
if (completed.length + suggested.length + newTasksCreated.length >= settings.maxAutoCompletionsPerSession) {
|
|
46
|
+
break;
|
|
47
|
+
}
|
|
48
|
+
if (settings.autoComplete === "auto") {
|
|
49
|
+
try {
|
|
50
|
+
await updateTaskFn(candidate.taskId, {
|
|
51
|
+
status: "done",
|
|
52
|
+
completionSource: "auto",
|
|
53
|
+
completionEvidence: candidate.evidence,
|
|
54
|
+
});
|
|
55
|
+
completed.push(candidate.taskId);
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
skipped++;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
else if (settings.autoComplete === "suggest" && writeMemoryFn) {
|
|
62
|
+
try {
|
|
63
|
+
await writeMemoryFn(`Task completion suggested: "${candidate.taskId}" appears done. ` +
|
|
64
|
+
`Evidence: ${candidate.evidence} (confidence: ${candidate.confidence.toFixed(2)})`);
|
|
65
|
+
suggested.push(candidate.taskId);
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
skipped++;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
// Process new completed tasks (unmatched work)
|
|
73
|
+
if (config.createCompletedTaskFn) {
|
|
74
|
+
for (const newTask of parseResult.newTasks) {
|
|
75
|
+
if (newTask.confidence < settings.highConfidenceThreshold) {
|
|
76
|
+
skipped++;
|
|
77
|
+
continue;
|
|
78
|
+
}
|
|
79
|
+
if (completed.length + suggested.length + newTasksCreated.length >= settings.maxAutoCompletionsPerSession) {
|
|
80
|
+
break;
|
|
81
|
+
}
|
|
82
|
+
try {
|
|
83
|
+
const newTaskId = await config.createCompletedTaskFn({
|
|
84
|
+
title: newTask.title,
|
|
85
|
+
doneWhen: newTask.doneWhen,
|
|
86
|
+
evidence: newTask.evidence,
|
|
87
|
+
});
|
|
88
|
+
if (newTaskId)
|
|
89
|
+
newTasksCreated.push(newTaskId);
|
|
90
|
+
}
|
|
91
|
+
catch {
|
|
92
|
+
skipped++;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
return { completed, suggested, newTasksCreated, skipped };
|
|
97
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-completion-flush.js","sourceRoot":"","sources":["../src/task-completion-flush.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared types for task lifecycle automation.
|
|
3
|
+
* Duplicated from src/lib/settings/types.ts for the MCP server package
|
|
4
|
+
* (which doesn't import from the Next.js app).
|
|
5
|
+
*/
|
|
6
|
+
export interface TaskLifecycleSettings {
|
|
7
|
+
autoComplete: "auto" | "suggest" | "manual";
|
|
8
|
+
autoStatusTransitions: boolean;
|
|
9
|
+
planToTasks: boolean;
|
|
10
|
+
highConfidenceThreshold: number;
|
|
11
|
+
maxAutoCompletionsPerSession: number;
|
|
12
|
+
}
|
|
13
|
+
export declare const DEFAULT_TASK_LIFECYCLE_SETTINGS: TaskLifecycleSettings;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-lifecycle-types.d.ts","sourceRoot":"","sources":["../src/task-lifecycle-types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,qBAAqB;IACpC,YAAY,EAAE,MAAM,GAAG,SAAS,GAAG,QAAQ,CAAC;IAC5C,qBAAqB,EAAE,OAAO,CAAC;IAC/B,WAAW,EAAE,OAAO,CAAC;IACrB,uBAAuB,EAAE,MAAM,CAAC;IAChC,4BAA4B,EAAE,MAAM,CAAC;CACtC;AAED,eAAO,MAAM,+BAA+B,EAAE,qBAM7C,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared types for task lifecycle automation.
|
|
3
|
+
* Duplicated from src/lib/settings/types.ts for the MCP server package
|
|
4
|
+
* (which doesn't import from the Next.js app).
|
|
5
|
+
*/
|
|
6
|
+
export const DEFAULT_TASK_LIFECYCLE_SETTINGS = {
|
|
7
|
+
autoComplete: "suggest",
|
|
8
|
+
autoStatusTransitions: true,
|
|
9
|
+
planToTasks: true,
|
|
10
|
+
highConfidenceThreshold: 0.8,
|
|
11
|
+
maxAutoCompletionsPerSession: 5,
|
|
12
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-lifecycle-types.js","sourceRoot":"","sources":["../src/task-lifecycle-types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAUH,MAAM,CAAC,MAAM,+BAA+B,GAA0B;IACpE,YAAY,EAAE,SAAS;IACvB,qBAAqB,EAAE,IAAI;IAC3B,WAAW,EAAE,IAAI;IACjB,uBAAuB,EAAE,GAAG;IAC5B,4BAA4B,EAAE,CAAC;CAChC,CAAC"}
|
|
@@ -0,0 +1,78 @@
|
|
|
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
|
+
import type { SessionActivity } from "./session-buffer.js";
|
|
9
|
+
export interface OpenTask {
|
|
10
|
+
id: string;
|
|
11
|
+
title: string;
|
|
12
|
+
doneWhen?: string;
|
|
13
|
+
status: string;
|
|
14
|
+
}
|
|
15
|
+
export interface TaskCompletionCandidate {
|
|
16
|
+
taskId: string;
|
|
17
|
+
completed: boolean;
|
|
18
|
+
confidence: number;
|
|
19
|
+
evidence: string;
|
|
20
|
+
}
|
|
21
|
+
export interface NewCompletedTask {
|
|
22
|
+
title: string;
|
|
23
|
+
doneWhen?: string;
|
|
24
|
+
confidence: number;
|
|
25
|
+
evidence: string;
|
|
26
|
+
}
|
|
27
|
+
export interface TaskCompletionParseResult {
|
|
28
|
+
existingTasks: TaskCompletionCandidate[];
|
|
29
|
+
newTasks: NewCompletedTask[];
|
|
30
|
+
}
|
|
31
|
+
export interface PlannedTask {
|
|
32
|
+
title: string;
|
|
33
|
+
description?: string;
|
|
34
|
+
doneWhen: string;
|
|
35
|
+
priority: number;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Build a prompt for LLM-based task completion detection.
|
|
39
|
+
* Gives the LLM the open tasks and session activity, asks it to determine
|
|
40
|
+
* which tasks are done based on evidence.
|
|
41
|
+
*/
|
|
42
|
+
export declare function buildTaskCompletionPrompt(openTasks: OpenTask[], sessionActivities: SessionActivity[]): {
|
|
43
|
+
prompt: string;
|
|
44
|
+
systemPrompt: string;
|
|
45
|
+
};
|
|
46
|
+
/**
|
|
47
|
+
* Parse LLM response into existing task completions + new discovered tasks.
|
|
48
|
+
* Entries with id="NEW" are routed to newTasks (require title field).
|
|
49
|
+
* Returns null on total parse failure.
|
|
50
|
+
*/
|
|
51
|
+
export declare function parseTaskCompletionResult(text: string): TaskCompletionParseResult | null;
|
|
52
|
+
/**
|
|
53
|
+
* Zero-cost keyword matching for auto-status transitions (todo → in_progress).
|
|
54
|
+
* Compares task title keywords against recent activity summaries.
|
|
55
|
+
* No LLM call — pure keyword overlap.
|
|
56
|
+
*/
|
|
57
|
+
export declare function matchTaskActivity(task: {
|
|
58
|
+
title: string;
|
|
59
|
+
entities?: string[];
|
|
60
|
+
}, recentActivities: SessionActivity[]): {
|
|
61
|
+
match: boolean;
|
|
62
|
+
confidence: number;
|
|
63
|
+
};
|
|
64
|
+
/**
|
|
65
|
+
* Build a prompt for LLM-based plan decomposition into tasks.
|
|
66
|
+
*/
|
|
67
|
+
export declare function buildPlanTasksPrompt(plan: string, existingTasks: Array<{
|
|
68
|
+
title: string;
|
|
69
|
+
status: string;
|
|
70
|
+
}>): {
|
|
71
|
+
prompt: string;
|
|
72
|
+
systemPrompt: string;
|
|
73
|
+
};
|
|
74
|
+
/**
|
|
75
|
+
* Parse LLM response into validated PlannedTask[].
|
|
76
|
+
* Returns null on total parse failure.
|
|
77
|
+
*/
|
|
78
|
+
export declare function parsePlanTasksResult(text: string): PlannedTask[] | null;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-lifecycle.d.ts","sourceRoot":"","sources":["../src/task-lifecycle.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAI3D,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,yBAAyB;IACxC,aAAa,EAAE,uBAAuB,EAAE,CAAC;IACzC,QAAQ,EAAE,gBAAgB,EAAE,CAAC;CAC9B;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAmBD;;;;GAIG;AACH,wBAAgB,yBAAyB,CACvC,SAAS,EAAE,QAAQ,EAAE,EACrB,iBAAiB,EAAE,eAAe,EAAE,GACnC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,CA2C1C;AAID;;;;GAIG;AACH,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,MAAM,GAAG,yBAAyB,GAAG,IAAI,CA2CxF;AAID;;;;GAIG;AACH,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,EAC5C,gBAAgB,EAAE,eAAe,EAAE,GAClC;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAyCxC;AAID;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,MAAM,EACZ,aAAa,EAAE,KAAK,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,GACtD;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,CA2B1C;AAID;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,EAAE,GAAG,IAAI,CAiCvE"}
|