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.
- package/dist/config.d.ts +8 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +53 -0
- package/dist/config.js.map +1 -0
- package/dist/connect.d.ts +32 -0
- package/dist/connect.d.ts.map +1 -0
- package/dist/connect.js +224 -0
- package/dist/connect.js.map +1 -0
- package/dist/gateway-client.d.ts +104 -0
- package/dist/gateway-client.d.ts.map +1 -0
- package/dist/gateway-client.js +242 -0
- package/dist/gateway-client.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +60 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/helpers.d.ts +56 -0
- package/dist/mcp/helpers.d.ts.map +1 -0
- package/dist/mcp/helpers.js +37 -0
- package/dist/mcp/helpers.js.map +1 -0
- package/dist/mcp/register.d.ts +10 -0
- package/dist/mcp/register.d.ts.map +1 -0
- package/dist/mcp/register.js +334 -0
- package/dist/mcp/register.js.map +1 -0
- package/dist/pipeline/context-injector.d.ts +13 -0
- package/dist/pipeline/context-injector.d.ts.map +1 -0
- package/dist/pipeline/context-injector.js +30 -0
- package/dist/pipeline/context-injector.js.map +1 -0
- package/dist/pipeline/dedup-filter.d.ts +29 -0
- package/dist/pipeline/dedup-filter.d.ts.map +1 -0
- package/dist/pipeline/dedup-filter.js +48 -0
- package/dist/pipeline/dedup-filter.js.map +1 -0
- package/dist/pipeline/injection-budget.d.ts +33 -0
- package/dist/pipeline/injection-budget.d.ts.map +1 -0
- package/dist/pipeline/injection-budget.js +98 -0
- package/dist/pipeline/injection-budget.js.map +1 -0
- package/dist/pipeline/memory-formatter.d.ts +16 -0
- package/dist/pipeline/memory-formatter.d.ts.map +1 -0
- package/dist/pipeline/memory-formatter.js +56 -0
- package/dist/pipeline/memory-formatter.js.map +1 -0
- package/dist/pipeline/query-extractor.d.ts +16 -0
- package/dist/pipeline/query-extractor.d.ts.map +1 -0
- package/dist/pipeline/query-extractor.js +47 -0
- package/dist/pipeline/query-extractor.js.map +1 -0
- package/dist/pipeline/sanitize.d.ts +11 -0
- package/dist/pipeline/sanitize.d.ts.map +1 -0
- package/dist/pipeline/sanitize.js +48 -0
- package/dist/pipeline/sanitize.js.map +1 -0
- package/dist/pipeline/session-state.d.ts +46 -0
- package/dist/pipeline/session-state.d.ts.map +1 -0
- package/dist/pipeline/session-state.js +80 -0
- package/dist/pipeline/session-state.js.map +1 -0
- package/dist/pipeline/stream-passthrough.d.ts +23 -0
- package/dist/pipeline/stream-passthrough.d.ts.map +1 -0
- package/dist/pipeline/stream-passthrough.js +79 -0
- package/dist/pipeline/stream-passthrough.js.map +1 -0
- package/dist/pipeline/turn-capture.d.ts +11 -0
- package/dist/pipeline/turn-capture.d.ts.map +1 -0
- package/dist/pipeline/turn-capture.js +25 -0
- package/dist/pipeline/turn-capture.js.map +1 -0
- package/dist/routes/health.d.ts +2 -0
- package/dist/routes/health.d.ts.map +1 -0
- package/dist/routes/health.js +5 -0
- package/dist/routes/health.js.map +1 -0
- package/dist/routes/mcp.d.ts +13 -0
- package/dist/routes/mcp.d.ts.map +1 -0
- package/dist/routes/mcp.js +141 -0
- package/dist/routes/mcp.js.map +1 -0
- package/dist/routes/messages.d.ts +16 -0
- package/dist/routes/messages.d.ts.map +1 -0
- package/dist/routes/messages.js +329 -0
- package/dist/routes/messages.js.map +1 -0
- package/dist/server.d.ts +16 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +101 -0
- package/dist/server.js.map +1 -0
- package/dist/setup.d.ts +5 -0
- package/dist/setup.d.ts.map +1 -0
- package/dist/setup.js +90 -0
- package/dist/setup.js.map +1 -0
- package/dist/shutdown.d.ts +24 -0
- package/dist/shutdown.d.ts.map +1 -0
- package/dist/shutdown.js +63 -0
- package/dist/shutdown.js.map +1 -0
- package/dist/types/anthropic.d.ts +66 -0
- package/dist/types/anthropic.d.ts.map +1 -0
- package/dist/types/anthropic.js +5 -0
- package/dist/types/anthropic.js.map +1 -0
- package/dist/types/config.d.ts +64 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +4 -0
- package/dist/types/config.js.map +1 -0
- 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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"}
|
package/dist/setup.d.ts
ADDED
|
@@ -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"}
|
package/dist/shutdown.js
ADDED
|
@@ -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 @@
|
|
|
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 @@
|
|
|
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
|
+
}
|