@julianpedro/plugin-dev-ai-hub 0.3.0 → 0.4.0

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 (49) hide show
  1. package/dist/api/DevAiHubClient.esm.js +5 -0
  2. package/dist/api/DevAiHubClient.esm.js.map +1 -1
  3. package/dist/components/AdminPage/AdminPage.esm.js +106 -0
  4. package/dist/components/AdminPage/AdminPage.esm.js.map +1 -0
  5. package/dist/components/AdminPage/index.esm.js +6 -0
  6. package/dist/components/AdminPage/index.esm.js.map +1 -0
  7. package/dist/components/AssetCard/AssetCard.esm.js +36 -17
  8. package/dist/components/AssetCard/AssetCard.esm.js.map +1 -1
  9. package/dist/components/AssetDetailPanel/AssetDetailPanel.esm.js +10 -13
  10. package/dist/components/AssetDetailPanel/AssetDetailPanel.esm.js.map +1 -1
  11. package/dist/components/AssetFilters/AssetFilters.esm.js +5 -3
  12. package/dist/components/AssetFilters/AssetFilters.esm.js.map +1 -1
  13. package/dist/components/AssetHelpDialog/AssetHelpDialog.esm.js +1 -1
  14. package/dist/components/AssetHelpDialog/AssetHelpDialog.esm.js.map +1 -1
  15. package/dist/components/AssetInstallDialog/AssetInstallDialog.esm.js +3 -3
  16. package/dist/components/AssetInstallDialog/AssetInstallDialog.esm.js.map +1 -1
  17. package/dist/components/AssetsTab/AssetsTab.esm.js +221 -0
  18. package/dist/components/AssetsTab/AssetsTab.esm.js.map +1 -0
  19. package/dist/components/AssetsTab/index.esm.js +6 -0
  20. package/dist/components/AssetsTab/index.esm.js.map +1 -0
  21. package/dist/components/DevAiHubPage/DevAiHubPage.esm.js +194 -111
  22. package/dist/components/DevAiHubPage/DevAiHubPage.esm.js.map +1 -1
  23. package/dist/components/McpConfigDialog/McpConfigDialog.esm.js +3 -581
  24. package/dist/components/McpConfigDialog/McpConfigDialog.esm.js.map +1 -1
  25. package/dist/components/McpPage/McpPage.esm.js +478 -0
  26. package/dist/components/McpPage/McpPage.esm.js.map +1 -0
  27. package/dist/components/McpPage/index.esm.js +6 -0
  28. package/dist/components/McpPage/index.esm.js.map +1 -0
  29. package/dist/components/ModelIcon/ModelBadge.esm.js +73 -0
  30. package/dist/components/ModelIcon/ModelBadge.esm.js.map +1 -0
  31. package/dist/components/ModelIcon/ModelIcon.esm.js +45 -0
  32. package/dist/components/ModelIcon/ModelIcon.esm.js.map +1 -0
  33. package/dist/components/ToolIcon/ToolIcon.esm.js +1 -1
  34. package/dist/components/ToolIcon/ToolIcon.esm.js.map +1 -1
  35. package/dist/context/UiConfigContext.esm.js +79 -0
  36. package/dist/context/UiConfigContext.esm.js.map +1 -0
  37. package/dist/hooks/index.esm.js +22 -1
  38. package/dist/hooks/index.esm.js.map +1 -1
  39. package/dist/index.d.ts +140 -20
  40. package/dist/index.esm.js +1 -1
  41. package/dist/locales/es.esm.js +18 -9
  42. package/dist/locales/es.esm.js.map +1 -1
  43. package/dist/locales/pt-BR.esm.js +18 -9
  44. package/dist/locales/pt-BR.esm.js.map +1 -1
  45. package/dist/plugin.esm.js +35 -6
  46. package/dist/plugin.esm.js.map +1 -1
  47. package/dist/translation.esm.js +27 -11
  48. package/dist/translation.esm.js.map +1 -1
  49. package/package.json +15 -5
@@ -1 +1 @@
1
- {"version":3,"file":"AssetInstallDialog.esm.js","sources":["../../../src/components/AssetInstallDialog/AssetInstallDialog.tsx"],"sourcesContent":["import { useState } from 'react';\nimport Box from '@mui/material/Box';\nimport Button from '@mui/material/Button';\nimport Chip from '@mui/material/Chip';\nimport CircularProgress from '@mui/material/CircularProgress';\nimport Dialog from '@mui/material/Dialog';\nimport DialogActions from '@mui/material/DialogActions';\nimport DialogContent from '@mui/material/DialogContent';\nimport DialogTitle from '@mui/material/DialogTitle';\nimport LinearProgress from '@mui/material/LinearProgress';\nimport Tooltip from '@mui/material/Tooltip';\nimport Typography from '@mui/material/Typography';\nimport ContentCopyIcon from '@mui/icons-material/ContentCopy';\nimport DownloadIcon from '@mui/icons-material/Download';\nimport CheckIcon from '@mui/icons-material/Check';\nimport FolderZipIcon from '@mui/icons-material/FolderZip';\nimport OpenInBrowserIcon from '@mui/icons-material/OpenInBrowser';\nimport ArrowBackIcon from '@mui/icons-material/ArrowBack';\nimport ArrowForwardIcon from '@mui/icons-material/ArrowForward';\nimport Inventory2Icon from '@mui/icons-material/Inventory2';\nimport type { AiAsset, AiTool, BundleItem } from '@julianpedro/plugin-dev-ai-hub-common';\nimport { getInstallPathsForAsset } from '@julianpedro/plugin-dev-ai-hub-common';\nimport { useApi, discoveryApiRef } from '@backstage/core-plugin-api';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { devAiHubApiRef } from '../../api/DevAiHubClient';\nimport { useAssetDetail } from '../../hooks';\nimport { ToolIcon } from '../ToolIcon';\nimport { devAiHubTranslationRef } from '../../translation';\n\nconst TOOL_LABELS: Record<string, string> = {\n 'claude-code': 'Claude Code',\n 'github-copilot': 'GitHub Copilot',\n 'google-gemini': 'Google Gemini',\n 'cursor': 'Cursor',\n};\n\n/**\n * vscode:chat-agent/install can only place files inside .github/ (agents → .github/agents/,\n * instructions → .github/instructions/). Root-level files like AGENTS.md, CLAUDE.md, etc.\n * cannot be installed via deep link — the handler would put them in the wrong directory.\n */\nfunction canUseVscodeDeepLink(type: string, tools: string[], installPath?: string): boolean {\n if (type !== 'agent' && type !== 'instruction') return false;\n if (!tools.includes('github-copilot')) return false;\n // If a custom install path is defined and it doesn't live under .github/, skip the button.\n if (installPath && !installPath.startsWith('.github/')) return false;\n return true;\n}\n\nfunction buildVscodeRedirectUrl(asset: AiAsset, backendUrl: string): string {\n const safeName = (asset.label ?? asset.name).toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g, '');\n const filename = asset.type === 'instruction'\n ? `${safeName}.instructions.md`\n : `${safeName}.agent.md`;\n const fileUrl = `${backendUrl}/assets/${encodeURIComponent(asset.id)}/agent-md/${filename}`;\n const vscodeUri = `vscode:chat-agent/install?url=${encodeURIComponent(fileUrl)}`;\n return `https://vscode.dev/redirect?url=${encodeURIComponent(vscodeUri)}`;\n}\n\n// ─── Single-asset view ───────────────────────────────────────────────────────\n\ninterface SingleAssetViewProps {\n asset: AiAsset;\n}\n\nfunction SingleAssetView({ asset }: SingleAssetViewProps) {\n const [copiedTool, setCopiedTool] = useState<string | null>(null);\n const api = useApi(devAiHubApiRef);\n const discoveryApi = useApi(discoveryApiRef);\n const { t } = useTranslationRef(devAiHubTranslationRef);\n\n const resourcePaths = asset.resourcesContent ? Object.keys(asset.resourcesContent) : [];\n const isZipSkill = asset.type === 'skill' && resourcePaths.length > 0;\n\n const installPaths = getInstallPathsForAsset(asset.type, asset.tools, asset.name, {\n installPath: asset.installPath,\n installPaths: asset.installPaths,\n });\n\n const handleCopy = (tool: string) => {\n navigator.clipboard.writeText(asset.content).then(() => {\n setCopiedTool(tool);\n setTimeout(() => setCopiedTool(null), 2000);\n });\n api.trackInstall(asset.id).catch(() => {});\n };\n\n const handleDownload = async (_tool: string, installPath: string) => {\n if (isZipSkill) {\n const url = await api.getDownloadUrl(asset.id);\n const a = document.createElement('a');\n a.href = url;\n a.download = `${asset.name.replace(/\\s+/g, '-').toLowerCase()}.zip`;\n a.click();\n } else {\n const filename = installPath.split('/').pop() ?? `${asset.name}.md`;\n const blob = new Blob([asset.content], { type: 'text/markdown' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = filename;\n a.click();\n URL.revokeObjectURL(url);\n }\n api.trackInstall(asset.id).catch(() => {});\n };\n\n const handleInstallInVscode = async () => {\n const backendUrl = await discoveryApi.getBaseUrl('dev-ai-hub');\n const a = document.createElement('a');\n a.href = buildVscodeRedirectUrl(asset, backendUrl);\n a.target = '_blank';\n a.rel = 'noopener noreferrer';\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n api.trackInstall(asset.id).catch(() => {});\n };\n\n const showVscodeButton = canUseVscodeDeepLink(asset.type, asset.tools, installPaths['github-copilot']);\n\n return (\n <>\n {isZipSkill && (\n <Box\n sx={{\n border: '1px solid',\n borderColor: 'info.main',\n borderRadius: 2,\n p: 1.5,\n bgcolor: theme => `${theme.palette.info.main}12`,\n mb: 0.5,\n }}\n >\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1, mb: 1 }}>\n <FolderZipIcon sx={{ fontSize: '1rem', color: 'info.main' }} />\n <Typography variant=\"subtitle2\" fontWeight={700} color=\"info.main\">\n {t('assetInstallDialog.bundledSkillTitle')}\n </Typography>\n </Box>\n <Typography variant=\"caption\" color=\"text.secondary\" sx={{ display: 'block', mb: 1 }}>\n {t('assetInstallDialog.bundledSkillDescription')}\n </Typography>\n <Box sx={{ display: 'flex', gap: 0.5, flexWrap: 'wrap' }}>\n <Chip label=\"SKILL.md\" size=\"small\" sx={{ fontFamily: 'monospace', fontSize: '0.7rem', height: 20 }} />\n {resourcePaths.map(p => (\n <Chip key={p} label={p} size=\"small\" variant=\"outlined\" sx={{ fontFamily: 'monospace', fontSize: '0.7rem', height: 20 }} />\n ))}\n </Box>\n </Box>\n )}\n\n {Object.entries(installPaths).map(([tool, installPath]) => (\n <Box\n key={tool}\n sx={{ border: '1px solid', borderColor: 'divider', borderRadius: 2, p: 1.5 }}\n >\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1, mb: 1 }}>\n <ToolIcon tool={tool as AiTool} sx={{ fontSize: '1rem' }} />\n <Typography variant=\"subtitle2\" fontWeight={700}>\n {TOOL_LABELS[tool] ?? tool}\n </Typography>\n </Box>\n <Typography variant=\"caption\" color=\"text.secondary\" sx={{ display: 'block', mb: 0.5 }}>\n {t('assetInstallDialog.installPathLabel')}\n </Typography>\n <Box\n sx={{\n bgcolor: 'action.hover',\n border: '1px solid',\n borderColor: 'divider',\n borderRadius: 1,\n px: 1.5,\n py: 0.75,\n fontFamily: 'monospace',\n fontSize: '0.78rem',\n wordBreak: 'break-all',\n mb: 1.25,\n }}\n >\n {installPath}\n </Box>\n <Box sx={{ display: 'flex', flexDirection: 'column', gap: 0.75 }}>\n {showVscodeButton && tool === 'github-copilot' && (\n <Button\n size=\"small\"\n variant=\"contained\"\n startIcon={<OpenInBrowserIcon />}\n onClick={handleInstallInVscode}\n fullWidth\n >\n {t('assetInstallDialog.installInVscode')}\n </Button>\n )}\n <Box sx={{ display: 'flex', gap: 1 }}>\n <Tooltip title={copiedTool === tool ? t('assetInstallDialog.copied') : t('assetInstallDialog.copyTooltip')}>\n <Button\n size=\"small\"\n variant=\"outlined\"\n startIcon={copiedTool === tool ? <CheckIcon /> : <ContentCopyIcon />}\n onClick={() => handleCopy(tool)}\n color={copiedTool === tool ? 'success' : 'primary'}\n sx={{ flex: 1 }}\n >\n {copiedTool === tool ? t('assetInstallDialog.copied') : t('assetInstallDialog.copyContent')}\n </Button>\n </Tooltip>\n <Tooltip title={isZipSkill ? t('assetInstallDialog.downloadZipTooltip') : t('assetInstallDialog.downloadTooltip')}>\n <Button\n size=\"small\"\n variant=\"outlined\"\n startIcon={isZipSkill ? <FolderZipIcon /> : <DownloadIcon />}\n onClick={() => handleDownload(tool, installPath)}\n sx={{ flex: 1 }}\n >\n {isZipSkill ? t('assetInstallDialog.downloadZip') : t('assetInstallDialog.download')}\n </Button>\n </Tooltip>\n </Box>\n </Box>\n </Box>\n ))}\n </>\n );\n}\n\n// ─── Bundle item step ─────────────────────────────────────────────────────────\n\ninterface BundleItemStepProps {\n item: BundleItem;\n stepIndex: number;\n total: number;\n}\n\nfunction BundleItemStep({ item, stepIndex, total }: BundleItemStepProps) {\n const [copied, setCopied] = useState(false);\n const api = useApi(devAiHubApiRef);\n const discoveryApi = useApi(discoveryApiRef);\n const { asset, loading } = useAssetDetail(item.assetId ?? null);\n const { t } = useTranslationRef(devAiHubTranslationRef);\n\n const installPaths = asset\n ? getInstallPathsForAsset(asset.type, asset.tools, asset.name, {\n installPath: asset.installPath,\n installPaths: asset.installPaths,\n })\n : {};\n const firstInstallPath = Object.values(installPaths)[0];\n\n const handleCopy = () => {\n if (!asset) return;\n navigator.clipboard.writeText(asset.content).then(() => {\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n });\n api.trackInstall(asset.id).catch(() => {});\n };\n\n const handleDownload = async () => {\n if (!asset) return;\n const filename = (firstInstallPath?.split('/').pop()) ?? `${asset.name}.md`;\n const blob = new Blob([asset.content], { type: 'text/markdown' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = filename;\n a.click();\n URL.revokeObjectURL(url);\n api.trackInstall(asset.id).catch(() => {});\n };\n\n const handleInstallInVscode = async () => {\n if (!asset) return;\n const backendUrl = await discoveryApi.getBaseUrl('dev-ai-hub');\n const a = document.createElement('a');\n a.href = buildVscodeRedirectUrl(asset, backendUrl);\n a.target = '_blank';\n a.rel = 'noopener noreferrer';\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n api.trackInstall(asset.id).catch(() => {});\n };\n\n const showVscodeButton = asset && canUseVscodeDeepLink(asset.type, asset.tools, installPaths['github-copilot']);\n\n return (\n <Box>\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1, mb: 1.5 }}>\n <Typography variant=\"caption\" color=\"text.secondary\">\n {t('assetInstallDialog.stepProgress', { current: stepIndex + 1, total })}\n </Typography>\n {item.type && (\n <Chip label={item.type} size=\"small\" variant=\"outlined\" sx={{ height: 20, fontSize: '0.65rem' }} />\n )}\n </Box>\n\n <Typography variant=\"subtitle1\" fontWeight={700} sx={{ mb: 0.25 }}>\n {item.label ?? item.name ?? item.ref}\n </Typography>\n\n {item.description && (\n <Typography variant=\"body2\" color=\"text.secondary\" sx={{ mb: 1.5 }}>\n {item.description}\n </Typography>\n )}\n\n {loading && (\n <Box sx={{ display: 'flex', justifyContent: 'center', py: 2 }}>\n <CircularProgress size={24} />\n </Box>\n )}\n\n {!loading && !item.assetId && (\n <Box\n sx={{\n border: '1px dashed',\n borderColor: 'warning.main',\n borderRadius: 2,\n p: 1.5,\n bgcolor: theme => `${theme.palette.warning.main}10`,\n }}\n >\n <Typography variant=\"body2\" color=\"warning.main\" fontWeight={600}>\n {t('assetInstallDialog.notSyncedTitle')}\n </Typography>\n <Typography variant=\"caption\" color=\"text.secondary\">\n {t('assetInstallDialog.notSyncedRef', { ref: item.ref })}\n </Typography>\n </Box>\n )}\n\n {!loading && asset && (\n <Box sx={{ display: 'flex', flexDirection: 'column', gap: 1 }}>\n {firstInstallPath && (\n <Box\n sx={{\n bgcolor: 'action.hover',\n border: '1px solid',\n borderColor: 'divider',\n borderRadius: 1,\n px: 1.5,\n py: 0.75,\n fontFamily: 'monospace',\n fontSize: '0.78rem',\n wordBreak: 'break-all',\n }}\n >\n {firstInstallPath}\n </Box>\n )}\n\n {showVscodeButton && (\n <Button\n size=\"small\"\n variant=\"contained\"\n startIcon={<OpenInBrowserIcon />}\n onClick={handleInstallInVscode}\n fullWidth\n >\n {t('assetInstallDialog.installInVscode')}\n </Button>\n )}\n\n <Box sx={{ display: 'flex', gap: 1 }}>\n <Button\n size=\"small\"\n variant=\"outlined\"\n startIcon={copied ? <CheckIcon /> : <ContentCopyIcon />}\n onClick={handleCopy}\n color={copied ? 'success' : 'primary'}\n sx={{ flex: 1 }}\n >\n {copied ? t('assetInstallDialog.copied') : t('assetInstallDialog.copyContent')}\n </Button>\n <Button\n size=\"small\"\n variant=\"outlined\"\n startIcon={<DownloadIcon />}\n onClick={handleDownload}\n sx={{ flex: 1 }}\n >\n {t('assetInstallDialog.download')}\n </Button>\n </Box>\n </Box>\n )}\n </Box>\n );\n}\n\n// ─── Main dialog ──────────────────────────────────────────────────────────────\n\ninterface AssetInstallDialogProps {\n assetId: string | null;\n onClose: () => void;\n}\n\nexport function AssetInstallDialog({ assetId, onClose }: AssetInstallDialogProps) {\n const [step, setStep] = useState(0);\n const api = useApi(devAiHubApiRef);\n const { asset, loading } = useAssetDetail(assetId);\n const { t } = useTranslationRef(devAiHubTranslationRef);\n\n const handleClose = () => {\n setStep(0);\n onClose();\n };\n\n const handleDownloadBundle = async () => {\n if (!asset) return;\n const url = await api.getDownloadUrl(asset.id);\n const a = document.createElement('a');\n a.href = url;\n a.download = `${asset.name.replace(/\\s+/g, '-').toLowerCase()}-bundle.zip`;\n a.click();\n api.trackInstall(asset.id).catch(() => {});\n };\n\n const isBundle = asset?.type === 'bundle';\n const bundleItems = isBundle ? (asset.items ?? []) : [];\n const totalSteps = bundleItems.length;\n const progress = totalSteps > 0 ? ((step + 1) / totalSteps) * 100 : 0;\n\n return (\n <Dialog open={!!assetId} onClose={handleClose} maxWidth=\"sm\" fullWidth>\n <DialogTitle sx={{ pb: 1 }}>\n {isBundle ? (\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1 }}>\n <Inventory2Icon sx={{ color: '#8B5CF6', fontSize: '1.4rem' }} />\n <Box>\n <Typography variant=\"h6\" fontWeight={700}>\n {t('assetInstallDialog.dialogTitleBundle', { name: asset?.name ?? '' })}\n </Typography>\n <Typography variant=\"body2\" color=\"text.secondary\" sx={{ fontWeight: 400 }}>\n {t('assetInstallDialog.dialogSubtitleBundle')}\n </Typography>\n </Box>\n </Box>\n ) : (\n <>\n <Typography variant=\"h6\" fontWeight={700}>\n {asset ? t('assetInstallDialog.dialogTitle', { name: asset.name }) : t('assetInstallDialog.dialogTitle', { name: '' })}\n </Typography>\n <Typography variant=\"body2\" color=\"text.secondary\" sx={{ mt: 0.5, fontWeight: 400 }}>\n {t('assetInstallDialog.dialogSubtitle')}\n </Typography>\n </>\n )}\n </DialogTitle>\n\n {isBundle && totalSteps > 0 && (\n <Box sx={{ px: 3, pb: 1 }}>\n <LinearProgress variant=\"determinate\" value={progress} sx={{ borderRadius: 1, height: 6 }} />\n <Typography variant=\"caption\" color=\"text.secondary\" sx={{ display: 'block', mt: 0.5, textAlign: 'right' }}>\n {t('assetInstallDialog.bundleProgress', { current: step + 1, total: totalSteps })}\n </Typography>\n </Box>\n )}\n\n <DialogContent sx={{ display: 'flex', flexDirection: 'column', gap: 1.5, pt: '8px !important' }}>\n {loading && (\n <Box sx={{ display: 'flex', justifyContent: 'center', py: 3 }}>\n <CircularProgress />\n </Box>\n )}\n\n {!loading && asset && !isBundle && <SingleAssetView asset={asset} />}\n\n {!loading && isBundle && bundleItems.length === 0 && (\n <Typography variant=\"body2\" color=\"text.secondary\" sx={{ textAlign: 'center', py: 2 }}>\n {t('assetInstallDialog.bundleEmpty')}\n </Typography>\n )}\n\n {!loading && isBundle && bundleItems.length > 0 && (\n <BundleItemStep\n item={bundleItems[step]}\n stepIndex={step}\n total={totalSteps}\n />\n )}\n </DialogContent>\n\n <DialogActions sx={{ justifyContent: 'space-between', px: 2, py: 1.5 }}>\n {isBundle ? (\n <>\n <Button\n startIcon={<FolderZipIcon />}\n variant=\"outlined\"\n size=\"small\"\n onClick={handleDownloadBundle}\n disabled={!asset}\n >\n {t('assetInstallDialog.downloadBundle')}\n </Button>\n <Box sx={{ display: 'flex', gap: 1 }}>\n <Button\n startIcon={<ArrowBackIcon />}\n onClick={() => setStep(s => Math.max(0, s - 1))}\n disabled={step === 0}\n >\n {t('assetInstallDialog.back')}\n </Button>\n {step < totalSteps - 1 ? (\n <Button\n endIcon={<ArrowForwardIcon />}\n variant=\"contained\"\n onClick={() => setStep(s => Math.min(totalSteps - 1, s + 1))}\n >\n {t('assetInstallDialog.next')}\n </Button>\n ) : (\n <Button variant=\"contained\" color=\"success\" onClick={handleClose}>\n {t('assetInstallDialog.finish')}\n </Button>\n )}\n </Box>\n </>\n ) : (\n <Button onClick={handleClose} sx={{ ml: 'auto' }}>{t('assetInstallDialog.close')}</Button>\n )}\n </DialogActions>\n </Dialog>\n );\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"AssetInstallDialog.esm.js","sources":["../../../src/components/AssetInstallDialog/AssetInstallDialog.tsx"],"sourcesContent":["import { useState } from 'react';\nimport Box from '@mui/material/Box';\nimport Button from '@mui/material/Button';\nimport Chip from '@mui/material/Chip';\nimport CircularProgress from '@mui/material/CircularProgress';\nimport Dialog from '@mui/material/Dialog';\nimport DialogActions from '@mui/material/DialogActions';\nimport DialogContent from '@mui/material/DialogContent';\nimport DialogTitle from '@mui/material/DialogTitle';\nimport LinearProgress from '@mui/material/LinearProgress';\nimport Tooltip from '@mui/material/Tooltip';\nimport Typography from '@mui/material/Typography';\nimport ContentCopyIcon from '@mui/icons-material/ContentCopy';\nimport DownloadIcon from '@mui/icons-material/Download';\nimport CheckIcon from '@mui/icons-material/Check';\nimport FolderZipIcon from '@mui/icons-material/FolderZip';\nimport OpenInBrowserIcon from '@mui/icons-material/OpenInBrowser';\nimport ArrowBackIcon from '@mui/icons-material/ArrowBack';\nimport ArrowForwardIcon from '@mui/icons-material/ArrowForward';\nimport Inventory2Icon from '@mui/icons-material/Inventory2';\nimport type { AiAsset, AiTool, BundleItem } from '@julianpedro/plugin-dev-ai-hub-common';\nimport { getInstallPathsForAsset } from '@julianpedro/plugin-dev-ai-hub-common';\nimport { useApi, discoveryApiRef } from '@backstage/core-plugin-api';\nimport { useTranslationRef } from '@backstage/frontend-plugin-api';\nimport { devAiHubApiRef } from '../../api/DevAiHubClient';\nimport { useAssetDetail } from '../../hooks';\nimport { ToolIcon } from '../ToolIcon';\nimport { devAiHubTranslationRef } from '../../translation';\n\nconst TOOL_LABELS: Record<string, string> = {\n 'claude-code': 'Claude Code',\n 'github-copilot': 'GitHub Copilot',\n 'google-gemini': 'Google Gemini',\n 'cursor': 'Cursor',\n};\n\n/**\n * vscode:chat-agent/install can only place files inside .github/ (agents → .github/agents/,\n * instructions → .github/instructions/). Root-level files like AGENTS.md, CLAUDE.md, etc.\n * cannot be installed via deep link — the handler would put them in the wrong directory.\n */\nfunction canUseVscodeDeepLink(type: string, tools: string[], installPath?: string): boolean {\n if (type !== 'agent' && type !== 'instruction') return false;\n if (!tools.includes('github-copilot')) return false;\n // If a custom install path is defined and it doesn't live under .github/, skip the button.\n if (installPath && !installPath.startsWith('.github/')) return false;\n return true;\n}\n\nfunction buildVscodeRedirectUrl(asset: AiAsset, backendUrl: string): string {\n const safeName = (asset.label ?? asset.name).toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g, '');\n const filename = asset.type === 'instruction'\n ? `${safeName}.instructions.md`\n : `${safeName}.agent.md`;\n const fileUrl = `${backendUrl}/assets/${encodeURIComponent(asset.id)}/agent-md/${filename}`;\n const vscodeUri = `vscode:chat-agent/install?url=${encodeURIComponent(fileUrl)}`;\n return `https://vscode.dev/redirect?url=${encodeURIComponent(vscodeUri)}`;\n}\n\n// ─── Single-asset view ───────────────────────────────────────────────────────\n\ninterface SingleAssetViewProps {\n asset: AiAsset;\n}\n\nfunction SingleAssetView({ asset }: SingleAssetViewProps) {\n const [copiedTool, setCopiedTool] = useState<string | null>(null);\n const api = useApi(devAiHubApiRef);\n const discoveryApi = useApi(discoveryApiRef);\n const { t } = useTranslationRef(devAiHubTranslationRef);\n\n const resourcePaths = asset.resourcesContent ? Object.keys(asset.resourcesContent) : [];\n const isZipSkill = asset.type === 'skill' && resourcePaths.length > 0;\n\n const installPaths = getInstallPathsForAsset(asset.type, asset.tools, asset.name, {\n installPath: asset.installPath,\n installPaths: asset.installPaths,\n });\n\n const handleCopy = (tool: string) => {\n navigator.clipboard.writeText(asset.content).then(() => {\n setCopiedTool(tool);\n setTimeout(() => setCopiedTool(null), 2000);\n });\n api.trackInstall(asset.id).catch(() => {});\n };\n\n const handleDownload = async (_tool: string, installPath: string) => {\n if (isZipSkill) {\n const url = await api.getDownloadUrl(asset.id);\n const a = document.createElement('a');\n a.href = url;\n a.download = `${asset.name.replace(/\\s+/g, '-').toLowerCase()}.zip`;\n a.click();\n } else {\n const filename = installPath.split('/').pop() ?? `${asset.name}.md`;\n const blob = new Blob([asset.content], { type: 'text/markdown' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = filename;\n a.click();\n URL.revokeObjectURL(url);\n }\n api.trackInstall(asset.id).catch(() => {});\n };\n\n const handleInstallInVscode = async () => {\n const backendUrl = await discoveryApi.getBaseUrl('dev-ai-hub');\n const a = document.createElement('a');\n a.href = buildVscodeRedirectUrl(asset, backendUrl);\n a.target = '_blank';\n a.rel = 'noopener noreferrer';\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n api.trackInstall(asset.id).catch(() => {});\n };\n\n const showVscodeButton = canUseVscodeDeepLink(asset.type, asset.tools, installPaths['github-copilot']);\n\n return (\n <>\n {isZipSkill && (\n <Box\n sx={{\n border: '1px solid',\n borderColor: 'info.main',\n borderRadius: 2,\n p: 1.5,\n bgcolor: theme => `${theme.palette.info.main}12`,\n mb: 0.5,\n }}\n >\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1, mb: 1 }}>\n <FolderZipIcon sx={{ fontSize: '1rem', color: 'info.main' }} />\n <Typography variant=\"subtitle2\" fontWeight={700} color=\"info.main\">\n {t('assetInstallDialog.bundledSkillTitle')}\n </Typography>\n </Box>\n <Typography variant=\"caption\" color=\"text.secondary\" sx={{ display: 'block', mb: 1 }}>\n {t('assetInstallDialog.bundledSkillDescription')}\n </Typography>\n <Box sx={{ display: 'flex', gap: 0.5, flexWrap: 'wrap' }}>\n <Chip label=\"SKILL.md\" size=\"small\" sx={{ fontFamily: 'monospace', fontSize: '0.7rem', height: 20 }} />\n {resourcePaths.map(p => (\n <Chip key={p} label={p} size=\"small\" variant=\"outlined\" sx={{ fontFamily: 'monospace', fontSize: '0.7rem', height: 20 }} />\n ))}\n </Box>\n </Box>\n )}\n\n {Object.entries(installPaths).map(([tool, installPath]) => (\n <Box\n key={tool}\n sx={{ border: '1px solid', borderColor: 'divider', borderRadius: 2, p: 1.5 }}\n >\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1, mb: 1 }}>\n <ToolIcon tool={tool as AiTool} sx={{ fontSize: '1rem' }} />\n <Typography variant=\"subtitle2\" fontWeight={700}>\n {TOOL_LABELS[tool] ?? tool}\n </Typography>\n </Box>\n <Typography variant=\"caption\" color=\"text.secondary\" sx={{ display: 'block', mb: 0.5 }}>\n {t('assetInstallDialog.installPathLabel')}\n </Typography>\n <Box\n sx={{\n bgcolor: 'action.hover',\n border: '1px solid',\n borderColor: 'divider',\n borderRadius: 1,\n px: 1.5,\n py: 0.75,\n fontFamily: 'monospace',\n fontSize: '0.78rem',\n wordBreak: 'break-all',\n mb: 1.25,\n }}\n >\n {installPath}\n </Box>\n <Box sx={{ display: 'flex', flexDirection: 'column', gap: 0.75 }}>\n {showVscodeButton && tool === 'github-copilot' && (\n <Button\n size=\"small\"\n variant=\"contained\"\n startIcon={<OpenInBrowserIcon />}\n onClick={handleInstallInVscode}\n fullWidth\n >\n {t('assetInstallDialog.installInVscode')}\n </Button>\n )}\n <Box sx={{ display: 'flex', gap: 1 }}>\n <Tooltip title={copiedTool === tool ? t('assetInstallDialog.copied') : t('assetInstallDialog.copyTooltip')}>\n <Button\n size=\"small\"\n variant=\"outlined\"\n startIcon={copiedTool === tool ? <CheckIcon /> : <ContentCopyIcon />}\n onClick={() => handleCopy(tool)}\n color={copiedTool === tool ? 'success' : 'primary'}\n sx={{ flex: 1 }}\n >\n {copiedTool === tool ? t('assetInstallDialog.copied') : t('assetInstallDialog.copyContent')}\n </Button>\n </Tooltip>\n <Tooltip title={isZipSkill ? t('assetInstallDialog.downloadZipTooltip') : t('assetInstallDialog.downloadTooltip')}>\n <Button\n size=\"small\"\n variant=\"outlined\"\n startIcon={isZipSkill ? <FolderZipIcon /> : <DownloadIcon />}\n onClick={() => handleDownload(tool, installPath)}\n sx={{ flex: 1 }}\n >\n {isZipSkill ? t('assetInstallDialog.downloadZip') : t('assetInstallDialog.download')}\n </Button>\n </Tooltip>\n </Box>\n </Box>\n </Box>\n ))}\n </>\n );\n}\n\n// ─── Bundle item step ─────────────────────────────────────────────────────────\n\ninterface BundleItemStepProps {\n item: BundleItem;\n stepIndex: number;\n total: number;\n}\n\nfunction BundleItemStep({ item, stepIndex, total }: BundleItemStepProps) {\n const [copied, setCopied] = useState(false);\n const api = useApi(devAiHubApiRef);\n const discoveryApi = useApi(discoveryApiRef);\n const { asset, loading } = useAssetDetail(item.assetId ?? null);\n const { t } = useTranslationRef(devAiHubTranslationRef);\n\n const installPaths = asset\n ? getInstallPathsForAsset(asset.type, asset.tools, asset.name, {\n installPath: asset.installPath,\n installPaths: asset.installPaths,\n })\n : {};\n const firstInstallPath = Object.values(installPaths)[0];\n\n const handleCopy = () => {\n if (!asset) return;\n navigator.clipboard.writeText(asset.content).then(() => {\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n });\n api.trackInstall(asset.id).catch(() => {});\n };\n\n const handleDownload = async () => {\n if (!asset) return;\n const filename = (firstInstallPath?.split('/').pop()) ?? `${asset.name}.md`;\n const blob = new Blob([asset.content], { type: 'text/markdown' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = filename;\n a.click();\n URL.revokeObjectURL(url);\n api.trackInstall(asset.id).catch(() => {});\n };\n\n const handleInstallInVscode = async () => {\n if (!asset) return;\n const backendUrl = await discoveryApi.getBaseUrl('dev-ai-hub');\n const a = document.createElement('a');\n a.href = buildVscodeRedirectUrl(asset, backendUrl);\n a.target = '_blank';\n a.rel = 'noopener noreferrer';\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n api.trackInstall(asset.id).catch(() => {});\n };\n\n const showVscodeButton = asset && canUseVscodeDeepLink(asset.type, asset.tools, installPaths['github-copilot']);\n\n return (\n <Box>\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1, mb: 1.5 }}>\n <Typography variant=\"caption\" color=\"text.secondary\">\n {t('assetInstallDialog.stepProgress', { current: String(stepIndex + 1), total: String(total) })}\n </Typography>\n {item.type && (\n <Chip label={item.type} size=\"small\" variant=\"outlined\" sx={{ height: 20, fontSize: '0.65rem' }} />\n )}\n </Box>\n\n <Typography variant=\"subtitle1\" fontWeight={700} sx={{ mb: 0.25 }}>\n {item.label ?? item.name ?? item.ref}\n </Typography>\n\n {item.description && (\n <Typography variant=\"body2\" color=\"text.secondary\" sx={{ mb: 1.5 }}>\n {item.description}\n </Typography>\n )}\n\n {loading && (\n <Box sx={{ display: 'flex', justifyContent: 'center', py: 2 }}>\n <CircularProgress size={24} />\n </Box>\n )}\n\n {!loading && !item.assetId && (\n <Box\n sx={{\n border: '1px dashed',\n borderColor: 'warning.main',\n borderRadius: 2,\n p: 1.5,\n bgcolor: theme => `${theme.palette.warning.main}10`,\n }}\n >\n <Typography variant=\"body2\" color=\"warning.main\" fontWeight={600}>\n {t('assetInstallDialog.notSyncedTitle')}\n </Typography>\n <Typography variant=\"caption\" color=\"text.secondary\">\n {t('assetInstallDialog.notSyncedRef', { ref: item.ref })}\n </Typography>\n </Box>\n )}\n\n {!loading && asset && (\n <Box sx={{ display: 'flex', flexDirection: 'column', gap: 1 }}>\n {firstInstallPath && (\n <Box\n sx={{\n bgcolor: 'action.hover',\n border: '1px solid',\n borderColor: 'divider',\n borderRadius: 1,\n px: 1.5,\n py: 0.75,\n fontFamily: 'monospace',\n fontSize: '0.78rem',\n wordBreak: 'break-all',\n }}\n >\n {firstInstallPath}\n </Box>\n )}\n\n {showVscodeButton && (\n <Button\n size=\"small\"\n variant=\"contained\"\n startIcon={<OpenInBrowserIcon />}\n onClick={handleInstallInVscode}\n fullWidth\n >\n {t('assetInstallDialog.installInVscode')}\n </Button>\n )}\n\n <Box sx={{ display: 'flex', gap: 1 }}>\n <Button\n size=\"small\"\n variant=\"outlined\"\n startIcon={copied ? <CheckIcon /> : <ContentCopyIcon />}\n onClick={handleCopy}\n color={copied ? 'success' : 'primary'}\n sx={{ flex: 1 }}\n >\n {copied ? t('assetInstallDialog.copied') : t('assetInstallDialog.copyContent')}\n </Button>\n <Button\n size=\"small\"\n variant=\"outlined\"\n startIcon={<DownloadIcon />}\n onClick={handleDownload}\n sx={{ flex: 1 }}\n >\n {t('assetInstallDialog.download')}\n </Button>\n </Box>\n </Box>\n )}\n </Box>\n );\n}\n\n// ─── Main dialog ──────────────────────────────────────────────────────────────\n\ninterface AssetInstallDialogProps {\n assetId: string | null;\n onClose: () => void;\n}\n\nexport function AssetInstallDialog({ assetId, onClose }: AssetInstallDialogProps) {\n const [step, setStep] = useState(0);\n const api = useApi(devAiHubApiRef);\n const { asset, loading } = useAssetDetail(assetId);\n const { t } = useTranslationRef(devAiHubTranslationRef);\n\n const handleClose = () => {\n setStep(0);\n onClose();\n };\n\n const handleDownloadBundle = async () => {\n if (!asset) return;\n const url = await api.getDownloadUrl(asset.id);\n const a = document.createElement('a');\n a.href = url;\n a.download = `${asset.name.replace(/\\s+/g, '-').toLowerCase()}-bundle.zip`;\n a.click();\n api.trackInstall(asset.id).catch(() => {});\n };\n\n const isBundle = asset?.type === 'bundle';\n const bundleItems = isBundle ? (asset.items ?? []) : [];\n const totalSteps = bundleItems.length;\n const progress = totalSteps > 0 ? ((step + 1) / totalSteps) * 100 : 0;\n\n return (\n <Dialog open={!!assetId} onClose={handleClose} maxWidth=\"sm\" fullWidth>\n <DialogTitle sx={{ pb: 1 }}>\n {isBundle ? (\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1 }}>\n <Inventory2Icon sx={{ color: '#8B5CF6', fontSize: '1.4rem' }} />\n <Box>\n <Typography variant=\"h6\" fontWeight={700}>\n {t('assetInstallDialog.dialogTitleBundle', { name: asset?.name ?? '' })}\n </Typography>\n <Typography variant=\"body2\" color=\"text.secondary\" sx={{ fontWeight: 400 }}>\n {t('assetInstallDialog.dialogSubtitleBundle')}\n </Typography>\n </Box>\n </Box>\n ) : (\n <>\n <Typography variant=\"h6\" fontWeight={700}>\n {asset ? t('assetInstallDialog.dialogTitle', { name: asset.name }) : t('assetInstallDialog.dialogTitle', { name: '' })}\n </Typography>\n <Typography variant=\"body2\" color=\"text.secondary\" sx={{ mt: 0.5, fontWeight: 400 }}>\n {t('assetInstallDialog.dialogSubtitle')}\n </Typography>\n </>\n )}\n </DialogTitle>\n\n {isBundle && totalSteps > 0 && (\n <Box sx={{ px: 3, pb: 1 }}>\n <LinearProgress variant=\"determinate\" value={progress} sx={{ borderRadius: 1, height: 6 }} />\n <Typography variant=\"caption\" color=\"text.secondary\" sx={{ display: 'block', mt: 0.5, textAlign: 'right' }}>\n {t('assetInstallDialog.bundleProgress', { current: String(step + 1), total: String(totalSteps) })}\n </Typography>\n </Box>\n )}\n\n <DialogContent sx={{ display: 'flex', flexDirection: 'column', gap: 1.5, pt: '8px !important' }}>\n {loading && (\n <Box sx={{ display: 'flex', justifyContent: 'center', py: 3 }}>\n <CircularProgress />\n </Box>\n )}\n\n {!loading && asset && !isBundle && <SingleAssetView asset={asset} />}\n\n {!loading && isBundle && bundleItems.length === 0 && (\n <Typography variant=\"body2\" color=\"text.secondary\" sx={{ textAlign: 'center', py: 2 }}>\n {t('assetInstallDialog.bundleEmpty')}\n </Typography>\n )}\n\n {!loading && isBundle && bundleItems.length > 0 && (\n <BundleItemStep\n item={bundleItems[step]}\n stepIndex={step}\n total={totalSteps}\n />\n )}\n </DialogContent>\n\n <DialogActions sx={{ justifyContent: 'space-between', px: 2, py: 1.5 }}>\n {isBundle ? (\n <>\n <Button\n startIcon={<FolderZipIcon />}\n variant=\"outlined\"\n size=\"small\"\n onClick={handleDownloadBundle}\n disabled={!asset}\n >\n {t('assetInstallDialog.downloadBundle')}\n </Button>\n <Box sx={{ display: 'flex', gap: 1 }}>\n <Button\n startIcon={<ArrowBackIcon />}\n onClick={() => setStep(s => Math.max(0, s - 1))}\n disabled={step === 0}\n >\n {t('assetInstallDialog.back')}\n </Button>\n {step < totalSteps - 1 ? (\n <Button\n endIcon={<ArrowForwardIcon />}\n variant=\"contained\"\n onClick={() => setStep(s => Math.min(totalSteps - 1, s + 1))}\n >\n {t('assetInstallDialog.next')}\n </Button>\n ) : (\n <Button variant=\"contained\" color=\"success\" onClick={handleClose}>\n {t('assetInstallDialog.finish')}\n </Button>\n )}\n </Box>\n </>\n ) : (\n <Button onClick={handleClose} sx={{ ml: 'auto' }}>{t('assetInstallDialog.close')}</Button>\n )}\n </DialogActions>\n </Dialog>\n );\n}"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6BA,MAAM,WAAA,GAAsC;AAAA,EAC1C,aAAA,EAAkB,aAAA;AAAA,EAClB,gBAAA,EAAkB,gBAAA;AAAA,EAClB,eAAA,EAAkB,eAAA;AAAA,EAClB,QAAA,EAAkB;AACpB,CAAA;AAOA,SAAS,oBAAA,CAAqB,IAAA,EAAc,KAAA,EAAiB,WAAA,EAA+B;AAC1F,EAAA,IAAI,IAAA,KAAS,OAAA,IAAW,IAAA,KAAS,aAAA,EAAe,OAAO,KAAA;AACvD,EAAA,IAAI,CAAC,KAAA,CAAM,QAAA,CAAS,gBAAgB,GAAG,OAAO,KAAA;AAE9C,EAAA,IAAI,eAAe,CAAC,WAAA,CAAY,UAAA,CAAW,UAAU,GAAG,OAAO,KAAA;AAC/D,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,sBAAA,CAAuB,OAAgB,UAAA,EAA4B;AAC1E,EAAA,MAAM,QAAA,GAAA,CAAY,KAAA,CAAM,KAAA,IAAS,KAAA,CAAM,IAAA,EAAM,WAAA,EAAY,CAAE,OAAA,CAAQ,aAAA,EAAe,GAAG,CAAA,CAAE,OAAA,CAAQ,UAAU,EAAE,CAAA;AAC3G,EAAA,MAAM,QAAA,GAAW,MAAM,IAAA,KAAS,aAAA,GAC5B,GAAG,QAAQ,CAAA,gBAAA,CAAA,GACX,GAAG,QAAQ,CAAA,SAAA,CAAA;AACf,EAAA,MAAM,OAAA,GAAU,GAAG,UAAU,CAAA,QAAA,EAAW,mBAAmB,KAAA,CAAM,EAAE,CAAC,CAAA,UAAA,EAAa,QAAQ,CAAA,CAAA;AACzF,EAAA,MAAM,SAAA,GAAY,CAAA,8BAAA,EAAiC,kBAAA,CAAmB,OAAO,CAAC,CAAA,CAAA;AAC9E,EAAA,OAAO,CAAA,gCAAA,EAAmC,kBAAA,CAAmB,SAAS,CAAC,CAAA,CAAA;AACzE;AAQA,SAAS,eAAA,CAAgB,EAAE,KAAA,EAAM,EAAyB;AACxD,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAI,SAAwB,IAAI,CAAA;AAChE,EAAA,MAAM,GAAA,GAAM,OAAO,cAAc,CAAA;AACjC,EAAA,MAAM,YAAA,GAAe,OAAO,eAAe,CAAA;AAC3C,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,iBAAA,CAAkB,sBAAsB,CAAA;AAEtD,EAAA,MAAM,aAAA,GAAgB,MAAM,gBAAA,GAAmB,MAAA,CAAO,KAAK,KAAA,CAAM,gBAAgB,IAAI,EAAC;AACtF,EAAA,MAAM,UAAA,GAAa,KAAA,CAAM,IAAA,KAAS,OAAA,IAAW,cAAc,MAAA,GAAS,CAAA;AAEpE,EAAA,MAAM,eAAe,uBAAA,CAAwB,KAAA,CAAM,MAAM,KAAA,CAAM,KAAA,EAAO,MAAM,IAAA,EAAM;AAAA,IAChF,aAAa,KAAA,CAAM,WAAA;AAAA,IACnB,cAAc,KAAA,CAAM;AAAA,GACrB,CAAA;AAED,EAAA,MAAM,UAAA,GAAa,CAAC,IAAA,KAAiB;AACnC,IAAA,SAAA,CAAU,UAAU,SAAA,CAAU,KAAA,CAAM,OAAO,CAAA,CAAE,KAAK,MAAM;AACtD,MAAA,aAAA,CAAc,IAAI,CAAA;AAClB,MAAA,UAAA,CAAW,MAAM,aAAA,CAAc,IAAI,CAAA,EAAG,GAAI,CAAA;AAAA,IAC5C,CAAC,CAAA;AACD,IAAA,GAAA,CAAI,YAAA,CAAa,KAAA,CAAM,EAAE,CAAA,CAAE,MAAM,MAAM;AAAA,IAAC,CAAC,CAAA;AAAA,EAC3C,CAAA;AAEA,EAAA,MAAM,cAAA,GAAiB,OAAO,KAAA,EAAe,WAAA,KAAwB;AACnE,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,MAAM,GAAA,GAAM,MAAM,GAAA,CAAI,cAAA,CAAe,MAAM,EAAE,CAAA;AAC7C,MAAA,MAAM,CAAA,GAAI,QAAA,CAAS,aAAA,CAAc,GAAG,CAAA;AACpC,MAAA,CAAA,CAAE,IAAA,GAAO,GAAA;AACT,MAAA,CAAA,CAAE,QAAA,GAAW,GAAG,KAAA,CAAM,IAAA,CAAK,QAAQ,MAAA,EAAQ,GAAG,CAAA,CAAE,WAAA,EAAa,CAAA,IAAA,CAAA;AAC7D,MAAA,CAAA,CAAE,KAAA,EAAM;AAAA,IACV,CAAA,MAAO;AACL,MAAA,MAAM,QAAA,GAAW,YAAY,KAAA,CAAM,GAAG,EAAE,GAAA,EAAI,IAAK,CAAA,EAAG,KAAA,CAAM,IAAI,CAAA,GAAA,CAAA;AAC9D,MAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,CAAC,KAAA,CAAM,OAAO,CAAA,EAAG,EAAE,IAAA,EAAM,eAAA,EAAiB,CAAA;AAChE,MAAA,MAAM,GAAA,GAAM,GAAA,CAAI,eAAA,CAAgB,IAAI,CAAA;AACpC,MAAA,MAAM,CAAA,GAAI,QAAA,CAAS,aAAA,CAAc,GAAG,CAAA;AACpC,MAAA,CAAA,CAAE,IAAA,GAAO,GAAA;AACT,MAAA,CAAA,CAAE,QAAA,GAAW,QAAA;AACb,MAAA,CAAA,CAAE,KAAA,EAAM;AACR,MAAA,GAAA,CAAI,gBAAgB,GAAG,CAAA;AAAA,IACzB;AACA,IAAA,GAAA,CAAI,YAAA,CAAa,KAAA,CAAM,EAAE,CAAA,CAAE,MAAM,MAAM;AAAA,IAAC,CAAC,CAAA;AAAA,EAC3C,CAAA;AAEA,EAAA,MAAM,wBAAwB,YAAY;AACxC,IAAA,MAAM,UAAA,GAAa,MAAM,YAAA,CAAa,UAAA,CAAW,YAAY,CAAA;AAC7D,IAAA,MAAM,CAAA,GAAI,QAAA,CAAS,aAAA,CAAc,GAAG,CAAA;AACpC,IAAA,CAAA,CAAE,IAAA,GAAO,sBAAA,CAAuB,KAAA,EAAO,UAAU,CAAA;AACjD,IAAA,CAAA,CAAE,MAAA,GAAS,QAAA;AACX,IAAA,CAAA,CAAE,GAAA,GAAM,qBAAA;AACR,IAAA,QAAA,CAAS,IAAA,CAAK,YAAY,CAAC,CAAA;AAC3B,IAAA,CAAA,CAAE,KAAA,EAAM;AACR,IAAA,QAAA,CAAS,IAAA,CAAK,YAAY,CAAC,CAAA;AAC3B,IAAA,GAAA,CAAI,YAAA,CAAa,KAAA,CAAM,EAAE,CAAA,CAAE,MAAM,MAAM;AAAA,IAAC,CAAC,CAAA;AAAA,EAC3C,CAAA;AAEA,EAAA,MAAM,gBAAA,GAAmB,qBAAqB,KAAA,CAAM,IAAA,EAAM,MAAM,KAAA,EAAO,YAAA,CAAa,gBAAgB,CAAC,CAAA;AAErG,EAAA,uBACE,IAAA,CAAA,QAAA,EAAA,EACG,QAAA,EAAA;AAAA,IAAA,UAAA,oBACC,IAAA;AAAA,MAAC,GAAA;AAAA,MAAA;AAAA,QACC,EAAA,EAAI;AAAA,UACF,MAAA,EAAQ,WAAA;AAAA,UACR,WAAA,EAAa,WAAA;AAAA,UACb,YAAA,EAAc,CAAA;AAAA,UACd,CAAA,EAAG,GAAA;AAAA,UACH,SAAS,CAAA,KAAA,KAAS,CAAA,EAAG,KAAA,CAAM,OAAA,CAAQ,KAAK,IAAI,CAAA,EAAA,CAAA;AAAA,UAC5C,EAAA,EAAI;AAAA,SACN;AAAA,QAEA,QAAA,EAAA;AAAA,0BAAA,IAAA,CAAC,GAAA,EAAA,EAAI,EAAA,EAAI,EAAE,OAAA,EAAS,MAAA,EAAQ,UAAA,EAAY,QAAA,EAAU,GAAA,EAAK,CAAA,EAAG,EAAA,EAAI,CAAA,EAAE,EAC9D,QAAA,EAAA;AAAA,4BAAA,GAAA,CAAC,iBAAc,EAAA,EAAI,EAAE,UAAU,MAAA,EAAQ,KAAA,EAAO,aAAY,EAAG,CAAA;AAAA,4BAC7D,GAAA,CAAC,UAAA,EAAA,EAAW,OAAA,EAAQ,WAAA,EAAY,UAAA,EAAY,KAAK,KAAA,EAAM,WAAA,EACpD,QAAA,EAAA,CAAA,CAAE,sCAAsC,CAAA,EAC3C;AAAA,WAAA,EACF,CAAA;AAAA,0BACA,GAAA,CAAC,UAAA,EAAA,EAAW,OAAA,EAAQ,SAAA,EAAU,OAAM,gBAAA,EAAiB,EAAA,EAAI,EAAE,OAAA,EAAS,SAAS,EAAA,EAAI,CAAA,EAAE,EAChF,QAAA,EAAA,CAAA,CAAE,4CAA4C,CAAA,EACjD,CAAA;AAAA,0BACA,IAAA,CAAC,GAAA,EAAA,EAAI,EAAA,EAAI,EAAE,OAAA,EAAS,QAAQ,GAAA,EAAK,GAAA,EAAK,QAAA,EAAU,MAAA,EAAO,EACrD,QAAA,EAAA;AAAA,4BAAA,GAAA,CAAC,IAAA,EAAA,EAAK,KAAA,EAAM,UAAA,EAAW,IAAA,EAAK,OAAA,EAAQ,EAAA,EAAI,EAAE,UAAA,EAAY,WAAA,EAAa,QAAA,EAAU,QAAA,EAAU,MAAA,EAAQ,IAAG,EAAG,CAAA;AAAA,YACpG,aAAA,CAAc,IAAI,CAAA,CAAA,qBACjB,GAAA,CAAC,QAAa,KAAA,EAAO,CAAA,EAAG,MAAK,OAAA,EAAQ,OAAA,EAAQ,YAAW,EAAA,EAAI,EAAE,YAAY,WAAA,EAAa,QAAA,EAAU,UAAU,MAAA,EAAQ,EAAA,EAAG,EAAA,EAA3G,CAA8G,CAC1H;AAAA,WAAA,EACH;AAAA;AAAA;AAAA,KACF;AAAA,IAGD,MAAA,CAAO,QAAQ,YAAY,CAAA,CAAE,IAAI,CAAC,CAAC,IAAA,EAAM,WAAW,CAAA,qBACnD,IAAA;AAAA,MAAC,GAAA;AAAA,MAAA;AAAA,QAEC,EAAA,EAAI,EAAE,MAAA,EAAQ,WAAA,EAAa,aAAa,SAAA,EAAW,YAAA,EAAc,CAAA,EAAG,CAAA,EAAG,GAAA,EAAI;AAAA,QAE3E,QAAA,EAAA;AAAA,0BAAA,IAAA,CAAC,GAAA,EAAA,EAAI,EAAA,EAAI,EAAE,OAAA,EAAS,MAAA,EAAQ,UAAA,EAAY,QAAA,EAAU,GAAA,EAAK,CAAA,EAAG,EAAA,EAAI,CAAA,EAAE,EAC9D,QAAA,EAAA;AAAA,4BAAA,GAAA,CAAC,YAAS,IAAA,EAAsB,EAAA,EAAI,EAAE,QAAA,EAAU,QAAO,EAAG,CAAA;AAAA,4BAC1D,GAAA,CAAC,cAAW,OAAA,EAAQ,WAAA,EAAY,YAAY,GAAA,EACzC,QAAA,EAAA,WAAA,CAAY,IAAI,CAAA,IAAK,IAAA,EACxB;AAAA,WAAA,EACF,CAAA;AAAA,0BACA,GAAA,CAAC,UAAA,EAAA,EAAW,OAAA,EAAQ,SAAA,EAAU,OAAM,gBAAA,EAAiB,EAAA,EAAI,EAAE,OAAA,EAAS,SAAS,EAAA,EAAI,GAAA,EAAI,EAClF,QAAA,EAAA,CAAA,CAAE,qCAAqC,CAAA,EAC1C,CAAA;AAAA,0BACA,GAAA;AAAA,YAAC,GAAA;AAAA,YAAA;AAAA,cACC,EAAA,EAAI;AAAA,gBACF,OAAA,EAAS,cAAA;AAAA,gBACT,MAAA,EAAQ,WAAA;AAAA,gBACR,WAAA,EAAa,SAAA;AAAA,gBACb,YAAA,EAAc,CAAA;AAAA,gBACd,EAAA,EAAI,GAAA;AAAA,gBACJ,EAAA,EAAI,IAAA;AAAA,gBACJ,UAAA,EAAY,WAAA;AAAA,gBACZ,QAAA,EAAU,SAAA;AAAA,gBACV,SAAA,EAAW,WAAA;AAAA,gBACX,EAAA,EAAI;AAAA,eACN;AAAA,cAEC,QAAA,EAAA;AAAA;AAAA,WACH;AAAA,0BACA,IAAA,CAAC,GAAA,EAAA,EAAI,EAAA,EAAI,EAAE,OAAA,EAAS,QAAQ,aAAA,EAAe,QAAA,EAAU,GAAA,EAAK,IAAA,EAAK,EAC5D,QAAA,EAAA;AAAA,YAAA,gBAAA,IAAoB,SAAS,gBAAA,oBAC5B,GAAA;AAAA,cAAC,MAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAK,OAAA;AAAA,gBACL,OAAA,EAAQ,WAAA;AAAA,gBACR,SAAA,sBAAY,iBAAA,EAAA,EAAkB,CAAA;AAAA,gBAC9B,OAAA,EAAS,qBAAA;AAAA,gBACT,SAAA,EAAS,IAAA;AAAA,gBAER,YAAE,oCAAoC;AAAA;AAAA,aACzC;AAAA,4BAEF,IAAA,CAAC,OAAI,EAAA,EAAI,EAAE,SAAS,MAAA,EAAQ,GAAA,EAAK,GAAE,EACjC,QAAA,EAAA;AAAA,8BAAA,GAAA,CAAC,OAAA,EAAA,EAAQ,OAAO,UAAA,KAAe,IAAA,GAAO,EAAE,2BAA2B,CAAA,GAAI,CAAA,CAAE,gCAAgC,CAAA,EACvG,QAAA,kBAAA,GAAA;AAAA,gBAAC,MAAA;AAAA,gBAAA;AAAA,kBACC,IAAA,EAAK,OAAA;AAAA,kBACL,OAAA,EAAQ,UAAA;AAAA,kBACR,WAAW,UAAA,KAAe,IAAA,uBAAQ,SAAA,EAAA,EAAU,CAAA,uBAAM,eAAA,EAAA,EAAgB,CAAA;AAAA,kBAClE,OAAA,EAAS,MAAM,UAAA,CAAW,IAAI,CAAA;AAAA,kBAC9B,KAAA,EAAO,UAAA,KAAe,IAAA,GAAO,SAAA,GAAY,SAAA;AAAA,kBACzC,EAAA,EAAI,EAAE,IAAA,EAAM,CAAA,EAAE;AAAA,kBAEb,yBAAe,IAAA,GAAO,CAAA,CAAE,2BAA2B,CAAA,GAAI,EAAE,gCAAgC;AAAA;AAAA,eAC5F,EACF,CAAA;AAAA,8BACA,GAAA,CAAC,WAAQ,KAAA,EAAO,UAAA,GAAa,EAAE,uCAAuC,CAAA,GAAI,CAAA,CAAE,oCAAoC,CAAA,EAC9G,QAAA,kBAAA,GAAA;AAAA,gBAAC,MAAA;AAAA,gBAAA;AAAA,kBACC,IAAA,EAAK,OAAA;AAAA,kBACL,OAAA,EAAQ,UAAA;AAAA,kBACR,WAAW,UAAA,mBAAa,GAAA,CAAC,aAAA,EAAA,EAAc,CAAA,uBAAM,YAAA,EAAA,EAAa,CAAA;AAAA,kBAC1D,OAAA,EAAS,MAAM,cAAA,CAAe,IAAA,EAAM,WAAW,CAAA;AAAA,kBAC/C,EAAA,EAAI,EAAE,IAAA,EAAM,CAAA,EAAE;AAAA,kBAEb,QAAA,EAAA,UAAA,GAAa,CAAA,CAAE,gCAAgC,CAAA,GAAI,EAAE,6BAA6B;AAAA;AAAA,eACrF,EACF;AAAA,aAAA,EACF;AAAA,WAAA,EACF;AAAA;AAAA,OAAA;AAAA,MAjEK;AAAA,KAmER;AAAA,GAAA,EACH,CAAA;AAEJ;AAUA,SAAS,cAAA,CAAe,EAAE,IAAA,EAAM,SAAA,EAAW,OAAM,EAAwB;AACvE,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAI,SAAS,KAAK,CAAA;AAC1C,EAAA,MAAM,GAAA,GAAM,OAAO,cAAc,CAAA;AACjC,EAAA,MAAM,YAAA,GAAe,OAAO,eAAe,CAAA;AAC3C,EAAA,MAAM,EAAE,KAAA,EAAO,OAAA,KAAY,cAAA,CAAe,IAAA,CAAK,WAAW,IAAI,CAAA;AAC9D,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,iBAAA,CAAkB,sBAAsB,CAAA;AAEtD,EAAA,MAAM,YAAA,GAAe,QACjB,uBAAA,CAAwB,KAAA,CAAM,MAAM,KAAA,CAAM,KAAA,EAAO,MAAM,IAAA,EAAM;AAAA,IAC3D,aAAa,KAAA,CAAM,WAAA;AAAA,IACnB,cAAc,KAAA,CAAM;AAAA,GACrB,IACD,EAAC;AACL,EAAA,MAAM,gBAAA,GAAmB,MAAA,CAAO,MAAA,CAAO,YAAY,EAAE,CAAC,CAAA;AAEtD,EAAA,MAAM,aAAa,MAAM;AACvB,IAAA,IAAI,CAAC,KAAA,EAAO;AACZ,IAAA,SAAA,CAAU,UAAU,SAAA,CAAU,KAAA,CAAM,OAAO,CAAA,CAAE,KAAK,MAAM;AACtD,MAAA,SAAA,CAAU,IAAI,CAAA;AACd,MAAA,UAAA,CAAW,MAAM,SAAA,CAAU,KAAK,CAAA,EAAG,GAAI,CAAA;AAAA,IACzC,CAAC,CAAA;AACD,IAAA,GAAA,CAAI,YAAA,CAAa,KAAA,CAAM,EAAE,CAAA,CAAE,MAAM,MAAM;AAAA,IAAC,CAAC,CAAA;AAAA,EAC3C,CAAA;AAEA,EAAA,MAAM,iBAAiB,YAAY;AACjC,IAAA,IAAI,CAAC,KAAA,EAAO;AACZ,IAAA,MAAM,QAAA,GAAY,kBAAkB,KAAA,CAAM,GAAG,EAAE,GAAA,EAAI,IAAM,CAAA,EAAG,KAAA,CAAM,IAAI,CAAA,GAAA,CAAA;AACtE,IAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,CAAC,KAAA,CAAM,OAAO,CAAA,EAAG,EAAE,IAAA,EAAM,eAAA,EAAiB,CAAA;AAChE,IAAA,MAAM,GAAA,GAAM,GAAA,CAAI,eAAA,CAAgB,IAAI,CAAA;AACpC,IAAA,MAAM,CAAA,GAAI,QAAA,CAAS,aAAA,CAAc,GAAG,CAAA;AACpC,IAAA,CAAA,CAAE,IAAA,GAAO,GAAA;AACT,IAAA,CAAA,CAAE,QAAA,GAAW,QAAA;AACb,IAAA,CAAA,CAAE,KAAA,EAAM;AACR,IAAA,GAAA,CAAI,gBAAgB,GAAG,CAAA;AACvB,IAAA,GAAA,CAAI,YAAA,CAAa,KAAA,CAAM,EAAE,CAAA,CAAE,MAAM,MAAM;AAAA,IAAC,CAAC,CAAA;AAAA,EAC3C,CAAA;AAEA,EAAA,MAAM,wBAAwB,YAAY;AACxC,IAAA,IAAI,CAAC,KAAA,EAAO;AACZ,IAAA,MAAM,UAAA,GAAa,MAAM,YAAA,CAAa,UAAA,CAAW,YAAY,CAAA;AAC7D,IAAA,MAAM,CAAA,GAAI,QAAA,CAAS,aAAA,CAAc,GAAG,CAAA;AACpC,IAAA,CAAA,CAAE,IAAA,GAAO,sBAAA,CAAuB,KAAA,EAAO,UAAU,CAAA;AACjD,IAAA,CAAA,CAAE,MAAA,GAAS,QAAA;AACX,IAAA,CAAA,CAAE,GAAA,GAAM,qBAAA;AACR,IAAA,QAAA,CAAS,IAAA,CAAK,YAAY,CAAC,CAAA;AAC3B,IAAA,CAAA,CAAE,KAAA,EAAM;AACR,IAAA,QAAA,CAAS,IAAA,CAAK,YAAY,CAAC,CAAA;AAC3B,IAAA,GAAA,CAAI,YAAA,CAAa,KAAA,CAAM,EAAE,CAAA,CAAE,MAAM,MAAM;AAAA,IAAC,CAAC,CAAA;AAAA,EAC3C,CAAA;AAEA,EAAA,MAAM,gBAAA,GAAmB,SAAS,oBAAA,CAAqB,KAAA,CAAM,MAAM,KAAA,CAAM,KAAA,EAAO,YAAA,CAAa,gBAAgB,CAAC,CAAA;AAE9G,EAAA,4BACG,GAAA,EAAA,EACC,QAAA,EAAA;AAAA,oBAAA,IAAA,CAAC,GAAA,EAAA,EAAI,EAAA,EAAI,EAAE,OAAA,EAAS,MAAA,EAAQ,UAAA,EAAY,QAAA,EAAU,GAAA,EAAK,CAAA,EAAG,EAAA,EAAI,GAAA,EAAI,EAChE,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,cAAW,OAAA,EAAQ,SAAA,EAAU,OAAM,gBAAA,EACjC,QAAA,EAAA,CAAA,CAAE,mCAAmC,EAAE,OAAA,EAAS,MAAA,CAAO,SAAA,GAAY,CAAC,CAAA,EAAG,KAAA,EAAO,OAAO,KAAK,CAAA,EAAG,CAAA,EAChG,CAAA;AAAA,MACC,KAAK,IAAA,oBACJ,GAAA,CAAC,IAAA,EAAA,EAAK,KAAA,EAAO,KAAK,IAAA,EAAM,IAAA,EAAK,OAAA,EAAQ,OAAA,EAAQ,YAAW,EAAA,EAAI,EAAE,QAAQ,EAAA,EAAI,QAAA,EAAU,WAAU,EAAG;AAAA,KAAA,EAErG,CAAA;AAAA,wBAEC,UAAA,EAAA,EAAW,OAAA,EAAQ,WAAA,EAAY,UAAA,EAAY,KAAK,EAAA,EAAI,EAAE,EAAA,EAAI,IAAA,IACxD,QAAA,EAAA,IAAA,CAAK,KAAA,IAAS,IAAA,CAAK,IAAA,IAAQ,KAAK,GAAA,EACnC,CAAA;AAAA,IAEC,IAAA,CAAK,WAAA,oBACJ,GAAA,CAAC,UAAA,EAAA,EAAW,SAAQ,OAAA,EAAQ,KAAA,EAAM,gBAAA,EAAiB,EAAA,EAAI,EAAE,EAAA,EAAI,GAAA,EAAI,EAC9D,eAAK,WAAA,EACR,CAAA;AAAA,IAGD,2BACC,GAAA,CAAC,GAAA,EAAA,EAAI,EAAA,EAAI,EAAE,SAAS,MAAA,EAAQ,cAAA,EAAgB,QAAA,EAAU,EAAA,EAAI,GAAE,EAC1D,QAAA,kBAAA,GAAA,CAAC,gBAAA,EAAA,EAAiB,IAAA,EAAM,IAAI,CAAA,EAC9B,CAAA;AAAA,IAGD,CAAC,OAAA,IAAW,CAAC,IAAA,CAAK,OAAA,oBACjB,IAAA;AAAA,MAAC,GAAA;AAAA,MAAA;AAAA,QACC,EAAA,EAAI;AAAA,UACF,MAAA,EAAQ,YAAA;AAAA,UACR,WAAA,EAAa,cAAA;AAAA,UACb,YAAA,EAAc,CAAA;AAAA,UACd,CAAA,EAAG,GAAA;AAAA,UACH,SAAS,CAAA,KAAA,KAAS,CAAA,EAAG,KAAA,CAAM,OAAA,CAAQ,QAAQ,IAAI,CAAA,EAAA;AAAA,SACjD;AAAA,QAEA,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,UAAA,EAAA,EAAW,SAAQ,OAAA,EAAQ,KAAA,EAAM,gBAAe,UAAA,EAAY,GAAA,EAC1D,QAAA,EAAA,CAAA,CAAE,mCAAmC,CAAA,EACxC,CAAA;AAAA,0BACA,GAAA,CAAC,UAAA,EAAA,EAAW,OAAA,EAAQ,SAAA,EAAU,KAAA,EAAM,gBAAA,EACjC,QAAA,EAAA,CAAA,CAAE,iCAAA,EAAmC,EAAE,GAAA,EAAK,IAAA,CAAK,GAAA,EAAK,CAAA,EACzD;AAAA;AAAA;AAAA,KACF;AAAA,IAGD,CAAC,OAAA,IAAW,KAAA,oBACX,IAAA,CAAC,GAAA,EAAA,EAAI,EAAA,EAAI,EAAE,OAAA,EAAS,MAAA,EAAQ,aAAA,EAAe,QAAA,EAAU,GAAA,EAAK,GAAE,EACzD,QAAA,EAAA;AAAA,MAAA,gBAAA,oBACC,GAAA;AAAA,QAAC,GAAA;AAAA,QAAA;AAAA,UACC,EAAA,EAAI;AAAA,YACF,OAAA,EAAS,cAAA;AAAA,YACT,MAAA,EAAQ,WAAA;AAAA,YACR,WAAA,EAAa,SAAA;AAAA,YACb,YAAA,EAAc,CAAA;AAAA,YACd,EAAA,EAAI,GAAA;AAAA,YACJ,EAAA,EAAI,IAAA;AAAA,YACJ,UAAA,EAAY,WAAA;AAAA,YACZ,QAAA,EAAU,SAAA;AAAA,YACV,SAAA,EAAW;AAAA,WACb;AAAA,UAEC,QAAA,EAAA;AAAA;AAAA,OACH;AAAA,MAGD,gBAAA,oBACC,GAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,OAAA;AAAA,UACL,OAAA,EAAQ,WAAA;AAAA,UACR,SAAA,sBAAY,iBAAA,EAAA,EAAkB,CAAA;AAAA,UAC9B,OAAA,EAAS,qBAAA;AAAA,UACT,SAAA,EAAS,IAAA;AAAA,UAER,YAAE,oCAAoC;AAAA;AAAA,OACzC;AAAA,sBAGF,IAAA,CAAC,OAAI,EAAA,EAAI,EAAE,SAAS,MAAA,EAAQ,GAAA,EAAK,GAAE,EACjC,QAAA,EAAA;AAAA,wBAAA,GAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,OAAA;AAAA,YACL,OAAA,EAAQ,UAAA;AAAA,YACR,WAAW,MAAA,mBAAS,GAAA,CAAC,SAAA,EAAA,EAAU,CAAA,uBAAM,eAAA,EAAA,EAAgB,CAAA;AAAA,YACrD,OAAA,EAAS,UAAA;AAAA,YACT,KAAA,EAAO,SAAS,SAAA,GAAY,SAAA;AAAA,YAC5B,EAAA,EAAI,EAAE,IAAA,EAAM,CAAA,EAAE;AAAA,YAEb,QAAA,EAAA,MAAA,GAAS,CAAA,CAAE,2BAA2B,CAAA,GAAI,EAAE,gCAAgC;AAAA;AAAA,SAC/E;AAAA,wBACA,GAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,OAAA;AAAA,YACL,OAAA,EAAQ,UAAA;AAAA,YACR,SAAA,sBAAY,YAAA,EAAA,EAAa,CAAA;AAAA,YACzB,OAAA,EAAS,cAAA;AAAA,YACT,EAAA,EAAI,EAAE,IAAA,EAAM,CAAA,EAAE;AAAA,YAEb,YAAE,6BAA6B;AAAA;AAAA;AAClC,OAAA,EACF;AAAA,KAAA,EACF;AAAA,GAAA,EAEJ,CAAA;AAEJ;AASO,SAAS,kBAAA,CAAmB,EAAE,OAAA,EAAS,OAAA,EAAQ,EAA4B;AAChF,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAI,SAAS,CAAC,CAAA;AAClC,EAAA,MAAM,GAAA,GAAM,OAAO,cAAc,CAAA;AACjC,EAAA,MAAM,EAAE,KAAA,EAAO,OAAA,EAAQ,GAAI,eAAe,OAAO,CAAA;AACjD,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,iBAAA,CAAkB,sBAAsB,CAAA;AAEtD,EAAA,MAAM,cAAc,MAAM;AACxB,IAAA,OAAA,CAAQ,CAAC,CAAA;AACT,IAAA,OAAA,EAAQ;AAAA,EACV,CAAA;AAEA,EAAA,MAAM,uBAAuB,YAAY;AACvC,IAAA,IAAI,CAAC,KAAA,EAAO;AACZ,IAAA,MAAM,GAAA,GAAM,MAAM,GAAA,CAAI,cAAA,CAAe,MAAM,EAAE,CAAA;AAC7C,IAAA,MAAM,CAAA,GAAI,QAAA,CAAS,aAAA,CAAc,GAAG,CAAA;AACpC,IAAA,CAAA,CAAE,IAAA,GAAO,GAAA;AACT,IAAA,CAAA,CAAE,QAAA,GAAW,GAAG,KAAA,CAAM,IAAA,CAAK,QAAQ,MAAA,EAAQ,GAAG,CAAA,CAAE,WAAA,EAAa,CAAA,WAAA,CAAA;AAC7D,IAAA,CAAA,CAAE,KAAA,EAAM;AACR,IAAA,GAAA,CAAI,YAAA,CAAa,KAAA,CAAM,EAAE,CAAA,CAAE,MAAM,MAAM;AAAA,IAAC,CAAC,CAAA;AAAA,EAC3C,CAAA;AAEA,EAAA,MAAM,QAAA,GAAW,OAAO,IAAA,KAAS,QAAA;AACjC,EAAA,MAAM,cAAc,QAAA,GAAY,KAAA,CAAM,KAAA,IAAS,KAAM,EAAC;AACtD,EAAA,MAAM,aAAa,WAAA,CAAY,MAAA;AAC/B,EAAA,MAAM,WAAW,UAAA,GAAa,CAAA,GAAA,CAAM,IAAA,GAAO,CAAA,IAAK,aAAc,GAAA,GAAM,CAAA;AAEpE,EAAA,uBACE,IAAA,CAAC,MAAA,EAAA,EAAO,IAAA,EAAM,CAAC,CAAC,OAAA,EAAS,OAAA,EAAS,WAAA,EAAa,QAAA,EAAS,IAAA,EAAK,SAAA,EAAS,IAAA,EACpE,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,eAAY,EAAA,EAAI,EAAE,EAAA,EAAI,CAAA,IACpB,QAAA,EAAA,QAAA,mBACC,IAAA,CAAC,GAAA,EAAA,EAAI,EAAA,EAAI,EAAE,OAAA,EAAS,MAAA,EAAQ,YAAY,QAAA,EAAU,GAAA,EAAK,GAAE,EACvD,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,kBAAe,EAAA,EAAI,EAAE,OAAO,SAAA,EAAW,QAAA,EAAU,UAAS,EAAG,CAAA;AAAA,2BAC7D,GAAA,EAAA,EACC,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,UAAA,EAAA,EAAW,OAAA,EAAQ,IAAA,EAAK,UAAA,EAAY,GAAA,EAClC,QAAA,EAAA,CAAA,CAAE,sCAAA,EAAwC,EAAE,IAAA,EAAM,KAAA,EAAO,IAAA,IAAQ,EAAA,EAAI,CAAA,EACxE,CAAA;AAAA,wBACA,GAAA,CAAC,UAAA,EAAA,EAAW,OAAA,EAAQ,OAAA,EAAQ,KAAA,EAAM,gBAAA,EAAiB,EAAA,EAAI,EAAE,UAAA,EAAY,GAAA,EAAI,EACtE,QAAA,EAAA,CAAA,CAAE,yCAAyC,CAAA,EAC9C;AAAA,OAAA,EACF;AAAA,KAAA,EACF,oBAEA,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,UAAA,EAAA,EAAW,SAAQ,IAAA,EAAK,UAAA,EAAY,KAClC,QAAA,EAAA,KAAA,GAAQ,CAAA,CAAE,kCAAkC,EAAE,IAAA,EAAM,MAAM,IAAA,EAAM,IAAI,CAAA,CAAE,gCAAA,EAAkC,EAAE,IAAA,EAAM,EAAA,EAAI,CAAA,EACvH,CAAA;AAAA,sBACA,GAAA,CAAC,UAAA,EAAA,EAAW,OAAA,EAAQ,OAAA,EAAQ,OAAM,gBAAA,EAAiB,EAAA,EAAI,EAAE,EAAA,EAAI,KAAK,UAAA,EAAY,GAAA,EAAI,EAC/E,QAAA,EAAA,CAAA,CAAE,mCAAmC,CAAA,EACxC;AAAA,KAAA,EACF,CAAA,EAEJ,CAAA;AAAA,IAEC,QAAA,IAAY,UAAA,GAAa,CAAA,oBACxB,IAAA,CAAC,GAAA,EAAA,EAAI,EAAA,EAAI,EAAE,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,CAAA,EAAE,EACtB,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,cAAA,EAAA,EAAe,OAAA,EAAQ,aAAA,EAAc,KAAA,EAAO,QAAA,EAAU,EAAA,EAAI,EAAE,YAAA,EAAc,CAAA,EAAG,MAAA,EAAQ,CAAA,EAAE,EAAG,CAAA;AAAA,sBAC3F,GAAA,CAAC,UAAA,EAAA,EAAW,OAAA,EAAQ,SAAA,EAAU,KAAA,EAAM,gBAAA,EAAiB,EAAA,EAAI,EAAE,OAAA,EAAS,OAAA,EAAS,EAAA,EAAI,GAAA,EAAK,SAAA,EAAW,OAAA,EAAQ,EACtG,QAAA,EAAA,CAAA,CAAE,mCAAA,EAAqC,EAAE,OAAA,EAAS,MAAA,CAAO,IAAA,GAAO,CAAC,CAAA,EAAG,KAAA,EAAO,MAAA,CAAO,UAAU,CAAA,EAAG,CAAA,EAClG;AAAA,KAAA,EACF,CAAA;AAAA,oBAGF,IAAA,CAAC,aAAA,EAAA,EAAc,EAAA,EAAI,EAAE,OAAA,EAAS,MAAA,EAAQ,aAAA,EAAe,QAAA,EAAU,GAAA,EAAK,GAAA,EAAK,EAAA,EAAI,gBAAA,EAAiB,EAC3F,QAAA,EAAA;AAAA,MAAA,OAAA,oBACC,GAAA,CAAC,GAAA,EAAA,EAAI,EAAA,EAAI,EAAE,OAAA,EAAS,MAAA,EAAQ,cAAA,EAAgB,QAAA,EAAU,EAAA,EAAI,CAAA,EAAE,EAC1D,QAAA,kBAAA,GAAA,CAAC,oBAAiB,CAAA,EACpB,CAAA;AAAA,MAGD,CAAC,OAAA,IAAW,KAAA,IAAS,CAAC,QAAA,oBAAY,GAAA,CAAC,mBAAgB,KAAA,EAAc,CAAA;AAAA,MAEjE,CAAC,WAAW,QAAA,IAAY,WAAA,CAAY,WAAW,CAAA,oBAC9C,GAAA,CAAC,cAAW,OAAA,EAAQ,OAAA,EAAQ,OAAM,gBAAA,EAAiB,EAAA,EAAI,EAAE,SAAA,EAAW,QAAA,EAAU,IAAI,CAAA,EAAE,EACjF,QAAA,EAAA,CAAA,CAAE,gCAAgC,CAAA,EACrC,CAAA;AAAA,MAGD,CAAC,OAAA,IAAW,QAAA,IAAY,WAAA,CAAY,SAAS,CAAA,oBAC5C,GAAA;AAAA,QAAC,cAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAM,YAAY,IAAI,CAAA;AAAA,UACtB,SAAA,EAAW,IAAA;AAAA,UACX,KAAA,EAAO;AAAA;AAAA;AACT,KAAA,EAEJ,CAAA;AAAA,oBAEA,GAAA,CAAC,aAAA,EAAA,EAAc,EAAA,EAAI,EAAE,cAAA,EAAgB,eAAA,EAAiB,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,GAAA,EAAI,EAClE,QAAA,EAAA,QAAA,mBACC,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,sBAAA,GAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,SAAA,sBAAY,aAAA,EAAA,EAAc,CAAA;AAAA,UAC1B,OAAA,EAAQ,UAAA;AAAA,UACR,IAAA,EAAK,OAAA;AAAA,UACL,OAAA,EAAS,oBAAA;AAAA,UACT,UAAU,CAAC,KAAA;AAAA,UAEV,YAAE,mCAAmC;AAAA;AAAA,OACxC;AAAA,sBACA,IAAA,CAAC,OAAI,EAAA,EAAI,EAAE,SAAS,MAAA,EAAQ,GAAA,EAAK,GAAE,EACjC,QAAA,EAAA;AAAA,wBAAA,GAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,SAAA,sBAAY,aAAA,EAAA,EAAc,CAAA;AAAA,YAC1B,OAAA,EAAS,MAAM,OAAA,CAAQ,CAAA,CAAA,KAAK,KAAK,GAAA,CAAI,CAAA,EAAG,CAAA,GAAI,CAAC,CAAC,CAAA;AAAA,YAC9C,UAAU,IAAA,KAAS,CAAA;AAAA,YAElB,YAAE,yBAAyB;AAAA;AAAA,SAC9B;AAAA,QACC,IAAA,GAAO,aAAa,CAAA,mBACnB,GAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,OAAA,sBAAU,gBAAA,EAAA,EAAiB,CAAA;AAAA,YAC3B,OAAA,EAAQ,WAAA;AAAA,YACR,OAAA,EAAS,MAAM,OAAA,CAAQ,CAAA,CAAA,KAAK,IAAA,CAAK,IAAI,UAAA,GAAa,CAAA,EAAG,CAAA,GAAI,CAAC,CAAC,CAAA;AAAA,YAE1D,YAAE,yBAAyB;AAAA;AAAA,SAC9B,mBAEA,GAAA,CAAC,MAAA,EAAA,EAAO,OAAA,EAAQ,WAAA,EAAY,KAAA,EAAM,SAAA,EAAU,OAAA,EAAS,WAAA,EAClD,QAAA,EAAA,CAAA,CAAE,2BAA2B,CAAA,EAChC;AAAA,OAAA,EAEJ;AAAA,KAAA,EACF,CAAA,mBAEA,GAAA,CAAC,MAAA,EAAA,EAAO,OAAA,EAAS,WAAA,EAAa,EAAA,EAAI,EAAE,EAAA,EAAI,MAAA,EAAO,EAAI,QAAA,EAAA,CAAA,CAAE,0BAA0B,GAAE,CAAA,EAErF;AAAA,GAAA,EACF,CAAA;AAEJ;;;;"}
@@ -0,0 +1,221 @@
1
+ import { jsxs, jsx } from 'react/jsx-runtime';
2
+ import { useState, useMemo } from 'react';
3
+ import { useNavigate, useLocation, useSearchParams } from 'react-router-dom';
4
+ import { darken } from '@mui/material/styles';
5
+ import Box from '@mui/material/Box';
6
+ import Grid from '@mui/material/Grid';
7
+ import IconButton from '@mui/material/IconButton';
8
+ import Pagination from '@mui/material/Pagination';
9
+ import Skeleton from '@mui/material/Skeleton';
10
+ import Tooltip from '@mui/material/Tooltip';
11
+ import Typography from '@mui/material/Typography';
12
+ import ArticleIcon from '@mui/icons-material/Article';
13
+ import SmartToyIcon from '@mui/icons-material/SmartToy';
14
+ import BuildIcon from '@mui/icons-material/Build';
15
+ import AccountTreeIcon from '@mui/icons-material/AccountTree';
16
+ import ChatIcon from '@mui/icons-material/Chat';
17
+ import Inventory2Icon from '@mui/icons-material/Inventory2';
18
+ import CloudSyncIcon from '@mui/icons-material/CloudSync';
19
+ import { Content } from '@backstage/core-components';
20
+ import { useTranslationRef } from '@backstage/frontend-plugin-api';
21
+ import { devAiHubTranslationRef } from '../../translation.esm.js';
22
+ import { AssetCard } from '../AssetCard/AssetCard.esm.js';
23
+ import { AssetFilters } from '../AssetFilters/AssetFilters.esm.js';
24
+ import { AssetDetailPanel } from '../AssetDetailPanel/AssetDetailPanel.esm.js';
25
+ import { AssetInstallDialog } from '../AssetInstallDialog/AssetInstallDialog.esm.js';
26
+ import { AssetHelpDialog } from '../AssetHelpDialog/AssetHelpDialog.esm.js';
27
+ import { useStats, useProviders, useMcpCatalog, useAssets } from '../../hooks/index.esm.js';
28
+ import { useTypeConfig } from '../../context/UiConfigContext.esm.js';
29
+
30
+ const DEFAULT_FILTERS = {
31
+ types: [],
32
+ tools: [],
33
+ search: "",
34
+ tags: [],
35
+ providerId: void 0
36
+ };
37
+ const PAGE_SIZE = 24;
38
+ const STATS_META = {
39
+ instruction: { label: "Instructions", Icon: ArticleIcon },
40
+ agent: { label: "Agents", Icon: SmartToyIcon },
41
+ skill: { label: "Skills", Icon: BuildIcon },
42
+ workflow: { label: "Workflows", Icon: AccountTreeIcon },
43
+ prompt: { label: "Prompts", Icon: ChatIcon },
44
+ bundle: { label: "Bundles", Icon: Inventory2Icon }
45
+ };
46
+ function AssetsTab() {
47
+ const { t } = useTranslationRef(devAiHubTranslationRef);
48
+ const navigate = useNavigate();
49
+ const { pathname } = useLocation();
50
+ const pluginBasePath = pathname.replace(/\/(assets|mcp|admin)\/?$/, "").replace(/\/$/, "");
51
+ const [filters, setFilters] = useState(DEFAULT_FILTERS);
52
+ const [page, setPage] = useState(1);
53
+ const [searchParams, setSearchParams] = useSearchParams();
54
+ const selectedAssetId = searchParams.get("assetId");
55
+ const installAssetId = searchParams.get("installId");
56
+ const helpAssetId = searchParams.get("helpId");
57
+ const handleViewAsset = (id) => setSearchParams((p) => {
58
+ const n = new URLSearchParams(p);
59
+ n.set("assetId", id);
60
+ return n;
61
+ });
62
+ const handleCloseDetail = () => setSearchParams((p) => {
63
+ const n = new URLSearchParams(p);
64
+ n.delete("assetId");
65
+ return n;
66
+ });
67
+ const handleInstallAsset = (id) => setSearchParams((p) => {
68
+ const n = new URLSearchParams(p);
69
+ n.set("installId", id);
70
+ return n;
71
+ });
72
+ const handleCloseInstall = () => setSearchParams((p) => {
73
+ const n = new URLSearchParams(p);
74
+ n.delete("installId");
75
+ return n;
76
+ });
77
+ const handleHelpAsset = (id) => setSearchParams((p) => {
78
+ const n = new URLSearchParams(p);
79
+ n.set("helpId", id);
80
+ return n;
81
+ });
82
+ const handleCloseHelp = () => setSearchParams((p) => {
83
+ const n = new URLSearchParams(p);
84
+ n.delete("helpId");
85
+ return n;
86
+ });
87
+ const { stats } = useStats();
88
+ const { providers } = useProviders();
89
+ const { catalog } = useMcpCatalog();
90
+ const { typeColors, statsCards } = useTypeConfig();
91
+ const apiFilter = useMemo(() => ({
92
+ type: filters.types.length === 1 ? filters.types[0] : void 0,
93
+ tool: filters.tools.length === 1 ? filters.tools[0] : void 0,
94
+ search: filters.search || void 0,
95
+ tags: filters.tags.length > 0 ? filters.tags : void 0,
96
+ providerId: filters.providerId || void 0,
97
+ page,
98
+ pageSize: PAGE_SIZE
99
+ }), [filters, page]);
100
+ const { result, loading } = useAssets(apiFilter);
101
+ const handleFiltersChange = (next) => {
102
+ setFilters(next);
103
+ setPage(1);
104
+ };
105
+ const totalPages = result ? Math.ceil(result.totalCount / PAGE_SIZE) : 0;
106
+ const availableTags = useMemo(() => {
107
+ if (!result) return [];
108
+ const tagSet = /* @__PURE__ */ new Set();
109
+ result.items.forEach((a) => a.tags.forEach((tag) => tagSet.add(tag)));
110
+ return Array.from(tagSet).sort();
111
+ }, [result]);
112
+ return /* @__PURE__ */ jsxs(Content, { children: [
113
+ /* @__PURE__ */ jsx(Grid, { container: true, spacing: 2, sx: { mb: 3 }, children: statsCards.map((key) => {
114
+ const { label, Icon } = STATS_META[key];
115
+ const color = typeColors[key];
116
+ const gradient = `linear-gradient(135deg, ${color} 0%, ${darken(color, 0.15)} 100%)`;
117
+ const shadow = `${color}40`;
118
+ const selected = filters.types[0] === key;
119
+ return /* @__PURE__ */ jsx(Grid, { item: true, xs: 6, sm: 3, children: /* @__PURE__ */ jsx(
120
+ Box,
121
+ {
122
+ onClick: () => handleFiltersChange({ ...filters, types: selected ? [] : [key] }),
123
+ sx: {
124
+ background: gradient,
125
+ borderRadius: 3,
126
+ p: 2,
127
+ cursor: "pointer",
128
+ boxShadow: selected ? `0 8px 24px ${shadow}` : `0 2px 8px ${shadow}`,
129
+ transform: selected ? "translateY(-2px)" : "none",
130
+ transition: "all 0.2s ease",
131
+ outline: selected ? "2px solid rgba(255,255,255,0.6)" : "none",
132
+ outlineOffset: 2,
133
+ "&:hover": { boxShadow: `0 8px 24px ${shadow}`, transform: "translateY(-2px)" }
134
+ },
135
+ children: /* @__PURE__ */ jsxs(Box, { sx: { display: "flex", justifyContent: "space-between", alignItems: "flex-start" }, children: [
136
+ /* @__PURE__ */ jsxs(Box, { children: [
137
+ /* @__PURE__ */ jsx(Typography, { variant: "h4", fontWeight: 800, sx: { color: "#fff", lineHeight: 1 }, children: stats ? stats.byType[key] ?? 0 : /* @__PURE__ */ jsx(Skeleton, { width: 32, sx: { bgcolor: "rgba(255,255,255,0.3)" } }) }),
138
+ /* @__PURE__ */ jsx(Typography, { variant: "body2", sx: { color: "rgba(255,255,255,0.85)", fontWeight: 500, mt: 0.5 }, children: label })
139
+ ] }),
140
+ /* @__PURE__ */ jsx(Box, { sx: {
141
+ width: 40,
142
+ height: 40,
143
+ borderRadius: 2,
144
+ backgroundColor: "rgba(255,255,255,0.2)",
145
+ display: "flex",
146
+ alignItems: "center",
147
+ justifyContent: "center"
148
+ }, children: /* @__PURE__ */ jsx(Icon, { sx: { color: "#fff", fontSize: "1.4rem" } }) })
149
+ ] })
150
+ }
151
+ ) }, key);
152
+ }) }),
153
+ providers.length > 0 && /* @__PURE__ */ jsx(Box, { sx: { display: "flex", justifyContent: "flex-end", mb: 1, mt: -1 }, children: /* @__PURE__ */ jsx(
154
+ Tooltip,
155
+ {
156
+ title: t(providers.length === 1 ? "devAiHubPage.providerCountOne" : "devAiHubPage.providerCountOther", { n: String(providers.length) }),
157
+ placement: "left",
158
+ children: /* @__PURE__ */ jsx(
159
+ IconButton,
160
+ {
161
+ size: "small",
162
+ onClick: () => navigate(`${pluginBasePath}/admin`),
163
+ sx: {
164
+ color: providers.some((p) => p.status === "error") ? "error.main" : "text.disabled",
165
+ "&:hover": { color: providers.some((p) => p.status === "error") ? "error.dark" : "text.secondary" }
166
+ },
167
+ children: /* @__PURE__ */ jsx(CloudSyncIcon, { fontSize: "small" })
168
+ }
169
+ )
170
+ }
171
+ ) }),
172
+ /* @__PURE__ */ jsx(
173
+ AssetFilters,
174
+ {
175
+ value: filters,
176
+ onChange: handleFiltersChange,
177
+ availableTags,
178
+ providers: providers.length > 1 ? providers : void 0
179
+ }
180
+ ),
181
+ result && !loading && /* @__PURE__ */ jsx(Typography, { variant: "caption", color: "text.secondary", sx: { mb: 2, display: "block" }, children: t(result.totalCount === 1 ? "devAiHubPage.assetCountOne" : "devAiHubPage.assetCountOther", { n: String(result.totalCount) }) }),
182
+ /* @__PURE__ */ jsx(Grid, { container: true, spacing: 1.5, children: loading ? Array.from({ length: 8 }).map((_, i) => /* @__PURE__ */ jsx(Grid, { item: true, xs: 12, sm: 6, md: 4, lg: 3, children: /* @__PURE__ */ jsx(Skeleton, { variant: "rectangular", height: 150, sx: { borderRadius: 2 } }) }, i)) : result?.items.map((asset) => /* @__PURE__ */ jsx(Grid, { item: true, xs: 12, sm: 6, md: 4, lg: 3, children: /* @__PURE__ */ jsx(
183
+ AssetCard,
184
+ {
185
+ asset,
186
+ onView: handleViewAsset,
187
+ onInstall: handleInstallAsset,
188
+ onHelp: handleHelpAsset,
189
+ onOpenMcpCatalog: () => navigate(`${pluginBasePath}/mcp`),
190
+ mcpCatalog: catalog
191
+ }
192
+ ) }, asset.id)) }),
193
+ !loading && result?.items.length === 0 && /* @__PURE__ */ jsxs(Box, { sx: { py: 12, textAlign: "center" }, children: [
194
+ /* @__PURE__ */ jsx(Typography, { variant: "h1", sx: { mb: 2, opacity: 0.15, fontSize: "5rem" }, children: "\u{1F916}" }),
195
+ /* @__PURE__ */ jsx(Typography, { variant: "h6", color: "text.secondary", fontWeight: 600, children: t("devAiHubPage.noAssetsTitle") }),
196
+ /* @__PURE__ */ jsx(Typography, { variant: "body2", color: "text.disabled", sx: { mt: 0.5 }, children: t("devAiHubPage.noAssetsSubtitle") })
197
+ ] }),
198
+ totalPages > 1 && /* @__PURE__ */ jsx(Box, { sx: { display: "flex", justifyContent: "center", mt: 4 }, children: /* @__PURE__ */ jsx(
199
+ Pagination,
200
+ {
201
+ count: totalPages,
202
+ page,
203
+ onChange: (_, p) => setPage(p),
204
+ color: "primary",
205
+ shape: "rounded"
206
+ }
207
+ ) }),
208
+ /* @__PURE__ */ jsx(AssetDetailPanel, { assetId: selectedAssetId, onClose: handleCloseDetail }),
209
+ /* @__PURE__ */ jsx(AssetInstallDialog, { assetId: installAssetId, onClose: handleCloseInstall }),
210
+ /* @__PURE__ */ jsx(
211
+ AssetHelpDialog,
212
+ {
213
+ asset: helpAssetId ? result?.items.find((a) => a.id === helpAssetId) ?? null : null,
214
+ onClose: handleCloseHelp
215
+ }
216
+ )
217
+ ] });
218
+ }
219
+
220
+ export { AssetsTab };
221
+ //# sourceMappingURL=AssetsTab.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AssetsTab.esm.js","sources":["../../../src/components/AssetsTab/AssetsTab.tsx"],"sourcesContent":["import { type ElementType, useState, useMemo } from 'react';\nimport { useNavigate, useSearchParams, useLocation } from 'react-router-dom';\nimport { darken } from '@mui/material/styles';\nimport Box from '@mui/material/Box';\nimport Grid from '@mui/material/Grid';\nimport IconButton from '@mui/material/IconButton';\nimport Pagination from '@mui/material/Pagination';\nimport Skeleton from '@mui/material/Skeleton';\nimport Tooltip from '@mui/material/Tooltip';\nimport Typography from '@mui/material/Typography';\nimport ArticleIcon from '@mui/icons-material/Article';\nimport SmartToyIcon from '@mui/icons-material/SmartToy';\nimport BuildIcon from '@mui/icons-material/Build';\nimport AccountTreeIcon from '@mui/icons-material/AccountTree';\nimport ChatIcon from '@mui/icons-material/Chat';\nimport Inventory2Icon from '@mui/icons-material/Inventory2';\nimport CloudSyncIcon from '@mui/icons-material/CloudSync';\nimport { Content } from '@backstage/core-components';\nimport { useTranslationRef } from '@backstage/frontend-plugin-api';\nimport type { AssetType, AiTool } from '@julianpedro/plugin-dev-ai-hub-common';\nimport { devAiHubTranslationRef } from '../../translation';\nimport { AssetCard } from '../AssetCard';\nimport { AssetFilters } from '../AssetFilters';\nimport type { AssetFiltersValue } from '../AssetFilters';\nimport { AssetDetailPanel } from '../AssetDetailPanel';\nimport { AssetInstallDialog } from '../AssetInstallDialog';\nimport { AssetHelpDialog } from '../AssetHelpDialog';\nimport { useAssets, useStats, useProviders, useMcpCatalog, useTypeConfig } from '../../hooks';\n\nconst DEFAULT_FILTERS: AssetFiltersValue = {\n types: [],\n tools: [],\n search: '',\n tags: [],\n providerId: undefined,\n};\n\nconst PAGE_SIZE = 24;\n\nconst STATS_META: Record<AssetType, { label: string; Icon: ElementType }> = {\n instruction: { label: 'Instructions', Icon: ArticleIcon },\n agent: { label: 'Agents', Icon: SmartToyIcon },\n skill: { label: 'Skills', Icon: BuildIcon },\n workflow: { label: 'Workflows', Icon: AccountTreeIcon },\n prompt: { label: 'Prompts', Icon: ChatIcon },\n bundle: { label: 'Bundles', Icon: Inventory2Icon },\n};\n\nexport function AssetsTab() {\n const { t } = useTranslationRef(devAiHubTranslationRef);\n const navigate = useNavigate();\n const { pathname } = useLocation();\n // Strip current sub-route to get the plugin base path — works in both NFS (/dev-ai-hub/assets)\n // and legacy TabbedLayout (/dev-ai-hub/).\n const pluginBasePath = pathname.replace(/\\/(assets|mcp|admin)\\/?$/, '').replace(/\\/$/, '');\n\n const [filters, setFilters] = useState<AssetFiltersValue>(DEFAULT_FILTERS);\n const [page, setPage] = useState(1);\n const [searchParams, setSearchParams] = useSearchParams();\n\n const selectedAssetId = searchParams.get('assetId');\n const installAssetId = searchParams.get('installId');\n const helpAssetId = searchParams.get('helpId');\n\n const handleViewAsset = (id: string) =>\n setSearchParams(p => { const n = new URLSearchParams(p); n.set('assetId', id); return n; });\n const handleCloseDetail = () =>\n setSearchParams(p => { const n = new URLSearchParams(p); n.delete('assetId'); return n; });\n const handleInstallAsset = (id: string) =>\n setSearchParams(p => { const n = new URLSearchParams(p); n.set('installId', id); return n; });\n const handleCloseInstall = () =>\n setSearchParams(p => { const n = new URLSearchParams(p); n.delete('installId'); return n; });\n const handleHelpAsset = (id: string) =>\n setSearchParams(p => { const n = new URLSearchParams(p); n.set('helpId', id); return n; });\n const handleCloseHelp = () =>\n setSearchParams(p => { const n = new URLSearchParams(p); n.delete('helpId'); return n; });\n\n const { stats } = useStats();\n const { providers } = useProviders();\n const { catalog } = useMcpCatalog();\n const { typeColors, statsCards } = useTypeConfig();\n\n const apiFilter = useMemo(() => ({\n type: filters.types.length === 1 ? (filters.types[0] as AssetType) : undefined,\n tool: filters.tools.length === 1 ? (filters.tools[0] as AiTool) : undefined,\n search: filters.search || undefined,\n tags: filters.tags.length > 0 ? filters.tags : undefined,\n providerId: filters.providerId || undefined,\n page,\n pageSize: PAGE_SIZE,\n }), [filters, page]);\n\n const { result, loading } = useAssets(apiFilter);\n\n const handleFiltersChange = (next: AssetFiltersValue) => {\n setFilters(next);\n setPage(1);\n };\n\n const totalPages = result ? Math.ceil(result.totalCount / PAGE_SIZE) : 0;\n\n const availableTags = useMemo(() => {\n if (!result) return [];\n const tagSet = new Set<string>();\n result.items.forEach(a => a.tags.forEach(tag => tagSet.add(tag)));\n return Array.from(tagSet).sort();\n }, [result]);\n\n return (\n <Content>\n {/* Stats cards — configurable via devAiHub.ui.statsCards (max 4) */}\n <Grid container spacing={2} sx={{ mb: 3 }}>\n {statsCards.map(key => {\n const { label, Icon } = STATS_META[key];\n const color = typeColors[key];\n const gradient = `linear-gradient(135deg, ${color} 0%, ${darken(color, 0.15)} 100%)`;\n const shadow = `${color}40`;\n const selected = filters.types[0] === key;\n return (\n <Grid item xs={6} sm={3} key={key}>\n <Box\n onClick={() => handleFiltersChange({ ...filters, types: selected ? [] : [key] })}\n sx={{\n background: gradient,\n borderRadius: 3,\n p: 2,\n cursor: 'pointer',\n boxShadow: selected ? `0 8px 24px ${shadow}` : `0 2px 8px ${shadow}`,\n transform: selected ? 'translateY(-2px)' : 'none',\n transition: 'all 0.2s ease',\n outline: selected ? '2px solid rgba(255,255,255,0.6)' : 'none',\n outlineOffset: 2,\n '&:hover': { boxShadow: `0 8px 24px ${shadow}`, transform: 'translateY(-2px)' },\n }}\n >\n <Box sx={{ display: 'flex', justifyContent: 'space-between', alignItems: 'flex-start' }}>\n <Box>\n <Typography variant=\"h4\" fontWeight={800} sx={{ color: '#fff', lineHeight: 1 }}>\n {stats ? (stats.byType[key] ?? 0) : <Skeleton width={32} sx={{ bgcolor: 'rgba(255,255,255,0.3)' }} />}\n </Typography>\n <Typography variant=\"body2\" sx={{ color: 'rgba(255,255,255,0.85)', fontWeight: 500, mt: 0.5 }}>\n {label}\n </Typography>\n </Box>\n <Box sx={{\n width: 40, height: 40, borderRadius: 2,\n backgroundColor: 'rgba(255,255,255,0.2)',\n display: 'flex', alignItems: 'center', justifyContent: 'center',\n }}>\n <Icon sx={{ color: '#fff', fontSize: '1.4rem' }} />\n </Box>\n </Box>\n </Box>\n </Grid>\n );\n })}\n </Grid>\n\n {/* Providers icon — navigates to Admin tab */}\n {providers.length > 0 && (\n <Box sx={{ display: 'flex', justifyContent: 'flex-end', mb: 1, mt: -1 }}>\n <Tooltip\n title={t(providers.length === 1 ? 'devAiHubPage.providerCountOne' : 'devAiHubPage.providerCountOther', { n: String(providers.length) })}\n placement=\"left\"\n >\n <IconButton\n size=\"small\"\n onClick={() => navigate(`${pluginBasePath}/admin`)}\n sx={{\n color: providers.some(p => p.status === 'error') ? 'error.main' : 'text.disabled',\n '&:hover': { color: providers.some(p => p.status === 'error') ? 'error.dark' : 'text.secondary' },\n }}\n >\n <CloudSyncIcon fontSize=\"small\" />\n </IconButton>\n </Tooltip>\n </Box>\n )}\n\n {/* Filters */}\n <AssetFilters\n value={filters}\n onChange={handleFiltersChange}\n availableTags={availableTags}\n providers={providers.length > 1 ? providers : undefined}\n />\n\n {/* Results count */}\n {result && !loading && (\n <Typography variant=\"caption\" color=\"text.secondary\" sx={{ mb: 2, display: 'block' }}>\n {t(result.totalCount === 1 ? 'devAiHubPage.assetCountOne' : 'devAiHubPage.assetCountOther', { n: String(result.totalCount) })}\n </Typography>\n )}\n\n {/* Asset grid */}\n <Grid container spacing={1.5}>\n {loading\n ? Array.from({ length: 8 }).map((_, i) => (\n <Grid item xs={12} sm={6} md={4} lg={3} key={i}>\n <Skeleton variant=\"rectangular\" height={150} sx={{ borderRadius: 2 }} />\n </Grid>\n ))\n : result?.items.map(asset => (\n <Grid item xs={12} sm={6} md={4} lg={3} key={asset.id}>\n <AssetCard\n asset={asset}\n onView={handleViewAsset}\n onInstall={handleInstallAsset}\n onHelp={handleHelpAsset}\n onOpenMcpCatalog={() => navigate(`${pluginBasePath}/mcp`)}\n mcpCatalog={catalog}\n />\n </Grid>\n ))}\n </Grid>\n\n {/* Empty state */}\n {!loading && result?.items.length === 0 && (\n <Box sx={{ py: 12, textAlign: 'center' }}>\n <Typography variant=\"h1\" sx={{ mb: 2, opacity: 0.15, fontSize: '5rem' }}>🤖</Typography>\n <Typography variant=\"h6\" color=\"text.secondary\" fontWeight={600}>\n {t('devAiHubPage.noAssetsTitle')}\n </Typography>\n <Typography variant=\"body2\" color=\"text.disabled\" sx={{ mt: 0.5 }}>\n {t('devAiHubPage.noAssetsSubtitle')}\n </Typography>\n </Box>\n )}\n\n {/* Pagination */}\n {totalPages > 1 && (\n <Box sx={{ display: 'flex', justifyContent: 'center', mt: 4 }}>\n <Pagination\n count={totalPages}\n page={page}\n onChange={(_, p) => setPage(p)}\n color=\"primary\"\n shape=\"rounded\"\n />\n </Box>\n )}\n\n <AssetDetailPanel assetId={selectedAssetId} onClose={handleCloseDetail} />\n <AssetInstallDialog assetId={installAssetId} onClose={handleCloseInstall} />\n <AssetHelpDialog\n asset={helpAssetId ? (result?.items.find(a => a.id === helpAssetId) ?? null) : null}\n onClose={handleCloseHelp}\n />\n </Content>\n );\n}"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import { AssetsTab } from './AssetsTab.esm.js';
2
+
3
+
4
+
5
+ export { AssetsTab };
6
+ //# sourceMappingURL=index.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}