@vertesia/ui 0.79.1 → 0.79.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. package/lib/esm/core/components/TagsInput.js +194 -0
  2. package/lib/esm/core/components/TagsInput.js.map +1 -0
  3. package/lib/esm/core/components/index.js +2 -1
  4. package/lib/esm/core/components/index.js.map +1 -1
  5. package/lib/esm/core/components/shadcn/popover.js +1 -1
  6. package/lib/esm/core/components/shadcn/popover.js.map +1 -1
  7. package/lib/esm/env/index.js +1 -1
  8. package/lib/esm/env/index.js.map +1 -1
  9. package/lib/esm/features/store/collections/EditCollectionView.js +18 -7
  10. package/lib/esm/features/store/collections/EditCollectionView.js.map +1 -1
  11. package/lib/esm/features/store/collections/SelectCollection.js +104 -39
  12. package/lib/esm/features/store/collections/SelectCollection.js.map +1 -1
  13. package/lib/esm/features/store/collections/SharedPropsEditor.js +40 -0
  14. package/lib/esm/features/store/collections/SharedPropsEditor.js.map +1 -0
  15. package/lib/esm/features/store/collections/SyncMemberHeadsToggle.js +35 -0
  16. package/lib/esm/features/store/collections/SyncMemberHeadsToggle.js.map +1 -0
  17. package/lib/esm/features/store/collections/index.js +2 -0
  18. package/lib/esm/features/store/collections/index.js.map +1 -1
  19. package/lib/esm/features/store/objects/upload/useSmartFileUploadProcessing.js +10 -9
  20. package/lib/esm/features/store/objects/upload/useSmartFileUploadProcessing.js.map +1 -1
  21. package/lib/esm/session/UserSessionProvider.js +2 -2
  22. package/lib/esm/session/UserSessionProvider.js.map +1 -1
  23. package/lib/esm/shell/apps/AppProjectSelector.js +2 -2
  24. package/lib/esm/shell/apps/AppProjectSelector.js.map +1 -1
  25. package/lib/tsconfig.tsbuildinfo +1 -1
  26. package/lib/types/core/components/TagsInput.d.ts +16 -0
  27. package/lib/types/core/components/TagsInput.d.ts.map +1 -0
  28. package/lib/types/core/components/index.d.ts +2 -1
  29. package/lib/types/core/components/index.d.ts.map +1 -1
  30. package/lib/types/core/components/shadcn/popover.d.ts +7 -0
  31. package/lib/types/core/components/shadcn/popover.d.ts.map +1 -1
  32. package/lib/types/features/store/collections/EditCollectionView.d.ts.map +1 -1
  33. package/lib/types/features/store/collections/SelectCollection.d.ts +2 -1
  34. package/lib/types/features/store/collections/SelectCollection.d.ts.map +1 -1
  35. package/lib/types/features/store/collections/SharedPropsEditor.d.ts +7 -0
  36. package/lib/types/features/store/collections/SharedPropsEditor.d.ts.map +1 -0
  37. package/lib/types/features/store/collections/SyncMemberHeadsToggle.d.ts +7 -0
  38. package/lib/types/features/store/collections/SyncMemberHeadsToggle.d.ts.map +1 -0
  39. package/lib/types/features/store/collections/index.d.ts +2 -0
  40. package/lib/types/features/store/collections/index.d.ts.map +1 -1
  41. package/lib/types/features/store/objects/upload/useSmartFileUploadProcessing.d.ts.map +1 -1
  42. package/lib/vertesia-ui-core.js +1 -1
  43. package/lib/vertesia-ui-core.js.map +1 -1
  44. package/lib/vertesia-ui-env.js +1 -1
  45. package/lib/vertesia-ui-env.js.map +1 -1
  46. package/lib/vertesia-ui-features.js +1 -1
  47. package/lib/vertesia-ui-features.js.map +1 -1
  48. package/lib/vertesia-ui-session.js +1 -1
  49. package/lib/vertesia-ui-session.js.map +1 -1
  50. package/lib/vertesia-ui-shell.js +1 -1
  51. package/lib/vertesia-ui-shell.js.map +1 -1
  52. package/package.json +166 -166
  53. package/src/env/index.ts +1 -1
  54. package/src/features/store/objects/upload/useSmartFileUploadProcessing.ts +1 -3
@@ -1 +1 @@
1
- {"version":3,"file":"vertesia-ui-features.js","sources":["esm/features/activity-doc/ActivityDoc.js","esm/features/agent/chat/JumpingDots.js","esm/features/agent/chat/AnimatedThinkingDots.js","esm/features/agent/chat/WaitingMessages.js","esm/features/agent/chat/ModernAgentOutput/utils.js","esm/features/agent/chat/ModernAgentOutput/MessageItem.js","esm/features/agent/chat/ModernAgentOutput/WorkstreamTabs.js","esm/features/agent/chat/ModernAgentOutput/AllMessagesMixed.js","esm/features/agent/PayloadBuilder.js","esm/features/agent/chat/ModernAgentOutput/Header.js","esm/features/store/objects/components/ContentDispositionButton.js","esm/features/store/objects/components/SaveVersionConfirmModal.js","esm/features/store/objects/components/PropertiesEditorModal.js","esm/features/store/objects/components/ContentOverview.js","esm/features/utils/text.js","esm/features/utils/mimeType.js","esm/features/utils/rendition.js","esm/features/store/objects/components/DocumentIcon.js","esm/features/facets/utils/utils.js","esm/features/facets/utils/StringFacet.js","esm/features/facets/utils/StringListFacet.js","esm/features/facets/utils/TypeFacet.js","esm/features/facets/utils/VStringFacet.js","esm/features/facets/utils/VTypeFacet.js","esm/features/user/UserInfo.js","esm/features/facets/utils/VUserFacet.js","esm/features/facets/EnvironmentFacet.js","esm/features/facets/RunsFacetsNav.js","esm/features/facets/utils/VInteractionFacet.js","esm/features/facets/utils/VEnvironmentFacet.js","esm/features/facets/WorkflowExecutionsFacetsNav.js","esm/features/facets/DocumentsFacetsNav.js","esm/features/facets/InteractionsFacetsNav.js","esm/features/facets/PromptsFacetsNav.js","esm/features/facets/CollectionsFacetsNav.js","esm/features/store/objects/DocumentSelectionProvider.js","esm/features/store/objects/layout/renderers.js","esm/features/store/objects/layout/DocumentTableColumn.js","esm/features/store/objects/layout/documentLayout.js","esm/features/store/objects/search/DocumentSearchContext.js","esm/features/store/objects/upload/useSmartFileUploadProcessing.js","esm/features/store/objects/upload/DocumentUploadModal.js","esm/features/store/objects/upload/useUploadHandler.js","esm/features/store/objects/DocumentTable.js","esm/features/store/objects/search/DocumentSearchProvider.js","esm/features/store/objects/components/SelectDocument.js","esm/features/store/objects/components/SelectDocumentModal.js","esm/features/store/objects/components/DocumentInput.js","esm/features/store/objects/components/useDownloadObject.js","esm/features/store/objects/DocumentPreviewPanel.js","esm/features/store/objects/components/VectorSearchWidget.js","esm/features/store/objects/DocumentSearchResults.js","esm/features/store/objects/ExportPropertiesModal.js","esm/features/store/collections/BrowseCollectionView.js","esm/features/store/types/SelectContentType.js","esm/features/store/collections/CreateCollection.js","esm/features/store/collections/CollectionsTable.js","esm/features/store/types/ContentObjectTypesTable.js","esm/features/store/types/search/ObjectTypeSearchContext.js","esm/features/store/types/CreateOrUpdateTypeModal.js","esm/features/store/types/ContentObjectTypesSearch.js","esm/features/store/types/ObjectSchemaEditor.js","esm/features/store/types/search/ObjectTypeSearchProvider.js","esm/features/store/types/SelectContentTypeModal.js","esm/features/store/types/TableLayoutEditor.js","esm/features/store/collections/EditCollectionView.js","esm/features/store/collections/SelectCollection.js","esm/features/store/objects/selection/actions/ChangeTypeAction.js","esm/features/store/objects/selection/actions/ConfirmAction.js","esm/features/store/objects/selection/actions/DeleteObjectsAction.js","esm/features/store/objects/selection/actions/ExportPropertiesAction.js","esm/features/store/objects/selection/actions/RemoveFromCollectionAction.js","esm/features/store/objects/selection/actions/StartWorkflowComponent.js","esm/features/store/objects/selection/ObjectsActionContext.js","esm/features/store/objects/selection/actions/AddToCollectionAction.js","esm/features/store/objects/selection/SelectionActions.js","esm/features/agent/chat/ModernAgentOutput/MessageInput.js","esm/features/agent/chat/ModernAgentOutput/InlineSlidingPlanPanel.js","esm/features/agent/chat/ModernAgentConversation.js","esm/features/errors/VertesiaErrorBoundary.js","esm/features/errors/PanelErrorBoundary.js","esm/features/errors/RowErrorBoundary.js","esm/features/errors/WidgetErrorBoundary.js","esm/features/layout/GenericPageNavHeader.js","esm/features/layout/NotFoundView.js","esm/features/magic-pdf/PdfPageProvider.js","esm/features/magic-pdf/DownloadPopover.js","esm/features/magic-pdf/PageSlider.js","esm/features/magic-pdf/TextPageView.js","esm/features/magic-pdf/MagicPdfView.js","esm/features/magic-pdf/useResizeOnDrag.js","esm/features/permissions/helpers.js","esm/features/permissions/UserPermissionsProvider.js","esm/features/permissions/SecureButton.js","esm/features/permissions/SecureSidebarItem.js","esm/features/user/UserAvatar.js"],"sourcesContent":["import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport clsx from \"clsx\";\nimport { AnimatePresence, motion } from \"motion/react\";\nimport { useMemo, useState } from \"react\";\nfunction Badge({ children, secondary = false }) {\n const className = secondary ? \"bg-secondary text-primary\" : \"text-foreground bg-muted\";\n return _jsx(\"span\", { className: className, children: children });\n}\n/**\n * Resolve nested array inner type\n * @param innerType\n */\nfunction resolveInnerType(innerType) {\n if (!innerType) {\n return undefined;\n }\n else if (innerType.name === \"array\") {\n return resolveInnerType(innerType.innerType);\n }\n else {\n return innerType;\n }\n}\nfunction PropertySignature({ property }) {\n return (_jsxs(\"div\", { className: \"flex items-center gap-x-2\", children: [_jsx(\"div\", { className: \"font-semibold text-gray-600\", children: property.name }), property.optional && _jsx(Badge, { children: \"optional\" }), _jsx(Badge, { children: property.type.value })] }));\n}\nexport function ActivitiesDoc({ activities }) {\n return (_jsx(\"div\", { className: 'flex flex-col gap-y-4 divide-y divide-gray-200', children: activities.map(activity => _jsx(ActivityDoc, { activity: activity }, activity.name)) }));\n}\nfunction ActivitySectionTitle({ code, children }) {\n return (_jsxs(\"div\", { className: \"flex gap-2 items-center border-b border-b-gray-200 mb-2\", children: [_jsx(\"div\", { className: 'text-lg font-medium text-gray-900 py-2 ', children: children }), code && _jsx(\"div\", { children: _jsx(Badge, { children: code }) })] }));\n}\nexport function ActivityDoc({ activity, headingClass, headingRef }) {\n return (_jsxs(\"div\", { className: headingClass, id: activity.name, ref: headingRef, children: [_jsx(\"div\", { className: \"text-xl font-semibold pt-8\", children: activity.title }), _jsx(\"div\", { className: \"pb-4\", children: _jsx(Badge, { children: activity.name }) }), activity.doc &&\n _jsx(\"div\", { className: \"text-gray-700 pb-2\", children: activity.doc }), _jsxs(\"div\", { className: \"pb-4\", children: [_jsx(ActivitySectionTitle, { code: activity.paramsType, children: \"Parameters\" }), _jsx(\"div\", { className: \"divide-y divide-gray-100\", children: activity.params.map(prop => _jsx(PropertyDetails, { property: prop }, prop.name)) })] }), _jsxs(\"div\", { className: \"pb-4\", children: [_jsx(ActivitySectionTitle, { children: \"Returns\" }), _jsx(\"div\", { children: activity.returnType ? activity.returnType.value : \"void\" })] })] }));\n}\nfunction PropertyDetails({ property, className }) {\n const expandable = useMemo(() => {\n const type = resolveInnerType(property.type.innerType) ?? property.type;\n if (type.name === \"object\" && type.members) {\n return _jsx(ObjectMembersPanel, { members: type.members });\n }\n else if (type.name === 'enum' && type.enum) {\n return _jsx(EnumValuesPanel, { values: type.enum });\n }\n else {\n return null;\n }\n }, [property.type.innerType]);\n return (_jsxs(\"div\", { className: clsx(\"py-2\", className), children: [_jsx(PropertySignature, { property: property }), property.doc && _jsx(\"div\", { className: \"text-gray-700 text-sm pt-2\", children: property.doc }), expandable && _jsx(\"div\", { className: \"my-2 overflow-hidden\", children: expandable })] }));\n}\nfunction EnumValuesPanel({ values }) {\n return _jsx(\"div\", { className: \"flex flex-wrap items-center gap-2\", children: values.map((v, i) => _jsx(Badge, { secondary: true, children: v }, i)) });\n}\nfunction ObjectMembersPanel({ members }) {\n return _jsx(ExpandablePanel, { className: 'rounded-md border border-gray-200', button: (isOn) => (_jsxs(\"div\", { className: \"px-4 py-2 flex items-center gap-x-2 text-sm font-medium hover:text-blue-600\", children: [_jsx(ExpandIcon, { isOpen: isOn }), isOn ?\n _jsx(\"div\", { children: \"Hide child properties\" })\n :\n _jsx(\"div\", { children: \"Show child properties\" })] })), body: _jsx(NestedPropertiesDetails, { properties: members }) });\n}\nfunction NestedPropertiesDetails({ properties }) {\n return (_jsx(\"div\", { className: 'border-l-2 border-l-blue-200 flex flex-col divide-y divide-gray-100 border-t border-t-gray-200', children: properties.map(prop => _jsx(PropertyDetails, { property: prop, className: \"px-4 py-2\" }, prop.name)) }));\n}\nfunction ExpandablePanel({ button, body, className, isInitiallyOpen }) {\n const [isExpanded, setExpanded] = useState(isInitiallyOpen || false);\n return (_jsxs(\"div\", { className: clsx(isExpanded ? \"block\" : \"inline-block\", className), children: [_jsx(\"button\", { className: 'p-0 m-0 bg-transparent', onClick: () => setExpanded(!isExpanded), children: _jsx(AnimatePresence, { children: button(isExpanded) }) }), _jsx(AnimatePresence, { children: isExpanded && _jsx(motion.div, { className: 'overflow-hidden', initial: { height: 0, opacity: 0 }, animate: { height: 'auto', opacity: 1 }, exit: { height: 0, opacity: 0 }, transition: { duration: 0.3, ease: 'easeOut' }, children: body }) })] }));\n}\nfunction ExpandIcon({ isOpen }) {\n return (_jsx(AnimatePresence, { propagate: true, mode: \"wait\", children: _jsx(motion.div, { className: \"font-mono font-semibold text-gray-400 text-lg\", initial: { rotate: 0 }, animate: { rotate: isOpen ? 45 : 0 }, transition: { duration: 0.2 }, children: \"+\" }, \"closeIcon\") }));\n}\n//# sourceMappingURL=ActivityDoc.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { cn } from \"@vertesia/ui/core\";\nexport function JumpingDots({ className, inline = false }) {\n return (_jsxs(\"div\", { className: cn(\"flex items-center gap-1\", inline ? \"inline-flex\" : \"\", className), children: [_jsx(\"div\", { className: \"w-2 h-2 bg-blue-500 rounded-full animate-[jumping_1s_infinite_ease-in-out] hover:bg-blue-600\", style: { transform: 'translateY(0)', animationRange: '0px -8px' } }), _jsx(\"div\", { className: \"w-2 h-2 bg-blue-500 rounded-full animate-[jumping_1s_0.3s_infinite_ease-in-out] hover:bg-blue-600\", style: { transform: 'translateY(0)', animationRange: '0px -8px' } }), _jsx(\"div\", { className: \"w-2 h-2 bg-blue-500 rounded-full animate-[jumping_1s_0.6s_infinite_ease-in-out] hover:bg-blue-600\", style: { transform: 'translateY(0)', animationRange: '0px -8px' } })] }));\n}\n//# sourceMappingURL=JumpingDots.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { cn } from \"@vertesia/ui/core\";\nimport { useEffect, useState } from \"react\";\nexport function AnimatedThinkingDots({ className, inline = false, color = 'blue' }) {\n // Enhanced gradient colors based on the color prop\n const gradientColors = {\n blue: \"from-blue-400 to-indigo-500 dark:from-blue-500 dark:to-indigo-400\",\n purple: \"from-purple-400 to-violet-500 dark:from-purple-500 dark:to-violet-400\",\n teal: \"from-teal-400 to-emerald-500 dark:from-teal-500 dark:to-emerald-400\",\n green: \"from-green-400 to-emerald-500 dark:from-green-500 dark:to-emerald-400\",\n amber: \"from-amber-400 to-orange-500 dark:from-amber-500 dark:to-orange-400\"\n };\n const gradientClass = gradientColors[color];\n return (_jsxs(\"div\", { className: cn(\"flex items-center gap-1.5\", inline ? \"inline-flex\" : \"\", className), children: [_jsx(\"div\", { className: `w-2 h-2 bg-gradient-to-r ${gradientClass} rounded-full animate-[bounce_1.2s_ease-in-out_infinite]` }), _jsx(\"div\", { className: `w-2 h-2 bg-gradient-to-r ${gradientClass} rounded-full animate-[bounce_1.2s_ease-in-out_0.2s_infinite]` }), _jsx(\"div\", { className: `w-2 h-2 bg-gradient-to-r ${gradientClass} rounded-full animate-[bounce_1.2s_ease-in-out_0.4s_infinite]` })] }));\n}\nexport function PulsatingCircle({ className, size = 'md', color = 'blue' }) {\n // Enhanced size classes\n const sizeClasses = {\n sm: 'w-3 h-3',\n md: 'w-5 h-5',\n lg: 'w-7 h-7'\n };\n // Enhanced color mapping with gradients\n const colorClasses = {\n blue: 'bg-blue-500 dark:bg-blue-400',\n purple: 'bg-purple-500 dark:bg-purple-400',\n teal: 'bg-teal-500 dark:bg-teal-400',\n green: 'bg-green-500 dark:bg-green-400',\n amber: 'bg-amber-500 dark:bg-amber-400'\n };\n // Return enhanced implementation using smoother animations\n return (_jsxs(\"span\", { className: cn(\"relative flex\", className), children: [_jsx(\"span\", { className: cn(\"animate-ping absolute inline-flex h-full w-full rounded-full opacity-60\", colorClasses[color]) }), _jsx(\"span\", { className: cn(\"animate-pulse absolute inline-flex h-[80%] w-[80%] rounded-full opacity-80\", colorClasses[color]), style: {\n left: '10%',\n top: '10%',\n animationDuration: '2s'\n } }), _jsx(\"span\", { className: cn(\"relative inline-flex rounded-full\", colorClasses[color], sizeClasses[size]) })] }));\n}\nexport function TypedDots({ className, color = 'blue' }) {\n const [dots, setDots] = useState('.');\n const colorClasses = {\n blue: 'text-blue-600 dark:text-blue-400',\n purple: 'text-purple-600 dark:text-purple-400',\n teal: 'text-teal-600 dark:text-teal-400',\n green: 'text-green-600 dark:text-green-400',\n amber: 'text-amber-600 dark:text-amber-400'\n };\n useEffect(() => {\n const intervalId = setInterval(() => {\n setDots(prev => prev === '.' ? '..' :\n prev === '..' ? '...' : '.');\n }, 500);\n return () => clearInterval(intervalId);\n }, []);\n return _jsx(\"span\", { className: cn(colorClasses[color], \"font-bold\", className), children: dots });\n}\nexport function PulsingMessageLoader({ message, className, color = 'blue' }) {\n const colorClasses = {\n blue: {\n dot: 'bg-blue-500 dark:bg-blue-400',\n text: 'text-blue-700 dark:text-blue-300'\n },\n purple: {\n dot: 'bg-purple-500 dark:bg-purple-400',\n text: 'text-purple-700 dark:text-purple-300'\n },\n teal: {\n dot: 'bg-teal-500 dark:bg-teal-400',\n text: 'text-teal-700 dark:text-teal-300'\n },\n green: {\n dot: 'bg-green-500 dark:bg-green-400',\n text: 'text-green-700 dark:text-green-300'\n },\n amber: {\n dot: 'bg-amber-500 dark:bg-amber-400',\n text: 'text-amber-700 dark:text-amber-300'\n }\n };\n return (_jsxs(\"div\", { className: cn(\"flex items-center gap-2 py-1\", className), children: [_jsxs(\"div\", { className: \"flex space-x-1\", children: [_jsx(\"div\", { className: `w-1.5 h-1.5 ${colorClasses[color].dot} rounded-full animate-bounce` }), _jsx(\"div\", { className: `w-1.5 h-1.5 ${colorClasses[color].dot} rounded-full animate-bounce`, style: { animationDelay: '0.2s' } }), _jsx(\"div\", { className: `w-1.5 h-1.5 ${colorClasses[color].dot} rounded-full animate-bounce`, style: { animationDelay: '0.4s' } })] }), _jsx(\"div\", { className: `${colorClasses[color].text} font-medium text-xs`, children: message })] }));\n}\nexport function ThinkingBar({ className, color = 'blue', width = 'md', message }) {\n const [progress, setProgress] = useState(15);\n const [direction, setDirection] = useState('increasing');\n const [speed, setSpeed] = useState(0.4); // Lower initial speed for smoother motion\n // Width classes\n const widthClasses = {\n sm: 'w-24',\n md: 'w-32',\n lg: 'w-48',\n xl: 'w-64',\n full: 'w-full'\n };\n // Color classes\n const colorClasses = {\n blue: 'bg-blue-200 dark:bg-blue-900/30',\n purple: 'bg-purple-200 dark:bg-purple-900/30',\n teal: 'bg-teal-200 dark:bg-teal-900/30',\n green: 'bg-green-200 dark:bg-green-900/30',\n amber: 'bg-amber-200 dark:bg-amber-900/30'\n };\n const barColorClasses = {\n blue: 'bg-gradient-to-r from-blue-400 to-blue-500 dark:from-blue-500 dark:to-blue-400',\n purple: 'bg-gradient-to-r from-purple-400 to-purple-500 dark:from-purple-500 dark:to-purple-400',\n teal: 'bg-gradient-to-r from-teal-400 to-teal-500 dark:from-teal-500 dark:to-teal-400',\n green: 'bg-gradient-to-r from-green-400 to-green-500 dark:from-green-500 dark:to-green-400',\n amber: 'bg-gradient-to-r from-amber-400 to-amber-500 dark:from-amber-500 dark:to-amber-400'\n };\n const textColorClasses = {\n blue: 'text-blue-700 dark:text-blue-300',\n purple: 'text-purple-700 dark:text-purple-300',\n teal: 'text-teal-700 dark:text-teal-300',\n green: 'text-green-700 dark:text-green-300',\n amber: 'text-amber-700 dark:text-amber-300'\n };\n // Using requestAnimationFrame for smoother animation\n useEffect(() => {\n let animationFrameId;\n let lastUpdateTime = Date.now();\n const updateProgressBar = () => {\n const now = Date.now();\n const deltaTime = now - lastUpdateTime;\n lastUpdateTime = now;\n setProgress(prev => {\n // Calculate movement based on time delta for consistent animation speed\n // regardless of frame rate\n const timeBasedChange = speed * (deltaTime / 16); // Normalize to 60fps\n // Calculate next progress based on direction\n let next = direction === 'increasing'\n ? prev + timeBasedChange\n : prev - timeBasedChange;\n // Handle direction changes at boundaries with easing\n if (next >= 85) {\n setDirection('decreasing');\n // Randomize speed slightly, but keep it low for smoothness\n setSpeed(0.3 + Math.random() * 0.2);\n return 85; // Cap at exactly 85%\n }\n else if (next <= 15) {\n setDirection('increasing');\n // Randomize speed slightly, but keep it low for smoothness\n setSpeed(0.3 + Math.random() * 0.2);\n return 15; // Cap at exactly 15%\n }\n // Occasionally adjust speed slightly (less frequently) for subtle natural feeling\n if (Math.random() > 0.99) {\n setSpeed(prev => Math.max(0.2, Math.min(0.5, prev + (Math.random() * 0.1 - 0.05))));\n }\n return next;\n });\n animationFrameId = requestAnimationFrame(updateProgressBar);\n };\n animationFrameId = requestAnimationFrame(updateProgressBar);\n return () => {\n cancelAnimationFrame(animationFrameId);\n };\n }, [direction, speed]);\n return (_jsxs(\"div\", { className: cn(\"flex flex-col gap-1\", className), children: [message && (_jsx(\"div\", { className: `text-xs font-medium ${textColorClasses[color]} mb-1`, children: message })), _jsx(\"div\", { className: cn(\"h-1.5 rounded-full overflow-hidden shadow-inner\", colorClasses[color], widthClasses[width]), children: _jsx(\"div\", { className: cn(\"h-full rounded-full\", barColorClasses[color]), style: {\n width: `${progress}%`,\n transition: 'width 150ms cubic-bezier(0.4, 0.0, 0.2, 1)' // Material Design easing for smoothness\n } }) })] }));\n}\nexport function WavyThinking({ className, color = 'blue', size = 'md' }) {\n // State to store and update heights of bars\n const [barHeights, setBarHeights] = useState(Array(7).fill(50));\n // Size classes\n const sizeClasses = {\n sm: { width: 'w-16', height: 'h-4', barWidth: 'w-0.5', gap: 'gap-[2px]' },\n md: { width: 'w-20', height: 'h-5', barWidth: 'w-1', gap: 'gap-[3px]' },\n lg: { width: 'w-24', height: 'h-6', barWidth: 'w-1.5', gap: 'gap-1' }\n };\n // Enhanced color classes with gradients for more visual appeal\n const colorClasses = {\n blue: 'bg-gradient-to-b from-blue-400 to-blue-500 dark:from-blue-400 dark:to-blue-500',\n purple: 'bg-gradient-to-b from-purple-400 to-purple-500 dark:from-purple-400 dark:to-purple-500',\n teal: 'bg-gradient-to-b from-teal-400 to-teal-500 dark:from-teal-400 dark:to-teal-500',\n green: 'bg-gradient-to-b from-green-400 to-green-500 dark:from-green-400 dark:to-green-500',\n amber: 'bg-gradient-to-b from-amber-400 to-amber-500 dark:from-amber-400 dark:to-amber-500'\n };\n // Use requestAnimationFrame for smooth animation\n useEffect(() => {\n let animationFrameId;\n const speeds = [1.2, 1.0, 1.5, 0.8, 1.3, 0.9, 1.1]; // Different speeds for each bar\n const phases = [0, 0.5, 1, 1.5, 2, 2.5, 3]; // Different starting phases for each bar\n let time = 0;\n const animateBars = () => {\n time += 0.02; // Increment time for animation\n // Update each bar's height with smooth sine wave\n const newHeights = barHeights.map((_, index) => {\n // Calculate height using smooth sine wave with individual phase and speed\n // Scale to make sure it stays within 10% to 90% range\n return 10 + (Math.sin(time * speeds[index] + phases[index]) + 1) * 40;\n });\n setBarHeights(newHeights);\n animationFrameId = requestAnimationFrame(animateBars);\n };\n animationFrameId = requestAnimationFrame(animateBars);\n return () => {\n cancelAnimationFrame(animationFrameId);\n };\n }, []); // Empty dependency array means this runs once on mount\n return (_jsx(\"div\", { className: cn(\"flex items-end justify-center\", sizeClasses[size].width, sizeClasses[size].height, sizeClasses[size].gap, className), children: barHeights.map((height, i) => (_jsx(\"div\", { className: cn(sizeClasses[size].barWidth, \"rounded-full transform-gpu\", colorClasses[color]), style: {\n height: `${height}%`,\n transition: 'height 100ms cubic-bezier(0.4, 0.0, 0.2, 1)', // Smooth transition\n opacity: 0.9\n } }, i))) }));\n}\n//# sourceMappingURL=AnimatedThinkingDots.js.map","export const ThinkingMessages = [\n // Original messages\n \"Brewing some code magic...\",\n \"Doing the robot dance...\",\n \"Cooking up something good...\",\n \"Working my gears...\",\n // Tech-inspired messages\n \"Parsing the possibilities...\",\n \"Crunching the numbers...\",\n \"Connecting the digital dots...\",\n \"Processing at maximum capacity...\",\n \"Searching through my circuits...\",\n \"Running advanced algorithms...\",\n \"Computing optimal solutions...\",\n \"Loading brilliance.exe...\",\n \"Scanning the knowledge base...\",\n \"Optimizing response protocols...\",\n // Playful messages\n \"Having a quick brainstorm...\",\n \"Thinking cap firmly on...\",\n \"Pondering the digital universe...\",\n \"Consulting my silicon wisdom...\",\n \"Untangling the logic knots...\",\n \"Assembling clever responses...\",\n \"Mixing thoughtful ingredients...\",\n \"Polishing the perfect answer...\",\n \"Taking a momentary mind sprint...\",\n \"Connecting virtual synapses...\",\n // Food-themed messages\n \"Baking fresh ideas...\",\n \"Stirring the thought pot...\",\n \"Simmering solutions slowly...\",\n \"Whipping up a smart response...\",\n \"Adding a dash of intelligence...\",\n \"Preparing a gourmet answer...\",\n // Nature-themed messages\n \"Growing brilliant ideas...\",\n \"Cultivating the perfect response...\",\n \"Gathering digital nectar...\",\n \"Planting seeds of solutions...\",\n // Journey-themed messages\n \"Exploring the data landscape...\",\n \"Mapping the solution path...\",\n \"Navigating through possibilities...\",\n \"Charting the course to answers...\",\n \"Embarking on a thought expedition...\",\n // Creative-themed messages\n \"Sketching out concepts...\",\n \"Painting with digital brushstrokes...\",\n \"Composing my response symphony...\",\n \"Crafting precision answers...\",\n \"Weaving threads of information...\",\n // Time-themed messages\n \"Just a moment of processing...\",\n \"Taking a quick thinking break...\",\n \"Almost there, final touches...\",\n \"Putting the pieces together...\",\n \"Making progress, hold tight...\",\n];\n//# sourceMappingURL=WaitingMessages.js.map","import dayjs from \"dayjs\";\nimport { AgentMessageType } from \"@vertesia/common\";\nexport function insertMessageInTimeline(arr, m) {\n const t = typeof m.timestamp === \"number\" ? m.timestamp : new Date(m.timestamp).getTime();\n const idx = arr.findIndex((a) => {\n const at = typeof a.timestamp === \"number\" ? a.timestamp : new Date(a.timestamp).getTime();\n return at > t;\n });\n if (idx === -1)\n arr.push(m);\n else\n arr.splice(idx, 0, m);\n}\n/**\n * Check if a conversation is still in progress\n * This function checks the main workstream status to determine if the conversation is complete\n * For multi-workstream scenarios, we keep streaming until the main workstream is complete\n */\nexport const DONE_STATES = [\n AgentMessageType.COMPLETE,\n AgentMessageType.IDLE,\n AgentMessageType.REQUEST_INPUT,\n AgentMessageType.TERMINATED,\n];\nexport function isInProgress(messages) {\n if (!messages.length)\n return true;\n // First, group messages by workstream\n const workstreamMessages = new Map();\n messages.forEach((message) => {\n const workstreamId = getWorkstreamId(message);\n if (!workstreamMessages.has(workstreamId)) {\n workstreamMessages.set(workstreamId, []);\n }\n workstreamMessages.get(workstreamId).push(message);\n });\n // Log all workstreams we found for debugging\n console.log(\"[isInProgress] Workstreams found:\", Array.from(workstreamMessages.keys()));\n // If there's only one workstream and it's not \"main\", we should treat it as the main one\n // This handles cases where a conversation might not have an explicit main workstream\n if (workstreamMessages.size === 1 && !workstreamMessages.has(\"main\")) {\n const onlyWorkstreamId = workstreamMessages.keys().next().value || \"unknown\";\n console.log(`[isInProgress] Only one workstream found (${onlyWorkstreamId}), treating as main`);\n const onlyWorkstreamMsgs = workstreamMessages.get(onlyWorkstreamId);\n const lastMessage = onlyWorkstreamMsgs[onlyWorkstreamMsgs.length - 1];\n console.log(`[isInProgress] Last message type in only workstream: ${lastMessage.type}`);\n // Check if this single workstream is completed\n if (!DONE_STATES.includes(lastMessage.type)) {\n console.log(\"[isInProgress] Only workstream is still in progress\");\n return true;\n }\n console.log(\"[isInProgress] Only workstream is completed\");\n return false;\n }\n // Check the main workstream if it exists\n if (workstreamMessages.has(\"main\")) {\n const mainWorkstreamMsgs = workstreamMessages.get(\"main\");\n // If there are no messages in the main workstream, the conversation is still in progress\n if (mainWorkstreamMsgs.length === 0) {\n console.log(\"[isInProgress] Main workstream exists but has no messages, still in progress\");\n return true;\n }\n // Check if the main workstream is completed\n const lastMainMessage = mainWorkstreamMsgs[mainWorkstreamMsgs.length - 1];\n console.log(`[isInProgress] Last message type in main workstream: ${lastMainMessage.type}`);\n if (!DONE_STATES.includes(lastMainMessage.type)) {\n console.log(\"[isInProgress] Main workstream is still in progress\");\n return true;\n }\n console.log(\"[isInProgress] Main workstream is completed\");\n return false;\n }\n // If we get here, there are multiple workstreams but no \"main\" workstream\n // We'll keep the conversation active if any workstream is still active\n console.log(\"[isInProgress] Multiple workstreams but no main, checking if any are still active\");\n for (const [workstreamId, msgs] of workstreamMessages.entries()) {\n if (msgs.length > 0) {\n const lastMessage = msgs[msgs.length - 1];\n if (!DONE_STATES.includes(lastMessage.type)) {\n console.log(`[isInProgress] Workstream ${workstreamId} is still active`);\n return true;\n }\n }\n }\n console.log(\"[isInProgress] All workstreams are completed\");\n return false;\n}\nexport const formatRelative = (ts) => typeof ts === \"number\" ? dayjs(ts).fromNow() : dayjs(new Date(ts)).fromNow();\n/**\n * Extract the workstream ID from a message\n * @param message The agent message to analyze\n * @returns The workstream ID (defaults to 'main' if none found)\n */\nexport function getWorkstreamId(message) {\n // Only use the direct workstream_id property on the message\n if (message.workstream_id) {\n // For debugging COMPLETE messages\n if (message.type === AgentMessageType.COMPLETE) {\n console.log(\"[getWorkstreamId] COMPLETE message with workstream_id:\", message.workstream_id);\n }\n return message.workstream_id;\n }\n // For debugging COMPLETE messages without workstream_id\n if (message.type === AgentMessageType.COMPLETE) {\n console.log(\"[getWorkstreamId] COMPLETE message without workstream_id, defaulting to 'main'\");\n }\n // Default to 'main' workstream\n return \"main\";\n}\n/**\n * Get a map of workstream IDs to their completion status\n * @param messages List of agent messages\n * @returns Map of workstream IDs to completion status ('pending', 'in_progress', or 'completed')\n */\nexport function getWorkstreamStatusMap(messages) {\n const workstreamMessages = new Map();\n const statusMap = new Map();\n // Group messages by workstream\n messages.forEach((message) => {\n const workstreamId = getWorkstreamId(message);\n if (!workstreamMessages.has(workstreamId)) {\n workstreamMessages.set(workstreamId, []);\n // Initialize all workstreams as pending\n statusMap.set(workstreamId, \"pending\");\n }\n workstreamMessages.get(workstreamId).push(message);\n });\n // Log all workstreams found\n console.log(\"[getWorkstreamStatusMap] Found workstreams:\", Array.from(workstreamMessages.keys()));\n // Determine status based on last message type\n for (const [workstreamId, msgs] of workstreamMessages.entries()) {\n if (msgs.length > 0) {\n // Mark as in_progress by default if there are any messages\n statusMap.set(workstreamId, \"in_progress\");\n // Check if completed based on last message or any COMPLETE message\n const lastMessage = msgs[msgs.length - 1];\n // Check for any COMPLETE message in this workstream\n const hasCompleteMessage = msgs.some(msg => msg.type === AgentMessageType.COMPLETE &&\n (msg.workstream_id === workstreamId || (!msg.workstream_id && workstreamId === 'main')));\n if (hasCompleteMessage ||\n DONE_STATES.includes(lastMessage.type)) {\n console.log(`[getWorkstreamStatusMap] Marking workstream ${workstreamId} as completed`);\n statusMap.set(workstreamId, \"completed\");\n }\n else {\n console.log(`[getWorkstreamStatusMap] Workstream ${workstreamId} is in_progress`);\n }\n }\n }\n // Log final status map for debugging\n console.log(\"[getWorkstreamStatusMap] Final status map:\", Array.from(statusMap.entries()).map(([id, status]) => `${id}: ${status}`).join(', '));\n return statusMap;\n}\n// Helper function to get conversation URL - used by other components\nexport async function getConversationUrl(vertesia, workflowRunId) {\n return vertesia.files\n .getDownloadUrl(`agents/${workflowRunId}/conversation.json`)\n .then((r) => r.url);\n}\n//# sourceMappingURL=utils.js.map","import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { AgentMessageType } from \"@vertesia/common\";\nimport { Badge, Button, useToast } from \"@vertesia/ui/core\";\nimport { NavLink } from \"@vertesia/ui/router\";\nimport { useUserSession } from \"@vertesia/ui/session\";\nimport dayjs from \"dayjs\";\nimport { AlertCircle, Bot, CheckCircle, Clock, CopyIcon, Info, MessageSquare, User } from \"lucide-react\";\nimport { useEffect, useState } from \"react\";\nimport Markdown from \"react-markdown\";\nimport remarkGfm from \"remark-gfm\";\nimport { AnimatedThinkingDots, PulsatingCircle } from \"../AnimatedThinkingDots\";\nimport { ThinkingMessages } from \"../WaitingMessages\";\nimport { getWorkstreamId } from \"./utils\";\nexport default function MessageItem({ message, showPulsatingCircle = false }) {\n const [showDetails, setShowDetails] = useState(false);\n const [processedContent, setProcessedContent] = useState(\"\");\n const [isProcessingImages, setIsProcessingImages] = useState(false);\n const { client } = useUserSession();\n const toast = useToast();\n // Simplified message styling with minimal distinction between different types\n const getMessageStyles = () => {\n // Common styling for all messages with subtle type indication\n const baseStyle = {\n containerClass: \"bg-white border-l-4 border-l-muted/30 shadow-sm\",\n iconComponent: _jsx(Bot, { className: \"size-4 text-muted\" }),\n sender: \"\",\n };\n // Just add minimal type indicators\n switch (message.type) {\n case AgentMessageType.ANSWER:\n return {\n ...baseStyle,\n containerClass: \"bg-white border-l-4 border-l-muted/30 shadow-sm\",\n iconComponent: _jsx(Bot, { className: \"size-4 text-muted\" }),\n sender: \"Agent\",\n };\n case AgentMessageType.COMPLETE:\n return {\n ...baseStyle,\n containerClass: \"bg-white border-l-4 border-l-success shadow-sm\",\n iconComponent: _jsx(CheckCircle, { className: \"size-4 text-success\" }),\n sender: \"Completed\",\n };\n case AgentMessageType.TERMINATED:\n return {\n ...baseStyle,\n containerClass: \"bg-white border-l-4 border-l-attention shadow-sm\",\n iconComponent: _jsx(CheckCircle, { className: \"size-4 text-attention\" }),\n sender: \"Terminated\",\n };\n case AgentMessageType.QUESTION:\n return {\n ...baseStyle,\n iconComponent: _jsx(User, { className: \"size-4 text-muted\" }),\n sender: \"User\",\n };\n case AgentMessageType.THOUGHT:\n return {\n ...baseStyle,\n iconComponent: showPulsatingCircle ? (_jsx(PulsatingCircle, { size: \"sm\", color: \"blue\" })) : (_jsx(Bot, { className: \"size-4 text-muted\" })),\n sender: \"Agent\",\n };\n case AgentMessageType.ERROR:\n return {\n ...baseStyle,\n iconComponent: _jsx(AlertCircle, { className: \"size-4 text-muted\" }),\n sender: \"System\",\n };\n case AgentMessageType.UPDATE:\n return {\n ...baseStyle,\n containerClass: \"bg-white border-l-4 border-success shadow-sm\",\n iconComponent: _jsx(Info, { className: \"size-4 text-success\" }),\n sender: \"Update\",\n };\n case AgentMessageType.PLAN:\n return {\n ...baseStyle,\n iconComponent: _jsx(MessageSquare, { className: \"size-4 text-muted\" }),\n sender: \"Agent\",\n };\n default:\n return {\n ...baseStyle,\n sender: `Agent`,\n };\n }\n };\n const messageStyles = getMessageStyles();\n // Convert links in the content (now async to handle image URLs)\n const convertLinks = async (content) => {\n // If content is not a string, return it as is\n if (typeof content !== \"string\") {\n return content;\n }\n let processedContent = content;\n // First, handle store and collection links\n processedContent = processedContent.replace(/\\[([^\\]]+)\\]\\((store|collection):([a-f\\d]{24})\\)/gi, (_, text, type, id) => {\n const path = type === 'store' ? 'objects' : 'collections';\n return `[${text}](/store/${path}/${id})`;\n });\n // Then, handle image links by finding all image:<gcspath> patterns\n const imageRegex = /!\\[([^\\]]*)\\]\\(image:([^)]+)\\)/g;\n const imageMatches = Array.from(processedContent.matchAll(imageRegex));\n // Process all image URLs in parallel\n const imageReplacements = await Promise.all(imageMatches.map(async (match) => {\n const [fullMatch, altText, gcsPath] = match;\n try {\n const response = await client.files.getDownloadUrl(gcsPath);\n return { fullMatch, replacement: `![${altText}](${response.url})` };\n }\n catch (error) {\n console.error(`Failed to get download URL for image: ${gcsPath}`, error);\n // Return original on error\n return { fullMatch, replacement: fullMatch };\n }\n }));\n // Apply all replacements\n for (const { fullMatch, replacement } of imageReplacements) {\n processedContent = processedContent.replace(fullMatch, replacement);\n }\n return processedContent;\n };\n // Get the message content to display with thinking message replacement\n const getMessageContent = () => {\n let content = \"\";\n if (message.message) {\n // Check if message.message is an object\n if (typeof message.message === \"object\") {\n // Use JSONView for objects - we'll need to stringify it for now\n // as we don't have direct access to JSONView\n content = JSON.stringify(message.message, null, 2);\n }\n else if (message.message.trim) {\n content = message.message.trim();\n }\n else {\n // Fallback for other non-string, non-object cases\n content = String(message.message);\n }\n }\n // Replace %thinking_message% placeholder with a thinking message\n if (typeof content === \"string\" && content.includes(\"%thinking_message%\")) {\n // Get a random thinking message since we don't have access to thinkingMessageIndex here\n const randomIndex = Math.floor(Math.random() * ThinkingMessages.length);\n content = content.replace(/%thinking_message%/g, ThinkingMessages[randomIndex]);\n }\n return content;\n };\n // Copy message content to clipboard\n const copyToClipboard = () => {\n const messageContent = getMessageContent() || \"\";\n const detailsContent = typeof message.details === \"string\"\n ? message.details\n : message.details\n ? JSON.stringify(message.details, null, 2)\n : \"\";\n const textToCopy = [messageContent, detailsContent ? \"\\n\\nDetails:\\n\" + detailsContent : \"\"].join(\"\").trim();\n navigator.clipboard.writeText(textToCopy).then(() => {\n toast({\n status: \"success\",\n title: \"Copied to clipboard\",\n duration: 2000,\n });\n });\n };\n // Process content to enhance markdown detection for lists and thinking messages\n const processContentForMarkdown = (content) => {\n // If content is not a string, return it as is\n if (typeof content !== \"string\") {\n return content;\n }\n // Special handling for thought messages to ensure proper markdown formatting\n if (message.type === AgentMessageType.THOUGHT ||\n (typeof message.message === \"string\" &&\n (message.message.toLowerCase().includes(\"thinking about\") ||\n message.message.toLowerCase().includes(\"i'm thinking\") ||\n message.message.toLowerCase().includes(\"💭\")))) {\n let formattedContent = content;\n // Check for numbering patterns like \"1. First item 2. Second item\"\n if (/\\d+\\.\\s+.+/.test(formattedContent)) {\n // Format numbered lists by adding newlines between items\n formattedContent = formattedContent.replace(/(\\d+\\.\\s+.+?)(?=\\s+\\d+\\.\\s+|$)/g, \"$1\\n\\n\");\n // Make sure nested content under numbered items is properly indented\n formattedContent = formattedContent.replace(/(\\d+\\.\\s+.+\\n)([^\\d\\n][^:])/g, \"$1 $2\");\n }\n // Handle colon-prefixed items that should be on separate lines\n if (formattedContent.includes(\":\") && !formattedContent.includes(\"\\n\\n\")) {\n formattedContent = formattedContent.replace(/\\b(First|Next|Then|Finally|Lastly|Additionally|Step \\d+):\\s+/gi, \"\\n\\n$&\");\n }\n // Handle thinking points or list-like structures even without numbers\n if (formattedContent.includes(\" - \")) {\n formattedContent = formattedContent.replace(/\\s+-\\s+/g, \"\\n- \");\n }\n return formattedContent;\n }\n // Normal processing for non-thinking messages\n if (/\\d+\\.\\s+.+/.test(content) && !content.includes(\"\\n\\n\")) {\n // Add proper line breaks for numbered lists that aren't already properly formatted\n return content.replace(/(\\d+\\.\\s+.+?)(?=\\s+\\d+\\.\\s+|$)/g, \"$1\\n\\n\");\n }\n return content;\n };\n // Render content with markdown support - all messages now rendered as markdown\n const renderContent = (content) => {\n // Handle object content (JSON)\n if (typeof content === \"object\") {\n return (_jsx(\"pre\", { className: \"text-xs font-mono whitespace-pre-wrap overflow-x-auto bg-gray-100 dark:bg-gray-800 p-2 rounded text-gray-700 \", children: JSON.stringify(content, null, 2) }));\n }\n // Handle string content with markdown - content is already processed\n return (_jsx(\"div\", { className: \"vprose prose-sm\", children: _jsx(Markdown, { remarkPlugins: [remarkGfm], components: {\n a: ({ node, ref, ...props }) => {\n const href = props.href || \"\";\n if (href.includes(\"/store/objects\")) {\n return (_jsx(NavLink, { href: href, topLevelNav: true, children: props.children }));\n }\n return (_jsx(\"a\", { ...props, target: \"_blank\", rel: \"noopener noreferrer\" }));\n },\n img: ({ node, ref, ...props }) => {\n return (_jsx(\"img\", { ...props, className: \"max-w-full h-auto rounded-lg shadow-md my-3 cursor-pointer hover:shadow-lg transition-shadow\", loading: \"lazy\", onClick: () => props.src && window.open(props.src, '_blank') }));\n },\n code: ({ node, ref, className, children, ...props }) => {\n const match = /language-(\\w+)/.exec(className || \"\");\n const isInline = !match;\n const language = match ? match[1] : \"\";\n // Keep only the language indicator logic here, styling moved to CSS\n return (_jsxs(_Fragment, { children: [!isInline && language && (_jsx(\"div\", { className: \"code-language-indicator\", children: language })), _jsx(\"code\", { ...props, children: children })] }));\n },\n // Remove 'node' and 'ref' from props\n p: ({ node, ref, ...props }) => _jsx(\"p\", { ...props }),\n strong: ({ node, ref, ...props }) => _jsx(\"strong\", { ...props }),\n em: ({ node, ref, ...props }) => _jsx(\"em\", { ...props }),\n pre: ({ node, ref, ...props }) => _jsx(\"pre\", { ...props }),\n h1: ({ node, ref, ...props }) => _jsx(\"h1\", { ...props }),\n h2: ({ node, ref, ...props }) => _jsx(\"h2\", { ...props }),\n h3: ({ node, ref, ...props }) => _jsx(\"h3\", { ...props }),\n li: ({ node, ref, ...props }) => _jsx(\"li\", { ...props }),\n ul: ({ node, ref, ...props }) => _jsx(\"ul\", { ...props }),\n ol: ({ node, ref, ...props }) => _jsx(\"ol\", { ...props }),\n blockquote: ({ node, ref, ...props }) => _jsx(\"blockquote\", { ...props }),\n hr: ({ node, ref, ...props }) => _jsx(\"hr\", { ...props }),\n table: ({ node, ref, ...props }) => _jsx(\"div\", { className: \"overflow-x-auto\", children: _jsx(\"table\", { ...props }) }),\n th: ({ node, ref, ...props }) => _jsx(\"th\", { ...props }),\n td: ({ node, ref, ...props }) => _jsx(\"td\", { ...props }),\n }, children: content }) }));\n };\n const messageContent = getMessageContent();\n // Process content with image URL resolution when component mounts or message changes\n useEffect(() => {\n const processContent = async () => {\n if (messageContent) {\n setIsProcessingImages(true);\n try {\n const processed = await convertLinks(processContentForMarkdown(messageContent));\n setProcessedContent(processed);\n }\n catch (error) {\n console.error('Error processing message content:', error);\n setProcessedContent(messageContent);\n }\n finally {\n setIsProcessingImages(false);\n }\n }\n };\n processContent();\n }, [messageContent, client]);\n const workstreamId = getWorkstreamId(message);\n // Different styling based on message type\n const getMessageTypeStyles = () => {\n switch (message.type) {\n case AgentMessageType.ANSWER:\n return \"border-l-info bg-info\";\n case AgentMessageType.COMPLETE:\n return \"border-l-success bg-success\";\n case AgentMessageType.IDLE:\n return \"border-l-muted bg-muted\";\n case AgentMessageType.REQUEST_INPUT:\n return \"border-l-attention bg-attention\";\n case AgentMessageType.QUESTION:\n return \"border-l-muted bg-muted\";\n case AgentMessageType.THOUGHT:\n return \"border-l-accent dark:border-l-purple-500 bg-purple-50/50 dark:bg-purple-900/10\";\n case AgentMessageType.ERROR:\n return \"border-l-destructive bg-destructive\";\n case AgentMessageType.UPDATE:\n return \"border-l-success bg-success\";\n case AgentMessageType.PLAN:\n return \"border-l-attention bg-attention\";\n case AgentMessageType.TERMINATED:\n return \"border-l-muted bg-muted\";\n default:\n return \"border-l-indigo-500 dark:border-l-indigo-400 bg-indigo-50/50 dark:bg-indigo-900/10\";\n }\n };\n const messageTypeStyles = getMessageTypeStyles();\n // Get the color for the icon based on message type\n const getIconColor = () => {\n switch (message.type) {\n case AgentMessageType.ANSWER:\n return \"text-info\";\n case AgentMessageType.COMPLETE:\n return \"text-success\";\n case AgentMessageType.IDLE:\n return \"text-muted\";\n case AgentMessageType.REQUEST_INPUT:\n return \"text-attention\";\n case AgentMessageType.QUESTION:\n return \"text-muted\";\n case AgentMessageType.THOUGHT:\n return \"text-purple-600 dark:text-purple-400\";\n case AgentMessageType.ERROR:\n return \"text-destructive\";\n case AgentMessageType.UPDATE:\n return \"text-success\";\n case AgentMessageType.PLAN:\n return \"text-attention\";\n default:\n return \"text-muted\";\n }\n };\n // Get an icon for the message type with enhanced animations\n const getMessageIcon = () => {\n const iconColor = getIconColor();\n // Choose an animation style for thinking messages\n const getThinkingAnimation = (color) => {\n // Generate a deterministic but varying number based on the message timestamp\n // This ensures the same message always gets the same animation style\n const timestampNum = typeof message.timestamp === 'number'\n ? message.timestamp\n : new Date(message.timestamp).getTime();\n // Use only PulsatingCircle and AnimatedThinkingDots\n return (timestampNum % 2 === 0)\n ? _jsx(PulsatingCircle, { size: \"sm\", color: color })\n : _jsx(AnimatedThinkingDots, { color: color });\n };\n switch (message.type) {\n case AgentMessageType.ANSWER:\n return showPulsatingCircle ? (getThinkingAnimation('blue')) : (_jsx(Bot, { className: `size-4 ${iconColor}` }));\n case AgentMessageType.COMPLETE:\n return _jsx(CheckCircle, { className: `size-4 ${iconColor}` });\n case AgentMessageType.TERMINATED:\n return _jsx(CheckCircle, { className: `size-4 ${iconColor}` });\n case AgentMessageType.IDLE:\n return _jsx(Clock, { className: `size-4 ${iconColor}` });\n case AgentMessageType.REQUEST_INPUT:\n return _jsx(User, { className: `size-4 ${iconColor}` });\n case AgentMessageType.QUESTION:\n return _jsx(User, { className: `size-4 ${iconColor}` });\n case AgentMessageType.THOUGHT:\n return showPulsatingCircle ? (getThinkingAnimation('purple')) : (_jsx(Bot, { className: `size-4 ${iconColor}` }));\n case AgentMessageType.ERROR:\n return _jsx(AlertCircle, { className: `size-4 ${iconColor}` });\n case AgentMessageType.UPDATE:\n return showPulsatingCircle ? (getThinkingAnimation('green')) : (_jsx(Info, { className: `size-4 ${iconColor}` }));\n case AgentMessageType.PLAN:\n return showPulsatingCircle ? (getThinkingAnimation('amber')) : (_jsx(MessageSquare, { className: `size-4 ${iconColor}` }));\n default:\n return showPulsatingCircle ? (getThinkingAnimation('blue')) : (_jsx(Bot, { className: `size-4 ${iconColor}` }));\n }\n };\n return (_jsxs(\"div\", { className: `border-l-4 shadow-md overflow-hidden bg-white dark:bg-gray-900 mb-5 ${messageTypeStyles}`, \"data-workstream-id\": workstreamId, children: [_jsxs(\"div\", { className: \"flex items-center justify-between px-4 py-2 border-b border-gray-100/80 dark:border-gray-800/80 bg-white/50 dark:bg-gray-900/50 backdrop-blur-sm\", children: [_jsxs(\"div\", { className: \"flex items-center gap-2\", children: [_jsx(\"div\", { className: showPulsatingCircle ? \"animate-fadeIn\" : \"\", children: getMessageIcon() }), _jsx(\"span\", { className: \"text-xs font-medium text-muted \", children: messageStyles.sender }), workstreamId !== \"main\" && workstreamId !== \"all\" && (_jsx(Badge, { variant: \"default\", className: \"text-xs text-muted\", children: workstreamId }))] }), _jsxs(\"div\", { className: \"flex items-center gap-2\", children: [_jsx(\"span\", { className: \"text-xs text-muted\", children: dayjs(message.timestamp).format(\"HH:mm:ss\") }), _jsx(Button, { variant: \"ghost\", size: \"xs\", onClick: copyToClipboard, className: \"text-muted\", title: \"Copy message\", children: _jsx(CopyIcon, { className: \"size-3\" }) })] })] }), _jsxs(\"div\", { className: \"px-4 py-3 bg-white dark:bg-gray-900\", children: [messageContent && (_jsx(\"div\", { className: \"message-content\", children: isProcessingImages ? (_jsxs(\"div\", { className: \"flex items-center gap-2 text-sm text-gray-500\", children: [_jsx(AnimatedThinkingDots, { color: \"blue\" }), _jsx(\"span\", { children: \"Loading images...\" })] })) : (renderContent(processedContent || messageContent)) })), message.details && (_jsxs(\"div\", { className: \"mt-2\", children: [_jsxs(\"button\", { onClick: () => setShowDetails(!showDetails), className: \"text-xs text-muted flex items-center\", children: [showDetails ? \"Hide\" : \"Show\", \" details\", _jsx(\"svg\", { xmlns: \"http://www.w3.org/2000/svg\", className: `h-3 w-3 ml-1 transition-transform ${showDetails ? \"rotate-180\" : \"\"}`, fill: \"none\", viewBox: \"0 0 24 24\", stroke: \"currentColor\", children: _jsx(\"path\", { strokeLinecap: \"round\", strokeLinejoin: \"round\", strokeWidth: 2, d: \"M19 9l-7 7-7-7\" }) })] }), showDetails && (_jsx(\"div\", { className: \"mt-2 p-2 bg-muted border border-mixer-muted/40 rounded text-sm\", children: typeof message.details === \"string\" ? (renderContent(message.details)) : (_jsx(\"pre\", { className: \"text-xs font-mono whitespace-pre-wrap overflow-x-auto bg-muted p-2 rounded text-muted \", children: JSON.stringify(message.details, null, 2) })) }))] }))] })] }));\n}\n//# sourceMappingURL=MessageItem.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { CheckCircle, Clock } from \"lucide-react\";\nimport { getWorkstreamId } from \"./utils\";\n/**\n * Component that displays tabs for different workstreams\n */\nexport default function WorkstreamTabs({ workstreams, activeWorkstream, onSelectWorkstream, count, completionStatus, }) {\n // Create a new map with just the core workstreams\n const filteredWorkstreams = new Map();\n filteredWorkstreams.set(\"all\", \"All Messages\");\n filteredWorkstreams.set(\"main\", \"Main\");\n // Only add actual workstreams from messages (not our test workstreams)\n workstreams.forEach((name, id) => {\n if (id !== \"all\" &&\n id !== \"main\" &&\n id !== \"research_france\" &&\n id !== \"statistics\") {\n filteredWorkstreams.set(id, name);\n }\n });\n // Replace workstreams with our filtered version\n workstreams = filteredWorkstreams;\n // Sort workstream entries in a predictable order:\n // 1. 'all' first\n // 2. 'main' second\n // 3. The rest alphabetically by ID\n const sortedWorkstreams = Array.from(workstreams.entries()).sort(([idA], [idB]) => {\n if (idA === \"all\")\n return -1;\n if (idB === \"all\")\n return 1;\n if (idA === \"main\")\n return -1;\n if (idB === \"main\")\n return 1;\n return idA.localeCompare(idB);\n });\n // Only show tabs if there are multiple workstreams (more than just 'all' and 'main')\n const hasMultipleWorkstreams = sortedWorkstreams.length > 2;\n // If there are no multiple workstreams, return an empty div to maintain layout\n if (!hasMultipleWorkstreams) {\n return _jsx(\"div\", { className: \"py-1\" });\n }\n return (_jsx(\"div\", { className: \"flex overflow-x-auto space-x-1 mb-2 bg-muted border-b-2 border-muted/20 sticky top-0 z-10\", children: sortedWorkstreams.map(([id, name]) => (_jsxs(\"button\", { className: `px-2 py-1 text-xs font-medium whitespace-nowrap transition-colors flex items-center gap-1.5\n ${activeWorkstream === id\n ? \"bg-info text-info border-b-2 border-info\"\n : \"text-muted hover:bg-muted border-b-2 border-transparent\"}`, onClick: () => onSelectWorkstream(id), title: name.length > 20 ? name : undefined, children: [name.length > 20 ? name.substring(0, 18) + \"...\" : name, count && count.has(id) && count.get(id) > 0 && (_jsxs(\"div\", { className: \"flex items-center space-x-1\", children: [_jsx(\"span\", { className: `inline-flex items-center justify-center p-1 text-xs rounded-full\n ${activeWorkstream === id\n ? \"bg-info text-info\"\n : \"bg-muted text-muted\"}`, children: count.get(id) }), completionStatus &&\n id !== \"all\" &&\n (completionStatus.get(id) ? (_jsx(CheckCircle, { className: \"size-3 text-success\" })) : (_jsx(Clock, { className: \"size-3 text-attention\" })))] }))] }, id))) }));\n}\n/**\n * Helper function to extract workstream information from messages\n */\nexport function extractWorkstreams(messages) {\n const workstreams = new Map();\n // Always include \"all\" and \"main\" workstreams\n workstreams.set(\"all\", \"All Messages\");\n workstreams.set(\"main\", \"Main\");\n // Extract workstream IDs directly from message.workstream_id only\n messages.forEach((message) => {\n if (message.workstream_id &&\n message.workstream_id !== \"main\" &&\n message.workstream_id !== \"all\" &&\n !workstreams.has(message.workstream_id)) {\n // Use the workstream_id as both the ID and the display name\n workstreams.set(message.workstream_id, message.workstream_id);\n console.log(`Found workstream: ${message.workstream_id}`);\n }\n });\n // Special case: if there's only the 'main' workstream, we want to explicitly make sure it exists\n // This ensures that both 'all' and 'main' are added if no additional workstreams are found\n if (workstreams.size <= 2 && !workstreams.has(\"main\")) {\n workstreams.set(\"main\", \"Main\");\n }\n console.log(\"Final workstreams map:\", workstreams);\n return workstreams;\n}\n/**\n * Filter messages by workstream\n */\nexport function filterMessagesByWorkstream(messages, workstreamId) {\n if (workstreamId === \"all\") {\n // Show all messages, no filtering needed\n return [...messages];\n }\n else if (workstreamId === \"main\") {\n // For the main workstream, show only messages that belong to the main workstream\n // This excludes messages that belong to specific tasks/workstreams\n return messages.filter((message) => {\n const msgWorkstreamId = getWorkstreamId(message);\n return msgWorkstreamId === \"main\";\n });\n }\n else {\n // For specific workstreams, show only messages that match the workstream_id\n return messages.filter((message) => {\n const msgWorkstreamId = getWorkstreamId(message);\n return msgWorkstreamId === workstreamId;\n });\n }\n}\n//# sourceMappingURL=WorkstreamTabs.js.map","import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { AgentMessageType } from \"@vertesia/common\";\nimport React, { useEffect, useMemo, useState } from \"react\";\nimport MessageItem from \"./MessageItem\";\nimport WorkstreamTabs, { extractWorkstreams, filterMessagesByWorkstream } from \"./WorkstreamTabs\";\nimport { DONE_STATES, getWorkstreamId } from \"./utils\";\nexport default function AllMessagesMixed({ messages, bottomRef, viewMode = 'stacked', isCompleted = false, }) {\n const containerRef = React.useRef(null);\n const [activeWorkstream, setActiveWorkstream] = useState(\"all\");\n // Auto-scroll to bottom when messages change\n useEffect(() => {\n if (bottomRef.current) {\n bottomRef.current.scrollIntoView({ behavior: \"smooth\" });\n }\n }, [messages, bottomRef]);\n // Sort all messages chronologically\n const sortedMessages = React.useMemo(() => [...messages].sort((a, b) => {\n const timeA = typeof a.timestamp === \"number\" ? a.timestamp : new Date(a.timestamp).getTime();\n const timeB = typeof b.timestamp === \"number\" ? b.timestamp : new Date(b.timestamp).getTime();\n return timeA - timeB;\n }), [messages]);\n // Get workstreams from messages - only from message.workstream_id\n const workstreams = React.useMemo(() => {\n // Just get the basic workstreams from the messages\n const extractedWorkstreams = extractWorkstreams(sortedMessages);\n // We'll keep taskLabels - they might be used for display purposes elsewhere\n // but we won't use them to create new workstream tabs\n return extractedWorkstreams;\n }, [sortedMessages]);\n // Count messages per workstream\n const workstreamCounts = React.useMemo(() => {\n const counts = new Map();\n counts.set(\"all\", sortedMessages.length);\n // Count main messages\n const mainMessages = filterMessagesByWorkstream(sortedMessages, \"main\");\n counts.set(\"main\", mainMessages.length);\n // Count other workstreams\n sortedMessages.forEach((msg) => {\n const workstreamId = getWorkstreamId(msg);\n if (workstreamId !== \"main\") {\n counts.set(workstreamId, (counts.get(workstreamId) || 0) + 1);\n }\n });\n return counts;\n }, [sortedMessages]);\n // Filter messages based on active workstream\n const displayMessages = React.useMemo(() => {\n if (activeWorkstream === \"all\") {\n return sortedMessages;\n }\n return filterMessagesByWorkstream(sortedMessages, activeWorkstream);\n }, [sortedMessages, activeWorkstream]);\n // Determine completion status for each workstream\n const workstreamCompletionStatus = useMemo(() => {\n const statusMap = new Map();\n // Group messages by workstream\n const workstreamMessages = new Map();\n sortedMessages.forEach(message => {\n const workstreamId = getWorkstreamId(message);\n if (!workstreamMessages.has(workstreamId)) {\n workstreamMessages.set(workstreamId, []);\n }\n workstreamMessages.get(workstreamId).push(message);\n });\n // Check if each workstream is completed\n for (const [workstreamId, msgs] of workstreamMessages.entries()) {\n if (msgs.length > 0) {\n const lastMessage = msgs[msgs.length - 1];\n statusMap.set(workstreamId, [\n AgentMessageType.COMPLETE,\n AgentMessageType.IDLE,\n AgentMessageType.REQUEST_INPUT,\n AgentMessageType.TERMINATED\n ].includes(lastMessage.type));\n }\n }\n return statusMap;\n }, [sortedMessages]);\n return (_jsxs(\"div\", { ref: containerRef, className: \"flex-1 min-h-0 h-full overflow-y-auto px-4 sm:px-2 lg:px-4 flex flex-col relative\", \"data-testid\": \"all-messages-mixed\", children: [_jsx(\"div\", { className: \"sticky top-0 z-10\", children: _jsx(WorkstreamTabs, { workstreams: workstreams, activeWorkstream: activeWorkstream, onSelectWorkstream: setActiveWorkstream, count: workstreamCounts, completionStatus: workstreamCompletionStatus }) }), displayMessages.length === 0 ? (_jsx(\"div\", { className: \"flex items-center justify-center h-full text-center py-8\", children: _jsx(\"div\", { className: \"flex items-center px-4 py-3 text-muted\", children: activeWorkstream === \"all\"\n ? \"Waiting for agent response...\"\n : \"No messages in this workstream yet...\" }) })) : (_jsxs(\"div\", { className: \"flex-1 flex flex-col justify-start pb-4 space-y-2\", children: [viewMode === 'stacked' ? (\n // Stacked view - show all messages in the current workstream\n // Add pulsating circle to the latest message if not completed\n displayMessages.map((message, index) => {\n // Find if this is the latest non-completion message\n const isLatestNonCompletionMessage = !isCompleted &&\n index === displayMessages.length - 1 &&\n !DONE_STATES.includes(message.type);\n return (_jsx(MessageItem, { message: message, showPulsatingCircle: isLatestNonCompletionMessage }, `${message.timestamp}-${index}`));\n })) : (\n // Sliding view - only permanent messages and latest thinking from the current workstream\n _jsx(_Fragment, { children: (() => {\n // First get all permanent messages (ANSWER, QUESTION, COMPLETE, REQUEST_INPUT, TERMINATED)\n const permanentMessages = displayMessages.filter(msg => msg.type === AgentMessageType.ANSWER ||\n msg.type === AgentMessageType.QUESTION ||\n msg.type === AgentMessageType.COMPLETE ||\n msg.type === AgentMessageType.TERMINATED);\n // Then get the latest thinking message if not completed\n const latestThinkingMessage = !isCompleted ?\n displayMessages\n .filter(msg => msg.type === AgentMessageType.THOUGHT ||\n msg.type === AgentMessageType.UPDATE ||\n msg.type === AgentMessageType.PLAN)\n .sort((a, b) => {\n const timeA = typeof a.timestamp === 'number' ? a.timestamp : new Date(a.timestamp).getTime();\n const timeB = typeof b.timestamp === 'number' ? b.timestamp : new Date(b.timestamp).getTime();\n return timeB - timeA; // Sort descending - newest first\n })[0]\n : null;\n // Sort all messages by timestamp\n const allMessages = [...permanentMessages];\n if (latestThinkingMessage) {\n allMessages.push(latestThinkingMessage);\n }\n allMessages.sort((a, b) => {\n const timeA = typeof a.timestamp === 'number' ? a.timestamp : new Date(a.timestamp).getTime();\n const timeB = typeof b.timestamp === 'number' ? b.timestamp : new Date(b.timestamp).getTime();\n return timeA - timeB; // Sort ascending - oldest first\n });\n // Show pulsating circle only on the latest message if not completed\n return allMessages.map((message, index) => {\n const isLatestMessage = !isCompleted &&\n index === allMessages.length - 1 &&\n !DONE_STATES.includes(message.type);\n return (_jsx(MessageItem, { message: message, showPulsatingCircle: isLatestMessage }, `${message.timestamp}-${index}`));\n });\n })() })), _jsx(\"div\", { ref: bottomRef, className: \"h-4\" })] }))] }));\n}\n//# sourceMappingURL=AllMessagesMixed.js.map","import { jsx as _jsx } from \"react/jsx-runtime\";\nimport { AgentSearchScope, mergeInCodePromptSchemas, supportsToolUse } from \"@vertesia/common\";\nimport { useUserSession } from \"@vertesia/ui/session\";\nimport Ajv from \"ajv\";\nimport { createContext, useContext, useEffect, useState } from \"react\";\n// export interface ConversationWorkflowPayload {\n// config: {\n// environment?: ExecutionEnvironmentRef | undefined;\n// model?: string;\n// }\n// data?: JSONObject | undefined,\n// tool_names: string[],\n// }\nexport class PayloadBuilder {\n vertesia;\n updateState;\n _interactive = true;\n _debug_mode = false;\n _collection;\n _start = false;\n _preserveRunValues = false;\n _interaction;\n _environment;\n _model = '';\n _tool_names = [];\n _data;\n _interactionParamsSchema;\n _inputValidator;\n constructor(vertesia, updateState) {\n this.vertesia = vertesia;\n this.updateState = updateState;\n }\n onStateChanged() {\n const newInstance = this.clone();\n this.updateState(newInstance);\n }\n clone() {\n const builder = new PayloadBuilder(this.vertesia, this.updateState);\n builder._interactionParamsSchema = this._interactionParamsSchema;\n builder._interaction = this._interaction;\n builder._data = this._data;\n builder._environment = this._environment;\n builder._model = this._model;\n builder._tool_names = [...this._tool_names];\n builder._interactive = this._interactive;\n builder._debug_mode = this._debug_mode;\n builder._inputValidator = this._inputValidator;\n builder._start = this._start;\n builder._collection = this._collection;\n builder._preserveRunValues = this._preserveRunValues;\n return builder;\n }\n get interactive() {\n return this._interactive;\n }\n set interactive(interactive) {\n if (interactive !== this._interactive) {\n this._interactive = interactive;\n this.onStateChanged();\n }\n }\n get debug_mode() {\n return this._debug_mode;\n }\n set debug_mode(debug_mode) {\n if (debug_mode !== this._debug_mode) {\n this._debug_mode = debug_mode;\n this.onStateChanged();\n }\n }\n get collection() {\n return this._collection;\n }\n set collection(collection) {\n if (collection !== this._collection) {\n this._collection = collection;\n this.onStateChanged();\n }\n }\n get search_scope() {\n return this._collection ? AgentSearchScope.Collection : undefined;\n }\n async restoreConversation(context) {\n // Handle version-specific interaction resolution\n let interactionRef = context.interaction;\n if (context.version) {\n const objectIdRegex = /^[a-fA-F0-9]{24}$/;\n if (!objectIdRegex.test(interactionRef)) {\n // regex to check if interactionRef is an object id (24 hex characters), only append version if not an object id\n interactionRef = `${interactionRef}@${context.version}`;\n }\n }\n const inter = await this.vertesia.interactions.catalog.resolve(interactionRef);\n const envId = inter.runtime?.environment || context.config?.environment;\n const model = context.config?.model;\n const env = await (envId ?\n this.vertesia.environments.retrieve(context.config?.environment)\n :\n Promise.resolve(undefined));\n this.interactionParamsSchema = context.interactionParamsSchema ?? null;\n // trigger the setter to update the corresponding interactionParamsSchema\n this.interaction = inter;\n this._tool_names = context.tool_names || [];\n this._data = context.data;\n this._interactive = context.interactive;\n this._debug_mode = context.debug_mode ?? false;\n this.collection = context.collection_id ?? undefined;\n // we need to trigger the setter to deal with default models\n this.environment = env;\n if (model) {\n this._model = model;\n }\n this.onStateChanged();\n }\n get interaction() {\n return this._interaction;\n }\n set interaction(interaction) {\n if (interaction?.id !== this._interaction?.id) {\n this._interaction = interaction;\n // trigger the setter to update the onChange state\n this.interactionParamsSchema = interaction ? mergeInCodePromptSchemas(interaction.prompts) : undefined;\n // Reset the validator when schema changes\n this._inputValidator = undefined;\n if (interaction && !this._preserveRunValues) {\n if (interaction.runtime?.environment) {\n const envId = interaction.runtime.environment;\n this.vertesia.environments.retrieve(envId).then((environment) => this.environment = environment);\n }\n }\n this.onStateChanged();\n }\n }\n get environment() {\n return this._environment;\n }\n set environment(environment) {\n if (environment?.id !== this._environment?.id) {\n this._environment = environment;\n if (!this._preserveRunValues) {\n // First try to use the interaction model, then the environment default model\n const interactionModel = this.interaction?.runtime?.model;\n if (interactionModel && environment && supportsToolUse(interactionModel, environment.provider)) {\n this._model = interactionModel;\n }\n else {\n this._model = environment?.default_model && supportsToolUse(environment.default_model, environment.provider)\n ? environment.default_model : '';\n }\n }\n this.onStateChanged();\n }\n }\n get model() {\n return this._model;\n }\n set model(model) {\n if (model !== this._model) {\n this._model = model || '';\n this.onStateChanged();\n }\n }\n get tool_names() {\n return this._tool_names;\n }\n set tool_names(tools) {\n this._tool_names = tools;\n this.onStateChanged();\n }\n get data() {\n return this._data;\n }\n set data(prompt_data) {\n this._data = prompt_data;\n this.onStateChanged();\n }\n set run(run) {\n console.log(\"run\", run);\n this.onStateChanged();\n }\n set start(value) {\n if (this._start !== value) {\n this._start = value;\n this.onStateChanged();\n }\n }\n get start() {\n return this._start;\n }\n get preserveRunValues() {\n return this._preserveRunValues;\n }\n set preserveRunValues(value) {\n this._preserveRunValues = value;\n }\n get interactionParamsSchema() {\n return this._interactionParamsSchema;\n }\n set interactionParamsSchema(schema) {\n if (this._interactionParamsSchema !== schema) {\n this._interactionParamsSchema = schema;\n this.onStateChanged();\n }\n }\n reset() {\n this._start = false;\n this._interactive = true;\n this._debug_mode = false;\n this._collection = undefined;\n this._preserveRunValues = false;\n this._model = '';\n this._environment = undefined;\n this._tool_names = [];\n this._interaction = undefined;\n this._data = undefined;\n this._interactionParamsSchema = null;\n this._inputValidator = undefined;\n this.model = undefined;\n this.environment = undefined;\n this.onStateChanged();\n if (location.hash) {\n const urlWithoutHash = window.location.origin + window.location.pathname + window.location.search;\n history.replaceState(null, '', urlWithoutHash);\n location.hash = '';\n }\n }\n validateInput() {\n if (!this._interactionParamsSchema) {\n return { isValid: true };\n }\n // If schema has changed or validator not initialized, recompile\n if (!this._inputValidator || this._inputValidator.schema !== this._interactionParamsSchema) {\n const ajv = new Ajv({ strict: false });\n this._inputValidator = {\n validate: ajv.compile(this._interactionParamsSchema),\n schema: this._interactionParamsSchema\n };\n }\n const prompt_data = this._data || {};\n const isValid = this._inputValidator.validate(prompt_data);\n if (!isValid) {\n const errorMessage = this._inputValidator.validate.errors\n ? this._inputValidator.validate.errors.map((err) => `${err.instancePath}: ${err.message}`).join(', ')\n : 'Invalid payload data';\n return { isValid: false, errorMessage };\n }\n return { isValid: true };\n }\n}\nexport const PayloadContext = createContext(undefined);\nexport function PayloadBuilderProvider({ children }) {\n const { client } = useUserSession();\n const [builder, setBuilder] = useState();\n useEffect(() => {\n setBuilder(new PayloadBuilder(client, setBuilder));\n }, []);\n return builder && (_jsx(PayloadContext.Provider, { value: builder, children: children }));\n}\nexport function usePayloadBuilder() {\n const ctx = useContext(PayloadContext);\n if (!ctx) {\n throw new Error('usePayloadBuilder must be used within a PayloadProvider');\n }\n return ctx;\n}\n//# sourceMappingURL=PayloadBuilder.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { Button, Command, CommandGroup, CommandItem, CommandList, Popover, PopoverContent, PopoverTrigger, useToast } from \"@vertesia/ui/core\";\nimport { useUserSession } from \"@vertesia/ui/session\";\nimport { Bot, ClipboardList, CopyIcon, DownloadCloudIcon, ExternalLink, MoreVertical, XIcon } from \"lucide-react\";\nimport { PayloadBuilderProvider, usePayloadBuilder } from \"../../PayloadBuilder\";\nimport { getConversationUrl } from \"./utils\";\nexport default function Header({ title, onClose, isModal, run, viewMode, onViewModeChange, showPlanPanel, hasPlan = false, onTogglePlanPanel, onDownload, onCopyRunId, resetWorkflow }) {\n return (_jsx(PayloadBuilderProvider, { children: _jsxs(\"div\", { className: \"flex flex-wrap items-end justify-between py-1.5 px-2 border-b shadow-sm flex-shrink-0\", children: [_jsxs(\"div\", { className: \"flex flex-wrap items-center space-x-2\", children: [_jsxs(\"div\", { className: \"flex items-center space-x-1\", children: [_jsx(Bot, { className: \"size-5 text-muted\" }), _jsx(\"span\", { className: \"font-medium\", children: title })] }), _jsxs(\"span\", { className: \"text-xs text-muted ml-1\", children: [\"(Run ID: \", run.runId.substring(0, 8), \"...)\"] })] }), _jsxs(\"div\", { className: \"flex justify-end items-center space-x-2 ml-auto\", children: [_jsxs(\"div\", { className: \"flex items-center space-x-1 bg-muted rounded p-0.5\", children: [_jsx(Button, { variant: viewMode === \"stacked\" ? \"outline\" : \"ghost\", size: \"xs\", className: \"rounded-l-md\", onClick: () => onViewModeChange(\"stacked\"), children: \"Details\" }), _jsx(Button, { variant: viewMode === \"sliding\" ? \"outline\" : \"ghost\", size: \"xs\", className: \"rounded-l-md\", onClick: () => onViewModeChange(\"sliding\"), children: \"Most Important\" })] }), _jsxs(\"div\", { className: \"relative\", children: [hasPlan && !showPlanPanel && (_jsx(\"span\", { className: \"absolute -top-1 -right-1 w-2.5 h-2.5 bg-primary rounded-full border border-border z-10\" })), _jsxs(Button, { size: \"sm\", variant: showPlanPanel ? \"primary\" : \"secondary\", onClick: onTogglePlanPanel, className: `transition-all duration-200 rounded-md`, title: \"Toggle plan panel\", children: [_jsx(ClipboardList, { className: \"size-4 mr-1.5\" }), _jsx(\"span\", { className: \"font-medium text-xs\", children: showPlanPanel ? \"Hide Plan\" : \"Show Plan\" })] })] }), _jsx(MoreDropdown, { run: run, isModal: isModal, onClose: onClose, onDownload: onDownload, onCopyRunId: onCopyRunId, resetWorkflow: resetWorkflow }), onClose && !isModal && (_jsx(Button, { size: \"xs\", variant: \"ghost\", onClick: onClose, children: _jsx(XIcon, { className: \"size-4\" }) }))] })] }) }));\n}\nfunction MoreDropdown({ run, isModal, onClose, onDownload, onCopyRunId, resetWorkflow }) {\n const toast = useToast();\n const { client } = useUserSession();\n const builder = usePayloadBuilder();\n const cancelWorkflow = async (run) => {\n try {\n await client.store.workflows.terminate(run.workflowId, run.runId, \"cancel\");\n toast({\n status: \"success\",\n title: \"Workflow cancelled\",\n duration: 2000,\n });\n builder.reset();\n resetWorkflow?.();\n return true;\n }\n catch (error) {\n toast({\n status: \"error\",\n title: \"Failed to cancel workflow\",\n duration: 2000,\n });\n return false;\n }\n };\n const openUrl = (url) => {\n window.open(url, \"_blank\");\n return url;\n };\n return (_jsxs(Popover, { hover: true, children: [_jsx(PopoverTrigger, { children: _jsx(Button, { size: \"xs\", variant: \"ghost\", title: \"More actions\", children: _jsx(MoreVertical, { className: \"size-4\" }) }) }), _jsx(PopoverContent, { className: \"w-48\", align: \"end\", children: _jsx(\"div\", { className: \"rounded-md shadow-lg z-50\", children: _jsx(\"div\", { className: \"py-1 min-w-36\", children: _jsx(Command, { children: _jsx(CommandList, { children: _jsxs(CommandGroup, { children: [_jsx(\"div\", { className: \"flex items-center px-3 py-1.5 text-xs text-gray-700 dark:text-gray-300\", children: _jsx(\"span\", { className: \"text-muted\", children: \"Actions\" }) }), isModal && (_jsxs(CommandItem, { className: \"text-xs\", onSelect: () => openUrl(`/store/agent-runner?agentId=${run.runId}__${run.workflowId}`), children: [_jsx(ExternalLink, { className: \"size-3.5 mr-2 text-muted\" }), \" Open in new tab\"] })), _jsxs(CommandItem, { className: \"text-xs\", onSelect: () => {\n if (onCopyRunId) {\n onCopyRunId();\n }\n else {\n navigator.clipboard.writeText(run.runId);\n toast({\n status: \"success\",\n title: \"Run ID copied\",\n duration: 2000,\n });\n }\n }, children: [_jsx(CopyIcon, { className: \"size-3.5 mr-2 text-muted\" }), \" Copy Run ID\"] }), _jsxs(CommandItem, { className: \"text-xs\", onSelect: () => {\n if (onDownload) {\n onDownload();\n }\n else {\n getConversationUrl(client, run.runId).then((r) => window.open(r, \"_blank\"));\n }\n }, children: [_jsx(DownloadCloudIcon, { className: \"size-3.5 mr-2 text-muted\" }), \" Download Conversation\"] }), onClose && isModal && (_jsxs(CommandItem, { className: \"text-xs\", onSelect: onClose, children: [_jsx(XIcon, { className: \"size-3.5 mr-2 text-muted\" }), \" Close\"] })), _jsxs(CommandItem, { className: \"text-xs text-destructive\", onSelect: () => {\n cancelWorkflow(run);\n }, children: [_jsx(XIcon, { className: \"size-3.5 mr-2 text-destructive\" }), \" Cancel Workflow\"] })] }) }) }) }) }) })] }));\n}\n//# sourceMappingURL=Header.js.map","import { jsx as _jsx } from \"react/jsx-runtime\";\nimport { LayoutGrid, TableProperties } from 'lucide-react';\nimport { useState } from 'react';\nimport { Button } from '@vertesia/ui/core';\nconst LAST_DISPLAYED_VIEW = 'vertesia.content_store.lastDisplayedView';\nexport function ContentDispositionButton({ onUpdate }) {\n const [isGridView, setIsGridView] = useState(localStorage.getItem(LAST_DISPLAYED_VIEW) === \"grid\");\n const updateView = () => {\n if (isGridView) {\n toggleTableView();\n }\n else {\n toggleGridView();\n }\n };\n const toggleGridView = () => {\n localStorage.setItem(LAST_DISPLAYED_VIEW, \"grid\");\n setIsGridView(true);\n onUpdate(true);\n };\n const toggleTableView = () => {\n localStorage.setItem(LAST_DISPLAYED_VIEW, \"table\");\n setIsGridView(false);\n onUpdate(false);\n };\n return (_jsx(Button, { variant: \"outline\", onClick: updateView, alt: isGridView ? \"Table View\" : \"Thumbnail View\", children: isGridView\n ? _jsx(TableProperties, {})\n : _jsx(LayoutGrid, {}) }));\n}\nContentDispositionButton.LAST_DISPLAYED_VIEW = LAST_DISPLAYED_VIEW;\n//# sourceMappingURL=ContentDispositionButton.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { useState, useEffect } from 'react';\nimport { Button, Modal, ModalBody, ModalFooter, ModalTitle, Input, RadioGroup, RadioOptionAdapter, FormItem } from '@vertesia/ui/core';\nclass SaveOptionAdapter extends RadioOptionAdapter {\n labelOf(item) {\n return item.label;\n }\n idOf(item) {\n return item.id;\n }\n renderOption(item) {\n return (_jsxs(\"div\", { children: [_jsx(\"div\", { className: \"font-medium\", children: item.label }), _jsx(\"p\", { className: \"text-sm text-gray-500 dark:text-gray-400 mt-1\", children: item.description })] }));\n }\n}\nexport function SaveVersionConfirmModal({ isOpen, onClose, onConfirm, isLoading, uploadedFileName }) {\n const saveOptions = [\n {\n id: \"update\",\n label: \"Update current version\",\n description: uploadedFileName\n ? \"Replace the content file and modify properties directly in the current revision.\"\n : \"Modify the properties directly in the current revision.\"\n },\n {\n id: \"new-version\",\n label: \"Create new version\",\n description: uploadedFileName\n ? \"Create a new revision with the replacement file while preserving the original.\"\n : \"Create a new revision with these property changes while preserving the original.\"\n }\n ];\n // Default to \"create new version\" when replacing a file, \"update current version\" when editing properties\n const defaultOption = uploadedFileName ? saveOptions[1] : saveOptions[0];\n const [selectedOption, setSelectedOption] = useState(defaultOption);\n const [versionLabel, setVersionLabel] = useState('');\n const optionAdapter = new SaveOptionAdapter();\n // Reset to default when modal opens or uploadedFileName changes\n useEffect(() => {\n if (isOpen) {\n setSelectedOption(defaultOption);\n setVersionLabel('');\n }\n }, [isOpen, uploadedFileName]);\n const createVersion = selectedOption?.id === \"new-version\";\n const handleOptionChange = (option) => {\n setSelectedOption(option);\n };\n const handleConfirm = async () => {\n await onConfirm(createVersion, createVersion ? versionLabel : undefined);\n };\n return (_jsxs(Modal, { isOpen: isOpen, onClose: onClose, className: \"sm:max-w-md\", children: [_jsx(ModalTitle, { children: \"Save Changes\" }), _jsx(ModalBody, { children: _jsxs(\"div\", { className: \"space-y-4\", children: [uploadedFileName && (_jsx(\"div\", { className: \"mb-4 p-3 bg-blue-50 dark:bg-blue-900/20 rounded-md\", children: _jsxs(\"p\", { className: \"text-sm text-blue-700 dark:text-blue-300 font-medium\", children: [\"You're about to replace the content file with: \", _jsx(\"span\", { className: \"font-bold\", children: uploadedFileName })] }) })), _jsx(\"p\", { className: \"text-sm text-mixer-muted/5\", children: \"How would you like to save these changes?\" }), _jsx(RadioGroup, { adapter: optionAdapter, options: saveOptions, value: selectedOption, onChange: handleOptionChange, gap: \"gap-4\" }), createVersion && (_jsx(FormItem, { label: \"Version Label (Optional)\", description: \"Optional label for the new version.\", className: \"mt-3 pl-8\", children: _jsx(Input, { value: versionLabel, onChange: setVersionLabel, placeholder: \"e.g., v1.2, approved, post-review\", className: \"w-full\" }) }))] }) }), _jsxs(ModalFooter, { children: [_jsx(Button, { variant: \"secondary\", onClick: onClose, disabled: isLoading, children: \"Cancel\" }), _jsx(Button, { variant: \"primary\", onClick: handleConfirm, isLoading: isLoading, children: \"Save\" })] })] }));\n}\n//# sourceMappingURL=SaveVersionConfirmModal.js.map","import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from \"react/jsx-runtime\";\nimport { useUserSession } from '@vertesia/ui/session';\nimport { useState, useRef, useEffect } from 'react';\nimport { Button, Modal, ModalBody, ModalFooter, ModalTitle, useToast } from '@vertesia/ui/core';\nimport { useNavigate } from \"@vertesia/ui/router\";\n// Import Monaco Editor\nimport Editor from '@monaco-editor/react';\n// Import SaveVersionConfirmModal\nimport { SaveVersionConfirmModal } from './SaveVersionConfirmModal';\nexport function PropertiesEditorModal({ isOpen, onClose, object, refetch }) {\n const { client, store } = useUserSession();\n const toast = useToast();\n const navigate = useNavigate();\n const [isLoading, setIsLoading] = useState(false);\n const [propertiesJson, setPropertiesJson] = useState('');\n const [showConfirmation, setShowConfirmation] = useState(false);\n const [parsedProperties, setParsedProperties] = useState(null);\n const editorRef = useRef(null);\n const monacoRef = useRef(null);\n const [jsonSchema, setJsonSchema] = useState(null);\n //TODO state not used\n const [_newVersionId, setNewVersionId] = useState(null);\n // Initialize editor content when modal opens\n useEffect(() => {\n if (isOpen) {\n setPropertiesJson(JSON.stringify(object.properties || {}, null, 2));\n // Try to fetch JSON schema if object has a type\n if (object.type?.id) {\n fetchJsonSchema(object.type.id);\n }\n }\n }, [isOpen, object]);\n // Handle editor mounting\n function handleEditorDidMount(editor, monaco) {\n editorRef.current = editor;\n monacoRef.current = monaco;\n // Apply JSON schema validation if available\n if (jsonSchema) {\n setMonacoJsonSchema(monaco, jsonSchema);\n }\n }\n // Fetch JSON schema for the object type\n async function fetchJsonSchema(typeId) {\n try {\n const typeDetails = await store.types.retrieve(typeId);\n if (typeDetails.object_schema) {\n setJsonSchema(typeDetails.object_schema);\n // Apply schema if Monaco is already mounted\n if (monacoRef.current) {\n setMonacoJsonSchema(monacoRef.current, typeDetails.object_schema);\n }\n }\n }\n catch (error) {\n console.error('Failed to fetch JSON schema:', error);\n }\n }\n // Configure Monaco editor with JSON schema\n function setMonacoJsonSchema(monaco, schema) {\n monaco.languages.json.jsonDefaults.setDiagnosticsOptions({\n validate: true,\n schemas: [\n {\n uri: 'http://myserver/object-schema.json',\n fileMatch: ['*'],\n schema\n }\n ]\n });\n }\n // Validate JSON and open confirmation modal\n function handleSave() {\n if (!editorRef.current)\n return;\n const editorValue = editorRef.current.getValue();\n try {\n const properties = JSON.parse(editorValue);\n setParsedProperties(properties);\n setShowConfirmation(true);\n }\n catch (err) {\n toast({\n status: 'error',\n title: 'Invalid JSON',\n description: 'Please fix the JSON syntax errors before saving.',\n duration: 5000\n });\n }\n }\n // Save properties\n async function saveProperties(createVersion, versionLabel) {\n try {\n setIsLoading(true);\n const properties = parsedProperties || JSON.parse(propertiesJson);\n if (createVersion) {\n // Create a new version with the updated properties\n const response = await client.objects.update(object.id, {\n properties: properties\n }, {\n createRevision: true,\n revisionLabel: versionLabel\n });\n // Store the new version ID for navigation\n if (response.id !== object.id) {\n setNewVersionId(response.id);\n }\n toast({\n status: 'success',\n title: 'New version created',\n description: 'A new version with updated properties has been created.',\n duration: 2000\n });\n // Close modals\n setShowConfirmation(false);\n onClose();\n // Navigate to the new version\n if (response.id !== object.id) {\n // Delay slightly to allow modal closing to complete\n setTimeout(() => {\n navigate(`/objects/${response.id}`);\n toast({\n status: 'info',\n title: 'Viewing New Version',\n description: versionLabel ? `Now viewing version '${versionLabel}'` : 'Now viewing the new version',\n duration: 3000\n });\n }, 100);\n }\n }\n else {\n // Update the object properties in place\n await store.objects.update(object.id, {\n properties: properties\n });\n toast({\n status: 'success',\n title: 'Properties updated',\n description: 'The object properties have been updated successfully.',\n duration: 2000\n });\n if (refetch) {\n await refetch();\n }\n setShowConfirmation(false);\n onClose();\n }\n }\n catch (error) {\n toast({\n status: 'error',\n title: 'Error updating properties',\n description: error.message || 'An error occurred while updating the properties.',\n duration: 5000\n });\n setIsLoading(false);\n }\n }\n // Handle closing the confirmation modal without saving\n function handleCancelConfirmation() {\n setShowConfirmation(false);\n }\n return (_jsxs(_Fragment, { children: [_jsxs(Modal, { isOpen: isOpen, onClose: onClose, className: \"sm:max-w-[90%] md:max-w-[80%] lg:max-w-[75%] xl:max-w-[70%]\", children: [_jsx(ModalTitle, { children: \"Edit Properties\" }), _jsxs(ModalBody, { children: [_jsxs(\"div\", { className: \"mb-2 text-sm text-gray-500\", children: [object.type?.name ? (_jsxs(\"span\", { children: [\"Editing properties for object type: \", _jsx(\"strong\", { children: object.type.name })] })) : (_jsx(\"span\", { children: \"Editing properties for generic document\" })), jsonSchema && (_jsx(\"span\", { className: \"ml-2 text-green-600\", children: \"(JSON schema validation enabled)\" }))] }), _jsx(\"div\", { className: \"h-[75vh] border border-gray-300 dark:border-gray-700 rounded-md\", children: _jsx(Editor, { height: \"100%\", language: \"json\", value: propertiesJson, onChange: (value) => setPropertiesJson(value || ''), onMount: handleEditorDidMount, options: {\n minimap: { enabled: false },\n scrollBeyondLastLine: false,\n formatOnPaste: true,\n formatOnType: true,\n automaticLayout: true,\n wordWrap: 'on'\n } }) })] }), _jsxs(ModalFooter, { children: [_jsx(Button, { variant: \"secondary\", onClick: onClose, children: \"Cancel\" }), _jsx(Button, { variant: \"primary\", onClick: handleSave, children: \"Save Changes\" })] })] }), _jsx(SaveVersionConfirmModal, { isOpen: showConfirmation, onClose: handleCancelConfirmation, onConfirm: saveProperties, isLoading: isLoading })] }));\n}\n//# sourceMappingURL=PropertiesEditorModal.js.map","import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from \"react/jsx-runtime\";\nimport { useEffect, useState, memo } from \"react\";\nimport { useUserSession } from \"@vertesia/ui/session\";\nimport { Button, ResizableHandle, ResizablePanel, ResizablePanelGroup, Spinner, useToast } from \"@vertesia/ui/core\";\nimport { JSONDisplay, MarkdownRenderer } from \"@vertesia/ui/widgets\";\nimport { ContentNature, ImageRenditionFormat, POSTER_RENDITION_NAME } from \"@vertesia/common\";\nimport { Copy, Download, SquarePen, AlertTriangle } from \"lucide-react\";\nimport { PropertiesEditorModal } from \"./PropertiesEditorModal\";\nimport { NavLink } from \"@vertesia/ui/router\";\n// Maximum text size before cropping (128K characters)\nconst MAX_TEXT_DISPLAY_SIZE = 128 * 1024;\nvar PanelView;\n(function (PanelView) {\n PanelView[\"Text\"] = \"text\";\n PanelView[\"Image\"] = \"image\";\n PanelView[\"Video\"] = \"video\";\n})(PanelView || (PanelView = {}));\nexport function ContentOverview({ object, loadText, refetch, }) {\n const toast = useToast();\n const handleCopyContent = async (content, type) => {\n try {\n await navigator.clipboard.writeText(content);\n toast({\n status: \"success\",\n title: `${type === \"text\" ? \"Content\" : \"Properties\"} copied`,\n description: `Successfully copied ${type} to clipboard`,\n duration: 2000,\n });\n }\n catch (err) {\n console.error(`Failed to copy ${type}:`, err);\n toast({\n status: \"error\",\n title: \"Copy failed\",\n description: `Failed to copy ${type} to clipboard`,\n duration: 5000,\n });\n }\n };\n return (_jsx(_Fragment, { children: _jsxs(ResizablePanelGroup, { direction: \"horizontal\", className: \"h-[calc(100vh-200px)]\", children: [_jsx(ResizablePanel, { className: \"min-w-[100px]\", children: _jsx(PropertiesPanel, { object: object, refetch: refetch ?? (() => Promise.resolve()), handleCopyContent: handleCopyContent }) }), _jsx(ResizableHandle, { withHandle: true }), _jsx(ResizablePanel, { className: \"min-w-[100px]\", children: _jsx(DataPanel, { object: object, loadText: loadText ?? false, handleCopyContent: handleCopyContent }) })] }) }));\n}\nfunction PropertiesPanel({ object, refetch, handleCopyContent }) {\n const [viewCode, setViewCode] = useState(false);\n const [isPropertiesModalOpen, setPropertiesModalOpen] = useState(false);\n const handleOpenPropertiesModal = () => {\n setPropertiesModalOpen(true);\n };\n const handleClosePropertiesModal = () => {\n setPropertiesModalOpen(false);\n };\n return (_jsxs(_Fragment, { children: [_jsxs(\"div\", { className: \"flex justify-between items-center px-2\", children: [_jsxs(\"div\", { className: \"flex items-center gap-1 bg-muted mb-2 p-1 rounded\", children: [_jsx(Button, { variant: `${viewCode ? \"ghost\" : \"primary\"}`, size: \"sm\", alt: \"Preview properties\", onClick: () => setViewCode(!viewCode), children: \"Properties\" }), _jsx(Button, { variant: `${viewCode ? \"primary\" : \"ghost\"}`, size: \"sm\", alt: \"View in JSON format\", onClick: () => setViewCode(!viewCode), children: \"JSON\" })] }), _jsxs(\"div\", { className: \"flex items-center gap-2\", children: [object.properties && (_jsx(Button, { variant: \"ghost\", size: \"sm\", title: \"Copy properties\", onClick: () => handleCopyContent(JSON.stringify(object.properties, null, 2), \"properties\"), children: _jsx(Copy, { className: \"size-4\" }) })), _jsx(Button, { variant: \"ghost\", size: \"sm\", onClick: handleOpenPropertiesModal, title: \"Edit properties\", className: \"flex items-center gap-2\", children: _jsx(SquarePen, { className: \"size-4\" }) })] })] }), object.properties ? (_jsx(\"div\", { className: \"h-[calc(100vh-220px)] overflow-auto px-2\", children: _jsx(JSONDisplay, { value: object.properties, viewCode: viewCode }) })) : (_jsx(\"div\", { className: \"h-[calc(100vh-220px)] overflow-auto px-2\", children: _jsx(\"div\", { children: \"No properties defined\" }) })), _jsx(PropertiesEditorModal, { isOpen: isPropertiesModalOpen, onClose: handleClosePropertiesModal, object: object, refetch: refetch })] }));\n}\nfunction DataPanel({ object, loadText, handleCopyContent }) {\n const { store } = useUserSession();\n const isImage = object?.metadata?.type === ContentNature.Image;\n const isVideo = object?.metadata?.type === ContentNature.Video;\n // Determine initial panel view\n const getInitialView = () => {\n if (isVideo)\n return PanelView.Video;\n if (isImage)\n return PanelView.Image;\n return PanelView.Text;\n };\n const [currentPanel, setCurrentPanel] = useState(getInitialView());\n const [text, setText] = useState(object.text);\n const [isLoadingText, setIsLoadingText] = useState(false);\n const [isTextCropped, setIsTextCropped] = useState(false);\n useEffect(() => {\n if (loadText && !text) {\n setIsLoadingText(true);\n store.objects\n .getObjectText(object.id)\n .then((res) => {\n if (res.text.length > MAX_TEXT_DISPLAY_SIZE) {\n // Crop the text to 128K characters\n const croppedText = res.text.substring(0, MAX_TEXT_DISPLAY_SIZE);\n setText(croppedText);\n setIsTextCropped(true);\n }\n else {\n setText(res.text);\n setIsTextCropped(false);\n }\n })\n .catch((err) => {\n console.error(\"Failed to load text\", err);\n })\n .finally(() => {\n setIsLoadingText(false);\n });\n }\n }, [loadText]);\n return (_jsxs(_Fragment, { children: [_jsxs(\"div\", { className: \"flex justify-between items-center px-2\", children: [_jsxs(\"div\", { className: \"flex items-center gap-1 bg-muted mb-2 p-1 rounded\", children: [isImage &&\n _jsx(Button, { variant: currentPanel === PanelView.Image ? \"primary\" : \"ghost\", size: \"sm\", alt: \"View Image\", onClick: () => setCurrentPanel(PanelView.Image), children: \"Image\" }), isVideo &&\n _jsx(Button, { variant: currentPanel === PanelView.Video ? \"primary\" : \"ghost\", size: \"sm\", alt: \"View Video\", onClick: () => setCurrentPanel(PanelView.Video), children: \"Video\" }), _jsx(Button, { variant: currentPanel === PanelView.Text ? \"primary\" : \"ghost\", size: \"sm\", alt: \"View Text\", onClick: () => setCurrentPanel(PanelView.Text), children: \"Text\" })] }), currentPanel === PanelView.Text && _jsx(TextActions, { object: object, text: text, handleCopyContent: handleCopyContent })] }), currentPanel === PanelView.Image ? (_jsx(ImagePanel, { object: object })) : currentPanel === PanelView.Video ? (_jsx(VideoPanel, { object: object })) : (isLoadingText ? (_jsx(\"div\", { className: \"flex justify-center items-center h-[calc(100vh-260px)]\", children: _jsx(Spinner, { size: \"lg\" }) })) : (_jsx(TextPanel, { object: object, text: text, isTextCropped: isTextCropped })))] }));\n}\nfunction TextActions({ object, text, handleCopyContent }) {\n const { client } = useUserSession();\n const toast = useToast();\n const [loadingFormat, setLoadingFormat] = useState(null);\n const content = object.content;\n const isMarkdown = content &&\n content.type &&\n content.type === \"text/markdown\";\n const handleExportDocument = async (format) => {\n // Prevent multiple concurrent exports\n if (loadingFormat)\n return;\n setLoadingFormat(format);\n // Show immediate feedback\n toast({\n status: \"info\",\n title: `Preparing ${format.toUpperCase()}`,\n description: \"Fetching your document...\",\n duration: 2000,\n });\n try {\n // Request document rendition from the server\n const response = await client.objects.getRendition(object.id, {\n format: format, // We're extending the format type\n generate_if_missing: true,\n sign_url: true,\n });\n if (response.status === \"generating\") {\n toast({\n status: \"info\",\n title: \"Generating document\",\n description: `Please wait while we prepare your ${format.toUpperCase()} file...`,\n duration: 5000,\n });\n // Poll for completion\n setTimeout(() => handleExportDocument(format), 3000);\n return;\n }\n if (response.status === \"failed\") {\n throw new Error(\"Document generation failed\");\n }\n // Download the generated file or open in new window\n if (response.renditions && response.renditions.length > 0) {\n const downloadUrl = response.renditions[0];\n if (format === 'pdf') {\n // Open PDF in new window\n window.open(downloadUrl, '_blank');\n toast({\n status: \"success\",\n title: \"PDF opened\",\n description: \"PDF document opened in a new window\",\n duration: 2000,\n });\n }\n else {\n // Download DOCX file\n const link = document.createElement(\"a\");\n link.href = downloadUrl;\n link.download = `${object.name || \"document\"}.${format}`;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n toast({\n status: \"success\",\n title: \"Document exported\",\n description: `Successfully exported to ${format.toUpperCase()} format`,\n duration: 2000,\n });\n }\n }\n }\n catch (err) {\n console.error(`Failed to export document as ${format}:`, err);\n toast({\n status: \"error\",\n title: \"Export failed\",\n description: `Failed to export document to ${format.toUpperCase()} format`,\n duration: 5000,\n });\n }\n finally {\n setLoadingFormat(null);\n }\n };\n const handleExportDocx = () => handleExportDocument(\"docx\");\n const handleExportPdf = () => handleExportDocument(\"pdf\");\n return (_jsx(\"div\", { className: \"h-[41px] text-lg font-semibold flex justify-between items-center px-2\", children: _jsxs(\"div\", { className: \"flex items-center gap-2\", children: [text && (_jsx(Button, { variant: \"ghost\", size: \"sm\", title: \"Copy text\", className: \"flex items-center gap-2\", onClick: () => handleCopyContent(text, \"text\"), children: _jsx(Copy, { className: \"size-4\" }) })), isMarkdown && text && (_jsxs(_Fragment, { children: [_jsxs(Button, { variant: \"ghost\", size: \"sm\", onClick: handleExportDocx, disabled: loadingFormat !== null, className: \"flex items-center gap-2\", children: [loadingFormat === \"docx\" ? (_jsx(Spinner, { size: \"sm\" })) : (_jsx(Download, { className: \"size-4\" })), \"DOCX\"] }), _jsxs(Button, { variant: \"ghost\", size: \"sm\", onClick: handleExportPdf, disabled: loadingFormat !== null, className: \"flex items-center gap-2\", children: [loadingFormat === \"pdf\" ? (_jsx(Spinner, { size: \"sm\" })) : (_jsx(Download, { className: \"size-4\" })), \"PDF\"] })] }))] }) }));\n}\nconst TextPanel = memo(({ object, text, isTextCropped }) => {\n const content = object.content;\n // Check if content type is markdown or plain text\n const isMarkdownOrText = content &&\n content.type &&\n (content.type === \"text/markdown\" || content.type === \"text/plain\");\n // Check if text content looks like markdown\n const seemsMarkdown = text && (text.includes(\"\\n# \") ||\n text.includes(\"\\n## \") ||\n text.includes(\"\\n### \") ||\n text.includes(\"\\n* \") ||\n text.includes(\"\\n- \") ||\n text.includes(\"\\n+ \") ||\n text.includes(\"![\") ||\n text.includes(\"](\"));\n // Render as markdown if it's markdown/text type OR if text looks like markdown\n const shouldRenderAsMarkdown = isMarkdownOrText || seemsMarkdown;\n return (text ? (_jsxs(_Fragment, { children: [isTextCropped && (_jsx(\"div\", { className: \"px-2 py-2 bg-attention/10 border-l-4 border-attention mx-2 mb-2 rounded\", children: _jsxs(\"div\", { className: \"flex items-center gap-2 text-attention\", children: [_jsx(AlertTriangle, { className: \"size-4\" }), _jsx(\"span\", { className: \"text-sm font-semibold\", children: \"Showing first 128K characters only\" })] }) })), _jsx(\"div\", { className: \"max-w-7xl px-2 h-[calc(100vh-210px)] overflow-auto\", children: shouldRenderAsMarkdown ? (_jsx(\"div\", { className: \"vprose prose-sm p-1\", children: _jsx(MarkdownRenderer, { components: {\n a: ({ node, ...props }) => {\n const href = props.href || \"\";\n if (href.includes(\"/store/objects/\")) {\n return (_jsx(NavLink, { topLevelNav: true, href: href, className: \"text-info\", children: props.children }));\n }\n return _jsx(\"a\", { ...props, \"data-debug\": \"test\", target: \"_blank\", rel: \"noopener noreferrer\" });\n },\n p: ({ node, ...props }) => (_jsx(\"p\", { ...props, className: `my-0` })),\n pre: ({ node, ...props }) => (_jsx(\"pre\", { ...props, className: `my-2 p-2 rounded` })),\n code: ({ node, className, children, ...props }) => {\n const match = /language-(\\w+)/.exec(className || \"\");\n const isInline = !match;\n return (_jsx(\"code\", { ...props, className: isInline\n ? `px-1.5 py-0.5 rounded`\n : \"text-muted\", children: children }));\n },\n h1: ({ node, ...props }) => (_jsx(\"h1\", { ...props, className: `font-bold text-2xl my-2` })),\n h2: ({ node, ...props }) => (_jsx(\"h2\", { ...props, className: `font-bold text-xl my-2` })),\n h3: ({ node, ...props }) => (_jsx(\"h3\", { ...props, className: `font-bold text-lg my-2` })),\n li: ({ node, ...props }) => (_jsx(\"li\", { ...props })),\n }, children: text }) })) : (_jsx(\"pre\", { className: \"text-wrap bg-muted text-muted p-2\", children: text })) })] })) :\n _jsx(\"div\", { className: \"px-2\", children: _jsx(\"div\", { children: \"No content\" }) }));\n});\nfunction ImagePanel({ object }) {\n const { client } = useUserSession();\n const [imageUrl, setImageUrl] = useState();\n const content = object.content;\n const isImage = object.metadata && object.metadata.type === ContentNature.Image;\n useEffect(() => {\n if (isImage) {\n const loadImage = async () => {\n const webSupportedFormats = ['image/jpeg', 'image/jpg', 'image/png', 'image/gif', 'image/webp', 'image/svg+xml'];\n const isOriginalWebSupported = content?.type && webSupportedFormats.includes(content.type);\n try {\n const rendition = await client.objects.getRendition(object.id, {\n format: ImageRenditionFormat.jpeg,\n generate_if_missing: false,\n sign_url: true,\n });\n if (rendition.status === \"found\" && rendition.renditions?.length) {\n // Use rendition URL directly\n setImageUrl(rendition.renditions[0]);\n }\n else if (isOriginalWebSupported) {\n // Fall back to original file only if web-supported\n const downloadUrl = await client.files.getDownloadUrl(object.content.source);\n setImageUrl(downloadUrl.url);\n }\n }\n catch (error) {\n // Fall back to original file only if web-supported\n if (isOriginalWebSupported) {\n const downloadUrl = await client.files.getDownloadUrl(object.content.source);\n setImageUrl(downloadUrl.url);\n }\n }\n };\n loadImage();\n }\n }, []);\n return (_jsx(\"div\", { className: \"mb-4 px-2\", children: imageUrl ? (_jsx(\"img\", { src: imageUrl, alt: object.name, className: \"w-full object-contain\" })) : (_jsx(Spinner, { size: \"md\" })) }));\n}\nfunction VideoPanel({ object }) {\n const { client } = useUserSession();\n const [videoUrl, setVideoUrl] = useState();\n const [posterUrl, setPosterUrl] = useState();\n const [isLoading, setIsLoading] = useState(true);\n const content = object.content;\n const isVideo = object.metadata?.type === ContentNature.Video;\n // Check if there are mp4 or webm renditions available in metadata\n const metadata = object.metadata;\n const renditions = metadata?.renditions || [];\n // Find mp4 or webm rendition by mime type, preferring mp4\n const webRendition = renditions.find(r => r.content.type === 'video/mp4') ||\n renditions.find(r => r.content.type === 'video/webm');\n // Check if original file is web-compatible\n const webSupportedFormats = ['video/mp4', 'video/webm'];\n const isOriginalWebSupported = content?.type && webSupportedFormats.includes(content.type);\n // Get poster\n const poster = renditions.find(r => r.name === POSTER_RENDITION_NAME);\n useEffect(() => {\n const loadPoster = async () => {\n if (poster?.content?.source) {\n try {\n const response = await client.files.getDownloadUrl(poster.content.source);\n setPosterUrl(response.url);\n }\n catch (error) {\n console.error(\"Failed to load poster image\", error);\n }\n }\n };\n loadPoster();\n }, [poster, client]);\n useEffect(() => {\n if (isVideo && (webRendition?.content?.source || isOriginalWebSupported)) {\n const loadVideoUrl = async () => {\n try {\n let downloadUrl;\n if (webRendition?.content?.source) {\n // Use rendition if available\n downloadUrl = await client.files.getDownloadUrl(webRendition.content.source);\n }\n else if (isOriginalWebSupported && content?.source) {\n // Fall back to original file if web-supported\n downloadUrl = await client.files.getDownloadUrl(content.source);\n }\n if (downloadUrl) {\n setVideoUrl(downloadUrl.url);\n }\n }\n catch (error) {\n console.error(\"Failed to get video URL\", error);\n }\n finally {\n setIsLoading(false);\n }\n };\n loadVideoUrl();\n }\n else {\n setIsLoading(false);\n }\n }, [isVideo, webRendition, isOriginalWebSupported, content?.source, client]);\n return (_jsx(\"div\", { className: \"mb-4 px-2\", children: !webRendition && !isOriginalWebSupported ? (_jsx(\"div\", { className: \"flex justify-center items-center h-[400px] text-muted\", children: _jsxs(\"div\", { className: \"text-center\", children: [_jsx(\"p\", { children: \"No web-compatible video rendition available\" }), _jsx(\"p\", { className: \"text-sm mt-2\", children: \"MP4 or WebM format required\" })] }) })) : isLoading ? (_jsx(\"div\", { className: \"flex justify-center items-center h-[400px]\", children: _jsx(Spinner, { size: \"md\" }) })) : videoUrl ? (_jsx(\"video\", { src: videoUrl, poster: posterUrl, controls: true, className: \"w-full max-h-[calc(100vh-260px)] object-contain\", children: \"Your browser does not support the video tag.\" })) : (_jsx(\"div\", { className: \"flex justify-center items-center h-[400px] text-muted\", children: \"Failed to load video\" })) }));\n}\n//# sourceMappingURL=ContentOverview.js.map","export function shortId(id, length = 7) {\n if (!id) {\n return \"\";\n }\n return \"~\" + id.slice(-length);\n}\nexport function shortenString(str, length) {\n return str.length > length ? str.substring(0, length) + '...' : str;\n}\n//# sourceMappingURL=text.js.map","const CSV_PREFIX = 'text/csv';\nconst IMAGE_PREFIX = 'image/';\nconst PDF_PREFIX = 'application/pdf';\nconst VIDEO_PREFIX = 'video/';\nexport const isCsv = (type) => type === CSV_PREFIX || CSV_PREFIX.includes(type);\nexport const isImage = (type) => type.startsWith(IMAGE_PREFIX) || IMAGE_PREFIX.includes(type);\nexport const isPdf = (type) => type === PDF_PREFIX || PDF_PREFIX.includes(type);\nexport const isVideo = (type) => type.startsWith(VIDEO_PREFIX) || VIDEO_PREFIX.includes(type);\n//# sourceMappingURL=mimeType.js.map","import { isImage, isPdf, isVideo } from \"./mimeType.js\";\nimport { ImageRenditionFormat } from \"@vertesia/common\";\n//TODO we must use a setting in Env.\nconst env = import.meta.env;\nconst RENDITION_OPTIONS = {\n max_hw: env?.VITE_RENDITION_HW || 256,\n format: ImageRenditionFormat.jpeg,\n generate_if_missing: true,\n};\nconst RENDITION_ID = \"vertesia.content_store.renditionId\";\nexport async function retrieveRendition(client, doc, setRenditionUrl, setRenditionAlt, setRenditionStatus) {\n if (!doc?.content?.type ||\n !(isImage(doc.content.type) ||\n isVideo(doc.content.type) ||\n isPdf(doc.content.type))) {\n setRenditionStatus(\"No preview available\");\n return;\n }\n setRenditionStatus(\"Preparing preview...\");\n const currentTime = new Date().getTime() / 1000;\n const savedId = localStorage.getItem(`${RENDITION_ID}_${doc.id}_${RENDITION_OPTIONS.max_hw}`);\n const elapsedTime = localStorage.getItem(`${RENDITION_ID}_${doc.id}_${RENDITION_OPTIONS.max_hw}_time`);\n if (savedId?.length &&\n elapsedTime &&\n Math.abs(currentTime - parseInt(elapsedTime)) <= 900) {\n setRenditionUrl(savedId);\n setRenditionAlt(`${doc.name} Rendition`);\n setRenditionStatus(\"ready\");\n return savedId;\n }\n setRenditionStatus(\"Preparing preview...\");\n client.objects.getRendition(doc.id, RENDITION_OPTIONS).then((response) => {\n if (response.status === \"generating\") {\n setRenditionStatus(\"Preparing preview...\");\n setRenditionUrl(\"\");\n setRenditionAlt(\"\");\n setTimeout(() => retrieveRendition(client, doc, setRenditionUrl, setRenditionAlt, setRenditionStatus), 60000);\n }\n else if (response.status === \"failed\") {\n setRenditionStatus(\"No preview available\");\n setRenditionUrl(\"\");\n setRenditionAlt(\"\");\n return;\n }\n else {\n if (!response?.renditions?.length) {\n setRenditionStatus(\"No preview available\");\n setRenditionUrl(\"\");\n setRenditionAlt(\"\");\n return;\n }\n const rendition = response.renditions[0];\n localStorage.setItem(`${RENDITION_ID}_${doc.id}_${RENDITION_OPTIONS.max_hw}`, rendition);\n localStorage.setItem(`${RENDITION_ID}_${doc.id}_${RENDITION_OPTIONS.max_hw}_time`, (new Date().getTime() / 1000).toString());\n setRenditionUrl(rendition);\n setRenditionAlt(`${doc.name} Rendition`);\n setRenditionStatus(\"ready\");\n console.log(`Rendition for document ${doc.id} retrieved successfully: ${rendition}`);\n }\n }).catch((error) => {\n setRenditionStatus(\"No preview available\");\n console.warn(\"Failed to retrieve rendition:\", error);\n setRenditionUrl(\"\");\n setRenditionAlt(\"\");\n });\n}\n//# sourceMappingURL=rendition.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { useEffect, useState } from 'react';\nimport { retrieveRendition } from '../../../utils';\nimport { Button, Card, CardContent, Separator, VTooltip } from \"@vertesia/ui/core\";\nimport { useUserSession } from \"@vertesia/ui/session\";\nimport { Eye } from 'lucide-react';\nexport function DocumentIconSkeleton({ isLoading = false, counts = 6 }) {\n if (!isLoading) {\n return null;\n }\n return (_jsx(\"div\", { className: 'flex flex-wrap gap-2 justify-between', children: Array(counts).fill(0).map((_, index) => _jsx(\"div\", { className: \"w-[15vw] animate-pulse\", children: _jsxs(Card, { className: \"relative flex flex-col border h-fit\", children: [_jsx(\"div\", { className: \"h-48 bg-muted rounded-t-xl flex items-center justify-center text-muted\", children: \"\\u00A0\" }), _jsx(Separator, { className: 'bg-muted h-[2px]' }), _jsxs(CardContent, { className: \"p-2 flex flex-col\", children: [_jsxs(\"div\", { className: \"flex flex-col overflow-hidden\", children: [_jsx(\"div\", { className: \"h-5 bg-muted rounded w-3/4 mb-2\" }), _jsx(\"div\", { className: \"h-4 bg-muted rounded w-1/2\" })] }), _jsx(\"div\", { className: \"text-xs text-muted w-full flex justify-end mt-2\", children: _jsx(\"div\", { className: \"h-3 bg-muted rounded w-1/4\" }) })] })] }) }, index)) }));\n}\nexport function DocumentIcon({ selection, document, onSelectionChange, onRowClick, previewObject, selectedObject }) {\n const { client } = useUserSession();\n const [renditionUrl, setRenditionUrl] = useState(undefined);\n const [renditionAlt, setRenditionAlt] = useState(undefined);\n const [renditionStatus, setRenditionStatus] = useState(undefined);\n const handleSelect = (ev) => {\n ev.stopPropagation();\n onSelectionChange(document, ev);\n };\n useEffect(() => {\n if (!document?.content) {\n return;\n }\n retrieveRendition(client, document, setRenditionUrl, setRenditionAlt, setRenditionStatus);\n }, [document]);\n return (_jsxs(Card, { className: `relative flex flex-col border h-fit ${selectedObject?.id === document.id ? 'border-attention border-4' : ''}`, onClick: () => (onRowClick && onRowClick(document)), children: [selection && (_jsx(\"div\", { className: \"absolute top-2 left-2 z-10 flex flex-col items-center gap-1\", children: _jsx(\"input\", { checked: selection.isSelected(document.id), type: \"checkbox\", onChange: handleSelect, onClick: (e) => e.stopPropagation() }) })), _jsx(\"div\", { className: \"absolute top-1 right-1 z-10 flex flex-col items-center\", children: _jsx(Button, { variant: \"ghost\", size: \"sm\", title: \"Preivew Object\", onClick: (e) => {\n e.stopPropagation();\n previewObject?.(document.id);\n }, children: _jsx(Eye, { className: `size-4 ${renditionStatus === 'ready' ? 'text-muted' : 'text-white'}` }) }) }), (renditionUrl && renditionStatus == 'ready') ? (_jsx(\"img\", { src: renditionUrl, alt: renditionAlt, className: \"w-auto h-48 object-cover rounded-t-xl\" })) : (_jsx(\"div\", { className: \"h-48 bg-gray-700 rounded-t-xl flex items-center justify-center text-muted\", children: renditionStatus })), _jsx(Separator, { className: 'bg-gray-200 h-[2px]' }), _jsxs(CardContent, { className: \"p-2 flex flex-col\", children: [_jsxs(\"div\", { className: \"flex flex-col overflow-hidden\", children: [_jsx(VTooltip, { placement: 'top', description: document.properties?.title ?? document.name, children: _jsx(\"h3\", { className: \"text-start font-medium leading-none truncate\", children: document.properties?.title ?? document.name }) }), document?.type?.name ? (_jsx(VTooltip, { placement: 'bottom', size: 'xs', description: document?.type?.name, children: _jsx(\"p\", { className: \"text-start text-xs text-muted truncate\", children: document?.type?.name }) })) : _jsx(\"p\", { className: \"text-xs text-muted\", children: \"\\u2002\" })] }), document.score && (_jsxs(\"div\", { className: \"text-xs text-muted w-full flex justify-end\", children: [\"Score: \", (document.score).toFixed(4) ?? \"-\"] }))] })] }));\n}\n//# sourceMappingURL=DocumentIcon.js.map","export function facetOptionLabel(bucket) {\n return `${bucket._id} (${bucket.count})`;\n}\nexport function facetOptionNameLabel(bucket) {\n return `${bucket.name} (${bucket.count})`;\n}\n//# sourceMappingURL=utils.js.map","import { jsx as _jsx } from \"react/jsx-runtime\";\nimport { SelectBox } from '@vertesia/ui/core';\nimport { facetOptionLabel } from './utils';\nexport function StringFacet({ search, buckets, name, placeholder, className }) {\n const filterValue = search.getFilterValue(name);\n const onChange = (option) => {\n search.setFilterValue(name, option?._id);\n };\n const value = buckets?.find((option) => JSON.stringify(option._id) === JSON.stringify(filterValue));\n return (_jsx(SelectBox, { filterBy: \"_id\", className: className, isClearable: true, optionLabel: facetOptionLabel, options: buckets, value: value, onChange: onChange, by: '_id', placeholder: placeholder }));\n}\n//# sourceMappingURL=StringFacet.js.map","import { jsx as _jsx } from \"react/jsx-runtime\";\nimport { InputList } from '@vertesia/ui/core';\nimport { useEffect, useState } from 'react';\nexport function StringListFacet({ search, name, placeholder, className }) {\n const [tags, setTags] = useState([]);\n useEffect(() => {\n search.setFilterValue(name, tags);\n }, [tags]);\n return (_jsx(InputList, { className: className, value: tags, onChange: setTags, placeholder: placeholder }));\n}\n//# sourceMappingURL=StringListFacet.js.map","import { jsx as _jsx } from \"react/jsx-runtime\";\nimport { useUserSession } from \"@vertesia/ui/session\";\nimport { SelectBox } from \"@vertesia/ui/core\";\nimport { useEffect, useState } from \"react\";\nexport function facetOptionLabel(bucket) {\n return `${bucket.name} (${bucket.count})`;\n}\nexport function TypeFacet({ search, buckets, placeholder = \"Filter by Type\", className }) {\n const [options, setOptions] = useState([]);\n const { typeRegistry } = useUserSession();\n const filterValue = search.getFilterValue(\"type\");\n const onChange = (option) => {\n search.setFilterValue(\"type\", option?._id);\n };\n useEffect(() => {\n if (typeRegistry) {\n const options = buckets.map((bucket) => {\n let name;\n if (bucket._id == null) {\n bucket._id = \"Document\";\n name = \"Document\";\n }\n else {\n name = typeRegistry.getTypeName(bucket._id);\n if (!name) {\n console.warn(\"Content Object Type not found\", bucket._id);\n name = bucket._id;\n }\n }\n return {\n ...bucket,\n name\n };\n });\n options.sort((a, b) => a.name.localeCompare(b.name));\n setOptions(options);\n }\n }, [buckets, typeRegistry]);\n const value = options?.find((option) => option._id === filterValue);\n return (_jsx(SelectBox, { filterBy: \"name\", className: className, isClearable: true, optionLabel: facetOptionLabel, options: options, value: value, onChange: onChange, by: '_id', placeholder: placeholder }));\n}\n//# sourceMappingURL=TypeFacet.js.map","import { facetOptionLabel } from './utils';\nexport function createStringFilterGroup({ buckets, name, placeholder, type = 'select', multiple = false }) {\n const options = buckets.map((bucket) => ({\n label: facetOptionLabel(bucket),\n value: bucket._id\n }));\n const filterGroup = {\n name: name,\n options: options,\n type: type,\n multiple: multiple,\n placeholder: `${placeholder ?? `${name.charAt(0).toUpperCase() + name.slice(1)}`}`,\n ...({ allowCreate: false })\n };\n return filterGroup;\n}\nexport function VStringFacet({ buckets, name, placeholder, type, multiple }) {\n return createStringFilterGroup({ buckets, name, placeholder, type, multiple });\n}\n//# sourceMappingURL=VStringFacet.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nexport function VTypeFacet({ buckets, typeRegistry, type = 'select', multiple = false }) {\n // Create a map for quick lookups of type names and counts\n const typeDataMap = new Map();\n if (!typeRegistry) {\n console.warn(\"Type names cannot be resolved\");\n }\n buckets.forEach((bucket) => {\n let name;\n let typeId = bucket._id;\n if (bucket._id == null) {\n typeId = \"Document\";\n name = \"Document\";\n }\n else {\n name = typeRegistry?.getTypeName(bucket._id);\n if (!name) {\n console.warn(\"Content Object Type not found\", bucket._id);\n name = bucket._id;\n }\n }\n typeDataMap.set(typeId, {\n name,\n count: bucket.count\n });\n });\n const options = buckets.map((bucket) => {\n const actualId = bucket._id;\n const displayKey = actualId || \"Document\";\n const typeData = typeDataMap.get(displayKey);\n return {\n value: actualId,\n label: typeData ? `${typeData.name} (${typeData.count})` : `Unknown (${bucket.count})`\n };\n });\n const customFilterGroups = {\n name: 'types',\n placeholder: 'Types',\n type: type,\n multiple: multiple,\n options: options,\n labelRenderer: (typeId) => {\n const typeData = typeDataMap.get(typeId);\n if (!typeData) {\n console.warn(`Type data not found for ${typeId}`);\n return typeId;\n }\n return (_jsxs(\"div\", { className: \"w-full flex items-center\", children: [_jsx(\"span\", { className: \"text-sm truncate\", children: typeData.name }), _jsxs(\"span\", { className: \"ml-2 text-xs\", children: [\"(\", typeData.count, \")\"] })] }));\n },\n filterBy: (optionValue, searchText) => {\n const typeData = typeDataMap.get(optionValue);\n if (!typeData) {\n console.warn(`Type name not found for ${optionValue}`);\n return false;\n }\n return typeData.name.toLowerCase().includes(searchText.toLowerCase());\n }\n };\n return customFilterGroups;\n}\n//# sourceMappingURL=VTypeFacet.js.map","import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from \"react/jsx-runtime\";\nimport { useUserSession } from \"@vertesia/ui/session\";\nimport { PrincipalType } from \"@vertesia/common\";\nimport { Avatar, Table, Popover, PopoverContent, PopoverTrigger, useFetch } from \"@vertesia/ui/core\";\nimport { Users } from \"lucide-react\";\n//TODO use a real cache\nconst USER_CACHE = {};\nconst GROUP_CACHE = {};\n/**\n * Fetch the user information given a user reference.\n * The reference has the format: `type:id`. A special reference `system` is used to refer to the system user.\n * @param userRef\n */\nexport function useFetchUserInfo(userId) {\n const { client } = useUserSession();\n return useFetch(() => {\n let user = USER_CACHE[userId];\n if (!user) {\n user = client.users.retrieve(userId).then(user => {\n return user;\n });\n USER_CACHE[userId] = user;\n }\n return user;\n }, [userId]);\n}\n/**\n * Fetch the group information given a group ID.\n * @param groupId\n */\nexport function useFetchGroupInfo(groupId) {\n const { client } = useUserSession();\n return useFetch(() => {\n let group = GROUP_CACHE[groupId];\n if (!group) {\n group = client.iam.groups.retrieve(groupId).then(group => {\n return group;\n });\n GROUP_CACHE[groupId] = group;\n }\n return group;\n }, [groupId]);\n}\nfunction AvatarPlaceholder() {\n return _jsx(\"div\", { className: 'size-8' });\n}\nfunction SystemAvatar({ showTitle = false, size = \"md\" }) {\n return (_jsx(UserPopoverPanel, { title: \"System User\", description: \"The system user is used to initialize built-in objects.\", children: _jsxs(\"div\", { className: \"flex gap-2 items-center\", children: [_jsx(Avatar, { src: \"/icon.svg\", size: size }), showTitle && _jsx(\"div\", { className: \"text-sm font-semibold pl-2\", children: \"System User\" })] }) }));\n}\nfunction ServiceAccountAvatar({ accountId, showTitle = false, size = \"md\" }) {\n const description = (_jsxs(_Fragment, { children: [_jsx(\"div\", { children: \"This user is used by robots like workflow workers.\" }), _jsxs(\"div\", { className: \"text-gray-800 dark:text-gray-500 text-sm\", children: [_jsx(\"span\", { className: \"font-semibold\", children: \"ID:\" }), \" \", accountId] })] }));\n return (_jsx(UserPopoverPanel, { title: \"Service Account\", description: description, children: _jsxs(\"div\", { className: \"flex flex-row items-center gap-2\", children: [_jsx(Avatar, { src: \"/cloud.svg\", name: \"SA\", color: \"bg-amber-500\", className: \"px-[5px] text-white\", size: size }), showTitle && _jsxs(\"div\", { className: \"text-sm font-semibold pl-2 truncate\", children: [\"Service Account : \", accountId] })] }) }));\n}\nfunction ErrorAvatar({ title = \"Error\", error, showTitle = false, size = \"md\" }) {\n return (_jsx(UnknownAvatar, { title: title, message: typeof error === 'string' ? error : error.message, color: \"bg-red-500\", showTitle: showTitle, size: size }));\n}\nexport function UserInfo({ userRef, showTitle = false, size = \"md\" }) {\n if (!userRef) {\n return _jsx(UnknownAvatar, { title: \"Unknown User\", message: \"User information is not available.\", showTitle: showTitle, size: size });\n }\n const [type, id] = userRef ? userRef.split(':') : [\"unknown\"];\n switch (type) {\n case PrincipalType.User:\n return _jsx(UserAvatar, { userId: id, showTitle: showTitle, size: size });\n case PrincipalType.Group:\n return _jsx(GroupAvatar, { userId: id, showTitle: showTitle, size: size });\n case \"system\":\n return _jsx(SystemAvatar, { showTitle: showTitle, size: size });\n case PrincipalType.ServiceAccount:\n return _jsx(ServiceAccountAvatar, { accountId: id, showTitle: showTitle, size: size });\n case PrincipalType.Agent:\n return _jsx(ServiceAccountAvatar, { accountId: id, showTitle: showTitle, size: size });\n case PrincipalType.ApiKey:\n return _jsx(ApiKeyAvatar, { keyId: id, size: size, showTitle: showTitle });\n default:\n return _jsx(ErrorAvatar, { title: \"Unknown User\", error: `Invalid user ref type: ${type}`, showTitle: showTitle, size: size });\n }\n}\nfunction UnknownAvatar({ title, message, color, size = \"md\", showTitle = false }) {\n return (_jsx(UserPopoverPanel, { title: title, description: message, children: _jsxs(\"div\", { className: \"flex flex-row items-center gap-2\", children: [_jsx(Avatar, { color: color, size: size }), showTitle && _jsx(\"div\", { className: \"text-sm font-semibold pl-1\", children: title })] }) }));\n}\nfunction GroupAvatar({ userId, showTitle = false, size = \"md\" }) {\n const { data: group, error } = useFetchGroupInfo(userId);\n if (error) {\n return _jsx(ErrorAvatar, { title: \"Failed to fetch group\", error: error, showTitle: showTitle, size: size });\n }\n if (!group) {\n return _jsx(AvatarPlaceholder, {});\n }\n const description = (_jsxs(\"div\", { className: \"space-y-1\", children: [group.description && _jsx(\"div\", { className: \"text-sm\", children: group.description }), _jsxs(\"div\", { className: \"text-xs text-muted-foreground\", children: [\"Group ID: \", group.id] }), group.tags && group.tags.length > 0 && (_jsx(\"div\", { className: \"flex flex-wrap gap-1\", children: group.tags.map(tag => (_jsx(\"span\", { className: \"px-1.5 py-0.5 bg-muted rounded text-xs\", children: tag }, tag))) }))] }));\n return (_jsx(UserPopoverPanel, { title: group.name || \"Unnamed Group\", description: description, children: _jsxs(\"div\", { className: \"flex flex-row items-center gap-2\", children: [_jsx(Users, { className: \"size-6 text-indigo-500\", size: size }), showTitle && _jsx(\"div\", { className: \"text-sm font-semibold pl-2\", children: group.name || \"Unnamed Group\" })] }) }));\n}\nfunction UserAvatar({ userId, showTitle = false, size = \"md\" }) {\n const { data: user, error } = useFetchUserInfo(userId);\n if (error) {\n return _jsx(ErrorAvatar, { title: \"Failed to fetch user\", error: error, showTitle: showTitle, size: size });\n }\n if (!user) {\n return _jsx(AvatarPlaceholder, {});\n }\n const description = (_jsx(\"div\", { className: \"truncate\", title: user.email, children: user.email }));\n return (_jsx(UserPopoverPanel, { title: user.name || user.email || user.username || \"unknown\", description: description, children: _jsxs(\"div\", { className: \"flex flex-row items-center gap-2\", children: [_jsx(Avatar, { src: user.picture, name: user.name, color: \"bg-indigo-500\", size: size }), showTitle && _jsx(\"div\", { className: \"text-sm font-semibold pl-2\", children: user.name || user.email || user.username || \"unknown\" })] }) }));\n}\nexport function ApiKeyAvatar({ keyId, showTitle = false, size = \"md\" }) {\n const { client } = useUserSession();\n const { data, error } = useFetch(() => client.apikeys.retrieve(keyId), []);\n if (error) {\n return _jsx(ErrorAvatar, { title: \"Failed to fetch the apikey\", error: error, showTitle: showTitle, size: size });\n }\n if (!data) {\n return _jsx(AvatarPlaceholder, {});\n }\n const title = \"Private Key\";\n const avatar = _jsx(Avatar, { name: \"PK\", color: \"bg-pink-500\", size: size });\n const description = (_jsxs(Table, { className: \"dark:bg-gray-800 dark:text-gray-200 table-fixed w-full\", children: [_jsxs(\"tr\", { children: [_jsx(\"td\", { className: \"font-semibold w-20\", children: \"Key:\" }), _jsx(\"td\", { className: \"truncate max-w-0\", children: data?.name })] }), _jsxs(\"tr\", { children: [_jsx(\"td\", { className: \"font-semibold w-20\", children: \"Account:\" }), _jsx(\"td\", { className: \"truncate max-w-0\", children: data?.account })] }), _jsxs(\"tr\", { children: [_jsx(\"td\", { className: \"font-semibold w-20\", children: \"Project:\" }), _jsx(\"td\", { className: \"truncate max-w-0\", children: data?.project.name })] })] }));\n return (_jsx(UserPopoverPanel, { title: title, description: description, children: _jsxs(\"div\", { className: \"flex flex-row items-center gap-2\", children: [avatar, showTitle && _jsx(\"div\", { className: \"text-sm font-semibold\", children: data?.name || data?.account || data?.project.name || \"unknown\" })] }) }));\n}\nfunction UserPopoverPanel({ title, description, children }) {\n return (_jsxs(Popover, { hover: true, children: [_jsx(PopoverTrigger, { className: \"cursor-pointer flex items-center inline-block\", children: _jsx(\"div\", { children: children }) }), _jsx(PopoverContent, { align: \"center\", sideOffset: 8, side: \"right\", children: _jsxs(\"div\", { className: \"flex flex-col gap-1 rounded-md shadow-md p-2\", children: [_jsx(\"div\", { className: 'text-md font-semibold', children: title }), description] }) })] }));\n}\n//# sourceMappingURL=UserInfo.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { UserInfo } from '../../user/UserInfo';\nexport function createUserFilterGroup({ buckets, name, placeholder }) {\n const options = buckets.map((bucket) => {\n return {\n value: bucket._id,\n label: `(${bucket.count})`\n };\n });\n const filterGroup = {\n name: name,\n placeholder: placeholder || `${name.charAt(0).toUpperCase() + name.slice(1)}`,\n options: options,\n labelRenderer: (userRef) => {\n const isUnknownUser = userRef === 'Unknown User' || !userRef;\n if (isUnknownUser) {\n // Find the count for this user from buckets\n const bucket = buckets.find(b => b._id === userRef);\n return `Unknown User (${bucket?.count || 0})`;\n }\n // For known users, render UserInfo with count\n const bucket = buckets.find(b => b._id === userRef);\n return (_jsxs(\"div\", { className: \"flex items-center w-full gap-2\", children: [_jsx(\"div\", { className: \"flex-1 min-w-0 flex items-center truncate\", children: _jsx(UserInfo, { userRef: userRef, showTitle: true, size: \"sm\" }) }), _jsxs(\"span\", { className: \"text-muted-foreground flex-shrink-0\", children: [\"(\", bucket?.count || 0, \")\"] })] }));\n },\n };\n return filterGroup;\n}\nexport function VUserFacet({ buckets, name, placeholder }) {\n return createUserFilterGroup({ buckets, name, placeholder });\n}\n//# sourceMappingURL=VUserFacet.js.map","import { jsx as _jsx } from \"react/jsx-runtime\";\nimport { useEffect, useState } from 'react';\nimport { SelectBox } from '@vertesia/ui/core';\nimport { useUserSession } from '@vertesia/ui/session';\nimport { facetOptionNameLabel } from './utils/utils';\nexport function EnvironmentFacet({ search, buckets, placeholder = \"All Environments\", className }) {\n const { client } = useUserSession();\n const [options, setOptions] = useState([]);\n const filterValue = search.getFilterValue(\"environment\");\n const onChange = (option) => {\n search.setFilterValue(\"environment\", option?._id);\n };\n useEffect(() => {\n if (client) {\n const options = buckets.map(async (bucket) => {\n let name;\n await client.environments.retrieve(bucket._id).then((environment) => {\n name = environment.name;\n }).catch(() => {\n name = `${bucket._id} (deleted)`;\n });\n if (!name) {\n name = bucket._id;\n }\n return {\n ...bucket,\n name\n };\n });\n Promise.all(options).then(resolvedOptions => {\n resolvedOptions.sort((a, b) => a.name.localeCompare(b.name));\n setOptions(resolvedOptions);\n });\n }\n }, [buckets, client]);\n const value = options?.find((option) => option._id === filterValue);\n return (_jsx(SelectBox, { filterBy: \"name\", className: className, isClearable: true, optionLabel: facetOptionNameLabel, options: options, value: value, onChange: onChange, by: '_id', placeholder: placeholder }));\n}\n//# sourceMappingURL=EnvironmentFacet.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { Button, FilterProvider, FilterBtn, FilterBar, FilterClear } from '@vertesia/ui/core';\nimport { useState } from 'react';\nimport { VEnvironmentFacet } from './utils/VEnvironmentFacet';\nimport { VInteractionFacet } from './utils/VInteractionFacet';\nimport { VStringFacet } from './utils/VStringFacet';\nimport { VUserFacet } from './utils/VUserFacet';\nimport { RefreshCw } from 'lucide-react';\n// Hook to create filter groups for runs\nexport function useRunsFilterGroups(facets) {\n const customFilterGroups = [];\n const runIdFilterGroup = {\n name: 'run_ids',\n placeholder: 'Run ID',\n type: 'text',\n multiple: false\n };\n customFilterGroups.push(runIdFilterGroup);\n if (facets.interactions) {\n const interactionFilterGroup = VInteractionFacet({\n buckets: facets.interactions || [],\n name: 'interaction',\n placeholder: 'Interactions',\n });\n customFilterGroups.push(interactionFilterGroup);\n }\n if (facets.environments) {\n const environmentFilterGroup = VEnvironmentFacet({\n buckets: facets.environments || [],\n name: 'environments',\n });\n customFilterGroups.push(environmentFilterGroup);\n }\n // Add tags filter as stringList type (allows custom input)\n const tagsFilterGroup = {\n name: 'tags',\n placeholder: 'Tags',\n type: 'stringList',\n multiple: true\n };\n customFilterGroups.push(tagsFilterGroup);\n if (facets.models) {\n const modelFilterGroup = VStringFacet({\n search: null, // This will be provided by the search context\n buckets: facets.models || [],\n name: 'model'\n });\n customFilterGroups.push(modelFilterGroup);\n }\n if (facets.statuses) {\n const statusFilterGroup = VStringFacet({\n search: null, // This will be provided by the search context\n buckets: facets.statuses || [],\n name: 'status'\n });\n customFilterGroups.push(statusFilterGroup);\n }\n if (facets.finish_reason) {\n const processedFinishReason = facets.finish_reason.map((bucket) => ({\n ...bucket,\n _id: bucket._id === null ? 'none' : bucket._id\n }));\n const finishReasonFilterGroup = VStringFacet({\n search: null, // This will be provided by the search context\n buckets: processedFinishReason,\n name: 'finish_reason',\n placeholder: 'Finish Reason'\n });\n customFilterGroups.push(finishReasonFilterGroup);\n }\n if (facets.created_by) {\n const createdByFilterGroup = VUserFacet({\n buckets: facets.created_by || [],\n name: 'created_by',\n placeholder: 'Created By'\n });\n customFilterGroups.push(createdByFilterGroup);\n }\n const dateAfterFilterGroup = {\n name: 'start',\n placeholder: 'Date After',\n type: 'date',\n multiple: false\n };\n customFilterGroups.push(dateAfterFilterGroup);\n const dateBeforeFilterGroup = {\n name: 'end',\n placeholder: 'Date Before',\n type: 'date',\n multiple: false\n };\n customFilterGroups.push(dateBeforeFilterGroup);\n const workflowRunIdFilterGroup = {\n name: 'workflow_run_ids',\n placeholder: 'Workflow Run ID',\n type: 'text',\n multiple: false\n };\n customFilterGroups.push(workflowRunIdFilterGroup);\n return customFilterGroups;\n}\n// Hook to create filter change handler for runs\nexport function useRunsFilterHandler(search) {\n return (newFilters) => {\n if (newFilters.length === 0) {\n // Clear filters without applying defaults - user wants to remove all filters\n search.clearFilters(true, false);\n return;\n }\n // Clear all filters first without defaults, then apply new ones\n search.clearFilters(false, false);\n newFilters.forEach(filter => {\n if (filter.value && filter.value.length > 0) {\n const filterName = filter.name;\n let filterValue;\n if (filter.type === 'stringList') {\n filterValue = filter.value.map(v => typeof v === 'string' ? v : v.value);\n }\n else if (filter.multiple) {\n filterValue = Array.isArray(filter.value)\n ? filter.value.map((v) => typeof v === 'object' && v.value ? v.value : v)\n : [typeof filter.value === 'object' && filter.value.value ? filter.value.value : filter.value];\n }\n else {\n // Single value - don't wrap in array\n filterValue = Array.isArray(filter.value) && filter.value[0] && typeof filter.value[0] === 'object'\n ? filter.value[0].value\n : Array.isArray(filter.value) && filter.value[0]\n ? filter.value[0]\n : filter.value;\n }\n // Force array format for backend fields that expect arrays\n if ((filterName === 'run_ids' || filterName === 'workflow_run_ids') && !Array.isArray(filterValue)) {\n filterValue = [filterValue];\n }\n search.query[filterName] = filterValue;\n }\n });\n search.search();\n };\n}\n// Legacy component for backward compatibility\nexport function RunsFacetsNav({ facets, search }) {\n const [filters, setFilters] = useState([]);\n const filterGroups = useRunsFilterGroups(facets);\n const handleFilterLogic = useRunsFilterHandler(search);\n const handleFilterChange = (value) => {\n const newFilters = typeof value === 'function' ? value(filters) : value;\n setFilters(newFilters);\n handleFilterLogic(newFilters);\n };\n const handleRefetch = () => {\n search.search();\n };\n return (_jsxs(FilterProvider, { filterGroups: filterGroups, filters: filters, setFilters: handleFilterChange, children: [_jsxs(\"div\", { className: 'flex justify-between mb-1', children: [_jsx(FilterBtn, {}), _jsx(Button, { onClick: handleRefetch, variant: 'outline', title: \"Refresh\", children: _jsx(RefreshCw, { className: \"size-5\" }) })] }), _jsxs(\"div\", { className: 'flex gap-2 items-center', children: [_jsx(FilterBar, {}), _jsx(FilterClear, {})] })] }));\n}\n//# sourceMappingURL=RunsFacetsNav.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { InteractionStatus } from '@vertesia/common';\nimport { Badge } from '@vertesia/ui/core';\nexport function VInteractionFacet({ buckets, name, placeholder }) {\n const options = buckets.map((bucket) => ({\n label: `(${bucket.count})`,\n value: bucket._id\n }));\n const filterGroup = {\n name: name,\n placeholder: placeholder || `${name.charAt(0).toUpperCase() + name.slice(1)}`,\n options: options,\n type: \"select\",\n labelRenderer: (interactionId) => {\n const bucket = buckets.find(b => b._id === interactionId);\n const displayName = bucket?.name || interactionId;\n // Determine badge variant based on status\n let badgeVariant = \"success\";\n if (bucket?.status) {\n switch (bucket.status) {\n case InteractionStatus.published:\n badgeVariant = \"success\";\n break;\n case InteractionStatus.archived:\n badgeVariant = \"destructive\";\n break;\n default:\n badgeVariant = \"attention\";\n break;\n }\n }\n const badgeText = bucket?.version && bucket?.status ?\n `v${bucket.version} ${bucket.status}` :\n bucket?.status || (bucket?.version ? `v${bucket.version}` : '');\n return (_jsxs(\"div\", { className: \"w-full flex items-center justify-between\", children: [_jsxs(\"div\", { className: \"flex flex-row flex-wrap items-center gap-2 min-w-0 flex-1\", children: [_jsx(\"span\", { className: \"text-sm truncate\", children: displayName }), badgeText && (_jsx(Badge, { variant: badgeVariant, className: \"text-xs w-fit\", children: badgeText }))] }), _jsxs(\"span\", { className: \"ml-2 text-xs shrink-0\", children: [\"(\", bucket?.count || 0, \")\"] })] }));\n },\n filterBy: (optionValue, searchText) => {\n const bucket = buckets.find(b => b._id === optionValue);\n const searchName = bucket?.name || optionValue;\n return searchName.toLowerCase().includes(searchText.toLowerCase());\n }\n };\n return filterGroup;\n}\n//# sourceMappingURL=VInteractionFacet.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nexport function VEnvironmentFacet({ buckets, name }) {\n const options = buckets.map((bucket) => ({\n label: `(${bucket.count})`,\n value: bucket._id\n }));\n const filterGroup = {\n name: name.charAt(0).toUpperCase() + name.slice(1),\n options: options,\n type: \"select\",\n labelRenderer: (environmentId) => {\n const bucket = buckets.find(b => b._id === environmentId);\n const displayName = bucket?.name || environmentId;\n return (_jsxs(\"div\", { className: \"w-full flex items-center\", children: [_jsx(\"span\", { className: \"text-sm truncate\", children: displayName }), _jsxs(\"span\", { className: \"ml-2 text-xs\", children: [\"(\", bucket?.count || 0, \")\"] })] }));\n },\n filterBy: (optionValue, searchText) => {\n const bucket = buckets.find(b => b._id === optionValue);\n const searchName = bucket?.name || optionValue;\n return searchName.toLowerCase().includes(searchText.toLowerCase());\n }\n };\n return filterGroup;\n}\n//# sourceMappingURL=VEnvironmentFacet.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { FilterProvider, FilterBtn, FilterBar, FilterClear } from '@vertesia/ui/core';\nimport { useState } from 'react';\nimport { VStringFacet } from './utils/VStringFacet';\nimport { VUserFacet } from './utils/VUserFacet';\n// Hook to create filter groups for workflow executions\nexport function useWorkflowExecutionsFilterGroups(facets) {\n const customFilterGroups = [];\n customFilterGroups.push({\n placeholder: 'Workflow or Run ID',\n name: 'name',\n type: 'text',\n options: [],\n });\n if (facets.status) {\n const statusFilterGroup = VStringFacet({\n search: null, // This will be provided by the search context\n buckets: facets.status || [],\n name: 'status',\n placeholder: 'Status'\n });\n customFilterGroups.push(statusFilterGroup);\n }\n if (facets.initiated_by) {\n const initiatedByFilterGroup = VUserFacet({\n buckets: facets.initiated_by || [],\n name: 'initiated_by',\n placeholder: 'Initiated By'\n });\n customFilterGroups.push(initiatedByFilterGroup);\n }\n const dateAfterFilterGroup = {\n name: 'start',\n placeholder: 'Date After',\n type: 'date',\n multiple: false\n };\n customFilterGroups.push(dateAfterFilterGroup);\n const dateBeforeFilterGroup = {\n name: 'end',\n placeholder: 'Date Before',\n type: 'date',\n multiple: false\n };\n customFilterGroups.push(dateBeforeFilterGroup);\n return customFilterGroups;\n}\n// Hook to create filter change handler for workflow executions\nexport function useWorkflowExecutionsFilterHandler(search) {\n return (newFilters) => {\n if (newFilters.length === 0) {\n search.clearFilters();\n return;\n }\n search.clearFilters(false);\n newFilters.forEach(filter => {\n if (filter.value && filter.value.length > 0) {\n const filterName = filter.name;\n let filterValue;\n if (filter.type === 'stringList') {\n filterValue = filter.value.map(v => typeof v === 'string' ? v : v.value);\n }\n else if (filter.multiple) {\n filterValue = Array.isArray(filter.value)\n ? filter.value.map((v) => typeof v === 'object' && v.value ? v.value : v)\n : [typeof filter.value === 'object' && filter.value.value ? filter.value.value : filter.value];\n }\n else {\n // Single value - don't wrap in array\n filterValue = Array.isArray(filter.value) && filter.value[0] && typeof filter.value[0] === 'object'\n ? filter.value[0].value\n : Array.isArray(filter.value) && filter.value[0]\n ? filter.value[0]\n : filter.value;\n }\n if (filterName === 'name') {\n search.query.search_term = filterValue;\n search.query.name = filterValue;\n }\n else {\n search.query[filterName] = filterValue;\n }\n }\n });\n search.search();\n };\n}\n// Legacy component for backward compatibility\nexport function WorkflowExecutionsFacetsNav({ facets, search, }) {\n const [filters, setFilters] = useState([]);\n const filterGroups = useWorkflowExecutionsFilterGroups(facets);\n const handleFilterLogic = useWorkflowExecutionsFilterHandler(search);\n const handleFilterChange = (value) => {\n const newFilters = typeof value === 'function' ? value(filters) : value;\n setFilters(newFilters);\n handleFilterLogic(newFilters);\n };\n return (_jsx(FilterProvider, { filterGroups: filterGroups, filters: filters, setFilters: handleFilterChange, children: _jsxs(\"div\", { className: \"flex gap-2 items-center\", children: [_jsx(FilterBtn, {}), _jsx(FilterBar, {}), _jsx(FilterClear, {})] }) }));\n}\n//# sourceMappingURL=WorkflowExecutionsFacetsNav.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { FilterProvider, FilterBtn, FilterBar, FilterClear } from '@vertesia/ui/core';\nimport { useUserSession } from '@vertesia/ui/session';\nimport { useState } from 'react';\nimport { VStringFacet } from './utils/VStringFacet';\nimport { VTypeFacet } from './utils/VTypeFacet';\n// Hook to create filter groups for documents\nexport function useDocumentFilterGroups(facets) {\n const { typeRegistry } = useUserSession();\n const customFilterGroups = [];\n customFilterGroups.push({\n placeholder: 'ID',\n name: 'id',\n type: 'text',\n options: [],\n });\n customFilterGroups.push({\n placeholder: 'Name',\n name: 'name',\n type: 'text',\n options: [],\n });\n if (facets.type) {\n const typeFilterGroup = VTypeFacet({\n buckets: facets.type || [],\n typeRegistry: typeRegistry,\n type: 'select',\n multiple: true\n });\n customFilterGroups.push(typeFilterGroup);\n }\n if (facets.status) {\n const statusFilterGroup = VStringFacet({\n search: null, // This will be provided by the search context\n buckets: facets.status || [],\n name: 'status',\n placeholder: 'Status',\n type: 'select',\n multiple: true\n });\n customFilterGroups.push(statusFilterGroup);\n }\n if (facets.tags) {\n customFilterGroups.push({\n name: 'tags',\n placeholder: 'Tags',\n type: 'stringList',\n options: facets.tags.map((tag) => ({\n label: tag,\n value: tag\n }))\n });\n }\n customFilterGroups.push({\n name: 'created_at',\n placeholder: 'Created Date',\n type: 'date',\n multiple: true,\n options: []\n });\n customFilterGroups.push({\n name: 'updated_at',\n placeholder: 'Updated Date',\n type: 'date',\n multiple: true,\n options: []\n });\n return customFilterGroups;\n}\n// Hook to create filter change handler for documents\nexport function useDocumentFilterHandler(search) {\n return (newFilters) => {\n if (newFilters.length === 0) {\n search.clearFilters();\n return;\n }\n search.clearFilters(false);\n newFilters.forEach(filter => {\n if (filter.value && filter.value.length > 0) {\n const filterName = filter.name;\n let filterValue;\n if (filter.type === 'date' && filter.multiple) {\n // Handle date range filters\n if (Array.isArray(filter.value) && filter.value.length > 0) {\n if (filter.value.length === 1) {\n // Single date - use as both start and end\n const dateValue = typeof filter.value[0] === 'object' ? filter.value[0].value : filter.value[0];\n filterValue = {\n gte: dateValue,\n lte: dateValue\n };\n }\n else if (filter.value.length === 2) {\n // Date range - start and end dates\n const startDate = typeof filter.value[0] === 'object' ? filter.value[0].value : filter.value[0];\n const endDate = typeof filter.value[1] === 'object' ? filter.value[1].value : filter.value[1];\n filterValue = {\n gte: startDate,\n lte: endDate\n };\n }\n }\n }\n else if (filter.multiple) {\n if (Array.isArray(filter.value)) {\n filterValue = filter.value.map((v) => typeof v === 'object' && v.value ? v.value : v);\n }\n else {\n const singleValue = typeof filter.value === 'object' && filter.value.value ? filter.value.value : filter.value;\n filterValue = [singleValue];\n }\n }\n else {\n // Single value - don't wrap in array\n filterValue = Array.isArray(filter.value) && filter.value[0] && typeof filter.value[0] === 'object'\n ? filter.value[0].value\n : Array.isArray(filter.value) && filter.value[0]\n ? filter.value[0]\n : filter.value;\n }\n if (filterName === 'name') {\n search.query.name = filterValue;\n }\n else if (filterName === 'id') {\n search.query.id = filterValue;\n }\n else {\n search.query[filterName] = filterValue;\n }\n }\n });\n search.search();\n };\n}\n// Legacy component for backward compatibility\nexport function DocumentsFacetsNav({ facets, search, }) {\n const [filters, setFilters] = useState([]);\n const filterGroups = useDocumentFilterGroups(facets);\n const handleFilterLogic = useDocumentFilterHandler(search);\n const handleFilterChange = (value) => {\n const newFilters = typeof value === 'function' ? value(filters) : value;\n setFilters(newFilters);\n handleFilterLogic(newFilters);\n };\n return (_jsx(FilterProvider, { filterGroups: filterGroups, filters: filters, setFilters: handleFilterChange, children: _jsxs(\"div\", { className: \"flex gap-2 items-center\", children: [_jsx(FilterBtn, {}), _jsx(FilterBar, {}), _jsx(FilterClear, {})] }) }));\n}\n//# sourceMappingURL=DocumentsFacetsNav.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { FilterProvider, FilterBtn, FilterBar, FilterClear } from '@vertesia/ui/core';\nimport { useState } from 'react';\n// Hook to create filter groups for interactions\nexport function useInteractionsFilterGroups(facets) {\n void facets;\n const customFilterGroups = [];\n // Add name filter as string type\n const nameFilterGroup = {\n name: 'name',\n placeholder: 'Name',\n type: 'text',\n multiple: false\n };\n customFilterGroups.push(nameFilterGroup);\n // Add prompt name filter as string type\n const promptNameFilterGroup = {\n name: 'prompt',\n placeholder: 'Prompt Name',\n type: 'text',\n multiple: false\n };\n customFilterGroups.push(promptNameFilterGroup);\n const ModelFilterGroup = {\n name: 'model',\n placeholder: 'Model',\n type: 'text',\n multiple: false\n };\n customFilterGroups.push(ModelFilterGroup);\n // Add tags filter as stringList type (allows custom input)\n const tagsFilterGroup = {\n name: 'tags',\n placeholder: 'Tags',\n type: 'stringList',\n multiple: true\n };\n customFilterGroups.push(tagsFilterGroup);\n return customFilterGroups;\n}\n// Hook to create filter change handler for interactions\nexport function useInteractionsFilterHandler(search) {\n return (newFilters) => {\n if (newFilters.length === 0) {\n search.clearFilters(true, true);\n return;\n }\n // Clear all filters first without defaults, then apply new ones\n search.clearFilters(false, false);\n newFilters.forEach(filter => {\n if (filter.value && filter.value.length > 0) {\n const filterName = filter.name;\n let filterValue;\n if (filter.type === 'stringList') {\n filterValue = filter.value.map(v => typeof v === 'string' ? v : v.value);\n }\n else if (filter.multiple) {\n filterValue = Array.isArray(filter.value)\n ? filter.value.map((v) => typeof v === 'object' && v.value ? v.value : v)\n : [typeof filter.value === 'object' && filter.value.value ? filter.value.value : filter.value];\n }\n else {\n // Single value - don't wrap in array\n filterValue = Array.isArray(filter.value) && filter.value[0] && typeof filter.value[0] === 'object'\n ? filter.value[0].value\n : Array.isArray(filter.value) && filter.value[0]\n ? filter.value[0]\n : filter.value;\n }\n search.query[filterName] = filterValue;\n }\n });\n search.search(true);\n };\n}\n// Component for interactions filtering\nexport function InteractionsFacetsNav({ facets, search }) {\n const [filters, setFilters] = useState([]);\n const filterGroups = useInteractionsFilterGroups(facets);\n const handleFilterLogic = useInteractionsFilterHandler(search);\n const handleFilterChange = (value) => {\n const newFilters = typeof value === 'function' ? value(filters) : value;\n setFilters(newFilters);\n handleFilterLogic(newFilters);\n };\n return (_jsx(FilterProvider, { filterGroups: filterGroups, filters: filters, setFilters: handleFilterChange, children: _jsxs(\"div\", { className: \"flex gap-2 items-center\", children: [_jsx(FilterBtn, {}), _jsx(FilterBar, {}), _jsx(FilterClear, {})] }) }));\n}\n//# sourceMappingURL=InteractionsFacetsNav.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { FilterProvider, FilterBtn, FilterBar, FilterClear } from '@vertesia/ui/core';\nimport { useState } from 'react';\n// Hook to create filter groups for prompts\nexport function usePromptsFilterGroups(facets) {\n void facets;\n const customFilterGroups = [];\n // Add name filter as text type\n const nameFilterGroup = {\n name: 'name',\n placeholder: 'Name',\n type: 'text',\n multiple: false\n };\n customFilterGroups.push(nameFilterGroup);\n // Add role filter as select type if role facets are available\n if (facets.role && facets.role.length > 0) {\n const rolesFilterGroup = {\n name: 'role',\n placeholder: 'Role',\n type: 'select',\n options: facets.role.map((facet) => ({\n label: facet._id,\n value: facet._id,\n count: facet.count\n })),\n };\n customFilterGroups.push(rolesFilterGroup);\n }\n return customFilterGroups;\n}\n// Hook to create filter change handler for prompts\nexport function usePromptsFilterHandler(search) {\n return (newFilters) => {\n if (newFilters.length === 0) {\n // Clear filters without applying defaults - user wants to remove all filters\n search.clearFilters(true, false);\n return;\n }\n // Clear all filters first without defaults, then apply new ones\n search.clearFilters(false, false);\n newFilters.forEach(filter => {\n if (filter.value && filter.value.length > 0) {\n const filterName = filter.name;\n let filterValue;\n if (filter.type === 'stringList') {\n filterValue = filter.value.map(v => typeof v === 'string' ? v : v.value);\n }\n else if (filter.multiple) {\n filterValue = Array.isArray(filter.value)\n ? filter.value.map((v) => typeof v === 'object' && v.value ? v.value : v)\n : [typeof filter.value === 'object' && filter.value.value ? filter.value.value : filter.value];\n }\n else {\n // Single value - don't wrap in array\n filterValue = Array.isArray(filter.value) && filter.value[0] && typeof filter.value[0] === 'object'\n ? filter.value[0].value\n : Array.isArray(filter.value) && filter.value[0]\n ? filter.value[0]\n : filter.value;\n }\n search.query[filterName] = filterValue;\n }\n });\n search.search();\n };\n}\n// Component for prompts filtering\nexport function PromptsFacetsNav({ facets, search }) {\n const [filters, setFilters] = useState([]);\n const filterGroups = usePromptsFilterGroups(facets);\n const handleFilterLogic = usePromptsFilterHandler(search);\n const handleFilterChange = (value) => {\n const newFilters = typeof value === 'function' ? value(filters) : value;\n setFilters(newFilters);\n handleFilterLogic(newFilters);\n };\n return (_jsx(FilterProvider, { filterGroups: filterGroups, filters: filters, setFilters: handleFilterChange, children: _jsxs(\"div\", { className: \"flex gap-2 items-center\", children: [_jsx(FilterBtn, {}), _jsx(FilterBar, {}), _jsx(FilterClear, {})] }) }));\n}\n//# sourceMappingURL=PromptsFacetsNav.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { FilterProvider, FilterBtn, FilterBar, FilterClear } from '@vertesia/ui/core';\nimport { useState } from 'react';\nimport { useUserSession } from '@vertesia/ui/session';\n// Hook to create filter groups for collections\nexport function useCollectionsFilterGroups(facets) {\n void facets;\n const { typeRegistry } = useUserSession();\n const customFilterGroups = [];\n // Add name filter as text type\n const nameFilterGroup = {\n name: 'name',\n placeholder: 'Name',\n type: 'text',\n multiple: false\n };\n customFilterGroups.push(nameFilterGroup);\n // add type filter as select type\n if (typeRegistry) {\n const typeOptions = typeRegistry.types.map(type => {\n return {\n label: type.name,\n value: type.id\n };\n });\n const typeFilterGroup = {\n name: 'types',\n placeholder: 'Type',\n type: 'select',\n multiple: true,\n options: typeOptions\n };\n customFilterGroups.push(typeFilterGroup);\n }\n return customFilterGroups;\n}\n// Hook to create filter change handler for collections\nexport function useCollectionsFilterHandler(search) {\n return (newFilters) => {\n if (newFilters.length === 0) {\n // Clear filters without applying defaults - user wants to remove all filters\n search.clearFilters(true);\n return;\n }\n // Clear all filters first, then apply new ones\n search.clearFilters(false);\n newFilters.forEach(filter => {\n if (filter.value && filter.value.length > 0) {\n const filterName = filter.name;\n let filterValue;\n if (filter.type === 'stringList') {\n filterValue = filter.value.map(v => typeof v === 'string' ? v : v.value);\n }\n else if (filter.multiple) {\n filterValue = Array.isArray(filter.value)\n ? filter.value.map((v) => typeof v === 'object' && v.value ? v.value : v)\n : [typeof filter.value === 'object' && filter.value.value ? filter.value.value : filter.value];\n }\n else {\n // Single value - don't wrap in array\n filterValue = Array.isArray(filter.value) && filter.value[0] && typeof filter.value[0] === 'object'\n ? filter.value[0].value\n : Array.isArray(filter.value) && filter.value[0]\n ? filter.value[0]\n : filter.value;\n }\n search.query[filterName] = filterValue;\n }\n });\n search.search();\n };\n}\n// Component for collections filtering\nexport function CollectionsFacetsNav({ facets, search }) {\n const [filters, setFilters] = useState([]);\n const filterGroups = useCollectionsFilterGroups(facets);\n const handleFilterLogic = useCollectionsFilterHandler(search);\n const handleFilterChange = (value) => {\n const newFilters = typeof value === 'function' ? value(filters) : value;\n setFilters(newFilters);\n handleFilterLogic(newFilters);\n };\n return (_jsx(FilterProvider, { filterGroups: filterGroups, filters: filters, setFilters: handleFilterChange, children: _jsxs(\"div\", { className: \"flex gap-2 items-center\", children: [_jsx(FilterBtn, {}), _jsx(FilterBar, {}), _jsx(FilterClear, {})] }) }));\n}\n//# sourceMappingURL=CollectionsFacetsNav.js.map","import { jsx as _jsx } from \"react/jsx-runtime\";\nimport { createContext, useContext, useEffect, useState } from \"react\";\nexport class DocumentSelection {\n object;\n objects;\n setState;\n /**\n * The collection id to which the selected objects belong to.\n */\n collectionId;\n singleSelection = false;\n constructor(object, collectionId, objects, setState) {\n this.object = object;\n this.objects = objects;\n this.setState = setState;\n this.singleSelection = Object.keys(this.objects).length === 0;\n this.collectionId = collectionId;\n }\n isSingleSelection() {\n return this.singleSelection;\n }\n hasSelection() {\n return this.object !== undefined || this.size() !== 0;\n }\n size() {\n return Object.keys(this.objects).length;\n }\n getObjectIds() {\n return Object.keys(this.objects);\n }\n getObjectId() {\n return this.object?.id;\n }\n clone() {\n return new DocumentSelection(this.object, this.collectionId, this.objects, this.setState);\n }\n add(object) {\n this.objects[object.id] = object;\n this.singleSelection = Object.keys(this.objects).length === 0;\n this.setState(this.clone());\n }\n remove(objectId) {\n delete this.objects[objectId];\n this.singleSelection = Object.keys(this.objects).length === 0;\n this.setState(this.clone());\n }\n addAll(objects) {\n for (const obj of objects) {\n this.objects[obj.id] = obj;\n }\n this.setState(this.clone());\n }\n isSelected(objectId) {\n return this.objects[objectId] !== undefined;\n }\n removeAll() {\n this.objects = {};\n this.singleSelection = true;\n this.setState(this.clone());\n }\n}\nconst DocumentSelectionContext = createContext(undefined);\nexport function useDocumentSelection() {\n const selection = useContext(DocumentSelectionContext);\n if (!selection) {\n throw new Error(\"useObjectSelection must be used within a ObjectSelectionProvider\");\n }\n return selection;\n}\nexport function useOptionalDocumentSelection() {\n return useContext(DocumentSelectionContext);\n}\nexport function DocumentSelectionProvider({ value, collectionId, children }) {\n const [selection, setSelection] = useState();\n useEffect(() => {\n const selection = new DocumentSelection(value, collectionId, {}, setSelection);\n setSelection(selection);\n }, [value]);\n return selection && (_jsx(DocumentSelectionContext.Provider, { value: selection, children: children }));\n}\n//# sourceMappingURL=DocumentSelectionProvider.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport dayjs from \"dayjs\";\nimport LocalizedFormat from \"dayjs/plugin/localizedFormat\";\nimport RelativeTime from \"dayjs/plugin/relativeTime\";\nimport { shortId } from \"../../../utils\";\nimport { Eye } from \"lucide-react\";\nimport { Button } from \"@vertesia/ui/core\";\ndayjs.extend(RelativeTime);\ndayjs.extend(LocalizedFormat);\nconst renderers = {\n string(params, _onClick) {\n let transforms = [];\n if (params) {\n const slice = params.get(\"slice\");\n if (slice) {\n transforms.push((value) => value.slice(parseInt(slice)));\n }\n const max_length = params.get(\"max_length\");\n if (max_length) {\n transforms.push((value) => value.slice(0, parseInt(max_length)));\n }\n if (params.has(\"upper\")) {\n transforms.push((value) => value.toUpperCase());\n }\n if (params.has(\"lower\")) {\n transforms.push((value) => value.toLowerCase());\n }\n if (params.has(\"capitalize\")) {\n transforms.push((value) => value[0].toUpperCase() + value.substring(1));\n }\n if (params.has(\"ellipsis\")) {\n transforms.push((value) => value + \"...\");\n }\n }\n return (value, index) => {\n let v;\n if (value) {\n v = String(value);\n if (transforms.length > 0) {\n for (const t of transforms) {\n v = t(v);\n }\n }\n }\n else {\n v = \"\";\n }\n return _jsx(\"td\", { children: v }, index);\n };\n },\n fileSize(_params, _onClick) {\n return (value, index) => {\n let fileSize = \"\";\n if (value) {\n const bytes = Number(value);\n if (!isNaN(bytes)) {\n const sizes = [\"Bytes\", \"KB\", \"MB\", \"GB\", \"TB\"];\n if (bytes === 0) {\n fileSize = \"0 Bytes\";\n }\n else {\n const i = Math.floor(Math.log(bytes) / Math.log(1024));\n fileSize = `${(bytes / Math.pow(1024, i)).toFixed(2)} ${sizes[i]}`;\n }\n }\n else {\n fileSize = String(value);\n }\n }\n return _jsx(\"td\", { children: fileSize }, index);\n };\n },\n number(params, _onClick) {\n let currency;\n let decimals;\n if (params) {\n currency = params.get(\"currency\") || undefined;\n decimals = params.get(\"decimals\") || undefined;\n }\n const digits = decimals ? parseInt(decimals) : 2;\n return (value, index) => {\n let v = new Intl.NumberFormat(\"en-US\", {\n style: currency ? \"currency\" : \"decimal\",\n currency,\n maximumFractionDigits: digits,\n }).format(value);\n return _jsx(\"td\", { children: v }, index);\n };\n },\n objectId(params, onClick) {\n let transforms = [];\n let hasSlice = false;\n if (params) {\n const slice = params.get(\"slice\");\n if (slice) {\n hasSlice = true;\n transforms.push((value) => value.slice(parseInt(slice)));\n }\n }\n return (value, index) => {\n const displayValue = transforms.reduce((v, t) => t(v), value.id);\n return (_jsxs(\"td\", { className: \"flex justify-between items-center gap-2\", children: [hasSlice ? '~' : '', displayValue, _jsx(Button, { variant: \"ghost\", alt: \"Preview Object\", onClick: (e) => {\n e.stopPropagation();\n onClick?.(value.id);\n }, children: _jsx(Eye, { className: \"size-4\" }) })] }, index));\n };\n },\n objectName(params, _onClick) {\n let title = \"title\";\n if (params) {\n title = params.get(\"title\") || \"title\";\n }\n return (value, index) => {\n return (_jsx(\"td\", { children: value.properties?.[title] || value.name || shortId(value.id) }, index));\n };\n },\n typeLink(_params, _onClick) {\n return (value, index) => {\n return _jsx(\"td\", { children: value?.name || \"n/a\" }, index);\n };\n },\n date(params, _onClick) {\n let method = \"format\";\n let arg = \"LLL\";\n if (params) {\n const localized = params.get(\"localized\");\n if (localized) {\n arg = localized;\n }\n else {\n const relative = params.get(\"relative\");\n if (relative) {\n method = relative; // fromNow or toNow\n arg = undefined;\n }\n }\n }\n return (value, index) => {\n return _jsx(\"td\", { children: dayjs(value)[method](arg) }, index);\n };\n },\n};\nexport default renderers;\n//# sourceMappingURL=renderers.js.map","import { jsx as _jsx } from \"react/jsx-runtime\";\nimport renderers from './renderers';\nconst defaultRenderer = renderers.string();\nfunction resolveField(object, path) {\n let p = object;\n if (!p)\n return undefined;\n if (!path.length)\n return p;\n const last = path.length - 1;\n for (let i = 0; i < last; i++) {\n p = p[path[i]];\n if (!p) {\n return undefined;\n }\n }\n return p[path[last]];\n}\nfunction splitPath(path) {\n if (!path || path === '.') {\n return [];\n }\n return path.split('.');\n}\nexport class DocumentTableColumn {\n layout;\n renderer = defaultRenderer;\n path;\n fallbackPath;\n previewObject;\n constructor(layout, previewObject) {\n this.layout = layout;\n this.path = splitPath(layout.field || '');\n this.fallbackPath = layout.fallback ? splitPath(layout.fallback) : undefined;\n this.previewObject = previewObject;\n // If there's a custom render function, use it\n if (layout.render) {\n this.renderer = (_value, _index) => null; // Placeholder, we'll use render directly\n }\n else {\n // Otherwise use the type-based renderer\n const type = layout.type || 'string';\n const i = type.indexOf('?');\n if (i > 0) {\n const name = type.substring(0, i);\n const params = new URLSearchParams(type.substring(i + 1));\n this.renderer = renderers[name](params);\n }\n else {\n this.renderer = renderers[type]();\n }\n }\n }\n get name() {\n return this.layout.name;\n }\n resolveValue(object) {\n let value = resolveField(object, this.path);\n if (value === undefined && this.fallbackPath) {\n value = resolveField(object, this.fallbackPath);\n }\n if (value === undefined) {\n value = this.layout.default;\n }\n return value;\n }\n render(object, index) {\n // If there's a custom render function, wrap its result in a td\n if (this.layout.render) {\n return _jsx(\"td\", { className: \"whitespace-nowrap px-3 py-4 text-sm\", children: this.layout.render(object) }, index);\n }\n const type = this.layout.type || 'string';\n const baseType = type.indexOf('?') > 0 ? type.substring(0, type.indexOf('?')) : type;\n if (baseType === 'objectId' && this.previewObject) {\n const i = type.indexOf('?');\n const params = i > 0 ? new URLSearchParams(type.substring(i + 1)) : undefined;\n const objectIdRenderer = renderers.objectId(params, (_id) => {\n this.previewObject(object.id);\n });\n return objectIdRenderer(object, index);\n }\n // Otherwise use the type-based renderer with the resolved value\n return this.renderer(this.resolveValue(object), index);\n }\n}\n//# sourceMappingURL=DocumentTableColumn.js.map","import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from \"react/jsx-runtime\";\nimport { Table, TBody } from \"@vertesia/ui/core\";\nimport { DocumentIcon, DocumentIconSkeleton } from \"../components/DocumentIcon\";\nexport function DocumentTableView({ objects, selection, isLoading, columns, onRowClick, selectedObject, toggleAll, onSelectionChange }) {\n return (_jsxs(Table, { className: \"w-full border-t\", children: [_jsx(\"thead\", { children: _jsxs(\"tr\", { children: [selection && _jsx(\"th\", { children: _jsx(\"input\", { type: \"checkbox\", onChange: toggleAll }) }), columns.map((col) => (_jsx(\"th\", { children: col.name }, col.name)))] }) }), _jsxs(TBody, { isLoading: isLoading, columns: columns.length + 1, children: [objects?.map((obj) => {\n return (_jsxs(\"tr\", { className: `cursor-pointer hover:bg-muted group ${selectedObject?.id === obj.id ? 'bg-muted' : ''}`, onClick: () => {\n onRowClick && onRowClick(obj);\n }, children: [selection &&\n _jsx(\"td\", { onClick: ev => ev.stopPropagation(), children: _jsx(\"input\", { checked: selection.isSelected(obj.id), type: \"checkbox\", className: `${!selection.isSelected(obj.id) ? 'hidden group-hover:block' : ''}`, onChange: (ev) => onSelectionChange(obj, ev) }) }), columns.map((col, index) => col.render(obj, index))] }, obj.id));\n }), objects.length === 0 && _jsx(\"tr\", { children: _jsx(\"td\", { colSpan: columns.length + (selection ? 1 : 0), className: \"text-center\", children: \"No objects. Just drag and drop documents or images here to create content objects.\" }) })] })] }));\n}\nexport function DocumentGridView({ objects, selection, isLoading, onSelectionChange, onRowClick, previewObject, selectedObject }) {\n return (_jsxs(_Fragment, { children: [_jsx(DocumentIconSkeleton, { isLoading: isLoading }), _jsx(\"div\", { className: \"w-full gap-2 grid lg:grid-cols-6\", children: objects.map((document) => (_jsx(DocumentIcon, { document: document, selection: selection, onSelectionChange: onSelectionChange, onRowClick: onRowClick, previewObject: previewObject, selectedObject: selectedObject }, document.id))) })] }));\n}\n//# sourceMappingURL=documentLayout.js.map","import { createContext, useContext } from 'react';\nimport { SharedState, useWatchSharedState } from '@vertesia/ui/core';\nexport class DocumentSearch {\n client;\n limit;\n collectionId;\n facets = new SharedState({});\n result = new SharedState({ objects: [], isLoading: false });\n facetSpecs = [];\n query = {};\n constructor(client, limit = 100) {\n this.client = client;\n this.limit = limit;\n }\n withFacets(facets) {\n this.facetSpecs = facets;\n return this;\n }\n get objects() {\n return this.result.value.objects;\n }\n get error() {\n return this.result.value.error;\n }\n get isRunning() {\n return this.result.value.isLoading;\n }\n get hasMore() {\n return this.result.value.hasMore || false;\n }\n getFilterValue(name) {\n return this.query[name];\n }\n setFilterValue(name, value) {\n this.query[name] = value;\n // search now\n this.search();\n }\n setDefaultKeys(keys) {\n void keys;\n }\n clearFilters(autoSearch = true) {\n // Preserve search-related fields when clearing filters\n const { parent, full_text, vector, weights, score_aggregation, dynamic_scaling, limit, all_revisions } = this.query;\n this.query = {\n parent,\n ...(full_text !== undefined && { full_text }),\n ...(vector !== undefined && { vector }),\n ...(weights !== undefined && { weights }),\n ...(score_aggregation !== undefined && { score_aggregation }),\n ...(dynamic_scaling !== undefined && { dynamic_scaling }),\n ...(all_revisions !== undefined && { all_revisions }),\n ...(limit !== undefined && { limit })\n };\n if (autoSearch) {\n this.search();\n }\n }\n getFacetBuckets(name) {\n return this.facets.value[name]?.buckets || [];\n }\n resetFacets() {\n this.query = {};\n }\n reset(isLoading = false) {\n this.result.value = {\n objects: [],\n isLoading,\n hasMore: true\n };\n }\n _updateRunningState(value) {\n const prev = this.result.value;\n this.result.value = {\n objects: prev.objects,\n isLoading: value,\n error: prev.error,\n hasMore: prev.hasMore\n };\n }\n _searchRequest(query, limit, offset, includeFacets = true) {\n const payload = {\n limit,\n offset,\n query,\n facets: includeFacets ? this.facetSpecs : undefined\n };\n const request = this.collectionId ?\n this.client.collections.searchMembers(this.collectionId, payload)\n : this.client.objects.search(payload);\n return request;\n }\n _facetsRequest() {\n const payload = { facets: this.facetSpecs, query: this.query };\n return this.collectionId ?\n this.client.collections.computeFacets(this.collectionId, payload)\n : this.client.objects.computeFacets(payload);\n }\n computeFacets(_query) {\n this._facetsRequest().then((facets) => {\n this.facets.value = facets;\n });\n }\n _search(loadMore = false, noFacets = false) {\n if (this.isRunning && loadMore) { // avoid searching when a search is pending, but allow initial search\n return Promise.resolve(false);\n }\n this.result.value = {\n isLoading: true,\n objects: loadMore ? this.objects : [],\n hasMore: loadMore ? this.result.value.hasMore : true\n };\n const limit = this.limit;\n const offset = loadMore ? this.objects.length : 0;\n return this._searchRequest(this.query, limit, offset, !noFacets).then(async (res) => {\n // Handle the new format with results and facets\n const results = res.results || [];\n const facets = res.facets || {};\n this.result.value = {\n isLoading: false,\n objects: loadMore ? this.objects.concat(results) : results,\n hasMore: results.length === limit\n };\n // Update facets if they were requested and returned\n if (!noFacets && facets && Object.keys(facets).length > 0) {\n this.facets.value = facets;\n }\n return true;\n }).catch((err) => {\n this.result.value = {\n error: err,\n isLoading: false,\n objects: this.objects,\n hasMore: this.result.value.hasMore\n };\n throw err;\n });\n }\n search(noFacets = false) {\n // Allow initial search even if isLoading is true (for initial page load)\n if (this.isRunning && this.objects.length > 0) {\n return Promise.resolve(false);\n }\n return this._search(false, noFacets);\n }\n loadMore(noFacets = false) {\n if (this.isRunning || !this.hasMore)\n return Promise.resolve(false);\n if (this.query.vector)\n return Promise.resolve(false); //Load more not supported on vector queries\n if (this.objects.length > 0) {\n noFacets = true; //Only reload facets on loadMore if there are no results.\n }\n return this._search(true, noFacets);\n }\n}\nconst DocumentSearchContext = createContext(undefined);\nexport function useDocumentSearch() {\n return useContext(DocumentSearchContext);\n}\nexport function useWatchDocumentSearchFacets() {\n return useWatchSharedState(useDocumentSearch().facets);\n}\nexport function useWatchDocumentSearchResult() {\n const search = useDocumentSearch();\n const result = useWatchSharedState(search.result);\n return { ...result, search };\n}\nexport function useDocumentSearchCount() {\n const search = useDocumentSearch();\n const result = useWatchSharedState(search.facets);\n return result.total;\n}\nexport { DocumentSearchContext as SearchContext };\n//# sourceMappingURL=DocumentSearchContext.js.map","import { useToast } from \"@vertesia/ui/core\";\nimport { useUserSession } from \"@vertesia/ui/session\";\nimport { Md5 } from \"ts-md5\";\n/**\n * Types of actions that can be taken with a file\n */\nexport var FileUploadAction;\n(function (FileUploadAction) {\n FileUploadAction[\"CREATE\"] = \"create\";\n FileUploadAction[\"SKIP\"] = \"skip\";\n FileUploadAction[\"UPDATE\"] = \"update\";\n})(FileUploadAction || (FileUploadAction = {}));\n/**\n * Calculates the MD5 hash of a file\n * @param file The file to hash\n * @returns Promise with the MD5 hash of the file\n */\nasync function calculateFileHash(file) {\n try {\n const arrayBuffer = await file.arrayBuffer();\n const md5 = new Md5();\n md5.appendByteArray(new Uint8Array(arrayBuffer));\n const hash = md5.end();\n return hash?.toString();\n }\n catch (error) {\n console.error(\"Error calculating file hash:\", error);\n return undefined;\n }\n}\n/**\n * Prepares files by calculating their hashes and metadata\n * @param files Array of files to process\n * @param selectedFolder Optional folder location for the files\n * @returns Promise with array of files with their metadata\n */\nasync function prepareFilesWithMetadata(files, selectedFolder) {\n const filesWithMetadata = [];\n // Process files in batches to avoid overwhelming the browser\n const batchSize = 5;\n for (let i = 0; i < files.length; i += batchSize) {\n const batch = files.slice(i, i + batchSize);\n // Process this batch in parallel\n const metadataResults = await Promise.all(batch.map(async (file) => {\n // Determine the location for this file\n let location = selectedFolder || undefined;\n // If file has relative path, use it to determine location\n const hasRelativePath = !!file.webkitRelativePath;\n if (hasRelativePath) {\n const relativePath = file.webkitRelativePath;\n const pathParts = relativePath.split(\"/\");\n if (pathParts.length > 1) {\n // Extract folder path (everything except the filename)\n const folderPath = pathParts.slice(0, -1).join(\"/\");\n // Combine with selected folder if any\n location = selectedFolder ? `${selectedFolder}/${folderPath}` : folderPath;\n }\n }\n // Calculate hash for content comparison\n const hash = await calculateFileHash(file);\n return {\n file,\n hash,\n name: file.name,\n size: file.size,\n location,\n };\n }));\n filesWithMetadata.push(...metadataResults);\n }\n return filesWithMetadata;\n}\n/**\n * Hook to check if documents need to be created, updated, or skipped\n * @param collectionId Optional collection ID to check within\n * @returns Object with functions to process documents\n */\nexport function useSmartFileUploadProcessing() {\n const { client } = useUserSession();\n const toast = useToast();\n /**\n * Check files to determine if they need to be created, updated, or skipped\n * @param files Array of files to check\n * @param selectedFolder Optional folder location\n * @param collectionId limit the check to a collection\n * @returns Promise with information about actions to take for each file\n */\n const prepareFilesForUpload = async (files, selectedFolder, limitToCollectionId) => {\n try {\n // First, prepare all the files with their metadata\n console.log(`Preparing metadata for ${files.length} files...`);\n const filesWithMetadata = await prepareFilesWithMetadata(files, selectedFolder);\n const identifyExistingHash = async () => {\n const query = {\n \"content.etag\": { $in: filesWithMetadata.map((file) => file.hash) },\n };\n let res;\n const payload = { query: { match: query }, select: undefined };\n if (limitToCollectionId) {\n res = (await client.store.collections.searchMembers(limitToCollectionId, payload)).results;\n }\n else {\n res = (await client.store.objects.search(payload)).results;\n }\n for (const doc of res) {\n const file = filesWithMetadata.find((f) => f.hash === doc.content.etag);\n if (file) {\n file.existingId = doc.id;\n file.action = FileUploadAction.SKIP;\n }\n }\n };\n /**\n * Find what file are present based on location and name\n */\n const identifyExistingIds = async () => {\n const unskippedFiles = filesWithMetadata.filter((file) => file.action !== FileUploadAction.SKIP);\n const allLocations = unskippedFiles.map((file) => file.location);\n const uniqueLocations = Array.from(new Set(allLocations));\n const queries = [];\n for (const location of uniqueLocations) {\n const namesInLocation = unskippedFiles\n .filter((file) => file.location === location)\n .map((file) => file.name);\n const query = {\n location: location ?? \"\",\n \"content.name\": { $in: namesInLocation },\n };\n if (limitToCollectionId) {\n const res = client.store.collections.searchMembers(limitToCollectionId, {\n query: {\n match: query,\n },\n select: undefined,\n }).then((response) => response.results);\n queries.push(res);\n }\n else {\n const res = client.store.objects.find({\n query: {\n match: query,\n },\n select: undefined,\n });\n queries.push(res);\n }\n }\n const results = (await Promise.all(queries)).flat();\n console.log(`Found ${results.length} document to update`, results);\n //update fileWithMetadata\n for (const doc of results) {\n const file = filesWithMetadata.find(\n //name must be the same, and location must the same if present and if not, must be empty string\n (f) => f.name === doc.content.name &&\n (f.location ? f.location === doc.location : doc.location === \"\"));\n if (file) {\n file.existingId = doc.id;\n file.action = FileUploadAction.UPDATE;\n }\n }\n console.log(`Reconciled ${filesWithMetadata.filter((f) => f.action === FileUploadAction.UPDATE).length}`);\n };\n await identifyExistingHash();\n await identifyExistingIds();\n //set create flag on remaining files\n filesWithMetadata.forEach((f) => {\n if (!f.action) {\n f.action = FileUploadAction.CREATE;\n }\n });\n // Log the results\n console.log(\"Document processing check results:\", {\n totalFiles: files.length,\n toCreate: filesWithMetadata.filter((f) => f.action === FileUploadAction.CREATE).length,\n toUpdate: filesWithMetadata.filter((f) => f.action === FileUploadAction.UPDATE).length,\n toSkip: filesWithMetadata.filter((f) => f.action === FileUploadAction.SKIP).length,\n });\n return filesWithMetadata;\n }\n catch (error) {\n toast({\n title: \"Error in file upload processing check\",\n status: \"error\",\n description: error.message,\n });\n console.log(\"Error in file upload processing check\", error);\n throw new Error(\"Error in file upload processing check: \" + error.message);\n }\n };\n return {\n checkDocumentProcessing: prepareFilesForUpload,\n };\n}\n//# sourceMappingURL=useSmartFileUploadProcessing.js.map","import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from \"react/jsx-runtime\";\nimport { Button, MessageBox, VModal, VModalBody, VModalFooter, VModalTitle, VSelectBox, Spinner, useToast, VTooltip } from \"@vertesia/ui/core\";\nimport { useUserSession } from \"@vertesia/ui/session\";\nimport { DropZone, UploadSummary } from '@vertesia/ui/widgets';\nimport { AlertCircleIcon, CheckCircleIcon, FileIcon, FolderIcon, Info, UploadIcon, XCircleIcon } from \"lucide-react\";\nimport { useEffect, useMemo, useState } from \"react\";\nimport { FileUploadAction, useSmartFileUploadProcessing } from \"./useSmartFileUploadProcessing\";\n/**\n * Unified upload modal that handles the complete upload process:\n * 1. File selection (if no files provided)\n * 2. Smart file processing to detect duplicates\n * 3. Type selection\n * 4. Upload with progress tracking\n * 5. Result display\n */\nexport function DocumentUploadModal({ isOpen, onClose, files: initialFiles, collectionId, selectedFolder, title = \"Upload Files\", children, onUploadComplete, hideFileSelection = false, showTypeSelectionOnly = false, }) {\n const { client, typeRegistry } = useUserSession();\n const toast = useToast();\n const [files, setFiles] = useState([]);\n const [processedFiles, setProcessedFiles] = useState([]);\n const [processingDone, setProcessingDone] = useState(false);\n const [selectedType, setSelectedType] = useState(null);\n const [fileStatuses, setFileStatuses] = useState([]);\n const [isUploading, setIsUploading] = useState(false);\n const [uploadComplete, setUploadComplete] = useState(false);\n const [overallProgress, setOverallProgress] = useState(0);\n const [modalKey, setModalKey] = useState(Date.now());\n const [collectionData, setCollectionData] = useState(undefined);\n const [result, setResult] = useState(null);\n const [_title, setTitle] = useState(title);\n const [_description, setDescription] = useState(\"\");\n // Fetch collection details if a collectionId is provided\n useEffect(() => {\n if (!collectionId)\n return;\n client.store.collections.retrieve(collectionId).then(setCollectionData);\n }, [collectionId]);\n // Update title and description based on current state\n useEffect(() => {\n if (isUploading) {\n setTitle(\"Uploading Files\");\n setDescription(`${Math.round(overallProgress)}% complete`);\n }\n else if (uploadComplete) {\n setTitle(\"Upload Complete\");\n setDescription(\"\");\n }\n else if (processingDone) {\n setTitle(\"File Analysis Results\");\n setDescription(`${files.length} file${files.length !== 1 ? \"s\" : \"\"}`);\n }\n else if (files.length > 0) {\n setTitle(title);\n setDescription(\"Checking for duplicates and updates\");\n }\n else {\n setTitle(title);\n setDescription(\"\");\n }\n }, [isUploading, uploadComplete, processingDone, title, overallProgress, files.length]);\n // Helper function to render collection and folder information\n const renderLocationInfo = () => {\n if (!collectionData && !selectedFolder)\n return null;\n return (_jsxs(MessageBox, { className: \"mb-4\", status: \"default\", icon: _jsx(FolderIcon, { className: \"size-5\" }), children: [_jsx(\"div\", { className: \"flex items-center\", children: _jsx(\"span\", { className: \"font-medium\", children: \"Upload Location:\" }) }), _jsxs(\"div\", { className: \"text-sm mt-1\", children: [collectionData && (_jsxs(\"div\", { className: \"flex items-center\", children: [_jsx(\"span\", { className: \"mr-1\", children: \"Collection:\" }), _jsx(\"span\", { className: \"font-medium\", children: collectionData.name })] })), selectedFolder && (_jsxs(\"div\", { className: \"flex items-center mt-1\", children: [_jsx(\"span\", { className: \"mr-1\", children: \"Folder:\" }), _jsx(\"span\", { className: \"font-medium\", children: selectedFolder })] }))] })] }));\n };\n // Statistics for upload processing\n const [processingStats, setProcessingStats] = useState({ toCreate: 0, toUpdate: 0, toSkip: 0 });\n // Get the smart file processing utility\n const { checkDocumentProcessing } = useSmartFileUploadProcessing();\n // Get available types from the registry\n const types = useMemo(() => {\n return typeRegistry?.types || [];\n }, [typeRegistry?.types]);\n // Reset state when modal opens/closes\n useEffect(() => {\n if (isOpen) {\n // Always reset state first\n setProcessedFiles([]);\n setProcessingDone(false);\n setSelectedType(null);\n setFileStatuses([]);\n setIsUploading(false);\n setUploadComplete(false);\n setOverallProgress(0);\n setProcessingStats({ toCreate: 0, toUpdate: 0, toSkip: 0 });\n setResult(null);\n setTitle(title);\n setDescription(\"\");\n // Set initial files if provided\n if (initialFiles && initialFiles.length > 0) {\n setFiles(initialFiles);\n processFiles(initialFiles);\n }\n else {\n setFiles([]);\n }\n // Create a new key to ensure the modal is fresh\n setModalKey(Date.now());\n }\n }, [isOpen, initialFiles]);\n // Complete cleanup when modal closes\n const handleClose = () => {\n // Reset all state to initial values to prevent memory leaks\n setFiles([]);\n setProcessedFiles([]);\n setProcessingDone(false);\n setSelectedType(null);\n setFileStatuses([]);\n setIsUploading(false);\n setUploadComplete(false);\n setOverallProgress(0);\n setProcessingStats({ toCreate: 0, toUpdate: 0, toSkip: 0 });\n setResult(null);\n setTitle(title);\n setDescription(\"\");\n setModalKey(Date.now());\n // Call the provided onClose function\n onClose();\n };\n // Handle file drop/selection\n const handleFileSelect = (newFiles) => {\n if (newFiles && newFiles.length > 0) {\n setFiles(newFiles);\n processFiles(newFiles);\n }\n };\n // Process files to determine create/update/skip status\n const processFiles = async (filesToProcess) => {\n if (!filesToProcess.length)\n return;\n try {\n console.log(`Processing ${filesToProcess.length} files to determine required actions...`);\n // Get the document processing results\n const processed = await checkDocumentProcessing(filesToProcess, selectedFolder, collectionId);\n setProcessedFiles(processed);\n // Count files by action\n const toCreate = processed.filter((f) => f.action === FileUploadAction.CREATE).length;\n const toUpdate = processed.filter((f) => f.action === FileUploadAction.UPDATE).length;\n const toSkip = processed.filter((f) => f.action === FileUploadAction.SKIP).length;\n // Update stats for UI feedback\n setProcessingStats({\n toCreate,\n toUpdate,\n toSkip,\n });\n // Show processing results to user\n toast({\n title: \"Files analyzed\",\n description: `${filesToProcess.length} file(s): ${toCreate} new, ${toUpdate} to update, ${toSkip} to skip`,\n status: \"info\",\n duration: 4000,\n });\n // Set processing as complete\n setProcessingDone(true);\n }\n catch (error) {\n console.error(\"Error processing files:\", error);\n toast({\n title: \"Error\",\n description: \"There was an error analyzing the files\",\n status: \"error\",\n duration: 5000,\n });\n }\n };\n // Handle type selection and start the upload\n const handleUpload = async () => {\n if (!processedFiles.length)\n return;\n const typeId = selectedType?.id || null;\n // Initialize file statuses\n const initialStatuses = processedFiles.map((fileInfo) => ({\n file: fileInfo.file,\n status: \"pending\",\n progress: 0,\n action: fileInfo.action === FileUploadAction.CREATE\n ? \"create\"\n : fileInfo.action === FileUploadAction.UPDATE\n ? \"update\"\n : \"skip\",\n }));\n setFileStatuses(initialStatuses);\n setIsUploading(true);\n setUploadComplete(false);\n // Process files in batches\n const filesToSkip = processedFiles.filter((f) => f.action === FileUploadAction.SKIP);\n const filesToUpdate = processedFiles.filter((f) => f.action === FileUploadAction.UPDATE);\n const filesToCreate = processedFiles.filter((f) => f.action === FileUploadAction.CREATE);\n const result = {\n success: true,\n objectIds: [],\n uploadedFiles: [],\n skippedFiles: [],\n failedFiles: [],\n };\n // Process SKIP files\n for (const fileInfo of filesToSkip) {\n if (fileInfo.existingId) {\n result.objectIds.push(fileInfo.existingId);\n result.skippedFiles.push({\n id: fileInfo.existingId,\n name: fileInfo.name,\n type: typeId,\n status: \"skipped\",\n location: fileInfo.location,\n });\n // Update the file status\n setFileStatuses((current) => current.map((status) => status.file === fileInfo.file\n ? { ...status, status: \"success\", progress: 100, id: fileInfo.existingId }\n : status));\n }\n }\n // Process files in batches of 50\n const BATCH_SIZE = 50;\n const PROGRESS_UPDATE_INTERVAL = 5; // Update progress every 5 files\n // Helper function to process a batch of files\n const processBatch = async (files, action) => {\n const batches = [];\n for (let i = 0; i < files.length; i += BATCH_SIZE) {\n batches.push(files.slice(i, i + BATCH_SIZE));\n }\n for (let batchIndex = 0; batchIndex < batches.length; batchIndex++) {\n const batch = batches[batchIndex];\n console.log(`Processing ${action} batch ${batchIndex + 1}/${batches.length} (${batch.length} files)`);\n // Show progress for larger file sets\n if (files.length > BATCH_SIZE) {\n const processedCount = batchIndex * BATCH_SIZE;\n toast({\n title: `Processing files (${action})`,\n description: `Processed ${processedCount}/${files.length} files...`,\n status: \"info\",\n duration: 2000,\n });\n }\n // Process the batch with progress tracking\n let filesProcessedInBatch = 0;\n await Promise.all(batch.map(async (fileInfo) => {\n try {\n // Update status to uploading\n setFileStatuses((current) => current.map((status) => status.file === fileInfo.file\n ? { ...status, status: \"uploading\", progress: 20 }\n : status));\n if (action === \"update\" && fileInfo.existingId) {\n // Update existing file\n await client.store.objects.update(fileInfo.existingId, {\n type: typeId || undefined,\n content: fileInfo.file,\n location: fileInfo.location,\n name: fileInfo.name,\n }, {\n createRevision: true,\n revisionLabel: \"upload on \" + new Date().toISOString(),\n });\n // Update status to success\n setFileStatuses((current) => current.map((status) => status.file === fileInfo.file\n ? { ...status, status: \"success\", progress: 100, id: fileInfo.existingId }\n : status));\n // Add to result\n result.objectIds.push(fileInfo.existingId);\n result.uploadedFiles.push({\n id: fileInfo.existingId,\n name: fileInfo.name,\n type: typeId,\n status: \"updated\",\n location: fileInfo.location,\n });\n }\n else {\n // Create new file\n const createResult = await client.store.objects.create({\n type: typeId || undefined,\n content: fileInfo.file,\n location: fileInfo.location || fileInfo.file.webkitRelativePath || fileInfo.name,\n }, {\n collection_id: collectionId,\n });\n // Update status to success\n setFileStatuses((current) => current.map((status) => status.file === fileInfo.file\n ? { ...status, status: \"success\", progress: 100, id: createResult.id }\n : status));\n // Add to result\n result.objectIds.push(createResult.id);\n result.uploadedFiles.push({\n id: createResult.id,\n name: fileInfo.name,\n type: typeId,\n status: \"created\",\n location: fileInfo.location,\n });\n }\n }\n catch (error) {\n console.error(`Failed to process file ${fileInfo.name}:`, error);\n // Update status to error\n setFileStatuses((current) => current.map((status) => status.file === fileInfo.file\n ? {\n ...status,\n status: \"error\",\n progress: 100,\n message: error.message || \"Unknown error\",\n }\n : status));\n // Add to failed result\n result.failedFiles.push({\n name: fileInfo.name,\n error: error.message || \"Unknown error\",\n status: \"failed\",\n location: fileInfo.location,\n type: typeId,\n });\n // Mark the overall success as false if any file fails\n result.success = false;\n }\n // Update progress every PROGRESS_UPDATE_INTERVAL files\n filesProcessedInBatch++;\n if (filesProcessedInBatch % PROGRESS_UPDATE_INTERVAL === 0 || filesProcessedInBatch === batch.length) {\n setFileStatuses((currentStatuses) => {\n const completedFiles = currentStatuses.filter((f) => f.status === \"success\" || f.status === \"error\").length;\n const totalFiles = currentStatuses.length;\n const progress = totalFiles > 0 ? Math.round((completedFiles / totalFiles) * 100) : 0;\n setOverallProgress(progress);\n return currentStatuses;\n });\n }\n }));\n }\n };\n // Process UPDATE files first, then CREATE files\n if (filesToUpdate.length > 0) {\n await processBatch(filesToUpdate, \"update\");\n }\n if (filesToCreate.length > 0) {\n await processBatch(filesToCreate, \"create\");\n }\n // Finalize the upload\n // Ensure all files are accounted for before completing\n setFileStatuses((current) => {\n // Check for any pending files that might have been missed\n const missingStatuses = current\n .filter((status) => status.status === \"pending\")\n .map((status) => ({\n ...status,\n status: \"error\",\n progress: 100,\n message: \"Upload process interrupted\",\n }));\n if (missingStatuses.length > 0) {\n // Add missing files to the failed files list\n missingStatuses.forEach((status) => {\n result.failedFiles.push({\n name: status.file.name,\n error: \"Upload process interrupted\",\n status: \"failed\",\n type: selectedType?.id || null,\n });\n });\n // Update the success flag if any files failed\n result.success = false;\n // Return updated statuses\n return current.map((status) => status.status === \"pending\"\n ? {\n ...status,\n status: \"error\",\n progress: 100,\n message: \"Upload process interrupted\",\n }\n : status);\n }\n return current;\n });\n setIsUploading(false);\n setUploadComplete(true);\n // Show summary toast\n const createdCount = result.uploadedFiles.filter((f) => f.status === \"created\").length;\n const updatedCount = result.uploadedFiles.filter((f) => f.status === \"updated\").length;\n const skippedCount = result.skippedFiles.length;\n const failedCount = result.failedFiles.length;\n let statusMessage = \"\";\n if (createdCount > 0)\n statusMessage += `${createdCount} file${createdCount !== 1 ? \"s\" : \"\"} uploaded`;\n if (updatedCount > 0) {\n statusMessage += statusMessage ? \", \" : \"\";\n statusMessage += `${updatedCount} file${updatedCount !== 1 ? \"s\" : \"\"} updated`;\n }\n if (skippedCount > 0) {\n statusMessage += statusMessage ? \", \" : \"\";\n statusMessage += `${skippedCount} file${skippedCount !== 1 ? \"s\" : \"\"} skipped`;\n }\n if (failedCount > 0) {\n statusMessage += statusMessage ? \", \" : \"\";\n statusMessage += `${failedCount} file${failedCount !== 1 ? \"s\" : \"\"} failed`;\n }\n toast({\n title: \"Upload Complete\",\n description: statusMessage,\n status: failedCount > 0 ? \"warning\" : \"success\",\n duration: 5000,\n });\n setResult(result);\n };\n const typeSelection = () => {\n return (_jsxs(\"div\", { className: \"mb-4\", children: [_jsxs(\"label\", { className: \"block text-sm font-medium mb-2\", children: [\"Content Type \", _jsx(\"span\", { className: \"text-muted font-normal\", children: \"(Optional)\" }), _jsx(VTooltip, { description: \"Select a content type to apply to the uploaded files. If left empty, Vertesia will automatically detect the type based on file content.\", placement: \"top\", size: \"xs\", children: _jsx(Info, { className: \"size-3 ml-2\" }) })] }), _jsx(VSelectBox, { options: types, value: selectedType, optionLabel: (type) => (type ? type.name : \"Select a content type\"), placeholder: \"Select a content type or leave empty for automatic detection\", onChange: (selected) => setSelectedType(selected === undefined ? null : selected), filterBy: \"name\", isClearable: true }), selectedType ? (_jsx(_Fragment, {})) : (_jsx(\"div\", { className: \"p-2 rounded-md\", children: _jsxs(\"div\", { className: \"flex items-center text-attention\", children: [_jsx(CheckCircleIcon, { className: \"size-4 mr-1\" }), \"Automatic Type Detection\", _jsx(VTooltip, { description: \"Vertesia will analyze the content and select the most appropriate type. This is recommended for most uploads and ensures optimal processing.\", placement: \"top\", size: \"xs\", children: _jsx(Info, { className: \"size-3 ml-2\" }) })] }) }))] }));\n };\n // Determine what content to show based on the current state\n const renderModalContent = () => {\n // When showing only type selection, skip directly to the type selection UI\n if (showTypeSelectionOnly) {\n return (_jsxs(VModalBody, { children: [children, renderLocationInfo(), typeSelection()] }));\n }\n // Step 1: File selection #todo: update styles\n if (files.length === 0 && !hideFileSelection) {\n return (_jsxs(VModalBody, { className: \"flex flex-col items-center justify-center p-8\", children: [renderLocationInfo(), _jsx(DropZone, { onDrop: handleFileSelect, message: \"Drag and drop files here or click to select\", buttonLabel: \"Select Files\", className: \"w-full h-64\" }), children] }));\n }\n // Step 2: File processing and type selection\n if (!isUploading && !uploadComplete) {\n return (_jsx(VModalBody, { children: !processingDone ? (\n // File processing in progress\n _jsxs(\"div\", { className: \"flex flex-col items-center justify-center py-4\", children: [_jsx(Spinner, { size: \"lg\", className: \"mb-4\" }), _jsx(\"div\", { className: \"text-lg font-medium\", children: \"Analyzing files...\" })] })) : (\n // Processing complete, show type selection\n _jsxs(_Fragment, { children: [renderLocationInfo(), _jsx(\"div\", { className: \"mb-4\", children: _jsx(\"div\", { className: \"p-4 rounded-md mb-4\", children: _jsxs(\"div\", { className: \"grid grid-cols-3 gap-4\", children: [_jsxs(\"div\", { className: \"flex flex-col items-center\", children: [_jsxs(\"div\", { className: \"flex items-center gap-2\", children: [_jsx(UploadIcon, { className: \"size-5 text-primary\" }), _jsx(\"span\", { className: \"font-medium\", children: \"New\" })] }), _jsx(\"div\", { className: \"text-2xl font-semibold\", children: processingStats.toCreate })] }), _jsxs(\"div\", { className: \"flex flex-col items-center\", children: [_jsxs(\"div\", { className: \"flex items-center gap-2\", children: [_jsx(CheckCircleIcon, { className: \"size-5 text-success\" }), _jsx(\"span\", { className: \"font-medium\", children: \"Update\" })] }), _jsx(\"div\", { className: \"text-2xl font-semibold\", children: processingStats.toUpdate })] }), _jsxs(\"div\", { className: \"flex flex-col items-center\", children: [_jsxs(\"div\", { className: \"flex items-center gap-2\", children: [_jsx(AlertCircleIcon, { className: \"size-5 text-mixer-attention/40\" }), _jsx(\"span\", { className: \"font-medium\", children: \"Skip\" })] }), _jsx(\"div\", { className: \"text-2xl font-semibold\", children: processingStats.toSkip })] })] }) }) }), typeSelection(), _jsx(MessageBox, { className: \"mb-4\", status: \"info\", children: processingStats.toCreate + processingStats.toUpdate > 0 ? (_jsxs(\"div\", { className: \"space-y-1\", children: [_jsxs(\"p\", { children: [processingStats.toCreate + processingStats.toUpdate, \" file\", processingStats.toCreate + processingStats.toUpdate > 1 ? \"s are\" : \" is\", \" ready to process\"] }), _jsx(\"p\", { children: processingStats.toSkip > 0 &&\n `${processingStats.toSkip} file${processingStats.toSkip > 1 ? \"s are\" : \" is\"} already in the system and will be skipped.` })] })) : processingStats.toSkip > 0 ? (_jsxs(\"span\", { children: [\"All \", processingStats.toSkip, \" file(s) already exist in the system and will be skipped. You can proceed to view the results.\"] })) : (_jsx(\"span\", { children: \"No files to process.\" })) })] })) }));\n }\n // Step 3: Upload in progress #todo: update styles\n if (isUploading) {\n return (_jsxs(VModalBody, { children: [renderLocationInfo(), _jsx(\"div\", { className: \"mb-4\", children: _jsx(\"div\", { className: \"h-2 bg-muted/20 rounded-full overflow-hidden\", children: _jsx(\"div\", { className: \"h-full bg-primary rounded-full\", style: { width: `${overallProgress}%` } }) }) }), _jsx(\"div\", { className: \"max-h-96 overflow-y-auto\", children: fileStatuses.map((fileStatus, index) => (_jsxs(\"div\", { className: \"flex items-center py-2 border-b border-border last:border-b-0\", children: [_jsxs(\"div\", { className: \"mr-3\", children: [fileStatus.status === \"pending\" && (_jsx(FileIcon, { className: \"size-5 text-muted\" })), fileStatus.status === \"uploading\" && _jsx(Spinner, { size: \"sm\" }), fileStatus.status === \"success\" && (_jsx(CheckCircleIcon, { className: \"size-5 text-success\" })), fileStatus.status === \"error\" && _jsx(XCircleIcon, { className: \"size-5 text-destructive\" })] }), _jsxs(\"div\", { className: \"flex-1 min-w-0\", children: [_jsx(\"div\", { className: \"truncate font-medium\", children: fileStatus.file.name }), _jsxs(\"div\", { className: \"text-xs text-muted\", children: [fileStatus.status === \"pending\" && \"Waiting...\", fileStatus.status === \"uploading\" && \"Uploading...\", fileStatus.status === \"success\" &&\n (fileStatus.action === \"create\"\n ? \"Created\"\n : fileStatus.action === \"update\"\n ? \"Updated\"\n : \"Skipped\"), fileStatus.status === \"error\" && fileStatus.message] })] })] }, `${fileStatus.file.name}-${index}`))) })] }));\n }\n // Step 4: Upload complete, show results\n return (_jsx(VModalBody, { children: _jsxs(\"div\", { className: \"mb-4\", children: [renderLocationInfo(), _jsx(UploadSummary, { files: fileStatuses.map((f) => {\n // Map fileStatus to the expected ProcessedFile format\n let status;\n if (f.status === \"success\") {\n if (f.action === \"create\") {\n status = \"success\";\n }\n else if (f.action === \"update\") {\n status = \"updated\";\n }\n else {\n status = \"skipped\";\n }\n }\n else {\n status = \"failed\";\n }\n return {\n name: f.file.name,\n status,\n error: f.status === \"error\" ? f.message : undefined,\n };\n }), location: selectedFolder || undefined, collection: collectionData?.name })] }) }));\n };\n const renderModalFooter = () => {\n // Type-selection-only mode\n if (showTypeSelectionOnly) {\n return (_jsxs(VModalFooter, { children: [_jsx(Button, { variant: \"ghost\", onClick: handleClose, children: \"Cancel\" }), _jsx(Button, { onClick: () => {\n // Create minimal result with the selected type (or null)\n const result = {\n success: true,\n objectIds: [],\n uploadedFiles: [\n {\n name: \"type-selection\",\n type: selectedType?.id || null,\n status: \"created\",\n },\n ],\n skippedFiles: [],\n failedFiles: [],\n };\n if (onUploadComplete) {\n onUploadComplete(result);\n }\n handleClose();\n }, children: selectedType ? `Use ${selectedType.name}` : \"Use Automatic Type Detection\" })] }));\n }\n // File selection step - only show cancel\n if (files.length === 0 && !hideFileSelection) {\n return (_jsx(VModalFooter, { children: _jsx(Button, { variant: \"ghost\", onClick: handleClose, children: \"Cancel\" }) }));\n }\n // Processing and type selection step\n if (!isUploading && !uploadComplete) {\n // Allow upload even without a type (Vertesia will choose one)\n const canUpload = processingDone;\n return (_jsxs(VModalFooter, { children: [_jsx(Button, { variant: \"ghost\", onClick: handleClose, children: \"Cancel\" }), _jsx(Button, { disabled: !canUpload, onClick: handleUpload, children: processingStats.toCreate + processingStats.toUpdate > 0\n ? \"Upload\"\n : \"Continue\" })] }));\n }\n // Upload in progress - can't cancel\n if (isUploading) {\n return (_jsx(VModalFooter, { children: _jsx(Button, { variant: \"ghost\", disabled: true, children: \"Uploading...\" }) }));\n }\n // Upload complete - close or upload more\n return (_jsxs(VModalFooter, { children: [_jsx(Button, { variant: \"ghost\", onClick: () => {\n // Reset state and start over\n setFiles([]);\n setProcessedFiles([]);\n setProcessingDone(false);\n setSelectedType(null);\n setFileStatuses([]);\n setIsUploading(false);\n setUploadComplete(false);\n setOverallProgress(0);\n setProcessingStats({ toCreate: 0, toUpdate: 0, toSkip: 0 });\n }, children: \"Upload More\" }), _jsx(Button, { onClick: () => {\n if (onUploadComplete && result) {\n onUploadComplete(result);\n }\n handleClose();\n }, children: \"Close\" })] }));\n };\n return (_jsxs(VModal, { isOpen: isOpen, onClose: handleClose, className: \"mx-auto\", disableCloseOnClickOutside: true, children: [_jsx(VModalTitle, { description: _description, children: _title }), renderModalContent(), renderModalFooter()] }, modalKey));\n}\n//# sourceMappingURL=DocumentUploadModal.js.map","import { useToast } from \"@vertesia/ui/core\";\nimport { useUserSession } from \"@vertesia/ui/session\";\nimport { useDocumentSearch } from \"../search/DocumentSearchContext\";\nimport { FileUploadAction, useSmartFileUploadProcessing } from \"./useSmartFileUploadProcessing\";\n/**\n * Hook for handling file uploads to the store\n *\n * @param options Configuration options for the upload handler\n * @returns Upload handler function that takes files and type, and returns upload results\n */\nexport function useDocumentUploadHandler(options) {\n // Handle both object and legacy function format for backward compatibility\n const onUploadDone = typeof options === \"function\" ? options : options.onUploadDone;\n const { client, project: projectRef, store } = useUserSession();\n const search = useDocumentSearch();\n const toast = useToast();\n const { checkDocumentProcessing } = useSmartFileUploadProcessing();\n return async (files, type, collectionId) => {\n // Initialize result object\n const result = {\n success: false,\n objectIds: [],\n uploadedFiles: [],\n skippedFiles: [],\n failedFiles: [],\n };\n if (!projectRef) {\n toast({\n status: \"error\",\n title: \"No project selected\",\n duration: 3000,\n });\n return result;\n }\n if (!files || files.length === 0) {\n toast({\n status: \"warning\",\n title: \"No files selected\",\n duration: 3000,\n });\n return result;\n }\n const filesToUpload = Array.from(files).filter((file) => file.size > 0);\n if (filesToUpload.length === 0) {\n toast({\n status: \"error\",\n title: \"No valid files selected\",\n description: \"Please select files with valid content.\",\n duration: 5000,\n });\n return result;\n }\n const skippedFilesInfo = [];\n const uploadedFilesInfo = [];\n const failedFilesInfo = [];\n console.log(`Processing ${filesToUpload.length} files with smart file processing...`);\n // Determine if what need to be updated\n const filesWithMetadata = await checkDocumentProcessing(filesToUpload, null, collectionId);\n // Create statistics for user feedback\n const toCreate = filesWithMetadata.filter((f) => f.action === FileUploadAction.CREATE).length;\n const toUpdate = filesWithMetadata.filter((f) => f.action === FileUploadAction.UPDATE).length;\n const toSkip = filesWithMetadata.filter((f) => f.action === FileUploadAction.SKIP).length;\n // Show user feedback about processed files\n toast({\n title: \"Files analyzed\",\n description: `${filesToUpload.length} file(s): ${toCreate} new, ${toUpdate} to update, ${toSkip} to skip`,\n status: \"info\",\n duration: 4000,\n });\n // Process SKIP files - add them to skipped list and result IDs\n for (const fileInfo of filesWithMetadata.filter((f) => f.action === FileUploadAction.SKIP && f.existingId)) {\n skippedFilesInfo.push({\n id: fileInfo.existingId,\n name: fileInfo.name,\n type,\n status: \"skipped\",\n location: fileInfo.location,\n });\n }\n // Collect files for processing (both CREATE and UPDATE)\n const filesToProcess = filesWithMetadata.filter((f) => (f.action === FileUploadAction.CREATE || f.action === FileUploadAction.UPDATE) && f.file);\n if (filesToProcess.length > 0) {\n console.log(`Processing ${filesToProcess.length} files (${filesToProcess.filter((f) => f.action === FileUploadAction.CREATE).length} create, ${filesToProcess.filter((f) => f.action === FileUploadAction.UPDATE).length} update)...`);\n // Create batches of 50 files\n const batchSize = 50;\n const processBatches = [];\n for (let i = 0; i < filesToProcess.length; i += batchSize) {\n processBatches.push(filesToProcess.slice(i, i + batchSize));\n }\n // Process each batch\n for (let batchIndex = 0; batchIndex < processBatches.length; batchIndex++) {\n const batch = processBatches[batchIndex];\n const processedCount = batchIndex * batchSize;\n console.log(`Processing batch ${batchIndex + 1}/${processBatches.length} (${batch.length} files)`);\n // Show progress for larger file sets\n if (filesToProcess.length > batchSize) {\n toast({\n title: \"Processing files\",\n description: `Processed ${processedCount}/${filesToProcess.length} files...`,\n status: \"info\",\n duration: 2000,\n });\n }\n // Process this batch in parallel\n const processResults = await Promise.all(batch.map(async (fileInfo) => {\n try {\n if (fileInfo.action === FileUploadAction.UPDATE && fileInfo.existingId) {\n // UPDATE - Update the existing object\n const updateResult = await client.store.objects.update(fileInfo.existingId, {\n type: type || undefined,\n content: fileInfo.file,\n location: fileInfo.location,\n name: fileInfo.name,\n }, {\n createRevision: true,\n revisionLabel: \"upload on \" + new Date().toISOString(),\n });\n // Use a separate data structure for updated files\n uploadedFilesInfo.push({\n id: fileInfo.existingId,\n name: fileInfo.name,\n type,\n status: \"updated\",\n location: fileInfo.location,\n });\n // Add to result IDs\n result.objectIds.push(fileInfo.existingId);\n return {\n success: true,\n id: updateResult.id,\n name: fileInfo.name,\n action: \"update\",\n };\n }\n else {\n // CREATE - Create a new object\n // If collectionId is provided, pass it as an option\n const options = collectionId ? { collection_id: collectionId } : undefined;\n const createResult = await store.objects.create({\n type: type || undefined,\n content: fileInfo.file,\n location: fileInfo.location || fileInfo.file.webkitRelativePath || fileInfo.name,\n }, options);\n // Track successful upload\n uploadedFilesInfo.push({\n id: createResult.id,\n name: fileInfo.name,\n type,\n status: \"created\",\n location: fileInfo.location,\n });\n }\n }\n catch (error) {\n console.error(`Failed to process file ${fileInfo.name}:`, error);\n // Track failed upload\n failedFilesInfo.push({\n name: fileInfo.name,\n error: error.message || \"Unknown error\",\n status: \"failed\",\n location: fileInfo.location,\n type,\n });\n toast({\n status: \"error\",\n title: `Processing failed for ${fileInfo.name}`,\n description: error.message,\n duration: 4000,\n });\n }\n }));\n // Log batch results\n const creates = uploadedFilesInfo.filter((f) => f.status === \"created\");\n const updates = uploadedFilesInfo.filter((f) => f.status === \"updated\");\n const failures = uploadedFilesInfo.filter((f) => f.status === \"failed\");\n console.log(`Batch ${batchIndex + 1} results:`, {\n creates,\n updates,\n failures,\n total: processResults.length,\n });\n }\n }\n const uploadedCount = uploadedFilesInfo.filter((f) => f.status === \"created\").length;\n const updatedCount = uploadedFilesInfo.filter((f) => f.status === \"updated\").length;\n const failedCount = uploadedFilesInfo.filter((f) => f.status === \"failed\").length;\n const skippedCount = uploadedFilesInfo.filter((f) => f.status === \"skipped\").length;\n // Call the original callback with all object IDs and additional metadata\n if (onUploadDone) {\n // Log the actual upload count for debugging\n console.log(\"Upload complete:\", {\n totalObjectIds: result.objectIds.length,\n uploadedFiles: uploadedCount,\n updatedFiles: updatedCount,\n skippedFiles: skippedCount,\n failedFiles: failedCount,\n });\n // Call the callback with all object IDs\n await onUploadDone(result.objectIds);\n }\n // Create a success message that includes information about all file operations\n let statusMessage = \"\";\n if (uploadedCount > 0) {\n statusMessage += `${uploadedCount} file${uploadedCount !== 1 ? \"s\" : \"\"} uploaded`;\n }\n if (updatedCount > 0) {\n statusMessage += statusMessage ? \", \" : \"\";\n statusMessage += `${updatedCount} file${updatedCount !== 1 ? \"s\" : \"\"} updated`;\n }\n if (skippedCount > 0) {\n statusMessage += statusMessage ? \", \" : \"\";\n statusMessage += `${skippedCount} file${skippedCount !== 1 ? \"s\" : \"\"} skipped (already existed)`;\n }\n if (failedCount > 0) {\n statusMessage += statusMessage ? \", \" : \"\";\n statusMessage += `${failedCount} file${failedCount !== 1 ? \"s\" : \"\"} failed`;\n }\n if (statusMessage) {\n toast({\n status: failedCount > 0 ? \"warning\" : \"success\",\n title: statusMessage,\n duration: 4000,\n });\n }\n // Refresh search results\n search.search();\n return result;\n };\n}\n//# sourceMappingURL=useUploadHandler.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { Spinner, useToast } from \"@vertesia/ui/core\";\nimport { DropZone } from '@vertesia/ui/widgets';\nimport clsx from \"clsx\";\nimport { useMemo, useState } from \"react\";\nimport { useOptionalDocumentSelection } from \"./DocumentSelectionProvider\";\nimport { DocumentTableColumn } from \"./layout/DocumentTableColumn\";\nimport { DocumentGridView, DocumentTableView } from \"./layout/documentLayout\";\nimport { useDocumentSearch } from \"./search/DocumentSearchContext\";\nimport { DocumentUploadModal, useSmartFileUploadProcessing } from \"./upload\";\nconst defaultLayout = [\n { name: \"ID\", field: \"id\", type: \"objectId?slice=-7\" },\n { name: \"Name\", field: \".\", type: \"objectName\" },\n { name: \"Type\", field: \"type.name\", type: \"string\" },\n { name: \"Status\", field: \"status\", type: \"string\" },\n { name: \"Updated At\", field: \"updated_at\", type: \"date\" },\n];\nexport function DocumentTable({ isGridView = false, onUpload, collectionId, ...others }) {\n if (onUpload) {\n return (_jsx(ObjectTableWithDropZone, { ...others, onUpload: onUpload, isGridView: isGridView, collectionId: collectionId }));\n }\n else {\n return _jsx(DocumentTableImpl, { ...others, isGridView: isGridView });\n }\n}\nfunction ObjectTableWithDropZone({ isGridView, onUpload, collectionId, skipTypeModal = false, ...others }) {\n const [isLoading, setLoading] = useState(false);\n const [files, setFiles] = useState([]);\n const [isDragging, setIsDragging] = useState(false);\n const [processedFiles, setProcessedFiles] = useState(null);\n const [typeSelectionOpen, setTypeSelectionOpen] = useState(false);\n const search = useDocumentSearch();\n const toast = useToast();\n const { checkDocumentProcessing } = useSmartFileUploadProcessing();\n // Handle file uploads when a file is dropped\n const handleFileDrop = async (droppedFiles, feedback) => {\n console.log(\"Files dropped on ObjectTable:\", droppedFiles.length, feedback);\n setLoading(true);\n try {\n // Always process files with the smart upload processing if we have a collection ID\n if (collectionId) {\n // Process files to check for duplicates, updates, etc.\n const processed = await checkDocumentProcessing(droppedFiles, null, collectionId);\n setProcessedFiles(processed);\n // Create a user-friendly summary message\n const toCreate = processed.filter((f) => f.action === \"create\").length;\n const toUpdate = processed.filter((f) => f.action === \"update\").length;\n const toSkip = processed.filter((f) => f.action === \"skip\").length;\n toast({\n title: \"Files ready to process\",\n description: `${droppedFiles.length} file(s): ${toCreate} new, ${toUpdate} to update, ${toSkip} to skip`,\n status: \"info\",\n duration: 4000,\n });\n }\n else {\n // If no collection ID, we can't check for duplicates\n setProcessedFiles(null);\n }\n }\n catch (error) {\n console.error(\"Error processing files:\", error);\n toast({\n title: \"Error processing files\",\n description: \"There was an error checking for duplicate files\",\n status: \"error\",\n duration: 4000,\n });\n // Continue with plain upload in case of error\n setProcessedFiles(null);\n }\n finally {\n setLoading(false);\n setFiles(droppedFiles);\n setIsDragging(false);\n if (skipTypeModal) {\n // If skipTypeModal is true, we skip our internal modal and call onUpload directly\n console.log(\"Skipping type modal and calling onUpload directly\", {\n filesLength: droppedFiles.length,\n processedFilesLength: processedFiles?.length,\n });\n // Pass processed files as a custom property and collectionId as the third parameter\n const uploadPromise = onUpload(droppedFiles, null, collectionId);\n // Attach the processed files to the promise for parent components to use\n if (uploadPromise && typeof uploadPromise === \"object\") {\n uploadPromise.processedFiles = processedFiles;\n }\n }\n else {\n // Otherwise, open our type selection modal\n console.log(\"Setting typeSelectionOpen to true\", { filesLength: droppedFiles.length });\n setTypeSelectionOpen(true);\n }\n }\n };\n // Handle the type selection and start the upload\n const onDoUpload = (typeId) => {\n const filesToUpload = [...files]; // Make a copy to be safe\n // Reset state variables\n setFiles([]);\n setProcessedFiles(null);\n setTypeSelectionOpen(false);\n // If typeid is undefined we cancel the upload\n if (filesToUpload.length > 0 && typeId !== undefined) {\n setLoading(true);\n console.log(\"Starting upload with\", {\n typeId,\n filesCount: filesToUpload.length,\n hasProcessingResults: !!processedFiles,\n collectionId,\n });\n onUpload(filesToUpload, typeId, collectionId).finally(() => {\n setLoading(false);\n search.search(); // Refresh the search results after upload\n });\n }\n };\n // Handle drag events to show the drop zone\n const handleDragOver = (e) => {\n e.preventDefault();\n e.stopPropagation();\n setIsDragging(true);\n };\n const handleDragLeave = (e) => {\n e.preventDefault();\n e.stopPropagation();\n // Only set dragging to false if leaving the container (not entering a child)\n if (e.currentTarget.contains(e.relatedTarget)) {\n return;\n }\n setIsDragging(false);\n };\n return (_jsxs(\"div\", { className: \"min-h-[400px] relative\", onDragOver: handleDragOver, onDragEnter: handleDragOver, onDragLeave: handleDragLeave, onDrop: (e) => {\n e.preventDefault();\n e.stopPropagation();\n setIsDragging(false);\n // Get the files from the drop event\n if (e.dataTransfer.items) {\n const files = [];\n for (let i = 0; i < e.dataTransfer.items.length; i++) {\n const item = e.dataTransfer.items[i];\n if (item.kind === \"file\") {\n const file = item.getAsFile();\n if (file)\n files.push(file);\n }\n }\n if (files.length > 0) {\n const feedback = {\n count: files.length,\n message: `Preparing to upload ${files.length} file${files.length === 1 ? \"\" : \"s\"}...`,\n };\n handleFileDrop(files, feedback);\n }\n }\n }, children: [_jsx(\"div\", { className: clsx(\"bg-white dark:bg-gray-800 opacity-40 absolute inset-0 z-50 flex justify-center items-center\", isLoading ? \"block\" : \"hidden\"), children: _jsx(Spinner, { size: \"xl\" }) }), _jsx(DocumentTableImpl, { ...others, isGridView: isGridView }), _jsx(\"div\", { className: clsx(\"absolute inset-0 pointer-events-none\", isDragging ? \"z-40\" : \"-z-10\"), children: _jsx(\"div\", { className: \"w-full h-full relative\", children: _jsx(DropZone, { onDrop: handleFileDrop, message: \"Drop files or folders here to upload\", className: clsx(\"absolute inset-0 bg-white/90 dark:bg-gray-800/90 pointer-events-auto\", isDragging ? \"flex\" : \"hidden\"), buttonLabel: \"Select Files or Folders\", allowFolders: true }) }) }), _jsx(DocumentUploadModal, { isOpen: typeSelectionOpen && files.length > 0, onClose: () => {\n // Reset state variables and close the modal\n setFiles([]);\n setProcessedFiles(null);\n setTypeSelectionOpen(false);\n onDoUpload(undefined);\n }, files: files, collectionId: collectionId, selectedFolder: null, title: \"Upload Files\", onUploadComplete: (result) => {\n // Handle upload completion\n if (result) {\n // If there are failures, show them\n if (result.failedFiles && result.failedFiles.length > 0) {\n toast({\n title: \"Upload Issues\",\n description: `${result.failedFiles.length} file(s) failed to upload`,\n status: \"warning\",\n duration: 5000,\n });\n }\n // On success, summarize the results\n if (result.success) {\n const created = result.uploadedFiles.filter((f) => f.status === \"created\").length;\n const updated = result.uploadedFiles.filter((f) => f.status === \"updated\").length;\n const skipped = result.skippedFiles.length;\n if (created > 0 || updated > 0) {\n toast({\n title: \"Upload Complete\",\n description: `${created > 0 ? `${created} created` : \"\"}${created > 0 && updated > 0 ? \", \" : \"\"}${updated > 0 ? `${updated} updated` : \"\"}${skipped > 0 ? `, ${skipped} skipped` : \"\"}`,\n status: \"success\",\n duration: 5000,\n });\n }\n }\n // Force search refresh\n search.search();\n }\n // Close modal and reset state without passing result\n setFiles([]);\n setProcessedFiles(null);\n setTypeSelectionOpen(false);\n // Complete the upload process with type ID if successful\n if (result && result.success && result.objectIds.length > 0) {\n // We don't have type information here, so pass null (process completed)\n onDoUpload(null);\n }\n else {\n // Cancel the upload\n onDoUpload(undefined);\n }\n } })] }));\n}\nfunction DocumentTableImpl({ objects, layout = defaultLayout, isLoading, onRowClick, onSelectionChange, previewObject, selectedObject, isGridView, }) {\n const selection = useOptionalDocumentSelection();\n const _onSelectionChange = (object, ev) => {\n if (selection) {\n const isShift = ev.nativeEvent.shiftKey;\n const checked = ev.target.checked;\n if (!checked) {\n selection.remove(object.id);\n }\n else {\n selection.add(object);\n if (isShift) {\n const index = objects.findIndex((obj) => obj.id === object.id);\n const prev = findPreviousSelected(objects, index, selection);\n if (prev > -1 && prev < index - 1) {\n const toSelect = [];\n for (let i = prev + 1; i < index; i++) {\n toSelect.push(objects[i]);\n }\n selection.addAll(toSelect);\n }\n else {\n const next = findNextSelected(objects, index, selection);\n if (next > -1 && next > index + 1) {\n const toSelect = [];\n for (let i = index + 1; i < next; i++) {\n toSelect.push(objects[i]);\n }\n selection.addAll(toSelect);\n }\n }\n }\n }\n onSelectionChange && onSelectionChange(selection);\n }\n };\n const toggleAll = (ev) => {\n if (selection) {\n const checked = ev.target.checked;\n if (!checked) {\n // remove all\n selection.removeAll();\n }\n else {\n selection.addAll(objects);\n }\n }\n };\n const columns = useMemo(() => {\n // avoid rendering empty layouts\n const actualLayout = layout.length > 0 ? layout : defaultLayout;\n return actualLayout.map((col) => new DocumentTableColumn(col, previewObject));\n }, [layout, previewObject]);\n return isGridView ? (_jsx(DocumentGridView, { objects: objects, isLoading: isLoading, columns: columns, onRowClick: onRowClick, previewObject: previewObject, selectedObject: selectedObject, selection: selection, toggleAll: toggleAll, onSelectionChange: _onSelectionChange })) : (_jsx(DocumentTableView, { objects: objects, isLoading: isLoading, columns: columns, onRowClick: onRowClick, previewObject: previewObject, selectedObject: selectedObject, selection: selection, toggleAll: toggleAll, onSelectionChange: _onSelectionChange }));\n}\nfunction findPreviousSelected(objects, index, selection) {\n for (let i = index - 1; i >= 0; i--) {\n if (selection.isSelected(objects[i].id)) {\n return i;\n }\n }\n return -1;\n}\nfunction findNextSelected(objects, index, selection) {\n const length = objects.length;\n for (let i = index + 1; i < length; i++) {\n if (selection.isSelected(objects[i].id)) {\n return i;\n }\n }\n return -1;\n}\n//# sourceMappingURL=DocumentTable.js.map","import { jsx as _jsx } from \"react/jsx-runtime\";\nimport { useUserSession } from \"@vertesia/ui/session\";\nimport { useMemo } from \"react\";\nimport { DocumentSearch, SearchContext } from \"./DocumentSearchContext\";\nexport function DocumentSearchProvider({ children, limit, parent, typeId, facets, name, collectionId }) {\n const { store } = useUserSession();\n const search = useMemo(() => {\n let facetSpecs;\n if (facets) {\n facetSpecs = facets;\n }\n else {\n facetSpecs = [\n {\n name: 'status',\n field: 'status'\n },\n {\n name: 'location',\n field: 'location'\n }\n ];\n if (!typeId) {\n facetSpecs.unshift({\n name: 'type',\n field: 'type'\n });\n }\n }\n const search = new DocumentSearch(store, limit).withFacets(facetSpecs);\n search.collectionId = collectionId;\n search.query.type = typeId;\n search.query.parent = parent;\n search.query.name = name;\n return search;\n }, [typeId, limit, collectionId]);\n return (_jsx(SearchContext.Provider, { value: search, children: children }));\n}\n//# sourceMappingURL=DocumentSearchProvider.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { Button, ErrorBox, Spinner, useIntersectionObserver } from \"@vertesia/ui/core\";\nimport { useEffect, useRef, useState } from \"react\";\nimport { DocumentsFacetsNav } from \"../../../facets\";\nimport { DocumentTable } from \"../DocumentTable\";\nimport { useDocumentSearch, useWatchDocumentSearchFacets, useWatchDocumentSearchResult } from \"../search/DocumentSearchContext\";\nimport { DocumentSearchProvider } from \"../search/DocumentSearchProvider\";\nimport { ContentDispositionButton } from \"./ContentDispositionButton\";\nimport { RefreshCw } from \"lucide-react\";\nconst layout = [\n { \"name\": \"Name\", \"field\": \"properties.title\", \"type\": \"string\", \"fallback\": \"name\" },\n { \"name\": \"Type\", \"field\": \"type.name\", \"type\": \"string\" },\n { \"name\": \"Status\", \"field\": \"status\", \"type\": \"string\" },\n { \"name\": \"Created At\", \"field\": \"created_at\", \"type\": \"date\" }\n];\nexport function SelectDocument({ onChange }) {\n const onRowClick = (selected) => {\n onChange(selected || undefined);\n };\n return (_jsx(DocumentSearchProvider, { children: _jsx(SelectDocumentImpl, { onRowClick: onRowClick }) }));\n}\nconst LAST_DISPLAYED_VIEW = 'vertesia.content_store.lastDisplayedView';\nfunction SelectDocumentImpl({ onRowClick }) {\n const [isReady, setIsReady] = useState(false);\n const [isGridView, setIsGridView] = useState(localStorage.getItem(LAST_DISPLAYED_VIEW) === 'grid');\n const { search, isLoading, error, objects } = useWatchDocumentSearchResult();\n const loadMoreRef = useRef(null);\n useIntersectionObserver(loadMoreRef, () => {\n isReady && search.loadMore(true);\n }, { deps: [isReady] });\n useEffect(() => {\n search.search().then(() => setIsReady(true));\n }, []);\n const facets = useWatchDocumentSearchFacets();\n const facetSearch = useDocumentSearch();\n const handleRefetch = () => {\n setIsReady(false);\n search.search().then(() => setIsReady(true));\n };\n if (error) {\n return _jsx(ErrorBox, { title: \"Search failed\", children: error.message });\n }\n return (_jsxs(\"div\", { children: [_jsxs(\"div\", { className: \"flex justify-between items-center mb-4\", children: [_jsx(DocumentsFacetsNav, { facets: facets, search: facetSearch }), _jsxs(\"div\", { className: \"flex items-center gap-2\", children: [_jsx(Button, { variant: \"outline\", onClick: handleRefetch, alt: \"Refresh\", children: _jsx(RefreshCw, { size: 16 }) }), _jsx(ContentDispositionButton, { onUpdate: setIsGridView })] })] }), _jsx(DocumentTable, { objects: objects || [], isLoading: false, layout: layout, onRowClick: onRowClick, isGridView: isGridView }), _jsx(\"div\", { ref: loadMoreRef, className: 'mt-10' }), isLoading && _jsx(\"div\", { className: 'flex justify-center', children: _jsx(Spinner, { size: 'xl' }) })] }));\n}\n//# sourceMappingURL=SelectDocument.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { VModal, VModalBody, VModalTitle } from \"@vertesia/ui/core\";\nimport { SelectDocument } from \"./SelectDocument\";\nexport function SelectDocumentModal({ isOpen, onClose }) {\n return (_jsxs(VModal, { onClose: () => onClose(), isOpen: !!isOpen, className: 'min-w-[60vw]', children: [_jsx(VModalTitle, { children: \"Select Content\" }), _jsx(VModalBody, { className: 'pt-0 overflow-y-auto max-h-[80vh] min-h-[80vh]', children: isOpen && _jsx(SelectDocument, { onChange: onClose }) })] }));\n}\n//# sourceMappingURL=SelectDocumentModal.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport clsx from 'clsx';\nimport { useEffect, useState } from 'react';\nimport { useUserSession } from '@vertesia/ui/session';\nimport { ChevronsUpDown, X } from 'lucide-react';\nimport { Button, Styles, useFlag } from '@vertesia/ui/core';\nimport { SelectDocumentModal } from './SelectDocumentModal';\nconst STORE_REGEX = /store:([a-f0-9]+)/;\nexport function DocumentInput({ object }) {\n const { client } = useUserSession();\n const { off, on, isOn } = useFlag();\n const [actualValue, setValue] = useState(object.value != null ? String(object.value) : '');\n const [doc, setDoc] = useState(undefined);\n const _onChange = (event) => {\n const value = event.target.value;\n setValue(value);\n object.value = value;\n };\n const clearValue = () => {\n setValue('');\n object.value = '';\n setDoc(undefined);\n };\n const onSelect = (value) => {\n if (value) {\n const uri = \"store:\" + value.id;\n setValue(uri);\n setDoc(value || undefined);\n object.value = uri;\n }\n off();\n };\n useEffect(() => {\n if (!actualValue || doc) {\n return;\n }\n const match = actualValue.match(STORE_REGEX);\n if (!match) {\n return;\n }\n client.objects.get(match[1]).then((doc) => {\n setDoc(doc);\n }).catch(() => {\n clearValue();\n });\n }, [actualValue]);\n return (_jsxs(\"div\", { children: [_jsxs(\"div\", { className: \"relative\", children: [_jsx(\"input\", { value: actualValue, onChange: _onChange, className: clsx(Styles.INPUT, \"pr-10 w-full\") }), doc &&\n _jsx(\"div\", { className: \"absolute inset-y-0 right-10 flex items-center justify-center \", children: _jsx(Button, { onClick: clearValue, variant: 'unstyled', className: 'hover:text-red-500 hover:bg-gray-100 dark:hover:bg-gray-600', children: _jsx(X, { className: \"size-5\" }) }) }), _jsx(\"div\", { className: \"absolute inset-y-0 right-0 flex items-center justify-center\", children: _jsx(Button, { onClick: on, variant: 'unstyled', className: 'hover:bg-gray-100 dark:hover:bg-gray-600', children: _jsx(ChevronsUpDown, { className: \"size-5\" }) }) }), _jsx(SelectDocumentModal, { value: actualValue, isOpen: isOn, onClose: onSelect })] }), doc &&\n _jsx(\"div\", { className: \"p-1 semibold text-sm text-gray-600 dark:text-slate-300\", children: doc.properties?.title || doc.name })] }));\n}\n//# sourceMappingURL=DocumentInput.js.map","export function useDownloadDocument(client, toast, uri, name) {\n const onDownload = () => {\n if (uri) {\n client.files\n .getDownloadUrlWithOptions({ file: uri, name })\n .then((r) => {\n window.open(r.url, \"_blank\");\n })\n .catch((err) => {\n toast({\n status: \"error\",\n title: \"Failed to get download URL\",\n description: err.message,\n duration: 5000,\n });\n });\n }\n };\n return onDownload;\n}\n//# sourceMappingURL=useDownloadObject.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { ImageRenditionFormat } from \"@vertesia/common\";\nimport { Button, Spinner, useToast } from \"@vertesia/ui/core\";\nimport { useNavigate } from \"@vertesia/ui/router\";\nimport { useUserSession } from \"@vertesia/ui/session\";\nimport { JSONDisplay, MarkdownRenderer } from \"@vertesia/ui/widgets\";\nimport { ChevronRight, Download, FileText, Info, LayoutGrid, Maximize2, X, } from \"lucide-react\";\nimport { useEffect, useState } from \"react\";\nexport function DocumentPreviewPanel({ objectId, isOpen, onClose, }) {\n const navigate = useNavigate();\n const { client, store } = useUserSession();\n const [object, setObject] = useState(null);\n const [isLoading, setIsLoading] = useState(false);\n const [loadingText, setLoadingText] = useState(false);\n const [text, setText] = useState();\n const [imageUrl, setImageUrl] = useState();\n const [currentTab, setCurrentTab] = useState(\"preview\");\n const toast = useToast();\n useEffect(() => {\n if (objectId && isOpen) {\n setIsLoading(true);\n store.objects\n .retrieve(objectId, \"+embeddings\")\n .then((result) => {\n setObject(result);\n // If the object has text, use it\n if (result.text) {\n setText(result.text);\n }\n else {\n // Otherwise, fetch text\n loadObjectText(result.id);\n }\n // If it's an image, load the image URL\n const content = result.content;\n const isImage = content &&\n content.source &&\n content.type &&\n content.type.startsWith(\"image/\");\n if (isImage) {\n loadImageUrl(result);\n }\n })\n .catch((error) => {\n console.error(\"Error loading object:\", error);\n toast({\n title: \"Error\",\n description: \"Failed to load document\",\n status: \"error\",\n duration: 3000,\n });\n })\n .finally(() => {\n setIsLoading(false);\n });\n }\n else {\n // Reset state when panel closes\n setObject(null);\n setText(undefined);\n setImageUrl(undefined);\n }\n }, [objectId, isOpen, store.objects]);\n const loadObjectText = async (id) => {\n setLoadingText(true);\n try {\n const result = await store.objects.getObjectText(id);\n setText(result.text);\n }\n catch (error) {\n console.error(\"Error loading text:\", error);\n }\n finally {\n setLoadingText(false);\n }\n };\n const loadImageUrl = async (obj) => {\n try {\n // Try to get a rendition first\n const rendition = await client.objects.getRendition(obj.id, {\n format: ImageRenditionFormat.jpeg,\n generate_if_missing: false,\n });\n // Don't use rendition object to avoid type issues\n if (rendition.status === \"found\") {\n console.log(\"Found rendition\");\n }\n // Get download URL\n const downloadUrlResult = await client.files.getDownloadUrl(obj.content.source);\n setImageUrl(downloadUrlResult.url);\n }\n catch (error) {\n console.error(\"Error loading image:\", error);\n }\n };\n const handleViewFullDocument = () => {\n if (object) {\n navigate(`/legal/objects/${object.id}`);\n onClose();\n }\n };\n const seemsMarkdown = text &&\n (text.startsWith(\"#\") || text.includes(\"\\n#\") || text.includes(\"\\n*\"));\n const isImage = object?.content?.type && object.content.type.startsWith(\"image/\");\n const isPdf = object?.content?.type === \"application/pdf\";\n if (!isOpen)\n return null;\n return (_jsxs(\"div\", { className: `fixed inset-y-0 right-0 w-2/5 dark:bg-slate-900 shadow-xl z-50 flex flex-col transition-transform duration-300 transform ${isOpen ? \"translate-x-0\" : \"translate-x-full\"}`, children: [_jsxs(\"div\", { className: \"flex items-center justify-between px-4 py-3 border-b dark:border-gray-700 bg-gradient-to-r from-indigo-50 to-gray-50 dark:from-gray-800 dark:to-gray-900\", children: [_jsxs(\"div\", { className: \"flex items-center\", children: [_jsx(FileText, { className: \"h-5 w-5 text-indigo-600 mr-2\" }), _jsx(\"h2\", { className: \"text-lg font-semibold text-gray-800 dark:text-gray-200 truncate\", children: isLoading\n ? \"Loading document...\"\n : object?.name || \"Document Preview\" })] }), _jsxs(\"div\", { className: \"flex items-center space-x-2\", children: [_jsxs(Button, { variant: \"ghost\", size: \"sm\", onClick: handleViewFullDocument, className: \"flex items-center gap-1 text-indigo-600 hover:text-indigo-800\", children: [_jsx(Maximize2, { className: \"h-4 w-4\" }), _jsx(\"span\", { children: \"Full View\" })] }), _jsx(Button, { variant: \"ghost\", size: \"sm\", onClick: onClose, className: \"flex items-center text-gray-600 hover:text-gray-800 dark:text-gray-300 dark:hover:text-gray-100\", children: _jsx(X, { className: \"h-5 w-5\" }) })] })] }), isLoading ? (_jsx(\"div\", { className: \"flex-1 flex items-center justify-center\", children: _jsxs(\"div\", { className: \"text-center\", children: [_jsx(Spinner, { size: \"lg\", className: \"text-indigo-600 dark:text-indigo-400 mb-2\" }), _jsx(\"p\", { className: \"text-gray-600 dark:text-gray-400\", children: \"Loading document...\" })] }) })) : (_jsxs(\"div\", { className: \"flex-1 flex flex-col h-full\", children: [_jsx(\"div\", { className: \"border-b\", children: _jsxs(\"div\", { className: \"flex px-4\", children: [_jsx(\"button\", { className: `py-2 px-4 font-medium border-b-2 ${currentTab === \"preview\"\n ? \"border-indigo-600 text-indigo-700 dark:text-indigo-300\"\n : \"border-transparent text-gray-500 hover:text-gray-700 dark:text-gray-400 dark:hover:text-gray-200\"}`, onClick: () => setCurrentTab(\"preview\"), children: _jsxs(\"div\", { className: \"flex items-center gap-1\", children: [_jsx(LayoutGrid, { className: \"h-4 w-4\" }), _jsx(\"span\", { children: \"Preview\" })] }) }), _jsx(\"button\", { className: `py-2 px-4 font-medium border-b-2 ${currentTab === \"properties\"\n ? \"border-indigo-600 text-indigo-700 dark:text-indigo-300\"\n : \"border-transparent text-gray-500 hover:text-gray-700 dark:text-gray-400 dark:hover:text-gray-200\"}`, onClick: () => setCurrentTab(\"properties\"), children: _jsxs(\"div\", { className: \"flex items-center gap-1\", children: [_jsx(Info, { className: \"h-4 w-4\" }), _jsx(\"span\", { children: \"Properties\" })] }) })] }) }), _jsxs(\"div\", { className: \"flex-1 overflow-auto p-4\", children: [currentTab === \"preview\" && (_jsxs(\"div\", { className: \"h-full\", children: [loadingText ? (_jsx(\"div\", { className: \"flex items-center justify-center h-40\", children: _jsx(Spinner, { size: \"md\", className: \"text-indigo-600 dark:text-indigo-400\" }) })) : text ? (_jsx(\"div\", { className: \"shadow rounded-md p-4 border border-gray-200 dark:border-gray-700 bg-white dark:bg-gray-800\", children: seemsMarkdown ? (_jsx(\"div\", { className: \"prose prose-sm max-w-none prose-p:my-2 prose-pre:bg-gray-800 prose-pre:my-2 prose-headings:text-indigo-700 dark:prose-invert dark:prose-headings:text-indigo-300\", children: _jsx(MarkdownRenderer, { children: text }) })) : (_jsx(\"pre\", { className: \"text-wrap whitespace-pre-wrap dark:text-gray-200\", children: text })) })) : null, isImage && (_jsx(\"div\", { className: \"mt-4\", children: imageUrl ? (_jsx(\"div\", { className: \"border border-gray-200 dark:border-gray-700 rounded-md p-2 bg-white dark:bg-gray-800\", children: _jsx(\"img\", { src: imageUrl, alt: object?.name, className: \"mx-auto max-h-[70vh] object-contain\" }) })) : (_jsx(\"div\", { className: \"flex items-center justify-center h-40\", children: _jsx(Spinner, { size: \"md\", className: \"text-indigo-600 dark:text-indigo-400\" }) })) })), isPdf && (_jsxs(\"div\", { className: \"flex flex-col items-center justify-center h-64 border border-gray-200 dark:border-gray-700 rounded-md p-4 bg-gray-50 dark:bg-gray-800\", children: [_jsx(FileText, { className: \"h-16 w-16 text-indigo-300 dark:text-indigo-400 mb-4\" }), _jsxs(\"p\", { className: \"text-gray-600 dark:text-gray-400 text-center mb-4\", children: [\"PDF document preview is available in full view. TODO\", \" \"] }), _jsx(Button, { onClick: handleViewFullDocument, className: \"bg-indigo-600 hover:bg-indigo-700 text-white\", children: \"Open Full Document View\" })] })), !isImage && !text && !isPdf && !loadingText && (_jsxs(\"div\", { className: \"flex flex-col items-center justify-center h-64 border border-gray-200 dark:border-gray-700 rounded-md p-4 bg-gray-50 dark:bg-gray-800\", children: [_jsx(FileText, { className: \"h-16 w-16 text-gray-300 dark:text-gray-600 mb-4\" }), _jsx(\"p\", { className: \"text-gray-600 dark:text-gray-400 text-center\", children: \"No preview available for this document type.\" })] }))] })), currentTab === \"properties\" && object && (_jsxs(\"div\", { className: \"h-full\", children: [object.properties ? (_jsx(\"div\", { className: \"shadow rounded-md p-4 border border-gray-200 dark:border-gray-700 bg-white dark:bg-gray-800\", children: _jsx(JSONDisplay, { value: object.properties }) })) : (_jsxs(\"div\", { className: \"flex flex-col items-center justify-center h-64 border border-gray-200 dark:border-gray-700 rounded-md p-4 bg-gray-50 dark:bg-gray-800\", children: [_jsx(Info, { className: \"h-16 w-16 text-gray-300 dark:text-gray-600 mb-4\" }), _jsx(\"p\", { className: \"text-gray-600 dark:text-gray-400 text-center\", children: \"No properties available for this document.\" })] })), _jsxs(\"div\", { className: \"mt-4\", children: [_jsx(\"h3\", { className: \"text-sm font-semibold text-gray-700 dark:text-gray-300 mb-2\", children: \"Document Information\" }), _jsx(\"div\", { className: \"shadow rounded-md p-4 border border-gray-200 dark:border-gray-700 bg-white dark:bg-gray-800\", children: _jsxs(\"div\", { className: \"grid grid-cols-2 gap-y-2 gap-x-4 text-sm\", children: [_jsx(\"div\", { className: \"text-gray-500 dark:text-gray-400\", children: \"ID\" }), _jsx(\"div\", { className: \"font-medium dark:text-gray-200\", children: object.id }), _jsx(\"div\", { className: \"text-gray-500 dark:text-gray-400\", children: \"Type\" }), _jsx(\"div\", { className: \"font-medium dark:text-gray-200\", children: object.type?.name || \"Unknown\" }), _jsx(\"div\", { className: \"text-gray-500 dark:text-gray-400\", children: \"Content Type\" }), _jsx(\"div\", { className: \"font-medium dark:text-gray-200\", children: object.content?.type || \"N/A\" }), _jsx(\"div\", { className: \"text-gray-500\", children: \"Size\" }), _jsx(\"div\", { className: \"font-medium\", children: object.content && \"size\" in object.content\n ? formatFileSize(object.content.size)\n : \"Unknown\" }), _jsx(\"div\", { className: \"text-gray-500\", children: \"Created\" }), _jsx(\"div\", { className: \"font-medium\", children: object.created_at\n ? new Date(object.created_at).toLocaleString()\n : \"N/A\" }), _jsx(\"div\", { className: \"text-gray-500\", children: \"Updated\" }), _jsx(\"div\", { className: \"font-medium\", children: object.updated_at\n ? new Date(object.updated_at).toLocaleString()\n : \"N/A\" })] }) })] })] }))] })] })), _jsxs(\"div\", { className: \"flex items-center justify-between p-4 border-t bg-gray-50 dark:bg-gray-800 dark:border-gray-700\", children: [_jsx(\"div\", { children: object?.content?.source && (_jsxs(Button, { onClick: () => {\n if (object?.content?.source) {\n client.files\n .getDownloadUrl(object.content.source)\n .then((result) => {\n window.open(result.url, \"_blank\");\n })\n .catch((error) => {\n console.error(\"Error getting download URL:\", error);\n toast({\n title: \"Error\",\n description: \"Failed to download file\",\n status: \"error\",\n duration: 3000,\n });\n });\n }\n }, variant: \"outline\", className: \"text-indigo-600 border-indigo-300 hover:bg-indigo-50\", children: [_jsx(Download, { className: \"h-4 w-4 mr-2\" }), \"Download\"] })) }), _jsxs(Button, { onClick: handleViewFullDocument, className: \"bg-indigo-600 hover:bg-indigo-700 text-white\", children: [\"Open Full Document\", _jsx(ChevronRight, { className: \"h-4 w-4 ml-2\" })] })] })] }));\n}\nfunction formatFileSize(bytes) {\n if (bytes === 0)\n return \"0 Bytes\";\n const k = 1024;\n const sizes = [\"Bytes\", \"KB\", \"MB\", \"GB\", \"TB\"];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + \" \" + sizes[i];\n}\n//# sourceMappingURL=DocumentPreviewPanel.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { useEffect, useState } from 'react';\nimport { SupportedEmbeddingTypes, SearchTypes } from '@vertesia/common';\nimport { Button, Input, useToast, Modal, ModalTitle, ModalBody, ModalFooter, Checkbox, NumberInput } from '@vertesia/ui/core';\nimport { useUserSession } from '@vertesia/ui/session';\nimport { Settings } from 'lucide-react';\nconst allTypes = Object.values(SearchTypes);\nconst embeddingTypes = Object.values(SupportedEmbeddingTypes);\nexport function VectorSearchWidget({ onChange, isLoading, refresh, searchTypes }) {\n const { client, project } = useUserSession();\n const toast = useToast();\n const [searchText, setSearchText] = useState(undefined);\n const [config, setConfig] = useState(undefined);\n const isReady = !!project && (!!config?.embeddings.text || !!config?.embeddings.image);\n const [status, setStatus] = useState(undefined);\n const [showSettings, setShowSettings] = useState(false);\n // Default to all types, or use prop if provided\n const [selectedTypes, setSelectedTypes] = useState(searchTypes || allTypes);\n const [limit, setLimit] = useState(100);\n useEffect(() => {\n if (searchTypes)\n setSelectedTypes(searchTypes);\n }, [searchTypes]);\n // Always derive embeddingSearchTypes and full_text from selectedTypes\n const embeddingSearchTypes = {};\n let fullTextEnabled = false;\n let vectorSearchEnabled = false;\n selectedTypes.forEach(type => {\n if (type === SearchTypes.full_text) {\n fullTextEnabled = true;\n }\n else {\n vectorSearchEnabled = true;\n }\n if (embeddingTypes.includes(type)) {\n embeddingSearchTypes[type] = true;\n }\n });\n useEffect(() => {\n setSearchText(undefined);\n setStatus(undefined);\n }, [refresh]);\n useEffect(() => {\n if (!project)\n return;\n client.projects.retrieve(project.id).then((project) => {\n setConfig(project.configuration);\n });\n }, [project]);\n useEffect(() => {\n if (status) {\n toast({ title: status, status: 'success', duration: 2000 });\n }\n }, [status]);\n useEffect(() => {\n if (!searchText || searchText.length === 0) {\n onChange(undefined);\n }\n }, [searchText]);\n const fireSearch = () => {\n if (!isReady || !searchText)\n return;\n const query = {\n vector: vectorSearchEnabled ? {\n text: searchText,\n config: embeddingSearchTypes,\n } : undefined,\n full_text: fullTextEnabled ? searchText : undefined,\n limit: limit\n };\n onChange(query);\n setStatus(\"Searching...\");\n };\n const handleKeyPress = (e) => {\n if (e.key === \"Enter\") {\n fireSearch();\n }\n };\n // Modal state for search type selection\n const handleCheckboxChange = (type) => (checked) => {\n if (checked) {\n setSelectedTypes(prev => Array.from(new Set([...prev, type])));\n }\n else {\n setSelectedTypes(prev => prev.filter(t => t !== type));\n }\n };\n return (_jsxs(\"div\", { className: \"flex gap-1 items-center w-1/2\", children: [_jsx(Input, { placeholder: \"Type what you are looking for, or select a filter\", value: searchText, onChange: setSearchText, onKeyDown: handleKeyPress }), _jsx(Button, { variant: \"ghost\", onClick: () => setShowSettings(true), alt: \"Semantic search settings\", className: \"ml-1\", children: _jsx(Settings, { size: 18 }) }), _jsxs(Modal, { isOpen: showSettings, onClose: () => setShowSettings(false), children: [_jsx(ModalTitle, { children: \"Search Types\" }), _jsx(ModalBody, { children: _jsxs(\"div\", { className: \"flex flex-col gap-2\", children: [_jsxs(\"label\", { className: \"flex items-center gap-2\", children: [_jsx(Checkbox, { checked: selectedTypes.includes(SearchTypes.full_text), onCheckedChange: handleCheckboxChange(SearchTypes.full_text) }), _jsx(\"span\", { children: \"Full Text\" })] }), _jsx(\"div\", { className: \"font-semibold mt-2 mb-1\", children: \"Embeddings\" }), embeddingTypes.map(type => (_jsxs(\"label\", { className: \"flex items-center gap-2\", children: [_jsx(Checkbox, { checked: selectedTypes.includes(type), onCheckedChange: handleCheckboxChange(type) }), _jsx(\"span\", { children: type.charAt(0).toUpperCase() + type.slice(1) })] }, type))), _jsxs(\"div\", { className: \"mt-3\", children: [_jsx(\"span\", { className: \"mr-2\", children: \"Limit\" }), _jsx(NumberInput, { type: \"number\", min: 1, value: limit, onChange: v => setLimit(Number(v) || 1), style: { width: 80 } })] })] }) }), _jsx(ModalFooter, { children: _jsx(Button, { variant: \"outline\", onClick: () => setShowSettings(false), children: \"Close\" }) })] }), _jsx(Button, { variant: \"secondary\", isLoading: isLoading, onClick: fireSearch, isDisabled: !isReady, alt: \"Semantic search\", children: \"Search\" })] }));\n}\n//# sourceMappingURL=VectorSearchWidget.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { useRef, useState, useEffect } from \"react\";\nimport { Button, Divider, ErrorBox, SidePanel, Spinner, useIntersectionObserver, useToast, FilterProvider, FilterBtn, FilterBar, FilterClear } from '@vertesia/ui/core';\nimport { useNavigate } from \"@vertesia/ui/router\";\nimport { useUserSession } from '@vertesia/ui/session';\nimport { Download, RefreshCw, ExternalLink } from 'lucide-react';\nimport { useDocumentFilterGroups, useDocumentFilterHandler } from \"../../facets/DocumentsFacetsNav\";\nimport { VectorSearchWidget } from './components/VectorSearchWidget';\nimport { ContentDispositionButton } from './components/ContentDispositionButton';\nimport { DocumentTable } from './DocumentTable';\nimport { useDocumentSearch, useWatchDocumentSearchFacets, useWatchDocumentSearchResult } from './search/DocumentSearchContext';\nimport { useDocumentUploadHandler } from './upload/useUploadHandler';\nimport { ContentOverview } from './components/ContentOverview';\nimport { useDownloadDocument } from './components/useDownloadObject';\nconst defaultLayout = [\n { name: \"ID\", field: \"id\", type: \"objectId?slice=-7\" },\n { name: \"Name\", field: \".\", type: \"objectName\" },\n { name: \"Type\", field: \"type.name\", type: \"string\" },\n { name: \"Status\", field: \"status\", type: \"string\" },\n { name: \"Updated At\", field: \"updated_at\", type: \"date\" },\n];\nfunction getTableLayout(registry, type) {\n const layout = type ? registry.getTypeLayout(type) : defaultLayout;\n console.log('[DEBUG] getTableLayout called with type:', type);\n console.log('[DEBUG] Layout from registry:', layout);\n console.log('[DEBUG] Using defaultLayout?', layout === defaultLayout);\n const result = layout ?? defaultLayout;\n console.log('[DEBUG] Final layout:', result);\n console.log('[DEBUG] Has Status field?', result.some(col => col.field === 'status'));\n return result;\n}\nexport function DocumentSearchResultsWithDropZone({ onUploadDone = async () => { }, layout }) {\n const search = useDocumentSearch();\n const toast = useToast();\n // Create a wrapper around the onUploadDone callback that also refreshes the search\n const handleUploadDone = async (objectIds) => {\n // First, call the original callback\n await onUploadDone(objectIds);\n // Use a timeout to let the backend catch up, then refresh the search results\n setTimeout(() => {\n console.log('Delayed refresh after upload to ensure backend consistency');\n search.search().then(() => {\n // Notify the user that the list has been refreshed\n toast({\n title: \"Document list refreshed\",\n description: \"The document list has been updated with your uploaded files.\",\n status: \"info\",\n duration: 3000,\n });\n }).catch(err => {\n console.error('Failed to refresh search results:', err);\n });\n }, 1000); // 1-second delay for backend processing\n };\n // Use the enhanced standard upload handler with smart processing\n const uploadHandler = useDocumentUploadHandler(handleUploadDone);\n // Wrap the uploadHandler to ensure the collectionId is passed\n const wrappedUploadHandler = (files, type) => {\n // Get the collection ID from the search context\n const collectionId = search.collectionId;\n return uploadHandler(files, type, collectionId);\n };\n return _jsx(DocumentSearchResults, { layout: layout, onUpload: wrappedUploadHandler });\n}\nexport function DocumentSearchResults({ layout, onUpload, allowFilter = true, allowSearch = true }) {\n // Get the search context to access collectionId\n const searchContext = useDocumentSearch();\n const [isReady, setIsReady] = useState(false);\n const [selectedObject, setSelectedObject] = useState(null);\n const { typeRegistry } = useUserSession();\n const { search, isLoading, error, objects, hasMore } = useWatchDocumentSearchResult();\n const [actualLayout, setActualLayout] = useState(typeRegistry ? layout || getTableLayout(typeRegistry, search.query.type) : defaultLayout);\n console.log('[DEBUG] DocumentSearchResults - actualLayout:', actualLayout);\n console.log('[DEBUG] DocumentSearchResults - actualLayout has Status?', actualLayout.some(col => col.field === 'status'));\n //TODO _setRefreshTrigger state not used\n const [refreshTrigger, _setRefreshTrigger] = useState(0);\n const [loaded, setLoaded] = useState(0);\n const [isGridView, setIsGridView] = useState(localStorage.getItem(ContentDispositionButton.LAST_DISPLAYED_VIEW) === \"grid\");\n const [filters, setFilters] = useState([]);\n const loadMoreRef = useRef(null);\n // Trigger initial search when component mounts\n useEffect(() => {\n if (!isReady && objects.length === 0) {\n setLoaded(0);\n // Manually set loading state to show spinner during initial load\n search._updateRunningState(true);\n search.search().then(() => {\n setIsReady(true);\n }).catch(err => {\n console.error('Initial search failed:', err);\n search._updateRunningState(false);\n });\n }\n }, []);\n useEffect(() => {\n if (objects.length < loaded) {\n setLoaded(objects.length);\n }\n }, [objects.length, loaded]);\n useIntersectionObserver(loadMoreRef, () => {\n if (isReady && objects.length > 0 && objects.length != loaded) {\n setIsReady(false);\n search.loadMore().finally(() => {\n setLoaded(objects.length);\n setIsReady(true);\n });\n }\n }, { deps: [isReady, objects.length] });\n // Handler for vector search widget\n const handleVectorSearch = (query) => {\n if (query && query.vector) {\n search.query.vector = query.vector;\n search.query.full_text = query.full_text;\n search.query.weights = query.weights;\n search.query.score_aggregation = query.score_aggregation;\n search.query.dynamic_scaling = query.dynamic_scaling;\n if (!actualLayout.find((c) => c.name === \"Search Score\")) {\n const layout = [\n ...actualLayout,\n {\n name: \"Search Score\",\n field: \"score\",\n render: (item) => item.score?.toFixed(4) || \"0.0000\"\n },\n ];\n setActualLayout(layout);\n }\n search.search().then(() => setIsReady(true));\n }\n else if (query && query.full_text) {\n search.query.full_text = query.full_text;\n search.search().then(() => setIsReady(true));\n }\n else if (query === undefined) {\n // Only clear search if this is a user-initiated clear (not initialization)\n // The VectorSearchWidget calls onChange(undefined) during initialization\n if (isReady) {\n delete search.query.vector;\n delete search.query.full_text;\n search.search().then(() => setIsReady(true));\n }\n }\n };\n const facets = useWatchDocumentSearchFacets();\n const facetSearch = useDocumentSearch();\n const handleRefetch = () => {\n search.search().then(() => setIsReady(true));\n };\n // Use DocumentsFacetsNav hooks for cleaner organization\n const filterGroups = useDocumentFilterGroups(facets);\n const handleFilterLogic = useDocumentFilterHandler(facetSearch);\n const handleFilterChange = (value) => {\n const newFilters = typeof value === 'function' ? value(filters) : value;\n setFilters(newFilters);\n handleFilterLogic(newFilters);\n };\n const url = new URL(window.location.href);\n const filtersParam = url.searchParams.get('filters');\n if (filtersParam) {\n try {\n const filterPairs = filtersParam.split(';');\n const validFilterPairs = filterPairs.filter(pair => {\n const [encodedName] = pair.split(':');\n const name = decodeURIComponent(encodedName);\n return name !== 'start' && name !== 'end';\n });\n if (validFilterPairs.length !== filterPairs.length) {\n const newFiltersParam = validFilterPairs.length > 0 ? validFilterPairs.join(';') : '';\n if (newFiltersParam) {\n url.searchParams.set('filters', newFiltersParam);\n }\n else {\n url.searchParams.delete('filters');\n }\n window.history.replaceState(window.history.state || {}, '', url.toString());\n }\n }\n catch (error) {\n console.error(\"Failed to clean start/end filters from URL:\", error);\n }\n }\n const navigate = useNavigate();\n const onRowClick = (object) => {\n navigate(`/objects/${object.id}`);\n };\n const previewObject = (objectId) => {\n const obj = objects.find(o => o.id === objectId) || null;\n setSelectedObject(obj);\n };\n return (_jsxs(\"div\", { className: \"flex flex-col gap-y-2\", children: [_jsx(OverviewDrawer, { object: selectedObject, onClose: () => setSelectedObject(null) }), error && _jsx(ErrorBox, { title: \"Error\", children: error.message }), _jsx(Toolsbar, { isLoading: isLoading, refreshTrigger: refreshTrigger, allowFilter: allowFilter, allowSearch: allowSearch, filterGroups: filterGroups, filters: filters, handleFilterChange: handleFilterChange, handleVectorSearch: handleVectorSearch, handleRefetch: handleRefetch, setIsGridView: setIsGridView }), _jsx(DocumentTable, { objects: objects, isLoading: !objects.length && isLoading, layout: actualLayout, onRowClick: onRowClick, previewObject: previewObject, selectedObject: selectedObject, onUpload: onUpload, isGridView: isGridView, collectionId: searchContext.collectionId }), hasMore ? (_jsx(\"div\", { ref: loadMoreRef, className: \"w-full flex justify-center\", children: _jsx(Spinner, { size: 'xl' }) })) : (_jsx(\"div\", { className: \"text-muted text-center text-sm py-1\", children: `All ${objects.length} objects loaded.` }))] }));\n}\nfunction Toolsbar(props) {\n const { isLoading, refreshTrigger, allowFilter, allowSearch, filterGroups, filters, handleFilterChange, handleVectorSearch, handleRefetch, setIsGridView } = props;\n return (_jsxs(\"div\", { className: \"sticky top-0 z-10 bg-background py-2\", children: [allowFilter && (_jsxs(FilterProvider, { filterGroups: filterGroups, filters: filters, setFilters: handleFilterChange, children: [_jsxs(\"div\", { className: \"flex flex-row gap-4 items-center justify-between w-full\", children: [_jsxs(\"div\", { className: \"flex gap-2 items-center w-2/3\", children: [allowSearch && _jsx(VectorSearchWidget, { onChange: handleVectorSearch, isLoading: isLoading, refresh: refreshTrigger, className: \"w-full\" }), _jsx(FilterBtn, {})] }), _jsxs(\"div\", { className: \"flex gap-1 items-center\", children: [_jsx(Button, { variant: \"outline\", onClick: handleRefetch, alt: \"Refresh\", children: _jsx(RefreshCw, { size: 16 }) }), _jsx(ContentDispositionButton, { onUpdate: setIsGridView })] })] }), _jsxs(\"div\", { className: \"flex gap-2 items-center pt-2\", children: [_jsx(FilterBar, {}), _jsx(FilterClear, {})] })] })), !allowFilter && (_jsxs(\"div\", { className: \"flex flex-row gap-4 items-center justify-between w-full\", children: [_jsx(\"div\", { className: \"flex gap-2 items-center w-2/3\", children: allowSearch && _jsx(VectorSearchWidget, { onChange: handleVectorSearch, isLoading: isLoading, refresh: refreshTrigger }) }), _jsxs(\"div\", { className: \"flex gap-1 items-center\", children: [_jsx(Button, { variant: \"outline\", onClick: handleRefetch, alt: \"Refresh\", children: _jsx(RefreshCw, { size: 16 }) }), _jsx(ContentDispositionButton, { onUpdate: setIsGridView })] })] }))] }));\n}\nfunction OverviewDrawer({ object, onClose }) {\n const { store } = useUserSession();\n const toast = useToast();\n const navigate = useNavigate();\n const onDownload = useDownloadDocument(store, toast, object?.content?.source, object?.name || object?.content?.name);\n return object ? (_jsxs(SidePanel, { title: object.properties?.title || object.name, isOpen: true, onClose: onClose, children: [_jsxs(\"div\", { className: \"flex items-center gap-x-2\", children: [_jsx(Button, { variant: \"ghost\", size: \"sm\", title: \"Open Object\", onClick: () => navigate(`/objects/${object.id}`), children: _jsx(ExternalLink, { className: \"size-4\" }) }), object.content?.source && (_jsx(Button, { variant: \"ghost\", size: \"sm\", title: \"Download\", onClick: onDownload, children: _jsx(Download, { className: \"size-4\" }) }))] }), _jsx(Divider, { className: \"my-2\" }), _jsx(\"div\", { className: \"pt-2\", children: _jsx(ContentOverview, { object: object, loadText: true }, object.id) })] })) : null;\n}\n//# sourceMappingURL=DocumentSearchResults.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { Button, Modal, ModalBody, ModalTitle, SelectBox, Spinner } from \"@vertesia/ui/core\";\nimport { useState } from \"react\";\nexport var ExportTypes;\n(function (ExportTypes) {\n ExportTypes[\"CSV\"] = \"CSV\";\n ExportTypes[\"JSON\"] = \"JSON\";\n})(ExportTypes || (ExportTypes = {}));\n;\nexport function ExportPropertiesModal({ isExporting, isOpen, onClose }) {\n const title = \"Export Object Properties\";\n return (_jsxs(Modal, { onClose: () => onClose(undefined), isOpen: isOpen, className: \"relative overflow-visible\", children: [_jsx(ModalTitle, { children: title }), !isExporting &&\n _jsx(SelectPanel, { onClose: onClose }), isExporting &&\n _jsx(WaitingPanel, {})] }));\n}\nfunction SelectPanel({ onClose }) {\n const [exportType, setExportType] = useState(undefined);\n const [exportAll, setExportAll] = useState(undefined);\n const selectionOption = [\"Export selected objects\", \"Export all objects\"];\n const exportAllBoolean = (option) => {\n return option == selectionOption[1];\n };\n const onSubmit = () => {\n onClose(exportType, exportAllBoolean(exportAll));\n };\n return (_jsxs(ModalBody, { className: \"min-h-[104px] pt-0 flex flex-col gap-y-4\", children: [_jsx(\"div\", { className: 'h-1/3', children: _jsx(SelectBox, { options: selectionOption, value: exportAll, onChange: setExportAll, placeholder: \"Choose what to export\", className: \"h-full w-full text-sm\", filterBy: \"name\", isClearable: true }) }), _jsxs(\"div\", { className: 'h-1/2 flex flex-col gap-y-8 content-between', children: [_jsx(SelectBox, { options: Object.values(ExportTypes), value: exportType, onChange: setExportType, placeholder: \"Choose a format\", className: \"h-full w-full text-sm\", filterBy: \"name\", isClearable: true }), _jsx(Button, { className: \"w-full\", isDisabled: !exportType || !exportAll, onClick: onSubmit, children: \"Export Properties\" })] })] }));\n}\nfunction WaitingPanel({}) {\n return (_jsx(ModalBody, { className: \"min-h-[84px] pt-0\", children: _jsxs(\"div\", { className: 'h-full grid flex-col gap-y-2 content-between justify-items-center', children: [_jsxs(\"div\", { className: \"text-sm flex flex-col gap-x-2\", children: [_jsx(\"p\", { children: \"EXPORT IS IN PROGRESS\" }), _jsx(\"p\", { className: \"pt-2 grid justify-items-center\", children: \"PLEASE WAIT\" })] }), _jsx(Spinner, { size: 'lg' })] }) }));\n}\n//# sourceMappingURL=ExportPropertiesModal.js.map","import { jsx as _jsx } from \"react/jsx-runtime\";\nimport { useUserSession } from \"@vertesia/ui/session\";\nimport { DocumentSearchResultsWithDropZone, DocumentSearchResults } from \"../objects/DocumentSearchResults\";\nimport { useToast } from \"@vertesia/ui/core\";\nimport { useDocumentSearch } from \"../objects/search/DocumentSearchContext\";\nexport function BrowseCollectionView({ collection }) {\n const toast = useToast();\n const { client, typeRegistry } = useUserSession();\n const search = useDocumentSearch();\n search.query.all_revisions = true;\n const onUploadDone = async (objectIds) => {\n if (objectIds.length > 0) {\n await client.store.collections.addMembers(collection.id, objectIds).catch(err => {\n toast({\n title: 'Failed to add objects to collection',\n description: err.message,\n status: 'error'\n });\n });\n }\n };\n const tableLayout = getTableLayout(collection, typeRegistry);\n return collection.dynamic ? (_jsx(DocumentSearchResults, { layout: tableLayout })) : (_jsx(DocumentSearchResultsWithDropZone, { onUploadDone: onUploadDone, layout: tableLayout }));\n}\nfunction getTableLayout(collection, typeRegistry) {\n let table_layout = collection.table_layout;\n if (table_layout && table_layout.length > 0) {\n return table_layout;\n }\n if (collection.type && typeRegistry) {\n table_layout = typeRegistry?.getTypeLayout(collection.type.id);\n }\n if (table_layout && table_layout.length > 0) {\n return table_layout;\n }\n else {\n return undefined;\n }\n}\n//# sourceMappingURL=BrowseCollectionView.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { VSelectBox } from \"@vertesia/ui/core\";\nimport { useUserSession } from \"@vertesia/ui/session\";\nimport { useEffect, useState } from \"react\";\nconst optionLabel = (t) => {\n if (t === null)\n return 'None';\n return (_jsxs(\"div\", { children: [_jsx(\"div\", { className: \"text-sm\", children: t.name }), _jsx(\"div\", { className: \"text-xs text-gray-500\", children: t.description })] }));\n};\nexport function SelectContentType({ className, defaultValue, onChange, isClearable, multiple }) {\n const session = useUserSession();\n const [isMounted, setIsMounted] = useState(false);\n const [selectedType, setSelectedType] = useState();\n const [selectedTypes, setSelectedTypes] = useState([]);\n useEffect(() => {\n if (!isMounted) {\n setIsMounted(true);\n if (session.typeRegistry && defaultValue) {\n if (multiple && Array.isArray(defaultValue)) {\n const types = session.typeRegistry.types.filter(t => defaultValue.includes(t.id));\n setSelectedTypes(types);\n }\n const type = session.typeRegistry.types.find(t => t.id === defaultValue);\n if (type) {\n setSelectedType(type);\n }\n }\n }\n }, [session.typeRegistry, defaultValue, multiple]);\n const _onChange = (option) => {\n setSelectedType(option || undefined);\n onChange(option);\n };\n const _onChangeMultiple = (options) => {\n setSelectedTypes(options);\n onChange(options);\n };\n if (multiple) {\n return (_jsx(\"div\", { className: 'flex flex-col gap-4 content-between', children: _jsx(VSelectBox, { options: session.typeRegistry?.types || [], value: selectedTypes, onChange: _onChangeMultiple, placeholder: \"Choose Content Types...\", optionLabel: optionLabel, className: className || \"text-sm bg-background\", filterBy: \"name\", isClearable: isClearable || false, multiple: true }) }));\n }\n return (_jsx(\"div\", { className: 'flex flex-col gap-4 content-between', children: _jsx(VSelectBox, { options: session.typeRegistry?.types || [], value: selectedType, onChange: _onChange, placeholder: \"Choose a Content Type...\", optionLabel: optionLabel, className: className || \"text-sm bg-background\", filterBy: \"name\", isClearable: isClearable || false }) }));\n}\n//# sourceMappingURL=SelectContentType.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { useToast, VModalBody, FormItem, VModalFooter, Input, Switch, Button, VModal, VModalTitle, Textarea } from \"@vertesia/ui/core\";\nimport { SelectContentType } from \"../types/SelectContentType\";\nimport { useNavigate } from \"@vertesia/ui/router\";\nimport { useUserSession } from \"@vertesia/ui/session\";\nimport { useState } from \"react\";\nexport function CreateCollectionForm({ onClose, redirect = true, onAddToCollection }) {\n const navigate = useNavigate();\n const toast = useToast();\n const [isProcessing, setProcessing] = useState(false);\n const { client } = useUserSession();\n const [payload, setPayload] = useState({\n dynamic: false,\n name: \"\",\n description: \"\",\n });\n function setPayloadProp(name, value) {\n setPayload({\n ...payload,\n [name]: value,\n });\n }\n const onCreate = () => {\n if (!payload?.name || !payload.name.trim()) {\n toast({\n title: \"Name is required\",\n description: \"Please provide a name for the collection\",\n status: \"error\",\n duration: 5000,\n });\n return;\n }\n payload.name = payload.name.trim();\n if (payload.description) {\n payload.description = payload.description.trim();\n }\n if (payload.dynamic == null) {\n payload.dynamic = false;\n }\n setProcessing(true);\n client.store.collections\n .create(payload)\n .then((r) => {\n onClose();\n toast({\n title: \"Collection created\",\n description: `Collection \"${r.name}\" created successfully`,\n status: \"success\",\n duration: 3000,\n });\n if (redirect)\n navigate(`/collections/${r.id}`);\n if (onAddToCollection) {\n onAddToCollection(r.id);\n }\n })\n .catch((err) => {\n toast({\n title: \"Failed to create collection\",\n description: err.message,\n status: \"error\",\n duration: 5000,\n });\n })\n .finally(() => setProcessing(false));\n };\n return (_jsxs(\"form\", { onSubmit: (e) => e.preventDefault(), children: [_jsxs(VModalBody, { children: [_jsx(FormItem, { label: \"Name\", required: true, children: _jsx(Input, { type: \"text\", value: payload.name || \"\", onChange: (value) => setPayloadProp(\"name\", value) }) }), _jsx(FormItem, { label: \"Description\", className: \"mt-2\", children: _jsx(Textarea, { value: payload.description || \"\", onChange: (ev) => setPayloadProp(\"description\", ev) }) }), _jsx(FormItem, { label: \"Dynamic Collection\", className: \"mt-2\", direction: \"row\", description: \"Dynamically fetch content for the collection based on a query. If not enabled, then content must be added by users or agents.\", children: _jsx(Switch, { value: payload.dynamic || false, onChange: (value) => setPayloadProp(\"dynamic\", value) }) }), !payload.dynamic &&\n _jsx(FormItem, { label: \"Allowed Content Types\", className: \"mt-4\", description: \"Optionally select which content types can be added to the collection. If not set, then all content types are allowed.\", children: _jsx(SelectContentType, { defaultValue: payload.allowed_types || null, onChange: (v) => {\n if (Array.isArray(v)) {\n setPayloadProp(\"allowed_types\", v.map(type => type.id));\n }\n else {\n setPayloadProp(\"allowed_types\", v ? [v.id] : []);\n }\n }, isClearable: true, multiple: true }) }), _jsx(FormItem, { label: \"Type\", className: \"mt-2\", description: \"Optionally select a content type to assign custom properties and data to the collection.\", children: _jsx(SelectContentType, { defaultValue: payload.type || null, onChange: (v) => {\n if (Array.isArray(v)) {\n setPayloadProp(\"type\", v.length > 0 ? v[0].id : null);\n }\n else {\n setPayloadProp(\"type\", v?.id || null);\n }\n }, isClearable: true }) })] }), _jsx(VModalFooter, { children: _jsx(Button, { isDisabled: isProcessing, onClick: onCreate, children: \"Create Collection\" }) })] }));\n}\nexport function CreateCollectionModal({ isOpen, onClose }) {\n return (_jsxs(VModal, { onClose: onClose, isOpen: isOpen, children: [_jsx(VModalTitle, { children: \"Create a Collection\" }), _jsx(CreateCollectionForm, { onClose: onClose })] }));\n}\n//# sourceMappingURL=CreateCollection.js.map","import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from \"react/jsx-runtime\";\nimport { NavLink } from \"@vertesia/ui/router\";\nimport { useUserSession } from \"@vertesia/ui/session\";\nimport { FolderClosed, Search, Trash2 } from \"lucide-react\";\nimport { Button, ConfirmModal, ErrorBox, Table, TBody, TR, useToast, VTooltip, useFetch, EmptyCollection } from \"@vertesia/ui/core\";\nimport dayjs from 'dayjs';\nimport relativeTime from 'dayjs/plugin/relativeTime';\nimport { useState, useEffect } from \"react\";\nimport { CreateCollectionModal } from \"./CreateCollection\";\ndayjs.extend(relativeTime);\nexport function CollectionsTable({}) {\n const { client } = useUserSession();\n const toast = useToast();\n const [collectionToDelete, setCollectionToDelete] = useState();\n const [isLoading, setIsLoading] = useState(true);\n const [isOpen, setOpen] = useState(false);\n const { data: collections, error, refetch } = useFetch(() => client.store.collections.search({}), []);\n // Update loading state when data is fetched\n useEffect(() => {\n if (collections || error) {\n setIsLoading(false);\n }\n }, [collections, error]);\n if (error) {\n return _jsx(ErrorBox, { title: 'Collections fetch failed', children: error.message });\n }\n const deleteCollection = async () => {\n if (!collectionToDelete)\n return;\n try {\n await client.store.collections.delete(collectionToDelete);\n toast({\n title: 'Collection deleted',\n status: 'success',\n duration: 3000\n });\n refetch();\n }\n catch (err) {\n console.error('Failed to delete collection:', err);\n toast({\n title: 'Failed to delete collection',\n description: err.message || 'An error occurred',\n status: 'error',\n duration: 5000\n });\n }\n finally {\n setCollectionToDelete(undefined);\n }\n };\n return (_jsxs(_Fragment, { children: [collections &&\n (collections.length > 0 ?\n (_jsxs(Table, { className: \"w-full\", children: [_jsx(\"thead\", { children: _jsxs(\"tr\", { children: [_jsx(\"th\", { children: \"Name\" }), _jsx(\"th\", { children: \"Type\" }), _jsx(\"th\", { children: \"Created\" }), _jsx(\"th\", {})] }) }), _jsx(TBody, { columns: 4, isLoading: isLoading, children: collections.map((c) => {\n return _jsxs(TR, { children: [_jsx(\"td\", { children: _jsxs(\"div\", { className: \"flex items-center gap-2\", children: [collectionIcon(c.dynamic), _jsx(NavLink, { href: `/collections/${c.id}`, children: c.name })] }) }), _jsx(\"td\", { children: c.type?.name || \"-\" }), _jsx(\"td\", { children: dayjs(c.created_at).fromNow() }), _jsx(\"td\", { className: \"text-right\", children: _jsx(Button, { variant: \"destructive\", size: \"sm\", onClick: () => setCollectionToDelete(c.id), children: _jsx(Trash2, { className: \"size-4\" }) }) })] }, c.id);\n }) })] })) :\n _jsx(EmptyCollection, { title: \"No Collections\", buttonLabel: 'New Collections', onClick: () => setOpen(true), children: \"Get started by creating a new Collections.\" })), _jsx(CreateCollectionModal, { isOpen: isOpen, onClose: () => setOpen(false) }), _jsx(ConfirmModal, { isOpen: !!collectionToDelete, title: \"Delete Collection\", content: \"Are you sure you want to delete this collection? This action cannot be undone.\", onConfirm: deleteCollection, onCancel: () => setCollectionToDelete(undefined) })] }));\n}\nexport function collectionIcon(isDynamic) {\n const tooltipText = isDynamic ? \"Dynamic Collection\" : \"Static Collection\";\n const icon = isDynamic ? _jsx(Search, { className: \"size-5\" }) : _jsx(FolderClosed, { className: \"size-5\" });\n return (_jsx(VTooltip, { description: tooltipText, className: \"mr-2\", children: icon }));\n}\n//# sourceMappingURL=CollectionsTable.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { TBody, Table } from \"@vertesia/ui/core\";\nimport { useNavigate } from \"@vertesia/ui/router\";\nimport dayjs from \"dayjs\";\nimport relativeTime from \"dayjs/plugin/relativeTime\";\ndayjs.extend(relativeTime);\nexport function ContentObjectTypesTable({ objects, isLoading }) {\n const navigate = useNavigate();\n return (_jsx(\"div\", { children: _jsxs(Table, { className: \"w-full\", children: [_jsx(\"thead\", { children: _jsxs(\"tr\", { children: [_jsx(\"th\", { children: \"Name\" }), _jsx(\"th\", { children: \"Strict Mode\" }), _jsx(\"th\", { children: \"Semantic Chunking\" }), _jsx(\"th\", { children: \"Updated At\" })] }) }), _jsx(TBody, { isLoading: isLoading, columns: 3, children: objects?.map((obj) => (_jsxs(\"tr\", { onClick: () => navigate(`/types/${obj.id}`), className: 'cursor-pointer hover:bg-muted', children: [_jsx(\"td\", { children: obj.name }), _jsx(\"td\", { children: obj.strict_mode ? 'Yes' : 'No' }), _jsx(\"td\", { children: obj.is_chunkable ? 'Yes' : 'No' }), _jsx(\"td\", { children: dayjs(obj.updated_at).fromNow() })] }, obj.id))) })] }) }));\n}\n//# sourceMappingURL=ContentObjectTypesTable.js.map","import { SharedState, useWatchSharedState } from \"@vertesia/ui/core\";\nimport { createContext, useContext } from \"react\";\nexport class ObjectTypeSearch {\n client;\n limit;\n result = new SharedState({ objects: [], isLoading: false });\n query = {};\n constructor(client, limit = 100) {\n this.client = client;\n this.limit = limit;\n }\n get objects() {\n return this.result.value.objects;\n }\n get error() {\n return this.result.value.error;\n }\n get isRunning() {\n return this.result.value.isLoading;\n }\n getFilterValue(name) {\n return this.query[name];\n }\n setFilterValue(name, value) {\n this.query[name] = value;\n this.search();\n }\n reset(isLoading = false) {\n this.result.value = {\n objects: [],\n isLoading\n };\n }\n _updateRunningState(value) {\n const prev = this.result.value;\n this.result.value = {\n objects: prev.objects,\n isLoading: value,\n error: prev.error\n };\n }\n async _search(loadMore = false) {\n if (this.isRunning) {\n return Promise.resolve(false);\n }\n this.result.value = {\n isLoading: true,\n objects: loadMore ? this.objects : [],\n };\n const limit = this.limit;\n const offset = this.objects.length;\n return this.client.types.list({\n limit,\n offset,\n query: this.query\n }).then(async (result) => {\n this.result.value = {\n isLoading: false,\n objects: this.objects.concat(result)\n };\n return true;\n }).catch((err) => {\n this.result.value = {\n error: err,\n isLoading: false,\n objects: this.objects\n };\n throw err;\n });\n }\n search() {\n if (this.isRunning) {\n return Promise.resolve(false);\n }\n return this._search(false);\n }\n loadMore() {\n if (this.isRunning) {\n return Promise.resolve(false);\n }\n return this._search(true);\n }\n}\nconst ObjectTypeSearchContext = createContext(undefined);\nexport function useSearch() {\n return useContext(ObjectTypeSearchContext);\n}\nexport function useWatchSearchResult() {\n const search = useSearch();\n const result = useWatchSharedState(search.result);\n return { ...result, search };\n}\nexport function useSearchCount() {\n const search = useSearch();\n return search.objects.length;\n}\nexport { ObjectTypeSearchContext };\n//# sourceMappingURL=ObjectTypeSearchContext.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { useState } from 'react';\nimport { Button, Input, Modal, ModalBody, ModalFooter, ModalTitle, useToast, Textarea } from '@vertesia/ui/core';\nexport function CreateOrUpdateTypeModal({ title, isOpen, onClose, okLabel, initialPayload }) {\n const toast = useToast();\n const [name, setName] = useState(initialPayload?.name);\n const [description, setDescription] = useState(initialPayload?.description);\n const [strictMode, setStrictMode] = useState(initialPayload?.strict_mode ?? false);\n const onSave = () => {\n if (!name) {\n toast({\n status: 'error',\n title: 'Name is required',\n duration: 5000\n });\n return;\n }\n const payload = { name, description, strict_mode: strictMode };\n onClose(payload).then(() => onClose());\n setName(undefined);\n setDescription(undefined);\n setStrictMode(false);\n };\n return (_jsxs(Modal, { isOpen: isOpen, onClose: () => onClose(), children: [_jsx(ModalTitle, { children: title }), _jsx(ModalBody, { className: \"pt-0\", children: _jsxs(\"div\", { className: 'h-full flex flex-col gap-4 content-between', children: [_jsxs(\"div\", { children: [_jsx(\"label\", { className: \"block text-sm font-medium text-muted\", children: \"Name\" }), _jsx(Input, { value: name, onChange: setName })] }), _jsxs(\"div\", { children: [_jsx(\"label\", { className: \"block text-sm font-medium text-muted\", children: \"Description\" }), _jsx(Textarea, { value: description, onChange: e => setDescription(e.target.value) })] })] }) }), _jsx(ModalFooter, { children: _jsxs(\"div\", { className: 'flex justify-end gap-4', children: [_jsx(Button, { variant: \"secondary\", onClick: () => onClose(), children: \"Cancel\" }), _jsx(Button, { variant: \"primary\", onClick: () => onSave(), children: okLabel })] }) })] }));\n}\n//# sourceMappingURL=CreateOrUpdateTypeModal.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { useEffect, useRef, useState } from 'react';\nimport { ContentObjectTypesTable } from './ContentObjectTypesTable';\nimport { useWatchSearchResult } from './search/ObjectTypeSearchContext';\nimport { useUserSession } from '@vertesia/ui/session';\nimport { EmptyCollection, ErrorBox, Input, SelectBox, useToast, useDebounce, useIntersectionObserver } from '@vertesia/ui/core';\nimport { CreateOrUpdateTypeModal } from './CreateOrUpdateTypeModal';\nvar ChunkableOptions;\n(function (ChunkableOptions) {\n ChunkableOptions[\"true\"] = \"Yes\";\n ChunkableOptions[\"false\"] = \"No\";\n})(ChunkableOptions || (ChunkableOptions = {}));\n;\nexport function ContentObjectTypesSearch({ isDirty = false }) {\n const session = useUserSession();\n const { store } = session;\n const toast = useToast();\n const [isReady, setIsReady] = useState(false);\n const { search, isLoading, error, objects } = useWatchSearchResult();\n const [searchTerm, setSearchTerm] = useState('');\n const debounceValue = useDebounce(searchTerm, 500);\n const loadMoreRef = useRef(null);\n useIntersectionObserver(loadMoreRef, () => {\n isReady && search.loadMore();\n }, { deps: [isReady] });\n useEffect(() => {\n search.search().then(() => setIsReady(true));\n }, []);\n useEffect(() => {\n search.query.name = searchTerm;\n search.search().then(() => setIsReady(true));\n }, [debounceValue]);\n const [chunkable, setChunkable] = useState(undefined);\n const onChunkableChange = (data) => {\n setChunkable(data);\n };\n useEffect(() => {\n search.query.chunkable = chunkable ? chunkable == 'Yes' : undefined;\n search.search().then(() => setIsReady(true));\n }, [chunkable]);\n useEffect(() => {\n if (isDirty && isReady) {\n search.search().then(() => setIsReady(true));\n }\n }, [isDirty]);\n const [showCreateModal, setShowCreateModal] = useState(false);\n const onOpenCreateModal = () => {\n setShowCreateModal(true);\n };\n if (error) {\n return (_jsx(ErrorBox, { title: \"Failed to fetch ObjectTypes\", children: error.message }));\n }\n ;\n const onCloseCreateModal = async (payload) => {\n if (!payload) {\n setShowCreateModal(false);\n return Promise.resolve();\n }\n return store.types.create(payload).then(async () => {\n toast({\n status: 'success',\n title: 'Type created',\n duration: 2000\n });\n session.reloadTypes();\n search.search().then(() => setIsReady(true));\n }).catch(err => {\n toast({\n status: 'error',\n title: 'Error creating type',\n description: err.message,\n duration: 5000\n });\n });\n };\n return (_jsxs(\"div\", { className: 'flex flex-col gap-4 h-full', children: [_jsxs(\"div\", { className: \"flex gap-4\", children: [_jsx(Input, { placeholder: \"Filter by Name\", value: searchTerm, onChange: setSearchTerm }), _jsx(SelectBox, { className: \"w-60\", isClearable: true, options: Object.values(ChunkableOptions), value: chunkable, onChange: onChunkableChange, placeholder: \"Is Chunkable\" })] }), _jsxs(\"div\", { className: \"flex-1\", children: [(!isLoading && objects?.length === 0) ?\n _jsx(EmptyCollection, { title: \"No Type\", buttonLabel: 'Create Type', onClick: onOpenCreateModal, children: \"Get started by creating a new Type.\" })\n :\n _jsx(ContentObjectTypesTable, { objects: objects, isLoading: isLoading }), _jsx(CreateOrUpdateTypeModal, { okLabel: \"Create\", title: \"Create Type\", isOpen: showCreateModal, onClose: onCloseCreateModal })] })] }));\n}\n//# sourceMappingURL=ContentObjectTypesSearch.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { basicSetup } from 'codemirror';\nimport { useMemo, useRef, useState } from 'react';\nimport { useUserSession } from '@vertesia/ui/session';\nimport { json } from '@codemirror/lang-json';\nimport { CodeMirrorEditor, SchemaEditor, useSchema } from '@vertesia/ui/widgets';\nimport { Button, useToast } from '@vertesia/ui/core';\nimport { Ajv } from \"ajv\";\nconst CODE_MIRROR_EXTENSIONS = [basicSetup, json()];\nexport function ObjectSchemaEditor({ objectType, onSchemaUpdate }) {\n const { store } = useUserSession();\n const toast = useToast();\n const [isUpdating, setUpdating] = useState(false);\n const schema = useSchema(objectType.object_schema);\n const editorRef = useRef(undefined);\n const [displayJson, setDisplayJson] = useState(false);\n const value = useMemo(() => {\n return jsonToContent(schema.schema);\n }, [schema]);\n const onSave = () => {\n if (displayJson) {\n if (!updateSchemaFromJson()) {\n return;\n }\n }\n setUpdating(true);\n store.types.update(objectType.id, { object_schema: schema.schema }).then(() => {\n onSchemaUpdate(schema);\n toast({\n status: 'success',\n title: 'Schema updated',\n description: 'The schema has been updated successfully',\n duration: 2000\n });\n }).catch((err) => {\n toast({\n status: 'error',\n title: 'Failed to update schema',\n description: err.message,\n duration: 5000\n });\n }).finally(() => {\n setUpdating(false);\n });\n };\n const handleOnSave = () => {\n if (displayJson) {\n if (!updateSchemaFromJson()) {\n return;\n }\n }\n setDisplayJson(prev => !prev);\n };\n const updateSchemaFromJson = () => {\n if (editorRef.current) {\n const value = editorRef.current.getValue();\n try {\n const newSchema = contentToJson(value);\n validateSchema(newSchema);\n schema.replaceSchema(newSchema);\n }\n catch (err) {\n toast({\n status: 'error',\n title: 'Invalid JSON Schema',\n description: err.message,\n duration: 5000\n });\n return false;\n }\n }\n return true;\n };\n return (_jsxs(\"div\", { className: \"mx-2 my-2 rounded-2xl border border-solid shadow-md border-spacing-2\", children: [_jsxs(\"div\", { className: \"flex items-center rounded-t-md border-b gap-x-2 py-2 pl-4 pr-2\", children: [_jsx(\"div\", { className: \"text-base font-semibold\", children: \"Schema Editor\" }), _jsx(\"div\", { children: _jsx(Button, { variant: \"outline\", size: \"sm\", onClick: handleOnSave, children: displayJson ? \"Edit Schema\" : \"Edit Json\" }) }), _jsx(\"div\", { className: \"ml-auto flex gap-x-2\", children: _jsx(Button, { isLoading: isUpdating, variant: \"outline\", size: \"sm\", onClick: onSave, children: \"Save Changes\" }) })] }), _jsx(\"div\", { className: \"px-4 py-2\", children: displayJson\n ? _jsx(CodeMirrorEditor, { value: value, extensions: CODE_MIRROR_EXTENSIONS, editorRef: editorRef })\n : _jsx(SchemaEditor, { schema: schema }) })] }));\n}\nfunction jsonToContent(json) {\n if (!json) {\n return '';\n }\n return JSON.stringify(json, null, 2);\n}\nfunction contentToJson(content) {\n if (!content?.trim()) {\n return undefined;\n }\n return JSON.parse(content.trim());\n}\nconst validateSchema = (schema) => {\n try {\n const ajv = new Ajv({\n strict: false, // Enable strict mode to ensure all properties are validated\n });\n // Compile the schema. This implicitly validates the schema definition\n // against the JSON Schema draft that ajv supports by default.\n ajv.compile(schema);\n }\n catch (error) {\n throw new Error(`Invalid JSON Schema definition: ${error.message}`);\n }\n};\n//# sourceMappingURL=ObjectSchemaEditor.js.map","import { jsx as _jsx } from \"react/jsx-runtime\";\nimport { useUserSession } from \"@vertesia/ui/session\";\nimport { useMemo } from \"react\";\nimport { ObjectTypeSearch, ObjectTypeSearchContext } from \"./ObjectTypeSearchContext\";\nexport function ObjectTypeSearchProvider({ children, limit, name, chunkable: chunkable }) {\n const { store } = useUserSession();\n const search = useMemo(() => {\n const search = new ObjectTypeSearch(store, limit);\n search.query.name = name;\n search.query.chunkable = chunkable;\n return search;\n }, [limit]);\n return (_jsx(ObjectTypeSearchContext.Provider, { value: search, children: children }));\n}\n//# sourceMappingURL=ObjectTypeSearchProvider.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { useState } from \"react\";\nimport { Button, Modal, ModalBody, ModalFooter, ModalTitle, SelectBox, } from \"@vertesia/ui/core\";\nimport { useUserSession } from \"@vertesia/ui/session\";\nimport { CheckCircleIcon } from \"lucide-react\";\n/**\n * A dedicated modal for selecting content types.\n *\n * This is a lightweight modal specifically for selecting a content type,\n * without any file upload functionality. Used for changing types, setting\n * types in other contexts, etc.\n */\nexport function SelectContentTypeModal({ isOpen, onClose, title = \"Select Content Type\", children, initialSelectedType = null, confirmLabel = \"Select Type\", allowNone = true, }) {\n const { typeRegistry } = useUserSession();\n const [selectedType, setSelectedType] = useState(initialSelectedType);\n // Get available types from the registry\n const types = typeRegistry?.types || [];\n // Handle close/cancel\n const handleClose = () => {\n onClose(undefined);\n };\n // Handle type selection and confirmation\n const handleConfirm = () => {\n onClose(selectedType?.id ?? null);\n };\n return (_jsxs(Modal, { isOpen: isOpen, onClose: handleClose, className: \"w-full max-w-xl mx-auto\", children: [_jsx(ModalTitle, { children: title }), _jsxs(ModalBody, { className: \"p-6\", children: [children, _jsxs(\"div\", { className: \"mb-4 mt-4\", children: [_jsxs(\"label\", { className: \"block text-sm font-medium mb-2\", children: [\"Content Type \", allowNone && _jsx(\"span\", { className: \"text-gray-500 font-normal\", children: \"(Optional)\" })] }), allowNone ? (_jsx(SelectBox, { options: types, value: selectedType, optionLabel: (type) => type ? type.name : 'Select a content type', placeholder: \"Select a content type or leave empty for automatic detection\", onChange: (selected) => setSelectedType(selected || null), filterBy: \"name\", isClearable: true })) : (_jsx(SelectBox, { options: types, value: selectedType, optionLabel: (type) => type ? type.name : 'Select a content type', placeholder: \"Select a content type\", onChange: (selected) => setSelectedType(selected || null), filterBy: \"name\" })), allowNone && (_jsxs(\"div\", { className: \"mt-2 text-sm text-blue-600 flex items-center\", children: [_jsx(CheckCircleIcon, { className: \"h-4 w-4 mr-1\" }), _jsxs(\"span\", { children: [_jsx(\"strong\", { children: \"Type selection is optional.\" }), \" Leave empty to let Vertesia choose the appropriate type\"] })] }))] }), selectedType ? (_jsxs(\"div\", { className: \"text-sm text-gray-500 bg-gray-50 p-3 rounded-md mb-4\", children: [_jsx(\"div\", { className: \"font-medium\", children: selectedType.name }), selectedType.description && (_jsx(\"div\", { className: \"mt-1\", children: selectedType.description }))] })) : allowNone && (_jsxs(\"div\", { className: \"text-sm text-blue-600 bg-blue-50 p-3 rounded-md mb-4\", children: [_jsx(\"div\", { className: \"font-medium\", children: \"Automatic Type Detection\" }), _jsxs(\"div\", { className: \"mt-1\", children: [\"Vertesia will analyze each file's content and automatically select the most appropriate type.\", _jsx(\"br\", {}), _jsx(\"span\", { className: \"mt-1 block font-medium\", children: \"This is recommended for most uploads.\" })] })] }))] }), _jsxs(ModalFooter, { children: [_jsx(Button, { variant: \"ghost\", onClick: handleClose, children: \"Cancel\" }), _jsx(Button, { onClick: handleConfirm, children: selectedType ? `${confirmLabel}: ${selectedType.name}` : allowNone ? \"Let Vertesia Choose\" : confirmLabel })] })] }));\n}\n//# sourceMappingURL=SelectContentTypeModal.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { basicSetup } from 'codemirror';\nimport { useMemo, useRef, useState } from 'react';\nimport { json } from '@codemirror/lang-json';\nimport { Button, useToast } from '@vertesia/ui/core';\nimport { useUserSession } from '@vertesia/ui/session';\nimport { CodeMirrorEditor } from '@vertesia/ui/widgets';\nconst extensions = [basicSetup, json()];\nexport function TableLayoutEditor({ objectType, onLayoutUpdate }) {\n const toast = useToast();\n const [isUpdating, setUpdating] = useState(false);\n const { store } = useUserSession();\n const editorRef = useRef(undefined);\n const value = useMemo(() => {\n return stringifyTableLayout(objectType.table_layout);\n }, [objectType.table_layout]);\n const validationError = (title, message) => {\n toast({\n status: 'error',\n title: title,\n description: message,\n duration: 5000\n });\n };\n const onSave = () => {\n if (!editorRef.current) {\n return;\n }\n const value = editorRef.current.getValue();\n let table_layout;\n if (!value) {\n table_layout = null;\n }\n else {\n try {\n table_layout = JSON.parse(value);\n }\n catch (err) {\n return validationError('Invalid JSON', err.message);\n }\n }\n if (!Array.isArray(table_layout)) {\n return validationError('Invalid JSON', 'The table layout must be an array');\n }\n if (table_layout.some((col) => !col || !col.name || !col.field)) {\n return validationError('Invalid JSON', 'A table layout entry must contain the following properties:] {field, name, converter?}');\n }\n setUpdating(true);\n store.types.update(objectType.id, {\n table_layout\n }).then((response) => {\n toast({\n status: 'success',\n title: 'Table Layout updated',\n description: 'The table layout has been updated successfully',\n duration: 2000\n });\n onLayoutUpdate(response.table_layout);\n }).catch((err) => {\n toast({\n status: 'error',\n title: 'Failed to update table layout',\n description: err.message,\n duration: 5000\n });\n }).finally(() => {\n setUpdating(false);\n });\n };\n return (_jsxs(\"div\", { className: \"mx-2 my-2 rounded-2xl border border-solid shadow-xs\", children: [_jsxs(\"div\", { className: \"flex items-center rounded-t-md border-b gap-x-2 py-2 pl-4 pr-2\", children: [_jsx(\"div\", { className: \"text-base font-semibold \", children: \"Table Layout Editor\" }), _jsx(\"div\", { className: \"ml-auto flex gap-x-2\", children: _jsx(Button, { isLoading: isUpdating, variant: \"outline\", size: \"sm\", onClick: onSave, children: \"Save Changes\" }) })] }), _jsx(\"div\", { className: \"px-4 py-2\", children: _jsx(CodeMirrorEditor, { value: value, extensions: extensions, editorRef: editorRef }) })] }));\n}\nexport function stringifyTableLayout(obj) {\n if (!obj) {\n return '[\\n\\n]';\n }\n return JSON.stringify(obj, null, 2);\n}\n//# sourceMappingURL=TableLayoutEditor.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { json } from \"@codemirror/lang-json\";\nimport dayjs from \"dayjs\";\nimport { basicSetup } from \"codemirror\";\nimport { useMemo, useRef, useState } from \"react\";\nimport { UserInfo } from \"@vertesia/ui/features\";\nimport { useUserSession } from \"@vertesia/ui/session\";\nimport { CodeMirrorEditor, GeneratedForm, ManagedObject } from \"@vertesia/ui/widgets\";\nimport { Button, ErrorBox, FormItem, Input, Styles, Textarea, useFetch, useToast, Panel } from \"@vertesia/ui/core\";\nimport { SelectContentType, stringifyTableLayout } from \"../types\";\nconst extensions = [basicSetup, json()];\nexport function EditCollectionView({ refetch, collection }) {\n const typeId = collection.type?.id;\n const tableLayoutRef = useRef(undefined);\n const toast = useToast();\n const { client } = useUserSession();\n const [isUpdating, setUpdating] = useState(false);\n const [metadata, setMetadata] = useState({\n name: collection.name,\n description: collection.description || \"\",\n query: collection.query ? JSON.stringify(collection.query, null, 2) : \"\",\n tags: collection.tags || [],\n type: collection.type?.id || \"\",\n allowed_types: collection.allowed_types || [],\n });\n const tableLayoutValue = useMemo(() => {\n return stringifyTableLayout(collection.table_layout);\n }, [collection.table_layout]);\n const onSubmit = () => {\n let query = undefined;\n try {\n query = metadata.query ? JSON.parse(metadata.query) : undefined;\n }\n catch (err) {\n toast({\n title: \"Invalid Query JSON\",\n description: err.message,\n status: \"error\",\n duration: 5000,\n });\n return;\n }\n const payload = {\n name: metadata.name,\n description: metadata.description,\n query: query,\n tags: metadata.tags,\n type: metadata.type,\n allowed_types: metadata.allowed_types,\n };\n let error;\n if (!payload.name) {\n error = \"Name is required\";\n }\n if (!payload.type) {\n payload.type = null;\n }\n if (error) {\n toast({\n title: \"Validation failed\",\n description: error,\n status: \"error\",\n duration: 5000,\n });\n return;\n }\n if (tableLayoutRef.current) {\n const layout = tableLayoutRef.current.getValue();\n if (layout) {\n try {\n payload.table_layout = JSON.parse(layout);\n }\n catch (err) {\n toast({\n title: \"Invalid Table Layout\",\n description: err.message,\n status: \"error\",\n duration: 5000,\n });\n return;\n }\n }\n else {\n payload.table_layout = null;\n }\n }\n setUpdating(true);\n client.store.collections\n .update(collection.id, payload)\n .then(() => {\n refetch();\n toast({\n title: \"Collection updated\",\n description: \"Collection has been updated successfully\",\n status: \"success\",\n duration: 3000,\n });\n })\n .catch((err) => {\n toast({\n title: \"Failed to update collection\",\n description: err.message,\n status: \"error\",\n duration: 5000,\n });\n })\n .finally(() => {\n setUpdating(false);\n });\n };\n const setField = (name, value) => {\n setMetadata({\n ...metadata,\n [name]: value,\n });\n };\n return (_jsxs(\"div\", { className: \"flex flex-col gap-4 py-2\", children: [_jsxs(Panel, { title: \"Configuration\", action: _jsx(Button, { size: \"lg\", isDisabled: isUpdating, onClick: onSubmit, children: \"Save\" }), children: [_jsxs(\"div\", { className: \"flex justify-between mb-2\", children: [_jsxs(\"div\", { className: \"w-1/2 gap-2 flex flex-col\", children: [_jsx(\"div\", { className: \"text-sm font-medium mb-1\", children: \"Created By\" }), _jsxs(\"div\", { className: \"gap-2 flex items-center\", children: [_jsx(UserInfo, { userRef: collection.created_by, showTitle: true }), _jsxs(\"span\", { children: [\"at \", dayjs(collection.created_at).format(\"YYYY-MM-DD HH:mm:ss\")] })] })] }), _jsxs(\"div\", { className: \"w-1/2 gap-2 flex flex-col\", children: [_jsx(\"div\", { className: \"text-sm font-medium mb-1\", children: \"Updated By\" }), _jsxs(\"div\", { className: \"gap-2 flex items-center\", children: [_jsx(UserInfo, { userRef: collection.updated_by, showTitle: true }), _jsxs(\"span\", { children: [\"at \", dayjs(collection.updated_at).format(\"YYYY-MM-DD HH:mm:ss\")] })] })] })] }), _jsx(FormItem, { label: \"Name\", required: true, children: _jsx(Input, { value: metadata.name, onChange: (v) => setField(\"name\", v) }) }), _jsx(FormItem, { label: \"Description\", children: _jsx(Textarea, { value: metadata.description, onChange: (e) => setField(\"description\", e) }) }), !collection.dynamic &&\n _jsx(FormItem, { label: \"Allowed Content Types\", description: \"Select which content types can be added to the collection. If not set, then all content types are allowed.\", children: _jsx(SelectContentType, { defaultValue: metadata.allowed_types || null, onChange: (v) => {\n if (Array.isArray(v)) {\n setField(\"allowed_types\", v.map(type => type.id));\n }\n else {\n setField(\"allowed_types\", v ? [v.id] : []);\n }\n }, isClearable: true, multiple: true }) }), collection.dynamic && (_jsx(FormItem, { label: \"Query\", description: \"Define the query to dynamically fetch content for the collection.\", children: _jsx(Textarea, { className: Styles.INPUT, value: metadata.query, onChange: (e) => setField(\"query\", e) }) })), _jsx(FormItem, { label: \"Table Layout\", description: \"Define a custom layout for displaying the collection in tables.\", children: _jsx(CodeMirrorEditor, { className: \"border-1 rounded-md border-border\", value: tableLayoutValue, extensions: extensions, editorRef: tableLayoutRef }) }), _jsx(FormItem, { label: \"Type\", description: \"Select a content type to assign custom properties and data to the collection.\", children: _jsx(SelectContentType, { defaultValue: metadata.type || null, onChange: (v) => {\n if (Array.isArray(v)) {\n setField(\"type\", v.length > 0 ? v[0].id : null);\n }\n else {\n setField(\"type\", v?.id || null);\n }\n }, isClearable: true }) })] }), typeId && _jsx(PropertiesEditor, { typeId: typeId, collection: collection })] }));\n}\nfunction PropertiesEditor({ typeId, collection }) {\n const toast = useToast();\n const { client } = useUserSession();\n const [isUpdating, setIsUpdating] = useState(false);\n const { data: type, error } = useFetch(() => client.store.types.retrieve(typeId), [typeId]);\n const schema = type?.object_schema || {};\n const object = useMemo(() => new ManagedObject(schema, collection.properties || {}), [schema, collection.properties]);\n if (error) {\n return _jsx(ErrorBox, { title: \"Failed to load type\", children: error.message });\n }\n if (!type) {\n return null;\n }\n const _onSave = (data) => {\n const payload = { properties: data || {} };\n setIsUpdating(true);\n client.store.collections\n .update(collection.id, payload)\n .then(() => {\n toast({\n title: \"Collection properties updated\",\n description: \"Collection has been updated successfully\",\n status: \"success\",\n duration: 3000,\n });\n })\n .catch((err) => {\n toast({\n title: \"Failed to update collection properties\",\n description: err.message,\n status: \"error\",\n duration: 5000,\n });\n })\n .finally(() => {\n setIsUpdating(false);\n });\n };\n return (_jsx(Panel, { title: \"Properties\", action: _jsx(Button, { size: \"lg\", isLoading: isUpdating, type: \"submit\", children: \"Save\" }), children: _jsx(GeneratedForm, { object: object, onSubmit: _onSave }) }));\n}\n//# sourceMappingURL=EditCollectionView.js.map","import { jsx as _jsx } from \"react/jsx-runtime\";\nimport { useCallback } from \"react\";\nimport { ErrorBox, useFetch, VSelectBox } from \"@vertesia/ui/core\";\nimport { useUserSession } from \"@vertesia/ui/session\";\nfunction getLabel(option) {\n return option.name;\n}\nexport function SelectCollection({ onChange, value, disabled = false, placeholder = \"Select a collection\", filterOut, allowDynamic = true, multiple = false }) {\n const { client } = useUserSession();\n // Handle collection selection\n const handleSelect = useCallback((collection) => {\n if (multiple) {\n // Multiple selection mode\n const selectedCollections = collection;\n if (selectedCollections && selectedCollections.length > 0) {\n const ids = selectedCollections.map(c => c.id);\n onChange(ids, selectedCollections);\n }\n else {\n onChange(undefined);\n }\n }\n else {\n // Single selection mode\n const selectedCollection = collection;\n if (selectedCollection) {\n onChange(selectedCollection.id, selectedCollection);\n }\n else {\n onChange(undefined);\n }\n }\n }, [onChange, multiple]);\n // Fetch collections\n const { data: collections, error } = useFetch(async () => {\n const allCollections = await client.store.collections.search({\n dynamic: allowDynamic ? undefined : false\n });\n // Filter out collections if filterOut is provided\n if (filterOut && filterOut.length > 0) {\n return allCollections.filter(col => !filterOut.includes(col.id));\n }\n return allCollections;\n }, [client, allowDynamic, filterOut]);\n if (error) {\n return _jsx(ErrorBox, { title: \"Error\", children: error.message || String(error) });\n }\n // Find the selected collection(s) from the value (collection ID(s))\n const selectedCollection = multiple\n ? collections?.filter(col => Array.isArray(value) && value.includes(col.id)) || []\n : collections?.find(col => col.id === value) || null;\n return (multiple ? (_jsx(VSelectBox, { className: \"w-full\", by: \"id\", value: selectedCollection, filterBy: \"name\", options: collections || [], disabled: disabled, optionLabel: (option) => getLabel(option), placeholder: placeholder, onChange: handleSelect, isClearable: true, multiple: multiple })) : (_jsx(VSelectBox, { className: \"w-full\", by: \"id\", value: selectedCollection, filterBy: \"name\", options: collections || [], disabled: disabled, optionLabel: (option) => getLabel(option), placeholder: placeholder, onChange: handleSelect, isClearable: true, multiple: multiple })));\n}\n//# sourceMappingURL=SelectCollection.js.map","import { jsxs as _jsxs, jsx as _jsx } from \"react/jsx-runtime\";\nimport { useToast } from \"@vertesia/ui/core\";\nimport { useUserSession } from \"@vertesia/ui/session\";\nimport { useCallback, useState } from \"react\";\nimport { SelectContentTypeModal } from \"../../../types\";\nimport { useObjectsActionCallback } from \"../ObjectsActionContext\";\nexport function ChangeTypeActionComponent({ action, objectIds, children }) {\n const { store } = useUserSession();\n const toast = useToast();\n const [isOpen, setOpen] = useState(false);\n const callback = useCallback(() => {\n setOpen(true);\n return Promise.resolve(true);\n }, []);\n useObjectsActionCallback(action.id, callback);\n const handleTypeSelect = (typeId) => {\n // Close the modal\n setOpen(false);\n // If no selection was made\n if (typeId === undefined) {\n return;\n }\n // Execute the operation with the selected typeId\n store.runOperation({\n name: \"change_type\",\n ids: objectIds,\n params: { typeId }\n }).then((r) => {\n toast({\n status: 'success',\n title: 'Change Type',\n description: `Change the type of ${objectIds.length} objects is ${r.status === 'in_progress' ? 'in progress' : 'completed'}`,\n duration: 2000\n });\n }).catch(err => {\n toast({\n status: 'error',\n title: 'Error changing type',\n description: err.message,\n duration: 5000\n });\n });\n };\n return (_jsxs(\"div\", { children: [children, _jsx(SelectContentTypeModal, { isOpen: isOpen, onClose: handleTypeSelect, title: \"Change Content Type\", confirmLabel: \"Change Type\", children: _jsxs(\"div\", { className: \"text-sm flex flex-col gap-x-2\", children: [_jsxs(\"p\", { children: [\"Choose a new Content Type for the selected object\", objectIds.length > 1 ? 's' : ' ', \"or let the system choose or generate a type based on the content.\"] }), _jsxs(\"p\", { className: \"pt-2 text-xs\", children: [\"Note: This action will raise the \", _jsx(\"code\", { children: \"change_type\" }), \" event and will trigger the standard intake workflows which may reset the object properties.\"] })] }) })] }));\n}\nexport const ChangeTypeAction = {\n id: \"changeType\",\n name: 'Change Content Type',\n description: 'Change the Content Type of the selected documents',\n confirm: false,\n component: ChangeTypeActionComponent,\n};\n//# sourceMappingURL=ChangeTypeAction.js.map","import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { ConfirmModal } from \"@vertesia/ui/core\";\nimport { useCallback, useState } from \"react\";\nimport { useObjectsActionCallback } from \"../ObjectsActionContext\";\n/**\n * Generic implementation of an action component.\n * The action component is not the one which is clicked by the user, but the one that is registering the action callback.\n * @param param0\n * @returns\n */\nexport default function ConfirmAction({ action, callback, children }) {\n const [showConfirmModal, setShowConfirmModal] = useState(false);\n const confirmationText = action.confirmationText || `Are you sure you want to ${action.name}?`;\n const _callback = useCallback((params) => {\n if (action.confirm) {\n setShowConfirmModal(true);\n return Promise.resolve(true);\n }\n else {\n return callback(params);\n }\n }, [action.confirm, callback]);\n const ctx = useObjectsActionCallback(action.id, _callback);\n const onConfirm = () => {\n setShowConfirmModal(false);\n callback({ ...ctx.params, action });\n };\n return (_jsxs(_Fragment, { children: [children, _jsx(ConfirmModal, { onConfirm: onConfirm, onCancel: () => setShowConfirmModal(false), title: \"Are you sure?\", content: confirmationText, isOpen: showConfirmModal })] }));\n}\n//# sourceMappingURL=ConfirmAction.js.map","import { jsx as _jsx } from \"react/jsx-runtime\";\nimport { useCallback } from 'react';\nimport { useToast } from '@vertesia/ui/core';\nimport { useNavigate } from \"@vertesia/ui/router\";\nimport { useUserSession } from '@vertesia/ui/session';\nimport { useDocumentSearch } from '../../search/DocumentSearchContext';\nimport { useObjectsActionContext } from '../ObjectsActionContext';\nimport ConfirmAction from './ConfirmAction';\nexport function DeleteObjectsActionComponent({ action, objectIds, children }) {\n const ctx = useObjectsActionContext();\n const toast = useToast();\n const { client } = useUserSession();\n const search = useDocumentSearch();\n const navigate = useNavigate();\n const callback = useCallback(() => {\n if (!objectIds || !objectIds.length) {\n toast({\n status: 'error',\n title: 'No objects selected',\n description: 'Please select objects to delete',\n duration: 3000\n });\n return Promise.resolve(false);\n }\n function limitFilesName(names, maxLength) {\n if (names.length <= maxLength)\n return names;\n const extIndex = names.lastIndexOf('.');\n const ext = extIndex !== -1 ? names.substring(extIndex) : '';\n const baseName = extIndex !== -1 ? names.substring(0, extIndex) : names;\n const limitedBaseName = baseName.substring(0, maxLength - ext.length - 3);\n return `${limitedBaseName}...${ext}`;\n }\n return Promise.all(objectIds.map(id => client.store.objects.delete(id))).then((res) => {\n const plural = res.length > 1 ? 's' : '';\n toast({\n status: 'success',\n title: `${res.length} object${plural} deleted`,\n description: `Objects ${(limitFilesName(res.map(d => d.id).join(\", \"), 100))} have been deleted`,\n duration: 2000\n });\n if (search) { // we are in the objects table view\n ctx.params?.selection?.removeAll();\n const facets = JSON.parse(JSON.stringify(search.facets));\n if (objectIds.length === facets._value.total) {\n search.resetFacets();\n }\n search.search();\n }\n else {\n // we are in the object view\n // go back to the parent\n navigate(\"/objects\");\n }\n }).catch(err => {\n toast({\n status: 'error',\n title: 'Error deleting objects',\n description: err.message,\n duration: 5000\n });\n });\n }, [objectIds]);\n return (_jsx(ConfirmAction, { action: action, callback: callback, children: children }));\n}\nexport const DeleteObjectsAction = {\n id: 'delete',\n name: 'Delete',\n description: 'Delete the selected objects',\n confirm: true,\n confirmationText: 'Are you sure you want to delete all the selected objects? This action cannot be undone.',\n component: DeleteObjectsActionComponent,\n destructive: true\n};\nexport const DeleteObjectsFromCollectionsAction = {\n id: 'deleteFromCollections',\n name: 'Delete Objects',\n description: 'Delete the selected objects',\n confirm: true,\n confirmationText: 'Are you sure you want to delete the selected objects?\\nThis is not removable from collections.',\n component: DeleteObjectsActionComponent,\n destructive: true\n};\n//# sourceMappingURL=DeleteObjectsAction.js.map","import { jsx as _jsx } from \"react/jsx-runtime\";\nimport { useToast } from \"@vertesia/ui/core\";\nimport { useUserSession } from \"@vertesia/ui/session\";\nimport { useCallback, useState } from \"react\";\nimport { ExportPropertiesModal, ExportTypes } from \"../../ExportPropertiesModal\";\nimport { useObjectsActionCallback } from \"../ObjectsActionContext\";\nexport function ExportPropertiesComponent({ action, objectIds }) {\n const { store } = useUserSession();\n const toast = useToast();\n const [isOpen, setOpen] = useState(false);\n const [isExporting, setIsExporting] = useState(false);\n const callback = useCallback(() => {\n setOpen(true);\n return Promise.resolve(true);\n }, []);\n const ctx = useObjectsActionCallback(action.id, callback);\n const onExportType = (exportType, exportAll) => {\n if (exportType && (exportAll || objectIds.length > 0)) {\n setIsExporting(true);\n const query = ctx.params?.search?.query || {};\n const search_objectIds = ctx.params?.search?.result?.value?.objects?.map(obj => obj.id) || undefined;\n const getChildObjects = async (objectId) => {\n return store.objects.list({\n query: {\n parent: objectId,\n }\n }).then((response) => {\n return response.map(obj => obj.id);\n });\n };\n const getObjectIds = async () => {\n if (exportAll) {\n // If there is a vector search use that.\n if (search_objectIds) {\n return query.vector ? search_objectIds : [];\n }\n // Nothing is selected, export all objects.\n if (objectIds.length === 0) {\n return [];\n }\n // If there is no search, and 1 object is selected we are on the object page.\n // Export all children of the object and the object itself.\n return (await getChildObjects(objectIds[0])).concat(objectIds);\n }\n else {\n return objectIds;\n }\n };\n getObjectIds().then((Ids) => {\n // When exporting all, send search result if a vector search was used\n // otherwise send the query.\n store.objects.exportProperties({\n objectIds: Ids,\n type: exportType,\n query: exportAll && !query.vector ? query : { type: query.type },\n }).then((response) => {\n let data;\n if (exportType === ExportTypes.CSV) {\n data = new Blob([response.data], { type: response.type });\n }\n else if (exportType === ExportTypes.JSON) {\n data = new Blob([JSON.stringify(response.data)], { type: response.type });\n }\n else {\n const responseData = response.data;\n data = new Blob([new Uint8Array(responseData.data)], { type: response.type });\n }\n const url = window.URL.createObjectURL(data);\n const a = document.createElement('a');\n a.download = response.name;\n a.href = url;\n a.click();\n toast({\n status: 'success',\n title: 'Export Properties',\n description: exportAll ? 'Export the properties of all objects completed'\n : `Export the properties of ${objectIds.length} object${objectIds.length > 1 ? 's' : ''} is completed`,\n duration: 2000\n });\n }).catch(err => {\n toast({\n status: 'error',\n title: 'Error Export Properties',\n description: err.message,\n duration: 5000\n });\n }).finally(() => {\n setIsExporting(false);\n setOpen(false);\n });\n });\n }\n else {\n setOpen(false);\n }\n };\n return (_jsx(\"div\", { children: _jsx(ExportPropertiesModal, { isExporting: isExporting, isOpen: isOpen, onClose: onExportType }) }));\n}\nexport const ExportPropertiesAction = {\n id: \"exportProperties\",\n name: 'Export Properties',\n description: 'Export all Object Properties',\n confirm: false,\n component: ExportPropertiesComponent,\n};\n//# sourceMappingURL=ExportPropertiesAction.js.map","import { jsx as _jsx } from \"react/jsx-runtime\";\nimport { useCallback } from 'react';\nimport { useToast } from '@vertesia/ui/core';\nimport { useUserSession } from '@vertesia/ui/session';\nimport { useDocumentSearch } from '../../search';\nimport { useObjectsActionContext } from '../ObjectsActionContext';\nimport ConfirmAction from './ConfirmAction';\nexport function RemoveFromCollectionActionComponent({ action, objectIds, collectionId }) {\n const ctx = useObjectsActionContext();\n const toast = useToast();\n const { client } = useUserSession();\n const search = useDocumentSearch();\n const callback = useCallback(() => {\n if (!objectIds || !objectIds.length) {\n toast({\n status: 'error',\n title: 'No objects selected',\n description: 'Please select objects to remove from collection',\n duration: 3000\n });\n return Promise.resolve(false);\n }\n if (!collectionId) {\n toast({\n status: 'error',\n title: 'No collection context',\n description: 'Cannot remove objects: no collection specified',\n duration: 3000\n });\n return Promise.resolve(false);\n }\n return client.store.collections.deleteMembers(collectionId, objectIds).then(() => {\n const plural = objectIds.length > 1 ? 's' : '';\n toast({\n status: 'success',\n title: `${objectIds.length} object${plural} removed from collection`,\n description: `Objects have been removed from the collection`,\n duration: 2000\n });\n if (search) {\n ctx.params?.selection?.removeAll();\n search.search();\n }\n }).catch((err) => {\n toast({\n status: 'error',\n title: 'Error removing objects from collection',\n description: err.message,\n duration: 5000\n });\n });\n }, [objectIds, collectionId]);\n return (_jsx(ConfirmAction, { action: action, callback: callback }));\n}\nexport const RemoveFromCollectionAction = {\n id: 'removeFromCollection',\n name: 'Remove from Collection',\n description: 'Remove the selected objects from this collection',\n confirm: true,\n confirmationText: 'Are you sure you want to remove the selected objects from this collection?',\n component: RemoveFromCollectionActionComponent,\n destructive: true\n};\n//# sourceMappingURL=RemoveFromCollectionAction.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { useUserSession } from \"@vertesia/ui/session\";\nimport { Button, VModal, VModalBody, VModalFooter, VModalTitle, SelectList, useToast } from \"@vertesia/ui/core\";\nimport { useCallback, useState } from \"react\";\nimport { useObjectsActionCallback, useObjectsActionContext } from \"../ObjectsActionContext\";\nexport function StartWorkflowComponent({ action, objectIds, collectionId }) {\n const toast = useToast();\n const { client } = useUserSession();\n const [isOpen, setOpen] = useState(false);\n const callback = useCallback(() => {\n setOpen(true);\n return Promise.resolve(true);\n }, []);\n const onStartWorkflow = (workflowId) => {\n setOpen(false);\n if (!workflowId) {\n return;\n }\n // const objectIds = params.selection.getObjectIds();\n // const workflowId = params.action.id;\n return client.store.workflows.rules\n .execute(workflowId, objectIds, { collection_id: collectionId })\n .then(() => {\n toast({\n title: \"Workflow started\",\n status: \"success\",\n duration: 3000,\n });\n })\n .catch((err) => {\n toast({\n title: \"Error starting workflow\",\n status: \"error\",\n description: err.message,\n duration: 9000,\n });\n });\n };\n useObjectsActionCallback(action.id, callback);\n return _jsx(StartWorkflowModal, { isOpen: isOpen, onClose: onStartWorkflow });\n}\nexport const StartWorkflowAction = {\n id: \"startWorkflow\",\n name: \"Start Workflow\",\n description: \"Start an workflow on the selected objects\",\n confirm: false,\n hideInList: true,\n component: StartWorkflowComponent,\n};\nfunction StartWorkflowModal({ isOpen, onClose }) {\n return (_jsxs(VModal, { onClose: () => onClose(undefined), isOpen: isOpen, className: \"\", children: [_jsx(VModalTitle, { children: \"Start a Workflow by Rule\" }), _jsx(StartWorkflowBody, { onClose: onClose })] }));\n}\nfunction optionLayout(option) {\n return {\n label: (_jsxs(\"div\", { children: [_jsx(\"div\", { children: option.name }), _jsx(\"div\", { className: \"text-sm text-muted\", children: option.description })] })),\n reverse: true,\n };\n}\nfunction StartWorkflowBody({ onClose }) {\n const [selected, setSelected] = useState(undefined);\n const context = useObjectsActionContext();\n const onSelect = (value) => {\n setSelected(value);\n };\n const onStart = () => {\n if (selected) {\n onClose(selected.id);\n }\n };\n return (_jsxs(\"div\", { children: [_jsxs(VModalBody, { children: [_jsx(\"div\", { className: \"pb-2\", children: \"Choose a workflow rule to start:\" }), _jsx(\"div\", { className: \"max-h-[420px] overflow-y-scroll border-border border rounded-md\", children: _jsx(SelectList, { options: context.wfRules, optionLayout: optionLayout, onChange: onSelect, value: selected }) })] }), _jsxs(VModalFooter, { children: [_jsx(Button, { variant: \"secondary\", onClick: () => onClose(), children: \"Cancel\" }), _jsx(Button, { onClick: onStart, isDisabled: !selected, children: \"Start\" })] })] }));\n}\n//# sourceMappingURL=StartWorkflowComponent.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { createContext, useContext, useEffect, useMemo } from 'react';\nimport { ErrorBox, useFetch, useToast } from '@vertesia/ui/core';\nimport { useUserSession } from '@vertesia/ui/session';\nimport { useDocumentSearch, useDocumentSelection } from '../../../store';\nimport { AddToCollectionAction } from './actions/AddToCollectionAction';\nimport { ChangeTypeAction } from './actions/ChangeTypeAction';\nimport { DeleteObjectsAction, DeleteObjectsFromCollectionsAction } from './actions/DeleteObjectsAction';\nimport { ExportPropertiesAction } from './actions/ExportPropertiesAction';\nimport { RemoveFromCollectionAction } from './actions/RemoveFromCollectionAction';\nimport { StartWorkflowAction, StartWorkflowComponent } from './actions/StartWorkflowComponent';\nexport class ObjectsActionContext {\n params;\n allActions = [\n ExportPropertiesAction,\n ChangeTypeAction,\n StartWorkflowAction,\n AddToCollectionAction,\n DeleteObjectsAction,\n RemoveFromCollectionAction,\n DeleteObjectsFromCollectionsAction\n ];\n wfRules = [];\n callbacks = {};\n startWorkflow;\n constructor(params) {\n this.params = params;\n }\n get actions() {\n const isInCollection = !!this.params.selection?.collectionId;\n if (isInCollection) {\n return this.allActions.filter(action => action.id !== 'addToCollection' && action.id !== 'delete');\n }\n else {\n return this.allActions.filter(action => action.id !== 'removeFromCollection' && action.id !== 'deleteFromCollections');\n }\n }\n async loadWorkflows() {\n this.params.client.workflows.rules.list().then((rules) => {\n this.wfRules = rules.map(rule => ({\n id: rule.id,\n name: rule.name,\n description: rule.description,\n confirm: false,\n isWorkflow: true,\n component: StartWorkflowComponent\n })).sort((a, b) => a.name.localeCompare(b.name));\n });\n return this.wfRules;\n }\n registerCallback(name, cb) {\n this.callbacks[name] = cb;\n return () => {\n delete this.callbacks[name];\n };\n }\n unregisterCallback(name) {\n delete this.callbacks[name];\n }\n findAction(actionId) {\n let action = this.allActions.find(a => a.id === actionId);\n if (!action) {\n action = this.wfRules.find(a => a.id === actionId);\n }\n return action;\n }\n async run(actionId) {\n const action = this.findAction(actionId);\n if (!action) {\n throw new Error(`Action ${actionId} not found`);\n }\n const params = { ...this.params, action };\n // if (action.isWorkflow) {\n // if (!this.startWorkflow) {\n // throw new Error(\"No startWorkflow callback set\");\n // }\n // return this.startWorkflow(params);\n // } else {\n const cb = this.callbacks[actionId];\n if (cb) {\n return cb(params);\n }\n else {\n throw new Error(\"No action callback set\");\n }\n // }\n }\n}\nconst ObjectsActionContextReact = createContext(undefined);\nexport function ObjectsActionContextProvider({ children }) {\n const selection = useDocumentSelection();\n const toast = useToast();\n const { client } = useUserSession();\n const search = useDocumentSearch();\n const { data: rules, error } = useFetch(() => {\n return client.workflows.rules.list().then((rules) => {\n return rules.map(rule => ({\n id: rule.id,\n name: rule.name,\n description: rule.description,\n confirm: false,\n isWorkflow: true,\n component: StartWorkflowComponent\n })).sort((a, b) => a.name.localeCompare(b.name));\n });\n }, []);\n const context = useMemo(() => {\n const context = new ObjectsActionContext({\n selection, toast, client, search\n });\n context.wfRules = rules;\n return context;\n }, [selection, rules]);\n if (error) {\n return _jsx(ErrorBox, { title: \"Failed to fetch workflows\", children: error.message });\n }\n return (context && (_jsxs(ObjectsActionContextReact.Provider, { value: context, children: [_jsx(Actions, {}), children] })));\n}\nfunction Actions({}) {\n const context = useObjectsActionContext();\n const selection = context.params.selection;\n const objectId = selection.getObjectId();\n const objectIds = selection.isSingleSelection() && objectId ? [objectId] : selection.getObjectIds();\n return (_jsx(\"div\", { style: { display: 'none' }, children: context.allActions.map(action => (_jsx(action.component, { action: action, objectIds: objectIds, collectionId: selection.collectionId }, action.id))) }));\n}\nexport function useObjectsActionContext() {\n const ctx = useContext(ObjectsActionContextReact);\n if (!ctx) {\n throw new Error(\"You cannot use useActionContext outside an ActionProvider\");\n }\n return ctx;\n}\nexport function useObjectsActionCallback(name, cb) {\n const ctx = useObjectsActionContext();\n useEffect(() => {\n return ctx.registerCallback(name, cb);\n }, [ctx, name, cb]);\n return ctx;\n}\nexport function useStartWorkflowCallback(cb) {\n const ctx = useObjectsActionContext();\n useEffect(() => {\n ctx.startWorkflow = cb;\n return () => {\n ctx.startWorkflow = undefined;\n };\n }, [cb, ctx]);\n return ctx;\n}\n//# sourceMappingURL=ObjectsActionContext.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { Button, DialogDescription, Heading, Portal, useToast, VModal, VModalBody, VModalFooter, VModalTitle, VTabs, VTabsBar, VTabsPanel } from \"@vertesia/ui/core\";\nimport { useUserSession } from \"@vertesia/ui/session\";\nimport { useCallback, useState } from \"react\";\nimport { CreateCollectionForm, SelectCollection } from \"../../../collections\";\nimport { useObjectsActionCallback } from \"../ObjectsActionContext\";\nexport function AddToCollectionActionComponent({ action, objectIds }) {\n const [showModal, setShowModal] = useState(false);\n const callback = useCallback(() => {\n if (objectIds.length > 0) {\n setShowModal(true);\n }\n return Promise.resolve(true);\n }, [objectIds]);\n const onClose = () => {\n setShowModal(false);\n };\n useObjectsActionCallback(action.id, callback);\n return showModal && _jsx(Portal, { children: _jsx(SelectCollectionModal, { objectIds: objectIds, isOpen: showModal, onClose: onClose }) });\n}\nexport const AddToCollectionAction = {\n id: \"addToCollection\",\n name: 'Add to Collection',\n description: 'Add documents to a collection',\n confirm: false,\n component: AddToCollectionActionComponent,\n};\nfunction SelectCollectionModal({ isOpen, onClose, objectIds }) {\n return (_jsxs(VModal, { isOpen: isOpen, onClose: onClose, className: \"max-w-lg w-full min-w-0 overflow-hidden\", children: [_jsx(VModalTitle, { className: \"flex flex-col min-w-0 overflow-hidden\", children: \"Add to a Collection\" }), _jsx(DialogDescription, { className: \"min-w-0 overflow-hidden\", children: \"Add the selected objects to an existing collection or create a new one.\" }), _jsx(\"div\", { className: \"min-w-0 max-w-full overflow-hidden\", children: _jsx(AddToCollectionForm, { onClose: onClose, objectIds: objectIds }) })] }));\n}\nfunction AddToCollectionForm({ onClose, objectIds }) {\n const toast = useToast();\n const { client } = useUserSession();\n const [selectedCollectionId, setSelectedCollectionId] = useState();\n const onAddToCollection = ({ collectionId }) => {\n if (!collectionId || !objectIds?.length) {\n return;\n }\n client.store.collections.addMembers(collectionId, objectIds).then(() => {\n toast({\n title: 'Add to collection success',\n status: 'success',\n description: `Added ${objectIds.length} objects to the selected collection`,\n duration: 3000\n });\n onClose();\n }).catch(() => {\n toast({\n title: 'Add to collection failure',\n status: 'error',\n description: `Failed to add the selected objects to the collection`,\n duration: 5000\n });\n });\n };\n const onCollectionChange = (collectionId, _collection) => {\n if (typeof collectionId === \"string\" || typeof collectionId === \"undefined\") {\n setSelectedCollectionId(collectionId);\n }\n else if (Array.isArray(collectionId) && collectionId.length > 0) {\n setSelectedCollectionId(collectionId[0]);\n }\n else {\n setSelectedCollectionId(undefined);\n }\n };\n const tabs = [\n {\n name: 'select',\n label: 'Select Collection',\n content: (_jsxs(\"div\", { className: \"p-4 min-w-0 max-w-full overflow-hidden\", children: [_jsx(Heading, { level: 5, children: \"Choose from existing collections\" }), _jsx(VModalBody, { className: \"min-w-0 max-w-full overflow-hidden\", children: _jsx(\"div\", { className: \"mb-4 min-w-0 max-w-full overflow-hidden\", children: _jsx(SelectCollection, { onChange: onCollectionChange, value: selectedCollectionId }) }) }), _jsx(VModalFooter, { children: _jsx(Button, { isDisabled: !selectedCollectionId, onClick: () => selectedCollectionId && onAddToCollection({ collectionId: selectedCollectionId }), children: \"Add to Collection\" }) })] }))\n },\n {\n name: 'create',\n label: 'Create new',\n content: _jsx(\"div\", { className: \"p-4\", children: _jsx(CreateCollectionForm, { onClose: onClose, onAddToCollection: (id) => onAddToCollection({ collectionId: id }), redirect: false }) })\n }\n ];\n return (_jsxs(VTabs, { defaultValue: \"select\", tabs: tabs, fullWidth: true, children: [_jsx(VTabsBar, {}), _jsx(VTabsPanel, {})] }));\n}\n//# sourceMappingURL=AddToCollectionAction.js.map","import { jsxs as _jsxs, jsx as _jsx, Fragment as _Fragment } from \"react/jsx-runtime\";\nimport { Button, Popover, PopoverContent, PopoverTrigger, SelectList } from '@vertesia/ui/core';\nimport clsx from 'clsx';\nimport { EllipsisVertical, X } from 'lucide-react';\nimport { useState } from \"react\";\nimport { DocumentUploadModal, useDocumentSelection } from \"../../../store\";\nimport { ExportPropertiesAction } from \"./actions/ExportPropertiesAction\";\nimport { StartWorkflowAction } from \"./actions/StartWorkflowComponent\";\nimport { ObjectsActionContextProvider, useObjectsActionContext } from \"./ObjectsActionContext\";\nexport function SelectionActions() {\n const selection = useDocumentSelection();\n const size = selection.size();\n const plural = size > 1 ? \"s\" : \"\";\n const hasSelection = selection?.hasSelection();\n const hasSingleSelection = selection?.isSingleSelection();\n const onClearSelection = () => {\n selection?.removeAll();\n };\n return (_jsx(ObjectsActionContextProvider, { children: _jsxs(\"div\", { className: \"flex items-center gap-x-2\", children: [hasSelection && !hasSingleSelection &&\n _jsxs(\"div\", { className: \"flex items-center gap-x-1 shrink-0\", children: [_jsxs(\"div\", { className: 'text-sm nowrap', children: [size, \" document\", plural, \" selected\"] }), _jsx(Button, { title: \"Clear selection\", variant: \"ghost\", onClick: onClearSelection, children: _jsx(X, { className: \"size-4\" }) })] }), _jsx(SelectionActionsPopover, { selection: selection, children: _jsx(Button, { variant: \"ghost\", alt: \"More action\", size: \"sm\", children: _jsx(EllipsisVertical, { size: 16 }) }) }), hasSelection && _jsx(ActionsWrapper, { selection: selection })] }) }));\n}\nfunction ActionsWrapper({}) {\n return _jsx(StartWorkflowButton, {});\n}\nexport function UploadObjectsButton({ collectionId }) {\n const [files, setFiles] = useState([]);\n const selection = useDocumentSelection();\n const hasSelection = selection?.hasSelection();\n const selectFile = () => {\n const fileInput = document.createElement(\"input\");\n fileInput.type = \"file\";\n fileInput.multiple = true;\n fileInput.accept = \"*\";\n fileInput?.click();\n fileInput.onchange = (event) => {\n const files = event.target.files;\n if (files) {\n setFiles(Array.from(files));\n }\n };\n };\n return (!hasSelection &&\n _jsxs(_Fragment, { children: [_jsx(Button, { onClick: () => selectFile(), children: \"Upload\" }), _jsx(DocumentUploadModal, { collectionId: collectionId ?? '', isOpen: files.length > 0, onClose: () => setFiles([]), files: files, title: \"Upload Files\", onUploadComplete: (result) => {\n if (result && result.success) {\n setFiles([]);\n }\n }, children: _jsx(\"div\", { className: \"text-sm\", children: \"Select the associated Content Type, or let the system choose or generate the type based on the content.\" }) })] }));\n}\nfunction StartWorkflowButton() {\n const ctx = useObjectsActionContext();\n const selection = ctx.params.selection;\n const hasSelection = selection.hasSelection();\n return (hasSelection &&\n _jsx(Button, { onClick: () => ctx.run(StartWorkflowAction.id), children: \"Start Workflow\" }));\n}\nfunction optionLayout(option) {\n return {\n label: option.name,\n className: clsx('flex-1 px-2 py-2 hover:bg-accent nowrap', option.destructive ? 'text-destructive' : ''),\n };\n}\nfunction SelectionActionsPopover({ selection, children }) {\n const context = useObjectsActionContext();\n const executeAction = (action) => {\n context.run(action.id);\n };\n return (_jsxs(Popover, { hover: true, children: [_jsx(PopoverTrigger, { children: children }), _jsx(PopoverContent, { className: 'p-0 w-50', align: 'end', sideOffset: 6, children: _jsx(PopoverBody, { executeAction: executeAction, selection: selection }) })] }));\n}\nfunction PopoverBody({ executeAction, selection }) {\n const context = useObjectsActionContext();\n const _executeAction = (action) => {\n executeAction(action);\n };\n const _selection = selection?.hasSelection() ? context.actions.filter(action => !action.hideInList) : [ExportPropertiesAction];\n return (_jsx(\"div\", { className: \"rounded-md shadow-md py-2\", children: _jsx(\"div\", { className: \"px-1 text-sm\", children: _jsx(SelectList, { options: _selection, optionLayout: optionLayout, onChange: _executeAction, noCheck: true }) }) }));\n}\n//# sourceMappingURL=SelectionActions.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { Button, Input, Spinner, VModal, VModalBody, VModalTitle } from \"@vertesia/ui/core\";\nimport { Activity, PaperclipIcon, SendIcon } from \"lucide-react\";\nimport { useEffect, useRef, useState } from \"react\";\nimport { SelectDocument } from \"../../../store\";\nexport default function MessageInput({ value, onChange, onSend, disabled = false, isSending = false, isCompleted = false, activeTaskCount = 0, placeholder = \"Type your message...\" }) {\n const ref = useRef(null);\n const [isObjectModalOpen, setIsObjectModalOpen] = useState(false);\n useEffect(() => {\n if (!disabled && isCompleted)\n ref.current?.focus();\n }, [disabled, isCompleted]);\n const keyDown = (e) => {\n if (e.key === \"Enter\" && !e.shiftKey) {\n e.preventDefault();\n onSend();\n }\n };\n const handleObjectSelect = (object) => {\n // Create a markdown link with the object title and ID\n const objectTitle = object.properties?.title || object.name || 'Object';\n const objectId = object.id;\n const markdownLink = `[${objectTitle}](store:${objectId})`;\n // Insert the link at cursor position or append to end\n const currentValue = value || '';\n const cursorPos = ref.current?.selectionStart || currentValue.length;\n const newValue = currentValue.substring(0, cursorPos) + markdownLink + currentValue.substring(cursorPos);\n // Update the input value\n onChange(newValue);\n // Close the modal\n setIsObjectModalOpen(false);\n // Focus back on the input\n setTimeout(() => {\n if (ref.current) {\n ref.current.focus();\n // Place cursor after the inserted link\n const newCursorPos = cursorPos + markdownLink.length;\n ref.current.setSelectionRange(newCursorPos, newCursorPos);\n }\n }, 100);\n };\n return (_jsxs(\"div\", { className: \"p-3 border-t border-muted flex-shrink-0\", style: { minHeight: \"90px\" }, children: [_jsxs(\"div\", { className: \"flex items-center space-x-2\", children: [_jsxs(\"div\", { className: \"flex flex-1 space-x-1\", children: [_jsx(Input, { ref: ref, value: value, onKeyDown: keyDown, onChange: onChange, disabled: disabled || isSending, placeholder: placeholder, className: \"pr-12 py-2.5\" }), _jsx(Button, { variant: \"ghost\", className: \"rounded-full\", disabled: !isCompleted, onClick: () => setIsObjectModalOpen(true), alt: \"Link Object\", children: _jsx(PaperclipIcon, { className: \"size-4\" }) })] }), _jsxs(Button, { onClick: onSend, disabled: disabled || isSending || !value.trim(), className: \"px-4 py-2.5\", children: [isSending ? _jsx(Spinner, { size: \"sm\", className: \"mr-2\" }) : _jsx(SendIcon, { className: \"size-4 mr-2\" }), \" Send\"] })] }), _jsx(\"div\", { className: \"text-xs text-muted mt-2 text-center\", children: activeTaskCount > 0 ? (_jsxs(\"div\", { className: \"flex items-center justify-center\", children: [_jsx(Activity, { className: \"h-3 w-3 mr-1 text-attention\" }), _jsxs(\"span\", { children: [\"Agent has \", activeTaskCount, \" active workstream\", activeTaskCount !== 1 ? 's' : '', \" running\"] })] })) : disabled\n ? \"Agent is processing, you can continue once it completes...\"\n : \"You can send a message at any time\" }), _jsxs(VModal, { isOpen: isObjectModalOpen, onClose: () => setIsObjectModalOpen(false), className: 'min-w-[60vw]', children: [_jsx(VModalTitle, { children: \"Link Object\" }), _jsx(VModalBody, { className: \"pb-6\", children: _jsx(SelectDocument, { onChange: handleObjectSelect }) })] })] }));\n}\n//# sourceMappingURL=MessageInput.js.map","import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from \"react/jsx-runtime\";\nimport { Badge, Button } from \"@vertesia/ui/core\";\nimport { AlertCircle, CheckCircle, Circle, Clock, X } from \"lucide-react\";\nexport default function InlineSlidingPlanPanel({ plan, workstreamStatus, isOpen, onClose, plans = [], activePlanIndex = 0, onChangePlan = () => { }, }) {\n // Don't render if panel is closed\n if (!isOpen) {\n return null;\n }\n // Render the normal panel\n return (_jsxs(\"div\", { className: \"h-full shadow-xl border border-muted/20 overflow-hidden\", children: [_jsxs(\"div\", { className: \"flex items-center justify-between p-3 border-b border-muted/20\", children: [_jsx(\"h3\", { className: \"font-bold text-base\", children: \"Plan\" }), _jsxs(Button, { variant: \"ghost\", onClick: onClose, children: [_jsx(X, { className: \"size-4\" }), _jsx(\"span\", { className: \"sr-only\", children: \"Close\" })] })] }), _jsxs(\"div\", { className: \"p-3 overflow-y-auto\", style: {\n height: \"calc(100% - 44px)\",\n maxHeight: \"calc(100vh - 150px)\",\n }, children: [_jsxs(\"div\", { className: \"mb-3 p-2 bg-info rounded-md border border-info\", children: [_jsx(\"div\", { className: \"text-xs font-medium text-info mb-1\", children: \"Task Progress\" }), _jsx(\"div\", { className: \"flex items-center gap-2\", children: (() => {\n // Get all tasks from the plan itself\n const planTasks = plan.plan || [];\n const totalTasks = planTasks.length;\n // Count completed tasks by checking their status in workstreamStatus\n let completedTasks = 0;\n if (totalTasks > 0) {\n // Count each completed task from the plan\n planTasks.forEach((task) => {\n if (task && task.id) {\n const taskId = task.id.toString();\n const taskStatus = workstreamStatus.get(taskId);\n if (taskStatus === \"completed\") {\n completedTasks++;\n }\n }\n });\n }\n // Calculate percentage\n const progressPercentage = totalTasks > 0\n ? Math.round((completedTasks / totalTasks) * 100)\n : 0;\n return (_jsxs(_Fragment, { children: [_jsx(\"div\", { className: \"w-full bg-muted rounded-full h-2\", children: _jsx(\"div\", { className: \"bg-background h-2 rounded-full\", style: { width: `${progressPercentage}%` } }) }), _jsx(\"span\", { className: \"text-xs text-muted\", children: totalTasks > 0 ? `${completedTasks}/${totalTasks}` : \"0/0\" })] }));\n })() })] }), plans.length > 1 && (_jsxs(\"div\", { className: \"mb-3 flex items-center justify-between\", children: [_jsx(Button, { variant: \"ghost\", onClick: () => onChangePlan(Math.min(plans.length - 1, activePlanIndex + 1)), disabled: activePlanIndex >= plans.length - 1, children: \"Older Plan\" }), _jsx(\"div\", { className: \"text-xs text-muted\", children: plans[activePlanIndex]?.timestamp\n ? new Date(plans[activePlanIndex].timestamp).toLocaleTimeString()\n : \"Unknown time\" }), _jsx(Button, { variant: \"ghost\", onClick: () => onChangePlan(Math.max(0, activePlanIndex - 1)), disabled: activePlanIndex <= 0, children: \"Newer Plan\" })] })), _jsxs(\"div\", { className: \"rounded-md border border-muted/30\", children: [_jsx(\"div\", { className: \"p-2 border-b border-muted/30 bg-muted\", children: _jsx(\"div\", { className: \"font-medium text-xs\", children: \"Step-by-Step Plan\" }) }), _jsx(\"div\", { className: \"divide-y divide-muted/20 max-h-[calc(100vh-350px)] overflow-y-auto\", children: plan.plan && plan.plan.length > 0 ? (plan.plan.map((task, index) => {\n // Extract task info with null checks\n const taskId = task.id ? task.id.toString() : `task-${index}`;\n const taskGoal = task.goal || `Task ${index + 1}`;\n // Determine task status - use task.status if available or lookup from workstream\n let status = task.status || \"pending\";\n if (workstreamStatus.has(taskId)) {\n status = workstreamStatus.get(taskId);\n }\n // Determine status icon and style\n let StatusIcon = Circle;\n let statusColor = \"text-muted\";\n if (status === \"in_progress\") {\n StatusIcon = Clock;\n statusColor = \"text-info\";\n }\n else if (status === \"completed\") {\n StatusIcon = CheckCircle;\n statusColor = \"text-success\";\n }\n return (_jsxs(\"div\", { className: `flex p-3 my-1`, children: [_jsx(\"div\", { className: `mr-2 mt-0.5 flex-shrink-0 text-muted`, children: taskId }), _jsxs(\"div\", { className: \"w-full\", children: [_jsx(\"div\", { className: \"text-sm font-medium mb-2 text-muted\", children: taskGoal }), _jsxs(\"div\", { className: \"mt-1 flex justify-end items-center\", children: [_jsx(\"div\", { className: `mr-2 mt-0.5 flex-shrink-0 ${statusColor}`, children: _jsx(StatusIcon, { className: \"size-3.5\" }) }), _jsx(Badge, { variant: status === \"completed\" ? \"success\" : status === \"in_progress\" ? \"info\" : \"default\", children: status === \"completed\"\n ? \"Completed\"\n : status === \"in_progress\"\n ? \"In Progress\"\n : \"Pending\" })] })] })] }, index));\n })) : (_jsxs(\"div\", { className: \"p-3 text-center text-muted italic\", children: [_jsx(AlertCircle, { className: \"size-4 mx-auto mb-2 text-attention\" }), _jsx(\"p\", { className: \"text-xs\", children: \"No plan has been detected yet\" }), _jsx(\"p\", { className: \"text-xs mt-1\", children: \"Plans will appear here when the agent creates one\" })] })) })] }), (() => {\n // Get all task IDs from the plan for filtering\n const planTaskIds = new Set((plan.plan || [])\n .filter((task) => task && task.id)\n .map((task) => task.id.toString()));\n // Filter out 'main' workstream and any IDs that are tasks in the plan\n const workstreamEntries = Array.from(workstreamStatus.entries()).filter(([id]) => id !== \"main\" && !planTaskIds.has(id));\n // Only show the section if there are actual workstreams (not tasks or main)\n return workstreamEntries.length > 0 ? (_jsxs(\"div\", { className: \"mt-3 rounded-md border border-gray-200 dark:border-gray-800\", children: [_jsx(\"div\", { className: \"p-2 border-b border-gray-200 dark:border-gray-800 bg-gray-50 dark:bg-gray-900/50\", children: _jsx(\"div\", { className: \"font-medium text-xs\", children: \"Workstreams\" }) }), _jsx(\"div\", { className: \"p-3\", children: _jsx(\"div\", { className: \"grid grid-cols-1 gap-2\", children: workstreamEntries.map(([id, status]) => {\n let StatusIcon = Circle;\n let statusColor = \"text-gray-400\";\n let statusBg = \"bg-gray-100 dark:bg-gray-800\";\n let statusText = \"Pending\";\n if (status === \"in_progress\") {\n StatusIcon = Clock;\n statusColor = \"text-info\";\n statusBg = \"bg-info/20\";\n statusText = \"In Progress\";\n }\n else if (status === \"completed\") {\n StatusIcon = CheckCircle;\n statusColor = \"text-success\";\n statusBg = \"bg-success/20\";\n statusText = \"Completed\";\n }\n return (_jsxs(\"div\", { className: `flex items-center p-1.5 rounded ${statusBg}`, children: [_jsx(\"div\", { className: `mr-1.5 ${statusColor}`, children: _jsx(StatusIcon, { className: \"h-3.5 w-3.5\" }) }), _jsx(\"div\", { className: \"flex-1\", children: _jsx(\"span\", { className: \"text-xs font-medium text-gray-800 dark:text-gray-300\", children: id }) }), _jsx(\"span\", { className: \"text-xs font-medium\", children: statusText })] }, id));\n }) }) })] })) : null;\n })()] })] }));\n}\n//# sourceMappingURL=InlineSlidingPlanPanel.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { useEffect, useMemo, useRef, useState } from \"react\";\nimport { Bot, Cpu, SendIcon, XIcon } from \"lucide-react\";\nimport { useUserSession } from \"@vertesia/ui/session\";\nimport { AgentMessageType } from \"@vertesia/common\";\nimport { Button, MessageBox, Spinner, useToast } from \"@vertesia/ui/core\";\nimport { AnimatedThinkingDots, PulsatingCircle } from \"./AnimatedThinkingDots\";\nimport AllMessagesMixed from \"./ModernAgentOutput/AllMessagesMixed\";\nimport Header from \"./ModernAgentOutput/Header\";\nimport MessageInput from \"./ModernAgentOutput/MessageInput\";\nimport { getWorkstreamId, insertMessageInTimeline, isInProgress } from \"./ModernAgentOutput/utils\";\nimport { ThinkingMessages } from \"./WaitingMessages\";\nimport InlineSlidingPlanPanel from \"./ModernAgentOutput/InlineSlidingPlanPanel\";\nexport function ModernAgentConversation(props) {\n const { run, startWorkflow } = props;\n if (run) {\n // If we have a run, convert it to AsyncExecutionResult format if needed\n const execRun = \"runId\" in run\n ? run\n : {\n runId: run.run_id,\n workflowId: run.workflow_id,\n };\n return _jsx(ModernAgentConversationInner, { ...props, run: execRun });\n }\n else if (startWorkflow) {\n // If we have startWorkflow capability but no run yet\n return _jsx(StartWorkflowView, { ...props });\n }\n else {\n // Empty state\n return _jsx(EmptyState, {});\n }\n}\n// Empty state when no agent is running\nfunction EmptyState() {\n return (_jsxs(MessageBox, { status: \"info\", icon: _jsx(Bot, { className: \"size-16 text-muted mb-4\" }), children: [_jsx(\"div\", { className: \"text-base font-medium text-muted\", children: \"No agent currently running\" }), _jsx(\"div\", { className: \"mt-3 text-sm text-muted\", children: \"Select an interaction and click Start to start an agent\" })] }));\n}\n// Start workflow view - allows initiating a new agent conversation\nfunction StartWorkflowView({ initialMessage, startWorkflow, onClose, isModal = false, placeholder = \"Type your message...\", startButtonText = \"Start Agent\", title = \"Start New Conversation\", }) {\n const [inputValue, setInputValue] = useState(\"\");\n const [isSending, setIsSending] = useState(false);\n const [run, setRun] = useState();\n const toast = useToast();\n const inputRef = useRef(null);\n useEffect(() => {\n // Focus the input field when component mounts\n if (inputRef.current) {\n inputRef.current.focus();\n }\n }, []);\n // Start a new workflow with the message\n const startWorkflowWithMessage = async () => {\n if (!startWorkflow)\n return;\n const message = inputValue.trim();\n if (!message || isSending)\n return;\n setIsSending(true);\n try {\n // Reset plan panel state when starting a new agent\n sessionStorage.removeItem(\"plan-panel-shown\");\n toast({\n title: \"Starting agent...\",\n status: \"info\",\n duration: 3000,\n });\n const newRun = await startWorkflow(message);\n if (newRun) {\n setRun({\n runId: newRun.run_id,\n workflowId: newRun.workflow_id,\n });\n setInputValue(\"\");\n toast({\n title: \"Agent started\",\n status: \"success\",\n duration: 3000,\n });\n }\n }\n catch (err) {\n toast({\n title: \"Error starting workflow\",\n status: \"error\",\n duration: 3000,\n description: err instanceof Error ? err.message : \"Unknown error\",\n });\n }\n finally {\n setIsSending(false);\n }\n };\n const handleKeyDown = (e) => {\n if (e.key === \"Enter\" && !e.shiftKey) {\n e.preventDefault();\n startWorkflowWithMessage();\n }\n };\n // If a run has been started, show the conversation\n if (run) {\n return (_jsx(ModernAgentConversationInner, { onClose, isModal, initialMessage, placeholder, run: run, title: title }));\n }\n return (_jsxs(\"div\", { className: \"flex flex-col h-full bg-white dark:bg-gray-900 overflow-hidden border-0\", children: [_jsxs(\"div\", { className: \"flex items-center justify-between py-2 px-3 border-b border-gray-100 dark:border-gray-800 bg-white dark:bg-gray-900\", children: [_jsxs(\"div\", { className: \"flex items-center space-x-2\", children: [_jsx(\"div\", { className: \"p-1\", children: _jsx(Cpu, { className: \"size-3.5 text-muted\" }) }), _jsx(\"span\", { className: \"font-medium text-sm text-gray-700 dark:text-gray-300\", children: title })] }), onClose && !isModal && (_jsx(Button, { size: \"xs\", variant: \"ghost\", onClick: onClose, title: \"Close\", className: \"text-slate-500 hover:text-slate-700\", children: _jsx(XIcon, { className: \"size-4\" }) }))] }), _jsxs(\"div\", { className: \"flex-1 overflow-y-auto px-4 py-6 bg-white dark:bg-gray-900 flex flex-col items-center justify-center\", children: [initialMessage && (_jsx(\"div\", { className: \"px-4 py-3 mb-4 bg-blue-50/80 dark:bg-blue-900/30 border-l-2 border-blue-400 dark:border-blue-500 text-blue-700 dark:text-blue-300 max-w-md\", children: initialMessage })), _jsxs(\"div\", { className: \"bg-white dark:bg-slate-800 p-4 max-w-md border-l-2 border-blue-400 dark:border-blue-500\", children: [_jsx(\"div\", { className: \"text-base text-slate-600 dark:text-slate-300 font-medium\", children: \"Enter a message to start a conversation\" }), _jsxs(\"div\", { className: \"mt-3 text-sm text-slate-500 dark:text-slate-400\", children: [\"Type your question below and press Enter or click \", startButtonText, \" \", \"to begin\"] })] })] }), _jsxs(\"div\", { className: \"py-3 px-3 border-t border-gray-100 dark:border-gray-800 bg-white dark:bg-gray-900\", children: [_jsxs(\"div\", { className: \"flex items-center gap-2\", children: [_jsx(\"div\", { className: \"flex-1\", children: _jsx(\"input\", { ref: inputRef, value: inputValue, onChange: (e) => setInputValue(e.target.value), onKeyDown: handleKeyDown, placeholder: placeholder, disabled: isSending, className: \"w-full py-2 px-3 text-sm border border-gray-200 dark:border-gray-700 dark:bg-gray-800 dark:text-white focus:border-gray-300 dark:focus:border-gray-600 focus:ring-0 rounded-md\" }) }), _jsxs(Button, { onClick: startWorkflowWithMessage, disabled: !inputValue.trim() || isSending, className: \"px-3 py-2 bg-gray-800 dark:bg-gray-700 hover:bg-gray-700 dark:hover:bg-gray-600 text-white text-xs rounded-md transition-colors\", children: [isSending ? (_jsx(Spinner, { size: \"sm\", className: \"mr-1.5\" })) : (_jsx(SendIcon, { className: \"size-3.5 mr-1.5\" })), startButtonText] })] }), _jsx(\"div\", { className: \"text-xs text-gray-400 dark:text-gray-500 mt-2 text-center\", children: \"Type a message to start the conversation\" })] })] }));\n}\n// Inner component that handles the agent conversation - similar to ModernAgentOutput\nfunction ModernAgentConversationInner({ run, title, interactive = true, onClose, isModal = false, placeholder = \"Type your message...\", resetWorkflow, }) {\n const { client } = useUserSession();\n const bottomRef = useRef(null);\n const [messages, setMessages] = useState([]);\n const [isCompleted, setIsCompleted] = useState(false);\n const [inputValue, setInputValue] = useState(\"\");\n const [isSending, setIsSending] = useState(false);\n const [viewMode, setViewMode] = useState(\"sliding\");\n const [showSlidingPanel, setShowSlidingPanel] = useState(!isModal);\n // Keep track of multiple plans and their timestamps\n const [plans, setPlans] = useState([]);\n // Track which plan is currently active in the UI\n const [activePlanIndex, setActivePlanIndex] = useState(0);\n // Store workstream status for each plan separately\n const [workstreamStatusMap, setWorkstreamStatusMap] = useState(new Map());\n const [thinkingMessageIndex, setThinkingMessageIndex] = useState(0);\n const toast = useToast();\n const [showInput, setShowInput] = useState(interactive);\n const [workflowStatus, setWorkflowStatus] = useState(null);\n // Helper function to get the current active plan and its workstream status\n const getActivePlan = useMemo(() => {\n const currentPlanData = plans[activePlanIndex] || {\n plan: { plan: [] },\n timestamp: 0,\n };\n const currentWorkstreamStatus = workstreamStatusMap.get(currentPlanData.timestamp) || new Map();\n return {\n plan: currentPlanData.plan,\n workstreamStatus: currentWorkstreamStatus,\n };\n }, [plans, activePlanIndex, workstreamStatusMap]);\n // Show rotating thinking messages\n useEffect(() => {\n if (!isCompleted) {\n const interval = setInterval(() => {\n setThinkingMessageIndex(() => Math.floor(Math.random() * (ThinkingMessages.length - 1)));\n }, 4000);\n return () => clearInterval(interval);\n }\n }, [isCompleted]);\n const checkWorkflowStatus = async () => {\n try {\n const statusResult = await client.store.workflows.getRunDetails(run.runId, run.workflowId);\n setWorkflowStatus(statusResult.status);\n }\n catch (error) {\n console.error('Failed to check workflow status:', error);\n }\n };\n // Stream messages from the agent\n useEffect(() => {\n // Reset all state when runId changes (new agent)\n setMessages([]);\n setPlans([]);\n setActivePlanIndex(0);\n setWorkstreamStatusMap(new Map());\n setShowSlidingPanel(false);\n setWorkflowStatus(null);\n checkWorkflowStatus();\n client.store.workflows.streamMessages(run.workflowId, run.runId, (message) => {\n if (message.message) {\n setMessages((prev_messages) => {\n if (!prev_messages.find((m) => m.timestamp === message.timestamp)) {\n insertMessageInTimeline(prev_messages, message);\n return [...prev_messages];\n }\n else {\n return prev_messages;\n }\n });\n }\n });\n // Clear messages and unsubscribe when component unmounts or runId changes\n return () => {\n setMessages([]);\n // Client handles unsubscribing from the message stream internally\n };\n }, [run.runId, client.store.workflows]);\n // Update completion status when messages change\n // This now accounts for multiple workstreams\n useEffect(() => {\n setIsCompleted(!isInProgress(messages));\n // Only automatically hide the panel when there are no plans\n // But don't auto-show it when plans appear\n if (plans.length === 0) {\n // If there are no plans, make sure the plan panel is hidden\n setShowSlidingPanel(false);\n }\n // We removed the auto-show functionality to allow users to keep the panel closed if they want\n }, [messages, plans.length]);\n // Update plans and workstream status based on incoming messages\n useEffect(() => {\n // Only show the sliding panel for the very first plan and only once\n if (plans.length === 1 &&\n !showSlidingPanel &&\n !sessionStorage.getItem(\"plan-panel-shown\")) {\n // For first-time plan detection only, show the panel with a delay\n const notificationTimeout = setTimeout(() => {\n setShowSlidingPanel(true);\n // Mark that we've shown the panel once\n sessionStorage.setItem(\"plan-panel-shown\", \"true\");\n }, 500); // Short delay to ensure the UI has fully rendered\n return () => clearTimeout(notificationTimeout);\n }\n // Process messages to extract plan information\n messages.forEach((message) => {\n if (message.type === AgentMessageType.PLAN) {\n try {\n // Log message details for debugging\n console.log(\"PLAN message received:\", message.type);\n let newPlanDetails = null;\n // Extract the plan from the message details object\n if (message.details && typeof message.details === \"object\") {\n // For a PLAN type message like the example you provided\n if (message.details.plan && Array.isArray(message.details.plan)) {\n console.log(\"Valid plan array found in message.details.plan\");\n newPlanDetails = { plan: message.details.plan };\n }\n }\n // Only proceed if we have a valid plan\n if (newPlanDetails) {\n const timestamp = typeof message.timestamp === \"number\"\n ? message.timestamp\n : new Date(message.timestamp).getTime();\n // Check if we already have this plan\n const existingPlanIndex = plans.findIndex((p) => p.timestamp === timestamp);\n if (existingPlanIndex === -1 && newPlanDetails) {\n console.log(\"Adding new plan to plans array\");\n // This is a new plan - add it to our plans array\n const newPlan = {\n plan: newPlanDetails,\n timestamp,\n };\n // Add new plan to the beginning of the array (newest first)\n console.log(\"Adding plan to plans array:\", newPlan);\n setPlans((prev) => {\n const newPlans = [newPlan, ...prev];\n console.log(\"New plans array:\", newPlans);\n return newPlans;\n });\n // Set this as the active plan\n setActivePlanIndex(0);\n // Automatically show sliding plan panel when a plan is detected\n console.log(\"Setting showSlidingPanel to true\");\n setShowSlidingPanel(true);\n // Initialize workstreams as pending based on the plan tasks\n const newWorkstreamStatus = new Map();\n // Always initialize main workstream\n newWorkstreamStatus.set(\"main\", \"in_progress\");\n // Initialize each task in the plan with its status\n if (Array.isArray(newPlanDetails.plan)) {\n newPlanDetails.plan.forEach((task) => {\n if (task && typeof task === \"object\" && task.id) {\n const taskId = task.id.toString();\n // Use the task's status if available, otherwise default to pending\n newWorkstreamStatus.set(taskId, task.status || \"pending\");\n }\n });\n }\n // Update the workstream status map with the new status for this plan\n setWorkstreamStatusMap((prev) => {\n const newMap = new Map(prev);\n newMap.set(timestamp, newWorkstreamStatus);\n return newMap;\n });\n }\n }\n }\n catch (error) {\n console.error(\"Failed to parse plan from message:\", error);\n }\n }\n // Handle UPDATE type messages with plan updates\n if (message.type === AgentMessageType.UPDATE && message.details) {\n // We no longer process UPDATE messages with details.updates\n // Instead, we rely on the PLAN message that follows with the complete plan\n if (message.details.updates && Array.isArray(message.details.updates)) {\n console.log(\"Ignoring UPDATE message with details.updates - waiting for PLAN message with full plan\");\n // This is an initial update notification, but we'll wait for the PLAN message that follows\n // with the complete updated plan before making any UI changes\n }\n }\n });\n const lastMessage = messages[messages.length - 1];\n if (lastMessage) {\n if (lastMessage.type === AgentMessageType.TERMINATED) {\n setShowInput(false);\n setWorkflowStatus(\"TERMINATED\");\n }\n else {\n if (interactive) {\n setShowInput(true);\n }\n else {\n setShowInput(lastMessage.type === AgentMessageType.REQUEST_INPUT);\n }\n }\n }\n }, [messages, plans, activePlanIndex]);\n // Send a message to the agent\n const handleSendMessage = () => {\n const message = inputValue.trim();\n if (!message || isSending)\n return;\n setIsSending(true);\n setInputValue(\"\");\n client.store.workflows\n .sendSignal(run.workflowId, run.runId, \"UserInput\", {\n message,\n })\n .then(() => {\n setIsCompleted(false);\n toast({\n status: \"success\",\n title: \"Message Sent\",\n duration: 2000,\n });\n })\n .catch((err) => {\n toast({\n status: \"error\",\n title: \"Failed to Send Message\",\n description: err instanceof Error ? err.message : \"Unknown error\",\n duration: 3000,\n });\n })\n .finally(() => {\n setIsSending(false);\n });\n };\n // Calculate number of active tasks for the status indicator\n const getActiveTaskCount = () => {\n if (!messages.length)\n return 0;\n // Group messages by workstream\n const workstreamMessages = new Map();\n messages.forEach((message) => {\n const workstreamId = getWorkstreamId(message);\n if (workstreamId !== \"main\" && workstreamId !== \"all\") {\n if (!workstreamMessages.has(workstreamId)) {\n workstreamMessages.set(workstreamId, []);\n }\n workstreamMessages.get(workstreamId).push(message);\n }\n });\n // Count workstreams that don't have completion messages\n let activeCount = 0;\n for (const [_, msgs] of workstreamMessages.entries()) {\n if (msgs.length > 0) {\n const lastMessage = msgs[msgs.length - 1];\n // If the last message isn't a completion message, the workstream is active\n if (![AgentMessageType.COMPLETE, AgentMessageType.IDLE].includes(lastMessage.type)) {\n activeCount++;\n }\n }\n }\n return activeCount;\n };\n const actualTitle = title || run.workflowId.split(\":\")[2] || \"Agent Conversation\";\n // Handle downloading conversation\n const downloadConversation = async () => {\n try {\n const url = await getConversationUrl(client, run.runId);\n if (url)\n window.open(url, \"_blank\");\n }\n catch (err) {\n console.error(\"Failed to download conversation\", err);\n toast({\n status: \"error\",\n title: \"Failed to download conversation\",\n duration: 3000,\n });\n }\n };\n // Handle copying run ID\n const copyRunId = () => {\n navigator.clipboard.writeText(run.runId);\n toast({\n status: \"success\",\n title: \"Run ID copied\",\n duration: 2000,\n });\n };\n return (_jsxs(\"div\", { className: \"flex gap-2 h-full\", children: [_jsxs(\"div\", { className: `flex flex-col h-full min-h-0 border-0 ${showSlidingPanel ? 'lg:w-2/3 flex-1' : `flex-1 mx-auto ${!isModal ? 'max-w-4xl' : ''}`}`, children: [_jsx(Header, { title: actualTitle, isCompleted: isCompleted, onClose: onClose, isModal: isModal, run: run, viewMode: viewMode, onViewModeChange: setViewMode, showPlanPanel: showSlidingPanel, hasPlan: plans.length > 0, onTogglePlanPanel: () => {\n setShowSlidingPanel(!showSlidingPanel);\n // When opening the plan panel, mark that we've shown it\n if (!showSlidingPanel) {\n sessionStorage.setItem(\"plan-panel-shown\", \"true\");\n }\n }, onDownload: downloadConversation, onCopyRunId: copyRunId, resetWorkflow: resetWorkflow }), messages.length === 0 && !isCompleted ? (_jsx(\"div\", { className: \"flex-1 flex flex-col items-center justify-center h-full text-center py-6\", children: _jsxs(\"div\", { className: \"p-5 max-w-md border border-info rounded-lg shadow-sm\", children: [_jsxs(\"div\", { className: \"flex items-center space-x-3 mb-3\", children: [_jsx(PulsatingCircle, { size: \"sm\", color: \"blue\" }), _jsx(\"div\", { className: \"text-sm text-muted font-medium\", children: ThinkingMessages[thinkingMessageIndex] })] }), _jsx(\"div\", { className: \"mt-4 flex justify-center\", children: _jsx(AnimatedThinkingDots, { color: \"blue\", className: \"mt-1\" }) })] }) })) : (_jsx(AllMessagesMixed, { messages: messages, bottomRef: bottomRef, viewMode: viewMode, isCompleted: isCompleted, plan: getActivePlan.plan, workstreamStatus: getActivePlan.workstreamStatus, showPlanPanel: showSlidingPanel, onTogglePlanPanel: () => {\n console.log(\"Toggle plan panel called, current state:\", showSlidingPanel);\n setShowSlidingPanel(!showSlidingPanel);\n }, plans: plans, activePlanIndex: activePlanIndex, onChangePlan: (index) => setActivePlanIndex(index), taskLabels: getActivePlan.plan.plan?.reduce((acc, task) => {\n if (task.id && task.goal) {\n acc.set(task.id.toString(), task.goal);\n }\n return acc;\n }, new Map()) })), workflowStatus && (workflowStatus !== \"RUNNING\" ? (_jsxs(MessageBox, { status: workflowStatus === \"COMPLETED\" ? 'success' : 'done', icon: null, className: \"flex-shrink-0 m-2\", children: [\"This Workflow is \", workflowStatus] })) : showInput && (_jsx(MessageInput, { value: inputValue, onChange: setInputValue, onSend: handleSendMessage, disabled: false, isSending: isSending, isCompleted: isCompleted, activeTaskCount: getActiveTaskCount(), placeholder: placeholder })))] }), showSlidingPanel && (_jsx(\"div\", { className: \"h-full lg:w-1/3 border-l\", children: _jsx(InlineSlidingPlanPanel, { plan: getActivePlan.plan, workstreamStatus: getActivePlan.workstreamStatus, isOpen: showSlidingPanel, onClose: () => setShowSlidingPanel(false), plans: plans, activePlanIndex: activePlanIndex, onChangePlan: setActivePlanIndex }) }))] }));\n}\n// Helper function to get conversation URL - used by other components\nexport async function getConversationUrl(vertesia, workflowRunId) {\n return vertesia.files\n .getDownloadUrl(`agents/${workflowRunId}/conversation.json`)\n .then((r) => r.url);\n}\n//# sourceMappingURL=ModernAgentConversation.js.map","import { jsx as _jsx } from \"react/jsx-runtime\";\nimport { ErrorBoundary } from \"react-error-boundary\";\nexport function VertesiaErrorBoundary({ children, fallback }) {\n if (ErrorBoundaryInstance) { // custom error boundary?\n return _jsx(ErrorBoundaryInstance, { fallback: fallback, children: children });\n }\n else {\n return _jsx(ErrorBoundary, { FallbackComponent: fallback, children: children });\n }\n}\nlet ErrorBoundaryInstance = null;\nexport function setErrorBoundaryComponent(ErrorBoundaryComponent) {\n ErrorBoundaryInstance = ErrorBoundaryComponent;\n}\n//# sourceMappingURL=VertesiaErrorBoundary.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { MessageBox } from '@vertesia/ui/core';\nimport { VertesiaErrorBoundary } from './VertesiaErrorBoundary';\nexport function PanelErrorBoundary({ children }) {\n return (_jsx(VertesiaErrorBoundary, { fallback: PanelErrorFallback, children: children }));\n}\nfunction PanelErrorFallback({ error }) {\n return (_jsxs(MessageBox, { status: \"error\", title: \"Sorry, something went wrong...\", children: [_jsxs(\"div\", { className: 'mb-4', children: [\"Our team has been notified and will be quickly working on resolving it. If you'd like to escalate or simply contact us, please email us at\\u00A0\", _jsx(\"a\", { className: 'text-info', href: \"mailto:support@vertesiahq.com\", children: \"support@vertesiahq.com\" }), \".\"] }), error?.message &&\n _jsx(\"code\", { className: 'w-full mt-4 text-sm text-muted break-words', children: error.message })] }));\n}\n//# sourceMappingURL=PanelErrorBoundary.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { VertesiaErrorBoundary } from \"./VertesiaErrorBoundary\";\nexport function RowErrorBoundary({ children }) {\n return (_jsx(VertesiaErrorBoundary, { fallback: RowErrorFallback, children: children }));\n}\nfunction RowErrorFallback({ error }) {\n return (_jsx(\"tr\", { children: _jsxs(\"td\", { colSpan: 100, children: [_jsx(\"span\", { className: \"text-xs\", children: \" Cannot display row\" }), _jsx(\"br\", {}), _jsx(\"span\", { className: \"bg-gray-400\", children: error?.message })] }) }));\n}\n//# sourceMappingURL=RowErrorBoundary.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { VertesiaErrorBoundary } from './VertesiaErrorBoundary';\nexport function WidgetErrorBoundary({ children }) {\n return (_jsx(VertesiaErrorBoundary, { fallback: WidgetErrorFallback, children: children }));\n}\nfunction WidgetErrorFallback({ error }) {\n console.log('WidgetError', error);\n return (_jsxs(\"div\", { className: \"text-sm\", children: [\"Sorry, this area cannot be loaded or rendered.\", error?.message &&\n _jsx(\"pre\", { children: error.message })] }));\n}\n//# sourceMappingURL=WidgetErrorBoundary.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport clsx from 'clsx';\nimport { ChevronRight, Info } from 'lucide-react';\nimport { VTooltip, Breadcrumbs } from '@vertesia/ui/core';\nimport { capitalize } from 'lodash-es';\nimport { useNavigate } from '@vertesia/ui/router';\nexport function GenericPageNavHeader({ className, children, title, description, actions, breadcrumbs, isCompact = false, useDynamicBreadcrumbs = true }) {\n const navigate = useNavigate();\n const buildBreadcrumbLabel = (entry) => {\n const href = entry?.href || '';\n if (!href)\n return 'Page';\n const cleanHref = href.split('#')[0].split('?')[0];\n const pathSegments = cleanHref.split('/').filter((segment) => segment.length > 0);\n if (pathSegments.length === 3) {\n const secondSegment = pathSegments[1];\n return `${capitalize(secondSegment)} Detail`;\n }\n else if (pathSegments.length >= 2) {\n return capitalize(pathSegments[pathSegments.length - 1]);\n }\n else if (pathSegments.length === 1) {\n return capitalize(pathSegments[0]);\n }\n return 'Page';\n };\n // Build breadcrumb items from history chain and current breadcrumbs\n const buildBreadcrumbItems = () => {\n const items = [];\n // Add items from history chain\n if (useDynamicBreadcrumbs && typeof window !== 'undefined' && window.history.state?.historyChain) {\n const historyChain = window.history.state.historyChain;\n historyChain.forEach((entry, index) => {\n const stepsBack = historyChain.length - index;\n items.push({\n label: buildBreadcrumbLabel(entry),\n href: entry.href,\n onClick: () => window.history.go(-stepsBack)\n });\n });\n }\n // Add current page breadcrumbs\n if (breadcrumbs && breadcrumbs.length > 0) {\n breadcrumbs.forEach((breadcrumb) => {\n // Extract text content from React element\n const label = typeof breadcrumb?.props?.children === 'string'\n ? breadcrumb.props.children\n : 'Page';\n items.push((breadcrumb?.props?.href) ? {\n href: breadcrumb?.props?.href,\n label: label,\n onClick: () => navigate(breadcrumb.props.href, { replace: breadcrumb.props.clearBreadcrumbs }),\n } : {\n label: label\n });\n });\n }\n return items;\n };\n const breadcrumbItems = buildBreadcrumbItems();\n return (_jsxs(\"div\", { className: clsx(isCompact ? 'pb-0' : 'pb-2', 'p-4 flex flex-col', className), children: [_jsxs(\"div\", { className: 'flex items-start gap-4', children: [_jsxs(\"div\", { className: \"w-full flex place-content-between h-auto min-h-8 flex-col items-start\", children: [_jsx(\"nav\", { className: \"flex-1 flex justify-start text-xs\", children: breadcrumbItems.length > 0 && (_jsx(Breadcrumbs, { path: breadcrumbItems, separator: _jsx(ChevronRight, { className: \"w-3.5 h-3.5\" }), maxItems: 4 })) }), _jsxs(\"div\", { className: 'flex gap-2 items-center', children: [_jsx(\"h1\", { className: \"text-xl font-semibold break-all\", children: title }), description &&\n _jsx(VTooltip, { description: description, children: _jsx(Info, { className: \"size-4 text-muted\" }) })] })] }), _jsx(\"div\", { className: \"flex gap-x-2 shrink-0\", children: actions })] }), children && _jsx(\"div\", { className: \"w-full flex items-center\", children: children })] }));\n}\n//# sourceMappingURL=GenericPageNavHeader.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nexport function NotFoundView({}) {\n return (_jsxs(\"div\", { className: \"text-center pt-32\", children: [_jsx(\"h1\", { className: \"text-3xl font-bold text-red-500\", children: \"404\" }), _jsx(\"p\", { className: \"text-2xl\", children: \"Page Not Found\" })] }));\n}\n//# sourceMappingURL=NotFoundView.js.map","import { jsx as _jsx } from \"react/jsx-runtime\";\nimport { useUserSession } from \"@vertesia/ui/session\";\nimport React, { createContext, useEffect, useState } from \"react\";\nconst DEFAULT_PAGE_COUNT = 10;\nconst ADVANCED_PROCESSING_PREFIX = \"magic-pdf\";\nclass PageLayoutProvider {\n totalPages;\n layoutUrls = [];\n cache;\n constructor(totalPages) {\n this.totalPages = totalPages;\n this.cache = new Array(totalPages);\n }\n async loadUrls(vertesia, objectId) {\n const layoutPromises = [];\n for (let i = 0; i < this.totalPages; i++) {\n layoutPromises.push(getLayoutUrlForPage(vertesia, objectId, i + 1));\n }\n const layoutUrls = await Promise.all(layoutPromises);\n this.layoutUrls = layoutUrls.map((r) => r.url);\n }\n async getPageLayout(page) {\n const index = page - 1;\n let content = this.cache[index];\n if (content === undefined) {\n const url = this.layoutUrls[index];\n content = await fetch(url, { method: \"GET\" }).then((r) => {\n if (r.ok) {\n return r.text();\n }\n else {\n throw new Error(\"Failed to fetch json layout: \" + r.statusText);\n }\n });\n this.cache[index] = content;\n }\n return content;\n }\n}\nclass PageMarkdownProvider {\n totalPages;\n markdownUrls = [];\n cache;\n constructor(totalPages) {\n this.totalPages = totalPages;\n this.cache = new Array(totalPages);\n }\n async loadUrls(vertesia, objectId) {\n const markdownPromises = [];\n for (let i = 0; i < this.totalPages; i++) {\n markdownPromises.push(getMarkdownUrlForPage(vertesia, objectId, i + 1));\n }\n const markdownUrls = await Promise.all(markdownPromises);\n this.markdownUrls = markdownUrls.map((r) => r.url);\n }\n async getPageMarkdown(page) {\n const index = page - 1;\n let content = this.cache[index];\n if (content === undefined) {\n const url = this.markdownUrls[index];\n content = await fetch(url, { method: \"GET\" }).then((r) => {\n if (r.ok) {\n return r.text();\n }\n else {\n throw new Error(\"Failed to fetch markdown: \" + r.statusText);\n }\n });\n this.cache[index] = content;\n }\n return content;\n }\n}\nconst PdfPageContext = createContext(undefined);\nexport function PdfPageProvider({ children, object }) {\n const { client } = useUserSession();\n const [info, setInfo] = useState();\n useEffect(() => {\n const page_count = object.metadata.page_count ||\n DEFAULT_PAGE_COUNT;\n getPdfPagesInfo(client, object, page_count).then(setInfo);\n }, [object.id]);\n return (info && (_jsx(PdfPageContext.Provider, { value: info, children: children })));\n}\nfunction getBasePath(objectId) {\n return `${ADVANCED_PROCESSING_PREFIX}/${objectId}`;\n}\nfunction getPageImagePath(objectId, pageNumber, ext = \".jpg\") {\n return `${getBasePath(objectId)}/pages/page-${pageNumber}${ext}`;\n}\nfunction getPageAnnotatedImagePath(objectId, pageNumber, ext = \".jpg\") {\n return `${getBasePath(objectId)}/pages/page-${pageNumber}-annotated${ext}`;\n}\nfunction getPageInstrumentedImagePath(objectId, pageNumber, ext = \".jpg\") {\n return `${getBasePath(objectId)}/pages/page-${pageNumber}.instrumented${ext}`;\n}\nfunction getPageOriginalImagePath(objectId, pageNumber, ext = \".jpg\") {\n return `${getBasePath(objectId)}/pages/page-${pageNumber}.original${ext}`;\n}\nfunction getLayoutJsonPath(objectId, pageNumber) {\n return `${getBasePath(objectId)}/pages/page-${pageNumber}.layout.json`;\n}\nfunction getMarkdownPath(objectId, pageNumber) {\n return `${getBasePath(objectId)}/pages/page-${pageNumber}.md`;\n}\nexport function getResourceUrl(vertesia, objectId, name) {\n return vertesia.files\n .getDownloadUrl(`${getBasePath(objectId)}/${name}`)\n .then((r) => r.url);\n}\nfunction getImageUrlForPage(vertesia, objectId, pageNumber) {\n return vertesia.files.getDownloadUrl(getPageImagePath(objectId, pageNumber));\n}\nfunction getAnnotatedImageUrlForPage(vertesia, objectId, pageNumber) {\n return vertesia.files.getDownloadUrl(getPageAnnotatedImagePath(objectId, pageNumber));\n}\nfunction getInstrumentedImageUrlForPage(vertesia, objectId, pageNumber) {\n return vertesia.files.getDownloadUrl(getPageInstrumentedImagePath(objectId, pageNumber));\n}\nfunction getOriginalImageUrlForPage(vertesia, objectId, pageNumber) {\n return vertesia.files.getDownloadUrl(getPageOriginalImagePath(objectId, pageNumber));\n}\nfunction getLayoutUrlForPage(vertesia, objectId, pageNumber) {\n return vertesia.files.getDownloadUrl(getLayoutJsonPath(objectId, pageNumber));\n}\nfunction getMarkdownUrlForPage(vertesia, objectId, pageNumber) {\n return vertesia.files.getDownloadUrl(getMarkdownPath(objectId, pageNumber));\n}\nasync function getPdfPagesInfo(vertesia, object, page_count) {\n const imageUrlPromises = [];\n for (let i = 0; i < page_count; i++) {\n imageUrlPromises.push(getImageUrlForPage(vertesia, object.id, i + 1));\n }\n const imageUrls = await Promise.all(imageUrlPromises);\n const annotatedImageUrlPromises = [];\n for (let i = 0; i < page_count; i++) {\n annotatedImageUrlPromises.push(getAnnotatedImageUrlForPage(vertesia, object.id, i + 1));\n }\n const annotatedImageUrls = await Promise.all(annotatedImageUrlPromises);\n const instrumentedImageUrlPromises = [];\n for (let i = 0; i < page_count; i++) {\n instrumentedImageUrlPromises.push(getInstrumentedImageUrlForPage(vertesia, object.id, i + 1));\n }\n const instrumentedImageUrls = await Promise.all(instrumentedImageUrlPromises);\n const originalImageUrlPromises = [];\n for (let i = 0; i < page_count; i++) {\n originalImageUrlPromises.push(getOriginalImageUrlForPage(vertesia, object.id, i + 1));\n }\n const originalImageUrls = await Promise.all(originalImageUrlPromises);\n const layoutProvider = new PageLayoutProvider(page_count);\n await layoutProvider.loadUrls(vertesia, object.id);\n const markdownProvider = new PageMarkdownProvider(page_count);\n await markdownProvider.loadUrls(vertesia, object.id);\n const xml = object.text ? cleanXml(object.text) : \"\";\n return {\n count: page_count,\n urls: imageUrls.map((r) => r.url),\n originalUrls: originalImageUrls.map((r) => r.url),\n annotatedUrls: annotatedImageUrls.map((r) => r.url),\n instrumentedUrls: instrumentedImageUrls.map((r) => r.url),\n layoutProvider,\n markdownProvider,\n xml,\n xmlPages: object.text ? extractXmlPages(xml) : [],\n };\n}\nexport function usePdfPagesInfo() {\n const context = React.useContext(PdfPageContext);\n if (!context) {\n throw new Error(\"usePdfPagesInfo must be used within a PdfPageProvider\");\n }\n return context;\n}\nfunction extractXmlPages(xml) {\n // Parse the XML string\n const doc = new DOMParser().parseFromString(cleanXml(xml), \"text/xml\");\n const pages = doc.getElementsByTagName(\"page\");\n const serializer = new XMLSerializer();\n return Array.from(pages).map((p) => serializer.serializeToString(p));\n}\nfunction cleanXml(xml) {\n const cleanedXML = xml\n // eslint-disable-next-line no-control-regex\n .replace(/[\\x00-\\x08\\x0B\\x0C\\x0E-\\x1F\\x7F]/g, \"\")\n .replace(/<\\?xml.*?\\?>/g, \"\");\n return cleanedXML;\n}\n//# sourceMappingURL=PdfPageProvider.js.map","import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { useUserSession } from \"@vertesia/ui/session\";\nimport { Popover } from \"@vertesia/ui/widgets\";\nimport { CloudDownload } from \"lucide-react\";\nimport { getResourceUrl } from \"./PdfPageProvider\";\nexport function DownloadPopover({ object }) {\n const { client } = useUserSession();\n const onDownload = (name) => {\n getResourceUrl(client, object.id, name).then(url => window.open(url, '_blank'));\n };\n const getProcessorType = () => {\n if (object.metadata?.type === \"document\") {\n const docMetadata = object.metadata;\n return docMetadata.content_processor?.type || \"xml\";\n }\n return \"xml\"; // default\n };\n const processorType = getProcessorType();\n const renderDownloadOptions = () => {\n if (processorType === \"markdown\") {\n return (_jsx(\"button\", { className: \"p-2 cursor-pointer hover:bg-slate-50 dark:hover:bg-slate-100\", onClick: () => onDownload(\"document.md\"), children: \"document.md\" }));\n }\n // Default XML processor options\n return (_jsxs(_Fragment, { children: [_jsx(\"button\", { className: \"p-2 cursor-pointer hover:bg-slate-50 dark:hover:bg-slate-100\", onClick: () => onDownload(\"annotated.pdf\"), children: \"annotated.pdf\" }), _jsx(\"button\", { className: \"p-2 cursor-pointer hover:bg-slate-50 dark:hover:bg-slate-100\", onClick: () => onDownload(\"document.xml\"), children: \"document.xml\" }), _jsx(\"button\", { className: \"p-2 cursor-pointer hover:bg-slate-50 dark:hover:bg-slate-100\", onClick: () => onDownload(\"analyzed-pages.json\"), children: \"analyzed-pages.json\" })] }));\n };\n return (_jsx(\"div\", { className: \"absolute bottom-[58px] right-[20px] w-[36px] h-[36px] cursor-pointer text-indigo-400 border-indigo-400 hover:border-indigo-500 hover:text-indigo-500 border-2 rounded-full shadow-xs flex items-center justify-center\", children: _jsxs(Popover, { strategy: 'absolute', placement: 'top-end', zIndex: 100, offset: 20, children: [_jsx(Popover.Trigger, { click: true, children: _jsx(CloudDownload, { className: 'size-6' }) }), _jsx(Popover.Content, { children: _jsx(\"div\", { className: \"rounded-md shadow-md border border-gray-100 bg-white dark:bg-slate-50 dark:border-slate-100 min-w-[200px] flex flex-col divide-y\", children: renderDownloadOptions() }) })] }) }));\n}\n//# sourceMappingURL=DownloadPopover.js.map","import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { Center } from \"@vertesia/ui/core\";\nimport clsx from \"clsx\";\nimport { AtSignIcon, ChevronsDown, ChevronsUp, ImageIcon, InfoIcon } from \"lucide-react\";\nimport { useRef, useState } from \"react\";\nimport { usePdfPagesInfo } from \"./PdfPageProvider\";\nvar ImageType;\n(function (ImageType) {\n ImageType[ImageType[\"default\"] = 0] = \"default\";\n ImageType[ImageType[\"original\"] = 1] = \"original\";\n ImageType[ImageType[\"instrumented\"] = 2] = \"instrumented\";\n ImageType[ImageType[\"annotated\"] = 3] = \"annotated\";\n})(ImageType || (ImageType = {}));\nexport function PageSlider({ className, currentPage, onChange, object }) {\n const getProcessorType = () => {\n if (object.metadata?.type === \"document\") {\n const docMetadata = object.metadata;\n return docMetadata.content_processor?.type || \"xml\";\n }\n return \"xml\"; // default\n };\n const getDefaultImageType = () => {\n const processorType = getProcessorType();\n return processorType === \"markdown\" ? ImageType.original : ImageType.default;\n };\n const [imageType, setImageType] = useState(getDefaultImageType());\n const ref = useRef(null);\n const { urls, originalUrls, annotatedUrls, instrumentedUrls } = usePdfPagesInfo();\n const goPrev = () => {\n if (currentPage > 1) {\n onChange(currentPage - 1);\n if (ref.current) {\n ref.current.querySelector(`div[data-index=\"${currentPage - 1}\"]`)?.scrollIntoView({\n behavior: 'smooth',\n block: 'end',\n inline: 'center'\n });\n }\n }\n };\n const goNext = () => {\n if (currentPage < urls.length) {\n onChange(currentPage + 1);\n if (ref.current) {\n ref.current.querySelector(`div[data-index=\"${currentPage + 1}\"]`)?.scrollIntoView({\n behavior: 'smooth',\n block: 'end',\n inline: 'center'\n });\n }\n }\n };\n const actualUrls = imageType === ImageType.instrumented ? instrumentedUrls :\n (imageType === ImageType.annotated ? annotatedUrls :\n (imageType === ImageType.original ? originalUrls : urls));\n return (_jsxs(\"div\", { ref: ref, className: clsx('flex flex-col items-stretch gap-y-2', className), children: [_jsxs(\"div\", { className: \"flex h-5 items-center justify-center relative\", children: [_jsx(\"button\", { className: BTN_CLASS, onClick: goPrev, children: _jsx(ChevronsUp, { className: 'w-5 h-5' }) }), _jsx(\"div\", { className: \"absolute right-3 flex gap-x-1\", children: getProcessorType() === \"markdown\" ? (_jsxs(_Fragment, { children: [_jsx(\"button\", { className: getRadioButtonClass(ImageType.original, imageType), onClick: () => setImageType(ImageType.original), children: _jsx(ImageIcon, { className: \"w-5 h-5 mt-1\" }) }), _jsx(\"button\", { className: getRadioButtonClass(ImageType.instrumented, imageType), onClick: () => setImageType(ImageType.instrumented), children: _jsx(InfoIcon, { className: \"w-5 h-5 mt-1\" }) })] })) : (_jsxs(_Fragment, { children: [_jsx(\"button\", { className: getRadioButtonClass(ImageType.default, imageType), onClick: () => setImageType(ImageType.default), children: _jsx(ImageIcon, { className: \"w-5 h-5 mt-1\" }) }), _jsx(\"button\", { className: getRadioButtonClass(ImageType.instrumented, imageType), onClick: () => setImageType(ImageType.instrumented), children: _jsx(InfoIcon, { className: \"w-5 h-5 mt-1\" }) }), _jsx(\"button\", { className: getRadioButtonClass(ImageType.annotated, imageType), onClick: () => setImageType(ImageType.annotated), children: _jsx(AtSignIcon, { className: \"w-5 h-5 mt-1\" }) })] })) })] }), _jsx(\"div\", { className: 'flex flex-col items-center gap-2 flex-1 overflow-y-auto px-2', children: actualUrls.map((url, index) => _jsx(PageThumbnail, { url: url, currentPage: currentPage, pageNumber: index + 1, onSelect: () => onChange(index + 1) }, index)) }), _jsx(\"div\", { className: \"flex h-5 items-center justify-center relative\", children: _jsx(\"button\", { className: BTN_CLASS, onClick: goNext, children: _jsx(ChevronsDown, { className: 'size-5' }) }) })] }));\n}\nfunction PageThumbnail({ url, pageNumber, currentPage, onSelect }) {\n return (_jsxs(\"div\", { className: \"p-2 hover:bg-gray-200 dark:hover:bg-slate-600 rounded-md\", \"data-index\": pageNumber - 1, children: [_jsx(\"div\", { className: clsx('relative border-[2px] cursor-pointer', pageNumber === currentPage ? \"border-blue-500 dark:border-pink-400\" : \"border-gray-300\"), onClick: onSelect, children: _jsx(\"img\", { src: url, alt: `Page ${pageNumber}` }) }), _jsx(Center, { className: \"text-sm text-gray-500 dark:text-gray-400 pt-1 font-semibold align\", children: pageNumber })] }));\n}\nconst BTN_CLASS = \"cursor-pointer text-gray-500 dark:text-gray-400 hover:text-blue-600 dark:hover:text-blue-500 hover:font-semibold\";\nfunction getRadioButtonClass(type, currentType) {\n if (type === currentType) {\n return '${BTN_CLASS} text-pink-600';\n }\n else {\n return `${BTN_CLASS}`;\n }\n}\n//# sourceMappingURL=PageSlider.js.map","import { jsx as _jsx } from \"react/jsx-runtime\";\nimport { JSONCode, XMLViewer, MarkdownRenderer } from '@vertesia/ui/widgets';\nimport { useEffect, useLayoutEffect, useState } from \"react\";\nimport { usePdfPagesInfo } from \"./PdfPageProvider\";\nconst darkTheme = {\n attributeKeyColor: '#FFD700',\n attributeValueColor: '#FF4500',\n tagColor: '#87CEFA',\n textColor: '#00FF00',\n separatorColor: '#FFD700',\n commentColor: \"#BEBEBE\",\n cdataColor: \"#33CC66\",\n};\nexport function TextPageView({ viewType, pageNumber }) {\n switch (viewType) {\n case \"json\":\n return _jsx(JsonPageLayoutView, { pageNumber: pageNumber });\n case \"markdown\":\n return _jsx(MarkdownPageView, { pageNumber: pageNumber });\n default:\n return _jsx(XmlPageView, { pageNumber: pageNumber });\n }\n}\nfunction XmlPageView({ pageNumber }) {\n const [theme, setTheme] = useState();\n const { xmlPages: pages } = usePdfPagesInfo();\n useLayoutEffect(() => {\n const media = window.matchMedia('(prefers-color-scheme: dark)');\n const onMediaChange = (event) => {\n setTheme(event.matches ? darkTheme : undefined);\n };\n media.addEventListener('change', onMediaChange);\n media.matches && setTheme(darkTheme);\n return () => {\n media.removeEventListener('change', onMediaChange);\n };\n }, []);\n return (_jsx(\"div\", { className: \"px-4 py-2\", children: _jsx(XMLViewer, { xml: pages[pageNumber - 1], collapsible: true, theme: theme }) }));\n}\nfunction JsonPageLayoutView({ pageNumber }) {\n const [content, setContent] = useState();\n const { layoutProvider } = usePdfPagesInfo();\n useEffect(() => {\n layoutProvider.getPageLayout(pageNumber).then(content => setContent(content ? JSON.parse(content) : undefined)).catch(err => {\n console.error(err);\n setContent(undefined);\n });\n }, [pageNumber]);\n return (content && _jsx(JSONCode, { className: \"w-full\", data: content }));\n}\nfunction MarkdownPageView({ pageNumber }) {\n const [content, setContent] = useState();\n const { markdownProvider } = usePdfPagesInfo();\n useEffect(() => {\n markdownProvider.getPageMarkdown(pageNumber).then(setContent).catch((err) => {\n console.error(err);\n setContent(undefined);\n });\n }, [pageNumber]);\n return (_jsx(\"div\", { className: \"px-4 py-2 prose prose-sm max-w-none dark:prose-invert\", children: content ? _jsx(MarkdownRenderer, { children: content }) : _jsx(\"div\", { children: \"No markdown content available\" }) }));\n}\n//# sourceMappingURL=TextPageView.js.map","import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from \"react/jsx-runtime\";\nimport { ErrorBox, useFetch } from \"@vertesia/ui/core\";\nimport { useUserSession } from \"@vertesia/ui/session\";\nimport { X } from \"lucide-react\";\nimport { useRef, useState } from \"react\";\nimport { DownloadPopover } from \"./DownloadPopover\";\nimport { PageSlider } from \"./PageSlider\";\nimport { PdfPageProvider } from \"./PdfPageProvider\";\nimport { TextPageView } from \"./TextPageView\";\nimport { useResizeEW } from \"./useResizeOnDrag\";\nexport function MagicPdfView({ objectId, onClose }) {\n const { client } = useUserSession();\n const { data: object, error } = useFetch(() => client.store.objects.retrieve(objectId, \"+text\"), [objectId]);\n if (error) {\n return _jsx(ErrorBox, { title: 'Fetching document failed', children: error.message });\n }\n return object ? (_jsx(\"div\", { className: 'fixed inset-0 bg-white dark:bg-slate-700 z-50 flex items-center justify-center', children: _jsx(PdfPageProvider, { object: object, children: _jsx(MagicPdfViewImpl, { object: object, onClose: onClose }) }) })) : \"Loading...\";\n}\nfunction MagicPdfViewImpl({ object, onClose }) {\n const getInitialViewType = () => {\n if (object.metadata?.type === \"document\") {\n const docMetadata = object.metadata;\n const processorType = docMetadata.content_processor?.type;\n if (processorType === \"markdown\")\n return \"markdown\";\n if (processorType === \"xml\")\n return \"xml\";\n }\n return \"xml\"; // default\n };\n const getProcessorType = () => {\n if (object.metadata?.type === \"document\") {\n const docMetadata = object.metadata;\n return docMetadata.content_processor?.type || \"xml\";\n }\n return \"xml\"; // default\n };\n const [viewType, setViewType] = useState(getInitialViewType());\n const [pageNumber, setPageNumber] = useState(1);\n const processorType = getProcessorType();\n const handler = useRef(null);\n const left = useRef(null);\n const right = useRef(null);\n useResizeEW({\n handler, left, right\n });\n return (_jsxs(_Fragment, { children: [_jsxs(\"div\", { ref: left, className: `absolute top-0 left-0 bottom-0 w-[50%] bg-gray-100 dark:bg-slate-800 flex items-stretch justify-stretch py-2`, children: [_jsx(PageSlider, { className: \"flex-1\", currentPage: pageNumber, onChange: setPageNumber, object: object }), _jsx(\"div\", { ref: handler, className: 'w-[2px] p-[2px] m-0 bg-slate-300 cursor-ew-resize' })] }), _jsx(\"div\", { ref: right, className: `absolute top-0 left-[50%] right-0 bottom-0 flex items-stretch justify-stretch overflow-auto p-2`, children: _jsx(TextPageView, { pageNumber: pageNumber, viewType: viewType }) }), _jsx(DownloadPopover, { object: object }), processorType === \"xml\" && _jsx(ContentSwitcher, { type: viewType, onSwitch: setViewType }), !!onClose &&\n _jsx(\"div\", { className: \"absolute top-6 right-7 w-9 h-9 cursor-pointer text-red-400 border-red-400 hover:border-red-500 hover:text-red-500 border-2 rounded-full shadow-xs flex items-center justify-center\", onClick: onClose, children: _jsx(X, { className: 'size-6' }) })] }));\n}\nfunction ContentSwitcher({ type = \"xml\", onSwitch }) {\n const _onSwitch = () => {\n if (type === \"xml\") {\n onSwitch(\"json\");\n }\n else if (type === \"json\") {\n onSwitch(\"markdown\");\n }\n else if (type === \"markdown\") {\n onSwitch(\"xml\");\n }\n };\n return (_jsxs(\"div\", { className: \"absolute bottom-[16px] right-[20px] w-[36px] h-[36px] cursor-pointer text-indigo-400 border-indigo-400 hover:border-indigo-500 hover:text-indigo-500 border-2 rounded-full shadow-xs flex items-center justify-center\", onClick: _onSwitch, children: [type === \"xml\" && JSON, type === \"json\" && MARKDOWN, type === \"markdown\" && XML] }));\n}\nconst JSON = _jsx(\"svg\", { width: \"16px\", height: \"16px\", viewBox: \"0 0 16 16\", xmlns: \"http://www.w3.org/2000/svg\", fill: \"currentColor\", children: _jsx(\"path\", { \"fill-rule\": \"evenodd\", \"clip-rule\": \"evenodd\", d: \"M6 2.984V2h-.09c-.313 0-.616.062-.909.185a2.33 2.33 0 0 0-.775.53 2.23 2.23 0 0 0-.493.753v.001a3.542 3.542 0 0 0-.198.83v.002a6.08 6.08 0 0 0-.024.863c.012.29.018.58.018.869 0 .203-.04.393-.117.572v.001a1.504 1.504 0 0 1-.765.787 1.376 1.376 0 0 1-.558.115H2v.984h.09c.195 0 .38.04.556.121l.001.001c.178.078.329.184.455.318l.002.002c.13.13.233.285.307.465l.001.002c.078.18.117.368.117.566 0 .29-.006.58-.018.869-.012.296-.004.585.024.87v.001c.033.283.099.558.197.824v.001c.106.273.271.524.494.753.223.23.482.407.775.53.293.123.596.185.91.185H6v-.984h-.09c-.2 0-.387-.038-.563-.115a1.613 1.613 0 0 1-.457-.32 1.659 1.659 0 0 1-.309-.467c-.074-.18-.11-.37-.11-.573 0-.228.003-.453.011-.672.008-.228.008-.45 0-.665a4.639 4.639 0 0 0-.055-.64 2.682 2.682 0 0 0-.168-.609A2.284 2.284 0 0 0 3.522 8a2.284 2.284 0 0 0 .738-.955c.08-.192.135-.393.168-.602.033-.21.051-.423.055-.64.008-.22.008-.442 0-.666-.008-.224-.012-.45-.012-.678a1.47 1.47 0 0 1 .877-1.354 1.33 1.33 0 0 1 .563-.121H6zm4 10.032V14h.09c.313 0 .616-.062.909-.185.293-.123.552-.3.775-.53.223-.23.388-.48.493-.753v-.001c.1-.266.165-.543.198-.83v-.002c.028-.28.036-.567.024-.863-.012-.29-.018-.58-.018-.869 0-.203.04-.393.117-.572v-.001a1.502 1.502 0 0 1 .765-.787 1.38 1.38 0 0 1 .558-.115H14v-.984h-.09c-.196 0-.381-.04-.557-.121l-.001-.001a1.376 1.376 0 0 1-.455-.318l-.002-.002a1.415 1.415 0 0 1-.307-.465v-.002a1.405 1.405 0 0 1-.118-.566c0-.29.006-.58.018-.869a6.174 6.174 0 0 0-.024-.87v-.001a3.537 3.537 0 0 0-.197-.824v-.001a2.23 2.23 0 0 0-.494-.753 2.331 2.331 0 0 0-.775-.53 2.325 2.325 0 0 0-.91-.185H10v.984h.09c.2 0 .387.038.562.115.174.082.326.188.457.32.127.134.23.29.309.467.074.18.11.37.11.573 0 .228-.003.452-.011.672-.008.228-.008.45 0 .665.004.222.022.435.055.64.033.214.089.416.168.609a2.285 2.285 0 0 0 .738.955 2.285 2.285 0 0 0-.738.955 2.689 2.689 0 0 0-.168.602c-.033.21-.051.423-.055.64a9.15 9.15 0 0 0 0 .666c.008.224.012.45.012.678a1.471 1.471 0 0 1-.877 1.354 1.33 1.33 0 0 1-.563.121H10z\" }) });\nconst XML = _jsx(\"svg\", { width: \"16px\", height: \"16px\", viewBox: \"0 0 16 16\", xmlns: \"http://www.w3.org/2000/svg\", fill: \"currentColor\", children: _jsx(\"path\", { d: \"M4.708 5.578L2.061 8.224l2.647 2.646-.708.708-3-3V7.87l3-3 .708.708zm7-.708L11 5.578l2.647 2.646L11 10.87l.708.708 3-3V7.87l-3-3zM4.908 13l.894.448 5-10L9.908 3l-5 10z\" }) });\nconst MARKDOWN = _jsx(\"svg\", { width: \"16px\", height: \"16px\", viewBox: \"0 0 16 16\", xmlns: \"http://www.w3.org/2000/svg\", fill: \"currentColor\", children: _jsx(\"path\", { d: \"M14.85 3H1.15C.52 3 0 3.52 0 4.15v7.69C0 12.48.52 13 1.15 13h13.69c.64 0 1.15-.52 1.15-1.15v-7.7C16 3.52 15.48 3 14.85 3zM9 11H7.5L5.5 9l-1 1.5H3V5h1.5l1 2 2-2H9v6zm2.99.5L9.5 8H11V5h1v3h1.5l-2.51 3.5z\" }) });\n//# sourceMappingURL=MagicPdfView.js.map","import { useEffect } from \"react\";\nexport function useResizeEW(opts) {\n useEffect(() => {\n if (opts.handler.current && opts.left.current && opts.right.current) {\n const handler = opts.handler.current;\n const left = opts.left.current;\n const right = opts.right.current;\n const onMouseDown = (e) => {\n let x = e.clientX;\n let baseLW = left.offsetWidth;\n let baseRL = right.offsetLeft;\n const onMouseMove = (e) => {\n const dx = e.clientX - x;\n left.style.width = `${baseLW + dx}px`;\n right.style.left = `${baseRL + dx}px`;\n e.target.classList.add('resizing');\n };\n const onMouseUp = (e) => {\n e.target.classList.remove('resizing');\n onMouseMove(e);\n document.removeEventListener('mousemove', onMouseMove);\n document.removeEventListener('mouseup', onMouseUp);\n };\n document.addEventListener('mousemove', onMouseMove);\n document.addEventListener('mouseup', onMouseUp);\n };\n handler.addEventListener('mousedown', onMouseDown);\n return () => {\n handler.removeEventListener('mousedown', onMouseDown);\n };\n }\n }, [opts.handler.current, opts.left.current, opts.right.current]);\n}\n//# sourceMappingURL=useResizeOnDrag.js.map","export function AnyOf(...permissions) {\n const p = Array.from(permissions);\n p.__AnyOf__ = true;\n return p;\n}\nexport function AllOf(...permissions) {\n return Array.from(permissions);\n}\nexport function isAnyOf(permissions) {\n return permissions.__AnyOf__ === true;\n}\n//# sourceMappingURL=helpers.js.map","import { jsx as _jsx } from \"react/jsx-runtime\";\nimport { ErrorBox, useFetch } from \"@vertesia/ui/core\";\nimport { useUserSession } from \"@vertesia/ui/session\";\nimport { createContext, useContext, useMemo } from \"react\";\nimport { isAnyOf } from \"./helpers\";\nexport class UserPermissions {\n system_roles; // all roles defined in the system\n roles; // all roles of the current user\n permissions; // all permissions of the current user\n constructor(session, roles) {\n if (!session.authToken) {\n throw new Error('No auth token found in user session');\n }\n this.system_roles = roles;\n const userRoles = new Set(session.authToken.account_roles || []);\n if (session.authToken.project_roles) {\n for (const role of session.authToken.project_roles) {\n userRoles.add(role);\n }\n }\n this.roles = userRoles;\n // build a temporary role to permissions map\n const map = {};\n for (const role of roles) {\n map[role.name] = role.permissions;\n }\n const permissions = new Set();\n for (const role of userRoles) {\n const rolePermissions = map[role];\n if (rolePermissions) {\n for (const permission of rolePermissions) {\n permissions.add(permission);\n }\n }\n }\n this.permissions = permissions;\n }\n hasPermission(permission) {\n if (typeof permission === 'string') {\n return this.permissions.has(permission);\n }\n else if (isAnyOf(permission)) {\n return permission.some(p => this.permissions.has(p));\n }\n else { // all of\n for (const p of permission) {\n if (!this.permissions.has(p)) {\n return false;\n }\n }\n return true;\n }\n }\n}\nconst UserPermissionsContext = createContext(undefined);\nexport { UserPermissionsContext };\nexport function useUserPermissions() {\n const perms = useContext(UserPermissionsContext);\n if (!perms) {\n throw new Error('UserPermissionContext cannot be used outside UserPermissionProvider');\n }\n return perms;\n}\nexport function UserPermissionProvider({ children }) {\n const session = useUserSession();\n const { data, error, isLoading } = useFetch(() => {\n if (session.user) {\n return session.client.iam.roles.list();\n }\n else {\n return Promise.resolve(undefined);\n }\n }, [session.user]);\n const perms = useMemo(() => {\n if (session.authToken && data && !isLoading) {\n return new UserPermissions(session, data);\n }\n else {\n return undefined;\n }\n }, [session, data, isLoading]);\n if (error) {\n return _jsx(ErrorBox, { title: \"Failed to fetch role mappings\", children: error.message });\n }\n return perms && (_jsx(UserPermissionsContext.Provider, { value: perms, children: children }));\n}\n//# sourceMappingURL=UserPermissionsProvider.js.map","import { jsx as _jsx } from \"react/jsx-runtime\";\nimport { Button } from \"@vertesia/ui/core\";\nimport { useUserPermissions } from \"./UserPermissionsProvider\";\nexport function SecureButton({ permission, isDisabled, title, children, ...others }) {\n const perms = useUserPermissions();\n const hasPermission = perms.hasPermission(permission);\n if (!hasPermission) {\n isDisabled = true;\n title = 'You do not have permission to perform this action';\n }\n return (_jsx(Button, { isDisabled: isDisabled, title: title, ...others, children: children }));\n}\n//# sourceMappingURL=SecureButton.js.map","import { jsx as _jsx } from \"react/jsx-runtime\";\nimport { SidebarItem } from \"@vertesia/ui/layout\";\nimport { useUserPermissions } from \"./UserPermissionsProvider\";\nexport function SecureSidebarItem({ permission, ...others }) {\n const perms = useUserPermissions();\n const hasPermission = perms.hasPermission(permission);\n if (!hasPermission) {\n return null;\n }\n else {\n return (_jsx(SidebarItem, { ...others }));\n }\n}\n//# sourceMappingURL=SecureSidebarItem.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\n/**\n * UserAvatar\n * Show user picture, name and email\n **/\nexport function UserAvatar({ user }) {\n const userPicture = () => {\n if (!user.picture) {\n const initials = user.name.split(' ').map((n) => n[0]).join('');\n return _jsx(\"span\", { className: \"inline-flex h-8 w-8 items-center justify-center rounded-full bg-indigo-600\", children: _jsx(\"span\", { className: \"text-sm font-medium leading-none text-white\", children: initials }) });\n }\n else {\n return _jsx(\"img\", { className: \"inline-block h-9 w-9 rounded-full\", src: user.picture, alt: user.name });\n }\n };\n return (_jsxs(\"div\", { className: \"flex items-center\", children: [_jsx(\"div\", { className: \"w-9 h-9\", children: userPicture() }), _jsxs(\"div\", { className: \"ml-3\", children: [_jsx(\"p\", { className: \"text-sm font-medium text-gray-700 dark:text-slate-50 group-hover:text-gray-900\", children: user.name ?? 'Deleted User' }), _jsx(\"p\", { className: \"text-xs font-medium text-gray-500 dark:text-slate-300 group-hover:text-gray-700\", children: user.email ?? 'Deleted User' })] })] }));\n}\n//# sourceMappingURL=UserAvatar.js.map"],"names":["Badge","children","secondary","_jsx","className","resolveInnerType","innerType","name","PropertySignature","property","_jsxs","optional","type","value","ActivitiesDoc","activities","map","activity","ActivityDoc","ActivitySectionTitle","code","headingClass","headingRef","id","ref","title","doc","paramsType","params","prop","PropertyDetails","returnType","expandable","useMemo","members","ObjectMembersPanel","enum","EnumValuesPanel","values","clsx","v","i","ExpandablePanel","button","isOn","ExpandIcon","isOpen","body","NestedPropertiesDetails","properties","isInitiallyOpen","isExpanded","setExpanded","useState","onClick","AnimatePresence","motion","div","initial","height","opacity","animate","exit","transition","duration","ease","propagate","mode","rotate","JumpingDots","inline","cn","style","transform","animationRange","AnimatedThinkingDots","color","gradientClass","blue","purple","teal","green","amber","PulsatingCircle","size","colorClasses","left","top","animationDuration","sm","md","lg","TypedDots","dots","setDots","useEffect","intervalId","setInterval","prev","clearInterval","PulsingMessageLoader","message","dot","text","animationDelay","ThinkingBar","width","progress","setProgress","direction","setDirection","speed","setSpeed","animationFrameId","lastUpdateTime","Date","now","updateProgressBar","deltaTime","timeBasedChange","next","Math","random","max","min","requestAnimationFrame","cancelAnimationFrame","xl","full","WavyThinking","barHeights","setBarHeights","Array","fill","sizeClasses","barWidth","gap","speeds","phases","time","animateBars","newHeights","_","index","sin","ThinkingMessages","DONE_STATES","AgentMessageType","COMPLETE","IDLE","REQUEST_INPUT","TERMINATED","getWorkstreamId","workstream_id","console","log","MessageItem","showPulsatingCircle","showDetails","setShowDetails","processedContent","setProcessedContent","isProcessingImages","setIsProcessingImages","client","useUserSession","toast","useToast","messageStyles","baseStyle","containerClass","iconComponent","Bot","sender","ANSWER","CheckCircle","QUESTION","User","THOUGHT","ERROR","AlertCircle","UPDATE","Info","PLAN","MessageSquare","getMessageStyles","getMessageContent","content","JSON","stringify","trim","String","includes","randomIndex","floor","length","replace","renderContent","Markdown","remarkPlugins","remarkGfm","components","a","node","props","href","NavLink","topLevelNav","target","rel","img","loading","src","window","open","match","exec","isInline","language","_Fragment","p","strong","em","pre","h1","h2","h3","li","ul","ol","blockquote","hr","table","th","td","messageContent","async","processed","imageMatches","from","matchAll","imageReplacements","Promise","all","fullMatch","altText","gcsPath","replacement","files","getDownloadUrl","url","error","convertLinks","toLowerCase","formattedContent","test","processContentForMarkdown","processContent","workstreamId","messageTypeStyles","getMessageTypeStyles","iconColor","getIconColor","getThinkingAnimation","timestamp","getTime","Clock","getMessageIcon","variant","dayjs","format","Button","detailsContent","details","textToCopy","join","navigator","clipboard","writeText","then","status","CopyIcon","xmlns","viewBox","stroke","strokeLinecap","strokeLinejoin","strokeWidth","d","WorkstreamTabs","workstreams","activeWorkstream","onSelectWorkstream","count","completionStatus","filteredWorkstreams","Map","set","forEach","sortedWorkstreams","entries","sort","idA","idB","localeCompare","hasMultipleWorkstreams","undefined","substring","has","get","filterMessagesByWorkstream","messages","filter","AllMessagesMixed","bottomRef","viewMode","isCompleted","containerRef","React","useRef","setActiveWorkstream","current","scrollIntoView","behavior","sortedMessages","b","extractedWorkstreams","extractWorkstreams","workstreamCounts","counts","mainMessages","msg","displayMessages","workstreamCompletionStatus","statusMap","workstreamMessages","push","msgs","lastMessage","isLatestNonCompletionMessage","permanentMessages","latestThinkingMessage","timeA","allMessages","isLatestMessage","PayloadBuilder","vertesia","updateState","_interactive","_debug_mode","_collection","_start","_preserveRunValues","_interaction","_environment","_model","_tool_names","_data","_interactionParamsSchema","_inputValidator","constructor","this","onStateChanged","newInstance","clone","builder","interactive","debug_mode","collection","search_scope","AgentSearchScope","Collection","restoreConversation","context","interactionRef","interaction","version","inter","interactions","catalog","resolve","envId","runtime","environment","config","model","env","environments","retrieve","interactionParamsSchema","tool_names","data","collection_id","mergeInCodePromptSchemas","prompts","interactionModel","supportsToolUse","provider","default_model","tools","prompt_data","run","start","preserveRunValues","schema","reset","location","hash","urlWithoutHash","origin","pathname","search","history","replaceState","validateInput","isValid","ajv","Ajv","strict","validate","compile","errorMessage","errors","err","instancePath","PayloadContext","createContext","PayloadBuilderProvider","setBuilder","Provider","usePayloadBuilder","ctx","useContext","Error","Header","onClose","isModal","onViewModeChange","showPlanPanel","hasPlan","onTogglePlanPanel","onDownload","onCopyRunId","resetWorkflow","runId","ClipboardList","MoreDropdown","XIcon","Popover","hover","PopoverTrigger","MoreVertical","PopoverContent","align","Command","CommandList","CommandGroup","CommandItem","onSelect","openUrl","workflowId","ExternalLink","workflowRunId","r","getConversationUrl","DownloadCloudIcon","store","workflows","terminate","cancelWorkflow","LAST_DISPLAYED_VIEW","ContentDispositionButton","onUpdate","isGridView","setIsGridView","localStorage","getItem","toggleGridView","setItem","toggleTableView","alt","TableProperties","LayoutGrid","SaveOptionAdapter","RadioOptionAdapter","labelOf","item","label","idOf","renderOption","description","SaveVersionConfirmModal","onConfirm","isLoading","uploadedFileName","saveOptions","defaultOption","selectedOption","setSelectedOption","versionLabel","setVersionLabel","optionAdapter","createVersion","Modal","ModalTitle","ModalBody","RadioGroup","adapter","options","onChange","option","FormItem","Input","placeholder","ModalFooter","disabled","PropertiesEditorModal","object","refetch","navigate","useNavigate","setIsLoading","propertiesJson","setPropertiesJson","showConfirmation","setShowConfirmation","parsedProperties","setParsedProperties","editorRef","monacoRef","jsonSchema","setJsonSchema","_newVersionId","setNewVersionId","setMonacoJsonSchema","monaco","languages","json","jsonDefaults","setDiagnosticsOptions","schemas","uri","fileMatch","typeId","typeDetails","types","object_schema","fetchJsonSchema","Editor","onMount","editor","minimap","enabled","scrollBeyondLastLine","formatOnPaste","formatOnType","automaticLayout","wordWrap","editorValue","getValue","parse","response","objects","update","createRevision","revisionLabel","setTimeout","MAX_TEXT_DISPLAY_SIZE","PanelView","ContentOverview","loadText","handleCopyContent","ResizablePanelGroup","ResizablePanel","PropertiesPanel","ResizableHandle","withHandle","DataPanel","viewCode","setViewCode","isPropertiesModalOpen","setPropertiesModalOpen","Copy","SquarePen","JSONDisplay","isImage","metadata","ContentNature","Image","isVideo","Video","currentPanel","setCurrentPanel","Text","setText","isLoadingText","setIsLoadingText","isTextCropped","setIsTextCropped","getObjectText","res","croppedText","catch","finally","TextActions","ImagePanel","VideoPanel","Spinner","TextPanel","loadingFormat","setLoadingFormat","isMarkdown","handleExportDocument","toUpperCase","getRendition","generate_if_missing","sign_url","renditions","downloadUrl","link","document","createElement","download","appendChild","click","removeChild","Download","memo","isMarkdownOrText","seemsMarkdown","shouldRenderAsMarkdown","AlertTriangle","MarkdownRenderer","imageUrl","setImageUrl","isOriginalWebSupported","rendition","ImageRenditionFormat","jpeg","source","loadImage","videoUrl","setVideoUrl","posterUrl","setPosterUrl","webRendition","find","poster","POSTER_RENDITION_NAME","loadPoster","loadVideoUrl","controls","shortId","slice","shortenString","str","CSV_PREFIX","IMAGE_PREFIX","PDF_PREFIX","VIDEO_PREFIX","isCsv","startsWith","isPdf","RENDITION_OPTIONS","max_hw","VITE_RENDITION_HW","RENDITION_ID","retrieveRendition","setRenditionUrl","setRenditionAlt","setRenditionStatus","currentTime","savedId","elapsedTime","abs","parseInt","toString","warn","DocumentIconSkeleton","Card","Separator","CardContent","DocumentIcon","selection","onSelectionChange","onRowClick","previewObject","selectedObject","renditionUrl","renditionAlt","renditionStatus","checked","isSelected","ev","stopPropagation","e","Eye","VTooltip","placement","score","toFixed","facetOptionLabel","bucket","_id","facetOptionNameLabel","StringFacet","buckets","filterValue","getFilterValue","SelectBox","filterBy","isClearable","optionLabel","setFilterValue","by","StringListFacet","tags","setTags","InputList","TypeFacet","setOptions","typeRegistry","getTypeName","VStringFacet","multiple","charAt","allowCreate","createStringFilterGroup","VTypeFacet","typeDataMap","actualId","displayKey","typeData","labelRenderer","optionValue","searchText","USER_CACHE","GROUP_CACHE","useFetchUserInfo","userId","useFetch","user","users","useFetchGroupInfo","groupId","group","iam","groups","AvatarPlaceholder","SystemAvatar","showTitle","UserPopoverPanel","Avatar","ServiceAccountAvatar","accountId","ErrorAvatar","UnknownAvatar","UserInfo","userRef","split","PrincipalType","UserAvatar","Group","GroupAvatar","ServiceAccount","Agent","ApiKey","ApiKeyAvatar","keyId","tag","Users","email","username","picture","apikeys","avatar","Table","account","project","sideOffset","side","VUserFacet","createUserFilterGroup","EnvironmentFacet","resolvedOptions","useRunsFilterGroups","facets","customFilterGroups","interactionFilterGroup","interactionId","displayName","badgeVariant","InteractionStatus","published","archived","badgeText","VInteractionFacet","environmentFilterGroup","environmentId","VEnvironmentFacet","models","modelFilterGroup","statuses","statusFilterGroup","finish_reason","finishReasonFilterGroup","created_by","createdByFilterGroup","useRunsFilterHandler","newFilters","clearFilters","filterName","isArray","query","RunsFacetsNav","filters","setFilters","filterGroups","handleFilterLogic","FilterProvider","FilterBtn","RefreshCw","FilterBar","FilterClear","useWorkflowExecutionsFilterGroups","initiated_by","initiatedByFilterGroup","useWorkflowExecutionsFilterHandler","search_term","WorkflowExecutionsFacetsNav","useDocumentFilterGroups","typeFilterGroup","useDocumentFilterHandler","dateValue","gte","lte","DocumentsFacetsNav","useInteractionsFilterGroups","useInteractionsFilterHandler","InteractionsFacetsNav","usePromptsFilterGroups","role","rolesFilterGroup","facet","usePromptsFilterHandler","PromptsFacetsNav","useCollectionsFilterGroups","useCollectionsFilterHandler","CollectionsFacetsNav","DocumentSelection","setState","collectionId","singleSelection","Object","keys","isSingleSelection","hasSelection","getObjectIds","getObjectId","add","remove","objectId","addAll","obj","removeAll","DocumentSelectionContext","useDocumentSelection","useOptionalDocumentSelection","DocumentSelectionProvider","setSelection","extend","RelativeTime","LocalizedFormat","renderers","string","_onClick","transforms","max_length","t","fileSize","_params","bytes","Number","isNaN","sizes","pow","number","currency","decimals","digits","Intl","NumberFormat","maximumFractionDigits","hasSlice","displayValue","reduce","objectName","typeLink","date","method","arg","localized","relative","defaultRenderer","resolveField","path","last","splitPath","DocumentTableColumn","layout","renderer","fallbackPath","field","fallback","render","_value","_index","indexOf","URLSearchParams","resolveValue","default","objectIdRenderer","DocumentTableView","columns","toggleAll","col","TBody","colSpan","DocumentGridView","DocumentSearch","limit","SharedState","result","facetSpecs","withFacets","isRunning","hasMore","setDefaultKeys","autoSearch","parent","full_text","vector","weights","score_aggregation","dynamic_scaling","all_revisions","getFacetBuckets","resetFacets","_updateRunningState","_searchRequest","offset","includeFacets","payload","collections","searchMembers","_facetsRequest","computeFacets","_query","_search","loadMore","noFacets","results","concat","DocumentSearchContext","useDocumentSearch","useWatchDocumentSearchFacets","useWatchSharedState","useWatchDocumentSearchResult","useDocumentSearchCount","total","FileUploadAction","calculateFileHash","file","arrayBuffer","md5","Md5","appendByteArray","Uint8Array","end","useSmartFileUploadProcessing","checkDocumentProcessing","selectedFolder","limitToCollectionId","filesWithMetadata","batch","metadataResults","webkitRelativePath","pathParts","folderPath","prepareFilesWithMetadata","identifyExistingHash","$in","select","f","etag","existingId","action","SKIP","identifyExistingIds","unskippedFiles","allLocations","uniqueLocations","Set","queries","namesInLocation","flat","CREATE","totalFiles","toCreate","toUpdate","toSkip","DocumentUploadModal","initialFiles","onUploadComplete","hideFileSelection","showTypeSelectionOnly","setFiles","processedFiles","setProcessedFiles","processingDone","setProcessingDone","selectedType","setSelectedType","fileStatuses","setFileStatuses","isUploading","setIsUploading","uploadComplete","setUploadComplete","overallProgress","setOverallProgress","modalKey","setModalKey","collectionData","setCollectionData","setResult","_title","setTitle","_description","setDescription","round","renderLocationInfo","MessageBox","icon","FolderIcon","processingStats","setProcessingStats","processFiles","handleClose","handleFileSelect","newFiles","filesToProcess","handleUpload","initialStatuses","fileInfo","filesToSkip","filesToUpdate","filesToCreate","success","objectIds","uploadedFiles","skippedFiles","failedFiles","processBatch","batches","batchIndex","filesProcessedInBatch","toISOString","createResult","create","currentStatuses","completedFiles","missingStatuses","createdCount","updatedCount","skippedCount","failedCount","statusMessage","typeSelection","VSelectBox","selected","CheckCircleIcon","VModal","disableCloseOnClickOutside","VModalTitle","VModalBody","fileStatus","FileIcon","XCircleIcon","UploadSummary","UploadIcon","AlertCircleIcon","DropZone","onDrop","buttonLabel","VModalFooter","canUpload","renderModalFooter","useDocumentUploadHandler","onUploadDone","projectRef","filesToUpload","skippedFilesInfo","uploadedFilesInfo","failedFilesInfo","batchSize","processBatches","processedCount","processResults","updateResult","creates","updates","failures","uploadedCount","totalObjectIds","updatedFiles","defaultLayout","DocumentTable","onUpload","others","ObjectTableWithDropZone","DocumentTableImpl","skipTypeModal","setLoading","isDragging","setIsDragging","typeSelectionOpen","setTypeSelectionOpen","handleFileDrop","droppedFiles","feedback","filesLength","processedFilesLength","uploadPromise","onDoUpload","filesCount","hasProcessingResults","handleDragOver","preventDefault","onDragOver","onDragEnter","onDragLeave","currentTarget","contains","relatedTarget","dataTransfer","items","kind","getAsFile","allowFolders","created","updated","skipped","_onSelectionChange","isShift","nativeEvent","shiftKey","findIndex","findPreviousSelected","toSelect","findNextSelected","DocumentSearchProvider","unshift","SearchContext","SelectDocument","SelectDocumentImpl","isReady","setIsReady","loadMoreRef","useIntersectionObserver","deps","facetSearch","ErrorBox","SelectDocumentModal","STORE_REGEX","DocumentInput","off","on","useFlag","actualValue","setValue","setDoc","clearValue","event","Styles","INPUT","X","ChevronsUpDown","useDownloadDocument","getDownloadUrlWithOptions","DocumentPreviewPanel","setObject","loadingText","setLoadingText","currentTab","setCurrentTab","loadObjectText","loadImageUrl","downloadUrlResult","handleViewFullDocument","FileText","Maximize2","formatFileSize","created_at","toLocaleString","updated_at","ChevronRight","parseFloat","allTypes","SearchTypes","embeddingTypes","SupportedEmbeddingTypes","VectorSearchWidget","refresh","searchTypes","setSearchText","setConfig","embeddings","image","setStatus","showSettings","setShowSettings","selectedTypes","setSelectedTypes","setLimit","embeddingSearchTypes","fullTextEnabled","vectorSearchEnabled","projects","configuration","fireSearch","handleCheckboxChange","onKeyDown","key","Settings","Checkbox","onCheckedChange","NumberInput","isDisabled","DocumentSearchResultsWithDropZone","uploadHandler","DocumentSearchResults","allowFilter","allowSearch","searchContext","setSelectedObject","actualLayout","setActualLayout","registry","getTypeLayout","some","getTableLayout","refreshTrigger","_setRefreshTrigger","loaded","setLoaded","URL","filtersParam","searchParams","filterPairs","validFilterPairs","pair","encodedName","decodeURIComponent","newFiltersParam","delete","state","OverviewDrawer","Toolsbar","handleFilterChange","handleVectorSearch","c","handleRefetch","o","SidePanel","Divider","ExportTypes","ExportPropertiesModal","isExporting","SelectPanel","WaitingPanel","exportType","setExportType","exportAll","setExportAll","selectionOption","BrowseCollectionView","tableLayout","table_layout","dynamic","addMembers","SelectContentType","defaultValue","session","isMounted","setIsMounted","_onChangeMultiple","CreateCollectionForm","redirect","onAddToCollection","isProcessing","setProcessing","setPayload","setPayloadProp","onSubmit","required","Textarea","Switch","allowed_types","CreateCollectionModal","CollectionsTable","collectionToDelete","setCollectionToDelete","setOpen","TR","collectionIcon","fromNow","Trash2","EmptyCollection","ConfirmModal","onCancel","isDynamic","tooltipText","Search","FolderClosed","ContentObjectTypesTable","strict_mode","is_chunkable","relativeTime","ObjectTypeSearch","list","ObjectTypeSearchContext","useSearch","useWatchSearchResult","useSearchCount","CreateOrUpdateTypeModal","okLabel","initialPayload","setName","strictMode","setStrictMode","onSave","ChunkableOptions","ContentObjectTypesSearch","isDirty","searchTerm","setSearchTerm","debounceValue","useDebounce","chunkable","setChunkable","showCreateModal","setShowCreateModal","reloadTypes","CODE_MIRROR_EXTENSIONS","basicSetup","ObjectSchemaEditor","objectType","onSchemaUpdate","isUpdating","setUpdating","useSchema","displayJson","setDisplayJson","jsonToContent","updateSchemaFromJson","newSchema","contentToJson","validateSchema","replaceSchema","CodeMirrorEditor","extensions","SchemaEditor","ObjectTypeSearchProvider","SelectContentTypeModal","initialSelectedType","confirmLabel","allowNone","TableLayoutEditor","onLayoutUpdate","stringifyTableLayout","validationError","EditCollectionView","tableLayoutRef","setMetadata","tableLayoutValue","setField","Panel","updated_by","PropertiesEditor","setIsUpdating","ManagedObject","GeneratedForm","getLabel","SelectCollection","filterOut","allowDynamic","handleSelect","useCallback","selectedCollections","ids","selectedCollection","allCollections","ChangeTypeActionComponent","callback","useObjectsActionCallback","runOperation","ChangeTypeAction","confirm","component","ConfirmAction","showConfirmModal","setShowConfirmModal","confirmationText","_callback","DeleteObjectsActionComponent","useObjectsActionContext","limitFilesName","names","maxLength","extIndex","lastIndexOf","ext","plural","DeleteObjectsAction","destructive","DeleteObjectsFromCollectionsAction","ExportPropertiesComponent","setIsExporting","search_objectIds","getChildObjects","Ids","exportProperties","CSV","Blob","responseData","createObjectURL","ExportPropertiesAction","RemoveFromCollectionActionComponent","deleteMembers","RemoveFromCollectionAction","StartWorkflowComponent","StartWorkflowModal","rules","execute","StartWorkflowAction","hideInList","StartWorkflowBody","optionLayout","reverse","setSelected","SelectList","wfRules","ObjectsActionContext","allActions","AddToCollectionAction","callbacks","startWorkflow","actions","loadWorkflows","rule","isWorkflow","registerCallback","cb","unregisterCallback","findAction","actionId","ObjectsActionContextReact","ObjectsActionContextProvider","Actions","display","useStartWorkflowCallback","AddToCollectionActionComponent","showModal","setShowModal","Portal","SelectCollectionModal","DialogDescription","AddToCollectionForm","selectedCollectionId","setSelectedCollectionId","tabs","Heading","level","VTabs","fullWidth","VTabsBar","VTabsPanel","SelectionActions","hasSingleSelection","SelectionActionsPopover","EllipsisVertical","ActionsWrapper","StartWorkflowButton","UploadObjectsButton","fileInput","accept","onchange","selectFile","PopoverBody","executeAction","_selection","noCheck","MessageInput","onSend","isSending","activeTaskCount","isObjectModalOpen","setIsObjectModalOpen","focus","minHeight","PaperclipIcon","SendIcon","Activity","markdownLink","currentValue","cursorPos","selectionStart","newValue","newCursorPos","setSelectionRange","InlineSlidingPlanPanel","plan","workstreamStatus","plans","activePlanIndex","onChangePlan","maxHeight","planTasks","totalTasks","completedTasks","task","taskId","progressPercentage","toLocaleTimeString","taskGoal","goal","StatusIcon","Circle","statusColor","planTaskIds","workstreamEntries","statusBg","statusText","ModernAgentConversation","execRun","run_id","workflow_id","ModernAgentConversationInner","StartWorkflowView","EmptyState","initialMessage","startButtonText","inputValue","setInputValue","setIsSending","setRun","inputRef","startWorkflowWithMessage","sessionStorage","removeItem","newRun","Cpu","setMessages","setIsCompleted","setViewMode","showSlidingPanel","setShowSlidingPanel","setPlans","setActivePlanIndex","workstreamStatusMap","setWorkstreamStatusMap","thinkingMessageIndex","setThinkingMessageIndex","showInput","setShowInput","workflowStatus","setWorkflowStatus","getActivePlan","currentPlanData","currentWorkstreamStatus","interval","statusResult","getRunDetails","checkWorkflowStatus","streamMessages","prev_messages","m","arr","idx","splice","insertMessageInTimeline","onlyWorkstreamId","onlyWorkstreamMsgs","mainWorkstreamMsgs","lastMainMessage","isInProgress","notificationTimeout","clearTimeout","newPlanDetails","newPlan","newPlans","newWorkstreamStatus","newMap","actualTitle","taskLabels","acc","sendSignal","activeCount","getActiveTaskCount","VertesiaErrorBoundary","ErrorBoundaryInstance","ErrorBoundary","FallbackComponent","setErrorBoundaryComponent","ErrorBoundaryComponent","PanelErrorBoundary","PanelErrorFallback","RowErrorBoundary","RowErrorFallback","WidgetErrorBoundary","WidgetErrorFallback","GenericPageNavHeader","breadcrumbs","isCompact","useDynamicBreadcrumbs","buildBreadcrumbLabel","entry","pathSegments","segment","secondSegment","capitalize","breadcrumbItems","historyChain","stepsBack","go","breadcrumb","clearBreadcrumbs","buildBreadcrumbItems","Breadcrumbs","separator","maxItems","NotFoundView","PageLayoutProvider","totalPages","layoutUrls","cache","loadUrls","layoutPromises","getLayoutUrlForPage","getPageLayout","page","fetch","ok","PageMarkdownProvider","markdownUrls","markdownPromises","getMarkdownUrlForPage","getPageMarkdown","PdfPageContext","PdfPageProvider","info","setInfo","page_count","imageUrlPromises","getImageUrlForPage","imageUrls","annotatedImageUrlPromises","getAnnotatedImageUrlForPage","annotatedImageUrls","instrumentedImageUrlPromises","getInstrumentedImageUrlForPage","instrumentedImageUrls","originalImageUrlPromises","getOriginalImageUrlForPage","originalImageUrls","layoutProvider","markdownProvider","xml","cleanXml","urls","originalUrls","annotatedUrls","instrumentedUrls","xmlPages","extractXmlPages","getPdfPagesInfo","getBasePath","pageNumber","getPageImagePath","getPageAnnotatedImagePath","getPageInstrumentedImagePath","getPageOriginalImagePath","getLayoutJsonPath","getMarkdownPath","usePdfPagesInfo","pages","DOMParser","parseFromString","getElementsByTagName","serializer","XMLSerializer","serializeToString","DownloadPopover","getResourceUrl","processorType","docMetadata","content_processor","getProcessorType","strategy","zIndex","Trigger","CloudDownload","Content","ImageType","PageSlider","currentPage","imageType","setImageType","original","actualUrls","instrumented","annotated","BTN_CLASS","querySelector","block","ChevronsUp","getRadioButtonClass","ImageIcon","InfoIcon","AtSignIcon","PageThumbnail","ChevronsDown","Center","currentType","darkTheme","attributeKeyColor","attributeValueColor","tagColor","textColor","separatorColor","commentColor","cdataColor","TextPageView","viewType","JsonPageLayoutView","MarkdownPageView","XmlPageView","theme","setTheme","useLayoutEffect","media","matchMedia","onMediaChange","matches","addEventListener","removeEventListener","XMLViewer","collapsible","setContent","JSONCode","MagicPdfView","MagicPdfViewImpl","setViewType","getInitialViewType","setPageNumber","handler","right","opts","onMouseDown","x","clientX","baseLW","offsetWidth","baseRL","offsetLeft","onMouseMove","dx","classList","onMouseUp","ContentSwitcher","onSwitch","MARKDOWN","XML","AnyOf","permissions","__AnyOf__","AllOf","isAnyOf","UserPermissions","system_roles","roles","authToken","userRoles","account_roles","project_roles","rolePermissions","permission","hasPermission","UserPermissionsContext","useUserPermissions","perms","UserPermissionProvider","SecureButton","SecureSidebarItem","SidebarItem","initials","n","userPicture"],"mappings":"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"}
1
+ {"version":3,"file":"vertesia-ui-features.js","sources":["esm/features/activity-doc/ActivityDoc.js","esm/features/agent/chat/JumpingDots.js","esm/features/agent/chat/AnimatedThinkingDots.js","esm/features/agent/chat/WaitingMessages.js","esm/features/agent/chat/ModernAgentOutput/utils.js","esm/features/agent/chat/ModernAgentOutput/MessageItem.js","esm/features/agent/chat/ModernAgentOutput/WorkstreamTabs.js","esm/features/agent/chat/ModernAgentOutput/AllMessagesMixed.js","esm/features/agent/PayloadBuilder.js","esm/features/agent/chat/ModernAgentOutput/Header.js","esm/features/store/objects/components/ContentDispositionButton.js","esm/features/store/objects/components/SaveVersionConfirmModal.js","esm/features/store/objects/components/PropertiesEditorModal.js","esm/features/store/objects/components/ContentOverview.js","esm/features/utils/text.js","esm/features/utils/mimeType.js","esm/features/utils/rendition.js","esm/features/store/objects/components/DocumentIcon.js","esm/features/facets/utils/utils.js","esm/features/facets/utils/StringFacet.js","esm/features/facets/utils/StringListFacet.js","esm/features/facets/utils/TypeFacet.js","esm/features/facets/utils/VStringFacet.js","esm/features/facets/utils/VTypeFacet.js","esm/features/user/UserInfo.js","esm/features/facets/utils/VUserFacet.js","esm/features/facets/EnvironmentFacet.js","esm/features/facets/RunsFacetsNav.js","esm/features/facets/utils/VInteractionFacet.js","esm/features/facets/utils/VEnvironmentFacet.js","esm/features/facets/WorkflowExecutionsFacetsNav.js","esm/features/facets/DocumentsFacetsNav.js","esm/features/facets/InteractionsFacetsNav.js","esm/features/facets/PromptsFacetsNav.js","esm/features/facets/CollectionsFacetsNav.js","esm/features/store/objects/DocumentSelectionProvider.js","esm/features/store/objects/layout/renderers.js","esm/features/store/objects/layout/DocumentTableColumn.js","esm/features/store/objects/layout/documentLayout.js","esm/features/store/objects/search/DocumentSearchContext.js","esm/features/store/objects/upload/useSmartFileUploadProcessing.js","esm/features/store/objects/upload/DocumentUploadModal.js","esm/features/store/objects/upload/useUploadHandler.js","esm/features/store/objects/DocumentTable.js","esm/features/store/objects/search/DocumentSearchProvider.js","esm/features/store/objects/components/SelectDocument.js","esm/features/store/objects/components/SelectDocumentModal.js","esm/features/store/objects/components/DocumentInput.js","esm/features/store/objects/components/useDownloadObject.js","esm/features/store/objects/DocumentPreviewPanel.js","esm/features/store/objects/components/VectorSearchWidget.js","esm/features/store/objects/DocumentSearchResults.js","esm/features/store/objects/ExportPropertiesModal.js","esm/features/store/collections/BrowseCollectionView.js","esm/features/store/types/SelectContentType.js","esm/features/store/collections/CreateCollection.js","esm/features/store/collections/CollectionsTable.js","esm/features/store/types/ContentObjectTypesTable.js","esm/features/store/types/search/ObjectTypeSearchContext.js","esm/features/store/types/CreateOrUpdateTypeModal.js","esm/features/store/types/ContentObjectTypesSearch.js","esm/features/store/types/ObjectSchemaEditor.js","esm/features/store/types/search/ObjectTypeSearchProvider.js","esm/features/store/types/SelectContentTypeModal.js","esm/features/store/types/TableLayoutEditor.js","esm/features/store/collections/EditCollectionView.js","esm/features/store/collections/SelectCollection.js","esm/features/store/collections/SharedPropsEditor.js","esm/features/store/collections/SyncMemberHeadsToggle.js","esm/features/store/objects/selection/actions/ChangeTypeAction.js","esm/features/store/objects/selection/actions/ConfirmAction.js","esm/features/store/objects/selection/actions/DeleteObjectsAction.js","esm/features/store/objects/selection/actions/ExportPropertiesAction.js","esm/features/store/objects/selection/actions/RemoveFromCollectionAction.js","esm/features/store/objects/selection/actions/StartWorkflowComponent.js","esm/features/store/objects/selection/ObjectsActionContext.js","esm/features/store/objects/selection/actions/AddToCollectionAction.js","esm/features/store/objects/selection/SelectionActions.js","esm/features/agent/chat/ModernAgentOutput/MessageInput.js","esm/features/agent/chat/ModernAgentOutput/InlineSlidingPlanPanel.js","esm/features/agent/chat/ModernAgentConversation.js","esm/features/errors/VertesiaErrorBoundary.js","esm/features/errors/PanelErrorBoundary.js","esm/features/errors/RowErrorBoundary.js","esm/features/errors/WidgetErrorBoundary.js","esm/features/layout/GenericPageNavHeader.js","esm/features/layout/NotFoundView.js","esm/features/magic-pdf/PdfPageProvider.js","esm/features/magic-pdf/DownloadPopover.js","esm/features/magic-pdf/PageSlider.js","esm/features/magic-pdf/TextPageView.js","esm/features/magic-pdf/MagicPdfView.js","esm/features/magic-pdf/useResizeOnDrag.js","esm/features/permissions/helpers.js","esm/features/permissions/UserPermissionsProvider.js","esm/features/permissions/SecureButton.js","esm/features/permissions/SecureSidebarItem.js","esm/features/user/UserAvatar.js"],"sourcesContent":["import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport clsx from \"clsx\";\nimport { AnimatePresence, motion } from \"motion/react\";\nimport { useMemo, useState } from \"react\";\nfunction Badge({ children, secondary = false }) {\n const className = secondary ? \"bg-secondary text-primary\" : \"text-foreground bg-muted\";\n return _jsx(\"span\", { className: className, children: children });\n}\n/**\n * Resolve nested array inner type\n * @param innerType\n */\nfunction resolveInnerType(innerType) {\n if (!innerType) {\n return undefined;\n }\n else if (innerType.name === \"array\") {\n return resolveInnerType(innerType.innerType);\n }\n else {\n return innerType;\n }\n}\nfunction PropertySignature({ property }) {\n return (_jsxs(\"div\", { className: \"flex items-center gap-x-2\", children: [_jsx(\"div\", { className: \"font-semibold text-gray-600\", children: property.name }), property.optional && _jsx(Badge, { children: \"optional\" }), _jsx(Badge, { children: property.type.value })] }));\n}\nexport function ActivitiesDoc({ activities }) {\n return (_jsx(\"div\", { className: 'flex flex-col gap-y-4 divide-y divide-gray-200', children: activities.map(activity => _jsx(ActivityDoc, { activity: activity }, activity.name)) }));\n}\nfunction ActivitySectionTitle({ code, children }) {\n return (_jsxs(\"div\", { className: \"flex gap-2 items-center border-b border-b-gray-200 mb-2\", children: [_jsx(\"div\", { className: 'text-lg font-medium text-gray-900 py-2 ', children: children }), code && _jsx(\"div\", { children: _jsx(Badge, { children: code }) })] }));\n}\nexport function ActivityDoc({ activity, headingClass, headingRef }) {\n return (_jsxs(\"div\", { className: headingClass, id: activity.name, ref: headingRef, children: [_jsx(\"div\", { className: \"text-xl font-semibold pt-8\", children: activity.title }), _jsx(\"div\", { className: \"pb-4\", children: _jsx(Badge, { children: activity.name }) }), activity.doc &&\n _jsx(\"div\", { className: \"text-gray-700 pb-2\", children: activity.doc }), _jsxs(\"div\", { className: \"pb-4\", children: [_jsx(ActivitySectionTitle, { code: activity.paramsType, children: \"Parameters\" }), _jsx(\"div\", { className: \"divide-y divide-gray-100\", children: activity.params.map(prop => _jsx(PropertyDetails, { property: prop }, prop.name)) })] }), _jsxs(\"div\", { className: \"pb-4\", children: [_jsx(ActivitySectionTitle, { children: \"Returns\" }), _jsx(\"div\", { children: activity.returnType ? activity.returnType.value : \"void\" })] })] }));\n}\nfunction PropertyDetails({ property, className }) {\n const expandable = useMemo(() => {\n const type = resolveInnerType(property.type.innerType) ?? property.type;\n if (type.name === \"object\" && type.members) {\n return _jsx(ObjectMembersPanel, { members: type.members });\n }\n else if (type.name === 'enum' && type.enum) {\n return _jsx(EnumValuesPanel, { values: type.enum });\n }\n else {\n return null;\n }\n }, [property.type.innerType]);\n return (_jsxs(\"div\", { className: clsx(\"py-2\", className), children: [_jsx(PropertySignature, { property: property }), property.doc && _jsx(\"div\", { className: \"text-gray-700 text-sm pt-2\", children: property.doc }), expandable && _jsx(\"div\", { className: \"my-2 overflow-hidden\", children: expandable })] }));\n}\nfunction EnumValuesPanel({ values }) {\n return _jsx(\"div\", { className: \"flex flex-wrap items-center gap-2\", children: values.map((v, i) => _jsx(Badge, { secondary: true, children: v }, i)) });\n}\nfunction ObjectMembersPanel({ members }) {\n return _jsx(ExpandablePanel, { className: 'rounded-md border border-gray-200', button: (isOn) => (_jsxs(\"div\", { className: \"px-4 py-2 flex items-center gap-x-2 text-sm font-medium hover:text-blue-600\", children: [_jsx(ExpandIcon, { isOpen: isOn }), isOn ?\n _jsx(\"div\", { children: \"Hide child properties\" })\n :\n _jsx(\"div\", { children: \"Show child properties\" })] })), body: _jsx(NestedPropertiesDetails, { properties: members }) });\n}\nfunction NestedPropertiesDetails({ properties }) {\n return (_jsx(\"div\", { className: 'border-l-2 border-l-blue-200 flex flex-col divide-y divide-gray-100 border-t border-t-gray-200', children: properties.map(prop => _jsx(PropertyDetails, { property: prop, className: \"px-4 py-2\" }, prop.name)) }));\n}\nfunction ExpandablePanel({ button, body, className, isInitiallyOpen }) {\n const [isExpanded, setExpanded] = useState(isInitiallyOpen || false);\n return (_jsxs(\"div\", { className: clsx(isExpanded ? \"block\" : \"inline-block\", className), children: [_jsx(\"button\", { className: 'p-0 m-0 bg-transparent', onClick: () => setExpanded(!isExpanded), children: _jsx(AnimatePresence, { children: button(isExpanded) }) }), _jsx(AnimatePresence, { children: isExpanded && _jsx(motion.div, { className: 'overflow-hidden', initial: { height: 0, opacity: 0 }, animate: { height: 'auto', opacity: 1 }, exit: { height: 0, opacity: 0 }, transition: { duration: 0.3, ease: 'easeOut' }, children: body }) })] }));\n}\nfunction ExpandIcon({ isOpen }) {\n return (_jsx(AnimatePresence, { propagate: true, mode: \"wait\", children: _jsx(motion.div, { className: \"font-mono font-semibold text-gray-400 text-lg\", initial: { rotate: 0 }, animate: { rotate: isOpen ? 45 : 0 }, transition: { duration: 0.2 }, children: \"+\" }, \"closeIcon\") }));\n}\n//# sourceMappingURL=ActivityDoc.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { cn } from \"@vertesia/ui/core\";\nexport function JumpingDots({ className, inline = false }) {\n return (_jsxs(\"div\", { className: cn(\"flex items-center gap-1\", inline ? \"inline-flex\" : \"\", className), children: [_jsx(\"div\", { className: \"w-2 h-2 bg-blue-500 rounded-full animate-[jumping_1s_infinite_ease-in-out] hover:bg-blue-600\", style: { transform: 'translateY(0)', animationRange: '0px -8px' } }), _jsx(\"div\", { className: \"w-2 h-2 bg-blue-500 rounded-full animate-[jumping_1s_0.3s_infinite_ease-in-out] hover:bg-blue-600\", style: { transform: 'translateY(0)', animationRange: '0px -8px' } }), _jsx(\"div\", { className: \"w-2 h-2 bg-blue-500 rounded-full animate-[jumping_1s_0.6s_infinite_ease-in-out] hover:bg-blue-600\", style: { transform: 'translateY(0)', animationRange: '0px -8px' } })] }));\n}\n//# sourceMappingURL=JumpingDots.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { cn } from \"@vertesia/ui/core\";\nimport { useEffect, useState } from \"react\";\nexport function AnimatedThinkingDots({ className, inline = false, color = 'blue' }) {\n // Enhanced gradient colors based on the color prop\n const gradientColors = {\n blue: \"from-blue-400 to-indigo-500 dark:from-blue-500 dark:to-indigo-400\",\n purple: \"from-purple-400 to-violet-500 dark:from-purple-500 dark:to-violet-400\",\n teal: \"from-teal-400 to-emerald-500 dark:from-teal-500 dark:to-emerald-400\",\n green: \"from-green-400 to-emerald-500 dark:from-green-500 dark:to-emerald-400\",\n amber: \"from-amber-400 to-orange-500 dark:from-amber-500 dark:to-orange-400\"\n };\n const gradientClass = gradientColors[color];\n return (_jsxs(\"div\", { className: cn(\"flex items-center gap-1.5\", inline ? \"inline-flex\" : \"\", className), children: [_jsx(\"div\", { className: `w-2 h-2 bg-gradient-to-r ${gradientClass} rounded-full animate-[bounce_1.2s_ease-in-out_infinite]` }), _jsx(\"div\", { className: `w-2 h-2 bg-gradient-to-r ${gradientClass} rounded-full animate-[bounce_1.2s_ease-in-out_0.2s_infinite]` }), _jsx(\"div\", { className: `w-2 h-2 bg-gradient-to-r ${gradientClass} rounded-full animate-[bounce_1.2s_ease-in-out_0.4s_infinite]` })] }));\n}\nexport function PulsatingCircle({ className, size = 'md', color = 'blue' }) {\n // Enhanced size classes\n const sizeClasses = {\n sm: 'w-3 h-3',\n md: 'w-5 h-5',\n lg: 'w-7 h-7'\n };\n // Enhanced color mapping with gradients\n const colorClasses = {\n blue: 'bg-blue-500 dark:bg-blue-400',\n purple: 'bg-purple-500 dark:bg-purple-400',\n teal: 'bg-teal-500 dark:bg-teal-400',\n green: 'bg-green-500 dark:bg-green-400',\n amber: 'bg-amber-500 dark:bg-amber-400'\n };\n // Return enhanced implementation using smoother animations\n return (_jsxs(\"span\", { className: cn(\"relative flex\", className), children: [_jsx(\"span\", { className: cn(\"animate-ping absolute inline-flex h-full w-full rounded-full opacity-60\", colorClasses[color]) }), _jsx(\"span\", { className: cn(\"animate-pulse absolute inline-flex h-[80%] w-[80%] rounded-full opacity-80\", colorClasses[color]), style: {\n left: '10%',\n top: '10%',\n animationDuration: '2s'\n } }), _jsx(\"span\", { className: cn(\"relative inline-flex rounded-full\", colorClasses[color], sizeClasses[size]) })] }));\n}\nexport function TypedDots({ className, color = 'blue' }) {\n const [dots, setDots] = useState('.');\n const colorClasses = {\n blue: 'text-blue-600 dark:text-blue-400',\n purple: 'text-purple-600 dark:text-purple-400',\n teal: 'text-teal-600 dark:text-teal-400',\n green: 'text-green-600 dark:text-green-400',\n amber: 'text-amber-600 dark:text-amber-400'\n };\n useEffect(() => {\n const intervalId = setInterval(() => {\n setDots(prev => prev === '.' ? '..' :\n prev === '..' ? '...' : '.');\n }, 500);\n return () => clearInterval(intervalId);\n }, []);\n return _jsx(\"span\", { className: cn(colorClasses[color], \"font-bold\", className), children: dots });\n}\nexport function PulsingMessageLoader({ message, className, color = 'blue' }) {\n const colorClasses = {\n blue: {\n dot: 'bg-blue-500 dark:bg-blue-400',\n text: 'text-blue-700 dark:text-blue-300'\n },\n purple: {\n dot: 'bg-purple-500 dark:bg-purple-400',\n text: 'text-purple-700 dark:text-purple-300'\n },\n teal: {\n dot: 'bg-teal-500 dark:bg-teal-400',\n text: 'text-teal-700 dark:text-teal-300'\n },\n green: {\n dot: 'bg-green-500 dark:bg-green-400',\n text: 'text-green-700 dark:text-green-300'\n },\n amber: {\n dot: 'bg-amber-500 dark:bg-amber-400',\n text: 'text-amber-700 dark:text-amber-300'\n }\n };\n return (_jsxs(\"div\", { className: cn(\"flex items-center gap-2 py-1\", className), children: [_jsxs(\"div\", { className: \"flex space-x-1\", children: [_jsx(\"div\", { className: `w-1.5 h-1.5 ${colorClasses[color].dot} rounded-full animate-bounce` }), _jsx(\"div\", { className: `w-1.5 h-1.5 ${colorClasses[color].dot} rounded-full animate-bounce`, style: { animationDelay: '0.2s' } }), _jsx(\"div\", { className: `w-1.5 h-1.5 ${colorClasses[color].dot} rounded-full animate-bounce`, style: { animationDelay: '0.4s' } })] }), _jsx(\"div\", { className: `${colorClasses[color].text} font-medium text-xs`, children: message })] }));\n}\nexport function ThinkingBar({ className, color = 'blue', width = 'md', message }) {\n const [progress, setProgress] = useState(15);\n const [direction, setDirection] = useState('increasing');\n const [speed, setSpeed] = useState(0.4); // Lower initial speed for smoother motion\n // Width classes\n const widthClasses = {\n sm: 'w-24',\n md: 'w-32',\n lg: 'w-48',\n xl: 'w-64',\n full: 'w-full'\n };\n // Color classes\n const colorClasses = {\n blue: 'bg-blue-200 dark:bg-blue-900/30',\n purple: 'bg-purple-200 dark:bg-purple-900/30',\n teal: 'bg-teal-200 dark:bg-teal-900/30',\n green: 'bg-green-200 dark:bg-green-900/30',\n amber: 'bg-amber-200 dark:bg-amber-900/30'\n };\n const barColorClasses = {\n blue: 'bg-gradient-to-r from-blue-400 to-blue-500 dark:from-blue-500 dark:to-blue-400',\n purple: 'bg-gradient-to-r from-purple-400 to-purple-500 dark:from-purple-500 dark:to-purple-400',\n teal: 'bg-gradient-to-r from-teal-400 to-teal-500 dark:from-teal-500 dark:to-teal-400',\n green: 'bg-gradient-to-r from-green-400 to-green-500 dark:from-green-500 dark:to-green-400',\n amber: 'bg-gradient-to-r from-amber-400 to-amber-500 dark:from-amber-500 dark:to-amber-400'\n };\n const textColorClasses = {\n blue: 'text-blue-700 dark:text-blue-300',\n purple: 'text-purple-700 dark:text-purple-300',\n teal: 'text-teal-700 dark:text-teal-300',\n green: 'text-green-700 dark:text-green-300',\n amber: 'text-amber-700 dark:text-amber-300'\n };\n // Using requestAnimationFrame for smoother animation\n useEffect(() => {\n let animationFrameId;\n let lastUpdateTime = Date.now();\n const updateProgressBar = () => {\n const now = Date.now();\n const deltaTime = now - lastUpdateTime;\n lastUpdateTime = now;\n setProgress(prev => {\n // Calculate movement based on time delta for consistent animation speed\n // regardless of frame rate\n const timeBasedChange = speed * (deltaTime / 16); // Normalize to 60fps\n // Calculate next progress based on direction\n let next = direction === 'increasing'\n ? prev + timeBasedChange\n : prev - timeBasedChange;\n // Handle direction changes at boundaries with easing\n if (next >= 85) {\n setDirection('decreasing');\n // Randomize speed slightly, but keep it low for smoothness\n setSpeed(0.3 + Math.random() * 0.2);\n return 85; // Cap at exactly 85%\n }\n else if (next <= 15) {\n setDirection('increasing');\n // Randomize speed slightly, but keep it low for smoothness\n setSpeed(0.3 + Math.random() * 0.2);\n return 15; // Cap at exactly 15%\n }\n // Occasionally adjust speed slightly (less frequently) for subtle natural feeling\n if (Math.random() > 0.99) {\n setSpeed(prev => Math.max(0.2, Math.min(0.5, prev + (Math.random() * 0.1 - 0.05))));\n }\n return next;\n });\n animationFrameId = requestAnimationFrame(updateProgressBar);\n };\n animationFrameId = requestAnimationFrame(updateProgressBar);\n return () => {\n cancelAnimationFrame(animationFrameId);\n };\n }, [direction, speed]);\n return (_jsxs(\"div\", { className: cn(\"flex flex-col gap-1\", className), children: [message && (_jsx(\"div\", { className: `text-xs font-medium ${textColorClasses[color]} mb-1`, children: message })), _jsx(\"div\", { className: cn(\"h-1.5 rounded-full overflow-hidden shadow-inner\", colorClasses[color], widthClasses[width]), children: _jsx(\"div\", { className: cn(\"h-full rounded-full\", barColorClasses[color]), style: {\n width: `${progress}%`,\n transition: 'width 150ms cubic-bezier(0.4, 0.0, 0.2, 1)' // Material Design easing for smoothness\n } }) })] }));\n}\nexport function WavyThinking({ className, color = 'blue', size = 'md' }) {\n // State to store and update heights of bars\n const [barHeights, setBarHeights] = useState(Array(7).fill(50));\n // Size classes\n const sizeClasses = {\n sm: { width: 'w-16', height: 'h-4', barWidth: 'w-0.5', gap: 'gap-[2px]' },\n md: { width: 'w-20', height: 'h-5', barWidth: 'w-1', gap: 'gap-[3px]' },\n lg: { width: 'w-24', height: 'h-6', barWidth: 'w-1.5', gap: 'gap-1' }\n };\n // Enhanced color classes with gradients for more visual appeal\n const colorClasses = {\n blue: 'bg-gradient-to-b from-blue-400 to-blue-500 dark:from-blue-400 dark:to-blue-500',\n purple: 'bg-gradient-to-b from-purple-400 to-purple-500 dark:from-purple-400 dark:to-purple-500',\n teal: 'bg-gradient-to-b from-teal-400 to-teal-500 dark:from-teal-400 dark:to-teal-500',\n green: 'bg-gradient-to-b from-green-400 to-green-500 dark:from-green-400 dark:to-green-500',\n amber: 'bg-gradient-to-b from-amber-400 to-amber-500 dark:from-amber-400 dark:to-amber-500'\n };\n // Use requestAnimationFrame for smooth animation\n useEffect(() => {\n let animationFrameId;\n const speeds = [1.2, 1.0, 1.5, 0.8, 1.3, 0.9, 1.1]; // Different speeds for each bar\n const phases = [0, 0.5, 1, 1.5, 2, 2.5, 3]; // Different starting phases for each bar\n let time = 0;\n const animateBars = () => {\n time += 0.02; // Increment time for animation\n // Update each bar's height with smooth sine wave\n const newHeights = barHeights.map((_, index) => {\n // Calculate height using smooth sine wave with individual phase and speed\n // Scale to make sure it stays within 10% to 90% range\n return 10 + (Math.sin(time * speeds[index] + phases[index]) + 1) * 40;\n });\n setBarHeights(newHeights);\n animationFrameId = requestAnimationFrame(animateBars);\n };\n animationFrameId = requestAnimationFrame(animateBars);\n return () => {\n cancelAnimationFrame(animationFrameId);\n };\n }, []); // Empty dependency array means this runs once on mount\n return (_jsx(\"div\", { className: cn(\"flex items-end justify-center\", sizeClasses[size].width, sizeClasses[size].height, sizeClasses[size].gap, className), children: barHeights.map((height, i) => (_jsx(\"div\", { className: cn(sizeClasses[size].barWidth, \"rounded-full transform-gpu\", colorClasses[color]), style: {\n height: `${height}%`,\n transition: 'height 100ms cubic-bezier(0.4, 0.0, 0.2, 1)', // Smooth transition\n opacity: 0.9\n } }, i))) }));\n}\n//# sourceMappingURL=AnimatedThinkingDots.js.map","export const ThinkingMessages = [\n // Original messages\n \"Brewing some code magic...\",\n \"Doing the robot dance...\",\n \"Cooking up something good...\",\n \"Working my gears...\",\n // Tech-inspired messages\n \"Parsing the possibilities...\",\n \"Crunching the numbers...\",\n \"Connecting the digital dots...\",\n \"Processing at maximum capacity...\",\n \"Searching through my circuits...\",\n \"Running advanced algorithms...\",\n \"Computing optimal solutions...\",\n \"Loading brilliance.exe...\",\n \"Scanning the knowledge base...\",\n \"Optimizing response protocols...\",\n // Playful messages\n \"Having a quick brainstorm...\",\n \"Thinking cap firmly on...\",\n \"Pondering the digital universe...\",\n \"Consulting my silicon wisdom...\",\n \"Untangling the logic knots...\",\n \"Assembling clever responses...\",\n \"Mixing thoughtful ingredients...\",\n \"Polishing the perfect answer...\",\n \"Taking a momentary mind sprint...\",\n \"Connecting virtual synapses...\",\n // Food-themed messages\n \"Baking fresh ideas...\",\n \"Stirring the thought pot...\",\n \"Simmering solutions slowly...\",\n \"Whipping up a smart response...\",\n \"Adding a dash of intelligence...\",\n \"Preparing a gourmet answer...\",\n // Nature-themed messages\n \"Growing brilliant ideas...\",\n \"Cultivating the perfect response...\",\n \"Gathering digital nectar...\",\n \"Planting seeds of solutions...\",\n // Journey-themed messages\n \"Exploring the data landscape...\",\n \"Mapping the solution path...\",\n \"Navigating through possibilities...\",\n \"Charting the course to answers...\",\n \"Embarking on a thought expedition...\",\n // Creative-themed messages\n \"Sketching out concepts...\",\n \"Painting with digital brushstrokes...\",\n \"Composing my response symphony...\",\n \"Crafting precision answers...\",\n \"Weaving threads of information...\",\n // Time-themed messages\n \"Just a moment of processing...\",\n \"Taking a quick thinking break...\",\n \"Almost there, final touches...\",\n \"Putting the pieces together...\",\n \"Making progress, hold tight...\",\n];\n//# sourceMappingURL=WaitingMessages.js.map","import dayjs from \"dayjs\";\nimport { AgentMessageType } from \"@vertesia/common\";\nexport function insertMessageInTimeline(arr, m) {\n const t = typeof m.timestamp === \"number\" ? m.timestamp : new Date(m.timestamp).getTime();\n const idx = arr.findIndex((a) => {\n const at = typeof a.timestamp === \"number\" ? a.timestamp : new Date(a.timestamp).getTime();\n return at > t;\n });\n if (idx === -1)\n arr.push(m);\n else\n arr.splice(idx, 0, m);\n}\n/**\n * Check if a conversation is still in progress\n * This function checks the main workstream status to determine if the conversation is complete\n * For multi-workstream scenarios, we keep streaming until the main workstream is complete\n */\nexport const DONE_STATES = [\n AgentMessageType.COMPLETE,\n AgentMessageType.IDLE,\n AgentMessageType.REQUEST_INPUT,\n AgentMessageType.TERMINATED,\n];\nexport function isInProgress(messages) {\n if (!messages.length)\n return true;\n // First, group messages by workstream\n const workstreamMessages = new Map();\n messages.forEach((message) => {\n const workstreamId = getWorkstreamId(message);\n if (!workstreamMessages.has(workstreamId)) {\n workstreamMessages.set(workstreamId, []);\n }\n workstreamMessages.get(workstreamId).push(message);\n });\n // Log all workstreams we found for debugging\n console.log(\"[isInProgress] Workstreams found:\", Array.from(workstreamMessages.keys()));\n // If there's only one workstream and it's not \"main\", we should treat it as the main one\n // This handles cases where a conversation might not have an explicit main workstream\n if (workstreamMessages.size === 1 && !workstreamMessages.has(\"main\")) {\n const onlyWorkstreamId = workstreamMessages.keys().next().value || \"unknown\";\n console.log(`[isInProgress] Only one workstream found (${onlyWorkstreamId}), treating as main`);\n const onlyWorkstreamMsgs = workstreamMessages.get(onlyWorkstreamId);\n const lastMessage = onlyWorkstreamMsgs[onlyWorkstreamMsgs.length - 1];\n console.log(`[isInProgress] Last message type in only workstream: ${lastMessage.type}`);\n // Check if this single workstream is completed\n if (!DONE_STATES.includes(lastMessage.type)) {\n console.log(\"[isInProgress] Only workstream is still in progress\");\n return true;\n }\n console.log(\"[isInProgress] Only workstream is completed\");\n return false;\n }\n // Check the main workstream if it exists\n if (workstreamMessages.has(\"main\")) {\n const mainWorkstreamMsgs = workstreamMessages.get(\"main\");\n // If there are no messages in the main workstream, the conversation is still in progress\n if (mainWorkstreamMsgs.length === 0) {\n console.log(\"[isInProgress] Main workstream exists but has no messages, still in progress\");\n return true;\n }\n // Check if the main workstream is completed\n const lastMainMessage = mainWorkstreamMsgs[mainWorkstreamMsgs.length - 1];\n console.log(`[isInProgress] Last message type in main workstream: ${lastMainMessage.type}`);\n if (!DONE_STATES.includes(lastMainMessage.type)) {\n console.log(\"[isInProgress] Main workstream is still in progress\");\n return true;\n }\n console.log(\"[isInProgress] Main workstream is completed\");\n return false;\n }\n // If we get here, there are multiple workstreams but no \"main\" workstream\n // We'll keep the conversation active if any workstream is still active\n console.log(\"[isInProgress] Multiple workstreams but no main, checking if any are still active\");\n for (const [workstreamId, msgs] of workstreamMessages.entries()) {\n if (msgs.length > 0) {\n const lastMessage = msgs[msgs.length - 1];\n if (!DONE_STATES.includes(lastMessage.type)) {\n console.log(`[isInProgress] Workstream ${workstreamId} is still active`);\n return true;\n }\n }\n }\n console.log(\"[isInProgress] All workstreams are completed\");\n return false;\n}\nexport const formatRelative = (ts) => typeof ts === \"number\" ? dayjs(ts).fromNow() : dayjs(new Date(ts)).fromNow();\n/**\n * Extract the workstream ID from a message\n * @param message The agent message to analyze\n * @returns The workstream ID (defaults to 'main' if none found)\n */\nexport function getWorkstreamId(message) {\n // Only use the direct workstream_id property on the message\n if (message.workstream_id) {\n // For debugging COMPLETE messages\n if (message.type === AgentMessageType.COMPLETE) {\n console.log(\"[getWorkstreamId] COMPLETE message with workstream_id:\", message.workstream_id);\n }\n return message.workstream_id;\n }\n // For debugging COMPLETE messages without workstream_id\n if (message.type === AgentMessageType.COMPLETE) {\n console.log(\"[getWorkstreamId] COMPLETE message without workstream_id, defaulting to 'main'\");\n }\n // Default to 'main' workstream\n return \"main\";\n}\n/**\n * Get a map of workstream IDs to their completion status\n * @param messages List of agent messages\n * @returns Map of workstream IDs to completion status ('pending', 'in_progress', or 'completed')\n */\nexport function getWorkstreamStatusMap(messages) {\n const workstreamMessages = new Map();\n const statusMap = new Map();\n // Group messages by workstream\n messages.forEach((message) => {\n const workstreamId = getWorkstreamId(message);\n if (!workstreamMessages.has(workstreamId)) {\n workstreamMessages.set(workstreamId, []);\n // Initialize all workstreams as pending\n statusMap.set(workstreamId, \"pending\");\n }\n workstreamMessages.get(workstreamId).push(message);\n });\n // Log all workstreams found\n console.log(\"[getWorkstreamStatusMap] Found workstreams:\", Array.from(workstreamMessages.keys()));\n // Determine status based on last message type\n for (const [workstreamId, msgs] of workstreamMessages.entries()) {\n if (msgs.length > 0) {\n // Mark as in_progress by default if there are any messages\n statusMap.set(workstreamId, \"in_progress\");\n // Check if completed based on last message or any COMPLETE message\n const lastMessage = msgs[msgs.length - 1];\n // Check for any COMPLETE message in this workstream\n const hasCompleteMessage = msgs.some(msg => msg.type === AgentMessageType.COMPLETE &&\n (msg.workstream_id === workstreamId || (!msg.workstream_id && workstreamId === 'main')));\n if (hasCompleteMessage ||\n DONE_STATES.includes(lastMessage.type)) {\n console.log(`[getWorkstreamStatusMap] Marking workstream ${workstreamId} as completed`);\n statusMap.set(workstreamId, \"completed\");\n }\n else {\n console.log(`[getWorkstreamStatusMap] Workstream ${workstreamId} is in_progress`);\n }\n }\n }\n // Log final status map for debugging\n console.log(\"[getWorkstreamStatusMap] Final status map:\", Array.from(statusMap.entries()).map(([id, status]) => `${id}: ${status}`).join(', '));\n return statusMap;\n}\n// Helper function to get conversation URL - used by other components\nexport async function getConversationUrl(vertesia, workflowRunId) {\n return vertesia.files\n .getDownloadUrl(`agents/${workflowRunId}/conversation.json`)\n .then((r) => r.url);\n}\n//# sourceMappingURL=utils.js.map","import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { AgentMessageType } from \"@vertesia/common\";\nimport { Badge, Button, useToast } from \"@vertesia/ui/core\";\nimport { NavLink } from \"@vertesia/ui/router\";\nimport { useUserSession } from \"@vertesia/ui/session\";\nimport dayjs from \"dayjs\";\nimport { AlertCircle, Bot, CheckCircle, Clock, CopyIcon, Info, MessageSquare, User } from \"lucide-react\";\nimport { useEffect, useState } from \"react\";\nimport Markdown from \"react-markdown\";\nimport remarkGfm from \"remark-gfm\";\nimport { AnimatedThinkingDots, PulsatingCircle } from \"../AnimatedThinkingDots\";\nimport { ThinkingMessages } from \"../WaitingMessages\";\nimport { getWorkstreamId } from \"./utils\";\nexport default function MessageItem({ message, showPulsatingCircle = false }) {\n const [showDetails, setShowDetails] = useState(false);\n const [processedContent, setProcessedContent] = useState(\"\");\n const [isProcessingImages, setIsProcessingImages] = useState(false);\n const { client } = useUserSession();\n const toast = useToast();\n // Simplified message styling with minimal distinction between different types\n const getMessageStyles = () => {\n // Common styling for all messages with subtle type indication\n const baseStyle = {\n containerClass: \"bg-white border-l-4 border-l-muted/30 shadow-sm\",\n iconComponent: _jsx(Bot, { className: \"size-4 text-muted\" }),\n sender: \"\",\n };\n // Just add minimal type indicators\n switch (message.type) {\n case AgentMessageType.ANSWER:\n return {\n ...baseStyle,\n containerClass: \"bg-white border-l-4 border-l-muted/30 shadow-sm\",\n iconComponent: _jsx(Bot, { className: \"size-4 text-muted\" }),\n sender: \"Agent\",\n };\n case AgentMessageType.COMPLETE:\n return {\n ...baseStyle,\n containerClass: \"bg-white border-l-4 border-l-success shadow-sm\",\n iconComponent: _jsx(CheckCircle, { className: \"size-4 text-success\" }),\n sender: \"Completed\",\n };\n case AgentMessageType.TERMINATED:\n return {\n ...baseStyle,\n containerClass: \"bg-white border-l-4 border-l-attention shadow-sm\",\n iconComponent: _jsx(CheckCircle, { className: \"size-4 text-attention\" }),\n sender: \"Terminated\",\n };\n case AgentMessageType.QUESTION:\n return {\n ...baseStyle,\n iconComponent: _jsx(User, { className: \"size-4 text-muted\" }),\n sender: \"User\",\n };\n case AgentMessageType.THOUGHT:\n return {\n ...baseStyle,\n iconComponent: showPulsatingCircle ? (_jsx(PulsatingCircle, { size: \"sm\", color: \"blue\" })) : (_jsx(Bot, { className: \"size-4 text-muted\" })),\n sender: \"Agent\",\n };\n case AgentMessageType.ERROR:\n return {\n ...baseStyle,\n iconComponent: _jsx(AlertCircle, { className: \"size-4 text-muted\" }),\n sender: \"System\",\n };\n case AgentMessageType.UPDATE:\n return {\n ...baseStyle,\n containerClass: \"bg-white border-l-4 border-success shadow-sm\",\n iconComponent: _jsx(Info, { className: \"size-4 text-success\" }),\n sender: \"Update\",\n };\n case AgentMessageType.PLAN:\n return {\n ...baseStyle,\n iconComponent: _jsx(MessageSquare, { className: \"size-4 text-muted\" }),\n sender: \"Agent\",\n };\n default:\n return {\n ...baseStyle,\n sender: `Agent`,\n };\n }\n };\n const messageStyles = getMessageStyles();\n // Convert links in the content (now async to handle image URLs)\n const convertLinks = async (content) => {\n // If content is not a string, return it as is\n if (typeof content !== \"string\") {\n return content;\n }\n let processedContent = content;\n // First, handle store and collection links\n processedContent = processedContent.replace(/\\[([^\\]]+)\\]\\((store|collection):([a-f\\d]{24})\\)/gi, (_, text, type, id) => {\n const path = type === 'store' ? 'objects' : 'collections';\n return `[${text}](/store/${path}/${id})`;\n });\n // Then, handle image links by finding all image:<gcspath> patterns\n const imageRegex = /!\\[([^\\]]*)\\]\\(image:([^)]+)\\)/g;\n const imageMatches = Array.from(processedContent.matchAll(imageRegex));\n // Process all image URLs in parallel\n const imageReplacements = await Promise.all(imageMatches.map(async (match) => {\n const [fullMatch, altText, gcsPath] = match;\n try {\n const response = await client.files.getDownloadUrl(gcsPath);\n return { fullMatch, replacement: `![${altText}](${response.url})` };\n }\n catch (error) {\n console.error(`Failed to get download URL for image: ${gcsPath}`, error);\n // Return original on error\n return { fullMatch, replacement: fullMatch };\n }\n }));\n // Apply all replacements\n for (const { fullMatch, replacement } of imageReplacements) {\n processedContent = processedContent.replace(fullMatch, replacement);\n }\n return processedContent;\n };\n // Get the message content to display with thinking message replacement\n const getMessageContent = () => {\n let content = \"\";\n if (message.message) {\n // Check if message.message is an object\n if (typeof message.message === \"object\") {\n // Use JSONView for objects - we'll need to stringify it for now\n // as we don't have direct access to JSONView\n content = JSON.stringify(message.message, null, 2);\n }\n else if (message.message.trim) {\n content = message.message.trim();\n }\n else {\n // Fallback for other non-string, non-object cases\n content = String(message.message);\n }\n }\n // Replace %thinking_message% placeholder with a thinking message\n if (typeof content === \"string\" && content.includes(\"%thinking_message%\")) {\n // Get a random thinking message since we don't have access to thinkingMessageIndex here\n const randomIndex = Math.floor(Math.random() * ThinkingMessages.length);\n content = content.replace(/%thinking_message%/g, ThinkingMessages[randomIndex]);\n }\n return content;\n };\n // Copy message content to clipboard\n const copyToClipboard = () => {\n const messageContent = getMessageContent() || \"\";\n const detailsContent = typeof message.details === \"string\"\n ? message.details\n : message.details\n ? JSON.stringify(message.details, null, 2)\n : \"\";\n const textToCopy = [messageContent, detailsContent ? \"\\n\\nDetails:\\n\" + detailsContent : \"\"].join(\"\").trim();\n navigator.clipboard.writeText(textToCopy).then(() => {\n toast({\n status: \"success\",\n title: \"Copied to clipboard\",\n duration: 2000,\n });\n });\n };\n // Process content to enhance markdown detection for lists and thinking messages\n const processContentForMarkdown = (content) => {\n // If content is not a string, return it as is\n if (typeof content !== \"string\") {\n return content;\n }\n // Special handling for thought messages to ensure proper markdown formatting\n if (message.type === AgentMessageType.THOUGHT ||\n (typeof message.message === \"string\" &&\n (message.message.toLowerCase().includes(\"thinking about\") ||\n message.message.toLowerCase().includes(\"i'm thinking\") ||\n message.message.toLowerCase().includes(\"💭\")))) {\n let formattedContent = content;\n // Check for numbering patterns like \"1. First item 2. Second item\"\n if (/\\d+\\.\\s+.+/.test(formattedContent)) {\n // Format numbered lists by adding newlines between items\n formattedContent = formattedContent.replace(/(\\d+\\.\\s+.+?)(?=\\s+\\d+\\.\\s+|$)/g, \"$1\\n\\n\");\n // Make sure nested content under numbered items is properly indented\n formattedContent = formattedContent.replace(/(\\d+\\.\\s+.+\\n)([^\\d\\n][^:])/g, \"$1 $2\");\n }\n // Handle colon-prefixed items that should be on separate lines\n if (formattedContent.includes(\":\") && !formattedContent.includes(\"\\n\\n\")) {\n formattedContent = formattedContent.replace(/\\b(First|Next|Then|Finally|Lastly|Additionally|Step \\d+):\\s+/gi, \"\\n\\n$&\");\n }\n // Handle thinking points or list-like structures even without numbers\n if (formattedContent.includes(\" - \")) {\n formattedContent = formattedContent.replace(/\\s+-\\s+/g, \"\\n- \");\n }\n return formattedContent;\n }\n // Normal processing for non-thinking messages\n if (/\\d+\\.\\s+.+/.test(content) && !content.includes(\"\\n\\n\")) {\n // Add proper line breaks for numbered lists that aren't already properly formatted\n return content.replace(/(\\d+\\.\\s+.+?)(?=\\s+\\d+\\.\\s+|$)/g, \"$1\\n\\n\");\n }\n return content;\n };\n // Render content with markdown support - all messages now rendered as markdown\n const renderContent = (content) => {\n // Handle object content (JSON)\n if (typeof content === \"object\") {\n return (_jsx(\"pre\", { className: \"text-xs font-mono whitespace-pre-wrap overflow-x-auto bg-gray-100 dark:bg-gray-800 p-2 rounded text-gray-700 \", children: JSON.stringify(content, null, 2) }));\n }\n // Handle string content with markdown - content is already processed\n return (_jsx(\"div\", { className: \"vprose prose-sm\", children: _jsx(Markdown, { remarkPlugins: [remarkGfm], components: {\n a: ({ node, ref, ...props }) => {\n const href = props.href || \"\";\n if (href.includes(\"/store/objects\")) {\n return (_jsx(NavLink, { href: href, topLevelNav: true, children: props.children }));\n }\n return (_jsx(\"a\", { ...props, target: \"_blank\", rel: \"noopener noreferrer\" }));\n },\n img: ({ node, ref, ...props }) => {\n return (_jsx(\"img\", { ...props, className: \"max-w-full h-auto rounded-lg shadow-md my-3 cursor-pointer hover:shadow-lg transition-shadow\", loading: \"lazy\", onClick: () => props.src && window.open(props.src, '_blank') }));\n },\n code: ({ node, ref, className, children, ...props }) => {\n const match = /language-(\\w+)/.exec(className || \"\");\n const isInline = !match;\n const language = match ? match[1] : \"\";\n // Keep only the language indicator logic here, styling moved to CSS\n return (_jsxs(_Fragment, { children: [!isInline && language && (_jsx(\"div\", { className: \"code-language-indicator\", children: language })), _jsx(\"code\", { ...props, children: children })] }));\n },\n // Remove 'node' and 'ref' from props\n p: ({ node, ref, ...props }) => _jsx(\"p\", { ...props }),\n strong: ({ node, ref, ...props }) => _jsx(\"strong\", { ...props }),\n em: ({ node, ref, ...props }) => _jsx(\"em\", { ...props }),\n pre: ({ node, ref, ...props }) => _jsx(\"pre\", { ...props }),\n h1: ({ node, ref, ...props }) => _jsx(\"h1\", { ...props }),\n h2: ({ node, ref, ...props }) => _jsx(\"h2\", { ...props }),\n h3: ({ node, ref, ...props }) => _jsx(\"h3\", { ...props }),\n li: ({ node, ref, ...props }) => _jsx(\"li\", { ...props }),\n ul: ({ node, ref, ...props }) => _jsx(\"ul\", { ...props }),\n ol: ({ node, ref, ...props }) => _jsx(\"ol\", { ...props }),\n blockquote: ({ node, ref, ...props }) => _jsx(\"blockquote\", { ...props }),\n hr: ({ node, ref, ...props }) => _jsx(\"hr\", { ...props }),\n table: ({ node, ref, ...props }) => _jsx(\"div\", { className: \"overflow-x-auto\", children: _jsx(\"table\", { ...props }) }),\n th: ({ node, ref, ...props }) => _jsx(\"th\", { ...props }),\n td: ({ node, ref, ...props }) => _jsx(\"td\", { ...props }),\n }, children: content }) }));\n };\n const messageContent = getMessageContent();\n // Process content with image URL resolution when component mounts or message changes\n useEffect(() => {\n const processContent = async () => {\n if (messageContent) {\n setIsProcessingImages(true);\n try {\n const processed = await convertLinks(processContentForMarkdown(messageContent));\n setProcessedContent(processed);\n }\n catch (error) {\n console.error('Error processing message content:', error);\n setProcessedContent(messageContent);\n }\n finally {\n setIsProcessingImages(false);\n }\n }\n };\n processContent();\n }, [messageContent, client]);\n const workstreamId = getWorkstreamId(message);\n // Different styling based on message type\n const getMessageTypeStyles = () => {\n switch (message.type) {\n case AgentMessageType.ANSWER:\n return \"border-l-info bg-info\";\n case AgentMessageType.COMPLETE:\n return \"border-l-success bg-success\";\n case AgentMessageType.IDLE:\n return \"border-l-muted bg-muted\";\n case AgentMessageType.REQUEST_INPUT:\n return \"border-l-attention bg-attention\";\n case AgentMessageType.QUESTION:\n return \"border-l-muted bg-muted\";\n case AgentMessageType.THOUGHT:\n return \"border-l-accent dark:border-l-purple-500 bg-purple-50/50 dark:bg-purple-900/10\";\n case AgentMessageType.ERROR:\n return \"border-l-destructive bg-destructive\";\n case AgentMessageType.UPDATE:\n return \"border-l-success bg-success\";\n case AgentMessageType.PLAN:\n return \"border-l-attention bg-attention\";\n case AgentMessageType.TERMINATED:\n return \"border-l-muted bg-muted\";\n default:\n return \"border-l-indigo-500 dark:border-l-indigo-400 bg-indigo-50/50 dark:bg-indigo-900/10\";\n }\n };\n const messageTypeStyles = getMessageTypeStyles();\n // Get the color for the icon based on message type\n const getIconColor = () => {\n switch (message.type) {\n case AgentMessageType.ANSWER:\n return \"text-info\";\n case AgentMessageType.COMPLETE:\n return \"text-success\";\n case AgentMessageType.IDLE:\n return \"text-muted\";\n case AgentMessageType.REQUEST_INPUT:\n return \"text-attention\";\n case AgentMessageType.QUESTION:\n return \"text-muted\";\n case AgentMessageType.THOUGHT:\n return \"text-purple-600 dark:text-purple-400\";\n case AgentMessageType.ERROR:\n return \"text-destructive\";\n case AgentMessageType.UPDATE:\n return \"text-success\";\n case AgentMessageType.PLAN:\n return \"text-attention\";\n default:\n return \"text-muted\";\n }\n };\n // Get an icon for the message type with enhanced animations\n const getMessageIcon = () => {\n const iconColor = getIconColor();\n // Choose an animation style for thinking messages\n const getThinkingAnimation = (color) => {\n // Generate a deterministic but varying number based on the message timestamp\n // This ensures the same message always gets the same animation style\n const timestampNum = typeof message.timestamp === 'number'\n ? message.timestamp\n : new Date(message.timestamp).getTime();\n // Use only PulsatingCircle and AnimatedThinkingDots\n return (timestampNum % 2 === 0)\n ? _jsx(PulsatingCircle, { size: \"sm\", color: color })\n : _jsx(AnimatedThinkingDots, { color: color });\n };\n switch (message.type) {\n case AgentMessageType.ANSWER:\n return showPulsatingCircle ? (getThinkingAnimation('blue')) : (_jsx(Bot, { className: `size-4 ${iconColor}` }));\n case AgentMessageType.COMPLETE:\n return _jsx(CheckCircle, { className: `size-4 ${iconColor}` });\n case AgentMessageType.TERMINATED:\n return _jsx(CheckCircle, { className: `size-4 ${iconColor}` });\n case AgentMessageType.IDLE:\n return _jsx(Clock, { className: `size-4 ${iconColor}` });\n case AgentMessageType.REQUEST_INPUT:\n return _jsx(User, { className: `size-4 ${iconColor}` });\n case AgentMessageType.QUESTION:\n return _jsx(User, { className: `size-4 ${iconColor}` });\n case AgentMessageType.THOUGHT:\n return showPulsatingCircle ? (getThinkingAnimation('purple')) : (_jsx(Bot, { className: `size-4 ${iconColor}` }));\n case AgentMessageType.ERROR:\n return _jsx(AlertCircle, { className: `size-4 ${iconColor}` });\n case AgentMessageType.UPDATE:\n return showPulsatingCircle ? (getThinkingAnimation('green')) : (_jsx(Info, { className: `size-4 ${iconColor}` }));\n case AgentMessageType.PLAN:\n return showPulsatingCircle ? (getThinkingAnimation('amber')) : (_jsx(MessageSquare, { className: `size-4 ${iconColor}` }));\n default:\n return showPulsatingCircle ? (getThinkingAnimation('blue')) : (_jsx(Bot, { className: `size-4 ${iconColor}` }));\n }\n };\n return (_jsxs(\"div\", { className: `border-l-4 shadow-md overflow-hidden bg-white dark:bg-gray-900 mb-5 ${messageTypeStyles}`, \"data-workstream-id\": workstreamId, children: [_jsxs(\"div\", { className: \"flex items-center justify-between px-4 py-2 border-b border-gray-100/80 dark:border-gray-800/80 bg-white/50 dark:bg-gray-900/50 backdrop-blur-sm\", children: [_jsxs(\"div\", { className: \"flex items-center gap-2\", children: [_jsx(\"div\", { className: showPulsatingCircle ? \"animate-fadeIn\" : \"\", children: getMessageIcon() }), _jsx(\"span\", { className: \"text-xs font-medium text-muted \", children: messageStyles.sender }), workstreamId !== \"main\" && workstreamId !== \"all\" && (_jsx(Badge, { variant: \"default\", className: \"text-xs text-muted\", children: workstreamId }))] }), _jsxs(\"div\", { className: \"flex items-center gap-2\", children: [_jsx(\"span\", { className: \"text-xs text-muted\", children: dayjs(message.timestamp).format(\"HH:mm:ss\") }), _jsx(Button, { variant: \"ghost\", size: \"xs\", onClick: copyToClipboard, className: \"text-muted\", title: \"Copy message\", children: _jsx(CopyIcon, { className: \"size-3\" }) })] })] }), _jsxs(\"div\", { className: \"px-4 py-3 bg-white dark:bg-gray-900\", children: [messageContent && (_jsx(\"div\", { className: \"message-content\", children: isProcessingImages ? (_jsxs(\"div\", { className: \"flex items-center gap-2 text-sm text-gray-500\", children: [_jsx(AnimatedThinkingDots, { color: \"blue\" }), _jsx(\"span\", { children: \"Loading images...\" })] })) : (renderContent(processedContent || messageContent)) })), message.details && (_jsxs(\"div\", { className: \"mt-2\", children: [_jsxs(\"button\", { onClick: () => setShowDetails(!showDetails), className: \"text-xs text-muted flex items-center\", children: [showDetails ? \"Hide\" : \"Show\", \" details\", _jsx(\"svg\", { xmlns: \"http://www.w3.org/2000/svg\", className: `h-3 w-3 ml-1 transition-transform ${showDetails ? \"rotate-180\" : \"\"}`, fill: \"none\", viewBox: \"0 0 24 24\", stroke: \"currentColor\", children: _jsx(\"path\", { strokeLinecap: \"round\", strokeLinejoin: \"round\", strokeWidth: 2, d: \"M19 9l-7 7-7-7\" }) })] }), showDetails && (_jsx(\"div\", { className: \"mt-2 p-2 bg-muted border border-mixer-muted/40 rounded text-sm\", children: typeof message.details === \"string\" ? (renderContent(message.details)) : (_jsx(\"pre\", { className: \"text-xs font-mono whitespace-pre-wrap overflow-x-auto bg-muted p-2 rounded text-muted \", children: JSON.stringify(message.details, null, 2) })) }))] }))] })] }));\n}\n//# sourceMappingURL=MessageItem.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { CheckCircle, Clock } from \"lucide-react\";\nimport { getWorkstreamId } from \"./utils\";\n/**\n * Component that displays tabs for different workstreams\n */\nexport default function WorkstreamTabs({ workstreams, activeWorkstream, onSelectWorkstream, count, completionStatus, }) {\n // Create a new map with just the core workstreams\n const filteredWorkstreams = new Map();\n filteredWorkstreams.set(\"all\", \"All Messages\");\n filteredWorkstreams.set(\"main\", \"Main\");\n // Only add actual workstreams from messages (not our test workstreams)\n workstreams.forEach((name, id) => {\n if (id !== \"all\" &&\n id !== \"main\" &&\n id !== \"research_france\" &&\n id !== \"statistics\") {\n filteredWorkstreams.set(id, name);\n }\n });\n // Replace workstreams with our filtered version\n workstreams = filteredWorkstreams;\n // Sort workstream entries in a predictable order:\n // 1. 'all' first\n // 2. 'main' second\n // 3. The rest alphabetically by ID\n const sortedWorkstreams = Array.from(workstreams.entries()).sort(([idA], [idB]) => {\n if (idA === \"all\")\n return -1;\n if (idB === \"all\")\n return 1;\n if (idA === \"main\")\n return -1;\n if (idB === \"main\")\n return 1;\n return idA.localeCompare(idB);\n });\n // Only show tabs if there are multiple workstreams (more than just 'all' and 'main')\n const hasMultipleWorkstreams = sortedWorkstreams.length > 2;\n // If there are no multiple workstreams, return an empty div to maintain layout\n if (!hasMultipleWorkstreams) {\n return _jsx(\"div\", { className: \"py-1\" });\n }\n return (_jsx(\"div\", { className: \"flex overflow-x-auto space-x-1 mb-2 bg-muted border-b-2 border-muted/20 sticky top-0 z-10\", children: sortedWorkstreams.map(([id, name]) => (_jsxs(\"button\", { className: `px-2 py-1 text-xs font-medium whitespace-nowrap transition-colors flex items-center gap-1.5\n ${activeWorkstream === id\n ? \"bg-info text-info border-b-2 border-info\"\n : \"text-muted hover:bg-muted border-b-2 border-transparent\"}`, onClick: () => onSelectWorkstream(id), title: name.length > 20 ? name : undefined, children: [name.length > 20 ? name.substring(0, 18) + \"...\" : name, count && count.has(id) && count.get(id) > 0 && (_jsxs(\"div\", { className: \"flex items-center space-x-1\", children: [_jsx(\"span\", { className: `inline-flex items-center justify-center p-1 text-xs rounded-full\n ${activeWorkstream === id\n ? \"bg-info text-info\"\n : \"bg-muted text-muted\"}`, children: count.get(id) }), completionStatus &&\n id !== \"all\" &&\n (completionStatus.get(id) ? (_jsx(CheckCircle, { className: \"size-3 text-success\" })) : (_jsx(Clock, { className: \"size-3 text-attention\" })))] }))] }, id))) }));\n}\n/**\n * Helper function to extract workstream information from messages\n */\nexport function extractWorkstreams(messages) {\n const workstreams = new Map();\n // Always include \"all\" and \"main\" workstreams\n workstreams.set(\"all\", \"All Messages\");\n workstreams.set(\"main\", \"Main\");\n // Extract workstream IDs directly from message.workstream_id only\n messages.forEach((message) => {\n if (message.workstream_id &&\n message.workstream_id !== \"main\" &&\n message.workstream_id !== \"all\" &&\n !workstreams.has(message.workstream_id)) {\n // Use the workstream_id as both the ID and the display name\n workstreams.set(message.workstream_id, message.workstream_id);\n console.log(`Found workstream: ${message.workstream_id}`);\n }\n });\n // Special case: if there's only the 'main' workstream, we want to explicitly make sure it exists\n // This ensures that both 'all' and 'main' are added if no additional workstreams are found\n if (workstreams.size <= 2 && !workstreams.has(\"main\")) {\n workstreams.set(\"main\", \"Main\");\n }\n console.log(\"Final workstreams map:\", workstreams);\n return workstreams;\n}\n/**\n * Filter messages by workstream\n */\nexport function filterMessagesByWorkstream(messages, workstreamId) {\n if (workstreamId === \"all\") {\n // Show all messages, no filtering needed\n return [...messages];\n }\n else if (workstreamId === \"main\") {\n // For the main workstream, show only messages that belong to the main workstream\n // This excludes messages that belong to specific tasks/workstreams\n return messages.filter((message) => {\n const msgWorkstreamId = getWorkstreamId(message);\n return msgWorkstreamId === \"main\";\n });\n }\n else {\n // For specific workstreams, show only messages that match the workstream_id\n return messages.filter((message) => {\n const msgWorkstreamId = getWorkstreamId(message);\n return msgWorkstreamId === workstreamId;\n });\n }\n}\n//# sourceMappingURL=WorkstreamTabs.js.map","import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { AgentMessageType } from \"@vertesia/common\";\nimport React, { useEffect, useMemo, useState } from \"react\";\nimport MessageItem from \"./MessageItem\";\nimport WorkstreamTabs, { extractWorkstreams, filterMessagesByWorkstream } from \"./WorkstreamTabs\";\nimport { DONE_STATES, getWorkstreamId } from \"./utils\";\nexport default function AllMessagesMixed({ messages, bottomRef, viewMode = 'stacked', isCompleted = false, }) {\n const containerRef = React.useRef(null);\n const [activeWorkstream, setActiveWorkstream] = useState(\"all\");\n // Auto-scroll to bottom when messages change\n useEffect(() => {\n if (bottomRef.current) {\n bottomRef.current.scrollIntoView({ behavior: \"smooth\" });\n }\n }, [messages, bottomRef]);\n // Sort all messages chronologically\n const sortedMessages = React.useMemo(() => [...messages].sort((a, b) => {\n const timeA = typeof a.timestamp === \"number\" ? a.timestamp : new Date(a.timestamp).getTime();\n const timeB = typeof b.timestamp === \"number\" ? b.timestamp : new Date(b.timestamp).getTime();\n return timeA - timeB;\n }), [messages]);\n // Get workstreams from messages - only from message.workstream_id\n const workstreams = React.useMemo(() => {\n // Just get the basic workstreams from the messages\n const extractedWorkstreams = extractWorkstreams(sortedMessages);\n // We'll keep taskLabels - they might be used for display purposes elsewhere\n // but we won't use them to create new workstream tabs\n return extractedWorkstreams;\n }, [sortedMessages]);\n // Count messages per workstream\n const workstreamCounts = React.useMemo(() => {\n const counts = new Map();\n counts.set(\"all\", sortedMessages.length);\n // Count main messages\n const mainMessages = filterMessagesByWorkstream(sortedMessages, \"main\");\n counts.set(\"main\", mainMessages.length);\n // Count other workstreams\n sortedMessages.forEach((msg) => {\n const workstreamId = getWorkstreamId(msg);\n if (workstreamId !== \"main\") {\n counts.set(workstreamId, (counts.get(workstreamId) || 0) + 1);\n }\n });\n return counts;\n }, [sortedMessages]);\n // Filter messages based on active workstream\n const displayMessages = React.useMemo(() => {\n if (activeWorkstream === \"all\") {\n return sortedMessages;\n }\n return filterMessagesByWorkstream(sortedMessages, activeWorkstream);\n }, [sortedMessages, activeWorkstream]);\n // Determine completion status for each workstream\n const workstreamCompletionStatus = useMemo(() => {\n const statusMap = new Map();\n // Group messages by workstream\n const workstreamMessages = new Map();\n sortedMessages.forEach(message => {\n const workstreamId = getWorkstreamId(message);\n if (!workstreamMessages.has(workstreamId)) {\n workstreamMessages.set(workstreamId, []);\n }\n workstreamMessages.get(workstreamId).push(message);\n });\n // Check if each workstream is completed\n for (const [workstreamId, msgs] of workstreamMessages.entries()) {\n if (msgs.length > 0) {\n const lastMessage = msgs[msgs.length - 1];\n statusMap.set(workstreamId, [\n AgentMessageType.COMPLETE,\n AgentMessageType.IDLE,\n AgentMessageType.REQUEST_INPUT,\n AgentMessageType.TERMINATED\n ].includes(lastMessage.type));\n }\n }\n return statusMap;\n }, [sortedMessages]);\n return (_jsxs(\"div\", { ref: containerRef, className: \"flex-1 min-h-0 h-full overflow-y-auto px-4 sm:px-2 lg:px-4 flex flex-col relative\", \"data-testid\": \"all-messages-mixed\", children: [_jsx(\"div\", { className: \"sticky top-0 z-10\", children: _jsx(WorkstreamTabs, { workstreams: workstreams, activeWorkstream: activeWorkstream, onSelectWorkstream: setActiveWorkstream, count: workstreamCounts, completionStatus: workstreamCompletionStatus }) }), displayMessages.length === 0 ? (_jsx(\"div\", { className: \"flex items-center justify-center h-full text-center py-8\", children: _jsx(\"div\", { className: \"flex items-center px-4 py-3 text-muted\", children: activeWorkstream === \"all\"\n ? \"Waiting for agent response...\"\n : \"No messages in this workstream yet...\" }) })) : (_jsxs(\"div\", { className: \"flex-1 flex flex-col justify-start pb-4 space-y-2\", children: [viewMode === 'stacked' ? (\n // Stacked view - show all messages in the current workstream\n // Add pulsating circle to the latest message if not completed\n displayMessages.map((message, index) => {\n // Find if this is the latest non-completion message\n const isLatestNonCompletionMessage = !isCompleted &&\n index === displayMessages.length - 1 &&\n !DONE_STATES.includes(message.type);\n return (_jsx(MessageItem, { message: message, showPulsatingCircle: isLatestNonCompletionMessage }, `${message.timestamp}-${index}`));\n })) : (\n // Sliding view - only permanent messages and latest thinking from the current workstream\n _jsx(_Fragment, { children: (() => {\n // First get all permanent messages (ANSWER, QUESTION, COMPLETE, REQUEST_INPUT, TERMINATED)\n const permanentMessages = displayMessages.filter(msg => msg.type === AgentMessageType.ANSWER ||\n msg.type === AgentMessageType.QUESTION ||\n msg.type === AgentMessageType.COMPLETE ||\n msg.type === AgentMessageType.TERMINATED);\n // Then get the latest thinking message if not completed\n const latestThinkingMessage = !isCompleted ?\n displayMessages\n .filter(msg => msg.type === AgentMessageType.THOUGHT ||\n msg.type === AgentMessageType.UPDATE ||\n msg.type === AgentMessageType.PLAN)\n .sort((a, b) => {\n const timeA = typeof a.timestamp === 'number' ? a.timestamp : new Date(a.timestamp).getTime();\n const timeB = typeof b.timestamp === 'number' ? b.timestamp : new Date(b.timestamp).getTime();\n return timeB - timeA; // Sort descending - newest first\n })[0]\n : null;\n // Sort all messages by timestamp\n const allMessages = [...permanentMessages];\n if (latestThinkingMessage) {\n allMessages.push(latestThinkingMessage);\n }\n allMessages.sort((a, b) => {\n const timeA = typeof a.timestamp === 'number' ? a.timestamp : new Date(a.timestamp).getTime();\n const timeB = typeof b.timestamp === 'number' ? b.timestamp : new Date(b.timestamp).getTime();\n return timeA - timeB; // Sort ascending - oldest first\n });\n // Show pulsating circle only on the latest message if not completed\n return allMessages.map((message, index) => {\n const isLatestMessage = !isCompleted &&\n index === allMessages.length - 1 &&\n !DONE_STATES.includes(message.type);\n return (_jsx(MessageItem, { message: message, showPulsatingCircle: isLatestMessage }, `${message.timestamp}-${index}`));\n });\n })() })), _jsx(\"div\", { ref: bottomRef, className: \"h-4\" })] }))] }));\n}\n//# sourceMappingURL=AllMessagesMixed.js.map","import { jsx as _jsx } from \"react/jsx-runtime\";\nimport { AgentSearchScope, mergeInCodePromptSchemas, supportsToolUse } from \"@vertesia/common\";\nimport { useUserSession } from \"@vertesia/ui/session\";\nimport Ajv from \"ajv\";\nimport { createContext, useContext, useEffect, useState } from \"react\";\n// export interface ConversationWorkflowPayload {\n// config: {\n// environment?: ExecutionEnvironmentRef | undefined;\n// model?: string;\n// }\n// data?: JSONObject | undefined,\n// tool_names: string[],\n// }\nexport class PayloadBuilder {\n vertesia;\n updateState;\n _interactive = true;\n _debug_mode = false;\n _collection;\n _start = false;\n _preserveRunValues = false;\n _interaction;\n _environment;\n _model = '';\n _tool_names = [];\n _data;\n _interactionParamsSchema;\n _inputValidator;\n constructor(vertesia, updateState) {\n this.vertesia = vertesia;\n this.updateState = updateState;\n }\n onStateChanged() {\n const newInstance = this.clone();\n this.updateState(newInstance);\n }\n clone() {\n const builder = new PayloadBuilder(this.vertesia, this.updateState);\n builder._interactionParamsSchema = this._interactionParamsSchema;\n builder._interaction = this._interaction;\n builder._data = this._data;\n builder._environment = this._environment;\n builder._model = this._model;\n builder._tool_names = [...this._tool_names];\n builder._interactive = this._interactive;\n builder._debug_mode = this._debug_mode;\n builder._inputValidator = this._inputValidator;\n builder._start = this._start;\n builder._collection = this._collection;\n builder._preserveRunValues = this._preserveRunValues;\n return builder;\n }\n get interactive() {\n return this._interactive;\n }\n set interactive(interactive) {\n if (interactive !== this._interactive) {\n this._interactive = interactive;\n this.onStateChanged();\n }\n }\n get debug_mode() {\n return this._debug_mode;\n }\n set debug_mode(debug_mode) {\n if (debug_mode !== this._debug_mode) {\n this._debug_mode = debug_mode;\n this.onStateChanged();\n }\n }\n get collection() {\n return this._collection;\n }\n set collection(collection) {\n if (collection !== this._collection) {\n this._collection = collection;\n this.onStateChanged();\n }\n }\n get search_scope() {\n return this._collection ? AgentSearchScope.Collection : undefined;\n }\n async restoreConversation(context) {\n // Handle version-specific interaction resolution\n let interactionRef = context.interaction;\n if (context.version) {\n const objectIdRegex = /^[a-fA-F0-9]{24}$/;\n if (!objectIdRegex.test(interactionRef)) {\n // regex to check if interactionRef is an object id (24 hex characters), only append version if not an object id\n interactionRef = `${interactionRef}@${context.version}`;\n }\n }\n const inter = await this.vertesia.interactions.catalog.resolve(interactionRef);\n const envId = inter.runtime?.environment || context.config?.environment;\n const model = context.config?.model;\n const env = await (envId ?\n this.vertesia.environments.retrieve(context.config?.environment)\n :\n Promise.resolve(undefined));\n this.interactionParamsSchema = context.interactionParamsSchema ?? null;\n // trigger the setter to update the corresponding interactionParamsSchema\n this.interaction = inter;\n this._tool_names = context.tool_names || [];\n this._data = context.data;\n this._interactive = context.interactive;\n this._debug_mode = context.debug_mode ?? false;\n this.collection = context.collection_id ?? undefined;\n // we need to trigger the setter to deal with default models\n this.environment = env;\n if (model) {\n this._model = model;\n }\n this.onStateChanged();\n }\n get interaction() {\n return this._interaction;\n }\n set interaction(interaction) {\n if (interaction?.id !== this._interaction?.id) {\n this._interaction = interaction;\n // trigger the setter to update the onChange state\n this.interactionParamsSchema = interaction ? mergeInCodePromptSchemas(interaction.prompts) : undefined;\n // Reset the validator when schema changes\n this._inputValidator = undefined;\n if (interaction && !this._preserveRunValues) {\n if (interaction.runtime?.environment) {\n const envId = interaction.runtime.environment;\n this.vertesia.environments.retrieve(envId).then((environment) => this.environment = environment);\n }\n }\n this.onStateChanged();\n }\n }\n get environment() {\n return this._environment;\n }\n set environment(environment) {\n if (environment?.id !== this._environment?.id) {\n this._environment = environment;\n if (!this._preserveRunValues) {\n // First try to use the interaction model, then the environment default model\n const interactionModel = this.interaction?.runtime?.model;\n if (interactionModel && environment && supportsToolUse(interactionModel, environment.provider)) {\n this._model = interactionModel;\n }\n else {\n this._model = environment?.default_model && supportsToolUse(environment.default_model, environment.provider)\n ? environment.default_model : '';\n }\n }\n this.onStateChanged();\n }\n }\n get model() {\n return this._model;\n }\n set model(model) {\n if (model !== this._model) {\n this._model = model || '';\n this.onStateChanged();\n }\n }\n get tool_names() {\n return this._tool_names;\n }\n set tool_names(tools) {\n this._tool_names = tools;\n this.onStateChanged();\n }\n get data() {\n return this._data;\n }\n set data(prompt_data) {\n this._data = prompt_data;\n this.onStateChanged();\n }\n set run(run) {\n console.log(\"run\", run);\n this.onStateChanged();\n }\n set start(value) {\n if (this._start !== value) {\n this._start = value;\n this.onStateChanged();\n }\n }\n get start() {\n return this._start;\n }\n get preserveRunValues() {\n return this._preserveRunValues;\n }\n set preserveRunValues(value) {\n this._preserveRunValues = value;\n }\n get interactionParamsSchema() {\n return this._interactionParamsSchema;\n }\n set interactionParamsSchema(schema) {\n if (this._interactionParamsSchema !== schema) {\n this._interactionParamsSchema = schema;\n this.onStateChanged();\n }\n }\n reset() {\n this._start = false;\n this._interactive = true;\n this._debug_mode = false;\n this._collection = undefined;\n this._preserveRunValues = false;\n this._model = '';\n this._environment = undefined;\n this._tool_names = [];\n this._interaction = undefined;\n this._data = undefined;\n this._interactionParamsSchema = null;\n this._inputValidator = undefined;\n this.model = undefined;\n this.environment = undefined;\n this.onStateChanged();\n if (location.hash) {\n const urlWithoutHash = window.location.origin + window.location.pathname + window.location.search;\n history.replaceState(null, '', urlWithoutHash);\n location.hash = '';\n }\n }\n validateInput() {\n if (!this._interactionParamsSchema) {\n return { isValid: true };\n }\n // If schema has changed or validator not initialized, recompile\n if (!this._inputValidator || this._inputValidator.schema !== this._interactionParamsSchema) {\n const ajv = new Ajv({ strict: false });\n this._inputValidator = {\n validate: ajv.compile(this._interactionParamsSchema),\n schema: this._interactionParamsSchema\n };\n }\n const prompt_data = this._data || {};\n const isValid = this._inputValidator.validate(prompt_data);\n if (!isValid) {\n const errorMessage = this._inputValidator.validate.errors\n ? this._inputValidator.validate.errors.map((err) => `${err.instancePath}: ${err.message}`).join(', ')\n : 'Invalid payload data';\n return { isValid: false, errorMessage };\n }\n return { isValid: true };\n }\n}\nexport const PayloadContext = createContext(undefined);\nexport function PayloadBuilderProvider({ children }) {\n const { client } = useUserSession();\n const [builder, setBuilder] = useState();\n useEffect(() => {\n setBuilder(new PayloadBuilder(client, setBuilder));\n }, []);\n return builder && (_jsx(PayloadContext.Provider, { value: builder, children: children }));\n}\nexport function usePayloadBuilder() {\n const ctx = useContext(PayloadContext);\n if (!ctx) {\n throw new Error('usePayloadBuilder must be used within a PayloadProvider');\n }\n return ctx;\n}\n//# sourceMappingURL=PayloadBuilder.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { Button, Command, CommandGroup, CommandItem, CommandList, Popover, PopoverContent, PopoverTrigger, useToast } from \"@vertesia/ui/core\";\nimport { useUserSession } from \"@vertesia/ui/session\";\nimport { Bot, ClipboardList, CopyIcon, DownloadCloudIcon, ExternalLink, MoreVertical, XIcon } from \"lucide-react\";\nimport { PayloadBuilderProvider, usePayloadBuilder } from \"../../PayloadBuilder\";\nimport { getConversationUrl } from \"./utils\";\nexport default function Header({ title, onClose, isModal, run, viewMode, onViewModeChange, showPlanPanel, hasPlan = false, onTogglePlanPanel, onDownload, onCopyRunId, resetWorkflow }) {\n return (_jsx(PayloadBuilderProvider, { children: _jsxs(\"div\", { className: \"flex flex-wrap items-end justify-between py-1.5 px-2 border-b shadow-sm flex-shrink-0\", children: [_jsxs(\"div\", { className: \"flex flex-wrap items-center space-x-2\", children: [_jsxs(\"div\", { className: \"flex items-center space-x-1\", children: [_jsx(Bot, { className: \"size-5 text-muted\" }), _jsx(\"span\", { className: \"font-medium\", children: title })] }), _jsxs(\"span\", { className: \"text-xs text-muted ml-1\", children: [\"(Run ID: \", run.runId.substring(0, 8), \"...)\"] })] }), _jsxs(\"div\", { className: \"flex justify-end items-center space-x-2 ml-auto\", children: [_jsxs(\"div\", { className: \"flex items-center space-x-1 bg-muted rounded p-0.5\", children: [_jsx(Button, { variant: viewMode === \"stacked\" ? \"outline\" : \"ghost\", size: \"xs\", className: \"rounded-l-md\", onClick: () => onViewModeChange(\"stacked\"), children: \"Details\" }), _jsx(Button, { variant: viewMode === \"sliding\" ? \"outline\" : \"ghost\", size: \"xs\", className: \"rounded-l-md\", onClick: () => onViewModeChange(\"sliding\"), children: \"Most Important\" })] }), _jsxs(\"div\", { className: \"relative\", children: [hasPlan && !showPlanPanel && (_jsx(\"span\", { className: \"absolute -top-1 -right-1 w-2.5 h-2.5 bg-primary rounded-full border border-border z-10\" })), _jsxs(Button, { size: \"sm\", variant: showPlanPanel ? \"primary\" : \"secondary\", onClick: onTogglePlanPanel, className: `transition-all duration-200 rounded-md`, title: \"Toggle plan panel\", children: [_jsx(ClipboardList, { className: \"size-4 mr-1.5\" }), _jsx(\"span\", { className: \"font-medium text-xs\", children: showPlanPanel ? \"Hide Plan\" : \"Show Plan\" })] })] }), _jsx(MoreDropdown, { run: run, isModal: isModal, onClose: onClose, onDownload: onDownload, onCopyRunId: onCopyRunId, resetWorkflow: resetWorkflow }), onClose && !isModal && (_jsx(Button, { size: \"xs\", variant: \"ghost\", onClick: onClose, children: _jsx(XIcon, { className: \"size-4\" }) }))] })] }) }));\n}\nfunction MoreDropdown({ run, isModal, onClose, onDownload, onCopyRunId, resetWorkflow }) {\n const toast = useToast();\n const { client } = useUserSession();\n const builder = usePayloadBuilder();\n const cancelWorkflow = async (run) => {\n try {\n await client.store.workflows.terminate(run.workflowId, run.runId, \"cancel\");\n toast({\n status: \"success\",\n title: \"Workflow cancelled\",\n duration: 2000,\n });\n builder.reset();\n resetWorkflow?.();\n return true;\n }\n catch (error) {\n toast({\n status: \"error\",\n title: \"Failed to cancel workflow\",\n duration: 2000,\n });\n return false;\n }\n };\n const openUrl = (url) => {\n window.open(url, \"_blank\");\n return url;\n };\n return (_jsxs(Popover, { hover: true, children: [_jsx(PopoverTrigger, { children: _jsx(Button, { size: \"xs\", variant: \"ghost\", title: \"More actions\", children: _jsx(MoreVertical, { className: \"size-4\" }) }) }), _jsx(PopoverContent, { className: \"w-48\", align: \"end\", children: _jsx(\"div\", { className: \"rounded-md shadow-lg z-50\", children: _jsx(\"div\", { className: \"py-1 min-w-36\", children: _jsx(Command, { children: _jsx(CommandList, { children: _jsxs(CommandGroup, { children: [_jsx(\"div\", { className: \"flex items-center px-3 py-1.5 text-xs text-gray-700 dark:text-gray-300\", children: _jsx(\"span\", { className: \"text-muted\", children: \"Actions\" }) }), isModal && (_jsxs(CommandItem, { className: \"text-xs\", onSelect: () => openUrl(`/store/agent-runner?agentId=${run.runId}__${run.workflowId}`), children: [_jsx(ExternalLink, { className: \"size-3.5 mr-2 text-muted\" }), \" Open in new tab\"] })), _jsxs(CommandItem, { className: \"text-xs\", onSelect: () => {\n if (onCopyRunId) {\n onCopyRunId();\n }\n else {\n navigator.clipboard.writeText(run.runId);\n toast({\n status: \"success\",\n title: \"Run ID copied\",\n duration: 2000,\n });\n }\n }, children: [_jsx(CopyIcon, { className: \"size-3.5 mr-2 text-muted\" }), \" Copy Run ID\"] }), _jsxs(CommandItem, { className: \"text-xs\", onSelect: () => {\n if (onDownload) {\n onDownload();\n }\n else {\n getConversationUrl(client, run.runId).then((r) => window.open(r, \"_blank\"));\n }\n }, children: [_jsx(DownloadCloudIcon, { className: \"size-3.5 mr-2 text-muted\" }), \" Download Conversation\"] }), onClose && isModal && (_jsxs(CommandItem, { className: \"text-xs\", onSelect: onClose, children: [_jsx(XIcon, { className: \"size-3.5 mr-2 text-muted\" }), \" Close\"] })), _jsxs(CommandItem, { className: \"text-xs text-destructive\", onSelect: () => {\n cancelWorkflow(run);\n }, children: [_jsx(XIcon, { className: \"size-3.5 mr-2 text-destructive\" }), \" Cancel Workflow\"] })] }) }) }) }) }) })] }));\n}\n//# sourceMappingURL=Header.js.map","import { jsx as _jsx } from \"react/jsx-runtime\";\nimport { LayoutGrid, TableProperties } from 'lucide-react';\nimport { useState } from 'react';\nimport { Button } from '@vertesia/ui/core';\nconst LAST_DISPLAYED_VIEW = 'vertesia.content_store.lastDisplayedView';\nexport function ContentDispositionButton({ onUpdate }) {\n const [isGridView, setIsGridView] = useState(localStorage.getItem(LAST_DISPLAYED_VIEW) === \"grid\");\n const updateView = () => {\n if (isGridView) {\n toggleTableView();\n }\n else {\n toggleGridView();\n }\n };\n const toggleGridView = () => {\n localStorage.setItem(LAST_DISPLAYED_VIEW, \"grid\");\n setIsGridView(true);\n onUpdate(true);\n };\n const toggleTableView = () => {\n localStorage.setItem(LAST_DISPLAYED_VIEW, \"table\");\n setIsGridView(false);\n onUpdate(false);\n };\n return (_jsx(Button, { variant: \"outline\", onClick: updateView, alt: isGridView ? \"Table View\" : \"Thumbnail View\", children: isGridView\n ? _jsx(TableProperties, {})\n : _jsx(LayoutGrid, {}) }));\n}\nContentDispositionButton.LAST_DISPLAYED_VIEW = LAST_DISPLAYED_VIEW;\n//# sourceMappingURL=ContentDispositionButton.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { useState, useEffect } from 'react';\nimport { Button, Modal, ModalBody, ModalFooter, ModalTitle, Input, RadioGroup, RadioOptionAdapter, FormItem } from '@vertesia/ui/core';\nclass SaveOptionAdapter extends RadioOptionAdapter {\n labelOf(item) {\n return item.label;\n }\n idOf(item) {\n return item.id;\n }\n renderOption(item) {\n return (_jsxs(\"div\", { children: [_jsx(\"div\", { className: \"font-medium\", children: item.label }), _jsx(\"p\", { className: \"text-sm text-gray-500 dark:text-gray-400 mt-1\", children: item.description })] }));\n }\n}\nexport function SaveVersionConfirmModal({ isOpen, onClose, onConfirm, isLoading, uploadedFileName }) {\n const saveOptions = [\n {\n id: \"update\",\n label: \"Update current version\",\n description: uploadedFileName\n ? \"Replace the content file and modify properties directly in the current revision.\"\n : \"Modify the properties directly in the current revision.\"\n },\n {\n id: \"new-version\",\n label: \"Create new version\",\n description: uploadedFileName\n ? \"Create a new revision with the replacement file while preserving the original.\"\n : \"Create a new revision with these property changes while preserving the original.\"\n }\n ];\n // Default to \"create new version\" when replacing a file, \"update current version\" when editing properties\n const defaultOption = uploadedFileName ? saveOptions[1] : saveOptions[0];\n const [selectedOption, setSelectedOption] = useState(defaultOption);\n const [versionLabel, setVersionLabel] = useState('');\n const optionAdapter = new SaveOptionAdapter();\n // Reset to default when modal opens or uploadedFileName changes\n useEffect(() => {\n if (isOpen) {\n setSelectedOption(defaultOption);\n setVersionLabel('');\n }\n }, [isOpen, uploadedFileName]);\n const createVersion = selectedOption?.id === \"new-version\";\n const handleOptionChange = (option) => {\n setSelectedOption(option);\n };\n const handleConfirm = async () => {\n await onConfirm(createVersion, createVersion ? versionLabel : undefined);\n };\n return (_jsxs(Modal, { isOpen: isOpen, onClose: onClose, className: \"sm:max-w-md\", children: [_jsx(ModalTitle, { children: \"Save Changes\" }), _jsx(ModalBody, { children: _jsxs(\"div\", { className: \"space-y-4\", children: [uploadedFileName && (_jsx(\"div\", { className: \"mb-4 p-3 bg-blue-50 dark:bg-blue-900/20 rounded-md\", children: _jsxs(\"p\", { className: \"text-sm text-blue-700 dark:text-blue-300 font-medium\", children: [\"You're about to replace the content file with: \", _jsx(\"span\", { className: \"font-bold\", children: uploadedFileName })] }) })), _jsx(\"p\", { className: \"text-sm text-mixer-muted/5\", children: \"How would you like to save these changes?\" }), _jsx(RadioGroup, { adapter: optionAdapter, options: saveOptions, value: selectedOption, onChange: handleOptionChange, gap: \"gap-4\" }), createVersion && (_jsx(FormItem, { label: \"Version Label (Optional)\", description: \"Optional label for the new version.\", className: \"mt-3 pl-8\", children: _jsx(Input, { value: versionLabel, onChange: setVersionLabel, placeholder: \"e.g., v1.2, approved, post-review\", className: \"w-full\" }) }))] }) }), _jsxs(ModalFooter, { children: [_jsx(Button, { variant: \"secondary\", onClick: onClose, disabled: isLoading, children: \"Cancel\" }), _jsx(Button, { variant: \"primary\", onClick: handleConfirm, isLoading: isLoading, children: \"Save\" })] })] }));\n}\n//# sourceMappingURL=SaveVersionConfirmModal.js.map","import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from \"react/jsx-runtime\";\nimport { useUserSession } from '@vertesia/ui/session';\nimport { useState, useRef, useEffect } from 'react';\nimport { Button, Modal, ModalBody, ModalFooter, ModalTitle, useToast } from '@vertesia/ui/core';\nimport { useNavigate } from \"@vertesia/ui/router\";\n// Import Monaco Editor\nimport Editor from '@monaco-editor/react';\n// Import SaveVersionConfirmModal\nimport { SaveVersionConfirmModal } from './SaveVersionConfirmModal';\nexport function PropertiesEditorModal({ isOpen, onClose, object, refetch }) {\n const { client, store } = useUserSession();\n const toast = useToast();\n const navigate = useNavigate();\n const [isLoading, setIsLoading] = useState(false);\n const [propertiesJson, setPropertiesJson] = useState('');\n const [showConfirmation, setShowConfirmation] = useState(false);\n const [parsedProperties, setParsedProperties] = useState(null);\n const editorRef = useRef(null);\n const monacoRef = useRef(null);\n const [jsonSchema, setJsonSchema] = useState(null);\n //TODO state not used\n const [_newVersionId, setNewVersionId] = useState(null);\n // Initialize editor content when modal opens\n useEffect(() => {\n if (isOpen) {\n setPropertiesJson(JSON.stringify(object.properties || {}, null, 2));\n // Try to fetch JSON schema if object has a type\n if (object.type?.id) {\n fetchJsonSchema(object.type.id);\n }\n }\n }, [isOpen, object]);\n // Handle editor mounting\n function handleEditorDidMount(editor, monaco) {\n editorRef.current = editor;\n monacoRef.current = monaco;\n // Apply JSON schema validation if available\n if (jsonSchema) {\n setMonacoJsonSchema(monaco, jsonSchema);\n }\n }\n // Fetch JSON schema for the object type\n async function fetchJsonSchema(typeId) {\n try {\n const typeDetails = await store.types.retrieve(typeId);\n if (typeDetails.object_schema) {\n setJsonSchema(typeDetails.object_schema);\n // Apply schema if Monaco is already mounted\n if (monacoRef.current) {\n setMonacoJsonSchema(monacoRef.current, typeDetails.object_schema);\n }\n }\n }\n catch (error) {\n console.error('Failed to fetch JSON schema:', error);\n }\n }\n // Configure Monaco editor with JSON schema\n function setMonacoJsonSchema(monaco, schema) {\n monaco.languages.json.jsonDefaults.setDiagnosticsOptions({\n validate: true,\n schemas: [\n {\n uri: 'http://myserver/object-schema.json',\n fileMatch: ['*'],\n schema\n }\n ]\n });\n }\n // Validate JSON and open confirmation modal\n function handleSave() {\n if (!editorRef.current)\n return;\n const editorValue = editorRef.current.getValue();\n try {\n const properties = JSON.parse(editorValue);\n setParsedProperties(properties);\n setShowConfirmation(true);\n }\n catch (err) {\n toast({\n status: 'error',\n title: 'Invalid JSON',\n description: 'Please fix the JSON syntax errors before saving.',\n duration: 5000\n });\n }\n }\n // Save properties\n async function saveProperties(createVersion, versionLabel) {\n try {\n setIsLoading(true);\n const properties = parsedProperties || JSON.parse(propertiesJson);\n if (createVersion) {\n // Create a new version with the updated properties\n const response = await client.objects.update(object.id, {\n properties: properties\n }, {\n createRevision: true,\n revisionLabel: versionLabel\n });\n // Store the new version ID for navigation\n if (response.id !== object.id) {\n setNewVersionId(response.id);\n }\n toast({\n status: 'success',\n title: 'New version created',\n description: 'A new version with updated properties has been created.',\n duration: 2000\n });\n // Close modals\n setShowConfirmation(false);\n onClose();\n // Navigate to the new version\n if (response.id !== object.id) {\n // Delay slightly to allow modal closing to complete\n setTimeout(() => {\n navigate(`/objects/${response.id}`);\n toast({\n status: 'info',\n title: 'Viewing New Version',\n description: versionLabel ? `Now viewing version '${versionLabel}'` : 'Now viewing the new version',\n duration: 3000\n });\n }, 100);\n }\n }\n else {\n // Update the object properties in place\n await store.objects.update(object.id, {\n properties: properties\n });\n toast({\n status: 'success',\n title: 'Properties updated',\n description: 'The object properties have been updated successfully.',\n duration: 2000\n });\n if (refetch) {\n await refetch();\n }\n setShowConfirmation(false);\n onClose();\n }\n }\n catch (error) {\n toast({\n status: 'error',\n title: 'Error updating properties',\n description: error.message || 'An error occurred while updating the properties.',\n duration: 5000\n });\n setIsLoading(false);\n }\n }\n // Handle closing the confirmation modal without saving\n function handleCancelConfirmation() {\n setShowConfirmation(false);\n }\n return (_jsxs(_Fragment, { children: [_jsxs(Modal, { isOpen: isOpen, onClose: onClose, className: \"sm:max-w-[90%] md:max-w-[80%] lg:max-w-[75%] xl:max-w-[70%]\", children: [_jsx(ModalTitle, { children: \"Edit Properties\" }), _jsxs(ModalBody, { children: [_jsxs(\"div\", { className: \"mb-2 text-sm text-gray-500\", children: [object.type?.name ? (_jsxs(\"span\", { children: [\"Editing properties for object type: \", _jsx(\"strong\", { children: object.type.name })] })) : (_jsx(\"span\", { children: \"Editing properties for generic document\" })), jsonSchema && (_jsx(\"span\", { className: \"ml-2 text-green-600\", children: \"(JSON schema validation enabled)\" }))] }), _jsx(\"div\", { className: \"h-[75vh] border border-gray-300 dark:border-gray-700 rounded-md\", children: _jsx(Editor, { height: \"100%\", language: \"json\", value: propertiesJson, onChange: (value) => setPropertiesJson(value || ''), onMount: handleEditorDidMount, options: {\n minimap: { enabled: false },\n scrollBeyondLastLine: false,\n formatOnPaste: true,\n formatOnType: true,\n automaticLayout: true,\n wordWrap: 'on'\n } }) })] }), _jsxs(ModalFooter, { children: [_jsx(Button, { variant: \"secondary\", onClick: onClose, children: \"Cancel\" }), _jsx(Button, { variant: \"primary\", onClick: handleSave, children: \"Save Changes\" })] })] }), _jsx(SaveVersionConfirmModal, { isOpen: showConfirmation, onClose: handleCancelConfirmation, onConfirm: saveProperties, isLoading: isLoading })] }));\n}\n//# sourceMappingURL=PropertiesEditorModal.js.map","import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from \"react/jsx-runtime\";\nimport { useEffect, useState, memo } from \"react\";\nimport { useUserSession } from \"@vertesia/ui/session\";\nimport { Button, ResizableHandle, ResizablePanel, ResizablePanelGroup, Spinner, useToast } from \"@vertesia/ui/core\";\nimport { JSONDisplay, MarkdownRenderer } from \"@vertesia/ui/widgets\";\nimport { ContentNature, ImageRenditionFormat, POSTER_RENDITION_NAME } from \"@vertesia/common\";\nimport { Copy, Download, SquarePen, AlertTriangle } from \"lucide-react\";\nimport { PropertiesEditorModal } from \"./PropertiesEditorModal\";\nimport { NavLink } from \"@vertesia/ui/router\";\n// Maximum text size before cropping (128K characters)\nconst MAX_TEXT_DISPLAY_SIZE = 128 * 1024;\nvar PanelView;\n(function (PanelView) {\n PanelView[\"Text\"] = \"text\";\n PanelView[\"Image\"] = \"image\";\n PanelView[\"Video\"] = \"video\";\n})(PanelView || (PanelView = {}));\nexport function ContentOverview({ object, loadText, refetch, }) {\n const toast = useToast();\n const handleCopyContent = async (content, type) => {\n try {\n await navigator.clipboard.writeText(content);\n toast({\n status: \"success\",\n title: `${type === \"text\" ? \"Content\" : \"Properties\"} copied`,\n description: `Successfully copied ${type} to clipboard`,\n duration: 2000,\n });\n }\n catch (err) {\n console.error(`Failed to copy ${type}:`, err);\n toast({\n status: \"error\",\n title: \"Copy failed\",\n description: `Failed to copy ${type} to clipboard`,\n duration: 5000,\n });\n }\n };\n return (_jsx(_Fragment, { children: _jsxs(ResizablePanelGroup, { direction: \"horizontal\", className: \"h-[calc(100vh-200px)]\", children: [_jsx(ResizablePanel, { className: \"min-w-[100px]\", children: _jsx(PropertiesPanel, { object: object, refetch: refetch ?? (() => Promise.resolve()), handleCopyContent: handleCopyContent }) }), _jsx(ResizableHandle, { withHandle: true }), _jsx(ResizablePanel, { className: \"min-w-[100px]\", children: _jsx(DataPanel, { object: object, loadText: loadText ?? false, handleCopyContent: handleCopyContent }) })] }) }));\n}\nfunction PropertiesPanel({ object, refetch, handleCopyContent }) {\n const [viewCode, setViewCode] = useState(false);\n const [isPropertiesModalOpen, setPropertiesModalOpen] = useState(false);\n const handleOpenPropertiesModal = () => {\n setPropertiesModalOpen(true);\n };\n const handleClosePropertiesModal = () => {\n setPropertiesModalOpen(false);\n };\n return (_jsxs(_Fragment, { children: [_jsxs(\"div\", { className: \"flex justify-between items-center px-2\", children: [_jsxs(\"div\", { className: \"flex items-center gap-1 bg-muted mb-2 p-1 rounded\", children: [_jsx(Button, { variant: `${viewCode ? \"ghost\" : \"primary\"}`, size: \"sm\", alt: \"Preview properties\", onClick: () => setViewCode(!viewCode), children: \"Properties\" }), _jsx(Button, { variant: `${viewCode ? \"primary\" : \"ghost\"}`, size: \"sm\", alt: \"View in JSON format\", onClick: () => setViewCode(!viewCode), children: \"JSON\" })] }), _jsxs(\"div\", { className: \"flex items-center gap-2\", children: [object.properties && (_jsx(Button, { variant: \"ghost\", size: \"sm\", title: \"Copy properties\", onClick: () => handleCopyContent(JSON.stringify(object.properties, null, 2), \"properties\"), children: _jsx(Copy, { className: \"size-4\" }) })), _jsx(Button, { variant: \"ghost\", size: \"sm\", onClick: handleOpenPropertiesModal, title: \"Edit properties\", className: \"flex items-center gap-2\", children: _jsx(SquarePen, { className: \"size-4\" }) })] })] }), object.properties ? (_jsx(\"div\", { className: \"h-[calc(100vh-220px)] overflow-auto px-2\", children: _jsx(JSONDisplay, { value: object.properties, viewCode: viewCode }) })) : (_jsx(\"div\", { className: \"h-[calc(100vh-220px)] overflow-auto px-2\", children: _jsx(\"div\", { children: \"No properties defined\" }) })), _jsx(PropertiesEditorModal, { isOpen: isPropertiesModalOpen, onClose: handleClosePropertiesModal, object: object, refetch: refetch })] }));\n}\nfunction DataPanel({ object, loadText, handleCopyContent }) {\n const { store } = useUserSession();\n const isImage = object?.metadata?.type === ContentNature.Image;\n const isVideo = object?.metadata?.type === ContentNature.Video;\n // Determine initial panel view\n const getInitialView = () => {\n if (isVideo)\n return PanelView.Video;\n if (isImage)\n return PanelView.Image;\n return PanelView.Text;\n };\n const [currentPanel, setCurrentPanel] = useState(getInitialView());\n const [text, setText] = useState(object.text);\n const [isLoadingText, setIsLoadingText] = useState(false);\n const [isTextCropped, setIsTextCropped] = useState(false);\n useEffect(() => {\n if (loadText && !text) {\n setIsLoadingText(true);\n store.objects\n .getObjectText(object.id)\n .then((res) => {\n if (res.text.length > MAX_TEXT_DISPLAY_SIZE) {\n // Crop the text to 128K characters\n const croppedText = res.text.substring(0, MAX_TEXT_DISPLAY_SIZE);\n setText(croppedText);\n setIsTextCropped(true);\n }\n else {\n setText(res.text);\n setIsTextCropped(false);\n }\n })\n .catch((err) => {\n console.error(\"Failed to load text\", err);\n })\n .finally(() => {\n setIsLoadingText(false);\n });\n }\n }, [loadText]);\n return (_jsxs(_Fragment, { children: [_jsxs(\"div\", { className: \"flex justify-between items-center px-2\", children: [_jsxs(\"div\", { className: \"flex items-center gap-1 bg-muted mb-2 p-1 rounded\", children: [isImage &&\n _jsx(Button, { variant: currentPanel === PanelView.Image ? \"primary\" : \"ghost\", size: \"sm\", alt: \"View Image\", onClick: () => setCurrentPanel(PanelView.Image), children: \"Image\" }), isVideo &&\n _jsx(Button, { variant: currentPanel === PanelView.Video ? \"primary\" : \"ghost\", size: \"sm\", alt: \"View Video\", onClick: () => setCurrentPanel(PanelView.Video), children: \"Video\" }), _jsx(Button, { variant: currentPanel === PanelView.Text ? \"primary\" : \"ghost\", size: \"sm\", alt: \"View Text\", onClick: () => setCurrentPanel(PanelView.Text), children: \"Text\" })] }), currentPanel === PanelView.Text && _jsx(TextActions, { object: object, text: text, handleCopyContent: handleCopyContent })] }), currentPanel === PanelView.Image ? (_jsx(ImagePanel, { object: object })) : currentPanel === PanelView.Video ? (_jsx(VideoPanel, { object: object })) : (isLoadingText ? (_jsx(\"div\", { className: \"flex justify-center items-center h-[calc(100vh-260px)]\", children: _jsx(Spinner, { size: \"lg\" }) })) : (_jsx(TextPanel, { object: object, text: text, isTextCropped: isTextCropped })))] }));\n}\nfunction TextActions({ object, text, handleCopyContent }) {\n const { client } = useUserSession();\n const toast = useToast();\n const [loadingFormat, setLoadingFormat] = useState(null);\n const content = object.content;\n const isMarkdown = content &&\n content.type &&\n content.type === \"text/markdown\";\n const handleExportDocument = async (format) => {\n // Prevent multiple concurrent exports\n if (loadingFormat)\n return;\n setLoadingFormat(format);\n // Show immediate feedback\n toast({\n status: \"info\",\n title: `Preparing ${format.toUpperCase()}`,\n description: \"Fetching your document...\",\n duration: 2000,\n });\n try {\n // Request document rendition from the server\n const response = await client.objects.getRendition(object.id, {\n format: format, // We're extending the format type\n generate_if_missing: true,\n sign_url: true,\n });\n if (response.status === \"generating\") {\n toast({\n status: \"info\",\n title: \"Generating document\",\n description: `Please wait while we prepare your ${format.toUpperCase()} file...`,\n duration: 5000,\n });\n // Poll for completion\n setTimeout(() => handleExportDocument(format), 3000);\n return;\n }\n if (response.status === \"failed\") {\n throw new Error(\"Document generation failed\");\n }\n // Download the generated file or open in new window\n if (response.renditions && response.renditions.length > 0) {\n const downloadUrl = response.renditions[0];\n if (format === 'pdf') {\n // Open PDF in new window\n window.open(downloadUrl, '_blank');\n toast({\n status: \"success\",\n title: \"PDF opened\",\n description: \"PDF document opened in a new window\",\n duration: 2000,\n });\n }\n else {\n // Download DOCX file\n const link = document.createElement(\"a\");\n link.href = downloadUrl;\n link.download = `${object.name || \"document\"}.${format}`;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n toast({\n status: \"success\",\n title: \"Document exported\",\n description: `Successfully exported to ${format.toUpperCase()} format`,\n duration: 2000,\n });\n }\n }\n }\n catch (err) {\n console.error(`Failed to export document as ${format}:`, err);\n toast({\n status: \"error\",\n title: \"Export failed\",\n description: `Failed to export document to ${format.toUpperCase()} format`,\n duration: 5000,\n });\n }\n finally {\n setLoadingFormat(null);\n }\n };\n const handleExportDocx = () => handleExportDocument(\"docx\");\n const handleExportPdf = () => handleExportDocument(\"pdf\");\n return (_jsx(\"div\", { className: \"h-[41px] text-lg font-semibold flex justify-between items-center px-2\", children: _jsxs(\"div\", { className: \"flex items-center gap-2\", children: [text && (_jsx(Button, { variant: \"ghost\", size: \"sm\", title: \"Copy text\", className: \"flex items-center gap-2\", onClick: () => handleCopyContent(text, \"text\"), children: _jsx(Copy, { className: \"size-4\" }) })), isMarkdown && text && (_jsxs(_Fragment, { children: [_jsxs(Button, { variant: \"ghost\", size: \"sm\", onClick: handleExportDocx, disabled: loadingFormat !== null, className: \"flex items-center gap-2\", children: [loadingFormat === \"docx\" ? (_jsx(Spinner, { size: \"sm\" })) : (_jsx(Download, { className: \"size-4\" })), \"DOCX\"] }), _jsxs(Button, { variant: \"ghost\", size: \"sm\", onClick: handleExportPdf, disabled: loadingFormat !== null, className: \"flex items-center gap-2\", children: [loadingFormat === \"pdf\" ? (_jsx(Spinner, { size: \"sm\" })) : (_jsx(Download, { className: \"size-4\" })), \"PDF\"] })] }))] }) }));\n}\nconst TextPanel = memo(({ object, text, isTextCropped }) => {\n const content = object.content;\n // Check if content type is markdown or plain text\n const isMarkdownOrText = content &&\n content.type &&\n (content.type === \"text/markdown\" || content.type === \"text/plain\");\n // Check if text content looks like markdown\n const seemsMarkdown = text && (text.includes(\"\\n# \") ||\n text.includes(\"\\n## \") ||\n text.includes(\"\\n### \") ||\n text.includes(\"\\n* \") ||\n text.includes(\"\\n- \") ||\n text.includes(\"\\n+ \") ||\n text.includes(\"![\") ||\n text.includes(\"](\"));\n // Render as markdown if it's markdown/text type OR if text looks like markdown\n const shouldRenderAsMarkdown = isMarkdownOrText || seemsMarkdown;\n return (text ? (_jsxs(_Fragment, { children: [isTextCropped && (_jsx(\"div\", { className: \"px-2 py-2 bg-attention/10 border-l-4 border-attention mx-2 mb-2 rounded\", children: _jsxs(\"div\", { className: \"flex items-center gap-2 text-attention\", children: [_jsx(AlertTriangle, { className: \"size-4\" }), _jsx(\"span\", { className: \"text-sm font-semibold\", children: \"Showing first 128K characters only\" })] }) })), _jsx(\"div\", { className: \"max-w-7xl px-2 h-[calc(100vh-210px)] overflow-auto\", children: shouldRenderAsMarkdown ? (_jsx(\"div\", { className: \"vprose prose-sm p-1\", children: _jsx(MarkdownRenderer, { components: {\n a: ({ node, ...props }) => {\n const href = props.href || \"\";\n if (href.includes(\"/store/objects/\")) {\n return (_jsx(NavLink, { topLevelNav: true, href: href, className: \"text-info\", children: props.children }));\n }\n return _jsx(\"a\", { ...props, \"data-debug\": \"test\", target: \"_blank\", rel: \"noopener noreferrer\" });\n },\n p: ({ node, ...props }) => (_jsx(\"p\", { ...props, className: `my-0` })),\n pre: ({ node, ...props }) => (_jsx(\"pre\", { ...props, className: `my-2 p-2 rounded` })),\n code: ({ node, className, children, ...props }) => {\n const match = /language-(\\w+)/.exec(className || \"\");\n const isInline = !match;\n return (_jsx(\"code\", { ...props, className: isInline\n ? `px-1.5 py-0.5 rounded`\n : \"text-muted\", children: children }));\n },\n h1: ({ node, ...props }) => (_jsx(\"h1\", { ...props, className: `font-bold text-2xl my-2` })),\n h2: ({ node, ...props }) => (_jsx(\"h2\", { ...props, className: `font-bold text-xl my-2` })),\n h3: ({ node, ...props }) => (_jsx(\"h3\", { ...props, className: `font-bold text-lg my-2` })),\n li: ({ node, ...props }) => (_jsx(\"li\", { ...props })),\n }, children: text }) })) : (_jsx(\"pre\", { className: \"text-wrap bg-muted text-muted p-2\", children: text })) })] })) :\n _jsx(\"div\", { className: \"px-2\", children: _jsx(\"div\", { children: \"No content\" }) }));\n});\nfunction ImagePanel({ object }) {\n const { client } = useUserSession();\n const [imageUrl, setImageUrl] = useState();\n const content = object.content;\n const isImage = object.metadata && object.metadata.type === ContentNature.Image;\n useEffect(() => {\n if (isImage) {\n const loadImage = async () => {\n const webSupportedFormats = ['image/jpeg', 'image/jpg', 'image/png', 'image/gif', 'image/webp', 'image/svg+xml'];\n const isOriginalWebSupported = content?.type && webSupportedFormats.includes(content.type);\n try {\n const rendition = await client.objects.getRendition(object.id, {\n format: ImageRenditionFormat.jpeg,\n generate_if_missing: false,\n sign_url: true,\n });\n if (rendition.status === \"found\" && rendition.renditions?.length) {\n // Use rendition URL directly\n setImageUrl(rendition.renditions[0]);\n }\n else if (isOriginalWebSupported) {\n // Fall back to original file only if web-supported\n const downloadUrl = await client.files.getDownloadUrl(object.content.source);\n setImageUrl(downloadUrl.url);\n }\n }\n catch (error) {\n // Fall back to original file only if web-supported\n if (isOriginalWebSupported) {\n const downloadUrl = await client.files.getDownloadUrl(object.content.source);\n setImageUrl(downloadUrl.url);\n }\n }\n };\n loadImage();\n }\n }, []);\n return (_jsx(\"div\", { className: \"mb-4 px-2\", children: imageUrl ? (_jsx(\"img\", { src: imageUrl, alt: object.name, className: \"w-full object-contain\" })) : (_jsx(Spinner, { size: \"md\" })) }));\n}\nfunction VideoPanel({ object }) {\n const { client } = useUserSession();\n const [videoUrl, setVideoUrl] = useState();\n const [posterUrl, setPosterUrl] = useState();\n const [isLoading, setIsLoading] = useState(true);\n const content = object.content;\n const isVideo = object.metadata?.type === ContentNature.Video;\n // Check if there are mp4 or webm renditions available in metadata\n const metadata = object.metadata;\n const renditions = metadata?.renditions || [];\n // Find mp4 or webm rendition by mime type, preferring mp4\n const webRendition = renditions.find(r => r.content.type === 'video/mp4') ||\n renditions.find(r => r.content.type === 'video/webm');\n // Check if original file is web-compatible\n const webSupportedFormats = ['video/mp4', 'video/webm'];\n const isOriginalWebSupported = content?.type && webSupportedFormats.includes(content.type);\n // Get poster\n const poster = renditions.find(r => r.name === POSTER_RENDITION_NAME);\n useEffect(() => {\n const loadPoster = async () => {\n if (poster?.content?.source) {\n try {\n const response = await client.files.getDownloadUrl(poster.content.source);\n setPosterUrl(response.url);\n }\n catch (error) {\n console.error(\"Failed to load poster image\", error);\n }\n }\n };\n loadPoster();\n }, [poster, client]);\n useEffect(() => {\n if (isVideo && (webRendition?.content?.source || isOriginalWebSupported)) {\n const loadVideoUrl = async () => {\n try {\n let downloadUrl;\n if (webRendition?.content?.source) {\n // Use rendition if available\n downloadUrl = await client.files.getDownloadUrl(webRendition.content.source);\n }\n else if (isOriginalWebSupported && content?.source) {\n // Fall back to original file if web-supported\n downloadUrl = await client.files.getDownloadUrl(content.source);\n }\n if (downloadUrl) {\n setVideoUrl(downloadUrl.url);\n }\n }\n catch (error) {\n console.error(\"Failed to get video URL\", error);\n }\n finally {\n setIsLoading(false);\n }\n };\n loadVideoUrl();\n }\n else {\n setIsLoading(false);\n }\n }, [isVideo, webRendition, isOriginalWebSupported, content?.source, client]);\n return (_jsx(\"div\", { className: \"mb-4 px-2\", children: !webRendition && !isOriginalWebSupported ? (_jsx(\"div\", { className: \"flex justify-center items-center h-[400px] text-muted\", children: _jsxs(\"div\", { className: \"text-center\", children: [_jsx(\"p\", { children: \"No web-compatible video rendition available\" }), _jsx(\"p\", { className: \"text-sm mt-2\", children: \"MP4 or WebM format required\" })] }) })) : isLoading ? (_jsx(\"div\", { className: \"flex justify-center items-center h-[400px]\", children: _jsx(Spinner, { size: \"md\" }) })) : videoUrl ? (_jsx(\"video\", { src: videoUrl, poster: posterUrl, controls: true, className: \"w-full max-h-[calc(100vh-260px)] object-contain\", children: \"Your browser does not support the video tag.\" })) : (_jsx(\"div\", { className: \"flex justify-center items-center h-[400px] text-muted\", children: \"Failed to load video\" })) }));\n}\n//# sourceMappingURL=ContentOverview.js.map","export function shortId(id, length = 7) {\n if (!id) {\n return \"\";\n }\n return \"~\" + id.slice(-length);\n}\nexport function shortenString(str, length) {\n return str.length > length ? str.substring(0, length) + '...' : str;\n}\n//# sourceMappingURL=text.js.map","const CSV_PREFIX = 'text/csv';\nconst IMAGE_PREFIX = 'image/';\nconst PDF_PREFIX = 'application/pdf';\nconst VIDEO_PREFIX = 'video/';\nexport const isCsv = (type) => type === CSV_PREFIX || CSV_PREFIX.includes(type);\nexport const isImage = (type) => type.startsWith(IMAGE_PREFIX) || IMAGE_PREFIX.includes(type);\nexport const isPdf = (type) => type === PDF_PREFIX || PDF_PREFIX.includes(type);\nexport const isVideo = (type) => type.startsWith(VIDEO_PREFIX) || VIDEO_PREFIX.includes(type);\n//# sourceMappingURL=mimeType.js.map","import { isImage, isPdf, isVideo } from \"./mimeType.js\";\nimport { ImageRenditionFormat } from \"@vertesia/common\";\n//TODO we must use a setting in Env.\nconst env = import.meta.env;\nconst RENDITION_OPTIONS = {\n max_hw: env?.VITE_RENDITION_HW || 256,\n format: ImageRenditionFormat.jpeg,\n generate_if_missing: true,\n};\nconst RENDITION_ID = \"vertesia.content_store.renditionId\";\nexport async function retrieveRendition(client, doc, setRenditionUrl, setRenditionAlt, setRenditionStatus) {\n if (!doc?.content?.type ||\n !(isImage(doc.content.type) ||\n isVideo(doc.content.type) ||\n isPdf(doc.content.type))) {\n setRenditionStatus(\"No preview available\");\n return;\n }\n setRenditionStatus(\"Preparing preview...\");\n const currentTime = new Date().getTime() / 1000;\n const savedId = localStorage.getItem(`${RENDITION_ID}_${doc.id}_${RENDITION_OPTIONS.max_hw}`);\n const elapsedTime = localStorage.getItem(`${RENDITION_ID}_${doc.id}_${RENDITION_OPTIONS.max_hw}_time`);\n if (savedId?.length &&\n elapsedTime &&\n Math.abs(currentTime - parseInt(elapsedTime)) <= 900) {\n setRenditionUrl(savedId);\n setRenditionAlt(`${doc.name} Rendition`);\n setRenditionStatus(\"ready\");\n return savedId;\n }\n setRenditionStatus(\"Preparing preview...\");\n client.objects.getRendition(doc.id, RENDITION_OPTIONS).then((response) => {\n if (response.status === \"generating\") {\n setRenditionStatus(\"Preparing preview...\");\n setRenditionUrl(\"\");\n setRenditionAlt(\"\");\n setTimeout(() => retrieveRendition(client, doc, setRenditionUrl, setRenditionAlt, setRenditionStatus), 60000);\n }\n else if (response.status === \"failed\") {\n setRenditionStatus(\"No preview available\");\n setRenditionUrl(\"\");\n setRenditionAlt(\"\");\n return;\n }\n else {\n if (!response?.renditions?.length) {\n setRenditionStatus(\"No preview available\");\n setRenditionUrl(\"\");\n setRenditionAlt(\"\");\n return;\n }\n const rendition = response.renditions[0];\n localStorage.setItem(`${RENDITION_ID}_${doc.id}_${RENDITION_OPTIONS.max_hw}`, rendition);\n localStorage.setItem(`${RENDITION_ID}_${doc.id}_${RENDITION_OPTIONS.max_hw}_time`, (new Date().getTime() / 1000).toString());\n setRenditionUrl(rendition);\n setRenditionAlt(`${doc.name} Rendition`);\n setRenditionStatus(\"ready\");\n console.log(`Rendition for document ${doc.id} retrieved successfully: ${rendition}`);\n }\n }).catch((error) => {\n setRenditionStatus(\"No preview available\");\n console.warn(\"Failed to retrieve rendition:\", error);\n setRenditionUrl(\"\");\n setRenditionAlt(\"\");\n });\n}\n//# sourceMappingURL=rendition.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { useEffect, useState } from 'react';\nimport { retrieveRendition } from '../../../utils';\nimport { Button, Card, CardContent, Separator, VTooltip } from \"@vertesia/ui/core\";\nimport { useUserSession } from \"@vertesia/ui/session\";\nimport { Eye } from 'lucide-react';\nexport function DocumentIconSkeleton({ isLoading = false, counts = 6 }) {\n if (!isLoading) {\n return null;\n }\n return (_jsx(\"div\", { className: 'flex flex-wrap gap-2 justify-between', children: Array(counts).fill(0).map((_, index) => _jsx(\"div\", { className: \"w-[15vw] animate-pulse\", children: _jsxs(Card, { className: \"relative flex flex-col border h-fit\", children: [_jsx(\"div\", { className: \"h-48 bg-muted rounded-t-xl flex items-center justify-center text-muted\", children: \"\\u00A0\" }), _jsx(Separator, { className: 'bg-muted h-[2px]' }), _jsxs(CardContent, { className: \"p-2 flex flex-col\", children: [_jsxs(\"div\", { className: \"flex flex-col overflow-hidden\", children: [_jsx(\"div\", { className: \"h-5 bg-muted rounded w-3/4 mb-2\" }), _jsx(\"div\", { className: \"h-4 bg-muted rounded w-1/2\" })] }), _jsx(\"div\", { className: \"text-xs text-muted w-full flex justify-end mt-2\", children: _jsx(\"div\", { className: \"h-3 bg-muted rounded w-1/4\" }) })] })] }) }, index)) }));\n}\nexport function DocumentIcon({ selection, document, onSelectionChange, onRowClick, previewObject, selectedObject }) {\n const { client } = useUserSession();\n const [renditionUrl, setRenditionUrl] = useState(undefined);\n const [renditionAlt, setRenditionAlt] = useState(undefined);\n const [renditionStatus, setRenditionStatus] = useState(undefined);\n const handleSelect = (ev) => {\n ev.stopPropagation();\n onSelectionChange(document, ev);\n };\n useEffect(() => {\n if (!document?.content) {\n return;\n }\n retrieveRendition(client, document, setRenditionUrl, setRenditionAlt, setRenditionStatus);\n }, [document]);\n return (_jsxs(Card, { className: `relative flex flex-col border h-fit ${selectedObject?.id === document.id ? 'border-attention border-4' : ''}`, onClick: () => (onRowClick && onRowClick(document)), children: [selection && (_jsx(\"div\", { className: \"absolute top-2 left-2 z-10 flex flex-col items-center gap-1\", children: _jsx(\"input\", { checked: selection.isSelected(document.id), type: \"checkbox\", onChange: handleSelect, onClick: (e) => e.stopPropagation() }) })), _jsx(\"div\", { className: \"absolute top-1 right-1 z-10 flex flex-col items-center\", children: _jsx(Button, { variant: \"ghost\", size: \"sm\", title: \"Preivew Object\", onClick: (e) => {\n e.stopPropagation();\n previewObject?.(document.id);\n }, children: _jsx(Eye, { className: `size-4 ${renditionStatus === 'ready' ? 'text-muted' : 'text-white'}` }) }) }), (renditionUrl && renditionStatus == 'ready') ? (_jsx(\"img\", { src: renditionUrl, alt: renditionAlt, className: \"w-auto h-48 object-cover rounded-t-xl\" })) : (_jsx(\"div\", { className: \"h-48 bg-gray-700 rounded-t-xl flex items-center justify-center text-muted\", children: renditionStatus })), _jsx(Separator, { className: 'bg-gray-200 h-[2px]' }), _jsxs(CardContent, { className: \"p-2 flex flex-col\", children: [_jsxs(\"div\", { className: \"flex flex-col overflow-hidden\", children: [_jsx(VTooltip, { placement: 'top', description: document.properties?.title ?? document.name, children: _jsx(\"h3\", { className: \"text-start font-medium leading-none truncate\", children: document.properties?.title ?? document.name }) }), document?.type?.name ? (_jsx(VTooltip, { placement: 'bottom', size: 'xs', description: document?.type?.name, children: _jsx(\"p\", { className: \"text-start text-xs text-muted truncate\", children: document?.type?.name }) })) : _jsx(\"p\", { className: \"text-xs text-muted\", children: \"\\u2002\" })] }), document.score && (_jsxs(\"div\", { className: \"text-xs text-muted w-full flex justify-end\", children: [\"Score: \", (document.score).toFixed(4) ?? \"-\"] }))] })] }));\n}\n//# sourceMappingURL=DocumentIcon.js.map","export function facetOptionLabel(bucket) {\n return `${bucket._id} (${bucket.count})`;\n}\nexport function facetOptionNameLabel(bucket) {\n return `${bucket.name} (${bucket.count})`;\n}\n//# sourceMappingURL=utils.js.map","import { jsx as _jsx } from \"react/jsx-runtime\";\nimport { SelectBox } from '@vertesia/ui/core';\nimport { facetOptionLabel } from './utils';\nexport function StringFacet({ search, buckets, name, placeholder, className }) {\n const filterValue = search.getFilterValue(name);\n const onChange = (option) => {\n search.setFilterValue(name, option?._id);\n };\n const value = buckets?.find((option) => JSON.stringify(option._id) === JSON.stringify(filterValue));\n return (_jsx(SelectBox, { filterBy: \"_id\", className: className, isClearable: true, optionLabel: facetOptionLabel, options: buckets, value: value, onChange: onChange, by: '_id', placeholder: placeholder }));\n}\n//# sourceMappingURL=StringFacet.js.map","import { jsx as _jsx } from \"react/jsx-runtime\";\nimport { InputList } from '@vertesia/ui/core';\nimport { useEffect, useState } from 'react';\nexport function StringListFacet({ search, name, placeholder, className }) {\n const [tags, setTags] = useState([]);\n useEffect(() => {\n search.setFilterValue(name, tags);\n }, [tags]);\n return (_jsx(InputList, { className: className, value: tags, onChange: setTags, placeholder: placeholder }));\n}\n//# sourceMappingURL=StringListFacet.js.map","import { jsx as _jsx } from \"react/jsx-runtime\";\nimport { useUserSession } from \"@vertesia/ui/session\";\nimport { SelectBox } from \"@vertesia/ui/core\";\nimport { useEffect, useState } from \"react\";\nexport function facetOptionLabel(bucket) {\n return `${bucket.name} (${bucket.count})`;\n}\nexport function TypeFacet({ search, buckets, placeholder = \"Filter by Type\", className }) {\n const [options, setOptions] = useState([]);\n const { typeRegistry } = useUserSession();\n const filterValue = search.getFilterValue(\"type\");\n const onChange = (option) => {\n search.setFilterValue(\"type\", option?._id);\n };\n useEffect(() => {\n if (typeRegistry) {\n const options = buckets.map((bucket) => {\n let name;\n if (bucket._id == null) {\n bucket._id = \"Document\";\n name = \"Document\";\n }\n else {\n name = typeRegistry.getTypeName(bucket._id);\n if (!name) {\n console.warn(\"Content Object Type not found\", bucket._id);\n name = bucket._id;\n }\n }\n return {\n ...bucket,\n name\n };\n });\n options.sort((a, b) => a.name.localeCompare(b.name));\n setOptions(options);\n }\n }, [buckets, typeRegistry]);\n const value = options?.find((option) => option._id === filterValue);\n return (_jsx(SelectBox, { filterBy: \"name\", className: className, isClearable: true, optionLabel: facetOptionLabel, options: options, value: value, onChange: onChange, by: '_id', placeholder: placeholder }));\n}\n//# sourceMappingURL=TypeFacet.js.map","import { facetOptionLabel } from './utils';\nexport function createStringFilterGroup({ buckets, name, placeholder, type = 'select', multiple = false }) {\n const options = buckets.map((bucket) => ({\n label: facetOptionLabel(bucket),\n value: bucket._id\n }));\n const filterGroup = {\n name: name,\n options: options,\n type: type,\n multiple: multiple,\n placeholder: `${placeholder ?? `${name.charAt(0).toUpperCase() + name.slice(1)}`}`,\n ...({ allowCreate: false })\n };\n return filterGroup;\n}\nexport function VStringFacet({ buckets, name, placeholder, type, multiple }) {\n return createStringFilterGroup({ buckets, name, placeholder, type, multiple });\n}\n//# sourceMappingURL=VStringFacet.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nexport function VTypeFacet({ buckets, typeRegistry, type = 'select', multiple = false }) {\n // Create a map for quick lookups of type names and counts\n const typeDataMap = new Map();\n if (!typeRegistry) {\n console.warn(\"Type names cannot be resolved\");\n }\n buckets.forEach((bucket) => {\n let name;\n let typeId = bucket._id;\n if (bucket._id == null) {\n typeId = \"Document\";\n name = \"Document\";\n }\n else {\n name = typeRegistry?.getTypeName(bucket._id);\n if (!name) {\n console.warn(\"Content Object Type not found\", bucket._id);\n name = bucket._id;\n }\n }\n typeDataMap.set(typeId, {\n name,\n count: bucket.count\n });\n });\n const options = buckets.map((bucket) => {\n const actualId = bucket._id;\n const displayKey = actualId || \"Document\";\n const typeData = typeDataMap.get(displayKey);\n return {\n value: actualId,\n label: typeData ? `${typeData.name} (${typeData.count})` : `Unknown (${bucket.count})`\n };\n });\n const customFilterGroups = {\n name: 'types',\n placeholder: 'Types',\n type: type,\n multiple: multiple,\n options: options,\n labelRenderer: (typeId) => {\n const typeData = typeDataMap.get(typeId);\n if (!typeData) {\n console.warn(`Type data not found for ${typeId}`);\n return typeId;\n }\n return (_jsxs(\"div\", { className: \"w-full flex items-center\", children: [_jsx(\"span\", { className: \"text-sm truncate\", children: typeData.name }), _jsxs(\"span\", { className: \"ml-2 text-xs\", children: [\"(\", typeData.count, \")\"] })] }));\n },\n filterBy: (optionValue, searchText) => {\n const typeData = typeDataMap.get(optionValue);\n if (!typeData) {\n console.warn(`Type name not found for ${optionValue}`);\n return false;\n }\n return typeData.name.toLowerCase().includes(searchText.toLowerCase());\n }\n };\n return customFilterGroups;\n}\n//# sourceMappingURL=VTypeFacet.js.map","import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from \"react/jsx-runtime\";\nimport { useUserSession } from \"@vertesia/ui/session\";\nimport { PrincipalType } from \"@vertesia/common\";\nimport { Avatar, Table, Popover, PopoverContent, PopoverTrigger, useFetch } from \"@vertesia/ui/core\";\nimport { Users } from \"lucide-react\";\n//TODO use a real cache\nconst USER_CACHE = {};\nconst GROUP_CACHE = {};\n/**\n * Fetch the user information given a user reference.\n * The reference has the format: `type:id`. A special reference `system` is used to refer to the system user.\n * @param userRef\n */\nexport function useFetchUserInfo(userId) {\n const { client } = useUserSession();\n return useFetch(() => {\n let user = USER_CACHE[userId];\n if (!user) {\n user = client.users.retrieve(userId).then(user => {\n return user;\n });\n USER_CACHE[userId] = user;\n }\n return user;\n }, [userId]);\n}\n/**\n * Fetch the group information given a group ID.\n * @param groupId\n */\nexport function useFetchGroupInfo(groupId) {\n const { client } = useUserSession();\n return useFetch(() => {\n let group = GROUP_CACHE[groupId];\n if (!group) {\n group = client.iam.groups.retrieve(groupId).then(group => {\n return group;\n });\n GROUP_CACHE[groupId] = group;\n }\n return group;\n }, [groupId]);\n}\nfunction AvatarPlaceholder() {\n return _jsx(\"div\", { className: 'size-8' });\n}\nfunction SystemAvatar({ showTitle = false, size = \"md\" }) {\n return (_jsx(UserPopoverPanel, { title: \"System User\", description: \"The system user is used to initialize built-in objects.\", children: _jsxs(\"div\", { className: \"flex gap-2 items-center\", children: [_jsx(Avatar, { src: \"/icon.svg\", size: size }), showTitle && _jsx(\"div\", { className: \"text-sm font-semibold pl-2\", children: \"System User\" })] }) }));\n}\nfunction ServiceAccountAvatar({ accountId, showTitle = false, size = \"md\" }) {\n const description = (_jsxs(_Fragment, { children: [_jsx(\"div\", { children: \"This user is used by robots like workflow workers.\" }), _jsxs(\"div\", { className: \"text-gray-800 dark:text-gray-500 text-sm\", children: [_jsx(\"span\", { className: \"font-semibold\", children: \"ID:\" }), \" \", accountId] })] }));\n return (_jsx(UserPopoverPanel, { title: \"Service Account\", description: description, children: _jsxs(\"div\", { className: \"flex flex-row items-center gap-2\", children: [_jsx(Avatar, { src: \"/cloud.svg\", name: \"SA\", color: \"bg-amber-500\", className: \"px-[5px] text-white\", size: size }), showTitle && _jsxs(\"div\", { className: \"text-sm font-semibold pl-2 truncate\", children: [\"Service Account : \", accountId] })] }) }));\n}\nfunction ErrorAvatar({ title = \"Error\", error, showTitle = false, size = \"md\" }) {\n return (_jsx(UnknownAvatar, { title: title, message: typeof error === 'string' ? error : error.message, color: \"bg-red-500\", showTitle: showTitle, size: size }));\n}\nexport function UserInfo({ userRef, showTitle = false, size = \"md\" }) {\n if (!userRef) {\n return _jsx(UnknownAvatar, { title: \"Unknown User\", message: \"User information is not available.\", showTitle: showTitle, size: size });\n }\n const [type, id] = userRef ? userRef.split(':') : [\"unknown\"];\n switch (type) {\n case PrincipalType.User:\n return _jsx(UserAvatar, { userId: id, showTitle: showTitle, size: size });\n case PrincipalType.Group:\n return _jsx(GroupAvatar, { userId: id, showTitle: showTitle, size: size });\n case \"system\":\n return _jsx(SystemAvatar, { showTitle: showTitle, size: size });\n case PrincipalType.ServiceAccount:\n return _jsx(ServiceAccountAvatar, { accountId: id, showTitle: showTitle, size: size });\n case PrincipalType.Agent:\n return _jsx(ServiceAccountAvatar, { accountId: id, showTitle: showTitle, size: size });\n case PrincipalType.ApiKey:\n return _jsx(ApiKeyAvatar, { keyId: id, size: size, showTitle: showTitle });\n default:\n return _jsx(ErrorAvatar, { title: \"Unknown User\", error: `Invalid user ref type: ${type}`, showTitle: showTitle, size: size });\n }\n}\nfunction UnknownAvatar({ title, message, color, size = \"md\", showTitle = false }) {\n return (_jsx(UserPopoverPanel, { title: title, description: message, children: _jsxs(\"div\", { className: \"flex flex-row items-center gap-2\", children: [_jsx(Avatar, { color: color, size: size }), showTitle && _jsx(\"div\", { className: \"text-sm font-semibold pl-1\", children: title })] }) }));\n}\nfunction GroupAvatar({ userId, showTitle = false, size = \"md\" }) {\n const { data: group, error } = useFetchGroupInfo(userId);\n if (error) {\n return _jsx(ErrorAvatar, { title: \"Failed to fetch group\", error: error, showTitle: showTitle, size: size });\n }\n if (!group) {\n return _jsx(AvatarPlaceholder, {});\n }\n const description = (_jsxs(\"div\", { className: \"space-y-1\", children: [group.description && _jsx(\"div\", { className: \"text-sm\", children: group.description }), _jsxs(\"div\", { className: \"text-xs text-muted-foreground\", children: [\"Group ID: \", group.id] }), group.tags && group.tags.length > 0 && (_jsx(\"div\", { className: \"flex flex-wrap gap-1\", children: group.tags.map(tag => (_jsx(\"span\", { className: \"px-1.5 py-0.5 bg-muted rounded text-xs\", children: tag }, tag))) }))] }));\n return (_jsx(UserPopoverPanel, { title: group.name || \"Unnamed Group\", description: description, children: _jsxs(\"div\", { className: \"flex flex-row items-center gap-2\", children: [_jsx(Users, { className: \"size-6 text-indigo-500\", size: size }), showTitle && _jsx(\"div\", { className: \"text-sm font-semibold pl-2\", children: group.name || \"Unnamed Group\" })] }) }));\n}\nfunction UserAvatar({ userId, showTitle = false, size = \"md\" }) {\n const { data: user, error } = useFetchUserInfo(userId);\n if (error) {\n return _jsx(ErrorAvatar, { title: \"Failed to fetch user\", error: error, showTitle: showTitle, size: size });\n }\n if (!user) {\n return _jsx(AvatarPlaceholder, {});\n }\n const description = (_jsx(\"div\", { className: \"truncate\", title: user.email, children: user.email }));\n return (_jsx(UserPopoverPanel, { title: user.name || user.email || user.username || \"unknown\", description: description, children: _jsxs(\"div\", { className: \"flex flex-row items-center gap-2\", children: [_jsx(Avatar, { src: user.picture, name: user.name, color: \"bg-indigo-500\", size: size }), showTitle && _jsx(\"div\", { className: \"text-sm font-semibold pl-2\", children: user.name || user.email || user.username || \"unknown\" })] }) }));\n}\nexport function ApiKeyAvatar({ keyId, showTitle = false, size = \"md\" }) {\n const { client } = useUserSession();\n const { data, error } = useFetch(() => client.apikeys.retrieve(keyId), []);\n if (error) {\n return _jsx(ErrorAvatar, { title: \"Failed to fetch the apikey\", error: error, showTitle: showTitle, size: size });\n }\n if (!data) {\n return _jsx(AvatarPlaceholder, {});\n }\n const title = \"Private Key\";\n const avatar = _jsx(Avatar, { name: \"PK\", color: \"bg-pink-500\", size: size });\n const description = (_jsxs(Table, { className: \"dark:bg-gray-800 dark:text-gray-200 table-fixed w-full\", children: [_jsxs(\"tr\", { children: [_jsx(\"td\", { className: \"font-semibold w-20\", children: \"Key:\" }), _jsx(\"td\", { className: \"truncate max-w-0\", children: data?.name })] }), _jsxs(\"tr\", { children: [_jsx(\"td\", { className: \"font-semibold w-20\", children: \"Account:\" }), _jsx(\"td\", { className: \"truncate max-w-0\", children: data?.account })] }), _jsxs(\"tr\", { children: [_jsx(\"td\", { className: \"font-semibold w-20\", children: \"Project:\" }), _jsx(\"td\", { className: \"truncate max-w-0\", children: data?.project.name })] })] }));\n return (_jsx(UserPopoverPanel, { title: title, description: description, children: _jsxs(\"div\", { className: \"flex flex-row items-center gap-2\", children: [avatar, showTitle && _jsx(\"div\", { className: \"text-sm font-semibold\", children: data?.name || data?.account || data?.project.name || \"unknown\" })] }) }));\n}\nfunction UserPopoverPanel({ title, description, children }) {\n return (_jsxs(Popover, { hover: true, children: [_jsx(PopoverTrigger, { className: \"cursor-pointer flex items-center inline-block\", children: _jsx(\"div\", { children: children }) }), _jsx(PopoverContent, { align: \"center\", sideOffset: 8, side: \"right\", children: _jsxs(\"div\", { className: \"flex flex-col gap-1 rounded-md shadow-md p-2\", children: [_jsx(\"div\", { className: 'text-md font-semibold', children: title }), description] }) })] }));\n}\n//# sourceMappingURL=UserInfo.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { UserInfo } from '../../user/UserInfo';\nexport function createUserFilterGroup({ buckets, name, placeholder }) {\n const options = buckets.map((bucket) => {\n return {\n value: bucket._id,\n label: `(${bucket.count})`\n };\n });\n const filterGroup = {\n name: name,\n placeholder: placeholder || `${name.charAt(0).toUpperCase() + name.slice(1)}`,\n options: options,\n labelRenderer: (userRef) => {\n const isUnknownUser = userRef === 'Unknown User' || !userRef;\n if (isUnknownUser) {\n // Find the count for this user from buckets\n const bucket = buckets.find(b => b._id === userRef);\n return `Unknown User (${bucket?.count || 0})`;\n }\n // For known users, render UserInfo with count\n const bucket = buckets.find(b => b._id === userRef);\n return (_jsxs(\"div\", { className: \"flex items-center w-full gap-2\", children: [_jsx(\"div\", { className: \"flex-1 min-w-0 flex items-center truncate\", children: _jsx(UserInfo, { userRef: userRef, showTitle: true, size: \"sm\" }) }), _jsxs(\"span\", { className: \"text-muted-foreground flex-shrink-0\", children: [\"(\", bucket?.count || 0, \")\"] })] }));\n },\n };\n return filterGroup;\n}\nexport function VUserFacet({ buckets, name, placeholder }) {\n return createUserFilterGroup({ buckets, name, placeholder });\n}\n//# sourceMappingURL=VUserFacet.js.map","import { jsx as _jsx } from \"react/jsx-runtime\";\nimport { useEffect, useState } from 'react';\nimport { SelectBox } from '@vertesia/ui/core';\nimport { useUserSession } from '@vertesia/ui/session';\nimport { facetOptionNameLabel } from './utils/utils';\nexport function EnvironmentFacet({ search, buckets, placeholder = \"All Environments\", className }) {\n const { client } = useUserSession();\n const [options, setOptions] = useState([]);\n const filterValue = search.getFilterValue(\"environment\");\n const onChange = (option) => {\n search.setFilterValue(\"environment\", option?._id);\n };\n useEffect(() => {\n if (client) {\n const options = buckets.map(async (bucket) => {\n let name;\n await client.environments.retrieve(bucket._id).then((environment) => {\n name = environment.name;\n }).catch(() => {\n name = `${bucket._id} (deleted)`;\n });\n if (!name) {\n name = bucket._id;\n }\n return {\n ...bucket,\n name\n };\n });\n Promise.all(options).then(resolvedOptions => {\n resolvedOptions.sort((a, b) => a.name.localeCompare(b.name));\n setOptions(resolvedOptions);\n });\n }\n }, [buckets, client]);\n const value = options?.find((option) => option._id === filterValue);\n return (_jsx(SelectBox, { filterBy: \"name\", className: className, isClearable: true, optionLabel: facetOptionNameLabel, options: options, value: value, onChange: onChange, by: '_id', placeholder: placeholder }));\n}\n//# sourceMappingURL=EnvironmentFacet.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { Button, FilterProvider, FilterBtn, FilterBar, FilterClear } from '@vertesia/ui/core';\nimport { useState } from 'react';\nimport { VEnvironmentFacet } from './utils/VEnvironmentFacet';\nimport { VInteractionFacet } from './utils/VInteractionFacet';\nimport { VStringFacet } from './utils/VStringFacet';\nimport { VUserFacet } from './utils/VUserFacet';\nimport { RefreshCw } from 'lucide-react';\n// Hook to create filter groups for runs\nexport function useRunsFilterGroups(facets) {\n const customFilterGroups = [];\n const runIdFilterGroup = {\n name: 'run_ids',\n placeholder: 'Run ID',\n type: 'text',\n multiple: false\n };\n customFilterGroups.push(runIdFilterGroup);\n if (facets.interactions) {\n const interactionFilterGroup = VInteractionFacet({\n buckets: facets.interactions || [],\n name: 'interaction',\n placeholder: 'Interactions',\n });\n customFilterGroups.push(interactionFilterGroup);\n }\n if (facets.environments) {\n const environmentFilterGroup = VEnvironmentFacet({\n buckets: facets.environments || [],\n name: 'environments',\n });\n customFilterGroups.push(environmentFilterGroup);\n }\n // Add tags filter as stringList type (allows custom input)\n const tagsFilterGroup = {\n name: 'tags',\n placeholder: 'Tags',\n type: 'stringList',\n multiple: true\n };\n customFilterGroups.push(tagsFilterGroup);\n if (facets.models) {\n const modelFilterGroup = VStringFacet({\n search: null, // This will be provided by the search context\n buckets: facets.models || [],\n name: 'model'\n });\n customFilterGroups.push(modelFilterGroup);\n }\n if (facets.statuses) {\n const statusFilterGroup = VStringFacet({\n search: null, // This will be provided by the search context\n buckets: facets.statuses || [],\n name: 'status'\n });\n customFilterGroups.push(statusFilterGroup);\n }\n if (facets.finish_reason) {\n const processedFinishReason = facets.finish_reason.map((bucket) => ({\n ...bucket,\n _id: bucket._id === null ? 'none' : bucket._id\n }));\n const finishReasonFilterGroup = VStringFacet({\n search: null, // This will be provided by the search context\n buckets: processedFinishReason,\n name: 'finish_reason',\n placeholder: 'Finish Reason'\n });\n customFilterGroups.push(finishReasonFilterGroup);\n }\n if (facets.created_by) {\n const createdByFilterGroup = VUserFacet({\n buckets: facets.created_by || [],\n name: 'created_by',\n placeholder: 'Created By'\n });\n customFilterGroups.push(createdByFilterGroup);\n }\n const dateAfterFilterGroup = {\n name: 'start',\n placeholder: 'Date After',\n type: 'date',\n multiple: false\n };\n customFilterGroups.push(dateAfterFilterGroup);\n const dateBeforeFilterGroup = {\n name: 'end',\n placeholder: 'Date Before',\n type: 'date',\n multiple: false\n };\n customFilterGroups.push(dateBeforeFilterGroup);\n const workflowRunIdFilterGroup = {\n name: 'workflow_run_ids',\n placeholder: 'Workflow Run ID',\n type: 'text',\n multiple: false\n };\n customFilterGroups.push(workflowRunIdFilterGroup);\n return customFilterGroups;\n}\n// Hook to create filter change handler for runs\nexport function useRunsFilterHandler(search) {\n return (newFilters) => {\n if (newFilters.length === 0) {\n // Clear filters without applying defaults - user wants to remove all filters\n search.clearFilters(true, false);\n return;\n }\n // Clear all filters first without defaults, then apply new ones\n search.clearFilters(false, false);\n newFilters.forEach(filter => {\n if (filter.value && filter.value.length > 0) {\n const filterName = filter.name;\n let filterValue;\n if (filter.type === 'stringList') {\n filterValue = filter.value.map(v => typeof v === 'string' ? v : v.value);\n }\n else if (filter.multiple) {\n filterValue = Array.isArray(filter.value)\n ? filter.value.map((v) => typeof v === 'object' && v.value ? v.value : v)\n : [typeof filter.value === 'object' && filter.value.value ? filter.value.value : filter.value];\n }\n else {\n // Single value - don't wrap in array\n filterValue = Array.isArray(filter.value) && filter.value[0] && typeof filter.value[0] === 'object'\n ? filter.value[0].value\n : Array.isArray(filter.value) && filter.value[0]\n ? filter.value[0]\n : filter.value;\n }\n // Force array format for backend fields that expect arrays\n if ((filterName === 'run_ids' || filterName === 'workflow_run_ids') && !Array.isArray(filterValue)) {\n filterValue = [filterValue];\n }\n search.query[filterName] = filterValue;\n }\n });\n search.search();\n };\n}\n// Legacy component for backward compatibility\nexport function RunsFacetsNav({ facets, search }) {\n const [filters, setFilters] = useState([]);\n const filterGroups = useRunsFilterGroups(facets);\n const handleFilterLogic = useRunsFilterHandler(search);\n const handleFilterChange = (value) => {\n const newFilters = typeof value === 'function' ? value(filters) : value;\n setFilters(newFilters);\n handleFilterLogic(newFilters);\n };\n const handleRefetch = () => {\n search.search();\n };\n return (_jsxs(FilterProvider, { filterGroups: filterGroups, filters: filters, setFilters: handleFilterChange, children: [_jsxs(\"div\", { className: 'flex justify-between mb-1', children: [_jsx(FilterBtn, {}), _jsx(Button, { onClick: handleRefetch, variant: 'outline', title: \"Refresh\", children: _jsx(RefreshCw, { className: \"size-5\" }) })] }), _jsxs(\"div\", { className: 'flex gap-2 items-center', children: [_jsx(FilterBar, {}), _jsx(FilterClear, {})] })] }));\n}\n//# sourceMappingURL=RunsFacetsNav.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { InteractionStatus } from '@vertesia/common';\nimport { Badge } from '@vertesia/ui/core';\nexport function VInteractionFacet({ buckets, name, placeholder }) {\n const options = buckets.map((bucket) => ({\n label: `(${bucket.count})`,\n value: bucket._id\n }));\n const filterGroup = {\n name: name,\n placeholder: placeholder || `${name.charAt(0).toUpperCase() + name.slice(1)}`,\n options: options,\n type: \"select\",\n labelRenderer: (interactionId) => {\n const bucket = buckets.find(b => b._id === interactionId);\n const displayName = bucket?.name || interactionId;\n // Determine badge variant based on status\n let badgeVariant = \"success\";\n if (bucket?.status) {\n switch (bucket.status) {\n case InteractionStatus.published:\n badgeVariant = \"success\";\n break;\n case InteractionStatus.archived:\n badgeVariant = \"destructive\";\n break;\n default:\n badgeVariant = \"attention\";\n break;\n }\n }\n const badgeText = bucket?.version && bucket?.status ?\n `v${bucket.version} ${bucket.status}` :\n bucket?.status || (bucket?.version ? `v${bucket.version}` : '');\n return (_jsxs(\"div\", { className: \"w-full flex items-center justify-between\", children: [_jsxs(\"div\", { className: \"flex flex-row flex-wrap items-center gap-2 min-w-0 flex-1\", children: [_jsx(\"span\", { className: \"text-sm truncate\", children: displayName }), badgeText && (_jsx(Badge, { variant: badgeVariant, className: \"text-xs w-fit\", children: badgeText }))] }), _jsxs(\"span\", { className: \"ml-2 text-xs shrink-0\", children: [\"(\", bucket?.count || 0, \")\"] })] }));\n },\n filterBy: (optionValue, searchText) => {\n const bucket = buckets.find(b => b._id === optionValue);\n const searchName = bucket?.name || optionValue;\n return searchName.toLowerCase().includes(searchText.toLowerCase());\n }\n };\n return filterGroup;\n}\n//# sourceMappingURL=VInteractionFacet.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nexport function VEnvironmentFacet({ buckets, name }) {\n const options = buckets.map((bucket) => ({\n label: `(${bucket.count})`,\n value: bucket._id\n }));\n const filterGroup = {\n name: name.charAt(0).toUpperCase() + name.slice(1),\n options: options,\n type: \"select\",\n labelRenderer: (environmentId) => {\n const bucket = buckets.find(b => b._id === environmentId);\n const displayName = bucket?.name || environmentId;\n return (_jsxs(\"div\", { className: \"w-full flex items-center\", children: [_jsx(\"span\", { className: \"text-sm truncate\", children: displayName }), _jsxs(\"span\", { className: \"ml-2 text-xs\", children: [\"(\", bucket?.count || 0, \")\"] })] }));\n },\n filterBy: (optionValue, searchText) => {\n const bucket = buckets.find(b => b._id === optionValue);\n const searchName = bucket?.name || optionValue;\n return searchName.toLowerCase().includes(searchText.toLowerCase());\n }\n };\n return filterGroup;\n}\n//# sourceMappingURL=VEnvironmentFacet.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { FilterProvider, FilterBtn, FilterBar, FilterClear } from '@vertesia/ui/core';\nimport { useState } from 'react';\nimport { VStringFacet } from './utils/VStringFacet';\nimport { VUserFacet } from './utils/VUserFacet';\n// Hook to create filter groups for workflow executions\nexport function useWorkflowExecutionsFilterGroups(facets) {\n const customFilterGroups = [];\n customFilterGroups.push({\n placeholder: 'Workflow or Run ID',\n name: 'name',\n type: 'text',\n options: [],\n });\n if (facets.status) {\n const statusFilterGroup = VStringFacet({\n search: null, // This will be provided by the search context\n buckets: facets.status || [],\n name: 'status',\n placeholder: 'Status'\n });\n customFilterGroups.push(statusFilterGroup);\n }\n if (facets.initiated_by) {\n const initiatedByFilterGroup = VUserFacet({\n buckets: facets.initiated_by || [],\n name: 'initiated_by',\n placeholder: 'Initiated By'\n });\n customFilterGroups.push(initiatedByFilterGroup);\n }\n const dateAfterFilterGroup = {\n name: 'start',\n placeholder: 'Date After',\n type: 'date',\n multiple: false\n };\n customFilterGroups.push(dateAfterFilterGroup);\n const dateBeforeFilterGroup = {\n name: 'end',\n placeholder: 'Date Before',\n type: 'date',\n multiple: false\n };\n customFilterGroups.push(dateBeforeFilterGroup);\n return customFilterGroups;\n}\n// Hook to create filter change handler for workflow executions\nexport function useWorkflowExecutionsFilterHandler(search) {\n return (newFilters) => {\n if (newFilters.length === 0) {\n search.clearFilters();\n return;\n }\n search.clearFilters(false);\n newFilters.forEach(filter => {\n if (filter.value && filter.value.length > 0) {\n const filterName = filter.name;\n let filterValue;\n if (filter.type === 'stringList') {\n filterValue = filter.value.map(v => typeof v === 'string' ? v : v.value);\n }\n else if (filter.multiple) {\n filterValue = Array.isArray(filter.value)\n ? filter.value.map((v) => typeof v === 'object' && v.value ? v.value : v)\n : [typeof filter.value === 'object' && filter.value.value ? filter.value.value : filter.value];\n }\n else {\n // Single value - don't wrap in array\n filterValue = Array.isArray(filter.value) && filter.value[0] && typeof filter.value[0] === 'object'\n ? filter.value[0].value\n : Array.isArray(filter.value) && filter.value[0]\n ? filter.value[0]\n : filter.value;\n }\n if (filterName === 'name') {\n search.query.search_term = filterValue;\n search.query.name = filterValue;\n }\n else {\n search.query[filterName] = filterValue;\n }\n }\n });\n search.search();\n };\n}\n// Legacy component for backward compatibility\nexport function WorkflowExecutionsFacetsNav({ facets, search, }) {\n const [filters, setFilters] = useState([]);\n const filterGroups = useWorkflowExecutionsFilterGroups(facets);\n const handleFilterLogic = useWorkflowExecutionsFilterHandler(search);\n const handleFilterChange = (value) => {\n const newFilters = typeof value === 'function' ? value(filters) : value;\n setFilters(newFilters);\n handleFilterLogic(newFilters);\n };\n return (_jsx(FilterProvider, { filterGroups: filterGroups, filters: filters, setFilters: handleFilterChange, children: _jsxs(\"div\", { className: \"flex gap-2 items-center\", children: [_jsx(FilterBtn, {}), _jsx(FilterBar, {}), _jsx(FilterClear, {})] }) }));\n}\n//# sourceMappingURL=WorkflowExecutionsFacetsNav.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { FilterProvider, FilterBtn, FilterBar, FilterClear } from '@vertesia/ui/core';\nimport { useUserSession } from '@vertesia/ui/session';\nimport { useState } from 'react';\nimport { VStringFacet } from './utils/VStringFacet';\nimport { VTypeFacet } from './utils/VTypeFacet';\n// Hook to create filter groups for documents\nexport function useDocumentFilterGroups(facets) {\n const { typeRegistry } = useUserSession();\n const customFilterGroups = [];\n customFilterGroups.push({\n placeholder: 'ID',\n name: 'id',\n type: 'text',\n options: [],\n });\n customFilterGroups.push({\n placeholder: 'Name',\n name: 'name',\n type: 'text',\n options: [],\n });\n if (facets.type) {\n const typeFilterGroup = VTypeFacet({\n buckets: facets.type || [],\n typeRegistry: typeRegistry,\n type: 'select',\n multiple: true\n });\n customFilterGroups.push(typeFilterGroup);\n }\n if (facets.status) {\n const statusFilterGroup = VStringFacet({\n search: null, // This will be provided by the search context\n buckets: facets.status || [],\n name: 'status',\n placeholder: 'Status',\n type: 'select',\n multiple: true\n });\n customFilterGroups.push(statusFilterGroup);\n }\n if (facets.tags) {\n customFilterGroups.push({\n name: 'tags',\n placeholder: 'Tags',\n type: 'stringList',\n options: facets.tags.map((tag) => ({\n label: tag,\n value: tag\n }))\n });\n }\n customFilterGroups.push({\n name: 'created_at',\n placeholder: 'Created Date',\n type: 'date',\n multiple: true,\n options: []\n });\n customFilterGroups.push({\n name: 'updated_at',\n placeholder: 'Updated Date',\n type: 'date',\n multiple: true,\n options: []\n });\n return customFilterGroups;\n}\n// Hook to create filter change handler for documents\nexport function useDocumentFilterHandler(search) {\n return (newFilters) => {\n if (newFilters.length === 0) {\n search.clearFilters();\n return;\n }\n search.clearFilters(false);\n newFilters.forEach(filter => {\n if (filter.value && filter.value.length > 0) {\n const filterName = filter.name;\n let filterValue;\n if (filter.type === 'date' && filter.multiple) {\n // Handle date range filters\n if (Array.isArray(filter.value) && filter.value.length > 0) {\n if (filter.value.length === 1) {\n // Single date - use as both start and end\n const dateValue = typeof filter.value[0] === 'object' ? filter.value[0].value : filter.value[0];\n filterValue = {\n gte: dateValue,\n lte: dateValue\n };\n }\n else if (filter.value.length === 2) {\n // Date range - start and end dates\n const startDate = typeof filter.value[0] === 'object' ? filter.value[0].value : filter.value[0];\n const endDate = typeof filter.value[1] === 'object' ? filter.value[1].value : filter.value[1];\n filterValue = {\n gte: startDate,\n lte: endDate\n };\n }\n }\n }\n else if (filter.multiple) {\n if (Array.isArray(filter.value)) {\n filterValue = filter.value.map((v) => typeof v === 'object' && v.value ? v.value : v);\n }\n else {\n const singleValue = typeof filter.value === 'object' && filter.value.value ? filter.value.value : filter.value;\n filterValue = [singleValue];\n }\n }\n else {\n // Single value - don't wrap in array\n filterValue = Array.isArray(filter.value) && filter.value[0] && typeof filter.value[0] === 'object'\n ? filter.value[0].value\n : Array.isArray(filter.value) && filter.value[0]\n ? filter.value[0]\n : filter.value;\n }\n if (filterName === 'name') {\n search.query.name = filterValue;\n }\n else if (filterName === 'id') {\n search.query.id = filterValue;\n }\n else {\n search.query[filterName] = filterValue;\n }\n }\n });\n search.search();\n };\n}\n// Legacy component for backward compatibility\nexport function DocumentsFacetsNav({ facets, search, }) {\n const [filters, setFilters] = useState([]);\n const filterGroups = useDocumentFilterGroups(facets);\n const handleFilterLogic = useDocumentFilterHandler(search);\n const handleFilterChange = (value) => {\n const newFilters = typeof value === 'function' ? value(filters) : value;\n setFilters(newFilters);\n handleFilterLogic(newFilters);\n };\n return (_jsx(FilterProvider, { filterGroups: filterGroups, filters: filters, setFilters: handleFilterChange, children: _jsxs(\"div\", { className: \"flex gap-2 items-center\", children: [_jsx(FilterBtn, {}), _jsx(FilterBar, {}), _jsx(FilterClear, {})] }) }));\n}\n//# sourceMappingURL=DocumentsFacetsNav.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { FilterProvider, FilterBtn, FilterBar, FilterClear } from '@vertesia/ui/core';\nimport { useState } from 'react';\n// Hook to create filter groups for interactions\nexport function useInteractionsFilterGroups(facets) {\n void facets;\n const customFilterGroups = [];\n // Add name filter as string type\n const nameFilterGroup = {\n name: 'name',\n placeholder: 'Name',\n type: 'text',\n multiple: false\n };\n customFilterGroups.push(nameFilterGroup);\n // Add prompt name filter as string type\n const promptNameFilterGroup = {\n name: 'prompt',\n placeholder: 'Prompt Name',\n type: 'text',\n multiple: false\n };\n customFilterGroups.push(promptNameFilterGroup);\n const ModelFilterGroup = {\n name: 'model',\n placeholder: 'Model',\n type: 'text',\n multiple: false\n };\n customFilterGroups.push(ModelFilterGroup);\n // Add tags filter as stringList type (allows custom input)\n const tagsFilterGroup = {\n name: 'tags',\n placeholder: 'Tags',\n type: 'stringList',\n multiple: true\n };\n customFilterGroups.push(tagsFilterGroup);\n return customFilterGroups;\n}\n// Hook to create filter change handler for interactions\nexport function useInteractionsFilterHandler(search) {\n return (newFilters) => {\n if (newFilters.length === 0) {\n search.clearFilters(true, true);\n return;\n }\n // Clear all filters first without defaults, then apply new ones\n search.clearFilters(false, false);\n newFilters.forEach(filter => {\n if (filter.value && filter.value.length > 0) {\n const filterName = filter.name;\n let filterValue;\n if (filter.type === 'stringList') {\n filterValue = filter.value.map(v => typeof v === 'string' ? v : v.value);\n }\n else if (filter.multiple) {\n filterValue = Array.isArray(filter.value)\n ? filter.value.map((v) => typeof v === 'object' && v.value ? v.value : v)\n : [typeof filter.value === 'object' && filter.value.value ? filter.value.value : filter.value];\n }\n else {\n // Single value - don't wrap in array\n filterValue = Array.isArray(filter.value) && filter.value[0] && typeof filter.value[0] === 'object'\n ? filter.value[0].value\n : Array.isArray(filter.value) && filter.value[0]\n ? filter.value[0]\n : filter.value;\n }\n search.query[filterName] = filterValue;\n }\n });\n search.search(true);\n };\n}\n// Component for interactions filtering\nexport function InteractionsFacetsNav({ facets, search }) {\n const [filters, setFilters] = useState([]);\n const filterGroups = useInteractionsFilterGroups(facets);\n const handleFilterLogic = useInteractionsFilterHandler(search);\n const handleFilterChange = (value) => {\n const newFilters = typeof value === 'function' ? value(filters) : value;\n setFilters(newFilters);\n handleFilterLogic(newFilters);\n };\n return (_jsx(FilterProvider, { filterGroups: filterGroups, filters: filters, setFilters: handleFilterChange, children: _jsxs(\"div\", { className: \"flex gap-2 items-center\", children: [_jsx(FilterBtn, {}), _jsx(FilterBar, {}), _jsx(FilterClear, {})] }) }));\n}\n//# sourceMappingURL=InteractionsFacetsNav.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { FilterProvider, FilterBtn, FilterBar, FilterClear } from '@vertesia/ui/core';\nimport { useState } from 'react';\n// Hook to create filter groups for prompts\nexport function usePromptsFilterGroups(facets) {\n void facets;\n const customFilterGroups = [];\n // Add name filter as text type\n const nameFilterGroup = {\n name: 'name',\n placeholder: 'Name',\n type: 'text',\n multiple: false\n };\n customFilterGroups.push(nameFilterGroup);\n // Add role filter as select type if role facets are available\n if (facets.role && facets.role.length > 0) {\n const rolesFilterGroup = {\n name: 'role',\n placeholder: 'Role',\n type: 'select',\n options: facets.role.map((facet) => ({\n label: facet._id,\n value: facet._id,\n count: facet.count\n })),\n };\n customFilterGroups.push(rolesFilterGroup);\n }\n return customFilterGroups;\n}\n// Hook to create filter change handler for prompts\nexport function usePromptsFilterHandler(search) {\n return (newFilters) => {\n if (newFilters.length === 0) {\n // Clear filters without applying defaults - user wants to remove all filters\n search.clearFilters(true, false);\n return;\n }\n // Clear all filters first without defaults, then apply new ones\n search.clearFilters(false, false);\n newFilters.forEach(filter => {\n if (filter.value && filter.value.length > 0) {\n const filterName = filter.name;\n let filterValue;\n if (filter.type === 'stringList') {\n filterValue = filter.value.map(v => typeof v === 'string' ? v : v.value);\n }\n else if (filter.multiple) {\n filterValue = Array.isArray(filter.value)\n ? filter.value.map((v) => typeof v === 'object' && v.value ? v.value : v)\n : [typeof filter.value === 'object' && filter.value.value ? filter.value.value : filter.value];\n }\n else {\n // Single value - don't wrap in array\n filterValue = Array.isArray(filter.value) && filter.value[0] && typeof filter.value[0] === 'object'\n ? filter.value[0].value\n : Array.isArray(filter.value) && filter.value[0]\n ? filter.value[0]\n : filter.value;\n }\n search.query[filterName] = filterValue;\n }\n });\n search.search();\n };\n}\n// Component for prompts filtering\nexport function PromptsFacetsNav({ facets, search }) {\n const [filters, setFilters] = useState([]);\n const filterGroups = usePromptsFilterGroups(facets);\n const handleFilterLogic = usePromptsFilterHandler(search);\n const handleFilterChange = (value) => {\n const newFilters = typeof value === 'function' ? value(filters) : value;\n setFilters(newFilters);\n handleFilterLogic(newFilters);\n };\n return (_jsx(FilterProvider, { filterGroups: filterGroups, filters: filters, setFilters: handleFilterChange, children: _jsxs(\"div\", { className: \"flex gap-2 items-center\", children: [_jsx(FilterBtn, {}), _jsx(FilterBar, {}), _jsx(FilterClear, {})] }) }));\n}\n//# sourceMappingURL=PromptsFacetsNav.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { FilterProvider, FilterBtn, FilterBar, FilterClear } from '@vertesia/ui/core';\nimport { useState } from 'react';\nimport { useUserSession } from '@vertesia/ui/session';\n// Hook to create filter groups for collections\nexport function useCollectionsFilterGroups(facets) {\n void facets;\n const { typeRegistry } = useUserSession();\n const customFilterGroups = [];\n // Add name filter as text type\n const nameFilterGroup = {\n name: 'name',\n placeholder: 'Name',\n type: 'text',\n multiple: false\n };\n customFilterGroups.push(nameFilterGroup);\n // add type filter as select type\n if (typeRegistry) {\n const typeOptions = typeRegistry.types.map(type => {\n return {\n label: type.name,\n value: type.id\n };\n });\n const typeFilterGroup = {\n name: 'types',\n placeholder: 'Type',\n type: 'select',\n multiple: true,\n options: typeOptions\n };\n customFilterGroups.push(typeFilterGroup);\n }\n return customFilterGroups;\n}\n// Hook to create filter change handler for collections\nexport function useCollectionsFilterHandler(search) {\n return (newFilters) => {\n if (newFilters.length === 0) {\n // Clear filters without applying defaults - user wants to remove all filters\n search.clearFilters(true);\n return;\n }\n // Clear all filters first, then apply new ones\n search.clearFilters(false);\n newFilters.forEach(filter => {\n if (filter.value && filter.value.length > 0) {\n const filterName = filter.name;\n let filterValue;\n if (filter.type === 'stringList') {\n filterValue = filter.value.map(v => typeof v === 'string' ? v : v.value);\n }\n else if (filter.multiple) {\n filterValue = Array.isArray(filter.value)\n ? filter.value.map((v) => typeof v === 'object' && v.value ? v.value : v)\n : [typeof filter.value === 'object' && filter.value.value ? filter.value.value : filter.value];\n }\n else {\n // Single value - don't wrap in array\n filterValue = Array.isArray(filter.value) && filter.value[0] && typeof filter.value[0] === 'object'\n ? filter.value[0].value\n : Array.isArray(filter.value) && filter.value[0]\n ? filter.value[0]\n : filter.value;\n }\n search.query[filterName] = filterValue;\n }\n });\n search.search();\n };\n}\n// Component for collections filtering\nexport function CollectionsFacetsNav({ facets, search }) {\n const [filters, setFilters] = useState([]);\n const filterGroups = useCollectionsFilterGroups(facets);\n const handleFilterLogic = useCollectionsFilterHandler(search);\n const handleFilterChange = (value) => {\n const newFilters = typeof value === 'function' ? value(filters) : value;\n setFilters(newFilters);\n handleFilterLogic(newFilters);\n };\n return (_jsx(FilterProvider, { filterGroups: filterGroups, filters: filters, setFilters: handleFilterChange, children: _jsxs(\"div\", { className: \"flex gap-2 items-center\", children: [_jsx(FilterBtn, {}), _jsx(FilterBar, {}), _jsx(FilterClear, {})] }) }));\n}\n//# sourceMappingURL=CollectionsFacetsNav.js.map","import { jsx as _jsx } from \"react/jsx-runtime\";\nimport { createContext, useContext, useEffect, useState } from \"react\";\nexport class DocumentSelection {\n object;\n objects;\n setState;\n /**\n * The collection id to which the selected objects belong to.\n */\n collectionId;\n singleSelection = false;\n constructor(object, collectionId, objects, setState) {\n this.object = object;\n this.objects = objects;\n this.setState = setState;\n this.singleSelection = Object.keys(this.objects).length === 0;\n this.collectionId = collectionId;\n }\n isSingleSelection() {\n return this.singleSelection;\n }\n hasSelection() {\n return this.object !== undefined || this.size() !== 0;\n }\n size() {\n return Object.keys(this.objects).length;\n }\n getObjectIds() {\n return Object.keys(this.objects);\n }\n getObjectId() {\n return this.object?.id;\n }\n clone() {\n return new DocumentSelection(this.object, this.collectionId, this.objects, this.setState);\n }\n add(object) {\n this.objects[object.id] = object;\n this.singleSelection = Object.keys(this.objects).length === 0;\n this.setState(this.clone());\n }\n remove(objectId) {\n delete this.objects[objectId];\n this.singleSelection = Object.keys(this.objects).length === 0;\n this.setState(this.clone());\n }\n addAll(objects) {\n for (const obj of objects) {\n this.objects[obj.id] = obj;\n }\n this.setState(this.clone());\n }\n isSelected(objectId) {\n return this.objects[objectId] !== undefined;\n }\n removeAll() {\n this.objects = {};\n this.singleSelection = true;\n this.setState(this.clone());\n }\n}\nconst DocumentSelectionContext = createContext(undefined);\nexport function useDocumentSelection() {\n const selection = useContext(DocumentSelectionContext);\n if (!selection) {\n throw new Error(\"useObjectSelection must be used within a ObjectSelectionProvider\");\n }\n return selection;\n}\nexport function useOptionalDocumentSelection() {\n return useContext(DocumentSelectionContext);\n}\nexport function DocumentSelectionProvider({ value, collectionId, children }) {\n const [selection, setSelection] = useState();\n useEffect(() => {\n const selection = new DocumentSelection(value, collectionId, {}, setSelection);\n setSelection(selection);\n }, [value]);\n return selection && (_jsx(DocumentSelectionContext.Provider, { value: selection, children: children }));\n}\n//# sourceMappingURL=DocumentSelectionProvider.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport dayjs from \"dayjs\";\nimport LocalizedFormat from \"dayjs/plugin/localizedFormat\";\nimport RelativeTime from \"dayjs/plugin/relativeTime\";\nimport { shortId } from \"../../../utils\";\nimport { Eye } from \"lucide-react\";\nimport { Button } from \"@vertesia/ui/core\";\ndayjs.extend(RelativeTime);\ndayjs.extend(LocalizedFormat);\nconst renderers = {\n string(params, _onClick) {\n let transforms = [];\n if (params) {\n const slice = params.get(\"slice\");\n if (slice) {\n transforms.push((value) => value.slice(parseInt(slice)));\n }\n const max_length = params.get(\"max_length\");\n if (max_length) {\n transforms.push((value) => value.slice(0, parseInt(max_length)));\n }\n if (params.has(\"upper\")) {\n transforms.push((value) => value.toUpperCase());\n }\n if (params.has(\"lower\")) {\n transforms.push((value) => value.toLowerCase());\n }\n if (params.has(\"capitalize\")) {\n transforms.push((value) => value[0].toUpperCase() + value.substring(1));\n }\n if (params.has(\"ellipsis\")) {\n transforms.push((value) => value + \"...\");\n }\n }\n return (value, index) => {\n let v;\n if (value) {\n v = String(value);\n if (transforms.length > 0) {\n for (const t of transforms) {\n v = t(v);\n }\n }\n }\n else {\n v = \"\";\n }\n return _jsx(\"td\", { children: v }, index);\n };\n },\n fileSize(_params, _onClick) {\n return (value, index) => {\n let fileSize = \"\";\n if (value) {\n const bytes = Number(value);\n if (!isNaN(bytes)) {\n const sizes = [\"Bytes\", \"KB\", \"MB\", \"GB\", \"TB\"];\n if (bytes === 0) {\n fileSize = \"0 Bytes\";\n }\n else {\n const i = Math.floor(Math.log(bytes) / Math.log(1024));\n fileSize = `${(bytes / Math.pow(1024, i)).toFixed(2)} ${sizes[i]}`;\n }\n }\n else {\n fileSize = String(value);\n }\n }\n return _jsx(\"td\", { children: fileSize }, index);\n };\n },\n number(params, _onClick) {\n let currency;\n let decimals;\n if (params) {\n currency = params.get(\"currency\") || undefined;\n decimals = params.get(\"decimals\") || undefined;\n }\n const digits = decimals ? parseInt(decimals) : 2;\n return (value, index) => {\n let v = new Intl.NumberFormat(\"en-US\", {\n style: currency ? \"currency\" : \"decimal\",\n currency,\n maximumFractionDigits: digits,\n }).format(value);\n return _jsx(\"td\", { children: v }, index);\n };\n },\n objectId(params, onClick) {\n let transforms = [];\n let hasSlice = false;\n if (params) {\n const slice = params.get(\"slice\");\n if (slice) {\n hasSlice = true;\n transforms.push((value) => value.slice(parseInt(slice)));\n }\n }\n return (value, index) => {\n const displayValue = transforms.reduce((v, t) => t(v), value.id);\n return (_jsxs(\"td\", { className: \"flex justify-between items-center gap-2\", children: [hasSlice ? '~' : '', displayValue, _jsx(Button, { variant: \"ghost\", alt: \"Preview Object\", onClick: (e) => {\n e.stopPropagation();\n onClick?.(value.id);\n }, children: _jsx(Eye, { className: \"size-4\" }) })] }, index));\n };\n },\n objectName(params, _onClick) {\n let title = \"title\";\n if (params) {\n title = params.get(\"title\") || \"title\";\n }\n return (value, index) => {\n return (_jsx(\"td\", { children: value.properties?.[title] || value.name || shortId(value.id) }, index));\n };\n },\n typeLink(_params, _onClick) {\n return (value, index) => {\n return _jsx(\"td\", { children: value?.name || \"n/a\" }, index);\n };\n },\n date(params, _onClick) {\n let method = \"format\";\n let arg = \"LLL\";\n if (params) {\n const localized = params.get(\"localized\");\n if (localized) {\n arg = localized;\n }\n else {\n const relative = params.get(\"relative\");\n if (relative) {\n method = relative; // fromNow or toNow\n arg = undefined;\n }\n }\n }\n return (value, index) => {\n return _jsx(\"td\", { children: dayjs(value)[method](arg) }, index);\n };\n },\n};\nexport default renderers;\n//# sourceMappingURL=renderers.js.map","import { jsx as _jsx } from \"react/jsx-runtime\";\nimport renderers from './renderers';\nconst defaultRenderer = renderers.string();\nfunction resolveField(object, path) {\n let p = object;\n if (!p)\n return undefined;\n if (!path.length)\n return p;\n const last = path.length - 1;\n for (let i = 0; i < last; i++) {\n p = p[path[i]];\n if (!p) {\n return undefined;\n }\n }\n return p[path[last]];\n}\nfunction splitPath(path) {\n if (!path || path === '.') {\n return [];\n }\n return path.split('.');\n}\nexport class DocumentTableColumn {\n layout;\n renderer = defaultRenderer;\n path;\n fallbackPath;\n previewObject;\n constructor(layout, previewObject) {\n this.layout = layout;\n this.path = splitPath(layout.field || '');\n this.fallbackPath = layout.fallback ? splitPath(layout.fallback) : undefined;\n this.previewObject = previewObject;\n // If there's a custom render function, use it\n if (layout.render) {\n this.renderer = (_value, _index) => null; // Placeholder, we'll use render directly\n }\n else {\n // Otherwise use the type-based renderer\n const type = layout.type || 'string';\n const i = type.indexOf('?');\n if (i > 0) {\n const name = type.substring(0, i);\n const params = new URLSearchParams(type.substring(i + 1));\n this.renderer = renderers[name](params);\n }\n else {\n this.renderer = renderers[type]();\n }\n }\n }\n get name() {\n return this.layout.name;\n }\n resolveValue(object) {\n let value = resolveField(object, this.path);\n if (value === undefined && this.fallbackPath) {\n value = resolveField(object, this.fallbackPath);\n }\n if (value === undefined) {\n value = this.layout.default;\n }\n return value;\n }\n render(object, index) {\n // If there's a custom render function, wrap its result in a td\n if (this.layout.render) {\n return _jsx(\"td\", { className: \"whitespace-nowrap px-3 py-4 text-sm\", children: this.layout.render(object) }, index);\n }\n const type = this.layout.type || 'string';\n const baseType = type.indexOf('?') > 0 ? type.substring(0, type.indexOf('?')) : type;\n if (baseType === 'objectId' && this.previewObject) {\n const i = type.indexOf('?');\n const params = i > 0 ? new URLSearchParams(type.substring(i + 1)) : undefined;\n const objectIdRenderer = renderers.objectId(params, (_id) => {\n this.previewObject(object.id);\n });\n return objectIdRenderer(object, index);\n }\n // Otherwise use the type-based renderer with the resolved value\n return this.renderer(this.resolveValue(object), index);\n }\n}\n//# sourceMappingURL=DocumentTableColumn.js.map","import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from \"react/jsx-runtime\";\nimport { Table, TBody } from \"@vertesia/ui/core\";\nimport { DocumentIcon, DocumentIconSkeleton } from \"../components/DocumentIcon\";\nexport function DocumentTableView({ objects, selection, isLoading, columns, onRowClick, selectedObject, toggleAll, onSelectionChange }) {\n return (_jsxs(Table, { className: \"w-full border-t\", children: [_jsx(\"thead\", { children: _jsxs(\"tr\", { children: [selection && _jsx(\"th\", { children: _jsx(\"input\", { type: \"checkbox\", onChange: toggleAll }) }), columns.map((col) => (_jsx(\"th\", { children: col.name }, col.name)))] }) }), _jsxs(TBody, { isLoading: isLoading, columns: columns.length + 1, children: [objects?.map((obj) => {\n return (_jsxs(\"tr\", { className: `cursor-pointer hover:bg-muted group ${selectedObject?.id === obj.id ? 'bg-muted' : ''}`, onClick: () => {\n onRowClick && onRowClick(obj);\n }, children: [selection &&\n _jsx(\"td\", { onClick: ev => ev.stopPropagation(), children: _jsx(\"input\", { checked: selection.isSelected(obj.id), type: \"checkbox\", className: `${!selection.isSelected(obj.id) ? 'hidden group-hover:block' : ''}`, onChange: (ev) => onSelectionChange(obj, ev) }) }), columns.map((col, index) => col.render(obj, index))] }, obj.id));\n }), objects.length === 0 && _jsx(\"tr\", { children: _jsx(\"td\", { colSpan: columns.length + (selection ? 1 : 0), className: \"text-center\", children: \"No objects. Just drag and drop documents or images here to create content objects.\" }) })] })] }));\n}\nexport function DocumentGridView({ objects, selection, isLoading, onSelectionChange, onRowClick, previewObject, selectedObject }) {\n return (_jsxs(_Fragment, { children: [_jsx(DocumentIconSkeleton, { isLoading: isLoading }), _jsx(\"div\", { className: \"w-full gap-2 grid lg:grid-cols-6\", children: objects.map((document) => (_jsx(DocumentIcon, { document: document, selection: selection, onSelectionChange: onSelectionChange, onRowClick: onRowClick, previewObject: previewObject, selectedObject: selectedObject }, document.id))) })] }));\n}\n//# sourceMappingURL=documentLayout.js.map","import { createContext, useContext } from 'react';\nimport { SharedState, useWatchSharedState } from '@vertesia/ui/core';\nexport class DocumentSearch {\n client;\n limit;\n collectionId;\n facets = new SharedState({});\n result = new SharedState({ objects: [], isLoading: false });\n facetSpecs = [];\n query = {};\n constructor(client, limit = 100) {\n this.client = client;\n this.limit = limit;\n }\n withFacets(facets) {\n this.facetSpecs = facets;\n return this;\n }\n get objects() {\n return this.result.value.objects;\n }\n get error() {\n return this.result.value.error;\n }\n get isRunning() {\n return this.result.value.isLoading;\n }\n get hasMore() {\n return this.result.value.hasMore || false;\n }\n getFilterValue(name) {\n return this.query[name];\n }\n setFilterValue(name, value) {\n this.query[name] = value;\n // search now\n this.search();\n }\n setDefaultKeys(keys) {\n void keys;\n }\n clearFilters(autoSearch = true) {\n // Preserve search-related fields when clearing filters\n const { parent, full_text, vector, weights, score_aggregation, dynamic_scaling, limit, all_revisions } = this.query;\n this.query = {\n parent,\n ...(full_text !== undefined && { full_text }),\n ...(vector !== undefined && { vector }),\n ...(weights !== undefined && { weights }),\n ...(score_aggregation !== undefined && { score_aggregation }),\n ...(dynamic_scaling !== undefined && { dynamic_scaling }),\n ...(all_revisions !== undefined && { all_revisions }),\n ...(limit !== undefined && { limit })\n };\n if (autoSearch) {\n this.search();\n }\n }\n getFacetBuckets(name) {\n return this.facets.value[name]?.buckets || [];\n }\n resetFacets() {\n this.query = {};\n }\n reset(isLoading = false) {\n this.result.value = {\n objects: [],\n isLoading,\n hasMore: true\n };\n }\n _updateRunningState(value) {\n const prev = this.result.value;\n this.result.value = {\n objects: prev.objects,\n isLoading: value,\n error: prev.error,\n hasMore: prev.hasMore\n };\n }\n _searchRequest(query, limit, offset, includeFacets = true) {\n const payload = {\n limit,\n offset,\n query,\n facets: includeFacets ? this.facetSpecs : undefined\n };\n const request = this.collectionId ?\n this.client.collections.searchMembers(this.collectionId, payload)\n : this.client.objects.search(payload);\n return request;\n }\n _facetsRequest() {\n const payload = { facets: this.facetSpecs, query: this.query };\n return this.collectionId ?\n this.client.collections.computeFacets(this.collectionId, payload)\n : this.client.objects.computeFacets(payload);\n }\n computeFacets(_query) {\n this._facetsRequest().then((facets) => {\n this.facets.value = facets;\n });\n }\n _search(loadMore = false, noFacets = false) {\n if (this.isRunning && loadMore) { // avoid searching when a search is pending, but allow initial search\n return Promise.resolve(false);\n }\n this.result.value = {\n isLoading: true,\n objects: loadMore ? this.objects : [],\n hasMore: loadMore ? this.result.value.hasMore : true\n };\n const limit = this.limit;\n const offset = loadMore ? this.objects.length : 0;\n return this._searchRequest(this.query, limit, offset, !noFacets).then(async (res) => {\n // Handle the new format with results and facets\n const results = res.results || [];\n const facets = res.facets || {};\n this.result.value = {\n isLoading: false,\n objects: loadMore ? this.objects.concat(results) : results,\n hasMore: results.length === limit\n };\n // Update facets if they were requested and returned\n if (!noFacets && facets && Object.keys(facets).length > 0) {\n this.facets.value = facets;\n }\n return true;\n }).catch((err) => {\n this.result.value = {\n error: err,\n isLoading: false,\n objects: this.objects,\n hasMore: this.result.value.hasMore\n };\n throw err;\n });\n }\n search(noFacets = false) {\n // Allow initial search even if isLoading is true (for initial page load)\n if (this.isRunning && this.objects.length > 0) {\n return Promise.resolve(false);\n }\n return this._search(false, noFacets);\n }\n loadMore(noFacets = false) {\n if (this.isRunning || !this.hasMore)\n return Promise.resolve(false);\n if (this.query.vector)\n return Promise.resolve(false); //Load more not supported on vector queries\n if (this.objects.length > 0) {\n noFacets = true; //Only reload facets on loadMore if there are no results.\n }\n return this._search(true, noFacets);\n }\n}\nconst DocumentSearchContext = createContext(undefined);\nexport function useDocumentSearch() {\n return useContext(DocumentSearchContext);\n}\nexport function useWatchDocumentSearchFacets() {\n return useWatchSharedState(useDocumentSearch().facets);\n}\nexport function useWatchDocumentSearchResult() {\n const search = useDocumentSearch();\n const result = useWatchSharedState(search.result);\n return { ...result, search };\n}\nexport function useDocumentSearchCount() {\n const search = useDocumentSearch();\n const result = useWatchSharedState(search.facets);\n return result.total;\n}\nexport { DocumentSearchContext as SearchContext };\n//# sourceMappingURL=DocumentSearchContext.js.map","import { useToast } from \"@vertesia/ui/core\";\nimport { useUserSession } from \"@vertesia/ui/session\";\nimport { Md5 } from \"ts-md5\";\n/**\n * Types of actions that can be taken with a file\n */\nexport var FileUploadAction;\n(function (FileUploadAction) {\n FileUploadAction[\"CREATE\"] = \"create\";\n FileUploadAction[\"SKIP\"] = \"skip\";\n FileUploadAction[\"UPDATE\"] = \"update\";\n})(FileUploadAction || (FileUploadAction = {}));\n/**\n * Calculates the MD5 hash of a file\n * @param file The file to hash\n * @returns Promise with the MD5 hash of the file\n */\nasync function calculateFileHash(file) {\n try {\n const arrayBuffer = await file.arrayBuffer();\n const md5 = new Md5();\n md5.appendByteArray(new Uint8Array(arrayBuffer));\n const hash = md5.end();\n return hash?.toString();\n }\n catch (error) {\n console.error(\"Error calculating file hash:\", error);\n return undefined;\n }\n}\n/**\n * Prepares files by calculating their hashes and metadata\n * @param files Array of files to process\n * @param selectedFolder Optional folder location for the files\n * @returns Promise with array of files with their metadata\n */\nasync function prepareFilesWithMetadata(files, selectedFolder) {\n const filesWithMetadata = [];\n // Process files in batches to avoid overwhelming the browser\n const batchSize = 5;\n for (let i = 0; i < files.length; i += batchSize) {\n const batch = files.slice(i, i + batchSize);\n // Process this batch in parallel\n const metadataResults = await Promise.all(batch.map(async (file) => {\n // Determine the location for this file\n let location = selectedFolder || undefined;\n // If file has relative path, use it to determine location\n const hasRelativePath = !!file.webkitRelativePath;\n if (hasRelativePath) {\n const relativePath = file.webkitRelativePath;\n const pathParts = relativePath.split(\"/\");\n if (pathParts.length > 1) {\n // Extract folder path (everything except the filename)\n const folderPath = pathParts.slice(0, -1).join(\"/\");\n // Combine with selected folder if any\n location = selectedFolder ? `${selectedFolder}/${folderPath}` : folderPath;\n }\n }\n // Calculate hash for content comparison\n const hash = await calculateFileHash(file);\n return {\n file,\n hash,\n name: file.name,\n size: file.size,\n location,\n };\n }));\n filesWithMetadata.push(...metadataResults);\n }\n return filesWithMetadata;\n}\n/**\n * Hook to check if documents need to be created, updated, or skipped\n * @param collectionId Optional collection ID to check within\n * @returns Object with functions to process documents\n */\nexport function useSmartFileUploadProcessing() {\n const { client } = useUserSession();\n const toast = useToast();\n /**\n * Check files to determine if they need to be created, updated, or skipped\n * @param files Array of files to check\n * @param selectedFolder Optional folder location\n * @param collectionId limit the check to a collection\n * @returns Promise with information about actions to take for each file\n */\n const prepareFilesForUpload = async (files, selectedFolder, limitToCollectionId) => {\n try {\n // First, prepare all the files with their metadata\n console.log(`Preparing metadata for ${files.length} files...`);\n const filesWithMetadata = await prepareFilesWithMetadata(files, selectedFolder);\n const identifyExistingHash = async () => {\n const query = {\n \"content.etag\": { $in: filesWithMetadata.map((file) => file.hash) },\n };\n let res;\n const payload = {\n query: { match: query },\n select: \"id content.etag\" // Only fetch fields needed for comparison\n };\n if (limitToCollectionId) {\n res = (await client.store.collections.searchMembers(limitToCollectionId, payload)).results;\n }\n else {\n res = (await client.store.objects.search(payload)).results;\n }\n for (const doc of res) {\n const file = filesWithMetadata.find((f) => f.hash === doc.content.etag);\n if (file) {\n file.existingId = doc.id;\n file.action = FileUploadAction.SKIP;\n }\n }\n };\n /**\n * Find what file are present based on location and name\n */\n const identifyExistingIds = async () => {\n const unskippedFiles = filesWithMetadata.filter((file) => file.action !== FileUploadAction.SKIP);\n const allLocations = unskippedFiles.map((file) => file.location);\n const uniqueLocations = Array.from(new Set(allLocations));\n const queries = [];\n for (const location of uniqueLocations) {\n const namesInLocation = unskippedFiles\n .filter((file) => file.location === location)\n .map((file) => file.name);\n const query = {\n \"content.name\": { $in: namesInLocation },\n location: location || \"/\"\n };\n if (limitToCollectionId) {\n const res = client.store.collections.searchMembers(limitToCollectionId, {\n query: {\n match: query,\n },\n select: \"id content.name location\" // Only fetch fields needed for comparison\n }).then((response) => response.results);\n queries.push(res);\n }\n else {\n const res = client.store.objects.find({\n query: query,\n select: \"id content.name location\" // Only fetch fields needed for comparison\n });\n queries.push(res);\n }\n }\n const results = (await Promise.all(queries)).flat();\n console.log(`Found ${results.length} document to update`, results);\n //update fileWithMetadata\n for (const doc of results) {\n const file = filesWithMetadata.find(\n //name must be the same, and location must match (default is \"/\")\n (f) => f.name === doc.content.name &&\n (f.location ? f.location === doc.location : doc.location === \"/\"));\n if (file) {\n file.existingId = doc.id;\n file.action = FileUploadAction.UPDATE;\n }\n }\n console.log(`Reconciled ${filesWithMetadata.filter((f) => f.action === FileUploadAction.UPDATE).length}`);\n };\n await identifyExistingHash();\n await identifyExistingIds();\n //set create flag on remaining files\n filesWithMetadata.forEach((f) => {\n if (!f.action) {\n f.action = FileUploadAction.CREATE;\n }\n });\n // Log the results\n console.log(\"Document processing check results:\", {\n totalFiles: files.length,\n toCreate: filesWithMetadata.filter((f) => f.action === FileUploadAction.CREATE).length,\n toUpdate: filesWithMetadata.filter((f) => f.action === FileUploadAction.UPDATE).length,\n toSkip: filesWithMetadata.filter((f) => f.action === FileUploadAction.SKIP).length,\n });\n return filesWithMetadata;\n }\n catch (error) {\n toast({\n title: \"Error in file upload processing check\",\n status: \"error\",\n description: error.message,\n });\n console.log(\"Error in file upload processing check\", error);\n throw new Error(\"Error in file upload processing check: \" + error.message);\n }\n };\n return {\n checkDocumentProcessing: prepareFilesForUpload,\n };\n}\n//# sourceMappingURL=useSmartFileUploadProcessing.js.map","import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from \"react/jsx-runtime\";\nimport { Button, MessageBox, VModal, VModalBody, VModalFooter, VModalTitle, VSelectBox, Spinner, useToast, VTooltip } from \"@vertesia/ui/core\";\nimport { useUserSession } from \"@vertesia/ui/session\";\nimport { DropZone, UploadSummary } from '@vertesia/ui/widgets';\nimport { AlertCircleIcon, CheckCircleIcon, FileIcon, FolderIcon, Info, UploadIcon, XCircleIcon } from \"lucide-react\";\nimport { useEffect, useMemo, useState } from \"react\";\nimport { FileUploadAction, useSmartFileUploadProcessing } from \"./useSmartFileUploadProcessing\";\n/**\n * Unified upload modal that handles the complete upload process:\n * 1. File selection (if no files provided)\n * 2. Smart file processing to detect duplicates\n * 3. Type selection\n * 4. Upload with progress tracking\n * 5. Result display\n */\nexport function DocumentUploadModal({ isOpen, onClose, files: initialFiles, collectionId, selectedFolder, title = \"Upload Files\", children, onUploadComplete, hideFileSelection = false, showTypeSelectionOnly = false, }) {\n const { client, typeRegistry } = useUserSession();\n const toast = useToast();\n const [files, setFiles] = useState([]);\n const [processedFiles, setProcessedFiles] = useState([]);\n const [processingDone, setProcessingDone] = useState(false);\n const [selectedType, setSelectedType] = useState(null);\n const [fileStatuses, setFileStatuses] = useState([]);\n const [isUploading, setIsUploading] = useState(false);\n const [uploadComplete, setUploadComplete] = useState(false);\n const [overallProgress, setOverallProgress] = useState(0);\n const [modalKey, setModalKey] = useState(Date.now());\n const [collectionData, setCollectionData] = useState(undefined);\n const [result, setResult] = useState(null);\n const [_title, setTitle] = useState(title);\n const [_description, setDescription] = useState(\"\");\n // Fetch collection details if a collectionId is provided\n useEffect(() => {\n if (!collectionId)\n return;\n client.store.collections.retrieve(collectionId).then(setCollectionData);\n }, [collectionId]);\n // Update title and description based on current state\n useEffect(() => {\n if (isUploading) {\n setTitle(\"Uploading Files\");\n setDescription(`${Math.round(overallProgress)}% complete`);\n }\n else if (uploadComplete) {\n setTitle(\"Upload Complete\");\n setDescription(\"\");\n }\n else if (processingDone) {\n setTitle(\"File Analysis Results\");\n setDescription(`${files.length} file${files.length !== 1 ? \"s\" : \"\"}`);\n }\n else if (files.length > 0) {\n setTitle(title);\n setDescription(\"Checking for duplicates and updates\");\n }\n else {\n setTitle(title);\n setDescription(\"\");\n }\n }, [isUploading, uploadComplete, processingDone, title, overallProgress, files.length]);\n // Helper function to render collection and folder information\n const renderLocationInfo = () => {\n if (!collectionData && !selectedFolder)\n return null;\n return (_jsxs(MessageBox, { className: \"mb-4\", status: \"default\", icon: _jsx(FolderIcon, { className: \"size-5\" }), children: [_jsx(\"div\", { className: \"flex items-center\", children: _jsx(\"span\", { className: \"font-medium\", children: \"Upload Location:\" }) }), _jsxs(\"div\", { className: \"text-sm mt-1\", children: [collectionData && (_jsxs(\"div\", { className: \"flex items-center\", children: [_jsx(\"span\", { className: \"mr-1\", children: \"Collection:\" }), _jsx(\"span\", { className: \"font-medium\", children: collectionData.name })] })), selectedFolder && (_jsxs(\"div\", { className: \"flex items-center mt-1\", children: [_jsx(\"span\", { className: \"mr-1\", children: \"Folder:\" }), _jsx(\"span\", { className: \"font-medium\", children: selectedFolder })] }))] })] }));\n };\n // Statistics for upload processing\n const [processingStats, setProcessingStats] = useState({ toCreate: 0, toUpdate: 0, toSkip: 0 });\n // Get the smart file processing utility\n const { checkDocumentProcessing } = useSmartFileUploadProcessing();\n // Get available types from the registry\n const types = useMemo(() => {\n return typeRegistry?.types || [];\n }, [typeRegistry?.types]);\n // Reset state when modal opens/closes\n useEffect(() => {\n if (isOpen) {\n // Always reset state first\n setProcessedFiles([]);\n setProcessingDone(false);\n setSelectedType(null);\n setFileStatuses([]);\n setIsUploading(false);\n setUploadComplete(false);\n setOverallProgress(0);\n setProcessingStats({ toCreate: 0, toUpdate: 0, toSkip: 0 });\n setResult(null);\n setTitle(title);\n setDescription(\"\");\n // Set initial files if provided\n if (initialFiles && initialFiles.length > 0) {\n setFiles(initialFiles);\n processFiles(initialFiles);\n }\n else {\n setFiles([]);\n }\n // Create a new key to ensure the modal is fresh\n setModalKey(Date.now());\n }\n }, [isOpen, initialFiles]);\n // Complete cleanup when modal closes\n const handleClose = () => {\n // Reset all state to initial values to prevent memory leaks\n setFiles([]);\n setProcessedFiles([]);\n setProcessingDone(false);\n setSelectedType(null);\n setFileStatuses([]);\n setIsUploading(false);\n setUploadComplete(false);\n setOverallProgress(0);\n setProcessingStats({ toCreate: 0, toUpdate: 0, toSkip: 0 });\n setResult(null);\n setTitle(title);\n setDescription(\"\");\n setModalKey(Date.now());\n // Call the provided onClose function\n onClose();\n };\n // Handle file drop/selection\n const handleFileSelect = (newFiles) => {\n if (newFiles && newFiles.length > 0) {\n setFiles(newFiles);\n processFiles(newFiles);\n }\n };\n // Process files to determine create/update/skip status\n const processFiles = async (filesToProcess) => {\n if (!filesToProcess.length)\n return;\n try {\n console.log(`Processing ${filesToProcess.length} files to determine required actions...`);\n // Get the document processing results\n const processed = await checkDocumentProcessing(filesToProcess, selectedFolder, collectionId);\n setProcessedFiles(processed);\n // Count files by action\n const toCreate = processed.filter((f) => f.action === FileUploadAction.CREATE).length;\n const toUpdate = processed.filter((f) => f.action === FileUploadAction.UPDATE).length;\n const toSkip = processed.filter((f) => f.action === FileUploadAction.SKIP).length;\n // Update stats for UI feedback\n setProcessingStats({\n toCreate,\n toUpdate,\n toSkip,\n });\n // Show processing results to user\n toast({\n title: \"Files analyzed\",\n description: `${filesToProcess.length} file(s): ${toCreate} new, ${toUpdate} to update, ${toSkip} to skip`,\n status: \"info\",\n duration: 4000,\n });\n // Set processing as complete\n setProcessingDone(true);\n }\n catch (error) {\n console.error(\"Error processing files:\", error);\n toast({\n title: \"Error\",\n description: \"There was an error analyzing the files\",\n status: \"error\",\n duration: 5000,\n });\n }\n };\n // Handle type selection and start the upload\n const handleUpload = async () => {\n if (!processedFiles.length)\n return;\n const typeId = selectedType?.id || null;\n // Initialize file statuses\n const initialStatuses = processedFiles.map((fileInfo) => ({\n file: fileInfo.file,\n status: \"pending\",\n progress: 0,\n action: fileInfo.action === FileUploadAction.CREATE\n ? \"create\"\n : fileInfo.action === FileUploadAction.UPDATE\n ? \"update\"\n : \"skip\",\n }));\n setFileStatuses(initialStatuses);\n setIsUploading(true);\n setUploadComplete(false);\n // Process files in batches\n const filesToSkip = processedFiles.filter((f) => f.action === FileUploadAction.SKIP);\n const filesToUpdate = processedFiles.filter((f) => f.action === FileUploadAction.UPDATE);\n const filesToCreate = processedFiles.filter((f) => f.action === FileUploadAction.CREATE);\n const result = {\n success: true,\n objectIds: [],\n uploadedFiles: [],\n skippedFiles: [],\n failedFiles: [],\n };\n // Process SKIP files\n for (const fileInfo of filesToSkip) {\n if (fileInfo.existingId) {\n result.objectIds.push(fileInfo.existingId);\n result.skippedFiles.push({\n id: fileInfo.existingId,\n name: fileInfo.name,\n type: typeId,\n status: \"skipped\",\n location: fileInfo.location,\n });\n // Update the file status\n setFileStatuses((current) => current.map((status) => status.file === fileInfo.file\n ? { ...status, status: \"success\", progress: 100, id: fileInfo.existingId }\n : status));\n }\n }\n // Process files in batches of 50\n const BATCH_SIZE = 50;\n const PROGRESS_UPDATE_INTERVAL = 5; // Update progress every 5 files\n // Helper function to process a batch of files\n const processBatch = async (files, action) => {\n const batches = [];\n for (let i = 0; i < files.length; i += BATCH_SIZE) {\n batches.push(files.slice(i, i + BATCH_SIZE));\n }\n for (let batchIndex = 0; batchIndex < batches.length; batchIndex++) {\n const batch = batches[batchIndex];\n console.log(`Processing ${action} batch ${batchIndex + 1}/${batches.length} (${batch.length} files)`);\n // Show progress for larger file sets\n if (files.length > BATCH_SIZE) {\n const processedCount = batchIndex * BATCH_SIZE;\n toast({\n title: `Processing files (${action})`,\n description: `Processed ${processedCount}/${files.length} files...`,\n status: \"info\",\n duration: 2000,\n });\n }\n // Process the batch with progress tracking\n let filesProcessedInBatch = 0;\n await Promise.all(batch.map(async (fileInfo) => {\n try {\n // Update status to uploading\n setFileStatuses((current) => current.map((status) => status.file === fileInfo.file\n ? { ...status, status: \"uploading\", progress: 20 }\n : status));\n if (action === \"update\" && fileInfo.existingId) {\n // Update existing file\n await client.store.objects.update(fileInfo.existingId, {\n type: typeId || undefined,\n content: fileInfo.file,\n location: fileInfo.location,\n name: fileInfo.name,\n }, {\n createRevision: true,\n revisionLabel: \"upload on \" + new Date().toISOString(),\n });\n // Update status to success\n setFileStatuses((current) => current.map((status) => status.file === fileInfo.file\n ? { ...status, status: \"success\", progress: 100, id: fileInfo.existingId }\n : status));\n // Add to result\n result.objectIds.push(fileInfo.existingId);\n result.uploadedFiles.push({\n id: fileInfo.existingId,\n name: fileInfo.name,\n type: typeId,\n status: \"updated\",\n location: fileInfo.location,\n });\n }\n else {\n // Create new file\n const createResult = await client.store.objects.create({\n type: typeId || undefined,\n content: fileInfo.file,\n location: fileInfo.location || fileInfo.file.webkitRelativePath || fileInfo.name,\n }, {\n collection_id: collectionId,\n });\n // Update status to success\n setFileStatuses((current) => current.map((status) => status.file === fileInfo.file\n ? { ...status, status: \"success\", progress: 100, id: createResult.id }\n : status));\n // Add to result\n result.objectIds.push(createResult.id);\n result.uploadedFiles.push({\n id: createResult.id,\n name: fileInfo.name,\n type: typeId,\n status: \"created\",\n location: fileInfo.location,\n });\n }\n }\n catch (error) {\n console.error(`Failed to process file ${fileInfo.name}:`, error);\n // Update status to error\n setFileStatuses((current) => current.map((status) => status.file === fileInfo.file\n ? {\n ...status,\n status: \"error\",\n progress: 100,\n message: error.message || \"Unknown error\",\n }\n : status));\n // Add to failed result\n result.failedFiles.push({\n name: fileInfo.name,\n error: error.message || \"Unknown error\",\n status: \"failed\",\n location: fileInfo.location,\n type: typeId,\n });\n // Mark the overall success as false if any file fails\n result.success = false;\n }\n // Update progress every PROGRESS_UPDATE_INTERVAL files\n filesProcessedInBatch++;\n if (filesProcessedInBatch % PROGRESS_UPDATE_INTERVAL === 0 || filesProcessedInBatch === batch.length) {\n setFileStatuses((currentStatuses) => {\n const completedFiles = currentStatuses.filter((f) => f.status === \"success\" || f.status === \"error\").length;\n const totalFiles = currentStatuses.length;\n const progress = totalFiles > 0 ? Math.round((completedFiles / totalFiles) * 100) : 0;\n setOverallProgress(progress);\n return currentStatuses;\n });\n }\n }));\n }\n };\n // Process UPDATE files first, then CREATE files\n if (filesToUpdate.length > 0) {\n await processBatch(filesToUpdate, \"update\");\n }\n if (filesToCreate.length > 0) {\n await processBatch(filesToCreate, \"create\");\n }\n // Finalize the upload\n // Ensure all files are accounted for before completing\n setFileStatuses((current) => {\n // Check for any pending files that might have been missed\n const missingStatuses = current\n .filter((status) => status.status === \"pending\")\n .map((status) => ({\n ...status,\n status: \"error\",\n progress: 100,\n message: \"Upload process interrupted\",\n }));\n if (missingStatuses.length > 0) {\n // Add missing files to the failed files list\n missingStatuses.forEach((status) => {\n result.failedFiles.push({\n name: status.file.name,\n error: \"Upload process interrupted\",\n status: \"failed\",\n type: selectedType?.id || null,\n });\n });\n // Update the success flag if any files failed\n result.success = false;\n // Return updated statuses\n return current.map((status) => status.status === \"pending\"\n ? {\n ...status,\n status: \"error\",\n progress: 100,\n message: \"Upload process interrupted\",\n }\n : status);\n }\n return current;\n });\n setIsUploading(false);\n setUploadComplete(true);\n // Show summary toast\n const createdCount = result.uploadedFiles.filter((f) => f.status === \"created\").length;\n const updatedCount = result.uploadedFiles.filter((f) => f.status === \"updated\").length;\n const skippedCount = result.skippedFiles.length;\n const failedCount = result.failedFiles.length;\n let statusMessage = \"\";\n if (createdCount > 0)\n statusMessage += `${createdCount} file${createdCount !== 1 ? \"s\" : \"\"} uploaded`;\n if (updatedCount > 0) {\n statusMessage += statusMessage ? \", \" : \"\";\n statusMessage += `${updatedCount} file${updatedCount !== 1 ? \"s\" : \"\"} updated`;\n }\n if (skippedCount > 0) {\n statusMessage += statusMessage ? \", \" : \"\";\n statusMessage += `${skippedCount} file${skippedCount !== 1 ? \"s\" : \"\"} skipped`;\n }\n if (failedCount > 0) {\n statusMessage += statusMessage ? \", \" : \"\";\n statusMessage += `${failedCount} file${failedCount !== 1 ? \"s\" : \"\"} failed`;\n }\n toast({\n title: \"Upload Complete\",\n description: statusMessage,\n status: failedCount > 0 ? \"warning\" : \"success\",\n duration: 5000,\n });\n setResult(result);\n };\n const typeSelection = () => {\n return (_jsxs(\"div\", { className: \"mb-4\", children: [_jsxs(\"label\", { className: \"block text-sm font-medium mb-2\", children: [\"Content Type \", _jsx(\"span\", { className: \"text-muted font-normal\", children: \"(Optional)\" }), _jsx(VTooltip, { description: \"Select a content type to apply to the uploaded files. If left empty, Vertesia will automatically detect the type based on file content.\", placement: \"top\", size: \"xs\", children: _jsx(Info, { className: \"size-3 ml-2\" }) })] }), _jsx(VSelectBox, { options: types, value: selectedType, optionLabel: (type) => (type ? type.name : \"Select a content type\"), placeholder: \"Select a content type or leave empty for automatic detection\", onChange: (selected) => setSelectedType(selected === undefined ? null : selected), filterBy: \"name\", isClearable: true }), selectedType ? (_jsx(_Fragment, {})) : (_jsx(\"div\", { className: \"p-2 rounded-md\", children: _jsxs(\"div\", { className: \"flex items-center text-attention\", children: [_jsx(CheckCircleIcon, { className: \"size-4 mr-1\" }), \"Automatic Type Detection\", _jsx(VTooltip, { description: \"Vertesia will analyze the content and select the most appropriate type. This is recommended for most uploads and ensures optimal processing.\", placement: \"top\", size: \"xs\", children: _jsx(Info, { className: \"size-3 ml-2\" }) })] }) }))] }));\n };\n // Determine what content to show based on the current state\n const renderModalContent = () => {\n // When showing only type selection, skip directly to the type selection UI\n if (showTypeSelectionOnly) {\n return (_jsxs(VModalBody, { children: [children, renderLocationInfo(), typeSelection()] }));\n }\n // Step 1: File selection #todo: update styles\n if (files.length === 0 && !hideFileSelection) {\n return (_jsxs(VModalBody, { className: \"flex flex-col items-center justify-center p-8\", children: [renderLocationInfo(), _jsx(DropZone, { onDrop: handleFileSelect, message: \"Drag and drop files here or click to select\", buttonLabel: \"Select Files\", className: \"w-full h-64\" }), children] }));\n }\n // Step 2: File processing and type selection\n if (!isUploading && !uploadComplete) {\n return (_jsx(VModalBody, { children: !processingDone ? (\n // File processing in progress\n _jsxs(\"div\", { className: \"flex flex-col items-center justify-center py-4\", children: [_jsx(Spinner, { size: \"lg\", className: \"mb-4\" }), _jsx(\"div\", { className: \"text-lg font-medium\", children: \"Analyzing files...\" })] })) : (\n // Processing complete, show type selection\n _jsxs(_Fragment, { children: [renderLocationInfo(), _jsx(\"div\", { className: \"mb-4\", children: _jsx(\"div\", { className: \"p-4 rounded-md mb-4\", children: _jsxs(\"div\", { className: \"grid grid-cols-3 gap-4\", children: [_jsxs(\"div\", { className: \"flex flex-col items-center\", children: [_jsxs(\"div\", { className: \"flex items-center gap-2\", children: [_jsx(UploadIcon, { className: \"size-5 text-primary\" }), _jsx(\"span\", { className: \"font-medium\", children: \"New\" })] }), _jsx(\"div\", { className: \"text-2xl font-semibold\", children: processingStats.toCreate })] }), _jsxs(\"div\", { className: \"flex flex-col items-center\", children: [_jsxs(\"div\", { className: \"flex items-center gap-2\", children: [_jsx(CheckCircleIcon, { className: \"size-5 text-success\" }), _jsx(\"span\", { className: \"font-medium\", children: \"Update\" })] }), _jsx(\"div\", { className: \"text-2xl font-semibold\", children: processingStats.toUpdate })] }), _jsxs(\"div\", { className: \"flex flex-col items-center\", children: [_jsxs(\"div\", { className: \"flex items-center gap-2\", children: [_jsx(AlertCircleIcon, { className: \"size-5 text-mixer-attention/40\" }), _jsx(\"span\", { className: \"font-medium\", children: \"Skip\" })] }), _jsx(\"div\", { className: \"text-2xl font-semibold\", children: processingStats.toSkip })] })] }) }) }), typeSelection(), _jsx(MessageBox, { className: \"mb-4\", status: \"info\", children: processingStats.toCreate + processingStats.toUpdate > 0 ? (_jsxs(\"div\", { className: \"space-y-1\", children: [_jsxs(\"p\", { children: [processingStats.toCreate + processingStats.toUpdate, \" file\", processingStats.toCreate + processingStats.toUpdate > 1 ? \"s are\" : \" is\", \" ready to process\"] }), _jsx(\"p\", { children: processingStats.toSkip > 0 &&\n `${processingStats.toSkip} file${processingStats.toSkip > 1 ? \"s are\" : \" is\"} already in the system and will be skipped.` })] })) : processingStats.toSkip > 0 ? (_jsxs(\"span\", { children: [\"All \", processingStats.toSkip, \" file(s) already exist in the system and will be skipped. You can proceed to view the results.\"] })) : (_jsx(\"span\", { children: \"No files to process.\" })) })] })) }));\n }\n // Step 3: Upload in progress #todo: update styles\n if (isUploading) {\n return (_jsxs(VModalBody, { children: [renderLocationInfo(), _jsx(\"div\", { className: \"mb-4\", children: _jsx(\"div\", { className: \"h-2 bg-muted/20 rounded-full overflow-hidden\", children: _jsx(\"div\", { className: \"h-full bg-primary rounded-full\", style: { width: `${overallProgress}%` } }) }) }), _jsx(\"div\", { className: \"max-h-96 overflow-y-auto\", children: fileStatuses.map((fileStatus, index) => (_jsxs(\"div\", { className: \"flex items-center py-2 border-b border-border last:border-b-0\", children: [_jsxs(\"div\", { className: \"mr-3\", children: [fileStatus.status === \"pending\" && (_jsx(FileIcon, { className: \"size-5 text-muted\" })), fileStatus.status === \"uploading\" && _jsx(Spinner, { size: \"sm\" }), fileStatus.status === \"success\" && (_jsx(CheckCircleIcon, { className: \"size-5 text-success\" })), fileStatus.status === \"error\" && _jsx(XCircleIcon, { className: \"size-5 text-destructive\" })] }), _jsxs(\"div\", { className: \"flex-1 min-w-0\", children: [_jsx(\"div\", { className: \"truncate font-medium\", children: fileStatus.file.name }), _jsxs(\"div\", { className: \"text-xs text-muted\", children: [fileStatus.status === \"pending\" && \"Waiting...\", fileStatus.status === \"uploading\" && \"Uploading...\", fileStatus.status === \"success\" &&\n (fileStatus.action === \"create\"\n ? \"Created\"\n : fileStatus.action === \"update\"\n ? \"Updated\"\n : \"Skipped\"), fileStatus.status === \"error\" && fileStatus.message] })] })] }, `${fileStatus.file.name}-${index}`))) })] }));\n }\n // Step 4: Upload complete, show results\n return (_jsx(VModalBody, { children: _jsxs(\"div\", { className: \"mb-4\", children: [renderLocationInfo(), _jsx(UploadSummary, { files: fileStatuses.map((f) => {\n // Map fileStatus to the expected ProcessedFile format\n let status;\n if (f.status === \"success\") {\n if (f.action === \"create\") {\n status = \"success\";\n }\n else if (f.action === \"update\") {\n status = \"updated\";\n }\n else {\n status = \"skipped\";\n }\n }\n else {\n status = \"failed\";\n }\n return {\n name: f.file.name,\n status,\n error: f.status === \"error\" ? f.message : undefined,\n };\n }), location: selectedFolder || undefined, collection: collectionData?.name })] }) }));\n };\n const renderModalFooter = () => {\n // Type-selection-only mode\n if (showTypeSelectionOnly) {\n return (_jsxs(VModalFooter, { children: [_jsx(Button, { variant: \"ghost\", onClick: handleClose, children: \"Cancel\" }), _jsx(Button, { onClick: () => {\n // Create minimal result with the selected type (or null)\n const result = {\n success: true,\n objectIds: [],\n uploadedFiles: [\n {\n name: \"type-selection\",\n type: selectedType?.id || null,\n status: \"created\",\n },\n ],\n skippedFiles: [],\n failedFiles: [],\n };\n if (onUploadComplete) {\n onUploadComplete(result);\n }\n handleClose();\n }, children: selectedType ? `Use ${selectedType.name}` : \"Use Automatic Type Detection\" })] }));\n }\n // File selection step - only show cancel\n if (files.length === 0 && !hideFileSelection) {\n return (_jsx(VModalFooter, { children: _jsx(Button, { variant: \"ghost\", onClick: handleClose, children: \"Cancel\" }) }));\n }\n // Processing and type selection step\n if (!isUploading && !uploadComplete) {\n // Allow upload even without a type (Vertesia will choose one)\n const canUpload = processingDone;\n return (_jsxs(VModalFooter, { children: [_jsx(Button, { variant: \"ghost\", onClick: handleClose, children: \"Cancel\" }), _jsx(Button, { disabled: !canUpload, onClick: handleUpload, children: processingStats.toCreate + processingStats.toUpdate > 0\n ? \"Upload\"\n : \"Continue\" })] }));\n }\n // Upload in progress - can't cancel\n if (isUploading) {\n return (_jsx(VModalFooter, { children: _jsx(Button, { variant: \"ghost\", disabled: true, children: \"Uploading...\" }) }));\n }\n // Upload complete - close or upload more\n return (_jsxs(VModalFooter, { children: [_jsx(Button, { variant: \"ghost\", onClick: () => {\n // Reset state and start over\n setFiles([]);\n setProcessedFiles([]);\n setProcessingDone(false);\n setSelectedType(null);\n setFileStatuses([]);\n setIsUploading(false);\n setUploadComplete(false);\n setOverallProgress(0);\n setProcessingStats({ toCreate: 0, toUpdate: 0, toSkip: 0 });\n }, children: \"Upload More\" }), _jsx(Button, { onClick: () => {\n if (onUploadComplete && result) {\n onUploadComplete(result);\n }\n handleClose();\n }, children: \"Close\" })] }));\n };\n return (_jsxs(VModal, { isOpen: isOpen, onClose: handleClose, className: \"mx-auto\", disableCloseOnClickOutside: true, children: [_jsx(VModalTitle, { description: _description, children: _title }), renderModalContent(), renderModalFooter()] }, modalKey));\n}\n//# sourceMappingURL=DocumentUploadModal.js.map","import { useToast } from \"@vertesia/ui/core\";\nimport { useUserSession } from \"@vertesia/ui/session\";\nimport { useDocumentSearch } from \"../search/DocumentSearchContext\";\nimport { FileUploadAction, useSmartFileUploadProcessing } from \"./useSmartFileUploadProcessing\";\n/**\n * Hook for handling file uploads to the store\n *\n * @param options Configuration options for the upload handler\n * @returns Upload handler function that takes files and type, and returns upload results\n */\nexport function useDocumentUploadHandler(options) {\n // Handle both object and legacy function format for backward compatibility\n const onUploadDone = typeof options === \"function\" ? options : options.onUploadDone;\n const { client, project: projectRef, store } = useUserSession();\n const search = useDocumentSearch();\n const toast = useToast();\n const { checkDocumentProcessing } = useSmartFileUploadProcessing();\n return async (files, type, collectionId) => {\n // Initialize result object\n const result = {\n success: false,\n objectIds: [],\n uploadedFiles: [],\n skippedFiles: [],\n failedFiles: [],\n };\n if (!projectRef) {\n toast({\n status: \"error\",\n title: \"No project selected\",\n duration: 3000,\n });\n return result;\n }\n if (!files || files.length === 0) {\n toast({\n status: \"warning\",\n title: \"No files selected\",\n duration: 3000,\n });\n return result;\n }\n const filesToUpload = Array.from(files).filter((file) => file.size > 0);\n if (filesToUpload.length === 0) {\n toast({\n status: \"error\",\n title: \"No valid files selected\",\n description: \"Please select files with valid content.\",\n duration: 5000,\n });\n return result;\n }\n const skippedFilesInfo = [];\n const uploadedFilesInfo = [];\n const failedFilesInfo = [];\n console.log(`Processing ${filesToUpload.length} files with smart file processing...`);\n // Determine if what need to be updated\n const filesWithMetadata = await checkDocumentProcessing(filesToUpload, null, collectionId);\n // Create statistics for user feedback\n const toCreate = filesWithMetadata.filter((f) => f.action === FileUploadAction.CREATE).length;\n const toUpdate = filesWithMetadata.filter((f) => f.action === FileUploadAction.UPDATE).length;\n const toSkip = filesWithMetadata.filter((f) => f.action === FileUploadAction.SKIP).length;\n // Show user feedback about processed files\n toast({\n title: \"Files analyzed\",\n description: `${filesToUpload.length} file(s): ${toCreate} new, ${toUpdate} to update, ${toSkip} to skip`,\n status: \"info\",\n duration: 4000,\n });\n // Process SKIP files - add them to skipped list and result IDs\n for (const fileInfo of filesWithMetadata.filter((f) => f.action === FileUploadAction.SKIP && f.existingId)) {\n skippedFilesInfo.push({\n id: fileInfo.existingId,\n name: fileInfo.name,\n type,\n status: \"skipped\",\n location: fileInfo.location,\n });\n }\n // Collect files for processing (both CREATE and UPDATE)\n const filesToProcess = filesWithMetadata.filter((f) => (f.action === FileUploadAction.CREATE || f.action === FileUploadAction.UPDATE) && f.file);\n if (filesToProcess.length > 0) {\n console.log(`Processing ${filesToProcess.length} files (${filesToProcess.filter((f) => f.action === FileUploadAction.CREATE).length} create, ${filesToProcess.filter((f) => f.action === FileUploadAction.UPDATE).length} update)...`);\n // Create batches of 50 files\n const batchSize = 50;\n const processBatches = [];\n for (let i = 0; i < filesToProcess.length; i += batchSize) {\n processBatches.push(filesToProcess.slice(i, i + batchSize));\n }\n // Process each batch\n for (let batchIndex = 0; batchIndex < processBatches.length; batchIndex++) {\n const batch = processBatches[batchIndex];\n const processedCount = batchIndex * batchSize;\n console.log(`Processing batch ${batchIndex + 1}/${processBatches.length} (${batch.length} files)`);\n // Show progress for larger file sets\n if (filesToProcess.length > batchSize) {\n toast({\n title: \"Processing files\",\n description: `Processed ${processedCount}/${filesToProcess.length} files...`,\n status: \"info\",\n duration: 2000,\n });\n }\n // Process this batch in parallel\n const processResults = await Promise.all(batch.map(async (fileInfo) => {\n try {\n if (fileInfo.action === FileUploadAction.UPDATE && fileInfo.existingId) {\n // UPDATE - Update the existing object\n const updateResult = await client.store.objects.update(fileInfo.existingId, {\n type: type || undefined,\n content: fileInfo.file,\n location: fileInfo.location,\n name: fileInfo.name,\n }, {\n createRevision: true,\n revisionLabel: \"upload on \" + new Date().toISOString(),\n });\n // Use a separate data structure for updated files\n uploadedFilesInfo.push({\n id: fileInfo.existingId,\n name: fileInfo.name,\n type,\n status: \"updated\",\n location: fileInfo.location,\n });\n // Add to result IDs\n result.objectIds.push(fileInfo.existingId);\n return {\n success: true,\n id: updateResult.id,\n name: fileInfo.name,\n action: \"update\",\n };\n }\n else {\n // CREATE - Create a new object\n // If collectionId is provided, pass it as an option\n const options = collectionId ? { collection_id: collectionId } : undefined;\n const createResult = await store.objects.create({\n type: type || undefined,\n content: fileInfo.file,\n location: fileInfo.location || fileInfo.file.webkitRelativePath || fileInfo.name,\n }, options);\n // Track successful upload\n uploadedFilesInfo.push({\n id: createResult.id,\n name: fileInfo.name,\n type,\n status: \"created\",\n location: fileInfo.location,\n });\n }\n }\n catch (error) {\n console.error(`Failed to process file ${fileInfo.name}:`, error);\n // Track failed upload\n failedFilesInfo.push({\n name: fileInfo.name,\n error: error.message || \"Unknown error\",\n status: \"failed\",\n location: fileInfo.location,\n type,\n });\n toast({\n status: \"error\",\n title: `Processing failed for ${fileInfo.name}`,\n description: error.message,\n duration: 4000,\n });\n }\n }));\n // Log batch results\n const creates = uploadedFilesInfo.filter((f) => f.status === \"created\");\n const updates = uploadedFilesInfo.filter((f) => f.status === \"updated\");\n const failures = uploadedFilesInfo.filter((f) => f.status === \"failed\");\n console.log(`Batch ${batchIndex + 1} results:`, {\n creates,\n updates,\n failures,\n total: processResults.length,\n });\n }\n }\n const uploadedCount = uploadedFilesInfo.filter((f) => f.status === \"created\").length;\n const updatedCount = uploadedFilesInfo.filter((f) => f.status === \"updated\").length;\n const failedCount = uploadedFilesInfo.filter((f) => f.status === \"failed\").length;\n const skippedCount = uploadedFilesInfo.filter((f) => f.status === \"skipped\").length;\n // Call the original callback with all object IDs and additional metadata\n if (onUploadDone) {\n // Log the actual upload count for debugging\n console.log(\"Upload complete:\", {\n totalObjectIds: result.objectIds.length,\n uploadedFiles: uploadedCount,\n updatedFiles: updatedCount,\n skippedFiles: skippedCount,\n failedFiles: failedCount,\n });\n // Call the callback with all object IDs\n await onUploadDone(result.objectIds);\n }\n // Create a success message that includes information about all file operations\n let statusMessage = \"\";\n if (uploadedCount > 0) {\n statusMessage += `${uploadedCount} file${uploadedCount !== 1 ? \"s\" : \"\"} uploaded`;\n }\n if (updatedCount > 0) {\n statusMessage += statusMessage ? \", \" : \"\";\n statusMessage += `${updatedCount} file${updatedCount !== 1 ? \"s\" : \"\"} updated`;\n }\n if (skippedCount > 0) {\n statusMessage += statusMessage ? \", \" : \"\";\n statusMessage += `${skippedCount} file${skippedCount !== 1 ? \"s\" : \"\"} skipped (already existed)`;\n }\n if (failedCount > 0) {\n statusMessage += statusMessage ? \", \" : \"\";\n statusMessage += `${failedCount} file${failedCount !== 1 ? \"s\" : \"\"} failed`;\n }\n if (statusMessage) {\n toast({\n status: failedCount > 0 ? \"warning\" : \"success\",\n title: statusMessage,\n duration: 4000,\n });\n }\n // Refresh search results\n search.search();\n return result;\n };\n}\n//# sourceMappingURL=useUploadHandler.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { Spinner, useToast } from \"@vertesia/ui/core\";\nimport { DropZone } from '@vertesia/ui/widgets';\nimport clsx from \"clsx\";\nimport { useMemo, useState } from \"react\";\nimport { useOptionalDocumentSelection } from \"./DocumentSelectionProvider\";\nimport { DocumentTableColumn } from \"./layout/DocumentTableColumn\";\nimport { DocumentGridView, DocumentTableView } from \"./layout/documentLayout\";\nimport { useDocumentSearch } from \"./search/DocumentSearchContext\";\nimport { DocumentUploadModal, useSmartFileUploadProcessing } from \"./upload\";\nconst defaultLayout = [\n { name: \"ID\", field: \"id\", type: \"objectId?slice=-7\" },\n { name: \"Name\", field: \".\", type: \"objectName\" },\n { name: \"Type\", field: \"type.name\", type: \"string\" },\n { name: \"Status\", field: \"status\", type: \"string\" },\n { name: \"Updated At\", field: \"updated_at\", type: \"date\" },\n];\nexport function DocumentTable({ isGridView = false, onUpload, collectionId, ...others }) {\n if (onUpload) {\n return (_jsx(ObjectTableWithDropZone, { ...others, onUpload: onUpload, isGridView: isGridView, collectionId: collectionId }));\n }\n else {\n return _jsx(DocumentTableImpl, { ...others, isGridView: isGridView });\n }\n}\nfunction ObjectTableWithDropZone({ isGridView, onUpload, collectionId, skipTypeModal = false, ...others }) {\n const [isLoading, setLoading] = useState(false);\n const [files, setFiles] = useState([]);\n const [isDragging, setIsDragging] = useState(false);\n const [processedFiles, setProcessedFiles] = useState(null);\n const [typeSelectionOpen, setTypeSelectionOpen] = useState(false);\n const search = useDocumentSearch();\n const toast = useToast();\n const { checkDocumentProcessing } = useSmartFileUploadProcessing();\n // Handle file uploads when a file is dropped\n const handleFileDrop = async (droppedFiles, feedback) => {\n console.log(\"Files dropped on ObjectTable:\", droppedFiles.length, feedback);\n setLoading(true);\n try {\n // Always process files with the smart upload processing if we have a collection ID\n if (collectionId) {\n // Process files to check for duplicates, updates, etc.\n const processed = await checkDocumentProcessing(droppedFiles, null, collectionId);\n setProcessedFiles(processed);\n // Create a user-friendly summary message\n const toCreate = processed.filter((f) => f.action === \"create\").length;\n const toUpdate = processed.filter((f) => f.action === \"update\").length;\n const toSkip = processed.filter((f) => f.action === \"skip\").length;\n toast({\n title: \"Files ready to process\",\n description: `${droppedFiles.length} file(s): ${toCreate} new, ${toUpdate} to update, ${toSkip} to skip`,\n status: \"info\",\n duration: 4000,\n });\n }\n else {\n // If no collection ID, we can't check for duplicates\n setProcessedFiles(null);\n }\n }\n catch (error) {\n console.error(\"Error processing files:\", error);\n toast({\n title: \"Error processing files\",\n description: \"There was an error checking for duplicate files\",\n status: \"error\",\n duration: 4000,\n });\n // Continue with plain upload in case of error\n setProcessedFiles(null);\n }\n finally {\n setLoading(false);\n setFiles(droppedFiles);\n setIsDragging(false);\n if (skipTypeModal) {\n // If skipTypeModal is true, we skip our internal modal and call onUpload directly\n console.log(\"Skipping type modal and calling onUpload directly\", {\n filesLength: droppedFiles.length,\n processedFilesLength: processedFiles?.length,\n });\n // Pass processed files as a custom property and collectionId as the third parameter\n const uploadPromise = onUpload(droppedFiles, null, collectionId);\n // Attach the processed files to the promise for parent components to use\n if (uploadPromise && typeof uploadPromise === \"object\") {\n uploadPromise.processedFiles = processedFiles;\n }\n }\n else {\n // Otherwise, open our type selection modal\n console.log(\"Setting typeSelectionOpen to true\", { filesLength: droppedFiles.length });\n setTypeSelectionOpen(true);\n }\n }\n };\n // Handle the type selection and start the upload\n const onDoUpload = (typeId) => {\n const filesToUpload = [...files]; // Make a copy to be safe\n // Reset state variables\n setFiles([]);\n setProcessedFiles(null);\n setTypeSelectionOpen(false);\n // If typeid is undefined we cancel the upload\n if (filesToUpload.length > 0 && typeId !== undefined) {\n setLoading(true);\n console.log(\"Starting upload with\", {\n typeId,\n filesCount: filesToUpload.length,\n hasProcessingResults: !!processedFiles,\n collectionId,\n });\n onUpload(filesToUpload, typeId, collectionId).finally(() => {\n setLoading(false);\n search.search(); // Refresh the search results after upload\n });\n }\n };\n // Handle drag events to show the drop zone\n const handleDragOver = (e) => {\n e.preventDefault();\n e.stopPropagation();\n setIsDragging(true);\n };\n const handleDragLeave = (e) => {\n e.preventDefault();\n e.stopPropagation();\n // Only set dragging to false if leaving the container (not entering a child)\n if (e.currentTarget.contains(e.relatedTarget)) {\n return;\n }\n setIsDragging(false);\n };\n return (_jsxs(\"div\", { className: \"min-h-[400px] relative\", onDragOver: handleDragOver, onDragEnter: handleDragOver, onDragLeave: handleDragLeave, onDrop: (e) => {\n e.preventDefault();\n e.stopPropagation();\n setIsDragging(false);\n // Get the files from the drop event\n if (e.dataTransfer.items) {\n const files = [];\n for (let i = 0; i < e.dataTransfer.items.length; i++) {\n const item = e.dataTransfer.items[i];\n if (item.kind === \"file\") {\n const file = item.getAsFile();\n if (file)\n files.push(file);\n }\n }\n if (files.length > 0) {\n const feedback = {\n count: files.length,\n message: `Preparing to upload ${files.length} file${files.length === 1 ? \"\" : \"s\"}...`,\n };\n handleFileDrop(files, feedback);\n }\n }\n }, children: [_jsx(\"div\", { className: clsx(\"bg-white dark:bg-gray-800 opacity-40 absolute inset-0 z-50 flex justify-center items-center\", isLoading ? \"block\" : \"hidden\"), children: _jsx(Spinner, { size: \"xl\" }) }), _jsx(DocumentTableImpl, { ...others, isGridView: isGridView }), _jsx(\"div\", { className: clsx(\"absolute inset-0 pointer-events-none\", isDragging ? \"z-40\" : \"-z-10\"), children: _jsx(\"div\", { className: \"w-full h-full relative\", children: _jsx(DropZone, { onDrop: handleFileDrop, message: \"Drop files or folders here to upload\", className: clsx(\"absolute inset-0 bg-white/90 dark:bg-gray-800/90 pointer-events-auto\", isDragging ? \"flex\" : \"hidden\"), buttonLabel: \"Select Files or Folders\", allowFolders: true }) }) }), _jsx(DocumentUploadModal, { isOpen: typeSelectionOpen && files.length > 0, onClose: () => {\n // Reset state variables and close the modal\n setFiles([]);\n setProcessedFiles(null);\n setTypeSelectionOpen(false);\n onDoUpload(undefined);\n }, files: files, collectionId: collectionId, selectedFolder: null, title: \"Upload Files\", onUploadComplete: (result) => {\n // Handle upload completion\n if (result) {\n // If there are failures, show them\n if (result.failedFiles && result.failedFiles.length > 0) {\n toast({\n title: \"Upload Issues\",\n description: `${result.failedFiles.length} file(s) failed to upload`,\n status: \"warning\",\n duration: 5000,\n });\n }\n // On success, summarize the results\n if (result.success) {\n const created = result.uploadedFiles.filter((f) => f.status === \"created\").length;\n const updated = result.uploadedFiles.filter((f) => f.status === \"updated\").length;\n const skipped = result.skippedFiles.length;\n if (created > 0 || updated > 0) {\n toast({\n title: \"Upload Complete\",\n description: `${created > 0 ? `${created} created` : \"\"}${created > 0 && updated > 0 ? \", \" : \"\"}${updated > 0 ? `${updated} updated` : \"\"}${skipped > 0 ? `, ${skipped} skipped` : \"\"}`,\n status: \"success\",\n duration: 5000,\n });\n }\n }\n // Force search refresh\n search.search();\n }\n // Close modal and reset state without passing result\n setFiles([]);\n setProcessedFiles(null);\n setTypeSelectionOpen(false);\n // Complete the upload process with type ID if successful\n if (result && result.success && result.objectIds.length > 0) {\n // We don't have type information here, so pass null (process completed)\n onDoUpload(null);\n }\n else {\n // Cancel the upload\n onDoUpload(undefined);\n }\n } })] }));\n}\nfunction DocumentTableImpl({ objects, layout = defaultLayout, isLoading, onRowClick, onSelectionChange, previewObject, selectedObject, isGridView, }) {\n const selection = useOptionalDocumentSelection();\n const _onSelectionChange = (object, ev) => {\n if (selection) {\n const isShift = ev.nativeEvent.shiftKey;\n const checked = ev.target.checked;\n if (!checked) {\n selection.remove(object.id);\n }\n else {\n selection.add(object);\n if (isShift) {\n const index = objects.findIndex((obj) => obj.id === object.id);\n const prev = findPreviousSelected(objects, index, selection);\n if (prev > -1 && prev < index - 1) {\n const toSelect = [];\n for (let i = prev + 1; i < index; i++) {\n toSelect.push(objects[i]);\n }\n selection.addAll(toSelect);\n }\n else {\n const next = findNextSelected(objects, index, selection);\n if (next > -1 && next > index + 1) {\n const toSelect = [];\n for (let i = index + 1; i < next; i++) {\n toSelect.push(objects[i]);\n }\n selection.addAll(toSelect);\n }\n }\n }\n }\n onSelectionChange && onSelectionChange(selection);\n }\n };\n const toggleAll = (ev) => {\n if (selection) {\n const checked = ev.target.checked;\n if (!checked) {\n // remove all\n selection.removeAll();\n }\n else {\n selection.addAll(objects);\n }\n }\n };\n const columns = useMemo(() => {\n // avoid rendering empty layouts\n const actualLayout = layout.length > 0 ? layout : defaultLayout;\n return actualLayout.map((col) => new DocumentTableColumn(col, previewObject));\n }, [layout, previewObject]);\n return isGridView ? (_jsx(DocumentGridView, { objects: objects, isLoading: isLoading, columns: columns, onRowClick: onRowClick, previewObject: previewObject, selectedObject: selectedObject, selection: selection, toggleAll: toggleAll, onSelectionChange: _onSelectionChange })) : (_jsx(DocumentTableView, { objects: objects, isLoading: isLoading, columns: columns, onRowClick: onRowClick, previewObject: previewObject, selectedObject: selectedObject, selection: selection, toggleAll: toggleAll, onSelectionChange: _onSelectionChange }));\n}\nfunction findPreviousSelected(objects, index, selection) {\n for (let i = index - 1; i >= 0; i--) {\n if (selection.isSelected(objects[i].id)) {\n return i;\n }\n }\n return -1;\n}\nfunction findNextSelected(objects, index, selection) {\n const length = objects.length;\n for (let i = index + 1; i < length; i++) {\n if (selection.isSelected(objects[i].id)) {\n return i;\n }\n }\n return -1;\n}\n//# sourceMappingURL=DocumentTable.js.map","import { jsx as _jsx } from \"react/jsx-runtime\";\nimport { useUserSession } from \"@vertesia/ui/session\";\nimport { useMemo } from \"react\";\nimport { DocumentSearch, SearchContext } from \"./DocumentSearchContext\";\nexport function DocumentSearchProvider({ children, limit, parent, typeId, facets, name, collectionId }) {\n const { store } = useUserSession();\n const search = useMemo(() => {\n let facetSpecs;\n if (facets) {\n facetSpecs = facets;\n }\n else {\n facetSpecs = [\n {\n name: 'status',\n field: 'status'\n },\n {\n name: 'location',\n field: 'location'\n }\n ];\n if (!typeId) {\n facetSpecs.unshift({\n name: 'type',\n field: 'type'\n });\n }\n }\n const search = new DocumentSearch(store, limit).withFacets(facetSpecs);\n search.collectionId = collectionId;\n search.query.type = typeId;\n search.query.parent = parent;\n search.query.name = name;\n return search;\n }, [typeId, limit, collectionId]);\n return (_jsx(SearchContext.Provider, { value: search, children: children }));\n}\n//# sourceMappingURL=DocumentSearchProvider.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { Button, ErrorBox, Spinner, useIntersectionObserver } from \"@vertesia/ui/core\";\nimport { useEffect, useRef, useState } from \"react\";\nimport { DocumentsFacetsNav } from \"../../../facets\";\nimport { DocumentTable } from \"../DocumentTable\";\nimport { useDocumentSearch, useWatchDocumentSearchFacets, useWatchDocumentSearchResult } from \"../search/DocumentSearchContext\";\nimport { DocumentSearchProvider } from \"../search/DocumentSearchProvider\";\nimport { ContentDispositionButton } from \"./ContentDispositionButton\";\nimport { RefreshCw } from \"lucide-react\";\nconst layout = [\n { \"name\": \"Name\", \"field\": \"properties.title\", \"type\": \"string\", \"fallback\": \"name\" },\n { \"name\": \"Type\", \"field\": \"type.name\", \"type\": \"string\" },\n { \"name\": \"Status\", \"field\": \"status\", \"type\": \"string\" },\n { \"name\": \"Created At\", \"field\": \"created_at\", \"type\": \"date\" }\n];\nexport function SelectDocument({ onChange }) {\n const onRowClick = (selected) => {\n onChange(selected || undefined);\n };\n return (_jsx(DocumentSearchProvider, { children: _jsx(SelectDocumentImpl, { onRowClick: onRowClick }) }));\n}\nconst LAST_DISPLAYED_VIEW = 'vertesia.content_store.lastDisplayedView';\nfunction SelectDocumentImpl({ onRowClick }) {\n const [isReady, setIsReady] = useState(false);\n const [isGridView, setIsGridView] = useState(localStorage.getItem(LAST_DISPLAYED_VIEW) === 'grid');\n const { search, isLoading, error, objects } = useWatchDocumentSearchResult();\n const loadMoreRef = useRef(null);\n useIntersectionObserver(loadMoreRef, () => {\n isReady && search.loadMore(true);\n }, { deps: [isReady] });\n useEffect(() => {\n search.search().then(() => setIsReady(true));\n }, []);\n const facets = useWatchDocumentSearchFacets();\n const facetSearch = useDocumentSearch();\n const handleRefetch = () => {\n setIsReady(false);\n search.search().then(() => setIsReady(true));\n };\n if (error) {\n return _jsx(ErrorBox, { title: \"Search failed\", children: error.message });\n }\n return (_jsxs(\"div\", { children: [_jsxs(\"div\", { className: \"flex justify-between items-center mb-4\", children: [_jsx(DocumentsFacetsNav, { facets: facets, search: facetSearch }), _jsxs(\"div\", { className: \"flex items-center gap-2\", children: [_jsx(Button, { variant: \"outline\", onClick: handleRefetch, alt: \"Refresh\", children: _jsx(RefreshCw, { size: 16 }) }), _jsx(ContentDispositionButton, { onUpdate: setIsGridView })] })] }), _jsx(DocumentTable, { objects: objects || [], isLoading: false, layout: layout, onRowClick: onRowClick, isGridView: isGridView }), _jsx(\"div\", { ref: loadMoreRef, className: 'mt-10' }), isLoading && _jsx(\"div\", { className: 'flex justify-center', children: _jsx(Spinner, { size: 'xl' }) })] }));\n}\n//# sourceMappingURL=SelectDocument.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { VModal, VModalBody, VModalTitle } from \"@vertesia/ui/core\";\nimport { SelectDocument } from \"./SelectDocument\";\nexport function SelectDocumentModal({ isOpen, onClose }) {\n return (_jsxs(VModal, { onClose: () => onClose(), isOpen: !!isOpen, className: 'min-w-[60vw]', children: [_jsx(VModalTitle, { children: \"Select Content\" }), _jsx(VModalBody, { className: 'pt-0 overflow-y-auto max-h-[80vh] min-h-[80vh]', children: isOpen && _jsx(SelectDocument, { onChange: onClose }) })] }));\n}\n//# sourceMappingURL=SelectDocumentModal.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport clsx from 'clsx';\nimport { useEffect, useState } from 'react';\nimport { useUserSession } from '@vertesia/ui/session';\nimport { ChevronsUpDown, X } from 'lucide-react';\nimport { Button, Styles, useFlag } from '@vertesia/ui/core';\nimport { SelectDocumentModal } from './SelectDocumentModal';\nconst STORE_REGEX = /store:([a-f0-9]+)/;\nexport function DocumentInput({ object }) {\n const { client } = useUserSession();\n const { off, on, isOn } = useFlag();\n const [actualValue, setValue] = useState(object.value != null ? String(object.value) : '');\n const [doc, setDoc] = useState(undefined);\n const _onChange = (event) => {\n const value = event.target.value;\n setValue(value);\n object.value = value;\n };\n const clearValue = () => {\n setValue('');\n object.value = '';\n setDoc(undefined);\n };\n const onSelect = (value) => {\n if (value) {\n const uri = \"store:\" + value.id;\n setValue(uri);\n setDoc(value || undefined);\n object.value = uri;\n }\n off();\n };\n useEffect(() => {\n if (!actualValue || doc) {\n return;\n }\n const match = actualValue.match(STORE_REGEX);\n if (!match) {\n return;\n }\n client.objects.get(match[1]).then((doc) => {\n setDoc(doc);\n }).catch(() => {\n clearValue();\n });\n }, [actualValue]);\n return (_jsxs(\"div\", { children: [_jsxs(\"div\", { className: \"relative\", children: [_jsx(\"input\", { value: actualValue, onChange: _onChange, className: clsx(Styles.INPUT, \"pr-10 w-full\") }), doc &&\n _jsx(\"div\", { className: \"absolute inset-y-0 right-10 flex items-center justify-center \", children: _jsx(Button, { onClick: clearValue, variant: 'unstyled', className: 'hover:text-red-500 hover:bg-gray-100 dark:hover:bg-gray-600', children: _jsx(X, { className: \"size-5\" }) }) }), _jsx(\"div\", { className: \"absolute inset-y-0 right-0 flex items-center justify-center\", children: _jsx(Button, { onClick: on, variant: 'unstyled', className: 'hover:bg-gray-100 dark:hover:bg-gray-600', children: _jsx(ChevronsUpDown, { className: \"size-5\" }) }) }), _jsx(SelectDocumentModal, { value: actualValue, isOpen: isOn, onClose: onSelect })] }), doc &&\n _jsx(\"div\", { className: \"p-1 semibold text-sm text-gray-600 dark:text-slate-300\", children: doc.properties?.title || doc.name })] }));\n}\n//# sourceMappingURL=DocumentInput.js.map","export function useDownloadDocument(client, toast, uri, name) {\n const onDownload = () => {\n if (uri) {\n client.files\n .getDownloadUrlWithOptions({ file: uri, name })\n .then((r) => {\n window.open(r.url, \"_blank\");\n })\n .catch((err) => {\n toast({\n status: \"error\",\n title: \"Failed to get download URL\",\n description: err.message,\n duration: 5000,\n });\n });\n }\n };\n return onDownload;\n}\n//# sourceMappingURL=useDownloadObject.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { ImageRenditionFormat } from \"@vertesia/common\";\nimport { Button, Spinner, useToast } from \"@vertesia/ui/core\";\nimport { useNavigate } from \"@vertesia/ui/router\";\nimport { useUserSession } from \"@vertesia/ui/session\";\nimport { JSONDisplay, MarkdownRenderer } from \"@vertesia/ui/widgets\";\nimport { ChevronRight, Download, FileText, Info, LayoutGrid, Maximize2, X, } from \"lucide-react\";\nimport { useEffect, useState } from \"react\";\nexport function DocumentPreviewPanel({ objectId, isOpen, onClose, }) {\n const navigate = useNavigate();\n const { client, store } = useUserSession();\n const [object, setObject] = useState(null);\n const [isLoading, setIsLoading] = useState(false);\n const [loadingText, setLoadingText] = useState(false);\n const [text, setText] = useState();\n const [imageUrl, setImageUrl] = useState();\n const [currentTab, setCurrentTab] = useState(\"preview\");\n const toast = useToast();\n useEffect(() => {\n if (objectId && isOpen) {\n setIsLoading(true);\n store.objects\n .retrieve(objectId, \"+embeddings\")\n .then((result) => {\n setObject(result);\n // If the object has text, use it\n if (result.text) {\n setText(result.text);\n }\n else {\n // Otherwise, fetch text\n loadObjectText(result.id);\n }\n // If it's an image, load the image URL\n const content = result.content;\n const isImage = content &&\n content.source &&\n content.type &&\n content.type.startsWith(\"image/\");\n if (isImage) {\n loadImageUrl(result);\n }\n })\n .catch((error) => {\n console.error(\"Error loading object:\", error);\n toast({\n title: \"Error\",\n description: \"Failed to load document\",\n status: \"error\",\n duration: 3000,\n });\n })\n .finally(() => {\n setIsLoading(false);\n });\n }\n else {\n // Reset state when panel closes\n setObject(null);\n setText(undefined);\n setImageUrl(undefined);\n }\n }, [objectId, isOpen, store.objects]);\n const loadObjectText = async (id) => {\n setLoadingText(true);\n try {\n const result = await store.objects.getObjectText(id);\n setText(result.text);\n }\n catch (error) {\n console.error(\"Error loading text:\", error);\n }\n finally {\n setLoadingText(false);\n }\n };\n const loadImageUrl = async (obj) => {\n try {\n // Try to get a rendition first\n const rendition = await client.objects.getRendition(obj.id, {\n format: ImageRenditionFormat.jpeg,\n generate_if_missing: false,\n });\n // Don't use rendition object to avoid type issues\n if (rendition.status === \"found\") {\n console.log(\"Found rendition\");\n }\n // Get download URL\n const downloadUrlResult = await client.files.getDownloadUrl(obj.content.source);\n setImageUrl(downloadUrlResult.url);\n }\n catch (error) {\n console.error(\"Error loading image:\", error);\n }\n };\n const handleViewFullDocument = () => {\n if (object) {\n navigate(`/legal/objects/${object.id}`);\n onClose();\n }\n };\n const seemsMarkdown = text &&\n (text.startsWith(\"#\") || text.includes(\"\\n#\") || text.includes(\"\\n*\"));\n const isImage = object?.content?.type && object.content.type.startsWith(\"image/\");\n const isPdf = object?.content?.type === \"application/pdf\";\n if (!isOpen)\n return null;\n return (_jsxs(\"div\", { className: `fixed inset-y-0 right-0 w-2/5 dark:bg-slate-900 shadow-xl z-50 flex flex-col transition-transform duration-300 transform ${isOpen ? \"translate-x-0\" : \"translate-x-full\"}`, children: [_jsxs(\"div\", { className: \"flex items-center justify-between px-4 py-3 border-b dark:border-gray-700 bg-gradient-to-r from-indigo-50 to-gray-50 dark:from-gray-800 dark:to-gray-900\", children: [_jsxs(\"div\", { className: \"flex items-center\", children: [_jsx(FileText, { className: \"h-5 w-5 text-indigo-600 mr-2\" }), _jsx(\"h2\", { className: \"text-lg font-semibold text-gray-800 dark:text-gray-200 truncate\", children: isLoading\n ? \"Loading document...\"\n : object?.name || \"Document Preview\" })] }), _jsxs(\"div\", { className: \"flex items-center space-x-2\", children: [_jsxs(Button, { variant: \"ghost\", size: \"sm\", onClick: handleViewFullDocument, className: \"flex items-center gap-1 text-indigo-600 hover:text-indigo-800\", children: [_jsx(Maximize2, { className: \"h-4 w-4\" }), _jsx(\"span\", { children: \"Full View\" })] }), _jsx(Button, { variant: \"ghost\", size: \"sm\", onClick: onClose, className: \"flex items-center text-gray-600 hover:text-gray-800 dark:text-gray-300 dark:hover:text-gray-100\", children: _jsx(X, { className: \"h-5 w-5\" }) })] })] }), isLoading ? (_jsx(\"div\", { className: \"flex-1 flex items-center justify-center\", children: _jsxs(\"div\", { className: \"text-center\", children: [_jsx(Spinner, { size: \"lg\", className: \"text-indigo-600 dark:text-indigo-400 mb-2\" }), _jsx(\"p\", { className: \"text-gray-600 dark:text-gray-400\", children: \"Loading document...\" })] }) })) : (_jsxs(\"div\", { className: \"flex-1 flex flex-col h-full\", children: [_jsx(\"div\", { className: \"border-b\", children: _jsxs(\"div\", { className: \"flex px-4\", children: [_jsx(\"button\", { className: `py-2 px-4 font-medium border-b-2 ${currentTab === \"preview\"\n ? \"border-indigo-600 text-indigo-700 dark:text-indigo-300\"\n : \"border-transparent text-gray-500 hover:text-gray-700 dark:text-gray-400 dark:hover:text-gray-200\"}`, onClick: () => setCurrentTab(\"preview\"), children: _jsxs(\"div\", { className: \"flex items-center gap-1\", children: [_jsx(LayoutGrid, { className: \"h-4 w-4\" }), _jsx(\"span\", { children: \"Preview\" })] }) }), _jsx(\"button\", { className: `py-2 px-4 font-medium border-b-2 ${currentTab === \"properties\"\n ? \"border-indigo-600 text-indigo-700 dark:text-indigo-300\"\n : \"border-transparent text-gray-500 hover:text-gray-700 dark:text-gray-400 dark:hover:text-gray-200\"}`, onClick: () => setCurrentTab(\"properties\"), children: _jsxs(\"div\", { className: \"flex items-center gap-1\", children: [_jsx(Info, { className: \"h-4 w-4\" }), _jsx(\"span\", { children: \"Properties\" })] }) })] }) }), _jsxs(\"div\", { className: \"flex-1 overflow-auto p-4\", children: [currentTab === \"preview\" && (_jsxs(\"div\", { className: \"h-full\", children: [loadingText ? (_jsx(\"div\", { className: \"flex items-center justify-center h-40\", children: _jsx(Spinner, { size: \"md\", className: \"text-indigo-600 dark:text-indigo-400\" }) })) : text ? (_jsx(\"div\", { className: \"shadow rounded-md p-4 border border-gray-200 dark:border-gray-700 bg-white dark:bg-gray-800\", children: seemsMarkdown ? (_jsx(\"div\", { className: \"prose prose-sm max-w-none prose-p:my-2 prose-pre:bg-gray-800 prose-pre:my-2 prose-headings:text-indigo-700 dark:prose-invert dark:prose-headings:text-indigo-300\", children: _jsx(MarkdownRenderer, { children: text }) })) : (_jsx(\"pre\", { className: \"text-wrap whitespace-pre-wrap dark:text-gray-200\", children: text })) })) : null, isImage && (_jsx(\"div\", { className: \"mt-4\", children: imageUrl ? (_jsx(\"div\", { className: \"border border-gray-200 dark:border-gray-700 rounded-md p-2 bg-white dark:bg-gray-800\", children: _jsx(\"img\", { src: imageUrl, alt: object?.name, className: \"mx-auto max-h-[70vh] object-contain\" }) })) : (_jsx(\"div\", { className: \"flex items-center justify-center h-40\", children: _jsx(Spinner, { size: \"md\", className: \"text-indigo-600 dark:text-indigo-400\" }) })) })), isPdf && (_jsxs(\"div\", { className: \"flex flex-col items-center justify-center h-64 border border-gray-200 dark:border-gray-700 rounded-md p-4 bg-gray-50 dark:bg-gray-800\", children: [_jsx(FileText, { className: \"h-16 w-16 text-indigo-300 dark:text-indigo-400 mb-4\" }), _jsxs(\"p\", { className: \"text-gray-600 dark:text-gray-400 text-center mb-4\", children: [\"PDF document preview is available in full view. TODO\", \" \"] }), _jsx(Button, { onClick: handleViewFullDocument, className: \"bg-indigo-600 hover:bg-indigo-700 text-white\", children: \"Open Full Document View\" })] })), !isImage && !text && !isPdf && !loadingText && (_jsxs(\"div\", { className: \"flex flex-col items-center justify-center h-64 border border-gray-200 dark:border-gray-700 rounded-md p-4 bg-gray-50 dark:bg-gray-800\", children: [_jsx(FileText, { className: \"h-16 w-16 text-gray-300 dark:text-gray-600 mb-4\" }), _jsx(\"p\", { className: \"text-gray-600 dark:text-gray-400 text-center\", children: \"No preview available for this document type.\" })] }))] })), currentTab === \"properties\" && object && (_jsxs(\"div\", { className: \"h-full\", children: [object.properties ? (_jsx(\"div\", { className: \"shadow rounded-md p-4 border border-gray-200 dark:border-gray-700 bg-white dark:bg-gray-800\", children: _jsx(JSONDisplay, { value: object.properties }) })) : (_jsxs(\"div\", { className: \"flex flex-col items-center justify-center h-64 border border-gray-200 dark:border-gray-700 rounded-md p-4 bg-gray-50 dark:bg-gray-800\", children: [_jsx(Info, { className: \"h-16 w-16 text-gray-300 dark:text-gray-600 mb-4\" }), _jsx(\"p\", { className: \"text-gray-600 dark:text-gray-400 text-center\", children: \"No properties available for this document.\" })] })), _jsxs(\"div\", { className: \"mt-4\", children: [_jsx(\"h3\", { className: \"text-sm font-semibold text-gray-700 dark:text-gray-300 mb-2\", children: \"Document Information\" }), _jsx(\"div\", { className: \"shadow rounded-md p-4 border border-gray-200 dark:border-gray-700 bg-white dark:bg-gray-800\", children: _jsxs(\"div\", { className: \"grid grid-cols-2 gap-y-2 gap-x-4 text-sm\", children: [_jsx(\"div\", { className: \"text-gray-500 dark:text-gray-400\", children: \"ID\" }), _jsx(\"div\", { className: \"font-medium dark:text-gray-200\", children: object.id }), _jsx(\"div\", { className: \"text-gray-500 dark:text-gray-400\", children: \"Type\" }), _jsx(\"div\", { className: \"font-medium dark:text-gray-200\", children: object.type?.name || \"Unknown\" }), _jsx(\"div\", { className: \"text-gray-500 dark:text-gray-400\", children: \"Content Type\" }), _jsx(\"div\", { className: \"font-medium dark:text-gray-200\", children: object.content?.type || \"N/A\" }), _jsx(\"div\", { className: \"text-gray-500\", children: \"Size\" }), _jsx(\"div\", { className: \"font-medium\", children: object.content && \"size\" in object.content\n ? formatFileSize(object.content.size)\n : \"Unknown\" }), _jsx(\"div\", { className: \"text-gray-500\", children: \"Created\" }), _jsx(\"div\", { className: \"font-medium\", children: object.created_at\n ? new Date(object.created_at).toLocaleString()\n : \"N/A\" }), _jsx(\"div\", { className: \"text-gray-500\", children: \"Updated\" }), _jsx(\"div\", { className: \"font-medium\", children: object.updated_at\n ? new Date(object.updated_at).toLocaleString()\n : \"N/A\" })] }) })] })] }))] })] })), _jsxs(\"div\", { className: \"flex items-center justify-between p-4 border-t bg-gray-50 dark:bg-gray-800 dark:border-gray-700\", children: [_jsx(\"div\", { children: object?.content?.source && (_jsxs(Button, { onClick: () => {\n if (object?.content?.source) {\n client.files\n .getDownloadUrl(object.content.source)\n .then((result) => {\n window.open(result.url, \"_blank\");\n })\n .catch((error) => {\n console.error(\"Error getting download URL:\", error);\n toast({\n title: \"Error\",\n description: \"Failed to download file\",\n status: \"error\",\n duration: 3000,\n });\n });\n }\n }, variant: \"outline\", className: \"text-indigo-600 border-indigo-300 hover:bg-indigo-50\", children: [_jsx(Download, { className: \"h-4 w-4 mr-2\" }), \"Download\"] })) }), _jsxs(Button, { onClick: handleViewFullDocument, className: \"bg-indigo-600 hover:bg-indigo-700 text-white\", children: [\"Open Full Document\", _jsx(ChevronRight, { className: \"h-4 w-4 ml-2\" })] })] })] }));\n}\nfunction formatFileSize(bytes) {\n if (bytes === 0)\n return \"0 Bytes\";\n const k = 1024;\n const sizes = [\"Bytes\", \"KB\", \"MB\", \"GB\", \"TB\"];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + \" \" + sizes[i];\n}\n//# sourceMappingURL=DocumentPreviewPanel.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { useEffect, useState } from 'react';\nimport { SupportedEmbeddingTypes, SearchTypes } from '@vertesia/common';\nimport { Button, Input, useToast, Modal, ModalTitle, ModalBody, ModalFooter, Checkbox, NumberInput } from '@vertesia/ui/core';\nimport { useUserSession } from '@vertesia/ui/session';\nimport { Settings } from 'lucide-react';\nconst allTypes = Object.values(SearchTypes);\nconst embeddingTypes = Object.values(SupportedEmbeddingTypes);\nexport function VectorSearchWidget({ onChange, isLoading, refresh, searchTypes }) {\n const { client, project } = useUserSession();\n const toast = useToast();\n const [searchText, setSearchText] = useState(undefined);\n const [config, setConfig] = useState(undefined);\n const isReady = !!project && (!!config?.embeddings.text || !!config?.embeddings.image);\n const [status, setStatus] = useState(undefined);\n const [showSettings, setShowSettings] = useState(false);\n // Default to all types, or use prop if provided\n const [selectedTypes, setSelectedTypes] = useState(searchTypes || allTypes);\n const [limit, setLimit] = useState(100);\n useEffect(() => {\n if (searchTypes)\n setSelectedTypes(searchTypes);\n }, [searchTypes]);\n // Always derive embeddingSearchTypes and full_text from selectedTypes\n const embeddingSearchTypes = {};\n let fullTextEnabled = false;\n let vectorSearchEnabled = false;\n selectedTypes.forEach(type => {\n if (type === SearchTypes.full_text) {\n fullTextEnabled = true;\n }\n else {\n vectorSearchEnabled = true;\n }\n if (embeddingTypes.includes(type)) {\n embeddingSearchTypes[type] = true;\n }\n });\n useEffect(() => {\n setSearchText(undefined);\n setStatus(undefined);\n }, [refresh]);\n useEffect(() => {\n if (!project)\n return;\n client.projects.retrieve(project.id).then((project) => {\n setConfig(project.configuration);\n });\n }, [project]);\n useEffect(() => {\n if (status) {\n toast({ title: status, status: 'success', duration: 2000 });\n }\n }, [status]);\n useEffect(() => {\n if (!searchText || searchText.length === 0) {\n onChange(undefined);\n }\n }, [searchText]);\n const fireSearch = () => {\n if (!isReady || !searchText)\n return;\n const query = {\n vector: vectorSearchEnabled ? {\n text: searchText,\n config: embeddingSearchTypes,\n } : undefined,\n full_text: fullTextEnabled ? searchText : undefined,\n limit: limit\n };\n onChange(query);\n setStatus(\"Searching...\");\n };\n const handleKeyPress = (e) => {\n if (e.key === \"Enter\") {\n fireSearch();\n }\n };\n // Modal state for search type selection\n const handleCheckboxChange = (type) => (checked) => {\n if (checked) {\n setSelectedTypes(prev => Array.from(new Set([...prev, type])));\n }\n else {\n setSelectedTypes(prev => prev.filter(t => t !== type));\n }\n };\n return (_jsxs(\"div\", { className: \"flex gap-1 items-center w-1/2\", children: [_jsx(Input, { placeholder: \"Type what you are looking for, or select a filter\", value: searchText, onChange: setSearchText, onKeyDown: handleKeyPress }), _jsx(Button, { variant: \"ghost\", onClick: () => setShowSettings(true), alt: \"Semantic search settings\", className: \"ml-1\", children: _jsx(Settings, { size: 18 }) }), _jsxs(Modal, { isOpen: showSettings, onClose: () => setShowSettings(false), children: [_jsx(ModalTitle, { children: \"Search Types\" }), _jsx(ModalBody, { children: _jsxs(\"div\", { className: \"flex flex-col gap-2\", children: [_jsxs(\"label\", { className: \"flex items-center gap-2\", children: [_jsx(Checkbox, { checked: selectedTypes.includes(SearchTypes.full_text), onCheckedChange: handleCheckboxChange(SearchTypes.full_text) }), _jsx(\"span\", { children: \"Full Text\" })] }), _jsx(\"div\", { className: \"font-semibold mt-2 mb-1\", children: \"Embeddings\" }), embeddingTypes.map(type => (_jsxs(\"label\", { className: \"flex items-center gap-2\", children: [_jsx(Checkbox, { checked: selectedTypes.includes(type), onCheckedChange: handleCheckboxChange(type) }), _jsx(\"span\", { children: type.charAt(0).toUpperCase() + type.slice(1) })] }, type))), _jsxs(\"div\", { className: \"mt-3\", children: [_jsx(\"span\", { className: \"mr-2\", children: \"Limit\" }), _jsx(NumberInput, { type: \"number\", min: 1, value: limit, onChange: v => setLimit(Number(v) || 1), style: { width: 80 } })] })] }) }), _jsx(ModalFooter, { children: _jsx(Button, { variant: \"outline\", onClick: () => setShowSettings(false), children: \"Close\" }) })] }), _jsx(Button, { variant: \"secondary\", isLoading: isLoading, onClick: fireSearch, isDisabled: !isReady, alt: \"Semantic search\", children: \"Search\" })] }));\n}\n//# sourceMappingURL=VectorSearchWidget.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { useRef, useState, useEffect } from \"react\";\nimport { Button, Divider, ErrorBox, SidePanel, Spinner, useIntersectionObserver, useToast, FilterProvider, FilterBtn, FilterBar, FilterClear } from '@vertesia/ui/core';\nimport { useNavigate } from \"@vertesia/ui/router\";\nimport { useUserSession } from '@vertesia/ui/session';\nimport { Download, RefreshCw, ExternalLink } from 'lucide-react';\nimport { useDocumentFilterGroups, useDocumentFilterHandler } from \"../../facets/DocumentsFacetsNav\";\nimport { VectorSearchWidget } from './components/VectorSearchWidget';\nimport { ContentDispositionButton } from './components/ContentDispositionButton';\nimport { DocumentTable } from './DocumentTable';\nimport { useDocumentSearch, useWatchDocumentSearchFacets, useWatchDocumentSearchResult } from './search/DocumentSearchContext';\nimport { useDocumentUploadHandler } from './upload/useUploadHandler';\nimport { ContentOverview } from './components/ContentOverview';\nimport { useDownloadDocument } from './components/useDownloadObject';\nconst defaultLayout = [\n { name: \"ID\", field: \"id\", type: \"objectId?slice=-7\" },\n { name: \"Name\", field: \".\", type: \"objectName\" },\n { name: \"Type\", field: \"type.name\", type: \"string\" },\n { name: \"Status\", field: \"status\", type: \"string\" },\n { name: \"Updated At\", field: \"updated_at\", type: \"date\" },\n];\nfunction getTableLayout(registry, type) {\n const layout = type ? registry.getTypeLayout(type) : defaultLayout;\n console.log('[DEBUG] getTableLayout called with type:', type);\n console.log('[DEBUG] Layout from registry:', layout);\n console.log('[DEBUG] Using defaultLayout?', layout === defaultLayout);\n const result = layout ?? defaultLayout;\n console.log('[DEBUG] Final layout:', result);\n console.log('[DEBUG] Has Status field?', result.some(col => col.field === 'status'));\n return result;\n}\nexport function DocumentSearchResultsWithDropZone({ onUploadDone = async () => { }, layout }) {\n const search = useDocumentSearch();\n const toast = useToast();\n // Create a wrapper around the onUploadDone callback that also refreshes the search\n const handleUploadDone = async (objectIds) => {\n // First, call the original callback\n await onUploadDone(objectIds);\n // Use a timeout to let the backend catch up, then refresh the search results\n setTimeout(() => {\n console.log('Delayed refresh after upload to ensure backend consistency');\n search.search().then(() => {\n // Notify the user that the list has been refreshed\n toast({\n title: \"Document list refreshed\",\n description: \"The document list has been updated with your uploaded files.\",\n status: \"info\",\n duration: 3000,\n });\n }).catch(err => {\n console.error('Failed to refresh search results:', err);\n });\n }, 1000); // 1-second delay for backend processing\n };\n // Use the enhanced standard upload handler with smart processing\n const uploadHandler = useDocumentUploadHandler(handleUploadDone);\n // Wrap the uploadHandler to ensure the collectionId is passed\n const wrappedUploadHandler = (files, type) => {\n // Get the collection ID from the search context\n const collectionId = search.collectionId;\n return uploadHandler(files, type, collectionId);\n };\n return _jsx(DocumentSearchResults, { layout: layout, onUpload: wrappedUploadHandler });\n}\nexport function DocumentSearchResults({ layout, onUpload, allowFilter = true, allowSearch = true }) {\n // Get the search context to access collectionId\n const searchContext = useDocumentSearch();\n const [isReady, setIsReady] = useState(false);\n const [selectedObject, setSelectedObject] = useState(null);\n const { typeRegistry } = useUserSession();\n const { search, isLoading, error, objects, hasMore } = useWatchDocumentSearchResult();\n const [actualLayout, setActualLayout] = useState(typeRegistry ? layout || getTableLayout(typeRegistry, search.query.type) : defaultLayout);\n console.log('[DEBUG] DocumentSearchResults - actualLayout:', actualLayout);\n console.log('[DEBUG] DocumentSearchResults - actualLayout has Status?', actualLayout.some(col => col.field === 'status'));\n //TODO _setRefreshTrigger state not used\n const [refreshTrigger, _setRefreshTrigger] = useState(0);\n const [loaded, setLoaded] = useState(0);\n const [isGridView, setIsGridView] = useState(localStorage.getItem(ContentDispositionButton.LAST_DISPLAYED_VIEW) === \"grid\");\n const [filters, setFilters] = useState([]);\n const loadMoreRef = useRef(null);\n // Trigger initial search when component mounts\n useEffect(() => {\n if (!isReady && objects.length === 0) {\n setLoaded(0);\n // Manually set loading state to show spinner during initial load\n search._updateRunningState(true);\n search.search().then(() => {\n setIsReady(true);\n }).catch(err => {\n console.error('Initial search failed:', err);\n search._updateRunningState(false);\n });\n }\n }, []);\n useEffect(() => {\n if (objects.length < loaded) {\n setLoaded(objects.length);\n }\n }, [objects.length, loaded]);\n useIntersectionObserver(loadMoreRef, () => {\n if (isReady && objects.length > 0 && objects.length != loaded) {\n setIsReady(false);\n search.loadMore().finally(() => {\n setLoaded(objects.length);\n setIsReady(true);\n });\n }\n }, { deps: [isReady, objects.length] });\n // Handler for vector search widget\n const handleVectorSearch = (query) => {\n if (query && query.vector) {\n search.query.vector = query.vector;\n search.query.full_text = query.full_text;\n search.query.weights = query.weights;\n search.query.score_aggregation = query.score_aggregation;\n search.query.dynamic_scaling = query.dynamic_scaling;\n if (!actualLayout.find((c) => c.name === \"Search Score\")) {\n const layout = [\n ...actualLayout,\n {\n name: \"Search Score\",\n field: \"score\",\n render: (item) => item.score?.toFixed(4) || \"0.0000\"\n },\n ];\n setActualLayout(layout);\n }\n search.search().then(() => setIsReady(true));\n }\n else if (query && query.full_text) {\n search.query.full_text = query.full_text;\n search.search().then(() => setIsReady(true));\n }\n else if (query === undefined) {\n // Only clear search if this is a user-initiated clear (not initialization)\n // The VectorSearchWidget calls onChange(undefined) during initialization\n if (isReady) {\n delete search.query.vector;\n delete search.query.full_text;\n search.search().then(() => setIsReady(true));\n }\n }\n };\n const facets = useWatchDocumentSearchFacets();\n const facetSearch = useDocumentSearch();\n const handleRefetch = () => {\n search.search().then(() => setIsReady(true));\n };\n // Use DocumentsFacetsNav hooks for cleaner organization\n const filterGroups = useDocumentFilterGroups(facets);\n const handleFilterLogic = useDocumentFilterHandler(facetSearch);\n const handleFilterChange = (value) => {\n const newFilters = typeof value === 'function' ? value(filters) : value;\n setFilters(newFilters);\n handleFilterLogic(newFilters);\n };\n const url = new URL(window.location.href);\n const filtersParam = url.searchParams.get('filters');\n if (filtersParam) {\n try {\n const filterPairs = filtersParam.split(';');\n const validFilterPairs = filterPairs.filter(pair => {\n const [encodedName] = pair.split(':');\n const name = decodeURIComponent(encodedName);\n return name !== 'start' && name !== 'end';\n });\n if (validFilterPairs.length !== filterPairs.length) {\n const newFiltersParam = validFilterPairs.length > 0 ? validFilterPairs.join(';') : '';\n if (newFiltersParam) {\n url.searchParams.set('filters', newFiltersParam);\n }\n else {\n url.searchParams.delete('filters');\n }\n window.history.replaceState(window.history.state || {}, '', url.toString());\n }\n }\n catch (error) {\n console.error(\"Failed to clean start/end filters from URL:\", error);\n }\n }\n const navigate = useNavigate();\n const onRowClick = (object) => {\n navigate(`/objects/${object.id}`);\n };\n const previewObject = (objectId) => {\n const obj = objects.find(o => o.id === objectId) || null;\n setSelectedObject(obj);\n };\n return (_jsxs(\"div\", { className: \"flex flex-col gap-y-2\", children: [_jsx(OverviewDrawer, { object: selectedObject, onClose: () => setSelectedObject(null) }), error && _jsx(ErrorBox, { title: \"Error\", children: error.message }), _jsx(Toolsbar, { isLoading: isLoading, refreshTrigger: refreshTrigger, allowFilter: allowFilter, allowSearch: allowSearch, filterGroups: filterGroups, filters: filters, handleFilterChange: handleFilterChange, handleVectorSearch: handleVectorSearch, handleRefetch: handleRefetch, setIsGridView: setIsGridView }), _jsx(DocumentTable, { objects: objects, isLoading: !objects.length && isLoading, layout: actualLayout, onRowClick: onRowClick, previewObject: previewObject, selectedObject: selectedObject, onUpload: onUpload, isGridView: isGridView, collectionId: searchContext.collectionId }), hasMore ? (_jsx(\"div\", { ref: loadMoreRef, className: \"w-full flex justify-center\", children: _jsx(Spinner, { size: 'xl' }) })) : (_jsx(\"div\", { className: \"text-muted text-center text-sm py-1\", children: `All ${objects.length} objects loaded.` }))] }));\n}\nfunction Toolsbar(props) {\n const { isLoading, refreshTrigger, allowFilter, allowSearch, filterGroups, filters, handleFilterChange, handleVectorSearch, handleRefetch, setIsGridView } = props;\n return (_jsxs(\"div\", { className: \"sticky top-0 z-10 bg-background py-2\", children: [allowFilter && (_jsxs(FilterProvider, { filterGroups: filterGroups, filters: filters, setFilters: handleFilterChange, children: [_jsxs(\"div\", { className: \"flex flex-row gap-4 items-center justify-between w-full\", children: [_jsxs(\"div\", { className: \"flex gap-2 items-center w-2/3\", children: [allowSearch && _jsx(VectorSearchWidget, { onChange: handleVectorSearch, isLoading: isLoading, refresh: refreshTrigger, className: \"w-full\" }), _jsx(FilterBtn, {})] }), _jsxs(\"div\", { className: \"flex gap-1 items-center\", children: [_jsx(Button, { variant: \"outline\", onClick: handleRefetch, alt: \"Refresh\", children: _jsx(RefreshCw, { size: 16 }) }), _jsx(ContentDispositionButton, { onUpdate: setIsGridView })] })] }), _jsxs(\"div\", { className: \"flex gap-2 items-center pt-2\", children: [_jsx(FilterBar, {}), _jsx(FilterClear, {})] })] })), !allowFilter && (_jsxs(\"div\", { className: \"flex flex-row gap-4 items-center justify-between w-full\", children: [_jsx(\"div\", { className: \"flex gap-2 items-center w-2/3\", children: allowSearch && _jsx(VectorSearchWidget, { onChange: handleVectorSearch, isLoading: isLoading, refresh: refreshTrigger }) }), _jsxs(\"div\", { className: \"flex gap-1 items-center\", children: [_jsx(Button, { variant: \"outline\", onClick: handleRefetch, alt: \"Refresh\", children: _jsx(RefreshCw, { size: 16 }) }), _jsx(ContentDispositionButton, { onUpdate: setIsGridView })] })] }))] }));\n}\nfunction OverviewDrawer({ object, onClose }) {\n const { store } = useUserSession();\n const toast = useToast();\n const navigate = useNavigate();\n const onDownload = useDownloadDocument(store, toast, object?.content?.source, object?.name || object?.content?.name);\n return object ? (_jsxs(SidePanel, { title: object.properties?.title || object.name, isOpen: true, onClose: onClose, children: [_jsxs(\"div\", { className: \"flex items-center gap-x-2\", children: [_jsx(Button, { variant: \"ghost\", size: \"sm\", title: \"Open Object\", onClick: () => navigate(`/objects/${object.id}`), children: _jsx(ExternalLink, { className: \"size-4\" }) }), object.content?.source && (_jsx(Button, { variant: \"ghost\", size: \"sm\", title: \"Download\", onClick: onDownload, children: _jsx(Download, { className: \"size-4\" }) }))] }), _jsx(Divider, { className: \"my-2\" }), _jsx(\"div\", { className: \"pt-2\", children: _jsx(ContentOverview, { object: object, loadText: true }, object.id) })] })) : null;\n}\n//# sourceMappingURL=DocumentSearchResults.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { Button, Modal, ModalBody, ModalTitle, SelectBox, Spinner } from \"@vertesia/ui/core\";\nimport { useState } from \"react\";\nexport var ExportTypes;\n(function (ExportTypes) {\n ExportTypes[\"CSV\"] = \"CSV\";\n ExportTypes[\"JSON\"] = \"JSON\";\n})(ExportTypes || (ExportTypes = {}));\n;\nexport function ExportPropertiesModal({ isExporting, isOpen, onClose }) {\n const title = \"Export Object Properties\";\n return (_jsxs(Modal, { onClose: () => onClose(undefined), isOpen: isOpen, className: \"relative overflow-visible\", children: [_jsx(ModalTitle, { children: title }), !isExporting &&\n _jsx(SelectPanel, { onClose: onClose }), isExporting &&\n _jsx(WaitingPanel, {})] }));\n}\nfunction SelectPanel({ onClose }) {\n const [exportType, setExportType] = useState(undefined);\n const [exportAll, setExportAll] = useState(undefined);\n const selectionOption = [\"Export selected objects\", \"Export all objects\"];\n const exportAllBoolean = (option) => {\n return option == selectionOption[1];\n };\n const onSubmit = () => {\n onClose(exportType, exportAllBoolean(exportAll));\n };\n return (_jsxs(ModalBody, { className: \"min-h-[104px] pt-0 flex flex-col gap-y-4\", children: [_jsx(\"div\", { className: 'h-1/3', children: _jsx(SelectBox, { options: selectionOption, value: exportAll, onChange: setExportAll, placeholder: \"Choose what to export\", className: \"h-full w-full text-sm\", filterBy: \"name\", isClearable: true }) }), _jsxs(\"div\", { className: 'h-1/2 flex flex-col gap-y-8 content-between', children: [_jsx(SelectBox, { options: Object.values(ExportTypes), value: exportType, onChange: setExportType, placeholder: \"Choose a format\", className: \"h-full w-full text-sm\", filterBy: \"name\", isClearable: true }), _jsx(Button, { className: \"w-full\", isDisabled: !exportType || !exportAll, onClick: onSubmit, children: \"Export Properties\" })] })] }));\n}\nfunction WaitingPanel({}) {\n return (_jsx(ModalBody, { className: \"min-h-[84px] pt-0\", children: _jsxs(\"div\", { className: 'h-full grid flex-col gap-y-2 content-between justify-items-center', children: [_jsxs(\"div\", { className: \"text-sm flex flex-col gap-x-2\", children: [_jsx(\"p\", { children: \"EXPORT IS IN PROGRESS\" }), _jsx(\"p\", { className: \"pt-2 grid justify-items-center\", children: \"PLEASE WAIT\" })] }), _jsx(Spinner, { size: 'lg' })] }) }));\n}\n//# sourceMappingURL=ExportPropertiesModal.js.map","import { jsx as _jsx } from \"react/jsx-runtime\";\nimport { useUserSession } from \"@vertesia/ui/session\";\nimport { DocumentSearchResultsWithDropZone, DocumentSearchResults } from \"../objects/DocumentSearchResults\";\nimport { useToast } from \"@vertesia/ui/core\";\nimport { useDocumentSearch } from \"../objects/search/DocumentSearchContext\";\nexport function BrowseCollectionView({ collection }) {\n const toast = useToast();\n const { client, typeRegistry } = useUserSession();\n const search = useDocumentSearch();\n search.query.all_revisions = true;\n const onUploadDone = async (objectIds) => {\n if (objectIds.length > 0) {\n await client.store.collections.addMembers(collection.id, objectIds).catch(err => {\n toast({\n title: 'Failed to add objects to collection',\n description: err.message,\n status: 'error'\n });\n });\n }\n };\n const tableLayout = getTableLayout(collection, typeRegistry);\n return collection.dynamic ? (_jsx(DocumentSearchResults, { layout: tableLayout })) : (_jsx(DocumentSearchResultsWithDropZone, { onUploadDone: onUploadDone, layout: tableLayout }));\n}\nfunction getTableLayout(collection, typeRegistry) {\n let table_layout = collection.table_layout;\n if (table_layout && table_layout.length > 0) {\n return table_layout;\n }\n if (collection.type && typeRegistry) {\n table_layout = typeRegistry?.getTypeLayout(collection.type.id);\n }\n if (table_layout && table_layout.length > 0) {\n return table_layout;\n }\n else {\n return undefined;\n }\n}\n//# sourceMappingURL=BrowseCollectionView.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { VSelectBox } from \"@vertesia/ui/core\";\nimport { useUserSession } from \"@vertesia/ui/session\";\nimport { useEffect, useState } from \"react\";\nconst optionLabel = (t) => {\n if (t === null)\n return 'None';\n return (_jsxs(\"div\", { children: [_jsx(\"div\", { className: \"text-sm\", children: t.name }), _jsx(\"div\", { className: \"text-xs text-gray-500\", children: t.description })] }));\n};\nexport function SelectContentType({ className, defaultValue, onChange, isClearable, multiple }) {\n const session = useUserSession();\n const [isMounted, setIsMounted] = useState(false);\n const [selectedType, setSelectedType] = useState();\n const [selectedTypes, setSelectedTypes] = useState([]);\n useEffect(() => {\n if (!isMounted) {\n setIsMounted(true);\n if (session.typeRegistry && defaultValue) {\n if (multiple && Array.isArray(defaultValue)) {\n const types = session.typeRegistry.types.filter(t => defaultValue.includes(t.id));\n setSelectedTypes(types);\n }\n const type = session.typeRegistry.types.find(t => t.id === defaultValue);\n if (type) {\n setSelectedType(type);\n }\n }\n }\n }, [session.typeRegistry, defaultValue, multiple]);\n const _onChange = (option) => {\n setSelectedType(option || undefined);\n onChange(option);\n };\n const _onChangeMultiple = (options) => {\n setSelectedTypes(options);\n onChange(options);\n };\n if (multiple) {\n return (_jsx(\"div\", { className: 'flex flex-col gap-4 content-between', children: _jsx(VSelectBox, { options: session.typeRegistry?.types || [], value: selectedTypes, onChange: _onChangeMultiple, placeholder: \"Choose Content Types...\", optionLabel: optionLabel, className: className || \"text-sm bg-background\", filterBy: \"name\", isClearable: isClearable || false, multiple: true }) }));\n }\n return (_jsx(\"div\", { className: 'flex flex-col gap-4 content-between', children: _jsx(VSelectBox, { options: session.typeRegistry?.types || [], value: selectedType, onChange: _onChange, placeholder: \"Choose a Content Type...\", optionLabel: optionLabel, className: className || \"text-sm bg-background\", filterBy: \"name\", isClearable: isClearable || false }) }));\n}\n//# sourceMappingURL=SelectContentType.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { useToast, VModalBody, FormItem, VModalFooter, Input, Switch, Button, VModal, VModalTitle, Textarea } from \"@vertesia/ui/core\";\nimport { SelectContentType } from \"../types/SelectContentType\";\nimport { useNavigate } from \"@vertesia/ui/router\";\nimport { useUserSession } from \"@vertesia/ui/session\";\nimport { useState } from \"react\";\nexport function CreateCollectionForm({ onClose, redirect = true, onAddToCollection }) {\n const navigate = useNavigate();\n const toast = useToast();\n const [isProcessing, setProcessing] = useState(false);\n const { client } = useUserSession();\n const [payload, setPayload] = useState({\n dynamic: false,\n name: \"\",\n description: \"\",\n });\n function setPayloadProp(name, value) {\n setPayload({\n ...payload,\n [name]: value,\n });\n }\n const onCreate = () => {\n if (!payload?.name || !payload.name.trim()) {\n toast({\n title: \"Name is required\",\n description: \"Please provide a name for the collection\",\n status: \"error\",\n duration: 5000,\n });\n return;\n }\n payload.name = payload.name.trim();\n if (payload.description) {\n payload.description = payload.description.trim();\n }\n if (payload.dynamic == null) {\n payload.dynamic = false;\n }\n setProcessing(true);\n client.store.collections\n .create(payload)\n .then((r) => {\n onClose();\n toast({\n title: \"Collection created\",\n description: `Collection \"${r.name}\" created successfully`,\n status: \"success\",\n duration: 3000,\n });\n if (redirect)\n navigate(`/collections/${r.id}`);\n if (onAddToCollection) {\n onAddToCollection(r.id);\n }\n })\n .catch((err) => {\n toast({\n title: \"Failed to create collection\",\n description: err.message,\n status: \"error\",\n duration: 5000,\n });\n })\n .finally(() => setProcessing(false));\n };\n return (_jsxs(\"form\", { onSubmit: (e) => e.preventDefault(), children: [_jsxs(VModalBody, { children: [_jsx(FormItem, { label: \"Name\", required: true, children: _jsx(Input, { type: \"text\", value: payload.name || \"\", onChange: (value) => setPayloadProp(\"name\", value) }) }), _jsx(FormItem, { label: \"Description\", className: \"mt-2\", children: _jsx(Textarea, { value: payload.description || \"\", onChange: (ev) => setPayloadProp(\"description\", ev) }) }), _jsx(FormItem, { label: \"Dynamic Collection\", className: \"mt-2\", direction: \"row\", description: \"Dynamically fetch content for the collection based on a query. If not enabled, then content must be added by users or agents.\", children: _jsx(Switch, { value: payload.dynamic || false, onChange: (value) => setPayloadProp(\"dynamic\", value) }) }), !payload.dynamic &&\n _jsx(FormItem, { label: \"Allowed Content Types\", className: \"mt-4\", description: \"Optionally select which content types can be added to the collection. If not set, then all content types are allowed.\", children: _jsx(SelectContentType, { defaultValue: payload.allowed_types || null, onChange: (v) => {\n if (Array.isArray(v)) {\n setPayloadProp(\"allowed_types\", v.map(type => type.id));\n }\n else {\n setPayloadProp(\"allowed_types\", v ? [v.id] : []);\n }\n }, isClearable: true, multiple: true }) }), _jsx(FormItem, { label: \"Type\", className: \"mt-2\", description: \"Optionally select a content type to assign custom properties and data to the collection.\", children: _jsx(SelectContentType, { defaultValue: payload.type || null, onChange: (v) => {\n if (Array.isArray(v)) {\n setPayloadProp(\"type\", v.length > 0 ? v[0].id : null);\n }\n else {\n setPayloadProp(\"type\", v?.id || null);\n }\n }, isClearable: true }) })] }), _jsx(VModalFooter, { children: _jsx(Button, { isDisabled: isProcessing, onClick: onCreate, children: \"Create Collection\" }) })] }));\n}\nexport function CreateCollectionModal({ isOpen, onClose }) {\n return (_jsxs(VModal, { onClose: onClose, isOpen: isOpen, children: [_jsx(VModalTitle, { children: \"Create a Collection\" }), _jsx(CreateCollectionForm, { onClose: onClose })] }));\n}\n//# sourceMappingURL=CreateCollection.js.map","import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from \"react/jsx-runtime\";\nimport { NavLink } from \"@vertesia/ui/router\";\nimport { useUserSession } from \"@vertesia/ui/session\";\nimport { FolderClosed, Search, Trash2 } from \"lucide-react\";\nimport { Button, ConfirmModal, ErrorBox, Table, TBody, TR, useToast, VTooltip, useFetch, EmptyCollection } from \"@vertesia/ui/core\";\nimport dayjs from 'dayjs';\nimport relativeTime from 'dayjs/plugin/relativeTime';\nimport { useState, useEffect } from \"react\";\nimport { CreateCollectionModal } from \"./CreateCollection\";\ndayjs.extend(relativeTime);\nexport function CollectionsTable({}) {\n const { client } = useUserSession();\n const toast = useToast();\n const [collectionToDelete, setCollectionToDelete] = useState();\n const [isLoading, setIsLoading] = useState(true);\n const [isOpen, setOpen] = useState(false);\n const { data: collections, error, refetch } = useFetch(() => client.store.collections.search({}), []);\n // Update loading state when data is fetched\n useEffect(() => {\n if (collections || error) {\n setIsLoading(false);\n }\n }, [collections, error]);\n if (error) {\n return _jsx(ErrorBox, { title: 'Collections fetch failed', children: error.message });\n }\n const deleteCollection = async () => {\n if (!collectionToDelete)\n return;\n try {\n await client.store.collections.delete(collectionToDelete);\n toast({\n title: 'Collection deleted',\n status: 'success',\n duration: 3000\n });\n refetch();\n }\n catch (err) {\n console.error('Failed to delete collection:', err);\n toast({\n title: 'Failed to delete collection',\n description: err.message || 'An error occurred',\n status: 'error',\n duration: 5000\n });\n }\n finally {\n setCollectionToDelete(undefined);\n }\n };\n return (_jsxs(_Fragment, { children: [collections &&\n (collections.length > 0 ?\n (_jsxs(Table, { className: \"w-full\", children: [_jsx(\"thead\", { children: _jsxs(\"tr\", { children: [_jsx(\"th\", { children: \"Name\" }), _jsx(\"th\", { children: \"Type\" }), _jsx(\"th\", { children: \"Created\" }), _jsx(\"th\", {})] }) }), _jsx(TBody, { columns: 4, isLoading: isLoading, children: collections.map((c) => {\n return _jsxs(TR, { children: [_jsx(\"td\", { children: _jsxs(\"div\", { className: \"flex items-center gap-2\", children: [collectionIcon(c.dynamic), _jsx(NavLink, { href: `/collections/${c.id}`, children: c.name })] }) }), _jsx(\"td\", { children: c.type?.name || \"-\" }), _jsx(\"td\", { children: dayjs(c.created_at).fromNow() }), _jsx(\"td\", { className: \"text-right\", children: _jsx(Button, { variant: \"destructive\", size: \"sm\", onClick: () => setCollectionToDelete(c.id), children: _jsx(Trash2, { className: \"size-4\" }) }) })] }, c.id);\n }) })] })) :\n _jsx(EmptyCollection, { title: \"No Collections\", buttonLabel: 'New Collections', onClick: () => setOpen(true), children: \"Get started by creating a new Collections.\" })), _jsx(CreateCollectionModal, { isOpen: isOpen, onClose: () => setOpen(false) }), _jsx(ConfirmModal, { isOpen: !!collectionToDelete, title: \"Delete Collection\", content: \"Are you sure you want to delete this collection? This action cannot be undone.\", onConfirm: deleteCollection, onCancel: () => setCollectionToDelete(undefined) })] }));\n}\nexport function collectionIcon(isDynamic) {\n const tooltipText = isDynamic ? \"Dynamic Collection\" : \"Static Collection\";\n const icon = isDynamic ? _jsx(Search, { className: \"size-5\" }) : _jsx(FolderClosed, { className: \"size-5\" });\n return (_jsx(VTooltip, { description: tooltipText, className: \"mr-2\", children: icon }));\n}\n//# sourceMappingURL=CollectionsTable.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { TBody, Table } from \"@vertesia/ui/core\";\nimport { useNavigate } from \"@vertesia/ui/router\";\nimport dayjs from \"dayjs\";\nimport relativeTime from \"dayjs/plugin/relativeTime\";\ndayjs.extend(relativeTime);\nexport function ContentObjectTypesTable({ objects, isLoading }) {\n const navigate = useNavigate();\n return (_jsx(\"div\", { children: _jsxs(Table, { className: \"w-full\", children: [_jsx(\"thead\", { children: _jsxs(\"tr\", { children: [_jsx(\"th\", { children: \"Name\" }), _jsx(\"th\", { children: \"Strict Mode\" }), _jsx(\"th\", { children: \"Semantic Chunking\" }), _jsx(\"th\", { children: \"Updated At\" })] }) }), _jsx(TBody, { isLoading: isLoading, columns: 3, children: objects?.map((obj) => (_jsxs(\"tr\", { onClick: () => navigate(`/types/${obj.id}`), className: 'cursor-pointer hover:bg-muted', children: [_jsx(\"td\", { children: obj.name }), _jsx(\"td\", { children: obj.strict_mode ? 'Yes' : 'No' }), _jsx(\"td\", { children: obj.is_chunkable ? 'Yes' : 'No' }), _jsx(\"td\", { children: dayjs(obj.updated_at).fromNow() })] }, obj.id))) })] }) }));\n}\n//# sourceMappingURL=ContentObjectTypesTable.js.map","import { SharedState, useWatchSharedState } from \"@vertesia/ui/core\";\nimport { createContext, useContext } from \"react\";\nexport class ObjectTypeSearch {\n client;\n limit;\n result = new SharedState({ objects: [], isLoading: false });\n query = {};\n constructor(client, limit = 100) {\n this.client = client;\n this.limit = limit;\n }\n get objects() {\n return this.result.value.objects;\n }\n get error() {\n return this.result.value.error;\n }\n get isRunning() {\n return this.result.value.isLoading;\n }\n getFilterValue(name) {\n return this.query[name];\n }\n setFilterValue(name, value) {\n this.query[name] = value;\n this.search();\n }\n reset(isLoading = false) {\n this.result.value = {\n objects: [],\n isLoading\n };\n }\n _updateRunningState(value) {\n const prev = this.result.value;\n this.result.value = {\n objects: prev.objects,\n isLoading: value,\n error: prev.error\n };\n }\n async _search(loadMore = false) {\n if (this.isRunning) {\n return Promise.resolve(false);\n }\n this.result.value = {\n isLoading: true,\n objects: loadMore ? this.objects : [],\n };\n const limit = this.limit;\n const offset = this.objects.length;\n return this.client.types.list({\n limit,\n offset,\n query: this.query\n }).then(async (result) => {\n this.result.value = {\n isLoading: false,\n objects: this.objects.concat(result)\n };\n return true;\n }).catch((err) => {\n this.result.value = {\n error: err,\n isLoading: false,\n objects: this.objects\n };\n throw err;\n });\n }\n search() {\n if (this.isRunning) {\n return Promise.resolve(false);\n }\n return this._search(false);\n }\n loadMore() {\n if (this.isRunning) {\n return Promise.resolve(false);\n }\n return this._search(true);\n }\n}\nconst ObjectTypeSearchContext = createContext(undefined);\nexport function useSearch() {\n return useContext(ObjectTypeSearchContext);\n}\nexport function useWatchSearchResult() {\n const search = useSearch();\n const result = useWatchSharedState(search.result);\n return { ...result, search };\n}\nexport function useSearchCount() {\n const search = useSearch();\n return search.objects.length;\n}\nexport { ObjectTypeSearchContext };\n//# sourceMappingURL=ObjectTypeSearchContext.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { useState } from 'react';\nimport { Button, Input, Modal, ModalBody, ModalFooter, ModalTitle, useToast, Textarea } from '@vertesia/ui/core';\nexport function CreateOrUpdateTypeModal({ title, isOpen, onClose, okLabel, initialPayload }) {\n const toast = useToast();\n const [name, setName] = useState(initialPayload?.name);\n const [description, setDescription] = useState(initialPayload?.description);\n const [strictMode, setStrictMode] = useState(initialPayload?.strict_mode ?? false);\n const onSave = () => {\n if (!name) {\n toast({\n status: 'error',\n title: 'Name is required',\n duration: 5000\n });\n return;\n }\n const payload = { name, description, strict_mode: strictMode };\n onClose(payload).then(() => onClose());\n setName(undefined);\n setDescription(undefined);\n setStrictMode(false);\n };\n return (_jsxs(Modal, { isOpen: isOpen, onClose: () => onClose(), children: [_jsx(ModalTitle, { children: title }), _jsx(ModalBody, { className: \"pt-0\", children: _jsxs(\"div\", { className: 'h-full flex flex-col gap-4 content-between', children: [_jsxs(\"div\", { children: [_jsx(\"label\", { className: \"block text-sm font-medium text-muted\", children: \"Name\" }), _jsx(Input, { value: name, onChange: setName })] }), _jsxs(\"div\", { children: [_jsx(\"label\", { className: \"block text-sm font-medium text-muted\", children: \"Description\" }), _jsx(Textarea, { value: description, onChange: e => setDescription(e.target.value) })] })] }) }), _jsx(ModalFooter, { children: _jsxs(\"div\", { className: 'flex justify-end gap-4', children: [_jsx(Button, { variant: \"secondary\", onClick: () => onClose(), children: \"Cancel\" }), _jsx(Button, { variant: \"primary\", onClick: () => onSave(), children: okLabel })] }) })] }));\n}\n//# sourceMappingURL=CreateOrUpdateTypeModal.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { useEffect, useRef, useState } from 'react';\nimport { ContentObjectTypesTable } from './ContentObjectTypesTable';\nimport { useWatchSearchResult } from './search/ObjectTypeSearchContext';\nimport { useUserSession } from '@vertesia/ui/session';\nimport { EmptyCollection, ErrorBox, Input, SelectBox, useToast, useDebounce, useIntersectionObserver } from '@vertesia/ui/core';\nimport { CreateOrUpdateTypeModal } from './CreateOrUpdateTypeModal';\nvar ChunkableOptions;\n(function (ChunkableOptions) {\n ChunkableOptions[\"true\"] = \"Yes\";\n ChunkableOptions[\"false\"] = \"No\";\n})(ChunkableOptions || (ChunkableOptions = {}));\n;\nexport function ContentObjectTypesSearch({ isDirty = false }) {\n const session = useUserSession();\n const { store } = session;\n const toast = useToast();\n const [isReady, setIsReady] = useState(false);\n const { search, isLoading, error, objects } = useWatchSearchResult();\n const [searchTerm, setSearchTerm] = useState('');\n const debounceValue = useDebounce(searchTerm, 500);\n const loadMoreRef = useRef(null);\n useIntersectionObserver(loadMoreRef, () => {\n isReady && search.loadMore();\n }, { deps: [isReady] });\n useEffect(() => {\n search.search().then(() => setIsReady(true));\n }, []);\n useEffect(() => {\n search.query.name = searchTerm;\n search.search().then(() => setIsReady(true));\n }, [debounceValue]);\n const [chunkable, setChunkable] = useState(undefined);\n const onChunkableChange = (data) => {\n setChunkable(data);\n };\n useEffect(() => {\n search.query.chunkable = chunkable ? chunkable == 'Yes' : undefined;\n search.search().then(() => setIsReady(true));\n }, [chunkable]);\n useEffect(() => {\n if (isDirty && isReady) {\n search.search().then(() => setIsReady(true));\n }\n }, [isDirty]);\n const [showCreateModal, setShowCreateModal] = useState(false);\n const onOpenCreateModal = () => {\n setShowCreateModal(true);\n };\n if (error) {\n return (_jsx(ErrorBox, { title: \"Failed to fetch ObjectTypes\", children: error.message }));\n }\n ;\n const onCloseCreateModal = async (payload) => {\n if (!payload) {\n setShowCreateModal(false);\n return Promise.resolve();\n }\n return store.types.create(payload).then(async () => {\n toast({\n status: 'success',\n title: 'Type created',\n duration: 2000\n });\n session.reloadTypes();\n search.search().then(() => setIsReady(true));\n }).catch(err => {\n toast({\n status: 'error',\n title: 'Error creating type',\n description: err.message,\n duration: 5000\n });\n });\n };\n return (_jsxs(\"div\", { className: 'flex flex-col gap-4 h-full', children: [_jsxs(\"div\", { className: \"flex gap-4\", children: [_jsx(Input, { placeholder: \"Filter by Name\", value: searchTerm, onChange: setSearchTerm }), _jsx(SelectBox, { className: \"w-60\", isClearable: true, options: Object.values(ChunkableOptions), value: chunkable, onChange: onChunkableChange, placeholder: \"Is Chunkable\" })] }), _jsxs(\"div\", { className: \"flex-1\", children: [(!isLoading && objects?.length === 0) ?\n _jsx(EmptyCollection, { title: \"No Type\", buttonLabel: 'Create Type', onClick: onOpenCreateModal, children: \"Get started by creating a new Type.\" })\n :\n _jsx(ContentObjectTypesTable, { objects: objects, isLoading: isLoading }), _jsx(CreateOrUpdateTypeModal, { okLabel: \"Create\", title: \"Create Type\", isOpen: showCreateModal, onClose: onCloseCreateModal })] })] }));\n}\n//# sourceMappingURL=ContentObjectTypesSearch.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { basicSetup } from 'codemirror';\nimport { useMemo, useRef, useState } from 'react';\nimport { useUserSession } from '@vertesia/ui/session';\nimport { json } from '@codemirror/lang-json';\nimport { CodeMirrorEditor, SchemaEditor, useSchema } from '@vertesia/ui/widgets';\nimport { Button, useToast } from '@vertesia/ui/core';\nimport { Ajv } from \"ajv\";\nconst CODE_MIRROR_EXTENSIONS = [basicSetup, json()];\nexport function ObjectSchemaEditor({ objectType, onSchemaUpdate }) {\n const { store } = useUserSession();\n const toast = useToast();\n const [isUpdating, setUpdating] = useState(false);\n const schema = useSchema(objectType.object_schema);\n const editorRef = useRef(undefined);\n const [displayJson, setDisplayJson] = useState(false);\n const value = useMemo(() => {\n return jsonToContent(schema.schema);\n }, [schema]);\n const onSave = () => {\n if (displayJson) {\n if (!updateSchemaFromJson()) {\n return;\n }\n }\n setUpdating(true);\n store.types.update(objectType.id, { object_schema: schema.schema }).then(() => {\n onSchemaUpdate(schema);\n toast({\n status: 'success',\n title: 'Schema updated',\n description: 'The schema has been updated successfully',\n duration: 2000\n });\n }).catch((err) => {\n toast({\n status: 'error',\n title: 'Failed to update schema',\n description: err.message,\n duration: 5000\n });\n }).finally(() => {\n setUpdating(false);\n });\n };\n const handleOnSave = () => {\n if (displayJson) {\n if (!updateSchemaFromJson()) {\n return;\n }\n }\n setDisplayJson(prev => !prev);\n };\n const updateSchemaFromJson = () => {\n if (editorRef.current) {\n const value = editorRef.current.getValue();\n try {\n const newSchema = contentToJson(value);\n validateSchema(newSchema);\n schema.replaceSchema(newSchema);\n }\n catch (err) {\n toast({\n status: 'error',\n title: 'Invalid JSON Schema',\n description: err.message,\n duration: 5000\n });\n return false;\n }\n }\n return true;\n };\n return (_jsxs(\"div\", { className: \"mx-2 my-2 rounded-2xl border border-solid shadow-md border-spacing-2\", children: [_jsxs(\"div\", { className: \"flex items-center rounded-t-md border-b gap-x-2 py-2 pl-4 pr-2\", children: [_jsx(\"div\", { className: \"text-base font-semibold\", children: \"Schema Editor\" }), _jsx(\"div\", { children: _jsx(Button, { variant: \"outline\", size: \"sm\", onClick: handleOnSave, children: displayJson ? \"Edit Schema\" : \"Edit Json\" }) }), _jsx(\"div\", { className: \"ml-auto flex gap-x-2\", children: _jsx(Button, { isLoading: isUpdating, variant: \"outline\", size: \"sm\", onClick: onSave, children: \"Save Changes\" }) })] }), _jsx(\"div\", { className: \"px-4 py-2\", children: displayJson\n ? _jsx(CodeMirrorEditor, { value: value, extensions: CODE_MIRROR_EXTENSIONS, editorRef: editorRef })\n : _jsx(SchemaEditor, { schema: schema }) })] }));\n}\nfunction jsonToContent(json) {\n if (!json) {\n return '';\n }\n return JSON.stringify(json, null, 2);\n}\nfunction contentToJson(content) {\n if (!content?.trim()) {\n return undefined;\n }\n return JSON.parse(content.trim());\n}\nconst validateSchema = (schema) => {\n try {\n const ajv = new Ajv({\n strict: false, // Enable strict mode to ensure all properties are validated\n });\n // Compile the schema. This implicitly validates the schema definition\n // against the JSON Schema draft that ajv supports by default.\n ajv.compile(schema);\n }\n catch (error) {\n throw new Error(`Invalid JSON Schema definition: ${error.message}`);\n }\n};\n//# sourceMappingURL=ObjectSchemaEditor.js.map","import { jsx as _jsx } from \"react/jsx-runtime\";\nimport { useUserSession } from \"@vertesia/ui/session\";\nimport { useMemo } from \"react\";\nimport { ObjectTypeSearch, ObjectTypeSearchContext } from \"./ObjectTypeSearchContext\";\nexport function ObjectTypeSearchProvider({ children, limit, name, chunkable: chunkable }) {\n const { store } = useUserSession();\n const search = useMemo(() => {\n const search = new ObjectTypeSearch(store, limit);\n search.query.name = name;\n search.query.chunkable = chunkable;\n return search;\n }, [limit]);\n return (_jsx(ObjectTypeSearchContext.Provider, { value: search, children: children }));\n}\n//# sourceMappingURL=ObjectTypeSearchProvider.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { useState } from \"react\";\nimport { Button, Modal, ModalBody, ModalFooter, ModalTitle, SelectBox, } from \"@vertesia/ui/core\";\nimport { useUserSession } from \"@vertesia/ui/session\";\nimport { CheckCircleIcon } from \"lucide-react\";\n/**\n * A dedicated modal for selecting content types.\n *\n * This is a lightweight modal specifically for selecting a content type,\n * without any file upload functionality. Used for changing types, setting\n * types in other contexts, etc.\n */\nexport function SelectContentTypeModal({ isOpen, onClose, title = \"Select Content Type\", children, initialSelectedType = null, confirmLabel = \"Select Type\", allowNone = true, }) {\n const { typeRegistry } = useUserSession();\n const [selectedType, setSelectedType] = useState(initialSelectedType);\n // Get available types from the registry\n const types = typeRegistry?.types || [];\n // Handle close/cancel\n const handleClose = () => {\n onClose(undefined);\n };\n // Handle type selection and confirmation\n const handleConfirm = () => {\n onClose(selectedType?.id ?? null);\n };\n return (_jsxs(Modal, { isOpen: isOpen, onClose: handleClose, className: \"w-full max-w-xl mx-auto\", children: [_jsx(ModalTitle, { children: title }), _jsxs(ModalBody, { className: \"p-6\", children: [children, _jsxs(\"div\", { className: \"mb-4 mt-4\", children: [_jsxs(\"label\", { className: \"block text-sm font-medium mb-2\", children: [\"Content Type \", allowNone && _jsx(\"span\", { className: \"text-gray-500 font-normal\", children: \"(Optional)\" })] }), allowNone ? (_jsx(SelectBox, { options: types, value: selectedType, optionLabel: (type) => type ? type.name : 'Select a content type', placeholder: \"Select a content type or leave empty for automatic detection\", onChange: (selected) => setSelectedType(selected || null), filterBy: \"name\", isClearable: true })) : (_jsx(SelectBox, { options: types, value: selectedType, optionLabel: (type) => type ? type.name : 'Select a content type', placeholder: \"Select a content type\", onChange: (selected) => setSelectedType(selected || null), filterBy: \"name\" })), allowNone && (_jsxs(\"div\", { className: \"mt-2 text-sm text-blue-600 flex items-center\", children: [_jsx(CheckCircleIcon, { className: \"h-4 w-4 mr-1\" }), _jsxs(\"span\", { children: [_jsx(\"strong\", { children: \"Type selection is optional.\" }), \" Leave empty to let Vertesia choose the appropriate type\"] })] }))] }), selectedType ? (_jsxs(\"div\", { className: \"text-sm text-gray-500 bg-gray-50 p-3 rounded-md mb-4\", children: [_jsx(\"div\", { className: \"font-medium\", children: selectedType.name }), selectedType.description && (_jsx(\"div\", { className: \"mt-1\", children: selectedType.description }))] })) : allowNone && (_jsxs(\"div\", { className: \"text-sm text-blue-600 bg-blue-50 p-3 rounded-md mb-4\", children: [_jsx(\"div\", { className: \"font-medium\", children: \"Automatic Type Detection\" }), _jsxs(\"div\", { className: \"mt-1\", children: [\"Vertesia will analyze each file's content and automatically select the most appropriate type.\", _jsx(\"br\", {}), _jsx(\"span\", { className: \"mt-1 block font-medium\", children: \"This is recommended for most uploads.\" })] })] }))] }), _jsxs(ModalFooter, { children: [_jsx(Button, { variant: \"ghost\", onClick: handleClose, children: \"Cancel\" }), _jsx(Button, { onClick: handleConfirm, children: selectedType ? `${confirmLabel}: ${selectedType.name}` : allowNone ? \"Let Vertesia Choose\" : confirmLabel })] })] }));\n}\n//# sourceMappingURL=SelectContentTypeModal.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { basicSetup } from 'codemirror';\nimport { useMemo, useRef, useState } from 'react';\nimport { json } from '@codemirror/lang-json';\nimport { Button, useToast } from '@vertesia/ui/core';\nimport { useUserSession } from '@vertesia/ui/session';\nimport { CodeMirrorEditor } from '@vertesia/ui/widgets';\nconst extensions = [basicSetup, json()];\nexport function TableLayoutEditor({ objectType, onLayoutUpdate }) {\n const toast = useToast();\n const [isUpdating, setUpdating] = useState(false);\n const { store } = useUserSession();\n const editorRef = useRef(undefined);\n const value = useMemo(() => {\n return stringifyTableLayout(objectType.table_layout);\n }, [objectType.table_layout]);\n const validationError = (title, message) => {\n toast({\n status: 'error',\n title: title,\n description: message,\n duration: 5000\n });\n };\n const onSave = () => {\n if (!editorRef.current) {\n return;\n }\n const value = editorRef.current.getValue();\n let table_layout;\n if (!value) {\n table_layout = null;\n }\n else {\n try {\n table_layout = JSON.parse(value);\n }\n catch (err) {\n return validationError('Invalid JSON', err.message);\n }\n }\n if (!Array.isArray(table_layout)) {\n return validationError('Invalid JSON', 'The table layout must be an array');\n }\n if (table_layout.some((col) => !col || !col.name || !col.field)) {\n return validationError('Invalid JSON', 'A table layout entry must contain the following properties:] {field, name, converter?}');\n }\n setUpdating(true);\n store.types.update(objectType.id, {\n table_layout\n }).then((response) => {\n toast({\n status: 'success',\n title: 'Table Layout updated',\n description: 'The table layout has been updated successfully',\n duration: 2000\n });\n onLayoutUpdate(response.table_layout);\n }).catch((err) => {\n toast({\n status: 'error',\n title: 'Failed to update table layout',\n description: err.message,\n duration: 5000\n });\n }).finally(() => {\n setUpdating(false);\n });\n };\n return (_jsxs(\"div\", { className: \"mx-2 my-2 rounded-2xl border border-solid shadow-xs\", children: [_jsxs(\"div\", { className: \"flex items-center rounded-t-md border-b gap-x-2 py-2 pl-4 pr-2\", children: [_jsx(\"div\", { className: \"text-base font-semibold \", children: \"Table Layout Editor\" }), _jsx(\"div\", { className: \"ml-auto flex gap-x-2\", children: _jsx(Button, { isLoading: isUpdating, variant: \"outline\", size: \"sm\", onClick: onSave, children: \"Save Changes\" }) })] }), _jsx(\"div\", { className: \"px-4 py-2\", children: _jsx(CodeMirrorEditor, { value: value, extensions: extensions, editorRef: editorRef }) })] }));\n}\nexport function stringifyTableLayout(obj) {\n if (!obj) {\n return '[\\n\\n]';\n }\n return JSON.stringify(obj, null, 2);\n}\n//# sourceMappingURL=TableLayoutEditor.js.map","import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from \"react/jsx-runtime\";\nimport { json } from \"@codemirror/lang-json\";\nimport { Button, ErrorBox, FormItem, Input, Panel, Styles, Textarea, useFetch, useToast } from \"@vertesia/ui/core\";\nimport { UserInfo } from \"@vertesia/ui/features\";\nimport { SharedPropsEditor } from \"@vertesia/ui/features\";\nimport { SyncMemberHeadsToggle } from \"@vertesia/ui/features\";\nimport { useUserSession } from \"@vertesia/ui/session\";\nimport { CodeMirrorEditor, GeneratedForm, ManagedObject } from \"@vertesia/ui/widgets\";\nimport { basicSetup } from \"codemirror\";\nimport dayjs from \"dayjs\";\nimport { useMemo, useRef, useState } from \"react\";\nimport { SelectContentType, stringifyTableLayout } from \"../types\";\nconst extensions = [basicSetup, json()];\nexport function EditCollectionView({ refetch, collection }) {\n const typeId = collection.type?.id;\n const tableLayoutRef = useRef(undefined);\n const toast = useToast();\n const { client } = useUserSession();\n const [isUpdating, setUpdating] = useState(false);\n const [metadata, setMetadata] = useState({\n name: collection.name,\n description: collection.description || \"\",\n query: collection.query ? JSON.stringify(collection.query, null, 2) : \"\",\n tags: collection.tags || [],\n type: collection.type?.id || \"\",\n allowed_types: collection.allowed_types || [],\n });\n const tableLayoutValue = useMemo(() => {\n return stringifyTableLayout(collection.table_layout);\n }, [collection.table_layout]);\n const onSubmit = () => {\n let query = undefined;\n try {\n query = metadata.query ? JSON.parse(metadata.query) : undefined;\n }\n catch (err) {\n toast({\n title: \"Invalid Query JSON\",\n description: err.message,\n status: \"error\",\n duration: 5000,\n });\n return;\n }\n const payload = {\n name: metadata.name,\n description: metadata.description,\n query: query,\n tags: metadata.tags,\n type: metadata.type,\n allowed_types: metadata.allowed_types,\n };\n let error;\n if (!payload.name) {\n error = \"Name is required\";\n }\n if (!payload.type) {\n payload.type = null;\n }\n if (error) {\n toast({\n title: \"Validation failed\",\n description: error,\n status: \"error\",\n duration: 5000,\n });\n return;\n }\n if (tableLayoutRef.current) {\n const layout = tableLayoutRef.current.getValue();\n if (layout) {\n try {\n payload.table_layout = JSON.parse(layout);\n }\n catch (err) {\n toast({\n title: \"Invalid Table Layout\",\n description: err.message,\n status: \"error\",\n duration: 5000,\n });\n return;\n }\n }\n else {\n payload.table_layout = null;\n }\n }\n setUpdating(true);\n client.store.collections\n .update(collection.id, payload)\n .then(() => {\n refetch();\n toast({\n title: \"Collection updated\",\n description: \"Collection has been updated successfully\",\n status: \"success\",\n duration: 3000,\n });\n })\n .catch((err) => {\n toast({\n title: \"Failed to update collection\",\n description: err.message,\n status: \"error\",\n duration: 5000,\n });\n })\n .finally(() => {\n setUpdating(false);\n });\n };\n const setField = (name, value) => {\n setMetadata({\n ...metadata,\n [name]: value,\n });\n };\n return (_jsxs(\"div\", { className: \"flex flex-col gap-4 py-2\", children: [_jsxs(Panel, { title: \"Configuration\", action: _jsx(Button, { size: \"lg\", isDisabled: isUpdating, onClick: onSubmit, children: \"Save\" }), children: [_jsxs(\"div\", { className: \"flex justify-between mb-2\", children: [_jsxs(\"div\", { className: \"w-1/2 gap-2 flex flex-col\", children: [_jsx(\"div\", { className: \"text-sm font-medium mb-1\", children: \"Created By\" }), _jsxs(\"div\", { className: \"gap-2 flex items-center\", children: [_jsx(UserInfo, { userRef: collection.created_by, showTitle: true }), _jsxs(\"span\", { children: [\"at \", dayjs(collection.created_at).format(\"YYYY-MM-DD HH:mm:ss\")] })] })] }), _jsxs(\"div\", { className: \"w-1/2 gap-2 flex flex-col\", children: [_jsx(\"div\", { className: \"text-sm font-medium mb-1\", children: \"Updated By\" }), _jsxs(\"div\", { className: \"gap-2 flex items-center\", children: [_jsx(UserInfo, { userRef: collection.updated_by, showTitle: true }), _jsxs(\"span\", { children: [\"at \", dayjs(collection.updated_at).format(\"YYYY-MM-DD HH:mm:ss\")] })] })] })] }), _jsx(FormItem, { label: \"Name\", required: true, children: _jsx(Input, { value: metadata.name, onChange: (v) => setField(\"name\", v) }) }), _jsx(FormItem, { label: \"Description\", children: _jsx(Textarea, { value: metadata.description, onChange: (e) => setField(\"description\", e) }) }), !collection.dynamic &&\n _jsx(FormItem, { label: \"Allowed Content Types\", description: \"Select which content types can be added to the collection. If not set, then all content types are allowed.\", children: _jsx(SelectContentType, { defaultValue: metadata.allowed_types || null, onChange: (v) => {\n if (Array.isArray(v)) {\n setField(\"allowed_types\", v.map(type => type.id));\n }\n else {\n setField(\"allowed_types\", v ? [v.id] : []);\n }\n }, isClearable: true, multiple: true }) }), collection.dynamic && (_jsx(FormItem, { label: \"Query\", description: \"Define the query to dynamically fetch content for the collection.\", children: _jsx(Textarea, { className: Styles.INPUT, value: metadata.query, onChange: (e) => setField(\"query\", e) }) })), _jsx(FormItem, { label: \"Table Layout\", description: \"Define a custom layout for displaying the collection in tables.\", children: _jsx(CodeMirrorEditor, { className: \"border-1 rounded-md border-border\", value: tableLayoutValue, extensions: extensions, editorRef: tableLayoutRef }) }), _jsx(FormItem, { label: \"Type\", description: \"Select a content type to assign custom properties and data to the collection.\", children: _jsx(SelectContentType, { defaultValue: metadata.type || null, onChange: (v) => {\n if (Array.isArray(v)) {\n setField(\"type\", v.length > 0 ? v[0].id : null);\n }\n else {\n setField(\"type\", v?.id || null);\n }\n }, isClearable: true }) })] }), typeId && _jsx(PropertiesEditor, { typeId: typeId, collection: collection }), !collection.dynamic && (_jsxs(_Fragment, { children: [_jsx(SyncMemberHeadsToggle, { collection: collection }), _jsx(SharedPropsEditor, { collection: collection })] }))] }));\n}\nfunction PropertiesEditor({ typeId, collection }) {\n const [formData, setFormData] = useState({});\n const toast = useToast();\n const { client } = useUserSession();\n const [isUpdating, setIsUpdating] = useState(false);\n const { data: type, error } = useFetch(() => client.store.types.retrieve(typeId), [typeId]);\n const schema = type?.object_schema || {};\n const object = useMemo(() => new ManagedObject(schema, collection.properties || {}), [schema, collection.properties]);\n if (error) {\n return _jsx(ErrorBox, { title: \"Failed to load type\", children: error.message });\n }\n if (!type) {\n return null;\n }\n const _onSave = (data) => {\n if (!data || !Object.keys(data).length) {\n return;\n }\n const payload = { properties: data || {} };\n setIsUpdating(true);\n client.store.collections\n .update(collection.id, payload)\n .then(() => {\n toast({\n title: \"Collection properties updated\",\n description: \"Collection has been updated successfully\",\n status: \"success\",\n duration: 3000,\n });\n })\n .catch((err) => {\n toast({\n title: \"Failed to update collection properties\",\n description: err.message,\n status: \"error\",\n duration: 5000,\n });\n })\n .finally(() => {\n setIsUpdating(false);\n });\n };\n const onDataChanged = (data) => {\n if (data instanceof ManagedObject) {\n setFormData(data.value);\n }\n };\n return (_jsx(Panel, { title: \"Properties\", action: _jsx(Button, { size: \"lg\", isLoading: isUpdating, type: \"submit\", onClick: () => _onSave(formData), children: \"Save\" }), children: _jsx(GeneratedForm, { object: object, onChange: onDataChanged }) }));\n}\n//# sourceMappingURL=EditCollectionView.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { Check, ChevronsUpDown } from \"lucide-react\";\nimport { useCallback, useMemo, useState } from \"react\";\nimport { Button, cn, ErrorBox, useDebounce, useFetch, Popover, PopoverContent, PopoverTrigger, Command, CommandEmpty, CommandGroup, CommandItem, CommandInput } from \"@vertesia/ui/core\";\nimport { useUserSession } from \"@vertesia/ui/session\";\nexport function SelectCollection({ onChange, value, disabled = false, placeholder = \"Select a collection\", searchPlaceholder = \"Search collections\", filterOut, allowDynamic = true, multiple = false }) {\n const { client } = useUserSession();\n const [searchQuery, setSearchQuery] = useState('');\n const [isSearching, setIsSearching] = useState(false);\n const [useServerSearch, setUseServerSearch] = useState(false);\n // Debounce the search query to avoid excessive API calls (only used for server-side search)\n const debouncedSearchQuery = useDebounce(searchQuery, 300);\n // Memoize the search function to prevent unnecessary re-renders\n const searchCollections = useCallback(async (query) => {\n setIsSearching(true);\n const trimmedQuery = query.trim();\n const collections = await client.store.collections.search({\n dynamic: allowDynamic ? undefined : false,\n name: useServerSearch ? (trimmedQuery || undefined) : undefined\n });\n setIsSearching(false);\n // Check if we hit the maximum limit (1000 collections) - if so, enable server-side search\n if (!useServerSearch && collections.length >= 1000) {\n setUseServerSearch(true);\n }\n // Filter out collections if filterOut is provided\n if (filterOut && filterOut.length > 0) {\n return collections.filter(col => !filterOut.includes(col.id));\n }\n return collections;\n }, [client, allowDynamic, filterOut, useServerSearch]);\n // Fetch collections based on search mode\n const { data: collections, error } = useFetch(() => searchCollections(useServerSearch ? debouncedSearchQuery : ''), [useServerSearch ? debouncedSearchQuery : '', searchCollections]);\n // Memoize the selected collection(s)\n const selectedCollection = useMemo(() => {\n if (!collections)\n return multiple ? [] : undefined;\n if (multiple && Array.isArray(value)) {\n return collections.filter((collection) => value.includes(collection.id));\n }\n else if (!multiple && typeof value === 'string') {\n return collections.find((collection) => collection.id === value);\n }\n return multiple ? [] : undefined;\n }, [collections, value, multiple]);\n // Handle collection selection\n const handleSelect = useCallback((collection) => {\n if (multiple) {\n const currentValues = Array.isArray(value) ? value : [];\n const isSelected = currentValues.includes(collection.id);\n if (isSelected) {\n // Remove from selection\n const newValues = currentValues.filter(id => id !== collection.id);\n const newCollections = collections?.filter(c => newValues.includes(c.id)) || [];\n onChange(newValues, newCollections);\n }\n else {\n // Add to selection\n const newValues = [...currentValues, collection.id];\n const newCollections = collections?.filter(c => newValues.includes(c.id)) || [];\n onChange(newValues, newCollections);\n }\n }\n else {\n onChange(collection.id, collection);\n }\n }, [onChange, value, collections, multiple]);\n // Handle clear selection\n const handleClear = useCallback(() => {\n onChange(undefined, undefined);\n }, [onChange]);\n // Handle search input change\n const handleSearchChange = useCallback((query) => {\n setSearchQuery(query);\n }, []);\n const hasSearchQuery = searchQuery.trim().length > 0;\n // Client-side filtering when not using server search\n const filteredCollections = useMemo(() => {\n if (!collections)\n return [];\n // If using server search, collections are already filtered by the server\n if (useServerSearch)\n return collections;\n // Otherwise, do client-side filtering\n if (!hasSearchQuery)\n return collections;\n const queryLower = searchQuery.toLowerCase();\n return collections.filter(col => col.name.toLowerCase().includes(queryLower));\n }, [collections, useServerSearch, hasSearchQuery, searchQuery]);\n const showClearOption = selectedCollection && hasSearchQuery;\n // Show error state\n if (error) {\n return (_jsx(ErrorBox, { title: \"Collection fetch failed\", children: error.message }));\n }\n // Get display text for the button\n const getDisplayText = () => {\n if (multiple && Array.isArray(selectedCollection) && selectedCollection.length > 0) {\n if (selectedCollection.length === 1) {\n return selectedCollection[0].name;\n }\n return `${selectedCollection.length} collections selected`;\n }\n else if (!multiple && selectedCollection && !Array.isArray(selectedCollection)) {\n return selectedCollection.name;\n }\n return placeholder;\n };\n return (_jsxs(Popover, { children: [_jsx(PopoverTrigger, { asChild: true, children: _jsxs(Button, { variant: \"outline\", role: \"combobox\", \"aria-haspopup\": \"listbox\", className: cn(\"w-full justify-between min-w-0\"), disabled: disabled, children: [_jsx(\"span\", { className: \"truncate flex-1 text-left min-w-0\", children: getDisplayText() }), _jsx(ChevronsUpDown, { className: \"ml-2 h-4 w-4 shrink-0 opacity-50\" })] }) }), _jsx(PopoverContent, { className: \"mt-2 mb-2 w-[var(--radix-popover-trigger-width)] p-0\", align: \"start\", children: _jsxs(Command, { shouldFilter: false, children: [_jsxs(\"div\", { className: \"flex justify-between items-center border-b px-3\", \"cmdk-input-wrapper\": \"\", children: [_jsx(CommandInput, { placeholder: searchPlaceholder, value: searchQuery, onValueChange: handleSearchChange, className: \"flex h-11 w-full rounded-md bg-transparent py-3 text-sm outline-none placeholder:text-muted-foreground disabled:cursor-not-allowed disabled:opacity-50\" }), isSearching && (_jsx(\"div\", { className: \"mr-2 h-4 w-4 animate-spin rounded-full border-2 border-current border-t-transparent\" }))] }), _jsx(CommandEmpty, { children: isSearching\n ? \"Searching...\"\n : hasSearchQuery\n ? \"No collections found.\"\n : \"No collections available.\" }), _jsxs(CommandGroup, { className: \"max-h-[300px] overflow-auto\", children: [showClearOption && !multiple && (_jsx(CommandItem, { value: \"__clear__\", onSelect: handleClear, className: \"text-muted-foreground\", children: \"Clear selection\" })), filteredCollections.map((collection) => {\n const isSelected = multiple && Array.isArray(value)\n ? value.includes(collection.id)\n : value === collection.id;\n return (_jsxs(CommandItem, { value: collection.id, onSelect: () => handleSelect(collection), className: \"flex items-center justify-between\", children: [_jsx(\"span\", { className: \"truncate\", children: collection.name }), isSelected && (_jsx(Check, { className: \"ml-2 h-4 w-4 shrink-0\" }))] }, collection.id));\n })] })] }) })] }));\n}\n//# sourceMappingURL=SelectCollection.js.map","import { jsx as _jsx } from \"react/jsx-runtime\";\nimport { Button, Panel, useToast } from \"@vertesia/ui/core\";\nimport { TagsInput } from \"@vertesia/ui/core\";\nimport { useUserSession } from \"@vertesia/ui/session\";\nimport { useEffect, useState } from \"react\";\nexport function SharedPropsEditor({ collection }) {\n const { client } = useUserSession();\n const [colType, setColType] = useState(undefined);\n const [sharedProps, setSharedProps] = useState(collection.shared_properties || []);\n const toast = useToast();\n useEffect(() => {\n if (collection.type?.id) {\n client.store.types.retrieve(collection.type.id).then(setColType);\n }\n }, [collection.type?.id]);\n const options = colType ? Object.keys(colType.object_schema?.properties || {}) : [];\n const onSelect = (selected) => {\n setSharedProps(selected);\n };\n const onSave = () => {\n client.store.collections.update(collection.id, {\n shared_properties: sharedProps\n }).then(() => {\n // Handle success\n toast({\n title: \"Updated shared properties\",\n status: \"success\"\n });\n }).catch((error) => {\n toast({\n title: \"Failed to update shared properties\",\n description: error.message,\n status: \"error\"\n });\n // Handle error\n });\n };\n return (_jsx(Panel, { title: \"Shared Properties\", description: \"Add properties to share across all members in the collection. This feature requires to enable shared property synchronization on the project.\", action: _jsx(Button, { size: \"lg\", isLoading: false, onClick: onSave, children: \"Save\" }), children: _jsx(\"div\", { className: '', children: _jsx(TagsInput, { value: sharedProps, onChange: onSelect, options: options, placeholder: \"Select properties to share\" }) }) }));\n}\n//# sourceMappingURL=SharedPropsEditor.js.map","import { jsx as _jsx } from \"react/jsx-runtime\";\nimport { Panel, Switch, useToast } from \"@vertesia/ui/core\";\nimport { useUserSession } from \"@vertesia/ui/session\";\nimport { useState } from \"react\";\nexport function SyncMemberHeadsToggle({ collection }) {\n const { client } = useUserSession();\n const [skipHeadSync, setSkipHeadSync] = useState(collection.skip_head_sync ?? false);\n const [isSaving, setIsSaving] = useState(false);\n const toast = useToast();\n const onSaveSkipHeadSync = (enableSyncHeads) => {\n const skip_head_sync = !enableSyncHeads;\n setIsSaving(true);\n client.store.collections.update(collection.id, {\n skip_head_sync: skip_head_sync\n }).then(() => {\n // Handle success\n toast({\n title: \"Updated skip head sync setting\",\n status: \"success\"\n });\n setSkipHeadSync(skip_head_sync);\n }).catch((error) => {\n toast({\n title: \"Failed to update skip head sync\",\n description: error.message,\n status: \"error\"\n });\n // Handle error\n }).finally(() => {\n setIsSaving(false);\n });\n };\n return (_jsx(Panel, { title: \"Synchronize Member Heads\", description: \"When a new HEAD version of a member is created the colleciton will be updated to point to the new HEAD.\", children: _jsx(Switch, { disabled: isSaving, value: !skipHeadSync, onChange: onSaveSkipHeadSync, children: \"Enable synchronizing member heads\" }) }));\n}\n//# sourceMappingURL=SyncMemberHeadsToggle.js.map","import { jsxs as _jsxs, jsx as _jsx } from \"react/jsx-runtime\";\nimport { useToast } from \"@vertesia/ui/core\";\nimport { useUserSession } from \"@vertesia/ui/session\";\nimport { useCallback, useState } from \"react\";\nimport { SelectContentTypeModal } from \"../../../types\";\nimport { useObjectsActionCallback } from \"../ObjectsActionContext\";\nexport function ChangeTypeActionComponent({ action, objectIds, children }) {\n const { store } = useUserSession();\n const toast = useToast();\n const [isOpen, setOpen] = useState(false);\n const callback = useCallback(() => {\n setOpen(true);\n return Promise.resolve(true);\n }, []);\n useObjectsActionCallback(action.id, callback);\n const handleTypeSelect = (typeId) => {\n // Close the modal\n setOpen(false);\n // If no selection was made\n if (typeId === undefined) {\n return;\n }\n // Execute the operation with the selected typeId\n store.runOperation({\n name: \"change_type\",\n ids: objectIds,\n params: { typeId }\n }).then((r) => {\n toast({\n status: 'success',\n title: 'Change Type',\n description: `Change the type of ${objectIds.length} objects is ${r.status === 'in_progress' ? 'in progress' : 'completed'}`,\n duration: 2000\n });\n }).catch(err => {\n toast({\n status: 'error',\n title: 'Error changing type',\n description: err.message,\n duration: 5000\n });\n });\n };\n return (_jsxs(\"div\", { children: [children, _jsx(SelectContentTypeModal, { isOpen: isOpen, onClose: handleTypeSelect, title: \"Change Content Type\", confirmLabel: \"Change Type\", children: _jsxs(\"div\", { className: \"text-sm flex flex-col gap-x-2\", children: [_jsxs(\"p\", { children: [\"Choose a new Content Type for the selected object\", objectIds.length > 1 ? 's' : ' ', \"or let the system choose or generate a type based on the content.\"] }), _jsxs(\"p\", { className: \"pt-2 text-xs\", children: [\"Note: This action will raise the \", _jsx(\"code\", { children: \"change_type\" }), \" event and will trigger the standard intake workflows which may reset the object properties.\"] })] }) })] }));\n}\nexport const ChangeTypeAction = {\n id: \"changeType\",\n name: 'Change Content Type',\n description: 'Change the Content Type of the selected documents',\n confirm: false,\n component: ChangeTypeActionComponent,\n};\n//# sourceMappingURL=ChangeTypeAction.js.map","import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { ConfirmModal } from \"@vertesia/ui/core\";\nimport { useCallback, useState } from \"react\";\nimport { useObjectsActionCallback } from \"../ObjectsActionContext\";\n/**\n * Generic implementation of an action component.\n * The action component is not the one which is clicked by the user, but the one that is registering the action callback.\n * @param param0\n * @returns\n */\nexport default function ConfirmAction({ action, callback, children }) {\n const [showConfirmModal, setShowConfirmModal] = useState(false);\n const confirmationText = action.confirmationText || `Are you sure you want to ${action.name}?`;\n const _callback = useCallback((params) => {\n if (action.confirm) {\n setShowConfirmModal(true);\n return Promise.resolve(true);\n }\n else {\n return callback(params);\n }\n }, [action.confirm, callback]);\n const ctx = useObjectsActionCallback(action.id, _callback);\n const onConfirm = () => {\n setShowConfirmModal(false);\n callback({ ...ctx.params, action });\n };\n return (_jsxs(_Fragment, { children: [children, _jsx(ConfirmModal, { onConfirm: onConfirm, onCancel: () => setShowConfirmModal(false), title: \"Are you sure?\", content: confirmationText, isOpen: showConfirmModal })] }));\n}\n//# sourceMappingURL=ConfirmAction.js.map","import { jsx as _jsx } from \"react/jsx-runtime\";\nimport { useCallback } from 'react';\nimport { useToast } from '@vertesia/ui/core';\nimport { useNavigate } from \"@vertesia/ui/router\";\nimport { useUserSession } from '@vertesia/ui/session';\nimport { useDocumentSearch } from '../../search/DocumentSearchContext';\nimport { useObjectsActionContext } from '../ObjectsActionContext';\nimport ConfirmAction from './ConfirmAction';\nexport function DeleteObjectsActionComponent({ action, objectIds, children }) {\n const ctx = useObjectsActionContext();\n const toast = useToast();\n const { client } = useUserSession();\n const search = useDocumentSearch();\n const navigate = useNavigate();\n const callback = useCallback(() => {\n if (!objectIds || !objectIds.length) {\n toast({\n status: 'error',\n title: 'No objects selected',\n description: 'Please select objects to delete',\n duration: 3000\n });\n return Promise.resolve(false);\n }\n function limitFilesName(names, maxLength) {\n if (names.length <= maxLength)\n return names;\n const extIndex = names.lastIndexOf('.');\n const ext = extIndex !== -1 ? names.substring(extIndex) : '';\n const baseName = extIndex !== -1 ? names.substring(0, extIndex) : names;\n const limitedBaseName = baseName.substring(0, maxLength - ext.length - 3);\n return `${limitedBaseName}...${ext}`;\n }\n return Promise.all(objectIds.map(id => client.store.objects.delete(id))).then((res) => {\n const plural = res.length > 1 ? 's' : '';\n toast({\n status: 'success',\n title: `${res.length} object${plural} deleted`,\n description: `Objects ${(limitFilesName(res.map(d => d.id).join(\", \"), 100))} have been deleted`,\n duration: 2000\n });\n if (search) { // we are in the objects table view\n ctx.params?.selection?.removeAll();\n const facets = JSON.parse(JSON.stringify(search.facets));\n if (objectIds.length === facets._value.total) {\n search.resetFacets();\n }\n search.search();\n }\n else {\n // we are in the object view\n // go back to the parent\n navigate(\"/objects\");\n }\n }).catch(err => {\n toast({\n status: 'error',\n title: 'Error deleting objects',\n description: err.message,\n duration: 5000\n });\n });\n }, [objectIds]);\n return (_jsx(ConfirmAction, { action: action, callback: callback, children: children }));\n}\nexport const DeleteObjectsAction = {\n id: 'delete',\n name: 'Delete',\n description: 'Delete the selected objects',\n confirm: true,\n confirmationText: 'Are you sure you want to delete all the selected objects? This action cannot be undone.',\n component: DeleteObjectsActionComponent,\n destructive: true\n};\nexport const DeleteObjectsFromCollectionsAction = {\n id: 'deleteFromCollections',\n name: 'Delete Objects',\n description: 'Delete the selected objects',\n confirm: true,\n confirmationText: 'Are you sure you want to delete the selected objects?\\nThis is not removable from collections.',\n component: DeleteObjectsActionComponent,\n destructive: true\n};\n//# sourceMappingURL=DeleteObjectsAction.js.map","import { jsx as _jsx } from \"react/jsx-runtime\";\nimport { useToast } from \"@vertesia/ui/core\";\nimport { useUserSession } from \"@vertesia/ui/session\";\nimport { useCallback, useState } from \"react\";\nimport { ExportPropertiesModal, ExportTypes } from \"../../ExportPropertiesModal\";\nimport { useObjectsActionCallback } from \"../ObjectsActionContext\";\nexport function ExportPropertiesComponent({ action, objectIds }) {\n const { store } = useUserSession();\n const toast = useToast();\n const [isOpen, setOpen] = useState(false);\n const [isExporting, setIsExporting] = useState(false);\n const callback = useCallback(() => {\n setOpen(true);\n return Promise.resolve(true);\n }, []);\n const ctx = useObjectsActionCallback(action.id, callback);\n const onExportType = (exportType, exportAll) => {\n if (exportType && (exportAll || objectIds.length > 0)) {\n setIsExporting(true);\n const query = ctx.params?.search?.query || {};\n const search_objectIds = ctx.params?.search?.result?.value?.objects?.map(obj => obj.id) || undefined;\n const getChildObjects = async (objectId) => {\n return store.objects.list({\n query: {\n parent: objectId,\n }\n }).then((response) => {\n return response.map(obj => obj.id);\n });\n };\n const getObjectIds = async () => {\n if (exportAll) {\n // If there is a vector search use that.\n if (search_objectIds) {\n return query.vector ? search_objectIds : [];\n }\n // Nothing is selected, export all objects.\n if (objectIds.length === 0) {\n return [];\n }\n // If there is no search, and 1 object is selected we are on the object page.\n // Export all children of the object and the object itself.\n return (await getChildObjects(objectIds[0])).concat(objectIds);\n }\n else {\n return objectIds;\n }\n };\n getObjectIds().then((Ids) => {\n // When exporting all, send search result if a vector search was used\n // otherwise send the query.\n store.objects.exportProperties({\n objectIds: Ids,\n type: exportType,\n query: exportAll && !query.vector ? query : { type: query.type },\n }).then((response) => {\n let data;\n if (exportType === ExportTypes.CSV) {\n data = new Blob([response.data], { type: response.type });\n }\n else if (exportType === ExportTypes.JSON) {\n data = new Blob([JSON.stringify(response.data)], { type: response.type });\n }\n else {\n const responseData = response.data;\n data = new Blob([new Uint8Array(responseData.data)], { type: response.type });\n }\n const url = window.URL.createObjectURL(data);\n const a = document.createElement('a');\n a.download = response.name;\n a.href = url;\n a.click();\n toast({\n status: 'success',\n title: 'Export Properties',\n description: exportAll ? 'Export the properties of all objects completed'\n : `Export the properties of ${objectIds.length} object${objectIds.length > 1 ? 's' : ''} is completed`,\n duration: 2000\n });\n }).catch(err => {\n toast({\n status: 'error',\n title: 'Error Export Properties',\n description: err.message,\n duration: 5000\n });\n }).finally(() => {\n setIsExporting(false);\n setOpen(false);\n });\n });\n }\n else {\n setOpen(false);\n }\n };\n return (_jsx(\"div\", { children: _jsx(ExportPropertiesModal, { isExporting: isExporting, isOpen: isOpen, onClose: onExportType }) }));\n}\nexport const ExportPropertiesAction = {\n id: \"exportProperties\",\n name: 'Export Properties',\n description: 'Export all Object Properties',\n confirm: false,\n component: ExportPropertiesComponent,\n};\n//# sourceMappingURL=ExportPropertiesAction.js.map","import { jsx as _jsx } from \"react/jsx-runtime\";\nimport { useCallback } from 'react';\nimport { useToast } from '@vertesia/ui/core';\nimport { useUserSession } from '@vertesia/ui/session';\nimport { useDocumentSearch } from '../../search';\nimport { useObjectsActionContext } from '../ObjectsActionContext';\nimport ConfirmAction from './ConfirmAction';\nexport function RemoveFromCollectionActionComponent({ action, objectIds, collectionId }) {\n const ctx = useObjectsActionContext();\n const toast = useToast();\n const { client } = useUserSession();\n const search = useDocumentSearch();\n const callback = useCallback(() => {\n if (!objectIds || !objectIds.length) {\n toast({\n status: 'error',\n title: 'No objects selected',\n description: 'Please select objects to remove from collection',\n duration: 3000\n });\n return Promise.resolve(false);\n }\n if (!collectionId) {\n toast({\n status: 'error',\n title: 'No collection context',\n description: 'Cannot remove objects: no collection specified',\n duration: 3000\n });\n return Promise.resolve(false);\n }\n return client.store.collections.deleteMembers(collectionId, objectIds).then(() => {\n const plural = objectIds.length > 1 ? 's' : '';\n toast({\n status: 'success',\n title: `${objectIds.length} object${plural} removed from collection`,\n description: `Objects have been removed from the collection`,\n duration: 2000\n });\n if (search) {\n ctx.params?.selection?.removeAll();\n search.search();\n }\n }).catch((err) => {\n toast({\n status: 'error',\n title: 'Error removing objects from collection',\n description: err.message,\n duration: 5000\n });\n });\n }, [objectIds, collectionId]);\n return (_jsx(ConfirmAction, { action: action, callback: callback }));\n}\nexport const RemoveFromCollectionAction = {\n id: 'removeFromCollection',\n name: 'Remove from Collection',\n description: 'Remove the selected objects from this collection',\n confirm: true,\n confirmationText: 'Are you sure you want to remove the selected objects from this collection?',\n component: RemoveFromCollectionActionComponent,\n destructive: true\n};\n//# sourceMappingURL=RemoveFromCollectionAction.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { useUserSession } from \"@vertesia/ui/session\";\nimport { Button, VModal, VModalBody, VModalFooter, VModalTitle, SelectList, useToast } from \"@vertesia/ui/core\";\nimport { useCallback, useState } from \"react\";\nimport { useObjectsActionCallback, useObjectsActionContext } from \"../ObjectsActionContext\";\nexport function StartWorkflowComponent({ action, objectIds, collectionId }) {\n const toast = useToast();\n const { client } = useUserSession();\n const [isOpen, setOpen] = useState(false);\n const callback = useCallback(() => {\n setOpen(true);\n return Promise.resolve(true);\n }, []);\n const onStartWorkflow = (workflowId) => {\n setOpen(false);\n if (!workflowId) {\n return;\n }\n // const objectIds = params.selection.getObjectIds();\n // const workflowId = params.action.id;\n return client.store.workflows.rules\n .execute(workflowId, objectIds, { collection_id: collectionId })\n .then(() => {\n toast({\n title: \"Workflow started\",\n status: \"success\",\n duration: 3000,\n });\n })\n .catch((err) => {\n toast({\n title: \"Error starting workflow\",\n status: \"error\",\n description: err.message,\n duration: 9000,\n });\n });\n };\n useObjectsActionCallback(action.id, callback);\n return _jsx(StartWorkflowModal, { isOpen: isOpen, onClose: onStartWorkflow });\n}\nexport const StartWorkflowAction = {\n id: \"startWorkflow\",\n name: \"Start Workflow\",\n description: \"Start an workflow on the selected objects\",\n confirm: false,\n hideInList: true,\n component: StartWorkflowComponent,\n};\nfunction StartWorkflowModal({ isOpen, onClose }) {\n return (_jsxs(VModal, { onClose: () => onClose(undefined), isOpen: isOpen, className: \"\", children: [_jsx(VModalTitle, { children: \"Start a Workflow by Rule\" }), _jsx(StartWorkflowBody, { onClose: onClose })] }));\n}\nfunction optionLayout(option) {\n return {\n label: (_jsxs(\"div\", { children: [_jsx(\"div\", { children: option.name }), _jsx(\"div\", { className: \"text-sm text-muted\", children: option.description })] })),\n reverse: true,\n };\n}\nfunction StartWorkflowBody({ onClose }) {\n const [selected, setSelected] = useState(undefined);\n const context = useObjectsActionContext();\n const onSelect = (value) => {\n setSelected(value);\n };\n const onStart = () => {\n if (selected) {\n onClose(selected.id);\n }\n };\n return (_jsxs(\"div\", { children: [_jsxs(VModalBody, { children: [_jsx(\"div\", { className: \"pb-2\", children: \"Choose a workflow rule to start:\" }), _jsx(\"div\", { className: \"max-h-[420px] overflow-y-scroll border-border border rounded-md\", children: _jsx(SelectList, { options: context.wfRules, optionLayout: optionLayout, onChange: onSelect, value: selected }) })] }), _jsxs(VModalFooter, { children: [_jsx(Button, { variant: \"secondary\", onClick: () => onClose(), children: \"Cancel\" }), _jsx(Button, { onClick: onStart, isDisabled: !selected, children: \"Start\" })] })] }));\n}\n//# sourceMappingURL=StartWorkflowComponent.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { createContext, useContext, useEffect, useMemo } from 'react';\nimport { ErrorBox, useFetch, useToast } from '@vertesia/ui/core';\nimport { useUserSession } from '@vertesia/ui/session';\nimport { useDocumentSearch, useDocumentSelection } from '../../../store';\nimport { AddToCollectionAction } from './actions/AddToCollectionAction';\nimport { ChangeTypeAction } from './actions/ChangeTypeAction';\nimport { DeleteObjectsAction, DeleteObjectsFromCollectionsAction } from './actions/DeleteObjectsAction';\nimport { ExportPropertiesAction } from './actions/ExportPropertiesAction';\nimport { RemoveFromCollectionAction } from './actions/RemoveFromCollectionAction';\nimport { StartWorkflowAction, StartWorkflowComponent } from './actions/StartWorkflowComponent';\nexport class ObjectsActionContext {\n params;\n allActions = [\n ExportPropertiesAction,\n ChangeTypeAction,\n StartWorkflowAction,\n AddToCollectionAction,\n DeleteObjectsAction,\n RemoveFromCollectionAction,\n DeleteObjectsFromCollectionsAction\n ];\n wfRules = [];\n callbacks = {};\n startWorkflow;\n constructor(params) {\n this.params = params;\n }\n get actions() {\n const isInCollection = !!this.params.selection?.collectionId;\n if (isInCollection) {\n return this.allActions.filter(action => action.id !== 'addToCollection' && action.id !== 'delete');\n }\n else {\n return this.allActions.filter(action => action.id !== 'removeFromCollection' && action.id !== 'deleteFromCollections');\n }\n }\n async loadWorkflows() {\n this.params.client.workflows.rules.list().then((rules) => {\n this.wfRules = rules.map(rule => ({\n id: rule.id,\n name: rule.name,\n description: rule.description,\n confirm: false,\n isWorkflow: true,\n component: StartWorkflowComponent\n })).sort((a, b) => a.name.localeCompare(b.name));\n });\n return this.wfRules;\n }\n registerCallback(name, cb) {\n this.callbacks[name] = cb;\n return () => {\n delete this.callbacks[name];\n };\n }\n unregisterCallback(name) {\n delete this.callbacks[name];\n }\n findAction(actionId) {\n let action = this.allActions.find(a => a.id === actionId);\n if (!action) {\n action = this.wfRules.find(a => a.id === actionId);\n }\n return action;\n }\n async run(actionId) {\n const action = this.findAction(actionId);\n if (!action) {\n throw new Error(`Action ${actionId} not found`);\n }\n const params = { ...this.params, action };\n // if (action.isWorkflow) {\n // if (!this.startWorkflow) {\n // throw new Error(\"No startWorkflow callback set\");\n // }\n // return this.startWorkflow(params);\n // } else {\n const cb = this.callbacks[actionId];\n if (cb) {\n return cb(params);\n }\n else {\n throw new Error(\"No action callback set\");\n }\n // }\n }\n}\nconst ObjectsActionContextReact = createContext(undefined);\nexport function ObjectsActionContextProvider({ children }) {\n const selection = useDocumentSelection();\n const toast = useToast();\n const { client } = useUserSession();\n const search = useDocumentSearch();\n const { data: rules, error } = useFetch(() => {\n return client.workflows.rules.list().then((rules) => {\n return rules.map(rule => ({\n id: rule.id,\n name: rule.name,\n description: rule.description,\n confirm: false,\n isWorkflow: true,\n component: StartWorkflowComponent\n })).sort((a, b) => a.name.localeCompare(b.name));\n });\n }, []);\n const context = useMemo(() => {\n const context = new ObjectsActionContext({\n selection, toast, client, search\n });\n context.wfRules = rules;\n return context;\n }, [selection, rules]);\n if (error) {\n return _jsx(ErrorBox, { title: \"Failed to fetch workflows\", children: error.message });\n }\n return (context && (_jsxs(ObjectsActionContextReact.Provider, { value: context, children: [_jsx(Actions, {}), children] })));\n}\nfunction Actions({}) {\n const context = useObjectsActionContext();\n const selection = context.params.selection;\n const objectId = selection.getObjectId();\n const objectIds = selection.isSingleSelection() && objectId ? [objectId] : selection.getObjectIds();\n return (_jsx(\"div\", { style: { display: 'none' }, children: context.allActions.map(action => (_jsx(action.component, { action: action, objectIds: objectIds, collectionId: selection.collectionId }, action.id))) }));\n}\nexport function useObjectsActionContext() {\n const ctx = useContext(ObjectsActionContextReact);\n if (!ctx) {\n throw new Error(\"You cannot use useActionContext outside an ActionProvider\");\n }\n return ctx;\n}\nexport function useObjectsActionCallback(name, cb) {\n const ctx = useObjectsActionContext();\n useEffect(() => {\n return ctx.registerCallback(name, cb);\n }, [ctx, name, cb]);\n return ctx;\n}\nexport function useStartWorkflowCallback(cb) {\n const ctx = useObjectsActionContext();\n useEffect(() => {\n ctx.startWorkflow = cb;\n return () => {\n ctx.startWorkflow = undefined;\n };\n }, [cb, ctx]);\n return ctx;\n}\n//# sourceMappingURL=ObjectsActionContext.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { Button, DialogDescription, Heading, Portal, useToast, VModal, VModalBody, VModalFooter, VModalTitle, VTabs, VTabsBar, VTabsPanel } from \"@vertesia/ui/core\";\nimport { useUserSession } from \"@vertesia/ui/session\";\nimport { useCallback, useState } from \"react\";\nimport { CreateCollectionForm, SelectCollection } from \"../../../collections\";\nimport { useObjectsActionCallback } from \"../ObjectsActionContext\";\nexport function AddToCollectionActionComponent({ action, objectIds }) {\n const [showModal, setShowModal] = useState(false);\n const callback = useCallback(() => {\n if (objectIds.length > 0) {\n setShowModal(true);\n }\n return Promise.resolve(true);\n }, [objectIds]);\n const onClose = () => {\n setShowModal(false);\n };\n useObjectsActionCallback(action.id, callback);\n return showModal && _jsx(Portal, { children: _jsx(SelectCollectionModal, { objectIds: objectIds, isOpen: showModal, onClose: onClose }) });\n}\nexport const AddToCollectionAction = {\n id: \"addToCollection\",\n name: 'Add to Collection',\n description: 'Add documents to a collection',\n confirm: false,\n component: AddToCollectionActionComponent,\n};\nfunction SelectCollectionModal({ isOpen, onClose, objectIds }) {\n return (_jsxs(VModal, { isOpen: isOpen, onClose: onClose, className: \"max-w-lg w-full min-w-0 overflow-hidden\", children: [_jsx(VModalTitle, { className: \"flex flex-col min-w-0 overflow-hidden\", children: \"Add to a Collection\" }), _jsx(DialogDescription, { className: \"min-w-0 overflow-hidden\", children: \"Add the selected objects to an existing collection or create a new one.\" }), _jsx(\"div\", { className: \"min-w-0 max-w-full overflow-hidden\", children: _jsx(AddToCollectionForm, { onClose: onClose, objectIds: objectIds }) })] }));\n}\nfunction AddToCollectionForm({ onClose, objectIds }) {\n const toast = useToast();\n const { client } = useUserSession();\n const [selectedCollectionId, setSelectedCollectionId] = useState();\n const onAddToCollection = ({ collectionId }) => {\n if (!collectionId || !objectIds?.length) {\n return;\n }\n client.store.collections.addMembers(collectionId, objectIds).then(() => {\n toast({\n title: 'Add to collection success',\n status: 'success',\n description: `Added ${objectIds.length} objects to the selected collection`,\n duration: 3000\n });\n onClose();\n }).catch(() => {\n toast({\n title: 'Add to collection failure',\n status: 'error',\n description: `Failed to add the selected objects to the collection`,\n duration: 5000\n });\n });\n };\n const onCollectionChange = (collectionId, _collection) => {\n if (typeof collectionId === \"string\" || typeof collectionId === \"undefined\") {\n setSelectedCollectionId(collectionId);\n }\n else if (Array.isArray(collectionId) && collectionId.length > 0) {\n setSelectedCollectionId(collectionId[0]);\n }\n else {\n setSelectedCollectionId(undefined);\n }\n };\n const tabs = [\n {\n name: 'select',\n label: 'Select Collection',\n content: (_jsxs(\"div\", { className: \"p-4 min-w-0 max-w-full overflow-hidden\", children: [_jsx(Heading, { level: 5, children: \"Choose from existing collections\" }), _jsx(VModalBody, { className: \"min-w-0 max-w-full overflow-hidden\", children: _jsx(\"div\", { className: \"mb-4 min-w-0 max-w-full overflow-hidden\", children: _jsx(SelectCollection, { onChange: onCollectionChange, value: selectedCollectionId }) }) }), _jsx(VModalFooter, { children: _jsx(Button, { isDisabled: !selectedCollectionId, onClick: () => selectedCollectionId && onAddToCollection({ collectionId: selectedCollectionId }), children: \"Add to Collection\" }) })] }))\n },\n {\n name: 'create',\n label: 'Create new',\n content: _jsx(\"div\", { className: \"p-4\", children: _jsx(CreateCollectionForm, { onClose: onClose, onAddToCollection: (id) => onAddToCollection({ collectionId: id }), redirect: false }) })\n }\n ];\n return (_jsxs(VTabs, { defaultValue: \"select\", tabs: tabs, fullWidth: true, children: [_jsx(VTabsBar, {}), _jsx(VTabsPanel, {})] }));\n}\n//# sourceMappingURL=AddToCollectionAction.js.map","import { jsxs as _jsxs, jsx as _jsx, Fragment as _Fragment } from \"react/jsx-runtime\";\nimport { Button, Popover, PopoverContent, PopoverTrigger, SelectList } from '@vertesia/ui/core';\nimport clsx from 'clsx';\nimport { EllipsisVertical, X } from 'lucide-react';\nimport { useState } from \"react\";\nimport { DocumentUploadModal, useDocumentSelection } from \"../../../store\";\nimport { ExportPropertiesAction } from \"./actions/ExportPropertiesAction\";\nimport { StartWorkflowAction } from \"./actions/StartWorkflowComponent\";\nimport { ObjectsActionContextProvider, useObjectsActionContext } from \"./ObjectsActionContext\";\nexport function SelectionActions() {\n const selection = useDocumentSelection();\n const size = selection.size();\n const plural = size > 1 ? \"s\" : \"\";\n const hasSelection = selection?.hasSelection();\n const hasSingleSelection = selection?.isSingleSelection();\n const onClearSelection = () => {\n selection?.removeAll();\n };\n return (_jsx(ObjectsActionContextProvider, { children: _jsxs(\"div\", { className: \"flex items-center gap-x-2\", children: [hasSelection && !hasSingleSelection &&\n _jsxs(\"div\", { className: \"flex items-center gap-x-1 shrink-0\", children: [_jsxs(\"div\", { className: 'text-sm nowrap', children: [size, \" document\", plural, \" selected\"] }), _jsx(Button, { title: \"Clear selection\", variant: \"ghost\", onClick: onClearSelection, children: _jsx(X, { className: \"size-4\" }) })] }), _jsx(SelectionActionsPopover, { selection: selection, children: _jsx(Button, { variant: \"ghost\", alt: \"More action\", size: \"sm\", children: _jsx(EllipsisVertical, { size: 16 }) }) }), hasSelection && _jsx(ActionsWrapper, { selection: selection })] }) }));\n}\nfunction ActionsWrapper({}) {\n return _jsx(StartWorkflowButton, {});\n}\nexport function UploadObjectsButton({ collectionId }) {\n const [files, setFiles] = useState([]);\n const selection = useDocumentSelection();\n const hasSelection = selection?.hasSelection();\n const selectFile = () => {\n const fileInput = document.createElement(\"input\");\n fileInput.type = \"file\";\n fileInput.multiple = true;\n fileInput.accept = \"*\";\n fileInput?.click();\n fileInput.onchange = (event) => {\n const files = event.target.files;\n if (files) {\n setFiles(Array.from(files));\n }\n };\n };\n return (!hasSelection &&\n _jsxs(_Fragment, { children: [_jsx(Button, { onClick: () => selectFile(), children: \"Upload\" }), _jsx(DocumentUploadModal, { collectionId: collectionId ?? '', isOpen: files.length > 0, onClose: () => setFiles([]), files: files, title: \"Upload Files\", onUploadComplete: (result) => {\n if (result && result.success) {\n setFiles([]);\n }\n }, children: _jsx(\"div\", { className: \"text-sm\", children: \"Select the associated Content Type, or let the system choose or generate the type based on the content.\" }) })] }));\n}\nfunction StartWorkflowButton() {\n const ctx = useObjectsActionContext();\n const selection = ctx.params.selection;\n const hasSelection = selection.hasSelection();\n return (hasSelection &&\n _jsx(Button, { onClick: () => ctx.run(StartWorkflowAction.id), children: \"Start Workflow\" }));\n}\nfunction optionLayout(option) {\n return {\n label: option.name,\n className: clsx('flex-1 px-2 py-2 hover:bg-accent nowrap', option.destructive ? 'text-destructive' : ''),\n };\n}\nfunction SelectionActionsPopover({ selection, children }) {\n const context = useObjectsActionContext();\n const executeAction = (action) => {\n context.run(action.id);\n };\n return (_jsxs(Popover, { hover: true, children: [_jsx(PopoverTrigger, { children: children }), _jsx(PopoverContent, { className: 'p-0 w-50', align: 'end', sideOffset: 6, children: _jsx(PopoverBody, { executeAction: executeAction, selection: selection }) })] }));\n}\nfunction PopoverBody({ executeAction, selection }) {\n const context = useObjectsActionContext();\n const _executeAction = (action) => {\n executeAction(action);\n };\n const _selection = selection?.hasSelection() ? context.actions.filter(action => !action.hideInList) : [ExportPropertiesAction];\n return (_jsx(\"div\", { className: \"rounded-md shadow-md py-2\", children: _jsx(\"div\", { className: \"px-1 text-sm\", children: _jsx(SelectList, { options: _selection, optionLayout: optionLayout, onChange: _executeAction, noCheck: true }) }) }));\n}\n//# sourceMappingURL=SelectionActions.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { Button, Input, Spinner, VModal, VModalBody, VModalTitle } from \"@vertesia/ui/core\";\nimport { Activity, PaperclipIcon, SendIcon } from \"lucide-react\";\nimport { useEffect, useRef, useState } from \"react\";\nimport { SelectDocument } from \"../../../store\";\nexport default function MessageInput({ value, onChange, onSend, disabled = false, isSending = false, isCompleted = false, activeTaskCount = 0, placeholder = \"Type your message...\" }) {\n const ref = useRef(null);\n const [isObjectModalOpen, setIsObjectModalOpen] = useState(false);\n useEffect(() => {\n if (!disabled && isCompleted)\n ref.current?.focus();\n }, [disabled, isCompleted]);\n const keyDown = (e) => {\n if (e.key === \"Enter\" && !e.shiftKey) {\n e.preventDefault();\n onSend();\n }\n };\n const handleObjectSelect = (object) => {\n // Create a markdown link with the object title and ID\n const objectTitle = object.properties?.title || object.name || 'Object';\n const objectId = object.id;\n const markdownLink = `[${objectTitle}](store:${objectId})`;\n // Insert the link at cursor position or append to end\n const currentValue = value || '';\n const cursorPos = ref.current?.selectionStart || currentValue.length;\n const newValue = currentValue.substring(0, cursorPos) + markdownLink + currentValue.substring(cursorPos);\n // Update the input value\n onChange(newValue);\n // Close the modal\n setIsObjectModalOpen(false);\n // Focus back on the input\n setTimeout(() => {\n if (ref.current) {\n ref.current.focus();\n // Place cursor after the inserted link\n const newCursorPos = cursorPos + markdownLink.length;\n ref.current.setSelectionRange(newCursorPos, newCursorPos);\n }\n }, 100);\n };\n return (_jsxs(\"div\", { className: \"p-3 border-t border-muted flex-shrink-0\", style: { minHeight: \"90px\" }, children: [_jsxs(\"div\", { className: \"flex items-center space-x-2\", children: [_jsxs(\"div\", { className: \"flex flex-1 space-x-1\", children: [_jsx(Input, { ref: ref, value: value, onKeyDown: keyDown, onChange: onChange, disabled: disabled || isSending, placeholder: placeholder, className: \"pr-12 py-2.5\" }), _jsx(Button, { variant: \"ghost\", className: \"rounded-full\", disabled: !isCompleted, onClick: () => setIsObjectModalOpen(true), alt: \"Link Object\", children: _jsx(PaperclipIcon, { className: \"size-4\" }) })] }), _jsxs(Button, { onClick: onSend, disabled: disabled || isSending || !value.trim(), className: \"px-4 py-2.5\", children: [isSending ? _jsx(Spinner, { size: \"sm\", className: \"mr-2\" }) : _jsx(SendIcon, { className: \"size-4 mr-2\" }), \" Send\"] })] }), _jsx(\"div\", { className: \"text-xs text-muted mt-2 text-center\", children: activeTaskCount > 0 ? (_jsxs(\"div\", { className: \"flex items-center justify-center\", children: [_jsx(Activity, { className: \"h-3 w-3 mr-1 text-attention\" }), _jsxs(\"span\", { children: [\"Agent has \", activeTaskCount, \" active workstream\", activeTaskCount !== 1 ? 's' : '', \" running\"] })] })) : disabled\n ? \"Agent is processing, you can continue once it completes...\"\n : \"You can send a message at any time\" }), _jsxs(VModal, { isOpen: isObjectModalOpen, onClose: () => setIsObjectModalOpen(false), className: 'min-w-[60vw]', children: [_jsx(VModalTitle, { children: \"Link Object\" }), _jsx(VModalBody, { className: \"pb-6\", children: _jsx(SelectDocument, { onChange: handleObjectSelect }) })] })] }));\n}\n//# sourceMappingURL=MessageInput.js.map","import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from \"react/jsx-runtime\";\nimport { Badge, Button } from \"@vertesia/ui/core\";\nimport { AlertCircle, CheckCircle, Circle, Clock, X } from \"lucide-react\";\nexport default function InlineSlidingPlanPanel({ plan, workstreamStatus, isOpen, onClose, plans = [], activePlanIndex = 0, onChangePlan = () => { }, }) {\n // Don't render if panel is closed\n if (!isOpen) {\n return null;\n }\n // Render the normal panel\n return (_jsxs(\"div\", { className: \"h-full shadow-xl border border-muted/20 overflow-hidden\", children: [_jsxs(\"div\", { className: \"flex items-center justify-between p-3 border-b border-muted/20\", children: [_jsx(\"h3\", { className: \"font-bold text-base\", children: \"Plan\" }), _jsxs(Button, { variant: \"ghost\", onClick: onClose, children: [_jsx(X, { className: \"size-4\" }), _jsx(\"span\", { className: \"sr-only\", children: \"Close\" })] })] }), _jsxs(\"div\", { className: \"p-3 overflow-y-auto\", style: {\n height: \"calc(100% - 44px)\",\n maxHeight: \"calc(100vh - 150px)\",\n }, children: [_jsxs(\"div\", { className: \"mb-3 p-2 bg-info rounded-md border border-info\", children: [_jsx(\"div\", { className: \"text-xs font-medium text-info mb-1\", children: \"Task Progress\" }), _jsx(\"div\", { className: \"flex items-center gap-2\", children: (() => {\n // Get all tasks from the plan itself\n const planTasks = plan.plan || [];\n const totalTasks = planTasks.length;\n // Count completed tasks by checking their status in workstreamStatus\n let completedTasks = 0;\n if (totalTasks > 0) {\n // Count each completed task from the plan\n planTasks.forEach((task) => {\n if (task && task.id) {\n const taskId = task.id.toString();\n const taskStatus = workstreamStatus.get(taskId);\n if (taskStatus === \"completed\") {\n completedTasks++;\n }\n }\n });\n }\n // Calculate percentage\n const progressPercentage = totalTasks > 0\n ? Math.round((completedTasks / totalTasks) * 100)\n : 0;\n return (_jsxs(_Fragment, { children: [_jsx(\"div\", { className: \"w-full bg-muted rounded-full h-2\", children: _jsx(\"div\", { className: \"bg-background h-2 rounded-full\", style: { width: `${progressPercentage}%` } }) }), _jsx(\"span\", { className: \"text-xs text-muted\", children: totalTasks > 0 ? `${completedTasks}/${totalTasks}` : \"0/0\" })] }));\n })() })] }), plans.length > 1 && (_jsxs(\"div\", { className: \"mb-3 flex items-center justify-between\", children: [_jsx(Button, { variant: \"ghost\", onClick: () => onChangePlan(Math.min(plans.length - 1, activePlanIndex + 1)), disabled: activePlanIndex >= plans.length - 1, children: \"Older Plan\" }), _jsx(\"div\", { className: \"text-xs text-muted\", children: plans[activePlanIndex]?.timestamp\n ? new Date(plans[activePlanIndex].timestamp).toLocaleTimeString()\n : \"Unknown time\" }), _jsx(Button, { variant: \"ghost\", onClick: () => onChangePlan(Math.max(0, activePlanIndex - 1)), disabled: activePlanIndex <= 0, children: \"Newer Plan\" })] })), _jsxs(\"div\", { className: \"rounded-md border border-muted/30\", children: [_jsx(\"div\", { className: \"p-2 border-b border-muted/30 bg-muted\", children: _jsx(\"div\", { className: \"font-medium text-xs\", children: \"Step-by-Step Plan\" }) }), _jsx(\"div\", { className: \"divide-y divide-muted/20 max-h-[calc(100vh-350px)] overflow-y-auto\", children: plan.plan && plan.plan.length > 0 ? (plan.plan.map((task, index) => {\n // Extract task info with null checks\n const taskId = task.id ? task.id.toString() : `task-${index}`;\n const taskGoal = task.goal || `Task ${index + 1}`;\n // Determine task status - use task.status if available or lookup from workstream\n let status = task.status || \"pending\";\n if (workstreamStatus.has(taskId)) {\n status = workstreamStatus.get(taskId);\n }\n // Determine status icon and style\n let StatusIcon = Circle;\n let statusColor = \"text-muted\";\n if (status === \"in_progress\") {\n StatusIcon = Clock;\n statusColor = \"text-info\";\n }\n else if (status === \"completed\") {\n StatusIcon = CheckCircle;\n statusColor = \"text-success\";\n }\n return (_jsxs(\"div\", { className: `flex p-3 my-1`, children: [_jsx(\"div\", { className: `mr-2 mt-0.5 flex-shrink-0 text-muted`, children: taskId }), _jsxs(\"div\", { className: \"w-full\", children: [_jsx(\"div\", { className: \"text-sm font-medium mb-2 text-muted\", children: taskGoal }), _jsxs(\"div\", { className: \"mt-1 flex justify-end items-center\", children: [_jsx(\"div\", { className: `mr-2 mt-0.5 flex-shrink-0 ${statusColor}`, children: _jsx(StatusIcon, { className: \"size-3.5\" }) }), _jsx(Badge, { variant: status === \"completed\" ? \"success\" : status === \"in_progress\" ? \"info\" : \"default\", children: status === \"completed\"\n ? \"Completed\"\n : status === \"in_progress\"\n ? \"In Progress\"\n : \"Pending\" })] })] })] }, index));\n })) : (_jsxs(\"div\", { className: \"p-3 text-center text-muted italic\", children: [_jsx(AlertCircle, { className: \"size-4 mx-auto mb-2 text-attention\" }), _jsx(\"p\", { className: \"text-xs\", children: \"No plan has been detected yet\" }), _jsx(\"p\", { className: \"text-xs mt-1\", children: \"Plans will appear here when the agent creates one\" })] })) })] }), (() => {\n // Get all task IDs from the plan for filtering\n const planTaskIds = new Set((plan.plan || [])\n .filter((task) => task && task.id)\n .map((task) => task.id.toString()));\n // Filter out 'main' workstream and any IDs that are tasks in the plan\n const workstreamEntries = Array.from(workstreamStatus.entries()).filter(([id]) => id !== \"main\" && !planTaskIds.has(id));\n // Only show the section if there are actual workstreams (not tasks or main)\n return workstreamEntries.length > 0 ? (_jsxs(\"div\", { className: \"mt-3 rounded-md border border-gray-200 dark:border-gray-800\", children: [_jsx(\"div\", { className: \"p-2 border-b border-gray-200 dark:border-gray-800 bg-gray-50 dark:bg-gray-900/50\", children: _jsx(\"div\", { className: \"font-medium text-xs\", children: \"Workstreams\" }) }), _jsx(\"div\", { className: \"p-3\", children: _jsx(\"div\", { className: \"grid grid-cols-1 gap-2\", children: workstreamEntries.map(([id, status]) => {\n let StatusIcon = Circle;\n let statusColor = \"text-gray-400\";\n let statusBg = \"bg-gray-100 dark:bg-gray-800\";\n let statusText = \"Pending\";\n if (status === \"in_progress\") {\n StatusIcon = Clock;\n statusColor = \"text-info\";\n statusBg = \"bg-info/20\";\n statusText = \"In Progress\";\n }\n else if (status === \"completed\") {\n StatusIcon = CheckCircle;\n statusColor = \"text-success\";\n statusBg = \"bg-success/20\";\n statusText = \"Completed\";\n }\n return (_jsxs(\"div\", { className: `flex items-center p-1.5 rounded ${statusBg}`, children: [_jsx(\"div\", { className: `mr-1.5 ${statusColor}`, children: _jsx(StatusIcon, { className: \"h-3.5 w-3.5\" }) }), _jsx(\"div\", { className: \"flex-1\", children: _jsx(\"span\", { className: \"text-xs font-medium text-gray-800 dark:text-gray-300\", children: id }) }), _jsx(\"span\", { className: \"text-xs font-medium\", children: statusText })] }, id));\n }) }) })] })) : null;\n })()] })] }));\n}\n//# sourceMappingURL=InlineSlidingPlanPanel.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { useEffect, useMemo, useRef, useState } from \"react\";\nimport { Bot, Cpu, SendIcon, XIcon } from \"lucide-react\";\nimport { useUserSession } from \"@vertesia/ui/session\";\nimport { AgentMessageType } from \"@vertesia/common\";\nimport { Button, MessageBox, Spinner, useToast } from \"@vertesia/ui/core\";\nimport { AnimatedThinkingDots, PulsatingCircle } from \"./AnimatedThinkingDots\";\nimport AllMessagesMixed from \"./ModernAgentOutput/AllMessagesMixed\";\nimport Header from \"./ModernAgentOutput/Header\";\nimport MessageInput from \"./ModernAgentOutput/MessageInput\";\nimport { getWorkstreamId, insertMessageInTimeline, isInProgress } from \"./ModernAgentOutput/utils\";\nimport { ThinkingMessages } from \"./WaitingMessages\";\nimport InlineSlidingPlanPanel from \"./ModernAgentOutput/InlineSlidingPlanPanel\";\nexport function ModernAgentConversation(props) {\n const { run, startWorkflow } = props;\n if (run) {\n // If we have a run, convert it to AsyncExecutionResult format if needed\n const execRun = \"runId\" in run\n ? run\n : {\n runId: run.run_id,\n workflowId: run.workflow_id,\n };\n return _jsx(ModernAgentConversationInner, { ...props, run: execRun });\n }\n else if (startWorkflow) {\n // If we have startWorkflow capability but no run yet\n return _jsx(StartWorkflowView, { ...props });\n }\n else {\n // Empty state\n return _jsx(EmptyState, {});\n }\n}\n// Empty state when no agent is running\nfunction EmptyState() {\n return (_jsxs(MessageBox, { status: \"info\", icon: _jsx(Bot, { className: \"size-16 text-muted mb-4\" }), children: [_jsx(\"div\", { className: \"text-base font-medium text-muted\", children: \"No agent currently running\" }), _jsx(\"div\", { className: \"mt-3 text-sm text-muted\", children: \"Select an interaction and click Start to start an agent\" })] }));\n}\n// Start workflow view - allows initiating a new agent conversation\nfunction StartWorkflowView({ initialMessage, startWorkflow, onClose, isModal = false, placeholder = \"Type your message...\", startButtonText = \"Start Agent\", title = \"Start New Conversation\", }) {\n const [inputValue, setInputValue] = useState(\"\");\n const [isSending, setIsSending] = useState(false);\n const [run, setRun] = useState();\n const toast = useToast();\n const inputRef = useRef(null);\n useEffect(() => {\n // Focus the input field when component mounts\n if (inputRef.current) {\n inputRef.current.focus();\n }\n }, []);\n // Start a new workflow with the message\n const startWorkflowWithMessage = async () => {\n if (!startWorkflow)\n return;\n const message = inputValue.trim();\n if (!message || isSending)\n return;\n setIsSending(true);\n try {\n // Reset plan panel state when starting a new agent\n sessionStorage.removeItem(\"plan-panel-shown\");\n toast({\n title: \"Starting agent...\",\n status: \"info\",\n duration: 3000,\n });\n const newRun = await startWorkflow(message);\n if (newRun) {\n setRun({\n runId: newRun.run_id,\n workflowId: newRun.workflow_id,\n });\n setInputValue(\"\");\n toast({\n title: \"Agent started\",\n status: \"success\",\n duration: 3000,\n });\n }\n }\n catch (err) {\n toast({\n title: \"Error starting workflow\",\n status: \"error\",\n duration: 3000,\n description: err instanceof Error ? err.message : \"Unknown error\",\n });\n }\n finally {\n setIsSending(false);\n }\n };\n const handleKeyDown = (e) => {\n if (e.key === \"Enter\" && !e.shiftKey) {\n e.preventDefault();\n startWorkflowWithMessage();\n }\n };\n // If a run has been started, show the conversation\n if (run) {\n return (_jsx(ModernAgentConversationInner, { onClose, isModal, initialMessage, placeholder, run: run, title: title }));\n }\n return (_jsxs(\"div\", { className: \"flex flex-col h-full bg-white dark:bg-gray-900 overflow-hidden border-0\", children: [_jsxs(\"div\", { className: \"flex items-center justify-between py-2 px-3 border-b border-gray-100 dark:border-gray-800 bg-white dark:bg-gray-900\", children: [_jsxs(\"div\", { className: \"flex items-center space-x-2\", children: [_jsx(\"div\", { className: \"p-1\", children: _jsx(Cpu, { className: \"size-3.5 text-muted\" }) }), _jsx(\"span\", { className: \"font-medium text-sm text-gray-700 dark:text-gray-300\", children: title })] }), onClose && !isModal && (_jsx(Button, { size: \"xs\", variant: \"ghost\", onClick: onClose, title: \"Close\", className: \"text-slate-500 hover:text-slate-700\", children: _jsx(XIcon, { className: \"size-4\" }) }))] }), _jsxs(\"div\", { className: \"flex-1 overflow-y-auto px-4 py-6 bg-white dark:bg-gray-900 flex flex-col items-center justify-center\", children: [initialMessage && (_jsx(\"div\", { className: \"px-4 py-3 mb-4 bg-blue-50/80 dark:bg-blue-900/30 border-l-2 border-blue-400 dark:border-blue-500 text-blue-700 dark:text-blue-300 max-w-md\", children: initialMessage })), _jsxs(\"div\", { className: \"bg-white dark:bg-slate-800 p-4 max-w-md border-l-2 border-blue-400 dark:border-blue-500\", children: [_jsx(\"div\", { className: \"text-base text-slate-600 dark:text-slate-300 font-medium\", children: \"Enter a message to start a conversation\" }), _jsxs(\"div\", { className: \"mt-3 text-sm text-slate-500 dark:text-slate-400\", children: [\"Type your question below and press Enter or click \", startButtonText, \" \", \"to begin\"] })] })] }), _jsxs(\"div\", { className: \"py-3 px-3 border-t border-gray-100 dark:border-gray-800 bg-white dark:bg-gray-900\", children: [_jsxs(\"div\", { className: \"flex items-center gap-2\", children: [_jsx(\"div\", { className: \"flex-1\", children: _jsx(\"input\", { ref: inputRef, value: inputValue, onChange: (e) => setInputValue(e.target.value), onKeyDown: handleKeyDown, placeholder: placeholder, disabled: isSending, className: \"w-full py-2 px-3 text-sm border border-gray-200 dark:border-gray-700 dark:bg-gray-800 dark:text-white focus:border-gray-300 dark:focus:border-gray-600 focus:ring-0 rounded-md\" }) }), _jsxs(Button, { onClick: startWorkflowWithMessage, disabled: !inputValue.trim() || isSending, className: \"px-3 py-2 bg-gray-800 dark:bg-gray-700 hover:bg-gray-700 dark:hover:bg-gray-600 text-white text-xs rounded-md transition-colors\", children: [isSending ? (_jsx(Spinner, { size: \"sm\", className: \"mr-1.5\" })) : (_jsx(SendIcon, { className: \"size-3.5 mr-1.5\" })), startButtonText] })] }), _jsx(\"div\", { className: \"text-xs text-gray-400 dark:text-gray-500 mt-2 text-center\", children: \"Type a message to start the conversation\" })] })] }));\n}\n// Inner component that handles the agent conversation - similar to ModernAgentOutput\nfunction ModernAgentConversationInner({ run, title, interactive = true, onClose, isModal = false, placeholder = \"Type your message...\", resetWorkflow, }) {\n const { client } = useUserSession();\n const bottomRef = useRef(null);\n const [messages, setMessages] = useState([]);\n const [isCompleted, setIsCompleted] = useState(false);\n const [inputValue, setInputValue] = useState(\"\");\n const [isSending, setIsSending] = useState(false);\n const [viewMode, setViewMode] = useState(\"sliding\");\n const [showSlidingPanel, setShowSlidingPanel] = useState(!isModal);\n // Keep track of multiple plans and their timestamps\n const [plans, setPlans] = useState([]);\n // Track which plan is currently active in the UI\n const [activePlanIndex, setActivePlanIndex] = useState(0);\n // Store workstream status for each plan separately\n const [workstreamStatusMap, setWorkstreamStatusMap] = useState(new Map());\n const [thinkingMessageIndex, setThinkingMessageIndex] = useState(0);\n const toast = useToast();\n const [showInput, setShowInput] = useState(interactive);\n const [workflowStatus, setWorkflowStatus] = useState(null);\n // Helper function to get the current active plan and its workstream status\n const getActivePlan = useMemo(() => {\n const currentPlanData = plans[activePlanIndex] || {\n plan: { plan: [] },\n timestamp: 0,\n };\n const currentWorkstreamStatus = workstreamStatusMap.get(currentPlanData.timestamp) || new Map();\n return {\n plan: currentPlanData.plan,\n workstreamStatus: currentWorkstreamStatus,\n };\n }, [plans, activePlanIndex, workstreamStatusMap]);\n // Show rotating thinking messages\n useEffect(() => {\n if (!isCompleted) {\n const interval = setInterval(() => {\n setThinkingMessageIndex(() => Math.floor(Math.random() * (ThinkingMessages.length - 1)));\n }, 4000);\n return () => clearInterval(interval);\n }\n }, [isCompleted]);\n const checkWorkflowStatus = async () => {\n try {\n const statusResult = await client.store.workflows.getRunDetails(run.runId, run.workflowId);\n setWorkflowStatus(statusResult.status);\n }\n catch (error) {\n console.error('Failed to check workflow status:', error);\n }\n };\n // Stream messages from the agent\n useEffect(() => {\n // Reset all state when runId changes (new agent)\n setMessages([]);\n setPlans([]);\n setActivePlanIndex(0);\n setWorkstreamStatusMap(new Map());\n setShowSlidingPanel(false);\n setWorkflowStatus(null);\n checkWorkflowStatus();\n client.store.workflows.streamMessages(run.workflowId, run.runId, (message) => {\n if (message.message) {\n setMessages((prev_messages) => {\n if (!prev_messages.find((m) => m.timestamp === message.timestamp)) {\n insertMessageInTimeline(prev_messages, message);\n return [...prev_messages];\n }\n else {\n return prev_messages;\n }\n });\n }\n });\n // Clear messages and unsubscribe when component unmounts or runId changes\n return () => {\n setMessages([]);\n // Client handles unsubscribing from the message stream internally\n };\n }, [run.runId, client.store.workflows]);\n // Update completion status when messages change\n // This now accounts for multiple workstreams\n useEffect(() => {\n setIsCompleted(!isInProgress(messages));\n // Only automatically hide the panel when there are no plans\n // But don't auto-show it when plans appear\n if (plans.length === 0) {\n // If there are no plans, make sure the plan panel is hidden\n setShowSlidingPanel(false);\n }\n // We removed the auto-show functionality to allow users to keep the panel closed if they want\n }, [messages, plans.length]);\n // Update plans and workstream status based on incoming messages\n useEffect(() => {\n // Only show the sliding panel for the very first plan and only once\n if (plans.length === 1 &&\n !showSlidingPanel &&\n !sessionStorage.getItem(\"plan-panel-shown\")) {\n // For first-time plan detection only, show the panel with a delay\n const notificationTimeout = setTimeout(() => {\n setShowSlidingPanel(true);\n // Mark that we've shown the panel once\n sessionStorage.setItem(\"plan-panel-shown\", \"true\");\n }, 500); // Short delay to ensure the UI has fully rendered\n return () => clearTimeout(notificationTimeout);\n }\n // Process messages to extract plan information\n messages.forEach((message) => {\n if (message.type === AgentMessageType.PLAN) {\n try {\n // Log message details for debugging\n console.log(\"PLAN message received:\", message.type);\n let newPlanDetails = null;\n // Extract the plan from the message details object\n if (message.details && typeof message.details === \"object\") {\n // For a PLAN type message like the example you provided\n if (message.details.plan && Array.isArray(message.details.plan)) {\n console.log(\"Valid plan array found in message.details.plan\");\n newPlanDetails = { plan: message.details.plan };\n }\n }\n // Only proceed if we have a valid plan\n if (newPlanDetails) {\n const timestamp = typeof message.timestamp === \"number\"\n ? message.timestamp\n : new Date(message.timestamp).getTime();\n // Check if we already have this plan\n const existingPlanIndex = plans.findIndex((p) => p.timestamp === timestamp);\n if (existingPlanIndex === -1 && newPlanDetails) {\n console.log(\"Adding new plan to plans array\");\n // This is a new plan - add it to our plans array\n const newPlan = {\n plan: newPlanDetails,\n timestamp,\n };\n // Add new plan to the beginning of the array (newest first)\n console.log(\"Adding plan to plans array:\", newPlan);\n setPlans((prev) => {\n const newPlans = [newPlan, ...prev];\n console.log(\"New plans array:\", newPlans);\n return newPlans;\n });\n // Set this as the active plan\n setActivePlanIndex(0);\n // Automatically show sliding plan panel when a plan is detected\n console.log(\"Setting showSlidingPanel to true\");\n setShowSlidingPanel(true);\n // Initialize workstreams as pending based on the plan tasks\n const newWorkstreamStatus = new Map();\n // Always initialize main workstream\n newWorkstreamStatus.set(\"main\", \"in_progress\");\n // Initialize each task in the plan with its status\n if (Array.isArray(newPlanDetails.plan)) {\n newPlanDetails.plan.forEach((task) => {\n if (task && typeof task === \"object\" && task.id) {\n const taskId = task.id.toString();\n // Use the task's status if available, otherwise default to pending\n newWorkstreamStatus.set(taskId, task.status || \"pending\");\n }\n });\n }\n // Update the workstream status map with the new status for this plan\n setWorkstreamStatusMap((prev) => {\n const newMap = new Map(prev);\n newMap.set(timestamp, newWorkstreamStatus);\n return newMap;\n });\n }\n }\n }\n catch (error) {\n console.error(\"Failed to parse plan from message:\", error);\n }\n }\n // Handle UPDATE type messages with plan updates\n if (message.type === AgentMessageType.UPDATE && message.details) {\n // We no longer process UPDATE messages with details.updates\n // Instead, we rely on the PLAN message that follows with the complete plan\n if (message.details.updates && Array.isArray(message.details.updates)) {\n console.log(\"Ignoring UPDATE message with details.updates - waiting for PLAN message with full plan\");\n // This is an initial update notification, but we'll wait for the PLAN message that follows\n // with the complete updated plan before making any UI changes\n }\n }\n });\n const lastMessage = messages[messages.length - 1];\n if (lastMessage) {\n if (lastMessage.type === AgentMessageType.TERMINATED) {\n setShowInput(false);\n setWorkflowStatus(\"TERMINATED\");\n }\n else {\n if (interactive) {\n setShowInput(true);\n }\n else {\n setShowInput(lastMessage.type === AgentMessageType.REQUEST_INPUT);\n }\n }\n }\n }, [messages, plans, activePlanIndex]);\n // Send a message to the agent\n const handleSendMessage = () => {\n const message = inputValue.trim();\n if (!message || isSending)\n return;\n setIsSending(true);\n setInputValue(\"\");\n client.store.workflows\n .sendSignal(run.workflowId, run.runId, \"UserInput\", {\n message,\n })\n .then(() => {\n setIsCompleted(false);\n toast({\n status: \"success\",\n title: \"Message Sent\",\n duration: 2000,\n });\n })\n .catch((err) => {\n toast({\n status: \"error\",\n title: \"Failed to Send Message\",\n description: err instanceof Error ? err.message : \"Unknown error\",\n duration: 3000,\n });\n })\n .finally(() => {\n setIsSending(false);\n });\n };\n // Calculate number of active tasks for the status indicator\n const getActiveTaskCount = () => {\n if (!messages.length)\n return 0;\n // Group messages by workstream\n const workstreamMessages = new Map();\n messages.forEach((message) => {\n const workstreamId = getWorkstreamId(message);\n if (workstreamId !== \"main\" && workstreamId !== \"all\") {\n if (!workstreamMessages.has(workstreamId)) {\n workstreamMessages.set(workstreamId, []);\n }\n workstreamMessages.get(workstreamId).push(message);\n }\n });\n // Count workstreams that don't have completion messages\n let activeCount = 0;\n for (const [_, msgs] of workstreamMessages.entries()) {\n if (msgs.length > 0) {\n const lastMessage = msgs[msgs.length - 1];\n // If the last message isn't a completion message, the workstream is active\n if (![AgentMessageType.COMPLETE, AgentMessageType.IDLE].includes(lastMessage.type)) {\n activeCount++;\n }\n }\n }\n return activeCount;\n };\n const actualTitle = title || run.workflowId.split(\":\")[2] || \"Agent Conversation\";\n // Handle downloading conversation\n const downloadConversation = async () => {\n try {\n const url = await getConversationUrl(client, run.runId);\n if (url)\n window.open(url, \"_blank\");\n }\n catch (err) {\n console.error(\"Failed to download conversation\", err);\n toast({\n status: \"error\",\n title: \"Failed to download conversation\",\n duration: 3000,\n });\n }\n };\n // Handle copying run ID\n const copyRunId = () => {\n navigator.clipboard.writeText(run.runId);\n toast({\n status: \"success\",\n title: \"Run ID copied\",\n duration: 2000,\n });\n };\n return (_jsxs(\"div\", { className: \"flex gap-2 h-full\", children: [_jsxs(\"div\", { className: `flex flex-col h-full min-h-0 border-0 ${showSlidingPanel ? 'lg:w-2/3 flex-1' : `flex-1 mx-auto ${!isModal ? 'max-w-4xl' : ''}`}`, children: [_jsx(Header, { title: actualTitle, isCompleted: isCompleted, onClose: onClose, isModal: isModal, run: run, viewMode: viewMode, onViewModeChange: setViewMode, showPlanPanel: showSlidingPanel, hasPlan: plans.length > 0, onTogglePlanPanel: () => {\n setShowSlidingPanel(!showSlidingPanel);\n // When opening the plan panel, mark that we've shown it\n if (!showSlidingPanel) {\n sessionStorage.setItem(\"plan-panel-shown\", \"true\");\n }\n }, onDownload: downloadConversation, onCopyRunId: copyRunId, resetWorkflow: resetWorkflow }), messages.length === 0 && !isCompleted ? (_jsx(\"div\", { className: \"flex-1 flex flex-col items-center justify-center h-full text-center py-6\", children: _jsxs(\"div\", { className: \"p-5 max-w-md border border-info rounded-lg shadow-sm\", children: [_jsxs(\"div\", { className: \"flex items-center space-x-3 mb-3\", children: [_jsx(PulsatingCircle, { size: \"sm\", color: \"blue\" }), _jsx(\"div\", { className: \"text-sm text-muted font-medium\", children: ThinkingMessages[thinkingMessageIndex] })] }), _jsx(\"div\", { className: \"mt-4 flex justify-center\", children: _jsx(AnimatedThinkingDots, { color: \"blue\", className: \"mt-1\" }) })] }) })) : (_jsx(AllMessagesMixed, { messages: messages, bottomRef: bottomRef, viewMode: viewMode, isCompleted: isCompleted, plan: getActivePlan.plan, workstreamStatus: getActivePlan.workstreamStatus, showPlanPanel: showSlidingPanel, onTogglePlanPanel: () => {\n console.log(\"Toggle plan panel called, current state:\", showSlidingPanel);\n setShowSlidingPanel(!showSlidingPanel);\n }, plans: plans, activePlanIndex: activePlanIndex, onChangePlan: (index) => setActivePlanIndex(index), taskLabels: getActivePlan.plan.plan?.reduce((acc, task) => {\n if (task.id && task.goal) {\n acc.set(task.id.toString(), task.goal);\n }\n return acc;\n }, new Map()) })), workflowStatus && (workflowStatus !== \"RUNNING\" ? (_jsxs(MessageBox, { status: workflowStatus === \"COMPLETED\" ? 'success' : 'done', icon: null, className: \"flex-shrink-0 m-2\", children: [\"This Workflow is \", workflowStatus] })) : showInput && (_jsx(MessageInput, { value: inputValue, onChange: setInputValue, onSend: handleSendMessage, disabled: false, isSending: isSending, isCompleted: isCompleted, activeTaskCount: getActiveTaskCount(), placeholder: placeholder })))] }), showSlidingPanel && (_jsx(\"div\", { className: \"h-full lg:w-1/3 border-l\", children: _jsx(InlineSlidingPlanPanel, { plan: getActivePlan.plan, workstreamStatus: getActivePlan.workstreamStatus, isOpen: showSlidingPanel, onClose: () => setShowSlidingPanel(false), plans: plans, activePlanIndex: activePlanIndex, onChangePlan: setActivePlanIndex }) }))] }));\n}\n// Helper function to get conversation URL - used by other components\nexport async function getConversationUrl(vertesia, workflowRunId) {\n return vertesia.files\n .getDownloadUrl(`agents/${workflowRunId}/conversation.json`)\n .then((r) => r.url);\n}\n//# sourceMappingURL=ModernAgentConversation.js.map","import { jsx as _jsx } from \"react/jsx-runtime\";\nimport { ErrorBoundary } from \"react-error-boundary\";\nexport function VertesiaErrorBoundary({ children, fallback }) {\n if (ErrorBoundaryInstance) { // custom error boundary?\n return _jsx(ErrorBoundaryInstance, { fallback: fallback, children: children });\n }\n else {\n return _jsx(ErrorBoundary, { FallbackComponent: fallback, children: children });\n }\n}\nlet ErrorBoundaryInstance = null;\nexport function setErrorBoundaryComponent(ErrorBoundaryComponent) {\n ErrorBoundaryInstance = ErrorBoundaryComponent;\n}\n//# sourceMappingURL=VertesiaErrorBoundary.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { MessageBox } from '@vertesia/ui/core';\nimport { VertesiaErrorBoundary } from './VertesiaErrorBoundary';\nexport function PanelErrorBoundary({ children }) {\n return (_jsx(VertesiaErrorBoundary, { fallback: PanelErrorFallback, children: children }));\n}\nfunction PanelErrorFallback({ error }) {\n return (_jsxs(MessageBox, { status: \"error\", title: \"Sorry, something went wrong...\", children: [_jsxs(\"div\", { className: 'mb-4', children: [\"Our team has been notified and will be quickly working on resolving it. If you'd like to escalate or simply contact us, please email us at\\u00A0\", _jsx(\"a\", { className: 'text-info', href: \"mailto:support@vertesiahq.com\", children: \"support@vertesiahq.com\" }), \".\"] }), error?.message &&\n _jsx(\"code\", { className: 'w-full mt-4 text-sm text-muted break-words', children: error.message })] }));\n}\n//# sourceMappingURL=PanelErrorBoundary.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { VertesiaErrorBoundary } from \"./VertesiaErrorBoundary\";\nexport function RowErrorBoundary({ children }) {\n return (_jsx(VertesiaErrorBoundary, { fallback: RowErrorFallback, children: children }));\n}\nfunction RowErrorFallback({ error }) {\n return (_jsx(\"tr\", { children: _jsxs(\"td\", { colSpan: 100, children: [_jsx(\"span\", { className: \"text-xs\", children: \" Cannot display row\" }), _jsx(\"br\", {}), _jsx(\"span\", { className: \"bg-gray-400\", children: error?.message })] }) }));\n}\n//# sourceMappingURL=RowErrorBoundary.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { VertesiaErrorBoundary } from './VertesiaErrorBoundary';\nexport function WidgetErrorBoundary({ children }) {\n return (_jsx(VertesiaErrorBoundary, { fallback: WidgetErrorFallback, children: children }));\n}\nfunction WidgetErrorFallback({ error }) {\n console.log('WidgetError', error);\n return (_jsxs(\"div\", { className: \"text-sm\", children: [\"Sorry, this area cannot be loaded or rendered.\", error?.message &&\n _jsx(\"pre\", { children: error.message })] }));\n}\n//# sourceMappingURL=WidgetErrorBoundary.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport clsx from 'clsx';\nimport { ChevronRight, Info } from 'lucide-react';\nimport { VTooltip, Breadcrumbs } from '@vertesia/ui/core';\nimport { capitalize } from 'lodash-es';\nimport { useNavigate } from '@vertesia/ui/router';\nexport function GenericPageNavHeader({ className, children, title, description, actions, breadcrumbs, isCompact = false, useDynamicBreadcrumbs = true }) {\n const navigate = useNavigate();\n const buildBreadcrumbLabel = (entry) => {\n const href = entry?.href || '';\n if (!href)\n return 'Page';\n const cleanHref = href.split('#')[0].split('?')[0];\n const pathSegments = cleanHref.split('/').filter((segment) => segment.length > 0);\n if (pathSegments.length === 3) {\n const secondSegment = pathSegments[1];\n return `${capitalize(secondSegment)} Detail`;\n }\n else if (pathSegments.length >= 2) {\n return capitalize(pathSegments[pathSegments.length - 1]);\n }\n else if (pathSegments.length === 1) {\n return capitalize(pathSegments[0]);\n }\n return 'Page';\n };\n // Build breadcrumb items from history chain and current breadcrumbs\n const buildBreadcrumbItems = () => {\n const items = [];\n // Add items from history chain\n if (useDynamicBreadcrumbs && typeof window !== 'undefined' && window.history.state?.historyChain) {\n const historyChain = window.history.state.historyChain;\n historyChain.forEach((entry, index) => {\n const stepsBack = historyChain.length - index;\n items.push({\n label: buildBreadcrumbLabel(entry),\n href: entry.href,\n onClick: () => window.history.go(-stepsBack)\n });\n });\n }\n // Add current page breadcrumbs\n if (breadcrumbs && breadcrumbs.length > 0) {\n breadcrumbs.forEach((breadcrumb) => {\n // Extract text content from React element\n const label = typeof breadcrumb?.props?.children === 'string'\n ? breadcrumb.props.children\n : 'Page';\n items.push((breadcrumb?.props?.href) ? {\n href: breadcrumb?.props?.href,\n label: label,\n onClick: () => navigate(breadcrumb.props.href, { replace: breadcrumb.props.clearBreadcrumbs }),\n } : {\n label: label\n });\n });\n }\n return items;\n };\n const breadcrumbItems = buildBreadcrumbItems();\n return (_jsxs(\"div\", { className: clsx(isCompact ? 'pb-0' : 'pb-2', 'p-4 flex flex-col', className), children: [_jsxs(\"div\", { className: 'flex items-start gap-4', children: [_jsxs(\"div\", { className: \"w-full flex place-content-between h-auto min-h-8 flex-col items-start\", children: [_jsx(\"nav\", { className: \"flex-1 flex justify-start text-xs\", children: breadcrumbItems.length > 0 && (_jsx(Breadcrumbs, { path: breadcrumbItems, separator: _jsx(ChevronRight, { className: \"w-3.5 h-3.5\" }), maxItems: 4 })) }), _jsxs(\"div\", { className: 'flex gap-2 items-center', children: [_jsx(\"h1\", { className: \"text-xl font-semibold break-all\", children: title }), description &&\n _jsx(VTooltip, { description: description, children: _jsx(Info, { className: \"size-4 text-muted\" }) })] })] }), _jsx(\"div\", { className: \"flex gap-x-2 shrink-0\", children: actions })] }), children && _jsx(\"div\", { className: \"w-full flex items-center\", children: children })] }));\n}\n//# sourceMappingURL=GenericPageNavHeader.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nexport function NotFoundView({}) {\n return (_jsxs(\"div\", { className: \"text-center pt-32\", children: [_jsx(\"h1\", { className: \"text-3xl font-bold text-red-500\", children: \"404\" }), _jsx(\"p\", { className: \"text-2xl\", children: \"Page Not Found\" })] }));\n}\n//# sourceMappingURL=NotFoundView.js.map","import { jsx as _jsx } from \"react/jsx-runtime\";\nimport { useUserSession } from \"@vertesia/ui/session\";\nimport React, { createContext, useEffect, useState } from \"react\";\nconst DEFAULT_PAGE_COUNT = 10;\nconst ADVANCED_PROCESSING_PREFIX = \"magic-pdf\";\nclass PageLayoutProvider {\n totalPages;\n layoutUrls = [];\n cache;\n constructor(totalPages) {\n this.totalPages = totalPages;\n this.cache = new Array(totalPages);\n }\n async loadUrls(vertesia, objectId) {\n const layoutPromises = [];\n for (let i = 0; i < this.totalPages; i++) {\n layoutPromises.push(getLayoutUrlForPage(vertesia, objectId, i + 1));\n }\n const layoutUrls = await Promise.all(layoutPromises);\n this.layoutUrls = layoutUrls.map((r) => r.url);\n }\n async getPageLayout(page) {\n const index = page - 1;\n let content = this.cache[index];\n if (content === undefined) {\n const url = this.layoutUrls[index];\n content = await fetch(url, { method: \"GET\" }).then((r) => {\n if (r.ok) {\n return r.text();\n }\n else {\n throw new Error(\"Failed to fetch json layout: \" + r.statusText);\n }\n });\n this.cache[index] = content;\n }\n return content;\n }\n}\nclass PageMarkdownProvider {\n totalPages;\n markdownUrls = [];\n cache;\n constructor(totalPages) {\n this.totalPages = totalPages;\n this.cache = new Array(totalPages);\n }\n async loadUrls(vertesia, objectId) {\n const markdownPromises = [];\n for (let i = 0; i < this.totalPages; i++) {\n markdownPromises.push(getMarkdownUrlForPage(vertesia, objectId, i + 1));\n }\n const markdownUrls = await Promise.all(markdownPromises);\n this.markdownUrls = markdownUrls.map((r) => r.url);\n }\n async getPageMarkdown(page) {\n const index = page - 1;\n let content = this.cache[index];\n if (content === undefined) {\n const url = this.markdownUrls[index];\n content = await fetch(url, { method: \"GET\" }).then((r) => {\n if (r.ok) {\n return r.text();\n }\n else {\n throw new Error(\"Failed to fetch markdown: \" + r.statusText);\n }\n });\n this.cache[index] = content;\n }\n return content;\n }\n}\nconst PdfPageContext = createContext(undefined);\nexport function PdfPageProvider({ children, object }) {\n const { client } = useUserSession();\n const [info, setInfo] = useState();\n useEffect(() => {\n const page_count = object.metadata.page_count ||\n DEFAULT_PAGE_COUNT;\n getPdfPagesInfo(client, object, page_count).then(setInfo);\n }, [object.id]);\n return (info && (_jsx(PdfPageContext.Provider, { value: info, children: children })));\n}\nfunction getBasePath(objectId) {\n return `${ADVANCED_PROCESSING_PREFIX}/${objectId}`;\n}\nfunction getPageImagePath(objectId, pageNumber, ext = \".jpg\") {\n return `${getBasePath(objectId)}/pages/page-${pageNumber}${ext}`;\n}\nfunction getPageAnnotatedImagePath(objectId, pageNumber, ext = \".jpg\") {\n return `${getBasePath(objectId)}/pages/page-${pageNumber}-annotated${ext}`;\n}\nfunction getPageInstrumentedImagePath(objectId, pageNumber, ext = \".jpg\") {\n return `${getBasePath(objectId)}/pages/page-${pageNumber}.instrumented${ext}`;\n}\nfunction getPageOriginalImagePath(objectId, pageNumber, ext = \".jpg\") {\n return `${getBasePath(objectId)}/pages/page-${pageNumber}.original${ext}`;\n}\nfunction getLayoutJsonPath(objectId, pageNumber) {\n return `${getBasePath(objectId)}/pages/page-${pageNumber}.layout.json`;\n}\nfunction getMarkdownPath(objectId, pageNumber) {\n return `${getBasePath(objectId)}/pages/page-${pageNumber}.md`;\n}\nexport function getResourceUrl(vertesia, objectId, name) {\n return vertesia.files\n .getDownloadUrl(`${getBasePath(objectId)}/${name}`)\n .then((r) => r.url);\n}\nfunction getImageUrlForPage(vertesia, objectId, pageNumber) {\n return vertesia.files.getDownloadUrl(getPageImagePath(objectId, pageNumber));\n}\nfunction getAnnotatedImageUrlForPage(vertesia, objectId, pageNumber) {\n return vertesia.files.getDownloadUrl(getPageAnnotatedImagePath(objectId, pageNumber));\n}\nfunction getInstrumentedImageUrlForPage(vertesia, objectId, pageNumber) {\n return vertesia.files.getDownloadUrl(getPageInstrumentedImagePath(objectId, pageNumber));\n}\nfunction getOriginalImageUrlForPage(vertesia, objectId, pageNumber) {\n return vertesia.files.getDownloadUrl(getPageOriginalImagePath(objectId, pageNumber));\n}\nfunction getLayoutUrlForPage(vertesia, objectId, pageNumber) {\n return vertesia.files.getDownloadUrl(getLayoutJsonPath(objectId, pageNumber));\n}\nfunction getMarkdownUrlForPage(vertesia, objectId, pageNumber) {\n return vertesia.files.getDownloadUrl(getMarkdownPath(objectId, pageNumber));\n}\nasync function getPdfPagesInfo(vertesia, object, page_count) {\n const imageUrlPromises = [];\n for (let i = 0; i < page_count; i++) {\n imageUrlPromises.push(getImageUrlForPage(vertesia, object.id, i + 1));\n }\n const imageUrls = await Promise.all(imageUrlPromises);\n const annotatedImageUrlPromises = [];\n for (let i = 0; i < page_count; i++) {\n annotatedImageUrlPromises.push(getAnnotatedImageUrlForPage(vertesia, object.id, i + 1));\n }\n const annotatedImageUrls = await Promise.all(annotatedImageUrlPromises);\n const instrumentedImageUrlPromises = [];\n for (let i = 0; i < page_count; i++) {\n instrumentedImageUrlPromises.push(getInstrumentedImageUrlForPage(vertesia, object.id, i + 1));\n }\n const instrumentedImageUrls = await Promise.all(instrumentedImageUrlPromises);\n const originalImageUrlPromises = [];\n for (let i = 0; i < page_count; i++) {\n originalImageUrlPromises.push(getOriginalImageUrlForPage(vertesia, object.id, i + 1));\n }\n const originalImageUrls = await Promise.all(originalImageUrlPromises);\n const layoutProvider = new PageLayoutProvider(page_count);\n await layoutProvider.loadUrls(vertesia, object.id);\n const markdownProvider = new PageMarkdownProvider(page_count);\n await markdownProvider.loadUrls(vertesia, object.id);\n const xml = object.text ? cleanXml(object.text) : \"\";\n return {\n count: page_count,\n urls: imageUrls.map((r) => r.url),\n originalUrls: originalImageUrls.map((r) => r.url),\n annotatedUrls: annotatedImageUrls.map((r) => r.url),\n instrumentedUrls: instrumentedImageUrls.map((r) => r.url),\n layoutProvider,\n markdownProvider,\n xml,\n xmlPages: object.text ? extractXmlPages(xml) : [],\n };\n}\nexport function usePdfPagesInfo() {\n const context = React.useContext(PdfPageContext);\n if (!context) {\n throw new Error(\"usePdfPagesInfo must be used within a PdfPageProvider\");\n }\n return context;\n}\nfunction extractXmlPages(xml) {\n // Parse the XML string\n const doc = new DOMParser().parseFromString(cleanXml(xml), \"text/xml\");\n const pages = doc.getElementsByTagName(\"page\");\n const serializer = new XMLSerializer();\n return Array.from(pages).map((p) => serializer.serializeToString(p));\n}\nfunction cleanXml(xml) {\n const cleanedXML = xml\n // eslint-disable-next-line no-control-regex\n .replace(/[\\x00-\\x08\\x0B\\x0C\\x0E-\\x1F\\x7F]/g, \"\")\n .replace(/<\\?xml.*?\\?>/g, \"\");\n return cleanedXML;\n}\n//# sourceMappingURL=PdfPageProvider.js.map","import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { useUserSession } from \"@vertesia/ui/session\";\nimport { Popover } from \"@vertesia/ui/widgets\";\nimport { CloudDownload } from \"lucide-react\";\nimport { getResourceUrl } from \"./PdfPageProvider\";\nexport function DownloadPopover({ object }) {\n const { client } = useUserSession();\n const onDownload = (name) => {\n getResourceUrl(client, object.id, name).then(url => window.open(url, '_blank'));\n };\n const getProcessorType = () => {\n if (object.metadata?.type === \"document\") {\n const docMetadata = object.metadata;\n return docMetadata.content_processor?.type || \"xml\";\n }\n return \"xml\"; // default\n };\n const processorType = getProcessorType();\n const renderDownloadOptions = () => {\n if (processorType === \"markdown\") {\n return (_jsx(\"button\", { className: \"p-2 cursor-pointer hover:bg-slate-50 dark:hover:bg-slate-100\", onClick: () => onDownload(\"document.md\"), children: \"document.md\" }));\n }\n // Default XML processor options\n return (_jsxs(_Fragment, { children: [_jsx(\"button\", { className: \"p-2 cursor-pointer hover:bg-slate-50 dark:hover:bg-slate-100\", onClick: () => onDownload(\"annotated.pdf\"), children: \"annotated.pdf\" }), _jsx(\"button\", { className: \"p-2 cursor-pointer hover:bg-slate-50 dark:hover:bg-slate-100\", onClick: () => onDownload(\"document.xml\"), children: \"document.xml\" }), _jsx(\"button\", { className: \"p-2 cursor-pointer hover:bg-slate-50 dark:hover:bg-slate-100\", onClick: () => onDownload(\"analyzed-pages.json\"), children: \"analyzed-pages.json\" })] }));\n };\n return (_jsx(\"div\", { className: \"absolute bottom-[58px] right-[20px] w-[36px] h-[36px] cursor-pointer text-indigo-400 border-indigo-400 hover:border-indigo-500 hover:text-indigo-500 border-2 rounded-full shadow-xs flex items-center justify-center\", children: _jsxs(Popover, { strategy: 'absolute', placement: 'top-end', zIndex: 100, offset: 20, children: [_jsx(Popover.Trigger, { click: true, children: _jsx(CloudDownload, { className: 'size-6' }) }), _jsx(Popover.Content, { children: _jsx(\"div\", { className: \"rounded-md shadow-md border border-gray-100 bg-white dark:bg-slate-50 dark:border-slate-100 min-w-[200px] flex flex-col divide-y\", children: renderDownloadOptions() }) })] }) }));\n}\n//# sourceMappingURL=DownloadPopover.js.map","import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { Center } from \"@vertesia/ui/core\";\nimport clsx from \"clsx\";\nimport { AtSignIcon, ChevronsDown, ChevronsUp, ImageIcon, InfoIcon } from \"lucide-react\";\nimport { useRef, useState } from \"react\";\nimport { usePdfPagesInfo } from \"./PdfPageProvider\";\nvar ImageType;\n(function (ImageType) {\n ImageType[ImageType[\"default\"] = 0] = \"default\";\n ImageType[ImageType[\"original\"] = 1] = \"original\";\n ImageType[ImageType[\"instrumented\"] = 2] = \"instrumented\";\n ImageType[ImageType[\"annotated\"] = 3] = \"annotated\";\n})(ImageType || (ImageType = {}));\nexport function PageSlider({ className, currentPage, onChange, object }) {\n const getProcessorType = () => {\n if (object.metadata?.type === \"document\") {\n const docMetadata = object.metadata;\n return docMetadata.content_processor?.type || \"xml\";\n }\n return \"xml\"; // default\n };\n const getDefaultImageType = () => {\n const processorType = getProcessorType();\n return processorType === \"markdown\" ? ImageType.original : ImageType.default;\n };\n const [imageType, setImageType] = useState(getDefaultImageType());\n const ref = useRef(null);\n const { urls, originalUrls, annotatedUrls, instrumentedUrls } = usePdfPagesInfo();\n const goPrev = () => {\n if (currentPage > 1) {\n onChange(currentPage - 1);\n if (ref.current) {\n ref.current.querySelector(`div[data-index=\"${currentPage - 1}\"]`)?.scrollIntoView({\n behavior: 'smooth',\n block: 'end',\n inline: 'center'\n });\n }\n }\n };\n const goNext = () => {\n if (currentPage < urls.length) {\n onChange(currentPage + 1);\n if (ref.current) {\n ref.current.querySelector(`div[data-index=\"${currentPage + 1}\"]`)?.scrollIntoView({\n behavior: 'smooth',\n block: 'end',\n inline: 'center'\n });\n }\n }\n };\n const actualUrls = imageType === ImageType.instrumented ? instrumentedUrls :\n (imageType === ImageType.annotated ? annotatedUrls :\n (imageType === ImageType.original ? originalUrls : urls));\n return (_jsxs(\"div\", { ref: ref, className: clsx('flex flex-col items-stretch gap-y-2', className), children: [_jsxs(\"div\", { className: \"flex h-5 items-center justify-center relative\", children: [_jsx(\"button\", { className: BTN_CLASS, onClick: goPrev, children: _jsx(ChevronsUp, { className: 'w-5 h-5' }) }), _jsx(\"div\", { className: \"absolute right-3 flex gap-x-1\", children: getProcessorType() === \"markdown\" ? (_jsxs(_Fragment, { children: [_jsx(\"button\", { className: getRadioButtonClass(ImageType.original, imageType), onClick: () => setImageType(ImageType.original), children: _jsx(ImageIcon, { className: \"w-5 h-5 mt-1\" }) }), _jsx(\"button\", { className: getRadioButtonClass(ImageType.instrumented, imageType), onClick: () => setImageType(ImageType.instrumented), children: _jsx(InfoIcon, { className: \"w-5 h-5 mt-1\" }) })] })) : (_jsxs(_Fragment, { children: [_jsx(\"button\", { className: getRadioButtonClass(ImageType.default, imageType), onClick: () => setImageType(ImageType.default), children: _jsx(ImageIcon, { className: \"w-5 h-5 mt-1\" }) }), _jsx(\"button\", { className: getRadioButtonClass(ImageType.instrumented, imageType), onClick: () => setImageType(ImageType.instrumented), children: _jsx(InfoIcon, { className: \"w-5 h-5 mt-1\" }) }), _jsx(\"button\", { className: getRadioButtonClass(ImageType.annotated, imageType), onClick: () => setImageType(ImageType.annotated), children: _jsx(AtSignIcon, { className: \"w-5 h-5 mt-1\" }) })] })) })] }), _jsx(\"div\", { className: 'flex flex-col items-center gap-2 flex-1 overflow-y-auto px-2', children: actualUrls.map((url, index) => _jsx(PageThumbnail, { url: url, currentPage: currentPage, pageNumber: index + 1, onSelect: () => onChange(index + 1) }, index)) }), _jsx(\"div\", { className: \"flex h-5 items-center justify-center relative\", children: _jsx(\"button\", { className: BTN_CLASS, onClick: goNext, children: _jsx(ChevronsDown, { className: 'size-5' }) }) })] }));\n}\nfunction PageThumbnail({ url, pageNumber, currentPage, onSelect }) {\n return (_jsxs(\"div\", { className: \"p-2 hover:bg-gray-200 dark:hover:bg-slate-600 rounded-md\", \"data-index\": pageNumber - 1, children: [_jsx(\"div\", { className: clsx('relative border-[2px] cursor-pointer', pageNumber === currentPage ? \"border-blue-500 dark:border-pink-400\" : \"border-gray-300\"), onClick: onSelect, children: _jsx(\"img\", { src: url, alt: `Page ${pageNumber}` }) }), _jsx(Center, { className: \"text-sm text-gray-500 dark:text-gray-400 pt-1 font-semibold align\", children: pageNumber })] }));\n}\nconst BTN_CLASS = \"cursor-pointer text-gray-500 dark:text-gray-400 hover:text-blue-600 dark:hover:text-blue-500 hover:font-semibold\";\nfunction getRadioButtonClass(type, currentType) {\n if (type === currentType) {\n return '${BTN_CLASS} text-pink-600';\n }\n else {\n return `${BTN_CLASS}`;\n }\n}\n//# sourceMappingURL=PageSlider.js.map","import { jsx as _jsx } from \"react/jsx-runtime\";\nimport { JSONCode, XMLViewer, MarkdownRenderer } from '@vertesia/ui/widgets';\nimport { useEffect, useLayoutEffect, useState } from \"react\";\nimport { usePdfPagesInfo } from \"./PdfPageProvider\";\nconst darkTheme = {\n attributeKeyColor: '#FFD700',\n attributeValueColor: '#FF4500',\n tagColor: '#87CEFA',\n textColor: '#00FF00',\n separatorColor: '#FFD700',\n commentColor: \"#BEBEBE\",\n cdataColor: \"#33CC66\",\n};\nexport function TextPageView({ viewType, pageNumber }) {\n switch (viewType) {\n case \"json\":\n return _jsx(JsonPageLayoutView, { pageNumber: pageNumber });\n case \"markdown\":\n return _jsx(MarkdownPageView, { pageNumber: pageNumber });\n default:\n return _jsx(XmlPageView, { pageNumber: pageNumber });\n }\n}\nfunction XmlPageView({ pageNumber }) {\n const [theme, setTheme] = useState();\n const { xmlPages: pages } = usePdfPagesInfo();\n useLayoutEffect(() => {\n const media = window.matchMedia('(prefers-color-scheme: dark)');\n const onMediaChange = (event) => {\n setTheme(event.matches ? darkTheme : undefined);\n };\n media.addEventListener('change', onMediaChange);\n media.matches && setTheme(darkTheme);\n return () => {\n media.removeEventListener('change', onMediaChange);\n };\n }, []);\n return (_jsx(\"div\", { className: \"px-4 py-2\", children: _jsx(XMLViewer, { xml: pages[pageNumber - 1], collapsible: true, theme: theme }) }));\n}\nfunction JsonPageLayoutView({ pageNumber }) {\n const [content, setContent] = useState();\n const { layoutProvider } = usePdfPagesInfo();\n useEffect(() => {\n layoutProvider.getPageLayout(pageNumber).then(content => setContent(content ? JSON.parse(content) : undefined)).catch(err => {\n console.error(err);\n setContent(undefined);\n });\n }, [pageNumber]);\n return (content && _jsx(JSONCode, { className: \"w-full\", data: content }));\n}\nfunction MarkdownPageView({ pageNumber }) {\n const [content, setContent] = useState();\n const { markdownProvider } = usePdfPagesInfo();\n useEffect(() => {\n markdownProvider.getPageMarkdown(pageNumber).then(setContent).catch((err) => {\n console.error(err);\n setContent(undefined);\n });\n }, [pageNumber]);\n return (_jsx(\"div\", { className: \"px-4 py-2 prose prose-sm max-w-none dark:prose-invert\", children: content ? _jsx(MarkdownRenderer, { children: content }) : _jsx(\"div\", { children: \"No markdown content available\" }) }));\n}\n//# sourceMappingURL=TextPageView.js.map","import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from \"react/jsx-runtime\";\nimport { ErrorBox, useFetch } from \"@vertesia/ui/core\";\nimport { useUserSession } from \"@vertesia/ui/session\";\nimport { X } from \"lucide-react\";\nimport { useRef, useState } from \"react\";\nimport { DownloadPopover } from \"./DownloadPopover\";\nimport { PageSlider } from \"./PageSlider\";\nimport { PdfPageProvider } from \"./PdfPageProvider\";\nimport { TextPageView } from \"./TextPageView\";\nimport { useResizeEW } from \"./useResizeOnDrag\";\nexport function MagicPdfView({ objectId, onClose }) {\n const { client } = useUserSession();\n const { data: object, error } = useFetch(() => client.store.objects.retrieve(objectId, \"+text\"), [objectId]);\n if (error) {\n return _jsx(ErrorBox, { title: 'Fetching document failed', children: error.message });\n }\n return object ? (_jsx(\"div\", { className: 'fixed inset-0 bg-white dark:bg-slate-700 z-50 flex items-center justify-center', children: _jsx(PdfPageProvider, { object: object, children: _jsx(MagicPdfViewImpl, { object: object, onClose: onClose }) }) })) : \"Loading...\";\n}\nfunction MagicPdfViewImpl({ object, onClose }) {\n const getInitialViewType = () => {\n if (object.metadata?.type === \"document\") {\n const docMetadata = object.metadata;\n const processorType = docMetadata.content_processor?.type;\n if (processorType === \"markdown\")\n return \"markdown\";\n if (processorType === \"xml\")\n return \"xml\";\n }\n return \"xml\"; // default\n };\n const getProcessorType = () => {\n if (object.metadata?.type === \"document\") {\n const docMetadata = object.metadata;\n return docMetadata.content_processor?.type || \"xml\";\n }\n return \"xml\"; // default\n };\n const [viewType, setViewType] = useState(getInitialViewType());\n const [pageNumber, setPageNumber] = useState(1);\n const processorType = getProcessorType();\n const handler = useRef(null);\n const left = useRef(null);\n const right = useRef(null);\n useResizeEW({\n handler, left, right\n });\n return (_jsxs(_Fragment, { children: [_jsxs(\"div\", { ref: left, className: `absolute top-0 left-0 bottom-0 w-[50%] bg-gray-100 dark:bg-slate-800 flex items-stretch justify-stretch py-2`, children: [_jsx(PageSlider, { className: \"flex-1\", currentPage: pageNumber, onChange: setPageNumber, object: object }), _jsx(\"div\", { ref: handler, className: 'w-[2px] p-[2px] m-0 bg-slate-300 cursor-ew-resize' })] }), _jsx(\"div\", { ref: right, className: `absolute top-0 left-[50%] right-0 bottom-0 flex items-stretch justify-stretch overflow-auto p-2`, children: _jsx(TextPageView, { pageNumber: pageNumber, viewType: viewType }) }), _jsx(DownloadPopover, { object: object }), processorType === \"xml\" && _jsx(ContentSwitcher, { type: viewType, onSwitch: setViewType }), !!onClose &&\n _jsx(\"div\", { className: \"absolute top-6 right-7 w-9 h-9 cursor-pointer text-red-400 border-red-400 hover:border-red-500 hover:text-red-500 border-2 rounded-full shadow-xs flex items-center justify-center\", onClick: onClose, children: _jsx(X, { className: 'size-6' }) })] }));\n}\nfunction ContentSwitcher({ type = \"xml\", onSwitch }) {\n const _onSwitch = () => {\n if (type === \"xml\") {\n onSwitch(\"json\");\n }\n else if (type === \"json\") {\n onSwitch(\"markdown\");\n }\n else if (type === \"markdown\") {\n onSwitch(\"xml\");\n }\n };\n return (_jsxs(\"div\", { className: \"absolute bottom-[16px] right-[20px] w-[36px] h-[36px] cursor-pointer text-indigo-400 border-indigo-400 hover:border-indigo-500 hover:text-indigo-500 border-2 rounded-full shadow-xs flex items-center justify-center\", onClick: _onSwitch, children: [type === \"xml\" && JSON, type === \"json\" && MARKDOWN, type === \"markdown\" && XML] }));\n}\nconst JSON = _jsx(\"svg\", { width: \"16px\", height: \"16px\", viewBox: \"0 0 16 16\", xmlns: \"http://www.w3.org/2000/svg\", fill: \"currentColor\", children: _jsx(\"path\", { \"fill-rule\": \"evenodd\", \"clip-rule\": \"evenodd\", d: \"M6 2.984V2h-.09c-.313 0-.616.062-.909.185a2.33 2.33 0 0 0-.775.53 2.23 2.23 0 0 0-.493.753v.001a3.542 3.542 0 0 0-.198.83v.002a6.08 6.08 0 0 0-.024.863c.012.29.018.58.018.869 0 .203-.04.393-.117.572v.001a1.504 1.504 0 0 1-.765.787 1.376 1.376 0 0 1-.558.115H2v.984h.09c.195 0 .38.04.556.121l.001.001c.178.078.329.184.455.318l.002.002c.13.13.233.285.307.465l.001.002c.078.18.117.368.117.566 0 .29-.006.58-.018.869-.012.296-.004.585.024.87v.001c.033.283.099.558.197.824v.001c.106.273.271.524.494.753.223.23.482.407.775.53.293.123.596.185.91.185H6v-.984h-.09c-.2 0-.387-.038-.563-.115a1.613 1.613 0 0 1-.457-.32 1.659 1.659 0 0 1-.309-.467c-.074-.18-.11-.37-.11-.573 0-.228.003-.453.011-.672.008-.228.008-.45 0-.665a4.639 4.639 0 0 0-.055-.64 2.682 2.682 0 0 0-.168-.609A2.284 2.284 0 0 0 3.522 8a2.284 2.284 0 0 0 .738-.955c.08-.192.135-.393.168-.602.033-.21.051-.423.055-.64.008-.22.008-.442 0-.666-.008-.224-.012-.45-.012-.678a1.47 1.47 0 0 1 .877-1.354 1.33 1.33 0 0 1 .563-.121H6zm4 10.032V14h.09c.313 0 .616-.062.909-.185.293-.123.552-.3.775-.53.223-.23.388-.48.493-.753v-.001c.1-.266.165-.543.198-.83v-.002c.028-.28.036-.567.024-.863-.012-.29-.018-.58-.018-.869 0-.203.04-.393.117-.572v-.001a1.502 1.502 0 0 1 .765-.787 1.38 1.38 0 0 1 .558-.115H14v-.984h-.09c-.196 0-.381-.04-.557-.121l-.001-.001a1.376 1.376 0 0 1-.455-.318l-.002-.002a1.415 1.415 0 0 1-.307-.465v-.002a1.405 1.405 0 0 1-.118-.566c0-.29.006-.58.018-.869a6.174 6.174 0 0 0-.024-.87v-.001a3.537 3.537 0 0 0-.197-.824v-.001a2.23 2.23 0 0 0-.494-.753 2.331 2.331 0 0 0-.775-.53 2.325 2.325 0 0 0-.91-.185H10v.984h.09c.2 0 .387.038.562.115.174.082.326.188.457.32.127.134.23.29.309.467.074.18.11.37.11.573 0 .228-.003.452-.011.672-.008.228-.008.45 0 .665.004.222.022.435.055.64.033.214.089.416.168.609a2.285 2.285 0 0 0 .738.955 2.285 2.285 0 0 0-.738.955 2.689 2.689 0 0 0-.168.602c-.033.21-.051.423-.055.64a9.15 9.15 0 0 0 0 .666c.008.224.012.45.012.678a1.471 1.471 0 0 1-.877 1.354 1.33 1.33 0 0 1-.563.121H10z\" }) });\nconst XML = _jsx(\"svg\", { width: \"16px\", height: \"16px\", viewBox: \"0 0 16 16\", xmlns: \"http://www.w3.org/2000/svg\", fill: \"currentColor\", children: _jsx(\"path\", { d: \"M4.708 5.578L2.061 8.224l2.647 2.646-.708.708-3-3V7.87l3-3 .708.708zm7-.708L11 5.578l2.647 2.646L11 10.87l.708.708 3-3V7.87l-3-3zM4.908 13l.894.448 5-10L9.908 3l-5 10z\" }) });\nconst MARKDOWN = _jsx(\"svg\", { width: \"16px\", height: \"16px\", viewBox: \"0 0 16 16\", xmlns: \"http://www.w3.org/2000/svg\", fill: \"currentColor\", children: _jsx(\"path\", { d: \"M14.85 3H1.15C.52 3 0 3.52 0 4.15v7.69C0 12.48.52 13 1.15 13h13.69c.64 0 1.15-.52 1.15-1.15v-7.7C16 3.52 15.48 3 14.85 3zM9 11H7.5L5.5 9l-1 1.5H3V5h1.5l1 2 2-2H9v6zm2.99.5L9.5 8H11V5h1v3h1.5l-2.51 3.5z\" }) });\n//# sourceMappingURL=MagicPdfView.js.map","import { useEffect } from \"react\";\nexport function useResizeEW(opts) {\n useEffect(() => {\n if (opts.handler.current && opts.left.current && opts.right.current) {\n const handler = opts.handler.current;\n const left = opts.left.current;\n const right = opts.right.current;\n const onMouseDown = (e) => {\n let x = e.clientX;\n let baseLW = left.offsetWidth;\n let baseRL = right.offsetLeft;\n const onMouseMove = (e) => {\n const dx = e.clientX - x;\n left.style.width = `${baseLW + dx}px`;\n right.style.left = `${baseRL + dx}px`;\n e.target.classList.add('resizing');\n };\n const onMouseUp = (e) => {\n e.target.classList.remove('resizing');\n onMouseMove(e);\n document.removeEventListener('mousemove', onMouseMove);\n document.removeEventListener('mouseup', onMouseUp);\n };\n document.addEventListener('mousemove', onMouseMove);\n document.addEventListener('mouseup', onMouseUp);\n };\n handler.addEventListener('mousedown', onMouseDown);\n return () => {\n handler.removeEventListener('mousedown', onMouseDown);\n };\n }\n }, [opts.handler.current, opts.left.current, opts.right.current]);\n}\n//# sourceMappingURL=useResizeOnDrag.js.map","export function AnyOf(...permissions) {\n const p = Array.from(permissions);\n p.__AnyOf__ = true;\n return p;\n}\nexport function AllOf(...permissions) {\n return Array.from(permissions);\n}\nexport function isAnyOf(permissions) {\n return permissions.__AnyOf__ === true;\n}\n//# sourceMappingURL=helpers.js.map","import { jsx as _jsx } from \"react/jsx-runtime\";\nimport { ErrorBox, useFetch } from \"@vertesia/ui/core\";\nimport { useUserSession } from \"@vertesia/ui/session\";\nimport { createContext, useContext, useMemo } from \"react\";\nimport { isAnyOf } from \"./helpers\";\nexport class UserPermissions {\n system_roles; // all roles defined in the system\n roles; // all roles of the current user\n permissions; // all permissions of the current user\n constructor(session, roles) {\n if (!session.authToken) {\n throw new Error('No auth token found in user session');\n }\n this.system_roles = roles;\n const userRoles = new Set(session.authToken.account_roles || []);\n if (session.authToken.project_roles) {\n for (const role of session.authToken.project_roles) {\n userRoles.add(role);\n }\n }\n this.roles = userRoles;\n // build a temporary role to permissions map\n const map = {};\n for (const role of roles) {\n map[role.name] = role.permissions;\n }\n const permissions = new Set();\n for (const role of userRoles) {\n const rolePermissions = map[role];\n if (rolePermissions) {\n for (const permission of rolePermissions) {\n permissions.add(permission);\n }\n }\n }\n this.permissions = permissions;\n }\n hasPermission(permission) {\n if (typeof permission === 'string') {\n return this.permissions.has(permission);\n }\n else if (isAnyOf(permission)) {\n return permission.some(p => this.permissions.has(p));\n }\n else { // all of\n for (const p of permission) {\n if (!this.permissions.has(p)) {\n return false;\n }\n }\n return true;\n }\n }\n}\nconst UserPermissionsContext = createContext(undefined);\nexport { UserPermissionsContext };\nexport function useUserPermissions() {\n const perms = useContext(UserPermissionsContext);\n if (!perms) {\n throw new Error('UserPermissionContext cannot be used outside UserPermissionProvider');\n }\n return perms;\n}\nexport function UserPermissionProvider({ children }) {\n const session = useUserSession();\n const { data, error, isLoading } = useFetch(() => {\n if (session.user) {\n return session.client.iam.roles.list();\n }\n else {\n return Promise.resolve(undefined);\n }\n }, [session.user]);\n const perms = useMemo(() => {\n if (session.authToken && data && !isLoading) {\n return new UserPermissions(session, data);\n }\n else {\n return undefined;\n }\n }, [session, data, isLoading]);\n if (error) {\n return _jsx(ErrorBox, { title: \"Failed to fetch role mappings\", children: error.message });\n }\n return perms && (_jsx(UserPermissionsContext.Provider, { value: perms, children: children }));\n}\n//# sourceMappingURL=UserPermissionsProvider.js.map","import { jsx as _jsx } from \"react/jsx-runtime\";\nimport { Button } from \"@vertesia/ui/core\";\nimport { useUserPermissions } from \"./UserPermissionsProvider\";\nexport function SecureButton({ permission, isDisabled, title, children, ...others }) {\n const perms = useUserPermissions();\n const hasPermission = perms.hasPermission(permission);\n if (!hasPermission) {\n isDisabled = true;\n title = 'You do not have permission to perform this action';\n }\n return (_jsx(Button, { isDisabled: isDisabled, title: title, ...others, children: children }));\n}\n//# sourceMappingURL=SecureButton.js.map","import { jsx as _jsx } from \"react/jsx-runtime\";\nimport { SidebarItem } from \"@vertesia/ui/layout\";\nimport { useUserPermissions } from \"./UserPermissionsProvider\";\nexport function SecureSidebarItem({ permission, ...others }) {\n const perms = useUserPermissions();\n const hasPermission = perms.hasPermission(permission);\n if (!hasPermission) {\n return null;\n }\n else {\n return (_jsx(SidebarItem, { ...others }));\n }\n}\n//# sourceMappingURL=SecureSidebarItem.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\n/**\n * UserAvatar\n * Show user picture, name and email\n **/\nexport function UserAvatar({ user }) {\n const userPicture = () => {\n if (!user.picture) {\n const initials = user.name.split(' ').map((n) => n[0]).join('');\n return _jsx(\"span\", { className: \"inline-flex h-8 w-8 items-center justify-center rounded-full bg-indigo-600\", children: _jsx(\"span\", { className: \"text-sm font-medium leading-none text-white\", children: initials }) });\n }\n else {\n return _jsx(\"img\", { className: \"inline-block h-9 w-9 rounded-full\", src: user.picture, alt: user.name });\n }\n };\n return (_jsxs(\"div\", { className: \"flex items-center\", children: [_jsx(\"div\", { className: \"w-9 h-9\", children: userPicture() }), _jsxs(\"div\", { className: \"ml-3\", children: [_jsx(\"p\", { className: \"text-sm font-medium text-gray-700 dark:text-slate-50 group-hover:text-gray-900\", children: user.name ?? 'Deleted User' }), _jsx(\"p\", { className: \"text-xs font-medium text-gray-500 dark:text-slate-300 group-hover:text-gray-700\", children: user.email ?? 'Deleted User' })] })] }));\n}\n//# sourceMappingURL=UserAvatar.js.map"],"names":["Badge","children","secondary","_jsx","className","resolveInnerType","innerType","name","PropertySignature","property","_jsxs","optional","type","value","ActivitiesDoc","activities","map","activity","ActivityDoc","ActivitySectionTitle","code","headingClass","headingRef","id","ref","title","doc","paramsType","params","prop","PropertyDetails","returnType","expandable","useMemo","members","ObjectMembersPanel","enum","EnumValuesPanel","values","clsx","v","i","ExpandablePanel","button","isOn","ExpandIcon","isOpen","body","NestedPropertiesDetails","properties","isInitiallyOpen","isExpanded","setExpanded","useState","onClick","AnimatePresence","motion","div","initial","height","opacity","animate","exit","transition","duration","ease","propagate","mode","rotate","JumpingDots","inline","cn","style","transform","animationRange","AnimatedThinkingDots","color","gradientClass","blue","purple","teal","green","amber","PulsatingCircle","size","colorClasses","left","top","animationDuration","sm","md","lg","TypedDots","dots","setDots","useEffect","intervalId","setInterval","prev","clearInterval","PulsingMessageLoader","message","dot","text","animationDelay","ThinkingBar","width","progress","setProgress","direction","setDirection","speed","setSpeed","animationFrameId","lastUpdateTime","Date","now","updateProgressBar","deltaTime","timeBasedChange","next","Math","random","max","min","requestAnimationFrame","cancelAnimationFrame","xl","full","WavyThinking","barHeights","setBarHeights","Array","fill","sizeClasses","barWidth","gap","speeds","phases","time","animateBars","newHeights","_","index","sin","ThinkingMessages","DONE_STATES","AgentMessageType","COMPLETE","IDLE","REQUEST_INPUT","TERMINATED","getWorkstreamId","workstream_id","console","log","MessageItem","showPulsatingCircle","showDetails","setShowDetails","processedContent","setProcessedContent","isProcessingImages","setIsProcessingImages","client","useUserSession","toast","useToast","messageStyles","baseStyle","containerClass","iconComponent","Bot","sender","ANSWER","CheckCircle","QUESTION","User","THOUGHT","ERROR","AlertCircle","UPDATE","Info","PLAN","MessageSquare","getMessageStyles","getMessageContent","content","JSON","stringify","trim","String","includes","randomIndex","floor","length","replace","renderContent","Markdown","remarkPlugins","remarkGfm","components","a","node","props","href","NavLink","topLevelNav","target","rel","img","loading","src","window","open","match","exec","isInline","language","_Fragment","p","strong","em","pre","h1","h2","h3","li","ul","ol","blockquote","hr","table","th","td","messageContent","async","processed","imageMatches","from","matchAll","imageReplacements","Promise","all","fullMatch","altText","gcsPath","replacement","files","getDownloadUrl","url","error","convertLinks","toLowerCase","formattedContent","test","processContentForMarkdown","processContent","workstreamId","messageTypeStyles","getMessageTypeStyles","iconColor","getIconColor","getThinkingAnimation","timestamp","getTime","Clock","getMessageIcon","variant","dayjs","format","Button","detailsContent","details","textToCopy","join","navigator","clipboard","writeText","then","status","CopyIcon","xmlns","viewBox","stroke","strokeLinecap","strokeLinejoin","strokeWidth","d","WorkstreamTabs","workstreams","activeWorkstream","onSelectWorkstream","count","completionStatus","filteredWorkstreams","Map","set","forEach","sortedWorkstreams","entries","sort","idA","idB","localeCompare","hasMultipleWorkstreams","undefined","substring","has","get","filterMessagesByWorkstream","messages","filter","AllMessagesMixed","bottomRef","viewMode","isCompleted","containerRef","React","useRef","setActiveWorkstream","current","scrollIntoView","behavior","sortedMessages","b","extractedWorkstreams","extractWorkstreams","workstreamCounts","counts","mainMessages","msg","displayMessages","workstreamCompletionStatus","statusMap","workstreamMessages","push","msgs","lastMessage","isLatestNonCompletionMessage","permanentMessages","latestThinkingMessage","timeA","allMessages","isLatestMessage","PayloadBuilder","vertesia","updateState","_interactive","_debug_mode","_collection","_start","_preserveRunValues","_interaction","_environment","_model","_tool_names","_data","_interactionParamsSchema","_inputValidator","constructor","this","onStateChanged","newInstance","clone","builder","interactive","debug_mode","collection","search_scope","AgentSearchScope","Collection","restoreConversation","context","interactionRef","interaction","version","inter","interactions","catalog","resolve","envId","runtime","environment","config","model","env","environments","retrieve","interactionParamsSchema","tool_names","data","collection_id","mergeInCodePromptSchemas","prompts","interactionModel","supportsToolUse","provider","default_model","tools","prompt_data","run","start","preserveRunValues","schema","reset","location","hash","urlWithoutHash","origin","pathname","search","history","replaceState","validateInput","isValid","ajv","Ajv","strict","validate","compile","errorMessage","errors","err","instancePath","PayloadContext","createContext","PayloadBuilderProvider","setBuilder","Provider","usePayloadBuilder","ctx","useContext","Error","Header","onClose","isModal","onViewModeChange","showPlanPanel","hasPlan","onTogglePlanPanel","onDownload","onCopyRunId","resetWorkflow","runId","ClipboardList","MoreDropdown","XIcon","Popover","hover","PopoverTrigger","MoreVertical","PopoverContent","align","Command","CommandList","CommandGroup","CommandItem","onSelect","openUrl","workflowId","ExternalLink","workflowRunId","r","getConversationUrl","DownloadCloudIcon","store","workflows","terminate","cancelWorkflow","LAST_DISPLAYED_VIEW","ContentDispositionButton","onUpdate","isGridView","setIsGridView","localStorage","getItem","toggleGridView","setItem","toggleTableView","alt","TableProperties","LayoutGrid","SaveOptionAdapter","RadioOptionAdapter","labelOf","item","label","idOf","renderOption","description","SaveVersionConfirmModal","onConfirm","isLoading","uploadedFileName","saveOptions","defaultOption","selectedOption","setSelectedOption","versionLabel","setVersionLabel","optionAdapter","createVersion","Modal","ModalTitle","ModalBody","RadioGroup","adapter","options","onChange","option","FormItem","Input","placeholder","ModalFooter","disabled","PropertiesEditorModal","object","refetch","navigate","useNavigate","setIsLoading","propertiesJson","setPropertiesJson","showConfirmation","setShowConfirmation","parsedProperties","setParsedProperties","editorRef","monacoRef","jsonSchema","setJsonSchema","_newVersionId","setNewVersionId","setMonacoJsonSchema","monaco","languages","json","jsonDefaults","setDiagnosticsOptions","schemas","uri","fileMatch","typeId","typeDetails","types","object_schema","fetchJsonSchema","Editor","onMount","editor","minimap","enabled","scrollBeyondLastLine","formatOnPaste","formatOnType","automaticLayout","wordWrap","editorValue","getValue","parse","response","objects","update","createRevision","revisionLabel","setTimeout","MAX_TEXT_DISPLAY_SIZE","PanelView","ContentOverview","loadText","handleCopyContent","ResizablePanelGroup","ResizablePanel","PropertiesPanel","ResizableHandle","withHandle","DataPanel","viewCode","setViewCode","isPropertiesModalOpen","setPropertiesModalOpen","Copy","SquarePen","JSONDisplay","isImage","metadata","ContentNature","Image","isVideo","Video","currentPanel","setCurrentPanel","Text","setText","isLoadingText","setIsLoadingText","isTextCropped","setIsTextCropped","getObjectText","res","croppedText","catch","finally","TextActions","ImagePanel","VideoPanel","Spinner","TextPanel","loadingFormat","setLoadingFormat","isMarkdown","handleExportDocument","toUpperCase","getRendition","generate_if_missing","sign_url","renditions","downloadUrl","link","document","createElement","download","appendChild","click","removeChild","Download","memo","isMarkdownOrText","seemsMarkdown","shouldRenderAsMarkdown","AlertTriangle","MarkdownRenderer","imageUrl","setImageUrl","isOriginalWebSupported","rendition","ImageRenditionFormat","jpeg","source","loadImage","videoUrl","setVideoUrl","posterUrl","setPosterUrl","webRendition","find","poster","POSTER_RENDITION_NAME","loadPoster","loadVideoUrl","controls","shortId","slice","shortenString","str","CSV_PREFIX","IMAGE_PREFIX","PDF_PREFIX","VIDEO_PREFIX","isCsv","startsWith","isPdf","RENDITION_OPTIONS","max_hw","VITE_RENDITION_HW","RENDITION_ID","retrieveRendition","setRenditionUrl","setRenditionAlt","setRenditionStatus","currentTime","savedId","elapsedTime","abs","parseInt","toString","warn","DocumentIconSkeleton","Card","Separator","CardContent","DocumentIcon","selection","onSelectionChange","onRowClick","previewObject","selectedObject","renditionUrl","renditionAlt","renditionStatus","checked","isSelected","ev","stopPropagation","e","Eye","VTooltip","placement","score","toFixed","facetOptionLabel","bucket","_id","facetOptionNameLabel","StringFacet","buckets","filterValue","getFilterValue","SelectBox","filterBy","isClearable","optionLabel","setFilterValue","by","StringListFacet","tags","setTags","InputList","TypeFacet","setOptions","typeRegistry","getTypeName","VStringFacet","multiple","charAt","allowCreate","createStringFilterGroup","VTypeFacet","typeDataMap","actualId","displayKey","typeData","labelRenderer","optionValue","searchText","USER_CACHE","GROUP_CACHE","useFetchUserInfo","userId","useFetch","user","users","useFetchGroupInfo","groupId","group","iam","groups","AvatarPlaceholder","SystemAvatar","showTitle","UserPopoverPanel","Avatar","ServiceAccountAvatar","accountId","ErrorAvatar","UnknownAvatar","UserInfo","userRef","split","PrincipalType","UserAvatar","Group","GroupAvatar","ServiceAccount","Agent","ApiKey","ApiKeyAvatar","keyId","tag","Users","email","username","picture","apikeys","avatar","Table","account","project","sideOffset","side","VUserFacet","createUserFilterGroup","EnvironmentFacet","resolvedOptions","useRunsFilterGroups","facets","customFilterGroups","interactionFilterGroup","interactionId","displayName","badgeVariant","InteractionStatus","published","archived","badgeText","VInteractionFacet","environmentFilterGroup","environmentId","VEnvironmentFacet","models","modelFilterGroup","statuses","statusFilterGroup","finish_reason","finishReasonFilterGroup","created_by","createdByFilterGroup","useRunsFilterHandler","newFilters","clearFilters","filterName","isArray","query","RunsFacetsNav","filters","setFilters","filterGroups","handleFilterLogic","FilterProvider","FilterBtn","RefreshCw","FilterBar","FilterClear","useWorkflowExecutionsFilterGroups","initiated_by","initiatedByFilterGroup","useWorkflowExecutionsFilterHandler","search_term","WorkflowExecutionsFacetsNav","useDocumentFilterGroups","typeFilterGroup","useDocumentFilterHandler","dateValue","gte","lte","DocumentsFacetsNav","useInteractionsFilterGroups","useInteractionsFilterHandler","InteractionsFacetsNav","usePromptsFilterGroups","role","rolesFilterGroup","facet","usePromptsFilterHandler","PromptsFacetsNav","useCollectionsFilterGroups","useCollectionsFilterHandler","CollectionsFacetsNav","DocumentSelection","setState","collectionId","singleSelection","Object","keys","isSingleSelection","hasSelection","getObjectIds","getObjectId","add","remove","objectId","addAll","obj","removeAll","DocumentSelectionContext","useDocumentSelection","useOptionalDocumentSelection","DocumentSelectionProvider","setSelection","extend","RelativeTime","LocalizedFormat","renderers","string","_onClick","transforms","max_length","t","fileSize","_params","bytes","Number","isNaN","sizes","pow","number","currency","decimals","digits","Intl","NumberFormat","maximumFractionDigits","hasSlice","displayValue","reduce","objectName","typeLink","date","method","arg","localized","relative","defaultRenderer","resolveField","path","last","splitPath","DocumentTableColumn","layout","renderer","fallbackPath","field","fallback","render","_value","_index","indexOf","URLSearchParams","resolveValue","default","objectIdRenderer","DocumentTableView","columns","toggleAll","col","TBody","colSpan","DocumentGridView","DocumentSearch","limit","SharedState","result","facetSpecs","withFacets","isRunning","hasMore","setDefaultKeys","autoSearch","parent","full_text","vector","weights","score_aggregation","dynamic_scaling","all_revisions","getFacetBuckets","resetFacets","_updateRunningState","_searchRequest","offset","includeFacets","payload","collections","searchMembers","_facetsRequest","computeFacets","_query","_search","loadMore","noFacets","results","concat","DocumentSearchContext","useDocumentSearch","useWatchDocumentSearchFacets","useWatchSharedState","useWatchDocumentSearchResult","useDocumentSearchCount","total","FileUploadAction","calculateFileHash","file","arrayBuffer","md5","Md5","appendByteArray","Uint8Array","end","useSmartFileUploadProcessing","checkDocumentProcessing","selectedFolder","limitToCollectionId","filesWithMetadata","batch","metadataResults","webkitRelativePath","pathParts","folderPath","prepareFilesWithMetadata","identifyExistingHash","$in","select","f","etag","existingId","action","SKIP","identifyExistingIds","unskippedFiles","allLocations","uniqueLocations","Set","queries","flat","CREATE","totalFiles","toCreate","toUpdate","toSkip","DocumentUploadModal","initialFiles","onUploadComplete","hideFileSelection","showTypeSelectionOnly","setFiles","processedFiles","setProcessedFiles","processingDone","setProcessingDone","selectedType","setSelectedType","fileStatuses","setFileStatuses","isUploading","setIsUploading","uploadComplete","setUploadComplete","overallProgress","setOverallProgress","modalKey","setModalKey","collectionData","setCollectionData","setResult","_title","setTitle","_description","setDescription","round","renderLocationInfo","MessageBox","icon","FolderIcon","processingStats","setProcessingStats","processFiles","handleClose","handleFileSelect","newFiles","filesToProcess","handleUpload","initialStatuses","fileInfo","filesToSkip","filesToUpdate","filesToCreate","success","objectIds","uploadedFiles","skippedFiles","failedFiles","processBatch","batches","batchIndex","filesProcessedInBatch","toISOString","createResult","create","currentStatuses","completedFiles","missingStatuses","createdCount","updatedCount","skippedCount","failedCount","statusMessage","typeSelection","VSelectBox","selected","CheckCircleIcon","VModal","disableCloseOnClickOutside","VModalTitle","VModalBody","fileStatus","FileIcon","XCircleIcon","UploadSummary","UploadIcon","AlertCircleIcon","DropZone","onDrop","buttonLabel","VModalFooter","canUpload","renderModalFooter","useDocumentUploadHandler","onUploadDone","projectRef","filesToUpload","skippedFilesInfo","uploadedFilesInfo","failedFilesInfo","batchSize","processBatches","processedCount","processResults","updateResult","creates","updates","failures","uploadedCount","totalObjectIds","updatedFiles","defaultLayout","DocumentTable","onUpload","others","ObjectTableWithDropZone","DocumentTableImpl","skipTypeModal","setLoading","isDragging","setIsDragging","typeSelectionOpen","setTypeSelectionOpen","handleFileDrop","droppedFiles","feedback","filesLength","processedFilesLength","uploadPromise","onDoUpload","filesCount","hasProcessingResults","handleDragOver","preventDefault","onDragOver","onDragEnter","onDragLeave","currentTarget","contains","relatedTarget","dataTransfer","items","kind","getAsFile","allowFolders","created","updated","skipped","_onSelectionChange","isShift","nativeEvent","shiftKey","findIndex","findPreviousSelected","toSelect","findNextSelected","DocumentSearchProvider","unshift","SearchContext","SelectDocument","SelectDocumentImpl","isReady","setIsReady","loadMoreRef","useIntersectionObserver","deps","facetSearch","ErrorBox","SelectDocumentModal","STORE_REGEX","DocumentInput","off","on","useFlag","actualValue","setValue","setDoc","clearValue","event","Styles","INPUT","X","ChevronsUpDown","useDownloadDocument","getDownloadUrlWithOptions","DocumentPreviewPanel","setObject","loadingText","setLoadingText","currentTab","setCurrentTab","loadObjectText","loadImageUrl","downloadUrlResult","handleViewFullDocument","FileText","Maximize2","formatFileSize","created_at","toLocaleString","updated_at","ChevronRight","parseFloat","allTypes","SearchTypes","embeddingTypes","SupportedEmbeddingTypes","VectorSearchWidget","refresh","searchTypes","setSearchText","setConfig","embeddings","image","setStatus","showSettings","setShowSettings","selectedTypes","setSelectedTypes","setLimit","embeddingSearchTypes","fullTextEnabled","vectorSearchEnabled","projects","configuration","fireSearch","handleCheckboxChange","onKeyDown","key","Settings","Checkbox","onCheckedChange","NumberInput","isDisabled","DocumentSearchResultsWithDropZone","uploadHandler","DocumentSearchResults","allowFilter","allowSearch","searchContext","setSelectedObject","actualLayout","setActualLayout","registry","getTypeLayout","some","getTableLayout","refreshTrigger","_setRefreshTrigger","loaded","setLoaded","URL","filtersParam","searchParams","filterPairs","validFilterPairs","pair","encodedName","decodeURIComponent","newFiltersParam","delete","state","OverviewDrawer","Toolsbar","handleFilterChange","handleVectorSearch","c","handleRefetch","o","SidePanel","Divider","ExportTypes","ExportPropertiesModal","isExporting","SelectPanel","WaitingPanel","exportType","setExportType","exportAll","setExportAll","selectionOption","BrowseCollectionView","tableLayout","table_layout","dynamic","addMembers","SelectContentType","defaultValue","session","isMounted","setIsMounted","_onChangeMultiple","CreateCollectionForm","redirect","onAddToCollection","isProcessing","setProcessing","setPayload","setPayloadProp","onSubmit","required","Textarea","Switch","allowed_types","CreateCollectionModal","CollectionsTable","collectionToDelete","setCollectionToDelete","setOpen","TR","collectionIcon","fromNow","Trash2","EmptyCollection","ConfirmModal","onCancel","isDynamic","tooltipText","Search","FolderClosed","ContentObjectTypesTable","strict_mode","is_chunkable","relativeTime","ObjectTypeSearch","list","ObjectTypeSearchContext","useSearch","useWatchSearchResult","useSearchCount","CreateOrUpdateTypeModal","okLabel","initialPayload","setName","strictMode","setStrictMode","onSave","ChunkableOptions","ContentObjectTypesSearch","isDirty","searchTerm","setSearchTerm","debounceValue","useDebounce","chunkable","setChunkable","showCreateModal","setShowCreateModal","reloadTypes","CODE_MIRROR_EXTENSIONS","basicSetup","ObjectSchemaEditor","objectType","onSchemaUpdate","isUpdating","setUpdating","useSchema","displayJson","setDisplayJson","jsonToContent","updateSchemaFromJson","newSchema","contentToJson","validateSchema","replaceSchema","CodeMirrorEditor","extensions","SchemaEditor","ObjectTypeSearchProvider","SelectContentTypeModal","initialSelectedType","confirmLabel","allowNone","TableLayoutEditor","onLayoutUpdate","stringifyTableLayout","validationError","EditCollectionView","tableLayoutRef","setMetadata","tableLayoutValue","setField","Panel","updated_by","PropertiesEditor","SyncMemberHeadsToggle","SharedPropsEditor","formData","setFormData","setIsUpdating","ManagedObject","_onSave","GeneratedForm","SelectCollection","searchPlaceholder","filterOut","allowDynamic","searchQuery","setSearchQuery","isSearching","setIsSearching","useServerSearch","setUseServerSearch","debouncedSearchQuery","searchCollections","useCallback","trimmedQuery","selectedCollection","handleSelect","currentValues","newValues","newCollections","handleClear","handleSearchChange","hasSearchQuery","filteredCollections","queryLower","showClearOption","asChild","shouldFilter","CommandInput","onValueChange","CommandEmpty","Check","colType","setColType","sharedProps","setSharedProps","shared_properties","TagsInput","skipHeadSync","setSkipHeadSync","skip_head_sync","isSaving","setIsSaving","enableSyncHeads","ChangeTypeActionComponent","callback","useObjectsActionCallback","runOperation","ids","ChangeTypeAction","confirm","component","ConfirmAction","showConfirmModal","setShowConfirmModal","confirmationText","_callback","DeleteObjectsActionComponent","useObjectsActionContext","limitFilesName","names","maxLength","extIndex","lastIndexOf","ext","plural","DeleteObjectsAction","destructive","DeleteObjectsFromCollectionsAction","ExportPropertiesComponent","setIsExporting","search_objectIds","getChildObjects","Ids","exportProperties","CSV","Blob","responseData","createObjectURL","ExportPropertiesAction","RemoveFromCollectionActionComponent","deleteMembers","RemoveFromCollectionAction","StartWorkflowComponent","StartWorkflowModal","rules","execute","StartWorkflowAction","hideInList","StartWorkflowBody","optionLayout","reverse","setSelected","SelectList","wfRules","ObjectsActionContext","allActions","AddToCollectionAction","callbacks","startWorkflow","actions","loadWorkflows","rule","isWorkflow","registerCallback","cb","unregisterCallback","findAction","actionId","ObjectsActionContextReact","ObjectsActionContextProvider","Actions","display","useStartWorkflowCallback","AddToCollectionActionComponent","showModal","setShowModal","Portal","SelectCollectionModal","DialogDescription","AddToCollectionForm","selectedCollectionId","setSelectedCollectionId","tabs","Heading","level","VTabs","fullWidth","VTabsBar","VTabsPanel","SelectionActions","hasSingleSelection","SelectionActionsPopover","EllipsisVertical","ActionsWrapper","StartWorkflowButton","UploadObjectsButton","fileInput","accept","onchange","selectFile","PopoverBody","executeAction","_selection","noCheck","MessageInput","onSend","isSending","activeTaskCount","isObjectModalOpen","setIsObjectModalOpen","focus","minHeight","PaperclipIcon","SendIcon","Activity","markdownLink","currentValue","cursorPos","selectionStart","newValue","newCursorPos","setSelectionRange","InlineSlidingPlanPanel","plan","workstreamStatus","plans","activePlanIndex","onChangePlan","maxHeight","planTasks","totalTasks","completedTasks","task","taskId","progressPercentage","toLocaleTimeString","taskGoal","goal","StatusIcon","Circle","statusColor","planTaskIds","workstreamEntries","statusBg","statusText","ModernAgentConversation","execRun","run_id","workflow_id","ModernAgentConversationInner","StartWorkflowView","EmptyState","initialMessage","startButtonText","inputValue","setInputValue","setIsSending","setRun","inputRef","startWorkflowWithMessage","sessionStorage","removeItem","newRun","Cpu","setMessages","setIsCompleted","setViewMode","showSlidingPanel","setShowSlidingPanel","setPlans","setActivePlanIndex","workstreamStatusMap","setWorkstreamStatusMap","thinkingMessageIndex","setThinkingMessageIndex","showInput","setShowInput","workflowStatus","setWorkflowStatus","getActivePlan","currentPlanData","currentWorkstreamStatus","interval","statusResult","getRunDetails","checkWorkflowStatus","streamMessages","prev_messages","m","arr","idx","splice","insertMessageInTimeline","onlyWorkstreamId","onlyWorkstreamMsgs","mainWorkstreamMsgs","lastMainMessage","isInProgress","notificationTimeout","clearTimeout","newPlanDetails","newPlan","newPlans","newWorkstreamStatus","newMap","actualTitle","taskLabels","acc","sendSignal","activeCount","getActiveTaskCount","VertesiaErrorBoundary","ErrorBoundaryInstance","ErrorBoundary","FallbackComponent","setErrorBoundaryComponent","ErrorBoundaryComponent","PanelErrorBoundary","PanelErrorFallback","RowErrorBoundary","RowErrorFallback","WidgetErrorBoundary","WidgetErrorFallback","GenericPageNavHeader","breadcrumbs","isCompact","useDynamicBreadcrumbs","buildBreadcrumbLabel","entry","pathSegments","segment","secondSegment","capitalize","breadcrumbItems","historyChain","stepsBack","go","breadcrumb","clearBreadcrumbs","buildBreadcrumbItems","Breadcrumbs","separator","maxItems","NotFoundView","PageLayoutProvider","totalPages","layoutUrls","cache","loadUrls","layoutPromises","getLayoutUrlForPage","getPageLayout","page","fetch","ok","PageMarkdownProvider","markdownUrls","markdownPromises","getMarkdownUrlForPage","getPageMarkdown","PdfPageContext","PdfPageProvider","info","setInfo","page_count","imageUrlPromises","getImageUrlForPage","imageUrls","annotatedImageUrlPromises","getAnnotatedImageUrlForPage","annotatedImageUrls","instrumentedImageUrlPromises","getInstrumentedImageUrlForPage","instrumentedImageUrls","originalImageUrlPromises","getOriginalImageUrlForPage","originalImageUrls","layoutProvider","markdownProvider","xml","cleanXml","urls","originalUrls","annotatedUrls","instrumentedUrls","xmlPages","extractXmlPages","getPdfPagesInfo","getBasePath","pageNumber","getPageImagePath","getPageAnnotatedImagePath","getPageInstrumentedImagePath","getPageOriginalImagePath","getLayoutJsonPath","getMarkdownPath","usePdfPagesInfo","pages","DOMParser","parseFromString","getElementsByTagName","serializer","XMLSerializer","serializeToString","DownloadPopover","getResourceUrl","processorType","docMetadata","content_processor","getProcessorType","strategy","zIndex","Trigger","CloudDownload","Content","ImageType","PageSlider","currentPage","imageType","setImageType","original","actualUrls","instrumented","annotated","BTN_CLASS","querySelector","block","ChevronsUp","getRadioButtonClass","ImageIcon","InfoIcon","AtSignIcon","PageThumbnail","ChevronsDown","Center","currentType","darkTheme","attributeKeyColor","attributeValueColor","tagColor","textColor","separatorColor","commentColor","cdataColor","TextPageView","viewType","JsonPageLayoutView","MarkdownPageView","XmlPageView","theme","setTheme","useLayoutEffect","media","matchMedia","onMediaChange","matches","addEventListener","removeEventListener","XMLViewer","collapsible","setContent","JSONCode","MagicPdfView","MagicPdfViewImpl","setViewType","getInitialViewType","setPageNumber","handler","right","opts","onMouseDown","x","clientX","baseLW","offsetWidth","baseRL","offsetLeft","onMouseMove","dx","classList","onMouseUp","ContentSwitcher","onSwitch","MARKDOWN","XML","AnyOf","permissions","__AnyOf__","AllOf","isAnyOf","UserPermissions","system_roles","roles","authToken","userRoles","account_roles","project_roles","rolePermissions","permission","hasPermission","UserPermissionsContext","useUserPermissions","perms","UserPermissionProvider","SecureButton","SecureSidebarItem","SidebarItem","initials","n","userPicture"],"mappings":"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"}