@agent-vm/mcp-portal 0.0.93 → 0.0.95
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 +10 -8
- package/dist/bin/mcp-portal.js +6 -6
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +1 -1
- package/dist/core/index.js +4 -4
- package/dist/index.js +3 -3
- package/dist/mcp-proxy/index.js +1 -1
- package/dist/portal-config/index.js +2 -2
- package/dist/{portal-core-B8HZPw3z.js → portal-core-CYLdSvsL.js} +5 -5
- package/dist/{portal-core-B8HZPw3z.js.map → portal-core-CYLdSvsL.js.map} +1 -1
- package/dist/{portal-tools-fFyF72Nl.js → portal-tools-BhBrxlwi.js} +4 -4
- package/dist/{portal-tools-fFyF72Nl.js.map → portal-tools-BhBrxlwi.js.map} +1 -1
- package/dist/{resolve-agent-identity-BQNGUP66.js → resolve-agent-identity-BK4WlZgd.js} +3 -3
- package/dist/{resolve-agent-identity-BQNGUP66.js.map → resolve-agent-identity-BK4WlZgd.js.map} +1 -1
- package/dist/{serve-command-4BNOH14H.js → serve-command-BAfDRqPj.js} +4 -8
- package/dist/serve-command-BAfDRqPj.js.map +1 -0
- package/dist/{typescript-artifact-EQH4tZ0C.js → typescript-artifact-CXxEYME7.js} +2 -2
- package/dist/{typescript-artifact-EQH4tZ0C.js.map → typescript-artifact-CXxEYME7.js.map} +1 -1
- package/dist/{upstream-mcp-client-runtime-vu2TiTUw.js → upstream-mcp-client-runtime-Bzy0aa0o.js} +3 -3
- package/dist/{upstream-mcp-client-runtime-vu2TiTUw.js.map → upstream-mcp-client-runtime-Bzy0aa0o.js.map} +1 -1
- package/dist/{upstream-response-middleware-_dthoE1r.js → upstream-response-middleware-fcJSrSEo.js} +2 -2
- package/dist/{upstream-response-middleware-_dthoE1r.js.map → upstream-response-middleware-fcJSrSEo.js.map} +1 -1
- package/dist/zod-schema-loader-BubVafy-.d.ts.map +1 -1
- package/dist/{zod-schema-loader-C3I-MnWq.js → zod-schema-loader-DI7JliBn.js} +141 -3
- package/dist/zod-schema-loader-DI7JliBn.js.map +1 -0
- package/package.json +3 -3
- package/dist/serve-command-4BNOH14H.js.map +0 -1
- package/dist/zod-schema-loader-C3I-MnWq.js.map +0 -1
|
@@ -100,6 +100,13 @@ function decodeToolRef(toolRef) {
|
|
|
100
100
|
}
|
|
101
101
|
//#endregion
|
|
102
102
|
//#region src/zod-schema-loader.ts
|
|
103
|
+
const normalizableTypeNames = new Set([
|
|
104
|
+
"array",
|
|
105
|
+
"boolean",
|
|
106
|
+
"integer",
|
|
107
|
+
"number",
|
|
108
|
+
"object"
|
|
109
|
+
]);
|
|
103
110
|
const unsupportedFeatures = new Set([
|
|
104
111
|
"contains",
|
|
105
112
|
"dependentSchemas",
|
|
@@ -113,6 +120,9 @@ const unsupportedFeatures = new Set([
|
|
|
113
120
|
function isJsonObject(value) {
|
|
114
121
|
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
115
122
|
}
|
|
123
|
+
function isJsonSchemaObject(value) {
|
|
124
|
+
return value !== void 0 && isJsonObject(value);
|
|
125
|
+
}
|
|
116
126
|
function findUnsupportedFeature(value, path = []) {
|
|
117
127
|
if (Array.isArray(value)) {
|
|
118
128
|
for (const [index, childValue] of value.entries()) {
|
|
@@ -156,6 +166,133 @@ function valueAtPath(value, path) {
|
|
|
156
166
|
function isJsonObjectValue(value) {
|
|
157
167
|
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
158
168
|
}
|
|
169
|
+
function schemaTypeName(schema) {
|
|
170
|
+
const type = schema.type;
|
|
171
|
+
if (typeof type === "string") return type;
|
|
172
|
+
if (!Array.isArray(type)) return;
|
|
173
|
+
const concreteTypeNames = type.filter((entry) => typeof entry === "string" && entry !== "null");
|
|
174
|
+
if (concreteTypeNames.length !== 1) return;
|
|
175
|
+
const concreteTypeName = concreteTypeNames[0];
|
|
176
|
+
if (concreteTypeName === void 0) return;
|
|
177
|
+
return normalizableTypeNames.has(concreteTypeName) ? concreteTypeName : void 0;
|
|
178
|
+
}
|
|
179
|
+
function localReferencePath(reference) {
|
|
180
|
+
if (!reference.startsWith("#/")) return null;
|
|
181
|
+
return reference.slice(2).split("/").map((part) => part.replaceAll("~1", "/").replaceAll("~0", "~"));
|
|
182
|
+
}
|
|
183
|
+
function schemaAtPath(rootSchema, path) {
|
|
184
|
+
let currentSchema = rootSchema;
|
|
185
|
+
for (const pathPart of path) {
|
|
186
|
+
if (!isJsonObject(currentSchema)) return null;
|
|
187
|
+
const nextSchema = currentSchema[pathPart];
|
|
188
|
+
if (nextSchema === void 0) return null;
|
|
189
|
+
currentSchema = nextSchema;
|
|
190
|
+
}
|
|
191
|
+
return isJsonObject(currentSchema) ? currentSchema : null;
|
|
192
|
+
}
|
|
193
|
+
function resolveLocalSchemaReference(rootSchema, reference) {
|
|
194
|
+
if (typeof reference !== "string") return null;
|
|
195
|
+
const path = localReferencePath(reference);
|
|
196
|
+
return path === null ? null : schemaAtPath(rootSchema, path);
|
|
197
|
+
}
|
|
198
|
+
function allOfSchemas(schema) {
|
|
199
|
+
const allOf = schema.allOf;
|
|
200
|
+
if (!Array.isArray(allOf)) return [];
|
|
201
|
+
return allOf.filter((entry) => isJsonObject(entry));
|
|
202
|
+
}
|
|
203
|
+
function isObjectLikeSchema(schema, type) {
|
|
204
|
+
return type === "object" || isJsonSchemaObject(schema.properties) || isJsonSchemaObject(schema.patternProperties) || isJsonSchemaObject(schema.additionalProperties);
|
|
205
|
+
}
|
|
206
|
+
function isArrayLikeSchema(schema, type) {
|
|
207
|
+
return type === "array" || Array.isArray(schema.prefixItems) || schema.items !== void 0;
|
|
208
|
+
}
|
|
209
|
+
function parseJsonString(value) {
|
|
210
|
+
try {
|
|
211
|
+
return {
|
|
212
|
+
ok: true,
|
|
213
|
+
value: JSON.parse(value)
|
|
214
|
+
};
|
|
215
|
+
} catch {
|
|
216
|
+
return { ok: false };
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
function parseStringNumber(value, props) {
|
|
220
|
+
const trimmedValue = value.trim();
|
|
221
|
+
if (!/^-?(?:0|[1-9]\d*)(?:\.\d+)?(?:e[+-]?\d+)?$/iu.test(trimmedValue)) return null;
|
|
222
|
+
const parsedValue = Number(trimmedValue);
|
|
223
|
+
if (!Number.isFinite(parsedValue)) return null;
|
|
224
|
+
if (props.integer && !Number.isInteger(parsedValue)) return null;
|
|
225
|
+
return parsedValue;
|
|
226
|
+
}
|
|
227
|
+
function parseStringBoolean(value) {
|
|
228
|
+
const trimmedValue = value.trim();
|
|
229
|
+
if (trimmedValue === "true") return true;
|
|
230
|
+
if (trimmedValue === "false") return false;
|
|
231
|
+
return null;
|
|
232
|
+
}
|
|
233
|
+
function normalizeObjectValueForJsonSchema(schema, value, rootSchema) {
|
|
234
|
+
const normalizedValue = { ...value };
|
|
235
|
+
const properties = schema.properties;
|
|
236
|
+
if (isJsonSchemaObject(properties)) {
|
|
237
|
+
for (const [propertyName, propertySchema] of Object.entries(properties)) if (propertyName in normalizedValue && isJsonSchemaObject(propertySchema)) normalizedValue[propertyName] = normalizeValueForJsonSchema(propertySchema, normalizedValue[propertyName], rootSchema);
|
|
238
|
+
}
|
|
239
|
+
const patternProperties = schema.patternProperties;
|
|
240
|
+
const matchedPatternProperties = /* @__PURE__ */ new Set();
|
|
241
|
+
if (isJsonSchemaObject(patternProperties)) for (const [pattern, patternSchema] of Object.entries(patternProperties)) {
|
|
242
|
+
if (!isJsonSchemaObject(patternSchema)) continue;
|
|
243
|
+
let regex;
|
|
244
|
+
try {
|
|
245
|
+
regex = new RegExp(pattern, "u");
|
|
246
|
+
} catch {
|
|
247
|
+
continue;
|
|
248
|
+
}
|
|
249
|
+
for (const propertyName of Object.keys(normalizedValue)) if (regex.test(propertyName)) {
|
|
250
|
+
normalizedValue[propertyName] = normalizeValueForJsonSchema(patternSchema, normalizedValue[propertyName], rootSchema);
|
|
251
|
+
matchedPatternProperties.add(propertyName);
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
const additionalProperties = schema.additionalProperties;
|
|
255
|
+
if (isJsonSchemaObject(additionalProperties)) for (const propertyName of Object.keys(normalizedValue)) {
|
|
256
|
+
if (isJsonSchemaObject(properties) && propertyName in properties) continue;
|
|
257
|
+
if (matchedPatternProperties.has(propertyName)) continue;
|
|
258
|
+
normalizedValue[propertyName] = normalizeValueForJsonSchema(additionalProperties, normalizedValue[propertyName], rootSchema);
|
|
259
|
+
}
|
|
260
|
+
return normalizedValue;
|
|
261
|
+
}
|
|
262
|
+
function normalizeArrayValueForJsonSchema(schema, value, rootSchema) {
|
|
263
|
+
const items = schema.items;
|
|
264
|
+
const prefixItems = schema.prefixItems;
|
|
265
|
+
if (Array.isArray(prefixItems)) return value.map((entry, index) => {
|
|
266
|
+
const itemSchema = prefixItems[index];
|
|
267
|
+
if (isJsonSchemaObject(itemSchema)) return normalizeValueForJsonSchema(itemSchema, entry, rootSchema);
|
|
268
|
+
if (isJsonSchemaObject(items)) return normalizeValueForJsonSchema(items, entry, rootSchema);
|
|
269
|
+
return entry;
|
|
270
|
+
});
|
|
271
|
+
if (Array.isArray(items)) return value.map((entry, index) => {
|
|
272
|
+
const itemSchema = items[index];
|
|
273
|
+
return isJsonSchemaObject(itemSchema) ? normalizeValueForJsonSchema(itemSchema, entry, rootSchema) : entry;
|
|
274
|
+
});
|
|
275
|
+
if (isJsonSchemaObject(items)) return value.map((entry) => normalizeValueForJsonSchema(items, entry, rootSchema));
|
|
276
|
+
return value;
|
|
277
|
+
}
|
|
278
|
+
function normalizeValueForJsonSchema(schema, value, rootSchema = schema) {
|
|
279
|
+
const referencedSchema = resolveLocalSchemaReference(rootSchema, schema.$ref);
|
|
280
|
+
if (referencedSchema !== null) return normalizeValueForJsonSchema(referencedSchema, value, rootSchema);
|
|
281
|
+
let normalizedValue = value;
|
|
282
|
+
for (const allOfSchema of allOfSchemas(schema)) normalizedValue = normalizeValueForJsonSchema(allOfSchema, normalizedValue, rootSchema);
|
|
283
|
+
const type = schemaTypeName(schema);
|
|
284
|
+
const isObjectLike = isObjectLikeSchema(schema, type);
|
|
285
|
+
const isArrayLike = isArrayLikeSchema(schema, type);
|
|
286
|
+
if ((type === "number" || type === "integer") && typeof normalizedValue === "string") return parseStringNumber(normalizedValue, { integer: type === "integer" }) ?? normalizedValue;
|
|
287
|
+
if (type === "boolean" && typeof normalizedValue === "string") return parseStringBoolean(normalizedValue) ?? normalizedValue;
|
|
288
|
+
if ((isObjectLike || isArrayLike) && typeof normalizedValue === "string") {
|
|
289
|
+
const parsedValue = parseJsonString(normalizedValue);
|
|
290
|
+
if (parsedValue.ok && (isObjectLike && isJsonObjectValue(parsedValue.value) || isArrayLike && Array.isArray(parsedValue.value))) normalizedValue = parsedValue.value;
|
|
291
|
+
}
|
|
292
|
+
if (isObjectLike && isJsonObjectValue(normalizedValue)) return normalizeObjectValueForJsonSchema(schema, normalizedValue, rootSchema);
|
|
293
|
+
if (isArrayLike && Array.isArray(normalizedValue)) return normalizeArrayValueForJsonSchema(schema, normalizedValue, rootSchema);
|
|
294
|
+
return normalizedValue;
|
|
295
|
+
}
|
|
159
296
|
function jsonTypeName(value) {
|
|
160
297
|
if (value === void 0) return "undefined";
|
|
161
298
|
if (value === null) return "null";
|
|
@@ -229,7 +366,8 @@ function buildZodValidatorFromJsonSchema(jsonSchema) {
|
|
|
229
366
|
return {
|
|
230
367
|
ok: true,
|
|
231
368
|
validate(value) {
|
|
232
|
-
const
|
|
369
|
+
const normalizedValue = normalizeValueForJsonSchema(jsonSchema, value);
|
|
370
|
+
const parsed = zodSchema.safeParse(normalizedValue);
|
|
233
371
|
if (parsed.success) return {
|
|
234
372
|
ok: true,
|
|
235
373
|
value: parsed.data
|
|
@@ -237,7 +375,7 @@ function buildZodValidatorFromJsonSchema(jsonSchema) {
|
|
|
237
375
|
return {
|
|
238
376
|
error: {
|
|
239
377
|
kind: "input_validation",
|
|
240
|
-
issues: parsed.error.issues.map((issue) => toValidationIssue(issue,
|
|
378
|
+
issues: parsed.error.issues.map((issue) => toValidationIssue(issue, normalizedValue))
|
|
241
379
|
},
|
|
242
380
|
ok: false
|
|
243
381
|
};
|
|
@@ -258,4 +396,4 @@ function buildZodValidatorFromJsonSchema(jsonSchema) {
|
|
|
258
396
|
//#endregion
|
|
259
397
|
export { portalToolRecordSchema as a, isJsonObject$1 as c, portalToolAnnotationsSchema as i, jsonObjectSchema as l, decodeToolRef as n, safeToolMetadataSchema as o, encodeToolRef as r, assertJsonObject as s, buildZodValidatorFromJsonSchema as t, jsonValueSchema as u };
|
|
260
398
|
|
|
261
|
-
//# sourceMappingURL=zod-schema-loader-
|
|
399
|
+
//# sourceMappingURL=zod-schema-loader-DI7JliBn.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"zod-schema-loader-DI7JliBn.js","names":["isJsonObject"],"sources":["../src/json-schema.ts","../src/catalog-types.ts","../src/tool-ref.ts","../src/zod-schema-loader.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 { z } from 'zod';\n\nimport type { JsonObject, JsonValue } from './json-schema.js';\n\nexport interface InputValidationIssue {\n\treadonly code: string;\n\treadonly expected?: string;\n\treadonly keys?: readonly string[];\n\treadonly message: string;\n\treadonly path: readonly (number | string)[];\n\treadonly received?: {\n\t\treadonly preview?: string;\n\t\treadonly type: string;\n\t};\n\treadonly values?: readonly JsonValue[];\n}\n\nexport interface InputValidationError {\n\treadonly kind: 'input_validation';\n\treadonly issues: readonly InputValidationIssue[];\n}\n\nexport interface SchemaValidationUnavailableError {\n\treadonly feature: string;\n\treadonly kind: 'schema_validation_unavailable';\n\treadonly message: string;\n\treadonly path: readonly (number | string)[];\n}\n\nexport type PortalValidationResult =\n\t| { readonly ok: true; readonly value: unknown }\n\t| { readonly error: InputValidationError; readonly ok: false };\n\nexport type BuiltZodValidator =\n\t| {\n\t\t\treadonly ok: true;\n\t\t\treadonly validate: (value: unknown) => PortalValidationResult;\n\t }\n\t| {\n\t\t\treadonly error: SchemaValidationUnavailableError;\n\t\t\treadonly ok: false;\n\t };\n\ninterface UnsupportedFeature {\n\treadonly feature: string;\n\treadonly path: readonly (number | string)[];\n}\n\ntype JsonStringParseResult =\n\t| { readonly ok: true; readonly value: unknown }\n\t| { readonly ok: false };\n\nconst normalizableTypeNames = new Set(['array', 'boolean', 'integer', 'number', 'object']);\nconst unsupportedFeatures = new Set([\n\t'contains',\n\t'dependentSchemas',\n\t'else',\n\t'if',\n\t'not',\n\t'then',\n\t'unevaluatedProperties',\n\t'uniqueItems',\n]);\n\nfunction isJsonObject(value: JsonValue): value is JsonObject {\n\treturn typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction isJsonSchemaObject(value: JsonValue | undefined): value is JsonObject {\n\treturn value !== undefined && isJsonObject(value);\n}\n\nfunction findUnsupportedFeature(\n\tvalue: JsonValue,\n\tpath: readonly (number | string)[] = [],\n): UnsupportedFeature | null {\n\tif (Array.isArray(value)) {\n\t\tfor (const [index, childValue] of value.entries()) {\n\t\t\tconst childUnsupported = findUnsupportedFeature(childValue, [...path, index]);\n\t\t\tif (childUnsupported) {\n\t\t\t\treturn childUnsupported;\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t}\n\n\tif (!isJsonObject(value)) {\n\t\treturn null;\n\t}\n\n\tfor (const [key, childValue] of Object.entries(value)) {\n\t\tif (unsupportedFeatures.has(key)) {\n\t\t\treturn { feature: key, path: [...path, key] };\n\t\t}\n\t\tconst childUnsupported = findUnsupportedFeature(childValue, [...path, key]);\n\t\tif (childUnsupported) {\n\t\t\treturn childUnsupported;\n\t\t}\n\t}\n\n\treturn null;\n}\n\nfunction unavailableError(\n\tfeature: string,\n\tpath: readonly (number | string)[],\n): SchemaValidationUnavailableError {\n\treturn {\n\t\tfeature,\n\t\tkind: 'schema_validation_unavailable',\n\t\tmessage: `JSON Schema feature \"${feature}\" is not supported by the portal validator.`,\n\t\tpath,\n\t};\n}\n\nfunction valueAtPath(value: unknown, path: readonly (number | string)[]): unknown {\n\tlet currentValue = value;\n\tfor (const pathPart of path) {\n\t\tif (typeof pathPart === 'number') {\n\t\t\tif (!Array.isArray(currentValue)) {\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t\tcurrentValue = currentValue[pathPart];\n\t\t\tcontinue;\n\t\t}\n\t\tif (!isJsonObjectValue(currentValue)) {\n\t\t\treturn undefined;\n\t\t}\n\t\tcurrentValue = currentValue[pathPart];\n\t}\n\treturn currentValue;\n}\n\nfunction isJsonObjectValue(value: unknown): value is Readonly<Record<string, unknown>> {\n\treturn typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction schemaTypeName(schema: JsonObject): string | undefined {\n\tconst type = schema.type;\n\tif (typeof type === 'string') {\n\t\treturn type;\n\t}\n\tif (!Array.isArray(type)) {\n\t\treturn undefined;\n\t}\n\tconst concreteTypeNames = type.filter(\n\t\t(entry): entry is string => typeof entry === 'string' && entry !== 'null',\n\t);\n\tif (concreteTypeNames.length !== 1) {\n\t\treturn undefined;\n\t}\n\tconst concreteTypeName = concreteTypeNames[0];\n\tif (concreteTypeName === undefined) {\n\t\treturn undefined;\n\t}\n\treturn normalizableTypeNames.has(concreteTypeName) ? concreteTypeName : undefined;\n}\n\nfunction localReferencePath(reference: string): readonly string[] | null {\n\tif (!reference.startsWith('#/')) {\n\t\treturn null;\n\t}\n\treturn reference\n\t\t.slice(2)\n\t\t.split('/')\n\t\t.map((part) => part.replaceAll('~1', '/').replaceAll('~0', '~'));\n}\n\nfunction schemaAtPath(rootSchema: JsonObject, path: readonly string[]): JsonObject | null {\n\tlet currentSchema: JsonValue = rootSchema;\n\tfor (const pathPart of path) {\n\t\tif (!isJsonObject(currentSchema)) {\n\t\t\treturn null;\n\t\t}\n\t\tconst nextSchema: JsonValue | undefined = currentSchema[pathPart];\n\t\tif (nextSchema === undefined) {\n\t\t\treturn null;\n\t\t}\n\t\tcurrentSchema = nextSchema;\n\t}\n\treturn isJsonObject(currentSchema) ? currentSchema : null;\n}\n\nfunction resolveLocalSchemaReference(\n\trootSchema: JsonObject,\n\treference: JsonValue | undefined,\n): JsonObject | null {\n\tif (typeof reference !== 'string') {\n\t\treturn null;\n\t}\n\tconst path = localReferencePath(reference);\n\treturn path === null ? null : schemaAtPath(rootSchema, path);\n}\n\nfunction allOfSchemas(schema: JsonObject): readonly JsonObject[] {\n\tconst allOf = schema.allOf;\n\tif (!Array.isArray(allOf)) {\n\t\treturn [];\n\t}\n\treturn allOf.filter((entry): entry is JsonObject => isJsonObject(entry));\n}\n\nfunction isObjectLikeSchema(schema: JsonObject, type: string | undefined): boolean {\n\treturn (\n\t\ttype === 'object' ||\n\t\tisJsonSchemaObject(schema.properties) ||\n\t\tisJsonSchemaObject(schema.patternProperties) ||\n\t\tisJsonSchemaObject(schema.additionalProperties)\n\t);\n}\n\nfunction isArrayLikeSchema(schema: JsonObject, type: string | undefined): boolean {\n\treturn type === 'array' || Array.isArray(schema.prefixItems) || schema.items !== undefined;\n}\n\nfunction parseJsonString(value: string): JsonStringParseResult {\n\ttry {\n\t\tconst parsedValue: unknown = JSON.parse(value);\n\t\treturn { ok: true, value: parsedValue };\n\t} catch {\n\t\treturn { ok: false };\n\t}\n}\n\nfunction parseStringNumber(value: string, props: { readonly integer: boolean }): number | null {\n\tconst trimmedValue = value.trim();\n\tif (!/^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?(?:e[+-]?\\d+)?$/iu.test(trimmedValue)) {\n\t\treturn null;\n\t}\n\tconst parsedValue = Number(trimmedValue);\n\tif (!Number.isFinite(parsedValue)) {\n\t\treturn null;\n\t}\n\tif (props.integer && !Number.isInteger(parsedValue)) {\n\t\treturn null;\n\t}\n\treturn parsedValue;\n}\n\nfunction parseStringBoolean(value: string): boolean | null {\n\tconst trimmedValue = value.trim();\n\tif (trimmedValue === 'true') {\n\t\treturn true;\n\t}\n\tif (trimmedValue === 'false') {\n\t\treturn false;\n\t}\n\treturn null;\n}\n\nfunction normalizeObjectValueForJsonSchema(\n\tschema: JsonObject,\n\tvalue: Readonly<Record<string, unknown>>,\n\trootSchema: JsonObject,\n): Record<string, unknown> {\n\tconst normalizedValue: Record<string, unknown> = { ...value };\n\tconst properties = schema.properties;\n\tif (isJsonSchemaObject(properties)) {\n\t\tfor (const [propertyName, propertySchema] of Object.entries(properties)) {\n\t\t\tif (propertyName in normalizedValue && isJsonSchemaObject(propertySchema)) {\n\t\t\t\tnormalizedValue[propertyName] = normalizeValueForJsonSchema(\n\t\t\t\t\tpropertySchema,\n\t\t\t\t\tnormalizedValue[propertyName],\n\t\t\t\t\trootSchema,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\tconst patternProperties = schema.patternProperties;\n\tconst matchedPatternProperties = new Set<string>();\n\tif (isJsonSchemaObject(patternProperties)) {\n\t\tfor (const [pattern, patternSchema] of Object.entries(patternProperties)) {\n\t\t\tif (!isJsonSchemaObject(patternSchema)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tlet regex: RegExp;\n\t\t\ttry {\n\t\t\t\tregex = new RegExp(pattern, 'u');\n\t\t\t} catch {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tfor (const propertyName of Object.keys(normalizedValue)) {\n\t\t\t\tif (regex.test(propertyName)) {\n\t\t\t\t\tnormalizedValue[propertyName] = normalizeValueForJsonSchema(\n\t\t\t\t\t\tpatternSchema,\n\t\t\t\t\t\tnormalizedValue[propertyName],\n\t\t\t\t\t\trootSchema,\n\t\t\t\t\t);\n\t\t\t\t\tmatchedPatternProperties.add(propertyName);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tconst additionalProperties = schema.additionalProperties;\n\tif (isJsonSchemaObject(additionalProperties)) {\n\t\tfor (const propertyName of Object.keys(normalizedValue)) {\n\t\t\tif (isJsonSchemaObject(properties) && propertyName in properties) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (matchedPatternProperties.has(propertyName)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tnormalizedValue[propertyName] = normalizeValueForJsonSchema(\n\t\t\t\tadditionalProperties,\n\t\t\t\tnormalizedValue[propertyName],\n\t\t\t\trootSchema,\n\t\t\t);\n\t\t}\n\t}\n\n\treturn normalizedValue;\n}\n\nfunction normalizeArrayValueForJsonSchema(\n\tschema: JsonObject,\n\tvalue: readonly unknown[],\n\trootSchema: JsonObject,\n): readonly unknown[] {\n\tconst items = schema.items;\n\tconst prefixItems = schema.prefixItems;\n\tif (Array.isArray(prefixItems)) {\n\t\treturn value.map((entry, index) => {\n\t\t\tconst itemSchema = prefixItems[index];\n\t\t\tif (isJsonSchemaObject(itemSchema)) {\n\t\t\t\treturn normalizeValueForJsonSchema(itemSchema, entry, rootSchema);\n\t\t\t}\n\t\t\tif (isJsonSchemaObject(items)) {\n\t\t\t\treturn normalizeValueForJsonSchema(items, entry, rootSchema);\n\t\t\t}\n\t\t\treturn entry;\n\t\t});\n\t}\n\n\tif (Array.isArray(items)) {\n\t\treturn value.map((entry, index) => {\n\t\t\tconst itemSchema = items[index];\n\t\t\treturn isJsonSchemaObject(itemSchema)\n\t\t\t\t? normalizeValueForJsonSchema(itemSchema, entry, rootSchema)\n\t\t\t\t: entry;\n\t\t});\n\t}\n\tif (isJsonSchemaObject(items)) {\n\t\treturn value.map((entry) => normalizeValueForJsonSchema(items, entry, rootSchema));\n\t}\n\treturn value;\n}\n\nfunction normalizeValueForJsonSchema(\n\tschema: JsonObject,\n\tvalue: unknown,\n\trootSchema: JsonObject = schema,\n): unknown {\n\tconst referencedSchema = resolveLocalSchemaReference(rootSchema, schema.$ref);\n\tif (referencedSchema !== null) {\n\t\treturn normalizeValueForJsonSchema(referencedSchema, value, rootSchema);\n\t}\n\n\tlet normalizedValue = value;\n\tfor (const allOfSchema of allOfSchemas(schema)) {\n\t\tnormalizedValue = normalizeValueForJsonSchema(allOfSchema, normalizedValue, rootSchema);\n\t}\n\n\tconst type = schemaTypeName(schema);\n\tconst isObjectLike = isObjectLikeSchema(schema, type);\n\tconst isArrayLike = isArrayLikeSchema(schema, type);\n\tif ((type === 'number' || type === 'integer') && typeof normalizedValue === 'string') {\n\t\treturn parseStringNumber(normalizedValue, { integer: type === 'integer' }) ?? normalizedValue;\n\t}\n\tif (type === 'boolean' && typeof normalizedValue === 'string') {\n\t\treturn parseStringBoolean(normalizedValue) ?? normalizedValue;\n\t}\n\n\tif ((isObjectLike || isArrayLike) && typeof normalizedValue === 'string') {\n\t\tconst parsedValue = parseJsonString(normalizedValue);\n\t\tif (\n\t\t\tparsedValue.ok &&\n\t\t\t((isObjectLike && isJsonObjectValue(parsedValue.value)) ||\n\t\t\t\t(isArrayLike && Array.isArray(parsedValue.value)))\n\t\t) {\n\t\t\tnormalizedValue = parsedValue.value;\n\t\t}\n\t}\n\n\tif (isObjectLike && isJsonObjectValue(normalizedValue)) {\n\t\treturn normalizeObjectValueForJsonSchema(schema, normalizedValue, rootSchema);\n\t}\n\tif (isArrayLike && Array.isArray(normalizedValue)) {\n\t\treturn normalizeArrayValueForJsonSchema(schema, normalizedValue, rootSchema);\n\t}\n\treturn normalizedValue;\n}\n\nfunction jsonTypeName(value: unknown): string {\n\tif (value === undefined) {\n\t\treturn 'undefined';\n\t}\n\tif (value === null) {\n\t\treturn 'null';\n\t}\n\tif (Array.isArray(value)) {\n\t\treturn 'array';\n\t}\n\treturn typeof value;\n}\n\nfunction jsonValuePreview(value: unknown): string | undefined {\n\tif (value === undefined) {\n\t\treturn undefined;\n\t}\n\tif (typeof value === 'string') {\n\t\treturn value.length > 80 ? `${value.slice(0, 77)}...` : value;\n\t}\n\tif (typeof value === 'number' || typeof value === 'boolean' || value === null) {\n\t\treturn String(value);\n\t}\n\tconst serialized = JSON.stringify(value);\n\tif (serialized === undefined) {\n\t\treturn undefined;\n\t}\n\treturn serialized.length > 80 ? `${serialized.slice(0, 77)}...` : serialized;\n}\n\nfunction keysFromIssue(issue: z.core.$ZodIssue): readonly string[] | undefined {\n\tif (!('keys' in issue)) {\n\t\treturn undefined;\n\t}\n\tconst value = issue.keys;\n\tif (!Array.isArray(value) || !value.every((entry) => typeof entry === 'string')) {\n\t\treturn undefined;\n\t}\n\treturn value;\n}\n\nfunction valuesFromIssue(issue: z.core.$ZodIssue): readonly JsonValue[] | undefined {\n\tif (!('values' in issue)) {\n\t\treturn undefined;\n\t}\n\tconst value: unknown = issue.values;\n\tif (!Array.isArray(value)) {\n\t\treturn undefined;\n\t}\n\tconst values: JsonValue[] = [];\n\tfor (const entry of value) {\n\t\tif (!isJsonValue(entry)) {\n\t\t\treturn undefined;\n\t\t}\n\t\tvalues.push(entry);\n\t}\n\treturn values;\n}\n\nfunction isJsonValue(value: unknown): value is JsonValue {\n\treturn (\n\t\tvalue === null ||\n\t\ttypeof value === 'string' ||\n\t\ttypeof value === 'number' ||\n\t\ttypeof value === 'boolean' ||\n\t\t(Array.isArray(value) && value.every((entry) => isJsonValue(entry))) ||\n\t\t(isJsonObjectValue(value) && Object.values(value).every((entry) => isJsonValue(entry)))\n\t);\n}\n\nfunction expectedFromIssue(issue: z.core.$ZodIssue): string | undefined {\n\tif (!('expected' in issue)) {\n\t\treturn undefined;\n\t}\n\tconst expected = issue.expected;\n\treturn typeof expected === 'string' ? expected : undefined;\n}\n\nfunction toValidationIssue(issue: z.core.$ZodIssue, inputValue: unknown): InputValidationIssue {\n\tconst path = issue.path.map((pathPart) =>\n\t\ttypeof pathPart === 'symbol' ? String(pathPart) : pathPart,\n\t);\n\tconst receivedValue = valueAtPath(inputValue, path);\n\tconst preview = jsonValuePreview(receivedValue);\n\tconst result: InputValidationIssue = {\n\t\tcode: issue.code,\n\t\tmessage: issue.message,\n\t\tpath,\n\t\treceived: {\n\t\t\ttype: jsonTypeName(receivedValue),\n\t\t\t...(preview === undefined ? {} : { preview }),\n\t\t},\n\t};\n\tconst expected = expectedFromIssue(issue);\n\tconst keys = keysFromIssue(issue);\n\tconst values = valuesFromIssue(issue);\n\treturn {\n\t\t...result,\n\t\t...(expected === undefined ? {} : { expected }),\n\t\t...(keys === undefined ? {} : { keys }),\n\t\t...(values === undefined ? {} : { values }),\n\t};\n}\n\nexport function buildZodValidatorFromJsonSchema(jsonSchema: JsonObject): BuiltZodValidator {\n\tconst unsupported = findUnsupportedFeature(jsonSchema);\n\tif (unsupported) {\n\t\treturn {\n\t\t\terror: unavailableError(unsupported.feature, unsupported.path),\n\t\t\tok: false,\n\t\t};\n\t}\n\n\ttry {\n\t\tconst zodSchema = z.fromJSONSchema(jsonSchema);\n\n\t\treturn {\n\t\t\tok: true,\n\t\t\tvalidate(value: unknown): PortalValidationResult {\n\t\t\t\tconst normalizedValue = normalizeValueForJsonSchema(jsonSchema, value);\n\t\t\t\tconst parsed = zodSchema.safeParse(normalizedValue);\n\t\t\t\tif (parsed.success) {\n\t\t\t\t\treturn { ok: true, value: parsed.data };\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\terror: {\n\t\t\t\t\t\tkind: 'input_validation',\n\t\t\t\t\t\tissues: parsed.error.issues.map((issue) => toValidationIssue(issue, normalizedValue)),\n\t\t\t\t\t},\n\t\t\t\t\tok: false,\n\t\t\t\t};\n\t\t\t},\n\t\t};\n\t} catch (error) {\n\t\treturn {\n\t\t\terror: {\n\t\t\t\tfeature: 'conversion_failed',\n\t\t\t\tkind: 'schema_validation_unavailable',\n\t\t\t\tmessage: error instanceof Error ? error.message : String(error),\n\t\t\t\tpath: [],\n\t\t\t},\n\t\t\tok: false,\n\t\t};\n\t}\n}\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agent-vm/mcp-portal",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.95",
|
|
4
4
|
"description": "Agent-scoped MCP Portal server and TypeScript helpers for composable upstream MCP tools.",
|
|
5
5
|
"homepage": "https://github.com/ShravanSunder/agent-vm#readme",
|
|
6
6
|
"bugs": {
|
|
@@ -69,8 +69,8 @@
|
|
|
69
69
|
"@modelcontextprotocol/sdk": "^1.29.0",
|
|
70
70
|
"hono": "^4.12.18",
|
|
71
71
|
"zod": "^4.4.3",
|
|
72
|
-
"@agent-vm/config-contracts": "0.0.
|
|
73
|
-
"@agent-vm/secret-management": "0.0.
|
|
72
|
+
"@agent-vm/config-contracts": "0.0.95",
|
|
73
|
+
"@agent-vm/secret-management": "0.0.95"
|
|
74
74
|
},
|
|
75
75
|
"devDependencies": {
|
|
76
76
|
"vitest": "^4.1.5"
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"serve-command-4BNOH14H.js","names":["createOnePasswordSecretResolver"],"sources":["../src/bin/secret-value-resolver.ts","../src/cli/serve-command.ts"],"sourcesContent":["import type { SecretValue } from '@agent-vm/config-contracts';\nimport type { SecretRef, SecretResolver } from '@agent-vm/secret-management';\n\nexport interface ResolveSecretValueProps {\n\treadonly env: Readonly<Record<string, string | undefined>>;\n\treadonly secretResolver?: SecretResolver;\n}\n\nfunction secretRefFromSecretValue(secret: SecretValue): SecretRef {\n\tif (secret.source === 'environment') {\n\t\treturn { ref: secret.name, source: 'environment' };\n\t}\n\treturn { ref: secret.ref, source: '1password' };\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\tif (props.secretResolver === undefined) {\n\t\tthrow new Error(\"Secret with source '1password' requires a configured secret resolver.\");\n\t}\n\treturn await props.secretResolver.resolve(secretRefFromSecretValue(secret));\n}\n","import { createHmac } from 'node:crypto';\nimport { join } from 'node:path';\nimport { parseArgs } from 'node:util';\n\nimport {\n\tloadMcpConfig,\n\tloadMcpPortalConfig,\n\tresolveMcpPortalProfile,\n\ttype McpPortalAgentConfig,\n\ttype McpPortalConfig,\n\ttype McpPortalExternalAuthConfig,\n\ttype McpPortalProxyConfig,\n\ttype ResolvedMcpPortalProfile,\n\ttype SecretValue,\n} from '@agent-vm/config-contracts';\nimport {\n\tcreateCompositeSecretResolver,\n\tcreateSecretResolver as createOnePasswordSecretResolver,\n\tresolveServiceAccountToken,\n\ttype SecretResolver,\n\ttype TokenSource,\n} from '@agent-vm/secret-management';\nimport { serve } from '@hono/node-server';\n\nimport { resolveSecretValue } from '../bin/secret-value-resolver.js';\nimport { createPortalCore } from '../core/portal-core.js';\nimport { resolveUpstreamServers } from '../core/provider-runtime.js';\nimport { createPortalHttpApp, type PortalHttpAuditEvent } from '../mcp-proxy/portal-http-server.js';\nimport {\n\tcreatePortalAgentRuntimeRecords,\n\tcreatePortalApprovalVerifier,\n\tcreatePortalHttpAgentResolver,\n\ttype PortalApprovalAuditEvent,\n} from '../mcp-proxy/resolve-agent-identity.js';\nimport type { PortalToolSelector } from '../portal-access-policy.js';\nimport { decodePortalMasterKey } from '../portal-auth/agent-bearer-token.js';\nimport { createUpstreamMcpClientRuntime } from '../upstream-mcp-client-runtime.js';\n\ntype PortalNodeServer = ReturnType<typeof serve>;\ntype PortalServeFunction = typeof serve;\n\nexport type PortalServerLogEvent =\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\t| {\n\t\t\treadonly agentId: string;\n\t\t\treadonly clientAddress: string;\n\t\t\treadonly decision: PortalHttpAuditEvent['decision'];\n\t\t\treadonly event: 'mcp_proxy_auth';\n\t\t\treadonly level: 'info' | 'warn';\n\t\t\treadonly reason?: PortalHttpAuditEvent['reason'];\n\t\t\treadonly timeMs: number;\n\t }\n\t| {\n\t\t\treadonly agentId: string;\n\t\t\treadonly clientAddress: string;\n\t\t\treadonly event: 'mcp_proxy_auth_audit_error';\n\t\t\treadonly level: 'warn';\n\t\t\treadonly message: string;\n\t\t\treadonly timeMs: number;\n\t }\n\t| {\n\t\t\treadonly agentId: string;\n\t\t\treadonly decision: PortalApprovalAuditEvent['decision'];\n\t\t\treadonly event: 'mcp_portal_approval';\n\t\t\treadonly level: 'info' | 'warn';\n\t\t\treadonly reason?: PortalApprovalAuditEvent['reason'];\n\t\t\treadonly timeMs: number;\n\t\t\treadonly verifierReason?: string;\n\t }\n\t| {\n\t\t\treadonly agentId: string;\n\t\t\treadonly event: 'mcp_portal_approval_audit_error';\n\t\t\treadonly level: 'warn';\n\t\t\treadonly message: string;\n\t\t\treadonly timeMs: number;\n\t }\n\t| {\n\t\t\treadonly agentScopeId: string;\n\t\t\treadonly event: 'upstream_close_error';\n\t\t\treadonly level: 'warn';\n\t\t\treadonly message: string;\n\t\t\treadonly namespace?: 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\nexport interface CreateServeSecretResolverDependencies {\n\treadonly createOnePasswordSecretResolver?: typeof createOnePasswordSecretResolver;\n\treadonly resolveServiceAccountToken?: typeof resolveServiceAccountToken;\n}\n\nfunction requirePortalTokenSourceValue(\n\tenv: Readonly<Record<string, string | undefined>>,\n\tname: string,\n\tsourceType: string,\n): string {\n\tconst value = env[name]?.trim();\n\tif (value === undefined || value.length === 0) {\n\t\tthrow new Error(`${name} is required when AGENT_VM_MCP_PORTAL_OP_TOKEN_SOURCE=${sourceType}.`);\n\t}\n\treturn value;\n}\n\nfunction readPortalOnePasswordTokenSource(\n\tenv: Readonly<Record<string, string | undefined>>,\n): TokenSource | null {\n\tconst sourceType = env.AGENT_VM_MCP_PORTAL_OP_TOKEN_SOURCE?.trim();\n\tif (sourceType === undefined || sourceType.length === 0) {\n\t\tconst configuredEnvVar = env.AGENT_VM_MCP_PORTAL_OP_TOKEN_ENV_VAR?.trim();\n\t\tconst envVar =\n\t\t\tconfiguredEnvVar === undefined || configuredEnvVar.length === 0\n\t\t\t\t? 'OP_SERVICE_ACCOUNT_TOKEN'\n\t\t\t\t: configuredEnvVar;\n\t\tconst token = env[envVar]?.trim();\n\t\treturn token === undefined || token.length === 0 ? null : { envVar, type: 'env' };\n\t}\n\n\tif (sourceType === 'env') {\n\t\treturn {\n\t\t\tenvVar: requirePortalTokenSourceValue(\n\t\t\t\tenv,\n\t\t\t\t'AGENT_VM_MCP_PORTAL_OP_TOKEN_ENV_VAR',\n\t\t\t\tsourceType,\n\t\t\t),\n\t\t\ttype: 'env',\n\t\t};\n\t}\n\tif (sourceType === 'op-cli') {\n\t\treturn {\n\t\t\tref: requirePortalTokenSourceValue(env, 'AGENT_VM_MCP_PORTAL_OP_TOKEN_REF', sourceType),\n\t\t\ttype: 'op-cli',\n\t\t};\n\t}\n\tif (sourceType === 'keychain') {\n\t\treturn {\n\t\t\taccount: requirePortalTokenSourceValue(\n\t\t\t\tenv,\n\t\t\t\t'AGENT_VM_MCP_PORTAL_OP_TOKEN_KEYCHAIN_ACCOUNT',\n\t\t\t\tsourceType,\n\t\t\t),\n\t\t\tservice: requirePortalTokenSourceValue(\n\t\t\t\tenv,\n\t\t\t\t'AGENT_VM_MCP_PORTAL_OP_TOKEN_KEYCHAIN_SERVICE',\n\t\t\t\tsourceType,\n\t\t\t),\n\t\t\ttype: 'keychain',\n\t\t};\n\t}\n\n\tthrow new Error(`Unsupported AGENT_VM_MCP_PORTAL_OP_TOKEN_SOURCE \"${sourceType}\".`);\n}\n\nasync function resolvePortalServiceAccountToken(props: {\n\treadonly env: Readonly<Record<string, string | undefined>>;\n\treadonly resolveToken: typeof resolveServiceAccountToken;\n\treadonly tokenSource: TokenSource;\n}): Promise<string> {\n\tif (props.tokenSource.type !== 'env') {\n\t\treturn await props.resolveToken(props.tokenSource);\n\t}\n\tconst envVar = props.tokenSource.envVar ?? 'OP_SERVICE_ACCOUNT_TOKEN';\n\tconst token = props.env[envVar]?.trim();\n\tif (token === undefined || token.length === 0) {\n\t\tthrow new Error(`Environment variable ${envVar} is not set`);\n\t}\n\treturn token;\n}\n\nexport async function createServeSecretResolver(\n\tenv: Readonly<Record<string, string | undefined>>,\n\tdependencies: CreateServeSecretResolverDependencies = {},\n): Promise<SecretResolver> {\n\tconst tokenSource = readPortalOnePasswordTokenSource(env);\n\tconst resolveToken = dependencies.resolveServiceAccountToken ?? resolveServiceAccountToken;\n\tconst createResolver =\n\t\tdependencies.createOnePasswordSecretResolver ?? createOnePasswordSecretResolver;\n\tconst onePasswordResolver =\n\t\ttokenSource === null\n\t\t\t? null\n\t\t\t: await createResolver({\n\t\t\t\t\tserviceAccountToken: await resolvePortalServiceAccountToken({\n\t\t\t\t\t\tenv,\n\t\t\t\t\t\tresolveToken,\n\t\t\t\t\t\ttokenSource,\n\t\t\t\t\t}),\n\t\t\t\t});\n\treturn createCompositeSecretResolver(onePasswordResolver, env);\n}\n\nexport interface ProfilePolicyMaps {\n\treadonly enabledNamespacesByAgent: Readonly<Record<string, readonly string[]>>;\n\treadonly enabledToolsByNamespaceByAgent: Readonly<\n\t\tRecord<string, Readonly<Record<string, readonly string[]>>>\n\t>;\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\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\nexport function buildProfilePolicyMaps(\n\tportalConfig: McpPortalConfig,\n): ProfilePolicyMaps & { readonly cacheTtlMs: number } {\n\tconst enabledNamespacesByAgent: Record<string, readonly string[]> = {};\n\tconst enabledToolsByNamespaceByAgent: Record<\n\t\tstring,\n\t\tReadonly<Record<string, readonly string[]>>\n\t> = {};\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\tenabledToolsByNamespaceByAgent[agentId] = 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\tenabledToolsByNamespaceByAgent,\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\nfunction requireProxyConfig(portalConfig: McpPortalConfig): {\n\treadonly externalAuth: McpPortalExternalAuthConfig;\n\treadonly mcpProxy: McpPortalProxyConfig;\n} {\n\tif (portalConfig.externalAuth === undefined || portalConfig.mcpProxy === undefined) {\n\t\tthrow new Error(\n\t\t\t'mcp-proxy startup requires mcp-portal.config.jsonc externalAuth.masterKey and mcpProxy settings.',\n\t\t);\n\t}\n\treturn {\n\t\texternalAuth: portalConfig.externalAuth,\n\t\tmcpProxy: portalConfig.mcpProxy,\n\t};\n}\n\nexport function deriveApprovalHmacKeysFromMasterKey(props: {\n\treadonly agentIds: readonly string[];\n\treadonly masterKey: Buffer;\n}): ReadonlyMap<string, Buffer> {\n\treturn new Map(\n\t\tprops.agentIds.map((agentId) => [\n\t\t\tagentId,\n\t\t\tcreateHmac('sha256', props.masterKey).update(`mcp-portal:approval-agent:${agentId}`).digest(),\n\t\t]),\n\t);\n}\n\nfunction credentialVersionsByAgent(\n\tportalConfig: McpPortalConfig,\n): Readonly<Record<string, number>> {\n\treturn Object.fromEntries(\n\t\tObject.entries(portalConfig.agents).map(([agentId, agent]) => [\n\t\t\tagentId,\n\t\t\tagent.credentialVersion,\n\t\t]),\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\tlet defaultSecretResolverPromise: Promise<SecretResolver> | undefined;\n\tconst getDefaultSecretResolver = (): Promise<SecretResolver> => {\n\t\tdefaultSecretResolverPromise ??= createServeSecretResolver(props.env);\n\t\treturn defaultSecretResolverPromise;\n\t};\n\tconst resolveSecret =\n\t\tprops.resolveSecret ??\n\t\t(async (secret: SecretValue) =>\n\t\t\tresolveSecretValue(secret, {\n\t\t\t\tenv: props.env,\n\t\t\t\tsecretResolver: await getDefaultSecretResolver(),\n\t\t\t}));\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 proxyStartup = requireProxyConfig(portalConfig);\n\tconst masterKey = decodePortalMasterKey(await resolveSecret(proxyStartup.externalAuth.masterKey));\n\tconst hmacKeys = deriveApprovalHmacKeysFromMasterKey({\n\t\tagentIds: Object.keys(portalConfig.agents),\n\t\tmasterKey,\n\t});\n\tconst agentRecords = createPortalAgentRuntimeRecords({ hmacKeys, portalConfig });\n\tconst upstreamServers = await resolveUpstreamServers({ config: mcpConfig, resolveSecret });\n\tconst upstreamRuntime = createUpstreamMcpClientRuntime({\n\t\tadditionalRedactionValues: [masterKey.toString('base64url')],\n\t\tonCloseError: (error, context) => {\n\t\t\tlogger.log({\n\t\t\t\tagentScopeId: context.agentScopeId,\n\t\t\t\tevent: 'upstream_close_error',\n\t\t\t\tlevel: 'warn',\n\t\t\t\tmessage: error.message,\n\t\t\t\t...(context.namespace === undefined ? {} : { namespace: context.namespace }),\n\t\t\t});\n\t\t},\n\t\tservers: upstreamServers,\n\t});\n\tconst profilePolicyMaps = buildProfilePolicyMaps(portalConfig);\n\tconst verifyApproval = createPortalApprovalVerifier({\n\t\tauditErrorSink: (error, event) => {\n\t\t\tlogger.log({\n\t\t\t\tagentId: event.agentId,\n\t\t\t\tevent: 'mcp_portal_approval_audit_error',\n\t\t\t\tlevel: 'warn',\n\t\t\t\tmessage: error.message,\n\t\t\t\ttimeMs: event.timeMs,\n\t\t\t});\n\t\t},\n\t\tauditSink: (event) => {\n\t\t\tlogger.log({\n\t\t\t\tagentId: event.agentId,\n\t\t\t\tdecision: event.decision,\n\t\t\t\tevent: 'mcp_portal_approval',\n\t\t\t\tlevel: event.decision === 'allow' ? 'info' : 'warn',\n\t\t\t\t...('reason' in event ? { reason: event.reason } : {}),\n\t\t\t\ttimeMs: event.timeMs,\n\t\t\t\t...('verifierReason' in event ? { verifierReason: event.verifierReason } : {}),\n\t\t\t});\n\t\t},\n\t\trecords: agentRecords,\n\t});\n\tconst core = createPortalCore({\n\t\taccessPolicy: {\n\t\t\tdefaultPolicy: 'deny-all',\n\t\t\tenabledNamespacesByAgent: profilePolicyMaps.enabledNamespacesByAgent,\n\t\t\tenabledToolsByNamespaceByAgent: profilePolicyMaps.enabledToolsByNamespaceByAgent,\n\t\t\thiddenToolsByAgent: profilePolicyMaps.hiddenToolsByAgent,\n\t\t},\n\t\tapproval: (calls, identity, approvalToken) =>\n\t\t\tverifyApproval(calls, identity.agentId, approvalToken),\n\t\tcatalogTtlMs: profilePolicyMaps.cacheTtlMs,\n\t\truntime: {\n\t\t\t...upstreamRuntime,\n\t\t\tcallUpstreamTool: upstreamRuntime.callTool,\n\t\t},\n\t\tupstreamNamespaces: upstreamServers.map((server) => server.namespace),\n\t});\n\tconst app = createPortalHttpApp({\n\t\tagentBearerAuth: {\n\t\t\tauthorizationHeaderName: proxyStartup.mcpProxy.auth.headerName,\n\t\t\tcredentialVersionsByAgent: credentialVersionsByAgent(portalConfig),\n\t\t\tmasterKey,\n\t\t},\n\t\tauditSink: (event) => {\n\t\t\tlogger.log({\n\t\t\t\tagentId: event.agentId,\n\t\t\t\tclientAddress: event.clientAddress,\n\t\t\t\tdecision: event.decision,\n\t\t\t\tevent: 'mcp_proxy_auth',\n\t\t\t\tlevel: event.decision === 'allow' ? 'info' : 'warn',\n\t\t\t\t...(event.reason === undefined ? {} : { reason: event.reason }),\n\t\t\t\ttimeMs: event.timeMs,\n\t\t\t});\n\t\t},\n\t\tauditErrorSink: (error, event) => {\n\t\t\tlogger.log({\n\t\t\t\tagentId: event.agentId,\n\t\t\t\tclientAddress: event.clientAddress,\n\t\t\t\tevent: 'mcp_proxy_auth_audit_error',\n\t\t\t\tlevel: 'warn',\n\t\t\t\tmessage: error.message,\n\t\t\t\ttimeMs: event.timeMs,\n\t\t\t});\n\t\t},\n\t\tcore,\n\t\tonSessionClosed: async (identity) => {\n\t\t\tawait core.invalidateSession(identity);\n\t\t},\n\t\tregisteredAgentIds: Object.keys(portalConfig.agents),\n\t\tresolveAgentIdentity: createPortalHttpAgentResolver(agentRecords),\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: proxyStartup.mcpProxy.server.host,\n\t\t\tport: props.args.port ?? proxyStartup.mcpProxy.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 core.close();\n\t\t\tawait closeNodeServer(server);\n\t\t},\n\t\tport,\n\t};\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"zod-schema-loader-C3I-MnWq.js","names":["isJsonObject"],"sources":["../src/json-schema.ts","../src/catalog-types.ts","../src/tool-ref.ts","../src/zod-schema-loader.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 { z } from 'zod';\n\nimport type { JsonObject, JsonValue } from './json-schema.js';\n\nexport interface InputValidationIssue {\n\treadonly code: string;\n\treadonly expected?: string;\n\treadonly keys?: readonly string[];\n\treadonly message: string;\n\treadonly path: readonly (number | string)[];\n\treadonly received?: {\n\t\treadonly preview?: string;\n\t\treadonly type: string;\n\t};\n\treadonly values?: readonly JsonValue[];\n}\n\nexport interface InputValidationError {\n\treadonly kind: 'input_validation';\n\treadonly issues: readonly InputValidationIssue[];\n}\n\nexport interface SchemaValidationUnavailableError {\n\treadonly feature: string;\n\treadonly kind: 'schema_validation_unavailable';\n\treadonly message: string;\n\treadonly path: readonly (number | string)[];\n}\n\nexport type PortalValidationResult =\n\t| { readonly ok: true; readonly value: unknown }\n\t| { readonly error: InputValidationError; readonly ok: false };\n\nexport type BuiltZodValidator =\n\t| {\n\t\t\treadonly ok: true;\n\t\t\treadonly validate: (value: unknown) => PortalValidationResult;\n\t }\n\t| {\n\t\t\treadonly error: SchemaValidationUnavailableError;\n\t\t\treadonly ok: false;\n\t };\n\ninterface UnsupportedFeature {\n\treadonly feature: string;\n\treadonly path: readonly (number | string)[];\n}\n\nconst unsupportedFeatures = new Set([\n\t'contains',\n\t'dependentSchemas',\n\t'else',\n\t'if',\n\t'not',\n\t'then',\n\t'unevaluatedProperties',\n\t'uniqueItems',\n]);\n\nfunction isJsonObject(value: JsonValue): value is JsonObject {\n\treturn typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction findUnsupportedFeature(\n\tvalue: JsonValue,\n\tpath: readonly (number | string)[] = [],\n): UnsupportedFeature | null {\n\tif (Array.isArray(value)) {\n\t\tfor (const [index, childValue] of value.entries()) {\n\t\t\tconst childUnsupported = findUnsupportedFeature(childValue, [...path, index]);\n\t\t\tif (childUnsupported) {\n\t\t\t\treturn childUnsupported;\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t}\n\n\tif (!isJsonObject(value)) {\n\t\treturn null;\n\t}\n\n\tfor (const [key, childValue] of Object.entries(value)) {\n\t\tif (unsupportedFeatures.has(key)) {\n\t\t\treturn { feature: key, path: [...path, key] };\n\t\t}\n\t\tconst childUnsupported = findUnsupportedFeature(childValue, [...path, key]);\n\t\tif (childUnsupported) {\n\t\t\treturn childUnsupported;\n\t\t}\n\t}\n\n\treturn null;\n}\n\nfunction unavailableError(\n\tfeature: string,\n\tpath: readonly (number | string)[],\n): SchemaValidationUnavailableError {\n\treturn {\n\t\tfeature,\n\t\tkind: 'schema_validation_unavailable',\n\t\tmessage: `JSON Schema feature \"${feature}\" is not supported by the portal validator.`,\n\t\tpath,\n\t};\n}\n\nfunction valueAtPath(value: unknown, path: readonly (number | string)[]): unknown {\n\tlet currentValue = value;\n\tfor (const pathPart of path) {\n\t\tif (typeof pathPart === 'number') {\n\t\t\tif (!Array.isArray(currentValue)) {\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t\tcurrentValue = currentValue[pathPart];\n\t\t\tcontinue;\n\t\t}\n\t\tif (!isJsonObjectValue(currentValue)) {\n\t\t\treturn undefined;\n\t\t}\n\t\tcurrentValue = currentValue[pathPart];\n\t}\n\treturn currentValue;\n}\n\nfunction isJsonObjectValue(value: unknown): value is Readonly<Record<string, unknown>> {\n\treturn typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction jsonTypeName(value: unknown): string {\n\tif (value === undefined) {\n\t\treturn 'undefined';\n\t}\n\tif (value === null) {\n\t\treturn 'null';\n\t}\n\tif (Array.isArray(value)) {\n\t\treturn 'array';\n\t}\n\treturn typeof value;\n}\n\nfunction jsonValuePreview(value: unknown): string | undefined {\n\tif (value === undefined) {\n\t\treturn undefined;\n\t}\n\tif (typeof value === 'string') {\n\t\treturn value.length > 80 ? `${value.slice(0, 77)}...` : value;\n\t}\n\tif (typeof value === 'number' || typeof value === 'boolean' || value === null) {\n\t\treturn String(value);\n\t}\n\tconst serialized = JSON.stringify(value);\n\tif (serialized === undefined) {\n\t\treturn undefined;\n\t}\n\treturn serialized.length > 80 ? `${serialized.slice(0, 77)}...` : serialized;\n}\n\nfunction keysFromIssue(issue: z.core.$ZodIssue): readonly string[] | undefined {\n\tif (!('keys' in issue)) {\n\t\treturn undefined;\n\t}\n\tconst value = issue.keys;\n\tif (!Array.isArray(value) || !value.every((entry) => typeof entry === 'string')) {\n\t\treturn undefined;\n\t}\n\treturn value;\n}\n\nfunction valuesFromIssue(issue: z.core.$ZodIssue): readonly JsonValue[] | undefined {\n\tif (!('values' in issue)) {\n\t\treturn undefined;\n\t}\n\tconst value: unknown = issue.values;\n\tif (!Array.isArray(value)) {\n\t\treturn undefined;\n\t}\n\tconst values: JsonValue[] = [];\n\tfor (const entry of value) {\n\t\tif (!isJsonValue(entry)) {\n\t\t\treturn undefined;\n\t\t}\n\t\tvalues.push(entry);\n\t}\n\treturn values;\n}\n\nfunction isJsonValue(value: unknown): value is JsonValue {\n\treturn (\n\t\tvalue === null ||\n\t\ttypeof value === 'string' ||\n\t\ttypeof value === 'number' ||\n\t\ttypeof value === 'boolean' ||\n\t\t(Array.isArray(value) && value.every((entry) => isJsonValue(entry))) ||\n\t\t(isJsonObjectValue(value) && Object.values(value).every((entry) => isJsonValue(entry)))\n\t);\n}\n\nfunction expectedFromIssue(issue: z.core.$ZodIssue): string | undefined {\n\tif (!('expected' in issue)) {\n\t\treturn undefined;\n\t}\n\tconst expected = issue.expected;\n\treturn typeof expected === 'string' ? expected : undefined;\n}\n\nfunction toValidationIssue(issue: z.core.$ZodIssue, inputValue: unknown): InputValidationIssue {\n\tconst path = issue.path.map((pathPart) =>\n\t\ttypeof pathPart === 'symbol' ? String(pathPart) : pathPart,\n\t);\n\tconst receivedValue = valueAtPath(inputValue, path);\n\tconst preview = jsonValuePreview(receivedValue);\n\tconst result: InputValidationIssue = {\n\t\tcode: issue.code,\n\t\tmessage: issue.message,\n\t\tpath,\n\t\treceived: {\n\t\t\ttype: jsonTypeName(receivedValue),\n\t\t\t...(preview === undefined ? {} : { preview }),\n\t\t},\n\t};\n\tconst expected = expectedFromIssue(issue);\n\tconst keys = keysFromIssue(issue);\n\tconst values = valuesFromIssue(issue);\n\treturn {\n\t\t...result,\n\t\t...(expected === undefined ? {} : { expected }),\n\t\t...(keys === undefined ? {} : { keys }),\n\t\t...(values === undefined ? {} : { values }),\n\t};\n}\n\nexport function buildZodValidatorFromJsonSchema(jsonSchema: JsonObject): BuiltZodValidator {\n\tconst unsupported = findUnsupportedFeature(jsonSchema);\n\tif (unsupported) {\n\t\treturn {\n\t\t\terror: unavailableError(unsupported.feature, unsupported.path),\n\t\t\tok: false,\n\t\t};\n\t}\n\n\ttry {\n\t\tconst zodSchema = z.fromJSONSchema(jsonSchema);\n\n\t\treturn {\n\t\t\tok: true,\n\t\t\tvalidate(value: unknown): PortalValidationResult {\n\t\t\t\tconst parsed = zodSchema.safeParse(value);\n\t\t\t\tif (parsed.success) {\n\t\t\t\t\treturn { ok: true, value: parsed.data };\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\terror: {\n\t\t\t\t\t\tkind: 'input_validation',\n\t\t\t\t\t\tissues: parsed.error.issues.map((issue) => toValidationIssue(issue, value)),\n\t\t\t\t\t},\n\t\t\t\t\tok: false,\n\t\t\t\t};\n\t\t\t},\n\t\t};\n\t} catch (error) {\n\t\treturn {\n\t\t\terror: {\n\t\t\t\tfeature: 'conversion_failed',\n\t\t\t\tkind: 'schema_validation_unavailable',\n\t\t\t\tmessage: error instanceof Error ? error.message : String(error),\n\t\t\t\tpath: [],\n\t\t\t},\n\t\t\tok: false,\n\t\t};\n\t}\n}\n"],"mappings":"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"}
|