Catalog 组合
这个包故意不提供 “all-in-one” catalog 常量。一个引用所有内置组件的顶层数组 会破坏 tree-shaking:只要消费者引用这个聚合,就会把全部组件打进 bundle,即使 实际只用其中几个。Catalog 应该按组件组合,成本应当在 import 处可见。
Renderer 最少需要什么
如果你的应用只负责渲染,组件名称就足够了。直接传 bare components;协议名来自
displayName ?? component.name。
生产环境 minifier 会重写 function declaration 名称,这会破坏
component.namefallback。为了生产安全,请给每个自定义组件设置显式displayName(字符串字面量能在 minification 后保留下来),或者用下面的 tuple 形式把组件和catalog.jsonmanifest 配对;manifest key 是权威名称。
Bundler 可以 tree-shake 未使用组件;导入 Text 不会自动带上 Button、Card
等组件。
为 Agent handshake 加入 schemas
如果你希望 serializeCatalog(...) 为每个组件输出 JSON Schema,让 Agent 知道
可以发送哪些 props,请把组件和 extractor 在 dist/catalog/<Name>/catalog.json
产出的 JSON 配对:
协议名存在于 JSON 的顶层 key 中,runtime 不需要再复制一份名称。
“我就是想用所有内置组件” - 可复制配方
这个配方包含所有内置组件和 A2UI v0.9 basic-catalog function entries。包本身
故意不导出 catalog/all;请把列表保留在接入点,让 bundle 成本保持可见。
如果某个组件的 schema 不需要发给 Agent,可以去掉对应的 manifest import 和
tuple 形式。只要你的 A2UI messages 在 dynamic props、actions 或 validation
checks 中使用 function calls,就保留 ...basicFunctions。
自定义组件
组件可以是任何接收单个 props object 并返回 ReactNode 的函数。函数名(或
displayName)就是 Agent 使用的协议名:
如果自定义组件需要 schema introspection,请用
@lynx-js/genui/a2ui-catalog-extractor 基于 interface 生成 manifest,然后用同样方式
配对:
API surface
defineCatalog(inputs):构建 runtime catalog。输入可以混合 bare components、[component, manifest]tuples,以及已经 resolved 的 entries (例如来自mergeCatalogs)。mergeCatalogs(...catalogs):重复名称采用 last-write-wins。serializeCatalog(catalog):输出发给 Agent handshake 的 JSON manifest。 没有关联 schema 的 component 会序列化成{ name }。resolveCatalog(catalog):生成 name -> component map。Renderer 内部使用, 也开放给高级场景。

