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,503 @@
1
+ export const DEFAULT_LOCALE = 'en';
2
+
3
+ export const SUPPORTED_LOCALES = Object.freeze(['en', 'ru', 'es']);
4
+ export const DEFAULT_LOCALE_MODE = 'auto';
5
+ export const SUPPORTED_LOCALE_MODES = Object.freeze([
6
+ DEFAULT_LOCALE_MODE,
7
+ ...SUPPORTED_LOCALES,
8
+ ]);
9
+
10
+ export const LOCALE_LABELS = Object.freeze({
11
+ en: 'English',
12
+ ru: 'Русский',
13
+ es: 'Español',
14
+ });
15
+
16
+ const EN_MESSAGES = Object.freeze({
17
+ 'dialog.cancel': 'Cancel',
18
+ 'dialog.confirm': 'Confirm',
19
+ 'dialog.ok': 'OK',
20
+ 'networkApproval.title': 'Network approval',
21
+ 'networkApproval.heading': 'Waiting for local approval',
22
+ 'networkApproval.message': 'This network browser must be approved from an already authorized local browser.',
23
+ 'networkApproval.requestLabel': 'Request',
24
+ 'networkApproval.addressLabel': 'Address',
25
+ 'networkApproval.waitingStatus': 'Waiting...',
26
+ 'networkApproval.approvedStatus': 'Approved. Opening...',
27
+ 'networkApproval.rejectedStatus': 'Rejected from the local browser.',
28
+ 'quickOpen.placeholder': 'Search files...',
29
+ 'quickOpen.empty': 'No files found',
30
+ 'chat.composer.placeholder': 'Ask anything',
31
+ 'chat.composer.voiceCommandDefault': 'send',
32
+ 'chat.composer.voiceCommandToggleLabel': 'Send on "{command}"',
33
+ 'chat.composer.voiceCommandToggleOff': 'Send when saying "{command}"',
34
+ 'chat.composer.voiceCommandToggleOn': 'Auto-send is on. Say "{command}" to submit.',
35
+ 'chat.list.title': 'Chats',
36
+ 'chat.list.new': 'New',
37
+ 'chat.list.empty': 'No chats yet.',
38
+ 'chat.list.filter.all': 'All',
39
+ 'chat.list.filter.project': 'By Project',
40
+ 'chat.list.filter.active': 'Active',
41
+ 'chat.sidebar.new': 'New chat',
42
+ 'chat.sidebar.title': 'Chats',
43
+ 'chat.sidebar.delete': 'Delete',
44
+ 'chat.sidebar.deleteChat': 'Delete chat',
45
+ 'chat.sidebar.toggleChildren': 'Toggle child chats',
46
+ 'chat.message.input': 'Input',
47
+ 'chat.message.result': 'Result',
48
+ 'chat.message.running': 'Running...',
49
+ 'chat.message.queued': 'Queued',
50
+ 'chat.message.item': 'Item',
51
+ 'chat.message.completed': 'Completed',
52
+ 'chat.message.failed': 'Failed',
53
+ 'chat.message.cancelled': 'Cancelled',
54
+ 'chat.message.copyResponse': 'Copy response',
55
+ 'chat.message.workedFor': 'Worked for {elapsed}',
56
+ 'chat.message.thinkingFor': 'Thinking for {elapsed}',
57
+ 'chat.meta.tokens': 'Tokens',
58
+ 'chat.meta.cost': 'Cost',
59
+ 'chat.meta.exit': 'exit {code}',
60
+ 'chat.meta.toolCall': '{count} tool call',
61
+ 'chat.meta.toolCalls': '{count} tool calls',
62
+ 'toolbar.duplicate': 'Duplicate',
63
+ 'toolbar.mute': 'Mute',
64
+ 'toolbar.delete': 'Delete',
65
+ 'toolbar.enterSubgraph': 'Enter Subgraph',
66
+ 'toolbar.exploreConnections': 'Explore connections',
67
+ 'toolbar.viewCode': 'View Code',
68
+ 'inspector.empty': 'Select a node',
69
+ 'inspector.label': 'Label',
70
+ 'inspector.type': 'Type',
71
+ 'inspector.category': 'Category',
72
+ 'inspector.inputs': 'Inputs',
73
+ 'inspector.outputs': 'Outputs',
74
+ 'inspector.controls': 'Controls',
75
+ 'inspector.fire': 'Fire',
76
+ 'inspector.subgraph': 'Subgraph',
77
+ 'inspector.innerNodes': 'Inner Nodes',
78
+ 'inspector.enterSubgraph': 'Enter Subgraph',
79
+ 'templatePreview.placeholders': 'Placeholders',
80
+ 'templatePreview.empty': 'Type {field} in template to add placeholders',
81
+ 'templatePreview.testData': 'Test Data (JSON)',
82
+ 'templatePreview.preview': 'Preview',
83
+ 'context.deleteNode': 'Delete Node',
84
+ 'context.cloneNode': 'Clone Node',
85
+ 'context.selectAll': 'Select All',
86
+ 'context.deleteConnection': 'Delete Connection',
87
+ 'context.addNode': 'Add Node',
88
+ 'context.addComment': 'Add Comment',
89
+ 'context.addFrame': 'Add Frame',
90
+ 'context.paste': 'Paste',
91
+ 'context.fitView': 'Fit View',
92
+ 'context.autoLayout': 'Auto Layout',
93
+ 'nodeCanvas.addNode': 'Add Node',
94
+ 'nodeCanvas.toggleMinimap': 'Toggle minimap',
95
+ 'nodeSearch.placeholder': 'Search nodes...',
96
+ 'palette.title': 'Components',
97
+ 'palette.searchPlaceholder': 'Search components...',
98
+ 'tree.loading': 'Loading...',
99
+ 'tree.filterPlaceholder': 'Filter...',
100
+ 'tree.collapseAll': 'Collapse all',
101
+ 'loading.label': 'Loading',
102
+ 'loading.initializing': 'Initializing...',
103
+ 'eventFeed.title': 'Events',
104
+ 'eventFeed.empty': 'No events',
105
+ 'outputGraph.title': 'Graph',
106
+ 'outputGraph.empty': 'No graph data',
107
+ 'outputGraph.truncated': 'Preview truncated',
108
+ 'layout.collapse': 'Collapse',
109
+ 'layout.fullscreen': 'Fullscreen',
110
+ 'layout.resetAll': 'Reset all layouts to default',
111
+ 'tabs.close': 'Close',
112
+ 'tabs.new': 'New tab',
113
+ 'tabs.home': 'Home',
114
+ 'tabs.openProject': 'Open project',
115
+ 'sourceViewer.showInGraph': 'Show in Graph',
116
+ 'sourceViewer.toggleViewMode': 'Toggle view mode',
117
+ 'sourceViewer.graphLabel': 'graph',
118
+ });
119
+
120
+ const RU_MESSAGES = Object.freeze({
121
+ 'dialog.cancel': 'Отмена',
122
+ 'dialog.confirm': 'Подтвердить',
123
+ 'dialog.ok': 'OK',
124
+ 'networkApproval.title': 'Подтверждение сети',
125
+ 'networkApproval.heading': 'Ожидание локального подтверждения',
126
+ 'networkApproval.message': 'Этот сетевой браузер нужно подтвердить из уже авторизованного локального браузера.',
127
+ 'networkApproval.requestLabel': 'Запрос',
128
+ 'networkApproval.addressLabel': 'Адрес',
129
+ 'networkApproval.waitingStatus': 'Ожидание...',
130
+ 'networkApproval.approvedStatus': 'Подтверждено. Открываем...',
131
+ 'networkApproval.rejectedStatus': 'Отклонено из локального браузера.',
132
+ 'quickOpen.placeholder': 'Поиск файлов...',
133
+ 'quickOpen.empty': 'Файлы не найдены',
134
+ 'chat.composer.placeholder': 'Спросите что-нибудь',
135
+ 'chat.composer.voiceCommandDefault': 'отправить',
136
+ 'chat.composer.voiceCommandToggleLabel': 'Отправить по команде «{command}»',
137
+ 'chat.composer.voiceCommandToggleOff': 'Отправить по команде «{command}»',
138
+ 'chat.composer.voiceCommandToggleOn': 'Автоотправка включена. Скажите «{command}», чтобы отправить.',
139
+ 'chat.list.title': 'Чаты',
140
+ 'chat.list.new': 'Новый',
141
+ 'chat.list.empty': 'Чатов пока нет.',
142
+ 'chat.list.filter.all': 'Все',
143
+ 'chat.list.filter.project': 'По проекту',
144
+ 'chat.list.filter.active': 'Активные',
145
+ 'chat.sidebar.new': 'Новый чат',
146
+ 'chat.sidebar.title': 'Чаты',
147
+ 'chat.sidebar.delete': 'Удалить',
148
+ 'chat.sidebar.deleteChat': 'Удалить чат',
149
+ 'chat.sidebar.toggleChildren': 'Показать дочерние чаты',
150
+ 'chat.message.input': 'Ввод',
151
+ 'chat.message.result': 'Результат',
152
+ 'chat.message.running': 'Выполняется...',
153
+ 'chat.message.queued': 'В очереди',
154
+ 'chat.message.item': 'Элемент',
155
+ 'chat.message.completed': 'Завершено',
156
+ 'chat.message.failed': 'Ошибка',
157
+ 'chat.message.cancelled': 'Отменено',
158
+ 'chat.message.copyResponse': 'Скопировать ответ',
159
+ 'chat.message.workedFor': 'Работал {elapsed}',
160
+ 'chat.message.thinkingFor': 'Думает {elapsed}',
161
+ 'chat.meta.tokens': 'Токены',
162
+ 'chat.meta.cost': 'Стоимость',
163
+ 'chat.meta.exit': 'код выхода {code}',
164
+ 'chat.meta.toolCall': '{count} вызов инструмента',
165
+ 'chat.meta.toolCalls': '{count} вызовов инструмента',
166
+ 'toolbar.duplicate': 'Дублировать',
167
+ 'toolbar.mute': 'Отключить',
168
+ 'toolbar.delete': 'Удалить',
169
+ 'toolbar.enterSubgraph': 'Открыть подграф',
170
+ 'toolbar.exploreConnections': 'Показать связи',
171
+ 'toolbar.viewCode': 'Показать код',
172
+ 'inspector.empty': 'Выберите узел',
173
+ 'inspector.label': 'Название',
174
+ 'inspector.type': 'Тип',
175
+ 'inspector.category': 'Категория',
176
+ 'inspector.inputs': 'Входы',
177
+ 'inspector.outputs': 'Выходы',
178
+ 'inspector.controls': 'Элементы управления',
179
+ 'inspector.fire': 'Запустить',
180
+ 'inspector.subgraph': 'Подграф',
181
+ 'inspector.innerNodes': 'Внутренние узлы',
182
+ 'inspector.enterSubgraph': 'Открыть подграф',
183
+ 'templatePreview.placeholders': 'Плейсхолдеры',
184
+ 'templatePreview.empty': 'Введите {field} в шаблоне, чтобы добавить плейсхолдеры',
185
+ 'templatePreview.testData': 'Тестовые данные (JSON)',
186
+ 'templatePreview.preview': 'Предпросмотр',
187
+ 'context.deleteNode': 'Удалить узел',
188
+ 'context.cloneNode': 'Клонировать узел',
189
+ 'context.selectAll': 'Выбрать все',
190
+ 'context.deleteConnection': 'Удалить связь',
191
+ 'context.addNode': 'Добавить узел',
192
+ 'context.addComment': 'Добавить комментарий',
193
+ 'context.addFrame': 'Добавить фрейм',
194
+ 'context.paste': 'Вставить',
195
+ 'context.fitView': 'Вписать вид',
196
+ 'context.autoLayout': 'Автораскладка',
197
+ 'nodeCanvas.addNode': 'Добавить узел',
198
+ 'nodeCanvas.toggleMinimap': 'Переключить миникарту',
199
+ 'nodeSearch.placeholder': 'Поиск узлов...',
200
+ 'palette.title': 'Компоненты',
201
+ 'palette.searchPlaceholder': 'Поиск компонентов...',
202
+ 'tree.loading': 'Загрузка...',
203
+ 'tree.filterPlaceholder': 'Фильтр...',
204
+ 'tree.collapseAll': 'Свернуть все',
205
+ 'loading.label': 'Загрузка',
206
+ 'loading.initializing': 'Инициализация...',
207
+ 'eventFeed.title': 'События',
208
+ 'eventFeed.empty': 'Событий нет',
209
+ 'outputGraph.title': 'Граф',
210
+ 'outputGraph.empty': 'Нет данных графа',
211
+ 'outputGraph.truncated': 'Предпросмотр обрезан',
212
+ 'layout.collapse': 'Свернуть',
213
+ 'layout.fullscreen': 'Во весь экран',
214
+ 'layout.resetAll': 'Сбросить все раскладки',
215
+ 'tabs.close': 'Закрыть',
216
+ 'tabs.new': 'Новая вкладка',
217
+ 'tabs.home': 'Главная',
218
+ 'tabs.openProject': 'Открыть проект',
219
+ 'sourceViewer.showInGraph': 'Показать в графе',
220
+ 'sourceViewer.toggleViewMode': 'Переключить режим просмотра',
221
+ 'sourceViewer.graphLabel': 'граф',
222
+ });
223
+
224
+ const ES_MESSAGES = Object.freeze({
225
+ 'dialog.cancel': 'Cancelar',
226
+ 'dialog.confirm': 'Confirmar',
227
+ 'dialog.ok': 'OK',
228
+ 'networkApproval.title': 'Aprobación de red',
229
+ 'networkApproval.heading': 'Esperando aprobación local',
230
+ 'networkApproval.message': 'Este navegador de red debe aprobarse desde un navegador local ya autorizado.',
231
+ 'networkApproval.requestLabel': 'Solicitud',
232
+ 'networkApproval.addressLabel': 'Dirección',
233
+ 'networkApproval.waitingStatus': 'Esperando...',
234
+ 'networkApproval.approvedStatus': 'Aprobado. Abriendo...',
235
+ 'networkApproval.rejectedStatus': 'Rechazado desde el navegador local.',
236
+ 'quickOpen.placeholder': 'Buscar archivos...',
237
+ 'quickOpen.empty': 'No se encontraron archivos',
238
+ 'chat.composer.placeholder': 'Pregunta lo que quieras',
239
+ 'chat.composer.voiceCommandDefault': 'enviar',
240
+ 'chat.composer.voiceCommandToggleLabel': 'Enviar con "{command}"',
241
+ 'chat.composer.voiceCommandToggleOff': 'Enviar al decir "{command}"',
242
+ 'chat.composer.voiceCommandToggleOn': 'Autoenvío activado. Di "{command}" para enviar.',
243
+ 'chat.list.title': 'Chats',
244
+ 'chat.list.new': 'Nuevo',
245
+ 'chat.list.empty': 'Aún no hay chats.',
246
+ 'chat.list.filter.all': 'Todos',
247
+ 'chat.list.filter.project': 'Por proyecto',
248
+ 'chat.list.filter.active': 'Activos',
249
+ 'chat.sidebar.new': 'Nuevo chat',
250
+ 'chat.sidebar.title': 'Chats',
251
+ 'chat.sidebar.delete': 'Eliminar',
252
+ 'chat.sidebar.deleteChat': 'Eliminar chat',
253
+ 'chat.sidebar.toggleChildren': 'Alternar chats secundarios',
254
+ 'chat.message.input': 'Entrada',
255
+ 'chat.message.result': 'Resultado',
256
+ 'chat.message.running': 'Ejecutando...',
257
+ 'chat.message.queued': 'En cola',
258
+ 'chat.message.item': 'Elemento',
259
+ 'chat.message.completed': 'Completado',
260
+ 'chat.message.failed': 'Falló',
261
+ 'chat.message.cancelled': 'Cancelado',
262
+ 'chat.message.copyResponse': 'Copiar respuesta',
263
+ 'chat.message.workedFor': 'Trabajó durante {elapsed}',
264
+ 'chat.message.thinkingFor': 'Pensando durante {elapsed}',
265
+ 'chat.meta.tokens': 'Tokens',
266
+ 'chat.meta.cost': 'Costo',
267
+ 'chat.meta.exit': 'salida {code}',
268
+ 'chat.meta.toolCall': '{count} llamada de herramienta',
269
+ 'chat.meta.toolCalls': '{count} llamadas de herramienta',
270
+ 'toolbar.duplicate': 'Duplicar',
271
+ 'toolbar.mute': 'Silenciar',
272
+ 'toolbar.delete': 'Eliminar',
273
+ 'toolbar.enterSubgraph': 'Entrar al subgrafo',
274
+ 'toolbar.exploreConnections': 'Explorar conexiones',
275
+ 'toolbar.viewCode': 'Ver código',
276
+ 'inspector.empty': 'Selecciona un nodo',
277
+ 'inspector.label': 'Etiqueta',
278
+ 'inspector.type': 'Tipo',
279
+ 'inspector.category': 'Categoría',
280
+ 'inspector.inputs': 'Entradas',
281
+ 'inspector.outputs': 'Salidas',
282
+ 'inspector.controls': 'Controles',
283
+ 'inspector.fire': 'Ejecutar',
284
+ 'inspector.subgraph': 'Subgrafo',
285
+ 'inspector.innerNodes': 'Nodos internos',
286
+ 'inspector.enterSubgraph': 'Entrar al subgrafo',
287
+ 'templatePreview.placeholders': 'Marcadores',
288
+ 'templatePreview.empty': 'Escribe {field} en la plantilla para agregar marcadores',
289
+ 'templatePreview.testData': 'Datos de prueba (JSON)',
290
+ 'templatePreview.preview': 'Vista previa',
291
+ 'context.deleteNode': 'Eliminar nodo',
292
+ 'context.cloneNode': 'Clonar nodo',
293
+ 'context.selectAll': 'Seleccionar todo',
294
+ 'context.deleteConnection': 'Eliminar conexión',
295
+ 'context.addNode': 'Agregar nodo',
296
+ 'context.addComment': 'Agregar comentario',
297
+ 'context.addFrame': 'Agregar marco',
298
+ 'context.paste': 'Pegar',
299
+ 'context.fitView': 'Ajustar vista',
300
+ 'context.autoLayout': 'Diseño automático',
301
+ 'nodeCanvas.addNode': 'Agregar nodo',
302
+ 'nodeCanvas.toggleMinimap': 'Alternar minimapa',
303
+ 'nodeSearch.placeholder': 'Buscar nodos...',
304
+ 'palette.title': 'Componentes',
305
+ 'palette.searchPlaceholder': 'Buscar componentes...',
306
+ 'tree.loading': 'Cargando...',
307
+ 'tree.filterPlaceholder': 'Filtrar...',
308
+ 'tree.collapseAll': 'Contraer todo',
309
+ 'loading.label': 'Cargando',
310
+ 'loading.initializing': 'Inicializando...',
311
+ 'eventFeed.title': 'Eventos',
312
+ 'eventFeed.empty': 'No hay eventos',
313
+ 'outputGraph.title': 'Grafo',
314
+ 'outputGraph.empty': 'No hay datos de grafo',
315
+ 'outputGraph.truncated': 'Vista previa truncada',
316
+ 'layout.collapse': 'Contraer',
317
+ 'layout.fullscreen': 'Pantalla completa',
318
+ 'layout.resetAll': 'Restablecer todos los diseños',
319
+ 'tabs.close': 'Cerrar',
320
+ 'tabs.new': 'Nueva pestaña',
321
+ 'tabs.home': 'Inicio',
322
+ 'tabs.openProject': 'Abrir proyecto',
323
+ 'sourceViewer.showInGraph': 'Mostrar en grafo',
324
+ 'sourceViewer.toggleViewMode': 'Alternar modo de vista',
325
+ 'sourceViewer.graphLabel': 'grafo',
326
+ });
327
+
328
+ export const LOCALE_CATALOGS = Object.freeze({
329
+ en: EN_MESSAGES,
330
+ ru: RU_MESSAGES,
331
+ es: ES_MESSAGES,
332
+ });
333
+
334
+ export const LOCALE_CATALOG_KEYS = Object.freeze(Object.keys(EN_MESSAGES).sort());
335
+
336
+ let configuredLocale = DEFAULT_LOCALE;
337
+ let configuredLocaleMode = DEFAULT_LOCALE_MODE;
338
+ let configuredMessages = {};
339
+ let explicitlyConfiguredLocale = false;
340
+
341
+ function isPlainObject(value) {
342
+ return value && typeof value === 'object' && !Array.isArray(value);
343
+ }
344
+
345
+ function normalizeMessages(messages = {}) {
346
+ if (!isPlainObject(messages)) return {};
347
+ let result = {};
348
+ for (let [key, value] of Object.entries(messages)) {
349
+ if (typeof value === 'string') result[key] = value;
350
+ }
351
+ return result;
352
+ }
353
+
354
+ function normalizeLocaleMessages(messages = {}) {
355
+ if (!isPlainObject(messages)) return {};
356
+ let result = {};
357
+ for (let [key, value] of Object.entries(messages)) {
358
+ let locale = normalizeLocale(key, { fallback: '' });
359
+ if (!locale) continue;
360
+ result[locale] = {
361
+ ...(result[locale] || {}),
362
+ ...normalizeMessages(value),
363
+ };
364
+ }
365
+ return result;
366
+ }
367
+
368
+ export function normalizeLocale(value, options = {}) {
369
+ let fallback = options.fallback ?? DEFAULT_LOCALE;
370
+ if (value == null) return fallback;
371
+ let tag = String(value).trim().toLowerCase().replaceAll('_', '-');
372
+ if (!tag) return fallback;
373
+ let base = tag.split('-')[0];
374
+ return SUPPORTED_LOCALES.includes(base) ? base : fallback;
375
+ }
376
+
377
+ export function normalizeLocaleMode(value, options = {}) {
378
+ let fallback = options.fallback ?? DEFAULT_LOCALE_MODE;
379
+ if (value == null) return fallback;
380
+ let tag = String(value).trim().toLowerCase().replaceAll('_', '-');
381
+ if (!tag) return fallback;
382
+ if (tag === DEFAULT_LOCALE_MODE) return DEFAULT_LOCALE_MODE;
383
+ return normalizeLocale(tag, { fallback: '' }) || fallback;
384
+ }
385
+
386
+ export function resolveLocale(preferences, options = {}) {
387
+ let fallback = normalizeLocale(options.fallback ?? DEFAULT_LOCALE);
388
+ let values = Array.isArray(preferences) ? preferences : [preferences];
389
+ for (let value of values) {
390
+ let locale = normalizeLocale(value, { fallback: '' });
391
+ if (locale) return locale;
392
+ }
393
+ return fallback;
394
+ }
395
+
396
+ export function resolveLocaleForMode(mode, preferences, options = {}) {
397
+ let resolvedMode = normalizeLocaleMode(mode);
398
+ if (resolvedMode === DEFAULT_LOCALE_MODE) {
399
+ return resolveLocale(preferences, options);
400
+ }
401
+ return resolvedMode;
402
+ }
403
+
404
+ export function createLocaleDictionary(locale = DEFAULT_LOCALE, overrides = {}) {
405
+ let resolvedLocale = normalizeLocale(locale);
406
+ return {
407
+ ...LOCALE_CATALOGS[DEFAULT_LOCALE],
408
+ ...(LOCALE_CATALOGS[resolvedLocale] || {}),
409
+ ...normalizeMessages(overrides),
410
+ };
411
+ }
412
+
413
+ export function interpolateLocaleMessage(message, params = {}) {
414
+ return String(message).replace(/\{([a-zA-Z0-9_.-]+)\}/g, (match, key) => {
415
+ return Object.prototype.hasOwnProperty.call(params, key) ? String(params[key]) : match;
416
+ });
417
+ }
418
+
419
+ export function createTranslator(options = {}) {
420
+ let locale = normalizeLocale(options.locale ?? configuredLocale);
421
+ let fallbackLocale = normalizeLocale(options.fallbackLocale ?? DEFAULT_LOCALE);
422
+ let localeMessages = normalizeLocaleMessages(options.messages);
423
+ let flatMessages = normalizeMessages(options.messages);
424
+ let dictionary = {
425
+ ...LOCALE_CATALOGS[fallbackLocale],
426
+ ...(LOCALE_CATALOGS[locale] || {}),
427
+ ...(configuredMessages[locale] || {}),
428
+ ...(localeMessages[locale] || {}),
429
+ ...flatMessages,
430
+ };
431
+
432
+ return (key, params = {}) => {
433
+ let message = dictionary[key] ?? LOCALE_CATALOGS[fallbackLocale]?.[key] ?? key;
434
+ return interpolateLocaleMessage(message, params);
435
+ };
436
+ }
437
+
438
+ export function translate(key, params = {}, options = {}) {
439
+ return createTranslator(options)(key, params);
440
+ }
441
+
442
+ export function configureLocalization(options = {}) {
443
+ let nextMessages = normalizeLocaleMessages(options.messages);
444
+ for (let [locale, messages] of Object.entries(nextMessages)) {
445
+ configuredMessages[locale] = {
446
+ ...(configuredMessages[locale] || {}),
447
+ ...messages,
448
+ };
449
+ }
450
+
451
+ let flatMessages = normalizeMessages(options.messages);
452
+ if (Object.keys(flatMessages).length > 0) {
453
+ configuredMessages[configuredLocale] = {
454
+ ...(configuredMessages[configuredLocale] || {}),
455
+ ...flatMessages,
456
+ };
457
+ }
458
+
459
+ if (options.mode != null) {
460
+ configuredLocaleMode = normalizeLocaleMode(options.mode);
461
+ configuredLocale = resolveLocaleForMode(
462
+ configuredLocaleMode,
463
+ options.preferences ?? configuredLocale,
464
+ { fallback: options.fallbackLocale ?? DEFAULT_LOCALE },
465
+ );
466
+ explicitlyConfiguredLocale = options.explicit ?? configuredLocaleMode !== DEFAULT_LOCALE_MODE;
467
+ }
468
+
469
+ if (options.locale != null) {
470
+ configuredLocale = normalizeLocale(options.locale);
471
+ configuredLocaleMode = configuredLocale;
472
+ explicitlyConfiguredLocale = options.explicit !== false;
473
+ }
474
+
475
+ return getLocalization();
476
+ }
477
+
478
+ export function getLocalization() {
479
+ let locale = configuredLocale;
480
+ return {
481
+ locale,
482
+ mode: configuredLocaleMode,
483
+ defaultLocale: DEFAULT_LOCALE,
484
+ defaultMode: DEFAULT_LOCALE_MODE,
485
+ supportedLocales: [...SUPPORTED_LOCALES],
486
+ supportedModes: [...SUPPORTED_LOCALE_MODES],
487
+ explicit: explicitlyConfiguredLocale,
488
+ messages: createLocaleDictionary(locale, configuredMessages[locale]),
489
+ t: createTranslator({ locale }),
490
+ };
491
+ }
492
+
493
+ export function resetLocalization() {
494
+ configuredLocale = DEFAULT_LOCALE;
495
+ configuredLocaleMode = DEFAULT_LOCALE_MODE;
496
+ configuredMessages = {};
497
+ explicitlyConfiguredLocale = false;
498
+ return getLocalization();
499
+ }
500
+
501
+ export function isLocalizationExplicit() {
502
+ return explicitlyConfiguredLocale;
503
+ }