@agent-vm/config-contracts 0.0.59

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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025-2026 Shravan Sunder
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,359 @@
1
+ import { z } from "zod";
2
+
3
+ //#region src/json-config-file.d.ts
4
+ declare function loadJsonConfigFile(filePath: string): Promise<unknown>;
5
+ //#endregion
6
+ //#region src/json-value.d.ts
7
+ type JsonPrimitive = boolean | null | number | string;
8
+ type JsonArray = JsonValue[];
9
+ type JsonObject = {
10
+ [key: string]: JsonValue;
11
+ };
12
+ type JsonValue = JsonArray | JsonObject | JsonPrimitive;
13
+ declare const jsonValueSchema: z.ZodType<JsonValue>;
14
+ declare const jsonObjectSchema: z.ZodType<JsonObject>;
15
+ declare function isJsonObject(value: unknown): value is JsonObject;
16
+ declare function assertJsonObject(value: unknown, label: string): JsonObject;
17
+ //#endregion
18
+ //#region src/secret-value.d.ts
19
+ declare const secretValueSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
20
+ source: z.ZodLiteral<"environment">;
21
+ name: z.ZodString;
22
+ }, z.core.$strict>, z.ZodObject<{
23
+ source: z.ZodLiteral<"1password">;
24
+ ref: z.ZodString;
25
+ }, z.core.$strict>], "source">;
26
+ type SecretValue = z.infer<typeof secretValueSchema>;
27
+ //#endregion
28
+ //#region src/mcp-config.d.ts
29
+ declare const mcpProviderSchema: z.ZodObject<{
30
+ kind: z.ZodLiteral<"mcp">;
31
+ namespace: z.ZodString;
32
+ discovery: z.ZodDefault<z.ZodObject<{
33
+ summary: z.ZodOptional<z.ZodString>;
34
+ }, z.core.$strict>>;
35
+ transport: z.ZodDiscriminatedUnion<[z.ZodObject<{
36
+ kind: z.ZodLiteral<"streamable-http">;
37
+ url: z.ZodString;
38
+ headers: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodDiscriminatedUnion<[z.ZodObject<{
39
+ source: z.ZodLiteral<"environment">;
40
+ name: z.ZodString;
41
+ }, z.core.$strict>, z.ZodObject<{
42
+ source: z.ZodLiteral<"1password">;
43
+ ref: z.ZodString;
44
+ }, z.core.$strict>], "source">>>;
45
+ }, z.core.$strict>, z.ZodObject<{
46
+ kind: z.ZodLiteral<"sse">;
47
+ url: z.ZodString;
48
+ headers: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodDiscriminatedUnion<[z.ZodObject<{
49
+ source: z.ZodLiteral<"environment">;
50
+ name: z.ZodString;
51
+ }, z.core.$strict>, z.ZodObject<{
52
+ source: z.ZodLiteral<"1password">;
53
+ ref: z.ZodString;
54
+ }, z.core.$strict>], "source">>>;
55
+ }, z.core.$strict>, z.ZodObject<{
56
+ kind: z.ZodLiteral<"stdio">;
57
+ command: z.ZodString;
58
+ args: z.ZodDefault<z.ZodArray<z.ZodString>>;
59
+ cwd: z.ZodOptional<z.ZodString>;
60
+ env: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodDiscriminatedUnion<[z.ZodObject<{
61
+ source: z.ZodLiteral<"environment">;
62
+ name: z.ZodString;
63
+ }, z.core.$strict>, z.ZodObject<{
64
+ source: z.ZodLiteral<"1password">;
65
+ ref: z.ZodString;
66
+ }, z.core.$strict>], "source">>>;
67
+ }, z.core.$strict>], "kind">;
68
+ }, z.core.$strict>;
69
+ declare const mcpConfigSchema: z.ZodObject<{
70
+ $schema: z.ZodOptional<z.ZodString>;
71
+ schemaVersion: z.ZodLiteral<1>;
72
+ providers: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodObject<{
73
+ kind: z.ZodLiteral<"mcp">;
74
+ namespace: z.ZodString;
75
+ discovery: z.ZodDefault<z.ZodObject<{
76
+ summary: z.ZodOptional<z.ZodString>;
77
+ }, z.core.$strict>>;
78
+ transport: z.ZodDiscriminatedUnion<[z.ZodObject<{
79
+ kind: z.ZodLiteral<"streamable-http">;
80
+ url: z.ZodString;
81
+ headers: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodDiscriminatedUnion<[z.ZodObject<{
82
+ source: z.ZodLiteral<"environment">;
83
+ name: z.ZodString;
84
+ }, z.core.$strict>, z.ZodObject<{
85
+ source: z.ZodLiteral<"1password">;
86
+ ref: z.ZodString;
87
+ }, z.core.$strict>], "source">>>;
88
+ }, z.core.$strict>, z.ZodObject<{
89
+ kind: z.ZodLiteral<"sse">;
90
+ url: z.ZodString;
91
+ headers: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodDiscriminatedUnion<[z.ZodObject<{
92
+ source: z.ZodLiteral<"environment">;
93
+ name: z.ZodString;
94
+ }, z.core.$strict>, z.ZodObject<{
95
+ source: z.ZodLiteral<"1password">;
96
+ ref: z.ZodString;
97
+ }, z.core.$strict>], "source">>>;
98
+ }, z.core.$strict>, z.ZodObject<{
99
+ kind: z.ZodLiteral<"stdio">;
100
+ command: z.ZodString;
101
+ args: z.ZodDefault<z.ZodArray<z.ZodString>>;
102
+ cwd: z.ZodOptional<z.ZodString>;
103
+ env: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodDiscriminatedUnion<[z.ZodObject<{
104
+ source: z.ZodLiteral<"environment">;
105
+ name: z.ZodString;
106
+ }, z.core.$strict>, z.ZodObject<{
107
+ source: z.ZodLiteral<"1password">;
108
+ ref: z.ZodString;
109
+ }, z.core.$strict>], "source">>>;
110
+ }, z.core.$strict>], "kind">;
111
+ }, z.core.$strict>>>;
112
+ }, z.core.$strict>;
113
+ type McpConfig = z.infer<typeof mcpConfigSchema>;
114
+ type McpProvider = z.infer<typeof mcpProviderSchema>;
115
+ type ResolvedMcpProvider = {
116
+ readonly headers: Readonly<Record<string, SecretValue>>;
117
+ readonly namespace: string;
118
+ readonly transport: 'streamable-http' | 'sse';
119
+ readonly url: string;
120
+ } | {
121
+ readonly args: readonly string[];
122
+ readonly command: string;
123
+ readonly cwd?: string;
124
+ readonly env: Readonly<Record<string, SecretValue>>;
125
+ readonly namespace: string;
126
+ readonly transport: 'stdio';
127
+ };
128
+ declare function loadMcpConfig(configPath: string): Promise<McpConfig>;
129
+ declare function mcpConfigToResolvedProviders(config: McpConfig): readonly ResolvedMcpProvider[];
130
+ //#endregion
131
+ //#region src/mcp-portal-config.d.ts
132
+ declare const namespaceToolRefSchema: z.ZodObject<{
133
+ namespace: z.ZodString;
134
+ toolName: z.ZodString;
135
+ }, z.core.$strict>;
136
+ type NamespaceToolRef = z.infer<typeof namespaceToolRefSchema>;
137
+ declare const portalApprovalConfigSchema: z.ZodObject<{
138
+ allowWithoutApprovalTools: z.ZodDefault<z.ZodArray<z.ZodObject<{
139
+ namespace: z.ZodString;
140
+ toolName: z.ZodString;
141
+ }, z.core.$strict>>>;
142
+ alwaysAskTools: z.ZodDefault<z.ZodArray<z.ZodObject<{
143
+ namespace: z.ZodString;
144
+ toolName: z.ZodString;
145
+ }, z.core.$strict>>>;
146
+ annotationPolicy: z.ZodDefault<z.ZodEnum<{
147
+ "destructive-requires-approval": "destructive-requires-approval";
148
+ "always-require-approval": "always-require-approval";
149
+ }>>;
150
+ trustedAnnotationNamespaces: z.ZodDefault<z.ZodArray<z.ZodString>>;
151
+ writeTools: z.ZodDefault<z.ZodArray<z.ZodObject<{
152
+ namespace: z.ZodString;
153
+ toolName: z.ZodString;
154
+ }, z.core.$strict>>>;
155
+ }, z.core.$strict>;
156
+ type PortalApprovalConfig = z.infer<typeof portalApprovalConfigSchema>;
157
+ declare const mcpPortalProfileDefinitionSchema: z.ZodObject<{
158
+ extends: z.ZodOptional<z.ZodString>;
159
+ enabledNamespaces: z.ZodOptional<z.ZodArray<z.ZodString>>;
160
+ enabledToolsByNamespace: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodArray<z.ZodString>>>;
161
+ hiddenToolsByNamespace: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodArray<z.ZodString>>>;
162
+ logging: z.ZodOptional<z.ZodObject<{
163
+ enabled: z.ZodDefault<z.ZodBoolean>;
164
+ }, z.core.$strict>>;
165
+ promptContext: z.ZodOptional<z.ZodObject<{
166
+ enabled: z.ZodDefault<z.ZodBoolean>;
167
+ maxNamespaces: z.ZodDefault<z.ZodNumber>;
168
+ }, z.core.$strict>>;
169
+ cache: z.ZodOptional<z.ZodObject<{
170
+ catalogTtlMs: z.ZodDefault<z.ZodNumber>;
171
+ }, z.core.$strict>>;
172
+ approval: z.ZodOptional<z.ZodObject<{
173
+ allowWithoutApprovalTools: z.ZodDefault<z.ZodArray<z.ZodObject<{
174
+ namespace: z.ZodString;
175
+ toolName: z.ZodString;
176
+ }, z.core.$strict>>>;
177
+ alwaysAskTools: z.ZodDefault<z.ZodArray<z.ZodObject<{
178
+ namespace: z.ZodString;
179
+ toolName: z.ZodString;
180
+ }, z.core.$strict>>>;
181
+ annotationPolicy: z.ZodDefault<z.ZodEnum<{
182
+ "destructive-requires-approval": "destructive-requires-approval";
183
+ "always-require-approval": "always-require-approval";
184
+ }>>;
185
+ trustedAnnotationNamespaces: z.ZodDefault<z.ZodArray<z.ZodString>>;
186
+ writeTools: z.ZodDefault<z.ZodArray<z.ZodObject<{
187
+ namespace: z.ZodString;
188
+ toolName: z.ZodString;
189
+ }, z.core.$strict>>>;
190
+ }, z.core.$strict>>;
191
+ }, z.core.$strict>;
192
+ type McpPortalProfileDefinition = z.infer<typeof mcpPortalProfileDefinitionSchema>;
193
+ declare const resolvedMcpPortalProfileSchema: z.ZodObject<{
194
+ enabledNamespaces: z.ZodArray<z.ZodString>;
195
+ enabledToolsByNamespace: z.ZodRecord<z.ZodString, z.ZodArray<z.ZodString>>;
196
+ hiddenToolsByNamespace: z.ZodRecord<z.ZodString, z.ZodArray<z.ZodString>>;
197
+ logging: z.ZodObject<{
198
+ enabled: z.ZodBoolean;
199
+ }, z.core.$strict>;
200
+ promptContext: z.ZodObject<{
201
+ enabled: z.ZodBoolean;
202
+ maxNamespaces: z.ZodNumber;
203
+ }, z.core.$strict>;
204
+ cache: z.ZodObject<{
205
+ catalogTtlMs: z.ZodNumber;
206
+ }, z.core.$strict>;
207
+ approval: z.ZodObject<{
208
+ allowWithoutApprovalTools: z.ZodDefault<z.ZodArray<z.ZodObject<{
209
+ namespace: z.ZodString;
210
+ toolName: z.ZodString;
211
+ }, z.core.$strict>>>;
212
+ alwaysAskTools: z.ZodDefault<z.ZodArray<z.ZodObject<{
213
+ namespace: z.ZodString;
214
+ toolName: z.ZodString;
215
+ }, z.core.$strict>>>;
216
+ annotationPolicy: z.ZodDefault<z.ZodEnum<{
217
+ "destructive-requires-approval": "destructive-requires-approval";
218
+ "always-require-approval": "always-require-approval";
219
+ }>>;
220
+ trustedAnnotationNamespaces: z.ZodDefault<z.ZodArray<z.ZodString>>;
221
+ writeTools: z.ZodDefault<z.ZodArray<z.ZodObject<{
222
+ namespace: z.ZodString;
223
+ toolName: z.ZodString;
224
+ }, z.core.$strict>>>;
225
+ }, z.core.$strict>;
226
+ }, z.core.$strict>;
227
+ type ResolvedMcpPortalProfile = z.infer<typeof resolvedMcpPortalProfileSchema>;
228
+ declare const mcpPortalServerSchema: z.ZodObject<{
229
+ host: z.ZodDefault<z.ZodString>;
230
+ port: z.ZodDefault<z.ZodNumber>;
231
+ accessHeader: z.ZodObject<{
232
+ name: z.ZodString;
233
+ secret: z.ZodDiscriminatedUnion<[z.ZodObject<{
234
+ source: z.ZodLiteral<"environment">;
235
+ name: z.ZodString;
236
+ }, z.core.$strict>, z.ZodObject<{
237
+ source: z.ZodLiteral<"1password">;
238
+ ref: z.ZodString;
239
+ }, z.core.$strict>], "source">;
240
+ }, z.core.$strict>;
241
+ }, z.core.$strict>;
242
+ type McpPortalServerConfig = z.infer<typeof mcpPortalServerSchema>;
243
+ declare const mcpPortalAgentConfigSchema: z.ZodObject<{
244
+ profile: z.ZodString;
245
+ hmacKey: z.ZodOptional<z.ZodDiscriminatedUnion<[z.ZodObject<{
246
+ source: z.ZodLiteral<"environment">;
247
+ name: z.ZodString;
248
+ }, z.core.$strict>, z.ZodObject<{
249
+ source: z.ZodLiteral<"1password">;
250
+ ref: z.ZodString;
251
+ }, z.core.$strict>], "source">>;
252
+ }, z.core.$strict>;
253
+ type McpPortalAgentConfig = z.infer<typeof mcpPortalAgentConfigSchema>;
254
+ declare const mcpPortalConfigSchema: z.ZodObject<{
255
+ $schema: z.ZodOptional<z.ZodString>;
256
+ schemaVersion: z.ZodLiteral<1>;
257
+ server: z.ZodObject<{
258
+ host: z.ZodDefault<z.ZodString>;
259
+ port: z.ZodDefault<z.ZodNumber>;
260
+ accessHeader: z.ZodObject<{
261
+ name: z.ZodString;
262
+ secret: z.ZodDiscriminatedUnion<[z.ZodObject<{
263
+ source: z.ZodLiteral<"environment">;
264
+ name: z.ZodString;
265
+ }, z.core.$strict>, z.ZodObject<{
266
+ source: z.ZodLiteral<"1password">;
267
+ ref: z.ZodString;
268
+ }, z.core.$strict>], "source">;
269
+ }, z.core.$strict>;
270
+ }, z.core.$strict>;
271
+ agents: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodObject<{
272
+ profile: z.ZodString;
273
+ hmacKey: z.ZodOptional<z.ZodDiscriminatedUnion<[z.ZodObject<{
274
+ source: z.ZodLiteral<"environment">;
275
+ name: z.ZodString;
276
+ }, z.core.$strict>, z.ZodObject<{
277
+ source: z.ZodLiteral<"1password">;
278
+ ref: z.ZodString;
279
+ }, z.core.$strict>], "source">>;
280
+ }, z.core.$strict>>>;
281
+ profiles: z.ZodRecord<z.ZodString, z.ZodObject<{
282
+ extends: z.ZodOptional<z.ZodString>;
283
+ enabledNamespaces: z.ZodOptional<z.ZodArray<z.ZodString>>;
284
+ enabledToolsByNamespace: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodArray<z.ZodString>>>;
285
+ hiddenToolsByNamespace: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodArray<z.ZodString>>>;
286
+ logging: z.ZodOptional<z.ZodObject<{
287
+ enabled: z.ZodDefault<z.ZodBoolean>;
288
+ }, z.core.$strict>>;
289
+ promptContext: z.ZodOptional<z.ZodObject<{
290
+ enabled: z.ZodDefault<z.ZodBoolean>;
291
+ maxNamespaces: z.ZodDefault<z.ZodNumber>;
292
+ }, z.core.$strict>>;
293
+ cache: z.ZodOptional<z.ZodObject<{
294
+ catalogTtlMs: z.ZodDefault<z.ZodNumber>;
295
+ }, z.core.$strict>>;
296
+ approval: z.ZodOptional<z.ZodObject<{
297
+ allowWithoutApprovalTools: z.ZodDefault<z.ZodArray<z.ZodObject<{
298
+ namespace: z.ZodString;
299
+ toolName: z.ZodString;
300
+ }, z.core.$strict>>>;
301
+ alwaysAskTools: z.ZodDefault<z.ZodArray<z.ZodObject<{
302
+ namespace: z.ZodString;
303
+ toolName: z.ZodString;
304
+ }, z.core.$strict>>>;
305
+ annotationPolicy: z.ZodDefault<z.ZodEnum<{
306
+ "destructive-requires-approval": "destructive-requires-approval";
307
+ "always-require-approval": "always-require-approval";
308
+ }>>;
309
+ trustedAnnotationNamespaces: z.ZodDefault<z.ZodArray<z.ZodString>>;
310
+ writeTools: z.ZodDefault<z.ZodArray<z.ZodObject<{
311
+ namespace: z.ZodString;
312
+ toolName: z.ZodString;
313
+ }, z.core.$strict>>>;
314
+ }, z.core.$strict>>;
315
+ }, z.core.$strict>>;
316
+ }, z.core.$strict>;
317
+ type McpPortalConfig = z.infer<typeof mcpPortalConfigSchema>;
318
+ declare const openClawMcpPortalPluginConfigSchema: z.ZodObject<{
319
+ configDir: z.ZodString;
320
+ binPath: z.ZodOptional<z.ZodString>;
321
+ }, z.core.$strict>;
322
+ type OpenClawMcpPortalPluginConfig = z.infer<typeof openClawMcpPortalPluginConfigSchema>;
323
+ declare function loadMcpPortalConfig(configPath: string): Promise<McpPortalConfig>;
324
+ declare function resolveMcpPortalProfile(config: McpPortalConfig, profileName: string): ResolvedMcpPortalProfile;
325
+ declare function secretValueToEnvironmentReference(secret: SecretValue): string;
326
+ //#endregion
327
+ //#region src/mcp-portal-approval-policy.d.ts
328
+ interface McpPortalApprovalToolAnnotations {
329
+ readonly destructiveHint?: boolean | undefined;
330
+ readonly readOnlyHint?: boolean | undefined;
331
+ }
332
+ interface McpPortalApprovalToolCall {
333
+ readonly annotations?: McpPortalApprovalToolAnnotations;
334
+ readonly namespace: string;
335
+ readonly toolName: string;
336
+ }
337
+ declare function mcpPortalCallRequiresApproval(profile: ResolvedMcpPortalProfile, call: McpPortalApprovalToolCall): boolean;
338
+ //#endregion
339
+ //#region src/schema-artifacts.d.ts
340
+ declare const mcpPortalConfigSchemaVersions: {
341
+ readonly mcp: 1;
342
+ readonly mcpPortal: 1;
343
+ };
344
+ declare const mcpPortalConfigSchemaIds: {
345
+ readonly mcp: "agent-vm:mcp:1";
346
+ readonly mcpPortal: "agent-vm:mcp-portal:1";
347
+ };
348
+ declare const mcpPortalConfigSchemaPaths: {
349
+ readonly mcpFromGatewayConfig: "../../schemas/mcp.schema.json";
350
+ readonly mcpPortalFromGatewayConfig: "../../schemas/mcp-portal.schema.json";
351
+ };
352
+ interface ConfigContractSchemaArtifacts {
353
+ readonly mcp: Record<string, unknown>;
354
+ readonly mcpPortal: Record<string, unknown>;
355
+ }
356
+ declare function createConfigContractSchemaArtifacts(): ConfigContractSchemaArtifacts;
357
+ //#endregion
358
+ export { ConfigContractSchemaArtifacts, JsonArray, JsonObject, JsonPrimitive, JsonValue, McpConfig, McpPortalAgentConfig, McpPortalApprovalToolAnnotations, McpPortalApprovalToolCall, McpPortalConfig, McpPortalProfileDefinition, McpPortalServerConfig, McpProvider, NamespaceToolRef, OpenClawMcpPortalPluginConfig, PortalApprovalConfig, ResolvedMcpPortalProfile, ResolvedMcpProvider, SecretValue, assertJsonObject, createConfigContractSchemaArtifacts, isJsonObject, jsonObjectSchema, jsonValueSchema, loadJsonConfigFile, loadMcpConfig, loadMcpPortalConfig, mcpConfigSchema, mcpConfigToResolvedProviders, mcpPortalAgentConfigSchema, mcpPortalCallRequiresApproval, mcpPortalConfigSchema, mcpPortalConfigSchemaIds, mcpPortalConfigSchemaPaths, mcpPortalConfigSchemaVersions, mcpPortalProfileDefinitionSchema, mcpPortalServerSchema, mcpProviderSchema, namespaceToolRefSchema, openClawMcpPortalPluginConfigSchema, portalApprovalConfigSchema, resolveMcpPortalProfile, resolvedMcpPortalProfileSchema, secretValueSchema, secretValueToEnvironmentReference };
359
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../src/json-config-file.ts","../src/json-value.ts","../src/secret-value.ts","../src/mcp-config.ts","../src/mcp-portal-config.ts","../src/mcp-portal-approval-policy.ts","../src/schema-artifacts.ts"],"mappings":"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"}
package/dist/index.js ADDED
@@ -0,0 +1,264 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import { parse, printParseErrorCode } from "jsonc-parser";
3
+ import * as zod from "zod";
4
+ import { z } from "zod";
5
+ //#region src/json-config-file.ts
6
+ const parseJsoncToUnknown = parse;
7
+ function formatLineColumn(text, offset) {
8
+ const prefix = text.slice(0, offset);
9
+ return `line ${prefix.split("\n").length}, column ${offset - prefix.lastIndexOf("\n")}`;
10
+ }
11
+ function formatParseError(filePath, text, error) {
12
+ return [`Invalid JSONC in ${filePath}: ${formatLineColumn(text, error.offset)}:`, printParseErrorCode(error.error)].join(" ");
13
+ }
14
+ async function loadJsonConfigFile(filePath) {
15
+ const rawConfig = await readFile(filePath, "utf8");
16
+ const parseErrors = [];
17
+ const parsedConfig = parseJsoncToUnknown(rawConfig, parseErrors, {
18
+ allowTrailingComma: true,
19
+ disallowComments: false
20
+ });
21
+ if (parseErrors.length > 0) {
22
+ const firstParseError = parseErrors[0];
23
+ if (firstParseError !== void 0) throw new Error(formatParseError(filePath, rawConfig, firstParseError));
24
+ }
25
+ return parsedConfig;
26
+ }
27
+ //#endregion
28
+ //#region src/json-value.ts
29
+ const jsonValueSchema = z.lazy(() => z.union([
30
+ z.string(),
31
+ z.number().finite(),
32
+ z.boolean(),
33
+ z.null(),
34
+ z.array(jsonValueSchema),
35
+ jsonObjectSchema
36
+ ]));
37
+ const jsonObjectSchema = z.record(z.string(), jsonValueSchema);
38
+ function isJsonObject(value) {
39
+ return typeof value === "object" && value !== null && !Array.isArray(value);
40
+ }
41
+ function assertJsonObject(value, label) {
42
+ if (!isJsonObject(value)) throw new Error(`${label} must be a JSON object.`);
43
+ return jsonObjectSchema.parse(value);
44
+ }
45
+ //#endregion
46
+ //#region src/secret-value.ts
47
+ const secretValueSchema = z.discriminatedUnion("source", [z.object({
48
+ source: z.literal("environment"),
49
+ name: z.string().min(1)
50
+ }).strict(), z.object({
51
+ source: z.literal("1password"),
52
+ ref: z.string().min(1)
53
+ }).strict()]);
54
+ //#endregion
55
+ //#region src/mcp-config.ts
56
+ const mcpProviderDiscoverySchema = z.object({ summary: z.string().min(1).optional() }).strict();
57
+ const streamableHttpTransportSchema = z.object({
58
+ kind: z.literal("streamable-http"),
59
+ url: z.string().url(),
60
+ headers: z.record(z.string(), secretValueSchema).default({})
61
+ }).strict();
62
+ const sseTransportSchema = z.object({
63
+ kind: z.literal("sse"),
64
+ url: z.string().url(),
65
+ headers: z.record(z.string(), secretValueSchema).default({})
66
+ }).strict();
67
+ const stdioTransportSchema = z.object({
68
+ kind: z.literal("stdio"),
69
+ command: z.string().min(1),
70
+ args: z.array(z.string()).default([]),
71
+ cwd: z.string().min(1).optional(),
72
+ env: z.record(z.string(), secretValueSchema).default({})
73
+ }).strict();
74
+ const mcpProviderSchema = z.object({
75
+ kind: z.literal("mcp"),
76
+ namespace: z.string().min(1),
77
+ discovery: mcpProviderDiscoverySchema.default({}),
78
+ transport: z.discriminatedUnion("kind", [
79
+ streamableHttpTransportSchema,
80
+ sseTransportSchema,
81
+ stdioTransportSchema
82
+ ])
83
+ }).strict();
84
+ const mcpConfigSchema = z.object({
85
+ $schema: z.string().min(1).optional(),
86
+ schemaVersion: z.literal(1),
87
+ providers: z.record(z.string().min(1), mcpProviderSchema).default({})
88
+ }).strict();
89
+ async function loadMcpConfig(configPath) {
90
+ return mcpConfigSchema.parse(await loadJsonConfigFile(configPath));
91
+ }
92
+ function mcpConfigToResolvedProviders(config) {
93
+ return Object.values(config.providers).map((provider) => {
94
+ const transport = provider.transport;
95
+ if (transport.kind === "stdio") {
96
+ const resolvedProvider = {
97
+ args: transport.args,
98
+ command: transport.command,
99
+ env: transport.env,
100
+ namespace: provider.namespace,
101
+ transport: transport.kind
102
+ };
103
+ if (transport.cwd !== void 0) resolvedProvider.cwd = transport.cwd;
104
+ return resolvedProvider;
105
+ }
106
+ return {
107
+ headers: transport.headers,
108
+ namespace: provider.namespace,
109
+ transport: transport.kind,
110
+ url: transport.url
111
+ };
112
+ });
113
+ }
114
+ //#endregion
115
+ //#region src/mcp-portal-approval-policy.ts
116
+ function selectorMatches(selectors, namespace, toolName) {
117
+ return selectors.some((selector) => selector.namespace === namespace && selector.toolName === toolName);
118
+ }
119
+ function hasTrustedReadOnlyAnnotation(profile, call) {
120
+ return profile.approval.annotationPolicy === "destructive-requires-approval" && profile.approval.trustedAnnotationNamespaces.includes(call.namespace) && call.annotations?.readOnlyHint === true && call.annotations.destructiveHint !== true;
121
+ }
122
+ function mcpPortalCallRequiresApproval(profile, call) {
123
+ if (selectorMatches(profile.approval.allowWithoutApprovalTools, call.namespace, call.toolName)) return false;
124
+ if (profile.approval.annotationPolicy === "always-require-approval") return true;
125
+ if (selectorMatches(profile.approval.alwaysAskTools, call.namespace, call.toolName) || selectorMatches(profile.approval.writeTools, call.namespace, call.toolName)) return true;
126
+ return !hasTrustedReadOnlyAnnotation(profile, call);
127
+ }
128
+ //#endregion
129
+ //#region src/mcp-portal-config.ts
130
+ const namespaceToolRefSchema = z.object({
131
+ namespace: z.string().min(1),
132
+ toolName: z.string().min(1)
133
+ }).strict();
134
+ const portalApprovalConfigSchema = z.object({
135
+ allowWithoutApprovalTools: z.array(namespaceToolRefSchema).default([]),
136
+ alwaysAskTools: z.array(namespaceToolRefSchema).default([]),
137
+ annotationPolicy: z.enum(["destructive-requires-approval", "always-require-approval"]).default("destructive-requires-approval"),
138
+ trustedAnnotationNamespaces: z.array(z.string().min(1)).default([]),
139
+ writeTools: z.array(namespaceToolRefSchema).default([])
140
+ }).strict();
141
+ const mcpPortalProfileDefinitionSchema = z.object({
142
+ extends: z.string().min(1).optional(),
143
+ enabledNamespaces: z.array(z.string().min(1)).optional(),
144
+ enabledToolsByNamespace: z.record(z.string().min(1), z.array(z.string().min(1))).optional(),
145
+ hiddenToolsByNamespace: z.record(z.string().min(1), z.array(z.string().min(1))).optional(),
146
+ logging: z.object({ enabled: z.boolean().default(false) }).strict().optional(),
147
+ promptContext: z.object({
148
+ enabled: z.boolean().default(true),
149
+ maxNamespaces: z.number().int().positive().default(12)
150
+ }).strict().optional(),
151
+ cache: z.object({ catalogTtlMs: z.number().int().positive().default(6e4) }).strict().optional(),
152
+ approval: portalApprovalConfigSchema.optional()
153
+ }).strict();
154
+ const resolvedMcpPortalProfileSchema = z.object({
155
+ enabledNamespaces: z.array(z.string().min(1)),
156
+ enabledToolsByNamespace: z.record(z.string().min(1), z.array(z.string().min(1))),
157
+ hiddenToolsByNamespace: z.record(z.string().min(1), z.array(z.string().min(1))),
158
+ logging: z.object({ enabled: z.boolean() }).strict(),
159
+ promptContext: z.object({
160
+ enabled: z.boolean(),
161
+ maxNamespaces: z.number().int().positive()
162
+ }).strict(),
163
+ cache: z.object({ catalogTtlMs: z.number().int().positive() }).strict(),
164
+ approval: portalApprovalConfigSchema
165
+ }).strict();
166
+ const mcpPortalAccessHeaderSchema = z.object({
167
+ name: z.string().min(1),
168
+ secret: secretValueSchema
169
+ }).strict();
170
+ const mcpPortalServerSchema = z.object({
171
+ host: z.string().min(1).default("127.0.0.1"),
172
+ port: z.number().int().min(1).max(65535).default(18790),
173
+ accessHeader: mcpPortalAccessHeaderSchema
174
+ }).strict();
175
+ const mcpPortalAgentConfigSchema = z.object({
176
+ profile: z.string().min(1),
177
+ hmacKey: secretValueSchema.optional()
178
+ }).strict();
179
+ const mcpPortalConfigSchema = z.object({
180
+ $schema: z.string().min(1).optional(),
181
+ schemaVersion: z.literal(1),
182
+ server: mcpPortalServerSchema,
183
+ agents: z.record(z.string().min(1), mcpPortalAgentConfigSchema).default({}),
184
+ profiles: z.record(z.string().min(1), mcpPortalProfileDefinitionSchema)
185
+ }).strict().superRefine((config, context) => {
186
+ if (Object.keys(config.profiles).length === 0) context.addIssue({
187
+ code: z.ZodIssueCode.custom,
188
+ message: "mcp-portal.config.jsonc must define at least one profile.",
189
+ path: ["profiles"]
190
+ });
191
+ });
192
+ const openClawMcpPortalPluginConfigSchema = z.object({
193
+ configDir: z.string().min(1),
194
+ binPath: z.string().min(1).optional()
195
+ }).strict();
196
+ const defaultProfile = {
197
+ approval: portalApprovalConfigSchema.parse({}),
198
+ cache: { catalogTtlMs: 6e4 },
199
+ enabledNamespaces: [],
200
+ enabledToolsByNamespace: {},
201
+ hiddenToolsByNamespace: {},
202
+ logging: { enabled: false },
203
+ promptContext: {
204
+ enabled: true,
205
+ maxNamespaces: 12
206
+ }
207
+ };
208
+ async function loadMcpPortalConfig(configPath) {
209
+ return mcpPortalConfigSchema.parse(await loadJsonConfigFile(configPath));
210
+ }
211
+ function mergeProfile(base, override) {
212
+ return resolvedMcpPortalProfileSchema.parse({
213
+ approval: override.approval ?? base.approval,
214
+ cache: override.cache ?? base.cache,
215
+ enabledNamespaces: override.enabledNamespaces ?? base.enabledNamespaces,
216
+ enabledToolsByNamespace: override.enabledToolsByNamespace ?? base.enabledToolsByNamespace,
217
+ hiddenToolsByNamespace: override.hiddenToolsByNamespace ?? base.hiddenToolsByNamespace,
218
+ logging: override.logging ?? base.logging,
219
+ promptContext: override.promptContext ?? base.promptContext
220
+ });
221
+ }
222
+ function resolveMcpPortalProfileWithState(config, profileName, state) {
223
+ const profile = config.profiles[profileName];
224
+ if (profile === void 0) throw new Error(`unknown MCP profile '${profileName}'`);
225
+ if (state.stack.includes(profileName)) throw new Error(`MCP profile inheritance cycle: ${[...state.stack, profileName].join(" -> ")}`);
226
+ return mergeProfile(profile.extends === void 0 ? defaultProfile : resolveMcpPortalProfileWithState(config, profile.extends, { stack: [...state.stack, profileName] }), profile);
227
+ }
228
+ function resolveMcpPortalProfile(config, profileName) {
229
+ return resolveMcpPortalProfileWithState(config, profileName, { stack: [] });
230
+ }
231
+ function secretValueToEnvironmentReference(secret) {
232
+ if (secret.source === "environment") return `\${${secret.name}}`;
233
+ return secret.ref;
234
+ }
235
+ //#endregion
236
+ //#region src/schema-artifacts.ts
237
+ const mcpPortalConfigSchemaVersions = {
238
+ mcp: 1,
239
+ mcpPortal: 1
240
+ };
241
+ const mcpPortalConfigSchemaIds = {
242
+ mcp: "agent-vm:mcp:1",
243
+ mcpPortal: "agent-vm:mcp-portal:1"
244
+ };
245
+ const mcpPortalConfigSchemaPaths = {
246
+ mcpFromGatewayConfig: "../../schemas/mcp.schema.json",
247
+ mcpPortalFromGatewayConfig: "../../schemas/mcp-portal.schema.json"
248
+ };
249
+ function withSchemaId(schema, schemaId) {
250
+ return {
251
+ $id: schemaId,
252
+ ...schema
253
+ };
254
+ }
255
+ function createConfigContractSchemaArtifacts() {
256
+ return {
257
+ mcp: withSchemaId(zod.toJSONSchema(mcpConfigSchema, { target: "draft-07" }), mcpPortalConfigSchemaIds.mcp),
258
+ mcpPortal: withSchemaId(zod.toJSONSchema(mcpPortalConfigSchema, { target: "draft-07" }), mcpPortalConfigSchemaIds.mcpPortal)
259
+ };
260
+ }
261
+ //#endregion
262
+ export { assertJsonObject, createConfigContractSchemaArtifacts, isJsonObject, jsonObjectSchema, jsonValueSchema, loadJsonConfigFile, loadMcpConfig, loadMcpPortalConfig, mcpConfigSchema, mcpConfigToResolvedProviders, mcpPortalAgentConfigSchema, mcpPortalCallRequiresApproval, mcpPortalConfigSchema, mcpPortalConfigSchemaIds, mcpPortalConfigSchemaPaths, mcpPortalConfigSchemaVersions, mcpPortalProfileDefinitionSchema, mcpPortalServerSchema, mcpProviderSchema, namespaceToolRefSchema, openClawMcpPortalPluginConfigSchema, portalApprovalConfigSchema, resolveMcpPortalProfile, resolvedMcpPortalProfileSchema, secretValueSchema, secretValueToEnvironmentReference };
263
+
264
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":[],"sources":["../src/json-config-file.ts","../src/json-value.ts","../src/secret-value.ts","../src/mcp-config.ts","../src/mcp-portal-approval-policy.ts","../src/mcp-portal-config.ts","../src/schema-artifacts.ts"],"sourcesContent":["import { readFile } from 'node:fs/promises';\n\nimport { parse, type ParseError, type ParseOptions, printParseErrorCode } from 'jsonc-parser';\n\nconst parseJsoncToUnknown: (text: string, errors: ParseError[], options: ParseOptions) => unknown =\n\tparse;\n\nfunction formatLineColumn(text: string, offset: number): string {\n\tconst prefix = text.slice(0, offset);\n\tconst line = prefix.split('\\n').length;\n\tconst lastLineBreakIndex = prefix.lastIndexOf('\\n');\n\tconst column = offset - lastLineBreakIndex;\n\treturn `line ${line}, column ${column}`;\n}\n\nfunction formatParseError(filePath: string, text: string, error: ParseError): string {\n\treturn [\n\t\t`Invalid JSONC in ${filePath}: ${formatLineColumn(text, error.offset)}:`,\n\t\tprintParseErrorCode(error.error),\n\t].join(' ');\n}\n\nexport async function loadJsonConfigFile(filePath: string): Promise<unknown> {\n\tconst rawConfig = await readFile(filePath, 'utf8');\n\tconst parseErrors: ParseError[] = [];\n\tconst parsedConfig = parseJsoncToUnknown(rawConfig, parseErrors, {\n\t\tallowTrailingComma: true,\n\t\tdisallowComments: false,\n\t});\n\n\tif (parseErrors.length > 0) {\n\t\tconst firstParseError = parseErrors[0];\n\t\tif (firstParseError !== undefined) {\n\t\t\tthrow new Error(formatParseError(filePath, rawConfig, firstParseError));\n\t\t}\n\t}\n\n\treturn parsedConfig;\n}\n","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\nexport const secretValueSchema = z.discriminatedUnion('source', [\n\tz\n\t\t.object({\n\t\t\tsource: z.literal('environment'),\n\t\t\tname: z.string().min(1),\n\t\t})\n\t\t.strict(),\n\tz\n\t\t.object({\n\t\t\tsource: z.literal('1password'),\n\t\t\tref: z.string().min(1),\n\t\t})\n\t\t.strict(),\n]);\n\nexport type SecretValue = z.infer<typeof secretValueSchema>;\n","import { z } from 'zod';\n\nimport { loadJsonConfigFile } from './json-config-file.js';\nimport { secretValueSchema, type SecretValue } from './secret-value.js';\n\nconst mcpProviderDiscoverySchema = z\n\t.object({\n\t\tsummary: z.string().min(1).optional(),\n\t})\n\t.strict();\n\nconst streamableHttpTransportSchema = z\n\t.object({\n\t\tkind: z.literal('streamable-http'),\n\t\turl: z.string().url(),\n\t\theaders: z.record(z.string(), secretValueSchema).default({}),\n\t})\n\t.strict();\n\nconst sseTransportSchema = z\n\t.object({\n\t\tkind: z.literal('sse'),\n\t\turl: z.string().url(),\n\t\theaders: z.record(z.string(), secretValueSchema).default({}),\n\t})\n\t.strict();\n\nconst stdioTransportSchema = z\n\t.object({\n\t\tkind: z.literal('stdio'),\n\t\tcommand: z.string().min(1),\n\t\targs: z.array(z.string()).default([]),\n\t\tcwd: z.string().min(1).optional(),\n\t\tenv: z.record(z.string(), secretValueSchema).default({}),\n\t})\n\t.strict();\n\nexport const mcpProviderSchema = z\n\t.object({\n\t\tkind: z.literal('mcp'),\n\t\tnamespace: z.string().min(1),\n\t\tdiscovery: mcpProviderDiscoverySchema.default({}),\n\t\ttransport: z.discriminatedUnion('kind', [\n\t\t\tstreamableHttpTransportSchema,\n\t\t\tsseTransportSchema,\n\t\t\tstdioTransportSchema,\n\t\t]),\n\t})\n\t.strict();\n\nexport const mcpConfigSchema = z\n\t.object({\n\t\t$schema: z.string().min(1).optional(),\n\t\tschemaVersion: z.literal(1),\n\t\tproviders: z.record(z.string().min(1), mcpProviderSchema).default({}),\n\t})\n\t.strict();\n\nexport type McpConfig = z.infer<typeof mcpConfigSchema>;\nexport type McpProvider = z.infer<typeof mcpProviderSchema>;\n\nexport type ResolvedMcpProvider =\n\t| {\n\t\t\treadonly headers: Readonly<Record<string, SecretValue>>;\n\t\t\treadonly namespace: string;\n\t\t\treadonly transport: 'streamable-http' | 'sse';\n\t\t\treadonly url: string;\n\t }\n\t| {\n\t\t\treadonly args: readonly string[];\n\t\t\treadonly command: string;\n\t\t\treadonly cwd?: string;\n\t\t\treadonly env: Readonly<Record<string, SecretValue>>;\n\t\t\treadonly namespace: string;\n\t\t\treadonly transport: 'stdio';\n\t };\n\nexport async function loadMcpConfig(configPath: string): Promise<McpConfig> {\n\treturn mcpConfigSchema.parse(await loadJsonConfigFile(configPath));\n}\n\nexport function mcpConfigToResolvedProviders(config: McpConfig): readonly ResolvedMcpProvider[] {\n\treturn Object.values(config.providers).map((provider) => {\n\t\tconst transport = provider.transport;\n\t\tif (transport.kind === 'stdio') {\n\t\t\tconst resolvedProvider: {\n\t\t\t\targs: readonly string[];\n\t\t\t\tcommand: string;\n\t\t\t\tcwd?: string;\n\t\t\t\tenv: Readonly<Record<string, SecretValue>>;\n\t\t\t\tnamespace: string;\n\t\t\t\ttransport: 'stdio';\n\t\t\t} = {\n\t\t\t\targs: transport.args,\n\t\t\t\tcommand: transport.command,\n\t\t\t\tenv: transport.env,\n\t\t\t\tnamespace: provider.namespace,\n\t\t\t\ttransport: transport.kind,\n\t\t\t};\n\t\t\tif (transport.cwd !== undefined) {\n\t\t\t\tresolvedProvider.cwd = transport.cwd;\n\t\t\t}\n\t\t\treturn resolvedProvider;\n\t\t}\n\n\t\treturn {\n\t\t\theaders: transport.headers,\n\t\t\tnamespace: provider.namespace,\n\t\t\ttransport: transport.kind,\n\t\t\turl: transport.url,\n\t\t};\n\t});\n}\n","import type { NamespaceToolRef, ResolvedMcpPortalProfile } from './mcp-portal-config.js';\n\nexport interface McpPortalApprovalToolAnnotations {\n\treadonly destructiveHint?: boolean | undefined;\n\treadonly readOnlyHint?: boolean | undefined;\n}\n\nexport interface McpPortalApprovalToolCall {\n\treadonly annotations?: McpPortalApprovalToolAnnotations;\n\treadonly namespace: string;\n\treadonly toolName: string;\n}\n\nfunction selectorMatches(\n\tselectors: readonly NamespaceToolRef[],\n\tnamespace: string,\n\ttoolName: string,\n): boolean {\n\treturn selectors.some(\n\t\t(selector) => selector.namespace === namespace && selector.toolName === toolName,\n\t);\n}\n\nfunction hasTrustedReadOnlyAnnotation(\n\tprofile: ResolvedMcpPortalProfile,\n\tcall: McpPortalApprovalToolCall,\n): boolean {\n\treturn (\n\t\tprofile.approval.annotationPolicy === 'destructive-requires-approval' &&\n\t\tprofile.approval.trustedAnnotationNamespaces.includes(call.namespace) &&\n\t\tcall.annotations?.readOnlyHint === true &&\n\t\tcall.annotations.destructiveHint !== true\n\t);\n}\n\nexport function mcpPortalCallRequiresApproval(\n\tprofile: ResolvedMcpPortalProfile,\n\tcall: McpPortalApprovalToolCall,\n): boolean {\n\tif (selectorMatches(profile.approval.allowWithoutApprovalTools, call.namespace, call.toolName)) {\n\t\treturn false;\n\t}\n\tif (profile.approval.annotationPolicy === 'always-require-approval') {\n\t\treturn true;\n\t}\n\tif (\n\t\tselectorMatches(profile.approval.alwaysAskTools, call.namespace, call.toolName) ||\n\t\tselectorMatches(profile.approval.writeTools, call.namespace, call.toolName)\n\t) {\n\t\treturn true;\n\t}\n\treturn !hasTrustedReadOnlyAnnotation(profile, call);\n}\n","import { z } from 'zod';\n\nimport { loadJsonConfigFile } from './json-config-file.js';\nimport { secretValueSchema, type SecretValue } from './secret-value.js';\n\nexport const namespaceToolRefSchema = z\n\t.object({\n\t\tnamespace: z.string().min(1),\n\t\ttoolName: z.string().min(1),\n\t})\n\t.strict();\n\nexport type NamespaceToolRef = z.infer<typeof namespaceToolRefSchema>;\n\nexport const portalApprovalConfigSchema = z\n\t.object({\n\t\tallowWithoutApprovalTools: z.array(namespaceToolRefSchema).default([]),\n\t\talwaysAskTools: z.array(namespaceToolRefSchema).default([]),\n\t\tannotationPolicy: z\n\t\t\t.enum(['destructive-requires-approval', 'always-require-approval'])\n\t\t\t.default('destructive-requires-approval'),\n\t\ttrustedAnnotationNamespaces: z.array(z.string().min(1)).default([]),\n\t\twriteTools: z.array(namespaceToolRefSchema).default([]),\n\t})\n\t.strict();\n\nexport type PortalApprovalConfig = z.infer<typeof portalApprovalConfigSchema>;\n\nexport const mcpPortalProfileDefinitionSchema = z\n\t.object({\n\t\textends: z.string().min(1).optional(),\n\t\tenabledNamespaces: z.array(z.string().min(1)).optional(),\n\t\tenabledToolsByNamespace: z.record(z.string().min(1), z.array(z.string().min(1))).optional(),\n\t\thiddenToolsByNamespace: z.record(z.string().min(1), z.array(z.string().min(1))).optional(),\n\t\tlogging: z\n\t\t\t.object({ enabled: z.boolean().default(false) })\n\t\t\t.strict()\n\t\t\t.optional(),\n\t\tpromptContext: z\n\t\t\t.object({\n\t\t\t\tenabled: z.boolean().default(true),\n\t\t\t\tmaxNamespaces: z.number().int().positive().default(12),\n\t\t\t})\n\t\t\t.strict()\n\t\t\t.optional(),\n\t\tcache: z\n\t\t\t.object({\n\t\t\t\tcatalogTtlMs: z.number().int().positive().default(60_000),\n\t\t\t})\n\t\t\t.strict()\n\t\t\t.optional(),\n\t\tapproval: portalApprovalConfigSchema.optional(),\n\t})\n\t.strict();\n\nexport type McpPortalProfileDefinition = z.infer<typeof mcpPortalProfileDefinitionSchema>;\n\nexport const resolvedMcpPortalProfileSchema = z\n\t.object({\n\t\tenabledNamespaces: z.array(z.string().min(1)),\n\t\tenabledToolsByNamespace: z.record(z.string().min(1), z.array(z.string().min(1))),\n\t\thiddenToolsByNamespace: z.record(z.string().min(1), z.array(z.string().min(1))),\n\t\tlogging: z.object({ enabled: z.boolean() }).strict(),\n\t\tpromptContext: z\n\t\t\t.object({\n\t\t\t\tenabled: z.boolean(),\n\t\t\t\tmaxNamespaces: z.number().int().positive(),\n\t\t\t})\n\t\t\t.strict(),\n\t\tcache: z.object({ catalogTtlMs: z.number().int().positive() }).strict(),\n\t\tapproval: portalApprovalConfigSchema,\n\t})\n\t.strict();\n\nexport type ResolvedMcpPortalProfile = z.infer<typeof resolvedMcpPortalProfileSchema>;\n\nconst mcpPortalAccessHeaderSchema = z\n\t.object({\n\t\tname: z.string().min(1),\n\t\tsecret: secretValueSchema,\n\t})\n\t.strict();\n\nexport const mcpPortalServerSchema = z\n\t.object({\n\t\thost: z.string().min(1).default('127.0.0.1'),\n\t\tport: z.number().int().min(1).max(65_535).default(18_790),\n\t\taccessHeader: mcpPortalAccessHeaderSchema,\n\t})\n\t.strict();\n\nexport type McpPortalServerConfig = z.infer<typeof mcpPortalServerSchema>;\n\nexport const mcpPortalAgentConfigSchema = z\n\t.object({\n\t\tprofile: z.string().min(1),\n\t\thmacKey: secretValueSchema.optional(),\n\t})\n\t.strict();\n\nexport type McpPortalAgentConfig = z.infer<typeof mcpPortalAgentConfigSchema>;\n\nexport const mcpPortalConfigSchema = z\n\t.object({\n\t\t$schema: z.string().min(1).optional(),\n\t\tschemaVersion: z.literal(1),\n\t\tserver: mcpPortalServerSchema,\n\t\tagents: z.record(z.string().min(1), mcpPortalAgentConfigSchema).default({}),\n\t\tprofiles: z.record(z.string().min(1), mcpPortalProfileDefinitionSchema),\n\t})\n\t.strict()\n\t.superRefine((config, context) => {\n\t\tif (Object.keys(config.profiles).length === 0) {\n\t\t\tcontext.addIssue({\n\t\t\t\tcode: z.ZodIssueCode.custom,\n\t\t\t\tmessage: 'mcp-portal.config.jsonc must define at least one profile.',\n\t\t\t\tpath: ['profiles'],\n\t\t\t});\n\t\t}\n\t});\n\nexport type McpPortalConfig = z.infer<typeof mcpPortalConfigSchema>;\n\nexport const openClawMcpPortalPluginConfigSchema = z\n\t.object({\n\t\tconfigDir: z.string().min(1),\n\t\tbinPath: z.string().min(1).optional(),\n\t})\n\t.strict();\n\nexport type OpenClawMcpPortalPluginConfig = z.infer<typeof openClawMcpPortalPluginConfigSchema>;\n\nconst defaultProfile: ResolvedMcpPortalProfile = {\n\tapproval: portalApprovalConfigSchema.parse({}),\n\tcache: { catalogTtlMs: 60_000 },\n\tenabledNamespaces: [],\n\tenabledToolsByNamespace: {},\n\thiddenToolsByNamespace: {},\n\tlogging: { enabled: false },\n\tpromptContext: { enabled: true, maxNamespaces: 12 },\n};\n\ninterface ResolveProfileState {\n\treadonly stack: readonly string[];\n}\n\nexport async function loadMcpPortalConfig(configPath: string): Promise<McpPortalConfig> {\n\treturn mcpPortalConfigSchema.parse(await loadJsonConfigFile(configPath));\n}\n\nfunction mergeProfile(\n\tbase: ResolvedMcpPortalProfile,\n\toverride: McpPortalProfileDefinition,\n): ResolvedMcpPortalProfile {\n\treturn resolvedMcpPortalProfileSchema.parse({\n\t\tapproval: override.approval ?? base.approval,\n\t\tcache: override.cache ?? base.cache,\n\t\tenabledNamespaces: override.enabledNamespaces ?? base.enabledNamespaces,\n\t\tenabledToolsByNamespace: override.enabledToolsByNamespace ?? base.enabledToolsByNamespace,\n\t\thiddenToolsByNamespace: override.hiddenToolsByNamespace ?? base.hiddenToolsByNamespace,\n\t\tlogging: override.logging ?? base.logging,\n\t\tpromptContext: override.promptContext ?? base.promptContext,\n\t});\n}\n\nfunction resolveMcpPortalProfileWithState(\n\tconfig: McpPortalConfig,\n\tprofileName: string,\n\tstate: ResolveProfileState,\n): ResolvedMcpPortalProfile {\n\tconst profile = config.profiles[profileName];\n\tif (profile === undefined) {\n\t\tthrow new Error(`unknown MCP profile '${profileName}'`);\n\t}\n\tif (state.stack.includes(profileName)) {\n\t\tthrow new Error(`MCP profile inheritance cycle: ${[...state.stack, profileName].join(' -> ')}`);\n\t}\n\n\tconst parentProfile =\n\t\tprofile.extends === undefined\n\t\t\t? defaultProfile\n\t\t\t: resolveMcpPortalProfileWithState(config, profile.extends, {\n\t\t\t\t\tstack: [...state.stack, profileName],\n\t\t\t\t});\n\treturn mergeProfile(parentProfile, profile);\n}\n\nexport function resolveMcpPortalProfile(\n\tconfig: McpPortalConfig,\n\tprofileName: string,\n): ResolvedMcpPortalProfile {\n\treturn resolveMcpPortalProfileWithState(config, profileName, { stack: [] });\n}\n\nexport function secretValueToEnvironmentReference(secret: SecretValue): string {\n\tif (secret.source === 'environment') {\n\t\treturn `\\${${secret.name}}`;\n\t}\n\treturn secret.ref;\n}\n","import * as zod from 'zod';\n\nimport { mcpConfigSchema } from './mcp-config.js';\nimport { mcpPortalConfigSchema } from './mcp-portal-config.js';\n\nexport const mcpPortalConfigSchemaVersions = {\n\tmcp: 1,\n\tmcpPortal: 1,\n} as const;\n\nexport const mcpPortalConfigSchemaIds = {\n\tmcp: 'agent-vm:mcp:1',\n\tmcpPortal: 'agent-vm:mcp-portal:1',\n} as const;\n\nexport const mcpPortalConfigSchemaPaths = {\n\tmcpFromGatewayConfig: '../../schemas/mcp.schema.json',\n\tmcpPortalFromGatewayConfig: '../../schemas/mcp-portal.schema.json',\n} as const;\n\nexport interface ConfigContractSchemaArtifacts {\n\treadonly mcp: Record<string, unknown>;\n\treadonly mcpPortal: Record<string, unknown>;\n}\n\nfunction withSchemaId(schema: Record<string, unknown>, schemaId: string): Record<string, unknown> {\n\treturn {\n\t\t$id: schemaId,\n\t\t...schema,\n\t};\n}\n\nexport function createConfigContractSchemaArtifacts(): ConfigContractSchemaArtifacts {\n\treturn {\n\t\tmcp: withSchemaId(\n\t\t\tzod.toJSONSchema(mcpConfigSchema, { target: 'draft-07' }),\n\t\t\tmcpPortalConfigSchemaIds.mcp,\n\t\t),\n\t\tmcpPortal: withSchemaId(\n\t\t\tzod.toJSONSchema(mcpPortalConfigSchema, { target: 'draft-07' }),\n\t\t\tmcpPortalConfigSchemaIds.mcpPortal,\n\t\t),\n\t};\n}\n"],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,43 @@
1
+ {
2
+ "name": "@agent-vm/config-contracts",
3
+ "version": "0.0.59",
4
+ "description": "Shared agent-vm JSONC config schemas and TypeScript contracts.",
5
+ "homepage": "https://github.com/ShravanSunder/agent-vm#readme",
6
+ "bugs": {
7
+ "url": "https://github.com/ShravanSunder/agent-vm/issues"
8
+ },
9
+ "license": "MIT",
10
+ "author": "Shravan Sunder <ShravanSunder@users.noreply.github.com>",
11
+ "repository": {
12
+ "type": "git",
13
+ "url": "git+https://github.com/ShravanSunder/agent-vm.git",
14
+ "directory": "packages/config-contracts"
15
+ },
16
+ "files": [
17
+ "dist"
18
+ ],
19
+ "type": "module",
20
+ "main": "./dist/index.js",
21
+ "types": "./dist/index.d.ts",
22
+ "exports": {
23
+ ".": {
24
+ "types": "./dist/index.d.ts",
25
+ "import": "./dist/index.js"
26
+ }
27
+ },
28
+ "publishConfig": {
29
+ "access": "public"
30
+ },
31
+ "dependencies": {
32
+ "jsonc-parser": "^3.3.1",
33
+ "zod": "^4.4.3"
34
+ },
35
+ "devDependencies": {
36
+ "vitest": "^4.1.5"
37
+ },
38
+ "scripts": {
39
+ "build": "tsdown",
40
+ "typecheck": "tsc -p tsconfig.json --noEmit",
41
+ "test": "vitest run --root ../../ --config vitest.config.ts packages/config-contracts/src"
42
+ }
43
+ }