@mcp-native/a2ui 0.0.3 → 0.2.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 +110 -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 +26 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +157 -37
- 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/format-string.d.ts +8 -0
- package/dist/v1/format-string.d.ts.map +1 -0
- package/dist/v1/format-string.js +377 -0
- package/dist/v1/format-string.js.map +1 -0
- package/dist/v1/index.d.ts +9 -0
- package/dist/v1/index.d.ts.map +1 -0
- package/dist/v1/index.js +6 -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 +7 -0
- package/dist/v1/schemas.d.ts.map +1 -0
- package/dist/v1/schemas.js +92 -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 +301 -0
- package/dist/v1/store.js.map +1 -0
- package/dist/v1/types.d.ts +58 -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 +434 -0
- package/dist/v1/validate.js.map +1 -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/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,19 @@
|
|
|
1
|
+
import type { McpToolCallResult } from "@mcp-native/core";
|
|
2
|
+
import type { A2uiMcpBindingNegotiation } from "../binding.js";
|
|
3
|
+
import { A2UI_MIME_TYPE, type A2uiResourceReader } from "../mime.js";
|
|
4
|
+
import type { A2uiV1Envelope } from "./types.js";
|
|
5
|
+
export interface ResolvedA2uiV1JsonlResource {
|
|
6
|
+
readonly uri: string;
|
|
7
|
+
readonly mimeType: typeof A2UI_MIME_TYPE;
|
|
8
|
+
readonly envelopes: readonly A2uiV1Envelope[];
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Resolves the single A2UI resource link in a successful tool result and parses
|
|
12
|
+
* its text body as an ordered v1 JSONL envelope batch. Does not invoke the
|
|
13
|
+
* custom `0.1` surface parser.
|
|
14
|
+
*
|
|
15
|
+
* Callers must only use this after mutual binding negotiation; MIME type alone
|
|
16
|
+
* does not grant the transport.
|
|
17
|
+
*/
|
|
18
|
+
export declare function resolveA2uiV1JsonlFromToolResult(reader: A2uiResourceReader, toolResult: McpToolCallResult, negotiation: A2uiMcpBindingNegotiation): Promise<ResolvedA2uiV1JsonlResource>;
|
|
19
|
+
//# sourceMappingURL=resolve.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../../src/v1/resolve.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAqC,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAG7F,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,eAAe,CAAC;AAE/D,OAAO,EAAE,cAAc,EAAE,KAAK,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAErE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,QAAQ,EAAE,OAAO,cAAc,CAAC;IACzC,QAAQ,CAAC,SAAS,EAAE,SAAS,cAAc,EAAE,CAAC;CAC/C;AAED;;;;;;;GAOG;AACH,wBAAsB,gCAAgC,CACpD,MAAM,EAAE,kBAAkB,EAC1B,UAAU,EAAE,iBAAiB,EAC7B,WAAW,EAAE,yBAAyB,GACrC,OAAO,CAAC,2BAA2B,CAAC,CAyCtC"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { isA2uiMcpBindingGrant } from "../binding.js";
|
|
2
|
+
import { A2uiResourceError } from "../errors.js";
|
|
3
|
+
import { A2UI_MIME_TYPE } from "../mime.js";
|
|
4
|
+
import { parseA2uiV1Jsonl } from "./parse.js";
|
|
5
|
+
/**
|
|
6
|
+
* Resolves the single A2UI resource link in a successful tool result and parses
|
|
7
|
+
* its text body as an ordered v1 JSONL envelope batch. Does not invoke the
|
|
8
|
+
* custom `0.1` surface parser.
|
|
9
|
+
*
|
|
10
|
+
* Callers must only use this after mutual binding negotiation; MIME type alone
|
|
11
|
+
* does not grant the transport.
|
|
12
|
+
*/
|
|
13
|
+
export async function resolveA2uiV1JsonlFromToolResult(reader, toolResult, negotiation) {
|
|
14
|
+
if (!isA2uiMcpBindingGrant(negotiation)) {
|
|
15
|
+
throw new A2uiResourceError("Cannot resolve an A2UI v1 JSONL resource without the exact negotiated binding");
|
|
16
|
+
}
|
|
17
|
+
if (toolResult.isError !== undefined && typeof toolResult.isError !== "boolean") {
|
|
18
|
+
throw new A2uiResourceError("Expected tool result.isError to be a boolean");
|
|
19
|
+
}
|
|
20
|
+
if (toolResult.isError === true) {
|
|
21
|
+
throw new A2uiResourceError("Cannot resolve an A2UI resource from an errored tool result");
|
|
22
|
+
}
|
|
23
|
+
const links = expectContentArray(toolResult.content).flatMap((block, index) => parseA2uiResourceLink(block, `tool result.content[${index}]`));
|
|
24
|
+
if (links.length !== 1) {
|
|
25
|
+
throw new A2uiResourceError(`Expected exactly one ${A2UI_MIME_TYPE} resource_link, found ${links.length}`);
|
|
26
|
+
}
|
|
27
|
+
const link = links[0];
|
|
28
|
+
const contents = expectResourceContents(await reader.readResource(link.uri)).filter((item) => item.uri === link.uri && item.mimeType === A2UI_MIME_TYPE);
|
|
29
|
+
if (contents.length !== 1) {
|
|
30
|
+
throw new A2uiResourceError(`Expected exactly one ${A2UI_MIME_TYPE} resource for ${link.uri}, found ${contents.length}`);
|
|
31
|
+
}
|
|
32
|
+
const resource = contents[0];
|
|
33
|
+
if (resource.text === undefined || resource.blob !== undefined) {
|
|
34
|
+
throw new A2uiResourceError(`Expected a text-only A2UI JSONL resource for ${link.uri}`);
|
|
35
|
+
}
|
|
36
|
+
return {
|
|
37
|
+
uri: link.uri,
|
|
38
|
+
mimeType: A2UI_MIME_TYPE,
|
|
39
|
+
envelopes: parseA2uiV1Jsonl(resource.text),
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
function expectContentArray(value) {
|
|
43
|
+
if (!Array.isArray(value)) {
|
|
44
|
+
throw new A2uiResourceError("Expected an array at tool result.content");
|
|
45
|
+
}
|
|
46
|
+
return value;
|
|
47
|
+
}
|
|
48
|
+
function parseA2uiResourceLink(value, path) {
|
|
49
|
+
if (value === null || typeof value !== "object" || Array.isArray(value)) {
|
|
50
|
+
throw new A2uiResourceError(`Expected a content object at ${path}`);
|
|
51
|
+
}
|
|
52
|
+
const block = value;
|
|
53
|
+
if (typeof block.type !== "string") {
|
|
54
|
+
throw new A2uiResourceError(`Expected a content type at ${path}.type`);
|
|
55
|
+
}
|
|
56
|
+
if (block.type !== "resource_link") {
|
|
57
|
+
return [];
|
|
58
|
+
}
|
|
59
|
+
if (typeof block.name !== "string") {
|
|
60
|
+
throw new A2uiResourceError(`Expected a string at ${path}.name`);
|
|
61
|
+
}
|
|
62
|
+
if (typeof block.uri !== "string") {
|
|
63
|
+
throw new A2uiResourceError(`Expected a string at ${path}.uri`);
|
|
64
|
+
}
|
|
65
|
+
if (block.mimeType !== undefined && typeof block.mimeType !== "string") {
|
|
66
|
+
throw new A2uiResourceError(`Expected a string at ${path}.mimeType`);
|
|
67
|
+
}
|
|
68
|
+
return block.mimeType === A2UI_MIME_TYPE ? [{ uri: block.uri }] : [];
|
|
69
|
+
}
|
|
70
|
+
function expectResourceContents(value) {
|
|
71
|
+
if (value === null || typeof value !== "object" || Array.isArray(value)) {
|
|
72
|
+
throw new A2uiResourceError("Expected an object from resources/read");
|
|
73
|
+
}
|
|
74
|
+
const result = value;
|
|
75
|
+
if (!Array.isArray(result.contents)) {
|
|
76
|
+
throw new A2uiResourceError("Expected an array at resource result.contents");
|
|
77
|
+
}
|
|
78
|
+
return result.contents.map((item, index) => {
|
|
79
|
+
if (item === null || typeof item !== "object" || Array.isArray(item)) {
|
|
80
|
+
throw new A2uiResourceError(`Expected an object at resource result.contents[${index}]`);
|
|
81
|
+
}
|
|
82
|
+
const resource = item;
|
|
83
|
+
if (typeof resource.uri !== "string") {
|
|
84
|
+
throw new A2uiResourceError(`Expected a string at resource result.contents[${index}].uri`);
|
|
85
|
+
}
|
|
86
|
+
if (resource.mimeType !== undefined && typeof resource.mimeType !== "string") {
|
|
87
|
+
throw new A2uiResourceError(`Expected a string at resource result.contents[${index}].mimeType`);
|
|
88
|
+
}
|
|
89
|
+
if (resource.text !== undefined && typeof resource.text !== "string") {
|
|
90
|
+
throw new A2uiResourceError(`Expected a string at resource result.contents[${index}].text`);
|
|
91
|
+
}
|
|
92
|
+
if (resource.blob !== undefined && typeof resource.blob !== "string") {
|
|
93
|
+
throw new A2uiResourceError(`Expected a string at resource result.contents[${index}].blob`);
|
|
94
|
+
}
|
|
95
|
+
if ((resource.text === undefined) === (resource.blob === undefined)) {
|
|
96
|
+
throw new A2uiResourceError(`Expected exactly one of text or blob at resource result.contents[${index}]`);
|
|
97
|
+
}
|
|
98
|
+
if (resource.text !== undefined) {
|
|
99
|
+
return {
|
|
100
|
+
uri: resource.uri,
|
|
101
|
+
text: resource.text,
|
|
102
|
+
...(resource.mimeType === undefined ? {} : { mimeType: resource.mimeType }),
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
return {
|
|
106
|
+
uri: resource.uri,
|
|
107
|
+
blob: resource.blob,
|
|
108
|
+
...(resource.mimeType === undefined ? {} : { mimeType: resource.mimeType }),
|
|
109
|
+
};
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=resolve.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve.js","sourceRoot":"","sources":["../../src/v1/resolve.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { ValidateFunction } from "ajv/dist/2020.js";
|
|
2
|
+
/** Compiles the pinned agent-to-renderer schema once with the basic catalog mapped in. */
|
|
3
|
+
export declare function getA2uiV1EnvelopeValidator(): ValidateFunction;
|
|
4
|
+
/** Validates a function reconstructed from the formatString expression language. */
|
|
5
|
+
export declare function getA2uiV1FunctionCallValidator(): ValidateFunction;
|
|
6
|
+
export declare function formatAjvErrors(validate: ValidateFunction): string;
|
|
7
|
+
//# sourceMappingURL=schemas.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schemas.d.ts","sourceRoot":"","sources":["../../src/v1/schemas.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAe,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAuDtE,0FAA0F;AAC1F,wBAAgB,0BAA0B,IAAI,gBAAgB,CAa7D;AAED,oFAAoF;AACpF,wBAAgB,8BAA8B,IAAI,gBAAgB,CAejE;AA+BD,wBAAgB,eAAe,CAAC,QAAQ,EAAE,gBAAgB,GAAG,MAAM,CAMlE"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import Ajv2020Import from "ajv/dist/2020.js";
|
|
2
|
+
import addFormatsImport from "ajv-formats";
|
|
3
|
+
import agentToRenderer from "./vendor/agent_to_renderer.json" with { type: "json" };
|
|
4
|
+
import basicCatalog from "./vendor/catalog.json" with { type: "json" };
|
|
5
|
+
import commonTypes from "./vendor/common_types.json" with { type: "json" };
|
|
6
|
+
const Ajv2020 = Ajv2020Import;
|
|
7
|
+
const addFormats = addFormatsImport;
|
|
8
|
+
/** Official catalogs ship a discriminator that Ajv cannot map through $ref; drop it. */
|
|
9
|
+
function stripDiscriminator(value) {
|
|
10
|
+
if (Array.isArray(value)) {
|
|
11
|
+
return value.map(stripDiscriminator);
|
|
12
|
+
}
|
|
13
|
+
if (value !== null && typeof value === "object") {
|
|
14
|
+
const result = {};
|
|
15
|
+
for (const [key, child] of Object.entries(value)) {
|
|
16
|
+
if (key === "discriminator") {
|
|
17
|
+
continue;
|
|
18
|
+
}
|
|
19
|
+
result[key] = stripDiscriminator(child);
|
|
20
|
+
}
|
|
21
|
+
return result;
|
|
22
|
+
}
|
|
23
|
+
return value;
|
|
24
|
+
}
|
|
25
|
+
function cloneJson(value) {
|
|
26
|
+
return JSON.parse(JSON.stringify(value));
|
|
27
|
+
}
|
|
28
|
+
function addSchemaAs(ajv, schema, id) {
|
|
29
|
+
const copy = stripDiscriminator(cloneJson(schema));
|
|
30
|
+
copy["$id"] = id;
|
|
31
|
+
ajv.addSchema(copy);
|
|
32
|
+
}
|
|
33
|
+
let cachedValidate;
|
|
34
|
+
let cachedFunctionValidate;
|
|
35
|
+
/** Compiles the pinned agent-to-renderer schema once with the basic catalog mapped in. */
|
|
36
|
+
export function getA2uiV1EnvelopeValidator() {
|
|
37
|
+
if (cachedValidate !== undefined) {
|
|
38
|
+
return cachedValidate;
|
|
39
|
+
}
|
|
40
|
+
const common = commonTypes;
|
|
41
|
+
const catalog = basicCatalog;
|
|
42
|
+
const envelope = agentToRenderer;
|
|
43
|
+
const ajv = createCatalogAjv(common, catalog);
|
|
44
|
+
const validate = ajv.compile(stripDiscriminator(envelope));
|
|
45
|
+
cachedValidate = validate;
|
|
46
|
+
return validate;
|
|
47
|
+
}
|
|
48
|
+
/** Validates a function reconstructed from the formatString expression language. */
|
|
49
|
+
export function getA2uiV1FunctionCallValidator() {
|
|
50
|
+
if (cachedFunctionValidate !== undefined) {
|
|
51
|
+
return cachedFunctionValidate;
|
|
52
|
+
}
|
|
53
|
+
const common = commonTypes;
|
|
54
|
+
const catalog = basicCatalog;
|
|
55
|
+
const ajv = createCatalogAjv(common, catalog);
|
|
56
|
+
cachedFunctionValidate = ajv.compile({
|
|
57
|
+
oneOf: [
|
|
58
|
+
{ $ref: `${expectStringId(catalog)}#/$defs/anyFunction` },
|
|
59
|
+
{ $ref: `${expectStringId(common)}#/$defs/IndexSystemFunction` },
|
|
60
|
+
],
|
|
61
|
+
});
|
|
62
|
+
return cachedFunctionValidate;
|
|
63
|
+
}
|
|
64
|
+
function createCatalogAjv(common, catalog) {
|
|
65
|
+
const ajv = new Ajv2020({
|
|
66
|
+
allErrors: true,
|
|
67
|
+
strict: false,
|
|
68
|
+
validateSchema: false,
|
|
69
|
+
});
|
|
70
|
+
addFormats(ajv);
|
|
71
|
+
const commonId = expectStringId(common);
|
|
72
|
+
const catalogId = expectStringId(catalog);
|
|
73
|
+
addSchemaAs(ajv, common, commonId);
|
|
74
|
+
addSchemaAs(ajv, common, "common_types.json");
|
|
75
|
+
addSchemaAs(ajv, catalog, catalogId);
|
|
76
|
+
addSchemaAs(ajv, catalog, "catalog.json");
|
|
77
|
+
addSchemaAs(ajv, catalog, "https://a2ui.org/specification/v1_0/catalog.json");
|
|
78
|
+
return ajv;
|
|
79
|
+
}
|
|
80
|
+
function expectStringId(schema) {
|
|
81
|
+
const id = schema["$id"];
|
|
82
|
+
if (typeof id !== "string" || id.length === 0) {
|
|
83
|
+
throw new Error("Vendored A2UI schema is missing a string $id");
|
|
84
|
+
}
|
|
85
|
+
return id;
|
|
86
|
+
}
|
|
87
|
+
export function formatAjvErrors(validate) {
|
|
88
|
+
const errors = validate.errors;
|
|
89
|
+
return (errors?.map((error) => `${error.instancePath || "/"} ${error.message}`).join("; ") ??
|
|
90
|
+
"schema validation failed");
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=schemas.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schemas.js","sourceRoot":"","sources":["../../src/v1/schemas.ts"],"names":[],"mappings":"AACA,OAAO,aAAa,MAAM,kBAAkB,CAAC;AAC7C,OAAO,gBAAgB,MAAM,aAAa,CAAC;AAE3C,OAAO,eAAe,MAAM,iCAAiC,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AACpF,OAAO,YAAY,MAAM,uBAAuB,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AACvE,OAAO,WAAW,MAAM,4BAA4B,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AAe3E,MAAM,OAAO,GAAG,aAA0C,CAAC;AAC3D,MAAM,UAAU,GAAG,gBAA4C,CAAC;AAEhE,wFAAwF;AACxF,SAAS,kBAAkB,CAAC,KAAc;IACxC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,KAAK,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;IACvC,CAAC;IACD,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAChD,MAAM,MAAM,GAA4B,EAAE,CAAC;QAC3C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAgC,CAAC,EAAE,CAAC;YAC5E,IAAI,GAAG,KAAK,eAAe,EAAE,CAAC;gBAC5B,SAAS;YACX,CAAC;YACD,MAAM,CAAC,GAAG,CAAC,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;QAC1C,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,SAAS,CAAI,KAAQ;IAC5B,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAM,CAAC;AAChD,CAAC;AAED,SAAS,WAAW,CAAC,GAAgB,EAAE,MAA+B,EAAE,EAAU;IAChF,MAAM,IAAI,GAAG,kBAAkB,CAAC,SAAS,CAAC,MAAM,CAAC,CAA4B,CAAC;IAC9E,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;IACjB,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;AACtB,CAAC;AAED,IAAI,cAA4C,CAAC;AACjD,IAAI,sBAAoD,CAAC;AAEzD,0FAA0F;AAC1F,MAAM,UAAU,0BAA0B;IACxC,IAAI,cAAc,KAAK,SAAS,EAAE,CAAC;QACjC,OAAO,cAAc,CAAC;IACxB,CAAC;IAED,MAAM,MAAM,GAAG,WAAsC,CAAC;IACtD,MAAM,OAAO,GAAG,YAAuC,CAAC;IACxD,MAAM,QAAQ,GAAG,eAA0C,CAAC;IAC5D,MAAM,GAAG,GAAG,gBAAgB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAE9C,MAAM,QAAQ,GAAG,GAAG,CAAC,OAAO,CAAC,kBAAkB,CAAC,QAAQ,CAAW,CAAC,CAAC;IACrE,cAAc,GAAG,QAAQ,CAAC;IAC1B,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,oFAAoF;AACpF,MAAM,UAAU,8BAA8B;IAC5C,IAAI,sBAAsB,KAAK,SAAS,EAAE,CAAC;QACzC,OAAO,sBAAsB,CAAC;IAChC,CAAC;IAED,MAAM,MAAM,GAAG,WAAsC,CAAC;IACtD,MAAM,OAAO,GAAG,YAAuC,CAAC;IACxD,MAAM,GAAG,GAAG,gBAAgB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9C,sBAAsB,GAAG,GAAG,CAAC,OAAO,CAAC;QACnC,KAAK,EAAE;YACL,EAAE,IAAI,EAAE,GAAG,cAAc,CAAC,OAAO,CAAC,qBAAqB,EAAE;YACzD,EAAE,IAAI,EAAE,GAAG,cAAc,CAAC,MAAM,CAAC,6BAA6B,EAAE;SACjE;KACF,CAAC,CAAC;IACH,OAAO,sBAAsB,CAAC;AAChC,CAAC;AAED,SAAS,gBAAgB,CACvB,MAA+B,EAC/B,OAAgC;IAEhC,MAAM,GAAG,GAAG,IAAI,OAAO,CAAC;QACtB,SAAS,EAAE,IAAI;QACf,MAAM,EAAE,KAAK;QACb,cAAc,EAAE,KAAK;KACtB,CAAC,CAAC;IACH,UAAU,CAAC,GAAG,CAAC,CAAC;IAEhB,MAAM,QAAQ,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;IACxC,MAAM,SAAS,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;IAC1C,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;IACnC,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,mBAAmB,CAAC,CAAC;IAC9C,WAAW,CAAC,GAAG,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;IACrC,WAAW,CAAC,GAAG,EAAE,OAAO,EAAE,cAAc,CAAC,CAAC;IAC1C,WAAW,CAAC,GAAG,EAAE,OAAO,EAAE,kDAAkD,CAAC,CAAC;IAC9E,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,cAAc,CAAC,MAA+B;IACrD,MAAM,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IACzB,IAAI,OAAO,EAAE,KAAK,QAAQ,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9C,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;IAClE,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,QAA0B;IACxD,MAAM,MAAM,GAAG,QAAQ,CAAC,MAA0C,CAAC;IACnE,OAAO,CACL,MAAM,EAAE,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,YAAY,IAAI,GAAG,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;QAClF,0BAA0B,CAC3B,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { A2uiV1SurfaceState } from "./types.js";
|
|
2
|
+
import type { A2uiV1SurfaceValidationPolicy } from "./validate.js";
|
|
3
|
+
/**
|
|
4
|
+
* Ordered in-memory store for official A2UI v1.0 lifecycle envelopes.
|
|
5
|
+
* Batches applied through {@link A2uiSurfaceStore.applyAll} are atomic.
|
|
6
|
+
*/
|
|
7
|
+
export declare class A2uiSurfaceStore {
|
|
8
|
+
#private;
|
|
9
|
+
get size(): number;
|
|
10
|
+
has(surfaceId: string): boolean;
|
|
11
|
+
get(surfaceId: string): A2uiV1SurfaceState | undefined;
|
|
12
|
+
/** Returns a complete renderer-ready snapshot or fails closed. */
|
|
13
|
+
getValidated(surfaceId: string, policy: A2uiV1SurfaceValidationPolicy): A2uiV1SurfaceState | undefined;
|
|
14
|
+
list(): readonly A2uiV1SurfaceState[];
|
|
15
|
+
apply(envelope: unknown): void;
|
|
16
|
+
/**
|
|
17
|
+
* Applies every envelope in order. On failure the store is left unchanged.
|
|
18
|
+
*/
|
|
19
|
+
applyAll(envelopes: readonly unknown[]): void;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/v1/store.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAmC,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAEtF,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,eAAe,CAAC;AAWnE;;;GAGG;AACH,qBAAa,gBAAgB;;IAG3B,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,GAAG,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAE9B;IAED,GAAG,CAAC,SAAS,EAAE,MAAM,GAAG,kBAAkB,GAAG,SAAS,CAGrD;IAED,kEAAkE;IAClE,YAAY,CACV,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,6BAA6B,GACpC,kBAAkB,GAAG,SAAS,CAGhC;IAED,IAAI,IAAI,SAAS,kBAAkB,EAAE,CAEpC;IAED,KAAK,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,CAE7B;IAsBD;;OAEG;IACH,QAAQ,CAAC,SAAS,EAAE,SAAS,OAAO,EAAE,GAAG,IAAI,CAiB5C;CA4FF"}
|
package/dist/v1/store.js
ADDED
|
@@ -0,0 +1,301 @@
|
|
|
1
|
+
import { parseJsonObject, parseJsonValue } from "@mcp-native/core";
|
|
2
|
+
import { A2uiParseError } from "../errors.js";
|
|
3
|
+
import { parseA2uiV1Envelope } from "./parse.js";
|
|
4
|
+
import { A2UI_V1_MAX_COMPONENTS, A2UI_V1_MAX_SURFACES } from "./types.js";
|
|
5
|
+
import { validateA2uiV1SurfaceState } from "./validate.js";
|
|
6
|
+
/**
|
|
7
|
+
* Ordered in-memory store for official A2UI v1.0 lifecycle envelopes.
|
|
8
|
+
* Batches applied through {@link A2uiSurfaceStore.applyAll} are atomic.
|
|
9
|
+
*/
|
|
10
|
+
export class A2uiSurfaceStore {
|
|
11
|
+
#surfaces = new Map();
|
|
12
|
+
get size() {
|
|
13
|
+
return this.#surfaces.size;
|
|
14
|
+
}
|
|
15
|
+
has(surfaceId) {
|
|
16
|
+
return this.#surfaces.has(surfaceId);
|
|
17
|
+
}
|
|
18
|
+
get(surfaceId) {
|
|
19
|
+
const surface = this.#surfaces.get(surfaceId);
|
|
20
|
+
return surface === undefined ? undefined : freezeSurface(surface);
|
|
21
|
+
}
|
|
22
|
+
/** Returns a complete renderer-ready snapshot or fails closed. */
|
|
23
|
+
getValidated(surfaceId, policy) {
|
|
24
|
+
const surface = this.get(surfaceId);
|
|
25
|
+
return surface === undefined ? undefined : validateA2uiV1SurfaceState(surface, policy);
|
|
26
|
+
}
|
|
27
|
+
list() {
|
|
28
|
+
return [...this.#surfaces.values()].map(freezeSurface);
|
|
29
|
+
}
|
|
30
|
+
apply(envelope) {
|
|
31
|
+
this.#applyValidated(parseA2uiV1Envelope(envelope));
|
|
32
|
+
}
|
|
33
|
+
#applyValidated(envelope) {
|
|
34
|
+
if ("createSurface" in envelope) {
|
|
35
|
+
this.#createSurface(envelope.createSurface);
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
if ("updateComponents" in envelope) {
|
|
39
|
+
this.#updateComponents(envelope.updateComponents);
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
if ("updateDataModel" in envelope) {
|
|
43
|
+
this.#updateDataModel(envelope.updateDataModel);
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
if ("deleteSurface" in envelope) {
|
|
47
|
+
this.#deleteSurface(envelope.deleteSurface.surfaceId);
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
throw new A2uiParseError("Unsupported A2UI v1 envelope for the surface store");
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Applies every envelope in order. On failure the store is left unchanged.
|
|
54
|
+
*/
|
|
55
|
+
applyAll(envelopes) {
|
|
56
|
+
if (!Array.isArray(envelopes)) {
|
|
57
|
+
throw new A2uiParseError("Expected an array of A2UI v1 envelopes");
|
|
58
|
+
}
|
|
59
|
+
const validated = envelopes.map((envelope) => parseA2uiV1Envelope(envelope));
|
|
60
|
+
const snapshot = cloneSurfaces(this.#surfaces);
|
|
61
|
+
try {
|
|
62
|
+
for (const envelope of validated) {
|
|
63
|
+
this.#applyValidated(envelope);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
catch (error) {
|
|
67
|
+
this.#surfaces.clear();
|
|
68
|
+
for (const [surfaceId, surface] of snapshot) {
|
|
69
|
+
this.#surfaces.set(surfaceId, surface);
|
|
70
|
+
}
|
|
71
|
+
throw error;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
#createSurface(message) {
|
|
75
|
+
if (this.#surfaces.has(message.surfaceId)) {
|
|
76
|
+
throw new A2uiParseError(`Cannot create A2UI surface ${JSON.stringify(message.surfaceId)}; it already exists`);
|
|
77
|
+
}
|
|
78
|
+
if (this.#surfaces.size >= A2UI_V1_MAX_SURFACES) {
|
|
79
|
+
throw new A2uiParseError(`A2UI store exceeds maximum of ${A2UI_V1_MAX_SURFACES} surfaces`);
|
|
80
|
+
}
|
|
81
|
+
const components = new Map();
|
|
82
|
+
if (message.components !== undefined) {
|
|
83
|
+
mergeComponents(components, message.components);
|
|
84
|
+
}
|
|
85
|
+
const dataModel = message.dataModel === undefined
|
|
86
|
+
? {}
|
|
87
|
+
: parseJsonObject(message.dataModel, "createSurface.dataModel");
|
|
88
|
+
const surface = {
|
|
89
|
+
surfaceId: message.surfaceId,
|
|
90
|
+
sendDataModel: message.sendDataModel === true,
|
|
91
|
+
components,
|
|
92
|
+
dataModel,
|
|
93
|
+
};
|
|
94
|
+
if (message.catalogId !== undefined) {
|
|
95
|
+
surface.catalogId = message.catalogId;
|
|
96
|
+
}
|
|
97
|
+
if (message.metadata !== undefined) {
|
|
98
|
+
surface.metadata = parseJsonObject(message.metadata, "createSurface.metadata");
|
|
99
|
+
}
|
|
100
|
+
this.#surfaces.set(message.surfaceId, surface);
|
|
101
|
+
}
|
|
102
|
+
#updateComponents(message) {
|
|
103
|
+
const surface = this.#requireSurface(message.surfaceId, "updateComponents");
|
|
104
|
+
const updatedComponents = cloneComponents(surface.components);
|
|
105
|
+
mergeComponents(updatedComponents, message.components);
|
|
106
|
+
surface.components = updatedComponents;
|
|
107
|
+
}
|
|
108
|
+
#updateDataModel(message) {
|
|
109
|
+
const surface = this.#requireSurface(message.surfaceId, "updateDataModel");
|
|
110
|
+
const updatedDataModel = setJsonPointer(surface.dataModel, message.path, parseJsonValue(message.value, "updateDataModel.value"));
|
|
111
|
+
try {
|
|
112
|
+
surface.dataModel = parseJsonObject(updatedDataModel, "updateDataModel.result");
|
|
113
|
+
}
|
|
114
|
+
catch (error) {
|
|
115
|
+
const errorMessage = error instanceof Error ? error.message : "Invalid merged data model";
|
|
116
|
+
throw new A2uiParseError(`Updated A2UI data model is invalid: ${errorMessage}`, {
|
|
117
|
+
cause: error,
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
#deleteSurface(surfaceId) {
|
|
122
|
+
if (!this.#surfaces.delete(surfaceId)) {
|
|
123
|
+
throw new A2uiParseError(`Cannot delete A2UI surface ${JSON.stringify(surfaceId)}; it does not exist`);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
#requireSurface(surfaceId, operation) {
|
|
127
|
+
const surface = this.#surfaces.get(surfaceId);
|
|
128
|
+
if (surface === undefined) {
|
|
129
|
+
throw new A2uiParseError(`Cannot ${operation} A2UI surface ${JSON.stringify(surfaceId)}; it does not exist`);
|
|
130
|
+
}
|
|
131
|
+
return surface;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
function mergeComponents(target, components) {
|
|
135
|
+
const seen = new Set();
|
|
136
|
+
for (const [index, component] of components.entries()) {
|
|
137
|
+
const reconstructed = parseJsonObject(component, `components[${index}]`);
|
|
138
|
+
if (typeof reconstructed.id !== "string" || reconstructed.id.length === 0) {
|
|
139
|
+
throw new A2uiParseError("Expected a non-empty component id");
|
|
140
|
+
}
|
|
141
|
+
if (typeof reconstructed.component !== "string" || reconstructed.component.length === 0) {
|
|
142
|
+
throw new A2uiParseError("Expected a non-empty component name");
|
|
143
|
+
}
|
|
144
|
+
if (seen.has(reconstructed.id)) {
|
|
145
|
+
throw new A2uiParseError(`Duplicate A2UI component id ${JSON.stringify(reconstructed.id)} in one update`);
|
|
146
|
+
}
|
|
147
|
+
seen.add(reconstructed.id);
|
|
148
|
+
target.set(reconstructed.id, reconstructed);
|
|
149
|
+
if (target.size > A2UI_V1_MAX_COMPONENTS) {
|
|
150
|
+
throw new A2uiParseError(`A2UI surface exceeds maximum of ${A2UI_V1_MAX_COMPONENTS} components`);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
function freezeSurface(surface) {
|
|
155
|
+
return {
|
|
156
|
+
surfaceId: surface.surfaceId,
|
|
157
|
+
...(surface.catalogId === undefined ? {} : { catalogId: surface.catalogId }),
|
|
158
|
+
sendDataModel: surface.sendDataModel,
|
|
159
|
+
components: cloneComponents(surface.components),
|
|
160
|
+
dataModel: parseJsonObject(surface.dataModel, "surface.dataModel"),
|
|
161
|
+
...(surface.metadata === undefined
|
|
162
|
+
? {}
|
|
163
|
+
: { metadata: parseJsonObject(surface.metadata, "surface.metadata") }),
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
function cloneSurfaces(surfaces) {
|
|
167
|
+
const clone = new Map();
|
|
168
|
+
for (const [surfaceId, surface] of surfaces) {
|
|
169
|
+
clone.set(surfaceId, {
|
|
170
|
+
surfaceId: surface.surfaceId,
|
|
171
|
+
...(surface.catalogId === undefined ? {} : { catalogId: surface.catalogId }),
|
|
172
|
+
sendDataModel: surface.sendDataModel,
|
|
173
|
+
components: cloneComponents(surface.components),
|
|
174
|
+
dataModel: parseJsonObject(surface.dataModel, "surface.dataModel"),
|
|
175
|
+
...(surface.metadata === undefined
|
|
176
|
+
? {}
|
|
177
|
+
: { metadata: parseJsonObject(surface.metadata, "surface.metadata") }),
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
return clone;
|
|
181
|
+
}
|
|
182
|
+
function cloneComponents(components) {
|
|
183
|
+
const clone = new Map();
|
|
184
|
+
for (const [id, component] of components) {
|
|
185
|
+
clone.set(id, parseJsonObject(component, `components.${id}`));
|
|
186
|
+
}
|
|
187
|
+
return clone;
|
|
188
|
+
}
|
|
189
|
+
function setJsonPointer(document, path, value) {
|
|
190
|
+
if (path === undefined || path === "" || path === "/") {
|
|
191
|
+
if (value === null || typeof value !== "object" || Array.isArray(value)) {
|
|
192
|
+
throw new A2uiParseError("Root data model replacement must be a JSON object");
|
|
193
|
+
}
|
|
194
|
+
return parseJsonObject(value, "dataModel");
|
|
195
|
+
}
|
|
196
|
+
if (!path.startsWith("/")) {
|
|
197
|
+
throw new A2uiParseError(`Invalid JSON Pointer ${JSON.stringify(path)}`);
|
|
198
|
+
}
|
|
199
|
+
const tokens = path
|
|
200
|
+
.slice(1)
|
|
201
|
+
.split("/")
|
|
202
|
+
.map((token) => decodeJsonPointerToken(token, path));
|
|
203
|
+
const root = parseJsonObject(document, "dataModel");
|
|
204
|
+
let cursor = root;
|
|
205
|
+
for (let index = 0; index < tokens.length - 1; index += 1) {
|
|
206
|
+
const token = tokens[index];
|
|
207
|
+
if (Array.isArray(cursor)) {
|
|
208
|
+
const arrayIndex = parseArrayIndex(token, path);
|
|
209
|
+
if (arrayIndex > cursor.length) {
|
|
210
|
+
throw new A2uiParseError(`JSON Pointer path missing at ${JSON.stringify(path)}`);
|
|
211
|
+
}
|
|
212
|
+
if (arrayIndex === cursor.length) {
|
|
213
|
+
cursor.push({});
|
|
214
|
+
}
|
|
215
|
+
const next = cursor[arrayIndex];
|
|
216
|
+
if (next === null || typeof next !== "object") {
|
|
217
|
+
throw new A2uiParseError(`JSON Pointer path is not a container at ${JSON.stringify(path)}`);
|
|
218
|
+
}
|
|
219
|
+
cursor = next;
|
|
220
|
+
continue;
|
|
221
|
+
}
|
|
222
|
+
if (cursor === null || typeof cursor !== "object") {
|
|
223
|
+
throw new A2uiParseError(`JSON Pointer path missing at ${JSON.stringify(path)}`);
|
|
224
|
+
}
|
|
225
|
+
const object = cursor;
|
|
226
|
+
if (!Object.hasOwn(object, token)) {
|
|
227
|
+
defineJsonProperty(object, token, {});
|
|
228
|
+
}
|
|
229
|
+
const next = object[token];
|
|
230
|
+
if (next === null || typeof next !== "object") {
|
|
231
|
+
throw new A2uiParseError(`JSON Pointer path is not a container at ${JSON.stringify(path)}`);
|
|
232
|
+
}
|
|
233
|
+
cursor = next;
|
|
234
|
+
}
|
|
235
|
+
const last = tokens[tokens.length - 1];
|
|
236
|
+
if (Array.isArray(cursor)) {
|
|
237
|
+
const arrayIndex = parseArrayIndex(last, path);
|
|
238
|
+
if (value === null) {
|
|
239
|
+
if (arrayIndex >= cursor.length) {
|
|
240
|
+
throw new A2uiParseError(`JSON Pointer path missing at ${JSON.stringify(path)}`);
|
|
241
|
+
}
|
|
242
|
+
cursor.splice(arrayIndex, 1);
|
|
243
|
+
}
|
|
244
|
+
else if (arrayIndex === cursor.length) {
|
|
245
|
+
cursor.push(value);
|
|
246
|
+
}
|
|
247
|
+
else if (arrayIndex < cursor.length) {
|
|
248
|
+
cursor[arrayIndex] = value;
|
|
249
|
+
}
|
|
250
|
+
else {
|
|
251
|
+
throw new A2uiParseError(`JSON Pointer path missing at ${JSON.stringify(path)}`);
|
|
252
|
+
}
|
|
253
|
+
return root;
|
|
254
|
+
}
|
|
255
|
+
if (cursor === null || typeof cursor !== "object") {
|
|
256
|
+
throw new A2uiParseError(`JSON Pointer path missing at ${JSON.stringify(path)}`);
|
|
257
|
+
}
|
|
258
|
+
const object = cursor;
|
|
259
|
+
if (value === null) {
|
|
260
|
+
if (!Object.hasOwn(object, last)) {
|
|
261
|
+
throw new A2uiParseError(`JSON Pointer path missing at ${JSON.stringify(path)}`);
|
|
262
|
+
}
|
|
263
|
+
delete object[last];
|
|
264
|
+
}
|
|
265
|
+
else {
|
|
266
|
+
defineJsonProperty(object, last, value);
|
|
267
|
+
}
|
|
268
|
+
return root;
|
|
269
|
+
}
|
|
270
|
+
function parseArrayIndex(token, path) {
|
|
271
|
+
if (!/^(0|[1-9][0-9]*)$/.test(token)) {
|
|
272
|
+
throw new A2uiParseError(`Invalid JSON Pointer array index in ${JSON.stringify(path)}`);
|
|
273
|
+
}
|
|
274
|
+
const index = Number(token);
|
|
275
|
+
if (!Number.isSafeInteger(index)) {
|
|
276
|
+
throw new A2uiParseError(`Invalid JSON Pointer array index in ${JSON.stringify(path)}`);
|
|
277
|
+
}
|
|
278
|
+
return index;
|
|
279
|
+
}
|
|
280
|
+
function decodeJsonPointerToken(token, path) {
|
|
281
|
+
for (let index = 0; index < token.length; index += 1) {
|
|
282
|
+
if (token[index] !== "~") {
|
|
283
|
+
continue;
|
|
284
|
+
}
|
|
285
|
+
const escaped = token[index + 1];
|
|
286
|
+
if (escaped !== "0" && escaped !== "1") {
|
|
287
|
+
throw new A2uiParseError(`Invalid JSON Pointer escape in ${JSON.stringify(path)}`);
|
|
288
|
+
}
|
|
289
|
+
index += 1;
|
|
290
|
+
}
|
|
291
|
+
return token.replaceAll("~1", "/").replaceAll("~0", "~");
|
|
292
|
+
}
|
|
293
|
+
function defineJsonProperty(object, key, value) {
|
|
294
|
+
Object.defineProperty(object, key, {
|
|
295
|
+
configurable: true,
|
|
296
|
+
enumerable: true,
|
|
297
|
+
value,
|
|
298
|
+
writable: true,
|
|
299
|
+
});
|
|
300
|
+
}
|
|
301
|
+
//# sourceMappingURL=store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/v1/store.ts"],"names":[],"mappings":"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"}
|