fix(mcp): re-emit advertised patterns in a portable regex grammar (#10582)

* test(mcp): check advertised schemas against a portable dialect in every profile

* fix(mcp): re-emit advertised patterns in a portable regex grammar

* fix(mcp): validate advertised dialect by selected profile

* fix(mcp): preserve schema widening through references

* fix(mcp): refuse zero-padded repeat bounds and record host-specific path patterns

* fix(mcp): keep references valid when presentation widens their targets

* fix(mcp): relax references into negations and conditionals presentation may remove

* fix(mcp): keep astral literals and dynamic references widening in every mode

* fix(mcp): omit astral literals and relax untracked references when presentation widens

* fix(mcp): read reference pointers by schema position, not segment spelling

* fix(mcp): protect references into collapsing boolean unions and keep referencing branches out of the collapse

* fix(mcp): omit patterns whose classes name astral characters

* fix(mcp): decide union collapse and pointer protection from canonical branches

* docs(mcp): document non-u astral matching and pin BMP agreement across V8 modes

* test(mcp): expect the advertised base64 schema to omit the unbounded pad-bit probe

* fix(mcp): protect references into unevaluated keywords lost evaluation removes

* fix(mcp): emit stack-safe classes with non-ASCII members and protect draft-07 reference siblings

* fix(mcp): protect references into literal siblings of relaxed draft-07 references
This commit is contained in:
morluto authored and GitHub committed 2026-11-15 17:06:43 +08:00
1 parent 5bf66f7500
commit d0fee4e58e
13 files changed
+1575 -195

No files matched your search

@@ -5,6 +5,7 @@ import { createRequire } from "node:module";
import { expect, it } from "vitest";
import { toolContract } from "../contracts/toolContracts.js";
import { projectPortablePattern } from "../contracts/portablePattern.js";
import { toolOutputSchemaWithMetadata } from "../contracts/toolSchemaMetadata.js";
import { javaScriptRouteCandidateSchema } from "../domain/javascript/javascriptRouteFacts.js";
import { javaScriptInventoryRouteSchema } from "../domain/javascript/javascriptRouteInventory.js";
@@ -47,7 +48,10 @@ it("advertises JavaScript route outputs with standard JSON Schema path constrain
addFormats(ajv);
expect(() => ajv.compile(advertised as AnySchema)).not.toThrow();
// The inventory path is nested inside the advertised complete Evidence branch.
// The inventory path is nested inside the advertised complete Evidence
// branch, re-emitted as a portable anchored pattern.
const portable = projectPortablePattern("^\\/");
expect(portable.kind).toBe("exact");
const patterns: Record<string, unknown>[] = [];
const visit = (value: unknown): void => {
if (value === null || typeof value !== "object") return;
@@ -56,7 +60,11 @@ it("advertises JavaScript route outputs with standard JSON Schema path constrain
return;
}
const record = value as Record<string, unknown>;
if (record.pattern === "^\\/") patterns.push(record);
if (
portable.kind !== "unexpressible" &&
record.pattern === portable.pattern
)
patterns.push(record);
Object.values(record).forEach(visit);
};
visit(advertised);