@mcp-native/a2ui 0.0.1 → 0.0.2

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 CHANGED
@@ -1,5 +1,3 @@
1
1
  # @mcp-native/a2ui
2
2
 
3
- Part of MCP Native a native UI runtime for Model Context Protocol applications.
4
-
5
- Early development.
3
+ Validated A2UI surface parsing and bindings for MCP Native.
@@ -0,0 +1,35 @@
1
+ import type { ToolAction } from "@mcp-native/core";
2
+ export declare const A2UI_VERSION: "0.1";
3
+ interface A2uiNodeBase {
4
+ readonly id: string;
5
+ }
6
+ export interface A2uiContainerNode extends A2uiNodeBase {
7
+ readonly type: "container";
8
+ readonly children: readonly A2uiNode[];
9
+ }
10
+ export interface A2uiTextNode extends A2uiNodeBase {
11
+ readonly type: "text";
12
+ readonly text: string;
13
+ }
14
+ export interface A2uiButtonNode extends A2uiNodeBase {
15
+ readonly type: "button";
16
+ readonly label: string;
17
+ readonly action: ToolAction;
18
+ }
19
+ export interface A2uiTextInputNode extends A2uiNodeBase {
20
+ readonly type: "text-input";
21
+ readonly label: string;
22
+ readonly value?: string;
23
+ readonly binding?: string;
24
+ }
25
+ export type A2uiNode = A2uiButtonNode | A2uiContainerNode | A2uiTextInputNode | A2uiTextNode;
26
+ export interface A2uiSurface {
27
+ readonly version: typeof A2UI_VERSION;
28
+ readonly root: A2uiNode;
29
+ }
30
+ export declare class A2uiParseError extends Error {
31
+ constructor(message: string);
32
+ }
33
+ export declare function parseA2uiSurface(input: string | unknown): A2uiSurface;
34
+ export {};
35
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAyB,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE1E,eAAO,MAAM,YAAY,EAAG,KAAc,CAAC;AAE3C,UAAU,YAAY;IACpB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,iBAAkB,SAAQ,YAAY;IACrD,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,SAAS,QAAQ,EAAE,CAAC;CACxC;AAED,MAAM,WAAW,YAAa,SAAQ,YAAY;IAChD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,cAAe,SAAQ,YAAY;IAClD,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;CAC7B;AAED,MAAM,WAAW,iBAAkB,SAAQ,YAAY;IACrD,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAC5B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,MAAM,QAAQ,GAAG,cAAc,GAAG,iBAAiB,GAAG,iBAAiB,GAAG,YAAY,CAAC;AAE7F,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,OAAO,EAAE,OAAO,YAAY,CAAC;IACtC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;CACzB;AAED,qBAAa,cAAe,SAAQ,KAAK;IACvC,YAAY,OAAO,EAAE,MAAM,EAG1B;CACF;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,GAAG,WAAW,CAsBrE"}
package/dist/index.js ADDED
@@ -0,0 +1,121 @@
1
+ export const A2UI_VERSION = "0.1";
2
+ export class A2uiParseError extends Error {
3
+ constructor(message) {
4
+ super(message);
5
+ this.name = "A2uiParseError";
6
+ }
7
+ }
8
+ export function parseA2uiSurface(input) {
9
+ let value = input;
10
+ if (typeof input === "string") {
11
+ try {
12
+ value = JSON.parse(input);
13
+ }
14
+ catch (error) {
15
+ const message = error instanceof Error ? error.message : "unknown JSON error";
16
+ throw new A2uiParseError(`Invalid JSON: ${message}`);
17
+ }
18
+ }
19
+ const surface = expectObject(value, "surface");
20
+ const version = expectString(surface.version, "surface.version");
21
+ if (version !== A2UI_VERSION) {
22
+ throw new A2uiParseError(`Unsupported A2UI version: ${version}`);
23
+ }
24
+ return {
25
+ version: A2UI_VERSION,
26
+ root: parseNode(surface.root, "surface.root"),
27
+ };
28
+ }
29
+ function parseNode(value, path) {
30
+ const node = expectObject(value, path);
31
+ const id = expectString(node.id, `${path}.id`);
32
+ const type = expectString(node.type, `${path}.type`);
33
+ switch (type) {
34
+ case "container":
35
+ return {
36
+ id,
37
+ type,
38
+ children: expectArray(node.children, `${path}.children`).map((child, index) => parseNode(child, `${path}.children[${index}]`)),
39
+ };
40
+ case "text":
41
+ return { id, type, text: expectString(node.text, `${path}.text`) };
42
+ case "button":
43
+ return {
44
+ id,
45
+ type,
46
+ label: expectString(node.label, `${path}.label`),
47
+ action: parseToolAction(node.action, `${path}.action`),
48
+ };
49
+ case "text-input": {
50
+ const label = expectString(node.label, `${path}.label`);
51
+ const valueField = optionalString(node.value, `${path}.value`);
52
+ const binding = optionalString(node.binding, `${path}.binding`);
53
+ return {
54
+ id,
55
+ type,
56
+ label,
57
+ ...(valueField === undefined ? {} : { value: valueField }),
58
+ ...(binding === undefined ? {} : { binding }),
59
+ };
60
+ }
61
+ default:
62
+ throw new A2uiParseError(`Unsupported node type at ${path}: ${type}`);
63
+ }
64
+ }
65
+ function parseToolAction(value, path) {
66
+ const action = expectObject(value, path);
67
+ const type = expectString(action.type, `${path}.type`);
68
+ if (type !== "tool") {
69
+ throw new A2uiParseError(`Unsupported action type at ${path}: ${type}`);
70
+ }
71
+ const arguments_ = action.arguments;
72
+ return {
73
+ type,
74
+ name: expectString(action.name, `${path}.name`),
75
+ ...(arguments_ === undefined
76
+ ? {}
77
+ : { arguments: expectJsonObject(arguments_, `${path}.arguments`) }),
78
+ };
79
+ }
80
+ function expectObject(value, path) {
81
+ if (value === null || typeof value !== "object" || Array.isArray(value)) {
82
+ throw new A2uiParseError(`Expected an object at ${path}`);
83
+ }
84
+ return value;
85
+ }
86
+ function expectArray(value, path) {
87
+ if (!Array.isArray(value)) {
88
+ throw new A2uiParseError(`Expected an array at ${path}`);
89
+ }
90
+ return value;
91
+ }
92
+ function expectString(value, path) {
93
+ if (typeof value !== "string") {
94
+ throw new A2uiParseError(`Expected a string at ${path}`);
95
+ }
96
+ return value;
97
+ }
98
+ function optionalString(value, path) {
99
+ return value === undefined ? undefined : expectString(value, path);
100
+ }
101
+ function expectJsonObject(value, path) {
102
+ const object = expectObject(value, path);
103
+ const result = {};
104
+ for (const [key, child] of Object.entries(object)) {
105
+ result[key] = expectJsonValue(child, `${path}.${key}`);
106
+ }
107
+ return result;
108
+ }
109
+ function expectJsonValue(value, path) {
110
+ if (value === null ||
111
+ typeof value === "boolean" ||
112
+ typeof value === "number" ||
113
+ typeof value === "string") {
114
+ return value;
115
+ }
116
+ if (Array.isArray(value)) {
117
+ return value.map((child, index) => expectJsonValue(child, `${path}[${index}]`));
118
+ }
119
+ return expectJsonObject(value, path);
120
+ }
121
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,12 +1,31 @@
1
1
  {
2
2
  "name": "@mcp-native/a2ui",
3
- "version": "0.0.1",
4
- "main": "index.js",
5
- "scripts": {
6
- "test": "echo \"Error: no test specified\" && exit 1"
7
- },
8
- "keywords": [],
9
- "author": "",
3
+ "version": "0.0.2",
4
+ "description": "A2UI parsing and bindings for MCP Native.",
10
5
  "license": "MIT",
11
- "description": "MCP Native - a2ui package"
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "https://github.com/pablospaniard/mcp-native.git",
9
+ "directory": "packages/a2ui"
10
+ },
11
+ "files": [
12
+ "dist",
13
+ "README.md"
14
+ ],
15
+ "type": "module",
16
+ "sideEffects": false,
17
+ "main": "./dist/index.js",
18
+ "types": "./dist/index.d.ts",
19
+ "exports": {
20
+ ".": {
21
+ "types": "./dist/index.d.ts",
22
+ "import": "./dist/index.js"
23
+ }
24
+ },
25
+ "publishConfig": {
26
+ "access": "public"
27
+ },
28
+ "dependencies": {
29
+ "@mcp-native/core": "^0.0.2"
30
+ }
12
31
  }
package/index.js DELETED
@@ -1 +0,0 @@
1
- module.exports = {};