@mcp-native/a2ui 0.1.0 → 0.3.0
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 +100 -13
- package/dist/binding.d.ts +33 -0
- package/dist/binding.d.ts.map +1 -0
- package/dist/binding.js +83 -0
- package/dist/binding.js.map +1 -0
- package/dist/errors.d.ts +7 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +13 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +9 -12
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -13
- package/dist/index.js.map +1 -1
- package/dist/mime.d.ts +6 -0
- package/dist/mime.d.ts.map +1 -0
- package/dist/mime.js +2 -0
- package/dist/mime.js.map +1 -0
- package/dist/schema-revision.d.ts +3 -0
- package/dist/schema-revision.d.ts.map +1 -0
- package/dist/schema-revision.js +3 -0
- package/dist/schema-revision.js.map +1 -0
- package/dist/v1/action.d.ts +7 -0
- package/dist/v1/action.d.ts.map +1 -0
- package/dist/v1/action.js +86 -0
- package/dist/v1/action.js.map +1 -0
- package/dist/v1/capabilities.d.ts +13 -0
- package/dist/v1/capabilities.d.ts.map +1 -0
- package/dist/v1/capabilities.js +134 -0
- package/dist/v1/capabilities.js.map +1 -0
- package/dist/v1/format-string.d.ts +21 -0
- package/dist/v1/format-string.d.ts.map +1 -0
- package/dist/v1/format-string.js +487 -0
- package/dist/v1/format-string.js.map +1 -0
- package/dist/v1/index.d.ts +13 -0
- package/dist/v1/index.d.ts.map +1 -0
- package/dist/v1/index.js +9 -0
- package/dist/v1/index.js.map +1 -0
- package/dist/v1/parse.d.ts +12 -0
- package/dist/v1/parse.d.ts.map +1 -0
- package/dist/v1/parse.js +96 -0
- package/dist/v1/parse.js.map +1 -0
- package/dist/v1/resolve.d.ts +19 -0
- package/dist/v1/resolve.d.ts.map +1 -0
- package/dist/v1/resolve.js +112 -0
- package/dist/v1/resolve.js.map +1 -0
- package/dist/v1/schemas.d.ts +16 -0
- package/dist/v1/schemas.d.ts.map +1 -0
- package/dist/v1/schemas.js +133 -0
- package/dist/v1/schemas.js.map +1 -0
- package/dist/v1/store.d.ts +21 -0
- package/dist/v1/store.d.ts.map +1 -0
- package/dist/v1/store.js +305 -0
- package/dist/v1/store.js.map +1 -0
- package/dist/v1/types.d.ts +109 -0
- package/dist/v1/types.d.ts.map +1 -0
- package/dist/v1/types.js +10 -0
- package/dist/v1/types.js.map +1 -0
- package/dist/v1/validate.d.ts +26 -0
- package/dist/v1/validate.d.ts.map +1 -0
- package/dist/v1/validate.js +449 -0
- package/dist/v1/validate.js.map +1 -0
- package/dist/v1/vendor/agent_capabilities.json +26 -0
- package/dist/v1/vendor/agent_to_renderer.json +216 -0
- package/dist/v1/vendor/catalog.json +1346 -0
- package/dist/v1/vendor/common_types.json +395 -0
- package/dist/v1/vendor/renderer_capabilities.json +29 -0
- package/dist/v1/vendor/renderer_to_agent.json +161 -0
- package/package.json +5 -2
- package/schemas/7541f953050cd58b80f0bf5d85fe2d63192af305/CHECKSUMS.sha256 +13 -0
- package/schemas/7541f953050cd58b80f0bf5d85fe2d63192af305/PROVENANCE.md +12 -0
- package/schemas/7541f953050cd58b80f0bf5d85fe2d63192af305/catalogs/basic/catalog.json +1346 -0
- package/schemas/7541f953050cd58b80f0bf5d85fe2d63192af305/json/agent_capabilities.json +26 -0
- package/schemas/7541f953050cd58b80f0bf5d85fe2d63192af305/json/agent_to_renderer.json +216 -0
- package/schemas/7541f953050cd58b80f0bf5d85fe2d63192af305/json/agent_to_renderer_list.json +10 -0
- package/schemas/7541f953050cd58b80f0bf5d85fe2d63192af305/json/agent_to_renderer_list_wrapper.json +14 -0
- package/schemas/7541f953050cd58b80f0bf5d85fe2d63192af305/json/catalog_definition.json +267 -0
- package/schemas/7541f953050cd58b80f0bf5d85fe2d63192af305/json/common_types.json +395 -0
- package/schemas/7541f953050cd58b80f0bf5d85fe2d63192af305/json/renderer_capabilities.json +29 -0
- package/schemas/7541f953050cd58b80f0bf5d85fe2d63192af305/json/renderer_data_model.json +22 -0
- package/schemas/7541f953050cd58b80f0bf5d85fe2d63192af305/json/renderer_to_agent.json +161 -0
- package/schemas/7541f953050cd58b80f0bf5d85fe2d63192af305/json/renderer_to_agent_list.json +10 -0
- package/schemas/7541f953050cd58b80f0bf5d85fe2d63192af305/json/renderer_to_agent_list_wrapper.json +14 -0
- package/schemas/7541f953050cd58b80f0bf5d85fe2d63192af305/json/sample.json +22 -0
|
@@ -0,0 +1,449 @@
|
|
|
1
|
+
import { JSON_MAX_VALUES } from "@mcp-native/core";
|
|
2
|
+
import { A2uiParseError } from "../errors.js";
|
|
3
|
+
import basicCatalog from "./vendor/catalog.json" with { type: "json" };
|
|
4
|
+
import { parseA2uiV1FormatString } from "./format-string.js";
|
|
5
|
+
import { parseA2uiV1Envelope } from "./parse.js";
|
|
6
|
+
import { formatAjvErrors, getA2uiV1FunctionCallValidator } from "./schemas.js";
|
|
7
|
+
import { A2UI_V1_MAX_COMPONENTS, A2UI_V1_MAX_SOURCE_LENGTH } from "./types.js";
|
|
8
|
+
export const A2UI_V1_BASIC_CATALOG_ID = "https://a2ui.org/specification/v1_0/catalogs/basic/catalog.json";
|
|
9
|
+
export const A2UI_V1_BASIC_COMPONENT_NAMES = Object.freeze(Object.keys(basicCatalog.components));
|
|
10
|
+
export const A2UI_V1_BASIC_FUNCTION_NAMES = Object.freeze(Object.keys(basicCatalog.functions));
|
|
11
|
+
export const A2UI_V1_SYSTEM_FUNCTION_NAMES = Object.freeze(["@index"]);
|
|
12
|
+
const A2UI_V1_KNOWN_FUNCTION_NAMES = new Set([
|
|
13
|
+
...A2UI_V1_BASIC_FUNCTION_NAMES,
|
|
14
|
+
...A2UI_V1_SYSTEM_FUNCTION_NAMES,
|
|
15
|
+
]);
|
|
16
|
+
/** Creates an explicit host policy for the pinned basic catalog. */
|
|
17
|
+
export function createA2uiV1BasicCatalogPolicy(options) {
|
|
18
|
+
if (options === null || typeof options !== "object" || Array.isArray(options)) {
|
|
19
|
+
throw new A2uiParseError("Expected A2UI basic catalog policy options to be an object");
|
|
20
|
+
}
|
|
21
|
+
return Object.freeze({
|
|
22
|
+
allowedComponentNames: freezeStrings(options.allowedComponentNames, "allowedComponentNames"),
|
|
23
|
+
allowedEventNames: freezeStrings(options.allowedEventNames ?? []),
|
|
24
|
+
allowedFunctionNames: freezeStrings(options.allowedFunctionNames ?? []),
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Validates a complete surface snapshot before it crosses into a renderer.
|
|
29
|
+
* Store snapshots may remain incomplete while ordered lifecycle messages arrive.
|
|
30
|
+
*/
|
|
31
|
+
export function validateA2uiV1SurfaceState(surface, policy) {
|
|
32
|
+
if (policy === null || typeof policy !== "object" || Array.isArray(policy)) {
|
|
33
|
+
throw new A2uiParseError("Expected A2UI surface validation policy to be an object");
|
|
34
|
+
}
|
|
35
|
+
const allowedComponents = parseAllowedNames(policy.allowedComponentNames, "policy.allowedComponentNames", new Set(A2UI_V1_BASIC_COMPONENT_NAMES));
|
|
36
|
+
const allowedEvents = parseAllowedNames(policy.allowedEventNames ?? [], "policy.allowedEventNames");
|
|
37
|
+
const allowedFunctions = parseAllowedNames(policy.allowedFunctionNames ?? [], "policy.allowedFunctionNames", A2UI_V1_KNOWN_FUNCTION_NAMES);
|
|
38
|
+
const validatedSurface = reconstructSurfaceSnapshot(surface);
|
|
39
|
+
validateCatalogId(validatedSurface.catalogId, "surface.catalogId");
|
|
40
|
+
if (!validatedSurface.components.has("root")) {
|
|
41
|
+
throw new A2uiParseError('A complete A2UI surface must define component "root"');
|
|
42
|
+
}
|
|
43
|
+
const edges = new Map();
|
|
44
|
+
for (const [id, component] of validatedSurface.components) {
|
|
45
|
+
if (component.id !== id) {
|
|
46
|
+
throw new A2uiParseError(`A2UI component map key ${JSON.stringify(id)} does not match component id ${JSON.stringify(component.id)}`);
|
|
47
|
+
}
|
|
48
|
+
if (!allowedComponents.has(component.component)) {
|
|
49
|
+
throw new A2uiParseError(`A2UI component ${JSON.stringify(id)} uses host-denied component ${JSON.stringify(component.component)}`);
|
|
50
|
+
}
|
|
51
|
+
validateCatalogId(component.catalogId, `components.${id}.catalogId`);
|
|
52
|
+
edges.set(id, getComponentEdges(component));
|
|
53
|
+
}
|
|
54
|
+
rejectGraphCycles(edges);
|
|
55
|
+
const contexts = collectComponentContexts(edges);
|
|
56
|
+
for (const [parentId, references] of edges) {
|
|
57
|
+
if (!contexts.has(parentId)) {
|
|
58
|
+
continue;
|
|
59
|
+
}
|
|
60
|
+
for (const reference of references) {
|
|
61
|
+
if (!validatedSurface.components.has(reference.id)) {
|
|
62
|
+
throw new A2uiParseError(`A2UI component ${JSON.stringify(parentId)} references missing child ${JSON.stringify(reference.id)}`);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
validateComponentPlacement(validatedSurface.components, edges, contexts);
|
|
67
|
+
const semanticsPolicy = {
|
|
68
|
+
allowedEvents,
|
|
69
|
+
allowedFunctions,
|
|
70
|
+
formatStringExpressionCount: 0,
|
|
71
|
+
formatStringSourceLength: 0,
|
|
72
|
+
};
|
|
73
|
+
for (const [id, component] of validatedSurface.components) {
|
|
74
|
+
const componentContexts = contexts.get(id);
|
|
75
|
+
if (componentContexts === undefined) {
|
|
76
|
+
continue;
|
|
77
|
+
}
|
|
78
|
+
for (const context of componentContexts) {
|
|
79
|
+
validateComponentAction(component, id, context, semanticsPolicy);
|
|
80
|
+
validateSemanticValue(component, `components.${id}`, context, semanticsPolicy);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
return validatedSurface;
|
|
84
|
+
}
|
|
85
|
+
function reconstructSurfaceSnapshot(input) {
|
|
86
|
+
if (input === null || typeof input !== "object" || Array.isArray(input)) {
|
|
87
|
+
throw new A2uiParseError("Expected an A2UI surface snapshot object");
|
|
88
|
+
}
|
|
89
|
+
const prototype = Object.getPrototypeOf(input);
|
|
90
|
+
if (prototype !== Object.prototype && prototype !== null) {
|
|
91
|
+
throw new A2uiParseError("Expected a plain A2UI surface snapshot object");
|
|
92
|
+
}
|
|
93
|
+
const source = input;
|
|
94
|
+
const allowedKeys = new Set([
|
|
95
|
+
"catalogId",
|
|
96
|
+
"components",
|
|
97
|
+
"dataModel",
|
|
98
|
+
"dataModelRevision",
|
|
99
|
+
"metadata",
|
|
100
|
+
"sendDataModel",
|
|
101
|
+
"surfaceId",
|
|
102
|
+
]);
|
|
103
|
+
for (const key of Object.keys(source)) {
|
|
104
|
+
if (!allowedKeys.has(key)) {
|
|
105
|
+
throw new A2uiParseError(`Unexpected A2UI surface snapshot field ${JSON.stringify(key)}`);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
if (!(source.components instanceof Map)) {
|
|
109
|
+
throw new A2uiParseError("Expected a Map at surface.components");
|
|
110
|
+
}
|
|
111
|
+
if (source.components.size > A2UI_V1_MAX_COMPONENTS) {
|
|
112
|
+
throw new A2uiParseError(`A2UI surface exceeds maximum of ${A2UI_V1_MAX_COMPONENTS} components`);
|
|
113
|
+
}
|
|
114
|
+
const dataModelRevision = source.dataModelRevision;
|
|
115
|
+
if (dataModelRevision !== undefined) {
|
|
116
|
+
if (typeof dataModelRevision !== "number" ||
|
|
117
|
+
!Number.isSafeInteger(dataModelRevision) ||
|
|
118
|
+
dataModelRevision < 0) {
|
|
119
|
+
throw new A2uiParseError("Expected a non-negative safe integer at surface.dataModelRevision");
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
const sourceEntries = [...source.components.entries()];
|
|
123
|
+
const createSurface = {
|
|
124
|
+
surfaceId: source.surfaceId,
|
|
125
|
+
sendDataModel: source.sendDataModel,
|
|
126
|
+
dataModel: source.dataModel,
|
|
127
|
+
};
|
|
128
|
+
if (sourceEntries.length > 0) {
|
|
129
|
+
createSurface.components = sourceEntries.map((entry) => entry[1]);
|
|
130
|
+
}
|
|
131
|
+
if (source.catalogId !== undefined) {
|
|
132
|
+
createSurface.catalogId = source.catalogId;
|
|
133
|
+
}
|
|
134
|
+
if (source.metadata !== undefined) {
|
|
135
|
+
createSurface.metadata = source.metadata;
|
|
136
|
+
}
|
|
137
|
+
const envelope = parseA2uiV1Envelope({ version: "v1.0", createSurface });
|
|
138
|
+
if (!("createSurface" in envelope)) {
|
|
139
|
+
throw new A2uiParseError("Expected a validated createSurface snapshot");
|
|
140
|
+
}
|
|
141
|
+
const components = new Map();
|
|
142
|
+
for (const [index, component] of (envelope.createSurface.components ?? []).entries()) {
|
|
143
|
+
const sourceKey = sourceEntries[index]?.[0];
|
|
144
|
+
if (sourceKey !== component.id) {
|
|
145
|
+
throw new A2uiParseError(`A2UI component map key ${JSON.stringify(sourceKey)} does not match component id ${JSON.stringify(component.id)}`);
|
|
146
|
+
}
|
|
147
|
+
if (components.has(component.id)) {
|
|
148
|
+
throw new A2uiParseError(`Duplicate A2UI component id ${JSON.stringify(component.id)} in surface snapshot`);
|
|
149
|
+
}
|
|
150
|
+
components.set(component.id, component);
|
|
151
|
+
}
|
|
152
|
+
return {
|
|
153
|
+
surfaceId: envelope.createSurface.surfaceId,
|
|
154
|
+
...(envelope.createSurface.catalogId === undefined
|
|
155
|
+
? {}
|
|
156
|
+
: { catalogId: envelope.createSurface.catalogId }),
|
|
157
|
+
sendDataModel: envelope.createSurface.sendDataModel === true,
|
|
158
|
+
...(dataModelRevision === undefined ? {} : { dataModelRevision }),
|
|
159
|
+
components,
|
|
160
|
+
dataModel: envelope.createSurface.dataModel ?? {},
|
|
161
|
+
...(envelope.createSurface.metadata === undefined
|
|
162
|
+
? {}
|
|
163
|
+
: { metadata: envelope.createSurface.metadata }),
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
function getComponentEdges(component) {
|
|
167
|
+
switch (component.component) {
|
|
168
|
+
case "Row":
|
|
169
|
+
case "Column":
|
|
170
|
+
case "List":
|
|
171
|
+
return getChildListEdges(component.children);
|
|
172
|
+
case "Card":
|
|
173
|
+
case "Button":
|
|
174
|
+
return [{ id: component.child, template: false }];
|
|
175
|
+
case "Tabs":
|
|
176
|
+
return component.tabs.map(({ child }) => ({
|
|
177
|
+
id: child,
|
|
178
|
+
template: false,
|
|
179
|
+
}));
|
|
180
|
+
case "Modal":
|
|
181
|
+
return [
|
|
182
|
+
{ id: component.trigger, template: false },
|
|
183
|
+
{ id: component.content, template: false },
|
|
184
|
+
];
|
|
185
|
+
default:
|
|
186
|
+
return [];
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
function getChildListEdges(value) {
|
|
190
|
+
if (Array.isArray(value)) {
|
|
191
|
+
return value.map((id) => ({ id: id, template: false }));
|
|
192
|
+
}
|
|
193
|
+
const template = value;
|
|
194
|
+
return [{ id: template.componentId, template: true }];
|
|
195
|
+
}
|
|
196
|
+
function rejectGraphCycles(edges) {
|
|
197
|
+
const visiting = new Set();
|
|
198
|
+
const visited = new Set();
|
|
199
|
+
const visit = (id) => {
|
|
200
|
+
if (visiting.has(id)) {
|
|
201
|
+
throw new A2uiParseError(`A2UI component graph contains a cycle at ${JSON.stringify(id)}`);
|
|
202
|
+
}
|
|
203
|
+
if (visited.has(id)) {
|
|
204
|
+
return;
|
|
205
|
+
}
|
|
206
|
+
visiting.add(id);
|
|
207
|
+
for (const edge of edges.get(id) ?? []) {
|
|
208
|
+
visit(edge.id);
|
|
209
|
+
}
|
|
210
|
+
visiting.delete(id);
|
|
211
|
+
visited.add(id);
|
|
212
|
+
};
|
|
213
|
+
visit("root");
|
|
214
|
+
}
|
|
215
|
+
function collectComponentContexts(edges) {
|
|
216
|
+
const contexts = new Map();
|
|
217
|
+
const queue = [
|
|
218
|
+
{ id: "root", context: "surface" },
|
|
219
|
+
];
|
|
220
|
+
for (let index = 0; index < queue.length; index += 1) {
|
|
221
|
+
const current = queue[index];
|
|
222
|
+
const existing = contexts.get(current.id) ?? new Set();
|
|
223
|
+
if (existing.has(current.context)) {
|
|
224
|
+
continue;
|
|
225
|
+
}
|
|
226
|
+
existing.add(current.context);
|
|
227
|
+
contexts.set(current.id, existing);
|
|
228
|
+
for (const edge of edges.get(current.id) ?? []) {
|
|
229
|
+
queue.push({
|
|
230
|
+
id: edge.id,
|
|
231
|
+
context: current.context === "template" || edge.template ? "template" : "surface",
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
return contexts;
|
|
236
|
+
}
|
|
237
|
+
function validateSemanticValue(value, path, context, policy) {
|
|
238
|
+
if (value === null || typeof value !== "object") {
|
|
239
|
+
return;
|
|
240
|
+
}
|
|
241
|
+
if (Array.isArray(value)) {
|
|
242
|
+
for (const [index, child] of value.entries()) {
|
|
243
|
+
validateSemanticValue(child, `${path}[${index}]`, context, policy);
|
|
244
|
+
}
|
|
245
|
+
return;
|
|
246
|
+
}
|
|
247
|
+
const object = value;
|
|
248
|
+
if (Object.hasOwn(object, "call")) {
|
|
249
|
+
validateFunctionCall(object, path, context, policy);
|
|
250
|
+
return;
|
|
251
|
+
}
|
|
252
|
+
if (Object.hasOwn(object, "path")) {
|
|
253
|
+
const bindingPath = object.path;
|
|
254
|
+
const isTemplateList = Object.hasOwn(object, "componentId");
|
|
255
|
+
validateBindingPath(bindingPath, path, isTemplateList ? "surface" : context);
|
|
256
|
+
return;
|
|
257
|
+
}
|
|
258
|
+
for (const [key, child] of Object.entries(object)) {
|
|
259
|
+
if (key === "action" || key === "metadata") {
|
|
260
|
+
continue;
|
|
261
|
+
}
|
|
262
|
+
validateSemanticValue(child, `${path}.${key}`, context, policy);
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
function validateComponentAction(component, id, context, policy) {
|
|
266
|
+
if (!Object.hasOwn(component, "action")) {
|
|
267
|
+
return;
|
|
268
|
+
}
|
|
269
|
+
const action = component.action;
|
|
270
|
+
if (!Object.hasOwn(action, "event")) {
|
|
271
|
+
if (Object.hasOwn(action, "functionCall")) {
|
|
272
|
+
validateDynamicValue(action.functionCall, `components.${id}.action.functionCall`, context, policy);
|
|
273
|
+
}
|
|
274
|
+
return;
|
|
275
|
+
}
|
|
276
|
+
const event = action.event;
|
|
277
|
+
const eventName = event.name;
|
|
278
|
+
if (eventName.length === 0 || !policy.allowedEvents.has(eventName)) {
|
|
279
|
+
throw new A2uiParseError(`A2UI event ${JSON.stringify(eventName)} at components.${id}.action.event.name is not allowed by the host`);
|
|
280
|
+
}
|
|
281
|
+
if (Object.hasOwn(event, "userMessage")) {
|
|
282
|
+
validateDynamicValue(event.userMessage, `components.${id}.action.event.userMessage`, context, policy);
|
|
283
|
+
}
|
|
284
|
+
if (Object.hasOwn(event, "context")) {
|
|
285
|
+
const eventContext = event.context;
|
|
286
|
+
for (const [name, value] of Object.entries(eventContext)) {
|
|
287
|
+
validateDynamicValue(value, `components.${id}.action.event.context.${name}`, context, policy);
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
function validateDynamicValue(value, path, context, policy) {
|
|
292
|
+
if (value === null || typeof value !== "object" || Array.isArray(value)) {
|
|
293
|
+
return;
|
|
294
|
+
}
|
|
295
|
+
const object = value;
|
|
296
|
+
if (Object.hasOwn(object, "call")) {
|
|
297
|
+
validateFunctionCall(object, path, context, policy);
|
|
298
|
+
return;
|
|
299
|
+
}
|
|
300
|
+
if (Object.hasOwn(object, "path")) {
|
|
301
|
+
validateBindingPath(object.path, path, context);
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
function validateFunctionCall(object, path, context, policy) {
|
|
305
|
+
const functionName = object.call;
|
|
306
|
+
if (Object.hasOwn(object, "catalogId")) {
|
|
307
|
+
validateCatalogId(object.catalogId, `${path}.catalogId`);
|
|
308
|
+
}
|
|
309
|
+
if (!policy.allowedFunctions.has(functionName)) {
|
|
310
|
+
throw new A2uiParseError(`A2UI function ${JSON.stringify(functionName)} at ${path}.call is not allowed by the host`);
|
|
311
|
+
}
|
|
312
|
+
if (functionName === "@index" && context !== "template") {
|
|
313
|
+
throw new A2uiParseError(`A2UI system function "@index" at ${path}.call is only valid inside a dynamic-list template`);
|
|
314
|
+
}
|
|
315
|
+
if (functionName === "formatString") {
|
|
316
|
+
validateFormatString(object, path, context, policy);
|
|
317
|
+
}
|
|
318
|
+
if (Object.hasOwn(object, "args")) {
|
|
319
|
+
const args = object.args;
|
|
320
|
+
if ((functionName === "and" || functionName === "or") && Array.isArray(args.values)) {
|
|
321
|
+
for (const [index, value] of args.values.entries()) {
|
|
322
|
+
validateDynamicValue(value, `${path}.args.values[${index}]`, context, policy);
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
for (const [name, value] of Object.entries(args)) {
|
|
326
|
+
validateDynamicValue(value, `${path}.args.${name}`, context, policy);
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
function validateFormatString(object, path, context, policy) {
|
|
331
|
+
const args = object.args;
|
|
332
|
+
const source = args.value;
|
|
333
|
+
if (typeof source !== "string") {
|
|
334
|
+
throw new A2uiParseError(`A2UI formatString at ${path}.args.value requires a literal string so every interpolation can be validated`);
|
|
335
|
+
}
|
|
336
|
+
policy.formatStringSourceLength += source.length;
|
|
337
|
+
if (policy.formatStringSourceLength > A2UI_V1_MAX_SOURCE_LENGTH) {
|
|
338
|
+
throw new A2uiParseError(`A2UI formatString source exceeds cumulative maximum length of ${A2UI_V1_MAX_SOURCE_LENGTH}`);
|
|
339
|
+
}
|
|
340
|
+
const parsed = parseA2uiV1FormatString(source, `${path}.args.value`);
|
|
341
|
+
policy.formatStringExpressionCount += parsed.expressionCount;
|
|
342
|
+
if (policy.formatStringExpressionCount > JSON_MAX_VALUES) {
|
|
343
|
+
throw new A2uiParseError(`A2UI surface exceeds maximum of ${JSON_MAX_VALUES} formatString expressions`);
|
|
344
|
+
}
|
|
345
|
+
for (const [index, expression] of parsed.expressions.entries()) {
|
|
346
|
+
const expressionPath = `${path}.args.value.interpolations[${index}]`;
|
|
347
|
+
if (expression !== null &&
|
|
348
|
+
typeof expression === "object" &&
|
|
349
|
+
!Array.isArray(expression) &&
|
|
350
|
+
Object.hasOwn(expression, "call")) {
|
|
351
|
+
const validate = getA2uiV1FunctionCallValidator();
|
|
352
|
+
if (!validate(expression)) {
|
|
353
|
+
throw new A2uiParseError(`A2UI formatString function schema validation failed at ${expressionPath}: ${formatAjvErrors(validate)}`);
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
validateDynamicValue(expression, expressionPath, context, policy);
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
function validateBindingPath(path, location, context) {
|
|
360
|
+
if (path.length === 0) {
|
|
361
|
+
return;
|
|
362
|
+
}
|
|
363
|
+
if (path.startsWith("/")) {
|
|
364
|
+
for (const token of path.slice(1).split("/")) {
|
|
365
|
+
validatePointerToken(token, path, location);
|
|
366
|
+
}
|
|
367
|
+
return;
|
|
368
|
+
}
|
|
369
|
+
if (context !== "template") {
|
|
370
|
+
throw new A2uiParseError(`Relative A2UI binding ${JSON.stringify(path)} at ${location}.path is only valid inside a dynamic-list template`);
|
|
371
|
+
}
|
|
372
|
+
for (const token of path.split("/")) {
|
|
373
|
+
if (token.length === 0) {
|
|
374
|
+
throw new A2uiParseError(`Invalid relative A2UI binding ${JSON.stringify(path)} at ${location}.path`);
|
|
375
|
+
}
|
|
376
|
+
validatePointerToken(token, path, location);
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
function validatePointerToken(token, path, location) {
|
|
380
|
+
for (let index = 0; index < token.length; index += 1) {
|
|
381
|
+
if (token[index] !== "~") {
|
|
382
|
+
continue;
|
|
383
|
+
}
|
|
384
|
+
const escaped = token[index + 1];
|
|
385
|
+
if (escaped !== "0" && escaped !== "1") {
|
|
386
|
+
throw new A2uiParseError(`Invalid JSON Pointer escape in A2UI binding ${JSON.stringify(path)} at ${location}.path`);
|
|
387
|
+
}
|
|
388
|
+
index += 1;
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
function validateCatalogId(value, path) {
|
|
392
|
+
if (value !== undefined && value !== A2UI_V1_BASIC_CATALOG_ID) {
|
|
393
|
+
throw new A2uiParseError(`Unsupported A2UI catalog ${JSON.stringify(value)} at ${path}; only the pinned basic catalog is available`);
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
function parseAllowedNames(value, path, knownNames) {
|
|
397
|
+
if (!Array.isArray(value)) {
|
|
398
|
+
throw new A2uiParseError(`Expected an array at ${path}`);
|
|
399
|
+
}
|
|
400
|
+
const names = new Set();
|
|
401
|
+
for (const [index, name] of value.entries()) {
|
|
402
|
+
if (typeof name !== "string" || name.length === 0) {
|
|
403
|
+
throw new A2uiParseError(`Expected a non-empty string at ${path}[${index}]`);
|
|
404
|
+
}
|
|
405
|
+
if (knownNames !== undefined && !knownNames.has(name)) {
|
|
406
|
+
throw new A2uiParseError(`Unknown pinned-catalog name ${JSON.stringify(name)} at ${path}`);
|
|
407
|
+
}
|
|
408
|
+
names.add(name);
|
|
409
|
+
}
|
|
410
|
+
return names;
|
|
411
|
+
}
|
|
412
|
+
function freezeStrings(value, path = "policy option") {
|
|
413
|
+
if (!Array.isArray(value)) {
|
|
414
|
+
throw new A2uiParseError(`Expected an array at ${path}`);
|
|
415
|
+
}
|
|
416
|
+
for (const [index, name] of value.entries()) {
|
|
417
|
+
if (typeof name !== "string" || name.length === 0) {
|
|
418
|
+
throw new A2uiParseError(`Expected a non-empty string at ${path}[${index}]`);
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
return Object.freeze([...value]);
|
|
422
|
+
}
|
|
423
|
+
function validateComponentPlacement(components, edges, contexts) {
|
|
424
|
+
const parents = new Map();
|
|
425
|
+
for (const [parentId, children] of edges) {
|
|
426
|
+
if (!contexts.has(parentId)) {
|
|
427
|
+
continue;
|
|
428
|
+
}
|
|
429
|
+
for (const child of children) {
|
|
430
|
+
const childParents = parents.get(child.id) ?? [];
|
|
431
|
+
childParents.push(parentId);
|
|
432
|
+
parents.set(child.id, childParents);
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
for (const [id, component] of components) {
|
|
436
|
+
if (!contexts.has(id) || !Object.hasOwn(component, "weight")) {
|
|
437
|
+
continue;
|
|
438
|
+
}
|
|
439
|
+
const componentParents = parents.get(id) ?? [];
|
|
440
|
+
if (componentParents.length === 0 ||
|
|
441
|
+
componentParents.some((parentId) => {
|
|
442
|
+
const parentName = components.get(parentId)?.component;
|
|
443
|
+
return parentName !== "Row" && parentName !== "Column";
|
|
444
|
+
})) {
|
|
445
|
+
throw new A2uiParseError(`A2UI component ${JSON.stringify(id)} may use weight only as a direct child of Row or Column`);
|
|
446
|
+
}
|
|
447
|
+
}
|
|
448
|
+
}
|
|
449
|
+
//# sourceMappingURL=validate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/v1/validate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://a2ui.org/specification/v1_0/agent_capabilities.json",
|
|
4
|
+
"title": "A2UI Agent Capabilities Schema",
|
|
5
|
+
"description": "A schema for the agent capabilities object, which is used by an A2UI Agent to advertise its supported UI features to renderers. This can be embedded in an Agent Card for A2A or used in other transport protocols like MCP.",
|
|
6
|
+
"type": "object",
|
|
7
|
+
"properties": {
|
|
8
|
+
"v1.0": {
|
|
9
|
+
"type": "object",
|
|
10
|
+
"description": "The agent capabilities structure for version 1.0 of the A2UI protocol.",
|
|
11
|
+
"properties": {
|
|
12
|
+
"supportedCatalogIds": {
|
|
13
|
+
"type": "array",
|
|
14
|
+
"description": "An array of strings, where each is an ID identifying a Catalog for which the agent can generate content. This is not a resolvable URI. Multiple catalogs can be mixed in a single surface.",
|
|
15
|
+
"items": { "type": "string" }
|
|
16
|
+
},
|
|
17
|
+
"acceptsInlineCatalogs": {
|
|
18
|
+
"type": "boolean",
|
|
19
|
+
"description": "A boolean indicating if the agent can accept an 'inlineCatalogs' array in the renderer's a2uiRendererCapabilities. If omitted, this defaults to false.",
|
|
20
|
+
"default": false
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
},
|
|
25
|
+
"required": ["v1.0"]
|
|
26
|
+
}
|