Add exact runtime conformance lookup and agent-visible language limits

Add authorized exact-contract lookup, revision-fenced views, generated typed package/browser descriptors, and lifecycle-safe React discovery. Preserve closed generic contracts without competing-conformance policies or new authority grants. Document supported workarounds and privacy boundaries for agent feedback. Publish matching protocol/SDK exports and update scaffold/starter pins; leave the deployed template unchanged.
This commit is contained in:
Timothy J. Aveni
2026-09-17 11:29:56 -07:00
parent 59735c5e38
commit e3501772c5
10 changed files with 378 additions and 55 deletions
+23 -1
View File
@@ -33,6 +33,18 @@ test("React bindings preserve read-only, writable and nested reference contracts
interfaces: [iface.resource.revision],
packages: [pkg.resource.revision],
} as const;
const opaque = structuredClone(iface.resource.revision);
opaque.revisionId = "opaque@1" as typeof opaque.revisionId;
opaque.displayName = "Opaque";
for (const member of opaque.members)
for (const operation of member.operations)
operation.outputType = { kind: "message", descriptorId: "UnsupportedBrowserMessage" };
const withUnusedOpaque = generateReactBindings(
{ ...schema, interfaces: [...schema.interfaces, opaque], packages: [...schema.packages] },
"p@1",
["props"],
);
assert.doesNotMatch(withUnusedOpaque, /"opaque@1": defineReactInterfaceContract/);
const generated = generateReactBindings(
{ ...schema, interfaces: [...schema.interfaces], packages: [...schema.packages] },
"p@1",
@@ -54,8 +66,18 @@ test("React bindings preserve read-only, writable and nested reference contracts
);
await fs.writeFile(
path.join(root, "consumer.ts"),
`import {useLiveField, type ReadableField, type WritableField} from "@quixos/web-studio-react-runtime";
`import {useLiveField, tryConform, type ReadableField, type WritableField} from "@quixos/web-studio-react-runtime";
import {reactInterfaces} from "./react-props.gen.js";
import type {ReactResults} from "./react-props.gen.js";
async function lookup() {
const view = await tryConform("object", reactInterfaces.Fields);
if (!view) return;
await view.call["title.set"]("works");
// @ts-expect-error exact checked setter input
await view.call["title.set"](123);
// @ts-expect-error no invented operation
await view.call["summary.set"]("no setter");
}
declare const props: ReactResults["props"];
const [title, setTitle] = useLiveField(props.fields.fields.title);
setTitle("new");