@vertesia/ui 1.5.0-dev.20260722.120446Z → 1.5.0-dev.20260725.083715Z
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/core/components/shadcn/filters/filterBar.d.ts.map +1 -1
- package/lib/core/components/shadcn/filters/filterBar.js +1 -1
- package/lib/core/components/shadcn/filters/filterBar.js.map +1 -1
- package/lib/core/components/shadcn/modal/dialog.d.ts +1 -1
- package/lib/core/components/shadcn/modal/dialog.d.ts.map +1 -1
- package/lib/core/components/shadcn/modal/dialog.js +2 -0
- package/lib/core/components/shadcn/modal/dialog.js.map +1 -1
- package/lib/core/components/shadcn/tabs.d.ts +12 -1
- package/lib/core/components/shadcn/tabs.d.ts.map +1 -1
- package/lib/core/components/shadcn/tabs.js +12 -4
- package/lib/core/components/shadcn/tabs.js.map +1 -1
- package/lib/features/agent/chat/AgentRightPanel.d.ts +5 -1
- package/lib/features/agent/chat/AgentRightPanel.d.ts.map +1 -1
- package/lib/features/agent/chat/AgentRightPanel.js +2 -2
- package/lib/features/agent/chat/AgentRightPanel.js.map +1 -1
- package/lib/features/agent/chat/ArtifactsTab.d.ts +5 -1
- package/lib/features/agent/chat/ArtifactsTab.d.ts.map +1 -1
- package/lib/features/agent/chat/ArtifactsTab.js +48 -11
- package/lib/features/agent/chat/ArtifactsTab.js.map +1 -1
- package/lib/features/agent/chat/DocumentEditingActionCard.d.ts +6 -0
- package/lib/features/agent/chat/DocumentEditingActionCard.d.ts.map +1 -0
- package/lib/features/agent/chat/DocumentEditingActionCard.js +129 -0
- package/lib/features/agent/chat/DocumentEditingActionCard.js.map +1 -0
- package/lib/features/agent/chat/ModernAgentConversation.d.ts +19 -1
- package/lib/features/agent/chat/ModernAgentConversation.d.ts.map +1 -1
- package/lib/features/agent/chat/ModernAgentConversation.js +125 -27
- package/lib/features/agent/chat/ModernAgentConversation.js.map +1 -1
- package/lib/features/agent/chat/ModernAgentOutput/AgentMarkdownAnchor.d.ts +45 -0
- package/lib/features/agent/chat/ModernAgentOutput/AgentMarkdownAnchor.d.ts.map +1 -0
- package/lib/features/agent/chat/ModernAgentOutput/AgentMarkdownAnchor.js +40 -0
- package/lib/features/agent/chat/ModernAgentOutput/AgentMarkdownAnchor.js.map +1 -0
- package/lib/features/agent/chat/ModernAgentOutput/AllMessagesMixed.d.ts +3 -1
- package/lib/features/agent/chat/ModernAgentOutput/AllMessagesMixed.d.ts.map +1 -1
- package/lib/features/agent/chat/ModernAgentOutput/AllMessagesMixed.js +94 -49
- package/lib/features/agent/chat/ModernAgentOutput/AllMessagesMixed.js.map +1 -1
- package/lib/features/agent/chat/ModernAgentOutput/AttachmentPreview.d.ts +2 -1
- package/lib/features/agent/chat/ModernAgentOutput/AttachmentPreview.d.ts.map +1 -1
- package/lib/features/agent/chat/ModernAgentOutput/AttachmentPreview.js +9 -5
- package/lib/features/agent/chat/ModernAgentOutput/AttachmentPreview.js.map +1 -1
- package/lib/features/agent/chat/ModernAgentOutput/CollapsibleAgentMarkdown.d.ts +25 -0
- package/lib/features/agent/chat/ModernAgentOutput/CollapsibleAgentMarkdown.d.ts.map +1 -0
- package/lib/features/agent/chat/ModernAgentOutput/CollapsibleAgentMarkdown.js +33 -0
- package/lib/features/agent/chat/ModernAgentOutput/CollapsibleAgentMarkdown.js.map +1 -0
- package/lib/features/agent/chat/ModernAgentOutput/MessageItem.d.ts +3 -1
- package/lib/features/agent/chat/ModernAgentOutput/MessageItem.d.ts.map +1 -1
- package/lib/features/agent/chat/ModernAgentOutput/MessageItem.js +22 -24
- package/lib/features/agent/chat/ModernAgentOutput/MessageItem.js.map +1 -1
- package/lib/features/agent/chat/ModernAgentOutput/ResourceChangeSummary.d.ts +14 -0
- package/lib/features/agent/chat/ModernAgentOutput/ResourceChangeSummary.d.ts.map +1 -0
- package/lib/features/agent/chat/ModernAgentOutput/ResourceChangeSummary.js +21 -0
- package/lib/features/agent/chat/ModernAgentOutput/ResourceChangeSummary.js.map +1 -0
- package/lib/features/agent/chat/ModernAgentOutput/ResourceChip.d.ts +30 -0
- package/lib/features/agent/chat/ModernAgentOutput/ResourceChip.d.ts.map +1 -0
- package/lib/features/agent/chat/ModernAgentOutput/ResourceChip.js +53 -0
- package/lib/features/agent/chat/ModernAgentOutput/ResourceChip.js.map +1 -0
- package/lib/features/agent/chat/ModernAgentOutput/ToolCallGroup.d.ts.map +1 -1
- package/lib/features/agent/chat/ModernAgentOutput/ToolCallGroup.js +21 -2
- package/lib/features/agent/chat/ModernAgentOutput/ToolCallGroup.js.map +1 -1
- package/lib/features/agent/chat/ModernAgentOutput/resourceLinks.d.ts +6 -0
- package/lib/features/agent/chat/ModernAgentOutput/resourceLinks.d.ts.map +1 -0
- package/lib/features/agent/chat/ModernAgentOutput/resourceLinks.js +29 -0
- package/lib/features/agent/chat/ModernAgentOutput/resourceLinks.js.map +1 -0
- package/lib/features/agent/chat/ModernAgentOutput/resourceSummary.d.ts +33 -0
- package/lib/features/agent/chat/ModernAgentOutput/resourceSummary.d.ts.map +1 -0
- package/lib/features/agent/chat/ModernAgentOutput/resourceSummary.js +129 -0
- package/lib/features/agent/chat/ModernAgentOutput/resourceSummary.js.map +1 -0
- package/lib/features/agent/chat/ModernAgentOutput/utils.d.ts +7 -0
- package/lib/features/agent/chat/ModernAgentOutput/utils.d.ts.map +1 -1
- package/lib/features/agent/chat/ModernAgentOutput/utils.js +11 -1
- package/lib/features/agent/chat/ModernAgentOutput/utils.js.map +1 -1
- package/lib/features/agent/chat/hooks/useAgentStream.d.ts +1 -1
- package/lib/features/agent/chat/hooks/useAgentStream.d.ts.map +1 -1
- package/lib/features/agent/chat/hooks/useAgentStream.js +24 -9
- package/lib/features/agent/chat/hooks/useAgentStream.js.map +1 -1
- package/lib/features/agent/chat/index.d.ts +2 -1
- package/lib/features/agent/chat/index.d.ts.map +1 -1
- package/lib/features/agent/chat/index.js +3 -0
- package/lib/features/agent/chat/index.js.map +1 -1
- package/lib/features/store/objects/DocumentSearchResults.js +2 -2
- package/lib/features/store/objects/DocumentSearchResults.js.map +1 -1
- package/lib/features/store/objects/components/ContentOverview.d.ts +2 -1
- package/lib/features/store/objects/components/ContentOverview.d.ts.map +1 -1
- package/lib/features/store/objects/components/ContentOverview.js +86 -15
- package/lib/features/store/objects/components/ContentOverview.js.map +1 -1
- package/lib/features/store/objects/components/DocumentEditingConfigurationSelector.d.ts +16 -0
- package/lib/features/store/objects/components/DocumentEditingConfigurationSelector.d.ts.map +1 -0
- package/lib/features/store/objects/components/DocumentEditingConfigurationSelector.js +116 -0
- package/lib/features/store/objects/components/DocumentEditingConfigurationSelector.js.map +1 -0
- package/lib/features/store/objects/components/DocumentEditingLockStatus.d.ts +7 -0
- package/lib/features/store/objects/components/DocumentEditingLockStatus.d.ts.map +1 -0
- package/lib/features/store/objects/components/DocumentEditingLockStatus.js +13 -0
- package/lib/features/store/objects/components/DocumentEditingLockStatus.js.map +1 -0
- package/lib/features/store/objects/components/DocumentEditingPanel.d.ts +48 -0
- package/lib/features/store/objects/components/DocumentEditingPanel.d.ts.map +1 -0
- package/lib/features/store/objects/components/DocumentEditingPanel.js +720 -0
- package/lib/features/store/objects/components/DocumentEditingPanel.js.map +1 -0
- package/lib/features/store/objects/components/TextEditorPanel.d.ts.map +1 -1
- package/lib/features/store/objects/components/TextEditorPanel.js +22 -9
- package/lib/features/store/objects/components/TextEditorPanel.js.map +1 -1
- package/lib/features/store/objects/components/documentArtifactRefs.d.ts +26 -0
- package/lib/features/store/objects/components/documentArtifactRefs.d.ts.map +1 -0
- package/lib/features/store/objects/components/documentArtifactRefs.js +52 -0
- package/lib/features/store/objects/components/documentArtifactRefs.js.map +1 -0
- package/lib/features/store/objects/components/documentEditingAgentConfig.d.ts +4 -0
- package/lib/features/store/objects/components/documentEditingAgentConfig.d.ts.map +1 -0
- package/lib/features/store/objects/components/documentEditingAgentConfig.js +40 -0
- package/lib/features/store/objects/components/documentEditingAgentConfig.js.map +1 -0
- package/lib/features/store/objects/components/documentEditingPrompts.d.ts +3 -0
- package/lib/features/store/objects/components/documentEditingPrompts.d.ts.map +1 -0
- package/lib/features/store/objects/components/documentEditingPrompts.js +13 -0
- package/lib/features/store/objects/components/documentEditingPrompts.js.map +1 -0
- package/lib/features/store/objects/components/documentEditingRun.d.ts +27 -0
- package/lib/features/store/objects/components/documentEditingRun.d.ts.map +1 -0
- package/lib/features/store/objects/components/documentEditingRun.js +126 -0
- package/lib/features/store/objects/components/documentEditingRun.js.map +1 -0
- package/lib/features/store/objects/components/documentEditingTarget.d.ts +20 -0
- package/lib/features/store/objects/components/documentEditingTarget.d.ts.map +1 -0
- package/lib/features/store/objects/components/documentEditingTarget.js +40 -0
- package/lib/features/store/objects/components/documentEditingTarget.js.map +1 -0
- package/lib/features/store/objects/components/index.d.ts +1 -0
- package/lib/features/store/objects/components/index.d.ts.map +1 -1
- package/lib/features/store/objects/components/index.js +1 -0
- package/lib/features/store/objects/components/index.js.map +1 -1
- package/lib/features/store/objects/components/useContentPanelHooks.d.ts +5 -1
- package/lib/features/store/objects/components/useContentPanelHooks.d.ts.map +1 -1
- package/lib/features/store/objects/components/useContentPanelHooks.js +53 -29
- package/lib/features/store/objects/components/useContentPanelHooks.js.map +1 -1
- package/lib/features/store/objects/components/useDownloadFile.d.ts +2 -1
- package/lib/features/store/objects/components/useDownloadFile.d.ts.map +1 -1
- package/lib/features/store/objects/components/useDownloadFile.js +3 -0
- package/lib/features/store/objects/components/useDownloadFile.js.map +1 -1
- package/lib/features/store/objects/selection/actions/StartWorkflowButton.js +1 -1
- package/lib/features/store/objects/selection/actions/StartWorkflowButton.js.map +1 -1
- package/lib/i18n/locales/ar.json +118 -1
- package/lib/i18n/locales/de.json +118 -1
- package/lib/i18n/locales/en.json +118 -0
- package/lib/i18n/locales/es.json +118 -1
- package/lib/i18n/locales/fr.json +118 -1
- package/lib/i18n/locales/it.json +118 -1
- package/lib/i18n/locales/ja.json +118 -1
- package/lib/i18n/locales/ko.json +118 -1
- package/lib/i18n/locales/pt.json +118 -1
- package/lib/i18n/locales/ru.json +118 -1
- package/lib/i18n/locales/tr.json +118 -1
- package/lib/i18n/locales/zh-TW.json +118 -1
- package/lib/i18n/locales/zh.json +118 -1
- package/lib/rich-text/EditorToolbar.d.ts +37 -0
- package/lib/rich-text/EditorToolbar.d.ts.map +1 -0
- package/lib/rich-text/EditorToolbar.js +215 -0
- package/lib/rich-text/EditorToolbar.js.map +1 -0
- package/lib/rich-text/VertesiaRichTextEditor.d.ts +26 -0
- package/lib/rich-text/VertesiaRichTextEditor.d.ts.map +1 -0
- package/lib/rich-text/VertesiaRichTextEditor.js +67 -0
- package/lib/rich-text/VertesiaRichTextEditor.js.map +1 -0
- package/lib/rich-text/index.d.ts +2 -0
- package/lib/rich-text/index.d.ts.map +1 -0
- package/lib/rich-text/index.js +2 -0
- package/lib/rich-text/index.js.map +1 -0
- package/lib/vertesia-ui-core.js +2 -2
- package/lib/vertesia-ui-core.js.map +1 -1
- package/lib/vertesia-ui-features.js +35 -30
- package/lib/vertesia-ui-features.js.map +1 -1
- package/lib/vertesia-ui-i18n.js +14 -14
- package/lib/vertesia-ui-i18n.js.map +1 -1
- package/lib/vertesia-ui-rich-text.js +5 -0
- package/lib/vertesia-ui-rich-text.js.map +1 -0
- package/lib/vertesia-ui-widgets.js +25 -7
- package/lib/vertesia-ui-widgets.js.map +1 -1
- package/lib/widgets/markdown/AgentResourceResolver.d.ts +31 -0
- package/lib/widgets/markdown/AgentResourceResolver.d.ts.map +1 -0
- package/lib/widgets/markdown/AgentResourceResolver.js +39 -0
- package/lib/widgets/markdown/AgentResourceResolver.js.map +1 -0
- package/lib/widgets/markdown/ArtifactEditingSurface.d.ts +63 -0
- package/lib/widgets/markdown/ArtifactEditingSurface.d.ts.map +1 -0
- package/lib/widgets/markdown/ArtifactEditingSurface.js +582 -0
- package/lib/widgets/markdown/ArtifactEditingSurface.js.map +1 -0
- package/lib/widgets/markdown/CollaborativeMarkdownRenderer.d.ts +69 -0
- package/lib/widgets/markdown/CollaborativeMarkdownRenderer.d.ts.map +1 -0
- package/lib/widgets/markdown/CollaborativeMarkdownRenderer.js +374 -0
- package/lib/widgets/markdown/CollaborativeMarkdownRenderer.js.map +1 -0
- package/lib/widgets/markdown/MarkdownLink.d.ts +3 -1
- package/lib/widgets/markdown/MarkdownLink.d.ts.map +1 -1
- package/lib/widgets/markdown/MarkdownLink.js +41 -14
- package/lib/widgets/markdown/MarkdownLink.js.map +1 -1
- package/lib/widgets/markdown/MarkdownRenderer.d.ts +8 -1
- package/lib/widgets/markdown/MarkdownRenderer.d.ts.map +1 -1
- package/lib/widgets/markdown/MarkdownRenderer.js +20 -4
- package/lib/widgets/markdown/MarkdownRenderer.js.map +1 -1
- package/lib/widgets/markdown/index.d.ts +5 -1
- package/lib/widgets/markdown/index.d.ts.map +1 -1
- package/lib/widgets/markdown/index.js +5 -1
- package/lib/widgets/markdown/index.js.map +1 -1
- package/lib/widgets/markdown/normalizeCustomSchemeLinks.d.ts.map +1 -1
- package/lib/widgets/markdown/normalizeCustomSchemeLinks.js +14 -2
- package/lib/widgets/markdown/normalizeCustomSchemeLinks.js.map +1 -1
- package/lib/widgets/markdown/textDiff.d.ts +52 -0
- package/lib/widgets/markdown/textDiff.d.ts.map +1 -0
- package/lib/widgets/markdown/textDiff.js +362 -0
- package/lib/widgets/markdown/textDiff.js.map +1 -0
- package/lib/widgets/markdown/useArtifactContent.d.ts +5 -3
- package/lib/widgets/markdown/useArtifactContent.d.ts.map +1 -1
- package/lib/widgets/markdown/useArtifactContent.js +6 -3
- package/lib/widgets/markdown/useArtifactContent.js.map +1 -1
- package/lib/widgets/markdown/useResolvedUrl.d.ts +1 -5
- package/lib/widgets/markdown/useResolvedUrl.d.ts.map +1 -1
- package/lib/widgets/markdown/useResolvedUrl.js +19 -31
- package/lib/widgets/markdown/useResolvedUrl.js.map +1 -1
- package/lib/widgets/xml-viewer/hooks/useXMLViewer.d.ts +9 -0
- package/lib/widgets/xml-viewer/hooks/useXMLViewer.d.ts.map +1 -1
- package/lib/widgets/xml-viewer/hooks/useXMLViewer.js +20 -17
- package/lib/widgets/xml-viewer/hooks/useXMLViewer.js.map +1 -1
- package/package.json +13 -9
- package/src/__tests__/a11y.test.tsx +4 -1
- package/src/__tests__/axe-helper.ts +17 -7
- package/src/__tests__/setup.ts +25 -0
- package/src/core/components/shadcn/filters/filterBar.tsx +1 -0
- package/src/core/components/shadcn/modal/dialog.tsx +3 -1
- package/src/core/components/shadcn/tabs.test.tsx +65 -0
- package/src/core/components/shadcn/tabs.tsx +25 -3
- package/src/features/agent/chat/AgentRightPanel.tsx +16 -1
- package/src/features/agent/chat/ArtifactsTab.test.tsx +55 -0
- package/src/features/agent/chat/ArtifactsTab.tsx +203 -52
- package/src/features/agent/chat/DocumentEditingActionCard.test.tsx +105 -0
- package/src/features/agent/chat/DocumentEditingActionCard.tsx +210 -0
- package/src/features/agent/chat/ModernAgentConversation.test.tsx +237 -40
- package/src/features/agent/chat/ModernAgentConversation.tsx +247 -75
- package/src/features/agent/chat/ModernAgentOutput/AgentMarkdownAnchor.test.tsx +79 -0
- package/src/features/agent/chat/ModernAgentOutput/AgentMarkdownAnchor.tsx +94 -0
- package/src/features/agent/chat/ModernAgentOutput/AllMessagesMixed.test.tsx +257 -34
- package/src/features/agent/chat/ModernAgentOutput/AllMessagesMixed.tsx +217 -105
- package/src/features/agent/chat/ModernAgentOutput/AttachmentPreview.tsx +17 -0
- package/src/features/agent/chat/ModernAgentOutput/CollapsibleAgentMarkdown.test.tsx +44 -0
- package/src/features/agent/chat/ModernAgentOutput/CollapsibleAgentMarkdown.tsx +88 -0
- package/src/features/agent/chat/ModernAgentOutput/MessageItem.tsx +30 -46
- package/src/features/agent/chat/ModernAgentOutput/ResourceChangeSummary.tsx +40 -0
- package/src/features/agent/chat/ModernAgentOutput/ResourceChip.test.tsx +148 -0
- package/src/features/agent/chat/ModernAgentOutput/ResourceChip.tsx +141 -0
- package/src/features/agent/chat/ModernAgentOutput/ToolCallGroup.tsx +33 -1
- package/src/features/agent/chat/ModernAgentOutput/resourceLinks.tsx +43 -0
- package/src/features/agent/chat/ModernAgentOutput/resourceSummary.test.ts +229 -0
- package/src/features/agent/chat/ModernAgentOutput/resourceSummary.ts +152 -0
- package/src/features/agent/chat/ModernAgentOutput/utils.test.ts +17 -0
- package/src/features/agent/chat/ModernAgentOutput/utils.ts +14 -1
- package/src/features/agent/chat/hooks/useAgentStream.test.tsx +188 -0
- package/src/features/agent/chat/hooks/useAgentStream.ts +28 -8
- package/src/features/agent/chat/index.ts +11 -0
- package/src/features/store/objects/DocumentSearchResults.tsx +2 -2
- package/src/features/store/objects/components/ContentOverview.tsx +216 -65
- package/src/features/store/objects/components/DocumentEditingConfigurationSelector.test.ts +34 -0
- package/src/features/store/objects/components/DocumentEditingConfigurationSelector.tsx +211 -0
- package/src/features/store/objects/components/DocumentEditingLockStatus.test.tsx +32 -0
- package/src/features/store/objects/components/DocumentEditingLockStatus.tsx +45 -0
- package/src/features/store/objects/components/DocumentEditingPanel.test.tsx +336 -0
- package/src/features/store/objects/components/DocumentEditingPanel.tsx +1236 -0
- package/src/features/store/objects/components/TextEditorPanel.test.tsx +48 -0
- package/src/features/store/objects/components/TextEditorPanel.tsx +41 -20
- package/src/features/store/objects/components/documentArtifactRefs.test.ts +65 -0
- package/src/features/store/objects/components/documentArtifactRefs.ts +72 -0
- package/src/features/store/objects/components/documentEditingAgentConfig.test.ts +28 -0
- package/src/features/store/objects/components/documentEditingAgentConfig.ts +41 -0
- package/src/features/store/objects/components/documentEditingPrompts.test.ts +26 -0
- package/src/features/store/objects/components/documentEditingPrompts.ts +12 -0
- package/src/features/store/objects/components/documentEditingRun.test.ts +176 -0
- package/src/features/store/objects/components/documentEditingRun.ts +184 -0
- package/src/features/store/objects/components/documentEditingTarget.test.ts +96 -0
- package/src/features/store/objects/components/documentEditingTarget.ts +63 -0
- package/src/features/store/objects/components/index.ts +1 -0
- package/src/features/store/objects/components/useContentPanelHooks.ts +52 -27
- package/src/features/store/objects/components/useDownloadFile.test.ts +20 -0
- package/src/features/store/objects/components/useDownloadFile.ts +5 -1
- package/src/features/store/objects/selection/actions/StartWorkflowButton.tsx +2 -2
- package/src/i18n/locales/ar.json +118 -1
- package/src/i18n/locales/de.json +118 -1
- package/src/i18n/locales/en.json +118 -0
- package/src/i18n/locales/es.json +118 -1
- package/src/i18n/locales/fr.json +118 -1
- package/src/i18n/locales/it.json +118 -1
- package/src/i18n/locales/ja.json +118 -1
- package/src/i18n/locales/ko.json +118 -1
- package/src/i18n/locales/pt.json +118 -1
- package/src/i18n/locales/ru.json +118 -1
- package/src/i18n/locales/tr.json +118 -1
- package/src/i18n/locales/zh-TW.json +118 -1
- package/src/i18n/locales/zh.json +118 -1
- package/src/rich-text/EditorToolbar.tsx +708 -0
- package/src/rich-text/VertesiaRichTextEditor.test.tsx +211 -0
- package/src/rich-text/VertesiaRichTextEditor.tsx +241 -0
- package/src/rich-text/index.ts +9 -0
- package/src/session/UserSession.test.ts +11 -11
- package/src/widgets/markdown/AgentResourceResolver.test.ts +24 -0
- package/src/widgets/markdown/AgentResourceResolver.tsx +70 -0
- package/src/widgets/markdown/ArtifactEditingSurface.test.tsx +537 -0
- package/src/widgets/markdown/ArtifactEditingSurface.tsx +878 -0
- package/src/widgets/markdown/CollaborativeMarkdownRenderer.test.tsx +484 -0
- package/src/widgets/markdown/CollaborativeMarkdownRenderer.tsx +825 -0
- package/src/widgets/markdown/MarkdownLink.test.tsx +122 -0
- package/src/widgets/markdown/MarkdownLink.tsx +102 -17
- package/src/widgets/markdown/MarkdownRenderer.tsx +30 -3
- package/src/widgets/markdown/index.ts +39 -1
- package/src/widgets/markdown/normalizeCustomSchemeLinks.ts +15 -2
- package/src/widgets/markdown/textDiff.test.ts +156 -0
- package/src/widgets/markdown/textDiff.ts +399 -0
- package/src/widgets/markdown/useArtifactContent.ts +9 -3
- package/src/widgets/markdown/useResolvedUrl.test.ts +29 -40
- package/src/widgets/markdown/useResolvedUrl.ts +33 -35
- package/src/widgets/xml-viewer/hooks/useXMLViewer.test.ts +26 -0
- package/src/widgets/xml-viewer/hooks/useXMLViewer.ts +23 -18
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vertesia-ui-rich-text.js","names":["_jsx","cn","_jsx","_jsxs","cn","_Fragment","_jsxs","_jsx","_jsx","_jsxs","makeSvgResponsive","_jsx","_jsx","makeSvgResponsive","_jsxs","_jsx","_jsx","_jsx","INLINE_CODE_REGEX","FENCED_CODE_BLOCK_REGEX","defaultCodeBlockHandlers","_jsx","_jsx","_jsxs","_Fragment","_jsx","_jsxs"],"sources":["widgets/markdown/CodeBlockContext.js","widgets/markdown/CodeBlockRendering.js","core/components/libs/utils.js","features/agent/chat/useArtifactUrlCache.js","features/agent/chat/VegaLiteChart.js","widgets/markdown/CodeBlockPlaceholder.js","widgets/markdown/ArtifactContentRenderer.js","widgets/markdown/MermaidDiagram.js","widgets/markdown/useArtifactContent.js","widgets/markdown/codeBlockHandlers.js","widgets/markdown/useResolvedUrl.js","widgets/markdown/MarkdownFigure.js","widgets/markdown/MarkdownImage.js","widgets/markdown/AgentResourceResolver.js","widgets/markdown/MarkdownLink.js","widgets/markdown/normalizeCustomSchemeLinks.js","widgets/markdown/normalizeDirectives.js","widgets/markdown/preprocessMathDelimiters.js","widgets/markdown/remarkDirectiveHandler.js","widgets/markdown/MarkdownRenderer.js","rich-text/EditorToolbar.js","rich-text/VertesiaRichTextEditor.js"],"sourcesContent":["import { jsx as _jsx } from \"react/jsx-runtime\";\nimport React, { useMemo } from 'react';\nconst CodeBlockContext = React.createContext({});\nexport function CodeBlockHandlerProvider({ children, artifactRunId, onProposalSelect, onProposalSubmit, MarkdownRenderer, }) {\n const value = useMemo(() => ({ artifactRunId, onProposalSelect, onProposalSubmit, MarkdownRenderer }), [artifactRunId, onProposalSelect, onProposalSubmit, MarkdownRenderer]);\n return _jsx(CodeBlockContext.Provider, { value: value, children: children });\n}\nexport function useCodeBlockContext() {\n return React.useContext(CodeBlockContext);\n}\n//# sourceMappingURL=CodeBlockContext.js.map","import { jsx as _jsx } from \"react/jsx-runtime\";\nimport { createContext, useContext, useMemo } from 'react';\nexport class CodeBlockRendererRegistry {\n components = {};\n registerComponent(language, component) {\n this.components[language] = component;\n }\n getComponent(language) {\n return this.components[language];\n }\n}\nconst Context = createContext(null);\n/**\n * the compoennts must be memoized to avoid rerendering the provider unnecessarily\n * @param param0\n * @returns\n */\nexport function CodeBlockRendererProvider({ components, children }) {\n const registry = useMemo(() => {\n const registry = new CodeBlockRendererRegistry();\n for (const [language, component] of Object.entries(components)) {\n registry.registerComponent(language, component);\n }\n return registry;\n }, [components]);\n return _jsx(Context.Provider, { value: registry, children: children });\n}\nexport function useCodeBlockRendererRegistry() {\n return useContext(Context);\n}\nexport function useCodeBlockComponent(language) {\n const registry = useContext(Context);\n if (registry) {\n return registry.getComponent(language);\n }\n return undefined;\n}\n//# sourceMappingURL=CodeBlockRendering.js.map","import { clsx } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\nexport function cn(...inputs) {\n return twMerge(clsx(inputs));\n}\n//# sourceMappingURL=utils.js.map","import { jsx as _jsx } from \"react/jsx-runtime\";\nimport React, { createContext, useCallback, useContext, useRef } from 'react';\nconst ArtifactUrlCacheContext = createContext(null);\n/**\n * Provider component that maintains a cache of resolved artifact URLs.\n * This prevents re-fetching the same artifact URL multiple times during re-renders.\n */\nexport function ArtifactUrlCacheProvider({ children }) {\n const cacheRef = useRef(new Map());\n const pendingRef = useRef(new Map());\n const getUrl = useCallback((key) => {\n return cacheRef.current.get(key);\n }, []);\n const setUrl = useCallback((key, url) => {\n cacheRef.current.set(key, url);\n }, []);\n const getOrFetch = useCallback(async (key, fetcher) => {\n // Return cached URL if available\n const cached = cacheRef.current.get(key);\n if (cached) {\n return cached;\n }\n // Return pending promise if a fetch is already in progress\n const pending = pendingRef.current.get(key);\n if (pending) {\n return pending;\n }\n // Start new fetch and cache the promise\n const promise = fetcher()\n .then((url) => {\n cacheRef.current.set(key, url);\n pendingRef.current.delete(key);\n return url;\n })\n .catch((err) => {\n pendingRef.current.delete(key);\n throw err;\n });\n pendingRef.current.set(key, promise);\n return promise;\n }, []);\n const value = React.useMemo(() => ({ getUrl, setUrl, getOrFetch }), [getUrl, setUrl, getOrFetch]);\n return _jsx(ArtifactUrlCacheContext.Provider, { value: value, children: children });\n}\n/**\n * Hook to access the artifact URL cache.\n * Returns null if used outside of ArtifactUrlCacheProvider.\n */\nexport function useArtifactUrlCache() {\n return useContext(ArtifactUrlCacheContext);\n}\n/**\n * Whether an artifact: path points directly into the project bucket\n * (agents/ run prefixes, documents/ repository copies made by create_document)\n * rather than being a run-local shorthand like out/chart.png.\n */\nexport function isProjectFilePath(path) {\n return path.startsWith('agents/') || path.startsWith('documents/');\n}\n/**\n * Generate a cache key for an artifact URL.\n */\nexport function getArtifactCacheKey(runId, path, disposition = 'inline') {\n return `artifact:${runId}:${path}:${disposition}`;\n}\n/**\n * Generate a cache key for a file URL.\n */\nexport function getFileCacheKey(path) {\n return `file:${path}`;\n}\n//# sourceMappingURL=useArtifactUrlCache.js.map","import { jsxs as _jsxs, jsx as _jsx, Fragment as _Fragment } from \"react/jsx-runtime\";\nimport * as DialogPrimitive from '@radix-ui/react-dialog';\nimport { Button } from '@vertesia/ui/core';\nimport { useUITranslation } from '@vertesia/ui/i18n';\nimport { useUserSession } from '@vertesia/ui/session';\nimport { Check, Copy, Download, Loader2, Maximize2, Minimize2, X } from 'lucide-react';\nimport Papa from 'papaparse';\nimport { memo, useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { VegaEmbed } from 'react-vega';\nimport { cn } from '../../../core/components/libs/utils';\nimport { getArtifactCacheKey, getFileCacheKey, isProjectFilePath, useArtifactUrlCache } from './useArtifactUrlCache';\n// Constants\nconst DEFAULT_CHART_HEIGHT = 280;\nconst DEFAULT_DASHBOARD_HEIGHT = 500;\n// Error display component\nfunction VegaErrorDisplay({ error, chartTitle }) {\n return (_jsx(\"div\", { className: \"flex items-center justify-center h-full bg-red-50 dark:bg-red-950 rounded-md p-4\", children: _jsxs(\"div\", { className: \"text-center\", children: [_jsxs(\"p\", { className: \"text-sm font-medium text-red-600 dark:text-red-400\", children: [\"Cannot render \", chartTitle || 'Vega-Lite', \" chart\"] }), _jsx(\"p\", { className: \"text-xs text-red-500 dark:text-red-500 mt-1 max-w-xs truncate\", children: error })] }) }));\n}\n// Fullscreen dialog component with smooth animations\nfunction FullscreenDialog({ isOpen, onClose, title, description, children, }) {\n const { t } = useUITranslation();\n return (_jsx(DialogPrimitive.Root, { open: isOpen, onOpenChange: (open) => !open && onClose(), children: _jsxs(DialogPrimitive.Portal, { children: [_jsx(DialogPrimitive.Overlay, { className: \"fixed inset-0 z-50 bg-black/80 backdrop-blur-sm transition-all duration-300 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\" }), _jsxs(DialogPrimitive.Content, { className: \"fixed inset-2 sm:inset-4 z-50 flex flex-col bg-white dark:bg-gray-900 rounded-xl shadow-2xl transition-all duration-300 ease-out data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-98 data-[state=open]:zoom-in-98 data-[state=closed]:slide-out-to-bottom-2 data-[state=open]:slide-in-from-bottom-2\", onEscapeKeyDown: onClose, children: [_jsx(DialogPrimitive.Close, { asChild: true, children: _jsx(Button, { variant: \"unstyled\", onClick: onClose, className: \"absolute top-3 end-3 z-10 p-2 rounded-lg bg-white/80 dark:bg-gray-800/80 backdrop-blur-sm hover:bg-gray-100 dark:hover:bg-gray-700 transition-colors duration-150 shadow-sm\", \"aria-label\": t('agent.closeFullscreen'), children: _jsx(X, { className: \"w-5 h-5 text-gray-600 dark:text-gray-300\" }) }) }), _jsx(\"div\", { className: \"flex-1 overflow-auto p-4 sm:p-6 animate-in fade-in-0 duration-500 delay-150\", children: children }), _jsx(\"div\", { className: \"flex items-center justify-between px-4 sm:px-6 py-3 border-t border-gray-200 dark:border-gray-800 bg-gray-50/50 dark:bg-gray-800/50 rounded-b-xl\", children: _jsxs(\"div\", { className: \"flex flex-col\", children: [_jsx(DialogPrimitive.Title, { className: \"text-base font-semibold text-gray-900 dark:text-gray-100\", children: title || t('agent.dashboard') }), description && (_jsx(DialogPrimitive.Description, { className: \"text-sm text-gray-500 dark:text-gray-400 mt-0.5\", children: description }))] }) })] })] }) }));\n}\n// Calculate height based on spec complexity\nfunction calculateAutoHeight(spec, mode) {\n if (mode === 'chart') {\n return DEFAULT_CHART_HEIGHT;\n }\n // For dashboard mode, try to calculate based on spec structure\n let rowCount = 1;\n if (spec.vconcat) {\n rowCount = Array.isArray(spec.vconcat) ? spec.vconcat.length : 1;\n }\n else if (spec.concat) {\n const columns = spec.columns || 2;\n const items = Array.isArray(spec.concat) ? spec.concat.length : 1;\n rowCount = Math.ceil(items / columns);\n }\n else if (spec.facet) {\n // Faceted charts - estimate based on data\n rowCount = 2; // Default estimate\n }\n // Base height per row + padding\n return Math.max(DEFAULT_DASHBOARD_HEIGHT, rowCount * 280 + 40);\n}\n// Modern color palette - vibrant but professional\nconst CHART_COLORS = {\n // Primary palette - vibrant gradients\n categorical: [\n '#6366f1', // indigo\n '#8b5cf6', // violet\n '#ec4899', // pink\n '#f43f5e', // rose\n '#f97316', // orange\n '#eab308', // yellow\n '#22c55e', // green\n '#14b8a6', // teal\n '#06b6d4', // cyan\n '#3b82f6', // blue\n ],\n // Sequential schemes\n blues: ['#dbeafe', '#93c5fd', '#3b82f6', '#1d4ed8', '#1e3a8a'],\n purples: ['#f3e8ff', '#c4b5fd', '#8b5cf6', '#6d28d9', '#4c1d95'],\n greens: ['#dcfce7', '#86efac', '#22c55e', '#15803d', '#14532d'],\n // Diverging\n diverging: ['#ef4444', '#fca5a5', '#fef3c7', '#86efac', '#22c55e'],\n};\nfunction isRecord(value) {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\nfunction isVegaSpecObject(value) {\n return isRecord(value);\n}\n/**\n * Preprocess a Vega-Lite spec to fix duplicate signal names that occur\n * when params with selections are used in vconcat/hconcat layouts.\n *\n * The issue: Vega-Lite creates internal signals like `paramName_tuple` for\n * point selections. When a param is defined at the root level of a vconcat/hconcat\n * spec, Vega-Lite's compiler creates duplicate signals when propagating the\n * selection to sub-views.\n *\n * Solution: Move selection params from the root level to the first sub-view\n * (where selections typically originate). Cross-view references are preserved\n * so that clicking in one view filters other views.\n */\nfunction fixVegaLiteSelectionParams(spec) {\n // Deep clone the spec to avoid mutations\n const result = JSON.parse(JSON.stringify(spec));\n // Check if this is a concatenated spec with root-level selection params\n const concatKeys = ['vconcat', 'hconcat', 'concat'];\n const hasConcatViews = concatKeys.some((key) => Array.isArray(result[key]));\n if (!hasConcatViews) {\n // Not a concatenated spec, no special handling needed\n return result;\n }\n // Check for selection params at the root level\n const rootSelectionParams = [];\n if (Array.isArray(result.params)) {\n for (const param of result.params) {\n if (param && typeof param === 'object' && param.name && param.select) {\n rootSelectionParams.push({ name: param.name, param });\n }\n }\n }\n if (rootSelectionParams.length === 0) {\n // No selection params at root level, no special handling needed\n return result;\n }\n // Strategy: Move the selection param to the first sub-view that has an\n // encoding field matching the selection. Keep cross-view references intact\n // so filtering works across views.\n for (const { name: paramName, param } of rootSelectionParams) {\n const selectFields = param.select?.fields || [];\n const hasLegendBinding = param.select?.bind === 'legend';\n // Find the concat array\n let concatArray = null;\n for (const key of concatKeys) {\n if (Array.isArray(result[key])) {\n concatArray = result[key];\n break;\n }\n }\n if (!concatArray || concatArray.length === 0)\n continue;\n // Find the first view that has the selection field in its encoding\n // This is typically where users click to make selections\n let targetViewIndex = 0;\n for (let i = 0; i < concatArray.length; i++) {\n const view = concatArray[i];\n if (viewHasField(view, selectFields) || (hasLegendBinding && viewHasColorEncoding(view, selectFields))) {\n targetViewIndex = i;\n break;\n }\n }\n // Move the param to the target view\n const targetView = concatArray[targetViewIndex];\n if (!targetView.params) {\n targetView.params = [];\n }\n targetView.params.push(param);\n // Remove the param from root level\n const params = result.params ?? [];\n result.params = params.filter((p) => p.name !== paramName);\n // Cross-view references are kept intact - Vega-Lite handles signal\n // propagation from the view where the selection is defined to other views\n }\n // Clean up empty params array at root\n if (Array.isArray(result.params) && result.params.length === 0) {\n delete result.params;\n }\n return result;\n}\n/**\n * Apply parameter values to a Vega-Lite spec.\n * Updates the 'value' field of named params, allowing models to set\n * initial values for interactive controls (sliders, dropdowns, etc.).\n * @exported for testing\n */\nexport function applyParameterValues(spec, parameterValues) {\n if (!parameterValues || Object.keys(parameterValues).length === 0) {\n return spec;\n }\n const result = JSON.parse(JSON.stringify(spec));\n // Helper to update params in a view\n const updateParams = (params) => {\n for (const param of params) {\n if (param.name && param.name in parameterValues) {\n param.value = parameterValues[param.name];\n }\n }\n };\n // Update root-level params\n if (Array.isArray(result.params)) {\n updateParams(result.params);\n }\n // Update params in nested views (vconcat, hconcat, concat)\n const updateNestedViews = (views) => {\n if (!Array.isArray(views))\n return;\n for (const view of views) {\n if (Array.isArray(view.params)) {\n updateParams(view.params);\n }\n // Recursively handle nested concatenations\n if (view.vconcat)\n updateNestedViews(view.vconcat);\n if (view.hconcat)\n updateNestedViews(view.hconcat);\n if (view.concat)\n updateNestedViews(view.concat);\n // Handle layers\n if (Array.isArray(view.layer)) {\n for (const layer of view.layer) {\n if (Array.isArray(layer.params)) {\n updateParams(layer.params);\n }\n }\n }\n }\n };\n if (result.vconcat)\n updateNestedViews(result.vconcat);\n if (result.hconcat)\n updateNestedViews(result.hconcat);\n if (result.concat)\n updateNestedViews(result.concat);\n if (Array.isArray(result.layer)) {\n for (const layer of result.layer) {\n if (layer && Array.isArray(layer.params)) {\n updateParams(layer.params);\n }\n }\n }\n return result;\n}\n/**\n * Check if a view has encoding using any of the specified fields.\n */\nfunction viewHasField(view, fields) {\n if (!view?.encoding)\n return false;\n for (const field of fields) {\n for (const channel of Object.values(view.encoding)) {\n if (channel.field === field) {\n return true;\n }\n }\n }\n // Also check nested layers\n if (Array.isArray(view.layer)) {\n for (const layer of view.layer) {\n if (viewHasField(layer, fields))\n return true;\n }\n }\n return false;\n}\n/**\n * Check if a view has color encoding using any of the specified fields.\n */\nfunction viewHasColorEncoding(view, fields) {\n if (!view)\n return false;\n const checkEncoding = (encoding) => {\n if (!encoding)\n return false;\n const colorField = encoding.color?.field;\n return !!colorField && fields.includes(colorField);\n };\n if (checkEncoding(view.encoding))\n return true;\n // Check nested layers\n if (Array.isArray(view.layer)) {\n for (const layer of view.layer) {\n if (checkEncoding(layer.encoding))\n return true;\n }\n }\n return false;\n}\n/**\n * Walk the Vega-Lite spec and find all artifact: URL references in data.url fields.\n * Returns an array of references with their paths in the spec tree.\n */\nfunction findArtifactReferences(spec, currentPath = []) {\n const references = [];\n if (!spec || typeof spec !== 'object') {\n return references;\n }\n // Check if this object has a data.url that's an artifact reference\n if (spec.data && typeof spec.data === 'object') {\n const url = spec.data.url;\n if (typeof url === 'string' && url.startsWith('artifact:')) {\n references.push({\n path: [...currentPath, 'data'],\n artifactPath: url.replace(/^artifact:/, '').trim(),\n });\n }\n }\n // Recursively check nested objects (layer, vconcat, hconcat, concat, spec, etc.)\n const nestedKeys = ['layer', 'vconcat', 'hconcat', 'concat', 'spec', 'repeat', 'facet'];\n for (const key of nestedKeys) {\n if (key in spec) {\n const value = spec[key];\n if (Array.isArray(value)) {\n value.forEach((item, index) => {\n if (isVegaSpecObject(item)) {\n references.push(...findArtifactReferences(item, [...currentPath, key, String(index)]));\n }\n });\n }\n else if (isVegaSpecObject(value)) {\n references.push(...findArtifactReferences(value, [...currentPath, key]));\n }\n }\n }\n return references;\n}\n/**\n * Deep clone and update the spec by replacing artifact URLs with resolved data values.\n */\nfunction replaceArtifactData(spec, resolvedData) {\n const result = JSON.parse(JSON.stringify(spec));\n for (const [pathKey, data] of resolvedData) {\n const path = pathKey.split('.');\n let current = result;\n // Navigate to the parent of the data object\n for (let i = 0; i < path.length - 1; i++) {\n const next = current[path[i]];\n if (!isRecord(next)) {\n break;\n }\n current = next;\n }\n // Replace data.url with data.values\n const lastKey = path[path.length - 1];\n const target = current[lastKey];\n if (isRecord(target)) {\n delete target.url;\n target.values = data;\n }\n }\n return result;\n}\n// Get dark mode config for Vega with enhanced styling\nfunction getDarkModeConfig(isDark) {\n const baseConfig = {\n background: 'transparent',\n view: { stroke: 'transparent' },\n // Modern color range\n range: {\n category: CHART_COLORS.categorical,\n diverging: CHART_COLORS.diverging,\n heatmap: CHART_COLORS.purples,\n ramp: CHART_COLORS.blues,\n },\n // Enable tooltips by default for all mark types with enhanced styling\n mark: { tooltip: true },\n bar: {\n tooltip: true,\n cornerRadiusTopLeft: 4,\n cornerRadiusTopRight: 4,\n },\n line: {\n tooltip: true,\n strokeWidth: 2.5,\n strokeCap: 'round',\n },\n point: {\n tooltip: true,\n size: 60,\n filled: true,\n },\n area: {\n tooltip: true,\n fillOpacity: 0.7,\n line: true,\n },\n rect: {\n tooltip: true,\n cornerRadius: 2,\n },\n arc: {\n tooltip: true,\n cornerRadius: 4,\n },\n circle: {\n tooltip: true,\n size: 80,\n },\n };\n if (isDark) {\n return {\n ...baseConfig,\n axis: {\n labelColor: '#a1a1aa',\n titleColor: '#e4e4e7',\n gridColor: '#3f3f46',\n domainColor: '#52525b',\n tickColor: '#52525b',\n labelFont: 'Inter, system-ui, sans-serif',\n titleFont: 'Inter, system-ui, sans-serif',\n labelFontSize: 11,\n titleFontSize: 12,\n titleFontWeight: 500,\n },\n legend: {\n labelColor: '#a1a1aa',\n titleColor: '#e4e4e7',\n labelFont: 'Inter, system-ui, sans-serif',\n titleFont: 'Inter, system-ui, sans-serif',\n labelFontSize: 11,\n titleFontSize: 12,\n symbolSize: 100,\n },\n title: {\n color: '#fafafa',\n font: 'Inter, system-ui, sans-serif',\n fontSize: 14,\n fontWeight: 600,\n },\n };\n }\n return {\n ...baseConfig,\n axis: {\n labelColor: '#71717a',\n titleColor: '#3f3f46',\n gridColor: '#e4e4e7',\n domainColor: '#d4d4d8',\n tickColor: '#d4d4d8',\n labelFont: 'Inter, system-ui, sans-serif',\n titleFont: 'Inter, system-ui, sans-serif',\n labelFontSize: 11,\n titleFontSize: 12,\n titleFontWeight: 500,\n },\n legend: {\n labelColor: '#71717a',\n titleColor: '#3f3f46',\n labelFont: 'Inter, system-ui, sans-serif',\n titleFont: 'Inter, system-ui, sans-serif',\n labelFontSize: 11,\n titleFontSize: 12,\n symbolSize: 100,\n },\n title: {\n color: '#18181b',\n font: 'Inter, system-ui, sans-serif',\n fontSize: 14,\n fontWeight: 600,\n },\n };\n}\nexport const VegaLiteChart = memo(function VegaLiteChart({ spec, artifactRunId }) {\n const { t } = useUITranslation();\n const { title, description, options } = spec;\n const vegaSpec = spec.spec;\n const [isExporting, setIsExporting] = useState(false);\n const [isCopied, setIsCopied] = useState(false);\n const [error, setError] = useState(null);\n const [isFullscreen, setIsFullscreen] = useState(false);\n const viewRef = useRef(null);\n const fullscreenViewRef = useRef(null);\n const containerRef = useRef(null);\n // Artifact resolution state\n const { client } = useUserSession();\n const urlCache = useArtifactUrlCache();\n // Use refs to avoid triggering effect re-runs when these stable values are accessed\n const clientRef = useRef(client);\n clientRef.current = client;\n const urlCacheRef = useRef(urlCache);\n urlCacheRef.current = urlCache;\n const [resolvedSpec, setResolvedSpec] = useState(null);\n const [isLoadingArtifacts, setIsLoadingArtifacts] = useState(false);\n const [artifactError, setArtifactError] = useState(null);\n // Determine mode and settings\n const mode = options?.mode || 'chart';\n const isDashboard = mode === 'dashboard';\n const showFullscreenButton = options?.enableFullscreen ?? isDashboard;\n // Calculate height\n const baseHeight = options?.height || calculateAutoHeight(vegaSpec, mode);\n // Resolve artifact URLs in the spec\n useEffect(() => {\n const references = findArtifactReferences(vegaSpec);\n // If no artifact references, use original spec\n if (references.length === 0) {\n setResolvedSpec(vegaSpec);\n setIsLoadingArtifacts(false);\n setArtifactError(null);\n return;\n }\n if (!artifactRunId) {\n console.warn('[VegaLiteChart] artifact references found but artifactRunId is missing!', {\n references: references.map((r) => r.artifactPath),\n artifactRunId,\n });\n }\n else {\n console.info('[VegaLiteChart] resolving artifacts with runId:', artifactRunId, references.map((r) => r.artifactPath));\n }\n let cancelled = false;\n setIsLoadingArtifacts(true);\n setArtifactError(null);\n const resolveArtifacts = async () => {\n const resolvedData = new Map();\n const currentClient = clientRef.current;\n const currentUrlCache = urlCacheRef.current;\n for (const ref of references) {\n try {\n const pathKey = ref.path.join('.');\n let url;\n // Determine if this is a shorthand path or full path\n if (artifactRunId && !isProjectFilePath(ref.artifactPath)) {\n // Shorthand path - use artifact API\n const cacheKey = getArtifactCacheKey(artifactRunId, ref.artifactPath, 'inline');\n if (currentUrlCache) {\n url = await currentUrlCache.getOrFetch(cacheKey, async () => {\n const result = await currentClient.files.getArtifactDownloadUrl(artifactRunId, ref.artifactPath, 'inline');\n return result.url;\n });\n }\n else {\n const result = await currentClient.files.getArtifactDownloadUrl(artifactRunId, ref.artifactPath, 'inline');\n url = result.url;\n }\n }\n else {\n // Full path - use files API\n const cacheKey = getFileCacheKey(ref.artifactPath);\n if (currentUrlCache) {\n url = await currentUrlCache.getOrFetch(cacheKey, async () => {\n const result = await currentClient.files.getDownloadUrl(ref.artifactPath);\n return result.url;\n });\n }\n else {\n const result = await currentClient.files.getDownloadUrl(ref.artifactPath);\n url = result.url;\n }\n }\n // Fetch the data from the resolved URL\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`Failed to fetch artifact data: ${response.statusText}`);\n }\n // Detect CSV files by artifact path extension\n const isCsv = ref.artifactPath.toLowerCase().endsWith('.csv');\n let data;\n if (isCsv) {\n // Parse CSV to JSON array\n const csvText = await response.text();\n const parseResult = Papa.parse(csvText, {\n header: true,\n skipEmptyLines: true,\n dynamicTyping: true, // Auto-convert numbers and booleans\n });\n data = parseResult.data;\n }\n else {\n // Parse as JSON\n const jsonData = await response.json();\n data = Array.isArray(jsonData) ? jsonData : [jsonData];\n }\n resolvedData.set(pathKey, data);\n }\n catch (err) {\n console.error(`Failed to resolve artifact: ${ref.artifactPath}`, err);\n if (!cancelled) {\n setArtifactError(`Failed to load data from artifact: ${ref.artifactPath}`);\n }\n return;\n }\n }\n if (!cancelled) {\n const newSpec = replaceArtifactData(vegaSpec, resolvedData);\n setResolvedSpec(newSpec);\n setIsLoadingArtifacts(false);\n }\n };\n void resolveArtifacts();\n return () => {\n cancelled = true;\n };\n }, [vegaSpec, artifactRunId]);\n // Detect dark mode\n const [isDarkMode, setIsDarkMode] = useState(false);\n const isDarkModeRef = useRef(false);\n useEffect(() => {\n const checkDarkMode = () => {\n const newDarkMode = document.documentElement.classList.contains('dark');\n // Only update state if dark mode actually changed\n if (newDarkMode !== isDarkModeRef.current) {\n isDarkModeRef.current = newDarkMode;\n setIsDarkMode(newDarkMode);\n }\n };\n checkDarkMode();\n const observer = new MutationObserver(checkDarkMode);\n observer.observe(document.documentElement, { attributes: true, attributeFilter: ['class'] });\n return () => observer.disconnect();\n }, []);\n // Track container width for responsive sizing\n const [containerWidth, setContainerWidth] = useState(0);\n const containerWidthRef = useRef(0);\n useEffect(() => {\n if (!containerRef.current)\n return;\n let resizeTimeout;\n const resizeObserver = new ResizeObserver((entries) => {\n // Debounce resize callbacks to ~100ms to avoid excessive state updates\n clearTimeout(resizeTimeout);\n resizeTimeout = setTimeout(() => {\n const width = entries[0]?.contentRect.width;\n if (width && width !== containerWidthRef.current) {\n containerWidthRef.current = width;\n setContainerWidth(width);\n }\n }, 100);\n });\n resizeObserver.observe(containerRef.current);\n // Initial width\n const initialWidth = containerRef.current.clientWidth;\n containerWidthRef.current = initialWidth;\n setContainerWidth(initialWidth);\n return () => {\n clearTimeout(resizeTimeout);\n resizeObserver.disconnect();\n };\n }, []);\n // Check if there are artifact references that need resolution\n const hasArtifactReferences = useMemo(() => {\n return findArtifactReferences(vegaSpec).length > 0;\n }, [vegaSpec]);\n // Memoize the processed spec to fix Vega-Lite selection param issues\n // This handles the duplicate signal problem in concatenated views\n const processedSpec = useMemo(() => {\n // If there are artifact references, we must wait for resolvedSpec\n // Don't fall back to vegaSpec which contains artifact: URLs\n if (hasArtifactReferences && !resolvedSpec) {\n return null;\n }\n let specToUse = resolvedSpec || vegaSpec;\n if (!specToUse)\n return null;\n // Apply parameter values if provided (allows model to set initial slider/dropdown values)\n if (options?.parameterValues) {\n specToUse = applyParameterValues(specToUse, options.parameterValues);\n }\n return fixVegaLiteSelectionParams(specToUse);\n }, [resolvedSpec, vegaSpec, hasArtifactReferences, options?.parameterValues]);\n // Scale widths in concatenated views to fit container\n const scaleSpecWidths = useCallback((spec, availableWidth) => {\n if (!spec || typeof spec !== 'object')\n return spec;\n // Handle hconcat - distribute width among children\n if (spec.hconcat && Array.isArray(spec.hconcat)) {\n const childCount = spec.hconcat.length;\n const spacing = spec.spacing ?? 10;\n const totalSpacing = spacing * (childCount - 1);\n const widthPerChild = Math.floor((availableWidth - totalSpacing) / childCount);\n return {\n ...spec,\n hconcat: spec.hconcat.map((child) => scaleSpecWidths(child, widthPerChild)),\n };\n }\n // Handle vconcat - each child gets full width\n if (spec.vconcat && Array.isArray(spec.vconcat)) {\n return {\n ...spec,\n vconcat: spec.vconcat.map((child) => scaleSpecWidths(child, availableWidth)),\n };\n }\n // Handle generic concat with columns\n if (spec.concat && Array.isArray(spec.concat)) {\n const columns = spec.columns ?? spec.concat.length;\n const spacing = spec.spacing ?? 10;\n const totalSpacing = spacing * (columns - 1);\n const widthPerChild = Math.floor((availableWidth - totalSpacing) / columns);\n return {\n ...spec,\n concat: spec.concat.map((child) => scaleSpecWidths(child, widthPerChild)),\n };\n }\n // For leaf views, set width if it's \"container\" or larger than available\n const currentWidth = spec.width;\n if (currentWidth === 'container' || (typeof currentWidth === 'number' && currentWidth > availableWidth)) {\n return { ...spec, width: availableWidth };\n }\n return spec;\n }, []);\n // Build the full Vega-Lite spec with defaults\n const buildFullSpec = useCallback((height, forFullscreen = false) => {\n if (!processedSpec)\n return null;\n const config = getDarkModeConfig(isDarkMode);\n // Use measured container width, window width for fullscreen (capped), or fallback\n const calculatedWidth = forFullscreen\n ? typeof window !== 'undefined'\n ? Math.min(window.innerWidth - 80, 1400)\n : 1200\n : containerWidth > 0\n ? containerWidth - 24\n : 500;\n // Check if this is a concatenated view - autosize 'fit' only works for single/layered views\n const isConcatenatedView = 'vconcat' in processedSpec || 'hconcat' in processedSpec || 'concat' in processedSpec;\n // For concatenated views, use 'pad' which works correctly; for single views use 'fit'\n const autosize = isConcatenatedView\n ? { type: 'pad', contains: 'padding' }\n : { type: 'fit', contains: 'padding' };\n // Scale widths for concatenated views to fit container\n let scaledSpec = processedSpec;\n if (isConcatenatedView && calculatedWidth) {\n scaledSpec = scaleSpecWidths(processedSpec, calculatedWidth);\n }\n // Replace \"container\" width with our measured width - \"container\" relies on CSS which may not be ready\n const specWidth = scaledSpec.width;\n const width = isConcatenatedView\n ? undefined\n : specWidth === 'container'\n ? calculatedWidth\n : (specWidth ?? calculatedWidth);\n // Destructure to remove width from spec so we can control it (only for non-concat views)\n const { width: _specWidth, ...specWithoutWidth } = scaledSpec;\n return {\n $schema: 'https://vega.github.io/schema/vega-lite/v6.json',\n ...(!isConcatenatedView && width ? { width } : {}),\n height: forFullscreen ? undefined : height,\n autosize,\n ...(isConcatenatedView ? scaledSpec : specWithoutWidth),\n // Override title if provided at top level\n ...(title && !processedSpec.title ? { title } : {}),\n // Apply theme config\n config: {\n ...config,\n ...processedSpec.config,\n },\n };\n }, [processedSpec, title, isDarkMode, containerWidth, scaleSpecWidths]);\n const handleCopy = useCallback(async () => {\n const view = isFullscreen ? fullscreenViewRef.current : viewRef.current;\n if (!view || isCopied)\n return;\n try {\n const canvas = await view.toCanvas(2);\n canvas.toBlob(async (blob) => {\n if (blob) {\n await navigator.clipboard.write([new ClipboardItem({ 'image/png': blob })]);\n setIsCopied(true);\n setTimeout(() => setIsCopied(false), 2000);\n }\n }, 'image/png');\n }\n catch (err) {\n console.error('Failed to copy chart:', err);\n }\n }, [isCopied, isFullscreen]);\n const handleExport = useCallback(async () => {\n const view = isFullscreen ? fullscreenViewRef.current : viewRef.current;\n if (!view || isExporting)\n return;\n setIsExporting(true);\n try {\n const url = await view.toImageURL('png', 2);\n const link = document.createElement('a');\n link.download = `${title || 'chart'}.png`;\n link.href = url;\n link.click();\n }\n catch (err) {\n console.error('Failed to export chart:', err);\n }\n finally {\n setIsExporting(false);\n }\n }, [title, isExporting, isFullscreen]);\n const handleNewView = useCallback((view) => {\n viewRef.current = view;\n setError(null);\n }, []);\n const handleFullscreenNewView = useCallback((view) => {\n fullscreenViewRef.current = view;\n }, []);\n const handleError = useCallback((err) => {\n console.error('Vega-Lite rendering error:', err);\n setError(err instanceof Error ? err.message : 'Unknown error');\n }, []);\n const toggleFullscreen = useCallback(() => {\n setIsFullscreen((prev) => !prev);\n }, []);\n // Clear error when spec changes\n useEffect(() => {\n void vegaSpec;\n setError(null);\n }, [vegaSpec]);\n // Toolbar component (reused in both views)\n const Toolbar = ({ className }) => (_jsxs(\"div\", { className: cn('flex items-center gap-2', className), children: [_jsxs(Button, { variant: \"unstyled\", onClick: handleCopy, disabled: isCopied, className: \"text-xs px-2 py-1 rounded border border-gray-300 dark:border-gray-700 bg-gray-100 dark:bg-gray-800 text-gray-700 dark:text-gray-300 hover:bg-gray-200 dark:hover:bg-gray-700 cursor-pointer transition-colors disabled:opacity-50 flex items-center gap-1\", title: t('agent.copyToClipboard'), children: [isCopied ? _jsx(Check, { className: \"w-3 h-3\" }) : _jsx(Copy, { className: \"w-3 h-3\" }), isCopied ? t('agent.copied') : t('agent.copy')] }), _jsxs(Button, { variant: \"unstyled\", onClick: handleExport, disabled: isExporting, className: \"text-xs px-2 py-1 rounded border border-gray-300 dark:border-gray-700 bg-gray-100 dark:bg-gray-800 text-gray-700 dark:text-gray-300 hover:bg-gray-200 dark:hover:bg-gray-700 cursor-pointer transition-colors disabled:opacity-50 disabled:cursor-not-allowed flex items-center gap-1\", title: t('agent.exportAsPng'), children: [_jsx(Download, { className: \"w-3 h-3\" }), isExporting ? t('agent.exporting') : t('agent.export')] }), showFullscreenButton && (_jsxs(Button, { variant: \"unstyled\", onClick: toggleFullscreen, className: \"text-xs px-2 py-1 rounded border border-gray-300 dark:border-gray-700 bg-gray-100 dark:bg-gray-800 text-gray-700 dark:text-gray-300 hover:bg-gray-200 dark:hover:bg-gray-700 cursor-pointer transition-colors flex items-center gap-1\", title: isFullscreen ? t('agent.exitFullscreen') : t('agent.fullscreen'), children: [isFullscreen ? _jsx(Minimize2, { className: \"w-3 h-3\" }) : _jsx(Maximize2, { className: \"w-3 h-3\" }), isFullscreen ? t('agent.exit') : t('agent.fullscreen')] }))] }));\n // Show loading state when resolving artifacts\n // Also show loading if we have artifact refs but haven't resolved them yet\n // (covers the gap before the effect runs)\n if (isLoadingArtifacts || (hasArtifactReferences && !resolvedSpec)) {\n return (_jsx(\"div\", { className: \"bg-white dark:bg-gray-900 rounded-lg border border-gray-200 dark:border-gray-800 shadow-sm\", children: _jsxs(\"div\", { className: \"flex flex-col gap-2 p-3\", children: [_jsx(\"div\", { className: \"flex items-center justify-between\", children: _jsx(\"span\", { className: \"font-medium text-sm text-gray-900 dark:text-gray-100\", children: title || 'Chart' }) }), _jsx(\"div\", { className: \"flex items-center justify-center bg-gray-50 dark:bg-gray-800 rounded\", style: { width: '100%', height: baseHeight }, children: _jsxs(\"div\", { className: \"flex items-center gap-2 text-gray-500 dark:text-gray-400\", children: [_jsx(Loader2, { className: \"w-5 h-5 animate-spin\" }), _jsx(\"span\", { className: \"text-sm\", children: \"Loading data from artifacts...\" })] }) })] }) }));\n }\n // Show artifact error state\n if (artifactError) {\n return (_jsx(\"div\", { className: \"bg-white dark:bg-gray-900 rounded-lg border border-gray-200 dark:border-gray-800 shadow-sm\", children: _jsxs(\"div\", { className: \"flex flex-col gap-2 p-3\", children: [_jsx(\"div\", { className: \"flex items-center justify-between\", children: _jsx(\"span\", { className: \"font-medium text-sm text-gray-900 dark:text-gray-100\", children: title || 'Chart' }) }), _jsx(\"div\", { style: { width: '100%', height: baseHeight }, children: _jsx(VegaErrorDisplay, { error: artifactError, chartTitle: title }) })] }) }));\n }\n if (error) {\n return (_jsx(\"div\", { className: \"bg-white dark:bg-gray-900 rounded-lg border border-gray-200 dark:border-gray-800 shadow-sm\", children: _jsxs(\"div\", { className: \"flex flex-col gap-2 p-3\", children: [_jsx(\"div\", { className: \"flex items-center justify-between\", children: _jsx(\"span\", { className: \"font-medium text-sm text-gray-900 dark:text-gray-100\", children: title || 'Chart' }) }), _jsx(\"div\", { style: { width: '100%', height: baseHeight }, children: _jsx(VegaErrorDisplay, { error: error, chartTitle: title }) })] }) }));\n }\n // Build spec for rendering\n const chartSpec = buildFullSpec(baseHeight);\n const fullscreenSpec = buildFullSpec(0, true);\n // Handle case when spec isn't ready yet\n if (!chartSpec) {\n return null;\n }\n // Debug: Log renders to track unnecessary re-renders (enable with localStorage)\n if (typeof window !== 'undefined' && localStorage.getItem('DEBUG_VEGA_RENDERS')) {\n console.log('VegaLite rendering with spec:', {\n title,\n hasData: !!chartSpec.data?.values,\n dataLength: chartSpec.data?.values?.length,\n });\n }\n return (_jsxs(_Fragment, { children: [_jsx(\"div\", { className: cn('bg-white dark:bg-gray-900 rounded-lg border border-gray-200 dark:border-gray-800 shadow-sm', isDashboard && 'border-2'), children: _jsxs(\"div\", { className: \"flex flex-col gap-2 p-3\", children: [_jsxs(\"div\", { className: \"flex items-center justify-between\", children: [_jsxs(\"div\", { className: \"flex items-center gap-2\", children: [_jsx(\"span\", { className: \"font-medium text-sm text-gray-900 dark:text-gray-100\", children: title || (isDashboard ? 'Dashboard' : 'Chart') }), isDashboard && (_jsx(\"span\", { className: \"text-xs px-2 py-0.5 rounded-full bg-indigo-100 dark:bg-indigo-900 text-indigo-700 dark:text-indigo-300\", children: \"Interactive\" }))] }), _jsx(Toolbar, {})] }), description && _jsx(\"span\", { className: \"text-xs text-gray-500 dark:text-gray-400\", children: description }), _jsx(\"div\", { ref: containerRef, className: \"bg-white dark:bg-gray-900 rounded overflow-hidden\", style: { width: '100%', height: baseHeight, minWidth: 0 }, children: _jsx(VegaEmbed, { spec: chartSpec, onEmbed: (result) => handleNewView(result.view), onError: handleError, options: { renderer: options?.renderer || 'canvas', actions: false } }) })] }) }), _jsxs(FullscreenDialog, { isOpen: isFullscreen, onClose: () => setIsFullscreen(false), title: title || (isDashboard ? 'Dashboard' : 'Chart'), description: description, children: [_jsx(\"div\", { className: \"w-full h-full min-h-[calc(100vh-200px)]\", children: fullscreenSpec && (_jsx(VegaEmbed, { spec: fullscreenSpec, onEmbed: (result) => handleFullscreenNewView(result.view), onError: handleError, options: { renderer: options?.renderer || 'canvas', actions: false } })) }), _jsx(\"div\", { className: \"absolute bottom-6 end-6\", children: _jsx(Toolbar, { className: \"bg-white dark:bg-gray-800 rounded-lg shadow-lg p-2 border border-gray-200 dark:border-gray-700\" }) })] })] }));\n}, (prevProps, nextProps) => {\n // Deep compare the spec to prevent re-renders when data hasn't changed\n return (JSON.stringify(prevProps.spec) === JSON.stringify(nextProps.spec) &&\n prevProps.artifactRunId === nextProps.artifactRunId);\n});\n//# sourceMappingURL=VegaLiteChart.js.map","import { jsxs as _jsxs, jsx as _jsx } from \"react/jsx-runtime\";\nimport { Button } from '@vertesia/ui/core';\nimport { BarChart3, Code, Download, FileText, GitBranch, Image, Link, MessageSquare, Table } from 'lucide-react';\nimport React from 'react';\nconst TYPE_CONFIG = {\n chart: { icon: BarChart3, label: 'chart', defaultHeight: 200 },\n mermaid: { icon: GitBranch, label: 'diagram', defaultHeight: 150 },\n proposal: { icon: MessageSquare, label: 'options', defaultHeight: 100 },\n code: { icon: Code, label: 'code', defaultHeight: 80 },\n image: { icon: Image, label: 'image', defaultHeight: 150 },\n link: { icon: Link, label: 'link', defaultHeight: 24 },\n expand: { icon: Download, label: 'content', defaultHeight: 100 },\n table: { icon: Table, label: 'table', defaultHeight: 150 },\n markdown: { icon: FileText, label: 'content', defaultHeight: 100 },\n 'fusion-fragment': { icon: Code, label: 'fragment', defaultHeight: 150 },\n};\n/**\n * Placeholder component shown while code blocks are loading.\n * Provides visual feedback and error states with retry capability.\n */\nexport function CodeBlockPlaceholder({ type, error, onRetry, message, height }) {\n const config = TYPE_CONFIG[type];\n const displayHeight = height ?? config.defaultHeight;\n const isInline = type === 'link';\n if (error) {\n return (_jsxs(\"div\", { className: `flex items-center gap-2 rounded border border-destructive/30 bg-destructive/5 text-destructive ${isInline ? 'inline-flex px-2 py-1 text-sm' : 'p-4'}`, style: !isInline ? { minHeight: displayHeight } : undefined, children: [_jsxs(\"span\", { className: \"text-destructive\", children: [\"Failed to load \", config.label] }), onRetry && (_jsx(Button, { variant: \"unstyled\", onClick: onRetry, className: \"ms-2 rounded bg-destructive/10 px-2 py-1 text-xs hover:bg-destructive/20 transition-colors text-destructive\", children: \"Retry\" }))] }));\n }\n const IconComponent = config.icon;\n if (isInline) {\n return (_jsxs(\"span\", { className: \"inline-flex items-center gap-1 text-muted animate-pulse\", children: [_jsx(IconComponent, { className: \"h-3 w-3\" }), _jsx(\"span\", { children: message || `Loading ${config.label}...` })] }));\n }\n return (_jsxs(\"div\", { className: \"flex flex-col items-center justify-center gap-3 rounded border border-border bg-muted/30 animate-pulse\", style: { minHeight: displayHeight }, children: [_jsx(IconComponent, { className: \"h-8 w-8 text-muted\" }), _jsx(\"span\", { className: \"text-sm text-muted\", children: message || `Loading ${config.label}...` }), _jsx(\"div\", { className: \"flex gap-1\", children: [...Array(3)].map((_, i) => (_jsx(\"div\", { className: \"h-2 w-2 rounded-full bg-muted animate-bounce\", style: { animationDelay: `${i * 150}ms` } }, `dot-${i}`))) })] }));\n}\nexport class CodeBlockErrorBoundary extends React.Component {\n constructor(props) {\n super(props);\n this.state = { hasError: false };\n }\n static getDerivedStateFromError(error) {\n return { hasError: true, error };\n }\n componentDidCatch(error, errorInfo) {\n console.error(`CodeBlock rendering error (${this.props.type}):`, error, errorInfo);\n this.props.onError?.(error);\n }\n handleRetry = () => {\n this.setState({ hasError: false, error: undefined });\n };\n render() {\n if (this.state.hasError) {\n const { type, fallbackCode } = this.props;\n return (_jsxs(\"div\", { className: \"space-y-2\", children: [_jsx(CodeBlockPlaceholder, { type: type, error: this.state.error?.message || 'Rendering failed', onRetry: this.handleRetry }), fallbackCode && (_jsxs(\"details\", { className: \"text-sm\", children: [_jsx(\"summary\", { className: \"cursor-pointer text-muted hover:text-foreground\", children: \"Show raw content\" }), _jsx(\"pre\", { className: \"mt-2 overflow-x-auto rounded bg-muted/50 p-2 text-xs\", children: _jsx(\"code\", { children: fallbackCode }) })] }))] }));\n }\n return this.props.children;\n }\n}\n//# sourceMappingURL=CodeBlockPlaceholder.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\n/**\n * ArtifactContentRenderer - Renders artifact content by type\n *\n * Supports rendering charts, tables, markdown, fusion fragments, and more.\n */\nimport { FusionFragmentHandler, FusionFragmentProvider } from '@vertesia/fusion-ux';\nimport DOMPurify from 'dompurify';\nimport { useMemo } from 'react';\nimport { VegaLiteChart } from '../../features/agent/chat/VegaLiteChart';\nimport { useCodeBlockContext } from './CodeBlockContext';\nimport { CodeBlockErrorBoundary, CodeBlockPlaceholder } from './CodeBlockPlaceholder';\n/**\n * Auto-detect render type from content and path\n */\nfunction autoDetectRenderType(content, path, contentType) {\n const ext = path.split('.').pop()?.toLowerCase();\n // SVG files → mockup renderer (inline SVG from text content)\n if (ext === 'svg') {\n return 'mockup';\n }\n // Image extensions (binary → rendered via URL)\n if (['png', 'jpg', 'jpeg', 'gif', 'webp'].includes(ext || '')) {\n return 'image';\n }\n // Markdown\n if (ext === 'md') {\n return 'markdown';\n }\n // CSV as table\n if (ext === 'csv') {\n return 'table';\n }\n // JSON content - try to detect chart or table\n if (contentType === 'json' && typeof content === 'object' && content !== null) {\n const obj = content;\n // Check for Vega-Lite schema\n if (typeof obj.$schema === 'string' && obj.$schema.includes('vega')) {\n return 'vega-lite';\n }\n // Check for wrapped Vega-Lite\n if (obj.library === 'vega-lite' && 'spec' in obj) {\n return 'vega-lite';\n }\n // Check for fusion fragment template with data\n if ('template' in obj && 'data' in obj) {\n return 'fusion-fragment';\n }\n // Check for table data (array of objects)\n if (Array.isArray(content) && content.length > 0 && typeof content[0] === 'object') {\n return 'table';\n }\n }\n // Default to code\n return 'code';\n}\nfunction toVegaLiteSpec(content) {\n if (typeof content !== 'object' || content === null) {\n return null;\n }\n const obj = content;\n if (obj.library === 'vega-lite' && 'spec' in obj && typeof obj.spec === 'object' && obj.spec !== null) {\n return obj;\n }\n if (typeof obj.$schema === 'string' && obj.$schema.includes('vega')) {\n return { library: 'vega-lite', spec: obj };\n }\n return null;\n}\n/**\n * Table renderer for array data or CSV\n */\nfunction TableRenderer({ content }) {\n const { headers, rows } = useMemo(() => {\n if (!Array.isArray(content) || content.length === 0) {\n return { headers: [], rows: [] };\n }\n // Extract headers from first object\n const first = content[0];\n if (typeof first !== 'object' || first === null) {\n return { headers: [], rows: [] };\n }\n const headers = Object.keys(first);\n const rows = content.map((row) => headers.map((h) => {\n const val = row[h];\n if (val === null || val === undefined)\n return '';\n if (typeof val === 'object')\n return JSON.stringify(val);\n return String(val);\n }));\n return { headers, rows };\n }, [content]);\n if (headers.length === 0) {\n return _jsx(CodeBlockPlaceholder, { type: \"table\", error: \"No table data found\" });\n }\n return (_jsxs(\"div\", { className: \"overflow-x-auto\", children: [_jsxs(\"table\", { className: \"min-w-full text-sm border-collapse\", children: [_jsx(\"thead\", { children: _jsx(\"tr\", { className: \"border-b\", children: headers.map((h) => (_jsx(\"th\", { className: \"px-3 py-2 text-start font-medium text-muted\", children: h }, h))) }) }), _jsx(\"tbody\", { children: rows.slice(0, 100).map((row, i) => (_jsx(\"tr\", { className: \"border-b border-muted/20\", children: row.map((cell, j) => (_jsx(\"td\", { className: \"px-3 py-2\", children: cell }, `cell-${j}`))) }, `row-${i}`))) })] }), rows.length > 100 && _jsxs(\"div\", { className: \"text-sm text-muted py-2\", children: [\"Showing 100 of \", rows.length, \" rows\"] })] }));\n}\n/**\n * Code block renderer for raw content\n */\nfunction CodeRenderer({ content, path }) {\n const ext = path.split('.').pop()?.toLowerCase() || '';\n const code = typeof content === 'string' ? content : JSON.stringify(content, null, 2);\n return (_jsx(\"pre\", { className: \"overflow-x-auto p-3 bg-muted/10 rounded text-sm\", children: _jsx(\"code\", { className: `language-${ext}`, children: code }) }));\n}\n/**\n * Sanitize SVG markup using DOMPurify.\n * Allows only safe SVG elements; strips scripts, event handlers, and foreignObject.\n */\nexport function sanitizeSvg(svg) {\n return DOMPurify.sanitize(svg, {\n USE_PROFILES: { svg: true, svgFilters: true },\n ADD_TAGS: ['use'],\n FORBID_TAGS: ['foreignObject'],\n });\n}\n/**\n * Make SVG responsive — remove fixed dimensions, ensure viewBox.\n */\nexport function makeSvgResponsive(svg) {\n return svg.replace(/<svg([^>]*)>/i, (_full, attrs) => {\n let a = attrs;\n if (!/viewBox/i.test(a)) {\n const w = /\\swidth\\s*=\\s*[\"']?(\\d+(?:\\.\\d+)?)/i.exec(a);\n const h = /\\sheight\\s*=\\s*[\"']?(\\d+(?:\\.\\d+)?)/i.exec(a);\n if (w && h)\n a += ` viewBox=\"0 0 ${w[1]} ${h[1]}\"`;\n }\n a = a\n .replace(/\\swidth\\s*=\\s*(?:\"[^\"]*\"|'[^']*'|[^\\s>]+)/i, '')\n .replace(/\\sheight\\s*=\\s*(?:\"[^\"]*\"|'[^']*'|[^\\s>]+)/i, '');\n if (/style=\"/i.test(a)) {\n a = a.replace(/style=\"([^\"]*)\"/i, (_, v) => `style=\"${v};width:100%;height:auto;display:block;max-width:100%;\"`);\n }\n else {\n a += ' style=\"width:100%;height:auto;display:block;max-width:100%;\"';\n }\n if (!/preserveAspectRatio=/i.test(a)) {\n a += ' preserveAspectRatio=\"xMidYMid meet\"';\n }\n return `<svg${a}>`;\n });\n}\n/**\n * Mockup renderer — renders raw SVG content inline after sanitization.\n */\nfunction MockupRenderer({ content }) {\n const processedSvg = useMemo(() => {\n const raw = typeof content === 'string' ? content.trim() : '';\n if (!raw)\n return null;\n return makeSvgResponsive(sanitizeSvg(raw));\n }, [content]);\n if (!processedSvg) {\n return _jsx(CodeBlockPlaceholder, { type: \"expand\", error: \"Empty mockup\" });\n }\n return (_jsx(\"div\", { style: { margin: '16px 0', width: '100%', overflowX: 'auto' }, \n // biome-ignore lint/security/noDangerouslySetInnerHtml: SVG content is processed/sanitized upstream for inline rendering\n dangerouslySetInnerHTML: { __html: processedSvg } }));\n}\n/**\n * Image renderer\n */\nfunction ImageRenderer({ content, path }) {\n const url = typeof content === 'string' ? content : '';\n const alt = path.split('/').pop() || 'Artifact image';\n return _jsx(\"img\", { src: url, alt: alt, className: \"max-w-full h-auto rounded\", loading: \"lazy\" });\n}\n/**\n * ArtifactContentRenderer - Main component\n *\n * Renders artifact content based on explicit type or auto-detection.\n */\nexport function ArtifactContentRenderer({ content, renderType, path, runId, contentType, }) {\n const { MarkdownRenderer } = useCodeBlockContext();\n // Determine actual render type\n const actualType = useMemo(() => {\n if (renderType !== 'auto') {\n return renderType;\n }\n return autoDetectRenderType(content, path, contentType);\n }, [content, path, contentType, renderType]);\n // Render based on type\n switch (actualType) {\n case 'chart': {\n const spec = toVegaLiteSpec(content);\n if (!spec) {\n return (_jsx(CodeBlockPlaceholder, { type: \"chart\", error: \"Only Vega-Lite charts are supported. Recharts rendering has been retired.\" }));\n }\n return (_jsx(CodeBlockErrorBoundary, { type: \"chart\", fallbackCode: JSON.stringify(content, null, 2), children: _jsx(VegaLiteChart, { spec: spec, artifactRunId: runId }) }));\n }\n case 'vega-lite': {\n const spec = toVegaLiteSpec(content);\n if (!spec) {\n return _jsx(CodeBlockPlaceholder, { type: \"chart\", error: \"Invalid Vega-Lite specification\" });\n }\n return (_jsx(CodeBlockErrorBoundary, { type: \"chart\", fallbackCode: JSON.stringify(content, null, 2), children: _jsx(VegaLiteChart, { spec: spec, artifactRunId: runId }) }));\n }\n case 'fusion-fragment': {\n // For fusion fragments, content should have { template, data }\n // Wrap with FusionFragmentProvider to inject VegaLiteChart for embedded charts\n const fragmentContent = content;\n console.log('[ArtifactContentRenderer] fusion-fragment:', {\n hasTemplate: !!fragmentContent.template,\n hasData: !!fragmentContent.data,\n runId,\n hasVegaLiteChart: !!VegaLiteChart,\n });\n if (fragmentContent.template && fragmentContent.data) {\n return (_jsx(CodeBlockErrorBoundary, { type: \"fusion-fragment\", fallbackCode: JSON.stringify(content, null, 2), children: _jsx(FusionFragmentProvider, { data: fragmentContent.data, ChartComponent: VegaLiteChart, artifactRunId: runId, children: _jsx(FusionFragmentHandler, { code: JSON.stringify(fragmentContent.template), data: fragmentContent.data }) }) }));\n }\n // If no data wrapper, treat as template-only (needs context from parent provider)\n return (_jsx(CodeBlockErrorBoundary, { type: \"fusion-fragment\", fallbackCode: JSON.stringify(content, null, 2), children: _jsx(FusionFragmentHandler, { code: JSON.stringify(content) }) }));\n }\n case 'table':\n return (_jsx(CodeBlockErrorBoundary, { type: \"table\", fallbackCode: JSON.stringify(content, null, 2), children: _jsx(TableRenderer, { content: content }) }));\n case 'markdown': {\n const markdownContent = typeof content === 'string' ? content : String(content);\n return (_jsx(CodeBlockErrorBoundary, { type: \"markdown\", fallbackCode: markdownContent, children: MarkdownRenderer ? (_jsx(MarkdownRenderer, { artifactRunId: runId, children: markdownContent })) : (_jsx(\"pre\", { className: \"overflow-x-auto p-3 bg-muted/10 rounded text-sm\", children: _jsx(\"code\", { children: markdownContent }) })) }));\n }\n case 'mockup':\n return (_jsx(CodeBlockErrorBoundary, { type: \"expand\", fallbackCode: typeof content === 'string' ? content : path, children: _jsx(MockupRenderer, { content: content }) }));\n case 'image':\n return (_jsx(CodeBlockErrorBoundary, { type: \"image\", fallbackCode: path, children: _jsx(ImageRenderer, { content: content, path: path }) }));\n default:\n return _jsx(CodeRenderer, { content: content, path: path });\n }\n}\n//# sourceMappingURL=ArtifactContentRenderer.js.map","import { jsx as _jsx } from \"react/jsx-runtime\";\nimport mermaid from 'mermaid';\nimport { useEffect, useId, useRef, useState } from 'react';\nconst MERMAID_FONT_FAMILY = 'Inter, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif';\n/**\n * Browser-side Mermaid normalization:\n * - Convert escaped newlines in quoted labels (`\\n`, `\\\\n`) to HTML line breaks.\n * Mermaid web rendering handles `<br/>` labels more reliably than escaped `\\n`.\n */\nfunction normalizeMermaidCodeForBrowser(code) {\n const trimmed = code.trim();\n let normalized = '';\n let inDoubleQuote = false;\n let inSingleQuote = false;\n for (let i = 0; i < trimmed.length; i++) {\n const char = trimmed[i];\n const prev = i > 0 ? trimmed[i - 1] : '';\n if (char === '\"' && !inSingleQuote && prev !== '\\\\') {\n inDoubleQuote = !inDoubleQuote;\n normalized += char;\n continue;\n }\n if (char === \"'\" && !inDoubleQuote && prev !== '\\\\') {\n inSingleQuote = !inSingleQuote;\n normalized += char;\n continue;\n }\n if ((inDoubleQuote || inSingleQuote) && char === '\\\\') {\n let j = i;\n while (trimmed[j] === '\\\\') {\n j++;\n }\n if (trimmed[j] === 'n') {\n normalized += '<br/>';\n i = j;\n continue;\n }\n }\n normalized += char;\n }\n return normalized;\n}\n/**\n * Force Mermaid SVG output to scale with container width.\n * This keeps text and shapes proportional when the container shrinks/expands.\n */\nexport function makeSvgResponsive(svg) {\n // `[^<>]` (not `[^>]`) so a run like `<svg<svg…` can't be re-scanned at every\n // position; tag attributes never contain `<`/`>` (CodeQL js/polynomial-redos).\n return svg.replace(/<svg([^<>]*)>/i, (_full, attrs) => {\n let nextAttrs = attrs.replace(/\\swidth=\"[^\"]*\"/i, '').replace(/\\sheight=\"[^\"]*\"/i, '');\n if (/style=\"/i.test(nextAttrs)) {\n nextAttrs = nextAttrs.replace(/style=\"([^\"]*)\"/i, (_styleFull, styleValue) => `style=\"${styleValue};width:100%;height:auto;display:block;max-width:100%;\"`);\n }\n else {\n nextAttrs += ' style=\"width:100%;height:auto;display:block;max-width:100%;\"';\n }\n if (!/preserveAspectRatio=/i.test(nextAttrs)) {\n nextAttrs += ' preserveAspectRatio=\"xMidYMid meet\"';\n }\n return `<svg${nextAttrs}>`;\n });\n}\n// Initialize mermaid with a browser-focused config close to Mermaid Playground defaults.\nmermaid.initialize({\n startOnLoad: false,\n theme: 'default',\n securityLevel: 'loose',\n fontFamily: MERMAID_FONT_FAMILY,\n suppressErrorRendering: true,\n flowchart: {\n htmlLabels: true,\n useMaxWidth: true,\n nodeSpacing: 40,\n rankSpacing: 50,\n padding: 12,\n },\n sequence: {\n useMaxWidth: true,\n },\n themeVariables: {\n fontFamily: MERMAID_FONT_FAMILY,\n },\n});\n/**\n * MermaidDiagram - Renders mermaid diagram code as SVG\n *\n * Supports all mermaid diagram types including:\n * - flowchart/graph\n * - sequence\n * - class\n * - state\n * - er (entity relationship)\n * - gantt\n * - pie\n * - mindmap\n * - timeline\n * - and more\n */\nexport function MermaidDiagram({ code, className }) {\n const containerRef = useRef(null);\n const [svg, setSvg] = useState(null);\n const [error, setError] = useState(null);\n const uniqueId = useId().replace(/:/g, '_');\n useEffect(() => {\n let cancelled = false;\n const renderDiagram = async () => {\n if (!code.trim()) {\n setSvg(null);\n setError(null);\n return;\n }\n try {\n // Reset error state\n setError(null);\n // Generate unique ID for this render\n const id = `mermaid-${uniqueId}-${Date.now()}`;\n const normalizedCode = normalizeMermaidCodeForBrowser(code);\n // Render the diagram\n const { svg: renderedSvg } = await mermaid.render(id, normalizedCode);\n const responsiveSvg = makeSvgResponsive(renderedSvg);\n if (!cancelled) {\n setSvg(responsiveSvg);\n }\n }\n catch (err) {\n if (!cancelled) {\n const message = err instanceof Error ? err.message : 'Failed to render mermaid diagram';\n setError(message);\n setSvg(null);\n }\n }\n };\n void renderDiagram();\n return () => {\n cancelled = true;\n };\n }, [code, uniqueId]);\n // Silently ignore mermaid syntax errors - just render nothing\n if (error) {\n return null;\n }\n if (!svg) {\n return (_jsx(\"div\", { className: `my-4 p-4 bg-gray-50 dark:bg-gray-800 rounded-lg animate-pulse ${className || ''}`, children: _jsx(\"div\", { className: \"h-32 bg-gray-200 dark:bg-gray-700 rounded\" }) }));\n }\n return (_jsx(\"div\", { ref: containerRef, className: `my-4 w-full overflow-x-auto [&_svg]:mx-auto [&_svg]:w-full [&_svg]:h-auto [&_svg]:max-w-full ${className || ''}`, \n // biome-ignore lint/security/noDangerouslySetInnerHtml: SVG is produced by Mermaid renderer from a known mermaid-source string\n dangerouslySetInnerHTML: { __html: svg } }));\n}\n//# sourceMappingURL=MermaidDiagram.js.map","/**\n * useArtifactContent - Hook to fetch artifact content from blob storage\n *\n * Used by expand:* code blocks to fetch and render artifact content inline.\n */\nimport { useUserSession } from '@vertesia/ui/session';\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport { getArtifactCacheKey, useArtifactUrlCache } from '../../features/agent/chat/useArtifactUrlCache';\n/**\n * Detect content type from path extension\n */\nfunction detectContentType(path) {\n const ext = path.split('.').pop()?.toLowerCase();\n switch (ext) {\n case 'json':\n return 'json';\n case 'md':\n case 'txt':\n case 'csv':\n case 'yaml':\n case 'yml':\n return 'text';\n case 'png':\n case 'jpg':\n case 'jpeg':\n case 'gif':\n case 'webp':\n case 'pdf':\n return 'binary';\n default:\n return 'text';\n }\n}\n/**\n * Hook to fetch artifact content from blob storage.\n * Handles signed-URL caching, loading states, and error handling.\n *\n * @example\n * ```tsx\n * const { data, isLoading, error } = useArtifactContent({\n * runId: artifactRunId,\n * path: 'direct/chart_123.json'\n * });\n * ```\n */\nexport function useArtifactContent({ runId, path, parseJson = true, }) {\n const { client } = useUserSession();\n const urlCache = useArtifactUrlCache();\n // Use refs to avoid triggering effect re-runs\n const clientRef = useRef(client);\n clientRef.current = client;\n const urlCacheRef = useRef(urlCache);\n urlCacheRef.current = urlCache;\n const [state, setState] = useState({\n data: undefined,\n rawContent: undefined,\n isLoading: true,\n error: undefined,\n contentType: undefined,\n });\n const fetchContent = useCallback(async () => {\n if (!runId) {\n setState({\n data: undefined,\n rawContent: undefined,\n isLoading: false,\n error: 'No run ID provided',\n contentType: undefined,\n });\n return;\n }\n if (!path) {\n setState({\n data: undefined,\n rawContent: undefined,\n isLoading: false,\n error: 'No artifact path provided',\n contentType: undefined,\n });\n return;\n }\n setState((prev) => ({ ...prev, isLoading: true, error: undefined }));\n const currentClient = clientRef.current;\n const currentUrlCache = urlCacheRef.current;\n const contentType = detectContentType(path);\n try {\n // Get signed URL for the artifact\n const cacheKey = getArtifactCacheKey(runId, path, 'inline');\n let signedUrl;\n if (currentUrlCache) {\n signedUrl = await currentUrlCache.getOrFetch(cacheKey, async () => {\n const result = await currentClient.files.getArtifactDownloadUrl(runId, path, 'inline');\n return result.url;\n });\n }\n else {\n const result = await currentClient.files.getArtifactDownloadUrl(runId, path, 'inline');\n signedUrl = result.url;\n }\n // Fetch the actual content\n const response = await fetch(signedUrl);\n if (!response.ok) {\n throw new Error(`Failed to fetch artifact: ${response.status} ${response.statusText}`);\n }\n // For binary content, return the URL instead\n if (contentType === 'binary') {\n setState({\n data: signedUrl,\n rawContent: undefined,\n isLoading: false,\n error: undefined,\n contentType,\n etag: response.headers.get('etag')?.replace(/^\"(.*)\"$/, '$1'),\n });\n return;\n }\n const rawContent = await response.text();\n // Parse JSON if requested and content is JSON\n let data;\n if (parseJson && contentType === 'json') {\n try {\n data = JSON.parse(rawContent);\n }\n catch {\n // If JSON parse fails, treat as text\n data = rawContent;\n }\n }\n else {\n data = rawContent;\n }\n setState({\n data,\n rawContent,\n isLoading: false,\n error: undefined,\n contentType,\n etag: response.headers.get('etag')?.replace(/^\"(.*)\"$/, '$1'),\n });\n }\n catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'Failed to fetch artifact';\n console.error('Failed to fetch artifact content:', path, err);\n setState({\n data: undefined,\n rawContent: undefined,\n isLoading: false,\n error: errorMessage,\n contentType,\n });\n }\n }, [runId, path, parseJson]);\n useEffect(() => {\n void fetchContent();\n }, [fetchContent]);\n const retry = useCallback(() => {\n setState({\n data: undefined,\n rawContent: undefined,\n isLoading: true,\n error: undefined,\n contentType: undefined,\n });\n void fetchContent();\n }, [fetchContent]);\n return {\n data: state.data,\n rawContent: state.rawContent,\n isLoading: state.isLoading,\n error: state.error,\n contentType: state.contentType,\n etag: state.etag,\n retry,\n };\n}\n//# sourceMappingURL=useArtifactContent.js.map","import { jsx as _jsx } from \"react/jsx-runtime\";\nimport { useMemo } from 'react';\nimport { VegaLiteChart } from '../../features/agent/chat/VegaLiteChart';\nimport { ArtifactContentRenderer, makeSvgResponsive, sanitizeSvg, } from './ArtifactContentRenderer';\nimport { useCodeBlockContext } from './CodeBlockContext';\nimport { CodeBlockErrorBoundary, CodeBlockPlaceholder } from './CodeBlockPlaceholder';\nimport { MermaidDiagram } from './MermaidDiagram';\nimport { useArtifactContent } from './useArtifactContent';\n/**\n * Check if JSON parsing failed due to incomplete content (streaming)\n * vs actually invalid JSON structure\n */\nexport function isIncompleteJson(code) {\n const trimmed = code.trim();\n // Empty or very short content is likely incomplete\n if (trimmed.length < 2)\n return true;\n // Must start with { for a valid JSON object\n if (!trimmed.startsWith('{'))\n return false;\n // Try to parse - if it succeeds, it's not incomplete\n try {\n JSON.parse(trimmed);\n return false; // Valid JSON\n }\n catch (e) {\n const message = e instanceof Error ? e.message : '';\n // Common indicators of incomplete JSON during streaming\n const incompleteIndicators = ['unexpected end', 'unterminated string', 'expected', 'unexpected token'];\n const lowerMessage = message.toLowerCase();\n if (incompleteIndicators.some((ind) => lowerMessage.includes(ind))) {\n // Additional check: count brackets to see if they're unbalanced\n let braceCount = 0;\n let bracketCount = 0;\n let inString = false;\n let escaped = false;\n for (const char of trimmed) {\n if (escaped) {\n escaped = false;\n continue;\n }\n if (char === '\\\\') {\n escaped = true;\n continue;\n }\n if (char === '\"') {\n inString = !inString;\n continue;\n }\n if (!inString) {\n if (char === '{')\n braceCount++;\n else if (char === '}')\n braceCount--;\n else if (char === '[')\n bracketCount++;\n else if (char === ']')\n bracketCount--;\n }\n }\n // If brackets are unbalanced or we're in an unclosed string, it's incomplete\n return braceCount > 0 || bracketCount > 0 || inString;\n }\n // For other parse errors, consider it invalid rather than incomplete\n return false;\n }\n}\n/**\n * Parses chart JSON from code block content.\n * Handles cases where extra content is appended after the JSON.\n */\nfunction parseChartJson(code) {\n try {\n let raw = code.trim();\n const jsonStart = raw.indexOf('{');\n const jsonEnd = raw.lastIndexOf('}');\n if (jsonStart !== -1 && jsonEnd > jsonStart) {\n raw = raw.slice(jsonStart, jsonEnd + 1);\n }\n return JSON.parse(raw);\n }\n catch {\n return null;\n }\n}\n/**\n * Detects the chart library from a parsed spec\n */\nfunction detectChartLibrary(spec) {\n // Detect Vega-Lite by $schema containing \"vega\"\n const hasVegaSchema = typeof spec.$schema === 'string' && spec.$schema.includes('vega');\n const isExplicitVegaLite = spec.library === 'vega-lite' && 'spec' in spec;\n if (hasVegaSchema || isExplicitVegaLite) {\n return 'vega-lite';\n }\n return null;\n}\n/**\n * Vega-Lite code block handler\n * Always renders with VegaLiteChart directly - no routing through AgentChart\n */\nexport function VegaLiteCodeBlockHandler({ code }) {\n const { artifactRunId } = useCodeBlockContext();\n if (!artifactRunId) {\n console.warn('[VegaLiteCodeBlockHandler] artifactRunId is missing from CodeBlockContext');\n }\n // Check if JSON is incomplete (streaming in progress)\n const incomplete = useMemo(() => isIncompleteJson(code), [code]);\n const chartSpec = useMemo(() => {\n if (incomplete)\n return null;\n const spec = parseChartJson(code);\n if (!spec)\n return null;\n // Wrap as VegaLiteChartSpec format\n return { library: 'vega-lite', spec };\n }, [code, incomplete]);\n // Show loading placeholder for incomplete JSON (streaming)\n if (incomplete) {\n return _jsx(CodeBlockPlaceholder, { type: \"chart\", message: \"Loading chart...\" });\n }\n if (!chartSpec) {\n return _jsx(CodeBlockPlaceholder, { type: \"chart\", error: \"Invalid Vega-Lite specification\" });\n }\n // Render VegaLiteChart directly - bypass AgentChart routing\n return (_jsx(CodeBlockErrorBoundary, { type: \"chart\", fallbackCode: code, children: _jsx(VegaLiteChart, { spec: chartSpec, artifactRunId: artifactRunId }) }));\n}\n/**\n * Chart code block handler\n * `chart` now accepts Vega-Lite specifications only.\n */\nexport function ChartCodeBlockHandler({ code }) {\n const { artifactRunId } = useCodeBlockContext();\n if (!artifactRunId) {\n console.warn('[ChartCodeBlockHandler] artifactRunId is missing from CodeBlockContext');\n }\n // Check if JSON is incomplete (streaming in progress)\n const incomplete = useMemo(() => isIncompleteJson(code), [code]);\n const chartSpec = useMemo(() => {\n if (incomplete)\n return null;\n const spec = parseChartJson(code);\n if (!spec)\n return null;\n const library = detectChartLibrary(spec);\n if (!library)\n return null;\n // If already wrapped, use as-is.\n if (spec.library === 'vega-lite' && 'spec' in spec && typeof spec.spec === 'object') {\n return spec;\n }\n // Native Vega-Lite spec - wrap it.\n return { library: 'vega-lite', spec };\n }, [code, incomplete]);\n // Show loading placeholder for incomplete JSON (streaming)\n if (incomplete) {\n return _jsx(CodeBlockPlaceholder, { type: \"chart\", message: \"Loading chart...\" });\n }\n if (!chartSpec) {\n return _jsx(CodeBlockPlaceholder, { type: \"chart\", error: \"Invalid Vega-Lite chart specification\" });\n }\n return (_jsx(CodeBlockErrorBoundary, { type: \"chart\", fallbackCode: code, children: _jsx(VegaLiteChart, { spec: chartSpec, artifactRunId: artifactRunId }) }));\n}\n/**\n * Mermaid diagram code block handler\n */\nexport function MermaidCodeBlockHandler({ code }) {\n const trimmedCode = code.trim();\n if (!trimmedCode) {\n return _jsx(CodeBlockPlaceholder, { type: \"mermaid\", error: \"Empty diagram\" });\n }\n return (_jsx(CodeBlockErrorBoundary, { type: \"mermaid\", fallbackCode: code, children: _jsx(MermaidDiagram, { code: trimmedCode }) }));\n}\n/**\n * Mockup code block handler — renders inline SVG after sanitization.\n */\nexport function MockupCodeBlockHandler({ code }) {\n const processedSvg = useMemo(() => {\n const trimmed = code.trim();\n if (!trimmed)\n return null;\n return makeSvgResponsive(sanitizeSvg(trimmed));\n }, [code]);\n if (!processedSvg) {\n return _jsx(CodeBlockPlaceholder, { type: \"code\", error: \"Empty mockup\" });\n }\n return (_jsx(CodeBlockErrorBoundary, { type: \"code\", fallbackCode: code, children: _jsx(\"div\", { style: { margin: '16px 0', width: '100%', overflowX: 'auto' }, \n // biome-ignore lint/security/noDangerouslySetInnerHtml: SVG content is processed/sanitized upstream for inline rendering\n dangerouslySetInnerHTML: { __html: processedSvg } }) }));\n}\n/**\n * Expand code block handler - fetches artifact and renders content inline.\n *\n * Usage: ```expand:chart, ```expand:table, ```expand:markdown, ```expand:fusion-fragment, etc.\n * The type after colon specifies the renderer.\n *\n * @example\n * ```expand:chart\n * direct/chart_abc123.json\n * ```\n */\nexport function ExpandCodeBlockHandler({ code, language }) {\n const { artifactRunId } = useCodeBlockContext();\n const artifactPath = code.trim();\n // Extract render type from language (e.g., \"expand:chart\" → \"chart\")\n const renderType = useMemo(() => {\n if (!language?.includes(':')) {\n return 'auto';\n }\n const type = language.split(':')[1];\n // Validate known types\n const validTypes = [\n 'chart',\n 'vega-lite',\n 'table',\n 'markdown',\n 'fusion-fragment',\n 'mockup',\n 'code',\n 'image',\n 'auto',\n ];\n return validTypes.includes(type) ? type : 'auto';\n }, [language]);\n // Fetch artifact content from GCS\n const { data, isLoading, error, contentType } = useArtifactContent({\n runId: artifactRunId,\n path: artifactPath,\n });\n if (!artifactRunId) {\n return _jsx(CodeBlockPlaceholder, { type: \"expand\", error: \"No artifact run ID available\" });\n }\n if (isLoading) {\n return _jsx(CodeBlockPlaceholder, { type: \"expand\", message: `Loading ${artifactPath}...` });\n }\n if (error) {\n return _jsx(CodeBlockPlaceholder, { type: \"expand\", error: `Failed to load artifact: ${error}` });\n }\n if (data === undefined) {\n return _jsx(CodeBlockPlaceholder, { type: \"expand\", error: \"No content found in artifact\" });\n }\n // Render with explicit type\n return (_jsx(ArtifactContentRenderer, { content: data, renderType: renderType, path: artifactPath, runId: artifactRunId, contentType: contentType }));\n}\n/**\n * Check if a language string is an expand:* pattern\n */\nexport function isExpandLanguage(language) {\n return language?.startsWith('expand') ?? false;\n}\n/**\n * Creates the default code block handlers map.\n *\n * These handlers are used as fallbacks when no custom handler is registered\n * via CodeBlockRendererRegistry for a given language. The priority order in\n * MarkdownRenderer is:\n *\n * 1. User-registered handlers (via CodeBlockRendererRegistry)\n * 2. Default handlers (from this function)\n * 3. Existing code component (if passed via components prop)\n * 4. Default <code> element rendering\n *\n * This allows users to override default behavior for specific languages\n * while still getting built-in support for charts, diagrams, and proposals.\n */\nexport function createDefaultCodeBlockHandlers() {\n return {\n // Chart handler for generic chart code blocks (Vega-Lite only)\n chart: ChartCodeBlockHandler,\n // Vega-Lite handlers - always treat as Vega-Lite\n 'vega-lite': VegaLiteCodeBlockHandler,\n vegalite: VegaLiteCodeBlockHandler,\n // Mermaid handler\n mermaid: MermaidCodeBlockHandler,\n // Mockup handler (inline SVG)\n mockup: MockupCodeBlockHandler,\n svg: MockupCodeBlockHandler,\n // Note: proposal/askuser handlers live in features/agent/chat\n // (ProposalCodeBlockHandler.tsx). They're registered via\n // SkillWidgetProvider/CodeBlockRendererProvider to keep\n // widgets/markdown free of features/agent/chat imports (would\n // create a runtime module cycle via MarkdownRenderer).\n };\n}\n//# sourceMappingURL=codeBlockHandlers.js.map","import { useUserSession } from '@vertesia/ui/session';\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport { getArtifactCacheKey, getFileCacheKey, isProjectFilePath, useArtifactUrlCache, } from '../../features/agent/chat/useArtifactUrlCache';\nconst AGENT_RESOURCE_SCHEMES = new Set([\n 'store',\n 'document',\n 'collection',\n 'interaction',\n 'prompt',\n 'agent',\n 'workflow',\n 'process',\n 'run',\n]);\n/**\n * Strip an optional `//` authority (and stray leading slashes) after a scheme colon so\n * `scheme://path` and `scheme:path` parse identically.\n */\nfunction stripSchemePath(raw) {\n return raw.trim().replace(/^\\/+/, '');\n}\n/**\n * Parses a URL and returns its scheme and path\n */\nexport function parseUrlScheme(rawUrl) {\n if (rawUrl.startsWith('artifact:')) {\n return { scheme: 'artifact', path: rawUrl.slice(9).trim() };\n }\n if (rawUrl.startsWith('image:')) {\n return { scheme: 'image', path: rawUrl.slice(6).trim() };\n }\n const colonIndex = rawUrl.indexOf(':');\n if (colonIndex > 0) {\n const scheme = rawUrl.slice(0, colonIndex);\n if (AGENT_RESOURCE_SCHEMES.has(scheme)) {\n return { scheme: scheme, path: stripSchemePath(rawUrl.slice(colonIndex + 1)) };\n }\n }\n return { scheme: 'standard', path: rawUrl };\n}\n/**\n * Hook to resolve custom URL schemes (artifact:, image:, etc.) to actual URLs.\n * Handles caching, loading states, and error handling.\n */\nexport function useResolvedUrl({ rawUrl, artifactRunId, disposition = 'inline', }) {\n const { client } = useUserSession();\n const urlCache = useArtifactUrlCache();\n // Use refs to avoid triggering effect/callback re-runs when these stable values are accessed\n const clientRef = useRef(client);\n clientRef.current = client;\n const urlCacheRef = useRef(urlCache);\n urlCacheRef.current = urlCache;\n const { scheme, path } = parseUrlScheme(rawUrl);\n const [state, setState] = useState(() => {\n // If it's a standard URL, use as-is\n if (scheme === 'standard') {\n return { url: rawUrl, isLoading: false, error: undefined };\n }\n // For artifact/image schemes, check cache first\n if (urlCache && (scheme === 'artifact' || scheme === 'image')) {\n let cacheKey;\n if (scheme === 'artifact' && artifactRunId && !isProjectFilePath(path)) {\n cacheKey = getArtifactCacheKey(artifactRunId, path, disposition);\n }\n else {\n cacheKey = getFileCacheKey(path);\n }\n const cached = urlCache.getUrl(cacheKey);\n if (cached) {\n return { url: cached, isLoading: false, error: undefined };\n }\n }\n // Need to fetch\n return { url: undefined, isLoading: true, error: undefined };\n });\n const fetchUrl = useCallback(async () => {\n // Skip if already resolved or standard URL\n if (scheme === 'standard') {\n return;\n }\n // Only artifact and image schemes need async resolution\n if (scheme !== 'artifact' && scheme !== 'image') {\n setState({ url: undefined, isLoading: false, error: `Unknown scheme: ${scheme}` });\n return;\n }\n setState((prev) => ({ ...prev, isLoading: true, error: undefined }));\n const currentClient = clientRef.current;\n const currentUrlCache = urlCacheRef.current;\n try {\n let url;\n if (scheme === 'artifact') {\n if (artifactRunId && !isProjectFilePath(path)) {\n const cacheKey = getArtifactCacheKey(artifactRunId, path, disposition);\n if (currentUrlCache) {\n url = await currentUrlCache.getOrFetch(cacheKey, async () => {\n const result = await currentClient.files.getArtifactDownloadUrl(artifactRunId, path, disposition);\n return result.url;\n });\n }\n else {\n const result = await currentClient.files.getArtifactDownloadUrl(artifactRunId, path, disposition);\n url = result.url;\n }\n }\n else {\n const cacheKey = getFileCacheKey(path);\n if (currentUrlCache) {\n url = await currentUrlCache.getOrFetch(cacheKey, async () => {\n const result = await currentClient.files.getDownloadUrl(path);\n return result.url;\n });\n }\n else {\n const result = await currentClient.files.getDownloadUrl(path);\n url = result.url;\n }\n }\n }\n else {\n // image: scheme\n const cacheKey = getFileCacheKey(path);\n if (currentUrlCache) {\n url = await currentUrlCache.getOrFetch(cacheKey, async () => {\n const result = await currentClient.files.getDownloadUrl(path);\n return result.url;\n });\n }\n else {\n const result = await currentClient.files.getDownloadUrl(path);\n url = result.url;\n }\n }\n setState({ url, isLoading: false, error: undefined });\n }\n catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'Failed to resolve URL';\n console.error('Failed to resolve URL:', path, err);\n setState({ url: undefined, isLoading: false, error: errorMessage });\n }\n }, [scheme, path, artifactRunId, disposition]);\n useEffect(() => {\n // Skip if already resolved\n if (state.url && !state.error) {\n return;\n }\n let cancelled = false;\n const doFetch = async () => {\n await fetchUrl();\n };\n if (!cancelled) {\n void doFetch();\n }\n return () => {\n cancelled = true;\n };\n }, [fetchUrl, state.url, state.error]);\n const retry = useCallback(() => {\n setState({ url: undefined, isLoading: true, error: undefined });\n void fetchUrl();\n }, [fetchUrl]);\n return {\n url: state.url,\n isLoading: state.isLoading,\n error: state.error,\n scheme,\n retry,\n };\n}\n//# sourceMappingURL=useResolvedUrl.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { CodeBlockPlaceholder } from './CodeBlockPlaceholder';\nimport { parseUrlScheme, useResolvedUrl } from './useResolvedUrl';\n/**\n * Markdown figure component for images with captions.\n * Wraps the image in a <figure> element with a <figcaption>.\n *\n * Usage in markdown: \n */\nexport function MarkdownFigure({ src, alt, caption, className, artifactRunId }) {\n const rawSrc = src || '';\n const { scheme } = parseUrlScheme(rawSrc);\n // For standard URLs, render directly\n if (scheme === 'standard') {\n return (_jsxs(\"figure\", { className: \"my-4\", children: [_jsx(\"img\", { src: src, alt: alt, className: className }), _jsx(\"figcaption\", { className: \"mt-2 text-sm text-muted text-center italic\", children: caption })] }));\n }\n // For artifact: and image: URLs, use the resolver\n return (_jsx(ResolvedFigure, { rawSrc: rawSrc, alt: alt, caption: caption, artifactRunId: artifactRunId, className: className }));\n}\n/**\n * Internal component for figures that need async URL resolution\n */\nfunction ResolvedFigure({ rawSrc, alt, caption, artifactRunId, className, }) {\n const { url, isLoading, error, retry } = useResolvedUrl({\n rawUrl: rawSrc,\n artifactRunId,\n disposition: 'inline',\n });\n if (isLoading) {\n return _jsx(CodeBlockPlaceholder, { type: \"image\", message: alt ? `Loading ${alt}...` : undefined });\n }\n if (error) {\n return _jsx(CodeBlockPlaceholder, { type: \"image\", error: error, onRetry: retry });\n }\n if (!url) {\n return null;\n }\n return (_jsxs(\"figure\", { className: \"my-4\", children: [_jsx(\"img\", { src: url, alt: alt, className: className }), _jsx(\"figcaption\", { className: \"mt-2 text-sm text-muted text-center italic\", children: caption })] }));\n}\n//# sourceMappingURL=MarkdownFigure.js.map","import { jsx as _jsx } from \"react/jsx-runtime\";\nimport { CodeBlockPlaceholder } from './CodeBlockPlaceholder';\nimport { parseUrlScheme, useResolvedUrl } from './useResolvedUrl';\n/**\n * Markdown image component with support for custom URL schemes.\n * Handles artifact: and image: URLs with loading states and error handling.\n */\nexport function MarkdownImage({ node, src, alt, className, artifactRunId, ExistingImg, ...rest }) {\n const rawSrc = src || '';\n const { scheme } = parseUrlScheme(rawSrc);\n // For standard URLs, delegate to existing component or render directly\n if (scheme === 'standard') {\n if (typeof ExistingImg === 'function') {\n return _jsx(ExistingImg, { node: node, src: src, alt: alt, ...rest });\n }\n return _jsx(\"img\", { src: src, alt: alt, className: className, ...rest });\n }\n // For artifact: and image: URLs, use the resolver\n return _jsx(ResolvedImage, { rawSrc: rawSrc, alt: alt, artifactRunId: artifactRunId, className: className, rest: rest });\n}\n/**\n * Internal component for images that need async URL resolution\n */\nfunction ResolvedImage({ rawSrc, alt, artifactRunId, className, rest, }) {\n const { url, isLoading, error, retry } = useResolvedUrl({\n rawUrl: rawSrc,\n artifactRunId,\n disposition: 'inline',\n });\n if (isLoading) {\n return _jsx(CodeBlockPlaceholder, { type: \"image\", message: alt ? `Loading ${alt}...` : undefined });\n }\n if (error) {\n return _jsx(CodeBlockPlaceholder, { type: \"image\", error: error, onRetry: retry });\n }\n if (!url) {\n return null;\n }\n return _jsx(\"img\", { src: url, alt: alt, className: className, ...rest });\n}\n//# sourceMappingURL=MarkdownImage.js.map","import { createContext, useContext } from 'react';\nconst unresolvedAgentResourceResolver = () => ({ kind: 'none' });\nconst AgentResourceResolverContext = createContext(unresolvedAgentResourceResolver);\n/** Supplies host-specific navigation for reusable chat and Markdown components. */\nexport const AgentResourceResolverProvider = AgentResourceResolverContext.Provider;\nexport function useAgentResourceResolver() {\n return useContext(AgentResourceResolverContext);\n}\nconst RESOURCE_SCHEME_TYPES = {\n store: 'document',\n document: 'document',\n collection: 'collection',\n interaction: 'interaction',\n prompt: 'prompt',\n agent: 'agent',\n workflow: 'workflow',\n process: 'process',\n run: 'interaction_run',\n};\n/** Converts a supported agent Markdown scheme into the same resource identity used by tool metadata. */\nexport function parseAgentResourceHref(rawHref) {\n const colonIndex = rawHref.indexOf(':');\n if (colonIndex <= 0)\n return undefined;\n const scheme = rawHref.slice(0, colonIndex);\n if (!Object.hasOwn(RESOURCE_SCHEME_TYPES, scheme))\n return undefined;\n const id = rawHref\n .slice(colonIndex + 1)\n .trim()\n .replace(/^\\/+/, '');\n if (!id)\n return undefined;\n return {\n type: RESOURCE_SCHEME_TYPES[scheme],\n id,\n };\n}\n//# sourceMappingURL=AgentResourceResolver.js.map","import { jsx as _jsx } from \"react/jsx-runtime\";\nimport { Button } from '@vertesia/ui/core';\nimport { parseAgentResourceHref, useAgentResourceResolver } from './AgentResourceResolver';\nimport { CodeBlockPlaceholder } from './CodeBlockPlaceholder';\nimport { parseUrlScheme, useResolvedUrl } from './useResolvedUrl';\n/**\n * Markdown link component with support for custom URL schemes.\n * Handles artifact:, image:, store:, document://, and collection: URLs.\n */\nexport function MarkdownLink({ node, href, children, className, artifactRunId, onArtifactOpen, ExistingLink, ...rest }) {\n const rawHref = href || '';\n const resource = parseAgentResourceHref(rawHref);\n if (resource) {\n return (_jsx(AgentResourceMarkdownLink, { resource: resource, rawHref: rawHref, artifactRunId: artifactRunId, className: className, ExistingLink: ExistingLink, rest: rest, children: children }));\n }\n const { scheme, path } = parseUrlScheme(rawHref);\n // For standard URLs, delegate to existing component or render directly\n if (scheme === 'standard') {\n if (typeof ExistingLink === 'function') {\n return (_jsx(ExistingLink, { node: node, href: href, className: className, ...rest, children: children }));\n }\n return (_jsx(\"a\", { href: href, ...rest, className: className, target: \"_blank\", rel: \"noopener noreferrer\", children: children }));\n }\n // For artifact: and image: URLs, use the resolver\n return (_jsx(ResolvedLink, { rawHref: rawHref, artifactRunId: artifactRunId, artifactPath: scheme === 'artifact' ? path : undefined, onArtifactOpen: onArtifactOpen, className: className, rest: rest, children: children }));\n}\nfunction AgentResourceMarkdownLink({ resource, rawHref, artifactRunId, className, children, ExistingLink, rest, }) {\n const resolve = useAgentResourceResolver();\n const target = resolve(resource, {\n workflowRunId: artifactRunId,\n source: 'markdown',\n rawHref,\n });\n if (target.kind === 'navigate') {\n if (typeof ExistingLink === 'function') {\n return (_jsx(ExistingLink, { href: target.href, className: className, ...rest, children: children }));\n }\n return (_jsx(\"a\", { href: target.href, ...rest, className: className, target: \"_blank\", rel: \"noopener noreferrer\", children: children }));\n }\n if (target.kind === 'activate') {\n return (_jsx(Button, { variant: \"link\", size: \"none\", className: className, onClick: target.onActivate, children: children }));\n }\n return _jsx(\"span\", { className: className, children: children });\n}\n/**\n * Internal component for links that need async URL resolution\n */\nfunction ResolvedLink({ rawHref, artifactRunId, artifactPath, onArtifactOpen, className, children, rest, }) {\n const { url, isLoading, error, retry } = useResolvedUrl({\n rawUrl: rawHref,\n artifactRunId,\n disposition: 'attachment',\n });\n if (isLoading) {\n return (_jsx(\"span\", { className: \"inline-flex items-center gap-1 text-muted\", children: _jsx(CodeBlockPlaceholder, { type: \"link\" }) }));\n }\n if (error) {\n return (_jsx(\"span\", { className: \"inline-flex items-center gap-1\", children: _jsx(CodeBlockPlaceholder, { type: \"link\", error: error, onRetry: retry }) }));\n }\n return (_jsx(\"a\", { href: url || '#', ...rest, className: className, target: \"_blank\", rel: \"noopener noreferrer\", onClick: (event) => {\n if (artifactPath &&\n /\\.md$/i.test(artifactPath) &&\n onArtifactOpen &&\n !event.metaKey &&\n !event.ctrlKey &&\n !event.shiftKey &&\n event.button === 0) {\n event.preventDefault();\n onArtifactOpen(artifactPath);\n }\n }, children: children }));\n}\n//# sourceMappingURL=MarkdownLink.js.map","const CUSTOM_SCHEME_PREFIXES = [\n 'artifact:',\n 'image:',\n 'store:',\n 'document://',\n 'collection:',\n 'interaction:',\n 'prompt:',\n 'agent:',\n 'workflow:',\n 'process:',\n 'run:',\n];\n// Excludes `[` from the link-text and destination classes: a long run of `[` (or\n// `[](image:` groups) with no closing delimiter would otherwise be re-scanned at every\n// start position, giving polynomial backtracking (CodeQL js/polynomial-redos).\nconst CUSTOM_LINK_REGEX = /(!?\\[[^[\\]\\n]*\\]\\()((?:artifact:|image:|store:|document:\\/\\/|collection:|interaction:|prompt:|agent:|workflow:|process:|run:)[^)[\\n]+)(\\))/g;\nconst INLINE_CODE_REGEX = /`[^`\\n]*`/g;\nconst FENCED_CODE_BLOCK_REGEX = /(^|\\n)(`{3,}|~{3,})[^\\n]*\\n[\\s\\S]*?\\n\\2(?=\\n|$)/g;\nconst LINK_TITLE_SUFFIX_REGEX = /\\s+(\"(?:[^\"\\\\]|\\\\.)*\"|'(?:[^'\\\\]|\\\\.)*'|\\([^)]*\\))\\s*$/;\nfunction hasCustomScheme(destination) {\n return CUSTOM_SCHEME_PREFIXES.some((prefix) => destination.startsWith(prefix));\n}\nfunction wrapCustomDestination(destinationWithOptionalTitle) {\n const trimmed = destinationWithOptionalTitle.trim();\n // Preserve already angle-bracketed custom destinations.\n if (trimmed.startsWith('<')) {\n const closeIdx = trimmed.indexOf('>');\n if (closeIdx > 0) {\n const bracketedDestination = trimmed.slice(1, closeIdx).trim();\n if (hasCustomScheme(bracketedDestination)) {\n return destinationWithOptionalTitle;\n }\n }\n }\n const titleMatch = trimmed.match(LINK_TITLE_SUFFIX_REGEX);\n const titleStart = titleMatch?.index ?? -1;\n const destination = (titleStart >= 0 ? trimmed.slice(0, titleStart) : trimmed).trim();\n const title = titleStart >= 0 ? trimmed.slice(titleStart) : '';\n if (!hasCustomScheme(destination)) {\n return destinationWithOptionalTitle;\n }\n return `<${destination}>${title}`;\n}\nfunction normalizeCustomLinksInText(text) {\n return text.replace(CUSTOM_LINK_REGEX, (_fullMatch, open, destination, close) => {\n return `${open}${wrapCustomDestination(destination)}${close}`;\n });\n}\nfunction normalizeOutsideInlineCode(text) {\n let result = '';\n let lastIndex = 0;\n for (const match of text.matchAll(INLINE_CODE_REGEX)) {\n result += normalizeCustomLinksInText(text.slice(lastIndex, match.index));\n result += match[0];\n lastIndex = match.index + match[0].length;\n }\n result += normalizeCustomLinksInText(text.slice(lastIndex));\n return result;\n}\n/**\n * Normalizes inline markdown links/images with custom URL schemes so they parse\n * correctly even when paths contain spaces (e.g. artifact:out/INVOICE 2025-001.pdf).\n *\n * CommonMark requires destinations with spaces to be wrapped in <...>.\n * We apply this only outside fenced/inline code spans.\n */\nexport function normalizeCustomSchemeLinks(markdown) {\n if (!markdown || !CUSTOM_SCHEME_PREFIXES.some((prefix) => markdown.includes(prefix))) {\n return markdown;\n }\n let result = '';\n let lastIndex = 0;\n for (const match of markdown.matchAll(FENCED_CODE_BLOCK_REGEX)) {\n result += normalizeOutsideInlineCode(markdown.slice(lastIndex, match.index));\n result += match[0];\n lastIndex = match.index + match[0].length;\n }\n result += normalizeOutsideInlineCode(markdown.slice(lastIndex));\n return result;\n}\n//# sourceMappingURL=normalizeCustomSchemeLinks.js.map","/**\n * Normalize Pandoc-style single-line fenced divs into remark-directive syntax.\n *\n * Pandoc allows single-line containers:\n * ::: pagebreak :::\n * ::: tip Some content here. :::\n *\n * remark-directive requires multi-line containers:\n * :::pagebreak\n * :::\n *\n * :::tip\n * Some content here.\n * :::\n *\n * This preprocessor converts the single-line form into multi-line so that\n * remark-directive can parse them correctly.\n */\n/**\n * Regex matching a single-line fenced div:\n * ::: name optional-content :::\n *\n * Groups:\n * [1] leading indent\n * [2] raw text between the opening and closing fences\n *\n * The directive name and optional inline content are split from group [2] in JS.\n *\n * Only matches when both opening and closing ::: are on the SAME line,\n * so it won't interfere with properly formatted multi-line containers.\n */\n// Capture the indent and the raw text between the opening and closing fences. The\n// name/content split is done in JS rather than with adjacent `\\s*(\\w+)\\s*(.*?)\\s*`\n// groups, which exhibit polynomial backtracking (CodeQL js/polynomial-redos).\nconst SINGLE_LINE_DIRECTIVE = /^([ \\t]*):::([^\\n]*?):::[ \\t]*$/gm;\nconst DIRECTIVE_NAME = /^\\w+/;\nexport function normalizeDirectives(markdown) {\n if (!markdown?.includes(':::')) {\n return markdown;\n }\n return markdown.replace(SINGLE_LINE_DIRECTIVE, (match, indent, inner) => {\n const trimmed = inner.trim();\n const nameMatch = DIRECTIVE_NAME.exec(trimmed);\n if (!nameMatch) {\n // No valid directive name → not a single-line directive, leave untouched.\n return match;\n }\n const name = nameMatch[0];\n const content = trimmed.slice(name.length).trim();\n if (content) {\n // Has content → multi-line container directive\n return `${indent}:::${name}\\n${indent}${content}\\n${indent}:::`;\n }\n // No content → leaf directive (::name)\n return `${indent}::${name}`;\n });\n}\n//# sourceMappingURL=normalizeDirectives.js.map","/**\n * Markdown math delimiter preprocessor.\n *\n * Disambiguates `$` characters in markdown so that remark-math correctly\n * distinguishes LaTeX math (`$x = \\frac{1}{2}$`) from currency (`$2,847,500`).\n *\n * Uses a three-pass priority algorithm over `$` positions:\n * 1. Commit pairs matching LaTeX patterns (highest priority)\n * 2. Pair remaining positions; escape currency patterns\n * 3. Escape lone `$` adjacent to committed LaTeX pairs\n *\n * Also normalizes `\\$` inside LaTeX spans into a KaTeX-compatible form,\n * since remark-math does not treat `\\$` as escaped within math delimiters.\n *\n * No-ops on input without `$`. Skips fenced code blocks and inline code spans.\n */\nconst FENCED_CODE_BLOCK_REGEX = /(^|\\n)(`{3,}|~{3,})[^\\n]*\\n[\\s\\S]*?\\n\\2(?=\\n|$)/g; // ```...``` or ~~~...~~~\nconst INLINE_CODE_REGEX = /`[^`\\n]*`/g; // `...`\nconst ESCAPED_DOLLAR_REGEX = /\\\\\\$/g; // \\$ inside LaTeX spans\n// LaTeX positive signals\nconst RE_BACKSLASH_CMD = /\\\\[^\\s]/; // \\command or \\symbol (\\frac, \\%, \\$, etc.)\nconst RE_BRACE_GROUP = /[{}]/; // brace groups\nconst RE_SUB_SUPERSCRIPT = /[_^][\\w{]/; // sub/superscript\nconst RE_SINGLE_LETTER = /^[a-zA-Z]$/; // single letter variable ($r$, $x$, $t$)\nconst RE_VAR_ASSIGNMENT = /^[a-zA-Z]\\s*=/; // variable assignment ($r = 0.235$, $n = 4$)\n// LaTeX negative signals\nconst RE_LEADING_SPACE = /^\\s/; // space after opening $\nconst RE_TRAILING_SPACE = /\\s$/; // space before closing $\nconst RE_TRAILING_OPERATOR = /[+*/-]$/; // ends with bare operator\nconst RE_ION_NOTATION = /\\^[+-]$/; // except ^+ or ^- (ion notation)\n/**\n * Returns true if content between `$...$` contains LaTeX structural patterns.\n */\nfunction hasLatexPattern(content) {\n return (RE_BACKSLASH_CMD.test(content) ||\n RE_BRACE_GROUP.test(content) ||\n RE_SUB_SUPERSCRIPT.test(content) ||\n RE_SINGLE_LETTER.test(content) ||\n RE_VAR_ASSIGNMENT.test(content));\n}\n/**\n * Returns true if content between `$...$` has structural tells of currency dollar signs.\n */\nfunction hasCurrencyPattern(content) {\n if (RE_LEADING_SPACE.test(content))\n return true;\n if (RE_TRAILING_SPACE.test(content))\n return true;\n if (RE_TRAILING_OPERATOR.test(content) && !RE_ION_NOTATION.test(content))\n return true;\n return false;\n}\n/**\n * Find all single-$ positions in text (skipping \\$ and $$).\n */\nfunction findSingleDollarPositions(text) {\n const positions = [];\n for (let i = 0; i < text.length; i++) {\n if (text[i] !== '$')\n continue;\n if (i > 0 && text[i - 1] === '\\\\')\n continue; // skip \\$\n if (i + 1 < text.length && text[i + 1] === '$') {\n i++;\n continue;\n } // skip $$ (first)\n if (i > 0 && text[i - 1] === '$' && (i < 2 || text[i - 2] !== '\\\\'))\n continue; // skip $$ (second)\n positions.push(i);\n }\n return positions;\n}\n/**\n * Extract content between two $ positions. Returns null if the span is\n * empty or crosses a line boundary (invalid for inline math).\n */\nfunction inlineMathContent(text, openPos, closePos) {\n const content = text.slice(openPos + 1, closePos);\n if (content.length === 0 || content.includes('\\n'))\n return null;\n return content;\n}\n/**\n * Classify `$` positions in a text segment, escape currency dollar signs,\n * and normalize `\\$` inside LaTeX spans for remark-math compatibility.\n */\nfunction processTextSegment(text) {\n const positions = findSingleDollarPositions(text);\n if (positions.length < 2)\n return text;\n const committed = new Set(); // position indices that are paired\n const toEscape = new Set(); // character offsets in text to escape\n // Pre-compute content for each adjacent pair (avoids redundant slicing in Pass 1 & 2)\n const adjacentContent = new Array(positions.length - 1);\n for (let i = 0; i < positions.length - 1; i++) {\n adjacentContent[i] = inlineMathContent(text, positions[i], positions[i + 1]);\n }\n // Pass 1: commit definitely-LaTeX adjacent pairs and record their char boundaries\n const latexSpans = [];\n for (let i = 0; i < positions.length - 1; i++) {\n if (committed.has(i))\n continue;\n const content = adjacentContent[i];\n if (content !== null && hasLatexPattern(content)) {\n committed.add(i);\n committed.add(i + 1);\n latexSpans.push([positions[i], positions[i + 1]]);\n }\n }\n // Pass 2: pair remaining positions left-to-right\n let idx = 0;\n while (idx < positions.length) {\n if (committed.has(idx)) {\n idx++;\n continue;\n }\n // Find next uncommitted position\n let next = idx + 1;\n while (next < positions.length && committed.has(next))\n next++;\n if (next >= positions.length)\n break;\n // If committed positions sit between idx and next, remark-math would\n // pair positions[idx] with the first committed $, breaking LaTeX.\n if (next > idx + 1) {\n toEscape.add(positions[idx]);\n idx++;\n continue;\n }\n // next === idx + 1, so we can reuse the pre-computed content\n const content = adjacentContent[idx];\n if (content === null) {\n // Cross-line pair: remark-math processes per-paragraph, so these\n // can't actually pair. Don't consume either position.\n idx++;\n continue;\n }\n if (hasCurrencyPattern(content)) {\n toEscape.add(positions[idx]);\n toEscape.add(positions[next]);\n }\n committed.add(idx);\n committed.add(next);\n idx = next + 1;\n }\n // Pass 3: escape lone $ adjacent to committed LaTeX pairs\n for (let i = 0; i < positions.length; i++) {\n if (committed.has(i))\n continue;\n if (i + 1 < positions.length && committed.has(i + 1)) {\n toEscape.add(positions[i]);\n }\n }\n if (toEscape.size === 0 && latexSpans.length === 0)\n return text;\n // Build result: escape false-positive $ and replace \\$ inside LaTeX spans\n const parts = [];\n let segStart = 0;\n const escapePositions = Array.from(toEscape).sort((a, b) => a - b);\n let escIdx = 0;\n let spanIdx = 0;\n while (escIdx < escapePositions.length || spanIdx < latexSpans.length) {\n const escPos = escIdx < escapePositions.length ? escapePositions[escIdx] : Infinity;\n const spanOpen = spanIdx < latexSpans.length ? latexSpans[spanIdx][0] : Infinity;\n if (escPos < spanOpen) {\n if (escPos > segStart)\n parts.push(text.slice(segStart, escPos));\n parts.push('\\\\$');\n segStart = escPos + 1;\n escIdx++;\n }\n else {\n const [open, close] = latexSpans[spanIdx];\n if (open > segStart)\n parts.push(text.slice(segStart, open));\n const spanContent = text.slice(open, close + 1);\n parts.push(spanContent.replace(ESCAPED_DOLLAR_REGEX, '\\\\text{\\\\textdollar}'));\n segStart = close + 1;\n while (escIdx < escapePositions.length && escapePositions[escIdx] <= close)\n escIdx++;\n spanIdx++;\n }\n }\n if (segStart < text.length)\n parts.push(text.slice(segStart));\n return parts.join('');\n}\n/**\n * Process text segments outside inline code spans.\n */\nfunction processSkippingInlineCode(text) {\n const parts = [];\n let lastIndex = 0;\n for (const match of text.matchAll(INLINE_CODE_REGEX)) {\n parts.push(processTextSegment(text.slice(lastIndex, match.index)));\n parts.push(match[0]);\n lastIndex = match.index + match[0].length;\n }\n parts.push(processTextSegment(text.slice(lastIndex)));\n return parts.join('');\n}\n/**\n * Preprocess markdown to disambiguate `$` math delimiters from currency signs.\n *\n * Classification priority: LaTeX (preserve) > currency (escape) > uncertain (preserve).\n * Skips fenced code blocks and inline code spans.\n */\nexport function preprocessMathDelimiters(markdown) {\n if (!markdown?.includes('$')) {\n return markdown;\n }\n const parts = [];\n let lastIndex = 0;\n for (const match of markdown.matchAll(FENCED_CODE_BLOCK_REGEX)) {\n parts.push(processSkippingInlineCode(markdown.slice(lastIndex, match.index)));\n parts.push(match[0]);\n lastIndex = match.index + match[0].length;\n }\n parts.push(processSkippingInlineCode(markdown.slice(lastIndex)));\n return parts.join('');\n}\n//# sourceMappingURL=preprocessMathDelimiters.js.map","/**\n * Custom remark plugin that transforms remark-directive nodes into\n * HTML elements for columns layout and callout containers.\n *\n * Supported directives:\n * :::columns → <div class=\"md-columns\">\n * :::column{width=50%}→ <div class=\"md-column\" style=\"width:50%\">\n * :::note / :::warning / :::tip / :::caution / :::important → callout <div>s\n * :::name → <div class=\"md-name\"> (generic fallback)\n */\nimport { visit } from 'unist-util-visit';\n// Callout types mapped to CSS modifier classes (semantic design system)\nconst CALLOUT_TYPES = {\n note: 'md-callout-info',\n tip: 'md-callout-info',\n warning: 'md-callout-attention',\n important: 'md-callout-attention',\n caution: 'md-callout-destructive',\n};\nconst CALLOUT_LABELS = {\n note: 'Note',\n tip: 'Tip',\n warning: 'Warning',\n important: 'Important',\n caution: 'Caution',\n};\nexport function remarkDirectiveHandler() {\n return (tree) => {\n visit(tree, (node) => {\n if (node.type !== 'containerDirective' && node.type !== 'leafDirective' && node.type !== 'textDirective') {\n return;\n }\n const d = node;\n if (!d.data) {\n d.data = {};\n }\n const data = d.data;\n const attrs = d.attributes || {};\n const name = d.name;\n // ::pagebreak / :::pagebreak → visual page break indicator\n if (name === 'pagebreak') {\n data.hName = 'hr';\n data.hProperties = { className: 'md-pagebreak' };\n return;\n }\n // :::columns → flex container\n if (name === 'columns') {\n data.hName = 'div';\n data.hProperties = { className: 'md-columns' };\n return;\n }\n // :::column{width=50%} → flex child with optional width\n if (name === 'column') {\n data.hName = 'div';\n const props = { className: 'md-column' };\n if (attrs.width) {\n props.style = `flex-basis:${attrs.width};flex-grow:0;flex-shrink:0`;\n }\n data.hProperties = props;\n return;\n }\n // Callout types\n if (name in CALLOUT_TYPES) {\n data.hName = 'div';\n data.hProperties = {\n className: `md-callout ${CALLOUT_TYPES[name]}`,\n 'data-callout-type': name,\n };\n // Prepend a title paragraph\n const label = CALLOUT_LABELS[name];\n if (label && d.children) {\n const titleNode = {\n type: 'paragraph',\n data: {\n hName: 'p',\n hProperties: { className: 'md-callout-title' },\n },\n children: [{ type: 'text', value: label }],\n };\n d.children.unshift(titleNode);\n }\n return;\n }\n // Generic fallback: :::name → <div class=\"md-name\">\n data.hName = 'div';\n data.hProperties = {\n className: `md-${name}`,\n ...Object.fromEntries(Object.entries(attrs).filter(([k]) => k !== 'class')),\n };\n if (attrs.class) {\n data.hProperties.className += ` ${attrs.class}`;\n }\n });\n };\n}\n//# sourceMappingURL=remarkDirectiveHandler.js.map","import { jsx as _jsx } from \"react/jsx-runtime\";\nimport React from 'react';\nimport Markdown, { defaultUrlTransform } from 'react-markdown';\nimport rehypeKatex from 'rehype-katex';\nimport { defListHastHandlers, remarkDefinitionList } from 'remark-definition-list';\nimport remarkDirective from 'remark-directive';\nimport remarkGfm from 'remark-gfm';\nimport remarkAlert from 'remark-github-blockquote-alert';\nimport remarkMath from 'remark-math';\nimport remarkSupersub from 'remark-supersub';\nimport { SKIP, visit } from 'unist-util-visit';\nimport { CodeBlockHandlerProvider } from './CodeBlockContext';\nimport { useCodeBlockRendererRegistry } from './CodeBlockRendering';\nimport { createDefaultCodeBlockHandlers, ExpandCodeBlockHandler, isExpandLanguage } from './codeBlockHandlers';\nimport { MarkdownFigure } from './MarkdownFigure';\nimport { MarkdownImage } from './MarkdownImage';\nimport { MarkdownLink } from './MarkdownLink';\nimport { normalizeCustomSchemeLinks } from './normalizeCustomSchemeLinks';\nimport { normalizeDirectives } from './normalizeDirectives';\nimport { preprocessMathDelimiters } from './preprocessMathDelimiters';\nimport { remarkDirectiveHandler } from './remarkDirectiveHandler';\n// Custom URL schemes that we handle in our components\nconst ALLOWED_CUSTOM_SCHEMES = [\n 'artifact:',\n 'image:',\n 'store:',\n 'document:',\n 'document://',\n 'collection:',\n 'interaction:',\n 'prompt:',\n 'agent:',\n 'workflow:',\n 'process:',\n 'run:',\n];\n/**\n * Custom URL transform that allows our custom schemes while using\n * the default transform for standard URLs (which sanitizes unsafe schemes).\n */\nfunction customUrlTransform(url) {\n if (ALLOWED_CUSTOM_SCHEMES.some((scheme) => url.startsWith(scheme))) {\n return url;\n }\n return defaultUrlTransform(url);\n}\n/**\n * Remark plugin to remove HTML comments from markdown\n */\nfunction remarkRemoveComments() {\n return (tree) => {\n visit(tree, 'html', (node, index, parent) => {\n const literal = node;\n const parentNode = parent;\n if (typeof literal.value === 'string' && /<!--[\\s\\S]*?-->/.test(literal.value)) {\n if (parentNode?.children && typeof index === 'number') {\n parentNode.children.splice(index, 1);\n return [SKIP, index];\n }\n }\n });\n };\n}\n// Create default handlers once, outside component\nconst defaultCodeBlockHandlers = createDefaultCodeBlockHandlers();\nexport function MarkdownRenderer({ children, components, remarkPlugins = [], removeComments = true, artifactRunId, onArtifactOpen, className, codeClassName, inlineCodeClassName, linkClassName, imageClassName, onProposalSelect, onProposalSubmit, preserveSourcePositions = false, }) {\n const codeBlockRegistry = useCodeBlockRendererRegistry();\n const normalizedMarkdown = React.useMemo(() => preserveSourcePositions\n ? children\n : normalizeDirectives(normalizeCustomSchemeLinks(preprocessMathDelimiters(children))), [children, preserveSourcePositions]);\n // Remark plugins (markdown parsing)\n // Order matters: GFM first, then directive (must precede handler),\n // then definition-list/supersub, then math, then user plugins.\n const remarkPluginsArray = React.useMemo(() => {\n const result = [\n remarkGfm,\n remarkDirective,\n remarkDirectiveHandler,\n remarkAlert,\n remarkDefinitionList,\n remarkSupersub,\n remarkMath,\n ...remarkPlugins,\n ];\n if (removeComments) {\n result.push(remarkRemoveComments);\n }\n return result;\n }, [remarkPlugins, removeComments]);\n // Rehype plugins (HTML processing, including KaTeX for math)\n const rehypePluginsArray = React.useMemo(() => [rehypeKatex], []);\n // Remark-rehype bridge options (custom AST handlers for definition lists)\n const remarkRehypeOptions = React.useMemo(() => ({\n handlers: {\n ...defListHastHandlers,\n },\n }), []);\n const componentsWithOverrides = React.useMemo(() => {\n const baseComponents = components || {};\n const ExistingCode = baseComponents.code;\n const ExistingLink = baseComponents.a;\n const ExistingImg = baseComponents.img;\n const CodeComponent = ({ node, className: codeClassName_, children: codeChildren, ...props }) => {\n const match = /language-([\\w-]+)/.exec(codeClassName_ || '');\n const isInline = !match;\n const language = match ? match[1] : '';\n // Check registry for custom renderer (includes default handlers)\n if (!isInline && language) {\n // First check user-provided registry\n if (codeBlockRegistry) {\n const CustomComponent = codeBlockRegistry.getComponent(language);\n if (CustomComponent) {\n const code = String(codeChildren || '').trim();\n return _jsx(CustomComponent, { code: code, language: language });\n }\n }\n // Check for expand:* pattern (e.g., expand:chart, expand:table)\n if (isExpandLanguage(language)) {\n const code = String(codeChildren || '').trim();\n return _jsx(ExpandCodeBlockHandler, { code: code, language: language });\n }\n // Then check default handlers (chart, vega-lite, mermaid, proposal, askuser)\n const DefaultHandler = defaultCodeBlockHandlers[language];\n if (DefaultHandler) {\n const code = String(codeChildren || '').trim();\n return _jsx(DefaultHandler, { code: code, language: language });\n }\n }\n // Delegate to existing code component if provided\n if (typeof ExistingCode === 'function') {\n return (_jsx(ExistingCode, { node: node, className: codeClassName_, ...props, children: codeChildren }));\n }\n // Default code rendering\n const baseInlineClass = 'px-1.5 py-0.5 rounded';\n const baseCodeClass = '';\n return (_jsx(\"code\", { ...props, className: isInline\n ? `${baseInlineClass} ${inlineCodeClassName || ''}`\n : `${baseCodeClass} ${codeClassName || ''}`, children: codeChildren }));\n };\n const LinkComponent = (props) => {\n const { node, href, children: linkChildren, ...rest } = props;\n return (_jsx(MarkdownLink, { node: node, href: href, className: linkClassName, artifactRunId: artifactRunId, onArtifactOpen: onArtifactOpen, ExistingLink: typeof ExistingLink === 'function'\n ? ExistingLink\n : undefined, ...rest, children: linkChildren }));\n };\n const ImageComponent = (props) => {\n const { node, src, alt, title, ...rest } = props;\n // If image has a title, render as figure with caption\n if (title) {\n return (_jsx(MarkdownFigure, { src: src, alt: alt, caption: title, className: imageClassName, artifactRunId: artifactRunId }));\n }\n return (_jsx(MarkdownImage, { node: node, src: src, alt: alt, className: imageClassName, artifactRunId: artifactRunId, ExistingImg: typeof ExistingImg === 'function'\n ? ExistingImg\n : undefined, ...rest }));\n };\n return {\n ...baseComponents,\n code: CodeComponent,\n a: LinkComponent,\n img: ImageComponent,\n };\n }, [\n components,\n artifactRunId,\n onArtifactOpen,\n codeBlockRegistry,\n codeClassName,\n inlineCodeClassName,\n linkClassName,\n imageClassName,\n ]);\n const markdownContent = (_jsx(CodeBlockHandlerProvider, { artifactRunId: artifactRunId, onProposalSelect: onProposalSelect, onProposalSubmit: onProposalSubmit, MarkdownRenderer: MarkdownRenderer, children: _jsx(Markdown, { remarkPlugins: remarkPluginsArray, rehypePlugins: rehypePluginsArray, remarkRehypeOptions: remarkRehypeOptions, components: componentsWithOverrides, urlTransform: customUrlTransform, children: normalizedMarkdown }) }));\n if (className) {\n return _jsx(\"div\", { className: `md-content ${className}`, children: markdownContent });\n }\n return _jsx(\"div\", { className: \"md-content\", children: markdownContent });\n}\n//# sourceMappingURL=MarkdownRenderer.js.map","import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from \"react/jsx-runtime\";\nimport { autoUpdate, FloatingPortal, flip, offset, shift, useFloating } from '@floating-ui/react';\nimport { Button, cn, DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, Spinner, Textarea, usePortalContainer, useToast, VTooltip, } from '@vertesia/ui/core';\nimport { useUITranslation } from '@vertesia/ui/i18n';\nimport { Bold, ChevronDown, Code, Italic, List, ListOrdered, MessageSquarePlus, Minus, Quote, Redo2, Send, SquareCode, Strikethrough, Table, Undo2, X, } from 'lucide-react';\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nconst chain = (editor) => editor.chain();\nconst canChain = (editor) => editor.can().chain();\n/** Force a re-render whenever the editor's selection or content changes, so active/enabled state stays live. */\nfunction useEditorRevision(editor) {\n const [, setRevision] = useState(0);\n useEffect(() => {\n if (!editor)\n return;\n const update = () => setRevision((value) => value + 1);\n editor.on('transaction', update);\n editor.on('selectionUpdate', update);\n return () => {\n editor.off('transaction', update);\n editor.off('selectionUpdate', update);\n };\n }, [editor]);\n}\n// Keep the toolbar from stealing the editor selection when a control is pressed.\nconst retainSelection = (event) => event.preventDefault();\nfunction createId() {\n if (typeof crypto !== 'undefined' && 'randomUUID' in crypto)\n return crypto.randomUUID();\n return `c-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;\n}\n/** Human-readable block label + selected text for the enclosing node of the current selection. */\nfunction readSelection(editor) {\n const { from, to } = editor.state.selection;\n if (from >= to)\n return null;\n const quote = editor.state.doc.textBetween(from, to, '\\n', ' ').trim();\n if (!quote)\n return null;\n const $from = editor.state.doc.resolve(from);\n let blockLabel = 'paragraph';\n for (let depth = $from.depth; depth >= 0; depth--) {\n const name = $from.node(depth).type.name;\n if (name === 'heading') {\n blockLabel = 'heading';\n break;\n }\n if (name === 'codeBlock' || name === 'vertesiaCodeBlock') {\n blockLabel = 'code block';\n break;\n }\n if (name === 'blockquote') {\n blockLabel = 'quote';\n break;\n }\n if (name === 'listItem' || name === 'taskItem') {\n blockLabel = 'list item';\n break;\n }\n if (name === 'table') {\n blockLabel = 'table';\n break;\n }\n }\n return { blockLabel, quote, from, to };\n}\nfunction composeCommentMessage(comments) {\n const count = comments.length;\n const items = comments.map((entry, index) => `${index + 1}. On the ${entry.blockLabel} “${entry.quote}”:\\n ${entry.comment}`);\n return [\n `I've left ${count} comment${count === 1 ? '' : 's'} on the document:`,\n '',\n ...items,\n '',\n 'Please revise the document to address each comment, preserving everything else.',\n ].join('\\n');\n}\nfunction getSelectionAnchor(editor, selection) {\n return {\n contextElement: editor.view.dom,\n getBoundingClientRect: () => {\n try {\n const end = editor.view.coordsAtPos(selection.to);\n const height = Math.max(1, end.bottom - end.top);\n return new DOMRect(end.right, end.top, 1, height);\n }\n catch {\n return editor.view.dom.getBoundingClientRect();\n }\n },\n };\n}\nfunction SelectionComment({ editor, selection, composing, draft, onStart, onDraftChange, onCancel, onAdd, }) {\n const { t } = useUITranslation();\n const portalContainer = usePortalContainer();\n const { refs, floatingStyles } = useFloating({\n placement: 'right-start',\n strategy: 'fixed',\n middleware: [offset(8), flip({ fallbackPlacements: ['left-start', 'bottom-start'] }), shift({ padding: 12 })],\n whileElementsMounted: autoUpdate,\n });\n const anchor = useMemo(() => getSelectionAnchor(editor, selection), [editor, selection]);\n useEffect(() => {\n refs.setPositionReference(anchor);\n }, [anchor, refs]);\n return (_jsx(FloatingPortal, { root: portalContainer, children: _jsx(\"div\", { ref: refs.setFloating, style: floatingStyles, className: \"pointer-events-auto z-100\", children: composing ? (_jsxs(\"div\", { role: \"dialog\", \"aria-label\": t('agent.commentOnSelection'), className: \"w-80 max-w-[calc(100vw-1.5rem)] space-y-2 rounded-lg border border-mixer-muted/25 bg-popover p-3 text-popover-foreground shadow-lg\", children: [_jsxs(\"div\", { className: \"line-clamp-2 text-xs text-muted\", children: [_jsx(\"span\", { className: \"font-medium text-foreground\", children: t('agent.commentingOn') }), ' ', _jsxs(\"span\", { className: \"italic\", children: [\"\\u201C\", selection.quote, \"\\u201D\"] })] }), _jsx(Textarea, { value: draft, onChange: (event) => onDraftChange(event.target.value), placeholder: t('agent.commentOnSelectionPlaceholder'), rows: 3, autoFocus: true, onKeyDown: (event) => {\n if (event.key === 'Escape') {\n event.preventDefault();\n onCancel();\n return;\n }\n if (event.key === 'Enter' && (event.metaKey || event.ctrlKey)) {\n event.preventDefault();\n onAdd();\n }\n } }), _jsxs(\"div\", { className: \"flex justify-end gap-2\", children: [_jsx(Button, { variant: \"outline\", size: \"sm\", onClick: onCancel, children: t('store.cancelEdit') }), _jsx(Button, { size: \"sm\", onClick: onAdd, disabled: !draft.trim(), children: t('agent.addComment') })] })] })) : (_jsx(VTooltip, { description: t('agent.commentOnSelection'), asChild: true, children: _jsx(Button, { variant: \"secondary\", size: \"sm\", onMouseDown: retainSelection, onClick: onStart, \"aria-label\": t('agent.commentOnSelection'), className: \"size-9 rounded-full p-0 shadow-md\", children: _jsx(MessageSquarePlus, { className: \"size-4\" }) }) })) }) }));\n}\nfunction ToolButton({ icon: Icon, label, active = false, disabled = false, onClick, }) {\n return (_jsx(Button, { variant: \"ghost\", size: \"sm\", \"aria-label\": label, title: label, \"aria-pressed\": active, disabled: disabled, onMouseDown: retainSelection, onClick: onClick, className: cn('size-8 shrink-0 rounded-md p-0 text-foreground hover:bg-muted/60', active && 'bg-muted text-foreground'), children: _jsx(Icon, { className: \"size-4\" }) }));\n}\nfunction Divider() {\n return _jsx(\"div\", { className: \"mx-0.5 h-5 w-px shrink-0 bg-mixer-muted/30\", \"aria-hidden\": true });\n}\nexport function SendChangesToAgentButton({ onSend, hasUnsentChanges, isSending, disabled, }) {\n const { t } = useUITranslation();\n return (_jsxs(Button, { variant: hasUnsentChanges ? 'primary' : 'ghost', size: \"sm\", className: cn('h-8 gap-1.5', !hasUnsentChanges && 'text-muted'), onMouseDown: retainSelection, onClick: () => void onSend(), disabled: disabled || !hasUnsentChanges || isSending, children: [isSending ? _jsx(Spinner, { size: \"sm\" }) : _jsx(Send, { className: \"size-3.5\" }), t('agent.sendChangesToAgent')] }));\n}\n/**\n * Clean, icon-based formatting toolbar for the Markdown document editor, optionally with inline\n * comment controls. Reactive to the current selection; uses the shared `richText.*` i18n strings.\n */\nexport function EditorToolbar({ editor, className, editable = true, onSendComment, onSendChangesToAgent, hasUnsentChanges = false, isSendingChanges = false, sendChangesDisabled = false, toolbarStatus, }) {\n const { t } = useUITranslation();\n const toast = useToast();\n useEditorRevision(editor);\n const [composing, setComposing] = useState(false);\n const [draft, setDraft] = useState('');\n const [pendingSelection, setPendingSelection] = useState(null);\n const [activeSelection, setActiveSelection] = useState(null);\n const [pending, setPending] = useState([]);\n const [showList, setShowList] = useState(false);\n const [isSendingComments, setIsSendingComments] = useState(false);\n const lastSelectionRef = useRef(null);\n useEffect(() => {\n if (!editor || !onSendComment)\n return;\n const update = () => {\n const selection = readSelection(editor);\n setActiveSelection(selection);\n if (selection)\n lastSelectionRef.current = selection;\n };\n update();\n editor.on('selectionUpdate', update);\n editor.on('transaction', update);\n return () => {\n editor.off('selectionUpdate', update);\n editor.off('transaction', update);\n };\n }, [editor, onSendComment]);\n const startComment = useCallback(() => {\n const selection = lastSelectionRef.current;\n if (!selection) {\n toast({ status: 'info', title: t('agent.selectTextToComment'), duration: 2500 });\n return;\n }\n setPendingSelection(selection);\n setDraft('');\n setComposing(true);\n }, [t, toast]);\n const cancelDraft = useCallback(() => {\n setComposing(false);\n setPendingSelection(null);\n setDraft('');\n }, []);\n const addComment = useCallback(() => {\n const body = draft.trim();\n if (!pendingSelection || !body)\n return;\n setPending((current) => [...current, { id: createId(), ...pendingSelection, comment: body }]);\n setComposing(false);\n setPendingSelection(null);\n setDraft('');\n setShowList(true);\n }, [draft, pendingSelection]);\n const removeComment = useCallback((id) => {\n setPending((current) => current.filter((entry) => entry.id !== id));\n }, []);\n const sendAll = useCallback(async () => {\n if (!onSendComment || pending.length === 0 || isSendingComments)\n return;\n setIsSendingComments(true);\n try {\n await onSendComment(composeCommentMessage(pending));\n setPending([]);\n setShowList(false);\n }\n finally {\n setIsSendingComments(false);\n }\n }, [isSendingComments, onSendComment, pending]);\n if (!editor)\n return null;\n const headingLevel = [1, 2, 3].find((level) => editor.isActive('heading', { level }));\n const blockLabel = headingLevel === 1\n ? t('richText.heading1')\n : headingLevel === 2\n ? t('richText.heading2')\n : headingLevel === 3\n ? t('richText.heading3')\n : t('richText.paragraph');\n const inTable = editor.isActive('table');\n const commentSelection = pendingSelection ?? activeSelection;\n return (_jsxs(_Fragment, { children: [_jsxs(\"div\", { role: \"toolbar\", \"aria-label\": t('richText.blockStyle'), className: cn('flex min-h-10 shrink-0 items-center gap-0.5 overflow-x-auto border-b border-mixer-muted/25 px-1.5 py-1', className), children: [_jsx(ToolButton, { icon: Undo2, label: t('richText.undo'), disabled: !editable || !canChain(editor).focus().undo().run(), onClick: () => chain(editor).focus().undo().run() }), _jsx(ToolButton, { icon: Redo2, label: t('richText.redo'), disabled: !editable || !canChain(editor).focus().redo().run(), onClick: () => chain(editor).focus().redo().run() }), _jsx(Divider, {}), _jsxs(DropdownMenu, { children: [_jsx(DropdownMenuTrigger, { asChild: true, children: _jsxs(Button, { variant: \"ghost\", size: \"sm\", disabled: !editable, onMouseDown: retainSelection, className: \"h-8 shrink-0 gap-1 px-2 text-xs font-medium text-foreground hover:bg-muted/60\", children: [blockLabel, _jsx(ChevronDown, { className: \"size-3 opacity-60\" })] }) }), _jsxs(DropdownMenuContent, { align: \"start\", children: [_jsx(DropdownMenuItem, { onClick: () => chain(editor).focus().setParagraph().run(), children: t('richText.paragraph') }), _jsx(DropdownMenuItem, { onClick: () => chain(editor).focus().setHeading({ level: 1 }).run(), children: t('richText.heading1') }), _jsx(DropdownMenuItem, { onClick: () => chain(editor).focus().setHeading({ level: 2 }).run(), children: t('richText.heading2') }), _jsx(DropdownMenuItem, { onClick: () => chain(editor).focus().setHeading({ level: 3 }).run(), children: t('richText.heading3') })] })] }), _jsx(Divider, {}), _jsx(ToolButton, { icon: Bold, label: t('richText.bold'), active: editor.isActive('bold'), disabled: !editable, onClick: () => chain(editor).focus().toggleBold().run() }), _jsx(ToolButton, { icon: Italic, label: t('richText.italic'), active: editor.isActive('italic'), disabled: !editable, onClick: () => chain(editor).focus().toggleItalic().run() }), _jsx(ToolButton, { icon: Strikethrough, label: t('richText.strike'), active: editor.isActive('strike'), disabled: !editable, onClick: () => chain(editor).focus().toggleStrike().run() }), _jsx(ToolButton, { icon: Code, label: t('richText.inlineCode'), active: editor.isActive('code'), disabled: !editable, onClick: () => chain(editor).focus().toggleCode().run() }), _jsx(Divider, {}), _jsx(ToolButton, { icon: List, label: t('richText.bulletList'), active: editor.isActive('bulletList'), disabled: !editable, onClick: () => chain(editor).focus().toggleBulletList().run() }), _jsx(ToolButton, { icon: ListOrdered, label: t('richText.orderedList'), active: editor.isActive('orderedList'), disabled: !editable, onClick: () => chain(editor).focus().toggleOrderedList().run() }), _jsx(ToolButton, { icon: Quote, label: t('richText.blockquote'), active: editor.isActive('blockquote'), disabled: !editable, onClick: () => chain(editor).focus().toggleBlockquote().run() }), _jsx(ToolButton, { icon: SquareCode, label: t('richText.codeBlock'), active: editor.isActive('codeBlock'), disabled: !editable, onClick: () => chain(editor).focus().toggleCodeBlock().run() }), _jsx(Divider, {}), _jsx(ToolButton, { icon: Minus, label: t('richText.horizontalRule'), disabled: !editable, onClick: () => chain(editor).focus().setHorizontalRule().run() }), _jsxs(DropdownMenu, { children: [_jsx(DropdownMenuTrigger, { asChild: true, children: _jsx(Button, { variant: \"ghost\", size: \"sm\", disabled: !editable, \"aria-label\": t('richText.tableActions'), title: inTable ? t('richText.tableActions') : t('richText.table'), onMouseDown: retainSelection, className: cn('size-8 shrink-0 rounded-md p-0 text-foreground hover:bg-muted/60', inTable && 'bg-muted'), children: _jsx(Table, { className: \"size-4\" }) }) }), _jsx(DropdownMenuContent, { align: \"start\", children: inTable ? (_jsxs(_Fragment, { children: [_jsx(DropdownMenuItem, { onClick: () => chain(editor).focus().addRowBefore().run(), children: t('richText.addRowAbove') }), _jsx(DropdownMenuItem, { onClick: () => chain(editor).focus().addRowAfter().run(), children: t('richText.addRowBelow') }), _jsx(DropdownMenuItem, { onClick: () => chain(editor).focus().deleteRow().run(), children: t('richText.deleteRow') }), _jsx(DropdownMenuItem, { onClick: () => chain(editor).focus().addColumnBefore().run(), children: t('richText.addColumnLeft') }), _jsx(DropdownMenuItem, { onClick: () => chain(editor).focus().addColumnAfter().run(), children: t('richText.addColumnRight') }), _jsx(DropdownMenuItem, { onClick: () => chain(editor).focus().deleteColumn().run(), children: t('richText.deleteColumn') }), _jsx(DropdownMenuItem, { onClick: () => chain(editor).focus().deleteTable().run(), children: t('richText.deleteTable') })] })) : (_jsx(DropdownMenuItem, { onClick: () => chain(editor).focus().insertTable({ rows: 3, cols: 3, withHeaderRow: true }).run(), children: t('richText.table') })) })] }), onSendComment || onSendChangesToAgent ? (_jsxs(\"div\", { className: \"ms-auto flex shrink-0 items-center gap-1 ps-1\", children: [pending.length > 0 ? (_jsxs(_Fragment, { children: [_jsxs(Button, { variant: \"ghost\", size: \"sm\", className: \"h-8 px-2 text-xs text-muted\", onClick: () => setShowList((value) => !value), children: [t('agent.comments'), \" (\", pending.length, \")\"] }), _jsxs(Button, { size: \"sm\", className: \"h-8\", onClick: () => void sendAll(), disabled: isSendingComments, children: [_jsx(Send, { className: \"me-1 size-4\" }), t('agent.sendToAgent')] })] })) : null, onSendChangesToAgent ? (_jsxs(_Fragment, { children: [toolbarStatus, _jsx(SendChangesToAgentButton, { onSend: onSendChangesToAgent, hasUnsentChanges: hasUnsentChanges, isSending: isSendingChanges, disabled: sendChangesDisabled })] })) : null] })) : null] }), onSendComment && commentSelection ? (_jsx(SelectionComment, { editor: editor, selection: commentSelection, composing: composing, draft: draft, onStart: startComment, onDraftChange: setDraft, onCancel: cancelDraft, onAdd: addComment })) : null, showList && pending.length > 0 ? (_jsx(\"ul\", { className: \"max-h-48 shrink-0 space-y-1.5 overflow-y-auto border-b border-mixer-muted/15 px-3 py-2\", children: pending.map((entry) => (_jsxs(\"li\", { className: \"flex items-start gap-2 rounded-md border border-mixer-muted/20 bg-muted/10 px-2 py-1.5\", children: [_jsxs(\"div\", { className: \"min-w-0 flex-1\", children: [_jsxs(\"div\", { className: \"truncate text-[11px] italic text-muted\", children: [\"\\u201C\", entry.quote, \"\\u201D\"] }), _jsx(\"div\", { className: \"whitespace-pre-wrap text-xs text-foreground\", children: entry.comment })] }), _jsx(Button, { variant: \"ghost\", size: \"sm\", \"aria-label\": t('agent.deleteComment'), title: t('agent.deleteComment'), className: \"size-6 shrink-0 p-0 text-muted\", onClick: () => removeComment(entry.id), children: _jsx(X, { className: \"size-3.5\" }) })] }, entry.id))) })) : null] }));\n}\n//# sourceMappingURL=EditorToolbar.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { getMarkdownCompatibility, MarkdownComponentEditor, MarkdownDocumentEditor, MarkdownRichTextEditor, } from '@vertesia/rich-text';\nimport { Button, cn, Modal, ModalBody, ModalFooter, ModalTitle, Textarea } from '@vertesia/ui/core';\nimport { useUITranslation } from '@vertesia/ui/i18n';\nimport { useCallback, useState } from 'react';\nimport { CodeBlockHandlerProvider, useCodeBlockContext } from '../widgets/markdown/CodeBlockContext.js';\nimport { useCodeBlockRendererRegistry } from '../widgets/markdown/CodeBlockRendering.js';\nimport { createDefaultCodeBlockHandlers, ExpandCodeBlockHandler } from '../widgets/markdown/codeBlockHandlers.js';\nimport { MarkdownFigure } from '../widgets/markdown/MarkdownFigure.js';\nimport { MarkdownImage } from '../widgets/markdown/MarkdownImage.js';\nimport { MarkdownLink } from '../widgets/markdown/MarkdownLink.js';\nimport { MarkdownRenderer } from '../widgets/markdown/MarkdownRenderer.js';\nimport { EditorToolbar, SendChangesToAgentButton } from './EditorToolbar.js';\nconst defaultCodeBlockHandlers = createDefaultCodeBlockHandlers();\nfunction VertesiaCodeBlockPreview({ code, language }) {\n const registry = useCodeBlockRendererRegistry();\n const CustomRenderer = language ? registry?.getComponent(language) : undefined;\n const DefaultRenderer = language ? defaultCodeBlockHandlers[language] : undefined;\n const Renderer = language?.startsWith('expand:') ? ExpandCodeBlockHandler : (CustomRenderer ?? DefaultRenderer);\n if (!Renderer)\n return null;\n return _jsx(Renderer, { code: code, language: language });\n}\nfunction VertesiaImagePreview({ src, alt, title }) {\n const { artifactRunId } = useCodeBlockContext();\n if (title) {\n return _jsx(MarkdownFigure, { src: src, alt: alt, caption: title, artifactRunId: artifactRunId });\n }\n return _jsx(MarkdownImage, { src: src, alt: alt, artifactRunId: artifactRunId });\n}\nfunction VertesiaLinkPreview({ href, title, children }) {\n const { artifactRunId } = useCodeBlockContext();\n return (_jsx(MarkdownLink, { href: href, artifactRunId: artifactRunId, children: _jsx(\"span\", { title: title, children: children }) }));\n}\nfunction VertesiaOpaqueBlockPreview({ raw }) {\n const { artifactRunId } = useCodeBlockContext();\n return _jsx(MarkdownRenderer, { artifactRunId: artifactRunId, children: raw });\n}\nexport const vertesiaRichTextRenderers = {\n codeBlock: VertesiaCodeBlockPreview,\n image: VertesiaImagePreview,\n link: VertesiaLinkPreview,\n opaqueBlock: VertesiaOpaqueBlockPreview,\n};\nexport function VertesiaMarkdownRichTextEditor({ artifactRunId, ...props }) {\n return (_jsx(CodeBlockHandlerProvider, { artifactRunId: artifactRunId, MarkdownRenderer: MarkdownRenderer, children: _jsx(MarkdownRichTextEditor, { ...props, ...vertesiaRichTextRenderers }) }));\n}\nexport function VertesiaMarkdownComponentEditor({ artifactRunId, className, contentClassName, editorClassName, onEditor, ...props }) {\n const [editor, setEditor] = useState(null);\n const handleEditor = useCallback((next) => {\n setEditor(next);\n onEditor?.(next);\n }, [onEditor]);\n return (_jsx(CodeBlockHandlerProvider, { artifactRunId: artifactRunId, MarkdownRenderer: MarkdownRenderer, children: _jsxs(\"div\", { className: cn('overflow-hidden rounded-md border border-mixer-muted/30 bg-background', className), children: [_jsx(EditorToolbar, { editor: editor, editable: props.editable !== false }), _jsx(MarkdownComponentEditor, { ...props, ...vertesiaRichTextRenderers, onEditor: handleEditor, contentClassName: cn('max-h-80 overflow-auto', contentClassName), editorClassName: cn('vprose prose-sm min-h-24 max-w-none px-3 py-2 outline-none', editorClassName) })] }) }));\n}\nexport function VertesiaMarkdownDocumentEditor({ artifactRunId, className, contentClassName, editorClassName, onEditor, onSendComment, onSendChangesToAgent, hasUnsentChanges = false, isSendingChanges = false, sendChangesDisabled = false, toolbarStatus, ...props }) {\n const { t } = useUITranslation();\n const [editor, setEditor] = useState(null);\n const handleEditor = useCallback((next) => {\n setEditor(next);\n onEditor?.(next);\n }, [onEditor]);\n const [editingMode, setEditingMode] = useState(() => getMarkdownCompatibility(props.value) === 'lossy' ? 'choose' : 'rich-text');\n const resolvedEditingMode = editingMode === 'choose' ? 'source' : editingMode;\n return (_jsxs(CodeBlockHandlerProvider, { artifactRunId: artifactRunId, MarkdownRenderer: MarkdownRenderer, children: [resolvedEditingMode === 'rich-text' ? (_jsxs(\"div\", { className: cn('flex h-full min-h-0 flex-col bg-background', className), children: [_jsx(EditorToolbar, { editor: editor, editable: props.editable !== false, onSendComment: onSendComment, onSendChangesToAgent: onSendChangesToAgent, hasUnsentChanges: hasUnsentChanges, isSendingChanges: isSendingChanges, sendChangesDisabled: sendChangesDisabled, toolbarStatus: toolbarStatus }), _jsx(MarkdownDocumentEditor, { ...props, ...vertesiaRichTextRenderers, onEditor: handleEditor, ariaLabel: props.ariaLabel ?? t('richText.documentEditor'), className: \"flex min-h-0 flex-1 flex-col\", contentClassName: cn('min-h-0 flex-1 overflow-auto', contentClassName), editorClassName: cn('vprose prose-sm mx-auto min-h-full w-full max-w-5xl px-6 py-5 outline-none', editorClassName) })] })) : (_jsxs(\"div\", { className: cn('flex h-full min-h-0 flex-col bg-background', className), children: [onSendChangesToAgent ? (_jsxs(\"div\", { className: \"flex min-h-10 shrink-0 items-center justify-end gap-1 border-b border-mixer-muted/25 px-1.5 py-1\", children: [toolbarStatus, _jsx(SendChangesToAgentButton, { onSend: onSendChangesToAgent, hasUnsentChanges: hasUnsentChanges, isSending: isSendingChanges, disabled: sendChangesDisabled })] })) : null, _jsx(Textarea, { value: props.value, onChange: (event) => props.onChange?.(event.target.value), onFocus: () => props.onFocusChange?.(true), onBlur: () => props.onFocusChange?.(false), disabled: props.editable === false, \"aria-label\": t('richText.markdownSourceEditor'), className: cn('vertesia-markdown-document-editor-content min-h-0 flex-1 resize-none rounded-none', 'border-0 px-6 py-5 font-mono text-sm leading-6 outline-none focus-visible:ring-0', contentClassName, editorClassName) })] })), _jsxs(Modal, { isOpen: editingMode === 'choose', onClose: () => setEditingMode('source'), className: \"sm:max-w-lg\", disableCloseOnClickOutside: true, children: [_jsx(ModalTitle, { children: t('richText.sourceCompatibilityWarningTitle') }), _jsx(ModalBody, { children: _jsx(\"p\", { className: \"text-sm text-muted\", children: t('richText.sourceCompatibilityWarningDescription') }) }), _jsxs(ModalFooter, { align: \"right\", children: [_jsx(Button, { variant: \"outline\", onClick: () => setEditingMode('source'), children: t('richText.editMarkdownSource') }), _jsx(Button, { variant: \"secondary\", onClick: () => setEditingMode('rich-text'), children: t('richText.continueRichText') })] })] })] }));\n}\n//# sourceMappingURL=VertesiaRichTextEditor.js.map"],"mappings":"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"}
|