symbiote-ui 0.3.0-alpha.4

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 (322) hide show
  1. package/CHANGELOG.md +46 -0
  2. package/LICENSE +21 -0
  3. package/README.md +76 -0
  4. package/canvas/AutoLayout.js +731 -0
  5. package/canvas/Breadcrumb/Breadcrumb.css.js +75 -0
  6. package/canvas/Breadcrumb/Breadcrumb.js +96 -0
  7. package/canvas/Breadcrumb/Breadcrumb.tpl.js +7 -0
  8. package/canvas/CanvasConnectionRenderer.js +971 -0
  9. package/canvas/CanvasGraph/CanvasGraph.css.js +29 -0
  10. package/canvas/CanvasGraph/CanvasGraph.js +1697 -0
  11. package/canvas/CanvasGraph/CanvasGraphDrawState.js +280 -0
  12. package/canvas/CanvasGraph/CanvasGraphGeometry.js +194 -0
  13. package/canvas/CanvasViewport.js +550 -0
  14. package/canvas/ConnectionRenderer.js +1283 -0
  15. package/canvas/FlowSimulator.js +326 -0
  16. package/canvas/ForceLayout.js +226 -0
  17. package/canvas/ForceWorker.js +1303 -0
  18. package/canvas/FrameManager.js +223 -0
  19. package/canvas/GraphExplorerShell/GraphExplorerShell.css.js +136 -0
  20. package/canvas/GraphExplorerShell/GraphExplorerShell.js +129 -0
  21. package/canvas/GraphExplorerShell/GraphExplorerShell.tpl.js +12 -0
  22. package/canvas/GraphTabs/GraphTabs.css.js +101 -0
  23. package/canvas/GraphTabs/GraphTabs.js +189 -0
  24. package/canvas/GraphTabs/GraphTabs.tpl.js +12 -0
  25. package/canvas/LODManager.js +88 -0
  26. package/canvas/Minimap/Minimap.css.js +73 -0
  27. package/canvas/Minimap/Minimap.js +210 -0
  28. package/canvas/Minimap/Minimap.tpl.js +7 -0
  29. package/canvas/NodeCanvas/NodeCanvas.css.js +398 -0
  30. package/canvas/NodeCanvas/NodeCanvas.js +1499 -0
  31. package/canvas/NodeCanvas/NodeCanvas.tpl.js +22 -0
  32. package/canvas/NodeSearch/NodeSearch.css.js +97 -0
  33. package/canvas/NodeSearch/NodeSearch.js +140 -0
  34. package/canvas/NodeSearch/NodeSearch.tpl.js +25 -0
  35. package/canvas/NodeViewManager.js +748 -0
  36. package/canvas/PcbRouteDiagnostics.js +463 -0
  37. package/canvas/PcbRouter.js +1127 -0
  38. package/canvas/PinExpansion.js +134 -0
  39. package/canvas/PseudoConnection.js +84 -0
  40. package/canvas/SelectionSync.js +163 -0
  41. package/canvas/SubgraphManager.js +203 -0
  42. package/canvas/SubgraphRouter.js +452 -0
  43. package/canvas/ViewportActions.js +473 -0
  44. package/canvas/graph-explorer.js +339 -0
  45. package/canvas/graph-layout.js +148 -0
  46. package/canvas/graph-model.js +68 -0
  47. package/canvas/html-in-canvas.js +202 -0
  48. package/canvas/project-graph-builder.js +440 -0
  49. package/canvas/project-graph-model.js +183 -0
  50. package/chat/ChatComposer/ChatComposer.css.js +652 -0
  51. package/chat/ChatComposer/ChatComposer.js +304 -0
  52. package/chat/ChatList/ChatList.css.js +102 -0
  53. package/chat/ChatList/ChatList.js +99 -0
  54. package/chat/ChatList/ChatList.tpl.js +20 -0
  55. package/chat/ChatListItem/ChatListItem.css.js +117 -0
  56. package/chat/ChatListItem/ChatListItem.js +32 -0
  57. package/chat/ChatListItem/ChatListItem.tpl.js +17 -0
  58. package/chat/ChatMessageItem/ChatMessageItem.css.js +628 -0
  59. package/chat/ChatMessageItem/ChatMessageItem.js +156 -0
  60. package/chat/ChatSidebar/ChatSidebar.css.js +150 -0
  61. package/chat/ChatSidebar/ChatSidebar.js +230 -0
  62. package/chat/ChatSidebar/ChatSidebar.tpl.js +18 -0
  63. package/chat/ChatSidebar/constants.js +11 -0
  64. package/chat/ChatSidebarItem/ChatSidebarItem.css.js +445 -0
  65. package/chat/ChatSidebarItem/ChatSidebarItem.js +304 -0
  66. package/chat/ChatTranscript/ChatTranscript.css.js +90 -0
  67. package/chat/ChatTranscript/ChatTranscript.js +244 -0
  68. package/chat/chat-context.js +123 -0
  69. package/chat/message-model.js +156 -0
  70. package/cli.js +20 -0
  71. package/control/Button/Button.css.js +93 -0
  72. package/control/Button/Button.js +78 -0
  73. package/control/Button/Button.tpl.js +3 -0
  74. package/control/Field/Field.css.js +91 -0
  75. package/control/Field/Field.js +17 -0
  76. package/control/Field/Field.tpl.js +3 -0
  77. package/core/Connection.js +47 -0
  78. package/core/Editor.js +449 -0
  79. package/core/Frame.js +33 -0
  80. package/core/GraphMermaid.js +348 -0
  81. package/core/GraphText.js +228 -0
  82. package/core/Node.js +145 -0
  83. package/core/Portal.js +106 -0
  84. package/core/Socket.js +187 -0
  85. package/core/SubgraphNode.js +121 -0
  86. package/core/base-path.js +55 -0
  87. package/core/dom-utils.js +14 -0
  88. package/core/index.js +18 -0
  89. package/core/local-cache.js +26 -0
  90. package/core/state-sync.js +227 -0
  91. package/custom-elements.json +6380 -0
  92. package/discover.js +240 -0
  93. package/display/Badge/Badge.css.js +44 -0
  94. package/display/Badge/Badge.js +17 -0
  95. package/display/Badge/Badge.tpl.js +3 -0
  96. package/display/Banner/Banner.css.js +61 -0
  97. package/display/Banner/Banner.js +17 -0
  98. package/display/Banner/Banner.tpl.js +3 -0
  99. package/display/CodeBlock/CodeBlock.css.js +194 -0
  100. package/display/CodeBlock/CodeBlock.js +220 -0
  101. package/display/CodeBlock/CodeBlock.tpl.js +11 -0
  102. package/display/DataTable/DataTable.css.js +101 -0
  103. package/display/DataTable/DataTable.js +136 -0
  104. package/display/DataTable/DataTable.tpl.js +13 -0
  105. package/display/EmptyState/EmptyState.css.js +33 -0
  106. package/display/EmptyState/EmptyState.js +17 -0
  107. package/display/EmptyState/EmptyState.tpl.js +3 -0
  108. package/display/EventFeed/EventFeed.css.js +145 -0
  109. package/display/EventFeed/EventFeed.js +64 -0
  110. package/display/EventFeed/EventFeed.tpl.js +14 -0
  111. package/display/EventFeed/EventFeedItem.js +116 -0
  112. package/display/EventFeed/EventFeedItem.tpl.js +22 -0
  113. package/display/LoadingOverlay/LoadingOverlay.css.js +91 -0
  114. package/display/LoadingOverlay/LoadingOverlay.js +48 -0
  115. package/display/LoadingOverlay/LoadingOverlay.tpl.js +12 -0
  116. package/display/Metric/Metric.css.js +60 -0
  117. package/display/Metric/Metric.js +17 -0
  118. package/display/Metric/Metric.tpl.js +6 -0
  119. package/display/OutputGraphPreview/OutputGraphPreview.css.js +122 -0
  120. package/display/OutputGraphPreview/OutputGraphPreview.js +89 -0
  121. package/display/OutputGraphPreview/OutputGraphPreview.tpl.js +13 -0
  122. package/display/OutputListPreview/OutputListPreview.css.js +109 -0
  123. package/display/OutputListPreview/OutputListPreview.js +77 -0
  124. package/display/OutputListPreview/OutputListPreview.tpl.js +13 -0
  125. package/display/SourceEditor/SourceEditor.css.js +39 -0
  126. package/display/SourceEditor/SourceEditor.js +129 -0
  127. package/display/SourceEditor/SourceEditor.tpl.js +10 -0
  128. package/display/SourceViewer/SourceViewer.css.js +80 -0
  129. package/display/SourceViewer/SourceViewer.js +418 -0
  130. package/display/SourceViewer/SourceViewer.tpl.js +17 -0
  131. package/display/StatusRibbon/StatusRibbon.css.js +73 -0
  132. package/display/StatusRibbon/StatusRibbon.js +87 -0
  133. package/display/StatusRibbon/StatusRibbon.tpl.js +7 -0
  134. package/display/event-feed-adapter.js +72 -0
  135. package/display/format-utils.js +29 -0
  136. package/display/highlight.js +659 -0
  137. package/display/icons.js +37 -0
  138. package/display/markdown-formatter.js +60 -0
  139. package/display/network-approval-page.js +487 -0
  140. package/display/output-preview.js +261 -0
  141. package/effects/CellBg/CellBg.css.js +33 -0
  142. package/effects/CellBg/CellBg.js +410 -0
  143. package/effects/CellBg/CellBg.tpl.js +5 -0
  144. package/graph/canvas-adapter.js +223 -0
  145. package/graph/graph-algorithms.js +31 -0
  146. package/graph/index.js +46 -0
  147. package/graph/model.js +176 -0
  148. package/graph/project-graph-build.js +66 -0
  149. package/graph/project-graph-metadata.js +253 -0
  150. package/graph/project-package.js +128 -0
  151. package/graph/project-runtime.js +116 -0
  152. package/graph/project-transaction.js +284 -0
  153. package/graph/skeleton-utils.js +84 -0
  154. package/graph/theme-contract.js +36 -0
  155. package/graph/transaction-parser.js +56 -0
  156. package/icons/MaterialSymbols.js +69 -0
  157. package/icons/material-symbols-outlined-400.ttf +0 -0
  158. package/icons/material-symbols.css +24 -0
  159. package/index.js +95 -0
  160. package/inspector/InspectorPanel/InspectorPanel.css.js +375 -0
  161. package/inspector/InspectorPanel/InspectorPanel.js +368 -0
  162. package/inspector/InspectorPanel/InspectorPanel.tpl.js +96 -0
  163. package/inspector/TemplatePreview/TemplatePreview.css.js +104 -0
  164. package/inspector/TemplatePreview/TemplatePreview.js +145 -0
  165. package/inspector/TemplatePreview/TemplatePreview.tpl.js +33 -0
  166. package/interactions/ConnectFlow.js +304 -0
  167. package/interactions/Drag.js +104 -0
  168. package/interactions/Selector.js +133 -0
  169. package/interactions/SnapGrid.js +66 -0
  170. package/interactions/Zoom.js +139 -0
  171. package/layout/ActionZone/ActionZone.css.js +88 -0
  172. package/layout/ActionZone/ActionZone.js +261 -0
  173. package/layout/ActionZone/ActionZone.tpl.js +11 -0
  174. package/layout/CrossLayoutPortalBridge/CrossLayoutPortalBridge.js +255 -0
  175. package/layout/Layout/Layout.css.js +91 -0
  176. package/layout/Layout/Layout.js +637 -0
  177. package/layout/Layout/Layout.tpl.js +27 -0
  178. package/layout/LayoutNode/LayoutNode.css.js +302 -0
  179. package/layout/LayoutNode/LayoutNode.js +509 -0
  180. package/layout/LayoutNode/LayoutNode.tpl.js +39 -0
  181. package/layout/LayoutPreview/LayoutPreview.css.js +46 -0
  182. package/layout/LayoutPreview/LayoutPreview.js +102 -0
  183. package/layout/LayoutPreview/LayoutPreview.tpl.js +6 -0
  184. package/layout/LayoutRouter/LayoutRouter.js +274 -0
  185. package/layout/LayoutRouter/SectionRegistry.js +135 -0
  186. package/layout/LayoutRouter/routerSync.js +250 -0
  187. package/layout/LayoutSidebar/LayoutSidebar.css.js +411 -0
  188. package/layout/LayoutSidebar/LayoutSidebar.js +368 -0
  189. package/layout/LayoutSidebar/LayoutSidebar.tpl.js +26 -0
  190. package/layout/LayoutSidebar/SidebarSection.css.js +20 -0
  191. package/layout/LayoutSidebar/SidebarSection.js +184 -0
  192. package/layout/LayoutSidebar/SidebarSection.tpl.js +22 -0
  193. package/layout/LayoutTree.js +373 -0
  194. package/layout/PanelMenu/PanelMenu.css.js +43 -0
  195. package/layout/PanelMenu/PanelMenu.js +95 -0
  196. package/layout/PanelMenu/PanelMenu.tpl.js +17 -0
  197. package/layout/ProjectTabs/ProjectTabs.css.js +188 -0
  198. package/layout/ProjectTabs/ProjectTabs.js +77 -0
  199. package/layout/ProjectTabs/ProjectTabs.tpl.js +15 -0
  200. package/layout/index.js +40 -0
  201. package/list/ListDetailShell/ListDetailShell.css.js +128 -0
  202. package/list/ListDetailShell/ListDetailShell.js +72 -0
  203. package/list/ListDetailShell/ListDetailShell.tpl.js +36 -0
  204. package/list/ListItem/ListItem.css.js +111 -0
  205. package/list/ListItem/ListItem.js +66 -0
  206. package/list/ListItem/ListItem.tpl.js +18 -0
  207. package/locale/index.js +503 -0
  208. package/manifest/component-registry.js +2446 -0
  209. package/manifest/graph-schema.js +285 -0
  210. package/manifest/index.js +6 -0
  211. package/manifest/project-schema-catalog.js +246 -0
  212. package/manifest/rule-catalog.js +201 -0
  213. package/manifest/theme-catalog.js +2149 -0
  214. package/manifest/ui-schema-catalog.js +334 -0
  215. package/menu/ContextMenu/ContextMenu.css.js +61 -0
  216. package/menu/ContextMenu/ContextMenu.js +82 -0
  217. package/menu/ContextMenu/ContextMenu.tpl.js +19 -0
  218. package/navigation/QuickOpen/QuickOpen.css.js +92 -0
  219. package/navigation/QuickOpen/QuickOpen.js +185 -0
  220. package/navigation/QuickOpen/QuickOpen.tpl.js +15 -0
  221. package/navigation/quick-open-utils.js +101 -0
  222. package/node/CtrlItem/CtrlItem.css.js +41 -0
  223. package/node/CtrlItem/CtrlItem.js +24 -0
  224. package/node/CtrlItem/CtrlItem.tpl.js +17 -0
  225. package/node/GraphFrame/GraphFrame.css.js +66 -0
  226. package/node/GraphFrame/GraphFrame.js +32 -0
  227. package/node/GraphFrame/GraphFrame.tpl.js +13 -0
  228. package/node/GraphNode/GraphNode.css.js +815 -0
  229. package/node/GraphNode/GraphNode.js +173 -0
  230. package/node/GraphNode/GraphNode.tpl.js +33 -0
  231. package/node/NodeCallout/NodeCallout.css.js +91 -0
  232. package/node/NodeCallout/NodeCallout.js +281 -0
  233. package/node/NodeCallout/NodeCallout.tpl.js +8 -0
  234. package/node/NodeSocket/NodeSocket.css.js +68 -0
  235. package/node/NodeSocket/NodeSocket.js +26 -0
  236. package/node/NodeSocket/NodeSocket.tpl.js +7 -0
  237. package/node/PortItem/PortItem.css.js +93 -0
  238. package/node/PortItem/PortItem.js +87 -0
  239. package/node/PortItem/PortItem.tpl.js +10 -0
  240. package/package.json +165 -0
  241. package/palette/PaletteBrowser/PaletteBrowser.css.js +143 -0
  242. package/palette/PaletteBrowser/PaletteBrowser.js +152 -0
  243. package/palette/PaletteBrowser/PaletteBrowser.tpl.js +23 -0
  244. package/plugins/History.js +408 -0
  245. package/plugins/Readonly.js +60 -0
  246. package/rules/symbiote-3x.json +170 -0
  247. package/schemas/component-descriptor-v1.json +91 -0
  248. package/schemas/component-descriptor-v2.json +145 -0
  249. package/schemas/graph-model-v1.json +179 -0
  250. package/schemas/graph-v1.json +91 -0
  251. package/schemas/project-package-v1.json +102 -0
  252. package/schemas/project-transaction-v1.json +114 -0
  253. package/schemas/runtime-ui-v1.json +80 -0
  254. package/schemas/theme-rule-block-v1.json +73 -0
  255. package/shapes/CircleShape.js +79 -0
  256. package/shapes/CommentShape.js +35 -0
  257. package/shapes/DiamondShape.js +130 -0
  258. package/shapes/NodeShape.js +79 -0
  259. package/shapes/PillShape.js +91 -0
  260. package/shapes/RectShape.js +84 -0
  261. package/shapes/SVGShape.js +525 -0
  262. package/shapes/index.js +63 -0
  263. package/surface/Card/Card.css.js +57 -0
  264. package/surface/Card/Card.js +17 -0
  265. package/surface/Card/Card.tpl.js +3 -0
  266. package/themes/Palette.js +30 -0
  267. package/themes/Skin.js +113 -0
  268. package/themes/Theme.js +82 -0
  269. package/themes/carbon.js +135 -0
  270. package/themes/dark.js +140 -0
  271. package/themes/default-dark.js +714 -0
  272. package/themes/default-provider.css +635 -0
  273. package/themes/default-provider.js +718 -0
  274. package/themes/ebook.js +136 -0
  275. package/themes/grey.js +137 -0
  276. package/themes/light.js +139 -0
  277. package/themes/neon.js +138 -0
  278. package/themes/pcb.js +273 -0
  279. package/themes/synthwave.js +138 -0
  280. package/tokens/base.json +29 -0
  281. package/tokens/themes/carbon.json +11 -0
  282. package/tokens/themes/dark.json +12 -0
  283. package/tokens/themes/default-dark.json +1543 -0
  284. package/tokens/themes/default-provider.json +1543 -0
  285. package/tokens/themes/ebook.json +11 -0
  286. package/tokens/themes/grey.json +11 -0
  287. package/tokens/themes/light.json +12 -0
  288. package/tokens/themes/neon.json +11 -0
  289. package/tokens/themes/pcb.json +11 -0
  290. package/tokens/themes/synthwave.json +11 -0
  291. package/toolbar/QuickToolbar/QuickToolbar.css.js +152 -0
  292. package/toolbar/QuickToolbar/QuickToolbar.js +529 -0
  293. package/toolbar/QuickToolbar/QuickToolbar.tpl.js +34 -0
  294. package/tree/TreePanel/TreePanel.css.js +112 -0
  295. package/tree/TreePanel/TreePanel.js +147 -0
  296. package/tree/TreePanel/TreePanel.tpl.js +18 -0
  297. package/tree/TreeView/TreeView.css.js +122 -0
  298. package/tree/TreeView/TreeView.js +365 -0
  299. package/tree/TreeView/TreeView.tpl.js +10 -0
  300. package/ui/dialogs.js +221 -0
  301. package/ui/host-adapters.js +114 -0
  302. package/ui/index.js +660 -0
  303. package/ui/locale.js +50 -0
  304. package/ui/overlay-stack.js +89 -0
  305. package/ui/shared-styles.js +26 -0
  306. package/webmcp.js +37 -0
  307. package/xr/deep-graph.js +646 -0
  308. package/xr/emulation.js +198 -0
  309. package/xr/gesture.js +228 -0
  310. package/xr/html-canvas-renderer.js +472 -0
  311. package/xr/index.js +15 -0
  312. package/xr/layout-projection.js +1046 -0
  313. package/xr/panel-frame.js +128 -0
  314. package/xr/panel-host.js +267 -0
  315. package/xr/pointer.js +258 -0
  316. package/xr/scene-controller.js +242 -0
  317. package/xr/spatial-scene.js +212 -0
  318. package/xr/theme-bridge.js +105 -0
  319. package/xr/three-webxr-adapter.js +3439 -0
  320. package/xr/webgl-layer-renderer.js +419 -0
  321. package/xr/webxr.js +679 -0
  322. package/xr/workbench.js +516 -0
@@ -0,0 +1,2446 @@
1
+ export const COMPONENT_UI_SPECIFIER = 'symbiote-ui/ui';
2
+ export const COMPONENT_DESCRIPTOR_SCHEMA = 'schemas/component-descriptor-v2.json';
3
+
4
+ const STATIC_RENDERABLE_TAGS = new Set([
5
+ 'code-block',
6
+ 'source-viewer',
7
+ 'sn-badge',
8
+ 'sn-banner',
9
+ 'sn-card',
10
+ 'sn-data-table',
11
+ 'sn-empty-state',
12
+ 'sn-event-feed',
13
+ 'sn-field',
14
+ 'sn-metric',
15
+ ]);
16
+
17
+ const HYDRATE_ONLY_TAGS = new Set([
18
+ 'chat-composer',
19
+ 'chat-list',
20
+ 'chat-list-item',
21
+ 'chat-message-item',
22
+ 'chat-sidebar-item',
23
+ 'chat-sidebar-shell',
24
+ 'chat-sidebar-sub-item',
25
+ 'chat-transcript',
26
+ 'list-detail-shell',
27
+ 'project-tabs',
28
+ 'quick-open',
29
+ 'sn-list-item',
30
+ 'source-editor',
31
+ 'tree-panel',
32
+ 'tree-view',
33
+ ]);
34
+
35
+ const CLIENT_ONLY_CATEGORIES = new Set([
36
+ 'canvas',
37
+ 'effects',
38
+ 'inspector',
39
+ 'menu',
40
+ 'navigation',
41
+ 'node',
42
+ 'palette',
43
+ 'toolbar',
44
+ ]);
45
+
46
+ const WEBMCP_TOOLS = {
47
+ 'chat-composer': [
48
+ {
49
+ name: 'chat_composer_submit',
50
+ description: 'Submit or stop the current composer input through the host-owned chat transport.',
51
+ inputSchema: {
52
+ type: 'object',
53
+ additionalProperties: false,
54
+ properties: {
55
+ value: { type: 'string' },
56
+ action: { enum: ['submit', 'stop'] },
57
+ },
58
+ required: ['action'],
59
+ },
60
+ annotations: { readOnlyHint: false, destructiveHint: false },
61
+ exposedTo: ['agent', 'assistant'],
62
+ },
63
+ ],
64
+ 'quick-open': [
65
+ {
66
+ name: 'quick_open_select',
67
+ description: 'Search and select an item from a host-provided quick-open result set.',
68
+ inputSchema: {
69
+ type: 'object',
70
+ additionalProperties: false,
71
+ properties: {
72
+ query: { type: 'string' },
73
+ itemId: { type: 'string' },
74
+ },
75
+ },
76
+ annotations: { readOnlyHint: false, destructiveHint: false },
77
+ exposedTo: ['agent', 'assistant'],
78
+ },
79
+ ],
80
+ 'project-tabs': [
81
+ {
82
+ name: 'project_tabs_select',
83
+ description: 'Select or describe a tab in a dynamic host layout without owning route or persistence policy.',
84
+ inputSchema: {
85
+ type: 'object',
86
+ additionalProperties: false,
87
+ properties: {
88
+ tabId: { type: 'string' },
89
+ },
90
+ required: ['tabId'],
91
+ },
92
+ annotations: { readOnlyHint: false, destructiveHint: false },
93
+ exposedTo: ['agent', 'assistant'],
94
+ },
95
+ ],
96
+ 'sn-list-item': [
97
+ {
98
+ name: 'list_item_select',
99
+ description: 'Select a reusable list item from host-provided data.',
100
+ inputSchema: {
101
+ type: 'object',
102
+ additionalProperties: false,
103
+ properties: {
104
+ itemId: { type: 'string' },
105
+ },
106
+ required: ['itemId'],
107
+ },
108
+ annotations: { readOnlyHint: false, destructiveHint: false },
109
+ exposedTo: ['agent', 'assistant'],
110
+ },
111
+ ],
112
+ 'source-editor': [
113
+ {
114
+ name: 'source_editor_content',
115
+ description: 'Read or replace source editor text while leaving persistence policy to the host application.',
116
+ inputSchema: {
117
+ type: 'object',
118
+ additionalProperties: false,
119
+ properties: {
120
+ action: { enum: ['read', 'replace'] },
121
+ value: { type: 'string' },
122
+ },
123
+ required: ['action'],
124
+ },
125
+ annotations: { readOnlyHint: false, destructiveHint: false },
126
+ exposedTo: ['agent', 'assistant'],
127
+ },
128
+ ],
129
+ 'sn-tree-panel': [
130
+ {
131
+ name: 'tree_panel_select',
132
+ description: 'Filter or select a tree item from host-provided tree data.',
133
+ inputSchema: {
134
+ type: 'object',
135
+ additionalProperties: false,
136
+ properties: {
137
+ query: { type: 'string' },
138
+ itemId: { type: 'string' },
139
+ },
140
+ },
141
+ annotations: { readOnlyHint: false, destructiveHint: false },
142
+ exposedTo: ['agent', 'assistant'],
143
+ },
144
+ ],
145
+ };
146
+
147
+ function getSsrContract(component) {
148
+ if (STATIC_RENDERABLE_TAGS.has(component.tagName)) {
149
+ return {
150
+ mode: 'jsda-ssr-renderable',
151
+ importSafe: false,
152
+ jsdaRenderable: true,
153
+ requiresDom: true,
154
+ browserApis: [],
155
+ notes: 'Import after JSDA/linkedom installs DOM globals; verify rendering with JSDA SSR smoke tests.',
156
+ };
157
+ }
158
+ if (HYDRATE_ONLY_TAGS.has(component.tagName)) {
159
+ return {
160
+ mode: 'hydrate-only',
161
+ importSafe: false,
162
+ jsdaRenderable: false,
163
+ requiresDom: true,
164
+ browserApis: ['events', 'selection', 'focus'],
165
+ notes: 'May render shell markup under SSR, but interactive behavior belongs to browser hydration.',
166
+ };
167
+ }
168
+ if (CLIENT_ONLY_CATEGORIES.has(component.category)) {
169
+ return {
170
+ mode: 'client-only',
171
+ importSafe: false,
172
+ jsdaRenderable: false,
173
+ requiresDom: true,
174
+ browserApis: ['canvas', 'layout-metrics', 'observers', 'animation-frame'],
175
+ notes: 'Browser-only interaction surface; exclude from JSDA SSR render fixtures unless guarded by a host fallback.',
176
+ };
177
+ }
178
+ return {
179
+ mode: 'hydrate-only',
180
+ importSafe: false,
181
+ jsdaRenderable: false,
182
+ requiresDom: true,
183
+ browserApis: ['events'],
184
+ notes: 'Default browser component classification pending component-specific JSDA SSR smoke coverage.',
185
+ };
186
+ }
187
+
188
+ function getWebMcpContract(component) {
189
+ let tools = WEBMCP_TOOLS[component.tagName];
190
+ if (!tools) return null;
191
+ return {
192
+ documentation: 'Agent-facing WebMCP documentation for stable component affordances only; host workflow policy remains outside symbiote-ui.',
193
+ tools,
194
+ };
195
+ }
196
+
197
+ function normalizeContract(component) {
198
+ if (!component.contract) return null;
199
+ return {
200
+ ...component.contract,
201
+ schemaVersion: 'component-descriptor-v2',
202
+ ssr: component.contract.ssr || getSsrContract(component),
203
+ ...(component.contract.webmcp || getWebMcpContract(component)
204
+ ? { webmcp: component.contract.webmcp || getWebMcpContract(component) }
205
+ : {}),
206
+ };
207
+ }
208
+
209
+ const UI_NAMED_EXPORTS = new Set([
210
+ 'GraphNode',
211
+ 'NodeCallout',
212
+ 'NodeSocket',
213
+ 'NodeCanvas',
214
+ 'CanvasGraph',
215
+ 'GraphExplorerShell',
216
+ 'ContextMenu',
217
+ 'Layout',
218
+ 'LayoutSidebar',
219
+ 'LayoutNode',
220
+ 'CrossLayoutPortalBridge',
221
+ 'ProjectTabs',
222
+ 'CodeBlock',
223
+ 'SourceViewer',
224
+ 'SourceEditor',
225
+ 'LoadingOverlay',
226
+ 'OutputListPreview',
227
+ 'OutputGraphPreview',
228
+ 'CellBg',
229
+ 'QuickToolbar',
230
+ 'InspectorPanel',
231
+ 'PaletteBrowser',
232
+ 'Minimap',
233
+ 'NodeSearch',
234
+ 'GraphTabs',
235
+ 'Breadcrumb',
236
+ 'QuickOpen',
237
+ 'ChatMessageItem',
238
+ 'ChatTranscript',
239
+ 'ChatComposer',
240
+ 'ChatList',
241
+ 'ChatListItem',
242
+ 'ChatSidebarShell',
243
+ 'ChatSidebarItem',
244
+ 'ChatSidebarSubItem',
245
+ 'ListItem',
246
+ 'ListDetailShell',
247
+ 'TreeView',
248
+ 'TreePanel',
249
+ 'ActionButton',
250
+ 'FormField',
251
+ 'SurfaceCard',
252
+ 'StatusBadge',
253
+ 'MetricItem',
254
+ 'DataTable',
255
+ 'EventFeed',
256
+ 'StatusBanner',
257
+ 'EmptyState',
258
+ 'GraphFrame',
259
+ 'StatusRibbon',
260
+ ]);
261
+
262
+ const COMPONENT_VISIBILITY = {
263
+ public: 'public',
264
+ internal: 'internal',
265
+ experimental: 'experimental',
266
+ };
267
+
268
+ export let COMPONENTS = [
269
+ {
270
+ tagName: 'graph-node',
271
+ className: 'GraphNode',
272
+ module: 'node/GraphNode/GraphNode.js',
273
+ category: 'node',
274
+ description: 'Interactive graph node component for the node canvas.',
275
+ contract: {
276
+ status: 'draft',
277
+ schemaVersion: 'component-descriptor-v1',
278
+ dataSchema: 'schemas/graph-model-v1.json',
279
+ capabilities: ['node-card', 'ports', 'controls', 'category-accent', 'type-accent', 'error-state'],
280
+ attributes: [
281
+ { name: 'node-label', type: 'string', description: 'Rendered node label.' },
282
+ { name: 'node-category', type: 'string', description: 'Semantic node category used for icon and accent selection.' },
283
+ { name: 'node-type', type: 'string', description: 'Semantic node type used for type-specific accent selection when a matching theme token exists.' },
284
+ ],
285
+ properties: [
286
+ { name: 'mediaSrc', type: 'string', description: 'Media or avatar image URL derived from node params.' },
287
+ { name: 'summary', type: 'string', description: 'Presentation summary derived from node params.' },
288
+ { name: 'href', type: 'string', description: 'Presentation link derived from node params.' },
289
+ { name: 'itemsList', type: 'array', description: 'Presentation list items derived from node params.' },
290
+ { name: 'inputPorts', type: 'array', description: 'Input port descriptors derived from node input data.' },
291
+ { name: 'outputPorts', type: 'array', description: 'Output port descriptors derived from node output data.' },
292
+ { name: 'controlsList', type: 'array', description: 'Control descriptors rendered inside the node body.' },
293
+ ],
294
+ events: [],
295
+ themeAliases: [
296
+ '--sn-node-bg',
297
+ '--sn-node-border',
298
+ '--sn-node-selected',
299
+ '--sn-node-radius',
300
+ '--sn-node-accent',
301
+ '--sn-node-header-bg',
302
+ '--sn-node-items-max-height',
303
+ ],
304
+ },
305
+ },
306
+ {
307
+ tagName: 'node-socket',
308
+ className: 'NodeSocket',
309
+ module: 'node/NodeSocket/NodeSocket.js',
310
+ category: 'node',
311
+ description: 'Socket endpoint component for graph node inputs and outputs.',
312
+ contract: {
313
+ status: 'draft',
314
+ schemaVersion: 'component-descriptor-v1',
315
+ dataSchema: 'schemas/graph-model-v1.json',
316
+ capabilities: ['socket-endpoint', 'shape-variant', 'accent-color', 'connection-target'],
317
+ attributes: [
318
+ { name: 'data-socket-color', type: 'string', description: 'Socket color reflected to the local socket color variable.' },
319
+ { name: 'data-socket-shape', type: 'string', description: 'Socket shape: circle, square, diamond, or triangle.' },
320
+ ],
321
+ events: [],
322
+ themeAliases: [
323
+ '--sn-node-accent',
324
+ '--sn-node-bg',
325
+ ],
326
+ },
327
+ },
328
+ {
329
+ tagName: 'node-callout',
330
+ className: 'NodeCallout',
331
+ module: 'node/NodeCallout/NodeCallout.js',
332
+ category: 'node',
333
+ description: 'Floating node callout anchored to a graph node or DOM element.',
334
+ contract: {
335
+ status: 'draft',
336
+ schemaVersion: 'component-descriptor-v1',
337
+ dataSchema: 'schemas/runtime-ui-v1.json',
338
+ capabilities: ['floating-callout', 'anchor-tracking', 'node-label'],
339
+ attributes: [
340
+ { name: 'anchor-node-id', type: 'string', description: 'Graph node id used as the anchor element.' },
341
+ { name: 'anchor-selector', type: 'string', description: 'CSS selector for the anchor element.' },
342
+ { name: 'placement', type: 'string', description: 'Callout placement: top, bottom, left, or right.' },
343
+ { name: 'offset', type: 'number', description: 'Distance in pixels between the callout and anchor.' },
344
+ { name: 'trigger', type: 'string', description: 'Visibility trigger: always or hover.' },
345
+ { name: 'text', type: 'string', description: 'Optional plain text content when no slotted content is used.' },
346
+ ],
347
+ properties: [
348
+ { name: 'anchorElement', type: 'Element|null', description: 'Direct DOM element used as the callout anchor.' },
349
+ ],
350
+ methods: [
351
+ { name: 'show', type: 'function', description: 'Shows the callout.' },
352
+ { name: 'hide', type: 'function', description: 'Hides the callout.' },
353
+ { name: 'requestUpdate', type: 'function', description: 'Refreshes callout geometry.' },
354
+ ],
355
+ slots: [
356
+ { name: 'default', description: 'Callout content.' },
357
+ ],
358
+ events: [],
359
+ themeAliases: [
360
+ '--sn-overlay-z-base',
361
+ '--sn-node-callout-z',
362
+ '--sn-node-callout-bg',
363
+ '--sn-node-callout-border',
364
+ '--sn-node-callout-color',
365
+ '--sn-node-callout-shadow',
366
+ '--sn-node-callout-radius',
367
+ '--sn-node-callout-padding',
368
+ '--sn-node-callout-max-width',
369
+ '--sn-node-callout-font-size',
370
+ '--sn-node-callout-font-weight',
371
+ '--sn-node-callout-line-height',
372
+ '--sn-node-callout-arrow-size',
373
+ ],
374
+ },
375
+ },
376
+ {
377
+ tagName: 'node-canvas',
378
+ className: 'NodeCanvas',
379
+ module: 'canvas/NodeCanvas/NodeCanvas.js',
380
+ category: 'canvas',
381
+ description: 'Primary graph canvas custom element.',
382
+ contract: {
383
+ status: 'draft',
384
+ schemaVersion: 'component-descriptor-v1',
385
+ dataSchema: 'schemas/graph-model-v1.json',
386
+ capabilities: ['node-editor-canvas', 'connections', 'frames', 'subgraphs', 'viewport', 'selection'],
387
+ attributes: [
388
+ { name: 'connection-engine', type: 'string', description: 'Connection renderer engine selection.' },
389
+ ],
390
+ properties: [
391
+ { name: 'zoom', type: 'number', description: 'Current canvas zoom.' },
392
+ { name: 'panX', type: 'number', description: 'Current horizontal pan.' },
393
+ { name: 'panY', type: 'number', description: 'Current vertical pan.' },
394
+ ],
395
+ methods: [
396
+ { name: 'setEditor', type: 'function', description: 'Connects a host-provided editor model to the canvas.' },
397
+ { name: 'setSnapGrid', type: 'function', description: 'Toggles snap grid and size.' },
398
+ { name: 'setReadonly', type: 'function', description: 'Toggles readonly interaction mode.' },
399
+ { name: 'setReadonlyNodeDragging', type: 'function', description: 'Allows node dragging while readonly editing stays disabled.' },
400
+ { name: 'setChrome', type: 'function', description: 'Toggles canvas chrome, menus, and viewport controls.' },
401
+ { name: 'setPanels', type: 'function', description: 'Toggles canvas side panels while preserving node menus.' },
402
+ { name: 'setViewportLocked', type: 'function', description: 'Locks pan and zoom while preserving rendering.' },
403
+ { name: 'setCompactMode', type: 'function', description: 'Toggles compact node rendering.' },
404
+ { name: 'setPathStyle', type: 'function', description: 'Sets connection path rendering style.' },
405
+ { name: 'setFlowLayout', type: 'function', description: 'Positions nodes in vertical or horizontal document flow and can enable native canvas scrolling.' },
406
+ { name: 'clearFlowLayout', type: 'function', description: 'Clears flow layout sizing and scroll mode.' },
407
+ { name: 'setNodePosition', type: 'function', description: 'Positions one node in canvas coordinates.' },
408
+ { name: 'getPositions', type: 'function', description: 'Returns node positions.' },
409
+ ],
410
+ events: [
411
+ { name: 'toolbar-action', description: 'Emits a toolbar action for a selected node.' },
412
+ { name: 'subgraph-enter', description: 'Emits when canvas enters a subgraph.', detail: [{ name: 'path', type: 'array' }] },
413
+ { name: 'subgraph-exit', description: 'Emits when canvas exits a subgraph.', detail: [{ name: 'path', type: 'array' }] },
414
+ { name: 'manualviewport', description: 'Emits after user-driven viewport changes.' },
415
+ ],
416
+ themeAliases: [
417
+ '--sn-bg',
418
+ '--sn-grid-dot',
419
+ '--sn-grid-size',
420
+ '--sn-conn-color',
421
+ '--sn-conn-selected',
422
+ '--sn-node-bg',
423
+ '--sn-node-border',
424
+ ],
425
+ },
426
+ },
427
+ {
428
+ tagName: 'canvas-graph',
429
+ className: 'CanvasGraph',
430
+ module: 'canvas/CanvasGraph/CanvasGraph.js',
431
+ category: 'canvas',
432
+ description: 'Generic hierarchical canvas graph renderer with force layout and selection events.',
433
+ contract: {
434
+ status: 'draft',
435
+ schemaVersion: 'component-descriptor-v1',
436
+ dataSchema: 'schemas/graph-model-v1.json',
437
+ capabilities: ['hierarchical-graph', 'force-layout', 'semantic-clusters', 'focus-selection', 'layout-snapshot'],
438
+ properties: [
439
+ { name: 'graphDB', type: 'object', description: 'Normalized graph store created from graph-model-v1 data.' },
440
+ { name: 'currentGroupId', type: 'string', description: 'Current drilled group id, or empty at root.' },
441
+ { name: 'activeNode', type: 'object', description: 'Currently focused graph node.' },
442
+ { name: 'renderMode', type: 'string', description: 'Graph rendering mode, such as dots or cards.' },
443
+ ],
444
+ methods: [
445
+ { name: 'setGraphModel', type: 'function', description: 'Loads normalized graph data into the canvas renderer.' },
446
+ { name: 'setPath', type: 'function', description: 'Navigates to a group path or semantic cluster path.' },
447
+ { name: 'flyToNode', type: 'function', description: 'Focuses a node by id and enters parent groups when needed.' },
448
+ { name: 'fitView', type: 'function', description: 'Fits the visible graph into the canvas viewport.' },
449
+ { name: 'resetView', type: 'function', description: 'Resets viewport pan and zoom.' },
450
+ { name: 'setLayoutSnapshot', type: 'function', description: 'Restores persisted graph node positions and viewport state.' },
451
+ { name: 'getLayoutSnapshot', type: 'function', description: 'Returns serializable node positions and viewport state.' },
452
+ ],
453
+ events: [
454
+ { name: 'file-selected', description: 'Emits when a leaf/file node is selected.', detail: [{ name: 'path', type: 'string' }] },
455
+ { name: 'group-selected', description: 'Emits when a group node is selected.', detail: [{ name: 'path', type: 'string' }] },
456
+ { name: 'node-deselected', description: 'Emits when focus is cleared.' },
457
+ { name: 'path-changed', description: 'Emits after drill path changes.', detail: [{ name: 'path', type: 'string' }] },
458
+ { name: 'layout-tick', description: 'Emits during force layout updates.' },
459
+ { name: 'layout-done', description: 'Emits when force layout settles.' },
460
+ { name: 'layout-snapshot', description: 'Emits a serializable layout snapshot after user layout changes.' },
461
+ { name: 'toolbar-action', description: 'Emits selected toolbar action for the active node.' },
462
+ ],
463
+ themeAliases: [
464
+ '--sn-bg',
465
+ '--sn-node-bg',
466
+ '--sn-node-border',
467
+ '--sn-node-selected',
468
+ '--sn-conn-color',
469
+ '--sn-cat-server',
470
+ '--sn-cat-data',
471
+ '--sn-effect-focus-ring',
472
+ ],
473
+ },
474
+ },
475
+ {
476
+ tagName: 'graph-explorer-shell',
477
+ className: 'GraphExplorerShell',
478
+ module: 'canvas/GraphExplorerShell/GraphExplorerShell.js',
479
+ category: 'canvas',
480
+ description: 'Generic graph explorer shell with toolbar, canvas, overlay, legend, and stats slots.',
481
+ contract: {
482
+ status: 'draft',
483
+ schemaVersion: 'component-descriptor-v1',
484
+ dataSchema: 'schemas/runtime-ui-v1.json',
485
+ capabilities: ['graph-toolbar', 'graph-slots', 'canvas-host', 'overlay-host', 'stats-host'],
486
+ properties: [
487
+ { name: 'title', type: 'string', description: 'Explorer title displayed by the host shell.' },
488
+ { name: 'mode', type: 'string', description: 'Current graph view mode supplied by the host adapter.' },
489
+ ],
490
+ slots: [
491
+ { name: 'toolbar', description: 'Toolbar controls for view, fit, layers, labels, and graph actions.' },
492
+ { name: 'canvas', description: 'Primary graph canvas component.' },
493
+ { name: 'overlay', description: 'Loading, empty, or transient overlay content.' },
494
+ { name: 'legend', description: 'Optional graph legend or semantic cluster panel.' },
495
+ { name: 'stats', description: 'Optional graph statistics and metadata summary.' },
496
+ ],
497
+ events: [
498
+ { name: 'graph-explorer-action', description: 'Host-level graph toolbar action request.' },
499
+ ],
500
+ themeAliases: [
501
+ '--sn-panel-bg',
502
+ '--sn-node-border',
503
+ '--sn-toolbar-bg',
504
+ '--sn-toolbar-border',
505
+ '--sn-toolbar-color',
506
+ '--sn-toolbar-hover',
507
+ ],
508
+ },
509
+ },
510
+ {
511
+ tagName: 'context-menu',
512
+ className: 'ContextMenu',
513
+ module: 'menu/ContextMenu/ContextMenu.js',
514
+ category: 'menu',
515
+ description: 'Generic context menu custom element for graph and canvas actions.',
516
+ contract: {
517
+ status: 'draft',
518
+ schemaVersion: 'component-descriptor-v1',
519
+ dataSchema: 'schemas/runtime-ui-v1.json',
520
+ capabilities: ['context-menu', 'positioned-overlay', 'action-list', 'backdrop-dismiss'],
521
+ properties: [
522
+ { name: 'items', type: 'array', description: 'Menu item descriptors with label and icon.' },
523
+ { name: 'visible', type: 'boolean', description: 'Menu visibility state.' },
524
+ ],
525
+ methods: [
526
+ { name: 'show', type: 'function', description: 'Shows the menu at screen coordinates with action descriptors.' },
527
+ { name: 'hide', type: 'function', description: 'Hides the menu and clears actions.' },
528
+ ],
529
+ events: [],
530
+ themeAliases: [
531
+ '--sn-overlay-z-base',
532
+ '--sn-ctx-bg',
533
+ '--sn-ctx-border',
534
+ '--sn-ctx-color',
535
+ '--sn-ctx-hover',
536
+ '--sn-ctx-z',
537
+ '--sn-shadow-color',
538
+ '--sn-font',
539
+ ],
540
+ },
541
+ },
542
+ {
543
+ tagName: 'ctx-item',
544
+ className: 'CtxItem',
545
+ module: 'menu/ContextMenu/ContextMenu.js',
546
+ category: 'menu',
547
+ description: 'Internal item used by context-menu.',
548
+ },
549
+ {
550
+ tagName: 'panel-layout',
551
+ className: 'Layout',
552
+ module: 'layout/Layout/Layout.js',
553
+ category: 'layout',
554
+ description: 'Panel-based application layout shell.',
555
+ contract: {
556
+ status: 'draft',
557
+ schemaVersion: 'component-descriptor-v1',
558
+ dataSchema: 'schemas/runtime-ui-v1.json',
559
+ capabilities: ['layout-tree', 'split-panels', 'panel-registry', 'local-storage'],
560
+ attributes: [
561
+ { name: 'storage-key', type: 'string', description: 'Optional key for persisted layout state.' },
562
+ { name: 'min-panel-size', type: 'number', description: 'Minimum panel size in pixels.' },
563
+ ],
564
+ properties: [
565
+ { name: 'layoutTree', type: 'object', description: 'Pure layout tree data rendered by layout-node children.' },
566
+ { name: 'panelTypes', type: 'object', description: 'Host-provided panel type descriptors keyed by panel type.' },
567
+ { name: 'panelChrome', type: 'boolean', description: 'Whether panel headers and split action zones are visible.' },
568
+ ],
569
+ methods: [
570
+ { name: 'registerPanelType', type: 'function', description: 'Registers a renderable panel type descriptor.' },
571
+ ],
572
+ events: [
573
+ { name: 'layout-change', description: 'Bubbles when the layout tree changes.' },
574
+ ],
575
+ themeAliases: [
576
+ '--sn-layout-bg',
577
+ '--sn-layout-gap-bg',
578
+ '--sn-layout-border',
579
+ '--sn-layout-resizer-size',
580
+ ],
581
+ },
582
+ },
583
+ {
584
+ tagName: 'layout-sidebar',
585
+ className: 'LayoutSidebar',
586
+ module: 'layout/LayoutSidebar/LayoutSidebar.js',
587
+ category: 'layout',
588
+ description: 'Sidebar navigation component for the panel layout.',
589
+ contract: {
590
+ status: 'draft',
591
+ schemaVersion: 'component-descriptor-v1',
592
+ dataSchema: 'schemas/runtime-ui-v1.json',
593
+ capabilities: ['sidebar-sections', 'panel-drag', 'collapse-state', 'local-storage'],
594
+ properties: [
595
+ { name: 'disabled', type: 'boolean', description: 'Disables and hides sidebar interactions.' },
596
+ { name: 'sections', type: 'array', description: 'Sidebar section descriptors with nested panel entries.' },
597
+ { name: 'activeSection', type: 'string', description: 'Active sidebar section id.' },
598
+ { name: 'disabledSections', type: 'array', description: 'Disabled section ids.' },
599
+ ],
600
+ methods: [
601
+ { name: 'setSections', type: 'function', description: 'Replaces sidebar section data.' },
602
+ { name: 'setActiveSection', type: 'function', description: 'Sets active section id.' },
603
+ { name: 'setDisabledSections', type: 'function', description: 'Sets disabled section ids.' },
604
+ { name: 'resetConfig', type: 'function', description: 'Clears persisted sidebar configuration.' },
605
+ ],
606
+ events: [
607
+ { name: 'panel-close', description: 'Requests closing a panel from the sidebar.' },
608
+ ],
609
+ themeAliases: [
610
+ '--sn-bg',
611
+ '--sn-node-border',
612
+ '--sn-node-selected',
613
+ '--sn-node-hover',
614
+ '--sn-text',
615
+ '--sn-text-dim',
616
+ ],
617
+ },
618
+ },
619
+ {
620
+ tagName: 'layout-node',
621
+ className: 'LayoutNode',
622
+ module: 'layout/LayoutNode/LayoutNode.js',
623
+ category: 'layout',
624
+ description: 'Resizable and dockable layout node component.',
625
+ contract: {
626
+ status: 'draft',
627
+ schemaVersion: 'component-descriptor-v1',
628
+ dataSchema: 'schemas/runtime-ui-v1.json',
629
+ capabilities: ['layout-branch', 'layout-panel', 'resize', 'collapse', 'fullscreen', 'panel-menu'],
630
+ attributes: [
631
+ { name: 'node-type', type: 'string', description: 'Layout node type: panel or split.' },
632
+ { name: 'direction', type: 'string', description: 'Split direction.' },
633
+ { name: 'panel-type', type: 'string', description: 'Host panel type for panel nodes.' },
634
+ ],
635
+ events: [
636
+ { name: 'layout-change', description: 'Emits after layout node structure changes.' },
637
+ { name: 'panel-collapse-toggle', description: 'Emits when a panel collapse state changes.' },
638
+ { name: 'panel-fullscreen', description: 'Requests fullscreen for a panel node.' },
639
+ { name: 'panel-type-menu', description: 'Requests opening panel type selection UI.' },
640
+ ],
641
+ themeAliases: [
642
+ '--sn-node-bg',
643
+ '--sn-node-border',
644
+ '--sn-node-header-bg',
645
+ '--sn-node-selected',
646
+ '--sn-text',
647
+ '--sn-text-dim',
648
+ '--sn-layout-gap-bg',
649
+ ],
650
+ },
651
+ },
652
+ {
653
+ tagName: 'cross-layout-portal-bridge',
654
+ className: 'CrossLayoutPortalBridge',
655
+ module: 'layout/CrossLayoutPortalBridge/CrossLayoutPortalBridge.js',
656
+ category: 'layout',
657
+ description: 'Viewport bridge component for connecting anchors across independent layouts.',
658
+ contract: {
659
+ status: 'draft',
660
+ schemaVersion: 'component-descriptor-v1',
661
+ dataSchema: 'schemas/runtime-ui-v1.json',
662
+ capabilities: ['portal-bridge', 'cross-layout-connection', 'viewport-tracking'],
663
+ attributes: [
664
+ { name: 'source-selector', type: 'string', description: 'CSS selector for the source anchor element.' },
665
+ { name: 'target-selector', type: 'string', description: 'CSS selector for the target anchor element.' },
666
+ { name: 'source-side', type: 'string', description: 'Source anchor side.' },
667
+ { name: 'target-side', type: 'string', description: 'Target anchor side.' },
668
+ { name: 'path-style', type: 'string', description: 'Bridge path style, such as bezier or pcb.' },
669
+ ],
670
+ methods: [
671
+ { name: 'requestUpdate', type: 'function', description: 'Schedules bridge geometry refresh.' },
672
+ ],
673
+ events: [],
674
+ themeAliases: [
675
+ '--sn-portal-bridge-z',
676
+ '--sn-portal-bridge-stroke',
677
+ '--sn-portal-bridge-width',
678
+ '--sn-portal-bridge-dash',
679
+ '--sn-portal-bridge-dot',
680
+ '--sn-portal-bridge-grid',
681
+ '--sn-portal-bridge-stub',
682
+ '--sn-portal-bridge-chamfer',
683
+ ],
684
+ },
685
+ },
686
+ {
687
+ tagName: 'action-zone',
688
+ className: 'ActionZone',
689
+ module: 'layout/ActionZone/ActionZone.js',
690
+ category: 'layout',
691
+ description: 'Internal split and join gesture control used by layout-node.',
692
+ },
693
+ {
694
+ tagName: 'layout-preview',
695
+ className: 'LayoutPreview',
696
+ module: 'layout/LayoutPreview/LayoutPreview.js',
697
+ category: 'layout',
698
+ description: 'Internal split and join preview overlay used by panel-layout.',
699
+ },
700
+ {
701
+ tagName: 'panel-menu',
702
+ className: 'PanelMenu',
703
+ module: 'layout/PanelMenu/PanelMenu.js',
704
+ category: 'layout',
705
+ description: 'Internal panel type menu used by panel-layout.',
706
+ },
707
+ {
708
+ tagName: 'project-tabs',
709
+ className: 'ProjectTabs',
710
+ module: 'layout/ProjectTabs/ProjectTabs.js',
711
+ category: 'layout',
712
+ description: 'Generic project/workspace tab strip with add, select, and close events.',
713
+ contract: {
714
+ status: 'draft',
715
+ schemaVersion: 'component-descriptor-v1',
716
+ dataSchema: 'schemas/runtime-ui-v1.json',
717
+ capabilities: ['tab-list', 'select', 'close', 'create'],
718
+ properties: [
719
+ { name: 'tabs', type: 'array', description: 'Array of tab descriptors with id, name, color, icon, and closeable fields.' },
720
+ { name: 'activeId', type: 'string', description: 'Active tab id.' },
721
+ { name: 'homeIcon', type: 'string', description: 'Material Symbols icon for the home tab.' },
722
+ { name: 'homeLabel', type: 'string', description: 'Accessible home tab label.' },
723
+ { name: 'addTitle', type: 'string', description: 'Accessible add button title.' },
724
+ ],
725
+ methods: [
726
+ { name: 'setTabs', type: 'function', description: 'Replaces tab data and active tab id.' },
727
+ ],
728
+ events: [
729
+ { name: 'project-tabs-home', description: 'Requests navigation to the home surface.' },
730
+ { name: 'project-tabs-add', description: 'Requests creation or opening of a tab.' },
731
+ {
732
+ name: 'project-tabs-select',
733
+ description: 'Requests tab selection.',
734
+ detail: [{ name: 'id', type: 'string', required: true }],
735
+ },
736
+ {
737
+ name: 'project-tabs-close',
738
+ description: 'Requests tab close.',
739
+ detail: [{ name: 'id', type: 'string', required: true }],
740
+ },
741
+ ],
742
+ themeAliases: [
743
+ '--sn-tabs-height',
744
+ '--sn-tabs-bg',
745
+ '--sn-tabs-active-bg',
746
+ '--sn-tabs-border',
747
+ '--sn-tabs-radius',
748
+ ],
749
+ },
750
+ },
751
+ {
752
+ tagName: 'project-tab-item',
753
+ className: 'ProjectTabItem',
754
+ module: 'layout/ProjectTabs/ProjectTabs.js',
755
+ category: 'layout',
756
+ description: 'Internal tab item used by project-tabs.',
757
+ },
758
+ {
759
+ tagName: 'code-block',
760
+ className: 'CodeBlock',
761
+ module: 'display/CodeBlock/CodeBlock.js',
762
+ category: 'display',
763
+ description: 'Code, markdown, image, and diagnostics display component.',
764
+ contract: {
765
+ status: 'draft',
766
+ schemaVersion: 'component-descriptor-v1',
767
+ dataSchema: 'schemas/runtime-ui-v1.json',
768
+ capabilities: ['syntax-highlight', 'markdown-render', 'image-render', 'line-gutter', 'diagnostics'],
769
+ attributes: [
770
+ { name: 'image-api-base', type: 'string', description: 'Optional base URL for resolving image preview sources.' },
771
+ ],
772
+ properties: [
773
+ { name: 'code', type: 'string', description: 'Source, markdown text, or image path.' },
774
+ { name: 'lang', type: 'string', description: 'Language mode.' },
775
+ { name: 'isMarkdown', type: 'boolean', description: 'Whether markdown rendering is active.' },
776
+ { name: 'isImage', type: 'boolean', description: 'Whether image rendering is active.' },
777
+ ],
778
+ methods: [
779
+ { name: 'setContent', type: 'function', description: 'Sets source content, language mode, and optional render bases.' },
780
+ { name: 'setBasePath', type: 'function', description: 'Sets base path for rendered markdown links.' },
781
+ { name: 'setImageApiBase', type: 'function', description: 'Sets image API base URL.' },
782
+ { name: 'scrollToLine', type: 'function', description: 'Scrolls the code viewport to a line.' },
783
+ { name: 'setDiagnostics', type: 'function', description: 'Sets diagnostic squiggle data.' },
784
+ { name: 'clearDiagnostics', type: 'function', description: 'Clears diagnostic squiggles.' },
785
+ ],
786
+ events: [],
787
+ themeAliases: [
788
+ '--sn-bg',
789
+ '--sn-text',
790
+ '--sn-text-dim',
791
+ '--sn-node-border',
792
+ '--sn-cat-server',
793
+ '--sn-warning-color',
794
+ '--sn-syntax-keyword',
795
+ '--sn-syntax-string',
796
+ '--sn-syntax-comment',
797
+ '--sn-syntax-function',
798
+ '--sn-syntax-property',
799
+ '--sn-diagnostic-error-bg',
800
+ '--sn-diagnostic-warning-bg',
801
+ ],
802
+ },
803
+ },
804
+ {
805
+ tagName: 'cb-squiggle',
806
+ className: 'CbSquiggle',
807
+ module: 'display/CodeBlock/CodeBlock.js',
808
+ category: 'display',
809
+ description: 'Internal diagnostic squiggle marker used by code-block.',
810
+ },
811
+ {
812
+ tagName: 'source-viewer',
813
+ className: 'SourceViewer',
814
+ module: 'display/SourceViewer/SourceViewer.js',
815
+ category: 'display',
816
+ description: 'Source file viewer with code, markdown, image, metadata, actions, and transform modes.',
817
+ contract: {
818
+ status: 'draft',
819
+ schemaVersion: 'component-descriptor-v1',
820
+ dataSchema: 'schemas/runtime-ui-v1.json',
821
+ capabilities: ['source-code', 'markdown-preview', 'image-preview', 'diagnostics', 'transform-toggle'],
822
+ attributes: [
823
+ { name: 'image-api-base', type: 'string', description: 'Optional base URL for resolving image preview sources.' },
824
+ ],
825
+ properties: [
826
+ { name: 'filename', type: 'string', description: 'Current file name or empty-state label.' },
827
+ { name: 'hasFile', type: 'boolean', description: 'Whether a file is currently displayed.' },
828
+ { name: 'viewMode', type: 'string', description: 'Current display mode: source, rendered, or transformed.' },
829
+ ],
830
+ methods: [
831
+ { name: 'showFile', type: 'function', description: 'Displays a source file from pure path, language, code, and optional transform data.' },
832
+ { name: 'showDirectory', type: 'function', description: 'Displays normalized directory text.' },
833
+ { name: 'showImage', type: 'function', description: 'Displays an image path through the nested code-block renderer.' },
834
+ { name: 'showError', type: 'function', description: 'Displays an error state.' },
835
+ { name: 'scrollToLine', type: 'function', description: 'Scrolls nested code-block to a line.' },
836
+ { name: 'setDiagnostics', type: 'function', description: 'Passes diagnostics to nested code-block.' },
837
+ ],
838
+ events: [
839
+ {
840
+ name: 'source-viewer-show-graph',
841
+ description: 'Requests graph focus for the current source path.',
842
+ detail: [{ name: 'path', type: 'string' }],
843
+ },
844
+ {
845
+ name: 'source-viewer-toggle-mode',
846
+ description: 'Fires after the viewer switches source/rendered/transformed mode.',
847
+ detail: [
848
+ { name: 'path', type: 'string' },
849
+ { name: 'mode', type: 'string' },
850
+ ],
851
+ },
852
+ ],
853
+ themeAliases: [
854
+ '--sn-source-bg',
855
+ '--sn-source-header-bg',
856
+ '--sn-source-border',
857
+ '--sn-source-toolbar-gap',
858
+ '--sn-source-action-icon-size',
859
+ ],
860
+ },
861
+ },
862
+ {
863
+ tagName: 'source-editor',
864
+ className: 'SourceEditor',
865
+ module: 'display/SourceEditor/SourceEditor.js',
866
+ category: 'display',
867
+ description: 'Generic source text editor with content, dirty state, readonly, disabled, focus, and tab handling.',
868
+ contract: {
869
+ status: 'draft',
870
+ schemaVersion: 'component-descriptor-v1',
871
+ dataSchema: 'schemas/runtime-ui-v1.json',
872
+ capabilities: ['source-editing', 'dirty-state', 'keyboard-tab-indent'],
873
+ properties: [
874
+ { name: 'value', type: 'string', description: 'Editor content.' },
875
+ { name: 'language', type: 'string', description: 'Language label reflected to data-language.' },
876
+ { name: 'placeholder', type: 'string', description: 'Textarea placeholder.' },
877
+ { name: 'ariaLabel', type: 'string', description: 'Accessible editor label.' },
878
+ { name: 'readonly', type: 'boolean', description: 'Readonly editor state.' },
879
+ { name: 'disabled', type: 'boolean', description: 'Disabled editor state.' },
880
+ { name: 'dirty', type: 'boolean', description: 'Whether content differs from host baseline.' },
881
+ ],
882
+ methods: [
883
+ { name: 'getContent', type: 'function', description: 'Returns current editor text.' },
884
+ { name: 'setContent', type: 'function', description: 'Sets editor text and optional dirty state.' },
885
+ { name: 'setEditable', type: 'function', description: 'Toggles disabled state from an editable flag.' },
886
+ { name: 'setLanguage', type: 'function', description: 'Sets language metadata.' },
887
+ { name: 'setDirty', type: 'function', description: 'Sets dirty state.' },
888
+ { name: 'focus', type: 'function', description: 'Focuses the textarea.' },
889
+ { name: 'select', type: 'function', description: 'Selects textarea content.' },
890
+ ],
891
+ events: [
892
+ {
893
+ name: 'source-editor-input',
894
+ description: 'Emits after text changes.',
895
+ detail: [
896
+ { name: 'value', type: 'string', required: true },
897
+ { name: 'dirty', type: 'boolean', required: true },
898
+ { name: 'language', type: 'string', required: true },
899
+ ],
900
+ },
901
+ ],
902
+ themeAliases: [
903
+ '--sn-source-editor-bg',
904
+ '--sn-source-editor-color',
905
+ '--sn-source-editor-padding',
906
+ '--sn-source-editor-font-size',
907
+ '--sn-editor-bg',
908
+ '--sn-editor-text',
909
+ '--sn-editor-border',
910
+ '--sn-editor-radius',
911
+ '--sn-editor-font',
912
+ ],
913
+ },
914
+ },
915
+ {
916
+ tagName: 'sn-loading-overlay',
917
+ className: 'LoadingOverlay',
918
+ module: 'display/LoadingOverlay/LoadingOverlay.js',
919
+ category: 'display',
920
+ description: 'Generic loading overlay with label, phase, progress, and secondary status text.',
921
+ contract: {
922
+ status: 'draft',
923
+ schemaVersion: 'component-descriptor-v1',
924
+ dataSchema: 'schemas/runtime-ui-v1.json',
925
+ capabilities: ['loading-state', 'progress', 'hide-transition'],
926
+ properties: [
927
+ { name: 'label', type: 'string', description: 'Primary loading label.' },
928
+ { name: 'pct', type: 'number', description: 'Progress percentage from 0 to 100.' },
929
+ { name: 'phase', type: 'string', description: 'Current loading phase.' },
930
+ { name: 'sub', type: 'string', description: 'Secondary loading text.' },
931
+ { name: 'isHidden', type: 'boolean', description: 'Hidden transition state.' },
932
+ ],
933
+ methods: [
934
+ { name: 'show', type: 'function', description: 'Shows the overlay.' },
935
+ { name: 'hide', type: 'function', description: 'Hides the overlay and optionally calls completion after transition.' },
936
+ { name: 'setProgress', type: 'function', description: 'Sets clamped progress, phase, and secondary text.' },
937
+ ],
938
+ events: [],
939
+ themeAliases: [
940
+ '--sn-loading-bg',
941
+ '--sn-loading-text',
942
+ '--sn-loading-accent',
943
+ '--sn-loading-radius',
944
+ ],
945
+ },
946
+ },
947
+ {
948
+ tagName: 'output-list-preview',
949
+ className: 'OutputListPreview',
950
+ module: 'display/OutputListPreview/OutputListPreview.js',
951
+ category: 'display',
952
+ description: 'Generic normalized list preview for arbitrary output values.',
953
+ contract: {
954
+ status: 'draft',
955
+ schemaVersion: 'component-descriptor-v1',
956
+ dataSchema: 'schemas/runtime-ui-v1.json',
957
+ capabilities: ['normalized-output-list', 'scalar-to-item', 'record-to-items', 'truncation', 'empty-state'],
958
+ properties: [
959
+ { name: 'title', type: 'string', description: 'Preview title.' },
960
+ { name: 'countText', type: 'string', description: 'Visible and total item count text.' },
961
+ { name: 'emptyText', type: 'string', description: 'Empty state text.' },
962
+ { name: 'isEmpty', type: 'boolean', description: 'Whether the normalized list has visible items.' },
963
+ { name: 'isTruncated', type: 'boolean', description: 'Whether output was truncated by the preview limit.' },
964
+ { name: 'showHeader', type: 'boolean', description: 'Whether header metadata is visible.' },
965
+ ],
966
+ methods: [
967
+ { name: 'setValue', type: 'function', description: 'Normalizes and renders arbitrary output value data.' },
968
+ { name: 'setItems', type: 'function', description: 'Alias for setting list-like output values.' },
969
+ { name: 'setData', type: 'function', description: 'Renders pre-normalized list preview data.' },
970
+ { name: 'getData', type: 'function', description: 'Returns current normalized list preview data.' },
971
+ ],
972
+ events: [],
973
+ themeAliases: [
974
+ '--sn-text',
975
+ '--sn-text-dim',
976
+ '--sn-font-ui',
977
+ '--sn-font-mono',
978
+ '--sn-node-bg',
979
+ '--sn-node-border',
980
+ ],
981
+ },
982
+ },
983
+ {
984
+ tagName: 'output-graph-preview',
985
+ className: 'OutputGraphPreview',
986
+ module: 'display/OutputGraphPreview/OutputGraphPreview.js',
987
+ category: 'display',
988
+ description: 'Generic normalized graph preview for node and edge output values.',
989
+ contract: {
990
+ status: 'draft',
991
+ schemaVersion: 'component-descriptor-v1',
992
+ dataSchema: 'schemas/runtime-ui-v1.json',
993
+ capabilities: ['normalized-preview-graph', 'node-edge-preview', 'connection-normalization', 'truncation', 'empty-state'],
994
+ properties: [
995
+ { name: 'title', type: 'string', description: 'Preview title.' },
996
+ { name: 'countText', type: 'string', description: 'Visible node and edge count text.' },
997
+ { name: 'emptyText', type: 'string', description: 'Empty state text.' },
998
+ { name: 'isEmpty', type: 'boolean', description: 'Whether the normalized graph has visible nodes.' },
999
+ { name: 'isTruncated', type: 'boolean', description: 'Whether graph output was truncated by preview limits.' },
1000
+ { name: 'showHeader', type: 'boolean', description: 'Whether header metadata is visible.' },
1001
+ ],
1002
+ methods: [
1003
+ { name: 'setValue', type: 'function', description: 'Normalizes and renders arbitrary graph-like output data.' },
1004
+ { name: 'setGraph', type: 'function', description: 'Alias for setting graph-like output data.' },
1005
+ { name: 'setData', type: 'function', description: 'Renders pre-normalized graph preview data.' },
1006
+ { name: 'getData', type: 'function', description: 'Returns current normalized graph preview data.' },
1007
+ ],
1008
+ events: [],
1009
+ themeAliases: [
1010
+ '--sn-text',
1011
+ '--sn-text-dim',
1012
+ '--sn-font-ui',
1013
+ '--sn-font-mono',
1014
+ '--sn-node-bg',
1015
+ '--sn-node-border',
1016
+ '--sn-node-hover',
1017
+ ],
1018
+ },
1019
+ },
1020
+ {
1021
+ tagName: 'sn-status-ribbon',
1022
+ className: 'StatusRibbon',
1023
+ module: 'display/StatusRibbon/StatusRibbon.js',
1024
+ category: 'display',
1025
+ description: 'Floating notification ribbon that auto-fades and displays active status.',
1026
+ contract: {
1027
+ status: 'draft',
1028
+ schemaVersion: 'component-descriptor-v1',
1029
+ dataSchema: 'schemas/runtime-ui-v1.json',
1030
+ capabilities: ['status', 'ribbon', 'auto-fade', 'themeable'],
1031
+ attributes: [
1032
+ { name: 'status-event', type: 'string', description: 'Event name for status changes.' },
1033
+ { name: 'state-event', type: 'string', description: 'Event name for state changes.' },
1034
+ { name: 'fade-timeout', type: 'number', description: 'Auto-fade duration in milliseconds.' },
1035
+ ],
1036
+ properties: [
1037
+ { name: 'eventTarget', type: 'object', description: 'Target object to listen for events on.' },
1038
+ ],
1039
+ events: [],
1040
+ themeAliases: [
1041
+ '--sn-bg-overlay',
1042
+ '--sn-shadow-lg',
1043
+ '--sn-accent-glow',
1044
+ '--sn-font-ui',
1045
+ '--sn-text',
1046
+ '--sn-text-dim',
1047
+ ],
1048
+ },
1049
+ },
1050
+ {
1051
+ tagName: 'cell-bg',
1052
+ className: 'CellBg',
1053
+ module: 'effects/CellBg/CellBg.js',
1054
+ category: 'effects',
1055
+ description: 'Animated cellular automaton background effect.',
1056
+ contract: {
1057
+ status: 'draft',
1058
+ schemaVersion: 'component-descriptor-v1',
1059
+ dataSchema: 'schemas/runtime-ui-v1.json',
1060
+ capabilities: ['animated-background', 'canvas-effect', 'pulse', 'resize-aware', 'reduced-motion-friendly'],
1061
+ properties: [
1062
+ { name: 'active', type: 'boolean', description: 'Persistent animation state.' },
1063
+ ],
1064
+ methods: [
1065
+ { name: 'toggle', type: 'function', description: 'Starts or stops persistent background animation.' },
1066
+ { name: 'pulse', type: 'function', description: 'Runs a timed animation pulse.' },
1067
+ { name: 'resize', type: 'function', description: 'Resizes the canvas to its host bounds.' },
1068
+ ],
1069
+ events: [],
1070
+ themeAliases: [
1071
+ '--sn-bg',
1072
+ ],
1073
+ },
1074
+ },
1075
+ {
1076
+ tagName: 'quick-toolbar',
1077
+ className: 'QuickToolbar',
1078
+ module: 'toolbar/QuickToolbar/QuickToolbar.js',
1079
+ category: 'toolbar',
1080
+ description: 'Floating quick action toolbar for graph editing.',
1081
+ contract: {
1082
+ status: 'draft',
1083
+ schemaVersion: 'component-descriptor-v1',
1084
+ dataSchema: 'schemas/graph-model-v1.json',
1085
+ capabilities: ['floating-toolbar', 'node-actions', 'position-follow', 'action-callback'],
1086
+ properties: [
1087
+ { name: 'items', type: 'array', description: 'Toolbar action descriptors.' },
1088
+ { name: 'visible', type: 'boolean', description: 'Toolbar visibility state.' },
1089
+ { name: 'hasTitle', type: 'boolean', description: 'Whether the active node title row is visible.' },
1090
+ { name: 'nodeTitle', type: 'string', description: 'Active node title shown for nodes without their own visible header.' },
1091
+ ],
1092
+ methods: [
1093
+ { name: 'show', type: 'function', description: 'Shows toolbar for a node element.' },
1094
+ { name: 'hide', type: 'function', description: 'Hides toolbar and clears active node.' },
1095
+ { name: 'scheduleHide', type: 'function', description: 'Defers hover-triggered hiding while pointer focus may move into the toolbar.' },
1096
+ { name: 'cancelHide', type: 'function', description: 'Cancels a pending hover-triggered hide.' },
1097
+ { name: 'updatePosition', type: 'function', description: 'Repositions toolbar above the active node.' },
1098
+ ],
1099
+ events: [],
1100
+ themeAliases: [
1101
+ '--sn-overlay-z-base',
1102
+ '--sn-toolbar-bg',
1103
+ '--sn-toolbar-border',
1104
+ '--sn-toolbar-color',
1105
+ '--sn-toolbar-hover',
1106
+ '--sn-toolbar-occlusion-bg',
1107
+ '--sn-toolbar-active',
1108
+ '--sn-toolbar-danger',
1109
+ '--sn-toolbar-danger-color',
1110
+ '--sn-toolbar-z',
1111
+ '--sn-toolbar-title-color',
1112
+ '--sn-toolbar-title-font-size',
1113
+ '--sn-toolbar-title-font-weight',
1114
+ '--sn-toolbar-title-line-height',
1115
+ '--sn-toolbar-title-min-width',
1116
+ '--sn-toolbar-title-max-width',
1117
+ '--sn-toolbar-title-lines',
1118
+ '--sn-shadow-color',
1119
+ '--sn-cat-data',
1120
+ ],
1121
+ },
1122
+ },
1123
+ {
1124
+ tagName: 'inspector-panel',
1125
+ className: 'InspectorPanel',
1126
+ module: 'inspector/InspectorPanel/InspectorPanel.js',
1127
+ category: 'inspector',
1128
+ description: 'Inspector panel for selected graph node properties.',
1129
+ contract: {
1130
+ status: 'draft',
1131
+ schemaVersion: 'component-descriptor-v1',
1132
+ dataSchema: 'schemas/graph-model-v1.json',
1133
+ capabilities: ['node-inspector', 'port-summary', 'control-editing', 'subgraph-enter', 'fire-action', 'resizable-panel'],
1134
+ properties: [
1135
+ { name: 'visible', type: 'boolean', description: 'Inspector visibility state.' },
1136
+ { name: 'nodeLabel', type: 'string', description: 'Selected node label.' },
1137
+ { name: 'nodeType', type: 'string', description: 'Selected node type.' },
1138
+ { name: 'nodeCategory', type: 'string', description: 'Selected node category.' },
1139
+ { name: 'nodeId', type: 'string', description: 'Selected node id.' },
1140
+ { name: 'inputsList', type: 'array', description: 'Selected node input port descriptors.' },
1141
+ { name: 'outputsList', type: 'array', description: 'Selected node output port descriptors.' },
1142
+ { name: 'controlsList', type: 'array', description: 'Selected node control descriptors.' },
1143
+ { name: 'hasSelection', type: 'boolean', description: 'Whether a node is selected.' },
1144
+ ],
1145
+ methods: [
1146
+ { name: 'inspect', type: 'function', description: 'Renders inspector state for a node-like object.' },
1147
+ { name: 'clear', type: 'function', description: 'Clears selected node state.' },
1148
+ ],
1149
+ events: [
1150
+ { name: 'node-fire', description: 'Requests firing the selected node.', detail: [{ name: 'nodeId', type: 'string' }] },
1151
+ { name: 'ctrl-change', description: 'Reports edited control values.', detail: [{ name: 'key', type: 'string' }, { name: 'value', type: 'any' }] },
1152
+ ],
1153
+ themeAliases: [
1154
+ '--sn-node-bg',
1155
+ '--sn-node-border',
1156
+ '--sn-node-selected',
1157
+ '--sn-font',
1158
+ '--sn-text',
1159
+ '--sn-text-dim',
1160
+ '--sn-cat-server',
1161
+ '--sn-subgraph-accent',
1162
+ '--sn-success-color',
1163
+ ],
1164
+ },
1165
+ },
1166
+ {
1167
+ tagName: 'insp-port-item',
1168
+ className: 'InspPortItem',
1169
+ module: 'inspector/InspectorPanel/InspectorPanel.js',
1170
+ category: 'inspector',
1171
+ description: 'Internal port inspector item used by inspector-panel.',
1172
+ },
1173
+ {
1174
+ tagName: 'insp-ctrl-item',
1175
+ className: 'InspCtrlItem',
1176
+ module: 'inspector/InspectorPanel/InspectorPanel.js',
1177
+ category: 'inspector',
1178
+ description: 'Internal control inspector item used by inspector-panel.',
1179
+ },
1180
+ {
1181
+ tagName: 'template-preview',
1182
+ className: 'TemplatePreview',
1183
+ module: 'inspector/TemplatePreview/TemplatePreview.js',
1184
+ category: 'inspector',
1185
+ description: 'Internal template preview used by inspector-panel.',
1186
+ },
1187
+ {
1188
+ tagName: 'palette-browser',
1189
+ className: 'PaletteBrowser',
1190
+ module: 'palette/PaletteBrowser/PaletteBrowser.js',
1191
+ category: 'palette',
1192
+ description: 'Node palette browser for adding graph nodes.',
1193
+ contract: {
1194
+ status: 'draft',
1195
+ schemaVersion: 'component-descriptor-v1',
1196
+ dataSchema: 'schemas/graph-model-v1.json',
1197
+ capabilities: ['node-palette', 'category-list', 'search-filter', 'factory-select'],
1198
+ properties: [
1199
+ { name: 'categories', type: 'array', description: 'Rendered palette category descriptors.' },
1200
+ ],
1201
+ methods: [
1202
+ { name: 'setCategories', type: 'function', description: 'Sets palette categories and item factories.' },
1203
+ { name: 'onSelect', type: 'function', description: 'Sets host callback for palette item selection.' },
1204
+ ],
1205
+ events: [],
1206
+ themeAliases: [
1207
+ '--sn-ctx-bg',
1208
+ '--sn-ctx-hover',
1209
+ '--sn-node-border',
1210
+ '--sn-node-selected',
1211
+ '--sn-font',
1212
+ '--sn-text',
1213
+ '--sn-text-dim',
1214
+ ],
1215
+ },
1216
+ },
1217
+ {
1218
+ tagName: 'pal-item',
1219
+ className: 'PalItem',
1220
+ module: 'palette/PaletteBrowser/PaletteBrowser.js',
1221
+ category: 'palette',
1222
+ description: 'Internal palette item used by palette-browser.',
1223
+ },
1224
+ {
1225
+ tagName: 'pal-category',
1226
+ className: 'PalCategory',
1227
+ module: 'palette/PaletteBrowser/PaletteBrowser.js',
1228
+ category: 'palette',
1229
+ description: 'Internal palette category used by palette-browser.',
1230
+ },
1231
+ {
1232
+ tagName: 'node-minimap',
1233
+ className: 'Minimap',
1234
+ module: 'canvas/Minimap/Minimap.js',
1235
+ category: 'canvas',
1236
+ description: 'Canvas minimap for graph navigation.',
1237
+ contract: {
1238
+ status: 'draft',
1239
+ schemaVersion: 'component-descriptor-v1',
1240
+ dataSchema: 'schemas/graph-model-v1.json',
1241
+ capabilities: ['graph-minimap', 'viewport-overview', 'drag-navigation', 'state-getter'],
1242
+ properties: [
1243
+ { name: 'visible', type: 'boolean', description: 'Minimap visibility state.' },
1244
+ ],
1245
+ methods: [
1246
+ { name: 'setStateGetter', type: 'function', description: 'Sets host callback returning nodes, transform, and container size.' },
1247
+ ],
1248
+ events: [
1249
+ {
1250
+ name: 'minimap-navigate',
1251
+ description: 'Requests canvas pan after minimap interaction.',
1252
+ detail: [
1253
+ { name: 'x', type: 'number' },
1254
+ { name: 'y', type: 'number' },
1255
+ ],
1256
+ },
1257
+ ],
1258
+ themeAliases: [
1259
+ '--sn-node-bg',
1260
+ '--sn-node-border',
1261
+ '--sn-node-selected',
1262
+ '--sn-shadow-color',
1263
+ '--sn-text',
1264
+ '--sn-text-dim',
1265
+ ],
1266
+ },
1267
+ },
1268
+ {
1269
+ tagName: 'node-search',
1270
+ className: 'NodeSearch',
1271
+ module: 'canvas/NodeSearch/NodeSearch.js',
1272
+ category: 'canvas',
1273
+ description: 'Search component for graph nodes and actions.',
1274
+ contract: {
1275
+ status: 'draft',
1276
+ schemaVersion: 'component-descriptor-v1',
1277
+ dataSchema: 'schemas/graph-model-v1.json',
1278
+ capabilities: ['node-search', 'query-filter', 'keyboard-dismiss', 'focus-callback'],
1279
+ properties: [
1280
+ { name: 'query', type: 'string', description: 'Current search query.' },
1281
+ { name: 'results', type: 'array', description: 'Matched node result descriptors.' },
1282
+ { name: 'isOpen', type: 'boolean', description: 'Search panel visibility state.' },
1283
+ ],
1284
+ methods: [
1285
+ { name: 'configure', type: 'function', description: 'Sets host callbacks for node lookup and result selection.' },
1286
+ { name: 'open', type: 'function', description: 'Opens and focuses the search panel.' },
1287
+ { name: 'close', type: 'function', description: 'Closes search and clears query/results.' },
1288
+ { name: 'toggle', type: 'function', description: 'Toggles search visibility.' },
1289
+ ],
1290
+ events: [],
1291
+ themeAliases: [
1292
+ '--sn-font',
1293
+ '--sn-node-bg',
1294
+ '--sn-node-border',
1295
+ '--sn-shadow-color',
1296
+ '--sn-text',
1297
+ '--sn-text-dim',
1298
+ ],
1299
+ },
1300
+ },
1301
+ {
1302
+ tagName: 'search-result-item',
1303
+ className: 'SearchResultItem',
1304
+ module: 'canvas/NodeSearch/NodeSearch.js',
1305
+ category: 'canvas',
1306
+ description: 'Internal result item used by node-search.',
1307
+ },
1308
+ {
1309
+ tagName: 'graph-tabs',
1310
+ className: 'GraphTabs',
1311
+ module: 'canvas/GraphTabs/GraphTabs.js',
1312
+ category: 'canvas',
1313
+ description: 'Tab strip component for multiple graph views.',
1314
+ contract: {
1315
+ status: 'draft',
1316
+ schemaVersion: 'component-descriptor-v1',
1317
+ dataSchema: 'schemas/runtime-ui-v1.json',
1318
+ capabilities: ['graph-tab-strip', 'add-tab', 'switch-tab', 'close-tab', 'tab-state'],
1319
+ properties: [
1320
+ { name: 'tabItems', type: 'array', description: 'Rendered graph tab descriptors.' },
1321
+ { name: 'activeTab', type: 'string', readonly: true, description: 'Active tab id.' },
1322
+ { name: 'tabs', type: 'array', readonly: true, description: 'Current tab descriptors.' },
1323
+ ],
1324
+ methods: [
1325
+ { name: 'setCallbacks', type: 'function', description: 'Sets host callbacks for switch, add, and close.' },
1326
+ { name: 'addTab', type: 'function', description: 'Adds and activates a tab.' },
1327
+ { name: 'switchTo', type: 'function', description: 'Activates a tab by id.' },
1328
+ { name: 'removeTab', type: 'function', description: 'Removes a tab by id.' },
1329
+ { name: 'setTabState', type: 'function', description: 'Stores host tab state.' },
1330
+ { name: 'getTabState', type: 'function', description: 'Returns stored host tab state.' },
1331
+ ],
1332
+ events: [],
1333
+ themeAliases: [
1334
+ '--sn-ctx-bg',
1335
+ '--sn-node-bg',
1336
+ '--sn-node-border',
1337
+ '--sn-node-selected',
1338
+ '--sn-font',
1339
+ '--sn-text',
1340
+ '--sn-text-dim',
1341
+ ],
1342
+ },
1343
+ },
1344
+ {
1345
+ tagName: 'tab-item',
1346
+ className: 'TabItem',
1347
+ module: 'canvas/GraphTabs/GraphTabs.js',
1348
+ category: 'canvas',
1349
+ description: 'Internal tab item used by graph-tabs.',
1350
+ },
1351
+ {
1352
+ tagName: 'graph-breadcrumb',
1353
+ className: 'Breadcrumb',
1354
+ module: 'canvas/Breadcrumb/Breadcrumb.js',
1355
+ category: 'canvas',
1356
+ description: 'Breadcrumb component for graph and subgraph navigation.',
1357
+ contract: {
1358
+ status: 'draft',
1359
+ schemaVersion: 'component-descriptor-v1',
1360
+ dataSchema: 'schemas/graph-model-v1.json',
1361
+ capabilities: ['graph-breadcrumb', 'path-render', 'level-navigation', 'auto-hide-root'],
1362
+ properties: [
1363
+ { name: 'crumbs', type: 'array', description: 'Rendered breadcrumb segment descriptors.' },
1364
+ { name: 'isVisible', type: 'boolean', description: 'Breadcrumb visibility state.' },
1365
+ ],
1366
+ methods: [
1367
+ { name: 'onNavigate', type: 'function', description: 'Sets host callback for breadcrumb level selection.' },
1368
+ { name: 'setPath', type: 'function', description: 'Renders graph path segments and hides at root.' },
1369
+ ],
1370
+ events: [],
1371
+ themeAliases: [
1372
+ '--sn-ctx-bg',
1373
+ '--sn-ctx-hover',
1374
+ '--sn-node-border',
1375
+ '--sn-shadow-color',
1376
+ '--sn-font',
1377
+ '--sn-text',
1378
+ '--sn-text-dim',
1379
+ ],
1380
+ },
1381
+ },
1382
+ {
1383
+ tagName: 'breadcrumb-item',
1384
+ className: 'BreadcrumbItem',
1385
+ module: 'canvas/Breadcrumb/Breadcrumb.js',
1386
+ category: 'canvas',
1387
+ description: 'Internal breadcrumb item used by graph-breadcrumb.',
1388
+ },
1389
+ {
1390
+ tagName: 'quick-open',
1391
+ className: 'QuickOpen',
1392
+ module: 'navigation/QuickOpen/QuickOpen.js',
1393
+ category: 'navigation',
1394
+ description: 'Generic fuzzy quick-open dialog for selecting files or application items.',
1395
+ contract: {
1396
+ status: 'draft',
1397
+ schemaVersion: 'component-descriptor-v1',
1398
+ dataSchema: 'schemas/runtime-ui-v1.json',
1399
+ capabilities: ['fuzzy-search', 'keyboard-navigation', 'modal-overlay', 'item-select'],
1400
+ properties: [
1401
+ { name: 'visible', type: 'boolean', description: 'Dialog visibility.' },
1402
+ { name: 'query', type: 'string', description: 'Current search query.' },
1403
+ { name: 'placeholder', type: 'string', description: 'Input placeholder.' },
1404
+ { name: 'emptyText', type: 'string', description: 'No-results text.' },
1405
+ { name: 'maxResults', type: 'number', description: 'Maximum rendered results.' },
1406
+ ],
1407
+ methods: [
1408
+ { name: 'setItems', type: 'function', description: 'Sets normalized quick-open items.' },
1409
+ { name: 'setFiles', type: 'function', description: 'Sets file-like quick-open items.' },
1410
+ { name: 'open', type: 'function', description: 'Opens the dialog.' },
1411
+ { name: 'close', type: 'function', description: 'Closes the dialog.' },
1412
+ { name: 'toggle', type: 'function', description: 'Toggles dialog visibility.' },
1413
+ ],
1414
+ events: [
1415
+ { name: 'quick-open-select', description: 'Emits selected item data.' },
1416
+ ],
1417
+ themeAliases: [
1418
+ '--sn-bg-overlay',
1419
+ '--sn-panel-bg',
1420
+ '--sn-node-border',
1421
+ '--sn-node-hover',
1422
+ '--sn-text',
1423
+ '--sn-text-dim',
1424
+ ],
1425
+ },
1426
+ },
1427
+ {
1428
+ tagName: 'chat-message-item',
1429
+ className: 'ChatMessageItem',
1430
+ module: 'chat/ChatMessageItem/ChatMessageItem.js',
1431
+ category: 'chat',
1432
+ description: 'Generic chat message renderer for text, tool, board, and thinking messages.',
1433
+ contract: {
1434
+ status: 'draft',
1435
+ schemaVersion: 'component-descriptor-v1',
1436
+ dataSchema: 'schemas/runtime-ui-v1.json',
1437
+ capabilities: ['chat-message-render', 'markdown-text', 'tool-card', 'status-board', 'thinking-state', 'copy-action'],
1438
+ properties: [
1439
+ { name: 'type', type: 'string', description: 'Message item type.' },
1440
+ { name: 'role', type: 'string', description: 'Message role used for rendering branch selection.' },
1441
+ { name: 'text', type: 'string', description: 'Markdown-capable message text.' },
1442
+ { name: 'isStreaming', type: 'boolean', description: 'Whether the message is currently streaming.' },
1443
+ { name: 'isLatestTool', type: 'boolean', description: 'Whether the latest tool card should render open.' },
1444
+ { name: 'name', type: 'string', description: 'Tool or message name.' },
1445
+ { name: 'input', type: 'object', description: 'Tool input payload.' },
1446
+ { name: 'result', type: 'object', description: 'Tool result payload.' },
1447
+ { name: 'done', type: 'boolean', description: 'Whether a thinking message is complete.' },
1448
+ { name: 'elapsedText', type: 'string', description: 'Human-readable elapsed time.' },
1449
+ { name: 'status', type: 'string', description: 'Thinking or task status text.' },
1450
+ { name: 'metaHtml', type: 'string', description: 'Trusted host-generated metadata markup.' },
1451
+ { name: 'workSummaryHtml', type: 'string', description: 'Trusted host-generated completed work summary markup.' },
1452
+ { name: 'copyText', type: 'string', description: 'Plain text copied by the host wrapper.' },
1453
+ { name: 'cardItems', type: 'array', description: 'Status card descriptors rendered inside board messages.' },
1454
+ ],
1455
+ events: [],
1456
+ themeAliases: [
1457
+ '--sn-bg',
1458
+ '--sn-text',
1459
+ '--sn-text-dim',
1460
+ '--sn-font-mono',
1461
+ '--sn-node-bg',
1462
+ '--sn-node-border',
1463
+ '--sn-node-hover',
1464
+ '--sn-node-selected',
1465
+ '--sn-accent-bg',
1466
+ '--sn-accent-bg-subtle',
1467
+ '--sn-success-color',
1468
+ '--sn-danger-color',
1469
+ ],
1470
+ },
1471
+ },
1472
+ {
1473
+ tagName: 'chat-transcript',
1474
+ className: 'ChatTranscript',
1475
+ module: 'chat/ChatTranscript/ChatTranscript.js',
1476
+ category: 'chat',
1477
+ description: 'Generic chat transcript shell with message rendering, scroll controls, live status, and status card events.',
1478
+ contract: {
1479
+ status: 'draft',
1480
+ schemaVersion: 'component-descriptor-v1',
1481
+ dataSchema: 'schemas/runtime-ui-v1.json',
1482
+ capabilities: ['chat-transcript', 'message-list', 'scroll-state', 'status-card-events'],
1483
+ properties: [
1484
+ { name: 'messageItems', type: 'array', description: 'Normalized message item descriptors rendered by chat-message-item.' },
1485
+ ],
1486
+ methods: [
1487
+ { name: 'setMessageItems', type: 'function', description: 'Replaces transcript messages from pure data.' },
1488
+ { name: 'scrollToBottom', type: 'function', description: 'Scrolls the message container to the bottom.' },
1489
+ { name: 'getScrollState', type: 'function', description: 'Returns overflow and bottom-position state.' },
1490
+ { name: 'renderLiveStatus', type: 'function', description: 'Renders host-provided live status metadata.' },
1491
+ { name: 'findStatusBoard', type: 'function', description: 'Finds a rendered status board by card ids.' },
1492
+ { name: 'updateStatusCard', type: 'function', description: 'Updates a status card by host-owned id.' },
1493
+ ],
1494
+ events: [
1495
+ { name: 'chat-transcript-scroll', description: 'Emits current scroll state.', detail: [{ name: 'isAtBottom', type: 'boolean' }] },
1496
+ { name: 'chat-transcript-scroll-bottom', description: 'Emits after scroll-to-bottom is requested.' },
1497
+ { name: 'status-card-open', description: 'Requests opening a linked status card target.' },
1498
+ { name: 'message-copy', description: 'Reports copy result for message text.' },
1499
+ ],
1500
+ themeAliases: [
1501
+ '--sn-chat-bg',
1502
+ '--sn-chat-message-bg',
1503
+ '--sn-chat-user-message-bg',
1504
+ '--sn-chat-agent-message-bg',
1505
+ '--sn-chat-message-radius',
1506
+ '--sn-chat-gap',
1507
+ ],
1508
+ },
1509
+ },
1510
+ {
1511
+ tagName: 'chat-composer',
1512
+ className: 'ChatComposer',
1513
+ module: 'chat/ChatComposer/ChatComposer.js',
1514
+ category: 'chat',
1515
+ description: 'Generic chat composer with input, context chips, footer controls, and autocomplete host.',
1516
+ contract: {
1517
+ status: 'draft',
1518
+ schemaVersion: 'component-descriptor-v1',
1519
+ dataSchema: 'schemas/runtime-ui-v1.json',
1520
+ capabilities: ['chat-input', 'context-chips', 'footer-controls', 'autocomplete-host', 'drag-drop-context'],
1521
+ properties: [
1522
+ { name: 'value', type: 'string', description: 'Current input value.' },
1523
+ { name: 'disabled', type: 'boolean', description: 'Disables the textarea.' },
1524
+ { name: 'placeholder', type: 'string', description: 'Textarea placeholder.' },
1525
+ { name: 'attachedContext', type: 'array', description: 'Context chip descriptors.' },
1526
+ { name: 'footerHtml', type: 'string', description: 'Trusted footer controls HTML owned by the host adapter.' },
1527
+ { name: 'isSending', type: 'boolean', description: 'Switches send button into stop state.' },
1528
+ ],
1529
+ methods: [
1530
+ { name: 'setValue', type: 'function', description: 'Sets input value.' },
1531
+ { name: 'setAttachedContext', type: 'function', description: 'Sets context chip descriptors.' },
1532
+ { name: 'setFooterHtml', type: 'function', description: 'Sets trusted footer controls HTML.' },
1533
+ { name: 'setDisabled', type: 'function', description: 'Sets disabled state.' },
1534
+ { name: 'setSending', type: 'function', description: 'Sets sending state.' },
1535
+ ],
1536
+ events: [
1537
+ { name: 'chat-composer-input', description: 'Emits input value and caret position.' },
1538
+ { name: 'chat-composer-submit', description: 'Requests submit from Enter.' },
1539
+ { name: 'chat-composer-send', description: 'Requests send or stop from the send button.' },
1540
+ { name: 'chat-composer-key', description: 'Passes navigation/autocomplete keys to the host.' },
1541
+ { name: 'chat-composer-param-change', description: 'Emits footer control value changes.' },
1542
+ { name: 'chat-composer-context-remove', description: 'Requests context chip removal.' },
1543
+ { name: 'chat-composer-context-drop', description: 'Requests dropped context attachment.' },
1544
+ ],
1545
+ themeAliases: [
1546
+ '--sn-composer-bg',
1547
+ '--sn-composer-border',
1548
+ '--sn-composer-radius',
1549
+ '--sn-composer-control-gap',
1550
+ '--sn-composer-send-hover-bg',
1551
+ '--sn-composer-footer-icon-size',
1552
+ '--sn-composer-footer-toggle-icon-size',
1553
+ '--sn-composer-input-min-height',
1554
+ ],
1555
+ },
1556
+ },
1557
+ {
1558
+ tagName: 'chat-list',
1559
+ className: 'ChatList',
1560
+ module: 'chat/ChatList/ChatList.js',
1561
+ category: 'chat',
1562
+ description: 'Generic chat list shell with filters, creation action, item list, and selection/delete events.',
1563
+ contract: {
1564
+ status: 'draft',
1565
+ schemaVersion: 'component-descriptor-v1',
1566
+ dataSchema: 'schemas/runtime-ui-v1.json',
1567
+ capabilities: ['chat-list', 'filter-tabs', 'create-action', 'select', 'delete'],
1568
+ properties: [
1569
+ { name: 'chatItems', type: 'array', description: 'Chat item descriptors rendered as chat-list-item children.' },
1570
+ { name: 'filter', type: 'string', description: 'Active filter id.' },
1571
+ { name: 'title', type: 'string', description: 'List heading.' },
1572
+ { name: 'newLabel', type: 'string', description: 'Create button label.' },
1573
+ { name: 'emptyMessage', type: 'string', description: 'Empty state message.' },
1574
+ ],
1575
+ methods: [
1576
+ { name: 'setItems', type: 'function', description: 'Replaces chat item descriptors.' },
1577
+ { name: 'setEmptyMessage', type: 'function', description: 'Sets empty state text.' },
1578
+ { name: 'setFilter', type: 'function', description: 'Sets active filter and emits filter event.' },
1579
+ ],
1580
+ events: [
1581
+ { name: 'chat-list-new', description: 'Requests a new chat.' },
1582
+ { name: 'chat-list-select', description: 'Emits selected chat id and item.' },
1583
+ { name: 'chat-list-delete', description: 'Requests chat deletion.' },
1584
+ { name: 'chat-list-filter', description: 'Emits active filter changes.' },
1585
+ ],
1586
+ themeAliases: [
1587
+ '--sn-node-bg',
1588
+ '--sn-node-border',
1589
+ '--sn-node-hover',
1590
+ '--sn-node-selected',
1591
+ '--sn-text',
1592
+ '--sn-text-dim',
1593
+ ],
1594
+ },
1595
+ },
1596
+ {
1597
+ tagName: 'chat-list-item',
1598
+ className: 'ChatListItem',
1599
+ module: 'chat/ChatListItem/ChatListItem.js',
1600
+ category: 'chat',
1601
+ description: 'Generic chat list item with project badge, adapter, preview, metadata, nesting, and delete action.',
1602
+ contract: {
1603
+ status: 'draft',
1604
+ schemaVersion: 'component-descriptor-v1',
1605
+ dataSchema: 'schemas/runtime-ui-v1.json',
1606
+ capabilities: ['chat-list-row', 'active-state', 'nested-depth', 'delete-action', 'metadata'],
1607
+ properties: [
1608
+ { name: 'id', type: 'string', description: 'Chat id.' },
1609
+ { name: 'name', type: 'string', description: 'Chat display name.' },
1610
+ { name: 'project', type: 'string', description: 'Project label.' },
1611
+ { name: 'adapter', type: 'string', description: 'Provider adapter label.' },
1612
+ { name: 'status', type: 'string', description: 'Chat status label.' },
1613
+ { name: 'lastMessage', type: 'string', description: 'Preview text.' },
1614
+ { name: 'depth', type: 'number', description: 'Nested visual depth.' },
1615
+ { name: 'isActive', type: 'boolean', description: 'Active row state.' },
1616
+ ],
1617
+ events: [],
1618
+ themeAliases: [
1619
+ '--sn-node-bg',
1620
+ '--sn-node-border',
1621
+ '--sn-node-hover',
1622
+ '--sn-node-selected',
1623
+ '--sn-text',
1624
+ '--sn-text-dim',
1625
+ '--sn-danger-color',
1626
+ ],
1627
+ },
1628
+ },
1629
+ {
1630
+ tagName: 'chat-sidebar-shell',
1631
+ className: 'ChatSidebarShell',
1632
+ module: 'chat/ChatSidebar/ChatSidebar.js',
1633
+ category: 'chat',
1634
+ description: 'Generic collapsible and resizable chat navigation shell.',
1635
+ contract: {
1636
+ status: 'draft',
1637
+ schemaVersion: 'component-descriptor-v1',
1638
+ dataSchema: 'schemas/runtime-ui-v1.json',
1639
+ capabilities: ['chat-sidebar', 'collapse', 'resize', 'nested-chat-list', 'responsive-auto-collapse'],
1640
+ properties: [
1641
+ { name: 'chats', type: 'array', description: 'Nested chat descriptors.' },
1642
+ { name: 'navCollapsed', type: 'boolean', description: 'Collapsed navigation state.' },
1643
+ { name: 'navWidth', type: 'number', description: 'Expanded navigation width.' },
1644
+ { name: 'groupDividers', type: 'boolean', description: 'Whether grouped root chat rows render project dividers.' },
1645
+ ],
1646
+ methods: [
1647
+ { name: 'setChats', type: 'function', description: 'Replaces nested chat descriptors.' },
1648
+ { name: 'setCollapsed', type: 'function', description: 'Sets collapsed state.' },
1649
+ { name: 'setWidth', type: 'function', description: 'Sets clamped navigation width.' },
1650
+ { name: 'setGroupDividers', type: 'function', description: 'Toggles grouped root chat dividers.' },
1651
+ ],
1652
+ events: [
1653
+ { name: 'chat-sidebar-new', description: 'Requests creating a chat.' },
1654
+ { name: 'chat-sidebar-select', description: 'Emits selected chat id.' },
1655
+ { name: 'chat-sidebar-delete', description: 'Requests chat deletion.' },
1656
+ { name: 'chat-sidebar-toggle', description: 'Emits child expansion changes.' },
1657
+ { name: 'chat-sidebar-collapse-change', description: 'Emits collapsed state changes.' },
1658
+ { name: 'chat-sidebar-width-change', description: 'Emits width changes.' },
1659
+ ],
1660
+ themeAliases: [
1661
+ '--sn-node-bg',
1662
+ '--sn-node-hover',
1663
+ '--sn-text',
1664
+ '--sn-text-dim',
1665
+ ],
1666
+ },
1667
+ },
1668
+ {
1669
+ tagName: 'chat-sidebar-item',
1670
+ className: 'ChatSidebarItem',
1671
+ module: 'chat/ChatSidebarItem/ChatSidebarItem.js',
1672
+ category: 'chat',
1673
+ description: 'Generic chat sidebar root item with nested child chat rendering.',
1674
+ contract: {
1675
+ status: 'draft',
1676
+ schemaVersion: 'component-descriptor-v1',
1677
+ dataSchema: 'schemas/runtime-ui-v1.json',
1678
+ capabilities: ['chat-sidebar-row', 'nested-children', 'active-state', 'delete-action', 'status-slot'],
1679
+ properties: [
1680
+ { name: 'id', type: 'string', description: 'Chat id.' },
1681
+ { name: 'cleanName', type: 'string', description: 'Rendered chat name.' },
1682
+ { name: 'adapter', type: 'string', description: 'Provider adapter label.' },
1683
+ { name: 'agentColor', type: 'string', description: 'Optional row icon accent color.' },
1684
+ { name: 'statusKind', type: 'string', description: 'Status visual kind: running, done, or error.' },
1685
+ { name: 'statusIcon', type: 'string', description: 'Material Symbols status icon name.' },
1686
+ { name: 'statusTitle', type: 'string', description: 'Accessible status tooltip text.' },
1687
+ { name: 'subChats', type: 'array', description: 'Child chat descriptors.' },
1688
+ { name: 'isExpanded', type: 'boolean', description: 'Child list expanded state.' },
1689
+ { name: 'isActive', type: 'boolean', description: 'Active row state.' },
1690
+ ],
1691
+ events: [
1692
+ { name: 'chat-sidebar-select', description: 'Emits selected chat id and item data.' },
1693
+ { name: 'chat-sidebar-toggle', description: 'Emits child expansion changes.' },
1694
+ { name: 'chat-sidebar-delete', description: 'Requests deletion.' },
1695
+ ],
1696
+ themeAliases: [
1697
+ '--sn-node-bg',
1698
+ '--sn-node-hover',
1699
+ '--sn-text',
1700
+ '--sn-text-dim',
1701
+ '--sn-cat-server',
1702
+ '--sn-danger-color',
1703
+ ],
1704
+ },
1705
+ },
1706
+ {
1707
+ tagName: 'chat-sidebar-sub-item',
1708
+ className: 'ChatSidebarSubItem',
1709
+ module: 'chat/ChatSidebarItem/ChatSidebarItem.js',
1710
+ category: 'chat',
1711
+ description: 'Generic chat sidebar child item.',
1712
+ contract: {
1713
+ status: 'draft',
1714
+ schemaVersion: 'component-descriptor-v1',
1715
+ dataSchema: 'schemas/runtime-ui-v1.json',
1716
+ capabilities: ['chat-sidebar-child-row', 'active-state', 'delete-action', 'status-slot'],
1717
+ properties: [
1718
+ { name: 'id', type: 'string', description: 'Child chat id.' },
1719
+ { name: 'cleanName', type: 'string', description: 'Rendered child chat name.' },
1720
+ { name: 'adapter', type: 'string', description: 'Provider adapter label.' },
1721
+ { name: 'agentType', type: 'string', description: 'Child agent type label.' },
1722
+ { name: 'agentColor', type: 'string', description: 'Optional row icon accent color.' },
1723
+ { name: 'statusKind', type: 'string', description: 'Status visual kind: running, done, or error.' },
1724
+ { name: 'statusIcon', type: 'string', description: 'Material Symbols status icon name.' },
1725
+ { name: 'statusTitle', type: 'string', description: 'Accessible status tooltip text.' },
1726
+ { name: 'isActive', type: 'boolean', description: 'Active row state.' },
1727
+ ],
1728
+ events: [
1729
+ { name: 'chat-sidebar-select', description: 'Emits selected child chat id and item data.' },
1730
+ { name: 'chat-sidebar-delete', description: 'Requests child chat deletion.' },
1731
+ ],
1732
+ themeAliases: [
1733
+ '--sn-node-bg',
1734
+ '--sn-node-hover',
1735
+ '--sn-text',
1736
+ '--sn-text-dim',
1737
+ '--sn-font-mono',
1738
+ '--sn-cat-server',
1739
+ '--sn-danger-color',
1740
+ ],
1741
+ },
1742
+ },
1743
+ {
1744
+ tagName: 'sidebar-section',
1745
+ className: 'SidebarSection',
1746
+ module: 'layout/LayoutSidebar/SidebarSection.js',
1747
+ category: 'layout',
1748
+ description: 'Internal section item used by layout-sidebar.',
1749
+ },
1750
+ {
1751
+ tagName: 'sidebar-sub-item',
1752
+ className: 'SidebarSubItem',
1753
+ module: 'layout/LayoutSidebar/SidebarSection.js',
1754
+ category: 'layout',
1755
+ description: 'Internal sidebar child item used by layout-sidebar.',
1756
+ },
1757
+ {
1758
+ tagName: 'sn-list-item',
1759
+ className: 'ListItem',
1760
+ module: 'list/ListItem/ListItem.js',
1761
+ category: 'list',
1762
+ description: 'Generic selectable list item with label, description, icon, meta text, and item payload event.',
1763
+ contract: {
1764
+ status: 'draft',
1765
+ schemaVersion: 'component-descriptor-v1',
1766
+ dataSchema: 'schemas/runtime-ui-v1.json',
1767
+ capabilities: ['selectable-list-item', 'keyboard-select', 'payload-event'],
1768
+ properties: [
1769
+ { name: 'label', type: 'string', description: 'Primary row text.' },
1770
+ { name: 'description', type: 'string', description: 'Secondary row text.' },
1771
+ { name: 'icon', type: 'string', description: 'Optional Material Symbols icon name.' },
1772
+ { name: 'meta', type: 'string', description: 'Trailing metadata text.' },
1773
+ { name: 'active', type: 'boolean', description: 'Active row state reflected to host attribute.' },
1774
+ { name: 'disabled', type: 'boolean', description: 'Disabled row state reflected to host attribute.' },
1775
+ { name: 'item', type: 'object', description: 'Host-owned payload emitted on select.' },
1776
+ ],
1777
+ methods: [
1778
+ { name: 'setItem', type: 'function', description: 'Sets payload and row display properties from one item descriptor.' },
1779
+ ],
1780
+ events: [
1781
+ {
1782
+ name: 'sn-list-item-select',
1783
+ description: 'Emits selected payload unless the row is disabled.',
1784
+ detail: [{ name: 'item', type: 'object' }],
1785
+ },
1786
+ ],
1787
+ themeAliases: [
1788
+ '--sn-list-item-bg',
1789
+ '--sn-list-item-hover-bg',
1790
+ '--sn-list-item-active-bg',
1791
+ '--sn-list-item-radius',
1792
+ '--sn-list-item-gap',
1793
+ ],
1794
+ },
1795
+ },
1796
+ {
1797
+ tagName: 'sn-list-detail-shell',
1798
+ className: 'ListDetailShell',
1799
+ module: 'list/ListDetailShell/ListDetailShell.js',
1800
+ category: 'list',
1801
+ description: 'Generic two-pane list and detail shell with host-owned content slots.',
1802
+ contract: {
1803
+ status: 'draft',
1804
+ schemaVersion: 'component-descriptor-v1',
1805
+ dataSchema: 'schemas/runtime-ui-v1.json',
1806
+ capabilities: ['list-detail-layout', 'slot-composition', 'responsive-stack', 'theme-aliases'],
1807
+ attributes: [
1808
+ { name: 'sidebar-title', type: 'string', description: 'Sidebar header title.' },
1809
+ { name: 'sidebar-icon', type: 'string', description: 'Optional sidebar Material Symbols icon name.' },
1810
+ { name: 'detail-title', type: 'string', description: 'Detail header title.' },
1811
+ { name: 'detail-icon', type: 'string', description: 'Optional detail Material Symbols icon name.' },
1812
+ { name: 'detail-description', type: 'string', description: 'Optional detail header description.' },
1813
+ { name: 'detail-mode', type: 'string', description: 'Detail density mode, such as compact.' },
1814
+ { name: 'has-detail', type: 'boolean', description: 'Shows detail content and hides the detail empty state.' },
1815
+ ],
1816
+ properties: [
1817
+ { name: 'sidebarTitle', type: 'string', description: 'Sidebar header title.' },
1818
+ { name: 'sidebarIcon', type: 'string', description: 'Optional sidebar icon name.' },
1819
+ { name: 'detailTitle', type: 'string', description: 'Detail header title.' },
1820
+ { name: 'detailIcon', type: 'string', description: 'Optional detail icon name.' },
1821
+ { name: 'detailDescription', type: 'string', description: 'Optional detail header description.' },
1822
+ { name: 'detailMode', type: 'string', description: 'Detail density mode.' },
1823
+ { name: 'hasDetail', type: 'boolean', description: 'Detail availability reflected by the has-detail attribute.' },
1824
+ ],
1825
+ slots: [
1826
+ { name: 'list-header', description: 'Optional host-owned sidebar header content.' },
1827
+ { name: 'sidebar-actions', description: 'Optional commands aligned in the sidebar header.' },
1828
+ { name: 'list', description: 'Host-owned list content.' },
1829
+ { name: 'list-empty', description: 'Host-owned list empty state.' },
1830
+ { name: 'detail-header', description: 'Optional host-owned detail header content.' },
1831
+ { name: 'detail-actions', description: 'Optional commands aligned in the detail header.' },
1832
+ { name: 'detail', description: 'Host-owned detail content.' },
1833
+ { name: 'detail-empty', description: 'Host-owned detail empty state.' },
1834
+ ],
1835
+ events: [],
1836
+ themeAliases: [
1837
+ '--sn-list-detail-bg',
1838
+ '--sn-list-detail-border',
1839
+ '--sn-list-detail-radius',
1840
+ '--sn-list-detail-sidebar-width',
1841
+ '--sn-list-detail-sidebar-bg',
1842
+ '--sn-list-detail-main-bg',
1843
+ '--sn-list-detail-header-bg',
1844
+ '--sn-list-detail-header-padding',
1845
+ '--sn-list-detail-main-padding',
1846
+ '--sn-list-detail-title-size',
1847
+ '--sn-list-detail-title-color',
1848
+ ],
1849
+ },
1850
+ },
1851
+ {
1852
+ tagName: 'sn-tree-view',
1853
+ className: 'TreeView',
1854
+ module: 'tree/TreeView/TreeView.js',
1855
+ category: 'tree',
1856
+ description: 'Generic tree view with selection, expansion, filtering, drag payloads, and host-owned item data.',
1857
+ contract: {
1858
+ status: 'draft',
1859
+ schemaVersion: 'component-descriptor-v1',
1860
+ dataSchema: 'schemas/runtime-ui-v1.json',
1861
+ capabilities: ['tree-data', 'select', 'expand-collapse', 'filter', 'drag-payload', 'local-storage'],
1862
+ properties: [
1863
+ { name: 'items', type: 'array', description: 'Tree item descriptors with id/path, label, icon, badges, children, and payload fields.' },
1864
+ { name: 'selectedId', type: 'string', description: 'Selected item id or path.' },
1865
+ { name: 'expandedIds', type: 'array', description: 'Expanded item ids.' },
1866
+ { name: 'defaultExpandedIds', type: 'array', description: 'Initial expanded ids when storage has no value.' },
1867
+ { name: 'filterText', type: 'string', description: 'Filter text matched against item labels and metadata.' },
1868
+ { name: 'storageKey', type: 'string', description: 'Optional localStorage key for expanded state.' },
1869
+ { name: 'toggleBranchesOnSelect', type: 'boolean', description: 'Toggles branch rows when selected.' },
1870
+ ],
1871
+ methods: [
1872
+ { name: 'setItems', type: 'function', description: 'Replaces tree data.' },
1873
+ { name: 'collapseAll', type: 'function', description: 'Collapses all branches.' },
1874
+ { name: 'expandAncestors', type: 'function', description: 'Expands ancestors for an id or path.' },
1875
+ { name: 'scrollSelectedIntoView', type: 'function', description: 'Scrolls selected row into view.' },
1876
+ ],
1877
+ events: [
1878
+ {
1879
+ name: 'sn-tree-select',
1880
+ description: 'Emits the selected item descriptor.',
1881
+ detail: [{ name: 'item', type: 'object', required: true }],
1882
+ },
1883
+ {
1884
+ name: 'sn-tree-dragstart',
1885
+ description: 'Emits drag item and payload metadata.',
1886
+ detail: [
1887
+ { name: 'item', type: 'object', required: true },
1888
+ { name: 'payload', type: 'any' },
1889
+ ],
1890
+ },
1891
+ ],
1892
+ themeAliases: [
1893
+ '--sn-tree-row-height',
1894
+ '--sn-tree-indent',
1895
+ '--sn-tree-icon-size',
1896
+ '--sn-tree-row-radius',
1897
+ '--sn-tree-row-selected-bg',
1898
+ ],
1899
+ },
1900
+ },
1901
+ {
1902
+ tagName: 'sn-tree-panel',
1903
+ className: 'TreePanel',
1904
+ module: 'tree/TreePanel/TreePanel.js',
1905
+ category: 'tree',
1906
+ description: 'Generic tree panel with filter input, collapse action, placeholder state, and an embedded tree view.',
1907
+ contract: {
1908
+ status: 'draft',
1909
+ schemaVersion: 'component-descriptor-v1',
1910
+ dataSchema: 'schemas/runtime-ui-v1.json',
1911
+ capabilities: ['tree-data', 'tree-panel-chrome', 'filter', 'expand-collapse', 'placeholder', 'local-storage'],
1912
+ attributes: [
1913
+ { name: 'title', type: 'string', description: 'Optional panel heading text.' },
1914
+ { name: 'title-icon', type: 'string', description: 'Optional Material Symbols icon name shown before the title.' },
1915
+ { name: 'placeholder', type: 'string', description: 'Placeholder text shown before tree data is available.' },
1916
+ { name: 'filter-placeholder', type: 'string', description: 'Search input placeholder.' },
1917
+ { name: 'collapse-title', type: 'string', description: 'Accessible title for the collapse-all action.' },
1918
+ ],
1919
+ properties: [
1920
+ { name: 'items', type: 'array', description: 'Tree item descriptors forwarded to the embedded tree view.' },
1921
+ { name: 'selectedId', type: 'string', description: 'Selected item id or path.' },
1922
+ { name: 'expandedIds', type: 'array', description: 'Expanded item ids.' },
1923
+ { name: 'defaultExpandedIds', type: 'array', description: 'Initial expanded ids when storage has no value.' },
1924
+ { name: 'filterText', type: 'string', description: 'Filter text mirrored to the input and embedded tree view.' },
1925
+ { name: 'storageKey', type: 'string', description: 'Optional localStorage key for expanded state.' },
1926
+ { name: 'toggleBranchesOnSelect', type: 'boolean', description: 'Toggles branch rows when selected.' },
1927
+ ],
1928
+ methods: [
1929
+ { name: 'setItems', type: 'function', description: 'Replaces tree data.' },
1930
+ { name: 'collapseAll', type: 'function', description: 'Collapses all branches.' },
1931
+ { name: 'expandAncestors', type: 'function', description: 'Expands ancestors for an id or path.' },
1932
+ { name: 'scrollSelectedIntoView', type: 'function', description: 'Scrolls selected row into view.' },
1933
+ { name: 'showPlaceholder', type: 'function', description: 'Shows placeholder text and hides the embedded tree.' },
1934
+ { name: 'showTree', type: 'function', description: 'Shows the embedded tree and hides the placeholder.' },
1935
+ ],
1936
+ events: [
1937
+ {
1938
+ name: 'sn-tree-select',
1939
+ description: 'Bubbles selected item events from the embedded tree view.',
1940
+ detail: [{ name: 'item', type: 'object', required: true }],
1941
+ },
1942
+ {
1943
+ name: 'sn-tree-dragstart',
1944
+ description: 'Bubbles drag item and payload metadata from the embedded tree view.',
1945
+ detail: [
1946
+ { name: 'item', type: 'object', required: true },
1947
+ { name: 'payload', type: 'any' },
1948
+ ],
1949
+ },
1950
+ {
1951
+ name: 'sn-tree-toggle',
1952
+ description: 'Bubbles branch toggle events from the embedded tree view.',
1953
+ detail: [{ name: 'item', type: 'object' }],
1954
+ },
1955
+ {
1956
+ name: 'sn-tree-panel-filter',
1957
+ description: 'Emits when the panel filter input changes.',
1958
+ detail: [{ name: 'filterText', type: 'string' }],
1959
+ },
1960
+ {
1961
+ name: 'sn-tree-panel-collapse',
1962
+ description: 'Emits after the panel collapse-all action is requested.',
1963
+ },
1964
+ ],
1965
+ themeAliases: [
1966
+ '--sn-tree-panel-font-size',
1967
+ '--sn-tree-panel-toolbar-gap',
1968
+ '--sn-tree-panel-toolbar-padding',
1969
+ '--sn-tree-panel-row-min-height',
1970
+ '--sn-tree-panel-label-weight',
1971
+ '--sn-tree-row-selected-bg',
1972
+ ],
1973
+ },
1974
+ },
1975
+ {
1976
+ tagName: 'sn-button',
1977
+ className: 'ActionButton',
1978
+ module: 'control/Button/Button.js',
1979
+ category: 'control',
1980
+ description: 'Generic themeable action control for buttons, icon buttons, and command rows.',
1981
+ contract: {
1982
+ status: 'draft',
1983
+ schemaVersion: 'component-descriptor-v1',
1984
+ dataSchema: 'schemas/runtime-ui-v1.json',
1985
+ capabilities: ['control', 'button', 'slots', 'keyboard-activation', 'themeable'],
1986
+ attributes: [
1987
+ { name: 'variant', type: 'string', description: 'Control variant: default, primary, danger, or icon.' },
1988
+ { name: 'disabled', type: 'boolean', description: 'Disables pointer and keyboard activation.' },
1989
+ ],
1990
+ slots: [
1991
+ { name: 'default', description: 'Button label and optional icon content.' },
1992
+ ],
1993
+ events: [
1994
+ { name: 'click', description: 'Native click event emitted by pointer or keyboard activation.' },
1995
+ ],
1996
+ themeAliases: [
1997
+ '--sn-button-bg',
1998
+ '--sn-button-color',
1999
+ '--sn-button-border',
2000
+ '--sn-button-padding',
2001
+ '--sn-button-radius',
2002
+ '--sn-button-gap',
2003
+ '--sn-button-min-height',
2004
+ '--sn-button-font-size',
2005
+ '--sn-button-font-weight',
2006
+ '--sn-button-line-height',
2007
+ '--sn-button-hover-bg',
2008
+ '--sn-button-hover-border',
2009
+ '--sn-button-disabled-opacity',
2010
+ '--sn-button-primary-bg',
2011
+ '--sn-button-primary-border',
2012
+ '--sn-button-primary-color',
2013
+ '--sn-button-primary-hover-filter',
2014
+ '--sn-button-danger-bg',
2015
+ '--sn-button-danger-border',
2016
+ '--sn-button-danger-color',
2017
+ '--sn-button-danger-hover-bg',
2018
+ '--sn-button-danger-hover-border',
2019
+ '--sn-button-danger-hover-color',
2020
+ '--sn-button-icon-size',
2021
+ '--sn-button-icon-font-size',
2022
+ '--sn-button-focus-ring',
2023
+ ],
2024
+ },
2025
+ },
2026
+ {
2027
+ tagName: 'sn-field',
2028
+ className: 'FormField',
2029
+ module: 'control/Field/Field.js',
2030
+ category: 'control',
2031
+ description: 'Themeable form field wrapper for native inputs, selects, textareas, labels, and hints.',
2032
+ contract: {
2033
+ status: 'draft',
2034
+ schemaVersion: 'component-descriptor-v1',
2035
+ dataSchema: 'schemas/runtime-ui-v1.json',
2036
+ capabilities: ['form-field', 'native-controls', 'slots', 'themeable'],
2037
+ attributes: [
2038
+ { name: 'variant', type: 'string', description: 'Field density/layout variant: default, compact, or inline.' },
2039
+ ],
2040
+ slots: [
2041
+ { name: 'default', description: 'Native input, select, textarea, label, and optional hint content.' },
2042
+ { name: 'label', description: 'Optional explicit label slot when the label is not a direct child.' },
2043
+ { name: 'hint', description: 'Optional helper text rendered under the control.' },
2044
+ ],
2045
+ events: [],
2046
+ themeAliases: [
2047
+ '--sn-field-margin-block-end',
2048
+ '--sn-field-label-margin-block-end',
2049
+ '--sn-field-label-color',
2050
+ '--sn-field-label-size',
2051
+ '--sn-field-label-weight',
2052
+ '--sn-field-label-line-height',
2053
+ '--sn-field-label-transform',
2054
+ '--sn-field-control-bg',
2055
+ '--sn-field-control-border',
2056
+ '--sn-field-control-color',
2057
+ '--sn-field-control-padding',
2058
+ '--sn-field-control-radius',
2059
+ '--sn-field-control-font-size',
2060
+ '--sn-field-control-line-height',
2061
+ '--sn-field-control-focus-border',
2062
+ '--sn-field-control-focus-shadow',
2063
+ '--sn-field-placeholder-color',
2064
+ '--sn-field-textarea-min-height',
2065
+ '--sn-field-hint-margin-block-start',
2066
+ '--sn-field-hint-color',
2067
+ '--sn-field-hint-size',
2068
+ '--sn-field-hint-line-height',
2069
+ '--sn-field-inline-gap',
2070
+ '--sn-field-compact-margin-block-end',
2071
+ '--sn-field-compact-control-padding',
2072
+ ],
2073
+ },
2074
+ },
2075
+ {
2076
+ tagName: 'sn-card',
2077
+ className: 'SurfaceCard',
2078
+ module: 'surface/Card/Card.js',
2079
+ category: 'surface',
2080
+ description: 'Generic themeable surface card for dashboard, list, detail, and settings UI composition.',
2081
+ contract: {
2082
+ status: 'draft',
2083
+ schemaVersion: 'component-descriptor-v1',
2084
+ dataSchema: 'schemas/runtime-ui-v1.json',
2085
+ capabilities: ['surface', 'card', 'slots', 'interactive-state', 'themeable'],
2086
+ attributes: [
2087
+ { name: 'variant', type: 'string', description: 'Surface variant: default, flat, or panel.' },
2088
+ { name: 'interactive', type: 'boolean', description: 'Enables hover affordance for clickable cards.' },
2089
+ ],
2090
+ slots: [
2091
+ { name: 'default', description: 'Main card content.' },
2092
+ { name: 'title', description: 'Optional card title content.' },
2093
+ { name: 'footer', description: 'Optional footer/action row content.' },
2094
+ ],
2095
+ events: [],
2096
+ themeAliases: [
2097
+ '--sn-card-bg',
2098
+ '--sn-card-border',
2099
+ '--sn-card-radius',
2100
+ '--sn-card-padding',
2101
+ '--sn-card-margin-block-end',
2102
+ '--sn-card-hover-bg',
2103
+ '--sn-card-hover-border',
2104
+ '--sn-card-title-color',
2105
+ '--sn-card-title-size',
2106
+ '--sn-card-title-weight',
2107
+ '--sn-card-title-margin-block-end',
2108
+ '--sn-card-footer-gap',
2109
+ '--sn-card-footer-margin-block-start',
2110
+ '--sn-card-footer-padding-block-start',
2111
+ ],
2112
+ },
2113
+ },
2114
+ {
2115
+ tagName: 'sn-badge',
2116
+ className: 'StatusBadge',
2117
+ module: 'display/Badge/Badge.js',
2118
+ category: 'display',
2119
+ description: 'Generic themeable status badge for compact state, type, and metadata labels.',
2120
+ contract: {
2121
+ status: 'draft',
2122
+ schemaVersion: 'component-descriptor-v1',
2123
+ dataSchema: 'schemas/runtime-ui-v1.json',
2124
+ capabilities: ['status', 'badge', 'slots', 'themeable'],
2125
+ attributes: [
2126
+ { name: 'variant', type: 'string', description: 'Status variant: default, success, info, warning, or error.' },
2127
+ ],
2128
+ slots: [
2129
+ { name: 'default', description: 'Badge label and optional icon content.' },
2130
+ ],
2131
+ events: [],
2132
+ themeAliases: [
2133
+ '--sn-badge-bg',
2134
+ '--sn-badge-color',
2135
+ '--sn-badge-border',
2136
+ '--sn-badge-padding',
2137
+ '--sn-badge-radius',
2138
+ '--sn-badge-gap',
2139
+ '--sn-badge-font-size',
2140
+ '--sn-badge-font-weight',
2141
+ '--sn-badge-line-height',
2142
+ '--sn-badge-success-color',
2143
+ '--sn-badge-success-border',
2144
+ '--sn-badge-info-color',
2145
+ '--sn-badge-info-border',
2146
+ '--sn-badge-warning-color',
2147
+ '--sn-badge-warning-border',
2148
+ '--sn-badge-error-color',
2149
+ '--sn-badge-error-border',
2150
+ ],
2151
+ },
2152
+ },
2153
+ {
2154
+ tagName: 'sn-metric',
2155
+ className: 'MetricItem',
2156
+ module: 'display/Metric/Metric.js',
2157
+ category: 'display',
2158
+ description: 'Generic themeable label/value metric row for dashboard stats, health summaries, and settings metadata.',
2159
+ contract: {
2160
+ status: 'draft',
2161
+ schemaVersion: 'component-descriptor-v1',
2162
+ dataSchema: 'schemas/runtime-ui-v1.json',
2163
+ capabilities: ['metric', 'stat', 'label-value', 'slots', 'status', 'themeable'],
2164
+ attributes: [
2165
+ { name: 'variant', type: 'string', description: 'Metric variant: default or stacked.' },
2166
+ { name: 'status', type: 'string', description: 'Value status: default, success, warning, or error.' },
2167
+ ],
2168
+ slots: [
2169
+ { name: 'label', description: 'Metric label content.' },
2170
+ { name: 'value', description: 'Metric value content.' },
2171
+ { name: 'default', description: 'Fallback metric value content.' },
2172
+ ],
2173
+ events: [],
2174
+ themeAliases: [
2175
+ '--sn-metric-gap',
2176
+ '--sn-metric-padding',
2177
+ '--sn-metric-border',
2178
+ '--sn-metric-color',
2179
+ '--sn-metric-label-color',
2180
+ '--sn-metric-label-size',
2181
+ '--sn-metric-value-color',
2182
+ '--sn-metric-value-size',
2183
+ '--sn-metric-value-weight',
2184
+ '--sn-metric-value-font',
2185
+ '--sn-metric-success-color',
2186
+ '--sn-metric-warning-color',
2187
+ '--sn-metric-error-color',
2188
+ ],
2189
+ },
2190
+ },
2191
+ {
2192
+ tagName: 'sn-data-table',
2193
+ className: 'DataTable',
2194
+ module: 'display/DataTable/DataTable.js',
2195
+ category: 'display',
2196
+ description: 'Generic themeable data table for provider-neutral tabular records.',
2197
+ contract: {
2198
+ status: 'draft',
2199
+ schemaVersion: 'component-descriptor-v1',
2200
+ dataSchema: 'schemas/runtime-ui-v1.json',
2201
+ capabilities: ['data-table', 'column-schema', 'row-records', 'structured-cells', 'empty-state', 'themeable'],
2202
+ properties: [
2203
+ { name: 'emptyText', type: 'string', description: 'Empty state text.' },
2204
+ { name: 'isEmpty', type: 'boolean', description: 'Whether the table has no rendered rows or columns.' },
2205
+ ],
2206
+ methods: [
2207
+ { name: 'setColumns', type: 'function', description: 'Sets column descriptors with keys, labels, and alignment.' },
2208
+ { name: 'setRows', type: 'function', description: 'Sets row records or cell descriptor maps.' },
2209
+ { name: 'setData', type: 'function', description: 'Sets columns, rows, and optional empty text in one call.' },
2210
+ { name: 'getData', type: 'function', description: 'Returns the current column and row descriptors.' },
2211
+ ],
2212
+ events: [],
2213
+ themeAliases: [
2214
+ '--sn-data-table-bg',
2215
+ '--sn-data-table-border',
2216
+ '--sn-data-table-radius',
2217
+ '--sn-data-table-color',
2218
+ '--sn-data-table-header-bg',
2219
+ '--sn-data-table-header-color',
2220
+ '--sn-data-table-header-border',
2221
+ '--sn-data-table-header-size',
2222
+ '--sn-data-table-header-weight',
2223
+ '--sn-data-table-header-transform',
2224
+ '--sn-data-table-row-border',
2225
+ '--sn-data-table-cell-padding',
2226
+ '--sn-data-table-cell-size',
2227
+ '--sn-data-table-cell-gap',
2228
+ '--sn-data-table-line-height',
2229
+ '--sn-data-table-min-width',
2230
+ '--sn-data-table-marker-size',
2231
+ '--sn-data-table-marker-radius',
2232
+ '--sn-data-table-empty-padding',
2233
+ '--sn-data-table-empty-color',
2234
+ ],
2235
+ },
2236
+ },
2237
+ {
2238
+ tagName: 'sn-event-feed',
2239
+ className: 'EventFeed',
2240
+ module: 'display/EventFeed/EventFeed.js',
2241
+ category: 'display',
2242
+ description: 'Generic themeable event feed for provider-neutral runtime and tool events.',
2243
+ contract: {
2244
+ status: 'draft',
2245
+ schemaVersion: 'component-descriptor-v1',
2246
+ dataSchema: 'schemas/runtime-ui-v1.json',
2247
+ capabilities: ['event-feed', 'structured-events', 'preview-routing', 'empty-state', 'themeable'],
2248
+ properties: [
2249
+ { name: 'eventsList', type: 'array', description: 'Rendered event item descriptors.' },
2250
+ { name: 'eventCount', type: 'string', description: 'Rendered event count.' },
2251
+ { name: 'emptyText', type: 'string', description: 'Empty state text.' },
2252
+ ],
2253
+ methods: [
2254
+ { name: 'setEvents', type: 'function', description: 'Sets structured events with optional max item count.' },
2255
+ { name: 'addEvent', type: 'function', description: 'Prepends one structured event.' },
2256
+ { name: 'clearEvents', type: 'function', description: 'Clears all events.' },
2257
+ { name: 'getEvents', type: 'function', description: 'Returns current structured events.' },
2258
+ ],
2259
+ events: [],
2260
+ themeAliases: [
2261
+ '--sn-bg-overlay',
2262
+ '--sn-card-radius',
2263
+ '--sn-cat-data',
2264
+ '--sn-cat-server',
2265
+ '--sn-danger-color',
2266
+ '--sn-font',
2267
+ '--sn-font-mono',
2268
+ '--sn-list-item-radius',
2269
+ '--sn-node-border',
2270
+ '--sn-node-header-bg',
2271
+ '--sn-success-color',
2272
+ '--sn-text',
2273
+ '--sn-text-dim',
2274
+ ],
2275
+ },
2276
+ },
2277
+ {
2278
+ tagName: 'sn-event-feed-item',
2279
+ className: 'EventFeedItem',
2280
+ module: 'display/EventFeed/EventFeedItem.js',
2281
+ category: 'display',
2282
+ description: 'Internal event feed item used by sn-event-feed.',
2283
+ },
2284
+ {
2285
+ tagName: 'sn-banner',
2286
+ className: 'StatusBanner',
2287
+ module: 'display/Banner/Banner.js',
2288
+ category: 'display',
2289
+ description: 'Generic themeable status banner for inline feedback and transient process state.',
2290
+ contract: {
2291
+ status: 'draft',
2292
+ schemaVersion: 'component-descriptor-v1',
2293
+ dataSchema: 'schemas/runtime-ui-v1.json',
2294
+ capabilities: ['status', 'banner', 'feedback', 'slots', 'themeable'],
2295
+ attributes: [
2296
+ { name: 'variant', type: 'string', description: 'Banner variant: default, info, running, success, warning, or error.' },
2297
+ ],
2298
+ slots: [
2299
+ { name: 'default', description: 'Banner message and optional icon content.' },
2300
+ ],
2301
+ events: [],
2302
+ themeAliases: [
2303
+ '--sn-banner-bg',
2304
+ '--sn-banner-color',
2305
+ '--sn-banner-border',
2306
+ '--sn-banner-padding',
2307
+ '--sn-banner-radius',
2308
+ '--sn-banner-gap',
2309
+ '--sn-banner-margin-block-end',
2310
+ '--sn-banner-font-size',
2311
+ '--sn-banner-font-weight',
2312
+ '--sn-banner-line-height',
2313
+ '--sn-banner-icon-size',
2314
+ '--sn-banner-info-color',
2315
+ '--sn-banner-info-border',
2316
+ '--sn-banner-success-color',
2317
+ '--sn-banner-success-border',
2318
+ '--sn-banner-warning-color',
2319
+ '--sn-banner-warning-border',
2320
+ '--sn-banner-error-color',
2321
+ '--sn-banner-error-border',
2322
+ '--sn-banner-running-spin-duration',
2323
+ ],
2324
+ },
2325
+ },
2326
+ {
2327
+ tagName: 'sn-empty-state',
2328
+ className: 'EmptyState',
2329
+ module: 'display/EmptyState/EmptyState.js',
2330
+ category: 'display',
2331
+ description: 'Generic themeable placeholder for empty lists, loading gaps, and unavailable content.',
2332
+ contract: {
2333
+ status: 'draft',
2334
+ schemaVersion: 'component-descriptor-v1',
2335
+ dataSchema: 'schemas/runtime-ui-v1.json',
2336
+ capabilities: ['empty-state', 'placeholder', 'slots', 'themeable'],
2337
+ attributes: [
2338
+ { name: 'variant', type: 'string', description: 'Placeholder variant: default or error.' },
2339
+ ],
2340
+ slots: [
2341
+ { name: 'default', description: 'Placeholder label and optional icon content.' },
2342
+ ],
2343
+ events: [],
2344
+ themeAliases: [
2345
+ '--sn-empty-state-color',
2346
+ '--sn-empty-state-error-color',
2347
+ '--sn-empty-state-padding',
2348
+ '--sn-empty-state-gap',
2349
+ '--sn-empty-state-min-height',
2350
+ '--sn-empty-state-height',
2351
+ '--sn-empty-state-font-size',
2352
+ '--sn-empty-state-font-style',
2353
+ '--sn-empty-state-line-height',
2354
+ '--sn-empty-state-icon-size',
2355
+ ],
2356
+ },
2357
+ },
2358
+ {
2359
+ tagName: 'ctrl-item',
2360
+ className: 'CtrlItem',
2361
+ module: 'node/CtrlItem/CtrlItem.js',
2362
+ category: 'node',
2363
+ description: 'Internal control item used by graph-node.',
2364
+ },
2365
+ {
2366
+ tagName: 'port-item',
2367
+ className: 'PortItem',
2368
+ module: 'node/PortItem/PortItem.js',
2369
+ category: 'node',
2370
+ description: 'Internal port item used by graph-node.',
2371
+ },
2372
+ {
2373
+ tagName: 'graph-frame',
2374
+ className: 'GraphFrame',
2375
+ module: 'node/GraphFrame/GraphFrame.js',
2376
+ category: 'node',
2377
+ description: 'Graph canvas frame primitive for grouped node regions.',
2378
+ contract: {
2379
+ status: 'draft',
2380
+ schemaVersion: 'component-descriptor-v1',
2381
+ dataSchema: 'schemas/graph-model-v1.json',
2382
+ capabilities: ['node-group-frame', 'label', 'accent-color', 'resize-affordance'],
2383
+ properties: [
2384
+ { name: 'label', type: 'string', description: 'Frame label.' },
2385
+ { name: 'color', type: 'string', description: 'Frame accent color.' },
2386
+ ],
2387
+ events: [],
2388
+ themeAliases: [
2389
+ '--sn-frame-border-width',
2390
+ '--sn-frame-border-style',
2391
+ '--sn-frame-radius',
2392
+ '--sn-frame-font',
2393
+ '--sn-frame-font-size',
2394
+ ],
2395
+ },
2396
+ },
2397
+ ].map((component) => {
2398
+ let exportName = UI_NAMED_EXPORTS.has(component.className) ? component.className : null;
2399
+ let visibility = component.visibility || (exportName ? COMPONENT_VISIBILITY.public : COMPONENT_VISIBILITY.internal);
2400
+ let internal = visibility === COMPONENT_VISIBILITY.internal;
2401
+ return {
2402
+ ...component,
2403
+ contract: normalizeContract(component),
2404
+ visibility,
2405
+ internal,
2406
+ specifier: COMPONENT_UI_SPECIFIER,
2407
+ exportName,
2408
+ importKind: internal ? 'side-effect' : 'named',
2409
+ };
2410
+ });
2411
+
2412
+ export function listComponents(filter = {}) {
2413
+ let { includeInternal = false, includeExperimental = false, ...componentFilter } = filter;
2414
+ return COMPONENTS.filter((component) => {
2415
+ if (!includeInternal && component.internal) return false;
2416
+ if (!includeExperimental && component.visibility === COMPONENT_VISIBILITY.experimental) return false;
2417
+ for (let [key, value] of Object.entries(componentFilter)) {
2418
+ if (component[key] !== value) return false;
2419
+ }
2420
+ return true;
2421
+ });
2422
+ }
2423
+
2424
+ export function getComponent(tagName) {
2425
+ return COMPONENTS.find((component) => component.tagName === tagName);
2426
+ }
2427
+
2428
+ export function hasComponent(tagName) {
2429
+ return Boolean(getComponent(tagName));
2430
+ }
2431
+
2432
+ export function getComponentModule(tagName) {
2433
+ return getComponent(tagName)?.module;
2434
+ }
2435
+
2436
+ export function getComponentSpecifier(tagName) {
2437
+ return getComponent(tagName)?.specifier;
2438
+ }
2439
+
2440
+ export function getComponentExportName(tagName) {
2441
+ return getComponent(tagName)?.exportName;
2442
+ }
2443
+
2444
+ export function getComponentTags(filter = {}) {
2445
+ return listComponents(filter).map((component) => component.tagName);
2446
+ }