{"_id":"@aevatar/kit-a2ui","_rev":"5-1c69d2a571db008f641780893cb443ab","name":"@aevatar/kit-a2ui","dist-tags":{"latest":"1.2.1"},"versions":{"0.3.0":{"name":"@aevatar/kit-a2ui","version":"0.3.0","keywords":["aevatar","a2ui","google","agent-ui","declarative"],"_id":"@aevatar/kit-a2ui@0.3.0","maintainers":[{"name":"potterf","email":"potter.sun@aelf.io"}],"homepage":"https://github.com/aevatar/aevatarkit-ui#readme","bugs":{"url":"https://github.com/aevatar/aevatarkit-ui/issues"},"dist":{"shasum":"4feeb7f69bb486f01ffedd752f35ef4254e69817","tarball":"https://registry.npmjs.org/@aevatar/kit-a2ui/-/kit-a2ui-0.3.0.tgz","fileCount":9,"integrity":"sha512-OzGfnYYlrft3lCGtK7SZKa1d3hCMdGLheaM3QSdt/A/gvKQm5kZF1oSPfKS1xeNzOuuVgnpiKFk+axzWkJvXKQ==","signatures":[{"sig":"MEYCIQDZWRDLyq0Uf9fTfFU/ZpfsAxk4cIWxMFrnwuai50aCCQIhAOVSMZuHyADOB5r8jHry74qwoGKLo4pwlb4QZ1pZuOn0","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":207641},"main":"./dist/index.js","_from":"file:aevatar-kit-a2ui-0.3.0.tgz","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"}},"scripts":{"dev":"tsup --watch","test":"vitest","build":"tsup","clean":"rm -rf dist","typecheck":"tsc --noEmit"},"_npmUser":{"name":"potterf","email":"potter.sun@aelf.io"},"_resolved":"/private/var/folders/d9/bmbzh5n14v7byzn_zznk3gr80000gn/T/22dbdb9f67afa44f4e5822682aa88be2/aevatar-kit-a2ui-0.3.0.tgz","_integrity":"sha512-OzGfnYYlrft3lCGtK7SZKa1d3hCMdGLheaM3QSdt/A/gvKQm5kZF1oSPfKS1xeNzOuuVgnpiKFk+axzWkJvXKQ==","repository":{"url":"git+https://github.com/aevatar/aevatarkit-ui.git","type":"git","directory":"packages/kit-a2ui"},"_npmVersion":"10.7.0","description":"A2UI (Agent-to-User Interface) engine for AevatarKit SDK","directories":{},"_nodeVersion":"18.20.3","dependencies":{"@aevatar/kit-types":"0.3.0","@aevatar/kit-protocol":"0.3.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","vitest":"^1.0.0","typescript":"^5.3.0"},"_npmOperationalInternal":{"tmp":"tmp/kit-a2ui_0.3.0_1767689140626_0.6586935757208097","host":"s3://npm-registry-packages-npm-production"}},"1.0.0":{"name":"@aevatar/kit-a2ui","version":"1.0.0","keywords":["aevatar","a2ui","google","agent-ui","declarative"],"_id":"@aevatar/kit-a2ui@1.0.0","maintainers":[{"name":"potterf","email":"potter.sun@aelf.io"}],"homepage":"https://github.com/aevatar/aevatarkit-ui#readme","bugs":{"url":"https://github.com/aevatar/aevatarkit-ui/issues"},"dist":{"shasum":"dee2585202fc5047543fc55a971e26fcec393591","tarball":"https://registry.npmjs.org/@aevatar/kit-a2ui/-/kit-a2ui-1.0.0.tgz","fileCount":9,"integrity":"sha512-KgkJJaa8Iqsv0WwrEg4hWsc8GcUzMNXpPIb4lE/FMRmAhQuRE7OSlcztkNj7/4y6SkIuLIz4asB0sIP8kKZnnw==","signatures":[{"sig":"MEUCIQC4sraM9VvMBPxJVdXJWQeFMFg+K+GV2M6MNC5u0Rd2BgIgTzkClHuuPriwRVVANdM5L/NilJwZ3JxCfnZNOJK87Tg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":207641},"main":"./dist/index.js","_from":"file:aevatar-kit-a2ui-1.0.0.tgz","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"}},"scripts":{"dev":"tsup --watch","test":"vitest","build":"tsup","clean":"rm -rf dist","typecheck":"tsc --noEmit"},"_npmUser":{"name":"potterf","email":"potter.sun@aelf.io"},"_resolved":"/private/var/folders/d9/bmbzh5n14v7byzn_zznk3gr80000gn/T/ac56f221182e2785788445893407aeb6/aevatar-kit-a2ui-1.0.0.tgz","_integrity":"sha512-KgkJJaa8Iqsv0WwrEg4hWsc8GcUzMNXpPIb4lE/FMRmAhQuRE7OSlcztkNj7/4y6SkIuLIz4asB0sIP8kKZnnw==","repository":{"url":"git+https://github.com/aevatar/aevatarkit-ui.git","type":"git","directory":"packages/kit-a2ui"},"_npmVersion":"10.7.0","description":"A2UI (Agent-to-User Interface) engine for AevatarKit SDK","directories":{},"_nodeVersion":"18.20.3","dependencies":{"@aevatar/kit-types":"0.3.0","@aevatar/kit-protocol":"1.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","vitest":"^1.0.0","typescript":"^5.3.0"},"_npmOperationalInternal":{"tmp":"tmp/kit-a2ui_1.0.0_1767757709657_0.6056430246185727","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@aevatar/kit-a2ui","version":"1.1.0","keywords":["aevatar","a2ui","google","agent-ui","declarative"],"_id":"@aevatar/kit-a2ui@1.1.0","maintainers":[{"name":"potterf","email":"potter.sun@aelf.io"}],"homepage":"https://github.com/aevatar/aevatarkit-ui#readme","bugs":{"url":"https://github.com/aevatar/aevatarkit-ui/issues"},"dist":{"shasum":"3f10e64fd35a93fe86a94a0edbdcbaaaf47b0cc3","tarball":"https://registry.npmjs.org/@aevatar/kit-a2ui/-/kit-a2ui-1.1.0.tgz","fileCount":9,"integrity":"sha512-ecoKVKKFI/N0BF8pXbjDpCYdVAy2okYrKx9rennWIvRhDVjCfQWd4kMxDvlinFcVwLCqJWN/6v8nYcCM4MnhsQ==","signatures":[{"sig":"MEYCIQDUjV9TP688/le3cHJ6yfTTuL8urBhj/xiVD9Te6CRE1gIhAPec+KP64WnxqsjeIbNpeHQT/9VXDkE8Kqh5II6+Xl42","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":207641},"main":"./dist/index.js","_from":"file:aevatar-kit-a2ui-1.1.0.tgz","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"}},"scripts":{"dev":"tsup --watch","test":"vitest","build":"tsup","clean":"rm -rf dist","typecheck":"tsc --noEmit"},"_npmUser":{"name":"potterf","email":"potter.sun@aelf.io"},"_resolved":"/private/var/folders/d9/bmbzh5n14v7byzn_zznk3gr80000gn/T/bf7aa4c44370b515088bf2301ebff877/aevatar-kit-a2ui-1.1.0.tgz","_integrity":"sha512-ecoKVKKFI/N0BF8pXbjDpCYdVAy2okYrKx9rennWIvRhDVjCfQWd4kMxDvlinFcVwLCqJWN/6v8nYcCM4MnhsQ==","repository":{"url":"git+https://github.com/aevatar/aevatarkit-ui.git","type":"git","directory":"packages/kit-a2ui"},"_npmVersion":"10.7.0","description":"A2UI (Agent-to-User Interface) engine for AevatarKit SDK","directories":{},"_nodeVersion":"18.20.3","dependencies":{"@aevatar/kit-types":"1.1.0","@aevatar/kit-protocol":"1.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","vitest":"^1.0.0","typescript":"^5.3.0"},"_npmOperationalInternal":{"tmp":"tmp/kit-a2ui_1.1.0_1767769292147_0.9774329996050466","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"@aevatar/kit-a2ui","version":"1.2.0","keywords":["aevatar","a2ui","google","agent-ui","declarative"],"_id":"@aevatar/kit-a2ui@1.2.0","maintainers":[{"name":"potterf","email":"potter.sun@aelf.io"}],"homepage":"https://github.com/aevatar/aevatarkit-ui#readme","bugs":{"url":"https://github.com/aevatar/aevatarkit-ui/issues"},"dist":{"shasum":"b15f07ed5b10f44af4be6ff4debb84deaf17e832","tarball":"https://registry.npmjs.org/@aevatar/kit-a2ui/-/kit-a2ui-1.2.0.tgz","fileCount":9,"integrity":"sha512-yty4DP4wqn3hl6ag29YsTo9ktU23+UiMGrOCZSpQcfXqDm3m5UHXe0qjQf2ZSsSXV/DV1/eebi5T+9MIIHJkug==","signatures":[{"sig":"MEUCIEM5Bb0cAVNoJFyLF1FbY35v5TwhTqoYumZp+07tsUGiAiEAh1D2BSr9JXbv+6Q0Whu58GKaF5vywtFE0affimUufmg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":207641},"main":"./dist/index.js","_from":"file:aevatar-kit-a2ui-1.2.0.tgz","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"}},"scripts":{"dev":"tsup --watch","test":"vitest","build":"tsup","clean":"rm -rf dist","typecheck":"tsc --noEmit"},"_npmUser":{"name":"potterf","email":"potter.sun@aelf.io"},"_resolved":"/private/var/folders/d9/bmbzh5n14v7byzn_zznk3gr80000gn/T/cfcdb2886862f89dd8a74dc71cfe3e55/aevatar-kit-a2ui-1.2.0.tgz","_integrity":"sha512-yty4DP4wqn3hl6ag29YsTo9ktU23+UiMGrOCZSpQcfXqDm3m5UHXe0qjQf2ZSsSXV/DV1/eebi5T+9MIIHJkug==","repository":{"url":"git+https://github.com/aevatar/aevatarkit-ui.git","type":"git","directory":"packages/kit-a2ui"},"_npmVersion":"10.7.0","description":"A2UI (Agent-to-User Interface) engine for AevatarKit SDK","directories":{},"_nodeVersion":"18.20.3","dependencies":{"@aevatar/kit-types":"1.1.0","@aevatar/kit-protocol":"1.2.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","vitest":"^1.0.0","typescript":"^5.3.0"},"_npmOperationalInternal":{"tmp":"tmp/kit-a2ui_1.2.0_1768204662811_0.7573789194945428","host":"s3://npm-registry-packages-npm-production"}},"1.2.1":{"name":"@aevatar/kit-a2ui","version":"1.2.1","description":"A2UI (Agent-to-User Interface) engine for AevatarKit SDK","main":"./dist/index.js","module":"./dist/index.mjs","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"}},"dependencies":{"@aevatar/kit-types":"1.2.1","@aevatar/kit-protocol":"1.2.1"},"devDependencies":{"tsup":"^8.0.0","typescript":"^5.3.0","vitest":"^1.0.0"},"repository":{"type":"git","url":"git+https://github.com/aevatar/aevatarkit-ui.git","directory":"packages/kit-a2ui"},"homepage":"https://github.com/aevatar/aevatarkit-ui#readme","publishConfig":{"access":"public"},"keywords":["aevatar","a2ui","google","agent-ui","declarative"],"scripts":{"build":"tsup","dev":"tsup --watch","typecheck":"tsc --noEmit","clean":"rm -rf dist","test":"vitest"},"_id":"@aevatar/kit-a2ui@1.2.1","bugs":{"url":"https://github.com/aevatar/aevatarkit-ui/issues"},"_integrity":"sha512-/6I482MgQnmSSqa4qYnTsFlVIUnzF5RKWX4ndRhDT72rJAFYoY1/6LDcE0Wkpfgwg8TN1hO8G1OjjloTRjjUrQ==","_resolved":"/private/var/folders/d9/bmbzh5n14v7byzn_zznk3gr80000gn/T/45a461319a20d13f905b21d5addf1179/aevatar-kit-a2ui-1.2.1.tgz","_from":"file:aevatar-kit-a2ui-1.2.1.tgz","_nodeVersion":"18.20.3","_npmVersion":"10.7.0","dist":{"integrity":"sha512-/6I482MgQnmSSqa4qYnTsFlVIUnzF5RKWX4ndRhDT72rJAFYoY1/6LDcE0Wkpfgwg8TN1hO8G1OjjloTRjjUrQ==","shasum":"b1dc396f28c1e6adfa2d6b522136fbb459a6c4eb","tarball":"https://registry.npmjs.org/@aevatar/kit-a2ui/-/kit-a2ui-1.2.1.tgz","fileCount":9,"unpackedSize":207641,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIBB2EU+VEP6JlLzR+54oH7BFWfJPXURl43P7V9iEk8qNAiBEB78ztYaFWJZKj00D9fkxmnzx7bm6r9L/Gyi6z+1Hgw=="}]},"_npmUser":{"name":"potterf","email":"potter.sun@aelf.io"},"directories":{},"maintainers":[{"name":"potterf","email":"potter.sun@aelf.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/kit-a2ui_1.2.1_1768983991890_0.5704102032099827"},"_hasShrinkwrap":false}},"time":{"created":"2026-01-06T08:45:40.474Z","modified":"2026-01-21T08:26:32.167Z","0.3.0":"2026-01-06T08:45:40.766Z","1.0.0":"2026-01-07T03:48:29.816Z","1.1.0":"2026-01-07T07:01:32.298Z","1.2.0":"2026-01-12T07:57:42.938Z","1.2.1":"2026-01-21T08:26:32.028Z"},"bugs":{"url":"https://github.com/aevatar/aevatarkit-ui/issues"},"homepage":"https://github.com/aevatar/aevatarkit-ui#readme","keywords":["aevatar","a2ui","google","agent-ui","declarative"],"repository":{"type":"git","url":"git+https://github.com/aevatar/aevatarkit-ui.git","directory":"packages/kit-a2ui"},"description":"A2UI (Agent-to-User Interface) engine for AevatarKit SDK","maintainers":[{"name":"potterf","email":"potter.sun@aelf.io"}],"readme":"# @aevatar/kit-a2ui\n\nA2UI (Agent-to-User Interface) Engine for AevatarKit SDK.\n\n## Overview\n\nA2UI 是 Google 开源的面向 AI Agent 的界面协议/规范，用于解决 \"Agent 不是只回一串文本，而是能安全地'说'出一个可交互 UI\" 的问题。\n\n### 核心特性\n\n- **声明式 UI**: Agent 描述组件、布局、数据绑定，前端负责渲染\n- **安全性**: 白名单组件机制，前端保留最终控制权\n- **跨端跨框架**: 同一份 JSON 可在不同端用原生组件渲染\n- **流式生成**: 支持 JSONL 增量消息，边生成边渲染\n\n## Installation\n\n```bash\npnpm add @aevatar/kit-a2ui\n```\n\n## Quick Start\n\n```typescript\nimport { \n  createA2uiEngine, \n  createComponentRegistry \n} from '@aevatar/kit-a2ui';\nimport type { ReactNode } from 'react';\n\n// 1. 创建组件注册表\nconst registry = createComponentRegistry<ReactNode>();\n\n// 2. 注册组件\nregistry.register('Button', (props) => (\n  <button onClick={props.onClick}>{props.label}</button>\n));\n\nregistry.register('TextField', (props) => (\n  <input \n    type=\"text\" \n    value={props.value} \n    onChange={(e) => props.onChange?.(e.target.value)} \n  />\n));\n\n// 3. 创建引擎\nconst engine = createA2uiEngine(registry, {\n  events: {\n    onRenderTreeUpdated: (surfaceId, tree) => {\n      console.log('Render tree updated:', tree);\n    },\n    onUserAction: (action) => {\n      // 发送给服务端\n      sendToServer(action);\n    },\n  },\n});\n\n// 4. 处理服务端消息\nengine.processMessage({\n  type: 'surfaceUpdate',\n  components: [\n    {\n      id: 'btn1',\n      component: {\n        Button: { label: { literalString: 'Click Me' } }\n      }\n    }\n  ]\n});\n\nengine.processMessage({\n  type: 'beginRendering',\n  root: 'btn1'\n});\n\n// 5. 获取渲染树\nconst tree = engine.getRenderTree();\n```\n\n## Architecture\n\n```\n┌─────────────────────────────────────────────────────────────┐\n│                      A2uiEngine                             │\n│  ┌─────────────────────────────────────────────────────┐   │\n│  │                 Surface Manager                      │   │\n│  │  - Surface lifecycle                                 │   │\n│  │  - Component tree management                         │   │\n│  └─────────────────────────────────────────────────────┘   │\n│                           │                                 │\n│          ┌───────────────┼───────────────┐                 │\n│          ▼               ▼               ▼                 │\n│  ┌─────────────┐ ┌─────────────┐ ┌─────────────────┐       │\n│  │  DataModel  │ │  Registry   │ │ BindingResolver │       │\n│  │  /path/val  │ │  Button →   │ │  ${path} →     │       │\n│  │  订阅/更新  │ │  <btn/>     │ │  actual value   │       │\n│  └─────────────┘ └─────────────┘ └─────────────────┘       │\n└─────────────────────────────────────────────────────────────┘\n```\n\n## Core Modules\n\n### A2uiEngine\n\n核心协调器，处理 A2UI 消息和管理 Surface。\n\n```typescript\nconst engine = createA2uiEngine(registry, {\n  defaultSurfaceId: 'main',\n  events: {\n    onSurfaceCreated: (id) => {},\n    onRenderTreeUpdated: (id, tree) => {},\n    onDataChanged: (event) => {},\n    onUserAction: (action) => {},\n  },\n});\n```\n\n### A2uiDataModel\n\n数据模型存储，支持路径式访问和变更订阅。\n\n```typescript\nconst dataModel = createDataModel();\n\n// 设置数据\ndataModel.set('/booking/date', '2024-01-15');\ndataModel.set('/user/name', 'John');\n\n// 获取数据\nconst date = dataModel.get('/booking/date');\n\n// 订阅变更\nconst unsubscribe = dataModel.subscribe((event) => {\n  console.log(`${event.path} changed from ${event.oldValue} to ${event.newValue}`);\n});\n```\n\n### A2uiComponentRegistry\n\n组件注册表，提供白名单安全机制。\n\n```typescript\nconst registry = createComponentRegistry<ReactNode>({\n  allowUnregistered: false, // 禁止未注册组件\n});\n\n// 注册组件\nregistry.register('Card', (props) => (\n  <div className=\"card\">\n    <h3>{props.title}</h3>\n    {props.children}\n  </div>\n));\n\n// 检查组件是否允许\nif (registry.isAllowed('Card')) {\n  const renderer = registry.getRenderer('Card');\n}\n```\n\n### A2uiBindingResolver\n\n数据绑定解析器，将 BoundValue 解析为实际值。\n\n```typescript\nconst resolver = createBindingResolver(dataModel);\n\n// 解析绑定值\nconst value = resolver.resolve({\n  path: '/booking/date'\n});\n\n// 解析带字面量的值\nconst literal = resolver.resolve({\n  literalString: 'Hello World'\n});\n```\n\n## Integration with AG-UI\n\nA2UI 消息通过 AG-UI 的 CUSTOM 事件传输：\n\n```typescript\nimport { createA2uiEventRouter } from '@aevatar/kit-protocol';\n\nconst router = createEventRouter({\n  onCustom: (event) => {\n    // 路由 A2UI 事件到引擎\n    engine.processEvent(event);\n  },\n});\n```\n\n## License\n\nMIT\n\n","readmeFilename":"README.md"}