@copilotkit/a2ui-renderer 1.51.5-next.0 → 1.51.5-next.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/A2UIMessageRenderer.cjs +135 -0
- package/dist/A2UIMessageRenderer.cjs.map +1 -0
- package/dist/A2UIMessageRenderer.d.cts +11 -0
- package/dist/A2UIMessageRenderer.d.cts.map +1 -0
- package/dist/A2UIMessageRenderer.d.mts +11 -0
- package/dist/A2UIMessageRenderer.d.mts.map +1 -0
- package/dist/A2UIMessageRenderer.mjs +134 -0
- package/dist/A2UIMessageRenderer.mjs.map +1 -0
- package/dist/A2UIViewer.cjs +154 -0
- package/dist/A2UIViewer.cjs.map +1 -0
- package/dist/A2UIViewer.d.cts +39 -0
- package/dist/A2UIViewer.d.cts.map +1 -0
- package/dist/A2UIViewer.d.mts +39 -0
- package/dist/A2UIViewer.d.mts.map +1 -0
- package/dist/A2UIViewer.mjs +152 -0
- package/dist/A2UIViewer.mjs.map +1 -0
- package/dist/_virtual/_rolldown/runtime.cjs +29 -0
- package/dist/index.cjs +8 -0
- package/dist/index.d.cts +15 -0
- package/dist/index.d.cts.map +1 -0
- package/dist/index.d.mts +15 -0
- package/dist/index.d.mts.map +1 -0
- package/dist/index.mjs +5 -0
- package/dist/index.umd.js +3070 -2
- package/dist/index.umd.js.map +1 -1
- package/dist/react-renderer/components/content/AudioPlayer.cjs +34 -0
- package/dist/react-renderer/components/content/AudioPlayer.cjs.map +1 -0
- package/dist/react-renderer/components/content/AudioPlayer.mjs +33 -0
- package/dist/react-renderer/components/content/AudioPlayer.mjs.map +1 -0
- package/dist/react-renderer/components/content/Divider.cjs +31 -0
- package/dist/react-renderer/components/content/Divider.cjs.map +1 -0
- package/dist/react-renderer/components/content/Divider.mjs +30 -0
- package/dist/react-renderer/components/content/Divider.mjs.map +1 -0
- package/dist/react-renderer/components/content/Icon.cjs +50 -0
- package/dist/react-renderer/components/content/Icon.cjs.map +1 -0
- package/dist/react-renderer/components/content/Icon.mjs +49 -0
- package/dist/react-renderer/components/content/Icon.mjs.map +1 -0
- package/dist/react-renderer/components/content/Image.cjs +43 -0
- package/dist/react-renderer/components/content/Image.cjs.map +1 -0
- package/dist/react-renderer/components/content/Image.mjs +42 -0
- package/dist/react-renderer/components/content/Image.mjs.map +1 -0
- package/dist/react-renderer/components/content/Text.cjs +131 -0
- package/dist/react-renderer/components/content/Text.cjs.map +1 -0
- package/dist/react-renderer/components/content/Text.mjs +129 -0
- package/dist/react-renderer/components/content/Text.mjs.map +1 -0
- package/dist/react-renderer/components/content/Video.cjs +56 -0
- package/dist/react-renderer/components/content/Video.cjs.map +1 -0
- package/dist/react-renderer/components/content/Video.mjs +55 -0
- package/dist/react-renderer/components/content/Video.mjs.map +1 -0
- package/dist/react-renderer/components/interactive/Button.cjs +39 -0
- package/dist/react-renderer/components/interactive/Button.cjs.map +1 -0
- package/dist/react-renderer/components/interactive/Button.mjs +38 -0
- package/dist/react-renderer/components/interactive/Button.mjs.map +1 -0
- package/dist/react-renderer/components/interactive/CheckBox.cjs +58 -0
- package/dist/react-renderer/components/interactive/CheckBox.cjs.map +1 -0
- package/dist/react-renderer/components/interactive/CheckBox.mjs +57 -0
- package/dist/react-renderer/components/interactive/CheckBox.mjs.map +1 -0
- package/dist/react-renderer/components/interactive/DateTimeInput.cjs +65 -0
- package/dist/react-renderer/components/interactive/DateTimeInput.cjs.map +1 -0
- package/dist/react-renderer/components/interactive/DateTimeInput.mjs +64 -0
- package/dist/react-renderer/components/interactive/DateTimeInput.mjs.map +1 -0
- package/dist/react-renderer/components/interactive/MultipleChoice.cjs +54 -0
- package/dist/react-renderer/components/interactive/MultipleChoice.cjs.map +1 -0
- package/dist/react-renderer/components/interactive/MultipleChoice.mjs +53 -0
- package/dist/react-renderer/components/interactive/MultipleChoice.mjs.map +1 -0
- package/dist/react-renderer/components/interactive/Slider.cjs +72 -0
- package/dist/react-renderer/components/interactive/Slider.cjs.map +1 -0
- package/dist/react-renderer/components/interactive/Slider.mjs +71 -0
- package/dist/react-renderer/components/interactive/Slider.mjs.map +1 -0
- package/dist/react-renderer/components/interactive/TextField.cjs +74 -0
- package/dist/react-renderer/components/interactive/TextField.cjs.map +1 -0
- package/dist/react-renderer/components/interactive/TextField.mjs +73 -0
- package/dist/react-renderer/components/interactive/TextField.mjs.map +1 -0
- package/dist/react-renderer/components/layout/Card.cjs +46 -0
- package/dist/react-renderer/components/layout/Card.cjs.map +1 -0
- package/dist/react-renderer/components/layout/Card.mjs +45 -0
- package/dist/react-renderer/components/layout/Card.mjs.map +1 -0
- package/dist/react-renderer/components/layout/Column.cjs +43 -0
- package/dist/react-renderer/components/layout/Column.cjs.map +1 -0
- package/dist/react-renderer/components/layout/Column.mjs +42 -0
- package/dist/react-renderer/components/layout/Column.mjs.map +1 -0
- package/dist/react-renderer/components/layout/List.cjs +41 -0
- package/dist/react-renderer/components/layout/List.cjs.map +1 -0
- package/dist/react-renderer/components/layout/List.mjs +40 -0
- package/dist/react-renderer/components/layout/List.mjs.map +1 -0
- package/dist/react-renderer/components/layout/Modal.cjs +92 -0
- package/dist/react-renderer/components/layout/Modal.cjs.map +1 -0
- package/dist/react-renderer/components/layout/Modal.mjs +91 -0
- package/dist/react-renderer/components/layout/Modal.mjs.map +1 -0
- package/dist/react-renderer/components/layout/Row.cjs +43 -0
- package/dist/react-renderer/components/layout/Row.cjs.map +1 -0
- package/dist/react-renderer/components/layout/Row.mjs +42 -0
- package/dist/react-renderer/components/layout/Row.mjs.map +1 -0
- package/dist/react-renderer/components/layout/Tabs.cjs +47 -0
- package/dist/react-renderer/components/layout/Tabs.cjs.map +1 -0
- package/dist/react-renderer/components/layout/Tabs.mjs +46 -0
- package/dist/react-renderer/components/layout/Tabs.mjs.map +1 -0
- package/dist/react-renderer/core/A2UIProvider.cjs +123 -0
- package/dist/react-renderer/core/A2UIProvider.cjs.map +1 -0
- package/dist/react-renderer/core/A2UIProvider.mjs +120 -0
- package/dist/react-renderer/core/A2UIProvider.mjs.map +1 -0
- package/dist/react-renderer/core/A2UIRenderer.cjs +93 -0
- package/dist/react-renderer/core/A2UIRenderer.cjs.map +1 -0
- package/dist/react-renderer/core/A2UIRenderer.mjs +92 -0
- package/dist/react-renderer/core/A2UIRenderer.mjs.map +1 -0
- package/dist/react-renderer/core/ComponentNode.cjs +53 -0
- package/dist/react-renderer/core/ComponentNode.cjs.map +1 -0
- package/dist/react-renderer/core/ComponentNode.mjs +52 -0
- package/dist/react-renderer/core/ComponentNode.mjs.map +1 -0
- package/dist/react-renderer/hooks/useA2UI.cjs +46 -0
- package/dist/react-renderer/hooks/useA2UI.cjs.map +1 -0
- package/dist/react-renderer/hooks/useA2UI.mjs +46 -0
- package/dist/react-renderer/hooks/useA2UI.mjs.map +1 -0
- package/dist/react-renderer/hooks/useA2UIComponent.cjs +173 -0
- package/dist/react-renderer/hooks/useA2UIComponent.cjs.map +1 -0
- package/dist/react-renderer/hooks/useA2UIComponent.mjs +172 -0
- package/dist/react-renderer/hooks/useA2UIComponent.mjs.map +1 -0
- package/dist/react-renderer/lib/utils.cjs +39 -0
- package/dist/react-renderer/lib/utils.cjs.map +1 -0
- package/dist/react-renderer/lib/utils.mjs +37 -0
- package/dist/react-renderer/lib/utils.mjs.map +1 -0
- package/dist/react-renderer/registry/ComponentRegistry.cjs +114 -0
- package/dist/react-renderer/registry/ComponentRegistry.cjs.map +1 -0
- package/dist/react-renderer/registry/ComponentRegistry.mjs +113 -0
- package/dist/react-renderer/registry/ComponentRegistry.mjs.map +1 -0
- package/dist/react-renderer/registry/defaultCatalog.cjs +57 -0
- package/dist/react-renderer/registry/defaultCatalog.cjs.map +1 -0
- package/dist/react-renderer/registry/defaultCatalog.mjs +57 -0
- package/dist/react-renderer/registry/defaultCatalog.mjs.map +1 -0
- package/dist/react-renderer/styles/index.cjs +458 -0
- package/dist/react-renderer/styles/index.cjs.map +1 -0
- package/dist/react-renderer/styles/{index.js → index.mjs} +47 -64
- package/dist/react-renderer/styles/index.mjs.map +1 -0
- package/dist/react-renderer/styles/reset.cjs +29 -0
- package/dist/react-renderer/styles/reset.cjs.map +1 -0
- package/dist/react-renderer/styles/reset.mjs +28 -0
- package/dist/react-renderer/styles/reset.mjs.map +1 -0
- package/dist/react-renderer/theme/ThemeContext.cjs +35 -0
- package/dist/react-renderer/theme/ThemeContext.cjs.map +1 -0
- package/dist/react-renderer/theme/ThemeContext.mjs +33 -0
- package/dist/react-renderer/theme/ThemeContext.mjs.map +1 -0
- package/dist/react-renderer/theme/litTheme.cjs +368 -0
- package/dist/react-renderer/theme/litTheme.cjs.map +1 -0
- package/dist/react-renderer/theme/litTheme.mjs +367 -0
- package/dist/react-renderer/theme/litTheme.mjs.map +1 -0
- package/dist/react-renderer/theme/utils.cjs +41 -0
- package/dist/react-renderer/theme/utils.cjs.map +1 -0
- package/dist/react-renderer/theme/utils.mjs +39 -0
- package/dist/react-renderer/theme/utils.mjs.map +1 -0
- package/dist/theme/viewer-theme.cjs +366 -0
- package/dist/theme/viewer-theme.cjs.map +1 -0
- package/dist/theme/viewer-theme.d.cts +7 -0
- package/dist/theme/viewer-theme.d.cts.map +1 -0
- package/dist/theme/viewer-theme.d.mts +7 -0
- package/dist/theme/viewer-theme.d.mts.map +1 -0
- package/dist/theme/viewer-theme.mjs +365 -0
- package/dist/theme/viewer-theme.mjs.map +1 -0
- package/package.json +15 -10
- package/dist/.tsbuildinfo +0 -1
- package/dist/A2UIMessageRenderer.d.ts +0 -7
- package/dist/A2UIMessageRenderer.d.ts.map +0 -1
- package/dist/A2UIMessageRenderer.js +0 -126
- package/dist/A2UIMessageRenderer.js.map +0 -1
- package/dist/A2UIViewer.d.ts +0 -32
- package/dist/A2UIViewer.d.ts.map +0 -1
- package/dist/A2UIViewer.js +0 -121
- package/dist/A2UIViewer.js.map +0 -1
- package/dist/__tests__/A2UIMessageRenderer.test.d.ts +0 -2
- package/dist/__tests__/A2UIMessageRenderer.test.d.ts.map +0 -1
- package/dist/__tests__/A2UIMessageRenderer.test.js +0 -229
- package/dist/__tests__/A2UIMessageRenderer.test.js.map +0 -1
- package/dist/__tests__/clsx-shim.d.ts +0 -8
- package/dist/__tests__/clsx-shim.d.ts.map +0 -1
- package/dist/__tests__/clsx-shim.js +0 -24
- package/dist/__tests__/clsx-shim.js.map +0 -1
- package/dist/__tests__/setup.d.ts +0 -2
- package/dist/__tests__/setup.d.ts.map +0 -1
- package/dist/__tests__/setup.js +0 -29
- package/dist/__tests__/setup.js.map +0 -1
- package/dist/index.d.ts +0 -13
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -19
- package/dist/index.js.map +0 -1
- package/dist/react-renderer/components/content/AudioPlayer.d.ts +0 -8
- package/dist/react-renderer/components/content/AudioPlayer.d.ts.map +0 -1
- package/dist/react-renderer/components/content/AudioPlayer.js +0 -23
- package/dist/react-renderer/components/content/AudioPlayer.js.map +0 -1
- package/dist/react-renderer/components/content/Divider.d.ts +0 -13
- package/dist/react-renderer/components/content/Divider.d.ts.map +0 -1
- package/dist/react-renderer/components/content/Divider.js +0 -22
- package/dist/react-renderer/components/content/Divider.js.map +0 -1
- package/dist/react-renderer/components/content/Icon.d.ts +0 -16
- package/dist/react-renderer/components/content/Icon.d.ts.map +0 -1
- package/dist/react-renderer/components/content/Icon.js +0 -40
- package/dist/react-renderer/components/content/Icon.js.map +0 -1
- package/dist/react-renderer/components/content/Image.d.ts +0 -11
- package/dist/react-renderer/components/content/Image.d.ts.map +0 -1
- package/dist/react-renderer/components/content/Image.js +0 -34
- package/dist/react-renderer/components/content/Image.js.map +0 -1
- package/dist/react-renderer/components/content/Text.d.ts +0 -28
- package/dist/react-renderer/components/content/Text.d.ts.map +0 -1
- package/dist/react-renderer/components/content/Text.js +0 -134
- package/dist/react-renderer/components/content/Text.js.map +0 -1
- package/dist/react-renderer/components/content/Video.d.ts +0 -10
- package/dist/react-renderer/components/content/Video.d.ts.map +0 -1
- package/dist/react-renderer/components/content/Video.js +0 -41
- package/dist/react-renderer/components/content/Video.js.map +0 -1
- package/dist/react-renderer/components/content/index.d.ts +0 -7
- package/dist/react-renderer/components/content/index.d.ts.map +0 -1
- package/dist/react-renderer/components/content/index.js +0 -7
- package/dist/react-renderer/components/content/index.js.map +0 -1
- package/dist/react-renderer/components/interactive/Button.d.ts +0 -11
- package/dist/react-renderer/components/interactive/Button.d.ts.map +0 -1
- package/dist/react-renderer/components/interactive/Button.js +0 -27
- package/dist/react-renderer/components/interactive/Button.js.map +0 -1
- package/dist/react-renderer/components/interactive/CheckBox.d.ts +0 -10
- package/dist/react-renderer/components/interactive/CheckBox.d.ts.map +0 -1
- package/dist/react-renderer/components/interactive/CheckBox.js +0 -55
- package/dist/react-renderer/components/interactive/CheckBox.js.map +0 -1
- package/dist/react-renderer/components/interactive/DateTimeInput.d.ts +0 -10
- package/dist/react-renderer/components/interactive/DateTimeInput.d.ts.map +0 -1
- package/dist/react-renderer/components/interactive/DateTimeInput.js +0 -68
- package/dist/react-renderer/components/interactive/DateTimeInput.js.map +0 -1
- package/dist/react-renderer/components/interactive/MultipleChoice.d.ts +0 -11
- package/dist/react-renderer/components/interactive/MultipleChoice.d.ts.map +0 -1
- package/dist/react-renderer/components/interactive/MultipleChoice.js +0 -43
- package/dist/react-renderer/components/interactive/MultipleChoice.js.map +0 -1
- package/dist/react-renderer/components/interactive/Slider.d.ts +0 -10
- package/dist/react-renderer/components/interactive/Slider.d.ts.map +0 -1
- package/dist/react-renderer/components/interactive/Slider.js +0 -62
- package/dist/react-renderer/components/interactive/Slider.js.map +0 -1
- package/dist/react-renderer/components/interactive/TextField.d.ts +0 -10
- package/dist/react-renderer/components/interactive/TextField.d.ts.map +0 -1
- package/dist/react-renderer/components/interactive/TextField.js +0 -59
- package/dist/react-renderer/components/interactive/TextField.js.map +0 -1
- package/dist/react-renderer/components/interactive/index.d.ts +0 -7
- package/dist/react-renderer/components/interactive/index.d.ts.map +0 -1
- package/dist/react-renderer/components/interactive/index.js +0 -7
- package/dist/react-renderer/components/interactive/index.js.map +0 -1
- package/dist/react-renderer/components/layout/Card.d.ts +0 -17
- package/dist/react-renderer/components/layout/Card.d.ts.map +0 -1
- package/dist/react-renderer/components/layout/Card.js +0 -39
- package/dist/react-renderer/components/layout/Card.js.map +0 -1
- package/dist/react-renderer/components/layout/Column.d.ts +0 -10
- package/dist/react-renderer/components/layout/Column.d.ts.map +0 -1
- package/dist/react-renderer/components/layout/Column.js +0 -33
- package/dist/react-renderer/components/layout/Column.js.map +0 -1
- package/dist/react-renderer/components/layout/List.d.ts +0 -10
- package/dist/react-renderer/components/layout/List.d.ts.map +0 -1
- package/dist/react-renderer/components/layout/List.js +0 -32
- package/dist/react-renderer/components/layout/List.js.map +0 -1
- package/dist/react-renderer/components/layout/Modal.d.ts +0 -15
- package/dist/react-renderer/components/layout/Modal.d.ts.map +0 -1
- package/dist/react-renderer/components/layout/Modal.js +0 -65
- package/dist/react-renderer/components/layout/Modal.js.map +0 -1
- package/dist/react-renderer/components/layout/Row.d.ts +0 -10
- package/dist/react-renderer/components/layout/Row.d.ts.map +0 -1
- package/dist/react-renderer/components/layout/Row.js +0 -33
- package/dist/react-renderer/components/layout/Row.js.map +0 -1
- package/dist/react-renderer/components/layout/Tabs.d.ts +0 -8
- package/dist/react-renderer/components/layout/Tabs.d.ts.map +0 -1
- package/dist/react-renderer/components/layout/Tabs.js +0 -29
- package/dist/react-renderer/components/layout/Tabs.js.map +0 -1
- package/dist/react-renderer/components/layout/index.d.ts +0 -7
- package/dist/react-renderer/components/layout/index.d.ts.map +0 -1
- package/dist/react-renderer/components/layout/index.js +0 -7
- package/dist/react-renderer/components/layout/index.js.map +0 -1
- package/dist/react-renderer/core/A2UIProvider.d.ts +0 -82
- package/dist/react-renderer/core/A2UIProvider.d.ts.map +0 -1
- package/dist/react-renderer/core/A2UIProvider.js +0 -156
- package/dist/react-renderer/core/A2UIProvider.js.map +0 -1
- package/dist/react-renderer/core/A2UIRenderer.d.ts +0 -36
- package/dist/react-renderer/core/A2UIRenderer.d.ts.map +0 -1
- package/dist/react-renderer/core/A2UIRenderer.js +0 -83
- package/dist/react-renderer/core/A2UIRenderer.js.map +0 -1
- package/dist/react-renderer/core/A2UIViewer.d.ts +0 -56
- package/dist/react-renderer/core/A2UIViewer.d.ts.map +0 -1
- package/dist/react-renderer/core/A2UIViewer.js +0 -135
- package/dist/react-renderer/core/A2UIViewer.js.map +0 -1
- package/dist/react-renderer/core/ComponentNode.d.ts +0 -25
- package/dist/react-renderer/core/ComponentNode.d.ts.map +0 -1
- package/dist/react-renderer/core/ComponentNode.js +0 -43
- package/dist/react-renderer/core/ComponentNode.js.map +0 -1
- package/dist/react-renderer/core/store.d.ts +0 -37
- package/dist/react-renderer/core/store.d.ts.map +0 -1
- package/dist/react-renderer/core/store.js +0 -2
- package/dist/react-renderer/core/store.js.map +0 -1
- package/dist/react-renderer/hooks/useA2UI.d.ts +0 -46
- package/dist/react-renderer/hooks/useA2UI.d.ts.map +0 -1
- package/dist/react-renderer/hooks/useA2UI.js +0 -41
- package/dist/react-renderer/hooks/useA2UI.js.map +0 -1
- package/dist/react-renderer/hooks/useA2UIComponent.d.ts +0 -52
- package/dist/react-renderer/hooks/useA2UIComponent.d.ts.map +0 -1
- package/dist/react-renderer/hooks/useA2UIComponent.js +0 -175
- package/dist/react-renderer/hooks/useA2UIComponent.js.map +0 -1
- package/dist/react-renderer/index.d.ts +0 -37
- package/dist/react-renderer/index.d.ts.map +0 -1
- package/dist/react-renderer/index.js +0 -40
- package/dist/react-renderer/index.js.map +0 -1
- package/dist/react-renderer/lib/utils.d.ts +0 -32
- package/dist/react-renderer/lib/utils.d.ts.map +0 -1
- package/dist/react-renderer/lib/utils.js +0 -41
- package/dist/react-renderer/lib/utils.js.map +0 -1
- package/dist/react-renderer/registry/ComponentRegistry.d.ts +0 -78
- package/dist/react-renderer/registry/ComponentRegistry.d.ts.map +0 -1
- package/dist/react-renderer/registry/ComponentRegistry.js +0 -113
- package/dist/react-renderer/registry/ComponentRegistry.js.map +0 -1
- package/dist/react-renderer/registry/defaultCatalog.d.ts +0 -13
- package/dist/react-renderer/registry/defaultCatalog.d.ts.map +0 -1
- package/dist/react-renderer/registry/defaultCatalog.js +0 -59
- package/dist/react-renderer/registry/defaultCatalog.js.map +0 -1
- package/dist/react-renderer/styles/index.d.ts +0 -41
- package/dist/react-renderer/styles/index.d.ts.map +0 -1
- package/dist/react-renderer/styles/index.js.map +0 -1
- package/dist/react-renderer/styles/reset.d.ts +0 -18
- package/dist/react-renderer/styles/reset.d.ts.map +0 -1
- package/dist/react-renderer/styles/reset.js +0 -24
- package/dist/react-renderer/styles/reset.js.map +0 -1
- package/dist/react-renderer/theme/ThemeContext.d.ts +0 -29
- package/dist/react-renderer/theme/ThemeContext.d.ts.map +0 -1
- package/dist/react-renderer/theme/ThemeContext.js +0 -35
- package/dist/react-renderer/theme/ThemeContext.js.map +0 -1
- package/dist/react-renderer/theme/litTheme.d.ts +0 -8
- package/dist/react-renderer/theme/litTheme.d.ts.map +0 -1
- package/dist/react-renderer/theme/litTheme.js +0 -401
- package/dist/react-renderer/theme/litTheme.js.map +0 -1
- package/dist/react-renderer/theme/utils.d.ts +0 -23
- package/dist/react-renderer/theme/utils.d.ts.map +0 -1
- package/dist/react-renderer/theme/utils.js +0 -46
- package/dist/react-renderer/theme/utils.js.map +0 -1
- package/dist/react-renderer/types.d.ts +0 -53
- package/dist/react-renderer/types.d.ts.map +0 -1
- package/dist/react-renderer/types.js +0 -2
- package/dist/react-renderer/types.js.map +0 -1
- package/dist/theme/viewer-theme.d.ts +0 -3
- package/dist/theme/viewer-theme.d.ts.map +0 -1
- package/dist/theme/viewer-theme.js +0 -391
- package/dist/theme/viewer-theme.js.map +0 -1
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
const require_runtime = require('./_virtual/_rolldown/runtime.cjs');
|
|
2
|
+
const require_A2UIProvider = require('./react-renderer/core/A2UIProvider.cjs');
|
|
3
|
+
const require_A2UIRenderer = require('./react-renderer/core/A2UIRenderer.cjs');
|
|
4
|
+
const require_defaultCatalog = require('./react-renderer/registry/defaultCatalog.cjs');
|
|
5
|
+
const require_index = require('./react-renderer/styles/index.cjs');
|
|
6
|
+
let _copilotkit_react_core_v2 = require("@copilotkit/react-core/v2");
|
|
7
|
+
let _a2ui_lit = require("@a2ui/lit");
|
|
8
|
+
let react = require("react");
|
|
9
|
+
let zod = require("zod");
|
|
10
|
+
let react_jsx_runtime = require("react/jsx-runtime");
|
|
11
|
+
|
|
12
|
+
//#region src/A2UIMessageRenderer.tsx
|
|
13
|
+
let initialized = false;
|
|
14
|
+
function ensureInitialized() {
|
|
15
|
+
if (!initialized) {
|
|
16
|
+
require_defaultCatalog.initializeDefaultCatalog();
|
|
17
|
+
require_index.injectStyles();
|
|
18
|
+
initialized = true;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
function createA2UIMessageRenderer(options) {
|
|
22
|
+
const { theme } = options;
|
|
23
|
+
return {
|
|
24
|
+
activityType: "a2ui-surface",
|
|
25
|
+
content: zod.z.any(),
|
|
26
|
+
render: ({ content, agent }) => {
|
|
27
|
+
ensureInitialized();
|
|
28
|
+
const [operations, setOperations] = (0, react.useState)([]);
|
|
29
|
+
const lastSignatureRef = (0, react.useRef)(null);
|
|
30
|
+
const { copilotkit } = (0, _copilotkit_react_core_v2.useCopilotKit)();
|
|
31
|
+
(0, react.useEffect)(() => {
|
|
32
|
+
if (!content || !Array.isArray(content.operations)) {
|
|
33
|
+
lastSignatureRef.current = null;
|
|
34
|
+
setOperations([]);
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
const incoming = content.operations;
|
|
38
|
+
const signature = stringifyOperations(incoming);
|
|
39
|
+
if (signature && signature === lastSignatureRef.current) return;
|
|
40
|
+
lastSignatureRef.current = signature;
|
|
41
|
+
setOperations(incoming);
|
|
42
|
+
}, [content]);
|
|
43
|
+
const groupedOperations = (0, react.useMemo)(() => {
|
|
44
|
+
const groups = /* @__PURE__ */ new Map();
|
|
45
|
+
for (const operation of operations) {
|
|
46
|
+
const surfaceId = getOperationSurfaceId(operation) ?? _a2ui_lit.v0_8.Data.A2uiMessageProcessor.DEFAULT_SURFACE_ID;
|
|
47
|
+
if (!groups.has(surfaceId)) groups.set(surfaceId, []);
|
|
48
|
+
groups.get(surfaceId).push(operation);
|
|
49
|
+
}
|
|
50
|
+
return groups;
|
|
51
|
+
}, [operations]);
|
|
52
|
+
if (!groupedOperations.size) return null;
|
|
53
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
54
|
+
className: "flex min-h-0 flex-1 flex-col gap-6 overflow-auto py-6",
|
|
55
|
+
children: Array.from(groupedOperations.entries()).map(([surfaceId, ops]) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ReactSurfaceHost, {
|
|
56
|
+
surfaceId,
|
|
57
|
+
operations: ops,
|
|
58
|
+
theme,
|
|
59
|
+
agent,
|
|
60
|
+
copilotkit
|
|
61
|
+
}, surfaceId))
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Renders a single A2UI surface using the React renderer.
|
|
68
|
+
* Wraps A2UIProvider + A2UIRenderer and bridges actions back to CopilotKit.
|
|
69
|
+
*/
|
|
70
|
+
function ReactSurfaceHost({ surfaceId, operations, theme, agent, copilotkit }) {
|
|
71
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
72
|
+
className: "flex w-full flex-none overflow-hidden rounded-lg bg-white/5 p-4",
|
|
73
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(require_A2UIProvider.A2UIProvider, {
|
|
74
|
+
onAction: (0, react.useCallback)(async (message) => {
|
|
75
|
+
if (!agent) return;
|
|
76
|
+
try {
|
|
77
|
+
console.info("[A2UI] Action dispatched", message.userAction);
|
|
78
|
+
copilotkit.setProperties({
|
|
79
|
+
...copilotkit.properties ?? {},
|
|
80
|
+
a2uiAction: message
|
|
81
|
+
});
|
|
82
|
+
await copilotkit.runAgent({ agent });
|
|
83
|
+
} finally {
|
|
84
|
+
if (copilotkit.properties) {
|
|
85
|
+
const { a2uiAction, ...rest } = copilotkit.properties;
|
|
86
|
+
copilotkit.setProperties(rest);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}, [agent, copilotkit]),
|
|
90
|
+
theme,
|
|
91
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(SurfaceMessageProcessor, {
|
|
92
|
+
surfaceId,
|
|
93
|
+
operations
|
|
94
|
+
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_A2UIRenderer.default, {
|
|
95
|
+
surfaceId,
|
|
96
|
+
className: "flex flex-1"
|
|
97
|
+
})]
|
|
98
|
+
})
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Processes A2UI operations into the provider's message processor.
|
|
103
|
+
* Must be a child of A2UIProvider to access the actions context.
|
|
104
|
+
*/
|
|
105
|
+
function SurfaceMessageProcessor({ surfaceId, operations }) {
|
|
106
|
+
const { processMessages } = require_A2UIProvider.useA2UIActions();
|
|
107
|
+
const lastProcessedRef = (0, react.useRef)("");
|
|
108
|
+
(0, react.useEffect)(() => {
|
|
109
|
+
const key = `${surfaceId}-${JSON.stringify(operations)}`;
|
|
110
|
+
if (key === lastProcessedRef.current) return;
|
|
111
|
+
lastProcessedRef.current = key;
|
|
112
|
+
processMessages(operations);
|
|
113
|
+
}, [
|
|
114
|
+
processMessages,
|
|
115
|
+
surfaceId,
|
|
116
|
+
operations
|
|
117
|
+
]);
|
|
118
|
+
return null;
|
|
119
|
+
}
|
|
120
|
+
function getOperationSurfaceId(operation) {
|
|
121
|
+
if (!operation || typeof operation !== "object") return null;
|
|
122
|
+
if (typeof operation.surfaceId === "string") return operation.surfaceId;
|
|
123
|
+
return operation?.beginRendering?.surfaceId ?? operation?.surfaceUpdate?.surfaceId ?? operation?.dataModelUpdate?.surfaceId ?? operation?.deleteSurface?.surfaceId ?? null;
|
|
124
|
+
}
|
|
125
|
+
function stringifyOperations(ops) {
|
|
126
|
+
try {
|
|
127
|
+
return JSON.stringify(ops);
|
|
128
|
+
} catch (error) {
|
|
129
|
+
return null;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
//#endregion
|
|
134
|
+
exports.createA2UIMessageRenderer = createA2UIMessageRenderer;
|
|
135
|
+
//# sourceMappingURL=A2UIMessageRenderer.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"A2UIMessageRenderer.cjs","names":["z","v0_8","A2UIProvider","A2UIRenderer","useA2UIActions"],"sources":["../src/A2UIMessageRenderer.tsx"],"sourcesContent":["import {\n useCopilotKit,\n type ReactActivityMessageRenderer,\n} from \"@copilotkit/react-core/v2\";\nimport { v0_8 } from \"@a2ui/lit\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { z } from \"zod\";\nimport {\n A2UIProvider,\n useA2UIActions,\n} from \"./react-renderer/core/A2UIProvider\";\nimport { A2UIRenderer } from \"./react-renderer/core/A2UIRenderer\";\nimport { initializeDefaultCatalog } from \"./react-renderer/registry/defaultCatalog\";\nimport { injectStyles } from \"./react-renderer/styles\";\nimport type { Types } from \"@a2ui/lit/0.8\";\n\n// Initialize the React renderer's component catalog and styles once\nlet initialized = false;\nfunction ensureInitialized() {\n if (!initialized) {\n initializeDefaultCatalog();\n injectStyles();\n initialized = true;\n }\n}\n\nexport type A2UIMessageRendererOptions = {\n theme: v0_8.Types.Theme;\n};\n\nexport function createA2UIMessageRenderer(\n options: A2UIMessageRendererOptions,\n): ReactActivityMessageRenderer<any> {\n const { theme } = options;\n\n return {\n activityType: \"a2ui-surface\",\n content: z.any(),\n render: ({ content, agent }) => {\n ensureInitialized();\n\n const [operations, setOperations] = useState<any[]>([]);\n const lastSignatureRef = useRef<string | null>(null);\n const { copilotkit } = useCopilotKit();\n\n useEffect(() => {\n if (!content || !Array.isArray(content.operations)) {\n lastSignatureRef.current = null;\n setOperations([]);\n return;\n }\n\n const incoming = content.operations as any[];\n const signature = stringifyOperations(incoming);\n\n if (signature && signature === lastSignatureRef.current) {\n return;\n }\n\n lastSignatureRef.current = signature;\n setOperations(incoming);\n }, [content]);\n\n // Group operations by surface ID\n const groupedOperations = useMemo(() => {\n const groups = new Map<string, any[]>();\n\n for (const operation of operations) {\n const surfaceId =\n getOperationSurfaceId(operation) ??\n v0_8.Data.A2uiMessageProcessor.DEFAULT_SURFACE_ID;\n\n if (!groups.has(surfaceId)) {\n groups.set(surfaceId, []);\n }\n groups.get(surfaceId)!.push(operation);\n }\n\n return groups;\n }, [operations]);\n\n if (!groupedOperations.size) {\n return null;\n }\n\n return (\n <div className=\"flex min-h-0 flex-1 flex-col gap-6 overflow-auto py-6\">\n {Array.from(groupedOperations.entries()).map(([surfaceId, ops]) => (\n <ReactSurfaceHost\n key={surfaceId}\n surfaceId={surfaceId}\n operations={ops}\n theme={theme}\n agent={agent}\n copilotkit={copilotkit}\n />\n ))}\n </div>\n );\n },\n };\n}\n\ntype ReactSurfaceHostProps = {\n surfaceId: string;\n operations: any[];\n theme: v0_8.Types.Theme;\n agent: any;\n copilotkit: any;\n};\n\n/**\n * Renders a single A2UI surface using the React renderer.\n * Wraps A2UIProvider + A2UIRenderer and bridges actions back to CopilotKit.\n */\nfunction ReactSurfaceHost({\n surfaceId,\n operations,\n theme,\n agent,\n copilotkit,\n}: ReactSurfaceHostProps) {\n // Bridge: when the React renderer dispatches an action, send it to CopilotKit\n const handleAction = useCallback(\n async (message: Types.A2UIClientEventMessage) => {\n if (!agent) return;\n\n try {\n console.info(\"[A2UI] Action dispatched\", message.userAction);\n\n copilotkit.setProperties({\n ...(copilotkit.properties ?? {}),\n a2uiAction: message,\n });\n\n await copilotkit.runAgent({ agent });\n } finally {\n if (copilotkit.properties) {\n const { a2uiAction, ...rest } = copilotkit.properties;\n copilotkit.setProperties(rest);\n }\n }\n },\n [agent, copilotkit],\n );\n\n return (\n <div className=\"flex w-full flex-none overflow-hidden rounded-lg bg-white/5 p-4\">\n <A2UIProvider onAction={handleAction} theme={theme}>\n <SurfaceMessageProcessor\n surfaceId={surfaceId}\n operations={operations}\n />\n <A2UIRenderer surfaceId={surfaceId} className=\"flex flex-1\" />\n </A2UIProvider>\n </div>\n );\n}\n\n/**\n * Processes A2UI operations into the provider's message processor.\n * Must be a child of A2UIProvider to access the actions context.\n */\nfunction SurfaceMessageProcessor({\n surfaceId,\n operations,\n}: {\n surfaceId: string;\n operations: any[];\n}) {\n const { processMessages } = useA2UIActions();\n const lastProcessedRef = useRef<string>(\"\");\n\n useEffect(() => {\n const key = `${surfaceId}-${JSON.stringify(operations)}`;\n if (key === lastProcessedRef.current) return;\n lastProcessedRef.current = key;\n\n processMessages(operations);\n }, [processMessages, surfaceId, operations]);\n\n return null;\n}\n\nfunction getOperationSurfaceId(operation: any): string | null {\n if (!operation || typeof operation !== \"object\") {\n return null;\n }\n\n if (typeof operation.surfaceId === \"string\") {\n return operation.surfaceId;\n }\n\n return (\n operation?.beginRendering?.surfaceId ??\n operation?.surfaceUpdate?.surfaceId ??\n operation?.dataModelUpdate?.surfaceId ??\n operation?.deleteSurface?.surfaceId ??\n null\n );\n}\n\nfunction stringifyOperations(ops: any[]): string | null {\n try {\n return JSON.stringify(ops);\n } catch (error) {\n return null;\n }\n}\n"],"mappings":";;;;;;;;;;;;AAiBA,IAAI,cAAc;AAClB,SAAS,oBAAoB;AAC3B,KAAI,CAAC,aAAa;AAChB,mDAA0B;AAC1B,8BAAc;AACd,gBAAc;;;AAQlB,SAAgB,0BACd,SACmC;CACnC,MAAM,EAAE,UAAU;AAElB,QAAO;EACL,cAAc;EACd,SAASA,MAAE,KAAK;EAChB,SAAS,EAAE,SAAS,YAAY;AAC9B,sBAAmB;GAEnB,MAAM,CAAC,YAAY,qCAAiC,EAAE,CAAC;GACvD,MAAM,qCAAyC,KAAK;GACpD,MAAM,EAAE,6DAA8B;AAEtC,8BAAgB;AACd,QAAI,CAAC,WAAW,CAAC,MAAM,QAAQ,QAAQ,WAAW,EAAE;AAClD,sBAAiB,UAAU;AAC3B,mBAAc,EAAE,CAAC;AACjB;;IAGF,MAAM,WAAW,QAAQ;IACzB,MAAM,YAAY,oBAAoB,SAAS;AAE/C,QAAI,aAAa,cAAc,iBAAiB,QAC9C;AAGF,qBAAiB,UAAU;AAC3B,kBAAc,SAAS;MACtB,CAAC,QAAQ,CAAC;GAGb,MAAM,6CAAkC;IACtC,MAAM,yBAAS,IAAI,KAAoB;AAEvC,SAAK,MAAM,aAAa,YAAY;KAClC,MAAM,YACJ,sBAAsB,UAAU,IAChCC,eAAK,KAAK,qBAAqB;AAEjC,SAAI,CAAC,OAAO,IAAI,UAAU,CACxB,QAAO,IAAI,WAAW,EAAE,CAAC;AAE3B,YAAO,IAAI,UAAU,CAAE,KAAK,UAAU;;AAGxC,WAAO;MACN,CAAC,WAAW,CAAC;AAEhB,OAAI,CAAC,kBAAkB,KACrB,QAAO;AAGT,UACE,2CAAC;IAAI,WAAU;cACZ,MAAM,KAAK,kBAAkB,SAAS,CAAC,CAAC,KAAK,CAAC,WAAW,SACxD,2CAAC;KAEY;KACX,YAAY;KACL;KACA;KACK;OALP,UAML,CACF;KACE;;EAGX;;;;;;AAeH,SAAS,iBAAiB,EACxB,WACA,YACA,OACA,OACA,cACwB;AAyBxB,QACE,2CAAC;EAAI,WAAU;YACb,4CAACC;GAAa,iCAxBhB,OAAO,YAA0C;AAC/C,QAAI,CAAC,MAAO;AAEZ,QAAI;AACF,aAAQ,KAAK,4BAA4B,QAAQ,WAAW;AAE5D,gBAAW,cAAc;MACvB,GAAI,WAAW,cAAc,EAAE;MAC/B,YAAY;MACb,CAAC;AAEF,WAAM,WAAW,SAAS,EAAE,OAAO,CAAC;cAC5B;AACR,SAAI,WAAW,YAAY;MACzB,MAAM,EAAE,YAAY,GAAG,SAAS,WAAW;AAC3C,iBAAW,cAAc,KAAK;;;MAIpC,CAAC,OAAO,WAAW,CACpB;GAIgD;cAC3C,2CAAC;IACY;IACC;KACZ,EACF,2CAACC;IAAwB;IAAW,WAAU;KAAgB;IACjD;GACX;;;;;;AAQV,SAAS,wBAAwB,EAC/B,WACA,cAIC;CACD,MAAM,EAAE,oBAAoBC,qCAAgB;CAC5C,MAAM,qCAAkC,GAAG;AAE3C,4BAAgB;EACd,MAAM,MAAM,GAAG,UAAU,GAAG,KAAK,UAAU,WAAW;AACtD,MAAI,QAAQ,iBAAiB,QAAS;AACtC,mBAAiB,UAAU;AAE3B,kBAAgB,WAAW;IAC1B;EAAC;EAAiB;EAAW;EAAW,CAAC;AAE5C,QAAO;;AAGT,SAAS,sBAAsB,WAA+B;AAC5D,KAAI,CAAC,aAAa,OAAO,cAAc,SACrC,QAAO;AAGT,KAAI,OAAO,UAAU,cAAc,SACjC,QAAO,UAAU;AAGnB,QACE,WAAW,gBAAgB,aAC3B,WAAW,eAAe,aAC1B,WAAW,iBAAiB,aAC5B,WAAW,eAAe,aAC1B;;AAIJ,SAAS,oBAAoB,KAA2B;AACtD,KAAI;AACF,SAAO,KAAK,UAAU,IAAI;UACnB,OAAO;AACd,SAAO"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { ReactActivityMessageRenderer } from "@copilotkit/react-core/v2";
|
|
2
|
+
import { v0_8 } from "@a2ui/lit";
|
|
3
|
+
|
|
4
|
+
//#region src/A2UIMessageRenderer.d.ts
|
|
5
|
+
type A2UIMessageRendererOptions = {
|
|
6
|
+
theme: v0_8.Types.Theme;
|
|
7
|
+
};
|
|
8
|
+
declare function createA2UIMessageRenderer(options: A2UIMessageRendererOptions): ReactActivityMessageRenderer<any>;
|
|
9
|
+
//#endregion
|
|
10
|
+
export { A2UIMessageRendererOptions, createA2UIMessageRenderer };
|
|
11
|
+
//# sourceMappingURL=A2UIMessageRenderer.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"A2UIMessageRenderer.d.cts","names":[],"sources":["../src/A2UIMessageRenderer.tsx"],"mappings":";;;;KA0BY,0BAAA;EACV,KAAA,EAAO,IAAA,CAAK,KAAA,CAAM,KAAA;AAAA;AAAA,iBAGJ,yBAAA,CACd,OAAA,EAAS,0BAAA,GACR,4BAAA"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { ReactActivityMessageRenderer } from "@copilotkit/react-core/v2";
|
|
2
|
+
import { v0_8 } from "@a2ui/lit";
|
|
3
|
+
|
|
4
|
+
//#region src/A2UIMessageRenderer.d.ts
|
|
5
|
+
type A2UIMessageRendererOptions = {
|
|
6
|
+
theme: v0_8.Types.Theme;
|
|
7
|
+
};
|
|
8
|
+
declare function createA2UIMessageRenderer(options: A2UIMessageRendererOptions): ReactActivityMessageRenderer<any>;
|
|
9
|
+
//#endregion
|
|
10
|
+
export { A2UIMessageRendererOptions, createA2UIMessageRenderer };
|
|
11
|
+
//# sourceMappingURL=A2UIMessageRenderer.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"A2UIMessageRenderer.d.mts","names":[],"sources":["../src/A2UIMessageRenderer.tsx"],"mappings":";;;;KA0BY,0BAAA;EACV,KAAA,EAAO,IAAA,CAAK,KAAA,CAAM,KAAA;AAAA;AAAA,iBAGJ,yBAAA,CACd,OAAA,EAAS,0BAAA,GACR,4BAAA"}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import { A2UIProvider, useA2UIActions } from "./react-renderer/core/A2UIProvider.mjs";
|
|
2
|
+
import A2UIRenderer from "./react-renderer/core/A2UIRenderer.mjs";
|
|
3
|
+
import { initializeDefaultCatalog } from "./react-renderer/registry/defaultCatalog.mjs";
|
|
4
|
+
import { injectStyles } from "./react-renderer/styles/index.mjs";
|
|
5
|
+
import { useCopilotKit } from "@copilotkit/react-core/v2";
|
|
6
|
+
import { v0_8 } from "@a2ui/lit";
|
|
7
|
+
import { useCallback, useEffect, useMemo, useRef, useState } from "react";
|
|
8
|
+
import { z } from "zod";
|
|
9
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
10
|
+
|
|
11
|
+
//#region src/A2UIMessageRenderer.tsx
|
|
12
|
+
let initialized = false;
|
|
13
|
+
function ensureInitialized() {
|
|
14
|
+
if (!initialized) {
|
|
15
|
+
initializeDefaultCatalog();
|
|
16
|
+
injectStyles();
|
|
17
|
+
initialized = true;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
function createA2UIMessageRenderer(options) {
|
|
21
|
+
const { theme } = options;
|
|
22
|
+
return {
|
|
23
|
+
activityType: "a2ui-surface",
|
|
24
|
+
content: z.any(),
|
|
25
|
+
render: ({ content, agent }) => {
|
|
26
|
+
ensureInitialized();
|
|
27
|
+
const [operations, setOperations] = useState([]);
|
|
28
|
+
const lastSignatureRef = useRef(null);
|
|
29
|
+
const { copilotkit } = useCopilotKit();
|
|
30
|
+
useEffect(() => {
|
|
31
|
+
if (!content || !Array.isArray(content.operations)) {
|
|
32
|
+
lastSignatureRef.current = null;
|
|
33
|
+
setOperations([]);
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
const incoming = content.operations;
|
|
37
|
+
const signature = stringifyOperations(incoming);
|
|
38
|
+
if (signature && signature === lastSignatureRef.current) return;
|
|
39
|
+
lastSignatureRef.current = signature;
|
|
40
|
+
setOperations(incoming);
|
|
41
|
+
}, [content]);
|
|
42
|
+
const groupedOperations = useMemo(() => {
|
|
43
|
+
const groups = /* @__PURE__ */ new Map();
|
|
44
|
+
for (const operation of operations) {
|
|
45
|
+
const surfaceId = getOperationSurfaceId(operation) ?? v0_8.Data.A2uiMessageProcessor.DEFAULT_SURFACE_ID;
|
|
46
|
+
if (!groups.has(surfaceId)) groups.set(surfaceId, []);
|
|
47
|
+
groups.get(surfaceId).push(operation);
|
|
48
|
+
}
|
|
49
|
+
return groups;
|
|
50
|
+
}, [operations]);
|
|
51
|
+
if (!groupedOperations.size) return null;
|
|
52
|
+
return /* @__PURE__ */ jsx("div", {
|
|
53
|
+
className: "flex min-h-0 flex-1 flex-col gap-6 overflow-auto py-6",
|
|
54
|
+
children: Array.from(groupedOperations.entries()).map(([surfaceId, ops]) => /* @__PURE__ */ jsx(ReactSurfaceHost, {
|
|
55
|
+
surfaceId,
|
|
56
|
+
operations: ops,
|
|
57
|
+
theme,
|
|
58
|
+
agent,
|
|
59
|
+
copilotkit
|
|
60
|
+
}, surfaceId))
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Renders a single A2UI surface using the React renderer.
|
|
67
|
+
* Wraps A2UIProvider + A2UIRenderer and bridges actions back to CopilotKit.
|
|
68
|
+
*/
|
|
69
|
+
function ReactSurfaceHost({ surfaceId, operations, theme, agent, copilotkit }) {
|
|
70
|
+
return /* @__PURE__ */ jsx("div", {
|
|
71
|
+
className: "flex w-full flex-none overflow-hidden rounded-lg bg-white/5 p-4",
|
|
72
|
+
children: /* @__PURE__ */ jsxs(A2UIProvider, {
|
|
73
|
+
onAction: useCallback(async (message) => {
|
|
74
|
+
if (!agent) return;
|
|
75
|
+
try {
|
|
76
|
+
console.info("[A2UI] Action dispatched", message.userAction);
|
|
77
|
+
copilotkit.setProperties({
|
|
78
|
+
...copilotkit.properties ?? {},
|
|
79
|
+
a2uiAction: message
|
|
80
|
+
});
|
|
81
|
+
await copilotkit.runAgent({ agent });
|
|
82
|
+
} finally {
|
|
83
|
+
if (copilotkit.properties) {
|
|
84
|
+
const { a2uiAction, ...rest } = copilotkit.properties;
|
|
85
|
+
copilotkit.setProperties(rest);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}, [agent, copilotkit]),
|
|
89
|
+
theme,
|
|
90
|
+
children: [/* @__PURE__ */ jsx(SurfaceMessageProcessor, {
|
|
91
|
+
surfaceId,
|
|
92
|
+
operations
|
|
93
|
+
}), /* @__PURE__ */ jsx(A2UIRenderer, {
|
|
94
|
+
surfaceId,
|
|
95
|
+
className: "flex flex-1"
|
|
96
|
+
})]
|
|
97
|
+
})
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Processes A2UI operations into the provider's message processor.
|
|
102
|
+
* Must be a child of A2UIProvider to access the actions context.
|
|
103
|
+
*/
|
|
104
|
+
function SurfaceMessageProcessor({ surfaceId, operations }) {
|
|
105
|
+
const { processMessages } = useA2UIActions();
|
|
106
|
+
const lastProcessedRef = useRef("");
|
|
107
|
+
useEffect(() => {
|
|
108
|
+
const key = `${surfaceId}-${JSON.stringify(operations)}`;
|
|
109
|
+
if (key === lastProcessedRef.current) return;
|
|
110
|
+
lastProcessedRef.current = key;
|
|
111
|
+
processMessages(operations);
|
|
112
|
+
}, [
|
|
113
|
+
processMessages,
|
|
114
|
+
surfaceId,
|
|
115
|
+
operations
|
|
116
|
+
]);
|
|
117
|
+
return null;
|
|
118
|
+
}
|
|
119
|
+
function getOperationSurfaceId(operation) {
|
|
120
|
+
if (!operation || typeof operation !== "object") return null;
|
|
121
|
+
if (typeof operation.surfaceId === "string") return operation.surfaceId;
|
|
122
|
+
return operation?.beginRendering?.surfaceId ?? operation?.surfaceUpdate?.surfaceId ?? operation?.dataModelUpdate?.surfaceId ?? operation?.deleteSurface?.surfaceId ?? null;
|
|
123
|
+
}
|
|
124
|
+
function stringifyOperations(ops) {
|
|
125
|
+
try {
|
|
126
|
+
return JSON.stringify(ops);
|
|
127
|
+
} catch (error) {
|
|
128
|
+
return null;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
//#endregion
|
|
133
|
+
export { createA2UIMessageRenderer };
|
|
134
|
+
//# sourceMappingURL=A2UIMessageRenderer.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"A2UIMessageRenderer.mjs","names":[],"sources":["../src/A2UIMessageRenderer.tsx"],"sourcesContent":["import {\n useCopilotKit,\n type ReactActivityMessageRenderer,\n} from \"@copilotkit/react-core/v2\";\nimport { v0_8 } from \"@a2ui/lit\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { z } from \"zod\";\nimport {\n A2UIProvider,\n useA2UIActions,\n} from \"./react-renderer/core/A2UIProvider\";\nimport { A2UIRenderer } from \"./react-renderer/core/A2UIRenderer\";\nimport { initializeDefaultCatalog } from \"./react-renderer/registry/defaultCatalog\";\nimport { injectStyles } from \"./react-renderer/styles\";\nimport type { Types } from \"@a2ui/lit/0.8\";\n\n// Initialize the React renderer's component catalog and styles once\nlet initialized = false;\nfunction ensureInitialized() {\n if (!initialized) {\n initializeDefaultCatalog();\n injectStyles();\n initialized = true;\n }\n}\n\nexport type A2UIMessageRendererOptions = {\n theme: v0_8.Types.Theme;\n};\n\nexport function createA2UIMessageRenderer(\n options: A2UIMessageRendererOptions,\n): ReactActivityMessageRenderer<any> {\n const { theme } = options;\n\n return {\n activityType: \"a2ui-surface\",\n content: z.any(),\n render: ({ content, agent }) => {\n ensureInitialized();\n\n const [operations, setOperations] = useState<any[]>([]);\n const lastSignatureRef = useRef<string | null>(null);\n const { copilotkit } = useCopilotKit();\n\n useEffect(() => {\n if (!content || !Array.isArray(content.operations)) {\n lastSignatureRef.current = null;\n setOperations([]);\n return;\n }\n\n const incoming = content.operations as any[];\n const signature = stringifyOperations(incoming);\n\n if (signature && signature === lastSignatureRef.current) {\n return;\n }\n\n lastSignatureRef.current = signature;\n setOperations(incoming);\n }, [content]);\n\n // Group operations by surface ID\n const groupedOperations = useMemo(() => {\n const groups = new Map<string, any[]>();\n\n for (const operation of operations) {\n const surfaceId =\n getOperationSurfaceId(operation) ??\n v0_8.Data.A2uiMessageProcessor.DEFAULT_SURFACE_ID;\n\n if (!groups.has(surfaceId)) {\n groups.set(surfaceId, []);\n }\n groups.get(surfaceId)!.push(operation);\n }\n\n return groups;\n }, [operations]);\n\n if (!groupedOperations.size) {\n return null;\n }\n\n return (\n <div className=\"flex min-h-0 flex-1 flex-col gap-6 overflow-auto py-6\">\n {Array.from(groupedOperations.entries()).map(([surfaceId, ops]) => (\n <ReactSurfaceHost\n key={surfaceId}\n surfaceId={surfaceId}\n operations={ops}\n theme={theme}\n agent={agent}\n copilotkit={copilotkit}\n />\n ))}\n </div>\n );\n },\n };\n}\n\ntype ReactSurfaceHostProps = {\n surfaceId: string;\n operations: any[];\n theme: v0_8.Types.Theme;\n agent: any;\n copilotkit: any;\n};\n\n/**\n * Renders a single A2UI surface using the React renderer.\n * Wraps A2UIProvider + A2UIRenderer and bridges actions back to CopilotKit.\n */\nfunction ReactSurfaceHost({\n surfaceId,\n operations,\n theme,\n agent,\n copilotkit,\n}: ReactSurfaceHostProps) {\n // Bridge: when the React renderer dispatches an action, send it to CopilotKit\n const handleAction = useCallback(\n async (message: Types.A2UIClientEventMessage) => {\n if (!agent) return;\n\n try {\n console.info(\"[A2UI] Action dispatched\", message.userAction);\n\n copilotkit.setProperties({\n ...(copilotkit.properties ?? {}),\n a2uiAction: message,\n });\n\n await copilotkit.runAgent({ agent });\n } finally {\n if (copilotkit.properties) {\n const { a2uiAction, ...rest } = copilotkit.properties;\n copilotkit.setProperties(rest);\n }\n }\n },\n [agent, copilotkit],\n );\n\n return (\n <div className=\"flex w-full flex-none overflow-hidden rounded-lg bg-white/5 p-4\">\n <A2UIProvider onAction={handleAction} theme={theme}>\n <SurfaceMessageProcessor\n surfaceId={surfaceId}\n operations={operations}\n />\n <A2UIRenderer surfaceId={surfaceId} className=\"flex flex-1\" />\n </A2UIProvider>\n </div>\n );\n}\n\n/**\n * Processes A2UI operations into the provider's message processor.\n * Must be a child of A2UIProvider to access the actions context.\n */\nfunction SurfaceMessageProcessor({\n surfaceId,\n operations,\n}: {\n surfaceId: string;\n operations: any[];\n}) {\n const { processMessages } = useA2UIActions();\n const lastProcessedRef = useRef<string>(\"\");\n\n useEffect(() => {\n const key = `${surfaceId}-${JSON.stringify(operations)}`;\n if (key === lastProcessedRef.current) return;\n lastProcessedRef.current = key;\n\n processMessages(operations);\n }, [processMessages, surfaceId, operations]);\n\n return null;\n}\n\nfunction getOperationSurfaceId(operation: any): string | null {\n if (!operation || typeof operation !== \"object\") {\n return null;\n }\n\n if (typeof operation.surfaceId === \"string\") {\n return operation.surfaceId;\n }\n\n return (\n operation?.beginRendering?.surfaceId ??\n operation?.surfaceUpdate?.surfaceId ??\n operation?.dataModelUpdate?.surfaceId ??\n operation?.deleteSurface?.surfaceId ??\n null\n );\n}\n\nfunction stringifyOperations(ops: any[]): string | null {\n try {\n return JSON.stringify(ops);\n } catch (error) {\n return null;\n }\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
const require_runtime = require('./_virtual/_rolldown/runtime.cjs');
|
|
4
|
+
const require_A2UIProvider = require('./react-renderer/core/A2UIProvider.cjs');
|
|
5
|
+
const require_A2UIRenderer = require('./react-renderer/core/A2UIRenderer.cjs');
|
|
6
|
+
const require_defaultCatalog = require('./react-renderer/registry/defaultCatalog.cjs');
|
|
7
|
+
const require_index = require('./react-renderer/styles/index.cjs');
|
|
8
|
+
const require_viewer_theme = require('./theme/viewer-theme.cjs');
|
|
9
|
+
let react = require("react");
|
|
10
|
+
react = require_runtime.__toESM(react);
|
|
11
|
+
let react_jsx_runtime = require("react/jsx-runtime");
|
|
12
|
+
|
|
13
|
+
//#region src/A2UIViewer.tsx
|
|
14
|
+
let initialized = false;
|
|
15
|
+
function ensureInitialized() {
|
|
16
|
+
if (!initialized) {
|
|
17
|
+
require_defaultCatalog.initializeDefaultCatalog();
|
|
18
|
+
require_index.injectStyles();
|
|
19
|
+
initialized = true;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* A2UIViewer renders an A2UI component tree from a JSON definition and data.
|
|
24
|
+
* It re-renders cleanly when props change, discarding previous state.
|
|
25
|
+
*/
|
|
26
|
+
function A2UIViewer({ root, components, data, onAction, styles, className }) {
|
|
27
|
+
ensureInitialized();
|
|
28
|
+
const baseId = (0, react.useId)();
|
|
29
|
+
const surfaceId = (0, react.useMemo)(() => {
|
|
30
|
+
const definitionKey = `${root}-${JSON.stringify(components)}`;
|
|
31
|
+
let hash = 0;
|
|
32
|
+
for (let i = 0; i < definitionKey.length; i++) {
|
|
33
|
+
const char = definitionKey.charCodeAt(i);
|
|
34
|
+
hash = (hash << 5) - hash + char;
|
|
35
|
+
hash = hash & hash;
|
|
36
|
+
}
|
|
37
|
+
return `surface${baseId.replace(/:/g, "-")}${hash}`;
|
|
38
|
+
}, [
|
|
39
|
+
baseId,
|
|
40
|
+
root,
|
|
41
|
+
components
|
|
42
|
+
]);
|
|
43
|
+
const handleAction = (0, react.useMemo)(() => {
|
|
44
|
+
if (!onAction) return void 0;
|
|
45
|
+
return (message) => {
|
|
46
|
+
const userAction = message.userAction;
|
|
47
|
+
if (userAction) onAction({
|
|
48
|
+
actionName: userAction.name,
|
|
49
|
+
sourceComponentId: userAction.sourceComponentId,
|
|
50
|
+
timestamp: userAction.timestamp,
|
|
51
|
+
context: userAction.context ?? {}
|
|
52
|
+
});
|
|
53
|
+
};
|
|
54
|
+
}, [onAction]);
|
|
55
|
+
if (!components || components.length === 0) return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
56
|
+
className,
|
|
57
|
+
style: {
|
|
58
|
+
padding: 16,
|
|
59
|
+
color: "#666",
|
|
60
|
+
fontFamily: "system-ui"
|
|
61
|
+
},
|
|
62
|
+
children: "No content to display"
|
|
63
|
+
});
|
|
64
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_A2UIProvider.A2UIProvider, {
|
|
65
|
+
onAction: handleAction,
|
|
66
|
+
theme: require_viewer_theme.theme,
|
|
67
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(A2UIViewerInner, {
|
|
68
|
+
surfaceId,
|
|
69
|
+
root,
|
|
70
|
+
components,
|
|
71
|
+
data: data ?? {},
|
|
72
|
+
styles,
|
|
73
|
+
className
|
|
74
|
+
})
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Inner component that processes messages within the provider context.
|
|
79
|
+
*/
|
|
80
|
+
function A2UIViewerInner({ surfaceId, root, components, data, styles, className }) {
|
|
81
|
+
const { processMessages } = require_A2UIProvider.useA2UIActions();
|
|
82
|
+
const lastProcessedRef = (0, react.useRef)("");
|
|
83
|
+
(0, react.useEffect)(() => {
|
|
84
|
+
const key = `${surfaceId}-${JSON.stringify(components)}-${JSON.stringify(data)}`;
|
|
85
|
+
if (key === lastProcessedRef.current) return;
|
|
86
|
+
lastProcessedRef.current = key;
|
|
87
|
+
const messages = [{ beginRendering: {
|
|
88
|
+
surfaceId,
|
|
89
|
+
root,
|
|
90
|
+
styles: styles ?? {}
|
|
91
|
+
} }, { surfaceUpdate: {
|
|
92
|
+
surfaceId,
|
|
93
|
+
components
|
|
94
|
+
} }];
|
|
95
|
+
if (data && Object.keys(data).length > 0) {
|
|
96
|
+
const contents = objectToValueMaps(data);
|
|
97
|
+
if (contents.length > 0) messages.push({ dataModelUpdate: {
|
|
98
|
+
surfaceId,
|
|
99
|
+
path: "/",
|
|
100
|
+
contents
|
|
101
|
+
} });
|
|
102
|
+
}
|
|
103
|
+
processMessages(messages);
|
|
104
|
+
}, [
|
|
105
|
+
processMessages,
|
|
106
|
+
surfaceId,
|
|
107
|
+
root,
|
|
108
|
+
components,
|
|
109
|
+
data,
|
|
110
|
+
styles
|
|
111
|
+
]);
|
|
112
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
113
|
+
className,
|
|
114
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_A2UIRenderer.default, { surfaceId })
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Converts a nested JavaScript object to the ValueMap[] format
|
|
119
|
+
* expected by A2UI's dataModelUpdate message.
|
|
120
|
+
*/
|
|
121
|
+
function objectToValueMaps(obj) {
|
|
122
|
+
return Object.entries(obj).map(([key, value]) => valueToValueMap(key, value));
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Converts a single key-value pair to a ValueMap.
|
|
126
|
+
*/
|
|
127
|
+
function valueToValueMap(key, value) {
|
|
128
|
+
if (typeof value === "string") return {
|
|
129
|
+
key,
|
|
130
|
+
valueString: value
|
|
131
|
+
};
|
|
132
|
+
if (typeof value === "number") return {
|
|
133
|
+
key,
|
|
134
|
+
valueNumber: value
|
|
135
|
+
};
|
|
136
|
+
if (typeof value === "boolean") return {
|
|
137
|
+
key,
|
|
138
|
+
valueBoolean: value
|
|
139
|
+
};
|
|
140
|
+
if (value === null || value === void 0) return { key };
|
|
141
|
+
if (Array.isArray(value)) return {
|
|
142
|
+
key,
|
|
143
|
+
valueMap: value.map((item, index) => valueToValueMap(String(index), item))
|
|
144
|
+
};
|
|
145
|
+
if (typeof value === "object") return {
|
|
146
|
+
key,
|
|
147
|
+
valueMap: objectToValueMaps(value)
|
|
148
|
+
};
|
|
149
|
+
return { key };
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
//#endregion
|
|
153
|
+
exports.A2UIViewer = A2UIViewer;
|
|
154
|
+
//# sourceMappingURL=A2UIViewer.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"A2UIViewer.cjs","names":["A2UIProvider","viewerTheme","useA2UIActions","A2UIRenderer"],"sources":["../src/A2UIViewer.tsx"],"sourcesContent":["\"use client\";\n\nimport React, { useId, useMemo, useEffect, useRef } from \"react\";\nimport type { Types } from \"@a2ui/lit/0.8\";\nimport { v0_8 } from \"@a2ui/lit\";\nimport {\n A2UIProvider,\n useA2UIActions,\n} from \"./react-renderer/core/A2UIProvider\";\nimport { A2UIRenderer } from \"./react-renderer/core/A2UIRenderer\";\nimport { initializeDefaultCatalog } from \"./react-renderer/registry/defaultCatalog\";\nimport { litTheme } from \"./react-renderer/theme/litTheme\";\nimport { injectStyles } from \"./react-renderer/styles\";\nimport { theme as viewerTheme } from \"./theme/viewer-theme.js\";\n\n// Re-export types that consumers may need\nexport interface ComponentInstance {\n id: string;\n component: Record<string, unknown>;\n}\n\nexport interface A2UIActionEvent {\n actionName: string;\n sourceComponentId: string;\n timestamp: string;\n context: Record<string, unknown>;\n}\n\nexport interface A2UIViewerProps {\n /** ID of the root component to render */\n root: string;\n /** Component definitions - array of ComponentInstance */\n components: v0_8.Types.ComponentInstance[];\n /** Data model - nested object, e.g. { user: { name: \"John\" }, items: [\"a\", \"b\"] } */\n data?: Record<string, unknown>;\n /** Called when user triggers an action (button click, etc.) */\n onAction?: (action: A2UIActionEvent) => void;\n /** Surface styles (primaryColor, font, logoUrl) */\n styles?: Record<string, string>;\n /** Optional className for the container */\n className?: string;\n}\n\n// Initialize the React renderer's component catalog and styles once\nlet initialized = false;\nfunction ensureInitialized() {\n if (!initialized) {\n initializeDefaultCatalog();\n injectStyles();\n initialized = true;\n }\n}\n\n/**\n * A2UIViewer renders an A2UI component tree from a JSON definition and data.\n * It re-renders cleanly when props change, discarding previous state.\n */\nexport function A2UIViewer({\n root,\n components,\n data,\n onAction,\n styles,\n className,\n}: A2UIViewerProps): React.JSX.Element {\n ensureInitialized();\n\n // Use React's useId for SSR-safe base ID\n const baseId = useId();\n\n // Generate a stable surfaceId that changes when definition changes\n const surfaceId = useMemo(() => {\n const definitionKey = `${root}-${JSON.stringify(components)}`;\n let hash = 0;\n for (let i = 0; i < definitionKey.length; i++) {\n const char = definitionKey.charCodeAt(i);\n hash = (hash << 5) - hash + char;\n hash = hash & hash;\n }\n return `surface${baseId.replace(/:/g, \"-\")}${hash}`;\n }, [baseId, root, components]);\n\n // Convert onAction callback to internal format\n const handleAction = useMemo(() => {\n if (!onAction) return undefined;\n\n return (message: Types.A2UIClientEventMessage) => {\n const userAction = message.userAction;\n if (userAction) {\n onAction({\n actionName: userAction.name,\n sourceComponentId: userAction.sourceComponentId,\n timestamp: userAction.timestamp,\n context: userAction.context ?? {},\n });\n }\n };\n }, [onAction]);\n\n // Show placeholder if no components provided\n if (!components || components.length === 0) {\n return (\n <div\n className={className}\n style={{ padding: 16, color: \"#666\", fontFamily: \"system-ui\" }}\n >\n No content to display\n </div>\n );\n }\n\n return (\n <A2UIProvider onAction={handleAction} theme={viewerTheme}>\n <A2UIViewerInner\n surfaceId={surfaceId}\n root={root}\n components={components}\n data={data ?? {}}\n styles={styles}\n className={className}\n />\n </A2UIProvider>\n );\n}\n\n/**\n * Inner component that processes messages within the provider context.\n */\nfunction A2UIViewerInner({\n surfaceId,\n root,\n components,\n data,\n styles,\n className,\n}: {\n surfaceId: string;\n root: string;\n components: v0_8.Types.ComponentInstance[];\n data: Record<string, unknown>;\n styles?: Record<string, string>;\n className?: string;\n}) {\n const { processMessages } = useA2UIActions();\n const lastProcessedRef = useRef<string>(\"\");\n\n // Process messages when props change\n useEffect(() => {\n const key = `${surfaceId}-${JSON.stringify(components)}-${JSON.stringify(data)}`;\n if (key === lastProcessedRef.current) return;\n lastProcessedRef.current = key;\n\n const messages: Types.ServerToClientMessage[] = [\n { beginRendering: { surfaceId, root, styles: styles ?? {} } },\n { surfaceUpdate: { surfaceId, components } },\n ];\n\n // Add data model updates\n if (data && Object.keys(data).length > 0) {\n const contents = objectToValueMaps(data);\n if (contents.length > 0) {\n messages.push({\n dataModelUpdate: { surfaceId, path: \"/\", contents },\n });\n }\n }\n\n processMessages(messages);\n }, [processMessages, surfaceId, root, components, data, styles]);\n\n return (\n <div className={className}>\n <A2UIRenderer surfaceId={surfaceId} />\n </div>\n );\n}\n\n/**\n * Converts a nested JavaScript object to the ValueMap[] format\n * expected by A2UI's dataModelUpdate message.\n */\nfunction objectToValueMaps(obj: Record<string, unknown>): Types.ValueMap[] {\n return Object.entries(obj).map(([key, value]) => valueToValueMap(key, value));\n}\n\n/**\n * Converts a single key-value pair to a ValueMap.\n */\nfunction valueToValueMap(key: string, value: unknown): Types.ValueMap {\n if (typeof value === \"string\") {\n return { key, valueString: value };\n }\n if (typeof value === \"number\") {\n return { key, valueNumber: value };\n }\n if (typeof value === \"boolean\") {\n return { key, valueBoolean: value };\n }\n if (value === null || value === undefined) {\n return { key };\n }\n if (Array.isArray(value)) {\n const valueMap = value.map((item, index) =>\n valueToValueMap(String(index), item),\n );\n return { key, valueMap };\n }\n if (typeof value === \"object\") {\n const valueMap = objectToValueMaps(value as Record<string, unknown>);\n return { key, valueMap };\n }\n return { key };\n}\n"],"mappings":";;;;;;;;;;;;;AA4CA,IAAI,cAAc;AAClB,SAAS,oBAAoB;AAC3B,KAAI,CAAC,aAAa;AAChB,mDAA0B;AAC1B,8BAAc;AACd,gBAAc;;;;;;;AAQlB,SAAgB,WAAW,EACzB,MACA,YACA,MACA,UACA,QACA,aACqC;AACrC,oBAAmB;CAGnB,MAAM,2BAAgB;CAGtB,MAAM,qCAA0B;EAC9B,MAAM,gBAAgB,GAAG,KAAK,GAAG,KAAK,UAAU,WAAW;EAC3D,IAAI,OAAO;AACX,OAAK,IAAI,IAAI,GAAG,IAAI,cAAc,QAAQ,KAAK;GAC7C,MAAM,OAAO,cAAc,WAAW,EAAE;AACxC,WAAQ,QAAQ,KAAK,OAAO;AAC5B,UAAO,OAAO;;AAEhB,SAAO,UAAU,OAAO,QAAQ,MAAM,IAAI,GAAG;IAC5C;EAAC;EAAQ;EAAM;EAAW,CAAC;CAG9B,MAAM,wCAA6B;AACjC,MAAI,CAAC,SAAU,QAAO;AAEtB,UAAQ,YAA0C;GAChD,MAAM,aAAa,QAAQ;AAC3B,OAAI,WACF,UAAS;IACP,YAAY,WAAW;IACvB,mBAAmB,WAAW;IAC9B,WAAW,WAAW;IACtB,SAAS,WAAW,WAAW,EAAE;IAClC,CAAC;;IAGL,CAAC,SAAS,CAAC;AAGd,KAAI,CAAC,cAAc,WAAW,WAAW,EACvC,QACE,2CAAC;EACY;EACX,OAAO;GAAE,SAAS;GAAI,OAAO;GAAQ,YAAY;GAAa;YAC/D;GAEK;AAIV,QACE,2CAACA;EAAa,UAAU;EAAc,OAAOC;YAC3C,2CAAC;GACY;GACL;GACM;GACZ,MAAM,QAAQ,EAAE;GACR;GACG;IACX;GACW;;;;;AAOnB,SAAS,gBAAgB,EACvB,WACA,MACA,YACA,MACA,QACA,aAQC;CACD,MAAM,EAAE,oBAAoBC,qCAAgB;CAC5C,MAAM,qCAAkC,GAAG;AAG3C,4BAAgB;EACd,MAAM,MAAM,GAAG,UAAU,GAAG,KAAK,UAAU,WAAW,CAAC,GAAG,KAAK,UAAU,KAAK;AAC9E,MAAI,QAAQ,iBAAiB,QAAS;AACtC,mBAAiB,UAAU;EAE3B,MAAM,WAA0C,CAC9C,EAAE,gBAAgB;GAAE;GAAW;GAAM,QAAQ,UAAU,EAAE;GAAE,EAAE,EAC7D,EAAE,eAAe;GAAE;GAAW;GAAY,EAAE,CAC7C;AAGD,MAAI,QAAQ,OAAO,KAAK,KAAK,CAAC,SAAS,GAAG;GACxC,MAAM,WAAW,kBAAkB,KAAK;AACxC,OAAI,SAAS,SAAS,EACpB,UAAS,KAAK,EACZ,iBAAiB;IAAE;IAAW,MAAM;IAAK;IAAU,EACpD,CAAC;;AAIN,kBAAgB,SAAS;IACxB;EAAC;EAAiB;EAAW;EAAM;EAAY;EAAM;EAAO,CAAC;AAEhE,QACE,2CAAC;EAAe;YACd,2CAACC,gCAAwB,YAAa;GAClC;;;;;;AAQV,SAAS,kBAAkB,KAAgD;AACzE,QAAO,OAAO,QAAQ,IAAI,CAAC,KAAK,CAAC,KAAK,WAAW,gBAAgB,KAAK,MAAM,CAAC;;;;;AAM/E,SAAS,gBAAgB,KAAa,OAAgC;AACpE,KAAI,OAAO,UAAU,SACnB,QAAO;EAAE;EAAK,aAAa;EAAO;AAEpC,KAAI,OAAO,UAAU,SACnB,QAAO;EAAE;EAAK,aAAa;EAAO;AAEpC,KAAI,OAAO,UAAU,UACnB,QAAO;EAAE;EAAK,cAAc;EAAO;AAErC,KAAI,UAAU,QAAQ,UAAU,OAC9B,QAAO,EAAE,KAAK;AAEhB,KAAI,MAAM,QAAQ,MAAM,CAItB,QAAO;EAAE;EAAK,UAHG,MAAM,KAAK,MAAM,UAChC,gBAAgB,OAAO,MAAM,EAAE,KAAK,CACrC;EACuB;AAE1B,KAAI,OAAO,UAAU,SAEnB,QAAO;EAAE;EAAK,UADG,kBAAkB,MAAiC;EAC5C;AAE1B,QAAO,EAAE,KAAK"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { v0_8 } from "@a2ui/lit";
|
|
2
|
+
import React from "react";
|
|
3
|
+
|
|
4
|
+
//#region src/A2UIViewer.d.ts
|
|
5
|
+
interface A2UIActionEvent {
|
|
6
|
+
actionName: string;
|
|
7
|
+
sourceComponentId: string;
|
|
8
|
+
timestamp: string;
|
|
9
|
+
context: Record<string, unknown>;
|
|
10
|
+
}
|
|
11
|
+
interface A2UIViewerProps {
|
|
12
|
+
/** ID of the root component to render */
|
|
13
|
+
root: string;
|
|
14
|
+
/** Component definitions - array of ComponentInstance */
|
|
15
|
+
components: v0_8.Types.ComponentInstance[];
|
|
16
|
+
/** Data model - nested object, e.g. { user: { name: "John" }, items: ["a", "b"] } */
|
|
17
|
+
data?: Record<string, unknown>;
|
|
18
|
+
/** Called when user triggers an action (button click, etc.) */
|
|
19
|
+
onAction?: (action: A2UIActionEvent) => void;
|
|
20
|
+
/** Surface styles (primaryColor, font, logoUrl) */
|
|
21
|
+
styles?: Record<string, string>;
|
|
22
|
+
/** Optional className for the container */
|
|
23
|
+
className?: string;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* A2UIViewer renders an A2UI component tree from a JSON definition and data.
|
|
27
|
+
* It re-renders cleanly when props change, discarding previous state.
|
|
28
|
+
*/
|
|
29
|
+
declare function A2UIViewer({
|
|
30
|
+
root,
|
|
31
|
+
components,
|
|
32
|
+
data,
|
|
33
|
+
onAction,
|
|
34
|
+
styles,
|
|
35
|
+
className
|
|
36
|
+
}: A2UIViewerProps): React.JSX.Element;
|
|
37
|
+
//#endregion
|
|
38
|
+
export { A2UIViewer, A2UIViewerProps };
|
|
39
|
+
//# sourceMappingURL=A2UIViewer.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"A2UIViewer.d.cts","names":[],"sources":["../src/A2UIViewer.tsx"],"mappings":";;;;UAqBiB,eAAA;EACf,UAAA;EACA,iBAAA;EACA,SAAA;EACA,OAAA,EAAS,MAAA;AAAA;AAAA,UAGM,eAAA;EAHA;EAKf,IAAA;EAFe;EAIf,UAAA,EAAY,IAAA,CAAK,KAAA,CAAM,iBAAA;;EAEvB,IAAA,GAAO,MAAA;EAAA;EAEP,QAAA,IAAY,MAAA,EAAQ,eAAA;EAEX;EAAT,MAAA,GAAS,MAAA;EAAM;EAEf,SAAA;AAAA;;;;;iBAiBc,UAAA,CAAA;EACd,IAAA;EACA,UAAA;EACA,IAAA;EACA,QAAA;EACA,MAAA;EACA;AAAA,GACC,eAAA,GAAkB,KAAA,CAAM,GAAA,CAAI,OAAA"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { v0_8 } from "@a2ui/lit";
|
|
2
|
+
import React from "react";
|
|
3
|
+
|
|
4
|
+
//#region src/A2UIViewer.d.ts
|
|
5
|
+
interface A2UIActionEvent {
|
|
6
|
+
actionName: string;
|
|
7
|
+
sourceComponentId: string;
|
|
8
|
+
timestamp: string;
|
|
9
|
+
context: Record<string, unknown>;
|
|
10
|
+
}
|
|
11
|
+
interface A2UIViewerProps {
|
|
12
|
+
/** ID of the root component to render */
|
|
13
|
+
root: string;
|
|
14
|
+
/** Component definitions - array of ComponentInstance */
|
|
15
|
+
components: v0_8.Types.ComponentInstance[];
|
|
16
|
+
/** Data model - nested object, e.g. { user: { name: "John" }, items: ["a", "b"] } */
|
|
17
|
+
data?: Record<string, unknown>;
|
|
18
|
+
/** Called when user triggers an action (button click, etc.) */
|
|
19
|
+
onAction?: (action: A2UIActionEvent) => void;
|
|
20
|
+
/** Surface styles (primaryColor, font, logoUrl) */
|
|
21
|
+
styles?: Record<string, string>;
|
|
22
|
+
/** Optional className for the container */
|
|
23
|
+
className?: string;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* A2UIViewer renders an A2UI component tree from a JSON definition and data.
|
|
27
|
+
* It re-renders cleanly when props change, discarding previous state.
|
|
28
|
+
*/
|
|
29
|
+
declare function A2UIViewer({
|
|
30
|
+
root,
|
|
31
|
+
components,
|
|
32
|
+
data,
|
|
33
|
+
onAction,
|
|
34
|
+
styles,
|
|
35
|
+
className
|
|
36
|
+
}: A2UIViewerProps): React.JSX.Element;
|
|
37
|
+
//#endregion
|
|
38
|
+
export { A2UIViewer, A2UIViewerProps };
|
|
39
|
+
//# sourceMappingURL=A2UIViewer.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"A2UIViewer.d.mts","names":[],"sources":["../src/A2UIViewer.tsx"],"mappings":";;;;UAqBiB,eAAA;EACf,UAAA;EACA,iBAAA;EACA,SAAA;EACA,OAAA,EAAS,MAAA;AAAA;AAAA,UAGM,eAAA;EAHA;EAKf,IAAA;EAFe;EAIf,UAAA,EAAY,IAAA,CAAK,KAAA,CAAM,iBAAA;;EAEvB,IAAA,GAAO,MAAA;EAAA;EAEP,QAAA,IAAY,MAAA,EAAQ,eAAA;EAEX;EAAT,MAAA,GAAS,MAAA;EAAM;EAEf,SAAA;AAAA;;;;;iBAiBc,UAAA,CAAA;EACd,IAAA;EACA,UAAA;EACA,IAAA;EACA,QAAA;EACA,MAAA;EACA;AAAA,GACC,eAAA,GAAkB,KAAA,CAAM,GAAA,CAAI,OAAA"}
|