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:
@@ -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");
|
||||
|
||||
Reference in New Issue
Block a user