@agent-vm/mcp-portal 0.0.69 → 0.0.70
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/README.md +42 -11
- package/dist/agent-bearer-token-DCtpDPCZ.js +59 -0
- package/dist/agent-bearer-token-DCtpDPCZ.js.map +1 -0
- package/dist/bin/mcp-portal.d.ts +28 -0
- package/dist/bin/mcp-portal.d.ts.map +1 -0
- package/dist/bin/mcp-portal.js +318 -0
- package/dist/bin/mcp-portal.js.map +1 -0
- package/dist/{catalog-types--gUGFPpN.d.ts → catalog-types-BVuB4Ynx.d.ts} +1 -1
- package/dist/{catalog-types--gUGFPpN.d.ts.map → catalog-types-BVuB4Ynx.d.ts.map} +1 -1
- package/dist/cli/index.d.ts +101 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +2 -0
- package/dist/core/index.d.ts +40 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +5 -0
- package/dist/hmac-env-B4shpRRB.js +20 -0
- package/dist/hmac-env-B4shpRRB.js.map +1 -0
- package/dist/hmac-token-DBqWY3-w.js +100 -0
- package/dist/hmac-token-DBqWY3-w.js.map +1 -0
- package/dist/index.d.ts +5 -485
- package/dist/index.js +4 -5
- package/dist/mcp-proxy/index.d.ts +24 -0
- package/dist/mcp-proxy/index.d.ts.map +1 -0
- package/dist/mcp-proxy/index.js +2 -0
- package/dist/portal-auth/agent-bearer-token.d.ts +22 -0
- package/dist/portal-auth/agent-bearer-token.d.ts.map +1 -0
- package/dist/portal-auth/agent-bearer-token.js +2 -0
- package/dist/portal-auth/hmac-env.d.ts +6 -0
- package/dist/portal-auth/hmac-env.d.ts.map +1 -0
- package/dist/portal-auth/hmac-env.js +2 -0
- package/dist/portal-auth/hmac-token.d.ts +40 -0
- package/dist/portal-auth/hmac-token.d.ts.map +1 -0
- package/dist/portal-auth/hmac-token.js +2 -0
- package/dist/portal-config/index.d.ts +11 -0
- package/dist/portal-config/index.d.ts.map +1 -0
- package/dist/{tool-vm → portal-config}/index.js +2 -3
- package/dist/portal-core-CZQI7Ob6.d.ts +264 -0
- package/dist/portal-core-CZQI7Ob6.d.ts.map +1 -0
- package/dist/portal-core-Cgu714CL.js +416 -0
- package/dist/portal-core-Cgu714CL.js.map +1 -0
- package/dist/portal-session-DG2CUjIo.d.ts +184 -0
- package/dist/portal-session-DG2CUjIo.d.ts.map +1 -0
- package/dist/portal-tools-DKci1szO.js +528 -0
- package/dist/portal-tools-DKci1szO.js.map +1 -0
- package/dist/resolve-agent-identity-DnC_Pmnh.js +550 -0
- package/dist/resolve-agent-identity-DnC_Pmnh.js.map +1 -0
- package/dist/resolve-agent-identity-FQL02YdW.d.ts +81 -0
- package/dist/resolve-agent-identity-FQL02YdW.d.ts.map +1 -0
- package/dist/serve-command-CnSMUybd.js +358 -0
- package/dist/serve-command-CnSMUybd.js.map +1 -0
- package/dist/testing/fake-upstream-mcp-server.d.ts +5 -2
- package/dist/testing/fake-upstream-mcp-server.d.ts.map +1 -1
- package/dist/testing/fake-upstream-mcp-server.js +14 -4
- package/dist/testing/fake-upstream-mcp-server.js.map +1 -1
- package/dist/typescript-artifact-BVLt3Ifd.js +60 -0
- package/dist/typescript-artifact-BVLt3Ifd.js.map +1 -0
- package/dist/upstream-mcp-client-runtime-JlsfTm7_.js +760 -0
- package/dist/upstream-mcp-client-runtime-JlsfTm7_.js.map +1 -0
- package/dist/upstream-response-middleware-1MZnAD9C.d.ts +115 -0
- package/dist/upstream-response-middleware-1MZnAD9C.d.ts.map +1 -0
- package/dist/upstream-response-middleware-BjUWZ2G8.js +172 -0
- package/dist/upstream-response-middleware-BjUWZ2G8.js.map +1 -0
- package/dist/{index-BcI9c8sg.d.ts → zod-schema-loader-DLGQpYFD.d.ts} +3 -9
- package/dist/zod-schema-loader-DLGQpYFD.d.ts.map +1 -0
- package/dist/{typescript-artifact-BqU8okQy.js → zod-schema-loader-yNekKNpm.js} +85 -55
- package/dist/zod-schema-loader-yNekKNpm.js.map +1 -0
- package/package.json +30 -13
- package/dist/bin/agent-vm-mcp-portal.d.ts +0 -10
- package/dist/bin/agent-vm-mcp-portal.d.ts.map +0 -1
- package/dist/bin/agent-vm-mcp-portal.js +0 -56
- package/dist/bin/agent-vm-mcp-portal.js.map +0 -1
- package/dist/bin/portal-server.d.ts +0 -55
- package/dist/bin/portal-server.d.ts.map +0 -1
- package/dist/bin/portal-server.js +0 -289
- package/dist/bin/portal-server.js.map +0 -1
- package/dist/index-BcI9c8sg.d.ts.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/tool-vm/index.d.ts +0 -2
- package/dist/tool-vm-ihnzDyjJ.js +0 -3
- package/dist/typescript-artifact-BqU8okQy.js.map +0 -1
- package/dist/upstream-mcp-client-runtime-DiBCBsDj.js +0 -1729
- package/dist/upstream-mcp-client-runtime-DiBCBsDj.js.map +0 -1
- package/dist/zod-schema-loader-CDDtoRE1.js +0 -90
- package/dist/zod-schema-loader-CDDtoRE1.js.map +0 -1
|
@@ -1,289 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
import { f as createPortalAgentRuntimeRecords, g as createPortalHttpApp, h as resolveAgentHmacKeys, j as parseHmacKeysFromEnv, l as createPortalSessionManager, m as createPortalHttpAgentResolver, p as createPortalApprovalVerifier, t as createUpstreamMcpClientRuntime } from "../upstream-mcp-client-runtime-DiBCBsDj.js";
|
|
3
|
-
import { loadMcpConfig, loadMcpPortalConfig, mcpConfigToResolvedProviders, resolveMcpPortalProfile } from "@agent-vm/config-contracts";
|
|
4
|
-
import { realpath } from "node:fs/promises";
|
|
5
|
-
import { join } from "node:path";
|
|
6
|
-
import { fileURLToPath } from "node:url";
|
|
7
|
-
import { parseArgs, promisify } from "node:util";
|
|
8
|
-
import { serve } from "@hono/node-server";
|
|
9
|
-
import { execFile } from "node:child_process";
|
|
10
|
-
//#region src/bin/secret-value-resolver.ts
|
|
11
|
-
const execFileAsync = promisify(execFile);
|
|
12
|
-
async function resolveSecretValue(secret, props) {
|
|
13
|
-
if (secret.source === "environment") {
|
|
14
|
-
const value = props.env[secret.name];
|
|
15
|
-
if (value === void 0 || value.length === 0) throw new Error(`Missing environment secret ${secret.name}.`);
|
|
16
|
-
return value;
|
|
17
|
-
}
|
|
18
|
-
return await (props.readOnePasswordSecret ?? readOnePasswordCliSecret)(secret.ref);
|
|
19
|
-
}
|
|
20
|
-
async function readOnePasswordCliSecret(ref) {
|
|
21
|
-
const { stdout } = await execFileAsync("op", ["read", ref], { encoding: "utf8" });
|
|
22
|
-
return stdout.trimEnd();
|
|
23
|
-
}
|
|
24
|
-
//#endregion
|
|
25
|
-
//#region src/bin/portal-server.ts
|
|
26
|
-
function parsePort(value) {
|
|
27
|
-
if (value === void 0) return;
|
|
28
|
-
const port = Number(value);
|
|
29
|
-
if (!Number.isInteger(port) || port < 0 || port > 65535) throw new Error(`Invalid --port value "${value}".`);
|
|
30
|
-
return port;
|
|
31
|
-
}
|
|
32
|
-
function parsePortalServerCliArgs(argv) {
|
|
33
|
-
const parsed = parseArgs({
|
|
34
|
-
args: [...argv],
|
|
35
|
-
options: {
|
|
36
|
-
agent: {
|
|
37
|
-
multiple: true,
|
|
38
|
-
type: "string"
|
|
39
|
-
},
|
|
40
|
-
"config-dir": { type: "string" },
|
|
41
|
-
port: {
|
|
42
|
-
short: "p",
|
|
43
|
-
type: "string"
|
|
44
|
-
}
|
|
45
|
-
},
|
|
46
|
-
strict: true
|
|
47
|
-
});
|
|
48
|
-
const configDir = parsed.values["config-dir"];
|
|
49
|
-
if (typeof configDir !== "string" || configDir.length === 0) throw new Error("--config-dir <path> is required.");
|
|
50
|
-
const rawAgentOverrides = parsed.values.agent;
|
|
51
|
-
const args = {
|
|
52
|
-
agentOverrides: Array.isArray(rawAgentOverrides) ? rawAgentOverrides : [],
|
|
53
|
-
configDir
|
|
54
|
-
};
|
|
55
|
-
const port = parsePort(parsed.values.port);
|
|
56
|
-
return port === void 0 ? args : {
|
|
57
|
-
...args,
|
|
58
|
-
port
|
|
59
|
-
};
|
|
60
|
-
}
|
|
61
|
-
function applyAgentOverrides(agents, overrides) {
|
|
62
|
-
const nextAgents = { ...agents };
|
|
63
|
-
for (const override of overrides) {
|
|
64
|
-
const [agentId, profileName, extra] = override.split("=");
|
|
65
|
-
if (agentId === void 0 || profileName === void 0 || extra !== void 0 || agentId.length === 0 || profileName.length === 0) throw new Error(`Invalid --agent override "${override}". Expected <agentId>=<profile>.`);
|
|
66
|
-
const existingAgent = nextAgents[agentId];
|
|
67
|
-
if (existingAgent === void 0) throw new Error(`Cannot override unknown MCP Portal agent "${agentId}".`);
|
|
68
|
-
nextAgents[agentId] = {
|
|
69
|
-
...existingAgent,
|
|
70
|
-
profile: profileName
|
|
71
|
-
};
|
|
72
|
-
}
|
|
73
|
-
return nextAgents;
|
|
74
|
-
}
|
|
75
|
-
function createDeferredPort() {
|
|
76
|
-
let rejectPort;
|
|
77
|
-
let resolvePort;
|
|
78
|
-
return {
|
|
79
|
-
promise: new Promise((resolve, reject) => {
|
|
80
|
-
rejectPort = reject;
|
|
81
|
-
resolvePort = resolve;
|
|
82
|
-
}),
|
|
83
|
-
reject: (error) => {
|
|
84
|
-
if (rejectPort === void 0) throw new Error("MCP Portal port rejector was not initialized.");
|
|
85
|
-
rejectPort(error);
|
|
86
|
-
},
|
|
87
|
-
resolve: (port) => {
|
|
88
|
-
if (resolvePort === void 0) throw new Error("MCP Portal port resolver was not initialized.");
|
|
89
|
-
resolvePort(port);
|
|
90
|
-
}
|
|
91
|
-
};
|
|
92
|
-
}
|
|
93
|
-
function defaultPortalServerLogger() {
|
|
94
|
-
return { log: (event) => {
|
|
95
|
-
process.stderr.write(`${JSON.stringify(event)}\n`);
|
|
96
|
-
} };
|
|
97
|
-
}
|
|
98
|
-
function handlePortalServerError(props) {
|
|
99
|
-
props.logger.log({
|
|
100
|
-
event: "server_error",
|
|
101
|
-
level: "error",
|
|
102
|
-
message: props.error.message,
|
|
103
|
-
...props.error.stack === void 0 ? {} : { stack: props.error.stack }
|
|
104
|
-
});
|
|
105
|
-
if (!props.hasListened) props.listeningPort.reject(props.error);
|
|
106
|
-
}
|
|
107
|
-
function closeNodeServer(server) {
|
|
108
|
-
return new Promise((resolve, reject) => {
|
|
109
|
-
server.close((error) => {
|
|
110
|
-
if (error) reject(error);
|
|
111
|
-
else resolve();
|
|
112
|
-
});
|
|
113
|
-
});
|
|
114
|
-
}
|
|
115
|
-
async function resolveProviderSecretRecord(secrets, resolveSecret) {
|
|
116
|
-
const resolvedEntries = await Promise.all(Object.entries(secrets).map(async ([name, secret]) => [name, await resolveSecret(secret)]));
|
|
117
|
-
return Object.fromEntries(resolvedEntries);
|
|
118
|
-
}
|
|
119
|
-
async function resolveUpstreamServer(provider, resolveSecret) {
|
|
120
|
-
if (provider.transport === "stdio") return {
|
|
121
|
-
args: provider.args,
|
|
122
|
-
command: provider.command,
|
|
123
|
-
...provider.cwd === void 0 ? {} : { cwd: provider.cwd },
|
|
124
|
-
env: await resolveProviderSecretRecord(provider.env, resolveSecret),
|
|
125
|
-
namespace: provider.namespace,
|
|
126
|
-
transport: "stdio"
|
|
127
|
-
};
|
|
128
|
-
return {
|
|
129
|
-
headers: await resolveProviderSecretRecord(provider.headers, resolveSecret),
|
|
130
|
-
namespace: provider.namespace,
|
|
131
|
-
transport: provider.transport,
|
|
132
|
-
url: provider.url
|
|
133
|
-
};
|
|
134
|
-
}
|
|
135
|
-
async function resolveUpstreamServers(mcpConfig, resolveSecret) {
|
|
136
|
-
return await Promise.all(mcpConfigToResolvedProviders(mcpConfig).map(async (provider) => resolveUpstreamServer(provider, resolveSecret)));
|
|
137
|
-
}
|
|
138
|
-
function selectorsFromNamespaceTools(namespaceTools) {
|
|
139
|
-
return Object.entries(namespaceTools).flatMap(([namespace, toolNames]) => toolNames.map((toolName) => ({
|
|
140
|
-
namespace,
|
|
141
|
-
toolName
|
|
142
|
-
})));
|
|
143
|
-
}
|
|
144
|
-
function buildProfilePolicyMaps(portalConfig) {
|
|
145
|
-
const enabledNamespacesByAgent = {};
|
|
146
|
-
const enabledToolsByAgent = {};
|
|
147
|
-
const hiddenToolsByAgent = {};
|
|
148
|
-
const profileTtls = [];
|
|
149
|
-
for (const [agentId, agent] of Object.entries(portalConfig.agents)) {
|
|
150
|
-
const profile = resolveMcpPortalProfile(portalConfig, agent.profile);
|
|
151
|
-
enabledNamespacesByAgent[agentId] = profile.enabledNamespaces;
|
|
152
|
-
enabledToolsByAgent[agentId] = selectorsFromNamespaceTools(profile.enabledToolsByNamespace);
|
|
153
|
-
hiddenToolsByAgent[agentId] = selectorsFromNamespaceTools(profile.hiddenToolsByNamespace);
|
|
154
|
-
profileTtls.push(profile.cache.catalogTtlMs);
|
|
155
|
-
}
|
|
156
|
-
return {
|
|
157
|
-
cacheTtlMs: profileTtls.length === 0 ? 6e4 : Math.min(...profileTtls),
|
|
158
|
-
enabledNamespacesByAgent,
|
|
159
|
-
enabledToolsByAgent,
|
|
160
|
-
hiddenToolsByAgent
|
|
161
|
-
};
|
|
162
|
-
}
|
|
163
|
-
function withAgentOverrides(portalConfig, agentOverrides) {
|
|
164
|
-
return {
|
|
165
|
-
...portalConfig,
|
|
166
|
-
agents: applyAgentOverrides(portalConfig.agents, agentOverrides)
|
|
167
|
-
};
|
|
168
|
-
}
|
|
169
|
-
async function startPortalServer(props) {
|
|
170
|
-
const logger = props.logger ?? defaultPortalServerLogger();
|
|
171
|
-
const serveFn = props.serveFn ?? serve;
|
|
172
|
-
const resolveSecret = props.resolveSecret ?? ((secret) => resolveSecretValue(secret, { env: props.env }));
|
|
173
|
-
const mcpConfig = await loadMcpConfig(join(props.args.configDir, "mcp.config.jsonc"));
|
|
174
|
-
const portalConfig = withAgentOverrides(await loadMcpPortalConfig(join(props.args.configDir, "mcp-portal.config.jsonc")), props.args.agentOverrides);
|
|
175
|
-
const serverAccessSecret = await resolveSecret(portalConfig.server.accessHeader.secret);
|
|
176
|
-
const agentRecords = createPortalAgentRuntimeRecords({
|
|
177
|
-
hmacKeys: await resolveAgentHmacKeys({
|
|
178
|
-
agents: portalConfig.agents,
|
|
179
|
-
envKeys: parseHmacKeysFromEnv(props.env),
|
|
180
|
-
resolveSecret
|
|
181
|
-
}),
|
|
182
|
-
portalConfig
|
|
183
|
-
});
|
|
184
|
-
const upstreamServers = await resolveUpstreamServers(mcpConfig, resolveSecret);
|
|
185
|
-
const upstreamRuntime = createUpstreamMcpClientRuntime({ servers: upstreamServers });
|
|
186
|
-
const profilePolicyMaps = buildProfilePolicyMaps(portalConfig);
|
|
187
|
-
const sessionManager = createPortalSessionManager({
|
|
188
|
-
accessPolicy: {
|
|
189
|
-
defaultPolicy: "deny-all",
|
|
190
|
-
enabledNamespacesByAgent: profilePolicyMaps.enabledNamespacesByAgent,
|
|
191
|
-
enabledToolsByAgent: profilePolicyMaps.enabledToolsByAgent,
|
|
192
|
-
hiddenToolsByAgent: profilePolicyMaps.hiddenToolsByAgent
|
|
193
|
-
},
|
|
194
|
-
catalogTtlMs: profilePolicyMaps.cacheTtlMs,
|
|
195
|
-
runtime: upstreamRuntime,
|
|
196
|
-
upstreamNamespaces: upstreamServers.map((server) => server.namespace)
|
|
197
|
-
});
|
|
198
|
-
const verifyApproval = createPortalApprovalVerifier({
|
|
199
|
-
onConservativeApprovalFallback: (event) => {
|
|
200
|
-
logger.log({
|
|
201
|
-
agentId: event.agentId,
|
|
202
|
-
conservativeCallCount: event.conservativeCallCount,
|
|
203
|
-
event: "conservative_approval_fallback",
|
|
204
|
-
level: "warn",
|
|
205
|
-
primaryReason: event.primaryReason,
|
|
206
|
-
strictCallCount: event.strictCallCount,
|
|
207
|
-
toolRefs: event.toolRefs
|
|
208
|
-
});
|
|
209
|
-
},
|
|
210
|
-
records: agentRecords
|
|
211
|
-
});
|
|
212
|
-
const app = createPortalHttpApp({
|
|
213
|
-
onSessionClosed: async (identity) => {
|
|
214
|
-
await sessionManager.invalidateSession(identity);
|
|
215
|
-
},
|
|
216
|
-
registeredAgentIds: Object.keys(portalConfig.agents),
|
|
217
|
-
resolveAgentIdentity: createPortalHttpAgentResolver(agentRecords),
|
|
218
|
-
serverAccess: {
|
|
219
|
-
expectedValue: serverAccessSecret,
|
|
220
|
-
headerName: portalConfig.server.accessHeader.name
|
|
221
|
-
},
|
|
222
|
-
toolRuntime: {
|
|
223
|
-
approval: (calls, identity, approvalToken) => verifyApproval(calls, identity.agentId, approvalToken),
|
|
224
|
-
callUpstreamTool: upstreamRuntime.callTool,
|
|
225
|
-
getSession: sessionManager.getSession
|
|
226
|
-
}
|
|
227
|
-
});
|
|
228
|
-
const listeningPort = createDeferredPort();
|
|
229
|
-
let hasListened = false;
|
|
230
|
-
const server = serveFn({
|
|
231
|
-
fetch: app.fetch,
|
|
232
|
-
hostname: portalConfig.server.host,
|
|
233
|
-
port: props.args.port ?? portalConfig.server.port
|
|
234
|
-
}, (info) => {
|
|
235
|
-
hasListened = true;
|
|
236
|
-
process.stdout.write(`listening port=${String(info.port)}\n`);
|
|
237
|
-
listeningPort.resolve(info.port);
|
|
238
|
-
});
|
|
239
|
-
server.on("error", (error) => {
|
|
240
|
-
handlePortalServerError({
|
|
241
|
-
error,
|
|
242
|
-
hasListened,
|
|
243
|
-
listeningPort,
|
|
244
|
-
logger
|
|
245
|
-
});
|
|
246
|
-
});
|
|
247
|
-
return {
|
|
248
|
-
close: async () => {
|
|
249
|
-
await app.closePortalSessions();
|
|
250
|
-
await Promise.all(Object.keys(portalConfig.agents).map((agentId) => sessionManager.invalidateAgentScope(agentId)));
|
|
251
|
-
await closeNodeServer(server);
|
|
252
|
-
},
|
|
253
|
-
port: await listeningPort.promise
|
|
254
|
-
};
|
|
255
|
-
}
|
|
256
|
-
async function main() {
|
|
257
|
-
const startedServer = await startPortalServer({
|
|
258
|
-
args: parsePortalServerCliArgs(process.argv.slice(2)),
|
|
259
|
-
env: process.env
|
|
260
|
-
});
|
|
261
|
-
const shutdown = async () => {
|
|
262
|
-
await startedServer.close();
|
|
263
|
-
process.exit(0);
|
|
264
|
-
};
|
|
265
|
-
process.on("SIGINT", () => {
|
|
266
|
-
shutdown();
|
|
267
|
-
});
|
|
268
|
-
process.on("SIGTERM", () => {
|
|
269
|
-
shutdown();
|
|
270
|
-
});
|
|
271
|
-
}
|
|
272
|
-
async function isPortalServerEntrypoint(importMetaUrl, argvEntryPath, realpathFn = realpath) {
|
|
273
|
-
if (argvEntryPath === void 0) return false;
|
|
274
|
-
try {
|
|
275
|
-
const modulePath = fileURLToPath(importMetaUrl);
|
|
276
|
-
const [realModulePath, realArgvEntryPath] = await Promise.all([realpathFn(modulePath), realpathFn(argvEntryPath)]);
|
|
277
|
-
return realModulePath === realArgvEntryPath;
|
|
278
|
-
} catch {
|
|
279
|
-
return false;
|
|
280
|
-
}
|
|
281
|
-
}
|
|
282
|
-
if (await isPortalServerEntrypoint(import.meta.url, process.argv[1])) main().catch((error) => {
|
|
283
|
-
process.stderr.write(`${error instanceof Error ? error.message : String(error)}\n`);
|
|
284
|
-
process.exit(1);
|
|
285
|
-
});
|
|
286
|
-
//#endregion
|
|
287
|
-
export { applyAgentOverrides, handlePortalServerError, isPortalServerEntrypoint, parsePortalServerCliArgs, startPortalServer };
|
|
288
|
-
|
|
289
|
-
//# sourceMappingURL=portal-server.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"portal-server.js","names":[],"sources":["../../src/bin/secret-value-resolver.ts","../../src/bin/portal-server.ts"],"sourcesContent":["import { execFile } from 'node:child_process';\nimport { promisify } from 'node:util';\n\nimport type { SecretValue } from '@agent-vm/config-contracts';\n\nconst execFileAsync = promisify(execFile);\n\nexport interface ResolveSecretValueProps {\n\treadonly env: Readonly<Record<string, string | undefined>>;\n\treadonly readOnePasswordSecret?: (ref: string) => Promise<string>;\n}\n\nexport async function resolveSecretValue(\n\tsecret: SecretValue,\n\tprops: ResolveSecretValueProps,\n): Promise<string> {\n\tif (secret.source === 'environment') {\n\t\tconst value = props.env[secret.name];\n\t\tif (value === undefined || value.length === 0) {\n\t\t\tthrow new Error(`Missing environment secret ${secret.name}.`);\n\t\t}\n\t\treturn value;\n\t}\n\n\tconst readOnePasswordSecret = props.readOnePasswordSecret ?? readOnePasswordCliSecret;\n\treturn await readOnePasswordSecret(secret.ref);\n}\n\nasync function readOnePasswordCliSecret(ref: string): Promise<string> {\n\tconst { stdout } = await execFileAsync('op', ['read', ref], { encoding: 'utf8' });\n\treturn stdout.trimEnd();\n}\n","#!/usr/bin/env node\nimport { realpath } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { parseArgs } from 'node:util';\n\nimport {\n\tloadMcpConfig,\n\tloadMcpPortalConfig,\n\tmcpConfigToResolvedProviders,\n\tresolveMcpPortalProfile,\n\ttype McpConfig,\n\ttype McpPortalAgentConfig,\n\ttype McpPortalConfig,\n\ttype ResolvedMcpProvider,\n\ttype ResolvedMcpPortalProfile,\n\ttype SecretValue,\n} from '@agent-vm/config-contracts';\nimport { serve } from '@hono/node-server';\n\nimport { parseHmacKeysFromEnv } from '../auth/hmac-env.js';\nimport { createPortalHttpApp } from '../mcp-server/portal-http-server.js';\nimport {\n\tcreatePortalAgentRuntimeRecords,\n\tcreatePortalApprovalVerifier,\n\tcreatePortalHttpAgentResolver,\n\tresolveAgentHmacKeys,\n} from '../mcp-server/resolve-agent-identity.js';\nimport type { PortalToolSelector } from '../portal-access-policy.js';\nimport { createPortalSessionManager } from '../portal-session.js';\nimport {\n\tcreateUpstreamMcpClientRuntime,\n\ttype NormalizedUpstreamMcpServer,\n} from '../upstream-mcp-client-runtime.js';\nimport { resolveSecretValue } from './secret-value-resolver.js';\n\ntype PortalNodeServer = ReturnType<typeof serve>;\ntype PortalServeFunction = typeof serve;\n\nexport type PortalServerLogEvent =\n\t| {\n\t\t\treadonly agentId: string;\n\t\t\treadonly conservativeCallCount: number;\n\t\t\treadonly event: 'conservative_approval_fallback';\n\t\t\treadonly level: 'warn';\n\t\t\treadonly primaryReason: string;\n\t\t\treadonly strictCallCount: number;\n\t\t\treadonly toolRefs: readonly string[];\n\t }\n\t| {\n\t\t\treadonly event: 'server_error';\n\t\t\treadonly level: 'error';\n\t\t\treadonly message: string;\n\t\t\treadonly stack?: string;\n\t };\n\nexport interface PortalServerLogger {\n\treadonly log: (event: PortalServerLogEvent) => void;\n}\n\nexport interface PortalServerCliArgs {\n\treadonly agentOverrides: readonly string[];\n\treadonly configDir: string;\n\treadonly port?: number;\n}\n\nexport interface StartPortalServerProps {\n\treadonly args: PortalServerCliArgs;\n\treadonly env: Readonly<Record<string, string | undefined>>;\n\treadonly logger?: PortalServerLogger;\n\treadonly resolveSecret?: (secret: SecretValue) => Promise<string>;\n\treadonly serveFn?: PortalServeFunction;\n}\n\ninterface ProfilePolicyMaps {\n\treadonly enabledNamespacesByAgent: Readonly<Record<string, readonly string[]>>;\n\treadonly enabledToolsByAgent: Readonly<Record<string, readonly PortalToolSelector[]>>;\n\treadonly hiddenToolsByAgent: Readonly<Record<string, readonly PortalToolSelector[]>>;\n}\n\nfunction parsePort(value: string | undefined): number | undefined {\n\tif (value === undefined) {\n\t\treturn undefined;\n\t}\n\tconst port = Number(value);\n\tif (!Number.isInteger(port) || port < 0 || port > 65_535) {\n\t\tthrow new Error(`Invalid --port value \"${value}\".`);\n\t}\n\treturn port;\n}\n\nexport function parsePortalServerCliArgs(argv: readonly string[]): PortalServerCliArgs {\n\tconst parsed = parseArgs({\n\t\targs: [...argv],\n\t\toptions: {\n\t\t\tagent: { multiple: true, type: 'string' },\n\t\t\t'config-dir': { type: 'string' },\n\t\t\tport: { short: 'p', type: 'string' },\n\t\t},\n\t\tstrict: true,\n\t});\n\tconst configDir = parsed.values['config-dir'];\n\tif (typeof configDir !== 'string' || configDir.length === 0) {\n\t\tthrow new Error('--config-dir <path> is required.');\n\t}\n\tconst rawAgentOverrides = parsed.values.agent;\n\tconst args = {\n\t\tagentOverrides: Array.isArray(rawAgentOverrides) ? rawAgentOverrides : [],\n\t\tconfigDir,\n\t};\n\tconst port = parsePort(parsed.values.port);\n\treturn port === undefined ? args : { ...args, port };\n}\n\nexport function applyAgentOverrides(\n\tagents: Readonly<Record<string, McpPortalAgentConfig>>,\n\toverrides: readonly string[],\n): Readonly<Record<string, McpPortalAgentConfig>> {\n\tconst nextAgents: Record<string, McpPortalAgentConfig> = { ...agents };\n\tfor (const override of overrides) {\n\t\tconst [agentId, profileName, extra] = override.split('=');\n\t\tif (\n\t\t\tagentId === undefined ||\n\t\t\tprofileName === undefined ||\n\t\t\textra !== undefined ||\n\t\t\tagentId.length === 0 ||\n\t\t\tprofileName.length === 0\n\t\t) {\n\t\t\tthrow new Error(`Invalid --agent override \"${override}\". Expected <agentId>=<profile>.`);\n\t\t}\n\t\tconst existingAgent = nextAgents[agentId];\n\t\tif (existingAgent === undefined) {\n\t\t\tthrow new Error(`Cannot override unknown MCP Portal agent \"${agentId}\".`);\n\t\t}\n\t\tnextAgents[agentId] = { ...existingAgent, profile: profileName };\n\t}\n\treturn nextAgents;\n}\n\nexport interface DeferredPort {\n\treadonly promise: Promise<number>;\n\treadonly reject: (error: Error) => void;\n\treadonly resolve: (port: number) => void;\n}\n\nfunction createDeferredPort(): DeferredPort {\n\tlet rejectPort: ((error: Error) => void) | undefined;\n\tlet resolvePort: ((port: number) => void) | undefined;\n\tconst promise = new Promise<number>((resolve, reject) => {\n\t\trejectPort = reject;\n\t\tresolvePort = resolve;\n\t});\n\treturn {\n\t\tpromise,\n\t\treject: (error) => {\n\t\t\tif (rejectPort === undefined) {\n\t\t\t\tthrow new Error('MCP Portal port rejector was not initialized.');\n\t\t\t}\n\t\t\trejectPort(error);\n\t\t},\n\t\tresolve: (port) => {\n\t\t\tif (resolvePort === undefined) {\n\t\t\t\tthrow new Error('MCP Portal port resolver was not initialized.');\n\t\t\t}\n\t\t\tresolvePort(port);\n\t\t},\n\t};\n}\n\nfunction defaultPortalServerLogger(): PortalServerLogger {\n\treturn {\n\t\tlog: (event) => {\n\t\t\tprocess.stderr.write(`${JSON.stringify(event)}\\n`);\n\t\t},\n\t};\n}\n\nexport function handlePortalServerError(props: {\n\treadonly error: Error;\n\treadonly hasListened: boolean;\n\treadonly listeningPort: DeferredPort;\n\treadonly logger: PortalServerLogger;\n}): void {\n\tprops.logger.log({\n\t\tevent: 'server_error',\n\t\tlevel: 'error',\n\t\tmessage: props.error.message,\n\t\t...(props.error.stack === undefined ? {} : { stack: props.error.stack }),\n\t});\n\tif (!props.hasListened) {\n\t\tprops.listeningPort.reject(props.error);\n\t}\n}\n\nfunction closeNodeServer(server: PortalNodeServer): Promise<void> {\n\treturn new Promise<void>((resolve, reject) => {\n\t\tserver.close((error) => {\n\t\t\tif (error) {\n\t\t\t\treject(error);\n\t\t\t} else {\n\t\t\t\tresolve();\n\t\t\t}\n\t\t});\n\t});\n}\n\nasync function resolveProviderSecretRecord(\n\tsecrets: Readonly<Record<string, SecretValue>>,\n\tresolveSecret: (secret: SecretValue) => Promise<string>,\n): Promise<Readonly<Record<string, string>>> {\n\tconst resolvedEntries = await Promise.all(\n\t\tObject.entries(secrets).map(\n\t\t\tasync ([name, secret]) => [name, await resolveSecret(secret)] as const,\n\t\t),\n\t);\n\treturn Object.fromEntries(resolvedEntries);\n}\n\nasync function resolveUpstreamServer(\n\tprovider: ResolvedMcpProvider,\n\tresolveSecret: (secret: SecretValue) => Promise<string>,\n): Promise<NormalizedUpstreamMcpServer> {\n\tif (provider.transport === 'stdio') {\n\t\treturn {\n\t\t\targs: provider.args,\n\t\t\tcommand: provider.command,\n\t\t\t...(provider.cwd === undefined ? {} : { cwd: provider.cwd }),\n\t\t\tenv: await resolveProviderSecretRecord(provider.env, resolveSecret),\n\t\t\tnamespace: provider.namespace,\n\t\t\ttransport: 'stdio',\n\t\t};\n\t}\n\n\treturn {\n\t\theaders: await resolveProviderSecretRecord(provider.headers, resolveSecret),\n\t\tnamespace: provider.namespace,\n\t\ttransport: provider.transport,\n\t\turl: provider.url,\n\t};\n}\n\nasync function resolveUpstreamServers(\n\tmcpConfig: McpConfig,\n\tresolveSecret: (secret: SecretValue) => Promise<string>,\n): Promise<readonly NormalizedUpstreamMcpServer[]> {\n\treturn await Promise.all(\n\t\tmcpConfigToResolvedProviders(mcpConfig).map(async (provider) =>\n\t\t\tresolveUpstreamServer(provider, resolveSecret),\n\t\t),\n\t);\n}\n\nfunction selectorsFromNamespaceTools(\n\tnamespaceTools: Readonly<Record<string, readonly string[]>>,\n): readonly PortalToolSelector[] {\n\treturn Object.entries(namespaceTools).flatMap(([namespace, toolNames]) =>\n\t\ttoolNames.map((toolName) => ({ namespace, toolName })),\n\t);\n}\n\nfunction buildProfilePolicyMaps(\n\tportalConfig: McpPortalConfig,\n): ProfilePolicyMaps & { readonly cacheTtlMs: number } {\n\tconst enabledNamespacesByAgent: Record<string, readonly string[]> = {};\n\tconst enabledToolsByAgent: Record<string, readonly PortalToolSelector[]> = {};\n\tconst hiddenToolsByAgent: Record<string, readonly PortalToolSelector[]> = {};\n\tconst profileTtls: number[] = [];\n\n\tfor (const [agentId, agent] of Object.entries(portalConfig.agents)) {\n\t\tconst profile: ResolvedMcpPortalProfile = resolveMcpPortalProfile(portalConfig, agent.profile);\n\t\tenabledNamespacesByAgent[agentId] = profile.enabledNamespaces;\n\t\tenabledToolsByAgent[agentId] = selectorsFromNamespaceTools(profile.enabledToolsByNamespace);\n\t\thiddenToolsByAgent[agentId] = selectorsFromNamespaceTools(profile.hiddenToolsByNamespace);\n\t\tprofileTtls.push(profile.cache.catalogTtlMs);\n\t}\n\n\treturn {\n\t\tcacheTtlMs: profileTtls.length === 0 ? 60_000 : Math.min(...profileTtls),\n\t\tenabledNamespacesByAgent,\n\t\tenabledToolsByAgent,\n\t\thiddenToolsByAgent,\n\t};\n}\n\nfunction withAgentOverrides(\n\tportalConfig: McpPortalConfig,\n\tagentOverrides: readonly string[],\n): McpPortalConfig {\n\treturn {\n\t\t...portalConfig,\n\t\tagents: applyAgentOverrides(portalConfig.agents, agentOverrides),\n\t};\n}\n\nexport async function startPortalServer(\n\tprops: StartPortalServerProps,\n): Promise<{ readonly close: () => Promise<void>; readonly port: number }> {\n\tconst logger = props.logger ?? defaultPortalServerLogger();\n\tconst serveFn = props.serveFn ?? serve;\n\tconst resolveSecret =\n\t\tprops.resolveSecret ??\n\t\t((secret: SecretValue) => resolveSecretValue(secret, { env: props.env }));\n\tconst mcpConfig = await loadMcpConfig(join(props.args.configDir, 'mcp.config.jsonc'));\n\tconst portalConfig = withAgentOverrides(\n\t\tawait loadMcpPortalConfig(join(props.args.configDir, 'mcp-portal.config.jsonc')),\n\t\tprops.args.agentOverrides,\n\t);\n\tconst serverAccessSecret = await resolveSecret(portalConfig.server.accessHeader.secret);\n\tconst hmacKeys = await resolveAgentHmacKeys({\n\t\tagents: portalConfig.agents,\n\t\tenvKeys: parseHmacKeysFromEnv(props.env),\n\t\tresolveSecret,\n\t});\n\tconst agentRecords = createPortalAgentRuntimeRecords({ hmacKeys, portalConfig });\n\tconst upstreamServers = await resolveUpstreamServers(mcpConfig, resolveSecret);\n\tconst upstreamRuntime = createUpstreamMcpClientRuntime({ servers: upstreamServers });\n\tconst profilePolicyMaps = buildProfilePolicyMaps(portalConfig);\n\tconst sessionManager = createPortalSessionManager({\n\t\taccessPolicy: {\n\t\t\tdefaultPolicy: 'deny-all',\n\t\t\tenabledNamespacesByAgent: profilePolicyMaps.enabledNamespacesByAgent,\n\t\t\tenabledToolsByAgent: profilePolicyMaps.enabledToolsByAgent,\n\t\t\thiddenToolsByAgent: profilePolicyMaps.hiddenToolsByAgent,\n\t\t},\n\t\tcatalogTtlMs: profilePolicyMaps.cacheTtlMs,\n\t\truntime: upstreamRuntime,\n\t\tupstreamNamespaces: upstreamServers.map((server) => server.namespace),\n\t});\n\tconst verifyApproval = createPortalApprovalVerifier({\n\t\tonConservativeApprovalFallback: (event) => {\n\t\t\tlogger.log({\n\t\t\t\tagentId: event.agentId,\n\t\t\t\tconservativeCallCount: event.conservativeCallCount,\n\t\t\t\tevent: 'conservative_approval_fallback',\n\t\t\t\tlevel: 'warn',\n\t\t\t\tprimaryReason: event.primaryReason,\n\t\t\t\tstrictCallCount: event.strictCallCount,\n\t\t\t\ttoolRefs: event.toolRefs,\n\t\t\t});\n\t\t},\n\t\trecords: agentRecords,\n\t});\n\tconst app = createPortalHttpApp({\n\t\tonSessionClosed: async (identity) => {\n\t\t\tawait sessionManager.invalidateSession(identity);\n\t\t},\n\t\tregisteredAgentIds: Object.keys(portalConfig.agents),\n\t\tresolveAgentIdentity: createPortalHttpAgentResolver(agentRecords),\n\t\tserverAccess: {\n\t\t\texpectedValue: serverAccessSecret,\n\t\t\theaderName: portalConfig.server.accessHeader.name,\n\t\t},\n\t\ttoolRuntime: {\n\t\t\tapproval: (calls, identity, approvalToken) =>\n\t\t\t\tverifyApproval(calls, identity.agentId, approvalToken),\n\t\t\tcallUpstreamTool: upstreamRuntime.callTool,\n\t\t\tgetSession: sessionManager.getSession,\n\t\t},\n\t});\n\tconst listeningPort = createDeferredPort();\n\tlet hasListened = false;\n\tconst server = serveFn(\n\t\t{\n\t\t\tfetch: app.fetch,\n\t\t\thostname: portalConfig.server.host,\n\t\t\tport: props.args.port ?? portalConfig.server.port,\n\t\t},\n\t\t(info) => {\n\t\t\thasListened = true;\n\t\t\tprocess.stdout.write(`listening port=${String(info.port)}\\n`);\n\t\t\tlisteningPort.resolve(info.port);\n\t\t},\n\t);\n\tserver.on('error', (error: Error) => {\n\t\thandlePortalServerError({ error, hasListened, listeningPort, logger });\n\t});\n\tconst port = await listeningPort.promise;\n\n\treturn {\n\t\tclose: async () => {\n\t\t\tawait app.closePortalSessions();\n\t\t\tawait Promise.all(\n\t\t\t\tObject.keys(portalConfig.agents).map((agentId) =>\n\t\t\t\t\tsessionManager.invalidateAgentScope(agentId),\n\t\t\t\t),\n\t\t\t);\n\t\t\tawait closeNodeServer(server);\n\t\t},\n\t\tport,\n\t};\n}\n\nasync function main(): Promise<void> {\n\tconst startedServer = await startPortalServer({\n\t\targs: parsePortalServerCliArgs(process.argv.slice(2)),\n\t\tenv: process.env,\n\t});\n\tconst shutdown = async (): Promise<void> => {\n\t\tawait startedServer.close();\n\t\tprocess.exit(0);\n\t};\n\tprocess.on('SIGINT', () => {\n\t\tvoid shutdown();\n\t});\n\tprocess.on('SIGTERM', () => {\n\t\tvoid shutdown();\n\t});\n}\n\nexport async function isPortalServerEntrypoint(\n\timportMetaUrl: string,\n\targvEntryPath: string | undefined,\n\trealpathFn: (targetPath: string) => Promise<string> = realpath,\n): Promise<boolean> {\n\tif (argvEntryPath === undefined) {\n\t\treturn false;\n\t}\n\ttry {\n\t\tconst modulePath = fileURLToPath(importMetaUrl);\n\t\tconst [realModulePath, realArgvEntryPath] = await Promise.all([\n\t\t\trealpathFn(modulePath),\n\t\t\trealpathFn(argvEntryPath),\n\t\t]);\n\t\treturn realModulePath === realArgvEntryPath;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nif (await isPortalServerEntrypoint(import.meta.url, process.argv[1])) {\n\tvoid main().catch((error: unknown) => {\n\t\tprocess.stderr.write(`${error instanceof Error ? error.message : String(error)}\\n`);\n\t\tprocess.exit(1);\n\t});\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index-BcI9c8sg.d.ts","names":[],"sources":["../src/tool-vm/typescript-artifact.ts","../src/zod-schema-loader.ts"],"mappings":";;;UAKiB,oBAAA;EAAA,SACP,KAAA,WAAgB,gBAAA;AAAA;AAAA,iBAwBV,iCAAA,CAAkC,KAAA,EAAO,oBAAA;;;UC1BxC,oBAAA;EAAA,SACP,IAAA;EAAA,SACA,OAAA;EAAA,SACA,IAAA;AAAA;AAAA,UAGO,oBAAA;EAAA,SACP,IAAA;EAAA,SACA,MAAA,WAAiB,oBAAA;AAAA;AAAA,UAGV,gCAAA;EAAA,SACP,OAAA;EAAA,SACA,IAAA;EAAA,SACA,OAAA;EAAA,SACA,IAAA;AAAA;AAAA,KAGE,sBAAA;EAAA,SACE,EAAA;EAAA,SAAmB,KAAA;AAAA;EAAA,SACnB,KAAA,EAAO,oBAAA;EAAA,SAA+B,EAAA;AAAA;AAAA,KAExC,iBAAA;EAAA,SAEA,EAAA;EAAA,SACA,QAAA,GAAW,KAAA,cAAmB,sBAAA;AAAA;EAAA,SAG9B,KAAA,EAAO,gCAAA;EAAA,SACP,EAAA;AAAA;AAAA,iBA4EI,+BAAA,CAAgC,UAAA,EAAY,UAAA,GAAa,iBAAA"}
|
package/dist/index.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","names":[],"sources":["../src/auth/hmac-env.ts","../src/auth/hmac-token.ts","../src/mcp-server/portal-call-validation.ts","../src/portal-access-policy.ts","../src/tool-ref.ts","../src/tool-graph.ts","../src/tool-summary.ts","../src/search-index.ts","../src/portal-session.ts","../src/mcp-server/portal-tools.ts","../src/mcp-server/portal-http-server.ts","../src/mcp-server/portal-mcp-server.ts","../src/mcp-server/resolve-agent-identity.ts","../src/upstream-mcp-client-runtime.ts","../src/upstream-response-middleware.ts"],"mappings":"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"}
|
package/dist/tool-vm/index.d.ts
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import { a as SchemaValidationUnavailableError, c as generateTypescriptCatalogArtifact, i as PortalValidationResult, n as InputValidationError, o as buildZodValidatorFromJsonSchema, r as InputValidationIssue, s as CatalogArtifactInput, t as BuiltZodValidator } from "../index-BcI9c8sg.js";
|
|
2
|
-
export { BuiltZodValidator, CatalogArtifactInput, InputValidationError, InputValidationIssue, PortalValidationResult, SchemaValidationUnavailableError, buildZodValidatorFromJsonSchema, generateTypescriptCatalogArtifact };
|
package/dist/tool-vm-ihnzDyjJ.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"typescript-artifact-BqU8okQy.js","names":[],"sources":["../src/json-schema.ts","../src/catalog-types.ts","../src/tool-ref.ts","../src/tool-vm/typescript-artifact.ts"],"sourcesContent":["import { z } from 'zod';\n\nexport type JsonPrimitive = boolean | null | number | string;\nexport type JsonArray = JsonValue[];\nexport type JsonObject = { [key: string]: JsonValue };\nexport type JsonValue = JsonArray | JsonObject | JsonPrimitive;\n\nexport const jsonValueSchema: z.ZodType<JsonValue> = z.lazy(() =>\n\tz.union([\n\t\tz.string(),\n\t\tz.number().finite(),\n\t\tz.boolean(),\n\t\tz.null(),\n\t\tz.array(jsonValueSchema),\n\t\tjsonObjectSchema,\n\t]),\n);\n\nexport const jsonObjectSchema: z.ZodType<JsonObject> = z.record(z.string(), jsonValueSchema);\n\nexport function isJsonObject(value: unknown): value is JsonObject {\n\treturn typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nexport function assertJsonObject(value: unknown, label: string): JsonObject {\n\tif (!isJsonObject(value)) {\n\t\tthrow new Error(`${label} must be a JSON object.`);\n\t}\n\n\treturn jsonObjectSchema.parse(value);\n}\n","import { z } from 'zod';\n\nimport { jsonObjectSchema, type JsonObject, type JsonValue } from './json-schema.js';\n\nconst forbiddenMetadataKeys = new Set([\n\t'agentid',\n\t'authprofile',\n\t'bindingid',\n\t'runid',\n\t'sessionid',\n]);\n\nfunction findForbiddenMetadataKey(value: JsonObject): string | null {\n\tconst stack: JsonValue[] = [value];\n\n\twhile (stack.length > 0) {\n\t\tconst current = stack.pop();\n\t\tif (!current) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (Array.isArray(current)) {\n\t\t\tstack.push(...current);\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (typeof current !== 'object' || current === null) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tfor (const [key, childValue] of Object.entries(current)) {\n\t\t\tif (forbiddenMetadataKeys.has(key.toLowerCase())) {\n\t\t\t\treturn key;\n\t\t\t}\n\t\t\tif (typeof childValue === 'object' && childValue !== null) {\n\t\t\t\tstack.push(childValue);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn null;\n}\n\nexport const portalToolAnnotationsSchema = z\n\t.object({\n\t\tdestructiveHint: z.boolean().optional(),\n\t\tidempotentHint: z.boolean().optional(),\n\t\topenWorldHint: z.boolean().optional(),\n\t\treadOnlyHint: z.boolean().optional(),\n\t\ttitle: z.string().optional(),\n\t})\n\t.catchall(jsonObjectSchema.or(z.string()).or(z.number()).or(z.boolean()).or(z.null()))\n\t.optional();\n\nexport const safeToolMetadataSchema = jsonObjectSchema\n\t.optional()\n\t.superRefine((metadata, context) => {\n\t\tif (!metadata) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst forbiddenKey = findForbiddenMetadataKey(metadata);\n\t\tif (forbiddenKey) {\n\t\t\tcontext.addIssue({\n\t\t\t\tcode: 'custom',\n\t\t\t\tmessage: `metadata contains forbidden key \"${forbiddenKey}\"`,\n\t\t\t});\n\t\t}\n\t});\n\nexport const portalToolRecordSchema = z\n\t.object({\n\t\tannotations: portalToolAnnotationsSchema,\n\t\tdescription: z.string().optional(),\n\t\tinputSchema: jsonObjectSchema,\n\t\tmetadata: safeToolMetadataSchema,\n\t\tnamespace: z.string().min(1),\n\t\toutputSchema: jsonObjectSchema.optional(),\n\t\ttitle: z.string().optional(),\n\t\ttoolName: z.string().min(1),\n\t})\n\t.strict();\n\nexport type PortalToolRecord = z.infer<typeof portalToolRecordSchema>;\nexport type PortalToolAnnotations = z.infer<typeof portalToolAnnotationsSchema>;\n","import { z } from 'zod';\n\nexport interface ToolIdentity {\n\treadonly namespace: string;\n\treadonly toolName: string;\n}\n\nconst toolIdentitySchema = z\n\t.object({\n\t\tnamespace: z.string().min(1),\n\t\ttoolName: z.string().min(1),\n\t})\n\t.strict();\nconst toolRefSchema = z.string().startsWith('mcp:').brand<'ToolRef'>();\n\nexport type ToolRef = z.infer<typeof toolRefSchema>;\n\nfunction decodeToolRefSegment(segment: string): string {\n\tif (!/^[A-Za-z0-9_-]+$/.test(segment)) {\n\t\tthrow new Error('Invalid MCP toolRef.');\n\t}\n\n\tconst decoded = Buffer.from(segment, 'base64url').toString('utf-8');\n\tconst canonicalSegment = Buffer.from(decoded, 'utf-8').toString('base64url');\n\tif (canonicalSegment !== segment) {\n\t\tthrow new Error('Invalid MCP toolRef.');\n\t}\n\n\treturn decoded;\n}\n\nexport function encodeToolRef(identity: ToolIdentity): ToolRef {\n\tconst parsed = toolIdentitySchema.parse(identity);\n\tconst encodedNamespace = Buffer.from(parsed.namespace, 'utf-8').toString('base64url');\n\tconst encodedToolName = Buffer.from(parsed.toolName, 'utf-8').toString('base64url');\n\n\treturn toolRefSchema.parse(`mcp:${encodedNamespace}:${encodedToolName}`);\n}\n\nexport function decodeToolRef(toolRef: string | ToolRef): ToolIdentity {\n\tconst [scheme, encodedNamespace, encodedToolName, ...extraParts] = toolRef.split(':');\n\tif (scheme !== 'mcp' || !encodedNamespace || !encodedToolName || extraParts.length > 0) {\n\t\tthrow new Error('Invalid MCP toolRef.');\n\t}\n\n\ttry {\n\t\treturn toolIdentitySchema.parse({\n\t\t\tnamespace: decodeToolRefSegment(encodedNamespace),\n\t\t\ttoolName: decodeToolRefSegment(encodedToolName),\n\t\t});\n\t} catch {\n\t\tthrow new Error('Invalid MCP toolRef.');\n\t}\n}\n","import { createHash } from 'node:crypto';\n\nimport { portalToolRecordSchema, type PortalToolRecord } from '../catalog-types.js';\nimport { encodeToolRef } from '../tool-ref.js';\n\nexport interface CatalogArtifactInput {\n\treadonly tools: readonly PortalToolRecord[];\n}\n\nfunction toIdentifierPart(value: string): string {\n\tconst words = value.split(/[^A-Za-z0-9]+/).filter(Boolean);\n\tif (words.length === 0) {\n\t\treturn 'tool';\n\t}\n\n\treturn words.map((word) => word.slice(0, 1).toUpperCase() + word.slice(1)).join('');\n}\n\nfunction shortToolRefHash(toolRef: string): string {\n\treturn createHash('sha256').update(toolRef).digest('hex').slice(0, 8);\n}\n\nfunction toToolConstantName(tool: PortalToolRecord & { readonly toolRef: string }): string {\n\tconst namespacePart = toIdentifierPart(tool.namespace);\n\tconst toolNamePart = toIdentifierPart(tool.toolName);\n\tconst identifier = `${namespacePart}${toolNamePart}${shortToolRefHash(tool.toolRef)}Tool`;\n\n\treturn identifier.slice(0, 1).toLowerCase() + identifier.slice(1);\n}\n\nexport function generateTypescriptCatalogArtifact(input: CatalogArtifactInput): string {\n\tconst tools = input.tools\n\t\t.map((tool) => portalToolRecordSchema.parse(tool))\n\t\t.toSorted((left, right) => {\n\t\t\tconst leftRef = encodeToolRef({ namespace: left.namespace, toolName: left.toolName });\n\t\t\tconst rightRef = encodeToolRef({ namespace: right.namespace, toolName: right.toolName });\n\t\t\treturn leftRef.localeCompare(rightRef);\n\t\t});\n\n\tconst catalogEntries = tools.map((tool) =>\n\t\tObject.assign({}, tool, {\n\t\t\ttoolRef: encodeToolRef({ namespace: tool.namespace, toolName: tool.toolName }),\n\t\t}),\n\t);\n\tconst constants = catalogEntries\n\t\t.map((tool) => {\n\t\t\tconst constantName = toToolConstantName(tool);\n\t\t\treturn `export const ${constantName} = requireCatalogTool(${JSON.stringify(tool.toolRef)});`;\n\t\t})\n\t\t.join('\\n');\n\n\treturn [\n\t\t'// Generated by agent-vm-mcp-portal. JSON Schema is canonical; Zod is derived for runtime validation.',\n\t\t\"import * as z from 'zod';\",\n\t\t'',\n\t\t`export const portalCatalog = ${JSON.stringify({ tools: catalogEntries }, null, '\\t')} as const;`,\n\t\t'',\n\t\tconstants,\n\t\t'',\n\t\t'function requireCatalogTool(toolRef: string): (typeof portalCatalog.tools)[number] {',\n\t\t'\\tconst tool = portalCatalog.tools.find((catalogTool) => catalogTool.toolRef === toolRef);',\n\t\t'\\tif (!tool) {',\n\t\t'\\t\\tthrow new Error(`Unknown MCP portal toolRef: ${toolRef}`);',\n\t\t'\\t}',\n\t\t'\\treturn tool;',\n\t\t'}',\n\t\t'',\n\t\t'export function createInputValidator(toolRef: string): z.ZodType {',\n\t\t'\\tconst tool = requireCatalogTool(toolRef);',\n\t\t'\\treturn z.fromJSONSchema(tool.inputSchema);',\n\t\t'}',\n\t\t'',\n\t].join('\\n');\n}\n"],"mappings":"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"}
|