@datalayer/agent-runtimes 1.0.4 → 1.0.6

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.
Files changed (299) hide show
  1. package/README.md +182 -1
  2. package/lib/AgentNode.d.ts +3 -0
  3. package/lib/AgentNode.js +676 -0
  4. package/lib/App.js +1 -1
  5. package/lib/agent-node/themeStore.d.ts +3 -0
  6. package/lib/agent-node/themeStore.js +156 -0
  7. package/lib/agent-node-main.d.ts +1 -0
  8. package/lib/agent-node-main.js +14 -0
  9. package/lib/agents/AgentDetails.d.ts +22 -1
  10. package/lib/agents/AgentDetails.js +34 -47
  11. package/lib/api/index.d.ts +0 -1
  12. package/lib/api/index.js +4 -2
  13. package/lib/chat/Chat.d.ts +5 -106
  14. package/lib/chat/Chat.js +20 -14
  15. package/lib/chat/ChatFloating.d.ts +7 -140
  16. package/lib/chat/ChatFloating.js +3 -3
  17. package/lib/chat/ChatPopupStandalone.d.ts +8 -47
  18. package/lib/chat/ChatPopupStandalone.js +3 -3
  19. package/lib/chat/ChatSidebar.d.ts +4 -69
  20. package/lib/chat/ChatSidebar.js +83 -51
  21. package/lib/chat/ChatStandalone.d.ts +4 -54
  22. package/lib/chat/ChatStandalone.js +3 -3
  23. package/lib/chat/base/ChatBase.js +1414 -174
  24. package/lib/chat/display/FloatingBrandButton.js +8 -1
  25. package/lib/chat/header/ChatHeader.d.ts +3 -1
  26. package/lib/chat/header/ChatHeader.js +15 -12
  27. package/lib/chat/header/ChatHeaderBase.d.ts +30 -5
  28. package/lib/chat/header/ChatHeaderBase.js +41 -16
  29. package/lib/chat/indicators/McpStatusIndicator.d.ts +7 -4
  30. package/lib/chat/indicators/McpStatusIndicator.js +7 -32
  31. package/lib/chat/indicators/SandboxStatusIndicator.d.ts +4 -1
  32. package/lib/chat/indicators/SandboxStatusIndicator.js +91 -56
  33. package/lib/chat/indicators/SkillsStatusIndicator.d.ts +7 -0
  34. package/lib/chat/indicators/SkillsStatusIndicator.js +88 -0
  35. package/lib/chat/indicators/index.d.ts +1 -0
  36. package/lib/chat/indicators/index.js +1 -0
  37. package/lib/chat/messages/ChatMessageList.d.ts +1 -1
  38. package/lib/chat/messages/ChatMessageList.js +154 -114
  39. package/lib/chat/messages/ChatMessages.js +6 -2
  40. package/lib/chat/prompt/InputFooter.d.ts +21 -6
  41. package/lib/chat/prompt/InputFooter.js +76 -20
  42. package/lib/chat/prompt/InputPrompt.d.ts +5 -1
  43. package/lib/chat/prompt/InputPrompt.js +4 -4
  44. package/lib/chat/prompt/InputPromptFooter.d.ts +3 -1
  45. package/lib/chat/prompt/InputPromptFooter.js +3 -3
  46. package/lib/chat/prompt/InputPromptLexical.d.ts +3 -1
  47. package/lib/chat/prompt/InputPromptLexical.js +12 -5
  48. package/lib/chat/prompt/InputPromptText.d.ts +3 -1
  49. package/lib/chat/prompt/InputPromptText.js +2 -2
  50. package/lib/chat/tools/ToolApprovalBanner.js +1 -1
  51. package/lib/chat/tools/ToolCallDisplay.d.ts +3 -1
  52. package/lib/chat/tools/ToolCallDisplay.js +2 -2
  53. package/lib/chat/usage/TokenUsageBar.js +20 -2
  54. package/lib/client/AgentRuntimesClientContext.d.ts +53 -0
  55. package/lib/client/AgentRuntimesClientContext.js +55 -0
  56. package/lib/client/AgentsMixin.d.ts +0 -18
  57. package/lib/client/AgentsMixin.js +20 -30
  58. package/lib/client/IAgentRuntimesClient.d.ts +215 -0
  59. package/lib/client/IAgentRuntimesClient.js +5 -0
  60. package/lib/client/SdkAgentRuntimesClient.d.ts +151 -0
  61. package/lib/client/SdkAgentRuntimesClient.js +134 -0
  62. package/lib/client/index.d.ts +4 -1
  63. package/lib/client/index.js +3 -1
  64. package/lib/components/NotificationEventCard.js +5 -1
  65. package/lib/config/AgentConfiguration.d.ts +22 -0
  66. package/lib/config/AgentConfiguration.js +319 -64
  67. package/lib/context/ContextDistribution.d.ts +3 -1
  68. package/lib/context/ContextDistribution.js +8 -27
  69. package/lib/context/ContextInspector.d.ts +3 -1
  70. package/lib/context/ContextInspector.js +19 -67
  71. package/lib/context/ContextPanel.d.ts +3 -1
  72. package/lib/context/ContextPanel.js +104 -64
  73. package/lib/context/ContextUsage.d.ts +3 -1
  74. package/lib/context/ContextUsage.js +3 -3
  75. package/lib/context/CostTracker.d.ts +9 -3
  76. package/lib/context/CostTracker.js +26 -47
  77. package/lib/context/CostUsageChart.d.ts +12 -0
  78. package/lib/context/CostUsageChart.js +378 -0
  79. package/lib/context/GraphFlowChart.d.ts +16 -0
  80. package/lib/context/GraphFlowChart.js +182 -0
  81. package/lib/context/TokenUsageChart.d.ts +8 -1
  82. package/lib/context/TokenUsageChart.js +349 -211
  83. package/lib/context/TurnGraphChart.d.ts +39 -0
  84. package/lib/context/TurnGraphChart.js +538 -0
  85. package/lib/context/otelWsPool.d.ts +20 -0
  86. package/lib/context/otelWsPool.js +69 -0
  87. package/lib/examples/A2UiComponentGalleryExample.d.ts +0 -17
  88. package/lib/examples/A2UiComponentGalleryExample.js +315 -522
  89. package/lib/examples/A2UiContactCardExample.d.ts +0 -18
  90. package/lib/examples/A2UiContactCardExample.js +154 -411
  91. package/lib/examples/A2UiRestaurantExample.d.ts +0 -30
  92. package/lib/examples/A2UiRestaurantExample.js +114 -212
  93. package/lib/examples/A2UiViewerExample.d.ts +0 -18
  94. package/lib/examples/A2UiViewerExample.js +283 -532
  95. package/lib/examples/AgUiBackendToolRenderingExample.js +1 -1
  96. package/lib/examples/AgUiHaikuGenUiExample.d.ts +1 -1
  97. package/lib/examples/AgUiHaikuGenUiExample.js +1 -1
  98. package/lib/examples/AgUiSharedStateExample.js +2 -1
  99. package/lib/examples/AgentCheckpointsExample.js +14 -28
  100. package/lib/examples/AgentCodemodeExample.d.ts +4 -6
  101. package/lib/examples/AgentCodemodeExample.js +603 -169
  102. package/lib/examples/AgentEvalsExample.js +339 -53
  103. package/lib/examples/AgentGuardrailsExample.js +383 -66
  104. package/lib/examples/AgentHooksExample.d.ts +3 -0
  105. package/lib/examples/AgentHooksExample.js +122 -0
  106. package/lib/examples/AgentInferenceProviderExample.d.ts +3 -0
  107. package/lib/examples/AgentInferenceProviderExample.js +329 -0
  108. package/lib/examples/AgentMCPExample.d.ts +3 -0
  109. package/lib/examples/AgentMCPExample.js +481 -0
  110. package/lib/examples/AgentMemoryExample.d.ts +1 -2
  111. package/lib/examples/AgentMemoryExample.js +78 -33
  112. package/lib/examples/AgentMonitoringExample.js +261 -200
  113. package/lib/examples/AgentNotificationsExample.d.ts +1 -2
  114. package/lib/examples/AgentNotificationsExample.js +114 -33
  115. package/lib/examples/AgentOtelExample.js +32 -42
  116. package/lib/examples/AgentOutputsExample.d.ts +11 -6
  117. package/lib/examples/AgentOutputsExample.js +433 -81
  118. package/lib/examples/AgentParametersExample.d.ts +3 -0
  119. package/lib/examples/AgentParametersExample.js +248 -0
  120. package/lib/examples/AgentSandboxExample.d.ts +3 -3
  121. package/lib/examples/AgentSandboxExample.js +74 -45
  122. package/lib/examples/AgentSkillsExample.js +95 -103
  123. package/lib/examples/AgentSubagentsExample.d.ts +14 -0
  124. package/lib/examples/AgentSubagentsExample.js +228 -0
  125. package/lib/examples/AgentToolApprovalsExample.js +49 -561
  126. package/lib/examples/AgentTriggersExample.js +823 -569
  127. package/lib/examples/{AgentspecExample.d.ts → AgentspecsExample.d.ts} +2 -2
  128. package/lib/examples/AgentspecsExample.js +1096 -0
  129. package/lib/examples/ChatCustomExample.js +16 -28
  130. package/lib/examples/ChatExample.js +13 -29
  131. package/lib/examples/CopilotKitLexicalExample.js +2 -1
  132. package/lib/examples/CopilotKitNotebookExample.js +2 -1
  133. package/lib/examples/HomeExample.d.ts +15 -0
  134. package/lib/examples/HomeExample.js +77 -0
  135. package/lib/examples/Lexical2Example.js +4 -2
  136. package/lib/examples/{LexicalExample.d.ts → LexicalAgentExample.d.ts} +4 -4
  137. package/lib/examples/{LexicalExample.js → LexicalAgentExample.js} +66 -17
  138. package/lib/examples/{LexicalSidebarExample.d.ts → LexicalAgentSidebarExample.d.ts} +5 -5
  139. package/lib/examples/LexicalAgentSidebarExample.js +261 -0
  140. package/lib/examples/NotebookAgentExample.d.ts +9 -0
  141. package/lib/examples/NotebookAgentExample.js +192 -0
  142. package/lib/examples/{NotebookSidebarExample.d.ts → NotebookAgentSidebarExample.d.ts} +2 -2
  143. package/lib/examples/NotebookAgentSidebarExample.js +221 -0
  144. package/lib/examples/{DatalayerNotebookExample.d.ts → NotebookCollaborationExample.d.ts} +4 -4
  145. package/lib/examples/{DatalayerNotebookExample.js → NotebookCollaborationExample.js} +3 -3
  146. package/lib/examples/NotebookExample.d.ts +4 -7
  147. package/lib/examples/NotebookExample.js +14 -146
  148. package/lib/examples/components/AuthRequiredView.d.ts +6 -0
  149. package/lib/examples/components/AuthRequiredView.js +33 -0
  150. package/lib/examples/components/ExampleWrapper.d.ts +9 -3
  151. package/lib/examples/components/ExampleWrapper.js +45 -9
  152. package/lib/examples/{ag-ui → components}/haiku/HaikuDisplay.js +1 -1
  153. package/lib/examples/{ag-ui → components}/haiku/InlineHaikuCard.js +1 -1
  154. package/lib/examples/{ag-ui → components}/haiku/index.d.ts +1 -1
  155. package/lib/examples/{ag-ui → components}/haiku/index.js +1 -1
  156. package/lib/examples/components/index.d.ts +3 -0
  157. package/lib/examples/components/index.js +4 -0
  158. package/lib/examples/{ag-ui → components}/weather/index.d.ts +1 -1
  159. package/lib/examples/{ag-ui → components}/weather/index.js +1 -1
  160. package/lib/examples/example-selector.d.ts +17 -4
  161. package/lib/examples/example-selector.js +108 -41
  162. package/lib/examples/index.d.ts +10 -6
  163. package/lib/examples/index.js +10 -6
  164. package/lib/examples/lexical/initial-content.json +6 -6
  165. package/lib/examples/main.js +257 -27
  166. package/lib/examples/utils/a2ui.d.ts +18 -0
  167. package/lib/examples/utils/a2ui.js +69 -0
  168. package/lib/examples/utils/a2uiMarkdownProvider.d.ts +7 -0
  169. package/lib/examples/utils/a2uiMarkdownProvider.js +9 -0
  170. package/lib/examples/utils/agentId.d.ts +18 -0
  171. package/lib/examples/utils/agentId.js +54 -0
  172. package/lib/examples/utils/agents/earthquake-detector.json +11 -11
  173. package/lib/examples/utils/agents/sales-forecaster.json +11 -11
  174. package/lib/examples/utils/agents/social-post-generator.json +11 -11
  175. package/lib/examples/utils/agents/stock-market.json +11 -11
  176. package/lib/examples/utils/examplesStore.js +82 -27
  177. package/lib/examples/utils/useExampleAgentRuntimesUrl.d.ts +5 -0
  178. package/lib/examples/utils/useExampleAgentRuntimesUrl.js +19 -0
  179. package/lib/hooks/index.d.ts +8 -8
  180. package/lib/hooks/index.js +7 -7
  181. package/lib/hooks/useA2A.d.ts +2 -3
  182. package/lib/hooks/useAIAgentsWebSocket.d.ts +43 -4
  183. package/lib/hooks/useAIAgentsWebSocket.js +153 -12
  184. package/lib/hooks/useAcp.d.ts +1 -2
  185. package/lib/hooks/useAgUi.d.ts +1 -1
  186. package/lib/hooks/{useAgents.d.ts → useAgentRuntimes.d.ts} +70 -4
  187. package/lib/hooks/{useAgents.js → useAgentRuntimes.js} +237 -32
  188. package/lib/hooks/useAgentsCatalog.js +1 -1
  189. package/lib/hooks/useAgentsService.d.ts +2 -2
  190. package/lib/hooks/useAgentsService.js +7 -7
  191. package/lib/hooks/useCheckpoints.js +1 -1
  192. package/lib/hooks/useConfig.d.ts +4 -1
  193. package/lib/hooks/useConfig.js +10 -3
  194. package/lib/hooks/useContextSnapshot.d.ts +9 -4
  195. package/lib/hooks/useContextSnapshot.js +9 -37
  196. package/lib/hooks/useMonitoring.js +3 -0
  197. package/lib/hooks/useSandbox.d.ts +20 -8
  198. package/lib/hooks/useSandbox.js +105 -40
  199. package/lib/hooks/useSkills.d.ts +23 -5
  200. package/lib/hooks/useSkills.js +94 -39
  201. package/lib/hooks/useToolApprovals.d.ts +60 -36
  202. package/lib/hooks/useToolApprovals.js +318 -69
  203. package/lib/hooks/useVercelAI.d.ts +1 -1
  204. package/lib/index.d.ts +2 -1
  205. package/lib/index.js +1 -0
  206. package/lib/inference/index.d.ts +0 -1
  207. package/lib/middleware/index.d.ts +0 -1
  208. package/lib/protocols/AGUIAdapter.js +6 -0
  209. package/lib/protocols/VercelAIAdapter.d.ts +7 -0
  210. package/lib/protocols/VercelAIAdapter.js +59 -7
  211. package/lib/specs/agents/agents.d.ts +21 -4
  212. package/lib/specs/agents/agents.js +2879 -316
  213. package/lib/specs/agents/index.js +3 -1
  214. package/lib/specs/benchmarks.d.ts +20 -0
  215. package/lib/specs/benchmarks.js +205 -0
  216. package/lib/specs/envvars.js +27 -20
  217. package/lib/specs/evals.d.ts +10 -9
  218. package/lib/specs/evals.js +128 -88
  219. package/lib/specs/events.d.ts +3 -10
  220. package/lib/specs/events.js +127 -84
  221. package/lib/specs/frontendTools.js +2 -2
  222. package/lib/specs/guardrails.d.ts +0 -7
  223. package/lib/specs/guardrails.js +240 -159
  224. package/lib/specs/mcpServers.js +35 -6
  225. package/lib/specs/memory.d.ts +0 -2
  226. package/lib/specs/memory.js +4 -17
  227. package/lib/specs/models.d.ts +0 -2
  228. package/lib/specs/models.js +20 -15
  229. package/lib/specs/notifications.js +102 -18
  230. package/lib/specs/outputs.js +15 -9
  231. package/lib/specs/personas.d.ts +41 -0
  232. package/lib/specs/personas.js +168 -0
  233. package/lib/specs/skills.d.ts +1 -1
  234. package/lib/specs/skills.js +23 -23
  235. package/lib/specs/teams/index.js +3 -1
  236. package/lib/specs/teams/teams.js +468 -348
  237. package/lib/specs/tools.js +4 -4
  238. package/lib/specs/triggers.js +61 -11
  239. package/lib/stores/agentRuntimeStore.d.ts +208 -0
  240. package/lib/stores/agentRuntimeStore.js +650 -0
  241. package/lib/stores/conversationStore.js +2 -2
  242. package/lib/stores/index.d.ts +1 -1
  243. package/lib/stores/index.js +1 -1
  244. package/lib/tools/adapters/copilotkit/lexicalHooks.d.ts +1 -2
  245. package/lib/tools/adapters/copilotkit/lexicalHooks.js +1 -3
  246. package/lib/tools/adapters/copilotkit/notebookHooks.d.ts +1 -2
  247. package/lib/tools/adapters/copilotkit/notebookHooks.js +1 -3
  248. package/lib/tools/index.d.ts +0 -2
  249. package/lib/tools/index.js +0 -1
  250. package/lib/types/agents-lifecycle.d.ts +18 -0
  251. package/lib/types/agents.d.ts +6 -0
  252. package/lib/types/agentspecs.d.ts +54 -1
  253. package/lib/types/benchmarks.d.ts +43 -0
  254. package/lib/types/benchmarks.js +5 -0
  255. package/lib/types/chat.d.ts +325 -8
  256. package/lib/types/context.d.ts +27 -0
  257. package/lib/types/cost.d.ts +2 -2
  258. package/lib/types/evals.d.ts +26 -17
  259. package/lib/types/index.d.ts +3 -0
  260. package/lib/types/index.js +3 -0
  261. package/lib/types/mcp.d.ts +8 -0
  262. package/lib/types/models.d.ts +2 -2
  263. package/lib/types/personas.d.ts +25 -0
  264. package/lib/types/personas.js +5 -0
  265. package/lib/types/skills.d.ts +43 -1
  266. package/lib/types/stream.d.ts +110 -0
  267. package/lib/types/stream.js +36 -0
  268. package/lib/utils/utils.d.ts +9 -5
  269. package/lib/utils/utils.js +9 -5
  270. package/package.json +19 -11
  271. package/scripts/codegen/__pycache__/generate_agents.cpython-313.pyc +0 -0
  272. package/scripts/codegen/__pycache__/generate_benchmarks.cpython-313.pyc +0 -0
  273. package/scripts/codegen/__pycache__/generate_evals.cpython-313.pyc +0 -0
  274. package/scripts/codegen/__pycache__/generate_events.cpython-313.pyc +0 -0
  275. package/scripts/codegen/__pycache__/versioning.cpython-313.pyc +0 -0
  276. package/scripts/codegen/generate_agents.py +187 -45
  277. package/scripts/codegen/generate_benchmarks.py +441 -0
  278. package/scripts/codegen/generate_evals.py +94 -16
  279. package/scripts/codegen/generate_events.py +35 -14
  280. package/scripts/codegen/generate_personas.py +319 -0
  281. package/scripts/codegen/generate_skills.py +9 -9
  282. package/scripts/sync-jupyter.sh +26 -7
  283. package/lib/api/tool-approvals.d.ts +0 -62
  284. package/lib/api/tool-approvals.js +0 -145
  285. package/lib/examples/AgentspecExample.js +0 -705
  286. package/lib/examples/LexicalSidebarExample.js +0 -163
  287. package/lib/examples/NotebookSidebarExample.js +0 -119
  288. package/lib/examples/NotebookSimpleExample.d.ts +0 -6
  289. package/lib/examples/NotebookSimpleExample.js +0 -22
  290. package/lib/examples/ag-ui/index.d.ts +0 -10
  291. package/lib/examples/ag-ui/index.js +0 -16
  292. package/lib/hooks/useAgentsRegistry.d.ts +0 -10
  293. package/lib/hooks/useAgentsRegistry.js +0 -20
  294. package/lib/stores/agentsStore.d.ts +0 -123
  295. package/lib/stores/agentsStore.js +0 -270
  296. /package/lib/examples/{ag-ui → components}/haiku/HaikuDisplay.d.ts +0 -0
  297. /package/lib/examples/{ag-ui → components}/haiku/InlineHaikuCard.d.ts +0 -0
  298. /package/lib/examples/{ag-ui → components}/weather/InlineWeatherCard.d.ts +0 -0
  299. /package/lib/examples/{ag-ui → components}/weather/InlineWeatherCard.js +0 -0
@@ -1,21 +1,3 @@
1
- /**
2
- * A2UiContactCardExample
3
- *
4
- * Demonstrates a rich contact card UI rendered via A2UI protocol.
5
- * Uses static A2UI JSON messages (no backend required) featuring:
6
- * - Data-bound contact information (name, title, email, phone, etc.)
7
- * - Avatar image with cover fit
8
- * - Icon + text info rows (calendar, location, email, phone)
9
- * - Interactive buttons with actions (Follow, Message)
10
- * - Card and Column layout composition
11
- * - Divider for visual separation
12
- *
13
- * Based on the contact_lookup sample from the A2UI repository.
14
- */
15
1
  import React from 'react';
16
- /**
17
- * A2UiContactCardExample — Rich contact card with data binding & actions.
18
- * No backend required — uses static A2UI JSON messages rendered client-side.
19
- */
20
2
  declare const A2UiContactCardExample: React.FC;
21
3
  export default A2UiContactCardExample;
@@ -3,430 +3,173 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  * Copyright (c) 2025-2026 Datalayer, Inc.
4
4
  * Distributed under the terms of the Modified BSD License.
5
5
  */
6
- /**
7
- * A2UiContactCardExample
8
- *
9
- * Demonstrates a rich contact card UI rendered via A2UI protocol.
10
- * Uses static A2UI JSON messages (no backend required) featuring:
11
- * - Data-bound contact information (name, title, email, phone, etc.)
12
- * - Avatar image with cover fit
13
- * - Icon + text info rows (calendar, location, email, phone)
14
- * - Interactive buttons with actions (Follow, Message)
15
- * - Card and Column layout composition
16
- * - Divider for visual separation
17
- *
18
- * Based on the contact_lookup sample from the A2UI repository.
19
- */
20
- import { useState, useCallback } from 'react';
6
+ import { useCallback, useEffect, useMemo, useState } from 'react';
21
7
  import { Box } from '@datalayer/primer-addons';
8
+ import { Button, Text } from '@primer/react';
9
+ import { A2uiSurface } from '@a2ui/react/v0_9';
22
10
  import { ThemedProvider } from './utils/themedProvider';
23
- import { Text, Button as PrimerButton } from '@primer/react';
24
- import { A2UIProvider, A2UIRenderer, useA2UIActions, initializeDefaultCatalog, } from '@a2ui/react';
25
- initializeDefaultCatalog();
26
- const CONTACTS = [
27
- {
28
- name: 'Alice Johnson',
29
- title: 'Staff Engineer',
30
- team: 'Platform',
31
- location: 'San Francisco, CA',
32
- email: 'alice@example.com',
33
- mobile: '+1 (415) 555-0101',
34
- calendar: 'Available',
35
- imageUrl: 'https://api.dicebear.com/9.x/avataaars/svg?seed=Alice',
36
- },
37
- {
38
- name: 'Bob Martinez',
39
- title: 'Product Manager',
40
- team: 'Growth',
41
- location: 'New York, NY',
42
- email: 'bob@example.com',
43
- mobile: '+1 (212) 555-0202',
44
- calendar: 'In a meeting',
45
- imageUrl: 'https://api.dicebear.com/9.x/avataaars/svg?seed=Bob',
46
- },
47
- {
48
- name: 'Casey Smith',
49
- title: 'Digital Marketing Specialist',
50
- team: 'Marketing',
51
- location: 'London, UK',
52
- email: 'casey@example.com',
53
- mobile: '+44 20 7946 0958',
54
- calendar: 'Out of office',
55
- imageUrl: 'https://api.dicebear.com/9.x/avataaars/svg?seed=Casey',
56
- },
57
- ];
58
- // ---------------------------------------------------------------------------
59
- // A2UI message builders
60
- // ---------------------------------------------------------------------------
61
- function contactCardMessages(contact) {
62
- return [
63
- // Begin rendering
64
- { beginRendering: { surfaceId: 'contact-card', root: 'main_card' } },
65
- // Surface update - component tree
11
+ import { A2uiMarkdownProvider } from './utils/a2uiMarkdownProvider';
12
+ import { createSceneMessages, useA2uiProcessor } from './utils/a2ui';
13
+ const CONTACT_SURFACE_ID = 'contact-card-v09';
14
+ const CONTACT_CARD_MESSAGES = createSceneMessages({
15
+ surfaceId: CONTACT_SURFACE_ID,
16
+ components: [
17
+ { id: 'root', component: 'Card', child: 'main-column' },
66
18
  {
67
- surfaceUpdate: {
68
- surfaceId: 'contact-card',
69
- components: [
70
- {
71
- id: 'profile_image',
72
- component: {
73
- Image: {
74
- url: { path: '/imageUrl' },
75
- usageHint: 'avatar',
76
- fit: 'cover',
77
- },
78
- },
79
- },
80
- {
81
- id: 'user_heading',
82
- weight: 1,
83
- component: { Text: { text: { path: '/name' }, usageHint: 'h2' } },
84
- },
85
- {
86
- id: 'description_text_1',
87
- component: { Text: { text: { path: '/title' } } },
88
- },
89
- {
90
- id: 'description_text_2',
91
- component: { Text: { text: { path: '/team' } } },
92
- },
93
- {
94
- id: 'description_column',
95
- component: {
96
- Column: {
97
- children: {
98
- explicitList: [
99
- 'user_heading',
100
- 'description_text_1',
101
- 'description_text_2',
102
- ],
103
- },
104
- alignment: 'center',
105
- },
106
- },
107
- },
108
- // Calendar row
109
- {
110
- id: 'calendar_icon',
111
- component: { Icon: { name: { literalString: 'calendar_today' } } },
112
- },
113
- {
114
- id: 'calendar_primary_text',
115
- component: {
116
- Text: { usageHint: 'h5', text: { path: '/calendar' } },
117
- },
118
- },
119
- {
120
- id: 'calendar_secondary_text',
121
- component: { Text: { text: { literalString: 'Calendar' } } },
122
- },
123
- {
124
- id: 'calendar_text_column',
125
- component: {
126
- Column: {
127
- children: {
128
- explicitList: [
129
- 'calendar_primary_text',
130
- 'calendar_secondary_text',
131
- ],
132
- },
133
- distribution: 'start',
134
- alignment: 'start',
135
- },
136
- },
137
- },
138
- {
139
- id: 'info_row_1',
140
- component: {
141
- Row: {
142
- children: {
143
- explicitList: ['calendar_icon', 'calendar_text_column'],
144
- },
145
- distribution: 'start',
146
- alignment: 'start',
147
- },
148
- },
149
- },
150
- // Location row
151
- {
152
- id: 'location_icon',
153
- component: { Icon: { name: { literalString: 'location_on' } } },
154
- },
155
- {
156
- id: 'location_primary_text',
157
- component: {
158
- Text: { usageHint: 'h5', text: { path: '/location' } },
159
- },
160
- },
161
- {
162
- id: 'location_secondary_text',
163
- component: { Text: { text: { literalString: 'Location' } } },
164
- },
165
- {
166
- id: 'location_text_column',
167
- component: {
168
- Column: {
169
- children: {
170
- explicitList: [
171
- 'location_primary_text',
172
- 'location_secondary_text',
173
- ],
174
- },
175
- distribution: 'start',
176
- alignment: 'start',
177
- },
178
- },
179
- },
180
- {
181
- id: 'info_row_2',
182
- component: {
183
- Row: {
184
- children: {
185
- explicitList: ['location_icon', 'location_text_column'],
186
- },
187
- distribution: 'start',
188
- alignment: 'start',
189
- },
190
- },
191
- },
192
- // Email row
193
- {
194
- id: 'mail_icon',
195
- component: { Icon: { name: { literalString: 'mail' } } },
196
- },
197
- {
198
- id: 'mail_primary_text',
199
- component: { Text: { usageHint: 'h5', text: { path: '/email' } } },
200
- },
201
- {
202
- id: 'mail_secondary_text',
203
- component: { Text: { text: { literalString: 'Email' } } },
204
- },
205
- {
206
- id: 'mail_text_column',
207
- component: {
208
- Column: {
209
- children: {
210
- explicitList: ['mail_primary_text', 'mail_secondary_text'],
211
- },
212
- distribution: 'start',
213
- alignment: 'start',
214
- },
215
- },
216
- },
217
- {
218
- id: 'info_row_3',
219
- component: {
220
- Row: {
221
- children: { explicitList: ['mail_icon', 'mail_text_column'] },
222
- distribution: 'start',
223
- alignment: 'start',
224
- },
225
- },
226
- },
227
- // Divider
228
- { id: 'div', component: { Divider: {} } },
229
- // Phone row
230
- {
231
- id: 'call_icon',
232
- component: { Icon: { name: { literalString: 'call' } } },
233
- },
234
- {
235
- id: 'call_primary_text',
236
- component: { Text: { usageHint: 'h5', text: { path: '/mobile' } } },
237
- },
238
- {
239
- id: 'call_secondary_text',
240
- component: { Text: { text: { literalString: 'Mobile' } } },
241
- },
242
- {
243
- id: 'call_text_column',
244
- component: {
245
- Column: {
246
- children: {
247
- explicitList: ['call_primary_text', 'call_secondary_text'],
248
- },
249
- distribution: 'start',
250
- alignment: 'start',
251
- },
252
- },
253
- },
254
- {
255
- id: 'info_row_4',
256
- component: {
257
- Row: {
258
- children: { explicitList: ['call_icon', 'call_text_column'] },
259
- distribution: 'start',
260
- alignment: 'start',
261
- },
262
- },
263
- },
264
- // Info column
265
- {
266
- id: 'info_rows_column',
267
- weight: 1,
268
- component: {
269
- Column: {
270
- children: {
271
- explicitList: [
272
- 'info_row_1',
273
- 'info_row_2',
274
- 'info_row_3',
275
- 'info_row_4',
276
- ],
277
- },
278
- alignment: 'stretch',
279
- },
280
- },
281
- },
282
- // Action buttons
283
- {
284
- id: 'button_1_text',
285
- component: { Text: { text: { literalString: 'Follow' } } },
286
- },
287
- {
288
- id: 'button_1',
289
- component: {
290
- Button: {
291
- child: 'button_1_text',
292
- primary: true,
293
- action: {
294
- name: 'follow_contact',
295
- context: [{ key: 'contactName', value: { path: '/name' } }],
296
- },
297
- },
298
- },
299
- },
300
- {
301
- id: 'button_2_text',
302
- component: { Text: { text: { literalString: 'Message' } } },
303
- },
304
- {
305
- id: 'button_2',
306
- component: {
307
- Button: {
308
- child: 'button_2_text',
309
- primary: false,
310
- action: {
311
- name: 'send_message',
312
- context: [{ key: 'contactName', value: { path: '/name' } }],
313
- },
314
- },
315
- },
316
- },
317
- {
318
- id: 'action_buttons_row',
319
- component: {
320
- Row: {
321
- children: { explicitList: ['button_1', 'button_2'] },
322
- distribution: 'center',
323
- alignment: 'center',
324
- },
325
- },
326
- },
327
- // Main layout
328
- {
329
- id: 'main_column',
330
- component: {
331
- Column: {
332
- children: {
333
- explicitList: [
334
- 'profile_image',
335
- 'description_column',
336
- 'div',
337
- 'info_rows_column',
338
- 'action_buttons_row',
339
- ],
340
- },
341
- alignment: 'stretch',
342
- },
343
- },
344
- },
345
- { id: 'main_card', component: { Card: { child: 'main_column' } } },
346
- ],
19
+ id: 'main-column',
20
+ component: 'Column',
21
+ align: 'center',
22
+ children: [
23
+ 'avatar-image',
24
+ 'name',
25
+ 'title',
26
+ 'divider',
27
+ 'contact-info',
28
+ 'actions',
29
+ ],
30
+ },
31
+ {
32
+ id: 'avatar-image',
33
+ component: 'Image',
34
+ url: { path: '/avatar' },
35
+ fit: 'cover',
36
+ variant: 'avatar',
37
+ },
38
+ { id: 'name', component: 'Text', text: { path: '/name' }, variant: 'h2' },
39
+ {
40
+ id: 'title',
41
+ component: 'Text',
42
+ text: { path: '/title' },
43
+ variant: 'body',
44
+ },
45
+ { id: 'divider', component: 'Divider' },
46
+ {
47
+ id: 'contact-info',
48
+ component: 'Column',
49
+ children: ['phone-row', 'email-row', 'location-row'],
50
+ },
51
+ {
52
+ id: 'phone-row',
53
+ component: 'Row',
54
+ align: 'center',
55
+ children: ['phone-icon', 'phone-text'],
56
+ },
57
+ { id: 'phone-icon', component: 'Icon', name: 'phone' },
58
+ { id: 'phone-text', component: 'Text', text: { path: '/phone' } },
59
+ {
60
+ id: 'email-row',
61
+ component: 'Row',
62
+ align: 'center',
63
+ children: ['email-icon', 'email-text'],
64
+ },
65
+ { id: 'email-icon', component: 'Icon', name: 'mail' },
66
+ { id: 'email-text', component: 'Text', text: { path: '/email' } },
67
+ {
68
+ id: 'location-row',
69
+ component: 'Row',
70
+ align: 'center',
71
+ children: ['location-icon', 'location-text'],
72
+ },
73
+ { id: 'location-icon', component: 'Icon', name: 'locationOn' },
74
+ { id: 'location-text', component: 'Text', text: { path: '/location' } },
75
+ {
76
+ id: 'actions',
77
+ component: 'Row',
78
+ justify: 'center',
79
+ children: ['follow-button', 'message-button'],
80
+ },
81
+ { id: 'follow-button-label', component: 'Text', text: 'Follow' },
82
+ {
83
+ id: 'follow-button',
84
+ component: 'Button',
85
+ variant: 'primary',
86
+ child: 'follow-button-label',
87
+ action: {
88
+ event: {
89
+ name: 'follow_contact',
90
+ context: {
91
+ contactId: { path: '/contactId' },
92
+ name: { path: '/name' },
93
+ },
94
+ },
347
95
  },
348
96
  },
349
- // Data model
97
+ { id: 'message-button-label', component: 'Text', text: 'Message' },
350
98
  {
351
- dataModelUpdate: {
352
- surfaceId: 'contact-card',
353
- path: '/',
354
- contents: [
355
- { key: 'name', valueString: contact.name },
356
- { key: 'title', valueString: contact.title },
357
- { key: 'team', valueString: contact.team },
358
- { key: 'location', valueString: contact.location },
359
- { key: 'email', valueString: contact.email },
360
- { key: 'mobile', valueString: contact.mobile },
361
- { key: 'calendar', valueString: contact.calendar },
362
- { key: 'imageUrl', valueString: contact.imageUrl },
363
- ],
99
+ id: 'message-button',
100
+ component: 'Button',
101
+ child: 'message-button-label',
102
+ action: {
103
+ event: {
104
+ name: 'message_contact',
105
+ context: {
106
+ email: { path: '/email' },
107
+ name: { path: '/name' },
108
+ },
109
+ },
364
110
  },
365
111
  },
366
- ];
367
- }
368
- // ---------------------------------------------------------------------------
369
- // Components
370
- // ---------------------------------------------------------------------------
371
- function ContactCardContent() {
372
- const { processMessages, clearSurfaces, getSurfaces } = useA2UIActions();
373
- const [selectedIdx, setSelectedIdx] = useState(null);
374
- const loadContact = useCallback((idx) => {
375
- clearSurfaces();
376
- processMessages(contactCardMessages(CONTACTS[idx]));
377
- setSelectedIdx(idx);
378
- }, [processMessages, clearSurfaces]);
379
- const surfaces = getSurfaces();
380
- const surfaceEntries = Array.from(surfaces.entries());
381
- return (_jsxs(Box, { sx: { display: 'flex', flex: 1, overflow: 'hidden' }, children: [_jsxs(Box, { sx: {
382
- width: '260px',
383
- borderRight: '1px solid',
384
- borderColor: 'border.default',
385
- backgroundColor: 'canvas.subtle',
386
- padding: 3,
387
- display: 'flex',
388
- flexDirection: 'column',
389
- gap: 2,
390
- }, children: [_jsx(Text, { as: "h3", sx: { fontSize: '1rem', fontWeight: 'bold', marginBottom: 2 }, children: "Contacts" }), CONTACTS.map((contact, idx) => (_jsx(PrimerButton, { variant: selectedIdx === idx ? 'primary' : 'default', onClick: () => loadContact(idx), sx: { width: '100%', justifyContent: 'flex-start' }, children: _jsxs(Box, { sx: {
391
- display: 'flex',
392
- flexDirection: 'column',
393
- alignItems: 'flex-start',
394
- }, children: [_jsx(Text, { sx: { fontWeight: 'bold', fontSize: '0.875rem' }, children: contact.name }), _jsx(Text, { sx: {
395
- fontSize: '0.75rem',
396
- color: selectedIdx === idx ? 'fg.onEmphasis' : 'fg.muted',
397
- }, children: contact.title })] }) }, contact.email)))] }), _jsx(Box, { sx: {
398
- flex: 1,
399
- display: 'flex',
400
- alignItems: 'center',
401
- justifyContent: 'center',
402
- padding: 4,
403
- }, children: selectedIdx === null ? (_jsxs(Box, { sx: { textAlign: 'center' }, children: [_jsx(Text, { sx: { fontSize: '3rem' }, children: "\uD83D\uDC64" }), _jsx(Text, { as: "p", sx: { color: 'fg.muted', marginTop: 2 }, children: "Select a contact from the sidebar" })] })) : (_jsx(Box, { sx: { maxWidth: '420px', width: '100%' }, children: surfaceEntries.map(([surfaceId]) => (_jsx(A2UIRenderer, { surfaceId: surfaceId }, surfaceId))) })) })] }));
112
+ ],
113
+ value: {
114
+ contactId: 'contact_001',
115
+ avatar: 'https://images.unsplash.com/photo-1507003211169-0a1dd7228f2d?w=100&h=100&fit=crop',
116
+ name: 'David Park',
117
+ title: 'Engineering Manager',
118
+ phone: '+1 (555) 234-5678',
119
+ email: 'david.park@company.com',
120
+ location: 'San Francisco, CA',
121
+ },
122
+ });
123
+ function ContactCardContent({ onAction, }) {
124
+ const { surfaces, processMessages, resetSurfaces } = useA2uiProcessor(onAction);
125
+ const loadCard = useCallback(() => {
126
+ resetSurfaces();
127
+ processMessages(CONTACT_CARD_MESSAGES);
128
+ }, [processMessages, resetSurfaces]);
129
+ useEffect(() => {
130
+ loadCard();
131
+ }, [loadCard]);
132
+ return (_jsxs(Box, { sx: { display: 'flex', flexDirection: 'column', gap: 3, px: 3, pb: 3 }, children: [_jsxs(Box, { sx: { display: 'flex', gap: 2 }, children: [_jsx(Button, { size: "small", variant: "primary", onClick: loadCard, children: "Reload Card" }), _jsx(Button, { size: "small", variant: "invisible", onClick: resetSurfaces, children: "Clear" })] }), _jsx(Box, { sx: { display: 'grid', gap: 3 }, children: surfaces.map(surface => (_jsx(Box, { sx: {
133
+ border: '1px solid',
134
+ borderColor: 'border.default',
135
+ borderRadius: 2,
136
+ p: 3,
137
+ backgroundColor: 'canvas.subtle',
138
+ }, children: _jsx(A2uiSurface, { surface: surface }) }, surface.id))) })] }));
404
139
  }
405
- /**
406
- * A2UiContactCardExample — Rich contact card with data binding & actions.
407
- * No backend required — uses static A2UI JSON messages rendered client-side.
408
- */
409
140
  const A2UiContactCardExample = () => {
410
- const handleAction = useCallback((actionMessage) => {
411
- console.log('Contact action:', actionMessage);
412
- alert(`Action: ${JSON.stringify(actionMessage, null, 2)}`);
141
+ const [lastAction, setLastAction] = useState(null);
142
+ const handleAction = useCallback((action) => {
143
+ console.log('A2UI Contact Card Action:', action);
144
+ setLastAction(action);
413
145
  }, []);
414
- return (_jsx(ThemedProvider, { children: _jsx(A2UIProvider, { onAction: handleAction, children: _jsxs(Box, { sx: {
415
- display: 'flex',
416
- flexDirection: 'column',
417
- minHeight: '100vh',
418
- backgroundColor: 'canvas.default',
419
- }, children: [_jsxs(Box, { sx: {
420
- padding: 3,
146
+ const actionPreview = useMemo(() => {
147
+ if (!lastAction) {
148
+ return 'Trigger an action from the card to inspect the event payload.';
149
+ }
150
+ return JSON.stringify(lastAction, null, 2);
151
+ }, [lastAction]);
152
+ return (_jsx(ThemedProvider, { children: _jsx(A2uiMarkdownProvider, { children: _jsxs(Box, { sx: { minHeight: '100vh', display: 'flex', flexDirection: 'column' }, children: [_jsxs(Box, { sx: {
153
+ px: 3,
154
+ py: 3,
421
155
  borderBottom: '1px solid',
422
156
  borderColor: 'border.default',
423
157
  backgroundColor: 'canvas.subtle',
424
- }, children: [_jsx(Text, { as: "h1", sx: {
425
- fontSize: '1.25rem',
426
- fontWeight: 'bold',
427
- display: 'flex',
428
- alignItems: 'center',
429
- gap: 2,
430
- }, children: "\uD83D\uDC64 A2UI Contact Card" }), _jsx(Text, { sx: { fontSize: '0.875rem', color: 'fg.muted' }, children: "Data-bound contact card with actions \u2014 based on A2UI contact_lookup sample" })] }), _jsx(ContactCardContent, {})] }) }) }));
158
+ }, children: [_jsx(Text, { as: "h1", sx: { fontSize: 3, fontWeight: 'bold' }, children: "\uD83D\uDC64 A2UI Contact Card" }), _jsx(Text, { sx: { color: 'fg.muted' }, children: "Uses MessageProcessor + A2uiSurface with native A2UI protocol messages." })] }), _jsxs(Box, { sx: {
159
+ display: 'grid',
160
+ gridTemplateColumns: ['1fr', '2fr 1fr'],
161
+ gap: 3,
162
+ p: 3,
163
+ }, children: [_jsx(ContactCardContent, { onAction: handleAction }), _jsx(Box, { sx: {
164
+ border: '1px solid',
165
+ borderColor: 'border.default',
166
+ borderRadius: 2,
167
+ p: 3,
168
+ backgroundColor: 'canvas.subtle',
169
+ fontFamily: 'mono',
170
+ fontSize: 0,
171
+ whiteSpace: 'pre-wrap',
172
+ overflow: 'auto',
173
+ }, children: actionPreview })] })] }) }) }));
431
174
  };
432
175
  export default A2UiContactCardExample;
@@ -1,33 +1,3 @@
1
- /**
2
- * A2UiRestaurantExample
3
- *
4
- * Demonstrates A2UI (Agent-to-UI) protocol integration with a pydantic-ai
5
- * restaurant finder agent using the official @a2ui/react renderer.
6
- *
7
- * The agent generates A2UI JSON messages that are rendered into
8
- * interactive React components via A2UIProvider + A2UIRenderer.
9
- *
10
- * Features:
11
- * - A2UI protocol message processing via @a2ui/react
12
- * - Dynamic UI generation from agent responses
13
- * - Restaurant search and booking interface
14
- * - Action handling for interactive components (buttons, forms)
15
- * - Dark/light theme support
16
- *
17
- * Backend: /api/v1/a2ui/restaurant/
18
- */
19
1
  import React from 'react';
20
- /**
21
- * A2UiRestaurantExample - Main example component
22
- *
23
- * Demonstrates A2UI protocol integration with pydantic-ai.
24
- * The agent generates A2UI JSON messages for restaurant search,
25
- * display, and booking functionality.
26
- *
27
- * Uses @a2ui/react's two-context architecture:
28
- * - A2UIProvider wraps the app, receives an onAction callback
29
- * - useA2UIActions() provides processMessages/clearSurfaces/getSurfaces
30
- * - A2UIRenderer renders surfaces by ID
31
- */
32
2
  declare const A2UiRestaurantExample: React.FC;
33
3
  export default A2UiRestaurantExample;