diff --git a/.github/genui-tsconfig.instructions.md b/.github/genui-tsconfig.instructions.md index 4d0be8dcb3..c76d5f6f6c 100644 --- a/.github/genui-tsconfig.instructions.md +++ b/.github/genui-tsconfig.instructions.md @@ -3,3 +3,5 @@ applyTo: "packages/genui/**/*" --- When adding a new package under `packages/genui`, add a package-level `tsconfig.json` and wire it into `packages/genui/tsconfig.json` references in the same change. Root type-aware ESLint uses the TypeScript project service, so new GenUI source files that are not reachable from those references will fail pre-commit parsing before code linting even starts. + +When maintaining hand-written ESM CLI bin files under `packages/genui`, make entrypoint detection resolve `process.argv[1]` through `fs.realpathSync()` before comparing it with `import.meta.url`. pnpm `.bin` shims invoke workspace bins through symlink paths, and a raw path comparison can load the module without executing the CLI, making build scripts appear successful while generated artifacts are missing. diff --git a/eslint.config.js b/eslint.config.js index 2089ad4ebe..0e9b3389de 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -269,6 +269,12 @@ export default tseslint.config( reportUnusedDisableDirectives: true, }, }, + { + files: ['packages/genui/index.ts'], + rules: { + 'import/no-unresolved': 'off', + }, + }, // TypeScript-related { files: ['**/*.ts', '**/*.tsx'], @@ -293,6 +299,7 @@ export default tseslint.config( 'rslib.config.ts', 'vitest.config.ts', 'rstest.config.ts', + 'packages/genui/index.ts', ], defaultProject: './tsconfig.json', }, diff --git a/packages/genui/.gitignore b/packages/genui/.gitignore new file mode 100644 index 0000000000..178135c2b2 --- /dev/null +++ b/packages/genui/.gitignore @@ -0,0 +1 @@ +/dist/ diff --git a/packages/genui/README.md b/packages/genui/README.md new file mode 100644 index 0000000000..1ad48fc3b5 --- /dev/null +++ b/packages/genui/README.md @@ -0,0 +1,170 @@ +# @lynx-js/genui + +Generative UI primitives for Lynx applications. + +`@lynx-js/genui` is the single npm package for the GenUI toolchain. It exposes +A2UI rendering, OpenUI rendering, A2UI prompt/catalog utilities, and the CLI +from one package while keeping implementation directories private to this +monorepo. + +## Installation + +```bash +pnpm add @lynx-js/genui @lynx-js/react +``` + +`@lynx-js/react` is a peer dependency. Some built-in A2UI catalog components +also use `@lynx-js/lynx-ui`; install it when your app renders those components. + +## Entry Points + +```ts +import { + A2UI, + createMessageStore, + createOpenUiLibrary, + createStreamingParser, + buildA2UISystemPrompt, + extractCatalogComponents, +} from '@lynx-js/genui'; +``` + +The root entry point exports the stable APIs most applications and tools need: + +- A2UI ReactLynx renderer and data-store helpers. +- OpenUI parser, library, and renderer APIs. +- A2UI prompt builders. +- A2UI catalog extraction utilities. + +Focused subpaths are also available: + +```ts +import { A2UI, Text, Button } from '@lynx-js/genui/a2ui'; +import { createMessageStore } from '@lynx-js/genui/a2ui/store'; +import { createOpenUiLibrary } from '@lynx-js/genui/openui'; +import { buildA2UISystemPrompt } from '@lynx-js/genui/a2ui-prompt'; +import { extractCatalogComponents } from '@lynx-js/genui/a2ui-catalog-extractor'; +``` + +Catalog manifests are exported through a single public catalog entry: + +```ts +import { Text, Button } from '@lynx-js/genui/a2ui/catalog'; +``` + +## A2UI + +A2UI renders agent-generated UI messages that follow the A2UI v0.9 protocol. +Create a message store, push protocol messages into it from your transport, and +render the latest surface with ``. + +```tsx +import { A2UI, Button, Text, createMessageStore } from '@lynx-js/genui/a2ui'; + +const messageStore = createMessageStore(); + +export function GenUIScreen() { + return ( + { + // Send the action back to your agent, then push response messages + // into the same messageStore. + }} + /> + ); +} +``` + +Use the A2UI style entry when you want the packaged component styles: + +```ts +import '@lynx-js/genui/a2ui/styles/theme.css'; +``` + +See [`a2ui/README.md`](./a2ui/README.md) for catalog composition and custom +component details. + +## OpenUI + +OpenUI renders parsed OpenUI DSL through a configurable component library. + +```tsx +import { + OpenUiRenderer, + createOpenUiLibrary, + createStreamingParser, +} from '@lynx-js/genui/openui'; + +const library = createOpenUiLibrary(); +const parser = createStreamingParser(library.toJSONSchema()); +const result = parser.push('root = Stack([TextContent("Hello")])'); + +export function OpenUIScreen() { + return ; +} +``` + +Renderer styles are explicit: + +```ts +import '@lynx-js/genui/openui/styles/renderer.css'; +``` + +See [`openui/README.md`](./openui/README.md) for streaming and custom library +examples. + +## CLI + +The package installs the GenUI CLI and the low-level catalog extractor binary: + +```bash +genui --help +genui-cli --help +a2ui-catalog-extractor --help +``` + +`a2ui-cli` is also kept as a compatibility alias for existing A2UI scripts. New +scripts should prefer the namespace-first `genui a2ui ...` form so OpenUI +commands can be added under `genui openui ...` later. + +Generate catalog artifacts: + +```bash +genui a2ui generate catalog \ + --catalog-dir src/catalog \ + --source src/functions \ + --out-dir dist/catalog +``` + +Generate an A2UI system prompt: + +```bash +genui a2ui generate prompt \ + --catalog-dir dist/catalog \ + --out dist/a2ui-system-prompt.txt +``` + +## Published Package Layout + +Only `@lynx-js/genui` is intended to be published. The package contains compiled +JavaScript and declarations under `dist/` directories, plus CLI entry points, +README files, styles, and extractor skills. + +The root `index.ts` is compiled during build. Do not hand-write +`dist/index.js` or `dist/index.d.ts`; run: + +```bash +pnpm -C packages/genui build +``` + +Before publishing, verify the package contents: + +```bash +pnpm -C packages/genui pack --dry-run +``` + +## License + +Apache-2.0 diff --git a/packages/genui/a2ui-catalog-extractor/README.md b/packages/genui/a2ui-catalog-extractor/README.md index b75f09b5ab..9dcd55af3d 100644 --- a/packages/genui/a2ui-catalog-extractor/README.md +++ b/packages/genui/a2ui-catalog-extractor/README.md @@ -2,14 +2,14 @@ English | [简体中文](./readme.zh_cn.md) -`@lynx-js/a2ui-catalog-extractor` is the internal TypeDoc-powered extraction -engine behind `npx @lynx-js/a2ui-cli generate catalog`. It turns TypeScript component +`@lynx-js/genui/a2ui-catalog-extractor` is the internal TypeDoc-powered extraction +engine behind `genui a2ui generate catalog`. It turns TypeScript component interfaces into A2UI component catalog JSON. You write the public component contract once as a TypeScript `interface`, describe it with normal TypeDoc -comments, and run the public `npx @lynx-js/a2ui-cli` command to generate the JSON Schema +comments, and run the public `genui a2ui` command to generate the JSON Schema that an A2UI agent can read. -For user-facing scripts, use `npx @lynx-js/a2ui-cli generate catalog`. Treat +For user-facing scripts, use `genui a2ui generate catalog`. Treat this package as the implementation layer for extraction behavior and tests. ## What It Does @@ -58,10 +58,10 @@ the marked interface. ### Package manager -Run the public CLI package through `npx`: +Run the public CLI after installing `@lynx-js/genui`: ```bash -npx @lynx-js/a2ui-cli --help +genui a2ui --help ``` Then add a script to your package: @@ -69,7 +69,7 @@ Then add a script to your package: ```json { "scripts": { - "build:catalog": "npx @lynx-js/a2ui-cli generate catalog --catalog-dir src/catalog --out-dir dist/catalog" + "build:catalog": "genui a2ui generate catalog --catalog-dir src/catalog --out-dir dist/catalog" } } ``` @@ -132,7 +132,7 @@ extractor that this interface should become a catalog component named Run: ```bash -npx @lynx-js/a2ui-cli generate catalog --catalog-dir src/catalog --out-dir dist/catalog +genui a2ui generate catalog --catalog-dir src/catalog --out-dir dist/catalog ``` The extractor scans the catalog directory, finds interfaces marked with @@ -391,13 +391,13 @@ export interface CardProps { ## CLI Reference The public CLI entry point is -`npx @lynx-js/a2ui-cli generate catalog`. It delegates to this package +`genui a2ui generate catalog`. It delegates to this package internally. ### Generate catalog artifacts ```bash -npx @lynx-js/a2ui-cli generate catalog [options] +genui a2ui generate catalog [options] ``` | Option | Description | Default | @@ -417,10 +417,10 @@ files. It ignores `.d.ts`, `node_modules`, `dist`, and `.turbo`. ## Repository-internal Programmatic API -These exports are documented for maintainers of `@lynx-js/a2ui-cli`, extractor +These exports are documented for maintainers of `@lynx-js/genui-cli`, extractor tests, and repository-internal tooling. They are not the external integration surface for product code. Product build scripts should call -`npx @lynx-js/a2ui-cli generate catalog` instead of importing this package +`genui a2ui generate catalog` instead of importing this package directly. ### Generate components from source files @@ -429,7 +429,7 @@ directly. import { extractCatalogComponents, writeComponentCatalogs, -} from '@lynx-js/a2ui-catalog-extractor'; +} from '@lynx-js/genui/a2ui-catalog-extractor'; const components = await extractCatalogComponents({ sourceFiles: ['src/catalog/QuickStartCard.tsx'], @@ -472,7 +472,7 @@ import * as fs from 'node:fs'; import { extractCatalogComponentsFromTypeDocJson, writeCatalogComponents, -} from '@lynx-js/a2ui-catalog-extractor'; +} from '@lynx-js/genui/a2ui-catalog-extractor'; const projectJson = JSON.parse( await fs.promises.readFile('typedoc.json', 'utf8'), @@ -487,7 +487,7 @@ writeCatalogComponents(components, { The equivalent CLI command is: ```bash -npx @lynx-js/a2ui-cli generate catalog --typedoc-json typedoc.json --out-dir dist/catalog +genui a2ui generate catalog --typedoc-json typedoc.json --out-dir dist/catalog ``` ### Create a full A2UI catalog object @@ -499,7 +499,7 @@ the other top-level A2UI catalog fields: import { createA2UICatalog, extractCatalogComponents, -} from '@lynx-js/a2ui-catalog-extractor'; +} from '@lynx-js/genui/a2ui-catalog-extractor'; const components = await extractCatalogComponents({ sourceFiles: ['src/catalog/QuickStartCard.tsx'], diff --git a/packages/genui/a2ui-catalog-extractor/bin/a2ui-catalog-extractor.js b/packages/genui/a2ui-catalog-extractor/bin/a2ui-catalog-extractor.js index 6a88a1d1e9..f9fa4f9860 100755 --- a/packages/genui/a2ui-catalog-extractor/bin/a2ui-catalog-extractor.js +++ b/packages/genui/a2ui-catalog-extractor/bin/a2ui-catalog-extractor.js @@ -2,5 +2,4 @@ // Copyright 2026 The Lynx Authors. All rights reserved. // Licensed under the Apache License Version 2.0 that can be found in the // LICENSE file in the root directory of this source tree. -// eslint-disable-next-line import/no-unresolved -- Generated by the package build. import '../dist/cli.js'; diff --git a/packages/genui/a2ui-catalog-extractor/package.json b/packages/genui/a2ui-catalog-extractor/package.json index b4a7ecb07d..65bd910d4f 100644 --- a/packages/genui/a2ui-catalog-extractor/package.json +++ b/packages/genui/a2ui-catalog-extractor/package.json @@ -1,6 +1,7 @@ { - "name": "@lynx-js/a2ui-catalog-extractor", + "name": "@lynx-js/genui-a2ui-catalog-extractor", "version": "0.0.0", + "private": true, "description": "TypeDoc-driven A2UI catalog extractor for TypeScript interfaces.", "repository": { "type": "git", @@ -31,7 +32,7 @@ "README.md" ], "scripts": { - "build": "rslib build", + "build": "tsc --project tsconfig.build.json", "test": "rstest" }, "dependencies": { diff --git a/packages/genui/a2ui-catalog-extractor/readme.zh_cn.md b/packages/genui/a2ui-catalog-extractor/readme.zh_cn.md index 49d1fcf689..7c534eac9e 100644 --- a/packages/genui/a2ui-catalog-extractor/readme.zh_cn.md +++ b/packages/genui/a2ui-catalog-extractor/readme.zh_cn.md @@ -2,13 +2,13 @@ [English](./README.md) | 简体中文 -`@lynx-js/a2ui-catalog-extractor` 是 -`npx @lynx-js/a2ui-cli generate catalog` 背后的内部 TypeDoc extraction engine。它会把 TypeScript 组件接口转换成 A2UI +`@lynx-js/genui/a2ui-catalog-extractor` 是 +`genui a2ui generate catalog` 背后的内部 TypeDoc extraction engine。它会把 TypeScript 组件接口转换成 A2UI 组件 catalog JSON。你只需要用 TypeScript `interface` 写一次组件的公开契约, -用普通 TypeDoc 注释描述字段,然后通过公开的 `npx @lynx-js/a2ui-cli` 命令生成 +用普通 TypeDoc 注释描述字段,然后通过公开的 `genui a2ui` 命令生成 A2UI agent 可以读取的 JSON Schema。 -用户脚本请使用 `npx @lynx-js/a2ui-cli generate catalog`。这个包主要作为 +用户脚本请使用 `genui a2ui generate catalog`。这个包主要作为 extraction 行为和测试的实现层。 ## 它解决什么问题 @@ -55,10 +55,10 @@ agent 哪些 props 合法、哪些 props 必填、哪些 enum 值可用,以及 ### 包管理器 -通过 `npx` 执行公开 CLI 包: +安装 `@lynx-js/genui` 后执行公开 CLI: ```bash -npx @lynx-js/a2ui-cli --help +genui a2ui --help ``` 然后在你的 package 中加入脚本: @@ -66,7 +66,7 @@ npx @lynx-js/a2ui-cli --help ```json { "scripts": { - "build:catalog": "npx @lynx-js/a2ui-cli generate catalog --catalog-dir src/catalog --out-dir dist/catalog" + "build:catalog": "genui a2ui generate catalog --catalog-dir src/catalog --out-dir dist/catalog" } } ``` @@ -127,7 +127,7 @@ export interface QuickStartCardProps { 运行: ```bash -npx @lynx-js/a2ui-cli generate catalog --catalog-dir src/catalog --out-dir dist/catalog +genui a2ui generate catalog --catalog-dir src/catalog --out-dir dist/catalog ``` extractor 会扫描 catalog 目录,找到带 `@a2uiCatalog` 的 interface,并为每个 @@ -382,12 +382,12 @@ export interface CardProps { ## CLI 参考 -公开 CLI 入口是 `npx @lynx-js/a2ui-cli generate catalog`。它会在内部委托给这个包。 +公开 CLI 入口是 `genui a2ui generate catalog`。它会在内部委托给这个包。 ### 生成 catalog artifacts ```bash -npx @lynx-js/a2ui-cli generate catalog [options] +genui a2ui generate catalog [options] ``` | 选项 | 说明 | 默认值 | @@ -407,8 +407,8 @@ npx @lynx-js/a2ui-cli generate catalog [options] ## 仓库内部编程 API -这些导出主要面向 `@lynx-js/a2ui-cli` 维护者、extractor 测试和仓库内部工具;它们不是给产品代码接入的外部集成面。 -产品构建脚本应该调用 `npx @lynx-js/a2ui-cli generate catalog`,而不是直接 import 这个包。 +这些导出主要面向 `@lynx-js/genui-cli` 维护者、extractor 测试和仓库内部工具;它们不是给产品代码接入的外部集成面。 +产品构建脚本应该调用 `genui a2ui generate catalog`,而不是直接 import 这个包。 ### 从源码文件生成 components @@ -416,7 +416,7 @@ npx @lynx-js/a2ui-cli generate catalog [options] import { extractCatalogComponents, writeComponentCatalogs, -} from '@lynx-js/a2ui-catalog-extractor'; +} from '@lynx-js/genui/a2ui-catalog-extractor'; const components = await extractCatalogComponents({ sourceFiles: ['src/catalog/QuickStartCard.tsx'], @@ -458,7 +458,7 @@ import * as fs from 'node:fs'; import { extractCatalogComponentsFromTypeDocJson, writeCatalogComponents, -} from '@lynx-js/a2ui-catalog-extractor'; +} from '@lynx-js/genui/a2ui-catalog-extractor'; const projectJson = JSON.parse( await fs.promises.readFile('typedoc.json', 'utf8'), @@ -473,7 +473,7 @@ writeCatalogComponents(components, { 等价的 CLI 命令是: ```bash -npx @lynx-js/a2ui-cli generate catalog --typedoc-json typedoc.json --out-dir dist/catalog +genui a2ui generate catalog --typedoc-json typedoc.json --out-dir dist/catalog ``` ### 创建完整 A2UI catalog 对象 @@ -485,7 +485,7 @@ A2UI catalog 顶层字段: import { createA2UICatalog, extractCatalogComponents, -} from '@lynx-js/a2ui-catalog-extractor'; +} from '@lynx-js/genui/a2ui-catalog-extractor'; const components = await extractCatalogComponents({ sourceFiles: ['src/catalog/QuickStartCard.tsx'], diff --git a/packages/genui/a2ui-catalog-extractor/tsconfig.build.json b/packages/genui/a2ui-catalog-extractor/tsconfig.build.json index 6770be9b55..2164dd238c 100644 --- a/packages/genui/a2ui-catalog-extractor/tsconfig.build.json +++ b/packages/genui/a2ui-catalog-extractor/tsconfig.build.json @@ -1,5 +1,12 @@ { "extends": "./tsconfig.json", + "compilerOptions": { + "declaration": true, + "noEmit": false, + "outDir": "./dist", + "rootDir": "./src", + "tsBuildInfoFile": "./dist/tsconfig.build.tsbuildinfo", + }, "include": ["src"], "exclude": ["test"], } diff --git a/packages/genui/a2ui-cli/AGENTS.md b/packages/genui/a2ui-cli/AGENTS.md deleted file mode 100644 index ab6dc09ada..0000000000 --- a/packages/genui/a2ui-cli/AGENTS.md +++ /dev/null @@ -1,23 +0,0 @@ -# a2ui-cli - -Keep this package as the single public CLI entry point for A2UI setup. It should -orchestrate other packages instead of implementing catalog extraction or prompt -construction itself. - -`generate catalog` should delegate to `@lynx-js/a2ui-catalog-extractor`. -`generate prompt` should delegate to `@lynx-js/a2ui-prompt`. - -Do not require users to pass `--catalog-dir` for the common prompt path. A prompt -without `--catalog-dir` should use the built-in A2UI basic catalog from -`@lynx-js/a2ui-prompt`; use `--catalog-dir` only for custom generated catalog -artifacts. - -When `--catalog-dir` is provided, empty catalog directories should fail clearly -instead of producing a prompt with an empty component catalog. - -The executable file is `bin/cli.js`; keep `package.json` `bin.a2ui-cli` pointed -at that path. - -When testing local CLI changes, run the bin directly with Node. If testing -changes in `@lynx-js/a2ui-prompt`, rebuild that package first because this CLI -imports it through package exports. diff --git a/packages/genui/a2ui-cli/package.json b/packages/genui/a2ui-cli/package.json deleted file mode 100644 index 671a72ae50..0000000000 --- a/packages/genui/a2ui-cli/package.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "name": "@lynx-js/a2ui-cli", - "version": "0.0.0", - "description": "CLI for generating A2UI catalog artifacts and system prompts.", - "repository": { - "type": "git", - "url": "https://github.com/lynx-family/lynx-stack.git", - "directory": "packages/genui/a2ui-cli" - }, - "license": "Apache-2.0", - "type": "module", - "bin": { - "a2ui-cli": "./bin/cli.js" - }, - "files": [ - "bin", - "README.md" - ], - "dependencies": { - "@lynx-js/a2ui-catalog-extractor": "workspace:*", - "@lynx-js/a2ui-prompt": "workspace:*" - }, - "engines": { - "node": ">=22" - } -} diff --git a/packages/genui/a2ui-playground/AGENTS.md b/packages/genui/a2ui-playground/AGENTS.md index 07753663ea..57f4dfefed 100644 --- a/packages/genui/a2ui-playground/AGENTS.md +++ b/packages/genui/a2ui-playground/AGENTS.md @@ -1,6 +1,6 @@ # a2ui-playground (packages/genui/a2ui-playground) -This package is a playground app for `@lynx-js/a2ui-reactlynx`. +This package is a playground app for `@lynx-js/genui/a2ui`. It supports: @@ -42,7 +42,7 @@ The Lynx app entry is `lynx-src/index.tsx`, which renders `lynx-src/App.tsx`. Inside `lynx-src/App.tsx`: -- It imports `@lynx-js/a2ui-reactlynx/catalog/all` to register catalog components. +- It imports `@lynx-js/genui/a2ui/catalog/all` to register catalog components. - It reads `initData` via `useInitData()` (this is how `` passes data into the Lynx runtime). - It uses `BaseClient` + `client.processor.processMessages(...)` to replay the diff --git a/packages/genui/a2ui-playground/examples/README.md b/packages/genui/a2ui-playground/examples/README.md index 2fde5a855f..49a07c5d7e 100644 --- a/packages/genui/a2ui-playground/examples/README.md +++ b/packages/genui/a2ui-playground/examples/README.md @@ -1,7 +1,7 @@ # A2UI playground examples Reference implementations that intentionally live **outside** -`@lynx-js/a2ui-reactlynx`. The package itself ships only: +`@lynx-js/genui/a2ui`. The package itself ships only: - `` — the protocol-naive renderer. - `MessageStore` — a pure raw-message buffer. diff --git a/packages/genui/a2ui-playground/examples/io-mock/mockAgent.ts b/packages/genui/a2ui-playground/examples/io-mock/mockAgent.ts index 517cb873f0..0f8e1327a0 100644 --- a/packages/genui/a2ui-playground/examples/io-mock/mockAgent.ts +++ b/packages/genui/a2ui-playground/examples/io-mock/mockAgent.ts @@ -4,12 +4,12 @@ // // Reference mock IO module. Pushes a fixed initial stream into the store // and serves canned responses to user actions. NOT shipped from -// `@lynx-js/a2ui-reactlynx` — copy as a starting point for tests / demos. +// `@lynx-js/genui/a2ui` — copy as a starting point for tests / demos. import type { MessageStore, ServerToClientMessage, UserActionPayload, -} from '@lynx-js/a2ui-reactlynx'; +} from '@lynx-js/genui/a2ui'; export interface MockAgentOptions { /** Streamed once after `start()`. */ diff --git a/packages/genui/a2ui-playground/lynx-src/a2ui/App.tsx b/packages/genui/a2ui-playground/lynx-src/a2ui/App.tsx index 028b7402c6..3383497289 100644 --- a/packages/genui/a2ui-playground/lynx-src/a2ui/App.tsx +++ b/packages/genui/a2ui-playground/lynx-src/a2ui/App.tsx @@ -25,7 +25,7 @@ import { basicFunctions, createMessageStore, normalizePayloadToMessages as normalizeProtocolMessages, -} from '@lynx-js/a2ui-reactlynx'; +} from '@lynx-js/genui/a2ui'; import type { CatalogComponent, CatalogInput, @@ -33,26 +33,8 @@ import type { MessageStore, ServerToClientMessage, UserActionPayload, -} from '@lynx-js/a2ui-reactlynx'; -import buttonManifest from '@lynx-js/a2ui-reactlynx/catalog/Button/catalog.json'; -import cardManifest from '@lynx-js/a2ui-reactlynx/catalog/Card/catalog.json'; -import checkBoxManifest from '@lynx-js/a2ui-reactlynx/catalog/CheckBox/catalog.json'; -import choicePickerManifest from '@lynx-js/a2ui-reactlynx/catalog/ChoicePicker/catalog.json'; -import columnManifest from '@lynx-js/a2ui-reactlynx/catalog/Column/catalog.json'; -import dateTimeInputManifest from '@lynx-js/a2ui-reactlynx/catalog/DateTimeInput/catalog.json'; -import dividerManifest from '@lynx-js/a2ui-reactlynx/catalog/Divider/catalog.json'; -import iconManifest from '@lynx-js/a2ui-reactlynx/catalog/Icon/catalog.json'; -import imageManifest from '@lynx-js/a2ui-reactlynx/catalog/Image/catalog.json'; -import lineChartManifest from '@lynx-js/a2ui-reactlynx/catalog/LineChart/catalog.json'; -import listManifest from '@lynx-js/a2ui-reactlynx/catalog/List/catalog.json'; -import modalManifest from '@lynx-js/a2ui-reactlynx/catalog/Modal/catalog.json'; -import pieChartManifest from '@lynx-js/a2ui-reactlynx/catalog/PieChart/catalog.json'; -import radioGroupManifest from '@lynx-js/a2ui-reactlynx/catalog/RadioGroup/catalog.json'; -import rowManifest from '@lynx-js/a2ui-reactlynx/catalog/Row/catalog.json'; -import sliderManifest from '@lynx-js/a2ui-reactlynx/catalog/Slider/catalog.json'; -import tabsManifest from '@lynx-js/a2ui-reactlynx/catalog/Tabs/catalog.json'; -import textManifest from '@lynx-js/a2ui-reactlynx/catalog/Text/catalog.json'; -import textFieldManifest from '@lynx-js/a2ui-reactlynx/catalog/TextField/catalog.json'; +} from '@lynx-js/genui/a2ui'; +import { catalogManifests } from '@lynx-js/genui/a2ui/catalog'; import { useCallback, useEffect, @@ -69,16 +51,6 @@ import type { MockAgentProgress } from '../../examples/io-mock/mockAgent.js'; const DEFAULT_STREAM_DELAY_MS = 800; -// Compose every built-in. There is intentionally no all-in-one aggregate -// shipped from the package — this list makes the cost of "everything" -// visible and lets the bundler tree-shake when you only need a few. -// -// Function entries are included because the gallery payloads use A2UI -// basic-catalog calls such as `formatDate` in dynamic props and checks. -// -// To include component schemas, pair each component with its `catalog.json` -// manifest — see -// `packages/genui/a2ui/src/catalog/README.md`. function manifestEntry( component: unknown, manifest: CatalogManifest, @@ -87,25 +59,25 @@ function manifestEntry( } const ALL_BUILTINS: readonly CatalogInput[] = [ - manifestEntry(Text, textManifest), - manifestEntry(Image, imageManifest), - manifestEntry(Row, rowManifest), - manifestEntry(Column, columnManifest), - manifestEntry(List, listManifest), - manifestEntry(Card, cardManifest), - manifestEntry(Modal, modalManifest), - manifestEntry(Button, buttonManifest), - manifestEntry(Divider, dividerManifest), - manifestEntry(Icon, iconManifest), - manifestEntry(CheckBox, checkBoxManifest), - manifestEntry(ChoicePicker, choicePickerManifest), - manifestEntry(DateTimeInput, dateTimeInputManifest), - manifestEntry(LineChart, lineChartManifest), - manifestEntry(PieChart, pieChartManifest), - manifestEntry(RadioGroup, radioGroupManifest), - manifestEntry(Slider, sliderManifest), - manifestEntry(TextField, textFieldManifest), - manifestEntry(Tabs, tabsManifest), + manifestEntry(Text, catalogManifests.Text), + manifestEntry(Image, catalogManifests.Image), + manifestEntry(Row, catalogManifests.Row), + manifestEntry(Column, catalogManifests.Column), + manifestEntry(List, catalogManifests.List), + manifestEntry(Card, catalogManifests.Card), + manifestEntry(Modal, catalogManifests.Modal), + manifestEntry(Button, catalogManifests.Button), + manifestEntry(Divider, catalogManifests.Divider), + manifestEntry(Icon, catalogManifests.Icon), + manifestEntry(CheckBox, catalogManifests.CheckBox), + manifestEntry(ChoicePicker, catalogManifests.ChoicePicker), + manifestEntry(DateTimeInput, catalogManifests.DateTimeInput), + manifestEntry(LineChart, catalogManifests.LineChart), + manifestEntry(PieChart, catalogManifests.PieChart), + manifestEntry(RadioGroup, catalogManifests.RadioGroup), + manifestEntry(Slider, catalogManifests.Slider), + manifestEntry(TextField, catalogManifests.TextField), + manifestEntry(Tabs, catalogManifests.Tabs), ...basicFunctions, ]; diff --git a/packages/genui/a2ui-playground/lynx-src/a2ui/index.css b/packages/genui/a2ui-playground/lynx-src/a2ui/index.css index 1a6a039f44..a792475233 100644 --- a/packages/genui/a2ui-playground/lynx-src/a2ui/index.css +++ b/packages/genui/a2ui-playground/lynx-src/a2ui/index.css @@ -1,5 +1,5 @@ @import "@lynx-js/luna-styles/index.css"; -@import "@lynx-js/a2ui-reactlynx/styles/theme.css"; +@import "@lynx-js/genui/a2ui/styles/theme.css"; :root { display: flex; diff --git a/packages/genui/a2ui-playground/lynx-src/openui/App.tsx b/packages/genui/a2ui-playground/lynx-src/openui/App.tsx index 83da91e58f..b59398abbb 100644 --- a/packages/genui/a2ui-playground/lynx-src/openui/App.tsx +++ b/packages/genui/a2ui-playground/lynx-src/openui/App.tsx @@ -5,8 +5,8 @@ import { OpenUiRenderer, createOpenUiLibrary, createStreamingParser, -} from '@lynx-js/openui-reactlynx'; -import type { ActionEvent, ParseResult } from '@lynx-js/openui-reactlynx'; +} from '@lynx-js/genui/openui'; +import type { ActionEvent, ParseResult } from '@lynx-js/genui/openui'; import { useCallback, useEffect, diff --git a/packages/genui/a2ui-playground/package.json b/packages/genui/a2ui-playground/package.json index c28a7c53b1..519549c067 100644 --- a/packages/genui/a2ui-playground/package.json +++ b/packages/genui/a2ui-playground/package.json @@ -13,10 +13,9 @@ }, "dependencies": { "@codemirror/lang-json": "^6.0.2", - "@lynx-js/a2ui-reactlynx": "workspace:*", + "@lynx-js/genui": "workspace:*", "@lynx-js/luna-styles": "0.1.0", "@lynx-js/lynx-core": "0.1.3", - "@lynx-js/openui-reactlynx": "workspace:*", "@lynx-js/react": "workspace:*", "@lynx-js/web-core": "workspace:*", "@lynx-js/web-elements": "workspace:*", diff --git a/packages/genui/a2ui-playground/src/catalog/a2ui.ts b/packages/genui/a2ui-playground/src/catalog/a2ui.ts index bbb535de1e..c6c4ab2d9d 100644 --- a/packages/genui/a2ui-playground/src/catalog/a2ui.ts +++ b/packages/genui/a2ui-playground/src/catalog/a2ui.ts @@ -1,25 +1,7 @@ // Copyright 2026 The Lynx Authors. All rights reserved. // Licensed under the Apache License Version 2.0 that can be found in the // LICENSE file in the root directory of this source tree. -import buttonManifest from '@lynx-js/a2ui-reactlynx/catalog/Button/catalog.json'; -import cardManifest from '@lynx-js/a2ui-reactlynx/catalog/Card/catalog.json'; -import checkBoxManifest from '@lynx-js/a2ui-reactlynx/catalog/CheckBox/catalog.json'; -import choicePickerManifest from '@lynx-js/a2ui-reactlynx/catalog/ChoicePicker/catalog.json'; -import columnManifest from '@lynx-js/a2ui-reactlynx/catalog/Column/catalog.json'; -import dateTimeInputManifest from '@lynx-js/a2ui-reactlynx/catalog/DateTimeInput/catalog.json'; -import dividerManifest from '@lynx-js/a2ui-reactlynx/catalog/Divider/catalog.json'; -import iconManifest from '@lynx-js/a2ui-reactlynx/catalog/Icon/catalog.json'; -import imageManifest from '@lynx-js/a2ui-reactlynx/catalog/Image/catalog.json'; -import lineChartManifest from '@lynx-js/a2ui-reactlynx/catalog/LineChart/catalog.json'; -import listManifest from '@lynx-js/a2ui-reactlynx/catalog/List/catalog.json'; -import modalManifest from '@lynx-js/a2ui-reactlynx/catalog/Modal/catalog.json'; -import pieChartManifest from '@lynx-js/a2ui-reactlynx/catalog/PieChart/catalog.json'; -import radioGroupManifest from '@lynx-js/a2ui-reactlynx/catalog/RadioGroup/catalog.json'; -import rowManifest from '@lynx-js/a2ui-reactlynx/catalog/Row/catalog.json'; -import sliderManifest from '@lynx-js/a2ui-reactlynx/catalog/Slider/catalog.json'; -import tabsManifest from '@lynx-js/a2ui-reactlynx/catalog/Tabs/catalog.json'; -import textManifest from '@lynx-js/a2ui-reactlynx/catalog/Text/catalog.json'; -import textFieldManifest from '@lynx-js/a2ui-reactlynx/catalog/TextField/catalog.json'; +import { catalogManifests } from '@lynx-js/genui/a2ui/catalog'; import type { ProtocolName } from './utils/protocol.js'; @@ -121,7 +103,7 @@ export const COMPONENT_CATALOG: ComponentDoc[] = [ name: 'Text', category: 'Display', description: 'Displays a text string with optional style variant.', - props: schemaToProps(textManifest), + props: schemaToProps(catalogManifests.Text), usage: { a2ui: { id: 'greeting', @@ -185,7 +167,7 @@ export const COMPONENT_CATALOG: ComponentDoc[] = [ category: 'Display', description: 'Renders a Material icon by name. Default icon names can be browsed at https://a2ui-composer.ag-ui.com/icons.', - props: schemaToProps(iconManifest), + props: schemaToProps(catalogManifests.Icon), usage: { a2ui: [ { @@ -376,7 +358,7 @@ export const COMPONENT_CATALOG: ComponentDoc[] = [ name: 'Image', category: 'Display', description: 'Displays an image from a URL or data binding.', - props: schemaToProps(imageManifest), + props: schemaToProps(catalogManifests.Image), usage: { a2ui: { id: 'hero-image', @@ -427,7 +409,7 @@ export const COMPONENT_CATALOG: ComponentDoc[] = [ name: 'Divider', category: 'Display', description: 'A visual separator line used to divide content sections.', - props: schemaToProps(dividerManifest), + props: schemaToProps(catalogManifests.Divider), usage: { a2ui: [ { @@ -553,7 +535,7 @@ export const COMPONENT_CATALOG: ComponentDoc[] = [ category: 'Chart', description: 'Plots one or more numeric series over category labels with native SVG rendering.', - props: schemaToProps(lineChartManifest), + props: schemaToProps(catalogManifests.LineChart), usage: { a2ui: { id: 'sales-chart', @@ -629,7 +611,7 @@ export const COMPONENT_CATALOG: ComponentDoc[] = [ category: 'Chart', description: 'Renders pie and donut slices with native SVG arcs and a responsive legend.', - props: schemaToProps(pieChartManifest), + props: schemaToProps(catalogManifests.PieChart), usage: { a2ui: { id: 'revenue-share', @@ -691,7 +673,7 @@ export const COMPONENT_CATALOG: ComponentDoc[] = [ name: 'Card', category: 'Layout', description: 'A container that renders one child component inside a card.', - props: schemaToProps(cardManifest), + props: schemaToProps(catalogManifests.Card), usage: { a2ui: { id: 'profile-card', @@ -828,7 +810,7 @@ export const COMPONENT_CATALOG: ComponentDoc[] = [ category: 'Layout', description: 'A modal dialog that opens from a trigger component and displays one content component.', - props: schemaToProps(modalManifest), + props: schemaToProps(catalogManifests.Modal), usage: { a2ui: [ { @@ -879,7 +861,7 @@ export const COMPONENT_CATALOG: ComponentDoc[] = [ category: 'Layout', description: 'A horizontal layout container that arranges children in a row.', - props: schemaToProps(rowManifest), + props: schemaToProps(catalogManifests.Row), usage: { a2ui: { id: 'action-row', @@ -1013,7 +995,7 @@ export const COMPONENT_CATALOG: ComponentDoc[] = [ category: 'Layout', description: 'A vertical layout container that arranges children in a column.', - props: schemaToProps(columnManifest), + props: schemaToProps(catalogManifests.Column), usage: { a2ui: { id: 'main-column', @@ -1125,7 +1107,7 @@ export const COMPONENT_CATALOG: ComponentDoc[] = [ category: 'Data', description: 'A scrollable list that renders children or uses a template for dynamic items.', - props: schemaToProps(listManifest), + props: schemaToProps(catalogManifests.List), usage: { a2ui: { id: 'item-list', @@ -1218,7 +1200,7 @@ export const COMPONENT_CATALOG: ComponentDoc[] = [ name: 'Button', category: 'Input', description: 'An interactive button that triggers an action when pressed.', - props: schemaToProps(buttonManifest), + props: schemaToProps(catalogManifests.Button), usage: { a2ui: { id: 'submit-btn', @@ -1273,7 +1255,7 @@ export const COMPONENT_CATALOG: ComponentDoc[] = [ category: 'Input', description: 'A labeled text input with short text, long text, numeric, and obscured variants.', - props: schemaToProps(textFieldManifest), + props: schemaToProps(catalogManifests.TextField), usage: { a2ui: { id: 'name-input', @@ -1351,7 +1333,7 @@ export const COMPONENT_CATALOG: ComponentDoc[] = [ name: 'CheckBox', category: 'Input', description: 'A toggleable checkbox with label and action support.', - props: schemaToProps(checkBoxManifest), + props: schemaToProps(catalogManifests.CheckBox), usage: { a2ui: { id: 'agree-checkbox', @@ -1389,7 +1371,7 @@ export const COMPONENT_CATALOG: ComponentDoc[] = [ name: 'Slider', category: 'Input', description: 'A numeric range input backed by lynx-ui slider primitives.', - props: schemaToProps(sliderManifest), + props: schemaToProps(catalogManifests.Slider), usage: { a2ui: { id: 'volume-slider', @@ -1434,7 +1416,7 @@ export const COMPONENT_CATALOG: ComponentDoc[] = [ category: 'Input', description: 'A date and/or time input with a calendar panel and configurable output format.', - props: schemaToProps(dateTimeInputManifest), + props: schemaToProps(catalogManifests.DateTimeInput), usage: { a2ui: { id: 'date-input', @@ -1496,7 +1478,7 @@ export const COMPONENT_CATALOG: ComponentDoc[] = [ category: 'Input', description: 'A single- or multi-select choice picker with checkbox and chip styles.', - props: schemaToProps(choicePickerManifest), + props: schemaToProps(catalogManifests.ChoicePicker), usage: { a2ui: { id: 'city-picker', @@ -1578,7 +1560,7 @@ export const COMPONENT_CATALOG: ComponentDoc[] = [ name: 'Tabs', category: 'Layout', description: 'A tab bar that switches between multiple child components.', - props: schemaToProps(tabsManifest), + props: schemaToProps(catalogManifests.Tabs), usage: { a2ui: { id: 'details-tabs', @@ -1670,7 +1652,7 @@ export const COMPONENT_CATALOG: ComponentDoc[] = [ category: 'Input', description: 'A group of mutually exclusive radio options with selection support.', - props: schemaToProps(radioGroupManifest), + props: schemaToProps(catalogManifests.RadioGroup), usage: { a2ui: { id: 'size-picker', diff --git a/packages/genui/a2ui-playground/src/components/UsageSection.tsx b/packages/genui/a2ui-playground/src/components/UsageSection.tsx index a99ffd2bd1..b13cbb746f 100644 --- a/packages/genui/a2ui-playground/src/components/UsageSection.tsx +++ b/packages/genui/a2ui-playground/src/components/UsageSection.tsx @@ -14,7 +14,7 @@ export function UsageSection() {

             {`// Import the v0.9 protocol
-import { Conversation } from '@lynx-js/a2ui-reactlynx/0.9';
+import { Conversation } from '@lynx-js/genui/a2ui/0.9';
 
 export default function App() {
   return (
@@ -30,7 +30,7 @@ export default function App() {
             Build a custom chat UI with full control over layout and state.
           

-            {`import { A2UIRender, useLynxClient } from '@lynx-js/a2ui-reactlynx/0.9';
+            {`import { A2UIRender, useLynxClient } from '@lynx-js/genui/a2ui/0.9';
 
 export function CustomChat() {
   const { messages, sendMessage } = useLynxClient("https://api.com/chat");
@@ -69,7 +69,7 @@ export function CustomChat() {
           

             {`import { useState } from 'react';
-import { A2UIRender, useLynxClient } from '@lynx-js/a2ui-reactlynx/0.9';
+import { A2UIRender, useLynxClient } from '@lynx-js/genui/a2ui/0.9';
 
 export function SingleRequest() {
   const { sendMessage } = useLynxClient("https://api.com/chat", { keepHistory: false });
diff --git a/packages/genui/a2ui-playground/src/styles.css b/packages/genui/a2ui-playground/src/styles.css
index a276836a38..27006177cc 100644
--- a/packages/genui/a2ui-playground/src/styles.css
+++ b/packages/genui/a2ui-playground/src/styles.css
@@ -1,4 +1,4 @@
-@import "@lynx-js/a2ui-reactlynx/styles/theme.css";
+@import "@lynx-js/genui/a2ui/styles/theme.css";
 
 /* ── Geist Design System Tokens ── */
 :root {
diff --git a/packages/genui/a2ui-prompt/AGENTS.md b/packages/genui/a2ui-prompt/AGENTS.md
index 8a1c32d111..5666c71a69 100644
--- a/packages/genui/a2ui-prompt/AGENTS.md
+++ b/packages/genui/a2ui-prompt/AGENTS.md
@@ -9,7 +9,7 @@ This package may contain thin package-specific adapters such as
 behavior should live in the server agent source and be re-exported from here.
 
 The server package must remain self-contained for package-root Vercel
-deployments. Do not make `packages/genui/server` depend on `@lynx-js/a2ui-prompt`
+deployments. Do not make `packages/genui/server` depend on `@lynx-js/genui/a2ui-prompt`
 at runtime.
 
 When editing exported functions or constants reachable through this package,
diff --git a/packages/genui/a2ui-prompt/README.md b/packages/genui/a2ui-prompt/README.md
index ca524dcb35..017f57e5a5 100644
--- a/packages/genui/a2ui-prompt/README.md
+++ b/packages/genui/a2ui-prompt/README.md
@@ -1,6 +1,6 @@
 # A2UI Prompt
 
-`@lynx-js/a2ui-prompt` provides A2UI system prompt construction utilities for
+`@lynx-js/genui/a2ui-prompt` provides A2UI system prompt construction utilities for
 CLI and backend usage.
 
 The source of truth for the built-in prompt and catalog is
@@ -14,7 +14,7 @@ package.
 Build a prompt with the built-in A2UI basic catalog:
 
 ```ts
-import { buildA2UISystemPrompt } from '@lynx-js/a2ui-prompt';
+import { buildA2UISystemPrompt } from '@lynx-js/genui/a2ui-prompt';
 
 const prompt = buildA2UISystemPrompt();
 ```
@@ -25,7 +25,7 @@ Read generated catalog artifacts and build a prompt for a custom catalog:
 import {
   buildA2UISystemPrompt,
   readA2UICatalogFromDirectory,
-} from '@lynx-js/a2ui-prompt';
+} from '@lynx-js/genui/a2ui-prompt';
 
 const catalog = readA2UICatalogFromDirectory({
   catalogDir: 'dist/catalog',
@@ -37,7 +37,7 @@ const prompt = buildA2UISystemPrompt({ catalog });
 
 `readA2UICatalogFromDirectory` expects generated files such as
 `/catalog.json` and optional function definitions under `functions/`.
-Use `npx @lynx-js/a2ui-cli generate catalog` to create those artifacts.
+Use `genui a2ui generate catalog` to create those artifacts.
 
 ## Exports
 
diff --git a/packages/genui/a2ui-prompt/package.json b/packages/genui/a2ui-prompt/package.json
index 8a0994f2b6..95ef840352 100644
--- a/packages/genui/a2ui-prompt/package.json
+++ b/packages/genui/a2ui-prompt/package.json
@@ -1,6 +1,7 @@
 {
-  "name": "@lynx-js/a2ui-prompt",
+  "name": "@lynx-js/genui-a2ui-prompt",
   "version": "0.0.0",
+  "private": true,
   "description": "A2UI prompt and catalog rendering utilities for CLI prompt generation.",
   "repository": {
     "type": "git",
diff --git a/packages/genui/a2ui-prompt/src/index.ts b/packages/genui/a2ui-prompt/src/index.ts
index 77b5d3005c..18c2aa6917 100644
--- a/packages/genui/a2ui-prompt/src/index.ts
+++ b/packages/genui/a2ui-prompt/src/index.ts
@@ -54,7 +54,7 @@ export function readA2UICatalogFromDirectory(
   }
   if (componentManifests.length === 0) {
     throw new Error(
-      `[a2ui-prompt] No component catalog files found in ${options.catalogDir}. Expected files like /catalog.json. Run "a2ui-cli generate catalog" first or pass --catalog-dir to the generated catalog directory.`,
+      `[a2ui-prompt] No component catalog files found in ${options.catalogDir}. Expected files like /catalog.json. Run "genui a2ui generate catalog" first or pass --catalog-dir to the generated catalog directory.`,
     );
   }
 
diff --git a/packages/genui/a2ui/AGENTS.md b/packages/genui/a2ui/AGENTS.md
index 6aceaadcc3..474ca24fee 100644
--- a/packages/genui/a2ui/AGENTS.md
+++ b/packages/genui/a2ui/AGENTS.md
@@ -1,6 +1,6 @@
 # a2ui (packages/genui/a2ui)
 
-This package (`@lynx-js/a2ui-reactlynx`) is a **headless** ReactLynx
+This package (`@lynx-js/genui/a2ui`) is a **headless** ReactLynx
 renderer for the A2UI v0.9 protocol.
 
 ## How It Works (High Level)
@@ -122,13 +122,13 @@ User interactions are reported as `userAction` events:
 Run from repo root:
 
 ```bash
-pnpm -F @lynx-js/a2ui-reactlynx build
+pnpm -C packages/genui/a2ui build
 ```
 
 Notes:
 
 - The package's `build` script runs the
-  `@lynx-js/a2ui-catalog-extractor` to produce
+  `@lynx-js/genui/a2ui-catalog-extractor` to produce
   `dist/catalog//catalog.json` manifests.
 - The root `tsc --build` (registered as `//#build`) is what produces
   `dist//index.{js,d.ts}` for each catalog component (project
@@ -138,7 +138,7 @@ Notes:
 
 The build generates JSON schemas for catalog components:
 
-- Tool: `@lynx-js/a2ui-catalog-extractor` (TypeDoc-driven).
+- Tool: `@lynx-js/genui/a2ui-catalog-extractor` (TypeDoc-driven).
 - Inputs: `src/catalog//index.tsx` files annotated with
   `@a2uiCatalog ` JSDoc tags on the props interface.
 - Outputs: `dist/catalog//catalog.json`.
@@ -163,5 +163,5 @@ When adding `src/catalog//index.tsx`:
 3. Re-export the component from `src/catalog/index.ts`.
 4. Add `./catalog/` and `./catalog//catalog.json` entries
    to the `exports` map in `package.json`.
-5. Run `pnpm -F @lynx-js/a2ui-reactlynx build` and confirm
+5. Run `pnpm -C packages/genui/a2ui build` and confirm
    `dist/catalog//catalog.json` is generated.
diff --git a/packages/genui/a2ui/README.md b/packages/genui/a2ui/README.md
index 697369e5cc..186e8c240c 100644
--- a/packages/genui/a2ui/README.md
+++ b/packages/genui/a2ui/README.md
@@ -1,4 +1,4 @@
-# Lynx GenUI
+# @lynx-js/genui/a2ui
 
 English | [简体中文](./README_zh.md)
 
@@ -67,8 +67,8 @@ For a product app using A2UI, the important surfaces are:
 
 | Surface                       | Role                                                                                                                                       |
 | ----------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------ |
-| `@lynx-js/a2ui-reactlynx`     | ReactLynx renderer for A2UI v0.9. It provides ``, `MessageStore`, catalog APIs, built-in components, and protocol helpers.           |
-| `npx @lynx-js/a2ui-cli`       | Build-time command for generating catalog artifacts from TypeScript contracts and A2UI system prompts for your agent.                      |
+| `@lynx-js/genui/a2ui`         | ReactLynx renderer for A2UI v0.9. It provides ``, `MessageStore`, catalog APIs, built-in components, and protocol helpers.           |
+| `genui a2ui`                  | Build-time command for generating catalog artifacts from TypeScript contracts and A2UI system prompts for your agent.                      |
 | Your agent service            | A backend you own. It receives user prompts/actions, calls a model with the A2UI prompt and catalog, validates output, and returns A2UI.   |
 | Your transport implementation | Client code that calls your agent service, handles REST or streaming responses, pushes messages into `MessageStore`, and forwards actions. |
 
@@ -119,12 +119,12 @@ subscribes to it and updates the rendered surface as messages arrive.
 
 ## Quickstart
 
-In your ReactLynx app, install the renderer package and keep the CLI as an
-`npx` command. The CLI requires Node.js 22 or newer.
+In your ReactLynx app, install the GenUI package. The CLI requires Node.js 22
+or newer and is exposed by the same package.
 
 ```sh
-pnpm add @lynx-js/a2ui-reactlynx
-npx @lynx-js/a2ui-cli --help
+pnpm add @lynx-js/genui
+genui a2ui --help
 ```
 
 The rest of the flow is app-local: define catalog-facing component contracts,
@@ -167,7 +167,7 @@ ProductTile.displayName = 'ProductTile';
 Generate a schema for the agent:
 
 ```sh
-npx @lynx-js/a2ui-cli generate catalog --catalog-dir src/catalog --out-dir dist/catalog
+genui a2ui generate catalog --catalog-dir src/catalog --out-dir dist/catalog
 ```
 
 Then pair the component with its manifest:
@@ -180,12 +180,12 @@ import {
   createMessageStore,
   defineCatalog,
   serializeCatalog,
-} from '@lynx-js/a2ui-reactlynx';
-import buttonManifest from '@lynx-js/a2ui-reactlynx/catalog/Button/catalog.json'
+} from '@lynx-js/genui/a2ui';
+import buttonManifest from '@lynx-js/genui/a2ui/catalog/Button/catalog.json'
   with { type: 'json' };
-import columnManifest from '@lynx-js/a2ui-reactlynx/catalog/Column/catalog.json'
+import columnManifest from '@lynx-js/genui/a2ui/catalog/Column/catalog.json'
   with { type: 'json' };
-import textManifest from '@lynx-js/a2ui-reactlynx/catalog/Text/catalog.json'
+import textManifest from '@lynx-js/genui/a2ui/catalog/Text/catalog.json'
   with { type: 'json' };
 import productTileManifest from './dist/catalog/ProductTile/catalog.json'
   with { type: 'json' };
@@ -228,22 +228,22 @@ it when you want repeatable artifacts instead of hand-maintained JSON:
 Run the published CLI package through `npx`:
 
 ```sh
-npx @lynx-js/a2ui-cli generate catalog \
+genui a2ui generate catalog \
   --catalog-dir src/catalog \
   --source src/functions \
   --out-dir dist/catalog
 
-npx @lynx-js/a2ui-cli generate prompt \
+genui a2ui generate prompt \
   --catalog-dir dist/catalog \
   --catalog-id https://example.com/catalogs/custom/v1/catalog.json \
   --out dist/a2ui-system-prompt.txt
 ```
 
 When your build already produces TypeDoc JSON, keep the same
-`npx @lynx-js/a2ui-cli` command prefix and pass that file to `generate catalog`:
+`genui a2ui` command prefix and pass that file to `generate catalog`:
 
 ```sh
-npx @lynx-js/a2ui-cli generate catalog \
+genui a2ui generate catalog \
   --typedoc-json typedoc.json \
   --out-dir dist/catalog
 ```
@@ -302,7 +302,7 @@ artifacts with your app package so agent and client deployments stay in sync.
 Your agent service is a backend route in your product, not browser code. It
 should:
 
-- Load the A2UI system prompt generated by `npx @lynx-js/a2ui-cli generate
+- Load the A2UI system prompt generated by `genui a2ui generate
   prompt`.
 - Add conversation history, user intent, and any product state the model needs.
 - Call your model provider from the server.
@@ -398,8 +398,8 @@ import {
   Column,
   Text,
   createMessageStore,
-} from '@lynx-js/a2ui-reactlynx';
-import type { UserActionPayload } from '@lynx-js/a2ui-reactlynx';
+} from '@lynx-js/genui/a2ui';
+import type { UserActionPayload } from '@lynx-js/genui/a2ui';
 
 const store = createMessageStore();
 const catalogs = [Text, Column, Button];
@@ -485,7 +485,7 @@ It should not own:
 Keep the transport small and explicit:
 
 ```ts
-import type { MessageStore, UserActionPayload } from '@lynx-js/a2ui-reactlynx';
+import type { MessageStore, UserActionPayload } from '@lynx-js/genui/a2ui';
 
 interface ConversationContext {
   history: Array<{ role: 'user' | 'assistant' | 'system'; content: string }>;
diff --git a/packages/genui/a2ui/README_zh.md b/packages/genui/a2ui/README_zh.md
index 0097293418..e6ad0b3b2d 100644
--- a/packages/genui/a2ui/README_zh.md
+++ b/packages/genui/a2ui/README_zh.md
@@ -56,12 +56,12 @@ function WeatherCard(props: WeatherCardProps) {
 
 对于正在接入 A2UI 的产品应用,真正需要关注的是这些对外使用面:
 
-| 使用面                    | 作用                                                                                                                                |
-| ------------------------- | ----------------------------------------------------------------------------------------------------------------------------------- |
-| `@lynx-js/a2ui-reactlynx` | 面向 A2UI v0.9 的 ReactLynx 渲染器,提供 ``、`MessageStore`、Catalog API、内置组件和协议辅助能力。                            |
-| `npx @lynx-js/a2ui-cli`   | 构建期命令,用来从 TypeScript 契约生成 catalog artifacts,并为你的 Agent 生成 A2UI system prompt。                                  |
-| 你的 Agent 服务           | 你自己维护的后端。它接收用户 prompt/action,带着 A2UI prompt 和 Catalog 请求模型,校验输出,然后返回 A2UI messages。                |
-| 你的传输层实现            | Client 侧调用 Agent 服务的适配层,负责处理 REST 或流式响应,把 messages 写入 `MessageStore`,并转发 generated UI 中触发的 actions。 |
+| 使用面                | 作用                                                                                                                                |
+| --------------------- | ----------------------------------------------------------------------------------------------------------------------------------- |
+| `@lynx-js/genui/a2ui` | 面向 A2UI v0.9 的 ReactLynx 渲染器,提供 ``、`MessageStore`、Catalog API、内置组件和协议辅助能力。                            |
+| `genui a2ui`          | 构建期命令,用来从 TypeScript 契约生成 catalog artifacts,并为你的 Agent 生成 A2UI system prompt。                                  |
+| 你的 Agent 服务       | 你自己维护的后端。它接收用户 prompt/action,带着 A2UI prompt 和 Catalog 请求模型,校验输出,然后返回 A2UI messages。                |
+| 你的传输层实现        | Client 侧调用 Agent 服务的适配层,负责处理 REST 或流式响应,把 messages 写入 `MessageStore`,并转发 generated UI 中触发的 actions。 |
 
 ## 三个核心部分
 
@@ -107,8 +107,8 @@ Client 负责传输和渲染。它从 Agent 获取消息,把消息写入 `Mess
 在你的 ReactLynx 应用中安装渲染器包,并通过 `npx` 使用 CLI。CLI 需要 Node.js 22 或更新版本。
 
 ```sh
-pnpm add @lynx-js/a2ui-reactlynx
-npx @lynx-js/a2ui-cli --help
+pnpm add @lynx-js/genui
+genui a2ui --help
 ```
 
 后续流程都发生在你的应用里:定义面向 Catalog 的组件契约,生成 catalog artifacts,把生成的 prompt 交给你的 Agent 服务,并在
@@ -149,7 +149,7 @@ ProductTile.displayName = 'ProductTile';
 为 Agent 生成 schema:
 
 ```sh
-npx @lynx-js/a2ui-cli generate catalog --catalog-dir src/catalog --out-dir dist/catalog
+genui a2ui generate catalog --catalog-dir src/catalog --out-dir dist/catalog
 ```
 
 然后把组件和 manifest 配对:
@@ -162,12 +162,12 @@ import {
   createMessageStore,
   defineCatalog,
   serializeCatalog,
-} from '@lynx-js/a2ui-reactlynx';
-import buttonManifest from '@lynx-js/a2ui-reactlynx/catalog/Button/catalog.json'
+} from '@lynx-js/genui/a2ui';
+import buttonManifest from '@lynx-js/genui/a2ui/catalog/Button/catalog.json'
   with { type: 'json' };
-import columnManifest from '@lynx-js/a2ui-reactlynx/catalog/Column/catalog.json'
+import columnManifest from '@lynx-js/genui/a2ui/catalog/Column/catalog.json'
   with { type: 'json' };
-import textManifest from '@lynx-js/a2ui-reactlynx/catalog/Text/catalog.json'
+import textManifest from '@lynx-js/genui/a2ui/catalog/Text/catalog.json'
   with { type: 'json' };
 import productTileManifest from './dist/catalog/ProductTile/catalog.json'
   with { type: 'json' };
@@ -204,22 +204,22 @@ CLI 是 React 源码和 Agent 之间的构建期桥梁。需要稳定、可重
 通过 `npx` 执行公开 CLI 包:
 
 ```sh
-npx @lynx-js/a2ui-cli generate catalog \
+genui a2ui generate catalog \
   --catalog-dir src/catalog \
   --source src/functions \
   --out-dir dist/catalog
 
-npx @lynx-js/a2ui-cli generate prompt \
+genui a2ui generate prompt \
   --catalog-dir dist/catalog \
   --catalog-id https://example.com/catalogs/custom/v1/catalog.json \
   --out dist/a2ui-system-prompt.txt
 ```
 
 如果你的构建流程已经产出 TypeDoc JSON,仍然使用同一个
-`npx @lynx-js/a2ui-cli` 命令前缀,把该文件传给 `generate catalog`:
+`genui a2ui` 命令前缀,把该文件传给 `generate catalog`:
 
 ```sh
-npx @lynx-js/a2ui-cli generate catalog \
+genui a2ui generate catalog \
   --typedoc-json typedoc.json \
   --out-dir dist/catalog
 ```
@@ -265,7 +265,7 @@ Catalog 编写细节:
 
 你的 Agent 服务应该是产品自己的后端路由,而不是浏览器代码。它应该:
 
-- 读取 `npx @lynx-js/a2ui-cli generate prompt` 生成的 A2UI system prompt。
+- 读取 `genui a2ui generate prompt` 生成的 A2UI system prompt。
 - 加入 conversation history、用户意图,以及模型需要的产品状态。
 - 在服务端请求模型供应商。
 - 校验或修复模型输出,再把 A2UI messages 返回给 Client。
@@ -355,8 +355,8 @@ import {
   Column,
   Text,
   createMessageStore,
-} from '@lynx-js/a2ui-reactlynx';
-import type { UserActionPayload } from '@lynx-js/a2ui-reactlynx';
+} from '@lynx-js/genui/a2ui';
+import type { UserActionPayload } from '@lynx-js/genui/a2ui';
 
 const store = createMessageStore();
 const catalogs = [Text, Column, Button];
@@ -438,7 +438,7 @@ GenUI 不限定传输方式。协议消息可以通过 REST、SSE、WebSocket、
 让传输层保持小而明确:
 
 ```ts
-import type { MessageStore, UserActionPayload } from '@lynx-js/a2ui-reactlynx';
+import type { MessageStore, UserActionPayload } from '@lynx-js/genui/a2ui';
 
 interface ConversationContext {
   history: Array<{ role: 'user' | 'assistant' | 'system'; content: string }>;
diff --git a/packages/genui/a2ui/package.json b/packages/genui/a2ui/package.json
index abff77270f..adcfa1898d 100644
--- a/packages/genui/a2ui/package.json
+++ b/packages/genui/a2ui/package.json
@@ -1,5 +1,5 @@
 {
-  "name": "@lynx-js/a2ui-reactlynx",
+  "name": "@lynx-js/genui-a2ui",
   "version": "0.0.0",
   "private": true,
   "license": "Apache-2.0",
@@ -133,7 +133,7 @@
   "types": "./dist/index.d.ts",
   "scripts": {
     "build": "tsc --project tsconfig.build.json && npm run build:catalog",
-    "build:catalog": "a2ui-cli generate catalog --catalog-dir src/catalog --out-dir dist/catalog",
+    "build:catalog": "genui a2ui generate catalog --catalog-dir src/catalog --out-dir dist/catalog && node scripts/writeCatalogManifestIndex.js",
     "test": "rstest"
   },
   "dependencies": {
@@ -141,7 +141,7 @@
     "@preact/signals": "^2.5.1"
   },
   "devDependencies": {
-    "@lynx-js/a2ui-cli": "workspace:*",
+    "@lynx-js/genui-cli": "workspace:*",
     "@lynx-js/lynx-ui": "^3.133.0",
     "@lynx-js/react": "workspace:*",
     "@lynx-js/types": "3.7.0",
diff --git a/packages/genui/a2ui/scripts/writeCatalogManifestIndex.js b/packages/genui/a2ui/scripts/writeCatalogManifestIndex.js
new file mode 100644
index 0000000000..456afc7665
--- /dev/null
+++ b/packages/genui/a2ui/scripts/writeCatalogManifestIndex.js
@@ -0,0 +1,39 @@
+// Copyright 2026 The Lynx Authors. All rights reserved.
+// Licensed under the Apache License Version 2.0 that can be found in the
+// LICENSE file in the root directory of this source tree.
+import fs from 'node:fs';
+import path from 'node:path';
+
+const catalogDir = path.resolve('dist/catalog');
+const indexPath = path.join(catalogDir, 'index.js');
+const marker = 'export const catalogManifests = {};';
+
+const manifests = {};
+for (const entry of fs.readdirSync(catalogDir, { withFileTypes: true })) {
+  if (!entry.isDirectory() || entry.name === 'functions') continue;
+
+  const manifestPath = path.join(catalogDir, entry.name, 'catalog.json');
+  if (!fs.existsSync(manifestPath)) continue;
+
+  manifests[entry.name] = JSON.parse(fs.readFileSync(manifestPath, 'utf8'));
+}
+
+const source = fs.readFileSync(indexPath, 'utf8');
+const replacement = `export const catalogManifests = ${
+  JSON.stringify(manifests, null, 2)
+};\n`;
+const generatedManifestRe =
+  /export const catalogManifests = [\s\S]*?;\n+(?=\/\/ Per-component re-exports|export \{ Button \})/;
+const hasGeneratedManifest = generatedManifestRe.test(source);
+
+if (!source.includes(marker) && !hasGeneratedManifest) {
+  throw new Error(
+    `[a2ui] Could not find catalog manifest marker in ${indexPath}.`,
+  );
+}
+
+const nextSource = source.includes(marker)
+  ? source.replace(marker, replacement)
+  : source.replace(generatedManifestRe, replacement);
+
+fs.writeFileSync(indexPath, nextSource);
diff --git a/packages/genui/a2ui/src/catalog/Button/index.tsx b/packages/genui/a2ui/src/catalog/Button/index.tsx
index 3ee11b6649..0c1bcf4819 100644
--- a/packages/genui/a2ui/src/catalog/Button/index.tsx
+++ b/packages/genui/a2ui/src/catalog/Button/index.tsx
@@ -1,7 +1,7 @@
 // Copyright 2026 The Lynx Authors. All rights reserved.
 // Licensed under the Apache License Version 2.0 that can be found in the
 // LICENSE file in the root directory of this source tree.
-import { A2UIRenderer } from '../../react/A2UIRenderer.jsx';
+import { A2UIRenderer } from '../../react/A2UIRenderer.js';
 import { useChecks } from '../../react/useChecks.js';
 import type { CheckLike } from '../../react/useChecks.js';
 import type { GenericComponentProps } from '../../store/types.js';
diff --git a/packages/genui/a2ui/src/catalog/Card/index.tsx b/packages/genui/a2ui/src/catalog/Card/index.tsx
index 169495244d..d2cf6b25e2 100644
--- a/packages/genui/a2ui/src/catalog/Card/index.tsx
+++ b/packages/genui/a2ui/src/catalog/Card/index.tsx
@@ -1,7 +1,7 @@
 // Copyright 2026 The Lynx Authors. All rights reserved.
 // Licensed under the Apache License Version 2.0 that can be found in the
 // LICENSE file in the root directory of this source tree.
-import { NodeRenderer } from '../../react/A2UIRenderer.jsx';
+import { NodeRenderer } from '../../react/A2UIRenderer.js';
 import type { GenericComponentProps } from '../../store/types.js';
 
 import '../../../styles/catalog/Card.css';
diff --git a/packages/genui/a2ui/src/catalog/Column/index.tsx b/packages/genui/a2ui/src/catalog/Column/index.tsx
index ec815535ca..ee50dfc0c8 100644
--- a/packages/genui/a2ui/src/catalog/Column/index.tsx
+++ b/packages/genui/a2ui/src/catalog/Column/index.tsx
@@ -1,7 +1,7 @@
 // Copyright 2026 The Lynx Authors. All rights reserved.
 // Licensed under the Apache License Version 2.0 that can be found in the
 // LICENSE file in the root directory of this source tree.
-import { NodeRenderer } from '../../react/A2UIRenderer.jsx';
+import { NodeRenderer } from '../../react/A2UIRenderer.js';
 import { useDataBinding } from '../../react/useDataBinding.js';
 import type {
   ComponentInstance,
diff --git a/packages/genui/a2ui/src/catalog/List/index.tsx b/packages/genui/a2ui/src/catalog/List/index.tsx
index e458b76285..d57d62c98f 100755
--- a/packages/genui/a2ui/src/catalog/List/index.tsx
+++ b/packages/genui/a2ui/src/catalog/List/index.tsx
@@ -3,7 +3,7 @@
 // LICENSE file in the root directory of this source tree.
 import type * as v0_9 from '@a2ui/web_core/v0_9';
 
-import { NodeRenderer } from '../../react/A2UIRenderer.jsx';
+import { NodeRenderer } from '../../react/A2UIRenderer.js';
 import { useDataBinding } from '../../react/useDataBinding.js';
 import type { GenericComponentProps } from '../../store/types.js';
 
diff --git a/packages/genui/a2ui/src/catalog/Modal/index.tsx b/packages/genui/a2ui/src/catalog/Modal/index.tsx
index 0ed6f72125..cc89682b4a 100644
--- a/packages/genui/a2ui/src/catalog/Modal/index.tsx
+++ b/packages/genui/a2ui/src/catalog/Modal/index.tsx
@@ -9,7 +9,7 @@ import {
 } from '@lynx-js/lynx-ui';
 import { useState } from '@lynx-js/react';
 
-import { NodeRenderer } from '../../react/A2UIRenderer.jsx';
+import { NodeRenderer } from '../../react/A2UIRenderer.js';
 import type {
   ComponentInstance,
   GenericComponentProps,
diff --git a/packages/genui/a2ui/src/catalog/README.md b/packages/genui/a2ui/src/catalog/README.md
index 1d697e43fd..9b4e1fc651 100644
--- a/packages/genui/a2ui/src/catalog/README.md
+++ b/packages/genui/a2ui/src/catalog/README.md
@@ -18,12 +18,7 @@ the protocol name comes from `displayName ?? component.name`.
 > using the tuple form below — the manifest key is authoritative.
 
 ```tsx
-import {
-  A2UI,
-  Text,
-  Button,
-  createMessageStore,
-} from '@lynx-js/a2ui-reactlynx';
+import { A2UI, Text, Button, createMessageStore } from '@lynx-js/genui/a2ui';
 
 const store = createMessageStore();
 
@@ -51,8 +46,8 @@ If you want `serializeCatalog(...)` to emit JSON Schema for each component
 JSON the extractor emitted at `dist/catalog//catalog.json`:
 
 ```tsx
-import { Text } from '@lynx-js/a2ui-reactlynx/catalog/Text';
-import textManifest from '@lynx-js/a2ui-reactlynx/catalog/Text/catalog.json'
+import { Text } from '@lynx-js/genui/a2ui/catalog/Text';
+import textManifest from '@lynx-js/genui/a2ui/catalog/Text/catalog.json'
   with { type: 'json' };
 
 const catalog = defineCatalog([[Text, textManifest]]);
@@ -86,62 +81,62 @@ import {
   Tabs,
   Text,
   TextField,
-} from '@lynx-js/a2ui-reactlynx';
-import buttonManifest from '@lynx-js/a2ui-reactlynx/catalog/Button/catalog.json' with {
+} from '@lynx-js/genui/a2ui';
+import buttonManifest from '@lynx-js/genui/a2ui/catalog/Button/catalog.json' with {
   type: 'json',
 };
-import cardManifest from '@lynx-js/a2ui-reactlynx/catalog/Card/catalog.json' with {
+import cardManifest from '@lynx-js/genui/a2ui/catalog/Card/catalog.json' with {
   type: 'json',
 };
-import checkBoxManifest from '@lynx-js/a2ui-reactlynx/catalog/CheckBox/catalog.json' with {
+import checkBoxManifest from '@lynx-js/genui/a2ui/catalog/CheckBox/catalog.json' with {
   type: 'json',
 };
-import choicePickerManifest from '@lynx-js/a2ui-reactlynx/catalog/ChoicePicker/catalog.json' with {
+import choicePickerManifest from '@lynx-js/genui/a2ui/catalog/ChoicePicker/catalog.json' with {
   type: 'json',
 };
-import dateTimeInputManifest from '@lynx-js/a2ui-reactlynx/catalog/DateTimeInput/catalog.json' with {
+import dateTimeInputManifest from '@lynx-js/genui/a2ui/catalog/DateTimeInput/catalog.json' with {
   type: 'json',
 };
-import columnManifest from '@lynx-js/a2ui-reactlynx/catalog/Column/catalog.json' with {
+import columnManifest from '@lynx-js/genui/a2ui/catalog/Column/catalog.json' with {
   type: 'json',
 };
-import dividerManifest from '@lynx-js/a2ui-reactlynx/catalog/Divider/catalog.json' with {
+import dividerManifest from '@lynx-js/genui/a2ui/catalog/Divider/catalog.json' with {
   type: 'json',
 };
-import iconManifest from '@lynx-js/a2ui-reactlynx/catalog/Icon/catalog.json' with {
+import iconManifest from '@lynx-js/genui/a2ui/catalog/Icon/catalog.json' with {
   type: 'json',
 };
-import imageManifest from '@lynx-js/a2ui-reactlynx/catalog/Image/catalog.json' with {
+import imageManifest from '@lynx-js/genui/a2ui/catalog/Image/catalog.json' with {
   type: 'json',
 };
-import lineChartManifest from '@lynx-js/a2ui-reactlynx/catalog/LineChart/catalog.json' with {
+import lineChartManifest from '@lynx-js/genui/a2ui/catalog/LineChart/catalog.json' with {
   type: 'json',
 };
-import pieChartManifest from '@lynx-js/a2ui-reactlynx/catalog/PieChart/catalog.json' with {
+import pieChartManifest from '@lynx-js/genui/a2ui/catalog/PieChart/catalog.json' with {
   type: 'json',
 };
-import listManifest from '@lynx-js/a2ui-reactlynx/catalog/List/catalog.json' with {
+import listManifest from '@lynx-js/genui/a2ui/catalog/List/catalog.json' with {
   type: 'json',
 };
-import modalManifest from '@lynx-js/a2ui-reactlynx/catalog/Modal/catalog.json' with {
+import modalManifest from '@lynx-js/genui/a2ui/catalog/Modal/catalog.json' with {
   type: 'json',
 };
-import radioGroupManifest from '@lynx-js/a2ui-reactlynx/catalog/RadioGroup/catalog.json' with {
+import radioGroupManifest from '@lynx-js/genui/a2ui/catalog/RadioGroup/catalog.json' with {
   type: 'json',
 };
-import rowManifest from '@lynx-js/a2ui-reactlynx/catalog/Row/catalog.json' with {
+import rowManifest from '@lynx-js/genui/a2ui/catalog/Row/catalog.json' with {
   type: 'json',
 };
-import sliderManifest from '@lynx-js/a2ui-reactlynx/catalog/Slider/catalog.json' with {
+import sliderManifest from '@lynx-js/genui/a2ui/catalog/Slider/catalog.json' with {
   type: 'json',
 };
-import tabsManifest from '@lynx-js/a2ui-reactlynx/catalog/Tabs/catalog.json' with {
+import tabsManifest from '@lynx-js/genui/a2ui/catalog/Tabs/catalog.json' with {
   type: 'json',
 };
-import textManifest from '@lynx-js/a2ui-reactlynx/catalog/Text/catalog.json' with {
+import textManifest from '@lynx-js/genui/a2ui/catalog/Text/catalog.json' with {
   type: 'json',
 };
-import textFieldManifest from '@lynx-js/a2ui-reactlynx/catalog/TextField/catalog.json' with {
+import textFieldManifest from '@lynx-js/genui/a2ui/catalog/TextField/catalog.json' with {
   type: 'json',
 };
 
@@ -188,7 +183,7 @@ MyChart.displayName = 'MyChart';
 ```
 
 If you want schema introspection for a custom component, generate the
-manifest with `@lynx-js/a2ui-catalog-extractor` against your interface and
+manifest with `@lynx-js/genui/a2ui-catalog-extractor` against your interface and
 pair it the same way:
 
 ```tsx
diff --git a/packages/genui/a2ui/src/catalog/Row/index.tsx b/packages/genui/a2ui/src/catalog/Row/index.tsx
index 9e7ac4c60f..e20dea931b 100755
--- a/packages/genui/a2ui/src/catalog/Row/index.tsx
+++ b/packages/genui/a2ui/src/catalog/Row/index.tsx
@@ -1,7 +1,7 @@
 // Copyright 2026 The Lynx Authors. All rights reserved.
 // Licensed under the Apache License Version 2.0 that can be found in the
 // LICENSE file in the root directory of this source tree.
-import { NodeRenderer } from '../../react/A2UIRenderer.jsx';
+import { NodeRenderer } from '../../react/A2UIRenderer.js';
 import type { GenericComponentProps } from '../../store/types.js';
 
 import '../../../styles/catalog/Row.css';
diff --git a/packages/genui/a2ui/src/catalog/Tabs/index.tsx b/packages/genui/a2ui/src/catalog/Tabs/index.tsx
index 10f69a2528..0957f77159 100644
--- a/packages/genui/a2ui/src/catalog/Tabs/index.tsx
+++ b/packages/genui/a2ui/src/catalog/Tabs/index.tsx
@@ -3,7 +3,7 @@
 // LICENSE file in the root directory of this source tree.
 import { useState } from '@lynx-js/react';
 
-import { NodeRenderer } from '../../react/A2UIRenderer.jsx';
+import { NodeRenderer } from '../../react/A2UIRenderer.js';
 import type { GenericComponentProps, Surface } from '../../store/types.js';
 
 import '../../../styles/catalog/Tabs.css';
diff --git a/packages/genui/a2ui/src/catalog/defineCatalog.ts b/packages/genui/a2ui/src/catalog/defineCatalog.ts
index a79c744d8d..0add07a7e7 100644
--- a/packages/genui/a2ui/src/catalog/defineCatalog.ts
+++ b/packages/genui/a2ui/src/catalog/defineCatalog.ts
@@ -12,7 +12,7 @@ import type { GenericComponentProps } from '../store/types.js';
 
 /**
  * JSON Schema fragment describing a component's props. Produced at build time
- * by `@lynx-js/a2ui-catalog-extractor` from the component's TypeScript
+ * by `@lynx-js/genui/a2ui-catalog-extractor` from the component's TypeScript
  * interface marked with `@a2uiCatalog `. Optional at runtime — entries
  * that ship without a schema serialize to just `{ name }`.
  */
@@ -199,10 +199,10 @@ function resolveComponentInput(input: CatalogInput): ResolvedCatalogEntry {
  * so any `executeFunctionCall` after `defineCatalog` can route to them.
  *
  * @example
- * import { Text, Button } from '@lynx-js/a2ui-reactlynx';
- * import { defineCatalog, defineFunction } from '@lynx-js/a2ui-reactlynx';
- * import { required } from '@lynx-js/a2ui-reactlynx/functions';
- * import textManifest from '@lynx-js/a2ui-reactlynx/catalog/Text/catalog.json'
+ * import { Text, Button } from '@lynx-js/genui/a2ui';
+ * import { defineCatalog, defineFunction } from '@lynx-js/genui/a2ui';
+ * import { required } from '@lynx-js/genui/a2ui/functions';
+ * import textManifest from '@lynx-js/genui/a2ui/catalog/Text/catalog.json'
  *   with { type: 'json' };
  *
  * const catalog = defineCatalog([
diff --git a/packages/genui/a2ui/src/catalog/index.ts b/packages/genui/a2ui/src/catalog/index.ts
index c6c2567966..c4942874ec 100755
--- a/packages/genui/a2ui/src/catalog/index.ts
+++ b/packages/genui/a2ui/src/catalog/index.ts
@@ -1,6 +1,8 @@
 // Copyright 2026 The Lynx Authors. All rights reserved.
 // Licensed under the Apache License Version 2.0 that can be found in the
 // LICENSE file in the root directory of this source tree.
+import type { CatalogManifest } from './defineCatalog.js';
+
 export {
   defineCatalog,
   defineFunction,
@@ -21,26 +23,28 @@ export type {
   SerializedCatalog,
 } from './defineCatalog.js';
 
+export const catalogManifests: Record = {};
+
 // Per-component re-exports so consumers can pick exactly what they need.
 // Each is an independently tree-shakeable ESM re-export — pulling `Text`
 // does not drag `Button` into the bundle.
-export { Button } from './Button/index.jsx';
-export { Card } from './Card/index.jsx';
-export { CheckBox } from './CheckBox/index.jsx';
-export { ChoicePicker } from './ChoicePicker/index.jsx';
-export { DateTimeInput } from './DateTimeInput/index.jsx';
-export { LineChart } from './LineChart/index.jsx';
-export { PieChart } from './PieChart/index.jsx';
-export { Column } from './Column/index.jsx';
-export { Divider } from './Divider/index.jsx';
-export { Icon } from './Icon/index.jsx';
-export { Image } from './Image/index.jsx';
-export { List } from './List/index.jsx';
-export { Modal } from './Modal/index.jsx';
-export { RadioGroup } from './RadioGroup/index.jsx';
-export { Row } from './Row/index.jsx';
-export { Slider } from './Slider/index.jsx';
-export { Tabs } from './Tabs/index.jsx';
-export { Text } from './Text/index.jsx';
-export { TextField } from './TextField/index.jsx';
+export { Button } from './Button/index.js';
+export { Card } from './Card/index.js';
+export { CheckBox } from './CheckBox/index.js';
+export { ChoicePicker } from './ChoicePicker/index.js';
+export { DateTimeInput } from './DateTimeInput/index.js';
+export { LineChart } from './LineChart/index.js';
+export { PieChart } from './PieChart/index.js';
+export { Column } from './Column/index.js';
+export { Divider } from './Divider/index.js';
+export { Icon } from './Icon/index.js';
+export { Image } from './Image/index.js';
+export { List } from './List/index.js';
+export { Modal } from './Modal/index.js';
+export { RadioGroup } from './RadioGroup/index.js';
+export { Row } from './Row/index.js';
+export { Slider } from './Slider/index.js';
+export { Tabs } from './Tabs/index.js';
+export { Text } from './Text/index.js';
+export { TextField } from './TextField/index.js';
 export { DEFAULT_CHART_COLORS, escapeXml, formatValue } from './utils/chart.js';
diff --git a/packages/genui/a2ui/src/index.ts b/packages/genui/a2ui/src/index.ts
index 5ab55e7624..c1b574965b 100644
--- a/packages/genui/a2ui/src/index.ts
+++ b/packages/genui/a2ui/src/index.ts
@@ -80,7 +80,7 @@ export type {
 // Built-in components — re-exported individually so apps can pick exactly
 // what they need:
 //
-//   import { Text, Button } from '@lynx-js/a2ui-reactlynx';
+//   import { Text, Button } from '@lynx-js/genui/a2ui';
 //   
 //
 // There is intentionally no all-in-one aggregate — see
diff --git a/packages/genui/a2ui/src/react/A2UI.tsx b/packages/genui/a2ui/src/react/A2UI.tsx
index a586be08b7..0b988dc31f 100644
--- a/packages/genui/a2ui/src/react/A2UI.tsx
+++ b/packages/genui/a2ui/src/react/A2UI.tsx
@@ -13,9 +13,9 @@ import {
 } from '@lynx-js/react';
 import type { ReactNode } from '@lynx-js/react';
 
-import { A2UIProvider } from './A2UIProvider.jsx';
-import { A2UIRenderer } from './A2UIRenderer.jsx';
-import type { UnsupportedInfo } from './A2UIRenderer.jsx';
+import { A2UIProvider } from './A2UIProvider.js';
+import { A2UIRenderer } from './A2UIRenderer.js';
+import type { UnsupportedInfo } from './A2UIRenderer.js';
 import type { Catalog, CatalogInput } from '../catalog/defineCatalog.js';
 import { defineCatalog } from '../catalog/defineCatalog.js';
 import { MessageProcessor } from '../store/MessageProcessor.js';
@@ -258,7 +258,7 @@ function A2UIImpl(props: A2UIProps): import('@lynx-js/react').ReactNode {
     return renderEmpty?.() ?? null;
   }
 
-  const rendererProps: import('./A2UIRenderer.jsx').A2UIRendererProps = {
+  const rendererProps: import('./A2UIRenderer.js').A2UIRendererProps = {
     resource: activeResource,
   };
   if (className !== undefined) rendererProps.className = className;
diff --git a/packages/genui/a2ui/src/react/index.ts b/packages/genui/a2ui/src/react/index.ts
index df107c2f3e..ea9115c020 100644
--- a/packages/genui/a2ui/src/react/index.ts
+++ b/packages/genui/a2ui/src/react/index.ts
@@ -15,9 +15,9 @@
 // that aggregates input validity — exporting the context now would
 // pre-commit the package to a Provider-based API before there's a real
 // consumer to validate it.
-export { A2UI } from './A2UI.jsx';
-export type { A2UIProps } from './A2UI.jsx';
-export { NodeRenderer } from './A2UIRenderer.jsx';
+export { A2UI } from './A2UI.js';
+export type { A2UIProps } from './A2UI.js';
+export { NodeRenderer } from './A2UIRenderer.js';
 export { useAction } from './useAction.js';
 export type { ActionProps } from './useAction.js';
 export { useDataBinding, useResolvedProps } from './useDataBinding.js';
diff --git a/packages/genui/a2ui/src/react/useA2UIContext.ts b/packages/genui/a2ui/src/react/useA2UIContext.ts
index 2f238992ff..76936f11ba 100644
--- a/packages/genui/a2ui/src/react/useA2UIContext.ts
+++ b/packages/genui/a2ui/src/react/useA2UIContext.ts
@@ -3,8 +3,8 @@
 // LICENSE file in the root directory of this source tree.
 import { useContext } from '@lynx-js/react';
 
-import { A2UIContext } from './A2UIProvider.jsx';
-import type { A2UIInternalContext } from './A2UIProvider.jsx';
+import { A2UIContext } from './A2UIProvider.js';
+import type { A2UIInternalContext } from './A2UIProvider.js';
 
 /**
  * Internal helper used by catalog-component hooks (`useAction`, the
diff --git a/packages/genui/a2ui/tsconfig.build.json b/packages/genui/a2ui/tsconfig.build.json
index f46b0dea72..3ae81e2906 100644
--- a/packages/genui/a2ui/tsconfig.build.json
+++ b/packages/genui/a2ui/tsconfig.build.json
@@ -3,6 +3,7 @@
   "compilerOptions": {
     "noEmit": false,
     "rootDir": "./src",
+    "jsx": "react-jsx",
     "tsBuildInfoFile": "./dist/tsconfig.build.tsbuildinfo",
   },
   "include": ["src"],
diff --git a/packages/genui/cli/AGENTS.md b/packages/genui/cli/AGENTS.md
new file mode 100644
index 0000000000..33dcfe8547
--- /dev/null
+++ b/packages/genui/cli/AGENTS.md
@@ -0,0 +1,27 @@
+# GenUI CLI
+
+Keep this package as the single public CLI entry point for GenUI setup. It should
+orchestrate other packages instead of implementing catalog extraction, prompt
+construction, or future OpenUI workflows itself.
+
+Use namespace-first commands. A2UI commands live under `genui a2ui ...`; future
+OpenUI commands should live under `genui openui ...`.
+
+`genui a2ui generate catalog` should delegate to
+`@lynx-js/genui/a2ui-catalog-extractor`. `genui a2ui generate prompt` should
+delegate to `@lynx-js/genui/a2ui-prompt`.
+
+Do not require users to pass `--catalog-dir` for the common prompt path. A prompt
+without `--catalog-dir` should use the built-in A2UI basic catalog from
+`@lynx-js/genui/a2ui-prompt`; use `--catalog-dir` only for custom generated catalog
+artifacts.
+
+When `--catalog-dir` is provided, empty catalog directories should fail clearly
+instead of producing a prompt with an empty component catalog.
+
+The executable file is `bin/cli.js`; keep `package.json` `bin.genui`,
+`bin.genui-cli`, and compatibility `bin.a2ui-cli` pointed at that path.
+
+When testing local CLI changes, run the bin directly with Node. If testing
+changes in `@lynx-js/genui/a2ui-prompt`, rebuild that package first because this CLI
+imports it through package exports.
diff --git a/packages/genui/a2ui-cli/README.md b/packages/genui/cli/README.md
similarity index 56%
rename from packages/genui/a2ui-cli/README.md
rename to packages/genui/cli/README.md
index 33bc2db4bc..2648c3030a 100644
--- a/packages/genui/a2ui-cli/README.md
+++ b/packages/genui/cli/README.md
@@ -1,21 +1,35 @@
-# A2UI CLI
+# GenUI CLI
 
-`@lynx-js/a2ui-cli` provides one command line entry point for A2UI agent setup.
-It can generate catalog artifacts from TypeScript catalog definitions and build
-a system prompt for an A2UI generation agent.
+`@lynx-js/genui-cli` is the command line entry point for GenUI workflows. It is
+structured by namespace so A2UI commands can live beside future OpenUI commands
+without adding another package or binary.
 
 ## Usage
 
+```bash
+genui   [options]
+```
+
+Available namespaces:
+
+- `a2ui`: generate A2UI catalog artifacts and system prompts.
+- `openui`: reserved for future OpenUI workflows.
+
+The package also exposes `genui-cli` as an alias. `a2ui-cli` remains available as
+a compatibility alias for existing A2UI-only scripts.
+
+## A2UI Commands
+
 Generate a system prompt with the built-in A2UI basic catalog:
 
 ```bash
-npx @lynx-js/a2ui-cli generate prompt --out dist/a2ui-system-prompt.txt
+genui a2ui generate prompt --out dist/a2ui-system-prompt.txt
 ```
 
 Generate catalog artifacts for a custom catalog:
 
 ```bash
-npx @lynx-js/a2ui-cli generate catalog \
+genui a2ui generate catalog \
   --catalog-dir src/catalog \
   --source src/functions \
   --out-dir dist/catalog
@@ -24,7 +38,7 @@ npx @lynx-js/a2ui-cli generate catalog \
 Generate a system prompt for a custom catalog:
 
 ```bash
-npx @lynx-js/a2ui-cli generate prompt \
+genui a2ui generate prompt \
   --catalog-dir dist/catalog \
   --catalog-id https://example.com/catalogs/custom/v1/catalog.json \
   --out dist/a2ui-system-prompt.txt
@@ -35,12 +49,9 @@ npx @lynx-js/a2ui-cli generate prompt \
 artifacts. When `--catalog-dir` is provided, the directory must contain files
 like `/catalog.json`.
 
-## Commands
+### `genui a2ui generate catalog`
 
-### `generate catalog`
-
-Uses the internal `@lynx-js/a2ui-catalog-extractor` engine. Keep user-facing
-scripts on `npx @lynx-js/a2ui-cli generate catalog`.
+Delegates catalog extraction to `@lynx-js/genui/a2ui-catalog-extractor`.
 
 Useful options:
 
@@ -52,9 +63,9 @@ Useful options:
 - `--out-dir `: output directory for generated catalog artifacts. Defaults
   to `dist/catalog`.
 
-### `generate prompt`
+### `genui a2ui generate prompt`
 
-Delegates prompt construction to `@lynx-js/a2ui-prompt`.
+Delegates prompt construction to `@lynx-js/genui/a2ui-prompt`.
 
 Useful options:
 
@@ -64,3 +75,14 @@ Useful options:
   Defaults to the built-in A2UI basic catalog id.
 - `--out `: write the prompt to a file instead of stdout.
 - `--appendix `: append extra instructions to the generated prompt.
+
+## Compatibility
+
+Existing A2UI commands still work:
+
+```bash
+a2ui-cli generate catalog --catalog-dir src/catalog --out-dir dist/catalog
+a2ui-cli generate prompt --out dist/a2ui-system-prompt.txt
+```
+
+New scripts should prefer `genui a2ui ...`.
diff --git a/packages/genui/a2ui-cli/bin/cli.js b/packages/genui/cli/bin/cli.js
similarity index 60%
rename from packages/genui/a2ui-cli/bin/cli.js
rename to packages/genui/cli/bin/cli.js
index 4b233ecae0..f6ecb62951 100755
--- a/packages/genui/a2ui-cli/bin/cli.js
+++ b/packages/genui/cli/bin/cli.js
@@ -5,15 +5,33 @@
 import * as fs from 'node:fs';
 import { createRequire } from 'node:module';
 import * as path from 'node:path';
+import { pathToFileURL } from 'node:url';
 
-const usage = `Usage: a2ui-cli generate  [options]
+const usage = `Usage: genui   [options]
+
+Namespaces:
+  a2ui    Generate A2UI catalog artifacts and system prompts.
+  openui  Reserved for future OpenUI workflows.
+
+Examples:
+  genui a2ui generate catalog --catalog-dir src/catalog --out-dir dist/catalog
+  genui a2ui generate prompt --out dist/a2ui-system-prompt.txt
+`;
+
+const a2uiUsage = `Usage: genui a2ui generate  [options]
 
 Targets:
   catalog  Generate A2UI component and function catalog files.
   prompt   Generate an A2UI system prompt from catalog files.
 `;
 
-const generateCatalogUsage = `Usage: a2ui-cli generate catalog [options]
+const openuiUsage = `Usage: genui openui  [options]
+
+OpenUI CLI commands are reserved for future GenUI workflows.
+`;
+
+function createGenerateCatalogUsage(programName) {
+  return `Usage: ${programName} generate catalog [options]
 
 Options:
   --catalog-dir   Directory to scan for TypeScript catalog interfaces.
@@ -29,8 +47,10 @@ Defaults:
   --catalog-dir src/catalog
   --out-dir dist/catalog
 `;
+}
 
-const generatePromptUsage = `Usage: a2ui-cli generate prompt [options]
+function createGeneratePromptUsage(programName) {
+  return `Usage: ${programName} generate prompt [options]
 
 Options:
   --catalog-dir   Directory containing generated catalog files. When
@@ -44,15 +64,25 @@ Options:
 Defaults:
   --catalog-id built-in A2UI basic catalog id
 `;
+}
 
-try {
-  process.exitCode = await runCli(process.argv.slice(2));
-} catch (error) {
-  console.error(error instanceof Error ? error.message : String(error));
-  process.exitCode = 1;
+if (isMain(import.meta.url)) {
+  try {
+    process.exitCode = await runCli(process.argv.slice(2), process.cwd(), {
+      binName: path.basename(process.argv[1] ?? 'genui'),
+    });
+  } catch (error) {
+    console.error(error instanceof Error ? error.message : String(error));
+    process.exitCode = 1;
+  }
 }
 
-async function runCli(args, cwd = process.cwd()) {
+export async function runCli(args, cwd = process.cwd(), cliOptions = {}) {
+  const binName = cliOptions.binName ?? 'genui';
+  if (binName === 'a2ui-cli') {
+    return await runA2UICli(args, cwd, { programName: 'a2ui-cli' });
+  }
+
   const command = args[0];
   if (command === undefined || command === '--help' || command === '-h') {
     console.info(usage);
@@ -62,14 +92,35 @@ async function runCli(args, cwd = process.cwd()) {
     printPackageVersion();
     return 0;
   }
-  if (command !== 'generate') {
-    throw new Error(`Unknown command: ${command}`);
+
+  if (command === 'a2ui') {
+    return await runA2UICli(args.slice(1), cwd, { programName: 'genui a2ui' });
   }
+  if (command === 'openui') {
+    return runOpenUICli(args.slice(1));
+  }
+
+  throw new Error(`Unknown namespace: ${command}`);
+}
 
+async function runA2UICli(args, cwd, options) {
+  const programName = options.programName;
+  const command = args[0];
+  if (command === undefined || command === '--help' || command === '-h') {
+    console.info(programName === 'a2ui-cli' ? legacyA2UIUsage : a2uiUsage);
+    return 0;
+  }
+  if (command === '--version' || command === '-v') {
+    printPackageVersion();
+    return 0;
+  }
+  if (command !== 'generate') {
+    throw new Error(`Unknown A2UI command: ${command}`);
+  }
   const target = args[1];
   const targetArgs = args.slice(2);
   if (target === undefined || target === '--help' || target === '-h') {
-    console.info(usage);
+    console.info(programName === 'a2ui-cli' ? legacyA2UIUsage : a2uiUsage);
     return 0;
   }
   if (target === '--version' || target === '-v') {
@@ -78,24 +129,42 @@ async function runCli(args, cwd = process.cwd()) {
   }
   if (target === 'catalog') {
     if (targetArgs.includes('--help') || targetArgs.includes('-h')) {
-      console.info(generateCatalogUsage);
+      console.info(createGenerateCatalogUsage(programName));
       return 0;
     }
     const { runCli: runCatalogExtractorCli } = await import(
-      '@lynx-js/a2ui-catalog-extractor/cli'
+      '../../a2ui-catalog-extractor/dist/cli.js'
     );
     return await runCatalogExtractorCli(targetArgs, cwd);
   }
   if (target === 'prompt') {
-    return runGeneratePromptCli(targetArgs, cwd);
+    return runGeneratePromptCli(targetArgs, cwd, { programName });
   }
   throw new Error(`Unknown generate target: ${target}`);
 }
 
-async function runGeneratePromptCli(args, cwd = process.cwd()) {
+const legacyA2UIUsage = a2uiUsage.replaceAll('genui a2ui', 'a2ui-cli');
+
+function runOpenUICli(args) {
+  const command = args[0];
+  if (command === undefined || command === '--help' || command === '-h') {
+    console.info(openuiUsage);
+    return 0;
+  }
+  if (command === '--version' || command === '-v') {
+    printPackageVersion();
+    return 0;
+  }
+  throw new Error(
+    `Unknown OpenUI command: ${command}. OpenUI CLI commands are not available yet.`,
+  );
+}
+
+async function runGeneratePromptCli(args, cwd, cliOptions) {
+  const programName = cliOptions.programName;
   const options = parseGeneratePromptArgs(args);
   if (options.help) {
-    console.info(generatePromptUsage);
+    console.info(createGeneratePromptUsage(programName));
     return 0;
   }
   if (options.version) {
@@ -108,7 +177,7 @@ async function runGeneratePromptCli(args, cwd = process.cwd()) {
     BASIC_CATALOG_ID,
     buildA2UISystemPrompt,
     readA2UICatalogFromDirectory,
-  } = await import('@lynx-js/a2ui-prompt');
+  } = await import('../../a2ui-prompt/dist/index.js');
   const catalog = options.catalogDir
     ? readA2UICatalogFromDirectory({
       catalogDir: options.catalogDir,
@@ -120,7 +189,7 @@ async function runGeneratePromptCli(args, cwd = process.cwd()) {
       : undefined);
   if (options.catalogDir && catalog && isEmptyCatalog(catalog)) {
     throw new Error(
-      `[a2ui-cli] No components or functions found in generated catalog directory: ${options.catalogDir}`,
+      `[${programName}] No components or functions found in generated catalog directory: ${options.catalogDir}`,
     );
   }
   const systemPrompt = buildA2UISystemPrompt({
@@ -195,3 +264,11 @@ function printPackageVersion() {
   const packageJson = require('../package.json');
   console.info(packageJson.version);
 }
+
+function isMain(moduleUrl) {
+  if (process.argv[1] === undefined) {
+    return false;
+  }
+
+  return moduleUrl === pathToFileURL(fs.realpathSync(process.argv[1])).href;
+}
diff --git a/packages/genui/cli/package.json b/packages/genui/cli/package.json
new file mode 100644
index 0000000000..b5daf31d63
--- /dev/null
+++ b/packages/genui/cli/package.json
@@ -0,0 +1,29 @@
+{
+  "name": "@lynx-js/genui-cli",
+  "version": "0.0.0",
+  "private": true,
+  "description": "CLI for GenUI workflows.",
+  "repository": {
+    "type": "git",
+    "url": "https://github.com/lynx-family/lynx-stack.git",
+    "directory": "packages/genui/cli"
+  },
+  "license": "Apache-2.0",
+  "type": "module",
+  "bin": {
+    "a2ui-cli": "./bin/cli.js",
+    "genui": "./bin/cli.js",
+    "genui-cli": "./bin/cli.js"
+  },
+  "files": [
+    "bin",
+    "README.md"
+  ],
+  "dependencies": {
+    "@lynx-js/genui-a2ui-catalog-extractor": "workspace:*",
+    "@lynx-js/genui-a2ui-prompt": "workspace:*"
+  },
+  "engines": {
+    "node": ">=22"
+  }
+}
diff --git a/packages/genui/index.ts b/packages/genui/index.ts
new file mode 100644
index 0000000000..0ab8d46522
--- /dev/null
+++ b/packages/genui/index.ts
@@ -0,0 +1,114 @@
+// Copyright 2026 The Lynx Authors. All rights reserved.
+// Licensed under the Apache License Version 2.0 that can be found in the
+// LICENSE file in the root directory of this source tree.
+
+export {
+  A2UI,
+  NodeRenderer,
+  useAction,
+  useChecks,
+  useDataBinding,
+  useResolvedProps,
+} from '@lynx-js/genui/a2ui/react';
+export type {
+  A2UIProps,
+  ActionProps,
+  CheckLike,
+} from '@lynx-js/genui/a2ui/react';
+export {
+  createFallbackMessagesFromPlainText,
+  createMessageStore,
+  createResource,
+  createTextCardMessages,
+  executeFunctionCall,
+  FunctionRegistry,
+  functionRegistry,
+  isDataBinding,
+  isFunctionCall,
+  MessageProcessor,
+  normalizePayloadToMessages,
+  prepareMessagesForProcessing,
+  resolveDynamicValue,
+  resolveFunctionArguments,
+  SignalStore,
+} from '@lynx-js/genui/a2ui/store';
+export type {
+  A2UIClientEventMessage,
+  A2UIEvent,
+  ComponentInstance,
+  FunctionCallContext,
+  FunctionEntry,
+  FunctionImpl,
+  GenericComponentProps,
+  MessageStore,
+  MessageStoreOptions,
+  RawResource,
+  ResolveFunctionOptions,
+  Resource,
+  ResourceInfo,
+  ResourceStatus,
+  ServerToClientMessage,
+  Surface,
+  SurfaceId,
+  UserActionPayload,
+} from '@lynx-js/genui/a2ui/store';
+export {
+  basicFunctions,
+  registerBasicFunctions,
+} from '@lynx-js/genui/a2ui/functions';
+export * from '@lynx-js/genui/openui';
+export {
+  A2UI_PROTOCOL_VERSION,
+  A2UI_SYSTEM_PROMPT,
+  BASIC_CATALOG,
+  BASIC_CATALOG_EXAMPLES,
+  BASIC_CATALOG_ID,
+  buildA2UISystemPrompt,
+  createA2UICatalogFromManifests,
+  readA2UICatalogFromDirectory,
+  renderCatalogReference,
+} from '@lynx-js/genui/a2ui-prompt';
+export type {
+  A2UICatalog as A2UIPromptCatalog,
+  A2UIComponentProp,
+  A2UIComponentSpec,
+  A2UIExample,
+  A2UIFunctionSpec,
+  BuildSystemPromptOptions,
+  JsonSchema as A2UIPromptJsonSchema,
+  ReadA2UICatalogDirectoryOptions,
+} from '@lynx-js/genui/a2ui-prompt';
+export {
+  createA2UICatalog,
+  extractCatalogComponents,
+  extractCatalogComponentsFromTypeDocJson,
+  extractCatalogComponentsFromTypeDocProject,
+  extractCatalogFunctions,
+  extractCatalogFunctionsFromTypeDocJson,
+  extractCatalogFunctionsFromTypeDocProject,
+  findCatalogSourceFiles,
+  writeCatalogArtifacts,
+  writeCatalogComponents,
+  writeCatalogFunctionDefinitions,
+  writeCatalogFunctions,
+  writeComponentCatalogs,
+} from '@lynx-js/genui/a2ui-catalog-extractor';
+export type {
+  A2UICatalog as ExtractedA2UICatalog,
+  CatalogArtifacts,
+  CatalogComponent as ExtractedCatalogComponent,
+  CatalogFunction,
+  ExtractCatalogFromTypeDocOptions,
+  ExtractCatalogOptions,
+  FunctionDefinition,
+  JsonSchema as ExtractedJsonSchema,
+  TypeDocComment,
+  TypeDocCommentDisplayPart,
+  TypeDocCommentTag,
+  TypeDocProject,
+  TypeDocReflection,
+  TypeDocSignature,
+  TypeDocSource,
+  TypeDocType,
+  WriteComponentCatalogOptions,
+} from '@lynx-js/genui/a2ui-catalog-extractor';
diff --git a/packages/genui/openui/README.md b/packages/genui/openui/README.md
index 0f8969cceb..6a2b8e201f 100644
--- a/packages/genui/openui/README.md
+++ b/packages/genui/openui/README.md
@@ -1,4 +1,4 @@
-# @lynx-js/openui-reactlynx
+# @lynx-js/genui/openui
 
 ReactLynx renderer for the [OpenUI DSL](https://www.openui.com/). Parses
 OpenUI functional notation into a renderable tree and renders it via a
@@ -17,9 +17,9 @@ This package includes:
 
 ## Exports
 
-- `@lynx-js/openui-reactlynx`: `createOpenUiLibrary`, `defineComponent`,
+- `@lynx-js/genui/openui`: `createOpenUiLibrary`, `defineComponent`,
   `OpenUiRenderer`, parser utilities, and all core types.
-- `@lynx-js/openui-reactlynx/catalog`: re-exports of built-in catalog
+- `@lynx-js/genui/openui/catalog`: re-exports of built-in catalog
   components for tree-shake-friendly subpath access.
 
 ## Installation
@@ -29,7 +29,7 @@ Make sure your app provides the peer dependencies:
 - `@lynx-js/react`
 
 ```bash
-pnpm add @lynx-js/openui-reactlynx
+pnpm add @lynx-js/genui
 ```
 
 ## Quick Start
@@ -44,8 +44,8 @@ import {
   createOpenUiLibrary,
   createStreamingParser,
   OpenUiRenderer,
-} from '@lynx-js/openui-reactlynx';
-import type { ParseResult } from '@lynx-js/openui-reactlynx';
+} from '@lynx-js/genui/openui';
+import type { ParseResult } from '@lynx-js/genui/openui';
 import { useEffect, useMemo, useState } from '@lynx-js/react';
 
 const library = createOpenUiLibrary();
@@ -95,8 +95,8 @@ import {
   createOpenUiLibrary,
   createStreamingParser,
   OpenUiRenderer,
-} from '@lynx-js/openui-reactlynx';
-import type { ParseResult } from '@lynx-js/openui-reactlynx';
+} from '@lynx-js/genui/openui';
+import type { ParseResult } from '@lynx-js/genui/openui';
 import { useEffect, useMemo, useRef, useState } from '@lynx-js/react';
 
 const CHUNK_SIZE = 8;
@@ -151,10 +151,7 @@ object. Provided `components` and `componentGroups` are **merged** with
 the built-in defaults (appended after the defaults):
 
 ```tsx
-import {
-  createOpenUiLibrary,
-  defineComponent,
-} from '@lynx-js/openui-reactlynx';
+import { createOpenUiLibrary, defineComponent } from '@lynx-js/genui/openui';
 import { z } from 'zod/v4';
 
 const MyBanner = defineComponent({
diff --git a/packages/genui/openui/package.json b/packages/genui/openui/package.json
index f8ff189b68..9e8e10f52c 100644
--- a/packages/genui/openui/package.json
+++ b/packages/genui/openui/package.json
@@ -1,6 +1,7 @@
 {
-  "name": "@lynx-js/openui-reactlynx",
+  "name": "@lynx-js/genui-openui",
   "version": "0.0.1",
+  "private": true,
   "repository": {
     "type": "git",
     "url": "git+https://github.com/lynx-family/lynx-stack.git",
diff --git a/packages/genui/openui/src/core/renderer.tsx b/packages/genui/openui/src/core/renderer.tsx
index cfa054c7ab..1af2a30699 100644
--- a/packages/genui/openui/src/core/renderer.tsx
+++ b/packages/genui/openui/src/core/renderer.tsx
@@ -25,8 +25,6 @@ import type { Library, RenderOutput } from './library.js';
 import { keyFrom } from './utils.js';
 import type { LegacyActionConfig } from '../catalog/Action/index.jsx';
 
-import './renderer.css';
-
 export type { Library, RenderOutput };
 
 interface FieldEntry {
diff --git a/packages/genui/package.json b/packages/genui/package.json
new file mode 100644
index 0000000000..593e6a8d2d
--- /dev/null
+++ b/packages/genui/package.json
@@ -0,0 +1,127 @@
+{
+  "name": "@lynx-js/genui",
+  "version": "0.0.1",
+  "description": "Generative UI for Lynx.",
+  "repository": {
+    "type": "git",
+    "url": "https://github.com/lynx-family/lynx-stack.git",
+    "directory": "packages/genui"
+  },
+  "license": "Apache-2.0",
+  "sideEffects": [
+    "**/*.css"
+  ],
+  "type": "module",
+  "exports": {
+    ".": {
+      "types": "./dist/index.d.ts",
+      "default": "./dist/index.js"
+    },
+    "./a2ui/styles/theme.css": "./a2ui/styles/theme.css",
+    "./a2ui": {
+      "types": "./a2ui/dist/index.d.ts",
+      "default": "./a2ui/dist/index.js"
+    },
+    "./a2ui/0.9": {
+      "types": "./a2ui/dist/index.d.ts",
+      "default": "./a2ui/dist/index.js"
+    },
+    "./a2ui/store": {
+      "types": "./a2ui/dist/store/index.d.ts",
+      "default": "./a2ui/dist/store/index.js"
+    },
+    "./a2ui/catalog": {
+      "types": "./a2ui/dist/catalog/index.d.ts",
+      "default": "./a2ui/dist/catalog/index.js"
+    },
+    "./a2ui/react": {
+      "types": "./a2ui/dist/react/index.d.ts",
+      "default": "./a2ui/dist/react/index.js"
+    },
+    "./a2ui/functions": {
+      "types": "./a2ui/dist/functions/index.d.ts",
+      "default": "./a2ui/dist/functions/index.js"
+    },
+    "./genui-cli": "./cli/bin/cli.js",
+    "./a2ui-prompt": {
+      "types": "./a2ui-prompt/dist/index.d.ts",
+      "default": "./a2ui-prompt/dist/index.js"
+    },
+    "./a2ui-catalog-extractor": {
+      "types": "./a2ui-catalog-extractor/dist/index.d.ts",
+      "default": "./a2ui-catalog-extractor/dist/index.js"
+    },
+    "./a2ui-catalog-extractor/cli": {
+      "types": "./a2ui-catalog-extractor/dist/cli.d.ts",
+      "default": "./a2ui-catalog-extractor/dist/cli.js"
+    },
+    "./a2ui-catalog-extractor/skill": "./a2ui-catalog-extractor/skills/a2ui-catalog-extractor/SKILL.md",
+    "./openui": {
+      "types": "./openui/dist/core/index.d.ts",
+      "default": "./openui/dist/core/index.js"
+    },
+    "./openui/catalog": {
+      "types": "./openui/dist/catalog/index.d.ts",
+      "default": "./openui/dist/catalog/index.js"
+    },
+    "./openui/styles/renderer.css": "./openui/dist/core/renderer.css"
+  },
+  "main": "./dist/index.js",
+  "types": "./dist/index.d.ts",
+  "bin": {
+    "a2ui-catalog-extractor": "./a2ui-catalog-extractor/bin/a2ui-catalog-extractor.js",
+    "a2ui-cli": "./cli/bin/cli.js",
+    "genui": "./cli/bin/cli.js",
+    "genui-cli": "./cli/bin/cli.js"
+  },
+  "files": [
+    "index.ts",
+    "dist",
+    "a2ui/dist",
+    "a2ui/styles",
+    "a2ui/README.md",
+    "cli/bin",
+    "cli/README.md",
+    "a2ui-prompt/dist",
+    "a2ui-prompt/README.md",
+    "a2ui-catalog-extractor/bin",
+    "a2ui-catalog-extractor/dist",
+    "a2ui-catalog-extractor/skills",
+    "a2ui-catalog-extractor/README.md",
+    "openui/dist",
+    "openui/README.md"
+  ],
+  "scripts": {
+    "build": "pnpm run clean && pnpm --dir a2ui-catalog-extractor build && pnpm --dir a2ui-prompt build && pnpm --dir openui build && pnpm --dir a2ui build && tsc --project tsconfig.build.json",
+    "clean": "node -e \"const fs=require('node:fs'); for (const path of ['dist','a2ui/dist','a2ui/tsconfig.build.tsbuildinfo','a2ui-catalog-extractor/dist','a2ui-prompt/dist','openui/dist','openui/tsconfig.build.tsbuildinfo']) fs.rmSync(path,{recursive:true,force:true});\""
+  },
+  "dependencies": {
+    "@a2ui/web_core": "0.9.1",
+    "@openuidev/lang-core": "^0.2.4",
+    "@preact/signals": "^2.5.1",
+    "typedoc": "^0.28.19",
+    "zod": "^3.25.76"
+  },
+  "devDependencies": {
+    "@lynx-js/genui-a2ui": "workspace:*",
+    "@lynx-js/genui-a2ui-catalog-extractor": "workspace:*",
+    "@lynx-js/genui-a2ui-prompt": "workspace:*",
+    "@lynx-js/genui-cli": "workspace:*",
+    "@lynx-js/genui-openui": "workspace:*"
+  },
+  "peerDependencies": {
+    "@lynx-js/lynx-ui": "^3.133.0",
+    "@lynx-js/react": "^0.121.0"
+  },
+  "peerDependenciesMeta": {
+    "@lynx-js/lynx-ui": {
+      "optional": true
+    }
+  },
+  "engines": {
+    "node": ">=22"
+  },
+  "publishConfig": {
+    "access": "public"
+  }
+}
diff --git a/packages/genui/tsconfig.build.json b/packages/genui/tsconfig.build.json
new file mode 100644
index 0000000000..4fc1c3e0ec
--- /dev/null
+++ b/packages/genui/tsconfig.build.json
@@ -0,0 +1,10 @@
+{
+  "extends": "./tsconfig.json",
+  "compilerOptions": {
+    "noEmit": false,
+    "declaration": true,
+    "outDir": "./dist",
+    "rootDir": ".",
+  },
+  "include": ["index.ts"],
+}
diff --git a/packages/genui/tsconfig.json b/packages/genui/tsconfig.json
index ad7396c501..9a2dd5d6d6 100644
--- a/packages/genui/tsconfig.json
+++ b/packages/genui/tsconfig.json
@@ -7,14 +7,6 @@
     "lib": ["DOM", "ESNext"],
     "moduleResolution": "Bundler",
   },
-  "references": [
-    /** packages-start */
-    { "path": "./a2ui-catalog-extractor/tsconfig.json" },
-    { "path": "./a2ui-prompt/tsconfig.json" },
-    { "path": "./a2ui/tsconfig.build.json" },
-    { "path": "./openui/tsconfig.json" },
-    { "path": "./ui-judge/tsconfig.json" },
-    /** packages-end */
-  ],
+  "references": [],
   "include": [],
 }
diff --git a/packages/genui/turbo.json b/packages/genui/turbo.json
new file mode 100644
index 0000000000..6c7c8c96e9
--- /dev/null
+++ b/packages/genui/turbo.json
@@ -0,0 +1,40 @@
+{
+  "$schema": "https://turbo.build/schema.json",
+  "extends": ["//"],
+  "tasks": {
+    "build": {
+      "inputs": [
+        "index.ts",
+        "package.json",
+        "tsconfig.json",
+        "tsconfig.build.json",
+        "a2ui/src/**",
+        "a2ui/styles/**",
+        "a2ui/package.json",
+        "a2ui/tsconfig.json",
+        "a2ui/tsconfig.build.json",
+        "a2ui-catalog-extractor/src/**",
+        "a2ui-catalog-extractor/bin/**",
+        "a2ui-catalog-extractor/package.json",
+        "a2ui-catalog-extractor/tsconfig.json",
+        "a2ui-catalog-extractor/tsconfig.build.json",
+        "a2ui-prompt/src/**",
+        "a2ui-prompt/package.json",
+        "a2ui-prompt/rslib.config.ts",
+        "a2ui-prompt/tsconfig.json",
+        "a2ui-prompt/tsconfig.build.json",
+        "openui/src/**",
+        "openui/package.json",
+        "openui/tsconfig.json",
+        "openui/tsconfig.build.json"
+      ],
+      "outputs": [
+        "dist/**",
+        "a2ui/dist/**",
+        "a2ui-catalog-extractor/dist/**",
+        "a2ui-prompt/dist/**",
+        "openui/dist/**"
+      ]
+    }
+  }
+}
diff --git a/packages/genui/ui-judge/package.json b/packages/genui/ui-judge/package.json
index 8e1af0d382..f875fe253b 100644
--- a/packages/genui/ui-judge/package.json
+++ b/packages/genui/ui-judge/package.json
@@ -20,13 +20,16 @@
   ],
   "scripts": {
     "build": "rslib build",
-    "test": "playwright test"
+    "test": "pnpm --dir ../a2ui-catalog-extractor build && pnpm --dir ../a2ui build && playwright test"
   },
   "dependencies": {
+    "@lynx-js/genui": "workspace:*",
     "@midscene/web": "^1.8.0",
     "@playwright/test": "^1.58.2"
   },
   "devDependencies": {
+    "@lynx-js/genui-a2ui": "workspace:*",
+    "@lynx-js/genui-a2ui-catalog-extractor": "workspace:*",
     "@types/node": "^24.10.13"
   },
   "engines": {
diff --git a/packages/genui/ui-judge/tests/helpers/playground-preview-server.ts b/packages/genui/ui-judge/tests/helpers/playground-preview-server.ts
index 41e4e63287..1b3dcffa4a 100644
--- a/packages/genui/ui-judge/tests/helpers/playground-preview-server.ts
+++ b/packages/genui/ui-judge/tests/helpers/playground-preview-server.ts
@@ -152,7 +152,7 @@ function assertPlaygroundPrerequisites(): void {
 
   const formatted = missing.map((artifact) => `- ${artifact}`).join('\n');
   throw new Error(
-    `Missing A2UI catalog artifacts required by the playground preview server:\n${formatted}\n\nRun \`pnpm --filter @lynx-js/a2ui-reactlynx build\` before starting @lynx-js/ui-judge model-backed tests.`,
+    `Missing A2UI catalog artifacts required by the playground preview server:\n${formatted}\n\nRun \`pnpm -C packages/genui/a2ui build\` before starting @lynx-js/ui-judge model-backed tests.`,
   );
 }
 
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 4563f3c2fe..9774801763 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -36,6 +36,7 @@ catalogs:
       version: 0.2.0
 
 overrides:
+  '@lynx-js/react': workspace:*
   '@rspack/core': 2.0.3
   '@rsbuild/core>@rspack/core': 2.0.3
   '@rsdoctor/rspack-plugin>@rspack/core': 2.0.3
@@ -596,6 +597,46 @@ importers:
 
   packages/background-only: {}
 
+  packages/genui:
+    dependencies:
+      '@a2ui/web_core':
+        specifier: 0.9.1
+        version: 0.9.1
+      '@lynx-js/lynx-ui':
+        specifier: ^3.133.0
+        version: 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
+      '@lynx-js/react':
+        specifier: workspace:*
+        version: link:../react
+      '@openuidev/lang-core':
+        specifier: ^0.2.4
+        version: 0.2.4(@modelcontextprotocol/sdk@1.25.2(hono@4.12.12)(zod@3.25.76))(zod@3.25.76)
+      '@preact/signals':
+        specifier: ^2.5.1
+        version: 2.5.1(preact@10.29.1)
+      typedoc:
+        specifier: ^0.28.19
+        version: 0.28.19(typescript@5.9.3)
+      zod:
+        specifier: ^3.25.76
+        version: 3.25.76
+    devDependencies:
+      '@lynx-js/genui-a2ui':
+        specifier: workspace:*
+        version: link:a2ui
+      '@lynx-js/genui-a2ui-catalog-extractor':
+        specifier: workspace:*
+        version: link:a2ui-catalog-extractor
+      '@lynx-js/genui-a2ui-prompt':
+        specifier: workspace:*
+        version: link:a2ui-prompt
+      '@lynx-js/genui-cli':
+        specifier: workspace:*
+        version: link:cli
+      '@lynx-js/genui-openui':
+        specifier: workspace:*
+        version: link:openui
+
   packages/genui/a2ui:
     dependencies:
       '@a2ui/web_core':
@@ -605,9 +646,9 @@ importers:
         specifier: ^2.5.1
         version: 2.5.1(preact@10.29.1)
     devDependencies:
-      '@lynx-js/a2ui-cli':
+      '@lynx-js/genui-cli':
         specifier: workspace:*
-        version: link:../a2ui-cli
+        version: link:../cli
       '@lynx-js/lynx-ui':
         specifier: ^3.133.0
         version: 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@18.3.28)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
@@ -637,32 +678,20 @@ importers:
         specifier: ^24.10.13
         version: 24.10.13
 
-  packages/genui/a2ui-cli:
-    dependencies:
-      '@lynx-js/a2ui-catalog-extractor':
-        specifier: workspace:*
-        version: link:../a2ui-catalog-extractor
-      '@lynx-js/a2ui-prompt':
-        specifier: workspace:*
-        version: link:../a2ui-prompt
-
   packages/genui/a2ui-playground:
     dependencies:
       '@codemirror/lang-json':
         specifier: ^6.0.2
         version: 6.0.2
-      '@lynx-js/a2ui-reactlynx':
+      '@lynx-js/genui':
         specifier: workspace:*
-        version: link:../a2ui
+        version: link:..
       '@lynx-js/luna-styles':
         specifier: 0.1.0
         version: 0.1.0
       '@lynx-js/lynx-core':
         specifier: 0.1.3
         version: 0.1.3
-      '@lynx-js/openui-reactlynx':
-        specifier: workspace:*
-        version: link:../openui
       '@lynx-js/react':
         specifier: workspace:*
         version: link:../../react
@@ -728,6 +757,15 @@ importers:
         specifier: ^24.10.13
         version: 24.10.13
 
+  packages/genui/cli:
+    dependencies:
+      '@lynx-js/genui-a2ui-catalog-extractor':
+        specifier: workspace:*
+        version: link:../a2ui-catalog-extractor
+      '@lynx-js/genui-a2ui-prompt':
+        specifier: workspace:*
+        version: link:../a2ui-prompt
+
   packages/genui/openui:
     dependencies:
       '@openuidev/lang-core':
@@ -783,6 +821,9 @@ importers:
 
   packages/genui/ui-judge:
     dependencies:
+      '@lynx-js/genui':
+        specifier: workspace:*
+        version: link:..
       '@midscene/web':
         specifier: ^1.8.0
         version: 1.8.0(@playwright/test@1.58.2)(playwright@1.58.2)
@@ -790,6 +831,12 @@ importers:
         specifier: ^1.58.2
         version: 1.58.2
     devDependencies:
+      '@lynx-js/genui-a2ui':
+        specifier: workspace:*
+        version: link:../a2ui
+      '@lynx-js/genui-a2ui-catalog-extractor':
+        specifier: workspace:*
+        version: link:../a2ui-catalog-extractor
       '@types/node':
         specifier: ^24.10.13
         version: 24.10.13
@@ -1279,7 +1326,7 @@ importers:
         specifier: workspace:^
         version: link:../plugin-qrcode
       '@lynx-js/react':
-        specifier: workspace:^
+        specifier: workspace:*
         version: link:../../react
       '@lynx-js/react-rsbuild-plugin':
         specifier: workspace:^
@@ -2291,12 +2338,6 @@ importers:
         specifier: 19.2.4
         version: 19.2.4(react@19.2.4)
     devDependencies:
-      '@lynx-js/a2ui-cli':
-        specifier: workspace:*
-        version: link:../packages/genui/a2ui-cli
-      '@lynx-js/a2ui-reactlynx':
-        specifier: workspace:*
-        version: link:../packages/genui/a2ui
       '@lynx-js/chunk-loading-webpack-plugin':
         specifier: workspace:*
         version: link:../packages/webpack/chunk-loading-webpack-plugin
@@ -2312,6 +2353,12 @@ importers:
       '@lynx-js/externals-loading-webpack-plugin':
         specifier: workspace:*
         version: link:../packages/webpack/externals-loading-webpack-plugin
+      '@lynx-js/genui':
+        specifier: workspace:*
+        version: link:../packages/genui
+      '@lynx-js/genui-cli':
+        specifier: workspace:*
+        version: link:../packages/genui/cli
       '@lynx-js/lynx-bundle-rslib-config':
         specifier: workspace:*
         version: link:../packages/rspeedy/lynx-bundle-rslib-config
@@ -4005,7 +4052,7 @@ packages:
   '@lynx-js/gesture-runtime@2.1.1':
     resolution: {integrity: sha512-zBDOHakuePjw5wPCButExNgcllyFPGqYzqP2CWCWcQaX4gqJmCmYeRKguihyxH6ma6ExxlH/J2x5CHD91ed3bQ==}
     peerDependencies:
-      '@lynx-js/react': '*'
+      '@lynx-js/react': workspace:*
       '@lynx-js/types': '*'
 
   '@lynx-js/internal-preact@10.29.1-20260519060144-e6da44c':
@@ -4020,161 +4067,161 @@ packages:
   '@lynx-js/lynx-ui-button@3.133.0':
     resolution: {integrity: sha512-JH/iD5TQawHgEweBQYmj+H5ELLNLtLbs3fCUdqvVTdsBOsg6sbUxohzFWCy0SXgvC99+GghGtKu95rD3Jadrzg==}
     peerDependencies:
-      '@lynx-js/react': '>=0.100.0'
+      '@lynx-js/react': workspace:*
       '@lynx-js/types': '*'
       '@types/react': ^18
 
   '@lynx-js/lynx-ui-checkbox@3.133.0':
     resolution: {integrity: sha512-iOYXrClq5ejiUeHMTIXteG63CXCMUAbSyapWgxxX568llrN+YM778tedopM5WmoCTmkuPYIYO7MEPUqRXyl3xg==}
     peerDependencies:
-      '@lynx-js/react': '>=0.100.0'
+      '@lynx-js/react': workspace:*
       '@lynx-js/types': '*'
       '@types/react': ^18
 
   '@lynx-js/lynx-ui-common@3.133.0':
     resolution: {integrity: sha512-gnSyc+RvqmsnOH8LJDT05O30KNFU4X0u1ymqukTeR/metW7sjKBO5mf3W7nJPSmyCtxcwU3qbnw6gV5MVB+p1Q==}
     peerDependencies:
-      '@lynx-js/react': '>=0.100.0'
+      '@lynx-js/react': workspace:*
       '@lynx-js/types': '*'
       '@types/react': ^18
 
   '@lynx-js/lynx-ui-dialog@3.133.0':
     resolution: {integrity: sha512-st5Pitj3qz5KUfDbpVWgI6TWQgRWUqK6l2mixphITgZaY517Hsoyj2yWOLmdqgv2pYby95ltdeB4jlA9CJJx5g==}
     peerDependencies:
-      '@lynx-js/react': '>=0.100.0'
+      '@lynx-js/react': workspace:*
       '@lynx-js/types': '*'
       '@types/react': ^18
 
   '@lynx-js/lynx-ui-draggable@3.133.0':
     resolution: {integrity: sha512-Qs74k+/1HGgxNtXWdAhTfuxBgydLemE4+MK4rzZJQLUgXxUAh/Cj6hEgvMwxSKbG3LTuzU/Mei2njg9oANzgMg==}
     peerDependencies:
-      '@lynx-js/react': '>=0.100.0'
+      '@lynx-js/react': workspace:*
       '@lynx-js/types': '*'
       '@types/react': ^18
 
   '@lynx-js/lynx-ui-feed-list@3.133.0':
     resolution: {integrity: sha512-8Q3pLVXxrcxiqR6fTFDm8z6yBHgiCQnVhblXA0ut75JnxSN7yhxFvkBWfifPZ0iHxorwQTM81KYvTXsKfCw8CQ==}
     peerDependencies:
-      '@lynx-js/react': '>=0.100.0'
+      '@lynx-js/react': workspace:*
       '@lynx-js/types': '*'
       '@types/react': ^18
 
   '@lynx-js/lynx-ui-form@3.133.0':
     resolution: {integrity: sha512-qye6w7sM/VJyFce324j7u5tHSXAjugkQ7BOJB9CMTUsMZ9LHVbslEq/nOzhKd8IjM96KUDdFAsPkgwNt05GQgg==}
     peerDependencies:
-      '@lynx-js/react': '>=0.100.0'
+      '@lynx-js/react': workspace:*
       '@lynx-js/types': '*'
       '@types/react': ^18
 
   '@lynx-js/lynx-ui-input@3.133.0':
     resolution: {integrity: sha512-adkpMXd/rYkmkEsXrcwwiiGw7kLDA4+h1qbVLfHlF2bIB9Tm40vUEKhmdQwSqMdNaNjV8Tt4+FB2TwDiXsMkhw==}
     peerDependencies:
-      '@lynx-js/react': '>=0.100.0'
+      '@lynx-js/react': workspace:*
       '@lynx-js/types': '*'
       '@types/react': ^18
 
   '@lynx-js/lynx-ui-lazy-component@3.133.0':
     resolution: {integrity: sha512-lH32PwEVnS3EBoz01G1tNygXwUjzitPwfWLRFXpN0SBiWsiZzlKDRUFftalbQR7ss/ydzMixYJqQeNbDAW6itA==}
     peerDependencies:
-      '@lynx-js/react': '>=0.100.0'
+      '@lynx-js/react': workspace:*
       '@lynx-js/types': '*'
       '@types/react': ^18
 
   '@lynx-js/lynx-ui-list@3.133.0':
     resolution: {integrity: sha512-U9pe2p7QrA+ULEJeRccu4qdcxVECpVel8aWHfx/g2SNDqEColE4sCVN+9QfYlE7G0FVJkASVaupJCHG9lrpb+g==}
     peerDependencies:
-      '@lynx-js/react': '>=0.100.0'
+      '@lynx-js/react': workspace:*
       '@lynx-js/types': '*'
       '@types/react': ^18
 
   '@lynx-js/lynx-ui-overlay@3.133.0':
     resolution: {integrity: sha512-wzkjF7XDUSJgQLgsKZk8iS5xMhIhxqZjGo0cZuHGXiLMuKedVhVklwEMF+4veOByHEK3C6JU8gkp36FuC4FqBg==}
     peerDependencies:
-      '@lynx-js/react': '>=0.100.0'
+      '@lynx-js/react': workspace:*
       '@lynx-js/types': '*'
       '@types/react': ^18
 
   '@lynx-js/lynx-ui-popover@3.133.0':
     resolution: {integrity: sha512-cwP9QXAur7bDKVhsK+BRjX/zTUruFi9gg/CeLZ/giCGIrAWCJTevQKa3Hj8nZ9H6uq+EkK8X4J18yELqODWEOQ==}
     peerDependencies:
-      '@lynx-js/react': '>=0.100.0'
+      '@lynx-js/react': workspace:*
       '@lynx-js/types': '*'
       '@types/react': ^18
 
   '@lynx-js/lynx-ui-presence@3.133.0':
     resolution: {integrity: sha512-SVcMrGn46JNbxegxj/mQO9cfKxO2aG5QwhxCCTo9/lDfGDT5WtPzlDLiDcJH8+7rpQLLVm0BLX1hcfoHKmlahg==}
     peerDependencies:
-      '@lynx-js/react': '>=0.100.0'
+      '@lynx-js/react': workspace:*
       '@lynx-js/types': '*'
       '@types/react': ^18
 
   '@lynx-js/lynx-ui-radio-group@3.133.0':
     resolution: {integrity: sha512-1Mq4BlpwRaNhoPRgsLtGU9dOIrjr7T4//KvsXFDh4pUfMmzgHSq2lWkuLTijLepJJlGyOELuISoNmK7CVej04g==}
     peerDependencies:
-      '@lynx-js/react': '>=0.100.0'
+      '@lynx-js/react': workspace:*
       '@lynx-js/types': '*'
       '@types/react': ^18
 
   '@lynx-js/lynx-ui-scroll-view@3.133.0':
     resolution: {integrity: sha512-M22qAdw+XrRNVw15b0TKSm+D+eLRmnd4LGT+FRnSQOR1LQwd0w6uZvqX14w+I9+mnVRYyGSl3lg76ycmFrm9MQ==}
     peerDependencies:
-      '@lynx-js/react': '>=0.100.0'
+      '@lynx-js/react': workspace:*
       '@lynx-js/types': '*'
       '@types/react': ^18
 
   '@lynx-js/lynx-ui-sheet@3.133.0':
     resolution: {integrity: sha512-OQHhjSgR7QXQV45lJ2fAgv0iaFE1v3ycoey9zZtoUltPipwxzvJi19OHJZCFGr8VnGdmiiMtrj1tsTQrhGPW7w==}
     peerDependencies:
-      '@lynx-js/react': '>=0.100.0'
+      '@lynx-js/react': workspace:*
       '@lynx-js/types': '*'
       '@types/react': ^18
 
   '@lynx-js/lynx-ui-slider@3.133.0':
     resolution: {integrity: sha512-KE9d1zH57f2uvxoZt0jisUqCrnUZ+buNyBD0EYNs62wRpkyuZg7kLeJ1DTzKiKA8+zlENL88x9kIB0kDABGcFA==}
     peerDependencies:
-      '@lynx-js/react': '>=0.100.0'
+      '@lynx-js/react': workspace:*
       '@lynx-js/types': '*'
       '@types/react': ^18
 
   '@lynx-js/lynx-ui-sortable@3.133.0':
     resolution: {integrity: sha512-6X+Gm5CeZQMTR0FRorpSb9sq6UHdsDcZpxqiNRYKdVPgBiSDoMci/Bp0HnV436Bi6ORg3ORv9JgDRQRFUijh1w==}
     peerDependencies:
-      '@lynx-js/react': '>=0.100.0'
+      '@lynx-js/react': workspace:*
       '@lynx-js/types': '*'
       '@types/react': ^18
 
   '@lynx-js/lynx-ui-swipe-action@3.133.0':
     resolution: {integrity: sha512-icz6xaY1XtGV32kisLiOprHULWj4q4p6SpASHtRYI2jHpXLO9rSueUvoOTQrieQ1kjBJqw8nRRAQp3rHfT2Q6Q==}
     peerDependencies:
-      '@lynx-js/react': '>=0.100.0'
+      '@lynx-js/react': workspace:*
       '@lynx-js/types': '*'
       '@types/react': ^18
 
   '@lynx-js/lynx-ui-swiper@3.133.0':
     resolution: {integrity: sha512-myXHkI7TYUvhxNV/ho4L4zu9/VgvNRYoA6w2w5MhtB4M31JLeoKxoBUJTFOHGgvRSU/Crj9FbWMUsTnsp7PZwA==}
     peerDependencies:
-      '@lynx-js/react': '>=0.100.0'
+      '@lynx-js/react': workspace:*
       '@lynx-js/types': '*'
       '@types/react': ^18
 
   '@lynx-js/lynx-ui-switch@3.133.0':
     resolution: {integrity: sha512-PzNHscudM4+FYJKlQCBhHV6Lw40/yppu9AgIJzksT6oVhrge/gpf/ujzqpHWXIvX1BUk7/kx+AAovjjf3LRDpg==}
     peerDependencies:
-      '@lynx-js/react': '>=0.100.0'
+      '@lynx-js/react': workspace:*
       '@lynx-js/types': '*'
       '@types/react': ^18
 
   '@lynx-js/lynx-ui@3.133.0':
     resolution: {integrity: sha512-IJwhaJU/sw1qgyJYbrgkTCPoH46JSbMfYok+b4e5fwr2rNxLb+aJdsnQ4ayUiXNmb+q9FizHf3YoxI3W6q2xSw==}
     peerDependencies:
-      '@lynx-js/react': '>=0.100.0'
+      '@lynx-js/react': workspace:*
       '@lynx-js/types': '*'
       '@types/react': ^18
 
   '@lynx-js/motion@0.0.3':
     resolution: {integrity: sha512-Kujwj1grxFTPjwr3IEO4Qca5YRsoJCeTctsEaUcVFYC5Ekb52LuUavJicMqUuswzW/HrARpJw9npLSiTjfcwYQ==}
     peerDependencies:
-      '@lynx-js/react': '*'
+      '@lynx-js/react': workspace:*
       '@lynx-js/types': '*'
     peerDependenciesMeta:
       '@lynx-js/types':
@@ -4186,7 +4233,7 @@ packages:
   '@lynx-js/react-use@0.1.3':
     resolution: {integrity: sha512-48NX1DZfIqdpcFPKR3SdI/E0D2INJzgMDtl9IK0vbqWKPgj6LgUPZN0iqIDd7Juy3in5c2bv6E9jCpoq5ONeVw==}
     peerDependencies:
-      '@lynx-js/react': '>=0.105.1'
+      '@lynx-js/react': workspace:*
 
   '@lynx-js/tasm@0.0.39':
     resolution: {integrity: sha512-FNIV6Cc2K0wCKOHVMfpr3M6kpIZqHHNI02GpVl+h0ClyyK44jxEO+lf58gLFD5E3o0hJ1cp3H2OBIxSUJGkPDw==}
@@ -13720,6 +13767,17 @@ snapshots:
       - react
       - react-dom
 
+  '@lynx-js/lynx-ui-button@3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)':
+    dependencies:
+      '@lynx-js/lynx-ui-common': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
+      '@lynx-js/react': link:packages/react
+      '@lynx-js/types': 3.7.0
+      '@types/react': 19.2.14
+      clsx: 2.1.1
+    transitivePeerDependencies:
+      - react
+      - react-dom
+
   '@lynx-js/lynx-ui-checkbox@3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@18.3.28)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)':
     dependencies:
       '@lynx-js/lynx-ui-button': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@18.3.28)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
@@ -13732,6 +13790,18 @@ snapshots:
       - react
       - react-dom
 
+  '@lynx-js/lynx-ui-checkbox@3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)':
+    dependencies:
+      '@lynx-js/lynx-ui-button': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
+      '@lynx-js/lynx-ui-common': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
+      '@lynx-js/react': link:packages/react
+      '@lynx-js/types': 3.7.0
+      '@types/react': 19.2.14
+      clsx: 2.1.1
+    transitivePeerDependencies:
+      - react
+      - react-dom
+
   '@lynx-js/lynx-ui-common@3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@18.3.28)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)':
     dependencies:
       '@lynx-js/gesture-runtime': 2.1.1(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)
@@ -13743,6 +13813,17 @@ snapshots:
       - react
       - react-dom
 
+  '@lynx-js/lynx-ui-common@3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)':
+    dependencies:
+      '@lynx-js/gesture-runtime': 2.1.1(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)
+      '@lynx-js/react': link:packages/react
+      '@lynx-js/react-use': 0.1.3(@lynx-js/react@packages+react)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
+      '@lynx-js/types': 3.7.0
+      '@types/react': 19.2.14
+    transitivePeerDependencies:
+      - react
+      - react-dom
+
   '@lynx-js/lynx-ui-dialog@3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@18.3.28)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)':
     dependencies:
       '@lynx-js/lynx-ui-button': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@18.3.28)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
@@ -13757,6 +13838,20 @@ snapshots:
       - react
       - react-dom
 
+  '@lynx-js/lynx-ui-dialog@3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)':
+    dependencies:
+      '@lynx-js/lynx-ui-button': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
+      '@lynx-js/lynx-ui-common': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
+      '@lynx-js/lynx-ui-overlay': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
+      '@lynx-js/lynx-ui-presence': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
+      '@lynx-js/react': link:packages/react
+      '@lynx-js/types': 3.7.0
+      '@types/react': 19.2.14
+      clsx: 2.1.1
+    transitivePeerDependencies:
+      - react
+      - react-dom
+
   '@lynx-js/lynx-ui-draggable@3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@18.3.28)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)':
     dependencies:
       '@lynx-js/lynx-ui-common': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@18.3.28)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
@@ -13768,6 +13863,17 @@ snapshots:
       - react
       - react-dom
 
+  '@lynx-js/lynx-ui-draggable@3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)':
+    dependencies:
+      '@lynx-js/lynx-ui-common': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
+      '@lynx-js/react': link:packages/react
+      '@lynx-js/react-use': 0.1.3(@lynx-js/react@packages+react)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
+      '@lynx-js/types': 3.7.0
+      '@types/react': 19.2.14
+    transitivePeerDependencies:
+      - react
+      - react-dom
+
   '@lynx-js/lynx-ui-feed-list@3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@18.3.28)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)':
     dependencies:
       '@lynx-js/gesture-runtime': 2.1.1(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)
@@ -13780,6 +13886,18 @@ snapshots:
       - react
       - react-dom
 
+  '@lynx-js/lynx-ui-feed-list@3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)':
+    dependencies:
+      '@lynx-js/gesture-runtime': 2.1.1(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)
+      '@lynx-js/lynx-ui-common': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
+      '@lynx-js/lynx-ui-list': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
+      '@lynx-js/react': link:packages/react
+      '@lynx-js/types': 3.7.0
+      '@types/react': 19.2.14
+    transitivePeerDependencies:
+      - react
+      - react-dom
+
   '@lynx-js/lynx-ui-form@3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@18.3.28)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)':
     dependencies:
       '@lynx-js/lynx-ui-button': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@18.3.28)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
@@ -13795,6 +13913,21 @@ snapshots:
       - react
       - react-dom
 
+  '@lynx-js/lynx-ui-form@3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)':
+    dependencies:
+      '@lynx-js/lynx-ui-button': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
+      '@lynx-js/lynx-ui-checkbox': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
+      '@lynx-js/lynx-ui-common': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
+      '@lynx-js/lynx-ui-input': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
+      '@lynx-js/lynx-ui-radio-group': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
+      '@lynx-js/lynx-ui-switch': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
+      '@lynx-js/react': link:packages/react
+      '@lynx-js/types': 3.7.0
+      '@types/react': 19.2.14
+    transitivePeerDependencies:
+      - react
+      - react-dom
+
   '@lynx-js/lynx-ui-input@3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@18.3.28)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)':
     dependencies:
       '@lynx-js/lynx-ui-common': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@18.3.28)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
@@ -13806,6 +13939,17 @@ snapshots:
       - react
       - react-dom
 
+  '@lynx-js/lynx-ui-input@3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)':
+    dependencies:
+      '@lynx-js/lynx-ui-common': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
+      '@lynx-js/lynx-ui-scroll-view': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
+      '@lynx-js/react': link:packages/react
+      '@lynx-js/types': 3.7.0
+      '@types/react': 19.2.14
+    transitivePeerDependencies:
+      - react
+      - react-dom
+
   '@lynx-js/lynx-ui-lazy-component@3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@18.3.28)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)':
     dependencies:
       '@lynx-js/lynx-ui-common': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@18.3.28)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
@@ -13816,6 +13960,16 @@ snapshots:
       - react
       - react-dom
 
+  '@lynx-js/lynx-ui-lazy-component@3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)':
+    dependencies:
+      '@lynx-js/lynx-ui-common': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
+      '@lynx-js/react': link:packages/react
+      '@lynx-js/types': 3.7.0
+      '@types/react': 19.2.14
+    transitivePeerDependencies:
+      - react
+      - react-dom
+
   '@lynx-js/lynx-ui-list@3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@18.3.28)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)':
     dependencies:
       '@lynx-js/gesture-runtime': 2.1.1(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)
@@ -13827,6 +13981,17 @@ snapshots:
       - react
       - react-dom
 
+  '@lynx-js/lynx-ui-list@3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)':
+    dependencies:
+      '@lynx-js/gesture-runtime': 2.1.1(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)
+      '@lynx-js/lynx-ui-common': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
+      '@lynx-js/react': link:packages/react
+      '@lynx-js/types': 3.7.0
+      '@types/react': 19.2.14
+    transitivePeerDependencies:
+      - react
+      - react-dom
+
   '@lynx-js/lynx-ui-overlay@3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@18.3.28)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)':
     dependencies:
       '@lynx-js/lynx-ui-common': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@18.3.28)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
@@ -13837,6 +14002,16 @@ snapshots:
       - react
       - react-dom
 
+  '@lynx-js/lynx-ui-overlay@3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)':
+    dependencies:
+      '@lynx-js/lynx-ui-common': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
+      '@lynx-js/react': link:packages/react
+      '@lynx-js/types': 3.7.0
+      '@types/react': 19.2.14
+    transitivePeerDependencies:
+      - react
+      - react-dom
+
   '@lynx-js/lynx-ui-popover@3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@18.3.28)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)':
     dependencies:
       '@lynx-js/lynx-ui-button': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@18.3.28)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
@@ -13851,6 +14026,20 @@ snapshots:
       - react
       - react-dom
 
+  '@lynx-js/lynx-ui-popover@3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)':
+    dependencies:
+      '@lynx-js/lynx-ui-button': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
+      '@lynx-js/lynx-ui-common': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
+      '@lynx-js/lynx-ui-overlay': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
+      '@lynx-js/lynx-ui-presence': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
+      '@lynx-js/react': link:packages/react
+      '@lynx-js/types': 3.7.0
+      '@types/react': 19.2.14
+      clsx: 2.1.1
+    transitivePeerDependencies:
+      - react
+      - react-dom
+
   '@lynx-js/lynx-ui-presence@3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@18.3.28)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)':
     dependencies:
       '@lynx-js/lynx-ui-common': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@18.3.28)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
@@ -13862,6 +14051,17 @@ snapshots:
       - react
       - react-dom
 
+  '@lynx-js/lynx-ui-presence@3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)':
+    dependencies:
+      '@lynx-js/lynx-ui-common': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
+      '@lynx-js/react': link:packages/react
+      '@lynx-js/types': 3.7.0
+      '@types/react': 19.2.14
+      clsx: 2.1.1
+    transitivePeerDependencies:
+      - react
+      - react-dom
+
   '@lynx-js/lynx-ui-radio-group@3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@18.3.28)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)':
     dependencies:
       '@lynx-js/lynx-ui-button': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@18.3.28)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
@@ -13874,6 +14074,18 @@ snapshots:
       - react
       - react-dom
 
+  '@lynx-js/lynx-ui-radio-group@3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)':
+    dependencies:
+      '@lynx-js/lynx-ui-button': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
+      '@lynx-js/lynx-ui-common': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
+      '@lynx-js/react': link:packages/react
+      '@lynx-js/types': 3.7.0
+      '@types/react': 19.2.14
+      clsx: 2.1.1
+    transitivePeerDependencies:
+      - react
+      - react-dom
+
   '@lynx-js/lynx-ui-scroll-view@3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@18.3.28)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)':
     dependencies:
       '@lynx-js/gesture-runtime': 2.1.1(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)
@@ -13886,6 +14098,18 @@ snapshots:
       - react
       - react-dom
 
+  '@lynx-js/lynx-ui-scroll-view@3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)':
+    dependencies:
+      '@lynx-js/gesture-runtime': 2.1.1(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)
+      '@lynx-js/lynx-ui-common': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
+      '@lynx-js/lynx-ui-lazy-component': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
+      '@lynx-js/react': link:packages/react
+      '@lynx-js/types': 3.7.0
+      '@types/react': 19.2.14
+    transitivePeerDependencies:
+      - react
+      - react-dom
+
   '@lynx-js/lynx-ui-sheet@3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@18.3.28)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)':
     dependencies:
       '@lynx-js/lynx-ui-common': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@18.3.28)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
@@ -13902,6 +14126,22 @@ snapshots:
       - react
       - react-dom
 
+  '@lynx-js/lynx-ui-sheet@3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)':
+    dependencies:
+      '@lynx-js/lynx-ui-common': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
+      '@lynx-js/lynx-ui-dialog': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
+      '@lynx-js/lynx-ui-overlay': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
+      '@lynx-js/lynx-ui-presence': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
+      '@lynx-js/motion': 0.0.3(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
+      '@lynx-js/react': link:packages/react
+      '@lynx-js/types': 3.7.0
+      '@types/react': 19.2.14
+      clsx: 2.1.1
+    transitivePeerDependencies:
+      - '@emotion/is-prop-valid'
+      - react
+      - react-dom
+
   '@lynx-js/lynx-ui-slider@3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@18.3.28)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)':
     dependencies:
       '@lynx-js/lynx-ui-common': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@18.3.28)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
@@ -13912,6 +14152,16 @@ snapshots:
       - react
       - react-dom
 
+  '@lynx-js/lynx-ui-slider@3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)':
+    dependencies:
+      '@lynx-js/lynx-ui-common': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
+      '@lynx-js/react': link:packages/react
+      '@lynx-js/types': 3.7.0
+      '@types/react': 19.2.14
+    transitivePeerDependencies:
+      - react
+      - react-dom
+
   '@lynx-js/lynx-ui-sortable@3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@18.3.28)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)':
     dependencies:
       '@lynx-js/lynx-ui-common': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@18.3.28)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
@@ -13923,6 +14173,17 @@ snapshots:
       - react
       - react-dom
 
+  '@lynx-js/lynx-ui-sortable@3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)':
+    dependencies:
+      '@lynx-js/lynx-ui-common': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
+      '@lynx-js/lynx-ui-draggable': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
+      '@lynx-js/react': link:packages/react
+      '@lynx-js/types': 3.7.0
+      '@types/react': 19.2.14
+    transitivePeerDependencies:
+      - react
+      - react-dom
+
   '@lynx-js/lynx-ui-swipe-action@3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@18.3.28)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)':
     dependencies:
       '@lynx-js/gesture-runtime': 2.1.1(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)
@@ -13934,6 +14195,17 @@ snapshots:
       - react
       - react-dom
 
+  '@lynx-js/lynx-ui-swipe-action@3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)':
+    dependencies:
+      '@lynx-js/gesture-runtime': 2.1.1(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)
+      '@lynx-js/lynx-ui-common': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
+      '@lynx-js/react': link:packages/react
+      '@lynx-js/types': 3.7.0
+      '@types/react': 19.2.14
+    transitivePeerDependencies:
+      - react
+      - react-dom
+
   '@lynx-js/lynx-ui-swiper@3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@18.3.28)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)':
     dependencies:
       '@lynx-js/lynx-ui-common': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@18.3.28)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
@@ -13945,6 +14217,17 @@ snapshots:
       - react
       - react-dom
 
+  '@lynx-js/lynx-ui-swiper@3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)':
+    dependencies:
+      '@lynx-js/lynx-ui-common': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
+      '@lynx-js/react': link:packages/react
+      '@lynx-js/react-use': 0.1.3(@lynx-js/react@packages+react)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
+      '@lynx-js/types': 3.7.0
+      '@types/react': 19.2.14
+    transitivePeerDependencies:
+      - react
+      - react-dom
+
   '@lynx-js/lynx-ui-switch@3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@18.3.28)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)':
     dependencies:
       '@lynx-js/lynx-ui-common': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@18.3.28)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
@@ -13956,6 +14239,17 @@ snapshots:
       - react
       - react-dom
 
+  '@lynx-js/lynx-ui-switch@3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)':
+    dependencies:
+      '@lynx-js/lynx-ui-common': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
+      '@lynx-js/react': link:packages/react
+      '@lynx-js/types': 3.7.0
+      '@types/react': 19.2.14
+      clsx: 2.1.1
+    transitivePeerDependencies:
+      - react
+      - react-dom
+
   '@lynx-js/lynx-ui@3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@18.3.28)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)':
     dependencies:
       '@lynx-js/lynx-ui-button': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@18.3.28)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
@@ -13986,6 +14280,36 @@ snapshots:
       - react
       - react-dom
 
+  '@lynx-js/lynx-ui@3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)':
+    dependencies:
+      '@lynx-js/lynx-ui-button': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
+      '@lynx-js/lynx-ui-checkbox': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
+      '@lynx-js/lynx-ui-common': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
+      '@lynx-js/lynx-ui-dialog': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
+      '@lynx-js/lynx-ui-draggable': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
+      '@lynx-js/lynx-ui-feed-list': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
+      '@lynx-js/lynx-ui-form': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
+      '@lynx-js/lynx-ui-input': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
+      '@lynx-js/lynx-ui-lazy-component': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
+      '@lynx-js/lynx-ui-list': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
+      '@lynx-js/lynx-ui-popover': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
+      '@lynx-js/lynx-ui-presence': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
+      '@lynx-js/lynx-ui-radio-group': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
+      '@lynx-js/lynx-ui-scroll-view': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
+      '@lynx-js/lynx-ui-sheet': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
+      '@lynx-js/lynx-ui-slider': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
+      '@lynx-js/lynx-ui-sortable': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
+      '@lynx-js/lynx-ui-swipe-action': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
+      '@lynx-js/lynx-ui-swiper': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
+      '@lynx-js/lynx-ui-switch': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
+      '@lynx-js/react': link:packages/react
+      '@lynx-js/types': 3.7.0
+      '@types/react': 19.2.14
+    transitivePeerDependencies:
+      - '@emotion/is-prop-valid'
+      - react
+      - react-dom
+
   '@lynx-js/motion@0.0.3(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)':
     dependencies:
       '@lynx-js/react': link:packages/react
diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml
index 104f4e3300..7b7909530b 100644
--- a/pnpm-workspace.yaml
+++ b/pnpm-workspace.yaml
@@ -2,6 +2,7 @@ packages:
   - benchmark/react
   - examples/*
   - packages/background-only
+  - packages/genui
   - packages/genui/*
   - packages/i18n/*
   - packages/lynx/*
@@ -79,6 +80,12 @@ catalogs:
     "@rstest/core": "0.8.1"
 
 overrides:
+  # Published @lynx-js/lynx-ui-* (pulled in by packages/genui/a2ui) peer-depend on
+  # @lynx-js/react@^0.121.0 and would otherwise drag a published @lynx-js/react copy
+  # into the workspace alongside the workspace one. Two copies = two snapshotManager
+  # singletons, which breaks ReactLynx snapshot registration ("BackgroundSnapshot not
+  # found"). Force every @lynx-js/react to the single workspace copy.
+  "@lynx-js/react": "workspace:*"
   "@rspack/core": "$@rspack/core"
   "@rsbuild/core>@rspack/core": "$@rspack/core"
   "@rsdoctor/rspack-plugin>@rspack/core": "$@rspack/core"
diff --git a/website/package.json b/website/package.json
index 3b44605cf2..0e0c3866f0 100644
--- a/website/package.json
+++ b/website/package.json
@@ -19,13 +19,13 @@
     "react-dom": "19.2.4"
   },
   "devDependencies": {
-    "@lynx-js/a2ui-cli": "workspace:*",
-    "@lynx-js/a2ui-reactlynx": "workspace:*",
     "@lynx-js/chunk-loading-webpack-plugin": "workspace:*",
     "@lynx-js/config-rsbuild-plugin": "workspace:*",
     "@lynx-js/css-extract-webpack-plugin": "workspace:*",
     "@lynx-js/external-bundle-rsbuild-plugin": "workspace:*",
     "@lynx-js/externals-loading-webpack-plugin": "workspace:*",
+    "@lynx-js/genui": "workspace:*",
+    "@lynx-js/genui-cli": "workspace:*",
     "@lynx-js/lynx-bundle-rslib-config": "workspace:*",
     "@lynx-js/qrcode-rsbuild-plugin": "workspace:*",
     "@lynx-js/react": "workspace:*",