exovault 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 (93) hide show
  1. package/dist/config.d.ts +8 -0
  2. package/dist/config.d.ts.map +1 -0
  3. package/dist/config.js +53 -0
  4. package/dist/config.js.map +1 -0
  5. package/dist/connect.d.ts +32 -0
  6. package/dist/connect.d.ts.map +1 -0
  7. package/dist/connect.js +224 -0
  8. package/dist/connect.js.map +1 -0
  9. package/dist/gateway-client.d.ts +104 -0
  10. package/dist/gateway-client.d.ts.map +1 -0
  11. package/dist/gateway-client.js +242 -0
  12. package/dist/gateway-client.js.map +1 -0
  13. package/dist/index.d.ts +10 -0
  14. package/dist/index.d.ts.map +1 -0
  15. package/dist/index.js +60 -0
  16. package/dist/index.js.map +1 -0
  17. package/dist/mcp/helpers.d.ts +56 -0
  18. package/dist/mcp/helpers.d.ts.map +1 -0
  19. package/dist/mcp/helpers.js +37 -0
  20. package/dist/mcp/helpers.js.map +1 -0
  21. package/dist/mcp/register.d.ts +10 -0
  22. package/dist/mcp/register.d.ts.map +1 -0
  23. package/dist/mcp/register.js +334 -0
  24. package/dist/mcp/register.js.map +1 -0
  25. package/dist/pipeline/context-injector.d.ts +13 -0
  26. package/dist/pipeline/context-injector.d.ts.map +1 -0
  27. package/dist/pipeline/context-injector.js +30 -0
  28. package/dist/pipeline/context-injector.js.map +1 -0
  29. package/dist/pipeline/dedup-filter.d.ts +29 -0
  30. package/dist/pipeline/dedup-filter.d.ts.map +1 -0
  31. package/dist/pipeline/dedup-filter.js +48 -0
  32. package/dist/pipeline/dedup-filter.js.map +1 -0
  33. package/dist/pipeline/injection-budget.d.ts +33 -0
  34. package/dist/pipeline/injection-budget.d.ts.map +1 -0
  35. package/dist/pipeline/injection-budget.js +98 -0
  36. package/dist/pipeline/injection-budget.js.map +1 -0
  37. package/dist/pipeline/memory-formatter.d.ts +16 -0
  38. package/dist/pipeline/memory-formatter.d.ts.map +1 -0
  39. package/dist/pipeline/memory-formatter.js +56 -0
  40. package/dist/pipeline/memory-formatter.js.map +1 -0
  41. package/dist/pipeline/query-extractor.d.ts +16 -0
  42. package/dist/pipeline/query-extractor.d.ts.map +1 -0
  43. package/dist/pipeline/query-extractor.js +47 -0
  44. package/dist/pipeline/query-extractor.js.map +1 -0
  45. package/dist/pipeline/sanitize.d.ts +11 -0
  46. package/dist/pipeline/sanitize.d.ts.map +1 -0
  47. package/dist/pipeline/sanitize.js +48 -0
  48. package/dist/pipeline/sanitize.js.map +1 -0
  49. package/dist/pipeline/session-state.d.ts +46 -0
  50. package/dist/pipeline/session-state.d.ts.map +1 -0
  51. package/dist/pipeline/session-state.js +80 -0
  52. package/dist/pipeline/session-state.js.map +1 -0
  53. package/dist/pipeline/stream-passthrough.d.ts +23 -0
  54. package/dist/pipeline/stream-passthrough.d.ts.map +1 -0
  55. package/dist/pipeline/stream-passthrough.js +79 -0
  56. package/dist/pipeline/stream-passthrough.js.map +1 -0
  57. package/dist/pipeline/turn-capture.d.ts +11 -0
  58. package/dist/pipeline/turn-capture.d.ts.map +1 -0
  59. package/dist/pipeline/turn-capture.js +25 -0
  60. package/dist/pipeline/turn-capture.js.map +1 -0
  61. package/dist/routes/health.d.ts +2 -0
  62. package/dist/routes/health.d.ts.map +1 -0
  63. package/dist/routes/health.js +5 -0
  64. package/dist/routes/health.js.map +1 -0
  65. package/dist/routes/mcp.d.ts +13 -0
  66. package/dist/routes/mcp.d.ts.map +1 -0
  67. package/dist/routes/mcp.js +141 -0
  68. package/dist/routes/mcp.js.map +1 -0
  69. package/dist/routes/messages.d.ts +16 -0
  70. package/dist/routes/messages.d.ts.map +1 -0
  71. package/dist/routes/messages.js +329 -0
  72. package/dist/routes/messages.js.map +1 -0
  73. package/dist/server.d.ts +16 -0
  74. package/dist/server.d.ts.map +1 -0
  75. package/dist/server.js +101 -0
  76. package/dist/server.js.map +1 -0
  77. package/dist/setup.d.ts +5 -0
  78. package/dist/setup.d.ts.map +1 -0
  79. package/dist/setup.js +90 -0
  80. package/dist/setup.js.map +1 -0
  81. package/dist/shutdown.d.ts +24 -0
  82. package/dist/shutdown.d.ts.map +1 -0
  83. package/dist/shutdown.js +63 -0
  84. package/dist/shutdown.js.map +1 -0
  85. package/dist/types/anthropic.d.ts +66 -0
  86. package/dist/types/anthropic.d.ts.map +1 -0
  87. package/dist/types/anthropic.js +5 -0
  88. package/dist/types/anthropic.js.map +1 -0
  89. package/dist/types/config.d.ts +64 -0
  90. package/dist/types/config.d.ts.map +1 -0
  91. package/dist/types/config.js +4 -0
  92. package/dist/types/config.js.map +1 -0
  93. package/package.json +35 -0
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Configuration loader for the ExoVault proxy.
3
+ *
4
+ * Priority: env vars > config file > defaults.
5
+ * Config file at ~/.exovault-proxy/config.json is optional (created by setup).
6
+ */
7
+ import type { ProxyConfig } from "./types/config.js";
8
+ export declare function loadConfig(): ProxyConfig;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AA4BrD,wBAAgB,UAAU,IAAI,WAAW,CAoCxC"}
package/dist/config.js ADDED
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Configuration loader for the ExoVault proxy.
3
+ *
4
+ * Priority: env vars > config file > defaults.
5
+ * Config file at ~/.exovault-proxy/config.json is optional (created by setup).
6
+ */
7
+ import { readFileSync } from "node:fs";
8
+ import { join } from "node:path";
9
+ import { homedir } from "node:os";
10
+ const CONFIG_DIR = join(homedir(), ".exovault");
11
+ const LEGACY_CONFIG_DIR = join(homedir(), ".exovault-proxy");
12
+ const CONFIG_FILE = join(CONFIG_DIR, "config.json");
13
+ const LEGACY_CONFIG_FILE = join(LEGACY_CONFIG_DIR, "config.json");
14
+ function readConfigFile() {
15
+ // Try new location first, fall back to legacy
16
+ for (const path of [CONFIG_FILE, LEGACY_CONFIG_FILE]) {
17
+ try {
18
+ const content = readFileSync(path, "utf-8");
19
+ return JSON.parse(content);
20
+ }
21
+ catch {
22
+ // Try next path
23
+ }
24
+ }
25
+ return {};
26
+ }
27
+ export function loadConfig() {
28
+ const file = readConfigFile();
29
+ const agentKey = process.env.EXOVAULT_AGENT_KEY ??
30
+ file.agentKey;
31
+ if (!agentKey) {
32
+ throw new Error("Missing EXOVAULT_AGENT_KEY. Run `npx exovault connect <key>` or set the environment variable.");
33
+ }
34
+ const apiUrl = process.env.EXOVAULT_API_URL ??
35
+ file.apiUrl ??
36
+ "https://exovault.co";
37
+ // Bind to localhost only by default — opt in to 0.0.0.0 via config
38
+ const host = process.env.EXOVAULT_PROXY_HOST ??
39
+ file.host ??
40
+ "127.0.0.1";
41
+ const rawPort = process.env.EXOVAULT_PROXY_PORT ? parseInt(process.env.EXOVAULT_PROXY_PORT, 10) : NaN;
42
+ const port = (!isNaN(rawPort) && rawPort > 0 && rawPort < 65536) ? rawPort : (file.port ?? 4100);
43
+ const upstreamBaseUrl = process.env.ANTHROPIC_UPSTREAM_URL ??
44
+ file.upstreamBaseUrl ??
45
+ "https://api.anthropic.com";
46
+ // Warn if upstream URL is not HTTPS (and not localhost)
47
+ if (upstreamBaseUrl.startsWith("http://") && !upstreamBaseUrl.includes("localhost") && !upstreamBaseUrl.includes("127.0.0.1")) {
48
+ console.warn("[exovault] WARNING: upstream URL uses HTTP — API keys will be sent in plaintext!");
49
+ }
50
+ const rawMaxChars = process.env.EXOVAULT_MAX_INJECTION_CHARS ? parseInt(process.env.EXOVAULT_MAX_INJECTION_CHARS, 10) : NaN;
51
+ const maxInjectionChars = (!isNaN(rawMaxChars) && rawMaxChars > 0) ? rawMaxChars : (file.maxInjectionChars ?? 2000);
52
+ return { agentKey, apiUrl, host, port, upstreamBaseUrl, maxInjectionChars };
53
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAGlC,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,WAAW,CAAC,CAAC;AAChD,MAAM,iBAAiB,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,iBAAiB,CAAC,CAAC;AAC7D,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;AACpD,MAAM,kBAAkB,GAAG,IAAI,CAAC,iBAAiB,EAAE,aAAa,CAAC,CAAC;AAUlE,SAAS,cAAc;IACrB,8CAA8C;IAC9C,KAAK,MAAM,IAAI,IAAI,CAAC,WAAW,EAAE,kBAAkB,CAAC,EAAE,CAAC;QACrD,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YAC5C,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAe,CAAC;QAC3C,CAAC;QAAC,MAAM,CAAC;YACP,gBAAgB;QAClB,CAAC;IACH,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,MAAM,IAAI,GAAG,cAAc,EAAE,CAAC;IAE9B,MAAM,QAAQ,GACZ,OAAO,CAAC,GAAG,CAAC,kBAAkB;QAC9B,IAAI,CAAC,QAAQ,CAAC;IAEhB,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CACb,+FAA+F,CAChG,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GACV,OAAO,CAAC,GAAG,CAAC,gBAAgB;QAC5B,IAAI,CAAC,MAAM;QACX,sBAAsB,CAAC;IAEzB,MAAM,IAAI,GACR,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAC7F,IAAI,CAAC,IAAI;QACT,IAAI,CAAC;IAEP,MAAM,eAAe,GACnB,OAAO,CAAC,GAAG,CAAC,sBAAsB;QAClC,IAAI,CAAC,eAAe;QACpB,2BAA2B,CAAC;IAE9B,MAAM,iBAAiB,GACrB,CAAC,OAAO,CAAC,GAAG,CAAC,4BAA4B;QACvC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,4BAA4B,EAAE,EAAE,CAAC;QACxD,CAAC,CAAC,SAAS,CAAC;QACd,IAAI,CAAC,iBAAiB;QACtB,IAAI,CAAC;IAEP,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,EAAE,iBAAiB,EAAE,CAAC;AACxE,CAAC"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * `exovault connect <key>` — one-time setup for the unified proxy + MCP server.
3
+ *
4
+ * 1. Validates the agent key
5
+ * 2. Auto-detects agent type (Claude Code, Cursor, or Custom)
6
+ * 3. Writes proxy config to ~/.exovault/config.json
7
+ * 4. Writes MCP config to the agent's config location
8
+ * 5. Prints next-steps instructions
9
+ */
10
+ export type AgentType = "claude-code" | "cursor" | "custom";
11
+ /**
12
+ * Detect agent type by checking for known config directories.
13
+ * @param home - Home directory path
14
+ * @param exists - File existence checker (injectable for testing)
15
+ */
16
+ export declare function detectAgentType(home: string, exists?: (path: string) => boolean): AgentType;
17
+ /**
18
+ * Build the MCP config object for a given agent type.
19
+ * Returns null for custom agents (they use env vars instead).
20
+ */
21
+ export declare function buildMcpConfig(agentType: AgentType, port: number): {
22
+ mcpServers: Record<string, Record<string, unknown>>;
23
+ } | null;
24
+ /**
25
+ * Merge new MCP config into an existing config file, preserving other entries.
26
+ */
27
+ export declare function mergeMcpConfig(existing: Record<string, unknown>, newConfig: {
28
+ mcpServers: Record<string, Record<string, unknown>>;
29
+ }): Record<string, unknown> & {
30
+ mcpServers: Record<string, unknown>;
31
+ };
32
+ export declare function runConnect(): Promise<void>;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connect.d.ts","sourceRoot":"","sources":["../src/connect.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AASH,MAAM,MAAM,SAAS,GAAG,aAAa,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAO5D;;;;GAIG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,MAAM,EACZ,MAAM,GAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAoB,GAC7C,SAAS,CAIX;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,SAAS,EAAE,SAAS,EACpB,IAAI,EAAE,MAAM,GACX;IAAE,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;CAAE,GAAG,IAAI,CAoBhE;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACjC,SAAS,EAAE;IAAE,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;CAAE,GACjE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;IAAE,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,CASnE;AAID,wBAAsB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAwHhD"}
@@ -0,0 +1,224 @@
1
+ /**
2
+ * `exovault connect <key>` — one-time setup for the unified proxy + MCP server.
3
+ *
4
+ * 1. Validates the agent key
5
+ * 2. Auto-detects agent type (Claude Code, Cursor, or Custom)
6
+ * 3. Writes proxy config to ~/.exovault/config.json
7
+ * 4. Writes MCP config to the agent's config location
8
+ * 5. Prints next-steps instructions
9
+ */
10
+ import { existsSync, readFileSync } from "node:fs";
11
+ import { mkdir, writeFile } from "node:fs/promises";
12
+ import { join } from "node:path";
13
+ import { homedir } from "node:os";
14
+ import { parseArgs } from "node:util";
15
+ import { GatewayClient } from "./gateway-client.js";
16
+ const DEFAULT_PORT = 4100;
17
+ const DEFAULT_API_URL = "https://exovault.co";
18
+ // ─── Pure functions (testable) ───────────────────────────────────────────────
19
+ /**
20
+ * Detect agent type by checking for known config directories.
21
+ * @param home - Home directory path
22
+ * @param exists - File existence checker (injectable for testing)
23
+ */
24
+ export function detectAgentType(home, exists = existsSync) {
25
+ if (exists(join(home, ".claude")))
26
+ return "claude-code";
27
+ if (exists(join(home, ".cursor")))
28
+ return "cursor";
29
+ return "custom";
30
+ }
31
+ /**
32
+ * Build the MCP config object for a given agent type.
33
+ * Returns null for custom agents (they use env vars instead).
34
+ */
35
+ export function buildMcpConfig(agentType, port) {
36
+ const mcpUrl = `http://localhost:${port}/mcp`;
37
+ if (agentType === "claude-code") {
38
+ return {
39
+ mcpServers: {
40
+ "exo-vault": { type: "http", url: mcpUrl },
41
+ },
42
+ };
43
+ }
44
+ if (agentType === "cursor") {
45
+ return {
46
+ mcpServers: {
47
+ "exo-vault": { url: mcpUrl },
48
+ },
49
+ };
50
+ }
51
+ return null;
52
+ }
53
+ /**
54
+ * Merge new MCP config into an existing config file, preserving other entries.
55
+ */
56
+ export function mergeMcpConfig(existing, newConfig) {
57
+ const existingServers = (existing.mcpServers ?? {});
58
+ return {
59
+ ...existing,
60
+ mcpServers: {
61
+ ...existingServers,
62
+ ...newConfig.mcpServers,
63
+ },
64
+ };
65
+ }
66
+ // ─── CLI command ─────────────────────────────────────────────────────────────
67
+ export async function runConnect() {
68
+ let agentKey;
69
+ let apiUrl;
70
+ let agentFlag;
71
+ try {
72
+ const { values, positionals } = parseArgs({
73
+ options: {
74
+ "agent-key": { type: "string" },
75
+ agent: { type: "string" },
76
+ "api-url": { type: "string" },
77
+ help: { type: "boolean", short: "h" },
78
+ },
79
+ strict: false,
80
+ allowPositionals: true,
81
+ args: process.argv.slice(3), // skip "node", "index.js", "connect"
82
+ });
83
+ if (values.help) {
84
+ printConnectUsage();
85
+ process.exit(0);
86
+ }
87
+ // Agent key: positional or --agent-key flag
88
+ agentKey = positionals[0] ?? values["agent-key"];
89
+ apiUrl = values["api-url"];
90
+ agentFlag = values.agent;
91
+ }
92
+ catch {
93
+ console.error("Error: Invalid arguments.\n");
94
+ printConnectUsage();
95
+ process.exit(1);
96
+ }
97
+ if (!agentKey) {
98
+ console.error("Error: Agent key is required.\n");
99
+ printConnectUsage();
100
+ process.exit(1);
101
+ }
102
+ const baseUrl = apiUrl ?? DEFAULT_API_URL;
103
+ const port = DEFAULT_PORT;
104
+ const home = homedir();
105
+ console.log("╔═══════════════════════════════════════════════╗");
106
+ console.log("║ ExoVault — Connect ║");
107
+ console.log("╚═══════════════════════════════════════════════╝");
108
+ console.log();
109
+ // ── Step 1: Validate agent key ──
110
+ console.log("Validating agent key...");
111
+ const gateway = new GatewayClient(baseUrl, agentKey);
112
+ try {
113
+ const info = await gateway.info();
114
+ console.log(` Agent type: ${info.agentType}`);
115
+ console.log(` Scopes: ${info.scopes.join(", ")}`);
116
+ if (info.vaultId) {
117
+ console.log(` Vault-restricted: ${info.vaultId}`);
118
+ }
119
+ console.log();
120
+ }
121
+ catch (err) {
122
+ console.error("Agent key validation failed:", err instanceof Error ? err.message : err);
123
+ process.exit(1);
124
+ }
125
+ // ── Step 2: Detect agent type ──
126
+ const agentType = agentFlag ?? detectAgentType(home);
127
+ console.log(`Detected agent: ${agentType}`);
128
+ // ── Step 3: Write proxy config ──
129
+ const configDir = join(home, ".exovault");
130
+ const configFile = join(configDir, "config.json");
131
+ await mkdir(configDir, { recursive: true, mode: 0o700 });
132
+ const proxyConfig = { agentKey, apiUrl: baseUrl, port };
133
+ await writeFile(configFile, JSON.stringify(proxyConfig, null, 2), {
134
+ encoding: "utf-8",
135
+ mode: 0o600,
136
+ });
137
+ console.log(`Proxy config written to: ${configFile}`);
138
+ // ── Step 4: Write MCP config ──
139
+ const mcpConfig = buildMcpConfig(agentType, port);
140
+ if (mcpConfig) {
141
+ const mcpConfigPath = getMcpConfigPath(agentType);
142
+ // Read existing config to merge
143
+ let existing = {};
144
+ try {
145
+ const raw = readFileSync(mcpConfigPath, "utf-8");
146
+ existing = JSON.parse(raw);
147
+ }
148
+ catch {
149
+ // File doesn't exist or is invalid — start fresh
150
+ }
151
+ const merged = mergeMcpConfig(existing, mcpConfig);
152
+ // Ensure parent directory exists for cursor
153
+ if (agentType === "cursor") {
154
+ await mkdir(join(process.cwd(), ".cursor"), { recursive: true });
155
+ }
156
+ await writeFile(mcpConfigPath, JSON.stringify(merged, null, 2), {
157
+ encoding: "utf-8",
158
+ });
159
+ console.log(`MCP config written to: ${mcpConfigPath}`);
160
+ }
161
+ // ── Step 5: Print instructions ──
162
+ console.log();
163
+ console.log("╔═══════════════════════════════════════════════╗");
164
+ console.log("║ ExoVault Connected! ║");
165
+ console.log("╚═══════════════════════════════════════════════╝");
166
+ console.log();
167
+ if (agentType === "custom") {
168
+ printCustomInstructions(port);
169
+ }
170
+ else {
171
+ printAgentInstructions(agentType, port);
172
+ }
173
+ }
174
+ function getMcpConfigPath(agentType) {
175
+ const cwd = process.cwd();
176
+ if (agentType === "claude-code")
177
+ return join(cwd, ".mcp.json");
178
+ if (agentType === "cursor")
179
+ return join(cwd, ".cursor", "mcp.json");
180
+ return ""; // custom — no file
181
+ }
182
+ function printAgentInstructions(agentType, port) {
183
+ console.log(" Next steps:");
184
+ console.log(` 1. Start ExoVault: npx exovault start`);
185
+ console.log(` 2. Set your environment:`);
186
+ console.log(` export ANTHROPIC_BASE_URL=http://localhost:${port}`);
187
+ console.log();
188
+ if (agentType === "claude-code") {
189
+ console.log(" 3. Open Claude Code — you're all set!");
190
+ }
191
+ else if (agentType === "cursor") {
192
+ console.log(" 3. Open Cursor — you're all set!");
193
+ }
194
+ console.log();
195
+ console.log(" Your agent gets:");
196
+ console.log(" Active tools — search, write, read memories via MCP");
197
+ console.log(" Auto-capture — conversations stored automatically via proxy");
198
+ console.log();
199
+ }
200
+ function printCustomInstructions(port) {
201
+ console.log(" Set your environment:");
202
+ console.log(` export ANTHROPIC_BASE_URL=http://localhost:${port}`);
203
+ console.log();
204
+ console.log(" MCP endpoint:");
205
+ console.log(` http://localhost:${port}/mcp`);
206
+ console.log();
207
+ console.log(" Start ExoVault:");
208
+ console.log(" npx exovault start");
209
+ console.log();
210
+ }
211
+ function printConnectUsage() {
212
+ console.log("Usage:");
213
+ console.log(" exovault connect <agent-key> [options]");
214
+ console.log();
215
+ console.log("Options:");
216
+ console.log(" --agent <type> Agent type: claude-code, cursor, custom (auto-detected if omitted)");
217
+ console.log(" --api-url <url> ExoVault API URL (default: https://exovault.co)");
218
+ console.log(" -h, --help Show this help");
219
+ console.log();
220
+ console.log("Examples:");
221
+ console.log(" exovault connect exv_abc123");
222
+ console.log(" exovault connect exv_abc123 --agent cursor");
223
+ console.log(" exovault connect exv_abc123 --api-url http://localhost:3000");
224
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connect.js","sourceRoot":"","sources":["../src/connect.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,104 @@
1
+ /**
2
+ * ExoVault gateway client for the unified proxy + MCP server.
3
+ *
4
+ * Two method styles:
5
+ * - proxy*() methods return parsed objects (used by proxy pipeline)
6
+ * - All other methods return JSON strings (used by MCP tool handlers)
7
+ */
8
+ import type { AgentInfo, MemoryHit, PendingMessage, SessionStartResponse } from "./types/config.js";
9
+ export declare class GatewayError extends Error {
10
+ status: number;
11
+ constructor(message: string, status: number);
12
+ }
13
+ export declare class GatewayClient {
14
+ private baseUrl;
15
+ private apiKey;
16
+ constructor(baseUrl: string, apiKey: string);
17
+ private request;
18
+ /** Generic POST that returns JSON string. Used by most MCP tools. */
19
+ private postJson;
20
+ info(): Promise<AgentInfo>;
21
+ proxySessionStart(params?: {
22
+ vaultId?: string;
23
+ query?: string;
24
+ mode?: string;
25
+ }): Promise<SessionStartResponse>;
26
+ proxySearchMemories(params: {
27
+ query: string;
28
+ topK?: number;
29
+ threshold?: number;
30
+ vaultId?: string;
31
+ }): Promise<{
32
+ memories: MemoryHit[];
33
+ }>;
34
+ proxyFetchPendingMessages(params?: {
35
+ limit?: number;
36
+ vaultId?: string;
37
+ }): Promise<{
38
+ messages: PendingMessage[];
39
+ total: number;
40
+ }>;
41
+ proxyIngestTurn(params: {
42
+ content: string;
43
+ role: "user" | "assistant";
44
+ agentId?: string;
45
+ agentRunId?: string;
46
+ vaultId?: string;
47
+ }): Promise<{
48
+ turnId: string;
49
+ }>;
50
+ writeMemory(params: Record<string, unknown>): Promise<string>;
51
+ searchMemories(params: Record<string, unknown>): Promise<string>;
52
+ readMemories(memoryIds: string[]): Promise<string>;
53
+ updateMemory(params: Record<string, unknown>): Promise<string>;
54
+ archiveMemory(memoryId: string, archived?: boolean): Promise<string>;
55
+ getRelatedMemories(memoryId: string, limit?: number): Promise<string>;
56
+ cleanupMemories(params: Record<string, unknown>): Promise<string>;
57
+ listNotes(params: Record<string, unknown>): Promise<string>;
58
+ readNote(noteId: string): Promise<string>;
59
+ readNotes(noteIds: string[]): Promise<string>;
60
+ searchNotes(params: Record<string, unknown>): Promise<string>;
61
+ createNote(params: Record<string, unknown>): Promise<string>;
62
+ updateNote(params: Record<string, unknown>): Promise<string>;
63
+ deleteNote(noteId: string): Promise<string>;
64
+ semanticSearch(params: Record<string, unknown>): Promise<string>;
65
+ searchAndRead(params: Record<string, unknown>): Promise<string>;
66
+ createTask(params: Record<string, unknown>): Promise<string>;
67
+ updateTask(params: Record<string, unknown>): Promise<string>;
68
+ listTasks(params: Record<string, unknown>): Promise<string>;
69
+ createPlanTasks(params: Record<string, unknown>): Promise<string>;
70
+ listVaults(): Promise<string>;
71
+ createVault(params: Record<string, unknown>): Promise<string>;
72
+ getLinks(params: Record<string, unknown>): Promise<string>;
73
+ addLink(params: Record<string, unknown>): Promise<string>;
74
+ removeLink(linkId: string): Promise<string>;
75
+ sessionStart(params: Record<string, unknown>): Promise<string>;
76
+ contextCheckpoint(params: Record<string, unknown>): Promise<string>;
77
+ listActiveAgents(sinceDays?: number, limit?: number): Promise<string>;
78
+ ingestTurn(params: Record<string, unknown>): Promise<string>;
79
+ updateDocument(params: Record<string, unknown>): Promise<string>;
80
+ /**
81
+ * Log a pipeline event for proxy observability.
82
+ * Fire-and-forget — errors are swallowed so logging never blocks.
83
+ */
84
+ logPipelineEvent(event: {
85
+ eventType: string;
86
+ payload: Record<string, unknown>;
87
+ sessionId?: string;
88
+ durationMs?: number;
89
+ }): void;
90
+ /**
91
+ * Record a tool call / event in the agent_sessions table.
92
+ * Fire-and-forget — errors are swallowed so tracking never blocks.
93
+ */
94
+ trackSession(params: {
95
+ toolName: string;
96
+ agentRunId: string;
97
+ agentId?: string;
98
+ agentType?: string;
99
+ modelId?: string;
100
+ vaultId?: string;
101
+ inputSummary?: string;
102
+ outputSummary?: string;
103
+ }): Promise<void>;
104
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gateway-client.d.ts","sourceRoot":"","sources":["../src/gateway-client.ts"],"names":[],"mappings":"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"}