@agent-vm/mcp-portal 0.0.69 → 0.0.71
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-D3SlETy_.js +358 -0
- package/dist/serve-command-D3SlETy_.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
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { F as PortalToolSelector } from "../portal-session-DG2CUjIo.js";
|
|
2
|
+
import { f as PortalHttpAuditEvent, n as PortalApprovalAuditEvent } from "../resolve-agent-identity-FQL02YdW.js";
|
|
3
|
+
import { McpPortalAgentConfig, McpPortalConfig, SecretValue } from "@agent-vm/config-contracts";
|
|
4
|
+
import { SecretResolver, createSecretResolver, resolveServiceAccountToken } from "@agent-vm/secret-management";
|
|
5
|
+
import { serve } from "@hono/node-server";
|
|
6
|
+
|
|
7
|
+
//#region src/cli/serve-command.d.ts
|
|
8
|
+
type PortalServeFunction = typeof serve;
|
|
9
|
+
type PortalServerLogEvent = {
|
|
10
|
+
readonly event: 'server_error';
|
|
11
|
+
readonly level: 'error';
|
|
12
|
+
readonly message: string;
|
|
13
|
+
readonly stack?: string;
|
|
14
|
+
} | {
|
|
15
|
+
readonly agentId: string;
|
|
16
|
+
readonly clientAddress: string;
|
|
17
|
+
readonly decision: PortalHttpAuditEvent['decision'];
|
|
18
|
+
readonly event: 'mcp_proxy_auth';
|
|
19
|
+
readonly level: 'info' | 'warn';
|
|
20
|
+
readonly reason?: PortalHttpAuditEvent['reason'];
|
|
21
|
+
readonly timeMs: number;
|
|
22
|
+
} | {
|
|
23
|
+
readonly agentId: string;
|
|
24
|
+
readonly clientAddress: string;
|
|
25
|
+
readonly event: 'mcp_proxy_auth_audit_error';
|
|
26
|
+
readonly level: 'warn';
|
|
27
|
+
readonly message: string;
|
|
28
|
+
readonly timeMs: number;
|
|
29
|
+
} | {
|
|
30
|
+
readonly agentId: string;
|
|
31
|
+
readonly decision: PortalApprovalAuditEvent['decision'];
|
|
32
|
+
readonly event: 'mcp_portal_approval';
|
|
33
|
+
readonly level: 'info' | 'warn';
|
|
34
|
+
readonly reason?: PortalApprovalAuditEvent['reason'];
|
|
35
|
+
readonly timeMs: number;
|
|
36
|
+
readonly verifierReason?: string;
|
|
37
|
+
} | {
|
|
38
|
+
readonly agentId: string;
|
|
39
|
+
readonly event: 'mcp_portal_approval_audit_error';
|
|
40
|
+
readonly level: 'warn';
|
|
41
|
+
readonly message: string;
|
|
42
|
+
readonly timeMs: number;
|
|
43
|
+
} | {
|
|
44
|
+
readonly agentScopeId: string;
|
|
45
|
+
readonly event: 'upstream_close_error';
|
|
46
|
+
readonly level: 'warn';
|
|
47
|
+
readonly message: string;
|
|
48
|
+
readonly namespace?: string;
|
|
49
|
+
};
|
|
50
|
+
interface PortalServerLogger {
|
|
51
|
+
readonly log: (event: PortalServerLogEvent) => void;
|
|
52
|
+
}
|
|
53
|
+
interface PortalServerCliArgs {
|
|
54
|
+
readonly agentOverrides: readonly string[];
|
|
55
|
+
readonly configDir: string;
|
|
56
|
+
readonly port?: number;
|
|
57
|
+
}
|
|
58
|
+
interface StartPortalServerProps {
|
|
59
|
+
readonly args: PortalServerCliArgs;
|
|
60
|
+
readonly env: Readonly<Record<string, string | undefined>>;
|
|
61
|
+
readonly logger?: PortalServerLogger;
|
|
62
|
+
readonly resolveSecret?: (secret: SecretValue) => Promise<string>;
|
|
63
|
+
readonly serveFn?: PortalServeFunction;
|
|
64
|
+
}
|
|
65
|
+
interface CreateServeSecretResolverDependencies {
|
|
66
|
+
readonly createOnePasswordSecretResolver?: typeof createSecretResolver;
|
|
67
|
+
readonly resolveServiceAccountToken?: typeof resolveServiceAccountToken;
|
|
68
|
+
}
|
|
69
|
+
declare function createServeSecretResolver(env: Readonly<Record<string, string | undefined>>, dependencies?: CreateServeSecretResolverDependencies): Promise<SecretResolver>;
|
|
70
|
+
interface ProfilePolicyMaps {
|
|
71
|
+
readonly enabledNamespacesByAgent: Readonly<Record<string, readonly string[]>>;
|
|
72
|
+
readonly enabledToolsByAgent: Readonly<Record<string, readonly PortalToolSelector[]>>;
|
|
73
|
+
readonly hiddenToolsByAgent: Readonly<Record<string, readonly PortalToolSelector[]>>;
|
|
74
|
+
}
|
|
75
|
+
declare function parsePortalServerCliArgs(argv: readonly string[]): PortalServerCliArgs;
|
|
76
|
+
declare function applyAgentOverrides(agents: Readonly<Record<string, McpPortalAgentConfig>>, overrides: readonly string[]): Readonly<Record<string, McpPortalAgentConfig>>;
|
|
77
|
+
interface DeferredPort {
|
|
78
|
+
readonly promise: Promise<number>;
|
|
79
|
+
readonly reject: (error: Error) => void;
|
|
80
|
+
readonly resolve: (port: number) => void;
|
|
81
|
+
}
|
|
82
|
+
declare function handlePortalServerError(props: {
|
|
83
|
+
readonly error: Error;
|
|
84
|
+
readonly hasListened: boolean;
|
|
85
|
+
readonly listeningPort: DeferredPort;
|
|
86
|
+
readonly logger: PortalServerLogger;
|
|
87
|
+
}): void;
|
|
88
|
+
declare function buildProfilePolicyMaps(portalConfig: McpPortalConfig): ProfilePolicyMaps & {
|
|
89
|
+
readonly cacheTtlMs: number;
|
|
90
|
+
};
|
|
91
|
+
declare function deriveApprovalHmacKeysFromMasterKey(props: {
|
|
92
|
+
readonly agentIds: readonly string[];
|
|
93
|
+
readonly masterKey: Buffer;
|
|
94
|
+
}): ReadonlyMap<string, Buffer>;
|
|
95
|
+
declare function startPortalServer(props: StartPortalServerProps): Promise<{
|
|
96
|
+
readonly close: () => Promise<void>;
|
|
97
|
+
readonly port: number;
|
|
98
|
+
}>;
|
|
99
|
+
//#endregion
|
|
100
|
+
export { CreateServeSecretResolverDependencies, DeferredPort, PortalServerCliArgs, PortalServerLogEvent, PortalServerLogger, ProfilePolicyMaps, StartPortalServerProps, applyAgentOverrides, buildProfilePolicyMaps, createServeSecretResolver, deriveApprovalHmacKeysFromMasterKey, handlePortalServerError, parsePortalServerCliArgs, startPortalServer };
|
|
101
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../../src/cli/serve-command.ts"],"mappings":";;;;;;;KAuCK,mBAAA,UAA6B,KAAA;AAAA,KAEtB,oBAAA;EAAA,SAEA,KAAA;EAAA,SACA,KAAA;EAAA,SACA,OAAA;EAAA,SACA,KAAA;AAAA;EAAA,SAGA,OAAA;EAAA,SACA,aAAA;EAAA,SACA,QAAA,EAAU,oBAAA;EAAA,SACV,KAAA;EAAA,SACA,KAAA;EAAA,SACA,MAAA,GAAS,oBAAA;EAAA,SACT,MAAA;AAAA;EAAA,SAGA,OAAA;EAAA,SACA,aAAA;EAAA,SACA,KAAA;EAAA,SACA,KAAA;EAAA,SACA,OAAA;EAAA,SACA,MAAA;AAAA;EAAA,SAGA,OAAA;EAAA,SACA,QAAA,EAAU,wBAAA;EAAA,SACV,KAAA;EAAA,SACA,KAAA;EAAA,SACA,MAAA,GAAS,wBAAA;EAAA,SACT,MAAA;EAAA,SACA,cAAA;AAAA;EAAA,SAGA,OAAA;EAAA,SACA,KAAA;EAAA,SACA,KAAA;EAAA,SACA,OAAA;EAAA,SACA,MAAA;AAAA;EAAA,SAGA,YAAA;EAAA,SACA,KAAA;EAAA,SACA,KAAA;EAAA,SACA,OAAA;EAAA,SACA,SAAA;AAAA;AAAA,UAGK,kBAAA;EAAA,SACP,GAAA,GAAM,KAAA,EAAO,oBAAA;AAAA;AAAA,UAGN,mBAAA;EAAA,SACP,cAAA;EAAA,SACA,SAAA;EAAA,SACA,IAAA;AAAA;AAAA,UAGO,sBAAA;EAAA,SACP,IAAA,EAAM,mBAAA;EAAA,SACN,GAAA,EAAK,QAAA,CAAS,MAAA;EAAA,SACd,MAAA,GAAS,kBAAA;EAAA,SACT,aAAA,IAAiB,MAAA,EAAQ,WAAA,KAAgB,OAAA;EAAA,SACzC,OAAA,GAAU,mBAAA;AAAA;AAAA,UAGH,qCAAA;EAAA,SACP,+BAAA,UAAyC,oBAAA;EAAA,SACzC,0BAAA,UAAoC,0BAAA;AAAA;AAAA,iBAgFxB,yBAAA,CACrB,GAAA,EAAK,QAAA,CAAS,MAAA,+BACd,YAAA,GAAc,qCAAA,GACZ,OAAA,CAAQ,cAAA;AAAA,UAkBM,iBAAA;EAAA,SACP,wBAAA,EAA0B,QAAA,CAAS,MAAA;EAAA,SACnC,mBAAA,EAAqB,QAAA,CAAS,MAAA,kBAAwB,kBAAA;EAAA,SACtD,kBAAA,EAAoB,QAAA,CAAS,MAAA,kBAAwB,kBAAA;AAAA;AAAA,iBAc/C,wBAAA,CAAyB,IAAA,sBAA0B,mBAAA;AAAA,iBAuBnD,mBAAA,CACf,MAAA,EAAQ,QAAA,CAAS,MAAA,SAAe,oBAAA,IAChC,SAAA,sBACE,QAAA,CAAS,MAAA,SAAe,oBAAA;AAAA,UAsBV,YAAA;EAAA,SACP,OAAA,EAAS,OAAA;EAAA,SACT,MAAA,GAAS,KAAA,EAAO,KAAA;EAAA,SAChB,OAAA,GAAU,IAAA;AAAA;AAAA,iBAmCJ,uBAAA,CAAwB,KAAA;EAAA,SAC9B,KAAA,EAAO,KAAA;EAAA,SACP,WAAA;EAAA,SACA,aAAA,EAAe,YAAA;EAAA,SACf,MAAA,EAAQ,kBAAA;AAAA;AAAA,iBAiCF,sBAAA,CACf,YAAA,EAAc,eAAA,GACZ,iBAAA;EAAA,SAA+B,UAAA;AAAA;AAAA,iBA+ClB,mCAAA,CAAoC,KAAA;EAAA,SAC1C,QAAA;EAAA,SACA,SAAA,EAAW,MAAA;AAAA,IACjB,WAAA,SAAoB,MAAA;AAAA,iBAoBF,iBAAA,CACrB,KAAA,EAAO,sBAAA,GACL,OAAA;EAAA,SAAmB,KAAA,QAAa,OAAA;EAAA,SAAwB,IAAA;AAAA"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { a as handlePortalServerError, i as deriveApprovalHmacKeysFromMasterKey, n as buildProfilePolicyMaps, o as parsePortalServerCliArgs, r as createServeSecretResolver, s as startPortalServer, t as applyAgentOverrides } from "../serve-command-D3SlETy_.js";
|
|
2
|
+
export { applyAgentOverrides, buildProfilePolicyMaps, createServeSecretResolver, deriveApprovalHmacKeysFromMasterKey, handlePortalServerError, parsePortalServerCliArgs, startPortalServer };
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { n as PortalToolRecord, s as JsonObject } from "../catalog-types-BVuB4Ynx.js";
|
|
2
|
+
import { F as PortalToolSelector } from "../portal-session-DG2CUjIo.js";
|
|
3
|
+
import { A as PortalToolSuccess, C as PortalCallUpstreamTool, D as PortalToolResult, E as PortalToolHandlers, M as createPortalToolHandlers, N as portalToolInputSchemas, O as PortalToolResultMap, S as PortalBatchResult, T as PortalToolHandlerCall, _ as createPortalCore, a as PortalCore, b as PortalBatchDiagnostic, c as PortalCoreEvent, d as PortalCoreResult, f as PortalCoreRuntime, g as collectPortalCoreResult, h as PortalCoreToolName, i as PortalAuditEvent, j as PortalUpstreamEvent, k as PortalToolRuntime, l as PortalCoreItemError, m as PortalCoreToolDescriptor, n as PortalAgentScope, o as PortalCoreCollectOptions, p as PortalCoreStreamCall, r as PortalApprovalEvaluator, s as PortalCoreContentBlock, t as CreatePortalCoreProps, u as PortalCoreItemResult, v as listPortalCoreToolDescriptors, w as PortalToolFailure, x as PortalBatchError, y as PortalApprovalCall } from "../portal-core-CZQI7Ob6.js";
|
|
4
|
+
import { S as createUpstreamMcpClientRuntime, r as redactCredentialText, u as NormalizedUpstreamMcpServer } from "../upstream-response-middleware-1MZnAD9C.js";
|
|
5
|
+
import { McpConfig, SecretValue } from "@agent-vm/config-contracts";
|
|
6
|
+
|
|
7
|
+
//#region src/core/provider-runtime.d.ts
|
|
8
|
+
interface ResolveUpstreamServersProps {
|
|
9
|
+
readonly config: McpConfig;
|
|
10
|
+
readonly resolveSecret: (secret: SecretValue) => Promise<string>;
|
|
11
|
+
}
|
|
12
|
+
declare function resolveUpstreamServers(props: ResolveUpstreamServersProps): Promise<readonly NormalizedUpstreamMcpServer[]>;
|
|
13
|
+
//#endregion
|
|
14
|
+
//#region src/core/portal-call-validation.d.ts
|
|
15
|
+
declare function validatePortalToolArguments(tool: PortalToolRecord, argumentsValue: JsonObject): {
|
|
16
|
+
readonly ok: true;
|
|
17
|
+
readonly value: unknown;
|
|
18
|
+
} | {
|
|
19
|
+
readonly error: {
|
|
20
|
+
readonly issues: readonly {
|
|
21
|
+
readonly code: string;
|
|
22
|
+
readonly message: string;
|
|
23
|
+
readonly path: readonly (number | string)[];
|
|
24
|
+
}[];
|
|
25
|
+
readonly kind: 'input_validation';
|
|
26
|
+
readonly namespace: string;
|
|
27
|
+
readonly toolName: string;
|
|
28
|
+
} | {
|
|
29
|
+
readonly feature: string;
|
|
30
|
+
readonly kind: 'schema_validation_unavailable';
|
|
31
|
+
readonly message: string;
|
|
32
|
+
readonly namespace: string;
|
|
33
|
+
readonly path: readonly (number | string)[];
|
|
34
|
+
readonly toolName: string;
|
|
35
|
+
};
|
|
36
|
+
readonly ok: false;
|
|
37
|
+
};
|
|
38
|
+
//#endregion
|
|
39
|
+
export { CreatePortalCoreProps, PortalAgentScope, PortalApprovalCall, PortalApprovalEvaluator, PortalAuditEvent, PortalBatchDiagnostic, PortalBatchError, PortalBatchResult, PortalCallUpstreamTool, PortalCore, PortalCoreCollectOptions, PortalCoreContentBlock, PortalCoreEvent, PortalCoreItemError, PortalCoreItemResult, PortalCoreResult, PortalCoreRuntime, PortalCoreStreamCall, PortalCoreToolDescriptor, PortalCoreToolName, PortalToolFailure, PortalToolHandlerCall, PortalToolHandlers, PortalToolResult, PortalToolResultMap, PortalToolRuntime, type PortalToolSelector, PortalToolSuccess, PortalUpstreamEvent, ResolveUpstreamServersProps, collectPortalCoreResult, createPortalCore, createPortalToolHandlers, createUpstreamMcpClientRuntime, listPortalCoreToolDescriptors, portalToolInputSchemas, redactCredentialText, resolveUpstreamServers, validatePortalToolArguments };
|
|
40
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../../src/core/provider-runtime.ts","../../src/core/portal-call-validation.ts"],"mappings":";;;;;;;UASiB,2BAAA;EAAA,SACP,MAAA,EAAQ,SAAA;EAAA,SACR,aAAA,GAAgB,MAAA,EAAQ,WAAA,KAAgB,OAAA;AAAA;AAAA,iBAsC5B,sBAAA,CACrB,KAAA,EAAO,2BAAA,GACL,OAAA,UAAiB,2BAAA;;;iBC/CJ,2BAAA,CACf,IAAA,EAAM,gBAAA,EACN,cAAA,EAAgB,UAAA;EAAA,SAEH,EAAA;EAAA,SAAmB,KAAA;AAAA;EAAA,SAErB,KAAA;IAAA,SAEG,MAAA;MAAA,SACC,IAAA;MAAA,SACA,OAAA;MAAA,SACA,IAAA;IAAA;IAAA,SAED,IAAA;IAAA,SACA,SAAA;IAAA,SACA,QAAA;EAAA;IAAA,SAGA,OAAA;IAAA,SACA,IAAA;IAAA,SACA,OAAA;IAAA,SACA,SAAA;IAAA,SACA,IAAA;IAAA,SACA,QAAA;EAAA;EAAA,SAEH,EAAA;AAAA"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { n as redactCredentialText } from "../upstream-response-middleware-BjUWZ2G8.js";
|
|
2
|
+
import { t as createUpstreamMcpClientRuntime } from "../upstream-mcp-client-runtime-JlsfTm7_.js";
|
|
3
|
+
import { i as resolveUpstreamServers, n as createPortalCore, r as listPortalCoreToolDescriptors, t as collectPortalCoreResult } from "../portal-core-Cgu714CL.js";
|
|
4
|
+
import { n as portalToolInputSchemas, r as validatePortalToolArguments, t as createPortalToolHandlers } from "../portal-tools-DKci1szO.js";
|
|
5
|
+
export { collectPortalCoreResult, createPortalCore, createPortalToolHandlers, createUpstreamMcpClientRuntime, listPortalCoreToolDescriptors, portalToolInputSchemas, redactCredentialText, resolveUpstreamServers, validatePortalToolArguments };
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
//#region src/portal-auth/hmac-env.ts
|
|
2
|
+
const portalHmacKeyEnvPrefix = "PORTAL_HMAC_KEY__";
|
|
3
|
+
const portalHmacKeyHexLength = 64;
|
|
4
|
+
function portalHmacKeyEnvName(agentId) {
|
|
5
|
+
return `${portalHmacKeyEnvPrefix}${agentId}`;
|
|
6
|
+
}
|
|
7
|
+
function parseHmacKeysFromEnv(env) {
|
|
8
|
+
const keysByAgent = /* @__PURE__ */ new Map();
|
|
9
|
+
for (const [name, value] of Object.entries(env)) {
|
|
10
|
+
if (!name.startsWith(portalHmacKeyEnvPrefix) || value === void 0) continue;
|
|
11
|
+
const agentId = name.slice(17);
|
|
12
|
+
if (!/^[0-9a-f]+$/u.test(value) || value.length !== portalHmacKeyHexLength) throw new Error(`Malformed HMAC key in env var "${name}".`);
|
|
13
|
+
keysByAgent.set(agentId, Buffer.from(value, "hex"));
|
|
14
|
+
}
|
|
15
|
+
return keysByAgent;
|
|
16
|
+
}
|
|
17
|
+
//#endregion
|
|
18
|
+
export { portalHmacKeyEnvName as n, parseHmacKeysFromEnv as t };
|
|
19
|
+
|
|
20
|
+
//# sourceMappingURL=hmac-env-B4shpRRB.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hmac-env-B4shpRRB.js","names":[],"sources":["../src/portal-auth/hmac-env.ts"],"sourcesContent":["const portalHmacKeyEnvPrefix = 'PORTAL_HMAC_KEY__';\nconst portalHmacKeyHexLength = 64;\n\nexport function portalHmacKeyEnvName(agentId: string): string {\n\treturn `${portalHmacKeyEnvPrefix}${agentId}`;\n}\n\nexport function parseHmacKeysFromEnv(\n\tenv: Readonly<Record<string, string | undefined>>,\n): ReadonlyMap<string, Buffer> {\n\tconst keysByAgent = new Map<string, Buffer>();\n\tfor (const [name, value] of Object.entries(env)) {\n\t\tif (!name.startsWith(portalHmacKeyEnvPrefix) || value === undefined) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst agentId = name.slice(portalHmacKeyEnvPrefix.length);\n\t\tif (!/^[0-9a-f]+$/u.test(value) || value.length !== portalHmacKeyHexLength) {\n\t\t\tthrow new Error(`Malformed HMAC key in env var \"${name}\".`);\n\t\t}\n\t\tkeysByAgent.set(agentId, Buffer.from(value, 'hex'));\n\t}\n\treturn keysByAgent;\n}\n"],"mappings":";AAAA,MAAM,yBAAyB;AAC/B,MAAM,yBAAyB;AAE/B,SAAgB,qBAAqB,SAAyB;CAC7D,OAAO,GAAG,yBAAyB;;AAGpC,SAAgB,qBACf,KAC8B;CAC9B,MAAM,8BAAc,IAAI,KAAqB;CAC7C,KAAK,MAAM,CAAC,MAAM,UAAU,OAAO,QAAQ,IAAI,EAAE;EAChD,IAAI,CAAC,KAAK,WAAW,uBAAuB,IAAI,UAAU,KAAA,GACzD;EAED,MAAM,UAAU,KAAK,MAAM,GAA8B;EACzD,IAAI,CAAC,eAAe,KAAK,MAAM,IAAI,MAAM,WAAW,wBACnD,MAAM,IAAI,MAAM,kCAAkC,KAAK,IAAI;EAE5D,YAAY,IAAI,SAAS,OAAO,KAAK,OAAO,MAAM,CAAC;;CAEpD,OAAO"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { createHash, createHmac, randomUUID, timingSafeEqual } from "node:crypto";
|
|
3
|
+
//#region src/portal-auth/hmac-token.ts
|
|
4
|
+
const approvalTokenCallDigestSchema = z.object({
|
|
5
|
+
argumentsHash: z.string().min(1),
|
|
6
|
+
namespace: z.string().min(1),
|
|
7
|
+
toolName: z.string().min(1)
|
|
8
|
+
}).strict();
|
|
9
|
+
const approvalTokenPayloadSchema = z.object({
|
|
10
|
+
agentId: z.string().min(1),
|
|
11
|
+
calls: z.array(approvalTokenCallDigestSchema),
|
|
12
|
+
exp: z.number().int(),
|
|
13
|
+
iat: z.number().int(),
|
|
14
|
+
jti: z.string().min(1)
|
|
15
|
+
}).strict();
|
|
16
|
+
function base64UrlEncode(value) {
|
|
17
|
+
return (typeof value === "string" ? Buffer.from(value, "utf8") : value).toString("base64url");
|
|
18
|
+
}
|
|
19
|
+
function canonicalize(value) {
|
|
20
|
+
if (value === null || typeof value !== "object") return JSON.stringify(value ?? null);
|
|
21
|
+
if (Array.isArray(value)) return `[${value.map(canonicalize).join(",")}]`;
|
|
22
|
+
return `{${Object.entries(value).filter((entry) => entry[1] !== void 0).toSorted(([leftKey], [rightKey]) => leftKey.localeCompare(rightKey)).map(([key, entryValue]) => `${JSON.stringify(key)}:${canonicalize(entryValue)}`).join(",")}}`;
|
|
23
|
+
}
|
|
24
|
+
function hashCallArguments(args) {
|
|
25
|
+
return createHash("sha256").update(canonicalize(args)).digest("base64url");
|
|
26
|
+
}
|
|
27
|
+
function signApprovalToken(props) {
|
|
28
|
+
const payloadEncoded = base64UrlEncode(canonicalize({
|
|
29
|
+
agentId: props.agentId,
|
|
30
|
+
calls: [...props.calls],
|
|
31
|
+
exp: props.expiresAtMs,
|
|
32
|
+
iat: props.issuedAtMs ?? Date.now(),
|
|
33
|
+
jti: props.jti ?? randomUUID()
|
|
34
|
+
}));
|
|
35
|
+
return `${payloadEncoded}.${createHmac("sha256", props.key).update(payloadEncoded).digest("base64url")}`;
|
|
36
|
+
}
|
|
37
|
+
function parseApprovalTokenPayload(payloadEncoded) {
|
|
38
|
+
try {
|
|
39
|
+
return approvalTokenPayloadSchema.parse(JSON.parse(Buffer.from(payloadEncoded, "base64url").toString("utf8")));
|
|
40
|
+
} catch {
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
function isApprovalTokenParts(parts) {
|
|
45
|
+
return parts.length === 2;
|
|
46
|
+
}
|
|
47
|
+
function callsMatch(leftCalls, rightCalls) {
|
|
48
|
+
if (leftCalls.length !== rightCalls.length) return false;
|
|
49
|
+
return leftCalls.every((leftCall, index) => {
|
|
50
|
+
const rightCall = rightCalls[index];
|
|
51
|
+
return rightCall !== void 0 && leftCall.argumentsHash === rightCall.argumentsHash && leftCall.namespace === rightCall.namespace && leftCall.toolName === rightCall.toolName;
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
function verifyApprovalToken(props) {
|
|
55
|
+
const parts = props.token.split(".");
|
|
56
|
+
if (!isApprovalTokenParts(parts)) return {
|
|
57
|
+
ok: false,
|
|
58
|
+
reason: "malformed"
|
|
59
|
+
};
|
|
60
|
+
const [payloadEncoded, signatureEncoded] = parts;
|
|
61
|
+
const expectedSignature = createHmac("sha256", props.key).update(payloadEncoded).digest();
|
|
62
|
+
const providedSignature = Buffer.from(signatureEncoded, "base64url");
|
|
63
|
+
if (providedSignature.length !== expectedSignature.length || !timingSafeEqual(providedSignature, expectedSignature)) return {
|
|
64
|
+
ok: false,
|
|
65
|
+
reason: "signature-mismatch"
|
|
66
|
+
};
|
|
67
|
+
const payload = parseApprovalTokenPayload(payloadEncoded);
|
|
68
|
+
if (payload === null) return {
|
|
69
|
+
ok: false,
|
|
70
|
+
reason: "malformed"
|
|
71
|
+
};
|
|
72
|
+
if (payload.exp <= props.nowMs) return {
|
|
73
|
+
ok: false,
|
|
74
|
+
reason: "expired"
|
|
75
|
+
};
|
|
76
|
+
if (props.maxLifetimeMs !== void 0 && payload.exp - payload.iat > props.maxLifetimeMs) return {
|
|
77
|
+
ok: false,
|
|
78
|
+
reason: "ttl-exceeded"
|
|
79
|
+
};
|
|
80
|
+
if (payload.agentId !== props.agentId) return {
|
|
81
|
+
ok: false,
|
|
82
|
+
reason: "agent-mismatch"
|
|
83
|
+
};
|
|
84
|
+
if (!callsMatch(payload.calls, props.calls)) return {
|
|
85
|
+
ok: false,
|
|
86
|
+
reason: "call-mismatch"
|
|
87
|
+
};
|
|
88
|
+
if (props.consumeTokenId !== void 0) {
|
|
89
|
+
const consumeResult = props.consumeTokenId(payload.jti, payload.exp);
|
|
90
|
+
if (!consumeResult.ok) return {
|
|
91
|
+
ok: false,
|
|
92
|
+
reason: consumeResult.reason
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
return { ok: true };
|
|
96
|
+
}
|
|
97
|
+
//#endregion
|
|
98
|
+
export { signApprovalToken as n, verifyApprovalToken as r, hashCallArguments as t };
|
|
99
|
+
|
|
100
|
+
//# sourceMappingURL=hmac-token-DBqWY3-w.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hmac-token-DBqWY3-w.js","names":[],"sources":["../src/portal-auth/hmac-token.ts"],"sourcesContent":["import { createHash, createHmac, randomUUID, timingSafeEqual } from 'node:crypto';\n\nimport { z } from 'zod';\n\nexport interface ApprovalTokenCallDigest {\n\treadonly argumentsHash: string;\n\treadonly namespace: string;\n\treadonly toolName: string;\n}\n\nexport interface SignApprovalTokenProps {\n\treadonly agentId: string;\n\treadonly calls: readonly ApprovalTokenCallDigest[];\n\treadonly expiresAtMs: number;\n\treadonly issuedAtMs?: number;\n\treadonly jti?: string;\n\treadonly key: Buffer;\n}\n\nexport interface VerifyApprovalTokenProps {\n\treadonly agentId: string;\n\treadonly calls: readonly ApprovalTokenCallDigest[];\n\treadonly key: Buffer;\n\treadonly consumeTokenId?: (\n\t\tjti: string,\n\t\texpiresAtMs: number,\n\t) =>\n\t\t| { readonly ok: true }\n\t\t| { readonly ok: false; readonly reason: 'replay-cache-full' | 'replayed' };\n\treadonly maxLifetimeMs?: number;\n\treadonly nowMs: number;\n\treadonly token: string;\n}\n\nexport type VerifyApprovalTokenResult =\n\t| { readonly ok: true }\n\t| {\n\t\t\treadonly ok: false;\n\t\t\treadonly reason:\n\t\t\t\t| 'agent-mismatch'\n\t\t\t\t| 'call-mismatch'\n\t\t\t\t| 'expired'\n\t\t\t\t| 'malformed'\n\t\t\t\t| 'replay-cache-full'\n\t\t\t\t| 'replayed'\n\t\t\t\t| 'signature-mismatch'\n\t\t\t\t| 'ttl-exceeded';\n\t };\n\nconst approvalTokenCallDigestSchema = z\n\t.object({\n\t\targumentsHash: z.string().min(1),\n\t\tnamespace: z.string().min(1),\n\t\ttoolName: z.string().min(1),\n\t})\n\t.strict();\n\nconst approvalTokenPayloadSchema = z\n\t.object({\n\t\tagentId: z.string().min(1),\n\t\tcalls: z.array(approvalTokenCallDigestSchema),\n\t\texp: z.number().int(),\n\t\tiat: z.number().int(),\n\t\tjti: z.string().min(1),\n\t})\n\t.strict();\n\ntype ApprovalTokenPayload = z.infer<typeof approvalTokenPayloadSchema>;\n\nfunction base64UrlEncode(value: Buffer | string): string {\n\tconst buffer = typeof value === 'string' ? Buffer.from(value, 'utf8') : value;\n\treturn buffer.toString('base64url');\n}\n\nfunction canonicalize(value: unknown): string {\n\tif (value === null || typeof value !== 'object') {\n\t\treturn JSON.stringify(value ?? null);\n\t}\n\tif (Array.isArray(value)) {\n\t\treturn `[${value.map(canonicalize).join(',')}]`;\n\t}\n\tconst entries = Object.entries(value)\n\t\t.filter((entry) => entry[1] !== undefined)\n\t\t.toSorted(([leftKey], [rightKey]) => leftKey.localeCompare(rightKey))\n\t\t.map(([key, entryValue]) => `${JSON.stringify(key)}:${canonicalize(entryValue)}`);\n\treturn `{${entries.join(',')}}`;\n}\n\nexport function hashCallArguments(args: unknown): string {\n\treturn createHash('sha256').update(canonicalize(args)).digest('base64url');\n}\n\nexport function signApprovalToken(props: SignApprovalTokenProps): string {\n\tconst payload = {\n\t\tagentId: props.agentId,\n\t\tcalls: [...props.calls],\n\t\texp: props.expiresAtMs,\n\t\tiat: props.issuedAtMs ?? Date.now(),\n\t\tjti: props.jti ?? randomUUID(),\n\t} satisfies ApprovalTokenPayload;\n\tconst payloadEncoded = base64UrlEncode(canonicalize(payload));\n\tconst signature = createHmac('sha256', props.key).update(payloadEncoded).digest('base64url');\n\treturn `${payloadEncoded}.${signature}`;\n}\n\nfunction parseApprovalTokenPayload(payloadEncoded: string): ApprovalTokenPayload | null {\n\ttry {\n\t\treturn approvalTokenPayloadSchema.parse(\n\t\t\tJSON.parse(Buffer.from(payloadEncoded, 'base64url').toString('utf8')),\n\t\t);\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nfunction isApprovalTokenParts(parts: readonly string[]): parts is readonly [string, string] {\n\treturn parts.length === 2;\n}\n\nfunction callsMatch(\n\tleftCalls: readonly ApprovalTokenCallDigest[],\n\trightCalls: readonly ApprovalTokenCallDigest[],\n): boolean {\n\tif (leftCalls.length !== rightCalls.length) {\n\t\treturn false;\n\t}\n\treturn leftCalls.every((leftCall, index) => {\n\t\tconst rightCall = rightCalls[index];\n\t\treturn (\n\t\t\trightCall !== undefined &&\n\t\t\tleftCall.argumentsHash === rightCall.argumentsHash &&\n\t\t\tleftCall.namespace === rightCall.namespace &&\n\t\t\tleftCall.toolName === rightCall.toolName\n\t\t);\n\t});\n}\n\nexport function verifyApprovalToken(props: VerifyApprovalTokenProps): VerifyApprovalTokenResult {\n\tconst parts = props.token.split('.');\n\tif (!isApprovalTokenParts(parts)) {\n\t\treturn { ok: false, reason: 'malformed' };\n\t}\n\tconst [payloadEncoded, signatureEncoded] = parts;\n\tconst expectedSignature = createHmac('sha256', props.key).update(payloadEncoded).digest();\n\tconst providedSignature = Buffer.from(signatureEncoded, 'base64url');\n\tif (\n\t\tprovidedSignature.length !== expectedSignature.length ||\n\t\t!timingSafeEqual(providedSignature, expectedSignature)\n\t) {\n\t\treturn { ok: false, reason: 'signature-mismatch' };\n\t}\n\n\tconst payload = parseApprovalTokenPayload(payloadEncoded);\n\tif (payload === null) {\n\t\treturn { ok: false, reason: 'malformed' };\n\t}\n\tif (payload.exp <= props.nowMs) {\n\t\treturn { ok: false, reason: 'expired' };\n\t}\n\tif (props.maxLifetimeMs !== undefined && payload.exp - payload.iat > props.maxLifetimeMs) {\n\t\treturn { ok: false, reason: 'ttl-exceeded' };\n\t}\n\tif (payload.agentId !== props.agentId) {\n\t\treturn { ok: false, reason: 'agent-mismatch' };\n\t}\n\tif (!callsMatch(payload.calls, props.calls)) {\n\t\treturn { ok: false, reason: 'call-mismatch' };\n\t}\n\tif (props.consumeTokenId !== undefined) {\n\t\tconst consumeResult = props.consumeTokenId(payload.jti, payload.exp);\n\t\tif (!consumeResult.ok) {\n\t\t\treturn { ok: false, reason: consumeResult.reason };\n\t\t}\n\t}\n\treturn { ok: true };\n}\n"],"mappings":"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"}
|