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
package/dist/server.js ADDED
@@ -0,0 +1,101 @@
1
+ /**
2
+ * Fastify server factory for the ExoVault proxy.
3
+ */
4
+ import { randomBytes } from "node:crypto";
5
+ import { timingSafeEqual } from "node:crypto";
6
+ import Fastify from "fastify";
7
+ import { GatewayClient } from "./gateway-client.js";
8
+ import { SessionState } from "./pipeline/session-state.js";
9
+ import { registerHealthRoute } from "./routes/health.js";
10
+ import { registerMessagesRoute } from "./routes/messages.js";
11
+ import { registerMcpRoute } from "./routes/mcp.js";
12
+ import { gracefulShutdown } from "./shutdown.js";
13
+ /** Generate a random local auth token for inbound request verification. */
14
+ function generateLocalToken() {
15
+ return randomBytes(32).toString("hex");
16
+ }
17
+ /** Constant-time comparison of auth tokens. */
18
+ function verifyToken(provided, expected) {
19
+ const a = Buffer.from(provided);
20
+ const b = Buffer.from(expected);
21
+ if (a.length !== b.length)
22
+ return false;
23
+ return timingSafeEqual(a, b);
24
+ }
25
+ export async function createServer(config) {
26
+ const app = Fastify({
27
+ logger: false,
28
+ bodyLimit: 10 * 1024 * 1024, // 10MB
29
+ });
30
+ const gateway = new GatewayClient(config.apiUrl, config.agentKey);
31
+ const session = new SessionState();
32
+ // Generate local auth token — clients must send this to use the proxy
33
+ const localToken = process.env.EXOVAULT_LOCAL_TOKEN ?? generateLocalToken();
34
+ // Validate agent key on startup
35
+ console.log("Validating agent key...");
36
+ try {
37
+ const info = await gateway.info();
38
+ console.log(`Connected: ${info.agentType} (integration: ${info.integrationId.slice(0, 8)}...)`);
39
+ if (info.vaultId) {
40
+ console.log(`Vault-restricted: ${info.vaultId}`);
41
+ }
42
+ }
43
+ catch (error) {
44
+ console.error("Agent key validation failed:", error instanceof Error ? error.message : error);
45
+ process.exit(1);
46
+ }
47
+ // Auth guard — verify local token on all routes except /health
48
+ app.addHook("onRequest", async (request, reply) => {
49
+ if (request.url === "/health")
50
+ return;
51
+ const authHeader = request.headers["x-api-key"];
52
+ if (!authHeader || !verifyToken(authHeader, localToken)) {
53
+ return reply.status(401).send({ error: "Unauthorized — invalid or missing x-api-key header" });
54
+ }
55
+ });
56
+ // Parse JSON bodies as raw strings — both /v1/messages and /mcp handle parsing themselves
57
+ app.addContentTypeParser("application/json", { parseAs: "string" }, (_req, body, done) => {
58
+ done(null, body);
59
+ });
60
+ // Register routes
61
+ registerHealthRoute(app);
62
+ registerMcpRoute(app, gateway);
63
+ registerMessagesRoute(app, config, gateway, session);
64
+ return { app, gateway, session, localToken };
65
+ }
66
+ export async function startServer(config) {
67
+ const { app, gateway, session, localToken } = await createServer(config);
68
+ // Bind to localhost only — never expose on the network
69
+ const host = config.host ?? "127.0.0.1";
70
+ await app.listen({ port: config.port, host });
71
+ const startedAt = Date.now();
72
+ console.log();
73
+ console.log("╔═══════════════════════════════════════════════╗");
74
+ console.log("║ ExoVault — Running ║");
75
+ console.log("╚═══════════════════════════════════════════════╝");
76
+ console.log();
77
+ console.log(` Listening: http://${host}:${config.port}`);
78
+ console.log(` Proxy: http://${host}:${config.port}/v1/messages`);
79
+ console.log(` MCP: http://${host}:${config.port}/mcp`);
80
+ console.log(` Upstream: ${config.upstreamBaseUrl}`);
81
+ console.log(` ExoVault API: ${config.apiUrl}`);
82
+ console.log();
83
+ console.log(` x-api-key: ${localToken}`);
84
+ console.log(` Set ANTHROPIC_API_KEY header to this value for authenticated access.`);
85
+ console.log();
86
+ console.log(" Your agent gets:");
87
+ console.log(" Active tools — search, write, read memories via MCP");
88
+ console.log(" Auto-capture — conversations stored automatically via proxy");
89
+ console.log();
90
+ // Graceful shutdown — write episodic summary + checkpoint before exit
91
+ let shuttingDown = false;
92
+ const onSignal = async (signal) => {
93
+ if (shuttingDown)
94
+ return; // Prevent double-shutdown
95
+ shuttingDown = true;
96
+ await gracefulShutdown({ signal, session, gateway, app, startedAt });
97
+ process.exit(0);
98
+ };
99
+ process.on("SIGINT", () => onSignal("SIGINT"));
100
+ process.on("SIGTERM", () => onSignal("SIGTERM"));
101
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Setup wizard for the ExoVault proxy.
3
+ * Validates agent key and writes config to ~/.exovault-proxy/config.json.
4
+ */
5
+ export declare function runSetup(): Promise<void>;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../src/setup.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAWH,wBAAsB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CA6E9C"}
package/dist/setup.js ADDED
@@ -0,0 +1,90 @@
1
+ /**
2
+ * Setup wizard for the ExoVault proxy.
3
+ * Validates agent key and writes config to ~/.exovault-proxy/config.json.
4
+ */
5
+ import { mkdir, writeFile } from "node:fs/promises";
6
+ import { join } from "node:path";
7
+ import { homedir } from "node:os";
8
+ import { parseArgs } from "node:util";
9
+ import { GatewayClient } from "./gateway-client.js";
10
+ const CONFIG_DIR = join(homedir(), ".exovault-proxy");
11
+ const CONFIG_FILE = join(CONFIG_DIR, "config.json");
12
+ export async function runSetup() {
13
+ let agentKey;
14
+ let apiUrl;
15
+ try {
16
+ const { values } = parseArgs({
17
+ options: {
18
+ "agent-key": { type: "string" },
19
+ "api-url": { type: "string" },
20
+ help: { type: "boolean", short: "h" },
21
+ },
22
+ strict: false,
23
+ args: process.argv.slice(3), // skip "node", "index.js", "setup"
24
+ });
25
+ if (values.help) {
26
+ printUsage();
27
+ process.exit(0);
28
+ }
29
+ agentKey = values["agent-key"];
30
+ apiUrl = values["api-url"];
31
+ }
32
+ catch {
33
+ console.error("Error: Invalid arguments.\n");
34
+ printUsage();
35
+ process.exit(1);
36
+ }
37
+ if (!agentKey) {
38
+ console.error("Error: --agent-key is required.\n");
39
+ printUsage();
40
+ process.exit(1);
41
+ }
42
+ const baseUrl = apiUrl ?? "https://exovault.co";
43
+ console.log("╔═══════════════════════════════════════╗");
44
+ console.log("║ ExoVault Proxy — Setup ║");
45
+ console.log("╚═══════════════════════════════════════╝");
46
+ console.log();
47
+ console.log(`API URL: ${baseUrl}`);
48
+ console.log();
49
+ // Validate agent key
50
+ console.log("Validating agent key...");
51
+ const gateway = new GatewayClient(baseUrl, agentKey);
52
+ try {
53
+ const info = await gateway.info();
54
+ console.log(`Connected as integration: ${info.integrationId}`);
55
+ console.log(`Agent type: ${info.agentType}`);
56
+ console.log(`Scopes: ${info.scopes.join(", ")}`);
57
+ if (info.vaultId) {
58
+ console.log(`Vault-restricted: ${info.vaultId}`);
59
+ }
60
+ }
61
+ catch (err) {
62
+ console.error("Agent key validation failed:", err instanceof Error ? err.message : err);
63
+ process.exit(1);
64
+ }
65
+ // Write config
66
+ await mkdir(CONFIG_DIR, { recursive: true, mode: 0o700 });
67
+ const config = { agentKey, apiUrl: baseUrl };
68
+ await writeFile(CONFIG_FILE, JSON.stringify(config, null, 2), {
69
+ encoding: "utf-8",
70
+ mode: 0o600,
71
+ });
72
+ console.log();
73
+ console.log(`Config saved to: ${CONFIG_FILE}`);
74
+ console.log();
75
+ console.log("Start the proxy:");
76
+ console.log(" exovault-proxy start");
77
+ console.log();
78
+ console.log("Then set your environment:");
79
+ console.log(" export ANTHROPIC_BASE_URL=http://localhost:4100");
80
+ console.log();
81
+ console.log("Setup complete!");
82
+ }
83
+ function printUsage() {
84
+ console.log("Usage:");
85
+ console.log(" exovault-proxy setup --agent-key <key> [--api-url <url>]");
86
+ console.log();
87
+ console.log("Options:");
88
+ console.log(" --agent-key Agent key from ExoVault Connect Wizard (exv_...)");
89
+ console.log(" --api-url ExoVault API URL (default: https://exovault.co)");
90
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.js","sourceRoot":"","sources":["../src/setup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Graceful shutdown handler for the ExoVault proxy.
3
+ *
4
+ * On SIGINT/SIGTERM:
5
+ * 1. Wait briefly for pending fire-and-forget calls to flush
6
+ * 2. Write episodic memory (stats only — turns already captured during session)
7
+ * 3. Call context_checkpoint to signal session completion
8
+ * 4. Log proxy.session_end pipeline event
9
+ * 5. Close Fastify
10
+ *
11
+ * No content is re-ingested — turns were already sent via proxyIngestTurn
12
+ * throughout the session. This only writes a summary + signals "done".
13
+ */
14
+ import type { FastifyInstance } from "fastify";
15
+ import type { GatewayClient } from "./gateway-client.js";
16
+ import type { SessionState } from "./pipeline/session-state.js";
17
+ export interface ShutdownOptions {
18
+ signal: string;
19
+ session: SessionState;
20
+ gateway: GatewayClient;
21
+ app: FastifyInstance;
22
+ startedAt: number;
23
+ }
24
+ export declare function gracefulShutdown(opts: ShutdownOptions): Promise<void>;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shutdown.d.ts","sourceRoot":"","sources":["../src/shutdown.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAC/C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAEhE,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,YAAY,CAAC;IACtB,OAAO,EAAE,aAAa,CAAC;IACvB,GAAG,EAAE,eAAe,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAsD3E"}
@@ -0,0 +1,63 @@
1
+ /**
2
+ * Graceful shutdown handler for the ExoVault proxy.
3
+ *
4
+ * On SIGINT/SIGTERM:
5
+ * 1. Wait briefly for pending fire-and-forget calls to flush
6
+ * 2. Write episodic memory (stats only — turns already captured during session)
7
+ * 3. Call context_checkpoint to signal session completion
8
+ * 4. Log proxy.session_end pipeline event
9
+ * 5. Close Fastify
10
+ *
11
+ * No content is re-ingested — turns were already sent via proxyIngestTurn
12
+ * throughout the session. This only writes a summary + signals "done".
13
+ */
14
+ export async function gracefulShutdown(opts) {
15
+ const { signal, session, gateway, app, startedAt } = opts;
16
+ console.log(`\n[proxy] ${signal} received — shutting down gracefully...`);
17
+ // Brief pause to let pending fire-and-forget calls (turn capture, pipeline events) flush
18
+ await new Promise((resolve) => setTimeout(resolve, 1500));
19
+ const requestCount = session.getRequestCount();
20
+ const memoryCount = session.getInjectedMemoryCount();
21
+ const durationMs = Date.now() - startedAt;
22
+ const durationMin = Math.round(durationMs / 60000);
23
+ // 1. Write episodic memory — stats only, no content duplication
24
+ if (requestCount > 0) {
25
+ try {
26
+ const summary = `Proxy session: ${requestCount} requests over ${durationMin}min, ${memoryCount} unique memories injected`;
27
+ await gateway.writeMemory({
28
+ content: summary,
29
+ memoryType: "episodic",
30
+ summary,
31
+ agentId: "proxy",
32
+ importance: 2,
33
+ confidence: 5,
34
+ dedup: true,
35
+ });
36
+ console.log("[proxy] Episodic memory written");
37
+ }
38
+ catch (e) {
39
+ console.error("[proxy] Failed to write episodic memory:", e instanceof Error ? e.message : e);
40
+ }
41
+ }
42
+ // 2. Context checkpoint — signals "session is done, process all ingested turns"
43
+ try {
44
+ await gateway.contextCheckpoint({
45
+ agentId: "proxy",
46
+ agentRunId: session.agentRunId,
47
+ });
48
+ console.log("[proxy] Context checkpoint saved");
49
+ }
50
+ catch (e) {
51
+ console.error("[proxy] Failed to save checkpoint:", e instanceof Error ? e.message : e);
52
+ }
53
+ // 3. Pipeline event (fire-and-forget — doesn't block shutdown)
54
+ gateway.logPipelineEvent({
55
+ eventType: "proxy.session_end",
56
+ payload: { requestCount, memoryCount, durationMs, signal },
57
+ sessionId: session.agentRunId,
58
+ durationMs,
59
+ });
60
+ // 4. Close Fastify (finishes in-flight requests)
61
+ await app.close();
62
+ console.log("[proxy] Shutdown complete");
63
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shutdown.js","sourceRoot":"","sources":["../src/shutdown.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAcH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,IAAqB;IAC1D,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC;IAE1D,OAAO,CAAC,GAAG,CAAC,aAAa,MAAM,yCAAyC,CAAC,CAAC;IAE1E,yFAAyF;IACzF,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;IAE1D,MAAM,YAAY,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;IAC/C,MAAM,WAAW,GAAG,OAAO,CAAC,sBAAsB,EAAE,CAAC;IACrD,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;IAC1C,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,KAAK,CAAC,CAAC;IAEnD,gEAAgE;IAChE,IAAI,YAAY,GAAG,CAAC,EAAE,CAAC;QACrB,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,kBAAkB,YAAY,kBAAkB,WAAW,QAAQ,WAAW,2BAA2B,CAAC;YAC1H,MAAM,OAAO,CAAC,WAAW,CAAC;gBACxB,OAAO,EAAE,OAAO;gBAChB,UAAU,EAAE,UAAU;gBACtB,OAAO;gBACP,OAAO,EAAE,OAAO;gBAChB,UAAU,EAAE,CAAC;gBACb,UAAU,EAAE,CAAC;gBACb,KAAK,EAAE,IAAI;aACZ,CAAC,CAAC;YACH,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;QACjD,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,CAAC,KAAK,CAAC,0CAA0C,EAAE,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAChG,CAAC;IACH,CAAC;IAED,gFAAgF;IAChF,IAAI,CAAC;QACH,MAAM,OAAO,CAAC,iBAAiB,CAAC;YAC9B,OAAO,EAAE,OAAO;YAChB,UAAU,EAAE,OAAO,CAAC,UAAU;SAC/B,CAAC,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;IAClD,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,oCAAoC,EAAE,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1F,CAAC;IAED,+DAA+D;IAC/D,OAAO,CAAC,gBAAgB,CAAC;QACvB,SAAS,EAAE,mBAAmB;QAC9B,OAAO,EAAE,EAAE,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,EAAE;QAC1D,SAAS,EAAE,OAAO,CAAC,UAAU;QAC7B,UAAU;KACX,CAAC,CAAC;IAEH,iDAAiD;IACjD,MAAM,GAAG,CAAC,KAAK,EAAE,CAAC;IAClB,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;AAC3C,CAAC"}
@@ -0,0 +1,66 @@
1
+ /**
2
+ * Anthropic Messages API type definitions.
3
+ * Only the subset needed for proxy interception.
4
+ */
5
+ /** Text content block in a message. */
6
+ export interface TextBlock {
7
+ type: "text";
8
+ text: string;
9
+ cache_control?: CacheControl;
10
+ }
11
+ /** Image content block (passed through, not inspected). */
12
+ export interface ImageBlock {
13
+ type: "image";
14
+ source: unknown;
15
+ }
16
+ /** Tool use/result blocks (passed through). */
17
+ export interface ToolUseBlock {
18
+ type: "tool_use";
19
+ id: string;
20
+ name: string;
21
+ input: unknown;
22
+ }
23
+ export interface ToolResultBlock {
24
+ type: "tool_result";
25
+ tool_use_id: string;
26
+ content: string | ContentBlock[];
27
+ }
28
+ export type ContentBlock = TextBlock | ImageBlock | ToolUseBlock | ToolResultBlock;
29
+ /** A message in the Anthropic Messages API. */
30
+ export interface AnthropicMessage {
31
+ role: "user" | "assistant";
32
+ content: string | ContentBlock[];
33
+ }
34
+ /** Cache control for Anthropic prompt caching. */
35
+ export interface CacheControl {
36
+ type: "ephemeral";
37
+ ttl?: string;
38
+ }
39
+ /** System content block (for array-style system prompts). */
40
+ export interface SystemContentBlock {
41
+ type: "text";
42
+ text: string;
43
+ cache_control?: CacheControl;
44
+ }
45
+ /** Anthropic Messages API request body. */
46
+ export interface MessagesRequest {
47
+ model: string;
48
+ messages: AnthropicMessage[];
49
+ system?: string | SystemContentBlock[];
50
+ max_tokens: number;
51
+ stream?: boolean;
52
+ [key: string]: unknown;
53
+ }
54
+ /** Anthropic Messages API response (non-streaming). */
55
+ export interface MessagesResponse {
56
+ id: string;
57
+ type: "message";
58
+ role: "assistant";
59
+ content: ContentBlock[];
60
+ model: string;
61
+ stop_reason: string | null;
62
+ usage: {
63
+ input_tokens: number;
64
+ output_tokens: number;
65
+ };
66
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anthropic.d.ts","sourceRoot":"","sources":["../../src/types/anthropic.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,uCAAuC;AACvC,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,CAAC,EAAE,YAAY,CAAC;CAC9B;AAED,2DAA2D;AAC3D,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,+CAA+C;AAC/C,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,UAAU,CAAC;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,aAAa,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,GAAG,YAAY,EAAE,CAAC;CAClC;AAED,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,UAAU,GAAG,YAAY,GAAG,eAAe,CAAC;AAEnF,+CAA+C;AAC/C,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;IAC3B,OAAO,EAAE,MAAM,GAAG,YAAY,EAAE,CAAC;CAClC;AAED,kDAAkD;AAClD,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,WAAW,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,6DAA6D;AAC7D,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,CAAC,EAAE,YAAY,CAAC;CAC9B;AAED,2CAA2C;AAC3C,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,gBAAgB,EAAE,CAAC;IAC7B,MAAM,CAAC,EAAE,MAAM,GAAG,kBAAkB,EAAE,CAAC;IACvC,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,uDAAuD;AACvD,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,SAAS,CAAC;IAChB,IAAI,EAAE,WAAW,CAAC;IAClB,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,KAAK,EAAE;QACL,YAAY,EAAE,MAAM,CAAC;QACrB,aAAa,EAAE,MAAM,CAAC;KACvB,CAAC;CACH"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Anthropic Messages API type definitions.
3
+ * Only the subset needed for proxy interception.
4
+ */
5
+ export {};
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anthropic.js","sourceRoot":"","sources":["../../src/types/anthropic.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
@@ -0,0 +1,64 @@
1
+ /**
2
+ * Proxy configuration types.
3
+ */
4
+ export interface ProxyConfig {
5
+ /** ExoVault agent key (exv_...). */
6
+ agentKey: string;
7
+ /** ExoVault API URL. Default: https://exovault.co */
8
+ apiUrl: string;
9
+ /** Local proxy host. Default: 127.0.0.1 (localhost only for security) */
10
+ host: string;
11
+ /** Local proxy port. Default: 4100 */
12
+ port: number;
13
+ /** Upstream Anthropic API base URL. Default: https://api.anthropic.com */
14
+ upstreamBaseUrl: string;
15
+ /** Max chars for memory injection block. Default: 2000 */
16
+ maxInjectionChars: number;
17
+ }
18
+ /** Info returned from ExoVault /api/agent/info. */
19
+ export interface AgentInfo {
20
+ userId: string;
21
+ integrationId: string;
22
+ agentType: string;
23
+ scopes: string[];
24
+ vaultId: string | null;
25
+ restrictToVault: boolean;
26
+ /** Server-side override for memory injection budget (chars). */
27
+ maxInjectionChars?: number;
28
+ }
29
+ /** Memory hit from search results. */
30
+ export interface MemoryHit {
31
+ id: string;
32
+ memoryType: string;
33
+ content: string;
34
+ contentTruncated?: boolean;
35
+ summary?: string | null;
36
+ importance: number;
37
+ confidence: number;
38
+ entities?: string[] | null;
39
+ relatedMemoryIds?: string[] | null;
40
+ }
41
+ /** Pending message delivered via session_start or context_checkpoint. */
42
+ export interface PendingMessage {
43
+ id: string;
44
+ senderId: string;
45
+ senderType: string;
46
+ category: string;
47
+ priority: number;
48
+ subject: string | null;
49
+ content: string;
50
+ createdAt: string;
51
+ }
52
+ /** Session start response (subset). */
53
+ export interface SessionStartResponse {
54
+ sessionContext: {
55
+ recentSessions: Array<{
56
+ id: string;
57
+ summary: string | null;
58
+ }>;
59
+ importantFacts: MemoryHit[];
60
+ activeTasks: MemoryHit[];
61
+ constraints: MemoryHit[];
62
+ };
63
+ pendingMessages?: PendingMessage[];
64
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/types/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,WAAW;IAC1B,oCAAoC;IACpC,QAAQ,EAAE,MAAM,CAAC;IACjB,sDAAsD;IACtD,MAAM,EAAE,MAAM,CAAC;IACf,sCAAsC;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,0EAA0E;IAC1E,eAAe,EAAE,MAAM,CAAC;IACxB,0DAA0D;IAC1D,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED,mDAAmD;AACnD,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,eAAe,EAAE,OAAO,CAAC;IACzB,gEAAgE;IAChE,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,sCAAsC;AACtC,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAC3B,gBAAgB,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;CACpC;AAED,yEAAyE;AACzE,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,uCAAuC;AACvC,MAAM,WAAW,oBAAoB;IACnC,cAAc,EAAE;QACd,cAAc,EAAE,KAAK,CAAC;YAAE,EAAE,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;SAAE,CAAC,CAAC;QAC9D,cAAc,EAAE,SAAS,EAAE,CAAC;QAC5B,WAAW,EAAE,SAAS,EAAE,CAAC;QACzB,WAAW,EAAE,SAAS,EAAE,CAAC;KAC1B,CAAC;IACF,eAAe,CAAC,EAAE,cAAc,EAAE,CAAC;CACpC"}
@@ -0,0 +1,4 @@
1
+ /**
2
+ * Proxy configuration types.
3
+ */
4
+ export {};
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/types/config.ts"],"names":[],"mappings":"AAAA;;GAEG"}
package/package.json ADDED
@@ -0,0 +1,35 @@
1
+ {
2
+ "name": "exovault",
3
+ "version": "1.0.0",
4
+ "type": "module",
5
+ "description": "ExoVault — unified proxy + MCP server for durable agent memory",
6
+ "main": "dist/index.js",
7
+ "bin": {
8
+ "exovault": "dist/index.js",
9
+ "exovault-proxy": "dist/index.js"
10
+ },
11
+ "files": [
12
+ "dist/",
13
+ "README.md",
14
+ "LICENSE"
15
+ ],
16
+ "scripts": {
17
+ "build": "tsc -p tsconfig.build.json",
18
+ "start": "node dist/index.js start",
19
+ "connect": "node dist/index.js connect",
20
+ "dev": "tsx src/index.ts",
21
+ "test": "vitest run",
22
+ "test:watch": "vitest"
23
+ },
24
+ "dependencies": {
25
+ "@modelcontextprotocol/sdk": "^1.26.0",
26
+ "fastify": "^5.3.3",
27
+ "zod": "^4.3.6"
28
+ },
29
+ "devDependencies": {
30
+ "@types/node": "^22.15.3",
31
+ "tsx": "^4.19.4",
32
+ "typescript": "^5.8.3",
33
+ "vitest": "^4.0.18"
34
+ }
35
+ }